1 // SPDX-License-Identifier: GPL-2.0+
3 // Freescale i.MX7ULP LPSPI driver
5 // Copyright 2016 Freescale Semiconductor, Inc.
6 // Copyright 2018 NXP Semiconductors
9 #include <linux/completion.h>
10 #include <linux/delay.h>
11 #include <linux/dmaengine.h>
12 #include <linux/dma-mapping.h>
13 #include <linux/err.h>
14 #include <linux/interrupt.h>
16 #include <linux/irq.h>
17 #include <linux/kernel.h>
18 #include <linux/module.h>
20 #include <linux/of_device.h>
21 #include <linux/pinctrl/consumer.h>
22 #include <linux/platform_device.h>
23 #include <linux/platform_data/dma-imx.h>
24 #include <linux/pm_runtime.h>
25 #include <linux/slab.h>
26 #include <linux/spi/spi.h>
27 #include <linux/spi/spi_bitbang.h>
28 #include <linux/types.h>
30 #define DRIVER_NAME "fsl_lpspi"
32 #define FSL_LPSPI_RPM_TIMEOUT 50 /* 50ms */
34 /* The maximum bytes that edma can transfer once.*/
35 #define FSL_LPSPI_MAX_EDMA_BYTES ((1 << 15) - 1)
37 /* i.MX7ULP LPSPI registers */
38 #define IMX7ULP_VERID 0x0
39 #define IMX7ULP_PARAM 0x4
40 #define IMX7ULP_CR 0x10
41 #define IMX7ULP_SR 0x14
42 #define IMX7ULP_IER 0x18
43 #define IMX7ULP_DER 0x1c
44 #define IMX7ULP_CFGR0 0x20
45 #define IMX7ULP_CFGR1 0x24
46 #define IMX7ULP_DMR0 0x30
47 #define IMX7ULP_DMR1 0x34
48 #define IMX7ULP_CCR 0x40
49 #define IMX7ULP_FCR 0x58
50 #define IMX7ULP_FSR 0x5c
51 #define IMX7ULP_TCR 0x60
52 #define IMX7ULP_TDR 0x64
53 #define IMX7ULP_RSR 0x70
54 #define IMX7ULP_RDR 0x74
56 /* General control register field define */
61 #define SR_MBF BIT(24)
62 #define SR_TCF BIT(10)
66 #define IER_TCIE BIT(10)
67 #define IER_FCIE BIT(9)
68 #define IER_RDIE BIT(1)
69 #define IER_TDIE BIT(0)
70 #define DER_RDDE BIT(1)
71 #define DER_TDDE BIT(0)
72 #define CFGR1_PCSCFG BIT(27)
73 #define CFGR1_PINCFG (BIT(24)|BIT(25))
74 #define CFGR1_PCSPOL BIT(8)
75 #define CFGR1_NOSTALL BIT(3)
76 #define CFGR1_MASTER BIT(0)
77 #define FSR_TXCOUNT (0xFF)
78 #define RSR_RXEMPTY BIT(1)
79 #define TCR_CPOL BIT(31)
80 #define TCR_CPHA BIT(30)
81 #define TCR_CONT BIT(21)
82 #define TCR_CONTC BIT(20)
83 #define TCR_RXMSK BIT(19)
84 #define TCR_TXMSK BIT(18)
94 struct fsl_lpspi_data
{
97 unsigned long base_phys
;
106 void (*tx
)(struct fsl_lpspi_data
*);
107 void (*rx
)(struct fsl_lpspi_data
*);
114 struct lpspi_config config
;
115 struct completion xfer_done
;
121 struct completion dma_rx_completion
;
122 struct completion dma_tx_completion
;
125 static const struct of_device_id fsl_lpspi_dt_ids
[] = {
126 { .compatible
= "fsl,imx7ulp-spi", },
129 MODULE_DEVICE_TABLE(of
, fsl_lpspi_dt_ids
);
131 #define LPSPI_BUF_RX(type) \
132 static void fsl_lpspi_buf_rx_##type(struct fsl_lpspi_data *fsl_lpspi) \
134 unsigned int val = readl(fsl_lpspi->base + IMX7ULP_RDR); \
136 if (fsl_lpspi->rx_buf) { \
137 *(type *)fsl_lpspi->rx_buf = val; \
138 fsl_lpspi->rx_buf += sizeof(type); \
142 #define LPSPI_BUF_TX(type) \
143 static void fsl_lpspi_buf_tx_##type(struct fsl_lpspi_data *fsl_lpspi) \
147 if (fsl_lpspi->tx_buf) { \
148 val = *(type *)fsl_lpspi->tx_buf; \
149 fsl_lpspi->tx_buf += sizeof(type); \
152 fsl_lpspi->remain -= sizeof(type); \
153 writel(val, fsl_lpspi->base + IMX7ULP_TDR); \
163 static void fsl_lpspi_intctrl(struct fsl_lpspi_data
*fsl_lpspi
,
166 writel(enable
, fsl_lpspi
->base
+ IMX7ULP_IER
);
169 static int fsl_lpspi_bytes_per_word(const int bpw
)
171 return DIV_ROUND_UP(bpw
, BITS_PER_BYTE
);
174 static bool fsl_lpspi_can_dma(struct spi_controller
*controller
,
175 struct spi_device
*spi
,
176 struct spi_transfer
*transfer
)
178 unsigned int bytes_per_word
;
180 if (!controller
->dma_rx
)
183 bytes_per_word
= fsl_lpspi_bytes_per_word(transfer
->bits_per_word
);
185 switch (bytes_per_word
) {
197 static int lpspi_prepare_xfer_hardware(struct spi_controller
*controller
)
199 struct fsl_lpspi_data
*fsl_lpspi
=
200 spi_controller_get_devdata(controller
);
203 ret
= pm_runtime_get_sync(fsl_lpspi
->dev
);
205 dev_err(fsl_lpspi
->dev
, "failed to enable clock\n");
212 static int lpspi_unprepare_xfer_hardware(struct spi_controller
*controller
)
214 struct fsl_lpspi_data
*fsl_lpspi
=
215 spi_controller_get_devdata(controller
);
217 pm_runtime_mark_last_busy(fsl_lpspi
->dev
);
218 pm_runtime_put_autosuspend(fsl_lpspi
->dev
);
223 static void fsl_lpspi_write_tx_fifo(struct fsl_lpspi_data
*fsl_lpspi
)
228 txfifo_cnt
= readl(fsl_lpspi
->base
+ IMX7ULP_FSR
) & 0xff;
230 while (txfifo_cnt
< fsl_lpspi
->txfifosize
) {
231 if (!fsl_lpspi
->remain
)
233 fsl_lpspi
->tx(fsl_lpspi
);
237 if (txfifo_cnt
< fsl_lpspi
->txfifosize
) {
238 if (!fsl_lpspi
->is_slave
) {
239 temp
= readl(fsl_lpspi
->base
+ IMX7ULP_TCR
);
241 writel(temp
, fsl_lpspi
->base
+ IMX7ULP_TCR
);
244 fsl_lpspi_intctrl(fsl_lpspi
, IER_FCIE
);
246 fsl_lpspi_intctrl(fsl_lpspi
, IER_TDIE
);
249 static void fsl_lpspi_read_rx_fifo(struct fsl_lpspi_data
*fsl_lpspi
)
251 while (!(readl(fsl_lpspi
->base
+ IMX7ULP_RSR
) & RSR_RXEMPTY
))
252 fsl_lpspi
->rx(fsl_lpspi
);
255 static void fsl_lpspi_set_cmd(struct fsl_lpspi_data
*fsl_lpspi
)
259 temp
|= fsl_lpspi
->config
.bpw
- 1;
260 temp
|= (fsl_lpspi
->config
.mode
& 0x3) << 30;
261 temp
|= (fsl_lpspi
->config
.chip_select
& 0x3) << 24;
262 if (!fsl_lpspi
->is_slave
) {
263 temp
|= fsl_lpspi
->config
.prescale
<< 27;
265 * Set TCR_CONT will keep SS asserted after current transfer.
266 * For the first transfer, clear TCR_CONTC to assert SS.
267 * For subsequent transfer, set TCR_CONTC to keep SS asserted.
269 if (!fsl_lpspi
->usedma
) {
271 if (fsl_lpspi
->is_first_byte
)
277 writel(temp
, fsl_lpspi
->base
+ IMX7ULP_TCR
);
279 dev_dbg(fsl_lpspi
->dev
, "TCR=0x%x\n", temp
);
282 static void fsl_lpspi_set_watermark(struct fsl_lpspi_data
*fsl_lpspi
)
286 if (!fsl_lpspi
->usedma
)
287 temp
= fsl_lpspi
->watermark
>> 1 |
288 (fsl_lpspi
->watermark
>> 1) << 16;
290 temp
= fsl_lpspi
->watermark
>> 1;
292 writel(temp
, fsl_lpspi
->base
+ IMX7ULP_FCR
);
294 dev_dbg(fsl_lpspi
->dev
, "FCR=0x%x\n", temp
);
297 static int fsl_lpspi_set_bitrate(struct fsl_lpspi_data
*fsl_lpspi
)
299 struct lpspi_config config
= fsl_lpspi
->config
;
300 unsigned int perclk_rate
, scldiv
;
303 perclk_rate
= clk_get_rate(fsl_lpspi
->clk_per
);
305 if (config
.speed_hz
> perclk_rate
/ 2) {
306 dev_err(fsl_lpspi
->dev
,
307 "per-clk should be at least two times of transfer speed");
311 for (prescale
= 0; prescale
< 8; prescale
++) {
312 scldiv
= perclk_rate
/ config
.speed_hz
/ (1 << prescale
) - 2;
314 fsl_lpspi
->config
.prescale
= prescale
;
322 writel(scldiv
| (scldiv
<< 8) | ((scldiv
>> 1) << 16),
323 fsl_lpspi
->base
+ IMX7ULP_CCR
);
325 dev_dbg(fsl_lpspi
->dev
, "perclk=%d, speed=%d, prescale=%d, scldiv=%d\n",
326 perclk_rate
, config
.speed_hz
, prescale
, scldiv
);
331 static int fsl_lpspi_dma_configure(struct spi_controller
*controller
)
334 enum dma_slave_buswidth buswidth
;
335 struct dma_slave_config rx
= {}, tx
= {};
336 struct fsl_lpspi_data
*fsl_lpspi
=
337 spi_controller_get_devdata(controller
);
339 switch (fsl_lpspi_bytes_per_word(fsl_lpspi
->config
.bpw
)) {
341 buswidth
= DMA_SLAVE_BUSWIDTH_4_BYTES
;
344 buswidth
= DMA_SLAVE_BUSWIDTH_2_BYTES
;
347 buswidth
= DMA_SLAVE_BUSWIDTH_1_BYTE
;
353 tx
.direction
= DMA_MEM_TO_DEV
;
354 tx
.dst_addr
= fsl_lpspi
->base_phys
+ IMX7ULP_TDR
;
355 tx
.dst_addr_width
= buswidth
;
357 ret
= dmaengine_slave_config(controller
->dma_tx
, &tx
);
359 dev_err(fsl_lpspi
->dev
, "TX dma configuration failed with %d\n",
364 rx
.direction
= DMA_DEV_TO_MEM
;
365 rx
.src_addr
= fsl_lpspi
->base_phys
+ IMX7ULP_RDR
;
366 rx
.src_addr_width
= buswidth
;
368 ret
= dmaengine_slave_config(controller
->dma_rx
, &rx
);
370 dev_err(fsl_lpspi
->dev
, "RX dma configuration failed with %d\n",
378 static int fsl_lpspi_config(struct fsl_lpspi_data
*fsl_lpspi
)
383 if (!fsl_lpspi
->is_slave
) {
384 ret
= fsl_lpspi_set_bitrate(fsl_lpspi
);
389 fsl_lpspi_set_watermark(fsl_lpspi
);
391 if (!fsl_lpspi
->is_slave
)
395 if (fsl_lpspi
->config
.mode
& SPI_CS_HIGH
)
396 temp
|= CFGR1_PCSPOL
;
397 writel(temp
, fsl_lpspi
->base
+ IMX7ULP_CFGR1
);
399 temp
= readl(fsl_lpspi
->base
+ IMX7ULP_CR
);
400 temp
|= CR_RRF
| CR_RTF
| CR_MEN
;
401 writel(temp
, fsl_lpspi
->base
+ IMX7ULP_CR
);
404 if (fsl_lpspi
->usedma
)
405 temp
= DER_TDDE
| DER_RDDE
;
406 writel(temp
, fsl_lpspi
->base
+ IMX7ULP_DER
);
411 static int fsl_lpspi_setup_transfer(struct spi_controller
*controller
,
412 struct spi_device
*spi
,
413 struct spi_transfer
*t
)
415 struct fsl_lpspi_data
*fsl_lpspi
=
416 spi_controller_get_devdata(spi
->controller
);
421 fsl_lpspi
->config
.mode
= spi
->mode
;
422 fsl_lpspi
->config
.bpw
= t
->bits_per_word
;
423 fsl_lpspi
->config
.speed_hz
= t
->speed_hz
;
424 if (fsl_lpspi
->is_only_cs1
)
425 fsl_lpspi
->config
.chip_select
= 1;
427 fsl_lpspi
->config
.chip_select
= spi
->chip_select
;
429 if (!fsl_lpspi
->config
.speed_hz
)
430 fsl_lpspi
->config
.speed_hz
= spi
->max_speed_hz
;
431 if (!fsl_lpspi
->config
.bpw
)
432 fsl_lpspi
->config
.bpw
= spi
->bits_per_word
;
434 /* Initialize the functions for transfer */
435 if (fsl_lpspi
->config
.bpw
<= 8) {
436 fsl_lpspi
->rx
= fsl_lpspi_buf_rx_u8
;
437 fsl_lpspi
->tx
= fsl_lpspi_buf_tx_u8
;
438 } else if (fsl_lpspi
->config
.bpw
<= 16) {
439 fsl_lpspi
->rx
= fsl_lpspi_buf_rx_u16
;
440 fsl_lpspi
->tx
= fsl_lpspi_buf_tx_u16
;
442 fsl_lpspi
->rx
= fsl_lpspi_buf_rx_u32
;
443 fsl_lpspi
->tx
= fsl_lpspi_buf_tx_u32
;
446 if (t
->len
<= fsl_lpspi
->txfifosize
)
447 fsl_lpspi
->watermark
= t
->len
;
449 fsl_lpspi
->watermark
= fsl_lpspi
->txfifosize
;
451 if (fsl_lpspi_can_dma(controller
, spi
, t
))
452 fsl_lpspi
->usedma
= true;
454 fsl_lpspi
->usedma
= false;
456 return fsl_lpspi_config(fsl_lpspi
);
459 static int fsl_lpspi_slave_abort(struct spi_controller
*controller
)
461 struct fsl_lpspi_data
*fsl_lpspi
=
462 spi_controller_get_devdata(controller
);
464 fsl_lpspi
->slave_aborted
= true;
465 if (!fsl_lpspi
->usedma
)
466 complete(&fsl_lpspi
->xfer_done
);
468 complete(&fsl_lpspi
->dma_tx_completion
);
469 complete(&fsl_lpspi
->dma_rx_completion
);
475 static int fsl_lpspi_wait_for_completion(struct spi_controller
*controller
)
477 struct fsl_lpspi_data
*fsl_lpspi
=
478 spi_controller_get_devdata(controller
);
480 if (fsl_lpspi
->is_slave
) {
481 if (wait_for_completion_interruptible(&fsl_lpspi
->xfer_done
) ||
482 fsl_lpspi
->slave_aborted
) {
483 dev_dbg(fsl_lpspi
->dev
, "interrupted\n");
487 if (!wait_for_completion_timeout(&fsl_lpspi
->xfer_done
, HZ
)) {
488 dev_dbg(fsl_lpspi
->dev
, "wait for completion timeout\n");
496 static int fsl_lpspi_reset(struct fsl_lpspi_data
*fsl_lpspi
)
500 if (!fsl_lpspi
->usedma
) {
501 /* Disable all interrupt */
502 fsl_lpspi_intctrl(fsl_lpspi
, 0);
505 /* W1C for all flags in SR */
507 writel(temp
, fsl_lpspi
->base
+ IMX7ULP_SR
);
509 /* Clear FIFO and disable module */
510 temp
= CR_RRF
| CR_RTF
;
511 writel(temp
, fsl_lpspi
->base
+ IMX7ULP_CR
);
516 static void fsl_lpspi_dma_rx_callback(void *cookie
)
518 struct fsl_lpspi_data
*fsl_lpspi
= (struct fsl_lpspi_data
*)cookie
;
520 complete(&fsl_lpspi
->dma_rx_completion
);
523 static void fsl_lpspi_dma_tx_callback(void *cookie
)
525 struct fsl_lpspi_data
*fsl_lpspi
= (struct fsl_lpspi_data
*)cookie
;
527 complete(&fsl_lpspi
->dma_tx_completion
);
530 static int fsl_lpspi_calculate_timeout(struct fsl_lpspi_data
*fsl_lpspi
,
533 unsigned long timeout
= 0;
535 /* Time with actual data transfer and CS change delay related to HW */
536 timeout
= (8 + 4) * size
/ fsl_lpspi
->config
.speed_hz
;
538 /* Add extra second for scheduler related activities */
541 /* Double calculated timeout */
542 return msecs_to_jiffies(2 * timeout
* MSEC_PER_SEC
);
545 static int fsl_lpspi_dma_transfer(struct spi_controller
*controller
,
546 struct fsl_lpspi_data
*fsl_lpspi
,
547 struct spi_transfer
*transfer
)
549 struct dma_async_tx_descriptor
*desc_tx
, *desc_rx
;
550 unsigned long transfer_timeout
;
551 unsigned long timeout
;
552 struct sg_table
*tx
= &transfer
->tx_sg
, *rx
= &transfer
->rx_sg
;
555 ret
= fsl_lpspi_dma_configure(controller
);
559 desc_rx
= dmaengine_prep_slave_sg(controller
->dma_rx
,
560 rx
->sgl
, rx
->nents
, DMA_DEV_TO_MEM
,
561 DMA_PREP_INTERRUPT
| DMA_CTRL_ACK
);
565 desc_rx
->callback
= fsl_lpspi_dma_rx_callback
;
566 desc_rx
->callback_param
= (void *)fsl_lpspi
;
567 dmaengine_submit(desc_rx
);
568 reinit_completion(&fsl_lpspi
->dma_rx_completion
);
569 dma_async_issue_pending(controller
->dma_rx
);
571 desc_tx
= dmaengine_prep_slave_sg(controller
->dma_tx
,
572 tx
->sgl
, tx
->nents
, DMA_MEM_TO_DEV
,
573 DMA_PREP_INTERRUPT
| DMA_CTRL_ACK
);
575 dmaengine_terminate_all(controller
->dma_tx
);
579 desc_tx
->callback
= fsl_lpspi_dma_tx_callback
;
580 desc_tx
->callback_param
= (void *)fsl_lpspi
;
581 dmaengine_submit(desc_tx
);
582 reinit_completion(&fsl_lpspi
->dma_tx_completion
);
583 dma_async_issue_pending(controller
->dma_tx
);
585 fsl_lpspi
->slave_aborted
= false;
587 if (!fsl_lpspi
->is_slave
) {
588 transfer_timeout
= fsl_lpspi_calculate_timeout(fsl_lpspi
,
591 /* Wait eDMA to finish the data transfer.*/
592 timeout
= wait_for_completion_timeout(&fsl_lpspi
->dma_tx_completion
,
595 dev_err(fsl_lpspi
->dev
, "I/O Error in DMA TX\n");
596 dmaengine_terminate_all(controller
->dma_tx
);
597 dmaengine_terminate_all(controller
->dma_rx
);
598 fsl_lpspi_reset(fsl_lpspi
);
602 timeout
= wait_for_completion_timeout(&fsl_lpspi
->dma_rx_completion
,
605 dev_err(fsl_lpspi
->dev
, "I/O Error in DMA RX\n");
606 dmaengine_terminate_all(controller
->dma_tx
);
607 dmaengine_terminate_all(controller
->dma_rx
);
608 fsl_lpspi_reset(fsl_lpspi
);
612 if (wait_for_completion_interruptible(&fsl_lpspi
->dma_tx_completion
) ||
613 fsl_lpspi
->slave_aborted
) {
614 dev_dbg(fsl_lpspi
->dev
,
615 "I/O Error in DMA TX interrupted\n");
616 dmaengine_terminate_all(controller
->dma_tx
);
617 dmaengine_terminate_all(controller
->dma_rx
);
618 fsl_lpspi_reset(fsl_lpspi
);
622 if (wait_for_completion_interruptible(&fsl_lpspi
->dma_rx_completion
) ||
623 fsl_lpspi
->slave_aborted
) {
624 dev_dbg(fsl_lpspi
->dev
,
625 "I/O Error in DMA RX interrupted\n");
626 dmaengine_terminate_all(controller
->dma_tx
);
627 dmaengine_terminate_all(controller
->dma_rx
);
628 fsl_lpspi_reset(fsl_lpspi
);
633 fsl_lpspi_reset(fsl_lpspi
);
638 static void fsl_lpspi_dma_exit(struct spi_controller
*controller
)
640 if (controller
->dma_rx
) {
641 dma_release_channel(controller
->dma_rx
);
642 controller
->dma_rx
= NULL
;
645 if (controller
->dma_tx
) {
646 dma_release_channel(controller
->dma_tx
);
647 controller
->dma_tx
= NULL
;
651 static int fsl_lpspi_dma_init(struct device
*dev
,
652 struct fsl_lpspi_data
*fsl_lpspi
,
653 struct spi_controller
*controller
)
657 /* Prepare for TX DMA: */
658 controller
->dma_tx
= dma_request_chan(dev
, "tx");
659 if (IS_ERR(controller
->dma_tx
)) {
660 ret
= PTR_ERR(controller
->dma_tx
);
661 dev_dbg(dev
, "can't get the TX DMA channel, error %d!\n", ret
);
662 controller
->dma_tx
= NULL
;
666 /* Prepare for RX DMA: */
667 controller
->dma_rx
= dma_request_chan(dev
, "rx");
668 if (IS_ERR(controller
->dma_rx
)) {
669 ret
= PTR_ERR(controller
->dma_rx
);
670 dev_dbg(dev
, "can't get the RX DMA channel, error %d\n", ret
);
671 controller
->dma_rx
= NULL
;
675 init_completion(&fsl_lpspi
->dma_rx_completion
);
676 init_completion(&fsl_lpspi
->dma_tx_completion
);
677 controller
->can_dma
= fsl_lpspi_can_dma
;
678 controller
->max_dma_len
= FSL_LPSPI_MAX_EDMA_BYTES
;
682 fsl_lpspi_dma_exit(controller
);
686 static int fsl_lpspi_pio_transfer(struct spi_controller
*controller
,
687 struct spi_transfer
*t
)
689 struct fsl_lpspi_data
*fsl_lpspi
=
690 spi_controller_get_devdata(controller
);
693 fsl_lpspi
->tx_buf
= t
->tx_buf
;
694 fsl_lpspi
->rx_buf
= t
->rx_buf
;
695 fsl_lpspi
->remain
= t
->len
;
697 reinit_completion(&fsl_lpspi
->xfer_done
);
698 fsl_lpspi
->slave_aborted
= false;
700 fsl_lpspi_write_tx_fifo(fsl_lpspi
);
702 ret
= fsl_lpspi_wait_for_completion(controller
);
706 fsl_lpspi_reset(fsl_lpspi
);
711 static int fsl_lpspi_transfer_one(struct spi_controller
*controller
,
712 struct spi_device
*spi
,
713 struct spi_transfer
*t
)
715 struct fsl_lpspi_data
*fsl_lpspi
=
716 spi_controller_get_devdata(controller
);
719 fsl_lpspi
->is_first_byte
= true;
720 ret
= fsl_lpspi_setup_transfer(controller
, spi
, t
);
724 fsl_lpspi_set_cmd(fsl_lpspi
);
725 fsl_lpspi
->is_first_byte
= false;
727 if (fsl_lpspi
->usedma
)
728 ret
= fsl_lpspi_dma_transfer(controller
, fsl_lpspi
, t
);
730 ret
= fsl_lpspi_pio_transfer(controller
, t
);
737 static irqreturn_t
fsl_lpspi_isr(int irq
, void *dev_id
)
739 u32 temp_SR
, temp_IER
;
740 struct fsl_lpspi_data
*fsl_lpspi
= dev_id
;
742 temp_IER
= readl(fsl_lpspi
->base
+ IMX7ULP_IER
);
743 fsl_lpspi_intctrl(fsl_lpspi
, 0);
744 temp_SR
= readl(fsl_lpspi
->base
+ IMX7ULP_SR
);
746 fsl_lpspi_read_rx_fifo(fsl_lpspi
);
748 if ((temp_SR
& SR_TDF
) && (temp_IER
& IER_TDIE
)) {
749 fsl_lpspi_write_tx_fifo(fsl_lpspi
);
753 if (temp_SR
& SR_MBF
||
754 readl(fsl_lpspi
->base
+ IMX7ULP_FSR
) & FSR_TXCOUNT
) {
755 writel(SR_FCF
, fsl_lpspi
->base
+ IMX7ULP_SR
);
756 fsl_lpspi_intctrl(fsl_lpspi
, IER_FCIE
);
760 if (temp_SR
& SR_FCF
&& (temp_IER
& IER_FCIE
)) {
761 writel(SR_FCF
, fsl_lpspi
->base
+ IMX7ULP_SR
);
762 complete(&fsl_lpspi
->xfer_done
);
770 static int fsl_lpspi_runtime_resume(struct device
*dev
)
772 struct spi_controller
*controller
= dev_get_drvdata(dev
);
773 struct fsl_lpspi_data
*fsl_lpspi
;
776 fsl_lpspi
= spi_controller_get_devdata(controller
);
778 ret
= clk_prepare_enable(fsl_lpspi
->clk_per
);
782 ret
= clk_prepare_enable(fsl_lpspi
->clk_ipg
);
784 clk_disable_unprepare(fsl_lpspi
->clk_per
);
791 static int fsl_lpspi_runtime_suspend(struct device
*dev
)
793 struct spi_controller
*controller
= dev_get_drvdata(dev
);
794 struct fsl_lpspi_data
*fsl_lpspi
;
796 fsl_lpspi
= spi_controller_get_devdata(controller
);
798 clk_disable_unprepare(fsl_lpspi
->clk_per
);
799 clk_disable_unprepare(fsl_lpspi
->clk_ipg
);
805 static int fsl_lpspi_init_rpm(struct fsl_lpspi_data
*fsl_lpspi
)
807 struct device
*dev
= fsl_lpspi
->dev
;
809 pm_runtime_enable(dev
);
810 pm_runtime_set_autosuspend_delay(dev
, FSL_LPSPI_RPM_TIMEOUT
);
811 pm_runtime_use_autosuspend(dev
);
816 static int fsl_lpspi_probe(struct platform_device
*pdev
)
818 struct fsl_lpspi_data
*fsl_lpspi
;
819 struct spi_controller
*controller
;
820 struct resource
*res
;
825 is_slave
= of_property_read_bool((&pdev
->dev
)->of_node
, "spi-slave");
827 controller
= spi_alloc_slave(&pdev
->dev
,
828 sizeof(struct fsl_lpspi_data
));
830 controller
= spi_alloc_master(&pdev
->dev
,
831 sizeof(struct fsl_lpspi_data
));
836 platform_set_drvdata(pdev
, controller
);
838 fsl_lpspi
= spi_controller_get_devdata(controller
);
839 fsl_lpspi
->dev
= &pdev
->dev
;
840 fsl_lpspi
->is_slave
= is_slave
;
841 fsl_lpspi
->is_only_cs1
= of_property_read_bool((&pdev
->dev
)->of_node
,
842 "fsl,spi-only-use-cs1-sel");
844 controller
->bits_per_word_mask
= SPI_BPW_RANGE_MASK(8, 32);
845 controller
->transfer_one
= fsl_lpspi_transfer_one
;
846 controller
->prepare_transfer_hardware
= lpspi_prepare_xfer_hardware
;
847 controller
->unprepare_transfer_hardware
= lpspi_unprepare_xfer_hardware
;
848 controller
->mode_bits
= SPI_CPOL
| SPI_CPHA
| SPI_CS_HIGH
;
849 controller
->flags
= SPI_MASTER_MUST_RX
| SPI_MASTER_MUST_TX
;
850 controller
->dev
.of_node
= pdev
->dev
.of_node
;
851 controller
->bus_num
= pdev
->id
;
852 controller
->slave_abort
= fsl_lpspi_slave_abort
;
853 if (!fsl_lpspi
->is_slave
)
854 controller
->use_gpio_descriptors
= true;
856 init_completion(&fsl_lpspi
->xfer_done
);
858 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
859 fsl_lpspi
->base
= devm_ioremap_resource(&pdev
->dev
, res
);
860 if (IS_ERR(fsl_lpspi
->base
)) {
861 ret
= PTR_ERR(fsl_lpspi
->base
);
862 goto out_controller_put
;
864 fsl_lpspi
->base_phys
= res
->start
;
866 irq
= platform_get_irq(pdev
, 0);
869 goto out_controller_put
;
872 ret
= devm_request_irq(&pdev
->dev
, irq
, fsl_lpspi_isr
, 0,
873 dev_name(&pdev
->dev
), fsl_lpspi
);
875 dev_err(&pdev
->dev
, "can't get irq%d: %d\n", irq
, ret
);
876 goto out_controller_put
;
879 fsl_lpspi
->clk_per
= devm_clk_get(&pdev
->dev
, "per");
880 if (IS_ERR(fsl_lpspi
->clk_per
)) {
881 ret
= PTR_ERR(fsl_lpspi
->clk_per
);
882 goto out_controller_put
;
885 fsl_lpspi
->clk_ipg
= devm_clk_get(&pdev
->dev
, "ipg");
886 if (IS_ERR(fsl_lpspi
->clk_ipg
)) {
887 ret
= PTR_ERR(fsl_lpspi
->clk_ipg
);
888 goto out_controller_put
;
891 /* enable the clock */
892 ret
= fsl_lpspi_init_rpm(fsl_lpspi
);
894 goto out_controller_put
;
896 ret
= pm_runtime_get_sync(fsl_lpspi
->dev
);
898 dev_err(fsl_lpspi
->dev
, "failed to enable clock\n");
902 temp
= readl(fsl_lpspi
->base
+ IMX7ULP_PARAM
);
903 fsl_lpspi
->txfifosize
= 1 << (temp
& 0x0f);
904 fsl_lpspi
->rxfifosize
= 1 << ((temp
>> 8) & 0x0f);
906 ret
= fsl_lpspi_dma_init(&pdev
->dev
, fsl_lpspi
, controller
);
907 if (ret
== -EPROBE_DEFER
)
911 dev_err(&pdev
->dev
, "dma setup error %d, use pio\n", ret
);
913 ret
= devm_spi_register_controller(&pdev
->dev
, controller
);
915 dev_err(&pdev
->dev
, "spi_register_controller error.\n");
919 pm_runtime_mark_last_busy(fsl_lpspi
->dev
);
920 pm_runtime_put_autosuspend(fsl_lpspi
->dev
);
925 pm_runtime_dont_use_autosuspend(fsl_lpspi
->dev
);
926 pm_runtime_put_sync(fsl_lpspi
->dev
);
927 pm_runtime_disable(fsl_lpspi
->dev
);
929 spi_controller_put(controller
);
934 static int fsl_lpspi_remove(struct platform_device
*pdev
)
936 struct spi_controller
*controller
= platform_get_drvdata(pdev
);
937 struct fsl_lpspi_data
*fsl_lpspi
=
938 spi_controller_get_devdata(controller
);
940 pm_runtime_disable(fsl_lpspi
->dev
);
944 static int __maybe_unused
fsl_lpspi_suspend(struct device
*dev
)
948 pinctrl_pm_select_sleep_state(dev
);
949 ret
= pm_runtime_force_suspend(dev
);
953 static int __maybe_unused
fsl_lpspi_resume(struct device
*dev
)
957 ret
= pm_runtime_force_resume(dev
);
959 dev_err(dev
, "Error in resume: %d\n", ret
);
963 pinctrl_pm_select_default_state(dev
);
968 static const struct dev_pm_ops fsl_lpspi_pm_ops
= {
969 SET_RUNTIME_PM_OPS(fsl_lpspi_runtime_suspend
,
970 fsl_lpspi_runtime_resume
, NULL
)
971 SET_SYSTEM_SLEEP_PM_OPS(fsl_lpspi_suspend
, fsl_lpspi_resume
)
974 static struct platform_driver fsl_lpspi_driver
= {
977 .of_match_table
= fsl_lpspi_dt_ids
,
978 .pm
= &fsl_lpspi_pm_ops
,
980 .probe
= fsl_lpspi_probe
,
981 .remove
= fsl_lpspi_remove
,
983 module_platform_driver(fsl_lpspi_driver
);
985 MODULE_DESCRIPTION("LPSPI Controller driver");
986 MODULE_AUTHOR("Gao Pan <pandy.gao@nxp.com>");
987 MODULE_LICENSE("GPL");