1
From 18e42b1fb4897fbecf7627d01b3c29e41fc39a3a Mon Sep 17 00:00:00 2001
2
From: Peter Maydell <peter.maydell@linaro.org>
3
Date: Mon, 18 Feb 2013 16:58:26 +0000
4
Subject: [PATCH 20/70] i2c-fixes: pull out omap-3-rev fixes
7
hw/i2c/omap_i2c.c | 52 ++++++++++++++++++++++++++++++++++++++++------------
8
1 file changed, 40 insertions(+), 12 deletions(-)
10
diff --git a/hw/i2c/omap_i2c.c b/hw/i2c/omap_i2c.c
11
index 521bd5c..9a1b0d2 100644
12
--- a/hw/i2c/omap_i2c.c
13
+++ b/hw/i2c/omap_i2c.c
14
@@ -341,10 +341,15 @@ static void omap_i2c_write(void *opaque, hwaddr addr,
17
case 0x04: /* I2C_IE */
18
- if (s->revision >= OMAP3_INTR_REV)
19
+ if (s->revision < OMAP2_INTR_REV) {
20
+ s->mask = value & 0x1f;
21
+ } else if (s->revision < OMAP3_INTR_REV) {
22
+ s->mask = value & 0x3f;
23
+ } else if (s->revision == OMAP3_INTR_REV) {
24
s->mask = value & 0x63ff;
26
- s->mask = value & (s->revision < OMAP2_INTR_REV ? 0x1f : 0x3f);
27
+ } else { /* omap3630 */
28
+ s->mask = value & 0x6fff;
30
omap_i2c_interrupts_update(s);
32
case 0x08: /* I2C_STAT */
33
@@ -352,16 +357,26 @@ static void omap_i2c_write(void *opaque, hwaddr addr,
36
/* RRDY and XRDY are reset by hardware. (in all versions???) */
37
- s->stat &= ~(value & (s->revision < OMAP3_INTR_REV ? 0x27 : 0x63e7));
38
+ if (s->revision < OMAP3_INTR_REV) {
40
+ } else if (s->revision == OMAP3_INTR_REV) {
42
+ } else { /* omap3630 */
46
omap_i2c_interrupts_update(s);
50
case 0x0c: /* I2C_IV / I2C_WE */
51
- if (s->revision < OMAP3_INTR_REV)
52
+ if (s->revision < OMAP3_INTR_REV) {
55
+ } else if (s->revision == OMAP3_INTR_REV) {
56
s->we = value & 0x636f;
57
+ } else { /* omap3630 */
58
+ s->we = value & 0x6f6f;
62
case 0x14: /* I2C_BUF */
63
@@ -487,20 +502,33 @@ static void omap_i2c_write(void *opaque, hwaddr addr,
66
case 0x3c: /* I2C_SYSTEST */
67
- value &= s->revision < OMAP3_INTR_REV ? 0xf805 : 0xf815;
68
+ if (s->revision < OMAP3_INTR_REV) {
70
+ } else if (s->revision == OMAP3_INTR_REV) {
72
+ } else { /* omap3630 */
73
+ value = (value & 0xf835) | 0x1c00;
75
if ((value & (1 << 15))) { /* ST_EN */
76
fprintf(stderr, "%s: System Test not supported\n",
78
s->test = (s->test & 0x0a) | value;
80
- s->test = (s->test & 0x1f) | (value & 0xf800);
81
- if (value & (1 << 11)) /* SBB */
84
+ s->test = (s->test & 0x1f) | value;
86
+ if (value & (1 << 11)) { /* SBB */
87
if (s->revision >= OMAP2_INTR_REV) {
89
- if (s->revision >= OMAP3_INTR_REV)
91
+ if (s->revision >= OMAP3_INTR_REV) {
93
+ if (s->revision > OMAP3_INTR_REV) {
97
omap_i2c_interrupts_update(s);
102
case 0x44: /* I2C_OA1 */