Message ID | 20221109043845.16617-1-balamanikandan.gunasundar@microchip.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | mmc: atmel-mci: Convert to gpio descriptors | expand |
+ Linus W On Wed, 9 Nov 2022 at 05:39, Balamanikandan Gunasundar <balamanikandan.gunasundar@microchip.com> wrote: > > Replace the legacy GPIO APIs with gpio descriptor consumer interface. > > To maintain backward compatibility, we rely on the "cd-inverted" > property to manage the invertion flag instead of GPIO property. > > Signed-off-by: Balamanikandan Gunasundar <balamanikandan.gunasundar@microchip.com> I added Linus W, to get some feedback from the expert in this area. Kind regards Uffe > --- > drivers/mmc/host/atmel-mci.c | 79 ++++++++++++++++++------------------ > include/linux/atmel-mci.h | 4 +- > 2 files changed, 41 insertions(+), 42 deletions(-) > > diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c > index 67b2cd166e56..1df90966e104 100644 > --- a/drivers/mmc/host/atmel-mci.c > +++ b/drivers/mmc/host/atmel-mci.c > @@ -19,7 +19,8 @@ > #include <linux/module.h> > #include <linux/of.h> > #include <linux/of_device.h> > -#include <linux/of_gpio.h> > +#include <linux/irq.h> > +#include <linux/gpio/consumer.h> > #include <linux/platform_device.h> > #include <linux/scatterlist.h> > #include <linux/seq_file.h> > @@ -389,8 +390,8 @@ struct atmel_mci_slot { > #define ATMCI_CARD_NEED_INIT 1 > #define ATMCI_SHUTDOWN 2 > > - int detect_pin; > - int wp_pin; > + struct gpio_desc *detect_pin; > + struct gpio_desc *wp_pin; > bool detect_is_active_high; > > struct timer_list detect_timer; > @@ -638,7 +639,11 @@ atmci_of_init(struct platform_device *pdev) > pdata->slot[slot_id].bus_width = 1; > > pdata->slot[slot_id].detect_pin = > - of_get_named_gpio(cnp, "cd-gpios", 0); > + devm_gpiod_get_from_of_node(&pdev->dev, cnp, > + "cd-gpios", > + 0, GPIOD_IN, "cd-gpios"); > + if (IS_ERR(pdata->slot[slot_id].detect_pin)) > + pdata->slot[slot_id].detect_pin = NULL; > > pdata->slot[slot_id].detect_is_active_high = > of_property_read_bool(cnp, "cd-inverted"); > @@ -647,7 +652,11 @@ atmci_of_init(struct platform_device *pdev) > of_property_read_bool(cnp, "non-removable"); > > pdata->slot[slot_id].wp_pin = > - of_get_named_gpio(cnp, "wp-gpios", 0); > + devm_gpiod_get_from_of_node(&pdev->dev, cnp, > + "wp-gpios", > + 0, GPIOD_IN, "wp-gpios"); > + if (IS_ERR(pdata->slot[slot_id].wp_pin)) > + pdata->slot[slot_id].wp_pin = NULL; > } > > return pdata; > @@ -1511,8 +1520,8 @@ static int atmci_get_ro(struct mmc_host *mmc) > int read_only = -ENOSYS; > struct atmel_mci_slot *slot = mmc_priv(mmc); > > - if (gpio_is_valid(slot->wp_pin)) { > - read_only = gpio_get_value(slot->wp_pin); > + if (slot->wp_pin) { > + read_only = gpiod_get_value(slot->wp_pin); > dev_dbg(&mmc->class_dev, "card is %s\n", > read_only ? "read-only" : "read-write"); > } > @@ -1525,8 +1534,8 @@ static int atmci_get_cd(struct mmc_host *mmc) > int present = -ENOSYS; > struct atmel_mci_slot *slot = mmc_priv(mmc); > > - if (gpio_is_valid(slot->detect_pin)) { > - present = !(gpio_get_value(slot->detect_pin) ^ > + if (slot->detect_pin) { > + present = !(gpiod_get_raw_value(slot->detect_pin) ^ > slot->detect_is_active_high); > dev_dbg(&mmc->class_dev, "card is %spresent\n", > present ? "" : "not "); > @@ -1639,8 +1648,8 @@ static void atmci_detect_change(struct timer_list *t) > if (test_bit(ATMCI_SHUTDOWN, &slot->flags)) > return; > > - enable_irq(gpio_to_irq(slot->detect_pin)); > - present = !(gpio_get_value(slot->detect_pin) ^ > + enable_irq(gpiod_to_irq(slot->detect_pin)); > + present = !(gpiod_get_raw_value(slot->detect_pin) ^ > slot->detect_is_active_high); > present_old = test_bit(ATMCI_CARD_PRESENT, &slot->flags); > > @@ -2241,9 +2250,9 @@ static int atmci_init_slot(struct atmel_mci *host, > dev_dbg(&mmc->class_dev, > "slot[%u]: bus_width=%u, detect_pin=%d, " > "detect_is_active_high=%s, wp_pin=%d\n", > - id, slot_data->bus_width, slot_data->detect_pin, > + id, slot_data->bus_width, desc_to_gpio(slot_data->detect_pin), > slot_data->detect_is_active_high ? "true" : "false", > - slot_data->wp_pin); > + desc_to_gpio(slot_data->wp_pin)); > > mmc->ops = &atmci_ops; > mmc->f_min = DIV_ROUND_UP(host->bus_hz, 512); > @@ -2279,51 +2288,43 @@ static int atmci_init_slot(struct atmel_mci *host, > > /* Assume card is present initially */ > set_bit(ATMCI_CARD_PRESENT, &slot->flags); > - if (gpio_is_valid(slot->detect_pin)) { > - if (devm_gpio_request(&host->pdev->dev, slot->detect_pin, > - "mmc_detect")) { > - dev_dbg(&mmc->class_dev, "no detect pin available\n"); > - slot->detect_pin = -EBUSY; > - } else if (gpio_get_value(slot->detect_pin) ^ > - slot->detect_is_active_high) { > + if (slot->detect_pin) { > + if (gpiod_get_raw_value(slot->detect_pin) ^ > + slot->detect_is_active_high) { > clear_bit(ATMCI_CARD_PRESENT, &slot->flags); > } > + } else { > + dev_dbg(&mmc->class_dev, "no detect pin available\n"); > } > > - if (!gpio_is_valid(slot->detect_pin)) { > + if (!slot->detect_pin) { > if (slot_data->non_removable) > mmc->caps |= MMC_CAP_NONREMOVABLE; > else > mmc->caps |= MMC_CAP_NEEDS_POLL; > } > > - if (gpio_is_valid(slot->wp_pin)) { > - if (devm_gpio_request(&host->pdev->dev, slot->wp_pin, > - "mmc_wp")) { > - dev_dbg(&mmc->class_dev, "no WP pin available\n"); > - slot->wp_pin = -EBUSY; > - } > - } > + if (!slot->wp_pin) > + dev_dbg(&mmc->class_dev, "no WP pin available\n"); > > host->slot[id] = slot; > mmc_regulator_get_supply(mmc); > - mmc_pwrseq_alloc(slot->mmc); > mmc_add_host(mmc); > > - if (gpio_is_valid(slot->detect_pin)) { > + if (slot->detect_pin) { > int ret; > > timer_setup(&slot->detect_timer, atmci_detect_change, 0); > > - ret = request_irq(gpio_to_irq(slot->detect_pin), > - atmci_detect_interrupt, > - IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, > - "mmc-detect", slot); > + ret = request_irq(gpiod_to_irq(slot->detect_pin), > + atmci_detect_interrupt, > + IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, > + "mmc-detect", slot); > if (ret) { > dev_dbg(&mmc->class_dev, > "could not request IRQ %d for detect pin\n", > - gpio_to_irq(slot->detect_pin)); > - slot->detect_pin = -EBUSY; > + gpiod_to_irq(slot->detect_pin)); > + slot->detect_pin = NULL; > } > } > > @@ -2342,10 +2343,8 @@ static void atmci_cleanup_slot(struct atmel_mci_slot *slot, > > mmc_remove_host(slot->mmc); > > - if (gpio_is_valid(slot->detect_pin)) { > - int pin = slot->detect_pin; > - > - free_irq(gpio_to_irq(pin), slot); > + if (slot->detect_pin) { > + free_irq(gpiod_to_irq(slot->detect_pin), slot); > del_timer_sync(&slot->detect_timer); > } > > diff --git a/include/linux/atmel-mci.h b/include/linux/atmel-mci.h > index 1491af38cc6e..017e7d8f6126 100644 > --- a/include/linux/atmel-mci.h > +++ b/include/linux/atmel-mci.h > @@ -26,8 +26,8 @@ > */ > struct mci_slot_pdata { > unsigned int bus_width; > - int detect_pin; > - int wp_pin; > + struct gpio_desc *detect_pin; > + struct gpio_desc *wp_pin; > bool detect_is_active_high; > bool non_removable; > }; > -- > 2.25.1 >
On Wed, Nov 9, 2022 at 1:39 PM Ulf Hansson <ulf.hansson@linaro.org> wrote: > On Wed, 9 Nov 2022 at 05:39, Balamanikandan Gunasundar (...) > > --- a/drivers/mmc/host/atmel-mci.c > > +++ b/drivers/mmc/host/atmel-mci.c > > @@ -19,7 +19,8 @@ > > #include <linux/module.h> > > #include <linux/of.h> > > #include <linux/of_device.h> > > -#include <linux/of_gpio.h> > > +#include <linux/irq.h> > > +#include <linux/gpio/consumer.h> This is nice, but higher up the driver also #include <linux/gpio.h> so delete that line too, <linux/gpio/consumer.h> should be enough. > > - of_get_named_gpio(cnp, "cd-gpios", 0); > > + devm_gpiod_get_from_of_node(&pdev->dev, cnp, > > + "cd-gpios", > > + 0, GPIOD_IN, "cd-gpios"); (...) > > pdata->slot[slot_id].wp_pin = > > - of_get_named_gpio(cnp, "wp-gpios", 0); > > + devm_gpiod_get_from_of_node(&pdev->dev, cnp, > > + "wp-gpios", > > + 0, GPIOD_IN, "wp-gpios"); Hm. Dmitry is trying to get rid of of_get_named_gpio() I think. But I suppose we can migrate to fwnode later. This is at least better than before so go with this for now. Yours, Linus Walleij
On Wed, Nov 09, 2022 at 10:08:45AM +0530, Balamanikandan Gunasundar wrote:
> Replace the legacy GPIO APIs with gpio descriptor consumer interface.
I was wondering why you Cc: netdev and ATM. This clearly has nothing
to do with those lists.
You well foul of
M: Chas Williams <3chas3@gmail.com>
L: linux-atm-general@lists.sourceforge.net (moderated for non-subscribers)
L: netdev@vger.kernel.org
S: Maintained
W: http://linux-atm.sourceforge.net
F: drivers/atm/
F: include/linux/atm*
F: include/uapi/linux/atm*
Maybe these atm* should be more specific so they don't match atmel :-)
Andrew
On Wed, Nov 9, 2022, at 18:16, Andrew Lunn wrote: > On Wed, Nov 09, 2022 at 10:08:45AM +0530, Balamanikandan Gunasundar wrote: >> Replace the legacy GPIO APIs with gpio descriptor consumer interface. > > I was wondering why you Cc: netdev and ATM. This clearly has nothing > to do with those lists. > > You well foul of > > M: Chas Williams <3chas3@gmail.com> > L: linux-atm-general@lists.sourceforge.net (moderated for non-subscribers) > L: netdev@vger.kernel.org > S: Maintained > W: http://linux-atm.sourceforge.net > F: drivers/atm/ > F: include/linux/atm* > F: include/uapi/linux/atm* > > Maybe these atm* should be more specific so they don't match atmel :-) The uapi headers look unambiguous to me, for the three headers in include/linux/, only the atmdev.h is actually significant, while linux/atm.h and linux/atm_tcp.h could each be folded into the one C file that actually uses the contents. Arnd
On Thu, Nov 10, 2022, at 09:05, Arnd Bergmann wrote: > On Wed, Nov 9, 2022, at 18:16, Andrew Lunn wrote: >> On Wed, Nov 09, 2022 at 10:08:45AM +0530, Balamanikandan Gunasundar wrote: >>> Replace the legacy GPIO APIs with gpio descriptor consumer interface. >> >> I was wondering why you Cc: netdev and ATM. This clearly has nothing >> to do with those lists. >> >> You well foul of >> >> M: Chas Williams <3chas3@gmail.com> >> L: linux-atm-general@lists.sourceforge.net (moderated for non-subscribers) >> L: netdev@vger.kernel.org >> S: Maintained >> W: http://linux-atm.sourceforge.net >> F: drivers/atm/ >> F: include/linux/atm* >> F: include/uapi/linux/atm* >> >> Maybe these atm* should be more specific so they don't match atmel :-) > > The uapi headers look unambiguous to me, for the three headers in > include/linux/, only the atmdev.h is actually significant, while > linux/atm.h and linux/atm_tcp.h could each be folded into the one > C file that actually uses the contents. Actually the situation for the linux/atmel*.h headers is similar: most of them are only used in one file, and the linux/atmel-mci.h contents should just be moved into drivers/mmc/host/atmel-mci.c as part of Balamanikandan's patch, to allow further cleanups. linux/atmel-isc-media.h similarly can go into its drivers as a separate patch if desired. The linux/atmel-ssc.h could ideally be cleaned up to get moved into sound/soc/atmel/ along with drivers/misc/atmel-ssc.c. The atmel-scc driver is technically also used by sound/spi/at73c213.c, but that driver has been orphaned since 2014, with commit 2e591e7b3ac2 ("ARM: at91: remove at91sam9261/at91sam9g10 legacy board support"), as nobody ever added DT probing support to it. Arnd
Hi, On Wed, Nov 09, 2022 at 03:48:32PM +0100, Linus Walleij wrote: > On Wed, Nov 9, 2022 at 1:39 PM Ulf Hansson <ulf.hansson@linaro.org> wrote: > > On Wed, 9 Nov 2022 at 05:39, Balamanikandan Gunasundar > (...) > > > --- a/drivers/mmc/host/atmel-mci.c > > > +++ b/drivers/mmc/host/atmel-mci.c > > > @@ -19,7 +19,8 @@ > > > #include <linux/module.h> > > > #include <linux/of.h> > > > #include <linux/of_device.h> > > > -#include <linux/of_gpio.h> > > > +#include <linux/irq.h> > > > +#include <linux/gpio/consumer.h> > > This is nice, but higher up the driver also #include <linux/gpio.h> > so delete that line too, <linux/gpio/consumer.h> should be enough. > > > > - of_get_named_gpio(cnp, "cd-gpios", 0); > > > + devm_gpiod_get_from_of_node(&pdev->dev, cnp, > > > + "cd-gpios", > > > + 0, GPIOD_IN, "cd-gpios"); > (...) > > > pdata->slot[slot_id].wp_pin = > > > - of_get_named_gpio(cnp, "wp-gpios", 0); > > > + devm_gpiod_get_from_of_node(&pdev->dev, cnp, > > > + "wp-gpios", > > > + 0, GPIOD_IN, "wp-gpios"); > > Hm. Dmitry is trying to get rid of of_get_named_gpio() I think. > > But I suppose we can migrate to fwnode later. I'd much rather we changed this right away to devm_fwnode_gpiod_get(&pdev->dev, of_fwnode_handle(cnp), "wp", GPIOD_IN, "wp-gpios"); and not added new users of devm_gpiod_get_from_of_node() which is there only 2 left. Thanks!
Hi Balamanikandan, On Wed, Nov 09, 2022 at 10:08:45AM +0530, Balamanikandan Gunasundar wrote: > Replace the legacy GPIO APIs with gpio descriptor consumer interface. > > To maintain backward compatibility, we rely on the "cd-inverted" > property to manage the invertion flag instead of GPIO property. > > Signed-off-by: Balamanikandan Gunasundar <balamanikandan.gunasundar@microchip.com> > --- > drivers/mmc/host/atmel-mci.c | 79 ++++++++++++++++++------------------ > include/linux/atmel-mci.h | 4 +- > 2 files changed, 41 insertions(+), 42 deletions(-) > > diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c > index 67b2cd166e56..1df90966e104 100644 > --- a/drivers/mmc/host/atmel-mci.c > +++ b/drivers/mmc/host/atmel-mci.c > @@ -19,7 +19,8 @@ > #include <linux/module.h> > #include <linux/of.h> > #include <linux/of_device.h> > -#include <linux/of_gpio.h> > +#include <linux/irq.h> > +#include <linux/gpio/consumer.h> > #include <linux/platform_device.h> > #include <linux/scatterlist.h> > #include <linux/seq_file.h> > @@ -389,8 +390,8 @@ struct atmel_mci_slot { > #define ATMCI_CARD_NEED_INIT 1 > #define ATMCI_SHUTDOWN 2 > > - int detect_pin; > - int wp_pin; > + struct gpio_desc *detect_pin; > + struct gpio_desc *wp_pin; > bool detect_is_active_high; > > struct timer_list detect_timer; > @@ -638,7 +639,11 @@ atmci_of_init(struct platform_device *pdev) > pdata->slot[slot_id].bus_width = 1; > > pdata->slot[slot_id].detect_pin = > - of_get_named_gpio(cnp, "cd-gpios", 0); > + devm_gpiod_get_from_of_node(&pdev->dev, cnp, > + "cd-gpios", > + 0, GPIOD_IN, "cd-gpios"); As I mentioned in another email, please use devm_fwnode_gpiod_get() instead of devm_gpiod_get_from_of_node() which is going away. > + if (IS_ERR(pdata->slot[slot_id].detect_pin)) > + pdata->slot[slot_id].detect_pin = NULL; I think it would be much better if we had proper error handling and did something like: err = PTR_ERR_OR_ZERO(pdata->slot[slot_id].detect_pin); if (err) { if (err != -ENOENT) return ERR_PTR(err); pdata->slot[slot_id].detect_pin = NULL; } This will help with proper deferral handling. > > pdata->slot[slot_id].detect_is_active_high = > of_property_read_bool(cnp, "cd-inverted"); Instead of doing gpiod_set_value_raw() below I would recommend handling it here via gpiod_is_active_low() and gpiod_toggle_active_low() and removing the flag from atmel_mci_slot structure. > @@ -647,7 +652,11 @@ atmci_of_init(struct platform_device *pdev) > of_property_read_bool(cnp, "non-removable"); > > pdata->slot[slot_id].wp_pin = > - of_get_named_gpio(cnp, "wp-gpios", 0); > + devm_gpiod_get_from_of_node(&pdev->dev, cnp, > + "wp-gpios", > + 0, GPIOD_IN, "wp-gpios"); > + if (IS_ERR(pdata->slot[slot_id].wp_pin)) > + pdata->slot[slot_id].wp_pin = NULL; > } > > return pdata; > @@ -1511,8 +1520,8 @@ static int atmci_get_ro(struct mmc_host *mmc) > int read_only = -ENOSYS; > struct atmel_mci_slot *slot = mmc_priv(mmc); > > - if (gpio_is_valid(slot->wp_pin)) { > - read_only = gpio_get_value(slot->wp_pin); > + if (slot->wp_pin) { > + read_only = gpiod_get_value(slot->wp_pin); Consider using "cansleep" variants. Thanks.
diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c index 67b2cd166e56..1df90966e104 100644 --- a/drivers/mmc/host/atmel-mci.c +++ b/drivers/mmc/host/atmel-mci.c @@ -19,7 +19,8 @@ #include <linux/module.h> #include <linux/of.h> #include <linux/of_device.h> -#include <linux/of_gpio.h> +#include <linux/irq.h> +#include <linux/gpio/consumer.h> #include <linux/platform_device.h> #include <linux/scatterlist.h> #include <linux/seq_file.h> @@ -389,8 +390,8 @@ struct atmel_mci_slot { #define ATMCI_CARD_NEED_INIT 1 #define ATMCI_SHUTDOWN 2 - int detect_pin; - int wp_pin; + struct gpio_desc *detect_pin; + struct gpio_desc *wp_pin; bool detect_is_active_high; struct timer_list detect_timer; @@ -638,7 +639,11 @@ atmci_of_init(struct platform_device *pdev) pdata->slot[slot_id].bus_width = 1; pdata->slot[slot_id].detect_pin = - of_get_named_gpio(cnp, "cd-gpios", 0); + devm_gpiod_get_from_of_node(&pdev->dev, cnp, + "cd-gpios", + 0, GPIOD_IN, "cd-gpios"); + if (IS_ERR(pdata->slot[slot_id].detect_pin)) + pdata->slot[slot_id].detect_pin = NULL; pdata->slot[slot_id].detect_is_active_high = of_property_read_bool(cnp, "cd-inverted"); @@ -647,7 +652,11 @@ atmci_of_init(struct platform_device *pdev) of_property_read_bool(cnp, "non-removable"); pdata->slot[slot_id].wp_pin = - of_get_named_gpio(cnp, "wp-gpios", 0); + devm_gpiod_get_from_of_node(&pdev->dev, cnp, + "wp-gpios", + 0, GPIOD_IN, "wp-gpios"); + if (IS_ERR(pdata->slot[slot_id].wp_pin)) + pdata->slot[slot_id].wp_pin = NULL; } return pdata; @@ -1511,8 +1520,8 @@ static int atmci_get_ro(struct mmc_host *mmc) int read_only = -ENOSYS; struct atmel_mci_slot *slot = mmc_priv(mmc); - if (gpio_is_valid(slot->wp_pin)) { - read_only = gpio_get_value(slot->wp_pin); + if (slot->wp_pin) { + read_only = gpiod_get_value(slot->wp_pin); dev_dbg(&mmc->class_dev, "card is %s\n", read_only ? "read-only" : "read-write"); } @@ -1525,8 +1534,8 @@ static int atmci_get_cd(struct mmc_host *mmc) int present = -ENOSYS; struct atmel_mci_slot *slot = mmc_priv(mmc); - if (gpio_is_valid(slot->detect_pin)) { - present = !(gpio_get_value(slot->detect_pin) ^ + if (slot->detect_pin) { + present = !(gpiod_get_raw_value(slot->detect_pin) ^ slot->detect_is_active_high); dev_dbg(&mmc->class_dev, "card is %spresent\n", present ? "" : "not "); @@ -1639,8 +1648,8 @@ static void atmci_detect_change(struct timer_list *t) if (test_bit(ATMCI_SHUTDOWN, &slot->flags)) return; - enable_irq(gpio_to_irq(slot->detect_pin)); - present = !(gpio_get_value(slot->detect_pin) ^ + enable_irq(gpiod_to_irq(slot->detect_pin)); + present = !(gpiod_get_raw_value(slot->detect_pin) ^ slot->detect_is_active_high); present_old = test_bit(ATMCI_CARD_PRESENT, &slot->flags); @@ -2241,9 +2250,9 @@ static int atmci_init_slot(struct atmel_mci *host, dev_dbg(&mmc->class_dev, "slot[%u]: bus_width=%u, detect_pin=%d, " "detect_is_active_high=%s, wp_pin=%d\n", - id, slot_data->bus_width, slot_data->detect_pin, + id, slot_data->bus_width, desc_to_gpio(slot_data->detect_pin), slot_data->detect_is_active_high ? "true" : "false", - slot_data->wp_pin); + desc_to_gpio(slot_data->wp_pin)); mmc->ops = &atmci_ops; mmc->f_min = DIV_ROUND_UP(host->bus_hz, 512); @@ -2279,51 +2288,43 @@ static int atmci_init_slot(struct atmel_mci *host, /* Assume card is present initially */ set_bit(ATMCI_CARD_PRESENT, &slot->flags); - if (gpio_is_valid(slot->detect_pin)) { - if (devm_gpio_request(&host->pdev->dev, slot->detect_pin, - "mmc_detect")) { - dev_dbg(&mmc->class_dev, "no detect pin available\n"); - slot->detect_pin = -EBUSY; - } else if (gpio_get_value(slot->detect_pin) ^ - slot->detect_is_active_high) { + if (slot->detect_pin) { + if (gpiod_get_raw_value(slot->detect_pin) ^ + slot->detect_is_active_high) { clear_bit(ATMCI_CARD_PRESENT, &slot->flags); } + } else { + dev_dbg(&mmc->class_dev, "no detect pin available\n"); } - if (!gpio_is_valid(slot->detect_pin)) { + if (!slot->detect_pin) { if (slot_data->non_removable) mmc->caps |= MMC_CAP_NONREMOVABLE; else mmc->caps |= MMC_CAP_NEEDS_POLL; } - if (gpio_is_valid(slot->wp_pin)) { - if (devm_gpio_request(&host->pdev->dev, slot->wp_pin, - "mmc_wp")) { - dev_dbg(&mmc->class_dev, "no WP pin available\n"); - slot->wp_pin = -EBUSY; - } - } + if (!slot->wp_pin) + dev_dbg(&mmc->class_dev, "no WP pin available\n"); host->slot[id] = slot; mmc_regulator_get_supply(mmc); - mmc_pwrseq_alloc(slot->mmc); mmc_add_host(mmc); - if (gpio_is_valid(slot->detect_pin)) { + if (slot->detect_pin) { int ret; timer_setup(&slot->detect_timer, atmci_detect_change, 0); - ret = request_irq(gpio_to_irq(slot->detect_pin), - atmci_detect_interrupt, - IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, - "mmc-detect", slot); + ret = request_irq(gpiod_to_irq(slot->detect_pin), + atmci_detect_interrupt, + IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, + "mmc-detect", slot); if (ret) { dev_dbg(&mmc->class_dev, "could not request IRQ %d for detect pin\n", - gpio_to_irq(slot->detect_pin)); - slot->detect_pin = -EBUSY; + gpiod_to_irq(slot->detect_pin)); + slot->detect_pin = NULL; } } @@ -2342,10 +2343,8 @@ static void atmci_cleanup_slot(struct atmel_mci_slot *slot, mmc_remove_host(slot->mmc); - if (gpio_is_valid(slot->detect_pin)) { - int pin = slot->detect_pin; - - free_irq(gpio_to_irq(pin), slot); + if (slot->detect_pin) { + free_irq(gpiod_to_irq(slot->detect_pin), slot); del_timer_sync(&slot->detect_timer); } diff --git a/include/linux/atmel-mci.h b/include/linux/atmel-mci.h index 1491af38cc6e..017e7d8f6126 100644 --- a/include/linux/atmel-mci.h +++ b/include/linux/atmel-mci.h @@ -26,8 +26,8 @@ */ struct mci_slot_pdata { unsigned int bus_width; - int detect_pin; - int wp_pin; + struct gpio_desc *detect_pin; + struct gpio_desc *wp_pin; bool detect_is_active_high; bool non_removable; };
Replace the legacy GPIO APIs with gpio descriptor consumer interface. To maintain backward compatibility, we rely on the "cd-inverted" property to manage the invertion flag instead of GPIO property. Signed-off-by: Balamanikandan Gunasundar <balamanikandan.gunasundar@microchip.com> --- drivers/mmc/host/atmel-mci.c | 79 ++++++++++++++++++------------------ include/linux/atmel-mci.h | 4 +- 2 files changed, 41 insertions(+), 42 deletions(-)