48
48
49
49
#define I2C_DMA_CON_TX 0x0000
50
50
#define I2C_DMA_CON_RX 0x0001
51
+ #define I2C_DMA_ASYNC_MODE 0x0004
52
+ #define I2C_DMA_SKIP_CONFIG 0x0010
53
+ #define I2C_DMA_DIR_CHANGE 0x0200
51
54
#define I2C_DMA_START_EN 0x0001
52
55
#define I2C_DMA_INT_FLAG_NONE 0x0000
53
56
#define I2C_DMA_CLR_FLAG 0x0000
@@ -205,6 +208,7 @@ struct mtk_i2c_compatible {
205
208
unsigned char timing_adjust : 1 ;
206
209
unsigned char dma_sync : 1 ;
207
210
unsigned char ltiming_adjust : 1 ;
211
+ unsigned char apdma_sync : 1 ;
208
212
};
209
213
210
214
struct mtk_i2c_ac_timing {
@@ -311,6 +315,7 @@ static const struct mtk_i2c_compatible mt2712_compat = {
311
315
.timing_adjust = 1 ,
312
316
.dma_sync = 0 ,
313
317
.ltiming_adjust = 0 ,
318
+ .apdma_sync = 0 ,
314
319
};
315
320
316
321
static const struct mtk_i2c_compatible mt6577_compat = {
@@ -324,6 +329,7 @@ static const struct mtk_i2c_compatible mt6577_compat = {
324
329
.timing_adjust = 0 ,
325
330
.dma_sync = 0 ,
326
331
.ltiming_adjust = 0 ,
332
+ .apdma_sync = 0 ,
327
333
};
328
334
329
335
static const struct mtk_i2c_compatible mt6589_compat = {
@@ -337,6 +343,7 @@ static const struct mtk_i2c_compatible mt6589_compat = {
337
343
.timing_adjust = 0 ,
338
344
.dma_sync = 0 ,
339
345
.ltiming_adjust = 0 ,
346
+ .apdma_sync = 0 ,
340
347
};
341
348
342
349
static const struct mtk_i2c_compatible mt7622_compat = {
@@ -350,6 +357,7 @@ static const struct mtk_i2c_compatible mt7622_compat = {
350
357
.timing_adjust = 0 ,
351
358
.dma_sync = 0 ,
352
359
.ltiming_adjust = 0 ,
360
+ .apdma_sync = 0 ,
353
361
};
354
362
355
363
static const struct mtk_i2c_compatible mt8173_compat = {
@@ -362,6 +370,7 @@ static const struct mtk_i2c_compatible mt8173_compat = {
362
370
.timing_adjust = 0 ,
363
371
.dma_sync = 0 ,
364
372
.ltiming_adjust = 0 ,
373
+ .apdma_sync = 0 ,
365
374
};
366
375
367
376
static const struct mtk_i2c_compatible mt8183_compat = {
@@ -375,6 +384,7 @@ static const struct mtk_i2c_compatible mt8183_compat = {
375
384
.timing_adjust = 1 ,
376
385
.dma_sync = 1 ,
377
386
.ltiming_adjust = 1 ,
387
+ .apdma_sync = 0 ,
378
388
};
379
389
380
390
static const struct of_device_id mtk_i2c_of_match [] = {
@@ -798,6 +808,7 @@ static int mtk_i2c_do_transfer(struct mtk_i2c *i2c, struct i2c_msg *msgs,
798
808
u16 start_reg ;
799
809
u16 control_reg ;
800
810
u16 restart_flag = 0 ;
811
+ u16 dma_sync = 0 ;
801
812
u32 reg_4g_mode ;
802
813
u8 * dma_rd_buf = NULL ;
803
814
u8 * dma_wr_buf = NULL ;
@@ -851,10 +862,16 @@ static int mtk_i2c_do_transfer(struct mtk_i2c *i2c, struct i2c_msg *msgs,
851
862
mtk_i2c_writew (i2c , num , OFFSET_TRANSAC_LEN );
852
863
}
853
864
865
+ if (i2c -> dev_comp -> apdma_sync ) {
866
+ dma_sync = I2C_DMA_SKIP_CONFIG | I2C_DMA_ASYNC_MODE ;
867
+ if (i2c -> op == I2C_MASTER_WRRD )
868
+ dma_sync |= I2C_DMA_DIR_CHANGE ;
869
+ }
870
+
854
871
/* Prepare buffer data to start transfer */
855
872
if (i2c -> op == I2C_MASTER_RD ) {
856
873
writel (I2C_DMA_INT_FLAG_NONE , i2c -> pdmabase + OFFSET_INT_FLAG );
857
- writel (I2C_DMA_CON_RX , i2c -> pdmabase + OFFSET_CON );
874
+ writel (I2C_DMA_CON_RX | dma_sync , i2c -> pdmabase + OFFSET_CON );
858
875
859
876
dma_rd_buf = i2c_get_dma_safe_msg_buf (msgs , 1 );
860
877
if (!dma_rd_buf )
@@ -877,7 +894,7 @@ static int mtk_i2c_do_transfer(struct mtk_i2c *i2c, struct i2c_msg *msgs,
877
894
writel (msgs -> len , i2c -> pdmabase + OFFSET_RX_LEN );
878
895
} else if (i2c -> op == I2C_MASTER_WR ) {
879
896
writel (I2C_DMA_INT_FLAG_NONE , i2c -> pdmabase + OFFSET_INT_FLAG );
880
- writel (I2C_DMA_CON_TX , i2c -> pdmabase + OFFSET_CON );
897
+ writel (I2C_DMA_CON_TX | dma_sync , i2c -> pdmabase + OFFSET_CON );
881
898
882
899
dma_wr_buf = i2c_get_dma_safe_msg_buf (msgs , 1 );
883
900
if (!dma_wr_buf )
@@ -900,7 +917,7 @@ static int mtk_i2c_do_transfer(struct mtk_i2c *i2c, struct i2c_msg *msgs,
900
917
writel (msgs -> len , i2c -> pdmabase + OFFSET_TX_LEN );
901
918
} else {
902
919
writel (I2C_DMA_CLR_FLAG , i2c -> pdmabase + OFFSET_INT_FLAG );
903
- writel (I2C_DMA_CLR_FLAG , i2c -> pdmabase + OFFSET_CON );
920
+ writel (I2C_DMA_CLR_FLAG | dma_sync , i2c -> pdmabase + OFFSET_CON );
904
921
905
922
dma_wr_buf = i2c_get_dma_safe_msg_buf (msgs , 1 );
906
923
if (!dma_wr_buf )
0 commit comments