linux/drivers/i2c/busses
Frank Shew 94327d009e i2c: Blackfin TWI: fix transfer errors with repeat start
We have a custom BF537 board with an I2C RTC (MAX DS3231) running
uclinux 2007R1 for some time. Recently during migration to 2008R1.5-RC3
we losted access to the RTC. The RTC driver calls 'i2c_transfer()' which
in turns calls 'bfin_twi_master_xfer()' in i2c-bfin-twi.c.

Compared with 2007R1, it looks like the 2008R1.5 version of i2c-bin-twi.c
has a new mode 'TWI_I2C-MODE_REPEAT' which corresponds to the Repeat Start
Condition described in the HRM. However, according to the HRM, at XMIT or
RECV interrupt and when the data count is 0, not only is the RESTART bit
supposed to be set, but MDIR must also be set if the next operation is a
receive sequence, and cleared if not. Currently there is no code that looks
at the I2C_M_RD bit in the flag from the next cur_msg and set/clear the MDIR
flag accordingly at the same time that the RSTART bit is set. Instead, MDIR
is set or cleared (by OR'ing with 0?) after the RESTART bit has been cleared
during handling of MCOMP interrupt.

It appears that this is causing our failure with reading the RTC, as a
quick patch to set/clear MDIR when RESTART is set seem to solve our problem.

Signed-off-by: Frank Shew <fshew@geometrics.com>
Signed-off-by: Sonic Zhang <sonic.zhang@analog.com>
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
Signed-off-by: Bryan Wu <cooloney@kernel.org>
[ben-linux@fluff.org: shorted subject]
Signed-off-by: Ben Dooks <ben-linux@fluff.org>
2009-06-13 10:39:25 +01:00
..
Kconfig i2c: Blackfin TWI: make sure we don't end up with a CLKDIV=0 2009-06-13 10:39:25 +01:00
Makefile i2c: xtensa s6000 i2c driver 2009-04-07 10:23:34 +01:00
i2c-acorn.c [ARM] acorn,ebsa110,footbridge,integrator,sa1100: Convert asm/io.h to linux/io.h 2009-03-25 10:21:35 +00:00
i2c-ali15x3.c i2c: Timeouts off by 1 2009-05-05 08:39:24 +02:00
i2c-ali1535.c i2c: Timeouts off by 1 2009-05-05 08:39:24 +02:00
i2c-ali1563.c i2c: Delete many unused adapter IDs 2009-01-26 21:19:52 +01:00
i2c-amd756-s4882.c i2c: Use snprintf to set adapter names 2009-01-07 14:29:18 +01:00
i2c-amd756.c i2c: Timeouts off by 1 2009-05-05 08:39:24 +02:00
i2c-amd8111.c i2c: Timeouts reach -1 2009-02-24 19:19:48 +01:00
i2c-at91.c i2c: Use snprintf to set adapter names 2009-01-07 14:29:18 +01:00
i2c-au1550.c i2c: Delete many unused adapter IDs 2009-01-26 21:19:52 +01:00
i2c-bfin-twi.c i2c: Blackfin TWI: fix transfer errors with repeat start 2009-06-13 10:39:25 +01:00
i2c-cpm.c i2c-cpm: Pass dev ptr to dma_*_coherent rather than NULL 2009-05-12 00:36:04 +01:00
i2c-davinci.c i2c-davinci: Fix timeout handling 2009-03-28 21:34:43 +01:00
i2c-elektor.c i2c: Delete many unused adapter IDs 2009-01-26 21:19:52 +01:00
i2c-gpio.c i2c: i2c_gpio: keep probe resident for hotplugged devices. 2008-07-28 12:40:44 +01:00
i2c-highlander.c i2c-highlander: Trivial endian casting fixes 2008-12-11 12:11:21 +01:00
i2c-hydra.c i2c: Delete many unused adapter IDs 2009-01-26 21:19:52 +01:00
i2c-i801.c i2c: Timeouts off by 1 2009-05-05 08:39:24 +02:00
i2c-ibm_iic.c i2c: Adapter timeout is in jiffies 2009-03-28 21:34:43 +01:00
i2c-ibm_iic.h i2c-ibm_iic: Whitespace cleanup 2008-01-27 18:14:45 +01:00
i2c-imx.c i2c: imx: Make disable_delay a per-device variable 2009-04-07 10:23:34 +01:00
i2c-iop3xx.c i2c: Adapter timeout is in jiffies 2009-03-28 21:34:43 +01:00
i2c-iop3xx.h [PATCH] i2c-iop3xx: Avoid addressing self 2006-07-12 15:43:06 -07:00
i2c-isch.c i2c: Timeouts off by 1 2009-05-05 08:39:24 +02:00
i2c-ixp2000.c i2c: Make sure i2c_algo_bit_data.timeout is HZ-independent 2009-02-24 19:19:49 +01:00
i2c-mpc.c i2c-mpc: bug fix for MPC52xx clock setting and printout 2009-05-12 00:35:56 +01:00
i2c-mv64xxx.c i2c: Adapter timeout is in jiffies 2009-03-28 21:34:43 +01:00
i2c-nforce2-s4985.c i2c: Fix oops on bus multiplexer driver loading 2008-08-10 22:56:15 +02:00
i2c-nforce2.c i2c: Timeouts off by 1 2009-05-05 08:39:24 +02:00
i2c-ocores.c i2c-ocores: basic PM support 2008-07-14 22:38:33 +02:00
i2c-omap.c [ARM] omap: i2c: remove conditional ick clocks 2009-02-08 17:50:20 +00:00
i2c-parport-light.c i2c: Delete many unused adapter IDs 2009-01-26 21:19:52 +01:00
i2c-parport.c i2c: Delete many unused adapter IDs 2009-01-26 21:19:52 +01:00
i2c-parport.h i2c-parport: Add support for One For All remote JP1 interface 2007-02-13 22:09:02 +01:00
i2c-pasemi.c i2c: Let bus drivers add SPD to their class 2008-07-14 22:38:29 +02:00
i2c-pca-isa.c i2c-algo-pca: Use timeout for checking the state machine 2009-03-28 21:34:45 +01:00
i2c-pca-platform.c i2c-pca-platform: Use defaults if no platform_data given 2009-03-28 21:34:45 +01:00
i2c-piix4.c i2c-piix4: Add support for the Broadcom HT1100 chipset 2009-03-28 21:34:46 +01:00
i2c-pmcmsp.c i2c-pmcmsp: Fix endianness misannotation 2008-12-11 12:11:20 +01:00
i2c-pnx.c [ARM] Move include/asm-arm/arch-* to arch/arm/*/include/mach 2008-08-07 09:55:48 +01:00
i2c-powermac.c i2c: Add missing KERN_* constants to printks 2009-03-28 21:34:42 +01:00
i2c-pxa.c i2c-pxa.c: timeouts off by 1 2009-05-03 22:54:23 +01:00
i2c-s3c2410.c i2c: i2c-s3c2410: Initialise Samsung I2C controller early 2009-04-07 10:18:33 +01:00
i2c-s6000.c i2c: xtensa s6000 i2c driver 2009-04-07 10:23:34 +01:00
i2c-s6000.h i2c: xtensa s6000 i2c driver 2009-04-07 10:23:34 +01:00
i2c-sh7760.c sh: clkfwk: module_clk -> peripheral_clk rename. 2009-05-13 16:59:40 +09:00
i2c-sh_mobile.c i2c: Get rid of remaining bus_id access 2009-01-07 14:29:16 +01:00
i2c-sibyte.c i2c: Delete many unused adapter IDs 2009-01-26 21:19:52 +01:00
i2c-simtec.c i2c: Fix platform driver hotplug/coldplug 2008-04-22 22:16:49 +02:00
i2c-sis96x.c i2c: Timeouts off by 1 2009-05-05 08:39:24 +02:00
i2c-sis630.c i2c: Timeouts off by 1 2009-05-05 08:39:24 +02:00
i2c-sis5595.c i2c: Timeouts off by 1 2009-05-05 08:39:24 +02:00
i2c-stub.c i2c: Let bus drivers add SPD to their class 2008-07-14 22:38:29 +02:00
i2c-taos-evm.c i2c: Consistently reject unsupported transactions 2008-07-14 22:38:25 +02:00
i2c-tiny-usb.c i2c-tiny-usb: New VID/PID pair 2008-04-11 12:07:05 +02:00
i2c-versatile.c [ARM] 5394/1: Add static bus numbering support to i2c-versatile 2009-02-19 11:30:22 +00:00
i2c-via.c i2c: Delete many unused adapter IDs 2009-01-26 21:19:52 +01:00
i2c-viapro.c i2c: Delete many unused adapter IDs 2009-01-26 21:19:52 +01:00
i2c-voodoo3.c i2c: Delete many unused adapter IDs 2009-01-26 21:19:52 +01:00
scx200_acb.c i2c: Delete many unused adapter IDs 2009-01-26 21:19:52 +01:00
scx200_i2c.c i2c: Make sure i2c_algo_bit_data.timeout is HZ-independent 2009-02-24 19:19:49 +01:00