The GPU cores are possibly scattered in the SoC address space, so the current abstraction of having a parent node for the master device and the cores as child nodes doesn't fit too well. Instead take the same approach as with imx-drm to have a logical master node that refers to the other components by a phandle, so those can be placed under their real parent buses in the DT. Signed-off-by: Lucas Stach <l.stach@xxxxxxxxxxxxxx> --- drivers/staging/etnaviv/etnaviv_drv.c | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/drivers/staging/etnaviv/etnaviv_drv.c b/drivers/staging/etnaviv/etnaviv_drv.c index 25c64319ab34..eade6010ce42 100644 --- a/drivers/staging/etnaviv/etnaviv_drv.c +++ b/drivers/staging/etnaviv/etnaviv_drv.c @@ -563,14 +563,6 @@ static struct drm_driver etnaviv_drm_driver = { /* * Platform driver: */ - -static int etnaviv_compare(struct device *dev, void *data) -{ - struct device_node *np = data; - - return dev->of_node == np; -} - static int etnaviv_bind(struct device *dev) { return drm_platform_init(&etnaviv_drm_driver, to_platform_device(dev)); @@ -586,6 +578,13 @@ static const struct component_master_ops etnaviv_master_ops = { .unbind = etnaviv_unbind, }; +static int compare_of(struct device *dev, void *data) +{ + struct device_node *np = data; + + return dev->of_node == np; +} + static int compare_str(struct device *dev, void *data) { return !strcmp(dev_name(dev), data); @@ -600,15 +599,17 @@ static int etnaviv_pdev_probe(struct platform_device *pdev) dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32)); if (node) { - struct device_node *child_np; - - of_platform_populate(node, NULL, NULL, dev); + struct device_node *core_node; + int i; - for_each_available_child_of_node(node, child_np) { - DRM_INFO("add child %s\n", child_np->name); + for (i = 0; ; i++) { + core_node = of_parse_phandle(node, "cores", i); + if (!core_node) + break; - component_match_add(dev, &match, etnaviv_compare, - child_np); + component_match_add(&pdev->dev, &match, compare_of, + core_node); + of_node_put(core_node); } } else if (dev->platform_data) { char **names = dev->platform_data; @@ -629,7 +630,7 @@ static int etnaviv_pdev_remove(struct platform_device *pdev) } static const struct of_device_id dt_match[] = { - { .compatible = "vivante,gccore" }, + { .compatible = "fsl,imx-gpu-subsystem" }, {} }; MODULE_DEVICE_TABLE(of, dt_match); -- 2.1.4 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel