blob: 0e32615d5eeceab9382c5d426486eea0e836c3f7 (
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
From 6825259fc0ac015c6544f6070ceaf9cc263c1853 Mon Sep 17 00:00:00 2001
From: Jae Hyun Yoo <jae.hyun.yoo@intel.com>
Date: Fri, 8 Nov 2019 15:57:27 -0800
Subject: [PATCH] i2c: aspeed: filter garbage interrupts out
AST2600 makes a garbage interrupt which is decribed as 'reserved'
in datasheet so filter them out.
Signed-off-by: Jae Hyun Yoo <jae.hyun.yoo@intel.com>
---
drivers/i2c/busses/i2c-aspeed.c | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/drivers/i2c/busses/i2c-aspeed.c b/drivers/i2c/busses/i2c-aspeed.c
index 62b803e15ce2..e7cba33c0c87 100644
--- a/drivers/i2c/busses/i2c-aspeed.c
+++ b/drivers/i2c/busses/i2c-aspeed.c
@@ -87,7 +87,11 @@
* These share bit definitions, so use the same values for the enable &
* status bits.
*/
+#if defined(CONFIG_MACH_ASPEED_G6)
+#define ASPEED_I2CD_INTR_SLAVE_ADDR_RECEIVED_PENDING BIT(29)
+#else
#define ASPEED_I2CD_INTR_SLAVE_ADDR_RECEIVED_PENDING BIT(30)
+#endif
#define ASPEED_I2CD_INTR_SLAVE_INACTIVE_TIMEOUT BIT(15)
#define ASPEED_I2CD_INTR_SDA_DL_TIMEOUT BIT(14)
#define ASPEED_I2CD_INTR_BUS_RECOVER_DONE BIT(13)
@@ -118,6 +122,11 @@
ASPEED_I2CD_INTR_RX_DONE | \
ASPEED_I2CD_INTR_TX_NAK | \
ASPEED_I2CD_INTR_TX_ACK)
+#define ASPEED_I2CD_INTR_STATUS_MASK \
+ (ASPEED_I2CD_INTR_SLAVE_ADDR_RECEIVED_PENDING | \
+ ASPEED_I2CD_INTR_GCALL_ADDR | \
+ ASPEED_I2CD_INTR_SLAVE_MATCH | \
+ ASPEED_I2CD_INTR_ALL)
/* 0x14 : I2CD Command/Status Register */
#define ASPEED_I2CD_SCL_LINE_STS BIT(18)
@@ -1018,9 +1027,19 @@ static irqreturn_t aspeed_i2c_bus_irq(int irq, void *dev_id)
spin_lock(&bus->lock);
irq_received = readl(bus->base + ASPEED_I2C_INTR_STS_REG);
+ if (!irq_received) {
+ spin_unlock(&bus->lock);
+ return IRQ_NONE;
+ }
+
/* Ack all interrupts except for Rx done */
writel(irq_received & ~ASPEED_I2CD_INTR_RX_DONE,
bus->base + ASPEED_I2C_INTR_STS_REG);
+ /*
+ * AST2600 makes a garbage interrupt which is decribed as 'reserved'
+ * in datasheet so filter them out.
+ */
+ irq_received &= ASPEED_I2CD_INTR_STATUS_MASK;
irq_remaining = irq_received;
#if IS_ENABLED(CONFIG_I2C_SLAVE)
--
2.7.4
|