From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jaehoon Chung Subject: Re: [PATCH 1/6] mmc: slot-gpio: Record GPIO descriptors instead of GPIO numbers Date: Thu, 13 Mar 2014 22:39:06 +0900 Message-ID: <5321B4FA.6000305@samsung.com> References: <1394456564-13783-1-git-send-email-adrian.hunter@intel.com> <1394456564-13783-2-git-send-email-adrian.hunter@intel.com> <5321AC0A.5090203@samsung.com> <5321B3BE.7090004@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Return-path: Received: from mailout2.samsung.com ([203.254.224.25]:19633 "EHLO mailout2.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753432AbaCMNjD (ORCPT ); Thu, 13 Mar 2014 09:39:03 -0400 Received: from epcpsbgr2.samsung.com (u142.gpu120.samsung.co.kr [203.254.230.142]) by mailout2.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N2D0010ZN90HY00@mailout2.samsung.com> for linux-mmc@vger.kernel.org; Thu, 13 Mar 2014 22:39:01 +0900 (KST) In-reply-to: <5321B3BE.7090004@intel.com> Sender: linux-mmc-owner@vger.kernel.org List-Id: linux-mmc@vger.kernel.org To: Adrian Hunter , Jaehoon Chung , Chris Ball Cc: linux-mmc , Linus Walleij , Alexandre Courbot , Guennadi Liakhovetski 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 >>> --- >>> 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 >>> #include >>> +#include >>> #include >>> #include >>> #include >>> @@ -18,8 +19,10 @@ >>> #include >>> >>> 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@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html >