Tested on Samsung-SoC Tested-by: Jaehoon Chung <jh80.chung@xxxxxxxxxxx> On 02/29/2012 04:17 PM, Adrian Hunter wrote: > Most parts of the enable / disable API are no longer used and > can be removed. > > Cc: Rajendra Nayak <rnayak@xxxxxx> > Cc: Venkatraman S <svenkatr@xxxxxx> > Cc: Kukjin Kim <kgene.kim@xxxxxxxxxxx> > Cc: Thomas Abraham <thomas.abraham@xxxxxxxxxx> > Cc: Kyungmin Park <kyungmin.park@xxxxxxxxxxx> > Cc: Sekhar Nori <nsekhar@xxxxxx> > Cc: Kevin Hilman <khilman@xxxxxx> > Signed-off-by: Adrian Hunter <adrian.hunter@xxxxxxxxx> > --- > arch/arm/mach-exynos/mach-nuri.c | 5 +- > arch/arm/mach-exynos/mach-universal_c210.c | 9 +- > drivers/mmc/core/core.c | 187 +++------------------------- > drivers/mmc/core/host.c | 1 - > drivers/mmc/core/host.h | 1 - > drivers/mmc/host/davinci_mmc.c | 4 - > drivers/mmc/host/omap_hsmmc.c | 15 +-- > include/linux/mmc/core.h | 1 - > include/linux/mmc/host.h | 46 +------ > 9 files changed, 27 insertions(+), 242 deletions(-) > > diff --git a/arch/arm/mach-exynos/mach-nuri.c b/arch/arm/mach-exynos/mach-nuri.c > index 644af11..de68248 100644 > --- a/arch/arm/mach-exynos/mach-nuri.c > +++ b/arch/arm/mach-exynos/mach-nuri.c > @@ -109,7 +109,7 @@ static struct s3c_sdhci_platdata nuri_hsmmc0_data __initdata = { > .max_width = 8, > .host_caps = (MMC_CAP_8_BIT_DATA | MMC_CAP_4_BIT_DATA | > MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED | > - MMC_CAP_DISABLE | MMC_CAP_ERASE), > + MMC_CAP_ERASE), > .cd_type = S3C_SDHCI_CD_PERMANENT, > }; > > @@ -147,8 +147,7 @@ static struct platform_device emmc_fixed_voltage = { > static struct s3c_sdhci_platdata nuri_hsmmc2_data __initdata = { > .max_width = 4, > .host_caps = MMC_CAP_4_BIT_DATA | > - MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED | > - MMC_CAP_DISABLE, > + MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED, > .ext_cd_gpio = EXYNOS4_GPX3(3), /* XEINT_27 */ > .ext_cd_gpio_invert = 1, > .cd_type = S3C_SDHCI_CD_GPIO, > diff --git a/arch/arm/mach-exynos/mach-universal_c210.c b/arch/arm/mach-exynos/mach-universal_c210.c > index 9b3fbae..57cfe61 100644 > --- a/arch/arm/mach-exynos/mach-universal_c210.c > +++ b/arch/arm/mach-exynos/mach-universal_c210.c > @@ -734,8 +734,7 @@ static struct platform_device universal_gpio_keys = { > static struct s3c_sdhci_platdata universal_hsmmc0_data __initdata = { > .max_width = 8, > .host_caps = (MMC_CAP_8_BIT_DATA | MMC_CAP_4_BIT_DATA | > - MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED | > - MMC_CAP_DISABLE), > + MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED), > .cd_type = S3C_SDHCI_CD_PERMANENT, > }; > > @@ -772,8 +771,7 @@ static struct platform_device mmc0_fixed_voltage = { > static struct s3c_sdhci_platdata universal_hsmmc2_data __initdata = { > .max_width = 4, > .host_caps = MMC_CAP_4_BIT_DATA | > - MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED | > - MMC_CAP_DISABLE, > + MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED, > .ext_cd_gpio = EXYNOS4_GPX3(4), /* XEINT_28 */ > .ext_cd_gpio_invert = 1, > .cd_type = S3C_SDHCI_CD_GPIO, > @@ -783,8 +781,7 @@ static struct s3c_sdhci_platdata universal_hsmmc2_data __initdata = { > static struct s3c_sdhci_platdata universal_hsmmc3_data __initdata = { > .max_width = 4, > .host_caps = MMC_CAP_4_BIT_DATA | > - MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED | > - MMC_CAP_DISABLE, > + MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED, > .cd_type = S3C_SDHCI_CD_EXTERNAL, > }; > > diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c > index 0b317f0..44dd013 100644 > --- a/drivers/mmc/core/core.c > +++ b/drivers/mmc/core/core.c > @@ -605,105 +605,6 @@ unsigned int mmc_align_data_size(struct mmc_card *card, unsigned int sz) > EXPORT_SYMBOL(mmc_align_data_size); > > /** > - * mmc_host_enable - enable a host. > - * @host: mmc host to enable > - * > - * Hosts that support power saving can use the 'enable' and 'disable' > - * methods to exit and enter power saving states. For more information > - * see comments for struct mmc_host_ops. > - */ > -int mmc_host_enable(struct mmc_host *host) > -{ > - if (!(host->caps & MMC_CAP_DISABLE)) > - return 0; > - > - if (host->en_dis_recurs) > - return 0; > - > - if (host->nesting_cnt++) > - return 0; > - > - cancel_delayed_work_sync(&host->disable); > - > - if (host->enabled) > - return 0; > - > - if (host->ops->enable) { > - int err; > - > - host->en_dis_recurs = 1; > - mmc_host_clk_hold(host); > - err = host->ops->enable(host); > - mmc_host_clk_release(host); > - host->en_dis_recurs = 0; > - > - if (err) { > - pr_debug("%s: enable error %d\n", > - mmc_hostname(host), err); > - return err; > - } > - } > - host->enabled = 1; > - return 0; > -} > -EXPORT_SYMBOL(mmc_host_enable); > - > -static int mmc_host_do_disable(struct mmc_host *host, int lazy) > -{ > - if (host->ops->disable) { > - int err; > - > - host->en_dis_recurs = 1; > - mmc_host_clk_hold(host); > - err = host->ops->disable(host, lazy); > - mmc_host_clk_release(host); > - host->en_dis_recurs = 0; > - > - if (err < 0) { > - pr_debug("%s: disable error %d\n", > - mmc_hostname(host), err); > - return err; > - } > - if (err > 0) { > - unsigned long delay = msecs_to_jiffies(err); > - > - mmc_schedule_delayed_work(&host->disable, delay); > - } > - } > - host->enabled = 0; > - return 0; > -} > - > -/** > - * mmc_host_disable - disable a host. > - * @host: mmc host to disable > - * > - * Hosts that support power saving can use the 'enable' and 'disable' > - * methods to exit and enter power saving states. For more information > - * see comments for struct mmc_host_ops. > - */ > -int mmc_host_disable(struct mmc_host *host) > -{ > - int err; > - > - if (!(host->caps & MMC_CAP_DISABLE)) > - return 0; > - > - if (host->en_dis_recurs) > - return 0; > - > - if (--host->nesting_cnt) > - return 0; > - > - if (!host->enabled) > - return 0; > - > - err = mmc_host_do_disable(host, 0); > - return err; > -} > -EXPORT_SYMBOL(mmc_host_disable); > - > -/** > * __mmc_claim_host - exclusively claim a host > * @host: mmc host to claim > * @abort: whether or not the operation should be aborted > @@ -741,8 +642,8 @@ int __mmc_claim_host(struct mmc_host *host, atomic_t *abort) > wake_up(&host->wq); > spin_unlock_irqrestore(&host->lock, flags); > remove_wait_queue(&host->wq, &wait); > - if (!stop) > - mmc_host_enable(host); > + if (host->ops->enable && !stop && host->claim_cnt == 1) > + host->ops->enable(host); > return stop; > } > > @@ -767,21 +668,28 @@ int mmc_try_claim_host(struct mmc_host *host) > claimed_host = 1; > } > spin_unlock_irqrestore(&host->lock, flags); > + if (host->ops->enable && claimed_host && host->claim_cnt == 1) > + host->ops->enable(host); > return claimed_host; > } > EXPORT_SYMBOL(mmc_try_claim_host); > > /** > - * mmc_do_release_host - release a claimed host > + * mmc_release_host - release a host > * @host: mmc host to release > * > - * If you successfully claimed a host, this function will > - * release it again. > + * Release a MMC host, allowing others to claim the host > + * for their operations. > */ > -void mmc_do_release_host(struct mmc_host *host) > +void mmc_release_host(struct mmc_host *host) > { > unsigned long flags; > > + WARN_ON(!host->claimed); > + > + if (host->ops->disable && host->claim_cnt == 1) > + host->ops->disable(host); > + > spin_lock_irqsave(&host->lock, flags); > if (--host->claim_cnt) { > /* Release for nested claim */ > @@ -793,67 +701,6 @@ void mmc_do_release_host(struct mmc_host *host) > wake_up(&host->wq); > } > } > -EXPORT_SYMBOL(mmc_do_release_host); > - > -void mmc_host_deeper_disable(struct work_struct *work) > -{ > - struct mmc_host *host = > - container_of(work, struct mmc_host, disable.work); > - > - /* If the host is claimed then we do not want to disable it anymore */ > - if (!mmc_try_claim_host(host)) > - return; > - mmc_host_do_disable(host, 1); > - mmc_do_release_host(host); > -} > - > -/** > - * mmc_host_lazy_disable - lazily disable a host. > - * @host: mmc host to disable > - * > - * Hosts that support power saving can use the 'enable' and 'disable' > - * methods to exit and enter power saving states. For more information > - * see comments for struct mmc_host_ops. > - */ > -int mmc_host_lazy_disable(struct mmc_host *host) > -{ > - if (!(host->caps & MMC_CAP_DISABLE)) > - return 0; > - > - if (host->en_dis_recurs) > - return 0; > - > - if (--host->nesting_cnt) > - return 0; > - > - if (!host->enabled) > - return 0; > - > - if (host->disable_delay) { > - mmc_schedule_delayed_work(&host->disable, > - msecs_to_jiffies(host->disable_delay)); > - return 0; > - } else > - return mmc_host_do_disable(host, 1); > -} > -EXPORT_SYMBOL(mmc_host_lazy_disable); > - > -/** > - * mmc_release_host - release a host > - * @host: mmc host to release > - * > - * Release a MMC host, allowing others to claim the host > - * for their operations. > - */ > -void mmc_release_host(struct mmc_host *host) > -{ > - WARN_ON(!host->claimed); > - > - mmc_host_lazy_disable(host); > - > - mmc_do_release_host(host); > -} > - > EXPORT_SYMBOL(mmc_release_host); > > /* > @@ -2206,8 +2053,6 @@ void mmc_stop_host(struct mmc_host *host) > spin_unlock_irqrestore(&host->lock, flags); > #endif > > - if (host->caps & MMC_CAP_DISABLE) > - cancel_delayed_work(&host->disable); > cancel_delayed_work_sync(&host->detect); > mmc_flush_scheduled_work(); > > @@ -2402,13 +2247,11 @@ int mmc_suspend_host(struct mmc_host *host) > { > int err = 0; > > - if (host->caps & MMC_CAP_DISABLE) > - cancel_delayed_work(&host->disable); > cancel_delayed_work(&host->detect); > mmc_flush_scheduled_work(); > if (mmc_try_claim_host(host)) { > err = mmc_cache_ctrl(host, 0); > - mmc_do_release_host(host); > + mmc_release_host(host); > } else { > err = -EBUSY; > } > @@ -2429,7 +2272,7 @@ int mmc_suspend_host(struct mmc_host *host) > if (host->bus_ops->suspend) { > err = host->bus_ops->suspend(host); > } > - mmc_do_release_host(host); > + mmc_release_host(host); > > if (err == -ENOSYS || !host->bus_ops->resume) { > /* > diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c > index c3704e2..91c84c7 100644 > --- a/drivers/mmc/core/host.c > +++ b/drivers/mmc/core/host.c > @@ -330,7 +330,6 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *dev) > spin_lock_init(&host->lock); > init_waitqueue_head(&host->wq); > INIT_DELAYED_WORK(&host->detect, mmc_rescan); > - INIT_DELAYED_WORK_DEFERRABLE(&host->disable, mmc_host_deeper_disable); > #ifdef CONFIG_PM > host->pm_notify.notifier_call = mmc_pm_notify; > #endif > diff --git a/drivers/mmc/core/host.h b/drivers/mmc/core/host.h > index 08a7852..f2ab9e5 100644 > --- a/drivers/mmc/core/host.h > +++ b/drivers/mmc/core/host.h > @@ -14,7 +14,6 @@ > > int mmc_register_host_class(void); > void mmc_unregister_host_class(void); > -void mmc_host_deeper_disable(struct work_struct *work); > > #endif > > diff --git a/drivers/mmc/host/davinci_mmc.c b/drivers/mmc/host/davinci_mmc.c > index 64a8325..8de9c9b 100644 > --- a/drivers/mmc/host/davinci_mmc.c > +++ b/drivers/mmc/host/davinci_mmc.c > @@ -1418,17 +1418,14 @@ static int davinci_mmcsd_suspend(struct device *dev) > struct mmc_davinci_host *host = platform_get_drvdata(pdev); > int ret; > > - mmc_host_enable(host->mmc); > ret = mmc_suspend_host(host->mmc); > if (!ret) { > writel(0, host->base + DAVINCI_MMCIM); > mmc_davinci_reset_ctrl(host, 1); > - mmc_host_disable(host->mmc); > clk_disable(host->clk); > host->suspended = 1; > } else { > host->suspended = 0; > - mmc_host_disable(host->mmc); > } > > return ret; > @@ -1444,7 +1441,6 @@ static int davinci_mmcsd_resume(struct device *dev) > return 0; > > clk_enable(host->clk); > - mmc_host_enable(host->mmc); > > mmc_davinci_reset_ctrl(host, 0); > ret = mmc_resume_host(host->mmc); > diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c > index 36e7f5b..fdb24cf 100644 > --- a/drivers/mmc/host/omap_hsmmc.c > +++ b/drivers/mmc/host/omap_hsmmc.c > @@ -179,7 +179,6 @@ struct omap_hsmmc_host { > int got_dbclk; > int response_busy; > int context_loss; > - int dpm_state; > int vdd; > int protect_card; > int reqs_blocked; > @@ -1748,7 +1747,7 @@ static int omap_hsmmc_enable_fclk(struct mmc_host *mmc) > return 0; > } > > -static int omap_hsmmc_disable_fclk(struct mmc_host *mmc, int lazy) > +static int omap_hsmmc_disable_fclk(struct mmc_host *mmc) > { > struct omap_hsmmc_host *host = mmc_priv(mmc); > > @@ -1782,15 +1781,8 @@ static int omap_hsmmc_regs_show(struct seq_file *s, void *data) > if (host->pdata->get_context_loss_count) > context_loss = host->pdata->get_context_loss_count(host->dev); > > - seq_printf(s, "mmc%d:\n" > - " enabled:\t%d\n" > - " dpm_state:\t%d\n" > - " nesting_cnt:\t%d\n" > - " ctx_loss:\t%d:%d\n" > - "\nregs:\n", > - mmc->index, mmc->enabled ? 1 : 0, > - host->dpm_state, mmc->nesting_cnt, > - host->context_loss, context_loss); > + seq_printf(s, "mmc%d:\n ctx_loss:\t%d:%d\n\nregs:\n", > + mmc->index, host->context_loss, context_loss); > > if (host->suspended) { > seq_printf(s, "host suspended, can't read registers\n"); > @@ -1930,7 +1922,6 @@ static int __init omap_hsmmc_probe(struct platform_device *pdev) > > omap_hsmmc_context_save(host); > > - mmc->caps |= MMC_CAP_DISABLE; > if (host->pdata->controller_flags & OMAP_HSMMC_BROKEN_MULTIBLOCK_READ) { > dev_info(&pdev->dev, "multiblock reads disabled due to 35xx erratum 2.1.1.128; MMC read performance may suffer\n"); > mmc->caps2 |= MMC_CAP2_NO_MULTI_READ; > diff --git a/include/linux/mmc/core.h b/include/linux/mmc/core.h > index 87a976c..2bfa589 100644 > --- a/include/linux/mmc/core.h > +++ b/include/linux/mmc/core.h > @@ -175,7 +175,6 @@ extern unsigned int mmc_align_data_size(struct mmc_card *, unsigned int); > > extern int __mmc_claim_host(struct mmc_host *host, atomic_t *abort); > extern void mmc_release_host(struct mmc_host *host); > -extern void mmc_do_release_host(struct mmc_host *host); > extern int mmc_try_claim_host(struct mmc_host *host); > > extern int mmc_flush_cache(struct mmc_card *); > diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h > index 37147a4..4da98f7 100644 > --- a/include/linux/mmc/host.h > +++ b/include/linux/mmc/host.h > @@ -80,34 +80,11 @@ struct mmc_ios { > > struct mmc_host_ops { > /* > - * Hosts that support power saving can use the 'enable' and 'disable' > - * methods to exit and enter power saving states. 'enable' is called > - * when the host is claimed and 'disable' is called (or scheduled with > - * a delay) when the host is released. The 'disable' is scheduled if > - * the disable delay set by 'mmc_set_disable_delay()' is non-zero, > - * otherwise 'disable' is called immediately. 'disable' may be > - * scheduled repeatedly, to permit ever greater power saving at the > - * expense of ever greater latency to re-enable. Rescheduling is > - * determined by the return value of the 'disable' method. A positive > - * value gives the delay in milliseconds. > - * > - * In the case where a host function (like set_ios) may be called > - * with or without the host claimed, enabling and disabling can be > - * done directly and will nest correctly. Call 'mmc_host_enable()' and > - * 'mmc_host_lazy_disable()' for this purpose, but note that these > - * functions must be paired. > - * > - * Alternatively, 'mmc_host_enable()' may be paired with > - * 'mmc_host_disable()' which calls 'disable' immediately. In this > - * case the 'disable' method will be called with 'lazy' set to 0. > - * This is mainly useful for error paths. > - * > - * Because lazy disable may be called from a work queue, the 'disable' > - * method must claim the host when 'lazy' != 0, which will work > - * correctly because recursion is detected and handled. > + * 'enable' is called when the host is claimed and 'disable' is called > + * when the host is released. 'enable' and 'disable' are deprecated. > */ > int (*enable)(struct mmc_host *host); > - int (*disable)(struct mmc_host *host, int lazy); > + int (*disable)(struct mmc_host *host); > /* > * It is optional for the host to implement pre_req and post_req in > * order to support double buffering of requests (prepare one > @@ -218,7 +195,7 @@ struct mmc_host { > #define MMC_CAP_SPI (1 << 4) /* Talks only SPI protocols */ > #define MMC_CAP_NEEDS_POLL (1 << 5) /* Needs polling for card-detection */ > #define MMC_CAP_8_BIT_DATA (1 << 6) /* Can the host do 8 bit transfers */ > -#define MMC_CAP_DISABLE (1 << 7) /* Can the host be disabled */ > + > #define MMC_CAP_NONREMOVABLE (1 << 8) /* Nonremovable e.g. eMMC */ > #define MMC_CAP_WAIT_WHILE_BUSY (1 << 9) /* Waits while card is busy */ > #define MMC_CAP_ERASE (1 << 10) /* Allow erase/trim commands */ > @@ -301,13 +278,7 @@ struct mmc_host { > unsigned int removed:1; /* host is being removed */ > #endif > > - /* Only used with MMC_CAP_DISABLE */ > - int enabled; /* host is enabled */ > int rescan_disable; /* disable card detection */ > - int nesting_cnt; /* "enable" nesting count */ > - int en_dis_recurs; /* detect recursion */ > - unsigned int disable_delay; /* disable delay in msecs */ > - struct delayed_work disable; /* disabling work */ > > struct mmc_card *card; /* device attached to this host */ > > @@ -407,17 +378,8 @@ int mmc_card_awake(struct mmc_host *host); > int mmc_card_sleep(struct mmc_host *host); > int mmc_card_can_sleep(struct mmc_host *host); > > -int mmc_host_enable(struct mmc_host *host); > -int mmc_host_disable(struct mmc_host *host); > -int mmc_host_lazy_disable(struct mmc_host *host); > int mmc_pm_notify(struct notifier_block *notify_block, unsigned long, void *); > > -static inline void mmc_set_disable_delay(struct mmc_host *host, > - unsigned int disable_delay) > -{ > - host->disable_delay = disable_delay; > -} > - > /* Module parameter */ > extern bool mmc_assume_removable; > -- 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