From patchwork Wed Jul 19 11:48:11 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Abhishek Sahu X-Patchwork-Id: 790970 X-Patchwork-Delegate: boris.brezillon@free-electrons.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="jnb6XNKJ"; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=codeaurora.org header.i=@codeaurora.org header.b="EYB7Kn9M"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=codeaurora.org header.i=@codeaurora.org header.b="SPEK4wMK"; 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 3xCFnm3Svyz9s7g for ; Wed, 19 Jul 2017 21:54:52 +1000 (AEST) 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:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id: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=kgI15SLCyEKwMFYKrW9eOpg/8943FuJbWVFNqKfeonc=; b=jnb6XNKJqisCovtmBRFrsaWCFA 5dES7WRujU0kdyO94+DfPTZ+jTsGlcSg6S9wYockzrOqvL6uiVHN8rczOfCQISkX9Qjj20tXYKRJP o24mvEG7ke7NzF1gmsY1Od10Ttwrka+hToQhyrq6iK4wn8x7/nv1rPRk36TWQTTBFwTRuh4qJibjf ev/Ayr/2mTY6nz5xkLP9vaKO/UinoSk2Sr/E/2ZqGMegGHAiZo96efCsPuBtVbI1vcFIz3DFWtDV3 8t8MPGhpXpboYf9bXt/p4aa1aGsx5YJjHRAwnnjrKLZeOq7yjkdy0axICLWj6UcDjf+jQ2qv82LaL H74Jxw7A==; 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 1dXnYw-0002bW-LJ; Wed, 19 Jul 2017 11:54:42 +0000 Received: from smtp.codeaurora.org ([198.145.29.96]) by bombadil.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1dXnXQ-0000z1-1U for linux-mtd@lists.infradead.org; Wed, 19 Jul 2017 11:54:40 +0000 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id 5C4C3611B5; Wed, 19 Jul 2017 11:52:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1500465167; bh=4nLCzdG18cs/yZ5n3UC0DE6kEdcLyGUHOn5McGlRrsw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=EYB7Kn9MkNpI3//os5rQFI0Z/Ee1Dg3dKBBuxwmAC+jI/e/QqQb6S8kVBMe+WBTgq Zn+fe4xjhJDxswyLmk75WCvmI0jPFxdHcH8YrNwW+kT21lBK1R6pOomhob8qgS7+9o FCa5UeqDyk059nZ7dmPPY9cHX2+LZVgK/CrVE7mM= X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on pdx-caf-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.8 required=2.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED, T_DKIM_INVALID autolearn=no autolearn_force=no version=3.4.0 Received: from absahu-linux.qualcomm.com (blr-c-bdr-fw-01_globalnat_allzones-outside.qualcomm.com [103.229.19.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: absahu@smtp.codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id 2CC07612E5; Wed, 19 Jul 2017 11:52:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1500465164; bh=4nLCzdG18cs/yZ5n3UC0DE6kEdcLyGUHOn5McGlRrsw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=SPEK4wMKhsJYyZgK9RawdeqEFrphQ1K6Zu+gCR+0EL2CXLuXlHdn5B0iwtaIOHOka cVMpb4hc4TMUH1VZGPpe5zFPdswwQo+JPbSVqiq0I5sGtLDjOSLBdDX4UBO/OwbePi c4xrkP31AQUXftUU24ugDcndE6xF9EX1hhhA/QHQ= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 2CC07612E5 Authentication-Results: pdx-caf-mail.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: pdx-caf-mail.web.codeaurora.org; spf=none smtp.mailfrom=absahu@codeaurora.org From: Abhishek Sahu To: dwmw2@infradead.org, computersforpeace@gmail.com, boris.brezillon@free-electrons.com, marek.vasut@gmail.com, richard@nod.at, cyrille.pitchen@wedev4u.fr, robh+dt@kernel.org, mark.rutland@arm.com Subject: [PATCH v2 23/25] mtd: nand: qcom: change register offset defines with enums Date: Wed, 19 Jul 2017 17:18:11 +0530 Message-Id: <1500464893-11352-24-git-send-email-absahu@codeaurora.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1500464893-11352-1-git-send-email-absahu@codeaurora.org> References: <1500464893-11352-1-git-send-email-absahu@codeaurora.org> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20170719_045309_478024_718E610A X-CRM114-Status: GOOD ( 16.74 ) X-Spam-Score: -4.3 (----) X-Spam-Report: SpamAssassin version 3.4.1 on bombadil.infradead.org summary: Content analysis details: (-4.3 points) pts rule name description ---- ---------------------- -------------------------------------------------- -2.3 RCVD_IN_DNSWL_MED RBL: Sender listed at http://www.dnswl.org/, medium trust [198.145.29.96 listed in list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record -0.0 RP_MATCHES_RCVD Envelope sender domain matches handover relay domain -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_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain 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: devicetree@vger.kernel.org, architt@codeaurora.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Abhishek Sahu , linux-mtd@lists.infradead.org, andy.gross@linaro.org, sricharan@codeaurora.org MIME-Version: 1.0 Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org The current driver defines the register offset with preprocessor macro which is defined crossponding to NAND controller version 1.4.0. This patch changes these macro with enumeration. It also adds mapping array which contains controller register offsets for each register offset enumeration. This mapping array will be referenced before each register read and writes, where the register offset enumeration is being replaced with actual register offsets. Signed-off-by: Abhishek Sahu --- drivers/mtd/nand/qcom_nandc.c | 154 +++++++++++++++++++++++++++--------------- 1 file changed, 100 insertions(+), 54 deletions(-) diff --git a/drivers/mtd/nand/qcom_nandc.c b/drivers/mtd/nand/qcom_nandc.c index 7a7db6b..0896e56 100644 --- a/drivers/mtd/nand/qcom_nandc.c +++ b/drivers/mtd/nand/qcom_nandc.c @@ -24,43 +24,6 @@ #include #include -/* NANDc reg offsets */ -#define NAND_FLASH_CMD 0x00 -#define NAND_ADDR0 0x04 -#define NAND_ADDR1 0x08 -#define NAND_FLASH_CHIP_SELECT 0x0c -#define NAND_EXEC_CMD 0x10 -#define NAND_FLASH_STATUS 0x14 -#define NAND_BUFFER_STATUS 0x18 -#define NAND_DEV0_CFG0 0x20 -#define NAND_DEV0_CFG1 0x24 -#define NAND_DEV0_ECC_CFG 0x28 -#define NAND_DEV1_ECC_CFG 0x2c -#define NAND_DEV1_CFG0 0x30 -#define NAND_DEV1_CFG1 0x34 -#define NAND_READ_ID 0x40 -#define NAND_READ_STATUS 0x44 -#define NAND_DEV_CMD0 0xa0 -#define NAND_DEV_CMD1 0xa4 -#define NAND_DEV_CMD2 0xa8 -#define NAND_DEV_CMD_VLD 0xac -#define SFLASHC_BURST_CFG 0xe0 -#define NAND_ERASED_CW_DETECT_CFG 0xe8 -#define NAND_ERASED_CW_DETECT_STATUS 0xec -#define NAND_EBI2_ECC_BUF_CFG 0xf0 -#define FLASH_BUF_ACC 0x100 - -#define NAND_CTRL 0xf00 -#define NAND_VERSION 0xf08 -#define NAND_READ_LOCATION_0 0xf20 -#define NAND_READ_LOCATION_1 0xf24 -#define NAND_READ_LOCATION_2 0xf28 -#define NAND_READ_LOCATION_3 0xf2c - -/* dummy register offsets, used by write_reg_dma */ -#define NAND_DEV_CMD1_RESTORE 0xdead -#define NAND_DEV_CMD_VLD_RESTORE 0xbeef - /* NAND_FLASH_CMD bits */ #define PAGE_ACC BIT(4) #define LAST_PAGE BIT(5) @@ -196,6 +159,8 @@ /* Returns the NAND register physical address */ #define NAND_REG_PHYS(chip, offset) ((chip)->base_phys + (offset)) +#define NANDC_FLASH_BUF(nandc) nandc->props->reg_offsets[FLASH_BUF_ACC] + #define QPIC_PER_CW_CMD_ELEMENTS 32 #define QPIC_PER_CW_CMD_SGL 32 #define QPIC_PER_CW_DATA_SGL 8 @@ -213,6 +178,44 @@ */ #define NAND_ERASED_CW_SET BIT(4) +/* NANDc reg offsets enumeration */ +enum { + NAND_FLASH_CMD, + NAND_ADDR0, + NAND_ADDR1, + NAND_FLASH_CHIP_SELECT, + NAND_EXEC_CMD, + NAND_FLASH_STATUS, + NAND_BUFFER_STATUS, + NAND_DEV0_CFG0, + NAND_DEV0_CFG1, + NAND_DEV0_ECC_CFG, + NAND_DEV1_ECC_CFG, + NAND_DEV1_CFG0, + NAND_DEV1_CFG1, + NAND_READ_ID, + NAND_READ_STATUS, + NAND_DEV_CMD0, + NAND_DEV_CMD1, + NAND_DEV_CMD2, + NAND_DEV_CMD_VLD, + SFLASHC_BURST_CFG, + NAND_ERASED_CW_DETECT_CFG, + NAND_ERASED_CW_DETECT_STATUS, + NAND_EBI2_ECC_BUF_CFG, + FLASH_BUF_ACC, + NAND_CTRL, + NAND_VERSION, + NAND_READ_LOCATION_0, + NAND_READ_LOCATION_1, + NAND_READ_LOCATION_2, + NAND_READ_LOCATION_3, + + /* dummy register offsets, used by write_reg_dma */ + NAND_DEV_CMD1_RESTORE, + NAND_DEV_CMD_VLD_RESTORE, +}; + /* * This data type corresponds to the BAM transaction which will be used for all * NAND transfers. @@ -434,10 +437,46 @@ struct qcom_nand_host { * among different NAND controller IP's. * @ecc_modes - ecc mode for NAND * @is_bam - whether NAND controller is using bam + * @reg_offsets: register offset mapping array */ struct qcom_props { u32 ecc_modes; bool is_bam; + const u32 *reg_offsets; +}; + +/* Mapping table which contains the actual register offsets */ +static const u32 nandc_reg_offsets[] = { + [NAND_FLASH_CMD] = 0x00, + [NAND_ADDR0] = 0x04, + [NAND_ADDR1] = 0x08, + [NAND_FLASH_CHIP_SELECT] = 0x0c, + [NAND_EXEC_CMD] = 0x10, + [NAND_FLASH_STATUS] = 0x14, + [NAND_BUFFER_STATUS] = 0x18, + [NAND_DEV0_CFG0] = 0x20, + [NAND_DEV0_CFG1] = 0x24, + [NAND_DEV0_ECC_CFG] = 0x28, + [NAND_DEV1_ECC_CFG] = 0x2c, + [NAND_DEV1_CFG0] = 0x30, + [NAND_DEV1_CFG1] = 0x34, + [NAND_READ_ID] = 0x40, + [NAND_READ_STATUS] = 0x44, + [NAND_DEV_CMD0] = 0xa0, + [NAND_DEV_CMD1] = 0xa4, + [NAND_DEV_CMD2] = 0xa8, + [NAND_DEV_CMD_VLD] = 0xac, + [SFLASHC_BURST_CFG] = 0xe0, + [NAND_ERASED_CW_DETECT_CFG] = 0xe8, + [NAND_ERASED_CW_DETECT_STATUS] = 0xec, + [NAND_EBI2_ECC_BUF_CFG] = 0xf0, + [FLASH_BUF_ACC] = 0x100, + [NAND_CTRL] = 0xf00, + [NAND_VERSION] = 0xf08, + [NAND_READ_LOCATION_0] = 0xf20, + [NAND_READ_LOCATION_1] = 0xf24, + [NAND_READ_LOCATION_2] = 0xf28, + [NAND_READ_LOCATION_3] = 0xf2c, }; /* Frees the BAM transaction memory */ @@ -521,13 +560,13 @@ static inline struct qcom_nand_host *to_qcom_nand_host(struct nand_chip *chip) static inline u32 nandc_read(struct qcom_nand_controller *nandc, int offset) { - return ioread32(nandc->base + offset); + return ioread32(nandc->base + nandc->props->reg_offsets[offset]); } static inline void nandc_write(struct qcom_nand_controller *nandc, int offset, u32 val) { - iowrite32(val, nandc->base + offset); + iowrite32(val, nandc->base + nandc->props->reg_offsets[offset]); } static inline void nandc_read_buffer_sync(struct qcom_nand_controller *nandc, @@ -920,19 +959,20 @@ static int read_reg_dma(struct qcom_nand_controller *nandc, int first, int num_regs, unsigned int flags) { bool flow_control = false; + u32 reg_offset = nandc->props->reg_offsets[first]; void *vaddr; vaddr = nandc->reg_read_buf + nandc->reg_read_pos; nandc->reg_read_pos += num_regs; if (nandc->props->is_bam) - return prep_bam_dma_desc_cmd(nandc, true, first, vaddr, + return prep_bam_dma_desc_cmd(nandc, true, reg_offset, vaddr, num_regs, flags); if (first == NAND_READ_ID || first == NAND_FLASH_STATUS) flow_control = true; - return prep_adm_dma_desc(nandc, true, first, vaddr, + return prep_adm_dma_desc(nandc, true, reg_offset, vaddr, num_regs * sizeof(u32), flow_control); } @@ -948,6 +988,7 @@ static int write_reg_dma(struct qcom_nand_controller *nandc, int first, { bool flow_control = false; struct nandc_regs *regs = nandc->regs; + u32 reg_offset; void *vaddr; vaddr = offset_to_nandc_reg(regs, first); @@ -968,14 +1009,15 @@ static int write_reg_dma(struct qcom_nand_controller *nandc, int first, if (first == NAND_DEV_CMD_VLD_RESTORE) first = NAND_DEV_CMD_VLD; + reg_offset = nandc->props->reg_offsets[first]; if (nandc->props->is_bam) - return prep_bam_dma_desc_cmd(nandc, false, first, vaddr, + return prep_bam_dma_desc_cmd(nandc, false, reg_offset, vaddr, num_regs, flags); if (first == NAND_FLASH_CMD) flow_control = true; - return prep_adm_dma_desc(nandc, false, first, vaddr, + return prep_adm_dma_desc(nandc, false, reg_offset, vaddr, num_regs * sizeof(u32), flow_control); } @@ -1136,7 +1178,7 @@ static int nandc_param(struct qcom_nand_host *host) config_nand_single_cw_page_read(nandc); - read_data_dma(nandc, FLASH_BUF_ACC, nandc->data_buffer, + read_data_dma(nandc, NANDC_FLASH_BUF(nandc), nandc->data_buffer, nandc->buf_count, 0); /* restore CMD1 and VLD regs */ @@ -1623,7 +1665,7 @@ static int read_page_ecc(struct qcom_nand_host *host, u8 *data_buf, config_nand_cw_read(nandc); if (data_buf) - read_data_dma(nandc, FLASH_BUF_ACC, data_buf, + read_data_dma(nandc, NANDC_FLASH_BUF(nandc), data_buf, data_size, 0); /* @@ -1639,7 +1681,7 @@ static int read_page_ecc(struct qcom_nand_host *host, u8 *data_buf, for (j = 0; j < host->bbm_size; j++) *oob_buf++ = 0xff; - read_data_dma(nandc, FLASH_BUF_ACC + data_size, + read_data_dma(nandc, NANDC_FLASH_BUF(nandc) + data_size, oob_buf, oob_size, 0); } @@ -1683,7 +1725,8 @@ static int copy_last_cw(struct qcom_nand_host *host, int page) config_nand_single_cw_page_read(nandc); - read_data_dma(nandc, FLASH_BUF_ACC, nandc->data_buffer, size, 0); + read_data_dma(nandc, NANDC_FLASH_BUF(nandc), nandc->data_buffer, + size, 0); ret = submit_descs(nandc); if (ret) @@ -1739,7 +1782,7 @@ static int qcom_nandc_read_page_raw(struct mtd_info *mtd, for (i = 0; i < ecc->steps; i++) { int data_size1, data_size2, oob_size1, oob_size2; - int reg_off = FLASH_BUF_ACC; + int reg_off = NANDC_FLASH_BUF(nandc); data_size1 = mtd->writesize - host->cw_size * (ecc->steps - 1); oob_size1 = host->bbm_size; @@ -1851,7 +1894,8 @@ static int qcom_nandc_write_page(struct mtd_info *mtd, struct nand_chip *chip, } - write_data_dma(nandc, FLASH_BUF_ACC, data_buf, data_size, + write_data_dma(nandc, NANDC_FLASH_BUF(nandc), data_buf, + data_size, i == (ecc->steps - 1) ? NAND_BAM_NO_EOT : 0); /* @@ -1864,8 +1908,8 @@ static int qcom_nandc_write_page(struct mtd_info *mtd, struct nand_chip *chip, if (i == (ecc->steps - 1)) { oob_buf += host->bbm_size; - write_data_dma(nandc, FLASH_BUF_ACC + data_size, - oob_buf, oob_size, 0); + write_data_dma(nandc, NANDC_FLASH_BUF(nandc) + + data_size, oob_buf, oob_size, 0); } config_nand_cw_write(nandc); @@ -1906,7 +1950,7 @@ static int qcom_nandc_write_page_raw(struct mtd_info *mtd, for (i = 0; i < ecc->steps; i++) { int data_size1, data_size2, oob_size1, oob_size2; - int reg_off = FLASH_BUF_ACC; + int reg_off = NANDC_FLASH_BUF(nandc); data_size1 = mtd->writesize - host->cw_size * (ecc->steps - 1); oob_size1 = host->bbm_size; @@ -1992,7 +2036,7 @@ static int qcom_nandc_write_oob(struct mtd_info *mtd, struct nand_chip *chip, update_rw_regs(host, 1, false); config_nand_page_write(nandc); - write_data_dma(nandc, FLASH_BUF_ACC, + write_data_dma(nandc, NANDC_FLASH_BUF(nandc), nandc->data_buffer, data_size + oob_size, 0); config_nand_cw_write(nandc); @@ -2079,7 +2123,7 @@ static int qcom_nandc_block_markbad(struct mtd_info *mtd, loff_t ofs) update_rw_regs(host, 1, false); config_nand_page_write(nandc); - write_data_dma(nandc, FLASH_BUF_ACC, + write_data_dma(nandc, NANDC_FLASH_BUF(nandc), nandc->data_buffer, host->cw_size, 0); config_nand_cw_write(nandc); @@ -2838,11 +2882,13 @@ static int qcom_nandc_remove(struct platform_device *pdev) static const struct qcom_props ebi2_nandc_data = { .ecc_modes = (ECC_RS_4BIT | ECC_BCH_8BIT), .is_bam = false, + .reg_offsets = nandc_reg_offsets, }; static const struct qcom_props qpic_nandc_v1_4_0_data = { .ecc_modes = (ECC_BCH_4BIT | ECC_BCH_8BIT), .is_bam = true, + .reg_offsets = nandc_reg_offsets, }; /*