From patchwork Mon Jan 7 08:54:54 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ye Li X-Patchwork-Id: 1021213 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="Lg6C+8fQ"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 43Y8NY0pBQz9s55 for ; Mon, 7 Jan 2019 19:55:09 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id B4BF0C21DE8; Mon, 7 Jan 2019 08:55:00 +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=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 0F497C21CB6; Mon, 7 Jan 2019 08:54:58 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 36DE9C21CB6; Mon, 7 Jan 2019 08:54:56 +0000 (UTC) Received: from EUR04-HE1-obe.outbound.protection.outlook.com (mail-eopbgr70084.outbound.protection.outlook.com [40.107.7.84]) by lists.denx.de (Postfix) with ESMTPS id 819CBC21C6A for ; Mon, 7 Jan 2019 08:54:55 +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=tfeSfW7puspY3i6ZpDRsNuQdcIdadjOzfn/fyex/X0k=; b=Lg6C+8fQJJK6v4HQLRJ0+z7joCYf2NGF4GSzU9vvzCHDSs5ZiHzqxpBKvBCIEWJPY34MHR6ymZM5YFzO760m0IWlHHCXSM2cpD7mQUGWJXWWxg7OzczXzvs7IS28+nE6AcRTCEBxfqp3oCmFLERwCi1tg0uJwvhAJ8XQaR0QNxE= Received: from VI1PR04MB4414.eurprd04.prod.outlook.com (20.177.55.153) by VI1PR04MB4512.eurprd04.prod.outlook.com (20.177.54.96) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1495.6; Mon, 7 Jan 2019 08:54:54 +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:54:54 +0000 From: Ye Li To: "jagan@amarulasolutions.com" , "u-boot@lists.denx.de" Thread-Topic: [PATCH] mtd: qspi: support read the flag status in fspi driver Thread-Index: AQHUpmaoxHqRjYtA6ECzyqkyuWUGHw== Date: Mon, 7 Jan 2019 08:54:54 +0000 Message-ID: <1546851275-22585-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: HK2PR0401CA0006.apcprd04.prod.outlook.com (2603:1096:202:2::16) 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; VI1PR04MB4512; 6:nrYuEXaRY6/cmnK/j5aXFCFlUpPAmLm5lmeku/Sl6aI2UoLVXY9t1TgqRNMNZbyS/5Q0thhJ0264muGGtKnFAwtlz85zTMFMq/8Wt6HPoMMlXUgmDolEqz7geQaIciLQ6iXVeoDQw2cKcrQsaBFEEp2GUbkGG+uSd4/lKvyhuoz68fAoDiwLcUm3+NbFt9AkmT2Ik7Z0dFFsAmlqrybTjhXthUwZ+XkcaKKve5QKN7UdGaETv0lsR9OzZnxR7pSy1rV0RG6yBvhnOs1a2RJwL1+8LD4r99i3nwAP/8/ce2tAhFG8SW2WIkAh4vwOmOCJdq9A0DyZ/sMIMmhxOdVukV3XyLeNi/SYHtN15REXnJxfyGpk2SqWefyEHew5NHpt45md2elEu3SoGW8uC7nJWh7h+RjkAysnrm5QldC7yf9pRQXbkt+tshXKVfv17L57wFi8O05V5tSicV/uC+zj2w==; 5:/+Y+Cj9cs477BNpgD+D1vKubJB5YcIdyaAx/jH432GQ7973ue0gkH/17AF29NqX0NgoX4OaDlASBllF5WnVgRcoPqXVuORFVJRdSyB/S2h4U/q6ExL8//vih0Emjk2VRVrSa0mM1/osS0xqjVtd2+etcRr4GJzrt1GriYoAEce8pDS8dq2EvINGTAgh15dp/pMA01nk0QOCzSCkdOhMV4A==; 7:Hyte5za47PheSXODzDYQMKVVLPFGlkEwikofU/aI3r9Hw2z3wEU0q3+LBsSibbUEgUzdcV4X3Px3KXBuWd7866WF6SOGrxFmJjckL+oijwfPNdSl719MOFGQA75zEIhEs3Wc3y3FlqYHwqH0eF+SSQ== x-ms-office365-filtering-correlation-id: 29212b76-31fe-4290-6300-08d6747dca83 x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: BCL:0; PCL:0; RULEID:(2390118)(7020095)(4652040)(8989299)(5600109)(711020)(4618075)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(2017052603328)(7153060)(7193020); SRVR:VI1PR04MB4512; x-ms-traffictypediagnostic: VI1PR04MB4512: x-microsoft-antispam-prvs: x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(8211001083)(3230021)(908002)(999002)(5005026)(6040522)(8220060)(2401047)(8121501046)(3002001)(3231475)(944501520)(52105112)(93006095)(93001095)(10201501046)(6055026)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123560045)(20161123558120)(20161123562045)(20161123564045)(201708071742011)(7699051)(76991095); SRVR:VI1PR04MB4512; BCL:0; PCL:0; RULEID:; SRVR:VI1PR04MB4512; x-forefront-prvs: 0910AAF391 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(396003)(136003)(39860400002)(366004)(376002)(346002)(199004)(189003)(25786009)(105586002)(86362001)(97736004)(575784001)(106356001)(44832011)(5660300001)(305945005)(256004)(66066001)(7736002)(3846002)(6116002)(478600001)(71200400001)(8936002)(50226002)(8676002)(81166006)(71190400001)(52116002)(2501003)(81156014)(186003)(386003)(6506007)(476003)(2616005)(4326008)(110136005)(316002)(486006)(99286004)(54906003)(36756003)(6436002)(2906002)(68736007)(26005)(6486002)(102836004)(53936002)(6512007)(14454004); DIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR04MB4512; H:VI1PR04MB4414.eurprd04.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX: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: inTXJgcXjRwsd4NI3Lvf+E3RK9do6aCjssGXdL8hcG4HqyecnKw8onOp3c5SrVFD4qwy2wQ2PQVIoHfvjmQXWGUJwfwq/KpiApKzNVRZa3HERvnRrHeF+qtLsxEsg8CDZwMwTj+K6qrEaJ6Fm3XWfKbAh+6o66N2gnHfPBbeiWwj37CSODiE5d2TUXiiZ1b6mO5UgWk8/rqskcavKL+zgvwEJxhWI9sJGu9OicWgctdkf92Q9K3cxDLl6ROcvJLR1gTK6Kri8WQiudrE/qkv1CFQf3XwBOKNgYIqvown58oEZ3RPdnCb1SaMs8ceVDfT spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM MIME-Version: 1.0 X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 29212b76-31fe-4290-6300-08d6747dca83 X-MS-Exchange-CrossTenant-originalarrivaltime: 07 Jan 2019 08:54:50.3877 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR04MB4512 Cc: Fabio Estevam , dl-uboot-imx Subject: [U-Boot] [PATCH] mtd: qspi: support read the flag status in fspi driver 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" From: Han Xu Support to read the flag status in driver to avoid the spi-nor framework wait_for_ready hang issue. Signed-off-by: Han Xu --- drivers/spi/fsl_qspi.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/drivers/spi/fsl_qspi.c b/drivers/spi/fsl_qspi.c index 1987a72..ed0e649 100644 --- a/drivers/spi/fsl_qspi.c +++ b/drivers/spi/fsl_qspi.c @@ -47,6 +47,7 @@ DECLARE_GLOBAL_DATA_PTR; #endif #define SEQID_WRAR 13 #define SEQID_RDAR 14 +#define SEQID_RDFSR 15 /* QSPI CMD */ #define QSPI_CMD_PP 0x02 /* Page program (up to 256 bytes) */ @@ -57,6 +58,7 @@ DECLARE_GLOBAL_DATA_PTR; #define QSPI_CMD_CHIP_ERASE 0xc7 /* Erase whole flash chip */ #define QSPI_CMD_SE 0xd8 /* Sector erase (usually 64KiB) */ #define QSPI_CMD_RDID 0x9f /* Read JEDEC ID */ +#define QSPI_CMD_FLAG_SR 0x70 /* Read FLAG STATUS*/ /* Used for Micron, winbond and Macronix flashes */ #define QSPI_CMD_WREAR 0xc5 /* EAR register write */ @@ -230,6 +232,15 @@ static void qspi_set_lut(struct fsl_qspi_priv *priv) qspi_write32(priv->flags, ®s->lut[lut_base + 2], 0); qspi_write32(priv->flags, ®s->lut[lut_base + 3], 0); + /* Read Flag Status */ + lut_base = SEQID_RDFSR * 4; + qspi_write32(priv->flags, ®s->lut[lut_base], OPRND0(QSPI_CMD_FLAG_SR) | + PAD0(LUT_PAD1) | INSTR0(LUT_CMD) | OPRND1(1) | + PAD1(LUT_PAD1) | INSTR1(LUT_READ)); + qspi_write32(priv->flags, ®s->lut[lut_base + 1], 0); + qspi_write32(priv->flags, ®s->lut[lut_base + 2], 0); + qspi_write32(priv->flags, ®s->lut[lut_base + 3], 0); + /* Erase a sector */ lut_base = SEQID_SE * 4; #ifdef CONFIG_SPI_FLASH_BAR @@ -740,6 +751,40 @@ static void qspi_op_rdsr(struct fsl_qspi_priv *priv, void *rxbuf, u32 len) qspi_write32(priv->flags, ®s->mcr, mcr_reg); } +static void qspi_op_rdfsr(struct fsl_qspi_priv *priv, void *rxbuf, u32 len) +{ + struct fsl_qspi_regs *regs = priv->regs; + u32 mcr_reg, reg, data; + + mcr_reg = qspi_read32(priv->flags, ®s->mcr); + qspi_write32(priv->flags, ®s->mcr, + QSPI_MCR_CLR_RXF_MASK | QSPI_MCR_CLR_TXF_MASK | + mcr_reg); + qspi_write32(priv->flags, ®s->rbct, QSPI_RBCT_RXBRD_USEIPS); + + qspi_write32(priv->flags, ®s->sfar, priv->cur_amba_base); + + qspi_write32(priv->flags, ®s->ipcr, + (SEQID_RDFSR << QSPI_IPCR_SEQID_SHIFT) | 0); + while (qspi_read32(priv->flags, ®s->sr) & QSPI_SR_BUSY_MASK) + ; + + while (1) { + reg = qspi_read32(priv->flags, ®s->rbsr); + if (reg & QSPI_RBSR_RDBFL_MASK) { + data = qspi_read32(priv->flags, ®s->rbdr[0]); + data = qspi_endian_xchg(data); + memcpy(rxbuf, &data, len); + qspi_write32(priv->flags, ®s->mcr, + qspi_read32(priv->flags, ®s->mcr) | + QSPI_MCR_CLR_RXF_MASK); + break; + } + } + + qspi_write32(priv->flags, ®s->mcr, mcr_reg); +} + static void qspi_op_erase(struct fsl_qspi_priv *priv) { struct fsl_qspi_regs *regs = priv->regs; @@ -825,6 +870,8 @@ int qspi_xfer(struct fsl_qspi_priv *priv, unsigned int bitlen, qspi_op_rdid(priv, din, bytes); else if (priv->cur_seqid == QSPI_CMD_RDSR) qspi_op_rdsr(priv, din, bytes); + else if (priv->cur_seqid == QSPI_CMD_FLAG_SR) + qspi_op_rdfsr(priv, din, bytes); #ifdef CONFIG_SPI_FLASH_BAR else if ((priv->cur_seqid == QSPI_CMD_BRRD) || (priv->cur_seqid == QSPI_CMD_RDEAR)) {