11
11
#include <linux/interrupt.h>
12
12
#include <linux/iopoll.h>
13
13
#include <linux/log2.h>
14
+ #include <linux/of.h>
14
15
#include <linux/platform_device.h>
15
16
#include <linux/property.h>
16
17
#include <linux/reset.h>
38
39
#define CSI_MODE_SETUP 0x00000040
39
40
40
41
/* CSI_CLKSEL */
42
+ #define CSI_CLKSEL_SS_ENA BIT(19)
43
+ #define CSI_CLKSEL_SS_POL BIT(18)
44
+ #define CSI_CLKSEL_SS (CSI_CLKSEL_SS_ENA | CSI_CLKSEL_SS_POL)
41
45
#define CSI_CLKSEL_CKP BIT(17)
42
46
#define CSI_CLKSEL_DAP BIT(16)
43
47
#define CSI_CLKSEL_MODE (CSI_CLKSEL_CKP|CSI_CLKSEL_DAP)
82
86
83
87
#define CSI_MAX_SPI_SCKO (8 * HZ_PER_MHZ)
84
88
89
+ #define CSI_CLKSEL_SS_DISABLED 0
90
+ #define CSI_CLKSEL_SS_ENABLED_ACTIVE_LOW BIT(1)
91
+ #define CSI_CLKSEL_SS_ENABLED_ACTIVE_HIGH GENMASK(1, 0)
92
+
85
93
struct rzv2m_csi_priv {
86
94
void __iomem * base ;
87
95
struct clk * csiclk ;
@@ -99,6 +107,8 @@ struct rzv2m_csi_priv {
99
107
wait_queue_head_t wait ;
100
108
u32 errors ;
101
109
u32 status ;
110
+ bool target_aborted ;
111
+ bool use_ss_pin ;
102
112
};
103
113
104
114
static void rzv2m_csi_reg_write_bit (const struct rzv2m_csi_priv * csi ,
@@ -193,6 +203,14 @@ static int rzv2m_csi_read_rxfifo(struct rzv2m_csi_priv *csi)
193
203
return 0 ;
194
204
}
195
205
206
+ static inline void rzv2m_csi_empty_rxfifo (struct rzv2m_csi_priv * csi )
207
+ {
208
+ unsigned int i ;
209
+
210
+ for (i = 0 ; i < csi -> words_to_transfer ; i ++ )
211
+ readl (csi -> base + CSI_IFIFO );
212
+ }
213
+
196
214
static inline void rzv2m_csi_calc_current_transfer (struct rzv2m_csi_priv * csi )
197
215
{
198
216
unsigned int bytes_transferred = max (csi -> bytes_received , csi -> bytes_sent );
@@ -279,40 +297,31 @@ static int rzv2m_csi_wait_for_interrupt(struct rzv2m_csi_priv *csi,
279
297
280
298
rzv2m_csi_enable_irqs (csi , enable_bits );
281
299
282
- ret = wait_event_timeout (csi -> wait ,
283
- ((csi -> status & wait_mask ) == wait_mask ) ||
284
- csi -> errors , HZ );
300
+ if (spi_controller_is_target (csi -> controller )) {
301
+ ret = wait_event_interruptible (csi -> wait ,
302
+ ((csi -> status & wait_mask ) == wait_mask ) ||
303
+ csi -> errors || csi -> target_aborted );
304
+ if (ret || csi -> target_aborted )
305
+ ret = - EINTR ;
306
+ } else {
307
+ ret = wait_event_timeout (csi -> wait ,
308
+ ((csi -> status & wait_mask ) == wait_mask ) ||
309
+ csi -> errors , HZ ) == 0 ? - ETIMEDOUT : 0 ;
310
+ }
285
311
286
312
rzv2m_csi_disable_irqs (csi , enable_bits );
287
313
288
314
if (csi -> errors )
289
315
return - EIO ;
290
316
291
- if (!ret )
292
- return - ETIMEDOUT ;
293
-
294
- return 0 ;
295
- }
296
-
297
- static int rzv2m_csi_wait_for_tx_empty (struct rzv2m_csi_priv * csi )
298
- {
299
- int ret ;
300
-
301
- if (readl (csi -> base + CSI_OFIFOL ) == 0 )
302
- return 0 ;
303
-
304
- ret = rzv2m_csi_wait_for_interrupt (csi , CSI_INT_TREND , CSI_CNT_TREND_E );
305
- if (ret == - ETIMEDOUT )
306
- csi -> errors |= TX_TIMEOUT_ERROR ;
307
-
308
317
return ret ;
309
318
}
310
319
311
320
static inline int rzv2m_csi_wait_for_rx_ready (struct rzv2m_csi_priv * csi )
312
321
{
313
322
int ret ;
314
323
315
- if (readl (csi -> base + CSI_IFIFOL ) = = csi -> bytes_to_transfer )
324
+ if (readl (csi -> base + CSI_IFIFOL ) > = csi -> bytes_to_transfer )
316
325
return 0 ;
317
326
318
327
ret = rzv2m_csi_wait_for_interrupt (csi , CSI_INT_R_TRGR ,
@@ -388,6 +397,7 @@ static void rzv2m_csi_setup_operating_mode(struct rzv2m_csi_priv *csi,
388
397
static int rzv2m_csi_setup (struct spi_device * spi )
389
398
{
390
399
struct rzv2m_csi_priv * csi = spi_controller_get_devdata (spi -> controller );
400
+ u32 slave_selection = CSI_CLKSEL_SS_DISABLED ;
391
401
int ret ;
392
402
393
403
rzv2m_csi_sw_reset (csi , 0 );
@@ -402,8 +412,17 @@ static int rzv2m_csi_setup(struct spi_device *spi)
402
412
rzv2m_csi_reg_write_bit (csi , CSI_MODE , CSI_MODE_DIR ,
403
413
!!(spi -> mode & SPI_LSB_FIRST ));
404
414
405
- /* Set the operation mode as master */
406
- rzv2m_csi_reg_write_bit (csi , CSI_CLKSEL , CSI_CLKSEL_SLAVE , 0 );
415
+ /* Set the role, 1 for target and 0 for host */
416
+ rzv2m_csi_reg_write_bit (csi , CSI_CLKSEL , CSI_CLKSEL_SLAVE ,
417
+ !!spi_controller_is_target (csi -> controller ));
418
+
419
+ if (csi -> use_ss_pin )
420
+ slave_selection = spi -> mode & SPI_CS_HIGH ?
421
+ CSI_CLKSEL_SS_ENABLED_ACTIVE_HIGH :
422
+ CSI_CLKSEL_SS_ENABLED_ACTIVE_LOW ;
423
+
424
+ /* Configure the slave selection (SS) pin */
425
+ rzv2m_csi_reg_write_bit (csi , CSI_CLKSEL , CSI_CLKSEL_SS , slave_selection );
407
426
408
427
/* Give the IP a SW reset */
409
428
ret = rzv2m_csi_sw_reset (csi , 1 );
@@ -431,9 +450,13 @@ static int rzv2m_csi_pio_transfer(struct rzv2m_csi_priv *csi)
431
450
/* Make sure the TX FIFO is empty */
432
451
writel (0 , csi -> base + CSI_OFIFOL );
433
452
453
+ /* Make sure the RX FIFO is empty */
454
+ writel (0 , csi -> base + CSI_IFIFOL );
455
+
434
456
csi -> bytes_sent = 0 ;
435
457
csi -> bytes_received = 0 ;
436
458
csi -> errors = 0 ;
459
+ csi -> target_aborted = false;
437
460
438
461
rzv2m_csi_disable_all_irqs (csi );
439
462
rzv2m_csi_clear_all_irqs (csi );
@@ -452,28 +475,21 @@ static int rzv2m_csi_pio_transfer(struct rzv2m_csi_priv *csi)
452
475
453
476
rzv2m_csi_enable_irqs (csi , CSI_INT_OVERF | CSI_INT_UNDER );
454
477
455
- /* Make sure the RX FIFO is empty */
456
- writel (0 , csi -> base + CSI_IFIFOL );
457
-
458
478
writel (readl (csi -> base + CSI_INT ), csi -> base + CSI_INT );
459
479
csi -> status = 0 ;
460
480
461
- rzv2m_csi_start_stop_operation (csi , 1 , false);
462
-
463
481
/* TX */
464
482
if (csi -> txbuf ) {
465
483
ret = rzv2m_csi_fill_txfifo (csi );
466
484
if (ret )
467
485
break ;
468
486
469
- ret = rzv2m_csi_wait_for_tx_empty (csi );
470
- if (ret )
471
- break ;
472
-
473
487
if (csi -> bytes_sent == csi -> buffer_len )
474
488
tx_completed = true;
475
489
}
476
490
491
+ rzv2m_csi_start_stop_operation (csi , 1 , false);
492
+
477
493
/*
478
494
* Make sure the RX FIFO contains the desired number of words.
479
495
* We then either flush its content, or we copy it onto
@@ -483,31 +499,28 @@ static int rzv2m_csi_pio_transfer(struct rzv2m_csi_priv *csi)
483
499
if (ret )
484
500
break ;
485
501
486
- /* RX */
487
- if (csi -> rxbuf ) {
502
+ if (!spi_controller_is_target (csi -> controller ))
488
503
rzv2m_csi_start_stop_operation (csi , 0 , false);
489
504
505
+ /* RX */
506
+ if (csi -> rxbuf ) {
490
507
ret = rzv2m_csi_read_rxfifo (csi );
491
508
if (ret )
492
509
break ;
493
510
494
511
if (csi -> bytes_received == csi -> buffer_len )
495
512
rx_completed = true;
513
+ } else {
514
+ rzv2m_csi_empty_rxfifo (csi );
496
515
}
497
516
498
- ret = rzv2m_csi_start_stop_operation (csi , 0 , true);
499
- if (ret )
500
- goto pio_quit ;
501
-
502
517
if (csi -> errors ) {
503
518
ret = - EIO ;
504
- goto pio_quit ;
519
+ break ;
505
520
}
506
521
}
507
522
508
523
rzv2m_csi_start_stop_operation (csi , 0 , true);
509
-
510
- pio_quit :
511
524
rzv2m_csi_disable_all_irqs (csi );
512
525
rzv2m_csi_enable_rx_trigger (csi , false);
513
526
rzv2m_csi_clear_all_irqs (csi );
@@ -529,7 +542,8 @@ static int rzv2m_csi_transfer_one(struct spi_controller *controller,
529
542
530
543
rzv2m_csi_setup_operating_mode (csi , transfer );
531
544
532
- rzv2m_csi_setup_clock (csi , transfer -> speed_hz );
545
+ if (!spi_controller_is_target (csi -> controller ))
546
+ rzv2m_csi_setup_clock (csi , transfer -> speed_hz );
533
547
534
548
ret = rzv2m_csi_pio_transfer (csi );
535
549
if (ret ) {
@@ -546,24 +560,48 @@ static int rzv2m_csi_transfer_one(struct spi_controller *controller,
546
560
return ret ;
547
561
}
548
562
563
+ static int rzv2m_csi_target_abort (struct spi_controller * ctlr )
564
+ {
565
+ struct rzv2m_csi_priv * csi = spi_controller_get_devdata (ctlr );
566
+
567
+ csi -> target_aborted = true;
568
+ wake_up (& csi -> wait );
569
+
570
+ return 0 ;
571
+ }
572
+
549
573
static int rzv2m_csi_probe (struct platform_device * pdev )
550
574
{
575
+ struct device_node * np = pdev -> dev .of_node ;
551
576
struct spi_controller * controller ;
552
577
struct device * dev = & pdev -> dev ;
553
578
struct rzv2m_csi_priv * csi ;
554
579
struct reset_control * rstc ;
580
+ bool target_mode ;
555
581
int irq ;
556
582
int ret ;
557
583
558
- controller = devm_spi_alloc_host (dev , sizeof (* csi ));
584
+ target_mode = of_property_read_bool (np , "spi-slave" );
585
+
586
+ if (target_mode )
587
+ controller = devm_spi_alloc_target (dev , sizeof (* csi ));
588
+ else
589
+ controller = devm_spi_alloc_host (dev , sizeof (* csi ));
590
+
559
591
if (!controller )
560
592
return - ENOMEM ;
561
593
562
594
csi = spi_controller_get_devdata (controller );
563
595
platform_set_drvdata (pdev , csi );
564
596
597
+ csi -> use_ss_pin = false;
598
+ if (spi_controller_is_target (controller ) &&
599
+ !of_property_read_bool (np , "renesas,csi-no-ss" ))
600
+ csi -> use_ss_pin = true;
601
+
565
602
csi -> dev = dev ;
566
603
csi -> controller = controller ;
604
+ csi -> target_aborted = false;
567
605
568
606
csi -> base = devm_platform_ioremap_resource (pdev , 0 );
569
607
if (IS_ERR (csi -> base ))
@@ -589,11 +627,12 @@ static int rzv2m_csi_probe(struct platform_device *pdev)
589
627
590
628
init_waitqueue_head (& csi -> wait );
591
629
592
- controller -> mode_bits = SPI_CPOL | SPI_CPHA | SPI_LSB_FIRST ;
630
+ controller -> mode_bits = SPI_CPOL | SPI_CPHA | SPI_LSB_FIRST | SPI_CS_HIGH ;
593
631
controller -> bits_per_word_mask = SPI_BPW_MASK (16 ) | SPI_BPW_MASK (8 );
594
632
controller -> setup = rzv2m_csi_setup ;
595
633
controller -> transfer_one = rzv2m_csi_transfer_one ;
596
634
controller -> use_gpio_descriptors = true;
635
+ controller -> target_abort = rzv2m_csi_target_abort ;
597
636
598
637
device_set_node (& controller -> dev , dev_fwnode (dev ));
599
638
0 commit comments