134
134
#define I2C_MST_FIFO_STATUS_TX GENMASK(23, 16)
135
135
#define I2C_MST_FIFO_STATUS_RX GENMASK(7, 0)
136
136
137
+ #define I2C_MASTER_RESET_CNTRL 0x0a8
138
+
137
139
/* configuration load timeout in microseconds */
138
140
#define I2C_CONFIG_LOAD_TIMEOUT 1000000
139
141
@@ -184,6 +186,9 @@ enum msg_end_type {
184
186
* @has_mst_fifo: The I2C controller contains the new MST FIFO interface that
185
187
* provides additional features and allows for longer messages to
186
188
* be transferred in one go.
189
+ * @has_mst_reset: The I2C controller contains MASTER_RESET_CTRL register which
190
+ * provides an alternative to controller reset when configured as
191
+ * I2C master
187
192
* @quirks: I2C adapter quirks for limiting write/read transfer size and not
188
193
* allowing 0 length transfers.
189
194
* @supports_bus_clear: Bus Clear support to recover from bus hang during
@@ -213,6 +218,7 @@ struct tegra_i2c_hw_feature {
213
218
bool has_multi_master_mode ;
214
219
bool has_slcg_override_reg ;
215
220
bool has_mst_fifo ;
221
+ bool has_mst_reset ;
216
222
const struct i2c_adapter_quirks * quirks ;
217
223
bool supports_bus_clear ;
218
224
bool has_apb_dma ;
@@ -605,12 +611,42 @@ static int tegra_i2c_wait_for_config_load(struct tegra_i2c_dev *i2c_dev)
605
611
return 0 ;
606
612
}
607
613
614
+ static int tegra_i2c_master_reset (struct tegra_i2c_dev * i2c_dev )
615
+ {
616
+ if (!i2c_dev -> hw -> has_mst_reset )
617
+ return - EOPNOTSUPP ;
618
+
619
+ /*
620
+ * Writing 1 to I2C_MASTER_RESET_CNTRL will reset all internal state of
621
+ * Master logic including FIFOs. Clear this bit to 0 for normal operation.
622
+ * SW needs to wait for 2us after assertion and de-assertion of this soft
623
+ * reset.
624
+ */
625
+ i2c_writel (i2c_dev , 0x1 , I2C_MASTER_RESET_CNTRL );
626
+ fsleep (2 );
627
+
628
+ i2c_writel (i2c_dev , 0x0 , I2C_MASTER_RESET_CNTRL );
629
+ fsleep (2 );
630
+
631
+ return 0 ;
632
+ }
633
+
608
634
static int tegra_i2c_init (struct tegra_i2c_dev * i2c_dev )
609
635
{
610
636
u32 val , clk_divisor , clk_multiplier , tsu_thd , tlow , thigh , non_hs_mode ;
611
637
struct i2c_timings * t = & i2c_dev -> timings ;
612
638
int err ;
613
639
640
+ /*
641
+ * Reset the controller before initializing it.
642
+ * In case if device_reset() returns -ENOENT, i.e. when the reset is
643
+ * not available, the internal software reset will be used if it is
644
+ * supported by the controller.
645
+ */
646
+ err = device_reset (i2c_dev -> dev );
647
+ if (err == - ENOENT )
648
+ err = tegra_i2c_master_reset (i2c_dev );
649
+
614
650
/*
615
651
* The reset shouldn't ever fail in practice. The failure will be a
616
652
* sign of a severe problem that needs to be resolved. Still we don't
@@ -619,7 +655,6 @@ static int tegra_i2c_init(struct tegra_i2c_dev *i2c_dev)
619
655
* emit a noisy warning on error, which won't stay unnoticed and
620
656
* won't hose machine entirely.
621
657
*/
622
- err = device_reset (i2c_dev -> dev );
623
658
WARN_ON_ONCE (err );
624
659
625
660
if (IS_DVC (i2c_dev ))
@@ -1266,17 +1301,9 @@ static int tegra_i2c_xfer_msg(struct tegra_i2c_dev *i2c_dev,
1266
1301
1267
1302
if (i2c_dev -> dma_mode ) {
1268
1303
if (i2c_dev -> msg_read ) {
1269
- dma_sync_single_for_device (i2c_dev -> dma_dev ,
1270
- i2c_dev -> dma_phys ,
1271
- xfer_size , DMA_FROM_DEVICE );
1272
-
1273
1304
err = tegra_i2c_dma_submit (i2c_dev , xfer_size );
1274
1305
if (err )
1275
1306
return err ;
1276
- } else {
1277
- dma_sync_single_for_cpu (i2c_dev -> dma_dev ,
1278
- i2c_dev -> dma_phys ,
1279
- xfer_size , DMA_TO_DEVICE );
1280
1307
}
1281
1308
}
1282
1309
@@ -1286,11 +1313,6 @@ static int tegra_i2c_xfer_msg(struct tegra_i2c_dev *i2c_dev,
1286
1313
if (i2c_dev -> dma_mode ) {
1287
1314
memcpy (i2c_dev -> dma_buf + I2C_PACKET_HEADER_SIZE ,
1288
1315
msg -> buf , i2c_dev -> msg_len );
1289
-
1290
- dma_sync_single_for_device (i2c_dev -> dma_dev ,
1291
- i2c_dev -> dma_phys ,
1292
- xfer_size , DMA_TO_DEVICE );
1293
-
1294
1316
err = tegra_i2c_dma_submit (i2c_dev , xfer_size );
1295
1317
if (err )
1296
1318
return err ;
@@ -1331,13 +1353,8 @@ static int tegra_i2c_xfer_msg(struct tegra_i2c_dev *i2c_dev,
1331
1353
return - ETIMEDOUT ;
1332
1354
}
1333
1355
1334
- if (i2c_dev -> msg_read && i2c_dev -> msg_err == I2C_ERR_NONE ) {
1335
- dma_sync_single_for_cpu (i2c_dev -> dma_dev ,
1336
- i2c_dev -> dma_phys ,
1337
- xfer_size , DMA_FROM_DEVICE );
1338
-
1356
+ if (i2c_dev -> msg_read && i2c_dev -> msg_err == I2C_ERR_NONE )
1339
1357
memcpy (i2c_dev -> msg_buf , i2c_dev -> dma_buf , i2c_dev -> msg_len );
1340
- }
1341
1358
}
1342
1359
1343
1360
time_left = tegra_i2c_wait_completion (i2c_dev , & i2c_dev -> msg_complete ,
@@ -1468,6 +1485,7 @@ static const struct tegra_i2c_hw_feature tegra20_i2c_hw = {
1468
1485
.has_multi_master_mode = false,
1469
1486
.has_slcg_override_reg = false,
1470
1487
.has_mst_fifo = false,
1488
+ .has_mst_reset = false,
1471
1489
.quirks = & tegra_i2c_quirks ,
1472
1490
.supports_bus_clear = false,
1473
1491
.has_apb_dma = true,
@@ -1492,6 +1510,7 @@ static const struct tegra_i2c_hw_feature tegra30_i2c_hw = {
1492
1510
.has_multi_master_mode = false,
1493
1511
.has_slcg_override_reg = false,
1494
1512
.has_mst_fifo = false,
1513
+ .has_mst_reset = false,
1495
1514
.quirks = & tegra_i2c_quirks ,
1496
1515
.supports_bus_clear = false,
1497
1516
.has_apb_dma = true,
@@ -1516,6 +1535,7 @@ static const struct tegra_i2c_hw_feature tegra114_i2c_hw = {
1516
1535
.has_multi_master_mode = false,
1517
1536
.has_slcg_override_reg = false,
1518
1537
.has_mst_fifo = false,
1538
+ .has_mst_reset = false,
1519
1539
.quirks = & tegra_i2c_quirks ,
1520
1540
.supports_bus_clear = true,
1521
1541
.has_apb_dma = true,
@@ -1540,6 +1560,7 @@ static const struct tegra_i2c_hw_feature tegra124_i2c_hw = {
1540
1560
.has_multi_master_mode = false,
1541
1561
.has_slcg_override_reg = true,
1542
1562
.has_mst_fifo = false,
1563
+ .has_mst_reset = false,
1543
1564
.quirks = & tegra_i2c_quirks ,
1544
1565
.supports_bus_clear = true,
1545
1566
.has_apb_dma = true,
@@ -1564,6 +1585,7 @@ static const struct tegra_i2c_hw_feature tegra210_i2c_hw = {
1564
1585
.has_multi_master_mode = false,
1565
1586
.has_slcg_override_reg = true,
1566
1587
.has_mst_fifo = false,
1588
+ .has_mst_reset = false,
1567
1589
.quirks = & tegra_i2c_quirks ,
1568
1590
.supports_bus_clear = true,
1569
1591
.has_apb_dma = true,
@@ -1588,6 +1610,7 @@ static const struct tegra_i2c_hw_feature tegra186_i2c_hw = {
1588
1610
.has_multi_master_mode = false,
1589
1611
.has_slcg_override_reg = true,
1590
1612
.has_mst_fifo = false,
1613
+ .has_mst_reset = false,
1591
1614
.quirks = & tegra_i2c_quirks ,
1592
1615
.supports_bus_clear = true,
1593
1616
.has_apb_dma = false,
@@ -1612,6 +1635,7 @@ static const struct tegra_i2c_hw_feature tegra194_i2c_hw = {
1612
1635
.has_multi_master_mode = true,
1613
1636
.has_slcg_override_reg = true,
1614
1637
.has_mst_fifo = true,
1638
+ .has_mst_reset = true,
1615
1639
.quirks = & tegra194_i2c_quirks ,
1616
1640
.supports_bus_clear = true,
1617
1641
.has_apb_dma = false,
0 commit comments