21
21
*/
22
22
#include <linux/clk.h>
23
23
#include <linux/delay.h>
24
+ #include <linux/dmaengine.h>
25
+ #include <linux/dma-mapping.h>
24
26
#include <linux/err.h>
25
27
#include <linux/interrupt.h>
26
28
#include <linux/io.h>
43
45
#define ICSAR 0x1C /* slave address */
44
46
#define ICMAR 0x20 /* master address */
45
47
#define ICRXTX 0x24 /* data port */
48
+ #define ICDMAER 0x3c /* DMA enable */
49
+ #define ICFBSCR 0x38 /* first bit setup cycle */
46
50
47
51
/* ICSCR */
48
52
#define SDBS (1 << 3) /* slave data buffer select */
78
82
#define MDR (1 << 1)
79
83
#define MAT (1 << 0) /* slave addr xfer done */
80
84
85
+ /* ICDMAER */
86
+ #define RSDMAE (1 << 3) /* DMA Slave Received Enable */
87
+ #define TSDMAE (1 << 2) /* DMA Slave Transmitted Enable */
88
+ #define RMDMAE (1 << 1) /* DMA Master Received Enable */
89
+ #define TMDMAE (1 << 0) /* DMA Master Transmitted Enable */
90
+
91
+ /* ICFBSCR */
92
+ #define TCYC06 0x04 /* 6*Tcyc delay 1st bit between SDA and SCL */
93
+ #define TCYC17 0x0f /* 17*Tcyc delay 1st bit between SDA and SCL */
94
+
81
95
82
96
#define RCAR_BUS_PHASE_START (MDBS | MIE | ESG)
83
97
#define RCAR_BUS_PHASE_DATA (MDBS | MIE)
@@ -120,6 +134,12 @@ struct rcar_i2c_priv {
120
134
u32 flags ;
121
135
enum rcar_i2c_type devtype ;
122
136
struct i2c_client * slave ;
137
+
138
+ struct resource * res ;
139
+ struct dma_chan * dma_tx ;
140
+ struct dma_chan * dma_rx ;
141
+ struct scatterlist sg ;
142
+ enum dma_data_direction dma_direction ;
123
143
};
124
144
125
145
#define rcar_i2c_priv_to_dev (p ) ((p)->adap.dev.parent)
@@ -287,6 +307,118 @@ static void rcar_i2c_next_msg(struct rcar_i2c_priv *priv)
287
307
/*
288
308
* interrupt functions
289
309
*/
310
+ static void rcar_i2c_dma_unmap (struct rcar_i2c_priv * priv )
311
+ {
312
+ struct dma_chan * chan = priv -> dma_direction == DMA_FROM_DEVICE
313
+ ? priv -> dma_rx : priv -> dma_tx ;
314
+
315
+ /* Disable DMA Master Received/Transmitted */
316
+ rcar_i2c_write (priv , ICDMAER , 0 );
317
+
318
+ /* Reset default delay */
319
+ rcar_i2c_write (priv , ICFBSCR , TCYC06 );
320
+
321
+ dma_unmap_single (chan -> device -> dev , sg_dma_address (& priv -> sg ),
322
+ priv -> msg -> len , priv -> dma_direction );
323
+
324
+ priv -> dma_direction = DMA_NONE ;
325
+ }
326
+
327
+ static void rcar_i2c_cleanup_dma (struct rcar_i2c_priv * priv )
328
+ {
329
+ if (priv -> dma_direction == DMA_NONE )
330
+ return ;
331
+ else if (priv -> dma_direction == DMA_FROM_DEVICE )
332
+ dmaengine_terminate_all (priv -> dma_rx );
333
+ else if (priv -> dma_direction == DMA_TO_DEVICE )
334
+ dmaengine_terminate_all (priv -> dma_tx );
335
+
336
+ rcar_i2c_dma_unmap (priv );
337
+ }
338
+
339
+ static void rcar_i2c_dma_callback (void * data )
340
+ {
341
+ struct rcar_i2c_priv * priv = data ;
342
+
343
+ priv -> pos += sg_dma_len (& priv -> sg );
344
+
345
+ rcar_i2c_dma_unmap (priv );
346
+ }
347
+
348
+ static void rcar_i2c_dma (struct rcar_i2c_priv * priv )
349
+ {
350
+ struct device * dev = rcar_i2c_priv_to_dev (priv );
351
+ struct i2c_msg * msg = priv -> msg ;
352
+ bool read = msg -> flags & I2C_M_RD ;
353
+ enum dma_data_direction dir = read ? DMA_FROM_DEVICE : DMA_TO_DEVICE ;
354
+ struct dma_chan * chan = read ? priv -> dma_rx : priv -> dma_tx ;
355
+ struct dma_async_tx_descriptor * txdesc ;
356
+ dma_addr_t dma_addr ;
357
+ dma_cookie_t cookie ;
358
+ unsigned char * buf ;
359
+ int len ;
360
+
361
+ /* Do not use DMA if it's not available or for messages < 8 bytes */
362
+ if (IS_ERR (chan ) || msg -> len < 8 )
363
+ return ;
364
+
365
+ if (read ) {
366
+ /*
367
+ * The last two bytes needs to be fetched using PIO in
368
+ * order for the STOP phase to work.
369
+ */
370
+ buf = priv -> msg -> buf ;
371
+ len = priv -> msg -> len - 2 ;
372
+ } else {
373
+ /*
374
+ * First byte in message was sent using PIO.
375
+ */
376
+ buf = priv -> msg -> buf + 1 ;
377
+ len = priv -> msg -> len - 1 ;
378
+ }
379
+
380
+ dma_addr = dma_map_single (chan -> device -> dev , buf , len , dir );
381
+ if (dma_mapping_error (dev , dma_addr )) {
382
+ dev_dbg (dev , "dma map failed, using PIO\n" );
383
+ return ;
384
+ }
385
+
386
+ sg_dma_len (& priv -> sg ) = len ;
387
+ sg_dma_address (& priv -> sg ) = dma_addr ;
388
+
389
+ priv -> dma_direction = dir ;
390
+
391
+ txdesc = dmaengine_prep_slave_sg (chan , & priv -> sg , 1 ,
392
+ read ? DMA_DEV_TO_MEM : DMA_MEM_TO_DEV ,
393
+ DMA_PREP_INTERRUPT | DMA_CTRL_ACK );
394
+ if (!txdesc ) {
395
+ dev_dbg (dev , "dma prep slave sg failed, using PIO\n" );
396
+ rcar_i2c_cleanup_dma (priv );
397
+ return ;
398
+ }
399
+
400
+ txdesc -> callback = rcar_i2c_dma_callback ;
401
+ txdesc -> callback_param = priv ;
402
+
403
+ cookie = dmaengine_submit (txdesc );
404
+ if (dma_submit_error (cookie )) {
405
+ dev_dbg (dev , "submitting dma failed, using PIO\n" );
406
+ rcar_i2c_cleanup_dma (priv );
407
+ return ;
408
+ }
409
+
410
+ /* Set delay for DMA operations */
411
+ rcar_i2c_write (priv , ICFBSCR , TCYC17 );
412
+
413
+ /* Enable DMA Master Received/Transmitted */
414
+ if (read )
415
+ rcar_i2c_write (priv , ICDMAER , RMDMAE );
416
+ else
417
+ rcar_i2c_write (priv , ICDMAER , TMDMAE );
418
+
419
+ dma_async_issue_pending (chan );
420
+ }
421
+
290
422
static void rcar_i2c_irq_send (struct rcar_i2c_priv * priv , u32 msr )
291
423
{
292
424
struct i2c_msg * msg = priv -> msg ;
@@ -306,6 +438,12 @@ static void rcar_i2c_irq_send(struct rcar_i2c_priv *priv, u32 msr)
306
438
rcar_i2c_write (priv , ICRXTX , msg -> buf [priv -> pos ]);
307
439
priv -> pos ++ ;
308
440
441
+ /*
442
+ * Try to use DMA to transmit the rest of the data if
443
+ * address transfer pashe just finished.
444
+ */
445
+ if (msr & MAT )
446
+ rcar_i2c_dma (priv );
309
447
} else {
310
448
/*
311
449
* The last data was pushed to ICRXTX on _PREV_ empty irq.
@@ -340,7 +478,11 @@ static void rcar_i2c_irq_recv(struct rcar_i2c_priv *priv, u32 msr)
340
478
return ;
341
479
342
480
if (msr & MAT ) {
343
- /* Address transfer phase finished, but no data at this point. */
481
+ /*
482
+ * Address transfer phase finished, but no data at this point.
483
+ * Try to use DMA to receive data.
484
+ */
485
+ rcar_i2c_dma (priv );
344
486
} else if (priv -> pos < msg -> len ) {
345
487
/* get received data */
346
488
msg -> buf [priv -> pos ] = rcar_i2c_read (priv , ICRXTX );
@@ -472,6 +614,81 @@ static irqreturn_t rcar_i2c_irq(int irq, void *ptr)
472
614
return IRQ_HANDLED ;
473
615
}
474
616
617
+ static struct dma_chan * rcar_i2c_request_dma_chan (struct device * dev ,
618
+ enum dma_transfer_direction dir ,
619
+ dma_addr_t port_addr )
620
+ {
621
+ struct dma_chan * chan ;
622
+ struct dma_slave_config cfg ;
623
+ char * chan_name = dir == DMA_MEM_TO_DEV ? "tx" : "rx" ;
624
+ int ret ;
625
+
626
+ chan = dma_request_slave_channel_reason (dev , chan_name );
627
+ if (IS_ERR (chan )) {
628
+ ret = PTR_ERR (chan );
629
+ dev_dbg (dev , "request_channel failed for %s (%d)\n" ,
630
+ chan_name , ret );
631
+ return chan ;
632
+ }
633
+
634
+ memset (& cfg , 0 , sizeof (cfg ));
635
+ cfg .direction = dir ;
636
+ if (dir == DMA_MEM_TO_DEV ) {
637
+ cfg .dst_addr = port_addr ;
638
+ cfg .dst_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE ;
639
+ } else {
640
+ cfg .src_addr = port_addr ;
641
+ cfg .src_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE ;
642
+ }
643
+
644
+ ret = dmaengine_slave_config (chan , & cfg );
645
+ if (ret ) {
646
+ dev_dbg (dev , "slave_config failed for %s (%d)\n" ,
647
+ chan_name , ret );
648
+ dma_release_channel (chan );
649
+ return ERR_PTR (ret );
650
+ }
651
+
652
+ dev_dbg (dev , "got DMA channel for %s\n" , chan_name );
653
+ return chan ;
654
+ }
655
+
656
+ static void rcar_i2c_request_dma (struct rcar_i2c_priv * priv ,
657
+ struct i2c_msg * msg )
658
+ {
659
+ struct device * dev = rcar_i2c_priv_to_dev (priv );
660
+ bool read ;
661
+ struct dma_chan * chan ;
662
+ enum dma_transfer_direction dir ;
663
+
664
+ read = msg -> flags & I2C_M_RD ;
665
+
666
+ chan = read ? priv -> dma_rx : priv -> dma_tx ;
667
+ if (PTR_ERR (chan ) != - EPROBE_DEFER )
668
+ return ;
669
+
670
+ dir = read ? DMA_DEV_TO_MEM : DMA_MEM_TO_DEV ;
671
+ chan = rcar_i2c_request_dma_chan (dev , dir , priv -> res -> start + ICRXTX );
672
+
673
+ if (read )
674
+ priv -> dma_rx = chan ;
675
+ else
676
+ priv -> dma_tx = chan ;
677
+ }
678
+
679
+ static void rcar_i2c_release_dma (struct rcar_i2c_priv * priv )
680
+ {
681
+ if (!IS_ERR (priv -> dma_tx )) {
682
+ dma_release_channel (priv -> dma_tx );
683
+ priv -> dma_tx = ERR_PTR (- EPROBE_DEFER );
684
+ }
685
+
686
+ if (!IS_ERR (priv -> dma_rx )) {
687
+ dma_release_channel (priv -> dma_rx );
688
+ priv -> dma_rx = ERR_PTR (- EPROBE_DEFER );
689
+ }
690
+ }
691
+
475
692
static int rcar_i2c_master_xfer (struct i2c_adapter * adap ,
476
693
struct i2c_msg * msgs ,
477
694
int num )
@@ -493,6 +710,7 @@ static int rcar_i2c_master_xfer(struct i2c_adapter *adap,
493
710
ret = - EOPNOTSUPP ;
494
711
goto out ;
495
712
}
713
+ rcar_i2c_request_dma (priv , msgs + i );
496
714
}
497
715
498
716
/* init first message */
@@ -504,6 +722,7 @@ static int rcar_i2c_master_xfer(struct i2c_adapter *adap,
504
722
time_left = wait_event_timeout (priv -> wait , priv -> flags & ID_DONE ,
505
723
num * adap -> timeout );
506
724
if (!time_left ) {
725
+ rcar_i2c_cleanup_dma (priv );
507
726
rcar_i2c_init (priv );
508
727
ret = - ETIMEDOUT ;
509
728
} else if (priv -> flags & ID_NACK ) {
@@ -591,7 +810,6 @@ static int rcar_i2c_probe(struct platform_device *pdev)
591
810
{
592
811
struct rcar_i2c_priv * priv ;
593
812
struct i2c_adapter * adap ;
594
- struct resource * res ;
595
813
struct device * dev = & pdev -> dev ;
596
814
struct i2c_timings i2c_t ;
597
815
int irq , ret ;
@@ -606,8 +824,9 @@ static int rcar_i2c_probe(struct platform_device *pdev)
606
824
return PTR_ERR (priv -> clk );
607
825
}
608
826
609
- res = platform_get_resource (pdev , IORESOURCE_MEM , 0 );
610
- priv -> io = devm_ioremap_resource (dev , res );
827
+ priv -> res = platform_get_resource (pdev , IORESOURCE_MEM , 0 );
828
+
829
+ priv -> io = devm_ioremap_resource (dev , priv -> res );
611
830
if (IS_ERR (priv -> io ))
612
831
return PTR_ERR (priv -> io );
613
832
@@ -626,6 +845,11 @@ static int rcar_i2c_probe(struct platform_device *pdev)
626
845
627
846
i2c_parse_fw_timings (dev , & i2c_t , false);
628
847
848
+ /* Init DMA */
849
+ sg_init_table (& priv -> sg , 1 );
850
+ priv -> dma_direction = DMA_NONE ;
851
+ priv -> dma_rx = priv -> dma_tx = ERR_PTR (- EPROBE_DEFER );
852
+
629
853
pm_runtime_enable (dev );
630
854
pm_runtime_get_sync (dev );
631
855
ret = rcar_i2c_clock_calculate (priv , & i2c_t );
@@ -673,6 +897,7 @@ static int rcar_i2c_remove(struct platform_device *pdev)
673
897
struct device * dev = & pdev -> dev ;
674
898
675
899
i2c_del_adapter (& priv -> adap );
900
+ rcar_i2c_release_dma (priv );
676
901
if (priv -> flags & ID_P_PM_BLOCKED )
677
902
pm_runtime_put (dev );
678
903
pm_runtime_disable (dev );
0 commit comments