Skip to content

Commit e8bd2a6

Browse files
author
Bartosz Golaszewski
committed
gpio: brcmstb: use new generic GPIO chip API
Convert the driver to using the new generic GPIO chip interfaces from linux/gpio/generic.h. Reviewed-by: Florian Fainelli <florian.fainelli@broadcom.com> Tested-by: Florian Fainelli <florian.fainelli@broadcom.com> Acked-by: Doug Berger <opendmb@gmail.com> Reviewed-by: Linus Walleij <linus.walleij@linaro.org> Link: https://lore.kernel.org/r/20250910-gpio-mmio-gpio-conv-part4-v2-7-f3d1a4c57124@linaro.org Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
1 parent 36f30f7 commit e8bd2a6

1 file changed

Lines changed: 62 additions & 54 deletions

File tree

drivers/gpio/gpio-brcmstb.c

Lines changed: 62 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#include <linux/bitops.h>
55
#include <linux/gpio/driver.h>
6+
#include <linux/gpio/generic.h>
67
#include <linux/of.h>
78
#include <linux/module.h>
89
#include <linux/irqdomain.h>
@@ -37,7 +38,7 @@ enum gio_reg_index {
3738
struct brcmstb_gpio_bank {
3839
struct list_head node;
3940
int id;
40-
struct gpio_chip gc;
41+
struct gpio_generic_chip chip;
4142
struct brcmstb_gpio_priv *parent_priv;
4243
u32 width;
4344
u32 wake_active;
@@ -72,46 +73,45 @@ __brcmstb_gpio_get_active_irqs(struct brcmstb_gpio_bank *bank)
7273
{
7374
void __iomem *reg_base = bank->parent_priv->reg_base;
7475

75-
return bank->gc.read_reg(reg_base + GIO_STAT(bank->id)) &
76-
bank->gc.read_reg(reg_base + GIO_MASK(bank->id));
76+
return gpio_generic_read_reg(&bank->chip, reg_base + GIO_STAT(bank->id)) &
77+
gpio_generic_read_reg(&bank->chip, reg_base + GIO_MASK(bank->id));
7778
}
7879

7980
static unsigned long
8081
brcmstb_gpio_get_active_irqs(struct brcmstb_gpio_bank *bank)
8182
{
8283
unsigned long status;
83-
unsigned long flags;
8484

85-
raw_spin_lock_irqsave(&bank->gc.bgpio_lock, flags);
85+
guard(gpio_generic_lock_irqsave)(&bank->chip);
86+
8687
status = __brcmstb_gpio_get_active_irqs(bank);
87-
raw_spin_unlock_irqrestore(&bank->gc.bgpio_lock, flags);
8888

8989
return status;
9090
}
9191

9292
static int brcmstb_gpio_hwirq_to_offset(irq_hw_number_t hwirq,
9393
struct brcmstb_gpio_bank *bank)
9494
{
95-
return hwirq - bank->gc.offset;
95+
return hwirq - bank->chip.gc.offset;
9696
}
9797

9898
static void brcmstb_gpio_set_imask(struct brcmstb_gpio_bank *bank,
9999
unsigned int hwirq, bool enable)
100100
{
101-
struct gpio_chip *gc = &bank->gc;
102101
struct brcmstb_gpio_priv *priv = bank->parent_priv;
103102
u32 mask = BIT(brcmstb_gpio_hwirq_to_offset(hwirq, bank));
104103
u32 imask;
105-
unsigned long flags;
106104

107-
raw_spin_lock_irqsave(&gc->bgpio_lock, flags);
108-
imask = gc->read_reg(priv->reg_base + GIO_MASK(bank->id));
105+
guard(gpio_generic_lock_irqsave)(&bank->chip);
106+
107+
imask = gpio_generic_read_reg(&bank->chip,
108+
priv->reg_base + GIO_MASK(bank->id));
109109
if (enable)
110110
imask |= mask;
111111
else
112112
imask &= ~mask;
113-
gc->write_reg(priv->reg_base + GIO_MASK(bank->id), imask);
114-
raw_spin_unlock_irqrestore(&gc->bgpio_lock, flags);
113+
gpio_generic_write_reg(&bank->chip,
114+
priv->reg_base + GIO_MASK(bank->id), imask);
115115
}
116116

117117
static int brcmstb_gpio_to_irq(struct gpio_chip *gc, unsigned offset)
@@ -150,7 +150,8 @@ static void brcmstb_gpio_irq_ack(struct irq_data *d)
150150
struct brcmstb_gpio_priv *priv = bank->parent_priv;
151151
u32 mask = BIT(brcmstb_gpio_hwirq_to_offset(d->hwirq, bank));
152152

153-
gc->write_reg(priv->reg_base + GIO_STAT(bank->id), mask);
153+
gpio_generic_write_reg(&bank->chip,
154+
priv->reg_base + GIO_STAT(bank->id), mask);
154155
}
155156

156157
static int brcmstb_gpio_irq_set_type(struct irq_data *d, unsigned int type)
@@ -162,7 +163,6 @@ static int brcmstb_gpio_irq_set_type(struct irq_data *d, unsigned int type)
162163
u32 edge_insensitive, iedge_insensitive;
163164
u32 edge_config, iedge_config;
164165
u32 level, ilevel;
165-
unsigned long flags;
166166

167167
switch (type) {
168168
case IRQ_TYPE_LEVEL_LOW:
@@ -194,23 +194,25 @@ static int brcmstb_gpio_irq_set_type(struct irq_data *d, unsigned int type)
194194
return -EINVAL;
195195
}
196196

197-
raw_spin_lock_irqsave(&bank->gc.bgpio_lock, flags);
198-
199-
iedge_config = bank->gc.read_reg(priv->reg_base +
200-
GIO_EC(bank->id)) & ~mask;
201-
iedge_insensitive = bank->gc.read_reg(priv->reg_base +
202-
GIO_EI(bank->id)) & ~mask;
203-
ilevel = bank->gc.read_reg(priv->reg_base +
204-
GIO_LEVEL(bank->id)) & ~mask;
205-
206-
bank->gc.write_reg(priv->reg_base + GIO_EC(bank->id),
207-
iedge_config | edge_config);
208-
bank->gc.write_reg(priv->reg_base + GIO_EI(bank->id),
209-
iedge_insensitive | edge_insensitive);
210-
bank->gc.write_reg(priv->reg_base + GIO_LEVEL(bank->id),
211-
ilevel | level);
197+
guard(gpio_generic_lock_irqsave)(&bank->chip);
198+
199+
iedge_config = gpio_generic_read_reg(&bank->chip,
200+
priv->reg_base + GIO_EC(bank->id)) & ~mask;
201+
iedge_insensitive = gpio_generic_read_reg(&bank->chip,
202+
priv->reg_base + GIO_EI(bank->id)) & ~mask;
203+
ilevel = gpio_generic_read_reg(&bank->chip,
204+
priv->reg_base + GIO_LEVEL(bank->id)) & ~mask;
205+
206+
gpio_generic_write_reg(&bank->chip,
207+
priv->reg_base + GIO_EC(bank->id),
208+
iedge_config | edge_config);
209+
gpio_generic_write_reg(&bank->chip,
210+
priv->reg_base + GIO_EI(bank->id),
211+
iedge_insensitive | edge_insensitive);
212+
gpio_generic_write_reg(&bank->chip,
213+
priv->reg_base + GIO_LEVEL(bank->id),
214+
ilevel | level);
212215

213-
raw_spin_unlock_irqrestore(&bank->gc.bgpio_lock, flags);
214216
return 0;
215217
}
216218

