Patchwork [1/3] ARM: imx: enable anatop suspend/resume

login
register
mail settings
Submitter Anson Huang
Date March 20, 2013, 5:39 p.m.
Message ID <1363801180-8284-1-git-send-email-b20788@freescale.com>
Download mbox | patch
Permalink /patch/229246/
State New
Headers show

Comments

Shawn Guo - March 20, 2013, 7:29 a.m.
On Wed, Mar 20, 2013 at 01:39:38PM -0400, Anson Huang wrote:
> anatop module have sereval configurations for user
> to reduce the power consumption in suspend, provide
> suspend/resume interface for further use and enable
> fet_odrive to reduce CORE LDO leakage during suspend.
> 
> Signed-off-by: Anson Huang <b20788@freescale.com>
> ---
>  arch/arm/mach-imx/Kconfig      |    4 ++++
>  arch/arm/mach-imx/Makefile     |    1 +
>  arch/arm/mach-imx/anatop.c     |   50 ++++++++++++++++++++++++++++++++++++++++

I like the idea of having an anatop.c for all those anatop related
setup.  Please move those anatop related code in mach-imx6q.c
into there as well.  Leaving them out there beats the idea of having
a centralized place for anatop configurations.

>  arch/arm/mach-imx/common.h     |    3 +++
>  arch/arm/mach-imx/mach-imx6q.c |    1 +
>  arch/arm/mach-imx/pm-imx6q.c   |    2 ++
>  6 files changed, 61 insertions(+)
>  create mode 100644 arch/arm/mach-imx/anatop.c
> 
> diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig
> index 4c9c6f9..7abaa6e 100644
> --- a/arch/arm/mach-imx/Kconfig
> +++ b/arch/arm/mach-imx/Kconfig
> @@ -74,6 +74,9 @@ config HAVE_IMX_MMDC
>  config HAVE_IMX_SRC
>  	def_bool y if SMP
>  
> +config HAVE_IMX_ANATOP
> +	bool
> +

Please have it added before "config HAVE_IMX_GPC".  We are trying to
have them sorted in alphabet.

>  config IMX_HAVE_IOMUX_V1
>  	bool
>  
> @@ -816,6 +819,7 @@ config SOC_IMX6Q
>  	select HAVE_IMX_GPC
>  	select HAVE_IMX_MMDC
>  	select HAVE_IMX_SRC
> +	select HAVE_IMX_ANATOP

Ditto

>  	select HAVE_SMP
>  	select MFD_SYSCON
>  	select PINCTRL
> diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile
> index c4ce090..f4badaa 100644
> --- a/arch/arm/mach-imx/Makefile
> +++ b/arch/arm/mach-imx/Makefile
> @@ -95,6 +95,7 @@ obj-$(CONFIG_MACH_VPR200) += mach-vpr200.o
>  obj-$(CONFIG_HAVE_IMX_GPC) += gpc.o
>  obj-$(CONFIG_HAVE_IMX_MMDC) += mmdc.o
>  obj-$(CONFIG_HAVE_IMX_SRC) += src.o
> +obj-$(CONFIG_HAVE_IMX_ANATOP) += anatop.o

Ditto

>  AFLAGS_headsmp.o :=-Wa,-march=armv7-a
>  obj-$(CONFIG_SMP) += headsmp.o platsmp.o
>  obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o
> diff --git a/arch/arm/mach-imx/anatop.c b/arch/arm/mach-imx/anatop.c
> new file mode 100644
> index 0000000..8f6ab27
> --- /dev/null
> +++ b/arch/arm/mach-imx/anatop.c
> @@ -0,0 +1,50 @@
> +/*
> + * Copyright (C) 2013 Freescale Semiconductor, Inc.
> + *
> + * The code contained herein is licensed under the GNU General Public
> + * License. You may obtain a copy of the GNU General Public License
> + * Version 2 or later at the following locations:
> + *
> + * http://www.opensource.org/licenses/gpl-license.html
> + * http://www.gnu.org/copyleft/gpl.html
> + */
> +
> +#include <linux/err.h>
> +#include <linux/io.h>
> +#include <linux/of.h>
> +#include <linux/of_address.h>
> +#include <linux/mfd/syscon.h>
> +#include <linux/regmap.h>
> +
> +#define REG_SET		0x4
> +#define REG_CLR		0x8
> +#define ANA_REG_CORE	0x140

