aboutsummaryrefslogtreecommitdiffstats
path: root/recipes-kernel/linux/linux-raspberrypi/sl030raspberrypii2ckernel.patch
blob: 8534ecbd6eb7797ecafb7b85522e58cca7ba58a2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Fix i2c timing errors.

When Transmitting: Make SDA valid quarter of a cycle after the falling edge of SCL.
When Receiving: Sample SDA Quarter of a cycle after the rising edge of SCL.

Upstream-Status: Pending

RP 2013/04/21

Index: git/drivers/i2c/busses/i2c-bcm2708.c
===================================================================
--- git.orig/drivers/i2c/busses/i2c-bcm2708.c	2013-01-06 17:15:00.754954587 +0000
+++ git/drivers/i2c/busses/i2c-bcm2708.c	2013-01-06 17:50:09.794905741 +0000
@@ -150,6 +150,7 @@
 	unsigned long bus_hz;
 	u32 cdiv;
 	u32 c = BSC_C_I2CEN | BSC_C_INTD | BSC_C_ST | BSC_C_CLEAR_1;
+	u32 cdel;
 
 	bus_hz = clk_get_rate(bi->clk);
 	cdiv = bus_hz / baudrate;
@@ -163,6 +164,10 @@
 	bcm2708_wr(bi, BSC_A, bi->msg->addr);
 	bcm2708_wr(bi, BSC_DLEN, bi->msg->len);
 	bcm2708_wr(bi, BSC_C, c);
+
+	cdel = (cdiv / 4) & 0xffff;
+	cdel = cdel << 16 | cdel;
+	bcm2708_wr(bi, BSC_DEL, cdel);
 }
 
 static irqreturn_t bcm2708_i2c_interrupt(int irq, void *dev_id)