Commit 36eccdb5 authored by Linus Walleij's avatar Linus Walleij
Browse files

Merge tag 'gpio-updates-for-v5.10-part1' of...

Merge tag 'gpio-updates-for-v5.10-part1' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux into devel

gpio updates for v5.10 - part 1

- automatically drive GPHY leds in gpio-stp-xway
- refactor ->{get, set}_multiple() in gpio-aggregator
- add support for a new model in rcar-gpio DT bindings
- simplify several GPIO drivers with dev_err_probe()
- disable Direct KBD interrupts in gpio-tc35894
- use DEFINE_SEQ_ATTRIBUTE() in GPIO chardev to shrink code
- switch to using a simpler IDA API in gpiolib
- make devprop_gpiochip_set_names() more generic by using device properties
  instead of using fwnode helpers
parents 0a2d411b 587823d3
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ properties:
              - renesas,gpio-r8a774a1     # RZ/G2M
              - renesas,gpio-r8a774b1     # RZ/G2N
              - renesas,gpio-r8a774c0     # RZ/G2E
              - renesas,gpio-r8a774e1     # RZ/G2H
              - renesas,gpio-r8a7795      # R-Car H3
              - renesas,gpio-r8a7796      # R-Car M3-W
              - renesas,gpio-r8a77961     # R-Car M3-W+
+0 −1
Original line number Diff line number Diff line
@@ -6,7 +6,6 @@ ccflags-$(CONFIG_DEBUG_GPIO) += -DDEBUG
obj-$(CONFIG_GPIOLIB)		+= gpiolib.o
obj-$(CONFIG_GPIOLIB)		+= gpiolib-devres.o
obj-$(CONFIG_GPIOLIB)		+= gpiolib-legacy.o
obj-$(CONFIG_GPIOLIB)		+= gpiolib-devprop.o
obj-$(CONFIG_GPIOLIB)		+= gpiolib-cdev.o
obj-$(CONFIG_OF_GPIO)		+= gpiolib-of.o
obj-$(CONFIG_GPIO_SYSFS)	+= gpiolib-sysfs.o
+43 −27
Original line number Diff line number Diff line
@@ -333,20 +333,14 @@ static int gpio_fwd_get(struct gpio_chip *chip, unsigned int offset)
	return gpiod_get_value(fwd->descs[offset]);
}

