@@ -441,6 +441,8 @@ static int mtk_i2c_do_transfer(struct mtk_i2c *i2c, struct i2c_msg *msgs,
441
441
u16 control_reg ;
442
442
u16 restart_flag = 0 ;
443
443
u32 reg_4g_mode ;
444
+ u8 * dma_rd_buf = NULL ;
445
+ u8 * dma_wr_buf = NULL ;
444
446
dma_addr_t rpaddr = 0 ;
445
447
dma_addr_t wpaddr = 0 ;
446
448
int ret ;
@@ -500,10 +502,18 @@ static int mtk_i2c_do_transfer(struct mtk_i2c *i2c, struct i2c_msg *msgs,
500
502
if (i2c -> op == I2C_MASTER_RD ) {
501
503
writel (I2C_DMA_INT_FLAG_NONE , i2c -> pdmabase + OFFSET_INT_FLAG );
502
504
writel (I2C_DMA_CON_RX , i2c -> pdmabase + OFFSET_CON );
503
- rpaddr = dma_map_single (i2c -> dev , msgs -> buf ,
505
+
506
+ dma_rd_buf = i2c_get_dma_safe_msg_buf (msgs , 0 );
507
+ if (!dma_rd_buf )
508
+ return - ENOMEM ;
509
+
510
+ rpaddr = dma_map_single (i2c -> dev , dma_rd_buf ,
504
511
msgs -> len , DMA_FROM_DEVICE );
505
- if (dma_mapping_error (i2c -> dev , rpaddr ))
512
+ if (dma_mapping_error (i2c -> dev , rpaddr )) {
513
+ i2c_put_dma_safe_msg_buf (dma_rd_buf , msgs , false);
514
+
506
515
return - ENOMEM ;
516
+ }
507
517
508
518
if (i2c -> dev_comp -> support_33bits ) {
509
519
reg_4g_mode = mtk_i2c_set_4g_mode (rpaddr );
@@ -515,10 +525,18 @@ static int mtk_i2c_do_transfer(struct mtk_i2c *i2c, struct i2c_msg *msgs,
515
525
} else if (i2c -> op == I2C_MASTER_WR ) {
516
526
writel (I2C_DMA_INT_FLAG_NONE , i2c -> pdmabase + OFFSET_INT_FLAG );
517
527
writel (I2C_DMA_CON_TX , i2c -> pdmabase + OFFSET_CON );
518
- wpaddr = dma_map_single (i2c -> dev , msgs -> buf ,
528
+
529
+ dma_wr_buf = i2c_get_dma_safe_msg_buf (msgs , 0 );
530
+ if (!dma_wr_buf )
531
+ return - ENOMEM ;
532
+
533
+ wpaddr = dma_map_single (i2c -> dev , dma_wr_buf ,
519
534
msgs -> len , DMA_TO_DEVICE );
520
- if (dma_mapping_error (i2c -> dev , wpaddr ))
535
+ if (dma_mapping_error (i2c -> dev , wpaddr )) {
536
+ i2c_put_dma_safe_msg_buf (dma_wr_buf , msgs , false);
537
+
521
538
return - ENOMEM ;
539
+ }
522
540
523
541
if (i2c -> dev_comp -> support_33bits ) {
524
542
reg_4g_mode = mtk_i2c_set_4g_mode (wpaddr );
@@ -530,16 +548,39 @@ static int mtk_i2c_do_transfer(struct mtk_i2c *i2c, struct i2c_msg *msgs,
530
548
} else {
531
549
writel (I2C_DMA_CLR_FLAG , i2c -> pdmabase + OFFSET_INT_FLAG );
532
550
writel (I2C_DMA_CLR_FLAG , i2c -> pdmabase + OFFSET_CON );
533
- wpaddr = dma_map_single (i2c -> dev , msgs -> buf ,
551
+
552
+ dma_wr_buf = i2c_get_dma_safe_msg_buf (msgs , 0 );
553
+ if (!dma_wr_buf )
554
+ return - ENOMEM ;
555
+
556
+ wpaddr = dma_map_single (i2c -> dev , dma_wr_buf ,
534
557
msgs -> len , DMA_TO_DEVICE );
535
- if (dma_mapping_error (i2c -> dev , wpaddr ))
558
+ if (dma_mapping_error (i2c -> dev , wpaddr )) {
559
+ i2c_put_dma_safe_msg_buf (dma_wr_buf , msgs , false);
560
+
536
561
return - ENOMEM ;
537
- rpaddr = dma_map_single (i2c -> dev , (msgs + 1 )-> buf ,
562
+ }
563
+
564
+ dma_rd_buf = i2c_get_dma_safe_msg_buf ((msgs + 1 ), 0 );
565
+ if (!dma_rd_buf ) {
566
+ dma_unmap_single (i2c -> dev , wpaddr ,
567
+ msgs -> len , DMA_TO_DEVICE );
568
+
569
+ i2c_put_dma_safe_msg_buf (dma_wr_buf , msgs , false);
570
+
571
+ return - ENOMEM ;
572
+ }
573
+
574
+ rpaddr = dma_map_single (i2c -> dev , dma_rd_buf ,
538
575
(msgs + 1 )-> len ,
539
576
DMA_FROM_DEVICE );
540
577
if (dma_mapping_error (i2c -> dev , rpaddr )) {
541
578
dma_unmap_single (i2c -> dev , wpaddr ,
542
579
msgs -> len , DMA_TO_DEVICE );
580
+
581
+ i2c_put_dma_safe_msg_buf (dma_wr_buf , msgs , false);
582
+ i2c_put_dma_safe_msg_buf (dma_rd_buf , (msgs + 1 ), false);
583
+
543
584
return - ENOMEM ;
544
585
}
545
586
@@ -578,14 +619,21 @@ static int mtk_i2c_do_transfer(struct mtk_i2c *i2c, struct i2c_msg *msgs,
578
619
if (i2c -> op == I2C_MASTER_WR ) {
579
620
dma_unmap_single (i2c -> dev , wpaddr ,
580
621
msgs -> len , DMA_TO_DEVICE );
622
+
623
+ i2c_put_dma_safe_msg_buf (dma_wr_buf , msgs , true);
581
624
} else if (i2c -> op == I2C_MASTER_RD ) {
582
625
dma_unmap_single (i2c -> dev , rpaddr ,
583
626
msgs -> len , DMA_FROM_DEVICE );
627
+
628
+ i2c_put_dma_safe_msg_buf (dma_rd_buf , msgs , true);
584
629
} else {
585
630
dma_unmap_single (i2c -> dev , wpaddr , msgs -> len ,
586
631
DMA_TO_DEVICE );
587
632
dma_unmap_single (i2c -> dev , rpaddr , (msgs + 1 )-> len ,
588
633
DMA_FROM_DEVICE );
634
+
635
+ i2c_put_dma_safe_msg_buf (dma_wr_buf , msgs , true);
636
+ i2c_put_dma_safe_msg_buf (dma_rd_buf , (msgs + 1 ), true);
589
637
}
590
638
591
639
if (ret == 0 ) {
0 commit comments