From: Jaehoon Chung <jh80.chung@samsung.com>
To: Adrian Hunter <adrian.hunter@intel.com>,
Jaehoon Chung <jh80.chung@samsung.com>,
Chris Ball <chris@printf.net>
Cc: linux-mmc <linux-mmc@vger.kernel.org>,
Linus Walleij <linus.walleij@linaro.org>,
Alexandre Courbot <gnurou@gmail.com>,
Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Subject: Re: [PATCH 1/6] mmc: slot-gpio: Record GPIO descriptors instead of GPIO numbers
Date: Thu, 13 Mar 2014 22:39:06 +0900 [thread overview]
Message-ID: <5321B4FA.6000305@samsung.com> (raw)
In-Reply-To: <5321B3BE.7090004@intel.com>
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@intel.com>
>>> ---
>>> 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@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
next prev parent reply other threads:[~2014-03-13 13:39 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-03-10 13:02 [PATCH 0/6] mmc: sdhci-acpi: Fix broken card detect for ACPI HID 80860F14 Adrian Hunter
2014-03-10 13:02 ` [PATCH 1/6] mmc: slot-gpio: Record GPIO descriptors instead of GPIO numbers Adrian Hunter
2014-03-13 13:00 ` Jaehoon Chung
2014-03-13 13:33 ` Adrian Hunter
2014-03-13 13:39 ` Jaehoon Chung [this message]
2014-03-14 1:25 ` Jaehoon Chung
2014-03-14 9:06 ` Linus Walleij
2014-03-14 10:23 ` Adrian Hunter
2014-03-14 10:28 ` Adrian Hunter
2014-03-10 13:02 ` [PATCH 2/6] mmc: slot-gpio: Split out CD IRQ request into a separate function Adrian Hunter
2014-03-10 13:02 ` [PATCH 3/6] mmc: slot-gpio: Add GPIO descriptor based CD GPIO API Adrian Hunter
2014-03-14 9:07 ` Linus Walleij
2014-03-10 13:02 ` [PATCH 4/6] mmc: sdhci-acpi: Fix broken card detect for ACPI HID 80860F14 Adrian Hunter
2014-03-10 13:02 ` [PATCH 5/6] mmc: sdhci-acpi: Add device id 80860F16 Adrian Hunter
2014-03-10 13:02 ` [PATCH 6/6] mmc: sdhci: Allow for irq being shared Adrian Hunter
2014-03-11 8:09 ` [PATCH V2 " Adrian Hunter
2014-03-17 9:14 ` [PATCH 0/6] mmc: sdhci-acpi: Fix broken card detect for ACPI HID 80860F14 Adrian Hunter
2014-03-17 13:14 ` Chris Ball
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5321B4FA.6000305@samsung.com \
--to=jh80.chung@samsung.com \
--cc=adrian.hunter@intel.com \
--cc=chris@printf.net \
--cc=g.liakhovetski@gmx.de \
--cc=gnurou@gmail.com \
--cc=linus.walleij@linaro.org \
--cc=linux-mmc@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.