On Sun, Jun 29, 2014 at 2:13 AM, Antonio Borneo <borneo.antonio@xxxxxxxxx> wrote: > CP2112 does not offer an atomic method to set both gpio > direction and value. > Also it does not permit to set gpio value before putting > gpio in output. In fact, accordingly to Silicon Labs > AN495, Rev. 0.2, cpt. 4.4, the HID report to set gpio > values "does not affect any pins that are not configured > as outputs". > > This is confirmed on evaluation board CP2112-EK. > With current driver, after execute: > echo in > /sys/class/gpio/gpio248/direction > echo low > /sys/class/gpio/gpio248/direction > gpio output is still high. Only after a following > echo low > /sys/class/gpio/gpio248/direction > gpio output gets low. > > Fix driver by changing order of operations; first set > direction then set value. > > The drawback of this new sequence is that we can have > a pulse on gpio pin when direction is changed from > input to output-low, but this cannot be avoided on > current CP2112. In this case, does keeping the first cp2112_gpio_set() before setting the output direction prevents the pulse? If so, then you can just keep the current code, and simply add the cp2112_gpio_set() at the end of cp2112_gpio_direction_output(). In both case, this is: Reviewed-by: Benjamin Tissoires <benjamin.tissoires@xxxxxxxxxx> Cheers, Benjamin > > Signed-off-by: Antonio Borneo <borneo.antonio@xxxxxxxxx> > --- > drivers/hid/hid-cp2112.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/drivers/hid/hid-cp2112.c b/drivers/hid/hid-cp2112.c > index 56be85a..3952d90 100644 > --- a/drivers/hid/hid-cp2112.c > +++ b/drivers/hid/hid-cp2112.c > @@ -240,8 +240,6 @@ static int cp2112_gpio_direction_output(struct gpio_chip *chip, > u8 buf[5]; > int ret; > > - cp2112_gpio_set(chip, offset, value); > - > ret = hid_hw_raw_request(hdev, CP2112_GPIO_CONFIG, buf, > sizeof(buf), HID_FEATURE_REPORT, > HID_REQ_GET_REPORT); > @@ -260,6 +258,12 @@ static int cp2112_gpio_direction_output(struct gpio_chip *chip, > return ret; > } > > + /* > + * Set gpio value when output direction is already set, > + * as specified in AN495, Rev. 0.2, cpt. 4.4 > + */ > + cp2112_gpio_set(chip, offset, value); > + > return 0; > } > > -- > 2.0.1 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-input" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html