@@ -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;
}
@@ -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__)
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@189.cn> --- drivers/gpu/drm/etnaviv/etnaviv_drv.c | 47 +++++++++++++++++++-------- drivers/gpu/drm/etnaviv/etnaviv_drv.h | 4 +++ 2 files changed, 37 insertions(+), 14 deletions(-)