From patchwork Mon Jan 7 08:45:36 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ye Li X-Patchwork-Id: 1021202 X-Patchwork-Delegate: jagannadh.teki@gmail.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=nxp.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=nxp.com header.i=@nxp.com header.b="tEYwd0hv"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 43Y89n5Vnyz9s7h for ; Mon, 7 Jan 2019 19:45:47 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 19DFBC21DD9; Mon, 7 Jan 2019 08:45:42 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RCVD_IN_MSPIKE_H2, SPF_HELO_PASS, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id 22A44C21CB6; Mon, 7 Jan 2019 08:45:40 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id B1767C21CB6; Mon, 7 Jan 2019 08:45:38 +0000 (UTC) Received: from EUR03-DB5-obe.outbound.protection.outlook.com (mail-eopbgr40069.outbound.protection.outlook.com [40.107.4.69]) by lists.denx.de (Postfix) with ESMTPS id 0736DC21C6A for ; Mon, 7 Jan 2019 08:45:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=cE3l/q6F91ETW9Df5gh7sYCFU9fkn06i1P8pUt/4UX0=; b=tEYwd0hvAu7J1uW7ucu8k7ABFuInx4JvKwdGHzAY74s7SYDsohdrxkcwT8MSUnWRy7uu4+GTfAprCSPjd09iBdKy94y/7fXd7GAtwIYzMg4vlaQOPtCkluarHGPhBjnq0aCaMYD7ADa+5n5vOLxyjFTFKpgJL3OKbglQigATh9Y= Received: from VI1PR04MB4414.eurprd04.prod.outlook.com (20.177.55.153) by VI1PR04MB5725.eurprd04.prod.outlook.com (20.178.127.23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1495.7; Mon, 7 Jan 2019 08:45:36 +0000 Received: from VI1PR04MB4414.eurprd04.prod.outlook.com ([fe80::f1e0:df54:f9c:b4b9]) by VI1PR04MB4414.eurprd04.prod.outlook.com ([fe80::f1e0:df54:f9c:b4b9%3]) with mapi id 15.20.1495.011; Mon, 7 Jan 2019 08:45:36 +0000 From: Ye Li To: "jagan@amarulasolutions.com" , "u-boot@lists.denx.de" Thread-Topic: [PATCH] spi: qspi: Fix issue when booting with DDR mode Thread-Index: AQHUpmVbiht28dtxM0uE5jM+tqxTnw== Date: Mon, 7 Jan 2019 08:45:36 +0000 Message-ID: <1546850714-21142-1-git-send-email-ye.li@nxp.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-mailer: git-send-email 2.7.4 x-clientproxiedby: HK2PR0302CA0009.apcprd03.prod.outlook.com (2603:1096:202::19) To VI1PR04MB4414.eurprd04.prod.outlook.com (2603:10a6:803:6e::25) authentication-results: spf=none (sender IP is ) smtp.mailfrom=ye.li@nxp.com; x-ms-exchange-messagesentrepresentingtype: 1 x-originating-ip: [119.31.174.68] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; VI1PR04MB5725; 6:dM5ECncPY4ru0HxaRDwA/3vm0dwy6BilEeaBrPKfplBGUbvfni25Lzsppn7MYu1tvpJAQAFltENEZ4sk2t16JBbbhICOdZi/Ib5IBg/j/rBP6mzw6zgVTtIZPqJtEjTRgA3/3kz6RjH2c0vkTQwwlGByyKq2QMRwfMuJQ7kFoxgHWi4Pzzw3kid+Rn9F6uSHYSZGKca4Pu49xmH1GsiYIBa34ro++aWsmUDnn9cypVR3/fIqHflZ/xRHqMa6AY16cqQ508ESrOiCIWod2aelCkZYG98YAiWYfV+DCy+BSL9pvtgaYms9enTFvve5o6cJhBcdrzRjp1T3rAKsFjUvDCGS1UAuwdzbPTLyA5ykqyMqirDSJgxOt2ztHPtvbLVAy3e2PUiU9Yl5Cv7VfVsp8zjQ1pvzGXi7l2BeFF/djdzkmuiS94hPblCU7g9YBQHbcJQO/cFMna+lQYDEcPboug==; 5:6YCjfEb/zYpOOte0Q2biATi4Exk6p1Po698ARCY8E9PNn+IyXYIhSEEAH+ivw8yphVaBpLKqy9RhFMypf2pYQtVLVxnnMhchXJ1mP/ngBZIVv9YCiBvWmvNMkxuwzkZO6jFOFfeDffBIja7RphzclT0T3glxINNuWWaLZc2I0YvDfUgX6tVtTqXFFP7BZ+0oXF39TPZGMfH8b2aeIn8TgQ==; 7:9arUG+dduIxFaM4NYYsf1xbh5E5t2cMgxPnAS7jAvM5Qp/xQQwACJALMA8DY2kFDivZtSJyOG3AD/LPOUaCEtqVDpZlge5GnJZvM4nG7sD6zsbiaNSVIADGx+X4HDUYSgGSOL/MqAdybP/CUvGFDWA== x-ms-office365-filtering-correlation-id: 1e5ee4f0-fdbb-477c-3729-08d6747c7e23 x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: BCL:0; PCL:0; RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600109)(711020)(4618075)(2017052603328)(7153060)(7193020); SRVR:VI1PR04MB5725; x-ms-traffictypediagnostic: VI1PR04MB5725: x-microsoft-antispam-prvs: x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(8211001083)(3230021)(908002)(999002)(5005026)(6040522)(8220060)(2401047)(8121501046)(10201501046)(93006095)(93001095)(3231475)(944501520)(52105112)(3002001)(6055026)(6041310)(20161123560045)(20161123564045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123562045)(201708071742011)(7699051)(76991095); SRVR:VI1PR04MB5725; BCL:0; PCL:0; RULEID:; SRVR:VI1PR04MB5725; x-forefront-prvs: 0910AAF391 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(346002)(396003)(39860400002)(366004)(136003)(376002)(189003)(199004)(6512007)(68736007)(99286004)(36756003)(71190400001)(71200400001)(386003)(102836004)(26005)(53936002)(6436002)(305945005)(105586002)(3846002)(186003)(106356001)(6116002)(7736002)(2616005)(8936002)(478600001)(50226002)(476003)(6506007)(52116002)(6486002)(81156014)(486006)(81166006)(14454004)(256004)(44832011)(2501003)(8676002)(86362001)(66066001)(97736004)(110136005)(5660300001)(316002)(4326008)(2906002)(54906003)(25786009); DIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR04MB5725; H:VI1PR04MB4414.eurprd04.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; received-spf: None (protection.outlook.com: nxp.com does not designate permitted sender hosts) x-ms-exchange-senderadcheck: 1 x-microsoft-antispam-message-info: va3wHmjE0qiEirrDYx2TErXyCmGHSx4qSfHN7ksMMEHPee+T2goKYOxdqPlgCxHLcPupqlg9XukCkM5HCbjpWwv1dsM8L0Uwna53WRuoKCy0VplVn9NIW5fCs1i7ZoJYqqmrGMIy2KNouEoUSK56s47MgXd0ZMn6Nvgc9VDcD5fJofSUqIktA60klUD7QRicZk0dyA/BhV7zhh0XFfwKkZOupsQznpe57bZHNm549cQjvhfyPawh1qMPJL+veAxigl8tKg529yj4zJ7l9G0IvtmvEXOGJLqTewVpZl0rPouIxGUUVye2w8BszmYsUpkB spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM MIME-Version: 1.0 X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 1e5ee4f0-fdbb-477c-3729-08d6747c7e23 X-MS-Exchange-CrossTenant-originalarrivaltime: 07 Jan 2019 08:45:33.0975 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR04MB5725 Cc: Fabio Estevam , dl-uboot-imx Subject: [U-Boot] [PATCH] spi: qspi: Fix issue when booting with DDR mode X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" When booting from QSPI NOR with DDR mode enabled on i.MX7D/6UL, the FLSHCR TDH bit is set to 1 by ROM along with MCR DDR_EN bit set. But the read/write/readid/erase operations in the driver will overwrite the MCR register, and cause the bits like DDR_EN are cleared. If the DDR_EN is cleared but TDH is set, there is no clk2x output for TX data shift. So these operations above will fail. Fix the issue in two aspects: 1. In read/write/readid/erase operations, only set useful bit to MCR, not overwrite the whole register. 2. Set the TDH to 1 in qspi_enable_ddr_mode, so that DDR_EN and TDH will be correctly set by this function. Signed-off-by: Ye Li --- drivers/spi/fsl_qspi.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/drivers/spi/fsl_qspi.c b/drivers/spi/fsl_qspi.c index 1598c4f..1987a72 100644 --- a/drivers/spi/fsl_qspi.c +++ b/drivers/spi/fsl_qspi.c @@ -405,7 +405,7 @@ static inline void qspi_ahb_read(struct fsl_qspi_priv *priv, u8 *rxbuf, int len) qspi_write32(priv->flags, ®s->mcr, QSPI_MCR_CLR_RXF_MASK | QSPI_MCR_CLR_TXF_MASK | - QSPI_MCR_RESERVED_MASK | QSPI_MCR_END_CFD_LE); + mcr_reg); rx_addr = (void *)(uintptr_t)(priv->cur_amba_base + priv->sf_addr); /* Read out the data directly from the AHB buffer. */ @@ -435,6 +435,12 @@ static void qspi_enable_ddr_mode(struct fsl_qspi_priv *priv) reg |= BIT(29); qspi_write32(priv->flags, ®s->mcr, reg); + + /* Enable the TDH to 1 for i.mx6ul and mx7d, it is reserved on other platforms */ + reg = qspi_read32(priv->flags, ®s->flshcr); + reg &= ~(BIT(17)); + reg |= BIT(16); + qspi_write32(priv->flags, ®s->flshcr, reg); } /* @@ -488,7 +494,7 @@ static void qspi_op_rdbank(struct fsl_qspi_priv *priv, u8 *rxbuf, u32 len) mcr_reg = qspi_read32(priv->flags, ®s->mcr); qspi_write32(priv->flags, ®s->mcr, QSPI_MCR_CLR_RXF_MASK | QSPI_MCR_CLR_TXF_MASK | - QSPI_MCR_RESERVED_MASK | QSPI_MCR_END_CFD_LE); + mcr_reg); qspi_write32(priv->flags, ®s->rbct, QSPI_RBCT_RXBRD_USEIPS); qspi_write32(priv->flags, ®s->sfar, priv->cur_amba_base); @@ -533,7 +539,7 @@ static void qspi_op_rdid(struct fsl_qspi_priv *priv, u32 *rxbuf, u32 len) mcr_reg = qspi_read32(priv->flags, ®s->mcr); qspi_write32(priv->flags, ®s->mcr, QSPI_MCR_CLR_RXF_MASK | QSPI_MCR_CLR_TXF_MASK | - QSPI_MCR_RESERVED_MASK | QSPI_MCR_END_CFD_LE); + mcr_reg); qspi_write32(priv->flags, ®s->rbct, QSPI_RBCT_RXBRD_USEIPS); qspi_write32(priv->flags, ®s->sfar, priv->cur_amba_base); @@ -579,7 +585,7 @@ static void qspi_op_read(struct fsl_qspi_priv *priv, u32 *rxbuf, u32 len) mcr_reg = qspi_read32(priv->flags, ®s->mcr); qspi_write32(priv->flags, ®s->mcr, QSPI_MCR_CLR_RXF_MASK | QSPI_MCR_CLR_TXF_MASK | - QSPI_MCR_RESERVED_MASK | QSPI_MCR_END_CFD_LE); + mcr_reg); qspi_write32(priv->flags, ®s->rbct, QSPI_RBCT_RXBRD_USEIPS); to_or_from = priv->sf_addr + priv->cur_amba_base; @@ -631,7 +637,7 @@ static void qspi_op_write(struct fsl_qspi_priv *priv, u8 *txbuf, u32 len) mcr_reg = qspi_read32(priv->flags, ®s->mcr); qspi_write32(priv->flags, ®s->mcr, QSPI_MCR_CLR_RXF_MASK | QSPI_MCR_CLR_TXF_MASK | - QSPI_MCR_RESERVED_MASK | QSPI_MCR_END_CFD_LE); + mcr_reg); qspi_write32(priv->flags, ®s->rbct, QSPI_RBCT_RXBRD_USEIPS); status_reg = 0; @@ -706,7 +712,7 @@ static void qspi_op_rdsr(struct fsl_qspi_priv *priv, void *rxbuf, u32 len) mcr_reg = qspi_read32(priv->flags, ®s->mcr); qspi_write32(priv->flags, ®s->mcr, QSPI_MCR_CLR_RXF_MASK | QSPI_MCR_CLR_TXF_MASK | - QSPI_MCR_RESERVED_MASK | QSPI_MCR_END_CFD_LE); + mcr_reg); qspi_write32(priv->flags, ®s->rbct, QSPI_RBCT_RXBRD_USEIPS); qspi_write32(priv->flags, ®s->sfar, priv->cur_amba_base); @@ -743,7 +749,7 @@ static void qspi_op_erase(struct fsl_qspi_priv *priv) mcr_reg = qspi_read32(priv->flags, ®s->mcr); qspi_write32(priv->flags, ®s->mcr, QSPI_MCR_CLR_RXF_MASK | QSPI_MCR_CLR_TXF_MASK | - QSPI_MCR_RESERVED_MASK | QSPI_MCR_END_CFD_LE); + mcr_reg); qspi_write32(priv->flags, ®s->rbct, QSPI_RBCT_RXBRD_USEIPS); to_or_from = priv->sf_addr + priv->cur_amba_base;