mmc: slot-gpio: Rework how to handle allocation of slot-gpio data
authorUlf Hansson <ulf.hansson@linaro.org>
Thu, 18 Dec 2014 14:44:36 +0000 (15:44 +0100)
committerUlf Hansson <ulf.hansson@linaro.org>
Mon, 19 Jan 2015 08:56:18 +0000 (09:56 +0100)
By moving the allocation of the slot-gpio data into mmc_alloc_host(),
we can remove the slot-gpio internal calls to mmc_gpio_alloc().

This means mmc_gpio_alloc() has now only one caller left, which
consequence allow us to simplify and remove some of the slot-gpio code.

Additionally, this makes the slot-gpio mutex redundant, so let's remove
it.

Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/core/host.c
drivers/mmc/core/slot-gpio.c
include/linux/mmc/host.h

index fcb7f06373cf7bdfcac34ac2b493b6b69a798cfb..07636449b4de1d4dbb0518fcde6264b373ff77df 100644 (file)
@@ -29,6 +29,7 @@
 
 #include "core.h"
 #include "host.h"
+#include "slot-gpio.h"
 
 #define cls_dev_to_mmc_host(d) container_of(d, struct mmc_host, class_dev)
 
@@ -38,7 +39,6 @@ static DEFINE_SPINLOCK(mmc_host_lock);
 static void mmc_host_classdev_release(struct device *dev)
 {
        struct mmc_host *host = cls_dev_to_mmc_host(dev);
-       mutex_destroy(&host->slot.lock);
        spin_lock(&mmc_host_lock);
        idr_remove(&mmc_host_idr, host->index);
        spin_unlock(&mmc_host_lock);
@@ -478,8 +478,10 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *dev)
                host->index = err;
        spin_unlock(&mmc_host_lock);
        idr_preload_end();
-       if (err < 0)
-               goto free;
+       if (err < 0) {
+               kfree(host);
+               return NULL;
+       }
 
        dev_set_name(&host->class_dev, "mmc%d", host->index);
 
@@ -488,10 +490,12 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *dev)
        host->class_dev.class = &mmc_host_class;
        device_initialize(&host->class_dev);
 
-       mmc_host_clk_init(host);
+       if (mmc_gpio_alloc(host)) {
+               put_device(&host->class_dev);
+               return NULL;
+       }
 
-       mutex_init(&host->slot.lock);
-       host->slot.cd_irq = -EINVAL;
+       mmc_host_clk_init(host);
 
        spin_lock_init(&host->lock);
        init_waitqueue_head(&host->wq);
@@ -512,10 +516,6 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *dev)
        host->max_blk_count = PAGE_CACHE_SIZE / 512;
 
        return host;
-
-free:
-       kfree(host);
-       return NULL;
 }
 
 EXPORT_SYMBOL(mmc_alloc_host);
