sob., 12 paź 2019 o 03:57 Kent Gibson <warthog618@xxxxxxxxx> napisał(a): > > This patch allows pull up/down bias to be disabled, allowing > the line to float or to be biased only by external circuitry. > Use case is for where the bias has been applied previously, > either by default or by the user, but that setting may > conflict with the current use of the line. > > Signed-off-by: Kent Gibson <warthog618@xxxxxxxxx> > --- > drivers/gpio/gpiolib.c | 22 +++++++--------------- > 1 file changed, 7 insertions(+), 15 deletions(-) > > diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c > index 647334f53622..f90b20d548b9 100644 > --- a/drivers/gpio/gpiolib.c > +++ b/drivers/gpio/gpiolib.c > @@ -539,11 +539,6 @@ static int linehandle_create(struct gpio_device *gdev, void __user *ip) > (lflags & GPIOHANDLE_REQUEST_OUTPUT)) > return -EINVAL; > > - /* Same with pull-up and pull-down. */ > - if ((lflags & GPIOHANDLE_REQUEST_PULL_UP) && > - (lflags & GPIOHANDLE_REQUEST_PULL_DOWN)) > - return -EINVAL; > - > /* > * Do not allow OPEN_SOURCE & OPEN_DRAIN flags in a single request. If > * the hardware actually supports enabling both at the same time the > @@ -935,14 +930,6 @@ static int lineevent_create(struct gpio_device *gdev, void __user *ip) > (lflags & GPIOHANDLE_REQUEST_PULL_DOWN))) > return -EINVAL; > > - /* > - * Do not allow both pull-up and pull-down flags to be set as they > - * are contradictory. > - */ > - if ((lflags & GPIOHANDLE_REQUEST_PULL_UP) && > - (lflags & GPIOHANDLE_REQUEST_PULL_DOWN)) > - return -EINVAL; > - > le = kzalloc(sizeof(*le), GFP_KERNEL); > if (!le) > return -ENOMEM; > @@ -2931,6 +2918,7 @@ static int gpio_set_config(struct gpio_chip *gc, unsigned offset, > unsigned arg; > > switch (mode) { > + case PIN_CONFIG_BIAS_DISABLE: > case PIN_CONFIG_BIAS_PULL_DOWN: > case PIN_CONFIG_BIAS_PULL_UP: > arg = 1; > @@ -2991,7 +2979,11 @@ int gpiod_direction_input(struct gpio_desc *desc) > if (ret == 0) > clear_bit(FLAG_IS_OUT, &desc->flags); > > - if (test_bit(FLAG_PULL_UP, &desc->flags)) > + if (test_bit(FLAG_PULL_UP, &desc->flags) && > + test_bit(FLAG_PULL_DOWN, &desc->flags)) > + gpio_set_config(chip, gpio_chip_hwgpio(desc), > + PIN_CONFIG_BIAS_DISABLE); > + else if (test_bit(FLAG_PULL_UP, &desc->flags)) >From looking at the code: user-space can disable bias when setting both PULL_UP and PULL_DOWN flags. I don't understand why it's done in this implicit way? Why not a separate flag? Also: I don't like that this patch deletes code added by earlier patches in this series. If we really need this, then it should be rearranged. Bart > gpio_set_config(chip, gpio_chip_hwgpio(desc), > PIN_CONFIG_BIAS_PULL_UP); > else if (test_bit(FLAG_PULL_DOWN, &desc->flags)) > @@ -4462,7 +4454,7 @@ int gpiod_configure_flags(struct gpio_desc *desc, const char *con_id, > > if (lflags & GPIO_PULL_UP) > set_bit(FLAG_PULL_UP, &desc->flags); > - else if (lflags & GPIO_PULL_DOWN) > + if (lflags & GPIO_PULL_DOWN) > set_bit(FLAG_PULL_DOWN, &desc->flags); > > ret = gpiod_set_transitory(desc, (lflags & GPIO_TRANSITORY)); > -- > 2.23.0 >