On Thu, Sep 24, 2020 at 6:24 AM Kent Gibson <warthog618@xxxxxxxxx> wrote: > On Wed, Sep 23, 2020 at 07:15:46PM +0300, Andy Shevchenko wrote: > > 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. > > > > There is no bool to int comparision here. test_bit() returns int or long depending on arch... Then you compare it to bool (which is a product of != 0). > There are two comparisons - the inner int vs int => bool and the > outer bool vs bool. The "!= 0" is effectively an implicit cast to > bool, as is your new_polarity initialisation below. > > > 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 > > So using bitwise operators on bools is ok?? XOR is special. There were never bitwise/boolean XORs. > > and move this under INPUT conditional? > > > > It has to be before the gpio_v2_line_config_flags_to_desc_flags() call, > as that modifies the desc flags, including the new polarity, so > polarity_change would then always be false :-). I really don't see in the code how polarity_change value is used in FLAG_OUTPUT branch below. > > > > + > > > > + 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 -- With Best Regards, Andy Shevchenko