Received: by 2002:ac0:a5a7:0:0:0:0:0 with SMTP id m36-v6csp284792imm; Fri, 10 Aug 2018 11:11:43 -0700 (PDT) X-Google-Smtp-Source: AA+uWPzNiKs9I8qR4mPhnhE4NqRytVHxGlVUnx3EjFwaHTQcdo5M5C6sGTSR23N7fBShhB1wJT8k X-Received: by 2002:a63:115e:: with SMTP id 30-v6mr7473093pgr.53.1533924703446; Fri, 10 Aug 2018 11:11:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1533924703; cv=none; d=google.com; s=arc-20160816; b=rJOOZprn1c22Yh3hbpQsly5fYcqjrxRmHp+e7V3uVTwaa1XHHlO1G/yRvHQPwqrV37 ZTCPLcxbqQ+WAEkgqAaKBS8Vv9U8WXLf3DhhgCmNuC+NzPY2ktlaXNL49tguT9envuZf vTb1HXrCiq2AAkLJbvoQYm5LykkzUTcN5w/GRluNHxMUU/YIDX4ajL8ua0iZdE9OOvmK A8i6TvSssZ1bvOBAGtfjqTqEkW+yGufc7B+rg07azrs+AIp8mz+jnGA+ts+GmhV3/xQe aLTXNC7T0+h4DMu+mTdPDUvZjIr0Ag513MvGYmugsNPijdHiSX9ik/2t7vZhANinI4mn mE0g== 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=mMZnBgj8R5gWYBk8AmCl3PWm2Lx7MsINSbUgziQptAU=; b=SH9mnQuM3xkqedmmzlEnFHKwxcnSR6l+PQ7jfHdLq0a2lyHZlD0slIs96MAVdTQOky 0LYIeDGS6fsNkIt5/L2KPiE2DsxUBaxUuAJO9pInqxj8wSlE8qYPyrsuBNsyk+zh2zMn eHu1RE6blMXUozEhqIXEsxM3Sm7QPsRJdW3lIJP/jEhjnG+Ru+RmNZvqlDyE2H9AqjDa 3qeI88Re/iSyEh4lVTBWAA+56x5SlQKDmh5/0ysGd3yjiFemUqmJsFbpKBF/LG2IDWpt XE5x0n+GDuamlHhweWf6HODPXxlKgDSi8M6CoJOFKAE8+suWaHGAHK9XWnc4pOEwSCcL vXdA== 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 f27-v6si10696575pfk.97.2018.08.10.11.11.28; Fri, 10 Aug 2018 11:11:43 -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 S1730403AbeHJUlC (ORCPT + 99 others); Fri, 10 Aug 2018 16:41:02 -0400 Received: from hqemgate15.nvidia.com ([216.228.121.64]:11402 "EHLO hqemgate15.nvidia.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728001AbeHJUlC (ORCPT ); Fri, 10 Aug 2018 16:41:02 -0400 Received: from hqpgpgate102.nvidia.com (Not Verified[216.228.121.13]) by hqemgate15.nvidia.com (using TLS: TLSv1, AES128-SHA) id ; Fri, 10 Aug 2018 11:09:51 -0700 Received: from HQMAIL108.nvidia.com ([172.20.161.6]) by hqpgpgate102.nvidia.com (PGP Universal service); Fri, 10 Aug 2018 11:10:00 -0700 X-PGP-Universal: processed; by hqpgpgate102.nvidia.com on Fri, 10 Aug 2018 11:10:00 -0700 Received: from HQMAIL103.nvidia.com (172.20.187.11) by HQMAIL108.nvidia.com (172.18.146.13) with Microsoft SMTP Server (TLS) id 15.0.1347.2; Fri, 10 Aug 2018 18:10:05 +0000 Received: from hqnvemgw02.nvidia.com (172.16.227.111) by HQMAIL103.nvidia.com (172.20.187.11) with Microsoft SMTP Server (TLS) id 15.0.1347.2 via Frontend Transport; Fri, 10 Aug 2018 18:10:05 +0000 Received: from dhcp-10-21-25-168.Nvidia.com (Not Verified[10.21.25.201]) by hqnvemgw02.nvidia.com with Trustwave SEG (v7,5,8,10121) id ; Fri, 10 Aug 2018 11:10:05 -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 v2 25/40] mmc: sdhci: Add a quirk to disable card clock during tuning Date: Fri, 10 Aug 2018 21:08:27 +0300 Message-ID: <1533924522-1037-26-git-send-email-avienamo@nvidia.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1533924522-1037-1-git-send-email-avienamo@nvidia.com> References: <1533924522-1037-1-git-send-email-avienamo@nvidia.com> X-NVConfidentiality: public 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 Add a quirk to disable card clock when the tuning command is sent. This has to be done to prevent the SDHCI controller from hanging on Tegra210. Without the quirk enabled there appears to be around 10% chance that the tuning sequence will fail and time out due to the controller locking up. Signed-off-by: Aapo Vienamo --- drivers/mmc/host/sdhci.c | 15 +++++++++++++++ drivers/mmc/host/sdhci.h | 2 ++ 2 files changed, 17 insertions(+) diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index 04dc443..166b16f 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c @@ -2175,6 +2175,7 @@ static void sdhci_send_tuning(struct sdhci_host *host, u32 opcode) struct mmc_request mrq = {}; unsigned long flags; u32 b = host->sdma_boundary; + u16 clk; spin_lock_irqsave(&host->lock, flags); @@ -2183,6 +2184,13 @@ static void sdhci_send_tuning(struct sdhci_host *host, u32 opcode) cmd.mrq = &mrq; mrq.cmd = &cmd; + + if (host->quirks2 & SDHCI_QUIRK2_TUNE_DIS_CARD_CLK) { + clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL); + clk &= ~SDHCI_CLOCK_CARD_EN; + sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL); + } + /* * In response to CMD19, the card sends 64 bytes of tuning * block to the Host Controller. So we set the block size @@ -2213,6 +2221,13 @@ static void sdhci_send_tuning(struct sdhci_host *host, u32 opcode) mmiowb(); spin_unlock_irqrestore(&host->lock, flags); + if (host->quirks2 & SDHCI_QUIRK2_TUNE_DIS_CARD_CLK) { + udelay(1); + clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL); + clk |= SDHCI_CLOCK_CARD_EN; + sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL); + } + /* Wait for Buffer Read Ready interrupt */ wait_event_timeout(host->buf_ready_int, (host->tuning_done == 1), msecs_to_jiffies(50)); diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h index 0a99008..cc411b0 100644 --- a/drivers/mmc/host/sdhci.h +++ b/drivers/mmc/host/sdhci.h @@ -452,6 +452,8 @@ struct sdhci_host { #define SDHCI_QUIRK2_DISABLE_HW_TIMEOUT (1<<17) /* Don't clear the SDHCI_TRANSFER_MODE register on tuning commands */ #define SDHCI_QUIRK2_TUNE_SKIP_XFERMODE_REG_PROG (1<<18) +/* Disable card clock during tuning */ +#define SDHCI_QUIRK2_TUNE_DIS_CARD_CLK (1<<19) int irq; /* Device IRQ */ void __iomem *ioaddr; /* Mapped address */ -- 2.7.4