[PATCH 1/3] drm/etnaviv: add function to create etnaviv platform device

From: Sui Jingfeng
Date: Mon Apr 04 2022 - 06:31:30 EST


This patch separate the code related to the platform device creation
so that it can be reuse by other function.

An immediate benefit is we need call of_node_put() only once in the
for_each_compatible_node(np, NULL, "vivante,gc") loop instead of
three.

Signed-off-by: Sui Jingfeng <15330273260@xxxxxx>
---
drivers/gpu/drm/etnaviv/etnaviv_drv.c | 47 +++++++++++++++++++--------
drivers/gpu/drm/etnaviv/etnaviv_drv.h | 4 +++
2 files changed, 37 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/etnaviv/etnaviv_drv.c b/drivers/gpu/drm/etnaviv/etnaviv_drv.c
index 0b756ecb1bc2..69d879e623b8 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_drv.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_drv.c
@@ -659,10 +659,39 @@ static struct platform_driver etnaviv_platform_driver = {

static struct platform_device *etnaviv_drm;

-static int __init etnaviv_init(void)
+int etnaviv_create_platform_device(const char *name,
+ const char *data[],
+ unsigned int num)
{
struct platform_device *pdev;
int ret;
+
+ pdev = platform_device_alloc(name, PLATFORM_DEVID_NONE);
+ if (!pdev)
+ return -ENOMEM;
+
+ if (data && num) {
+ ret = platform_device_add_data(pdev, data, num * sizeof(char *));
+ if (ret) {
+ platform_device_put(pdev);
+ return ret;
+ }
+ }
+
+ ret = platform_device_add(pdev);
+ if (ret) {
+ platform_device_put(pdev);
+ return ret;
+ }
+
+ etnaviv_drm = pdev;
+
+ return 0;
+}
+
+static int __init etnaviv_init(void)
+{
+ int ret;
struct device_node *np;

etnaviv_validate_init();
@@ -683,22 +712,12 @@ static int __init etnaviv_init(void)
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;
- }
+ of_node_put(np);

- ret = platform_device_add(pdev);
- if (ret) {
- platform_device_put(pdev);
- of_node_put(np);
+ ret = etnaviv_create_platform_device("etnaviv", NULL, 0);
+ if (ret)
goto unregister_platform_driver;
- }

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

diff --git a/drivers/gpu/drm/etnaviv/etnaviv_drv.h b/drivers/gpu/drm/etnaviv/etnaviv_drv.h
index f32f4771dada..944001a21ca2 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_drv.h
+++ b/drivers/gpu/drm/etnaviv/etnaviv_drv.h
@@ -81,6 +81,10 @@ void etnaviv_gem_describe_objects(struct etnaviv_drm_private *priv,
struct seq_file *m);
#endif

+int etnaviv_create_platform_device(const char *name,
+ const char *data[],
+ unsigned int num);
+
#define DBG(fmt, ...) DRM_DEBUG(fmt"\n", ##__VA_ARGS__)
#define VERB(fmt, ...) if (0) DRM_DEBUG(fmt"\n", ##__VA_ARGS__)

--
2.25.1