Reparenting a platform device
Stephen Warren
swarren at wwwdotorg.org
Fri Apr 6 01:40:30 EST 2012
On 04/05/2012 02:42 AM, Thierry Reding wrote:
> Hi,
>
> I have a device tree where I have a GART device and a DRM device which uses
> the GART. The GART is implemented by an IOMMU driver (tegra-gart) and
> requires the user device to be a child of the GART device (it explicitly
> checks for this when the user device is attached).
Isn't this wrong?
I would expect the device parent/child relationship to reflect the
CPU-initiated register access bus topology.
A device's interaction with an IOMMU is an aspect of a device's
initiating accesses itself, not CPU-initiated register accesses.
> I've tried two alternatives to achieve this: create the GART device in the
> user driver's .probe() function and explicitly set the DRM device's parent
> to the resulting platform device like so:
>
> gart = platform_device_alloc(...);
> ...
> pdev->dev.parent = &gart->dev;
I guess that won't work when there's more than one device affected by
the IOMMU?
> The alternative is to use the device tree to look up the GART device node and
> resolve it to the corresponding struct device:
>
> gart_node = of_parse_phandle(drm->dev->of_node, "gart-parent", 0);
That seems more logical to me.
> gart = bus_find_device(drm->dev->bus, NULL, gart_node, match_of_node);
That part should probably be encapsulated into the IOMMU subsystem? In
fact, even the of_parse_phandle should perhaps be hidden inside some
IOMMU iommu_get() call, that can use DT as a data source, or some other
data structure set up by board files.
More information about the devicetree-discuss
mailing list