On Wed, Sep 23, 2020 at 7:14 PM Andy Shevchenko <andy.shevchenko@xxxxxxxxx> wrote: > > On Tue, Sep 22, 2020 at 5:35 AM Kent Gibson <warthog618@xxxxxxxxx> wrote: > > > > Add support for GPIO_V2_LINE_SET_CONFIG_IOCTL, the uAPI v2 > > line set config ioctl. > > +static long linereq_set_config_unlocked(struct linereq *lr, > > + struct gpio_v2_line_config *lc) > > +{ > > + struct gpio_desc *desc; > > + unsigned int i; > > + u64 flags; > > + bool polarity_change; > > + int ret; > > + > > + for (i = 0; i < lr->num_lines; i++) { > > + desc = lr->lines[i].desc; > > + flags = gpio_v2_line_config_flags(lc, i); > > > + polarity_change = > > + (test_bit(FLAG_ACTIVE_LOW, &desc->flags) != > > + ((flags & GPIO_V2_LINE_FLAG_ACTIVE_LOW) != 0)); > > Comparison Comparison between int / long (not all archs are agreed on this) and boolean is not the best we can do. What about bool old_polarity = test_bit(FLAG_ACTIVE_LOW, &desc->flags); bool new_polarity = flags & GPIO_V2_LINE_FLAG_ACTIVE_LOW; old_polarity ^ new_polarity and move this under INPUT conditional? > > + > > + gpio_v2_line_config_flags_to_desc_flags(flags, &desc->flags); > > + /* > > + * Lines have to be requested explicitly for input > > + * or output, else the line will be treated "as is". > > + */ > > + if (flags & GPIO_V2_LINE_FLAG_OUTPUT) { > > + int val = gpio_v2_line_config_output_value(lc, i); > > + > > + edge_detector_stop(&lr->lines[i]); > > + ret = gpiod_direction_output(desc, val); > > + if (ret) > > + return ret; > > + } else if (flags & GPIO_V2_LINE_FLAG_INPUT) { > > + ret = gpiod_direction_input(desc); > > + if (ret) > > + return ret; > > + > > + ret = edge_detector_update(&lr->lines[i], > > + flags & GPIO_V2_LINE_EDGE_FLAGS, > > + polarity_change); > > + if (ret) > > + return ret; > > + } > > + > > + blocking_notifier_call_chain(&desc->gdev->notifier, > > + GPIO_V2_LINE_CHANGED_CONFIG, > > + desc); > > + } > > + return 0; > > +} -- With Best Regards, Andy Shevchenko