aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWei WANG <wei_wang@realsil.com.cn>2013-08-20 21:46:25 -0400
committerSamuel Ortiz <sameo@linux.intel.com>2013-08-30 08:24:07 -0400
commit84d72f9cc21d6e41c620dd34b8248734cd02d995 (patch)
treef84a291737af9885fb573adc4844fc4e0c0c74c5
parent828fa1e60117535d9b1e1b09444842ae66e8424d (diff)
mfd: mmc: rtsx: Change default tx phase
The default phase can meet most cards' requirement, but it is not the optimal one. In some extreme situation, the rx phase point produced by the following tuning process will drift quite a distance. Before tuning UHS card, this patch will set a more proper initial tx phase point, which is calculated from statistic data, and can achieve a much better tx signal quality. Signed-off-by: Wei WANG <wei_wang@realsil.com.cn> Acked-by: Lee Jones <lee.jones@linaro.org> Acked-by: Chris Ball <cjb@laptop.org> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
-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);