mmc: sdhci-pci-o2micro: Fix a warm reboot issue that disk can't be detected by BIOS
commit 58aeb5623c2ebdadefe6352b14f8076a7073fea0 upstream. Driver shall switch clock source from DLL clock to OPE clock when power off card to ensure that card can be identified with OPE clock by BIOS. Signed-off-by: Fred Ai <fred.ai@bayhubtech.com> Fixes:4be33cf18703 ("mmc: sdhci-pci-o2micro: Improve card input timing at SDR104/HS200 mode") Cc: stable@vger.kernel.org Link: https://lore.kernel.org/r/20240203102908.4683-1-fredaibayhubtech@126.com Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
09fad23a1a
commit
00f9fcc0a1
@ -602,6 +602,35 @@ static void sdhci_pci_o2_set_clock(struct sdhci_host *host, unsigned int clock)
|
||||
sdhci_o2_enable_clk(host, clk);
|
||||
}
|
||||
|
||||
static void sdhci_pci_o2_set_power(struct sdhci_host *host, unsigned char mode, unsigned short vdd)
|
||||
{
|
||||
struct sdhci_pci_chip *chip;
|
||||
struct sdhci_pci_slot *slot = sdhci_priv(host);
|
||||
u32 scratch_32 = 0;
|
||||
u8 scratch_8 = 0;
|
||||
|
||||
chip = slot->chip;
|
||||
|
||||
if (mode == MMC_POWER_OFF) {
|
||||
/* UnLock WP */
|
||||
pci_read_config_byte(chip->pdev, O2_SD_LOCK_WP, &scratch_8);
|
||||
scratch_8 &= 0x7f;
|
||||
pci_write_config_byte(chip->pdev, O2_SD_LOCK_WP, scratch_8);
|
||||
|
||||
/* Set PCR 0x354[16] to switch Clock Source back to OPE Clock */
|
||||
pci_read_config_dword(chip->pdev, O2_SD_OUTPUT_CLK_SOURCE_SWITCH, &scratch_32);
|
||||
scratch_32 &= ~(O2_SD_SEL_DLL);
|
||||
pci_write_config_dword(chip->pdev, O2_SD_OUTPUT_CLK_SOURCE_SWITCH, scratch_32);
|
||||
|
||||
/* Lock WP */
|
||||
pci_read_config_byte(chip->pdev, O2_SD_LOCK_WP, &scratch_8);
|
||||
scratch_8 |= 0x80;
|
||||
pci_write_config_byte(chip->pdev, O2_SD_LOCK_WP, scratch_8);
|
||||
}
|
||||
|
||||
sdhci_set_power(host, mode, vdd);
|
||||
}
|
||||
|
||||
static int sdhci_pci_o2_probe_slot(struct sdhci_pci_slot *slot)
|
||||
{
|
||||
struct sdhci_pci_chip *chip;
|
||||
@ -911,6 +940,7 @@ static const struct sdhci_ops sdhci_pci_o2_ops = {
|
||||
.set_bus_width = sdhci_set_bus_width,
|
||||
.reset = sdhci_reset,
|
||||
.set_uhs_signaling = sdhci_set_uhs_signaling,
|
||||
.set_power = sdhci_pci_o2_set_power,
|
||||
};
|
||||
|
||||
const struct sdhci_pci_fixes sdhci_o2 = {
|
||||
|
Loading…
x
Reference in New Issue
Block a user