Received: by 2002:a05:6a10:6006:0:0:0:0 with SMTP id w6csp511989pxa; Thu, 27 Aug 2020 08:17:39 -0700 (PDT) X-Google-Smtp-Source: ABdhPJysz/n4yr/6ZL3s6knT/RbVomUWL5WCQT4UFu2VB7MNVeDd62Z9CpV2GfC5LTKSe5Jwp8uz X-Received: by 2002:a17:906:7d90:: with SMTP id v16mr21360191ejo.27.1598541459582; Thu, 27 Aug 2020 08:17:39 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1598541459; cv=none; d=google.com; s=arc-20160816; b=OeWwIPOzQXyy6HYH6hZYKrpK/6+ftZFNq6bjWVC3GUlycDd4PWdJJ9V10v7AqnpWMI +cuidRPJQRYCFakU8V+XptyMHkhCioAx0sOYZYEsJY47Ksch5VrVx8ZqEitcUb5mblLM eIv0NAlD/1zy7E04uESb4bWmFr8PLaqfLqI4dqn9scevhLgNdVvNdcEx1QRWxHVWJELt A1z1z5sJ1d31YGVFVQv2EUBnPmTmDWnfYtAqAU8uRJBFyAbaXviyK+4gGAu5O9dyni5A Pyk5gjCaCCWxJai8pGgDUnUWlEZ65c02XDrg+KkWwlyR3/JCX2l/iMlyll4E+rH7qMtj PCjg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:dkim-signature:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject; bh=xVoI1WZkGHOqNohPt0+gex2ZSLXV6wVFwXRA9Hx8SBA=; b=wm/pGVRl+/8VCqIiFtkg04wcE4zaBnSEQvMOUPP8vVvQZ1SAdEfg1EMjtfnB7HpOj7 +muRCdg7MpNHVef7eObmSY0ITGFpB7etsAIsiHrpazvHFqEOVq81eDfMLd44eE0SUZ4m tYVxtE66AESpg4Ff7IuTZO4vHa5ko722CmhEwzSvyLoM18ZcwKN0Yc/Yt3OkJ0h1wHhv DX8ooyriM8IM3Q/pQDb3PR59+d8X7fT8pyL3SIaz06tbZW4/Y/mk936id5KQvl4tpaxs 8LCBOgXng6NMXlNZIfhb1U2OsMOYKcQ32AyfcOEwDjAkjarwRy1w/RjsCqleP+89RE8N jLng== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@nvidia.com header.s=n1 header.b=kqWOz9u1; 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 ef20si1422050ejb.243.2020.08.27.08.17.16; Thu, 27 Aug 2020 08:17:39 -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=kqWOz9u1; 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 S1727954AbgH0PPk (ORCPT + 99 others); Thu, 27 Aug 2020 11:15:40 -0400 Received: from hqnvemgate26.nvidia.com ([216.228.121.65]:13684 "EHLO hqnvemgate26.nvidia.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727116AbgH0PPE (ORCPT ); Thu, 27 Aug 2020 11:15:04 -0400 Received: from hqpgpgate101.nvidia.com (Not Verified[216.228.121.13]) by hqnvemgate26.nvidia.com (using TLS: TLSv1.2, DES-CBC3-SHA) id ; Thu, 27 Aug 2020 08:14:43 -0700 Received: from hqmail.nvidia.com ([172.20.161.6]) by hqpgpgate101.nvidia.com (PGP Universal service); Thu, 27 Aug 2020 08:14:57 -0700 X-PGP-Universal: processed; by hqpgpgate101.nvidia.com on Thu, 27 Aug 2020 08:14:57 -0700 Received: from [10.26.74.41] (10.124.1.5) by HQMAIL107.nvidia.com (172.20.187.13) with Microsoft SMTP Server (TLS) id 15.0.1473.3; Thu, 27 Aug 2020 15:14:53 +0000 Subject: Re: [PATCH v6 7/7] sdhci: tegra: Add missing TMCLK for data timeout To: Sowjanya Komatineni , , , , CC: , , , , References: <1598500201-5987-1-git-send-email-skomatineni@nvidia.com> <1598500201-5987-8-git-send-email-skomatineni@nvidia.com> <93d0188b-c833-33b4-211e-b9293c4f3a1c@nvidia.com> <3deac67c-bb1e-ef23-7dcc-8d4024203ab1@nvidia.com> From: Jon Hunter Message-ID: <5ec4d869-f134-6e6d-6496-2410f271b196@nvidia.com> Date: Thu, 27 Aug 2020 16:14:51 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0 MIME-Version: 1.0 In-Reply-To: <3deac67c-bb1e-ef23-7dcc-8d4024203ab1@nvidia.com> X-Originating-IP: [10.124.1.5] X-ClientProxiedBy: HQMAIL105.nvidia.com (172.20.187.12) To HQMAIL107.nvidia.com (172.20.187.13) Content-Type: text/plain; charset="utf-8" Content-Language: en-US Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nvidia.com; s=n1; t=1598541283; bh=xVoI1WZkGHOqNohPt0+gex2ZSLXV6wVFwXRA9Hx8SBA=; h=X-PGP-Universal:Subject:To:CC:References:From:Message-ID:Date: User-Agent:MIME-Version:In-Reply-To:X-Originating-IP: X-ClientProxiedBy:Content-Type:Content-Language: Content-Transfer-Encoding; b=kqWOz9u1bINwK2K3lmHd1dbL57lLBYMMl2KAWX/leAhFGwUgBeggB/4LpX9LOp3GB 1ch2zDN1VNOgfcrod23at6YhLgpcU189s/eKCQnxAp0OL7LZ/iyRFqnxRAiiWElQpy SXkYo0J+9p0qQB97snF103KCQgiKEKVTuzBX4t8WkkiYyipnBt3w4WmCYKwEeDkj/B 1WCa8UK2VDzym3noqz5Ztmf/X5NMGTdb5kBad/H+GYN7bQdwAsbFuFTMBhEK0xQ+kB dXnpJRfWj4o3BmobrlLrhe39OTk8LhnG3ps7ATHEG6ouWd3JiemKJveHNtBsL1VR4b VIed7kguBu50w== Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 27/08/2020 16:03, Sowjanya Komatineni wrote: >=20 > On 8/27/20 1:40 AM, Jon Hunter wrote: >> On 27/08/2020 04:50, Sowjanya Komatineni wrote: >>> commit b5a84ecf025a ("mmc: tegra: Add Tegra210 support") >>> >>> 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. >>> >>> 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 # 5.4 >>> Tested-by: Jon Hunter >>> Reviewed-by: Jon Hunter >>> Acked-by: Adrian Hunter >>> Signed-off-by: Sowjanya Komatineni >>> --- >>> =C2=A0 drivers/mmc/host/sdhci-tegra.c | 90 >>> ++++++++++++++++++++++++++++++++++++++---- >>> =C2=A0 1 file changed, 82 insertions(+), 8 deletions(-) >>> >>> diff --git a/drivers/mmc/host/sdhci-tegra.c >>> b/drivers/mmc/host/sdhci-tegra.c >>> index 31ed321..f69ca8d 100644 >>> --- a/drivers/mmc/host/sdhci-tegra.c >>> +++ b/drivers/mmc/host/sdhci-tegra.c >>> @@ -13,6 +13,7 @@ >>> =C2=A0 #include >>> =C2=A0 #include >>> =C2=A0 #include >>> +#include >>> =C2=A0 #include >>> =C2=A0 #include >>> =C2=A0 #include >>> @@ -110,6 +111,12 @@ >>> =C2=A0 #define NVQUIRK_DIS_CARD_CLK_CONFIG_TAP=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 BIT(8) >>> =C2=A0 #define NVQUIRK_CQHCI_DCMD_R1B_CMD_TIMING=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 BIT(9) >>> =C2=A0 +/* >>> + * NVQUIRK_HAS_TMCLK is for SoC's having separate timeout clock for >>> Tegra >>> + * SDMMC hardware data timeout. >>> + */ >>> +#define NVQUIRK_HAS_TMCLK=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 BIT(10) >>> + >>> =C2=A0 /* SDMMC CQE Base Address for Tegra Host Ver 4.1 and Higher */ >>> =C2=A0 #define SDHCI_TEGRA_CQE_BASE_ADDR=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 0xF000 >>> =C2=A0 @@ -140,6 +147,7 @@ struct sdhci_tegra_autocal_offsets { >>> =C2=A0 struct sdhci_tegra { >>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 const struct sdhci_tegra_soc_data *soc_d= ata; >>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 struct gpio_desc *power_gpio; >>> +=C2=A0=C2=A0=C2=A0 struct clk *tmclk; >>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 bool ddr_signaling; >>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 bool pad_calib_required; >>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 bool pad_control_available; >>> @@ -1433,7 +1441,8 @@ static const struct sdhci_tegra_soc_data >>> soc_data_tegra210 =3D { >>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 NVQUIRK_HAS_PADCALIB | >>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 NVQUIRK_DIS_CARD_CLK_CONFIG_TAP | >>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 NVQUIRK_ENABLE_SDR50 | >>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 NVQ= UIRK_ENABLE_SDR104, >>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 NVQ= UIRK_ENABLE_SDR104 | >>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 NVQ= UIRK_HAS_TMCLK, >>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 .min_tap_delay =3D 106, >>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 .max_tap_delay =3D 185, >>> =C2=A0 }; >>> @@ -1471,6 +1480,7 @@ static const struct sdhci_tegra_soc_data >>> soc_data_tegra186 =3D { >>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 NVQUIRK_DIS_CARD_CLK_CONFIG_TAP | >>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 NVQUIRK_ENABLE_SDR50 | >>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 NVQUIRK_ENABLE_SDR104 | >>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 NVQ= UIRK_HAS_TMCLK | >>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 NVQUIRK_CQHCI_DCMD_R1B_CMD_TIMING, >>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 .min_tap_delay =3D 84, >>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 .max_tap_delay =3D 136, >>> @@ -1483,7 +1493,8 @@ static const struct sdhci_tegra_soc_data >>> soc_data_tegra194 =3D { >>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 NVQUIRK_HAS_PADCALIB | >>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 NVQUIRK_DIS_CARD_CLK_CONFIG_TAP | >>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 NVQUIRK_ENABLE_SDR50 | >>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 NVQ= UIRK_ENABLE_SDR104, >>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 NVQ= UIRK_ENABLE_SDR104 | >>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 NVQ= UIRK_HAS_TMCLK, >>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 .min_tap_delay =3D 96, >>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 .max_tap_delay =3D 139, >>> =C2=A0 }; >>> @@ -1611,15 +1622,76 @@ static int sdhci_tegra_probe(struct >>> platform_device *pdev) >>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 goto err_power_r= eq; >>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 } >>> =C2=A0 -=C2=A0=C2=A0=C2=A0 clk =3D devm_clk_get(mmc_dev(host->mmc), NUL= L); >>> -=C2=A0=C2=A0=C2=A0 if (IS_ERR(clk)) { >>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 rc =3D PTR_ERR(clk); >>> +=C2=A0=C2=A0=C2=A0 /* >>> +=C2=A0=C2=A0=C2=A0=C2=A0 * Tegra210 and later has separate SDMMC_LEGAC= Y_TM clock used for >>> +=C2=A0=C2=A0=C2=A0=C2=A0 * hardware data timeout clock and SW can choo= se TMCLK or SDCLK for >>> +=C2=A0=C2=A0=C2=A0=C2=A0 * hardware data timeout through the bit USE_T= MCLK_FOR_DATA_TIMEOUT >>> +=C2=A0=C2=A0=C2=A0=C2=A0 * of the register SDHCI_TEGRA_VENDOR_SYS_SW_C= TRL. >>> +=C2=A0=C2=A0=C2=A0=C2=A0 * >>> +=C2=A0=C2=A0=C2=A0=C2=A0 * USE_TMCLK_FOR_DATA_TIMEOUT bit default is s= et to 1 and SDMMC >>> uses >>> +=C2=A0=C2=A0=C2=A0=C2=A0 * 12Mhz TMCLK which is advertised in host cap= ability register. >>> +=C2=A0=C2=A0=C2=A0=C2=A0 * With TMCLK of 12Mhz provides maximum data t= imeout period that >>> can >>> +=C2=A0=C2=A0=C2=A0=C2=A0 * be achieved is 11s better than using SDCLK = for data timeout. >>> +=C2=A0=C2=A0=C2=A0=C2=A0 * >>> +=C2=A0=C2=A0=C2=A0=C2=A0 * So, TMCLK is set to 12Mhz and kept enabled = all the time on SoC's >>> +=C2=A0=C2=A0=C2=A0=C2=A0 * supporting separate TMCLK. >>> +=C2=A0=C2=A0=C2=A0=C2=A0 * >>> +=C2=A0=C2=A0=C2=A0=C2=A0 * Old device tree has single sdhci clock. So = with addition of >>> TMCLK, >>> +=C2=A0=C2=A0=C2=A0=C2=A0 * retrieving sdhci clock by "sdhci" clock nam= e based on number of >>> +=C2=A0=C2=A0=C2=A0=C2=A0 * clocks in sdhci device node. >>> +=C2=A0=C2=A0=C2=A0=C2=A0 */ >>> + >>> +=C2=A0=C2=A0=C2=A0 if (of_clk_get_parent_count(pdev->dev.of_node) =3D= =3D 1) { >>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (soc_data->nvquirks & NV= QUIRK_HAS_TMCLK) >>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 dev= _warn(&pdev->dev, >>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 "missing tmclk in the device tree\n"); >>> + >>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 clk =3D devm_clk_get(&pdev-= >dev, NULL); >>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (IS_ERR(clk)) { >>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 rc = =3D PTR_ERR(clk); >>> =C2=A0 -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (rc !=3D -EPROBE_= DEFER) >>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 dev= _err(&pdev->dev, "failed to get clock: %d\n", rc); >>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if = (rc !=3D -EPROBE_DEFER) >>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 dev_err(&pdev->dev, >>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 "failed to get sdhci clock: %= d\n", rc); >>> =C2=A0 -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 goto err_clk_get; >>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 got= o err_power_req; >>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 } >>> +=C2=A0=C2=A0=C2=A0 } else { >>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (soc_data->nvquirks & NV= QUIRK_HAS_TMCLK) { >> >> I think that I would do the inverse of this ... >> >> =C2=A0=C2=A0=C2=A0 } else { >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (!(soc_data->nvquirk= s & NVQUIRK_HAS_TMCLK)) { >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 dev_err(&pdev->dev, "Device has unexpected clocks!= \n"); >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 rc =3D -EINVAL; >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 goto_power_req; >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 } >> >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 clk =3D devm_clk_get(&p= dev->dev, "tmclk"); >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ... >> >> If the device does not have a single clock, then we expect it to support >> the tmclk. If this is not the case, then this is a bug. >> >> Cheers >> Jon >=20 > I don't see other drivers validating for unexpected device tree entries. >=20 > Also only for SoC with quirk HAS_TMCLK, we are retrieving TMCLK with > clock name and enabling it. >=20 > So for other SoC even if device tree has additional clock entry other > than sdhci driver don't use it and also dt-binding do not have any tmclk > entry for other SoC. So why would this be a bug? In the device tree binding doc, we say has two clocks for Tegra210, Tegra186 and Tegra194 and one clock for all other devices. So if we no there is more than 1 but the device does not have this quirk, then the device-tree does not reflect what is stated in the binding doc or the quirk is no populated as it should be. I feel that either case is a bug. Now of course it could be possible for someone to add a 3rd clock for Tegra210 and we would not detect this but like you said we don't check all conditions. So yes we don't catch all cases, but the ones that matter. Jon --=20 nvpublic