Skip to content

Commit d941a3f

Browse files
committed
Merge tag 'gpio-fixes-for-v6.19-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux
Pull gpio fixes from Bartosz Golaszewski: "Over the last week I received quite an unexpected (for rc7) number of fixes but they are all pretty small and mostly limited to drivers: - don't call into pinctrl when setting direction in gpio-rockchip as it's not needed and may trigger locking context errors - change spinlock to raw_spinlock in gpio-sprd - fix a use-after-free bug in gpio-virtuser - don't register a driver from another driver's probe() in gpio-omap - fix int width problems in GPIO ACPI code - fix interrupt-to-pin mapping in gpio-brcmstb - mask interrupts in irq shutdown in gpio-pca953x" * tag 'gpio-fixes-for-v6.19-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux: gpiolib: acpi: Fix potential out-of-boundary left shift gpio: brcmstb: correct hwirq to bank map gpio: omap: do not register driver in probe() gpio: pca953x: mask interrupts in irq shutdown gpio: virtuser: fix UAF in configfs release path gpiolib: acpi: use BIT_ULL() for u64 mask in address space handler gpio: sprd: Change sprd_gpio lock to raw_spin_lock gpio: rockchip: Stop calling pinctrl for set_direction
2 parents 4327db8 + e64d1cb commit d941a3f

8 files changed

Lines changed: 52 additions & 34 deletions

File tree

