Commit 28f5ab1e authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'gpio-v5.3-3' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio

Pull GPIO fixes from Linus Walleij:
 "Three GPIO fixes, all touching the core, so quite important:

   - Fix the request of active low GPIO line events.

   - Don't issue WARN() stuff on NULL descriptors if the GPIOLIB is
     disabled.

   - Preserve the descriptor flags when setting the initial direction on
     lines"

* tag 'gpio-v5.3-3' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio:
  gpiolib: Preserve desc->flags when setting state
  gpio: don't WARN() on NULL descs if gpiolib is disabled
  gpiolib: fix incorrect IRQ requesting of an active-low lineevent
parents 5c620753 d95da993
...@@ -956,9 +956,11 @@ static int lineevent_create(struct gpio_device *gdev, void __user *ip) ...@@ -956,9 +956,11 @@ static int lineevent_create(struct gpio_device *gdev, void __user *ip)
} }
if (eflags & GPIOEVENT_REQUEST_RISING_EDGE) if (eflags & GPIOEVENT_REQUEST_RISING_EDGE)
irqflags |= IRQF_TRIGGER_RISING; irqflags |= test_bit(FLAG_ACTIVE_LOW, &desc->flags) ?
IRQF_TRIGGER_FALLING : IRQF_TRIGGER_RISING;
if (eflags & GPIOEVENT_REQUEST_FALLING_EDGE) if (eflags & GPIOEVENT_REQUEST_FALLING_EDGE)
irqflags |= IRQF_TRIGGER_FALLING; irqflags |= test_bit(FLAG_ACTIVE_LOW, &desc->flags) ?
IRQF_TRIGGER_RISING : IRQF_TRIGGER_FALLING;
irqflags |= IRQF_ONESHOT; irqflags |= IRQF_ONESHOT;
INIT_KFIFO(le->events); INIT_KFIFO(le->events);
...@@ -1392,12 +1394,17 @@ int gpiochip_add_data_with_key(struct gpio_chip *chip, void *data, ...@@ -1392,12 +1394,17 @@ int gpiochip_add_data_with_key(struct gpio_chip *chip, void *data,
for (i = 0; i < chip->ngpio; i++) { for (i = 0; i < chip->ngpio; i++) {
struct gpio_desc *desc = &gdev->descs[i]; struct gpio_desc *desc = &gdev->descs[i];
if (chip->get_direction && gpiochip_line_is_valid(chip, i)) if (chip->get_direction && gpiochip_line_is_valid(chip, i)) {
desc->flags = !chip->get_direction(chip, i) ? if (!chip->get_direction(chip, i))
(1 << FLAG_IS_OUT) : 0; set_bit(FLAG_IS_OUT, &desc->flags);
else else
desc->flags = !chip->direction_input ? clear_bit(FLAG_IS_OUT, &desc->flags);
(1 << FLAG_IS_OUT) : 0; } else {
if (!chip->direction_input)
set_bit(FLAG_IS_OUT, &desc->flags);
else
clear_bit(FLAG_IS_OUT, &desc->flags);
}
} }
acpi_gpiochip_add(chip); acpi_gpiochip_add(chip);
......
...@@ -247,7 +247,7 @@ static inline void gpiod_put(struct gpio_desc *desc) ...@@ -247,7 +247,7 @@ static inline void gpiod_put(struct gpio_desc *desc)
might_sleep(); might_sleep();
/* GPIO can never have been requested */ /* GPIO can never have been requested */
WARN_ON(1); WARN_ON(desc);
} }
static inline void devm_gpiod_unhinge(struct device *dev, static inline void devm_gpiod_unhinge(struct device *dev,
...@@ -256,7 +256,7 @@ static inline void devm_gpiod_unhinge(struct device *dev, ...@@ -256,7 +256,7 @@ static inline void devm_gpiod_unhinge(struct device *dev,
might_sleep(); might_sleep();
/* GPIO can never have been requested */ /* GPIO can never have been requested */
WARN_ON(1); WARN_ON(desc);
} }
static inline void gpiod_put_array(struct gpio_descs *descs) static inline void gpiod_put_array(struct gpio_descs *descs)
...@@ -264,7 +264,7 @@ static inline void gpiod_put_array(struct gpio_descs *descs) ...@@ -264,7 +264,7 @@ static inline void gpiod_put_array(struct gpio_descs *descs)
might_sleep(); might_sleep();
/* GPIO can never have been requested */ /* GPIO can never have been requested */
WARN_ON(1); WARN_ON(descs);
} }
static inline struct gpio_desc *__must_check static inline struct gpio_desc *__must_check
...@@ -317,7 +317,7 @@ static inline void devm_gpiod_put(struct device *dev, struct gpio_desc *desc) ...@@ -317,7 +317,7 @@ static inline void devm_gpiod_put(struct device *dev, struct gpio_desc *desc)
might_sleep(); might_sleep();
/* GPIO can never have been requested */ /* GPIO can never have been requested */
WARN_ON(1); WARN_ON(desc);
} }
static inline void devm_gpiod_put_array(struct device *dev, static inline void devm_gpiod_put_array(struct device *dev,
...@@ -326,32 +326,32 @@ static inline void devm_gpiod_put_array(struct device *dev, ...@@ -326,32 +326,32 @@ static inline void devm_gpiod_put_array(struct device *dev,
might_sleep(); might_sleep();
/* GPIO can never have been requested */ /* GPIO can never have been requested */
WARN_ON(1); WARN_ON(descs);
} }
static inline int gpiod_get_direction(const struct gpio_desc *desc) static inline int gpiod_get_direction(const struct gpio_desc *desc)
{ {
/* GPIO can never have been requested */ /* GPIO can never have been requested */
WARN_ON(1); WARN_ON(desc);
return -ENOSYS; return -ENOSYS;
} }
static inline int gpiod_direction_input(struct gpio_desc *desc) static inline int gpiod_direction_input(struct gpio_desc *desc)
{ {
/* GPIO can never have been requested */ /* GPIO can never have been requested */
WARN_ON(1); WARN_ON(desc);
return -ENOSYS; return -ENOSYS;
} }
static inline int gpiod_direction_output(struct gpio_desc *desc, int value) static inline int gpiod_direction_output(struct gpio_desc *desc, int value)
{ {
/* GPIO can never have been requested */ /* GPIO can never have been requested */
WARN_ON(1); WARN_ON(desc);
return -ENOSYS; return -ENOSYS;
} }
static inline int gpiod_direction_output_raw(struct gpio_desc *desc, int value) static inline int gpiod_direction_output_raw(struct gpio_desc *desc, int value)
{ {
/* GPIO can never have been requested */ /* GPIO can never have been requested */
WARN_ON(1); WARN_ON(desc);
return -ENOSYS; return -ENOSYS;
} }
...@@ -359,7 +359,7 @@ static inline int gpiod_direction_output_raw(struct gpio_desc *desc, int value) ...@@ -359,7 +359,7 @@ static inline int gpiod_direction_output_raw(struct gpio_desc *desc, int value)
static inline int gpiod_get_value(const struct gpio_desc *desc) static inline int gpiod_get_value(const struct gpio_desc *desc)
{ {
/* GPIO can never have been requested */ /* GPIO can never have been requested */
WARN_ON(1); WARN_ON(desc);
return 0; return 0;
} }
static inline int gpiod_get_array_value(unsigned int array_size, static inline int gpiod_get_array_value(unsigned int array_size,
...@@ -368,13 +368,13 @@ static inline int gpiod_get_array_value(unsigned int array_size, ...@@ -368,13 +368,13 @@ static inline int gpiod_get_array_value(unsigned int array_size,
unsigned long *value_bitmap) unsigned long *value_bitmap)
{ {
/* GPIO can never have been requested */ /* GPIO can never have been requested */
WARN_ON(1); WARN_ON(desc_array);
return 0; return 0;
} }
static inline void gpiod_set_value(struct gpio_desc *desc, int value) static inline void gpiod_set_value(struct gpio_desc *desc, int value)
{ {
/* GPIO can never have been requested */ /* GPIO can never have been requested */
WARN_ON(1); WARN_ON(desc);
} }
static inline int gpiod_set_array_value(unsigned int array_size, static inline int gpiod_set_array_value(unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
...@@ -382,13 +382,13 @@ static inline int gpiod_set_array_value(unsigned int array_size, ...@@ -382,13 +382,13 @@ static inline int gpiod_set_array_value(unsigned int array_size,
unsigned long *value_bitmap) unsigned long *value_bitmap)
{ {
/* GPIO can never have been requested */ /* GPIO can never have been requested */
WARN_ON(1); WARN_ON(desc_array);
return 0; return 0;
} }
static inline int gpiod_get_raw_value(const struct gpio_desc *desc) static inline int gpiod_get_raw_value(const struct gpio_desc *desc)
{ {
/* GPIO can never have been requested */ /* GPIO can never have been requested */
WARN_ON(1); WARN_ON(desc);
return 0; return 0;
} }
static inline int gpiod_get_raw_array_value(unsigned int array_size, static inline int gpiod_get_raw_array_value(unsigned int array_size,
...@@ -397,13 +397,13 @@ static inline int gpiod_get_raw_array_value(unsigned int array_size, ...@@ -397,13 +397,13 @@ static inline int gpiod_get_raw_array_value(unsigned int array_size,
unsigned long *value_bitmap) unsigned long *value_bitmap)
{ {
/* GPIO can never have been requested */ /* GPIO can never have been requested */
WARN_ON(1); WARN_ON(desc_array);
return 0; return 0;
} }
static inline void gpiod_set_raw_value(struct gpio_desc *desc, int value) static inline void gpiod_set_raw_value(struct gpio_desc *desc, int value)
{ {
/* GPIO can never have been requested */ /* GPIO can never have been requested */
WARN_ON(1); WARN_ON(desc);
} }
static inline int gpiod_set_raw_array_value(unsigned int array_size, static inline int gpiod_set_raw_array_value(unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
...@@ -411,14 +411,14 @@ static inline int gpiod_set_raw_array_value(unsigned int array_size, ...@@ -411,14 +411,14 @@ static inline int gpiod_set_raw_array_value(unsigned int array_size,
unsigned long *value_bitmap) unsigned long *value_bitmap)
{ {
/* GPIO can never have been requested */ /* GPIO can never have been requested */
WARN_ON(1); WARN_ON(desc_array);
return 0; return 0;
} }
static inline int gpiod_get_value_cansleep(const struct gpio_desc *desc) static inline int gpiod_get_value_cansleep(const struct gpio_desc *desc)
{ {
/* GPIO can never have been requested */ /* GPIO can never have been requested */
WARN_ON(1); WARN_ON(desc);
return 0; return 0;
} }
static inline int gpiod_get_array_value_cansleep(unsigned int array_size, static inline int gpiod_get_array_value_cansleep(unsigned int array_size,
...@@ -427,13 +427,13 @@ static inline int gpiod_get_array_value_cansleep(unsigned int array_size, ...@@ -427,13 +427,13 @@ static inline int gpiod_get_array_value_cansleep(unsigned int array_size,
unsigned long *value_bitmap) unsigned long *value_bitmap)
{ {
/* GPIO can never have been requested */ /* GPIO can never have been requested */
WARN_ON(1); WARN_ON(desc_array);
return 0; return 0;
} }
static inline void gpiod_set_value_cansleep(struct gpio_desc *desc, int value) static inline void gpiod_set_value_cansleep(struct gpio_desc *desc, int value)
{ {
/* GPIO can never have been requested */ /* GPIO can never have been requested */
WARN_ON(1); WARN_ON(desc);
} }
static inline int gpiod_set_array_value_cansleep(unsigned int array_size, static inline int gpiod_set_array_value_cansleep(unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
...@@ -441,13 +441,13 @@ static inline int gpiod_set_array_value_cansleep(unsigned int array_size, ...@@ -441,13 +441,13 @@ static inline int gpiod_set_array_value_cansleep(unsigned int array_size,
unsigned long *value_bitmap) unsigned long *value_bitmap)
{ {
/* GPIO can never have been requested */ /* GPIO can never have been requested */
WARN_ON(1); WARN_ON(desc_array);
return 0; return 0;
} }
static inline int gpiod_get_raw_value_cansleep(const struct gpio_desc *desc) static inline int gpiod_get_raw_value_cansleep(const struct gpio_desc *desc)
{ {
/* GPIO can never have been requested */ /* GPIO can never have been requested */
WARN_ON(1); WARN_ON(desc);
return 0; return 0;
} }
static inline int gpiod_get_raw_array_value_cansleep(unsigned int array_size, static inline int gpiod_get_raw_array_value_cansleep(unsigned int array_size,
...@@ -456,14 +456,14 @@ static inline int gpiod_get_raw_array_value_cansleep(unsigned int array_size, ...@@ -456,14 +456,14 @@ static inline int gpiod_get_raw_array_value_cansleep(unsigned int array_size,
unsigned long *value_bitmap) unsigned long *value_bitmap)
{ {
/* GPIO can never have been requested */ /* GPIO can never have been requested */
WARN_ON(1); WARN_ON(desc_array);
return 0; return 0;
} }
static inline void gpiod_set_raw_value_cansleep(struct gpio_desc *desc, static inline void gpiod_set_raw_value_cansleep(struct gpio_desc *desc,
int value) int value)
{ {
/* GPIO can never have been requested */ /* GPIO can never have been requested */
WARN_ON(1); WARN_ON(desc);
} }
static inline int gpiod_set_raw_array_value_cansleep(unsigned int array_size, static inline int gpiod_set_raw_array_value_cansleep(unsigned int array_size,
struct gpio_desc **desc_array, struct gpio_desc **desc_array,
...@@ -471,41 +471,41 @@ static inline int gpiod_set_raw_array_value_cansleep(unsigned int array_size, ...@@ -471,41 +471,41 @@ static inline int gpiod_set_raw_array_value_cansleep(unsigned int array_size,
unsigned long *value_bitmap) unsigned long *value_bitmap)
{ {
/* GPIO can never have been requested */ /* GPIO can never have been requested */
WARN_ON(1); WARN_ON(desc_array);
return 0; return 0;
} }
static inline int gpiod_set_debounce(struct gpio_desc *desc, unsigned debounce) static inline int gpiod_set_debounce(struct gpio_desc *desc, unsigned debounce)
{ {
/* GPIO can never have been requested */ /* GPIO can never have been requested */
WARN_ON(1); WARN_ON(desc);
return -ENOSYS; return -ENOSYS;
} }
static inline int gpiod_set_transitory(struct gpio_desc *desc, bool transitory) static inline int gpiod_set_transitory(struct gpio_desc *desc, bool transitory)
{ {
/* GPIO can never have been requested */ /* GPIO can never have been requested */
WARN_ON(1); WARN_ON(desc);
return -ENOSYS; return -ENOSYS;
} }
static inline int gpiod_is_active_low(const struct gpio_desc *desc) static inline int gpiod_is_active_low(const struct gpio_desc *desc)
{ {
/* GPIO can never have been requested */ /* GPIO can never have been requested */
WARN_ON(1); WARN_ON(desc);
return 0; return 0;
} }
static inline int gpiod_cansleep(const struct gpio_desc *desc) static inline int gpiod_cansleep(const struct gpio_desc *desc)
{ {
/* GPIO can never have been requested */ /* GPIO can never have been requested */
WARN_ON(1); WARN_ON(desc);
return 0; return 0;
} }
static inline int gpiod_to_irq(const struct gpio_desc *desc) static inline int gpiod_to_irq(const struct gpio_desc *desc)
{ {
/* GPIO can never have been requested */ /* GPIO can never have been requested */
WARN_ON(1); WARN_ON(desc);
return -EINVAL; return -EINVAL;
} }
...@@ -513,7 +513,7 @@ static inline int gpiod_set_consumer_name(struct gpio_desc *desc, ...@@ -513,7 +513,7 @@ static inline int gpiod_set_consumer_name(struct gpio_desc *desc,
const char *name) const char *name)
{ {
/* GPIO can never have been requested */ /* GPIO can never have been requested */
WARN_ON(1); WARN_ON(desc);
return -EINVAL; return -EINVAL;
} }
...@@ -525,7 +525,7 @@ static inline struct gpio_desc *gpio_to_desc(unsigned gpio) ...@@ -525,7 +525,7 @@ static inline struct gpio_desc *gpio_to_desc(unsigned gpio)
static inline int desc_to_gpio(const struct gpio_desc *desc) static inline int desc_to_gpio(const struct gpio_desc *desc)
{ {
/* GPIO can never have been requested */ /* GPIO can never have been requested */
WARN_ON(1); WARN_ON(desc);
return -EINVAL; return -EINVAL;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment