Skip to content

Commit 5e0a93e

Browse files
committed
Merge tag 'gpio-fixes-for-v6.0-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux
Pull gpio fixes from Bartosz Golaszewski: - fix a NULL-pointer dereference at driver unbind and a potential resource leak in error path in gpio-mockup - make the irqchip immutable in gpio-ftgpio010 - fix dereferencing a potentially uninitialized variable in gpio-tqmx86 - fix interrupt registering in gpiolib's character device code * tag 'gpio-fixes-for-v6.0-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux: gpiolib: cdev: Set lineevent_state::irq after IRQ register successfully gpio: tqmx86: fix uninitialized variable girq gpio: ftgpio010: Make irqchip immutable gpio: mockup: Fix potential resource leakage when register a chip gpio: mockup: fix NULL pointer dereference when removing debugfs
2 parents 9597f08 + 69bef19 commit 5e0a93e

File tree

4 files changed

+22
-15
lines changed

4 files changed

+22
-15
lines changed

drivers/gpio/gpio-ftgpio010.c

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,12 @@
4141
* struct ftgpio_gpio - Gemini GPIO state container
4242
* @dev: containing device for this instance
4343
* @gc: gpiochip for this instance
44-
* @irq: irqchip for this instance
4544
* @base: remapped I/O-memory base
4645
* @clk: silicon clock
4746
*/
4847
struct ftgpio_gpio {
4948
struct device *dev;
5049
struct gpio_chip gc;
51-
struct irq_chip irq;
5250
void __iomem *base;
5351
struct clk *clk;
5452
};
@@ -70,6 +68,7 @@ static void ftgpio_gpio_mask_irq(struct irq_data *d)
7068
val = readl(g->base + GPIO_INT_EN);
7169
val &= ~BIT(irqd_to_hwirq(d));
7270
writel(val, g->base + GPIO_INT_EN);
71+
gpiochip_disable_irq(gc, irqd_to_hwirq(d));
7372
}
7473

7574
static void ftgpio_gpio_unmask_irq(struct irq_data *d)
@@ -78,6 +77,7 @@ static void ftgpio_gpio_unmask_irq(struct irq_data *d)
7877
struct ftgpio_gpio *g = gpiochip_get_data(gc);
7978
u32 val;
8079

80+
gpiochip_enable_irq(gc, irqd_to_hwirq(d));
8181
val = readl(g->base + GPIO_INT_EN);
8282
val |= BIT(irqd_to_hwirq(d));
8383
writel(val, g->base + GPIO_INT_EN);
@@ -221,6 +221,16 @@ static int ftgpio_gpio_set_config(struct gpio_chip *gc, unsigned int offset,
221221
return 0;
222222
}
223223

224+
static const struct irq_chip ftgpio_irq_chip = {
225+
.name = "FTGPIO010",
226+
.irq_ack = ftgpio_gpio_ack_irq,
227+
.irq_mask = ftgpio_gpio_mask_irq,
228+
.irq_unmask = ftgpio_gpio_unmask_irq,
229+
.irq_set_type = ftgpio_gpio_set_irq_type,
230+
.flags = IRQCHIP_IMMUTABLE,
231+
GPIOCHIP_IRQ_RESOURCE_HELPERS,
232+
};
233+
224234
static int ftgpio_gpio_probe(struct platform_device *pdev)
225235
{
226236
struct device *dev = &pdev->dev;
@@ -277,14 +287,8 @@ static int ftgpio_gpio_probe(struct platform_device *pdev)
277287
if (!IS_ERR(g->clk))
278288
g->gc.set_config = ftgpio_gpio_set_config;
279289

280-
g->irq.name = "FTGPIO010";
281-
g->irq.irq_ack = ftgpio_gpio_ack_irq;
282-
g->irq.irq_mask = ftgpio_gpio_mask_irq;
283-
g->irq.irq_unmask = ftgpio_gpio_unmask_irq;
284-
g->irq.irq_set_type = ftgpio_gpio_set_irq_type;
285-
286290
girq = &g->gc.irq;
287-
girq->chip = &g->irq;
291+
gpio_irq_chip_set_chip(girq, &ftgpio_irq_chip);
288292
girq->parent_handler = ftgpio_gpio_irq_handler;
289293
girq->num_parents = 1;
290294
girq->parents = devm_kcalloc(dev, 1, sizeof(*girq->parents),

drivers/gpio/gpio-mockup.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -533,8 +533,10 @@ static int __init gpio_mockup_register_chip(int idx)
533533
}
534534

535535
fwnode = fwnode_create_software_node(properties, NULL);
536-
if (IS_ERR(fwnode))
536+
if (IS_ERR(fwnode)) {
537+
kfree_strarray(line_names, ngpio);
537538
return PTR_ERR(fwnode);
539+
}
538540

539541
pdevinfo.name = "gpio-mockup";
540542
pdevinfo.id = idx;
@@ -597,9 +599,9 @@ static int __init gpio_mockup_init(void)
597599

598600
static void __exit gpio_mockup_exit(void)
599601
{
602+
gpio_mockup_unregister_pdevs();
600603
debugfs_remove_recursive(gpio_mockup_dbg_dir);
601604
platform_driver_unregister(&gpio_mockup_driver);
602-
gpio_mockup_unregister_pdevs();
603605
}
604606

605607
module_init(gpio_mockup_init);

drivers/gpio/gpio-tqmx86.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,8 @@ static int tqmx86_gpio_probe(struct platform_device *pdev)
307307
girq->default_type = IRQ_TYPE_NONE;
308308
girq->handler = handle_simple_irq;
309309
girq->init_valid_mask = tqmx86_init_irq_valid_mask;
310+
311+
irq_domain_set_pm_device(girq->domain, dev);
310312
}
311313

312314
ret = devm_gpiochip_add_data(dev, chip, gpio);
@@ -315,8 +317,6 @@ static int tqmx86_gpio_probe(struct platform_device *pdev)
315317
goto out_pm_dis;
316318
}
317319

318-
irq_domain_set_pm_device(girq->domain, dev);
319-
320320
dev_info(dev, "GPIO functionality initialized with %d pins\n",
321321
chip->ngpio);
322322

drivers/gpio/gpiolib-cdev.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1986,7 +1986,6 @@ static int lineevent_create(struct gpio_device *gdev, void __user *ip)
19861986
ret = -ENODEV;
19871987
goto out_free_le;
19881988
}
1989-
le->irq = irq;
19901989

19911990
if (eflags & GPIOEVENT_REQUEST_RISING_EDGE)
19921991
irqflags |= test_bit(FLAG_ACTIVE_LOW, &desc->flags) ?
@@ -2000,7 +1999,7 @@ static int lineevent_create(struct gpio_device *gdev, void __user *ip)
20001999
init_waitqueue_head(&le->wait);
20012000

20022001
/* Request a thread to read the events */
2003-
ret = request_threaded_irq(le->irq,
2002+
ret = request_threaded_irq(irq,
20042003
lineevent_irq_handler,
20052004
lineevent_irq_thread,
20062005
irqflags,
@@ -2009,6 +2008,8 @@ static int lineevent_create(struct gpio_device *gdev, void __user *ip)
20092008
if (ret)
20102009
goto out_free_le;
20112010

2011+
le->irq = irq;
2012+
20122013
fd = get_unused_fd_flags(O_RDONLY | O_CLOEXEC);
20132014
if (fd < 0) {
20142015
ret = fd;

0 commit comments

Comments
 (0)