Received: by 2002:a25:ef43:0:0:0:0:0 with SMTP id w3csp229653ybm; Thu, 28 May 2020 01:02:20 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzaFiM2qzmMyCnYL5faZyJfUmoib0/bN9xEToH3zki/dyh7F2aEC5Lh0zJEd2WPAZzjosiZ X-Received: by 2002:a17:906:2409:: with SMTP id z9mr474760eja.442.1590652940525; Thu, 28 May 2020 01:02:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1590652940; cv=none; d=google.com; s=arc-20160816; b=nhWmUbUJ9rTnRKJCK00ph8LlX/1yFmFuAJn6Hbt86WE9WMWEkm8Uwjduma9FHpEUkM VB4ioaONVhG8L3ANyUhN+5GSr5ekCTIeg8gDrEDA0JDzkEA5o8S7dT3oUeWNUgeXZ0r7 NOz+rpzN/4P+6E178fIkNtyJtzydwU12+6Aw76+KLyGcuaNwR0APBbnx54xzwh2fy1tb gixeYKiQFCWcMI7foWKAobzdT7KgTMQDpHZnr0Iwo5IDot7fYq+cMn3zmMDgHGyasgU9 /Mos4cKF3YhlsB6/vCQsCnghMBblmFb6cmQ1SyR+8qj15nhAxR+4b756TniobumJmWsF DdfQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=mkL0fUWAAiZtrub8kLUDCqj+bPz/44R6tH83FQgMnFs=; b=nClz5YM7nZphzO3QxS51Y/KQo8NTDqHTwGAW92KE3WkHe1bxTESNRpIWJSdRFv4ECA d6cV8SEmcUtw1Nxg0PIoG7xBUVhmtfcPjO4CNP9RzVNsNPLVrLXk1DxQqmawNwu5IqFE M7tHEM9hsRm1h7U8420zYUWGiqONpe7wyelYWa8BXxxiK1ZlSMfx6Qvxs1lAN5JOHjqe nJ0QxAwEdfvSAG/2jMkNJ2N+LMhiBNeiCzF2Pme6AJfgvAdhSedXTK3VqNTcTEJHYz0u 9z45enDo/jOMI6JmSfCBQcDaBh1S+/VnP+N5XrvDbRU5j+m+TwunpCdXstQh3M6/KSVg WIng== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id z15si3368011edm.343.2020.05.28.01.01.57; Thu, 28 May 2020 01:02:20 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726975AbgE1H71 (ORCPT + 99 others); Thu, 28 May 2020 03:59:27 -0400 Received: from twhmllg4.macronix.com ([122.147.135.202]:31309 "EHLO TWHMLLG4.macronix.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726954AbgE1H7Y (ORCPT ); Thu, 28 May 2020 03:59:24 -0400 Received: from localhost.localdomain ([172.17.195.96]) by TWHMLLG4.macronix.com with ESMTP id 04S7wMHm030973; Thu, 28 May 2020 15:58:33 +0800 (GMT-8) (envelope-from masonccyang@mxic.com.tw) From: Mason Yang To: broonie@kernel.org, tudor.ambarus@microchip.com, miquel.raynal@bootlin.com, richard@nod.at, vigneshr@ti.com, boris.brezillon@collabora.com, matthias.bgg@gmail.com Cc: p.yadav@ti.com, juliensu@mxic.com.tw, linux-kernel@vger.kernel.org, linux-mtd@lists.infradead.org, linux-spi@vger.kernel.org, Mason Yang Subject: [PATCH v3 13/14] mtd: spi-nor: core: execute command sequences to change octal DTR mode Date: Thu, 28 May 2020 15:58:15 +0800 Message-Id: <1590652696-8844-14-git-send-email-masonccyang@mxic.com.tw> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1590652696-8844-1-git-send-email-masonccyang@mxic.com.tw> References: <1590652696-8844-1-git-send-email-masonccyang@mxic.com.tw> X-MAIL: TWHMLLG4.macronix.com 04S7wMHm030973 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Execute command sequences to change octal DTR mode. Signed-off-by: Mason Yang --- drivers/mtd/spi-nor/core.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++ drivers/mtd/spi-nor/core.h | 3 ++ 2 files changed, 74 insertions(+) diff --git a/drivers/mtd/spi-nor/core.c b/drivers/mtd/spi-nor/core.c index a353830..caac58cd 100644 --- a/drivers/mtd/spi-nor/core.c +++ b/drivers/mtd/spi-nor/core.c @@ -425,6 +425,77 @@ int spi_nor_write_cr2(struct spi_nor *nor, u32 addr, u8 *cr2) } /** + * spi_nor_cmd_seq_octal_dtr() - command sequences to change to octal DTR mode + * @nor: pointer to 'struct spi_nor'. + * @enable: enable Octal DTR. + * + * Return: 0 on success, -errno otherwise. + */ +int spi_nor_cmd_seq_octal_dtr(struct spi_nor *nor, bool enable) +{ + struct spi_nor_flash_parameter *p = nor->params; + struct cmd_seq_octal_dtr *cs = p->cmd_seq; + int i, ret; + struct spi_mem_op op; + + if (!nor->spimem || !p->cmd_seq[0].len) + return -ENOTSUPP; + + if (!enable) + return 0; + + for (i = 0; i < CMD_SEQ_OCTAL_DTR_DWORD_LEN; i++) { + switch (p->cmd_seq[i].len) { + case 1: + op = (struct spi_mem_op) + SPI_MEM_OP(SPI_MEM_OP_CMD(cs[i].opcode, 1), + SPI_MEM_OP_NO_ADDR, + SPI_MEM_OP_NO_DUMMY, + SPI_MEM_OP_NO_DATA); + + ret = spi_mem_exec_op(nor->spimem, &op); + if (ret) + return ret; + break; + + case 3: + op = (struct spi_mem_op) + SPI_MEM_OP(SPI_MEM_OP_CMD(cs[i].opcode, 1), + SPI_MEM_OP_ADDR(1, cs[i].addr, 1), + SPI_MEM_OP_NO_DUMMY, + SPI_MEM_OP_DATA_OUT(1, + &cs[i].data, 1)); + + ret = spi_mem_exec_op(nor->spimem, &op); + if (ret) + return ret; + break; + + case 6: + op = (struct spi_mem_op) + SPI_MEM_OP(SPI_MEM_OP_CMD(cs[i].opcode, 1), + SPI_MEM_OP_ADDR(4, cs[i].addr, 1), + SPI_MEM_OP_NO_DUMMY, + SPI_MEM_OP_DATA_OUT(1, + &cs[i].data, 1)); + + ret = spi_mem_exec_op(nor->spimem, &op); + if (ret) + return ret; + break; + + default: + dev_err(nor->dev, + "Error %d sequences to Octal DTR\n", + p->cmd_seq[i].len); + break; + } + } + + return ret; +} + +/** * spi_nor_read_sr() - Read the Status Register. * @nor: pointer to 'struct spi_nor'. * @sr: pointer to a DMA-able buffer where the value of the diff --git a/drivers/mtd/spi-nor/core.h b/drivers/mtd/spi-nor/core.h index 9b0e0ba..b47bc44d 100644 --- a/drivers/mtd/spi-nor/core.h +++ b/drivers/mtd/spi-nor/core.h @@ -199,6 +199,8 @@ struct cmd_seq_octal_dtr { u8 data; }; +#define CMD_SEQ_OCTAL_DTR_DWORD_LEN 4 + /** * struct spi_nor_flash_parameter - SPI NOR flash parameters and settings. * Includes legacy flash parameters and settings that can be overwritten @@ -442,6 +444,7 @@ void spi_nor_spimem_setup_op(const struct spi_nor *nor, int spi_nor_write_disable(struct spi_nor *nor); int spi_nor_read_cr2(struct spi_nor *nor, u32 addr, u8 *cr2); int spi_nor_write_cr2(struct spi_nor *nor, u32 addr, u8 *cr2); +int spi_nor_cmd_seq_octal_dtr(struct spi_nor *nor, bool enable); int spi_nor_set_4byte_addr_mode(struct spi_nor *nor, bool enable); int spi_nor_write_ear(struct spi_nor *nor, u8 ear); int spi_nor_wait_till_ready(struct spi_nor *nor); -- 1.9.1