linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/3] at91-3.19: pm fixes
@ 2015-02-05  5:59 Wenyou Yang
  2015-02-05  6:00 ` [PATCH 1/3] pm: at91: pm_slowclock: fix suspend/resume hang up in timeouts Wenyou Yang
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Wenyou Yang @ 2015-02-05  5:59 UTC (permalink / raw)
  To: nicolas.ferre
  Cc: linux, linux, linux-arm-kernel, linux-kernel, sylvain.rochet,
	peda, wenyou.yang

Hi Nicolas,

The patch serial is to fix the pm issue.

It is based on the branch: at91-3.19-fixes
git://git.kernel.org/pub/scm/linux/kernel/git/nferre/linux-at91.git

Peter Rosin (1):
  pm: at91: Workaround DDRSDRC self-refresh bug with LPDDR1 memories.

Sylvain Rochet (2):
  pm: at91: pm_slowclock: fix suspend/resume hang up in timeouts
  pm: at91: pm_slowclock: remove clocks which are already stopped when
    entering slow clock mode

 arch/arm/mach-at91/pm.c            |   12 +++++
 arch/arm/mach-at91/pm_slowclock.S  |  105 ++++++++++++++----------------------
 include/soc/at91/at91sam9_ddrsdr.h |    2 +-
 3 files changed, 54 insertions(+), 65 deletions(-)

-- 
1.7.9.5

Best Regards,
Wenyou Yang

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 1/3] pm: at91: pm_slowclock: fix suspend/resume hang up in timeouts
  2015-02-05  5:59 [PATCH 0/3] at91-3.19: pm fixes Wenyou Yang
@ 2015-02-05  6:00 ` Wenyou Yang
  2015-03-03 18:41   ` Nicolas Ferre
  2015-02-05  6:01 ` [PATCH 2/3] pm: at91: pm_slowclock: remove clocks which are already stopped when entering slow clock mode Wenyou Yang
  2015-02-05  6:02 ` [PATCH 3/3] pm: at91: Workaround DDRSDRC self-refresh bug with LPDDR1 memories Wenyou Yang
  2 siblings, 1 reply; 9+ messages in thread
From: Wenyou Yang @ 2015-02-05  6:00 UTC (permalink / raw)
  To: nicolas.ferre
  Cc: linux, linux, linux-arm-kernel, linux-kernel, sylvain.rochet,
	peda, wenyou.yang

From: Sylvain Rochet <sylvain.rochet@finsecur.com>

Removed timeout on XTAL, PLL lock and Master Clock Ready, hang if
something went wrong instead of continuing in unknown condition. There
is not much we can do if a PLL lock never ends, we are running in SRAM
and we will not be able to connect back the sdram or ddram in order to
be able to fire up a message or just panic.

As a bonus, not decounting the timeout register in slow clock mode
reduce cumulated suspend time and resume time from ~17ms to ~15ms.

Signed-off-by: Sylvain Rochet <sylvain.rochet@finsecur.com>
Acked-by: Wenyou.Yang <wenyou.yang@atmel.com>
---
 arch/arm/mach-at91/pm_slowclock.S |   33 ++++-----------------------------
 1 file changed, 4 insertions(+), 29 deletions(-)

diff --git a/arch/arm/mach-at91/pm_slowclock.S b/arch/arm/mach-at91/pm_slowclock.S
index 2001877..79dfdbe 100644
--- a/arch/arm/mach-at91/pm_slowclock.S
+++ b/arch/arm/mach-at91/pm_slowclock.S
@@ -34,11 +34,6 @@
  */
 #undef SLOWDOWN_MASTER_CLOCK
 
-#define MCKRDY_TIMEOUT		1000
-#define MOSCRDY_TIMEOUT 	1000
-#define PLLALOCK_TIMEOUT	1000
-#define PLLBLOCK_TIMEOUT	1000
-
 pmc	.req	r0
 sdramc	.req	r1
 ramc1	.req	r2
@@ -50,56 +45,36 @@ tmp2	.req	r5
  * Wait until master clock is ready (after switching master clock source)
  */
 	.macro wait_mckrdy
-	mov	tmp2, #MCKRDY_TIMEOUT
-1:	sub	tmp2, tmp2, #1
-	cmp	tmp2, #0
-	beq	2f
-	ldr	tmp1, [pmc, #AT91_PMC_SR]
+1:	ldr	tmp1, [pmc, #AT91_PMC_SR]
 	tst	tmp1, #AT91_PMC_MCKRDY
 	beq	1b
-2:
 	.endm
 
 /*
  * Wait until master oscillator has stabilized.
  */
 	.macro wait_moscrdy
-	mov	tmp2, #MOSCRDY_TIMEOUT
-1:	sub	tmp2, tmp2, #1
-	cmp	tmp2, #0
-	beq	2f
-	ldr	tmp1, [pmc, #AT91_PMC_SR]
+1:	ldr	tmp1, [pmc, #AT91_PMC_SR]
 	tst	tmp1, #AT91_PMC_MOSCS
 	beq	1b
-2:
 	.endm
 
 /*
  * Wait until PLLA has locked.
  */
 	.macro wait_pllalock
-	mov	tmp2, #PLLALOCK_TIMEOUT
-1:	sub	tmp2, tmp2, #1
-	cmp	tmp2, #0
-	beq	2f
-	ldr	tmp1, [pmc, #AT91_PMC_SR]
+1:	ldr	tmp1, [pmc, #AT91_PMC_SR]
 	tst	tmp1, #AT91_PMC_LOCKA
 	beq	1b
-2:
 	.endm
 
 /*
  * Wait until PLLB has locked.
  */
 	.macro wait_pllblock
-	mov	tmp2, #PLLBLOCK_TIMEOUT
-1:	sub	tmp2, tmp2, #1
-	cmp	tmp2, #0
-	beq	2f
-	ldr	tmp1, [pmc, #AT91_PMC_SR]
+1:	ldr	tmp1, [pmc, #AT91_PMC_SR]
 	tst	tmp1, #AT91_PMC_LOCKB
 	beq	1b
-2:
 	.endm
 
 	.text
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 2/3] pm: at91: pm_slowclock: remove clocks which are already stopped when entering slow clock mode
  2015-02-05  5:59 [PATCH 0/3] at91-3.19: pm fixes Wenyou Yang
  2015-02-05  6:00 ` [PATCH 1/3] pm: at91: pm_slowclock: fix suspend/resume hang up in timeouts Wenyou Yang
