spi-rockchip-sfc.c 26 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004
  1. /*
  2. * Copyright (c) 2006-2022, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2022-3-08 GuEe-GUI the first version
  9. */
  10. #include "dev_spi_dm.h"
  11. #define DBG_TAG "spi.rockchip.sfc"
  12. #define DBG_LVL DBG_INFO
  13. #include <rtdbg.h>
  14. #include <mmu.h>
  15. #include <cpuport.h>
  16. /* System control */
  17. #define SFC_CTRL 0x0
  18. #define SFC_CTRL_PHASE_SEL_NEGETIVE RT_BIT(1)
  19. #define SFC_CTRL_CMD_BITS_SHIFT 8
  20. #define SFC_CTRL_ADDR_BITS_SHIFT 10
  21. #define SFC_CTRL_DATA_BITS_SHIFT 12
  22. /* Interrupt mask */
  23. #define SFC_IMR 0x4
  24. #define SFC_IMR_RX_FULL RT_BIT(0)
  25. #define SFC_IMR_RX_UFLOW RT_BIT(1)
  26. #define SFC_IMR_TX_OFLOW RT_BIT(2)
  27. #define SFC_IMR_TX_EMPTY RT_BIT(3)
  28. #define SFC_IMR_TRAN_FINISH RT_BIT(4)
  29. #define SFC_IMR_BUS_ERR RT_BIT(5)
  30. #define SFC_IMR_NSPI_ERR RT_BIT(6)
  31. #define SFC_IMR_DMA RT_BIT(7)
  32. /* Interrupt clear */
  33. #define SFC_ICLR 0x8
  34. #define SFC_ICLR_RX_FULL RT_BIT(0)
  35. #define SFC_ICLR_RX_UFLOW RT_BIT(1)
  36. #define SFC_ICLR_TX_OFLOW RT_BIT(2)
  37. #define SFC_ICLR_TX_EMPTY RT_BIT(3)
  38. #define SFC_ICLR_TRAN_FINISH RT_BIT(4)
  39. #define SFC_ICLR_BUS_ERR RT_BIT(5)
  40. #define SFC_ICLR_NSPI_ERR RT_BIT(6)
  41. #define SFC_ICLR_DMA RT_BIT(7)
  42. /* FIFO threshold level */
  43. #define SFC_FTLR 0xc
  44. #define SFC_FTLR_TX_SHIFT 0
  45. #define SFC_FTLR_TX_MASK 0x1f
  46. #define SFC_FTLR_RX_SHIFT 8
  47. #define SFC_FTLR_RX_MASK 0x1f
  48. /* Reset FSM and FIFO */
  49. #define SFC_RCVR 0x10
  50. #define SFC_RCVR_RESET RT_BIT(0)
  51. /* Enhanced mode */
  52. #define SFC_AX 0x14
  53. /* Address Bit number */
  54. #define SFC_ABIT 0x18
  55. /* Interrupt status */
  56. #define SFC_ISR 0x1c
  57. #define SFC_ISR_RX_FULL_SHIFT RT_BIT(0)
  58. #define SFC_ISR_RX_UFLOW_SHIFT RT_BIT(1)
  59. #define SFC_ISR_TX_OFLOW_SHIFT RT_BIT(2)
  60. #define SFC_ISR_TX_EMPTY_SHIFT RT_BIT(3)
  61. #define SFC_ISR_TX_FINISH_SHIFT RT_BIT(4)
  62. #define SFC_ISR_BUS_ERR_SHIFT RT_BIT(5)
  63. #define SFC_ISR_NSPI_ERR_SHIFT RT_BIT(6)
  64. #define SFC_ISR_DMA_SHIFT RT_BIT(7)
  65. /* FIFO status */
  66. #define SFC_FSR 0x20
  67. #define SFC_FSR_TX_IS_FULL RT_BIT(0)
  68. #define SFC_FSR_TX_IS_EMPTY RT_BIT(1)
  69. #define SFC_FSR_RX_IS_EMPTY RT_BIT(2)
  70. #define SFC_FSR_RX_IS_FULL RT_BIT(3)
  71. #define SFC_FSR_TXLV_MASK RT_GENMASK(12, 8)
  72. #define SFC_FSR_TXLV_SHIFT 8
  73. #define SFC_FSR_RXLV_MASK RT_GENMASK(20, 16)
  74. #define SFC_FSR_RXLV_SHIFT 16
  75. /* FSM status */
  76. #define SFC_SR 0x24
  77. #define SFC_SR_IS_IDLE 0x0
  78. #define SFC_SR_IS_BUSY 0x1
  79. /* Raw interrupt status */
  80. #define SFC_RISR 0x28
  81. #define SFC_RISR_RX_FULL RT_BIT(0)
  82. #define SFC_RISR_RX_UNDERFLOW RT_BIT(1)
  83. #define SFC_RISR_TX_OVERFLOW RT_BIT(2)
  84. #define SFC_RISR_TX_EMPTY RT_BIT(3)
  85. #define SFC_RISR_TRAN_FINISH RT_BIT(4)
  86. #define SFC_RISR_BUS_ERR RT_BIT(5)
  87. #define SFC_RISR_NSPI_ERR RT_BIT(6)
  88. #define SFC_RISR_DMA RT_BIT(7)
  89. /* Version */
  90. #define SFC_VER 0x2c
  91. #define SFC_VER_3 0x3
  92. #define SFC_VER_4 0x4
  93. #define SFC_VER_5 0x5
  94. #define SFC_VER_6 0x6
  95. /* Delay line controller resiter */
  96. #define SFC_DLL_CTRL0 0x3c
  97. #define SFC_DLL_CTRL0_SCLK_SMP_DLL RT_BIT(15)
  98. #define SFC_DLL_CTRL0_DLL_MAX_VER4 0xffU
  99. #define SFC_DLL_CTRL0_DLL_MAX_VER5 0x1ffU
  100. /* Master trigger */
  101. #define SFC_DMA_TRIGGER 0x80
  102. #define SFC_DMA_TRIGGER_START 1
  103. /* Src or Dst addr for master */
  104. #define SFC_DMA_ADDR 0x84
  105. /* Length control register extension 32GB */
  106. #define SFC_LEN_CTRL 0x88
  107. #define SFC_LEN_CTRL_TRB_SEL 1
  108. #define SFC_LEN_EXT 0x8c
  109. /* Command */
  110. #define SFC_CMD 0x100
  111. #define SFC_CMD_IDX_SHIFT 0
  112. #define SFC_CMD_DUMMY_SHIFT 8
  113. #define SFC_CMD_DIR_SHIFT 12
  114. #define SFC_CMD_DIR_RD 0
  115. #define SFC_CMD_DIR_WR 1
  116. #define SFC_CMD_ADDR_SHIFT 14
  117. #define SFC_CMD_ADDR_0BITS 0
  118. #define SFC_CMD_ADDR_24BITS 1
  119. #define SFC_CMD_ADDR_32BITS 2
  120. #define SFC_CMD_ADDR_XBITS 3
  121. #define SFC_CMD_TRAN_BYTES_SHIFT 16
  122. #define SFC_CMD_CS_SHIFT 30
  123. /* Address */
  124. #define SFC_ADDR 0x104
  125. /* Data */
  126. #define SFC_DATA 0x108
  127. /* The controller and documentation reports that it supports up to 4 CS
  128. * devices (0-3), however I have only been able to test a single CS (CS 0)
  129. * due to the configuration of my device.
  130. */
  131. #define SFC_MAX_CHIPSELECT_NUM 4
  132. /* The SFC can transfer max 16KB - 1 at one time
  133. * we set it to 15.5KB here for alignment.
  134. */
  135. #define SFC_MAX_IOSIZE_VER3 (512 * 31)
  136. #define SFC_MAX_IOSIZE_VER4 (0xffffffffU)
  137. /* DMA is only enabled for large data transmission */
  138. #define SFC_DMA_TRANS_THRETHOLD 0x40
  139. /* Maximum clock values from datasheet suggest keeping clock value under
  140. * 150MHz. No minimum or average value is suggested.
  141. */
  142. #define SFC_MAX_SPEED (150 * 1000 * 1000)
  143. #define SFC_DLL_THRESHOLD_RATE (50 * 1000 * 1000)
  144. #define SFC_DLL_TRANING_STEP 10 /* Training step */
  145. #define SFC_DLL_TRANING_VALID_WINDOW 80 /* Valid DLL winbow */
  146. #define ROCKCHIP_AUTOSUSPEND_DELAY 2000
  147. struct rockchip_sfc
  148. {
  149. struct rt_spi_bus parent;
  150. struct rt_platform_device *pdev;
  151. struct rt_clk *clk;
  152. struct rt_clk *hclk;
  153. int irq;
  154. void *regs;
  155. void *dma_buffer;
  156. rt_ubase_t dma_buffer_phy;
  157. rt_bool_t use_dma;
  158. rt_uint32_t frequency;
  159. rt_uint32_t max_speed_hz;
  160. rt_uint32_t max_iosize;
  161. rt_uint32_t dll_cells;
  162. rt_uint16_t version;
  163. struct rt_completion done;
  164. };
  165. #define raw_to_rockchip_sfc(raw) rt_container_of(raw, struct rockchip_sfc, parent)
  166. rt_inline rt_uint32_t rockchip_sfc_readl(struct rockchip_sfc *rk_sfc, int offset)
  167. {
  168. return HWREG32(rk_sfc->regs + offset);
  169. }
  170. rt_inline void rockchip_sfc_writel(struct rockchip_sfc *rk_sfc, int offset, rt_uint32_t value)
  171. {
  172. HWREG32(rk_sfc->regs + offset) = value;
  173. }
  174. static rt_err_t rockchip_sfc_poll(struct rockchip_sfc *rk_sfc, int offset,
  175. rt_uint32_t flag, rt_bool_t is_set,
  176. rt_uint32_t delay_us, rt_int32_t timeout_us)
  177. {
  178. if (!delay_us)
  179. {
  180. delay_us = 1;
  181. }
  182. for (; timeout_us > 0; timeout_us -= delay_us)
  183. {
  184. if (is_set)
  185. {
  186. if (rockchip_sfc_readl(rk_sfc, offset) & flag)
  187. {
  188. return RT_EOK;
  189. }
  190. }
  191. else
  192. {
  193. if (!(rockchip_sfc_readl(rk_sfc, offset) & flag))
  194. {
  195. return RT_EOK;
  196. }
  197. }
  198. rt_hw_us_delay(delay_us);
  199. rt_hw_cpu_relax();
  200. }
  201. return -RT_ETIMEOUT;
  202. }
  203. static rt_err_t rockchip_sfc_reset(struct rockchip_sfc *rk_sfc)
  204. {
  205. rt_err_t err;
  206. rockchip_sfc_writel(rk_sfc, SFC_RCVR, SFC_RCVR_RESET);
  207. err = rockchip_sfc_poll(rk_sfc, SFC_RCVR, SFC_RCVR_RESET, RT_FALSE,
  208. 20, 1000000L);
  209. if (err)
  210. {
  211. LOG_E("SFC reset never finished");
  212. }
  213. /* Still need to clear the masked interrupt from RISR */
  214. rockchip_sfc_writel(rk_sfc, SFC_ICLR, 0xffffffff);
  215. return err;
  216. }
  217. static rt_uint16_t rockchip_sfc_get_version(struct rockchip_sfc *rk_sfc)
  218. {
  219. return (rt_uint16_t)(rockchip_sfc_readl(rk_sfc, SFC_VER) & 0xffff);
  220. }
  221. static rt_uint32_t rockchip_sfc_get_max_iosize(struct rockchip_sfc *rk_sfc)
  222. {
  223. return SFC_MAX_IOSIZE_VER3;
  224. }
  225. static rt_uint32_t rockchip_sfc_get_max_dll_cells(struct rockchip_sfc *rk_sfc)
  226. {
  227. switch (rockchip_sfc_get_version(rk_sfc))
  228. {
  229. case SFC_VER_6:
  230. case SFC_VER_5:
  231. return SFC_DLL_CTRL0_DLL_MAX_VER5;
  232. case SFC_VER_4:
  233. return SFC_DLL_CTRL0_DLL_MAX_VER4;
  234. default:
  235. return 0;
  236. }
  237. }
  238. static void rockchip_sfc_set_delay_lines(struct rockchip_sfc *rk_sfc,
  239. rt_uint16_t cells)
  240. {
  241. rt_uint32_t val = 0;
  242. rt_uint16_t cell_max = (rt_uint16_t)rockchip_sfc_get_max_dll_cells(rk_sfc);
  243. if (cells > cell_max)
  244. {
  245. cells = cell_max;
  246. }
  247. if (cells)
  248. {
  249. val = SFC_DLL_CTRL0_SCLK_SMP_DLL | cells;
  250. }
  251. rockchip_sfc_writel(rk_sfc, SFC_DLL_CTRL0, val);
  252. }
  253. static void rockchip_sfc_irq_unmask(struct rockchip_sfc *rk_sfc, rt_uint32_t mask)
  254. {
  255. /* Enable transfer complete interrupt */
  256. rockchip_sfc_writel(rk_sfc, SFC_IMR,
  257. rockchip_sfc_readl(rk_sfc, SFC_IMR) & (~mask));
  258. }
  259. static void rockchip_sfc_irq_mask(struct rockchip_sfc *rk_sfc, rt_uint32_t mask)
  260. {
  261. /* Disable transfer finish interrupt */
  262. rockchip_sfc_writel(rk_sfc, SFC_IMR,
  263. rockchip_sfc_readl(rk_sfc, SFC_IMR) | mask);
  264. }
  265. static rt_err_t rockchip_sfc_init(struct rockchip_sfc *rk_sfc)
  266. {
  267. rockchip_sfc_writel(rk_sfc, SFC_CTRL, 0);
  268. rockchip_sfc_writel(rk_sfc, SFC_ICLR, 0xffffffff);
  269. rockchip_sfc_irq_mask(rk_sfc, 0xFFFFFFFF);
  270. if (rockchip_sfc_get_version(rk_sfc) >= SFC_VER_4)
  271. {
  272. rockchip_sfc_writel(rk_sfc, SFC_LEN_CTRL, SFC_LEN_CTRL_TRB_SEL);
  273. }
  274. return RT_EOK;
  275. }
  276. static rt_ssize_t rockchip_sfc_wait_txfifo_ready(struct rockchip_sfc *rk_sfc,
  277. rt_uint32_t timeout_us)
  278. {
  279. if (rockchip_sfc_poll(rk_sfc, SFC_FSR, SFC_FSR_TXLV_MASK, RT_TRUE, 0, timeout_us))
  280. {
  281. LOG_D("Wait tx fifo timeout");
  282. return -RT_ETIMEOUT;
  283. }
  284. return (rockchip_sfc_readl(rk_sfc, SFC_FSR) & SFC_FSR_TXLV_MASK) >> SFC_FSR_TXLV_SHIFT;
  285. }
  286. static rt_ssize_t rockchip_sfc_wait_rxfifo_ready(struct rockchip_sfc *rk_sfc,
  287. rt_uint32_t timeout_us)
  288. {
  289. if (rockchip_sfc_poll(rk_sfc, SFC_FSR, SFC_FSR_RXLV_MASK, RT_TRUE, 0, timeout_us))
  290. {
  291. LOG_D("Wait rx fifo timeout");
  292. return -RT_ETIMEOUT;
  293. }
  294. return (rockchip_sfc_readl(rk_sfc, SFC_FSR) & SFC_FSR_RXLV_MASK) >> SFC_FSR_RXLV_SHIFT;
  295. }
  296. static rt_ssize_t rockchip_sfc_write_fifo(struct rockchip_sfc *rk_sfc,
  297. const rt_uint8_t *buf, int len)
  298. {
  299. int tx_level;
  300. rt_uint8_t bytes = len & 0x3;
  301. rt_uint32_t dwords, write_words, tmp = 0;
  302. dwords = len >> 2;
  303. while (dwords)
  304. {
  305. if ((tx_level = rockchip_sfc_wait_txfifo_ready(rk_sfc, 1000)) < 0)
  306. {
  307. return tx_level;
  308. }
  309. write_words = rt_min_t(rt_uint32_t, tx_level, dwords);
  310. for (int i = 0; i < write_words; ++i)
  311. {
  312. rockchip_sfc_writel(rk_sfc, SFC_DATA, ((rt_uint32_t *)buf)[i]);
  313. }
  314. buf += write_words << 2;
  315. dwords -= write_words;
  316. }
  317. /* write the rest non word aligned bytes */
  318. if (bytes)
  319. {
  320. if ((tx_level = rockchip_sfc_wait_txfifo_ready(rk_sfc, 1000)) < 0)
  321. {
  322. return tx_level;
  323. }
  324. rt_memcpy(&tmp, buf, bytes);
  325. rockchip_sfc_writel(rk_sfc, SFC_DATA, tmp);
  326. }
  327. return len;
  328. }
  329. static rt_ssize_t rockchip_sfc_read_fifo(struct rockchip_sfc *rk_sfc,
  330. rt_uint8_t *buf, int len)
  331. {
  332. int rx_level;
  333. rt_uint8_t bytes = len & 0x3;
  334. rt_uint32_t dwords, read_words, tmp = 0;
  335. /* word aligned access only */
  336. dwords = len >> 2;
  337. while (dwords)
  338. {
  339. if ((rx_level = rockchip_sfc_wait_rxfifo_ready(rk_sfc, 1000)) < 0)
  340. {
  341. return rx_level;
  342. }
  343. read_words = rt_min_t(rt_uint32_t, rx_level, dwords);
  344. for (int i = 0; i < read_words; ++i)
  345. {
  346. ((rt_uint32_t *)buf)[i] = rockchip_sfc_readl(rk_sfc, SFC_DATA);
  347. }
  348. buf += read_words << 2;
  349. dwords -= read_words;
  350. }
  351. /* read the rest non word aligned bytes */
  352. if (bytes)
  353. {
  354. if ((rx_level = rockchip_sfc_wait_rxfifo_ready(rk_sfc, 1000)) < 0)
  355. {
  356. return rx_level;
  357. }
  358. tmp = rockchip_sfc_readl(rk_sfc, SFC_DATA);
  359. rt_memcpy(buf, &tmp, bytes);
  360. }
  361. return len;
  362. }
  363. static rt_size_t rockchip_sfc_fifo_transfer_dma(struct rockchip_sfc *rk_sfc,
  364. rt_ubase_t dma_buf, rt_size_t len)
  365. {
  366. rockchip_sfc_writel(rk_sfc, SFC_ICLR, 0xffffffff);
  367. rockchip_sfc_writel(rk_sfc, SFC_DMA_ADDR, (rt_uint32_t)dma_buf);
  368. rockchip_sfc_writel(rk_sfc, SFC_DMA_TRIGGER, SFC_DMA_TRIGGER_START);
  369. return len;
  370. }
  371. static rt_ssize_t rockchip_sfc_xfer_data_poll(struct rockchip_sfc *rk_sfc,
  372. struct rt_spi_message *xfer)
  373. {
  374. if (xfer->send_buf)
  375. {
  376. return rockchip_sfc_write_fifo(rk_sfc, xfer->send_buf, xfer->length);
  377. }
  378. else if (xfer->recv_buf)
  379. {
  380. return rockchip_sfc_read_fifo(rk_sfc, xfer->recv_buf, xfer->length);
  381. }
  382. return -RT_EINVAL;
  383. }
  384. static rt_ssize_t rockchip_sfc_xfer_data_dma(struct rockchip_sfc *rk_sfc,
  385. struct rt_spi_message *xfer)
  386. {
  387. rt_ssize_t res = -RT_EINVAL, len = xfer->length;
  388. if (xfer->send_buf)
  389. {
  390. rt_memcpy(rk_sfc->dma_buffer, xfer->send_buf, len);
  391. res = rockchip_sfc_fifo_transfer_dma(rk_sfc, rk_sfc->dma_buffer_phy, len);
  392. if (rt_completion_wait(&rk_sfc->done, rt_tick_from_millisecond(2000)))
  393. {
  394. LOG_E("DMA wait for %s transfer finish timeout", "tx");
  395. res = -RT_ETIMEOUT;
  396. goto _out_irq;
  397. }
  398. }
  399. if (xfer->recv_buf)
  400. {
  401. res = rockchip_sfc_fifo_transfer_dma(rk_sfc, rk_sfc->dma_buffer_phy, len);
  402. if (rt_completion_wait(&rk_sfc->done, rt_tick_from_millisecond(2000)))
  403. {
  404. LOG_E("DMA wait for %s transfer finish timeout", "rx");
  405. res = -RT_ETIMEOUT;
  406. }
  407. }
  408. _out_irq:
  409. rockchip_sfc_irq_mask(rk_sfc, SFC_IMR_DMA);
  410. if (res > 0 && xfer->recv_buf)
  411. {
  412. rt_memcpy(xfer->recv_buf, rk_sfc->dma_buffer, len);
  413. }
  414. return res;
  415. }
  416. static rt_err_t rockchip_sfc_xfer_done(struct rockchip_sfc *rk_sfc,
  417. rt_uint32_t timeout_us)
  418. {
  419. if (rockchip_sfc_poll(rk_sfc, SFC_SR, SFC_SR_IS_BUSY, RT_FALSE,
  420. 20, timeout_us))
  421. {
  422. LOG_E("Wait sfc idle timeout");
  423. rockchip_sfc_reset(rk_sfc);
  424. return -RT_EIO;
  425. }
  426. return RT_EOK;
  427. }
  428. static rt_err_t rockchip_sfc_xfer_setup(struct rockchip_sfc *rk_sfc,
  429. struct rt_spi_device *spi_dev, struct rt_qspi_message *qspi_xfer)
  430. {
  431. rt_uint32_t ctrl = 0, cmd = 0;
  432. rt_ssize_t len = qspi_xfer->parent.length;
  433. /* instruction */
  434. cmd = qspi_xfer->instruction.content;
  435. ctrl |= (qspi_xfer->instruction.qspi_lines >> 1) << SFC_CTRL_CMD_BITS_SHIFT;
  436. /* address */
  437. if (qspi_xfer->address.size)
  438. {
  439. if (qspi_xfer->address.size == 4)
  440. {
  441. cmd |= SFC_CMD_ADDR_32BITS << SFC_CMD_ADDR_SHIFT;
  442. }
  443. else if (qspi_xfer->address.size == 3)
  444. {
  445. cmd |= SFC_CMD_ADDR_24BITS << SFC_CMD_ADDR_SHIFT;
  446. }
  447. else
  448. {
  449. cmd |= SFC_CMD_ADDR_XBITS << SFC_CMD_ADDR_SHIFT;
  450. rockchip_sfc_writel(rk_sfc, SFC_ABIT, qspi_xfer->address.size * 8 - 1);
  451. }
  452. ctrl |= ((qspi_xfer->address.qspi_lines >> 1) << SFC_CTRL_ADDR_BITS_SHIFT);
  453. }
  454. /* data */
  455. if (rk_sfc->version >= SFC_VER_4)
  456. {
  457. /* Clear it if no data to transfer */
  458. rockchip_sfc_writel(rk_sfc, SFC_LEN_EXT, len);
  459. }
  460. else
  461. {
  462. cmd |= len << SFC_CMD_TRAN_BYTES_SHIFT;
  463. }
  464. if (len)
  465. {
  466. if (qspi_xfer->parent.send_buf)
  467. {
  468. cmd |= SFC_CMD_DIR_WR << SFC_CMD_DIR_SHIFT;
  469. }
  470. ctrl |= ((qspi_xfer->qspi_data_lines >> 1) << SFC_CTRL_DATA_BITS_SHIFT);
  471. }
  472. if (!len && qspi_xfer->address.size)
  473. {
  474. cmd |= SFC_CMD_DIR_WR << SFC_CMD_DIR_SHIFT;
  475. }
  476. /* controller */
  477. ctrl |= SFC_CTRL_PHASE_SEL_NEGETIVE;
  478. cmd |= spi_dev->chip_select[0] << SFC_CMD_CS_SHIFT;
  479. rockchip_sfc_writel(rk_sfc, SFC_CTRL, ctrl);
  480. rockchip_sfc_writel(rk_sfc, SFC_CMD, cmd);
  481. if (qspi_xfer->address.size)
  482. {
  483. rockchip_sfc_writel(rk_sfc, SFC_ADDR, qspi_xfer->address.content);
  484. }
  485. return RT_EOK;
  486. }
  487. static void rockchip_sfc_adjust_op_work(struct rt_qspi_message *qspi_xfer)
  488. {
  489. if (qspi_xfer->alternate_bytes.size && !qspi_xfer->address.size)
  490. {
  491. /*
  492. * SFC not support output DUMMY cycles right after CMD cycles, so
  493. * treat it as ADDR cycles.
  494. */
  495. qspi_xfer->address.size = qspi_xfer->alternate_bytes.size;
  496. qspi_xfer->address.qspi_lines = qspi_xfer->alternate_bytes.qspi_lines;
  497. qspi_xfer->address.content = 0xffffffff;
  498. qspi_xfer->alternate_bytes.size = 0;
  499. }
  500. }
  501. static rt_err_t rockchip_sfc_exec_op_bypass(struct rockchip_sfc *rk_sfc,
  502. struct rt_spi_device *spi_dev, struct rt_qspi_message *qspi_xfer)
  503. {
  504. rt_uint32_t res, len;
  505. len = rt_min_t(rt_uint32_t, qspi_xfer->parent.length, rk_sfc->max_iosize);
  506. rockchip_sfc_adjust_op_work(qspi_xfer);
  507. rockchip_sfc_xfer_setup(rk_sfc, spi_dev, qspi_xfer);
  508. res = rockchip_sfc_xfer_data_poll(rk_sfc, &qspi_xfer->parent);
  509. if (res != len)
  510. {
  511. LOG_E("xfer data failed ret %d", res);
  512. return -RT_EIO;
  513. }
  514. return rockchip_sfc_xfer_done(rk_sfc, 100000);
  515. }
  516. static void rockchip_sfc_delay_lines_tuning(struct rockchip_sfc *rk_sfc,
  517. struct rt_spi_device *spi_dev)
  518. {
  519. rt_uint8_t id[3], id_temp[3];
  520. rt_bool_t dll_valid = RT_FALSE;
  521. rt_uint16_t right, left = 0, step = SFC_DLL_TRANING_STEP;
  522. rt_uint16_t cell_max = (rt_uint16_t)rockchip_sfc_get_max_dll_cells(rk_sfc);
  523. struct rt_qspi_message qspi_xfer = {};
  524. struct rt_spi_message *xfer = &qspi_xfer.parent;
  525. rt_clk_set_rate(rk_sfc->clk, SFC_DLL_THRESHOLD_RATE);
  526. qspi_xfer.instruction.content = 0x9f;
  527. qspi_xfer.qspi_data_lines = 1;
  528. xfer->recv_buf = &id;
  529. xfer->length = sizeof(id);
  530. xfer->cs_take = 1;
  531. xfer->cs_release = 1;
  532. rockchip_sfc_exec_op_bypass(rk_sfc, spi_dev, &qspi_xfer);
  533. if ((0xff == id[0] && 0xff == id[1]) || (0x00 == id[0] && 0x00 == id[1]))
  534. {
  535. rt_clk_set_rate(rk_sfc->clk, rk_sfc->max_speed_hz);
  536. return;
  537. }
  538. rt_clk_set_rate(rk_sfc->clk, rk_sfc->max_speed_hz);
  539. xfer->recv_buf = &id_temp;
  540. xfer->length = sizeof(id_temp);
  541. for (right = 0; right <= cell_max; right += step)
  542. {
  543. int res;
  544. rockchip_sfc_set_delay_lines(rk_sfc, right);
  545. rockchip_sfc_exec_op_bypass(rk_sfc, spi_dev, &qspi_xfer);
  546. res = rt_memcmp(&id, &id_temp, sizeof(id));
  547. if (dll_valid && res)
  548. {
  549. right -= step;
  550. break;
  551. }
  552. if (!dll_valid && !res)
  553. {
  554. left = right;
  555. }
  556. if (!res)
  557. {
  558. dll_valid = RT_TRUE;
  559. }
  560. /* Add cell_max to loop */
  561. if (right == cell_max)
  562. {
  563. break;
  564. }
  565. if (right + step > cell_max)
  566. {
  567. right = cell_max - step;
  568. }
  569. }
  570. if (dll_valid && (right - left) >= SFC_DLL_TRANING_VALID_WINDOW)
  571. {
  572. if (left == 0 && right < cell_max)
  573. {
  574. rk_sfc->dll_cells = left + (right - left) * 2 / 5;
  575. }
  576. else
  577. {
  578. rk_sfc->dll_cells = left + (right - left) / 2;
  579. }
  580. }
  581. else
  582. {
  583. rk_sfc->dll_cells = 0;
  584. }
  585. if (rk_sfc->dll_cells)
  586. {
  587. rockchip_sfc_set_delay_lines(rk_sfc, (rt_uint16_t)rk_sfc->dll_cells);
  588. }
  589. else
  590. {
  591. LOG_E("%d %d dll training failed in %dMHz, reduce the frequency",
  592. left, right, rk_sfc->max_speed_hz);
  593. rockchip_sfc_set_delay_lines(rk_sfc, 0);
  594. rt_clk_set_rate(rk_sfc->clk, SFC_DLL_THRESHOLD_RATE);
  595. rk_sfc->max_speed_hz = rt_clk_get_rate(rk_sfc->clk);
  596. }
  597. }
  598. static rt_err_t rockchip_sfc_configure(struct rt_spi_device *device,
  599. struct rt_spi_configuration *conf)
  600. {
  601. rt_err_t err;
  602. struct rockchip_sfc *rk_sfc = raw_to_rockchip_sfc(device->bus);
  603. if (conf->max_hz != rk_sfc->frequency)
  604. {
  605. if ((err = rt_clk_set_rate(rk_sfc->clk, rk_sfc->max_speed_hz)))
  606. {
  607. return err;
  608. }
  609. rk_sfc->frequency = rk_sfc->max_speed_hz;
  610. if (rockchip_sfc_get_version(rk_sfc) >= SFC_VER_4)
  611. {
  612. if (rt_clk_get_rate(rk_sfc->clk) > SFC_DLL_THRESHOLD_RATE)
  613. {
  614. rockchip_sfc_delay_lines_tuning(rk_sfc, device);
  615. }
  616. else
  617. {
  618. rockchip_sfc_set_delay_lines(rk_sfc, 0);
  619. }
  620. }
  621. }
  622. return RT_EOK;
  623. }
  624. static rt_ssize_t rockchip_sfc_xfer(struct rt_spi_device *device,
  625. struct rt_spi_message *xfer)
  626. {
  627. rt_err_t err;
  628. rt_ssize_t res, len = xfer->length;
  629. struct rockchip_sfc *rk_sfc = raw_to_rockchip_sfc(device->bus);
  630. struct rt_qspi_message *qspi_xfer = rt_container_of(xfer, struct rt_qspi_message, parent);
  631. rockchip_sfc_adjust_op_work(qspi_xfer);
  632. rockchip_sfc_xfer_setup(rk_sfc, device, qspi_xfer);
  633. if (qspi_xfer->alternate_bytes.size > 0)
  634. {
  635. rt_uint8_t buf[4];
  636. rt_size_t size = qspi_xfer->alternate_bytes.size / 8;
  637. rt_memcpy(buf, &qspi_xfer->alternate_bytes.content, size);
  638. rockchip_sfc_write_fifo(rk_sfc, buf, size);
  639. }
  640. if (len > 0)
  641. {
  642. if (rk_sfc->use_dma && len >= SFC_DMA_TRANS_THRETHOLD && !(len & 0x3))
  643. {
  644. rockchip_sfc_irq_unmask(rk_sfc, SFC_IMR_DMA);
  645. res = rockchip_sfc_xfer_data_dma(rk_sfc, xfer);
  646. }
  647. else
  648. {
  649. res = rockchip_sfc_xfer_data_poll(rk_sfc, xfer);
  650. }
  651. if (res != len)
  652. {
  653. LOG_E("xfer data failed");
  654. return -RT_EIO;
  655. }
  656. }
  657. if ((err = rockchip_sfc_xfer_done(rk_sfc, 100000)))
  658. {
  659. res = err;
  660. }
  661. return res;
  662. }
  663. static const struct rt_spi_ops rockchip_sfc_ops =
  664. {
  665. .configure = rockchip_sfc_configure,
  666. .xfer = rockchip_sfc_xfer,
  667. };
  668. static void rockchip_sfc_isr(int irqno, void *param)
  669. {
  670. rt_uint32_t isr;
  671. struct rockchip_sfc *rk_sfc = param;
  672. isr = rockchip_sfc_readl(rk_sfc, SFC_RISR);
  673. /* Clear interrupt */
  674. rockchip_sfc_writel(rk_sfc, SFC_ICLR, isr);
  675. if (isr & SFC_RISR_DMA)
  676. {
  677. rt_completion_done(&rk_sfc->done);
  678. }
  679. }
  680. static void rockchip_sfc_free(struct rockchip_sfc *rk_sfc)
  681. {
  682. if (rk_sfc->regs)
  683. {
  684. rt_iounmap(rk_sfc->regs);
  685. }
  686. if (!rt_is_err_or_null(rk_sfc->clk))
  687. {
  688. rt_clk_put(rk_sfc->clk);
  689. }
  690. if (!rt_is_err_or_null(rk_sfc->hclk))
  691. {
  692. rt_clk_put(rk_sfc->hclk);
  693. }
  694. if (rk_sfc->dma_buffer)
  695. {
  696. rt_dma_free_coherent(&rk_sfc->pdev->parent,
  697. SFC_MAX_IOSIZE_VER3, rk_sfc->dma_buffer, rk_sfc->dma_buffer_phy);
  698. }
  699. rt_free(rk_sfc);
  700. }
  701. static rt_err_t rockchip_sfc_probe(struct rt_platform_device *pdev)
  702. {
  703. rt_err_t err;
  704. const char *bus_name;
  705. struct rt_device *dev = &pdev->parent;
  706. struct rockchip_sfc *rk_sfc = rt_calloc(1, sizeof(*rk_sfc));
  707. if (!rk_sfc)
  708. {
  709. return -RT_ENOMEM;
  710. }
  711. rk_sfc->pdev = pdev;
  712. rk_sfc->regs = rt_dm_dev_iomap(dev, 0);
  713. if (!rk_sfc->regs)
  714. {
  715. err = -RT_EIO;
  716. goto _fail;
  717. }
  718. rk_sfc->clk = rt_clk_get_by_name(dev, "clk_sfc");
  719. if (rt_is_err(rk_sfc->clk))
  720. {
  721. err = rt_ptr_err(rk_sfc->clk);
  722. goto _fail;
  723. }
  724. rk_sfc->hclk = rt_clk_get_by_name(dev, "hclk_sfc");
  725. if (rt_is_err(rk_sfc->hclk))
  726. {
  727. err = rt_ptr_err(rk_sfc->hclk);
  728. goto _fail;
  729. }
  730. rk_sfc->irq = rt_dm_dev_get_irq(dev, 0);
  731. if (rk_sfc->irq < 0)
  732. {
  733. err = rk_sfc->irq;
  734. goto _fail;
  735. }
  736. rk_sfc->use_dma = !rt_dm_dev_prop_read_bool(dev, "rockchip,sfc-no-dma");
  737. if (rk_sfc->use_dma)
  738. {
  739. rk_sfc->dma_buffer = rt_dma_alloc_coherent(dev,
  740. SFC_MAX_IOSIZE_VER3, &rk_sfc->dma_buffer_phy);
  741. if (!rk_sfc->dma_buffer)
  742. {
  743. err = -RT_ENOMEM;
  744. LOG_E("Could not alloc DMA memory witch cache");
  745. goto _fail;
  746. }
  747. }
  748. if ((err = rt_clk_prepare_enable(rk_sfc->hclk)))
  749. {
  750. goto _fail;
  751. }
  752. if ((err = rt_clk_prepare_enable(rk_sfc->clk)))
  753. {
  754. goto _fail;
  755. }
  756. #ifdef RT_USING_OFW
  757. if (rt_ofw_bootargs_select("rockchip.thunder_boot", 0))
  758. {
  759. if (rockchip_sfc_poll(rk_sfc, SFC_SR, SFC_SR_IS_BUSY, RT_FALSE, 10, 500000))
  760. {
  761. LOG_E("Wait for SFC idle timeout");
  762. }
  763. }
  764. #endif
  765. if ((err = rockchip_sfc_init(rk_sfc)))
  766. {
  767. goto _fail;
  768. }
  769. rk_sfc->max_iosize = rockchip_sfc_get_max_iosize(rk_sfc);
  770. rk_sfc->version = rockchip_sfc_get_version(rk_sfc);
  771. rk_sfc->max_speed_hz = SFC_MAX_SPEED;
  772. rk_sfc->parent.num_chipselect = SFC_MAX_CHIPSELECT_NUM;
  773. rt_completion_init(&rk_sfc->done);
  774. dev->user_data = rk_sfc;
  775. rk_sfc->parent.parent.ofw_node = dev->ofw_node;
  776. rt_dm_dev_set_name_auto(&rk_sfc->parent.parent, "qspi");
  777. bus_name = rt_dm_dev_get_name(&rk_sfc->parent.parent);
  778. rt_hw_interrupt_install(rk_sfc->irq, rockchip_sfc_isr, rk_sfc, bus_name);
  779. rt_hw_interrupt_umask(rk_sfc->irq);
  780. if ((err = rt_qspi_bus_register(&rk_sfc->parent, bus_name, &rockchip_sfc_ops)))
  781. {
  782. goto _fail;
  783. }
  784. return RT_EOK;
  785. _fail:
  786. rockchip_sfc_free(rk_sfc);
  787. return err;
  788. }
  789. static rt_err_t rockchip_sfc_remove(struct rt_platform_device *pdev)
  790. {
  791. struct rockchip_sfc *rk_sfc = pdev->parent.user_data;
  792. rt_hw_interrupt_mask(rk_sfc->irq);
  793. rt_pic_detach_irq(rk_sfc->irq, rk_sfc);
  794. rt_device_unregister(&rk_sfc->parent.parent);
  795. rockchip_sfc_free(rk_sfc);
  796. return RT_EOK;
  797. }
  798. static const struct rt_ofw_node_id rockchip_sfc_ofw_ids[] =
  799. {
  800. { .compatible = "rockchip,sfc", },
  801. { /* sentinel */ }
  802. };
  803. static struct rt_platform_driver rockchip_sfc_driver =
  804. {
  805. .name = "rockchip-sfc",
  806. .ids = rockchip_sfc_ofw_ids,
  807. .probe = rockchip_sfc_probe,
  808. .remove = rockchip_sfc_remove,
  809. };
  810. RT_PLATFORM_DRIVER_EXPORT(rockchip_sfc_driver);