Skip to contentSkip to conversation

Fix port memory offsets for IDIO series drivers

PATCH In review William Breathitt Gray 2 participants 5 messages Apr 18, 2018 – Apr 26, 2018

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

cover Fix port memory offsets for IDIO series drivers

The GPIO PCI-IDIO-16 and PCIE-IDIO-24 drivers utilize the ioread8 and iowrite8 functions to interact with their devices' respective I/O registers. To simplify the get_multiple/set_multiple callbacks, a local array 'ports' is used to hold the memory address offsets of the respective device I/O registers.

Currently the get_multiple callback in the GPIO PCI-IDIO-16 driver, and the get_multiple/set_multiple callbacks in the GPIO PCIE-IDIO-24 driver, incorrectly pass the memory address of the local 'ports' array elements to the respective ioread8/iowrite8 functions when they should instead pass the necessary device I/O register memory offset. This patch fixes this error by supplying the correct intended memory addresses to these functions.

William Breathitt Gray (2):
gpio: pci-idio-16: Fix port memory offset for get_multiple callback
gpio: pcie-idio-24: Fix port memory offset for
get_multiple/set_multiple callbacks

 drivers/gpio/gpio-pci-idio-16.c  |  8 ++++----
 drivers/gpio/gpio-pcie-idio-24.c | 20 ++++++++++----------
 2 files changed, 14 insertions(+), 14 deletions(-)
Signature · 1 line
2.16.2
#1 lore raw

PATCH 1/2 gpio: pci-idio-16: Fix port memory offset for get_multiple callback

The ioread8 function expects a memory offset argument. This patch fixes the ports array to provide the memory addresses of the respective device I/O registers.

Fixes 810ebfc5efca ("gpio: pci-idio-16: Implement get_multiple callback")
---
 drivers/gpio/gpio-pci-idio-16.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/gpio/gpio-pci-idio-16.c +4 -4
index 1948724d8c36..25d16b2af1c3 100644
@@ -116,9 +116,9 @@ static int idio_16_gpio_get_multiple(struct gpio_chip *chip,
 	unsigned long word_mask;
 	const unsigned long port_mask = GENMASK(gpio_reg_size - 1, 0);
 	unsigned long port_state;
-	u8 __iomem ports[] = {
-		idio16gpio->reg->out0_7, idio16gpio->reg->out8_15,
-		idio16gpio->reg->in0_7, idio16gpio->reg->in8_15,
+	void __iomem *ports[] = {
+		&idio16gpio->reg->out0_7, &idio16gpio->reg->out8_15,
+		&idio16gpio->reg->in0_7, &idio16gpio->reg->in8_15,
 	};
 
 	/* clear bits array to a clean slate */
@@ -143,7 +143,7 @@ static int idio_16_gpio_get_multiple(struct gpio_chip *chip,
 		}
 
 		/* read bits from current gpio port */
-		port_state = ioread8(ports + i);
+		port_state = ioread8(ports[i]);
 
 		/* store acquired bits at respective bits array offset */
 		bits[word_index] |= port_state << word_offset;
Signature · 1 line
2.16.2
#2 lore raw

Re: [PATCH 1/2] gpio: pci-idio-16: Fix port memory offset for get_multiple callback

Quoted 6 lines · William Breathitt Gray

The ioread8 function expects a memory offset argument. This patch fixes the ports array to provide the memory addresses of the respective device I/O registers.

Fixes 810ebfc5efca ("gpio: pci-idio-16: Implement get_multiple callback")

Patch applied for fixes.

Yours,
Linus Walleij

#3 lore raw

PATCH 2/2 gpio: pcie-idio-24: Fix port memory offset for get_multiple/set_multiple callbacks

In reply to William Breathitt Gray

The ioread8/iowrite8 functions expect a memory offset argument. This patch fixes the ports array to provide the memory addresses of the respective device I/O registers.

Fixes ca37081595a2 ("gpio: pcie-idio-24: Implement get_multiple/set_multiple callbacks")
---
 drivers/gpio/gpio-pcie-idio-24.c | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)
drivers/gpio/gpio-pcie-idio-24.c +10 -10
index 835607ecf658..3e77c2a9a9fd 100644
@@ -206,10 +206,10 @@ static int idio_24_gpio_get_multiple(struct gpio_chip *chip,
 	unsigned long word_mask;
 	const unsigned long port_mask = GENMASK(gpio_reg_size - 1, 0);
 	unsigned long port_state;
-	u8 __iomem ports[] = {
-		idio24gpio->reg->out0_7, idio24gpio->reg->out8_15,
-		idio24gpio->reg->out16_23, idio24gpio->reg->in0_7,
-		idio24gpio->reg->in8_15, idio24gpio->reg->in16_23,
+	void __iomem *ports[] = {
+		&idio24gpio->reg->out0_7, &idio24gpio->reg->out8_15,
+		&idio24gpio->reg->out16_23, &idio24gpio->reg->in0_7,
+		&idio24gpio->reg->in8_15, &idio24gpio->reg->in16_23,
 	};
 	const unsigned long out_mode_mask = BIT(1);
 
@@ -236,7 +236,7 @@ static int idio_24_gpio_get_multiple(struct gpio_chip *chip,
 
 		/* read bits from current gpio port (port 6 is TTL GPIO) */
 		if (i < 6)
-			port_state = ioread8(ports + i);
+			port_state = ioread8(ports[i]);
 		else if (ioread8(&idio24gpio->reg->ctl) & out_mode_mask)
 			port_state = ioread8(&idio24gpio->reg->ttl_out0_7);
 		else
@@ -301,9 +301,9 @@ static void idio_24_gpio_set_multiple(struct gpio_chip *chip,
 	const unsigned long port_mask = GENMASK(gpio_reg_size, 0);
 	unsigned long flags;
 	unsigned int out_state;
-	u8 __iomem ports[] = {
-		idio24gpio->reg->out0_7, idio24gpio->reg->out8_15,
-		idio24gpio->reg->out16_23
+	void __iomem *ports[] = {
+		&idio24gpio->reg->out0_7, &idio24gpio->reg->out8_15,
+		&idio24gpio->reg->out16_23
 	};
 	const unsigned long out_mode_mask = BIT(1);
 	const unsigned int ttl_offset = 48;
@@ -327,9 +327,9 @@ static void idio_24_gpio_set_multiple(struct gpio_chip *chip,
 		raw_spin_lock_irqsave(&idio24gpio->lock, flags);
 
 		/* process output lines */
-		out_state = ioread8(ports + i) & ~gpio_mask;
+		out_state = ioread8(ports[i]) & ~gpio_mask;
 		out_state |= (*bits >> bits_offset) & gpio_mask;
-		iowrite8(out_state, ports + i);
+		iowrite8(out_state, ports[i]);
 
 		raw_spin_unlock_irqrestore(&idio24gpio->lock, flags);
 	}
Signature · 1 line
2.16.2
#4 lore raw

Re: [PATCH 2/2] gpio: pcie-idio-24: Fix port memory offset for get_multiple/set_multiple callbacks

Quoted 6 lines · William Breathitt Gray

The ioread8/iowrite8 functions expect a memory offset argument. This patch fixes the ports array to provide the memory addresses of the respective device I/O registers.

Fixes ca37081595a2 ("gpio: pcie-idio-24: Implement get_multiple/set_multiple callbacks")

Patch applied for fixes.

Yours,
Linus Walleij