drm/etnaviv: Check for platform_device_register_simple() failure
[sfrench/cifs-2.6.git] / drivers / gpu / drm / etnaviv / etnaviv_drv.c
index 23e73c2a19f4d1403c72bb37272b83f139d16421..19abd3ca661888639b3245ef18a3ca40a2ab0392 100644 (file)
@@ -1,17 +1,6 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
- * Copyright (C) 2015 Etnaviv Project
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 as published by
- * the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program.  If not, see <http://www.gnu.org/licenses/>.
+ * Copyright (C) 2015-2018 Etnaviv Project
  */
 
 #include <linux/component.h>
 #include "etnaviv_mmu.h"
 #include "etnaviv_perfmon.h"
 
-#ifdef CONFIG_DRM_ETNAVIV_REGISTER_LOGGING
-static bool reglog;
-MODULE_PARM_DESC(reglog, "Enable register read/write logging");
-module_param(reglog, bool, 0600);
-#else
-#define reglog 0
-#endif
-
-void __iomem *etnaviv_ioremap(struct platform_device *pdev, const char *name,
-               const char *dbgname)
-{
-       struct resource *res;
-       void __iomem *ptr;
-
-       if (name)
-               res = platform_get_resource_byname(pdev, IORESOURCE_MEM, name);
-       else
-               res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-
-       ptr = devm_ioremap_resource(&pdev->dev, res);
-       if (IS_ERR(ptr)) {
-               dev_err(&pdev->dev, "failed to ioremap %s: %ld\n", name,
-                       PTR_ERR(ptr));
-               return ptr;
-       }
-
-       if (reglog)
-               dev_printk(KERN_DEBUG, &pdev->dev, "IO:region %s 0x%p %08zx\n",
-                          dbgname, ptr, (size_t)resource_size(res));
-
-       return ptr;
-}
-
-void etnaviv_writel(u32 data, void __iomem *addr)
-{
-       if (reglog)
-               printk(KERN_DEBUG "IO:W %p %08x\n", addr, data);
-
-       writel(data, addr);
-}
-
-u32 etnaviv_readl(const void __iomem *addr)
-{
-       u32 val = readl(addr);
-
-       if (reglog)
-               printk(KERN_DEBUG "IO:R %p %08x\n", addr, val);
-
-       return val;
-}
-
 /*
  * DRM operations:
  */
@@ -693,8 +631,11 @@ static struct platform_driver etnaviv_platform_driver = {
        },
 };
 
+static struct platform_device *etnaviv_drm;
+
 static int __init etnaviv_init(void)
 {
+       struct platform_device *pdev;
        int ret;
        struct device_node *np;
 
@@ -706,7 +647,7 @@ static int __init etnaviv_init(void)
 
        ret = platform_driver_register(&etnaviv_platform_driver);
        if (ret != 0)
-               platform_driver_unregister(&etnaviv_gpu_driver);
+               goto unregister_gpu_driver;
 
        /*
         * If the DT contains at least one available GPU device, instantiate
@@ -715,12 +656,24 @@ static int __init etnaviv_init(void)
        for_each_compatible_node(np, NULL, "vivante,gc") {
                if (!of_device_is_available(np))
                        continue;
-
-               platform_device_register_simple("etnaviv", -1, NULL, 0);
+               pdev = platform_device_register_simple("etnaviv", -1,
+                                                      NULL, 0);
+               if (IS_ERR(pdev)) {
+                       ret = PTR_ERR(pdev);
+                       of_node_put(np);
+                       goto unregister_platform_driver;
+               }
+               etnaviv_drm = pdev;
                of_node_put(np);
                break;
        }
 
+       return 0;
+
+unregister_platform_driver:
+       platform_driver_unregister(&etnaviv_platform_driver);
+unregister_gpu_driver:
+       platform_driver_unregister(&etnaviv_gpu_driver);
        return ret;
 }
 module_init(etnaviv_init);