Commit 842f4bdd authored by Adrian Hunter's avatar Adrian Hunter Committed by Chris Ball

mmc: slot-gpio: Record GPIO descriptors instead of GPIO numbers

In preparation for adding a descriptor-based CD GPIO API, switch from
recording GPIO numbers to recording GPIO descriptors.
Signed-off-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
Tested-by: default avatarJaehoon Chung <jh80.chung@samsung.com>
Signed-off-by: default avatarChris Ball <chris@printf.net>
parent 2b5cc851
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include <linux/err.h> #include <linux/err.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/gpio/consumer.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/jiffies.h> #include <linux/jiffies.h>
#include <linux/mmc/host.h> #include <linux/mmc/host.h>
...@@ -18,8 +19,10 @@ ...@@ -18,8 +19,10 @@
#include <linux/slab.h> #include <linux/slab.h>
struct mmc_gpio { struct mmc_gpio {
int ro_gpio; struct gpio_desc *ro_gpio;
int cd_gpio; struct gpio_desc *cd_gpio;
bool override_ro_active_level;
bool override_cd_active_level;
char *ro_label; char *ro_label;
char cd_label[0]; char cd_label[0];
}; };
...@@ -57,8 +60,6 @@ static int mmc_gpio_alloc(struct mmc_host *host) ...@@ -57,8 +60,6 @@ static int mmc_gpio_alloc(struct mmc_host *host)
ctx->ro_label = ctx->cd_label + len; ctx->ro_label = ctx->cd_label + len;
snprintf(ctx->cd_label, len, "%s cd", dev_name(host->parent)); snprintf(ctx->cd_label, len, "%s cd", dev_name(host->parent));
snprintf(ctx->ro_label, len, "%s ro", dev_name(host->parent)); snprintf(ctx->ro_label, len, "%s ro", dev_name(host->parent));
ctx->cd_gpio = -EINVAL;
ctx->ro_gpio = -EINVAL;
host->slot.handler_priv = ctx; host->slot.handler_priv = ctx;
} }
} }
...@@ -72,11 +73,14 @@ int mmc_gpio_get_ro(struct mmc_host *host) ...@@ -72,11 +73,14 @@ int mmc_gpio_get_ro(struct mmc_host *host)
{ {
struct mmc_gpio *ctx = host->slot.handler_priv; struct mmc_gpio *ctx = host->slot.handler_priv;
if (!ctx || !gpio_is_valid(ctx->ro_gpio)) if (!ctx || !ctx->ro_gpio)
return -ENOSYS; return -ENOSYS;
return !gpio_get_value_cansleep(ctx->ro_gpio) ^ if (ctx->override_ro_active_level)
!!(host->caps2 & MMC_CAP2_RO_ACTIVE_HIGH); return !gpiod_get_raw_value_cansleep(ctx->ro_gpio) ^
!!(host->caps2 & MMC_CAP2_RO_ACTIVE_HIGH);
return gpiod_get_value_cansleep(ctx->ro_gpio);
} }
EXPORT_SYMBOL(mmc_gpio_get_ro); EXPORT_SYMBOL(mmc_gpio_get_ro);
...@@ -84,11 +88,14 @@ int mmc_gpio_get_cd(struct mmc_host *host) ...@@ -84,11 +88,14 @@ int mmc_gpio_get_cd(struct mmc_host *host)
{ {
struct mmc_gpio *ctx = host->slot.handler_priv; struct mmc_gpio *ctx = host->slot.handler_priv;
if (!ctx || !gpio_is_valid(ctx->cd_gpio)) if (!ctx || !ctx->cd_gpio)
return -ENOSYS; return -ENOSYS;
return !gpio_get_value_cansleep(ctx->cd_gpio) ^ if (ctx->override_cd_active_level)
!!(host->caps2 & MMC_CAP2_CD_ACTIVE_HIGH); return !gpiod_get_raw_value_cansleep(ctx->cd_gpio) ^
!!(host->caps2 & MMC_CAP2_CD_ACTIVE_HIGH);
return gpiod_get_value_cansleep(ctx->cd_gpio);
} }
EXPORT_SYMBOL(mmc_gpio_get_cd); EXPORT_SYMBOL(mmc_gpio_get_cd);
...@@ -125,7 +132,8 @@ int mmc_gpio_request_ro(struct mmc_host *host, unsigned int gpio) ...@@ -125,7 +132,8 @@ int mmc_gpio_request_ro(struct mmc_host *host, unsigned int gpio)
if (ret < 0) if (ret < 0)
return ret; return ret;
ctx->ro_gpio = gpio; ctx->override_ro_active_level = true;
ctx->ro_gpio = gpio_to_desc(gpio);
return 0; return 0;
} }
...@@ -201,7 +209,8 @@ int mmc_gpio_request_cd(struct mmc_host *host, unsigned int gpio, ...@@ -201,7 +209,8 @@ int mmc_gpio_request_cd(struct mmc_host *host, unsigned int gpio,
if (irq < 0) if (irq < 0)
host->caps |= MMC_CAP_NEEDS_POLL; host->caps |= MMC_CAP_NEEDS_POLL;
ctx->cd_gpio = gpio; ctx->override_cd_active_level = true;
ctx->cd_gpio = gpio_to_desc(gpio);
return 0; return 0;
} }
...@@ -219,11 +228,11 @@ void mmc_gpio_free_ro(struct mmc_host *host) ...@@ -219,11 +228,11 @@ void mmc_gpio_free_ro(struct mmc_host *host)
struct mmc_gpio *ctx = host->slot.handler_priv; struct mmc_gpio *ctx = host->slot.handler_priv;
int gpio; int gpio;
if (!ctx || !gpio_is_valid(ctx->ro_gpio)) if (!ctx || !ctx->ro_gpio)
return; return;
gpio = ctx->ro_gpio; gpio = desc_to_gpio(ctx->ro_gpio);
ctx->ro_gpio = -EINVAL; ctx->ro_gpio = NULL;
devm_gpio_free(&host->class_dev, gpio); devm_gpio_free(&host->class_dev, gpio);
} }
...@@ -241,7 +250,7 @@ void mmc_gpio_free_cd(struct mmc_host *host) ...@@ -241,7 +250,7 @@ void mmc_gpio_free_cd(struct mmc_host *host)
struct mmc_gpio *ctx = host->slot.handler_priv; struct mmc_gpio *ctx = host->slot.handler_priv;
int gpio; int gpio;
if (!ctx || !gpio_is_valid(ctx->cd_gpio)) if (!ctx || !ctx->cd_gpio)
return; return;
if (host->slot.cd_irq >= 0) { if (host->slot.cd_irq >= 0) {
...@@ -249,8 +258,8 @@ void mmc_gpio_free_cd(struct mmc_host *host) ...@@ -249,8 +258,8 @@ void mmc_gpio_free_cd(struct mmc_host *host)
host->slot.cd_irq = -EINVAL; host->slot.cd_irq = -EINVAL;
} }
gpio = ctx->cd_gpio; gpio = desc_to_gpio(ctx->cd_gpio);
ctx->cd_gpio = -EINVAL; ctx->cd_gpio = NULL;
devm_gpio_free(&host->class_dev, gpio); devm_gpio_free(&host->class_dev, gpio);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment