From patchwork Thu Sep 17 05:50:54 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: yangbo lu X-Patchwork-Id: 7202521 Return-Path: X-Original-To: patchwork-linux-mmc@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id AB4CBBEEC1 for ; Thu, 17 Sep 2015 06:12:15 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 98846208C9 for ; Thu, 17 Sep 2015 06:12:14 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 6DBFD208C5 for ; Thu, 17 Sep 2015 06:12:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753310AbbIQGMM (ORCPT ); Thu, 17 Sep 2015 02:12:12 -0400 Received: from mail-bn1bon0147.outbound.protection.outlook.com ([157.56.111.147]:59928 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753077AbbIQGML (ORCPT ); Thu, 17 Sep 2015 02:12:11 -0400 Received: from BLUPR03CA012.namprd03.prod.outlook.com (10.255.124.29) by DM2PR0301MB1198.namprd03.prod.outlook.com (10.160.217.148) with Microsoft SMTP Server (TLS) id 15.1.274.16; Thu, 17 Sep 2015 05:57:43 +0000 Received: from BL2FFO11FD007.protection.gbl (10.255.124.4) by BLUPR03CA012.outlook.office365.com (10.255.124.29) with Microsoft SMTP Server (TLS) id 15.1.274.16 via Frontend Transport; Thu, 17 Sep 2015 05:57:43 +0000 Authentication-Results: spf=fail (sender IP is 192.88.158.2) smtp.mailfrom=freescale.com; freescale.mail.onmicrosoft.com; dkim=none (message not signed) header.d=none; freescale.mail.onmicrosoft.com; dmarc=none action=none header.from=freescale.com; Received-SPF: Fail (protection.outlook.com: domain of freescale.com does not designate 192.88.158.2 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.158.2; helo=az84smr01.freescale.net; Received: from az84smr01.freescale.net (192.88.158.2) by BL2FFO11FD007.mail.protection.outlook.com (10.173.161.3) with Microsoft SMTP Server (TLS) id 15.1.262.18 via Frontend Transport; Thu, 17 Sep 2015 05:57:43 +0000 Received: from titan.ap.freescale.net ([10.192.208.233]) by az84smr01.freescale.net (8.14.3/8.14.0) with ESMTP id t8H5ux5v032206; Wed, 16 Sep 2015 22:57:41 -0700 From: Yangbo Lu To: , CC: Yangbo Lu Subject: [v2, 8/8] mmc: sdhci-of-esdhc: add SDR50 mode support for SD/MMC Legacy Adapter Card Date: Thu, 17 Sep 2015 13:50:54 +0800 Message-ID: <1442469054-23644-8-git-send-email-yangbo.lu@freescale.com> X-Mailer: git-send-email 2.1.0.27.g96db324 In-Reply-To: <1442469054-23644-1-git-send-email-yangbo.lu@freescale.com> References: <1442469054-23644-1-git-send-email-yangbo.lu@freescale.com> X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1; BL2FFO11FD007; 1:tB2BcRlJYmZuF4QOX7Gw3GKWJ4uGJKMYLhz73FMeg2myjNToMmk3ujwAVLbmZF7Zx5WhsFFEQW7baHp6SZJZFFtv6Tu62FFl0832eeW4ebr2mmfF4QKnlidkbWynDjHZAtHoQgahKm1mukFM6ycEGkMK6QIM9Wbgtjc+IE2C+9kQgEZ+0/RDZw820WYSFmzvdmjZEQyeXhH9OiqZlOyX5pWUnwiNv+xwxYrv2Oq3Pw1T4XEig0qhqrGIJKTzzSkZqSLsogxdKmOi/3PXwUgjBuBGhKn1v7qZZdvf5JJS009TADFAsNniy1WjdYq1mHON/z3xWZXhC0RJsOJUu9vkGTK8Ik/Ud8rybR3+Y+3a4cWTVfnAY9/V3Mf7ABJFhWfSVVs1Qadh/HkkYsw6/5/pBg== X-Forefront-Antispam-Report: CIP:192.88.158.2; CTRY:US; IPV:NLI; EFV:NLI; SFV:NSPM; SFS:(10019020)(6009001)(2980300002)(1110001)(1109001)(339900001)(199003)(189002)(189998001)(5001770100001)(5001960100002)(107886002)(97736004)(47776003)(64706001)(5001860100001)(48376002)(81156007)(5001830100001)(50466002)(4001540100001)(5007970100001)(11100500001)(87936001)(68736005)(77096005)(77156002)(62966003)(85426001)(46102003)(36756003)(105606002)(33646002)(229853001)(92566002)(106466001)(2950100001)(50226001)(6806004)(19580395003)(5003940100001)(19580405001)(86362001)(575784001)(69596002)(104016003)(230783001)(50986999)(76176999)(4001430100001); DIR:OUT; SFP:1102; SCL:1; SRVR:DM2PR0301MB1198; H:az84smr01.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; A:1; MX:1; LANG:en; MIME-Version: 1.0 X-Microsoft-Exchange-Diagnostics: 1; DM2PR0301MB1198; 2:LdOO7MVIFUSVGyT1gf40f0iUiaVAfjm20UMJDAPWfoi/lsLNQyACuPof/ez3J52LQpZywWRf+Wx9e5B9KrnyO1x5K+jrR1KyPahxUDqnPdl7EJa0EeeuLsVKBoRsGZ+lv6QGTnxobNWdBl+bcLZOR0o+2otJIqI2RMKJwJMYzqI=; 3:ziNZzhw4Ka+tZklxeGVDumXHDnkRAOJzG/FgCV22N67lYeXKkTLZVzkBcNaQ92bXdlIeE4pNjaOiQ+sFnIl/UPhfcPq5VBaaVo5G4/w9F4LbzoVm781Tq5ornVPrBEHhjYadQfKuNu1LGvf5d7aeSPtzMPxdCYeQEKfHVVLKyswRAq2ENLtXyGyJbGVszOMlb5XJcCnHbxiXw9bBPha6W6dyHR7lei5sdrdiB7lze/k=; 25:Tg/iubkXyJXko55Aeie+vaWHDgxLAFIaw3yGg0BKO8SyZaC7AJv6wBdkRREersFI8j34nxFuT1LsKpHC8IxCuJR8AZzKQk+eygXRt40wv75ln8Hzol+cDe+rLOx90O64lYCeFLXE9fAzzwf3+Y5EKptcOg4RxyKMdUdei8z1E76SWqB5iZj1Gav6aL3rbogofFENsRjL0+lmPOlcb3n6P091Z3to5NVT1EfQobWTiPTIwRenulltOsS7LmAI1cY61Ri4wB1IqCIhCTylNpNAOQ== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:DM2PR0301MB1198; X-Microsoft-Exchange-Diagnostics: 1; DM2PR0301MB1198; 20:dchYMD/OhwXJJXZ2JXQylatVembKHb/rPDvoDp1cx9DivpCV0Sd1EyYE23IG4NFHg+rkjv2d9ZSZaQDA2h/VTxsdLGU1Mqx155szPFYn9N2LZrokCpimSjO85gvCvAMHkqH+SOaaedjqEbQZ6nG+bOC8DoG2Tef9PyHk7Ey7UJ8rfb6XmupG7L6t9/9ErB5nM3Jpn62fyS4fpLLNCpxvGjmBFxAbafJRVRBMvjd7DcedscXG42j8KUWBvB0sbUiLzWQi1T9NFkI3BbXAzZ6vf+S839Z6FM3JGhHqyL1rrdbtIOmUmH+3q8aN5+tKKxWvpruZNtwxtQrF22dQZKOlo40tNbuCg4jA53tViZtZ/SY=; 4:jYd0ugI4a9fLr9vSxM0sMvv2aV5agWE273gtAzaXEFNxeXX3IDXhOLGS/OEpJgOcz1zBC+ptDo/DKnslqYzLHLDw6SUdXVnmrxaQZz0Umoky57DH5EsNiLvYRhblYlB+VhkgJ3akyzYnRiPnmRqxhKy14gIDC1DGvVDmo1/iuxrgPdbQA+QBgYIOL2lr0oEMM4SkdMvlRysaYk5oKJQ2Wnh35HyQeF4TvGjTa/PCr5/1Ix2mk0sGtA6/D+UIWPDoereN0yXsfLP92rnn7r6wOQoY3s562+j1Rz7ghfpMzmpB/zmI4bJFJGOiIh5cfJy9mKB/CzSts3DwE9QbObUSqw== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(8121501046)(520078)(5005006)(3002001); SRVR:DM2PR0301MB1198; BCL:0; PCL:0; RULEID:; SRVR:DM2PR0301MB1198; X-Forefront-PRVS: 07025866F6 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; DM2PR0301MB1198; 23:2nmZ9PflxfoWFXqsoFHekc2XcKxD0ZpHwH6Zqlp?= =?us-ascii?Q?bSjA5eKnIk0dYywGeP3dh5UDIFt/y4EfaW+vkUd7S2H7DjSDYanj62G3+j9Z?= =?us-ascii?Q?YaK+urHz1iS3PkSYmBoCzX0NQk7V5d1OPtrylTXCVptr8dCr+8XGOk7oj4lN?= =?us-ascii?Q?3VVzB9ko+FpoY+gYqUla2VjgmiBKHUoeZFTC2Q2cfKRn7MZzHb9UGfB0Ozp9?= =?us-ascii?Q?guGA9PhkIA4Wmk63uuAVPmGuuhNJx0l/AWvPiYlxxFhzngs1DR2f8JwA+byI?= =?us-ascii?Q?pE35cAjNtMNlGlFUFrWMUbhc5ZWh5+ezRD8CyhQbPqDf1gptJGjwHaPuR7hy?= =?us-ascii?Q?DF/kXi/IuVRjac8mv9xyjoF6TQ9ngBJKECych9dDD/S2G1jgQaycmJwEDfIg?= =?us-ascii?Q?n735lgy9qu419e8IRWPFoTYeOTN4IgURfeajQw5MIlb49+9J+pUn9Zk+mAzT?= =?us-ascii?Q?7MoS+jgZ9qR8POlTpy/UlkCDZcp3U5XxMt+bbgPXLX8Otl5Bk3XBOzkby18B?= =?us-ascii?Q?55e3e5U0Gq/aUzmLZRCG+FXsOZEb+Rkta7nn3zkWVvAyRNEoivVPnQ9/DEmV?= =?us-ascii?Q?Mvi4woPZSvm2sil7dm0NgGim4F5NbPFh2P5wvq5cWjdfmYVIwHIGUJkhCh/K?= =?us-ascii?Q?fqCNMas00TYsitfi2dt8QrmBFjeDSxEFnz+UKRP6HbiIc+XhG678Fv1nXPi2?= =?us-ascii?Q?Swv5eQYsbFzpNRr96FjjSMIsZr1gyJ5tebtjSpN8PavTOpdzSwxdYwdbCkoo?= =?us-ascii?Q?zAtJH0tVkmTLnsU5WccllYWVWGNHckbxOI44tgxGpYoBoXlp5vKCgZ2YGKx/?= =?us-ascii?Q?d/WbF4Zb0VctaN6xvVayiJWY09Ij6n3jjZVymebRIHiIqwsbiqbprPAM1a78?= =?us-ascii?Q?iXmOHq41vaaRxOMjCHs/6n5hbYet1y2dENanHu/z3eHzxliJ5P5ZTpSJ9VCx?= =?us-ascii?Q?ULnHX4yV/pD+2zS4drJ2XmyV2RLElJSHA307yAX8RNBALMskVLuMkaIPhe1W?= =?us-ascii?Q?Oh4IfKIKubk509nonPQSA80svbi3v+Frzgb0vlR/yG3j3up0sZRKEd/VHhO0?= =?us-ascii?Q?0ygAC5y3QiMvoc+/46oV4125CHhBSh7EI5rZXn3Zp/QjXfcCPqmCdLSebH+u?= =?us-ascii?Q?Xbl2p6OKQtO42RXHN7HRNzShg89iQaWENoeBZozU69Vna/AZzDRrKUBSts/z?= =?us-ascii?Q?dcl9ZWXKEkiJToq91TO83JBCKRimg8YY0DKWqZKCjaVS8pC1t7t2oE8RgIW4?= =?us-ascii?Q?2egDRaVo3vCcZ4NM53eGFO321kVLpcC9SWq5kz8B314ao+L871e7Pmwx2DyP?= =?us-ascii?Q?acLDgAYbWdtvYXJL1Js6Em0k=3D?= X-Microsoft-Exchange-Diagnostics: 1; DM2PR0301MB1198; 5:7z9SPkWoZC/oMZ4qrvpsUzpPDChQD3bWVpfjhdT43F3YWbNZbz0BBNzZG+JXUopiiA6UZoP6b0yHX/Zj68m1Y7tvZ9ra4SY19suhDZQnaqkCpnLY2tTC1RUwzC+1Cp6VB1DjhEiNUMAQdjIuTeb8Xw==; 24:WQ4FFc4exE2yhlABFEGdupYhAah4V+kFSSp0oUl5JzZ08/IGf5FgcvRZD4pKa52HSsMIQ2u5/8PV8Ok/oyjXDGDivp1yQljRIoE0ufr8vfM=; 20:aSgJiK20FWQDB5pTG36e0DFK9IqYv1k4B8AzOnU2JJsYYivROwhFRc8YLtg5MgijtpSx+xNyNSDMDXsUNDWwBA== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Sep 2015 05:57:43.1094 (UTC) X-MS-Exchange-CrossTenant-Id: 710a03f5-10f6-4d38-9ff4-a80b81da590d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=710a03f5-10f6-4d38-9ff4-a80b81da590d; Ip=[192.88.158.2]; Helo=[az84smr01.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM2PR0301MB1198 Sender: linux-mmc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-mmc@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The eSDHC is not compatible with SD spec well, so we need to use eSDHC-special code to switch to SDR50 mode. 1. IO signal voltage switching, eSDHC uses SDHC_VS to switch io voltage and it's needed to configure a global utilities register SCFG_SDHCIOVSELCR(if it has) and SDHC_VS signal. 2. Before executing tuning procedure, eSDHC should set its own tuning block. static const struct sdhci_ops sdhci_esdhc_ops = { ... .set_tuning_block = esdhc_set_tuning_block, .signal_voltage_switch = esdhc_signal_voltage_switch, }; Signed-off-by: Yangbo Lu --- drivers/mmc/host/sdhci-esdhc.h | 2 ++ drivers/mmc/host/sdhci-of-esdhc.c | 62 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/drivers/mmc/host/sdhci-esdhc.h b/drivers/mmc/host/sdhci-esdhc.h index de9be18..a04b8bb 100644 --- a/drivers/mmc/host/sdhci-esdhc.h +++ b/drivers/mmc/host/sdhci-esdhc.h @@ -26,6 +26,8 @@ #define ESDHCI_PRESENT_STATE 0x24 #define ESDHC_CLK_STABLE 0x00000008 +#define ESDHC_DLSL 0x0f000000 +#define ESDHC_CLSL 0x00800000 #define ESDHC_PROCTL 0x28 #define ESDHC_VOLT_SEL 0x00000400 diff --git a/drivers/mmc/host/sdhci-of-esdhc.c b/drivers/mmc/host/sdhci-of-esdhc.c index 5aabadf..c887b8e 100644 --- a/drivers/mmc/host/sdhci-of-esdhc.c +++ b/drivers/mmc/host/sdhci-of-esdhc.c @@ -19,6 +19,7 @@ #include #include #include +#include #include "sdhci-pltfm.h" #include "sdhci-esdhc.h" @@ -39,6 +40,17 @@ static u32 adapter_type; static u32 esdhc_readl(struct sdhci_host *host, int reg) { u32 ret; + u32 clsl; + u32 dlsl; + + if (reg == SDHCI_PRESENT_STATE) { + ret = in_be32(host->ioaddr + reg); + clsl = ret & ESDHC_CLSL; + dlsl = ret & ESDHC_DLSL; + ret &= ~((ESDHC_CLSL << 1) | (ESDHC_DLSL >> 4)); + ret |= ((clsl << 1) | (dlsl >> 4)); + return ret; + } if (reg == SDHCI_CAPABILITIES_1) { ret = in_be32(host->ioaddr + ESDHC_CAPABILITIES_1); @@ -48,6 +60,15 @@ static u32 esdhc_readl(struct sdhci_host *host, int reg) host->mmc->caps2 |= MMC_CAP2_HS200; ret &= ~ESDHC_MODE_MASK; break; + case ESDHC_ADAPTER_TYPE_2: + if (ret & ESDHC_MODE_MASK) { + ret &= ~ESDHC_MODE_MASK; + /* If it exists UHS-I support, enable SDR50 */ + host->mmc->caps |= (MMC_CAP_UHS_SDR50 | + MMC_CAP_UHS_SDR25 | + MMC_CAP_UHS_SDR12); + } + break; default: ret &= ~ESDHC_MODE_MASK; } @@ -256,11 +277,14 @@ static void esdhc_of_set_clock(struct sdhci_host *host, unsigned int clock) int pre_div = 1; int div = 1; u32 temp; + int timeout; host->mmc->actual_clock = 0; - if (clock == 0) + if (clock == 0) { + esdhc_clock_control(host, false); return; + } /* Workaround to start pre_div at 2 for VNN < VENDOR_V_23 */ temp = esdhc_readw(host, SDHCI_HOST_VERSION); @@ -298,6 +322,22 @@ static void esdhc_of_set_clock(struct sdhci_host *host, unsigned int clock) | (div << ESDHC_DIVIDER_SHIFT) | (pre_div << ESDHC_PREDIV_SHIFT)); sdhci_writel(host, temp, ESDHC_SYSTEM_CONTROL); + + /* Wait max 20 ms */ + timeout = 20; + while (!(sdhci_readl(host, ESDHCI_PRESENT_STATE) & ESDHC_CLK_STABLE)) { + if (timeout == 0) { + pr_err("%s: Internal clock never stabilised.\n", + mmc_hostname(host->mmc)); + return; + } + timeout--; + mdelay(1); + } + + temp |= ESDHC_CLOCK_CRDEN; + sdhci_writel(host, temp, ESDHC_SYSTEM_CONTROL); + mdelay(1); } @@ -351,9 +391,17 @@ void esdhc_set_tuning_block(struct sdhci_host *host) esdhc_clock_control(host, true); } +static const struct of_device_id scfg_device_ids[] = { + { .compatible = "fsl,t1040-scfg", }, + {} +}; + void esdhc_signal_voltage_switch(struct sdhci_host *host, unsigned char signal_voltage) { + struct device_node *scfg_node; + void __iomem *scfg_base; + u32 scfg_sdhciovselcr; u32 value; value = sdhci_readl(host, ESDHC_PROCTL); @@ -364,6 +412,18 @@ void esdhc_signal_voltage_switch(struct sdhci_host *host, sdhci_writel(host, value, ESDHC_PROCTL); break; case MMC_SIGNAL_VOLTAGE_180: + scfg_node = of_find_matching_node(NULL, scfg_device_ids); + if (scfg_node) { + scfg_base = of_iomap(scfg_node, 0); + of_node_put(scfg_node); + if (scfg_base) { + scfg_sdhciovselcr = 0x408; + out_be32(scfg_base + scfg_sdhciovselcr, + 0x80000001); + iounmap(scfg_base); + } + } + value |= ESDHC_VOLT_SEL; sdhci_writel(host, value, ESDHC_PROCTL); break;