Received: by 2002:ac0:a5a6:0:0:0:0:0 with SMTP id m35-v6csp56074imm; Thu, 30 Aug 2018 08:11:47 -0700 (PDT) X-Google-Smtp-Source: ANB0VdYn5KQ5AekpmgnGSC9/J3PiIYsaoomVbHnbA+UwyyYb9N/ReqGMm9/UCvC5Clpf9igGHKB3 X-Received: by 2002:a62:3306:: with SMTP id z6-v6mr10823020pfz.85.1535641907018; Thu, 30 Aug 2018 08:11:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1535641906; cv=none; d=google.com; s=arc-20160816; b=jzMo16lRLFu7MQ95P7MV28vifi54K9lDwotqWM9Lhi70QBMVC/xaLkTFHY2yFwePIV /aPaf0/Pb1slBzG7Axp2nEa2vtmCC+R4z2MYSF+QqIOI42klRwi2pFPxM7SoyUlt1Yyx 4Q/PhnJUcD31OGj1EoU1GrKB23pdhf1iT3zF7qrNCY+MQ1IL7UijYqCQOYrtZCzDbiiU 9aVlvspmoO5kP0E+/EEASOV6hnNrnREOPLmKjFy54NJ7wqbcqSMdE8btrjltVmRvbxuk FnXuxjtCeWul55MH22FwI8eQj4qetsD9emY4SRJUl2cRTYCunv9gGvtiyjPtW03d6XAi czaw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:arc-authentication-results; bh=ZGLyUsG01z8auyRVbJ5uGgDySwF/cKe3D0SRQsK+gtU=; b=vlO8T5n6JwhzPauFfwIgIXp+DHnMIvG+FLcFfQIjAsSKlmVAr8x7e5ErG6F/XIHoYF ow1eujR492c7eeDzG8Za7+GzeZ6Xez8oWRxBzbeXhyGkrbs/PhAGoIsHX/pUNtY4AlTK pnYa9XqZMK/A3sCblfR8wtauD9EOdLqtuF4OIaVkrRSV7r2AMa/Iw4fz7u2dfzN5d+CS y4hkf5XsfVw2RL0FfC82t+uqPHfqP2JJ/6giO0ApH92YDXEeu2xnMpcdVPgg4MxJ+0T6 NBzH4Ki6eOiRSItbWg4XsbKW0423rMOD0CVfibjp+mAk+hvl6UzBMeI/nLGccfWXGdn8 YDvA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=nvidia.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id k126-v6si6227261pgc.34.2018.08.30.08.11.31; Thu, 30 Aug 2018 08:11:46 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=nvidia.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729922AbeH3TKl (ORCPT + 99 others); Thu, 30 Aug 2018 15:10:41 -0400 Received: from hqemgate14.nvidia.com ([216.228.121.143]:13542 "EHLO hqemgate14.nvidia.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728709AbeH3TKk (ORCPT ); Thu, 30 Aug 2018 15:10:40 -0400 Received: from hqpgpgate102.nvidia.com (Not Verified[216.228.121.13]) by hqemgate14.nvidia.com (using TLS: TLSv1.2, DES-CBC3-SHA) id ; Thu, 30 Aug 2018 08:08:02 -0700 Received: from HQMAIL101.nvidia.com ([172.20.161.6]) by hqpgpgate102.nvidia.com (PGP Universal service); Thu, 30 Aug 2018 08:08:03 -0700 X-PGP-Universal: processed; by hqpgpgate102.nvidia.com on Thu, 30 Aug 2018 08:08:03 -0700 Received: from HQMAIL104.nvidia.com (172.18.146.11) by HQMAIL101.nvidia.com (172.20.187.10) with Microsoft SMTP Server (TLS) id 15.0.1395.4; Thu, 30 Aug 2018 15:08:03 +0000 Received: from hqnvemgw01.nvidia.com (172.20.150.20) by HQMAIL104.nvidia.com (172.18.146.11) with Microsoft SMTP Server (TLS) id 15.0.1395.4 via Frontend Transport; Thu, 30 Aug 2018 15:08:03 +0000 Received: from dhcp-10-21-25-168.Nvidia.com (Not Verified[10.21.25.201]) by hqnvemgw01.nvidia.com with Trustwave SEG (v7,5,8,10121) id ; Thu, 30 Aug 2018 08:08:03 -0700 From: Aapo Vienamo To: Rob Herring , Mark Rutland , Thierry Reding , Jonathan Hunter , Ulf Hansson , Adrian Hunter , Mikko Perttunen , Stefan Agner CC: , , , , Aapo Vienamo Subject: [PATCH v3 25/38] mmc: tegra: Disable card clock during tuning cmd on Tegra210 Date: Thu, 30 Aug 2018 18:06:26 +0300 Message-ID: <20180830150639.21048-26-avienamo@nvidia.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20180830150639.21048-1-avienamo@nvidia.com> References: <20180830150639.21048-1-avienamo@nvidia.com> MIME-Version: 1.0 Content-Type: text/plain Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Implement tegra210_sdhci_writew() to disable card clock and issue a reset when the tuning command is sent. This is done to prevent an intermittent hang with around 10 % failure rate during tuning. Add tegra186_sdhci_ops because this workaround is specific to Tegra210. Signed-off-by: Aapo Vienamo --- drivers/mmc/host/sdhci-tegra.c | 81 ++++++++++++++++++++++++---------- 1 file changed, 58 insertions(+), 23 deletions(-) diff --git a/drivers/mmc/host/sdhci-tegra.c b/drivers/mmc/host/sdhci-tegra.c index 0bdce437e752..aa1574b8d96c 100644 --- a/drivers/mmc/host/sdhci-tegra.c +++ b/drivers/mmc/host/sdhci-tegra.c @@ -177,6 +177,50 @@ static void tegra_sdhci_writel(struct sdhci_host *host, u32 val, int reg) } } +static bool tegra_sdhci_configure_card_clk(struct sdhci_host *host, bool enable) +{ + bool status; + u32 reg; + + reg = sdhci_readw(host, SDHCI_CLOCK_CONTROL); + status = !!(reg & SDHCI_CLOCK_CARD_EN); + + if (status == enable) + return status; + + if (enable) + reg |= SDHCI_CLOCK_CARD_EN; + else + reg &= ~SDHCI_CLOCK_CARD_EN; + + sdhci_writew(host, reg, SDHCI_CLOCK_CONTROL); + + return status; +} + +static void tegra210_sdhci_writew(struct sdhci_host *host, u16 val, int reg) +{ + bool is_tuning_cmd = 0; + bool clk_enabled; + u8 cmd; + + if (reg == SDHCI_COMMAND) { + cmd = SDHCI_GET_CMD(val); + is_tuning_cmd = cmd == MMC_SEND_TUNING_BLOCK || + cmd == MMC_SEND_TUNING_BLOCK_HS200; + } + + if (is_tuning_cmd) + clk_enabled = tegra_sdhci_configure_card_clk(host, 0); + + writew(val, host->ioaddr + reg); + + if (is_tuning_cmd) { + udelay(1); + tegra_sdhci_configure_card_clk(host, clk_enabled); + } +} + static unsigned int tegra_sdhci_get_ro(struct sdhci_host *host) { return mmc_gpio_get_ro(host->mmc); @@ -215,28 +259,6 @@ static bool tegra_sdhci_is_pad_and_regulator_valid(struct sdhci_host *host) return true; } -static bool tegra_sdhci_configure_card_clk(struct sdhci_host *host, bool enable) -{ - bool status; - u32 reg; - - reg = sdhci_readw(host, SDHCI_CLOCK_CONTROL); - status = !!(reg & SDHCI_CLOCK_CARD_EN); - - if (status == enable) - return status; - - if (enable) - reg |= SDHCI_CLOCK_CARD_EN; - else - reg &= ~SDHCI_CLOCK_CARD_EN; - - sdhci_writew(host, reg, SDHCI_CLOCK_CONTROL); - - return status; -} - - static void tegra_sdhci_set_tap(struct sdhci_host *host, unsigned int tap) { struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); @@ -834,6 +856,7 @@ static const struct sdhci_tegra_soc_data soc_data_tegra124 = { static const struct sdhci_ops tegra210_sdhci_ops = { .get_ro = tegra_sdhci_get_ro, .read_w = tegra_sdhci_readw, + .write_w = tegra210_sdhci_writew, .write_l = tegra_sdhci_writel, .set_clock = tegra_sdhci_set_clock, .set_bus_width = sdhci_set_bus_width, @@ -861,6 +884,18 @@ static const struct sdhci_tegra_soc_data soc_data_tegra210 = { NVQUIRK_DIS_CARD_CLK_CONFIG_TAP, }; +static const struct sdhci_ops tegra186_sdhci_ops = { + .get_ro = tegra_sdhci_get_ro, + .read_w = tegra_sdhci_readw, + .write_l = tegra_sdhci_writel, + .set_clock = tegra_sdhci_set_clock, + .set_bus_width = sdhci_set_bus_width, + .reset = tegra_sdhci_reset, + .set_uhs_signaling = tegra_sdhci_set_uhs_signaling, + .voltage_switch = tegra_sdhci_voltage_switch, + .get_max_clock = tegra_sdhci_get_max_clock, +}; + static const struct sdhci_pltfm_data sdhci_tegra186_pdata = { .quirks = SDHCI_QUIRK_BROKEN_TIMEOUT_VAL | SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK | @@ -877,7 +912,7 @@ static const struct sdhci_pltfm_data sdhci_tegra186_pdata = { * But it is not supported as of now. */ SDHCI_QUIRK2_BROKEN_64_BIT_DMA, - .ops = &tegra210_sdhci_ops, + .ops = &tegra186_sdhci_ops, }; static const struct sdhci_tegra_soc_data soc_data_tegra186 = { -- 2.18.0