Commit a10a43ee authored by Sui Jingfeng's avatar Sui Jingfeng Committed by Lucas Stach
Browse files

drm/etnaviv: Add helper functions to create and destroy platform device



The newly introduced functions are etnaviv_create_platform_device() and
etnaviv_destroy_platform_device(). Those two function are pure function
and can be shared for other use case. Currently, the benefit is that we
no longer need to call of_node_put() for three different cases, we only
need to call it once in the etnaviv_init() function.

Signed-off-by: default avatarSui Jingfeng <suijingfeng@loongson.cn>
Signed-off-by: default avatarLucas Stach <l.stach@pengutronix.de>
parent 4cb91cc2
Loading
Loading
Loading
Loading
+37 −16
Original line number Diff line number Diff line
@@ -655,11 +655,43 @@ static struct platform_driver etnaviv_platform_driver = {
	},
};

static int etnaviv_create_platform_device(const char *name,
					  struct platform_device **ppdev)
{
	struct platform_device *pdev;
	int ret;

	pdev = platform_device_alloc(name, PLATFORM_DEVID_NONE);
	if (!pdev)
		return -ENOMEM;

	ret = platform_device_add(pdev);
	if (ret) {
		platform_device_put(pdev);
		return ret;
	}

	*ppdev = pdev;

	return 0;
}

static void etnaviv_destroy_platform_device(struct platform_device **ppdev)
{
	struct platform_device *pdev = *ppdev;

	if (!pdev)
		return;

	platform_device_unregister(pdev);

	*ppdev = NULL;
}

static struct platform_device *etnaviv_drm;

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

@@ -680,23 +712,12 @@ static int __init etnaviv_init(void)
	for_each_compatible_node(np, NULL, "vivante,gc") {
		if (!of_device_is_available(np))
			continue;

		pdev = platform_device_alloc("etnaviv", PLATFORM_DEVID_NONE);
		if (!pdev) {
			ret = -ENOMEM;
		of_node_put(np);
			goto unregister_platform_driver;
		}

		ret = platform_device_add(pdev);
		if (ret) {
			platform_device_put(pdev);
			of_node_put(np);
		ret = etnaviv_create_platform_device("etnaviv", &etnaviv_drm);
		if (ret)
			goto unregister_platform_driver;
		}

		etnaviv_drm = pdev;
		of_node_put(np);
		break;
	}

@@ -712,7 +733,7 @@ module_init(etnaviv_init);

static void __exit etnaviv_exit(void)
{
	platform_device_unregister(etnaviv_drm);
	etnaviv_destroy_platform_device(&etnaviv_drm);
	platform_driver_unregister(&etnaviv_platform_driver);
	platform_driver_unregister(&etnaviv_gpu_driver);
}