From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754096AbbJ0Lgv (ORCPT ); Tue, 27 Oct 2015 07:36:51 -0400 Received: from mail-by2on0143.outbound.protection.outlook.com ([207.46.100.143]:10194 "EHLO na01-by2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753789AbbJ0Lgt (ORCPT ); Tue, 27 Oct 2015 07:36:49 -0400 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=freescale.com; freescale.mail.onmicrosoft.com; dkim=none (message not signed) header.d=none;freescale.mail.onmicrosoft.com; dmarc=none action=none header.from=freescale.com; From: Raghav Dogra To: CC: , Raghav Dogra Subject: [PATCH 1/2] drivers/memory: Add deep sleep support for IFC Date: Tue, 27 Oct 2015 16:34:55 +0530 Message-ID: <1445943895-2466-1-git-send-email-raghav@freescale.com> X-Mailer: git-send-email 1.9.1 X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1;BY2FFO11FD013;1:1FU4U7Ljp45hzvLNrlej2c59CldISHTVc2jQe16a+8WPf0fVy1ot0yYELFXPW7wzqyNh1hJ+kSaXpwupnnuREM51AIFzm6Y2BPkMiRvm2PD/vMWvKyHFAOjZvGh2ijRJsRSYh8mJBHnm++mjQW+OF3WyvHdBK/g1ejkP/5YMQe3SZ+yDIlIKd8jM8JdsNSF82Li+/sEUANqoGZN5gtENSePuVLlhrQXxg6Bkc5xBMC43tjFAne0lXB2w/zM2w/zr9mKHyPOBVYf7QEVaGQM9yfizoJsI6QobBihoRzVUCsqFlnFambHwDfKYsAZLZ6mPN/FRegEnG/4zbOYyLHVyUSSbkP1lTI8hygr6lY//ssiEvBhr9xKYhPFfJtvUkOBiVzICB6d7C1iDMKyy70TEBQ== X-Forefront-Antispam-Report: CIP:192.88.168.50;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10019020)(6009001)(2980300002)(1110001)(1109001)(339900001)(199003)(189002)(229853001)(2351001)(105606002)(4001430100002)(77096005)(106466001)(47776003)(5008740100001)(5001960100002)(107886002)(33646002)(19580395003)(19580405001)(189998001)(5003940100001)(85426001)(110136002)(87936001)(81156007)(97736004)(50986999)(450100001)(5007970100001)(48376002)(92566002)(86362001)(50466002)(104016004)(6806005)(50226001)(36756003);DIR:OUT;SFP:1102;SCL:1;SRVR:DM2PR0301MB0784;H:tx30smr01.am.freescale.net;FPR:;SPF:Fail;PTR:InfoDomainNonexistent;A:1;MX:1;LANG:en; MIME-Version: 1.0 Content-Type: text/plain X-Microsoft-Exchange-Diagnostics: 1;DM2PR0301MB0784;2:CzfV4DsyATP93SMWyM8bZtAJrET1dOBZ79T/hXe/QtLxJ4wAEcC76eVovPI8LVlJkZOP0lp14bY5Md40Lb2paqKDWLs2w9S07LpCMRD62xrs1bjQZpCg2pB+CncVezm7cIOLsOqa7tdaMdSiw9CYmk/ASRxb4v5gKS5ncTMWSws=;3:EFrbHotjdnKOKxInJx1Q7SWkb0r7H9QqFd3ezFqN+04Eu5kb23SqUTigbDH+H89RDoV/HOUV57CQxasbFc2D9Kv2hbDzoZAxpAZCAmtslUTTzrP2jGH5SVHGrvgOpVYYeN38IZ8SJAC4l1MdMnl/05XyeP1uHpEh4IEFLMINd7Jrna/JJVA2N3ACsTYFGVa/8FeNJzLssX/fLfnBa4+wC6cYnacJEg8cE78Fjcp/1gI=;25:FiGNBz1AcW34pLgmp1el9XG2XNdT/cuhT/EnaxXzPnX6mw59/iR4sr9x7ZjbUxXJVcKDWsDIcgjYaE3ehtbSNLKfDj0v/6ckjdgYGz0b78f6YhaBl0plPc7Lx8yuJtzc8j0hOVy90YXEdob56GwkBll4WKMb61KnVJVcLC44C+QB6QjCwYSswBPlR5SydGdl/OX2/6OTRDvMnsRmXunWfPQAmO+HeB/RKxpMxOIJP8/4Wn1MziyQZBVoiy23seSxUipBOv+zEL/z+8nkKDvW2Q== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:DM2PR0301MB0784; X-Microsoft-Exchange-Diagnostics: 1;DM2PR0301MB0784;20:uFWBtyHJ/Uk5fS5LI2of5OP27gN7YUlpOq7A7VFt2eeoga/VWTSdZUsHpPTZdDnpLrMbWT7fI99R8aI2A3udPlXVybQXtacFjys663aRu8GTH4u7Y8ZXRWp+xoRRwgi1G54C7a3v/qEA1eLaoBojwoqVoPTU9yonkk4wUMUMhtyFrn7UbxoYUWghCfaiXNWo8rJuYmsSCWtTiDdJUzV2nDuApNsO6z7nCK++lIBhkVpfmwg+QC6ImT/sJSJVQWgrdLDbzdxqk1/IcPRjpBypjXK2PFgnnB4Ud21RYsW+GD9pz8Ul0QPFcANMTCKXfqS/Sh2IeYg4WPj5iZSyCUrQOu8vPfxkTZT4yex8OxMGzl0=;4:jXQwnuBP+/H1fZoOQmiMezBAW2jhd+5vrEX32le1HCNa2zL9W2f9ZjPHUfW32us7tcQ3cv929MWWErjpZ+0nlMhG3AGS5aBE8xgvq+z9NoLh7kwEgpHoTDdQBl1BEJTNcEuikRi+QBGf4lK2/UvdQ2LrbGsSOs6S1U7USHE7ppXqtDAQ0If5K4GZ0nFNEPiH7CtuuuuMO4PJqVdarkqMFnwaK5cq5tjz+MchpbwNZ43pQ9dSloZII/YnxsM9fSStviAjiFf74XJFsjCPP3gex8Nrbm0+584uqaqJWo+7wBWQRrZ902E6HvS+NtA60bIMS5WUkuDXTnvlTkBOrKPMcS8Fikb6oF3aVcLpG3hPdxZ2kkOQwucTmnMcv9kIvOIU X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(101931422205132); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(5005006)(520078)(8121501046)(3002001)(102215026);SRVR:DM2PR0301MB0784;BCL:0;PCL:0;RULEID:;SRVR:DM2PR0301MB0784; X-Forefront-PRVS: 0742443479 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;DM2PR0301MB0784;23:S40IC0whCeoTsW/37FGAZugNKk31K45fwc0qlZQ?= =?us-ascii?Q?LMfnTRxs7snLDvpioI3ndkwbqlg/xMEDXZhavowrO0aypZ+ZtkxyXChyXvB9?= =?us-ascii?Q?q5IqM4cPiFKKsD/o5lr6kmFUHGN77C5TFsy8f8NlLNxUcSdKPCSZmQJroWdm?= =?us-ascii?Q?4iR0LqQ692KeJInj4upVSPNcVERhnYyJjzxxdCIpf+AIt6aULS6CadSYUGDC?= =?us-ascii?Q?x0mpIMoeID2MNz/oKZCspOncID4mtAeJi0dUM/p0VrtugMfI4JUbJuksXyB4?= =?us-ascii?Q?9ScIi356j/0jVNaqwwBLZ00yGF5xUk5V0PGj0MaDorRiJSQA+q7vZ6VBnukw?= =?us-ascii?Q?uPioA9nnrUlEtjrSoCXEArsJRvt/leFgyiYEG2KPE9F+6SodUExR/l1oin5C?= =?us-ascii?Q?cgBos77BoeBA0QEu9R9NTtKbb/bAd96/Llu98fhX4ynVHLaFZ+dsXipTyXs+?= =?us-ascii?Q?t0Ftdoert9TxpYTflLLKCB0J7yxES0iIHPHIEDbAToSKnBNIXZgzJ8mtnLUH?= =?us-ascii?Q?0WfWlFJMqkiu+aR3JIIAPxKsk40dKMyVXRgSsdwG7zx64l5ioPKqycGxp/FU?= =?us-ascii?Q?KJquW3NP3gJ3WtIPrwjBKwVwfRc7NBiaZ70LMvR/qreenxdBQGyGOJEJthDk?= =?us-ascii?Q?26xAPlq/roLPQWqYAWthmaITScojXFC4jz9MfVmxOKX++oAZaJFCkn7/LaGi?= =?us-ascii?Q?2Odr5GAoNPWazHTX6sStXTqe5F1MNq699b1FrDr1fTyGdVecqokTTsk3mUCb?= =?us-ascii?Q?ICRlj5N24lwds6rgjh86A4Bx5b74Rg3qHl7g1D8CCwjY7ZPUuuwfpSqU9XKD?= =?us-ascii?Q?NP0ZyUAWHBtCQgJUArwMihYVTY8AnDN5veB2L0RxVvVSvbW59fmOi2JjJmr9?= =?us-ascii?Q?bnQhgHWKJ/Adb0t0WXLdzk+rLneUADqMn6iQMWxi5oicT07psIn8W2rqZKdZ?= =?us-ascii?Q?9WtnUHW4F5i89SZf556vpcDesFS9DMLYxRvLNfwoZTBwN5QdoRANb3zO/a7U?= =?us-ascii?Q?WSOaaYfusprk8tRSWFcA0k6Jno4LWVOhTP3lddht5OYs8uA=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;DM2PR0301MB0784;5:nZWgliUmiSwLeIoZpiGjV5WAmTn+JXOsO5fT4hUqTKxJCIkqOdThaBG9pA2wV+Voq9O0nIF6vtYIvxX9/EgZRfpx5jApmutVsn2II/c0+KK6fbitji74T+BKMRsp3GqvxBPUqsdENRxC2OEoqz35lg==;24:7e+TjgCpkYAQXBMmE+JTc/84BRxVxLN0yMh7zUpP1QYrkyy8GsjZX2fZBJkNSccxPhXFC5FVDmzVLHfqzMibpqjYRWoM3Hx8WW8ejgn5Tnk=;20:yc8NeBhKKKWSsDPTR7fvSnrDX0Klu4vRpoHfIW1kRI7JlgzIVpnkKxTNBpVj4gG3JsYe912xy9PrbGrcDQd1PQ== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Oct 2015 11:05:03.6774 (UTC) X-MS-Exchange-CrossTenant-Id: 710a03f5-10f6-4d38-9ff4-a80b81da590d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=710a03f5-10f6-4d38-9ff4-a80b81da590d;Ip=[192.88.168.50];Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM2PR0301MB0784 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add support of suspend, resume function to support deep sleep. Also make sure of SRAM initialization during resume. Signed-off-by: Raghav Dogra --- drivers/memory/fsl_ifc.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/fsl_ifc.h | 6 ++++++ 2 files changed, 62 insertions(+) diff --git a/drivers/memory/fsl_ifc.c b/drivers/memory/fsl_ifc.c index e87459f..163ccf2 100644 --- a/drivers/memory/fsl_ifc.c +++ b/drivers/memory/fsl_ifc.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -35,6 +36,9 @@ struct fsl_ifc_ctrl *fsl_ifc_ctrl_dev; EXPORT_SYMBOL(fsl_ifc_ctrl_dev); +#define FSL_IFC_V1_3_0 0x01030000 +#define IFC_TIMEOUT_MSECS 100000 /* 100ms */ + /* * convert_ifc_address - convert the base address * @addr_base: base address of the memory bank @@ -308,6 +312,53 @@ err: return ret; } +#ifdef CONFIG_PM_SLEEP +/* save ifc registers */ +static int fsl_ifc_suspend(struct device *dev) +{ + struct fsl_ifc_ctrl *ctrl = dev_get_drvdata(dev); + struct fsl_ifc_regs __iomem *ifc = ctrl->regs; + + ctrl->saved_regs = kzalloc(sizeof(struct fsl_ifc_regs), GFP_KERNEL); + if (!ctrl->saved_regs) + return -ENOMEM; + + _memcpy_fromio(ctrl->saved_regs, ifc, sizeof(struct fsl_ifc_regs)); + + return 0; +} + +/* restore ifc registers */ +static int fsl_ifc_resume(struct device *dev) +{ + struct fsl_ifc_ctrl *ctrl = dev_get_drvdata(dev); + struct fsl_ifc_regs __iomem *ifc = ctrl->regs; + uint32_t ver = 0, ncfgr, status; + + if (ctrl->saved_regs) { + _memcpy_toio(ifc, ctrl->saved_regs, + sizeof(struct fsl_ifc_regs)); + kfree(ctrl->saved_regs); + ctrl->saved_regs = NULL; + } + + ver = in_be32(&ctrl->regs->ifc_rev); + ncfgr = in_be32(&ifc->ifc_nand.ncfgr); + if (ver >= FSL_IFC_V1_3_0) { + out_be32(&ifc->ifc_nand.ncfgr, ncfgr | IFC_NAND_SRAM_INIT_EN); + + /* wait for SRAM_INIT bit to be clear or timeout */ + status = spin_event_timeout(!(in_be32(&ifc->ifc_nand.ncfgr) + & IFC_NAND_SRAM_INIT_EN), + IFC_TIMEOUT_MSECS, 0); + if (!status) + dev_err(ctrl->dev, "Timeout waiting for IFC SRAM INIT"); + } + + return 0; +} +#endif /* CONFIG_PM_SLEEP */ + static const struct of_device_id fsl_ifc_match[] = { { .compatible = "fsl,ifc", @@ -315,10 +366,15 @@ static const struct of_device_id fsl_ifc_match[] = { {}, }; +static const struct dev_pm_ops ifc_pm_ops = { + SET_SYSTEM_SLEEP_PM_OPS(fsl_ifc_suspend, fsl_ifc_resume) +}; + static struct platform_driver fsl_ifc_ctrl_driver = { .driver = { .name = "fsl-ifc", .of_match_table = fsl_ifc_match, + .pm = &ifc_pm_ops, }, .probe = fsl_ifc_ctrl_probe, .remove = fsl_ifc_ctrl_remove, diff --git a/include/linux/fsl_ifc.h b/include/linux/fsl_ifc.h index 0023088..2776df2 100644 --- a/include/linux/fsl_ifc.h +++ b/include/linux/fsl_ifc.h @@ -270,6 +270,8 @@ */ /* Auto Boot Mode */ #define IFC_NAND_NCFGR_BOOT 0x80000000 +/* SRAM INIT EN */ +#define IFC_NAND_SRAM_INIT_EN 0x20000000 /* Addressing Mode-ROW0+n/COL0 */ #define IFC_NAND_NCFGR_ADDR_MODE_RC0 0x00000000 /* Addressing Mode-ROW0+n/COL0+n */ @@ -841,6 +843,10 @@ struct fsl_ifc_ctrl { u32 nand_stat; wait_queue_head_t nand_wait; +#ifdef CONFIG_PM_SLEEP + /* save regs when system go to deep-sleep */ + struct fsl_ifc_regs *saved_regs; +#endif bool little_endian; }; -- 1.9.1