Skip to content

Commit b58bbbd

Browse files
tq-schiffermlag-linaro
authored andcommitted
mfd: tqmx86: Refactor GPIO IRQ setup
Move IRQ setup into a helper function. The string "GPIO" for error messages is replaced with a label argument to prepare for reusing the function for the I2C IRQ. No functional change intended. Co-developed-by: Gregor Herburger <gregor.herburger@tq-group.com> Signed-off-by: Gregor Herburger <gregor.herburger@tq-group.com> Signed-off-by: Matthias Schiffer <matthias.schiffer@ew.tq-group.com> Link: https://lore.kernel.org/r/97f481334f480a113b7076e76f994e0e73ee5aa5.1731325758.git.matthias.schiffer@ew.tq-group.com Signed-off-by: Lee Jones <lee@kernel.org>
1 parent aaac606 commit b58bbbd

File tree

1 file changed

+37
-22
lines changed

1 file changed

+37
-22
lines changed

drivers/mfd/tqmx86.c

Lines changed: 37 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -186,33 +186,52 @@ static int tqmx86_board_id_to_clk_rate(struct device *dev, u8 board_id)
186186
}
187187
}
188188

189-
static int tqmx86_probe(struct platform_device *pdev)
189+
static int tqmx86_setup_irq(struct device *dev, const char *label, u8 irq,
190+
void __iomem *io_base, u8 reg_shift)
190191
{
191-
u8 board_id, sauc, rev, i2c_det, io_ext_int_val;
192-
struct device *dev = &pdev->dev;
193-
u8 gpio_irq_cfg, readback;
194-
const char *board_name;
195-
void __iomem *io_base;
196-
int err;
192+
u8 val, readback;
193+
int irq_cfg;
197194

198-
switch (gpio_irq) {
195+
switch (irq) {
199196
case 0:
200-
gpio_irq_cfg = TQMX86_REG_IO_EXT_INT_NONE;
197+
irq_cfg = TQMX86_REG_IO_EXT_INT_NONE;
201198
break;
202199
case 7:
203-
gpio_irq_cfg = TQMX86_REG_IO_EXT_INT_7;
200+
irq_cfg = TQMX86_REG_IO_EXT_INT_7;
204201
break;
205202
case 9:
206-
gpio_irq_cfg = TQMX86_REG_IO_EXT_INT_9;
203+
irq_cfg = TQMX86_REG_IO_EXT_INT_9;
207204
break;
208205
case 12:
209-
gpio_irq_cfg = TQMX86_REG_IO_EXT_INT_12;
206+
irq_cfg = TQMX86_REG_IO_EXT_INT_12;
210207
break;
211208
default:
212-
pr_err("tqmx86: Invalid GPIO IRQ (%d)\n", gpio_irq);
209+
dev_err(dev, "invalid %s IRQ (%d)\n", label, irq);
213210
return -EINVAL;
214211
}
215212

213+
val = ioread8(io_base + TQMX86_REG_IO_EXT_INT);
214+
val &= ~(TQMX86_REG_IO_EXT_INT_MASK << reg_shift);
215+
val |= (irq_cfg & TQMX86_REG_IO_EXT_INT_MASK) << reg_shift;
216+
217+
iowrite8(val, io_base + TQMX86_REG_IO_EXT_INT);
218+
readback = ioread8(io_base + TQMX86_REG_IO_EXT_INT);
219+
if (readback != val) {
220+
dev_warn(dev, "%s interrupts not supported\n", label);
221+
return -EINVAL;
222+
}
223+
224+
return 0;
225+
}
226+
227+
static int tqmx86_probe(struct platform_device *pdev)
228+
{
229+
u8 board_id, sauc, rev, i2c_det;
230+
struct device *dev = &pdev->dev;
231+
const char *board_name;
232+
void __iomem *io_base;
233+
int err;
234+
216235
io_base = devm_ioport_map(dev, TQMX86_IOBASE, TQMX86_IOSIZE);
217236
if (!io_base)
218237
return -ENOMEM;
@@ -233,15 +252,11 @@ static int tqmx86_probe(struct platform_device *pdev)
233252
*/
234253
i2c_det = inb(TQMX86_REG_I2C_DETECT);
235254

236-
if (gpio_irq_cfg) {
237-
io_ext_int_val =
238-
gpio_irq_cfg << TQMX86_REG_IO_EXT_INT_GPIO_SHIFT;
239-
iowrite8(io_ext_int_val, io_base + TQMX86_REG_IO_EXT_INT);
240-
readback = ioread8(io_base + TQMX86_REG_IO_EXT_INT);
241-
if (readback != io_ext_int_val) {
242-
dev_warn(dev, "GPIO interrupts not supported.\n");
243-
return -EINVAL;
244-
}
255+
if (gpio_irq) {
256+
err = tqmx86_setup_irq(dev, "GPIO", gpio_irq, io_base,
257+
TQMX86_REG_IO_EXT_INT_GPIO_SHIFT);
258+
if (err)
259+
return err;
245260

246261
/* Assumes the IRQ resource is first. */
247262
tqmx_gpio_resources[0].start = gpio_irq;

0 commit comments

Comments
 (0)