mmc: start removing enable / disable API
authorAdrian Hunter <adrian.hunter@intel.com>
Wed, 29 Feb 2012 07:17:21 +0000 (09:17 +0200)
committerChris Ball <cjb@laptop.org>
Tue, 27 Mar 2012 16:20:03 +0000 (12:20 -0400)
Most parts of the enable / disable API are no longer used and
can be removed.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Tested-by: Venkatraman S <svenkatr@ti.com>
Tested-by: Jaehoon Chung <jh80.chung@samsung.com>
Signed-off-by: Chris Ball <cjb@laptop.org>
arch/arm/mach-exynos/mach-nuri.c
arch/arm/mach-exynos/mach-universal_c210.c
drivers/mmc/core/core.c
drivers/mmc/core/host.c
drivers/mmc/core/host.h
drivers/mmc/host/davinci_mmc.c
drivers/mmc/host/omap_hsmmc.c
include/linux/mmc/core.h
include/linux/mmc/host.h

index aa37179..3cdabd3 100644 (file)
@@ -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,
        .clk_type               = S3C_SDHCI_CLK_DIV_EXTERNAL,
 };
@@ -148,8 +148,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,
index b2d495b..87e3dcf 100644 (file)
@@ -736,8 +736,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,
        .clk_type               = S3C_SDHCI_CLK_DIV_EXTERNAL,
 };
@@ -775,8 +774,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,
@@ -787,8 +785,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,
 };
 
index 436409f..9b56674 100644 (file)
@@ -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);
 
 /*
@@ -2227,8 +2074,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();
 
@@ -2423,13 +2268,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;
        }
@@ -2450,7 +2293,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) {
                                /*
index c3704e2..91c84c7 100644 (file)
@@ -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
index 08a7852..f2ab9e5 100644 (file)
@@ -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
 
index 64a8325..8de9c9b 100644 (file)
@@ -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);
index e550170..98adf0c 100644 (file)
@@ -167,7 +167,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;
@@ -1619,7 +1618,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);
 
@@ -1653,15 +1652,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");
@@ -1800,7 +1792,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;
index 87a976c..2bfa589 100644 (file)
@@ -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 *);
index d1d3743..e05bd24 100644 (file)
@@ -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;