From patchwork Sat Jun 30 02:45:18 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vipul Kumar X-Patchwork-Id: 937261 X-Patchwork-Delegate: jagannadh.teki@gmail.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.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=xilinx.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=xilinx.onmicrosoft.com header.i=@xilinx.onmicrosoft.com header.b="LstcWaMS"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 41HdGR5XtJz9s1B for ; Sat, 30 Jun 2018 12:47:27 +1000 (AEST) Received: by lists.denx.de (Postfix, from userid 105) id 754FFC21DF9; Sat, 30 Jun 2018 02:46:29 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=BAD_ENC_HEADER, SPF_HELO_PASS, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id B2BB5C21E29; Sat, 30 Jun 2018 02:45:50 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id D097AC21DCA; Sat, 30 Jun 2018 02:45:47 +0000 (UTC) Received: from NAM02-SN1-obe.outbound.protection.outlook.com (mail-sn1nam02on0062.outbound.protection.outlook.com [104.47.36.62]) by lists.denx.de (Postfix) with ESMTPS id 58052C21D56 for ; Sat, 30 Jun 2018 02:45:46 +0000 (UTC) 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=X/8sE9f8xlS6+kidyl7/n720h0prmgusnLeR0V4G1XY=; b=LstcWaMS6qrI/vfL8BEgqIg/OleRYMlJAaPysn6IxUicvJF8ePogNsSQzRe9ylE9/Xeb6mHrh/37WcWNWkKknHtVl+v7OxbaHQAYm5cmSZ1ksa6xhnqQMW1I2zP0g6luF2WX/wAC7OVL3bhS95Ib+Fd1b0GIkUijhIPBojv7tbU= Received: from BL0PR02CA0038.namprd02.prod.outlook.com (2603:10b6:207:3d::15) by BY2PR02MB2151.namprd02.prod.outlook.com (2a01:111:e400:c506::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.906.20; Sat, 30 Jun 2018 02:45:43 +0000 Received: from BL2NAM02FT015.eop-nam02.prod.protection.outlook.com (2a01:111:f400:7e46::209) by BL0PR02CA0038.outlook.office365.com (2603:10b6:207:3d::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.906.26 via Frontend Transport; Sat, 30 Jun 2018 02:45:42 +0000 Authentication-Results: spf=pass (sender IP is 149.199.60.100) smtp.mailfrom=xilinx.com; openedev.com; dkim=none (message not signed) header.d=none;openedev.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 BL2NAM02FT015.mail.protection.outlook.com (10.152.77.167) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.20.906.15 via Frontend Transport; Sat, 30 Jun 2018 02:45:41 +0000 Received: from unknown-38-66.xilinx.com ([149.199.38.66]:36167 helo=xsj-pvapsmtp01) by xsj-pvapsmtpgw02 with esmtp (Exim 4.63) (envelope-from ) id 1fZ5tM-0002EA-SA; Fri, 29 Jun 2018 19:45:40 -0700 Received: from [127.0.0.1] (helo=localhost) by xsj-pvapsmtp01 with smtp (Exim 4.63) (envelope-from ) id 1fZ5tH-0001eL-PD; Fri, 29 Jun 2018 19:45:35 -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 w5U2jTqg008046; Fri, 29 Jun 2018 19:45:29 -0700 Received: from [172.23.37.99] (helo=xhdsivadur40.xilinx.com) by xsj-pvapsmtp01 with esmtp (Exim 4.63) (envelope-from ) id 1fZ5tB-0001bc-3o; Fri, 29 Jun 2018 19:45:29 -0700 From: Vipul Kumar To: Date: Sat, 30 Jun 2018 08:15:18 +0530 Message-ID: <1530326720-8648-3-git-send-email-vipul.kumar@xilinx.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1530326720-8648-1-git-send-email-vipul.kumar@xilinx.com> References: <1530326720-8648-1-git-send-email-vipul.kumar@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)(136003)(39860400002)(346002)(376002)(2980300002)(438002)(189003)(199004)(50466002)(8936002)(11346002)(48376002)(186003)(14444005)(8676002)(106466001)(4326008)(2351001)(76176011)(2616005)(336012)(50226002)(19273905006)(426003)(1720100001)(36386004)(77096007)(316002)(16586007)(5660300001)(106002)(54906003)(26005)(446003)(966005)(478600001)(63266004)(305945005)(476003)(6916009)(6306002)(51416003)(7696005)(47776003)(107886003)(81156014)(126002)(44832011)(2906002)(81166006)(486006)(9786002)(6666003)(356003)(36756003)(107986001)(217873001)(5001870100001)(563064011); DIR:OUT; SFP:1101; SCL:1; SRVR:BY2PR02MB2151; H:xsj-pvapsmtpgw02; FPR:; SPF:Pass; LANG:en; PTR:unknown-60-100.xilinx.com,xapps1.xilinx.com; MX:1; A:1; X-Microsoft-Exchange-Diagnostics: 1; BL2NAM02FT015; 1:mqXbQcHX9HFdtjGEX/9m5vNhwEAsqH5N6RJu8TVZHyu1wDvVJc+IkSPaXMZPHBS97muFx7/yY4/qBeaWqBE3j2Dyscus0zL1YNWxhBh3SsEnegox3F+5+pzB85v9schg MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: a33aa60d-b772-4482-6859-08d5de3391f6 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652040)(8989117)(4534165)(4627221)(201703031133081)(201702281549075)(8990107)(5600053)(711020)(4608076)(2017052603328)(7153060); SRVR:BY2PR02MB2151; X-Microsoft-Exchange-Diagnostics: 1; BY2PR02MB2151; 3:/rw4cpHlMkQZ26eUfA+wBqAYnu2S188Z5wTScG+l11sFu1SeGKxOv+TVCCUjHieS1PZaEP0Uyd8jO5sLcOyhxEAp+TEE8OWS2KL7zJniMbFtVD/uj4aQ667opN835eLnMKdD/Gy/Ho2rkasfISceEEvYG7la7FGv5uuL5A+NMpvoTBB9DwxOQN3/MQ87Czzoig4IXD+I1izBj7YFr0x5Aw6k7Hwizl8TBfU73Q3hcmbcgDapgJizHFLdwSWPYEVOlxwIiifwRxNXjoMoBWrC3w41mqhPbYAFx72FlP+dkD+ZPNj713dglI6ZFJU5qmRwY1LEbWSY2crVLwnosQqCK9gKOd0cILgycYDHFQmoC6M=; 25:ru+DVjL8EEjCbeo33rT84avwJ13/B0J0cDDsS4txjGIhMMGj7m29W4A3hVIfOIv63x3GEQ6o5GZ6reOmlufcCDSnZwQXj7vyQ3i2O8U5ZNq/Xcvbd5sMpOtbtbhIVVPK6ryuUFpL9Y2KHnBzdjInmBjzYr5x5fhpMONThR/avMKvLRXniPZc0cX1Q1CMh476QUBB93terHVKj74ubWqweZataqinZsKCbXeKzVqSjARGp8AwV8tpDQ78T6cQ7QVEkkmXui6HiigYI6V1uPQqbV+cF71SQvHLWmYEONpNF3csSNp/F5tiPtwG3y2j/NjGkgxSjMLE9QwQ2eEDpcFBkA== X-MS-TrafficTypeDiagnostic: BY2PR02MB2151: X-Microsoft-Exchange-Diagnostics: 1; BY2PR02MB2151; 31:QhN87xCSc2cB7G1c9fazWB5e+ypYQmrMU6eNh1M5YPl5sDzZgu5kkAl16gsGTo3ORgrJSYuUUIogLPDzCmVh5tiPLzvPHzsLVfzyvC4NMSiqVW0OMFXLYGD+4NF+jBolkUPlAr3KrofyXtPPzXITWC5JFM6vm1YrzZD5RsYjXxBoAorBsUeOfvauGcmfcHgp4vcqmwsdLaGs/CTCDO45LlFnZifXoai5FqEYAZ2zWsw=; 20:nVBF7UnGcFhZMtbVwkktyt+qHtgwno/dPEmJ8dlrACDNzecbvmlp8ATP7uYDCgOizRDPR8YCJw+QfU3z+J0cZM1/9JjzCVPhf9QXpe1AktSUYZ5mpht5YfotSD9vo7WS56eAv56IsUi2zIn58CUtdoS7A36vlQudxt64Kacv5K+H6axDQDeEfYHIsPk5oCEyLdrJ/dV5sRQLAkU3JTIwhTVCrIlDuf3z1c92y517P7dcSpMmHIHZoDSLJ2FTZ3k5NkwzbT/MnV0wyxfg2iPRO+/cND8ZHNEa2zZbnPmxeLttCFgVeyNNIBSBHnVzublwl8fDIlDcb6J2QjXq77gPYi4p3BBP22Pa/tk8/cxmi4XqKQghZ1T/OUyOCwi9+zbtrP89wV1kDRsnf9Bec20+zRzI14l7g1sKwdo/2QSPewtA/tJQP2CG5qyJQWYEyMYvY9q13xlx9hDeYmdLtbpbKpVnh6UN7uq/PukOqYu2owP38A598W9ULR1ffGyFirgU X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(131327999870524)(192813158149592)(189271028609987); X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(5005006)(8121501046)(10201501046)(3002001)(3231254)(944501410)(52105095)(93006095)(93004095)(6055026)(149027)(150027)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123560045)(20161123562045)(20161123558120)(20161123564045)(6072148)(201708071742011)(7699016); SRVR:BY2PR02MB2151; BCL:0; PCL:0; RULEID:; SRVR:BY2PR02MB2151; X-Microsoft-Exchange-Diagnostics: 1; BY2PR02MB2151; 4:NlUtLLhANHJnJ/91vZ2PzZjvqxgkcnR0h2ijHuvDTXQf4eCKheNk8hWuR+KKMkuDYtpGYUoChYYksETi99JwFfRn7WoNlaO+DswxIodgSi4qCbabYO8is9WYWCRHnHOLKdkghVrtMlH+thG8YoLILKpaI57p3ot6c9Binb1Nmizr3HBUH94TV/r818+Az12T/IohjgjvnItptYLgSuk+9YJi5d08bQmzEkrCyAlGxmwoWG8omdK6XrBmnTfR3uga3DZCfh5z/W1j1TicHLUhkrzImrF6YlbSu/LFPy6wFMuvABLcWJ/l5Id39Ee0nfercqg0orZ5/bESOa4ZUOtuEVOCNhD85wD22t7q97AnQPXKMWS/Sext6w8t9cCTM7fC X-Forefront-PRVS: 0719EC6A9A X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BY2PR02MB2151; 23:Lo7EBqSY340L3Kkywk7ZfMP8SpGTaY0tpoSiYyLV0?= xGowYdSSuP+W46vE6AAQ8m6Ahrk2s+t6g2zfkDjaXqDgOo6gNnPRK4tf10ILQXaXT8sJngEsDljd88NiUn1+syHajWFY7QcxucPa4bn1tmTwicA2sox/o0QW+tg5xgd5PshTvUOBGa6lTxYPb1pzGse7OVRGTdExfbyp01lXjqtGYFtFbkYXNGMGVgWrpFk8sTU4Xbl7UuhvfE1n5Sg+DhPRlEuWZWz+lsaasSc6ph9MGEEwi1LBxbIjCxKLtLipk8muSjwORofKnjaPQj2o5pmLtC3e3YRUeb9ruOMpyV420bHHDdBLp19dgcNTdF2My4ni3va6C9YZg1GULxjAlTF7RuUM0O4oVq91M3l24Ty1FDDxjPDUxrlShPMPhDGRkDlFZAwLTGQlYRWGN8XHzBHOMNEWTR4aNErP0rv5cf6OpHqoACWhVcoFE0lOQiZjdXNCy+ZIhpefl/pz6PxKiq29VnKJIpJ0HWP3qCA9ZhjFK3knExuw1I7b9FKwg1M/aJQp2W/MLmGsPBKNqGYLx7M37CzCPhsyP0U0Yybh8xLOFnHZdLicytcaCKfRIokFxCE/PXCr8xdZnJTXDAuKFPL/sYfekpqFyJqFSXnwaVHt01tRjUfjlk8CIOuxgK9ePYds5t05vu8Hy+8Im8G+sHTFoRvQK82zNS3np+7umLNwOHbwLLLGdIlSgaz2zgCFWUrPELDgLLnjBxrTmRAM3p3Jicfu1kfoqIlrmwVOab5xDaKzxQaMS7/T68/tcM7w+fyaeFn1v9xDrS//q6BymkNBEo3T6Sunuu0jc5dHGHOhBY4Jv7q/1LCPkAFw2SaAUUed9WW5uD7hEu92EXtvVUxoQ5vRfT3oaJ1xGIUh/yUipeS7JlrUUa65ZZ4dA1fuEEaeg+onMZ+FLq0IoYn68V+oocK21OdUBeKZ1ANNxdkgSHWbr+VZ3NLDE4c+gSPiZ8KV2Nv664WrALr75sQPRb371IlCpoeiIA1BzuAAI6CVZCD1aYqJHRMNSfjBAQ2ICCOQHoBl0cb4Bheh7OL1+v4DKp0NETWpfaesarKi/VcF6uC4KeGTWOj65HEWhHfiDDe6vQGx8/X4uFzrkBYF2VDqJA2irII0hl4gjfwKCO/bBZfa0AD1tlCPJGJi6W7Gs3+Iuki1X5xUUNqvFSa7DJ82n3+wx7dkYbty+kH1suVUeNxxXPHexd2cSocbAPN/L4fumAxO/a7ip725HX+D2RqF2sbR2ZvDRXSjccoJJBW9gDHSgrBVJ8QINL1kAXLh/1x/p+sAJCTmBsFNaJPd9NT X-Microsoft-Antispam-Message-Info: WI49an/DEbwDGNqYEwnAkVxMChfTHu3pMDh/wW7TYwgbk7Yv5LtInBDBAxoPWXBf9b9xd6BnitUdhkRdJGXXRjCDGeNPS25C4Vp3RpfAqgEtRkqnHm5b27ROoUDDEPWvLUeRDy1aMP/DNf9bDWwboJXUcciedPNN99HHo8SuHKBdluGP8LKhOFt37S0EQPsLoSItk3g7SKT8fdSFjOjD/maD5XsRhnn0UoBzzxjL6jJc8GtzqFp3HaYq1RGZy9FSs8QeiNAiYySeKO2nWVuWBIKZt3/BaqqkK5ByGQl6hY7qoARR8Lqf95rcXn2hJlpXvKlHmsqoDL+h/tldui1Ra75OmkDw74to989aEnV0tsI= X-Microsoft-Exchange-Diagnostics: 1; BY2PR02MB2151; 6:WsDbsGYHUhpTWfGSpMUpfNvykfStLRjlMy3rVuRwfysLHYNdrBl39yZDvpnBriSTx/7GinA6EBrmgKqTKXsF7io5tL1N9/p/GDYgLilAs9J6QizLSbTob4CaxbYghb4jiXq3VJhHYPyZ5es3NxaDjJH0A5wwEH+ipGBN2Id9S9K3HobuwDZiXUEcBQIGCcLo/3gt2RKgRlPdBj2MLt0inDEAU4/MaDuFWqNmMKFFlPM/9UUiAyhrB8J8UzUwpE4B3ocjdm59Oe5JyrDeay54NjlsL3zAkRlg88Q9lq8lJi4JyovPvJ5Lh6DtDqU8b4o+WGMlrhBRgn7VcT9IK/vbUXh/z3BvVCZkZ1UBxyyXTbW4xARVvcwMS17GK+EW+hluJRqjLxjZNZTV67ia4JhreotXBZ/VS06JD/upaXl7kTFZPOBE6hvWdbBXAXEXudYnmzwYJBNIWAPOMjO4nGCpwg==; 5:pnkot1/NRd9p9xIjDr2aonUKKzXqfMYpHJQug8/tLl+flcHAAVP+UzOwLgAIxdZJV8TcGmgVCCgKhqw8vGJ47BWhTye1/5J3zw0WSSL1kdN3i6n2x3gdZQ5w5D//5pc/MtsP2OVs0tCnBhG3Vd/Dhh2XBlxWL+CuVdEr6QpEAc0=; 24:DaOkY4o7CtGmCTWYPR5Ic9RVSIddAA29Zft3yl6XCYUSUv6jbVGSbrPra8cqXHJxOqo5EV3EwUmugit6H9kQ1IHOL2EYg92MaLATd+rZQz8= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; BY2PR02MB2151; 7:sn+ljfrW7AQIxtUxF+toLwCi3B/dJQqDyEYifGgDH7qpKQ1lOkYw2DRbSD24exj/qjtXuf3r0czaFc+Csv23geyft8qQXbPDB77ZhTCDZ0OBPOQe4dgkUFrJJYWkhxa5vBC4bZA7g28mMywF4A874M3W2MboBOepINd+s8vylKnIlNWKsd8qKZmZHJjARAJy3vBTAbhkYihGtUMBU3OEFY4ybq4nNJJ+Zg2HPGxMWvy4NTHkLDiLeVMIsUlKCpc+ X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Jun 2018 02:45:41.3836 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: a33aa60d-b772-4482-6859-08d5de3391f6 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: BY2PR02MB2151 Cc: jagan@openedev.com, michal.simek@xilinx.com, Vipul Kumar Subject: [U-Boot] [UBOOT PATCH v5 2/4] spi: xilinx_spi: Modify transfer logic xilinx_spi_xfer() function X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" This patch modify xilinx_spi_xfer() function and add rxfifo() and txfifo() functions to add the modularity so that these functions can be used by other functions within the same file. This patch also added support to read fifo_size from dts. Signed-off-by: Vipul Kumar Signed-off-by: Siva Durga Prasad Paladugu --- Changes in v5: - No change --- drivers/spi/xilinx_spi.c | 103 +++++++++++++++++++++++++++++++---------------- 1 file changed, 68 insertions(+), 35 deletions(-) diff --git a/drivers/spi/xilinx_spi.c b/drivers/spi/xilinx_spi.c index cc5ac51..11b7343 100644 --- a/drivers/spi/xilinx_spi.c +++ b/drivers/spi/xilinx_spi.c @@ -19,6 +19,7 @@ #include #include #include +#include /* * [0]: http://www.xilinx.com/support/documentation @@ -77,6 +78,8 @@ #define CONFIG_XILINX_SPI_IDLE_VAL GENMASK(7, 0) #endif +#define XILINX_SPISR_TIMEOUT 10000 /* in milliseconds */ + /* xilinx spi register set */ struct xilinx_spi_regs { u32 __space0__[7]; @@ -101,6 +104,7 @@ struct xilinx_spi_priv { struct xilinx_spi_regs *regs; unsigned int freq; unsigned int mode; + unsigned int fifo_depth; }; static int xilinx_spi_probe(struct udevice *bus) @@ -110,6 +114,9 @@ static int xilinx_spi_probe(struct udevice *bus) priv->regs = (struct xilinx_spi_regs *)devfdt_get_addr(bus); + priv->fifo_depth = fdtdec_get_int(gd->fdt_blob, dev_of_offset(bus), + "fifo-size", 0); + writel(SPISSR_RESET_VALUE, ®s->srr); return 0; @@ -157,6 +164,47 @@ static int xilinx_spi_release_bus(struct udevice *dev) return 0; } +static u32 xilinx_spi_fill_txfifo(struct udevice *bus, const u8 *txp, + u32 txbytes) +{ + struct xilinx_spi_priv *priv = dev_get_priv(bus); + struct xilinx_spi_regs *regs = priv->regs; + unsigned char d; + u32 i = 0; + + while (txbytes && !(readl(®s->spisr) & SPISR_TX_FULL) && + i < priv->fifo_depth) { + d = txp ? *txp++ : CONFIG_XILINX_SPI_IDLE_VAL; + debug("spi_xfer: tx:%x ", d); + /* write out and wait for processing (receive data) */ + writel(d & SPIDTR_8BIT_MASK, ®s->spidtr); + txbytes--; + i++; + } + + return i; +} + +static u32 xilinx_spi_read_rxfifo(struct udevice *bus, u8 *rxp, u32 rxbytes) +{ + struct xilinx_spi_priv *priv = dev_get_priv(bus); + struct xilinx_spi_regs *regs = priv->regs; + unsigned char d; + unsigned int i = 0; + + while (rxbytes && !(readl(®s->spisr) & SPISR_RX_EMPTY)) { + d = readl(®s->spidrr) & SPIDRR_8BIT_MASK; + if (rxp) + *rxp++ = d; + debug("spi_xfer: rx:%x\n", d); + rxbytes--; + i++; + } + debug("Rx_done\n"); + + return i; +} + static int xilinx_spi_xfer(struct udevice *dev, unsigned int bitlen, const void *dout, void *din, unsigned long flags) { @@ -168,8 +216,10 @@ static int xilinx_spi_xfer(struct udevice *dev, unsigned int bitlen, unsigned int bytes = bitlen / XILSPI_MAX_XFER_BITS; const unsigned char *txp = dout; unsigned char *rxp = din; - unsigned rxecount = 17; /* max. 16 elements in FIFO, leftover 1 */ - unsigned global_timeout; + u32 txbytes = bytes; + u32 rxbytes = bytes; + u32 reg, count, timeout; + int ret; debug("spi_xfer: bus:%i cs:%i bitlen:%i bytes:%i flags:%lx\n", bus->seq, slave_plat->cs, bitlen, bytes, flags); @@ -184,48 +234,31 @@ static int xilinx_spi_xfer(struct udevice *dev, unsigned int bitlen, goto done; } - /* empty read buffer */ - while (rxecount && !(readl(®s->spisr) & SPISR_RX_EMPTY)) { - readl(®s->spidrr); - rxecount--; - } - - if (!rxecount) { - printf("XILSPI error: Rx buffer not empty\n"); - return -1; - } - if (flags & SPI_XFER_BEGIN) spi_cs_activate(dev, slave_plat->cs); - /* at least 1usec or greater, leftover 1 */ - global_timeout = priv->freq > XILSPI_MAX_XFER_BITS * 1000000 ? 2 : - (XILSPI_MAX_XFER_BITS * 1000000 / priv->freq) + 1; - while (bytes--) { - unsigned timeout = global_timeout; - /* get Tx element from data out buffer and count up */ - unsigned char d = txp ? *txp++ : CONFIG_XILINX_SPI_IDLE_VAL; - debug("spi_xfer: tx:%x ", d); + while (txbytes && rxbytes) { + count = xilinx_spi_fill_txfifo(bus, txp, txbytes); + reg = readl(®s->spicr) & ~SPICR_MASTER_INHIBIT; + writel(reg, ®s->spicr); + txbytes -= count; + if (txp) + txp += count; - /* write out and wait for processing (receive data) */ - writel(d & SPIDTR_8BIT_MASK, ®s->spidtr); - while (timeout && readl(®s->spisr) - & SPISR_RX_EMPTY) { - timeout--; - udelay(1); - } - - if (!timeout) { + ret = wait_for_bit_le32(®s->spisr, SPISR_TX_EMPTY, true, + XILINX_SPISR_TIMEOUT, false); + if (ret < 0) { printf("XILSPI error: Xfer timeout\n"); - return -1; + return ret; } - /* read Rx element and push into data in buffer */ - d = readl(®s->spidrr) & SPIDRR_8BIT_MASK; + debug("txbytes:0x%x,txp:0x%p\n", txbytes, txp); + count = xilinx_spi_read_rxfifo(bus, rxp, rxbytes); + rxbytes -= count; if (rxp) - *rxp++ = d; - debug("spi_xfer: rx:%x\n", d); + rxp += count; + debug("rxbytes:0x%x rxp:0x%p\n", rxbytes, rxp); } done: