283283#define PCIE_GLI_9767_UHS2_CTL2_ZC_VALUE 0xb
284284#define PCIE_GLI_9767_UHS2_CTL2_ZC_CTL BIT(6)
285285#define PCIE_GLI_9767_UHS2_CTL2_ZC_CTL_VALUE 0x1
286+ #define PCIE_GLI_9767_UHS2_CTL2_FORCE_PHY_RESETN BIT(13)
287+ #define PCIE_GLI_9767_UHS2_CTL2_FORCE_RESETN_VALUE BIT(14)
286288
287289#define GLI_MAX_TUNING_LOOP 40
288290
@@ -1179,6 +1181,65 @@ static void gl9767_set_low_power_negotiation(struct pci_dev *pdev, bool enable)
11791181 gl9767_vhs_read (pdev );
11801182}
11811183
1184+ static void sdhci_gl9767_uhs2_phy_reset (struct sdhci_host * host , bool assert )
1185+ {
1186+ struct sdhci_pci_slot * slot = sdhci_priv (host );
1187+ struct pci_dev * pdev = slot -> chip -> pdev ;
1188+ u32 value , set , clr ;
1189+
1190+ if (assert ) {
1191+ /* Assert reset, set RESETN and clean RESETN_VALUE */
1192+ set = PCIE_GLI_9767_UHS2_CTL2_FORCE_PHY_RESETN ;
1193+ clr = PCIE_GLI_9767_UHS2_CTL2_FORCE_RESETN_VALUE ;
1194+ } else {
1195+ /* De-assert reset, clean RESETN and set RESETN_VALUE */
1196+ set = PCIE_GLI_9767_UHS2_CTL2_FORCE_RESETN_VALUE ;
1197+ clr = PCIE_GLI_9767_UHS2_CTL2_FORCE_PHY_RESETN ;
1198+ }
1199+
1200+ gl9767_vhs_write (pdev );
1201+ pci_read_config_dword (pdev , PCIE_GLI_9767_UHS2_CTL2 , & value );
1202+ value |= set ;
1203+ pci_write_config_dword (pdev , PCIE_GLI_9767_UHS2_CTL2 , value );
1204+ value &= ~clr ;
1205+ pci_write_config_dword (pdev , PCIE_GLI_9767_UHS2_CTL2 , value );
1206+ gl9767_vhs_read (pdev );
1207+ }
1208+
1209+ static void __gl9767_uhs2_set_power (struct sdhci_host * host , unsigned char mode , unsigned short vdd )
1210+ {
1211+ u8 pwr = 0 ;
1212+
1213+ if (mode != MMC_POWER_OFF ) {
1214+ pwr = sdhci_get_vdd_value (vdd );
1215+ if (!pwr )
1216+ WARN (1 , "%s: Invalid vdd %#x\n" ,
1217+ mmc_hostname (host -> mmc ), vdd );
1218+ pwr |= SDHCI_VDD2_POWER_180 ;
1219+ }
1220+
1221+ if (host -> pwr == pwr )
1222+ return ;
1223+
1224+ host -> pwr = pwr ;
1225+
1226+ if (pwr == 0 ) {
1227+ sdhci_writeb (host , 0 , SDHCI_POWER_CONTROL );
1228+ } else {
1229+ sdhci_writeb (host , 0 , SDHCI_POWER_CONTROL );
1230+
1231+ pwr |= SDHCI_POWER_ON ;
1232+ sdhci_writeb (host , pwr & 0xf , SDHCI_POWER_CONTROL );
1233+ usleep_range (5000 , 6250 );
1234+
1235+ /* Assert reset */
1236+ sdhci_gl9767_uhs2_phy_reset (host , true);
1237+ pwr |= SDHCI_VDD2_POWER_ON ;
1238+ sdhci_writeb (host , pwr , SDHCI_POWER_CONTROL );
1239+ usleep_range (5000 , 6250 );
1240+ }
1241+ }
1242+
11821243static void sdhci_gl9767_set_clock (struct sdhci_host * host , unsigned int clock )
11831244{
11841245 struct sdhci_pci_slot * slot = sdhci_priv (host );
@@ -1205,6 +1266,11 @@ static void sdhci_gl9767_set_clock(struct sdhci_host *host, unsigned int clock)
12051266 }
12061267
12071268 sdhci_enable_clk (host , clk );
1269+
1270+ if (mmc_card_uhs2 (host -> mmc ))
1271+ /* De-assert reset */
1272+ sdhci_gl9767_uhs2_phy_reset (host , false);
1273+
12081274 gl9767_set_low_power_negotiation (pdev , true);
12091275}
12101276
@@ -1476,7 +1542,7 @@ static void sdhci_gl9767_set_power(struct sdhci_host *host, unsigned char mode,
14761542 gl9767_vhs_read (pdev );
14771543
14781544 sdhci_gli_overcurrent_event_enable (host , false);
1479- sdhci_uhs2_set_power (host , mode , vdd );
1545+ __gl9767_uhs2_set_power (host , mode , vdd );
14801546 sdhci_gli_overcurrent_event_enable (host , true);
14811547 } else {
14821548 gl9767_vhs_write (pdev );
0 commit comments