@@ -1493,6 +1493,7 @@ static irqreturn_t stm32f7_i2c_isr_event(int irq, void *data)
1493
1493
{
1494
1494
struct stm32f7_i2c_dev * i2c_dev = data ;
1495
1495
struct stm32f7_i2c_msg * f7_msg = & i2c_dev -> f7_msg ;
1496
+ struct stm32_i2c_dma * dma = i2c_dev -> dma ;
1496
1497
void __iomem * base = i2c_dev -> base ;
1497
1498
u32 status , mask ;
1498
1499
int ret = IRQ_HANDLED ;
@@ -1518,6 +1519,10 @@ static irqreturn_t stm32f7_i2c_isr_event(int irq, void *data)
1518
1519
dev_dbg (i2c_dev -> dev , "<%s>: Receive NACK (addr %x)\n" ,
1519
1520
__func__ , f7_msg -> addr );
1520
1521
writel_relaxed (STM32F7_I2C_ICR_NACKCF , base + STM32F7_I2C_ICR );
1522
+ if (i2c_dev -> use_dma ) {
1523
+ stm32f7_i2c_disable_dma_req (i2c_dev );
1524
+ dmaengine_terminate_async (dma -> chan_using );
1525
+ }
1521
1526
f7_msg -> result = - ENXIO ;
1522
1527
}
1523
1528
@@ -1533,7 +1538,7 @@ static irqreturn_t stm32f7_i2c_isr_event(int irq, void *data)
1533
1538
/* Clear STOP flag */
1534
1539
writel_relaxed (STM32F7_I2C_ICR_STOPCF , base + STM32F7_I2C_ICR );
1535
1540
1536
- if (i2c_dev -> use_dma ) {
1541
+ if (i2c_dev -> use_dma && ! f7_msg -> result ) {
1537
1542
ret = IRQ_WAKE_THREAD ;
1538
1543
} else {
1539
1544
i2c_dev -> master_mode = false;
@@ -1546,7 +1551,7 @@ static irqreturn_t stm32f7_i2c_isr_event(int irq, void *data)
1546
1551
if (f7_msg -> stop ) {
1547
1552
mask = STM32F7_I2C_CR2_STOP ;
1548
1553
stm32f7_i2c_set_bits (base + STM32F7_I2C_CR2 , mask );
1549
- } else if (i2c_dev -> use_dma ) {
1554
+ } else if (i2c_dev -> use_dma && ! f7_msg -> result ) {
1550
1555
ret = IRQ_WAKE_THREAD ;
1551
1556
} else if (f7_msg -> smbus ) {
1552
1557
stm32f7_i2c_smbus_rep_start (i2c_dev );
@@ -1583,7 +1588,7 @@ static irqreturn_t stm32f7_i2c_isr_event_thread(int irq, void *data)
1583
1588
if (!ret ) {
1584
1589
dev_dbg (i2c_dev -> dev , "<%s>: Timed out\n" , __func__ );
1585
1590
stm32f7_i2c_disable_dma_req (i2c_dev );
1586
- dmaengine_terminate_all (dma -> chan_using );
1591
+ dmaengine_terminate_async (dma -> chan_using );
1587
1592
f7_msg -> result = - ETIMEDOUT ;
1588
1593
}
1589
1594
@@ -1660,7 +1665,7 @@ static irqreturn_t stm32f7_i2c_isr_error(int irq, void *data)
1660
1665
/* Disable dma */
1661
1666
if (i2c_dev -> use_dma ) {
1662
1667
stm32f7_i2c_disable_dma_req (i2c_dev );
1663
- dmaengine_terminate_all (dma -> chan_using );
1668
+ dmaengine_terminate_async (dma -> chan_using );
1664
1669
}
1665
1670
1666
1671
i2c_dev -> master_mode = false;
@@ -1696,12 +1701,26 @@ static int stm32f7_i2c_xfer(struct i2c_adapter *i2c_adap,
1696
1701
time_left = wait_for_completion_timeout (& i2c_dev -> complete ,
1697
1702
i2c_dev -> adap .timeout );
1698
1703
ret = f7_msg -> result ;
1704
+ if (ret ) {
1705
+ if (i2c_dev -> use_dma )
1706
+ dmaengine_synchronize (dma -> chan_using );
1707
+
1708
+ /*
1709
+ * It is possible that some unsent data have already been
1710
+ * written into TXDR. To avoid sending old data in a
1711
+ * further transfer, flush TXDR in case of any error
1712
+ */
1713
+ writel_relaxed (STM32F7_I2C_ISR_TXE ,
1714
+ i2c_dev -> base + STM32F7_I2C_ISR );
1715
+ goto pm_free ;
1716
+ }
1699
1717
1700
1718
if (!time_left ) {
1701
1719
dev_dbg (i2c_dev -> dev , "Access to slave 0x%x timed out\n" ,
1702
1720
i2c_dev -> msg -> addr );
1703
1721
if (i2c_dev -> use_dma )
1704
- dmaengine_terminate_all (dma -> chan_using );
1722
+ dmaengine_terminate_sync (dma -> chan_using );
1723
+ stm32f7_i2c_wait_free_bus (i2c_dev );
1705
1724
ret = - ETIMEDOUT ;
1706
1725
}
1707
1726
@@ -1744,13 +1763,25 @@ static int stm32f7_i2c_smbus_xfer(struct i2c_adapter *adapter, u16 addr,
1744
1763
timeout = wait_for_completion_timeout (& i2c_dev -> complete ,
1745
1764
i2c_dev -> adap .timeout );
1746
1765
ret = f7_msg -> result ;
1747
- if (ret )
1766
+ if (ret ) {
1767
+ if (i2c_dev -> use_dma )
1768
+ dmaengine_synchronize (dma -> chan_using );
1769
+
1770
+ /*
1771
+ * It is possible that some unsent data have already been
1772
+ * written into TXDR. To avoid sending old data in a
1773
+ * further transfer, flush TXDR in case of any error
1774
+ */
1775
+ writel_relaxed (STM32F7_I2C_ISR_TXE ,
1776
+ i2c_dev -> base + STM32F7_I2C_ISR );
1748
1777
goto pm_free ;
1778
+ }
1749
1779
1750
1780
if (!timeout ) {
1751
1781
dev_dbg (dev , "Access to slave 0x%x timed out\n" , f7_msg -> addr );
1752
1782
if (i2c_dev -> use_dma )
1753
- dmaengine_terminate_all (dma -> chan_using );
1783
+ dmaengine_terminate_sync (dma -> chan_using );
1784
+ stm32f7_i2c_wait_free_bus (i2c_dev );
1754
1785
ret = - ETIMEDOUT ;
1755
1786
goto pm_free ;
1756
1787
}
0 commit comments