From patchwork Mon Jan 30 10:38:20 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Siva Durga Prasad Paladugu X-Patchwork-Id: 721355 X-Patchwork-Delegate: jh80.chung@samsung.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id 3vBm8L0hs1z9ryr for ; Mon, 30 Jan 2017 21:38:42 +1100 (AEDT) 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="pMgo49gB"; dkim-atps=neutral Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 985204AB34; Mon, 30 Jan 2017 11:38:39 +0100 (CET) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id SyCUtdkdwtXU; Mon, 30 Jan 2017 11:38:39 +0100 (CET) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 2799B4AA22; Mon, 30 Jan 2017 11:38:39 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 19F974AA22 for ; Mon, 30 Jan 2017 11:38:33 +0100 (CET) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id kvyajaq96viN for ; Mon, 30 Jan 2017 11:38:32 +0100 (CET) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from NAM01-BN3-obe.outbound.protection.outlook.com (mail-bn3nam01on0060.outbound.protection.outlook.com [104.47.33.60]) by theia.denx.de (Postfix) with ESMTPS id 53A814A99B for ; Mon, 30 Jan 2017 11:38:28 +0100 (CET) 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; bh=4hlmp2pI5Fd1EIHSjEl4pC4ZxPRIYJ5YGENwKrf1oiw=; b=pMgo49gB0lZCqilPrp9/SC3/Up6o9S2SwqEGFV55pmz0PBqwM404jy8o6RFpoIFJ6bW0x2LhT3jOIpez+eWXuGA9LvTWeatsUCHGM0aFL67qSseldPodxN0zq0QMEt0NFBBojTJULuibv+3f7YdDno/nCjBg2pXGoZioybuG4hg= Received: from MWHPR02CA0004.namprd02.prod.outlook.com (10.168.209.142) by DM2PR02MB1387.namprd02.prod.outlook.com (10.161.143.144) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.860.13; Mon, 30 Jan 2017 10:38:25 +0000 Received: from CY1NAM02FT061.eop-nam02.prod.protection.outlook.com (2a01:111:f400:7e45::208) by MWHPR02CA0004.outlook.office365.com (2603:10b6:300:4b::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.874.12 via Frontend Transport; Mon, 30 Jan 2017 10:38:25 +0000 Authentication-Results: spf=pass (sender IP is 149.199.60.100) smtp.mailfrom=xilinx.com; lists.denx.de; dkim=none (message not signed) header.d=none;lists.denx.de; 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 CY1NAM02FT061.mail.protection.outlook.com (10.152.75.30) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.874.2 via Frontend Transport; Mon, 30 Jan 2017 10:38:24 +0000 Received: from unknown-38-66.xilinx.com ([149.199.38.66]:59028 helo=xsj-pvapsmtp01) by xsj-pvapsmtpgw02 with esmtp (Exim 4.63) (envelope-from ) id 1cY9Lr-0004dG-JB; Mon, 30 Jan 2017 02:38:23 -0800 Received: from [127.0.0.1] (helo=localhost) by xsj-pvapsmtp01 with smtp (Exim 4.63) (envelope-from ) id 1cY9Lr-00045U-F3; Mon, 30 Jan 2017 02:38:23 -0800 Received: from [172.23.37.99] (helo=xhdsivadur40.xilinx.com) by xsj-pvapsmtp01 with esmtp (Exim 4.63) (envelope-from ) id 1cY9Lm-00041m-KN; Mon, 30 Jan 2017 02:38:19 -0800 From: Siva Durga Prasad Paladugu To: Date: Mon, 30 Jan 2017 16:08:20 +0530 Message-ID: <1485772712-4653-4-git-send-email-sivadur@xilinx.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1485772712-4653-1-git-send-email-sivadur@xilinx.com> References: <1485772712-4653-1-git-send-email-sivadur@xilinx.com> X-TM-AS-Product-Ver: IMSS-7.1.0.1224-8.1.0.1062-22854.006 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)(6009001)(7916002)(39410400002)(39860400002)(39450400003)(39850400002)(39840400002)(2980300002)(438002)(189002)(199003)(50226002)(9786002)(36756003)(33646002)(92566002)(5660300001)(6666003)(2950100002)(6916009)(4326007)(77096006)(2906002)(54906002)(47776003)(189998001)(107886002)(36386004)(8936002)(5003940100001)(81166006)(2351001)(38730400001)(81156014)(4001430100002)(39060400001)(8676002)(50466002)(626004)(48376002)(356003)(76176999)(50986999)(110136003)(63266004)(106466001)(305945005)(107986001)(5001870100001); DIR:OUT; SFP:1101; SCL:1; SRVR:DM2PR02MB1387; H:xsj-pvapsmtpgw02; FPR:; SPF:Pass; PTR:xapps1.xilinx.com,unknown-60-100.xilinx.com; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; CY1NAM02FT061; 1:zgiuztcLFV1ezkZ8ong1xkVJa8Dh77mzs11UR8/p/DZpBpJTB8sWa9z6O9jWIA6eJ2MVIJcPDr6vmcy4FpmXz2xirxAg7zCNlLjuS2PSGSjSSf2SntITrxWvs4H5bL/3VoEz1p++minNhIFKA3fprKvZb4LNuWFnYT3LImuBSh89oRf9EiB/G27WhxexHUlp2qUw07T0sJjABKS4sE3VrzX5B23VRbZv5ZG5AEhZTcW+u/NgoYDgJQVkGnMLnpAtL4Wt8LdRaf9uMVzCIdzs5J/w1X3dkkQ0iXUR9n4ytWGwO5dGkfuc6vZNluznttUdZSpG0kD42xni//xZwMh0lqvCI4Nwf48HQgimjqyzgC3nQlBWqGVBMUjoNfqhzL9H+bVOV7aSEuHRNCw7TNPKVuRsnZd09jjcjz62oswYz0EbWLYY11wO+0LgKrZtkE0LEnoY2QI/GX0g/uAwEG7eayPZjhhgzIMUwrjcqOkqCYE4dKkZqgvoSvrg42Mgjl7pgv2h6KsWxa6Xg1KfWt5wNSVa9c3LuFDrg+jXrUcFwMI= MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: 61eec87a-b88a-46f9-e128-08d448fc1e5f X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(8251501002); SRVR:DM2PR02MB1387; X-Microsoft-Exchange-Diagnostics: 1; DM2PR02MB1387; 3:5Sw5tzz2iwJhmSwzY4fAOjQrsKbsJsCY6Dh4MZ6EmlWnir1KYW0aZX2b3Wn5zriJkb2RkFrTtW/0dVfIqTpsW5oqNDTP3rsmTP/ReFHLZ7W7RTTYhFOgecvms5uD08Ld38CHGxvp4UakIbcCPNfqY0OiSbog4ECvBcSto2VaePh9R35y1oqRui+XPFp1dKESBmNjikBwfANSeppkpfxPTWCq5GRJCG9CaU2KrFo2+6o9gh8eiCD9GFPp8MJaUaoG/bhUVeZDOxXnWaCYFSA6zhqImlU3N6D4JCbZc/U2oaQSUGfD5X+hWn1yTO5bkGQGSd2wip2RMtET6o/NDh9KSMspPs5ek1Fbmje9QpKzf8ZLZQyr9SJ2vD1YbfsYuPr1ICk59TcEQJN/wyjoVz1qEA==; 25:zEE5TXNSwsj8/VJivWwb9T3hQrQO6nM3txWxAL7As8PeRzZMzXoJKRUQB/U7TZ0AiA2p0mn3wMx+25MZqBBKSmT+il57RwVKqwX4d5roIK+b+xzVV+cZvbXBqDgzJn+uHEmPZgz3kuKjzJCW0x2SQZH8sNWgPJ5u+dJz2v1PABUYRfAXxj5rYbzK65bX2AwEckeQUqFPiepk+/oWGSoDbPi1bF51k1KF3vdAf9OQLmWMILMpbp5h9FkJtSWxirYMgvyc/d+v5cUOT3qR97HKR52/jUgndfsS26d3EnXZv0SxktVdJxoLQ4+vk27K7WoEwNysmBWrbq2vB7rBZxsQfXbJsXLBKb0fgOt8IsQEa8cYGT6EdVCG8UJPq8d6DPxxLUVSYqZ0jC+TDkraMHTLHuzPuzwdK8OkkHq6DCqXUynDWdmC9tPq3zWvr+PK+7E/dxzfeBJ7mMMengybHCYKfQ== X-Microsoft-Exchange-Diagnostics: 1; DM2PR02MB1387; 31:DUzyMhba8KLLtTX+t0CjIyXBrKHDu5vbo7pbPUmbovJWnW46rmHqUoEhmXPMFI9mz5H78E5t+fqFiyHN2uXgiXSUG5c58vA7RSGkalcx/viKqWl29HrnmYrgfeBoop0nTlze/AYfsQaiGa7laVz84veIfCpuXkQjBt/Yje2FnOyMh7gZvoyz2tmI+77hJzc2FWygtRLmpUuWfoi2QfTfe5EPGOkvfmkYz2mQPB8S+3bPBiBvVdeeHvJg9vLuAAAc3hDXDkqqXoe+NRlAuqOoZINQOEHtG7e9KT4TAxx29ZYzhjA5YvHWJy8rGnzqE073; 20:GXT02kmrXLUXCjhhOR+rSmQRjZSc+3ADR1qjrj++eqyd1YX2Vxoa4tPHhuWkKyiLXJ8/xEt9JbJcJXXoJWPd0snpCsxeLG79C28lP9c+5mD+f4uo5xqAOd4U9Mv11CM3xn9xKCa3HQohS/voC0n3/BeKKxnhHcOZ/SfpSmZqd6XWg7Lue6fmF0O4onOwk+z0h1FKsPOTe3/PrZDItd/KP/W88HNhBcynp2pNt3d+3C7wBwZ0RGFpilbTAPi82Nz6jH3IOO0iU2yMiIinGqKZDz2FMR+ZvNBVyeaT+zI3NpeFnkltUsMFVlyY2KctHKVrn2yC4zznoKeaP4/B8p3bawlWvq94AGoEO/sHo8DwHPum0Uq8ypLrWNyxeKzsIn5JoYhnSZpM97Y58HMS/rIA+hNxTqEJMWjdyN7hotWkZsONAYSXgsQLnWrHaz/zFgUPKw79UhVjDo7JTHCMbgihc/7h/rHXy2zJgvb5Wl53dhz2LX6qZvAVvBD+DmdE/Sq4 X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(192813158149592); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040375)(601004)(2401047)(13023025)(13017025)(13015025)(13024025)(13018025)(8121501046)(5005006)(10201501046)(3002001)(6055026)(6041248)(20161123560025)(20161123564025)(20161123562025)(20161123555025)(6072148); SRVR:DM2PR02MB1387; BCL:0; PCL:0; RULEID:; SRVR:DM2PR02MB1387; X-Microsoft-Exchange-Diagnostics: 1; DM2PR02MB1387; 4:J6Iaz2w5/xBC8Uw/UgCh4XfCqAQDijiw4w2UI5cRtgkWO+Ki5kIn4WNvGtm8Tw1GgmrS9aStMTASQpywiNaUIh1KCVSnZeKB4ZJCJxy57P2HmhGEGGjsQSY5Li4kAh/uCRsKyfjilXubXxBJvg8GsGNZvpcjguXSfZYtJEhaCJm/WcK9MipEe71XSER2RFLcuf05V/BrKeaiP85Fg9LdBtQuc/nYfW++0R/C0BGOoNbRQenl8aqsqFDBuld/ehnK0THc3ALPvUDw6WkgSNp/eRfnIfRiwqZMm4oSJFpD5vGIxofAysu9RjlPGdfXewNUdo1zW4NM4nOjg6kuXLqIZuskva8KxXVx36E0DHg4ouVM7fQ0r64CgoWrkgPQBqKHO84deLK9Je/Ti6RZzBpxBnCIKCit47wIxRnrQo80YxTJjAEXHAarF1iBdneHiG+UJXebJbUVE2+lDDXfIVf0wevT7tyPXcXQ83MqIymIFmjgK8Bz/e7zirL+DsDBTM6B69hlg/DH8zDMq1l7t8ijmN3lMji9t1KI/O7TxhFMMsNT6/6ktqCQI+fB9QYpoRgrBoxvAuLBK+hkEcycxonAoKMvU2SUn7mrVHyKo4sjN9Z8eQl7hwc8zpqHSdKBj+o111Ydwy0o13RRrL/TwwCD6DBI5l9KBs3mOUVhlwBv9Q/wtafXFI64uujyVik9/t2avQWpcUM94lds/v16THUySimeH1XIKeMNjxwRrRqMKts= X-Forefront-PRVS: 0203C93D51 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; DM2PR02MB1387; 23:sos8d9wVN8q2Lw8j+B2WztPzapKdJbJxHm66RLTZP?= =?us-ascii?Q?vMz2vHzCXLis42T8o0MJzt/HFk+o542ZILw4IO3d5W+s3mv4UPIbN0fEdlPV?= =?us-ascii?Q?zzWASbiBDMGVtsuDD3phUBCc5tdmYhNs25vzFfKiLGwSizEDVvIyZEucRxaN?= =?us-ascii?Q?svugOuVeh9h9ib9quy07PRWMp+WcOUHMPNDuS4uP5dg0NDaKhQz5+fXfzfkH?= =?us-ascii?Q?7CuArNSoV9HlybiHF8MIcj4pAbhROlxfLPufbCr2KIX8mXBsKFgJj0rIBb5M?= =?us-ascii?Q?5GsJQX9xI3a8+n7AsJWGRVIbrcMTXetII3i/Ua75XMHLctWabCbBq0FAuD1B?= =?us-ascii?Q?gJNkShD4Rppq278RBkAjWZ5SVReRkYrNxozxL/gyVzh7AXxoOB12GrVfu9ET?= =?us-ascii?Q?4VNx/SCj3pZjm8WYZjKAJeX6TJp4UaiJBhNsjL+2NWr4s5zHBmi+dmXb/kQx?= =?us-ascii?Q?rjcGk9P4LERM1dPujT6Kbo3fKVNXpT2VULUZc8kW3zwol4rHROhoYpJD8TGx?= =?us-ascii?Q?czbjSg4D6eWSjfUYY9/FASKMQbcQFAC3mTChknJzHggw4ZfgyLJqpz9HoGPy?= =?us-ascii?Q?TU4vsIKXhu0CC8ZtUOX4QccPHuEQyljUDuDEF/Yfenykte8eVjTxJnMh2/1h?= =?us-ascii?Q?Hcq9KB8qIcYc4tnvlgEKRQl0Zi4dYl/hQV1mJqMSdDmqAaXrcVuUhbxU2eO6?= =?us-ascii?Q?E0YLv71X+fGvmvE6iFrOp37vk8BYTcQgiSGoQTzoWAc23rFs+krotyQd18o2?= =?us-ascii?Q?Bt3nyQYu925AmSRrJ+/5+OUCbYJ+dyQyadMZxRe8d33NBzXis2VIgwjJ3Jmw?= =?us-ascii?Q?iCWCABxh7L5xeghsVNJW+Q/1K4F8AJaebab4LMfE2YpjFcoU8agCVgiDce8W?= =?us-ascii?Q?rw/vYNyevackBwVLTMotYJcBLTtr+Dyq5/tfWPy2O8T2QBSIv00I7PzHSie9?= =?us-ascii?Q?hkp96girDVcQly52rp3xn9L9EE3iV7knXfM73DuIN8ggNnB4QZwmXwJZyJj5?= =?us-ascii?Q?oGSNXpOwX8XPRgaX6UQofeGunYtyH3ylMQ+7TyrL9MJkDzDflVpd2U5uO4fU?= =?us-ascii?Q?4DwV82B5Zm08DO31YkbmNFVoJ0hoY3CcNhVyrjzsmLy/GK+07PmELwvDQxSP?= =?us-ascii?Q?6MgzvSD8fxyIyzZOp9DgaeQOCiW73bM8mrxrENiPZo8MzSEcVFYXMCiHKFsW?= =?us-ascii?Q?adQHszomycpVsPuKVd4uHiv476XuUApz/Ndk0MkpEdSdQKjJed2Nebhdg=3D?= =?us-ascii?Q?=3D?= X-Microsoft-Exchange-Diagnostics: 1; DM2PR02MB1387; 6:yw2+u4msCL6feZBHl3+3cCV6l9sPkgVcueW1B9zNMWTEBxq/IPRNQFG5+XvJH2gUhjsJBdGLsCJ5Ya0dNfvj6GI1DzODWzQ4PJAHNlm9cQmq9UW+C0n4+PjVUPQt7z07AXueQZ08WeH1JXYhM0VgQN37H6whj7/NbYFHwy0udb/VeToeCvbT6g22qc4I+H8igi6kM0vv1xDvIAabslHeIv0f7PYZiq2+uYBphp9ea94MSrq3USwj/49r/llz1X4kWk4K3x+qdH07ICdajhX50wK03GQokExl5KvFOEzTq1exs9Jy/tpCGkollB2RZKf138FqnLcy8WovRwzoxYhPELud8Mk1zeEod0HLf1p1JGJTBXONv0MQ09oSrhstqFasVKK1yeeSbXCwaoeF89Pg/BajIYjm6l0fT8FQCKXOuChMLV3LU1UrELR03hZJAc8h; 5:uN91arFrXL3cw1RSr74D0Sb+p/dyWXt8SSbtHBWFyS7S6ZUyt0Ty6ITi5QT+6m0cSKTriFqer85EjfrU01r0HqlhEQyYfKE6MLdB3JqsaDwka+7La3T6UhPvbLpP78Isn+kzzfoJl5Ql7GUZDHvwXQ==; 24:ntcaEmLbgUTXSKa52A4orw4hKHuXmFoSEzsESdbHhTE9bCmIBsww3cAJS7Pvxrb0SBtnQFVqc4aP0Q1GGrgy/mStmhqYJ7JxPNW3a382keM= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; DM2PR02MB1387; 7:jd1Ev6zOWki/Q25unVf8jGxESUkvbJ5zIZAeGGE7F8DeEep9WNIQsUGC3ZEwb0NGV1iFzIolHpIuTcU6Cy5u4HcIjGEKK+cj5IRHrsqI1dXAhHwBsLsZr4z+HLwIGf51i2vByOnG+LY6I2Q1YAz6nD+dp61fkLvbi/LwnMRvQVR7AzdT0ilhzgo+V5zjgV68WE8RHz4NiOw2OBPsTn8ueu7jHrioOd5B+jjrtWoWScX4H5gtoV4zzayi8KfJX8Vq72PGoK3nuPtpaCu4MbYLqtstLbfsTjqEcPN/3Av/Ia8L/Z4HidK2O62NcBykBhKoLxfJ4WsBC00wmsOs2hVDsdoTn/MjAlIpmafYbEO7ExdrC7AkHf0HkAAEyxKPadLYjG97DeTToZRBscTP7QF5H2Bxms2aLc7ItWnznlOTIEYblqgK05Dtvmd2weHzr2+j3IjiscFql6lFJf87KjYUEA== X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Jan 2017 10:38:24.1515 (UTC) 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: DM2PR02MB1387 Cc: afleming@gmail.com, michals@xilinx.com, Siva Durga Prasad Paladugu Subject: [U-Boot] [UBOOT v2 03/15] mmc: sdhci: Add SD3.0 support X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.15 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" Add support for all UHS modes of SD3.0. This patch defines the routines to switch volatge, setting uhs modes and execute tuning as these are needed for SD3.0 support Signed-off-by: Siva Durga Prasad Paladugu --- Changes from v1: - Split the patch with only sdhci changes as per comment --- drivers/mmc/sdhci.c | 157 +++++++++++++++++++++++++++++++++++++++++++++++++++- include/sdhci.h | 8 +++ 2 files changed, 163 insertions(+), 2 deletions(-) diff --git a/drivers/mmc/sdhci.c b/drivers/mmc/sdhci.c index 884b6a6..bba2c30 100644 --- a/drivers/mmc/sdhci.c +++ b/drivers/mmc/sdhci.c @@ -13,6 +13,7 @@ #include #include #include +#include #if defined(CONFIG_FIXED_SDHCI_ALIGNED_BUFFER) void *aligned_buffer = (void *)CONFIG_FIXED_SDHCI_ALIGNED_BUFFER; @@ -155,7 +156,8 @@ static int sdhci_send_command(struct mmc *mmc, struct mmc_cmd *cmd, /* We shouldn't wait for data inihibit for stop commands, even though they might use busy signaling */ - if (cmd->cmdidx == MMC_CMD_STOP_TRANSMISSION) + if ((cmd->cmdidx == MMC_CMD_STOP_TRANSMISSION) || + (cmd->cmdidx == MMC_CMD_SEND_TUNING_BLOCK)) mask &= ~SDHCI_DATA_INHIBIT; while (sdhci_readl(host, SDHCI_PRESENT_STATE) & mask) { @@ -175,6 +177,11 @@ static int sdhci_send_command(struct mmc *mmc, struct mmc_cmd *cmd, } mask = SDHCI_INT_RESPONSE; + + /* only buffer read ready interrupt whil tuning */ + if (cmd->cmdidx == MMC_CMD_SEND_TUNING_BLOCK) + mask = SDHCI_INT_DATA_AVAIL; + if (!(cmd->resp_type & MMC_RSP_PRESENT)) flags = SDHCI_CMD_RESP_NONE; else if (cmd->resp_type & MMC_RSP_136) @@ -190,7 +197,7 @@ static int sdhci_send_command(struct mmc *mmc, struct mmc_cmd *cmd, flags |= SDHCI_CMD_CRC; if (cmd->resp_type & MMC_RSP_OPCODE) flags |= SDHCI_CMD_INDEX; - if (data) + if (data || (cmd->cmdidx == MMC_CMD_SEND_TUNING_BLOCK)) flags |= SDHCI_CMD_DATA; /* Set Transfer mode regarding to data flag */ @@ -291,6 +298,80 @@ static int sdhci_send_command(struct mmc *mmc, struct mmc_cmd *cmd, else return -ECOMM; } +#ifdef CONFIG_DM_MMC_OPS +static int sdhci_execute_tuning(struct udevice *dev, u8 opcode) +{ + struct mmc *mmc = mmc_get_mmc_dev(dev); +#else +static int sdhci_execute_tuning(struct mmc *mmc, u8 opcode) +{ +#endif + struct mmc_cmd cmd; + struct mmc_data data; + u32 ctrl; + u8 tuning_loop_counter = 40; + struct sdhci_host *host = mmc->priv; + + debug("%s\n", __func__); + + ctrl = sdhci_readw(host, SDHCI_HOST_CTRL2); + ctrl |= SDHCI_CTRL_EXEC_TUNING; + sdhci_writew(host, ctrl, SDHCI_HOST_CTRL2); + + sdhci_writel(host, SDHCI_INT_DATA_AVAIL, SDHCI_INT_ENABLE); + sdhci_writel(host, SDHCI_INT_DATA_AVAIL, SDHCI_SIGNAL_ENABLE); + + do { + cmd.cmdidx = opcode; + cmd.resp_type = MMC_RSP_R1; + cmd.cmdarg = 0; + + data.blocksize = 64; + data.blocks = 1; + data.flags = MMC_DATA_READ; + + if (tuning_loop_counter == 0) + break; + + tuning_loop_counter--; + + if (cmd.cmdidx == MMC_CMD_SEND_TUNING_BLOCK_HS200 && + mmc->bus_width == 8) { + data.blocksize = 128; + } + + sdhci_writew(host, SDHCI_MAKE_BLKSZ(SDHCI_DEFAULT_BOUNDARY_ARG, + data.blocksize), + SDHCI_BLOCK_SIZE); + sdhci_writew(host, data.blocks, SDHCI_BLOCK_COUNT); + sdhci_writew(host, SDHCI_TRNS_READ, SDHCI_TRANSFER_MODE); + + sdhci_send_command(dev, &cmd, &data); + ctrl = sdhci_readw(host, SDHCI_HOST_CTRL2); + + if (cmd.cmdidx == MMC_CMD_SEND_TUNING_BLOCK) + udelay(1); + + } while (ctrl & SDHCI_CTRL_EXEC_TUNING); + + if (tuning_loop_counter < 0) { + ctrl &= ~SDHCI_CTRL_TUNED_CLK; + sdhci_writel(host, ctrl, SDHCI_HOST_CTRL2); + } + + if (!(ctrl & SDHCI_CTRL_TUNED_CLK)) { + debug("%s:Tuning failed\n", __func__); + return -1; + } + + /* Enable only interrupts served by the SD controller */ + sdhci_writel(host, SDHCI_INT_DATA_MASK | SDHCI_INT_CMD_MASK, + SDHCI_INT_ENABLE); + /* Mask all sdhci interrupt sources */ + sdhci_writel(host, 0x0, SDHCI_SIGNAL_ENABLE); + + return 0; +} static int sdhci_set_clock(struct mmc *mmc, unsigned int clock) { @@ -384,6 +465,72 @@ static int sdhci_set_clock(struct mmc *mmc, unsigned int clock) return 0; } +#ifdef CONFIG_DM_MMC_OPS +static int sdhci_set_voltage(struct udevice *dev) +{ + struct mmc *mmc = mmc_get_mmc_dev(dev); +#else +static int sdhci_set_voltage(struct mmc *mmc) +{ +#endif + struct sdhci_host *host = mmc->priv; + u32 reg; + int err; + + debug("%s\n", __func__); + + reg = (unsigned long)host->ioaddr + SDHCI_PRESENT_STATE; + /* Wait max 20ms for the bits to clear*/ + err = wait_for_bit(__func__, (const u32 *)(uintptr_t)reg, + (SDHCI_CMD_INHIBIT | SDHCI_DATA_INHIBIT), + false, 20, false); + if (err < 0) + return err; + + reg = sdhci_readw(host, SDHCI_CLOCK_CONTROL); + reg &= ~(SDHCI_CLOCK_CARD_EN | SDHCI_CLOCK_INT_EN); + sdhci_writew(host, reg, SDHCI_CLOCK_CONTROL); + + /* keep clock gated for 5 msec as per spec */ + udelay(5000); + + reg = sdhci_readw(host, SDHCI_HOST_CTRL2); + reg |= SDHCI_18V_SIGNAL; + sdhci_writew(host, reg, SDHCI_HOST_CTRL2); + + sdhci_set_clock(mmc, mmc->cfg->f_min); + + reg = (unsigned long)host->ioaddr + SDHCI_PRESENT_STATE; + /* Wait max 20ms for bits to be clear */ + err = wait_for_bit(__func__, (const u32 *)(uintptr_t)reg, + (SDHCI_CMD_BUSY | SDHCI_DATA_BUSY), + true, 20, false); + if (err < 0) + return err; + + return 0; +} + +#ifdef CONFIG_DM_MMC_OPS +static int sdhci_set_uhs(struct udevice *dev) +{ + struct mmc *mmc = mmc_get_mmc_dev(dev); +#else +static int sdhci_set_uhs(struct mmc *mmc) +{ +#endif + struct sdhci_host *host = mmc->priv; + u32 reg; + + debug("%s\n", __func__); + reg = sdhci_readw(host, SDHCI_HOST_CTRL2); + reg &= ~SDHCI_CTRL2_MODE_MASK; + reg |= mmc->uhsmode; + sdhci_writew(host, reg, SDHCI_HOST_CTRL2); + + return 0; +} + static void sdhci_set_power(struct sdhci_host *host, unsigned short power) { u8 pwr = 0; @@ -505,12 +652,18 @@ int sdhci_probe(struct udevice *dev) const struct dm_mmc_ops sdhci_ops = { .send_cmd = sdhci_send_command, .set_ios = sdhci_set_ios, + .set_voltage = sdhci_set_voltage, + .set_uhs = sdhci_set_uhs, + .execute_tuning = sdhci_execute_tuning, }; #else static const struct mmc_ops sdhci_ops = { .send_cmd = sdhci_send_command, .set_ios = sdhci_set_ios, .init = sdhci_init, + .set_voltage = sdhci_set_voltage, + .set_uhs = sdhci_set_uhs, + .execute_tuning = sdhci_execute_tuning, }; #endif diff --git a/include/sdhci.h b/include/sdhci.h index 685bcf2..fc0708c 100644 --- a/include/sdhci.h +++ b/include/sdhci.h @@ -64,6 +64,8 @@ #define SDHCI_CARD_STATE_STABLE BIT(17) #define SDHCI_CARD_DETECT_PIN_LEVEL BIT(18) #define SDHCI_WRITE_PROTECT BIT(19) +#define SDHCI_DATA_BUSY 0xF00000 +#define SDHCI_CMD_BUSY 0x1000000 #define SDHCI_HOST_CONTROL 0x28 #define SDHCI_CTRL_LED BIT(0) @@ -146,6 +148,12 @@ #define SDHCI_ACMD12_ERR 0x3C /* 3E-3F reserved */ +#define SDHCI_HOST_CTRL2 0x3E +#define SDHCI_CTRL2_MODE_MASK 0x7 + +#define SDHCI_18V_SIGNAL 0x8 +#define SDHCI_CTRL_EXEC_TUNING 0x0040 +#define SDHCI_CTRL_TUNED_CLK 0x80 #define SDHCI_CAPABILITIES 0x40 #define SDHCI_TIMEOUT_CLK_MASK 0x0000003F