mxc_spi.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448
  1. /*
  2. * Copyright (C) 2008, Guennadi Liakhovetski <lg@denx.de>
  3. *
  4. * This program is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU General Public License as
  6. * published by the Free Software Foundation; either version 2 of
  7. * the License, or (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program; if not, write to the Free Software
  16. * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  17. * MA 02111-1307 USA
  18. *
  19. */
  20. #include <common.h>
  21. #include <malloc.h>
  22. #include <spi.h>
  23. #include <asm/errno.h>
  24. #include <asm/io.h>
  25. #include <mxc_gpio.h>
  26. #ifdef CONFIG_MX27
  27. /* i.MX27 has a completely wrong register layout and register definitions in the
  28. * datasheet, the correct one is in the Freescale's Linux driver */
  29. #error "i.MX27 CSPI not supported due to drastic differences in register definisions" \
  30. "See linux mxc_spi driver from Freescale for details."
  31. #elif defined(CONFIG_MX31)
  32. #include <asm/arch/mx31.h>
  33. #define MXC_CSPIRXDATA 0x00
  34. #define MXC_CSPITXDATA 0x04
  35. #define MXC_CSPICTRL 0x08
  36. #define MXC_CSPIINT 0x0C
  37. #define MXC_CSPIDMA 0x10
  38. #define MXC_CSPISTAT 0x14
  39. #define MXC_CSPIPERIOD 0x18
  40. #define MXC_CSPITEST 0x1C
  41. #define MXC_CSPIRESET 0x00
  42. #define MXC_CSPICTRL_EN (1 << 0)
  43. #define MXC_CSPICTRL_MODE (1 << 1)
  44. #define MXC_CSPICTRL_XCH (1 << 2)
  45. #define MXC_CSPICTRL_SMC (1 << 3)
  46. #define MXC_CSPICTRL_POL (1 << 4)
  47. #define MXC_CSPICTRL_PHA (1 << 5)
  48. #define MXC_CSPICTRL_SSCTL (1 << 6)
  49. #define MXC_CSPICTRL_SSPOL (1 << 7)
  50. #define MXC_CSPICTRL_CHIPSELECT(x) (((x) & 0x3) << 24)
  51. #define MXC_CSPICTRL_BITCOUNT(x) (((x) & 0x1f) << 8)
  52. #define MXC_CSPICTRL_DATARATE(x) (((x) & 0x7) << 16)
  53. #define MXC_CSPICTRL_TC (1 << 8)
  54. #define MXC_CSPICTRL_RXOVF (1 << 6)
  55. #define MXC_CSPICTRL_MAXBITS 0x1f
  56. #define MXC_CSPIPERIOD_32KHZ (1 << 15)
  57. static unsigned long spi_bases[] = {
  58. 0x43fa4000,
  59. 0x50010000,
  60. 0x53f84000,
  61. };
  62. #elif defined(CONFIG_MX51)
  63. #include <asm/arch/imx-regs.h>
  64. #include <asm/arch/clock.h>
  65. #define MXC_CSPIRXDATA 0x00
  66. #define MXC_CSPITXDATA 0x04
  67. #define MXC_CSPICTRL 0x08
  68. #define MXC_CSPICON 0x0C
  69. #define MXC_CSPIINT 0x10
  70. #define MXC_CSPIDMA 0x14
  71. #define MXC_CSPISTAT 0x18
  72. #define MXC_CSPIPERIOD 0x1C
  73. #define MXC_CSPIRESET 0x00
  74. #define MXC_CSPICTRL_EN (1 << 0)
  75. #define MXC_CSPICTRL_MODE (1 << 1)
  76. #define MXC_CSPICTRL_XCH (1 << 2)
  77. #define MXC_CSPICTRL_CHIPSELECT(x) (((x) & 0x3) << 12)
  78. #define MXC_CSPICTRL_BITCOUNT(x) (((x) & 0xfff) << 20)
  79. #define MXC_CSPICTRL_PREDIV(x) (((x) & 0xF) << 12)
  80. #define MXC_CSPICTRL_POSTDIV(x) (((x) & 0xF) << 8)
  81. #define MXC_CSPICTRL_SELCHAN(x) (((x) & 0x3) << 18)
  82. #define MXC_CSPICTRL_MAXBITS 0xfff
  83. #define MXC_CSPICTRL_TC (1 << 7)
  84. #define MXC_CSPICTRL_RXOVF (1 << 6)
  85. #define MXC_CSPIPERIOD_32KHZ (1 << 15)
  86. /* Bit position inside CTRL register to be associated with SS */
  87. #define MXC_CSPICTRL_CHAN 18
  88. /* Bit position inside CON register to be associated with SS */
  89. #define MXC_CSPICON_POL 4
  90. #define MXC_CSPICON_PHA 0
  91. #define MXC_CSPICON_SSPOL 12
  92. static unsigned long spi_bases[] = {
  93. CSPI1_BASE_ADDR,
  94. CSPI2_BASE_ADDR,
  95. CSPI3_BASE_ADDR,
  96. };
  97. #else
  98. #error "Unsupported architecture"
  99. #endif
  100. #define OUT MXC_GPIO_DIRECTION_OUT
  101. struct mxc_spi_slave {
  102. struct spi_slave slave;
  103. unsigned long base;
  104. u32 ctrl_reg;
  105. #if defined(CONFIG_MX51)
  106. u32 cfg_reg;
  107. #endif
  108. int gpio;
  109. int ss_pol;
  110. };
  111. static inline struct mxc_spi_slave *to_mxc_spi_slave(struct spi_slave *slave)
  112. {
  113. return container_of(slave, struct mxc_spi_slave, slave);
  114. }
  115. static inline u32 reg_read(unsigned long addr)
  116. {
  117. return *(volatile unsigned long*)addr;
  118. }
  119. static inline void reg_write(unsigned long addr, u32 val)
  120. {
  121. *(volatile unsigned long*)addr = val;
  122. }
  123. void spi_cs_activate(struct spi_slave *slave)
  124. {
  125. struct mxc_spi_slave *mxcs = to_mxc_spi_slave(slave);
  126. if (mxcs->gpio > 0)
  127. mxc_gpio_set(mxcs->gpio, mxcs->ss_pol);
  128. }
  129. void spi_cs_deactivate(struct spi_slave *slave)
  130. {
  131. struct mxc_spi_slave *mxcs = to_mxc_spi_slave(slave);
  132. if (mxcs->gpio > 0)
  133. mxc_gpio_set(mxcs->gpio,
  134. !(mxcs->ss_pol));
  135. }
  136. #ifdef CONFIG_MX51
  137. static s32 spi_cfg(struct mxc_spi_slave *mxcs, unsigned int cs,
  138. unsigned int max_hz, unsigned int mode)
  139. {
  140. u32 clk_src = mxc_get_clock(MXC_CSPI_CLK);
  141. s32 pre_div = 0, post_div = 0, i, reg_ctrl, reg_config;
  142. u32 ss_pol = 0, sclkpol = 0, sclkpha = 0;
  143. if (max_hz == 0) {
  144. printf("Error: desired clock is 0\n");
  145. return -1;
  146. }
  147. reg_ctrl = reg_read(mxcs->base + MXC_CSPICTRL);
  148. /* Reset spi */
  149. reg_write(mxcs->base + MXC_CSPICTRL, 0);
  150. reg_write(mxcs->base + MXC_CSPICTRL, (reg_ctrl | 0x1));
  151. /*
  152. * The following computation is taken directly from Freescale's code.
  153. */
  154. if (clk_src > max_hz) {
  155. pre_div = clk_src / max_hz;
  156. if (pre_div > 16) {
  157. post_div = pre_div / 16;
  158. pre_div = 15;
  159. }
  160. if (post_div != 0) {
  161. for (i = 0; i < 16; i++) {
  162. if ((1 << i) >= post_div)
  163. break;
  164. }
  165. if (i == 16) {
  166. printf("Error: no divider for the freq: %d\n",
  167. max_hz);
  168. return -1;
  169. }
  170. post_div = i;
  171. }
  172. }
  173. debug("pre_div = %d, post_div=%d\n", pre_div, post_div);
  174. reg_ctrl = (reg_ctrl & ~MXC_CSPICTRL_SELCHAN(3)) |
  175. MXC_CSPICTRL_SELCHAN(cs);
  176. reg_ctrl = (reg_ctrl & ~MXC_CSPICTRL_PREDIV(0x0F)) |
  177. MXC_CSPICTRL_PREDIV(pre_div);
  178. reg_ctrl = (reg_ctrl & ~MXC_CSPICTRL_POSTDIV(0x0F)) |
  179. MXC_CSPICTRL_POSTDIV(post_div);
  180. /* always set to master mode */
  181. reg_ctrl |= 1 << (cs + 4);
  182. /* We need to disable SPI before changing registers */
  183. reg_ctrl &= ~MXC_CSPICTRL_EN;
  184. if (mode & SPI_CS_HIGH)
  185. ss_pol = 1;
  186. if (!(mode & SPI_CPOL))
  187. sclkpol = 1;
  188. if (mode & SPI_CPHA)
  189. sclkpha = 1;
  190. reg_config = reg_read(mxcs->base + MXC_CSPICON);
  191. /*
  192. * Configuration register setup
  193. * The MX51 has support different setup for each SS
  194. */
  195. reg_config = (reg_config & ~(1 << (cs + MXC_CSPICON_SSPOL))) |
  196. (ss_pol << (cs + MXC_CSPICON_SSPOL));
  197. reg_config = (reg_config & ~(1 << (cs + MXC_CSPICON_POL))) |
  198. (sclkpol << (cs + MXC_CSPICON_POL));
  199. reg_config = (reg_config & ~(1 << (cs + MXC_CSPICON_PHA))) |
  200. (sclkpha << (cs + MXC_CSPICON_PHA));
  201. debug("reg_ctrl = 0x%x\n", reg_ctrl);
  202. reg_write(mxcs->base + MXC_CSPICTRL, reg_ctrl);
  203. debug("reg_config = 0x%x\n", reg_config);
  204. reg_write(mxcs->base + MXC_CSPICON, reg_config);
  205. /* save config register and control register */
  206. mxcs->ctrl_reg = reg_ctrl;
  207. mxcs->cfg_reg = reg_config;
  208. /* clear interrupt reg */
  209. reg_write(mxcs->base + MXC_CSPIINT, 0);
  210. reg_write(mxcs->base + MXC_CSPISTAT,
  211. MXC_CSPICTRL_TC | MXC_CSPICTRL_RXOVF);
  212. return 0;
  213. }
  214. #endif
  215. static u32 spi_xchg_single(struct spi_slave *slave, u32 data, int bitlen,
  216. unsigned long flags)
  217. {
  218. struct mxc_spi_slave *mxcs = to_mxc_spi_slave(slave);
  219. if (flags & SPI_XFER_BEGIN)
  220. spi_cs_activate(slave);
  221. mxcs->ctrl_reg = (mxcs->ctrl_reg &
  222. ~MXC_CSPICTRL_BITCOUNT(MXC_CSPICTRL_MAXBITS)) |
  223. MXC_CSPICTRL_BITCOUNT(bitlen - 1);
  224. reg_write(mxcs->base + MXC_CSPICTRL, mxcs->ctrl_reg | MXC_CSPICTRL_EN);
  225. #ifdef CONFIG_MX51
  226. reg_write(mxcs->base + MXC_CSPICON, mxcs->cfg_reg);
  227. #endif
  228. /* Clear interrupt register */
  229. reg_write(mxcs->base + MXC_CSPISTAT,
  230. MXC_CSPICTRL_TC | MXC_CSPICTRL_RXOVF);
  231. debug("Sending SPI 0x%x\n", data);
  232. reg_write(mxcs->base + MXC_CSPITXDATA, data);
  233. /* FIFO is written, now starts the transfer setting the XCH bit */
  234. reg_write(mxcs->base + MXC_CSPICTRL, mxcs->ctrl_reg |
  235. MXC_CSPICTRL_EN | MXC_CSPICTRL_XCH);
  236. /* Wait until the TC (Transfer completed) bit is set */
  237. while ((reg_read(mxcs->base + MXC_CSPISTAT) & MXC_CSPICTRL_TC) == 0)
  238. ;
  239. /* Transfer completed, clear any pending request */
  240. reg_write(mxcs->base + MXC_CSPISTAT,
  241. MXC_CSPICTRL_TC | MXC_CSPICTRL_RXOVF);
  242. data = reg_read(mxcs->base + MXC_CSPIRXDATA);
  243. debug("SPI Rx: 0x%x\n", data);
  244. if (flags & SPI_XFER_END)
  245. spi_cs_deactivate(slave);
  246. return data;
  247. }
  248. int spi_xfer(struct spi_slave *slave, unsigned int bitlen, const void *dout,
  249. void *din, unsigned long flags)
  250. {
  251. int n_blks = (bitlen + 31) / 32;
  252. u32 *out_l, *in_l;
  253. int i;
  254. if ((int)dout & 3 || (int)din & 3) {
  255. printf("Error: unaligned buffers in: %p, out: %p\n", din, dout);
  256. return 1;
  257. }
  258. /* This driver is currently partly broken, alert the user */
  259. if (bitlen > 16 && (bitlen % 32)) {
  260. printf("Error: SPI transfer with bitlen=%d is broken.\n",
  261. bitlen);
  262. return 1;
  263. }
  264. for (i = 0, in_l = (u32 *)din, out_l = (u32 *)dout;
  265. i < n_blks;
  266. i++, in_l++, out_l++, bitlen -= 32) {
  267. u32 data = spi_xchg_single(slave, *out_l, bitlen, flags);
  268. /* Check if we're only transfering 8 or 16 bits */
  269. if (!i) {
  270. if (bitlen < 9)
  271. *(u8 *)din = data;
  272. else if (bitlen < 17)
  273. *(u16 *)din = data;
  274. else
  275. *in_l = data;
  276. }
  277. }
  278. return 0;
  279. }
  280. void spi_init(void)
  281. {
  282. }
  283. static int decode_cs(struct mxc_spi_slave *mxcs, unsigned int cs)
  284. {
  285. int ret;
  286. /*
  287. * Some SPI devices require active chip-select over multiple
  288. * transactions, we achieve this using a GPIO. Still, the SPI
  289. * controller has to be configured to use one of its own chipselects.
  290. * To use this feature you have to call spi_setup_slave() with
  291. * cs = internal_cs | (gpio << 8), and you have to use some unused
  292. * on this SPI controller cs between 0 and 3.
  293. */
  294. if (cs > 3) {
  295. mxcs->gpio = cs >> 8;
  296. cs &= 3;
  297. ret = mxc_gpio_direction(mxcs->gpio, OUT);
  298. if (ret) {
  299. printf("mxc_spi: cannot setup gpio %d\n", mxcs->gpio);
  300. return -EINVAL;
  301. }
  302. } else {
  303. mxcs->gpio = -1;
  304. }
  305. return cs;
  306. }
  307. struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
  308. unsigned int max_hz, unsigned int mode)
  309. {
  310. unsigned int ctrl_reg;
  311. struct mxc_spi_slave *mxcs;
  312. int ret;
  313. if (bus >= ARRAY_SIZE(spi_bases))
  314. return NULL;
  315. mxcs = malloc(sizeof(struct mxc_spi_slave));
  316. if (!mxcs)
  317. return NULL;
  318. ret = decode_cs(mxcs, cs);
  319. if (ret < 0) {
  320. free(mxcs);
  321. return NULL;
  322. }
  323. cs = ret;
  324. mxcs->slave.bus = bus;
  325. mxcs->slave.cs = cs;
  326. mxcs->base = spi_bases[bus];
  327. mxcs->ss_pol = (mode & SPI_CS_HIGH) ? 1 : 0;
  328. #ifdef CONFIG_MX51
  329. /* Can be used for i.MX31 too ? */
  330. ctrl_reg = 0;
  331. ret = spi_cfg(mxcs, cs, max_hz, mode);
  332. if (ret) {
  333. printf("mxc_spi: cannot setup SPI controller\n");
  334. free(mxcs);
  335. return NULL;
  336. }
  337. #else
  338. ctrl_reg = MXC_CSPICTRL_CHIPSELECT(cs) |
  339. MXC_CSPICTRL_BITCOUNT(31) |
  340. MXC_CSPICTRL_DATARATE(7) | /* FIXME: calculate data rate */
  341. MXC_CSPICTRL_EN |
  342. MXC_CSPICTRL_MODE;
  343. if (mode & SPI_CPHA)
  344. ctrl_reg |= MXC_CSPICTRL_PHA;
  345. if (!(mode & SPI_CPOL))
  346. ctrl_reg |= MXC_CSPICTRL_POL;
  347. if (mode & SPI_CS_HIGH)
  348. ctrl_reg |= MXC_CSPICTRL_SSPOL;
  349. mxcs->ctrl_reg = ctrl_reg;
  350. #endif
  351. return &mxcs->slave;
  352. }
  353. void spi_free_slave(struct spi_slave *slave)
  354. {
  355. struct mxc_spi_slave *mxcs = to_mxc_spi_slave(slave);
  356. free(mxcs);
  357. }
  358. int spi_claim_bus(struct spi_slave *slave)
  359. {
  360. struct mxc_spi_slave *mxcs = to_mxc_spi_slave(slave);
  361. reg_write(mxcs->base + MXC_CSPIRESET, 1);
  362. udelay(1);
  363. reg_write(mxcs->base + MXC_CSPICTRL, mxcs->ctrl_reg);
  364. reg_write(mxcs->base + MXC_CSPIPERIOD,
  365. MXC_CSPIPERIOD_32KHZ);
  366. reg_write(mxcs->base + MXC_CSPIINT, 0);
  367. return 0;
  368. }
  369. void spi_release_bus(struct spi_slave *slave)
  370. {
  371. /* TODO: Shut the controller down */
  372. }