Re: [PATCH] mmc: sdhci-pci: Remove D3 delays for Intel BYT-related host controllers

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Oct 06, 2017 at 03:50:59PM +0300, Adrian Hunter wrote:
> The default D3 cold delay of 100 ms can cause pauses when streaming audio
> from eMMC.
> 
> Intel BYT-related host controllers do not need PCI D3 delays. Although the
> delays can be set to zero via an ACPI _DSM, unfortunately that is not being
> used in all cases. So just set the delays to zero in the driver.
> 
> Signed-off-by: Adrian Hunter <adrian.hunter@xxxxxxxxx>
> ---
>  drivers/mmc/host/sdhci-pci-core.c | 17 +++++++++++++----
>  1 file changed, 13 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/mmc/host/sdhci-pci-core.c b/drivers/mmc/host/sdhci-pci-core.c
> index 5f3f7b51299f..14ef99b6e5b7 100644
> --- a/drivers/mmc/host/sdhci-pci-core.c
> +++ b/drivers/mmc/host/sdhci-pci-core.c
> @@ -592,9 +592,18 @@ static void byt_read_dsm(struct sdhci_pci_slot *slot)
>  	slot->chip->rpm_retune = intel_host->d3_retune;
>  }
>  
> -static int byt_emmc_probe_slot(struct sdhci_pci_slot *slot)
> +static void byt_common_setup(struct sdhci_pci_slot *slot)
>  {
>  	byt_read_dsm(slot);
> +
> +	/* PCI D3 delays are not needed */
> +	slot->chip->pdev->d3_delay = 0;
> +	slot->chip->pdev->d3cold_delay = 0;

The fact that it doesn't need D3 delays sounds like a property of the
device itself, regardless of which (if any) driver claims it.

Can this be done as a quirk instead, maybe something in
arch/x86/pci/fixup.c?  Maybe quirk_remove_d3_delay() could be used
directly, or something like pci_d3_delay_fixup()?

> +}
> +
> +static int byt_emmc_probe_slot(struct sdhci_pci_slot *slot)
> +{
> +	byt_common_setup(slot);
>  	slot->host->mmc->caps |= MMC_CAP_8_BIT_DATA | MMC_CAP_NONREMOVABLE |
>  				 MMC_CAP_HW_RESET | MMC_CAP_1_8V_DDR |
>  				 MMC_CAP_CMD_DURING_TFR |
> @@ -649,7 +658,7 @@ static int ni_byt_sdio_probe_slot(struct sdhci_pci_slot *slot)
>  {
>  	int err;
>  
> -	byt_read_dsm(slot);
> +	byt_common_setup(slot);
>  
>  	err = ni_set_max_freq(slot);
>  	if (err)
> @@ -662,7 +671,7 @@ static int ni_byt_sdio_probe_slot(struct sdhci_pci_slot *slot)
>  
>  static int byt_sdio_probe_slot(struct sdhci_pci_slot *slot)
>  {
> -	byt_read_dsm(slot);
> +	byt_common_setup(slot);
>  	slot->host->mmc->caps |= MMC_CAP_POWER_OFF_CARD | MMC_CAP_NONREMOVABLE |
>  				 MMC_CAP_WAIT_WHILE_BUSY;
>  	return 0;
> @@ -670,7 +679,7 @@ static int byt_sdio_probe_slot(struct sdhci_pci_slot *slot)
>  
>  static int byt_sd_probe_slot(struct sdhci_pci_slot *slot)
>  {
> -	byt_read_dsm(slot);
> +	byt_common_setup(slot);
>  	slot->host->mmc->caps |= MMC_CAP_WAIT_WHILE_BUSY |
>  				 MMC_CAP_AGGRESSIVE_PM | MMC_CAP_CD_WAKE;
>  	slot->cd_idx = 0;
> -- 
> 1.9.1
> 



[Index of Archives]     [DMA Engine]     [Linux Coverity]     [Linux USB]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Greybus]

  Powered by Linux