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

Merge tag 'mmc-v6.12-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc

Pull mmc fixes from Ulf Hansson:

- sdhci-pci-gli: A couple of fixes for low power mode on GL9767

* tag 'mmc-v6.12-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc:
mmc: sdhci-pci-gli: GL9767: Fix low power mode in the SD Express process
mmc: sdhci-pci-gli: GL9767: Fix low power mode on the set clock function

+24 -14
+24 -14
drivers/mmc/host/sdhci-pci-gli.c
··· 892 892 gl9767_vhs_read(pdev); 893 893 } 894 894 895 + static void gl9767_set_low_power_negotiation(struct pci_dev *pdev, bool enable) 896 + { 897 + u32 value; 898 + 899 + gl9767_vhs_write(pdev); 900 + 901 + pci_read_config_dword(pdev, PCIE_GLI_9767_CFG, &value); 902 + if (enable) 903 + value &= ~PCIE_GLI_9767_CFG_LOW_PWR_OFF; 904 + else 905 + value |= PCIE_GLI_9767_CFG_LOW_PWR_OFF; 906 + pci_write_config_dword(pdev, PCIE_GLI_9767_CFG, value); 907 + 908 + gl9767_vhs_read(pdev); 909 + } 910 + 895 911 static void sdhci_gl9767_set_clock(struct sdhci_host *host, unsigned int clock) 896 912 { 897 913 struct sdhci_pci_slot *slot = sdhci_priv(host); 898 914 struct mmc_ios *ios = &host->mmc->ios; 899 915 struct pci_dev *pdev; 900 - u32 value; 901 916 u16 clk; 902 917 903 918 pdev = slot->chip->pdev; 904 919 host->mmc->actual_clock = 0; 905 920 906 - gl9767_vhs_write(pdev); 907 - 908 - pci_read_config_dword(pdev, PCIE_GLI_9767_CFG, &value); 909 - value |= PCIE_GLI_9767_CFG_LOW_PWR_OFF; 910 - pci_write_config_dword(pdev, PCIE_GLI_9767_CFG, value); 911 - 921 + gl9767_set_low_power_negotiation(pdev, false); 912 922 gl9767_disable_ssc_pll(pdev); 913 923 sdhci_writew(host, 0, SDHCI_CLOCK_CONTROL); 914 924 915 - if (clock == 0) 925 + if (clock == 0) { 926 + gl9767_set_low_power_negotiation(pdev, true); 916 927 return; 928 + } 917 929 918 930 clk = sdhci_calc_clk(host, clock, &host->mmc->actual_clock); 919 931 if (clock == 200000000 && ios->timing == MMC_TIMING_UHS_SDR104) { ··· 934 922 } 935 923 936 924 sdhci_enable_clk(host, clk); 937 - 938 - pci_read_config_dword(pdev, PCIE_GLI_9767_CFG, &value); 939 - value &= ~PCIE_GLI_9767_CFG_LOW_PWR_OFF; 940 - pci_write_config_dword(pdev, PCIE_GLI_9767_CFG, value); 941 - 942 - gl9767_vhs_read(pdev); 925 + gl9767_set_low_power_negotiation(pdev, true); 943 926 } 944 927 945 928 static void gli_set_9767(struct sdhci_host *host) ··· 1068 1061 sdhci_writew(host, value, SDHCI_CLOCK_CONTROL); 1069 1062 } 1070 1063 1064 + pci_read_config_dword(pdev, PCIE_GLI_9767_CFG, &value); 1065 + value &= ~PCIE_GLI_9767_CFG_LOW_PWR_OFF; 1066 + pci_write_config_dword(pdev, PCIE_GLI_9767_CFG, value); 1071 1067 gl9767_vhs_read(pdev); 1072 1068 1073 1069 return 0;