Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752943AbdC2FDi (ORCPT ); Wed, 29 Mar 2017 01:03:38 -0400 Received: from esa1.microchip.iphmx.com ([68.232.147.91]:43618 "EHLO esa1.microchip.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752534AbdC2FDh (ORCPT ); Wed, 29 Mar 2017 01:03:37 -0400 X-IronPort-AV: E=Sophos;i="5.36,239,1486450800"; d="scan'208";a="748894" From: To: , CC: , , Subject: RE: [PATCH v2 06/11] ARM: at91: pm: Workaround DDRSDRC self-refresh bug with LPDDR1 memories. Thread-Topic: [PATCH v2 06/11] ARM: at91: pm: Workaround DDRSDRC self-refresh bug with LPDDR1 memories. Thread-Index: AQHSp7U4UPzA2tk7nkaQgPZVIa+I7aGrQVDg Date: Wed, 29 Mar 2017 04:53:22 +0000 Message-ID: References: <20170328111938.21297-1-alexandre.belloni@free-electrons.com> <20170328111938.21297-7-alexandre.belloni@free-electrons.com> In-Reply-To: <20170328111938.21297-7-alexandre.belloni@free-electrons.com> Accept-Language: zh-CN, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.10.76.4] Content-Type: text/plain; charset="gb2312" MIME-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from base64 to 8bit by mail.home.local id v2T53u5N010899 Content-Length: 2750 Lines: 77 > -----Original Message----- > From: Alexandre Belloni [mailto:alexandre.belloni@free-electrons.com] > Sent: 2017??3??28?? 19:20 > To: Nicolas Ferre - M43238 > Cc: linux-kernel@vger.kernel.org; linux-arm-kernel@lists.infradead.org; Boris > Brezillon ; Wenyou Yang - A41535 > ; Alexandre Belloni electrons.com> > Subject: [PATCH v2 06/11] ARM: at91: pm: Workaround DDRSDRC self-refresh > bug with LPDDR1 memories. > > As already explained for pm_suspend.S, the DDRSDR controller fails 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. > > Signed-off-by: Alexandre Belloni Acked-by: Wenyou Yang > --- > arch/arm/mach-at91/pm.c | 20 +++++++++++++++++++- > 1 file changed, 19 insertions(+), 1 deletion(-) > > diff --git a/arch/arm/mach-at91/pm.c b/arch/arm/mach-at91/pm.c index > 3d68d93c11c7..488549bc2bed 100644 > --- a/arch/arm/mach-at91/pm.c > +++ b/arch/arm/mach-at91/pm.c > @@ -241,12 +241,27 @@ static void at91_ddr_standby(void) > /* Those two values allow us to delay self-refresh activation > * to the maximum. */ > u32 lpr0, lpr1 = 0; > + u32 mdr, saved_mdr0, saved_mdr1 = 0; > u32 saved_lpr0, saved_lpr1 = 0; > > + /* LPDDR1 --> force DDR2 mode during self-refresh */ > + saved_mdr0 = at91_ramc_read(0, AT91_DDRSDRC_MDR); > + if ((saved_mdr0 & AT91_DDRSDRC_MD) == > AT91_DDRSDRC_MD_LOW_POWER_DDR) { > + mdr = saved_mdr0 & ~AT91_DDRSDRC_MD; > + mdr |= AT91_DDRSDRC_MD_DDR2; > + at91_ramc_write(0, AT91_DDRSDRC_MDR, mdr); > + } > + > if (pm_data.ramc[1]) { > saved_lpr1 = at91_ramc_read(1, AT91_DDRSDRC_LPR); > lpr1 = saved_lpr1 & ~AT91_DDRSDRC_LPCB; > lpr1 |= AT91_DDRSDRC_LPCB_SELF_REFRESH; > + saved_mdr1 = at91_ramc_read(1, AT91_DDRSDRC_MDR); > + if ((saved_mdr1 & AT91_DDRSDRC_MD) == > AT91_DDRSDRC_MD_LOW_POWER_DDR) { > + mdr = saved_mdr1 & ~AT91_DDRSDRC_MD; > + mdr |= AT91_DDRSDRC_MD_DDR2; > + at91_ramc_write(1, AT91_DDRSDRC_MDR, mdr); > + } > } > > saved_lpr0 = at91_ramc_read(0, AT91_DDRSDRC_LPR); @@ -260,9 > +275,12 @@ static void at91_ddr_standby(void) > > cpu_do_idle(); > > + at91_ramc_write(0, AT91_DDRSDRC_MDR, saved_mdr0); > at91_ramc_write(0, AT91_DDRSDRC_LPR, saved_lpr0); > - if (pm_data.ramc[1]) > + if (pm_data.ramc[1]) { > + at91_ramc_write(0, AT91_DDRSDRC_MDR, saved_mdr1); > at91_ramc_write(1, AT91_DDRSDRC_LPR, saved_lpr1); > + } > } > > static void sama5d3_ddr_standby(void) > -- > 2.11.0