diff options
| author | Ulf Hansson <ulf.hansson@linaro.org> | 2014-12-18 09:44:36 -0500 |
|---|---|---|
| committer | Ulf Hansson <ulf.hansson@linaro.org> | 2015-01-19 03:56:18 -0500 |
| commit | df8aca162e5ff2b20c7a4de3e64e5b96ff838ab0 (patch) | |
| tree | 10fd8c7a3d6892525e89916044e0b8b728b61e2d | |
| parent | e2d1926bad0d0cf7e4b8bf11a8efd1b5fe48893e (diff) | |
mmc: slot-gpio: Rework how to handle allocation of slot-gpio data
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>
| -rw-r--r-- | drivers/mmc/core/host.c | 20 | ||||
| -rw-r--r-- | drivers/mmc/core/slot-gpio.c | 62 | ||||
| -rw-r--r-- | include/linux/mmc/host.h | 2 |
3 files changed, 23 insertions, 61 deletions
diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c index fcb7f06373cf..07636449b4de 100644 --- a/drivers/mmc/core/host.c +++ b/drivers/mmc/core/host.c | |||
| @@ -29,6 +29,7 @@ | |||
| 29 | 29 | ||
| 30 | #include "core.h" | 30 | #include "core.h" |
| 31 | #include "host.h" | 31 | #include "host.h" |
| 32 | #include "slot-gpio.h" | ||
| 32 | 33 | ||
| 33 | #define cls_dev_to_mmc_host(d) container_of(d, struct mmc_host, class_dev) | 34 | #define cls_dev_to_mmc_host(d) container_of(d, struct mmc_host, class_dev) |
| 34 | 35 | ||
| @@ -38,7 +39,6 @@ static DEFINE_SPINLOCK(mmc_host_lock); | |||
| 38 | static void mmc_host_classdev_release(struct device *dev) | 39 | static void mmc_host_classdev_release(struct device *dev) |
| 39 | { | 40 | { |
| 40 | struct mmc_host *host = cls_dev_to_mmc_host(dev); | 41 | struct mmc_host *host = cls_dev_to_mmc_host(dev); |
| 41 | mutex_destroy(&host->slot.lock); | ||
| 42 | spin_lock(&mmc_host_lock); | 42 | spin_lock(&mmc_host_lock); |
| 43 | idr_remove(&mmc_host_idr, host->index); | 43 | idr_remove(&mmc_host_idr, host->index); |
| 44 | spin_unlock(&mmc_host_lock); | 44 | spin_unlock(&mmc_host_lock); |
| @@ -478,8 +478,10 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *dev) | |||
| 478 | host->index = err; | 478 | host->index = err; |
| 479 | spin_unlock(&mmc_host_lock); | 479 | spin_unlock(&mmc_host_lock); |
| 480 | idr_preload_end(); | 480 | idr_preload_end(); |
| 481 | if (err < 0) | 481 | if (err < 0) { |
| 482 | goto free; | 482 | kfree(host); |
| 483 | return NULL; | ||
| 484 | } | ||
| 483 | 485 | ||
| 484 | dev_set_name(&host->class_dev, "mmc%d", host->index); | 486 | dev_set_name(&host->class_dev, "mmc%d", host->index); |
| 485 | 487 | ||
| @@ -488,10 +490,12 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *dev) | |||
| 488 | host->class_dev.class = &mmc_host_class; | 490 | host->class_dev.class = &mmc_host_class; |
| 489 | device_initialize(&host->class_dev); | 491 | device_initialize(&host->class_dev); |
| 490 | 492 | ||
| 491 | mmc_host_clk_init(host); | 493 | if (mmc_gpio_alloc(host)) { |
| 494 | put_device(&host->class_dev); | ||
| 495 | return NULL; | ||
| 496 | } | ||
| 492 | 497 | ||
| 493 | mutex_init(&host->slot.lock); | 498 | mmc_host_clk_init(host); |
| 494 | host->slot.cd_irq = -EINVAL; | ||
| 495 | 499 | ||
| 496 | spin_lock_init(&host->lock); | 500 | spin_lock_init(&host->lock); |
| 497 | init_waitqueue_head(&host->wq); | 501 | init_waitqueue_head(&host->wq); |
| @@ -512,10 +516,6 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *dev) | |||
| 512 | host->max_blk_count = PAGE_CACHE_SIZE / 512; | 516 | host->max_blk_count = PAGE_CACHE_SIZE / 512; |
| 513 | 517 | ||
| 514 | return host; | 518 | return host; |
| 515 | |||
| 516 | free: | ||
| 517 | kfree(host); | ||
| 518 | return NULL; | ||
| 519 | } | 519 | } |
| 520 | 520 | ||
| 521 | EXPORT_SYMBOL(mmc_alloc_host); | 521 | EXPORT_SYMBOL(mmc_alloc_host); |
diff --git a/drivers/mmc/core/slot-gpio.c b/drivers/mmc/core/slot-gpio.c index ec918c27e77f..1a3edbd47719 100644 --- a/drivers/mmc/core/slot-gpio.c +++ b/drivers/mmc/core/slot-gpio.c | |||
| @@ -43,29 +43,17 @@ static irqreturn_t mmc_gpio_cd_irqt(int irq, void *dev_id) | |||
| 43 | int mmc_gpio_alloc(struct mmc_host *host) | 43 | int mmc_gpio_alloc(struct mmc_host *host) |
| 44 | { | 44 | { |
| 45 | size_t len = strlen(dev_name(host->parent)) + 4; | 45 | size_t len = strlen(dev_name(host->parent)) + 4; |
| 46 | struct mmc_gpio *ctx; | 46 | struct mmc_gpio *ctx = devm_kzalloc(host->parent, |
| 47 | 47 | sizeof(*ctx) + 2 * len, GFP_KERNEL); | |
| 48 | mutex_lock(&host->slot.lock); | 48 | |
| 49 | 49 | if (ctx) { | |
| 50 | ctx = host->slot.handler_priv; | 50 | ctx->ro_label = ctx->cd_label + len; |
| 51 | if (!ctx) { | 51 | snprintf(ctx->cd_label, len, "%s cd", dev_name(host->parent)); |
| 52 | /* | 52 | snprintf(ctx->ro_label, len, "%s ro", dev_name(host->parent)); |
| 53 | * devm_kzalloc() can be called after device_initialize(), even | 53 | host->slot.handler_priv = ctx; |
| 54 | * before device_add(), i.e., between mmc_alloc_host() and | 54 | host->slot.cd_irq = -EINVAL; |
| 55 | * mmc_add_host() | ||
| 56 | */ | ||
| 57 | ctx = devm_kzalloc(host->parent, sizeof(*ctx) + 2 * len, | ||
| 58 | GFP_KERNEL); | ||
| 59 | if (ctx) { | ||
| 60 | ctx->ro_label = ctx->cd_label + len; | ||
| 61 | snprintf(ctx->cd_label, len, "%s cd", dev_name(host->parent)); | ||
| 62 | snprintf(ctx->ro_label, len, "%s ro", dev_name(host->parent)); | ||
| 63 | host->slot.handler_priv = ctx; | ||
| 64 | } | ||
| 65 | } | 55 | } |
| 66 | 56 | ||
| 67 | mutex_unlock(&host->slot.lock); | ||
| 68 | |||
| 69 | return ctx ? 0 : -ENOMEM; | 57 | return ctx ? 0 : -ENOMEM; |
| 70 | } | 58 | } |
| 71 | 59 | ||
| @@ -111,18 +99,12 @@ EXPORT_SYMBOL(mmc_gpio_get_cd); | |||
| 111 | */ | 99 | */ |
| 112 | int mmc_gpio_request_ro(struct mmc_host *host, unsigned int gpio) | 100 | int mmc_gpio_request_ro(struct mmc_host *host, unsigned int gpio) |
| 113 | { | 101 | { |
| 114 | struct mmc_gpio *ctx; | 102 | struct mmc_gpio *ctx = host->slot.handler_priv; |
| 115 | int ret; | 103 | int ret; |
| 116 | 104 | ||
| 117 | if (!gpio_is_valid(gpio)) | 105 | if (!gpio_is_valid(gpio)) |
| 118 | return -EINVAL; | 106 | return -EINVAL; |
| 119 | 107 | ||
| 120 | ret = mmc_gpio_alloc(host); | ||
| 121 | if (ret < 0) | ||
| 122 | return ret; | ||
| 123 | |||
| 124 | ctx = host->slot.handler_priv; | ||
| 125 | |||
| 126 | ret = devm_gpio_request_one(host->parent, gpio, GPIOF_DIR_IN, | 108 | ret = devm_gpio_request_one(host->parent, gpio, GPIOF_DIR_IN, |
| 127 | ctx->ro_label); | 109 | ctx->ro_label); |
| 128 | if (ret < 0) | 110 | if (ret < 0) |
| @@ -187,15 +169,9 @@ EXPORT_SYMBOL(mmc_gpiod_request_cd_irq); | |||
| 187 | int mmc_gpio_request_cd(struct mmc_host *host, unsigned int gpio, | 169 | int mmc_gpio_request_cd(struct mmc_host *host, unsigned int gpio, |
| 188 | unsigned int debounce) | 170 | unsigned int debounce) |
| 189 | { | 171 | { |
| 190 | struct mmc_gpio *ctx; | 172 | struct mmc_gpio *ctx = host->slot.handler_priv; |
| 191 | int ret; | 173 | int ret; |
| 192 | 174 | ||
| 193 | ret = mmc_gpio_alloc(host); | ||
| 194 | if (ret < 0) | ||
| 195 | return ret; | ||
| 196 | |||
| 197 | ctx = host->slot.handler_priv; | ||
| 198 | |||
| 199 | ret = devm_gpio_request_one(host->parent, gpio, GPIOF_DIR_IN, | 175 | ret = devm_gpio_request_one(host->parent, gpio, GPIOF_DIR_IN, |
| 200 | ctx->cd_label); | 176 | ctx->cd_label); |
| 201 | if (ret < 0) | 177 | if (ret < 0) |
| @@ -239,16 +215,10 @@ int mmc_gpiod_request_cd(struct mmc_host *host, const char *con_id, | |||
| 239 | unsigned int idx, bool override_active_level, | 215 | unsigned int idx, bool override_active_level, |
| 240 | unsigned int debounce, bool *gpio_invert) | 216 | unsigned int debounce, bool *gpio_invert) |
| 241 | { | 217 | { |
| 242 | struct mmc_gpio *ctx; | 218 | struct mmc_gpio *ctx = host->slot.handler_priv; |
| 243 | struct gpio_desc *desc; | 219 | struct gpio_desc *desc; |
| 244 | int ret; | 220 | int ret; |
| 245 | 221 | ||
| 246 | ret = mmc_gpio_alloc(host); | ||
| 247 | if (ret < 0) | ||
| 248 | return ret; | ||
| 249 | |||
| 250 | ctx = host->slot.handler_priv; | ||
| 251 | |||
| 252 | if (!con_id) | 222 | if (!con_id) |
| 253 | con_id = ctx->cd_label; | 223 | con_id = ctx->cd_label; |
| 254 | 224 | ||
| @@ -291,16 +261,10 @@ int mmc_gpiod_request_ro(struct mmc_host *host, const char *con_id, | |||
| 291 | unsigned int idx, bool override_active_level, | 261 | unsigned int idx, bool override_active_level, |
| 292 | unsigned int debounce, bool *gpio_invert) | 262 | unsigned int debounce, bool *gpio_invert) |
| 293 | { | 263 | { |
| 294 | struct mmc_gpio *ctx; | 264 | struct mmc_gpio *ctx = host->slot.handler_priv; |
| 295 | struct gpio_desc *desc; | 265 | struct gpio_desc *desc; |
| 296 | int ret; | 266 | int ret; |
| 297 | 267 | ||
| 298 | ret = mmc_gpio_alloc(host); | ||
| 299 | if (ret < 0) | ||
| 300 | return ret; | ||
| 301 | |||
| 302 | ctx = host->slot.handler_priv; | ||
| 303 | |||
| 304 | if (!con_id) | 268 | if (!con_id) |
| 305 | con_id = ctx->ro_label; | 269 | con_id = ctx->ro_label; |
| 306 | 270 | ||
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index 9f322706f7cb..b6bf718c3498 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h | |||
| @@ -166,7 +166,6 @@ struct mmc_async_req { | |||
| 166 | * struct mmc_slot - MMC slot functions | 166 | * struct mmc_slot - MMC slot functions |
| 167 | * | 167 | * |
| 168 | * @cd_irq: MMC/SD-card slot hotplug detection IRQ or -EINVAL | 168 | * @cd_irq: MMC/SD-card slot hotplug detection IRQ or -EINVAL |
| 169 | * @lock: protect the @handler_priv pointer | ||
| 170 | * @handler_priv: MMC/SD-card slot context | 169 | * @handler_priv: MMC/SD-card slot context |
| 171 | * | 170 | * |
| 172 | * Some MMC/SD host controllers implement slot-functions like card and | 171 | * Some MMC/SD host controllers implement slot-functions like card and |
| @@ -176,7 +175,6 @@ struct mmc_async_req { | |||
| 176 | */ | 175 | */ |
| 177 | struct mmc_slot { | 176 | struct mmc_slot { |
| 178 | int cd_irq; | 177 | int cd_irq; |
| 179 | struct mutex lock; | ||
| 180 | void *handler_priv; | 178 | void *handler_priv; |
| 181 | }; | 179 | }; |
| 182 | 180 | ||
