Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 246774d1 authored by Lucas Stach's avatar Lucas Stach
Browse files

drm/etnaviv: remove the need for a gpu-subsystem DT node



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: default avatarRob Herring <robh@kernel.org>
Signed-off-by: default avatarLucas Stach <l.stach@pengutronix.de>
Reviewed-by: default avatarRob Herring <robh@kernel.org>
parent 0b3650bd
Loading
Loading
Loading
Loading
+0 −20
Original line number Diff line number Diff line
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
========================

+19 −17
Original line number Diff line number Diff line
@@ -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;

@@ -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();

@@ -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);
+1 −0
Original line number Diff line number Diff line
@@ -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)
{