Commit 76d8ca24 authored by Sean Wang's avatar Sean Wang Committed by Greg Kroah-Hartman

serdev: add dev_pm_domain_attach|detach()

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: default avatarSean Wang <sean.wang@mediatek.com>
Reviewed-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
Reviewed-by: default avatarJohan 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: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 819abf29
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_device.h> #include <linux/of_device.h>
#include <linux/pm_domain.h>
#include <linux/pm_runtime.h> #include <linux/pm_runtime.h>
#include <linux/serdev.h> #include <linux/serdev.h>
#include <linux/slab.h> #include <linux/slab.h>
...@@ -350,8 +351,17 @@ EXPORT_SYMBOL_GPL(serdev_device_set_tiocm); ...@@ -350,8 +351,17 @@ EXPORT_SYMBOL_GPL(serdev_device_set_tiocm);
static int serdev_drv_probe(struct device *dev) static int serdev_drv_probe(struct device *dev)
{ {
const struct serdev_device_driver *sdrv = to_serdev_device_driver(dev->driver); 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) static int serdev_drv_remove(struct device *dev)
...@@ -359,6 +369,9 @@ 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); const struct serdev_device_driver *sdrv = to_serdev_device_driver(dev->driver);
if (sdrv->remove) if (sdrv->remove)
sdrv->remove(to_serdev_device(dev)); sdrv->remove(to_serdev_device(dev));
dev_pm_domain_detach(dev, true);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment