From patchwork Mon Jul 7 13:03:35 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vikas Sajjan X-Patchwork-Id: 4494701 Return-Path: X-Original-To: patchwork-linux-samsung-soc@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 927C99F392 for ; Mon, 7 Jul 2014 13:07:18 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id A39BF202E6 for ; Mon, 7 Jul 2014 13:07:17 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 5C2F020274 for ; Mon, 7 Jul 2014 13:07:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753046AbaGGNHP (ORCPT ); Mon, 7 Jul 2014 09:07:15 -0400 Received: from mailout3.samsung.com ([203.254.224.33]:46712 "EHLO mailout3.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752807AbaGGNHO (ORCPT ); Mon, 7 Jul 2014 09:07:14 -0400 Received: from epcpsbgr1.samsung.com (u141.gpu120.samsung.co.kr [203.254.230.141]) by mailout3.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N8C00DJEF40ZK40@mailout3.samsung.com> for linux-samsung-soc@vger.kernel.org; Mon, 07 Jul 2014 22:07:12 +0900 (KST) Received: from epcpsbgm2.samsung.com ( [172.20.52.125]) by epcpsbgr1.samsung.com (EPCPMTA) with SMTP id DF.EC.24374.08B9AB35; Mon, 07 Jul 2014 22:07:12 +0900 (KST) X-AuditID: cbfee68d-b7fd46d000005f36-d6-53ba9b80f49f Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id 5E.E6.05196.08B9AB35; Mon, 07 Jul 2014 22:07:12 +0900 (KST) Received: from chromebld-server.sisodomain.com ([107.108.73.106]) by mmp1.samsung.com (Oracle Communications Messaging Server 7u4-24.01(7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0N8C00CTOF23H630@mmp1.samsung.com>; Mon, 07 Jul 2014 22:07:12 +0900 (KST) From: Vikas Sajjan To: linux-arm-kernel@lists.infradead.org, linux-samsung-soc@vger.kernel.org Cc: kgene.kim@samsung.com, tomasz.figa@gmail.com, joshi@samsung.com, sajjan.linux@gmail.com, dianders@chromium.org, Abhilash Kesavan , Vikas Sajjan Subject: [PATCH v6 3/4] arm: exynos5: Add Suspend-to-RAM support for 5420 Date: Mon, 07 Jul 2014 18:33:35 +0530 Message-id: <1404738215-31537-1-git-send-email-vikas.sajjan@samsung.com> X-Mailer: git-send-email 1.7.9.5 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrKLMWRmVeSWpSXmKPExsWyRsSkVrdh9q5gg4PLjC0er1nMZHF22UE2 i++7vrBb9C64ymax6fE1VosZ5/cxWTw5/JHVYtWuP4wWN59tZ3Lg9JjdcJHFY+esu+wem5fU e/RtWcXo8XmTXABrFJdNSmpOZllqkb5dAlfGjXuHmAv+G1Z8733M3sDYqdXFyMkhIWAiMen+ U0YIW0ziwr31bCC2kMBSRokdS3S7GDnAas62hnYxcgGFFzFKXOnZzgbhTGCSOHN/MStIA5uA rsSKU8/ZQBpEBLwlll9TBKlhFjjNKHF87hKwBcICnhI3b94GW8AioCrx+dxmsF5eAQ+J3ad2 skIsU5CYM8kGpFdCoJ9d4t69RlaIegGJb5MPsUDUyEpsOsAMcbOkxMEVN1gmMAouYGRYxSia WpBcUJyUXmSoV5yYW1yal66XnJ+7iREYxKf/PevdwXj7gPUhxmSgcROZpUST84FRkFcSb2hs ZmRhamJqbGRuaUaasJI4b9LDpCAhgfTEktTs1NSC1KL4otKc1OJDjEwcnFINjGeN+KtWnuM4 1JF2K3zmwaJ26yiH6Y4WG/xidtyymbNxc90PpfVnvDUMO25OlfuYss782oRDPGtut3/jZhPa wBe/clPZfwmp521PbnUctwh7tmRDmnpI1RTu/9WBca6Na1YsDI9b9DLV3NclopbHZpaRYG+d crPIV5nUPRP4apING2cVzFXpVWIpzkg01GIuKk4EAGS6Vk54AgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprKIsWRmVeSWpSXmKPExsVy+t9jAd2G2buCDTYu1rJ4vGYxk8XZZQfZ LL7v+sJu0bvgKpvFpsfXWC1mnN/HZPHk8EdWi1W7/jBa3Hy2ncmB02N2w0UWj52z7rJ7bF5S 79G3ZRWjx+dNcgGsUQ2MNhmpiSmpRQqpecn5KZl56bZK3sHxzvGmZgaGuoaWFuZKCnmJuam2 Si4+AbpumTlABykplCXmlAKFAhKLi5X07TBNCA1x07WAaYzQ9Q0JgusxMkADCWsYM27cO8Rc 8N+w4nvvY/YGxk6tLkYODgkBE4mzraFdjJxAppjEhXvr2boYuTiEBBYxSlzp2Q7lTGCSOHN/ MStIFZuArsSKU8/ZQJpFBLwlll9TBKlhFjjNKHF87hJGkBphAU+Jmzdvs4HYLAKqEp/PbQbr 5RXwkNh9aicrxGIFiTmTbCYwci9gZFjFKJpakFxQnJSea6RXnJhbXJqXrpecn7uJERwlz6R3 MK5qsDjEKMDBqMTDe2DVzmAh1sSy4srcQ4wSHMxKIrzT43cFC/GmJFZWpRblxxeV5qQWH2I0 BVo+kVlKNDkfGMF5JfGGxibmpsamliYWJmaWSuK8B1utA4UE0hNLUrNTUwtSi2D6mDg4pRoY jT4vOMyWUMrYs6SedVdhXfuampa3k9JemPRx9e1odmT+d2Jtbc++Z30vntx5uPWGiovZyQ9P lzvdzeOtSq7e/32envynI/9e3tUrNu1d+3zClyxrsZMfTltlBX/x/vrVrF29Iju7aUeEmdHa IGVVVqUSiYuTeWaysrKGtU3aXCt8cMWcNzteKbEUZyQaajEXFScCACWxEheoAgAA DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected Sender: linux-samsung-soc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-samsung-soc@vger.kernel.org X-Spam-Status: No, score=-7.6 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Abhilash Kesavan Adds Suspend-to-RAM support for EXYNOS5420 Signed-off-by: Vikas Sajjan Signed-off-by: Abhilash Kesavan --- arch/arm/mach-exynos/pm.c | 146 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) diff --git a/arch/arm/mach-exynos/pm.c b/arch/arm/mach-exynos/pm.c index c0dae28..7edc3d0 100644 --- a/arch/arm/mach-exynos/pm.c +++ b/arch/arm/mach-exynos/pm.c @@ -40,6 +40,8 @@ #define REG_TABLE_END (-1U) +#define EXYNOS5420_CPU_STATE 0x28 + /** * struct exynos_wkup_irq - Exynos GIC to PMU IRQ mapping * @hwirq: Hardware IRQ signal of the GIC @@ -76,6 +78,9 @@ struct exynos_pm_data { struct exynos_pm_data *pm_data; +static int exynos5420_cpu_state; +static unsigned int exynos_pmu_spare3; + /* * GIC wake-up support */ @@ -115,6 +120,23 @@ unsigned int exynos_release_ret_regs[] = { REG_TABLE_END, }; +unsigned int exynos5420_release_ret_regs[] = { + EXYNOS_PAD_RET_DRAM_OPTION, + EXYNOS_PAD_RET_MAUDIO_OPTION, + EXYNOS_PAD_RET_JTAG_OPTION, + EXYNOS5420_PAD_RET_GPIO_OPTION, + EXYNOS5420_PAD_RET_UART_OPTION, + EXYNOS5420_PAD_RET_MMCA_OPTION, + EXYNOS5420_PAD_RET_MMCB_OPTION, + EXYNOS5420_PAD_RET_MMCC_OPTION, + EXYNOS5420_PAD_RET_HSI_OPTION, + EXYNOS_PAD_RET_EBIA_OPTION, + EXYNOS_PAD_RET_EBIB_OPTION, + EXYNOS5420_PAD_RET_SPI_OPTION, + EXYNOS5420_PAD_RET_DRAM_COREBLK_OPTION, + REG_TABLE_END, +}; + static int exynos_irq_set_wake(struct irq_data *data, unsigned int state) { const struct exynos_wkup_irq *wkup_irq; @@ -312,6 +334,17 @@ static int exynos5250_cpu_suspend(unsigned long arg) return exynos_cpu_do_idle(); } +static int exynos5420_cpu_suspend(unsigned long arg) +{ +#ifdef CONFIG_CACHE_L2X0 + outer_flush_all(); +#endif + __raw_writel(0x0, sysram_base_addr + EXYNOS5420_CPU_STATE); + + flush_cache_all(); + return exynos_cpu_do_idle(); +} + static void exynos_pm_set_wakeup_mask(void) { /* Set wake-up mask registers */ @@ -329,6 +362,49 @@ static void exynos_pm_enter_sleep_mode(void) pmu_raw_writel(virt_to_phys(exynos_cpu_resume), S5P_INFORM0); } +static void exynos5420_pm_prepare(void) +{ + unsigned int tmp; + + /* Set wake-up mask registers */ + exynos_pm_set_wakeup_mask(); + + s3c_pm_do_save(exynos_core_save, ARRAY_SIZE(exynos_core_save)); + + exynos_pmu_spare3 = pmu_raw_readl(S5P_PMU_SPARE3); + /* + * The cpu state needs to be saved and restored so that the + * secondary CPUs will enter low power start. Though the U-Boot + * is setting the cpu state with low power flag, the kernel + * needs to restore it back in case, the primary cpu fails to + * suspend for any reason. + */ + exynos5420_cpu_state = __raw_readl(sysram_base_addr + + EXYNOS5420_CPU_STATE); + + exynos_pm_enter_sleep_mode(); + + tmp = pmu_raw_readl(EXYNOS5_ARM_L2_OPTION); + tmp &= ~EXYNOS5_USE_RETENTION; + pmu_raw_writel(tmp, EXYNOS5_ARM_L2_OPTION); + + tmp = pmu_raw_readl(EXYNOS5420_SFR_AXI_CGDIS1); + tmp |= EXYNOS5420_UFS; + pmu_raw_writel(tmp, EXYNOS5420_SFR_AXI_CGDIS1); + + tmp = pmu_raw_readl(EXYNOS5420_ARM_COMMON_OPTION); + tmp &= ~EXYNOS5420_L2RSTDISABLE_VALUE; + pmu_raw_writel(tmp, EXYNOS5420_ARM_COMMON_OPTION); + + tmp = pmu_raw_readl(EXYNOS5420_FSYS2_OPTION); + tmp |= EXYNOS5420_EMULATION; + pmu_raw_writel(tmp, EXYNOS5420_FSYS2_OPTION); + + tmp = pmu_raw_readl(EXYNOS5420_PSGEN_OPTION); + tmp |= EXYNOS5420_EMULATION; + pmu_raw_writel(tmp, EXYNOS5420_PSGEN_OPTION); +} + static void exynos5250_pm_prepare(void) { unsigned int tmp; @@ -403,6 +479,24 @@ static int exynos5250_pm_suspend(void) return 0; } +static int exynos5420_pm_suspend(void) +{ + u32 this_cluster; + + exynos_pm_central_suspend(); + + /* Setting SEQ_OPTION register */ + + this_cluster = MPIDR_AFFINITY_LEVEL(read_cpuid_mpidr(), 1); + if (!this_cluster) + pmu_raw_writel(EXYNOS5420_ARM_USE_STANDBY_WFI0, + S5P_CENTRAL_SEQ_OPTION); + else + pmu_raw_writel(EXYNOS5420_KFC_USE_STANDBY_WFI0, + S5P_CENTRAL_SEQ_OPTION); + return 0; +} + static int exynos_pm_central_resume(void) { unsigned long tmp; @@ -479,6 +573,45 @@ early_wakeup: pmu_raw_writel(0x0, S5P_INFORM1); } +static void exynos5420_pm_resume(void) +{ + unsigned long tmp; + + /* Restore the sysram cpu state register */ + __raw_writel(exynos5420_cpu_state, + sysram_base_addr + EXYNOS5420_CPU_STATE); + + pmu_raw_writel(EXYNOS5420_USE_STANDBY_WFI_ALL, + S5P_CENTRAL_SEQ_OPTION); + + if (exynos_pm_central_resume()) + goto early_wakeup; + + /* For release retention */ + exynos_pm_set_release_retention(); + + pmu_raw_writel(exynos_pmu_spare3, S5P_PMU_SPARE3); + + s3c_pm_do_restore_core(exynos_core_save, ARRAY_SIZE(exynos_core_save)); + +early_wakeup: + + tmp = pmu_raw_readl(EXYNOS5420_SFR_AXI_CGDIS1); + tmp &= ~EXYNOS5420_UFS; + pmu_raw_writel(tmp, EXYNOS5420_SFR_AXI_CGDIS1); + + tmp = pmu_raw_readl(EXYNOS5420_FSYS2_OPTION); + tmp &= ~EXYNOS5420_EMULATION; + pmu_raw_writel(tmp, EXYNOS5420_FSYS2_OPTION); + + tmp = pmu_raw_readl(EXYNOS5420_PSGEN_OPTION); + tmp &= ~EXYNOS5420_EMULATION; + pmu_raw_writel(tmp, EXYNOS5420_PSGEN_OPTION); + + /* Clear SLEEP mode set in INFORM1 */ + pmu_raw_writel(0x0, S5P_INFORM1); +} + static struct syscore_ops exynos_pm_syscore_ops = { .suspend = exynos_pm_suspend, .resume = exynos_pm_resume, @@ -599,6 +732,16 @@ static struct exynos_pm_data exynos5250_pm_data = { .cpu_suspend = exynos5250_cpu_suspend, }; +static struct exynos_pm_data exynos5420_pm_data = { + .wkup_irq = exynos5250_wkup_irq, + .wake_disable_mask = (0x7F << 7) | (0x1F << 1), + .release_ret_regs = exynos5420_release_ret_regs, + .pm_resume = exynos5420_pm_resume, + .pm_suspend = exynos5420_pm_suspend, + .pm_prepare = exynos5420_pm_prepare, + .cpu_suspend = exynos5420_cpu_suspend, +}; + static struct of_device_id exynos_pmu_of_device_ids[] = { { .compatible = "samsung,exynos4210-pmu", @@ -612,6 +755,9 @@ static struct of_device_id exynos_pmu_of_device_ids[] = { }, { .compatible = "samsung,exynos5250-pmu", .data = (void *)&exynos5250_pm_data, + }, { + .compatible = "samsung,exynos5420-pmu", + .data = (void *)&exynos5420_pm_data, }, { /*sentinel*/ }, };