@ 2015-02-05  6:01 ` Wenyou Yang
  2015-03-03 18:42   ` Nicolas Ferre
  2015-02-05  6:02 ` [PATCH 3/3] pm: at91: Workaround DDRSDRC self-refresh bug with LPDDR1 memories Wenyou Yang
  2 siblings, 1 reply; 9+ messages in thread
From: Wenyou Yang @ 2015-02-05  6:01 UTC (permalink / raw)
  To: nicolas.ferre
  Cc: linux, linux, linux-arm-kernel, linux-kernel, sylvain.rochet,
	peda, wenyou.yang

From: Sylvain Rochet <sylvain.rochet@finsecur.com>

Assume USB PLL and PLL B are already stopped before entering sleep mode,
print a warning if this isn't the case.

Removed PLL B from slow clock code, all drivers are supposed to properly
unprepare clocks.

Signed-off-by: Sylvain Rochet <sylvain.rochet@finsecur.com>
Acked-by: Wenyou.Yang <wenyou.yang@atmel.com>
---
 arch/arm/mach-at91/pm.c           |   12 ++++++++++++
 arch/arm/mach-at91/pm_slowclock.S |   31 -------------------------------
 2 files changed, 12 insertions(+), 31 deletions(-)

diff --git a/arch/arm/mach-at91/pm.c b/arch/arm/mach-at91/pm.c
index 9b15169..1cfd6e9 100644
--- a/arch/arm/mach-at91/pm.c
+++ b/arch/arm/mach-at91/pm.c
@@ -98,6 +98,18 @@ static int at91_pm_verify_clocks(void)
 		}
 	}
 
+	/* Drivers should have previously suspended USB PLL */
+	if (at91_pmc_read(AT91_CKGR_UCKR) & AT91_PMC_UPLLEN) {
+		pr_err("AT91: PM - Suspend-to-RAM with USB PLL running\n");
+		return 0;
+	}
+
+	/* Drivers should have previously suspended PLL B */
+	if (at91_pmc_read(AT91_PMC_SR) & AT91_PMC_LOCKB) {
+		pr_err("AT91: PM - Suspend-to-RAM with PLL B running\n");
+		return 0;
+	}
+
 	return 1;
 }
 
diff --git a/arch/arm/mach-at91/pm_slowclock.S b/arch/arm/mach-at91/pm_slowclock.S
index 79dfdbe..75d8b19 100644
--- a/arch/arm/mach-at91/pm_slowclock.S
+++ b/arch/arm/mach-at91/pm_slowclock.S
@@ -68,15 +68,6 @@ tmp2	.req	r5
 	beq	1b
 	.endm
 
-/*
- * Wait until PLLB has locked.
- */
-	.macro wait_pllblock
-1:	ldr	tmp1, [pmc, #AT91_PMC_SR]
-	tst	tmp1, #AT91_PMC_LOCKB
-	beq	1b
-	.endm
-
 	.text
 
 /* void at91_slow_clock(void __iomem *pmc, void __iomem *sdramc,
@@ -182,13 +173,6 @@ sdr_sr_done:
 	orr	tmp1, tmp1, #(1 << 29)		/* bit 29 always set */
 	str	tmp1, [pmc, #AT91_CKGR_PLLAR]
 
-	/* Save PLLB setting and disable it */
-	ldr	tmp1, [pmc, #AT91_CKGR_PLLBR]
-	str	tmp1, .saved_pllbr
-
-	mov	tmp1, #AT91_PMC_PLLCOUNT
-	str	tmp1, [pmc, #AT91_CKGR_PLLBR]
-
 	/* Turn off the main oscillator */
 	ldr	tmp1, [pmc, #AT91_CKGR_MOR]
 	bic	tmp1, tmp1, #AT91_PMC_MOSCEN
@@ -204,18 +188,6 @@ sdr_sr_done:
 
 	wait_moscrdy
 
-	/* Restore PLLB setting */
-	ldr	tmp1, .saved_pllbr
-	str	tmp1, [pmc, #AT91_CKGR_PLLBR]
-
-	tst	tmp1, #(AT91_PMC_MUL &  0xff0000)
-	bne	1f
-	tst	tmp1, #(AT91_PMC_MUL & ~0xff0000)
-	beq	2f
-1:
-	wait_pllblock
-2:
-
 	/* Restore PLLA setting */
 	ldr	tmp1, .saved_pllar
 	str	tmp1, [pmc, #AT91_CKGR_PLLAR]
@@ -294,9 +266,6 @@ ram_restored:
 .saved_pllar:
 	.word 0
 
-.saved_pllbr:
-	.word 0
-
 .saved_sam9_lpr:
 	.word 0
 
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 3/3] pm: at91: Workaround DDRSDRC self-refresh bug with LPDDR1 memories.
  2015-02-05  5:59 [PATCH 0/3] at91-3.19: pm fixes Wenyou Yang
  2015-02-05  6:00 ` [PATCH 1/3] pm: at91: pm_slowclock: fix suspend/resume hang up in timeouts Wenyou Yang
  2015-02-05  6:01 ` [PATCH 2/3] pm: at91: pm_slowclock: remove clocks which are already stopped when entering slow clock mode Wenyou Yang
@ 2015-02-05  6:02 ` Wenyou Yang
  2015-03-03 18:41   ` Nicolas Ferre
  2 siblings, 1 reply; 9+ messages in thread
From: Wenyou Yang @ 2015-02-05  6:02 UTC (permalink / raw)
  To: nicolas.ferre
  Cc: linux, linux, linux-arm-kernel, linux-kernel, sylvain.rochet,
	peda, wenyou.yang

From: Peter Rosin <peda@axentia.se>

The DDRSDR controller fails miserably to put LPDDR1 memories in
self-refresh. Force the controller to think it has DDR2 memories
during the self-refresh period, as the DDR2 self-refresh spec is
equivalent to LPDDR1, and is correctly implemented in the
controller.

Assume that the second controller has the same fault, but that is
untested.

Signed-off-by: Peter Rosin <peda@axentia.se>
Acked-by: Nicolas Ferre <nicolas.ferre@atmel.com>
---
 arch/arm/mach-at91/pm_slowclock.S  |   43 +++++++++++++++++++++++++++++++-----
 include/soc/at91/at91sam9_ddrsdr.h |    2 +-
 2 files changed, 39 insertions(+), 6 deletions(-)

diff --git a/arch/arm/mach-at91/pm_slowclock.S b/arch/arm/mach-at91/pm_slowclock.S
index 75d8b19..487ae1e 100644
--- a/arch/arm/mach-at91/pm_slowclock.S
+++ b/arch/arm/mach-at91/pm_slowclock.S
@@ -109,6 +109,16 @@ ddr_sr_enable:
 	cmp	memctrl, #AT91_MEMCTRL_DDRSDR
 	bne	sdr_sr_enable
 
+	/* LPDDR1 --> force DDR2 mode during self-refresh */
+	ldr	tmp1, [sdramc, #AT91_DDRSDRC_MDR]
+	str	tmp1, .saved_sam9_mdr
+	bic	tmp1, tmp1, #~AT91_DDRSDRC_MD
+	cmp	tmp1, #AT91_DDRSDRC_MD_LOW_POWER_DDR
+	ldreq	tmp1, [sdramc, #AT91_DDRSDRC_MDR]
+	biceq	tmp1, tmp1, #AT91_DDRSDRC_MD
+	orreq	tmp1, tmp1, #AT91_DDRSDRC_MD_DDR2
+	streq	tmp1, [sdramc, #AT91_DDRSDRC_MDR]
+
 	/* prepare for DDRAM self-refresh mode */
 	ldr	tmp1, [sdramc, #AT91_DDRSDRC_LPR]
 	str	tmp1, .saved_sam9_lpr
@@ -117,14 +127,26 @@ ddr_sr_enable:
 
 	/* figure out if we use the second ram controller */
 	cmp	ramc1, #0
-	ldrne	tmp2, [ramc1, #AT91_DDRSDRC_LPR]
-	strne	tmp2, .saved_sam9_lpr1
-	bicne	tmp2, #AT91_DDRSDRC_LPCB
-	orrne	tmp2, #AT91_DDRSDRC_LPCB_SELF_REFRESH
+	beq	ddr_no_2nd_ctrl
+
+	ldr	tmp2, [ramc1, #AT91_DDRSDRC_MDR]
+	str	tmp2, .saved_sam9_mdr1
+	bic	tmp2, tmp2, #~AT91_DDRSDRC_MD
+	cmp	tmp2, #AT91_DDRSDRC_MD_LOW_POWER_DDR
+	ldreq	tmp2, [ramc1, #AT91_DDRSDRC_MDR]
+	biceq	tmp2, tmp2, #AT91_DDRSDRC_MD
+	orreq	tmp2, tmp2, #AT91_DDRSDRC_MD_DDR2
+	streq	tmp2, [ramc1, #AT91_DDRSDRC_MDR]
+
+	ldr	tmp2, [ramc1, #AT91_DDRSDRC_LPR]
+	str	tmp2, .saved_sam9_lpr1
+	bic	tmp2, #AT91_DDRSDRC_LPCB
+	orr	tmp2, #AT91_DDRSDRC_LPCB_SELF_REFRESH
 
 	/* Enable DDRAM self-refresh mode */
+	str	tmp2, [ramc1, #AT91_DDRSDRC_LPR]
+ddr_no_2nd_ctrl:
 	str	tmp1, [sdramc, #AT91_DDRSDRC_LPR]
-	strne	tmp2, [ramc1, #AT91_DDRSDRC_LPR]
 
 	b	sdr_sr_done
 
@@ -236,12 +258,17 @@ sdr_sr_done:
 	 */
 	cmp	memctrl, #AT91_MEMCTRL_DDRSDR
 	bne	sdr_en_restore
+	/* Restore MDR in case of LPDDR1 */
+	ldr	tmp1, .saved_sam9_mdr
+	str	tmp1, [sdramc, #AT91_DDRSDRC_MDR]
 	/* Restore LPR on AT91 with DDRAM */
 	ldr	tmp1, .saved_sam9_lpr
 	str	tmp1, [sdramc, #AT91_DDRSDRC_LPR]
 
 	/* if we use the second ram controller */
 	cmp	ramc1, #0
+	ldrne	tmp2, .saved_sam9_mdr1
+	strne	tmp2, [ramc1, #AT91_DDRSDRC_MDR]
 	ldrne	tmp2, .saved_sam9_lpr1
 	strne	tmp2, [ramc1, #AT91_DDRSDRC_LPR]
 
@@ -272,5 +299,11 @@ ram_restored:
 .saved_sam9_lpr1:
 	.word 0
 
+.saved_sam9_mdr:
+	.word 0
+
+.saved_sam9_mdr1:
+	.word 0
+
 ENTRY(at91_slow_clock_sz)
 	.word .-at91_slow_clock
diff --git a/include/soc/at91/at91sam9_ddrsdr.h b/include/soc/at91/at91sam9_ddrsdr.h
index 0210797..dc10c52 100644
--- a/include/soc/at91/at91sam9_ddrsdr.h
+++ b/include/soc/at91/at91sam9_ddrsdr.h
@@ -92,7 +92,7 @@
 #define		AT91_DDRSDRC_UPD_MR	(3 << 20)	 /* Update load mode register and extended mode register */
 
 #define AT91_DDRSDRC_MDR	0x20	/* Memory Device Register */
-#define		AT91_DDRSDRC_MD		(3 << 0)		/* Memory Device Type */
+#define		AT91_DDRSDRC_MD		(7 << 0)	/* Memory Device Type */
 #define			AT91_DDRSDRC_MD_SDR		0
 #define			AT91_DDRSDRC_MD_LOW_POWER_SDR	1
 #define			AT91_DDRSDRC_MD_LOW_POWER_DDR	3
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/3] pm: at91: pm_slowclock: fix suspend/resume hang up in timeouts
  2015-02-05  6:00 ` [PATCH 1/3] pm: at91: pm_slowclock: fix suspend/resume hang up in timeouts Wenyou Yang