index ec918c27e77f1b97dec2987be31fcbfb11fd8711..1a3edbd47719e0b94fa90b2dbce144a4322520b9 100644 (file)
@@ -43,29 +43,17 @@ static irqreturn_t mmc_gpio_cd_irqt(int irq, void *dev_id)
 int mmc_gpio_alloc(struct mmc_host *host)
 {
        size_t len = strlen(dev_name(host->parent)) + 4;
-       struct mmc_gpio *ctx;
-
-       mutex_lock(&host->slot.lock);
-
-       ctx = host->slot.handler_priv;
-       if (!ctx) {
-               /*
-                * devm_kzalloc() can be called after device_initialize(), even
-                * before device_add(), i.e., between mmc_alloc_host() and
-                * mmc_add_host()
-                */
-               ctx = devm_kzalloc(host->parent, sizeof(*ctx) + 2 * len,
-                                  GFP_KERNEL);
-               if (ctx) {
-                       ctx->ro_label = ctx->cd_label + len;
-                       snprintf(ctx->cd_label, len, "%s cd", dev_name(host->parent));
-                       snprintf(ctx->ro_label, len, "%s ro", dev_name(host->parent));
-                       host->slot.handler_priv = ctx;
-               }
+       struct mmc_gpio *ctx = devm_kzalloc(host->parent,
+                               sizeof(*ctx) + 2 * len, GFP_KERNEL);
+
+       if (ctx) {
+               ctx->ro_label = ctx->cd_label + len;
+               snprintf(ctx->cd_label, len, "%s cd", dev_name(host->parent));
+               snprintf(ctx->ro_label, len, "%s ro", dev_name(host->parent));
+               host->slot.handler_priv = ctx;
+               host->slot.cd_irq = -EINVAL;
        }
 
-       mutex_unlock(&host->slot.lock);
-
        return ctx ? 0 : -ENOMEM;
 }
 
@@ -111,18 +99,12 @@ EXPORT_SYMBOL(mmc_gpio_get_cd);
  */
 int mmc_gpio_request_ro(struct mmc_host *host, unsigned int gpio)
 {
-       struct mmc_gpio *ctx;
+       struct mmc_gpio *ctx = host->slot.handler_priv;
        int ret;
 
        if (!gpio_is_valid(gpio))
                return -EINVAL;
 
-       ret = mmc_gpio_alloc(host);
-       if (ret < 0)
-               return ret;
-
-       ctx = host->slot.handler_priv;
-
        ret = devm_gpio_request_one(host->parent, gpio, GPIOF_DIR_IN,
                                    ctx->ro_label);
        if (ret < 0)
@@ -187,15 +169,9 @@ EXPORT_SYMBOL(mmc_gpiod_request_cd_irq);
 int mmc_gpio_request_cd(struct mmc_host *host, unsigned int gpio,
                        unsigned int debounce)
 {
-       struct mmc_gpio *ctx;
+       struct mmc_gpio *ctx = host->slot.handler_priv;
        int ret;
 
-       ret = mmc_gpio_alloc(host);
-       if (ret < 0)
-               return ret;
-
-       ctx = host->slot.handler_priv;
-
        ret = devm_gpio_request_one(host->parent, gpio, GPIOF_DIR_IN,
                                    ctx->cd_label);
        if (ret < 0)
@@ -239,16 +215,10 @@ int mmc_gpiod_request_cd(struct mmc_host *host, const char *con_id,
                         unsigned int idx, bool override_active_level,
                         unsigned int debounce, bool *gpio_invert)
 {
-       struct mmc_gpio *ctx;
+       struct mmc_gpio *ctx = host->slot.handler_priv;
        struct gpio_desc *desc;
        int ret;
 
-       ret = mmc_gpio_alloc(host);
-       if (ret < 0)
-               return ret;
-
-       ctx = host->slot.handler_priv;
-
        if (!con_id)
                con_id = ctx->cd_label;
 
@@ -291,16 +261,10 @@ int mmc_gpiod_request_ro(struct mmc_host *host, const char *con_id,
                         unsigned int idx, bool override_active_level,
                         unsigned int debounce, bool *gpio_invert)
 {
-       struct mmc_gpio *ctx;
+       struct mmc_gpio *ctx = host->slot.handler_priv;
        struct gpio_desc *desc;
        int ret;
 
-       ret = mmc_gpio_alloc(host);
-       if (ret < 0)
-               return ret;
-
-       ctx = host->slot.handler_priv;
-
        if (!con_id)
                con_id = ctx->ro_label;
 
index 9f322706f7cb26a69c9f7ad4d21c195a8befe1aa..b6bf718c3498cf7e47a225531b868378a94c34ba 100644 (file)
@@ -166,7 +166,6 @@ struct mmc_async_req {
  * struct mmc_slot - MMC slot functions
  *
  * @cd_irq:            MMC/SD-card slot hotplug detection IRQ or -EINVAL
- * @lock:              protect the @handler_priv pointer
  * @handler_priv:      MMC/SD-card slot context
  *
  * Some MMC/SD host controllers implement slot-functions like card and
@@ -176,7 +175,6 @@ struct mmc_async_req {
  */
 struct mmc_slot {
        int cd_irq;
-       struct mutex lock;
        void *handler_priv;
 };