> -----Original Message----- > From: linux-mmc-owner@xxxxxxxxxxxxxxx [mailto:linux-mmc- > owner@xxxxxxxxxxxxxxx] On Behalf Of Arindam Nath > Sent: Friday, March 04, 2011 5:03 PM > To: cjb@xxxxxxxxxx > Cc: zhangfei.gao@xxxxxxxxx; prakity@xxxxxxxxxxx; > subhashj@xxxxxxxxxxxxxx; linux-mmc@xxxxxxxxxxxxxxx; henry.su@xxxxxxx; > aaron.lu@xxxxxxx; anath.amd@xxxxxxxxx; Arindam Nath > Subject: [PATCH v2 10/12] mmc: sdhci: enable preset value after uhs > initialization > > According to the Host Controller spec v3.00, setting Preset Value > Enable > in the Host Control2 register lets SDCLK Frequency Select, Clock > Generator > Select and Driver Strength Select to be set automatically by the Host > Controller based on the UHS-I mode set. This patch enables this > feature. > We also reset Preset Value Enable when the card is removed from the > slot. What does this preset_value means? Is this defined in SD3.01 spec? I think it looks like specific to your controller (sdhci). If it's specific to your controller then this new mmc_ops should not be added. > > Signed-off-by: Arindam Nath <arindam.nath@xxxxxxx> > --- > drivers/mmc/core/sd.c | 7 +++++++ > drivers/mmc/host/sdhci.c | 36 ++++++++++++++++++++++++++++++++++++ > include/linux/mmc/host.h | 1 + > 3 files changed, 44 insertions(+), 0 deletions(-) > > diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c > index 1e2d157..ae7a771 100644 > --- a/drivers/mmc/core/sd.c > +++ b/drivers/mmc/core/sd.c > @@ -962,6 +962,13 @@ static int mmc_sd_init_card(struct mmc_host *host, > u32 ocr, > } > } > > + /* > + * Since initialization is now complete, enable preset > + * value registers. > + */ > + if (host->ops->enable_preset_value) > + host->ops->enable_preset_value(host); > + > host->card = card; > return 0; > > diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c > index 8f4f102..1f6e4ad 100644 > --- a/drivers/mmc/host/sdhci.c > +++ b/drivers/mmc/host/sdhci.c > @@ -1602,6 +1602,40 @@ out: > spin_unlock_irqrestore(&host->lock, flags); > } > > +static void sdhci_enable_preset_value(struct mmc_host *mmc) > +{ > + struct sdhci_host *host; > + u16 ctrl; > + unsigned long flags; > + > + host = mmc_priv(mmc); > + > + /* Host Controller v3.00 defines preset value registers */ > + if (host->version < SDHCI_SPEC_300) > + return; > + > + spin_lock_irqsave(&host->lock, flags); > + > + ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2); > + ctrl |= SDHCI_CTRL_PRESET_VAL_ENABLE; > + sdhci_writew(host, ctrl, SDHCI_HOST_CONTROL2); > + > + spin_unlock_irqrestore(&host->lock, flags); > +} > + > +static void sdhci_disable_preset_value(struct sdhci_host *host) > +{ > + u16 ctrl; > + > + /* Only for Host Controller version >= v3.00 */ > + if (host->version < SDHCI_SPEC_300) > + return; > + > + ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2); > + ctrl &= ~SDHCI_CTRL_PRESET_VAL_ENABLE; > + sdhci_writew(host, ctrl, SDHCI_HOST_CONTROL2); > +} > + > static const struct mmc_host_ops sdhci_ops = { > .request = sdhci_request, > .set_ios = sdhci_set_ios, > @@ -1610,6 +1644,7 @@ static const struct mmc_host_ops sdhci_ops = { > .start_signal_voltage_switch = > sdhci_start_signal_voltage_switch, > .get_max_current_180 = sdhci_get_max_current_180, > .execute_tuning = sdhci_execute_tuning, > + .enable_preset_value = sdhci_enable_preset_value, > }; > > > /********************************************************************** > *******\ > @@ -1920,6 +1955,7 @@ static irqreturn_t sdhci_irq(int irq, void > *dev_id) > sdhci_writel(host, intmask & (SDHCI_INT_CARD_INSERT | > SDHCI_INT_CARD_REMOVE), SDHCI_INT_STATUS); > tasklet_schedule(&host->card_tasklet); > + sdhci_disable_preset_value(host); > } > > intmask &= ~(SDHCI_INT_CARD_INSERT | SDHCI_INT_CARD_REMOVE); > diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h > index 651e40b..e63e063 100644 > --- a/include/linux/mmc/host.h > +++ b/include/linux/mmc/host.h > @@ -130,6 +130,7 @@ struct mmc_host_ops { > int (*start_signal_voltage_switch)(struct mmc_host *host); > int (*get_max_current_180)(struct mmc_host *mmc); > void (*execute_tuning)(struct mmc_host *host); > + void (*enable_preset_value)(struct mmc_host *host); > }; > > struct mmc_card; > -- > 1.7.1 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-mmc" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html