Received: by 2002:a25:ef43:0:0:0:0:0 with SMTP id w3csp320848ybm; Fri, 29 May 2020 00:38:56 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz5w0h/Fkd3dsLLmtLPqItYDHUC0Dg5ltT0BXEVCxYFcTPyFnFyevl6Sb/z9FrPVNeGUJTZ X-Received: by 2002:a17:906:868f:: with SMTP id g15mr6341088ejx.208.1590737935906; Fri, 29 May 2020 00:38:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1590737935; cv=none; d=google.com; s=arc-20160816; b=jX7gVbBrHjom913P0ceLdo5HYeS09q0vn2dZQO++llZvdXTVXSEDSNz1Wuc29KNiX3 N5IB86Ru7uTaA892kVbKVCY1sJF6ZOdknHNIs1AJJchZ9N5A5Fr35Ko3VffuE+JthlrT zNUIk2tx2/XJp/dorBa8i2++brZFJeZv4aKJsSZJ4Zv6XArf/sbBzBFDWUIJMY2Gm+Rf yX2VQ5Eebax3VKWH2fuPcMdIkQpzEBs3KmgW0ggmqz6BwWoZaPev/W2xDVaKksO+BSdA 4P13/WVqtRexvLElItnqKJpoiGPWJRUyL1swBGNCr0u9+tW4YmOMz/II2FX475ySTN1G cHow== 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=ECLq6FvTgq3UMaY+VgOtt1+IV5FhlK2uYaz3iHGxidE=; b=c7YLISeT9My7ey8W9o/925lS2VcJYMTkcy9pQWGEAi35DSZPslNWJzVw5jIAYOSg2u qP4oZe30zYiE4ZP5Pd2+V5p/9Izz4+f+9wAUTWZcrwck60rCd22qmVVqIqKmN29Rjvp7 THrbCE00j2oc/EIz2UaeIzhxlJXehiUw6EPVfRAG9c0s4Qkj49t5Ag9b9WlDodkS6pPX 7KNmLqGmnP0+JMfOsd9t4xcCjAbz/NsrHdSGZTO30yJ2+ZfnwhSH8A5h0VNzo5zFvqvH E55cY60D4W5YEec3VLWULKbiu+KYLnbrhyuSwRiXGRqkwq2BlZHQaQqhXB6ALnaUAONC qupw== 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 u11si5114777edj.229.2020.05.29.00.38.33; Fri, 29 May 2020 00:38:55 -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 S1726441AbgE2Hgn (ORCPT + 99 others); Fri, 29 May 2020 03:36:43 -0400 Received: from twhmllg4.macronix.com ([211.75.127.132]:24639 "EHLO TWHMLLG4.macronix.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725562AbgE2Hgn (ORCPT ); Fri, 29 May 2020 03:36:43 -0400 Received: from localhost.localdomain ([172.17.195.96]) by TWHMLLG4.macronix.com with ESMTP id 04T7aHq1067318; Fri, 29 May 2020 15:36:21 +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 v4 5/7] mtd: spi-nor: core: execute command sequences to change octal DTR mode Date: Fri, 29 May 2020 15:36:13 +0800 Message-Id: <1590737775-4798-6-git-send-email-masonccyang@mxic.com.tw> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1590737775-4798-1-git-send-email-masonccyang@mxic.com.tw> References: <1590737775-4798-1-git-send-email-masonccyang@mxic.com.tw> X-MAIL: TWHMLLG4.macronix.com 04T7aHq1067318 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 | 1 + 2 files changed, 72 insertions(+) diff --git a/drivers/mtd/spi-nor/core.c b/drivers/mtd/spi-nor/core.c index fed6236..c8cd0c6 100644 --- a/drivers/mtd/spi-nor/core.c +++ b/drivers/mtd/spi-nor/core.c @@ -347,6 +347,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_NUM; 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 0eb07ca..e4cf20a 100644 --- a/drivers/mtd/spi-nor/core.h +++ b/drivers/mtd/spi-nor/core.h @@ -436,6 +436,7 @@ struct spi_nor_manufacturer { 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