diff options
-rw-r--r-- | drivers/mfd/rtl8411.c | 4 | ||||
-rw-r--r-- | drivers/mfd/rts5209.c | 2 | ||||
-rw-r--r-- | drivers/mfd/rts5227.c | 2 | ||||
-rw-r--r-- | drivers/mfd/rts5229.c | 2 | ||||
-rw-r--r-- | drivers/mfd/rts5249.c | 2 | ||||
-rw-r--r-- | drivers/mmc/host/rtsx_pci_sdmmc.c | 58 | ||||
-rw-r--r-- | include/linux/mfd/rtsx_pci.h | 15 |
7 files changed, 69 insertions, 16 deletions
diff --git a/drivers/mfd/rtl8411.c b/drivers/mfd/rtl8411.c index e4c1833154ea..52801351864d 100644 --- a/drivers/mfd/rtl8411.c +++ b/drivers/mfd/rtl8411.c | |||
@@ -452,6 +452,8 @@ void rtl8411_init_params(struct rtsx_pcr *pcr) | |||
452 | pcr->sd30_drive_sel_1v8 = DRIVER_TYPE_B; | 452 | pcr->sd30_drive_sel_1v8 = DRIVER_TYPE_B; |
453 | pcr->sd30_drive_sel_3v3 = DRIVER_TYPE_D; | 453 | pcr->sd30_drive_sel_3v3 = DRIVER_TYPE_D; |
454 | pcr->aspm_en = ASPM_L1_EN; | 454 | pcr->aspm_en = ASPM_L1_EN; |
455 | pcr->tx_initial_phase = SET_CLOCK_PHASE(23, 7, 14); | ||
456 | pcr->rx_initial_phase = SET_CLOCK_PHASE(4, 3, 10); | ||
455 | 457 | ||
456 | pcr->ic_version = rtl8411_get_ic_version(pcr); | 458 | pcr->ic_version = rtl8411_get_ic_version(pcr); |
457 | pcr->sd_pull_ctl_enable_tbl = rtl8411_sd_pull_ctl_enable_tbl; | 459 | pcr->sd_pull_ctl_enable_tbl = rtl8411_sd_pull_ctl_enable_tbl; |
@@ -471,6 +473,8 @@ void rtl8411b_init_params(struct rtsx_pcr *pcr) | |||
471 | pcr->sd30_drive_sel_1v8 = DRIVER_TYPE_B; | 473 | pcr->sd30_drive_sel_1v8 = DRIVER_TYPE_B; |
472 | pcr->sd30_drive_sel_3v3 = DRIVER_TYPE_D; | 474 | pcr->sd30_drive_sel_3v3 = DRIVER_TYPE_D; |
473 | pcr->aspm_en = ASPM_L1_EN; | 475 | pcr->aspm_en = ASPM_L1_EN; |
476 | pcr->tx_initial_phase = SET_CLOCK_PHASE(23, 7, 14); | ||
477 | pcr->rx_initial_phase = SET_CLOCK_PHASE(4, 3, 10); | ||
474 | 478 | ||
475 | pcr->ic_version = rtl8411_get_ic_version(pcr); | 479 | pcr->ic_version = rtl8411_get_ic_version(pcr); |
476 | 480 | ||
diff --git a/drivers/mfd/rts5209.c b/drivers/mfd/rts5209.c index 4026e1fcb0a6..cb04174a8924 100644 --- a/drivers/mfd/rts5209.c +++ b/drivers/mfd/rts5209.c | |||
@@ -270,6 +270,8 @@ void rts5209_init_params(struct rtsx_pcr *pcr) | |||
270 | pcr->sd30_drive_sel_1v8 = DRIVER_TYPE_B; | 270 | pcr->sd30_drive_sel_1v8 = DRIVER_TYPE_B; |
271 | pcr->sd30_drive_sel_3v3 = DRIVER_TYPE_D; | 271 | pcr->sd30_drive_sel_3v3 = DRIVER_TYPE_D; |
272 | pcr->aspm_en = ASPM_L1_EN; | 272 | pcr->aspm_en = ASPM_L1_EN; |
273 | pcr->tx_initial_phase = SET_CLOCK_PHASE(27, 27, 16); | ||
274 | pcr->rx_initial_phase = SET_CLOCK_PHASE(24, 6, 5); | ||
273 | 275 | ||
274 | pcr->ic_version = rts5209_get_ic_version(pcr); | 276 | pcr->ic_version = rts5209_get_ic_version(pcr); |
275 | pcr->sd_pull_ctl_enable_tbl = rts5209_sd_pull_ctl_enable_tbl; | 277 | pcr->sd_pull_ctl_enable_tbl = rts5209_sd_pull_ctl_enable_tbl; |
diff --git a/drivers/mfd/rts5227.c b/drivers/mfd/rts5227.c index d7cae82720a4..c001151378b2 100644 --- a/drivers/mfd/rts5227.c +++ b/drivers/mfd/rts5227.c | |||
@@ -291,6 +291,8 @@ void rts5227_init_params(struct rtsx_pcr *pcr) | |||
291 | pcr->sd30_drive_sel_1v8 = CFG_DRIVER_TYPE_B; | 291 | pcr->sd30_drive_sel_1v8 = CFG_DRIVER_TYPE_B; |
292 | pcr->sd30_drive_sel_3v3 = CFG_DRIVER_TYPE_B; | 292 | pcr->sd30_drive_sel_3v3 = CFG_DRIVER_TYPE_B; |
293 | pcr->aspm_en = ASPM_L1_EN; | 293 | pcr->aspm_en = ASPM_L1_EN; |
294 | pcr->tx_initial_phase = SET_CLOCK_PHASE(27, 27, 15); | ||
295 | pcr->rx_initial_phase = SET_CLOCK_PHASE(30, 7, 7); | ||
294 | 296 | ||
295 | pcr->sd_pull_ctl_enable_tbl = rts5227_sd_pull_ctl_enable_tbl; | 297 | pcr->sd_pull_ctl_enable_tbl = rts5227_sd_pull_ctl_enable_tbl; |
296 | pcr->sd_pull_ctl_disable_tbl = rts5227_sd_pull_ctl_disable_tbl; | 298 | pcr->sd_pull_ctl_disable_tbl = rts5227_sd_pull_ctl_disable_tbl; |
diff --git a/drivers/mfd/rts5229.c b/drivers/mfd/rts5229.c index 620e7fa9e0df..6353f5df087a 100644 --- a/drivers/mfd/rts5229.c +++ b/drivers/mfd/rts5229.c | |||
@@ -261,6 +261,8 @@ void rts5229_init_params(struct rtsx_pcr *pcr) | |||
261 | pcr->sd30_drive_sel_1v8 = DRIVER_TYPE_B; | 261 | pcr->sd30_drive_sel_1v8 = DRIVER_TYPE_B; |
262 | pcr->sd30_drive_sel_3v3 = DRIVER_TYPE_D; | 262 | pcr->sd30_drive_sel_3v3 = DRIVER_TYPE_D; |
263 | pcr->aspm_en = ASPM_L1_EN; | 263 | pcr->aspm_en = ASPM_L1_EN; |
264 | pcr->tx_initial_phase = SET_CLOCK_PHASE(27, 27, 15); | ||
265 | pcr->rx_initial_phase = SET_CLOCK_PHASE(30, 6, 6); | ||
264 | 266 | ||
265 | pcr->ic_version = rts5229_get_ic_version(pcr); | 267 | pcr->ic_version = rts5229_get_ic_version(pcr); |
266 | if (pcr->ic_version == IC_VER_C) { | 268 | if (pcr->ic_version == IC_VER_C) { |
diff --git a/drivers/mfd/rts5249.c b/drivers/mfd/rts5249.c index ea90f8fb92ae..3b835f593e35 100644 --- a/drivers/mfd/rts5249.c +++ b/drivers/mfd/rts5249.c | |||
@@ -298,6 +298,8 @@ void rts5249_init_params(struct rtsx_pcr *pcr) | |||
298 | pcr->sd30_drive_sel_1v8 = CFG_DRIVER_TYPE_C; | 298 | pcr->sd30_drive_sel_1v8 = CFG_DRIVER_TYPE_C; |
299 | pcr->sd30_drive_sel_3v3 = CFG_DRIVER_TYPE_B; | 299 | pcr->sd30_drive_sel_3v3 = CFG_DRIVER_TYPE_B; |
300 | pcr->aspm_en = ASPM_L1_EN; | 300 | pcr->aspm_en = ASPM_L1_EN; |
301 | pcr->tx_initial_phase = SET_CLOCK_PHASE(1, 29, 16); | ||
302 | pcr->rx_initial_phase = SET_CLOCK_PHASE(24, 6, 5); | ||
301 | 303 | ||
302 | pcr->ic_version = rts5249_get_ic_version(pcr); | 304 | pcr->ic_version = rts5249_get_ic_version(pcr); |
303 | pcr->sd_pull_ctl_enable_tbl = rts5249_sd_pull_ctl_enable_tbl; | 305 | pcr->sd_pull_ctl_enable_tbl = rts5249_sd_pull_ctl_enable_tbl; |
diff --git a/drivers/mmc/host/rtsx_pci_sdmmc.c b/drivers/mmc/host/rtsx_pci_sdmmc.c index 82a35b91cdbc..fcb368ef4323 100644 --- a/drivers/mmc/host/rtsx_pci_sdmmc.c +++ b/drivers/mmc/host/rtsx_pci_sdmmc.c | |||
@@ -56,7 +56,6 @@ struct realtek_pci_sdmmc { | |||
56 | bool double_clk; | 56 | bool double_clk; |
57 | bool eject; | 57 | bool eject; |
58 | bool initial_mode; | 58 | bool initial_mode; |
59 | bool ddr_mode; | ||
60 | int power_state; | 59 | int power_state; |
61 | #define SDMMC_POWER_ON 1 | 60 | #define SDMMC_POWER_ON 1 |
62 | #define SDMMC_POWER_OFF 0 | 61 | #define SDMMC_POWER_OFF 0 |
@@ -475,18 +474,24 @@ static void sd_normal_rw(struct realtek_pci_sdmmc *host, | |||
475 | kfree(buf); | 474 | kfree(buf); |
476 | } | 475 | } |
477 | 476 | ||
478 | static int sd_change_phase(struct realtek_pci_sdmmc *host, u8 sample_point) | 477 | static int sd_change_phase(struct realtek_pci_sdmmc *host, |
478 | u8 sample_point, bool rx) | ||
479 | { | 479 | { |
480 | struct rtsx_pcr *pcr = host->pcr; | 480 | struct rtsx_pcr *pcr = host->pcr; |
481 | int err; | 481 | int err; |
482 | 482 | ||
483 | dev_dbg(sdmmc_dev(host), "%s: sample_point = %d\n", | 483 | dev_dbg(sdmmc_dev(host), "%s(%s): sample_point = %d\n", |
484 | __func__, sample_point); | 484 | __func__, rx ? "RX" : "TX", sample_point); |
485 | 485 | ||
486 | rtsx_pci_init_cmd(pcr); | 486 | rtsx_pci_init_cmd(pcr); |
487 | 487 | ||
488 | rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, CLK_CTL, CHANGE_CLK, CHANGE_CLK); | 488 | rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, CLK_CTL, CHANGE_CLK, CHANGE_CLK); |
489 | rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_VPRX_CTL, 0x1F, sample_point); | 489 | if (rx) |
490 | rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, | ||
491 | SD_VPRX_CTL, 0x1F, sample_point); | ||
492 | else | ||
493 | rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, | ||
494 | SD_VPTX_CTL, 0x1F, sample_point); | ||
490 | rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_VPCLK0_CTL, PHASE_NOT_RESET, 0); | 495 | rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_VPCLK0_CTL, PHASE_NOT_RESET, 0); |
491 | rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_VPCLK0_CTL, | 496 | rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_VPCLK0_CTL, |
492 | PHASE_NOT_RESET, PHASE_NOT_RESET); | 497 | PHASE_NOT_RESET, PHASE_NOT_RESET); |
@@ -602,7 +607,7 @@ static int sd_tuning_rx_cmd(struct realtek_pci_sdmmc *host, | |||
602 | int err; | 607 | int err; |
603 | u8 cmd[5] = {0}; | 608 | u8 cmd[5] = {0}; |
604 | 609 | ||
605 | err = sd_change_phase(host, sample_point); | 610 | err = sd_change_phase(host, sample_point, true); |
606 | if (err < 0) | 611 | if (err < 0) |
607 | return err; | 612 | return err; |
608 | 613 | ||
@@ -664,7 +669,7 @@ static int sd_tuning_rx(struct realtek_pci_sdmmc *host, u8 opcode) | |||
664 | if (final_phase == 0xFF) | 669 | if (final_phase == 0xFF) |
665 | return -EINVAL; | 670 | return -EINVAL; |
666 | 671 | ||
667 | err = sd_change_phase(host, final_phase); | 672 | err = sd_change_phase(host, final_phase, true); |
668 | if (err < 0) | 673 | if (err < 0) |
669 | return err; | 674 | return err; |
670 | } else { | 675 | } else { |
@@ -833,14 +838,11 @@ static int sd_set_power_mode(struct realtek_pci_sdmmc *host, | |||
833 | return err; | 838 | return err; |
834 | } | 839 | } |
835 | 840 | ||
836 | static int sd_set_timing(struct realtek_pci_sdmmc *host, | 841 | static int sd_set_timing(struct realtek_pci_sdmmc *host, unsigned char timing) |
837 | unsigned char timing, bool *ddr_mode) | ||
838 | { | 842 | { |
839 | struct rtsx_pcr *pcr = host->pcr; | 843 | struct rtsx_pcr *pcr = host->pcr; |
840 | int err = 0; | 844 | int err = 0; |
841 | 845 | ||
842 | *ddr_mode = false; | ||
843 | |||
844 | rtsx_pci_init_cmd(pcr); | 846 | rtsx_pci_init_cmd(pcr); |
845 | 847 | ||
846 | switch (timing) { | 848 | switch (timing) { |
@@ -857,8 +859,6 @@ static int sd_set_timing(struct realtek_pci_sdmmc *host, | |||
857 | break; | 859 | break; |
858 | 860 | ||
859 | case MMC_TIMING_UHS_DDR50: | 861 | case MMC_TIMING_UHS_DDR50: |
860 | *ddr_mode = true; | ||
861 | |||
862 | rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_CFG1, | 862 | rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, SD_CFG1, |
863 | 0x0C | SD_ASYNC_FIFO_NOT_RST, | 863 | 0x0C | SD_ASYNC_FIFO_NOT_RST, |
864 | SD_DDR_MODE | SD_ASYNC_FIFO_NOT_RST); | 864 | SD_DDR_MODE | SD_ASYNC_FIFO_NOT_RST); |
@@ -926,7 +926,7 @@ static void sdmmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) | |||
926 | 926 | ||
927 | sd_set_bus_width(host, ios->bus_width); | 927 | sd_set_bus_width(host, ios->bus_width); |
928 | sd_set_power_mode(host, ios->power_mode); | 928 | sd_set_power_mode(host, ios->power_mode); |
929 | sd_set_timing(host, ios->timing, &host->ddr_mode); | 929 | sd_set_timing(host, ios->timing); |
930 | 930 | ||
931 | host->vpclk = false; | 931 | host->vpclk = false; |
932 | host->double_clk = true; | 932 | host->double_clk = true; |
@@ -1148,9 +1148,35 @@ static int sdmmc_execute_tuning(struct mmc_host *mmc, u32 opcode) | |||
1148 | 1148 | ||
1149 | rtsx_pci_start_run(pcr); | 1149 | rtsx_pci_start_run(pcr); |
1150 | 1150 | ||
1151 | if (!host->ddr_mode) | 1151 | /* Set initial TX phase */ |
1152 | err = sd_tuning_rx(host, MMC_SEND_TUNING_BLOCK); | 1152 | switch (mmc->ios.timing) { |
1153 | case MMC_TIMING_UHS_SDR104: | ||
1154 | err = sd_change_phase(host, SDR104_TX_PHASE(pcr), false); | ||
1155 | break; | ||
1156 | |||
1157 | case MMC_TIMING_UHS_SDR50: | ||
1158 | err = sd_change_phase(host, SDR50_TX_PHASE(pcr), false); | ||
1159 | break; | ||
1160 | |||
1161 | case MMC_TIMING_UHS_DDR50: | ||
1162 | err = sd_change_phase(host, DDR50_TX_PHASE(pcr), false); | ||
1163 | break; | ||
1164 | |||
1165 | default: | ||
1166 | err = 0; | ||
1167 | } | ||
1153 | 1168 | ||
1169 | if (err) | ||
1170 | goto out; | ||
1171 | |||
1172 | /* Tuning RX phase */ | ||
1173 | if ((mmc->ios.timing == MMC_TIMING_UHS_SDR104) || | ||
1174 | (mmc->ios.timing == MMC_TIMING_UHS_SDR50)) | ||
1175 | err = sd_tuning_rx(host, opcode); | ||
1176 | else if (mmc->ios.timing == MMC_TIMING_UHS_DDR50) | ||
1177 | err = sd_change_phase(host, DDR50_RX_PHASE(pcr), true); | ||
1178 | |||
1179 | out: | ||
1154 | mutex_unlock(&pcr->pcr_mutex); | 1180 | mutex_unlock(&pcr->pcr_mutex); |
1155 | 1181 | ||
1156 | return err; | 1182 | return err; |
diff --git a/include/linux/mfd/rtsx_pci.h b/include/linux/mfd/rtsx_pci.h index daefca1bafb3..d1382dfbeff0 100644 --- a/include/linux/mfd/rtsx_pci.h +++ b/include/linux/mfd/rtsx_pci.h | |||
@@ -847,6 +847,9 @@ struct rtsx_pcr { | |||
847 | #define PCR_REVERSE_SOCKET (1 << 1) | 847 | #define PCR_REVERSE_SOCKET (1 << 1) |
848 | u32 flags; | 848 | u32 flags; |
849 | 849 | ||
850 | u32 tx_initial_phase; | ||
851 | u32 rx_initial_phase; | ||
852 | |||
850 | const u32 *sd_pull_ctl_enable_tbl; | 853 | const u32 *sd_pull_ctl_enable_tbl; |
851 | const u32 *sd_pull_ctl_disable_tbl; | 854 | const u32 *sd_pull_ctl_disable_tbl; |
852 | const u32 *ms_pull_ctl_enable_tbl; | 855 | const u32 *ms_pull_ctl_enable_tbl; |
@@ -863,6 +866,18 @@ struct rtsx_pcr { | |||
863 | #define PCI_VID(pcr) ((pcr)->pci->vendor) | 866 | #define PCI_VID(pcr) ((pcr)->pci->vendor) |
864 | #define PCI_PID(pcr) ((pcr)->pci->device) | 867 | #define PCI_PID(pcr) ((pcr)->pci->device) |
865 | 868 | ||
869 | #define SDR104_PHASE(val) ((val) & 0xFF) | ||
870 | #define SDR50_PHASE(val) (((val) >> 8) & 0xFF) | ||
871 | #define DDR50_PHASE(val) (((val) >> 16) & 0xFF) | ||
872 | #define SDR104_TX_PHASE(pcr) SDR104_PHASE((pcr)->tx_initial_phase) | ||
873 | #define SDR50_TX_PHASE(pcr) SDR50_PHASE((pcr)->tx_initial_phase) | ||
874 | #define DDR50_TX_PHASE(pcr) DDR50_PHASE((pcr)->tx_initial_phase) | ||
875 | #define SDR104_RX_PHASE(pcr) SDR104_PHASE((pcr)->rx_initial_phase) | ||
876 | #define SDR50_RX_PHASE(pcr) SDR50_PHASE((pcr)->rx_initial_phase) | ||
877 | #define DDR50_RX_PHASE(pcr) DDR50_PHASE((pcr)->rx_initial_phase) | ||
878 | #define SET_CLOCK_PHASE(sdr104, sdr50, ddr50) \ | ||
879 | (((ddr50) << 16) | ((sdr50) << 8) | (sdr104)) | ||
880 | |||
866 | void rtsx_pci_start_run(struct rtsx_pcr *pcr); | 881 | void rtsx_pci_start_run(struct rtsx_pcr *pcr); |
867 | int rtsx_pci_write_register(struct rtsx_pcr *pcr, u16 addr, u8 mask, u8 data); | 882 | int rtsx_pci_write_register(struct rtsx_pcr *pcr, u16 addr, u8 mask, u8 data); |
868 | int rtsx_pci_read_register(struct rtsx_pcr *pcr, u16 addr, u8 *data); | 883 | int rtsx_pci_read_register(struct rtsx_pcr *pcr, u16 addr, u8 *data); |