Re: [PATCHv3 01/19] [HACK] of: dev_node has struct device pointer
From: Hiroshi Doyu <hidden>
Date: 2013-10-31 16:49:14
Also in:
linux-iommu, linux-tegra
Stephen Warren [off-list ref] wrote @ Thu, 31 Oct 2013 17:37:40 +0100:
On 10/31/2013 02:14 AM, Hiroshi Doyu wrote:quoted
Thierry Reding [off-list ref] wrote @ Wed, 30 Oct 2013 23:41:09 +0100:quoted
My earlier proposal for deferred interrupt reference resolution actually tries to solve that problem within the core. Essentially what it does is add a new function that gets called right before the driver's .probe() function, so that it can parse standard resources and services from DT, such as the interrupts property. This could theoretically be done for other resources such as reg as well, but it really only matters where the resource can be dynamic (as is the case for interrupts). In this case I would envision a standard OF function to associate a device with its IOMMU. Perhaps something like: int of_iommu_attach(struct device *dev); That could be called by the core independent of the specific device and IOMMU. IOMMU-specifics can probably be handled using .of_xlate(), quite in a similar way to GPIO or regulators. That way drivers can remain agnostic of the IOMMU while still being able to take advantage of deferred probing.This could be simpler than making "bus_notifier" return "-EPROBE_DEFER". The disadvantage of this is that we may need to provide the similar of_<"subsystem">_attach() per subsytem if needed.Well, "per subsystem" here means per subsystem that is providing resources, not per subsystem that is consuming resources. How many subsystems are you expecting to provide resources like this? At present, I believe IOMMU is the only subsystem missing some kind of API for clients to acquire the relevant resource. I don't think there's any scalability problem here.
Honestly I have no idea for other subsystem which needs
of_<"subsystem">_attach(). But IIRC, it's almost similar one to the
following "pinctrl_bind_pins()"? Or something other way?
drivers/base/dd.c:
static int really_probe(struct device *dev, struct device_driver *drv)
{
int ret = 0;
atomic_inc(&probe_count);
pr_debug("bus: '%s': %s: probing driver %s with device %s\n",
drv->bus->name, __func__, drv->name, dev_name(dev));
WARN_ON(!list_empty(&dev->devres_head));
dev->driver = drv;
/* If using pinctrl, bind pins now before probing */
ret = pinctrl_bind_pins(dev);
^^^^^^^^^^^^^^^^^^^^^^^