[PATCH] pcmcia: at91_cf: switch to using gpiod API

From: Dmitry Torokhov
Date: Sat Sep 24 2022 - 02:04:47 EST


This patch switches the driver to use newer gpiod API instead of legacy
gpio API. This moves us closer to the goal of stopping exporting
OF-specific APIs of gpiolib.

While at it, stop using module-global for regmap.

Signed-off-by: Dmitry Torokhov <dmitry.torokhov@xxxxxxxxx>
---
drivers/pcmcia/at91_cf.c | 116 ++++++++++++++++++++-------------------
1 file changed, 60 insertions(+), 56 deletions(-)

diff --git a/drivers/pcmcia/at91_cf.c b/drivers/pcmcia/at91_cf.c
index 92df2c2c5d07..4ae790d00fd6 100644
--- a/drivers/pcmcia/at91_cf.c
+++ b/drivers/pcmcia/at91_cf.c
@@ -5,6 +5,7 @@
* Copyright (C) 2005 David Brownell
*/

+#include <linux/err.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/platform_device.h>
@@ -12,14 +13,13 @@
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/slab.h>
-#include <linux/gpio.h>
+#include <linux/gpio/consumer.h>
#include <linux/io.h>
#include <linux/sizes.h>
#include <linux/mfd/syscon.h>
#include <linux/mfd/syscon/atmel-mc.h>
#include <linux/of.h>
#include <linux/of_device.h>
-#include <linux/of_gpio.h>
#include <linux/pci.h>
#include <linux/regmap.h>

@@ -36,18 +36,17 @@
#define CF_MEM_PHYS (0x017ff800)

struct at91_cf_data {
- int irq_pin; /* I/O IRQ */
- int det_pin; /* Card detect */
- int vcc_pin; /* power switching */
- int rst_pin; /* card reset */
+ struct gpio_desc *irq_pin; /* I/O IRQ */
+ struct gpio_desc *det_pin; /* Card detect */
+ struct gpio_desc *vcc_pin; /* power switching */
+ struct gpio_desc *rst_pin; /* card reset */
+ struct regmap *mc;
u8 chipselect; /* EBI Chip Select number */
u8 flags;
#define AT91_CF_TRUE_IDE 0x01
#define AT91_IDE_SWAP_A0_A2 0x02
};

-struct regmap *mc;
-
/*--------------------------------------------------------------------------*/

