Merge tag 'mmc-v6.8-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc
Pull MMC fixes from Ulf Hansson: "MMC core: - Allow non-sleeping read-only slot-gpio MMC host: - sdhci-pci-o2micro: Fix a warm reboot BIOS issue" * tag 'mmc-v6.8-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc: mmc: slot-gpio: Allow non-sleeping GPIO ro mmc: sdhci-pci-o2micro: Fix a warm reboot issue that disk can't be detected by BIOS
This commit is contained in:
@@ -75,11 +75,15 @@ EXPORT_SYMBOL(mmc_gpio_set_cd_irq);
|
||||
int mmc_gpio_get_ro(struct mmc_host *host)
|
||||
{
|
||||
struct mmc_gpio *ctx = host->slot.handler_priv;
|
||||
int cansleep;
|
||||
|
||||
if (!ctx || !ctx->ro_gpio)
|
||||
return -ENOSYS;
|
||||
|
||||
return gpiod_get_value_cansleep(ctx->ro_gpio);
|
||||
cansleep = gpiod_cansleep(ctx->ro_gpio);
|
||||
return cansleep ?
|
||||
gpiod_get_value_cansleep(ctx->ro_gpio) :
|
||||
gpiod_get_value(ctx->ro_gpio);
|
||||
}
|
||||
EXPORT_SYMBOL(mmc_gpio_get_ro);
|
||||
|
||||
|
||||
@@ -693,6 +693,35 @@ static int sdhci_pci_o2_init_sd_express(struct mmc_host *mmc, struct mmc_ios *io
|
||||
return 0;
|
||||
}
|
||||
|
||||
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;
|
||||
@@ -1051,6 +1080,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 = {
|
||||
|
||||
Reference in New Issue
Block a user