From: Rosen Penev <rosenp@gmail.com>
To: linux-gpio@vger.kernel.org
Cc: Madhavan Srinivasan <maddy@linux.ibm.com>,
chleroy@kernel.org, Michael Ellerman <mpe@ellerman.id.au>,
Nicholas Piggin <npiggin@gmail.com>,
Linus Walleij <linusw@kernel.org>,
Bartosz Golaszewski <brgl@kernel.org>,
linuxppc-dev@lists.ozlabs.org (open list:LINUX FOR POWERPC
(32-BIT AND 64-BIT)), linux-kernel@vger.kernel.org (open list)
Subject: [PATCH 6/7] gpio: ppc44x: drop PPC-specific IO helpers and rename to ppc44x
Date: Mon, 1 Jun 2026 22:01:30 -0700 [thread overview]
Message-ID: <20260602050131.856789-7-rosenp@gmail.com> (raw)
In-Reply-To: <20260602050131.856789-1-rosenp@gmail.com>
Replace PPC-specific clrbits32()/setbits32() with local helpers using
ioread32be()/iowrite32be() which are equivalent on PPC since commit
894fa235eb4c ("powerpc: inline iomap accessors"). This allows the
driver to be compiled on any architecture with COMPILE_TEST.
- Changed Kconfig dependency to depends on 44x || COMPILE_TEST
Assisted-by: opencode:big-pickle
Signed-off-by: Rosen Penev <rosenp@gmail.com>
---
drivers/gpio/Kconfig | 3 +-
drivers/gpio/gpio-ppc44x.c | 88 ++++++++++++++++++++++----------------
2 files changed, 53 insertions(+), 38 deletions(-)
diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
index 77991da43ec1..7374f82b7040 100644
--- a/drivers/gpio/Kconfig
+++ b/drivers/gpio/Kconfig
@@ -595,9 +595,8 @@ config GPIO_POLARFIRE_SOC
config GPIO_PPC44X
tristate "PPC44x GPIO support"
- depends on 44x
+ depends on 44x || COMPILE_TEST
select GPIO_GENERIC
- select GPIOLIB
help
Enable gpiolib support for ppc440 based boards.
diff --git a/drivers/gpio/gpio-ppc44x.c b/drivers/gpio/gpio-ppc44x.c
index 6b4814ed12b5..cc7796e0cfbd 100644
--- a/drivers/gpio/gpio-ppc44x.c
+++ b/drivers/gpio/gpio-ppc44x.c
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
- * PPC4xx gpio driver
+ * PPC44x gpio driver
*
* Copyright (c) 2008 Harris Corporation
* Copyright (c) 2008 Sascha Hauer <s.hauer@pengutronix.de>, Pengutronix
@@ -22,7 +22,7 @@
#define GPIO_MASK2(gpio) (0xc0000000 >> ((gpio) * 2))
/* Physical GPIO register layout */
-struct ppc4xx_gpio {
+struct ppc44x_gpio {
__be32 or;
__be32 tcr;
__be32 osrl;
@@ -43,11 +43,27 @@ struct ppc4xx_gpio {
__be32 isr3h;
};
-struct ppc4xx_gpio_chip {
+struct ppc44x_gpio_chip {
struct gpio_generic_chip chip;
void __iomem *regs;
};
+static inline void ppc44x_clrbits32(void __iomem *addr, u32 mask)
+{
+ u32 val = ioread32be(addr);
+
+ val &= ~mask;
+ iowrite32be(val, addr);
+}
+
+static inline void ppc44x_setbits32(void __iomem *addr, u32 mask)
+{
+ u32 val = ioread32be(addr);
+
+ val |= mask;
+ iowrite32be(val, addr);
+}
+
/*
* GPIO LIB API implementation for GPIOs
*
@@ -55,9 +71,9 @@ struct ppc4xx_gpio_chip {
*/
static inline void
-__ppc4xx_gpio_set(struct gpio_chip *gc, unsigned int gpio, int val)
+__ppc44x_gpio_set(struct gpio_chip *gc, unsigned int gpio, int val)
{
- struct ppc4xx_gpio_chip *chip = gpiochip_get_data(gc);
+ struct ppc44x_gpio_chip *chip = gpiochip_get_data(gc);
struct gpio_generic_chip *gen_gc = &chip->chip;
if (val)
@@ -68,29 +84,29 @@ __ppc4xx_gpio_set(struct gpio_chip *gc, unsigned int gpio, int val)
gpio_generic_write_reg(gen_gc, gen_gc->reg_set, gen_gc->sdata);
}
-static int ppc4xx_gpio_dir_in(struct gpio_chip *gc, unsigned int gpio)
+static int ppc44x_gpio_dir_in(struct gpio_chip *gc, unsigned int gpio)
{
- struct ppc4xx_gpio_chip *chip = gpiochip_get_data(gc);
+ struct ppc44x_gpio_chip *chip = gpiochip_get_data(gc);
struct gpio_generic_chip *gen_gc = &chip->chip;
- struct ppc4xx_gpio __iomem *regs = chip->regs;
+ struct ppc44x_gpio __iomem *regs = chip->regs;
unsigned long flags;
gpio_generic_chip_lock_irqsave(gen_gc, flags);
/* Disable open-drain function */
- clrbits32(®s->odr, GPIO_MASK(gpio));
+ ppc44x_clrbits32(®s->odr, GPIO_MASK(gpio));
/* Float the pin */
- clrbits32(®s->tcr, GPIO_MASK(gpio));
+ ppc44x_clrbits32(®s->tcr, GPIO_MASK(gpio));
gen_gc->sdir &= ~GPIO_MASK(gpio);
/* Bits 0-15 use TSRL/OSRL, bits 16-31 use TSRH/OSRH */
if (gpio < 16) {
- clrbits32(®s->osrl, GPIO_MASK2(gpio));
- clrbits32(®s->tsrl, GPIO_MASK2(gpio));
+ ppc44x_clrbits32(®s->osrl, GPIO_MASK2(gpio));
+ ppc44x_clrbits32(®s->tsrl, GPIO_MASK2(gpio));
} else {
- clrbits32(®s->osrh, GPIO_MASK2(gpio));
- clrbits32(®s->tsrh, GPIO_MASK2(gpio));
+ ppc44x_clrbits32(®s->osrh, GPIO_MASK2(gpio));
+ ppc44x_clrbits32(®s->tsrh, GPIO_MASK2(gpio));
}
gpio_generic_chip_unlock_irqrestore(gen_gc, flags);
@@ -99,32 +115,32 @@ static int ppc4xx_gpio_dir_in(struct gpio_chip *gc, unsigned int gpio)
}
static int
-ppc4xx_gpio_dir_out(struct gpio_chip *gc, unsigned int gpio, int val)
+ppc44x_gpio_dir_out(struct gpio_chip *gc, unsigned int gpio, int val)
{
- struct ppc4xx_gpio_chip *chip = gpiochip_get_data(gc);
+ struct ppc44x_gpio_chip *chip = gpiochip_get_data(gc);
struct gpio_generic_chip *gen_gc = &chip->chip;
- struct ppc4xx_gpio __iomem *regs = chip->regs;
+ struct ppc44x_gpio __iomem *regs = chip->regs;
unsigned long flags;
gpio_generic_chip_lock_irqsave(gen_gc, flags);
/* First set initial value */
- __ppc4xx_gpio_set(gc, gpio, val);
+ __ppc44x_gpio_set(gc, gpio, val);
/* Disable open-drain function */
- clrbits32(®s->odr, GPIO_MASK(gpio));
+ ppc44x_clrbits32(®s->odr, GPIO_MASK(gpio));
/* Drive the pin */
- setbits32(®s->tcr, GPIO_MASK(gpio));
+ ppc44x_setbits32(®s->tcr, GPIO_MASK(gpio));
gen_gc->sdir |= GPIO_MASK(gpio);
/* Bits 0-15 use TSRL, bits 16-31 use TSRH */
if (gpio < 16) {
- clrbits32(®s->osrl, GPIO_MASK2(gpio));
- clrbits32(®s->tsrl, GPIO_MASK2(gpio));
+ ppc44x_clrbits32(®s->osrl, GPIO_MASK2(gpio));
+ ppc44x_clrbits32(®s->tsrl, GPIO_MASK2(gpio));
} else {
- clrbits32(®s->osrh, GPIO_MASK2(gpio));
- clrbits32(®s->tsrh, GPIO_MASK2(gpio));
+ ppc44x_clrbits32(®s->osrh, GPIO_MASK2(gpio));
+ ppc44x_clrbits32(®s->tsrh, GPIO_MASK2(gpio));
}
gpio_generic_chip_unlock_irqrestore(gen_gc, flags);
@@ -134,14 +150,14 @@ ppc4xx_gpio_dir_out(struct gpio_chip *gc, unsigned int gpio, int val)
return 0;
}
-static int ppc4xx_gpio_probe(struct platform_device *ofdev)
+static int ppc44x_gpio_probe(struct platform_device *ofdev)
{
struct device *dev = &ofdev->dev;
struct device_node *np = dev->of_node;
- struct ppc4xx_gpio_chip *chip;
+ struct ppc44x_gpio_chip *chip;
struct gpio_generic_chip_config config;
struct gpio_chip *gc;
- struct ppc4xx_gpio __iomem *regs;
+ struct ppc44x_gpio __iomem *regs;
int ret;
chip = devm_kzalloc(dev, sizeof(*chip), GFP_KERNEL);
@@ -169,8 +185,8 @@ static int ppc4xx_gpio_probe(struct platform_device *ofdev)
gc = &chip->chip.gc;
gc->fwnode = dev_fwnode(dev);
- gc->direction_input = ppc4xx_gpio_dir_in;
- gc->direction_output = ppc4xx_gpio_dir_out;
+ gc->direction_input = ppc44x_gpio_dir_in;
+ gc->direction_output = ppc44x_gpio_dir_out;
gc->label = devm_kasprintf(dev, GFP_KERNEL, "%pOF", np);
if (!gc->label)
@@ -179,20 +195,20 @@ static int ppc4xx_gpio_probe(struct platform_device *ofdev)
return devm_gpiochip_add_data(dev, gc, chip);
}
-static const struct of_device_id ppc4xx_gpio_match[] = {
+static const struct of_device_id ppc44x_gpio_match[] = {
{
.compatible = "ibm,ppc4xx-gpio",
},
{},
};
-MODULE_DEVICE_TABLE(of, ppc4xx_gpio_match);
+MODULE_DEVICE_TABLE(of, ppc44x_gpio_match);
-static struct platform_driver ppc4xx_gpio_driver = {
- .probe = ppc4xx_gpio_probe,
+static struct platform_driver ppc44x_gpio_driver = {
+ .probe = ppc44x_gpio_probe,
.driver = {
- .name = "ppc4xx-gpio",
- .of_match_table = ppc4xx_gpio_match,
+ .name = "ppc44x-gpio",
+ .of_match_table = ppc44x_gpio_match,
},
};
-module_platform_driver(ppc4xx_gpio_driver);
+module_platform_driver(ppc44x_gpio_driver);
--
2.54.0
next prev parent reply other threads:[~2026-06-02 5:02 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-02 5:01 [PATCH 0/7] gpio: move ppc4xx driver to drivers/gpio and modernize Rosen Penev
2026-06-02 5:01 ` [PATCH 1/7] gpio: move ppc4xx gpio driver from arch/powerpc to drivers/gpio Rosen Penev
2026-06-02 5:01 ` [PATCH 2/7] gpio: ppc44x: Use module platform driver helper for GPIO Rosen Penev
2026-06-02 5:01 ` [PATCH 3/7] gpio: ppc44x: Set GPIO chip firmware node Rosen Penev
2026-06-02 5:01 ` [PATCH 4/7] gpio: ppc44x: Use platform resource helper for GPIO MMIO Rosen Penev
2026-06-02 5:01 ` [PATCH 5/7] gpio: ppc44x: Convert GPIO to generic MMIO Rosen Penev
2026-06-02 7:51 ` Bartosz Golaszewski
2026-06-02 9:26 ` Rosen Penev
2026-06-02 5:01 ` Rosen Penev [this message]
2026-06-02 5:01 ` [PATCH 7/7] gpio: ppc44x: add MODULE info Rosen Penev
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=20260602050131.856789-7-rosenp@gmail.com \
--to=rosenp@gmail.com \
--cc=brgl@kernel.org \
--cc=chleroy@kernel.org \
--cc=linusw@kernel.org \
--cc=linux-gpio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=maddy@linux.ibm.com \
--cc=mpe@ellerman.id.au \
--cc=npiggin@gmail.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox