[PATCH v1 1/1] gpio: mmio: Support 64-bit BE access

From: andy . shevchenko
Date: Tue Feb 20 2024 - 18:24:50 EST


Use ioread64be()/iowrite64be() for 64-bit BE access.

Signed-off-by: Andy Shevchenko <andy.shevchenko@xxxxxxxxx>
---
drivers/gpio/gpio-mmio.c | 21 ++++++++++++++++-----
1 file changed, 16 insertions(+), 5 deletions(-)

diff --git a/drivers/gpio/gpio-mmio.c b/drivers/gpio/gpio-mmio.c
index 71e1af7c2184..cd5ef9233152 100644
--- a/drivers/gpio/gpio-mmio.c
+++ b/drivers/gpio/gpio-mmio.c
@@ -92,12 +92,12 @@ static unsigned long bgpio_read32(void __iomem *reg)
#if BITS_PER_LONG >= 64
static void bgpio_write64(void __iomem *reg, unsigned long data)
{
- writeq(data, reg);
+ iowrite64(data, reg);
}

static unsigned long bgpio_read64(void __iomem *reg)
{
- return readq(reg);
+ return ioread64(reg);
}
#endif /* BITS_PER_LONG >= 64 */

@@ -121,6 +121,18 @@ static unsigned long bgpio_read32be(void __iomem *reg)
return ioread32be(reg);
}

+#if BITS_PER_LONG >= 64
+static void bgpio_write64be(void __iomem *reg, unsigned long data)
+{
+ iowrite64be(data, reg);
+}
+
+static unsigned long bgpio_read64be(void __iomem *reg)
+{
+ return ioread64be(reg);
+}
+#endif /* BITS_PER_LONG >= 64 */
+
static unsigned long bgpio_line2mask(struct gpio_chip *gc, unsigned int line)
{
if (gc->be_bits)
@@ -445,9 +457,8 @@ static int bgpio_setup_accessors(struct device *dev,
#if BITS_PER_LONG >= 64
case 64:
if (byte_be) {
- dev_err(dev,
- "64 bit big endian byte order unsupported\n");
- return -EINVAL;
+ gc->read_reg = bgpio_read64be;
+ gc->write_reg = bgpio_write64be;
} else {
gc->read_reg = bgpio_read64;
gc->write_reg = bgpio_write64;
--
2.43.2