@ 2015-03-03 18:41   ` Nicolas Ferre
  0 siblings, 0 replies; 9+ messages in thread
From: Nicolas Ferre @ 2015-03-03 18:41 UTC (permalink / raw)
  To: Wenyou Yang
  Cc: linux, linux, linux-arm-kernel, linux-kernel, sylvain.rochet, peda

Le 05/02/2015 07:00, Wenyou Yang a écrit :
> From: Sylvain Rochet <sylvain.rochet@finsecur.com>
> 
> Removed timeout on XTAL, PLL lock and Master Clock Ready, hang if
> something went wrong instead of continuing in unknown condition. There
> is not much we can do if a PLL lock never ends, we are running in SRAM
> and we will not be able to connect back the sdram or ddram in order to
> be able to fire up a message or just panic.
> 
> As a bonus, not decounting the timeout register in slow clock mode
> reduce cumulated suspend time and resume time from ~17ms to ~15ms.
> 
> Signed-off-by: Sylvain Rochet <sylvain.rochet@finsecur.com>
> Acked-by: Wenyou.Yang <wenyou.yang@atmel.com>

Acked-by: Nicolas Ferre <nicolas.ferre@atmel.com>

and stacked in at91-4.0-fixes.
thanks!

> ---
>  arch/arm/mach-at91/pm_slowclock.S |   33 ++++-----------------------------
>  1 file changed, 4 insertions(+), 29 deletions(-)
> 
> diff --git a/arch/arm/mach-at91/pm_slowclock.S b/arch/arm/mach-at91/pm_slowclock.S
> index 2001877..79dfdbe 100644
> --- a/arch/arm/mach-at91/pm_slowclock.S
> +++ b/arch/arm/mach-at91/pm_slowclock.S
> @@ -34,11 +34,6 @@
>   */
>  #undef SLOWDOWN_MASTER_CLOCK
>  
> -#define MCKRDY_TIMEOUT		1000
> -#define MOSCRDY_TIMEOUT 	1000
> -#define PLLALOCK_TIMEOUT	1000
> -#define PLLBLOCK_TIMEOUT	1000
> -
>  pmc	.req	r0
>  sdramc	.req	r1
>  ramc1	.req	r2
> @@ -50,56 +45,36 @@ tmp2	.req	r5
>   * Wait until master clock is ready (after switching master clock source)
>   */
>  	.macro wait_mckrdy
> -	mov	tmp2, #MCKRDY_TIMEOUT
> -1:	sub	tmp2, tmp2, #1
> -	cmp	tmp2, #0
> -	beq	2f
> -	ldr	tmp1, [pmc, #AT91_PMC_SR]
> +1:	ldr	tmp1, [pmc, #AT91_PMC_SR]
>  	tst	tmp1, #AT91_PMC_MCKRDY
>  	beq	1b
> -2:
>  	.endm
>  
>  /*
>   * Wait until master oscillator has stabilized.
>   */
>  	.macro wait_moscrdy
> -	mov	tmp2, #MOSCRDY_TIMEOUT
> -1:	sub	tmp2, tmp2, #1
> -	cmp	tmp2, #0
> -	beq	2f
> -	ldr	tmp1, [pmc, #AT91_PMC_SR]
> +1:	ldr	tmp1, [pmc, #AT91_PMC_SR]
>  	tst	tmp1, #AT91_PMC_MOSCS
>  	beq	1b
> -2:
>  	.endm
>  
>  /*
>   * Wait until PLLA has locked.
>   */
>  	.macro wait_pllalock
> -	mov	tmp2, #PLLALOCK_TIMEOUT
> -1:	sub	tmp2, tmp2, #1
> -	cmp	tmp2, #0
> -	beq	2f
> -	ldr	tmp1, [pmc, #AT91_PMC_SR]
> +1:	ldr	tmp1, [pmc, #AT91_PMC_SR]
>  	tst	tmp1, #AT91_PMC_LOCKA
>  	beq	1b
> -2:
>  	.endm
>  
>  /*
>   * Wait until PLLB has locked.
>   */
>  	.macro wait_pllblock
> -	mov	tmp2, #PLLBLOCK_TIMEOUT
> -1:	sub	tmp2, tmp2, #1
> -	cmp	tmp2, #0
> -	beq	2f
> -	ldr	tmp1, [pmc, #AT91_PMC_SR]
> +1:	ldr	tmp1, [pmc, #AT91_PMC_SR]
>  	tst	tmp1, #AT91_PMC_LOCKB
>  	beq	1b
> -2:
>  	.endm
>  
>  	.text
> 


-- 
Nicolas Ferre

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 3/3] pm: at91: Workaround DDRSDRC self-refresh bug with LPDDR1 memories.
  2015-02-05  6:02 ` [PATCH 3/3] pm: at91: Workaround DDRSDRC self-refresh bug with LPDDR1 memories Wenyou Yang
