lkml.org 
[lkml]   [2018]   [Jun]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    SubjectRe: [PATCH v3 2/7] serdev: add dev_pm_domain_attach|detach()
    On Thu, 14 Jun 2018 at 09:14, <sean.wang@mediatek.com> wrote:
    >
    > From: Sean Wang <sean.wang@mediatek.com>
    >
    > 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>
    > Cc: Rob Herring <robh@kernel.org>
    > Cc: Ulf Hansson <ulf.hansson@linaro.org>
    > Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    > Cc: Jiri Slaby <jslaby@suse.com>
    > Cc: linux-serial@vger.kernel.org
    > ---
    > drivers/tty/serdev/core.c | 14 +++++++++++++-
    > 1 file changed, 13 insertions(+), 1 deletion(-)
    >
    > diff --git a/drivers/tty/serdev/core.c b/drivers/tty/serdev/core.c
    > index df93b72..c93d8ee 100644
    > --- a/drivers/tty/serdev/core.c
    > +++ b/drivers/tty/serdev/core.c
    > @@ -13,6 +13,7 @@
    > #include <linux/module.h>
    > #include <linux/of.h>
    > #include <linux/of_device.h>
    > +#include <linux/pm_domain.h>
    > #include <linux/serdev.h>
    > #include <linux/slab.h>
    >
    > @@ -330,8 +331,16 @@ 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;
    > +
    > + ret = dev_pm_domain_attach(dev, true);
    > + if (ret != -EPROBE_DEFER) {

    From 4.18 rc1 via commit 919b7308fcc4, dev_pm_domain_attach() will
    return better error codes.

    I suggest to change the above error path to:
    if (ret)
    return ret;

    Then continue with the probing below.

    > + ret = sdrv->probe(to_serdev_device(dev));
    > + if (ret)
    > + dev_pm_domain_detach(dev, true);
    > + }
    >
    > - return sdrv->probe(to_serdev_device(dev));
    > + return ret;
    > }
    >
    > static int serdev_drv_remove(struct device *dev)
    > @@ -339,6 +348,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;
    > }
    >
    > --
    > 2.7.4
    >

    Otherwise, this makes sense to me!

    Kind regards
    Uffe

    \
     
     \ /
      Last update: 2018-06-14 10:59    [W:2.295 / U:0.084 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site