]> git.proxmox.com Git - mirror_ubuntu-kernels.git/blobdiff - drivers/misc/cardreader/rts5228.c
misc: rtsx: Fix some platforms can not boot and move the l1ss judgment to probe
[mirror_ubuntu-kernels.git] / drivers / misc / cardreader / rts5228.c
index f4ab09439da70c977ea29bbb63e1ae8d80a1f08f..0c7f10bcf6f1222d641b5edd52cfd11c769f314e 100644 (file)
@@ -386,59 +386,25 @@ static void rts5228_process_ocp(struct rtsx_pcr *pcr)
 
 static void rts5228_init_from_cfg(struct rtsx_pcr *pcr)
 {
-       struct pci_dev *pdev = pcr->pci;
-       int l1ss;
-       u32 lval;
        struct rtsx_cr_option *option = &pcr->option;
 
-       l1ss = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_L1SS);
-       if (!l1ss)
-               return;
-
-       pci_read_config_dword(pdev, l1ss + PCI_L1SS_CTL1, &lval);
-
-       if (0 == (lval & 0x0F))
-               rtsx_pci_enable_oobs_polling(pcr);
-       else
+       if (rtsx_check_dev_flag(pcr, ASPM_L1_1_EN | ASPM_L1_2_EN
+                               | PM_L1_1_EN | PM_L1_2_EN))
                rtsx_pci_disable_oobs_polling(pcr);
-
-       if (lval & PCI_L1SS_CTL1_ASPM_L1_1)
-               rtsx_set_dev_flag(pcr, ASPM_L1_1_EN);
-       else
-               rtsx_clear_dev_flag(pcr, ASPM_L1_1_EN);
-
-       if (lval & PCI_L1SS_CTL1_ASPM_L1_2)
-               rtsx_set_dev_flag(pcr, ASPM_L1_2_EN);
-       else
-               rtsx_clear_dev_flag(pcr, ASPM_L1_2_EN);
-
-       if (lval & PCI_L1SS_CTL1_PCIPM_L1_1)
-               rtsx_set_dev_flag(pcr, PM_L1_1_EN);
        else
-               rtsx_clear_dev_flag(pcr, PM_L1_1_EN);
-
-       if (lval & PCI_L1SS_CTL1_PCIPM_L1_2)
-               rtsx_set_dev_flag(pcr, PM_L1_2_EN);
-       else
-               rtsx_clear_dev_flag(pcr, PM_L1_2_EN);
+               rtsx_pci_enable_oobs_polling(pcr);
 
        rtsx_pci_write_register(pcr, ASPM_FORCE_CTL, 0xFF, 0);
-       if (option->ltr_en) {
-               u16 val;
 
-               pcie_capability_read_word(pcr->pci, PCI_EXP_DEVCTL2, &val);
-               if (val & PCI_EXP_DEVCTL2_LTR_EN) {
-                       option->ltr_enabled = true;
-                       option->ltr_active = true;
+       if (option->ltr_en) {
+               if (option->ltr_enabled)
                        rtsx_set_ltr_latency(pcr, option->ltr_active_latency);
-               } else {
-                       option->ltr_enabled = false;
-               }
        }
 }
 
 static int rts5228_extra_init_hw(struct rtsx_pcr *pcr)
 {
+       struct rtsx_cr_option *option = &pcr->option;
 
        rtsx_pci_write_register(pcr, RTS5228_AUTOLOAD_CFG1,
                        CD_RESUME_EN_MASK, CD_RESUME_EN_MASK);
@@ -469,6 +435,17 @@ static int rts5228_extra_init_hw(struct rtsx_pcr *pcr)
        else
                rtsx_pci_write_register(pcr, PETXCFG, 0x30, 0x00);
 
+       /*
+        * If u_force_clkreq_0 is enabled, CLKREQ# PIN will be forced
+        * to drive low, and we forcibly request clock.
+        */
+       if (option->force_clkreq_0)
+               rtsx_pci_write_register(pcr, PETXCFG,
+                                FORCE_CLKREQ_DELINK_MASK, FORCE_CLKREQ_LOW);
+       else
+               rtsx_pci_write_register(pcr, PETXCFG,
+                                FORCE_CLKREQ_DELINK_MASK, FORCE_CLKREQ_HIGH);
+
        rtsx_pci_write_register(pcr, PWD_SUSPEND_EN, 0xFF, 0xFB);
 
        if (pcr->rtd3_en) {