From patchwork Tue Sep 25 12:20:29 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Naga Sureshkumar Relli X-Patchwork-Id: 974364 X-Patchwork-Delegate: miquel.raynal@bootlin.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=xilinx.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="IFxh5JQO"; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=xilinx.onmicrosoft.com header.i=@xilinx.onmicrosoft.com header.b="FcTjeUmD"; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::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 42KKvM6l4tz9rxp for ; Tue, 25 Sep 2018 22:22:07 +1000 (AEST) 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:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version: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=54qZQ7NkANZI+5T3p4RuJtRkZIwZIm+/7dseTCgUU3E=; b=IFxh5JQOa4R1Hq Z9Ku5Vh1VsF+OJ/+fDFKTGL8qKL0mOnoy6jPzM+lOy4WhgjVLxyfDFnwRNGWFrCnRtAxMs94Owjm2 5qB7yYolxNBhGN96IITSmWfi9jmEKbNw8/l0c1Hh8Ssgb0FhYHOFFBzwgpCwpH81yINvNPwAe1Nze CriygwyngG11tKdrqWG+joW5KhF2Jzw1zAK2Qhdhmw5TNMN5VJ+sFd9pxfwsoXNKorciDbZsOmaZ7 vTZt47vly4Dx3OAG1gCxBBVqC6taRsN9xv2vcz1V/6rnQy4Tl2apACD+3N5ZHQpsS5buni6kX8qnC ap6SDvFAkzJ9dj1x0/gg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1g4mLi-0008Dv-6d; Tue, 25 Sep 2018 12:21:54 +0000 Received: from mail-eopbgr730088.outbound.protection.outlook.com ([40.107.73.88] helo=NAM05-DM3-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1g4mLM-0008C3-55 for linux-mtd@lists.infradead.org; Tue, 25 Sep 2018 12:21:33 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=xilinx.onmicrosoft.com; s=selector1-xilinx-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Wo/CT5srXkGKGrAsBIOB3iI9FibiQ12Et+tBFrKsLbg=; b=FcTjeUmDnKbziPxsAYPF+i1P/BleXXI23CtTjVy7kLgNPbEVS3El/KWY4sUDsd4fHx6Z9MMNq/OemPo0Neyf1kb9+z8AMucUmcrRirpjg9WKTgtiIVThR4eGUZ5QRhkmElNcHiLD10PNRNRqQnZUicfXdhopPF/a6CiKThshQGA= Received: from SN4PR0201CA0036.namprd02.prod.outlook.com (2603:10b6:803:2e::22) by DM6PR02MB4764.namprd02.prod.outlook.com (2603:10b6:5:18::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1164.25; Tue, 25 Sep 2018 12:20:59 +0000 Received: from BL2NAM02FT031.eop-nam02.prod.protection.outlook.com (2a01:111:f400:7e46::208) by SN4PR0201CA0036.outlook.office365.com (2603:10b6:803:2e::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.1164.22 via Frontend Transport; Tue, 25 Sep 2018 12:20:59 +0000 Authentication-Results: spf=pass (sender IP is 149.199.60.100) smtp.mailfrom=xilinx.com; gmail.com; dkim=none (message not signed) header.d=none;gmail.com; dmarc=bestguesspass action=none header.from=xilinx.com; Received-SPF: Pass (protection.outlook.com: domain of xilinx.com designates 149.199.60.100 as permitted sender) receiver=protection.outlook.com; client-ip=149.199.60.100; helo=xsj-pvapsmtpgw02; Received: from xsj-pvapsmtpgw02 (149.199.60.100) by BL2NAM02FT031.mail.protection.outlook.com (10.152.77.173) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.20.1185.13 via Frontend Transport; Tue, 25 Sep 2018 12:20:58 +0000 Received: from unknown-38-66.xilinx.com ([149.199.38.66]:40231 helo=xsj-pvapsmtp01) by xsj-pvapsmtpgw02 with esmtp (Exim 4.63) (envelope-from ) id 1g4mKo-0005pW-0m; Tue, 25 Sep 2018 05:20:58 -0700 Received: from [127.0.0.1] (helo=localhost) by xsj-pvapsmtp01 with smtp (Exim 4.63) (envelope-from ) id 1g4mKi-0004n6-T5; Tue, 25 Sep 2018 05:20:52 -0700 Received: from xsj-pvapsmtp01 (xsj-smtp1.xilinx.com [149.199.38.66]) by xsj-smtp-dlp1.xlnx.xilinx.com (8.13.8/8.13.1) with ESMTP id w8PCKpiQ007553; Tue, 25 Sep 2018 05:20:51 -0700 Received: from [172.23.37.108] (helo=xhdnagasure40.xilinx.com) by xsj-pvapsmtp01 with esmtp (Exim 4.63) (envelope-from ) id 1g4mKg-0004mH-KP; Tue, 25 Sep 2018 05:20:51 -0700 From: Naga Sureshkumar Relli To: , , , , , Subject: [LINUX PATCH v11 1/3] dt-bindings: mtd: arasan: Add device tree binding documentation Date: Tue, 25 Sep 2018 17:50:29 +0530 Message-ID: <1537878031-22253-2-git-send-email-naga.sureshkumar.relli@xilinx.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1537878031-22253-1-git-send-email-naga.sureshkumar.relli@xilinx.com> References: <1537878031-22253-1-git-send-email-naga.sureshkumar.relli@xilinx.com> X-RCIS-Action: ALLOW X-TM-AS-Product-Ver: IMSS-7.1.0.1224-8.2.0.1013-23620.005 X-TM-AS-User-Approved-Sender: Yes;Yes X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:149.199.60.100; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(396003)(376002)(346002)(136003)(39860400002)(2980300002)(438002)(189003)(199004)(39060400002)(50226002)(2201001)(9786002)(110136005)(2616005)(478600001)(8936002)(5660300001)(476003)(7696005)(8676002)(36386004)(305945005)(77096007)(186003)(26005)(217873002)(2906002)(356003)(81156014)(81166006)(36756003)(48376002)(51416003)(6666003)(14444005)(336012)(76176011)(50466002)(486006)(426003)(316002)(16586007)(106466001)(126002)(47776003)(107886003)(63266004)(446003)(54906003)(11346002)(4326008)(106002)(34290500001)(107986001)(5001870100001); DIR:OUT; SFP:1101; SCL:1; SRVR:DM6PR02MB4764; H:xsj-pvapsmtpgw02; FPR:; SPF:Pass; LANG:en; PTR:xapps1.xilinx.com,unknown-60-100.xilinx.com; MX:1; A:1; X-Microsoft-Exchange-Diagnostics: 1; BL2NAM02FT031; 1:k4ZqqVwQRQ4dthS29zzXuyz5ESDh3MTj6VuSF7pmIVqohXPxArDrguoFY4anRFD/VDzhnMhYxOw7JF0FWNadpQlgILhro4XU6dXKyF626zSCa0XlGe6CQynBlincqhmK MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 37b1bdda-9183-40c9-841d-08d622e159bd X-Microsoft-Antispam: BCL:0; PCL:0; RULEID:(7020095)(4652040)(8989299)(4534165)(4627221)(201703031133081)(201702281549075)(8990200)(5600074)(711020)(4608076)(2017052603328)(7153060); SRVR:DM6PR02MB4764; X-Microsoft-Exchange-Diagnostics: 1; DM6PR02MB4764; 3:deIibC7icd06ZDTP+GW4qFwr+yI7HCJDOtLm7uZib28pG1ujwRJihDpHWXBNiUz22a2csuQKlK9KmeJmlqsMnszlgRP7zWe6kDDA69unAkW4+P/nKFnbju4N0cUH49Hf/+uxOLM8sz3abPuSAZK74hOPKqoqcGhdRS2NfPtJewWXYRFvxPbZME+gpaZe2xUsv7wy4LQ21Q374PpfHk8CjlD+qkFYSGcPVXBLPpmOt2qh56ELLTM3vZBic8aazQYh/HShIUbY5FYGPFmdWqXG3wtRg0nr0nGO7d4/PRDpLgeWQJ/wpCHikT1zdUJG5OR/yFk/uooTaWhGP+Ogf6t+dBG3xVt62IDo97X9Pvaw8U0=; 25:hMtDi7KVOVGEXThwoNw1n6vEncBLekrLCiK5/nD/PZzJvOeBtSbLxXl+G9QwY7y9pAGxFBvILsjWsaZGKb75nRvtP4PSdIe6AA8OhtB0gqki3Jhdq0CjcF2fkoE6YXVngwv2KNOQz8ad329X20aLIYg+hszvs1+o5xUkS3VrdBi/7b+RYbvxthigRXT+p0W/GnlD3pvGHaJEHk4Ql86WqBExB4RZv4CBu+K0vqcUvPVi50zI4Ggzcz54jeaiPi9k84UOdoTxVCn1Rhh41Clge8riXBQQwqeNRTN4R9VGik5A0olrLGopDMYOgkCkmhP0jixDBfxvV0Koh1DKlbbBTQ== X-MS-TrafficTypeDiagnostic: DM6PR02MB4764: X-Microsoft-Exchange-Diagnostics: 1; DM6PR02MB4764; 31:zZNV95dXtqv637Rsr3Iq2CroFXES3KiHaJCcAHU35E12LgnQWXp+yM649xglBQ3fRUP3IZOe8mseAWJB9PkeGsQOigLKYTOjj/dfl4dCcMIfwTlKpCQ3P8yLEesrpHB8zqQ4cVFMMJdpjm067s82wUVowefB6ioPatnZfX02yjPK3l6+sbOKW8GOYhcQaHlXKfLxeCRvmjJK/WEdoTud9jTFyF8jsGRjWqWMeYK+n2E=; 20:sVKlDYxUdd4P2M4vBgv9meeiz5Ps2HLcSBZFgnn1FstAMsW1L4p65bvQluFK9qsEkb0gL5KbI6qYXIis9tE3s4/3rYqFuonG02Fv/H2iUDZ+Xlw3JhLT8/VB3HuGReBMCz9B7g2a1+iDV/cQixse1OsrxxMBqdOQOufXPqNt6ThBgHNrR/edj29eqL7Wc3omON87T6GyXesY/Yl51aJqaTY29XAY+sArGgaDBWyDJfdvtt7UsWrEgwDj9FRw/8vvUgyMPUem+QFQC1G8Bw1hISvr+cIaGrwC6v0tFmYXKx5Vo9bkT3Tn61nbkydTaZ2AnFfGlpepzByrBPx9iy54ji16gmE3CbdVNqxICPM9TDB+0bj0ztFOf7rQz2EmdW4k9zBfcieQ00frt8hGikDw/9dSpFLgLecY/8KTkT+2pAtodhmH1bhAeGH+KZjib90RD69WYi57DOb1nvsbNXWG3GSYICX/5GOo3V9E/Mf0rBCOaUjtO8koT9UideDRPwWr X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(192813158149592); X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(5005006)(8121501046)(93006095)(93004095)(3002001)(10201501046)(3231355)(944501410)(52105095)(6055026)(149066)(150027)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123560045)(20161123562045)(201708071742011)(7699051); SRVR:DM6PR02MB4764; BCL:0; PCL:0; RULEID:; SRVR:DM6PR02MB4764; X-Microsoft-Exchange-Diagnostics: 1; DM6PR02MB4764; 4:n3wa8cYXUtYoDtnza2iDPNdG67PjmmstnhgqG/vBSY2tIH4DRnVp3SIcb4wFsTaqQUvSkuLPnUzMBRIXnQp1dWlHbKunT4J5OXt2C4RXTy7lmlOHZeWhkrXSGBxBIl86ub53UtOUULGNw2EYGvZ2/AZSB4SENEcyLJVNHmMr2gN3rLz+r++VKkDzs6EwkIX3N4RLjAcKPoUbOIWLNIC8rVK+sptyCb2fU0pcPdhVOgxpeQw1A/Df0QErEbp400EARfnePPyHKNZytomMMm5/JREBTTNjjg5mxe8GZhxC6a6rIoltQCWARq412i9io8PA X-Forefront-PRVS: 08062C429B X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; DM6PR02MB4764; 23:qkOV/B1g4K+AVbez1ZuyKcD3d/lj1keaSaQVkeD4I?= ZsaOOHFKSyn/+sPM4vnIaOOrNVCdRXO1LAZ3tg1+uDxuwgqb3mlwdKyY6cxoOSZjIlCAh8i+6dbvb4dSp1tAt2sBOyE/ivpCbYb2SjkspQpbNH8CW4Z0S25mDPogakfi5B9nsfFb2puTbUfd0gXstJ2uOLpHzSCF3U7JCRx6hByPaiR2Z7s1WhhysAoVrCzIU69fcp22AsiTAIZ6cYeggbabcNH/cGIighjqX/h2Kjq74jIzD8TGYYMVIPfFldUOb6q0AaNGA+WYQKfIjM9gEBlomKLQXI1IDE3T0DuzGOm/6o/WJbxuSozmUl82H/DV9SP9g3+J3Z6F+viqbZYVBZbhd3TUJSKLfaVYMrIv0yrzJLKPH9thUe4m6D+Nj6co+RD65lM9zx/eZ/w/DlgMTG2asEpEF6q/qCqwzrcBmxb8nIbx0O13rk/3rnWXlgKck5+9JcERxTIqN6Kb1K66kE90I+iGkqbwPRrQWIdLG1KOnEOLI0AFPh/hZzyo6kIOGO1xNxmT7eId0bcfFgl7QnoOJDvZCHVssHNQW6pAiDEFT1GT4zB2gU0LBAQH5hggH/HzNOzs8HAyG0XliQNUVetxVW5gI1iy76oCuxkND5EyYT/2FgbaJhEP25ds4avcMtbiQqyhkGWw6o79MiXQN1xvJLfn3Ei3N9gRaak+RaJl2ysRxBTPx/wNcfv08daozmLGwxgwSRS/EQRR+4CF0H52nSc2AgLAUf+8gYdKRDUtPIFJ/2OncSKGQnS77b2pf3citiEqdIwaIcek+yhLiq46L1KtBPv1GCg0u+ycuxQETFiP/5b1O9lTEwZ8sdn1PgcbxALpRWKBVWdNecP6cZdS5CP7MTF1tyDa4dCPEmsNx2Q5jDtAF628sdrrCU9eWn1kRfPzEBlV9wwGu2GsjLWWeqf2kOSHqQZMV+MRoJkQQjQhS24KB+ABevmf6RcbUWp528EnS1p5EQfWXfMFSewWaRyJ16EK9icyB2cGSUaxQqNniL5g9W1fGIRSjIi1zuPfhiKZyVoHFnRbHMdKokJQFrLroKENQmpZobphf5BmgI/JJCIpGj7LZAff65o9oicsZV2hrue0h92gwosBTMlCgvMduLrlfq059i8ybuiwvvA40yjI9Tsf3Co0xkKpC09vtwnMEC3+YRs2REAaCJTDrchXzxaIHQTW/l9RtWxVsM0C9iGhtGY0ol5nM1Cvzc= X-Microsoft-Antispam-Message-Info: CuLAoD5DlawEl6T6kQawrWNlp4XduXYmyiuhmML14y4VYNsBTOfnw8yNhL5Yu4ckPIMCQ34etE+SeRDxjcK7JOTRoV1A7RIyZlSHe56ZrAlZRtrd9EMoIYtpabFXVu6i0vnVhSCgDFwmsvo+0yaC9yvjPegptaanp+OAAJkRbi5ns2wXR6T90/WGzx7b9ttDueQc8CqTaZtuFpVHgjJRSm8Iv3NiqUPLux8JAbZN1/M92OGsrjpYrWboUV1hS7WI7zIWuMwjW5Bj5Mb9rdKf4NyvrnBPhkUNNhj3fVEXm7E5clBgi7Hyh49tckWgXjlI/GR13zLHAEQtFE2M4DEwKJN9DOCP1+JCsdFbVV5vaIs= X-Microsoft-Exchange-Diagnostics: 1; DM6PR02MB4764; 6:se9ICC0xtThlqMBLRcLt/s/oUvX8T8JzmasijN6j0a6qfRzGLRcr175FHgWYMkpbDuXOqb1ze7JRIa/CvK3jGDOSiyLqldD/9TjSDFqBIfLKSsf0c02FWTwygFcepW0OJeCU7HYexLTw4AMrnDzAnI9mZ2nyv5oZyZWeOyACIYWqtAHT6vctcztHZaxuOXaIcHlbqfyqTHPMLn/nL03SgGAOtz33RV+2M3Ga9RrpN6ldrMdPIfLbjq+OKv8wEvPbjmiFwfuTXnpzJmJ1KmVvPeI4D1NpqJU9scCkvmkQDiOCkS25/s8QhM0t0Cs0kghAN6FMopa4x0KhBiyAeLjhSM6ml/C/dFG1rqVXSLdM+Qx8T+rLFXXgbB+hmPwT+hYK0eivaqQnIM+uCHzNbl80QmjASPCNHjkDawAQw/Gy/BFAgeS/erIvi9rg6LxXEZ7uwLaAL5X2xGV9WQWMofUNjg==; 5:0VzatDzrf1d+Kd6Q7IzgY+EW4pNr4ajnlZxvoxUSQsnNm8KAEejLkz1lJAzM+nAdVXSm33IlQ5z2Zmc/dIyDtgo9NNeQAO48ZfycbH7KDlKJHKmRIF3ELakCLDYQzXod5P2xLu2i8Ep+d/+HPs96rIzDuUFES90nu4zksOEnZN0=; 7:tYqUcv3PGF7SGmC5MF4ZR/iFP38ZlQy8H4Usr3PA87bnfnz7z1dsx7vk8D4J0oYewgtOShFZNr0q5KuGHBMFKdDkcapDU4tGh8hrRCWtzOPiw6bOJsUx+/dHyASNnOVB6lsHLpajnydZ/INa3tcfmmLD0jkTUxqz3/syStK/c198ptjAn3H3+v3qHQITwjdRkvJbsJEI9aTaf094n+jVHYz6xIoBCXb70dzDkFP2njYdF3SCQi+HkX3ZTftinn1R SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Sep 2018 12:20:58.6207 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 37b1bdda-9183-40c9-841d-08d622e159bd X-MS-Exchange-CrossTenant-Id: 657af505-d5df-48d0-8300-c31994686c5c X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=657af505-d5df-48d0-8300-c31994686c5c; Ip=[149.199.60.100]; Helo=[xsj-pvapsmtpgw02] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR02MB4764 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20180925_052132_272619_AFE53B88 X-CRM114-Status: GOOD ( 10.70 ) X-Spam-Score: -0.0 (/) X-Spam-Report: SpamAssassin version 3.4.1 on bombadil.infradead.org summary: Content analysis details: (-0.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [40.107.73.88 listed in list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record -0.0 SPF_HELO_PASS SPF: HELO matches SPF record -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 DKIMWL_WL_MED DKIMwl.org - Whitelisted Medium sender 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: michals@xilinx.com, linux-mtd@lists.infradead.org, linux-kernel@vger.kernel.org, Naga Sureshkumar Relli , nagasuresh12@gmail.com Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org This patch adds the dts binding document for arasan nand flash controller Signed-off-by: Naga Sureshkumar Relli --- Changes in v11: - Updated compatible description as suggested by Boris - Removed arasan-has-dma property Changes in v10: - None Changes in v9: - None Changes in v8: - Updated compatible and clock-names as per Boris comments Changes in v7: - Corrected the acronyms those should be in caps Changes in v6: - Removed num-cs property - Separated nandchip from nand controller Changes in v5: - None Changes in v4: - Added num-cs property - Added clock support Changes in v3: - None Changes in v2: - None --- .../devicetree/bindings/mtd/arasan_nand.txt | 33 ++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 Documentation/devicetree/bindings/mtd/arasan_nand.txt diff --git a/Documentation/devicetree/bindings/mtd/arasan_nand.txt b/Documentation/devicetree/bindings/mtd/arasan_nand.txt new file mode 100644 index 0000000..546ed98 --- /dev/null +++ b/Documentation/devicetree/bindings/mtd/arasan_nand.txt @@ -0,0 +1,33 @@ +Arasan NAND Flash Controller with ONFI 3.1 support + +Required properties: +- compatible: Should be "xlnx,zynqmp-nand", "arasan,nfc-v3p10" +- reg: Memory map for module access +- interrupt-parent: Interrupt controller the interrupt is routed through +- interrupts: Should contain the interrupt for the device +- clock-name: List of input clocks - "sys", "flash" + (See clock bindings for details) +- clocks: Clock phandles (see clock bindings for details) + +Required properties for child node: +- nand-ecc-mode: see nand.txt + +For NAND partition information please refer the below file +Documentation/devicetree/bindings/mtd/partition.txt + +Example: + nfc: nand@ff100000 { + compatible = "xlnx,zynqmp-nand", "arasan,nfc-v3p10" + reg = <0x0 0xff100000 0x1000>; + clock-name = "sys", "flash" + clocks = <&misc_clk &misc_clk>; + interrupt-parent = <&gic>; + interrupts = <0 14 4>; + #address-cells = <1>; + #size-cells = <0> + + nand@0 { + reg = <0> + nand-ecc-mode = "hw"; + }; + }; From patchwork Tue Sep 25 12:20:30 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Naga Sureshkumar Relli X-Patchwork-Id: 974366 X-Patchwork-Delegate: miquel.raynal@bootlin.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=xilinx.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="tygt3cbo"; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=xilinx.onmicrosoft.com header.i=@xilinx.onmicrosoft.com header.b="B3CjUCgW"; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::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 42KKwm5MRxz9s47 for ; Tue, 25 Sep 2018 22:23:20 +1000 (AEST) 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:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version: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=gyI+kBBG1UC1zrXpufJQOWItX5izO9gQnjrL4TRE0tQ=; b=tygt3cboPTR8vL wqq4MSGTt6ZEptyX05oSkpb/T7U6vR3tM5ELFhHjnzTec6CjWaEB9lAU9HdSG2Dwnv7lZXYkiIglO Voh2GX+elmKexqcIrFEk3r7F9g0BePXNp5b2GR8yoRjvwutNbAxmBX+5uLJOXlLNNXTZ68jPXg3VG yL2l2s3JDKkM/ia14QK8dkGM0zv6mIJNNwq8dvl2tq/8awDd5ZsHvN/9ZQjdPf3shTiNM6ceyS6Fp EFkuqhgWkyiKib3PyJxBgiv9z38JdfgNbv+EmrPCudya8cYRh6MQoJm7hgiJS7wVqb9r1kUIyL9Qx rrvRie9feSYgP91Fg+Bw==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1g4mMr-0008Vp-AN; Tue, 25 Sep 2018 12:23:05 +0000 Received: from mail-sn1nam01on060f.outbound.protection.outlook.com ([2a01:111:f400:fe40::60f] helo=NAM01-SN1-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1g4mLX-0008Cb-8f for linux-mtd@lists.infradead.org; Tue, 25 Sep 2018 12:21:45 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=xilinx.onmicrosoft.com; s=selector1-xilinx-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=4L3yQzsCP11nu+T0f7VKWDJI0Qlh9s88ey0STRs6Luk=; b=B3CjUCgWULxEK1e/+W6TanXG3mjjPt4byf0f+6Up0qiwRvvBd7kE80TTckxHD9c/Pj6q3/Eamlwhp1zCwtI1lzxrStIKxoiEtVgY25DOg8KkbBGPCU5/3BedNSaRG2mSFUHLssig8XlPC5bx6368Fbxv8/TKTYXIWU6e8QMTr+0= Received: from BN7PR02CA0014.namprd02.prod.outlook.com (2603:10b6:408:20::27) by SN6PR02MB4767.namprd02.prod.outlook.com (2603:10b6:805:90::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1164.22; Tue, 25 Sep 2018 12:21:10 +0000 Received: from CY1NAM02FT019.eop-nam02.prod.protection.outlook.com (2a01:111:f400:7e45::202) by BN7PR02CA0014.outlook.office365.com (2603:10b6:408:20::27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.1164.22 via Frontend Transport; Tue, 25 Sep 2018 12:21:10 +0000 Authentication-Results: spf=pass (sender IP is 149.199.60.83) smtp.mailfrom=xilinx.com; gmail.com; dkim=none (message not signed) header.d=none;gmail.com; dmarc=bestguesspass action=none header.from=xilinx.com; Received-SPF: Pass (protection.outlook.com: domain of xilinx.com designates 149.199.60.83 as permitted sender) receiver=protection.outlook.com; client-ip=149.199.60.83; helo=xsj-pvapsmtpgw01; Received: from xsj-pvapsmtpgw01 (149.199.60.83) by CY1NAM02FT019.mail.protection.outlook.com (10.152.75.177) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.20.1185.13 via Frontend Transport; Tue, 25 Sep 2018 12:21:08 +0000 Received: from unknown-38-66.xilinx.com ([149.199.38.66] helo=xsj-pvapsmtp01) by xsj-pvapsmtpgw01 with esmtp (Exim 4.63) (envelope-from ) id 1g4mKy-0008PF-8s; Tue, 25 Sep 2018 05:21:08 -0700 Received: from [127.0.0.1] (helo=localhost) by xsj-pvapsmtp01 with smtp (Exim 4.63) (envelope-from ) id 1g4mKt-0004sS-5Q; Tue, 25 Sep 2018 05:21:03 -0700 Received: from xsj-pvapsmtp01 (mailman.xilinx.com [149.199.38.66]) by xsj-smtp-dlp1.xlnx.xilinx.com (8.13.8/8.13.1) with ESMTP id w8PCKsQd007563; Tue, 25 Sep 2018 05:20:54 -0700 Received: from [172.23.37.108] (helo=xhdnagasure40.xilinx.com) by xsj-pvapsmtp01 with esmtp (Exim 4.63) (envelope-from ) id 1g4mKj-0004mH-W5; Tue, 25 Sep 2018 05:20:54 -0700 From: Naga Sureshkumar Relli To: , , , , , Subject: [LINUX PATCH v11 2/3] mtd: rawnand: Add an option to get sdr timing mode number Date: Tue, 25 Sep 2018 17:50:30 +0530 Message-ID: <1537878031-22253-3-git-send-email-naga.sureshkumar.relli@xilinx.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1537878031-22253-1-git-send-email-naga.sureshkumar.relli@xilinx.com> References: <1537878031-22253-1-git-send-email-naga.sureshkumar.relli@xilinx.com> X-RCIS-Action: ALLOW X-TM-AS-Product-Ver: IMSS-7.1.0.1224-8.2.0.1013-23620.005 X-TM-AS-User-Approved-Sender: Yes;Yes X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:149.199.60.83; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(39860400002)(376002)(346002)(396003)(136003)(2980300002)(438002)(189003)(199004)(11346002)(478600001)(81166006)(2906002)(186003)(9786002)(8676002)(81156014)(336012)(8936002)(50226002)(110136005)(54906003)(106002)(77096007)(26005)(316002)(16586007)(5660300001)(7696005)(51416003)(76176011)(48376002)(6666003)(50466002)(106466001)(217873002)(47776003)(36386004)(476003)(2616005)(107886003)(486006)(426003)(4326008)(446003)(39060400002)(36756003)(63266004)(2201001)(305945005)(356003)(126002)(34290500001)(107986001); DIR:OUT; SFP:1101; SCL:1; SRVR:SN6PR02MB4767; H:xsj-pvapsmtpgw01; FPR:; SPF:Pass; LANG:en; PTR:unknown-60-83.xilinx.com; MX:1; A:1; X-Microsoft-Exchange-Diagnostics: 1; CY1NAM02FT019; 1:owucEd62TXhhp5B+eaVuUOK5HHKAkqNtsKEFy8crfztlArmE/BsXpTR3rkhaxDP/JPUdwO5oJNjUAuda+kDWSc0p1+nkeImDroZyvUkAT40+8s8RycJCEDlpJJNfoYR3 MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 4fe758b9-0781-47be-d6d3-08d622e16045 X-Microsoft-Antispam: BCL:0; PCL:0; RULEID:(7020095)(4652040)(8989299)(4534165)(4627221)(201703031133081)(201702281549075)(8990200)(5600074)(711020)(4608076)(2017052603328)(7153060); SRVR:SN6PR02MB4767; X-Microsoft-Exchange-Diagnostics: 1; SN6PR02MB4767; 3:Y0/VM19xlQG9xEqSFOpyDgyJQeLQ7js5YBWE8x0SvMtHLNl+4Go2gSiTuvC7k/6ksWfm5Hrt56UZ6A8ji0O6v+qTClOJiFg6wK/D0cpXKnPYBXoNUlIDwnW3YS0nCXWbV1Dhkj529uHJPRqsC+/EJxZcIKI1CNG3HvaD/7Wso5cVEun6CG3L7URx1UNHoynmsGJhhTebs8Ur4hPIHSe7+l+CZZ69oV/3KKB27WIMbS933VXWTQX6L2Niq6EyxhDGDPKjnEAaPHOaCu4XOzTXpnmXmQXNm8RoLL4OGkiwzGn1IKH1RW9LYYWqdtZ4h7MjMGuChxvKW0jsDBHUnzNX7FThllEdtJorp1WHPrhUD1g=; 25:JhB33Llv/jUz0efbuGmtR3l2KVkcLYEwxAYo/pzCPo5pE6N3sKidLcsmhFxYu6iQMEzYM2EqQW5Lu+kaQE+erqXRUvZ0M2kYMMWKm23c2+SjONcNSh7UknwsFw+sGWxnoZK20gOn6wNf5f+9iAwyp9CwmKy5IzKY9xkk+OR/0mWh7GDBTZwabOojUSn6we1d4S39264LUBHSMq+XhOo1GWHM5uqSOVfIEdbddH5849x/9TJT5ga7knSh5jy0zLnHFDa6T/aVoLa9tfqly5gNvQo+nSCw+7M6tvJdDOV4ZiDfuW8Ca8WoPH9gfCiG3SWJJbXUlkicvo/VHqvqiK2DqA== X-MS-TrafficTypeDiagnostic: SN6PR02MB4767: X-Microsoft-Exchange-Diagnostics: 1; SN6PR02MB4767; 31:ikr6S/gOEPsn6U4opacxHf5B0f2VJXGsrwPO4gweAPiVsVaeTDQmqJSG5mEP6dXlmbogt0yo0TN4gUoLzO3pKIBSsE+ePytP+U+uuPlw1WCcKLovX+3skJWkAgOgobZAQGxSACjGEvYQdQE7Be2S/+iwchGdD7XnZNDFHkovQAtaHSFg7pu5pkMrnyOUNCZ2/RVayn48nWFSUWB/TZ0Q2cMm4/bNwxL1AEYTGkpmCJU=; 20:KQqWHRokgN2BFp8y+MjAkZRhXhCfaYfnW6e4azE7HlTGQlyCspCVyFYe3jzjrDxJ9eJyJb//XcTXzIvf7xY4VJtuzsw2zbQpLMtFkwJXBNihrVxTwae1kO5Zn91PRMOUDN4a2SsP93tttBaESZLwV9ZeFmp9kdLh9depMTBD+ouXJZT7k4Fv/ps00y03MR01zPiS/E2adfQn1MY2dOLCB3aEx2X7ZJ+FYOObnJnP5e40/bWjp/i3/gdMu8lLUsBk7b9tAw+yTcvuOaB7rkevThC3c9OAvPn2aZcFQeupfh4PMPdfM2WDu8sDnRFPUfwYJxuXdazx8vrRKfyddBoGLhaKB6o5XT+sjr7/yEyavltcXbjzDkpQSSzlZ2KFFE9pjK5iX9yVJxsyqapEmDKkUATtR6ja31ZHPYcGD4DgLygjKivYPnLMsJKh70qwdeLCBtdACFTQECEOFrO/WP8rnecIPwcssGTJRfCGdb2O38ND2IatUTq+6Hfe0cQe8gIx X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(163750095850)(192813158149592); X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(5005006)(8121501046)(10201501046)(3002001)(3231355)(944501410)(52105095)(93006095)(93004095)(6055026)(149066)(150027)(6041310)(20161123564045)(20161123560045)(20161123562045)(20161123558120)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(201708071742011)(7699051); SRVR:SN6PR02MB4767; BCL:0; PCL:0; RULEID:; SRVR:SN6PR02MB4767; X-Microsoft-Exchange-Diagnostics: 1; SN6PR02MB4767; 4:FGj7vlRkfZy1y68sCSYAM8IG/NipE42rJh7zcTkZ3PoyTPtLF/ASQItaK73/oBaT0lJb+foUwm3p31KFMhnRjpi0MFWkz4fLs6V/8ITuGxsHHFeE110RQZj7YVyP6uRuyNARv95qqRBKTn79qXmjxJYRMe+Fp5KnHrCx/BDn4XHwlviEeTY8u36m01RO31VliYHFqFwZVkeyq+JYs+hWPOGxfDvWbvMCiYgx+DV7Yn+3kKSp+w2j9dbX8E8sIi/p9SJnCLs2t2VP1F7FENULXgHMtVA6Bn273aPyz4RsunoNA8Z7b7K+YcdmPyWAI9FsIUZt77Jd6IF8wOsMcZhe2iHPcNFKlDxDMWj3KWUe8+Y= X-Forefront-PRVS: 08062C429B X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; SN6PR02MB4767; 23:3EDDVlBBvMWEwUiK/dtLDLFEviCLUf+etYsxOLaHJ?= CO/ckZtz/MLraG6kFHqp3862Nt3bdpdlW13x4mQGZ4Xxl7VB0GF23rVfw3crJkEuAKyTxi8g1a0JP29B0PdUcBUb+JvdCAv4fBXIrC17vOkVEl+TaVaL4he2wJSvxOBy70amvCq6wzG5NOjysVDoppjbByrlPw3aXZ8ewWrbEPyBYB3eteyWkn89U74wtGSDaNUBTlzYNn12pKyb9Bk9IzTV21yDB7EwEadU7gJorugu0XmM8StdkHZtfZ1eAmEEqf8SzGNAAXowKZhuiT9kFssyOPZawiaL0exeNMXtlBlAzA7golE/ylyy2jiJAan9QNxr0reB/nhbBQkCVDSOE+1olFOLwZhVoqeEfoXwL7EAWMM7wJE8z/DmFe7BNm8RAaBMamJW4oFR4pnGEfhROIcWhfR+wOO9s1FIZozXGXv2KUBdLgXj/GdtezsSxdZFAT7tN37vk2vzW8Rb2umahsG9Rj+UTB69QhQ2mjEtYi3BfQx0K9VTaWnwCsWtrWbemy/vNDskhDkTY/n3U9eX5EFbHdVMtugN8bhCggtvc4opWZmPyRvoB5F4lyC1ErMpz4L/+v/N1/QCqnGjBpR8moJe9KDnMHPoWrBHo72t3F6o3px0qQMwNAZTcfu+BszYFRYzuQHuVeK6qesTvQiszKrwe262L+mxZpsFpL/mzms3R+dJqStKhjPgVI4O8lZe4RXxVf7ishtKWZAIGsT9bPmaKfhFqYe+Mue92d1infYA6Fcxn6utBRgQvypQfhQXGXexS3OMuH4CS0+pJHKLsAHY6BZyFejeaANrhc2TwmwfZIBZSvi8JAEPB9qtY6pxCNOgKKYq745dCa3UmztPwDqpJvvApdc8meOc/5pPHJfaGd4fv2yFu1uSigQJJ79hHXWbAEqbZZ8vjmeb+ffcEX8u6fVsyePm7t2uvrgL7EY2SQ7q44ldDQDJa2C9RO7oo/Qweg3tn+1fLqBFHkgIMUNSwG5ckE0eSAEm3A9TxaAk6ShHVxCK9hamoN0ygbyvYE+1CDG3BdSckxFjtGIMMlmWT9Bs7Ns+3WMQ0yYLsl6Xuwynsa6s59Q7APxRLFF2sM8PM94Ddzj7OfELGq8tCw/NQNlrCBa6gS73gnqFJUAn6B69KEdV4KkQM22g+043QW3CyaUtEY4fIwSqIHkC58E X-Microsoft-Antispam-Message-Info: QSDPzCuKEUvT/5gFlydz1lpebQ5ge7U/jBxsUs4D2Z7BFCMUORYjX6CIMAnk7iP82OotrsoPnpaDn2l/ioZT4rTAFfzBL3JBrO7nNgr39dfajD8ez4+Hp4wzLge8LpiyC7uJ9yL2wEsiS/zRYdtuaaeYcyfjolDPJz9cu+M2fkRMjpmO7RigFZYhn97xscovUSM1o4+BN3THOEVf1oT/X1HciDX6upWJOOB+Aydo6B6YPfSNwI51RaRksUzPjhcbuGc3K6PQi89CupYPijCMB1j+5rGEISR64QZW/Xg7U2O4YmqPj3dn7zEurHCQ6KZF667qrgk3xK/9v21+swDDTKm7y8cw/EcxEk8sAqZ2YTs= X-Microsoft-Exchange-Diagnostics: 1; SN6PR02MB4767; 6:lz7PNqX+NjiVxS+Umec5UHhqEzll19N71fyTn7CkhFcb74TFBkWzePGrRmfIaAplTDBNEithwepjMAr53PMIJM7Kvmmd/CHjXah8N6T6yO/NMfynMMOBY1yx1GIRWtSg+LGNExbPyjUjj0xjkP5B+F0TxQ60JSESkFitHn5vbw6U+aXt9Dq+jW8hRkU8PtdcP8CfSQNP2cHvOA7n0DUQDRYlN86FfR0d7zXSMwgtSTB6ieIiHlYa82kR9S6eNZMmUwLvZNnn5xvEh9vISQAhNs9d7xe9oK1c1sTng+43VTWFy04RhmnFG58HzTwQ7hDlF64/eWGWBaaYyd4tlnYdtTwyTiLgiggS7FJnmfileaICgLOFGzdSjo4WYNQPVmgnHwkOjuKY7zYi9Ugy/s5+JCiNnzA1ffDjMwIy7esSGa7cWO6wweSp517gutAv+avxTxoV658PMM/6KKaosvtTnw==; 5:sETl4LKB0pGLMAqaur8luM7cFH7JB39fTiyL238Lpx8vgdsnrnlz9QI5GuI8sX6MxIb9ENPn416j55nQwguco1pbbQqsOoSMIOEKFiZAQmIwMHhpz1yTgnzBiG1/ahqmxL7sVvD+7xgzy5BdMkPKUJMN5lSMcclb3QBYMPghKqI=; 7:rd3VYbxbuLVMSUVO2tXww7TMO1IGEx60ymz1t7D9w+L37mA6572pwPaiDTy0a60U15ASLh0DwoLVjjJQPURQLEpSx1nWaWoCWqMfEx+kzfCwa+IBWMxjZMhMNqvi0XfFWh+rrcrW7Oh3ae+gVxT8xr65PqiiLD+QLLNgtOyldAYJIXvS0Lw/1DE5WASS72mbi3OurHDXG6T2QktMicqbNhJLv9sR5x8lhy9+BeH+QeHP9kwTnkFHT7qZONQLjMI3 SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Sep 2018 12:21:08.7522 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 4fe758b9-0781-47be-d6d3-08d622e16045 X-MS-Exchange-CrossTenant-Id: 657af505-d5df-48d0-8300-c31994686c5c X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=657af505-d5df-48d0-8300-c31994686c5c; Ip=[149.199.60.83]; Helo=[xsj-pvapsmtpgw01] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN6PR02MB4767 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20180925_052143_315530_DACCE569 X-CRM114-Status: UNSURE ( 7.83 ) X-CRM114-Notice: Please train this message. X-Spam-Score: -0.0 (/) X-Spam-Report: SpamAssassin version 3.4.1 on bombadil.infradead.org summary: Content analysis details: (-0.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 SPF_PASS SPF: sender matches SPF record -0.0 SPF_HELO_PASS SPF: HELO matches SPF record -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 DKIMWL_WL_MED DKIMwl.org - Whitelisted Medium sender 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: michals@xilinx.com, linux-mtd@lists.infradead.org, linux-kernel@vger.kernel.org, Naga Sureshkumar Relli , nagasuresh12@gmail.com Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org Some NAND controllers needs sdr timing mode value, instead of timings parameters. i.e the NAND controller will change its operating mode by just configuring the sdr timing mode number. so add mode parameter in struct nand_sdr_timings. Signed-off-by: Naga Sureshkumar Relli Reviewed-by: Boris Brezillon --- Changes in v11: - None --- drivers/mtd/nand/raw/nand_timings.c | 6 ++++++ include/linux/mtd/rawnand.h | 2 ++ 2 files changed, 8 insertions(+) diff --git a/drivers/mtd/nand/raw/nand_timings.c b/drivers/mtd/nand/raw/nand_timings.c index ebc7b5f..1ec7a28 100644 --- a/drivers/mtd/nand/raw/nand_timings.c +++ b/drivers/mtd/nand/raw/nand_timings.c @@ -56,6 +56,7 @@ static const struct nand_data_interface onfi_sdr_timings[] = { .tWHR_min = 120000, .tWP_min = 50000, .tWW_min = 100000, + .mode = 0, }, }, /* Mode 1 */ @@ -98,6 +99,7 @@ static const struct nand_data_interface onfi_sdr_timings[] = { .tWHR_min = 80000, .tWP_min = 25000, .tWW_min = 100000, + .mode = 1, }, }, /* Mode 2 */ @@ -140,6 +142,7 @@ static const struct nand_data_interface onfi_sdr_timings[] = { .tWHR_min = 80000, .tWP_min = 17000, .tWW_min = 100000, + .mode = 2, }, }, /* Mode 3 */ @@ -182,6 +185,7 @@ static const struct nand_data_interface onfi_sdr_timings[] = { .tWHR_min = 80000, .tWP_min = 15000, .tWW_min = 100000, + .mode = 3, }, }, /* Mode 4 */ @@ -224,6 +228,7 @@ static const struct nand_data_interface onfi_sdr_timings[] = { .tWHR_min = 80000, .tWP_min = 12000, .tWW_min = 100000, + .mode = 4, }, }, /* Mode 5 */ @@ -266,6 +271,7 @@ static const struct nand_data_interface onfi_sdr_timings[] = { .tWHR_min = 80000, .tWP_min = 10000, .tWW_min = 100000, + .mode = 5, }, }, }; diff --git a/include/linux/mtd/rawnand.h b/include/linux/mtd/rawnand.h index efb2345..3bf2cea 100644 --- a/include/linux/mtd/rawnand.h +++ b/include/linux/mtd/rawnand.h @@ -723,6 +723,7 @@ struct nand_ecc_ctrl { * @tWHR_min: WE# high to RE# low * @tWP_min: WE# pulse width * @tWW_min: WP# transition to WE# low + * @mode: sdr timing mode value */ struct nand_sdr_timings { u64 tBERS_max; @@ -763,6 +764,7 @@ struct nand_sdr_timings { u32 tWHR_min; u32 tWP_min; u32 tWW_min; + u8 mode; }; /** From patchwork Tue Sep 25 12:20:31 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Naga Sureshkumar Relli X-Patchwork-Id: 974367 X-Patchwork-Delegate: miquel.raynal@bootlin.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=xilinx.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="ZynXvrce"; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=xilinx.onmicrosoft.com header.i=@xilinx.onmicrosoft.com header.b="QXEGjcmi"; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::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 42KKxT2KT5z9s7T for ; Tue, 25 Sep 2018 22:23:57 +1000 (AEST) 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:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version: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=4Bw0OXP0qnlewvacWU342iaw7cRkHu99LhOFzv+kx7A=; b=ZynXvrcez9dTr7 uo23fdj4ri9DyG71Vxud14UQv3r/8PFHsJCX8ey/eFWQm7mHnms4yzH78J7BHkdelhC0/yFw+XAGR LyNr0OKlVCjDmfsLdtpuLuA50B477k+WxZ11PZf6MxuDyq669D22Z+Iz7sBmZBduQX/D+hfWjtSSY d0+wamMgsT8+9dmDjauaSQ/8LGdQZ8OdYcoAhkmLHWgYhHFKnexke5l5M5sSRBqiCmewqInhXxEiR gXQajBhUtbD5P2lgyIaI4PkgQMbv/HKc9/Di7mEmUNG5mkiDVzf7A2qDh7n5PVorGHW4wqmoRYTN4 ZFT/qniaxYUi3zRmez8A==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1g4mNW-0000Jp-QV; Tue, 25 Sep 2018 12:23:46 +0000 Received: from mail-eopbgr700081.outbound.protection.outlook.com ([40.107.70.81] helo=NAM04-SN1-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1g4mLX-0008Cc-5w for linux-mtd@lists.infradead.org; Tue, 25 Sep 2018 12:21:47 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=xilinx.onmicrosoft.com; s=selector1-xilinx-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=umXHSgZvtWKZ7uqucOstE8I/oMz1KGarpSfxn2s0eZo=; b=QXEGjcmiLR25BDgb1p+HakeuEOYo4Cnyiw0hM5q+ffeUbKw8j4V3k5BhiEpdOULiM53FrpUqfjPxNOngz32lJzQ3382m+3C+q5oVfw8qb/KfE9jTCb9qN+dlPp014BacCxlLFLrtinck1YtuY4P3COkB30gOadRK+TfVAWAn8H8= Received: from BN6PR02CA0107.namprd02.prod.outlook.com (2603:10b6:405:60::48) by DM6PR02MB4763.namprd02.prod.outlook.com (2603:10b6:5:18::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1164.25; Tue, 25 Sep 2018 12:21:09 +0000 Received: from BL2NAM02FT016.eop-nam02.prod.protection.outlook.com (2a01:111:f400:7e46::204) by BN6PR02CA0107.outlook.office365.com (2603:10b6:405:60::48) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.1164.22 via Frontend Transport; Tue, 25 Sep 2018 12:21:09 +0000 Authentication-Results: spf=pass (sender IP is 149.199.60.83) smtp.mailfrom=xilinx.com; gmail.com; dkim=none (message not signed) header.d=none;gmail.com; dmarc=bestguesspass action=none header.from=xilinx.com; Received-SPF: Pass (protection.outlook.com: domain of xilinx.com designates 149.199.60.83 as permitted sender) receiver=protection.outlook.com; client-ip=149.199.60.83; helo=xsj-pvapsmtpgw01; Received: from xsj-pvapsmtpgw01 (149.199.60.83) by BL2NAM02FT016.mail.protection.outlook.com (10.152.77.171) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.20.1185.13 via Frontend Transport; Tue, 25 Sep 2018 12:21:09 +0000 Received: from unknown-38-66.xilinx.com ([149.199.38.66] helo=xsj-pvapsmtp01) by xsj-pvapsmtpgw01 with esmtp (Exim 4.63) (envelope-from ) id 1g4mKy-0008PE-76; Tue, 25 Sep 2018 05:21:08 -0700 Received: from [127.0.0.1] (helo=localhost) by xsj-pvapsmtp01 with smtp (Exim 4.63) (envelope-from ) id 1g4mKt-0004sS-46; Tue, 25 Sep 2018 05:21:03 -0700 Received: from xsj-pvapsmtp01 (mailhost.xilinx.com [149.199.38.66]) by xsj-smtp-dlp2.xlnx.xilinx.com (8.13.8/8.13.1) with ESMTP id w8PCKwOx023037; Tue, 25 Sep 2018 05:20:58 -0700 Received: from [172.23.37.108] (helo=xhdnagasure40.xilinx.com) by xsj-pvapsmtp01 with esmtp (Exim 4.63) (envelope-from ) id 1g4mKn-0004mH-Aw; Tue, 25 Sep 2018 05:20:58 -0700 From: Naga Sureshkumar Relli To: , , , , , Subject: [LINUX PATCH v11 3/3] mtd: rawnand: arasan: Add support for Arasan NAND Flash Controller Date: Tue, 25 Sep 2018 17:50:31 +0530 Message-ID: <1537878031-22253-4-git-send-email-naga.sureshkumar.relli@xilinx.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1537878031-22253-1-git-send-email-naga.sureshkumar.relli@xilinx.com> References: <1537878031-22253-1-git-send-email-naga.sureshkumar.relli@xilinx.com> X-RCIS-Action: ALLOW X-TM-AS-Product-Ver: IMSS-7.1.0.1224-8.2.0.1013-23620.005 X-TM-AS-User-Approved-Sender: Yes;Yes X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:149.199.60.83; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(979002)(136003)(396003)(346002)(376002)(39860400002)(2980300002)(438002)(199004)(189003)(81156014)(81166006)(305945005)(8676002)(107886003)(8936002)(9786002)(4326008)(39060400002)(50226002)(5024004)(36756003)(14444005)(217873002)(478600001)(2906002)(50466002)(34290500001)(48376002)(63266004)(5660300001)(356003)(106466001)(316002)(6666003)(36386004)(76176011)(7696005)(486006)(106002)(54906003)(47776003)(110136005)(16586007)(2201001)(186003)(77096007)(51416003)(53946003)(26005)(2616005)(126002)(476003)(575784001)(446003)(11346002)(336012)(426003)(107986001)(579004)(969003)(989001)(999001)(1009001)(1019001); DIR:OUT; SFP:1101; SCL:1; SRVR:DM6PR02MB4763; H:xsj-pvapsmtpgw01; FPR:; SPF:Pass; LANG:en; PTR:unknown-60-83.xilinx.com; A:1; MX:1; X-Microsoft-Exchange-Diagnostics: 1; BL2NAM02FT016; 1:RxjcrhZhPdHEyLK960tKrGinh2yCip9KsLTSSucJ5/lKatB2t/2u6gqx8Ou0vxhkoI5Pv7gILa3uTpPfPbU6XWES2d3S6R311M29BdIsi+sPjGbqYfKdtxj24ID2eYe5 MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: b643c0f8-5223-40cc-4471-08d622e16020 X-Microsoft-Antispam: BCL:0; PCL:0; RULEID:(7020095)(4652040)(8989299)(4534165)(4627221)(201703031133081)(201702281549075)(8990200)(5600074)(711020)(4608076)(2017052603328)(7153060); SRVR:DM6PR02MB4763; X-Microsoft-Exchange-Diagnostics: 1; DM6PR02MB4763; 3:R4gvfa90CELLBcrEzATmYBbc9leoStrWg3BrWs53sS9HvujEzHlMz+dIHCYuc+RD5SfV17xKzjn1u/UWEHscZLvp48SE22DhrKtiyjCAIVVbA3cJT21iBBjgp8f1k11OvqK7RlXx099MebHNiCZrRQzeYwRnpcYElkI9SkF9TORwIIlIL49ZQEQPYnElJWfzzoJPFFw1cF9KklaasSS6QGFK982pWPZmYlTzEz6lwF7iy/sGNYT5qSyvE+e5WmWH+OPvYXtwUs5ePOYaxTki+VLcB7zAgZeJ2fq5vC2od5tuT3dXC0Z2ZAr5on8lQFi5e7gkWkrlgD+riT3VvAnuzfDvD0u3cCskJOa6JMyAfDQ=; 25:JWuzS2PuYCKAPtxWdH8Tc28hC0TbmrvJMyzhEygZoOcFDoh9T9USYZLnORWW6L/Mgt9yT8gjsax4KV3QRuPc0NOPqhU39DfW2i7EIhqbzRMbhKbuwg7rymB0eCfa0PCB5sWO+tc+dGHDetvN5ksqMuV1WKmqCzX2vAQEnumgZbNr5DZB7hIaandnFE1Py4Tl3L1Rar3pbZGoqywqsj5eG+7UQMb/zNU2a2q9gyA3TOecsSix0bornNDYpHuMmVud+MGaGWPGkIUq6Nkne/rC656f7wuk1VnXxGFgxcwaYwQ+Rbnf8BkCYI5nn0kduF6bngthemlAsjpYscSHJfoROg== X-MS-TrafficTypeDiagnostic: DM6PR02MB4763: X-Microsoft-Exchange-Diagnostics: 1; DM6PR02MB4763; 31:a5TVi6mSEqbTVZY+mb33AI2yNmRxdZQzNVM0tUJleqQ9CBDmFVw9CK42u8bm3vQz8shqUs6NwmC9me4Pu/V8o1me4e+eM95TeNDEqq6qvHy8pS81jy+wyaqwe5/20avgrlxBVxBeamjSHLyEiVNIxN8UKYnAdLNalQ+wrP89xvq7pNfdY1GyZxgHPOwWCsaPoW+jp4tW4+QwpGOdUV4fSnRzAA5S2ngPCttR2bRcQzE=; 20:YKYQA99zegwvA8Q/Ykhi1e2STM6f5Om7WiAIG1XoqV+TiC8n9iS5fwVsU42RoBLFGlIpmU55mZWsQ51JqJzV35f3tonjwFNfwBgM+Ksy4gTb9Frq+Xc9cg9fvM3CL2vkBCklaebn4SID9c8PwX55oMYLrSkR4SuYyt7bDLcmMFbeF7z79/cX7x2nWBNs3FyhmbAiS9h0SxDnWvgV8CNX/NQ1kXETeMtJsO4IICbPDdAA32qehRmjmH11B/KEFVQ55kk9/5yBlXqDoZfY5T1mIvPlBYkEa828r4KT5l05/W0wo9JjcanP5V9mKWgbWZWe4wX3s78KGSog0LrZgBMrE/MW3ws0Fe0inH2nZtimlIhCVy5v9uTNX9X6UUm0AdVhiF4jskJESyEAt7CNHdH52fRjxMFBtAyshBgihdrFV+2u7Ouhx+DlXZv+VAERH/LoYgEEgEU1gO//eCeLUlew6qXChVs6XE9Hy25j1k+PHIqsMlYj1fKTh/ue1+LHn8gz X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(192813158149592)(788757137089)(211171220733660); X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(10201501046)(3002001)(93006095)(93004095)(3231355)(944501410)(52105095)(6055026)(149066)(150027)(6041310)(20161123558120)(20161123564045)(20161123560045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123562045)(201708071742011)(7699051); SRVR:DM6PR02MB4763; BCL:0; PCL:0; RULEID:; SRVR:DM6PR02MB4763; X-Microsoft-Exchange-Diagnostics: 1; DM6PR02MB4763; 4:FV4qIIghV9nTgulQDTWPcUT8B9DODIypxZ/zhauCov6Ew9ojCOle76R64VKrI6DzMh1wk400MdbHZ5oLcv5sa+GV825mWM2u/X2cY8pyR4Jf9uGneWfbRHiM+PMTXukDcaUPDKlfOjBpnJWCbVON/opUDwBUQCab5hVZmC1JbY9eWEjS7x2rUD/zXoiit0rsmICrHcABw2F1d60gWyuv7Z3WVsv75DS1mwzvk7uYq/rv6zmX3EhQT0LQ++9Jomzz+pxkc6OPCrDJTc6VZmRru71QJFN3lZGK4G/De9mQ1bE1zSEeUhvCSqOE/lAF+V3NzewTjRRWpOFk9CusgiPLVBhIxFsdQe0+xGwlB1DkEjr2QQRw4A3LFG6R0A7qBhwG X-Forefront-PRVS: 08062C429B X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; DM6PR02MB4763; 23:9ubkTltPhFn/zvwWfale3MKe23lE0k2fXG+Ay5IGE?= Pac6CxFH0vvv1abw0qtJfSx9kMS9l//1uHvsHTDQVgag606RfJjgTLMUcF09p3B8HqL3xNnheQKMoXPmUqGMJ0k4bO8ud+yFNIDFfWg0o7mztnhtwlYUeHva+nopy7rp+pHvRphaf4Q11gSgPxZQrLi3iGESvZDF52rFBNWej8GlVqndXJmoT7BXDXipcUDx6AN/dwWG9GeKzxfvpoh7OladfhGhIv+H3e516YU0aEb2Zjvz4mc4kkn42oTEPH/1Qab4BxJz4cNqj8ehlKAw32vyet+wwH9qJw39UmUzWEsMMSRgIHnRnfmSYWTpdXDD4p48SNaTr9DRdtbSeZnGbcSCuKhDLkA+A+1reUrBObre7wzG3gLZJNhh6nAvgHvuariLJy3RUfsCInWvy+kCRkutnIRhN41ij6c9jEgHkO/KJd3dUKqKoQFR7fUuADUTIAyrAZ21mGWVGokneMQvAUDLFnHdsZW5cUKsoEgEXDtVE2/S6CNghbo9lWHXTJQ11i5AkiwoD8ZbYUbJquRJ43q5v+jsJ/5WdOcPtI/n1JE+naoo6jIE44RcQ/qmJ/4UABYjfINrf0qwA51VML144UQv3gv0puVnHNuf5MpWKDbrNJbxkYN3p1z+An8E479m/KdpT+6nIHwxJwqx8204+41yddbSX79AY0X1ZFPRQlwRouLzTfetUrvhDgeRmetz0EPRpbfKPTvurrNJBxf8S/CLHfOSFcNd9gRphjnVpBY/X8XiWfQp67FAO6zliHuBkvF2sw6V4MSxQyqqJk4ycNCQl7pqZU6XmxSHRg/k0rvi13m8ablG7e910CWqPnb/i7AiJ8oFrzlToxScMfbKzlwJdRydlJzjM6GFpqoZtpxrrU2t8n9F6JJ4Z/eyeNpjdD3C7ya7VYI7Zr3nhtXzqT7Og+pE0HfMKjimG1NCbsrJ1P3a0vXsTMH0dFNGH4CWS18VXhWtewHW7OT9qFoJk9qLOKIQ9/m1WgtWygbKMAKgZU0DPTYvCAZJ7YT/+Muprlba/XUfPBnAsikWGTmOdzfoLFEvcMHnAWAYW+xtw0ZZD6PSNJdaU2wEZ5A8lf76Ksdtxq25repdh10rH5SkGK9Wp44FIMt4eMvOoB9eMFwY+J5xUg9yMypkmOWQHBUrVcRQSoyC02tx+66v3DybvfsvQAlrgRb1DxrATZuFH+y7daxuMj1UbpC9O1LaPDqYO/SFg8tv/7sDG1+0ayfSIIDdSZaKPHCdVzo7EqPQ9nnYs704C5SI/1wG92aOjfxEaO1kagYg+JYHZdLiZ8kmor+ur8TA+qT0x/Dih80qtAE+nWppPYm5fWLpl6ENqy7Rbww+OCU3WFSUMHEWQtqTIkG X-Microsoft-Antispam-Message-Info: bRPxeG03F8q57y4bkzlm9KAdPzthJp1ClWJExMH7nOWHK2/bBhp4XP2Wiyfjye1GyCKEspU4zZ7YkhGdhqDC963AMRTJjNicKWUY55hjLlyse2JWPQ+UJ4rys6yxIkUwUWohKX3Du0msFqHfyuetRaUAil2gk3JGxMPCQ7ht6WU8cFJ2yXt7rdeE9VVsjnILt45Mg7d0zY/cJeMlHcfkk4F5DrY+TjX2ywwb69TNjX/QD9LYK9EfKDjPvoVs0+Wbx/crcO4KlHmCbtyGJSZjoQF7AAHwkZSyWOdt4e3EprLrW6z63z2hJZIU7BGcWkmomVMRGoVpcJpslNzgEh6DwiK9SDTyGKjAdjv3G9tB0YY= X-Microsoft-Exchange-Diagnostics: 1; DM6PR02MB4763; 6:YOOL88nqCd6RFjxGXLHQXA6TTYcFIJaBPDjtodMnz1WPaYvriV/nYWbYvukVVXkmONAH58A4ZKaXZAaZm3aUDxTwBzmlUY3Shy4YvqOA5n3AY6Jp0s2+Rqj2PlO5YKmrlP/U+31z8Te5blBupTZHPu1+qGhaztlHz7ToBIT1hsWf7YcSfo3mSHvVBKgAFk1Qh3rsAWCmKU7VvoIutvFYtx6nXqlDJlZjPOCmXtxcb4cHLYzl5JH6JtakAN5HiM10+ISV7pHShSdUHSPP0vi/30JxLvoT1P2+zAEd7iwAW20Z5nKQ2cqYiKcVPpLkxi4tvWaamW5Tru5zqEQGz1OBgkQK463k08JXBZ9PfsiVlf1QRf3R4gT28uxTULBK3uhdA/9MmQCJ1Tn98qGuy0ZlRW3rauFWQBEd5YgpXjxEvmOdeKFX1/QXShTjLbSiQghLul8DlasQsduigUAGlyRfdw==; 5:xSIJlhffbrOcMPw8ajbBDPnTndtm7ev9L/+huBxelMw2656Ftbu3B4nLtX8vdoi/ov2u5/VBY/014eOoB782/pJ93w/1yafIse5iV4TbcGWrE8NWCoSu/3SYuaLeZajLda4RhjXQu89r2JQxg/0I/zamvj12cQpYrZK4nOpyat4=; 7:Df5cWg3kjDxVqLjEo0EoBb3erzRbseAlloX3sXQj73wK4zhRCSyfuAvNUhBEGilpjackIjsU+3T7dwq7g7IYO/OLjTs29fgXGMN32E3kMkwBRHbZ0vYAWhQE5WcINfHYwfiYPoBvh4yRQ+36kMGLteo0zWflgILCe/bsaGByJldjnTHE5yFJ2yDsI00tl4xLwQ2iCxjqDgnQG8akA0ujKiMy8v7xZ3zOa76hR48dOGq6JTMdYe5OAew308p8ajn1 SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Sep 2018 12:21:09.1310 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: b643c0f8-5223-40cc-4471-08d622e16020 X-MS-Exchange-CrossTenant-Id: 657af505-d5df-48d0-8300-c31994686c5c X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=657af505-d5df-48d0-8300-c31994686c5c; Ip=[149.199.60.83]; Helo=[xsj-pvapsmtpgw01] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR02MB4763 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20180925_052143_379815_6B7BC816 X-CRM114-Status: GOOD ( 13.88 ) X-Spam-Score: -0.0 (/) X-Spam-Report: SpamAssassin version 3.4.1 on bombadil.infradead.org summary: Content analysis details: (-0.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [40.107.70.81 listed in list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record -0.0 SPF_HELO_PASS SPF: HELO matches SPF record -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 DKIMWL_WL_MED DKIMwl.org - Whitelisted Medium sender 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: michals@xilinx.com, linux-mtd@lists.infradead.org, linux-kernel@vger.kernel.org, Naga Sureshkumar Relli , nagasuresh12@gmail.com Sender: "linux-mtd" Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org Add the basic driver for Arasan NAND Flash Controller used in Zynq UltraScale+ MPSoC. It supports HW ECC and upto 24bit correction Signed-off-by: Naga Sureshkumar Relli --- Changes in v11: Fixed the below commits given by Boris - implemented separate hooks for each pattern - Changed EVNT_TIMEOUT_MSEC to EVENT_TIMEOUT_MSEC - Grouped register offsets with theri fields, previously there are defines at randome positions - changes cmnds to cmds and s32 to u32 - Removed unnecessary fields from struct anfc_op - Renamed bch and bchmode to strength and ecc_strength respectively - Passed nand_chip object direclty to all functions - Replace is_vmalloc_addr() with virt_addr_valid() - Use default routines for read/write_oob() - Added core support to get sdr timing mode value Changes in v10: - Implemented ->exec_op() interface. - Converted the driver to nand_scan(). Changes in v9: - Added the SPDX tags Changes in v8: - Implemented setup_data_interface hook - fixed checkpatch --strict warnings - Added anfc_config_ecc in read_page_hwecc - Fixed returning status value by reading flash status in read_byte() instead of reading previous value. Changes in v7: - Implemented Marek suggestions and comments - Corrected the acronyms those should be in caps - Modified kconfig/Make file to keep arasan entry in sorted order - Added is_vmlloc_addr check - Used ioread/write32_rep variants to avoid compilation error for intel platforms - separated PIO and DMA mode read/write functions - Minor cleanup Chnages in v6: - Addressed most of the Brian and Boris comments - Separated the nandchip from the nand controller - Removed the ecc lookup table from driver - Now use framework nand waitfunction and readoob - Fixed the compiler warning - Adapted the new frameowrk changes related to ecc and ooblayout - Disabled the clocks after the nand_reelase - Now using only one completion object - Boris suggessions like adapting cmd_ctrl and rework on read/write byte are not implemented and i will patch them later - Also check_erased_ecc_chunk for erase and check for is_vmalloc_addr will implement later once the basic driver is mainlined. Changes in v5: - Renamed the driver filei as arasan_nand.c - Fixed all comments relaqted coding style - Fixed comments related to propagating the errors - Modified the anfc_write_page_hwecc as per the write_page prototype Changes in v4: - Added support for onfi timing mode configuration - Added clock supppport - Added support for multiple chipselects Changes in v3: - Removed unused variables - Avoided busy loop and used jifies based implementation - Fixed compiler warnings "right shift count >= width of type" - Removed unneeded codei and improved error reporting - Added onfi version check to ensure reading the valid address cycles Changes in v2: - Added missing of.h to avoid kbuild system report erro --- drivers/mtd/nand/raw/Kconfig | 7 + drivers/mtd/nand/raw/Makefile | 1 + drivers/mtd/nand/raw/arasan_nand.c | 1324 ++++++++++++++++++++++++++++++++++++ 3 files changed, 1332 insertions(+) create mode 100644 drivers/mtd/nand/raw/arasan_nand.c diff --git a/drivers/mtd/nand/raw/Kconfig b/drivers/mtd/nand/raw/Kconfig index b6738ec..0fadecb 100644 --- a/drivers/mtd/nand/raw/Kconfig +++ b/drivers/mtd/nand/raw/Kconfig @@ -560,4 +560,11 @@ config MTD_NAND_TEGRA is supported. Extra OOB bytes when using HW ECC are currently not supported. +config MTD_NAND_ARASAN + tristate "Support for Arasan Nand Flash controller" + depends on HAS_IOMEM && HAS_DMA + help + Enables the driver for the Arasan Nand Flash controller on + Zynq Ultrascale+ MPSoC. + endif # MTD_NAND diff --git a/drivers/mtd/nand/raw/Makefile b/drivers/mtd/nand/raw/Makefile index d5a5f98..ccb8d56 100644 --- a/drivers/mtd/nand/raw/Makefile +++ b/drivers/mtd/nand/raw/Makefile @@ -57,6 +57,7 @@ obj-$(CONFIG_MTD_NAND_BRCMNAND) += brcmnand/ obj-$(CONFIG_MTD_NAND_QCOM) += qcom_nandc.o obj-$(CONFIG_MTD_NAND_MTK) += mtk_ecc.o mtk_nand.o obj-$(CONFIG_MTD_NAND_TEGRA) += tegra_nand.o +obj-$(CONFIG_MTD_NAND_ARASAN) += arasan_nand.o nand-objs := nand_base.o nand_bbt.o nand_timings.o nand_ids.o nand-objs += nand_amd.o diff --git a/drivers/mtd/nand/raw/arasan_nand.c b/drivers/mtd/nand/raw/arasan_nand.c new file mode 100644 index 0000000..8c24fac --- /dev/null +++ b/drivers/mtd/nand/raw/arasan_nand.c @@ -0,0 +1,1324 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Arasan NAND Flash Controller Driver + * + * Copyright (C) 2014 - 2017 Xilinx, Inc. + * Author: Punnaiah Choudary Kalluri + * Author: Naga Sureshkumar Relli + * + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define EVENT_TIMEOUT_MSEC 1000 + +#define PKT_OFST 0x00 +#define PKT_CNT_SHIFT 12 + +#define MEM_ADDR1_OFST 0x04 +#define MEM_ADDR2_OFST 0x08 +#define PG_ADDR_SHIFT 16 +#define BCH_MODE_SHIFT 25 +#define MEM_ADDR_MASK GENMASK(7, 0) +#define BCH_MODE_MASK GENMASK(27, 25) +#define CS_MASK GENMASK(31, 30) +#define CS_SHIFT 30 + +#define CMD_OFST 0x0C +#define ECC_ENABLE BIT(31) +#define DMA_EN_MASK GENMASK(27, 26) +#define DMA_ENABLE 0x2 +#define DMA_EN_SHIFT 26 +#define REG_PAGE_SIZE_SHIFT 23 + +#define PROG_OFST 0x10 +#define PROG_PGRD BIT(0) +#define PROG_ERASE BIT(2) +#define PROG_STATUS BIT(3) +#define PROG_PGPROG BIT(4) +#define PROG_RDID BIT(6) +#define PROG_RDPARAM BIT(7) +#define PROG_RST BIT(8) +#define PROG_GET_FEATURE BIT(9) +#define PROG_SET_FEATURE BIT(10) + +#define INTR_STS_EN_OFST 0x14 +#define INTR_SIG_EN_OFST 0x18 +#define XFER_COMPLETE BIT(2) +#define READ_READY BIT(1) +#define WRITE_READY BIT(0) +#define MBIT_ERROR BIT(3) +#define EVENT_MASK (XFER_COMPLETE | READ_READY | WRITE_READY | MBIT_ERROR) + +#define INTR_STS_OFST 0x1C +#define READY_STS_OFST 0x20 +#define DMA_ADDR1_OFST 0x24 +#define FLASH_STS_OFST 0x28 +#define DATA_PORT_OFST 0x30 +#define ECC_OFST 0x34 +#define BCH_EN_SHIFT 27 +#define ECC_SIZE_SHIFT 16 + +#define ECC_ERR_CNT_OFST 0x38 +#define PAGE_ERR_CNT_MASK GENMASK(16, 8) +#define PKT_ERR_CNT_MASK GENMASK(7, 0) + +#define ECC_SPR_CMD_OFST 0x3C +#define CMD2_SHIFT 8 +#define ADDR_CYCLES_SHIFT 28 + +#define ECC_ERR_CNT_1BIT_OFST 0x40 +#define ECC_ERR_CNT_2BIT_OFST 0x44 +#define DMA_ADDR0_OFST 0x50 +#define DATA_INTERFACE_OFST 0x6C +#define ANFC_MAX_CHUNK_SIZE 0x4000 +#define ANFC_MAX_ADDR_CYCLES 7 + +#define REG_PAGE_SIZE_512 0 +#define REG_PAGE_SIZE_1K 5 +#define REG_PAGE_SIZE_2K 1 +#define REG_PAGE_SIZE_4K 2 +#define REG_PAGE_SIZE_8K 3 +#define REG_PAGE_SIZE_16K 4 + +#define TEMP_BUF_SIZE 1024 +#define SDR_MODE_PACKET_SIZE 4 + +#define SDR_MODE_DEFLT_FREQ 80000000 +#define COL_ROW_ADDR(pos, val) (((val) & 0xFF) << (8 * (pos))) + +struct anfc_op { + u32 cmds[4]; + u32 len; + u32 col; + u32 row; + unsigned int data_instr_idx; + const struct nand_op_instr *data_instr; +}; + +/** + * struct anfc_nand_chip - Defines the nand chip related information + * @node: Used to store NAND chips into a list. + * @chip: NAND chip information structure. + * @strength: Bch or Hamming mode enable/disable. + * @ecc_strength: Ecc strength 4.8/12/16. + * @eccval: Ecc config value. + * @raddr_cycles: Row address cycle information. + * @caddr_cycles: Column address cycle information. + * @pktsize: Packet size for read / write operation. + * @csnum: chipselect number to be used. + * @spktsize: Packet size in ddr mode for status operation. + * @inftimeval: Data interface and timing mode information + */ +struct anfc_nand_chip { + struct list_head node; + struct nand_chip chip; + bool strength; + u32 ecc_strength; + u32 eccval; + u16 raddr_cycles; + u16 caddr_cycles; + u32 pktsize; + int csnum; + u32 spktsize; + u32 inftimeval; +}; + +/** + * struct anfc_nand_controller - Defines the Arasan NAND flash controller + * driver instance + * @controller: base controller structure. + * @chips: list of all nand chips attached to the ctrler. + * @dev: Pointer to the device structure. + * @base: Virtual address of the NAND flash device. + * @curr_cmd: Current command issued. + * @clk_sys: Pointer to the system clock. + * @clk_flash: Pointer to the flash clock. + * @dma: Dma enable/disable. + * @buf: Buffer used for read/write byte operations. + * @irq: irq number + * @bufshift: Variable used for indexing buffer operation + * @csnum: Chip select number currently inuse. + * @event: Completion event for nand status events. + * @status: Status of the flash device. + * @prog: Used to initiate controller operations. + */ +struct anfc_nand_controller { + struct nand_controller controller; + struct list_head chips; + struct device *dev; + void __iomem *base; + int curr_cmd; + struct clk *clk_sys; + struct clk *clk_flash; + int irq; + int csnum; + struct completion event; + int status; + u32 prog; + u8 buf[TEMP_BUF_SIZE]; +}; + +static int anfc_ooblayout_ecc(struct mtd_info *mtd, int section, + struct mtd_oob_region *oobregion) +{ + struct nand_chip *nand = mtd_to_nand(mtd); + + if (section >= nand->ecc.steps) + return -ERANGE; + + if (section) + return -ERANGE; + + oobregion->length = nand->ecc.total; + oobregion->offset = mtd->oobsize - oobregion->length; + + return 0; +} + +static int anfc_ooblayout_free(struct mtd_info *mtd, int section, + struct mtd_oob_region *oobregion) +{ + struct nand_chip *nand = mtd_to_nand(mtd); + + if (section >= nand->ecc.steps) + return -ERANGE; + + if (section) + return -ERANGE; + + oobregion->offset = 2; + oobregion->length = mtd->oobsize - nand->ecc.total - 2; + + return 0; +} + +static const struct mtd_ooblayout_ops anfc_ooblayout_ops = { + .ecc = anfc_ooblayout_ecc, + .free = anfc_ooblayout_free, +}; + +static inline struct anfc_nand_chip *to_anfc_nand(struct nand_chip *nand) +{ + return container_of(nand, struct anfc_nand_chip, chip); +} + +static inline struct anfc_nand_controller *to_anfc(struct nand_controller *ctrl) +{ + return container_of(ctrl, struct anfc_nand_controller, controller); +} + +static u8 anfc_page(u32 pagesize) +{ + switch (pagesize) { + case 512: + return REG_PAGE_SIZE_512; + case 1024: + return REG_PAGE_SIZE_1K; + case 2048: + return REG_PAGE_SIZE_2K; + case 4096: + return REG_PAGE_SIZE_4K; + case 8192: + return REG_PAGE_SIZE_8K; + case 16384: + return REG_PAGE_SIZE_16K; + default: + break; + } + + return 0; +} + +static inline void anfc_enable_intrs(struct anfc_nand_controller *nfc, u32 val) +{ + writel(val, nfc->base + INTR_STS_EN_OFST); + writel(val, nfc->base + INTR_SIG_EN_OFST); +} + +static inline void anfc_config_ecc(struct anfc_nand_controller *nfc, bool on) +{ + u32 val; + + val = readl(nfc->base + CMD_OFST); + if (on) + val |= ECC_ENABLE; + else + val &= ~ECC_ENABLE; + writel(val, nfc->base + CMD_OFST); +} + +static inline void anfc_config_dma(struct anfc_nand_controller *nfc, int on) +{ + u32 val; + + val = readl(nfc->base + CMD_OFST); + val &= ~DMA_EN_MASK; + if (on) + val |= DMA_ENABLE << DMA_EN_SHIFT; + writel(val, nfc->base + CMD_OFST); +} + +static inline int anfc_wait_for_event(struct anfc_nand_controller *nfc) +{ + return wait_for_completion_timeout(&nfc->event, + msecs_to_jiffies(EVENT_TIMEOUT_MSEC)); +} + +static inline void anfc_setpktszcnt(struct anfc_nand_controller *nfc, + u32 pktsize, u32 pktcount) +{ + writel(pktsize | (pktcount << PKT_CNT_SHIFT), nfc->base + PKT_OFST); +} + +static inline void anfc_set_eccsparecmd(struct anfc_nand_controller *nfc, + struct anfc_nand_chip *achip, u8 cmd1, + u8 cmd2) +{ + writel(cmd1 | (cmd2 << CMD2_SHIFT) | + (achip->caddr_cycles << ADDR_CYCLES_SHIFT), + nfc->base + ECC_SPR_CMD_OFST); +} + +static void anfc_setpagecoladdr(struct anfc_nand_controller *nfc, u32 page, + u16 col) +{ + u32 val; + + writel(col | (page << PG_ADDR_SHIFT), nfc->base + MEM_ADDR1_OFST); + + val = readl(nfc->base + MEM_ADDR2_OFST); + val = (val & ~MEM_ADDR_MASK) | + ((page >> PG_ADDR_SHIFT) & MEM_ADDR_MASK); + writel(val, nfc->base + MEM_ADDR2_OFST); +} + +static void anfc_prepare_cmd(struct anfc_nand_controller *nfc, u8 cmd1, + u8 cmd2, u8 dmamode, + u32 pagesize, u8 addrcycles) +{ + u32 regval; + + regval = cmd1 | (cmd2 << CMD2_SHIFT); + if (dmamode) + regval |= DMA_ENABLE << DMA_EN_SHIFT; + regval |= addrcycles << ADDR_CYCLES_SHIFT; + regval |= anfc_page(pagesize) << REG_PAGE_SIZE_SHIFT; + writel(regval, nfc->base + CMD_OFST); +} + +static void anfc_rw_dma_op(struct mtd_info *mtd, u8 *buf, int len, + bool do_read, u32 prog, int pktcount, int pktsize) +{ + dma_addr_t paddr; + struct nand_chip *chip = mtd_to_nand(mtd); + struct anfc_nand_controller *nfc = to_anfc(chip->controller); + struct anfc_nand_chip *achip = to_anfc_nand(chip); + u32 eccintr = 0, dir; + + if (pktsize == 0) + pktsize = len; + + anfc_setpktszcnt(nfc, pktsize, pktcount); + + if (!achip->strength) + eccintr = MBIT_ERROR; + + if (do_read) + dir = DMA_FROM_DEVICE; + else + dir = DMA_TO_DEVICE; + + paddr = dma_map_single(nfc->dev, buf, len, dir); + if (dma_mapping_error(nfc->dev, paddr)) { + dev_err(nfc->dev, "Read buffer mapping error"); + return; + } + writel(paddr, nfc->base + DMA_ADDR0_OFST); + writel((paddr >> 32), nfc->base + DMA_ADDR1_OFST); + anfc_enable_intrs(nfc, (XFER_COMPLETE | eccintr)); + writel(prog, nfc->base + PROG_OFST); + anfc_wait_for_event(nfc); + dma_unmap_single(nfc->dev, paddr, len, dir); +} + +static void anfc_rw_pio_op(struct mtd_info *mtd, u8 *buf, int len, + bool do_read, int prog, int pktcount, int pktsize) +{ + struct nand_chip *chip = mtd_to_nand(mtd); + struct anfc_nand_controller *nfc = to_anfc(chip->controller); + struct anfc_nand_chip *achip = to_anfc_nand(chip); + u32 *bufptr = (u32 *)buf; + u32 cnt = 0, intr = 0; + + anfc_config_dma(nfc, 0); + + if (pktsize == 0) + pktsize = len; + + anfc_setpktszcnt(nfc, pktsize, pktcount); + + if (!achip->strength) + intr = MBIT_ERROR; + + if (do_read) + intr |= READ_READY; + else + intr |= WRITE_READY; + + anfc_enable_intrs(nfc, intr); + writel(prog, nfc->base + PROG_OFST); + while (cnt < pktcount) { + anfc_wait_for_event(nfc); + cnt++; + if (cnt == pktcount) + anfc_enable_intrs(nfc, XFER_COMPLETE); + if (do_read) + ioread32_rep(nfc->base + DATA_PORT_OFST, bufptr, + pktsize / 4); + else + iowrite32_rep(nfc->base + DATA_PORT_OFST, bufptr, + pktsize / 4); + bufptr += (pktsize / 4); + if (cnt < pktcount) + anfc_enable_intrs(nfc, intr); + } + anfc_wait_for_event(nfc); +} + +static void anfc_read_data_op(struct nand_chip *chip, u8 *buf, int len, + int pktcount, int pktsize) +{ + struct mtd_info *mtd = nand_to_mtd(chip); + + if (virt_addr_valid(buf)) + anfc_rw_dma_op(mtd, buf, len, 1, PROG_PGRD, pktcount, pktsize); + else + anfc_rw_pio_op(mtd, buf, len, 1, PROG_PGRD, pktcount, pktsize); +} + +static void anfc_write_data_op(struct nand_chip *chip, const u8 *buf, + int len, int pktcount, int pktsize) +{ + struct mtd_info *mtd = nand_to_mtd(chip); + + if (virt_addr_valid(buf)) + anfc_rw_dma_op(mtd, (char *)buf, len, 0, PROG_PGPROG, pktcount, + pktsize); + else + anfc_rw_pio_op(mtd, (char *)buf, len, 0, PROG_PGPROG, pktcount, + pktsize); +} + +static int anfc_read_page_hwecc(struct mtd_info *mtd, + struct nand_chip *chip, u8 *buf, + int oob_required, int page) +{ + struct anfc_nand_controller *nfc = to_anfc(chip->controller); + struct anfc_nand_chip *achip = to_anfc_nand(chip); + u8 *ecc_code = chip->ecc.code_buf; + u8 *p; + int eccsize = chip->ecc.size; + int eccbytes = chip->ecc.bytes; + int stat = 0, i; + u32 ret; + unsigned int max_bitflips = 0; + u32 eccsteps; + u32 one_bit_err = 0, multi_bit_err = 0; + + ret = nand_read_page_op(chip, page, 0, NULL, 0); + if (ret) + return ret; + + anfc_set_eccsparecmd(nfc, achip, NAND_CMD_RNDOUT, NAND_CMD_RNDOUTSTART); + anfc_config_ecc(nfc, true); + anfc_read_data_op(chip, buf, mtd->writesize, + DIV_ROUND_UP(mtd->writesize, achip->pktsize), + achip->pktsize); + + if (achip->strength) { + /* + * In BCH mode Arasan NAND controller can correct ECC upto + * 24-bit Beyond that, it can't even detect errors. + */ + multi_bit_err = readl(nfc->base + ECC_ERR_CNT_OFST); + multi_bit_err = ((multi_bit_err & PAGE_ERR_CNT_MASK) >> 8); + } else { + /* + * In Hamming mode Arasan NAND controller can correct ECC upto + * 1-bit and can detect upto 4-bit errors. + */ + one_bit_err = readl(nfc->base + ECC_ERR_CNT_1BIT_OFST); + multi_bit_err = readl(nfc->base + ECC_ERR_CNT_2BIT_OFST); + + /* Clear ecc error count register 1Bit, 2Bit */ + writel(0x0, nfc->base + ECC_ERR_CNT_1BIT_OFST); + writel(0x0, nfc->base + ECC_ERR_CNT_2BIT_OFST); + } + + anfc_config_ecc(nfc, false); + + if (oob_required) + chip->ecc.read_oob(mtd, chip, page); + + if (multi_bit_err || one_bit_err) { + if (!oob_required) + chip->ecc.read_oob(mtd, chip, page); + + mtd_ooblayout_get_eccbytes(mtd, ecc_code, chip->oob_poi, 0, + chip->ecc.total); + eccsteps = chip->ecc.steps; + p = buf; + for (i = 0 ; eccsteps; eccsteps--, i += eccbytes, + p += eccsize) { + stat = nand_check_erased_ecc_chunk(p, + chip->ecc.size, + &ecc_code[i], + eccbytes, + NULL, 0, + chip->ecc.strength); + if (stat < 0) { + mtd->ecc_stats.failed++; + } else { + mtd->ecc_stats.corrected += stat; + max_bitflips = max_t(unsigned int, max_bitflips, + stat); + } + } + } + + return max_bitflips; +} + +static int anfc_write_page_hwecc(struct mtd_info *mtd, + struct nand_chip *chip, const u8 *buf, + int oob_required, int page) +{ + int ret; + struct anfc_nand_controller *nfc = to_anfc(chip->controller); + struct anfc_nand_chip *achip = to_anfc_nand(chip); + + ret = nand_prog_page_begin_op(chip, page, 0, NULL, 0); + if (ret) + return ret; + + anfc_set_eccsparecmd(nfc, achip, NAND_CMD_RNDIN, 0); + anfc_config_ecc(nfc, true); + anfc_write_data_op(chip, buf, mtd->writesize, + DIV_ROUND_UP(mtd->writesize, achip->pktsize), + achip->pktsize); + + if (oob_required) + chip->ecc.write_oob(mtd, chip, page); + + anfc_config_ecc(nfc, false); + + return 0; +} + +static int anfc_ecc_init(struct mtd_info *mtd, + struct nand_ecc_ctrl *ecc, int ecc_mode) +{ + u32 ecc_addr; + unsigned int ecc_strength, steps; + struct nand_chip *chip = mtd_to_nand(mtd); + struct anfc_nand_chip *achip = to_anfc_nand(chip); + + ecc->mode = NAND_ECC_HW; + ecc->read_page = anfc_read_page_hwecc; + ecc->write_page = anfc_write_page_hwecc; + + mtd_set_ooblayout(mtd, &anfc_ooblayout_ops); + + steps = mtd->writesize / chip->ecc_step_ds; + + switch (chip->ecc_strength_ds) { + case 12: + ecc_strength = 0x1; + break; + case 8: + ecc_strength = 0x2; + break; + case 4: + ecc_strength = 0x3; + break; + case 24: + ecc_strength = 0x4; + break; + default: + ecc_strength = 0x0; + } + if (!ecc_strength) + ecc->total = 3 * steps; + else + ecc->total = + DIV_ROUND_UP(fls(8 * chip->ecc_step_ds) * + chip->ecc_strength_ds * steps, 8); + + ecc->strength = chip->ecc_strength_ds; + ecc->size = chip->ecc_step_ds; + ecc->bytes = ecc->total / steps; + ecc->steps = steps; + achip->ecc_strength = ecc_strength; + achip->strength = achip->ecc_strength; + ecc_addr = mtd->writesize + (mtd->oobsize - ecc->total); + achip->eccval = ecc_addr | (ecc->total << ECC_SIZE_SHIFT) | + (achip->strength << BCH_EN_SHIFT); + + if (chip->ecc_step_ds >= 1024) + achip->pktsize = 1024; + else + achip->pktsize = 512; + + return 0; +} + +/* NAND framework ->exec_op() hooks and related helpers */ +static void anfc_parse_instructions(struct nand_chip *chip, + const struct nand_subop *subop, + struct anfc_op *nfc_op) +{ + const struct nand_op_instr *instr = NULL; + struct anfc_nand_controller *nfc = to_anfc(chip->controller); + unsigned int op_id; + int i = 0; + const u8 *addrs; + + memset(nfc_op, 0, sizeof(struct anfc_op)); + for (op_id = 0; op_id < subop->ninstrs; op_id++) { + unsigned int naddrs; + + instr = &subop->instrs[op_id]; + switch (instr->type) { + case NAND_OP_CMD_INSTR: + if (op_id) + nfc_op->cmds[1] = instr->ctx.cmd.opcode; + else + nfc_op->cmds[0] = instr->ctx.cmd.opcode; + nfc->curr_cmd = nfc_op->cmds[0]; + + break; + + case NAND_OP_ADDR_INSTR: + i = nand_subop_get_addr_start_off(subop, op_id); + naddrs = nand_subop_get_num_addr_cyc(subop, + op_id); + addrs = &instr->ctx.addr.addrs[i]; + + for (; i < naddrs; i++) { + u8 val = instr->ctx.addr.addrs[i]; + + if (nfc_op->cmds[0] == NAND_CMD_ERASE1) { + nfc_op->row |= COL_ROW_ADDR(i, val); + } else { + if (i < 2) + nfc_op->col |= COL_ROW_ADDR(i, + val); + else + nfc_op->row |= COL_ROW_ADDR(i - + 2, val); + } + } + break; + case NAND_OP_DATA_IN_INSTR: + nfc_op->data_instr = instr; + nfc_op->data_instr_idx = op_id; + break; + case NAND_OP_DATA_OUT_INSTR: + nfc_op->data_instr = instr; + nfc_op->data_instr_idx = op_id; + break; + case NAND_OP_WAITRDY_INSTR: + break; + } + } +} + +static int anfc_reset_cmd_type_exec(struct nand_chip *chip, + const struct nand_subop *subop) +{ + struct anfc_op nfc_op = {}; + struct anfc_nand_controller *nfc = to_anfc(chip->controller); + + anfc_parse_instructions(chip, subop, &nfc_op); + anfc_prepare_cmd(nfc, nfc_op.cmds[0], 0, 0, 0, 0); + nfc->prog = PROG_RST; + anfc_enable_intrs(nfc, XFER_COMPLETE); + writel(nfc->prog, nfc->base + PROG_OFST); + anfc_wait_for_event(nfc); + + return 0; +} + +static int anfc_read_id_type_exec(struct nand_chip *chip, + const struct nand_subop *subop) +{ + const struct nand_op_instr *instr; + struct anfc_op nfc_op = {}; + unsigned int op_id, len; + struct anfc_nand_controller *nfc = to_anfc(chip->controller); + struct mtd_info *mtd = nand_to_mtd(chip); + + anfc_parse_instructions(chip, subop, &nfc_op); + instr = nfc_op.data_instr; + op_id = nfc_op.data_instr_idx; + len = nand_subop_get_data_len(subop, op_id); + anfc_prepare_cmd(nfc, nfc_op.cmds[0], 0, 0, 0, 1); + anfc_setpagecoladdr(nfc, nfc_op.row, nfc_op.col); + nfc->prog = PROG_RDID; + anfc_rw_pio_op(mtd, nfc->buf, roundup(len, 4), 1, PROG_RDID, 1, 0); + memcpy(instr->ctx.data.buf.in, nfc->buf, len); + + return 0; +} + +static int anfc_read_status_exec(struct nand_chip *chip, + const struct nand_subop *subop) +{ + const struct nand_op_instr *instr; + struct anfc_op nfc_op = {}; + unsigned int op_id, len; + struct anfc_nand_chip *achip = to_anfc_nand(chip); + struct anfc_nand_controller *nfc = to_anfc(chip->controller); + + anfc_parse_instructions(chip, subop, &nfc_op); + instr = nfc_op.data_instr; + op_id = nfc_op.data_instr_idx; + + anfc_prepare_cmd(nfc, nfc_op.cmds[0], 0, 0, 0, 0); + anfc_setpktszcnt(nfc, achip->spktsize / 4, 1); + anfc_setpagecoladdr(nfc, nfc_op.row, nfc_op.col); + nfc->prog = PROG_STATUS; + + anfc_enable_intrs(nfc, XFER_COMPLETE); + writel(nfc->prog, nfc->base + PROG_OFST); + anfc_wait_for_event(nfc); + + if (!nfc_op.data_instr) + return 0; + + len = nand_subop_get_data_len(subop, op_id); + + /* + * The Arasan NAND controller will update the status value + * returned by the flash device in FLASH_STS register. + */ + nfc->status = readl(nfc->base + FLASH_STS_OFST); + memcpy(instr->ctx.data.buf.in, &nfc->status, len); + + return 0; +} + +static int anfc_erase_and_zero_len_page_read_type_exec(struct nand_chip *chip, + const struct nand_subop + *subop) +{ + const struct nand_op_instr *instr; + struct anfc_nand_chip *achip = to_anfc_nand(chip); + struct anfc_nand_controller *nfc = to_anfc(chip->controller); + struct anfc_op nfc_op = {}; + struct mtd_info *mtd = nand_to_mtd(chip); + u32 dma_mode = 0, write_size = 0, addrcycles = 0, len, op_id; + + anfc_parse_instructions(chip, subop, &nfc_op); + instr = nfc_op.data_instr; + op_id = nfc_op.data_instr_idx; + + if (nfc_op.cmds[0] == NAND_CMD_ERASE1) { + nfc->prog = PROG_ERASE; + addrcycles = achip->raddr_cycles; + write_size = 0; + dma_mode = 0; + nfc_op.col = nfc_op.row & 0xffff; + nfc_op.row = (nfc_op.row >> PG_ADDR_SHIFT) & 0xffff; + } + if (nfc_op.cmds[0] == NAND_CMD_READ0) { + nfc->prog = PROG_PGRD; + addrcycles = achip->raddr_cycles + achip->caddr_cycles; + write_size = mtd->writesize; + dma_mode = 1; + } + + anfc_prepare_cmd(nfc, nfc_op.cmds[0], nfc_op.cmds[1], dma_mode, + write_size, addrcycles); + anfc_setpagecoladdr(nfc, nfc_op.row, nfc_op.col); + + if (nfc_op.cmds[0] == NAND_CMD_ERASE1) { + anfc_enable_intrs(nfc, XFER_COMPLETE); + writel(nfc->prog, nfc->base + PROG_OFST); + anfc_wait_for_event(nfc); + } + + if (!nfc_op.data_instr) + return 0; + + len = nand_subop_get_data_len(subop, op_id); + anfc_read_data_op(chip, instr->ctx.data.buf.in, len, 1, 0); + + return 0; +} + +static int anfc_read_param_get_feature_sp_read_type_exec(struct nand_chip *chip, + const struct nand_subop + *subop) +{ + const struct nand_op_instr *instr; + struct anfc_nand_controller *nfc = to_anfc(chip->controller); + unsigned int op_id, len; + struct anfc_op nfc_op = {}; + struct mtd_info *mtd = nand_to_mtd(chip); + struct anfc_nand_chip *achip = to_anfc_nand(chip); + u32 dma_mode, addrcycles, write_size; + + anfc_parse_instructions(chip, subop, &nfc_op); + instr = nfc_op.data_instr; + op_id = nfc_op.data_instr_idx; + + if (nfc_op.cmds[0] == NAND_CMD_PARAM) { + nfc->prog = PROG_RDPARAM; + dma_mode = 0; + addrcycles = 1; + write_size = 0; + } + if (nfc_op.cmds[0] == NAND_CMD_GET_FEATURES) { + nfc->prog = PROG_GET_FEATURE; + dma_mode = 0; + addrcycles = 1; + write_size = 0; + } + if (nfc_op.cmds[0] == NAND_CMD_READ0) { + nfc->prog = PROG_PGRD; + addrcycles = achip->raddr_cycles + achip->caddr_cycles; + write_size = mtd->writesize; + dma_mode = 1; + } + + anfc_prepare_cmd(nfc, nfc_op.cmds[0], 0, dma_mode, write_size, + addrcycles); + anfc_setpagecoladdr(nfc, nfc_op.row, nfc_op.col); + + if (!nfc_op.data_instr) + return 0; + + len = nand_subop_get_data_len(subop, op_id); + anfc_rw_pio_op(mtd, nfc->buf, roundup(len, 4), 1, nfc->prog, 1, 0); + memcpy(instr->ctx.data.buf.in, nfc->buf, len); + + return 0; +} + +static int anfc_random_datain_type_exec(struct nand_chip *chip, + const struct nand_subop *subop) +{ + const struct nand_op_instr *instr; + struct anfc_nand_controller *nfc = to_anfc(chip->controller); + unsigned int op_id, len; + struct anfc_op nfc_op = {}; + struct mtd_info *mtd = nand_to_mtd(chip); + + anfc_parse_instructions(chip, subop, &nfc_op); + instr = nfc_op.data_instr; + op_id = nfc_op.data_instr_idx; + + len = nand_subop_get_data_len(subop, op_id); + anfc_rw_pio_op(mtd, nfc->buf, roundup(len, 4), 1, PROG_PGRD, 1, 0); + memcpy(instr->ctx.data.buf.in, nfc->buf, len); + + return 0; +} + +static int anfc_setfeature_type_exec(struct nand_chip *chip, + const struct nand_subop *subop) +{ + const struct nand_op_instr *instr; + struct anfc_nand_controller *nfc = to_anfc(chip->controller); + unsigned int op_id, len; + struct anfc_op nfc_op = {}; + struct mtd_info *mtd = nand_to_mtd(chip); + + anfc_parse_instructions(chip, subop, &nfc_op); + nfc->prog = PROG_SET_FEATURE; + instr = nfc_op.data_instr; + op_id = nfc_op.data_instr_idx; + anfc_prepare_cmd(nfc, nfc_op.cmds[0], 0, 0, 0, 1); + anfc_setpagecoladdr(nfc, nfc_op.row, nfc_op.col); + + if (!nfc_op.data_instr) + return 0; + + len = nand_subop_get_data_len(subop, op_id); + memcpy(nfc->buf, (char *)instr->ctx.data.buf.out, len); + anfc_rw_pio_op(mtd, nfc->buf, roundup(len, 4), 0, nfc->prog, 1, 0); + + return 0; +} + +static int anfc_change_read_column_type_exec(struct nand_chip *chip, + const struct nand_subop *subop) +{ + const struct nand_op_instr *instr; + struct anfc_nand_controller *nfc = to_anfc(chip->controller); + unsigned int op_id, len; + struct anfc_op nfc_op = {}; + struct mtd_info *mtd = nand_to_mtd(chip); + + anfc_parse_instructions(chip, subop, &nfc_op); + nfc->prog = PROG_PGRD; + instr = nfc_op.data_instr; + op_id = nfc_op.data_instr_idx; + + anfc_prepare_cmd(nfc, nfc_op.cmds[0], nfc_op.cmds[1], 1, + mtd->writesize, 2); + anfc_setpagecoladdr(nfc, nfc_op.row, nfc_op.col); + + if (!nfc_op.data_instr) + return 0; + + len = nand_subop_get_data_len(subop, op_id); + anfc_rw_pio_op(mtd, nfc->buf, roundup(len, 4), 1, nfc->prog, 1, 0); + memcpy(instr->ctx.data.buf.in, nfc->buf, len); + + return 0; +} + +static int anfc_page_read_type_exec(struct nand_chip *chip, + const struct nand_subop *subop) +{ + const struct nand_op_instr *instr; + struct anfc_nand_chip *achip = to_anfc_nand(chip); + struct anfc_nand_controller *nfc = to_anfc(chip->controller); + unsigned int op_id, len; + struct anfc_op nfc_op = {}; + struct mtd_info *mtd = nand_to_mtd(chip); + u32 addrcycles; + + anfc_parse_instructions(chip, subop, &nfc_op); + nfc->prog = PROG_PGRD; + instr = nfc_op.data_instr; + op_id = nfc_op.data_instr_idx; + + addrcycles = achip->raddr_cycles + achip->caddr_cycles; + + anfc_prepare_cmd(nfc, nfc_op.cmds[0], nfc_op.cmds[1], 1, + mtd->writesize, addrcycles); + anfc_setpagecoladdr(nfc, nfc_op.row, nfc_op.col); + + if (!nfc_op.data_instr) + return 0; + + len = nand_subop_get_data_len(subop, op_id); + + anfc_rw_pio_op(mtd, nfc->buf, roundup(len, 4), 1, nfc->prog, 1, 0); + memcpy(instr->ctx.data.buf.in, nfc->buf, len); + + return 0; +} + +static int anfc_zero_len_page_write_type_exec(struct nand_chip *chip, + const struct nand_subop *subop) +{ + const struct nand_op_instr *instr; + struct anfc_nand_chip *achip = to_anfc_nand(chip); + struct anfc_nand_controller *nfc = to_anfc(chip->controller); + unsigned int op_id; + struct anfc_op nfc_op = {}; + struct mtd_info *mtd = nand_to_mtd(chip); + u32 addrcycles; + + anfc_parse_instructions(chip, subop, &nfc_op); + nfc->prog = PROG_PGRD; + instr = nfc_op.data_instr; + op_id = nfc_op.data_instr_idx; + + addrcycles = achip->raddr_cycles + achip->caddr_cycles; + + anfc_prepare_cmd(nfc, nfc_op.cmds[0], NAND_CMD_PAGEPROG, 1, + mtd->writesize, addrcycles); + anfc_setpagecoladdr(nfc, nfc_op.row, nfc_op.col); + + return 0; +} + +static int anfc_page_write_type_exec(struct nand_chip *chip, + const struct nand_subop *subop) +{ + const struct nand_op_instr *instr; + struct anfc_nand_chip *achip = to_anfc_nand(chip); + struct anfc_nand_controller *nfc = to_anfc(chip->controller); + unsigned int op_id, len; + struct anfc_op nfc_op = {}; + struct mtd_info *mtd = nand_to_mtd(chip); + u32 addrcycles; + + anfc_parse_instructions(chip, subop, &nfc_op); + instr = nfc_op.data_instr; + op_id = nfc_op.data_instr_idx; + nfc->prog = PROG_PGPROG; + + addrcycles = achip->raddr_cycles + achip->caddr_cycles; + anfc_prepare_cmd(nfc, nfc_op.cmds[0], nfc_op.cmds[1], 1, + mtd->writesize, addrcycles); + anfc_setpagecoladdr(nfc, nfc_op.row, nfc_op.col); + + if (!nfc_op.data_instr) + return 0; + + len = nand_subop_get_data_len(subop, op_id); + anfc_write_data_op(chip, (char *)instr->ctx.data.buf.out, len, 1, 0); + + return 0; +} + +static const struct nand_op_parser anfc_op_parser = NAND_OP_PARSER( + /* Use a separate function for each pattern */ + NAND_OP_PARSER_PATTERN( + anfc_random_datain_type_exec, + NAND_OP_PARSER_PAT_DATA_IN_ELEM(false, ANFC_MAX_CHUNK_SIZE)), + NAND_OP_PARSER_PATTERN( + anfc_change_read_column_type_exec, + NAND_OP_PARSER_PAT_CMD_ELEM(false), + NAND_OP_PARSER_PAT_ADDR_ELEM(false, ANFC_MAX_ADDR_CYCLES), + NAND_OP_PARSER_PAT_CMD_ELEM(false), + NAND_OP_PARSER_PAT_DATA_IN_ELEM(false, ANFC_MAX_CHUNK_SIZE)), + NAND_OP_PARSER_PATTERN( + anfc_page_read_type_exec, + NAND_OP_PARSER_PAT_CMD_ELEM(false), + NAND_OP_PARSER_PAT_ADDR_ELEM(false, ANFC_MAX_ADDR_CYCLES), + NAND_OP_PARSER_PAT_CMD_ELEM(false), + NAND_OP_PARSER_PAT_WAITRDY_ELEM(false), + NAND_OP_PARSER_PAT_DATA_IN_ELEM(false, ANFC_MAX_CHUNK_SIZE)), + NAND_OP_PARSER_PATTERN( + anfc_page_write_type_exec, + NAND_OP_PARSER_PAT_CMD_ELEM(false), + NAND_OP_PARSER_PAT_ADDR_ELEM(false, ANFC_MAX_ADDR_CYCLES), + NAND_OP_PARSER_PAT_DATA_OUT_ELEM(false, ANFC_MAX_CHUNK_SIZE), + NAND_OP_PARSER_PAT_CMD_ELEM(false), + NAND_OP_PARSER_PAT_WAITRDY_ELEM(true)), + NAND_OP_PARSER_PATTERN( + anfc_read_id_type_exec, + NAND_OP_PARSER_PAT_CMD_ELEM(false), + NAND_OP_PARSER_PAT_ADDR_ELEM(false, ANFC_MAX_ADDR_CYCLES), + NAND_OP_PARSER_PAT_DATA_IN_ELEM(false, ANFC_MAX_CHUNK_SIZE)), + NAND_OP_PARSER_PATTERN( + anfc_erase_and_zero_len_page_read_type_exec, + NAND_OP_PARSER_PAT_CMD_ELEM(false), + NAND_OP_PARSER_PAT_ADDR_ELEM(false, ANFC_MAX_ADDR_CYCLES), + NAND_OP_PARSER_PAT_CMD_ELEM(false), + NAND_OP_PARSER_PAT_WAITRDY_ELEM(false)), + NAND_OP_PARSER_PATTERN( + anfc_read_status_exec, + NAND_OP_PARSER_PAT_CMD_ELEM(false), + NAND_OP_PARSER_PAT_DATA_IN_ELEM(false, 1)), + NAND_OP_PARSER_PATTERN( + anfc_reset_cmd_type_exec, + NAND_OP_PARSER_PAT_CMD_ELEM(false), + NAND_OP_PARSER_PAT_WAITRDY_ELEM(false)), + NAND_OP_PARSER_PATTERN( + anfc_setfeature_type_exec, + NAND_OP_PARSER_PAT_CMD_ELEM(false), + NAND_OP_PARSER_PAT_ADDR_ELEM(false, ANFC_MAX_ADDR_CYCLES), + NAND_OP_PARSER_PAT_DATA_OUT_ELEM(false, ANFC_MAX_CHUNK_SIZE), + NAND_OP_PARSER_PAT_WAITRDY_ELEM(true)), + NAND_OP_PARSER_PATTERN( + anfc_read_param_get_feature_sp_read_type_exec, + NAND_OP_PARSER_PAT_CMD_ELEM(false), + NAND_OP_PARSER_PAT_ADDR_ELEM(false, ANFC_MAX_ADDR_CYCLES), + NAND_OP_PARSER_PAT_WAITRDY_ELEM(false), + NAND_OP_PARSER_PAT_DATA_IN_ELEM(true, ANFC_MAX_CHUNK_SIZE)), + NAND_OP_PARSER_PATTERN( + anfc_zero_len_page_write_type_exec, + NAND_OP_PARSER_PAT_CMD_ELEM(false), + NAND_OP_PARSER_PAT_ADDR_ELEM(false, ANFC_MAX_ADDR_CYCLES)), + ); + +static int anfc_exec_op(struct nand_chip *chip, + const struct nand_operation *op, + bool check_only) +{ + return nand_op_parser_exec_op(chip, &anfc_op_parser, + op, check_only); +} + +static void anfc_select_chip(struct mtd_info *mtd, int num) +{ + u32 val; + struct nand_chip *chip = mtd_to_nand(mtd); + struct anfc_nand_chip *achip = to_anfc_nand(chip); + struct anfc_nand_controller *nfc = to_anfc(chip->controller); + + if (num < 0) + return; + + val = readl(nfc->base + MEM_ADDR2_OFST); + val &= (val & ~(CS_MASK | BCH_MODE_MASK)); + val |= (achip->csnum << CS_SHIFT) | + (achip->ecc_strength << BCH_MODE_SHIFT); + writel(val, nfc->base + MEM_ADDR2_OFST); + nfc->csnum = achip->csnum; + writel(achip->eccval, nfc->base + ECC_OFST); + writel(achip->inftimeval, nfc->base + DATA_INTERFACE_OFST); +} + +static irqreturn_t anfc_irq_handler(int irq, void *ptr) +{ + struct anfc_nand_controller *nfc = ptr; + u32 status; + + status = readl(nfc->base + INTR_STS_OFST); + if (status & EVENT_MASK) { + complete(&nfc->event); + writel(status & EVENT_MASK, nfc->base + INTR_STS_OFST); + writel(0, nfc->base + INTR_STS_EN_OFST); + writel(0, nfc->base + INTR_SIG_EN_OFST); + return IRQ_HANDLED; + } + + return IRQ_NONE; +} + +static int anfc_setup_data_interface(struct mtd_info *mtd, int csline, + const struct nand_data_interface *conf) +{ + struct nand_chip *chip = mtd_to_nand(mtd); + struct anfc_nand_controller *nfc = to_anfc(chip->controller); + struct anfc_nand_chip *achip = to_anfc_nand(chip); + int err; + const struct nand_sdr_timings *sdr; + u32 inftimeval; + bool change_sdr_clk = false; + + if (csline == NAND_DATA_IFACE_CHECK_ONLY) + return 0; + + /* + * If the controller is already in the same mode as flash device + * then no need to change the timing mode again. + */ + sdr = nand_get_sdr_timings(conf); + if (IS_ERR(sdr)) + return PTR_ERR(sdr); + + if (sdr->mode < 0) + return -ENOTSUPP; + + inftimeval = sdr->mode & 7; + if (sdr->mode >= 2 && sdr->mode <= 5) + change_sdr_clk = true; + /* + * SDR timing modes 2-5 will not work for the arasan nand when + * freq > 90 MHz, so reduce the freq in SDR modes 2-5 to < 90Mhz + */ + if (change_sdr_clk) { + clk_disable_unprepare(nfc->clk_sys); + err = clk_set_rate(nfc->clk_sys, SDR_MODE_DEFLT_FREQ); + if (err) { + dev_err(nfc->dev, "Can't set the clock rate\n"); + return err; + } + err = clk_prepare_enable(nfc->clk_sys); + if (err) { + dev_err(nfc->dev, "Unable to enable sys clock.\n"); + clk_disable_unprepare(nfc->clk_sys); + return err; + } + } + achip->inftimeval = inftimeval; + + return 0; +} + +static int anfc_nand_attach_chip(struct nand_chip *chip) +{ + struct mtd_info *mtd = nand_to_mtd(chip); + struct anfc_nand_chip *achip = to_anfc_nand(chip); + u32 ret; + + if (mtd->writesize <= SZ_512) + achip->caddr_cycles = 1; + else + achip->caddr_cycles = 2; + + if (chip->options & NAND_ROW_ADDR_3) + achip->raddr_cycles = 3; + else + achip->raddr_cycles = 2; + + chip->ecc.calc_buf = kmalloc(mtd->oobsize, GFP_KERNEL); + chip->ecc.code_buf = kmalloc(mtd->oobsize, GFP_KERNEL); + ret = anfc_ecc_init(mtd, &chip->ecc, chip->ecc.mode); + if (ret) + return ret; + + return 0; +} + +static const struct nand_controller_ops anfc_nand_controller_ops = { + .attach_chip = anfc_nand_attach_chip, +}; + +static int anfc_nand_chip_init(struct anfc_nand_controller *nfc, + struct anfc_nand_chip *anand_chip, + struct device_node *np) +{ + struct nand_chip *chip = &anand_chip->chip; + struct mtd_info *mtd = nand_to_mtd(chip); + int ret; + + ret = of_property_read_u32(np, "reg", &anand_chip->csnum); + if (ret) { + dev_err(nfc->dev, "can't get chip-select\n"); + return -ENXIO; + } + mtd->name = devm_kasprintf(nfc->dev, GFP_KERNEL, "arasan_nand.%d", + anand_chip->csnum); + mtd->dev.parent = nfc->dev; + + chip->chip_delay = 30; + chip->controller = &nfc->controller; + chip->options = NAND_BUSWIDTH_AUTO | NAND_NO_SUBPAGE_WRITE; + chip->bbt_options = NAND_BBT_USE_FLASH; + chip->select_chip = anfc_select_chip; + chip->setup_data_interface = anfc_setup_data_interface; + chip->exec_op = anfc_exec_op; + nand_set_flash_node(chip, np); + + anand_chip->spktsize = SDR_MODE_PACKET_SIZE; + + ret = nand_scan(mtd, 1); + if (ret) { + dev_err(nfc->dev, "nand_scan_tail for NAND failed\n"); + return ret; + } + + return mtd_device_register(mtd, NULL, 0); +} + +static int anfc_probe(struct platform_device *pdev) +{ + struct anfc_nand_controller *nfc; + struct anfc_nand_chip *anand_chip; + struct device_node *np = pdev->dev.of_node, *child; + struct resource *res; + int err; + + nfc = devm_kzalloc(&pdev->dev, sizeof(*nfc), GFP_KERNEL); + if (!nfc) + return -ENOMEM; + + nand_controller_init(&nfc->controller); + INIT_LIST_HEAD(&nfc->chips); + init_completion(&nfc->event); + nfc->dev = &pdev->dev; + platform_set_drvdata(pdev, nfc); + nfc->csnum = -1; + nfc->controller.ops = &anfc_nand_controller_ops; + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + nfc->base = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(nfc->base)) + return PTR_ERR(nfc->base); + nfc->irq = platform_get_irq(pdev, 0); + if (nfc->irq < 0) { + dev_err(&pdev->dev, "platform_get_irq failed\n"); + return -ENXIO; + } + dma_set_mask(&pdev->dev, DMA_BIT_MASK(64)); + err = devm_request_irq(&pdev->dev, nfc->irq, anfc_irq_handler, + 0, "arasannfc", nfc); + if (err) + return err; + nfc->clk_sys = devm_clk_get(&pdev->dev, "clk_sys"); + if (IS_ERR(nfc->clk_sys)) { + dev_err(&pdev->dev, "sys clock not found.\n"); + return PTR_ERR(nfc->clk_sys); + } + + nfc->clk_flash = devm_clk_get(&pdev->dev, "clk_flash"); + if (IS_ERR(nfc->clk_flash)) { + dev_err(&pdev->dev, "flash clock not found.\n"); + return PTR_ERR(nfc->clk_flash); + } + + err = clk_prepare_enable(nfc->clk_sys); + if (err) { + dev_err(&pdev->dev, "Unable to enable sys clock.\n"); + return err; + } + + err = clk_prepare_enable(nfc->clk_flash); + if (err) { + dev_err(&pdev->dev, "Unable to enable flash clock.\n"); + goto clk_dis_sys; + } + + for_each_available_child_of_node(np, child) { + anand_chip = devm_kzalloc(&pdev->dev, sizeof(*anand_chip), + GFP_KERNEL); + if (!anand_chip) { + of_node_put(child); + err = -ENOMEM; + goto nandchip_clean_up; + } + err = anfc_nand_chip_init(nfc, anand_chip, child); + if (err) { + devm_kfree(&pdev->dev, anand_chip); + continue; + } + + list_add_tail(&anand_chip->node, &nfc->chips); + } + return 0; + +nandchip_clean_up: + list_for_each_entry(anand_chip, &nfc->chips, node) + nand_release(nand_to_mtd(&anand_chip->chip)); + clk_disable_unprepare(nfc->clk_flash); +clk_dis_sys: + clk_disable_unprepare(nfc->clk_sys); + + return err; +} + +static int anfc_remove(struct platform_device *pdev) +{ + struct anfc_nand_controller *nfc = platform_get_drvdata(pdev); + struct anfc_nand_chip *anand_chip; + + list_for_each_entry(anand_chip, &nfc->chips, node) + nand_release(nand_to_mtd(&anand_chip->chip)); + + clk_disable_unprepare(nfc->clk_sys); + clk_disable_unprepare(nfc->clk_flash); + + return 0; +} + +static const struct of_device_id anfc_ids[] = { + { .compatible = "arasan,nfc-v3p10" }, + { .compatible = "xlnx,zynqmp-nand" }, + { } +}; +MODULE_DEVICE_TABLE(of, anfc_ids); + +static struct platform_driver anfc_driver = { + .driver = { + .name = "arasan-nand-controller", + .of_match_table = anfc_ids, + }, + .probe = anfc_probe, + .remove = anfc_remove, +}; +module_platform_driver(anfc_driver); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Xilinx, Inc"); +MODULE_DESCRIPTION("Arasan NAND Flash Controller Driver");