diff options
Diffstat (limited to 'drivers/mmc/host/rtsx_pci_sdmmc.c')
| -rw-r--r-- | drivers/mmc/host/rtsx_pci_sdmmc.c | 53 | 
1 files changed, 23 insertions, 30 deletions
diff --git a/drivers/mmc/host/rtsx_pci_sdmmc.c b/drivers/mmc/host/rtsx_pci_sdmmc.c index 571915dfb218..f981f7d1f6e3 100644 --- a/drivers/mmc/host/rtsx_pci_sdmmc.c +++ b/drivers/mmc/host/rtsx_pci_sdmmc.c @@ -678,12 +678,19 @@ static void sdmmc_request(struct mmc_host *mmc, struct mmc_request *mrq)  	struct mmc_command *cmd = mrq->cmd;  	struct mmc_data *data = mrq->data;  	unsigned int data_size = 0; +	int err;  	if (host->eject) {  		cmd->error = -ENOMEDIUM;  		goto finish;  	} +	err = rtsx_pci_card_exclusive_check(host->pcr, RTSX_SD_CARD); +	if (err) { +		cmd->error = err; +		goto finish; +	} +  	mutex_lock(&pcr->pcr_mutex);  	rtsx_pci_start_run(pcr); @@ -901,6 +908,9 @@ static void sdmmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)  	if (host->eject)  		return; +	if (rtsx_pci_card_exclusive_check(host->pcr, RTSX_SD_CARD)) +		return; +  	mutex_lock(&pcr->pcr_mutex);  	rtsx_pci_start_run(pcr); @@ -1060,26 +1070,6 @@ static int sd_wait_voltage_stable_2(struct realtek_pci_sdmmc *host)  	return 0;  } -static int sd_change_bank_voltage(struct realtek_pci_sdmmc *host, u8 voltage) -{ -	struct rtsx_pcr *pcr = host->pcr; -	int err; - -	if (voltage == SD_IO_3V3) { -		err = rtsx_pci_write_phy_register(pcr, 0x08, 0x4FC0 | 0x24); -		if (err < 0) -			return err; -	} else if (voltage == SD_IO_1V8) { -		err = rtsx_pci_write_phy_register(pcr, 0x08, 0x4C40 | 0x24); -		if (err < 0) -			return err; -	} else { -		return -EINVAL; -	} - -	return 0; -} -  static int sdmmc_switch_voltage(struct mmc_host *mmc, struct mmc_ios *ios)  {  	struct realtek_pci_sdmmc *host = mmc_priv(mmc); @@ -1093,31 +1083,30 @@ static int sdmmc_switch_voltage(struct mmc_host *mmc, struct mmc_ios *ios)  	if (host->eject)  		return -ENOMEDIUM; +	err = rtsx_pci_card_exclusive_check(host->pcr, RTSX_SD_CARD); +	if (err) +		return err; +  	mutex_lock(&pcr->pcr_mutex);  	rtsx_pci_start_run(pcr);  	if (ios->signal_voltage == MMC_SIGNAL_VOLTAGE_330) -		voltage = SD_IO_3V3; +		voltage = OUTPUT_3V3;  	else -		voltage = SD_IO_1V8; - -	if (voltage == SD_IO_1V8) { -		err = rtsx_pci_write_register(pcr, -				SD30_DRIVE_SEL, 0x07, DRIVER_TYPE_B); -		if (err < 0) -			goto out; +		voltage = OUTPUT_1V8; +	if (voltage == OUTPUT_1V8) {  		err = sd_wait_voltage_stable_1(host);  		if (err < 0)  			goto out;  	} -	err = sd_change_bank_voltage(host, voltage); +	err = rtsx_pci_switch_output_voltage(pcr, voltage);  	if (err < 0)  		goto out; -	if (voltage == SD_IO_1V8) { +	if (voltage == OUTPUT_1V8) {  		err = sd_wait_voltage_stable_2(host);  		if (err < 0)  			goto out; @@ -1142,6 +1131,10 @@ static int sdmmc_execute_tuning(struct mmc_host *mmc, u32 opcode)  	if (host->eject)  		return -ENOMEDIUM; +	err = rtsx_pci_card_exclusive_check(host->pcr, RTSX_SD_CARD); +	if (err) +		return err; +  	mutex_lock(&pcr->pcr_mutex);  	rtsx_pci_start_run(pcr);  |