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

+52 -34
+3 -5
drivers/gpio/gpio-brcmstb.c
··· 301 struct brcmstb_gpio_priv *priv, irq_hw_number_t hwirq) 302 { 303 struct brcmstb_gpio_bank *bank; 304 - int i = 0; 305 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) 310 return bank; 311 } 312 return NULL;
··· 301 struct brcmstb_gpio_priv *priv, irq_hw_number_t hwirq) 302 { 303 struct brcmstb_gpio_bank *bank; 304 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)) 308 return bank; 309 } 310 return NULL;
+18 -4
drivers/gpio/gpio-omap.c
··· 799 800 static inline void omap_mpuio_init(struct gpio_bank *bank) 801 { 802 - platform_set_drvdata(&omap_mpuio_device, bank); 803 804 - if (platform_driver_register(&omap_mpuio_driver) == 0) 805 - (void) platform_device_register(&omap_mpuio_device); 806 } 807 808 /*---------------------------------------------------------------------*/ ··· 1578 */ 1579 static int __init omap_gpio_drv_reg(void) 1580 { 1581 - return platform_driver_register(&omap_gpio_driver); 1582 } 1583 postcore_initcall(omap_gpio_drv_reg); 1584 1585 static void __exit omap_gpio_exit(void) 1586 { 1587 platform_driver_unregister(&omap_gpio_driver); 1588 } 1589 module_exit(omap_gpio_exit); 1590
··· 799 800 static inline void omap_mpuio_init(struct gpio_bank *bank) 801 { 802 + static bool registered; 803 804 + platform_set_drvdata(&omap_mpuio_device, bank); 805 + if (!registered) { 806 + (void)platform_device_register(&omap_mpuio_device); 807 + registered = true; 808 + } 809 } 810 811 /*---------------------------------------------------------------------*/ ··· 1575 */ 1576 static int __init omap_gpio_drv_reg(void) 1577 { 1578 + int ret; 1579 + 1580 + ret = platform_driver_register(&omap_mpuio_driver); 1581 + if (ret) 1582 + return ret; 1583 + 1584 + ret = platform_driver_register(&omap_gpio_driver); 1585 + if (ret) 1586 + platform_driver_unregister(&omap_mpuio_driver); 1587 + 1588 + return ret; 1589 } 1590 postcore_initcall(omap_gpio_drv_reg); 1591 1592 static void __exit omap_gpio_exit(void) 1593 { 1594 platform_driver_unregister(&omap_gpio_driver); 1595 + platform_driver_unregister(&omap_mpuio_driver); 1596 } 1597 module_exit(omap_gpio_exit); 1598
+2
drivers/gpio/gpio-pca953x.c
··· 914 clear_bit(hwirq, chip->irq_trig_fall); 915 clear_bit(hwirq, chip->irq_trig_level_low); 916 clear_bit(hwirq, chip->irq_trig_level_high); 917 } 918 919 static void pca953x_irq_print_chip(struct irq_data *data, struct seq_file *p)
··· 914 clear_bit(hwirq, chip->irq_trig_fall); 915 clear_bit(hwirq, chip->irq_trig_level_low); 916 clear_bit(hwirq, chip->irq_trig_level_high); 917 + 918 + pca953x_irq_mask(d); 919 } 920 921 static void pca953x_irq_print_chip(struct irq_data *data, struct seq_file *p)
-8
drivers/gpio/gpio-rockchip.c
··· 18 #include <linux/of.h> 19 #include <linux/of_address.h> 20 #include <linux/of_irq.h> 21 - #include <linux/pinctrl/consumer.h> 22 #include <linux/pinctrl/pinconf-generic.h> 23 #include <linux/platform_device.h> 24 #include <linux/regmap.h> ··· 162 struct rockchip_pin_bank *bank = gpiochip_get_data(chip); 163 unsigned long flags; 164 u32 data = input ? 0 : 1; 165 - 166 - 167 - if (input) 168 - pinctrl_gpio_direction_input(chip, offset); 169 - else 170 - pinctrl_gpio_direction_output(chip, offset); 171 172 raw_spin_lock_irqsave(&bank->slock, flags); 173 rockchip_gpio_writel_bit(bank, offset, data, bank->gpio_regs->port_ddr); ··· 586 gc->ngpio = bank->nr_pins; 587 gc->label = bank->name; 588 gc->parent = bank->dev; 589 - gc->can_sleep = true; 590 591 ret = gpiochip_add_data(gc, bank); 592 if (ret) {
··· 18 #include <linux/of.h> 19 #include <linux/of_address.h> 20 #include <linux/of_irq.h> 21 #include <linux/pinctrl/pinconf-generic.h> 22 #include <linux/platform_device.h> 23 #include <linux/regmap.h> ··· 163 struct rockchip_pin_bank *bank = gpiochip_get_data(chip); 164 unsigned long flags; 165 u32 data = input ? 0 : 1; 166 167 raw_spin_lock_irqsave(&bank->slock, flags); 168 rockchip_gpio_writel_bit(bank, offset, data, bank->gpio_regs->port_ddr); ··· 593 gc->ngpio = bank->nr_pins; 594 gc->label = bank->name; 595 gc->parent = bank->dev; 596 597 ret = gpiochip_add_data(gc, bank); 598 if (ret) {
+4 -4
drivers/gpio/gpio-sprd.c
··· 35 struct sprd_gpio { 36 struct gpio_chip chip; 37 void __iomem *base; 38 - spinlock_t lock; 39 int irq; 40 }; 41 ··· 54 unsigned long flags; 55 u32 tmp; 56 57 - spin_lock_irqsave(&sprd_gpio->lock, flags); 58 tmp = readl_relaxed(base + reg); 59 60 if (val) ··· 63 tmp &= ~BIT(SPRD_GPIO_BIT(offset)); 64 65 writel_relaxed(tmp, base + reg); 66 - spin_unlock_irqrestore(&sprd_gpio->lock, flags); 67 } 68 69 static int sprd_gpio_read(struct gpio_chip *chip, unsigned int offset, u16 reg) ··· 236 if (IS_ERR(sprd_gpio->base)) 237 return PTR_ERR(sprd_gpio->base); 238 239 - spin_lock_init(&sprd_gpio->lock); 240 241 sprd_gpio->chip.label = dev_name(&pdev->dev); 242 sprd_gpio->chip.ngpio = SPRD_GPIO_NR;
··· 35 struct sprd_gpio { 36 struct gpio_chip chip; 37 void __iomem *base; 38 + raw_spinlock_t lock; 39 int irq; 40 }; 41 ··· 54 unsigned long flags; 55 u32 tmp; 56 57 + raw_spin_lock_irqsave(&sprd_gpio->lock, flags); 58 tmp = readl_relaxed(base + reg); 59 60 if (val) ··· 63 tmp &= ~BIT(SPRD_GPIO_BIT(offset)); 64 65 writel_relaxed(tmp, base + reg); 66 + raw_spin_unlock_irqrestore(&sprd_gpio->lock, flags); 67 } 68 69 static int sprd_gpio_read(struct gpio_chip *chip, unsigned int offset, u16 reg) ··· 236 if (IS_ERR(sprd_gpio->base)) 237 return PTR_ERR(sprd_gpio->base); 238 239 + raw_spin_lock_init(&sprd_gpio->lock); 240 241 sprd_gpio->chip.label = dev_name(&pdev->dev); 242 sprd_gpio->chip.ngpio = SPRD_GPIO_NR;
+4 -4
drivers/gpio/gpio-virtuser.c
··· 1682 { 1683 struct gpio_virtuser_device *dev = to_gpio_virtuser_device(item); 1684 1685 - guard(mutex)(&dev->lock); 1686 - 1687 - if (gpio_virtuser_device_is_live(dev)) 1688 - gpio_virtuser_device_deactivate(dev); 1689 1690 mutex_destroy(&dev->lock); 1691 ida_free(&gpio_virtuser_ida, dev->id);
··· 1682 { 1683 struct gpio_virtuser_device *dev = to_gpio_virtuser_device(item); 1684 1685 + scoped_guard(mutex, &dev->lock) { 1686 + if (gpio_virtuser_device_is_live(dev)) 1687 + gpio_virtuser_device_deactivate(dev); 1688 + } 1689 1690 mutex_destroy(&dev->lock); 1691 ida_free(&gpio_virtuser_ida, dev->id);
+17 -4
drivers/gpio/gpiolib-acpi-core.c
··· 1104 unsigned int pin = agpio->pin_table[i]; 1105 struct acpi_gpio_connection *conn; 1106 struct gpio_desc *desc; 1107 bool found; 1108 1109 mutex_lock(&achip->conn_lock); ··· 1159 1160 mutex_unlock(&achip->conn_lock); 1161 1162 - if (function == ACPI_WRITE) 1163 - gpiod_set_raw_value_cansleep(desc, !!(*value & BIT(i))); 1164 - else 1165 - *value |= (u64)gpiod_get_raw_value_cansleep(desc) << i; 1166 } 1167 1168 out:
··· 1104 unsigned int pin = agpio->pin_table[i]; 1105 struct acpi_gpio_connection *conn; 1106 struct gpio_desc *desc; 1107 + u16 word, shift; 1108 bool found; 1109 1110 mutex_lock(&achip->conn_lock); ··· 1158 1159 mutex_unlock(&achip->conn_lock); 1160 1161 + /* 1162 + * For the cases when OperationRegion() consists of more than 1163 + * 64 bits calculate the word and bit shift to use that one to 1164 + * access the value. 1165 + */ 1166 + word = i / 64; 1167 + shift = i % 64; 1168 + 1169 + if (function == ACPI_WRITE) { 1170 + gpiod_set_raw_value_cansleep(desc, value[word] & BIT_ULL(shift)); 1171 + } else { 1172 + if (gpiod_get_raw_value_cansleep(desc)) 1173 + value[word] |= BIT_ULL(shift); 1174 + else 1175 + value[word] &= ~BIT_ULL(shift); 1176 + } 1177 } 1178 1179 out:
+4 -5
drivers/pinctrl/pinctrl-rockchip.c
··· 3545 return 0; 3546 } 3547 3548 - static int rockchip_pmx_gpio_set_direction(struct pinctrl_dev *pctldev, 3549 - struct pinctrl_gpio_range *range, 3550 - unsigned offset, 3551 - bool input) 3552 { 3553 struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev); 3554 struct rockchip_pin_bank *bank; ··· 3561 .get_function_name = rockchip_pmx_get_func_name, 3562 .get_function_groups = rockchip_pmx_get_groups, 3563 .set_mux = rockchip_pmx_set, 3564 - .gpio_set_direction = rockchip_pmx_gpio_set_direction, 3565 }; 3566 3567 /*
··· 3545 return 0; 3546 } 3547 3548 + static int rockchip_pmx_gpio_request_enable(struct pinctrl_dev *pctldev, 3549 + struct pinctrl_gpio_range *range, 3550 + unsigned int offset) 3551 { 3552 struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev); 3553 struct rockchip_pin_bank *bank; ··· 3562 .get_function_name = rockchip_pmx_get_func_name, 3563 .get_function_groups = rockchip_pmx_get_groups, 3564 .set_mux = rockchip_pmx_set, 3565 + .gpio_request_enable = rockchip_pmx_gpio_request_enable, 3566 }; 3567 3568 /*