From patchwork Tue Jan 30 16:49:29 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yogesh Narayan Gaur X-Patchwork-Id: 867554 X-Patchwork-Delegate: cyrille.pitchen@atmel.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.infradead.org (client-ip=65.50.211.133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="lL/k2Lwn"; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=nxp.com header.i=@nxp.com header.b="kY7vctUn"; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [65.50.211.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zWC7f589Tz9ryT for ; Wed, 31 Jan 2018 03:51:10 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=W0KeuAs3XQFykiP5ef3f+6DrN7tiKf+fkT5y6AOSdjk=; b=lL/k2Lwn0pCLm5 8cHMtMnuAmOjeMm79g9fGWSdxg4JiaKcXyfYgOmG84IL5+aYNQEmyFbjK7kdv6PYC0S9M6TgUpuKH FQ/m86r1Wd4hMR4EkgAaoDMkVkIcVCB22hjTM1yuWS+qBhd2tuNsEDPKPMhvciqO9uHc4oyZVLI5N VJYKdvGU28PrXCkGrn4RMIMZthghfCd1v5+4B5HQbC67SrddO1b4irSSLccJRkn+zlI2rVNTf9Wg5 ZzuMei80izSTXjJ9cgq8jef7n/Wulk1SJoOtcwqN5QOBHAsJH7u0VAwfXdoaV/O3XS95XX+BlkYUl VtaNjIcNLSrnjbvp9fOA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.89 #1 (Red Hat Linux)) id 1egZ7h-0007LN-Mw; Tue, 30 Jan 2018 16:51:05 +0000 Received: from mail-he1eur01on0612.outbound.protection.outlook.com ([2a01:111:f400:fe1e::612] helo=EUR01-HE1-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.89 #1 (Red Hat Linux)) id 1egZ7V-00079w-P8 for linux-mtd@lists.infradead.org; Tue, 30 Jan 2018 16:50:55 +0000 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; bh=kSTymrBf+mK7cUF6EjeDV/cmoLKs6Fmw/nVH/wf2EiI=; b=kY7vctUn7uGqk7GGfHcrNq+K0JPQ1zM1EGPLdsif5uLV2oZOokgvB7xQ7uB3mKmafvt3E1CKl3YZT3jpwIJinLipsEhnk7pYHxy7TIqT4E2hXmYka/hPVfD7BH9D/ZXFL9ORJCE6O2RMi+bUfUOZ7iytkRr4q/0SVRL86C3fGPA= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=yogeshnarayan.gaur@nxp.com; Received: from idcbfarm.ap.freescale.net (192.88.169.1) by DB6PR0402MB2839.eurprd04.prod.outlook.com (2603:10a6:4:98::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.444.14; Tue, 30 Jan 2018 16:50:33 +0000 From: Yogesh Gaur To: linux-mtd@lists.infradead.org Subject: [PATCH v5 1/2] mtd: fsl-quadspi: add support to create dynamic LUT entry Date: Tue, 30 Jan 2018 22:19:29 +0530 Message-Id: <1517330970-15197-2-git-send-email-yogeshnarayan.gaur@nxp.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1517330970-15197-1-git-send-email-yogeshnarayan.gaur@nxp.com> References: <1517330970-15197-1-git-send-email-yogeshnarayan.gaur@nxp.com> MIME-Version: 1.0 X-Originating-IP: [192.88.169.1] X-ClientProxiedBy: BM1PR0101CA0044.INDPRD01.PROD.OUTLOOK.COM (2603:1096:b00:1a::30) To DB6PR0402MB2839.eurprd04.prod.outlook.com (2603:10a6:4:98::11) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 6278c5b2-0b64-4df1-e105-08d568019562 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(4627221)(201703031133081)(201702281549075)(48565401081)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:DB6PR0402MB2839; X-Microsoft-Exchange-Diagnostics: 1; DB6PR0402MB2839; 3:ei1prjDNbqLIjW+fmHHw66wmr9z3Te3oUSLbkZHfiSfC+oB6sPK7myggwtsJcqDPuRRn5xP+gwZrTc0Vjt4lUpJ2hHtMlNLfjcPKQygFkeSH1sDQndGK2/SyYqzvLa8ctlxnxOdq8TcWhK9sX8L2Lr16sV6v9dJqSdN3bQLrJ/8NQQtPcqbHlLbRPEAiScfcEEXB6rzcwBweIOnCBfeQ3mNs6NG6/G48ztkKVald9MfRA0BZBES7U0c87x1o+FPo; 25:06mizShX1TNRCJRJ0MbfxyR9GjV7LrgLBnu/ZW4WXN/3aEnn9LgowleFwYpX7xpxjO/kLKlkiMuyb637mg0HaY2HxKK/e838874eFTmGSvxfeYkPQ6SljI7mygtKuc5+dR7RyoUsdAL5j0rFAIc7kjSUvOvJABmprWfqY7ALIUzdThIzKwezp3LZ/xRn5t5MLAKJM2DYjUzjnBkPGj1p3Th5LA9hIQUxebZUQaaNlAD5eqiBhdH8ZUdxzFwAD/NqoO0P518KcnucygcSQ/SOyh4C3abV7sAp0FlyPnrNWMoCGyY8pixX+/AWiixb6UYXEmZC8UAtKgmMn6wmDgrVxA==; 31:yZBkDqRFLTZBZ6uaAap9f84dowBCxxoIcuvXXFfu/KLrAQIPKD8AyvJ+FwcTycZdbeE8sGLnE16nWPYTLPiyJhv9Z4GQf2/HcGbGlYqua92Sf6S3cx1AWdIPbw1CYDKEoW5wkcIRFEfIRN9unE3Arm2fTyPdWwtLiDHGzeTuG3Cswy77NXWBH1NgP22JwnVZ9p1SyeI2n6OtE4FJPLW/8bMF1bFUX2mKHfbYUQmeK6A= X-MS-TrafficTypeDiagnostic: DB6PR0402MB2839: X-Microsoft-Exchange-Diagnostics: 1; DB6PR0402MB2839; 20:wHaz0ZXFc9Qq2FjnbGNiZMGqO1XCRwgLXHRwK1M4poizXztOPeYdnc0geJssaWbm6/QioEQT8v4R85sg3+0lVSfr4U7T4cB7yAS9Gbsxj5bv91+oCHx4xkUiknI+UXi0rzW/0B1YX7Ye4ZMdZpzYH89cMQUPjNuV+/F+YUI76tobmTSEnQM3D7QneAqQNVgbT+glongSbWUIXSEEDhIXYDLuXGXQGVvV/gg7UcYouKVFI2gjNSLB/96UtR6nMaRZ/y+J5yYEG4h2l3jbtxcprrE9uXcZ7Ranf2num0q3nPIPyiMev0RlddrosWCeao8Nw7RTOHw3kjao6Gx+mgP0PcEiPyeYYcqNu3pChE8Z67Ah3JNcszxXUlU/r1OFXOD5dLCWr6tSBSM5D1qJhH1OiomZORanFnZzf0Ta+zXJ0APB3/qyDKF/UKAyx1w3QgL2A5TaVHHRGs1JmvJ7kZ41oSsOl/FS8l4is2Pd1LhJQCNu+S+zfW35NP/iUPQkaJtJ; 4:EQTj6DY1tXXZHWRtAFPN1fxHS+mGk/LN8/50qXTMhWri8rxp36BnltUi1ujv0JaGAwwjpPhfKS/Fd1/pMNyjSq6H63XQQSZmm8Wh0Ka0PtfDNgqF6A3306ltS5TT/wUzzP7R7e09FWxxGkeB/StcIQx/92cnL/XxBeRyMzlC020efDMU+Sm5z98SiqJgKeIoKyuNMIK7ose48t4xY7nu7emD54g9FR5VHMA9j+8JJyyy0GGxS+oLzNNIEcF35EVwFUPUPr49FVF+Az90D04UKnHJbZYR9rfXkYs0K/84G3lajo9zzeFd+1zWOMd0K6IT X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(8121501046)(5005006)(10201501046)(93006095)(93001095)(3002001)(3231101)(944501161)(6055026)(6041288)(20161123558120)(20161123564045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123560045)(20161123562045)(6072148)(201708071742011); SRVR:DB6PR0402MB2839; BCL:0; PCL:0; RULEID:; SRVR:DB6PR0402MB2839; X-Forefront-PRVS: 0568F32D91 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(366004)(39860400002)(39380400002)(396003)(376002)(346002)(199004)(189003)(16586007)(36756003)(8676002)(97736004)(105586002)(186003)(16526019)(4326008)(39060400002)(6116002)(50466002)(6512007)(53936002)(3846002)(2351001)(81156014)(2361001)(86362001)(316002)(50226002)(8936002)(81166006)(66066001)(6486002)(386003)(6506007)(51416003)(6666003)(2950100002)(106356001)(305945005)(25786009)(52116002)(7736002)(76176011)(47776003)(59450400001)(48376002)(5660300001)(478600001)(2906002)(68736007)(6916009)(26005); DIR:OUT; SFP:1101; SCL:1; SRVR:DB6PR0402MB2839; H:idcbfarm.ap.freescale.net; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: None (protection.outlook.com: nxp.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; DB6PR0402MB2839; 23:tCtSISiNhVLDwSfqkVmmq5xZk5S1OwvJwtxygIL?= bob1WOo84YWI68zRE+FLkxFjIeg7hQdSuND/iryfSSDQhrkPSFe45Lq6fjEQAo2vaki0YJxqbCAxRLT4QmTjYS5gIzaQVOKXuWvCejOu/plsX7e8HmJ+uyOWrcjIEB11IfqrvTsW0JpTW/CClqtSUpJXlvU28N9UaLrvg1x59jOkCb8cc8p9GYhLN21x9gGni0af54nxBjvs8itkWQW2iyljBJp80RchMGIl0lSFGWympAno+6GKFXGy8lrAWrxzmyd2BVWLHiiOYOFN+MjNzaP2J2Q7qTbAEwD7TdfjPUAbd3EC5n1WdOdlgUiZIteviF3XCuenE0xH/fuD1fz5MZ7vsLolZ2KKlaaYm8h+NNVy2D5PawU9aIASC029V2V+CYe2cu74JO4KGimPt5VYjPq5wfRrqxw+OxLpJrm/Ejoy8oZohyNUJZ+GoAMdmC6lxGYUujui8B/3eBDkbfuxSIIPfrEZEZVFud+1YZ54TvO5FPHeivGVabl14QcSsZQhRUvYVqt9RNBzdhVoW5LFg6+UKtGqTlZkxprYEkuTXB1JAbRrMSnBu97liGij74otpci1eBARVMIR4/duPR8FS6tAc084h0upp5vjuhhn38To4vb5ubs3k/hh4L5AEu0ByAOIxCnnsFXjn623SXQUPjyYvlOsRIW0QNmofhUrkjaTx4lmSOwADLbcfuFTPvUH3TmRIOxhMcQiD7wgQVPZqmgaCY0J+YkbJfQLCsbRzWs04mYWWzxgrK8G4EVhxFYOQzfXC2ULFoLdoH62ONVimQqn6Yw3ouIsR2wSbseYwHdG5ypKNaBMux5HE0Wwa/nSSWGEidUbeANah/dinVJxJXeiSLL7cEIUX6RVQS3IeU3uAk0vloztQ61AMPO8yIBSl16XkrBiCokDV64xsUCVregJW4hczcwDOVXfFsD3ZAkeBOA30caErTzvON9+Xm6cyFgTgNbU4nGozSyGEDpvS0gloxcrnxEkJA406ORYoIl65BWEFjdnYd/ZPnZaQe1OYfESOJjtDDufjD29VeTpWZgx+9Zp/pHlDjXdlWETaGImvHVi8uVb7taKNzrcuGiAzoUTbQFHvmO73CrFbyZU8GDYVAPQ0FJGEVPlAXqOkDBK2QGjqNCoMMV/7AAD4ElbGY6M= X-Microsoft-Exchange-Diagnostics: 1; DB6PR0402MB2839; 6:Calw1gB2TDwLsmPoMQx6v/+kyOjkNH9a4HKsFUEKMX3j7g43huAU3Gu1N6BIr+5xV8rsriORsvWZimEWf3qIwvTOjO2/QW579aZHwYxib/oIqAGgwRQpxCCaibh9+Anoaeeusf6B3YAq4BrIDdbC9TgYZu78uzK6hoIztuQWCFc5JYgmNqioKjnn7WdBXd/S0YOdmU7QcdfYT79CJRWh9fmiVJhJcnqxnX6ujB55wYZwReHfu4rkdyR+nnXpZ1V/GjF00MubZ78An5ePZ8bEE/a5YR8H/GK056u4Q7E1g7wOvlP/2pmhWuG5TDBhOVWl41VxNbPjRn6Sw6tNcSfZ0XJPrFArwhtOO+z5jubgZm0=; 5:gCLEmFDAWXXlIMCfJ1PuLcWvFjfwFAjQrbLKlVQs/eAvRpHA0iAWD9s6jGm/FZHWEUCKw27tX/UgXuyzAEPQm4tofkuyNCCWyLgvftg3CIz0gKp2uWvntGujlqLWO268iwq3VcFrVrZJ0sjhfZvJSd3RUvu2P++F8py84zK774c=; 24:oP7YGco7Yhhw6ux/TPx5DOzsV5pOI3bq4wlerC1/aIs4OUM68/il0Nhi73K1amnjlVGL/my+s94W1zQ7O20LzdVb1UXyYAXJ09AJ/xtn0Aw=; 7:atpAnAuO+9fV5jRZL4N3Rmk4BjBlE93i/0lXoVLgylFhJAZ/9b2xOpMfH0jYJD55S6voVpXiF6THrWqkyE+vK+r39vZJYgMuluogfkL5zeI2WqBUjreyKXM/gqLSyOgdF1Z1eygmlc6LwcYpzC8Jaif0sd4GKr3hMnyB96QD4PhsfoJ6T+uLCEcuqVYPsRgFMAh/v6QlmfqDTcqgtlfKBnJzumAcP7VduCGN0BLa95ecEH0vvJ2/U+MRqvyOCPuL SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Jan 2018 16:50:33.4896 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 6278c5b2-0b64-4df1-e105-08d568019562 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB6PR0402MB2839 X-Spam-Note: CRM114 invocation failed X-Spam-Score: -2.0 (--) X-Spam-Report: SpamAssassin version 3.4.1 on bombadil.infradead.org summary: Content analysis details: (-2.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [2a01:111:f400:fe1e:0:0:0:612 listed in] [list.dnswl.org] 0.0 T_SPF_PERMERROR SPF: test of record failed (permerror) -0.0 SPF_HELO_PASS SPF: HELO matches SPF record -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: boris.brezillon@free-electrons.com, Yogesh Gaur , prabhakar.kushwaha@nxp.com, suresh.gupta@nxp.com, cyrille.pitchen@wedev4u.fr, han.xu@nxp.com, computersforpeace@gmail.com, festevam@gmail.com Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org Add support to create dynamic LUT entry. Current approach of creating LUT entries for various cmds like read, write, erase, readid, readsr, we, wd etc is that when QSPI controller gets initialized at that time static LUT entries for these cmds get created. Patch add support to create the LUT at run time based on the operation being performed. Added API fsl_qspi_prepare_lut(), this API would going to be called from fsl_qspi_read_reg, fsl_qspi_write_reg, fsl_qspi_write, fsl_qspi_read and fsl_qspi_erase APIs. This API would fetch required info like opcode, protocol info, dummy info for creating LUT from instance of 'struct spi_nor' and then prepare LUT entry for the required command. Signed-off-by: Yogesh Gaur --- Changes for v5: - Fix LUT preparation for SPINOR_OP_READ and SPINOR_OP_READ_4B cmds. Changes for v4: - Correct version numbering. Changes for v3: - Add STOP instruction for prepared LUT and remove memset of 4 LUT reg. Changes for v2: - Swap patch sequences in the series to solve git bissect issue. drivers/mtd/spi-nor/fsl-quadspi.c | 310 +++++++++++++++++++++----------------- 1 file changed, 168 insertions(+), 142 deletions(-) diff --git a/drivers/mtd/spi-nor/fsl-quadspi.c b/drivers/mtd/spi-nor/fsl-quadspi.c index 89306cf..84c341b 100644 --- a/drivers/mtd/spi-nor/fsl-quadspi.c +++ b/drivers/mtd/spi-nor/fsl-quadspi.c @@ -183,7 +183,7 @@ /* Macros for constructing the LUT register. */ #define LUT0(ins, pad, opr) \ - (((opr) << OPRND0_SHIFT) | ((LUT_##pad) << PAD0_SHIFT) | \ + (((opr) << OPRND0_SHIFT) | ((pad) << PAD0_SHIFT) | \ ((LUT_##ins) << INSTR0_SHIFT)) #define LUT1(ins, pad, opr) (LUT0(ins, pad, opr) << OPRND1_SHIFT) @@ -193,21 +193,21 @@ #define QUADSPI_LUT_NUM 64 /* SEQID -- we can have 16 seqids at most. */ -#define SEQID_READ 0 -#define SEQID_WREN 1 -#define SEQID_WRDI 2 -#define SEQID_RDSR 3 -#define SEQID_SE 4 -#define SEQID_CHIP_ERASE 5 -#define SEQID_PP 6 -#define SEQID_RDID 7 -#define SEQID_WRSR 8 -#define SEQID_RDCR 9 -#define SEQID_EN4B 10 -#define SEQID_BRWR 11 +/* LUT0 programmed by bootloader, for run-time create entry for LUT seqid 1 */ +#define SEQID_LUT0_BOOTLOADER 0 +#define SEQID_LUT1_RUNTIME 1 #define QUADSPI_MIN_IOMAP SZ_4M +enum fsl_qspi_ops { + FSL_QSPI_OPS_READ = 0, + FSL_QSPI_OPS_WRITE, + FSL_QSPI_OPS_ERASE, + FSL_QSPI_OPS_READ_REG, + FSL_QSPI_OPS_WRITE_REG, + FSL_QSPI_OPS_WRITE_BUF_REG, +}; + enum fsl_qspi_devtype { FSL_QUADSPI_VYBRID, FSL_QUADSPI_IMX6SX, @@ -368,136 +368,158 @@ static irqreturn_t fsl_qspi_irq_handler(int irq, void *dev_id) return IRQ_HANDLED; } -static void fsl_qspi_init_lut(struct fsl_qspi *q) +static inline s8 pad_count(s8 pad_val) { + s8 count = -1; + + if (!pad_val) + return 0; + + while (pad_val) { + pad_val >>= 1; + count++; + } + return count; +} + +/* + * Prepare LUT entry for the input cmd. + * Protocol info is present in instance of struct spi_nor, using which fields + * like cmd, data, addrlen along with pad info etc can be parsed. + */ +static void fsl_qspi_prepare_lut(struct spi_nor *nor, + enum fsl_qspi_ops ops, u8 cmd) +{ + struct fsl_qspi *q = nor->priv; void __iomem *base = q->iobase; int rxfifo = q->devtype_data->rxfifo; + int txfifo = q->devtype_data->txfifo; u32 lut_base; - int i; + u8 cmd_pad, addr_pad, data_pad, dummy_pad; + enum spi_nor_protocol protocol = 0; + u8 addrlen = 0; + u8 read_dm, opcode; + int stop_lut; + + read_dm = opcode = cmd_pad = addr_pad = data_pad = dummy_pad = 0; + + switch (ops) { + case FSL_QSPI_OPS_READ_REG: + case FSL_QSPI_OPS_WRITE_REG: + case FSL_QSPI_OPS_WRITE_BUF_REG: + opcode = cmd; + protocol = nor->reg_proto; + break; + case FSL_QSPI_OPS_READ: + opcode = cmd; + read_dm = nor->read_dummy; + protocol = nor->read_proto; + break; + case FSL_QSPI_OPS_WRITE: + opcode = cmd; + protocol = nor->write_proto; + break; + case FSL_QSPI_OPS_ERASE: + opcode = cmd; + break; + default: + dev_err(q->dev, "Unsupported operation 0x%.2x\n", ops); + return; + } + + if (protocol) { + cmd_pad = spi_nor_get_protocol_inst_nbits(protocol); + addr_pad = spi_nor_get_protocol_addr_nbits(protocol); + data_pad = spi_nor_get_protocol_data_nbits(protocol); + } - struct spi_nor *nor = &q->nor[0]; - u8 addrlen = (nor->addr_width == 3) ? ADDR24BIT : ADDR32BIT; - u8 read_op = nor->read_opcode; - u8 read_dm = nor->read_dummy; + dummy_pad = data_pad; + + dev_dbg(q->dev, "ops:%x opcode:%x pad[cmd:%d, addr:%d, data:%d]\n", + ops, opcode, cmd_pad, addr_pad, data_pad); fsl_qspi_unlock_lut(q); - /* Clear all the LUT table */ - for (i = 0; i < QUADSPI_LUT_NUM; i++) - qspi_writel(q, 0, base + QUADSPI_LUT_BASE + i * 4); - - /* Read */ - lut_base = SEQID_READ * 4; - - qspi_writel(q, LUT0(CMD, PAD1, read_op) | LUT1(ADDR, PAD1, addrlen), - base + QUADSPI_LUT(lut_base)); - qspi_writel(q, LUT0(DUMMY, PAD1, read_dm) | - LUT1(FSL_READ, PAD4, rxfifo), - base + QUADSPI_LUT(lut_base + 1)); - - /* Write enable */ - lut_base = SEQID_WREN * 4; - qspi_writel(q, LUT0(CMD, PAD1, SPINOR_OP_WREN), - base + QUADSPI_LUT(lut_base)); - - /* Page Program */ - lut_base = SEQID_PP * 4; - - qspi_writel(q, LUT0(CMD, PAD1, nor->program_opcode) | - LUT1(ADDR, PAD1, addrlen), - base + QUADSPI_LUT(lut_base)); - qspi_writel(q, LUT0(FSL_WRITE, PAD1, 0), - base + QUADSPI_LUT(lut_base + 1)); - - /* Read Status */ - lut_base = SEQID_RDSR * 4; - qspi_writel(q, LUT0(CMD, PAD1, SPINOR_OP_RDSR) | - LUT1(FSL_READ, PAD1, 0x1), - base + QUADSPI_LUT(lut_base)); - - /* Erase a sector */ - lut_base = SEQID_SE * 4; - - qspi_writel(q, LUT0(CMD, PAD1, nor->erase_opcode) | - LUT1(ADDR, PAD1, addrlen), - base + QUADSPI_LUT(lut_base)); - - /* Erase the whole chip */ - lut_base = SEQID_CHIP_ERASE * 4; - qspi_writel(q, LUT0(CMD, PAD1, SPINOR_OP_CHIP_ERASE), - base + QUADSPI_LUT(lut_base)); - - /* READ ID */ - lut_base = SEQID_RDID * 4; - qspi_writel(q, LUT0(CMD, PAD1, SPINOR_OP_RDID) | - LUT1(FSL_READ, PAD1, 0x8), - base + QUADSPI_LUT(lut_base)); - - /* Write Register */ - lut_base = SEQID_WRSR * 4; - qspi_writel(q, LUT0(CMD, PAD1, SPINOR_OP_WRSR) | - LUT1(FSL_WRITE, PAD1, 0x2), - base + QUADSPI_LUT(lut_base)); - - /* Read Configuration Register */ - lut_base = SEQID_RDCR * 4; - qspi_writel(q, LUT0(CMD, PAD1, SPINOR_OP_RDCR) | - LUT1(FSL_READ, PAD1, 0x1), - base + QUADSPI_LUT(lut_base)); - - /* Write disable */ - lut_base = SEQID_WRDI * 4; - qspi_writel(q, LUT0(CMD, PAD1, SPINOR_OP_WRDI), - base + QUADSPI_LUT(lut_base)); - - /* Enter 4 Byte Mode (Micron) */ - lut_base = SEQID_EN4B * 4; - qspi_writel(q, LUT0(CMD, PAD1, SPINOR_OP_EN4B), - base + QUADSPI_LUT(lut_base)); - - /* Enter 4 Byte Mode (Spansion) */ - lut_base = SEQID_BRWR * 4; - qspi_writel(q, LUT0(CMD, PAD1, SPINOR_OP_BRWR), - base + QUADSPI_LUT(lut_base)); + /* Dynamic LUT */ + lut_base = SEQID_LUT1_RUNTIME * 4; - fsl_qspi_lock_lut(q); -} + /* default, STOP instruction to be programmed in (lut_base + 1) reg */ + stop_lut = 1; + switch (ops) { + case FSL_QSPI_OPS_READ_REG: + qspi_writel(q, LUT0(CMD, pad_count(cmd_pad), opcode) | + LUT1(FSL_READ, pad_count(data_pad), rxfifo), + base + QUADSPI_LUT(lut_base)); + break; + case FSL_QSPI_OPS_WRITE_REG: + qspi_writel(q, LUT0(CMD, pad_count(cmd_pad), opcode), + base + QUADSPI_LUT(lut_base)); + break; + case FSL_QSPI_OPS_WRITE_BUF_REG: + qspi_writel(q, LUT0(CMD, pad_count(cmd_pad), opcode) | + LUT1(FSL_WRITE, pad_count(data_pad), txfifo), + base + QUADSPI_LUT(lut_base)); + break; + case FSL_QSPI_OPS_READ: + case FSL_QSPI_OPS_WRITE: + case FSL_QSPI_OPS_ERASE: + /* Common for Read, Write and Erase ops. */ -/* Get the SEQID for the command */ -static int fsl_qspi_get_seqid(struct fsl_qspi *q, u8 cmd) -{ - switch (cmd) { - case SPINOR_OP_READ_1_1_4: - return SEQID_READ; - case SPINOR_OP_WREN: - return SEQID_WREN; - case SPINOR_OP_WRDI: - return SEQID_WRDI; - case SPINOR_OP_RDSR: - return SEQID_RDSR; - case SPINOR_OP_SE: - return SEQID_SE; - case SPINOR_OP_CHIP_ERASE: - return SEQID_CHIP_ERASE; - case SPINOR_OP_PP: - return SEQID_PP; - case SPINOR_OP_RDID: - return SEQID_RDID; - case SPINOR_OP_WRSR: - return SEQID_WRSR; - case SPINOR_OP_RDCR: - return SEQID_RDCR; - case SPINOR_OP_EN4B: - return SEQID_EN4B; - case SPINOR_OP_BRWR: - return SEQID_BRWR; + addrlen = (nor->addr_width == 3) ? ADDR24BIT : ADDR32BIT; + + qspi_writel(q, LUT0(CMD, pad_count(cmd_pad), opcode) | + LUT1(ADDR, pad_count(addr_pad), addrlen), + base + QUADSPI_LUT(lut_base)); + /* + * For Erase ops - Data and Dummy not required. + * For Write ops - Dummy not required. + */ + + if (ops == FSL_QSPI_OPS_READ) { + + /* + * For cmds SPINOR_OP_READ and SPINOR_OP_READ_4B value + * of dummy cycles are 0. + */ + if (read_dm) + qspi_writel(q, + LUT0(DUMMY, pad_count(dummy_pad), + read_dm) | + LUT1(FSL_READ, pad_count(data_pad), + rxfifo), + base + QUADSPI_LUT(lut_base + 1)); + else + qspi_writel(q, + LUT0(FSL_READ, pad_count(data_pad), + rxfifo), + base + QUADSPI_LUT(lut_base + 1)); + + stop_lut = 2; + + /* TODO Add condition to check if READ is IP/AHB. */ + + /* For AHB read, add seqid in BFGENCR register. */ + qspi_writel(q, + SEQID_LUT1_RUNTIME << + QUADSPI_BFGENCR_SEQID_SHIFT, + q->iobase + QUADSPI_BFGENCR); + } + + if (ops == FSL_QSPI_OPS_WRITE) { + qspi_writel(q, LUT0(FSL_WRITE, pad_count(data_pad), 0), + base + QUADSPI_LUT(lut_base + 1)); + stop_lut = 2; + } + break; default: - if (cmd == q->nor[0].erase_opcode) - return SEQID_SE; - dev_err(q->dev, "Unsupported cmd 0x%.2x\n", cmd); + dev_err(q->dev, "Unsupported operation 0x%.2x\n", ops); break; } - return -EINVAL; + + /* prepare LUT for STOP instruction. */ + qspi_writel(q, 0, base + QUADSPI_LUT(lut_base + stop_lut)); + + fsl_qspi_lock_lut(q); } static int @@ -532,7 +554,7 @@ static int fsl_qspi_get_seqid(struct fsl_qspi *q, u8 cmd) } while (1); /* trigger the LUT now */ - seqid = fsl_qspi_get_seqid(q, cmd); + seqid = SEQID_LUT1_RUNTIME; qspi_writel(q, (seqid << QUADSPI_IPCR_SEQID_SHIFT) | len, base + QUADSPI_IPCR); @@ -684,8 +706,8 @@ static void fsl_qspi_init_ahb_read(struct fsl_qspi *q) qspi_writel(q, 0, base + QUADSPI_BUF1IND); qspi_writel(q, 0, base + QUADSPI_BUF2IND); - /* Set the default lut sequence for AHB Read. */ - seqid = fsl_qspi_get_seqid(q, q->nor[0].read_opcode); + /* Set dynamic LUT entry as lut sequence for AHB Read . */ + seqid = SEQID_LUT1_RUNTIME; qspi_writel(q, seqid << QUADSPI_BFGENCR_SEQID_SHIFT, q->iobase + QUADSPI_BFGENCR); } @@ -728,7 +750,6 @@ static int fsl_qspi_nor_setup(struct fsl_qspi *q) void __iomem *base = q->iobase; u32 reg; int ret; - /* disable and unprepare clock to avoid glitch pass to controller */ fsl_qspi_clk_disable_unprep(q); @@ -746,9 +767,6 @@ static int fsl_qspi_nor_setup(struct fsl_qspi *q) base + QUADSPI_MCR); udelay(1); - /* Init the LUT table. */ - fsl_qspi_init_lut(q); - /* Disable the module */ qspi_writel(q, QUADSPI_MCR_MDIS_MASK | QUADSPI_MCR_RESERVED_MASK, base + QUADSPI_MCR); @@ -791,9 +809,6 @@ static int fsl_qspi_nor_setup_last(struct fsl_qspi *q) if (ret) return ret; - /* Init the LUT table again. */ - fsl_qspi_init_lut(q); - /* Init for AHB read */ fsl_qspi_init_ahb_read(q); @@ -820,6 +835,7 @@ static int fsl_qspi_read_reg(struct spi_nor *nor, u8 opcode, u8 *buf, int len) int ret; struct fsl_qspi *q = nor->priv; + fsl_qspi_prepare_lut(nor, FSL_QSPI_OPS_READ_REG, opcode); ret = fsl_qspi_runcmd(q, opcode, 0, len); if (ret) return ret; @@ -834,6 +850,8 @@ static int fsl_qspi_write_reg(struct spi_nor *nor, u8 opcode, u8 *buf, int len) int ret; if (!buf) { + /* Prepare LUT for WRITE_REG cmd with input BUF as NULL. */ + fsl_qspi_prepare_lut(nor, FSL_QSPI_OPS_WRITE_REG, opcode); ret = fsl_qspi_runcmd(q, opcode, 0, 1); if (ret) return ret; @@ -842,6 +860,8 @@ static int fsl_qspi_write_reg(struct spi_nor *nor, u8 opcode, u8 *buf, int len) fsl_qspi_invalid(q); } else if (len > 0) { + /* Prepare LUT for WRITE_REG cmd with input BUF non-NULL. */ + fsl_qspi_prepare_lut(nor, FSL_QSPI_OPS_WRITE_BUF_REG, opcode); ret = fsl_qspi_nor_write(q, nor, opcode, 0, (u32 *)buf, len); if (ret > 0) @@ -858,8 +878,11 @@ static ssize_t fsl_qspi_write(struct spi_nor *nor, loff_t to, size_t len, const u_char *buf) { struct fsl_qspi *q = nor->priv; - ssize_t ret = fsl_qspi_nor_write(q, nor, nor->program_opcode, to, - (u32 *)buf, len); + ssize_t ret; + + fsl_qspi_prepare_lut(nor, FSL_QSPI_OPS_WRITE, nor->program_opcode); + ret = fsl_qspi_nor_write(q, nor, nor->program_opcode, to, + (u32 *)buf, len); /* invalid the data in the AHB buffer. */ fsl_qspi_invalid(q); @@ -872,6 +895,8 @@ static ssize_t fsl_qspi_read(struct spi_nor *nor, loff_t from, struct fsl_qspi *q = nor->priv; u8 cmd = nor->read_opcode; + fsl_qspi_prepare_lut(nor, FSL_QSPI_OPS_READ, nor->read_opcode); + /* if necessary,ioremap buffer before AHB read, */ if (!q->ahb_addr) { q->memmap_offs = q->chip_base_addr + from; @@ -920,6 +945,7 @@ static int fsl_qspi_erase(struct spi_nor *nor, loff_t offs) dev_dbg(nor->dev, "%dKiB at 0x%08x:0x%08x\n", nor->mtd.erasesize / 1024, q->chip_base_addr, (u32)offs); + fsl_qspi_prepare_lut(nor, FSL_QSPI_OPS_ERASE, nor->erase_opcode); ret = fsl_qspi_runcmd(q, nor->erase_opcode, offs, 0); if (ret) return ret; From patchwork Tue Jan 30 16:49:30 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yogesh Narayan Gaur X-Patchwork-Id: 867555 X-Patchwork-Delegate: cyrille.pitchen@atmel.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.infradead.org (client-ip=65.50.211.133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="Er8p2Uv7"; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=nxp.com header.i=@nxp.com header.b="c2tgbkCQ"; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [65.50.211.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zWC7t5jxgz9ryv for ; Wed, 31 Jan 2018 03:51:22 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=/3QaDO61ltXgYN+lezrJE5/ISDEup9F33XbbaU0+EpY=; b=Er8p2Uv7zeW93O wTik2C2n2iJXQjxzn+4tPnLdzfcWz3ON+GhPn3Zd71571Ai3esjV4r21dVw3rKrTSK/VkAhc+4kpe X+W7jBqAfJafr9w0bDA7WFey7taiJy2LJgHNQf/Zj/cJpT2ul6gum0IuU/ZfSw7y6X/npdniwHJMs +asDFd1mwBGeJHQykwHQxdl3lRZ9OTMTtUVGGcseREwMj2E9i6TGaHJTbJ+4TAo29ErvhU5OrsvlH p7FQQZ2ah0h+Ut2kY/oVY4/8WlC/PGEP45ngJOYxqLSJ3ICsYD4bOkzMamuJOfV33bVKYIXPKKf5s MH0Qf+cz7b1SeFbv8Ddw==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.89 #1 (Red Hat Linux)) id 1egZ7t-0007aZ-Pp; Tue, 30 Jan 2018 16:51:17 +0000 Received: from mail-he1eur01on0612.outbound.protection.outlook.com ([2a01:111:f400:fe1e::612] helo=EUR01-HE1-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.89 #1 (Red Hat Linux)) id 1egZ7Y-00079w-G7 for linux-mtd@lists.infradead.org; Tue, 30 Jan 2018 16:50:58 +0000 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; bh=LpWY45B4Acz4HQ4aqNfBvs+GAIkQO/q8UW3tsCo/5lM=; b=c2tgbkCQwUlIbEiz3qlBxM79zjMlRPxawqkuY0niaEJ0W2ywgr6ggwl6oC9vRDE9mhdIGYbfzQZOqmUqY6YMZUQ+erl789xU9P0MnlAUSOhNEnfj1Ug6piOcI+6hwQsqVtJ2BptGF4Rh8ih5j6dM+1KT2nUFUMWGYfkzUJpyJhY= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=yogeshnarayan.gaur@nxp.com; Received: from idcbfarm.ap.freescale.net (192.88.169.1) by DB6PR0402MB2839.eurprd04.prod.outlook.com (2603:10a6:4:98::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.444.14; Tue, 30 Jan 2018 16:50:35 +0000 From: Yogesh Gaur To: linux-mtd@lists.infradead.org Subject: [PATCH v5 2/2] mtd: fsl-quadspi: fix init AHB read in fsl_qspi_nor_setup() Date: Tue, 30 Jan 2018 22:19:30 +0530 Message-Id: <1517330970-15197-3-git-send-email-yogeshnarayan.gaur@nxp.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1517330970-15197-1-git-send-email-yogeshnarayan.gaur@nxp.com> References: <1517330970-15197-1-git-send-email-yogeshnarayan.gaur@nxp.com> MIME-Version: 1.0 X-Originating-IP: [192.88.169.1] X-ClientProxiedBy: BM1PR0101CA0044.INDPRD01.PROD.OUTLOOK.COM (2603:1096:b00:1a::30) To DB6PR0402MB2839.eurprd04.prod.outlook.com (2603:10a6:4:98::11) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 385f00e9-fcd9-402f-e626-08d5680196ab X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(4627221)(201703031133081)(201702281549075)(48565401081)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:DB6PR0402MB2839; X-Microsoft-Exchange-Diagnostics: 1; DB6PR0402MB2839; 3:3JSEk2n+hX6yH5U0cIfdyL2YjLppNrHFWlUNHKkpNFEwhE2msJz48B7LXznH2Y01CNtGAsaaYZ8raiqMOYJ0XAeyGxMAMhJpxmsCiIDs03k28HtOsH7bROjXGxZ0d5l2rYbeQa/KyBRZqdxPy4mjCl0A1OChuSUC/KOlbQGY+ueLu7xQL2CbZHMJm9lkmx4SfXS+oF/5KWkh51dcWNfHFQ5eZY56wH5OwZVOZZ0R780w19qonhD/S0gJAt9KfH6L; 25:lnBwE0UlqdRbgNaBpPbHY+D5okutzlGkrqEfyRwROK5LY7us9Grc4wfarG1rP/5awWVl2NDbYH2PpMJpHff6upheU6AXyg/qgAuNEhFYkmf0BzxUxd4+vPMkQITwW+rE5qpCsfcO4MxCdSKNYP2Z7L8+6WmaX/1+skaS35sMUA6cxSpk2yo35mZuSOWj6MA6P+4sissWXa+8oVyv9Ko4UODiZBZl/vblJZXV6qM+3NFrrB76mCTcZYHJjMQ/jGe70aByQxBW0MlDzucYc9se2StVV0qGBM2fyAYUDQIPtotrE4DjitYbnqZ9Kh+odtRScY71XOosRC7nwCBHHt1uVQ==; 31:uKUBM09NvslfcTta4ATSl3+kh//hXjyPe5OBE3/b4H2gWuHjVPybGRPcbP0Y4cRO6WDpcFMA1cBmAIeWGIGruxWUUNoYrumTEj41mPCUMd2yEV8FH3ufX6UBcYLPVadkvBOPqqY4vzwKYaTgZ1/BD+Yh7kDwn/Thl+l2qNxr9gYK6Ef6ilvoQNVl51sCq+iBs7YZPujGY/5aysRlgjpGKIlVojB2TH2RenxV4KKhhQY= X-MS-TrafficTypeDiagnostic: DB6PR0402MB2839: X-Microsoft-Exchange-Diagnostics: 1; DB6PR0402MB2839; 20:Yhm5KKQfS2iUqupJaCC2tnDOVdevGN/ilDnJIUMc/wnQMG/D+13vedexbTWmwSTTrEpPuYW8+M1VD0ckmWA2817tSw0l6AA4JcfMRGyXg0cgHz3Xn4EiO8RKQFS2Jc5niMOty5im2MdERKkcf3OjHJriTXDgWTrgEivtSJRG3JBKPFQX7iUdSwS5hj7iUgcKM6eeegKH2uAV+9qUZPzDQ/A1OGQjs5kRW7V5pCGxcYVel4LIbYYvLYZOgMmviPD8WFGEwZRL0HRBCI1yQYZXLtEUW9FOyuvehCY3aiInLnpAdy4SScIoRsByuKsmGklGQOS1/tHKljvaD5B2QMlauuHOENTC1ZdjnfjCrb11HaAbu16VAzdHqD2KJOPqYvw+ndD4LyxQAf37PyPq5N1ImBrjhjy7xDfUwzSMdeUgCC2BpFJjIyCW4mfbGR6WY/+o9/b0P8bWxJPQvRXONhmB2HivWtcaBYtl2IyNcFg5KIYsAX2nCKowwJNTrzXBbFI4; 4:ZvQVoOdHxAuO1vtC0haFQ8EEfmI1keYTqOdeqvMQSzpslyyEdYCMYnLLjyxs1eqwlCASyS+gFqiqYUygtfmcNJt9lvmCSNxCaodqSgqSaHaf0tr9PpbSCwIDvLtuDDKpA+MTcsmaa1I52rOHxMWB6WtrUEbNgwK2xgTo4WUj2X+MKHQAIdV3QP18MuP2fHidMo+hhlRshL4d9J0TRkB59fJlgD8FVV2c0M57t7aMNzgBm2gIMQAxVAAi9X5ktNifOmP9+oqegh36tOcmiTUUS3q9E6Zubg//L5z2uwxKaVVJ6pDMqedji8I85b+8i+QoXvmD0W62EeC5LM5PtdeMO+rqt3+TmE3LrjMN94LDUhA= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197)(17755550239193); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(8121501046)(5005006)(10201501046)(93006095)(93001095)(3002001)(3231101)(944501161)(6055026)(6041288)(20161123558120)(20161123564045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123560045)(20161123562045)(6072148)(201708071742011); SRVR:DB6PR0402MB2839; BCL:0; PCL:0; RULEID:; SRVR:DB6PR0402MB2839; X-Forefront-PRVS: 0568F32D91 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(366004)(39860400002)(39380400002)(396003)(376002)(346002)(199004)(189003)(16586007)(36756003)(8676002)(97736004)(105586002)(186003)(16526019)(4326008)(39060400002)(6116002)(50466002)(6512007)(53936002)(3846002)(2351001)(81156014)(2361001)(86362001)(316002)(50226002)(8936002)(81166006)(66066001)(6486002)(386003)(6506007)(51416003)(6666003)(2950100002)(106356001)(305945005)(25786009)(52116002)(7736002)(76176011)(47776003)(48376002)(5660300001)(478600001)(2906002)(68736007)(6916009)(26005); DIR:OUT; SFP:1101; SCL:1; SRVR:DB6PR0402MB2839; H:idcbfarm.ap.freescale.net; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: None (protection.outlook.com: nxp.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; DB6PR0402MB2839; 23:DE+DY/somn4rAaj4EnRpWq/MOTMybM4XE/YBCzZ?= Df3/CRqiaO0eyA39NymMsd+1YjyX1sHVwDMBNwGZ4Pd/BU6fVyHIH0f/zTtNaIODrlCHCokbA8gkivRRWRVUKAhcC+fewcTd/gF7vv8C1ysVTzxE+pxs1ddlRCF8Cvt8YoPDIpuzUqzlgy2Of8sghKZXcpuboIVAlsCMJTWvcOvtTBt2fDVVneURvh6ddtJ1I4+e0vSxqT9IGwxRJu9JixROIY7xK5c/ISX0kQQL51U9MKpvAZYDJkTZ9gIru1Y3HlhXkyRbmYMUjBB80PS2UuWqvz0dhG6GqSfkZ/mVIgOXdgtoSZ0AUZf+fg7iRWPrRWhXIlb6pY/P5jX2dqPBDPiE05LhmQKMsoe4k8ZFZ20KjvW5gBcc9xKfKyifVqokT0/MF/KZAG/hPn8yIhCCweg9ETDCe5LGvW4Mdjs/7LBf1TKK/YmbV33vY4G7CA/lbSsWNLf/drsiWlXsaHiM76bpAEZzSZ5N5mytZmI5H8JbK9iiVddjNClTPy0dgVRGW/I3tvKtt+kItFN9S0MeKcjjY/h9r3GHJ+KyiZ9/rtSH7Fx6vvntL4rZO347cbbH9Ohfl2OHLMaaSXz7+i4PlTnMQblPkVYPHPs+5YzIUB1dHqGiop2RGvP2AnH8uvdATiWC1PL57BpKUpx2DegSRve1WH7JLdNblqyEiVDcKukNmpyE9eF2CgJ4a8iBeL7WI98rplGiWk7vgTFChBG8ZO+vAF5LkGf6r+6bT44jUrabD7OIrYt4nyruIEg6CC7WLh1wNc0/IGdgMPqdBq+JYOJhw+PT0P9UUSoM4JvJu3JJfGROVC9Y82zEvcHAXpkejigUzkASlsvaYR8Y7f6jzZ4INsPSQkcRA+DnMqB6eBLu9pstS0emG5TVFVDowd/A8UpjDUBF8j/TYItDbZ59HJqrI/XNI3iXth6DuV0SQyKSoWGFYn7971WzMZHYzWgwrm5WG9MbqR52JnAUA+2eBQM+UQ5CYeYXj/E3x+26YgGNWI1TI6nOioJ2JIrTEmDhpkb7AV0RR6mKoXCqeQzgWaTCEf7pTwbm0GVS9yuyuDHB4zeoygi2g+DZPvimzayaF2QoI4e3vAtTCfNYSPbFgdBsd4jXY2XJj1edrP5PPFdKiig== X-Microsoft-Exchange-Diagnostics: 1; DB6PR0402MB2839; 6:ojmGqkamyJ64TwrAkSV7nwogFu1RwbZ5iTQP7HIsElOtpxQEkKmLWPSgrqvhQBmktmVVSRNexcxPrht8lXQ/V85uwQZ3sdIGW84JvQgeFkPRF5MKRQ5fIXNrUwtD4CFHMKwiVkxX5C1k5Ar+OxI1dQ8qWZlMjP7wFrbY7EYy4LqYPxijvYICTQvicbQzcuIRf6eEu413mN+ZGLD3coWhgTAU4/yGQMigbuNV1hCS4W06Jv4tWhLVPOjwlMvct9FXpNKAJKG8jPwbAtQRxziT/kn11TgphSd8xXIJt6qTItoDl+s6fPomfOKmoYSCH/paaKX4/0xh6LQLpLwJTKkMKwh8oTm3zRRKMQLEWQmTEVs=; 5:Xqibxtq+QxQfJX7omPZhKihypke9ZQ2Qg8NH4YyLGbWnLWhcitM/PC5WX8ESRmvM/W1oUPaiaLkDA1QMJ69PsMTHuk321ViZizpbg60k/lgPwMZE0kZ8itlQwEIVY61j/22pa3jxEaRI1fshrqe4lXBr++ECLhHYbdSJngqCSTc=; 24:tg5kciYHfiNBPV4lVw0Fik3bpNaNll7uucM1kJwi6mmM/6rG240nfRoMvakWNJXH/qv+uGO10PrslsLxTyFZrkHAQvlaqa1sVl7ugeyA7kY=; 7:UdREka/ZGvnyI+OKpwJ6nXxf7Gj4EnewRN8Q1o9SDcOheEKmsp/IegRVmHFvfVI7oQpknyTr20u8JmXwxgpvj/59J0KLouQDR1Q7zhbJq1B615JT4hxWO4ecopxdDsJOBN0K/XITNJPqD1hEQ7piOwm17HCJ8Hq++w+9VWB+Ubjyw0f3M+2gfMevFOuMHdZZB21+hVh+SFPDRuKcHJj8dWnEfWOyTFMT9iIvv4N31PSxvIm7GBwaw7VSg6jmvfgr SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Jan 2018 16:50:35.6615 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 385f00e9-fcd9-402f-e626-08d5680196ab X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB6PR0402MB2839 X-Spam-Note: CRM114 invocation failed X-Spam-Score: -2.0 (--) X-Spam-Report: SpamAssassin version 3.4.1 on bombadil.infradead.org summary: Content analysis details: (-2.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [2a01:111:f400:fe1e:0:0:0:612 listed in] [list.dnswl.org] 0.0 T_SPF_PERMERROR SPF: test of record failed (permerror) -0.0 SPF_HELO_PASS SPF: HELO matches SPF record -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: boris.brezillon@free-electrons.com, Yogesh Gaur , prabhakar.kushwaha@nxp.com, suresh.gupta@nxp.com, cyrille.pitchen@wedev4u.fr, han.xu@nxp.com, computersforpeace@gmail.com, festevam@gmail.com Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org Move AHB read initialize in fsl_qspi_nor_setup(). In file spi-nor.c, func spi_nor_scan() calls nor->read() thru spi_nor_read_sfdp() API. Presently, fsl_qspi_init_ahb_read() called from fsl_qspi_nor_setup_last(). Func fsl_qspi_probe() calls spi_nor_scan() first and then calls fsl_qspi_nor_setup_last(). When nor->read() being called from inside spi_nor_read_sfdp(), QSPI cntlr AHB mode initialization is not yet done results in data read error. Initialize AHB read inside fsl_qspi_nor_setup(). Signed-off-by: Yogesh Gaur --- Changes for v5: - None Changes for v4: - None Changes for v3: - None Changes for v2: - None drivers/mtd/spi-nor/fsl-quadspi.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/mtd/spi-nor/fsl-quadspi.c b/drivers/mtd/spi-nor/fsl-quadspi.c index 84c341b..2b3b3eb 100644 --- a/drivers/mtd/spi-nor/fsl-quadspi.c +++ b/drivers/mtd/spi-nor/fsl-quadspi.c @@ -787,6 +787,9 @@ static int fsl_qspi_nor_setup(struct fsl_qspi *q) /* enable the interrupt */ qspi_writel(q, QUADSPI_RSER_TFIE, q->iobase + QUADSPI_RSER); + /* Init for AHB read */ + fsl_qspi_init_ahb_read(q); + return 0; } @@ -809,9 +812,6 @@ static int fsl_qspi_nor_setup_last(struct fsl_qspi *q) if (ret) return ret; - /* Init for AHB read */ - fsl_qspi_init_ahb_read(q); - return 0; }