Message ID | 1393862536-9842-3-git-send-email-tomasz.figa@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 03/03, Tomasz Figa wrote: > On a number of platforms, devices are part of controllable power > domains, which need to be enabled before such devices can be accessed > and may be powered down when the device is idle to save some power. > This means that on systems that support power domain control using > generic power domains subsystem, it is necessary to add device to its > power domain before binding a driver to it and remove it from its power > domain after its driver is unbound to make sure that an unused device > does not affect power domain state. > > Since this is not limited to particular busses and specific > archs/platforms, it is more convenient to do the above directly in > driver core, just as done with pinctrl default configuration. This patch > adds necessary code to really_probe() and __device_release_driver() to > achieve this and maintain consistent stack-like ordering of operations > happening when binding and unbinding a driver. > > Signed-off-by: Tomasz Figa <tomasz.figa@gmail.com> Reviewed-by: Stephen Boyd <sboyd@codeaurora.org>
Hi Tomasz, On Mon, Mar 3, 2014 at 5:02 PM, Tomasz Figa <tomasz.figa@gmail.com> wrote: > On a number of platforms, devices are part of controllable power > domains, which need to be enabled before such devices can be accessed > and may be powered down when the device is idle to save some power. > This means that on systems that support power domain control using > generic power domains subsystem, it is necessary to add device to its > power domain before binding a driver to it and remove it from its power > domain after its driver is unbound to make sure that an unused device > does not affect power domain state. > > Since this is not limited to particular busses and specific > archs/platforms, it is more convenient to do the above directly in > driver core, just as done with pinctrl default configuration. This patch > adds necessary code to really_probe() and __device_release_driver() to > achieve this and maintain consistent stack-like ordering of operations > happening when binding and unbinding a driver. > > Signed-off-by: Tomasz Figa <tomasz.figa@gmail.com> patches 01 and 02 Reviewed-by: Philipp Zabel <philipp.zabel@gmail.com> Tested-by: Philipp Zabel <philipp.zabel@gmail.com> on i.MX6 GK802. regards Philipp
On Mon, Mar 03, 2014 at 05:02:07PM +0100, Tomasz Figa wrote: > On a number of platforms, devices are part of controllable power > domains, which need to be enabled before such devices can be accessed > and may be powered down when the device is idle to save some power. > This means that on systems that support power domain control using > generic power domains subsystem, it is necessary to add device to its > power domain before binding a driver to it and remove it from its power > domain after its driver is unbound to make sure that an unused device > does not affect power domain state. Reviewed-by: Mark Brown <broonie@linaro.org>
On 3 March 2014 17:02, Tomasz Figa <tomasz.figa@gmail.com> wrote: > On a number of platforms, devices are part of controllable power > domains, which need to be enabled before such devices can be accessed > and may be powered down when the device is idle to save some power. > This means that on systems that support power domain control using > generic power domains subsystem, it is necessary to add device to its > power domain before binding a driver to it and remove it from its power > domain after its driver is unbound to make sure that an unused device > does not affect power domain state. > > Since this is not limited to particular busses and specific > archs/platforms, it is more convenient to do the above directly in > driver core, just as done with pinctrl default configuration. This patch > adds necessary code to really_probe() and __device_release_driver() to > achieve this and maintain consistent stack-like ordering of operations > happening when binding and unbinding a driver. > > Signed-off-by: Tomasz Figa <tomasz.figa@gmail.com> This definitely makes sense to me! Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org> > --- > drivers/base/dd.c | 9 ++++++++- > 1 file changed, 8 insertions(+), 1 deletion(-) > > diff --git a/drivers/base/dd.c b/drivers/base/dd.c > index 0605176..78e5b36 100644 > --- a/drivers/base/dd.c > +++ b/drivers/base/dd.c > @@ -23,6 +23,7 @@ > #include <linux/kthread.h> > #include <linux/wait.h> > #include <linux/async.h> > +#include <linux/pm_domain.h> > #include <linux/pm_runtime.h> > #include <linux/pinctrl/devinfo.h> > > @@ -273,6 +274,11 @@ static int really_probe(struct device *dev, struct device_driver *drv) > > dev->driver = drv; > > + /* If using genpd, bind power domain now before probing */ > + ret = genpd_bind_domain(dev); > + if (ret) > + goto probe_failed; > + > /* If using pinctrl, bind pins now before probing */ > ret = pinctrl_bind_pins(dev); > if (ret) > @@ -303,6 +309,7 @@ static int really_probe(struct device *dev, struct device_driver *drv) > probe_failed: > devres_release_all(dev); > driver_sysfs_remove(dev); > + genpd_unbind_domain(dev); > dev->driver = NULL; > dev_set_drvdata(dev, NULL); > > @@ -513,7 +520,7 @@ static void __device_release_driver(struct device *dev) > blocking_notifier_call_chain(&dev->bus->p->bus_notifier, > BUS_NOTIFY_UNBOUND_DRIVER, > dev); > - > + genpd_unbind_domain(dev); > } > } > > -- > 1.9.0 >
diff --git a/drivers/base/dd.c b/drivers/base/dd.c index 0605176..78e5b36 100644 --- a/drivers/base/dd.c +++ b/drivers/base/dd.c @@ -23,6 +23,7 @@ #include <linux/kthread.h> #include <linux/wait.h> #include <linux/async.h> +#include <linux/pm_domain.h> #include <linux/pm_runtime.h> #include <linux/pinctrl/devinfo.h> @@ -273,6 +274,11 @@ static int really_probe(struct device *dev, struct device_driver *drv) dev->driver = drv; + /* If using genpd, bind power domain now before probing */ + ret = genpd_bind_domain(dev); + if (ret) + goto probe_failed; + /* If using pinctrl, bind pins now before probing */ ret = pinctrl_bind_pins(dev); if (ret) @@ -303,6 +309,7 @@ static int really_probe(struct device *dev, struct device_driver *drv) probe_failed: devres_release_all(dev); driver_sysfs_remove(dev); + genpd_unbind_domain(dev); dev->driver = NULL; dev_set_drvdata(dev, NULL); @@ -513,7 +520,7 @@ static void __device_release_driver(struct device *dev) blocking_notifier_call_chain(&dev->bus->p->bus_notifier, BUS_NOTIFY_UNBOUND_DRIVER, dev); - + genpd_unbind_domain(dev); } }
On a number of platforms, devices are part of controllable power domains, which need to be enabled before such devices can be accessed and may be powered down when the device is idle to save some power. This means that on systems that support power domain control using generic power domains subsystem, it is necessary to add device to its power domain before binding a driver to it and remove it from its power domain after its driver is unbound to make sure that an unused device does not affect power domain state. Since this is not limited to particular busses and specific archs/platforms, it is more convenient to do the above directly in driver core, just as done with pinctrl default configuration. This patch adds necessary code to really_probe() and __device_release_driver() to achieve this and maintain consistent stack-like ordering of operations happening when binding and unbinding a driver. Signed-off-by: Tomasz Figa <tomasz.figa@gmail.com> --- drivers/base/dd.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)