]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
serdev: add dev_pm_domain_attach|detach()
authorSean Wang <sean.wang@mediatek.com>
Mon, 9 Jul 2018 15:56:58 +0000 (23:56 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 15 Jul 2018 10:23:53 +0000 (12:23 +0200)
In order to open up the required power gate before any operation can be
effectively performed over the serial bus between CPU and serdev, it's
clearly essential to add common attach functions for PM domains to serdev
at the probe phase.

Similarly, the relevant dettach function for the PM domains should be
properly and reversely added at the remove phase.

Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org>
Reviewed-by: Johan Hovold <johan@kernel.org>
Cc: Rob Herring <robh@kernel.org>
Cc: Ulf Hansson <ulf.hansson@linaro.org>
Cc: Jiri Slaby <jslaby@suse.com>
Cc: linux-serial@vger.kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serdev/core.c

index bd47c46ec993cf8b5666bc7c5a13da2be8326ffe..9db93f500b4e722cfa5df55201f28238d484b9ae 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/module.h>
 #include <linux/of.h>
 #include <linux/of_device.h>
+#include <linux/pm_domain.h>
 #include <linux/pm_runtime.h>
 #include <linux/serdev.h>
 #include <linux/slab.h>
@@ -350,8 +351,17 @@ EXPORT_SYMBOL_GPL(serdev_device_set_tiocm);
 static int serdev_drv_probe(struct device *dev)
 {
        const struct serdev_device_driver *sdrv = to_serdev_device_driver(dev->driver);
+       int ret;
 
-       return sdrv->probe(to_serdev_device(dev));
+       ret = dev_pm_domain_attach(dev, true);
+       if (ret)
+               return ret;
+
+       ret = sdrv->probe(to_serdev_device(dev));
+       if (ret)
+               dev_pm_domain_detach(dev, true);
+
+       return ret;
 }
 
 static int serdev_drv_remove(struct device *dev)
@@ -359,6 +369,9 @@ static int serdev_drv_remove(struct device *dev)
        const struct serdev_device_driver *sdrv = to_serdev_device_driver(dev->driver);
        if (sdrv->remove)
                sdrv->remove(to_serdev_device(dev));
+
+       dev_pm_domain_detach(dev, true);
+
        return 0;
 }