phy-intel-keembay-emmc.c 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Intel Keem Bay eMMC PHY driver
  4. * Copyright (C) 2020 Intel Corporation
  5. */
  6. #include <linux/bitfield.h>
  7. #include <linux/clk.h>
  8. #include <linux/delay.h>
  9. #include <linux/mfd/syscon.h>
  10. #include <linux/module.h>
  11. #include <linux/of.h>
  12. #include <linux/of_address.h>
  13. #include <linux/phy/phy.h>
  14. #include <linux/platform_device.h>
  15. #include <linux/regmap.h>
  16. /* eMMC/SD/SDIO core/phy configuration registers */
  17. #define PHY_CFG_0 0x24
  18. #define SEL_DLY_TXCLK_MASK BIT(29)
  19. #define OTAP_DLY_ENA_MASK BIT(27)
  20. #define OTAP_DLY_SEL_MASK GENMASK(26, 23)
  21. #define DLL_EN_MASK BIT(10)
  22. #define PWR_DOWN_MASK BIT(0)
  23. #define PHY_CFG_2 0x2c
  24. #define SEL_FREQ_MASK GENMASK(12, 10)
  25. #define PHY_STAT 0x40
  26. #define CAL_DONE_MASK BIT(6)
  27. #define IS_CALDONE(x) ((x) & CAL_DONE_MASK)
  28. #define DLL_RDY_MASK BIT(5)
  29. #define IS_DLLRDY(x) ((x) & DLL_RDY_MASK)
  30. /* From ACS_eMMC51_16nFFC_RO1100_Userguide_v1p0.pdf p17 */
  31. #define FREQSEL_200M_170M 0x0
  32. #define FREQSEL_170M_140M 0x1
  33. #define FREQSEL_140M_110M 0x2
  34. #define FREQSEL_110M_80M 0x3
  35. #define FREQSEL_80M_50M 0x4
  36. struct keembay_emmc_phy {
  37. struct regmap *syscfg;
  38. struct clk *emmcclk;
  39. };
  40. static const struct regmap_config keembay_regmap_config = {
  41. .reg_bits = 32,
  42. .val_bits = 32,
  43. .reg_stride = 4,
  44. };
  45. static int keembay_emmc_phy_power(struct phy *phy, bool on_off)
  46. {
  47. struct keembay_emmc_phy *priv = phy_get_drvdata(phy);
  48. unsigned int caldone;
  49. unsigned int dllrdy;
  50. unsigned int freqsel;
  51. unsigned int mhz;
  52. int ret;
  53. /*
  54. * Keep phyctrl_pdb and phyctrl_endll low to allow
  55. * initialization of CALIO state M/C DFFs
  56. */
  57. ret = regmap_update_bits(priv->syscfg, PHY_CFG_0, PWR_DOWN_MASK,
  58. FIELD_PREP(PWR_DOWN_MASK, 0));
  59. if (ret) {
  60. dev_err(&phy->dev, "CALIO power down bar failed: %d\n", ret);
  61. return ret;
  62. }
  63. ret = regmap_update_bits(priv->syscfg, PHY_CFG_0, DLL_EN_MASK,
  64. FIELD_PREP(DLL_EN_MASK, 0));
  65. if (ret) {
  66. dev_err(&phy->dev, "turn off the dll failed: %d\n", ret);
  67. return ret;
  68. }
  69. /* Already finish power off above */
  70. if (!on_off)
  71. return 0;
  72. mhz = DIV_ROUND_CLOSEST(clk_get_rate(priv->emmcclk), 1000000);
  73. if (mhz <= 200 && mhz >= 170)
  74. freqsel = FREQSEL_200M_170M;
  75. else if (mhz <= 170 && mhz >= 140)
  76. freqsel = FREQSEL_170M_140M;
  77. else if (mhz <= 140 && mhz >= 110)
  78. freqsel = FREQSEL_140M_110M;
  79. else if (mhz <= 110 && mhz >= 80)
  80. freqsel = FREQSEL_110M_80M;
  81. else if (mhz <= 80 && mhz >= 50)
  82. freqsel = FREQSEL_80M_50M;
  83. else
  84. freqsel = 0x0;
  85. /* Check for EMMC clock rate*/
  86. if (mhz > 175)
  87. dev_warn(&phy->dev, "Unsupported rate: %d MHz\n", mhz);
  88. /*
  89. * According to the user manual, calpad calibration
  90. * cycle takes more than 2us without the minimal recommended
  91. * value, so we may need a little margin here
  92. */
  93. udelay(5);
  94. ret = regmap_update_bits(priv->syscfg, PHY_CFG_0, PWR_DOWN_MASK,
  95. FIELD_PREP(PWR_DOWN_MASK, 1));
  96. if (ret) {
  97. dev_err(&phy->dev, "CALIO power down bar failed: %d\n", ret);
  98. return ret;
  99. }
  100. /*
  101. * According to the user manual, it asks driver to wait 5us for
  102. * calpad busy trimming. However it is documented that this value is
  103. * PVT(A.K.A. process, voltage and temperature) relevant, so some
  104. * failure cases are found which indicates we should be more tolerant
  105. * to calpad busy trimming.
  106. */
  107. ret = regmap_read_poll_timeout(priv->syscfg, PHY_STAT,
  108. caldone, IS_CALDONE(caldone),
  109. 0, 50);
  110. if (ret) {
  111. dev_err(&phy->dev, "caldone failed, ret=%d\n", ret);
  112. return ret;
  113. }
  114. /* Set the frequency of the DLL operation */
  115. ret = regmap_update_bits(priv->syscfg, PHY_CFG_2, SEL_FREQ_MASK,
  116. FIELD_PREP(SEL_FREQ_MASK, freqsel));
  117. if (ret) {
  118. dev_err(&phy->dev, "set the frequency of dll failed:%d\n", ret);
  119. return ret;
  120. }
  121. /* Turn on the DLL */
  122. ret = regmap_update_bits(priv->syscfg, PHY_CFG_0, DLL_EN_MASK,
  123. FIELD_PREP(DLL_EN_MASK, 1));
  124. if (ret) {
  125. dev_err(&phy->dev, "turn on the dll failed: %d\n", ret);
  126. return ret;
  127. }
  128. /*
  129. * We turned on the DLL even though the rate was 0 because we the
  130. * clock might be turned on later. ...but we can't wait for the DLL
  131. * to lock when the rate is 0 because it will never lock with no
  132. * input clock.
  133. *
  134. * Technically we should be checking the lock later when the clock
  135. * is turned on, but for now we won't.
  136. */
  137. if (mhz == 0)
  138. return 0;
  139. /*
  140. * After enabling analog DLL circuits docs say that we need 10.2 us if
  141. * our source clock is at 50 MHz and that lock time scales linearly
  142. * with clock speed. If we are powering on the PHY and the card clock
  143. * is super slow (like 100kHz) this could take as long as 5.1 ms as
  144. * per the math: 10.2 us * (50000000 Hz / 100000 Hz) => 5.1 ms
  145. * hopefully we won't be running at 100 kHz, but we should still make
  146. * sure we wait long enough.
  147. *
  148. * NOTE: There appear to be corner cases where the DLL seems to take
  149. * extra long to lock for reasons that aren't understood. In some
  150. * extreme cases we've seen it take up to over 10ms (!). We'll be
  151. * generous and give it 50ms.
  152. */
  153. ret = regmap_read_poll_timeout(priv->syscfg, PHY_STAT,
  154. dllrdy, IS_DLLRDY(dllrdy),
  155. 0, 50 * USEC_PER_MSEC);
  156. if (ret)
  157. dev_err(&phy->dev, "dllrdy failed, ret=%d\n", ret);
  158. return ret;
  159. }
  160. static int keembay_emmc_phy_init(struct phy *phy)
  161. {
  162. struct keembay_emmc_phy *priv = phy_get_drvdata(phy);
  163. /*
  164. * We purposely get the clock here and not in probe to avoid the
  165. * circular dependency problem. We expect:
  166. * - PHY driver to probe
  167. * - SDHCI driver to start probe
  168. * - SDHCI driver to register it's clock
  169. * - SDHCI driver to get the PHY
  170. * - SDHCI driver to init the PHY
  171. *
  172. * The clock is optional, so upon any error just return it like
  173. * any other error to user.
  174. */
  175. priv->emmcclk = clk_get_optional(&phy->dev, "emmcclk");
  176. return PTR_ERR_OR_ZERO(priv->emmcclk);
  177. }
  178. static int keembay_emmc_phy_exit(struct phy *phy)
  179. {
  180. struct keembay_emmc_phy *priv = phy_get_drvdata(phy);
  181. clk_put(priv->emmcclk);
  182. return 0;
  183. };
  184. static int keembay_emmc_phy_power_on(struct phy *phy)
  185. {
  186. struct keembay_emmc_phy *priv = phy_get_drvdata(phy);
  187. int ret;
  188. /* Delay chain based txclk: enable */
  189. ret = regmap_update_bits(priv->syscfg, PHY_CFG_0, SEL_DLY_TXCLK_MASK,
  190. FIELD_PREP(SEL_DLY_TXCLK_MASK, 1));
  191. if (ret) {
  192. dev_err(&phy->dev, "ERROR: delay chain txclk set: %d\n", ret);
  193. return ret;
  194. }
  195. /* Output tap delay: enable */
  196. ret = regmap_update_bits(priv->syscfg, PHY_CFG_0, OTAP_DLY_ENA_MASK,
  197. FIELD_PREP(OTAP_DLY_ENA_MASK, 1));
  198. if (ret) {
  199. dev_err(&phy->dev, "ERROR: output tap delay set: %d\n", ret);
  200. return ret;
  201. }
  202. /* Output tap delay */
  203. ret = regmap_update_bits(priv->syscfg, PHY_CFG_0, OTAP_DLY_SEL_MASK,
  204. FIELD_PREP(OTAP_DLY_SEL_MASK, 2));
  205. if (ret) {
  206. dev_err(&phy->dev, "ERROR: output tap delay select: %d\n", ret);
  207. return ret;
  208. }
  209. /* Power up eMMC phy analog blocks */
  210. return keembay_emmc_phy_power(phy, true);
  211. }
  212. static int keembay_emmc_phy_power_off(struct phy *phy)
  213. {
  214. /* Power down eMMC phy analog blocks */
  215. return keembay_emmc_phy_power(phy, false);
  216. }
  217. static const struct phy_ops ops = {
  218. .init = keembay_emmc_phy_init,
  219. .exit = keembay_emmc_phy_exit,
  220. .power_on = keembay_emmc_phy_power_on,
  221. .power_off = keembay_emmc_phy_power_off,
  222. .owner = THIS_MODULE,
  223. };
  224. static int keembay_emmc_phy_probe(struct platform_device *pdev)
  225. {
  226. struct device *dev = &pdev->dev;
  227. struct device_node *np = dev->of_node;
  228. struct keembay_emmc_phy *priv;
  229. struct phy *generic_phy;
  230. struct phy_provider *phy_provider;
  231. void __iomem *base;
  232. priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
  233. if (!priv)
  234. return -ENOMEM;
  235. base = devm_platform_ioremap_resource(pdev, 0);
  236. if (IS_ERR(base))
  237. return PTR_ERR(base);
  238. priv->syscfg = devm_regmap_init_mmio(dev, base, &keembay_regmap_config);
  239. if (IS_ERR(priv->syscfg))
  240. return PTR_ERR(priv->syscfg);
  241. generic_phy = devm_phy_create(dev, np, &ops);
  242. if (IS_ERR(generic_phy))
  243. return dev_err_probe(dev, PTR_ERR(generic_phy),
  244. "failed to create PHY\n");
  245. phy_set_drvdata(generic_phy, priv);
  246. phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
  247. return PTR_ERR_OR_ZERO(phy_provider);
  248. }
  249. static const struct of_device_id keembay_emmc_phy_dt_ids[] = {
  250. { .compatible = "intel,keembay-emmc-phy" },
  251. {}
  252. };
  253. MODULE_DEVICE_TABLE(of, keembay_emmc_phy_dt_ids);
  254. static struct platform_driver keembay_emmc_phy_driver = {
  255. .probe = keembay_emmc_phy_probe,
  256. .driver = {
  257. .name = "keembay-emmc-phy",
  258. .of_match_table = keembay_emmc_phy_dt_ids,
  259. },
  260. };
  261. module_platform_driver(keembay_emmc_phy_driver);
  262. MODULE_AUTHOR("Wan Ahmad Zainie <[email protected]>");
  263. MODULE_DESCRIPTION("Intel Keem Bay eMMC PHY driver");
  264. MODULE_LICENSE("GPL v2");