cadence_qspi_apb.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810
  1. /*
  2. * Copyright (C) 2012 Altera Corporation <www.altera.com>
  3. * All rights reserved.
  4. *
  5. * Redistribution and use in source and binary forms, with or without
  6. * modification, are permitted provided that the following conditions are met:
  7. * - Redistributions of source code must retain the above copyright
  8. * notice, this list of conditions and the following disclaimer.
  9. * - Redistributions in binary form must reproduce the above copyright
  10. * notice, this list of conditions and the following disclaimer in the
  11. * documentation and/or other materials provided with the distribution.
  12. * - Neither the name of the Altera Corporation nor the
  13. * names of its contributors may be used to endorse or promote products
  14. * derived from this software without specific prior written permission.
  15. *
  16. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  17. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  18. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  19. * ARE DISCLAIMED. IN NO EVENT SHALL ALTERA CORPORATION BE LIABLE FOR ANY
  20. * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  21. * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  22. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  23. * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  24. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  25. * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  26. */
  27. #include <common.h>
  28. #include <asm/io.h>
  29. #include <asm/errno.h>
  30. #include <wait_bit.h>
  31. #include <spi.h>
  32. #include "cadence_qspi.h"
  33. #define CQSPI_REG_POLL_US (1) /* 1us */
  34. #define CQSPI_REG_RETRY (10000)
  35. #define CQSPI_POLL_IDLE_RETRY (3)
  36. #define CQSPI_FIFO_WIDTH (4)
  37. #define CQSPI_REG_SRAM_THRESHOLD_WORDS (50)
  38. /* Transfer mode */
  39. #define CQSPI_INST_TYPE_SINGLE (0)
  40. #define CQSPI_INST_TYPE_DUAL (1)
  41. #define CQSPI_INST_TYPE_QUAD (2)
  42. #define CQSPI_STIG_DATA_LEN_MAX (8)
  43. #define CQSPI_DUMMY_CLKS_PER_BYTE (8)
  44. #define CQSPI_DUMMY_BYTES_MAX (4)
  45. #define CQSPI_REG_SRAM_FILL_THRESHOLD \
  46. ((CQSPI_REG_SRAM_SIZE_WORD / 2) * CQSPI_FIFO_WIDTH)
  47. /****************************************************************************
  48. * Controller's configuration and status register (offset from QSPI_BASE)
  49. ****************************************************************************/
  50. #define CQSPI_REG_CONFIG 0x00
  51. #define CQSPI_REG_CONFIG_CLK_POL_LSB 1
  52. #define CQSPI_REG_CONFIG_CLK_PHA_LSB 2
  53. #define CQSPI_REG_CONFIG_ENABLE_MASK BIT(0)
  54. #define CQSPI_REG_CONFIG_DIRECT_MASK BIT(7)
  55. #define CQSPI_REG_CONFIG_DECODE_MASK BIT(9)
  56. #define CQSPI_REG_CONFIG_XIP_IMM_MASK BIT(18)
  57. #define CQSPI_REG_CONFIG_CHIPSELECT_LSB 10
  58. #define CQSPI_REG_CONFIG_BAUD_LSB 19
  59. #define CQSPI_REG_CONFIG_IDLE_LSB 31
  60. #define CQSPI_REG_CONFIG_CHIPSELECT_MASK 0xF
  61. #define CQSPI_REG_CONFIG_BAUD_MASK 0xF
  62. #define CQSPI_REG_RD_INSTR 0x04
  63. #define CQSPI_REG_RD_INSTR_OPCODE_LSB 0
  64. #define CQSPI_REG_RD_INSTR_TYPE_INSTR_LSB 8
  65. #define CQSPI_REG_RD_INSTR_TYPE_ADDR_LSB 12
  66. #define CQSPI_REG_RD_INSTR_TYPE_DATA_LSB 16
  67. #define CQSPI_REG_RD_INSTR_MODE_EN_LSB 20
  68. #define CQSPI_REG_RD_INSTR_DUMMY_LSB 24
  69. #define CQSPI_REG_RD_INSTR_TYPE_INSTR_MASK 0x3
  70. #define CQSPI_REG_RD_INSTR_TYPE_ADDR_MASK 0x3
  71. #define CQSPI_REG_RD_INSTR_TYPE_DATA_MASK 0x3
  72. #define CQSPI_REG_RD_INSTR_DUMMY_MASK 0x1F
  73. #define CQSPI_REG_WR_INSTR 0x08
  74. #define CQSPI_REG_WR_INSTR_OPCODE_LSB 0
  75. #define CQSPI_REG_DELAY 0x0C
  76. #define CQSPI_REG_DELAY_TSLCH_LSB 0
  77. #define CQSPI_REG_DELAY_TCHSH_LSB 8
  78. #define CQSPI_REG_DELAY_TSD2D_LSB 16
  79. #define CQSPI_REG_DELAY_TSHSL_LSB 24
  80. #define CQSPI_REG_DELAY_TSLCH_MASK 0xFF
  81. #define CQSPI_REG_DELAY_TCHSH_MASK 0xFF
  82. #define CQSPI_REG_DELAY_TSD2D_MASK 0xFF
  83. #define CQSPI_REG_DELAY_TSHSL_MASK 0xFF
  84. #define CQSPI_READLCAPTURE 0x10
  85. #define CQSPI_READLCAPTURE_BYPASS_LSB 0
  86. #define CQSPI_READLCAPTURE_DELAY_LSB 1
  87. #define CQSPI_READLCAPTURE_DELAY_MASK 0xF
  88. #define CQSPI_REG_SIZE 0x14
  89. #define CQSPI_REG_SIZE_ADDRESS_LSB 0
  90. #define CQSPI_REG_SIZE_PAGE_LSB 4
  91. #define CQSPI_REG_SIZE_BLOCK_LSB 16
  92. #define CQSPI_REG_SIZE_ADDRESS_MASK 0xF
  93. #define CQSPI_REG_SIZE_PAGE_MASK 0xFFF
  94. #define CQSPI_REG_SIZE_BLOCK_MASK 0x3F
  95. #define CQSPI_REG_SRAMPARTITION 0x18
  96. #define CQSPI_REG_INDIRECTTRIGGER 0x1C
  97. #define CQSPI_REG_REMAP 0x24
  98. #define CQSPI_REG_MODE_BIT 0x28
  99. #define CQSPI_REG_SDRAMLEVEL 0x2C
  100. #define CQSPI_REG_SDRAMLEVEL_RD_LSB 0
  101. #define CQSPI_REG_SDRAMLEVEL_WR_LSB 16
  102. #define CQSPI_REG_SDRAMLEVEL_RD_MASK 0xFFFF
  103. #define CQSPI_REG_SDRAMLEVEL_WR_MASK 0xFFFF
  104. #define CQSPI_REG_IRQSTATUS 0x40
  105. #define CQSPI_REG_IRQMASK 0x44
  106. #define CQSPI_REG_INDIRECTRD 0x60
  107. #define CQSPI_REG_INDIRECTRD_START_MASK BIT(0)
  108. #define CQSPI_REG_INDIRECTRD_CANCEL_MASK BIT(1)
  109. #define CQSPI_REG_INDIRECTRD_INPROGRESS_MASK BIT(2)
  110. #define CQSPI_REG_INDIRECTRD_DONE_MASK BIT(5)
  111. #define CQSPI_REG_INDIRECTRDWATERMARK 0x64
  112. #define CQSPI_REG_INDIRECTRDSTARTADDR 0x68
  113. #define CQSPI_REG_INDIRECTRDBYTES 0x6C
  114. #define CQSPI_REG_CMDCTRL 0x90
  115. #define CQSPI_REG_CMDCTRL_EXECUTE_MASK BIT(0)
  116. #define CQSPI_REG_CMDCTRL_INPROGRESS_MASK BIT(1)
  117. #define CQSPI_REG_CMDCTRL_DUMMY_LSB 7
  118. #define CQSPI_REG_CMDCTRL_WR_BYTES_LSB 12
  119. #define CQSPI_REG_CMDCTRL_WR_EN_LSB 15
  120. #define CQSPI_REG_CMDCTRL_ADD_BYTES_LSB 16
  121. #define CQSPI_REG_CMDCTRL_ADDR_EN_LSB 19
  122. #define CQSPI_REG_CMDCTRL_RD_BYTES_LSB 20
  123. #define CQSPI_REG_CMDCTRL_RD_EN_LSB 23
  124. #define CQSPI_REG_CMDCTRL_OPCODE_LSB 24
  125. #define CQSPI_REG_CMDCTRL_DUMMY_MASK 0x1F
  126. #define CQSPI_REG_CMDCTRL_WR_BYTES_MASK 0x7
  127. #define CQSPI_REG_CMDCTRL_ADD_BYTES_MASK 0x3
  128. #define CQSPI_REG_CMDCTRL_RD_BYTES_MASK 0x7
  129. #define CQSPI_REG_CMDCTRL_OPCODE_MASK 0xFF
  130. #define CQSPI_REG_INDIRECTWR 0x70
  131. #define CQSPI_REG_INDIRECTWR_START_MASK BIT(0)
  132. #define CQSPI_REG_INDIRECTWR_CANCEL_MASK BIT(1)
  133. #define CQSPI_REG_INDIRECTWR_INPROGRESS_MASK BIT(2)
  134. #define CQSPI_REG_INDIRECTWR_DONE_MASK BIT(5)
  135. #define CQSPI_REG_INDIRECTWRWATERMARK 0x74
  136. #define CQSPI_REG_INDIRECTWRSTARTADDR 0x78
  137. #define CQSPI_REG_INDIRECTWRBYTES 0x7C
  138. #define CQSPI_REG_CMDADDRESS 0x94
  139. #define CQSPI_REG_CMDREADDATALOWER 0xA0
  140. #define CQSPI_REG_CMDREADDATAUPPER 0xA4
  141. #define CQSPI_REG_CMDWRITEDATALOWER 0xA8
  142. #define CQSPI_REG_CMDWRITEDATAUPPER 0xAC
  143. #define CQSPI_REG_IS_IDLE(base) \
  144. ((readl(base + CQSPI_REG_CONFIG) >> \
  145. CQSPI_REG_CONFIG_IDLE_LSB) & 0x1)
  146. #define CQSPI_CAL_DELAY(tdelay_ns, tref_ns, tsclk_ns) \
  147. ((((tdelay_ns) - (tsclk_ns)) / (tref_ns)))
  148. #define CQSPI_GET_RD_SRAM_LEVEL(reg_base) \
  149. (((readl(reg_base + CQSPI_REG_SDRAMLEVEL)) >> \
  150. CQSPI_REG_SDRAMLEVEL_RD_LSB) & CQSPI_REG_SDRAMLEVEL_RD_MASK)
  151. #define CQSPI_GET_WR_SRAM_LEVEL(reg_base) \
  152. (((readl(reg_base + CQSPI_REG_SDRAMLEVEL)) >> \
  153. CQSPI_REG_SDRAMLEVEL_WR_LSB) & CQSPI_REG_SDRAMLEVEL_WR_MASK)
  154. static unsigned int cadence_qspi_apb_cmd2addr(const unsigned char *addr_buf,
  155. unsigned int addr_width)
  156. {
  157. unsigned int addr;
  158. addr = (addr_buf[0] << 16) | (addr_buf[1] << 8) | addr_buf[2];
  159. if (addr_width == 4)
  160. addr = (addr << 8) | addr_buf[3];
  161. return addr;
  162. }
  163. void cadence_qspi_apb_controller_enable(void *reg_base)
  164. {
  165. unsigned int reg;
  166. reg = readl(reg_base + CQSPI_REG_CONFIG);
  167. reg |= CQSPI_REG_CONFIG_ENABLE_MASK;
  168. writel(reg, reg_base + CQSPI_REG_CONFIG);
  169. return;
  170. }
  171. void cadence_qspi_apb_controller_disable(void *reg_base)
  172. {
  173. unsigned int reg;
  174. reg = readl(reg_base + CQSPI_REG_CONFIG);
  175. reg &= ~CQSPI_REG_CONFIG_ENABLE_MASK;
  176. writel(reg, reg_base + CQSPI_REG_CONFIG);
  177. return;
  178. }
  179. /* Return 1 if idle, otherwise return 0 (busy). */
  180. static unsigned int cadence_qspi_wait_idle(void *reg_base)
  181. {
  182. unsigned int start, count = 0;
  183. /* timeout in unit of ms */
  184. unsigned int timeout = 5000;
  185. start = get_timer(0);
  186. for ( ; get_timer(start) < timeout ; ) {
  187. if (CQSPI_REG_IS_IDLE(reg_base))
  188. count++;
  189. else
  190. count = 0;
  191. /*
  192. * Ensure the QSPI controller is in true idle state after
  193. * reading back the same idle status consecutively
  194. */
  195. if (count >= CQSPI_POLL_IDLE_RETRY)
  196. return 1;
  197. }
  198. /* Timeout, still in busy mode. */
  199. printf("QSPI: QSPI is still busy after poll for %d times.\n",
  200. CQSPI_REG_RETRY);
  201. return 0;
  202. }
  203. void cadence_qspi_apb_readdata_capture(void *reg_base,
  204. unsigned int bypass, unsigned int delay)
  205. {
  206. unsigned int reg;
  207. cadence_qspi_apb_controller_disable(reg_base);
  208. reg = readl(reg_base + CQSPI_READLCAPTURE);
  209. if (bypass)
  210. reg |= (1 << CQSPI_READLCAPTURE_BYPASS_LSB);
  211. else
  212. reg &= ~(1 << CQSPI_READLCAPTURE_BYPASS_LSB);
  213. reg &= ~(CQSPI_READLCAPTURE_DELAY_MASK
  214. << CQSPI_READLCAPTURE_DELAY_LSB);
  215. reg |= ((delay & CQSPI_READLCAPTURE_DELAY_MASK)
  216. << CQSPI_READLCAPTURE_DELAY_LSB);
  217. writel(reg, reg_base + CQSPI_READLCAPTURE);
  218. cadence_qspi_apb_controller_enable(reg_base);
  219. return;
  220. }
  221. void cadence_qspi_apb_config_baudrate_div(void *reg_base,
  222. unsigned int ref_clk_hz, unsigned int sclk_hz)
  223. {
  224. unsigned int reg;
  225. unsigned int div;
  226. cadence_qspi_apb_controller_disable(reg_base);
  227. reg = readl(reg_base + CQSPI_REG_CONFIG);
  228. reg &= ~(CQSPI_REG_CONFIG_BAUD_MASK << CQSPI_REG_CONFIG_BAUD_LSB);
  229. div = ref_clk_hz / sclk_hz;
  230. if (div > 32)
  231. div = 32;
  232. /* Check if even number. */
  233. if ((div & 1)) {
  234. div = (div / 2);
  235. } else {
  236. if (ref_clk_hz % sclk_hz)
  237. /* ensure generated SCLK doesn't exceed user
  238. specified sclk_hz */
  239. div = (div / 2);
  240. else
  241. div = (div / 2) - 1;
  242. }
  243. debug("%s: ref_clk %dHz sclk %dHz Div 0x%x\n", __func__,
  244. ref_clk_hz, sclk_hz, div);
  245. /* ensure the baud rate doesn't exceed the max value */
  246. if (div > CQSPI_REG_CONFIG_BAUD_MASK)
  247. div = CQSPI_REG_CONFIG_BAUD_MASK;
  248. reg |= (div << CQSPI_REG_CONFIG_BAUD_LSB);
  249. writel(reg, reg_base + CQSPI_REG_CONFIG);
  250. cadence_qspi_apb_controller_enable(reg_base);
  251. return;
  252. }
  253. void cadence_qspi_apb_set_clk_mode(void *reg_base,
  254. unsigned int clk_pol, unsigned int clk_pha)
  255. {
  256. unsigned int reg;
  257. cadence_qspi_apb_controller_disable(reg_base);
  258. reg = readl(reg_base + CQSPI_REG_CONFIG);
  259. reg &= ~(1 <<
  260. (CQSPI_REG_CONFIG_CLK_POL_LSB | CQSPI_REG_CONFIG_CLK_PHA_LSB));
  261. reg |= ((clk_pol & 0x1) << CQSPI_REG_CONFIG_CLK_POL_LSB);
  262. reg |= ((clk_pha & 0x1) << CQSPI_REG_CONFIG_CLK_PHA_LSB);
  263. writel(reg, reg_base + CQSPI_REG_CONFIG);
  264. cadence_qspi_apb_controller_enable(reg_base);
  265. return;
  266. }
  267. void cadence_qspi_apb_chipselect(void *reg_base,
  268. unsigned int chip_select, unsigned int decoder_enable)
  269. {
  270. unsigned int reg;
  271. cadence_qspi_apb_controller_disable(reg_base);
  272. debug("%s : chipselect %d decode %d\n", __func__, chip_select,
  273. decoder_enable);
  274. reg = readl(reg_base + CQSPI_REG_CONFIG);
  275. /* docoder */
  276. if (decoder_enable) {
  277. reg |= CQSPI_REG_CONFIG_DECODE_MASK;
  278. } else {
  279. reg &= ~CQSPI_REG_CONFIG_DECODE_MASK;
  280. /* Convert CS if without decoder.
  281. * CS0 to 4b'1110
  282. * CS1 to 4b'1101
  283. * CS2 to 4b'1011
  284. * CS3 to 4b'0111
  285. */
  286. chip_select = 0xF & ~(1 << chip_select);
  287. }
  288. reg &= ~(CQSPI_REG_CONFIG_CHIPSELECT_MASK
  289. << CQSPI_REG_CONFIG_CHIPSELECT_LSB);
  290. reg |= (chip_select & CQSPI_REG_CONFIG_CHIPSELECT_MASK)
  291. << CQSPI_REG_CONFIG_CHIPSELECT_LSB;
  292. writel(reg, reg_base + CQSPI_REG_CONFIG);
  293. cadence_qspi_apb_controller_enable(reg_base);
  294. return;
  295. }
  296. void cadence_qspi_apb_delay(void *reg_base,
  297. unsigned int ref_clk, unsigned int sclk_hz,
  298. unsigned int tshsl_ns, unsigned int tsd2d_ns,
  299. unsigned int tchsh_ns, unsigned int tslch_ns)
  300. {
  301. unsigned int ref_clk_ns;
  302. unsigned int sclk_ns;
  303. unsigned int tshsl, tchsh, tslch, tsd2d;
  304. unsigned int reg;
  305. cadence_qspi_apb_controller_disable(reg_base);
  306. /* Convert to ns. */
  307. ref_clk_ns = (1000000000) / ref_clk;
  308. /* Convert to ns. */
  309. sclk_ns = (1000000000) / sclk_hz;
  310. /* Plus 1 to round up 1 clock cycle. */
  311. tshsl = CQSPI_CAL_DELAY(tshsl_ns, ref_clk_ns, sclk_ns) + 1;
  312. tchsh = CQSPI_CAL_DELAY(tchsh_ns, ref_clk_ns, sclk_ns) + 1;
  313. tslch = CQSPI_CAL_DELAY(tslch_ns, ref_clk_ns, sclk_ns) + 1;
  314. tsd2d = CQSPI_CAL_DELAY(tsd2d_ns, ref_clk_ns, sclk_ns) + 1;
  315. reg = ((tshsl & CQSPI_REG_DELAY_TSHSL_MASK)
  316. << CQSPI_REG_DELAY_TSHSL_LSB);
  317. reg |= ((tchsh & CQSPI_REG_DELAY_TCHSH_MASK)
  318. << CQSPI_REG_DELAY_TCHSH_LSB);
  319. reg |= ((tslch & CQSPI_REG_DELAY_TSLCH_MASK)
  320. << CQSPI_REG_DELAY_TSLCH_LSB);
  321. reg |= ((tsd2d & CQSPI_REG_DELAY_TSD2D_MASK)
  322. << CQSPI_REG_DELAY_TSD2D_LSB);
  323. writel(reg, reg_base + CQSPI_REG_DELAY);
  324. cadence_qspi_apb_controller_enable(reg_base);
  325. return;
  326. }
  327. void cadence_qspi_apb_controller_init(struct cadence_spi_platdata *plat)
  328. {
  329. unsigned reg;
  330. cadence_qspi_apb_controller_disable(plat->regbase);
  331. /* Configure the device size and address bytes */
  332. reg = readl(plat->regbase + CQSPI_REG_SIZE);
  333. /* Clear the previous value */
  334. reg &= ~(CQSPI_REG_SIZE_PAGE_MASK << CQSPI_REG_SIZE_PAGE_LSB);
  335. reg &= ~(CQSPI_REG_SIZE_BLOCK_MASK << CQSPI_REG_SIZE_BLOCK_LSB);
  336. reg |= (plat->page_size << CQSPI_REG_SIZE_PAGE_LSB);
  337. reg |= (plat->block_size << CQSPI_REG_SIZE_BLOCK_LSB);
  338. writel(reg, plat->regbase + CQSPI_REG_SIZE);
  339. /* Configure the remap address register, no remap */
  340. writel(0, plat->regbase + CQSPI_REG_REMAP);
  341. /* Indirect mode configurations */
  342. writel((plat->sram_size/2), plat->regbase + CQSPI_REG_SRAMPARTITION);
  343. /* Disable all interrupts */
  344. writel(0, plat->regbase + CQSPI_REG_IRQMASK);
  345. cadence_qspi_apb_controller_enable(plat->regbase);
  346. return;
  347. }
  348. static int cadence_qspi_apb_exec_flash_cmd(void *reg_base,
  349. unsigned int reg)
  350. {
  351. unsigned int retry = CQSPI_REG_RETRY;
  352. /* Write the CMDCTRL without start execution. */
  353. writel(reg, reg_base + CQSPI_REG_CMDCTRL);
  354. /* Start execute */
  355. reg |= CQSPI_REG_CMDCTRL_EXECUTE_MASK;
  356. writel(reg, reg_base + CQSPI_REG_CMDCTRL);
  357. while (retry--) {
  358. reg = readl(reg_base + CQSPI_REG_CMDCTRL);
  359. if ((reg & CQSPI_REG_CMDCTRL_INPROGRESS_MASK) == 0)
  360. break;
  361. udelay(1);
  362. }
  363. if (!retry) {
  364. printf("QSPI: flash command execution timeout\n");
  365. return -EIO;
  366. }
  367. /* Polling QSPI idle status. */
  368. if (!cadence_qspi_wait_idle(reg_base))
  369. return -EIO;
  370. return 0;
  371. }
  372. /* For command RDID, RDSR. */
  373. int cadence_qspi_apb_command_read(void *reg_base,
  374. unsigned int cmdlen, const u8 *cmdbuf, unsigned int rxlen,
  375. u8 *rxbuf)
  376. {
  377. unsigned int reg;
  378. unsigned int read_len;
  379. int status;
  380. if (!cmdlen || rxlen > CQSPI_STIG_DATA_LEN_MAX || rxbuf == NULL) {
  381. printf("QSPI: Invalid input arguments cmdlen %d rxlen %d\n",
  382. cmdlen, rxlen);
  383. return -EINVAL;
  384. }
  385. reg = cmdbuf[0] << CQSPI_REG_CMDCTRL_OPCODE_LSB;
  386. reg |= (0x1 << CQSPI_REG_CMDCTRL_RD_EN_LSB);
  387. /* 0 means 1 byte. */
  388. reg |= (((rxlen - 1) & CQSPI_REG_CMDCTRL_RD_BYTES_MASK)
  389. << CQSPI_REG_CMDCTRL_RD_BYTES_LSB);
  390. status = cadence_qspi_apb_exec_flash_cmd(reg_base, reg);
  391. if (status != 0)
  392. return status;
  393. reg = readl(reg_base + CQSPI_REG_CMDREADDATALOWER);
  394. /* Put the read value into rx_buf */
  395. read_len = (rxlen > 4) ? 4 : rxlen;
  396. memcpy(rxbuf, &reg, read_len);
  397. rxbuf += read_len;
  398. if (rxlen > 4) {
  399. reg = readl(reg_base + CQSPI_REG_CMDREADDATAUPPER);
  400. read_len = rxlen - read_len;
  401. memcpy(rxbuf, &reg, read_len);
  402. }
  403. return 0;
  404. }
  405. /* For commands: WRSR, WREN, WRDI, CHIP_ERASE, BE, etc. */
  406. int cadence_qspi_apb_command_write(void *reg_base, unsigned int cmdlen,
  407. const u8 *cmdbuf, unsigned int txlen, const u8 *txbuf)
  408. {
  409. unsigned int reg = 0;
  410. unsigned int addr_value;
  411. unsigned int wr_data;
  412. unsigned int wr_len;
  413. if (!cmdlen || cmdlen > 5 || txlen > 8 || cmdbuf == NULL) {
  414. printf("QSPI: Invalid input arguments cmdlen %d txlen %d\n",
  415. cmdlen, txlen);
  416. return -EINVAL;
  417. }
  418. reg |= cmdbuf[0] << CQSPI_REG_CMDCTRL_OPCODE_LSB;
  419. if (cmdlen == 4 || cmdlen == 5) {
  420. /* Command with address */
  421. reg |= (0x1 << CQSPI_REG_CMDCTRL_ADDR_EN_LSB);
  422. /* Number of bytes to write. */
  423. reg |= ((cmdlen - 2) & CQSPI_REG_CMDCTRL_ADD_BYTES_MASK)
  424. << CQSPI_REG_CMDCTRL_ADD_BYTES_LSB;
  425. /* Get address */
  426. addr_value = cadence_qspi_apb_cmd2addr(&cmdbuf[1],
  427. cmdlen >= 5 ? 4 : 3);
  428. writel(addr_value, reg_base + CQSPI_REG_CMDADDRESS);
  429. }
  430. if (txlen) {
  431. /* writing data = yes */
  432. reg |= (0x1 << CQSPI_REG_CMDCTRL_WR_EN_LSB);
  433. reg |= ((txlen - 1) & CQSPI_REG_CMDCTRL_WR_BYTES_MASK)
  434. << CQSPI_REG_CMDCTRL_WR_BYTES_LSB;
  435. wr_len = txlen > 4 ? 4 : txlen;
  436. memcpy(&wr_data, txbuf, wr_len);
  437. writel(wr_data, reg_base +
  438. CQSPI_REG_CMDWRITEDATALOWER);
  439. if (txlen > 4) {
  440. txbuf += wr_len;
  441. wr_len = txlen - wr_len;
  442. memcpy(&wr_data, txbuf, wr_len);
  443. writel(wr_data, reg_base +
  444. CQSPI_REG_CMDWRITEDATAUPPER);
  445. }
  446. }
  447. /* Execute the command */
  448. return cadence_qspi_apb_exec_flash_cmd(reg_base, reg);
  449. }
  450. /* Opcode + Address (3/4 bytes) + dummy bytes (0-4 bytes) */
  451. int cadence_qspi_apb_indirect_read_setup(struct cadence_spi_platdata *plat,
  452. unsigned int cmdlen, unsigned int rx_width, const u8 *cmdbuf)
  453. {
  454. unsigned int reg;
  455. unsigned int rd_reg;
  456. unsigned int addr_value;
  457. unsigned int dummy_clk;
  458. unsigned int dummy_bytes;
  459. unsigned int addr_bytes;
  460. /*
  461. * Identify addr_byte. All NOR flash device drivers are using fast read
  462. * which always expecting 1 dummy byte, 1 cmd byte and 3/4 addr byte.
  463. * With that, the length is in value of 5 or 6. Only FRAM chip from
  464. * ramtron using normal read (which won't need dummy byte).
  465. * Unlikely NOR flash using normal read due to performance issue.
  466. */
  467. if (cmdlen >= 5)
  468. /* to cater fast read where cmd + addr + dummy */
  469. addr_bytes = cmdlen - 2;
  470. else
  471. /* for normal read (only ramtron as of now) */
  472. addr_bytes = cmdlen - 1;
  473. /* Setup the indirect trigger address */
  474. writel((u32)plat->ahbbase,
  475. plat->regbase + CQSPI_REG_INDIRECTTRIGGER);
  476. /* Configure the opcode */
  477. rd_reg = cmdbuf[0] << CQSPI_REG_RD_INSTR_OPCODE_LSB;
  478. if (rx_width & SPI_RX_QUAD)
  479. /* Instruction and address at DQ0, data at DQ0-3. */
  480. rd_reg |= CQSPI_INST_TYPE_QUAD << CQSPI_REG_RD_INSTR_TYPE_DATA_LSB;
  481. /* Get address */
  482. addr_value = cadence_qspi_apb_cmd2addr(&cmdbuf[1], addr_bytes);
  483. writel(addr_value, plat->regbase + CQSPI_REG_INDIRECTRDSTARTADDR);
  484. /* The remaining lenght is dummy bytes. */
  485. dummy_bytes = cmdlen - addr_bytes - 1;
  486. if (dummy_bytes) {
  487. if (dummy_bytes > CQSPI_DUMMY_BYTES_MAX)
  488. dummy_bytes = CQSPI_DUMMY_BYTES_MAX;
  489. rd_reg |= (1 << CQSPI_REG_RD_INSTR_MODE_EN_LSB);
  490. #if defined(CONFIG_SPL_SPI_XIP) && defined(CONFIG_SPL_BUILD)
  491. writel(0x0, plat->regbase + CQSPI_REG_MODE_BIT);
  492. #else
  493. writel(0xFF, plat->regbase + CQSPI_REG_MODE_BIT);
  494. #endif
  495. /* Convert to clock cycles. */
  496. dummy_clk = dummy_bytes * CQSPI_DUMMY_CLKS_PER_BYTE;
  497. /* Need to minus the mode byte (8 clocks). */
  498. dummy_clk -= CQSPI_DUMMY_CLKS_PER_BYTE;
  499. if (dummy_clk)
  500. rd_reg |= (dummy_clk & CQSPI_REG_RD_INSTR_DUMMY_MASK)
  501. << CQSPI_REG_RD_INSTR_DUMMY_LSB;
  502. }
  503. writel(rd_reg, plat->regbase + CQSPI_REG_RD_INSTR);
  504. /* set device size */
  505. reg = readl(plat->regbase + CQSPI_REG_SIZE);
  506. reg &= ~CQSPI_REG_SIZE_ADDRESS_MASK;
  507. reg |= (addr_bytes - 1);
  508. writel(reg, plat->regbase + CQSPI_REG_SIZE);
  509. return 0;
  510. }
  511. static u32 cadence_qspi_get_rd_sram_level(struct cadence_spi_platdata *plat)
  512. {
  513. u32 reg = readl(plat->regbase + CQSPI_REG_SDRAMLEVEL);
  514. reg >>= CQSPI_REG_SDRAMLEVEL_RD_LSB;
  515. return reg & CQSPI_REG_SDRAMLEVEL_RD_MASK;
  516. }
  517. static int cadence_qspi_wait_for_data(struct cadence_spi_platdata *plat)
  518. {
  519. unsigned int timeout = 10000;
  520. u32 reg;
  521. while (timeout--) {
  522. reg = cadence_qspi_get_rd_sram_level(plat);
  523. if (reg)
  524. return reg;
  525. udelay(1);
  526. }
  527. return -ETIMEDOUT;
  528. }
  529. int cadence_qspi_apb_indirect_read_execute(struct cadence_spi_platdata *plat,
  530. unsigned int n_rx, u8 *rxbuf)
  531. {
  532. unsigned int remaining = n_rx;
  533. unsigned int bytes_to_read = 0;
  534. int ret;
  535. writel(n_rx, plat->regbase + CQSPI_REG_INDIRECTRDBYTES);
  536. /* Start the indirect read transfer */
  537. writel(CQSPI_REG_INDIRECTRD_START_MASK,
  538. plat->regbase + CQSPI_REG_INDIRECTRD);
  539. while (remaining > 0) {
  540. ret = cadence_qspi_wait_for_data(plat);
  541. if (ret < 0) {
  542. printf("Indirect write timed out (%i)\n", ret);
  543. goto failrd;
  544. }
  545. bytes_to_read = ret;
  546. while (bytes_to_read != 0) {
  547. bytes_to_read *= CQSPI_FIFO_WIDTH;
  548. bytes_to_read = bytes_to_read > remaining ?
  549. remaining : bytes_to_read;
  550. /* Handle non-4-byte aligned access to avoid data abort. */
  551. if (((uintptr_t)rxbuf % 4) || (bytes_to_read % 4))
  552. readsb(plat->ahbbase, rxbuf, bytes_to_read);
  553. else
  554. readsl(plat->ahbbase, rxbuf, bytes_to_read >> 2);
  555. rxbuf += bytes_to_read;
  556. remaining -= bytes_to_read;
  557. bytes_to_read = cadence_qspi_get_rd_sram_level(plat);
  558. }
  559. }
  560. /* Check indirect done status */
  561. ret = wait_for_bit("QSPI", plat->regbase + CQSPI_REG_INDIRECTRD,
  562. CQSPI_REG_INDIRECTRD_DONE_MASK, 1, 10, 0);
  563. if (ret) {
  564. printf("Indirect read completion error (%i)\n", ret);
  565. goto failrd;
  566. }
  567. /* Clear indirect completion status */
  568. writel(CQSPI_REG_INDIRECTRD_DONE_MASK,
  569. plat->regbase + CQSPI_REG_INDIRECTRD);
  570. return 0;
  571. failrd:
  572. /* Cancel the indirect read */
  573. writel(CQSPI_REG_INDIRECTRD_CANCEL_MASK,
  574. plat->regbase + CQSPI_REG_INDIRECTRD);
  575. return ret;
  576. }
  577. /* Opcode + Address (3/4 bytes) */
  578. int cadence_qspi_apb_indirect_write_setup(struct cadence_spi_platdata *plat,
  579. unsigned int cmdlen, const u8 *cmdbuf)
  580. {
  581. unsigned int reg;
  582. unsigned int addr_bytes = cmdlen > 4 ? 4 : 3;
  583. if (cmdlen < 4 || cmdbuf == NULL) {
  584. printf("QSPI: iInvalid input argument, len %d cmdbuf 0x%08x\n",
  585. cmdlen, (unsigned int)cmdbuf);
  586. return -EINVAL;
  587. }
  588. /* Setup the indirect trigger address */
  589. writel((u32)plat->ahbbase,
  590. plat->regbase + CQSPI_REG_INDIRECTTRIGGER);
  591. /* Configure the opcode */
  592. reg = cmdbuf[0] << CQSPI_REG_WR_INSTR_OPCODE_LSB;
  593. writel(reg, plat->regbase + CQSPI_REG_WR_INSTR);
  594. /* Setup write address. */
  595. reg = cadence_qspi_apb_cmd2addr(&cmdbuf[1], addr_bytes);
  596. writel(reg, plat->regbase + CQSPI_REG_INDIRECTWRSTARTADDR);
  597. reg = readl(plat->regbase + CQSPI_REG_SIZE);
  598. reg &= ~CQSPI_REG_SIZE_ADDRESS_MASK;
  599. reg |= (addr_bytes - 1);
  600. writel(reg, plat->regbase + CQSPI_REG_SIZE);
  601. return 0;
  602. }
  603. int cadence_qspi_apb_indirect_write_execute(struct cadence_spi_platdata *plat,
  604. unsigned int n_tx, const u8 *txbuf)
  605. {
  606. unsigned int page_size = plat->page_size;
  607. unsigned int remaining = n_tx;
  608. unsigned int write_bytes;
  609. int ret;
  610. /* Configure the indirect read transfer bytes */
  611. writel(n_tx, plat->regbase + CQSPI_REG_INDIRECTWRBYTES);
  612. /* Start the indirect write transfer */
  613. writel(CQSPI_REG_INDIRECTWR_START_MASK,
  614. plat->regbase + CQSPI_REG_INDIRECTWR);
  615. while (remaining > 0) {
  616. write_bytes = remaining > page_size ? page_size : remaining;
  617. /* Handle non-4-byte aligned access to avoid data abort. */
  618. if (((uintptr_t)txbuf % 4) || (write_bytes % 4))
  619. writesb(plat->ahbbase, txbuf, write_bytes);
  620. else
  621. writesl(plat->ahbbase, txbuf, write_bytes >> 2);
  622. ret = wait_for_bit("QSPI", plat->regbase + CQSPI_REG_SDRAMLEVEL,
  623. CQSPI_REG_SDRAMLEVEL_WR_MASK <<
  624. CQSPI_REG_SDRAMLEVEL_WR_LSB, 0, 10, 0);
  625. if (ret) {
  626. printf("Indirect write timed out (%i)\n", ret);
  627. goto failwr;
  628. }
  629. txbuf += write_bytes;
  630. remaining -= write_bytes;
  631. }
  632. /* Check indirect done status */
  633. ret = wait_for_bit("QSPI", plat->regbase + CQSPI_REG_INDIRECTWR,
  634. CQSPI_REG_INDIRECTWR_DONE_MASK, 1, 10, 0);
  635. if (ret) {
  636. printf("Indirect write completion error (%i)\n", ret);
  637. goto failwr;
  638. }
  639. /* Clear indirect completion status */
  640. writel(CQSPI_REG_INDIRECTWR_DONE_MASK,
  641. plat->regbase + CQSPI_REG_INDIRECTWR);
  642. return 0;
  643. failwr:
  644. /* Cancel the indirect write */
  645. writel(CQSPI_REG_INDIRECTWR_CANCEL_MASK,
  646. plat->regbase + CQSPI_REG_INDIRECTWR);
  647. return ret;
  648. }
  649. void cadence_qspi_apb_enter_xip(void *reg_base, char xip_dummy)
  650. {
  651. unsigned int reg;
  652. /* enter XiP mode immediately and enable direct mode */
  653. reg = readl(reg_base + CQSPI_REG_CONFIG);
  654. reg |= CQSPI_REG_CONFIG_ENABLE_MASK;
  655. reg |= CQSPI_REG_CONFIG_DIRECT_MASK;
  656. reg |= CQSPI_REG_CONFIG_XIP_IMM_MASK;
  657. writel(reg, reg_base + CQSPI_REG_CONFIG);
  658. /* keep the XiP mode */
  659. writel(xip_dummy, reg_base + CQSPI_REG_MODE_BIT);
  660. /* Enable mode bit at devrd */
  661. reg = readl(reg_base + CQSPI_REG_RD_INSTR);
  662. reg |= (1 << CQSPI_REG_RD_INSTR_MODE_EN_LSB);
  663. writel(reg, reg_base + CQSPI_REG_RD_INSTR);
  664. }