21
21
#include <linux/interrupt.h>
22
22
#include <linux/reset.h>
23
23
#include <linux/pinctrl/consumer.h>
24
+ #include <linux/dma-mapping.h>
24
25
25
26
/*
26
- * The Meson SPICC controller could support DMA based transfers, but is not
27
- * implemented by the vendor code, and while having the registers documentation
28
- * it has never worked on the GXL Hardware.
29
- * The PIO mode is the only mode implemented, and due to badly designed HW :
30
- * - all transfers are cutted in 16 words burst because the FIFO hangs on
31
- * TX underflow, and there is no TX "Half-Empty" interrupt, so we go by
32
- * FIFO max size chunk only
33
- * - CS management is dumb, and goes UP between every burst, so is really a
34
- * "Data Valid" signal than a Chip Select, GPIO link should be used instead
35
- * to have a CS go down over the full transfer
27
+ * There are two modes for data transmission: PIO and DMA.
28
+ * When bits_per_word is 8, 16, 24, or 32, data is transferred using PIO mode.
29
+ * When bits_per_word is 64, DMA mode is used by default.
30
+ *
31
+ * DMA achieves a transfer with one or more SPI bursts, each SPI burst is made
32
+ * up of one or more DMA bursts. The DMA burst implementation mechanism is,
33
+ * For TX, when the number of words in TXFIFO is less than the preset
34
+ * reading threshold, SPICC starts a reading DMA burst, which reads the preset
35
+ * number of words from TX buffer, then writes them into TXFIFO.
36
+ * For RX, when the number of words in RXFIFO is greater than the preset
37
+ * writing threshold, SPICC starts a writing request burst, which reads the
38
+ * preset number of words from RXFIFO, then write them into RX buffer.
39
+ * DMA works if the transfer meets the following conditions,
40
+ * - 64 bits per word
41
+ * - The transfer length in word must be multiples of the dma_burst_len, and
42
+ * the dma_burst_len should be one of 8,7...2, otherwise, it will be split
43
+ * into several SPI bursts by this driver
36
44
*/
37
45
38
46
#define SPICC_MAX_BURST 128
128
136
129
137
#define SPICC_DWADDR 0x24 /* Write Address of DMA */
130
138
139
+ #define SPICC_LD_CNTL0 0x28
140
+ #define VSYNC_IRQ_SRC_SELECT BIT(0)
141
+ #define DMA_EN_SET_BY_VSYNC BIT(2)
142
+ #define XCH_EN_SET_BY_VSYNC BIT(3)
143
+ #define DMA_READ_COUNTER_EN BIT(4)
144
+ #define DMA_WRITE_COUNTER_EN BIT(5)
145
+ #define DMA_RADDR_LOAD_BY_VSYNC BIT(6)
146
+ #define DMA_WADDR_LOAD_BY_VSYNC BIT(7)
147
+ #define DMA_ADDR_LOAD_FROM_LD_ADDR BIT(8)
148
+
149
+ #define SPICC_LD_CNTL1 0x2c
150
+ #define DMA_READ_COUNTER GENMASK(15, 0)
151
+ #define DMA_WRITE_COUNTER GENMASK(31, 16)
152
+ #define DMA_BURST_LEN_DEFAULT 8
153
+ #define DMA_BURST_COUNT_MAX 0xffff
154
+ #define SPI_BURST_LEN_MAX (DMA_BURST_LEN_DEFAULT * DMA_BURST_COUNT_MAX)
155
+
131
156
#define SPICC_ENH_CTL0 0x38 /* Enhanced Feature */
132
157
#define SPICC_ENH_CLK_CS_DELAY_MASK GENMASK(15, 0)
133
158
#define SPICC_ENH_DATARATE_MASK GENMASK(23, 16)
@@ -171,6 +196,9 @@ struct meson_spicc_device {
171
196
struct pinctrl * pinctrl ;
172
197
struct pinctrl_state * pins_idle_high ;
173
198
struct pinctrl_state * pins_idle_low ;
199
+ dma_addr_t tx_dma ;
200
+ dma_addr_t rx_dma ;
201
+ bool using_dma ;
174
202
};
175
203
176
204
#define pow2_clk_to_spicc (_div ) container_of(_div, struct meson_spicc_device, pow2_div)
@@ -202,6 +230,148 @@ static void meson_spicc_oen_enable(struct meson_spicc_device *spicc)
202
230
writel_relaxed (conf , spicc -> base + SPICC_ENH_CTL0 );
203
231
}
204
232
233
+ static int meson_spicc_dma_map (struct meson_spicc_device * spicc ,
234
+ struct spi_transfer * t )
235
+ {
236
+ struct device * dev = spicc -> host -> dev .parent ;
237
+
238
+ if (!(t -> tx_buf && t -> rx_buf ))
239
+ return - EINVAL ;
240
+
241
+ t -> tx_dma = dma_map_single (dev , (void * )t -> tx_buf , t -> len , DMA_TO_DEVICE );
242
+ if (dma_mapping_error (dev , t -> tx_dma ))
243
+ return - ENOMEM ;
244
+
245
+ t -> rx_dma = dma_map_single (dev , t -> rx_buf , t -> len , DMA_FROM_DEVICE );
246
+ if (dma_mapping_error (dev , t -> rx_dma ))
247
+ return - ENOMEM ;
248
+
249
+ spicc -> tx_dma = t -> tx_dma ;
250
+ spicc -> rx_dma = t -> rx_dma ;
251
+
252
+ return 0 ;
253
+ }
254
+
255
+ static void meson_spicc_dma_unmap (struct meson_spicc_device * spicc ,
256
+ struct spi_transfer * t )
257
+ {
258
+ struct device * dev = spicc -> host -> dev .parent ;
259
+
260
+ if (t -> tx_dma )
261
+ dma_unmap_single (dev , t -> tx_dma , t -> len , DMA_TO_DEVICE );
262
+ if (t -> rx_dma )
263
+ dma_unmap_single (dev , t -> rx_dma , t -> len , DMA_FROM_DEVICE );
264
+ }
265
+
266
+ /*
267
+ * According to the remain words length, calculate a suitable spi burst length
268
+ * and a dma burst length for current spi burst
269
+ */
270
+ static u32 meson_spicc_calc_dma_len (struct meson_spicc_device * spicc ,
271
+ u32 len , u32 * dma_burst_len )
272
+ {
273
+ u32 i ;
274
+
275
+ if (len <= spicc -> data -> fifo_size ) {
276
+ * dma_burst_len = len ;
277
+ return len ;
278
+ }
279
+
280
+ * dma_burst_len = DMA_BURST_LEN_DEFAULT ;
281
+
282
+ if (len == (SPI_BURST_LEN_MAX + 1 ))
283
+ return SPI_BURST_LEN_MAX - DMA_BURST_LEN_DEFAULT ;
284
+
285
+ if (len >= SPI_BURST_LEN_MAX )
286
+ return SPI_BURST_LEN_MAX ;
287
+
288
+ for (i = DMA_BURST_LEN_DEFAULT ; i > 1 ; i -- )
289
+ if ((len % i ) == 0 ) {
290
+ * dma_burst_len = i ;
291
+ return len ;
292
+ }
293
+
294
+ i = len % DMA_BURST_LEN_DEFAULT ;
295
+ len -= i ;
296
+
297
+ if (i == 1 )
298
+ len -= DMA_BURST_LEN_DEFAULT ;
299
+
300
+ return len ;
301
+ }
302
+
303
+ static void meson_spicc_setup_dma (struct meson_spicc_device * spicc )
304
+ {
305
+ unsigned int len ;
306
+ unsigned int dma_burst_len , dma_burst_count ;
307
+ unsigned int count_en = 0 ;
308
+ unsigned int txfifo_thres = 0 ;
309
+ unsigned int read_req = 0 ;
310
+ unsigned int rxfifo_thres = 31 ;
311
+ unsigned int write_req = 0 ;
312
+ unsigned int ld_ctr1 = 0 ;
313
+
314
+ writel_relaxed (spicc -> tx_dma , spicc -> base + SPICC_DRADDR );
315
+ writel_relaxed (spicc -> rx_dma , spicc -> base + SPICC_DWADDR );
316
+
317
+ /* Set the max burst length to support a transmission with length of
318
+ * no more than 1024 bytes(128 words), which must use the CS management
319
+ * because of some strict timing requirements
320
+ */
321
+ writel_bits_relaxed (SPICC_BURSTLENGTH_MASK , SPICC_BURSTLENGTH_MASK ,
322
+ spicc -> base + SPICC_CONREG );
323
+
324
+ len = meson_spicc_calc_dma_len (spicc , spicc -> xfer_remain ,
325
+ & dma_burst_len );
326
+ spicc -> xfer_remain -= len ;
327
+ dma_burst_count = DIV_ROUND_UP (len , dma_burst_len );
328
+ dma_burst_len -- ;
329
+
330
+ if (spicc -> tx_dma ) {
331
+ spicc -> tx_dma += len ;
332
+ count_en |= DMA_READ_COUNTER_EN ;
333
+ txfifo_thres = spicc -> data -> fifo_size - dma_burst_len ;
334
+ read_req = dma_burst_len ;
335
+ ld_ctr1 |= FIELD_PREP (DMA_READ_COUNTER , dma_burst_count );
336
+ }
337
+
338
+ if (spicc -> rx_dma ) {
339
+ spicc -> rx_dma += len ;
340
+ count_en |= DMA_WRITE_COUNTER_EN ;
341
+ rxfifo_thres = dma_burst_len ;
342
+ write_req = dma_burst_len ;
343
+ ld_ctr1 |= FIELD_PREP (DMA_WRITE_COUNTER , dma_burst_count );
344
+ }
345
+
346
+ writel_relaxed (count_en , spicc -> base + SPICC_LD_CNTL0 );
347
+ writel_relaxed (ld_ctr1 , spicc -> base + SPICC_LD_CNTL1 );
348
+ writel_relaxed (SPICC_DMA_ENABLE
349
+ | SPICC_DMA_URGENT
350
+ | FIELD_PREP (SPICC_TXFIFO_THRESHOLD_MASK , txfifo_thres )
351
+ | FIELD_PREP (SPICC_READ_BURST_MASK , read_req )
352
+ | FIELD_PREP (SPICC_RXFIFO_THRESHOLD_MASK , rxfifo_thres )
353
+ | FIELD_PREP (SPICC_WRITE_BURST_MASK , write_req ),
354
+ spicc -> base + SPICC_DMAREG );
355
+ }
356
+
357
+ static irqreturn_t meson_spicc_dma_irq (struct meson_spicc_device * spicc )
358
+ {
359
+ if (readl_relaxed (spicc -> base + SPICC_DMAREG ) & SPICC_DMA_ENABLE )
360
+ return IRQ_HANDLED ;
361
+
362
+ if (spicc -> xfer_remain ) {
363
+ meson_spicc_setup_dma (spicc );
364
+ } else {
365
+ writel_bits_relaxed (SPICC_SMC , 0 , spicc -> base + SPICC_CONREG );
366
+ writel_relaxed (0 , spicc -> base + SPICC_INTREG );
367
+ writel_relaxed (0 , spicc -> base + SPICC_DMAREG );
368
+ meson_spicc_dma_unmap (spicc , spicc -> xfer );
369
+ complete (& spicc -> done );
370
+ }
371
+
372
+ return IRQ_HANDLED ;
373
+ }
374
+
205
375
static inline bool meson_spicc_txfull (struct meson_spicc_device * spicc )
206
376
{
207
377
return !!FIELD_GET (SPICC_TF ,
@@ -293,6 +463,9 @@ static irqreturn_t meson_spicc_irq(int irq, void *data)
293
463
294
464
writel_bits_relaxed (SPICC_TC , SPICC_TC , spicc -> base + SPICC_STATREG );
295
465
466
+ if (spicc -> using_dma )
467
+ return meson_spicc_dma_irq (spicc );
468
+
296
469
/* Empty RX FIFO */
297
470
meson_spicc_rx (spicc );
298
471
@@ -426,9 +599,6 @@ static int meson_spicc_transfer_one(struct spi_controller *host,
426
599
427
600
meson_spicc_reset_fifo (spicc );
428
601
429
- /* Setup burst */
430
- meson_spicc_setup_burst (spicc );
431
-
432
602
/* Setup wait for completion */
433
603
reinit_completion (& spicc -> done );
434
604
@@ -442,11 +612,36 @@ static int meson_spicc_transfer_one(struct spi_controller *host,
442
612
/* Increase it twice and add 200 ms tolerance */
443
613
timeout += timeout + 200 ;
444
614
445
- /* Start burst */
446
- writel_bits_relaxed (SPICC_XCH , SPICC_XCH , spicc -> base + SPICC_CONREG );
615
+ if (xfer -> bits_per_word == 64 ) {
616
+ int ret ;
617
+
618
+ /* dma_burst_len 1 can't trigger a dma burst */
619
+ if (xfer -> len < 16 )
620
+ return - EINVAL ;
621
+
622
+ ret = meson_spicc_dma_map (spicc , xfer );
623
+ if (ret ) {
624
+ meson_spicc_dma_unmap (spicc , xfer );
625
+ dev_err (host -> dev .parent , "dma map failed\n" );
626
+ return ret ;
627
+ }
628
+
629
+ spicc -> using_dma = true;
630
+ spicc -> xfer_remain = DIV_ROUND_UP (xfer -> len , spicc -> bytes_per_word );
631
+ meson_spicc_setup_dma (spicc );
632
+ writel_relaxed (SPICC_TE_EN , spicc -> base + SPICC_INTREG );
633
+ writel_bits_relaxed (SPICC_SMC , SPICC_SMC , spicc -> base + SPICC_CONREG );
634
+ } else {
635
+ spicc -> using_dma = false;
636
+ /* Setup burst */
637
+ meson_spicc_setup_burst (spicc );
447
638
448
- /* Enable interrupts */
449
- writel_relaxed (SPICC_TC_EN , spicc -> base + SPICC_INTREG );
639
+ /* Start burst */
640
+ writel_bits_relaxed (SPICC_XCH , SPICC_XCH , spicc -> base + SPICC_CONREG );
641
+
642
+ /* Enable interrupts */
643
+ writel_relaxed (SPICC_TC_EN , spicc -> base + SPICC_INTREG );
644
+ }
450
645
451
646
if (!wait_for_completion_timeout (& spicc -> done , msecs_to_jiffies (timeout )))
452
647
return - ETIMEDOUT ;
@@ -545,6 +740,14 @@ static int meson_spicc_setup(struct spi_device *spi)
545
740
if (!spi -> controller_state )
546
741
spi -> controller_state = spi_controller_get_devdata (spi -> controller );
547
742
743
+ /* DMA works at 64 bits, the rest works on PIO */
744
+ if (spi -> bits_per_word != 8 &&
745
+ spi -> bits_per_word != 16 &&
746
+ spi -> bits_per_word != 24 &&
747
+ spi -> bits_per_word != 32 &&
748
+ spi -> bits_per_word != 64 )
749
+ return - EINVAL ;
750
+
548
751
return 0 ;
549
752
}
550
753
@@ -853,10 +1056,6 @@ static int meson_spicc_probe(struct platform_device *pdev)
853
1056
host -> num_chipselect = 4 ;
854
1057
host -> dev .of_node = pdev -> dev .of_node ;
855
1058
host -> mode_bits = SPI_CPHA | SPI_CPOL | SPI_CS_HIGH | SPI_LOOP ;
856
- host -> bits_per_word_mask = SPI_BPW_MASK (32 ) |
857
- SPI_BPW_MASK (24 ) |
858
- SPI_BPW_MASK (16 ) |
859
- SPI_BPW_MASK (8 );
860
1059
host -> flags = (SPI_CONTROLLER_MUST_RX | SPI_CONTROLLER_MUST_TX );
861
1060
host -> min_speed_hz = spicc -> data -> min_speed_hz ;
862
1061
host -> max_speed_hz = spicc -> data -> max_speed_hz ;
0 commit comments