spi-meson-spicc.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944
  1. /*
  2. * Driver for Amlogic Meson SPI communication controller (SPICC)
  3. *
  4. * Copyright (C) BayLibre, SAS
  5. * Author: Neil Armstrong <[email protected]>
  6. *
  7. * SPDX-License-Identifier: GPL-2.0+
  8. */
  9. #include <linux/bitfield.h>
  10. #include <linux/clk.h>
  11. #include <linux/clk-provider.h>
  12. #include <linux/device.h>
  13. #include <linux/io.h>
  14. #include <linux/kernel.h>
  15. #include <linux/module.h>
  16. #include <linux/of.h>
  17. #include <linux/of_device.h>
  18. #include <linux/platform_device.h>
  19. #include <linux/spi/spi.h>
  20. #include <linux/types.h>
  21. #include <linux/interrupt.h>
  22. #include <linux/reset.h>
  23. /*
  24. * The Meson SPICC controller could support DMA based transfers, but is not
  25. * implemented by the vendor code, and while having the registers documentation
  26. * it has never worked on the GXL Hardware.
  27. * The PIO mode is the only mode implemented, and due to badly designed HW :
  28. * - all transfers are cutted in 16 words burst because the FIFO hangs on
  29. * TX underflow, and there is no TX "Half-Empty" interrupt, so we go by
  30. * FIFO max size chunk only
  31. * - CS management is dumb, and goes UP between every burst, so is really a
  32. * "Data Valid" signal than a Chip Select, GPIO link should be used instead
  33. * to have a CS go down over the full transfer
  34. */
  35. #define SPICC_MAX_BURST 128
  36. /* Register Map */
  37. #define SPICC_RXDATA 0x00
  38. #define SPICC_TXDATA 0x04
  39. #define SPICC_CONREG 0x08
  40. #define SPICC_ENABLE BIT(0)
  41. #define SPICC_MODE_MASTER BIT(1)
  42. #define SPICC_XCH BIT(2)
  43. #define SPICC_SMC BIT(3)
  44. #define SPICC_POL BIT(4)
  45. #define SPICC_PHA BIT(5)
  46. #define SPICC_SSCTL BIT(6)
  47. #define SPICC_SSPOL BIT(7)
  48. #define SPICC_DRCTL_MASK GENMASK(9, 8)
  49. #define SPICC_DRCTL_IGNORE 0
  50. #define SPICC_DRCTL_FALLING 1
  51. #define SPICC_DRCTL_LOWLEVEL 2
  52. #define SPICC_CS_MASK GENMASK(13, 12)
  53. #define SPICC_DATARATE_MASK GENMASK(18, 16)
  54. #define SPICC_DATARATE_DIV4 0
  55. #define SPICC_DATARATE_DIV8 1
  56. #define SPICC_DATARATE_DIV16 2
  57. #define SPICC_DATARATE_DIV32 3
  58. #define SPICC_BITLENGTH_MASK GENMASK(24, 19)
  59. #define SPICC_BURSTLENGTH_MASK GENMASK(31, 25)
  60. #define SPICC_INTREG 0x0c
  61. #define SPICC_TE_EN BIT(0) /* TX FIFO Empty Interrupt */
  62. #define SPICC_TH_EN BIT(1) /* TX FIFO Half-Full Interrupt */
  63. #define SPICC_TF_EN BIT(2) /* TX FIFO Full Interrupt */
  64. #define SPICC_RR_EN BIT(3) /* RX FIFO Ready Interrupt */
  65. #define SPICC_RH_EN BIT(4) /* RX FIFO Half-Full Interrupt */
  66. #define SPICC_RF_EN BIT(5) /* RX FIFO Full Interrupt */
  67. #define SPICC_RO_EN BIT(6) /* RX FIFO Overflow Interrupt */
  68. #define SPICC_TC_EN BIT(7) /* Transfert Complete Interrupt */
  69. #define SPICC_DMAREG 0x10
  70. #define SPICC_DMA_ENABLE BIT(0)
  71. #define SPICC_TXFIFO_THRESHOLD_MASK GENMASK(5, 1)
  72. #define SPICC_RXFIFO_THRESHOLD_MASK GENMASK(10, 6)
  73. #define SPICC_READ_BURST_MASK GENMASK(14, 11)
  74. #define SPICC_WRITE_BURST_MASK GENMASK(18, 15)
  75. #define SPICC_DMA_URGENT BIT(19)
  76. #define SPICC_DMA_THREADID_MASK GENMASK(25, 20)
  77. #define SPICC_DMA_BURSTNUM_MASK GENMASK(31, 26)
  78. #define SPICC_STATREG 0x14
  79. #define SPICC_TE BIT(0) /* TX FIFO Empty Interrupt */
  80. #define SPICC_TH BIT(1) /* TX FIFO Half-Full Interrupt */
  81. #define SPICC_TF BIT(2) /* TX FIFO Full Interrupt */
  82. #define SPICC_RR BIT(3) /* RX FIFO Ready Interrupt */
  83. #define SPICC_RH BIT(4) /* RX FIFO Half-Full Interrupt */
  84. #define SPICC_RF BIT(5) /* RX FIFO Full Interrupt */
  85. #define SPICC_RO BIT(6) /* RX FIFO Overflow Interrupt */
  86. #define SPICC_TC BIT(7) /* Transfert Complete Interrupt */
  87. #define SPICC_PERIODREG 0x18
  88. #define SPICC_PERIOD GENMASK(14, 0) /* Wait cycles */
  89. #define SPICC_TESTREG 0x1c
  90. #define SPICC_TXCNT_MASK GENMASK(4, 0) /* TX FIFO Counter */
  91. #define SPICC_RXCNT_MASK GENMASK(9, 5) /* RX FIFO Counter */
  92. #define SPICC_SMSTATUS_MASK GENMASK(12, 10) /* State Machine Status */
  93. #define SPICC_LBC_RO BIT(13) /* Loop Back Control Read-Only */
  94. #define SPICC_LBC_W1 BIT(14) /* Loop Back Control Write-Only */
  95. #define SPICC_SWAP_RO BIT(14) /* RX FIFO Data Swap Read-Only */
  96. #define SPICC_SWAP_W1 BIT(15) /* RX FIFO Data Swap Write-Only */
  97. #define SPICC_DLYCTL_RO_MASK GENMASK(20, 15) /* Delay Control Read-Only */
  98. #define SPICC_MO_DELAY_MASK GENMASK(17, 16) /* Master Output Delay */
  99. #define SPICC_MO_NO_DELAY 0
  100. #define SPICC_MO_DELAY_1_CYCLE 1
  101. #define SPICC_MO_DELAY_2_CYCLE 2
  102. #define SPICC_MO_DELAY_3_CYCLE 3
  103. #define SPICC_MI_DELAY_MASK GENMASK(19, 18) /* Master Input Delay */
  104. #define SPICC_MI_NO_DELAY 0
  105. #define SPICC_MI_DELAY_1_CYCLE 1
  106. #define SPICC_MI_DELAY_2_CYCLE 2
  107. #define SPICC_MI_DELAY_3_CYCLE 3
  108. #define SPICC_MI_CAP_DELAY_MASK GENMASK(21, 20) /* Master Capture Delay */
  109. #define SPICC_CAP_AHEAD_2_CYCLE 0
  110. #define SPICC_CAP_AHEAD_1_CYCLE 1
  111. #define SPICC_CAP_NO_DELAY 2
  112. #define SPICC_CAP_DELAY_1_CYCLE 3
  113. #define SPICC_FIFORST_RO_MASK GENMASK(22, 21) /* FIFO Softreset Read-Only */
  114. #define SPICC_FIFORST_W1_MASK GENMASK(23, 22) /* FIFO Softreset Write-Only */
  115. #define SPICC_DRADDR 0x20 /* Read Address of DMA */
  116. #define SPICC_DWADDR 0x24 /* Write Address of DMA */
  117. #define SPICC_ENH_CTL0 0x38 /* Enhanced Feature */
  118. #define SPICC_ENH_CLK_CS_DELAY_MASK GENMASK(15, 0)
  119. #define SPICC_ENH_DATARATE_MASK GENMASK(23, 16)
  120. #define SPICC_ENH_DATARATE_EN BIT(24)
  121. #define SPICC_ENH_MOSI_OEN BIT(25)
  122. #define SPICC_ENH_CLK_OEN BIT(26)
  123. #define SPICC_ENH_CS_OEN BIT(27)
  124. #define SPICC_ENH_CLK_CS_DELAY_EN BIT(28)
  125. #define SPICC_ENH_MAIN_CLK_AO BIT(29)
  126. #define writel_bits_relaxed(mask, val, addr) \
  127. writel_relaxed((readl_relaxed(addr) & ~(mask)) | (val), addr)
  128. struct meson_spicc_data {
  129. unsigned int max_speed_hz;
  130. unsigned int min_speed_hz;
  131. unsigned int fifo_size;
  132. bool has_oen;
  133. bool has_enhance_clk_div;
  134. bool has_pclk;
  135. };
  136. struct meson_spicc_device {
  137. struct spi_master *master;
  138. struct platform_device *pdev;
  139. void __iomem *base;
  140. struct clk *core;
  141. struct clk *pclk;
  142. struct clk_divider pow2_div;
  143. struct clk *clk;
  144. struct spi_message *message;
  145. struct spi_transfer *xfer;
  146. struct completion done;
  147. const struct meson_spicc_data *data;
  148. u8 *tx_buf;
  149. u8 *rx_buf;
  150. unsigned int bytes_per_word;
  151. unsigned long tx_remain;
  152. unsigned long rx_remain;
  153. unsigned long xfer_remain;
  154. };
  155. #define pow2_clk_to_spicc(_div) container_of(_div, struct meson_spicc_device, pow2_div)
  156. static void meson_spicc_oen_enable(struct meson_spicc_device *spicc)
  157. {
  158. u32 conf;
  159. if (!spicc->data->has_oen)
  160. return;
  161. conf = readl_relaxed(spicc->base + SPICC_ENH_CTL0) |
  162. SPICC_ENH_MOSI_OEN | SPICC_ENH_CLK_OEN | SPICC_ENH_CS_OEN;
  163. writel_relaxed(conf, spicc->base + SPICC_ENH_CTL0);
  164. }
  165. static inline bool meson_spicc_txfull(struct meson_spicc_device *spicc)
  166. {
  167. return !!FIELD_GET(SPICC_TF,
  168. readl_relaxed(spicc->base + SPICC_STATREG));
  169. }
  170. static inline bool meson_spicc_rxready(struct meson_spicc_device *spicc)
  171. {
  172. return FIELD_GET(SPICC_RH | SPICC_RR | SPICC_RF,
  173. readl_relaxed(spicc->base + SPICC_STATREG));
  174. }
  175. static inline u32 meson_spicc_pull_data(struct meson_spicc_device *spicc)
  176. {
  177. unsigned int bytes = spicc->bytes_per_word;
  178. unsigned int byte_shift = 0;
  179. u32 data = 0;
  180. u8 byte;
  181. while (bytes--) {
  182. byte = *spicc->tx_buf++;
  183. data |= (byte & 0xff) << byte_shift;
  184. byte_shift += 8;
  185. }
  186. spicc->tx_remain--;
  187. return data;
  188. }
  189. static inline void meson_spicc_push_data(struct meson_spicc_device *spicc,
  190. u32 data)
  191. {
  192. unsigned int bytes = spicc->bytes_per_word;
  193. unsigned int byte_shift = 0;
  194. u8 byte;
  195. while (bytes--) {
  196. byte = (data >> byte_shift) & 0xff;
  197. *spicc->rx_buf++ = byte;
  198. byte_shift += 8;
  199. }
  200. spicc->rx_remain--;
  201. }
  202. static inline void meson_spicc_rx(struct meson_spicc_device *spicc)
  203. {
  204. /* Empty RX FIFO */
  205. while (spicc->rx_remain &&
  206. meson_spicc_rxready(spicc))
  207. meson_spicc_push_data(spicc,
  208. readl_relaxed(spicc->base + SPICC_RXDATA));
  209. }
  210. static inline void meson_spicc_tx(struct meson_spicc_device *spicc)
  211. {
  212. /* Fill Up TX FIFO */
  213. while (spicc->tx_remain &&
  214. !meson_spicc_txfull(spicc))
  215. writel_relaxed(meson_spicc_pull_data(spicc),
  216. spicc->base + SPICC_TXDATA);
  217. }
  218. static inline void meson_spicc_setup_burst(struct meson_spicc_device *spicc)
  219. {
  220. unsigned int burst_len = min_t(unsigned int,
  221. spicc->xfer_remain /
  222. spicc->bytes_per_word,
  223. spicc->data->fifo_size);
  224. /* Setup Xfer variables */
  225. spicc->tx_remain = burst_len;
  226. spicc->rx_remain = burst_len;
  227. spicc->xfer_remain -= burst_len * spicc->bytes_per_word;
  228. /* Setup burst length */
  229. writel_bits_relaxed(SPICC_BURSTLENGTH_MASK,
  230. FIELD_PREP(SPICC_BURSTLENGTH_MASK,
  231. burst_len - 1),
  232. spicc->base + SPICC_CONREG);
  233. /* Fill TX FIFO */
  234. meson_spicc_tx(spicc);
  235. }
  236. static irqreturn_t meson_spicc_irq(int irq, void *data)
  237. {
  238. struct meson_spicc_device *spicc = (void *) data;
  239. writel_bits_relaxed(SPICC_TC, SPICC_TC, spicc->base + SPICC_STATREG);
  240. /* Empty RX FIFO */
  241. meson_spicc_rx(spicc);
  242. if (!spicc->xfer_remain) {
  243. /* Disable all IRQs */
  244. writel(0, spicc->base + SPICC_INTREG);
  245. complete(&spicc->done);
  246. return IRQ_HANDLED;
  247. }
  248. /* Setup burst */
  249. meson_spicc_setup_burst(spicc);
  250. /* Start burst */
  251. writel_bits_relaxed(SPICC_XCH, SPICC_XCH, spicc->base + SPICC_CONREG);
  252. return IRQ_HANDLED;
  253. }
  254. static void meson_spicc_auto_io_delay(struct meson_spicc_device *spicc)
  255. {
  256. u32 div, hz;
  257. u32 mi_delay, cap_delay;
  258. u32 conf;
  259. if (spicc->data->has_enhance_clk_div) {
  260. div = FIELD_GET(SPICC_ENH_DATARATE_MASK,
  261. readl_relaxed(spicc->base + SPICC_ENH_CTL0));
  262. div++;
  263. div <<= 1;
  264. } else {
  265. div = FIELD_GET(SPICC_DATARATE_MASK,
  266. readl_relaxed(spicc->base + SPICC_CONREG));
  267. div += 2;
  268. div = 1 << div;
  269. }
  270. mi_delay = SPICC_MI_NO_DELAY;
  271. cap_delay = SPICC_CAP_AHEAD_2_CYCLE;
  272. hz = clk_get_rate(spicc->clk);
  273. if (hz >= 100000000)
  274. cap_delay = SPICC_CAP_DELAY_1_CYCLE;
  275. else if (hz >= 80000000)
  276. cap_delay = SPICC_CAP_NO_DELAY;
  277. else if (hz >= 40000000)
  278. cap_delay = SPICC_CAP_AHEAD_1_CYCLE;
  279. else if (div >= 16)
  280. mi_delay = SPICC_MI_DELAY_3_CYCLE;
  281. else if (div >= 8)
  282. mi_delay = SPICC_MI_DELAY_2_CYCLE;
  283. else if (div >= 6)
  284. mi_delay = SPICC_MI_DELAY_1_CYCLE;
  285. conf = readl_relaxed(spicc->base + SPICC_TESTREG);
  286. conf &= ~(SPICC_MO_DELAY_MASK | SPICC_MI_DELAY_MASK
  287. | SPICC_MI_CAP_DELAY_MASK);
  288. conf |= FIELD_PREP(SPICC_MI_DELAY_MASK, mi_delay);
  289. conf |= FIELD_PREP(SPICC_MI_CAP_DELAY_MASK, cap_delay);
  290. writel_relaxed(conf, spicc->base + SPICC_TESTREG);
  291. }
  292. static void meson_spicc_setup_xfer(struct meson_spicc_device *spicc,
  293. struct spi_transfer *xfer)
  294. {
  295. u32 conf, conf_orig;
  296. /* Read original configuration */
  297. conf = conf_orig = readl_relaxed(spicc->base + SPICC_CONREG);
  298. /* Setup word width */
  299. conf &= ~SPICC_BITLENGTH_MASK;
  300. conf |= FIELD_PREP(SPICC_BITLENGTH_MASK,
  301. (spicc->bytes_per_word << 3) - 1);
  302. /* Ignore if unchanged */
  303. if (conf != conf_orig)
  304. writel_relaxed(conf, spicc->base + SPICC_CONREG);
  305. clk_set_rate(spicc->clk, xfer->speed_hz);
  306. meson_spicc_auto_io_delay(spicc);
  307. writel_relaxed(0, spicc->base + SPICC_DMAREG);
  308. }
  309. static void meson_spicc_reset_fifo(struct meson_spicc_device *spicc)
  310. {
  311. if (spicc->data->has_oen)
  312. writel_bits_relaxed(SPICC_ENH_MAIN_CLK_AO,
  313. SPICC_ENH_MAIN_CLK_AO,
  314. spicc->base + SPICC_ENH_CTL0);
  315. writel_bits_relaxed(SPICC_FIFORST_W1_MASK, SPICC_FIFORST_W1_MASK,
  316. spicc->base + SPICC_TESTREG);
  317. while (meson_spicc_rxready(spicc))
  318. readl_relaxed(spicc->base + SPICC_RXDATA);
  319. if (spicc->data->has_oen)
  320. writel_bits_relaxed(SPICC_ENH_MAIN_CLK_AO, 0,
  321. spicc->base + SPICC_ENH_CTL0);
  322. }
  323. static int meson_spicc_transfer_one(struct spi_master *master,
  324. struct spi_device *spi,
  325. struct spi_transfer *xfer)
  326. {
  327. struct meson_spicc_device *spicc = spi_master_get_devdata(master);
  328. uint64_t timeout;
  329. /* Store current transfer */
  330. spicc->xfer = xfer;
  331. /* Setup transfer parameters */
  332. spicc->tx_buf = (u8 *)xfer->tx_buf;
  333. spicc->rx_buf = (u8 *)xfer->rx_buf;
  334. spicc->xfer_remain = xfer->len;
  335. /* Pre-calculate word size */
  336. spicc->bytes_per_word =
  337. DIV_ROUND_UP(spicc->xfer->bits_per_word, 8);
  338. if (xfer->len % spicc->bytes_per_word)
  339. return -EINVAL;
  340. /* Setup transfer parameters */
  341. meson_spicc_setup_xfer(spicc, xfer);
  342. meson_spicc_reset_fifo(spicc);
  343. /* Setup burst */
  344. meson_spicc_setup_burst(spicc);
  345. /* Setup wait for completion */
  346. reinit_completion(&spicc->done);
  347. /* For each byte we wait for 8 cycles of the SPI clock */
  348. timeout = 8LL * MSEC_PER_SEC * xfer->len;
  349. do_div(timeout, xfer->speed_hz);
  350. /* Add 10us delay between each fifo bursts */
  351. timeout += ((xfer->len >> 4) * 10) / MSEC_PER_SEC;
  352. /* Increase it twice and add 200 ms tolerance */
  353. timeout += timeout + 200;
  354. /* Start burst */
  355. writel_bits_relaxed(SPICC_XCH, SPICC_XCH, spicc->base + SPICC_CONREG);
  356. /* Enable interrupts */
  357. writel_relaxed(SPICC_TC_EN, spicc->base + SPICC_INTREG);
  358. if (!wait_for_completion_timeout(&spicc->done, msecs_to_jiffies(timeout)))
  359. return -ETIMEDOUT;
  360. return 0;
  361. }
  362. static int meson_spicc_prepare_message(struct spi_master *master,
  363. struct spi_message *message)
  364. {
  365. struct meson_spicc_device *spicc = spi_master_get_devdata(master);
  366. struct spi_device *spi = message->spi;
  367. u32 conf = readl_relaxed(spicc->base + SPICC_CONREG) & SPICC_DATARATE_MASK;
  368. /* Store current message */
  369. spicc->message = message;
  370. /* Enable Master */
  371. conf |= SPICC_ENABLE;
  372. conf |= SPICC_MODE_MASTER;
  373. /* SMC = 0 */
  374. /* Setup transfer mode */
  375. if (spi->mode & SPI_CPOL)
  376. conf |= SPICC_POL;
  377. else
  378. conf &= ~SPICC_POL;
  379. if (spi->mode & SPI_CPHA)
  380. conf |= SPICC_PHA;
  381. else
  382. conf &= ~SPICC_PHA;
  383. /* SSCTL = 0 */
  384. if (spi->mode & SPI_CS_HIGH)
  385. conf |= SPICC_SSPOL;
  386. else
  387. conf &= ~SPICC_SSPOL;
  388. if (spi->mode & SPI_READY)
  389. conf |= FIELD_PREP(SPICC_DRCTL_MASK, SPICC_DRCTL_LOWLEVEL);
  390. else
  391. conf |= FIELD_PREP(SPICC_DRCTL_MASK, SPICC_DRCTL_IGNORE);
  392. /* Select CS */
  393. conf |= FIELD_PREP(SPICC_CS_MASK, spi->chip_select);
  394. /* Default 8bit word */
  395. conf |= FIELD_PREP(SPICC_BITLENGTH_MASK, 8 - 1);
  396. writel_relaxed(conf, spicc->base + SPICC_CONREG);
  397. /* Setup no wait cycles by default */
  398. writel_relaxed(0, spicc->base + SPICC_PERIODREG);
  399. writel_bits_relaxed(SPICC_LBC_W1, 0, spicc->base + SPICC_TESTREG);
  400. return 0;
  401. }
  402. static int meson_spicc_unprepare_transfer(struct spi_master *master)
  403. {
  404. struct meson_spicc_device *spicc = spi_master_get_devdata(master);
  405. u32 conf = readl_relaxed(spicc->base + SPICC_CONREG) & SPICC_DATARATE_MASK;
  406. /* Disable all IRQs */
  407. writel(0, spicc->base + SPICC_INTREG);
  408. device_reset_optional(&spicc->pdev->dev);
  409. /* Set default configuration, keeping datarate field */
  410. writel_relaxed(conf, spicc->base + SPICC_CONREG);
  411. return 0;
  412. }
  413. static int meson_spicc_setup(struct spi_device *spi)
  414. {
  415. if (!spi->controller_state)
  416. spi->controller_state = spi_master_get_devdata(spi->master);
  417. return 0;
  418. }
  419. static void meson_spicc_cleanup(struct spi_device *spi)
  420. {
  421. spi->controller_state = NULL;
  422. }
  423. /*
  424. * The Clock Mux
  425. * x-----------------x x------------x x------\
  426. * |---| pow2 fixed div |---| pow2 div |----| |
  427. * | x-----------------x x------------x | |
  428. * src ---| | mux |-- out
  429. * | x-----------------x x------------x | |
  430. * |---| enh fixed div |---| enh div |0---| |
  431. * x-----------------x x------------x x------/
  432. *
  433. * Clk path for GX series:
  434. * src -> pow2 fixed div -> pow2 div -> out
  435. *
  436. * Clk path for AXG series:
  437. * src -> pow2 fixed div -> pow2 div -> mux -> out
  438. * src -> enh fixed div -> enh div -> mux -> out
  439. *
  440. * Clk path for G12A series:
  441. * pclk -> pow2 fixed div -> pow2 div -> mux -> out
  442. * pclk -> enh fixed div -> enh div -> mux -> out
  443. *
  444. * The pow2 divider is tied to the controller HW state, and the
  445. * divider is only valid when the controller is initialized.
  446. *
  447. * A set of clock ops is added to make sure we don't read/set this
  448. * clock rate while the controller is in an unknown state.
  449. */
  450. static unsigned long meson_spicc_pow2_recalc_rate(struct clk_hw *hw,
  451. unsigned long parent_rate)
  452. {
  453. struct clk_divider *divider = to_clk_divider(hw);
  454. struct meson_spicc_device *spicc = pow2_clk_to_spicc(divider);
  455. if (!spicc->master->cur_msg)
  456. return 0;
  457. return clk_divider_ops.recalc_rate(hw, parent_rate);
  458. }
  459. static int meson_spicc_pow2_determine_rate(struct clk_hw *hw,
  460. struct clk_rate_request *req)
  461. {
  462. struct clk_divider *divider = to_clk_divider(hw);
  463. struct meson_spicc_device *spicc = pow2_clk_to_spicc(divider);
  464. if (!spicc->master->cur_msg)
  465. return -EINVAL;
  466. return clk_divider_ops.determine_rate(hw, req);
  467. }
  468. static int meson_spicc_pow2_set_rate(struct clk_hw *hw, unsigned long rate,
  469. unsigned long parent_rate)
  470. {
  471. struct clk_divider *divider = to_clk_divider(hw);
  472. struct meson_spicc_device *spicc = pow2_clk_to_spicc(divider);
  473. if (!spicc->master->cur_msg)
  474. return -EINVAL;
  475. return clk_divider_ops.set_rate(hw, rate, parent_rate);
  476. }
  477. static const struct clk_ops meson_spicc_pow2_clk_ops = {
  478. .recalc_rate = meson_spicc_pow2_recalc_rate,
  479. .determine_rate = meson_spicc_pow2_determine_rate,
  480. .set_rate = meson_spicc_pow2_set_rate,
  481. };
  482. static int meson_spicc_pow2_clk_init(struct meson_spicc_device *spicc)
  483. {
  484. struct device *dev = &spicc->pdev->dev;
  485. struct clk_fixed_factor *pow2_fixed_div;
  486. struct clk_init_data init;
  487. struct clk *clk;
  488. struct clk_parent_data parent_data[2];
  489. char name[64];
  490. memset(&init, 0, sizeof(init));
  491. memset(&parent_data, 0, sizeof(parent_data));
  492. init.parent_data = parent_data;
  493. /* algorithm for pow2 div: rate = freq / 4 / (2 ^ N) */
  494. pow2_fixed_div = devm_kzalloc(dev, sizeof(*pow2_fixed_div), GFP_KERNEL);
  495. if (!pow2_fixed_div)
  496. return -ENOMEM;
  497. snprintf(name, sizeof(name), "%s#pow2_fixed_div", dev_name(dev));
  498. init.name = name;
  499. init.ops = &clk_fixed_factor_ops;
  500. init.flags = 0;
  501. if (spicc->data->has_pclk)
  502. parent_data[0].hw = __clk_get_hw(spicc->pclk);
  503. else
  504. parent_data[0].hw = __clk_get_hw(spicc->core);
  505. init.num_parents = 1;
  506. pow2_fixed_div->mult = 1,
  507. pow2_fixed_div->div = 4,
  508. pow2_fixed_div->hw.init = &init;
  509. clk = devm_clk_register(dev, &pow2_fixed_div->hw);
  510. if (WARN_ON(IS_ERR(clk)))
  511. return PTR_ERR(clk);
  512. snprintf(name, sizeof(name), "%s#pow2_div", dev_name(dev));
  513. init.name = name;
  514. init.ops = &meson_spicc_pow2_clk_ops;
  515. /*
  516. * Set NOCACHE here to make sure we read the actual HW value
  517. * since we reset the HW after each transfer.
  518. */
  519. init.flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE;
  520. parent_data[0].hw = &pow2_fixed_div->hw;
  521. init.num_parents = 1;
  522. spicc->pow2_div.shift = 16,
  523. spicc->pow2_div.width = 3,
  524. spicc->pow2_div.flags = CLK_DIVIDER_POWER_OF_TWO,
  525. spicc->pow2_div.reg = spicc->base + SPICC_CONREG;
  526. spicc->pow2_div.hw.init = &init;
  527. spicc->clk = devm_clk_register(dev, &spicc->pow2_div.hw);
  528. if (WARN_ON(IS_ERR(spicc->clk)))
  529. return PTR_ERR(spicc->clk);
  530. return 0;
  531. }
  532. static int meson_spicc_enh_clk_init(struct meson_spicc_device *spicc)
  533. {
  534. struct device *dev = &spicc->pdev->dev;
  535. struct clk_fixed_factor *enh_fixed_div;
  536. struct clk_divider *enh_div;
  537. struct clk_mux *mux;
  538. struct clk_init_data init;
  539. struct clk *clk;
  540. struct clk_parent_data parent_data[2];
  541. char name[64];
  542. memset(&init, 0, sizeof(init));
  543. memset(&parent_data, 0, sizeof(parent_data));
  544. init.parent_data = parent_data;
  545. /* algorithm for enh div: rate = freq / 2 / (N + 1) */
  546. enh_fixed_div = devm_kzalloc(dev, sizeof(*enh_fixed_div), GFP_KERNEL);
  547. if (!enh_fixed_div)
  548. return -ENOMEM;
  549. snprintf(name, sizeof(name), "%s#enh_fixed_div", dev_name(dev));
  550. init.name = name;
  551. init.ops = &clk_fixed_factor_ops;
  552. init.flags = 0;
  553. if (spicc->data->has_pclk)
  554. parent_data[0].hw = __clk_get_hw(spicc->pclk);
  555. else
  556. parent_data[0].hw = __clk_get_hw(spicc->core);
  557. init.num_parents = 1;
  558. enh_fixed_div->mult = 1,
  559. enh_fixed_div->div = 2,
  560. enh_fixed_div->hw.init = &init;
  561. clk = devm_clk_register(dev, &enh_fixed_div->hw);
  562. if (WARN_ON(IS_ERR(clk)))
  563. return PTR_ERR(clk);
  564. enh_div = devm_kzalloc(dev, sizeof(*enh_div), GFP_KERNEL);
  565. if (!enh_div)
  566. return -ENOMEM;
  567. snprintf(name, sizeof(name), "%s#enh_div", dev_name(dev));
  568. init.name = name;
  569. init.ops = &clk_divider_ops;
  570. init.flags = CLK_SET_RATE_PARENT;
  571. parent_data[0].hw = &enh_fixed_div->hw;
  572. init.num_parents = 1;
  573. enh_div->shift = 16,
  574. enh_div->width = 8,
  575. enh_div->reg = spicc->base + SPICC_ENH_CTL0;
  576. enh_div->hw.init = &init;
  577. clk = devm_clk_register(dev, &enh_div->hw);
  578. if (WARN_ON(IS_ERR(clk)))
  579. return PTR_ERR(clk);
  580. mux = devm_kzalloc(dev, sizeof(*mux), GFP_KERNEL);
  581. if (!mux)
  582. return -ENOMEM;
  583. snprintf(name, sizeof(name), "%s#sel", dev_name(dev));
  584. init.name = name;
  585. init.ops = &clk_mux_ops;
  586. parent_data[0].hw = &spicc->pow2_div.hw;
  587. parent_data[1].hw = &enh_div->hw;
  588. init.num_parents = 2;
  589. init.flags = CLK_SET_RATE_PARENT;
  590. mux->mask = 0x1,
  591. mux->shift = 24,
  592. mux->reg = spicc->base + SPICC_ENH_CTL0;
  593. mux->hw.init = &init;
  594. spicc->clk = devm_clk_register(dev, &mux->hw);
  595. if (WARN_ON(IS_ERR(spicc->clk)))
  596. return PTR_ERR(spicc->clk);
  597. return 0;
  598. }
  599. static int meson_spicc_probe(struct platform_device *pdev)
  600. {
  601. struct spi_master *master;
  602. struct meson_spicc_device *spicc;
  603. int ret, irq;
  604. master = spi_alloc_master(&pdev->dev, sizeof(*spicc));
  605. if (!master) {
  606. dev_err(&pdev->dev, "master allocation failed\n");
  607. return -ENOMEM;
  608. }
  609. spicc = spi_master_get_devdata(master);
  610. spicc->master = master;
  611. spicc->data = of_device_get_match_data(&pdev->dev);
  612. if (!spicc->data) {
  613. dev_err(&pdev->dev, "failed to get match data\n");
  614. ret = -EINVAL;
  615. goto out_master;
  616. }
  617. spicc->pdev = pdev;
  618. platform_set_drvdata(pdev, spicc);
  619. init_completion(&spicc->done);
  620. spicc->base = devm_platform_ioremap_resource(pdev, 0);
  621. if (IS_ERR(spicc->base)) {
  622. dev_err(&pdev->dev, "io resource mapping failed\n");
  623. ret = PTR_ERR(spicc->base);
  624. goto out_master;
  625. }
  626. /* Set master mode and enable controller */
  627. writel_relaxed(SPICC_ENABLE | SPICC_MODE_MASTER,
  628. spicc->base + SPICC_CONREG);
  629. /* Disable all IRQs */
  630. writel_relaxed(0, spicc->base + SPICC_INTREG);
  631. irq = platform_get_irq(pdev, 0);
  632. if (irq < 0) {
  633. ret = irq;
  634. goto out_master;
  635. }
  636. ret = devm_request_irq(&pdev->dev, irq, meson_spicc_irq,
  637. 0, NULL, spicc);
  638. if (ret) {
  639. dev_err(&pdev->dev, "irq request failed\n");
  640. goto out_master;
  641. }
  642. spicc->core = devm_clk_get(&pdev->dev, "core");
  643. if (IS_ERR(spicc->core)) {
  644. dev_err(&pdev->dev, "core clock request failed\n");
  645. ret = PTR_ERR(spicc->core);
  646. goto out_master;
  647. }
  648. if (spicc->data->has_pclk) {
  649. spicc->pclk = devm_clk_get(&pdev->dev, "pclk");
  650. if (IS_ERR(spicc->pclk)) {
  651. dev_err(&pdev->dev, "pclk clock request failed\n");
  652. ret = PTR_ERR(spicc->pclk);
  653. goto out_master;
  654. }
  655. }
  656. ret = clk_prepare_enable(spicc->core);
  657. if (ret) {
  658. dev_err(&pdev->dev, "core clock enable failed\n");
  659. goto out_master;
  660. }
  661. ret = clk_prepare_enable(spicc->pclk);
  662. if (ret) {
  663. dev_err(&pdev->dev, "pclk clock enable failed\n");
  664. goto out_core_clk;
  665. }
  666. device_reset_optional(&pdev->dev);
  667. master->num_chipselect = 4;
  668. master->dev.of_node = pdev->dev.of_node;
  669. master->mode_bits = SPI_CPHA | SPI_CPOL | SPI_CS_HIGH;
  670. master->bits_per_word_mask = SPI_BPW_MASK(32) |
  671. SPI_BPW_MASK(24) |
  672. SPI_BPW_MASK(16) |
  673. SPI_BPW_MASK(8);
  674. master->flags = (SPI_MASTER_MUST_RX | SPI_MASTER_MUST_TX);
  675. master->min_speed_hz = spicc->data->min_speed_hz;
  676. master->max_speed_hz = spicc->data->max_speed_hz;
  677. master->setup = meson_spicc_setup;
  678. master->cleanup = meson_spicc_cleanup;
  679. master->prepare_message = meson_spicc_prepare_message;
  680. master->unprepare_transfer_hardware = meson_spicc_unprepare_transfer;
  681. master->transfer_one = meson_spicc_transfer_one;
  682. master->use_gpio_descriptors = true;
  683. meson_spicc_oen_enable(spicc);
  684. ret = meson_spicc_pow2_clk_init(spicc);
  685. if (ret) {
  686. dev_err(&pdev->dev, "pow2 clock registration failed\n");
  687. goto out_clk;
  688. }
  689. if (spicc->data->has_enhance_clk_div) {
  690. ret = meson_spicc_enh_clk_init(spicc);
  691. if (ret) {
  692. dev_err(&pdev->dev, "clock registration failed\n");
  693. goto out_clk;
  694. }
  695. }
  696. ret = devm_spi_register_master(&pdev->dev, master);
  697. if (ret) {
  698. dev_err(&pdev->dev, "spi master registration failed\n");
  699. goto out_clk;
  700. }
  701. return 0;
  702. out_clk:
  703. clk_disable_unprepare(spicc->pclk);
  704. out_core_clk:
  705. clk_disable_unprepare(spicc->core);
  706. out_master:
  707. spi_master_put(master);
  708. return ret;
  709. }
  710. static int meson_spicc_remove(struct platform_device *pdev)
  711. {
  712. struct meson_spicc_device *spicc = platform_get_drvdata(pdev);
  713. /* Disable SPI */
  714. writel(0, spicc->base + SPICC_CONREG);
  715. clk_disable_unprepare(spicc->core);
  716. clk_disable_unprepare(spicc->pclk);
  717. spi_master_put(spicc->master);
  718. return 0;
  719. }
  720. static const struct meson_spicc_data meson_spicc_gx_data = {
  721. .max_speed_hz = 30000000,
  722. .min_speed_hz = 325000,
  723. .fifo_size = 16,
  724. };
  725. static const struct meson_spicc_data meson_spicc_axg_data = {
  726. .max_speed_hz = 80000000,
  727. .min_speed_hz = 325000,
  728. .fifo_size = 16,
  729. .has_oen = true,
  730. .has_enhance_clk_div = true,
  731. };
  732. static const struct meson_spicc_data meson_spicc_g12a_data = {
  733. .max_speed_hz = 166666666,
  734. .min_speed_hz = 50000,
  735. .fifo_size = 15,
  736. .has_oen = true,
  737. .has_enhance_clk_div = true,
  738. .has_pclk = true,
  739. };
  740. static const struct of_device_id meson_spicc_of_match[] = {
  741. {
  742. .compatible = "amlogic,meson-gx-spicc",
  743. .data = &meson_spicc_gx_data,
  744. },
  745. {
  746. .compatible = "amlogic,meson-axg-spicc",
  747. .data = &meson_spicc_axg_data,
  748. },
  749. {
  750. .compatible = "amlogic,meson-g12a-spicc",
  751. .data = &meson_spicc_g12a_data,
  752. },
  753. { /* sentinel */ }
  754. };
  755. MODULE_DEVICE_TABLE(of, meson_spicc_of_match);
  756. static struct platform_driver meson_spicc_driver = {
  757. .probe = meson_spicc_probe,
  758. .remove = meson_spicc_remove,
  759. .driver = {
  760. .name = "meson-spicc",
  761. .of_match_table = of_match_ptr(meson_spicc_of_match),
  762. },
  763. };
  764. module_platform_driver(meson_spicc_driver);
  765. MODULE_DESCRIPTION("Meson SPI Communication Controller driver");
  766. MODULE_AUTHOR("Neil Armstrong <[email protected]>");
  767. MODULE_LICENSE("GPL");