1 // SPDX-License-Identifier: GPL-2.0-only
3 // HiSilicon SPI Controller Driver for Kunpeng SoCs
5 // Copyright (c) 2021 HiSilicon Technologies Co., Ltd.
6 // Author: Jay Fang <f.fangjian@huawei.com>
8 // This code is based on spi-dw-core.c.
10 #include <linux/acpi.h>
11 #include <linux/bitfield.h>
12 #include <linux/debugfs.h>
13 #include <linux/delay.h>
14 #include <linux/err.h>
15 #include <linux/interrupt.h>
16 #include <linux/module.h>
17 #include <linux/property.h>
18 #include <linux/platform_device.h>
19 #include <linux/slab.h>
20 #include <linux/spi/spi.h>
22 /* Register offsets */
23 #define HISI_SPI_CSCR 0x00 /* cs control register */
24 #define HISI_SPI_CR 0x04 /* spi common control register */
25 #define HISI_SPI_ENR 0x08 /* spi enable register */
26 #define HISI_SPI_FIFOC 0x0c /* fifo level control register */
27 #define HISI_SPI_IMR 0x10 /* interrupt mask register */
28 #define HISI_SPI_DIN 0x14 /* data in register */
29 #define HISI_SPI_DOUT 0x18 /* data out register */
30 #define HISI_SPI_SR 0x1c /* status register */
31 #define HISI_SPI_RISR 0x20 /* raw interrupt status register */
32 #define HISI_SPI_ISR 0x24 /* interrupt status register */
33 #define HISI_SPI_ICR 0x28 /* interrupt clear register */
34 #define HISI_SPI_VERSION 0xe0 /* version register */
36 /* Bit fields in HISI_SPI_CR */
37 #define CR_LOOP_MASK GENMASK(1, 1)
38 #define CR_CPOL_MASK GENMASK(2, 2)
39 #define CR_CPHA_MASK GENMASK(3, 3)
40 #define CR_DIV_PRE_MASK GENMASK(11, 4)
41 #define CR_DIV_POST_MASK GENMASK(19, 12)
42 #define CR_BPW_MASK GENMASK(24, 20)
43 #define CR_SPD_MODE_MASK GENMASK(25, 25)
45 /* Bit fields in HISI_SPI_FIFOC */
46 #define FIFOC_TX_MASK GENMASK(5, 3)
47 #define FIFOC_RX_MASK GENMASK(11, 9)
49 /* Bit fields in HISI_SPI_IMR, 4 bits */
50 #define IMR_RXOF BIT(0) /* Receive Overflow */
51 #define IMR_RXTO BIT(1) /* Receive Timeout */
52 #define IMR_RX BIT(2) /* Receive */
53 #define IMR_TX BIT(3) /* Transmit */
54 #define IMR_MASK (IMR_RXOF | IMR_RXTO | IMR_RX | IMR_TX)
56 /* Bit fields in HISI_SPI_SR, 5 bits */
57 #define SR_TXE BIT(0) /* Transmit FIFO empty */
58 #define SR_TXNF BIT(1) /* Transmit FIFO not full */
59 #define SR_RXNE BIT(2) /* Receive FIFO not empty */
60 #define SR_RXF BIT(3) /* Receive FIFO full */
61 #define SR_BUSY BIT(4) /* Busy Flag */
63 /* Bit fields in HISI_SPI_ISR, 4 bits */
64 #define ISR_RXOF BIT(0) /* Receive Overflow */
65 #define ISR_RXTO BIT(1) /* Receive Timeout */
66 #define ISR_RX BIT(2) /* Receive */
67 #define ISR_TX BIT(3) /* Transmit */
68 #define ISR_MASK (ISR_RXOF | ISR_RXTO | ISR_RX | ISR_TX)
70 /* Bit fields in HISI_SPI_ICR, 2 bits */
71 #define ICR_RXOF BIT(0) /* Receive Overflow */
72 #define ICR_RXTO BIT(1) /* Receive Timeout */
73 #define ICR_MASK (ICR_RXOF | ICR_RXTO)
75 #define DIV_POST_MAX 0xFF
76 #define DIV_POST_MIN 0x00
77 #define DIV_PRE_MAX 0xFE
78 #define DIV_PRE_MIN 0x02
79 #define CLK_DIV_MAX ((1 + DIV_POST_MAX) * DIV_PRE_MAX)
80 #define CLK_DIV_MIN ((1 + DIV_POST_MIN) * DIV_PRE_MIN)
82 #define DEFAULT_NUM_CS 1
84 #define HISI_SPI_WAIT_TIMEOUT_MS 10UL
86 enum hisi_spi_rx_level_trig
{
96 enum hisi_spi_tx_level_trig
{
97 HISI_SPI_TX_1_OR_LESS
,
98 HISI_SPI_TX_4_OR_LESS
,
99 HISI_SPI_TX_8_OR_LESS
,
100 HISI_SPI_TX_16_OR_LESS
,
101 HISI_SPI_TX_32_OR_LESS
,
102 HISI_SPI_TX_64_OR_LESS
,
103 HISI_SPI_TX_128_OR_LESS
106 enum hisi_spi_frame_n_bytes
{
107 HISI_SPI_N_BYTES_NULL
,
109 HISI_SPI_N_BYTES_U16
,
110 HISI_SPI_N_BYTES_U32
= 4
113 /* Slave spi_dev related */
114 struct hisi_chip_data
{
116 u32 speed_hz
; /* baud rate */
117 u16 clk_div
; /* baud rate divider */
119 /* clk_div = (1 + div_post) * div_pre */
120 u8 div_post
; /* value from 0 to 255 */
121 u8 div_pre
; /* value from 2 to 254 (even only!) */
129 u32 fifo_len
; /* depth of the FIFO buffer */
131 /* Current message transfer state info */
136 u8 n_bytes
; /* current is a 1/2/4 bytes op */
138 struct dentry
*debugfs
;
139 struct debugfs_regset32 regset
;
142 #define HISI_SPI_DBGFS_REG(_name, _off) \
148 static const struct debugfs_reg32 hisi_spi_regs
[] = {
149 HISI_SPI_DBGFS_REG("CSCR", HISI_SPI_CSCR
),
150 HISI_SPI_DBGFS_REG("CR", HISI_SPI_CR
),
151 HISI_SPI_DBGFS_REG("ENR", HISI_SPI_ENR
),
152 HISI_SPI_DBGFS_REG("FIFOC", HISI_SPI_FIFOC
),
153 HISI_SPI_DBGFS_REG("IMR", HISI_SPI_IMR
),
154 HISI_SPI_DBGFS_REG("SR", HISI_SPI_SR
),
155 HISI_SPI_DBGFS_REG("RISR", HISI_SPI_RISR
),
156 HISI_SPI_DBGFS_REG("ISR", HISI_SPI_ISR
),
157 HISI_SPI_DBGFS_REG("ICR", HISI_SPI_ICR
),
158 HISI_SPI_DBGFS_REG("VERSION", HISI_SPI_VERSION
),
161 static int hisi_spi_debugfs_init(struct hisi_spi
*hs
)
165 struct spi_controller
*host
;
167 host
= container_of(hs
->dev
, struct spi_controller
, dev
);
168 snprintf(name
, 32, "hisi_spi%d", host
->bus_num
);
169 hs
->debugfs
= debugfs_create_dir(name
, NULL
);
170 if (IS_ERR(hs
->debugfs
))
173 hs
->regset
.regs
= hisi_spi_regs
;
174 hs
->regset
.nregs
= ARRAY_SIZE(hisi_spi_regs
);
175 hs
->regset
.base
= hs
->regs
;
176 debugfs_create_regset32("registers", 0400, hs
->debugfs
, &hs
->regset
);
181 static u32
hisi_spi_busy(struct hisi_spi
*hs
)
183 return readl(hs
->regs
+ HISI_SPI_SR
) & SR_BUSY
;
186 static u32
hisi_spi_rx_not_empty(struct hisi_spi
*hs
)
188 return readl(hs
->regs
+ HISI_SPI_SR
) & SR_RXNE
;
191 static u32
hisi_spi_tx_not_full(struct hisi_spi
*hs
)
193 return readl(hs
->regs
+ HISI_SPI_SR
) & SR_TXNF
;
196 static void hisi_spi_flush_fifo(struct hisi_spi
*hs
)
198 unsigned long limit
= loops_per_jiffy
<< 1;
201 while (hisi_spi_rx_not_empty(hs
))
202 readl(hs
->regs
+ HISI_SPI_DOUT
);
203 } while (hisi_spi_busy(hs
) && limit
--);
206 /* Disable the controller and all interrupts */
207 static void hisi_spi_disable(struct hisi_spi
*hs
)
209 writel(0, hs
->regs
+ HISI_SPI_ENR
);
210 writel(IMR_MASK
, hs
->regs
+ HISI_SPI_IMR
);
211 writel(ICR_MASK
, hs
->regs
+ HISI_SPI_ICR
);
214 static u8
hisi_spi_n_bytes(struct spi_transfer
*transfer
)
216 if (transfer
->bits_per_word
<= 8)
217 return HISI_SPI_N_BYTES_U8
;
218 else if (transfer
->bits_per_word
<= 16)
219 return HISI_SPI_N_BYTES_U16
;
221 return HISI_SPI_N_BYTES_U32
;
224 static void hisi_spi_reader(struct hisi_spi
*hs
)
226 u32 max
= min_t(u32
, hs
->rx_len
, hs
->fifo_len
);
229 while (hisi_spi_rx_not_empty(hs
) && max
--) {
230 rxw
= readl(hs
->regs
+ HISI_SPI_DOUT
);
231 /* Check the transfer's original "rx" is not null */
233 switch (hs
->n_bytes
) {
234 case HISI_SPI_N_BYTES_U8
:
235 *(u8
*)(hs
->rx
) = rxw
;
237 case HISI_SPI_N_BYTES_U16
:
238 *(u16
*)(hs
->rx
) = rxw
;
240 case HISI_SPI_N_BYTES_U32
:
241 *(u32
*)(hs
->rx
) = rxw
;
244 hs
->rx
+= hs
->n_bytes
;
250 static void hisi_spi_writer(struct hisi_spi
*hs
)
252 u32 max
= min_t(u32
, hs
->tx_len
, hs
->fifo_len
);
255 while (hisi_spi_tx_not_full(hs
) && max
--) {
256 /* Check the transfer's original "tx" is not null */
258 switch (hs
->n_bytes
) {
259 case HISI_SPI_N_BYTES_U8
:
260 txw
= *(u8
*)(hs
->tx
);
262 case HISI_SPI_N_BYTES_U16
:
263 txw
= *(u16
*)(hs
->tx
);
265 case HISI_SPI_N_BYTES_U32
:
266 txw
= *(u32
*)(hs
->tx
);
269 hs
->tx
+= hs
->n_bytes
;
271 writel(txw
, hs
->regs
+ HISI_SPI_DIN
);
276 static void __hisi_calc_div_reg(struct hisi_chip_data
*chip
)
278 chip
->div_pre
= DIV_PRE_MAX
;
279 while (chip
->div_pre
>= DIV_PRE_MIN
) {
280 if (chip
->clk_div
% chip
->div_pre
== 0)
286 if (chip
->div_pre
> chip
->clk_div
)
287 chip
->div_pre
= chip
->clk_div
;
289 chip
->div_post
= (chip
->clk_div
/ chip
->div_pre
) - 1;
292 static u32
hisi_calc_effective_speed(struct spi_controller
*host
,
293 struct hisi_chip_data
*chip
, u32 speed_hz
)
297 /* Note clock divider doesn't support odd numbers */
298 chip
->clk_div
= DIV_ROUND_UP(host
->max_speed_hz
, speed_hz
) + 1;
299 chip
->clk_div
&= 0xfffe;
300 if (chip
->clk_div
> CLK_DIV_MAX
)
301 chip
->clk_div
= CLK_DIV_MAX
;
303 effective_speed
= host
->max_speed_hz
/ chip
->clk_div
;
304 if (chip
->speed_hz
!= effective_speed
) {
305 __hisi_calc_div_reg(chip
);
306 chip
->speed_hz
= effective_speed
;
309 return effective_speed
;
312 static u32
hisi_spi_prepare_cr(struct spi_device
*spi
)
314 u32 cr
= FIELD_PREP(CR_SPD_MODE_MASK
, 1);
316 cr
|= FIELD_PREP(CR_CPHA_MASK
, (spi
->mode
& SPI_CPHA
) ? 1 : 0);
317 cr
|= FIELD_PREP(CR_CPOL_MASK
, (spi
->mode
& SPI_CPOL
) ? 1 : 0);
318 cr
|= FIELD_PREP(CR_LOOP_MASK
, (spi
->mode
& SPI_LOOP
) ? 1 : 0);
323 static void hisi_spi_hw_init(struct hisi_spi
*hs
)
325 hisi_spi_disable(hs
);
327 /* FIFO default config */
328 writel(FIELD_PREP(FIFOC_TX_MASK
, HISI_SPI_TX_64_OR_LESS
) |
329 FIELD_PREP(FIFOC_RX_MASK
, HISI_SPI_RX_16
),
330 hs
->regs
+ HISI_SPI_FIFOC
);
335 static irqreturn_t
hisi_spi_irq(int irq
, void *dev_id
)
337 struct spi_controller
*host
= dev_id
;
338 struct hisi_spi
*hs
= spi_controller_get_devdata(host
);
339 u32 irq_status
= readl(hs
->regs
+ HISI_SPI_ISR
) & ISR_MASK
;
348 if (irq_status
& ISR_RXOF
) {
349 dev_err(hs
->dev
, "interrupt_transfer: fifo overflow\n");
350 host
->cur_msg
->status
= -EIO
;
351 goto finalize_transfer
;
355 * Read data from the Rx FIFO every time. If there is
356 * nothing left to receive, finalize the transfer.
360 goto finalize_transfer
;
362 /* Send data out when Tx FIFO IRQ triggered */
363 if (irq_status
& ISR_TX
)
369 hisi_spi_disable(hs
);
370 spi_finalize_current_transfer(host
);
374 static int hisi_spi_transfer_one(struct spi_controller
*host
,
375 struct spi_device
*spi
, struct spi_transfer
*transfer
)
377 struct hisi_spi
*hs
= spi_controller_get_devdata(host
);
378 struct hisi_chip_data
*chip
= spi_get_ctldata(spi
);
381 /* Update per transfer options for speed and bpw */
382 transfer
->effective_speed_hz
=
383 hisi_calc_effective_speed(host
, chip
, transfer
->speed_hz
);
384 cr
|= FIELD_PREP(CR_DIV_PRE_MASK
, chip
->div_pre
);
385 cr
|= FIELD_PREP(CR_DIV_POST_MASK
, chip
->div_post
);
386 cr
|= FIELD_PREP(CR_BPW_MASK
, transfer
->bits_per_word
- 1);
387 writel(cr
, hs
->regs
+ HISI_SPI_CR
);
389 hisi_spi_flush_fifo(hs
);
391 hs
->n_bytes
= hisi_spi_n_bytes(transfer
);
392 hs
->tx
= transfer
->tx_buf
;
393 hs
->tx_len
= transfer
->len
/ hs
->n_bytes
;
394 hs
->rx
= transfer
->rx_buf
;
395 hs
->rx_len
= hs
->tx_len
;
398 * Ensure that the transfer data above has been updated
399 * before the interrupt to start.
403 /* Enable all interrupts and the controller */
404 writel(~(u32
)IMR_MASK
, hs
->regs
+ HISI_SPI_IMR
);
405 writel(1, hs
->regs
+ HISI_SPI_ENR
);
410 static void hisi_spi_handle_err(struct spi_controller
*host
,
411 struct spi_message
*msg
)
413 struct hisi_spi
*hs
= spi_controller_get_devdata(host
);
415 hisi_spi_disable(hs
);
418 * Wait for interrupt handler that is
419 * already in timeout to complete.
421 msleep(HISI_SPI_WAIT_TIMEOUT_MS
);
424 static int hisi_spi_setup(struct spi_device
*spi
)
426 struct hisi_chip_data
*chip
;
428 /* Only alloc on first setup */
429 chip
= spi_get_ctldata(spi
);
431 chip
= kzalloc(sizeof(*chip
), GFP_KERNEL
);
434 spi_set_ctldata(spi
, chip
);
437 chip
->cr
= hisi_spi_prepare_cr(spi
);
442 static void hisi_spi_cleanup(struct spi_device
*spi
)
444 struct hisi_chip_data
*chip
= spi_get_ctldata(spi
);
447 spi_set_ctldata(spi
, NULL
);
450 static int hisi_spi_probe(struct platform_device
*pdev
)
452 struct device
*dev
= &pdev
->dev
;
453 struct spi_controller
*host
;
457 irq
= platform_get_irq(pdev
, 0);
461 host
= devm_spi_alloc_host(dev
, sizeof(*hs
));
465 platform_set_drvdata(pdev
, host
);
467 hs
= spi_controller_get_devdata(host
);
471 hs
->regs
= devm_platform_ioremap_resource(pdev
, 0);
472 if (IS_ERR(hs
->regs
))
473 return PTR_ERR(hs
->regs
);
475 /* Specify maximum SPI clocking speed (host only) by firmware */
476 ret
= device_property_read_u32(dev
, "spi-max-frequency",
477 &host
->max_speed_hz
);
479 dev_err(dev
, "failed to get max SPI clocking speed, ret=%d\n",
484 if (host
->max_speed_hz
== 0)
485 return dev_err_probe(dev
, -EINVAL
, "spi-max-frequency can't be 0\n");
487 ret
= device_property_read_u16(dev
, "num-cs",
488 &host
->num_chipselect
);
490 host
->num_chipselect
= DEFAULT_NUM_CS
;
492 host
->use_gpio_descriptors
= true;
493 host
->mode_bits
= SPI_CPOL
| SPI_CPHA
| SPI_CS_HIGH
| SPI_LOOP
;
494 host
->bits_per_word_mask
= SPI_BPW_RANGE_MASK(4, 32);
495 host
->bus_num
= pdev
->id
;
496 host
->setup
= hisi_spi_setup
;
497 host
->cleanup
= hisi_spi_cleanup
;
498 host
->transfer_one
= hisi_spi_transfer_one
;
499 host
->handle_err
= hisi_spi_handle_err
;
500 host
->dev
.fwnode
= dev
->fwnode
;
501 host
->min_speed_hz
= DIV_ROUND_UP(host
->max_speed_hz
, CLK_DIV_MAX
);
503 hisi_spi_hw_init(hs
);
505 ret
= devm_request_irq(dev
, hs
->irq
, hisi_spi_irq
, 0, dev_name(dev
),
508 dev_err(dev
, "failed to get IRQ=%d, ret=%d\n", hs
->irq
, ret
);
512 ret
= spi_register_controller(host
);
514 dev_err(dev
, "failed to register spi host, ret=%d\n", ret
);
518 if (hisi_spi_debugfs_init(hs
))
519 dev_info(dev
, "failed to create debugfs dir\n");
521 dev_info(dev
, "hw version:0x%x max-freq:%u kHz\n",
522 readl(hs
->regs
+ HISI_SPI_VERSION
),
523 host
->max_speed_hz
/ 1000);
528 static void hisi_spi_remove(struct platform_device
*pdev
)
530 struct spi_controller
*host
= platform_get_drvdata(pdev
);
531 struct hisi_spi
*hs
= spi_controller_get_devdata(host
);
533 debugfs_remove_recursive(hs
->debugfs
);
534 spi_unregister_controller(host
);
537 static const struct acpi_device_id hisi_spi_acpi_match
[] = {
541 MODULE_DEVICE_TABLE(acpi
, hisi_spi_acpi_match
);
543 static struct platform_driver hisi_spi_driver
= {
544 .probe
= hisi_spi_probe
,
545 .remove
= hisi_spi_remove
,
547 .name
= "hisi-kunpeng-spi",
548 .acpi_match_table
= hisi_spi_acpi_match
,
551 module_platform_driver(hisi_spi_driver
);
553 MODULE_AUTHOR("Jay Fang <f.fangjian@huawei.com>");
554 MODULE_DESCRIPTION("HiSilicon SPI Controller Driver for Kunpeng SoCs");
555 MODULE_LICENSE("GPL v2");