Commit 900db150 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull GPIO fixes from Linus Walleij:
 "Here are some (very) late fixes for GPIO, none of them very serious
  except the one tagged for stable for enabling IRQ on open drain lines:

   - Fix probing of mvebu chips without PWM

   - Fix error path on ida_get_simple() on the exar driver

   - Notify userspace properly about line status changes when flags are
     changed on lines.

   - Fix a sleeping while holding spinlock in the mellanox driver.

   - Fix return value of the PXA and Kona probe calls.

   - Fix IRQ locking of open drain lines, it is fine to have IRQs on
     open drain lines flagged for output"

* tag 'gpio-v5.7-3' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio:
  gpio: fix locking open drain IRQ lines
  gpio: bcm-kona: Fix return value of bcm_kona_gpio_probe()
  gpio: pxa: Fix return value of pxa_gpio_probe()
  gpio: mlxbf2: Fix sleeping while holding spinlock
  gpiolib: notify user-space about line status changes after flags are set
  gpio: exar: Fix bad handling for ida_simple_get error path
  gpio: mvebu: Fix probing for chips without PWM
parents 86852175 e9bdf7e6
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -625,7 +625,7 @@ static int bcm_kona_gpio_probe(struct platform_device *pdev)

	kona_gpio->reg_base = devm_platform_ioremap_resource(pdev, 0);
	if (IS_ERR(kona_gpio->reg_base)) {
		ret = -ENXIO;
		ret = PTR_ERR(kona_gpio->reg_base);
		goto err_irq_domain;
	}

+5 −2
Original line number Diff line number Diff line
@@ -148,8 +148,10 @@ static int gpio_exar_probe(struct platform_device *pdev)
	mutex_init(&exar_gpio->lock);

	index = ida_simple_get(&ida_index, 0, 0, GFP_KERNEL);
	if (index < 0)
		goto err_destroy;
	if (index < 0) {
		ret = index;
		goto err_mutex_destroy;
	}

	sprintf(exar_gpio->name, "exar_gpio%d", index);
	exar_gpio->gpio_chip.label = exar_gpio->name;
@@ -176,6 +178,7 @@ static int gpio_exar_probe(struct platform_device *pdev)

err_destroy:
	ida_simple_remove(&ida_index, index);
err_mutex_destroy:
	mutex_destroy(&exar_gpio->lock);
	return ret;
}
+3 −3
Original line number Diff line number Diff line
@@ -127,8 +127,8 @@ static int mlxbf2_gpio_lock_acquire(struct mlxbf2_gpio_context *gs)
{
	u32 arm_gpio_lock_val;

	spin_lock(&gs->gc.bgpio_lock);
	mutex_lock(yu_arm_gpio_lock_param.lock);
	spin_lock(&gs->gc.bgpio_lock);

	arm_gpio_lock_val = readl(yu_arm_gpio_lock_param.io);

@@ -136,8 +136,8 @@ static int mlxbf2_gpio_lock_acquire(struct mlxbf2_gpio_context *gs)
	 * When lock active bit[31] is set, ModeX is write enabled
	 */
	if (YU_LOCK_ACTIVE_BIT(arm_gpio_lock_val)) {
		mutex_unlock(yu_arm_gpio_lock_param.lock);
		spin_unlock(&gs->gc.bgpio_lock);
		mutex_unlock(yu_arm_gpio_lock_param.lock);
		return -EINVAL;
	}

@@ -152,8 +152,8 @@ static int mlxbf2_gpio_lock_acquire(struct mlxbf2_gpio_context *gs)
static void mlxbf2_gpio_lock_release(struct mlxbf2_gpio_context *gs)
{
	writel(YU_ARM_GPIO_LOCK_RELEASE, yu_arm_gpio_lock_param.io);
	mutex_unlock(yu_arm_gpio_lock_param.lock);
	spin_unlock(&gs->gc.bgpio_lock);
	mutex_unlock(yu_arm_gpio_lock_param.lock);
}

/*
+9 −6
Original line number Diff line number Diff line
@@ -782,6 +782,15 @@ static int mvebu_pwm_probe(struct platform_device *pdev,
				     "marvell,armada-370-gpio"))
		return 0;

	/*
	 * There are only two sets of PWM configuration registers for
	 * all the GPIO lines on those SoCs which this driver reserves
	 * for the first two GPIO chips. So if the resource is missing
	 * we can't treat it as an error.
	 */
	if (!platform_get_resource_byname(pdev, IORESOURCE_MEM, "pwm"))
		return 0;

	if (IS_ERR(mvchip->clk))
		return PTR_ERR(mvchip->clk);

@@ -804,12 +813,6 @@ static int mvebu_pwm_probe(struct platform_device *pdev,
	mvchip->mvpwm = mvpwm;
	mvpwm->mvchip = mvchip;

	/*
	 * There are only two sets of PWM configuration registers for
	 * all the GPIO lines on those SoCs which this driver reserves
	 * for the first two GPIO chips. So if the resource is missing
	 * we can't treat it as an error.
	 */
	mvpwm->membase = devm_platform_ioremap_resource_byname(pdev, "pwm");
	if (IS_ERR(mvpwm->membase))
		return PTR_ERR(mvpwm->membase);
+2 −2
Original line number Diff line number Diff line
@@ -660,8 +660,8 @@ static int pxa_gpio_probe(struct platform_device *pdev)
	pchip->irq1 = irq1;

	gpio_reg_base = devm_platform_ioremap_resource(pdev, 0);
	if (!gpio_reg_base)
		return -EINVAL;
	if (IS_ERR(gpio_reg_base))
		return PTR_ERR(gpio_reg_base);

	clk = clk_get(&pdev->dev, NULL);
	if (IS_ERR(clk)) {
Loading