Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mfd: rtsx: Add support for rts524A

add support for new chip rts524A.

Signed-off-by: Micky Ching <micky_ching@realsil.com.cn>
Signed-off-by: Lee Jones <lee.jones@linaro.org>

authored by

Micky Ching and committed by
Lee Jones
663c425f 19f3bd54

+318 -32
+158 -28
drivers/mfd/rts5249.c
··· 65 65 0xFF, driving[drive_sel][2]); 66 66 } 67 67 68 - static void rts5249_fetch_vendor_settings(struct rtsx_pcr *pcr) 68 + static void rtsx_base_fetch_vendor_settings(struct rtsx_pcr *pcr) 69 69 { 70 70 u32 reg; 71 71 72 72 rtsx_pci_read_config_dword(pcr, PCR_SETTING_REG1, &reg); 73 73 dev_dbg(&(pcr->pci->dev), "Cfg 0x%x: 0x%x\n", PCR_SETTING_REG1, reg); 74 74 75 - if (!rtsx_vendor_setting_valid(reg)) 75 + if (!rtsx_vendor_setting_valid(reg)) { 76 + pcr_dbg(pcr, "skip fetch vendor setting\n"); 76 77 return; 78 + } 77 79 78 80 pcr->aspm_en = rtsx_reg_to_aspm(reg); 79 81 pcr->sd30_drive_sel_1v8 = rtsx_reg_to_sd30_drive_sel_1v8(reg); ··· 89 87 pcr->flags |= PCR_REVERSE_SOCKET; 90 88 } 91 89 92 - static void rts5249_force_power_down(struct rtsx_pcr *pcr, u8 pm_state) 90 + static void rtsx_base_force_power_down(struct rtsx_pcr *pcr, u8 pm_state) 93 91 { 94 92 /* Set relink_time to 0 */ 95 93 rtsx_pci_write_register(pcr, AUTOLOAD_CFG_BASE + 1, 0xFF, 0); ··· 97 95 rtsx_pci_write_register(pcr, AUTOLOAD_CFG_BASE + 3, 0x01, 0); 98 96 99 97 if (pm_state == HOST_ENTER_S3) 100 - rtsx_pci_write_register(pcr, PM_CTRL3, 0x10, 0x10); 98 + rtsx_pci_write_register(pcr, pcr->reg_pm_ctrl3, 99 + D3_DELINK_MODE_EN, D3_DELINK_MODE_EN); 101 100 102 101 rtsx_pci_write_register(pcr, FPDCTL, 0x03, 0x03); 103 102 } ··· 107 104 { 108 105 rtsx_pci_init_cmd(pcr); 109 106 107 + /* Rest L1SUB Config */ 108 + rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, L1SUB_CONFIG3, 0xFF, 0x00); 110 109 /* Configure GPIO as output */ 111 110 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, GPIO_CTL, 0x02, 0x02); 112 111 /* Reset ASPM state to default value */ ··· 194 189 PHY_TUNE_TUNED12 | PHY_TUNE_TUNEA12); 195 190 } 196 191 197 - static int rts5249_turn_on_led(struct rtsx_pcr *pcr) 192 + static int rtsx_base_turn_on_led(struct rtsx_pcr *pcr) 198 193 { 199 194 return rtsx_pci_write_register(pcr, GPIO_CTL, 0x02, 0x02); 200 195 } 201 196 202 - static int rts5249_turn_off_led(struct rtsx_pcr *pcr) 197 + static int rtsx_base_turn_off_led(struct rtsx_pcr *pcr) 203 198 { 204 199 return rtsx_pci_write_register(pcr, GPIO_CTL, 0x02, 0x00); 205 200 } 206 201 207 - static int rts5249_enable_auto_blink(struct rtsx_pcr *pcr) 202 + static int rtsx_base_enable_auto_blink(struct rtsx_pcr *pcr) 208 203 { 209 204 return rtsx_pci_write_register(pcr, OLT_LED_CTL, 0x08, 0x08); 210 205 } 211 206 212 - static int rts5249_disable_auto_blink(struct rtsx_pcr *pcr) 207 + static int rtsx_base_disable_auto_blink(struct rtsx_pcr *pcr) 213 208 { 214 209 return rtsx_pci_write_register(pcr, OLT_LED_CTL, 0x08, 0x00); 215 210 } 216 211 217 - static int rts5249_card_power_on(struct rtsx_pcr *pcr, int card) 212 + static int rtsx_base_card_power_on(struct rtsx_pcr *pcr, int card) 218 213 { 219 214 int err; 220 215 ··· 241 236 return 0; 242 237 } 243 238 244 - static int rts5249_card_power_off(struct rtsx_pcr *pcr, int card) 239 + static int rtsx_base_card_power_off(struct rtsx_pcr *pcr, int card) 245 240 { 246 241 rtsx_pci_init_cmd(pcr); 247 242 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, CARD_PWR_CTL, ··· 251 246 return rtsx_pci_send_cmd(pcr, 100); 252 247 } 253 248 254 - static int rts5249_switch_output_voltage(struct rtsx_pcr *pcr, u8 voltage) 249 + static int rtsx_base_switch_output_voltage(struct rtsx_pcr *pcr, u8 voltage) 255 250 { 256 251 int err; 252 + u16 append; 257 253 258 - if (voltage == OUTPUT_3V3) { 259 - err = rtsx_pci_write_phy_register(pcr, PHY_TUNE, 0x4FC0 | 0x24); 254 + switch (voltage) { 255 + case OUTPUT_3V3: 256 + err = rtsx_pci_update_phy(pcr, PHY_TUNE, PHY_TUNE_VOLTAGE_MASK, 257 + PHY_TUNE_VOLTAGE_3V3); 260 258 if (err < 0) 261 259 return err; 262 - } else if (voltage == OUTPUT_1V8) { 263 - err = rtsx_pci_write_phy_register(pcr, PHY_BACR, 0x3C02); 260 + break; 261 + case OUTPUT_1V8: 262 + append = PHY_TUNE_D18_1V8; 263 + if (CHK_PCI_PID(pcr, 0x5249)) { 264 + err = rtsx_pci_update_phy(pcr, PHY_BACR, 265 + PHY_BACR_BASIC_MASK, 0); 266 + if (err < 0) 267 + return err; 268 + append = PHY_TUNE_D18_1V7; 269 + } 270 + 271 + err = rtsx_pci_update_phy(pcr, PHY_TUNE, PHY_TUNE_VOLTAGE_MASK, 272 + append); 264 273 if (err < 0) 265 274 return err; 266 - err = rtsx_pci_write_phy_register(pcr, PHY_TUNE, 0x4C40 | 0x24); 267 - if (err < 0) 268 - return err; 269 - } else { 275 + break; 276 + default: 277 + pcr_dbg(pcr, "unknown output voltage %d\n", voltage); 270 278 return -EINVAL; 271 279 } 272 280 ··· 290 272 } 291 273 292 274 static const struct pcr_ops rts5249_pcr_ops = { 293 - .fetch_vendor_settings = rts5249_fetch_vendor_settings, 275 + .fetch_vendor_settings = rtsx_base_fetch_vendor_settings, 294 276 .extra_init_hw = rts5249_extra_init_hw, 295 277 .optimize_phy = rts5249_optimize_phy, 296 - .turn_on_led = rts5249_turn_on_led, 297 - .turn_off_led = rts5249_turn_off_led, 298 - .enable_auto_blink = rts5249_enable_auto_blink, 299 - .disable_auto_blink = rts5249_disable_auto_blink, 300 - .card_power_on = rts5249_card_power_on, 301 - .card_power_off = rts5249_card_power_off, 302 - .switch_output_voltage = rts5249_switch_output_voltage, 303 - .force_power_down = rts5249_force_power_down, 278 + .turn_on_led = rtsx_base_turn_on_led, 279 + .turn_off_led = rtsx_base_turn_off_led, 280 + .enable_auto_blink = rtsx_base_enable_auto_blink, 281 + .disable_auto_blink = rtsx_base_disable_auto_blink, 282 + .card_power_on = rtsx_base_card_power_on, 283 + .card_power_off = rtsx_base_card_power_off, 284 + .switch_output_voltage = rtsx_base_switch_output_voltage, 285 + .force_power_down = rtsx_base_force_power_down, 304 286 }; 305 287 306 288 /* SD Pull Control Enable: ··· 374 356 pcr->sd_pull_ctl_disable_tbl = rts5249_sd_pull_ctl_disable_tbl; 375 357 pcr->ms_pull_ctl_enable_tbl = rts5249_ms_pull_ctl_enable_tbl; 376 358 pcr->ms_pull_ctl_disable_tbl = rts5249_ms_pull_ctl_disable_tbl; 359 + 360 + pcr->reg_pm_ctrl3 = PM_CTRL3; 377 361 } 362 + 363 + static int rts524a_write_phy(struct rtsx_pcr *pcr, u8 addr, u16 val) 364 + { 365 + addr = addr & 0x80 ? (addr & 0x7F) | 0x40 : addr; 366 + 367 + return __rtsx_pci_write_phy_register(pcr, addr, val); 368 + } 369 + 370 + static int rts524a_read_phy(struct rtsx_pcr *pcr, u8 addr, u16 *val) 371 + { 372 + addr = addr & 0x80 ? (addr & 0x7F) | 0x40 : addr; 373 + 374 + return __rtsx_pci_read_phy_register(pcr, addr, val); 375 + } 376 + 377 + static int rts524a_optimize_phy(struct rtsx_pcr *pcr) 378 + { 379 + int err; 380 + 381 + err = rtsx_pci_write_register(pcr, RTS524A_PM_CTRL3, 382 + D3_DELINK_MODE_EN, 0x00); 383 + if (err < 0) 384 + return err; 385 + 386 + rtsx_pci_write_phy_register(pcr, PHY_PCR, 387 + PHY_PCR_FORCE_CODE | PHY_PCR_OOBS_CALI_50 | 388 + PHY_PCR_OOBS_VCM_08 | PHY_PCR_OOBS_SEN_90 | PHY_PCR_RSSI_EN); 389 + rtsx_pci_write_phy_register(pcr, PHY_SSCCR3, 390 + PHY_SSCCR3_STEP_IN | PHY_SSCCR3_CHECK_DELAY); 391 + 392 + if (is_version(pcr, 0x524A, IC_VER_A)) { 393 + rtsx_pci_write_phy_register(pcr, PHY_SSCCR3, 394 + PHY_SSCCR3_STEP_IN | PHY_SSCCR3_CHECK_DELAY); 395 + rtsx_pci_write_phy_register(pcr, PHY_SSCCR2, 396 + PHY_SSCCR2_PLL_NCODE | PHY_SSCCR2_TIME0 | 397 + PHY_SSCCR2_TIME2_WIDTH); 398 + rtsx_pci_write_phy_register(pcr, PHY_ANA1A, 399 + PHY_ANA1A_TXR_LOOPBACK | PHY_ANA1A_RXT_BIST | 400 + PHY_ANA1A_TXR_BIST | PHY_ANA1A_REV); 401 + rtsx_pci_write_phy_register(pcr, PHY_ANA1D, 402 + PHY_ANA1D_DEBUG_ADDR); 403 + rtsx_pci_write_phy_register(pcr, PHY_DIG1E, 404 + PHY_DIG1E_REV | PHY_DIG1E_D0_X_D1 | 405 + PHY_DIG1E_RX_ON_HOST | PHY_DIG1E_RCLK_REF_HOST | 406 + PHY_DIG1E_RCLK_TX_EN_KEEP | 407 + PHY_DIG1E_RCLK_TX_TERM_KEEP | 408 + PHY_DIG1E_RCLK_RX_EIDLE_ON | PHY_DIG1E_TX_TERM_KEEP | 409 + PHY_DIG1E_RX_TERM_KEEP | PHY_DIG1E_TX_EN_KEEP | 410 + PHY_DIG1E_RX_EN_KEEP); 411 + } 412 + 413 + rtsx_pci_write_phy_register(pcr, PHY_ANA08, 414 + PHY_ANA08_RX_EQ_DCGAIN | PHY_ANA08_SEL_RX_EN | 415 + PHY_ANA08_RX_EQ_VAL | PHY_ANA08_SCP | PHY_ANA08_SEL_IPI); 416 + 417 + return 0; 418 + } 419 + 420 + static int rts524a_extra_init_hw(struct rtsx_pcr *pcr) 421 + { 422 + rts5249_extra_init_hw(pcr); 423 + 424 + rtsx_pci_write_register(pcr, FUNC_FORCE_CTL, 425 + FORCE_ASPM_L1_EN, FORCE_ASPM_L1_EN); 426 + rtsx_pci_write_register(pcr, PM_EVENT_DEBUG, PME_DEBUG_0, PME_DEBUG_0); 427 + rtsx_pci_write_register(pcr, LDO_VCC_CFG1, LDO_VCC_LMT_EN, 428 + LDO_VCC_LMT_EN); 429 + rtsx_pci_write_register(pcr, PCLK_CTL, PCLK_MODE_SEL, PCLK_MODE_SEL); 430 + if (is_version(pcr, 0x524A, IC_VER_A)) { 431 + rtsx_pci_write_register(pcr, LDO_DV18_CFG, 432 + LDO_DV18_SR_MASK, LDO_DV18_SR_DF); 433 + rtsx_pci_write_register(pcr, LDO_VCC_CFG1, 434 + LDO_VCC_REF_TUNE_MASK, LDO_VCC_REF_1V2); 435 + rtsx_pci_write_register(pcr, LDO_VIO_CFG, 436 + LDO_VIO_REF_TUNE_MASK, LDO_VIO_REF_1V2); 437 + rtsx_pci_write_register(pcr, LDO_VIO_CFG, 438 + LDO_VIO_SR_MASK, LDO_VIO_SR_DF); 439 + rtsx_pci_write_register(pcr, LDO_DV12S_CFG, 440 + LDO_REF12_TUNE_MASK, LDO_REF12_TUNE_DF); 441 + rtsx_pci_write_register(pcr, SD40_LDO_CTL1, 442 + SD40_VIO_TUNE_MASK, SD40_VIO_TUNE_1V7); 443 + } 444 + 445 + return 0; 446 + } 447 + 448 + static const struct pcr_ops rts524a_pcr_ops = { 449 + .write_phy = rts524a_write_phy, 450 + .read_phy = rts524a_read_phy, 451 + .fetch_vendor_settings = rtsx_base_fetch_vendor_settings, 452 + .extra_init_hw = rts524a_extra_init_hw, 453 + .optimize_phy = rts524a_optimize_phy, 454 + .turn_on_led = rtsx_base_turn_on_led, 455 + .turn_off_led = rtsx_base_turn_off_led, 456 + .enable_auto_blink = rtsx_base_enable_auto_blink, 457 + .disable_auto_blink = rtsx_base_disable_auto_blink, 458 + .card_power_on = rtsx_base_card_power_on, 459 + .card_power_off = rtsx_base_card_power_off, 460 + .switch_output_voltage = rtsx_base_switch_output_voltage, 461 + .force_power_down = rtsx_base_force_power_down, 462 + }; 463 + 464 + void rts524a_init_params(struct rtsx_pcr *pcr) 465 + { 466 + rts5249_init_params(pcr); 467 + 468 + pcr->reg_pm_ctrl3 = RTS524A_PM_CTRL3; 469 + pcr->ops = &rts524a_pcr_ops; 470 + } 471 +
+23 -2
drivers/mfd/rtsx_pcr.c
··· 58 58 { PCI_DEVICE(0x10EC, 0x5249), PCI_CLASS_OTHERS << 16, 0xFF0000 }, 59 59 { PCI_DEVICE(0x10EC, 0x5287), PCI_CLASS_OTHERS << 16, 0xFF0000 }, 60 60 { PCI_DEVICE(0x10EC, 0x5286), PCI_CLASS_OTHERS << 16, 0xFF0000 }, 61 + { PCI_DEVICE(0x10EC, 0x524A), PCI_CLASS_OTHERS << 16, 0xFF0000 }, 61 62 { 0, } 62 63 }; 63 64 ··· 143 142 } 144 143 EXPORT_SYMBOL_GPL(rtsx_pci_read_register); 145 144 146 - int rtsx_pci_write_phy_register(struct rtsx_pcr *pcr, u8 addr, u16 val) 145 + int __rtsx_pci_write_phy_register(struct rtsx_pcr *pcr, u8 addr, u16 val) 147 146 { 148 147 int err, i, finished = 0; 149 148 u8 tmp; ··· 175 174 176 175 return 0; 177 176 } 177 + 178 + int rtsx_pci_write_phy_register(struct rtsx_pcr *pcr, u8 addr, u16 val) 179 + { 180 + if (pcr->ops->write_phy) 181 + return pcr->ops->write_phy(pcr, addr, val); 182 + 183 + return __rtsx_pci_write_phy_register(pcr, addr, val); 184 + } 178 185 EXPORT_SYMBOL_GPL(rtsx_pci_write_phy_register); 179 186 180 - int rtsx_pci_read_phy_register(struct rtsx_pcr *pcr, u8 addr, u16 *val) 187 + int __rtsx_pci_read_phy_register(struct rtsx_pcr *pcr, u8 addr, u16 *val) 181 188 { 182 189 int err, i, finished = 0; 183 190 u16 data; ··· 230 221 *val = data; 231 222 232 223 return 0; 224 + } 225 + 226 + int rtsx_pci_read_phy_register(struct rtsx_pcr *pcr, u8 addr, u16 *val) 227 + { 228 + if (pcr->ops->read_phy) 229 + return pcr->ops->read_phy(pcr, addr, val); 230 + 231 + return __rtsx_pci_read_phy_register(pcr, addr, val); 233 232 } 234 233 EXPORT_SYMBOL_GPL(rtsx_pci_read_phy_register); 235 234 ··· 1108 1091 1109 1092 case 0x5249: 1110 1093 rts5249_init_params(pcr); 1094 + break; 1095 + 1096 + case 0x524A: 1097 + rts524a_init_params(pcr); 1111 1098 break; 1112 1099 1113 1100 case 0x5287:
+7
drivers/mfd/rtsx_pcr.h
··· 27 27 #define MIN_DIV_N_PCR 80 28 28 #define MAX_DIV_N_PCR 208 29 29 30 + #define RTS524A_PME_FORCE_CTL 0xFF78 31 + #define RTS524A_PM_CTRL3 0xFF7E 32 + 33 + int __rtsx_pci_write_phy_register(struct rtsx_pcr *pcr, u8 addr, u16 val); 34 + int __rtsx_pci_read_phy_register(struct rtsx_pcr *pcr, u8 addr, u16 *val); 35 + 30 36 void rts5209_init_params(struct rtsx_pcr *pcr); 31 37 void rts5229_init_params(struct rtsx_pcr *pcr); 32 38 void rtl8411_init_params(struct rtsx_pcr *pcr); 33 39 void rtl8402_init_params(struct rtsx_pcr *pcr); 34 40 void rts5227_init_params(struct rtsx_pcr *pcr); 35 41 void rts5249_init_params(struct rtsx_pcr *pcr); 42 + void rts524a_init_params(struct rtsx_pcr *pcr); 36 43 void rtl8411b_init_params(struct rtsx_pcr *pcr); 37 44 38 45 static inline u8 map_sd_drive(int idx)
+130 -2
include/linux/mfd/rtsx_pci.h
··· 577 577 578 578 #define CDRESUMECTL 0xFE52 579 579 #define WAKE_SEL_CTL 0xFE54 580 + #define PCLK_CTL 0xFE55 581 + #define PCLK_MODE_SEL 0x20 580 582 #define PME_FORCE_CTL 0xFE56 583 + 581 584 #define ASPM_FORCE_CTL 0xFE57 585 + #define FORCE_ASPM_CTL0 0x10 586 + #define FORCE_ASPM_VAL_MASK 0x03 587 + #define FORCE_ASPM_L1_EN 0x02 588 + #define FORCE_ASPM_L0_EN 0x01 589 + #define FORCE_ASPM_NO_ASPM 0x00 582 590 #define PM_CLK_FORCE_CTL 0xFE58 583 591 #define FUNC_FORCE_CTL 0xFE59 584 592 #define PERST_GLITCH_WIDTH 0xFE5C ··· 598 590 #define HOST_ENTER_S3 2 599 591 600 592 #define SDIO_CFG 0xFE70 601 - 593 + #define PM_EVENT_DEBUG 0xFE71 594 + #define PME_DEBUG_0 0x08 602 595 #define NFTS_TX_CTRL 0xFE72 603 596 604 597 #define PWR_GATE_CTRL 0xFE75 ··· 611 602 #define PWD_SUSPEND_EN 0xFE76 612 603 #define LDO_PWR_SEL 0xFE78 613 604 605 + #define L1SUB_CONFIG1 0xFE8D 606 + #define L1SUB_CONFIG2 0xFE8E 607 + #define L1SUB_AUTO_CFG 0x02 608 + #define L1SUB_CONFIG3 0xFE8F 609 + 614 610 #define DUMMY_REG_RESET_0 0xFE90 615 611 616 612 #define AUTOLOAD_CFG_BASE 0xFF00 617 613 #define PETXCFG 0xFF03 618 614 619 615 #define PM_CTRL1 0xFF44 616 + #define CD_RESUME_EN_MASK 0xF0 617 + 620 618 #define PM_CTRL2 0xFF45 621 619 #define PM_CTRL3 0xFF46 622 620 #define SDIO_SEND_PME_EN 0x80 ··· 644 628 #define IMAGE_FLAG_ADDR0 0xCE80 645 629 #define IMAGE_FLAG_ADDR1 0xCE81 646 630 631 + #define RREF_CFG 0xFF6C 632 + #define RREF_VBGSEL_MASK 0x38 633 + #define RREF_VBGSEL_1V25 0x28 634 + 635 + #define OOBS_CONFIG 0xFF6E 636 + #define OOBS_AUTOK_DIS 0x80 637 + #define OOBS_VAL_MASK 0x1F 638 + 639 + #define LDO_DV18_CFG 0xFF70 640 + #define LDO_DV18_SR_MASK 0xC0 641 + #define LDO_DV18_SR_DF 0x40 642 + 643 + #define LDO_CONFIG2 0xFF71 644 + #define LDO_D3318_MASK 0x07 645 + #define LDO_D3318_33V 0x07 646 + #define LDO_D3318_18V 0x02 647 + 648 + #define LDO_VCC_CFG0 0xFF72 649 + #define LDO_VCC_LMTVTH_MASK 0x30 650 + #define LDO_VCC_LMTVTH_2A 0x10 651 + 652 + #define LDO_VCC_CFG1 0xFF73 653 + #define LDO_VCC_REF_TUNE_MASK 0x30 654 + #define LDO_VCC_REF_1V2 0x20 655 + #define LDO_VCC_TUNE_MASK 0x07 656 + #define LDO_VCC_1V8 0x04 657 + #define LDO_VCC_3V3 0x07 658 + #define LDO_VCC_LMT_EN 0x08 659 + 660 + #define LDO_VIO_CFG 0xFF75 661 + #define LDO_VIO_SR_MASK 0xC0 662 + #define LDO_VIO_SR_DF 0x40 663 + #define LDO_VIO_REF_TUNE_MASK 0x30 664 + #define LDO_VIO_REF_1V2 0x20 665 + #define LDO_VIO_TUNE_MASK 0x07 666 + #define LDO_VIO_1V7 0x03 667 + #define LDO_VIO_1V8 0x04 668 + #define LDO_VIO_3V3 0x07 669 + 670 + #define LDO_DV12S_CFG 0xFF76 671 + #define LDO_REF12_TUNE_MASK 0x18 672 + #define LDO_REF12_TUNE_DF 0x10 673 + #define LDO_D12_TUNE_MASK 0x07 674 + #define LDO_D12_TUNE_DF 0x04 675 + 676 + #define LDO_AV12S_CFG 0xFF77 677 + #define LDO_AV12S_TUNE_MASK 0x07 678 + #define LDO_AV12S_TUNE_DF 0x04 679 + 680 + #define SD40_LDO_CTL1 0xFE7D 681 + #define SD40_VIO_TUNE_MASK 0x70 682 + #define SD40_VIO_TUNE_1V7 0x30 683 + #define SD_VIO_LDO_1V8 0x40 684 + #define SD_VIO_LDO_3V3 0x70 685 + 647 686 /* Phy register */ 648 687 #define PHY_PCR 0x00 649 688 #define PHY_PCR_FORCE_CODE 0xB000 ··· 712 641 #define PHY_RCR1 0x02 713 642 #define PHY_RCR1_ADP_TIME_4 0x0400 714 643 #define PHY_RCR1_VCO_COARSE 0x001F 644 + #define PHY_SSCCR2 0x02 645 + #define PHY_SSCCR2_PLL_NCODE 0x0A00 646 + #define PHY_SSCCR2_TIME0 0x001C 647 + #define PHY_SSCCR2_TIME2_WIDTH 0x0003 715 648 716 649 #define PHY_RCR2 0x03 717 650 #define PHY_RCR2_EMPHASE_EN 0x8000 ··· 724 649 #define PHY_RCR2_FREQSEL_12 0x0040 725 650 #define PHY_RCR2_CDR_SC_12P 0x0010 726 651 #define PHY_RCR2_CALIB_LATE 0x0002 652 + #define PHY_SSCCR3 0x03 653 + #define PHY_SSCCR3_STEP_IN 0x2740 654 + #define PHY_SSCCR3_CHECK_DELAY 0x0008 727 655 728 656 #define PHY_RTCR 0x04 729 657 #define PHY_RDR 0x05 ··· 741 663 #define PHY_TUNE_TUNED18 0x01C0 742 664 #define PHY_TUNE_TUNED12 0X0020 743 665 #define PHY_TUNE_TUNEA12 0x0004 666 + #define PHY_TUNE_VOLTAGE_MASK 0xFC3F 667 + #define PHY_TUNE_VOLTAGE_3V3 0x03C0 668 + #define PHY_TUNE_D18_1V8 0x0100 669 + #define PHY_TUNE_D18_1V7 0x0080 670 + #define PHY_ANA08 0x08 671 + #define PHY_ANA08_RX_EQ_DCGAIN 0x5000 672 + #define PHY_ANA08_SEL_RX_EN 0x0400 673 + #define PHY_ANA08_RX_EQ_VAL 0x03C0 674 + #define PHY_ANA08_SCP 0x0020 675 + #define PHY_ANA08_SEL_IPI 0x0004 744 676 745 677 #define PHY_IMR 0x09 746 678 #define PHY_BPCR 0x0A ··· 766 678 #define PHY_HOST_CLK_CTRL 0x0F 767 679 #define PHY_DMR 0x10 768 680 #define PHY_BACR 0x11 681 + #define PHY_BACR_BASIC_MASK 0xFFF3 769 682 #define PHY_IER 0x12 770 683 #define PHY_BCSR 0x13 771 684 #define PHY_BPR 0x14 ··· 787 698 #define PHY_REV_STOP_CLKWR 0x0004 788 699 789 700 #define PHY_FLD0 0x1A 701 + #define PHY_ANA1A 0x1A 702 + #define PHY_ANA1A_TXR_LOOPBACK 0x2000 703 + #define PHY_ANA1A_RXT_BIST 0x0500 704 + #define PHY_ANA1A_TXR_BIST 0x0040 705 + #define PHY_ANA1A_REV 0x0006 790 706 #define PHY_FLD1 0x1B 791 707 #define PHY_FLD2 0x1C 792 708 #define PHY_FLD3 0x1D 793 709 #define PHY_FLD3_TIMER_4 0x0800 794 710 #define PHY_FLD3_TIMER_6 0x0020 795 711 #define PHY_FLD3_RXDELINK 0x0004 712 + #define PHY_ANA1D 0x1D 713 + #define PHY_ANA1D_DEBUG_ADDR 0x0004 796 714 797 715 #define PHY_FLD4 0x1E 798 716 #define PHY_FLD4_FLDEN_SEL 0x4000 ··· 809 713 #define PHY_FLD4_BER_COUNT 0x00E0 810 714 #define PHY_FLD4_BER_TIMER 0x000A 811 715 #define PHY_FLD4_BER_CHK_EN 0x0001 812 - 716 + #define PHY_DIG1E 0x1E 717 + #define PHY_DIG1E_REV 0x4000 718 + #define PHY_DIG1E_D0_X_D1 0x1000 719 + #define PHY_DIG1E_RX_ON_HOST 0x0800 720 + #define PHY_DIG1E_RCLK_REF_HOST 0x0400 721 + #define PHY_DIG1E_RCLK_TX_EN_KEEP 0x0040 722 + #define PHY_DIG1E_RCLK_TX_TERM_KEEP 0x0020 723 + #define PHY_DIG1E_RCLK_RX_EIDLE_ON 0x0010 724 + #define PHY_DIG1E_TX_TERM_KEEP 0x0008 725 + #define PHY_DIG1E_RX_TERM_KEEP 0x0004 726 + #define PHY_DIG1E_TX_EN_KEEP 0x0002 727 + #define PHY_DIG1E_RX_EN_KEEP 0x0001 813 728 #define PHY_DUM_REG 0x1F 814 729 815 730 #define PCR_SETTING_REG1 0x724 ··· 836 729 }; 837 730 838 731 struct pcr_ops { 732 + int (*write_phy)(struct rtsx_pcr *pcr, u8 addr, u16 val); 733 + int (*read_phy)(struct rtsx_pcr *pcr, u8 addr, u16 *val); 839 734 int (*extra_init_hw)(struct rtsx_pcr *pcr); 840 735 int (*optimize_phy)(struct rtsx_pcr *pcr); 841 736 int (*turn_on_led)(struct rtsx_pcr *pcr); ··· 932 823 const struct pcr_ops *ops; 933 824 enum PDEV_STAT state; 934 825 826 + u16 reg_pm_ctrl3; 827 + 935 828 int num_slots; 936 829 struct rtsx_slot *slots; 937 830 }; ··· 941 830 #define CHK_PCI_PID(pcr, pid) ((pcr)->pci->device == (pid)) 942 831 #define PCI_VID(pcr) ((pcr)->pci->vendor) 943 832 #define PCI_PID(pcr) ((pcr)->pci->device) 833 + #define is_version(pcr, pid, ver) \ 834 + (CHK_PCI_PID(pcr, pid) && (pcr)->ic_version == (ver)) 835 + #define pcr_dbg(pcr, fmt, arg...) \ 836 + dev_dbg(&(pcr)->pci->dev, fmt, ##arg) 944 837 945 838 #define SDR104_PHASE(val) ((val) & 0xFF) 946 839 #define SDR50_PHASE(val) (((val) >> 8) & 0xFF) ··· 1012 897 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, reg + 1, 0xFF, val >> 16); 1013 898 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, reg + 2, 0xFF, val >> 8); 1014 899 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, reg + 3, 0xFF, val); 900 + } 901 + 902 + static inline int rtsx_pci_update_phy(struct rtsx_pcr *pcr, u8 addr, 903 + u16 mask, u16 append) 904 + { 905 + int err; 906 + u16 val; 907 + 908 + err = rtsx_pci_read_phy_register(pcr, addr, &val); 909 + if (err < 0) 910 + return err; 911 + 912 + return rtsx_pci_write_phy_register(pcr, addr, (val & mask) | append); 1015 913 } 1016 914 1017 915 #endif