spi-clps711x.c 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. /*
  2. * CLPS711X SPI bus driver
  3. *
  4. * Copyright (C) 2012 Alexander Shiyan <shc_work@mail.ru>
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 2 of the License, or
  9. * (at your option) any later version.
  10. */
  11. #include <linux/io.h>
  12. #include <linux/clk.h>
  13. #include <linux/init.h>
  14. #include <linux/gpio.h>
  15. #include <linux/delay.h>
  16. #include <linux/module.h>
  17. #include <linux/interrupt.h>
  18. #include <linux/platform_device.h>
  19. #include <linux/spi/spi.h>
  20. #include <linux/platform_data/spi-clps711x.h>
  21. #include <mach/hardware.h>
  22. #define DRIVER_NAME "spi-clps711x"
  23. struct spi_clps711x_data {
  24. struct completion done;
  25. struct clk *spi_clk;
  26. u32 max_speed_hz;
  27. u8 *tx_buf;
  28. u8 *rx_buf;
  29. int count;
  30. int len;
  31. int chipselect[0];
  32. };
  33. static int spi_clps711x_setup(struct spi_device *spi)
  34. {
  35. struct spi_clps711x_data *hw = spi_master_get_devdata(spi->master);
  36. if (spi->bits_per_word != 8) {
  37. dev_err(&spi->dev, "Unsupported master bus width %i\n",
  38. spi->bits_per_word);
  39. return -EINVAL;
  40. }
  41. /* We are expect that SPI-device is not selected */
  42. gpio_direction_output(hw->chipselect[spi->chip_select],
  43. !(spi->mode & SPI_CS_HIGH));
  44. return 0;
  45. }
  46. static void spi_clps711x_setup_mode(struct spi_device *spi)
  47. {
  48. /* Setup edge for transfer */
  49. if (spi->mode & SPI_CPHA)
  50. clps_writew(clps_readw(SYSCON3) | SYSCON3_ADCCKNSEN, SYSCON3);
  51. else
  52. clps_writew(clps_readw(SYSCON3) & ~SYSCON3_ADCCKNSEN, SYSCON3);
  53. }
  54. static int spi_clps711x_setup_xfer(struct spi_device *spi,
  55. struct spi_transfer *xfer)
  56. {
  57. u32 speed = xfer->speed_hz ? : spi->max_speed_hz;
  58. u8 bpw = xfer->bits_per_word;
  59. struct spi_clps711x_data *hw = spi_master_get_devdata(spi->master);
  60. if (bpw != 8) {
  61. dev_err(&spi->dev, "Unsupported master bus width %i\n", bpw);
  62. return -EINVAL;
  63. }
  64. /* Setup SPI frequency divider */
  65. if (!speed || (speed >= hw->max_speed_hz))
  66. clps_writel((clps_readl(SYSCON1) & ~SYSCON1_ADCKSEL_MASK) |
  67. SYSCON1_ADCKSEL(3), SYSCON1);
  68. else if (speed >= (hw->max_speed_hz / 2))
  69. clps_writel((clps_readl(SYSCON1) & ~SYSCON1_ADCKSEL_MASK) |
  70. SYSCON1_ADCKSEL(2), SYSCON1);
  71. else if (speed >= (hw->max_speed_hz / 8))
  72. clps_writel((clps_readl(SYSCON1) & ~SYSCON1_ADCKSEL_MASK) |
  73. SYSCON1_ADCKSEL(1), SYSCON1);
  74. else
  75. clps_writel((clps_readl(SYSCON1) & ~SYSCON1_ADCKSEL_MASK) |
  76. SYSCON1_ADCKSEL(0), SYSCON1);
  77. return 0;
  78. }
  79. static int spi_clps711x_transfer_one_message(struct spi_master *master,
  80. struct spi_message *msg)
  81. {
  82. struct spi_clps711x_data *hw = spi_master_get_devdata(master);
  83. struct spi_transfer *xfer;
  84. int status = 0, cs = hw->chipselect[msg->spi->chip_select];
  85. u32 data;
  86. spi_clps711x_setup_mode(msg->spi);
  87. list_for_each_entry(xfer, &msg->transfers, transfer_list) {
  88. if (spi_clps711x_setup_xfer(msg->spi, xfer)) {
  89. status = -EINVAL;
  90. goto out_xfr;
  91. }
  92. gpio_set_value(cs, !!(msg->spi->mode & SPI_CS_HIGH));
  93. INIT_COMPLETION(hw->done);
  94. hw->count = 0;
  95. hw->len = xfer->len;
  96. hw->tx_buf = (u8 *)xfer->tx_buf;
  97. hw->rx_buf = (u8 *)xfer->rx_buf;
  98. /* Initiate transfer */
  99. data = hw->tx_buf ? hw->tx_buf[hw->count] : 0;
  100. clps_writel(data | SYNCIO_FRMLEN(8) | SYNCIO_TXFRMEN, SYNCIO);
  101. wait_for_completion(&hw->done);
  102. if (xfer->delay_usecs)
  103. udelay(xfer->delay_usecs);
  104. if (xfer->cs_change ||
  105. list_is_last(&xfer->transfer_list, &msg->transfers))
  106. gpio_set_value(cs, !(msg->spi->mode & SPI_CS_HIGH));
  107. msg->actual_length += xfer->len;
  108. }
  109. out_xfr:
  110. msg->status = status;
  111. spi_finalize_current_message(master);
  112. return 0;
  113. }
  114. static irqreturn_t spi_clps711x_isr(int irq, void *dev_id)
  115. {
  116. struct spi_clps711x_data *hw = (struct spi_clps711x_data *)dev_id;
  117. u32 data;
  118. /* Handle RX */
  119. data = clps_readb(SYNCIO);
  120. if (hw->rx_buf)
  121. hw->rx_buf[hw->count] = (u8)data;
  122. hw->count++;
  123. /* Handle TX */
  124. if (hw->count < hw->len) {
  125. data = hw->tx_buf ? hw->tx_buf[hw->count] : 0;
  126. clps_writel(data | SYNCIO_FRMLEN(8) | SYNCIO_TXFRMEN, SYNCIO);
  127. } else
  128. complete(&hw->done);
  129. return IRQ_HANDLED;
  130. }
  131. static int spi_clps711x_probe(struct platform_device *pdev)
  132. {
  133. int i, ret;
  134. struct spi_master *master;
  135. struct spi_clps711x_data *hw;
  136. struct spi_clps711x_pdata *pdata = dev_get_platdata(&pdev->dev);
  137. if (!pdata) {
  138. dev_err(&pdev->dev, "No platform data supplied\n");
  139. return -EINVAL;
  140. }
  141. if (pdata->num_chipselect < 1) {
  142. dev_err(&pdev->dev, "At least one CS must be defined\n");
  143. return -EINVAL;
  144. }
  145. master = spi_alloc_master(&pdev->dev,
  146. sizeof(struct spi_clps711x_data) +
  147. sizeof(int) * pdata->num_chipselect);
  148. if (!master) {
  149. dev_err(&pdev->dev, "SPI allocating memory error\n");
  150. return -ENOMEM;
  151. }
  152. master->bus_num = pdev->id;
  153. master->mode_bits = SPI_CPHA | SPI_CS_HIGH;
  154. master->num_chipselect = pdata->num_chipselect;
  155. master->setup = spi_clps711x_setup;
  156. master->transfer_one_message = spi_clps711x_transfer_one_message;
  157. hw = spi_master_get_devdata(master);
  158. for (i = 0; i < master->num_chipselect; i++) {
  159. hw->chipselect[i] = pdata->chipselect[i];
  160. if (!gpio_is_valid(hw->chipselect[i])) {
  161. dev_err(&pdev->dev, "Invalid CS GPIO %i\n", i);
  162. ret = -EINVAL;
  163. goto err_out;
  164. }
  165. if (gpio_request(hw->chipselect[i], DRIVER_NAME)) {
  166. dev_err(&pdev->dev, "Can't get CS GPIO %i\n", i);
  167. ret = -EINVAL;
  168. goto err_out;
  169. }
  170. }
  171. hw->spi_clk = devm_clk_get(&pdev->dev, "spi");
  172. if (IS_ERR(hw->spi_clk)) {
  173. dev_err(&pdev->dev, "Can't get clocks\n");
  174. ret = PTR_ERR(hw->spi_clk);
  175. goto err_out;
  176. }
  177. hw->max_speed_hz = clk_get_rate(hw->spi_clk);
  178. init_completion(&hw->done);
  179. platform_set_drvdata(pdev, master);
  180. /* Disable extended mode due hardware problems */
  181. clps_writew(clps_readw(SYSCON3) & ~SYSCON3_ADCCON, SYSCON3);
  182. /* Clear possible pending interrupt */
  183. clps_readl(SYNCIO);
  184. ret = devm_request_irq(&pdev->dev, IRQ_SSEOTI, spi_clps711x_isr, 0,
  185. dev_name(&pdev->dev), hw);
  186. if (ret) {
  187. dev_err(&pdev->dev, "Can't request IRQ\n");
  188. clk_put(hw->spi_clk);
  189. goto clk_out;
  190. }
  191. ret = spi_register_master(master);
  192. if (!ret) {
  193. dev_info(&pdev->dev,
  194. "SPI bus driver initialized. Master clock %u Hz\n",
  195. hw->max_speed_hz);
  196. return 0;
  197. }
  198. dev_err(&pdev->dev, "Failed to register master\n");
  199. devm_free_irq(&pdev->dev, IRQ_SSEOTI, hw);
  200. clk_out:
  201. devm_clk_put(&pdev->dev, hw->spi_clk);
  202. err_out:
  203. while (--i >= 0)
  204. if (gpio_is_valid(hw->chipselect[i]))
  205. gpio_free(hw->chipselect[i]);
  206. platform_set_drvdata(pdev, NULL);
  207. spi_master_put(master);
  208. kfree(master);
  209. return ret;
  210. }
  211. static int spi_clps711x_remove(struct platform_device *pdev)
  212. {
  213. int i;
  214. struct spi_master *master = platform_get_drvdata(pdev);
  215. struct spi_clps711x_data *hw = spi_master_get_devdata(master);
  216. devm_free_irq(&pdev->dev, IRQ_SSEOTI, hw);
  217. for (i = 0; i < master->num_chipselect; i++)
  218. if (gpio_is_valid(hw->chipselect[i]))
  219. gpio_free(hw->chipselect[i]);
  220. devm_clk_put(&pdev->dev, hw->spi_clk);
  221. platform_set_drvdata(pdev, NULL);
  222. spi_unregister_master(master);
  223. kfree(master);
  224. return 0;
  225. }
  226. static struct platform_driver clps711x_spi_driver = {
  227. .driver = {
  228. .name = DRIVER_NAME,
  229. .owner = THIS_MODULE,
  230. },
  231. .probe = spi_clps711x_probe,
  232. .remove = spi_clps711x_remove,
  233. };
  234. module_platform_driver(clps711x_spi_driver);
  235. MODULE_LICENSE("GPL");
  236. MODULE_AUTHOR("Alexander Shiyan <shc_work@mail.ru>");
  237. MODULE_DESCRIPTION("CLPS711X SPI bus driver");