From: Russell King <rmk+kernel@xxxxxxxxxxxxxxxx> Signed-off-by: Russell King <rmk+kernel@xxxxxxxxxxxxxxxx> --- 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@xxxxxxxxx"); 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 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel