@@ -357,6 +357,7 @@ struct stm32f7_i2c_dev {
357
357
u32 dnf_dt ;
358
358
u32 dnf ;
359
359
struct stm32f7_i2c_alert * alert ;
360
+ bool atomic ;
360
361
};
361
362
362
363
/*
@@ -915,7 +916,8 @@ static void stm32f7_i2c_xfer_msg(struct stm32f7_i2c_dev *i2c_dev,
915
916
916
917
/* Configure DMA or enable RX/TX interrupt */
917
918
i2c_dev -> use_dma = false;
918
- if (i2c_dev -> dma && f7_msg -> count >= STM32F7_I2C_DMA_LEN_MIN ) {
919
+ if (i2c_dev -> dma && f7_msg -> count >= STM32F7_I2C_DMA_LEN_MIN
920
+ && !i2c_dev -> atomic ) {
919
921
ret = stm32_i2c_prep_dma_xfer (i2c_dev -> dev , i2c_dev -> dma ,
920
922
msg -> flags & I2C_M_RD ,
921
923
f7_msg -> count , f7_msg -> buf ,
@@ -939,6 +941,9 @@ static void stm32f7_i2c_xfer_msg(struct stm32f7_i2c_dev *i2c_dev,
939
941
cr1 |= STM32F7_I2C_CR1_TXDMAEN ;
940
942
}
941
943
944
+ if (i2c_dev -> atomic )
945
+ cr1 &= ~STM32F7_I2C_ALL_IRQ_MASK ; /* Disable all interrupts */
946
+
942
947
/* Configure Start/Repeated Start */
943
948
cr2 |= STM32F7_I2C_CR2_START ;
944
949
@@ -1670,7 +1675,22 @@ static irqreturn_t stm32f7_i2c_isr_error(int irq, void *data)
1670
1675
return IRQ_HANDLED ;
1671
1676
}
1672
1677
1673
- static int stm32f7_i2c_xfer (struct i2c_adapter * i2c_adap ,
1678
+ static int stm32f7_i2c_wait_polling (struct stm32f7_i2c_dev * i2c_dev )
1679
+ {
1680
+ ktime_t timeout = ktime_add_ms (ktime_get (), i2c_dev -> adap .timeout );
1681
+
1682
+ while (ktime_compare (ktime_get (), timeout ) < 0 ) {
1683
+ udelay (5 );
1684
+ stm32f7_i2c_isr_event (0 , i2c_dev );
1685
+
1686
+ if (completion_done (& i2c_dev -> complete ))
1687
+ return 1 ;
1688
+ }
1689
+
1690
+ return 0 ;
1691
+ }
1692
+
1693
+ static int stm32f7_i2c_xfer_core (struct i2c_adapter * i2c_adap ,
1674
1694
struct i2c_msg msgs [], int num )
1675
1695
{
1676
1696
struct stm32f7_i2c_dev * i2c_dev = i2c_get_adapdata (i2c_adap );
@@ -1694,8 +1714,12 @@ static int stm32f7_i2c_xfer(struct i2c_adapter *i2c_adap,
1694
1714
1695
1715
stm32f7_i2c_xfer_msg (i2c_dev , msgs );
1696
1716
1697
- time_left = wait_for_completion_timeout (& i2c_dev -> complete ,
1698
- i2c_dev -> adap .timeout );
1717
+ if (!i2c_dev -> atomic )
1718
+ time_left = wait_for_completion_timeout (& i2c_dev -> complete ,
1719
+ i2c_dev -> adap .timeout );
1720
+ else
1721
+ time_left = stm32f7_i2c_wait_polling (i2c_dev );
1722
+
1699
1723
ret = f7_msg -> result ;
1700
1724
if (ret ) {
1701
1725
if (i2c_dev -> use_dma )
@@ -1727,6 +1751,24 @@ static int stm32f7_i2c_xfer(struct i2c_adapter *i2c_adap,
1727
1751
return (ret < 0 ) ? ret : num ;
1728
1752
}
1729
1753
1754
+ static int stm32f7_i2c_xfer (struct i2c_adapter * i2c_adap ,
1755
+ struct i2c_msg msgs [], int num )
1756
+ {
1757
+ struct stm32f7_i2c_dev * i2c_dev = i2c_get_adapdata (i2c_adap );
1758
+
1759
+ i2c_dev -> atomic = false;
1760
+ return stm32f7_i2c_xfer_core (i2c_adap , msgs , num );
1761
+ }
1762
+
1763
+ static int stm32f7_i2c_xfer_atomic (struct i2c_adapter * i2c_adap ,
1764
+ struct i2c_msg msgs [], int num )
1765
+ {
1766
+ struct stm32f7_i2c_dev * i2c_dev = i2c_get_adapdata (i2c_adap );
1767
+
1768
+ i2c_dev -> atomic = true;
1769
+ return stm32f7_i2c_xfer_core (i2c_adap , msgs , num );
1770
+ }
1771
+
1730
1772
static int stm32f7_i2c_smbus_xfer (struct i2c_adapter * adapter , u16 addr ,
1731
1773
unsigned short flags , char read_write ,
1732
1774
u8 command , int size ,
@@ -2095,6 +2137,7 @@ static u32 stm32f7_i2c_func(struct i2c_adapter *adap)
2095
2137
2096
2138
static const struct i2c_algorithm stm32f7_i2c_algo = {
2097
2139
.master_xfer = stm32f7_i2c_xfer ,
2140
+ .master_xfer_atomic = stm32f7_i2c_xfer_atomic ,
2098
2141
.smbus_xfer = stm32f7_i2c_smbus_xfer ,
2099
2142
.functionality = stm32f7_i2c_func ,
2100
2143
.reg_slave = stm32f7_i2c_reg_slave ,
0 commit comments