1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * MediaTek SD/MMC Card Interface driver 4 * 5 * Copyright (C) 2018 MediaTek Inc. 6 * Author: Weijie Gao <weijie.gao@mediatek.com> 7 */ 8 9 #include <clk.h> 10 #include <common.h> 11 #include <dm.h> 12 #include <mmc.h> 13 #include <errno.h> 14 #include <malloc.h> 15 #include <stdbool.h> 16 #include <asm/gpio.h> 17 #include <dm/pinctrl.h> 18 #include <linux/bitops.h> 19 #include <linux/io.h> 20 #include <linux/iopoll.h> 21 22 /* MSDC_CFG */ 23 #define MSDC_CFG_HS400_CK_MODE_EXT BIT(22) 24 #define MSDC_CFG_CKMOD_EXT_M 0x300000 25 #define MSDC_CFG_CKMOD_EXT_S 20 26 #define MSDC_CFG_CKDIV_EXT_M 0xfff00 27 #define MSDC_CFG_CKDIV_EXT_S 8 28 #define MSDC_CFG_HS400_CK_MODE BIT(18) 29 #define MSDC_CFG_CKMOD_M 0x30000 30 #define MSDC_CFG_CKMOD_S 16 31 #define MSDC_CFG_CKDIV_M 0xff00 32 #define MSDC_CFG_CKDIV_S 8 33 #define MSDC_CFG_CKSTB BIT(7) 34 #define MSDC_CFG_PIO BIT(3) 35 #define MSDC_CFG_RST BIT(2) 36 #define MSDC_CFG_CKPDN BIT(1) 37 #define MSDC_CFG_MODE BIT(0) 38 39 /* MSDC_IOCON */ 40 #define MSDC_IOCON_W_DSPL BIT(8) 41 #define MSDC_IOCON_DSPL BIT(2) 42 #define MSDC_IOCON_RSPL BIT(1) 43 44 /* MSDC_PS */ 45 #define MSDC_PS_DAT0 BIT(16) 46 #define MSDC_PS_CDDBCE_M 0xf000 47 #define MSDC_PS_CDDBCE_S 12 48 #define MSDC_PS_CDSTS BIT(1) 49 #define MSDC_PS_CDEN BIT(0) 50 51 /* #define MSDC_INT(EN) */ 52 #define MSDC_INT_ACMDRDY BIT(3) 53 #define MSDC_INT_ACMDTMO BIT(4) 54 #define MSDC_INT_ACMDCRCERR BIT(5) 55 #define MSDC_INT_CMDRDY BIT(8) 56 #define MSDC_INT_CMDTMO BIT(9) 57 #define MSDC_INT_RSPCRCERR BIT(10) 58 #define MSDC_INT_XFER_COMPL BIT(12) 59 #define MSDC_INT_DATTMO BIT(14) 60 #define MSDC_INT_DATCRCERR BIT(15) 61 62 /* MSDC_FIFOCS */ 63 #define MSDC_FIFOCS_CLR BIT(31) 64 #define MSDC_FIFOCS_TXCNT_M 0xff0000 65 #define MSDC_FIFOCS_TXCNT_S 16 66 #define MSDC_FIFOCS_RXCNT_M 0xff 67 #define MSDC_FIFOCS_RXCNT_S 0 68 69 /* #define SDC_CFG */ 70 #define SDC_CFG_DTOC_M 0xff000000 71 #define SDC_CFG_DTOC_S 24 72 #define SDC_CFG_SDIOIDE BIT(20) 73 #define SDC_CFG_SDIO BIT(19) 74 #define SDC_CFG_BUSWIDTH_M 0x30000 75 #define SDC_CFG_BUSWIDTH_S 16 76 77 /* SDC_CMD */ 78 #define SDC_CMD_BLK_LEN_M 0xfff0000 79 #define SDC_CMD_BLK_LEN_S 16 80 #define SDC_CMD_STOP BIT(14) 81 #define SDC_CMD_WR BIT(13) 82 #define SDC_CMD_DTYPE_M 0x1800 83 #define SDC_CMD_DTYPE_S 11 84 #define SDC_CMD_RSPTYP_M 0x380 85 #define SDC_CMD_RSPTYP_S 7 86 #define SDC_CMD_CMD_M 0x3f 87 #define SDC_CMD_CMD_S 0 88 89 /* SDC_STS */ 90 #define SDC_STS_CMDBUSY BIT(1) 91 #define SDC_STS_SDCBUSY BIT(0) 92 93 /* SDC_ADV_CFG0 */ 94 #define SDC_RX_ENHANCE_EN BIT(20) 95 96 /* PATCH_BIT0 */ 97 #define MSDC_INT_DAT_LATCH_CK_SEL_M 0x380 98 #define MSDC_INT_DAT_LATCH_CK_SEL_S 7 99 100 /* PATCH_BIT1 */ 101 #define MSDC_PB1_STOP_DLY_M 0xf00 102 #define MSDC_PB1_STOP_DLY_S 8 103 104 /* PATCH_BIT2 */ 105 #define MSDC_PB2_CRCSTSENSEL_M 0xe0000000 106 #define MSDC_PB2_CRCSTSENSEL_S 29 107 #define MSDC_PB2_CFGCRCSTS BIT(28) 108 #define MSDC_PB2_RESPSTSENSEL_M 0x70000 109 #define MSDC_PB2_RESPSTSENSEL_S 16 110 #define MSDC_PB2_CFGRESP BIT(15) 111 #define MSDC_PB2_RESPWAIT_M 0x0c 112 #define MSDC_PB2_RESPWAIT_S 2 113 114 /* PAD_TUNE */ 115 #define MSDC_PAD_TUNE_CMDRRDLY_M 0x7c00000 116 #define MSDC_PAD_TUNE_CMDRRDLY_S 22 117 #define MSDC_PAD_TUNE_CMD_SEL BIT(21) 118 #define MSDC_PAD_TUNE_CMDRDLY_M 0x1f0000 119 #define MSDC_PAD_TUNE_CMDRDLY_S 16 120 #define MSDC_PAD_TUNE_RXDLYSEL BIT(15) 121 #define MSDC_PAD_TUNE_RD_SEL BIT(13) 122 #define MSDC_PAD_TUNE_DATRRDLY_M 0x1f00 123 #define MSDC_PAD_TUNE_DATRRDLY_S 8 124 #define MSDC_PAD_TUNE_DATWRDLY_M 0x1f 125 #define MSDC_PAD_TUNE_DATWRDLY_S 0 126 127 /* EMMC50_CFG0 */ 128 #define EMMC50_CFG_CFCSTS_SEL BIT(4) 129 130 /* SDC_FIFO_CFG */ 131 #define SDC_FIFO_CFG_WRVALIDSEL BIT(24) 132 #define SDC_FIFO_CFG_RDVALIDSEL BIT(25) 133 134 /* SDC_CFG_BUSWIDTH */ 135 #define MSDC_BUS_1BITS 0x0 136 #define MSDC_BUS_4BITS 0x1 137 #define MSDC_BUS_8BITS 0x2 138 139 #define MSDC_FIFO_SIZE 128 140 141 #define PAD_DELAY_MAX 32 142 143 #define DEFAULT_CD_DEBOUNCE 8 144 145 #define CMD_INTS_MASK \ 146 (MSDC_INT_CMDRDY | MSDC_INT_RSPCRCERR | MSDC_INT_CMDTMO) 147 148 #define DATA_INTS_MASK \ 149 (MSDC_INT_XFER_COMPL | MSDC_INT_DATTMO | MSDC_INT_DATCRCERR) 150 151 /* Register offset */ 152 struct mtk_sd_regs { 153 u32 msdc_cfg; 154 u32 msdc_iocon; 155 u32 msdc_ps; 156 u32 msdc_int; 157 u32 msdc_inten; 158 u32 msdc_fifocs; 159 u32 msdc_txdata; 160 u32 msdc_rxdata; 161 u32 reserved0[4]; 162 u32 sdc_cfg; 163 u32 sdc_cmd; 164 u32 sdc_arg; 165 u32 sdc_sts; 166 u32 sdc_resp[4]; 167 u32 sdc_blk_num; 168 u32 sdc_vol_chg; 169 u32 sdc_csts; 170 u32 sdc_csts_en; 171 u32 sdc_datcrc_sts; 172 u32 sdc_adv_cfg0; 173 u32 reserved1[2]; 174 u32 emmc_cfg0; 175 u32 emmc_cfg1; 176 u32 emmc_sts; 177 u32 emmc_iocon; 178 u32 sd_acmd_resp; 179 u32 sd_acmd19_trg; 180 u32 sd_acmd19_sts; 181 u32 dma_sa_high4bit; 182 u32 dma_sa; 183 u32 dma_ca; 184 u32 dma_ctrl; 185 u32 dma_cfg; 186 u32 sw_dbg_sel; 187 u32 sw_dbg_out; 188 u32 dma_length; 189 u32 reserved2; 190 u32 patch_bit0; 191 u32 patch_bit1; 192 u32 patch_bit2; 193 u32 reserved3; 194 u32 dat0_tune_crc; 195 u32 dat1_tune_crc; 196 u32 dat2_tune_crc; 197 u32 dat3_tune_crc; 198 u32 cmd_tune_crc; 199 u32 sdio_tune_wind; 200 u32 reserved4[5]; 201 u32 pad_tune; 202 u32 pad_tune0; 203 u32 pad_tune1; 204 u32 dat_rd_dly[4]; 205 u32 reserved5[2]; 206 u32 hw_dbg_sel; 207 u32 main_ver; 208 u32 eco_ver; 209 u32 reserved6[27]; 210 u32 pad_ds_tune; 211 u32 reserved7[31]; 212 u32 emmc50_cfg0; 213 u32 reserved8[7]; 214 u32 sdc_fifo_cfg; 215 }; 216 217 struct msdc_compatible { 218 u8 clk_div_bits; 219 bool pad_tune0; 220 bool async_fifo; 221 bool data_tune; 222 bool busy_check; 223 bool stop_clk_fix; 224 bool enhance_rx; 225 }; 226 227 struct msdc_delay_phase { 228 u8 maxlen; 229 u8 start; 230 u8 final_phase; 231 }; 232 233 struct msdc_plat { 234 struct mmc_config cfg; 235 struct mmc mmc; 236 }; 237 238 struct msdc_tune_para { 239 u32 iocon; 240 u32 pad_tune; 241 }; 242 243 struct msdc_host { 244 struct mtk_sd_regs *base; 245 struct mmc *mmc; 246 247 struct msdc_compatible *dev_comp; 248 249 struct clk src_clk; /* for SD/MMC bus clock */ 250 struct clk h_clk; /* MSDC core clock */ 251 252 u32 src_clk_freq; /* source clock */ 253 u32 mclk; /* mmc framework required bus clock */ 254 u32 sclk; /* actual calculated bus clock */ 255 256 /* operation timeout clocks */ 257 u32 timeout_ns; 258 u32 timeout_clks; 259 260 /* tuning options */ 261 u32 hs400_ds_delay; 262 u32 hs200_cmd_int_delay; 263 u32 hs200_write_int_delay; 264 u32 latch_ck; 265 u32 r_smpl; /* sample edge */ 266 bool hs400_mode; 267 268 /* whether to use gpio detection or built-in hw detection */ 269 bool builtin_cd; 270 271 /* card detection / write protection GPIOs */ 272 #ifdef CONFIG_DM_GPIO 273 struct gpio_desc gpio_wp; 274 struct gpio_desc gpio_cd; 275 #endif 276 277 uint last_resp_type; 278 uint last_data_write; 279 280 enum bus_mode timing; 281 282 struct msdc_tune_para def_tune_para; 283 struct msdc_tune_para saved_tune_para; 284 }; 285 286 static void msdc_reset_hw(struct msdc_host *host) 287 { 288 u32 reg; 289 290 setbits_le32(&host->base->msdc_cfg, MSDC_CFG_RST); 291 292 readl_poll_timeout(&host->base->msdc_cfg, reg, 293 !(reg & MSDC_CFG_RST), 1000000); 294 } 295 296 static void msdc_fifo_clr(struct msdc_host *host) 297 { 298 u32 reg; 299 300 setbits_le32(&host->base->msdc_fifocs, MSDC_FIFOCS_CLR); 301 302 readl_poll_timeout(&host->base->msdc_fifocs, reg, 303 !(reg & MSDC_FIFOCS_CLR), 1000000); 304 } 305 306 static u32 msdc_fifo_rx_bytes(struct msdc_host *host) 307 { 308 return (readl(&host->base->msdc_fifocs) & 309 MSDC_FIFOCS_RXCNT_M) >> MSDC_FIFOCS_RXCNT_S; 310 } 311 312 static u32 msdc_fifo_tx_bytes(struct msdc_host *host) 313 { 314 return (readl(&host->base->msdc_fifocs) & 315 MSDC_FIFOCS_TXCNT_M) >> MSDC_FIFOCS_TXCNT_S; 316 } 317 318 static u32 msdc_cmd_find_resp(struct msdc_host *host, struct mmc_cmd *cmd) 319 { 320 u32 resp; 321 322 switch (cmd->resp_type) { 323 /* Actually, R1, R5, R6, R7 are the same */ 324 case MMC_RSP_R1: 325 resp = 0x1; 326 break; 327 case MMC_RSP_R1b: 328 resp = 0x7; 329 break; 330 case MMC_RSP_R2: 331 resp = 0x2; 332 break; 333 case MMC_RSP_R3: 334 resp = 0x3; 335 break; 336 case MMC_RSP_NONE: 337 default: 338 resp = 0x0; 339 break; 340 } 341 342 return resp; 343 } 344 345 static u32 msdc_cmd_prepare_raw_cmd(struct msdc_host *host, 346 struct mmc_cmd *cmd, 347 struct mmc_data *data) 348 { 349 u32 opcode = cmd->cmdidx; 350 u32 resp_type = msdc_cmd_find_resp(host, cmd); 351 uint blocksize = 0; 352 u32 dtype = 0; 353 u32 rawcmd = 0; 354 355 switch (opcode) { 356 case MMC_CMD_WRITE_MULTIPLE_BLOCK: 357 case MMC_CMD_READ_MULTIPLE_BLOCK: 358 dtype = 2; 359 break; 360 case MMC_CMD_WRITE_SINGLE_BLOCK: 361 case MMC_CMD_READ_SINGLE_BLOCK: 362 case SD_CMD_APP_SEND_SCR: 363 dtype = 1; 364 break; 365 case SD_CMD_SWITCH_FUNC: /* same as MMC_CMD_SWITCH */ 366 case SD_CMD_SEND_IF_COND: /* same as MMC_CMD_SEND_EXT_CSD */ 367 case SD_CMD_APP_SD_STATUS: /* same as MMC_CMD_SEND_STATUS */ 368 if (data) 369 dtype = 1; 370 } 371 372 if (data) { 373 if (data->flags == MMC_DATA_WRITE) 374 rawcmd |= SDC_CMD_WR; 375 376 if (data->blocks > 1) 377 dtype = 2; 378 379 blocksize = data->blocksize; 380 } 381 382 rawcmd |= ((opcode << SDC_CMD_CMD_S) & SDC_CMD_CMD_M) | 383 ((resp_type << SDC_CMD_RSPTYP_S) & SDC_CMD_RSPTYP_M) | 384 ((blocksize << SDC_CMD_BLK_LEN_S) & SDC_CMD_BLK_LEN_M) | 385 ((dtype << SDC_CMD_DTYPE_S) & SDC_CMD_DTYPE_M); 386 387 if (opcode == MMC_CMD_STOP_TRANSMISSION) 388 rawcmd |= SDC_CMD_STOP; 389 390 return rawcmd; 391 } 392 393 static int msdc_cmd_done(struct msdc_host *host, int events, 394 struct mmc_cmd *cmd) 395 { 396 u32 *rsp = cmd->response; 397 int ret = 0; 398 399 if (cmd->resp_type & MMC_RSP_PRESENT) { 400 if (cmd->resp_type & MMC_RSP_136) { 401 rsp[0] = readl(&host->base->sdc_resp[3]); 402 rsp[1] = readl(&host->base->sdc_resp[2]); 403 rsp[2] = readl(&host->base->sdc_resp[1]); 404 rsp[3] = readl(&host->base->sdc_resp[0]); 405 } else { 406 rsp[0] = readl(&host->base->sdc_resp[0]); 407 } 408 } 409 410 if (!(events & MSDC_INT_CMDRDY)) { 411 if (cmd->cmdidx != MMC_CMD_SEND_TUNING_BLOCK && 412 cmd->cmdidx != MMC_CMD_SEND_TUNING_BLOCK_HS200) 413 /* 414 * should not clear fifo/interrupt as the tune data 415 * may have alreay come. 416 */ 417 msdc_reset_hw(host); 418 419 if (events & MSDC_INT_CMDTMO) 420 ret = -ETIMEDOUT; 421 else 422 ret = -EIO; 423 } 424 425 return ret; 426 } 427 428 static bool msdc_cmd_is_ready(struct msdc_host *host) 429 { 430 int ret; 431 u32 reg; 432 433 /* The max busy time we can endure is 20ms */ 434 ret = readl_poll_timeout(&host->base->sdc_sts, reg, 435 !(reg & SDC_STS_CMDBUSY), 20000); 436 437 if (ret) { 438 pr_err("CMD bus busy detected\n"); 439 msdc_reset_hw(host); 440 return false; 441 } 442 443 if (host->last_resp_type == MMC_RSP_R1b && host->last_data_write) { 444 ret = readl_poll_timeout(&host->base->msdc_ps, reg, 445 reg & MSDC_PS_DAT0, 1000000); 446 447 if (ret) { 448 pr_err("Card stuck in programming state!\n"); 449 msdc_reset_hw(host); 450 return false; 451 } 452 } 453 454 return true; 455 } 456 457 static int msdc_start_command(struct msdc_host *host, struct mmc_cmd *cmd, 458 struct mmc_data *data) 459 { 460 u32 rawcmd; 461 u32 status; 462 u32 blocks = 0; 463 int ret; 464 465 if (!msdc_cmd_is_ready(host)) 466 return -EIO; 467 468 msdc_fifo_clr(host); 469 470 host->last_resp_type = cmd->resp_type; 471 host->last_data_write = 0; 472 473 rawcmd = msdc_cmd_prepare_raw_cmd(host, cmd, data); 474 475 if (data) 476 blocks = data->blocks; 477 478 writel(CMD_INTS_MASK, &host->base->msdc_int); 479 writel(blocks, &host->base->sdc_blk_num); 480 writel(cmd->cmdarg, &host->base->sdc_arg); 481 writel(rawcmd, &host->base->sdc_cmd); 482 483 ret = readl_poll_timeout(&host->base->msdc_int, status, 484 status & CMD_INTS_MASK, 1000000); 485 486 if (ret) 487 status = MSDC_INT_CMDTMO; 488 489 return msdc_cmd_done(host, status, cmd); 490 } 491 492 static void msdc_fifo_read(struct msdc_host *host, u8 *buf, u32 size) 493 { 494 u32 *wbuf; 495 496 while ((size_t)buf % 4) { 497 *buf++ = readb(&host->base->msdc_rxdata); 498 size--; 499 } 500 501 wbuf = (u32 *)buf; 502 while (size >= 4) { 503 *wbuf++ = readl(&host->base->msdc_rxdata); 504 size -= 4; 505 } 506 507 buf = (u8 *)wbuf; 508 while (size) { 509 *buf++ = readb(&host->base->msdc_rxdata); 510 size--; 511 } 512 } 513 514 static void msdc_fifo_write(struct msdc_host *host, const u8 *buf, u32 size) 515 { 516 const u32 *wbuf; 517 518 while ((size_t)buf % 4) { 519 writeb(*buf++, &host->base->msdc_txdata); 520 size--; 521 } 522 523 wbuf = (const u32 *)buf; 524 while (size >= 4) { 525 writel(*wbuf++, &host->base->msdc_txdata); 526 size -= 4; 527 } 528 529 buf = (const u8 *)wbuf; 530 while (size) { 531 writeb(*buf++, &host->base->msdc_txdata); 532 size--; 533 } 534 } 535 536 static int msdc_pio_read(struct msdc_host *host, u8 *ptr, u32 size) 537 { 538 u32 status; 539 u32 chksz; 540 int ret = 0; 541 542 while (1) { 543 status = readl(&host->base->msdc_int); 544 writel(status, &host->base->msdc_int); 545 status &= DATA_INTS_MASK; 546 547 if (status & MSDC_INT_DATCRCERR) { 548 ret = -EIO; 549 break; 550 } 551 552 if (status & MSDC_INT_DATTMO) { 553 ret = -ETIMEDOUT; 554 break; 555 } 556 557 if (status & MSDC_INT_XFER_COMPL) { 558 if (size) { 559 pr_err("data not fully read\n"); 560 ret = -EIO; 561 } 562 563 break; 564 } 565 566 chksz = min(size, (u32)MSDC_FIFO_SIZE); 567 568 if (msdc_fifo_rx_bytes(host) >= chksz) { 569 msdc_fifo_read(host, ptr, chksz); 570 ptr += chksz; 571 size -= chksz; 572 } 573 } 574 575 return ret; 576 } 577 578 static int msdc_pio_write(struct msdc_host *host, const u8 *ptr, u32 size) 579 { 580 u32 status; 581 u32 chksz; 582 int ret = 0; 583 584 while (1) { 585 status = readl(&host->base->msdc_int); 586 writel(status, &host->base->msdc_int); 587 status &= DATA_INTS_MASK; 588 589 if (status & MSDC_INT_DATCRCERR) { 590 ret = -EIO; 591 break; 592 } 593 594 if (status & MSDC_INT_DATTMO) { 595 ret = -ETIMEDOUT; 596 break; 597 } 598 599 if (status & MSDC_INT_XFER_COMPL) { 600 if (size) { 601 pr_err("data not fully written\n"); 602 ret = -EIO; 603 } 604 605 break; 606 } 607 608 chksz = min(size, (u32)MSDC_FIFO_SIZE); 609 610 if (MSDC_FIFO_SIZE - msdc_fifo_tx_bytes(host) >= chksz) { 611 msdc_fifo_write(host, ptr, chksz); 612 ptr += chksz; 613 size -= chksz; 614 } 615 } 616 617 return ret; 618 } 619 620 static int msdc_start_data(struct msdc_host *host, struct mmc_data *data) 621 { 622 u32 size; 623 int ret; 624 625 if (data->flags == MMC_DATA_WRITE) 626 host->last_data_write = 1; 627 628 writel(DATA_INTS_MASK, &host->base->msdc_int); 629 630 size = data->blocks * data->blocksize; 631 632 if (data->flags == MMC_DATA_WRITE) 633 ret = msdc_pio_write(host, (const u8 *)data->src, size); 634 else 635 ret = msdc_pio_read(host, (u8 *)data->dest, size); 636 637 if (ret) { 638 msdc_reset_hw(host); 639 msdc_fifo_clr(host); 640 } 641 642 return ret; 643 } 644 645 static int msdc_ops_send_cmd(struct udevice *dev, struct mmc_cmd *cmd, 646 struct mmc_data *data) 647 { 648 struct msdc_host *host = dev_get_priv(dev); 649 int ret; 650 651 ret = msdc_start_command(host, cmd, data); 652 if (ret) 653 return ret; 654 655 if (data) 656 return msdc_start_data(host, data); 657 658 return 0; 659 } 660 661 static void msdc_set_timeout(struct msdc_host *host, u32 ns, u32 clks) 662 { 663 u32 timeout, clk_ns; 664 u32 mode = 0; 665 666 host->timeout_ns = ns; 667 host->timeout_clks = clks; 668 669 if (host->sclk == 0) { 670 timeout = 0; 671 } else { 672 clk_ns = 1000000000UL / host->sclk; 673 timeout = (ns + clk_ns - 1) / clk_ns + clks; 674 /* unit is 1048576 sclk cycles */ 675 timeout = (timeout + (0x1 << 20) - 1) >> 20; 676 if (host->dev_comp->clk_div_bits == 8) 677 mode = (readl(&host->base->msdc_cfg) & 678 MSDC_CFG_CKMOD_M) >> MSDC_CFG_CKMOD_S; 679 else 680 mode = (readl(&host->base->msdc_cfg) & 681 MSDC_CFG_CKMOD_EXT_M) >> MSDC_CFG_CKMOD_EXT_S; 682 /* DDR mode will double the clk cycles for data timeout */ 683 timeout = mode >= 2 ? timeout * 2 : timeout; 684 timeout = timeout > 1 ? timeout - 1 : 0; 685 timeout = timeout > 255 ? 255 : timeout; 686 } 687 688 clrsetbits_le32(&host->base->sdc_cfg, SDC_CFG_DTOC_M, 689 timeout << SDC_CFG_DTOC_S); 690 } 691 692 static void msdc_set_buswidth(struct msdc_host *host, u32 width) 693 { 694 u32 val = readl(&host->base->sdc_cfg); 695 696 val &= ~SDC_CFG_BUSWIDTH_M; 697 698 switch (width) { 699 default: 700 case 1: 701 val |= (MSDC_BUS_1BITS << SDC_CFG_BUSWIDTH_S); 702 break; 703 case 4: 704 val |= (MSDC_BUS_4BITS << SDC_CFG_BUSWIDTH_S); 705 break; 706 case 8: 707 val |= (MSDC_BUS_8BITS << SDC_CFG_BUSWIDTH_S); 708 break; 709 } 710 711 writel(val, &host->base->sdc_cfg); 712 } 713 714 static void msdc_set_mclk(struct msdc_host *host, enum bus_mode timing, u32 hz) 715 { 716 u32 mode; 717 u32 div; 718 u32 sclk; 719 u32 reg; 720 721 if (!hz) { 722 host->mclk = 0; 723 clrbits_le32(&host->base->msdc_cfg, MSDC_CFG_CKPDN); 724 return; 725 } 726 727 if (host->dev_comp->clk_div_bits == 8) 728 clrbits_le32(&host->base->msdc_cfg, MSDC_CFG_HS400_CK_MODE); 729 else 730 clrbits_le32(&host->base->msdc_cfg, 731 MSDC_CFG_HS400_CK_MODE_EXT); 732 733 if (timing == UHS_DDR50 || timing == MMC_DDR_52 || 734 timing == MMC_HS_400) { 735 if (timing == MMC_HS_400) 736 mode = 0x3; 737 else 738 mode = 0x2; /* ddr mode and use divisor */ 739 740 if (hz >= (host->src_clk_freq >> 2)) { 741 div = 0; /* mean div = 1/4 */ 742 sclk = host->src_clk_freq >> 2; /* sclk = clk / 4 */ 743 } else { 744 div = (host->src_clk_freq + ((hz << 2) - 1)) / 745 (hz << 2); 746 sclk = (host->src_clk_freq >> 2) / div; 747 div = (div >> 1); 748 } 749 750 if (timing == MMC_HS_400 && hz >= (host->src_clk_freq >> 1)) { 751 if (host->dev_comp->clk_div_bits == 8) 752 setbits_le32(&host->base->msdc_cfg, 753 MSDC_CFG_HS400_CK_MODE); 754 else 755 setbits_le32(&host->base->msdc_cfg, 756 MSDC_CFG_HS400_CK_MODE_EXT); 757 758 sclk = host->src_clk_freq >> 1; 759 div = 0; /* div is ignore when bit18 is set */ 760 } 761 } else if (hz >= host->src_clk_freq) { 762 mode = 0x1; /* no divisor */ 763 div = 0; 764 sclk = host->src_clk_freq; 765 } else { 766 mode = 0x0; /* use divisor */ 767 if (hz >= (host->src_clk_freq >> 1)) { 768 div = 0; /* mean div = 1/2 */ 769 sclk = host->src_clk_freq >> 1; /* sclk = clk / 2 */ 770 } else { 771 div = (host->src_clk_freq + ((hz << 2) - 1)) / 772 (hz << 2); 773 sclk = (host->src_clk_freq >> 2) / div; 774 } 775 } 776 777 clrbits_le32(&host->base->msdc_cfg, MSDC_CFG_CKPDN); 778 779 if (host->dev_comp->clk_div_bits == 8) { 780 div = min(div, (u32)(MSDC_CFG_CKDIV_M >> MSDC_CFG_CKDIV_S)); 781 clrsetbits_le32(&host->base->msdc_cfg, 782 MSDC_CFG_CKMOD_M | MSDC_CFG_CKDIV_M, 783 (mode << MSDC_CFG_CKMOD_S) | 784 (div << MSDC_CFG_CKDIV_S)); 785 } else { 786 div = min(div, (u32)(MSDC_CFG_CKDIV_EXT_M >> 787 MSDC_CFG_CKDIV_EXT_S)); 788 clrsetbits_le32(&host->base->msdc_cfg, 789 MSDC_CFG_CKMOD_EXT_M | MSDC_CFG_CKDIV_EXT_M, 790 (mode << MSDC_CFG_CKMOD_EXT_S) | 791 (div << MSDC_CFG_CKDIV_EXT_S)); 792 } 793 794 readl_poll_timeout(&host->base->msdc_cfg, reg, 795 reg & MSDC_CFG_CKSTB, 1000000); 796 797 setbits_le32(&host->base->msdc_cfg, MSDC_CFG_CKPDN); 798 host->sclk = sclk; 799 host->mclk = hz; 800 host->timing = timing; 801 802 /* needed because clk changed. */ 803 msdc_set_timeout(host, host->timeout_ns, host->timeout_clks); 804 805 /* 806 * mmc_select_hs400() will drop to 50Mhz and High speed mode, 807 * tune result of hs200/200Mhz is not suitable for 50Mhz 808 */ 809 if (host->sclk <= 52000000) { 810 writel(host->def_tune_para.iocon, &host->base->msdc_iocon); 811 writel(host->def_tune_para.pad_tune, 812 &host->base->pad_tune); 813 } else { 814 writel(host->saved_tune_para.iocon, &host->base->msdc_iocon); 815 writel(host->saved_tune_para.pad_tune, 816 &host->base->pad_tune); 817 } 818 819 dev_dbg(dev, "sclk: %d, timing: %d\n", host->sclk, timing); 820 } 821 822 static int msdc_ops_set_ios(struct udevice *dev) 823 { 824 struct msdc_plat *plat = dev_get_platdata(dev); 825 struct msdc_host *host = dev_get_priv(dev); 826 struct mmc *mmc = &plat->mmc; 827 uint clock = mmc->clock; 828 829 msdc_set_buswidth(host, mmc->bus_width); 830 831 if (mmc->clk_disable) 832 clock = 0; 833 else if (clock < mmc->cfg->f_min) 834 clock = mmc->cfg->f_min; 835 836 if (host->mclk != clock || host->timing != mmc->selected_mode) 837 msdc_set_mclk(host, mmc->selected_mode, clock); 838 839 return 0; 840 } 841 842 static int msdc_ops_get_cd(struct udevice *dev) 843 { 844 struct msdc_host *host = dev_get_priv(dev); 845 u32 val; 846 847 if (host->builtin_cd) { 848 val = readl(&host->base->msdc_ps); 849 return !(val & MSDC_PS_CDSTS); 850 } 851 852 #ifdef CONFIG_DM_GPIO 853 if (!host->gpio_cd.dev) 854 return 1; 855 856 return dm_gpio_get_value(&host->gpio_cd); 857 #else 858 return 1; 859 #endif 860 } 861 862 static int msdc_ops_get_wp(struct udevice *dev) 863 { 864 struct msdc_host *host = dev_get_priv(dev); 865 866 #ifdef CONFIG_DM_GPIO 867 if (!host->gpio_wp.dev) 868 return 0; 869 870 return !dm_gpio_get_value(&host->gpio_wp); 871 #else 872 return 0; 873 #endif 874 } 875 876 #ifdef MMC_SUPPORTS_TUNING 877 static u32 test_delay_bit(u32 delay, u32 bit) 878 { 879 bit %= PAD_DELAY_MAX; 880 return delay & (1 << bit); 881 } 882 883 static int get_delay_len(u32 delay, u32 start_bit) 884 { 885 int i; 886 887 for (i = 0; i < (PAD_DELAY_MAX - start_bit); i++) { 888 if (test_delay_bit(delay, start_bit + i) == 0) 889 return i; 890 } 891 892 return PAD_DELAY_MAX - start_bit; 893 } 894 895 static struct msdc_delay_phase get_best_delay(struct msdc_host *host, u32 delay) 896 { 897 int start = 0, len = 0; 898 int start_final = 0, len_final = 0; 899 u8 final_phase = 0xff; 900 struct msdc_delay_phase delay_phase = { 0, }; 901 902 if (delay == 0) { 903 dev_err(dev, "phase error: [map:%x]\n", delay); 904 delay_phase.final_phase = final_phase; 905 return delay_phase; 906 } 907 908 while (start < PAD_DELAY_MAX) { 909 len = get_delay_len(delay, start); 910 if (len_final < len) { 911 start_final = start; 912 len_final = len; 913 } 914 915 start += len ? len : 1; 916 if (len >= 12 && start_final < 4) 917 break; 918 } 919 920 /* The rule is to find the smallest delay cell */ 921 if (start_final == 0) 922 final_phase = (start_final + len_final / 3) % PAD_DELAY_MAX; 923 else 924 final_phase = (start_final + len_final / 2) % PAD_DELAY_MAX; 925 926 dev_info(dev, "phase: [map:%x] [maxlen:%d] [final:%d]\n", 927 delay, len_final, final_phase); 928 929 delay_phase.maxlen = len_final; 930 delay_phase.start = start_final; 931 delay_phase.final_phase = final_phase; 932 return delay_phase; 933 } 934 935 static int msdc_tune_response(struct udevice *dev, u32 opcode) 936 { 937 struct msdc_plat *plat = dev_get_platdata(dev); 938 struct msdc_host *host = dev_get_priv(dev); 939 struct mmc *mmc = &plat->mmc; 940 u32 rise_delay = 0, fall_delay = 0; 941 struct msdc_delay_phase final_rise_delay, final_fall_delay = { 0, }; 942 struct msdc_delay_phase internal_delay_phase; 943 u8 final_delay, final_maxlen; 944 u32 internal_delay = 0; 945 void __iomem *tune_reg = &host->base->pad_tune; 946 int cmd_err; 947 int i, j; 948 949 if (host->dev_comp->pad_tune0) 950 tune_reg = &host->base->pad_tune0; 951 952 if (mmc->selected_mode == MMC_HS_200 || 953 mmc->selected_mode == UHS_SDR104) 954 clrsetbits_le32(tune_reg, MSDC_PAD_TUNE_CMDRRDLY_M, 955 host->hs200_cmd_int_delay << 956 MSDC_PAD_TUNE_CMDRRDLY_S); 957 958 clrbits_le32(&host->base->msdc_iocon, MSDC_IOCON_RSPL); 959 960 for (i = 0; i < PAD_DELAY_MAX; i++) { 961 clrsetbits_le32(tune_reg, MSDC_PAD_TUNE_CMDRDLY_M, 962 i << MSDC_PAD_TUNE_CMDRDLY_S); 963 964 for (j = 0; j < 3; j++) { 965 mmc_send_tuning(mmc, opcode, &cmd_err); 966 if (!cmd_err) { 967 rise_delay |= (1 << i); 968 } else { 969 rise_delay &= ~(1 << i); 970 break; 971 } 972 } 973 } 974 975 final_rise_delay = get_best_delay(host, rise_delay); 976 /* if rising edge has enough margin, do not scan falling edge */ 977 if (final_rise_delay.maxlen >= 12 || 978 (final_rise_delay.start == 0 && final_rise_delay.maxlen >= 4)) 979 goto skip_fall; 980 981 setbits_le32(&host->base->msdc_iocon, MSDC_IOCON_RSPL); 982 for (i = 0; i < PAD_DELAY_MAX; i++) { 983 clrsetbits_le32(tune_reg, MSDC_PAD_TUNE_CMDRDLY_M, 984 i << MSDC_PAD_TUNE_CMDRDLY_S); 985 986 for (j = 0; j < 3; j++) { 987 mmc_send_tuning(mmc, opcode, &cmd_err); 988 if (!cmd_err) { 989 fall_delay |= (1 << i); 990 } else { 991 fall_delay &= ~(1 << i); 992 break; 993 } 994 } 995 } 996 997 final_fall_delay = get_best_delay(host, fall_delay); 998 999 skip_fall: 1000 final_maxlen = max(final_rise_delay.maxlen, final_fall_delay.maxlen); 1001 if (final_maxlen == final_rise_delay.maxlen) { 1002 clrbits_le32(&host->base->msdc_iocon, MSDC_IOCON_RSPL); 1003 clrsetbits_le32(tune_reg, MSDC_PAD_TUNE_CMDRDLY_M, 1004 final_rise_delay.final_phase << 1005 MSDC_PAD_TUNE_CMDRDLY_S); 1006 final_delay = final_rise_delay.final_phase; 1007 } else { 1008 setbits_le32(&host->base->msdc_iocon, MSDC_IOCON_RSPL); 1009 clrsetbits_le32(tune_reg, MSDC_PAD_TUNE_CMDRDLY_M, 1010 final_fall_delay.final_phase << 1011 MSDC_PAD_TUNE_CMDRDLY_S); 1012 final_delay = final_fall_delay.final_phase; 1013 } 1014 1015 if (host->dev_comp->async_fifo || host->hs200_cmd_int_delay) 1016 goto skip_internal; 1017 1018 for (i = 0; i < PAD_DELAY_MAX; i++) { 1019 clrsetbits_le32(tune_reg, MSDC_PAD_TUNE_CMDRRDLY_M, 1020 i << MSDC_PAD_TUNE_CMDRRDLY_S); 1021 1022 mmc_send_tuning(mmc, opcode, &cmd_err); 1023 if (!cmd_err) 1024 internal_delay |= (1 << i); 1025 } 1026 1027 dev_err(dev, "Final internal delay: 0x%x\n", internal_delay); 1028 1029 internal_delay_phase = get_best_delay(host, internal_delay); 1030 clrsetbits_le32(tune_reg, MSDC_PAD_TUNE_CMDRRDLY_M, 1031 internal_delay_phase.final_phase << 1032 MSDC_PAD_TUNE_CMDRRDLY_S); 1033 1034 skip_internal: 1035 dev_err(dev, "Final cmd pad delay: %x\n", final_delay); 1036 return final_delay == 0xff ? -EIO : 0; 1037 } 1038 1039 static int msdc_tune_data(struct udevice *dev, u32 opcode) 1040 { 1041 struct msdc_plat *plat = dev_get_platdata(dev); 1042 struct msdc_host *host = dev_get_priv(dev); 1043 struct mmc *mmc = &plat->mmc; 1044 u32 rise_delay = 0, fall_delay = 0; 1045 struct msdc_delay_phase final_rise_delay, final_fall_delay = { 0, }; 1046 u8 final_delay, final_maxlen; 1047 void __iomem *tune_reg = &host->base->pad_tune; 1048 int cmd_err; 1049 int i, ret; 1050 1051 if (host->dev_comp->pad_tune0) 1052 tune_reg = &host->base->pad_tune0; 1053 1054 clrbits_le32(&host->base->msdc_iocon, MSDC_IOCON_DSPL); 1055 clrbits_le32(&host->base->msdc_iocon, MSDC_IOCON_W_DSPL); 1056 1057 for (i = 0; i < PAD_DELAY_MAX; i++) { 1058 clrsetbits_le32(tune_reg, MSDC_PAD_TUNE_DATRRDLY_M, 1059 i << MSDC_PAD_TUNE_DATRRDLY_S); 1060 1061 ret = mmc_send_tuning(mmc, opcode, &cmd_err); 1062 if (!ret) { 1063 rise_delay |= (1 << i); 1064 } else if (cmd_err) { 1065 /* in this case, retune response is needed */ 1066 ret = msdc_tune_response(dev, opcode); 1067 if (ret) 1068 break; 1069 } 1070 } 1071 1072 final_rise_delay = get_best_delay(host, rise_delay); 1073 if (final_rise_delay.maxlen >= 12 || 1074 (final_rise_delay.start == 0 && final_rise_delay.maxlen >= 4)) 1075 goto skip_fall; 1076 1077 setbits_le32(&host->base->msdc_iocon, MSDC_IOCON_DSPL); 1078 setbits_le32(&host->base->msdc_iocon, MSDC_IOCON_W_DSPL); 1079 1080 for (i = 0; i < PAD_DELAY_MAX; i++) { 1081 clrsetbits_le32(tune_reg, MSDC_PAD_TUNE_DATRRDLY_M, 1082 i << MSDC_PAD_TUNE_DATRRDLY_S); 1083 1084 ret = mmc_send_tuning(mmc, opcode, &cmd_err); 1085 if (!ret) { 1086 fall_delay |= (1 << i); 1087 } else if (cmd_err) { 1088 /* in this case, retune response is needed */ 1089 ret = msdc_tune_response(dev, opcode); 1090 if (ret) 1091 break; 1092 } 1093 } 1094 1095 final_fall_delay = get_best_delay(host, fall_delay); 1096 1097 skip_fall: 1098 final_maxlen = max(final_rise_delay.maxlen, final_fall_delay.maxlen); 1099 if (final_maxlen == final_rise_delay.maxlen) { 1100 clrbits_le32(&host->base->msdc_iocon, MSDC_IOCON_DSPL); 1101 clrbits_le32(&host->base->msdc_iocon, MSDC_IOCON_W_DSPL); 1102 clrsetbits_le32(tune_reg, MSDC_PAD_TUNE_DATRRDLY_M, 1103 final_rise_delay.final_phase << 1104 MSDC_PAD_TUNE_DATRRDLY_S); 1105 final_delay = final_rise_delay.final_phase; 1106 } else { 1107 setbits_le32(&host->base->msdc_iocon, MSDC_IOCON_DSPL); 1108 setbits_le32(&host->base->msdc_iocon, MSDC_IOCON_W_DSPL); 1109 clrsetbits_le32(tune_reg, MSDC_PAD_TUNE_DATRRDLY_M, 1110 final_fall_delay.final_phase << 1111 MSDC_PAD_TUNE_DATRRDLY_S); 1112 final_delay = final_fall_delay.final_phase; 1113 } 1114 1115 if (mmc->selected_mode == MMC_HS_200 || 1116 mmc->selected_mode == UHS_SDR104) 1117 clrsetbits_le32(tune_reg, MSDC_PAD_TUNE_DATWRDLY_M, 1118 host->hs200_write_int_delay << 1119 MSDC_PAD_TUNE_DATWRDLY_S); 1120 1121 dev_err(dev, "Final data pad delay: %x\n", final_delay); 1122 1123 return final_delay == 0xff ? -EIO : 0; 1124 } 1125 1126 static int msdc_execute_tuning(struct udevice *dev, uint opcode) 1127 { 1128 struct msdc_plat *plat = dev_get_platdata(dev); 1129 struct msdc_host *host = dev_get_priv(dev); 1130 struct mmc *mmc = &plat->mmc; 1131 int ret; 1132 1133 if (mmc->selected_mode == MMC_HS_400) { 1134 writel(host->hs400_ds_delay, &host->base->pad_ds_tune); 1135 /* for hs400 mode it must be set to 0 */ 1136 clrbits_le32(&host->base->patch_bit2, MSDC_PB2_CFGCRCSTS); 1137 host->hs400_mode = true; 1138 } 1139 1140 ret = msdc_tune_response(dev, opcode); 1141 if (ret == -EIO) { 1142 dev_err(dev, "Tune response fail!\n"); 1143 return ret; 1144 } 1145 1146 if (!host->hs400_mode) { 1147 ret = msdc_tune_data(dev, opcode); 1148 if (ret == -EIO) 1149 dev_err(dev, "Tune data fail!\n"); 1150 } 1151 1152 host->saved_tune_para.iocon = readl(&host->base->msdc_iocon); 1153 host->saved_tune_para.pad_tune = readl(&host->base->pad_tune); 1154 1155 return ret; 1156 } 1157 #endif 1158 1159 static void msdc_init_hw(struct msdc_host *host) 1160 { 1161 u32 val; 1162 void __iomem *tune_reg = &host->base->pad_tune; 1163 1164 if (host->dev_comp->pad_tune0) 1165 tune_reg = &host->base->pad_tune0; 1166 1167 /* Configure to MMC/SD mode, clock free running */ 1168 setbits_le32(&host->base->msdc_cfg, MSDC_CFG_MODE); 1169 1170 /* Use PIO mode */ 1171 setbits_le32(&host->base->msdc_cfg, MSDC_CFG_PIO); 1172 1173 /* Reset */ 1174 msdc_reset_hw(host); 1175 1176 /* Enable/disable hw card detection according to fdt option */ 1177 if (host->builtin_cd) 1178 clrsetbits_le32(&host->base->msdc_ps, 1179 MSDC_PS_CDDBCE_M, 1180 (DEFAULT_CD_DEBOUNCE << MSDC_PS_CDDBCE_S) | 1181 MSDC_PS_CDEN); 1182 else 1183 clrbits_le32(&host->base->msdc_ps, MSDC_PS_CDEN); 1184 1185 /* Clear all interrupts */ 1186 val = readl(&host->base->msdc_int); 1187 writel(val, &host->base->msdc_int); 1188 1189 /* Enable data & cmd interrupts */ 1190 writel(DATA_INTS_MASK | CMD_INTS_MASK, &host->base->msdc_inten); 1191 1192 writel(0, tune_reg); 1193 writel(0, &host->base->msdc_iocon); 1194 1195 if (host->r_smpl) 1196 setbits_le32(&host->base->msdc_iocon, MSDC_IOCON_RSPL); 1197 else 1198 clrbits_le32(&host->base->msdc_iocon, MSDC_IOCON_RSPL); 1199 1200 writel(0x403c0046, &host->base->patch_bit0); 1201 writel(0xffff4089, &host->base->patch_bit1); 1202 1203 if (host->dev_comp->stop_clk_fix) 1204 clrsetbits_le32(&host->base->patch_bit1, MSDC_PB1_STOP_DLY_M, 1205 3 << MSDC_PB1_STOP_DLY_S); 1206 1207 if (host->dev_comp->busy_check) 1208 clrbits_le32(&host->base->patch_bit1, (1 << 7)); 1209 1210 setbits_le32(&host->base->emmc50_cfg0, EMMC50_CFG_CFCSTS_SEL); 1211 1212 if (host->dev_comp->async_fifo) { 1213 clrsetbits_le32(&host->base->patch_bit2, MSDC_PB2_RESPWAIT_M, 1214 3 << MSDC_PB2_RESPWAIT_S); 1215 1216 if (host->dev_comp->enhance_rx) { 1217 setbits_le32(&host->base->sdc_adv_cfg0, 1218 SDC_RX_ENHANCE_EN); 1219 } else { 1220 clrsetbits_le32(&host->base->patch_bit2, 1221 MSDC_PB2_RESPSTSENSEL_M, 1222 2 << MSDC_PB2_RESPSTSENSEL_S); 1223 clrsetbits_le32(&host->base->patch_bit2, 1224 MSDC_PB2_CRCSTSENSEL_M, 1225 2 << MSDC_PB2_CRCSTSENSEL_S); 1226 } 1227 1228 /* use async fifo to avoid tune internal delay */ 1229 clrbits_le32(&host->base->patch_bit2, 1230 MSDC_PB2_CFGRESP); 1231 clrbits_le32(&host->base->patch_bit2, 1232 MSDC_PB2_CFGCRCSTS); 1233 } 1234 1235 if (host->dev_comp->data_tune) { 1236 setbits_le32(tune_reg, 1237 MSDC_PAD_TUNE_RD_SEL | MSDC_PAD_TUNE_CMD_SEL); 1238 clrsetbits_le32(&host->base->patch_bit0, 1239 MSDC_INT_DAT_LATCH_CK_SEL_M, 1240 host->latch_ck << 1241 MSDC_INT_DAT_LATCH_CK_SEL_S); 1242 } else { 1243 /* choose clock tune */ 1244 setbits_le32(tune_reg, MSDC_PAD_TUNE_RXDLYSEL); 1245 } 1246 1247 /* Configure to enable SDIO mode otherwise sdio cmd5 won't work */ 1248 setbits_le32(&host->base->sdc_cfg, SDC_CFG_SDIO); 1249 1250 /* disable detecting SDIO device interrupt function */ 1251 clrbits_le32(&host->base->sdc_cfg, SDC_CFG_SDIOIDE); 1252 1253 /* Configure to default data timeout */ 1254 clrsetbits_le32(&host->base->sdc_cfg, SDC_CFG_DTOC_M, 1255 3 << SDC_CFG_DTOC_S); 1256 1257 if (host->dev_comp->stop_clk_fix) { 1258 clrbits_le32(&host->base->sdc_fifo_cfg, 1259 SDC_FIFO_CFG_WRVALIDSEL); 1260 clrbits_le32(&host->base->sdc_fifo_cfg, 1261 SDC_FIFO_CFG_RDVALIDSEL); 1262 } 1263 1264 host->def_tune_para.iocon = readl(&host->base->msdc_iocon); 1265 host->def_tune_para.pad_tune = readl(&host->base->pad_tune); 1266 } 1267 1268 static void msdc_ungate_clock(struct msdc_host *host) 1269 { 1270 clk_enable(&host->src_clk); 1271 clk_enable(&host->h_clk); 1272 } 1273 1274 static int msdc_drv_probe(struct udevice *dev) 1275 { 1276 struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev); 1277 struct msdc_plat *plat = dev_get_platdata(dev); 1278 struct msdc_host *host = dev_get_priv(dev); 1279 struct mmc_config *cfg = &plat->cfg; 1280 1281 cfg->name = dev->name; 1282 1283 host->dev_comp = (struct msdc_compatible *)dev_get_driver_data(dev); 1284 1285 host->src_clk_freq = clk_get_rate(&host->src_clk); 1286 1287 if (host->dev_comp->clk_div_bits == 8) 1288 cfg->f_min = host->src_clk_freq / (4 * 255); 1289 else 1290 cfg->f_min = host->src_clk_freq / (4 * 4095); 1291 cfg->f_max = host->src_clk_freq / 2; 1292 1293 cfg->b_max = 1024; 1294 cfg->voltages = MMC_VDD_32_33 | MMC_VDD_33_34; 1295 1296 host->mmc = &plat->mmc; 1297 host->timeout_ns = 100000000; 1298 host->timeout_clks = 3 * 1048576; 1299 1300 #ifdef CONFIG_PINCTRL 1301 pinctrl_select_state(dev, "default"); 1302 #endif 1303 1304 msdc_ungate_clock(host); 1305 msdc_init_hw(host); 1306 1307 upriv->mmc = &plat->mmc; 1308 1309 return 0; 1310 } 1311 1312 static int msdc_ofdata_to_platdata(struct udevice *dev) 1313 { 1314 struct msdc_plat *plat = dev_get_platdata(dev); 1315 struct msdc_host *host = dev_get_priv(dev); 1316 struct mmc_config *cfg = &plat->cfg; 1317 int ret; 1318 1319 host->base = (void *)dev_read_addr(dev); 1320 if (!host->base) 1321 return -EINVAL; 1322 1323 ret = mmc_of_parse(dev, cfg); 1324 if (ret) 1325 return ret; 1326 1327 ret = clk_get_by_name(dev, "source", &host->src_clk); 1328 if (ret < 0) 1329 return ret; 1330 1331 ret = clk_get_by_name(dev, "hclk", &host->h_clk); 1332 if (ret < 0) 1333 return ret; 1334 1335 #ifdef CONFIG_DM_GPIO 1336 gpio_request_by_name(dev, "wp-gpios", 0, &host->gpio_wp, GPIOD_IS_IN); 1337 gpio_request_by_name(dev, "cd-gpios", 0, &host->gpio_cd, GPIOD_IS_IN); 1338 #endif 1339 1340 host->hs400_ds_delay = dev_read_u32_default(dev, "hs400-ds-delay", 0); 1341 host->hs200_cmd_int_delay = 1342 dev_read_u32_default(dev, "cmd_int_delay", 0); 1343 host->hs200_write_int_delay = 1344 dev_read_u32_default(dev, "write_int_delay", 0); 1345 host->latch_ck = dev_read_u32_default(dev, "latch-ck", 0); 1346 host->r_smpl = dev_read_u32_default(dev, "r_smpl", 0); 1347 host->builtin_cd = dev_read_u32_default(dev, "builtin-cd", 0); 1348 1349 return 0; 1350 } 1351 1352 static int msdc_drv_bind(struct udevice *dev) 1353 { 1354 struct msdc_plat *plat = dev_get_platdata(dev); 1355 1356 return mmc_bind(dev, &plat->mmc, &plat->cfg); 1357 } 1358 1359 static const struct dm_mmc_ops msdc_ops = { 1360 .send_cmd = msdc_ops_send_cmd, 1361 .set_ios = msdc_ops_set_ios, 1362 .get_cd = msdc_ops_get_cd, 1363 .get_wp = msdc_ops_get_wp, 1364 #ifdef MMC_SUPPORTS_TUNING 1365 .execute_tuning = msdc_execute_tuning, 1366 #endif 1367 }; 1368 1369 static const struct msdc_compatible mt7623_compat = { 1370 .clk_div_bits = 12, 1371 .pad_tune0 = true, 1372 .async_fifo = true, 1373 .data_tune = true, 1374 .busy_check = false, 1375 .stop_clk_fix = false, 1376 .enhance_rx = false 1377 }; 1378 1379 static const struct udevice_id msdc_ids[] = { 1380 { .compatible = "mediatek,mt7623-mmc", .data = (ulong)&mt7623_compat }, 1381 {} 1382 }; 1383 1384 U_BOOT_DRIVER(mtk_sd_drv) = { 1385 .name = "mtk_sd", 1386 .id = UCLASS_MMC, 1387 .of_match = msdc_ids, 1388 .ofdata_to_platdata = msdc_ofdata_to_platdata, 1389 .bind = msdc_drv_bind, 1390 .probe = msdc_drv_probe, 1391 .ops = &msdc_ops, 1392 .platdata_auto_alloc_size = sizeof(struct msdc_plat), 1393 .priv_auto_alloc_size = sizeof(struct msdc_host), 1394 }; 1395