diff mbox series

mmc: zynq_sdhci: Fix SDx_BASECLK configuration

Message ID 6c1e5eeeedd2864a0c85e6b409d182031d8c6c1a.1648210268.git.michal.simek@xilinx.com
State Accepted
Commit 035d56f2386e009aaa41cd75022f8cddc04e5c1a
Delegated to: Michal Simek
Headers show
Series mmc: zynq_sdhci: Fix SDx_BASECLK configuration | expand

Commit Message

Michal Simek March 25, 2022, 12:11 p.m. UTC
From: Ashok Reddy Soma <ashok.reddy.soma@xilinx.com>

The DLL mode supported SD reference clocks are 50 MHz, 100 MHz and
200 MHz. When user select SD frequency as 200MHz in the design, the
actual frequency is going to come around ~187MHz (<= 200MHz considering
the parent clock and divisor selection). We need to set SDx_BASECLK as
200 in this case, setting 187 will result in tuning failures in mmc.

Set SDx_BASECLK to exact value of 200, 100 or 50 based on the frequency
range.

Signed-off-by: Ashok Reddy Soma <ashok.reddy.soma@xilinx.com>
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
---

 drivers/mmc/zynq_sdhci.c | 9 +++++++++
 1 file changed, 9 insertions(+)

Comments

Jaehoon Chung March 28, 2022, 11:19 p.m. UTC | #1
On 3/25/22 21:11, Michal Simek wrote:
> From: Ashok Reddy Soma <ashok.reddy.soma@xilinx.com>
> 
> The DLL mode supported SD reference clocks are 50 MHz, 100 MHz and
> 200 MHz. When user select SD frequency as 200MHz in the design, the
> actual frequency is going to come around ~187MHz (<= 200MHz considering
> the parent clock and divisor selection). We need to set SDx_BASECLK as
> 200 in this case, setting 187 will result in tuning failures in mmc.
> 
> Set SDx_BASECLK to exact value of 200, 100 or 50 based on the frequency
> range.
> 
> Signed-off-by: Ashok Reddy Soma <ashok.reddy.soma@xilinx.com>
> Signed-off-by: Michal Simek <michal.simek@xilinx.com>

Reviewed-by: Jaehoon Chung <jh80.chung@samsung.com>

Best Regards,
Jaehoon Chung

> ---
> 
>  drivers/mmc/zynq_sdhci.c | 9 +++++++++
>  1 file changed, 9 insertions(+)
> 
> diff --git a/drivers/mmc/zynq_sdhci.c b/drivers/mmc/zynq_sdhci.c
> index d96f5d543f54..a59d96c6bdad 100644
> --- a/drivers/mmc/zynq_sdhci.c
> +++ b/drivers/mmc/zynq_sdhci.c
> @@ -765,6 +765,15 @@ static int sdhci_zynqmp_set_dynamic_config(struct arasan_sdhci_priv *priv,
>  
>  	mhz = DIV64_U64_ROUND_UP(clock, 1000000);
>  
> +	if (mhz > 100 && mhz <= 200)
> +		mhz = 200;
> +	else if (mhz > 50 && mhz <= 100)
> +		mhz = 100;
> +	else if (mhz > 25 && mhz <= 50)
> +		mhz = 50;
> +	else
> +		mhz = 25;
> +
>  	ret = zynqmp_pm_set_sd_config(node_id, SD_CONFIG_BASECLK, mhz);
>  	if (ret) {
>  		dev_err(dev, "SD_CONFIG_BASECLK failed\n");
Michal Simek March 29, 2022, 7:20 a.m. UTC | #2
pá 25. 3. 2022 v 13:11 odesílatel Michal Simek <michal.simek@xilinx.com> napsal:
>
> From: Ashok Reddy Soma <ashok.reddy.soma@xilinx.com>
>
> The DLL mode supported SD reference clocks are 50 MHz, 100 MHz and
> 200 MHz. When user select SD frequency as 200MHz in the design, the
> actual frequency is going to come around ~187MHz (<= 200MHz considering
> the parent clock and divisor selection). We need to set SDx_BASECLK as
> 200 in this case, setting 187 will result in tuning failures in mmc.
>
> Set SDx_BASECLK to exact value of 200, 100 or 50 based on the frequency
> range.
>
> Signed-off-by: Ashok Reddy Soma <ashok.reddy.soma@xilinx.com>
> Signed-off-by: Michal Simek <michal.simek@xilinx.com>
> ---
>
>  drivers/mmc/zynq_sdhci.c | 9 +++++++++
>  1 file changed, 9 insertions(+)
>
> diff --git a/drivers/mmc/zynq_sdhci.c b/drivers/mmc/zynq_sdhci.c
> index d96f5d543f54..a59d96c6bdad 100644
> --- a/drivers/mmc/zynq_sdhci.c
> +++ b/drivers/mmc/zynq_sdhci.c
> @@ -765,6 +765,15 @@ static int sdhci_zynqmp_set_dynamic_config(struct arasan_sdhci_priv *priv,
>
>         mhz = DIV64_U64_ROUND_UP(clock, 1000000);
>
> +       if (mhz > 100 && mhz <= 200)
> +               mhz = 200;
> +       else if (mhz > 50 && mhz <= 100)
> +               mhz = 100;
> +       else if (mhz > 25 && mhz <= 50)
> +               mhz = 50;
> +       else
> +               mhz = 25;
> +
>         ret = zynqmp_pm_set_sd_config(node_id, SD_CONFIG_BASECLK, mhz);
>         if (ret) {
>                 dev_err(dev, "SD_CONFIG_BASECLK failed\n");
> --
> 2.35.1
>

Applied.
M
diff mbox series

Patch

diff --git a/drivers/mmc/zynq_sdhci.c b/drivers/mmc/zynq_sdhci.c
index d96f5d543f54..a59d96c6bdad 100644
--- a/drivers/mmc/zynq_sdhci.c
+++ b/drivers/mmc/zynq_sdhci.c
@@ -765,6 +765,15 @@  static int sdhci_zynqmp_set_dynamic_config(struct arasan_sdhci_priv *priv,
 
 	mhz = DIV64_U64_ROUND_UP(clock, 1000000);
 
+	if (mhz > 100 && mhz <= 200)
+		mhz = 200;
+	else if (mhz > 50 && mhz <= 100)
+		mhz = 100;
+	else if (mhz > 25 && mhz <= 50)
+		mhz = 50;
+	else
+		mhz = 25;
+
 	ret = zynqmp_pm_set_sd_config(node_id, SD_CONFIG_BASECLK, mhz);
 	if (ret) {
 		dev_err(dev, "SD_CONFIG_BASECLK failed\n");