diff options
Diffstat (limited to 'drivers/gpio')
-rw-r--r-- | drivers/gpio/Kconfig | 4 | ||||
-rw-r--r-- | drivers/gpio/gpio-moxart.c | 3 | ||||
-rw-r--r-- | drivers/gpio/gpio-pisosr.c | 4 | ||||
-rw-r--r-- | drivers/gpio/gpiolib-sysfs.c | 12 | ||||
-rw-r--r-- | drivers/gpio/gpiolib.c | 73 |
5 files changed, 44 insertions, 52 deletions
diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig index 5584ba457161..96ad29de3a3e 100644 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig @@ -266,7 +266,7 @@ config GPIO_LYNXPOINT config GPIO_MB86S7X bool "GPIO support for Fujitsu MB86S7x Platforms" - depends on ARCH_MB86S7X + depends on ARCH_MB86S7X || COMPILE_TEST help Say yes here to support the GPIO controller in Fujitsu MB86S70 SoCs. @@ -280,7 +280,7 @@ config GPIO_MM_LANTIQ config GPIO_MOXART bool "MOXART GPIO support" - depends on ARCH_MOXART + depends on ARCH_MOXART || COMPILE_TEST select GPIO_GENERIC help Select this option to enable GPIO driver for diff --git a/drivers/gpio/gpio-moxart.c b/drivers/gpio/gpio-moxart.c index 869002b7a571..f02d0b490978 100644 --- a/drivers/gpio/gpio-moxart.c +++ b/drivers/gpio/gpio-moxart.c @@ -57,10 +57,7 @@ static int moxart_gpio_probe(struct platform_device *pdev) gc->label = "moxart-gpio"; gc->request = gpiochip_generic_request; gc->free = gpiochip_generic_free; - gc->bgpio_data = gc->read_reg(gc->reg_set); gc->base = 0; - gc->ngpio = 32; - gc->parent = dev; gc->owner = THIS_MODULE; ret = devm_gpiochip_add_data(dev, gc, NULL); diff --git a/drivers/gpio/gpio-pisosr.c b/drivers/gpio/gpio-pisosr.c index 8b8bf8f9de6a..cb14b8d1d512 100644 --- a/drivers/gpio/gpio-pisosr.c +++ b/drivers/gpio/gpio-pisosr.c @@ -46,9 +46,9 @@ static int pisosr_gpio_refresh(struct pisosr_gpio *gpio) mutex_lock(&gpio->lock); if (gpio->load_gpio) { - gpiod_set_value(gpio->load_gpio, 1); + gpiod_set_value_cansleep(gpio->load_gpio, 1); udelay(1); /* registers load time (~10ns) */ - gpiod_set_value(gpio->load_gpio, 0); + gpiod_set_value_cansleep(gpio->load_gpio, 0); udelay(1); /* registers recovery time (~5ns) */ } diff --git a/drivers/gpio/gpiolib-sysfs.c b/drivers/gpio/gpiolib-sysfs.c index c56309491e8b..932e510aec50 100644 --- a/drivers/gpio/gpiolib-sysfs.c +++ b/drivers/gpio/gpiolib-sysfs.c @@ -721,6 +721,7 @@ EXPORT_SYMBOL_GPL(gpiod_unexport); int gpiochip_sysfs_register(struct gpio_device *gdev) { struct device *dev; + struct device *parent; struct gpio_chip *chip = gdev->chip; /* @@ -732,8 +733,17 @@ int gpiochip_sysfs_register(struct gpio_device *gdev) if (!gpio_class.p) return 0; + /* + * For sysfs backward compatibility we need to preserve this + * preferred parenting to the gpio_chip parent field, if set. + */ + if (chip->parent) + parent = chip->parent; + else + parent = &gdev->dev; + /* use chip->base for the ID; it's already known to be unique */ - dev = device_create_with_groups(&gpio_class, &gdev->dev, + dev = device_create_with_groups(&gpio_class, parent, MKDEV(0, 0), chip, gpiochip_groups, "gpiochip%d", chip->base); diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index e31d0a1e6f7c..1741ef4d2aaa 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -206,58 +206,43 @@ EXPORT_SYMBOL_GPL(gpiod_get_direction); */ static int gpiodev_add_to_list(struct gpio_device *gdev) { - struct gpio_device *iterator; - struct gpio_device *previous = NULL; - - if (!gdev->chip) - return -EINVAL; + struct gpio_device *prev, *next; if (list_empty(&gpio_devices)) { + /* initial entry in list */ list_add_tail(&gdev->list, &gpio_devices); return 0; } - list_for_each_entry(iterator, &gpio_devices, list) { - if (iterator->base >= gdev->base + gdev->ngpio) { - /* - * Iterator is the first GPIO chip so there is no - * previous one - */ - if (!previous) { - goto found; - } else { - /* - * We found a valid range(means - * [base, base + ngpio - 1]) between previous - * and iterator chip. - */ - if (previous->base + previous->ngpio - <= gdev->base) - goto found; - } - } - previous = iterator; + next = list_entry(gpio_devices.next, struct gpio_device, list); + if (gdev->base + gdev->ngpio <= next->base) { + /* add before first entry */ + list_add(&gdev->list, &gpio_devices); + return 0; } - /* - * We are beyond the last chip in the list and iterator now - * points to the head. - * Let iterator point to the last chip in the list. - */ - - iterator = list_last_entry(&gpio_devices, struct gpio_device, list); - if (iterator->base + iterator->ngpio <= gdev->base) { - list_add(&gdev->list, &iterator->list); + prev = list_entry(gpio_devices.prev, struct gpio_device, list); + if (prev->base + prev->ngpio <= gdev->base) { + /* add behind last entry */ + list_add_tail(&gdev->list, &gpio_devices); return 0; } - dev_err(&gdev->dev, - "GPIO integer space overlap, cannot add chip\n"); - return -EBUSY; + list_for_each_entry_safe(prev, next, &gpio_devices, list) { + /* at the end of the list */ + if (&next->list == &gpio_devices) + break; -found: - list_add_tail(&gdev->list, &iterator->list); - return 0; + /* add between prev and next */ + if (prev->base + prev->ngpio <= gdev->base + && gdev->base + gdev->ngpio <= next->base) { + list_add(&gdev->list, &prev->list); + return 0; + } + } + + dev_err(&gdev->dev, "GPIO integer space overlap, cannot add chip\n"); + return -EBUSY; } /** @@ -368,11 +353,11 @@ static long gpio_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) lineinfo.name[0] = '\0'; } if (desc->label) { - strncpy(lineinfo.label, desc->label, - sizeof(lineinfo.label)); - lineinfo.label[sizeof(lineinfo.label)-1] = '\0'; + strncpy(lineinfo.consumer, desc->label, + sizeof(lineinfo.consumer)); + lineinfo.consumer[sizeof(lineinfo.consumer)-1] = '\0'; } else { - lineinfo.label[0] = '\0'; + lineinfo.consumer[0] = '\0'; } /* |