|
95 | 95 | #define PCIE_GLI_9763E_SCR 0x8E0
|
96 | 96 | #define GLI_9763E_SCR_AXI_REQ BIT(9)
|
97 | 97 |
|
| 98 | +#define PCIE_GLI_9763E_CFG 0x8A0 |
| 99 | +#define GLI_9763E_CFG_LPSN_DIS BIT(12) |
| 100 | + |
98 | 101 | #define PCIE_GLI_9763E_CFG2 0x8A4
|
99 | 102 | #define GLI_9763E_CFG2_L1DLY GENMASK(28, 19)
|
100 | 103 | #define GLI_9763E_CFG2_L1DLY_MID 0x54
|
@@ -828,6 +831,31 @@ static void sdhci_gl9763e_dumpregs(struct mmc_host *mmc)
|
828 | 831 | sdhci_dumpregs(mmc_priv(mmc));
|
829 | 832 | }
|
830 | 833 |
|
| 834 | +static void gl9763e_set_low_power_negotiation(struct sdhci_pci_slot *slot, bool enable) |
| 835 | +{ |
| 836 | + struct pci_dev *pdev = slot->chip->pdev; |
| 837 | + u32 value; |
| 838 | + |
| 839 | + pci_read_config_dword(pdev, PCIE_GLI_9763E_VHS, &value); |
| 840 | + value &= ~GLI_9763E_VHS_REV; |
| 841 | + value |= FIELD_PREP(GLI_9763E_VHS_REV, GLI_9763E_VHS_REV_W); |
| 842 | + pci_write_config_dword(pdev, PCIE_GLI_9763E_VHS, value); |
| 843 | + |
| 844 | + pci_read_config_dword(pdev, PCIE_GLI_9763E_CFG, &value); |
| 845 | + |
| 846 | + if (enable) |
| 847 | + value &= ~GLI_9763E_CFG_LPSN_DIS; |
| 848 | + else |
| 849 | + value |= GLI_9763E_CFG_LPSN_DIS; |
| 850 | + |
| 851 | + pci_write_config_dword(pdev, PCIE_GLI_9763E_CFG, value); |
| 852 | + |
| 853 | + pci_read_config_dword(pdev, PCIE_GLI_9763E_VHS, &value); |
| 854 | + value &= ~GLI_9763E_VHS_REV; |
| 855 | + value |= FIELD_PREP(GLI_9763E_VHS_REV, GLI_9763E_VHS_REV_R); |
| 856 | + pci_write_config_dword(pdev, PCIE_GLI_9763E_VHS, value); |
| 857 | +} |
| 858 | + |
831 | 859 | static void sdhci_gl9763e_cqe_pre_enable(struct mmc_host *mmc)
|
832 | 860 | {
|
833 | 861 | struct cqhci_host *cq_host = mmc->cqe_private;
|
@@ -969,6 +997,9 @@ static int gl9763e_runtime_suspend(struct sdhci_pci_chip *chip)
|
969 | 997 | struct sdhci_host *host = slot->host;
|
970 | 998 | u16 clock;
|
971 | 999 |
|
| 1000 | + /* Enable LPM negotiation to allow entering L1 state */ |
| 1001 | + gl9763e_set_low_power_negotiation(slot, true); |
| 1002 | + |
972 | 1003 | clock = sdhci_readw(host, SDHCI_CLOCK_CONTROL);
|
973 | 1004 | clock &= ~(SDHCI_CLOCK_PLL_EN | SDHCI_CLOCK_CARD_EN);
|
974 | 1005 | sdhci_writew(host, clock, SDHCI_CLOCK_CONTROL);
|
@@ -1002,6 +1033,9 @@ static int gl9763e_runtime_resume(struct sdhci_pci_chip *chip)
|
1002 | 1033 | clock |= SDHCI_CLOCK_CARD_EN;
|
1003 | 1034 | sdhci_writew(host, clock, SDHCI_CLOCK_CONTROL);
|
1004 | 1035 |
|
| 1036 | + /* Disable LPM negotiation to avoid entering L1 state. */ |
| 1037 | + gl9763e_set_low_power_negotiation(slot, false); |
| 1038 | + |
1005 | 1039 | return 0;
|
1006 | 1040 | }
|
1007 | 1041 | #endif
|
|
0 commit comments