@@ -183,6 +183,8 @@ struct rockchip_spi {
183
183
u8 rsd ;
184
184
185
185
bool cs_asserted [ROCKCHIP_SPI_MAX_CS_NUM ];
186
+
187
+ bool slave_abort ;
186
188
};
187
189
188
190
static inline void spi_enable_chip (struct rockchip_spi * rs , bool enable )
@@ -359,7 +361,7 @@ static void rockchip_spi_dma_rxcb(void *data)
359
361
struct rockchip_spi * rs = spi_controller_get_devdata (ctlr );
360
362
int state = atomic_fetch_andnot (RXDMA , & rs -> state );
361
363
362
- if (state & TXDMA )
364
+ if (state & TXDMA && ! rs -> slave_abort )
363
365
return ;
364
366
365
367
spi_enable_chip (rs , false);
@@ -372,7 +374,7 @@ static void rockchip_spi_dma_txcb(void *data)
372
374
struct rockchip_spi * rs = spi_controller_get_devdata (ctlr );
373
375
int state = atomic_fetch_andnot (TXDMA , & rs -> state );
374
376
375
- if (state & RXDMA )
377
+ if (state & RXDMA && ! rs -> slave_abort )
376
378
return ;
377
379
378
380
/* Wait until the FIFO data completely. */
@@ -457,7 +459,7 @@ static int rockchip_spi_prepare_dma(struct rockchip_spi *rs,
457
459
458
460
static void rockchip_spi_config (struct rockchip_spi * rs ,
459
461
struct spi_device * spi , struct spi_transfer * xfer ,
460
- bool use_dma )
462
+ bool use_dma , bool slave_mode )
461
463
{
462
464
u32 cr0 = CR0_FRF_SPI << CR0_FRF_OFFSET
463
465
| CR0_BHT_8BIT << CR0_BHT_OFFSET
@@ -466,6 +468,10 @@ static void rockchip_spi_config(struct rockchip_spi *rs,
466
468
u32 cr1 ;
467
469
u32 dmacr = 0 ;
468
470
471
+ if (slave_mode )
472
+ cr0 |= CR0_OPM_SLAVE << CR0_OPM_OFFSET ;
473
+ rs -> slave_abort = false;
474
+
469
475
cr0 |= rs -> rsd << CR0_RSD_OFFSET ;
470
476
cr0 |= (spi -> mode & 0x3U ) << CR0_SCPH_OFFSET ;
471
477
if (spi -> mode & SPI_LSB_FIRST )
@@ -535,6 +541,16 @@ static size_t rockchip_spi_max_transfer_size(struct spi_device *spi)
535
541
return ROCKCHIP_SPI_MAX_TRANLEN ;
536
542
}
537
543
544
+ static int rockchip_spi_slave_abort (struct spi_controller * ctlr )
545
+ {
546
+ struct rockchip_spi * rs = spi_controller_get_devdata (ctlr );
547
+
548
+ rs -> slave_abort = true;
549
+ complete (& ctlr -> xfer_completion );
550
+
551
+ return 0 ;
552
+ }
553
+
538
554
static int rockchip_spi_transfer_one (
539
555
struct spi_controller * ctlr ,
540
556
struct spi_device * spi ,
@@ -560,7 +576,7 @@ static int rockchip_spi_transfer_one(
560
576
561
577
use_dma = ctlr -> can_dma ? ctlr -> can_dma (ctlr , spi , xfer ) : false;
562
578
563
- rockchip_spi_config (rs , spi , xfer , use_dma );
579
+ rockchip_spi_config (rs , spi , xfer , use_dma , ctlr -> slave );
564
580
565
581
if (use_dma )
566
582
return rockchip_spi_prepare_dma (rs , ctlr , xfer );
@@ -588,15 +604,26 @@ static int rockchip_spi_probe(struct platform_device *pdev)
588
604
struct rockchip_spi * rs ;
589
605
struct spi_controller * ctlr ;
590
606
struct resource * mem ;
607
+ struct device_node * np = pdev -> dev .of_node ;
591
608
u32 rsd_nsecs ;
609
+ bool slave_mode ;
610
+
611
+ slave_mode = of_property_read_bool (np , "spi-slave" );
612
+
613
+ if (slave_mode )
614
+ ctlr = spi_alloc_slave (& pdev -> dev ,
615
+ sizeof (struct rockchip_spi ));
616
+ else
617
+ ctlr = spi_alloc_master (& pdev -> dev ,
618
+ sizeof (struct rockchip_spi ));
592
619
593
- ctlr = spi_alloc_master (& pdev -> dev , sizeof (struct rockchip_spi ));
594
620
if (!ctlr )
595
621
return - ENOMEM ;
596
622
597
623
platform_set_drvdata (pdev , ctlr );
598
624
599
625
rs = spi_controller_get_devdata (ctlr );
626
+ ctlr -> slave = slave_mode ;
600
627
601
628
/* Get basic io resource and map it */
602
629
mem = platform_get_resource (pdev , IORESOURCE_MEM , 0 );
@@ -676,6 +703,12 @@ static int rockchip_spi_probe(struct platform_device *pdev)
676
703
ctlr -> auto_runtime_pm = true;
677
704
ctlr -> bus_num = pdev -> id ;
678
705
ctlr -> mode_bits = SPI_CPOL | SPI_CPHA | SPI_LOOP | SPI_LSB_FIRST ;
706
+ if (slave_mode ) {
707
+ ctlr -> mode_bits |= SPI_NO_CS ;
708
+ ctlr -> slave_abort = rockchip_spi_slave_abort ;
709
+ } else {
710
+ ctlr -> flags = SPI_MASTER_GPIO_SS ;
711
+ }
679
712
ctlr -> num_chipselect = ROCKCHIP_SPI_MAX_CS_NUM ;
680
713
ctlr -> dev .of_node = pdev -> dev .of_node ;
681
714
ctlr -> bits_per_word_mask = SPI_BPW_MASK (16 ) | SPI_BPW_MASK (8 ) | SPI_BPW_MASK (4 );
@@ -686,7 +719,6 @@ static int rockchip_spi_probe(struct platform_device *pdev)
686
719
ctlr -> transfer_one = rockchip_spi_transfer_one ;
687
720
ctlr -> max_transfer_size = rockchip_spi_max_transfer_size ;
688
721
ctlr -> handle_err = rockchip_spi_handle_err ;
689
- ctlr -> flags = SPI_MASTER_GPIO_SS ;
690
722
691
723
ctlr -> dma_tx = dma_request_chan (rs -> dev , "tx" );
692
724
if (IS_ERR (ctlr -> dma_tx )) {
0 commit comments