Em Sat, 13 Apr 2013 11:48:39 +0200 Frank Schäfer <fschaefer.oss@xxxxxxxxxxxxxx> escreveu: > The GPIO register tracking/caching code is partially broken, because newer > devices provide more than one GPIO register and some of them are even using > separate registers for read and write access. > Making it work would be too complicated. > It is also used nowhere and doesn't make sense in cases where input lines are > connected to buttons etc. > > Signed-off-by: Frank Schäfer <fschaefer.oss@xxxxxxxxxxxxxx> > --- > drivers/media/usb/em28xx/em28xx-cards.c | 12 ------------ > drivers/media/usb/em28xx/em28xx-core.c | 27 ++------------------------- > drivers/media/usb/em28xx/em28xx.h | 6 ------ > 3 Dateien geändert, 2 Zeilen hinzugefügt(+), 43 Zeilen entfernt(-) ... > @@ -231,14 +215,7 @@ int em28xx_write_reg_bits(struct em28xx *dev, u16 reg, u8 val, > int oldval; > u8 newval; > > - /* Uses cache for gpo/gpio registers */ > - if (reg == dev->reg_gpo_num) > - oldval = dev->reg_gpo; > - else if (reg == dev->reg_gpio_num) > - oldval = dev->reg_gpio; > - else > - oldval = em28xx_read_reg(dev, reg); > - > + oldval = em28xx_read_reg(dev, reg); > if (oldval < 0) > return oldval; That's plain wrong, as it will break GPIO input. With GPIO, you can write either 0 or 1 to a GPIO output port. So, your code works for output ports. However, an input port requires an specific value (either 1 or 0 depending on the GPIO circuitry). If the wrong value is written there, the input port will stop working. So, you can't simply read a value from a GPIO input and write it. You need to shadow the GPIO write values instead. Regards, Mauro -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html