The abbreviation ANA is used here ...

> +
> +#define BM_ANADIG_REG_CORE_FET_ODRIVE		0x20000000

... while "ANADIG" is here.  Please be consistent.

> +
> +static struct regmap *anatop;
> +
> +void imx_anatop_enable_fet_odrive(bool enable)

static?

> +{
> +	regmap_write(anatop, ANA_REG_CORE + (enable ?
> +		REG_SET : REG_CLR), BM_ANADIG_REG_CORE_FET_ODRIVE);

This is a nit, but I think the following indent is nicer for reading.

	regmap_write(anatop, ANA_REG_CORE + (enable ? REG_SET : REG_CLR),
		     BM_ANADIG_REG_CORE_FET_ODRIVE);

> +}
> +
> +void imx_anatop_pre_suspend(void)

static?

Shawn

> +{
> +	imx_anatop_enable_fet_odrive(true);
> +}
> +
> +void imx_anatop_post_resume(void)
> +{
> +	imx_anatop_enable_fet_odrive(false);
> +}
> +
> +void __init imx_anatop_init(void)
> +{
> +	anatop = syscon_regmap_lookup_by_compatible("fsl,imx6q-anatop");
> +	if (IS_ERR(anatop)) {
> +		pr_err("%s: failed to find imx6q-anatop regmap!\n", __func__);
> +		return;
> +	}
> +}
> diff --git a/arch/arm/mach-imx/common.h b/arch/arm/mach-imx/common.h
> index 5a800bf..004c2b3 100644
> --- a/arch/arm/mach-imx/common.h
> +++ b/arch/arm/mach-imx/common.h
> @@ -129,6 +129,9 @@ extern void imx_src_prepare_restart(void);
>  extern void imx_gpc_init(void);
>  extern void imx_gpc_pre_suspend(void);
>  extern void imx_gpc_post_resume(void);
> +extern void imx_anatop_init(void);
> +extern void imx_anatop_pre_suspend(void);
> +extern void imx_anatop_post_resume(void);
>  extern int imx6q_set_lpm(enum mxc_cpu_pwr_mode mode);
>  extern void imx6q_set_chicken_bit(void);
>  
> diff --git a/arch/arm/mach-imx/mach-imx6q.c b/arch/arm/mach-imx/mach-imx6q.c
> index 9ffd103..aa867db 100644
> --- a/arch/arm/mach-imx/mach-imx6q.c
> +++ b/arch/arm/mach-imx/mach-imx6q.c
> @@ -197,6 +197,7 @@ static void __init imx6q_init_machine(void)
>  
>  	of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
>  
> +	imx_anatop_init();
>  	imx6q_pm_init();
>  	imx6q_usb_init();
>  	imx6q_1588_init();
> diff --git a/arch/arm/mach-imx/pm-imx6q.c b/arch/arm/mach-imx/pm-imx6q.c
> index 5faba7a..05b26cd 100644
> --- a/arch/arm/mach-imx/pm-imx6q.c
> +++ b/arch/arm/mach-imx/pm-imx6q.c
> @@ -34,10 +34,12 @@ static int imx6q_pm_enter(suspend_state_t state)
>  	case PM_SUSPEND_MEM:
>  		imx6q_set_lpm(STOP_POWER_OFF);
>  		imx_gpc_pre_suspend();
> +		imx_anatop_pre_suspend();
>  		imx_set_cpu_jump(0, v7_cpu_resume);
>  		/* Zzz ... */
>  		cpu_suspend(0, imx6q_suspend_finish);
>  		imx_smp_prepare();
> +		imx_anatop_post_resume();
>  		imx_gpc_post_resume();
>  		imx6q_set_lpm(WAIT_CLOCKED);
>  		break;
> -- 
> 1.7.9.5
> 
>
Shawn Guo - March 20, 2013, 7:51 a.m.
On Wed, Mar 20, 2013 at 04:45:54PM -0400, Anson Huang wrote:
> > > +void imx_anatop_pre_suspend(void)
> > 
> > static?
> This function will be called outside this file, so we can NOT use static here.

