From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752986AbcHALYk (ORCPT ); Mon, 1 Aug 2016 07:24:40 -0400 Received: from mail-sn1nam02on0043.outbound.protection.outlook.com ([104.47.36.43]:16480 "EHLO NAM02-SN1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752927AbcHALYc (ORCPT ); Mon, 1 Aug 2016 07:24:32 -0400 X-Greylist: delayed 4718 seconds by postgrey-1.27 at vger.kernel.org; Mon, 01 Aug 2016 07:24:32 EDT Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=nxp.com; nxp.com; dkim=none (message not signed) header.d=none;nxp.com; dmarc=fail action=none header.from=nxp.com;nxp.com; dkim=none (message not signed) header.d=none; From: Chenhui Zhao To: , , CC: , , Chenhui Zhao Subject: [PATCH 2/2] soc: nxp: Add a RCPM driver Date: Mon, 1 Aug 2016 17:49:03 +0800 Message-ID: <1470044943-3814-2-git-send-email-chenhui.zhao@nxp.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1470044943-3814-1-git-send-email-chenhui.zhao@nxp.com> References: <1470044943-3814-1-git-send-email-chenhui.zhao@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131145185671298470;(91ab9b29-cfa4-454e-5278-08d120cd25b8);() X-Forefront-Antispam-Report: CIP:192.88.168.50;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(7916002)(2980300002)(1110001)(1109001)(339900001)(288314003)(189002)(199003)(4326007)(33646002)(85426001)(2906002)(104016004)(5003940100001)(19580405001)(19580395003)(229853001)(2950100001)(77096005)(8936002)(8676002)(81156014)(81166006)(2201001)(36756003)(68736007)(50466002)(92566002)(586003)(48376002)(86362001)(105606002)(50226002)(47776003)(189998001)(97736004)(5001770100001)(8666005)(7846002)(76176999)(356003)(49486002)(11100500001)(305945005)(50986999)(87936001)(106466001)(7059030)(2004002)(2101003);DIR:OUT;SFP:1101;SCL:1;SRVR:BN1PR0301MB0690;H:tx30smr01.am.freescale.net;FPR:;SPF:Fail;PTR:InfoDomainNonexistent;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BL2FFO11FD038;1:ipm9z+9gDFOgBmqq5gkAOOqKqsh9u2WgondlrSzT02zKDh1B9XAqPo/yjyNxQv6dgZ/lhSjuUbOzzVNL/tcWzhCT8wN4apxKeCEbHqWmyIXxCBj93ogwc2hdtLEp59MAord3Dxl0pvvXkHsdefkxBSCBtu198v4vm3zWc31f03IKoBD6bBmE/TPHkLrF0rnGxZR17tdCJ2seE8P10rjqPli8Qf6u5txWEKBSUjgj7WDHL3fSn8DdgwYYEiB31B2sJiF0XOoBb/7R4yLfFbafYGuvzVc7XknWXsjZKUnobncRsF1ssqG6GhlK+PsdfWYnr+UDRR2VdGA+LwySqD9vMHAGw7xhNMrJLIOSbNJpS4y7VszTdGI5Wnmq7neHeODVBbNkgXdSuJvosUyrHo3iM3iYBU+815A+YQP8RvglVDkxfAgoj2gnea6yDiZqLC58A+iPdG5Isab4sYctbloCtim3WppSo9lBYBfIyNpiNSEHGWllkiGjmncFQAuvMF2j3UDn2I3Vh4lg0BLTVEs/emCOopjIDiMqm1SIBWjNAHBOJ/NjwC166k+0Ta3reRUzshTtiLxqz5DiGwJ8bC2YQKrJkSQ50mDOetTxsWnBSXY2ZFGlKeW8zikrLK/i+H7TL1pr1gTDXSMLBVpJ9a3wXoPVHST0O7j/ywTmKnoQsR0RAL6Y8buL6jwgUNogXmTQBle2qhJXrEjmOLOOn1t99NI7nToMueuKmRv1OVp+0hQ= MIME-Version: 1.0 Content-Type: text/plain X-MS-Office365-Filtering-Correlation-Id: 3b887462-8258-4368-5c45-08d3b9f12065 X-Microsoft-Exchange-Diagnostics: 1;BN1PR0301MB0690;2:6jze9fnTHmMYpbIMhpihFNGCSWTfvDOowkRbYEzMqvE7LFn1kSCkY9/eQx6gx/FDtFw182kwH4RAQMiGgcbZ+VOdov/hBHxVfgiOvhcPLh34Mvi68/q/jI9ar5g+yXwkfHPT9miUh9Ucyfp+AVCcEAGNbpMi4u407rhZk6loTW7PdwjIjSW8yg48t5/1qgkv;3:/f/6zWH6MbBXODrlFC5U11aRxNEdqlH1OYwGbDL8fCILfEUqkzsMQWYlHYuSkmHvXZGcGuZjeZev1nrTtEquPl8AXEn/j+xIfBpz64v0b2l+U34CDb4tcISNT1vds7Fv6NMofUoTyM5ggQmLDvBqOSeuphfm7S/FBNunSErBTP31DiNon1P2zjDrv545bV1ITCN7NCghSWs1La+ZngVGVEI6MDYF+qyPjLGpYaobcuY= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BN1PR0301MB0690; X-Microsoft-Exchange-Diagnostics: 1;BN1PR0301MB0690;25:+4yq8Kfxtdpe+hXZ68dduux320HI1WUSStGnQeZ6MtlNdYagmVpjMko83/1b0O+j4tDCv16SsSOOPl0BLLDDw6k1fIzW0RC9/b3MA4uGD3mfwUbGMBwluJw7oXl5yjyGdRGq4VNwrCtXRENOD4G+qUTVvxfoTEQY2HpNbvtgjdKGqq7lPfmScWYPMNV5TCo9n9KMHnaPkGDmOR5U71Sl5heQQHYVSponv0ZzzBVI1Zcx+2sHkH3bvW9HhBV/yp91kOmmpVz43HyWQzbbj8Civ7MVnop2JBrlRyVYwMO5X5eTZfjbNdwlCnhGBxIWL2MXVeIs/XUG48Rc/DbaVwS9w+CIFSJsQ+1/9FcJRadJKCLGiME8MBSNz+Z2qc5YDWYuRLjx70F9Kot17wgwn9StihiWc1n2Gb6Jo2nEj1izj53bjxcClTDS75z2xOxRhdfYWcBDuUTl9IppXUC83f0Vlr71kx8ePheLKNjMLQ+ZEPmUHUoNrV9W4ABwd03X34IwdRFFyb2Cgl0Pix0BDC2KckVxf6k333h5c1LK98T8Zk26w8r0SX6TvkG6zyIes5HHLlj1Ikn2ctg7wm5ANNINb2al/1WBvZ3TOtkNxA/ywbxY3dpaqptrrIZBaaqIAal1+dpfXGQT7rcbfBHEeHRkwXmXWbSsHVwbfY3HT/hrpljmMum7k1w43engkTWB45pAn/bjtwQZWVmIepFRr61OQj2jaPJ1NrX711y4gSPr6xvr6ezKP2sGt358L2Buos1n X-Microsoft-Exchange-Diagnostics: 1;BN1PR0301MB0690;31:EYJ4KQaiGnsLdgcttF5G6cI7TjZXjvWUnqPOOIlzKu09U6m6nTMGkXncigZp6blCHqtUXT5GJlPPpIA2imjN+tjCglMK0FSReAw32GT2pWl16VIjKLwswH2fgROp4FpJxK0vIGFwuyzzaJ5fsYFoyiehU+V6273XP4Sbxgg2vFDF/OxVsWzrpSSaY+kJImuyHASPVnQi7o6f7vOBxoJdsw==;4:80txAuxue6HRVyIodOFcKeJL9ggBsIG/opSx/XHx4xFUagyE6v3WgWb+A6HewyO62V25vfPpChyUiRROj0V8d/yV4eCcWzw7wrTBNMbbgV5hkuGSokSAxO5fB3zb/NsqwQr46nJ/ZaqlzmN2lv0amA1UKWo6hl+G8fdwqH9trJriJynkNFK7ZxpGd7fat+igJxXsQojKAYJP8fuM6dWv7S/T/AjDkQ5oYK97EGyWhsJ7LQWaXbvIHi0nGw32OBgRuz5HjcHwo0DyR6osaVmTIPQCc9woNdaX7mJE7cVSJIgjpBQbHMzXRV/md1xdncpvq5tvwb221GjRH/nMfoRKJ4OaU33VjCPLO5RxZT+IANrk89cpwwKfMf93ONFoxdoCMhgRyUTk6szr1Vx7IuQhsscsKNvXfdGhkl6JQiVXdCbthTWPytKXL82+tzRC6WaPRh0EaYIQfQXiOvxc80/6JyK1xduvNu9kY4mganiEMNasLtjC6QFUkV/LBAOIejjCIfoZitwOYJ+/+L5m8oS45g== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(13023025)(13024025)(13015025)(13018025)(13017025)(8121501046)(5005006)(10201501046)(3002001)(6055026);SRVR:BN1PR0301MB0690;BCL:0;PCL:0;RULEID:(400006);SRVR:BN1PR0301MB0690; X-Forefront-PRVS: 0021920B5A X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BN1PR0301MB0690;23:8xUMhqhBKhD2w0wko0f1D16iAajlWH6rIoR8Wbr?= =?us-ascii?Q?ZxGQydQhTuxpRIzA7AyPTHaE152iv8vcm9PrfcThtX5lY23rqqwmnnRfsvfq?= =?us-ascii?Q?YbELy9qwizgC7ui66GHGBlRwEj36HYmnrbg39gXI5icMgFFa9OnpcVL0qAor?= =?us-ascii?Q?FBBGboAIBU7/BtUm21ChU/2su27MV8Tiqp7rjpjWzTK68EEdq6hGYTBNJCR2?= =?us-ascii?Q?ZnIkn+T5o0C0Hp1/h8RELvBNRhFwsgJQaVqgpG+BsmxYPQY5t3Vv1gFWuyql?= =?us-ascii?Q?/O3L+A/D+gWnExeWPqoHRLzJN83IV5Urc5ooy8hFA4Et7tbWUAzPwFjZlNPa?= =?us-ascii?Q?wiegLNY07s8F2o/JrkyIuFlNYObjs0RJ6+KTn3zUREkr76cLE3U7MzlVhJjn?= =?us-ascii?Q?SHby71NSA+koz40ONpw65bOaX7sxMXTICA6tKDXmBFm03exgStXAVJyiRsgC?= =?us-ascii?Q?ATCYIF+JanikZUQyvxKz5Dky44tLgGg6JoMTVxx/PlZEc8S0ZNxPzYxGXdQd?= =?us-ascii?Q?927RKtRjqS53LAV2mNWqu/aHJbjFaKFMjXw2Ceik1WMt+x/ypIqgXKnch/+3?= =?us-ascii?Q?gpZP2TYKP65e97WuQJyUPAzeRgrUaeVdYiBjjM4eX/dJFMrlXDUXOJv0X+OI?= =?us-ascii?Q?a9dcXrpr0zd3DyJpyWMJXHEyE9yUjwVdN9JFzDcQInDPhCTszkOhocvcaNar?= =?us-ascii?Q?nzGFCsTHbggHyUb8c2H+A4jaIWlZdxNe+5R+yeGqCm5YLFUkq6sXhC0lkrUe?= =?us-ascii?Q?Z8Y5+V61UIwLifHAqZaGymE3RTre4IVkBCSmIOxmOroqbQMBtmT7kWfX958l?= =?us-ascii?Q?dnYRCB2No5rcNpEKxSPerUaEOsdIRQsL6Xpli72o9xLgqAtTupFmmjrOj4wB?= =?us-ascii?Q?E8blcJmV/mA5cC1/XiX+I3zlTMC9UR5pTVOHdRA6OS0lLZS28GKcRo3IOmPh?= =?us-ascii?Q?KZrOTchLBqGoXXobaUe1o1u/wa9onZecgCrr28Wyr3OdyrwOIlgUkxRgY+NV?= =?us-ascii?Q?rErZ6HPaFj+iYMANLFMocKvs4VZMgrcM1NvqUzDQPbp4iER+7BmGV6eohXaW?= =?us-ascii?Q?//egAid0v5h0NT9sPsMYRfO3HNNdrOBUt0O137XQPMDIf8ycyKRw5aTfy0dy?= =?us-ascii?Q?kXB4UDOaJvKpCCXOEH+XBPx5CUyPpv9oRS1e3J2ElXK0TuqsTJ2a6+S3aelQ?= =?us-ascii?Q?IpwyE7LRQt9T9vY3y9LrXCWEi5pFe0W33DBtlOjemiB3XYoyynPpb6gp+kw?= =?us-ascii?Q?=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;BN1PR0301MB0690;6:k9POwLcN50iuiquJXxEnkqekNA84/M6HrJ70NsKKk4s+pfubm2lD4BE4P0tf3WG3HXXcC+sKee/t/JlZMtoe3tZ1J/p2sjmkIQKZGNCmu6JPycet1rl1NFc9ScL4TIPfv6ntTZOUcEbBGkMVAt29iGODAhEZdgGf7Li+oB3PpLlaGK6BmS06MSNy9AHSDjSYrBkHZhKunmJpy+QsWVsKMKjCUfDzLPo9pfh6FnWYcvxV3PblCovDDByp/peqGtTAY6RJi2fcamWZaOyFAWfcYo5NWtKbp7f+AMeH94L2pdM=;5:456qHRRV2Vr+t9AAVJXBq2VhNSCrx9//+msOjJG83UDAZcNL1yAhWWcWfFGfooInes91IyCEbqSvu34OZHvbzTedQu8dsWKJeA9d4SASjB55tlplRe5dpue0ni2ovlrOFNGUb3JjwWkGOFHOsm89LWa/S7yJZ+xQNHers9H/dq8=;24:p9bDGnlLndDtLTMTmihl7OhsweSKZNITy8gm1Pm/v2kLhFlaRQFhW24kTaLljILdaa3pB5cVbeLIsYCCHziIu48LnplF9u+4ddzJWaHG2M0=;7:xE6YepA/RrtyGkRIbgpT9ApVF6FSf849rj7535Ku/JHqfGRfkTIWaI/dqm54+nVL+WyhkmyQv4DNLNwlPqGHe9C3I7oYMjh22Xf2y297AHDP4WxKwm2st2w1vgZLO6bT2hznA4QvGi/etFc7RbYsQJOK/3l1A5o4wvBvf4FmSS1vWZXQAFA3AoMZNU86IPFDGoEiy4MfJft/AtTu3LHlQcsj2imIMD/wlmy1V9Ap2/Y1wx4vbjop97OULKhpXc6H SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Aug 2016 09:49:26.9426 (UTC) X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e;Ip=[192.88.168.50];Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN1PR0301MB0690 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The NXP's QorIQ Processors based on ARM Core have a RCPM module (Run Control and Power Management), which performs all device-level tasks associated with power management. This patch mainly implements the wakeup sources configuration before entering LPM20, a low power state of device-level. The devices can be waked up by specified sources, such as Flextimer, GPIO and so on. Signed-off-by: Chenhui Zhao --- drivers/soc/fsl/Makefile | 1 + drivers/soc/fsl/pm/Makefile | 1 + drivers/soc/fsl/pm/ls-rcpm.c | 144 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 146 insertions(+) create mode 100644 drivers/soc/fsl/pm/Makefile create mode 100644 drivers/soc/fsl/pm/ls-rcpm.c diff --git a/drivers/soc/fsl/Makefile b/drivers/soc/fsl/Makefile index 203307f..b5adbaf 100644 --- a/drivers/soc/fsl/Makefile +++ b/drivers/soc/fsl/Makefile @@ -4,3 +4,4 @@ obj-$(CONFIG_QUICC_ENGINE) += qe/ obj-$(CONFIG_CPM) += qe/ +obj-$(CONFIG_SUSPEND) += pm/ diff --git a/drivers/soc/fsl/pm/Makefile b/drivers/soc/fsl/pm/Makefile new file mode 100644 index 0000000..e275d63 --- /dev/null +++ b/drivers/soc/fsl/pm/Makefile @@ -0,0 +1 @@ +obj-$(CONFIG_ARCH_LAYERSCAPE) += ls-rcpm.o diff --git a/drivers/soc/fsl/pm/ls-rcpm.c b/drivers/soc/fsl/pm/ls-rcpm.c new file mode 100644 index 0000000..c5f2b97 --- /dev/null +++ b/drivers/soc/fsl/pm/ls-rcpm.c @@ -0,0 +1,144 @@ +/* + * Run Control and Power Management (RCPM) driver + * + * Copyright 2016 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ +#define pr_fmt(fmt) "RCPM: %s: " fmt, __func__ + +#include +#include +#include +#include +#include + +/* So far there are not more than two registers */ +#define RCPM_IPPDEXPCR0 0x140 +#define RCPM_IPPDEXPCR1 0x144 +#define RCPM_IPPDEXPCR(x) (RCPM_IPPDEXPCR0 + 4 * x) +#define RCPM_WAKEUP_CELL_MAX_SIZE 2 + +/* it reprents the number of the registers RCPM_IPPDEXPCR */ +static unsigned int rcpm_wakeup_cells; +static void __iomem *rcpm_reg_base; +static u32 ippdexpcr[RCPM_WAKEUP_CELL_MAX_SIZE]; + +static inline void rcpm_reg_write(u32 offset, u32 value) +{ + iowrite32be(value, rcpm_reg_base + offset); +} + +static inline u32 rcpm_reg_read(u32 offset) +{ + return ioread32be(rcpm_reg_base + offset); +} + +static void rcpm_wakeup_fixup(struct device *dev, void *data) +{ + struct device_node *node = dev ? dev->of_node : NULL; + u32 value[RCPM_WAKEUP_CELL_MAX_SIZE + 1]; + int ret; + int i; + + if (!dev || !node || !device_may_wakeup(dev)) + return; + + /* + * Get the values in the "rcpm-wakeup" property. + * Refer to Documentation/devicetree/bindings/soc/fsl/rcpm.txt + */ + ret = of_property_read_u32_array(node, "rcpm-wakeup", + value, rcpm_wakeup_cells + 1); + if (ret) + return; + + pr_debug("wakeup source: the device %s\n", node->full_name); + + for (i = 0; i < rcpm_wakeup_cells; i++) + ippdexpcr[i] |= value[i + 1]; +} + +static int rcpm_suspend_prepare(void) +{ + int i; + + for (i = 0; i < rcpm_wakeup_cells; i++) + ippdexpcr[i] = 0; + + dpm_for_each_dev(NULL, rcpm_wakeup_fixup); + + for (i = 0; i < rcpm_wakeup_cells; i++) { + rcpm_reg_write(RCPM_IPPDEXPCR(i), ippdexpcr[i]); + pr_debug("ippdexpcr%d = 0x%x\n", i, ippdexpcr[i]); + } + + return 0; +} + +static int rcpm_suspend_notifier_call(struct notifier_block *bl, + unsigned long state, + void *unused) +{ + switch (state) { + case PM_SUSPEND_PREPARE: + rcpm_suspend_prepare(); + break; + } + + return NOTIFY_DONE; +} + +static const struct of_device_id rcpm_matches[] = { + { + .compatible = "fsl,qoriq-rcpm-2.1", + }, + {} +}; + +static struct notifier_block rcpm_suspend_notifier = { + .notifier_call = rcpm_suspend_notifier_call, +}; + +static int __init layerscape_rcpm_init(void) +{ + struct device_node *np; + int ret; + + np = of_find_matching_node_and_match(NULL, rcpm_matches, NULL); + if (!np) + return -ENODEV; + + ret = of_property_read_u32_index(np, "fsl,#rcpm-wakeup-cells", 0, + &rcpm_wakeup_cells); + if (ret) { + pr_err("Fail to get \"fsl,#rcpm-wakeup-cells\".\n"); + return -EINVAL; + } + + if (rcpm_wakeup_cells > RCPM_WAKEUP_CELL_MAX_SIZE) { + pr_err("The value of \"fsl,#rcpm-wakeup-cells\" is wrong.\n"); + return -EINVAL; + } + + rcpm_reg_base = of_iomap(np, 0); + if (!rcpm_reg_base) + return -ENOMEM; + + register_pm_notifier(&rcpm_suspend_notifier); + + pr_info("The RCPM driver initialized.\n"); + + return 0; +} + +subsys_initcall(layerscape_rcpm_init); -- 1.9.1