modem_link_device_spi.h 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. /*
  2. * Copyright (C) 2011 Google, Inc.
  3. * Copyright (C) 2010 Samsung Electronics.
  4. *
  5. * This software is licensed under the terms of the GNU General Public
  6. * License version 2, as published by the Free Software Foundation, and
  7. * may be copied, distributed, and modified under those terms.
  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. */
  15. #ifndef __MODEM_LINK_DEVICE_SPI_H__
  16. #define __MODEM_LINK_DEVICE_SPI_H__
  17. #include <linux/wakelock.h>
  18. #include <linux/workqueue.h>
  19. #include <linux/timer.h>
  20. #include <linux/platform_data/modem.h>
  21. #include <linux/semaphore.h>
  22. #define SPI_TIMER_TX_WAIT_TIME 60 /* ms */
  23. #define SPI_TIMER_RX_WAIT_TIME 500 /* ms */
  24. #define SPI_MAX_PACKET_SIZE (2048 * 6)
  25. #define SPI_TASK_EVENT_COUNT 64
  26. #define SPI_DATA_BOF 0x7F
  27. #define SPI_DATA_EOF 0x7E
  28. #define SPI_DATA_FF_PADDING_HEADER 0xFFFFFFFF
  29. #define SPI_DATA_MUX_NORMAL_MASK 0x0F
  30. #define SPI_DATA_MUX_MORE_H 0x10
  31. #define SPI_DATA_MUX_MORE_M 0x20
  32. #define SPI_DATA_MUX_MORE_T 0x30
  33. #define SPI_DATA_MUX_SIZE 2
  34. #define SPI_DATA_LENGTH_SIZE 4
  35. #define SPI_DATA_BOF_SIZE 1
  36. #define SPI_DATA_INNER_LENGTH_SIZE 4
  37. #define SPI_DATA_IPC_INNER_LENGTH_SIZE 2
  38. #define SPI_DATA_IPC_INNER_CONTROL_SIZE 1
  39. #define SPI_DATA_EOF_SIZE 1
  40. #define SPI_DATA_HEADER_SIZE (SPI_DATA_MUX_SIZE+ \
  41. SPI_DATA_LENGTH_SIZE+SPI_DATA_BOF_SIZE+SPI_DATA_EOF_SIZE)
  42. #define SPI_DATA_HEADER_SIZE_FRONT (SPI_DATA_MUX_SIZE+ \
  43. SPI_DATA_LENGTH_SIZE+SPI_DATA_BOF_SIZE)
  44. #define SPI_DATA_IPC_INNER_HEADER_SIZE \
  45. (SPI_DATA_IPC_INNER_LENGTH_SIZE+ \
  46. SPI_DATA_IPC_INNER_CONTROL_SIZE)
  47. #define SPI_DATA_SIZE(X) (SPI_DATA_HEADER_SIZE+X)
  48. #define SPI_DATA_LENGTH_OFFSET SPI_DATA_MUX_SIZE
  49. #define SPI_DATA_BOF_OFFSET (SPI_DATA_LENGTH_OFFSET+ \
  50. SPI_DATA_LENGTH_SIZE)
  51. #define SPI_DATA_DATA_OFFSET (SPI_DATA_BOF_OFFSET+ \
  52. SPI_DATA_BOF_SIZE)
  53. #define SPI_DATA_EOF_OFFSET(X) (SPI_DATA_DATA_OFFSET+X)
  54. #define SPI_DATA_PACKET_HEADER_SIZE 4
  55. #define SPI_DATA_PACKET_MUX_ERROR_SPARE_SIZE 4
  56. #define SPI_DATA_PACKET_MAX_PACKET_BODY_SIZE \
  57. (SPI_MAX_PACKET_SIZE-SPI_DATA_PACKET_HEADER_SIZE- \
  58. SPI_DATA_PACKET_MUX_ERROR_SPARE_SIZE)
  59. #define SPI_DATA_MIN_SIZE (SPI_DATA_HEADER_SIZE*2)
  60. #define SPI_DATA_MAX_SIZE_PER_PACKET (SPI_MAX_PACKET_SIZE- \
  61. SPI_DATA_PACKET_HEADER_SIZE-SPI_DATA_HEADER_SIZE- \
  62. SPI_DATA_PACKET_MUX_ERROR_SPARE_SIZE)
  63. #define SPI_DATA_DIVIDE_BUFFER_SIZE SPI_MAX_PACKET_SIZE
  64. struct spi_work_type {
  65. struct work_struct work;
  66. int signal_code;
  67. };
  68. enum spi_msg_t {
  69. SPI_WORK_SEND,
  70. SPI_WORK_RECEIVE
  71. };
  72. enum spi_work_t {
  73. SPI_WORK,
  74. SPI_WORK_FRONT
  75. };
  76. enum spi_state_t {
  77. SPI_STATE_START, /* before init complete */
  78. SPI_STATE_INIT, /* initialising */
  79. SPI_STATE_IDLE, /* suspend. Waiting for event */
  80. /* state to start tx. Become from idle */
  81. SPI_STATE_TX_START,
  82. SPI_STATE_TX_CONFIRM,
  83. /* (in case of master) */
  84. /* wait srdy rising interrupt to check slave preparing */
  85. /* (in case of slave) */
  86. /* wait submrdy rising interrupt to check sync complete */
  87. SPI_STATE_TX_WAIT,
  88. SPI_STATE_TX_SENDING, /* tx data sending */
  89. SPI_STATE_TX_TERMINATE,
  90. SPI_STATE_TX_MORE,
  91. /* in case of slave, wait submrdy rising interrupt to */
  92. SPI_STATE_RX_WAIT,
  93. /* check sync complete then it starts to read buffer */
  94. SPI_STATE_RX_MORE,
  95. SPI_STATE_RX_TERMINATE,
  96. SPI_STATE_END /* spi task is stopped */
  97. };
  98. enum spi_timer_state_t {
  99. SPI_STATE_TIME_START,
  100. SPI_STATE_TIME_OVER
  101. };
  102. enum spi_gpiolevel_t {
  103. SPI_GPIOLEVEL_LOW = 0,
  104. SPI_GPIOLEVEL_HIGH
  105. };
  106. enum spi_data_type_t {
  107. SPI_DATA_MUX_IPC = 0x01,
  108. SPI_DATA_MUX_RAW = 0x02,
  109. SPI_DATA_MUX_RFS = 0x03,
  110. SPI_DATA_MUX_CMD = 0x04,
  111. };
  112. struct spi_data_packet_header {
  113. /* 12bit : packet size less than SPI_DEV_PACKET_SIZE */
  114. unsigned long current_data_size:31;
  115. /* 1bit : packet division flag */
  116. unsigned long more:1;
  117. };
  118. struct spi_link_device {
  119. struct link_device ld;
  120. /* Link to SPI control functions dependent on each platform */
  121. int max_ipc_dev;
  122. /* Wakelock for SPI device */
  123. struct wake_lock spi_wake_lock;
  124. /* Workqueue for modem bin transfers */
  125. struct workqueue_struct *spi_modem_wq;
  126. /* SPI state */
  127. int spi_state;
  128. /* SPI Timer state */
  129. int spi_timer_tx_state;
  130. int spi_timer_rx_state;
  131. /* SPI GPIO pins */
  132. unsigned int gpio_ipc_mrdy;
  133. unsigned int gpio_ipc_srdy;
  134. unsigned int gpio_ipc_sub_mrdy;
  135. unsigned int gpio_ipc_sub_srdy;
  136. unsigned int gpio_cp_dump_int;
  137. unsigned int gpio_modem_bin_srdy;
  138. /* value for checking spi pin status */
  139. unsigned long mrdy_low_time_save;
  140. unsigned long mrdy_high_time_save;
  141. /* SPI Wait Timer */
  142. struct timer_list spi_tx_timer;
  143. struct timer_list spi_rx_timer;
  144. struct workqueue_struct *spi_wq;
  145. struct spi_work_type spi_work;
  146. /* For send modem bin */
  147. struct work_struct send_modem_w;
  148. struct io_device *iod[MAX_DEV_FORMAT];
  149. struct sk_buff_head skb_rxq[MAX_DEV_FORMAT];
  150. struct sk_buff_head *skb_txq[MAX_IPC_DEV];
  151. /* Multi-purpose miscellaneous buffer */
  152. u8 *buff;
  153. u8 *sync_buff;
  154. struct completion ril_init;
  155. struct semaphore srdy_sem;
  156. int send_modem_spi;
  157. int is_cp_reset;
  158. int boot_done;
  159. int ril_send_modem_img;
  160. unsigned long ril_send_cnt;
  161. void __iomem *p_virtual_buff;
  162. };
  163. /* converts from struct link_device* to struct xxx_link_device* */
  164. #define to_spi_link_device(linkdev) \
  165. container_of(linkdev, struct spi_link_device, ld)
  166. struct spi_v_buff {
  167. unsigned long base;
  168. unsigned long size;
  169. void __iomem *mmio;
  170. };
  171. struct spi_platform_data {
  172. const char *name;
  173. unsigned gpio_ipc_mrdy;
  174. unsigned gpio_ipc_srdy;
  175. unsigned gpio_ipc_sub_mrdy;
  176. unsigned gpio_ipc_sub_srdy;
  177. unsigned gpio_cp_dump_int;
  178. void (*cfg_gpio)(void);
  179. };
  180. extern int sec_bootmode;
  181. extern int get_console_suspended(void);
  182. void spi_work(struct work_struct *work);
  183. /* Send SPRD main image through SPI */
  184. #define SPRD_BLOCK_SIZE 32768
  185. //#define SPRD_BLOCK_SIZE (16*8) // Temp.
  186. //#define SPRD_BLOCK_SIZE (2048)
  187. enum image_type {
  188. MODEM_MAIN,
  189. MODEM_DSP,
  190. MODEM_NV,
  191. MODEM_EFS,
  192. MODEM_RUN,
  193. };
  194. struct image_buf {
  195. unsigned int length;
  196. unsigned int offset;
  197. unsigned int address;
  198. unsigned char *buf;
  199. };
  200. struct sprd_image_buf {
  201. u8 *tx_b;
  202. u8 *rx_b;
  203. u8 *encoded_tx_b;
  204. u8 *decoded_rx_b;
  205. int tx_size;
  206. int rx_size;
  207. int encoded_tx_size;
  208. int decoded_rx_size;
  209. };
  210. /* CRC */
  211. #define CRC_16_POLYNOMIAL 0x1021
  212. #define CRC_16_L_POLYNOMIAL 0x8408
  213. #define CRC_16_L_SEED 0xFFFF
  214. #define CRC_TAB_SIZE 256 /* 2^CRC_TAB_BITS */
  215. #define CRC_16_L_OK 0x0
  216. #define HDLC_FLAG 0x7E
  217. #define HDLC_ESCAPE 0x7D
  218. #define HDLC_ESCAPE_MASK 0x20
  219. #define CRC_CHECK_SIZE 0x02
  220. #if 1 //test dklee data swap
  221. #define M_32_SWAP(a) { \
  222. u32 _tmp; \
  223. _tmp = a; \
  224. ((u8 *)&a)[0] = ((u8 *)&_tmp)[3]; \
  225. ((u8 *)&a)[1] = ((u8 *)&_tmp)[2]; \
  226. ((u8 *)&a)[2] = ((u8 *)&_tmp)[1]; \
  227. ((u8 *)&a)[3] = ((u8 *)&_tmp)[0]; \
  228. }
  229. #define M_16_SWAP(a) { \
  230. u16 _tmp; \
  231. _tmp = (u16)a; \
  232. ((u8 *)&a)[0] = ((u8 *)&_tmp)[1]; \
  233. ((u8 *)&a)[1] = ((u8 *)&_tmp)[0]; \
  234. }
  235. #else
  236. #define M_32_SWAP(a)
  237. #define M_16_SWAP(a)
  238. #endif
  239. #endif