2
2
* SuperH MSIOF SPI Master Interface
3
3
*
4
4
* Copyright (c) 2009 Magnus Damm
5
- * Copyright (C) 2014 Glider bvba
5
+ * Copyright (C) 2014 Renesas Electronics Corporation
6
+ * Copyright (C) 2014-2017 Glider bvba
6
7
*
7
8
* This program is free software; you can redistribute it and/or modify
8
9
* it under the terms of the GNU General Public License version 2 as
33
34
34
35
#include <asm/unaligned.h>
35
36
36
-
37
37
struct sh_msiof_chipdata {
38
38
u16 tx_fifo_size ;
39
39
u16 rx_fifo_size ;
@@ -53,6 +53,7 @@ struct sh_msiof_spi_priv {
53
53
void * rx_dma_page ;
54
54
dma_addr_t tx_dma_addr ;
55
55
dma_addr_t rx_dma_addr ;
56
+ bool slave_aborted ;
56
57
};
57
58
58
59
#define TMDR1 0x00 /* Transmit Mode Register 1 */
@@ -337,7 +338,10 @@ static void sh_msiof_spi_set_pin_regs(struct sh_msiof_spi_priv *p,
337
338
tmp |= !cs_high << MDR1_SYNCAC_SHIFT ;
338
339
tmp |= lsb_first << MDR1_BITLSB_SHIFT ;
339
340
tmp |= sh_msiof_spi_get_dtdl_and_syncdl (p );
340
- sh_msiof_write (p , TMDR1 , tmp | MDR1_TRMD | TMDR1_PCON );
341
+ if (spi_controller_is_slave (p -> master ))
342
+ sh_msiof_write (p , TMDR1 , tmp | TMDR1_PCON );
343
+ else
344
+ sh_msiof_write (p , TMDR1 , tmp | MDR1_TRMD | TMDR1_PCON );
341
345
if (p -> master -> flags & SPI_MASTER_MUST_TX ) {
342
346
/* These bits are reserved if RX needs TX */
343
347
tmp &= ~0x0000ffff ;
@@ -564,38 +568,69 @@ static int sh_msiof_prepare_message(struct spi_master *master,
564
568
565
569
static int sh_msiof_spi_start (struct sh_msiof_spi_priv * p , void * rx_buf )
566
570
{
567
- int ret ;
571
+ bool slave = spi_controller_is_slave (p -> master );
572
+ int ret = 0 ;
568
573
569
574
/* setup clock and rx/tx signals */
570
- ret = sh_msiof_modify_ctr_wait (p , 0 , CTR_TSCKE );
575
+ if (!slave )
576
+ ret = sh_msiof_modify_ctr_wait (p , 0 , CTR_TSCKE );
571
577
if (rx_buf && !ret )
572
578
ret = sh_msiof_modify_ctr_wait (p , 0 , CTR_RXE );
573
579
if (!ret )
574
580
ret = sh_msiof_modify_ctr_wait (p , 0 , CTR_TXE );
575
581
576
582
/* start by setting frame bit */
577
- if (!ret )
583
+ if (!ret && ! slave )
578
584
ret = sh_msiof_modify_ctr_wait (p , 0 , CTR_TFSE );
579
585
580
586
return ret ;
581
587
}
582
588
583
589
static int sh_msiof_spi_stop (struct sh_msiof_spi_priv * p , void * rx_buf )
584
590
{
585
- int ret ;
591
+ bool slave = spi_controller_is_slave (p -> master );
592
+ int ret = 0 ;
586
593
587
594
/* shut down frame, rx/tx and clock signals */
588
- ret = sh_msiof_modify_ctr_wait (p , CTR_TFSE , 0 );
595
+ if (!slave )
596
+ ret = sh_msiof_modify_ctr_wait (p , CTR_TFSE , 0 );
589
597
if (!ret )
590
598
ret = sh_msiof_modify_ctr_wait (p , CTR_TXE , 0 );
591
599
if (rx_buf && !ret )
592
600
ret = sh_msiof_modify_ctr_wait (p , CTR_RXE , 0 );
593
- if (!ret )
601
+ if (!ret && ! slave )
594
602
ret = sh_msiof_modify_ctr_wait (p , CTR_TSCKE , 0 );
595
603
596
604
return ret ;
597
605
}
598
606
607
+ static int sh_msiof_slave_abort (struct spi_master * master )
608
+ {
609
+ struct sh_msiof_spi_priv * p = spi_master_get_devdata (master );
610
+
611
+ p -> slave_aborted = true;
612
+ complete (& p -> done );
613
+ return 0 ;
614
+ }
615
+
616
+ static int sh_msiof_wait_for_completion (struct sh_msiof_spi_priv * p )
617
+ {
618
+ if (spi_controller_is_slave (p -> master )) {
619
+ if (wait_for_completion_interruptible (& p -> done ) ||
620
+ p -> slave_aborted ) {
621
+ dev_dbg (& p -> pdev -> dev , "interrupted\n" );
622
+ return - EINTR ;
623
+ }
624
+ } else {
625
+ if (!wait_for_completion_timeout (& p -> done , HZ )) {
626
+ dev_err (& p -> pdev -> dev , "timeout\n" );
627
+ return - ETIMEDOUT ;
628
+ }
629
+ }
630
+
631
+ return 0 ;
632
+ }
633
+
599
634
static int sh_msiof_spi_txrx_once (struct sh_msiof_spi_priv * p ,
600
635
void (* tx_fifo )(struct sh_msiof_spi_priv * ,
601
636
const void * , int , int ),
@@ -628,6 +663,7 @@ static int sh_msiof_spi_txrx_once(struct sh_msiof_spi_priv *p,
628
663
tx_fifo (p , tx_buf , words , fifo_shift );
629
664
630
665
reinit_completion (& p -> done );
666
+ p -> slave_aborted = false;
631
667
632
668
ret = sh_msiof_spi_start (p , rx_buf );
633
669
if (ret ) {
@@ -636,11 +672,9 @@ static int sh_msiof_spi_txrx_once(struct sh_msiof_spi_priv *p,
636
672
}
637
673
638
674
/* wait for tx fifo to be emptied / rx fifo to be filled */
639
- if (!wait_for_completion_timeout (& p -> done , HZ )) {
640
- dev_err (& p -> pdev -> dev , "PIO timeout\n" );
641
- ret = - ETIMEDOUT ;
675
+ ret = sh_msiof_wait_for_completion (p );
676
+ if (ret )
642
677
goto stop_reset ;
643
- }
644
678
645
679
/* read rx fifo */
646
680
if (rx_buf )
@@ -732,6 +766,7 @@ static int sh_msiof_dma_once(struct sh_msiof_spi_priv *p, const void *tx,
732
766
sh_msiof_write (p , IER , ier_bits );
733
767
734
768
reinit_completion (& p -> done );
769
+ p -> slave_aborted = false;
735
770
736
771
/* Now start DMA */
737
772
if (rx )
@@ -746,11 +781,9 @@ static int sh_msiof_dma_once(struct sh_msiof_spi_priv *p, const void *tx,
746
781
}
747
782
748
783
/* wait for tx fifo to be emptied / rx fifo to be filled */
749
- if (!wait_for_completion_timeout (& p -> done , HZ )) {
750
- dev_err (& p -> pdev -> dev , "DMA timeout\n" );
751
- ret = - ETIMEDOUT ;
784
+ ret = sh_msiof_wait_for_completion (p );
785
+ if (ret )
752
786
goto stop_reset ;
753
- }
754
787
755
788
/* clear status bits */
756
789
sh_msiof_reset_str (p );
@@ -843,7 +876,8 @@ static int sh_msiof_transfer_one(struct spi_master *master,
843
876
int ret ;
844
877
845
878
/* setup clocks (clock already enabled in chipselect()) */
846
- sh_msiof_spi_set_clk_regs (p , clk_get_rate (p -> clk ), t -> speed_hz );
879
+ if (!spi_controller_is_slave (p -> master ))
880
+ sh_msiof_spi_set_clk_regs (p , clk_get_rate (p -> clk ), t -> speed_hz );
847
881
848
882
while (master -> dma_tx && len > 15 ) {
849
883
/*
@@ -998,8 +1032,12 @@ static struct sh_msiof_spi_info *sh_msiof_spi_parse_dt(struct device *dev)
998
1032
if (!info )
999
1033
return NULL ;
1000
1034
1035
+ info -> mode = of_property_read_bool (np , "spi-slave" ) ? MSIOF_SPI_SLAVE
1036
+ : MSIOF_SPI_MASTER ;
1037
+
1001
1038
/* Parse the MSIOF properties */
1002
- of_property_read_u32 (np , "num-cs" , & num_cs );
1039
+ if (info -> mode == MSIOF_SPI_MASTER )
1040
+ of_property_read_u32 (np , "num-cs" , & num_cs );
1003
1041
of_property_read_u32 (np , "renesas,tx-fifo-size" ,
1004
1042
& info -> tx_fifo_override );
1005
1043
of_property_read_u32 (np , "renesas,rx-fifo-size" ,
@@ -1159,34 +1197,40 @@ static int sh_msiof_spi_probe(struct platform_device *pdev)
1159
1197
struct spi_master * master ;
1160
1198
const struct sh_msiof_chipdata * chipdata ;
1161
1199
const struct of_device_id * of_id ;
1200
+ struct sh_msiof_spi_info * info ;
1162
1201
struct sh_msiof_spi_priv * p ;
1163
1202
int i ;
1164
1203
int ret ;
1165
1204
1166
- master = spi_alloc_master (& pdev -> dev , sizeof (struct sh_msiof_spi_priv ));
1167
- if (master == NULL )
1168
- return - ENOMEM ;
1169
-
1170
- p = spi_master_get_devdata (master );
1171
-
1172
- platform_set_drvdata (pdev , p );
1173
- p -> master = master ;
1174
-
1175
1205
of_id = of_match_device (sh_msiof_match , & pdev -> dev );
1176
1206
if (of_id ) {
1177
1207
chipdata = of_id -> data ;
1178
- p -> info = sh_msiof_spi_parse_dt (& pdev -> dev );
1208
+ info = sh_msiof_spi_parse_dt (& pdev -> dev );
1179
1209
} else {
1180
1210
chipdata = (const void * )pdev -> id_entry -> driver_data ;
1181
- p -> info = dev_get_platdata (& pdev -> dev );
1211
+ info = dev_get_platdata (& pdev -> dev );
1182
1212
}
1183
1213
1184
- if (!p -> info ) {
1214
+ if (!info ) {
1185
1215
dev_err (& pdev -> dev , "failed to obtain device info\n" );
1186
- ret = - ENXIO ;
1187
- goto err1 ;
1216
+ return - ENXIO ;
1188
1217
}
1189
1218
1219
+ if (info -> mode == MSIOF_SPI_SLAVE )
1220
+ master = spi_alloc_slave (& pdev -> dev ,
1221
+ sizeof (struct sh_msiof_spi_priv ));
1222
+ else
1223
+ master = spi_alloc_master (& pdev -> dev ,
1224
+ sizeof (struct sh_msiof_spi_priv ));
1225
+ if (master == NULL )
1226
+ return - ENOMEM ;
1227
+
1228
+ p = spi_master_get_devdata (master );
1229
+
1230
+ platform_set_drvdata (pdev , p );
1231
+ p -> master = master ;
1232
+ p -> info = info ;
1233
+
1190
1234
init_completion (& p -> done );
1191
1235
1192
1236
p -> clk = devm_clk_get (& pdev -> dev , NULL );
@@ -1237,6 +1281,7 @@ static int sh_msiof_spi_probe(struct platform_device *pdev)
1237
1281
master -> num_chipselect = p -> info -> num_chipselect ;
1238
1282
master -> setup = sh_msiof_spi_setup ;
1239
1283
master -> prepare_message = sh_msiof_prepare_message ;
1284
+ master -> slave_abort = sh_msiof_slave_abort ;
1240
1285
master -> bits_per_word_mask = SPI_BPW_RANGE_MASK (8 , 32 );
1241
1286
master -> auto_runtime_pm = true;
1242
1287
master -> transfer_one = sh_msiof_transfer_one ;
0 commit comments