From: Russell King <rmk+ker...@arm.linux.org.uk>

Signed-off-by: Russell King <rmk+kernel at arm.linux.org.uk>
---
 drivers/staging/etnaviv/etnaviv_drv.c | 50 ++++++++++++++++++++---------------
 drivers/staging/etnaviv/etnaviv_gpu.c | 18 ++++++++++---
 2 files changed, 42 insertions(+), 26 deletions(-)

diff --git a/drivers/staging/etnaviv/etnaviv_drv.c 
b/drivers/staging/etnaviv/etnaviv_drv.c
index 3dba228265ea..568615154845 100644
--- a/drivers/staging/etnaviv/etnaviv_drv.c
+++ b/drivers/staging/etnaviv/etnaviv_drv.c
@@ -566,24 +566,6 @@ static int etnaviv_compare(struct device *dev, void *data)
        return dev->of_node == np;
 }

-static int etnaviv_add_components(struct device *master, struct master *m)
-{
-       struct device_node *child_np;
-       int ret = 0;
-
-       for_each_available_child_of_node(master->of_node, child_np) {
-               DRM_INFO("add child %s\n", child_np->name);
-
-               ret = component_master_add_child(m, etnaviv_compare, child_np);
-               if (ret) {
-                       of_node_put(child_np);
-                       break;
-               }
-       }
-
-       return ret;
-}
-
 static int etnaviv_bind(struct device *dev)
 {
        return drm_platform_init(&etnaviv_drm_driver, to_platform_device(dev));
@@ -595,21 +577,43 @@ static void etnaviv_unbind(struct device *dev)
 }

 static const struct component_master_ops etnaviv_master_ops = {
-       .add_components = etnaviv_add_components,
        .bind = etnaviv_bind,
        .unbind = etnaviv_unbind,
 };

+static int compare_str(struct device *dev, void *data)
+{
+       return !strcmp(dev_name(dev), data);
+}
+
 static int etnaviv_pdev_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct device_node *node = dev->of_node;
-
-       of_platform_populate(node, NULL, NULL, dev);
+       struct component_match *match = NULL;

        dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32));

-       return component_master_add(&pdev->dev, &etnaviv_master_ops);
+       if (node) {
+               struct device_node *child_np;
+
+               of_platform_populate(node, NULL, NULL, dev);
+
+               for_each_available_child_of_node(node, child_np) {
+                       DRM_INFO("add child %s\n", child_np->name);
+
+                       component_match_add(dev, &match, etnaviv_compare,
+                                           child_np);
+               }
+       } else if (dev->platform_data) {
+               char **names = dev->platform_data;
+               unsigned i;
+
+               for (i = 0; names[i]; i++)
+                       component_match_add(dev, &match, compare_str, names[i]);
+       }
+
+       return component_master_add_with_match(dev, &etnaviv_master_ops, match);
 }

 static int etnaviv_pdev_remove(struct platform_device *pdev)
@@ -661,3 +665,5 @@ module_exit(etnaviv_exit);
 MODULE_AUTHOR("Rob Clark <robdclark at gmail.com");
 MODULE_DESCRIPTION("etnaviv DRM Driver");
 MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:vivante");
+MODULE_DEVICE_TABLE(of, dt_match);
diff --git a/drivers/staging/etnaviv/etnaviv_gpu.c 
b/drivers/staging/etnaviv/etnaviv_gpu.c
index 92a28f11bab6..30abf443f2c9 100644
--- a/drivers/staging/etnaviv/etnaviv_gpu.c
+++ b/drivers/staging/etnaviv/etnaviv_gpu.c
@@ -26,6 +26,10 @@
 #include "state_hi.xml.h"
 #include "cmdstream.xml.h"

+static const struct platform_device_id gpu_ids[] = {
+       { .name = "etnaviv-gpu,2d", .driver_data = ETNA_PIPE_2D, },
+       { },
+};

 /*
  * Driver functions:
@@ -1059,9 +1063,16 @@ static int etnaviv_gpu_platform_probe(struct 
platform_device *pdev)
        if (!gpu)
                return -ENOMEM;

-       match = of_match_device(etnaviv_gpu_match, &pdev->dev);
-       if (!match)
+       if (pdev->dev.of_node) {
+               match = of_match_device(etnaviv_gpu_match, &pdev->dev);
+               if (!match)
+                       return -EINVAL;
+               gpu->pipe = (int)match->data;
+       } else if (pdev->id_entry) {
+               gpu->pipe = pdev->id_entry->driver_data;
+       } else {
                return -EINVAL;
+       }

        gpu->dev = &pdev->dev;

@@ -1101,8 +1112,6 @@ static int etnaviv_gpu_platform_probe(struct 
platform_device *pdev)
        if (IS_ERR(gpu->clk_shader))
                gpu->clk_shader = NULL;

-       gpu->pipe = (int)match->data;
-
        /* TODO: figure out max mapped size */
        dev_set_drvdata(dev, gpu);

@@ -1132,4 +1141,5 @@ struct platform_driver etnaviv_gpu_driver = {
        },
        .probe = etnaviv_gpu_platform_probe,
        .remove = etnaviv_gpu_platform_remove,
+       .id_table = gpu_ids,
 };
-- 
2.1.4

Reply via email to