@@ -263,7 +265,7 @@ static void brcmstb_gpio_irq_bank_handler(struct brcmstb_gpio_bank *bank)
263265
{
264266
struct brcmstb_gpio_priv *priv = bank->parent_priv;
265267
struct irq_domain *domain = priv->irq_domain;
266-
int hwbase = bank->gc.offset;
268+
int hwbase = bank->chip.gc.offset;
267269
unsigned long status;
268270

269271
while ((status = brcmstb_gpio_get_active_irqs(bank))) {
@@ -303,7 +305,7 @@ static struct brcmstb_gpio_bank *brcmstb_gpio_hwirq_to_bank(
303305

304306
/* banks are in descending order */
305307
list_for_each_entry_reverse(bank, &priv->bank_list, node) {
306-
i += bank->gc.ngpio;
308+
i += bank->chip.gc.ngpio;
307309
if (hwirq < i)
308310
return bank;
309311
}
@@ -332,7 +334,7 @@ static int brcmstb_gpio_irq_map(struct irq_domain *d, unsigned int irq,
332334

333335
dev_dbg(&pdev->dev, "Mapping irq %d for gpio line %d (bank %d)\n",
334336
irq, (int)hwirq, bank->id);
335-
ret = irq_set_chip_data(irq, &bank->gc);
337+
ret = irq_set_chip_data(irq, &bank->chip.gc);
336338
if (ret < 0)
337339
return ret;
338340
irq_set_lockdep_class(irq, &brcmstb_gpio_irq_lock_class,
@@ -394,7 +396,7 @@ static void brcmstb_gpio_remove(struct platform_device *pdev)
394396
* more important to actually perform all of the steps.
395397
*/
396398
list_for_each_entry(bank, &priv->bank_list, node)
397-
gpiochip_remove(&bank->gc);
399+
gpiochip_remove(&bank->chip.gc);
398400
}
399401

400402
static int brcmstb_gpio_of_xlate(struct gpio_chip *gc,
@@ -412,7 +414,7 @@ static int brcmstb_gpio_of_xlate(struct gpio_chip *gc,
412414
if (WARN_ON(gpiospec->args_count < gc->of_gpio_n_cells))
413415
return -EINVAL;
414416

415-
offset = gpiospec->args[0] - bank->gc.offset;
417+
offset = gpiospec->args[0] - bank->chip.gc.offset;
416418
if (offset >= gc->ngpio || offset < 0)
417419
return -EINVAL;
418420

@@ -493,28 +495,24 @@ static int brcmstb_gpio_irq_setup(struct platform_device *pdev,
493495
static void brcmstb_gpio_bank_save(struct brcmstb_gpio_priv *priv,
494496
struct brcmstb_gpio_bank *bank)
495497
{
496-
struct gpio_chip *gc = &bank->gc;
497498
unsigned int i;
498499

499500
for (i = 0; i < GIO_REG_STAT; i++)
500-
bank->saved_regs[i] = gc->read_reg(priv->reg_base +
501-
GIO_BANK_OFF(bank->id, i));
501+
bank->saved_regs[i] = gpio_generic_read_reg(&bank->chip,
502+
priv->reg_base + GIO_BANK_OFF(bank->id, i));
502503
}
503504

504505
static void brcmstb_gpio_quiesce(struct device *dev, bool save)
505506
{
506507
struct brcmstb_gpio_priv *priv = dev_get_drvdata(dev);
507508
struct brcmstb_gpio_bank *bank;
508-
struct gpio_chip *gc;
509509
u32 imask;
510510

511511
/* disable non-wake interrupt */
512512
if (priv->parent_irq >= 0)
513513
disable_irq(priv->parent_irq);
514514

515515
list_for_each_entry(bank, &priv->bank_list, node) {
516-
gc = &bank->gc;
517-
518516
if (save)
519517
brcmstb_gpio_bank_save(priv, bank);
520518

@@ -523,8 +521,9 @@ static void brcmstb_gpio_quiesce(struct device *dev, bool save)
523521
imask = bank->wake_active;
524522
else
525523
imask = 0;
526-
gc->write_reg(priv->reg_base + GIO_MASK(bank->id),
527-
imask);
524+
gpio_generic_write_reg(&bank->chip,
525+
priv->reg_base + GIO_MASK(bank->id),
526+
imask);
528527
}
529528
}
530529

@@ -538,12 +537,12 @@ static void brcmstb_gpio_shutdown(struct platform_device *pdev)
538537
static void brcmstb_gpio_bank_restore(struct brcmstb_gpio_priv *priv,
539538
struct brcmstb_gpio_bank *bank)
540539
{
541-
struct gpio_chip *gc = &bank->gc;
542540
unsigned int i;
543541

544542
for (i = 0; i < GIO_REG_STAT; i++)
545-
gc->write_reg(priv->reg_base + GIO_BANK_OFF(bank->id, i),
546-
bank->saved_regs[i]);
543+
gpio_generic_write_reg(&bank->chip,
544+
priv->reg_base + GIO_BANK_OFF(bank->id, i),
545+
bank->saved_regs[i]);
547546
}
548547

549548
static int brcmstb_gpio_suspend(struct device *dev)
@@ -585,6 +584,7 @@ static const struct dev_pm_ops brcmstb_gpio_pm_ops = {
585584

586585
static int brcmstb_gpio_probe(struct platform_device *pdev)
587586
{
587+
struct gpio_generic_chip_config config;
588588
struct device *dev = &pdev->dev;
589589
struct device_node *np = dev->of_node;
590590
void __iomem *reg_base;
@@ -665,17 +665,24 @@ static int brcmstb_gpio_probe(struct platform_device *pdev)
665665
bank->width = bank_width;
666666
}
667667

668+
gc = &bank->chip.gc;
669+
668670
/*
669671
* Regs are 4 bytes wide, have data reg, no set/clear regs,
670672
* and direction bits have 0 = output and 1 = input
671673
*/
672-
gc = &bank->gc;
673-
err = bgpio_init(gc, dev, 4,
674-
reg_base + GIO_DATA(bank->id),
675-
NULL, NULL, NULL,
676-
reg_base + GIO_IODIR(bank->id), flags);
674+
675+
config = (struct gpio_generic_chip_config) {
676+
.dev = dev,
677+
.sz = 4,
678+
.dat = reg_base + GIO_DATA(bank->id),
679+
.dirin = reg_base + GIO_IODIR(bank->id),
680+
.flags = flags,
681+
};
682+
683+
err = gpio_generic_chip_init(&bank->chip, &config);
677684
if (err) {
678-
dev_err(dev, "bgpio_init() failed\n");
685+
dev_err(dev, "failed to initialize generic GPIO chip\n");
679686
goto fail;
680687
}
681688

@@ -700,7 +707,8 @@ static int brcmstb_gpio_probe(struct platform_device *pdev)
700707
* be retained from S5 cold boot
701708
*/
702709
need_wakeup_event |= !!__brcmstb_gpio_get_active_irqs(bank);
703-
gc->write_reg(reg_base + GIO_MASK(bank->id), 0);
710+
gpio_generic_write_reg(&bank->chip,
711+
reg_base + GIO_MASK(bank->id), 0);
704712

705713
err = gpiochip_add_data(gc, bank);
706714
if (err) {

0 commit comments

Comments
 (0)