001-v6.3-mmc-sdhci-of-dwcmshc-Update-DLL-and-pre-change-delay-for.patch 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. From b75a52b0dda353aeefb4830a320589a363f49579 Mon Sep 17 00:00:00 2001
  2. From: Shawn Lin <[email protected]>
  3. Date: Thu, 2 Feb 2023 08:35:16 +0800
  4. Subject: [PATCH] mmc: sdhci-of-dwcmshc: Update DLL and pre-change delay for
  5. rockchip platform
  6. For Rockchip platform, DLL bypass bit and start bit need to be set if
  7. DLL is not locked. And adjust pre-change delay to 0x3 for better signal
  8. test result.
  9. Signed-off-by: Shawn Lin <[email protected]>
  10. Link: https://lore.kernel.org/r/[email protected]
  11. Signed-off-by: Ulf Hansson <[email protected]>
  12. ---
  13. drivers/mmc/host/sdhci-of-dwcmshc.c | 13 +++++++++----
  14. 1 file changed, 9 insertions(+), 4 deletions(-)
  15. --- a/drivers/mmc/host/sdhci-of-dwcmshc.c
  16. +++ b/drivers/mmc/host/sdhci-of-dwcmshc.c
  17. @@ -48,6 +48,7 @@
  18. #define DWCMSHC_EMMC_DLL_RXCLK_SRCSEL 29
  19. #define DWCMSHC_EMMC_DLL_START_POINT 16
  20. #define DWCMSHC_EMMC_DLL_INC 8
  21. +#define DWCMSHC_EMMC_DLL_BYPASS BIT(24)
  22. #define DWCMSHC_EMMC_DLL_DLYENA BIT(27)
  23. #define DLL_TXCLK_TAPNUM_DEFAULT 0x10
  24. #define DLL_TXCLK_TAPNUM_90_DEGREES 0xA
  25. @@ -60,6 +61,7 @@
  26. #define DLL_RXCLK_NO_INVERTER 1
  27. #define DLL_RXCLK_INVERTER 0
  28. #define DLL_CMDOUT_TAPNUM_90_DEGREES 0x8
  29. +#define DLL_RXCLK_ORI_GATE BIT(31)
  30. #define DLL_CMDOUT_TAPNUM_FROM_SW BIT(24)
  31. #define DLL_CMDOUT_SRC_CLK_NEG BIT(28)
  32. #define DLL_CMDOUT_EN_SRC_CLK_NEG BIT(29)
  33. @@ -234,9 +236,12 @@ static void dwcmshc_rk3568_set_clock(str
  34. sdhci_writel(host, extra, reg);
  35. if (clock <= 52000000) {
  36. - /* Disable DLL and reset both of sample and drive clock */
  37. - sdhci_writel(host, 0, DWCMSHC_EMMC_DLL_CTRL);
  38. - sdhci_writel(host, 0, DWCMSHC_EMMC_DLL_RXCLK);
  39. + /*
  40. + * Disable DLL and reset both of sample and drive clock.
  41. + * The bypass bit and start bit need to be set if DLL is not locked.
  42. + */
  43. + sdhci_writel(host, DWCMSHC_EMMC_DLL_BYPASS | DWCMSHC_EMMC_DLL_START, DWCMSHC_EMMC_DLL_CTRL);
  44. + sdhci_writel(host, DLL_RXCLK_ORI_GATE, DWCMSHC_EMMC_DLL_RXCLK);
  45. sdhci_writel(host, 0, DWCMSHC_EMMC_DLL_TXCLK);
  46. sdhci_writel(host, 0, DECMSHC_EMMC_DLL_CMDOUT);
  47. /*
  48. @@ -279,7 +284,7 @@ static void dwcmshc_rk3568_set_clock(str
  49. }
  50. extra = 0x1 << 16 | /* tune clock stop en */
  51. - 0x2 << 17 | /* pre-change delay */
  52. + 0x3 << 17 | /* pre-change delay */
  53. 0x3 << 19; /* post-change delay */
  54. sdhci_writel(host, extra, dwc_priv->vendor_specific_area1 + DWCMSHC_EMMC_ATCTRL);