1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
|
// SPDX-License-Identifier: GPL-2.0
//
// SpacemiT K1 SPI controller driver
//
// Copyright (C) 2026, RISCstar Solutions Corporation
// Copyright (C) 2023, SpacemiT Corporation
#include <linux/bitfield.h>
#include <linux/clk.h>
#include <linux/device.h>
#include <linux/dma-mapping.h>
#include <linux/dmaengine.h>
#include <linux/interrupt.h>
#include <linux/kernel.h>
#include <linux/of.h>
#include <linux/platform_device.h>
#include <linux/reset.h>
#include <linux/scatterlist.h>
#include <linux/sizes.h>
#include <linux/spi/spi.h>
#include <linux/units.h>
#include "internals.h"
/* This is the range of transfer rates supported by the K1 SoC */
#define K1_SPI_MIN_SPEED_HZ 6250
#define K1_SPI_MAX_SPEED_HZ 51200000
/* DMA constraints */
#define K1_SPI_DMA_ALIGNMENT 64
#define K1_SPI_MAX_DMA_LEN SZ_512K
/* SSP Top Control Register */
#define SSP_TOP_CTRL 0x00
#define TOP_SSE BIT(0) /* Enable port */
#define TOP_FRF_MASK GENMASK(2, 1) /* Frame format */
#define TOP_FRF_MOTOROLA 0 /* Motorola SPI */
#define TOP_DSS_MASK GENMASK(9, 5) /* Data size (1-32) */
#define TOP_SPO BIT(10) /* Polarity: 0=low */
#define TOP_SPH BIT(11) /* Half-cycle phase */
#define TOP_LBM BIT(12) /* Loopback mode */
#define TOP_TRAIL BIT(13) /* Trailing bytes */
#define TOP_HOLD_FRAME_LOW BIT(14) /* Chip select */
/* SSP FIFO Control Register */
#define SSP_FIFO_CTRL 0x04
#define FIFO_TFT_MASK GENMASK(4, 0) /* TX FIFO threshold */
#define FIFO_RFT_MASK GENMASK(9, 5) /* RX FIFO threshold */
#define FIFO_TSRE BIT(10) /* TX service request */
#define FIFO_RSRE BIT(11) /* RX service request */
/* SSP Interrupt Enable Register */
#define SSP_INT_EN 0x08
#define SSP_INT_EN_TINTE BIT(1) /* RX timeout */
#define SSP_INT_EN_RIE BIT(2) /* RX FIFO */
#define SSP_INT_EN_TIE BIT(3) /* TX FIFO */
#define SSP_INT_EN_RIM BIT(4) /* RX FIFO overrun */
#define SSP_INT_EN_TIM BIT(5) /* TX FIFO underrun */
#define SSP_INT_EN_EBCEI BIT(6) /* Bit count error */
/* TX interrupts, RX interrupts, and error interrupts */
#define SSP_INT_EN_TX SSP_INT_EN_TIE
#define SSP_INT_EN_RX \
(SSP_INT_EN_TINTE | SSP_INT_EN_RIE)
#define SSP_INT_EN_ERROR \
(SSP_INT_EN_RIM | SSP_INT_EN_TIM | SSP_INT_EN_EBCEI)
/* SSP Time Out Register */
#define SSP_TIMEOUT 0x0c
#define SSP_TIMEOUT_MASK GENMASK(23, 0)
/* SSP Data Register */
#define SSP_DATAR 0x10
/* SSP Status Register */
#define SSP_STATUS 0x14
#define SSP_STATUS_BSY BIT(0) /* SPI/I2S busy */
#define SSP_STATUS_TNF BIT(6) /* TX FIFO not full */
#define SSP_STATUS_TFL GENMASK(11, 7) /* TX FIFO level */
#define SSP_STATUS_TUR BIT(12) /* TX FIFO underrun */
#define SSP_STATUS_RNE BIT(14) /* RX FIFO not empty */
#define SSP_STATUS_RFL GENMASK(19, 15) /* RX FIFO level */
#define SSP_STATUS_ROR BIT(20) /* RX FIFO overrun */
#define SSP_STATUS_BCE BIT(21) /* Bit count error */
/* Error status mask */
#define SSP_STATUS_ERROR \
(SSP_STATUS_TUR | SSP_STATUS_ROR | SSP_STATUS_BCE)
/* The FIFO sizes and thresholds are the same for RX and TX */
#define K1_SPI_FIFO_SIZE 32
#define K1_SPI_THRESH (K1_SPI_FIFO_SIZE / 2)
struct k1_spi_driver_data {
struct spi_controller *host;
void __iomem *base;
phys_addr_t base_addr;
unsigned long bus_rate;
struct clk *clk;
unsigned long rate;
int irq;
/* Current transfer information; not valid if message is null */
u32 bytes; /* Bytes used for bits_per_word */
unsigned int rx_resid; /* RX bytes left in transfer */
unsigned int tx_resid; /* TX bytes left in transfer */
struct spi_transfer *transfer; /* Current transfer */
bool dma_enabled;
};
/* Set our registers to a known initial state */
static void
k1_spi_register_reset(struct k1_spi_driver_data *drv_data, bool initial)
{
u32 val = 0;
writel(0, drv_data->base + SSP_TOP_CTRL);
if (initial) {
/*
* The TX and RX FIFO thresholds are the same no matter
* what the speed or bits per word, so we can just set
* them once. The thresholds are one more than the values
* in the register.
*/
val = FIELD_PREP(FIFO_RFT_MASK, K1_SPI_THRESH - 1);
val |= FIELD_PREP(FIFO_TFT_MASK, K1_SPI_THRESH - 1);
}
writel(val, drv_data->base + SSP_FIFO_CTRL);
writel(0, drv_data->base + SSP_INT_EN);
writel(0, drv_data->base + SSP_TIMEOUT);
/* Clear any pending interrupt conditions */
writel(~0, drv_data->base + SSP_STATUS);
}
/*
* The client can call the setup function multiple times, and each call
* can specify a different SPI mode (and transfer speed). Each transfer
* can specify its own speed though, and the core code ensures each
* transfer's speed is set to something nonzero and supported by both
* the controller and the device. We just set the speed for each transfer.
*/
static int k1_spi_setup(struct spi_device *spi)
{
struct k1_spi_driver_data *drv_data;
u32 val;
drv_data = spi_controller_get_devdata(spi->controller);
/*
* Configure the message format for this device. We only
* support Motorola SPI format in master mode.
*/
val = FIELD_PREP(TOP_FRF_MASK, TOP_FRF_MOTOROLA);
/* Translate the mode into the value used to program the hardware. */
if (spi->mode & SPI_CPHA)
val |= TOP_SPH; /* 1/2 cycle */
if (spi->mode & SPI_CPOL)
val |= TOP_SPO; /* active low */
if (spi->mode & SPI_LOOP)
val |= TOP_LBM; /* enable loopback */
writel(val, drv_data->base + SSP_TOP_CTRL);
return 0;
}
static void k1_spi_cleanup(struct spi_device *spi)
{
struct k1_spi_driver_data *drv_data;
drv_data = spi_controller_get_devdata(spi->controller);
k1_spi_register_reset(drv_data, false);
}
static bool k1_spi_can_dma(struct spi_controller *host, struct spi_device *spi,
struct spi_transfer *transfer)
{
struct k1_spi_driver_data *drv_data = spi_controller_get_devdata(host);
u32 burst_size;
if (!drv_data->dma_enabled)
return false;
if (transfer->len > SZ_2K)
return false;
/* Don't bother with DMA if we can't do even a single burst */
burst_size = K1_SPI_THRESH * spi_bpw_to_bytes(transfer->bits_per_word);
return transfer->len >= burst_size;
}
static void k1_spi_dma_callback(void *param)
{
struct k1_spi_driver_data *drv_data = param;
u32 val;
val = readl(drv_data->base + SSP_FIFO_CTRL);
val &= ~(FIFO_TSRE | FIFO_RSRE);
writel(val, drv_data->base + SSP_FIFO_CTRL);
val = readl(drv_data->base + SSP_TOP_CTRL);
val &= ~TOP_TRAIL;
writel(val, drv_data->base + SSP_TOP_CTRL);
/* Check for any error conditions */
val = readl(drv_data->base + SSP_STATUS);
if (val & SSP_STATUS_ERROR)
drv_data->transfer->error |= SPI_TRANS_FAIL_IO;
/* Disable the port */
val = readl(drv_data->base + SSP_TOP_CTRL);
val &= ~TOP_SSE;
writel(val, drv_data->base + SSP_TOP_CTRL);
drv_data->transfer = NULL;
spi_finalize_current_transfer(drv_data->host);
}
/* Prepare a descriptor for TX or RX DMA */
static struct dma_async_tx_descriptor *
k1_spi_dma_prep(struct k1_spi_driver_data *drv_data,
struct spi_transfer *transfer, bool tx)
{
phys_addr_t addr = drv_data->base_addr + SSP_DATAR;
u32 burst_size = K1_SPI_THRESH * drv_data->bytes;
struct dma_slave_config cfg = { };
enum dma_transfer_direction dir;
enum dma_slave_buswidth width;
struct dma_chan *chan;
struct sg_table *sgt;
switch (drv_data->bytes) {
case 1:
width = DMA_SLAVE_BUSWIDTH_1_BYTE;
break;
case 2:
width = DMA_SLAVE_BUSWIDTH_2_BYTES;
break;
default: /* bytes == 4 */
width = DMA_SLAVE_BUSWIDTH_4_BYTES;
break;
}
if (tx) {
chan = drv_data->host->dma_tx;
sgt = &transfer->tx_sg;
dir = DMA_MEM_TO_DEV;
cfg.dst_addr = addr;
cfg.dst_addr_width = width;
cfg.dst_maxburst = burst_size;
} else {
chan = drv_data->host->dma_rx;
sgt = &transfer->rx_sg;
dir = DMA_DEV_TO_MEM;
cfg.src_addr = addr;
cfg.src_addr_width = width;
cfg.src_maxburst = burst_size;
}
cfg.direction = dir;
if (dmaengine_slave_config(chan, &cfg))
return NULL;
return dmaengine_prep_slave_sg(chan, sgt->sgl, sgt->nents, dir,
DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
}
static int k1_spi_dma_one(struct spi_controller *host, struct spi_device *spi,
struct spi_transfer *transfer)
{
struct k1_spi_driver_data *drv_data = spi_controller_get_devdata(host);
struct dma_async_tx_descriptor *desc;
u32 val;
/* Prepare the TX descriptor and submit it */
desc = k1_spi_dma_prep(drv_data, transfer, true);
if (!desc)
goto fallback;
dmaengine_submit(desc);
/* Prepare the RX descriptor and submit it */
desc = k1_spi_dma_prep(drv_data, transfer, false);
if (!desc)
goto fallback;
/* When RX is complete we also know TX has completed */
desc->callback = k1_spi_dma_callback;
desc->callback_param = drv_data;
dmaengine_submit(desc);
val = readl(drv_data->base + SSP_TOP_CTRL);
val |= TOP_TRAIL; /* Trailing bytes handled by DMA */
writel(val, drv_data->base + SSP_TOP_CTRL);
val = readl(drv_data->base + SSP_FIFO_CTRL);
val |= FIFO_TSRE | FIFO_RSRE;
writel(val, drv_data->base + SSP_FIFO_CTRL);
/* Start RX first so we're ready the instant we start transmitting */
dma_async_issue_pending(host->dma_rx);
dma_async_issue_pending(host->dma_tx);
return 1;
fallback:
transfer->error |= SPI_TRANS_FAIL_NO_START;
return -EAGAIN;
}
/* Flush the RX FIFO of any leftover data before processing a message */
static int k1_spi_prepare_message(struct spi_controller *host,
struct spi_message *message)
{
struct k1_spi_driver_data *drv_data = spi_controller_get_devdata(host);
u32 val = readl(drv_data->base + SSP_STATUS);
u32 count;
/* If there's nothing in the FIFO, we're done */
if (!(val & SSP_STATUS_RNE))
return 0;
/* Read and discard what's there (one more than what the field says) */
count = FIELD_GET(SSP_STATUS_RFL, val) + 1;
do
(void)readl(drv_data->base + SSP_DATAR);
while (--count);
return 0;
}
/* Set logic level of chip select line (high=true means CS deasserted) */
static void k1_spi_set_cs(struct spi_device *spi, bool high)
{
struct k1_spi_driver_data *drv_data;
u32 val;
drv_data = spi_controller_get_devdata(spi->controller);
val = readl(drv_data->base + SSP_TOP_CTRL);
if (high)
val &= ~TOP_HOLD_FRAME_LOW;
else
val |= TOP_HOLD_FRAME_LOW;
writel(val, drv_data->base + SSP_TOP_CTRL);
}
/* Set the transfer speed; the SPI core code ensures it is supported */
static int k1_spi_set_speed(struct k1_spi_driver_data *drv_data,
struct spi_transfer *transfer)
{
struct clk *clk = drv_data->clk;
u64 nsec_per_word;
u64 bus_ticks;
u32 timeout;
u32 val;
int ret;
ret = clk_set_rate(clk, transfer->speed_hz);
if (ret)
return ret;
drv_data->rate = clk_get_rate(clk);
/* No need for RX FIFO timeout if we're not receiving anything */
if (!transfer->rx_buf)
return 0;
/*
* Compute the RX FIFO inactivity timeout value that should be used.
* The inactivity timer restarts with each word that lands in the
* FIFO. If several "word transfer times" pass without any new data
* in the RX FIFO, we might as well read what's there.
*
* The rate at which words land in the FIFO is determined by the
* word size and the transfer rate. One bit is transferred per
* clock tick, and 8 (or 16 or 32) bits are transferred per word.
*
* So we can get word transfer time (in nanoseconds) from:
* nsec_per_tick = NSEC_PER_SEC / drv_data->rate;
* ticks_per_word = BITS_PER_BYTE * drv_data->bytes;
* We do the divide last for better accuracy.
*/
nsec_per_word = (u64)NSEC_PER_SEC * BITS_PER_BYTE * drv_data->bytes;
nsec_per_word = DIV_ROUND_UP_ULL(nsec_per_word, drv_data->rate);
/*
* The timeout (which we'll set to three word transfer times) is
* expressed as a number of APB clock ticks.
* bus_ticks = 3 * nsec * (drv_data->bus_rate / NSEC_PER_SEC)
*/
bus_ticks = 3 * nsec_per_word * drv_data->bus_rate;
timeout = DIV_ROUND_UP_ULL(bus_ticks, NSEC_PER_SEC);
/* Set the RX timeout period (required for both DMA and PIO) */
val = FIELD_PREP(SSP_TIMEOUT_MASK, timeout);
writel(val, drv_data->base + SSP_TIMEOUT);
return 0;
}
static int k1_spi_transfer_one(struct spi_controller *host,
struct spi_device *spi,
struct spi_transfer *transfer)
{
struct k1_spi_driver_data *drv_data = spi_controller_get_devdata(host);
u32 ctrl;
u32 val;
int ret;
/* Bits per word can change on a per-transfer basis */
drv_data->bytes = spi_bpw_to_bytes(transfer->bits_per_word);
/* Each transfer can also specify a different rate */
ret = k1_spi_set_speed(drv_data, transfer);
if (ret) {
dev_err(&host->dev,
"failed to set transfer speed: %d\n", ret);
return ret;
}
drv_data->rx_resid = transfer->len;
drv_data->tx_resid = transfer->len;
drv_data->transfer = transfer;
/* Clear any existing interrupt conditions */
writel(~0, drv_data->base + SSP_STATUS);
/* Set the data (word) size, and enable the port */
ctrl = readl(drv_data->base + SSP_TOP_CTRL);
ctrl &= ~TOP_DSS_MASK;
ctrl |= FIELD_PREP(TOP_DSS_MASK, transfer->bits_per_word - 1);
ctrl |= TOP_SSE;
writel(ctrl, drv_data->base + SSP_TOP_CTRL);
if (spi_xfer_is_dma_mapped(host, spi, transfer))
return k1_spi_dma_one(host, spi, transfer);
/* An interrupt will initiate the transfer */
val = SSP_INT_EN_TX | SSP_INT_EN_RX | SSP_INT_EN_ERROR;
writel(val, drv_data->base + SSP_INT_EN);
return 1; /* We will call spi_finalize_current_transfer() */
}
static void
k1_spi_handle_err(struct spi_controller *host, struct spi_message *message)
{
struct k1_spi_driver_data *drv_data = spi_controller_get_devdata(host);
if (drv_data->dma_enabled) {
dmaengine_terminate_sync(host->dma_rx);
dmaengine_terminate_sync(host->dma_tx);
}
}
static void k1_spi_write_word(struct k1_spi_driver_data *drv_data)
{
struct spi_transfer *transfer = drv_data->transfer;
u32 bytes = drv_data->bytes;
u32 val;
if (transfer->tx_buf) {
const void *buf;
buf = transfer->tx_buf + (transfer->len - drv_data->tx_resid);
if (bytes == 1)
val = *(u8 *)buf;
else if (bytes == 2)
val = *(u16 *)buf;
else /* bytes == 4 */
val = *(u32 *)buf;
} else {
val = 0; /* Null writer; write 1, 2, or 4 zero bytes */
}
/* Fill the next TX FIFO entry */
writel(val, drv_data->base + SSP_DATAR);
drv_data->tx_resid -= bytes;
}
/* The last-read status value is provided; we know SSP_STATUS_TNF is set */
static bool k1_spi_write(struct k1_spi_driver_data *drv_data, u32 val)
{
unsigned int count;
/* Get the number of open slots in the FIFO; zero means all */
count = FIELD_GET(SSP_STATUS_TFL, val) ? : K1_SPI_FIFO_SIZE;
/*
* Limit how much we try to send at a time, to reduce the
* chance the other side can overrun our RX FIFO.
*/
count = min3(count, K1_SPI_THRESH, drv_data->tx_resid / drv_data->bytes);
do
k1_spi_write_word(drv_data);
while (--count);
return !drv_data->tx_resid;
}
static void k1_spi_read_word(struct k1_spi_driver_data *drv_data)
{
struct spi_transfer *transfer = drv_data->transfer;
u32 bytes = drv_data->bytes;
u32 val;
/* Consume the next RX FIFO entry */
val = readl(drv_data->base + SSP_DATAR);
if (transfer->rx_buf) {
void *buf;
buf = transfer->rx_buf + (transfer->len - drv_data->rx_resid);
if (bytes == 1)
*(u8 *)buf = val;
else if (bytes == 2)
*(u16 *)buf = val;
else /* bytes == 4 */
*(u32 *)buf = val;
} /* Otherwise null reader: discard the data */
drv_data->rx_resid -= bytes;
}
/* The last-read status value is provided; we know SSP_STATUS_RNE is set */
static bool k1_spi_read(struct k1_spi_driver_data *drv_data, u32 val)
{
do {
unsigned int count = FIELD_GET(SSP_STATUS_RFL, val) + 1;
/* Only read what we need */
count = min(count, drv_data->rx_resid / drv_data->bytes);
do
k1_spi_read_word(drv_data);
while (--count);
/* If there's no more to read, we're done */
if (!drv_data->rx_resid)
return true;
/* Check again in case more became available to read */
val = readl(drv_data->base + SSP_STATUS);
if (val & SSP_STATUS_RNE)
writel(SSP_STATUS_RNE, drv_data->base + SSP_STATUS);
else
return false;
} while (true);
}
static irqreturn_t k1_spi_ssp_isr(int irq, void *dev_id)
{
struct k1_spi_driver_data *drv_data = dev_id;
u32 status;
u32 top_ctrl;
/* Get status and clear pending interrupts */
status = readl(drv_data->base + SSP_STATUS);
writel(status, drv_data->base + SSP_STATUS);
/* If no actionable status bits are set, this is not our interrupt */
if (!(status & (SSP_STATUS_ERROR | SSP_STATUS_TNF | SSP_STATUS_RNE)))
return IRQ_NONE;
/* Check for any error conditions first */
if (status & SSP_STATUS_ERROR) {
if (drv_data->transfer)
drv_data->transfer->error |= SPI_TRANS_FAIL_IO;
goto done;
}
/*
* For SPI, bytes are transferred in both directions equally, and
* RX always follows TX. Start by writing if there is anything to
* write, then read. Once there's no more to read, we're done.
*/
if (drv_data->tx_resid && (status & SSP_STATUS_TNF)) {
/* If we finish writing, disable TX interrupts */
if (k1_spi_write(drv_data, status))
writel(SSP_INT_EN_RX | SSP_INT_EN_ERROR,
drv_data->base + SSP_INT_EN);
}
/* We're not done unless we've read all that was requested */
if (drv_data->rx_resid) {
/* Read more if the FIFO is not empty */
if (status & SSP_STATUS_RNE)
if (k1_spi_read(drv_data, status))
goto done;
return IRQ_HANDLED;
}
done:
/* Disable the port */
top_ctrl = readl(drv_data->base + SSP_TOP_CTRL);
top_ctrl &= ~TOP_SSE;
writel(top_ctrl, drv_data->base + SSP_TOP_CTRL);
/* Disable all interrupts */
writel(0, drv_data->base + SSP_INT_EN);
if (drv_data->transfer) {
drv_data->transfer = NULL;
spi_finalize_current_transfer(drv_data->host);
}
return IRQ_HANDLED;
}
static int
k1_spi_dma_setup(struct k1_spi_driver_data *drv_data, struct device *dev)
{
struct spi_controller *host = drv_data->host;
struct dma_chan *chan;
chan = dma_request_chan(dev, "tx");
if (IS_ERR(chan))
return PTR_ERR(chan);
host->dma_tx = chan;
chan = dma_request_chan(dev, "rx");
if (IS_ERR(chan)) {
dma_release_channel(host->dma_tx);
host->dma_tx = NULL;
return PTR_ERR(chan);
}
host->dma_rx = chan;
drv_data->dma_enabled = true;
return 0;
}
static void k1_spi_dma_cleanup(struct device *dev, void *res)
{
struct k1_spi_driver_data **ptr = res;
struct k1_spi_driver_data *drv_data = *ptr;
struct spi_controller *host = drv_data->host;
if (!drv_data->dma_enabled)
return;
drv_data->dma_enabled = false;
dma_release_channel(host->dma_rx);
host->dma_rx = NULL;
dma_release_channel(host->dma_tx);
host->dma_tx = NULL;
}
static int
devm_k1_spi_dma_setup(struct k1_spi_driver_data *drv_data, struct device *dev)
{
struct k1_spi_driver_data **ptr;
int ret;
if (!IS_ENABLED(CONFIG_MMP_PDMA)) {
dev_info(dev, "DMA not available; using PIO\n");
return 0;
}
ptr = devres_alloc(k1_spi_dma_cleanup, sizeof(*ptr), GFP_KERNEL);
if (!ptr)
return -ENOMEM;
ret = k1_spi_dma_setup(drv_data, dev);
if (ret) {
devres_free(ptr);
return ret;
}
*ptr = drv_data;
devres_add(dev, ptr);
return 0;
}
static int k1_spi_probe(struct platform_device *pdev)
{
struct k1_spi_driver_data *drv_data;
struct device *dev = &pdev->dev;
struct reset_control *reset;
struct spi_controller *host;
struct resource *iores;
struct clk *clk_bus;
int ret;
host = devm_spi_alloc_host(dev, sizeof(*drv_data));
if (!host)
return -ENOMEM;
drv_data = spi_controller_get_devdata(host);
drv_data->host = host;
platform_set_drvdata(pdev, drv_data);
ret = devm_k1_spi_dma_setup(drv_data, dev);
if (ret == -EPROBE_DEFER)
return ret;
if (ret)
dev_warn(dev, "DMA setup failed (%d), falling back to PIO\n", ret);
drv_data->base = devm_platform_get_and_ioremap_resource(pdev, 0,
&iores);
if (IS_ERR(drv_data->base))
return dev_err_probe(dev, PTR_ERR(drv_data->base),
"error mapping memory\n");
drv_data->base_addr = iores->start;
clk_bus = devm_clk_get_enabled(dev, "bus");
if (IS_ERR(clk_bus))
return dev_err_probe(dev, PTR_ERR(clk_bus),
"error getting/enabling bus clock\n");
drv_data->bus_rate = clk_get_rate(clk_bus);
drv_data->clk = devm_clk_get_enabled(dev, "core");
if (IS_ERR(drv_data->clk))
return dev_err_probe(dev, PTR_ERR(drv_data->clk),
"error getting/enabling core clock\n");
reset = devm_reset_control_get_exclusive_deasserted(dev, NULL);
if (IS_ERR(reset))
return dev_err_probe(dev, PTR_ERR(reset),
"error getting/deasserting reset\n");
k1_spi_register_reset(drv_data, true);
drv_data->irq = platform_get_irq(pdev, 0);
if (drv_data->irq < 0)
return dev_err_probe(dev, drv_data->irq, "error getting IRQ\n");
ret = devm_request_irq(dev, drv_data->irq, k1_spi_ssp_isr,
IRQF_SHARED, dev_name(dev), drv_data);
if (ret < 0)
return dev_err_probe(dev, ret, "error requesting IRQ\n");
/* Initialize the host structure, then register it */
host->dev.of_node = dev_of_node(dev);
host->dev.parent = dev;
host->num_chipselect = 1;
if (drv_data->dma_enabled)
host->dma_alignment = K1_SPI_DMA_ALIGNMENT;
host->mode_bits = SPI_CPOL | SPI_CPHA | SPI_LOOP;
host->bits_per_word_mask = SPI_BPW_RANGE_MASK(4, 32);
host->min_speed_hz = K1_SPI_MIN_SPEED_HZ;
host->max_speed_hz = K1_SPI_MAX_SPEED_HZ;
host->flags = SPI_CONTROLLER_MUST_RX | SPI_CONTROLLER_MUST_TX;
host->max_dma_len = K1_SPI_MAX_DMA_LEN;
host->setup = k1_spi_setup;
host->cleanup = k1_spi_cleanup;
host->can_dma = k1_spi_can_dma;
host->prepare_message = k1_spi_prepare_message;
host->set_cs = k1_spi_set_cs;
host->transfer_one = k1_spi_transfer_one;
host->handle_err = k1_spi_handle_err;
ret = devm_spi_register_controller(dev, host);
if (ret)
dev_err(dev, "error registering controller\n");
return ret;
}
static const struct of_device_id k1_spi_dt_ids[] = {
{ .compatible = "spacemit,k1-spi", },
{}
};
MODULE_DEVICE_TABLE(of, k1_spi_dt_ids);
static struct platform_driver k1_spi_driver = {
.probe = k1_spi_probe,
.driver = {
.name = "k1-spi",
.of_match_table = k1_spi_dt_ids,
},
};
module_platform_driver(k1_spi_driver);
MODULE_DESCRIPTION("SpacemiT K1 SPI controller driver");
MODULE_LICENSE("GPL");
|