From patchwork Tue Aug 4 15:25:58 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Han Xu X-Patchwork-Id: 503661 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2001:1868:205::9]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 2492E140E62 for ; Wed, 5 Aug 2015 01:36:54 +1000 (AEST) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZMeFQ-00035B-5n; Tue, 04 Aug 2015 15:35:24 +0000 Received: from merlin.infradead.org ([2001:4978:20e::2]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZMeEB-0000ag-Bi for linux-mtd@bombadil.infradead.org; Tue, 04 Aug 2015 15:34:07 +0000 Received: from mail-bn1bon0113.outbound.protection.outlook.com ([157.56.111.113] helo=na01-bn1-obe.outbound.protection.outlook.com) by merlin.infradead.org with esmtps (Exim 4.85 #2 (Red Hat Linux)) id 1ZMeEA-0002oc-1O for linux-mtd@lists.infradead.org; Tue, 04 Aug 2015 15:34:06 +0000 Received: from BLUPR03MB549.namprd03.prod.outlook.com (10.141.76.17) by BLUPR03MB357.namprd03.prod.outlook.com (10.141.75.151) with Microsoft SMTP Server (TLS) id 15.1.231.11; Tue, 4 Aug 2015 15:33:58 +0000 Received: from BY2PR03CA006.namprd03.prod.outlook.com (10.255.93.23) by BLUPR03MB549.namprd03.prod.outlook.com (10.141.76.17) with Microsoft SMTP Server (TLS) id 15.1.225.19; Tue, 4 Aug 2015 15:33:58 +0000 Received: from BL2FFO11FD013.protection.gbl (10.255.93.4) by BY2PR03CA006.outlook.office365.com (10.255.93.23) with Microsoft SMTP Server (TLS) id 15.1.225.19 via Frontend Transport; Tue, 4 Aug 2015 15:33:57 +0000 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; Received-SPF: Fail (protection.outlook.com: domain of freescale.com does not designate 192.88.168.50 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.168.50; helo=tx30smr01.am.freescale.net; Received: from tx30smr01.am.freescale.net (192.88.168.50) by BL2FFO11FD013.mail.protection.outlook.com (10.173.160.221) with Microsoft SMTP Server (TLS) id 15.1.243.9 via Frontend Transport; Tue, 4 Aug 2015 15:33:56 +0000 Received: from chopperman.am.freescale.net (chopperman.am.freescale.net [10.81.16.64]) by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id t74FXuUJ026438; Tue, 4 Aug 2015 08:33:56 -0700 From: Han Xu To: Subject: [PATCH v4 07/10] mtd: spi-nor: fsl-quadspi: i.MX6SX: fixed the random QSPI access failed issue Date: Tue, 4 Aug 2015 10:25:58 -0500 Message-ID: <1438701958-27163-1-git-send-email-b45815@freescale.com> X-Mailer: git-send-email 1.9.1 X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1; BL2FFO11FD013; 1:udSUc/nyrfhJKnkzhfN39I3uuVsle5j+kCjPymqzcVX1OGzI8BQ4QXEtH4iO29BfmGnJAcvXv81rNWJjV+shbomyYx4Nd6sRzrp5L6x1AQYawsw5cqoM6L7FHF7rZuoMYnxQyWUG1AIIDumIQMtR/noQqh3q7RSmgw/F/ZGkZ0jZRBy4YxiMxRW7klYEOtDB6Cl/HAPc5ZNJPxcEBDXPHcKWOSeHqbAwbK9eXqAga70XRtlptuvyt1fO3qQBff52FpK5+HUtfYKbfp2zojhGbteHzkG0WKGCOYxbBVgnmwGySqvVCxSQ3phJlYBEJrIBTAPw/cqluvoXnNeRsHQ9Eg== X-Forefront-Antispam-Report: CIP:192.88.168.50; CTRY:US; IPV:NLI; EFV:NLI; SFV:NSPM; SFS:(10019020)(6009001)(2980300002)(339900001)(189002)(199003)(50466002)(36756003)(107886002)(77156002)(229853001)(5001830100001)(106466001)(97736004)(5001960100002)(2351001)(5001860100001)(33646002)(110136002)(189998001)(4001540100001)(5003940100001)(105606002)(50986999)(62966003)(81156007)(50226001)(6806004)(47776003)(46102003)(19580395003)(87936001)(64706001)(104016003)(85426001)(48376002)(68736005)(92566002)(77096005)(19580405001)(4001430100001); DIR:OUT; SFP:1102; SCL:1; SRVR:BLUPR03MB549; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; MX:1; A:1; LANG:en; MIME-Version: 1.0 X-Microsoft-Exchange-Diagnostics: 1; BLUPR03MB549; 2:cjqrLn2rznY1qx7JmC1/mQoDldLMLMn2ck/hh6gPdgAhzUgE6seIR+kOWPS+JUvavJ0yDJkpuZuC4MmBWZgS+mS1VGw24oV1IIzflheibCeCOCbo6J4aOCw9hwFsHrkyLII7XFi1KKsvJR6gq7Fnoi3e9pOek6za5jaWv2ESbNI=; 3:2PIm8Z4T44s12ipDQRV0BA2LVja8rwTEWK9znlBspZrZ85ZuJxNqCMrPh+h7amEGZiiOpNkV5MwoPbeBUXPdooevkoA5iKb8PRg9E3dEtNZkx6IiHucYGThG+WNBmEgo2l3wcuyzktwpmzA6r4A7MDQ6Q+eraTBMN5m0MNCkDBLZK656gxQnYrjaHYI/XiK49Aw2lnGDwlCkn1YMYL8f+uDv+I8FjTfCYLmApI0vPu0=; 25:35gwPwtna1oYUqT48VQq7QGnlAZ2UgP3VqPIqeeJYzjoJfcN8NgBslFYp3XgE9bA2mTeZ8iR4yYcXdFP1AwfZUrJDYYODtrYMLAtHiCTl6DxxK1Mrp7Fm3i8RSIPIT9hL3A18Vcply62wXTKoCqXKA67aDtFhmnDbHFS+IAxGE957wSYlmsu6PwXaJYePkDm/yFmlZrGE7JoNbpsQta+MvuIRj1pTJruMOCiHPyXe5BP4ucFG0NwkugRG7k0exKzRg8NNkum6AaF4ob+gEYkEQ== X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:; SRVR:BLUPR03MB549; UriScan:; BCL:0; PCL:0; RULEID:; SRVR:BLUPR03MB357; X-Microsoft-Exchange-Diagnostics: 1; BLUPR03MB549; 20:9qKLyvzlg+nwGADU1vQc0NXXbKz3ioRIYknFMu8IGhNxYaa02LGggnzB4YJD3oLMu7en2yBTG+OzZUi3VwsA1m+wvIwfw/8R/LtgawjIAEULke5DqYESruUNpvVMUp/V0e49o3TgIBSfXQebs6cNXgcy/KQ5054oXhOktrElkNnAkjYAtLBuSGhJVv/3VN+eqz+SUPoImEwHxijKawURr0lK8AWbSNAD18qSTapyulyFOitAeJXMHkI86tKVOsivKHR+QpKNE8IVu8AfcB85IHWeMkaHT3wwsV/wy8K5FN4L8zrZ/EnJz/5rivtgLDAuGgTPclZus5tx8ErM+wnfFuVKVp/LGRNAR1Ln4XGRwM0=; 4:CXSK97f4nKc88EDSQAx9UZuXSqp9OPuoExioI3UhiiC+s/bskJNdBBXe7XS8Ti98Obge5BBgiirrWan6UqMfu8W9O/I59diWeALPEl91tOIS24vKlYa4zeRPoFm4DRZEPrI2MZsWTzA/FyvGP3fOKu2JwYFdXPn8Ww267IEnARvRdkDZPfq79sG257ZpssH4ZGARNqU5hXRSebbY51nTv5bRvERmx3bu8i+Honp5PlR39PAbC4SscpkyB53BdV8uYth6pcEtaVVW3i1oN8h9mh2197HmCodzPihiYKGRCFw= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(5005006)(3002001); SRVR:BLUPR03MB549; BCL:0; PCL:0; RULEID:; SRVR:BLUPR03MB549; X-Forefront-PRVS: 0658BAF71F X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BLUPR03MB549; 23:5oBNRcgeHCSZMTgznjVdcn3Z2tepKkwHe1mNTGzN3s?= =?us-ascii?Q?Ogg0j2EEO8euTwl9Q7/e/KrcEua0MqLjRUE8N3LeStnUWDCea6agV7EK1wLf?= =?us-ascii?Q?BZItOwefxXkutOpuLjiZvqo05Ks6vdSx21zclEflR4Zoy0eDsiNMPqgKmgXu?= =?us-ascii?Q?YdVL226l0BAIA/4RW1l3xfgS5tfdhAbgVSk8GsZoRLvxAGLyLHwGe1DoIUQv?= =?us-ascii?Q?HAzE7KhCLMVPIO07FdLdgI7aKRgEFEVaOesj1lqigmu2xpMBb26TZNvOWrCp?= =?us-ascii?Q?JdgrPNHkbnz+NgUeXqkD+/zf6vNy1IFB9BEJGNrHvd2x5n/bbYh2zyIZ/GnN?= =?us-ascii?Q?fzNVtYORS+sHl8Dw81E+gPtKfunnxzu0se0M+wZltw8oxF3rq2q9Nfn9URJU?= =?us-ascii?Q?zoEkixC8Rp7MF9+f3QYDgRG4yz2uGhwdrUkl1ch7eJNDleCOPxRoepAg8TTk?= =?us-ascii?Q?VrX3+WW9dGwfoWAZ+xQretr+WAegDWN7+7u3KgeoA+DU+YjxhfX2Ub04huKi?= =?us-ascii?Q?X26PP6gBoGXKOTt3+NrF1WPAhV9cm+075lzP1/B9wa24vVZBJx8DbigOBnCx?= =?us-ascii?Q?IxT3+EQGeOiJAHjKBtEOxjZ/1m8Lp8P5hK/3ytcPhDa8+4idqPIV4/xImv5s?= =?us-ascii?Q?Hn1VdLE8+xBwwpoWsCDzgdvkWWyT4NPktIjnEWe6+4sncr+onuBLxliJUx2X?= =?us-ascii?Q?cHLnONvAnB0ippQmv5vkmejYABvEAngY1DlMNocV3Urv8Q9SGLnxsJetCLDY?= =?us-ascii?Q?Udfbd/DZlgf5Yfr1FwUB7pyQG9kZBaPTMjFb6R5g+g4rGmnZ/zZrAS2HBd3M?= =?us-ascii?Q?b5Yx2MUm/uU68a54E3HkELh5h52mXqg4MnsDl5pAFOGN7usBGz4Tw4cRBs5J?= =?us-ascii?Q?yJAPc4C3jN+FJHRVgTi3LoU9T4gOwA7mB48ahoPneFLqshK7MVrH+A8KhSpl?= =?us-ascii?Q?ayOeEZ8TmgYgmxppYqOG3HcqAxJbywXXA+TteXeXaCo435bxUANgvDbr/xQe?= =?us-ascii?Q?9OvYhKdVcl9izGGVRiWGtn0uS/purB3bwNfhy8/Dd6POiIH19j87b1c6vjH9?= =?us-ascii?Q?gAxYw7VIgX2dlEDr3Y4Tsek4id?= X-Microsoft-Exchange-Diagnostics: 1; BLUPR03MB549; 5:uLcRrbNV8mb8Z6rUAS+x50CL/KYC/eEd8sXRVNI5COqPHrPUPjQhO88B+E6MfJ9b0RhajTDZdDuwF6DyWh1FpazHgFLdyyJMEA1qs7wk7/5DKXsjT73fM2T/JGJbVrv+yToturps7qEoRce4xY3sdg==; 24:6MKSB2N1KdtNiJFx9waM4OwK8pgApk6whGgZPGnZAPf7cIEaOwGvpct/EY9GtyQHJDs393bLjW/NwZeyKC8MkmnvlTicE6zRL3ex2eLmiH0=; 20:BmD3lBsd7vGznllzUwXAAICV+exljWAePL2lkCd9Pi9iUbymSA3VMOHFYhw4RhoPV9e1kz2C49BjGpflA6wQqQ== X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Aug 2015 15:33:56.7996 (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: BLUPR03MB549 X-Microsoft-Exchange-Diagnostics: 1; BLUPR03MB357; 2:tYX2+GkkfTWjFaaTsrJ6Mr6QepFjPiH57oYTzyM2qMu1GuhLBliKux9KHQcMzkrQ9LxlUAqYSankzWvHKCgq+jWij06DIj0oNGacdDinQmrOFrJN0CjF3L3HqhW3V3oDnJGPsRfgp3EmIXr6yFJkS3P1slq+3xUOn5DZ7jCYsxU=; 3:nT9GPsmbrEZ9KTjbsDvGJFBBhFkqY6MIp6sWGfoEg7kSYqgknRtADesEv3CS0pLLaad5LVuRf/S2NuNPwUA9Kztf5netfTJoAkaePuuh4O+Qh1q0E8BzPTWUSqQuN+UJK6LW8IEh+zmVmDPnZ34UMVxc2Z1bwJCmoEXU5nneBPyveECwsTBZuS9iB0iD/drhS+D9EgeuZVMhdMWyHIn3pjg0jdt3mYZ5/uEggh1JXWo=; 25:zEAGUEY9pWSPuSZ/OqMuau5sA3aNbd9yGXiv1AzhhHKiygtBwj+gu03T7xLcNaWHnl1Dw/YIp+9f++6nKgZIrcuVEX2IR8EsRQ274g6Xp8vJj8PN0ouW9hzYi2NiaJXJuD5lmf72BkvXd9eoKMguehiBtAa8T32QP45b8FtuZ8YmJXguwS4emPvWfMOv/FCA/uDDtwdXFfsukIqg3sVa83v7L5ukmVujRKbkakkZMsudFD1P3n/8uVHRfveYmFCnt//8yEMZtYzukt2zE0976A==; 23:2pEpzJ5NRls/gGGmFuLZ5OCmtdltasFCdIuPXQbUJJt20fsqWbI92A6tcFzZ4/73wEhV5mbIdmvOd5FZ3aGLbeFfdlOhweslhMwf5LjCGFH5FYZ0G1QO2FUymT8bleV4uOW2z5/aVRziDEbRL+l5dxIdH6S43qA/Ftb0UGrwtjRiS1jcHzdwT5CBmXlA/V52 X-OriginatorOrg: freescale.com X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20150804_113406_130755_EC8224CF X-CRM114-Status: GOOD ( 27.37 ) X-Spam-Score: -1.9 (-) X-Spam-Report: SpamAssassin version 3.4.1 on merlin.infradead.org summary: Content analysis details: (-1.9 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [157.56.111.113 listed in list.dnswl.org] -0.0 RCVD_IN_MSPIKE_H2 RBL: Average reputation (+2) [157.56.111.113 listed in wl.mailspike.net] -0.0 SPF_HELO_PASS SPF: HELO matches SPF record -0.0 SPF_PASS SPF: sender matches SPF record -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: frank.li@freescale.com, linux-mtd@lists.infradead.org, han.xu@freescale.com Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org From: Allen Xu We found there is a low probability(5%) QSPI access timeout issue, usually it happened on kernel boot stage, the first time kernel tried to access QSPI chip. The READ_ID command was sent but not executed, consequently the probe function failed. The root cause is that the divider is not glitchless in i.MX6SX chip. If qspi clock enabled then change clock frequency by call clk_set_rate, there will be glitch at low possiblity rate and pass to qspi controller. The controler will be hang by this glitch. Based on the new clock flag(CLK_SET_RATE_GATE) and new framework, we need to change the approach of seting clock rate. 1. Disable clock. 2. call clk_set_rate. 3. Enable clock again. Signed-off-by: Han Xu Signed-off-by: Frank Li --- Change from v3 to v4: -change the commit message to describe the issue -add comments to explain why to disable the clock Change from v2 to v3: Resend whole serial patch drivers/mtd/spi-nor/fsl-quadspi.c | 81 +++++++++++++++++++++++++++------------ 1 file changed, 56 insertions(+), 25 deletions(-) diff --git a/drivers/mtd/spi-nor/fsl-quadspi.c b/drivers/mtd/spi-nor/fsl-quadspi.c index a327e2d..93b7943 100644 --- a/drivers/mtd/spi-nor/fsl-quadspi.c +++ b/drivers/mtd/spi-nor/fsl-quadspi.c @@ -655,6 +655,32 @@ static void fsl_qspi_init_abh_read(struct fsl_qspi *q) q->iobase + QUADSPI_BFGENCR); } +/* This function was used to prepare and enable QSPI clock */ +static int fsl_qspi_clk_prep_enable(struct fsl_qspi *q) +{ + int ret; + + ret = clk_prepare_enable(q->clk_en); + if (ret) + return ret; + + ret = clk_prepare_enable(q->clk); + if (ret) { + clk_disable_unprepare(q->clk_en); + return ret; + } + + return 0; +} + +/* This function was used to disable and unprepare QSPI clock */ +static void fsl_qspi_clk_disable_unprep(struct fsl_qspi *q) +{ + clk_disable_unprepare(q->clk); + clk_disable_unprepare(q->clk_en); + +} + /* We use this function to do some basic init for spi_nor_scan(). */ static int fsl_qspi_nor_setup(struct fsl_qspi *q) { @@ -662,11 +688,18 @@ static int fsl_qspi_nor_setup(struct fsl_qspi *q) u32 reg; int ret; - /* the default frequency, we will change it in the future.*/ + /* disable and unprepare clock to avoid glitch pass to controller*/ + fsl_qspi_clk_disable_unprep(q); + + /* the default frequency, we will change it in the future. */ ret = clk_set_rate(q->clk, 66000000); if (ret) return ret; + ret = fsl_qspi_clk_prep_enable(q); + if (ret) + return ret; + /* Init the LUT table. */ fsl_qspi_init_lut(q); @@ -698,10 +731,17 @@ static int fsl_qspi_nor_setup_last(struct fsl_qspi *q) if (needs_4x_clock(q)) rate *= 4; + /* disable and unprepare clock to avoid glitch pass to controller */ + fsl_qspi_clk_disable_unprep(q); + ret = clk_set_rate(q->clk, rate); if (ret) return ret; + ret = fsl_qspi_clk_prep_enable(q); + if (ret) + return ret; + /* Init the LUT table again. */ fsl_qspi_init_lut(q); @@ -844,22 +884,16 @@ static int fsl_qspi_prep(struct spi_nor *nor, enum spi_nor_ops ops) int ret; mutex_lock(&q->lock); - ret = clk_enable(q->clk_en); - if (ret) - goto err_mutex; - ret = clk_enable(q->clk); + ret = fsl_qspi_clk_prep_enable(q); if (ret) - goto err_clk; + goto err_mutex; fsl_qspi_set_base_addr(q, nor); return 0; -err_clk: - clk_disable(q->clk_en); err_mutex: mutex_unlock(&q->lock); - return ret; } @@ -867,8 +901,7 @@ static void fsl_qspi_unprep(struct spi_nor *nor, enum spi_nor_ops ops) { struct fsl_qspi *q = nor->priv; - clk_disable(q->clk); - clk_disable(q->clk_en); + fsl_qspi_clk_disable_unprep(q); mutex_unlock(&q->lock); } @@ -918,15 +951,9 @@ static int fsl_qspi_probe(struct platform_device *pdev) if (IS_ERR(q->clk)) return PTR_ERR(q->clk); - ret = clk_prepare_enable(q->clk_en); + ret = fsl_qspi_clk_prep_enable(q); if (ret) { - dev_err(dev, "cannot enable the qspi_en clock: %d\n", ret); - return ret; - } - - ret = clk_prepare_enable(q->clk); - if (ret) { - dev_err(dev, "cannot enable the qspi clock: %d\n", ret); + dev_err(dev, "can not enable the clock\n"); goto clk_failed; } @@ -1032,8 +1059,7 @@ static int fsl_qspi_probe(struct platform_device *pdev) if (ret) goto last_init_failed; - clk_disable(q->clk); - clk_disable(q->clk_en); + fsl_qspi_clk_disable_unprep(q); return 0; last_init_failed: @@ -1046,9 +1072,9 @@ last_init_failed: mutex_failed: mutex_destroy(&q->lock); irq_failed: - clk_disable_unprepare(q->clk); + fsl_qspi_clk_disable_unprep(q); clk_failed: - clk_disable_unprepare(q->clk_en); + dev_err(dev, "Freescale QuadSPI probe failed\n"); return ret; } @@ -1069,8 +1095,6 @@ static int fsl_qspi_remove(struct platform_device *pdev) writel(0x0, q->iobase + QUADSPI_RSER); mutex_destroy(&q->lock); - clk_unprepare(q->clk); - clk_unprepare(q->clk_en); if (q->ahb_addr) iounmap(q->ahb_addr); @@ -1085,12 +1109,19 @@ static int fsl_qspi_suspend(struct platform_device *pdev, pm_message_t state) static int fsl_qspi_resume(struct platform_device *pdev) { + int ret; struct fsl_qspi *q = platform_get_drvdata(pdev); + ret = fsl_qspi_clk_prep_enable(q); + if (ret) + return ret; + fsl_qspi_nor_setup(q); fsl_qspi_set_map_addr(q); fsl_qspi_nor_setup_last(q); + fsl_qspi_clk_disable_unprep(q); + return 0; }