@ 2015-03-03 18:41   ` Nicolas Ferre
  0 siblings, 0 replies; 9+ messages in thread
From: Nicolas Ferre @ 2015-03-03 18:41 UTC (permalink / raw)
  To: Wenyou Yang
  Cc: linux, linux, linux-arm-kernel, linux-kernel, sylvain.rochet, peda

Le 05/02/2015 07:02, Wenyou Yang a écrit :
> From: Peter Rosin <peda@axentia.se>
> 
> The DDRSDR controller fails miserably to put LPDDR1 memories in
> self-refresh. Force the controller to think it has DDR2 memories
> during the self-refresh period, as the DDR2 self-refresh spec is
> equivalent to LPDDR1, and is correctly implemented in the
> controller.
> 
> Assume that the second controller has the same fault, but that is
> untested.
> 
> Signed-off-by: Peter Rosin <peda@axentia.se>
> Acked-by: Nicolas Ferre <nicolas.ferre@atmel.com>

Stacked in at91-4.0-fixes.

Bye,


> ---
>  arch/arm/mach-at91/pm_slowclock.S  |   43 +++++++++++++++++++++++++++++++-----
>  include/soc/at91/at91sam9_ddrsdr.h |    2 +-
>  2 files changed, 39 insertions(+), 6 deletions(-)
> 
> diff --git a/arch/arm/mach-at91/pm_slowclock.S b/arch/arm/mach-at91/pm_slowclock.S
> index 75d8b19..487ae1e 100644
> --- a/arch/arm/mach-at91/pm_slowclock.S
> +++ b/arch/arm/mach-at91/pm_slowclock.S
> @@ -109,6 +109,16 @@ ddr_sr_enable:
>  	cmp	memctrl, #AT91_MEMCTRL_DDRSDR
>  	bne	sdr_sr_enable
>  
> +	/* LPDDR1 --> force DDR2 mode during self-refresh */
> +	ldr	tmp1, [sdramc, #AT91_DDRSDRC_MDR]
> +	str	tmp1, .saved_sam9_mdr
> +	bic	tmp1, tmp1, #~AT91_DDRSDRC_MD
> +	cmp	tmp1, #AT91_DDRSDRC_MD_LOW_POWER_DDR
> +	ldreq	tmp1, [sdramc, #AT91_DDRSDRC_MDR]
> +	biceq	tmp1, tmp1, #AT91_DDRSDRC_MD
> +	orreq	tmp1, tmp1, #AT91_DDRSDRC_MD_DDR2
> +	streq	tmp1, [sdramc, #AT91_DDRSDRC_MDR]
> +
>  	/* prepare for DDRAM self-refresh mode */
>  	ldr	tmp1, [sdramc, #AT91_DDRSDRC_LPR]
>  	str	tmp1, .saved_sam9_lpr
> @@ -117,14 +127,26 @@ ddr_sr_enable:
>  
>  	/* figure out if we use the second ram controller */
>  	cmp	ramc1, #0
> -	ldrne	tmp2, [ramc1, #AT91_DDRSDRC_LPR]
> -	strne	tmp2, .saved_sam9_lpr1
> -	bicne	tmp2, #AT91_DDRSDRC_LPCB
> -	orrne	tmp2, #AT91_DDRSDRC_LPCB_SELF_REFRESH
> +	beq	ddr_no_2nd_ctrl
> +
> +	ldr	tmp2, [ramc1, #AT91_DDRSDRC_MDR]
> +	str	tmp2, .saved_sam9_mdr1
> +	bic	tmp2, tmp2, #~AT91_DDRSDRC_MD
> +	cmp	tmp2, #AT91_DDRSDRC_MD_LOW_POWER_DDR
> +	ldreq	tmp2, [ramc1, #AT91_DDRSDRC_MDR]
> +	biceq	tmp2, tmp2, #AT91_DDRSDRC_MD
> +	orreq	tmp2, tmp2, #AT91_DDRSDRC_MD_DDR2
> +	streq	tmp2, [ramc1, #AT91_DDRSDRC_MDR]
> +
> +	ldr	tmp2, [ramc1, #AT91_DDRSDRC_LPR]
> +	str	tmp2, .saved_sam9_lpr1
> +	bic	tmp2, #AT91_DDRSDRC_LPCB
> +	orr	tmp2, #AT91_DDRSDRC_LPCB_SELF_REFRESH
>  
>  	/* Enable DDRAM self-refresh mode */
> +	str	tmp2, [ramc1, #AT91_DDRSDRC_LPR]
> +ddr_no_2nd_ctrl:
>  	str	tmp1, [sdramc, #AT91_DDRSDRC_LPR]
> -	strne	tmp2, [ramc1, #AT91_DDRSDRC_LPR]
>  
>  	b	sdr_sr_done
>  
> @@ -236,12 +258,17 @@ sdr_sr_done:
>  	 */
>  	cmp	memctrl, #AT91_MEMCTRL_DDRSDR
>  	bne	sdr_en_restore
> +	/* Restore MDR in case of LPDDR1 */
> +	ldr	tmp1, .saved_sam9_mdr
> +	str	tmp1, [sdramc, #AT91_DDRSDRC_MDR]
>  	/* Restore LPR on AT91 with DDRAM */
>  	ldr	tmp1, .saved_sam9_lpr
>  	str	tmp1, [sdramc, #AT91_DDRSDRC_LPR]
>  
>  	/* if we use the second ram controller */
>  	cmp	ramc1, #0
> +	ldrne	tmp2, .saved_sam9_mdr1
> +	strne	tmp2, [ramc1, #AT91_DDRSDRC_MDR]
>  	ldrne	tmp2, .saved_sam9_lpr1
>  	strne	tmp2, [ramc1, #AT91_DDRSDRC_LPR]
>  
> @@ -272,5 +299,11 @@ ram_restored:
>  .saved_sam9_lpr1:
>  	.word 0
>  
> +.saved_sam9_mdr:
> +	.word 0
> +
> +.saved_sam9_mdr1:
> +	.word 0
> +
>  ENTRY(at91_slow_clock_sz)
>  	.word .-at91_slow_clock
> diff --git a/include/soc/at91/at91sam9_ddrsdr.h b/include/soc/at91/at91sam9_ddrsdr.h
> index 0210797..dc10c52 100644
> --- a/include/soc/at91/at91sam9_ddrsdr.h
> +++ b/include/soc/at91/at91sam9_ddrsdr.h
> @@ -92,7 +92,7 @@
>  #define		AT91_DDRSDRC_UPD_MR	(3 << 20)	 /* Update load mode register and extended mode register */
>  
>  #define AT91_DDRSDRC_MDR	0x20	/* Memory Device Register */
> -#define		AT91_DDRSDRC_MD		(3 << 0)		/* Memory Device Type */
> +#define		AT91_DDRSDRC_MD		(7 << 0)	/* Memory Device Type */
>  #define			AT91_DDRSDRC_MD_SDR		0
>  #define			AT91_DDRSDRC_MD_LOW_POWER_SDR	1
>  #define			AT91_DDRSDRC_MD_LOW_POWER_DDR	3
> 


-- 
Nicolas Ferre

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2/3] pm: at91: pm_slowclock: remove clocks which are already stopped when entering slow clock mode
  2015-02-05  6:01 ` [PATCH 2/3] pm: at91: pm_slowclock: remove clocks which are already stopped when entering slow clock mode Wenyou Yang