struct at91_cf_socket {
@@ -63,7 +62,7 @@ struct at91_cf_socket {

static inline int at91_cf_present(struct at91_cf_socket *cf)
{
- return !gpio_get_value(cf->board->det_pin);
+ return gpiod_get_value(cf->board->det_pin);
}

/*--------------------------------------------------------------------------*/
@@ -77,7 +76,7 @@ static irqreturn_t at91_cf_irq(int irq, void *_cf)
{
struct at91_cf_socket *cf = _cf;

- if (irq == gpio_to_irq(cf->board->det_pin)) {
+ if (irq == gpiod_to_irq(cf->board->det_pin)) {
unsigned present = at91_cf_present(cf);

/* kick pccard as needed */
@@ -103,16 +102,15 @@ static int at91_cf_get_status(struct pcmcia_socket *s, u_int *sp)

/* NOTE: CF is always 3VCARD */
if (at91_cf_present(cf)) {
- int rdy = gpio_is_valid(cf->board->irq_pin); /* RDY/nIRQ */
- int vcc = gpio_is_valid(cf->board->vcc_pin);
-
*sp = SS_DETECT | SS_3VCARD;
- if (!rdy || gpio_get_value(cf->board->irq_pin))
+ /* RDY/nIRQ */
+ if (!cf->board->irq_pin || gpiod_get_value(cf->board->irq_pin))
*sp |= SS_READY;
- if (!vcc || gpio_get_value(cf->board->vcc_pin))
+ if (!cf->board->vcc_pin || gpiod_get_value(cf->board->vcc_pin))
*sp |= SS_POWERON;
- } else
+ } else {
*sp = 0;
+ }

return 0;
}
@@ -125,13 +123,13 @@ at91_cf_set_socket(struct pcmcia_socket *sock, struct socket_state_t *s)
cf = container_of(sock, struct at91_cf_socket, socket);

/* switch Vcc if needed and possible */
- if (gpio_is_valid(cf->board->vcc_pin)) {
+ if (cf->board->vcc_pin) {
switch (s->Vcc) {
case 0:
- gpio_set_value(cf->board->vcc_pin, 0);
+ gpiod_set_value(cf->board->vcc_pin, 0);
break;
case 33:
- gpio_set_value(cf->board->vcc_pin, 1);
+ gpiod_set_value(cf->board->vcc_pin, 1);
break;
default:
return -EINVAL;
@@ -139,7 +137,7 @@ at91_cf_set_socket(struct pcmcia_socket *sock, struct socket_state_t *s)
}

/* toggle reset if needed */
- gpio_set_value(cf->board->rst_pin, s->flags & SS_RESET);
+ gpiod_set_value(cf->board->rst_pin, s->flags & SS_RESET);

dev_dbg(&cf->pdev->dev, "Vcc %d, io_irq %d, flags %04x csc %04x\n",
s->Vcc, s->io_irq, s->flags, s->csc_mask);
@@ -180,7 +178,8 @@ static int at91_cf_set_io_map(struct pcmcia_socket *s, struct pccard_io_map *io)
csr = AT91_MC_SMC_DBW_16;
dev_dbg(&cf->pdev->dev, "16bit i/o bus\n");
}
- regmap_update_bits(mc, AT91_MC_SMC_CSR(cf->board->chipselect),
+ regmap_update_bits(cf->board->mc,
+ AT91_MC_SMC_CSR(cf->board->chipselect),
AT91_MC_SMC_DBW, csr);

io->start = cf->socket.io_offset;
@@ -238,17 +237,9 @@ static int at91_cf_probe(struct platform_device *pdev)
if (!board)
return -ENOMEM;

- board->irq_pin = of_get_gpio(pdev->dev.of_node, 0);
- board->det_pin = of_get_gpio(pdev->dev.of_node, 1);
- board->vcc_pin = of_get_gpio(pdev->dev.of_node, 2);
- board->rst_pin = of_get_gpio(pdev->dev.of_node, 3);
-
- mc = syscon_regmap_lookup_by_compatible("atmel,at91rm9200-sdramc");
- if (IS_ERR(mc))
- return PTR_ERR(mc);
-
- if (!gpio_is_valid(board->det_pin) || !gpio_is_valid(board->rst_pin))
- return -ENODEV;
+ board->mc = syscon_regmap_lookup_by_compatible("atmel,at91rm9200-sdramc");
+ if (IS_ERR(board->mc))
+ return PTR_ERR(board->mc);

io = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!io)
@@ -264,26 +255,34 @@ static int at91_cf_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, cf);

/* must be a GPIO; ergo must trigger on both edges */
- status = devm_gpio_request(&pdev->dev, board->det_pin, "cf_det");
- if (status < 0)
+ board->det_pin = devm_gpiod_get_index(&pdev->dev, NULL, 1, GPIOD_IN);
+ status = PTR_ERR_OR_ZERO(board->det_pin);
+ if (status)
return status;

- status = devm_request_irq(&pdev->dev, gpio_to_irq(board->det_pin),
+ gpiod_set_consumer_name(board->det_pin, "cf_det");
+
+ status = devm_request_irq(&pdev->dev, gpiod_to_irq(board->det_pin),
at91_cf_irq, 0, "at91_cf detect", cf);
if (status < 0)
return status;

device_init_wakeup(&pdev->dev, 1);

- status = devm_gpio_request(&pdev->dev, board->rst_pin, "cf_rst");
- if (status < 0)
+ board->rst_pin = devm_gpiod_get_index(&pdev->dev, NULL, 3, GPIOD_ASIS);
+ status = PTR_ERR_OR_ZERO(board->rst_pin);
+ if (status)
goto fail0a;

- if (gpio_is_valid(board->vcc_pin)) {
- status = devm_gpio_request(&pdev->dev, board->vcc_pin, "cf_vcc");
- if (status < 0)
- goto fail0a;
- }
+ gpiod_set_consumer_name(board->rst_pin, "cf_rst");
+
+ board->vcc_pin = devm_gpiod_get_index_optional(&pdev->dev,
+ NULL, 2, GPIOD_ASIS);
+ status = PTR_ERR_OR_ZERO(board->rst_pin);
+ if (status)
+ goto fail0a;
+
+ gpiod_set_consumer_name(board->vcc_pin, "cf_vcc");

/*
* The card driver will request this irq later as needed.
@@ -291,18 +290,23 @@ static int at91_cf_probe(struct platform_device *pdev)
* unless we report that we handle everything (sigh).
* (Note: DK board doesn't wire the IRQ pin...)
*/
- if (gpio_is_valid(board->irq_pin)) {
- status = devm_gpio_request(&pdev->dev, board->irq_pin, "cf_irq");
- if (status < 0)
- goto fail0a;
+ board->irq_pin = devm_gpiod_get_index_optional(&pdev->dev,
+ NULL, 0, GPIOD_IN);
+ status = PTR_ERR_OR_ZERO(board->irq_pin);
+ if (status)
+ goto fail0a;

- status = devm_request_irq(&pdev->dev, gpio_to_irq(board->irq_pin),
+ if (board->irq_pin) {
+ gpiod_set_consumer_name(board->irq_pin, "cf_irq");
+
+ status = devm_request_irq(&pdev->dev, gpiod_to_irq(board->irq_pin),
at91_cf_irq, IRQF_SHARED, "at91_cf", cf);
if (status < 0)
goto fail0a;
- cf->socket.pci_irq = gpio_to_irq(board->irq_pin);
- } else
+ cf->socket.pci_irq = gpiod_to_irq(board->irq_pin);
+ } else {
cf->socket.pci_irq = nr_irqs + 1;
+ }

/*
* pcmcia layer only remaps "real" memory not iospace
@@ -322,7 +326,7 @@ static int at91_cf_probe(struct platform_device *pdev)
}

dev_info(&pdev->dev, "irqs det #%d, io #%d\n",
- gpio_to_irq(board->det_pin), gpio_to_irq(board->irq_pin));
+ gpiod_to_irq(board->det_pin), gpiod_to_irq(board->irq_pin));

cf->socket.owner = THIS_MODULE;
cf->socket.dev.parent = &pdev->dev;
@@ -362,9 +366,9 @@ static int at91_cf_suspend(struct platform_device *pdev, pm_message_t mesg)
struct at91_cf_data *board = cf->board;

if (device_may_wakeup(&pdev->dev)) {
- enable_irq_wake(gpio_to_irq(board->det_pin));
- if (gpio_is_valid(board->irq_pin))
- enable_irq_wake(gpio_to_irq(board->irq_pin));
+ enable_irq_wake(gpiod_to_irq(board->det_pin));
+ if (board->irq_pin)
+ enable_irq_wake(gpiod_to_irq(board->irq_pin));
}
return 0;
}
@@ -375,9 +379,9 @@ static int at91_cf_resume(struct platform_device *pdev)
struct at91_cf_data *board = cf->board;

if (device_may_wakeup(&pdev->dev)) {
- disable_irq_wake(gpio_to_irq(board->det_pin));
- if (gpio_is_valid(board->irq_pin))
- disable_irq_wake(gpio_to_irq(board->irq_pin));
+ disable_irq_wake(gpiod_to_irq(board->det_pin));
+ if (board->irq_pin)
+ disable_irq_wake(gpiod_to_irq(board->irq_pin));
}

return 0;
--
2.30.2


--
Dmitry