static int gpio_fwd_get_multiple(struct gpio_chip *chip, unsigned long *mask,
static int gpio_fwd_get_multiple(struct gpiochip_fwd *fwd, unsigned long *mask,
				 unsigned long *bits)
{
	struct gpiochip_fwd *fwd = gpiochip_get_data(chip);
	unsigned long *values, flags = 0;
	struct gpio_desc **descs;
	unsigned long *values;
	unsigned int i, j = 0;
	int error;

	if (chip->can_sleep)
		mutex_lock(&fwd->mlock);
	else
		spin_lock_irqsave(&fwd->slock, flags);

	/* Both values bitmap and desc pointers are stored in tmp[] */
	values = &fwd->tmp[0];
	descs = (void *)&fwd->tmp[BITS_TO_LONGS(fwd->chip.ngpio)];
@@ -356,16 +350,32 @@ static int gpio_fwd_get_multiple(struct gpio_chip *chip, unsigned long *mask,
		descs[j++] = fwd->descs[i];

	error = gpiod_get_array_value(j, descs, NULL, values);
	if (!error) {
	if (error)
		return error;

	j = 0;
	for_each_set_bit(i, mask, fwd->chip.ngpio)
		__assign_bit(i, bits, test_bit(j++, values));

	return 0;
}

	if (chip->can_sleep)
static int gpio_fwd_get_multiple_locked(struct gpio_chip *chip,
					unsigned long *mask, unsigned long *bits)
{
	struct gpiochip_fwd *fwd = gpiochip_get_data(chip);
	unsigned long flags;
	int error;

	if (chip->can_sleep) {
		mutex_lock(&fwd->mlock);
		error = gpio_fwd_get_multiple(fwd, mask, bits);
		mutex_unlock(&fwd->mlock);
	else
	} else {
		spin_lock_irqsave(&fwd->slock, flags);
		error = gpio_fwd_get_multiple(fwd, mask, bits);
		spin_unlock_irqrestore(&fwd->slock, flags);
	}

	return error;
}
@@ -377,19 +387,13 @@ static void gpio_fwd_set(struct gpio_chip *chip, unsigned int offset, int value)
	gpiod_set_value(fwd->descs[offset], value);
}

static void gpio_fwd_set_multiple(struct gpio_chip *chip, unsigned long *mask,
static void gpio_fwd_set_multiple(struct gpiochip_fwd *fwd, unsigned long *mask,
				  unsigned long *bits)
{
	struct gpiochip_fwd *fwd = gpiochip_get_data(chip);
	unsigned long *values, flags = 0;
	struct gpio_desc **descs;
	unsigned long *values;
	unsigned int i, j = 0;

	if (chip->can_sleep)
		mutex_lock(&fwd->mlock);
	else
		spin_lock_irqsave(&fwd->slock, flags);

	/* Both values bitmap and desc pointers are stored in tmp[] */
	values = &fwd->tmp[0];
	descs = (void *)&fwd->tmp[BITS_TO_LONGS(fwd->chip.ngpio)];
@@ -400,12 +404,24 @@ static void gpio_fwd_set_multiple(struct gpio_chip *chip, unsigned long *mask,
	}

	gpiod_set_array_value(j, descs, NULL, values);
}

	if (chip->can_sleep)
static void gpio_fwd_set_multiple_locked(struct gpio_chip *chip,
					 unsigned long *mask, unsigned long *bits)
{
	struct gpiochip_fwd *fwd = gpiochip_get_data(chip);
	unsigned long flags;

	if (chip->can_sleep) {
		mutex_lock(&fwd->mlock);
		gpio_fwd_set_multiple(fwd, mask, bits);
		mutex_unlock(&fwd->mlock);
	else
	} else {
		spin_lock_irqsave(&fwd->slock, flags);
		gpio_fwd_set_multiple(fwd, mask, bits);
		spin_unlock_irqrestore(&fwd->slock, flags);
	}
}

static int gpio_fwd_set_config(struct gpio_chip *chip, unsigned int offset,
			       unsigned long config)
@@ -470,9 +486,9 @@ static struct gpiochip_fwd *gpiochip_fwd_create(struct device *dev,
	chip->direction_input = gpio_fwd_direction_input;
	chip->direction_output = gpio_fwd_direction_output;
	chip->get = gpio_fwd_get;
	chip->get_multiple = gpio_fwd_get_multiple;
	chip->get_multiple = gpio_fwd_get_multiple_locked;
	chip->set = gpio_fwd_set;
	chip->set_multiple = gpio_fwd_set_multiple;
	chip->set_multiple = gpio_fwd_set_multiple_locked;
	chip->base = -1;
	chip->ngpio = ngpios;
	fwd->descs = descs;
+1 −4
Original line number Diff line number Diff line
@@ -590,10 +590,7 @@ static int bcm_kona_gpio_probe(struct platform_device *pdev)
		dev_err(dev, "Couldn't determine # GPIO banks\n");
		return -ENOENT;
	} else if (ret < 0) {
		if (ret != -EPROBE_DEFER)
			dev_err(dev, "Couldn't determine GPIO banks: (%pe)\n",
				ERR_PTR(ret));
		return ret;
		return dev_err_probe(dev, ret, "Couldn't determine GPIO banks\n");
	}
	kona_gpio->num_bank = ret;

+2 −6
Original line number Diff line number Diff line
@@ -237,12 +237,8 @@ static int davinci_gpio_probe(struct platform_device *pdev)

	for (i = 0; i < nirq; i++) {
		chips->irqs[i] = platform_get_irq(pdev, i);
		if (chips->irqs[i] < 0) {
			if (chips->irqs[i] != -EPROBE_DEFER)
				dev_info(dev, "IRQ not populated, err = %d\n",
					 chips->irqs[i]);
			return chips->irqs[i];
		}
		if (chips->irqs[i] < 0)
			return dev_err_probe(dev, chips->irqs[i], "IRQ not populated\n");
	}

	chips->chip.label = dev_name(dev);
Loading