linux/drivers
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
..
accessibility
acpi
amba
ata Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev 2009-06-11 11:23:17 -07:00
atm
auxdisplay
base Driver Core: Rework platform suspend/resume, print warning 2009-06-12 21:32:32 +02:00
block Merge branch 'for-linus' of git://git.monstr.eu/linux-2.6-microblaze 2009-06-12 13:15:17 -07:00
bluetooth tty: fix bluetooth scribbling on low latency flags 2009-06-11 08:51:05 -07:00
cdrom
char Merge branch 'drm-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6 2009-06-12 18:09:18 -07:00
clocksource
connector
cpufreq
cpuidle
crypto
dca
dio
dma
edac
eisa
firewire
firmware
gpio
gpu Merge branch 'drm-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6 2009-06-12 18:09:18 -07:00
hid
hwmon
i2c i2c: Blackfin TWI: fix transfer errors with repeat start 2009-06-13 10:39:25 +01:00
ide Merge branch 'for-2.6.31' of git://git.kernel.org/pub/scm/linux/kernel/git/bart/ide-2.6 2009-06-12 09:29:42 -07:00
idle
ieee1394 fs: Remove i_cindex from struct inode 2009-06-11 21:36:09 -04:00
infiniband
input Merge branch 'for-linus' of git://git.monstr.eu/linux-2.6-microblaze 2009-06-12 13:15:17 -07:00
isdn
leds
lguest Merge git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux-2.6-lguest 2009-06-12 09:32:26 -07:00
macintosh
mca
md Merge branch 'for-2.6.31' of git://git.kernel.dk/linux-2.6-block 2009-06-11 11:10:35 -07:00
media
memstick
message [SCSI] Merge branch 'linus' 2009-06-12 10:02:03 -05:00
mfd
misc
mmc Merge branch 'for-2.6.31' of git://git.kernel.dk/linux-2.6-block 2009-06-11 11:10:35 -07:00
mtd Merge branch 'for-2.6.31' of git://git.kernel.dk/linux-2.6-block 2009-06-11 11:10:35 -07:00
net Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6 2009-06-12 09:50:42 -07:00
nubus
of
oprofile
parisc
parport parport_pc: clean up the modified while loops using for 2009-06-11 08:51:03 -07:00
pci
pcmcia
platform
pnp Merge branch 'drm-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6 2009-06-12 18:09:18 -07:00
power
ps3
rapidio
regulator
rtc
s390 Merge branch 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6 2009-06-12 18:18:05 -07:00
sbus
scsi [SCSI] Merge branch 'linus' 2009-06-12 10:02:03 -05:00
serial Merge git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6 2009-06-11 10:08:33 -07:00
sh sh: Tie sparseirq in to Kconfig. 2009-06-11 10:33:09 +03:00
sn
spi
ssb
staging
tc
telephony
thermal
uio
usb Merge branch 'for-linus' of git://git.monstr.eu/linux-2.6-microblaze 2009-06-12 13:15:17 -07:00
uwb
video Merge branch 'for-linus' of git://git.monstr.eu/linux-2.6-microblaze 2009-06-12 13:15:17 -07:00
virtio virtio: enhance id_matching for virtio drivers 2009-06-12 22:16:40 +09:30
w1
watchdog
xen PM core: rename suspend and resume functions 2009-06-12 21:32:31 +02:00
zorro
Kconfig
Makefile