Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp1861195pxk; Tue, 1 Sep 2020 09:27:04 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyVNR9xn7C/vsoarC5EdvS3UtBt3jOC5dL+vvMbuqvqKXJ7sZCsf8+S1tBUWD+Swk2ERNpI X-Received: by 2002:a50:fe07:: with SMTP id f7mr2562568edt.173.1598977623892; Tue, 01 Sep 2020 09:27:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1598977623; cv=none; d=google.com; s=arc-20160816; b=aA4aimKOsX0p2vbAs8Hb48mi3HVSBKSuNuk2vv4ansswt6e2cbwu009+fx2ft7Qo2Q OyyH9yNPKoV2wQEI+eGiiz4WrRiimdsEn+rJIILmYJh8uAVkQnAArRVQXkTzcj8hQd5G PJ2f7DOn7yn7zHYr2V6/NQ6JTVSv3/4BrnU2gut/FOJ/MbOatjGJm7KzFpVkaPS/qfrL Sh/kosf+0c8GawyEdHIq1wKTyE41ekU7/iSSm3Ixdp24vXfkC5oybXMaJswQtKRZp95m 6unbQv9EGPXNJ4CMQV5rXqUQhM0aYZbVwEsliWpM5thOB58Z+WY7SUcltGqGp7b50Pac POBA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:dkim-signature:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from; bh=tsGv/QEK6JayM8IhEvot3XxT3ByrelWJO4o4XijyBto=; b=FWO9wlbAxVOh7Z7dMJoQ09nNd0cBksZ/q+Llwu4JVxGprW4fD04EeeXrTmVILwhXgG bLMz4er4ZpPSV9vPlZHqOs2+FTISN/QA8uDvk/m/ZUuSJMhykmu8Pb3AxgksNHC7lV2K WLMgP8GW0KcJ9BlnokdjfyXYGdfgOAUXGjKMnXWj8/yCOFHL6P26KeXaSnpHp7EGqEjk iN3Gv/3VsS5cSIDaEt45qT2hz5riYiTj0mYptGHYVzXmCitoHqwcBr3uaknp1iK0VGFH 9PrckukiXLQA4+yGeMMp9gjUhai6qg7g48UG9xxX/sA1x5HW//xX/W03voA8N1xMmUzl XFiA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@nvidia.com header.s=n1 header.b=B86HxzgL; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=nvidia.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id z1si924869eji.189.2020.09.01.09.26.40; Tue, 01 Sep 2020 09:27:03 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@nvidia.com header.s=n1 header.b=B86HxzgL; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=nvidia.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729161AbgIAQZg (ORCPT + 99 others); Tue, 1 Sep 2020 12:25:36 -0400 Received: from hqnvemgate25.nvidia.com ([216.228.121.64]:12031 "EHLO hqnvemgate25.nvidia.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730481AbgIAQZZ (ORCPT ); Tue, 1 Sep 2020 12:25:25 -0400 Received: from hqpgpgate101.nvidia.com (Not Verified[216.228.121.13]) by hqnvemgate25.nvidia.com (using TLS: TLSv1.2, DES-CBC3-SHA) id ; Tue, 01 Sep 2020 09:24:39 -0700 Received: from hqmail.nvidia.com ([172.20.161.6]) by hqpgpgate101.nvidia.com (PGP Universal service); Tue, 01 Sep 2020 09:25:25 -0700 X-PGP-Universal: processed; by hqpgpgate101.nvidia.com on Tue, 01 Sep 2020 09:25:25 -0700 Received: from HQMAIL109.nvidia.com (172.20.187.15) by HQMAIL109.nvidia.com (172.20.187.15) with Microsoft SMTP Server (TLS) id 15.0.1473.3; Tue, 1 Sep 2020 16:25:21 +0000 Received: from rnnvemgw01.nvidia.com (10.128.109.123) by HQMAIL109.nvidia.com (172.20.187.15) with Microsoft SMTP Server (TLS) id 15.0.1473.3 via Frontend Transport; Tue, 1 Sep 2020 16:25:21 +0000 Received: from skomatineni-linux.nvidia.com (Not Verified[10.2.173.243]) by rnnvemgw01.nvidia.com with Trustwave SEG (v7,5,8,10121) id ; Tue, 01 Sep 2020 09:25:21 -0700 From: Sowjanya Komatineni To: , , , , CC: , , , , , Subject: [PATCH v2 4.19 7/7] sdhci: tegra: Add missing TMCLK for data timeout Date: Tue, 1 Sep 2020 09:24:50 -0700 Message-ID: <1598977490-1826-8-git-send-email-skomatineni@nvidia.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1598977490-1826-1-git-send-email-skomatineni@nvidia.com> References: <1598977490-1826-1-git-send-email-skomatineni@nvidia.com> X-NVConfidentiality: public MIME-Version: 1.0 Content-Type: text/plain DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nvidia.com; s=n1; t=1598977479; bh=tsGv/QEK6JayM8IhEvot3XxT3ByrelWJO4o4XijyBto=; h=X-PGP-Universal:From:To:CC:Subject:Date:Message-ID:X-Mailer: In-Reply-To:References:X-NVConfidentiality:MIME-Version: Content-Type; b=B86HxzgLywlbVwVUo7p+hGWDhrCDMjBunCExV4rGolhVKoZJejE7e7MvFKchc4sDt f//CECGuINDmO9Q/Y1BVKHMZKmZdo1P0uGG8jcg7yNIli5HpbX52q6CIYgBfxsrNOW 9BUec03ujpSZyBCsWsuq74eNiQR50dPHHezjnNapgstP4KoZE2RHpFGCrHUOkcLVry tvDkmNuSMnMrDSLs1WkmKZZhpXAzIzsRJBAd/2h9tN/GFgnb+O1Z+1aFaI42uFFOEU 86y8+3r52S4xcITR2qNysQ5Ch958rolUAlweytXegvi8YoSSnXxj3rEBsq19O0/67x oAT3UexRJ7gwQ== Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Tegra210 and later has a separate sdmmc_legacy_tm (TMCLK) used by Tegra SDMMC hawdware for data timeout to achive better timeout than using SDCLK and using TMCLK is recommended. Enabling TMCLK was missed when Tegra210 support was added to the driver in commit b5a84ecf025a ("mmc: tegra: Add Tegra210 support"), USE_TMCLK_FOR_DATA_TIMEOUT bit in Tegra SDMMC register SDHCI_TEGRA_VENDOR_SYS_SW_CTRL can be used to choose either TMCLK or SDCLK for data timeout. Default USE_TMCLK_FOR_DATA_TIMEOUT bit is set to 1 and TMCLK is used for data timeout by Tegra SDMMC hardware and having TMCLK not enabled is not recommended. So, this patch adds quirk NVQUIRK_HAS_TMCLK for SoC having separate timeout clock and keeps TMCLK enabled all the time. Fixes: b5a84ecf025a ("mmc: tegra: Add Tegra210 support") Cc: stable # 4.19 Tested-by: Jon Hunter Reviewed-by: Jon Hunter Acked-by: Adrian Hunter Signed-off-by: Sowjanya Komatineni --- drivers/mmc/host/sdhci-tegra.c | 48 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/drivers/mmc/host/sdhci-tegra.c b/drivers/mmc/host/sdhci-tegra.c index 5a7c032..ff3340c 100644 --- a/drivers/mmc/host/sdhci-tegra.c +++ b/drivers/mmc/host/sdhci-tegra.c @@ -56,6 +56,12 @@ #define NVQUIRK_ENABLE_DDR50 BIT(5) #define NVQUIRK_HAS_PADCALIB BIT(6) +/* + * NVQUIRK_HAS_TMCLK is for SoC's having separate timeout clock for Tegra + * SDMMC hardware data timeout. + */ +#define NVQUIRK_HAS_TMCLK BIT(10) + struct sdhci_tegra_soc_data { const struct sdhci_pltfm_data *pdata; u32 nvquirks; @@ -64,6 +70,7 @@ struct sdhci_tegra_soc_data { struct sdhci_tegra { const struct sdhci_tegra_soc_data *soc_data; struct gpio_desc *power_gpio; + struct clk *tmclk; bool ddr_signaling; bool pad_calib_required; @@ -433,6 +440,7 @@ static const struct sdhci_pltfm_data sdhci_tegra210_pdata = { static const struct sdhci_tegra_soc_data soc_data_tegra210 = { .pdata = &sdhci_tegra210_pdata, + .nvquirks = NVQUIRK_HAS_TMCLK, }; static const struct sdhci_pltfm_data sdhci_tegra186_pdata = { @@ -455,6 +463,7 @@ static const struct sdhci_pltfm_data sdhci_tegra186_pdata = { static const struct sdhci_tegra_soc_data soc_data_tegra186 = { .pdata = &sdhci_tegra186_pdata, + .nvquirks = NVQUIRK_HAS_TMCLK, }; static const struct of_device_id sdhci_tegra_dt_match[] = { @@ -510,6 +519,43 @@ static int sdhci_tegra_probe(struct platform_device *pdev) goto err_power_req; } + /* + * Some Tegra SoC's has a separate SDMMC_LEGACY_TM clock used for + * host data timeout clock and SW can choose TMCLK or SDCLK for + * hardware data timeout through the bit USE_TMCLK_FOR_DATA_TIMEOUT + * of the register SDHCI_TEGRA_VENDOR_SYS_SW_CTRL. + * + * USE_TMCLK_FOR_DATA_TIMEOUT bit default is set to 1 and SDMMC uses + * 12Mhz TMCLK which is advertised in host capability register. + * With TMCLK of 12Mhz provides maximum data timeout period that can + * be achieved is 11s better than using SDCLK for data timeout. + * + * So, TMCLK is set to 12Mhz and kept enabled all the time on SoC's + * supporting separate TMCLK. + */ + + if (soc_data->nvquirks & NVQUIRK_HAS_TMCLK) { + clk = devm_clk_get(&pdev->dev, "tmclk"); + if (IS_ERR(clk)) { + rc = PTR_ERR(clk); + if (rc == -EPROBE_DEFER) + goto err_power_req; + + dev_warn(&pdev->dev, "failed to get tmclk: %d\n", rc); + clk = NULL; + } + + clk_set_rate(clk, 12000000); + rc = clk_prepare_enable(clk); + if (rc) { + dev_err(&pdev->dev, + "failed to enable tmclk: %d\n", rc); + goto err_power_req; + } + + tegra_host->tmclk = clk; + } + clk = devm_clk_get(mmc_dev(host->mmc), NULL); if (IS_ERR(clk)) { dev_err(mmc_dev(host->mmc), "clk err\n"); @@ -550,6 +596,7 @@ static int sdhci_tegra_probe(struct platform_device *pdev) err_rst_get: clk_disable_unprepare(pltfm_host->clk); err_clk_get: + clk_disable_unprepare(tegra_host->tmclk); err_power_req: err_parse_dt: sdhci_pltfm_free(pdev); @@ -567,6 +614,7 @@ static int sdhci_tegra_remove(struct platform_device *pdev) reset_control_assert(tegra_host->rst); usleep_range(2000, 4000); clk_disable_unprepare(pltfm_host->clk); + clk_disable_unprepare(tegra_host->tmclk); sdhci_pltfm_free(pdev); -- 2.7.4