atmel_qspi.c 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404
  1. /*
  2. * Copyright (C) 2017 Atmel Corporation
  3. *
  4. * SPDX-License-Identifier: GPL-2.0+
  5. */
  6. #include <common.h>
  7. #include <clk.h>
  8. #include <dm.h>
  9. #include <fdtdec.h>
  10. #include <errno.h>
  11. #include <spi.h>
  12. #include <asm/io.h>
  13. #include <mach/clk.h>
  14. #include "atmel_qspi.h"
  15. DECLARE_GLOBAL_DATA_PTR;
  16. static void atmel_qspi_memcpy_fromio(void *dst, unsigned long src, size_t len)
  17. {
  18. u8 *d = (u8 *)dst;
  19. while (len--) {
  20. *d++ = readb(src);
  21. src++;
  22. }
  23. }
  24. static void atmel_qspi_memcpy_toio(unsigned long dst, const void *src,
  25. size_t len)
  26. {
  27. const u8 *s = (const u8 *)src;
  28. while (len--) {
  29. writeb(*s, dst);
  30. dst++;
  31. s++;
  32. }
  33. }
  34. static int atmel_qspi_set_ifr_tfrtype(u8 flags, u32 *ifr)
  35. {
  36. u32 ifr_tfrtype;
  37. switch (flags & SPI_FCMD_TYPE) {
  38. case SPI_FCMD_READ:
  39. ifr_tfrtype = QSPI_IFR_TFRTYPE_READ_MEMORY;
  40. break;
  41. case SPI_FCMD_WRITE:
  42. ifr_tfrtype = QSPI_IFR_TFRTYPE_WRITE_MEMORY;
  43. break;
  44. case SPI_FCMD_ERASE:
  45. case SPI_FCMD_WRITE_REG:
  46. ifr_tfrtype = QSPI_IFR_TFRTYPE_WRITE;
  47. break;
  48. case SPI_FCMD_READ_REG:
  49. ifr_tfrtype = QSPI_IFR_TFRTYPE_READ;
  50. break;
  51. default:
  52. return -EINVAL;
  53. }
  54. *ifr = (*ifr & ~QSPI_IFR_TFRTYPE) | ifr_tfrtype;
  55. return 0;
  56. }
  57. static int atmel_qpsi_set_ifr_width(enum spi_flash_protocol proto, u32 *ifr)
  58. {
  59. u32 ifr_width;
  60. switch (proto) {
  61. case SPI_FPROTO_1_1_1:
  62. ifr_width = QSPI_IFR_WIDTH_SINGLE_BIT_SPI;
  63. break;
  64. case SPI_FPROTO_1_1_2:
  65. ifr_width = QSPI_IFR_WIDTH_DUAL_OUTPUT;
  66. break;
  67. case SPI_FPROTO_1_2_2:
  68. ifr_width = QSPI_IFR_WIDTH_DUAL_IO;
  69. break;
  70. case SPI_FPROTO_2_2_2:
  71. ifr_width = QSPI_IFR_WIDTH_DUAL_CMD;
  72. break;
  73. case SPI_FPROTO_1_1_4:
  74. ifr_width = QSPI_IFR_WIDTH_QUAD_OUTPUT;
  75. break;
  76. case SPI_FPROTO_1_4_4:
  77. ifr_width = QSPI_IFR_WIDTH_QUAD_IO;
  78. break;
  79. case SPI_FPROTO_4_4_4:
  80. ifr_width = QSPI_IFR_WIDTH_QUAD_CMD;
  81. break;
  82. default:
  83. return -EINVAL;
  84. }
  85. *ifr = (*ifr & ~QSPI_IFR_WIDTH) | ifr_width;
  86. return 0;
  87. }
  88. static int atmel_qspi_xfer(struct udevice *dev, unsigned int bitlen,
  89. const void *dout, void *din, unsigned long flags)
  90. {
  91. /* This controller can only be used with SPI NOR flashes. */
  92. return -EINVAL;
  93. }
  94. static int atmel_qspi_set_speed(struct udevice *bus, uint hz)
  95. {
  96. struct atmel_qspi_priv *aq = dev_get_priv(bus);
  97. u32 scr, scbr, mask, new_value;
  98. /* Compute the QSPI baudrate */
  99. scbr = DIV_ROUND_UP(aq->bus_clk_rate, hz);
  100. if (scbr > 0)
  101. scbr--;
  102. new_value = QSPI_SCR_SCBR_(scbr);
  103. mask = QSPI_SCR_SCBR;
  104. scr = qspi_readl(aq, QSPI_SCR);
  105. if ((scr & mask) == new_value)
  106. return 0;
  107. scr = (scr & ~mask) | new_value;
  108. qspi_writel(aq, QSPI_SCR, scr);
  109. return 0;
  110. }
  111. static int atmel_qspi_set_mode(struct udevice *bus, uint mode)
  112. {
  113. struct atmel_qspi_priv *aq = dev_get_priv(bus);
  114. u32 scr, mask, new_value;
  115. new_value = (QSPI_SCR_CPOL_((mode & SPI_CPOL) != 0) |
  116. QSPI_SCR_CPHA_((mode & SPI_CPHA) != 0));
  117. mask = (QSPI_SCR_CPOL | QSPI_SCR_CPHA);
  118. scr = qspi_readl(aq, QSPI_SCR);
  119. if ((scr & mask) == new_value)
  120. return 0;
  121. scr = (scr & ~mask) | new_value;
  122. qspi_writel(aq, QSPI_SCR, scr);
  123. return 0;
  124. }
  125. static bool
  126. atmel_qspi_is_flash_command_supported(struct udevice *dev,
  127. const struct spi_flash_command *cmd)
  128. {
  129. return true;
  130. }
  131. static int atmel_qspi_exec_flash_command(struct udevice *dev,
  132. const struct spi_flash_command *cmd)
  133. {
  134. struct udevice *bus = dev_get_parent(dev);
  135. struct atmel_qspi_priv *aq = dev_get_priv(bus);
  136. unsigned int iar, icr, ifr;
  137. unsigned int offset;
  138. unsigned int imr, sr;
  139. unsigned long memaddr;
  140. int err;
  141. iar = 0;
  142. icr = 0;
  143. ifr = 0;
  144. err = atmel_qspi_set_ifr_tfrtype(cmd->flags, &ifr);
  145. if (err)
  146. return err;
  147. err = atmel_qpsi_set_ifr_width(cmd->proto, &ifr);
  148. if (err)
  149. return err;
  150. /* Compute instruction parameters */
  151. icr |= QSPI_ICR_INST_(cmd->inst);
  152. ifr |= QSPI_IFR_INSTEN;
  153. /* Compute address parameters. */
  154. switch (cmd->addr_len) {
  155. case 4:
  156. ifr |= QSPI_IFR_ADDRL_32_BIT;
  157. /*break;*/ /* fall through the 24bit (3 byte) address case */
  158. case 3:
  159. iar = cmd->data_len ? 0 : cmd->addr;
  160. ifr |= QSPI_IFR_ADDREN;
  161. offset = cmd->addr;
  162. break;
  163. case 0:
  164. offset = 0;
  165. break;
  166. default:
  167. return -EINVAL;
  168. }
  169. /* Compute option parameters. */
  170. if (cmd->num_mode_cycles) {
  171. unsigned int mode_cycle_bits, mode_bits;
  172. icr |= QSPI_ICR_OPT_(cmd->mode);
  173. ifr |= QSPI_IFR_OPTEN;
  174. switch (ifr & QSPI_IFR_WIDTH) {
  175. case QSPI_IFR_WIDTH_SINGLE_BIT_SPI:
  176. case QSPI_IFR_WIDTH_DUAL_OUTPUT:
  177. case QSPI_IFR_WIDTH_QUAD_OUTPUT:
  178. mode_cycle_bits = 1;
  179. break;
  180. case QSPI_IFR_WIDTH_DUAL_IO:
  181. case QSPI_IFR_WIDTH_DUAL_CMD:
  182. mode_cycle_bits = 2;
  183. break;
  184. case QSPI_IFR_WIDTH_QUAD_IO:
  185. case QSPI_IFR_WIDTH_QUAD_CMD:
  186. mode_cycle_bits = 4;
  187. break;
  188. default:
  189. return -EINVAL;
  190. }
  191. mode_bits = cmd->num_mode_cycles * mode_cycle_bits;
  192. switch (mode_bits) {
  193. case 1:
  194. ifr |= QSPI_IFR_OPTL_1BIT;
  195. break;
  196. case 2:
  197. ifr |= QSPI_IFR_OPTL_2BIT;
  198. break;
  199. case 4:
  200. ifr |= QSPI_IFR_OPTL_4BIT;
  201. break;
  202. case 8:
  203. ifr |= QSPI_IFR_OPTL_8BIT;
  204. break;
  205. default:
  206. return -EINVAL;
  207. }
  208. }
  209. /* Set the number of dummy cycles. */
  210. if (cmd->num_wait_states)
  211. ifr |= QSPI_IFR_NBDUM_(cmd->num_wait_states);
  212. /* Set data enable. */
  213. if (cmd->data_len)
  214. ifr |= QSPI_IFR_DATAEN;
  215. /* Clear pending interrupts. */
  216. (void)qspi_readl(aq, QSPI_SR);
  217. /* Set QSPI Instruction Frame registers. */
  218. qspi_writel(aq, QSPI_IAR, iar);
  219. qspi_writel(aq, QSPI_ICR, icr);
  220. qspi_writel(aq, QSPI_IFR, ifr);
  221. /* Skip to the final steps if there is no data. */
  222. if (!cmd->data_len)
  223. goto no_data;
  224. /* Dummy read of QSPI_IFR to synchronize APB and AHB accesses. */
  225. (void)qspi_readl(aq, QSPI_IFR);
  226. /* Stop here for Continuous Read. */
  227. memaddr = (unsigned long)(aq->membase + offset);
  228. if (cmd->tx_data)
  229. /* Write data. */
  230. atmel_qspi_memcpy_toio(memaddr, cmd->tx_data, cmd->data_len);
  231. else if (cmd->rx_data)
  232. /* Read data. */
  233. atmel_qspi_memcpy_fromio(cmd->rx_data, memaddr, cmd->data_len);
  234. /* Release the chip-select. */
  235. qspi_writel(aq, QSPI_CR, QSPI_CR_LASTXFER);
  236. no_data:
  237. /* Poll INSTruction End and Chip Select Rise flags. */
  238. imr = QSPI_SR_INSTRE | QSPI_SR_CSR;
  239. sr = 0;
  240. while (sr != (QSPI_SR_INSTRE | QSPI_SR_CSR))
  241. sr |= qspi_readl(aq, QSPI_SR) & imr;
  242. return 0;
  243. }
  244. static const struct dm_spi_ops atmel_qspi_ops = {
  245. .xfer = atmel_qspi_xfer,
  246. .set_speed = atmel_qspi_set_speed,
  247. .set_mode = atmel_qspi_set_mode,
  248. .is_flash_command_supported = atmel_qspi_is_flash_command_supported,
  249. .exec_flash_command = atmel_qspi_exec_flash_command,
  250. };
  251. static int atmel_qspi_enable_clk(struct udevice *bus)
  252. {
  253. struct atmel_qspi_priv *aq = dev_get_priv(bus);
  254. struct clk clk;
  255. ulong clk_rate;
  256. int ret;
  257. ret = clk_get_by_index(bus, 0, &clk);
  258. if (ret)
  259. return -EINVAL;
  260. ret = clk_enable(&clk);
  261. if (ret)
  262. goto free_clock;
  263. clk_rate = clk_get_rate(&clk);
  264. if (!clk_rate) {
  265. ret = -EINVAL;
  266. goto free_clock;
  267. }
  268. aq->bus_clk_rate = clk_rate;
  269. free_clock:
  270. clk_free(&clk);
  271. return ret;
  272. }
  273. static int atmel_qspi_probe(struct udevice *bus)
  274. {
  275. const struct atmel_qspi_platdata *plat = dev_get_platdata(bus);
  276. struct atmel_qspi_priv *aq = dev_get_priv(bus);
  277. u32 mr;
  278. int ret;
  279. ret = atmel_qspi_enable_clk(bus);
  280. if (ret)
  281. return ret;
  282. aq->regbase = plat->regbase;
  283. aq->membase = plat->membase;
  284. /* Reset the QSPI controler */
  285. qspi_writel(aq, QSPI_CR, QSPI_CR_SWRST);
  286. /* Set the QSPI controller in Serial Memory Mode */
  287. mr = (QSPI_MR_NBBITS_8_BIT |
  288. QSPI_MR_SMM_MEMORY |
  289. QSPI_MR_CSMODE_LASTXFER);
  290. qspi_writel(aq, QSPI_MR, mr);
  291. /* Enable the QSPI controller */
  292. qspi_writel(aq, QSPI_CR, QSPI_CR_QSPIEN);
  293. return 0;
  294. }
  295. static int atmel_qspi_ofdata_to_platdata(struct udevice *bus)
  296. {
  297. struct atmel_qspi_platdata *plat = dev_get_platdata(bus);
  298. const void *blob = gd->fdt_blob;
  299. int node = dev_of_offset (bus);
  300. u32 data[4];
  301. int ret;
  302. ret = fdtdec_get_int_array(blob, node, "reg", data, ARRAY_SIZE(data));
  303. if (ret) {
  304. printf("Error: Can't get base addresses (ret=%d)!\n", ret);
  305. return -ENODEV;
  306. }
  307. plat->regbase = (void *)data[0];
  308. plat->membase = (void *)data[2];
  309. return 0;
  310. }
  311. static const struct udevice_id atmel_qspi_ids[] = {
  312. { .compatible = "atmel,sama5d2-qspi" },
  313. { }
  314. };
  315. U_BOOT_DRIVER(atmel_qspi) = {
  316. .name = "atmel_qspi",
  317. .id = UCLASS_SPI,
  318. .of_match = atmel_qspi_ids,
  319. .ops = &atmel_qspi_ops,
  320. .ofdata_to_platdata = atmel_qspi_ofdata_to_platdata,
  321. .platdata_auto_alloc_size = sizeof(struct atmel_qspi_platdata),
  322. .priv_auto_alloc_size = sizeof(struct atmel_qspi_priv),
  323. .probe = atmel_qspi_probe,
  324. };