Skip to content

Commit 2015757

Browse files
committed
Revert "pcie-brcmstb: Revert to upstream"
This reverts commit d091328. We unintentionally reverted changes from downstream files: i2c-designware-common.c i2c-designware-core.h i2c-designware-master.c Undo those changes
1 parent ae816fb commit 2015757

File tree

3 files changed

+37
-1
lines changed

3 files changed

+37
-1
lines changed

drivers/i2c/busses/i2c-designware-common.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ static char *abort_sources[] = {
6363
"slave lost the bus while transmitting data to a remote master",
6464
[ABRT_SLAVE_RD_INTX] =
6565
"incorrect slave-transmitter mode configuration",
66+
[ABRT_SLAVE_SDA_STUCK_AT_LOW] =
67+
"SDA stuck at low",
6668
};
6769

6870
static int dw_reg_read(void *context, unsigned int reg, unsigned int *val)
@@ -692,8 +694,16 @@ int i2c_dw_wait_bus_not_busy(struct dw_i2c_dev *dev)
692694
int i2c_dw_handle_tx_abort(struct dw_i2c_dev *dev)
693695
{
694696
unsigned long abort_source = dev->abort_source;
697+
unsigned int reg;
695698
int i;
696699

700+
if (abort_source & DW_IC_TX_ABRT_SLAVE_SDA_STUCK_AT_LOW) {
701+
regmap_write(dev->map, DW_IC_ENABLE,
702+
DW_IC_ENABLE_ENABLE | DW_IC_ENABLE_BUS_RECOVERY);
703+
regmap_read_poll_timeout(dev->map, DW_IC_ENABLE, reg,
704+
!(reg & DW_IC_ENABLE_BUS_RECOVERY),
705+
1100, 200000);
706+
}
697707
if (abort_source & DW_IC_TX_ABRT_NOACK) {
698708
for_each_set_bit(i, &abort_source, ARRAY_SIZE(abort_sources))
699709
dev_dbg(dev->dev,
@@ -708,6 +718,8 @@ int i2c_dw_handle_tx_abort(struct dw_i2c_dev *dev)
708718
return -EAGAIN;
709719
else if (abort_source & DW_IC_TX_ABRT_GCALL_READ)
710720
return -EINVAL; /* wrong msgs[] data */
721+
else if (abort_source & DW_IC_TX_ABRT_SLAVE_SDA_STUCK_AT_LOW)
722+
return -EREMOTEIO;
711723
else
712724
return -EIO;
713725
}

drivers/i2c/busses/i2c-designware-core.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,12 @@
7979
#define DW_IC_ENABLE_STATUS 0x9c
8080
#define DW_IC_CLR_RESTART_DET 0xa8
8181
#define DW_IC_SMBUS_INTR_MASK 0xcc
82+
#define DW_IC_SCL_STUCK_AT_LOW_TIMEOUT 0xac
83+
#define DW_IC_SDA_STUCK_AT_LOW_TIMEOUT 0xb0
8284
#define DW_IC_COMP_PARAM_1 0xf4
8385
#define DW_IC_COMP_VERSION 0xf8
8486
#define DW_IC_SDA_HOLD_MIN_VERS 0x3131312A /* "111*" == v1.11* */
87+
#define DW_IC_BUS_CLEAR_MIN_VERS 0x3230302A /* "200*" == v2.00* */
8588
#define DW_IC_COMP_TYPE 0xfc
8689
#define DW_IC_COMP_TYPE_VALUE 0x44570140 /* "DW" + 0x0140 */
8790

@@ -111,13 +114,15 @@
111114

112115
#define DW_IC_ENABLE_ENABLE BIT(0)
113116
#define DW_IC_ENABLE_ABORT BIT(1)
117+
#define DW_IC_ENABLE_BUS_RECOVERY BIT(3)
114118

115119
#define DW_IC_STATUS_ACTIVITY BIT(0)
116120
#define DW_IC_STATUS_TFE BIT(2)
117121
#define DW_IC_STATUS_RFNE BIT(3)
118122
#define DW_IC_STATUS_MASTER_ACTIVITY BIT(5)
119123
#define DW_IC_STATUS_SLAVE_ACTIVITY BIT(6)
120124
#define DW_IC_STATUS_MASTER_HOLD_TX_FIFO_EMPTY BIT(7)
125+
#define DW_IC_STATUS_SDA_STUCK_NOT_RECOVERED BIT(11)
121126

122127
#define DW_IC_SDA_HOLD_RX_SHIFT 16
123128
#define DW_IC_SDA_HOLD_RX_MASK GENMASK(23, 16)
@@ -165,6 +170,7 @@
165170
#define ABRT_SLAVE_FLUSH_TXFIFO 13
166171
#define ABRT_SLAVE_ARBLOST 14
167172
#define ABRT_SLAVE_RD_INTX 15
173+
#define ABRT_SLAVE_SDA_STUCK_AT_LOW 17
168174

169175
#define DW_IC_TX_ABRT_7B_ADDR_NOACK BIT(ABRT_7B_ADDR_NOACK)
170176
#define DW_IC_TX_ABRT_10ADDR1_NOACK BIT(ABRT_10ADDR1_NOACK)
@@ -180,6 +186,7 @@
180186
#define DW_IC_RX_ABRT_SLAVE_RD_INTX BIT(ABRT_SLAVE_RD_INTX)
181187
#define DW_IC_RX_ABRT_SLAVE_ARBLOST BIT(ABRT_SLAVE_ARBLOST)
182188
#define DW_IC_RX_ABRT_SLAVE_FLUSH_TXFIFO BIT(ABRT_SLAVE_FLUSH_TXFIFO)
189+
#define DW_IC_TX_ABRT_SLAVE_SDA_STUCK_AT_LOW BIT(ABRT_SLAVE_SDA_STUCK_AT_LOW)
183190

184191
#define DW_IC_TX_ABRT_NOACK (DW_IC_TX_ABRT_7B_ADDR_NOACK | \
185192
DW_IC_TX_ABRT_10ADDR1_NOACK | \

drivers/i2c/busses/i2c-designware-master.c

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,7 @@ static int i2c_dw_set_timings_master(struct dw_i2c_dev *dev)
234234
*/
235235
static int i2c_dw_init_master(struct dw_i2c_dev *dev)
236236
{
237+
unsigned int timeout = 0;
237238
int ret;
238239

239240
ret = i2c_dw_acquire_lock(dev);
@@ -264,6 +265,17 @@ static int i2c_dw_init_master(struct dw_i2c_dev *dev)
264265
regmap_write(dev->map, DW_IC_HS_SCL_LCNT, dev->hs_lcnt);
265266
}
266267

268+
if (dev->master_cfg & DW_IC_CON_BUS_CLEAR_CTRL) {
269+
/* Set a sensible timeout if not already configured */
270+
regmap_read(dev->map, DW_IC_SDA_STUCK_AT_LOW_TIMEOUT, &timeout);
271+
if (timeout == ~0) {
272+
/* Use 10ms as a timeout, which is 1000 cycles at 100kHz */
273+
timeout = i2c_dw_clk_rate(dev) * 10; /* clock rate is in kHz */
274+
regmap_write(dev->map, DW_IC_SDA_STUCK_AT_LOW_TIMEOUT, timeout);
275+
regmap_write(dev->map, DW_IC_SCL_STUCK_AT_LOW_TIMEOUT, timeout);
276+
}
277+
}
278+
267279
/* Write SDA hold time if supported */
268280
if (dev->sda_hold_time)
269281
regmap_write(dev->map, DW_IC_SDA_HOLD, dev->sda_hold_time);
@@ -1044,6 +1056,7 @@ int i2c_dw_probe_master(struct dw_i2c_dev *dev)
10441056
struct i2c_adapter *adap = &dev->adapter;
10451057
unsigned long irq_flags;
10461058
unsigned int ic_con;
1059+
unsigned int id_ver;
10471060
int ret;
10481061

10491062
init_completion(&dev->cmd_complete);
@@ -1078,7 +1091,11 @@ int i2c_dw_probe_master(struct dw_i2c_dev *dev)
10781091
if (ret)
10791092
return ret;
10801093

1081-
if (ic_con & DW_IC_CON_BUS_CLEAR_CTRL)
1094+
ret = regmap_read(dev->map, DW_IC_COMP_VERSION, &id_ver);
1095+
if (ret)
1096+
return ret;
1097+
1098+
if (ic_con & DW_IC_CON_BUS_CLEAR_CTRL || id_ver >= DW_IC_BUS_CLEAR_MIN_VERS)
10821099
dev->master_cfg |= DW_IC_CON_BUS_CLEAR_CTRL;
10831100

10841101
ret = dev->init(dev);

0 commit comments

Comments
 (0)