spi-hisi-kunpeng.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. //
  3. // HiSilicon SPI Controller Driver for Kunpeng SoCs
  4. //
  5. // Copyright (c) 2021 HiSilicon Technologies Co., Ltd.
  6. // Author: Jay Fang <[email protected]>
  7. //
  8. // This code is based on spi-dw-core.c.
  9. #include <linux/acpi.h>
  10. #include <linux/bitfield.h>
  11. #include <linux/debugfs.h>
  12. #include <linux/delay.h>
  13. #include <linux/err.h>
  14. #include <linux/interrupt.h>
  15. #include <linux/module.h>
  16. #include <linux/property.h>
  17. #include <linux/platform_device.h>
  18. #include <linux/slab.h>
  19. #include <linux/spi/spi.h>
  20. /* Register offsets */
  21. #define HISI_SPI_CSCR 0x00 /* cs control register */
  22. #define HISI_SPI_CR 0x04 /* spi common control register */
  23. #define HISI_SPI_ENR 0x08 /* spi enable register */
  24. #define HISI_SPI_FIFOC 0x0c /* fifo level control register */
  25. #define HISI_SPI_IMR 0x10 /* interrupt mask register */
  26. #define HISI_SPI_DIN 0x14 /* data in register */
  27. #define HISI_SPI_DOUT 0x18 /* data out register */
  28. #define HISI_SPI_SR 0x1c /* status register */
  29. #define HISI_SPI_RISR 0x20 /* raw interrupt status register */
  30. #define HISI_SPI_ISR 0x24 /* interrupt status register */
  31. #define HISI_SPI_ICR 0x28 /* interrupt clear register */
  32. #define HISI_SPI_VERSION 0xe0 /* version register */
  33. /* Bit fields in HISI_SPI_CR */
  34. #define CR_LOOP_MASK GENMASK(1, 1)
  35. #define CR_CPOL_MASK GENMASK(2, 2)
  36. #define CR_CPHA_MASK GENMASK(3, 3)
  37. #define CR_DIV_PRE_MASK GENMASK(11, 4)
  38. #define CR_DIV_POST_MASK GENMASK(19, 12)
  39. #define CR_BPW_MASK GENMASK(24, 20)
  40. #define CR_SPD_MODE_MASK GENMASK(25, 25)
  41. /* Bit fields in HISI_SPI_FIFOC */
  42. #define FIFOC_TX_MASK GENMASK(5, 3)
  43. #define FIFOC_RX_MASK GENMASK(11, 9)
  44. /* Bit fields in HISI_SPI_IMR, 4 bits */
  45. #define IMR_RXOF BIT(0) /* Receive Overflow */
  46. #define IMR_RXTO BIT(1) /* Receive Timeout */
  47. #define IMR_RX BIT(2) /* Receive */
  48. #define IMR_TX BIT(3) /* Transmit */
  49. #define IMR_MASK (IMR_RXOF | IMR_RXTO | IMR_RX | IMR_TX)
  50. /* Bit fields in HISI_SPI_SR, 5 bits */
  51. #define SR_TXE BIT(0) /* Transmit FIFO empty */
  52. #define SR_TXNF BIT(1) /* Transmit FIFO not full */
  53. #define SR_RXNE BIT(2) /* Receive FIFO not empty */
  54. #define SR_RXF BIT(3) /* Receive FIFO full */
  55. #define SR_BUSY BIT(4) /* Busy Flag */
  56. /* Bit fields in HISI_SPI_ISR, 4 bits */
  57. #define ISR_RXOF BIT(0) /* Receive Overflow */
  58. #define ISR_RXTO BIT(1) /* Receive Timeout */
  59. #define ISR_RX BIT(2) /* Receive */
  60. #define ISR_TX BIT(3) /* Transmit */
  61. #define ISR_MASK (ISR_RXOF | ISR_RXTO | ISR_RX | ISR_TX)
  62. /* Bit fields in HISI_SPI_ICR, 2 bits */
  63. #define ICR_RXOF BIT(0) /* Receive Overflow */
  64. #define ICR_RXTO BIT(1) /* Receive Timeout */
  65. #define ICR_MASK (ICR_RXOF | ICR_RXTO)
  66. #define DIV_POST_MAX 0xFF
  67. #define DIV_POST_MIN 0x00
  68. #define DIV_PRE_MAX 0xFE
  69. #define DIV_PRE_MIN 0x02
  70. #define CLK_DIV_MAX ((1 + DIV_POST_MAX) * DIV_PRE_MAX)
  71. #define CLK_DIV_MIN ((1 + DIV_POST_MIN) * DIV_PRE_MIN)
  72. #define DEFAULT_NUM_CS 1
  73. #define HISI_SPI_WAIT_TIMEOUT_MS 10UL
  74. enum hisi_spi_rx_level_trig {
  75. HISI_SPI_RX_1,
  76. HISI_SPI_RX_4,
  77. HISI_SPI_RX_8,
  78. HISI_SPI_RX_16,
  79. HISI_SPI_RX_32,
  80. HISI_SPI_RX_64,
  81. HISI_SPI_RX_128
  82. };
  83. enum hisi_spi_tx_level_trig {
  84. HISI_SPI_TX_1_OR_LESS,
  85. HISI_SPI_TX_4_OR_LESS,
  86. HISI_SPI_TX_8_OR_LESS,
  87. HISI_SPI_TX_16_OR_LESS,
  88. HISI_SPI_TX_32_OR_LESS,
  89. HISI_SPI_TX_64_OR_LESS,
  90. HISI_SPI_TX_128_OR_LESS
  91. };
  92. enum hisi_spi_frame_n_bytes {
  93. HISI_SPI_N_BYTES_NULL,
  94. HISI_SPI_N_BYTES_U8,
  95. HISI_SPI_N_BYTES_U16,
  96. HISI_SPI_N_BYTES_U32 = 4
  97. };
  98. /* Slave spi_dev related */
  99. struct hisi_chip_data {
  100. u32 cr;
  101. u32 speed_hz; /* baud rate */
  102. u16 clk_div; /* baud rate divider */
  103. /* clk_div = (1 + div_post) * div_pre */
  104. u8 div_post; /* value from 0 to 255 */
  105. u8 div_pre; /* value from 2 to 254 (even only!) */
  106. };
  107. struct hisi_spi {
  108. struct device *dev;
  109. void __iomem *regs;
  110. int irq;
  111. u32 fifo_len; /* depth of the FIFO buffer */
  112. /* Current message transfer state info */
  113. const void *tx;
  114. unsigned int tx_len;
  115. void *rx;
  116. unsigned int rx_len;
  117. u8 n_bytes; /* current is a 1/2/4 bytes op */
  118. struct dentry *debugfs;
  119. struct debugfs_regset32 regset;
  120. };
  121. #define HISI_SPI_DBGFS_REG(_name, _off) \
  122. { \
  123. .name = _name, \
  124. .offset = _off, \
  125. }
  126. static const struct debugfs_reg32 hisi_spi_regs[] = {
  127. HISI_SPI_DBGFS_REG("CSCR", HISI_SPI_CSCR),
  128. HISI_SPI_DBGFS_REG("CR", HISI_SPI_CR),
  129. HISI_SPI_DBGFS_REG("ENR", HISI_SPI_ENR),
  130. HISI_SPI_DBGFS_REG("FIFOC", HISI_SPI_FIFOC),
  131. HISI_SPI_DBGFS_REG("IMR", HISI_SPI_IMR),
  132. HISI_SPI_DBGFS_REG("DIN", HISI_SPI_DIN),
  133. HISI_SPI_DBGFS_REG("DOUT", HISI_SPI_DOUT),
  134. HISI_SPI_DBGFS_REG("SR", HISI_SPI_SR),
  135. HISI_SPI_DBGFS_REG("RISR", HISI_SPI_RISR),
  136. HISI_SPI_DBGFS_REG("ISR", HISI_SPI_ISR),
  137. HISI_SPI_DBGFS_REG("ICR", HISI_SPI_ICR),
  138. HISI_SPI_DBGFS_REG("VERSION", HISI_SPI_VERSION),
  139. };
  140. static int hisi_spi_debugfs_init(struct hisi_spi *hs)
  141. {
  142. char name[32];
  143. struct spi_controller *master;
  144. master = container_of(hs->dev, struct spi_controller, dev);
  145. snprintf(name, 32, "hisi_spi%d", master->bus_num);
  146. hs->debugfs = debugfs_create_dir(name, NULL);
  147. if (!hs->debugfs)
  148. return -ENOMEM;
  149. hs->regset.regs = hisi_spi_regs;
  150. hs->regset.nregs = ARRAY_SIZE(hisi_spi_regs);
  151. hs->regset.base = hs->regs;
  152. debugfs_create_regset32("registers", 0400, hs->debugfs, &hs->regset);
  153. return 0;
  154. }
  155. static u32 hisi_spi_busy(struct hisi_spi *hs)
  156. {
  157. return readl(hs->regs + HISI_SPI_SR) & SR_BUSY;
  158. }
  159. static u32 hisi_spi_rx_not_empty(struct hisi_spi *hs)
  160. {
  161. return readl(hs->regs + HISI_SPI_SR) & SR_RXNE;
  162. }
  163. static u32 hisi_spi_tx_not_full(struct hisi_spi *hs)
  164. {
  165. return readl(hs->regs + HISI_SPI_SR) & SR_TXNF;
  166. }
  167. static void hisi_spi_flush_fifo(struct hisi_spi *hs)
  168. {
  169. unsigned long limit = loops_per_jiffy << 1;
  170. do {
  171. while (hisi_spi_rx_not_empty(hs))
  172. readl(hs->regs + HISI_SPI_DOUT);
  173. } while (hisi_spi_busy(hs) && limit--);
  174. }
  175. /* Disable the controller and all interrupts */
  176. static void hisi_spi_disable(struct hisi_spi *hs)
  177. {
  178. writel(0, hs->regs + HISI_SPI_ENR);
  179. writel(IMR_MASK, hs->regs + HISI_SPI_IMR);
  180. writel(ICR_MASK, hs->regs + HISI_SPI_ICR);
  181. }
  182. static u8 hisi_spi_n_bytes(struct spi_transfer *transfer)
  183. {
  184. if (transfer->bits_per_word <= 8)
  185. return HISI_SPI_N_BYTES_U8;
  186. else if (transfer->bits_per_word <= 16)
  187. return HISI_SPI_N_BYTES_U16;
  188. else
  189. return HISI_SPI_N_BYTES_U32;
  190. }
  191. static void hisi_spi_reader(struct hisi_spi *hs)
  192. {
  193. u32 max = min_t(u32, hs->rx_len, hs->fifo_len);
  194. u32 rxw;
  195. while (hisi_spi_rx_not_empty(hs) && max--) {
  196. rxw = readl(hs->regs + HISI_SPI_DOUT);
  197. /* Check the transfer's original "rx" is not null */
  198. if (hs->rx) {
  199. switch (hs->n_bytes) {
  200. case HISI_SPI_N_BYTES_U8:
  201. *(u8 *)(hs->rx) = rxw;
  202. break;
  203. case HISI_SPI_N_BYTES_U16:
  204. *(u16 *)(hs->rx) = rxw;
  205. break;
  206. case HISI_SPI_N_BYTES_U32:
  207. *(u32 *)(hs->rx) = rxw;
  208. break;
  209. }
  210. hs->rx += hs->n_bytes;
  211. }
  212. --hs->rx_len;
  213. }
  214. }
  215. static void hisi_spi_writer(struct hisi_spi *hs)
  216. {
  217. u32 max = min_t(u32, hs->tx_len, hs->fifo_len);
  218. u32 txw = 0;
  219. while (hisi_spi_tx_not_full(hs) && max--) {
  220. /* Check the transfer's original "tx" is not null */
  221. if (hs->tx) {
  222. switch (hs->n_bytes) {
  223. case HISI_SPI_N_BYTES_U8:
  224. txw = *(u8 *)(hs->tx);
  225. break;
  226. case HISI_SPI_N_BYTES_U16:
  227. txw = *(u16 *)(hs->tx);
  228. break;
  229. case HISI_SPI_N_BYTES_U32:
  230. txw = *(u32 *)(hs->tx);
  231. break;
  232. }
  233. hs->tx += hs->n_bytes;
  234. }
  235. writel(txw, hs->regs + HISI_SPI_DIN);
  236. --hs->tx_len;
  237. }
  238. }
  239. static void __hisi_calc_div_reg(struct hisi_chip_data *chip)
  240. {
  241. chip->div_pre = DIV_PRE_MAX;
  242. while (chip->div_pre >= DIV_PRE_MIN) {
  243. if (chip->clk_div % chip->div_pre == 0)
  244. break;
  245. chip->div_pre -= 2;
  246. }
  247. if (chip->div_pre > chip->clk_div)
  248. chip->div_pre = chip->clk_div;
  249. chip->div_post = (chip->clk_div / chip->div_pre) - 1;
  250. }
  251. static u32 hisi_calc_effective_speed(struct spi_controller *master,
  252. struct hisi_chip_data *chip, u32 speed_hz)
  253. {
  254. u32 effective_speed;
  255. /* Note clock divider doesn't support odd numbers */
  256. chip->clk_div = DIV_ROUND_UP(master->max_speed_hz, speed_hz) + 1;
  257. chip->clk_div &= 0xfffe;
  258. if (chip->clk_div > CLK_DIV_MAX)
  259. chip->clk_div = CLK_DIV_MAX;
  260. effective_speed = master->max_speed_hz / chip->clk_div;
  261. if (chip->speed_hz != effective_speed) {
  262. __hisi_calc_div_reg(chip);
  263. chip->speed_hz = effective_speed;
  264. }
  265. return effective_speed;
  266. }
  267. static u32 hisi_spi_prepare_cr(struct spi_device *spi)
  268. {
  269. u32 cr = FIELD_PREP(CR_SPD_MODE_MASK, 1);
  270. cr |= FIELD_PREP(CR_CPHA_MASK, (spi->mode & SPI_CPHA) ? 1 : 0);
  271. cr |= FIELD_PREP(CR_CPOL_MASK, (spi->mode & SPI_CPOL) ? 1 : 0);
  272. cr |= FIELD_PREP(CR_LOOP_MASK, (spi->mode & SPI_LOOP) ? 1 : 0);
  273. return cr;
  274. }
  275. static void hisi_spi_hw_init(struct hisi_spi *hs)
  276. {
  277. hisi_spi_disable(hs);
  278. /* FIFO default config */
  279. writel(FIELD_PREP(FIFOC_TX_MASK, HISI_SPI_TX_64_OR_LESS) |
  280. FIELD_PREP(FIFOC_RX_MASK, HISI_SPI_RX_16),
  281. hs->regs + HISI_SPI_FIFOC);
  282. hs->fifo_len = 256;
  283. }
  284. static irqreturn_t hisi_spi_irq(int irq, void *dev_id)
  285. {
  286. struct spi_controller *master = dev_id;
  287. struct hisi_spi *hs = spi_controller_get_devdata(master);
  288. u32 irq_status = readl(hs->regs + HISI_SPI_ISR) & ISR_MASK;
  289. if (!irq_status)
  290. return IRQ_NONE;
  291. if (!master->cur_msg)
  292. return IRQ_HANDLED;
  293. /* Error handling */
  294. if (irq_status & ISR_RXOF) {
  295. dev_err(hs->dev, "interrupt_transfer: fifo overflow\n");
  296. master->cur_msg->status = -EIO;
  297. goto finalize_transfer;
  298. }
  299. /*
  300. * Read data from the Rx FIFO every time. If there is
  301. * nothing left to receive, finalize the transfer.
  302. */
  303. hisi_spi_reader(hs);
  304. if (!hs->rx_len)
  305. goto finalize_transfer;
  306. /* Send data out when Tx FIFO IRQ triggered */
  307. if (irq_status & ISR_TX)
  308. hisi_spi_writer(hs);
  309. return IRQ_HANDLED;
  310. finalize_transfer:
  311. hisi_spi_disable(hs);
  312. spi_finalize_current_transfer(master);
  313. return IRQ_HANDLED;
  314. }
  315. static int hisi_spi_transfer_one(struct spi_controller *master,
  316. struct spi_device *spi, struct spi_transfer *transfer)
  317. {
  318. struct hisi_spi *hs = spi_controller_get_devdata(master);
  319. struct hisi_chip_data *chip = spi_get_ctldata(spi);
  320. u32 cr = chip->cr;
  321. /* Update per transfer options for speed and bpw */
  322. transfer->effective_speed_hz =
  323. hisi_calc_effective_speed(master, chip, transfer->speed_hz);
  324. cr |= FIELD_PREP(CR_DIV_PRE_MASK, chip->div_pre);
  325. cr |= FIELD_PREP(CR_DIV_POST_MASK, chip->div_post);
  326. cr |= FIELD_PREP(CR_BPW_MASK, transfer->bits_per_word - 1);
  327. writel(cr, hs->regs + HISI_SPI_CR);
  328. hisi_spi_flush_fifo(hs);
  329. hs->n_bytes = hisi_spi_n_bytes(transfer);
  330. hs->tx = transfer->tx_buf;
  331. hs->tx_len = transfer->len / hs->n_bytes;
  332. hs->rx = transfer->rx_buf;
  333. hs->rx_len = hs->tx_len;
  334. /*
  335. * Ensure that the transfer data above has been updated
  336. * before the interrupt to start.
  337. */
  338. smp_mb();
  339. /* Enable all interrupts and the controller */
  340. writel(~(u32)IMR_MASK, hs->regs + HISI_SPI_IMR);
  341. writel(1, hs->regs + HISI_SPI_ENR);
  342. return 1;
  343. }
  344. static void hisi_spi_handle_err(struct spi_controller *master,
  345. struct spi_message *msg)
  346. {
  347. struct hisi_spi *hs = spi_controller_get_devdata(master);
  348. hisi_spi_disable(hs);
  349. /*
  350. * Wait for interrupt handler that is
  351. * already in timeout to complete.
  352. */
  353. msleep(HISI_SPI_WAIT_TIMEOUT_MS);
  354. }
  355. static int hisi_spi_setup(struct spi_device *spi)
  356. {
  357. struct hisi_chip_data *chip;
  358. /* Only alloc on first setup */
  359. chip = spi_get_ctldata(spi);
  360. if (!chip) {
  361. chip = kzalloc(sizeof(*chip), GFP_KERNEL);
  362. if (!chip)
  363. return -ENOMEM;
  364. spi_set_ctldata(spi, chip);
  365. }
  366. chip->cr = hisi_spi_prepare_cr(spi);
  367. return 0;
  368. }
  369. static void hisi_spi_cleanup(struct spi_device *spi)
  370. {
  371. struct hisi_chip_data *chip = spi_get_ctldata(spi);
  372. kfree(chip);
  373. spi_set_ctldata(spi, NULL);
  374. }
  375. static int hisi_spi_probe(struct platform_device *pdev)
  376. {
  377. struct device *dev = &pdev->dev;
  378. struct spi_controller *master;
  379. struct hisi_spi *hs;
  380. int ret, irq;
  381. irq = platform_get_irq(pdev, 0);
  382. if (irq < 0)
  383. return irq;
  384. master = devm_spi_alloc_master(dev, sizeof(*hs));
  385. if (!master)
  386. return -ENOMEM;
  387. platform_set_drvdata(pdev, master);
  388. hs = spi_controller_get_devdata(master);
  389. hs->dev = dev;
  390. hs->irq = irq;
  391. hs->regs = devm_platform_ioremap_resource(pdev, 0);
  392. if (IS_ERR(hs->regs))
  393. return PTR_ERR(hs->regs);
  394. /* Specify maximum SPI clocking speed (master only) by firmware */
  395. ret = device_property_read_u32(dev, "spi-max-frequency",
  396. &master->max_speed_hz);
  397. if (ret) {
  398. dev_err(dev, "failed to get max SPI clocking speed, ret=%d\n",
  399. ret);
  400. return -EINVAL;
  401. }
  402. ret = device_property_read_u16(dev, "num-cs",
  403. &master->num_chipselect);
  404. if (ret)
  405. master->num_chipselect = DEFAULT_NUM_CS;
  406. master->use_gpio_descriptors = true;
  407. master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH | SPI_LOOP;
  408. master->bits_per_word_mask = SPI_BPW_RANGE_MASK(4, 32);
  409. master->bus_num = pdev->id;
  410. master->setup = hisi_spi_setup;
  411. master->cleanup = hisi_spi_cleanup;
  412. master->transfer_one = hisi_spi_transfer_one;
  413. master->handle_err = hisi_spi_handle_err;
  414. master->dev.fwnode = dev->fwnode;
  415. hisi_spi_hw_init(hs);
  416. ret = devm_request_irq(dev, hs->irq, hisi_spi_irq, 0, dev_name(dev),
  417. master);
  418. if (ret < 0) {
  419. dev_err(dev, "failed to get IRQ=%d, ret=%d\n", hs->irq, ret);
  420. return ret;
  421. }
  422. ret = spi_register_controller(master);
  423. if (ret) {
  424. dev_err(dev, "failed to register spi master, ret=%d\n", ret);
  425. return ret;
  426. }
  427. if (hisi_spi_debugfs_init(hs))
  428. dev_info(dev, "failed to create debugfs dir\n");
  429. dev_info(dev, "hw version:0x%x max-freq:%u kHz\n",
  430. readl(hs->regs + HISI_SPI_VERSION),
  431. master->max_speed_hz / 1000);
  432. return 0;
  433. }
  434. static int hisi_spi_remove(struct platform_device *pdev)
  435. {
  436. struct spi_controller *master = platform_get_drvdata(pdev);
  437. struct hisi_spi *hs = spi_controller_get_devdata(master);
  438. debugfs_remove_recursive(hs->debugfs);
  439. spi_unregister_controller(master);
  440. return 0;
  441. }
  442. static const struct acpi_device_id hisi_spi_acpi_match[] = {
  443. {"HISI03E1", 0},
  444. {}
  445. };
  446. MODULE_DEVICE_TABLE(acpi, hisi_spi_acpi_match);
  447. static struct platform_driver hisi_spi_driver = {
  448. .probe = hisi_spi_probe,
  449. .remove = hisi_spi_remove,
  450. .driver = {
  451. .name = "hisi-kunpeng-spi",
  452. .acpi_match_table = hisi_spi_acpi_match,
  453. },
  454. };
  455. module_platform_driver(hisi_spi_driver);
  456. MODULE_AUTHOR("Jay Fang <[email protected]>");
  457. MODULE_DESCRIPTION("HiSilicon SPI Controller Driver for Kunpeng SoCs");
  458. MODULE_LICENSE("GPL v2");