spi-clps711x.c 7.1 KB

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