Sorry, I mistakenly put the comment there.

Shawn
Anson Huang - March 20, 2013, 5:39 p.m.
anatop module have sereval configurations for user
to reduce the power consumption in suspend, provide
suspend/resume interface for further use and enable
fet_odrive to reduce CORE LDO leakage during suspend.

Signed-off-by: Anson Huang <b20788@freescale.com>
---
 arch/arm/mach-imx/Kconfig      |    4 ++++
 arch/arm/mach-imx/Makefile     |    1 +
 arch/arm/mach-imx/anatop.c     |   50 ++++++++++++++++++++++++++++++++++++++++
 arch/arm/mach-imx/common.h     |    3 +++
 arch/arm/mach-imx/mach-imx6q.c |    1 +
 arch/arm/mach-imx/pm-imx6q.c   |    2 ++
 6 files changed, 61 insertions(+)
 create mode 100644 arch/arm/mach-imx/anatop.c
Anson Huang - March 20, 2013, 8:45 p.m.
On Wed, Mar 20, 2013 at 03:29:33PM +0800, Shawn Guo wrote:
> On Wed, Mar 20, 2013 at 01:39:38PM -0400, Anson Huang wrote:
> > anatop module have sereval configurations for user
> > to reduce the power consumption in suspend, provide
> > suspend/resume interface for further use and enable
> > fet_odrive to reduce CORE LDO leakage during suspend.
> > 
> > Signed-off-by: Anson Huang <b20788@freescale.com>
> > ---
> >  arch/arm/mach-imx/Kconfig      |    4 ++++
> >  arch/arm/mach-imx/Makefile     |    1 +
> >  arch/arm/mach-imx/anatop.c     |   50 ++++++++++++++++++++++++++++++++++++++++
> 
> I like the idea of having an anatop.c for all those anatop related
> setup.  Please move those anatop related code in mach-imx6q.c
> into there as well.  Leaving them out there beats the idea of having
> a centralized place for anatop configurations.
will do that in V2.
> 
> >  arch/arm/mach-imx/common.h     |    3 +++
> >  arch/arm/mach-imx/mach-imx6q.c |    1 +
> >  arch/arm/mach-imx/pm-imx6q.c   |    2 ++
> >  6 files changed, 61 insertions(+)
> >  create mode 100644 arch/arm/mach-imx/anatop.c
> > 
> > diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig
> > index 4c9c6f9..7abaa6e 100644
> > --- a/arch/arm/mach-imx/Kconfig
> > +++ b/arch/arm/mach-imx/Kconfig
> > @@ -74,6 +74,9 @@ config HAVE_IMX_MMDC
> >  config HAVE_IMX_SRC
> >  	def_bool y if SMP
> >  
> > +config HAVE_IMX_ANATOP
> > +	bool
> > +
> 
> Please have it added before "config HAVE_IMX_GPC".  We are trying to
> have them sorted in alphabet.
Accepted
> 
> >  config IMX_HAVE_IOMUX_V1
> >  	bool
> >  
> > @@ -816,6 +819,7 @@ config SOC_IMX6Q
> >  	select HAVE_IMX_GPC
> >  	select HAVE_IMX_MMDC
> >  	select HAVE_IMX_SRC
> > +	select HAVE_IMX_ANATOP
> 
> Ditto
Accepted
> 
> >  	select HAVE_SMP
> >  	select MFD_SYSCON
> >  	select PINCTRL
> > diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile
> > index c4ce090..f4badaa 100644
> > --- a/arch/arm/mach-imx/Makefile
> > +++ b/arch/arm/mach-imx/Makefile
> > @@ -95,6 +95,7 @@ obj-$(CONFIG_MACH_VPR200) += mach-vpr200.o
> >  obj-$(CONFIG_HAVE_IMX_GPC) += gpc.o
> >  obj-$(CONFIG_HAVE_IMX_MMDC) += mmdc.o
> >  obj-$(CONFIG_HAVE_IMX_SRC) += src.o
> > +obj-$(CONFIG_HAVE_IMX_ANATOP) += anatop.o
> 
> Ditto
Accepted
> 
> >  AFLAGS_headsmp.o :=-Wa,-march=armv7-a
> >  obj-$(CONFIG_SMP) += headsmp.o platsmp.o
> >  obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o
> > diff --git a/arch/arm/mach-imx/anatop.c b/arch/arm/mach-imx/anatop.c
> > new file mode 100644
> > index 0000000..8f6ab27
> > --- /dev/null
> > +++ b/arch/arm/mach-imx/anatop.c
> > @@ -0,0 +1,50 @@
> > +/*
> > + * Copyright (C) 2013 Freescale Semiconductor, Inc.
> > + *
> > + * The code contained herein is licensed under the GNU General Public
> > + * License. You may obtain a copy of the GNU General Public License
> > + * Version 2 or later at the following locations:
> > + *
> > + * http://www.opensource.org/licenses/gpl-license.html
> > + * http://www.gnu.org/copyleft/gpl.html
> > + */
> > +
> > +#include <linux/err.h>
> > +#include <linux/io.h>
> > +#include <linux/of.h>
> > +#include <linux/of_address.h>
> > +#include <linux/mfd/syscon.h>
> > +#include <linux/regmap.h>
> > +
> > +#define REG_SET		0x4
> > +#define REG_CLR		0x8
> > +#define ANA_REG_CORE	0x140
> 
> The abbreviation ANA is used here ...
> 
> > +
> > +#define BM_ANADIG_REG_CORE_FET_ODRIVE		0x20000000
> 
> ... while "ANADIG" is here.  Please be consistent.
Accepted.
> 
> > +
> > +static struct regmap *anatop;
> > +
> > +void imx_anatop_enable_fet_odrive(bool enable)
> 
> static?
Accepted.
> 
> > +{
> > +	regmap_write(anatop, ANA_REG_CORE + (enable ?
> > +		REG_SET : REG_CLR), BM_ANADIG_REG_CORE_FET_ODRIVE);
> 
> This is a nit, but I think the following indent is nicer for reading.
> 
> 	regmap_write(anatop, ANA_REG_CORE + (enable ? REG_SET : REG_CLR),
> 		     BM_ANADIG_REG_CORE_FET_ODRIVE);
Accepted.
> 
> > +}
> > +
> > +void imx_anatop_pre_suspend(void)
> 
> static?
This function will be called outside this file, so we can NOT use static here.
> 
> Shawn
> 
> > +{
> > +	imx_anatop_enable_fet_odrive(true);
> > +}
> > +
> > +void imx_anatop_post_resume(void)
> > +{
> > +	imx_anatop_enable_fet_odrive(false);
> > +}
> > +
> > +void __init imx_anatop_init(void)
> > +{
> > +	anatop = syscon_regmap_lookup_by_compatible("fsl,imx6q-anatop");
> > +	if (IS_ERR(anatop)) {
> > +		pr_err("%s: failed to find imx6q-anatop regmap!\n", __func__);
> > +		return;
> > +	}
> > +}
> > diff --git a/arch/arm/mach-imx/common.h b/arch/arm/mach-imx/common.h
> > index 5a800bf..004c2b3 100644
> > --- a/arch/arm/mach-imx/common.h
> > +++ b/arch/arm/mach-imx/common.h
> > @@ -129,6 +129,9 @@ extern void imx_src_prepare_restart(void);
> >  extern void imx_gpc_init(void);
> >  extern void imx_gpc_pre_suspend(void);
> >  extern void imx_gpc_post_resume(void);
> > +extern void imx_anatop_init(void);
> > +extern void imx_anatop_pre_suspend(void);
> > +extern void imx_anatop_post_resume(void);
> >  extern int imx6q_set_lpm(enum mxc_cpu_pwr_mode mode);
> >  extern void imx6q_set_chicken_bit(void);
> >  
> > diff --git a/arch/arm/mach-imx/mach-imx6q.c b/arch/arm/mach-imx/mach-imx6q.c
> > index 9ffd103..aa867db 100644
> > --- a/arch/arm/mach-imx/mach-imx6q.c
> > +++ b/arch/arm/mach-imx/mach-imx6q.c
> > @@ -197,6 +197,7 @@ static void __init imx6q_init_machine(void)
> >  
> >  	of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
> >  
> > +	imx_anatop_init();
> >  	imx6q_pm_init();
> >  	imx6q_usb_init();
> >  	imx6q_1588_init();
> > diff --git a/arch/arm/mach-imx/pm-imx6q.c b/arch/arm/mach-imx/pm-imx6q.c
> > index 5faba7a..05b26cd 100644
> > --- a/arch/arm/mach-imx/pm-imx6q.c
> > +++ b/arch/arm/mach-imx/pm-imx6q.c
> > @@ -34,10 +34,12 @@ static int imx6q_pm_enter(suspend_state_t state)
> >  	case PM_SUSPEND_MEM:
> >  		imx6q_set_lpm(STOP_POWER_OFF);
> >  		imx_gpc_pre_suspend();
> > +		imx_anatop_pre_suspend();
> >  		imx_set_cpu_jump(0, v7_cpu_resume);
> >  		/* Zzz ... */
> >  		cpu_suspend(0, imx6q_suspend_finish);
> >  		imx_smp_prepare();
> > +		imx_anatop_post_resume();
> >  		imx_gpc_post_resume();
> >  		imx6q_set_lpm(WAIT_CLOCKED);
> >  		break;
> > -- 
> > 1.7.9.5
> > 
> >

