diff mbox

[v3,19/47] mfd: rk808: Register power-off handler with kernel power-off handler

Message ID 1414425354-10359-20-git-send-email-linux@roeck-us.net (mailing list archive)
State Not Applicable, archived
Headers show

Commit Message

Guenter Roeck Oct. 27, 2014, 3:55 p.m. UTC
Register with kernel power-off handler instead of setting pm_power_off
directly. Register with low priority to reflect that the original code
only sets pm_power_off if it was not already set.

Cc: Chris Zhong <zyw@rock-chips.com>
Cc: Zhang Qing <zhangqing@rock-chips.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
v2:
- New patch

 drivers/mfd/rk808.c       | 30 ++++++++++++++++--------------
 include/linux/mfd/rk808.h |  2 ++
 2 files changed, 18 insertions(+), 14 deletions(-)

Comments

Lee Jones Nov. 3, 2014, 5:53 p.m. UTC | #1
On Mon, 27 Oct 2014, Guenter Roeck wrote:

> Register with kernel power-off handler instead of setting pm_power_off
> directly. Register with low priority to reflect that the original code
> only sets pm_power_off if it was not already set.
> 
> Cc: Chris Zhong <zyw@rock-chips.com>
> Cc: Zhang Qing <zhangqing@rock-chips.com>
> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
> ---
> v3:
> - Replace poweroff in all newly introduced variables and in text
>   with power_off or power-off as appropriate
> - Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
> v2:
> - New patch
> 
>  drivers/mfd/rk808.c       | 30 ++++++++++++++++--------------
>  include/linux/mfd/rk808.h |  2 ++
>  2 files changed, 18 insertions(+), 14 deletions(-)

Code looks okay:

Acked-by: Lee Jones <lee.jones@linaro.org>

... but how are you thinking about handling this set?

