From patchwork Fri Feb 10 21:49:28 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kamal Dasu X-Patchwork-Id: 726752 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 3vKpzt5JxGz9s82 for ; Sat, 11 Feb 2017 09:10:50 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="aO3QQKPd"; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="SKAwDVqy"; 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: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=6ucdVKraoz+ua8tyaE8nvTz8978ZFUfE0ZrBzJGzWCU=; b=aO3QQKPdYGwK0NSZKXrmSqmtej /kSmp/xAtDaXHkMNb/25rlNs8T+Ilfj3Oz9uiBkPIvJpZEfbLPytFUELpRCj+DHbm6RN0J3QiqOV8 WF+DcEn5JYBrI+R1bHJPaH5SukpaZ8EGJZDm3HHT7Pwq5QoiTuclS2H7KrTDQJnImcUw1bcMNiLu3 FPH8G2iaOopJVenJ6qilT4Vj3iuS1qgM0sXxB9eoQ2hMrVdT9GIYjyhv4PRAuG9OGkU8PK+K0tHPI 4zkHjxo174RLxGtZ7I21XeVQb/zqedjNZH5mGGFEBCs2CM9tRghm2O58+8qy8XS8id0pdJumG/tgB bCPlJxKQ==; 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 1ccJOy-00072Y-Gq; Fri, 10 Feb 2017 22:10:48 +0000 Received: from mail-wm0-x242.google.com ([2a00:1450:400c:c09::242]) by bombadil.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1ccJOo-0006nS-PR for linux-mtd@lists.infradead.org; Fri, 10 Feb 2017 22:10:46 +0000 Received: by mail-wm0-x242.google.com with SMTP id c85so9245787wmi.1 for ; Fri, 10 Feb 2017 14:10:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=Ba8XWTb2YMOkQcDiqOQ3ZR5OMz+qvByxjAVfFe/PYXk=; b=SKAwDVqyYgYgbL7nApYA05639uhuVTL01XgpR9QYFJLQg6URzig6bITdVsptWbDAtz NeZ4JRipcWcD8cDHcIf2pM7q7mTk4v76LAW8kCh2Vy3ZWL6hFmdAHDk6gXyU9F/cR4Fx dUp2WevY0ML/ipDagtK1smBb5rbMRwABh3FzJ4uXDYhg4AjWkolRNfWMHKvWrhyt2HaQ LEZ2U+slISuvFeCqV519BnEi8AKaNG16lb6h0b/drrS+CvTLRsdqPTL1d+yur72IFkKD fmtg4wBMdJeivUutF4Ywk6FN0mNi91F+h1RyEOPsM1el/jEymCDBPsjooF+ItE3sHrO0 55Tw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=Ba8XWTb2YMOkQcDiqOQ3ZR5OMz+qvByxjAVfFe/PYXk=; b=qc/7OlbR2DUSZFGVO0GqeE4F2uYnEO5IBn2sUdSI34ZfjfEfdLANAI4VUyF2umrspB hroiHEe8va0JkcCC8t+TIOp9KiIBD4qUo0rHgh9uviRKHTbEIK5beSy1pql8kzDXMlWg VwP8ADY6S78wLAFl0BVFcnLszOnDF4X3CNCvnCuUoHoXkctW3xWdyyUKejIwBuFARGPu nSrxTDh80euEndkGbRlcrR6TXH9lF0r8uBgJXuGUgeYNHDCPopg18nDJ6K6CmGmOU3Tv 5C1InE8sbrlVapXWl9PVsoFFM58O2QOPPcQI47zc7SWoQL2Ue2ndqoEw96Pp4GOiA0l2 FRag== X-Gm-Message-State: AMke39mQsdQ1OEFH8id3Zy2xksHYLYa0hnxLsijw0V/rWHopX3fxvJOrGGtbPLwQXhd27Q== X-Received: by 10.28.173.140 with SMTP id w134mr8860989wme.56.1486764617010; Fri, 10 Feb 2017 14:10:17 -0800 (PST) Received: from mail.broadcom.com ([192.19.218.250]) by smtp.gmail.com with ESMTPSA id u184sm1251473wmb.29.2017.02.10.14.10.14 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 10 Feb 2017 14:10:16 -0800 (PST) From: Kamal Dasu To: linux-spi@vger.kernel.org, cyrille.pitchen@atmel.com, marex@denx.de, broonie@kernel.org Subject: [PATCH v3 1/2] mtd: spi-nor: Added spi-nor reset function Date: Fri, 10 Feb 2017 16:49:28 -0500 Message-Id: <1486763369-31969-2-git-send-email-kdasu.kdev@gmail.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1486763369-31969-1-git-send-email-kdasu.kdev@gmail.com> References: <1486763369-31969-1-git-send-email-kdasu.kdev@gmail.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20170210_141039_347690_B9A20986 X-CRM114-Status: GOOD ( 18.14 ) 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 [2a00:1450:400c:c09:0:0:0:242 listed in] [list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider (kdasu.kdev[at]gmail.com) -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] 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 -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature 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: bcm-kernel-feedback-list@broadcom.com, f.fainelli@gmail.com, linux-mtd@lists.infradead.org, Kamal Dasu MIME-Version: 1.0 Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org Refactored spi_nor_scan() code to add spi_nor_init() function that programs the spi-nor flash to: 1) remove flash protection if applicable 2) set read mode to quad mode if configured such 3) set the address width based on the flash size and vendor On pm resume spi-nor flash may need to be reconfigured after power reset, there is no need to go through a full spi_nor_scan(), flash device driver needs to call spi_nor_reset() to reprogram the flash to its probed state. Signed-off-by: Kamal Dasu Conflicts: drivers/mtd/spi-nor/spi-nor.c --- drivers/mtd/spi-nor/spi-nor.c | 72 +++++++++++++++++++++++++++---------------- include/linux/mtd/spi-nor.h | 21 ++++++++++++- 2 files changed, 65 insertions(+), 28 deletions(-) diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c index 70e52ff..2bf7f4f 100644 --- a/drivers/mtd/spi-nor/spi-nor.c +++ b/drivers/mtd/spi-nor/spi-nor.c @@ -1526,6 +1526,44 @@ static int s3an_nor_scan(const struct flash_info *info, struct spi_nor *nor) return 0; } +int spi_nor_init(struct spi_nor *nor) +{ + int ret = 0; + const struct flash_info *info = nor->info; + struct device *dev = nor->dev; + + /* + * Atmel, SST, Intel/Numonyx, and others serial NOR tend to power up + * with the software protection bits set + */ + + if (JEDEC_MFR(info) == SNOR_MFR_ATMEL || + JEDEC_MFR(info) == SNOR_MFR_INTEL || + JEDEC_MFR(info) == SNOR_MFR_SST || + info->flags & SPI_NOR_HAS_LOCK) { + write_enable(nor); + write_sr(nor, 0); + spi_nor_wait_till_ready(nor); + } + + if (nor->flash_read == SPI_NOR_QUAD) { + ret = set_quad_mode(nor, info); + if (ret) { + dev_err(dev, "quad mode not supported\n"); + return ret; + } + } + + if (JEDEC_MFR(info) == SNOR_MFR_SPANSION || + info->flags & SPI_NOR_4B_OPCODES) + spi_nor_set_4byte_opcodes(nor, info); + else + set_4byte(nor, info, 1); + + return ret; +} +EXPORT_SYMBOL_GPL(spi_nor_init); + int spi_nor_scan(struct spi_nor *nor, const char *name, enum read_mode mode) { const struct flash_info *info = NULL; @@ -1571,6 +1609,7 @@ int spi_nor_scan(struct spi_nor *nor, const char *name, enum read_mode mode) } } + nor->info = info; mutex_init(&nor->lock); /* @@ -1581,20 +1620,6 @@ int spi_nor_scan(struct spi_nor *nor, const char *name, enum read_mode mode) if (info->flags & SPI_S3AN) nor->flags |= SNOR_F_READY_XSR_RDY; - /* - * Atmel, SST, Intel/Numonyx, and others serial NOR tend to power up - * with the software protection bits set - */ - - if (JEDEC_MFR(info) == SNOR_MFR_ATMEL || - JEDEC_MFR(info) == SNOR_MFR_INTEL || - JEDEC_MFR(info) == SNOR_MFR_SST || - info->flags & SPI_NOR_HAS_LOCK) { - write_enable(nor); - write_sr(nor, 0); - spi_nor_wait_till_ready(nor); - } - if (!mtd->name) mtd->name = dev_name(dev); mtd->priv = nor; @@ -1669,11 +1694,6 @@ int spi_nor_scan(struct spi_nor *nor, const char *name, enum read_mode mode) /* Quad/Dual-read mode takes precedence over fast/normal */ if (mode == SPI_NOR_QUAD && info->flags & SPI_NOR_QUAD_READ) { - ret = set_quad_mode(nor, info); - if (ret) { - dev_err(dev, "quad mode not supported\n"); - return ret; - } nor->flash_read = SPI_NOR_QUAD; } else if (mode == SPI_NOR_DUAL && info->flags & SPI_NOR_DUAL_READ) { nor->flash_read = SPI_NOR_DUAL; @@ -1702,17 +1722,11 @@ int spi_nor_scan(struct spi_nor *nor, const char *name, enum read_mode mode) if (info->addr_width) nor->addr_width = info->addr_width; - else if (mtd->size > 0x1000000) { + else if (mtd->size > 0x1000000) /* enable 4-byte addressing if the device exceeds 16MiB */ nor->addr_width = 4; - if (JEDEC_MFR(info) == SNOR_MFR_SPANSION || - info->flags & SPI_NOR_4B_OPCODES) - spi_nor_set_4byte_opcodes(nor, info); - else - set_4byte(nor, info, 1); - } else { + else nor->addr_width = 3; - } if (nor->addr_width > SPI_NOR_MAX_ADDR_WIDTH) { dev_err(dev, "address width is too large: %u\n", @@ -1728,6 +1742,10 @@ int spi_nor_scan(struct spi_nor *nor, const char *name, enum read_mode mode) return ret; } + ret = spi_nor_init(nor); + if (ret) + return ret; + dev_info(dev, "%s (%lld Kbytes)\n", info->name, (long long)mtd->size >> 10); diff --git a/include/linux/mtd/spi-nor.h b/include/linux/mtd/spi-nor.h index f2a7180..945b4d4 100644 --- a/include/linux/mtd/spi-nor.h +++ b/include/linux/mtd/spi-nor.h @@ -143,6 +143,8 @@ enum spi_nor_option_flags { SNOR_F_READY_XSR_RDY = BIT(4), }; +struct flash_info; + /** * struct spi_nor - Structure for defining a the SPI NOR layer * @mtd: point to a mtd_info structure @@ -176,6 +178,7 @@ enum spi_nor_option_flags { * @priv: the private data */ struct spi_nor { + const struct flash_info *info; struct mtd_info mtd; struct mutex lock; struct device *dev; @@ -220,12 +223,28 @@ static inline struct device_node *spi_nor_get_flash_node(struct spi_nor *nor) } /** + * spi_nor_init() - reset scan the SPI NOR + * @nor: the spi_nor structure + * + * The drivers uses this function to initialize the SPI NOR flash device to + * its scanned state, it shall use all nor information set on poweron + * for the read mode, address width and remove protection for certain spi-nor + * manufacturers. This would be needed to be called for flash devices that are + * reset during power management. + * + * The chip type name can be provided through the @name parameter. + * + * Return: 0 for success, others for failure. + */ +int spi_nor_init(struct spi_nor *nor); + +/** * spi_nor_scan() - scan the SPI NOR * @nor: the spi_nor structure * @name: the chip type name * @mode: the read mode supported by the driver * - * The drivers can use this fuction to scan the SPI NOR. + * The drivers can use this function to scan the SPI NOR. * In the scanning, it will try to get all the necessary information to * fill the mtd_info{} and the spi_nor{}. *