aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/mfd/rtl8411.c4
-rw-r--r--drivers/mfd/rts5209.c2
-rw-r--r--drivers/mfd/rts5227.c2
-rw-r--r--drivers/mfd/rts5229.c2
-rw-r--r--drivers/mfd/rts5249.c2
-rw-r--r--drivers/mmc/host/rtsx_pci_sdmmc.c58
-rw-r--r--include/linux/mfd/rtsx_pci.h15
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
478static int sd_change_phase(struct realtek_pci_sdmmc *host, u8 sample_point) 477static 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
836static int sd_set_timing(struct realtek_pci_sdmmc *host, 841static 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
1179out:
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
866void rtsx_pci_start_run(struct rtsx_pcr *pcr); 881void rtsx_pci_start_run(struct rtsx_pcr *pcr);
867int rtsx_pci_write_register(struct rtsx_pcr *pcr, u16 addr, u8 mask, u8 data); 882int rtsx_pci_write_register(struct rtsx_pcr *pcr, u16 addr, u8 mask, u8 data);
868int rtsx_pci_read_register(struct rtsx_pcr *pcr, u16 addr, u8 *data); 883int rtsx_pci_read_register(struct rtsx_pcr *pcr, u16 addr, u8 *data);