1 /*
2 * Copyright 2022 TOKITA Hiroshi <tokita.hiroshi@fujitsu.com>
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 #define DT_DRV_COMPAT arm_pl022
8
9 #include <errno.h>
10 #include <zephyr/kernel.h>
11 #include <zephyr/drivers/clock_control.h>
12 #include <zephyr/drivers/reset.h>
13 #include <zephyr/drivers/spi.h>
14 #include <zephyr/drivers/spi/rtio.h>
15 #include <zephyr/sys/util.h>
16 #include <zephyr/spinlock.h>
17 #include <soc.h>
18 #if defined(CONFIG_PINCTRL)
19 #include <zephyr/drivers/pinctrl.h>
20 #endif
21 #if defined(CONFIG_SPI_PL022_DMA)
22 #include <zephyr/drivers/dma.h>
23 #endif
24
25 #define LOG_LEVEL CONFIG_SPI_LOG_LEVEL
26 #include <zephyr/logging/log.h>
27 #include <zephyr/irq.h>
28 LOG_MODULE_REGISTER(spi_pl022);
29
30 #include "spi_context.h"
31
32 #define SSP_MASK(regname, name) GENMASK(SSP_##regname##_##name##_MSB, SSP_##regname##_##name##_LSB)
33
34 /* PL022 Register definitions */
35
36 /*
37 * Macros to access SSP Registers with their offsets
38 */
39 #define SSP_CR0(r) (r + 0x000)
40 #define SSP_CR1(r) (r + 0x004)
41 #define SSP_DR(r) (r + 0x008)
42 #define SSP_SR(r) (r + 0x00C)
43 #define SSP_CPSR(r) (r + 0x010)
44 #define SSP_IMSC(r) (r + 0x014)
45 #define SSP_RIS(r) (r + 0x018)
46 #define SSP_MIS(r) (r + 0x01C)
47 #define SSP_ICR(r) (r + 0x020)
48 #define SSP_DMACR(r) (r + 0x024)
49
50 /*
51 * Control Register 0
52 */
53 #define SSP_CR0_SCR_MSB 15
54 #define SSP_CR0_SCR_LSB 8
55 #define SSP_CR0_SPH_MSB 7
56 #define SSP_CR0_SPH_LSB 7
57 #define SSP_CR0_SPO_MSB 6
58 #define SSP_CR0_SPO_LSB 6
59 #define SSP_CR0_FRF_MSB 5
60 #define SSP_CR0_FRF_LSB 4
61 #define SSP_CR0_DSS_MSB 3
62 #define SSP_CR0_DSS_LSB 0
63
64 /* Data size select */
65 #define SSP_CR0_MASK_DSS SSP_MASK(CR0, DSS)
66 /* Frame format */
67 #define SSP_CR0_MASK_FRF SSP_MASK(CR0, FRF)
68 /* Polarity */
69 #define SSP_CR0_MASK_SPO SSP_MASK(CR0, SPO)
70 /* Phase */
71 #define SSP_CR0_MASK_SPH SSP_MASK(CR0, SPH)
72 /* Serial Clock Rate */
73 #define SSP_CR0_MASK_SCR SSP_MASK(CR0, SCR)
74
75 /*
76 * Control Register 1
77 */
78 #define SSP_CR1_SOD_MSB 3
79 #define SSP_CR1_SOD_LSB 3
80 #define SSP_CR1_MS_MSB 2
81 #define SSP_CR1_MS_LSB 2
82 #define SSP_CR1_SSE_MSB 1
83 #define SSP_CR1_SSE_LSB 1
84 #define SSP_CR1_LBM_MSB 0
85 #define SSP_CR1_LBM_LSB 0
86
87 /* Loopback Mode */
88 #define SSP_CR1_MASK_LBM SSP_MASK(CR1, LBM)
89 /* Port Enable */
90 #define SSP_CR1_MASK_SSE SSP_MASK(CR1, SSE)
91 /* Controller/Peripheral (Master/Slave) select */
92 #define SSP_CR1_MASK_MS SSP_MASK(CR1, MS)
93 /* Peripheral (Slave) mode output disabled */
94 #define SSP_CR1_MASK_SOD SSP_MASK(CR1, SOD)
95
96 /*
97 * Status Register
98 */
99 #define SSP_SR_BSY_MSB 4
100 #define SSP_SR_BSY_LSB 4
101 #define SSP_SR_RFF_MSB 3
102 #define SSP_SR_RFF_LSB 3
103 #define SSP_SR_RNE_MSB 2
104 #define SSP_SR_RNE_LSB 2
105 #define SSP_SR_TNF_MSB 1
106 #define SSP_SR_TNF_LSB 1
107 #define SSP_SR_TFE_MSB 0
108 #define SSP_SR_TFE_LSB 0
109
110 /* TX FIFO empty */
111 #define SSP_SR_MASK_TFE SSP_MASK(SR, TFE)
112 /* TX FIFO not full */
113 #define SSP_SR_MASK_TNF SSP_MASK(SR, TNF)
114 /* RX FIFO not empty */
115 #define SSP_SR_MASK_RNE SSP_MASK(SR, RNE)
116 /* RX FIFO full */
117 #define SSP_SR_MASK_RFF SSP_MASK(SR, RFF)
118 /* Busy Flag */
119 #define SSP_SR_MASK_BSY SSP_MASK(SR, BSY)
120
121 /*
122 * Clock Prescale Register
123 */
124 #define SSP_CPSR_CPSDVSR_MSB 7
125 #define SSP_CPSR_CPSDVSR_LSB 0
126 /* Clock prescale divider */
127 #define SSP_CPSR_MASK_CPSDVSR SSP_MASK(CPSR, CPSDVSR)
128
129 /*
130 * Interrupt Mask Set/Clear Register
131 */
132 #define SSP_IMSC_TXIM_MSB 3
133 #define SSP_IMSC_TXIM_LSB 3
134 #define SSP_IMSC_RXIM_MSB 2
135 #define SSP_IMSC_RXIM_LSB 2
136 #define SSP_IMSC_RTIM_MSB 1
137 #define SSP_IMSC_RTIM_LSB 1
138 #define SSP_IMSC_RORIM_MSB 0
139 #define SSP_IMSC_RORIM_LSB 0
140
141 /* Receive Overrun Interrupt mask */
142 #define SSP_IMSC_MASK_RORIM SSP_MASK(IMSC, RORIM)
143 /* Receive timeout Interrupt mask */
144 #define SSP_IMSC_MASK_RTIM SSP_MASK(IMSC, RTIM)
145 /* Receive FIFO Interrupt mask */
146 #define SSP_IMSC_MASK_RXIM SSP_MASK(IMSC, RXIM)
147 /* Transmit FIFO Interrupt mask */
148 #define SSP_IMSC_MASK_TXIM SSP_MASK(IMSC, TXIM)
149
150 /*
151 * Raw Interrupt Status Register
152 */
153 #define SSP_RIS_TXRIS_MSB 3
154 #define SSP_RIS_TXRIS_LSB 3
155 #define SSP_RIS_RXRIS_MSB 2
156 #define SSP_RIS_RXRIS_LSB 2
157 #define SSP_RIS_RTRIS_MSB 1
158 #define SSP_RIS_RTRIS_LSB 1
159 #define SSP_RIS_RORRIS_MSB 0
160 #define SSP_RIS_RORRIS_LSB 0
161
162 /* Receive Overrun Raw Interrupt status */
163 #define SSP_RIS_MASK_RORRIS SSP_MASK(RIS, RORRIS)
164 /* Receive Timeout Raw Interrupt status */
165 #define SSP_RIS_MASK_RTRIS SSP_MASK(RIS, RTRIS)
166 /* Receive FIFO Raw Interrupt status */
167 #define SSP_RIS_MASK_RXRIS SSP_MASK(RIS, RXRIS)
168 /* Transmit FIFO Raw Interrupt status */
169 #define SSP_RIS_MASK_TXRIS SSP_MASK(RIS, TXRIS)
170
171 /*
172 * Masked Interrupt Status Register
173 */
174 #define SSP_MIS_TXMIS_MSB 3
175 #define SSP_MIS_TXMIS_LSB 3
176 #define SSP_MIS_RXMIS_MSB 2
177 #define SSP_MIS_RXMIS_LSB 2
178 #define SSP_MIS_RTMIS_MSB 1
179 #define SSP_MIS_RTMIS_LSB 1
180 #define SSP_MIS_RORMIS_MSB 0
181 #define SSP_MIS_RORMIS_LSB 0
182
183 /* Receive Overrun Masked Interrupt status */
184 #define SSP_MIS_MASK_RORMIS SSP_MASK(MIS, RORMIS)
185 /* Receive Timeout Masked Interrupt status */
186 #define SSP_MIS_MASK_RTMIS SSP_MASK(MIS, RTMIS)
187 /* Receive FIFO Masked Interrupt status */
188 #define SSP_MIS_MASK_RXMIS SSP_MASK(MIS, RXMIS)
189 /* Transmit FIFO Masked Interrupt status */
190 #define SSP_MIS_MASK_TXMIS SSP_MASK(MIS, TXMIS)
191
192 /*
193 * Interrupt Clear Register
194 */
195 #define SSP_ICR_RTIC_MSB 1
196 #define SSP_ICR_RTIC_LSB 1
197 #define SSP_ICR_RORIC_MSB 0
198 #define SSP_ICR_RORIC_LSB 0
199
200 /* Receive Overrun Raw Clear Interrupt bit */
201 #define SSP_ICR_MASK_RORIC SSP_MASK(ICR, RORIC)
202 /* Receive Timeout Clear Interrupt bit */
203 #define SSP_ICR_MASK_RTIC SSP_MASK(ICR, RTIC)
204
205 /*
206 * DMA Control Register
207 */
208 #define SSP_DMACR_TXDMAE_MSB 1
209 #define SSP_DMACR_TXDMAE_LSB 1
210 #define SSP_DMACR_RXDMAE_MSB 0
211 #define SSP_DMACR_RXDMAE_LSB 0
212
213 /* Receive DMA Enable bit */
214 #define SSP_DMACR_MASK_RXDMAE SSP_MASK(DMACR, RXDMAE)
215 /* Transmit DMA Enable bit */
216 #define SSP_DMACR_MASK_TXDMAE SSP_MASK(DMACR, TXDMAE)
217
218 /* End register definitions */
219
220 /*
221 * Clock Parameter ranges
222 */
223 #define CPSDVR_MIN 0x02
224 #define CPSDVR_MAX 0xFE
225
226 #define SCR_MIN 0x00
227 #define SCR_MAX 0xFF
228
229 /* Fifo depth */
230 #define SSP_FIFO_DEPTH 8
231
232 /*
233 * Register READ/WRITE macros
234 */
235 #define SSP_READ_REG(reg) (*((volatile uint32_t *)reg))
236 #define SSP_WRITE_REG(reg, val) (*((volatile uint32_t *)reg) = val)
237 #define SSP_CLEAR_REG(reg, val) (*((volatile uint32_t *)reg) &= ~(val))
238
239 /*
240 * Status check macros
241 */
242 #define SSP_BUSY(reg) (SSP_READ_REG(SSP_SR(reg)) & SSP_SR_MASK_BSY)
243 #define SSP_RX_FIFO_NOT_EMPTY(reg) (SSP_READ_REG(SSP_SR(reg)) & SSP_SR_MASK_RNE)
244 #define SSP_TX_FIFO_EMPTY(reg) (SSP_READ_REG(SSP_SR(reg)) & SSP_SR_MASK_TFE)
245 #define SSP_TX_FIFO_NOT_FULL(reg) (SSP_READ_REG(SSP_SR(reg)) & SSP_SR_MASK_TNF)
246
247 #if defined(CONFIG_SPI_PL022_DMA)
248 enum spi_pl022_dma_direction {
249 TX = 0,
250 RX,
251 NUM_OF_DIRECTION
252 };
253
254 struct spi_pl022_dma_config {
255 const struct device *dev;
256 uint32_t channel;
257 uint32_t channel_config;
258 uint32_t slot;
259 };
260
261 struct spi_pl022_dma_data {
262 struct dma_config config;
263 struct dma_block_config block;
264 uint32_t count;
265 bool callbacked;
266 };
267 #endif
268
269 /*
270 * Max frequency
271 */
272 #define MAX_FREQ_CONTROLLER_MODE(pclk) ((pclk) / 2)
273 #define MAX_FREQ_PERIPHERAL_MODE(pclk) ((pclk) / 12)
274
275 struct spi_pl022_cfg {
276 const uint32_t reg;
277 const uint32_t pclk;
278 const bool dma_enabled;
279 #if defined(CONFIG_CLOCK_CONTROL)
280 const struct device *clk_dev;
281 const clock_control_subsys_t clk_id;
282 #endif
283 #if defined(CONFIG_RESET)
284 const struct reset_dt_spec reset;
285 #endif
286 #if defined(CONFIG_PINCTRL)
287 const struct pinctrl_dev_config *pincfg;
288 #endif
289 #if defined(CONFIG_SPI_PL022_INTERRUPT)
290 void (*irq_config)(const struct device *port);
291 #endif
292 #if defined(CONFIG_SPI_PL022_DMA)
293 const struct spi_pl022_dma_config dma[NUM_OF_DIRECTION];
294 #endif
295 };
296
297 struct spi_pl022_data {
298 struct spi_context ctx;
299 uint32_t tx_count;
300 uint32_t rx_count;
301 struct k_spinlock lock;
302 #if defined(CONFIG_SPI_PL022_DMA)
303 struct spi_pl022_dma_data dma[NUM_OF_DIRECTION];
304 #endif
305 };
306
307 #if defined(CONFIG_SPI_PL022_DMA)
308 static uint32_t dummy_tx;
309 static uint32_t dummy_rx;
310 #endif
311
312 /* Helper Functions */
313
spi_pl022_calc_prescale(const uint32_t pclk,const uint32_t baud)314 static inline uint32_t spi_pl022_calc_prescale(const uint32_t pclk, const uint32_t baud)
315 {
316 uint32_t prescale;
317
318 /* prescale only can take even number */
319 for (prescale = CPSDVR_MIN; prescale < CPSDVR_MAX; prescale += 2) {
320 if (pclk < (prescale + 2) * CPSDVR_MAX * baud) {
321 break;
322 }
323 }
324
325 return prescale;
326 }
327
spi_pl022_calc_postdiv(const uint32_t pclk,const uint32_t baud,const uint32_t prescale)328 static inline uint32_t spi_pl022_calc_postdiv(const uint32_t pclk,
329 const uint32_t baud, const uint32_t prescale)
330 {
331 uint32_t postdiv;
332
333 for (postdiv = SCR_MAX + 1; postdiv > SCR_MIN + 1; --postdiv) {
334 if (pclk / (prescale * (postdiv - 1)) > baud) {
335 break;
336 }
337 }
338 return postdiv - 1;
339 }
340
spi_pl022_configure(const struct device * dev,const struct spi_config * spicfg)341 static int spi_pl022_configure(const struct device *dev,
342 const struct spi_config *spicfg)
343 {
344 const struct spi_pl022_cfg *cfg = dev->config;
345 struct spi_pl022_data *data = dev->data;
346 const uint16_t op = spicfg->operation;
347 uint32_t prescale;
348 uint32_t postdiv;
349 uint32_t pclk = 0;
350 uint32_t cr0;
351 uint32_t cr1;
352 int ret;
353
354 if (spi_context_configured(&data->ctx, spicfg)) {
355 return 0;
356 }
357
358 #if defined(CONFIG_CLOCK_CONTROL)
359 ret = clock_control_get_rate(cfg->clk_dev, cfg->clk_id, &pclk);
360 if (ret < 0 || pclk == 0) {
361 return -EINVAL;
362 }
363 #endif
364
365 if (spicfg->frequency > MAX_FREQ_CONTROLLER_MODE(pclk)) {
366 LOG_ERR("Frequency is up to %u in controller mode.",
367 MAX_FREQ_CONTROLLER_MODE(pclk));
368 return -ENOTSUP;
369 }
370
371 if (op & SPI_TRANSFER_LSB) {
372 LOG_ERR("LSB-first not supported");
373 return -ENOTSUP;
374 }
375
376 /* Half-duplex mode has not been implemented */
377 if (op & SPI_HALF_DUPLEX) {
378 LOG_ERR("Half-duplex not supported");
379 return -ENOTSUP;
380 }
381
382 /* Peripheral mode has not been implemented */
383 if (SPI_OP_MODE_GET(op) != SPI_OP_MODE_MASTER) {
384 LOG_ERR("Peripheral mode is not supported");
385 return -ENOTSUP;
386 }
387
388 /* Word sizes other than 8 bits has not been implemented */
389 if (SPI_WORD_SIZE_GET(op) != 8) {
390 LOG_ERR("Word sizes other than 8 bits are not supported");
391 return -ENOTSUP;
392 }
393
394 /* configure registers */
395
396 prescale = spi_pl022_calc_prescale(pclk, spicfg->frequency);
397 postdiv = spi_pl022_calc_postdiv(pclk, spicfg->frequency, prescale);
398
399 cr0 = 0;
400 cr0 |= (postdiv << SSP_CR0_SCR_LSB);
401 cr0 |= (SPI_WORD_SIZE_GET(op) - 1);
402 cr0 |= (op & SPI_MODE_CPOL) ? SSP_CR0_MASK_SPO : 0;
403 cr0 |= (op & SPI_MODE_CPHA) ? SSP_CR0_MASK_SPH : 0;
404
405 cr1 = 0;
406 cr1 |= SSP_CR1_MASK_SSE; /* Always enable SPI */
407 cr1 |= (op & SPI_MODE_LOOP) ? SSP_CR1_MASK_LBM : 0;
408
409 SSP_WRITE_REG(SSP_CPSR(cfg->reg), prescale);
410 SSP_WRITE_REG(SSP_CR0(cfg->reg), cr0);
411 SSP_WRITE_REG(SSP_CR1(cfg->reg), cr1);
412
413 #if defined(CONFIG_SPI_PL022_INTERRUPT)
414 if (!cfg->dma_enabled) {
415 SSP_WRITE_REG(SSP_IMSC(cfg->reg),
416 SSP_IMSC_MASK_RORIM | SSP_IMSC_MASK_RTIM | SSP_IMSC_MASK_RXIM);
417 }
418 #endif
419
420 data->ctx.config = spicfg;
421
422 return 0;
423 }
424
spi_pl022_transfer_ongoing(struct spi_pl022_data * data)425 static inline bool spi_pl022_transfer_ongoing(struct spi_pl022_data *data)
426 {
427 return spi_context_tx_on(&data->ctx) || spi_context_rx_on(&data->ctx);
428 }
429
430 #if defined(CONFIG_SPI_PL022_DMA)
431 static void spi_pl022_dma_callback(const struct device *dma_dev, void *arg, uint32_t channel,
432 int status);
433
spi_pl022_dma_enabled_num(const struct device * dev)434 static size_t spi_pl022_dma_enabled_num(const struct device *dev)
435 {
436 const struct spi_pl022_cfg *cfg = dev->config;
437
438 return cfg->dma_enabled ? 2 : 0;
439 }
440
spi_pl022_dma_setup(const struct device * dev,const uint32_t dir)441 static uint32_t spi_pl022_dma_setup(const struct device *dev, const uint32_t dir)
442 {
443 const struct spi_pl022_cfg *cfg = dev->config;
444 struct spi_pl022_data *data = dev->data;
445 struct dma_config *dma_cfg = &data->dma[dir].config;
446 struct dma_block_config *block_cfg = &data->dma[dir].block;
447 const struct spi_pl022_dma_config *dma = &cfg->dma[dir];
448 int ret;
449
450 memset(dma_cfg, 0, sizeof(struct dma_config));
451 memset(block_cfg, 0, sizeof(struct dma_block_config));
452
453 dma_cfg->source_burst_length = 1;
454 dma_cfg->dest_burst_length = 1;
455 dma_cfg->user_data = (void *)dev;
456 dma_cfg->block_count = 1U;
457 dma_cfg->head_block = block_cfg;
458 dma_cfg->dma_slot = cfg->dma[dir].slot;
459 dma_cfg->channel_direction = dir == TX ? MEMORY_TO_PERIPHERAL : PERIPHERAL_TO_MEMORY;
460
461 if (SPI_WORD_SIZE_GET(data->ctx.config->operation) == 8) {
462 dma_cfg->source_data_size = 1;
463 dma_cfg->dest_data_size = 1;
464 } else {
465 dma_cfg->source_data_size = 2;
466 dma_cfg->dest_data_size = 2;
467 }
468
469 block_cfg->block_size = spi_context_max_continuous_chunk(&data->ctx);
470
471 if (dir == TX) {
472 dma_cfg->dma_callback = spi_pl022_dma_callback;
473 block_cfg->dest_address = SSP_DR(cfg->reg);
474 block_cfg->dest_addr_adj = DMA_ADDR_ADJ_NO_CHANGE;
475 if (spi_context_tx_buf_on(&data->ctx)) {
476 block_cfg->source_address = (uint32_t)data->ctx.tx_buf;
477 block_cfg->source_addr_adj = DMA_ADDR_ADJ_INCREMENT;
478 } else {
479 block_cfg->source_address = (uint32_t)&dummy_tx;
480 block_cfg->source_addr_adj = DMA_ADDR_ADJ_NO_CHANGE;
481 }
482 }
483
484 if (dir == RX) {
485 dma_cfg->dma_callback = spi_pl022_dma_callback;
486 block_cfg->source_address = SSP_DR(cfg->reg);
487 block_cfg->source_addr_adj = DMA_ADDR_ADJ_NO_CHANGE;
488
489 if (spi_context_rx_buf_on(&data->ctx)) {
490 block_cfg->dest_address = (uint32_t)data->ctx.rx_buf;
491 block_cfg->dest_addr_adj = DMA_ADDR_ADJ_INCREMENT;
492 } else {
493 block_cfg->dest_address = (uint32_t)&dummy_rx;
494 block_cfg->dest_addr_adj = DMA_ADDR_ADJ_NO_CHANGE;
495 }
496 }
497
498 ret = dma_config(dma->dev, dma->channel, dma_cfg);
499 if (ret < 0) {
500 LOG_ERR("dma_config %p failed %d\n", dma->dev, ret);
501 return ret;
502 }
503
504 data->dma[dir].callbacked = false;
505
506 ret = dma_start(dma->dev, dma->channel);
507 if (ret < 0) {
508 LOG_ERR("dma_start %p failed %d\n", dma->dev, ret);
509 return ret;
510 }
511
512 return 0;
513 }
514
spi_pl022_start_dma_transceive(const struct device * dev)515 static int spi_pl022_start_dma_transceive(const struct device *dev)
516 {
517 const struct spi_pl022_cfg *cfg = dev->config;
518 int ret = 0;
519
520 SSP_CLEAR_REG(SSP_DMACR(cfg->reg), SSP_DMACR_MASK_RXDMAE | SSP_DMACR_MASK_TXDMAE);
521
522 for (size_t i = 0; i < spi_pl022_dma_enabled_num(dev); i++) {
523 ret = spi_pl022_dma_setup(dev, i);
524 if (ret < 0) {
525 goto on_error;
526 }
527 }
528
529 SSP_WRITE_REG(SSP_DMACR(cfg->reg), SSP_DMACR_MASK_RXDMAE | SSP_DMACR_MASK_TXDMAE);
530
531 on_error:
532 if (ret < 0) {
533 for (size_t i = 0; i < spi_pl022_dma_enabled_num(dev); i++) {
534 dma_stop(cfg->dma[i].dev, cfg->dma[i].channel);
535 }
536 }
537 return ret;
538 }
539
spi_pl022_chunk_transfer_finished(const struct device * dev)540 static bool spi_pl022_chunk_transfer_finished(const struct device *dev)
541 {
542 struct spi_pl022_data *data = dev->data;
543 struct spi_pl022_dma_data *dma = data->dma;
544 const size_t chunk_len = spi_context_max_continuous_chunk(&data->ctx);
545
546 return (MIN(dma[TX].count, dma[RX].count) >= chunk_len);
547 }
548
spi_pl022_complete(const struct device * dev,int status)549 static void spi_pl022_complete(const struct device *dev, int status)
550 {
551 struct spi_pl022_data *data = dev->data;
552 const struct spi_pl022_cfg *cfg = dev->config;
553
554 for (size_t i = 0; i < spi_pl022_dma_enabled_num(dev); i++) {
555 dma_stop(cfg->dma[i].dev, cfg->dma[i].channel);
556 }
557
558 spi_context_complete(&data->ctx, dev, status);
559 }
560
spi_pl022_dma_callback(const struct device * dma_dev,void * arg,uint32_t channel,int status)561 static void spi_pl022_dma_callback(const struct device *dma_dev, void *arg, uint32_t channel,
562 int status)
563 {
564 const struct device *dev = (const struct device *)arg;
565 const struct spi_pl022_cfg *cfg = dev->config;
566 struct spi_pl022_data *data = dev->data;
567 bool complete = false;
568 k_spinlock_key_t key;
569 size_t chunk_len;
570 int err = 0;
571
572 if (status < 0) {
573 key = k_spin_lock(&data->lock);
574
575 LOG_ERR("dma:%p ch:%d callback gets error: %d", dma_dev, channel, status);
576 spi_pl022_complete(dev, status);
577
578 k_spin_unlock(&data->lock, key);
579 return;
580 }
581
582 key = k_spin_lock(&data->lock);
583
584 chunk_len = spi_context_max_continuous_chunk(&data->ctx);
585 for (size_t i = 0; i < ARRAY_SIZE(cfg->dma); i++) {
586 if (dma_dev == cfg->dma[i].dev && channel == cfg->dma[i].channel) {
587 data->dma[i].count += chunk_len;
588 data->dma[i].callbacked = true;
589 }
590 }
591 /* Check transfer finished.
592 * The transmission of this chunk is complete if both the dma[TX].count
593 * and the dma[RX].count reach greater than or equal to the chunk_len.
594 * chunk_len is zero here means the transfer is already complete.
595 */
596 if (spi_pl022_chunk_transfer_finished(dev)) {
597 if (SPI_WORD_SIZE_GET(data->ctx.config->operation) == 8) {
598 spi_context_update_tx(&data->ctx, 1, chunk_len);
599 spi_context_update_rx(&data->ctx, 1, chunk_len);
600 } else {
601 spi_context_update_tx(&data->ctx, 2, chunk_len);
602 spi_context_update_rx(&data->ctx, 2, chunk_len);
603 }
604
605 if (spi_pl022_transfer_ongoing(data)) {
606 /* Next chunk is available, reset the count and
607 * continue processing
608 */
609 data->dma[TX].count = 0;
610 data->dma[RX].count = 0;
611 } else {
612 /* All data is processed, complete the process */
613 complete = true;
614 }
615 }
616
617 if (!complete && data->dma[TX].callbacked && data->dma[RX].callbacked) {
618 err = spi_pl022_start_dma_transceive(dev);
619 if (err) {
620 complete = true;
621 }
622 }
623
624 if (complete) {
625 spi_pl022_complete(dev, err);
626 }
627
628 k_spin_unlock(&data->lock, key);
629 }
630
631 #endif /* DMA */
632
633 #if defined(CONFIG_SPI_PL022_INTERRUPT)
634
spi_pl022_async_xfer(const struct device * dev)635 static void spi_pl022_async_xfer(const struct device *dev)
636 {
637 const struct spi_pl022_cfg *cfg = dev->config;
638 struct spi_pl022_data *data = dev->data;
639 struct spi_context *ctx = &data->ctx;
640 /* Process by per chunk */
641 size_t chunk_len = spi_context_max_continuous_chunk(ctx);
642 uint32_t txrx;
643
644 /* Read RX FIFO */
645 while (SSP_RX_FIFO_NOT_EMPTY(cfg->reg) && (data->rx_count < chunk_len)) {
646 txrx = SSP_READ_REG(SSP_DR(cfg->reg));
647
648 /* Discard received data if rx buffer not assigned */
649 if (ctx->rx_buf) {
650 *(((uint8_t *)ctx->rx_buf) + data->rx_count) = (uint8_t)txrx;
651 }
652 data->rx_count++;
653 }
654
655 /* Check transfer finished.
656 * The transmission of this chunk is complete if both the tx_count
657 * and the rx_count reach greater than or equal to the chunk_len.
658 * chunk_len is zero here means the transfer is already complete.
659 */
660 if (MIN(data->tx_count, data->rx_count) >= chunk_len && chunk_len > 0) {
661 spi_context_update_tx(ctx, 1, chunk_len);
662 spi_context_update_rx(ctx, 1, chunk_len);
663 if (spi_pl022_transfer_ongoing(data)) {
664 /* Next chunk is available, reset the count and continue processing */
665 data->tx_count = 0;
666 data->rx_count = 0;
667 chunk_len = spi_context_max_continuous_chunk(ctx);
668 } else {
669 /* All data is processed, complete the process */
670 spi_context_complete(ctx, dev, 0);
671 return;
672 }
673 }
674
675 /* Fill up TX FIFO */
676 for (uint32_t i = 0; i < SSP_FIFO_DEPTH; i++) {
677 if ((data->tx_count < chunk_len) && SSP_TX_FIFO_NOT_FULL(cfg->reg)) {
678 /* Send 0 in the case of read only operation */
679 txrx = 0;
680
681 if (ctx->tx_buf) {
682 txrx = *(((uint8_t *)ctx->tx_buf) + data->tx_count);
683 }
684 SSP_WRITE_REG(SSP_DR(cfg->reg), txrx);
685 data->tx_count++;
686 } else {
687 break;
688 }
689 }
690 }
691
spi_pl022_start_async_xfer(const struct device * dev)692 static void spi_pl022_start_async_xfer(const struct device *dev)
693 {
694 const struct spi_pl022_cfg *cfg = dev->config;
695 struct spi_pl022_data *data = dev->data;
696
697 /* Ensure writable */
698 while (!SSP_TX_FIFO_EMPTY(cfg->reg)) {
699 ;
700 }
701 /* Drain RX FIFO */
702 while (SSP_RX_FIFO_NOT_EMPTY(cfg->reg)) {
703 SSP_READ_REG(SSP_DR(cfg->reg));
704 }
705
706 data->tx_count = 0;
707 data->rx_count = 0;
708
709 SSP_WRITE_REG(SSP_ICR(cfg->reg), SSP_ICR_MASK_RORIC | SSP_ICR_MASK_RTIC);
710
711 spi_pl022_async_xfer(dev);
712 }
713
spi_pl022_isr(const struct device * dev)714 static void spi_pl022_isr(const struct device *dev)
715 {
716 const struct spi_pl022_cfg *cfg = dev->config;
717 struct spi_pl022_data *data = dev->data;
718 struct spi_context *ctx = &data->ctx;
719 uint32_t mis = SSP_READ_REG(SSP_MIS(cfg->reg));
720
721 if (mis & SSP_MIS_MASK_RORMIS) {
722 SSP_WRITE_REG(SSP_IMSC(cfg->reg), 0);
723 spi_context_complete(ctx, dev, -EIO);
724 } else {
725 spi_pl022_async_xfer(dev);
726 }
727
728 SSP_WRITE_REG(SSP_ICR(cfg->reg), SSP_ICR_MASK_RORIC | SSP_ICR_MASK_RTIC);
729 }
730
731 #else
732
spi_pl022_xfer(const struct device * dev)733 static void spi_pl022_xfer(const struct device *dev)
734 {
735 const struct spi_pl022_cfg *cfg = dev->config;
736 struct spi_pl022_data *data = dev->data;
737 const size_t chunk_len = spi_context_max_continuous_chunk(&data->ctx);
738 const void *txbuf = data->ctx.tx_buf;
739 void *rxbuf = data->ctx.rx_buf;
740 uint32_t txrx;
741 size_t fifo_cnt = 0;
742
743 data->tx_count = 0;
744 data->rx_count = 0;
745
746 /* Ensure writable */
747 while (!SSP_TX_FIFO_EMPTY(cfg->reg)) {
748 ;
749 }
750 /* Drain RX FIFO */
751 while (SSP_RX_FIFO_NOT_EMPTY(cfg->reg)) {
752 SSP_READ_REG(SSP_DR(cfg->reg));
753 }
754
755 while (data->rx_count < chunk_len || data->tx_count < chunk_len) {
756 /* Fill up fifo with available TX data */
757 while (SSP_TX_FIFO_NOT_FULL(cfg->reg) && data->tx_count < chunk_len &&
758 fifo_cnt < SSP_FIFO_DEPTH) {
759 /* Send 0 in the case of read only operation */
760 txrx = 0;
761
762 if (txbuf) {
763 txrx = ((uint8_t *)txbuf)[data->tx_count];
764 }
765 SSP_WRITE_REG(SSP_DR(cfg->reg), txrx);
766 data->tx_count++;
767 fifo_cnt++;
768 }
769 while (data->rx_count < chunk_len && fifo_cnt > 0) {
770 if (!SSP_RX_FIFO_NOT_EMPTY(cfg->reg)) {
771 continue;
772 }
773
774 txrx = SSP_READ_REG(SSP_DR(cfg->reg));
775
776 /* Discard received data if rx buffer not assigned */
777 if (rxbuf) {
778 ((uint8_t *)rxbuf)[data->rx_count] = (uint8_t)txrx;
779 }
780 data->rx_count++;
781 fifo_cnt--;
782 }
783 }
784 }
785
786 #endif
787
spi_pl022_transceive_impl(const struct device * dev,const struct spi_config * config,const struct spi_buf_set * tx_bufs,const struct spi_buf_set * rx_bufs,spi_callback_t cb,void * userdata)788 static int spi_pl022_transceive_impl(const struct device *dev,
789 const struct spi_config *config,
790 const struct spi_buf_set *tx_bufs,
791 const struct spi_buf_set *rx_bufs,
792 spi_callback_t cb,
793 void *userdata)
794 {
795 const struct spi_pl022_cfg *cfg = dev->config;
796 struct spi_pl022_data *data = dev->data;
797 struct spi_context *ctx = &data->ctx;
798 int ret;
799
800 spi_context_lock(&data->ctx, (cb ? true : false), cb, userdata, config);
801
802 ret = spi_pl022_configure(dev, config);
803 if (ret < 0) {
804 goto error;
805 }
806
807 spi_context_buffers_setup(ctx, tx_bufs, rx_bufs, 1);
808
809 spi_context_cs_control(ctx, true);
810
811 if (cfg->dma_enabled) {
812 #if defined(CONFIG_SPI_PL022_DMA)
813 for (size_t i = 0; i < ARRAY_SIZE(data->dma); i++) {
814 struct dma_status stat = {.busy = true};
815
816 dma_stop(cfg->dma[i].dev, cfg->dma[i].channel);
817
818 while (stat.busy) {
819 dma_get_status(cfg->dma[i].dev,
820 cfg->dma[i].channel, &stat);
821 }
822
823 data->dma[i].count = 0;
824 }
825
826 ret = spi_pl022_start_dma_transceive(dev);
827 if (ret < 0) {
828 spi_context_cs_control(ctx, false);
829 goto error;
830 }
831 ret = spi_context_wait_for_completion(ctx);
832 #endif
833 } else
834 #if defined(CONFIG_SPI_PL022_INTERRUPT)
835 {
836 spi_pl022_start_async_xfer(dev);
837 ret = spi_context_wait_for_completion(ctx);
838 }
839 #else
840 {
841 do {
842 spi_pl022_xfer(dev);
843 spi_context_update_tx(ctx, 1, data->tx_count);
844 spi_context_update_rx(ctx, 1, data->rx_count);
845 } while (spi_pl022_transfer_ongoing(data));
846
847 #if defined(CONFIG_SPI_ASYNC)
848 spi_context_complete(&data->ctx, dev, ret);
849 #endif
850 }
851 #endif
852
853 spi_context_cs_control(ctx, false);
854
855 error:
856 spi_context_release(&data->ctx, ret);
857
858 return ret;
859 }
860
861 /* API Functions */
862
spi_pl022_transceive(const struct device * dev,const struct spi_config * config,const struct spi_buf_set * tx_bufs,const struct spi_buf_set * rx_bufs)863 static int spi_pl022_transceive(const struct device *dev,
864 const struct spi_config *config,
865 const struct spi_buf_set *tx_bufs,
866 const struct spi_buf_set *rx_bufs)
867 {
868 return spi_pl022_transceive_impl(dev, config, tx_bufs, rx_bufs, NULL, NULL);
869 }
870
871 #if defined(CONFIG_SPI_ASYNC)
872
spi_pl022_transceive_async(const struct device * dev,const struct spi_config * config,const struct spi_buf_set * tx_bufs,const struct spi_buf_set * rx_bufs,spi_callback_t cb,void * userdata)873 static int spi_pl022_transceive_async(const struct device *dev,
874 const struct spi_config *config,
875 const struct spi_buf_set *tx_bufs,
876 const struct spi_buf_set *rx_bufs,
877 spi_callback_t cb,
878 void *userdata)
879 {
880 return spi_pl022_transceive_impl(dev, config, tx_bufs, rx_bufs, cb, userdata);
881 }
882
883 #endif
884
spi_pl022_release(const struct device * dev,const struct spi_config * config)885 static int spi_pl022_release(const struct device *dev,
886 const struct spi_config *config)
887 {
888 struct spi_pl022_data *data = dev->data;
889
890 spi_context_unlock_unconditionally(&data->ctx);
891
892 return 0;
893 }
894
895 static DEVICE_API(spi, spi_pl022_api) = {
896 .transceive = spi_pl022_transceive,
897 #if defined(CONFIG_SPI_ASYNC)
898 .transceive_async = spi_pl022_transceive_async,
899 #endif
900 #ifdef CONFIG_SPI_RTIO
901 .iodev_submit = spi_rtio_iodev_default_submit,
902 #endif
903 .release = spi_pl022_release
904 };
905
spi_pl022_init(const struct device * dev)906 static int spi_pl022_init(const struct device *dev)
907 {
908 /* Initialize with lowest frequency */
909 const struct spi_config spicfg = {
910 .frequency = 0,
911 .operation = SPI_WORD_SET(8),
912 .slave = 0,
913 };
914 const struct spi_pl022_cfg *cfg = dev->config;
915 struct spi_pl022_data *data = dev->data;
916 int ret;
917
918 #if defined(CONFIG_CLOCK_CONTROL)
919 if (cfg->clk_dev) {
920 ret = clock_control_on(cfg->clk_dev, cfg->clk_id);
921 if (ret < 0) {
922 LOG_ERR("Failed to enable the clock");
923 return ret;
924 }
925 }
926 #endif
927
928 #if defined(CONFIG_RESET)
929 if (cfg->reset.dev) {
930 ret = reset_line_toggle_dt(&cfg->reset);
931 if (ret < 0) {
932 return ret;
933 }
934 }
935 #endif
936
937 #if defined(CONFIG_PINCTRL)
938 ret = pinctrl_apply_state(cfg->pincfg, PINCTRL_STATE_DEFAULT);
939 if (ret < 0) {
940 LOG_ERR("Failed to apply pinctrl state");
941 return ret;
942 }
943 #endif
944
945 if (cfg->dma_enabled) {
946 #if defined(CONFIG_SPI_PL022_DMA)
947 for (size_t i = 0; i < spi_pl022_dma_enabled_num(dev); i++) {
948 uint32_t ch_filter = BIT(cfg->dma[i].channel);
949
950 if (!device_is_ready(cfg->dma[i].dev)) {
951 LOG_ERR("DMA %s not ready", cfg->dma[i].dev->name);
952 return -ENODEV;
953 }
954
955 ret = dma_request_channel(cfg->dma[i].dev, &ch_filter);
956 if (ret < 0) {
957 LOG_ERR("dma_request_channel failed %d", ret);
958 return ret;
959 }
960 }
961 #endif
962 } else {
963 #if defined(CONFIG_SPI_PL022_INTERRUPT)
964 cfg->irq_config(dev);
965 #endif
966 }
967
968 ret = spi_pl022_configure(dev, &spicfg);
969 if (ret < 0) {
970 LOG_ERR("Failed to configure spi");
971 return ret;
972 }
973
974 ret = spi_context_cs_configure_all(&data->ctx);
975 if (ret < 0) {
976 LOG_ERR("Failed to spi_context configure");
977 return ret;
978 }
979
980 /* Make sure the context is unlocked */
981 spi_context_unlock_unconditionally(&data->ctx);
982
983 return 0;
984 }
985
986 #define DMA_INITIALIZER(idx, dir) \
987 { \
988 .dev = DEVICE_DT_GET(DT_INST_DMAS_CTLR_BY_NAME(idx, dir)), \
989 .channel = DT_INST_DMAS_CELL_BY_NAME(idx, dir, channel), \
990 .slot = DT_INST_DMAS_CELL_BY_NAME(idx, dir, slot), \
991 .channel_config = DT_INST_DMAS_CELL_BY_NAME(idx, dir, channel_config), \
992 }
993
994 #define DMAS_DECL(idx) \
995 { \
996 COND_CODE_1(DT_INST_DMAS_HAS_NAME(idx, tx), (DMA_INITIALIZER(idx, tx)), ({0})), \
997 COND_CODE_1(DT_INST_DMAS_HAS_NAME(idx, rx), (DMA_INITIALIZER(idx, rx)), ({0})), \
998 }
999
1000 #define DMAS_ENABLED(idx) (DT_INST_DMAS_HAS_NAME(idx, tx) && DT_INST_DMAS_HAS_NAME(idx, rx))
1001
1002 #define CLOCK_ID_DECL(idx) \
1003 IF_ENABLED(DT_INST_NODE_HAS_PROP(0, clocks), \
1004 (static const clock_control_subsys_t pl022_clk_id##idx = \
1005 (clock_control_subsys_t)DT_INST_PHA_BY_IDX(idx, clocks, 0, clk_id);)) \
1006
1007 #define SPI_PL022_INIT(idx) \
1008 IF_ENABLED(CONFIG_PINCTRL, (PINCTRL_DT_INST_DEFINE(idx);)) \
1009 IF_ENABLED(CONFIG_SPI_PL022_INTERRUPT, \
1010 (static void spi_pl022_irq_config_##idx(const struct device *dev) \
1011 { \
1012 IRQ_CONNECT(DT_INST_IRQN(idx), DT_INST_IRQ(idx, priority), \
1013 spi_pl022_isr, DEVICE_DT_INST_GET(idx), 0); \
1014 irq_enable(DT_INST_IRQN(idx)); \
1015 })) \
1016 IF_ENABLED(CONFIG_CLOCK_CONTROL, (CLOCK_ID_DECL(idx))) \
1017 static struct spi_pl022_data spi_pl022_data_##idx = { \
1018 SPI_CONTEXT_INIT_LOCK(spi_pl022_data_##idx, ctx), \
1019 SPI_CONTEXT_INIT_SYNC(spi_pl022_data_##idx, ctx), \
1020 SPI_CONTEXT_CS_GPIOS_INITIALIZE(DT_DRV_INST(idx), ctx)}; \
1021 static struct spi_pl022_cfg spi_pl022_cfg_##idx = { \
1022 .reg = DT_INST_REG_ADDR(idx), \
1023 IF_ENABLED(CONFIG_CLOCK_CONTROL, (IF_ENABLED(DT_INST_NODE_HAS_PROP(0, clocks), \
1024 (.clk_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(idx)), \
1025 .clk_id = pl022_clk_id##idx,)))) \
1026 IF_ENABLED(CONFIG_RESET, (IF_ENABLED(DT_INST_NODE_HAS_PROP(0, resets), \
1027 (.reset = RESET_DT_SPEC_INST_GET(idx),)))) \
1028 IF_ENABLED(CONFIG_PINCTRL, (.pincfg = PINCTRL_DT_INST_DEV_CONFIG_GET(idx),)) \
1029 IF_ENABLED(CONFIG_SPI_PL022_DMA, (.dma = DMAS_DECL(idx),)) COND_CODE_1( \
1030 CONFIG_SPI_PL022_DMA, (.dma_enabled = DMAS_ENABLED(idx),), \
1031 (.dma_enabled = false,)) \
1032 IF_ENABLED(CONFIG_SPI_PL022_INTERRUPT, \
1033 (.irq_config = spi_pl022_irq_config_##idx,))}; \
1034 SPI_DEVICE_DT_INST_DEFINE(idx, spi_pl022_init, NULL, &spi_pl022_data_##idx, \
1035 &spi_pl022_cfg_##idx, POST_KERNEL, CONFIG_SPI_INIT_PRIORITY, \
1036 &spi_pl022_api);
1037
1038 DT_INST_FOREACH_STATUS_OKAY(SPI_PL022_INIT)
1039