From patchwork Fri Apr 19 10:47:42 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: chenhui zhao X-Patchwork-Id: 237908 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from ozlabs.org (localhost [IPv6:::1]) by ozlabs.org (Postfix) with ESMTP id 2FBD62C0AEE for ; Fri, 19 Apr 2013 20:55:42 +1000 (EST) Received: from va3outboundpool.messaging.microsoft.com (va3ehsobe005.messaging.microsoft.com [216.32.180.31]) (using TLSv1 with cipher AES128-SHA (128/128 bits)) (Client CN "mail.global.frontbridge.com", Issuer "Microsoft Secure Server Authority" (not verified)) by ozlabs.org (Postfix) with ESMTPS id 164B52C0289 for ; Fri, 19 Apr 2013 20:48:28 +1000 (EST) Received: from mail214-va3-R.bigfish.com (10.7.14.226) by VA3EHSOBE005.bigfish.com (10.7.40.25) with Microsoft SMTP Server id 14.1.225.23; Fri, 19 Apr 2013 10:48:27 +0000 Received: from mail214-va3 (localhost [127.0.0.1]) by mail214-va3-R.bigfish.com (Postfix) with ESMTP id 1BF278806A0; Fri, 19 Apr 2013 10:48:27 +0000 (UTC) X-Forefront-Antispam-Report: CIP:70.37.183.190; KIP:(null); UIP:(null); IPV:NLI; H:mail.freescale.net; RD:none; EFVD:NLI X-SpamScore: 3 X-BigFish: VS3(zzc8kzz1f42h1fc6h1ee6h1de0h1fdah1202h1e76h1d1ah1d2ahzz8275bhz2dh2a8h668h839hd24he5bhf0ah1288h12a5h12a9h12bdh12e5h1354h137ah139eh13b6h1441h1504h1537h162dh1631h1758h1898h18e1h1946h19b5h1ad9h1b0ah1155h) Received: from mail214-va3 (localhost.localdomain [127.0.0.1]) by mail214-va3 (MessageSwitch) id 1366368504627654_18197; Fri, 19 Apr 2013 10:48:24 +0000 (UTC) Received: from VA3EHSMHS018.bigfish.com (unknown [10.7.14.246]) by mail214-va3.bigfish.com (Postfix) with ESMTP id 8D181D4004E; Fri, 19 Apr 2013 10:48:24 +0000 (UTC) Received: from mail.freescale.net (70.37.183.190) by VA3EHSMHS018.bigfish.com (10.7.99.28) with Microsoft SMTP Server (TLS) id 14.1.225.23; Fri, 19 Apr 2013 10:48:23 +0000 Received: from az84smr01.freescale.net (10.64.34.197) by 039-SN1MMR1-001.039d.mgd.msft.net (10.84.1.13) with Microsoft SMTP Server (TLS) id 14.2.328.11; Fri, 19 Apr 2013 10:48:22 +0000 Received: from localhost.localdomain ([10.193.20.174]) by az84smr01.freescale.net (8.14.3/8.14.0) with ESMTP id r3JAm5TT028249; Fri, 19 Apr 2013 03:48:21 -0700 From: Zhao Chenhui To: Subject: [PATCH v2 09/15] powerpc/rcpm: add sleep feature for SoCs using RCPM Date: Fri, 19 Apr 2013 18:47:42 +0800 Message-ID: <1366368468-29143-9-git-send-email-chenhui.zhao@freescale.com> X-Mailer: git-send-email 1.7.3 In-Reply-To: <1366368468-29143-1-git-send-email-chenhui.zhao@freescale.com> References: <1366368468-29143-1-git-send-email-chenhui.zhao@freescale.com> MIME-Version: 1.0 X-OriginatorOrg: freescale.com Cc: linux-kernel@vger.kernel.org X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" The SoCs which have a RCPM (Run Control/Power Management) module support power management feature. This patch implements sleep feature. In sleep mode, the clocks of cores and unused IP blocks will be turned off. The IP blocks which are allowed to wake up the system are still running. Signed-off-by: Zhao Chenhui Signed-off-by: Li Yang --- arch/powerpc/Kconfig | 4 +- arch/powerpc/include/asm/fsl_guts.h | 1 + arch/powerpc/platforms/85xx/Kconfig | 1 + arch/powerpc/sysdev/Kconfig | 5 ++ arch/powerpc/sysdev/Makefile | 1 + arch/powerpc/sysdev/fsl_rcpm.c | 101 +++++++++++++++++++++++++++++++++++ 6 files changed, 111 insertions(+), 2 deletions(-) create mode 100644 arch/powerpc/sysdev/fsl_rcpm.c diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index b6851be..0ad6e30 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig @@ -220,7 +220,7 @@ config ARCH_HIBERNATION_POSSIBLE config ARCH_SUSPEND_POSSIBLE def_bool y depends on ADB_PMU || PPC_EFIKA || PPC_LITE5200 || PPC_83xx || \ - (PPC_85xx && !PPC_E500MC) || PPC_86xx || PPC_PSERIES \ + FSL_SOC_BOOKE || PPC_86xx || PPC_PSERIES \ || 44x || 40x config PPC_DCR_NATIVE @@ -694,7 +694,7 @@ config FSL_PCI config FSL_PMC bool default y - depends on SUSPEND && (PPC_85xx || PPC_86xx) + depends on SUSPEND && ((PPC_85xx && !PPC_E500MC) || PPC_86xx) help Freescale MPC85xx/MPC86xx power management controller support (suspend/resume). For MPC83xx see platforms/83xx/suspend.c diff --git a/arch/powerpc/include/asm/fsl_guts.h b/arch/powerpc/include/asm/fsl_guts.h index 4eac1cf..b8a08d5 100644 --- a/arch/powerpc/include/asm/fsl_guts.h +++ b/arch/powerpc/include/asm/fsl_guts.h @@ -124,6 +124,7 @@ struct ccsr_rcpm { u8 res0038[4]; __be32 cwdtdsr; /* 0x003c - Core watchdog detect status register */ __be32 powmgtcsr; /* 0x0040 - Power Mangement Control & Status Register */ +#define RCPM_POWMGTCSR_SLP 0x00020000 u8 res0044[12]; __be32 ippdexpcr; /* 0x0050 - IP Powerdown Exception Control Register */ u8 res0054[16]; diff --git a/arch/powerpc/platforms/85xx/Kconfig b/arch/powerpc/platforms/85xx/Kconfig index 8f02b05..c0aa36e 100644 --- a/arch/powerpc/platforms/85xx/Kconfig +++ b/arch/powerpc/platforms/85xx/Kconfig @@ -8,6 +8,7 @@ menuconfig FSL_SOC_BOOKE select FSL_PCI if PCI select SERIAL_8250_EXTENDED if SERIAL_8250 select SERIAL_8250_SHARE_IRQ if SERIAL_8250 + select FSL_CORENET_RCPM if SUSPEND && PPC_E500MC default y if FSL_SOC_BOOKE diff --git a/arch/powerpc/sysdev/Kconfig b/arch/powerpc/sysdev/Kconfig index a84fecf..6c22d91 100644 --- a/arch/powerpc/sysdev/Kconfig +++ b/arch/powerpc/sysdev/Kconfig @@ -33,3 +33,8 @@ config SCOM_DEBUGFS config GE_FPGA bool default n + +config FSL_CORENET_RCPM + bool + help + This option enables support for RCPM (Run Control/Power Management). diff --git a/arch/powerpc/sysdev/Makefile b/arch/powerpc/sysdev/Makefile index b0a518e..f12b856 100644 --- a/arch/powerpc/sysdev/Makefile +++ b/arch/powerpc/sysdev/Makefile @@ -18,6 +18,7 @@ obj-$(CONFIG_MMIO_NVRAM) += mmio_nvram.o obj-$(CONFIG_FSL_SOC) += fsl_soc.o fsl_mpic_err.o obj-$(CONFIG_FSL_PCI) += fsl_pci.o $(fsl-msi-obj-y) obj-$(CONFIG_FSL_PMC) += fsl_pmc.o +obj-$(CONFIG_FSL_CORENET_RCPM) += fsl_rcpm.o obj-$(CONFIG_FSL_LBC) += fsl_lbc.o obj-$(CONFIG_FSL_IFC) += fsl_ifc.o obj-$(CONFIG_FSL_GTM) += fsl_gtm.o diff --git a/arch/powerpc/sysdev/fsl_rcpm.c b/arch/powerpc/sysdev/fsl_rcpm.c new file mode 100644 index 0000000..fd789da --- /dev/null +++ b/arch/powerpc/sysdev/fsl_rcpm.c @@ -0,0 +1,101 @@ +/* + * RCPM(Run Control/Power Management) support + * + * Copyright 2012-2013 Freescale Semiconductor Inc. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + */ +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +static struct ccsr_rcpm __iomem *rcpm_regs; + +static int rcpm_suspend_enter(suspend_state_t state) +{ + int ret = 0; + + switch (state) { + case PM_SUSPEND_STANDBY: + + flush_dcache_L1(); + flush_backside_L2_cache(); + + setbits32(&rcpm_regs->powmgtcsr, RCPM_POWMGTCSR_SLP); + + /* At this point, the device is in sleep mode. */ + + /* Upon resume, wait for SLP bit to be clear. */ + ret = spin_event_timeout( + (in_be32(&rcpm_regs->powmgtcsr) & RCPM_POWMGTCSR_SLP) == 0, + 10000, 10); + if (!ret) { + pr_err("%s: timeout waiting for SLP bit to be cleared\n", + __func__); + ret = -EINVAL; + } + break; + + default: + ret = -EINVAL; + + } + return ret; +} + +static int rcpm_suspend_valid(suspend_state_t state) +{ + if (state == PM_SUSPEND_STANDBY) + return 1; + else + return 0; +} + +static const struct platform_suspend_ops rcpm_suspend_ops = { + .valid = rcpm_suspend_valid, + .enter = rcpm_suspend_enter, +}; + +static int rcpm_probe(struct platform_device *pdev) +{ + struct device_node *np = pdev->dev.of_node; + + rcpm_regs = of_iomap(np, 0); + if (!rcpm_regs) + return -ENOMEM; + + suspend_set_ops(&rcpm_suspend_ops); + + dev_info(&pdev->dev, "Freescale RCPM driver\n"); + return 0; +} + +static const struct of_device_id rcpm_ids[] = { + { .compatible = "fsl,qoriq-rcpm-1.0", }, + { }, +}; + +static struct platform_driver rcpm_driver = { + .driver = { + .name = "fsl-rcpm", + .of_match_table = rcpm_ids, + }, + .probe = rcpm_probe, +}; + +static int __init rcpm_init(void) +{ + return platform_driver_register(&rcpm_driver); +} + +device_initcall(rcpm_init);