From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753786AbcHRIHD (ORCPT ); Thu, 18 Aug 2016 04:07:03 -0400 Received: from mail-co1nam03on0132.outbound.protection.outlook.com ([104.47.40.132]:1569 "EHLO NAM03-CO1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753665AbcHRIGy (ORCPT ); Thu, 18 Aug 2016 04:06:54 -0400 Authentication-Results: spf=neutral (sender IP is 192.88.168.50) smtp.mailfrom=freescale.com; nxp.com; dkim=none (message not signed) header.d=none;nxp.com; dmarc=none action=none header.from=freescale.com;nxp.com; dkim=none (message not signed) header.d=none; From: Yunhui Cui To: , , , CC: , , , , Yunhui Cui Subject: [PATCH v3 6/9] mtd: spi-nor: Support R/W for S25FS-S family flash Date: Thu, 18 Aug 2016 15:38:01 +0800 Message-ID: <1471505884-33996-6-git-send-email-B56489@freescale.com> X-Mailer: git-send-email 2.1.0.27.g96db324 In-Reply-To: <1471505884-33996-1-git-send-email-B56489@freescale.com> References: <1471505884-33996-1-git-send-email-B56489@freescale.com> X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:192.88.168.50;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10019020)(979002)(6009001)(7916002)(2980300002)(199003)(189002)(2950100001)(8676002)(229853001)(87936001)(8666005)(36756003)(81166006)(50226002)(81156014)(76176999)(626004)(2201001)(7846002)(305945005)(106466001)(50986999)(356003)(575784001)(8936002)(586003)(189998001)(92566002)(19580405001)(97736004)(5001770100001)(105606002)(2906002)(48376002)(50466002)(47776003)(77096005)(19580395003)(4326007)(68736007)(5003940100001)(104016004)(7059030)(969003)(989001)(999001)(1009001)(1019001);DIR:OUT;SFP:1102;SCL:1;SRVR:SN1PR0301MB1983;H:tx30smr01.am.freescale.net;FPR:;SPF:Neutral;PTR:InfoDomainNonexistent;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BY2FFO11FD029;1:UfMY8/ChfulqB+OZDg4VKZq/4AbC9wcONOQXBSXLBj0cR5tuIu27JpCTRPrXlkcC/D2Xp5EqtXFmpBsx+fP928ADTG4Ds6oJa0GEfSdRva2dyjgMTQ31MO+x2WFACVlV8evBVCLu8MfEaOh9wxEeQji+7gtc1lvlEGxihxUvRQ0yAn0voW/u5E1jml1zjm79g51xSsNJJQmFMnMmNv7rniCRyqo3fUf4nJeVVywhMnU5iIQh4M3EX60kTiRgTA9OxJTaJKeObecbKfLHUrzGzyuKIhSubPokKO12Gmsw+A9xcaZ9Lxm/kUoT/Y4KntZ0fiyGBqE83nZSbDjHwTU9W+EeC6v2N61VQz1TUDr9OpEe5SRxwCXdvSrKDVGFv1otEWmN8AAdmf10dmOv4n2owUG33Hx5wEeeV6yCzmofZfuPCnI3lfTtvsQF1R0Zd58OjR2+kZ4bTUahMssgmqESus9zJHGKFoGiEjrKMvB9EuChdZeWqihUAodbO2Kl7b28M17TGY20t00PXUVywBxbEZ4DHn3VB2f+Fb/hGg0OFQ91jONSvoN+BeSImtfv0BdF MIME-Version: 1.0 Content-Type: text/plain X-MS-Office365-Filtering-Correlation-Id: c21ad29b-da7c-45a4-5766-08d3c73c3d3f X-Microsoft-Exchange-Diagnostics: 1;SN1PR0301MB1983;2:5IA8kRs/6KJON8gr4qN8fVCYK3R9A+BvsZ3Fh4+Y1hHVPkkLLbBcqgZ0i/BouIbLjUtnaJRezLnU0lV66Nqqn55jOMOjU7YPciNBwu/Eh7h7tC6WadziMzNgEkv6yTqP4hLq2UGaLmk0J+uuNQ9WSJeIAm3fn0TxqNEfz12741T3wwFQxLsoJYOERZEnK3w+;3:aHVaJL3yf1ERLRrwiVtiU+nKwPJnglAuSqq4aHYMg1eidAnRmVmYFiNtT1QqlZvSa+DhNwo+FwuhE55Q4/tUy7pDfzOooca52ScrNL71pgRbMFlAGakKWhQCjC0CrmRQUiUdLFHlDfbb7rm1RkcXog4UVqqBeUtKj5h6FDwD3jXlT03+IE+bOjHfmjA654zg2bPQhNe1U1VSFrB5s+O/Z042bYlTlGl5NnfjiLmB5DI= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:SN1PR0301MB1983; X-Microsoft-Exchange-Diagnostics: 1;SN1PR0301MB1983;25:PjiRetBaAjFUpkNvwqyfAzIvzxk4GhRZWnYYJXxbLjiKK2AUdVGuQ7O8Y1LQVCNpLHaQ8EglZgm86ETvUmnrGmG/YFiKJDn0RD9QVZErMbLDPCB/Y5nJr3VY82QmTsFFUouD2ne2EFjlUzWREISg46SLUf1YKvSKGMuUR0VXAG9wfd38bq/INcWNOMiIIHsmXkMuf0Pnq3L1XvC6P4YVEIpZ716aIJvqirTTgsjOy7bHs/oZQtvDW2SGTRnzDweB/dfS5abckr9dt6EPwsbTUbdLjIiznd8f89drMiE68/1Vdcyz+uX+Z3c+6iH2m/kbLrjdPc8vvEC1cAe29ecYVcdsu4nQXerv9JoIy0zJmUDR//tPBqcQbRC9oZDyftdmRT3KYQ0QEeBQM/23SeDrVNjZ0lQW3a+6d9DoTMLnO+cA++3tioQ1qrGHvc2mRqZpkkj/kkHRHrnBkX4eTSzwZqWZDA6cAlMT3+dbSHVB31a+mTmCfebZEoEGak3K3XHMAUhykFyAxsnETg+V7C6ElVBpACvQzBy0ufkMkcboSu1GsXtuAa8kFtUU/tCG5Y2O+6N3r1ivsCSBup/s0fudj+ht9pP0+23CbW9ePKhBL/7MXyKfASvnm3lXzdudHmA1wpSJIrPGFN2NRziYQYmelJmYGQqicbyOm4KYQOuLSRXRN+WAzuFPb+5yQxD9lgAvsmtRh5hk0GLJ/VrxMzQ8XDcgjjWrmnSIL/awNKP5JcvtzVB6wgEYQS2sxr+z375e X-LD-Processed: 710a03f5-10f6-4d38-9ff4-a80b81da590d,ExtAddr X-Microsoft-Exchange-Diagnostics: 1;SN1PR0301MB1983;31:fmvxpGvji6OFRRIrJVMY91qCDVddqNmy3N2/GVDCKcrhrUC3E6RuMaAIe/ND9KLjYafFhashZ7sTMSPwau1lTIv+OxNEQDYuVG2jNbMKi90v6NnV72+NDHJaN80U6eysdGYV5A8Q1HjTpiGYJHvHQIAjfBYy6t/s3pz8CObgh3j4tOx2MaHny5NMlfJeyjaQXa3v7PMNrioSVuvBtQtaSIkEKo47r1Ym4copMu125W8=;20:veNP4jKTaiNJ/PqtyH3K0DOGKW+a8KWeNmQb5GXZCMCPR/UD3wKlSH1cnP9IYs5PaBVwQFSn+ceMw8T5LZ+snJyZ01ixhE3fQClkCK5aavAHft3sCyrf2e1wVN6VEsTaVnOuD7qZ1RKeJhWxXLRn9tygPZmfsmL38FeG89YGZ9IQewwfjRavcZvR8i818rCDBfoMiyLZEcPGN6upncUA9LlMh3pqnMsz09DVE4a4DYNL5Ns6MmwJW9kdIGywfbsH7Ukg4tFwlWE94jL8S0/KYBNv3rwtRbccvunAqNC80UkmJKvkgkIjtKfhvZueXV8XLxxOq7eHa4uJHS1uDj7Q3kux66SPNmn1J/QcHpm10/H8FBZb1B0uUtJqgJOCJ4gCcQH3jze5XaIC0c+9pJHVm6Vj1RznTHDpFMaHV6wn9mOkSeG7TvxzEw8vvo9JNIGDXdWoFhO9lQ6221SEOxdwvKtb6wKzFY1TelIl3JC0Oy8XXl+PliYAWRJlHWQpKHVwq9RT+aobxrgg2XvOZRSeiBEl1cvZR3XHd2WZMKxYOW+bXmf+7HFJz0NHLhGT3p01ych9sTL9lN9F8IinPi8UHhoZRavb/rzo1CIrXWuu/dc= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040176)(601004)(2401047)(8121501046)(5005006)(13018025)(13015025)(13023025)(13017025)(13024025)(3002001)(10201501046)(6055026);SRVR:SN1PR0301MB1983;BCL:0;PCL:0;RULEID:;SRVR:SN1PR0301MB1983; X-Microsoft-Exchange-Diagnostics: 1;SN1PR0301MB1983;4:1BmWEKOW2f+gvKtjQYzwkz3RLGJgg86pVsbGEgVF2tWX+gfbEiqYiQ0Vw5oOcVDcPIb4jeRCia+MlDEJw4TTX8krIW03FTZsXM1IS6T8cLot7ju+LGu2l+3mk/XvZGD7UyxANxx3VOjYXZfkWrilAX/qkf5Dudv5nINkc2wWObUzdyjhiY1hLy8tRfKgUwGxaYltrGkLUfkrUIveDKS1PoyKatQ8LZNZkp/SQ4jauCka/qXZ2RmXEp3gactlAtPWtnlnuo5FBUFqcS8OYzuxc/8S7vHHF7QAbbLsAs16FUgjK4oWQxsklComZeg/cjZHDY0nIUmuW3fV60GjzgoXH2cNdjtiKTH1guEN8zC0DyG/4/cwkzBUBtztmS6rTD+BnCS3Pp0Fd8aTPRVYR2XZdaYOOFEfuubp6BJxjdrKuRQpDeptOfeuI4dkU2irGZ5h/qfGwgOoIvD7Nim6miIX7XdTduOjzWxvF0hZMpb89dchzdeAFFZ77Tj1ldh5sphXHB7k4PiMtkuCPfLgENFIvH/YEtO90h7ouai48VX4H0k= X-Forefront-PRVS: 0038DE95A2 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;SN1PR0301MB1983;23:4z10nWpWRKVOvDBC1FCQDTa3fkq+rOXOv2KS6p2?= =?us-ascii?Q?gEkY6q09t2POYMlWgZs9cxOWr0FBvOq23L6GHwhGStBefOLXBDB7lrV1Af+6?= =?us-ascii?Q?Qe+M6D5MOdxMzcHSh2/RHflDfn8X6jaconWJY7/7kI2dfi9KB7DB24IPoSQl?= =?us-ascii?Q?tw3h3dxPv0T1cIuE83SgszaGnXHKME0hRXgza2ZgjkMFmCQY+Ld/KNCXdRwQ?= =?us-ascii?Q?GxL6LFYxESDfO7Fs/n61Z2eEWz6WVyhDeslRHtjtpiihQfJ8F1pvArsRASwG?= =?us-ascii?Q?87tyUxhwBNFinuda9K4AaPWhF2CKR4kOBajc6QZj1YtC0RCSbbd/CrtxFlks?= =?us-ascii?Q?z+gZbDVIimVju75BzxbN6TqMTu15uz8K0FVd3/9rFTMzOmO/vlEzzxU/AJ8w?= =?us-ascii?Q?tgGcUq2DZ5eBmGOu//3Av86OEasE7uMdmEFXe/t8dl4AWX4MQ6YlVwQZguK5?= =?us-ascii?Q?gdvQyUAnoahS4BgcpWUQjlLgO1IxP2JyPNXgkq9QJmw0rCcFCT+AzvOjusby?= =?us-ascii?Q?/fPRmqhQeJSNgBx3EPmyUs3l1kmsqhv1TgBcu1Kko+qQXSaHtrbn5sq9N7oQ?= =?us-ascii?Q?FTFzoO+Ew1kkVMn/uhzwxYnlpSuRnY1W+voMf5KIhYkdvN3o8Yy73lNp/p3b?= =?us-ascii?Q?HCbvWetiDUOffFjFjQKYjBoYNjEmzmj8umBe/21OUV6TpS8SO4972SuQC7EJ?= =?us-ascii?Q?ZNAUrzKavzXGFe6wt63rRkiMMNV5TOZy7oWoEJptx6uJtHlUly8j7TipVkDz?= =?us-ascii?Q?FIXBgwTcnjkN/SxJVFfQAA113kf/g4DpdoZSJxUZDzWu/onhpfHhHdnu6Aoj?= =?us-ascii?Q?+TUR9pe9T0aIRgKfnJYoEf0o2bniKcnHk6p0XifLaZQB49tzlVTDUxxT7BGG?= =?us-ascii?Q?wM0EV7L0rkS47VUdX1kqT5VMe+DJVy48OSaYZB/TnjHMzIdct4YfB3I1ZOc4?= =?us-ascii?Q?Y8zYals8c4by8oiYYs5phaPSb8YLjgN0olxOuJYGlw5/HWtsC60kda+ARZX9?= =?us-ascii?Q?hpqcBgm+Y+wcqyWrAXpq86r1erioKHeO/k6PiamtVFCsfWRbzlxXW+sve7za?= =?us-ascii?Q?Pa0+aAqN1/q0foDLu7Yd5zNaf7W42p2j/ODRgOLS2QqFg41VfIDxY09li04G?= =?us-ascii?Q?IiomZAxCMLgo=3D?= X-Microsoft-Exchange-Diagnostics: 1;SN1PR0301MB1983;6:qjhS+iFRESnqHnwTy9/1e07NItNQt9viocCdA1xURNdEAlGUPtWyFI0GEP9wuWcrYtdW8jGONu7if61+KwG4/CalcuE/hbXdO61A/meePidPG6Z6ni0GkjrCeeqx95rriiODwFDoqEHBZBerUyKXExuQ8fVsTyAKYNPpf9ghdSUQHDktXpsfjCIykqslk5gdcmoLe7YxGinFoeBEG65WXvmZ0ntmCym6JbmOm1H8yLTLmv19xQxe1b+z2FtTzGKYPPINhiHP6V9lfkqEL+nrzFdMWtQBNlCf9xx1af8IHKMP2y5nKau1bWEDMzJUFt6+HyK7Uw0TNwFo3zgP0X/Pgg==;5:sXiqXSoymq95DreyJMSpulwN+A41y9lCjucq1w9+YOMaARIrvXsH892Nnc91oiVXRIA4qyTit/KBq/b2AV999PlZ0r7jUJleo4Hq1+POmg+PsOMzq8JuiYed+4mMswyRKxLllYip8q1r4ff7DGXrww==;24:ekbWt8H0d5dKrL4ovkoLAbccth6huXmtsZwCfI/VxY6YtLrtdHPlJcLioGwUsl38rSZDFJDkhNPXvZjrkZqOPczAOOBnOR27s4iRzKnHexk=;7:FIX7ilk/3dBKd80asCtJ+FByChZcMmX/7Rs42Tz0ijRvv8GP6xlYmG31aHxZBiFZdzmDf3t+cgJLFCVqWAss6MhUH3osCP0ORDJvoAFOIVZ5wcZtssHraTn90YYoW1eotl/QC3xZVchl836tisSnKLDel9icJNb0mPQg62kDx7Bl7+MZKRjAz9eq62/j5Z8p/zXbMb2Js119Dxy7syTf/K7dE/OG94x2E5IzDC/sdtAJw9LPF1YJw5vZj3SHEb8l SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Aug 2016 07:49:52.6714 (UTC) X-MS-Exchange-CrossTenant-Id: 710a03f5-10f6-4d38-9ff4-a80b81da590d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=710a03f5-10f6-4d38-9ff4-a80b81da590d;Ip=[192.88.168.50];Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN1PR0301MB1983 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Yunhui Cui With the physical sectors combination, S25FS-S family flash requires some special operations for read/write functions. Signed-off-by: Yunhui Cui --- drivers/mtd/spi-nor/spi-nor.c | 56 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c index d0fc165..495d0bb 100644 --- a/drivers/mtd/spi-nor/spi-nor.c +++ b/drivers/mtd/spi-nor/spi-nor.c @@ -39,6 +39,10 @@ #define SPI_NOR_MAX_ID_LEN 6 #define SPI_NOR_MAX_ADDR_WIDTH 4 +/* Added for S25FS-S family flash */ +#define SPINOR_CONFIG_REG3_OFFSET 0x800004 +#define CR3V_4KB_ERASE_UNABLE 0x8 +#define SPINOR_S25FS_FAMILY_EXT_JEDEC 0x81 struct flash_info { char *name; @@ -78,6 +82,7 @@ struct flash_info { }; #define JEDEC_MFR(info) ((info)->id[0]) +#define EXT_JEDEC(info) ((info)->id[5]) static const struct flash_info *spi_nor_match_id(const char *name); @@ -899,6 +904,7 @@ static const struct flash_info spi_nor_ids[] = { */ { "s25sl032p", INFO(0x010215, 0x4d00, 64 * 1024, 64, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, { "s25sl064p", INFO(0x010216, 0x4d00, 64 * 1024, 128, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, + { "s25fs256s1", INFO6(0x010219, 0x4d0181, 64 * 1024, 512, 0)}, { "s25fl256s0", INFO(0x010219, 0x4d00, 256 * 1024, 128, 0) }, { "s25fl256s1", INFO(0x010219, 0x4d01, 64 * 1024, 512, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, { "s25fl512s", INFO(0x010220, 0x4d00, 256 * 1024, 256, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, @@ -1036,6 +1042,50 @@ static const struct flash_info *spi_nor_read_id(struct spi_nor *nor) return ERR_PTR(-ENODEV); } +/* + * The S25FS-S family physical sectors may be configured as a + * hybrid combination of eight 4-kB parameter sectors + * at the top or bottom of the address space with all + * but one of the remaining sectors being uniform size. + * The Parameter Sector Erase commands (20h or 21h) must + * be used to erase the 4-kB parameter sectors individually. + * The Sector (uniform sector) Erase commands (D8h or DCh) + * must be used to erase any of the remaining + * sectors, including the portion of highest or lowest address + * sector that is not overlaid by the parameter sectors. + * The uniform sector erase command has no effect on parameter sectors. + */ +static int spansion_s25fs_disable_4kb_erase(struct spi_nor *nor) +{ + u32 cr3v_addr = SPINOR_CONFIG_REG3_OFFSET; + u8 cr3v = 0x0; + int ret = 0x0; + + nor->cmd_buf[2] = cr3v_addr >> 16; + nor->cmd_buf[1] = cr3v_addr >> 8; + nor->cmd_buf[0] = cr3v_addr >> 0; + + ret = nor->read_reg(nor, SPINOR_OP_SPANSION_RDAR, &cr3v, 1); + if (ret) + return ret; + if (cr3v & CR3V_4KB_ERASE_UNABLE) + return 0; + ret = nor->write_reg(nor, SPINOR_OP_WREN, NULL, 0); + if (ret) + return ret; + cr3v = CR3V_4KB_ERASE_UNABLE; + nor->program_opcode = SPINOR_OP_SPANSION_WRAR; + nor->write(nor, cr3v_addr, 1, &cr3v); + + ret = nor->read_reg(nor, SPINOR_OP_SPANSION_RDAR, &cr3v, 1); + if (ret) + return ret; + if (!(cr3v & CR3V_4KB_ERASE_UNABLE)) + return -EPERM; + + return 0; +} + static int spi_nor_read(struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf) { @@ -1361,6 +1411,12 @@ int spi_nor_scan(struct spi_nor *nor, const char *name, enum read_mode mode) spi_nor_wait_till_ready(nor); } + if (EXT_JEDEC(info) == SPINOR_S25FS_FAMILY_EXT_JEDEC) { + ret = spansion_s25fs_disable_4kb_erase(nor); + if (ret) + return ret; + } + if (!mtd->name) mtd->name = dev_name(dev); mtd->priv = nor; -- 2.1.0.27.g96db324