[media] au0828: tweak workaround for i2c clock stretching bug
authorDevin Heitmueller <dheitmueller@kernellabs.com>
Tue, 7 Aug 2012 01:47:10 +0000 (22:47 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Thu, 9 Aug 2012 23:57:39 +0000 (20:57 -0300)
The hack I put in a couple of years ago to avoid clock stretching issues
when talking to the xc5000 worked fine for writes, but intermittently
fails for register reads, because the xc5000 may stretch the clock for
longer between bytes (I was seeing cases of 21 us on the analyzer).

The problem manifested itself as the xc5000 firmware version and PLL
lock register intermittently showing garbage values.

Slow down the i2c bus from 30 KHz to 20 KHz to accommodate.

Signed-off-by: Devin Heitmueller <dheitmueller@kernellabs.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/au0828/au0828-cards.c
drivers/media/video/au0828/au0828-reg.h

index e3fe9a6637f66ad446786af6053f084962c42214..448361c6a13eea6e74adefab2ec9d50d448fe7a3 100644 (file)
@@ -46,7 +46,7 @@ struct au0828_board au0828_boards[] = {
                .name   = "Hauppauge HVR850",
                .tuner_type = TUNER_XC5000,
                .tuner_addr = 0x61,
-               .i2c_clk_divider = AU0828_I2C_CLK_30KHZ,
+               .i2c_clk_divider = AU0828_I2C_CLK_20KHZ,
                .input = {
                        {
                                .type = AU0828_VMUX_TELEVISION,
@@ -77,7 +77,7 @@ struct au0828_board au0828_boards[] = {
                   stretch fits inside of a normal clock cycle, or else the
                   au0828 fails to set the STOP bit.  A 30 KHz clock puts the
                   clock pulse width at 18us */
-               .i2c_clk_divider = AU0828_I2C_CLK_30KHZ,
+               .i2c_clk_divider = AU0828_I2C_CLK_20KHZ,
                .input = {
                        {
                                .type = AU0828_VMUX_TELEVISION,
index c39f3d2b721e22580b786f6a0a56f96394a1d563..2140f4cfb645679901e71853a940240a64024029 100644 (file)
@@ -63,3 +63,4 @@
 #define AU0828_I2C_CLK_250KHZ 0x07
 #define AU0828_I2C_CLK_100KHZ 0x14
 #define AU0828_I2C_CLK_30KHZ  0x40
+#define AU0828_I2C_CLK_20KHZ  0x60