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