Hi, Adrian. Thanks for kindly explanation. Best Regards, Jaehoon Chung On 03/13/2014 10:33 PM, Adrian Hunter wrote: > On 13.03.2014 15:00, Jaehoon Chung wrote: >> Dear Adrain. >> >> I have tested with your patch-set related slot-gpio. >> It's working fine. And looks good to me. >> >> I have a question. what's override_cd/ro_active_level? >> I didn't fully understand this value. Could you explain to me, plz? > > The gpio descriptor records whether the gpio is active high or active low. > When using gpiod_get_value_cansleep() the value is inverted on that basis. > When using gpiod_get_raw_value_cansleep() the value is not inverted. > > The legacy GPIO API did not record active low/high. So then we use > gpiod_get_raw_value_cansleep(). The new API should be able to use > gpiod_get_value_cansleep(). > > In addition, for the device that I have the active high/low > information passed by ACPI is wrong anyway, so I also have to use the > override flag. > > >> >> Best Regards, >> Jaehoon Chung >> >> On 03/10/2014 10:02 PM, Adrian Hunter wrote: >>> In preparation for adding a descriptor-based CD GPIO >>> API, switch from recording GPIO numbers to recording >>> GPIO descriptors. >>> >>> Signed-off-by: Adrian Hunter <adrian.hunter@xxxxxxxxx> >>> --- >>> drivers/mmc/core/slot-gpio.c | 45 ++++++++++++++++++++++++++------------------ >>> 1 file changed, 27 insertions(+), 18 deletions(-) >>> >>> diff --git a/drivers/mmc/core/slot-gpio.c b/drivers/mmc/core/slot-gpio.c >>> index 46596b71..86547a2 100644 >>> --- a/drivers/mmc/core/slot-gpio.c >>> +++ b/drivers/mmc/core/slot-gpio.c >>> @@ -10,6 +10,7 @@ >>> >>> #include <linux/err.h> >>> #include <linux/gpio.h> >>> +#include <linux/gpio/consumer.h> >>> #include <linux/interrupt.h> >>> #include <linux/jiffies.h> >>> #include <linux/mmc/host.h> >>> @@ -18,8 +19,10 @@ >>> #include <linux/slab.h> >>> >>> struct mmc_gpio { >>> - int ro_gpio; >>> - int cd_gpio; >>> + struct gpio_desc *ro_gpio; >>> + struct gpio_desc *cd_gpio; >>> + bool override_ro_active_level; >>> + bool override_cd_active_level; >>> char *ro_label; >>> char cd_label[0]; >>> }; >>> @@ -57,8 +60,6 @@ static int mmc_gpio_alloc(struct mmc_host *host) >>> 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)); >>> - ctx->cd_gpio = -EINVAL; >>> - ctx->ro_gpio = -EINVAL; >>> host->slot.handler_priv = ctx; >>> } >>> } >>> @@ -72,11 +73,14 @@ int mmc_gpio_get_ro(struct mmc_host *host) >>> { >>> struct mmc_gpio *ctx = host->slot.handler_priv; >>> >>> - if (!ctx || !gpio_is_valid(ctx->ro_gpio)) >>> + if (!ctx || !ctx->ro_gpio) >>> return -ENOSYS; >>> >>> - return !gpio_get_value_cansleep(ctx->ro_gpio) ^ >>> - !!(host->caps2 & MMC_CAP2_RO_ACTIVE_HIGH); >>> + if (ctx->override_ro_active_level) >>> + 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); >>> >>> @@ -84,11 +88,14 @@ int mmc_gpio_get_cd(struct mmc_host *host) >>> { >>> struct mmc_gpio *ctx = host->slot.handler_priv; >>> >>> - if (!ctx || !gpio_is_valid(ctx->cd_gpio)) >>> + if (!ctx || !ctx->cd_gpio) >>> return -ENOSYS; >>> >>> - return !gpio_get_value_cansleep(ctx->cd_gpio) ^ >>> - !!(host->caps2 & MMC_CAP2_CD_ACTIVE_HIGH); >>> + if (ctx->override_cd_active_level) >>> + 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); >>> >>> @@ -125,7 +132,8 @@ int mmc_gpio_request_ro(struct mmc_host *host, unsigned int gpio) >>> if (ret < 0) >>> return ret; >>> >>> - ctx->ro_gpio = gpio; >>> + ctx->override_ro_active_level = true; >>> + ctx->ro_gpio = gpio_to_desc(gpio); >>> >>> return 0; >>> } >>> @@ -201,7 +209,8 @@ int mmc_gpio_request_cd(struct mmc_host *host, unsigned int gpio, >>> if (irq < 0) >>> 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; >>> } >>> @@ -219,11 +228,11 @@ void mmc_gpio_free_ro(struct mmc_host *host) >>> struct mmc_gpio *ctx = host->slot.handler_priv; >>> int gpio; >>> >>> - if (!ctx || !gpio_is_valid(ctx->ro_gpio)) >>> + if (!ctx || !ctx->ro_gpio) >>> return; >>> >>> - gpio = ctx->ro_gpio; >>> - ctx->ro_gpio = -EINVAL; >>> + gpio = desc_to_gpio(ctx->ro_gpio); >>> + ctx->ro_gpio = NULL; >>> >>> devm_gpio_free(&host->class_dev, gpio); >>> } >>> @@ -241,7 +250,7 @@ void mmc_gpio_free_cd(struct mmc_host *host) >>> struct mmc_gpio *ctx = host->slot.handler_priv; >>> int gpio; >>> >>> - if (!ctx || !gpio_is_valid(ctx->cd_gpio)) >>> + if (!ctx || !ctx->cd_gpio) >>> return; >>> >>> if (host->slot.cd_irq >= 0) { >>> @@ -249,8 +258,8 @@ void mmc_gpio_free_cd(struct mmc_host *host) >>> host->slot.cd_irq = -EINVAL; >>> } >>> >>> - gpio = ctx->cd_gpio; >>> - ctx->cd_gpio = -EINVAL; >>> + gpio = desc_to_gpio(ctx->cd_gpio); >>> + ctx->cd_gpio = NULL; >>> >>> devm_gpio_free(&host->class_dev, gpio); >>> } >>> >> >> >> > > -- > 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 > -- 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