spi-npcm-fiu.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791
  1. // SPDX-License-Identifier: GPL-2.0
  2. // Copyright (c) 2019 Nuvoton Technology corporation.
  3. #include <linux/bits.h>
  4. #include <linux/init.h>
  5. #include <linux/kernel.h>
  6. #include <linux/device.h>
  7. #include <linux/module.h>
  8. #include <linux/ioport.h>
  9. #include <linux/clk.h>
  10. #include <linux/platform_device.h>
  11. #include <linux/io.h>
  12. #include <linux/vmalloc.h>
  13. #include <linux/regmap.h>
  14. #include <linux/of_device.h>
  15. #include <linux/spi/spi-mem.h>
  16. #include <linux/mfd/syscon.h>
  17. /* NPCM7xx GCR module */
  18. #define NPCM7XX_INTCR3_OFFSET 0x9C
  19. #define NPCM7XX_INTCR3_FIU_FIX BIT(6)
  20. /* Flash Interface Unit (FIU) Registers */
  21. #define NPCM_FIU_DRD_CFG 0x00
  22. #define NPCM_FIU_DWR_CFG 0x04
  23. #define NPCM_FIU_UMA_CFG 0x08
  24. #define NPCM_FIU_UMA_CTS 0x0C
  25. #define NPCM_FIU_UMA_CMD 0x10
  26. #define NPCM_FIU_UMA_ADDR 0x14
  27. #define NPCM_FIU_PRT_CFG 0x18
  28. #define NPCM_FIU_UMA_DW0 0x20
  29. #define NPCM_FIU_UMA_DW1 0x24
  30. #define NPCM_FIU_UMA_DW2 0x28
  31. #define NPCM_FIU_UMA_DW3 0x2C
  32. #define NPCM_FIU_UMA_DR0 0x30
  33. #define NPCM_FIU_UMA_DR1 0x34
  34. #define NPCM_FIU_UMA_DR2 0x38
  35. #define NPCM_FIU_UMA_DR3 0x3C
  36. #define NPCM_FIU_CFG 0x78
  37. #define NPCM_FIU_MAX_REG_LIMIT 0x80
  38. /* FIU Direct Read Configuration Register */
  39. #define NPCM_FIU_DRD_CFG_LCK BIT(31)
  40. #define NPCM_FIU_DRD_CFG_R_BURST GENMASK(25, 24)
  41. #define NPCM_FIU_DRD_CFG_ADDSIZ GENMASK(17, 16)
  42. #define NPCM_FIU_DRD_CFG_DBW GENMASK(13, 12)
  43. #define NPCM_FIU_DRD_CFG_ACCTYPE GENMASK(9, 8)
  44. #define NPCM_FIU_DRD_CFG_RDCMD GENMASK(7, 0)
  45. #define NPCM_FIU_DRD_ADDSIZ_SHIFT 16
  46. #define NPCM_FIU_DRD_DBW_SHIFT 12
  47. #define NPCM_FIU_DRD_ACCTYPE_SHIFT 8
  48. /* FIU Direct Write Configuration Register */
  49. #define NPCM_FIU_DWR_CFG_LCK BIT(31)
  50. #define NPCM_FIU_DWR_CFG_W_BURST GENMASK(25, 24)
  51. #define NPCM_FIU_DWR_CFG_ADDSIZ GENMASK(17, 16)
  52. #define NPCM_FIU_DWR_CFG_ABPCK GENMASK(11, 10)
  53. #define NPCM_FIU_DWR_CFG_DBPCK GENMASK(9, 8)
  54. #define NPCM_FIU_DWR_CFG_WRCMD GENMASK(7, 0)
  55. #define NPCM_FIU_DWR_ADDSIZ_SHIFT 16
  56. #define NPCM_FIU_DWR_ABPCK_SHIFT 10
  57. #define NPCM_FIU_DWR_DBPCK_SHIFT 8
  58. /* FIU UMA Configuration Register */
  59. #define NPCM_FIU_UMA_CFG_LCK BIT(31)
  60. #define NPCM_FIU_UMA_CFG_CMMLCK BIT(30)
  61. #define NPCM_FIU_UMA_CFG_RDATSIZ GENMASK(28, 24)
  62. #define NPCM_FIU_UMA_CFG_DBSIZ GENMASK(23, 21)
  63. #define NPCM_FIU_UMA_CFG_WDATSIZ GENMASK(20, 16)
  64. #define NPCM_FIU_UMA_CFG_ADDSIZ GENMASK(13, 11)
  65. #define NPCM_FIU_UMA_CFG_CMDSIZ BIT(10)
  66. #define NPCM_FIU_UMA_CFG_RDBPCK GENMASK(9, 8)
  67. #define NPCM_FIU_UMA_CFG_DBPCK GENMASK(7, 6)
  68. #define NPCM_FIU_UMA_CFG_WDBPCK GENMASK(5, 4)
  69. #define NPCM_FIU_UMA_CFG_ADBPCK GENMASK(3, 2)
  70. #define NPCM_FIU_UMA_CFG_CMBPCK GENMASK(1, 0)
  71. #define NPCM_FIU_UMA_CFG_ADBPCK_SHIFT 2
  72. #define NPCM_FIU_UMA_CFG_WDBPCK_SHIFT 4
  73. #define NPCM_FIU_UMA_CFG_DBPCK_SHIFT 6
  74. #define NPCM_FIU_UMA_CFG_RDBPCK_SHIFT 8
  75. #define NPCM_FIU_UMA_CFG_ADDSIZ_SHIFT 11
  76. #define NPCM_FIU_UMA_CFG_WDATSIZ_SHIFT 16
  77. #define NPCM_FIU_UMA_CFG_DBSIZ_SHIFT 21
  78. #define NPCM_FIU_UMA_CFG_RDATSIZ_SHIFT 24
  79. /* FIU UMA Control and Status Register */
  80. #define NPCM_FIU_UMA_CTS_RDYIE BIT(25)
  81. #define NPCM_FIU_UMA_CTS_RDYST BIT(24)
  82. #define NPCM_FIU_UMA_CTS_SW_CS BIT(16)
  83. #define NPCM_FIU_UMA_CTS_DEV_NUM GENMASK(9, 8)
  84. #define NPCM_FIU_UMA_CTS_EXEC_DONE BIT(0)
  85. #define NPCM_FIU_UMA_CTS_DEV_NUM_SHIFT 8
  86. /* FIU UMA Command Register */
  87. #define NPCM_FIU_UMA_CMD_DUM3 GENMASK(31, 24)
  88. #define NPCM_FIU_UMA_CMD_DUM2 GENMASK(23, 16)
  89. #define NPCM_FIU_UMA_CMD_DUM1 GENMASK(15, 8)
  90. #define NPCM_FIU_UMA_CMD_CMD GENMASK(7, 0)
  91. /* FIU UMA Address Register */
  92. #define NPCM_FIU_UMA_ADDR_UMA_ADDR GENMASK(31, 0)
  93. #define NPCM_FIU_UMA_ADDR_AB3 GENMASK(31, 24)
  94. #define NPCM_FIU_UMA_ADDR_AB2 GENMASK(23, 16)
  95. #define NPCM_FIU_UMA_ADDR_AB1 GENMASK(15, 8)
  96. #define NPCM_FIU_UMA_ADDR_AB0 GENMASK(7, 0)
  97. /* FIU UMA Write Data Bytes 0-3 Register */
  98. #define NPCM_FIU_UMA_DW0_WB3 GENMASK(31, 24)
  99. #define NPCM_FIU_UMA_DW0_WB2 GENMASK(23, 16)
  100. #define NPCM_FIU_UMA_DW0_WB1 GENMASK(15, 8)
  101. #define NPCM_FIU_UMA_DW0_WB0 GENMASK(7, 0)
  102. /* FIU UMA Write Data Bytes 4-7 Register */
  103. #define NPCM_FIU_UMA_DW1_WB7 GENMASK(31, 24)
  104. #define NPCM_FIU_UMA_DW1_WB6 GENMASK(23, 16)
  105. #define NPCM_FIU_UMA_DW1_WB5 GENMASK(15, 8)
  106. #define NPCM_FIU_UMA_DW1_WB4 GENMASK(7, 0)
  107. /* FIU UMA Write Data Bytes 8-11 Register */
  108. #define NPCM_FIU_UMA_DW2_WB11 GENMASK(31, 24)
  109. #define NPCM_FIU_UMA_DW2_WB10 GENMASK(23, 16)
  110. #define NPCM_FIU_UMA_DW2_WB9 GENMASK(15, 8)
  111. #define NPCM_FIU_UMA_DW2_WB8 GENMASK(7, 0)
  112. /* FIU UMA Write Data Bytes 12-15 Register */
  113. #define NPCM_FIU_UMA_DW3_WB15 GENMASK(31, 24)
  114. #define NPCM_FIU_UMA_DW3_WB14 GENMASK(23, 16)
  115. #define NPCM_FIU_UMA_DW3_WB13 GENMASK(15, 8)
  116. #define NPCM_FIU_UMA_DW3_WB12 GENMASK(7, 0)
  117. /* FIU UMA Read Data Bytes 0-3 Register */
  118. #define NPCM_FIU_UMA_DR0_RB3 GENMASK(31, 24)
  119. #define NPCM_FIU_UMA_DR0_RB2 GENMASK(23, 16)
  120. #define NPCM_FIU_UMA_DR0_RB1 GENMASK(15, 8)
  121. #define NPCM_FIU_UMA_DR0_RB0 GENMASK(7, 0)
  122. /* FIU UMA Read Data Bytes 4-7 Register */
  123. #define NPCM_FIU_UMA_DR1_RB15 GENMASK(31, 24)
  124. #define NPCM_FIU_UMA_DR1_RB14 GENMASK(23, 16)
  125. #define NPCM_FIU_UMA_DR1_RB13 GENMASK(15, 8)
  126. #define NPCM_FIU_UMA_DR1_RB12 GENMASK(7, 0)
  127. /* FIU UMA Read Data Bytes 8-11 Register */
  128. #define NPCM_FIU_UMA_DR2_RB15 GENMASK(31, 24)
  129. #define NPCM_FIU_UMA_DR2_RB14 GENMASK(23, 16)
  130. #define NPCM_FIU_UMA_DR2_RB13 GENMASK(15, 8)
  131. #define NPCM_FIU_UMA_DR2_RB12 GENMASK(7, 0)
  132. /* FIU UMA Read Data Bytes 12-15 Register */
  133. #define NPCM_FIU_UMA_DR3_RB15 GENMASK(31, 24)
  134. #define NPCM_FIU_UMA_DR3_RB14 GENMASK(23, 16)
  135. #define NPCM_FIU_UMA_DR3_RB13 GENMASK(15, 8)
  136. #define NPCM_FIU_UMA_DR3_RB12 GENMASK(7, 0)
  137. /* FIU Configuration Register */
  138. #define NPCM_FIU_CFG_FIU_FIX BIT(31)
  139. /* FIU Read Mode */
  140. enum {
  141. DRD_SINGLE_WIRE_MODE = 0,
  142. DRD_DUAL_IO_MODE = 1,
  143. DRD_QUAD_IO_MODE = 2,
  144. DRD_SPI_X_MODE = 3,
  145. };
  146. enum {
  147. DWR_ABPCK_BIT_PER_CLK = 0,
  148. DWR_ABPCK_2_BIT_PER_CLK = 1,
  149. DWR_ABPCK_4_BIT_PER_CLK = 2,
  150. };
  151. enum {
  152. DWR_DBPCK_BIT_PER_CLK = 0,
  153. DWR_DBPCK_2_BIT_PER_CLK = 1,
  154. DWR_DBPCK_4_BIT_PER_CLK = 2,
  155. };
  156. #define NPCM_FIU_DRD_16_BYTE_BURST 0x3000000
  157. #define NPCM_FIU_DWR_16_BYTE_BURST 0x3000000
  158. #define MAP_SIZE_128MB 0x8000000
  159. #define MAP_SIZE_16MB 0x1000000
  160. #define MAP_SIZE_8MB 0x800000
  161. #define FIU_DRD_MAX_DUMMY_NUMBER 3
  162. #define NPCM_MAX_CHIP_NUM 4
  163. #define CHUNK_SIZE 16
  164. #define UMA_MICRO_SEC_TIMEOUT 150
  165. enum {
  166. FIU0 = 0,
  167. FIU3,
  168. FIUX,
  169. FIU1,
  170. };
  171. struct npcm_fiu_info {
  172. char *name;
  173. u32 fiu_id;
  174. u32 max_map_size;
  175. u32 max_cs;
  176. };
  177. struct fiu_data {
  178. const struct npcm_fiu_info *npcm_fiu_data_info;
  179. int fiu_max;
  180. };
  181. static const struct npcm_fiu_info npcm7xx_fiu_info[] = {
  182. {.name = "FIU0", .fiu_id = FIU0,
  183. .max_map_size = MAP_SIZE_128MB, .max_cs = 2},
  184. {.name = "FIU3", .fiu_id = FIU3,
  185. .max_map_size = MAP_SIZE_128MB, .max_cs = 4},
  186. {.name = "FIUX", .fiu_id = FIUX,
  187. .max_map_size = MAP_SIZE_16MB, .max_cs = 2} };
  188. static const struct fiu_data npcm7xx_fiu_data = {
  189. .npcm_fiu_data_info = npcm7xx_fiu_info,
  190. .fiu_max = 3,
  191. };
  192. static const struct npcm_fiu_info npxm8xx_fiu_info[] = {
  193. {.name = "FIU0", .fiu_id = FIU0,
  194. .max_map_size = MAP_SIZE_128MB, .max_cs = 2},
  195. {.name = "FIU3", .fiu_id = FIU3,
  196. .max_map_size = MAP_SIZE_128MB, .max_cs = 4},
  197. {.name = "FIUX", .fiu_id = FIUX,
  198. .max_map_size = MAP_SIZE_16MB, .max_cs = 2},
  199. {.name = "FIU1", .fiu_id = FIU1,
  200. .max_map_size = MAP_SIZE_16MB, .max_cs = 4} };
  201. static const struct fiu_data npxm8xx_fiu_data = {
  202. .npcm_fiu_data_info = npxm8xx_fiu_info,
  203. .fiu_max = 4,
  204. };
  205. struct npcm_fiu_spi;
  206. struct npcm_fiu_chip {
  207. void __iomem *flash_region_mapped_ptr;
  208. struct npcm_fiu_spi *fiu;
  209. unsigned long clkrate;
  210. u32 chipselect;
  211. };
  212. struct npcm_fiu_spi {
  213. struct npcm_fiu_chip chip[NPCM_MAX_CHIP_NUM];
  214. const struct npcm_fiu_info *info;
  215. struct spi_mem_op drd_op;
  216. struct resource *res_mem;
  217. struct regmap *regmap;
  218. unsigned long clkrate;
  219. struct device *dev;
  220. struct clk *clk;
  221. bool spix_mode;
  222. };
  223. static const struct regmap_config npcm_mtd_regmap_config = {
  224. .reg_bits = 32,
  225. .val_bits = 32,
  226. .reg_stride = 4,
  227. .max_register = NPCM_FIU_MAX_REG_LIMIT,
  228. };
  229. static void npcm_fiu_set_drd(struct npcm_fiu_spi *fiu,
  230. const struct spi_mem_op *op)
  231. {
  232. regmap_update_bits(fiu->regmap, NPCM_FIU_DRD_CFG,
  233. NPCM_FIU_DRD_CFG_ACCTYPE,
  234. ilog2(op->addr.buswidth) <<
  235. NPCM_FIU_DRD_ACCTYPE_SHIFT);
  236. fiu->drd_op.addr.buswidth = op->addr.buswidth;
  237. regmap_update_bits(fiu->regmap, NPCM_FIU_DRD_CFG,
  238. NPCM_FIU_DRD_CFG_DBW,
  239. op->dummy.nbytes << NPCM_FIU_DRD_DBW_SHIFT);
  240. fiu->drd_op.dummy.nbytes = op->dummy.nbytes;
  241. regmap_update_bits(fiu->regmap, NPCM_FIU_DRD_CFG,
  242. NPCM_FIU_DRD_CFG_RDCMD, op->cmd.opcode);
  243. fiu->drd_op.cmd.opcode = op->cmd.opcode;
  244. regmap_update_bits(fiu->regmap, NPCM_FIU_DRD_CFG,
  245. NPCM_FIU_DRD_CFG_ADDSIZ,
  246. (op->addr.nbytes - 3) << NPCM_FIU_DRD_ADDSIZ_SHIFT);
  247. fiu->drd_op.addr.nbytes = op->addr.nbytes;
  248. }
  249. static ssize_t npcm_fiu_direct_read(struct spi_mem_dirmap_desc *desc,
  250. u64 offs, size_t len, void *buf)
  251. {
  252. struct npcm_fiu_spi *fiu =
  253. spi_controller_get_devdata(desc->mem->spi->master);
  254. struct npcm_fiu_chip *chip = &fiu->chip[desc->mem->spi->chip_select];
  255. void __iomem *src = (void __iomem *)(chip->flash_region_mapped_ptr +
  256. offs);
  257. u8 *buf_rx = buf;
  258. u32 i;
  259. if (fiu->spix_mode) {
  260. for (i = 0 ; i < len ; i++)
  261. *(buf_rx + i) = ioread8(src + i);
  262. } else {
  263. if (desc->info.op_tmpl.addr.buswidth != fiu->drd_op.addr.buswidth ||
  264. desc->info.op_tmpl.dummy.nbytes != fiu->drd_op.dummy.nbytes ||
  265. desc->info.op_tmpl.cmd.opcode != fiu->drd_op.cmd.opcode ||
  266. desc->info.op_tmpl.addr.nbytes != fiu->drd_op.addr.nbytes)
  267. npcm_fiu_set_drd(fiu, &desc->info.op_tmpl);
  268. memcpy_fromio(buf_rx, src, len);
  269. }
  270. return len;
  271. }
  272. static ssize_t npcm_fiu_direct_write(struct spi_mem_dirmap_desc *desc,
  273. u64 offs, size_t len, const void *buf)
  274. {
  275. struct npcm_fiu_spi *fiu =
  276. spi_controller_get_devdata(desc->mem->spi->master);
  277. struct npcm_fiu_chip *chip = &fiu->chip[desc->mem->spi->chip_select];
  278. void __iomem *dst = (void __iomem *)(chip->flash_region_mapped_ptr +
  279. offs);
  280. const u8 *buf_tx = buf;
  281. u32 i;
  282. if (fiu->spix_mode)
  283. for (i = 0 ; i < len ; i++)
  284. iowrite8(*(buf_tx + i), dst + i);
  285. else
  286. memcpy_toio(dst, buf_tx, len);
  287. return len;
  288. }
  289. static int npcm_fiu_uma_read(struct spi_mem *mem,
  290. const struct spi_mem_op *op, u32 addr,
  291. bool is_address_size, u8 *data, u32 data_size)
  292. {
  293. struct npcm_fiu_spi *fiu =
  294. spi_controller_get_devdata(mem->spi->master);
  295. u32 uma_cfg = BIT(10);
  296. u32 data_reg[4];
  297. int ret;
  298. u32 val;
  299. u32 i;
  300. regmap_update_bits(fiu->regmap, NPCM_FIU_UMA_CTS,
  301. NPCM_FIU_UMA_CTS_DEV_NUM,
  302. (mem->spi->chip_select <<
  303. NPCM_FIU_UMA_CTS_DEV_NUM_SHIFT));
  304. regmap_update_bits(fiu->regmap, NPCM_FIU_UMA_CMD,
  305. NPCM_FIU_UMA_CMD_CMD, op->cmd.opcode);
  306. if (is_address_size) {
  307. uma_cfg |= ilog2(op->cmd.buswidth);
  308. uma_cfg |= ilog2(op->addr.buswidth)
  309. << NPCM_FIU_UMA_CFG_ADBPCK_SHIFT;
  310. if (op->dummy.nbytes)
  311. uma_cfg |= ilog2(op->dummy.buswidth)
  312. << NPCM_FIU_UMA_CFG_DBPCK_SHIFT;
  313. uma_cfg |= ilog2(op->data.buswidth)
  314. << NPCM_FIU_UMA_CFG_RDBPCK_SHIFT;
  315. uma_cfg |= op->dummy.nbytes << NPCM_FIU_UMA_CFG_DBSIZ_SHIFT;
  316. uma_cfg |= op->addr.nbytes << NPCM_FIU_UMA_CFG_ADDSIZ_SHIFT;
  317. regmap_write(fiu->regmap, NPCM_FIU_UMA_ADDR, addr);
  318. } else {
  319. regmap_write(fiu->regmap, NPCM_FIU_UMA_ADDR, 0x0);
  320. }
  321. uma_cfg |= data_size << NPCM_FIU_UMA_CFG_RDATSIZ_SHIFT;
  322. regmap_write(fiu->regmap, NPCM_FIU_UMA_CFG, uma_cfg);
  323. regmap_write_bits(fiu->regmap, NPCM_FIU_UMA_CTS,
  324. NPCM_FIU_UMA_CTS_EXEC_DONE,
  325. NPCM_FIU_UMA_CTS_EXEC_DONE);
  326. ret = regmap_read_poll_timeout(fiu->regmap, NPCM_FIU_UMA_CTS, val,
  327. (!(val & NPCM_FIU_UMA_CTS_EXEC_DONE)), 0,
  328. UMA_MICRO_SEC_TIMEOUT);
  329. if (ret)
  330. return ret;
  331. if (data_size) {
  332. for (i = 0; i < DIV_ROUND_UP(data_size, 4); i++)
  333. regmap_read(fiu->regmap, NPCM_FIU_UMA_DR0 + (i * 4),
  334. &data_reg[i]);
  335. memcpy(data, data_reg, data_size);
  336. }
  337. return 0;
  338. }
  339. static int npcm_fiu_uma_write(struct spi_mem *mem,
  340. const struct spi_mem_op *op, u8 cmd,
  341. bool is_address_size, u8 *data, u32 data_size)
  342. {
  343. struct npcm_fiu_spi *fiu =
  344. spi_controller_get_devdata(mem->spi->master);
  345. u32 uma_cfg = BIT(10);
  346. u32 data_reg[4] = {0};
  347. u32 val;
  348. u32 i;
  349. regmap_update_bits(fiu->regmap, NPCM_FIU_UMA_CTS,
  350. NPCM_FIU_UMA_CTS_DEV_NUM,
  351. (mem->spi->chip_select <<
  352. NPCM_FIU_UMA_CTS_DEV_NUM_SHIFT));
  353. regmap_update_bits(fiu->regmap, NPCM_FIU_UMA_CMD,
  354. NPCM_FIU_UMA_CMD_CMD, cmd);
  355. if (data_size) {
  356. memcpy(data_reg, data, data_size);
  357. for (i = 0; i < DIV_ROUND_UP(data_size, 4); i++)
  358. regmap_write(fiu->regmap, NPCM_FIU_UMA_DW0 + (i * 4),
  359. data_reg[i]);
  360. }
  361. if (is_address_size) {
  362. uma_cfg |= ilog2(op->cmd.buswidth);
  363. uma_cfg |= ilog2(op->addr.buswidth) <<
  364. NPCM_FIU_UMA_CFG_ADBPCK_SHIFT;
  365. uma_cfg |= ilog2(op->data.buswidth) <<
  366. NPCM_FIU_UMA_CFG_WDBPCK_SHIFT;
  367. uma_cfg |= op->addr.nbytes << NPCM_FIU_UMA_CFG_ADDSIZ_SHIFT;
  368. regmap_write(fiu->regmap, NPCM_FIU_UMA_ADDR, op->addr.val);
  369. } else {
  370. regmap_write(fiu->regmap, NPCM_FIU_UMA_ADDR, 0x0);
  371. }
  372. uma_cfg |= (data_size << NPCM_FIU_UMA_CFG_WDATSIZ_SHIFT);
  373. regmap_write(fiu->regmap, NPCM_FIU_UMA_CFG, uma_cfg);
  374. regmap_write_bits(fiu->regmap, NPCM_FIU_UMA_CTS,
  375. NPCM_FIU_UMA_CTS_EXEC_DONE,
  376. NPCM_FIU_UMA_CTS_EXEC_DONE);
  377. return regmap_read_poll_timeout(fiu->regmap, NPCM_FIU_UMA_CTS, val,
  378. (!(val & NPCM_FIU_UMA_CTS_EXEC_DONE)), 0,
  379. UMA_MICRO_SEC_TIMEOUT);
  380. }
  381. static int npcm_fiu_manualwrite(struct spi_mem *mem,
  382. const struct spi_mem_op *op)
  383. {
  384. struct npcm_fiu_spi *fiu =
  385. spi_controller_get_devdata(mem->spi->master);
  386. u8 *data = (u8 *)op->data.buf.out;
  387. u32 num_data_chunks;
  388. u32 remain_data;
  389. u32 idx = 0;
  390. int ret;
  391. num_data_chunks = op->data.nbytes / CHUNK_SIZE;
  392. remain_data = op->data.nbytes % CHUNK_SIZE;
  393. regmap_update_bits(fiu->regmap, NPCM_FIU_UMA_CTS,
  394. NPCM_FIU_UMA_CTS_DEV_NUM,
  395. (mem->spi->chip_select <<
  396. NPCM_FIU_UMA_CTS_DEV_NUM_SHIFT));
  397. regmap_update_bits(fiu->regmap, NPCM_FIU_UMA_CTS,
  398. NPCM_FIU_UMA_CTS_SW_CS, 0);
  399. ret = npcm_fiu_uma_write(mem, op, op->cmd.opcode, true, NULL, 0);
  400. if (ret)
  401. return ret;
  402. /* Starting the data writing loop in multiples of 8 */
  403. for (idx = 0; idx < num_data_chunks; ++idx) {
  404. ret = npcm_fiu_uma_write(mem, op, data[0], false,
  405. &data[1], CHUNK_SIZE - 1);
  406. if (ret)
  407. return ret;
  408. data += CHUNK_SIZE;
  409. }
  410. /* Handling chunk remains */
  411. if (remain_data > 0) {
  412. ret = npcm_fiu_uma_write(mem, op, data[0], false,
  413. &data[1], remain_data - 1);
  414. if (ret)
  415. return ret;
  416. }
  417. regmap_update_bits(fiu->regmap, NPCM_FIU_UMA_CTS,
  418. NPCM_FIU_UMA_CTS_SW_CS, NPCM_FIU_UMA_CTS_SW_CS);
  419. return 0;
  420. }
  421. static int npcm_fiu_read(struct spi_mem *mem, const struct spi_mem_op *op)
  422. {
  423. u8 *data = op->data.buf.in;
  424. int i, readlen, currlen;
  425. u8 *buf_ptr;
  426. u32 addr;
  427. int ret;
  428. i = 0;
  429. currlen = op->data.nbytes;
  430. do {
  431. addr = ((u32)op->addr.val + i);
  432. if (currlen < 16)
  433. readlen = currlen;
  434. else
  435. readlen = 16;
  436. buf_ptr = data + i;
  437. ret = npcm_fiu_uma_read(mem, op, addr, true, buf_ptr,
  438. readlen);
  439. if (ret)
  440. return ret;
  441. i += readlen;
  442. currlen -= 16;
  443. } while (currlen > 0);
  444. return 0;
  445. }
  446. static void npcm_fiux_set_direct_wr(struct npcm_fiu_spi *fiu)
  447. {
  448. regmap_write(fiu->regmap, NPCM_FIU_DWR_CFG,
  449. NPCM_FIU_DWR_16_BYTE_BURST);
  450. regmap_update_bits(fiu->regmap, NPCM_FIU_DWR_CFG,
  451. NPCM_FIU_DWR_CFG_ABPCK,
  452. DWR_ABPCK_4_BIT_PER_CLK << NPCM_FIU_DWR_ABPCK_SHIFT);
  453. regmap_update_bits(fiu->regmap, NPCM_FIU_DWR_CFG,
  454. NPCM_FIU_DWR_CFG_DBPCK,
  455. DWR_DBPCK_4_BIT_PER_CLK << NPCM_FIU_DWR_DBPCK_SHIFT);
  456. }
  457. static void npcm_fiux_set_direct_rd(struct npcm_fiu_spi *fiu)
  458. {
  459. u32 rx_dummy = 0;
  460. regmap_write(fiu->regmap, NPCM_FIU_DRD_CFG,
  461. NPCM_FIU_DRD_16_BYTE_BURST);
  462. regmap_update_bits(fiu->regmap, NPCM_FIU_DRD_CFG,
  463. NPCM_FIU_DRD_CFG_ACCTYPE,
  464. DRD_SPI_X_MODE << NPCM_FIU_DRD_ACCTYPE_SHIFT);
  465. regmap_update_bits(fiu->regmap, NPCM_FIU_DRD_CFG,
  466. NPCM_FIU_DRD_CFG_DBW,
  467. rx_dummy << NPCM_FIU_DRD_DBW_SHIFT);
  468. }
  469. static int npcm_fiu_exec_op(struct spi_mem *mem, const struct spi_mem_op *op)
  470. {
  471. struct npcm_fiu_spi *fiu =
  472. spi_controller_get_devdata(mem->spi->master);
  473. struct npcm_fiu_chip *chip = &fiu->chip[mem->spi->chip_select];
  474. int ret = 0;
  475. u8 *buf;
  476. dev_dbg(fiu->dev, "cmd:%#x mode:%d.%d.%d.%d addr:%#llx len:%#x\n",
  477. op->cmd.opcode, op->cmd.buswidth, op->addr.buswidth,
  478. op->dummy.buswidth, op->data.buswidth, op->addr.val,
  479. op->data.nbytes);
  480. if (fiu->spix_mode || op->addr.nbytes > 4)
  481. return -ENOTSUPP;
  482. if (fiu->clkrate != chip->clkrate) {
  483. ret = clk_set_rate(fiu->clk, chip->clkrate);
  484. if (ret < 0)
  485. dev_warn(fiu->dev, "Failed setting %lu frequency, stay at %lu frequency\n",
  486. chip->clkrate, fiu->clkrate);
  487. else
  488. fiu->clkrate = chip->clkrate;
  489. }
  490. if (op->data.dir == SPI_MEM_DATA_IN) {
  491. if (!op->addr.nbytes) {
  492. buf = op->data.buf.in;
  493. ret = npcm_fiu_uma_read(mem, op, op->addr.val, false,
  494. buf, op->data.nbytes);
  495. } else {
  496. ret = npcm_fiu_read(mem, op);
  497. }
  498. } else {
  499. if (!op->addr.nbytes && !op->data.nbytes)
  500. ret = npcm_fiu_uma_write(mem, op, op->cmd.opcode, false,
  501. NULL, 0);
  502. if (op->addr.nbytes && !op->data.nbytes) {
  503. int i;
  504. u8 buf_addr[4];
  505. u32 addr = op->addr.val;
  506. for (i = op->addr.nbytes - 1; i >= 0; i--) {
  507. buf_addr[i] = addr & 0xff;
  508. addr >>= 8;
  509. }
  510. ret = npcm_fiu_uma_write(mem, op, op->cmd.opcode, false,
  511. buf_addr, op->addr.nbytes);
  512. }
  513. if (!op->addr.nbytes && op->data.nbytes)
  514. ret = npcm_fiu_uma_write(mem, op, op->cmd.opcode, false,
  515. (u8 *)op->data.buf.out,
  516. op->data.nbytes);
  517. if (op->addr.nbytes && op->data.nbytes)
  518. ret = npcm_fiu_manualwrite(mem, op);
  519. }
  520. return ret;
  521. }
  522. static int npcm_fiu_dirmap_create(struct spi_mem_dirmap_desc *desc)
  523. {
  524. struct npcm_fiu_spi *fiu =
  525. spi_controller_get_devdata(desc->mem->spi->master);
  526. struct npcm_fiu_chip *chip = &fiu->chip[desc->mem->spi->chip_select];
  527. struct regmap *gcr_regmap;
  528. if (!fiu->res_mem) {
  529. dev_warn(fiu->dev, "Reserved memory not defined, direct read disabled\n");
  530. desc->nodirmap = true;
  531. return 0;
  532. }
  533. if (!fiu->spix_mode &&
  534. desc->info.op_tmpl.data.dir == SPI_MEM_DATA_OUT) {
  535. desc->nodirmap = true;
  536. return 0;
  537. }
  538. if (!chip->flash_region_mapped_ptr) {
  539. chip->flash_region_mapped_ptr =
  540. devm_ioremap(fiu->dev, (fiu->res_mem->start +
  541. (fiu->info->max_map_size *
  542. desc->mem->spi->chip_select)),
  543. (u32)desc->info.length);
  544. if (!chip->flash_region_mapped_ptr) {
  545. dev_warn(fiu->dev, "Error mapping memory region, direct read disabled\n");
  546. desc->nodirmap = true;
  547. return 0;
  548. }
  549. }
  550. if (of_device_is_compatible(fiu->dev->of_node, "nuvoton,npcm750-fiu")) {
  551. gcr_regmap =
  552. syscon_regmap_lookup_by_compatible("nuvoton,npcm750-gcr");
  553. if (IS_ERR(gcr_regmap)) {
  554. dev_warn(fiu->dev, "Didn't find nuvoton,npcm750-gcr, direct read disabled\n");
  555. desc->nodirmap = true;
  556. return 0;
  557. }
  558. regmap_update_bits(gcr_regmap, NPCM7XX_INTCR3_OFFSET,
  559. NPCM7XX_INTCR3_FIU_FIX,
  560. NPCM7XX_INTCR3_FIU_FIX);
  561. } else {
  562. regmap_update_bits(fiu->regmap, NPCM_FIU_CFG,
  563. NPCM_FIU_CFG_FIU_FIX,
  564. NPCM_FIU_CFG_FIU_FIX);
  565. }
  566. if (desc->info.op_tmpl.data.dir == SPI_MEM_DATA_IN) {
  567. if (!fiu->spix_mode)
  568. npcm_fiu_set_drd(fiu, &desc->info.op_tmpl);
  569. else
  570. npcm_fiux_set_direct_rd(fiu);
  571. } else {
  572. npcm_fiux_set_direct_wr(fiu);
  573. }
  574. return 0;
  575. }
  576. static int npcm_fiu_setup(struct spi_device *spi)
  577. {
  578. struct spi_controller *ctrl = spi->master;
  579. struct npcm_fiu_spi *fiu = spi_controller_get_devdata(ctrl);
  580. struct npcm_fiu_chip *chip;
  581. chip = &fiu->chip[spi->chip_select];
  582. chip->fiu = fiu;
  583. chip->chipselect = spi->chip_select;
  584. chip->clkrate = spi->max_speed_hz;
  585. fiu->clkrate = clk_get_rate(fiu->clk);
  586. return 0;
  587. }
  588. static const struct spi_controller_mem_ops npcm_fiu_mem_ops = {
  589. .exec_op = npcm_fiu_exec_op,
  590. .dirmap_create = npcm_fiu_dirmap_create,
  591. .dirmap_read = npcm_fiu_direct_read,
  592. .dirmap_write = npcm_fiu_direct_write,
  593. };
  594. static const struct of_device_id npcm_fiu_dt_ids[] = {
  595. { .compatible = "nuvoton,npcm750-fiu", .data = &npcm7xx_fiu_data },
  596. { .compatible = "nuvoton,npcm845-fiu", .data = &npxm8xx_fiu_data },
  597. { /* sentinel */ }
  598. };
  599. static int npcm_fiu_probe(struct platform_device *pdev)
  600. {
  601. const struct fiu_data *fiu_data_match;
  602. struct device *dev = &pdev->dev;
  603. struct spi_controller *ctrl;
  604. struct npcm_fiu_spi *fiu;
  605. void __iomem *regbase;
  606. struct resource *res;
  607. int id, ret;
  608. ctrl = devm_spi_alloc_master(dev, sizeof(*fiu));
  609. if (!ctrl)
  610. return -ENOMEM;
  611. fiu = spi_controller_get_devdata(ctrl);
  612. fiu_data_match = of_device_get_match_data(dev);
  613. if (!fiu_data_match) {
  614. dev_err(dev, "No compatible OF match\n");
  615. return -ENODEV;
  616. }
  617. id = of_alias_get_id(dev->of_node, "fiu");
  618. if (id < 0 || id >= fiu_data_match->fiu_max) {
  619. dev_err(dev, "Invalid platform device id: %d\n", id);
  620. return -EINVAL;
  621. }
  622. fiu->info = &fiu_data_match->npcm_fiu_data_info[id];
  623. platform_set_drvdata(pdev, fiu);
  624. fiu->dev = dev;
  625. res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "control");
  626. regbase = devm_ioremap_resource(dev, res);
  627. if (IS_ERR(regbase))
  628. return PTR_ERR(regbase);
  629. fiu->regmap = devm_regmap_init_mmio(dev, regbase,
  630. &npcm_mtd_regmap_config);
  631. if (IS_ERR(fiu->regmap)) {
  632. dev_err(dev, "Failed to create regmap\n");
  633. return PTR_ERR(fiu->regmap);
  634. }
  635. fiu->res_mem = platform_get_resource_byname(pdev, IORESOURCE_MEM,
  636. "memory");
  637. fiu->clk = devm_clk_get(dev, NULL);
  638. if (IS_ERR(fiu->clk))
  639. return PTR_ERR(fiu->clk);
  640. fiu->spix_mode = of_property_read_bool(dev->of_node,
  641. "nuvoton,spix-mode");
  642. platform_set_drvdata(pdev, fiu);
  643. clk_prepare_enable(fiu->clk);
  644. ctrl->mode_bits = SPI_RX_DUAL | SPI_RX_QUAD
  645. | SPI_TX_DUAL | SPI_TX_QUAD;
  646. ctrl->setup = npcm_fiu_setup;
  647. ctrl->bus_num = -1;
  648. ctrl->mem_ops = &npcm_fiu_mem_ops;
  649. ctrl->num_chipselect = fiu->info->max_cs;
  650. ctrl->dev.of_node = dev->of_node;
  651. ret = devm_spi_register_master(dev, ctrl);
  652. if (ret)
  653. clk_disable_unprepare(fiu->clk);
  654. return ret;
  655. }
  656. static int npcm_fiu_remove(struct platform_device *pdev)
  657. {
  658. struct npcm_fiu_spi *fiu = platform_get_drvdata(pdev);
  659. clk_disable_unprepare(fiu->clk);
  660. return 0;
  661. }
  662. MODULE_DEVICE_TABLE(of, npcm_fiu_dt_ids);
  663. static struct platform_driver npcm_fiu_driver = {
  664. .driver = {
  665. .name = "NPCM-FIU",
  666. .bus = &platform_bus_type,
  667. .of_match_table = npcm_fiu_dt_ids,
  668. },
  669. .probe = npcm_fiu_probe,
  670. .remove = npcm_fiu_remove,
  671. };
  672. module_platform_driver(npcm_fiu_driver);
  673. MODULE_DESCRIPTION("Nuvoton FLASH Interface Unit SPI Controller Driver");
  674. MODULE_AUTHOR("Tomer Maimon <[email protected]>");
  675. MODULE_LICENSE("GPL v2");