Commit d941a3f6 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

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
parents 4327db89 e64d1cb2
Loading
Loading
Loading
Loading
+3 −5
Original line number Diff line number Diff line
@@ -301,12 +301,10 @@ static struct brcmstb_gpio_bank *brcmstb_gpio_hwirq_to_bank(
		struct brcmstb_gpio_priv *priv, irq_hw_number_t hwirq)
{
	struct brcmstb_gpio_bank *bank;
	int i = 0;

	/* banks are in descending order */
	list_for_each_entry_reverse(bank, &priv->bank_list, node) {
		i += bank->chip.gc.ngpio;
		if (hwirq < i)
	list_for_each_entry(bank, &priv->bank_list, node) {
		if (hwirq >= bank->chip.gc.offset &&
		    hwirq < (bank->chip.gc.offset + bank->chip.gc.ngpio))
			return bank;
	}
	return NULL;
+18 −4
Original line number Diff line number Diff line
@@ -799,10 +799,13 @@ static struct platform_device omap_mpuio_device = {

static inline void omap_mpuio_init(struct gpio_bank *bank)
{
	platform_set_drvdata(&omap_mpuio_device, bank);
	static bool registered;

	if (platform_driver_register(&omap_mpuio_driver) == 0)
	platform_set_drvdata(&omap_mpuio_device, bank);
	if (!registered) {
		(void)platform_device_register(&omap_mpuio_device);
		registered = true;
	}
}

/*---------------------------------------------------------------------*/
@@ -1575,13 +1578,24 @@ static struct platform_driver omap_gpio_driver = {
 */
static int __init omap_gpio_drv_reg(void)
{
	return platform_driver_register(&omap_gpio_driver);
	int ret;

	ret = platform_driver_register(&omap_mpuio_driver);
	if (ret)
		return ret;

	ret = platform_driver_register(&omap_gpio_driver);
	if (ret)
		platform_driver_unregister(&omap_mpuio_driver);

	return ret;
}
postcore_initcall(omap_gpio_drv_reg);

static void __exit omap_gpio_exit(void)
{
	platform_driver_unregister(&omap_gpio_driver);
	platform_driver_unregister(&omap_mpuio_driver);
}
module_exit(omap_gpio_exit);

+2 −0
Original line number Diff line number Diff line
@@ -914,6 +914,8 @@ static void pca953x_irq_shutdown(struct irq_data *d)
	clear_bit(hwirq, chip->irq_trig_fall);
	clear_bit(hwirq, chip->irq_trig_level_low);
	clear_bit(hwirq, chip->irq_trig_level_high);

	pca953x_irq_mask(d);
}

static void pca953x_irq_print_chip(struct irq_data *data, struct seq_file *p)
+0 −8
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/of_irq.h>
#include <linux/pinctrl/consumer.h>
#include <linux/pinctrl/pinconf-generic.h>
#include <linux/platform_device.h>
#include <linux/regmap.h>
@@ -164,12 +163,6 @@ static int rockchip_gpio_set_direction(struct gpio_chip *chip,
	unsigned long flags;
	u32 data = input ? 0 : 1;


	if (input)
		pinctrl_gpio_direction_input(chip, offset);
	else
		pinctrl_gpio_direction_output(chip, offset);

	raw_spin_lock_irqsave(&bank->slock, flags);
	rockchip_gpio_writel_bit(bank, offset, data, bank->gpio_regs->port_ddr);
	raw_spin_unlock_irqrestore(&bank->slock, flags);
@@ -593,7 +586,6 @@ static int rockchip_gpiolib_register(struct rockchip_pin_bank *bank)
	gc->ngpio = bank->nr_pins;
	gc->label = bank->name;
	gc->parent = bank->dev;
	gc->can_sleep = true;

	ret = gpiochip_add_data(gc, bank);
	if (ret) {
+4 −4
Original line number Diff line number Diff line
@@ -35,7 +35,7 @@
struct sprd_gpio {
	struct gpio_chip chip;
	void __iomem *base;
	spinlock_t lock;
	raw_spinlock_t lock;
	int irq;
};

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

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

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

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

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)
	if (IS_ERR(sprd_gpio->base))
		return PTR_ERR(sprd_gpio->base);

	spin_lock_init(&sprd_gpio->lock);
	raw_spin_lock_init(&sprd_gpio->lock);

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