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

misc: rtsx: rts522a rts5228 rts5261 support Runtime PM

rts522a, rts5228, rts5261
add extra init flow for rtd3
add more power_down setting for avoid being woken up
by plugging or unplugging card when system in S3

Tested-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
Signed-off-by: Ricky Wu <ricky_wu@realtek.com>
Link: https://lore.kernel.org/r/dace32f573a445908fec0a10482c394c@realtek.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Ricky WU and committed by
Greg Kroah-Hartman
86f4c65f f4e335f3

+98 -5
+47
drivers/misc/cardreader/rts5227.c
··· 72 72 73 73 pci_read_config_dword(pdev, PCR_SETTING_REG2, &reg); 74 74 pcr_dbg(pcr, "Cfg 0x%x: 0x%x\n", PCR_SETTING_REG2, reg); 75 + if (CHK_PCI_PID(pcr, 0x522A)) 76 + pcr->rtd3_en = rtsx_reg_to_rtd3(reg); 75 77 if (rtsx_check_mmc_support(reg)) 76 78 pcr->extra_caps |= EXTRA_CAPS_NO_MMC; 77 79 pcr->sd30_drive_sel_3v3 = rtsx_reg_to_sd30_drive_sel_3v3(reg); ··· 172 170 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, PETXCFG, 0x30, 0x30); 173 171 else 174 172 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, PETXCFG, 0x30, 0x00); 173 + 174 + if (CHK_PCI_PID(pcr, 0x522A)) 175 + rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, RTS522A_AUTOLOAD_CFG1, 176 + CD_RESUME_EN_MASK, CD_RESUME_EN_MASK); 177 + 178 + if (pcr->rtd3_en) { 179 + if (CHK_PCI_PID(pcr, 0x522A)) { 180 + rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, RTS522A_PM_CTRL3, 0x01, 0x01); 181 + rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, RTS522A_PME_FORCE_CTL, 0x30, 0x30); 182 + } else { 183 + rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, PM_CTRL3, 0x01, 0x01); 184 + rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, PME_FORCE_CTL, 0xFF, 0x33); 185 + } 186 + } else { 187 + if (CHK_PCI_PID(pcr, 0x522A)) { 188 + rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, RTS522A_PM_CTRL3, 0x01, 0x00); 189 + rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, RTS522A_PME_FORCE_CTL, 0x30, 0x20); 190 + } else { 191 + rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, PME_FORCE_CTL, 0xFF, 0x30); 192 + rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, PM_CTRL3, 0x01, 0x00); 193 + } 194 + } 175 195 176 196 if (option->force_clkreq_0) 177 197 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, PETXCFG, ··· 462 438 return rtsx_pci_send_cmd(pcr, 100); 463 439 } 464 440 441 + static void rts522a_force_power_down(struct rtsx_pcr *pcr, u8 pm_state, bool runtime) 442 + { 443 + /* Set relink_time to 0 */ 444 + rtsx_pci_write_register(pcr, AUTOLOAD_CFG_BASE + 1, MASK_8_BIT_DEF, 0); 445 + rtsx_pci_write_register(pcr, AUTOLOAD_CFG_BASE + 2, MASK_8_BIT_DEF, 0); 446 + rtsx_pci_write_register(pcr, AUTOLOAD_CFG_BASE + 3, 447 + RELINK_TIME_MASK, 0); 448 + 449 + rtsx_pci_write_register(pcr, RTS522A_PM_CTRL3, 450 + D3_DELINK_MODE_EN, D3_DELINK_MODE_EN); 451 + 452 + if (!runtime) { 453 + rtsx_pci_write_register(pcr, RTS522A_AUTOLOAD_CFG1, 454 + CD_RESUME_EN_MASK, 0); 455 + rtsx_pci_write_register(pcr, RTS522A_PM_CTRL3, 0x01, 0x00); 456 + rtsx_pci_write_register(pcr, RTS522A_PME_FORCE_CTL, 0x30, 0x20); 457 + } 458 + 459 + rtsx_pci_write_register(pcr, FPDCTL, ALL_POWER_DOWN, ALL_POWER_DOWN); 460 + } 461 + 462 + 465 463 static void rts522a_set_l1off_cfg_sub_d0(struct rtsx_pcr *pcr, int active) 466 464 { 467 465 struct rtsx_cr_option *option = &pcr->option; ··· 519 473 .card_power_on = rts5227_card_power_on, 520 474 .card_power_off = rts5227_card_power_off, 521 475 .switch_output_voltage = rts522a_switch_output_voltage, 476 + .force_power_down = rts522a_force_power_down, 522 477 .cd_deglitch = NULL, 523 478 .conv_clk_and_div_n = NULL, 524 479 .set_l1off_cfg_sub_d0 = rts522a_set_l1off_cfg_sub_d0,
+19 -2
drivers/misc/cardreader/rts5228.c
··· 102 102 rtsx_pci_write_register(pcr, pcr->reg_pm_ctrl3, 103 103 D3_DELINK_MODE_EN, D3_DELINK_MODE_EN); 104 104 105 + if (!runtime) { 106 + rtsx_pci_write_register(pcr, RTS5228_AUTOLOAD_CFG1, 107 + CD_RESUME_EN_MASK, 0); 108 + rtsx_pci_write_register(pcr, pcr->reg_pm_ctrl3, 0x01, 0x00); 109 + rtsx_pci_write_register(pcr, RTS5228_REG_PME_FORCE_CTL, 110 + FORCE_PM_CONTROL | FORCE_PM_VALUE, FORCE_PM_CONTROL); 111 + } 112 + 105 113 rtsx_pci_write_register(pcr, FPDCTL, 106 114 SSC_POWER_DOWN, SSC_POWER_DOWN); 107 115 } ··· 488 480 FORCE_CLKREQ_DELINK_MASK, FORCE_CLKREQ_HIGH); 489 481 490 482 rtsx_pci_write_register(pcr, PWD_SUSPEND_EN, 0xFF, 0xFB); 491 - rtsx_pci_write_register(pcr, pcr->reg_pm_ctrl3, 0x10, 0x00); 483 + 484 + if (pcr->rtd3_en) { 485 + rtsx_pci_write_register(pcr, pcr->reg_pm_ctrl3, 0x01, 0x01); 492 486 rtsx_pci_write_register(pcr, RTS5228_REG_PME_FORCE_CTL, 493 - FORCE_PM_CONTROL | FORCE_PM_VALUE, FORCE_PM_CONTROL); 487 + FORCE_PM_CONTROL | FORCE_PM_VALUE, 488 + FORCE_PM_CONTROL | FORCE_PM_VALUE); 489 + } else { 490 + rtsx_pci_write_register(pcr, pcr->reg_pm_ctrl3, 0x01, 0x00); 491 + rtsx_pci_write_register(pcr, RTS5228_REG_PME_FORCE_CTL, 492 + FORCE_PM_CONTROL | FORCE_PM_VALUE, FORCE_PM_CONTROL); 493 + } 494 + rtsx_pci_write_register(pcr, pcr->reg_pm_ctrl3, D3_DELINK_MODE_EN, 0x00); 494 495 495 496 return 0; 496 497 }
+30 -3
drivers/misc/cardreader/rts5261.c
··· 103 103 rtsx_pci_write_register(pcr, pcr->reg_pm_ctrl3, 104 104 D3_DELINK_MODE_EN, D3_DELINK_MODE_EN); 105 105 106 + if (!runtime) { 107 + rtsx_pci_write_register(pcr, RTS5261_AUTOLOAD_CFG1, 108 + CD_RESUME_EN_MASK, 0); 109 + rtsx_pci_write_register(pcr, pcr->reg_pm_ctrl3, 0x01, 0x00); 110 + rtsx_pci_write_register(pcr, RTS5261_REG_PME_FORCE_CTL, 111 + FORCE_PM_CONTROL | FORCE_PM_VALUE, FORCE_PM_CONTROL); 112 + 113 + } else { 114 + rtsx_pci_write_register(pcr, RTS5261_REG_PME_FORCE_CTL, 115 + FORCE_PM_CONTROL | FORCE_PM_VALUE, 0); 116 + 117 + rtsx_pci_write_register(pcr, RTS5261_FW_CTL, 118 + RTS5261_INFORM_RTD3_COLD, RTS5261_INFORM_RTD3_COLD); 119 + rtsx_pci_write_register(pcr, RTS5261_AUTOLOAD_CFG4, 120 + RTS5261_FORCE_PRSNT_LOW, RTS5261_FORCE_PRSNT_LOW); 121 + 122 + } 123 + 106 124 rtsx_pci_write_register(pcr, RTS5261_REG_FPDCTL, 107 125 SSC_POWER_DOWN, SSC_POWER_DOWN); 108 126 } ··· 554 536 FORCE_CLKREQ_DELINK_MASK, FORCE_CLKREQ_HIGH); 555 537 556 538 rtsx_pci_write_register(pcr, PWD_SUSPEND_EN, 0xFF, 0xFB); 557 - rtsx_pci_write_register(pcr, pcr->reg_pm_ctrl3, 0x10, 0x00); 558 - rtsx_pci_write_register(pcr, RTS5261_REG_PME_FORCE_CTL, 559 - FORCE_PM_CONTROL | FORCE_PM_VALUE, FORCE_PM_CONTROL); 539 + 540 + if (pcr->rtd3_en) { 541 + rtsx_pci_write_register(pcr, pcr->reg_pm_ctrl3, 0x01, 0x01); 542 + rtsx_pci_write_register(pcr, RTS5261_REG_PME_FORCE_CTL, 543 + FORCE_PM_CONTROL | FORCE_PM_VALUE, 544 + FORCE_PM_CONTROL | FORCE_PM_VALUE); 545 + } else { 546 + rtsx_pci_write_register(pcr, pcr->reg_pm_ctrl3, 0x01, 0x00); 547 + rtsx_pci_write_register(pcr, RTS5261_REG_PME_FORCE_CTL, 548 + FORCE_PM_CONTROL | FORCE_PM_VALUE, FORCE_PM_CONTROL); 549 + } 550 + rtsx_pci_write_register(pcr, pcr->reg_pm_ctrl3, D3_DELINK_MODE_EN, 0x00); 560 551 561 552 /* Clear Enter RTD3_cold Information*/ 562 553 rtsx_pci_write_register(pcr, RTS5261_FW_CTL,
+2
drivers/misc/cardreader/rtsx_pcr.h
··· 15 15 #define MIN_DIV_N_PCR 80 16 16 #define MAX_DIV_N_PCR 208 17 17 18 + #define RTS522A_PME_FORCE_CTL 0xFF78 19 + #define RTS522A_AUTOLOAD_CFG1 0xFF7C 18 20 #define RTS522A_PM_CTRL3 0xFF7E 19 21 20 22 #define RTS524A_PME_FORCE_CTL 0xFF78