]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blobdiff - drivers/amba/bus.c
Merge tag 'for-5.12/io_uring-2021-02-25' of git://git.kernel.dk/linux-block
[mirror_ubuntu-jammy-kernel.git] / drivers / amba / bus.c
index 48b5d4b4e889f08d16357c1de3867b86746c984a..939ca220bf78d7cd931e1e31592b351b05407fe6 100644 (file)
@@ -174,6 +174,84 @@ static int amba_uevent(struct device *dev, struct kobj_uevent_env *env)
        return retval;
 }
 
+/*
+ * These are the device model conversion veneers; they convert the
+ * device model structures to our more specific structures.
+ */
+static int amba_probe(struct device *dev)
+{
+       struct amba_device *pcdev = to_amba_device(dev);
+       struct amba_driver *pcdrv = to_amba_driver(dev->driver);
+       const struct amba_id *id = amba_lookup(pcdrv->id_table, pcdev);
+       int ret;
+
+       do {
+               ret = of_clk_set_defaults(dev->of_node, false);
+               if (ret < 0)
+                       break;
+
+               ret = dev_pm_domain_attach(dev, true);
+               if (ret)
+                       break;
+
+               ret = amba_get_enable_pclk(pcdev);
+               if (ret) {
+                       dev_pm_domain_detach(dev, true);
+                       break;
+               }
+
+               pm_runtime_get_noresume(dev);
+               pm_runtime_set_active(dev);
+               pm_runtime_enable(dev);
+
+               ret = pcdrv->probe(pcdev, id);
+               if (ret == 0)
+                       break;
+
+               pm_runtime_disable(dev);
+               pm_runtime_set_suspended(dev);
+               pm_runtime_put_noidle(dev);
+
+               amba_put_disable_pclk(pcdev);
+               dev_pm_domain_detach(dev, true);
+       } while (0);
+
+       return ret;
+}
+
+static int amba_remove(struct device *dev)
+{
+       struct amba_device *pcdev = to_amba_device(dev);
+       struct amba_driver *drv = to_amba_driver(dev->driver);
+
+       pm_runtime_get_sync(dev);
+       if (drv->remove)
+               drv->remove(pcdev);
+       pm_runtime_put_noidle(dev);
+
+       /* Undo the runtime PM settings in amba_probe() */
+       pm_runtime_disable(dev);
+       pm_runtime_set_suspended(dev);
+       pm_runtime_put_noidle(dev);
+
+       amba_put_disable_pclk(pcdev);
+       dev_pm_domain_detach(dev, true);
+
+       return 0;
+}
+
+static void amba_shutdown(struct device *dev)
+{
+       struct amba_driver *drv;
+
+       if (!dev->driver)
+               return;
+
+       drv = to_amba_driver(dev->driver);
+       if (drv->shutdown)
+               drv->shutdown(to_amba_device(dev));
+}
+
 #ifdef CONFIG_PM
 /*
  * Hooks to provide runtime PM of the pclk (bus clock).  It is safe to
@@ -239,6 +317,9 @@ struct bus_type amba_bustype = {
        .dev_groups     = amba_dev_groups,
        .match          = amba_match,
        .uevent         = amba_uevent,
+       .probe          = amba_probe,
+       .remove         = amba_remove,
+       .shutdown       = amba_shutdown,
        .dma_configure  = platform_dma_configure,
        .pm             = &amba_pm,
 };
@@ -251,80 +332,6 @@ static int __init amba_init(void)
 
 postcore_initcall(amba_init);
 
-/*
- * These are the device model conversion veneers; they convert the
- * device model structures to our more specific structures.
- */
-static int amba_probe(struct device *dev)
-{
-       struct amba_device *pcdev = to_amba_device(dev);
-       struct amba_driver *pcdrv = to_amba_driver(dev->driver);
-       const struct amba_id *id = amba_lookup(pcdrv->id_table, pcdev);
-       int ret;
-
-       do {
-               ret = of_clk_set_defaults(dev->of_node, false);
-               if (ret < 0)
-                       break;
-
-               ret = dev_pm_domain_attach(dev, true);
-               if (ret)
-                       break;
-
-               ret = amba_get_enable_pclk(pcdev);
-               if (ret) {
-                       dev_pm_domain_detach(dev, true);
-                       break;
-               }
-
-               pm_runtime_get_noresume(dev);
-               pm_runtime_set_active(dev);
-               pm_runtime_enable(dev);
-
-               ret = pcdrv->probe(pcdev, id);
-               if (ret == 0)
-                       break;
-
-               pm_runtime_disable(dev);
-               pm_runtime_set_suspended(dev);
-               pm_runtime_put_noidle(dev);
-
-               amba_put_disable_pclk(pcdev);
-               dev_pm_domain_detach(dev, true);
-       } while (0);
-
-       return ret;
-}
-
-static int amba_remove(struct device *dev)
-{
-       struct amba_device *pcdev = to_amba_device(dev);
-       struct amba_driver *drv = to_amba_driver(dev->driver);
-
-       pm_runtime_get_sync(dev);
-       if (drv->remove)
-               drv->remove(pcdev);
-       pm_runtime_put_noidle(dev);
-
-       /* Undo the runtime PM settings in amba_probe() */
-       pm_runtime_disable(dev);
-       pm_runtime_set_suspended(dev);
-       pm_runtime_put_noidle(dev);
-
-       amba_put_disable_pclk(pcdev);
-       dev_pm_domain_detach(dev, true);
-
-       return 0;
-}
-
-static void amba_shutdown(struct device *dev)
-{
-       struct amba_driver *drv = to_amba_driver(dev->driver);
-
-       if (drv->shutdown)
-               drv->shutdown(to_amba_device(dev));
-}
-
 /**
  *     amba_driver_register - register an AMBA device driver
  *     @drv: amba device driver structure
@@ -339,9 +346,6 @@ int amba_driver_register(struct amba_driver *drv)
                return -EINVAL;
 
        drv->drv.bus = &amba_bustype;
-       drv->drv.probe = amba_probe;
-       drv->drv.remove = amba_remove;
-       drv->drv.shutdown = amba_shutdown;
 
        return driver_register(&drv->drv);
 }