Merge tag 'gpio-v4.9-4' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio
Pull GPIO fixes from Linus Walleij: "These are hopefully the last GPIO fixes for v4.9. The most important is that it fixes the UML randconfig builds that have been nagging me for some time and me being confused about where the problem was really sitting, now this fix give this nice feeling that everything is solid and builds fine. Summary: - Finally, after being puzzled by a bunch of recurrent UML build failures on randconfigs from the build robot, Keno Fischer nailed it: GPIO_DEVRES is optional and depends on HAS_IOMEM even though many users just unconditionally rely on it to be available. And it *should* be available: garbage collection is nice for this and it *certainly* has nothing to do with having IOMEM. So we got rid of it, and now the UML builds should JustWork(TM). - Do not call .get_direction() on sleeping GPIO chips on the fastpath when locking GPIOs for interrupts: it is done from atomic context, no way. - Some driver fixes" * tag 'gpio-v4.9-4' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio: gpio: Remove GPIO_DEVRES option gpio: tc3589x: fix up .get_direction() gpio: do not double-check direction on sleeping chips gpio: pca953x: Move memcpy into mutex lock for set multiple gpio: pca953x: Fix corruption of other gpios in set_multiple.
This commit is contained in:
@@ -22,10 +22,6 @@ menuconfig GPIOLIB
|
||||
|
||||
if GPIOLIB
|
||||
|
||||
config GPIO_DEVRES
|
||||
def_bool y
|
||||
depends on HAS_IOMEM
|
||||
|
||||
config OF_GPIO
|
||||
def_bool y
|
||||
depends on OF
|
||||
|
@@ -2,7 +2,7 @@
|
||||
|
||||
ccflags-$(CONFIG_DEBUG_GPIO) += -DDEBUG
|
||||
|
||||
obj-$(CONFIG_GPIO_DEVRES) += devres.o
|
||||
obj-$(CONFIG_GPIOLIB) += devres.o
|
||||
obj-$(CONFIG_GPIOLIB) += gpiolib.o
|
||||
obj-$(CONFIG_GPIOLIB) += gpiolib-legacy.o
|
||||
obj-$(CONFIG_OF_GPIO) += gpiolib-of.o
|
||||
|
@@ -372,14 +372,15 @@ static void pca953x_gpio_set_multiple(struct gpio_chip *gc,
|
||||
|
||||
bank_shift = fls((chip->gpio_chip.ngpio - 1) / BANK_SZ);
|
||||
|
||||
memcpy(reg_val, chip->reg_output, NBANK(chip));
|
||||
mutex_lock(&chip->i2c_lock);
|
||||
memcpy(reg_val, chip->reg_output, NBANK(chip));
|
||||
for (bank = 0; bank < NBANK(chip); bank++) {
|
||||
bank_mask = mask[bank / sizeof(*mask)] >>
|
||||
((bank % sizeof(*mask)) * 8);
|
||||
if (bank_mask) {
|
||||
bank_val = bits[bank / sizeof(*bits)] >>
|
||||
((bank % sizeof(*bits)) * 8);
|
||||
bank_val &= bank_mask;
|
||||
reg_val[bank] = (reg_val[bank] & ~bank_mask) | bank_val;
|
||||
}
|
||||
}
|
||||
@@ -607,7 +608,6 @@ static int pca953x_irq_setup(struct pca953x_chip *chip,
|
||||
|
||||
if (client->irq && irq_base != -1
|
||||
&& (chip->driver_data & PCA_INT)) {
|
||||
|
||||
ret = pca953x_read_regs(chip,
|
||||
chip->regs->input, chip->irq_stat);
|
||||
if (ret)
|
||||
|
@@ -97,7 +97,7 @@ static int tc3589x_gpio_get_direction(struct gpio_chip *chip,
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return !!(ret & BIT(pos));
|
||||
return !(ret & BIT(pos));
|
||||
}
|
||||
|
||||
static int tc3589x_gpio_set_single_ended(struct gpio_chip *chip,
|
||||
|
@@ -2737,8 +2737,11 @@ int gpiochip_lock_as_irq(struct gpio_chip *chip, unsigned int offset)
|
||||
if (IS_ERR(desc))
|
||||
return PTR_ERR(desc);
|
||||
|
||||
/* Flush direction if something changed behind our back */
|
||||
if (chip->get_direction) {
|
||||
/*
|
||||
* If it's fast: flush the direction setting if something changed
|
||||
* behind our back
|
||||
*/
|
||||
if (!chip->can_sleep && chip->get_direction) {
|
||||
int dir = chip->get_direction(chip, offset);
|
||||
|
||||
if (dir)
|
||||
|
Reference in New Issue
Block a user