> diff --git a/drivers/mfd/rk808.c b/drivers/mfd/rk808.c
> index bd02150..5d5257d 100644
> --- a/drivers/mfd/rk808.c
> +++ b/drivers/mfd/rk808.c
> @@ -21,6 +21,8 @@
>  #include <linux/mfd/rk808.h>
>  #include <linux/mfd/core.h>
>  #include <linux/module.h>
> +#include <linux/notifier.h>
> +#include <linux/pm.h>
>  #include <linux/regmap.h>
>  
>  struct rk808_reg_data {
> @@ -147,23 +149,19 @@ static struct regmap_irq_chip rk808_irq_chip = {
>  	.init_ack_masked = true,
>  };
>  
> -static struct i2c_client *rk808_i2c_client;
> -static void rk808_device_shutdown(void)
> +static int rk808_device_shutdown(struct notifier_block *this,
> +				 unsigned long unused1, void *unused2)
>  {
> +	struct rk808 *rk808 = container_of(this, struct rk808, power_off_nb);
>  	int ret;
> -	struct rk808 *rk808 = i2c_get_clientdata(rk808_i2c_client);
> -
> -	if (!rk808) {
> -		dev_warn(&rk808_i2c_client->dev,
> -			 "have no rk808, so do nothing here\n");
> -		return;
> -	}
>  
>  	ret = regmap_update_bits(rk808->regmap,
>  				 RK808_DEVCTRL_REG,
>  				 DEV_OFF_RST, DEV_OFF_RST);
>  	if (ret)
> -		dev_err(&rk808_i2c_client->dev, "power off error!\n");
> +		dev_err(&rk808->i2c->dev, "power off error!\n");
> +
> +	return NOTIFY_DONE;
>  }
>  
>  static int rk808_probe(struct i2c_client *client,
> @@ -222,9 +220,14 @@ static int rk808_probe(struct i2c_client *client,
>  
>  	pm_off = of_property_read_bool(np,
>  				"rockchip,system-power-controller");
> -	if (pm_off && !pm_power_off) {
> -		rk808_i2c_client = client;
> -		pm_power_off = rk808_device_shutdown;
> +	if (pm_off) {
> +		rk808->power_off_nb.notifier_call = rk808_device_shutdown;
> +		rk808->power_off_nb.priority = POWER_OFF_PRIORITY_LOW;
> +		ret = devm_register_power_off_handler(&client->dev,
> +						      &rk808->power_off_nb);
> +		if (ret)
> +			dev_warn(&client->dev,
> +				 "Failed to register power-off handler\n");
>  	}
>  
>  	return 0;
> @@ -240,7 +243,6 @@ static int rk808_remove(struct i2c_client *client)
>  
>  	regmap_del_irq_chip(client->irq, rk808->irq_data);
>  	mfd_remove_devices(&client->dev);
> -	pm_power_off = NULL;
>  
>  	return 0;
>  }
> diff --git a/include/linux/mfd/rk808.h b/include/linux/mfd/rk808.h
> index fb09312..6308fd4 100644
> --- a/include/linux/mfd/rk808.h
> +++ b/include/linux/mfd/rk808.h
> @@ -19,6 +19,7 @@
>  #ifndef __LINUX_REGULATOR_rk808_H
>  #define __LINUX_REGULATOR_rk808_H
>  
> +#include <linux/notifier.h>
>  #include <linux/regulator/machine.h>
>  #include <linux/regmap.h>
>  
> @@ -192,5 +193,6 @@ struct rk808 {
>  	struct i2c_client *i2c;
>  	struct regmap_irq_chip_data *irq_data;
>  	struct regmap *regmap;
> +	struct notifier_block power_off_nb;
>  };
>  #endif /* __LINUX_REGULATOR_rk808_H */
Guenter Roeck Nov. 3, 2014, 7:06 p.m. UTC | #2
On Mon, Nov 03, 2014 at 05:53:46PM +0000, Lee Jones wrote:
> On Mon, 27 Oct 2014, Guenter Roeck wrote:
> 
> > Register with kernel power-off handler instead of setting pm_power_off
> > directly. Register with low priority to reflect that the original code
> > only sets pm_power_off if it was not already set.
> > 
> > Cc: Chris Zhong <zyw@rock-chips.com>
> > Cc: Zhang Qing <zhangqing@rock-chips.com>
> > Signed-off-by: Guenter Roeck <linux@roeck-us.net>
> > ---
> > v3:
> > - Replace poweroff in all newly introduced variables and in text
> >   with power_off or power-off as appropriate
> > - Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
> > v2:
> > - New patch
> > 
> >  drivers/mfd/rk808.c       | 30 ++++++++++++++++--------------
> >  include/linux/mfd/rk808.h |  2 ++
> >  2 files changed, 18 insertions(+), 14 deletions(-)
> 
> Code looks okay:
> 
> Acked-by: Lee Jones <lee.jones@linaro.org>
> 
Thanks!

> ... but how are you thinking about handling this set?
> 

Plan is to send the entire series directly to Linus in the next
commit window, as suggested by several of the affected maintainers.

I am still missing an Ack for patch 1 of the series. If/when I get
that, I'll set up the series except for the last patch to be added
to linux-next for it to get some exposure.

Of course, that plan may all fall apart if someone objects. In that case,
the patches would have to be taken over several releases by the individual
maintainers.

Guenter
--
To unsubscribe from this list: send the line "unsubscribe linux-pm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Lee Jones Nov. 3, 2014, 10:42 p.m. UTC | #3
On Mon, 03 Nov 2014, Guenter Roeck wrote:

> On Mon, Nov 03, 2014 at 05:53:46PM +0000, Lee Jones wrote:
> > On Mon, 27 Oct 2014, Guenter Roeck wrote:
> > 
> > > Register with kernel power-off handler instead of setting pm_power_off
> > > directly. Register with low priority to reflect that the original code
> > > only sets pm_power_off if it was not already set.
> > > 
> > > Cc: Chris Zhong <zyw@rock-chips.com>
> > > Cc: Zhang Qing <zhangqing@rock-chips.com>
> > > Signed-off-by: Guenter Roeck <linux@roeck-us.net>
> > > ---
> > > v3:
> > > - Replace poweroff in all newly introduced variables and in text
> > >   with power_off or power-off as appropriate
> > > - Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
> > > v2:
> > > - New patch
> > > 
> > >  drivers/mfd/rk808.c       | 30 ++++++++++++++++--------------
> > >  include/linux/mfd/rk808.h |  2 ++
> > >  2 files changed, 18 insertions(+), 14 deletions(-)
> > 
> > Code looks okay:
> > 
> > Acked-by: Lee Jones <lee.jones@linaro.org>
> > 
> Thanks!
> 
> > ... but how are you thinking about handling this set?
> > 
> 
> Plan is to send the entire series directly to Linus in the next
> commit window, as suggested by several of the affected maintainers.
> 
> I am still missing an Ack for patch 1 of the series. If/when I get
> that, I'll set up the series except for the last patch to be added
> to linux-next for it to get some exposure.
> 
> Of course, that plan may all fall apart if someone objects. In that case,
> the patches would have to be taken over several releases by the individual
> maintainers.

Very well.  Either is okay with me.  It might also be worth
considering speaking to Linus and requesting permission to send during
-rc1 to minimise the risk of a huge number of conflicts.
Guenter Roeck Nov. 3, 2014, 10:52 p.m. UTC | #4
On Mon, Nov 03, 2014 at 10:42:27PM +0000, Lee Jones wrote:
> On Mon, 03 Nov 2014, Guenter Roeck wrote:
> 
> > On Mon, Nov 03, 2014 at 05:53:46PM +0000, Lee Jones wrote:
> > > On Mon, 27 Oct 2014, Guenter Roeck wrote:
> > > 
> > > > Register with kernel power-off handler instead of setting pm_power_off
> > > > directly. Register with low priority to reflect that the original code
> > > > only sets pm_power_off if it was not already set.
> > > > 
> > > > Cc: Chris Zhong <zyw@rock-chips.com>
> > > > Cc: Zhang Qing <zhangqing@rock-chips.com>
> > > > Signed-off-by: Guenter Roeck <linux@roeck-us.net>
> > > > ---
> > > > v3:
> > > > - Replace poweroff in all newly introduced variables and in text
> > > >   with power_off or power-off as appropriate
> > > > - Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
> > > > v2:
> > > > - New patch
> > > > 
> > > >  drivers/mfd/rk808.c       | 30 ++++++++++++++++--------------
> > > >  include/linux/mfd/rk808.h |  2 ++
> > > >  2 files changed, 18 insertions(+), 14 deletions(-)
> > > 
> > > Code looks okay:
> > > 
> > > Acked-by: Lee Jones <lee.jones@linaro.org>
> > > 
> > Thanks!
> > 
> > > ... but how are you thinking about handling this set?
> > > 
> > 
> > Plan is to send the entire series directly to Linus in the next
> > commit window, as suggested by several of the affected maintainers.
> > 
> > I am still missing an Ack for patch 1 of the series. If/when I get
> > that, I'll set up the series except for the last patch to be added
> > to linux-next for it to get some exposure.
> > 
> > Of course, that plan may all fall apart if someone objects. In that case,
> > the patches would have to be taken over several releases by the individual
> > maintainers.
> 
> Very well.  Either is okay with me.  It might also be worth
> considering speaking to Linus and requesting permission to send during
> -rc1 to minimise the risk of a huge number of conflicts.
> 
That sounds like a good idea. I may have to split the patches into two
parts anyway, to catch any new code setting pm_power_off directly. Maybe 
the first part can go in during the commit window and the final part
after -rc1.

Thanks,
Guenter
--
To unsubscribe from this list: send the line "unsubscribe linux-pm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/mfd/rk808.c b/drivers/mfd/rk808.c
index bd02150..5d5257d 100644
--- a/drivers/mfd/rk808.c
+++ b/drivers/mfd/rk808.c
@@ -21,6 +21,8 @@ 
 #include <linux/mfd/rk808.h>
 #include <linux/mfd/core.h>
 #include <linux/module.h>
+#include <linux/notifier.h>
+#include <linux/pm.h>
 #include <linux/regmap.h>
 
 struct rk808_reg_data {
@@ -147,23 +149,19 @@  static struct regmap_irq_chip rk808_irq_chip = {
 	.init_ack_masked = true,
 };
 
-static struct i2c_client *rk808_i2c_client;
-static void rk808_device_shutdown(void)
+static int rk808_device_shutdown(struct notifier_block *this,
+				 unsigned long unused1, void *unused2)
 {
+	struct rk808 *rk808 = container_of(this, struct rk808, power_off_nb);
 	int ret;
-	struct rk808 *rk808 = i2c_get_clientdata(rk808_i2c_client);
-
-	if (!rk808) {
-		dev_warn(&rk808_i2c_client->dev,
-			 "have no rk808, so do nothing here\n");
-		return;
-	}
 
 	ret = regmap_update_bits(rk808->regmap,
 				 RK808_DEVCTRL_REG,
 				 DEV_OFF_RST, DEV_OFF_RST);
 	if (ret)
-		dev_err(&rk808_i2c_client->dev, "power off error!\n");
+		dev_err(&rk808->i2c->dev, "power off error!\n");
+
+	return NOTIFY_DONE;
 }
 
 static int rk808_probe(struct i2c_client *client,
@@ -222,9 +220,14 @@  static int rk808_probe(struct i2c_client *client,
 
 	pm_off = of_property_read_bool(np,
 				"rockchip,system-power-controller");
-	if (pm_off && !pm_power_off) {
-		rk808_i2c_client = client;
-		pm_power_off = rk808_device_shutdown;
+	if (pm_off) {
+		rk808->power_off_nb.notifier_call = rk808_device_shutdown;
+		rk808->power_off_nb.priority = POWER_OFF_PRIORITY_LOW;
+		ret = devm_register_power_off_handler(&client->dev,
+						      &rk808->power_off_nb);
+		if (ret)
+			dev_warn(&client->dev,
+				 "Failed to register power-off handler\n");
 	}
 
 	return 0;
@@ -240,7 +243,6 @@  static int rk808_remove(struct i2c_client *client)
 
 	regmap_del_irq_chip(client->irq, rk808->irq_data);
 	mfd_remove_devices(&client->dev);
-	pm_power_off = NULL;
 
 	return 0;
 }
diff --git a/include/linux/mfd/rk808.h b/include/linux/mfd/rk808.h
index fb09312..6308fd4 100644
--- a/include/linux/mfd/rk808.h
+++ b/include/linux/mfd/rk808.h
@@ -19,6 +19,7 @@ 
 #ifndef __LINUX_REGULATOR_rk808_H
 #define __LINUX_REGULATOR_rk808_H
 
+#include <linux/notifier.h>
 #include <linux/regulator/machine.h>
 #include <linux/regmap.h>
 
@@ -192,5 +193,6 @@  struct rk808 {
 	struct i2c_client *i2c;
 	struct regmap_irq_chip_data *irq_data;
 	struct regmap *regmap;
+	struct notifier_block power_off_nb;
 };
 #endif /* __LINUX_REGULATOR_rk808_H */