From patchwork Mon Mar 20 11:25:47 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Artur Jedrysek X-Patchwork-Id: 740948 X-Patchwork-Delegate: cyrille.pitchen@atmel.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org 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 3vmtwD2V31z9rxl for ; Mon, 20 Mar 2017 22:27:40 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="EaigM503"; dkim-atps=neutral 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=SQioYmTAsS1TYMyjHrCP8IpH84Bmd43Z7TWxPUjnLAs=; b=EaigM503aw/yYM n1mh80M/2D1ABmUH3spz8co0D+FHD75cTdW1nlMnquV06E9Tj/aQNyDE1T/XnKwR9WTi1h35722cU p/4e4ZQ82lLnmr6CjI7R2GlXeml32U0If40HptIjChSLZmkM8cnpDEtF+d2sgDsbTjfT/ZDTy5Tzy baxVRpVWhk+Npazkm8Seh85vSrSxhuSBhRgUFc9JYW87B5c87bfl0JXxrlqkDKzWDx3n4a31Iq1Z9 T9Ga5dt8wLjopObTbdn0VmPTkJZW+7FGQN/hDaYWXQP7iYEq9S3RlXnrYa+Oxzj04Ph543FBMrY2I ZCL0zADEIo9y0n8mBM5Q==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.87 #1 (Red Hat Linux)) id 1cpvTJ-0007Mn-0F; Mon, 20 Mar 2017 11:27:33 +0000 Received: from mx0a-0014ca01.pphosted.com ([208.84.65.235]) by bombadil.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1cpvSs-0006zX-UR for linux-mtd@lists.infradead.org; Mon, 20 Mar 2017 11:27:09 +0000 Received: from pps.filterd (m0042385.ppops.net [127.0.0.1]) by mx0a-0014ca01.pphosted.com (8.16.0.20/8.16.0.20) with SMTP id v2KBLT5V027480; Mon, 20 Mar 2017 04:26:17 -0700 Received: from mx-sanjose.cadence.com (mx-sanjose.Cadence.COM [158.140.2.60]) by mx0a-0014ca01.pphosted.com with ESMTP id 29ae2qg3c2-1 (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NOT); Mon, 20 Mar 2017 04:26:17 -0700 Received: from maileu3.global.cadence.com (maileu3.Cadence.COM [10.160.88.99]) by mx-sanjose.cadence.com (8.14.4/8.14.4) with ESMTP id v2KBPNkG001227 (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=FAIL); Mon, 20 Mar 2017 04:25:25 -0700 (PDT) X-CrossPremisesHeadersFilteredBySendConnector: maileu3.global.cadence.com Received: from maileu3.global.cadence.com (10.160.88.99) by maileu3.global.cadence.com (10.160.88.99) with Microsoft SMTP Server (TLS) id 15.0.1044.25; Mon, 20 Mar 2017 12:26:14 +0100 Received: from lvloginb.cadence.com (10.165.177.11) by maileu3.global.cadence.com (10.160.88.99) with Microsoft SMTP Server (TLS) id 15.0.1044.25 via Frontend Transport; Mon, 20 Mar 2017 12:26:14 +0100 Received: from lvloginb.cadence.com (localhost [127.0.0.1]) by lvloginb.cadence.com (8.14.4/8.14.4) with ESMTP id v2KBQ8Pl002416; Mon, 20 Mar 2017 11:26:08 GMT Received: (from jartur@localhost) by lvloginb.cadence.com (8.14.4/8.14.4/Submit) id v2KBQ8MA002415; Mon, 20 Mar 2017 11:26:08 GMT From: Artur Jedrysek To: Subject: [PATCH v3, 2/4] mtd: spi-nor: Add Octal SPI support to Cadence QSPI driver. Date: Mon, 20 Mar 2017 11:25:47 +0000 Message-ID: <1490009147-2032-1-git-send-email-jartur@cadence.com> X-Mailer: git-send-email 2.2.2 In-Reply-To: <1490008935-28900-1-git-send-email-jartur@cadence.com> References: <1490008935-28900-1-git-send-email-jartur@cadence.com> MIME-Version: 1.0 X-OrganizationHeadersPreserved: maileu3.global.cadence.com X-Received: by mx-sanjose.cadence.com as v2KBPNkG001227 at Mon Mar 20 04:25:25 2017 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20170320_042707_105555_D63B347C X-CRM114-Status: GOOD ( 16.67 ) X-Spam-Score: -2.6 (--) X-Spam-Report: SpamAssassin version 3.4.1 on bombadil.infradead.org summary: Content analysis details: (-2.6 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.7 RCVD_IN_DNSWL_LOW RBL: Sender listed at http://www.dnswl.org/, low trust [208.84.65.235 listed in list.dnswl.org] -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.21 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Boris Brezillon , Artur Jedrysek , Richard Weinberger , linux-kernel@vger.kernel.org, Marek Vasut , Cyrille Pitchen , Brian Norris , David Woodhouse Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org Recent versions of Cadence QSPI controller support Octal SPI transfers as well. This patch updates existing driver to support such feature. It is not possible to determine whether or not octal mode is supported just by looking at revision register alone. To solve that, an additional compatible in Device Tree is added to indicate such capability. Both (revision and compatible) are used to determine, which mode to pass to spi_nor_scan() call. Signed-off-by: Artur Jedrysek --- Changelog: v2: Use new compatible in DT, instead of boolean property, to indicate Octal SPI support. Extracted Kconfig update to seperate patch. --- v3: Fixed handling revision register. --- drivers/mtd/spi-nor/cadence-quadspi.c | 56 ++++++++++++++++++++++++++++++----- 1 file changed, 48 insertions(+), 8 deletions(-) diff --git a/drivers/mtd/spi-nor/cadence-quadspi.c b/drivers/mtd/spi-nor/cadence-quadspi.c index 9f8102d..a1561d0 100644 --- a/drivers/mtd/spi-nor/cadence-quadspi.c +++ b/drivers/mtd/spi-nor/cadence-quadspi.c @@ -76,6 +76,7 @@ struct cqspi_st { u32 fifo_depth; u32 fifo_width; u32 trigger_address; + u32 caps; struct cqspi_flash_pdata f_pdata[CQSPI_MAX_CHIPSELECT]; }; @@ -87,6 +88,9 @@ struct cqspi_st { #define CQSPI_INST_TYPE_SINGLE 0 #define CQSPI_INST_TYPE_DUAL 1 #define CQSPI_INST_TYPE_QUAD 2 +#define CQSPI_INST_TYPE_OCTAL 3 + +#define CQSPI_FLAG_SUPPORTS_OCTAL BIT(0) #define CQSPI_DUMMY_CLKS_PER_BYTE 8 #define CQSPI_DUMMY_BYTES_MAX 4 @@ -204,6 +208,14 @@ struct cqspi_st { #define CQSPI_REG_CMDWRITEDATALOWER 0xA8 #define CQSPI_REG_CMDWRITEDATAUPPER 0xAC +#define CQSPI_REG_MODULEID 0xFC +#define CQSPI_REG_MODULEID_CONF_ID_MASK 0x3 +#define CQSPI_REG_MODULEID_CONF_ID_LSB 0 +#define CQSPI_REG_MODULEID_CONF_ID_OCTAL_PHY 0x0 +#define CQSPI_REG_MODULEID_CONF_ID_OCTAL 0x1 +#define CQSPI_REG_MODULEID_CONF_ID_QUAD_PHY 0x2 +#define CQSPI_REG_MODULEID_CONF_ID_QUAD 0x3 + /* Interrupt status bits */ #define CQSPI_REG_IRQ_MODE_ERR BIT(0) #define CQSPI_REG_IRQ_UNDERFLOW BIT(1) @@ -866,6 +878,9 @@ static int cqspi_set_protocol(struct spi_nor *nor, const int read) case SPI_NOR_QUAD: f_pdata->data_width = CQSPI_INST_TYPE_QUAD; break; + case SPI_NOR_OCTAL: + f_pdata->data_width = CQSPI_INST_TYPE_OCTAL; + break; default: return -EINVAL; } @@ -977,6 +992,17 @@ static int cqspi_write_reg(struct spi_nor *nor, u8 opcode, u8 *buf, int len) return ret; } +static struct of_device_id const cqspi_dt_ids[] = { + { .compatible = "cdns,qspi-nor", .data = (void *)0 }, + { + .compatible = "cdns,ospi-nor", + .data = (void *)CQSPI_FLAG_SUPPORTS_OCTAL + }, + { /* end of table */ } +}; + +MODULE_DEVICE_TABLE(of, cqspi_dt_ids); + static int cqspi_of_get_flash_pdata(struct platform_device *pdev, struct cqspi_flash_pdata *f_pdata, struct device_node *np) @@ -1018,6 +1044,12 @@ static int cqspi_of_get_pdata(struct platform_device *pdev) { struct device_node *np = pdev->dev.of_node; struct cqspi_st *cqspi = platform_get_drvdata(pdev); + const struct of_device_id *match; + + match = of_match_node(cqspi_dt_ids, np); + if (match && match->data) + cqspi->caps |= (unsigned long)match->data & + CQSPI_FLAG_SUPPORTS_OCTAL; cqspi->is_decoded_cs = of_property_read_bool(np, "cdns,is-decoded-cs"); @@ -1074,9 +1106,23 @@ static int cqspi_setup_flash(struct cqspi_st *cqspi, struct device_node *np) struct cqspi_flash_pdata *f_pdata; struct spi_nor *nor; struct mtd_info *mtd; + enum read_mode mode = SPI_NOR_QUAD; unsigned int cs; + unsigned int rev_reg; int i, ret; + if (cqspi->caps & CQSPI_FLAG_SUPPORTS_OCTAL) { + /* Determine, whether or not octal transfer MAY be supported */ + rev_reg = readl(cqspi->iobase + CQSPI_REG_MODULEID); + dev_info(dev, "CQSPI Module id %x\n", rev_reg); + + switch (rev_reg & CQSPI_REG_MODULEID_CONF_ID_MASK) { + case CQSPI_REG_MODULEID_CONF_ID_OCTAL_PHY: + case CQSPI_REG_MODULEID_CONF_ID_OCTAL: + mode = SPI_NOR_OCTAL; + } + } + /* Get flash device data */ for_each_available_child_of_node(dev->of_node, np) { ret = of_property_read_u32(np, "reg", &cs); @@ -1123,7 +1169,7 @@ static int cqspi_setup_flash(struct cqspi_st *cqspi, struct device_node *np) goto err; } - ret = spi_nor_scan(nor, NULL, SPI_NOR_QUAD); + ret = spi_nor_scan(nor, NULL, mode); if (ret) goto err; @@ -1160,6 +1206,7 @@ static int cqspi_probe(struct platform_device *pdev) mutex_init(&cqspi->bus_mutex); cqspi->pdev = pdev; platform_set_drvdata(pdev, cqspi); + cqspi->caps = 0; /* Obtain configuration from OF. */ ret = cqspi_of_get_pdata(pdev); @@ -1277,13 +1324,6 @@ static const struct dev_pm_ops cqspi__dev_pm_ops = { #define CQSPI_DEV_PM_OPS NULL #endif -static struct of_device_id const cqspi_dt_ids[] = { - {.compatible = "cdns,qspi-nor",}, - { /* end of table */ } -}; - -MODULE_DEVICE_TABLE(of, cqspi_dt_ids); - static struct platform_driver cqspi_platform_driver = { .probe = cqspi_probe, .remove = cqspi_remove,