Skip to content

Commit bed5806

Browse files
William Breathitt Graybrgl
authored andcommitted
gpio: 104-idi-48: Utilize iomap interface
This driver doesn't need to access I/O ports directly via inb()/outb() and friends. This patch abstracts such access by calling ioport_map() to enable the use of more typical ioread8()/iowrite8() I/O memory accessor calls. Suggested-by: David Laight <[email protected]> Signed-off-by: William Breathitt Gray <[email protected]> Reviewed-by: Linus Walleij <[email protected]> Signed-off-by: Bartosz Golaszewski <[email protected]>
1 parent e993e23 commit bed5806

File tree

1 file changed

+15
-12
lines changed

1 file changed

+15
-12
lines changed

drivers/gpio/gpio-104-idi-48.c

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ struct idi_48_gpio {
4747
raw_spinlock_t lock;
4848
spinlock_t ack_lock;
4949
unsigned char irq_mask[6];
50-
unsigned base;
50+
void __iomem *base;
5151
unsigned char cos_enb;
5252
};
5353

@@ -66,15 +66,15 @@ static int idi_48_gpio_get(struct gpio_chip *chip, unsigned offset)
6666
struct idi_48_gpio *const idi48gpio = gpiochip_get_data(chip);
6767
unsigned i;
6868
static const unsigned int register_offset[6] = { 0, 1, 2, 4, 5, 6 };
69-
unsigned base_offset;
69+
void __iomem *port_addr;
7070
unsigned mask;
7171

7272
for (i = 0; i < 48; i += 8)
7373
if (offset < i + 8) {
74-
base_offset = register_offset[i / 8];
74+
port_addr = idi48gpio->base + register_offset[i / 8];
7575
mask = BIT(offset - i);
7676

77-
return !!(inb(idi48gpio->base + base_offset) & mask);
77+
return !!(ioread8(port_addr) & mask);
7878
}
7979

8080
/* The following line should never execute since offset < 48 */
@@ -88,15 +88,15 @@ static int idi_48_gpio_get_multiple(struct gpio_chip *chip, unsigned long *mask,
8888
unsigned long offset;
8989
unsigned long gpio_mask;
9090
static const size_t ports[] = { 0, 1, 2, 4, 5, 6 };
91-
unsigned int port_addr;
91+
void __iomem *port_addr;
9292
unsigned long port_state;
9393

9494
/* clear bits array to a clean slate */
9595
bitmap_zero(bits, chip->ngpio);
9696

9797
for_each_set_clump8(offset, gpio_mask, mask, ARRAY_SIZE(ports) * 8) {
9898
port_addr = idi48gpio->base + ports[offset / 8];
99-
port_state = inb(port_addr) & gpio_mask;
99+
port_state = ioread8(port_addr) & gpio_mask;
100100

101101
bitmap_set_value8(bits, port_state, offset);
102102
}
@@ -130,7 +130,7 @@ static void idi_48_irq_mask(struct irq_data *data)
130130

131131
raw_spin_lock_irqsave(&idi48gpio->lock, flags);
132132

133-
outb(idi48gpio->cos_enb, idi48gpio->base + 7);
133+
iowrite8(idi48gpio->cos_enb, idi48gpio->base + 7);
134134

135135
raw_spin_unlock_irqrestore(&idi48gpio->lock, flags);
136136
}
@@ -163,7 +163,7 @@ static void idi_48_irq_unmask(struct irq_data *data)
163163

164164
raw_spin_lock_irqsave(&idi48gpio->lock, flags);
165165

166-
outb(idi48gpio->cos_enb, idi48gpio->base + 7);
166+
iowrite8(idi48gpio->cos_enb, idi48gpio->base + 7);
167167

168168
raw_spin_unlock_irqrestore(&idi48gpio->lock, flags);
169169
}
@@ -204,7 +204,7 @@ static irqreturn_t idi_48_irq_handler(int irq, void *dev_id)
204204

205205
raw_spin_lock(&idi48gpio->lock);
206206

207-
cos_status = inb(idi48gpio->base + 7);
207+
cos_status = ioread8(idi48gpio->base + 7);
208208

209209
raw_spin_unlock(&idi48gpio->lock);
210210

@@ -250,8 +250,8 @@ static int idi_48_irq_init_hw(struct gpio_chip *gc)
250250
struct idi_48_gpio *const idi48gpio = gpiochip_get_data(gc);
251251

252252
/* Disable IRQ by default */
253-
outb(0, idi48gpio->base + 7);
254-
inb(idi48gpio->base + 7);
253+
iowrite8(0, idi48gpio->base + 7);
254+
ioread8(idi48gpio->base + 7);
255255

256256
return 0;
257257
}
@@ -273,6 +273,10 @@ static int idi_48_probe(struct device *dev, unsigned int id)
273273
return -EBUSY;
274274
}
275275

276+
idi48gpio->base = devm_ioport_map(dev, base[id], IDI_48_EXTENT);
277+
if (!idi48gpio->base)
278+
return -ENOMEM;
279+
276280
idi48gpio->chip.label = name;
277281
idi48gpio->chip.parent = dev;
278282
idi48gpio->chip.owner = THIS_MODULE;
@@ -283,7 +287,6 @@ static int idi_48_probe(struct device *dev, unsigned int id)
283287
idi48gpio->chip.direction_input = idi_48_gpio_direction_input;
284288
idi48gpio->chip.get = idi_48_gpio_get;
285289
idi48gpio->chip.get_multiple = idi_48_gpio_get_multiple;
286-
idi48gpio->base = base[id];
287290

288291
girq = &idi48gpio->chip.irq;
289292
girq->chip = &idi_48_irqchip;

0 commit comments

Comments
 (0)