Hi Adrian...
> +#ifdef CONFIG_PM_RUNTIME
> +
> +static int sdhci_pci_runtime_suspend(struct device *dev)
> +{
> + struct pci_dev *pdev = container_of(dev, struct pci_dev, dev);
> + struct sdhci_pci_chip *chip;
> + struct sdhci_pci_slot *slot;
> + pm_message_t state = { .event = PM_EVENT_SUSPEND };
> + int i, ret;
> +
> + chip = pci_get_drvdata(pdev);
> + if (!chip)
> + return 0;
> +
> + for (i = 0; i < chip->num_slots; i++) {
> + slot = chip->slots[i];
> + if (!slot)
> + continue;
> +
> + ret = sdhci_runtime_suspend_host(slot->host);
> +
> + if (ret) {
> + for (i--; i >= 0; i--)
> + sdhci_runtime_resume_host(chip->slots[i]->host);
> + return ret;
> + }
> + }
> +
> + if (chip->fixes && chip->fixes->suspend) {
> + ret = chip->fixes->suspend(chip, state);
> + if (ret) {
> + for (i = chip->num_slots - 1; i >= 0; i--)
> + sdhci_runtime_resume_host(chip->slots[i]->host);
> + return ret;
> + }
> + }
> +
> + return 0;
> +}
sdhci_runtime_resume_host() is missed return-value.
And i looked into sdhci_runtime_resume/suspend_host()...but
always return 0...why did you check return-value..?
> +
> +static int sdhci_pci_runtime_resume(struct device *dev)
> +{
> + struct pci_dev *pdev = container_of(dev, struct pci_dev, dev);
> + struct sdhci_pci_chip *chip;
> + struct sdhci_pci_slot *slot;
> + int i, ret;
> +
> + chip = pci_get_drvdata(pdev);
> + if (!chip)
> + return 0;
> +
> + if (chip->fixes && chip->fixes->resume) {
> + ret = chip->fixes->resume(chip);
> + if (ret)
> + return ret;
> + }
> +
> + for (i = 0; i < chip->num_slots; i++) {
> + slot = chip->slots[i];
> + if (!slot)
> + continue;
> +
> + ret = sdhci_runtime_resume_host(slot->host);
> + if (ret)
> + return ret;
> + }
> +
> + return 0;
> +}
> +
> +static int sdhci_pci_runtime_idle(struct device *dev)
> +{
> + return 0;
> +}
> +
> +#else
> +
> +#define sdhci_pci_runtime_suspend NULL
> +#define sdhci_pci_runtime_resume NULL
> +#define sdhci_pci_runtime_idle NULL
> +
> +#endif
> +
> +static const struct dev_pm_ops sdhci_pci_pm_ops = {
> + .runtime_suspend = sdhci_pci_runtime_suspend,
> + .runtime_resume = sdhci_pci_runtime_resume,
> + .runtime_idle = sdhci_pci_runtime_idle,
> +};
> +
>
> /*****************************************************************************\
> *
> *
> * Device probing/removal
> *
> @@ -1132,6 +1290,21 @@ static void sdhci_pci_remove_slot(struct
> sdhci_pci_slot *slot)
> sdhci_free_host(slot->host);
> }
>
> +static void __devinit sdhci_pci_runtime_pm_allow(struct device *dev)
> +{
> + pm_runtime_put_noidle(dev);
> + pm_runtime_allow(dev);
> + pm_runtime_set_autosuspend_delay(dev, 50);
> + pm_runtime_use_autosuspend(dev);
> + pm_suspend_ignore_children(dev, 1);
> +}
> +
> +static void __devexit sdhci_pci_runtime_pm_forbid(struct device *dev)
> +{
> + pm_runtime_forbid(dev);
> + pm_runtime_get_noresume(dev);
> +}
> +
> static int __devinit sdhci_pci_probe(struct pci_dev *pdev,
> const struct pci_device_id *ent)
> {
> @@ -1207,6 +1380,8 @@ static int __devinit sdhci_pci_probe(struct pci_dev
> *pdev,
> chip->slots[i] = slot;
> }
>
> + sdhci_pci_runtime_pm_allow(&pdev->dev);
> +
> return 0;
>
> free:
> @@ -1223,6 +1398,8 @@ static void __devexit sdhci_pci_remove(struct pci_dev
> *pdev)
> int i;
> struct sdhci_pci_chip *chip;
>
> + sdhci_pci_runtime_pm_forbid(&pdev->dev);
> +
> chip = pci_get_drvdata(pdev);
>
> if (chip) {
> @@ -1243,6 +1420,9 @@ static struct pci_driver sdhci_driver = {
> .remove = __devexit_p(sdhci_pci_remove),
> .suspend = sdhci_pci_suspend,
> .resume = sdhci_pci_resume,
> + .driver = {
> + .pm = &sdhci_pci_pm_ops
> + },
> };
>
>
> /*****************************************************************************\
> diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
> index d66a7a1..787b877 100644
> --- a/drivers/mmc/host/sdhci.c
> +++ b/drivers/mmc/host/sdhci.c
> @@ -20,6 +20,7 @@
> #include <linux/slab.h>
> #include <linux/scatterlist.h>
> #include <linux/regulator/consumer.h>
> +#include <linux/pm_runtime.h>
>
> #include <linux/leds.h>
>
> @@ -41,6 +42,7 @@
> #define MAX_TUNING_LOOP 40
>
> static unsigned int debug_quirks = 0;
> +static unsigned int debug_quirks2;
>
> static void sdhci_finish_data(struct sdhci_host *);
>
> @@ -49,6 +51,20 @@ static void sdhci_finish_command(struct sdhci_host *);
> static int sdhci_execute_tuning(struct mmc_host *mmc);
> static void sdhci_tuning_timer(unsigned long data);
>
> +#ifdef CONFIG_PM_RUNTIME
> +static int sdhci_runtime_pm_get(struct sdhci_host *host);
> +static int sdhci_runtime_pm_put(struct sdhci_host *host);
> +#else
> +static inline int sdhci_runtime_pm_get(struct sdhci_host *host)
> +{
> + return 0;
> +}
> +static inline int sdhci_runtime_pm_put(struct sdhci_host *host)
> +{
> + return 0;
> +}
> +#endif
> +
> static void sdhci_dumpregs(struct sdhci_host *host)
> {
> printk(KERN_DEBUG DRIVER_NAME ": =========== REGISTER DUMP
> (%s)===========\n",
> @@ -132,6 +148,9 @@ static void sdhci_set_card_detection(struct sdhci_host
> *host, bool enable)
> if (host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION)
> return;
>
> + if (host->quirks2 & SDHCI_QUIRK2_OWN_CARD_DETECTION)
> + return;
> +
> present = sdhci_readl(host, SDHCI_PRESENT_STATE) &
> SDHCI_CARD_PRESENT;
> irqs = present ? SDHCI_INT_CARD_REMOVE : SDHCI_INT_CARD_INSERT;
> @@ -251,11 +270,14 @@ static void sdhci_led_control(struct led_classdev *led,
>
> spin_lock_irqsave(&host->lock, flags);
>
> + if (host->runtime_suspended)
> + goto out;
> +
> if (brightness == LED_OFF)
> sdhci_deactivate_led(host);
> else
> sdhci_activate_led(host);
> -
> +out:
> spin_unlock_irqrestore(&host->lock, flags);
> }
> #endif
> @@ -1209,6 +1231,8 @@ static void sdhci_request(struct mmc_host *mmc, struct
> mmc_request *mrq)
>
> host = mmc_priv(mmc);
>
> + sdhci_runtime_pm_get(host);
> +
> spin_lock_irqsave(&host->lock, flags);
>
> WARN_ON(host->mrq != NULL);
> @@ -1269,14 +1293,11 @@ static void sdhci_request(struct mmc_host *mmc,
> struct mmc_request *mrq)
> spin_unlock_irqrestore(&host->lock, flags);
> }
>
> -static void sdhci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
> +static void sdhci_do_set_ios(struct sdhci_host *host, struct mmc_ios *ios)
> {
> - struct sdhci_host *host;
> unsigned long flags;
> u8 ctrl;
>
> - host = mmc_priv(mmc);
> -
> spin_lock_irqsave(&host->lock, flags);
>
> if (host->flags & SDHCI_DEVICE_DEAD)
> @@ -1426,7 +1447,16 @@ out:
> spin_unlock_irqrestore(&host->lock, flags);
> }
>
> -static int check_ro(struct sdhci_host *host)
> +static void sdhci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
> +{
> + struct sdhci_host *host = mmc_priv(mmc);
> +
> + sdhci_runtime_pm_get(host);
> + sdhci_do_set_ios(host, ios);
> + sdhci_runtime_pm_put(host);
> +}
> +
> +static int sdhci_check_ro(struct sdhci_host *host)
> {
> unsigned long flags;
> int is_readonly;
> @@ -1450,19 +1480,16 @@ static int check_ro(struct sdhci_host *host)
>
> #define SAMPLE_COUNT 5
>
> -static int sdhci_get_ro(struct mmc_host *mmc)
> +static int sdhci_do_get_ro(struct sdhci_host *host)
> {
> - struct sdhci_host *host;
> int i, ro_count;
>
> - host = mmc_priv(mmc);
> -
> if (!(host->quirks & SDHCI_QUIRK_UNSTABLE_RO_DETECT))
> - return check_ro(host);
> + return sdhci_check_ro(host);
>
> ro_count = 0;
> for (i = 0; i < SAMPLE_COUNT; i++) {
> - if (check_ro(host)) {
> + if (sdhci_check_ro(host)) {
> if (++ro_count > SAMPLE_COUNT / 2)
> return 1;
> }
> @@ -1479,38 +1506,56 @@ static void sdhci_hw_reset(struct mmc_host *mmc)
> host->ops->hw_reset(host);
> }
>
> -static void sdhci_enable_sdio_irq(struct mmc_host *mmc, int enable)
> +static int sdhci_get_ro(struct mmc_host *mmc)
> {
> - struct sdhci_host *host;
> - unsigned long flags;
> -
> - host = mmc_priv(mmc);
> + struct sdhci_host *host = mmc_priv(mmc);
> + int ret;
>
> - spin_lock_irqsave(&host->lock, flags);
> + sdhci_runtime_pm_get(host);
> + ret = sdhci_do_get_ro(host);
> + sdhci_runtime_pm_put(host);
> + return ret;
> +}
>
> +static void sdhci_enable_sdio_irq_nolock(struct sdhci_host *host, int enable)
> +{
> if (host->flags & SDHCI_DEVICE_DEAD)
> goto out;
>
> if (enable)
> + host->flags |= SDHCI_SDIO_IRQ_ENABLED;
> + else
> + host->flags &= ~SDHCI_SDIO_IRQ_ENABLED;
> +
> + /* SDIO IRQ will be enabled as appropriate in runtime resume */
> + if (host->runtime_suspended)
> + goto out;
> +
> + if (enable)
> sdhci_unmask_irqs(host, SDHCI_INT_CARD_INT);
> else
> sdhci_mask_irqs(host, SDHCI_INT_CARD_INT);
> out:
> mmiowb();
> +}
> +
> +static void sdhci_enable_sdio_irq(struct mmc_host *mmc, int enable)
> +{
> + struct sdhci_host *host = mmc_priv(mmc);
> + unsigned long flags;
>
> + spin_lock_irqsave(&host->lock, flags);
> + sdhci_enable_sdio_irq_nolock(host, enable);
> spin_unlock_irqrestore(&host->lock, flags);
> }
>
> -static int sdhci_start_signal_voltage_switch(struct mmc_host *mmc,
> - struct mmc_ios *ios)
> +static int sdhci_do_start_signal_voltage_switch(struct sdhci_host *host,
> + struct mmc_ios *ios)
> {
> - struct sdhci_host *host;
> u8 pwr;
> u16 clk, ctrl;
> u32 present_state;
>
> - host = mmc_priv(mmc);
> -
> /*
> * Signal Voltage Switching is only applicable for Host Controllers
> * v3.00 and above.
> @@ -1603,6 +1648,20 @@ static int sdhci_start_signal_voltage_switch(struct
> mmc_host *mmc,
> return 0;
> }
>
> +static int sdhci_start_signal_voltage_switch(struct mmc_host *mmc,
> + struct mmc_ios *ios)
> +{
> + struct sdhci_host *host = mmc_priv(mmc);
> + int err;
> +
> + if (host->version < SDHCI_SPEC_300)
> + return 0;
> + sdhci_runtime_pm_get(host);
> + err = sdhci_do_start_signal_voltage_switch(host, ios);
> + sdhci_runtime_pm_put(host);
> + return err;
> +}
> +
> static int sdhci_execute_tuning(struct mmc_host *mmc)
> {
> struct sdhci_host *host;
> @@ -1614,6 +1673,7 @@ static int sdhci_execute_tuning(struct mmc_host *mmc)
>
> host = mmc_priv(mmc);
>
> + sdhci_runtime_pm_get(host);
> disable_irq(host->irq);
> spin_lock(&host->lock);
>
> @@ -1631,6 +1691,7 @@ static int sdhci_execute_tuning(struct mmc_host *mmc)
> else {
> spin_unlock(&host->lock);
> enable_irq(host->irq);
> + sdhci_runtime_pm_put(host);
> return 0;
> }
>
> @@ -1656,7 +1717,7 @@ static int sdhci_execute_tuning(struct mmc_host *mmc)
> timeout = 150;
> do {
> struct mmc_command cmd = {0};
> - struct mmc_request mrq = {0};
> + struct mmc_request mrq = {NULL};
>
> if (!tuning_loop_counter && !timeout)
> break;
> @@ -1774,18 +1835,16 @@ out:
> sdhci_clear_set_irqs(host, SDHCI_INT_DATA_AVAIL, ier);
> spin_unlock(&host->lock);
> enable_irq(host->irq);
> + sdhci_runtime_pm_put(host);
>
> return err;
> }
>
> -static void sdhci_enable_preset_value(struct mmc_host *mmc, bool enable)
> +static void sdhci_do_enable_preset_value(struct sdhci_host *host, bool
> enable)
> {
> - 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;
> @@ -1801,14 +1860,25 @@ static void sdhci_enable_preset_value(struct mmc_host
> *mmc, bool enable)
> if (enable && !(ctrl & SDHCI_CTRL_PRESET_VAL_ENABLE)) {
> ctrl |= SDHCI_CTRL_PRESET_VAL_ENABLE;
> sdhci_writew(host, ctrl, SDHCI_HOST_CONTROL2);
> + host->flags |= SDHCI_PV_ENABLED;
> } else if (!enable && (ctrl & SDHCI_CTRL_PRESET_VAL_ENABLE)) {
> ctrl &= ~SDHCI_CTRL_PRESET_VAL_ENABLE;
> sdhci_writew(host, ctrl, SDHCI_HOST_CONTROL2);
> + host->flags &= ~SDHCI_PV_ENABLED;
> }
>
> spin_unlock_irqrestore(&host->lock, flags);
> }
>
> +static void sdhci_enable_preset_value(struct mmc_host *mmc, bool enable)
> +{
> + struct sdhci_host *host = mmc_priv(mmc);
> +
> + sdhci_runtime_pm_get(host);
> + sdhci_do_enable_preset_value(host, enable);
> + sdhci_runtime_pm_put(host);
> +}
> +
> static const struct mmc_host_ops sdhci_ops = {
> .request = sdhci_request,
> .set_ios = sdhci_set_ios,
> @@ -1835,19 +1905,19 @@ static void sdhci_tasklet_card(unsigned long param)
>
> spin_lock_irqsave(&host->lock, flags);
>
> - if (!(sdhci_readl(host, SDHCI_PRESENT_STATE) & SDHCI_CARD_PRESENT)) {
> - if (host->mrq) {
> - printk(KERN_ERR "%s: Card removed during transfer!\n",
> - mmc_hostname(host->mmc));
> - printk(KERN_ERR "%s: Resetting controller.\n",
> - mmc_hostname(host->mmc));
> + /* Check host->mrq first in case we are runtime suspended */
> + if (host->mrq &&
> + !(sdhci_readl(host, SDHCI_PRESENT_STATE) & SDHCI_CARD_PRESENT)) {
> + printk(KERN_ERR "%s: Card removed during transfer!\n",
> + mmc_hostname(host->mmc));
> + printk(KERN_ERR "%s: Resetting controller.\n",
> + mmc_hostname(host->mmc));
>
> - sdhci_reset(host, SDHCI_RESET_CMD);
> - sdhci_reset(host, SDHCI_RESET_DATA);
> + sdhci_reset(host, SDHCI_RESET_CMD);
> + sdhci_reset(host, SDHCI_RESET_DATA);
>
> - host->mrq->cmd->error = -ENOMEDIUM;
> - tasklet_schedule(&host->finish_tasklet);
> - }
> + host->mrq->cmd->error = -ENOMEDIUM;
> + tasklet_schedule(&host->finish_tasklet);
> }
>
> spin_unlock_irqrestore(&host->lock, flags);
> @@ -1863,14 +1933,16 @@ static void sdhci_tasklet_finish(unsigned long param)
>
> host = (struct sdhci_host*)param;
>
> + spin_lock_irqsave(&host->lock, flags);
> +
> /*
> * If this tasklet gets rescheduled while running, it will
> * be run again afterwards but without any active request.
> */
> - if (!host->mrq)
> + if (!host->mrq) {
> + spin_unlock_irqrestore(&host->lock, flags);
> return;
> -
> - spin_lock_irqsave(&host->lock, flags);
> + }
>
> del_timer(&host->timer);
>
> @@ -1914,6 +1986,7 @@ static void sdhci_tasklet_finish(unsigned long param)
> spin_unlock_irqrestore(&host->lock, flags);
>
> mmc_request_done(host->mmc, mrq);
> + sdhci_runtime_pm_put(host);
> }
>
> static void sdhci_timeout_timer(unsigned long data)
> @@ -2145,12 +2218,19 @@ static void sdhci_data_irq(struct sdhci_host *host,
> u32 intmask)
> static irqreturn_t sdhci_irq(int irq, void *dev_id)
> {
> irqreturn_t result;
> - struct sdhci_host* host = dev_id;
> + struct sdhci_host *host = dev_id;
> u32 intmask;
> int cardint = 0;
>
> spin_lock(&host->lock);
>
> + if (host->runtime_suspended) {
> + spin_unlock(&host->lock);
> + printk(KERN_WARNING "%s: got irq while runtime suspended\n",
> + mmc_hostname(host->mmc));
> + return IRQ_HANDLED;
> + }
> +
> intmask = sdhci_readl(host, SDHCI_INT_STATUS);
>
> if (!intmask || intmask == 0xffffffff) {
> @@ -2284,7 +2364,6 @@ int sdhci_resume_host(struct sdhci_host *host)
> return ret;
> }
>
> -
> if (host->flags & (SDHCI_USE_SDMA | SDHCI_USE_ADMA)) {
> if (host->ops->enable_dma)
> host->ops->enable_dma(host);
> @@ -2323,6 +2402,90 @@ EXPORT_SYMBOL_GPL(sdhci_enable_irq_wakeups);
>
> #endif /* CONFIG_PM */
>
> +#ifdef CONFIG_PM_RUNTIME
> +
> +static int sdhci_runtime_pm_get(struct sdhci_host *host)
> +{
> + return pm_runtime_get_sync(host->mmc->parent);
> +}
> +
> +static int sdhci_runtime_pm_put(struct sdhci_host *host)
> +{
> + pm_runtime_mark_last_busy(host->mmc->parent);
> + return pm_runtime_put_autosuspend(host->mmc->parent);
> +}
> +
> +int sdhci_runtime_suspend_host(struct sdhci_host *host)
> +{
> + unsigned long flags;
> + int ret = 0;
> +
> + /* Disable tuning since we are suspending */
> + if (host->version >= SDHCI_SPEC_300 &&
> + host->tuning_mode == SDHCI_TUNING_MODE_1) {
> + del_timer_sync(&host->tuning_timer);
> + host->flags &= ~SDHCI_NEEDS_RETUNING;
> + }
> +
> + spin_lock_irqsave(&host->lock, flags);
> + sdhci_mask_irqs(host, SDHCI_INT_ALL_MASK);
> + spin_unlock_irqrestore(&host->lock, flags);
> +
> + synchronize_irq(host->irq);
> +
> + spin_lock_irqsave(&host->lock, flags);
> + host->runtime_suspended = true;
> + spin_unlock_irqrestore(&host->lock, flags);
> +
> + return ret;
> +}
> +EXPORT_SYMBOL_GPL(sdhci_runtime_suspend_host);
> +
> +int sdhci_runtime_resume_host(struct sdhci_host *host)
> +{
> + unsigned long flags;
> + int ret = 0, host_flags = host->flags;
> +
> + if (host_flags & (SDHCI_USE_SDMA | SDHCI_USE_ADMA)) {
> + if (host->ops->enable_dma)
> + host->ops->enable_dma(host);
> + }
> +
> + sdhci_init(host, 0);
> +
> + /* Force clock and power re-program */
> + host->pwr = 0;
> + host->clock = 0;
> + sdhci_do_set_ios(host, &host->mmc->ios);
> +
> + sdhci_do_start_signal_voltage_switch(host, &host->mmc->ios);
> + if (host_flags & SDHCI_PV_ENABLED)
> + sdhci_do_enable_preset_value(host, true);
> +
> + /* Set the re-tuning expiration flag */
> + if ((host->version >= SDHCI_SPEC_300) && host->tuning_count &&
> + (host->tuning_mode == SDHCI_TUNING_MODE_1))
> + host->flags |= SDHCI_NEEDS_RETUNING;
> +
> + spin_lock_irqsave(&host->lock, flags);
> +
> + host->runtime_suspended = false;
> +
> + /* Enable SDIO IRQ */
> + if ((host->flags & SDHCI_SDIO_IRQ_ENABLED))
> + sdhci_enable_sdio_irq_nolock(host, true);
> +
> + /* Enable Card Detection */
> + sdhci_enable_card_detection(host);
> +
> + spin_unlock_irqrestore(&host->lock, flags);
> +
> + return ret;
> +}
> +EXPORT_SYMBOL_GPL(sdhci_runtime_resume_host);
> +
> +#endif
> +
>
> /*****************************************************************************\
> *
> *
> * Device allocation/registration
> *
> @@ -2365,6 +2528,8 @@ int sdhci_add_host(struct sdhci_host *host)
>
> if (debug_quirks)
> host->quirks = debug_quirks;
> + if (debug_quirks2)
> + host->quirks2 = debug_quirks2;
>
> sdhci_reset(host, SDHCI_RESET_ALL);
>
> @@ -2887,9 +3052,11 @@ module_init(sdhci_drv_init);
> module_exit(sdhci_drv_exit);
>
> module_param(debug_quirks, uint, 0444);
> +module_param(debug_quirks2, uint, 0444);
>
> MODULE_AUTHOR("Pierre Ossman <[email protected]>");
> MODULE_DESCRIPTION("Secure Digital Host Controller Interface core driver");
> MODULE_LICENSE("GPL");
>
> MODULE_PARM_DESC(debug_quirks, "Force certain quirks.");
> +MODULE_PARM_DESC(debug_quirks, "Force certain other quirks.");
> diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h
> index 7bd919c..0a5b654 100644
> --- a/drivers/mmc/host/sdhci.h
> +++ b/drivers/mmc/host/sdhci.h
> @@ -379,4 +379,9 @@ extern int sdhci_resume_host(struct sdhci_host *host);
> extern void sdhci_enable_irq_wakeups(struct sdhci_host *host);
> #endif
>
> +#ifdef CONFIG_PM_RUNTIME
> +extern int sdhci_runtime_suspend_host(struct sdhci_host *host);
> +extern int sdhci_runtime_resume_host(struct sdhci_host *host);
> +#endif
> +
> #endif /* __SDHCI_HW_H */
> diff --git a/include/linux/mmc/sdhci.h b/include/linux/mmc/sdhci.h
> index 5666f3a..e4b6935 100644
> --- a/include/linux/mmc/sdhci.h
> +++ b/include/linux/mmc/sdhci.h
> @@ -88,6 +88,10 @@ struct sdhci_host {
> /* The read-only detection via SDHCI_PRESENT_STATE register is unstable */
> #define SDHCI_QUIRK_UNSTABLE_RO_DETECT (1<<31)
>
> + unsigned int quirks2; /* More deviations from spec. */
> +
> +#define SDHCI_QUIRK2_OWN_CARD_DETECTION (1<<0)
> +
> int irq; /* Device IRQ */
> void __iomem *ioaddr; /* Mapped address */
>
> @@ -115,6 +119,8 @@ struct sdhci_host {
> #define SDHCI_NEEDS_RETUNING (1<<5) /* Host needs retuning */
> #define SDHCI_AUTO_CMD12 (1<<6) /* Auto CMD12 support */
> #define SDHCI_AUTO_CMD23 (1<<7) /* Auto CMD23 support */
> +#define SDHCI_PV_ENABLED (1<<8) /* Preset value enabled */
> +#define SDHCI_SDIO_IRQ_ENABLED (1<<9) /* SDIO irq enabled */
>
> unsigned int version; /* SDHCI spec. version */
>
> @@ -125,6 +131,8 @@ struct sdhci_host {
> unsigned int clock; /* Current clock (MHz) */
> u8 pwr; /* Current voltage */
>
> + bool runtime_suspended; /* Host is runtime suspended */
> +
> struct mmc_request *mrq; /* Current request */
> struct mmc_command *cmd; /* Current command */
> struct mmc_data *data; /* Current data request */
--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html