sdhci_am654.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * sdhci_am654.c - SDHCI driver for TI's AM654 SOCs
  4. *
  5. * Copyright (C) 2018 Texas Instruments Incorporated - https://www.ti.com
  6. *
  7. */
  8. #include <linux/clk.h>
  9. #include <linux/iopoll.h>
  10. #include <linux/of.h>
  11. #include <linux/module.h>
  12. #include <linux/pm_runtime.h>
  13. #include <linux/property.h>
  14. #include <linux/regmap.h>
  15. #include <linux/sys_soc.h>
  16. #include "cqhci.h"
  17. #include "sdhci-cqhci.h"
  18. #include "sdhci-pltfm.h"
  19. /* CTL_CFG Registers */
  20. #define CTL_CFG_2 0x14
  21. #define CTL_CFG_3 0x18
  22. #define SLOTTYPE_MASK GENMASK(31, 30)
  23. #define SLOTTYPE_EMBEDDED BIT(30)
  24. #define TUNINGFORSDR50_MASK BIT(13)
  25. /* PHY Registers */
  26. #define PHY_CTRL1 0x100
  27. #define PHY_CTRL2 0x104
  28. #define PHY_CTRL3 0x108
  29. #define PHY_CTRL4 0x10C
  30. #define PHY_CTRL5 0x110
  31. #define PHY_CTRL6 0x114
  32. #define PHY_STAT1 0x130
  33. #define PHY_STAT2 0x134
  34. #define IOMUX_ENABLE_SHIFT 31
  35. #define IOMUX_ENABLE_MASK BIT(IOMUX_ENABLE_SHIFT)
  36. #define OTAPDLYENA_SHIFT 20
  37. #define OTAPDLYENA_MASK BIT(OTAPDLYENA_SHIFT)
  38. #define OTAPDLYSEL_SHIFT 12
  39. #define OTAPDLYSEL_MASK GENMASK(15, 12)
  40. #define STRBSEL_SHIFT 24
  41. #define STRBSEL_4BIT_MASK GENMASK(27, 24)
  42. #define STRBSEL_8BIT_MASK GENMASK(31, 24)
  43. #define SEL50_SHIFT 8
  44. #define SEL50_MASK BIT(SEL50_SHIFT)
  45. #define SEL100_SHIFT 9
  46. #define SEL100_MASK BIT(SEL100_SHIFT)
  47. #define FREQSEL_SHIFT 8
  48. #define FREQSEL_MASK GENMASK(10, 8)
  49. #define CLKBUFSEL_SHIFT 0
  50. #define CLKBUFSEL_MASK GENMASK(2, 0)
  51. #define DLL_TRIM_ICP_SHIFT 4
  52. #define DLL_TRIM_ICP_MASK GENMASK(7, 4)
  53. #define DR_TY_SHIFT 20
  54. #define DR_TY_MASK GENMASK(22, 20)
  55. #define ENDLL_SHIFT 1
  56. #define ENDLL_MASK BIT(ENDLL_SHIFT)
  57. #define DLLRDY_SHIFT 0
  58. #define DLLRDY_MASK BIT(DLLRDY_SHIFT)
  59. #define PDB_SHIFT 0
  60. #define PDB_MASK BIT(PDB_SHIFT)
  61. #define CALDONE_SHIFT 1
  62. #define CALDONE_MASK BIT(CALDONE_SHIFT)
  63. #define RETRIM_SHIFT 17
  64. #define RETRIM_MASK BIT(RETRIM_SHIFT)
  65. #define SELDLYTXCLK_SHIFT 17
  66. #define SELDLYTXCLK_MASK BIT(SELDLYTXCLK_SHIFT)
  67. #define SELDLYRXCLK_SHIFT 16
  68. #define SELDLYRXCLK_MASK BIT(SELDLYRXCLK_SHIFT)
  69. #define ITAPDLYSEL_SHIFT 0
  70. #define ITAPDLYSEL_MASK GENMASK(4, 0)
  71. #define ITAPDLYENA_SHIFT 8
  72. #define ITAPDLYENA_MASK BIT(ITAPDLYENA_SHIFT)
  73. #define ITAPCHGWIN_SHIFT 9
  74. #define ITAPCHGWIN_MASK BIT(ITAPCHGWIN_SHIFT)
  75. #define DRIVER_STRENGTH_50_OHM 0x0
  76. #define DRIVER_STRENGTH_33_OHM 0x1
  77. #define DRIVER_STRENGTH_66_OHM 0x2
  78. #define DRIVER_STRENGTH_100_OHM 0x3
  79. #define DRIVER_STRENGTH_40_OHM 0x4
  80. #define CLOCK_TOO_SLOW_HZ 50000000
  81. /* Command Queue Host Controller Interface Base address */
  82. #define SDHCI_AM654_CQE_BASE_ADDR 0x200
  83. static struct regmap_config sdhci_am654_regmap_config = {
  84. .reg_bits = 32,
  85. .val_bits = 32,
  86. .reg_stride = 4,
  87. .fast_io = true,
  88. };
  89. struct timing_data {
  90. const char *otap_binding;
  91. const char *itap_binding;
  92. u32 capability;
  93. };
  94. static const struct timing_data td[] = {
  95. [MMC_TIMING_LEGACY] = {"ti,otap-del-sel-legacy",
  96. "ti,itap-del-sel-legacy",
  97. 0},
  98. [MMC_TIMING_MMC_HS] = {"ti,otap-del-sel-mmc-hs",
  99. "ti,itap-del-sel-mmc-hs",
  100. MMC_CAP_MMC_HIGHSPEED},
  101. [MMC_TIMING_SD_HS] = {"ti,otap-del-sel-sd-hs",
  102. "ti,itap-del-sel-sd-hs",
  103. MMC_CAP_SD_HIGHSPEED},
  104. [MMC_TIMING_UHS_SDR12] = {"ti,otap-del-sel-sdr12",
  105. "ti,itap-del-sel-sdr12",
  106. MMC_CAP_UHS_SDR12},
  107. [MMC_TIMING_UHS_SDR25] = {"ti,otap-del-sel-sdr25",
  108. "ti,itap-del-sel-sdr25",
  109. MMC_CAP_UHS_SDR25},
  110. [MMC_TIMING_UHS_SDR50] = {"ti,otap-del-sel-sdr50",
  111. NULL,
  112. MMC_CAP_UHS_SDR50},
  113. [MMC_TIMING_UHS_SDR104] = {"ti,otap-del-sel-sdr104",
  114. NULL,
  115. MMC_CAP_UHS_SDR104},
  116. [MMC_TIMING_UHS_DDR50] = {"ti,otap-del-sel-ddr50",
  117. NULL,
  118. MMC_CAP_UHS_DDR50},
  119. [MMC_TIMING_MMC_DDR52] = {"ti,otap-del-sel-ddr52",
  120. "ti,itap-del-sel-ddr52",
  121. MMC_CAP_DDR},
  122. [MMC_TIMING_MMC_HS200] = {"ti,otap-del-sel-hs200",
  123. NULL,
  124. MMC_CAP2_HS200},
  125. [MMC_TIMING_MMC_HS400] = {"ti,otap-del-sel-hs400",
  126. NULL,
  127. MMC_CAP2_HS400},
  128. };
  129. struct sdhci_am654_data {
  130. struct regmap *base;
  131. bool legacy_otapdly;
  132. int otap_del_sel[ARRAY_SIZE(td)];
  133. int itap_del_sel[ARRAY_SIZE(td)];
  134. int clkbuf_sel;
  135. int trm_icp;
  136. int drv_strength;
  137. int strb_sel;
  138. u32 flags;
  139. u32 quirks;
  140. #define SDHCI_AM654_QUIRK_FORCE_CDTEST BIT(0)
  141. };
  142. struct sdhci_am654_driver_data {
  143. const struct sdhci_pltfm_data *pdata;
  144. u32 flags;
  145. #define IOMUX_PRESENT (1 << 0)
  146. #define FREQSEL_2_BIT (1 << 1)
  147. #define STRBSEL_4_BIT (1 << 2)
  148. #define DLL_PRESENT (1 << 3)
  149. #define DLL_CALIB (1 << 4)
  150. };
  151. static void sdhci_am654_setup_dll(struct sdhci_host *host, unsigned int clock)
  152. {
  153. struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
  154. struct sdhci_am654_data *sdhci_am654 = sdhci_pltfm_priv(pltfm_host);
  155. int sel50, sel100, freqsel;
  156. u32 mask, val;
  157. int ret;
  158. /* Disable delay chain mode */
  159. regmap_update_bits(sdhci_am654->base, PHY_CTRL5,
  160. SELDLYTXCLK_MASK | SELDLYRXCLK_MASK, 0);
  161. if (sdhci_am654->flags & FREQSEL_2_BIT) {
  162. switch (clock) {
  163. case 200000000:
  164. sel50 = 0;
  165. sel100 = 0;
  166. break;
  167. case 100000000:
  168. sel50 = 0;
  169. sel100 = 1;
  170. break;
  171. default:
  172. sel50 = 1;
  173. sel100 = 0;
  174. }
  175. /* Configure PHY DLL frequency */
  176. mask = SEL50_MASK | SEL100_MASK;
  177. val = (sel50 << SEL50_SHIFT) | (sel100 << SEL100_SHIFT);
  178. regmap_update_bits(sdhci_am654->base, PHY_CTRL5, mask, val);
  179. } else {
  180. switch (clock) {
  181. case 200000000:
  182. freqsel = 0x0;
  183. break;
  184. default:
  185. freqsel = 0x4;
  186. }
  187. regmap_update_bits(sdhci_am654->base, PHY_CTRL5, FREQSEL_MASK,
  188. freqsel << FREQSEL_SHIFT);
  189. }
  190. /* Configure DLL TRIM */
  191. mask = DLL_TRIM_ICP_MASK;
  192. val = sdhci_am654->trm_icp << DLL_TRIM_ICP_SHIFT;
  193. /* Configure DLL driver strength */
  194. mask |= DR_TY_MASK;
  195. val |= sdhci_am654->drv_strength << DR_TY_SHIFT;
  196. regmap_update_bits(sdhci_am654->base, PHY_CTRL1, mask, val);
  197. /* Enable DLL */
  198. regmap_update_bits(sdhci_am654->base, PHY_CTRL1, ENDLL_MASK,
  199. 0x1 << ENDLL_SHIFT);
  200. /*
  201. * Poll for DLL ready. Use a one second timeout.
  202. * Works in all experiments done so far
  203. */
  204. ret = regmap_read_poll_timeout(sdhci_am654->base, PHY_STAT1, val,
  205. val & DLLRDY_MASK, 1000, 1000000);
  206. if (ret) {
  207. dev_err(mmc_dev(host->mmc), "DLL failed to relock\n");
  208. return;
  209. }
  210. }
  211. static void sdhci_am654_write_itapdly(struct sdhci_am654_data *sdhci_am654,
  212. u32 itapdly)
  213. {
  214. /* Set ITAPCHGWIN before writing to ITAPDLY */
  215. regmap_update_bits(sdhci_am654->base, PHY_CTRL4, ITAPCHGWIN_MASK,
  216. 1 << ITAPCHGWIN_SHIFT);
  217. regmap_update_bits(sdhci_am654->base, PHY_CTRL4, ITAPDLYSEL_MASK,
  218. itapdly << ITAPDLYSEL_SHIFT);
  219. regmap_update_bits(sdhci_am654->base, PHY_CTRL4, ITAPCHGWIN_MASK, 0);
  220. }
  221. static void sdhci_am654_setup_delay_chain(struct sdhci_am654_data *sdhci_am654,
  222. unsigned char timing)
  223. {
  224. u32 mask, val;
  225. regmap_update_bits(sdhci_am654->base, PHY_CTRL1, ENDLL_MASK, 0);
  226. val = 1 << SELDLYTXCLK_SHIFT | 1 << SELDLYRXCLK_SHIFT;
  227. mask = SELDLYTXCLK_MASK | SELDLYRXCLK_MASK;
  228. regmap_update_bits(sdhci_am654->base, PHY_CTRL5, mask, val);
  229. sdhci_am654_write_itapdly(sdhci_am654,
  230. sdhci_am654->itap_del_sel[timing]);
  231. }
  232. static void sdhci_am654_set_clock(struct sdhci_host *host, unsigned int clock)
  233. {
  234. struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
  235. struct sdhci_am654_data *sdhci_am654 = sdhci_pltfm_priv(pltfm_host);
  236. unsigned char timing = host->mmc->ios.timing;
  237. u32 otap_del_sel;
  238. u32 otap_del_ena;
  239. u32 mask, val;
  240. regmap_update_bits(sdhci_am654->base, PHY_CTRL1, ENDLL_MASK, 0);
  241. sdhci_set_clock(host, clock);
  242. /* Setup DLL Output TAP delay */
  243. if (sdhci_am654->legacy_otapdly)
  244. otap_del_sel = sdhci_am654->otap_del_sel[0];
  245. else
  246. otap_del_sel = sdhci_am654->otap_del_sel[timing];
  247. otap_del_ena = (timing > MMC_TIMING_UHS_SDR25) ? 1 : 0;
  248. mask = OTAPDLYENA_MASK | OTAPDLYSEL_MASK;
  249. val = (otap_del_ena << OTAPDLYENA_SHIFT) |
  250. (otap_del_sel << OTAPDLYSEL_SHIFT);
  251. /* Write to STRBSEL for HS400 speed mode */
  252. if (timing == MMC_TIMING_MMC_HS400) {
  253. if (sdhci_am654->flags & STRBSEL_4_BIT)
  254. mask |= STRBSEL_4BIT_MASK;
  255. else
  256. mask |= STRBSEL_8BIT_MASK;
  257. val |= sdhci_am654->strb_sel << STRBSEL_SHIFT;
  258. }
  259. regmap_update_bits(sdhci_am654->base, PHY_CTRL4, mask, val);
  260. if (timing > MMC_TIMING_UHS_SDR25 && clock >= CLOCK_TOO_SLOW_HZ)
  261. sdhci_am654_setup_dll(host, clock);
  262. else
  263. sdhci_am654_setup_delay_chain(sdhci_am654, timing);
  264. regmap_update_bits(sdhci_am654->base, PHY_CTRL5, CLKBUFSEL_MASK,
  265. sdhci_am654->clkbuf_sel);
  266. }
  267. static void sdhci_j721e_4bit_set_clock(struct sdhci_host *host,
  268. unsigned int clock)
  269. {
  270. struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
  271. struct sdhci_am654_data *sdhci_am654 = sdhci_pltfm_priv(pltfm_host);
  272. unsigned char timing = host->mmc->ios.timing;
  273. u32 otap_del_sel;
  274. u32 mask, val;
  275. /* Setup DLL Output TAP delay */
  276. if (sdhci_am654->legacy_otapdly)
  277. otap_del_sel = sdhci_am654->otap_del_sel[0];
  278. else
  279. otap_del_sel = sdhci_am654->otap_del_sel[timing];
  280. mask = OTAPDLYENA_MASK | OTAPDLYSEL_MASK;
  281. val = (0x1 << OTAPDLYENA_SHIFT) |
  282. (otap_del_sel << OTAPDLYSEL_SHIFT);
  283. regmap_update_bits(sdhci_am654->base, PHY_CTRL4, mask, val);
  284. regmap_update_bits(sdhci_am654->base, PHY_CTRL5, CLKBUFSEL_MASK,
  285. sdhci_am654->clkbuf_sel);
  286. sdhci_set_clock(host, clock);
  287. }
  288. static u8 sdhci_am654_write_power_on(struct sdhci_host *host, u8 val, int reg)
  289. {
  290. writeb(val, host->ioaddr + reg);
  291. usleep_range(1000, 10000);
  292. return readb(host->ioaddr + reg);
  293. }
  294. #define MAX_POWER_ON_TIMEOUT 1500000 /* us */
  295. static void sdhci_am654_write_b(struct sdhci_host *host, u8 val, int reg)
  296. {
  297. unsigned char timing = host->mmc->ios.timing;
  298. u8 pwr;
  299. int ret;
  300. if (reg == SDHCI_HOST_CONTROL) {
  301. switch (timing) {
  302. /*
  303. * According to the data manual, HISPD bit
  304. * should not be set in these speed modes.
  305. */
  306. case MMC_TIMING_SD_HS:
  307. case MMC_TIMING_MMC_HS:
  308. val &= ~SDHCI_CTRL_HISPD;
  309. }
  310. }
  311. writeb(val, host->ioaddr + reg);
  312. if (reg == SDHCI_POWER_CONTROL && (val & SDHCI_POWER_ON)) {
  313. /*
  314. * Power on will not happen until the card detect debounce
  315. * timer expires. Wait at least 1.5 seconds for the power on
  316. * bit to be set
  317. */
  318. ret = read_poll_timeout(sdhci_am654_write_power_on, pwr,
  319. pwr & SDHCI_POWER_ON, 0,
  320. MAX_POWER_ON_TIMEOUT, false, host, val,
  321. reg);
  322. if (ret)
  323. dev_info(mmc_dev(host->mmc), "Power on failed\n");
  324. }
  325. }
  326. static void sdhci_am654_reset(struct sdhci_host *host, u8 mask)
  327. {
  328. u8 ctrl;
  329. struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
  330. struct sdhci_am654_data *sdhci_am654 = sdhci_pltfm_priv(pltfm_host);
  331. sdhci_and_cqhci_reset(host, mask);
  332. if (sdhci_am654->quirks & SDHCI_AM654_QUIRK_FORCE_CDTEST) {
  333. ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL);
  334. ctrl |= SDHCI_CTRL_CDTEST_INS | SDHCI_CTRL_CDTEST_EN;
  335. sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL);
  336. }
  337. }
  338. static int sdhci_am654_execute_tuning(struct mmc_host *mmc, u32 opcode)
  339. {
  340. struct sdhci_host *host = mmc_priv(mmc);
  341. int err = sdhci_execute_tuning(mmc, opcode);
  342. if (err)
  343. return err;
  344. /*
  345. * Tuning data remains in the buffer after tuning.
  346. * Do a command and data reset to get rid of it
  347. */
  348. sdhci_reset(host, SDHCI_RESET_CMD | SDHCI_RESET_DATA);
  349. return 0;
  350. }
  351. static u32 sdhci_am654_cqhci_irq(struct sdhci_host *host, u32 intmask)
  352. {
  353. int cmd_error = 0;
  354. int data_error = 0;
  355. if (!sdhci_cqe_irq(host, intmask, &cmd_error, &data_error))
  356. return intmask;
  357. cqhci_irq(host->mmc, intmask, cmd_error, data_error);
  358. return 0;
  359. }
  360. #define ITAP_MAX 32
  361. static int sdhci_am654_platform_execute_tuning(struct sdhci_host *host,
  362. u32 opcode)
  363. {
  364. struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
  365. struct sdhci_am654_data *sdhci_am654 = sdhci_pltfm_priv(pltfm_host);
  366. int cur_val, prev_val = 1, fail_len = 0, pass_window = 0, pass_len;
  367. u32 itap;
  368. /* Enable ITAPDLY */
  369. regmap_update_bits(sdhci_am654->base, PHY_CTRL4, ITAPDLYENA_MASK,
  370. 1 << ITAPDLYENA_SHIFT);
  371. for (itap = 0; itap < ITAP_MAX; itap++) {
  372. sdhci_am654_write_itapdly(sdhci_am654, itap);
  373. cur_val = !mmc_send_tuning(host->mmc, opcode, NULL);
  374. if (cur_val && !prev_val)
  375. pass_window = itap;
  376. if (!cur_val)
  377. fail_len++;
  378. prev_val = cur_val;
  379. }
  380. /*
  381. * Having determined the length of the failing window and start of
  382. * the passing window calculate the length of the passing window and
  383. * set the final value halfway through it considering the range as a
  384. * circular buffer
  385. */
  386. pass_len = ITAP_MAX - fail_len;
  387. itap = (pass_window + (pass_len >> 1)) % ITAP_MAX;
  388. sdhci_am654_write_itapdly(sdhci_am654, itap);
  389. return 0;
  390. }
  391. static struct sdhci_ops sdhci_am654_ops = {
  392. .platform_execute_tuning = sdhci_am654_platform_execute_tuning,
  393. .get_max_clock = sdhci_pltfm_clk_get_max_clock,
  394. .get_timeout_clock = sdhci_pltfm_clk_get_max_clock,
  395. .set_uhs_signaling = sdhci_set_uhs_signaling,
  396. .set_bus_width = sdhci_set_bus_width,
  397. .set_power = sdhci_set_power_and_bus_voltage,
  398. .set_clock = sdhci_am654_set_clock,
  399. .write_b = sdhci_am654_write_b,
  400. .irq = sdhci_am654_cqhci_irq,
  401. .reset = sdhci_and_cqhci_reset,
  402. };
  403. static const struct sdhci_pltfm_data sdhci_am654_pdata = {
  404. .ops = &sdhci_am654_ops,
  405. .quirks = SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12,
  406. .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN,
  407. };
  408. static const struct sdhci_am654_driver_data sdhci_am654_sr1_drvdata = {
  409. .pdata = &sdhci_am654_pdata,
  410. .flags = IOMUX_PRESENT | FREQSEL_2_BIT | STRBSEL_4_BIT | DLL_PRESENT |
  411. DLL_CALIB,
  412. };
  413. static const struct sdhci_am654_driver_data sdhci_am654_drvdata = {
  414. .pdata = &sdhci_am654_pdata,
  415. .flags = IOMUX_PRESENT | FREQSEL_2_BIT | STRBSEL_4_BIT | DLL_PRESENT,
  416. };
  417. static struct sdhci_ops sdhci_j721e_8bit_ops = {
  418. .platform_execute_tuning = sdhci_am654_platform_execute_tuning,
  419. .get_max_clock = sdhci_pltfm_clk_get_max_clock,
  420. .get_timeout_clock = sdhci_pltfm_clk_get_max_clock,
  421. .set_uhs_signaling = sdhci_set_uhs_signaling,
  422. .set_bus_width = sdhci_set_bus_width,
  423. .set_power = sdhci_set_power_and_bus_voltage,
  424. .set_clock = sdhci_am654_set_clock,
  425. .write_b = sdhci_am654_write_b,
  426. .irq = sdhci_am654_cqhci_irq,
  427. .reset = sdhci_and_cqhci_reset,
  428. };
  429. static const struct sdhci_pltfm_data sdhci_j721e_8bit_pdata = {
  430. .ops = &sdhci_j721e_8bit_ops,
  431. .quirks = SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12,
  432. .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN,
  433. };
  434. static const struct sdhci_am654_driver_data sdhci_j721e_8bit_drvdata = {
  435. .pdata = &sdhci_j721e_8bit_pdata,
  436. .flags = DLL_PRESENT | DLL_CALIB,
  437. };
  438. static struct sdhci_ops sdhci_j721e_4bit_ops = {
  439. .platform_execute_tuning = sdhci_am654_platform_execute_tuning,
  440. .get_max_clock = sdhci_pltfm_clk_get_max_clock,
  441. .get_timeout_clock = sdhci_pltfm_clk_get_max_clock,
  442. .set_uhs_signaling = sdhci_set_uhs_signaling,
  443. .set_bus_width = sdhci_set_bus_width,
  444. .set_power = sdhci_set_power_and_bus_voltage,
  445. .set_clock = sdhci_j721e_4bit_set_clock,
  446. .write_b = sdhci_am654_write_b,
  447. .irq = sdhci_am654_cqhci_irq,
  448. .reset = sdhci_am654_reset,
  449. };
  450. static const struct sdhci_pltfm_data sdhci_j721e_4bit_pdata = {
  451. .ops = &sdhci_j721e_4bit_ops,
  452. .quirks = SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12,
  453. .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN,
  454. };
  455. static const struct sdhci_am654_driver_data sdhci_j721e_4bit_drvdata = {
  456. .pdata = &sdhci_j721e_4bit_pdata,
  457. .flags = IOMUX_PRESENT,
  458. };
  459. static const struct soc_device_attribute sdhci_am654_devices[] = {
  460. { .family = "AM65X",
  461. .revision = "SR1.0",
  462. .data = &sdhci_am654_sr1_drvdata
  463. },
  464. {/* sentinel */}
  465. };
  466. static void sdhci_am654_dumpregs(struct mmc_host *mmc)
  467. {
  468. sdhci_dumpregs(mmc_priv(mmc));
  469. }
  470. static const struct cqhci_host_ops sdhci_am654_cqhci_ops = {
  471. .enable = sdhci_cqe_enable,
  472. .disable = sdhci_cqe_disable,
  473. .dumpregs = sdhci_am654_dumpregs,
  474. };
  475. static int sdhci_am654_cqe_add_host(struct sdhci_host *host)
  476. {
  477. struct cqhci_host *cq_host;
  478. cq_host = devm_kzalloc(mmc_dev(host->mmc), sizeof(struct cqhci_host),
  479. GFP_KERNEL);
  480. if (!cq_host)
  481. return -ENOMEM;
  482. cq_host->mmio = host->ioaddr + SDHCI_AM654_CQE_BASE_ADDR;
  483. cq_host->quirks |= CQHCI_QUIRK_SHORT_TXFR_DESC_SZ;
  484. cq_host->caps |= CQHCI_TASK_DESC_SZ_128;
  485. cq_host->ops = &sdhci_am654_cqhci_ops;
  486. host->mmc->caps2 |= MMC_CAP2_CQE;
  487. return cqhci_init(cq_host, host->mmc, 1);
  488. }
  489. static int sdhci_am654_get_otap_delay(struct sdhci_host *host,
  490. struct sdhci_am654_data *sdhci_am654)
  491. {
  492. struct device *dev = mmc_dev(host->mmc);
  493. int i;
  494. int ret;
  495. ret = device_property_read_u32(dev, td[MMC_TIMING_LEGACY].otap_binding,
  496. &sdhci_am654->otap_del_sel[MMC_TIMING_LEGACY]);
  497. if (ret) {
  498. /*
  499. * ti,otap-del-sel-legacy is mandatory, look for old binding
  500. * if not found.
  501. */
  502. ret = device_property_read_u32(dev, "ti,otap-del-sel",
  503. &sdhci_am654->otap_del_sel[0]);
  504. if (ret) {
  505. dev_err(dev, "Couldn't find otap-del-sel\n");
  506. return ret;
  507. }
  508. dev_info(dev, "Using legacy binding ti,otap-del-sel\n");
  509. sdhci_am654->legacy_otapdly = true;
  510. return 0;
  511. }
  512. for (i = MMC_TIMING_LEGACY; i <= MMC_TIMING_MMC_HS400; i++) {
  513. ret = device_property_read_u32(dev, td[i].otap_binding,
  514. &sdhci_am654->otap_del_sel[i]);
  515. if (ret) {
  516. dev_dbg(dev, "Couldn't find %s\n",
  517. td[i].otap_binding);
  518. /*
  519. * Remove the corresponding capability
  520. * if an otap-del-sel value is not found
  521. */
  522. if (i <= MMC_TIMING_MMC_DDR52)
  523. host->mmc->caps &= ~td[i].capability;
  524. else
  525. host->mmc->caps2 &= ~td[i].capability;
  526. }
  527. if (td[i].itap_binding)
  528. device_property_read_u32(dev, td[i].itap_binding,
  529. &sdhci_am654->itap_del_sel[i]);
  530. }
  531. return 0;
  532. }
  533. static int sdhci_am654_init(struct sdhci_host *host)
  534. {
  535. struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
  536. struct sdhci_am654_data *sdhci_am654 = sdhci_pltfm_priv(pltfm_host);
  537. u32 ctl_cfg_2 = 0;
  538. u32 mask;
  539. u32 val;
  540. int ret;
  541. /* Reset OTAP to default value */
  542. mask = OTAPDLYENA_MASK | OTAPDLYSEL_MASK;
  543. regmap_update_bits(sdhci_am654->base, PHY_CTRL4, mask, 0x0);
  544. if (sdhci_am654->flags & DLL_CALIB) {
  545. regmap_read(sdhci_am654->base, PHY_STAT1, &val);
  546. if (~val & CALDONE_MASK) {
  547. /* Calibrate IO lines */
  548. regmap_update_bits(sdhci_am654->base, PHY_CTRL1,
  549. PDB_MASK, PDB_MASK);
  550. ret = regmap_read_poll_timeout(sdhci_am654->base,
  551. PHY_STAT1, val,
  552. val & CALDONE_MASK,
  553. 1, 20);
  554. if (ret)
  555. return ret;
  556. }
  557. }
  558. /* Enable pins by setting IO mux to 0 */
  559. if (sdhci_am654->flags & IOMUX_PRESENT)
  560. regmap_update_bits(sdhci_am654->base, PHY_CTRL1,
  561. IOMUX_ENABLE_MASK, 0);
  562. /* Set slot type based on SD or eMMC */
  563. if (host->mmc->caps & MMC_CAP_NONREMOVABLE)
  564. ctl_cfg_2 = SLOTTYPE_EMBEDDED;
  565. regmap_update_bits(sdhci_am654->base, CTL_CFG_2, SLOTTYPE_MASK,
  566. ctl_cfg_2);
  567. /* Enable tuning for SDR50 */
  568. regmap_update_bits(sdhci_am654->base, CTL_CFG_3, TUNINGFORSDR50_MASK,
  569. TUNINGFORSDR50_MASK);
  570. ret = sdhci_setup_host(host);
  571. if (ret)
  572. return ret;
  573. ret = sdhci_am654_cqe_add_host(host);
  574. if (ret)
  575. goto err_cleanup_host;
  576. ret = sdhci_am654_get_otap_delay(host, sdhci_am654);
  577. if (ret)
  578. goto err_cleanup_host;
  579. ret = __sdhci_add_host(host);
  580. if (ret)
  581. goto err_cleanup_host;
  582. return 0;
  583. err_cleanup_host:
  584. sdhci_cleanup_host(host);
  585. return ret;
  586. }
  587. static int sdhci_am654_get_of_property(struct platform_device *pdev,
  588. struct sdhci_am654_data *sdhci_am654)
  589. {
  590. struct device *dev = &pdev->dev;
  591. int drv_strength;
  592. int ret;
  593. if (sdhci_am654->flags & DLL_PRESENT) {
  594. ret = device_property_read_u32(dev, "ti,trm-icp",
  595. &sdhci_am654->trm_icp);
  596. if (ret)
  597. return ret;
  598. ret = device_property_read_u32(dev, "ti,driver-strength-ohm",
  599. &drv_strength);
  600. if (ret)
  601. return ret;
  602. switch (drv_strength) {
  603. case 50:
  604. sdhci_am654->drv_strength = DRIVER_STRENGTH_50_OHM;
  605. break;
  606. case 33:
  607. sdhci_am654->drv_strength = DRIVER_STRENGTH_33_OHM;
  608. break;
  609. case 66:
  610. sdhci_am654->drv_strength = DRIVER_STRENGTH_66_OHM;
  611. break;
  612. case 100:
  613. sdhci_am654->drv_strength = DRIVER_STRENGTH_100_OHM;
  614. break;
  615. case 40:
  616. sdhci_am654->drv_strength = DRIVER_STRENGTH_40_OHM;
  617. break;
  618. default:
  619. dev_err(dev, "Invalid driver strength\n");
  620. return -EINVAL;
  621. }
  622. }
  623. device_property_read_u32(dev, "ti,strobe-sel", &sdhci_am654->strb_sel);
  624. device_property_read_u32(dev, "ti,clkbuf-sel",
  625. &sdhci_am654->clkbuf_sel);
  626. if (device_property_read_bool(dev, "ti,fails-without-test-cd"))
  627. sdhci_am654->quirks |= SDHCI_AM654_QUIRK_FORCE_CDTEST;
  628. sdhci_get_of_property(pdev);
  629. return 0;
  630. }
  631. static const struct of_device_id sdhci_am654_of_match[] = {
  632. {
  633. .compatible = "ti,am654-sdhci-5.1",
  634. .data = &sdhci_am654_drvdata,
  635. },
  636. {
  637. .compatible = "ti,j721e-sdhci-8bit",
  638. .data = &sdhci_j721e_8bit_drvdata,
  639. },
  640. {
  641. .compatible = "ti,j721e-sdhci-4bit",
  642. .data = &sdhci_j721e_4bit_drvdata,
  643. },
  644. {
  645. .compatible = "ti,am64-sdhci-8bit",
  646. .data = &sdhci_j721e_8bit_drvdata,
  647. },
  648. {
  649. .compatible = "ti,am64-sdhci-4bit",
  650. .data = &sdhci_j721e_4bit_drvdata,
  651. },
  652. {
  653. .compatible = "ti,am62-sdhci",
  654. .data = &sdhci_j721e_4bit_drvdata,
  655. },
  656. { /* sentinel */ }
  657. };
  658. MODULE_DEVICE_TABLE(of, sdhci_am654_of_match);
  659. static int sdhci_am654_probe(struct platform_device *pdev)
  660. {
  661. const struct sdhci_am654_driver_data *drvdata;
  662. const struct soc_device_attribute *soc;
  663. struct sdhci_pltfm_host *pltfm_host;
  664. struct sdhci_am654_data *sdhci_am654;
  665. const struct of_device_id *match;
  666. struct sdhci_host *host;
  667. struct clk *clk_xin;
  668. struct device *dev = &pdev->dev;
  669. void __iomem *base;
  670. int ret;
  671. match = of_match_node(sdhci_am654_of_match, pdev->dev.of_node);
  672. drvdata = match->data;
  673. /* Update drvdata based on SoC revision */
  674. soc = soc_device_match(sdhci_am654_devices);
  675. if (soc && soc->data)
  676. drvdata = soc->data;
  677. host = sdhci_pltfm_init(pdev, drvdata->pdata, sizeof(*sdhci_am654));
  678. if (IS_ERR(host))
  679. return PTR_ERR(host);
  680. pltfm_host = sdhci_priv(host);
  681. sdhci_am654 = sdhci_pltfm_priv(pltfm_host);
  682. sdhci_am654->flags = drvdata->flags;
  683. clk_xin = devm_clk_get(dev, "clk_xin");
  684. if (IS_ERR(clk_xin)) {
  685. dev_err(dev, "clk_xin clock not found.\n");
  686. ret = PTR_ERR(clk_xin);
  687. goto err_pltfm_free;
  688. }
  689. pltfm_host->clk = clk_xin;
  690. /* Clocks are enabled using pm_runtime */
  691. pm_runtime_enable(dev);
  692. ret = pm_runtime_resume_and_get(dev);
  693. if (ret)
  694. goto pm_runtime_disable;
  695. base = devm_platform_ioremap_resource(pdev, 1);
  696. if (IS_ERR(base)) {
  697. ret = PTR_ERR(base);
  698. goto pm_runtime_put;
  699. }
  700. sdhci_am654->base = devm_regmap_init_mmio(dev, base,
  701. &sdhci_am654_regmap_config);
  702. if (IS_ERR(sdhci_am654->base)) {
  703. dev_err(dev, "Failed to initialize regmap\n");
  704. ret = PTR_ERR(sdhci_am654->base);
  705. goto pm_runtime_put;
  706. }
  707. ret = sdhci_am654_get_of_property(pdev, sdhci_am654);
  708. if (ret)
  709. goto pm_runtime_put;
  710. ret = mmc_of_parse(host->mmc);
  711. if (ret) {
  712. dev_err(dev, "parsing dt failed (%d)\n", ret);
  713. goto pm_runtime_put;
  714. }
  715. host->mmc_host_ops.execute_tuning = sdhci_am654_execute_tuning;
  716. ret = sdhci_am654_init(host);
  717. if (ret)
  718. goto pm_runtime_put;
  719. return 0;
  720. pm_runtime_put:
  721. pm_runtime_put_sync(dev);
  722. pm_runtime_disable:
  723. pm_runtime_disable(dev);
  724. err_pltfm_free:
  725. sdhci_pltfm_free(pdev);
  726. return ret;
  727. }
  728. static int sdhci_am654_remove(struct platform_device *pdev)
  729. {
  730. struct sdhci_host *host = platform_get_drvdata(pdev);
  731. int ret;
  732. sdhci_remove_host(host, true);
  733. ret = pm_runtime_put_sync(&pdev->dev);
  734. if (ret < 0)
  735. return ret;
  736. pm_runtime_disable(&pdev->dev);
  737. sdhci_pltfm_free(pdev);
  738. return 0;
  739. }
  740. static struct platform_driver sdhci_am654_driver = {
  741. .driver = {
  742. .name = "sdhci-am654",
  743. .probe_type = PROBE_PREFER_ASYNCHRONOUS,
  744. .of_match_table = sdhci_am654_of_match,
  745. },
  746. .probe = sdhci_am654_probe,
  747. .remove = sdhci_am654_remove,
  748. };
  749. module_platform_driver(sdhci_am654_driver);
  750. MODULE_DESCRIPTION("Driver for SDHCI Controller on TI's AM654 devices");
  751. MODULE_AUTHOR("Faiz Abbas <[email protected]>");
  752. MODULE_LICENSE("GPL");