1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (C) 2018 Texas Instruments Incorporated - http://www.ti.com/
5 * Texas Instruments' K3 SD Host Controller Interface
13 #include <power-domain.h>
17 #include <dm/device_compat.h>
18 #include <linux/bitops.h>
19 #include <linux/err.h>
21 /* CTL_CFG Registers */
22 #define CTL_CFG_2 0x14
24 #define SLOTTYPE_MASK GENMASK(31, 30)
25 #define SLOTTYPE_EMBEDDED BIT(30)
28 #define PHY_CTRL1 0x100
29 #define PHY_CTRL2 0x104
30 #define PHY_CTRL3 0x108
31 #define PHY_CTRL4 0x10C
32 #define PHY_CTRL5 0x110
33 #define PHY_CTRL6 0x114
34 #define PHY_STAT1 0x130
35 #define PHY_STAT2 0x134
37 #define IOMUX_ENABLE_SHIFT 31
38 #define IOMUX_ENABLE_MASK BIT(IOMUX_ENABLE_SHIFT)
39 #define OTAPDLYENA_SHIFT 20
40 #define OTAPDLYENA_MASK BIT(OTAPDLYENA_SHIFT)
41 #define OTAPDLYSEL_SHIFT 12
42 #define OTAPDLYSEL_MASK GENMASK(15, 12)
43 #define STRBSEL_SHIFT 24
44 #define STRBSEL_4BIT_MASK GENMASK(27, 24)
45 #define STRBSEL_8BIT_MASK GENMASK(31, 24)
47 #define SEL50_MASK BIT(SEL50_SHIFT)
48 #define SEL100_SHIFT 9
49 #define SEL100_MASK BIT(SEL100_SHIFT)
50 #define FREQSEL_SHIFT 8
51 #define FREQSEL_MASK GENMASK(10, 8)
52 #define CLKBUFSEL_SHIFT 0
53 #define CLKBUFSEL_MASK GENMASK(2, 0)
54 #define DLL_TRIM_ICP_SHIFT 4
55 #define DLL_TRIM_ICP_MASK GENMASK(7, 4)
56 #define DR_TY_SHIFT 20
57 #define DR_TY_MASK GENMASK(22, 20)
59 #define ENDLL_MASK BIT(ENDLL_SHIFT)
60 #define DLLRDY_SHIFT 0
61 #define DLLRDY_MASK BIT(DLLRDY_SHIFT)
63 #define PDB_MASK BIT(PDB_SHIFT)
64 #define CALDONE_SHIFT 1
65 #define CALDONE_MASK BIT(CALDONE_SHIFT)
66 #define RETRIM_SHIFT 17
67 #define RETRIM_MASK BIT(RETRIM_SHIFT)
68 #define SELDLYTXCLK_SHIFT 17
69 #define SELDLYTXCLK_MASK BIT(SELDLYTXCLK_SHIFT)
70 #define SELDLYRXCLK_SHIFT 16
71 #define SELDLYRXCLK_MASK BIT(SELDLYRXCLK_SHIFT)
72 #define ITAPDLYSEL_SHIFT 0
73 #define ITAPDLYSEL_MASK GENMASK(4, 0)
74 #define ITAPDLYENA_SHIFT 8
75 #define ITAPDLYENA_MASK BIT(ITAPDLYENA_SHIFT)
76 #define ITAPCHGWIN_SHIFT 9
77 #define ITAPCHGWIN_MASK BIT(ITAPCHGWIN_SHIFT)
79 #define DRIVER_STRENGTH_50_OHM 0x0
80 #define DRIVER_STRENGTH_33_OHM 0x1
81 #define DRIVER_STRENGTH_66_OHM 0x2
82 #define DRIVER_STRENGTH_100_OHM 0x3
83 #define DRIVER_STRENGTH_40_OHM 0x4
85 #define AM654_SDHCI_MIN_FREQ 400000
86 #define CLOCK_TOO_SLOW_HZ 50000000
88 struct am654_sdhci_plat {
89 struct mmc_config cfg;
93 u32 otap_del_sel[MMC_MODES_END];
94 u32 itap_del_sel[MMC_MODES_END];
100 #define DLL_PRESENT BIT(0)
101 #define IOMUX_PRESENT BIT(1)
102 #define FREQSEL_2_BIT BIT(2)
103 #define STRBSEL_4_BIT BIT(3)
104 #define DLL_CALIB BIT(4)
108 const char *otap_binding;
109 const char *itap_binding;
113 static const struct timing_data td[] = {
114 [MMC_LEGACY] = {"ti,otap-del-sel-legacy",
115 "ti,itap-del-sel-legacy",
117 [MMC_HS] = {"ti,otap-del-sel-mmc-hs",
118 "ti,itap-del-sel-mms-hs",
120 [SD_HS] = {"ti,otap-del-sel-sd-hs",
121 "ti,itap-del-sel-sd-hs",
123 [UHS_SDR12] = {"ti,otap-del-sel-sdr12",
124 "ti,itap-del-sel-sdr12",
126 [UHS_SDR25] = {"ti,otap-del-sel-sdr25",
127 "ti,itap-del-sel-sdr25",
129 [UHS_SDR50] = {"ti,otap-del-sel-sdr50",
132 [UHS_SDR104] = {"ti,otap-del-sel-sdr104",
134 MMC_CAP(UHS_SDR104)},
135 [UHS_DDR50] = {"ti,otap-del-sel-ddr50",
138 [MMC_DDR_52] = {"ti,otap-del-sel-ddr52",
139 "ti,itap-del-sel-ddr52",
140 MMC_CAP(MMC_DDR_52)},
141 [MMC_HS_200] = {"ti,otap-del-sel-hs200",
143 MMC_CAP(MMC_HS_200)},
144 [MMC_HS_400] = {"ti,otap-del-sel-hs400",
146 MMC_CAP(MMC_HS_400)},
149 struct am654_driver_data {
150 const struct sdhci_ops *ops;
154 static int am654_sdhci_setup_dll(struct am654_sdhci_plat *plat,
157 int sel50, sel100, freqsel;
161 /* Disable delay chain mode */
162 regmap_update_bits(plat->base, PHY_CTRL5,
163 SELDLYTXCLK_MASK | SELDLYRXCLK_MASK, 0);
165 if (plat->flags & FREQSEL_2_BIT) {
180 /* Configure PHY DLL frequency */
181 mask = SEL50_MASK | SEL100_MASK;
182 val = (sel50 << SEL50_SHIFT) | (sel100 << SEL100_SHIFT);
183 regmap_update_bits(plat->base, PHY_CTRL5, mask, val);
192 regmap_update_bits(plat->base, PHY_CTRL5, FREQSEL_MASK,
193 freqsel << FREQSEL_SHIFT);
196 /* Configure DLL TRIM */
197 mask = DLL_TRIM_ICP_MASK;
198 val = plat->trm_icp << DLL_TRIM_ICP_SHIFT;
200 /* Configure DLL driver strength */
202 val |= plat->drv_strength << DR_TY_SHIFT;
203 regmap_update_bits(plat->base, PHY_CTRL1, mask, val);
206 regmap_update_bits(plat->base, PHY_CTRL1, ENDLL_MASK,
209 * Poll for DLL ready. Use a one second timeout.
210 * Works in all experiments done so far
212 ret = regmap_read_poll_timeout(plat->base, PHY_STAT1, val,
213 val & DLLRDY_MASK, 1000, 1000000);
218 static void am654_sdhci_write_itapdly(struct am654_sdhci_plat *plat,
221 /* Set ITAPCHGWIN before writing to ITAPDLY */
222 regmap_update_bits(plat->base, PHY_CTRL4, ITAPCHGWIN_MASK,
223 1 << ITAPCHGWIN_SHIFT);
224 regmap_update_bits(plat->base, PHY_CTRL4, ITAPDLYSEL_MASK,
225 itapdly << ITAPDLYSEL_SHIFT);
226 regmap_update_bits(plat->base, PHY_CTRL4, ITAPCHGWIN_MASK, 0);
229 static void am654_sdhci_setup_delay_chain(struct am654_sdhci_plat *plat,
234 val = 1 << SELDLYTXCLK_SHIFT | 1 << SELDLYRXCLK_SHIFT;
235 mask = SELDLYTXCLK_MASK | SELDLYRXCLK_MASK;
236 regmap_update_bits(plat->base, PHY_CTRL5, mask, val);
238 am654_sdhci_write_itapdly(plat, plat->itap_del_sel[mode]);
241 static int am654_sdhci_set_ios_post(struct sdhci_host *host)
243 struct udevice *dev = host->mmc->dev;
244 struct am654_sdhci_plat *plat = dev_get_plat(dev);
245 unsigned int speed = host->mmc->clock;
246 int mode = host->mmc->selected_mode;
251 /* Reset SD Clock Enable */
252 val = sdhci_readw(host, SDHCI_CLOCK_CONTROL);
253 val &= ~SDHCI_CLOCK_CARD_EN;
254 sdhci_writew(host, val, SDHCI_CLOCK_CONTROL);
256 regmap_update_bits(plat->base, PHY_CTRL1, ENDLL_MASK, 0);
259 sdhci_set_clock(host->mmc, speed);
261 /* switch phy back on */
262 otap_del_sel = plat->otap_del_sel[mode];
263 mask = OTAPDLYENA_MASK | OTAPDLYSEL_MASK;
264 val = (1 << OTAPDLYENA_SHIFT) |
265 (otap_del_sel << OTAPDLYSEL_SHIFT);
267 /* Write to STRBSEL for HS400 speed mode */
268 if (host->mmc->selected_mode == MMC_HS_400) {
269 if (plat->flags & STRBSEL_4_BIT)
270 mask |= STRBSEL_4BIT_MASK;
272 mask |= STRBSEL_8BIT_MASK;
274 val |= plat->strb_sel << STRBSEL_SHIFT;
277 regmap_update_bits(plat->base, PHY_CTRL4, mask, val);
279 if (mode > UHS_SDR25 && speed >= CLOCK_TOO_SLOW_HZ) {
280 ret = am654_sdhci_setup_dll(plat, speed);
284 am654_sdhci_setup_delay_chain(plat, mode);
287 regmap_update_bits(plat->base, PHY_CTRL5, CLKBUFSEL_MASK,
293 int am654_sdhci_init(struct am654_sdhci_plat *plat)
299 /* Reset OTAP to default value */
300 mask = OTAPDLYENA_MASK | OTAPDLYSEL_MASK;
301 regmap_update_bits(plat->base, PHY_CTRL4, mask, 0x0);
303 if (plat->flags & DLL_CALIB) {
304 regmap_read(plat->base, PHY_STAT1, &val);
305 if (~val & CALDONE_MASK) {
306 /* Calibrate IO lines */
307 regmap_update_bits(plat->base, PHY_CTRL1, PDB_MASK,
309 ret = regmap_read_poll_timeout(plat->base, PHY_STAT1,
310 val, val & CALDONE_MASK,
317 /* Enable pins by setting IO mux to 0 */
318 if (plat->flags & IOMUX_PRESENT)
319 regmap_update_bits(plat->base, PHY_CTRL1, IOMUX_ENABLE_MASK, 0);
321 /* Set slot type based on SD or eMMC */
322 if (plat->non_removable)
323 ctl_cfg_2 = SLOTTYPE_EMBEDDED;
325 regmap_update_bits(plat->base, CTL_CFG_2, SLOTTYPE_MASK, ctl_cfg_2);
330 #define MAX_SDCD_DEBOUNCE_TIME 2000
331 static int am654_sdhci_deferred_probe(struct sdhci_host *host)
333 struct udevice *dev = host->mmc->dev;
334 struct am654_sdhci_plat *plat = dev_get_plat(dev);
339 * The controller takes about 1 second to debounce the card detect line
340 * and doesn't let us power on until that time is up. Instead of waiting
341 * for 1 second at every stage, poll on the CARD_PRESENT bit upto a
342 * maximum of 2 seconds to be safe..
344 start = get_timer(0);
346 if (get_timer(start) > MAX_SDCD_DEBOUNCE_TIME)
349 val = mmc_getcd(host->mmc);
352 am654_sdhci_init(plat);
354 return sdhci_probe(dev);
357 static void am654_sdhci_write_b(struct sdhci_host *host, u8 val, int reg)
359 if (reg == SDHCI_HOST_CONTROL) {
360 switch (host->mmc->selected_mode) {
362 * According to the data manual, HISPD bit
363 * should not be set in these speed modes.
369 val &= ~SDHCI_CTRL_HISPD;
375 writeb(val, host->ioaddr + reg);
377 #ifdef MMC_SUPPORTS_TUNING
379 static int am654_sdhci_execute_tuning(struct mmc *mmc, u8 opcode)
381 struct udevice *dev = mmc->dev;
382 struct am654_sdhci_plat *plat = dev_get_plat(dev);
383 int cur_val, prev_val = 1, fail_len = 0, pass_window = 0, pass_len;
387 regmap_update_bits(plat->base, PHY_CTRL4, ITAPDLYENA_MASK,
388 1 << ITAPDLYENA_SHIFT);
390 for (itap = 0; itap < ITAP_MAX; itap++) {
391 am654_sdhci_write_itapdly(plat, itap);
393 cur_val = !mmc_send_tuning(mmc, opcode, NULL);
394 if (cur_val && !prev_val)
403 * Having determined the length of the failing window and start of
404 * the passing window calculate the length of the passing window and
405 * set the final value halfway through it considering the range as a
408 pass_len = ITAP_MAX - fail_len;
409 itap = (pass_window + (pass_len >> 1)) % ITAP_MAX;
410 am654_sdhci_write_itapdly(plat, itap);
415 const struct sdhci_ops am654_sdhci_ops = {
416 #ifdef MMC_SUPPORTS_TUNING
417 .platform_execute_tuning = am654_sdhci_execute_tuning,
419 .deferred_probe = am654_sdhci_deferred_probe,
420 .set_ios_post = &am654_sdhci_set_ios_post,
421 .set_control_reg = sdhci_set_control_reg,
422 .write_b = am654_sdhci_write_b,
425 const struct am654_driver_data am654_drv_data = {
426 .ops = &am654_sdhci_ops,
427 .flags = DLL_PRESENT | IOMUX_PRESENT | FREQSEL_2_BIT | STRBSEL_4_BIT,
430 const struct am654_driver_data am654_sr1_drv_data = {
431 .ops = &am654_sdhci_ops,
432 .flags = IOMUX_PRESENT | FREQSEL_2_BIT | DLL_PRESENT | DLL_CALIB |
436 const struct am654_driver_data j721e_8bit_drv_data = {
437 .ops = &am654_sdhci_ops,
438 .flags = DLL_PRESENT | DLL_CALIB,
441 static int j721e_4bit_sdhci_set_ios_post(struct sdhci_host *host)
443 struct udevice *dev = host->mmc->dev;
444 struct am654_sdhci_plat *plat = dev_get_plat(dev);
445 u32 otap_del_sel, mask, val;
447 otap_del_sel = plat->otap_del_sel[host->mmc->selected_mode];
448 mask = OTAPDLYENA_MASK | OTAPDLYSEL_MASK;
449 val = (1 << OTAPDLYENA_SHIFT) | (otap_del_sel << OTAPDLYSEL_SHIFT);
450 regmap_update_bits(plat->base, PHY_CTRL4, mask, val);
452 regmap_update_bits(plat->base, PHY_CTRL5, CLKBUFSEL_MASK,
458 const struct sdhci_ops j721e_4bit_sdhci_ops = {
459 #ifdef MMC_SUPPORTS_TUNING
460 .platform_execute_tuning = am654_sdhci_execute_tuning,
462 .deferred_probe = am654_sdhci_deferred_probe,
463 .set_ios_post = &j721e_4bit_sdhci_set_ios_post,
464 .set_control_reg = sdhci_set_control_reg,
465 .write_b = am654_sdhci_write_b,
468 const struct am654_driver_data j721e_4bit_drv_data = {
469 .ops = &j721e_4bit_sdhci_ops,
470 .flags = IOMUX_PRESENT,
473 static const struct am654_driver_data sdhci_am64_8bit_drvdata = {
474 .ops = &am654_sdhci_ops,
475 .flags = DLL_PRESENT | DLL_CALIB,
478 static const struct am654_driver_data sdhci_am64_4bit_drvdata = {
479 .ops = &j721e_4bit_sdhci_ops,
480 .flags = IOMUX_PRESENT,
483 const struct soc_attr am654_sdhci_soc_attr[] = {
484 { .family = "AM65X", .revision = "SR1.0", .data = &am654_sr1_drv_data},
488 static int sdhci_am654_get_otap_delay(struct udevice *dev,
489 struct mmc_config *cfg)
491 struct am654_sdhci_plat *plat = dev_get_plat(dev);
495 /* ti,otap-del-sel-legacy is mandatory */
496 ret = dev_read_u32(dev, "ti,otap-del-sel-legacy",
497 &plat->otap_del_sel[0]);
501 * Remove the corresponding capability if an otap-del-sel
504 for (i = MMC_HS; i <= MMC_HS_400; i++) {
505 ret = dev_read_u32(dev, td[i].otap_binding,
506 &plat->otap_del_sel[i]);
508 dev_dbg(dev, "Couldn't find %s\n", td[i].otap_binding);
510 * Remove the corresponding capability
511 * if an otap-del-sel value is not found
513 cfg->host_caps &= ~td[i].capability;
516 if (td[i].itap_binding)
517 dev_read_u32(dev, td[i].itap_binding,
518 &plat->itap_del_sel[i]);
524 static int am654_sdhci_probe(struct udevice *dev)
526 struct am654_driver_data *drv_data =
527 (struct am654_driver_data *)dev_get_driver_data(dev);
528 struct am654_sdhci_plat *plat = dev_get_plat(dev);
529 struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
530 struct sdhci_host *host = dev_get_priv(dev);
531 struct mmc_config *cfg = &plat->cfg;
532 const struct soc_attr *soc;
533 const struct am654_driver_data *soc_drv_data;
538 ret = clk_get_by_name(dev, "clk_xin", &clk);
540 dev_err(dev, "failed to get clock\n");
544 clock = clk_get_rate(&clk);
545 if (IS_ERR_VALUE(clock)) {
546 dev_err(dev, "failed to get rate\n");
550 host->max_clk = clock;
551 host->mmc = &plat->mmc;
552 host->mmc->dev = dev;
553 host->ops = drv_data->ops;
554 ret = sdhci_setup_cfg(cfg, host, cfg->f_max,
555 AM654_SDHCI_MIN_FREQ);
559 ret = sdhci_am654_get_otap_delay(dev, cfg);
563 /* Update ops based on SoC revision */
564 soc = soc_device_match(am654_sdhci_soc_attr);
565 if (soc && soc->data) {
566 soc_drv_data = soc->data;
567 host->ops = soc_drv_data->ops;
570 host->mmc->priv = host;
571 upriv->mmc = host->mmc;
573 regmap_init_mem_index(dev_ofnode(dev), &plat->base, 1);
578 static int am654_sdhci_of_to_plat(struct udevice *dev)
580 struct am654_sdhci_plat *plat = dev_get_plat(dev);
581 struct sdhci_host *host = dev_get_priv(dev);
582 struct mmc_config *cfg = &plat->cfg;
586 host->name = dev->name;
587 host->ioaddr = (void *)dev_read_addr(dev);
588 plat->non_removable = dev_read_bool(dev, "non-removable");
590 if (plat->flags & DLL_PRESENT) {
591 ret = dev_read_u32(dev, "ti,trm-icp", &plat->trm_icp);
595 ret = dev_read_u32(dev, "ti,driver-strength-ohm",
600 switch (drv_strength) {
602 plat->drv_strength = DRIVER_STRENGTH_50_OHM;
605 plat->drv_strength = DRIVER_STRENGTH_33_OHM;
608 plat->drv_strength = DRIVER_STRENGTH_66_OHM;
611 plat->drv_strength = DRIVER_STRENGTH_100_OHM;
614 plat->drv_strength = DRIVER_STRENGTH_40_OHM;
617 dev_err(dev, "Invalid driver strength\n");
622 dev_read_u32(dev, "ti,strobe-sel", &plat->strb_sel);
623 dev_read_u32(dev, "ti,clkbuf-sel", &plat->clkbuf_sel);
625 ret = mmc_of_parse(dev, cfg);
632 static int am654_sdhci_bind(struct udevice *dev)
634 struct am654_driver_data *drv_data =
635 (struct am654_driver_data *)dev_get_driver_data(dev);
636 struct am654_sdhci_plat *plat = dev_get_plat(dev);
637 const struct soc_attr *soc;
638 const struct am654_driver_data *soc_drv_data;
640 plat->flags = drv_data->flags;
642 /* Update flags based on SoC revision */
643 soc = soc_device_match(am654_sdhci_soc_attr);
644 if (soc && soc->data) {
645 soc_drv_data = soc->data;
646 plat->flags = soc_drv_data->flags;
649 return sdhci_bind(dev, &plat->mmc, &plat->cfg);
652 static const struct udevice_id am654_sdhci_ids[] = {
654 .compatible = "ti,am654-sdhci-5.1",
655 .data = (ulong)&am654_drv_data,
658 .compatible = "ti,j721e-sdhci-8bit",
659 .data = (ulong)&j721e_8bit_drv_data,
662 .compatible = "ti,j721e-sdhci-4bit",
663 .data = (ulong)&j721e_4bit_drv_data,
666 .compatible = "ti,am64-sdhci-8bit",
667 .data = (ulong)&sdhci_am64_8bit_drvdata,
670 .compatible = "ti,am64-sdhci-4bit",
671 .data = (ulong)&sdhci_am64_4bit_drvdata,
674 .compatible = "ti,am62-sdhci",
675 .data = (ulong)&sdhci_am64_4bit_drvdata,
680 U_BOOT_DRIVER(am654_sdhci_drv) = {
681 .name = "am654_sdhci",
683 .of_match = am654_sdhci_ids,
684 .of_to_plat = am654_sdhci_of_to_plat,
686 .bind = am654_sdhci_bind,
687 .probe = am654_sdhci_probe,
688 .priv_auto = sizeof(struct sdhci_host),
689 .plat_auto = sizeof(struct am654_sdhci_plat),