@ 2015-03-03 18:42   ` Nicolas Ferre
  2015-03-03 22:50     ` Sylvain Rochet
  0 siblings, 1 reply; 9+ messages in thread
From: Nicolas Ferre @ 2015-03-03 18:42 UTC (permalink / raw)
  To: Wenyou Yang
  Cc: linux, linux, linux-arm-kernel, linux-kernel, sylvain.rochet, peda

Le 05/02/2015 07:01, Wenyou Yang a écrit :
> From: Sylvain Rochet <sylvain.rochet@finsecur.com>
> 
> Assume USB PLL and PLL B are already stopped before entering sleep mode,
> print a warning if this isn't the case.
> 
> Removed PLL B from slow clock code, all drivers are supposed to properly
> unprepare clocks.
> 
> Signed-off-by: Sylvain Rochet <sylvain.rochet@finsecur.com>
> Acked-by: Wenyou.Yang <wenyou.yang@atmel.com>

I keep this one for 4.1 as all the USB drivers are not converted yet.

Bye,


> ---
>  arch/arm/mach-at91/pm.c           |   12 ++++++++++++
>  arch/arm/mach-at91/pm_slowclock.S |   31 -------------------------------
>  2 files changed, 12 insertions(+), 31 deletions(-)
> 
> diff --git a/arch/arm/mach-at91/pm.c b/arch/arm/mach-at91/pm.c
> index 9b15169..1cfd6e9 100644
> --- a/arch/arm/mach-at91/pm.c
> +++ b/arch/arm/mach-at91/pm.c
> @@ -98,6 +98,18 @@ static int at91_pm_verify_clocks(void)
>  		}
>  	}
>  
> +	/* Drivers should have previously suspended USB PLL */
> +	if (at91_pmc_read(AT91_CKGR_UCKR) & AT91_PMC_UPLLEN) {
> +		pr_err("AT91: PM - Suspend-to-RAM with USB PLL running\n");
> +		return 0;
> +	}
> +
> +	/* Drivers should have previously suspended PLL B */
> +	if (at91_pmc_read(AT91_PMC_SR) & AT91_PMC_LOCKB) {
> +		pr_err("AT91: PM - Suspend-to-RAM with PLL B running\n");
> +		return 0;
> +	}
> +
>  	return 1;
>  }
>  
> diff --git a/arch/arm/mach-at91/pm_slowclock.S b/arch/arm/mach-at91/pm_slowclock.S
> index 79dfdbe..75d8b19 100644
> --- a/arch/arm/mach-at91/pm_slowclock.S
> +++ b/arch/arm/mach-at91/pm_slowclock.S
> @@ -68,15 +68,6 @@ tmp2	.req	r5
>  	beq	1b
>  	.endm
>  
> -/*
> - * Wait until PLLB has locked.
> - */
> -	.macro wait_pllblock
> -1:	ldr	tmp1, [pmc, #AT91_PMC_SR]
> -	tst	tmp1, #AT91_PMC_LOCKB
> -	beq	1b
> -	.endm
> -
>  	.text
>  
>  /* void at91_slow_clock(void __iomem *pmc, void __iomem *sdramc,
> @@ -182,13 +173,6 @@ sdr_sr_done:
>  	orr	tmp1, tmp1, #(1 << 29)		/* bit 29 always set */
>  	str	tmp1, [pmc, #AT91_CKGR_PLLAR]
>  
> -	/* Save PLLB setting and disable it */
> -	ldr	tmp1, [pmc, #AT91_CKGR_PLLBR]
> -	str	tmp1, .saved_pllbr
> -
> -	mov	tmp1, #AT91_PMC_PLLCOUNT
> -	str	tmp1, [pmc, #AT91_CKGR_PLLBR]
> -
>  	/* Turn off the main oscillator */
>  	ldr	tmp1, [pmc, #AT91_CKGR_MOR]
>  	bic	tmp1, tmp1, #AT91_PMC_MOSCEN
> @@ -204,18 +188,6 @@ sdr_sr_done:
>  
>  	wait_moscrdy
>  
> -	/* Restore PLLB setting */
> -	ldr	tmp1, .saved_pllbr
> -	str	tmp1, [pmc, #AT91_CKGR_PLLBR]
> -
> -	tst	tmp1, #(AT91_PMC_MUL &  0xff0000)
> -	bne	1f
> -	tst	tmp1, #(AT91_PMC_MUL & ~0xff0000)
> -	beq	2f
> -1:
> -	wait_pllblock
> -2:
> -
>  	/* Restore PLLA setting */
>  	ldr	tmp1, .saved_pllar
>  	str	tmp1, [pmc, #AT91_CKGR_PLLAR]
> @@ -294,9 +266,6 @@ ram_restored:
>  .saved_pllar:
>  	.word 0
>  
> -.saved_pllbr:
> -	.word 0
> -
>  .saved_sam9_lpr:
>  	.word 0
>  
> 


-- 
Nicolas Ferre

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2/3] pm: at91: pm_slowclock: remove clocks which are already stopped when entering slow clock mode
  2015-03-03 18:42   ` Nicolas Ferre
@ 2015-03-03 22:50     ` Sylvain Rochet
  2015-03-12 15:37       ` Nicolas Ferre
  0 siblings, 1 reply; 9+ messages in thread
From: Sylvain Rochet @ 2015-03-03 22:50 UTC (permalink / raw)
  To: Nicolas Ferre
  Cc: Wenyou Yang, linux, linux, linux-arm-kernel, linux-kernel, peda

Hello Nicolas,

On Tue, Mar 03, 2015 at 07:42:26PM +0100, Nicolas Ferre wrote:
> Le 05/02/2015 07:01, Wenyou Yang a écrit :
> > From: Sylvain Rochet <sylvain.rochet@finsecur.com>
> > 
> > Assume USB PLL and PLL B are already stopped before entering sleep mode,
> > print a warning if this isn't the case.
> > 
> > Removed PLL B from slow clock code, all drivers are supposed to properly
> > unprepare clocks.
> > 
> > Signed-off-by: Sylvain Rochet <sylvain.rochet@finsecur.com>
> > Acked-by: Wenyou.Yang <wenyou.yang@atmel.com>
> 
> I keep this one for 4.1 as all the USB drivers are not converted yet.

I agree we should wait to prevent a regression, in case you missed that 
I sent a v7 of my USBA PM support a few weeks ago (ping ;-).

Sylvain

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2/3] pm: at91: pm_slowclock: remove clocks which are already stopped when entering slow clock mode
  2015-03-03 22:50     ` Sylvain Rochet
@ 2015-03-12 15:37       ` Nicolas Ferre
  0 siblings, 0 replies; 9+ messages in thread
From: Nicolas Ferre @ 2015-03-12 15:37 UTC (permalink / raw)
  To: Sylvain Rochet
  Cc: Wenyou Yang, linux, linux, linux-arm-kernel, linux-kernel, peda

Le 03/03/2015 23:50, Sylvain Rochet a écrit :
> Hello Nicolas,
> 
> On Tue, Mar 03, 2015 at 07:42:26PM +0100, Nicolas Ferre wrote:
>> Le 05/02/2015 07:01, Wenyou Yang a écrit :
>>> From: Sylvain Rochet <sylvain.rochet@finsecur.com>
>>>
>>> Assume USB PLL and PLL B are already stopped before entering sleep mode,
>>> print a warning if this isn't the case.
>>>
>>> Removed PLL B from slow clock code, all drivers are supposed to properly
>>> unprepare clocks.
>>>
>>> Signed-off-by: Sylvain Rochet <sylvain.rochet@finsecur.com>
>>> Acked-by: Wenyou.Yang <wenyou.yang@atmel.com>
>>
>> I keep this one for 4.1 as all the USB drivers are not converted yet.
> 
> I agree we should wait to prevent a regression, in case you missed that 
> I sent a v7 of my USBA PM support a few weeks ago (ping ;-).
> 

Sylvain, your series are in linux-next so I take this patch for 4.1 in
at91-4.1-cleanup with my:

Acked-by: Nicolas Ferre <nicolas.ferre@atmel.com>

But... I remove the arch/arm/mach-at91/pm.c part of this patch as it is
not really needed and adds a too strong dependency on the PMC in an
unrelated file...

Bye,
-- 
Nicolas Ferre

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2015-03-12 15:38 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-02-05  5:59 [PATCH 0/3] at91-3.19: pm fixes Wenyou Yang
2015-02-05  6:00 ` [PATCH 1/3] pm: at91: pm_slowclock: fix suspend/resume hang up in timeouts Wenyou Yang
2015-03-03 18:41   ` Nicolas Ferre
2015-02-05  6:01 ` [PATCH 2/3] pm: at91: pm_slowclock: remove clocks which are already stopped when entering slow clock mode Wenyou Yang
2015-03-03 18:42   ` Nicolas Ferre
2015-03-03 22:50     ` Sylvain Rochet
2015-03-12 15:37       ` Nicolas Ferre
2015-02-05  6:02 ` [PATCH 3/3] pm: at91: Workaround DDRSDRC self-refresh bug with LPDDR1 memories Wenyou Yang
2015-03-03 18:41   ` Nicolas Ferre

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).