linux_wlan_spi.c 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. #include <linux/module.h>
  2. #include <linux/init.h>
  3. #include <linux/kernel.h>
  4. #include <linux/fs.h>
  5. #include <linux/slab.h>
  6. #include <linux/types.h>
  7. #include <linux/cdev.h>
  8. #include <linux/uaccess.h>
  9. #include <linux/device.h>
  10. #include <linux/spi/spi.h>
  11. #include "linux_wlan_common.h"
  12. #include "linux_wlan_spi.h"
  13. #define USE_SPI_DMA 0 /* johnny add */
  14. #ifdef WILC_ASIC_A0
  15. #if defined(PLAT_PANDA_ES_OMAP4460)
  16. #define MIN_SPEED 12000000
  17. #define MAX_SPEED 24000000
  18. #elif defined(PLAT_WMS8304)
  19. #define MIN_SPEED 12000000
  20. #define MAX_SPEED 24000000 /* 4000000 */
  21. #elif defined(CUSTOMER_PLATFORM)
  22. /*
  23. TODO : define Clock speed under 48M.
  24. *
  25. * ex)
  26. * #define MIN_SPEED 24000000
  27. * #define MAX_SPEED 48000000
  28. */
  29. #else
  30. #define MIN_SPEED 24000000
  31. #define MAX_SPEED 48000000
  32. #endif
  33. #else /* WILC_ASIC_A0 */
  34. /* Limit clk to 6MHz on FPGA. */
  35. #define MIN_SPEED 6000000
  36. #define MAX_SPEED 6000000
  37. #endif /* WILC_ASIC_A0 */
  38. static u32 SPEED = MIN_SPEED;
  39. struct spi_device *wilc_spi_dev;
  40. void linux_spi_deinit(void *vp);
  41. static int __init wilc_bus_probe(struct spi_device *spi)
  42. {
  43. PRINT_D(BUS_DBG, "spiModalias: %s\n", spi->modalias);
  44. PRINT_D(BUS_DBG, "spiMax-Speed: %d\n", spi->max_speed_hz);
  45. wilc_spi_dev = spi;
  46. printk("Driver Initializing success\n");
  47. return 0;
  48. }
  49. static int __exit wilc_bus_remove(struct spi_device *spi)
  50. {
  51. return 0;
  52. }
  53. #ifdef CONFIG_OF
  54. static const struct of_device_id wilc1000_of_match[] = {
  55. { .compatible = "atmel,wilc_spi", },
  56. {}
  57. };
  58. MODULE_DEVICE_TABLE(of, wilc1000_of_match);
  59. #endif
  60. struct spi_driver wilc_bus __refdata = {
  61. .driver = {
  62. .name = MODALIAS,
  63. #ifdef CONFIG_OF
  64. .of_match_table = wilc1000_of_match,
  65. #endif
  66. },
  67. .probe = wilc_bus_probe,
  68. .remove = __exit_p(wilc_bus_remove),
  69. };
  70. void linux_spi_deinit(void *vp)
  71. {
  72. spi_unregister_driver(&wilc_bus);
  73. SPEED = MIN_SPEED;
  74. PRINT_ER("@@@@@@@@@@@@ restore SPI speed to %d @@@@@@@@@\n", SPEED);
  75. }
  76. int linux_spi_init(void *vp)
  77. {
  78. int ret = 1;
  79. static int called;
  80. if (called == 0) {
  81. called++;
  82. ret = spi_register_driver(&wilc_bus);
  83. }
  84. /* change return value to match WILC interface */
  85. (ret < 0) ? (ret = 0) : (ret = 1);
  86. return ret;
  87. }
  88. #if defined(PLAT_WMS8304)
  89. #define TXRX_PHASE_SIZE (4096)
  90. #endif
  91. #if defined(TXRX_PHASE_SIZE)
  92. int linux_spi_write(u8 *b, u32 len)
  93. {
  94. int ret;
  95. if (len > 0 && b != NULL) {
  96. int i = 0;
  97. int blk = len / TXRX_PHASE_SIZE;
  98. int remainder = len % TXRX_PHASE_SIZE;
  99. char *r_buffer = kzalloc(TXRX_PHASE_SIZE, GFP_KERNEL);
  100. if (!r_buffer)
  101. return -ENOMEM;
  102. if (blk) {
  103. while (i < blk) {
  104. struct spi_message msg;
  105. struct spi_transfer tr = {
  106. .tx_buf = b + (i * TXRX_PHASE_SIZE),
  107. .len = TXRX_PHASE_SIZE,
  108. .speed_hz = SPEED,
  109. .bits_per_word = 8,
  110. .delay_usecs = 0,
  111. };
  112. tr.rx_buf = r_buffer;
  113. memset(&msg, 0, sizeof(msg));
  114. spi_message_init(&msg);
  115. msg.spi = wilc_spi_dev;
  116. msg.is_dma_mapped = USE_SPI_DMA;
  117. spi_message_add_tail(&tr, &msg);
  118. ret = spi_sync(wilc_spi_dev, &msg);
  119. if (ret < 0) {
  120. PRINT_ER("SPI transaction failed\n");
  121. }
  122. i++;
  123. }
  124. }
  125. if (remainder) {
  126. struct spi_message msg;
  127. struct spi_transfer tr = {
  128. .tx_buf = b + (blk * TXRX_PHASE_SIZE),
  129. .len = remainder,
  130. .speed_hz = SPEED,
  131. .bits_per_word = 8,
  132. .delay_usecs = 0,
  133. };
  134. tr.rx_buf = r_buffer;
  135. memset(&msg, 0, sizeof(msg));
  136. spi_message_init(&msg);
  137. msg.spi = wilc_spi_dev;
  138. msg.is_dma_mapped = USE_SPI_DMA; /* rachel */
  139. spi_message_add_tail(&tr, &msg);
  140. ret = spi_sync(wilc_spi_dev, &msg);
  141. if (ret < 0) {
  142. PRINT_ER("SPI transaction failed\n");
  143. }
  144. }
  145. kfree(r_buffer);
  146. } else {
  147. PRINT_ER("can't write data with the following length: %d\n", len);
  148. PRINT_ER("FAILED due to NULL buffer or ZERO length check the following length: %d\n", len);
  149. ret = -1;
  150. }
  151. /* change return value to match WILC interface */
  152. (ret < 0) ? (ret = 0) : (ret = 1);
  153. return ret;
  154. }
  155. #else
  156. int linux_spi_write(u8 *b, u32 len)
  157. {
  158. int ret;
  159. struct spi_message msg;
  160. if (len > 0 && b != NULL) {
  161. struct spi_transfer tr = {
  162. .tx_buf = b,
  163. .len = len,
  164. .speed_hz = SPEED,
  165. .delay_usecs = 0,
  166. };
  167. char *r_buffer = kzalloc(len, GFP_KERNEL);
  168. if (!r_buffer)
  169. return -ENOMEM;
  170. tr.rx_buf = r_buffer;
  171. PRINT_D(BUS_DBG, "Request writing %d bytes\n", len);
  172. memset(&msg, 0, sizeof(msg));
  173. spi_message_init(&msg);
  174. /* [[johnny add */
  175. msg.spi = wilc_spi_dev;
  176. msg.is_dma_mapped = USE_SPI_DMA;
  177. /* ]] */
  178. spi_message_add_tail(&tr, &msg);
  179. ret = spi_sync(wilc_spi_dev, &msg);
  180. if (ret < 0) {
  181. PRINT_ER("SPI transaction failed\n");
  182. }
  183. kfree(r_buffer);
  184. } else {
  185. PRINT_ER("can't write data with the following length: %d\n", len);
  186. PRINT_ER("FAILED due to NULL buffer or ZERO length check the following length: %d\n", len);
  187. ret = -1;
  188. }
  189. /* change return value to match WILC interface */
  190. (ret < 0) ? (ret = 0) : (ret = 1);
  191. return ret;
  192. }
  193. #endif
  194. #if defined(TXRX_PHASE_SIZE)
  195. int linux_spi_read(u8 *rb, u32 rlen)
  196. {
  197. int ret;
  198. if (rlen > 0) {
  199. int i = 0;
  200. int blk = rlen / TXRX_PHASE_SIZE;
  201. int remainder = rlen % TXRX_PHASE_SIZE;
  202. char *t_buffer = kzalloc(TXRX_PHASE_SIZE, GFP_KERNEL);
  203. if (!t_buffer)
  204. return -ENOMEM;
  205. if (blk) {
  206. while (i < blk) {
  207. struct spi_message msg;
  208. struct spi_transfer tr = {
  209. .rx_buf = rb + (i * TXRX_PHASE_SIZE),
  210. .len = TXRX_PHASE_SIZE,
  211. .speed_hz = SPEED,
  212. .bits_per_word = 8,
  213. .delay_usecs = 0,
  214. };
  215. tr.tx_buf = t_buffer;
  216. memset(&msg, 0, sizeof(msg));
  217. spi_message_init(&msg);
  218. msg.spi = wilc_spi_dev;
  219. msg.is_dma_mapped = USE_SPI_DMA;
  220. spi_message_add_tail(&tr, &msg);
  221. ret = spi_sync(wilc_spi_dev, &msg);
  222. if (ret < 0) {
  223. PRINT_ER("SPI transaction failed\n");
  224. }
  225. i++;
  226. }
  227. }
  228. if (remainder) {
  229. struct spi_message msg;
  230. struct spi_transfer tr = {
  231. .rx_buf = rb + (blk * TXRX_PHASE_SIZE),
  232. .len = remainder,
  233. .speed_hz = SPEED,
  234. .bits_per_word = 8,
  235. .delay_usecs = 0,
  236. };
  237. tr.tx_buf = t_buffer;
  238. memset(&msg, 0, sizeof(msg));
  239. spi_message_init(&msg);
  240. msg.spi = wilc_spi_dev;
  241. msg.is_dma_mapped = USE_SPI_DMA; /* rachel */
  242. spi_message_add_tail(&tr, &msg);
  243. ret = spi_sync(wilc_spi_dev, &msg);
  244. if (ret < 0) {
  245. PRINT_ER("SPI transaction failed\n");
  246. }
  247. }
  248. kfree(t_buffer);
  249. } else {
  250. PRINT_ER("can't read data with the following length: %u\n", rlen);
  251. ret = -1;
  252. }
  253. /* change return value to match WILC interface */
  254. (ret < 0) ? (ret = 0) : (ret = 1);
  255. return ret;
  256. }
  257. #else
  258. int linux_spi_read(u8 *rb, u32 rlen)
  259. {
  260. int ret;
  261. if (rlen > 0) {
  262. struct spi_message msg;
  263. struct spi_transfer tr = {
  264. .rx_buf = rb,
  265. .len = rlen,
  266. .speed_hz = SPEED,
  267. .delay_usecs = 0,
  268. };
  269. char *t_buffer = kzalloc(rlen, GFP_KERNEL);
  270. if (!t_buffer)
  271. return -ENOMEM;
  272. tr.tx_buf = t_buffer;
  273. memset(&msg, 0, sizeof(msg));
  274. spi_message_init(&msg);
  275. /* [[ johnny add */
  276. msg.spi = wilc_spi_dev;
  277. msg.is_dma_mapped = USE_SPI_DMA;
  278. /* ]] */
  279. spi_message_add_tail(&tr, &msg);
  280. ret = spi_sync(wilc_spi_dev, &msg);
  281. if (ret < 0) {
  282. PRINT_ER("SPI transaction failed\n");
  283. }
  284. kfree(t_buffer);
  285. } else {
  286. PRINT_ER("can't read data with the following length: %u\n", rlen);
  287. ret = -1;
  288. }
  289. /* change return value to match WILC interface */
  290. (ret < 0) ? (ret = 0) : (ret = 1);
  291. return ret;
  292. }
  293. #endif
  294. int linux_spi_write_read(u8 *wb, u8 *rb, u32 rlen)
  295. {
  296. int ret;
  297. if (rlen > 0) {
  298. struct spi_message msg;
  299. struct spi_transfer tr = {
  300. .rx_buf = rb,
  301. .tx_buf = wb,
  302. .len = rlen,
  303. .speed_hz = SPEED,
  304. .bits_per_word = 8,
  305. .delay_usecs = 0,
  306. };
  307. memset(&msg, 0, sizeof(msg));
  308. spi_message_init(&msg);
  309. msg.spi = wilc_spi_dev;
  310. msg.is_dma_mapped = USE_SPI_DMA;
  311. spi_message_add_tail(&tr, &msg);
  312. ret = spi_sync(wilc_spi_dev, &msg);
  313. if (ret < 0) {
  314. PRINT_ER("SPI transaction failed\n");
  315. }
  316. } else {
  317. PRINT_ER("can't read data with the following length: %u\n", rlen);
  318. ret = -1;
  319. }
  320. /* change return value to match WILC interface */
  321. (ret < 0) ? (ret = 0) : (ret = 1);
  322. return ret;
  323. }
  324. int linux_spi_set_max_speed(void)
  325. {
  326. SPEED = MAX_SPEED;
  327. PRINT_INFO(BUS_DBG, "@@@@@@@@@@@@ change SPI speed to %d @@@@@@@@@\n", SPEED);
  328. return 1;
  329. }