From patchwork Thu Jan 22 16:41:15 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hartley Sweeten X-Patchwork-Id: 19842 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 53998DDEE9 for ; Fri, 23 Jan 2009 03:44:07 +1100 (EST) Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.69 #1 (Red Hat Linux)) id 1LQ2d0-0001J0-Hb; Thu, 22 Jan 2009 16:42:02 +0000 Received: from exprod6og107.obsmtp.com ([64.18.1.208]) by bombadil.infradead.org with smtp (Exim 4.69 #1 (Red Hat Linux)) id 1LQ2cu-0001Dh-Bg for linux-mtd@lists.infradead.org; Thu, 22 Jan 2009 16:41:59 +0000 Received: from source ([63.240.6.3]) (using TLSv1) by exprod6ob107.postini.com ([64.18.5.12]) with SMTP ID DSNKSXihzHUgY7MXjsJb0oIuyIpTBlShGfbe@postini.com; Thu, 22 Jan 2009 08:41:56 PST Received: from D01SMTP04.Mi8.com ([172.16.1.243]) by Outbound02.Mi8.com with Microsoft SMTPSVC(6.0.3790.3959); Thu, 22 Jan 2009 11:41:47 -0500 Received: from mi8nycmail19.Mi8.com ([172.16.7.219]) by D01SMTP04.Mi8.com with Microsoft SMTPSVC(6.0.3790.3959); Thu, 22 Jan 2009 11:41:48 -0500 X-MimeOLE: Produced By Microsoft Exchange V6.5 Content-class: urn:content-classes:message MIME-Version: 1.0 Subject: mtd: m25p80.c add support for non-JEDEC ID devices Date: Thu, 22 Jan 2009 11:41:15 -0500 Message-ID: X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: mtd: m25p80.c add support for non-JEDEC ID devices Thread-Index: Acl8sD4kSy18zuFZTOqqCQwAtWu+MA== From: "hartleys" To: X-OriginalArrivalTime: 22 Jan 2009 16:41:48.0277 (UTC) FILETIME=[51A73250:01C97CB0] X-Spam-Score: -4.0 (----) X-Spam-Report: SpamAssassin version 3.2.5 on bombadil.infradead.org summary: Content analysis details: (-4.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -4.0 RCVD_IN_DNSWL_MED RBL: Sender listed at http://www.dnswl.org/, medium trust [64.18.1.208 listed in list.dnswl.org] X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.9 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: linux-mtd-bounces@lists.infradead.org Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org Add support to the m25p80 driver for non-JEDEC ID devices. Some SPI flash chips do not support the "Read JEDEC ID" command and end up returning all 0xff's. The following patch detects this and trys probing the chip using the "Read Manufacture/Device ID" command. This patch has been tested on an EP93xx based ARM platform with a SST25LF020A 2Mbit SPI Serial Flash device. Signed-off-by: H Hartley Sweeten --- /* Status Register bits. */ #define SR_WIP 1 /* Write in progress */ @@ -546,12 +547,16 @@ static struct flash_info __devinitdata m25p_data [] = { { "w25x16", 0xef3015, 0, 64 * 1024, 32, SECT_4K, }, { "w25x32", 0xef3016, 0, 64 * 1024, 64, SECT_4K, }, { "w25x64", 0xef3017, 0, 64 * 1024, 128, SECT_4K, }, + + /* Non JEDEC ID SST -- large erase sizes are "overlays", "sectors" are 4K */ + { "sst25lf020a", 0xbf43, 0, 32 * 1024, 8, SECT_4K, }, + { "sst25lf040a", 0xbf44, 0, 32 * 1024, 16, SECT_4K, }, }; static struct flash_info *__devinit jedec_probe(struct spi_device *spi) { int tmp; - u8 code = OPCODE_RDID; + u8 code[4]; u8 id[5]; u32 jedec; u16 ext_jedec; @@ -561,7 +566,8 @@ static struct flash_info *__devinit jedec_probe(struct spi_device *spi) * string for after vendor-specific data, after the three bytes * we use here. Supporting some chips might require using it. */ - tmp = spi_write_then_read(spi, &code, 1, id, 5); + code[0] = OPCODE_RDID; + tmp = spi_write_then_read(spi, code, 1, id, 5); if (tmp < 0) { DEBUG(MTD_DEBUG_LEVEL0, "%s: error %d reading JEDEC ID\n", dev_name(&spi->dev), tmp); @@ -585,6 +591,31 @@ static struct flash_info *__devinit jedec_probe(struct spi_device *spi) } } dev_err(&spi->dev, "unrecognized JEDEC id %06x\n", jedec); + + /* Try reading the non-JEDEC Manufacture/Device ID */ + code[0] = OPCODE_RDID_NON_JEDEC; + code[1] = 0x00; + code[2] = 0x00; + code[3] = 0x00; + tmp = spi_write_then_read(spi, code, 4, id, 2); + if (tmp < 0) { + DEBUG(MTD_DEBUG_LEVEL0, "%s: error %d reading ID\n", + spi->dev.bus_id, tmp); + return NULL; + } + + jedec = id[0]; + jedec = jedec << 8; + jedec |= id[1]; + + for (tmp = 0, info = m25p_data; + tmp < ARRAY_SIZE(m25p_data); + tmp++, info++) { + if (info->jedec_id == jedec) + return info; + } + dev_err(&spi->dev, "unrecognized id %04x\n", jedec); + return NULL; } diff --git a/drivers/mtd/devices/m25p80.c b/drivers/mtd/devices/m25p80.c index 7c3fc76..0834a55 100644 --- a/drivers/mtd/devices/m25p80.c +++ b/drivers/mtd/devices/m25p80.c @@ -43,6 +43,7 @@ #define OPCODE_CHIP_ERASE 0xc7 /* Erase whole flash chip */ #define OPCODE_SE 0xd8 /* Sector erase (usually 64KiB) */ #define OPCODE_RDID 0x9f /* Read JEDEC ID */ +#define OPCODE_RDID_NON_JEDEC 0x90 /* Read non-JEDEC ID */