spi-synquacer.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830
  1. // SPDX-License-Identifier: GPL-2.0
  2. //
  3. // Synquacer HSSPI controller driver
  4. //
  5. // Copyright (c) 2015-2018 Socionext Inc.
  6. // Copyright (c) 2018-2019 Linaro Ltd.
  7. //
  8. #include <linux/acpi.h>
  9. #include <linux/delay.h>
  10. #include <linux/interrupt.h>
  11. #include <linux/io.h>
  12. #include <linux/module.h>
  13. #include <linux/of.h>
  14. #include <linux/platform_device.h>
  15. #include <linux/pm_runtime.h>
  16. #include <linux/scatterlist.h>
  17. #include <linux/slab.h>
  18. #include <linux/spi/spi.h>
  19. #include <linux/spinlock.h>
  20. #include <linux/clk.h>
  21. /* HSSPI register address definitions */
  22. #define SYNQUACER_HSSPI_REG_MCTRL 0x00
  23. #define SYNQUACER_HSSPI_REG_PCC0 0x04
  24. #define SYNQUACER_HSSPI_REG_PCC(n) (SYNQUACER_HSSPI_REG_PCC0 + (n) * 4)
  25. #define SYNQUACER_HSSPI_REG_TXF 0x14
  26. #define SYNQUACER_HSSPI_REG_TXE 0x18
  27. #define SYNQUACER_HSSPI_REG_TXC 0x1C
  28. #define SYNQUACER_HSSPI_REG_RXF 0x20
  29. #define SYNQUACER_HSSPI_REG_RXE 0x24
  30. #define SYNQUACER_HSSPI_REG_RXC 0x28
  31. #define SYNQUACER_HSSPI_REG_FAULTF 0x2C
  32. #define SYNQUACER_HSSPI_REG_FAULTC 0x30
  33. #define SYNQUACER_HSSPI_REG_DMCFG 0x34
  34. #define SYNQUACER_HSSPI_REG_DMSTART 0x38
  35. #define SYNQUACER_HSSPI_REG_DMBCC 0x3C
  36. #define SYNQUACER_HSSPI_REG_DMSTATUS 0x40
  37. #define SYNQUACER_HSSPI_REG_FIFOCFG 0x4C
  38. #define SYNQUACER_HSSPI_REG_TX_FIFO 0x50
  39. #define SYNQUACER_HSSPI_REG_RX_FIFO 0x90
  40. #define SYNQUACER_HSSPI_REG_MID 0xFC
  41. /* HSSPI register bit definitions */
  42. #define SYNQUACER_HSSPI_MCTRL_MEN BIT(0)
  43. #define SYNQUACER_HSSPI_MCTRL_COMMAND_SEQUENCE_EN BIT(1)
  44. #define SYNQUACER_HSSPI_MCTRL_CDSS BIT(3)
  45. #define SYNQUACER_HSSPI_MCTRL_MES BIT(4)
  46. #define SYNQUACER_HSSPI_MCTRL_SYNCON BIT(5)
  47. #define SYNQUACER_HSSPI_PCC_CPHA BIT(0)
  48. #define SYNQUACER_HSSPI_PCC_CPOL BIT(1)
  49. #define SYNQUACER_HSSPI_PCC_ACES BIT(2)
  50. #define SYNQUACER_HSSPI_PCC_RTM BIT(3)
  51. #define SYNQUACER_HSSPI_PCC_SSPOL BIT(4)
  52. #define SYNQUACER_HSSPI_PCC_SDIR BIT(7)
  53. #define SYNQUACER_HSSPI_PCC_SENDIAN BIT(8)
  54. #define SYNQUACER_HSSPI_PCC_SAFESYNC BIT(16)
  55. #define SYNQUACER_HSSPI_PCC_SS2CD_SHIFT 5U
  56. #define SYNQUACER_HSSPI_PCC_CDRS_MASK 0x7f
  57. #define SYNQUACER_HSSPI_PCC_CDRS_SHIFT 9U
  58. #define SYNQUACER_HSSPI_TXF_FIFO_FULL BIT(0)
  59. #define SYNQUACER_HSSPI_TXF_FIFO_EMPTY BIT(1)
  60. #define SYNQUACER_HSSPI_TXF_SLAVE_RELEASED BIT(6)
  61. #define SYNQUACER_HSSPI_TXE_FIFO_FULL BIT(0)
  62. #define SYNQUACER_HSSPI_TXE_FIFO_EMPTY BIT(1)
  63. #define SYNQUACER_HSSPI_TXE_SLAVE_RELEASED BIT(6)
  64. #define SYNQUACER_HSSPI_RXF_FIFO_MORE_THAN_THRESHOLD BIT(5)
  65. #define SYNQUACER_HSSPI_RXF_SLAVE_RELEASED BIT(6)
  66. #define SYNQUACER_HSSPI_RXE_FIFO_MORE_THAN_THRESHOLD BIT(5)
  67. #define SYNQUACER_HSSPI_RXE_SLAVE_RELEASED BIT(6)
  68. #define SYNQUACER_HSSPI_DMCFG_SSDC BIT(1)
  69. #define SYNQUACER_HSSPI_DMCFG_MSTARTEN BIT(2)
  70. #define SYNQUACER_HSSPI_DMSTART_START BIT(0)
  71. #define SYNQUACER_HSSPI_DMSTOP_STOP BIT(8)
  72. #define SYNQUACER_HSSPI_DMPSEL_CS_MASK 0x3
  73. #define SYNQUACER_HSSPI_DMPSEL_CS_SHIFT 16U
  74. #define SYNQUACER_HSSPI_DMTRP_BUS_WIDTH_SHIFT 24U
  75. #define SYNQUACER_HSSPI_DMTRP_DATA_MASK 0x3
  76. #define SYNQUACER_HSSPI_DMTRP_DATA_SHIFT 26U
  77. #define SYNQUACER_HSSPI_DMTRP_DATA_TXRX 0
  78. #define SYNQUACER_HSSPI_DMTRP_DATA_RX 1
  79. #define SYNQUACER_HSSPI_DMTRP_DATA_TX 2
  80. #define SYNQUACER_HSSPI_DMSTATUS_RX_DATA_MASK 0x1f
  81. #define SYNQUACER_HSSPI_DMSTATUS_RX_DATA_SHIFT 8U
  82. #define SYNQUACER_HSSPI_DMSTATUS_TX_DATA_MASK 0x1f
  83. #define SYNQUACER_HSSPI_DMSTATUS_TX_DATA_SHIFT 16U
  84. #define SYNQUACER_HSSPI_FIFOCFG_RX_THRESHOLD_MASK 0xf
  85. #define SYNQUACER_HSSPI_FIFOCFG_RX_THRESHOLD_SHIFT 0U
  86. #define SYNQUACER_HSSPI_FIFOCFG_TX_THRESHOLD_MASK 0xf
  87. #define SYNQUACER_HSSPI_FIFOCFG_TX_THRESHOLD_SHIFT 4U
  88. #define SYNQUACER_HSSPI_FIFOCFG_FIFO_WIDTH_MASK 0x3
  89. #define SYNQUACER_HSSPI_FIFOCFG_FIFO_WIDTH_SHIFT 8U
  90. #define SYNQUACER_HSSPI_FIFOCFG_RX_FLUSH BIT(11)
  91. #define SYNQUACER_HSSPI_FIFOCFG_TX_FLUSH BIT(12)
  92. #define SYNQUACER_HSSPI_FIFO_DEPTH 16U
  93. #define SYNQUACER_HSSPI_FIFO_TX_THRESHOLD 4U
  94. #define SYNQUACER_HSSPI_FIFO_RX_THRESHOLD \
  95. (SYNQUACER_HSSPI_FIFO_DEPTH - SYNQUACER_HSSPI_FIFO_TX_THRESHOLD)
  96. #define SYNQUACER_HSSPI_TRANSFER_MODE_TX BIT(1)
  97. #define SYNQUACER_HSSPI_TRANSFER_MODE_RX BIT(2)
  98. #define SYNQUACER_HSSPI_TRANSFER_TMOUT_MSEC 2000U
  99. #define SYNQUACER_HSSPI_ENABLE_TMOUT_MSEC 1000U
  100. #define SYNQUACER_HSSPI_CLOCK_SRC_IHCLK 0
  101. #define SYNQUACER_HSSPI_CLOCK_SRC_IPCLK 1
  102. #define SYNQUACER_HSSPI_NUM_CHIP_SELECT 4U
  103. #define SYNQUACER_HSSPI_IRQ_NAME_MAX 32U
  104. struct synquacer_spi {
  105. struct device *dev;
  106. struct completion transfer_done;
  107. unsigned int cs;
  108. unsigned int bpw;
  109. unsigned int mode;
  110. unsigned int speed;
  111. bool aces, rtm;
  112. void *rx_buf;
  113. const void *tx_buf;
  114. struct clk *clk;
  115. int clk_src_type;
  116. void __iomem *regs;
  117. u32 tx_words, rx_words;
  118. unsigned int bus_width;
  119. unsigned int transfer_mode;
  120. char rx_irq_name[SYNQUACER_HSSPI_IRQ_NAME_MAX];
  121. char tx_irq_name[SYNQUACER_HSSPI_IRQ_NAME_MAX];
  122. };
  123. static int read_fifo(struct synquacer_spi *sspi)
  124. {
  125. u32 len = readl(sspi->regs + SYNQUACER_HSSPI_REG_DMSTATUS);
  126. len = (len >> SYNQUACER_HSSPI_DMSTATUS_RX_DATA_SHIFT) &
  127. SYNQUACER_HSSPI_DMSTATUS_RX_DATA_MASK;
  128. len = min(len, sspi->rx_words);
  129. switch (sspi->bpw) {
  130. case 8: {
  131. u8 *buf = sspi->rx_buf;
  132. ioread8_rep(sspi->regs + SYNQUACER_HSSPI_REG_RX_FIFO,
  133. buf, len);
  134. sspi->rx_buf = buf + len;
  135. break;
  136. }
  137. case 16: {
  138. u16 *buf = sspi->rx_buf;
  139. ioread16_rep(sspi->regs + SYNQUACER_HSSPI_REG_RX_FIFO,
  140. buf, len);
  141. sspi->rx_buf = buf + len;
  142. break;
  143. }
  144. case 24:
  145. /* fallthrough, should use 32-bits access */
  146. case 32: {
  147. u32 *buf = sspi->rx_buf;
  148. ioread32_rep(sspi->regs + SYNQUACER_HSSPI_REG_RX_FIFO,
  149. buf, len);
  150. sspi->rx_buf = buf + len;
  151. break;
  152. }
  153. default:
  154. return -EINVAL;
  155. }
  156. sspi->rx_words -= len;
  157. return 0;
  158. }
  159. static int write_fifo(struct synquacer_spi *sspi)
  160. {
  161. u32 len = readl(sspi->regs + SYNQUACER_HSSPI_REG_DMSTATUS);
  162. len = (len >> SYNQUACER_HSSPI_DMSTATUS_TX_DATA_SHIFT) &
  163. SYNQUACER_HSSPI_DMSTATUS_TX_DATA_MASK;
  164. len = min(SYNQUACER_HSSPI_FIFO_DEPTH - len,
  165. sspi->tx_words);
  166. switch (sspi->bpw) {
  167. case 8: {
  168. const u8 *buf = sspi->tx_buf;
  169. iowrite8_rep(sspi->regs + SYNQUACER_HSSPI_REG_TX_FIFO,
  170. buf, len);
  171. sspi->tx_buf = buf + len;
  172. break;
  173. }
  174. case 16: {
  175. const u16 *buf = sspi->tx_buf;
  176. iowrite16_rep(sspi->regs + SYNQUACER_HSSPI_REG_TX_FIFO,
  177. buf, len);
  178. sspi->tx_buf = buf + len;
  179. break;
  180. }
  181. case 24:
  182. /* fallthrough, should use 32-bits access */
  183. case 32: {
  184. const u32 *buf = sspi->tx_buf;
  185. iowrite32_rep(sspi->regs + SYNQUACER_HSSPI_REG_TX_FIFO,
  186. buf, len);
  187. sspi->tx_buf = buf + len;
  188. break;
  189. }
  190. default:
  191. return -EINVAL;
  192. }
  193. sspi->tx_words -= len;
  194. return 0;
  195. }
  196. static int synquacer_spi_config(struct spi_master *master,
  197. struct spi_device *spi,
  198. struct spi_transfer *xfer)
  199. {
  200. struct synquacer_spi *sspi = spi_master_get_devdata(master);
  201. unsigned int speed, mode, bpw, cs, bus_width, transfer_mode;
  202. u32 rate, val, div;
  203. /* Full Duplex only on 1-bit wide bus */
  204. if (xfer->rx_buf && xfer->tx_buf &&
  205. (xfer->rx_nbits != 1 || xfer->tx_nbits != 1)) {
  206. dev_err(sspi->dev,
  207. "RX and TX bus widths must be 1-bit for Full-Duplex!\n");
  208. return -EINVAL;
  209. }
  210. if (xfer->tx_buf) {
  211. bus_width = xfer->tx_nbits;
  212. transfer_mode = SYNQUACER_HSSPI_TRANSFER_MODE_TX;
  213. } else {
  214. bus_width = xfer->rx_nbits;
  215. transfer_mode = SYNQUACER_HSSPI_TRANSFER_MODE_RX;
  216. }
  217. mode = spi->mode;
  218. cs = spi->chip_select;
  219. speed = xfer->speed_hz;
  220. bpw = xfer->bits_per_word;
  221. /* return if nothing to change */
  222. if (speed == sspi->speed &&
  223. bus_width == sspi->bus_width && bpw == sspi->bpw &&
  224. mode == sspi->mode && cs == sspi->cs &&
  225. transfer_mode == sspi->transfer_mode) {
  226. return 0;
  227. }
  228. sspi->transfer_mode = transfer_mode;
  229. rate = master->max_speed_hz;
  230. div = DIV_ROUND_UP(rate, speed);
  231. if (div > 254) {
  232. dev_err(sspi->dev, "Requested rate too low (%u)\n",
  233. sspi->speed);
  234. return -EINVAL;
  235. }
  236. val = readl(sspi->regs + SYNQUACER_HSSPI_REG_PCC(cs));
  237. val &= ~SYNQUACER_HSSPI_PCC_SAFESYNC;
  238. if (bpw == 8 && (mode & (SPI_TX_DUAL | SPI_RX_DUAL)) && div < 3)
  239. val |= SYNQUACER_HSSPI_PCC_SAFESYNC;
  240. if (bpw == 8 && (mode & (SPI_TX_QUAD | SPI_RX_QUAD)) && div < 6)
  241. val |= SYNQUACER_HSSPI_PCC_SAFESYNC;
  242. if (bpw == 16 && (mode & (SPI_TX_QUAD | SPI_RX_QUAD)) && div < 3)
  243. val |= SYNQUACER_HSSPI_PCC_SAFESYNC;
  244. if (mode & SPI_CPHA)
  245. val |= SYNQUACER_HSSPI_PCC_CPHA;
  246. else
  247. val &= ~SYNQUACER_HSSPI_PCC_CPHA;
  248. if (mode & SPI_CPOL)
  249. val |= SYNQUACER_HSSPI_PCC_CPOL;
  250. else
  251. val &= ~SYNQUACER_HSSPI_PCC_CPOL;
  252. if (mode & SPI_CS_HIGH)
  253. val |= SYNQUACER_HSSPI_PCC_SSPOL;
  254. else
  255. val &= ~SYNQUACER_HSSPI_PCC_SSPOL;
  256. if (mode & SPI_LSB_FIRST)
  257. val |= SYNQUACER_HSSPI_PCC_SDIR;
  258. else
  259. val &= ~SYNQUACER_HSSPI_PCC_SDIR;
  260. if (sspi->aces)
  261. val |= SYNQUACER_HSSPI_PCC_ACES;
  262. else
  263. val &= ~SYNQUACER_HSSPI_PCC_ACES;
  264. if (sspi->rtm)
  265. val |= SYNQUACER_HSSPI_PCC_RTM;
  266. else
  267. val &= ~SYNQUACER_HSSPI_PCC_RTM;
  268. val |= (3 << SYNQUACER_HSSPI_PCC_SS2CD_SHIFT);
  269. val |= SYNQUACER_HSSPI_PCC_SENDIAN;
  270. val &= ~(SYNQUACER_HSSPI_PCC_CDRS_MASK <<
  271. SYNQUACER_HSSPI_PCC_CDRS_SHIFT);
  272. val |= ((div >> 1) << SYNQUACER_HSSPI_PCC_CDRS_SHIFT);
  273. writel(val, sspi->regs + SYNQUACER_HSSPI_REG_PCC(cs));
  274. val = readl(sspi->regs + SYNQUACER_HSSPI_REG_FIFOCFG);
  275. val &= ~(SYNQUACER_HSSPI_FIFOCFG_FIFO_WIDTH_MASK <<
  276. SYNQUACER_HSSPI_FIFOCFG_FIFO_WIDTH_SHIFT);
  277. val |= ((bpw / 8 - 1) << SYNQUACER_HSSPI_FIFOCFG_FIFO_WIDTH_SHIFT);
  278. writel(val, sspi->regs + SYNQUACER_HSSPI_REG_FIFOCFG);
  279. val = readl(sspi->regs + SYNQUACER_HSSPI_REG_DMSTART);
  280. val &= ~(SYNQUACER_HSSPI_DMTRP_DATA_MASK <<
  281. SYNQUACER_HSSPI_DMTRP_DATA_SHIFT);
  282. if (xfer->rx_buf)
  283. val |= (SYNQUACER_HSSPI_DMTRP_DATA_RX <<
  284. SYNQUACER_HSSPI_DMTRP_DATA_SHIFT);
  285. else
  286. val |= (SYNQUACER_HSSPI_DMTRP_DATA_TX <<
  287. SYNQUACER_HSSPI_DMTRP_DATA_SHIFT);
  288. val &= ~(3 << SYNQUACER_HSSPI_DMTRP_BUS_WIDTH_SHIFT);
  289. val |= ((bus_width >> 1) << SYNQUACER_HSSPI_DMTRP_BUS_WIDTH_SHIFT);
  290. writel(val, sspi->regs + SYNQUACER_HSSPI_REG_DMSTART);
  291. sspi->bpw = bpw;
  292. sspi->mode = mode;
  293. sspi->speed = speed;
  294. sspi->cs = spi->chip_select;
  295. sspi->bus_width = bus_width;
  296. return 0;
  297. }
  298. static int synquacer_spi_transfer_one(struct spi_master *master,
  299. struct spi_device *spi,
  300. struct spi_transfer *xfer)
  301. {
  302. struct synquacer_spi *sspi = spi_master_get_devdata(master);
  303. int ret;
  304. int status = 0;
  305. u32 words;
  306. u8 bpw;
  307. u32 val;
  308. val = readl(sspi->regs + SYNQUACER_HSSPI_REG_DMSTART);
  309. val &= ~SYNQUACER_HSSPI_DMSTOP_STOP;
  310. writel(val, sspi->regs + SYNQUACER_HSSPI_REG_DMSTART);
  311. val = readl(sspi->regs + SYNQUACER_HSSPI_REG_FIFOCFG);
  312. val |= SYNQUACER_HSSPI_FIFOCFG_RX_FLUSH;
  313. val |= SYNQUACER_HSSPI_FIFOCFG_TX_FLUSH;
  314. writel(val, sspi->regs + SYNQUACER_HSSPI_REG_FIFOCFG);
  315. /*
  316. * See if we can transfer 4-bytes as 1 word
  317. * to maximize the FIFO buffer efficiency.
  318. */
  319. bpw = xfer->bits_per_word;
  320. if (bpw == 8 && !(xfer->len % 4) && !(spi->mode & SPI_LSB_FIRST))
  321. xfer->bits_per_word = 32;
  322. ret = synquacer_spi_config(master, spi, xfer);
  323. /* restore */
  324. xfer->bits_per_word = bpw;
  325. if (ret)
  326. return ret;
  327. reinit_completion(&sspi->transfer_done);
  328. sspi->tx_buf = xfer->tx_buf;
  329. sspi->rx_buf = xfer->rx_buf;
  330. switch (sspi->bpw) {
  331. case 8:
  332. words = xfer->len;
  333. break;
  334. case 16:
  335. words = xfer->len / 2;
  336. break;
  337. case 24:
  338. /* fallthrough, should use 32-bits access */
  339. case 32:
  340. words = xfer->len / 4;
  341. break;
  342. default:
  343. dev_err(sspi->dev, "unsupported bpw: %d\n", sspi->bpw);
  344. return -EINVAL;
  345. }
  346. if (xfer->tx_buf)
  347. sspi->tx_words = words;
  348. else
  349. sspi->tx_words = 0;
  350. if (xfer->rx_buf)
  351. sspi->rx_words = words;
  352. else
  353. sspi->rx_words = 0;
  354. if (xfer->tx_buf) {
  355. status = write_fifo(sspi);
  356. if (status < 0) {
  357. dev_err(sspi->dev, "failed write_fifo. status: 0x%x\n",
  358. status);
  359. return status;
  360. }
  361. }
  362. if (xfer->rx_buf) {
  363. val = readl(sspi->regs + SYNQUACER_HSSPI_REG_FIFOCFG);
  364. val &= ~(SYNQUACER_HSSPI_FIFOCFG_RX_THRESHOLD_MASK <<
  365. SYNQUACER_HSSPI_FIFOCFG_RX_THRESHOLD_SHIFT);
  366. val |= ((sspi->rx_words > SYNQUACER_HSSPI_FIFO_DEPTH ?
  367. SYNQUACER_HSSPI_FIFO_RX_THRESHOLD : sspi->rx_words) <<
  368. SYNQUACER_HSSPI_FIFOCFG_RX_THRESHOLD_SHIFT);
  369. writel(val, sspi->regs + SYNQUACER_HSSPI_REG_FIFOCFG);
  370. }
  371. writel(~0, sspi->regs + SYNQUACER_HSSPI_REG_TXC);
  372. writel(~0, sspi->regs + SYNQUACER_HSSPI_REG_RXC);
  373. /* Trigger */
  374. val = readl(sspi->regs + SYNQUACER_HSSPI_REG_DMSTART);
  375. val |= SYNQUACER_HSSPI_DMSTART_START;
  376. writel(val, sspi->regs + SYNQUACER_HSSPI_REG_DMSTART);
  377. if (xfer->tx_buf) {
  378. val = SYNQUACER_HSSPI_TXE_FIFO_EMPTY;
  379. writel(val, sspi->regs + SYNQUACER_HSSPI_REG_TXE);
  380. status = wait_for_completion_timeout(&sspi->transfer_done,
  381. msecs_to_jiffies(SYNQUACER_HSSPI_TRANSFER_TMOUT_MSEC));
  382. writel(0, sspi->regs + SYNQUACER_HSSPI_REG_TXE);
  383. }
  384. if (xfer->rx_buf) {
  385. u32 buf[SYNQUACER_HSSPI_FIFO_DEPTH];
  386. val = SYNQUACER_HSSPI_RXE_FIFO_MORE_THAN_THRESHOLD |
  387. SYNQUACER_HSSPI_RXE_SLAVE_RELEASED;
  388. writel(val, sspi->regs + SYNQUACER_HSSPI_REG_RXE);
  389. status = wait_for_completion_timeout(&sspi->transfer_done,
  390. msecs_to_jiffies(SYNQUACER_HSSPI_TRANSFER_TMOUT_MSEC));
  391. writel(0, sspi->regs + SYNQUACER_HSSPI_REG_RXE);
  392. /* stop RX and clean RXFIFO */
  393. val = readl(sspi->regs + SYNQUACER_HSSPI_REG_DMSTART);
  394. val |= SYNQUACER_HSSPI_DMSTOP_STOP;
  395. writel(val, sspi->regs + SYNQUACER_HSSPI_REG_DMSTART);
  396. sspi->rx_buf = buf;
  397. sspi->rx_words = SYNQUACER_HSSPI_FIFO_DEPTH;
  398. read_fifo(sspi);
  399. }
  400. if (status == 0) {
  401. dev_err(sspi->dev, "failed to transfer. Timeout.\n");
  402. return -ETIMEDOUT;
  403. }
  404. return 0;
  405. }
  406. static void synquacer_spi_set_cs(struct spi_device *spi, bool enable)
  407. {
  408. struct synquacer_spi *sspi = spi_master_get_devdata(spi->master);
  409. u32 val;
  410. val = readl(sspi->regs + SYNQUACER_HSSPI_REG_DMSTART);
  411. val &= ~(SYNQUACER_HSSPI_DMPSEL_CS_MASK <<
  412. SYNQUACER_HSSPI_DMPSEL_CS_SHIFT);
  413. val |= spi->chip_select << SYNQUACER_HSSPI_DMPSEL_CS_SHIFT;
  414. if (!enable)
  415. val |= SYNQUACER_HSSPI_DMSTOP_STOP;
  416. writel(val, sspi->regs + SYNQUACER_HSSPI_REG_DMSTART);
  417. }
  418. static int synquacer_spi_wait_status_update(struct synquacer_spi *sspi,
  419. bool enable)
  420. {
  421. u32 val;
  422. unsigned long timeout = jiffies +
  423. msecs_to_jiffies(SYNQUACER_HSSPI_ENABLE_TMOUT_MSEC);
  424. /* wait MES(Module Enable Status) is updated */
  425. do {
  426. val = readl(sspi->regs + SYNQUACER_HSSPI_REG_MCTRL) &
  427. SYNQUACER_HSSPI_MCTRL_MES;
  428. if (enable && val)
  429. return 0;
  430. if (!enable && !val)
  431. return 0;
  432. } while (time_before(jiffies, timeout));
  433. dev_err(sspi->dev, "timeout occurs in updating Module Enable Status\n");
  434. return -EBUSY;
  435. }
  436. static int synquacer_spi_enable(struct spi_master *master)
  437. {
  438. u32 val;
  439. int status;
  440. struct synquacer_spi *sspi = spi_master_get_devdata(master);
  441. /* Disable module */
  442. writel(0, sspi->regs + SYNQUACER_HSSPI_REG_MCTRL);
  443. status = synquacer_spi_wait_status_update(sspi, false);
  444. if (status < 0)
  445. return status;
  446. writel(0, sspi->regs + SYNQUACER_HSSPI_REG_TXE);
  447. writel(0, sspi->regs + SYNQUACER_HSSPI_REG_RXE);
  448. writel(~0, sspi->regs + SYNQUACER_HSSPI_REG_TXC);
  449. writel(~0, sspi->regs + SYNQUACER_HSSPI_REG_RXC);
  450. writel(~0, sspi->regs + SYNQUACER_HSSPI_REG_FAULTC);
  451. val = readl(sspi->regs + SYNQUACER_HSSPI_REG_DMCFG);
  452. val &= ~SYNQUACER_HSSPI_DMCFG_SSDC;
  453. val &= ~SYNQUACER_HSSPI_DMCFG_MSTARTEN;
  454. writel(val, sspi->regs + SYNQUACER_HSSPI_REG_DMCFG);
  455. val = readl(sspi->regs + SYNQUACER_HSSPI_REG_MCTRL);
  456. if (sspi->clk_src_type == SYNQUACER_HSSPI_CLOCK_SRC_IPCLK)
  457. val |= SYNQUACER_HSSPI_MCTRL_CDSS;
  458. else
  459. val &= ~SYNQUACER_HSSPI_MCTRL_CDSS;
  460. val &= ~SYNQUACER_HSSPI_MCTRL_COMMAND_SEQUENCE_EN;
  461. val |= SYNQUACER_HSSPI_MCTRL_MEN;
  462. val |= SYNQUACER_HSSPI_MCTRL_SYNCON;
  463. /* Enable module */
  464. writel(val, sspi->regs + SYNQUACER_HSSPI_REG_MCTRL);
  465. status = synquacer_spi_wait_status_update(sspi, true);
  466. if (status < 0)
  467. return status;
  468. return 0;
  469. }
  470. static irqreturn_t sq_spi_rx_handler(int irq, void *priv)
  471. {
  472. uint32_t val;
  473. struct synquacer_spi *sspi = priv;
  474. val = readl(sspi->regs + SYNQUACER_HSSPI_REG_RXF);
  475. if ((val & SYNQUACER_HSSPI_RXF_SLAVE_RELEASED) ||
  476. (val & SYNQUACER_HSSPI_RXF_FIFO_MORE_THAN_THRESHOLD)) {
  477. read_fifo(sspi);
  478. if (sspi->rx_words == 0) {
  479. writel(0, sspi->regs + SYNQUACER_HSSPI_REG_RXE);
  480. complete(&sspi->transfer_done);
  481. }
  482. return IRQ_HANDLED;
  483. }
  484. return IRQ_NONE;
  485. }
  486. static irqreturn_t sq_spi_tx_handler(int irq, void *priv)
  487. {
  488. uint32_t val;
  489. struct synquacer_spi *sspi = priv;
  490. val = readl(sspi->regs + SYNQUACER_HSSPI_REG_TXF);
  491. if (val & SYNQUACER_HSSPI_TXF_FIFO_EMPTY) {
  492. if (sspi->tx_words == 0) {
  493. writel(0, sspi->regs + SYNQUACER_HSSPI_REG_TXE);
  494. complete(&sspi->transfer_done);
  495. } else {
  496. write_fifo(sspi);
  497. }
  498. return IRQ_HANDLED;
  499. }
  500. return IRQ_NONE;
  501. }
  502. static int synquacer_spi_probe(struct platform_device *pdev)
  503. {
  504. struct device_node *np = pdev->dev.of_node;
  505. struct spi_master *master;
  506. struct synquacer_spi *sspi;
  507. int ret;
  508. int rx_irq, tx_irq;
  509. master = spi_alloc_master(&pdev->dev, sizeof(*sspi));
  510. if (!master)
  511. return -ENOMEM;
  512. platform_set_drvdata(pdev, master);
  513. sspi = spi_master_get_devdata(master);
  514. sspi->dev = &pdev->dev;
  515. init_completion(&sspi->transfer_done);
  516. sspi->regs = devm_platform_ioremap_resource(pdev, 0);
  517. if (IS_ERR(sspi->regs)) {
  518. ret = PTR_ERR(sspi->regs);
  519. goto put_spi;
  520. }
  521. sspi->clk_src_type = SYNQUACER_HSSPI_CLOCK_SRC_IHCLK; /* Default */
  522. device_property_read_u32(&pdev->dev, "socionext,ihclk-rate",
  523. &master->max_speed_hz); /* for ACPI */
  524. if (dev_of_node(&pdev->dev)) {
  525. if (device_property_match_string(&pdev->dev,
  526. "clock-names", "iHCLK") >= 0) {
  527. sspi->clk_src_type = SYNQUACER_HSSPI_CLOCK_SRC_IHCLK;
  528. sspi->clk = devm_clk_get(sspi->dev, "iHCLK");
  529. } else if (device_property_match_string(&pdev->dev,
  530. "clock-names", "iPCLK") >= 0) {
  531. sspi->clk_src_type = SYNQUACER_HSSPI_CLOCK_SRC_IPCLK;
  532. sspi->clk = devm_clk_get(sspi->dev, "iPCLK");
  533. } else {
  534. dev_err(&pdev->dev, "specified wrong clock source\n");
  535. ret = -EINVAL;
  536. goto put_spi;
  537. }
  538. if (IS_ERR(sspi->clk)) {
  539. ret = dev_err_probe(&pdev->dev, PTR_ERR(sspi->clk),
  540. "clock not found\n");
  541. goto put_spi;
  542. }
  543. ret = clk_prepare_enable(sspi->clk);
  544. if (ret) {
  545. dev_err(&pdev->dev, "failed to enable clock (%d)\n",
  546. ret);
  547. goto put_spi;
  548. }
  549. master->max_speed_hz = clk_get_rate(sspi->clk);
  550. }
  551. if (!master->max_speed_hz) {
  552. dev_err(&pdev->dev, "missing clock source\n");
  553. ret = -EINVAL;
  554. goto disable_clk;
  555. }
  556. master->min_speed_hz = master->max_speed_hz / 254;
  557. sspi->aces = device_property_read_bool(&pdev->dev,
  558. "socionext,set-aces");
  559. sspi->rtm = device_property_read_bool(&pdev->dev, "socionext,use-rtm");
  560. master->num_chipselect = SYNQUACER_HSSPI_NUM_CHIP_SELECT;
  561. rx_irq = platform_get_irq(pdev, 0);
  562. if (rx_irq <= 0) {
  563. ret = rx_irq;
  564. goto disable_clk;
  565. }
  566. snprintf(sspi->rx_irq_name, SYNQUACER_HSSPI_IRQ_NAME_MAX, "%s-rx",
  567. dev_name(&pdev->dev));
  568. ret = devm_request_irq(&pdev->dev, rx_irq, sq_spi_rx_handler,
  569. 0, sspi->rx_irq_name, sspi);
  570. if (ret) {
  571. dev_err(&pdev->dev, "request rx_irq failed (%d)\n", ret);
  572. goto disable_clk;
  573. }
  574. tx_irq = platform_get_irq(pdev, 1);
  575. if (tx_irq <= 0) {
  576. ret = tx_irq;
  577. goto disable_clk;
  578. }
  579. snprintf(sspi->tx_irq_name, SYNQUACER_HSSPI_IRQ_NAME_MAX, "%s-tx",
  580. dev_name(&pdev->dev));
  581. ret = devm_request_irq(&pdev->dev, tx_irq, sq_spi_tx_handler,
  582. 0, sspi->tx_irq_name, sspi);
  583. if (ret) {
  584. dev_err(&pdev->dev, "request tx_irq failed (%d)\n", ret);
  585. goto disable_clk;
  586. }
  587. master->dev.of_node = np;
  588. master->dev.fwnode = pdev->dev.fwnode;
  589. master->auto_runtime_pm = true;
  590. master->bus_num = pdev->id;
  591. master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_TX_DUAL | SPI_RX_DUAL |
  592. SPI_TX_QUAD | SPI_RX_QUAD;
  593. master->bits_per_word_mask = SPI_BPW_MASK(32) | SPI_BPW_MASK(24) |
  594. SPI_BPW_MASK(16) | SPI_BPW_MASK(8);
  595. master->set_cs = synquacer_spi_set_cs;
  596. master->transfer_one = synquacer_spi_transfer_one;
  597. ret = synquacer_spi_enable(master);
  598. if (ret)
  599. goto disable_clk;
  600. pm_runtime_set_active(sspi->dev);
  601. pm_runtime_enable(sspi->dev);
  602. ret = devm_spi_register_master(sspi->dev, master);
  603. if (ret)
  604. goto disable_pm;
  605. return 0;
  606. disable_pm:
  607. pm_runtime_disable(sspi->dev);
  608. disable_clk:
  609. clk_disable_unprepare(sspi->clk);
  610. put_spi:
  611. spi_master_put(master);
  612. return ret;
  613. }
  614. static int synquacer_spi_remove(struct platform_device *pdev)
  615. {
  616. struct spi_master *master = platform_get_drvdata(pdev);
  617. struct synquacer_spi *sspi = spi_master_get_devdata(master);
  618. pm_runtime_disable(sspi->dev);
  619. clk_disable_unprepare(sspi->clk);
  620. return 0;
  621. }
  622. static int __maybe_unused synquacer_spi_suspend(struct device *dev)
  623. {
  624. struct spi_master *master = dev_get_drvdata(dev);
  625. struct synquacer_spi *sspi = spi_master_get_devdata(master);
  626. int ret;
  627. ret = spi_master_suspend(master);
  628. if (ret)
  629. return ret;
  630. if (!pm_runtime_suspended(dev))
  631. clk_disable_unprepare(sspi->clk);
  632. return ret;
  633. }
  634. static int __maybe_unused synquacer_spi_resume(struct device *dev)
  635. {
  636. struct spi_master *master = dev_get_drvdata(dev);
  637. struct synquacer_spi *sspi = spi_master_get_devdata(master);
  638. int ret;
  639. if (!pm_runtime_suspended(dev)) {
  640. /* Ensure reconfigure during next xfer */
  641. sspi->speed = 0;
  642. ret = clk_prepare_enable(sspi->clk);
  643. if (ret < 0) {
  644. dev_err(dev, "failed to enable clk (%d)\n",
  645. ret);
  646. return ret;
  647. }
  648. ret = synquacer_spi_enable(master);
  649. if (ret) {
  650. clk_disable_unprepare(sspi->clk);
  651. dev_err(dev, "failed to enable spi (%d)\n", ret);
  652. return ret;
  653. }
  654. }
  655. ret = spi_master_resume(master);
  656. if (ret < 0)
  657. clk_disable_unprepare(sspi->clk);
  658. return ret;
  659. }
  660. static SIMPLE_DEV_PM_OPS(synquacer_spi_pm_ops, synquacer_spi_suspend,
  661. synquacer_spi_resume);
  662. static const struct of_device_id synquacer_spi_of_match[] = {
  663. {.compatible = "socionext,synquacer-spi"},
  664. {}
  665. };
  666. MODULE_DEVICE_TABLE(of, synquacer_spi_of_match);
  667. #ifdef CONFIG_ACPI
  668. static const struct acpi_device_id synquacer_hsspi_acpi_ids[] = {
  669. { "SCX0004" },
  670. { /* sentinel */ }
  671. };
  672. MODULE_DEVICE_TABLE(acpi, synquacer_hsspi_acpi_ids);
  673. #endif
  674. static struct platform_driver synquacer_spi_driver = {
  675. .driver = {
  676. .name = "synquacer-spi",
  677. .pm = &synquacer_spi_pm_ops,
  678. .of_match_table = synquacer_spi_of_match,
  679. .acpi_match_table = ACPI_PTR(synquacer_hsspi_acpi_ids),
  680. },
  681. .probe = synquacer_spi_probe,
  682. .remove = synquacer_spi_remove,
  683. };
  684. module_platform_driver(synquacer_spi_driver);
  685. MODULE_DESCRIPTION("Socionext Synquacer HS-SPI controller driver");
  686. MODULE_AUTHOR("Masahisa Kojima <[email protected]>");
  687. MODULE_AUTHOR("Jassi Brar <[email protected]>");
  688. MODULE_LICENSE("GPL v2");