Patch

diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig
index 4c9c6f9..7abaa6e 100644
--- a/arch/arm/mach-imx/Kconfig
+++ b/arch/arm/mach-imx/Kconfig
@@ -74,6 +74,9 @@  config HAVE_IMX_MMDC
 config HAVE_IMX_SRC
 	def_bool y if SMP
 
+config HAVE_IMX_ANATOP
+	bool
+
 config IMX_HAVE_IOMUX_V1
 	bool
 
@@ -816,6 +819,7 @@  config SOC_IMX6Q
 	select HAVE_IMX_GPC
 	select HAVE_IMX_MMDC
 	select HAVE_IMX_SRC
+	select HAVE_IMX_ANATOP
 	select HAVE_SMP
 	select MFD_SYSCON
 	select PINCTRL
diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile
index c4ce090..f4badaa 100644
--- a/arch/arm/mach-imx/Makefile
+++ b/arch/arm/mach-imx/Makefile
@@ -95,6 +95,7 @@  obj-$(CONFIG_MACH_VPR200) += mach-vpr200.o
 obj-$(CONFIG_HAVE_IMX_GPC) += gpc.o
 obj-$(CONFIG_HAVE_IMX_MMDC) += mmdc.o
 obj-$(CONFIG_HAVE_IMX_SRC) += src.o