drivers/gpio/gpio-brcmstb.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -301,12 +301,10 @@ static struct brcmstb_gpio_bank *brcmstb_gpio_hwirq_to_bank(
301301
struct brcmstb_gpio_priv *priv, irq_hw_number_t hwirq)
302302
{
303303
struct brcmstb_gpio_bank *bank;
304-
int i = 0;
305304

306-
/* banks are in descending order */
307-
list_for_each_entry_reverse(bank, &priv->bank_list, node) {
308-
i += bank->chip.gc.ngpio;
309-
if (hwirq < i)
305+
list_for_each_entry(bank, &priv->bank_list, node) {
306+
if (hwirq >= bank->chip.gc.offset &&
307+
hwirq < (bank->chip.gc.offset + bank->chip.gc.ngpio))
310308
return bank;
311309
}
312310
return NULL;

drivers/gpio/gpio-omap.c

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -799,10 +799,13 @@ static struct platform_device omap_mpuio_device = {
799799

800800
static inline void omap_mpuio_init(struct gpio_bank *bank)
801801
{
802-
platform_set_drvdata(&omap_mpuio_device, bank);
802+
static bool registered;
803803

804-
if (platform_driver_register(&omap_mpuio_driver) == 0)
805-
(void) platform_device_register(&omap_mpuio_device);
804+
platform_set_drvdata(&omap_mpuio_device, bank);
805+
if (!registered) {
806+
(void)platform_device_register(&omap_mpuio_device);
807+
registered = true;
808+
}
806809
}
807810

808811
/*---------------------------------------------------------------------*/
@@ -1575,13 +1578,24 @@ static struct platform_driver omap_gpio_driver = {
15751578
*/
15761579
static int __init omap_gpio_drv_reg(void)
15771580
{
1578-
return platform_driver_register(&omap_gpio_driver);
1581+
int ret;
1582+
1583+
ret = platform_driver_register(&omap_mpuio_driver);
1584+
if (ret)
1585+
return ret;
1586+
1587+
ret = platform_driver_register(&omap_gpio_driver);
1588+
if (ret)
1589+
platform_driver_unregister(&omap_mpuio_driver);
1590+
1591+
return ret;
15791592
}
15801593
postcore_initcall(omap_gpio_drv_reg);
15811594

15821595
static void __exit omap_gpio_exit(void)
15831596
{
15841597
platform_driver_unregister(&omap_gpio_driver);
1598+
platform_driver_unregister(&omap_mpuio_driver);
15851599
}
15861600
module_exit(omap_gpio_exit);
15871601

drivers/gpio/gpio-pca953x.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -914,6 +914,8 @@ static void pca953x_irq_shutdown(struct irq_data *d)
914914
clear_bit(hwirq, chip->irq_trig_fall);
915915
clear_bit(hwirq, chip->irq_trig_level_low);
916916
clear_bit(hwirq, chip->irq_trig_level_high);
917+
918+
pca953x_irq_mask(d);
917919
}
918920

919921
static void pca953x_irq_print_chip(struct irq_data *data, struct seq_file *p)

drivers/gpio/gpio-rockchip.c

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
#include <linux/of.h>
1919
#include <linux/of_address.h>
2020
#include <linux/of_irq.h>
21-
#include <linux/pinctrl/consumer.h>
2221
#include <linux/pinctrl/pinconf-generic.h>
2322
#include <linux/platform_device.h>
2423
#include <linux/regmap.h>
@@ -164,12 +163,6 @@ static int rockchip_gpio_set_direction(struct gpio_chip *chip,
164163
unsigned long flags;
165164
u32 data = input ? 0 : 1;
166165

167-
168-
if (input)
169-
pinctrl_gpio_direction_input(chip, offset);
170-
else
171-
pinctrl_gpio_direction_output(chip, offset);
172-
173166
raw_spin_lock_irqsave(&bank->slock, flags);
174167
rockchip_gpio_writel_bit(bank, offset, data, bank->gpio_regs->port_ddr);
175168
raw_spin_unlock_irqrestore(&bank->slock, flags);
@@ -593,7 +586,6 @@ static int rockchip_gpiolib_register(struct rockchip_pin_bank *bank)
593586
gc->ngpio = bank->nr_pins;
594587
gc->label = bank->name;
595588
gc->parent = bank->dev;
596-
gc->can_sleep = true;
597589

598590
ret = gpiochip_add_data(gc, bank);
599591
if (ret) {

drivers/gpio/gpio-sprd.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
struct sprd_gpio {
3636
struct gpio_chip chip;
3737
void __iomem *base;
38-
spinlock_t lock;
38+
raw_spinlock_t lock;
3939
int irq;
4040
};
4141

@@ -54,7 +54,7 @@ static void sprd_gpio_update(struct gpio_chip *chip, unsigned int offset,
5454
unsigned long flags;
5555
u32 tmp;
5656

57-
spin_lock_irqsave(&sprd_gpio->lock, flags);
57+
raw_spin_lock_irqsave(&sprd_gpio->lock, flags);
5858
tmp = readl_relaxed(base + reg);
5959

6060
if (val)
@@ -63,7 +63,7 @@ static void sprd_gpio_update(struct gpio_chip *chip, unsigned int offset,
6363
tmp &= ~BIT(SPRD_GPIO_BIT(offset));
6464

6565
writel_relaxed(tmp, base + reg);
66-
spin_unlock_irqrestore(&sprd_gpio->lock, flags);
66+
raw_spin_unlock_irqrestore(&sprd_gpio->lock, flags);
6767
}
6868

6969
static int sprd_gpio_read(struct gpio_chip *chip, unsigned int offset, u16 reg)
@@ -236,7 +236,7 @@ static int sprd_gpio_probe(struct platform_device *pdev)
236236
if (IS_ERR(sprd_gpio->base))
237237
return PTR_ERR(sprd_gpio->base);
238238

239-
spin_lock_init(&sprd_gpio->lock);
239+
raw_spin_lock_init(&sprd_gpio->lock);
240240

241241
sprd_gpio->chip.label = dev_name(&pdev->dev);
242242
sprd_gpio->chip.ngpio = SPRD_GPIO_NR;

drivers/gpio/gpio-virtuser.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1682,10 +1682,10 @@ static void gpio_virtuser_device_config_group_release(struct config_item *item)
16821682
{
16831683
struct gpio_virtuser_device *dev = to_gpio_virtuser_device(item);
16841684

1685-
guard(mutex)(&dev->lock);
1686-
1687-
if (gpio_virtuser_device_is_live(dev))
1688-
gpio_virtuser_device_deactivate(dev);
1685+
scoped_guard(mutex, &dev->lock) {
1686+
if (gpio_virtuser_device_is_live(dev))
1687+
gpio_virtuser_device_deactivate(dev);
1688+
}
16891689

16901690
mutex_destroy(&dev->lock);
16911691
ida_free(&gpio_virtuser_ida, dev->id);

drivers/gpio/gpiolib-acpi-core.c

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1104,6 +1104,7 @@ acpi_gpio_adr_space_handler(u32 function, acpi_physical_address address,
11041104
unsigned int pin = agpio->pin_table[i];
11051105
struct acpi_gpio_connection *conn;
11061106
struct gpio_desc *desc;
1107+
u16 word, shift;
11071108
bool found;
11081109

11091110
mutex_lock(&achip->conn_lock);
@@ -1158,10 +1159,22 @@ acpi_gpio_adr_space_handler(u32 function, acpi_physical_address address,
11581159

11591160
mutex_unlock(&achip->conn_lock);
11601161

1161-
if (function == ACPI_WRITE)
1162-
gpiod_set_raw_value_cansleep(desc, !!(*value & BIT(i)));
1163-
else
1164-
*value |= (u64)gpiod_get_raw_value_cansleep(desc) << i;
1162+
/*
1163+
* For the cases when OperationRegion() consists of more than
1164+
* 64 bits calculate the word and bit shift to use that one to
1165+
* access the value.
1166+
*/
1167+
word = i / 64;
1168+
shift = i % 64;
1169+
1170+
if (function == ACPI_WRITE) {
1171+
gpiod_set_raw_value_cansleep(desc, value[word] & BIT_ULL(shift));
1172+
} else {
1173+
if (gpiod_get_raw_value_cansleep(desc))
1174+
value[word] |= BIT_ULL(shift);
1175+
else
1176+
value[word] &= ~BIT_ULL(shift);
1177+
}
11651178
}
11661179

11671180
out:

drivers/pinctrl/pinctrl-rockchip.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3545,10 +3545,9 @@ static int rockchip_pmx_set(struct pinctrl_dev *pctldev, unsigned selector,
35453545
return 0;
35463546
}
35473547

3548-
static int rockchip_pmx_gpio_set_direction(struct pinctrl_dev *pctldev,
3549-
struct pinctrl_gpio_range *range,
3550-
unsigned offset,
3551-
bool input)
3548+
static int rockchip_pmx_gpio_request_enable(struct pinctrl_dev *pctldev,
3549+
struct pinctrl_gpio_range *range,
3550+
unsigned int offset)
35523551
{
35533552
struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
35543553
struct rockchip_pin_bank *bank;
@@ -3562,7 +3561,7 @@ static const struct pinmux_ops rockchip_pmx_ops = {
35623561
.get_function_name = rockchip_pmx_get_func_name,
35633562
.get_function_groups = rockchip_pmx_get_groups,
35643563
.set_mux = rockchip_pmx_set,
3565-
.gpio_set_direction = rockchip_pmx_gpio_set_direction,
3564+
.gpio_request_enable = rockchip_pmx_gpio_request_enable,
35663565
};
35673566

35683567
/*

0 commit comments

Comments
 (0)