From patchwork Fri Nov 18 10:42:48 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Krzeminski, Marcin (Nokia - PL/Wroclaw)" X-Patchwork-Id: 696537 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 [IPv6:2001:1868:205::9]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3tKvmg3vCLz9t0X for ; Fri, 18 Nov 2016 21:46:11 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=nokia.onmicrosoft.com header.i=@nokia.onmicrosoft.com header.b="lIj/sIIy"; dkim-atps=neutral Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.85_2 #1 (Red Hat Linux)) id 1c7gf7-00055j-HY; Fri, 18 Nov 2016 10:44:53 +0000 Received: from mail-eopbgr30139.outbound.protection.outlook.com ([40.107.3.139] helo=EUR03-AM5-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.85_2 #1 (Red Hat Linux)) id 1c7geW-0004oq-2D for linux-mtd@lists.infradead.org; Fri, 18 Nov 2016 10:44:19 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nokia.onmicrosoft.com; s=selector1-nokia-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=eIFbx0x5sLap1Fwqmdj2qb0giviF/Ok8EoyEf3lF43M=; b=lIj/sIIy3DrBPPWtIylq248rqID7sxU2cv6gAZRzaIOdRwDciuj4f9mtl6ME8Me3C2+8Lu5Ffd5XV5+RdK4mXU/mkBqJHWTsJXMpKR+NgLi4n5RpRwbcYHrDaiTVkSaDPa9XMZkJjvFSWUt+oaeXOeubwlvpP7SqpvOAHHJGyio= Received: from DB6PR0701CA0041.eurprd07.prod.outlook.com (10.168.7.179) by VI1PR07MB1408.eurprd07.prod.outlook.com (10.165.238.14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.747.5; Fri, 18 Nov 2016 10:43:51 +0000 Received: from DB3FFO11FD039.protection.gbl (2a01:111:f400:7e04::108) by DB6PR0701CA0041.outlook.office365.com (2603:10a6:4:3::51) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.734.2 via Frontend Transport; Fri, 18 Nov 2016 10:43:51 +0000 Authentication-Results: spf=pass (sender IP is 131.228.2.241) smtp.mailfrom=nokia.com; lists.infradead.org; dkim=none (message not signed) header.d=none;lists.infradead.org; dmarc=pass action=none header.from=nokia.com; Received-SPF: Pass (protection.outlook.com: domain of nokia.com designates 131.228.2.241 as permitted sender) receiver=protection.outlook.com; client-ip=131.228.2.241; helo=fihe3nok0735.emea.nsn-net.net; Received: from fihe3nok0735.emea.nsn-net.net (131.228.2.241) by DB3FFO11FD039.mail.protection.outlook.com (10.47.217.70) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.734.4 via Frontend Transport; Fri, 18 Nov 2016 10:43:48 +0000 X-IncomingTopHeaderMarker: OriginalChecksum:; UpperCasedChecksum:; SizeAsReceived:1072; Count:12 Received: from fihe3nok0735.emea.nsn-net.net (localhost [127.0.0.1]) by fihe3nok0735.emea.nsn-net.net (8.14.9/8.14.5) with ESMTP id uAIAh8Uw006390 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 18 Nov 2016 12:43:08 +0200 Received: from CNU418C7XK.nsn-intra.net ([10.154.154.85]) by fihe3nok0735.emea.nsn-net.net (8.14.9/8.14.5) with ESMTP id uAIAh6xR006361; Fri, 18 Nov 2016 12:43:08 +0200 X-HPESVCS-Source-Ip: 10.154.154.85 From: To: Subject: [PATCH v2 2/3] mtd: spi-nor: Implement die erase command logic Date: Fri, 18 Nov 2016 11:42:48 +0100 Message-ID: <1479465769-28276-3-git-send-email-marcin.krzeminski@nokia.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1479465769-28276-1-git-send-email-marcin.krzeminski@nokia.com> References: <1479465769-28276-1-git-send-email-marcin.krzeminski@nokia.com> X-IncomingHeaderCount: 12 X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:131.228.2.241; IPV:NLI; CTRY:FI; EFV:NLI; SFV:NSPM; SFS:(10019020)(6009001)(7916002)(2980300002)(438002)(199003)(189002)(36756003)(2351001)(68736007)(47776003)(106466001)(6666003)(305945005)(356003)(626004)(86152002)(87936001)(86362001)(2950100002)(6916009)(8676002)(5660300001)(110136003)(7846002)(50986999)(5003940100001)(76176999)(189998001)(81156014)(8936002)(50226002)(53416004)(81166006)(48376002)(97736004)(33646002)(77096005)(92566002)(2876002)(2906002)(4326007)(50466002)(38730400001); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR07MB1408; H:fihe3nok0735.emea.nsn-net.net; FPR:; SPF:Pass; PTR:InfoDomainNonexistent; A:1; MX:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; DB3FFO11FD039; 1:xk6nojU53Jm/UySh6e+6hdlILTuTNdlqmiRV0ha/4OrJ/RqGPc30E3md89ASuK68uQ+WB5RkZVQBruCUByFCS0j7ftFQ1A47JbfLpqiAa93LcWKv91yaGfyOwFkv/HYph/Qgc5Fypy79KjjBK5YkAeim5+nch1MsRCEj3goPtRmfFnxyZds0YV1WMriaOfau18RT/hsS0vrjQKPJIGtXlrFv7jwCErr7xfxmNioGdKa8ojpDudtpXpR9zubNxDGvB685MYk9Z7VQRCwz40zjOLQv4udo7yo9RJEuMGv8Om4m/SCgyuvGDtXS1SBtVCq61UR/PCADFBcvz/9kZNhIttD4IvldwdBdOww3ZNJWADUg/aDgk8AYPaByY82O+0HpGsTvaOrQVbfwKniGRrs+Qq6THImJ37wJGH2zVptgbOR4ZSXAtcSwud1IEyR7xEAn0lMJdJt7ViIrmydTKiKyery2iw9hVmcbwVoyxHelqJN1nhFPDIuG3OYgoRd+8QYORXIRfBxX//4hYm9tspBbaA== MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: 89fbbedb-dde2-4e76-f91d-08d40f9fc8b0 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(8251501002); SRVR:VI1PR07MB1408; X-Microsoft-Exchange-Diagnostics: 1; VI1PR07MB1408; 3:FBHa+Ic+sw6I5dzM679BlSKUbdH+Vn0YPwJae8jilvGA15j1Whq6KXRZ31V37sdpn0iujr/xSV9BBv1+GknZU3Z9J9DckV+gV6jWVlRYkTIAk8voIvh8ZNSWH0b/0phVb/2m8BI76CdqJm14lc5C+9a110F3Oy58zSw/UCCi0alM1h7LpMybEGSLrcq6b86WXtyBVFpoYuiGTmH/PGkQ3A8aZxluOhD2aQ1Dee5bKTQMl5wTVB1dYCjYeMzOwWdVk/0YxggP7IDWscWIn+YvELDyGGS48tnp1K0oaP4X+uEwLbhdItxWNoQZqWh6OinWfb04Aepm6qJ2HKB9GQ9fZQrpDheDyCyLRlxltSWRIhTOYLyqiK9aCttE+DFlWGrZkPtiCTjvAfFW0uhBcF3+9w==; 25:NwB9npm1c5D06IyTXWZTLcMyZUKJrb+RYl4p5E8XHs1Yrbb4TiVU/qCW6lXtVIb+UErWWPMMv7Rz/wUb5FTNxyjFK9oBQzKl+MCDoWQaDni/LdO/XImLbqDpw1AM+w+92MmCOQR3gZIXS7aQuP7TzoiZETkC/1XP1nSNODf9iu8viasiQ8KHxumriFYU8q0/I2kWTDhgUKbueyR7OorAt9uAK5295BCRKpiBdnNerL4PfdHtFhnoJsB0a7GZyd4MQLi9fsc8UpyUydrqC6qC4Gq97AcbORpABf/joLp8MFmQPv9GH55zT9QZ/SzmNo+rwih0s1MQkLPERr3LJ2rAGWbXi+Jg3KD/r6X/Qceuu1Nk+99uNPVbLNn/YdDPODzya9K6RtlAahhRQDk+Ob6jKCsyQQmky/Ri0f0L+aEJn2/6cq2gLZ3ey7DHI1MeSj/TU5Va7pnk/mFpWojxkqfdqw== X-Microsoft-Exchange-Diagnostics: 1; VI1PR07MB1408; 31:n32fXu8G5Ko6rtxw2vurBW2byPG0qHz3IBcIJa/lQRqV5T4r5fnHHP4t1RHmZDwOchwWS6r90R6IdMjk/f9onxti3OWqyIcdifYr5BxZnxcbEXVPufqxKCFxLEqlxWKs8W2lbp6FOe8jHGuwHWd2R3gRzODnAeD3qKZemzuNEs/F5I0MFa4ZbUmp5JpGRKrK+rBeTTmvxfXy3ymha2rvFGtVsg1vcxpFHMolAg8ZsyKZozPtX4woTc3yp5xQKzkzW4xLmMwM/N+N4i/f+u0r0g==; 20:McUfEsPjmypPjxVYAQjzS3AP58bMwkK4AgSfpb66VAbabQqsYO2VS5WgjMCPgPWj03gU3YJTKBxBCJRTR0FGWBUeCCG4PymVbmqBkYihksTyyH+W50iEmZ0sk86t/ThdMRkW1cSvldUj9+H6gYOIwOALB++Y023fEdrBhs6ZfNZvlHwjhEvPDLnGpD5t9SrLOYoTDr2xqTN0G8Bwb243z64z8mW7F8LSvLrvyrwYBA3A+N0pHwseTIssGiUvqw3DbR7fnQz+j11yZgq3lF3gUJzBN/t520GQEtlyDwJNTB94s7nEaHQPEv4DZYI4bdVWZ9SkrGWmU5igXWvOBOLzgGFgyzvy9RffwB+n8eWfjIbA2pu2PDMiZ8dZXMp4Q2r2g/1zRG2EL+GEhDcz0ZvcynUU3napcB6d0+s6gUgFWwdczGG5VfxWnOzgOrViomzIS2kDoM8zs+/dAB8SfH/RxGffzjeRFP5y2fhVYk5d6pUHufCMjuTEGacc5eJ8EUsgwzQKn+dzDenkDDSvCl5zJDpIWnA+Xe4HzoS+vmcI9/1XOoHE4HuRiev1Tb2hK3uPiaMHlAWmVFGT8EUXNTXs9GEtFXv7+WYqmc7ncUpqcjQ= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(82608151540597); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040281)(6060326)(601004)(2401047)(13016025)(8121501046)(5005006)(13018025)(3002001)(10201501046)(6055026)(6041223)(6061324); SRVR:VI1PR07MB1408; BCL:0; PCL:0; RULEID:; SRVR:VI1PR07MB1408; X-Microsoft-Exchange-Diagnostics: 1; VI1PR07MB1408; 4:X6TowabCS4V1tMubLRaHwZfir1Wew4eSc4gp7Q9s8Y6+tZyYkBrIk8jySP7IF9aSZof6XW2XBZzW2F3/NcqP071T8XaevCLvhF9iV/jHkWfa1E0oW6B97ZaQeREcOF032oTRdn+iWGz7hlliBkaiSbTLrXkZG6WMZp9/2UDAdMVrrGxPPdF3kLH2Wfa+aiw4gNgTpK1zc0EyNPN9OBc1Yd2BqdYGT8U4Oi2MNBHn1MqfDaS8nF6xSyG6b4yvBiNPlsi49r6M9pL14uhdI/isd2+a+vxr/osBHxQzXKeiaE8ng80H8ho/ldQAqZlnbTMrjbfHIFiTvuf8Iif/kQjGd400vYpSakzyuyqOG8IAwdAdJxdgYfvuAT8FexT1RFQk3R4qn04Ql6cxJDxzVa8ZqXxRgoHaicOgyO923D1Q+nDrYy8N49oc6vGRgaR1aMKQCxSdFSjX1ceciOB9fjz2Iku2FG6rxwNuL6eTV65gxl1ru3O6fHsyEm68G00FuPyJNUDvH7DfDOiNOK/MYU7qxd7vXTyiDqMNzxxZnjMkhq0EjHB1DF5hg47k9fug6559 X-Forefront-PRVS: 01304918F3 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR07MB1408; 23:hsHGmzBj+2OdRv4Oap5m//GaWYYcSnIhKevwcqAhI?= =?us-ascii?Q?ti9n+K4Ak4d760gGhtPzS7q3WeoMFy8UAP7uSTl9aQDJzRsCvyZl6fEt1Jzd?= =?us-ascii?Q?zIUbyvz2s+r3i20pDAZJHcENr2nBuNMqb9UIKPnj4DvfkYQLRbJOg+ZZqI7n?= =?us-ascii?Q?8/Lk4FJSypVlrOf+JBJTpFRH8jsOC7a7v4emdKIoQzaKNsKIBDv6ImYlkQmR?= =?us-ascii?Q?YeVbBoNF4LSXo1Jz3PqYWCNQy/z0zAJ+qa/7RivXSav3XAqHeB3N2ocCYc91?= =?us-ascii?Q?W4JmS9DLgDT96KHGoTpHjuSsO2vSb06WG01nh6dPpeimI0a2dIb87cd0CC5l?= =?us-ascii?Q?Em8w/LIlMj3eL61+oXKz3y/+WJGPyvkAiiMH3CLFC7PWpoknn1nQCj4ie3xA?= =?us-ascii?Q?wy24VGlvNodIcs1/kF2+Up0T4Y+iZkaPQjwniGZQcyhv+piWwtmkk2A8xZTm?= =?us-ascii?Q?d35dErjkvc3Y9v92tHaQ7H7J8WDG26Oenn9jpNnHDVMWJ+PLqS35lgoR0oKr?= =?us-ascii?Q?Y0pKXWOpTbFDibtDsaIx6nuCzRbkPP1G0Bsc/CoVFOePan94RDY4AUbTzsF0?= =?us-ascii?Q?IOZNXxtjqj0I5dsSNPeKh3Q0JCA7dRd+kE0AFP2gS/OOZqhFd9fLyFuh43PV?= =?us-ascii?Q?Y4pwqWqeikfSp1W34ecE3RCVJH07VvEsQBtzvppwAyJgWCO2dVr/tE7EmM1I?= =?us-ascii?Q?ldYZ94DvGTWzGmwxSVkrsvzGJQUGd7VVeBO3z6fZ1dRY+Pdbwsy0jyBURfpB?= =?us-ascii?Q?V3y07mUF2pFz7vTDlVmqGrkx8U/HYqTulpqDStONFdaW+5MhtznN1g4M3Jk5?= =?us-ascii?Q?X8WWvN2eV0gkEIUDoaTml6m5QJ8wHtYR66wAwsiBqA1t+ChP76RLISfrtMBg?= =?us-ascii?Q?fk5mzZVb2qEjT3dtlfI8UC49nqZJI6d+w9fACU1gSOOOVPykq6Qv4JeB2tU3?= =?us-ascii?Q?P8xDP+eM/DeaeuFB0X/FsS7EHH/lhQt+WvgDwkiPRuTP65mVHXs4yqLX5Hqm?= =?us-ascii?Q?AnWtocaCtN9/uoGffRRxLWFBc/731KlebTZkfU3qEiVBg=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; VI1PR07MB1408; 6:yZSTTx/4Tv9N4W++Ixpy03l5BSlL4oeRGV+fN7r6XXT3KBMtK1Da2nJJ31GE519yqJnZ7WKdZp3qTvepD3ObJjmp27cGUdXmtGYiUiCkxCYLgsPnXTxBSEWNjTImdZR5h9jZVxWomFthSNwusaSlXwfCUPczXE0FK7wGPNAyczZ3YUFHpQBThtVmr8mGiIOj8MMBqZ0iW/8oD9R2+repVENi/R5VC8yNxr5SRrCyJjvbv+aomWnTnXdhP6Sn7SMVFYwqz/bA+S9tDJNfWqvfMmO5zF02Dp19ztsl+AxDyAQTaxTfyS5NBAaXO8ReRvhYIpMqU4vYmRP61KzlUOx7Snv+JDhbvmn4SuV/xKDmuCk93Nz6BLlV4pQJTgO0EIrHmeOxB5l5zbl9t0ah/3Clw1lnptsJrbMD0Vdw5Q3Kifaf1N6fB+Rs6VogfAFp5OSLZUWsaFRHL4sKJRxm+smU3arJ0neb161xtCX4gU4e8HP31osHBaZIsIdywh4OH0Mg; 5:JYmotyWZ5GBw3KkNU0P/zwRP6A7piWCCPJhXA0KHNwvmFa7hduVVrIhVz5C9GbuZVOgMnqEpqY6KrRqPT/ICWx+ey5/mKpYnUqjrLdNdK8OGbOux+kMWAQy0tGvl12ct8NSiv9cESo8W3E+eWqiWYznS6+z7IUuKGo/jvFr+lJ4=; 24:7+8fRCCPbbZA+j/ElLaNiqcXM3HDCueobLWAKuWXwNJVc47O6zG6GbTWdlXQo02hYY0cp3PBM+eZ6580kIB1Ezvh8pV01eGIi8nI/4ffxdg= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR07MB1408; 7:fODZR0FX1vKbUgIDpsAqggWiyZGZhWA2s2S990Q/cje9fjuYfX6dolppe2VyJ7P9b+alslnICnTU8yPmj0vSa+hoikSvZV/vWAFaJ07ren8aKZovpH5Nnv49sb2TINZnNgVy2uYSMjzHLHOmvfEFv4oZmgLte7o6tTK2Gmr6oyw9JLuguPLVIzt2lkHQcVOt5iV9NXkQPnvrSPDdZ1xa5wuF+8wUCW2C7B1HDSrBs9ahXAIoqaEgsJ2GVGmkr315+Mxb7s1llvq6hWVFEHliWNgacudBvstyV3qLHLrADgOEs67Ru2LU4igz412wAolxmvpA7zaN3KYy4K0yBakNOoAin11+LTk2J2h+wW2Vh7+dJB6KsaTdsbOBqnMEBGzDRc8YxqfcuXMeK0b1tV20hBOMmitq3s2sKjQySkSKzdcxt/wgq/bjFMOrbcFds1stiTSfxM6EMYm5wGfrzPH7Bw== X-OriginatorOrg: nokia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Nov 2016 10:43:48.7840 (UTC) X-MS-Exchange-CrossTenant-Id: 5d471751-9675-428d-917b-70f44f9630b0 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5d471751-9675-428d-917b-70f44f9630b0; Ip=[131.228.2.241]; Helo=[fihe3nok0735.emea.nsn-net.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR07MB1408 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20161118_024416_428254_82018CA0 X-CRM114-Status: GOOD ( 13.21 ) X-Spam-Score: -1.9 (-) X-Spam-Report: SpamAssassin version 3.4.0 on bombadil.infradead.org summary: Content analysis details: (-1.9 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_MSPIKE_H3 RBL: Good reputation (+3) [40.107.3.139 listed in wl.mailspike.net] -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [40.107.3.139 listed in list.dnswl.org] -0.0 SPF_HELO_PASS SPF: HELO matches SPF record -0.0 SPF_PASS SPF: sender matches SPF record -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.0 RCVD_IN_MSPIKE_WL Mailspike good senders X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: computersforpeace@gmail.com, marek.vasut@gmail.com, cyrille.pitchen@atmel.com, rfsw-patches@mlist.nokia.com, dwmw2@infradead.org Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org From: Marcin Krzeminski This commit implements die erase logic. Sector at a time procedure is moved to function, then erase algorithm will try to use die erase cmd if size and address cover one or more dies. Signed-off-by: Marcin Krzeminski --- drivers/mtd/spi-nor/spi-nor.c | 88 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 77 insertions(+), 11 deletions(-) diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c index 9b8656e..5fc809e 100644 --- a/drivers/mtd/spi-nor/spi-nor.c +++ b/drivers/mtd/spi-nor/spi-nor.c @@ -369,6 +369,29 @@ static int spi_nor_erase_sector(struct spi_nor *nor, u32 addr) return nor->write_reg(nor, nor->erase_opcode, buf, nor->addr_width); } +static inline int spi_nor_sector_at_time_erase(struct mtd_info *mtd, u32 addr, u32 len) +{ + struct spi_nor *nor = mtd_to_spi_nor(mtd); + int ret = 0; + + while (len) { + write_enable(nor); + + ret = spi_nor_erase_sector(nor, addr); + if (ret) + return ret; + + addr += mtd->erasesize; + len -= mtd->erasesize; + + ret = spi_nor_wait_till_ready(nor); + if (ret) + return ret; + } + + return ret; +} + /* * Erase an address range on the nor chip. The address range may extend * one or more erase sectors. Return an error is there is a problem erasing. @@ -376,9 +399,10 @@ static int spi_nor_erase_sector(struct spi_nor *nor, u32 addr) static int spi_nor_erase(struct mtd_info *mtd, struct erase_info *instr) { struct spi_nor *nor = mtd_to_spi_nor(mtd); - u32 addr, len; + u32 addr, len, die_no, die_size; uint32_t rem; int ret; + unsigned long timeout; dev_dbg(nor->dev, "at 0x%llx, len %lld\n", (long long)instr->addr, (long long)instr->len); @@ -395,7 +419,7 @@ static int spi_nor_erase(struct mtd_info *mtd, struct erase_info *instr) return ret; /* whole-chip erase? */ - if (len == mtd->size) { + if (len == mtd->size && !(nor->flags & SNOR_F_DIE_ERASE)) { unsigned long timeout; write_enable(nor); @@ -425,17 +449,59 @@ static int spi_nor_erase(struct mtd_info *mtd, struct erase_info *instr) /* "sector"-at-a-time erase */ } else { - while (len) { - write_enable(nor); - - ret = spi_nor_erase_sector(nor, addr); - if (ret) + if (nor->die_cnt && (nor->flags & SNOR_F_DIE_ERASE)) { + die_size = div_u64_rem(mtd->size, nor->die_cnt, &rem); + if (rem) { + ret = -EINVAL; goto erase_err; + } - addr += mtd->erasesize; - len -= mtd->erasesize; - - ret = spi_nor_wait_till_ready(nor); + while (len) { + die_no = div_u64_rem(addr, die_size, &rem); + + /* Check if address is aligned to die begin*/ + if (!rem) { + /* die erase? */ + if (len >= die_size) { + ret = spi_nor_die_erase(nor, addr); + if (ret) + goto erase_err; + + len -= die_size; + addr += die_size; + + timeout = max(CHIP_ERASE_2MB_READY_WAIT_JIFFIES, + CHIP_ERASE_2MB_READY_WAIT_JIFFIES * + (unsigned long)(die_size / SZ_2M)); + ret = spi_nor_wait_till_ready_with_timeout(nor, timeout); + if (ret) + goto erase_err; + } else { + ret = spi_nor_sector_at_time_erase(mtd, addr, len); + if (ret) + goto erase_err; + len = 0; + } + } else { + /* check if end address cover at least one die */ + if (div64_ul(addr + len, die_size) > ++die_no) { + /* align to next die */ + rem = die_size - rem; + ret = spi_nor_sector_at_time_erase(mtd, addr, rem); + if (ret) + goto erase_err; + len -= rem; + addr += rem; + } else { + ret = spi_nor_sector_at_time_erase(mtd, addr, len); + if (ret) + goto erase_err; + len = 0; + } + } + } + } else { + ret = spi_nor_sector_at_time_erase(mtd, addr, len); if (ret) goto erase_err; }