+obj-$(CONFIG_HAVE_IMX_ANATOP) += anatop.o
 AFLAGS_headsmp.o :=-Wa,-march=armv7-a
 obj-$(CONFIG_SMP) += headsmp.o platsmp.o
 obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o
diff --git a/arch/arm/mach-imx/anatop.c b/arch/arm/mach-imx/anatop.c
new file mode 100644
index 0000000..8f6ab27
--- /dev/null
+++ b/arch/arm/mach-imx/anatop.c
@@ -0,0 +1,50 @@ 
+/*
+ * Copyright (C) 2013 Freescale Semiconductor, Inc.
+ *
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/mfd/syscon.h>
+#include <linux/regmap.h>
+
+#define REG_SET		0x4
+#define REG_CLR		0x8
+#define ANA_REG_CORE	0x140
+
+#define BM_ANADIG_REG_CORE_FET_ODRIVE		0x20000000
+
+static struct regmap *anatop;
+
+void imx_anatop_enable_fet_odrive(bool enable)
+{
+	regmap_write(anatop, ANA_REG_CORE + (enable ?
+		REG_SET : REG_CLR), BM_ANADIG_REG_CORE_FET_ODRIVE);
+}
+
+void imx_anatop_pre_suspend(void)
+{
+	imx_anatop_enable_fet_odrive(true);
+}
+
+void imx_anatop_post_resume(void)
+{
+	imx_anatop_enable_fet_odrive(false);
+}
+
+void __init imx_anatop_init(void)
+{
+	anatop = syscon_regmap_lookup_by_compatible("fsl,imx6q-anatop");
+	if (IS_ERR(anatop)) {
+		pr_err("%s: failed to find imx6q-anatop regmap!\n", __func__);
+		return;
+	}
+}
diff --git a/arch/arm/mach-imx/common.h b/arch/arm/mach-imx/common.h
index 5a800bf..004c2b3 100644
--- a/arch/arm/mach-imx/common.h
+++ b/arch/arm/mach-imx/common.h
@@ -129,6 +129,9 @@  extern void imx_src_prepare_restart(void);
 extern void imx_gpc_init(void);
 extern void imx_gpc_pre_suspend(void);
 extern void imx_gpc_post_resume(void);
+extern void imx_anatop_init(void);
+extern void imx_anatop_pre_suspend(void);
+extern void imx_anatop_post_resume(void);
 extern int imx6q_set_lpm(enum mxc_cpu_pwr_mode mode);
 extern void imx6q_set_chicken_bit(void);
 
diff --git a/arch/arm/mach-imx/mach-imx6q.c b/arch/arm/mach-imx/mach-imx6q.c
index 9ffd103..aa867db 100644
--- a/arch/arm/mach-imx/mach-imx6q.c
+++ b/arch/arm/mach-imx/mach-imx6q.c
@@ -197,6 +197,7 @@  static void __init imx6q_init_machine(void)
 
 	of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
 
+	imx_anatop_init();
 	imx6q_pm_init();
 	imx6q_usb_init();
 	imx6q_1588_init();
diff --git a/arch/arm/mach-imx/pm-imx6q.c b/arch/arm/mach-imx/pm-imx6q.c
index 5faba7a..05b26cd 100644
--- a/arch/arm/mach-imx/pm-imx6q.c
+++ b/arch/arm/mach-imx/pm-imx6q.c
@@ -34,10 +34,12 @@  static int imx6q_pm_enter(suspend_state_t state)
 	case PM_SUSPEND_MEM:
 		imx6q_set_lpm(STOP_POWER_OFF);
 		imx_gpc_pre_suspend();
+		imx_anatop_pre_suspend();
 		imx_set_cpu_jump(0, v7_cpu_resume);
 		/* Zzz ... */
 		cpu_suspend(0, imx6q_suspend_finish);
 		imx_smp_prepare();
+		imx_anatop_post_resume();
 		imx_gpc_post_resume();
 		imx6q_set_lpm(WAIT_CLOCKED);
 		break;