Skip to content

Commit

Permalink
drm/etnaviv: remove the need for a gpu-subsystem DT node
Browse files Browse the repository at this point in the history
The module autoloading can be triggered through the GPU core nodes
and the necessary platform device for the DRM toplevel device will
be instantiated on module init.

Suggested-by: Rob Herring <robh@kernel.org>
Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
Reviewed-by: Rob Herring <robh@kernel.org>
  • Loading branch information
Lucas Stach committed Feb 12, 2018
1 parent 0b3650b commit 246774d
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 37 deletions.
20 changes: 0 additions & 20 deletions Documentation/devicetree/bindings/display/etnaviv/etnaviv-drm.txt
Original file line number Diff line number Diff line change
@@ -1,23 +1,3 @@
Etnaviv DRM master device
=========================

The Etnaviv DRM master device is a virtual device needed to list all
Vivante GPU cores that comprise the GPU subsystem.

Required properties:
- compatible: Should be one of
"fsl,imx-gpu-subsystem"
"marvell,dove-gpu-subsystem"
- cores: Should contain a list of phandles pointing to Vivante GPU devices

example:

gpu-subsystem {
compatible = "fsl,imx-gpu-subsystem";
cores = <&gpu_2d>, <&gpu_3d>;
};


Vivante GPU core devices
========================

Expand Down
36 changes: 19 additions & 17 deletions drivers/gpu/drm/etnaviv/etnaviv_drv.c
Original file line number Diff line number Diff line change
Expand Up @@ -653,25 +653,21 @@ static int compare_str(struct device *dev, void *data)
static int etnaviv_pdev_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
struct device_node *node = dev->of_node;
struct component_match *match = NULL;

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

if (node) {
if (!dev->platform_data) {
struct device_node *core_node;
int i;

for (i = 0; ; i++) {
core_node = of_parse_phandle(node, "cores", i);
if (!core_node)
break;
for_each_compatible_node(core_node, NULL, "vivante,gc") {
if (!of_device_is_available(core_node))
continue;

drm_of_component_match_add(&pdev->dev, &match,
compare_of, core_node);
of_node_put(core_node);
}
} else if (dev->platform_data) {
} else {
char **names = dev->platform_data;
unsigned i;

Expand All @@ -689,25 +685,18 @@ static int etnaviv_pdev_remove(struct platform_device *pdev)
return 0;
}

static const struct of_device_id dt_match[] = {
{ .compatible = "fsl,imx-gpu-subsystem" },
{ .compatible = "marvell,dove-gpu-subsystem" },
{}
};
MODULE_DEVICE_TABLE(of, dt_match);

static struct platform_driver etnaviv_platform_driver = {
.probe = etnaviv_pdev_probe,
.remove = etnaviv_pdev_remove,
.driver = {
.name = "etnaviv",
.of_match_table = dt_match,
},
};

static int __init etnaviv_init(void)
{
int ret;
struct device_node *np;

etnaviv_validate_init();

Expand All @@ -719,6 +708,19 @@ static int __init etnaviv_init(void)
if (ret != 0)
platform_driver_unregister(&etnaviv_gpu_driver);

/*
* If the DT contains at least one available GPU device, instantiate
* the DRM platform device.
*/
for_each_compatible_node(np, NULL, "vivante,gc") {
if (!of_device_is_available(np))
continue;

platform_device_register_simple("etnaviv", -1, NULL, 0);
of_node_put(np);
break;
}

return ret;
}
module_init(etnaviv_init);
Expand Down
1 change: 1 addition & 0 deletions drivers/gpu/drm/etnaviv/etnaviv_gpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -1637,6 +1637,7 @@ static const struct of_device_id etnaviv_gpu_match[] = {
},
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, etnaviv_gpu_match);

static int etnaviv_gpu_platform_probe(struct platform_device *pdev)
{
Expand Down

0 comments on commit 246774d

Please sign in to comment.