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