cbp_sdio.h 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. /*
  2. *drivers/mmc/card/cbp_sdio.h
  3. *
  4. *VIA CBP SDIO driver for Linux
  5. *
  6. *Copyright (C) 2009 VIA TELECOM Corporation, Inc.
  7. *Author: VIA TELECOM Corporation, Inc.
  8. *
  9. *This package is free software; you can redistribute it and/or modify
  10. *it under the terms of the GNU General Public License version 2 as
  11. *published by the Free Software Foundation.
  12. *
  13. *THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  14. *IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  15. *WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  16. */
  17. #ifndef CBP_SDIO_H
  18. #define CBP_SDIO_H
  19. #include <linux/init.h>
  20. #include <linux/kernel.h>
  21. #include <linux/mmc/host.h>
  22. #include "c2k_hw.h"
  23. #define DRIVER_NAME "cbp"
  24. #ifndef CONFIG_EVDO_DT_VIA_SUPPORT
  25. #ifdef BIT
  26. #undef BIT
  27. #endif
  28. #define BIT(n) (0x1<<n)
  29. /*The Bellow Definition is for Driver Domain Control Register*/
  30. #define SDIO_CCIR 0x0000 /*Chip ID */
  31. #define SDIO_CHLPCR 0x0004 /*HIF Low Power Control */
  32. #define SDIO_CSDIOCSR 0x0008 /*SDIO Status Register */
  33. #define SDIO_CHCR 0x000C /*HIF Control Register */
  34. #define SDIO_CHISR 0x0010 /*HIF Interrupt Status */
  35. #define SDIO_CHIER 0x0014 /*HIF Interrupt Enable */
  36. #define SDIO_CTDR 0x0018 /*Tx Data Port */
  37. #define SDIO_CRDR 0x001C /*Rx Data Port */
  38. #define SDIO_CTFSR 0x0020 /*Tx FIFO Status */
  39. #define SDIO_CRPLR 0x0024 /*Rx Packet Length */
  40. #define SDIO_CTMDR 0x00B0 /*Test Mode Data Port Register */
  41. #define SDIO_CTMCR 0x00B4 /*Test Mode Control Register */
  42. #define SDIO_CTMDPCR0 0x00B8 /*Test Mode Data Pattern 0 */
  43. #define SDIO_CTMDPCR1 0x00BC /*Test Mode Data Pattern 1 */
  44. #define SDIO_CSR 0x00D8 /*Snapshot Register */
  45. #define SDIO_CLKIOCR 0x0100
  46. #define SDIO_CMDIOCR 0x0104
  47. #define SDIO_DAT0IOCR 0x0108
  48. #define SDIO_DAT1IOCR 0x010C
  49. #define SDIO_DAT2IOCR 0x0110
  50. #define SDIO_DAT3IOCR 0x0114
  51. #define SDIO_CLKDLYCR 0x0118
  52. #define SDIO_CMDDLYCR 0x011C
  53. #define SDIO_ODATDLYCR 0x0120
  54. #define SDIO_IDATDLYCR1 0x0124
  55. #define SDIO_IDATDLYCR2 0x0128
  56. #define SDIO_ILHCR 0x012C
  57. #define SDIO_CCIR_G_FUNC_RDY BIT(23)
  58. #define SDIO_CCIR_F_FUNC_RDY BIT(22)
  59. #define SDIO_CCIR_B_FUNC_RDY BIT(21)
  60. #define SDIO_CCIR_POR_INDICATOR BIT(20)
  61. #define SDIO_CCIR_REVISION_ID 0x000F0000
  62. #define SDIO_CCIR_CHIP_ID 0x0000FFFF
  63. #define SDIO_CHLPCR_FW_OWN_REQ_CLR BIT(9) /*Get ownership from FW */
  64. #define SDIO_CHLPCR_FW_OWN_REQ_SET BIT(8) /*Give ownership to FW */
  65. #define SDIO_CHLPCR_INT_EN_CLR BIT(1) /*Clr will disable interrupt out to host */
  66. #define SDIO_CHLPCR_INT_EN_SET BIT(0) /*Set will enable interrupt out to host */
  67. /*Enable/disable response to CMD7 re-select */
  68. #define SDIO_CSDIOCSR_PB_CMD7_RESELECT_DIS BIT(3)
  69. #define SDIO_CSDIOCSR_SDIO_INT_CTL BIT(2) /*Enable/disable Async interrupt */
  70. #define SDIO_CSDIOCSR_SDIO_BUSY_EN BIT(1) /*Enable/disable write busy signal */
  71. #define SDIO_CSDIOCSR_SDIO_RE_INIT_EN BIT(0) /*If set, it will let CMD5 reset SDIO IP */
  72. #define SDIO_CHCR_INT_CLR_CTRL BIT(1) /*Control Read-Clear or Write-1-Clear */
  73. #define SDIO_CHISR_RX_PKT_LEN 0xFFFF0000
  74. #define SDIO_CHISR_FIRMWARE_INT 0x0000FE00
  75. #define SDIO_CHISR_TX_OVERFLOW BIT(8)
  76. #define SDIO_CHISR_FW_INT_INDICATOR BIT(7)
  77. #define SDIO_CHISR_TX_CMPLT_CNT 0x00000070
  78. #define SDIO_CHISR_TX_UNDER_THOLD BIT(3)
  79. #define SDIO_CHISR_TX_EMPTY BIT(2)
  80. #define SDIO_CHISR_RX_RDY BIT(1)
  81. #define SDIO_CHISR_FW_OWN_BACK BIT(0)
  82. #define SDIO_CHIER_FIRMWARE_INT_EN 0x0000FE00
  83. #define SDIO_CHIER_TX_OVERFLOW_EN BIT(8)
  84. #define SDIO_CHIER_FW_INT_INDICATOR_EN BIT(7)
  85. #define SDIO_CHIER_TX_UNDER_THOLD_EN BIT(3)
  86. #define SDIO_CHIER_TX_EMPTY_EN BIT(2)
  87. #define SDIO_CHIER_RX_RDY_EN BIT(1)
  88. #define SDIO_CHIER_FW_OWN_BACK_EN BIT(0)
  89. #define SDIO_CTFSR_TX_FIFO_CNT 0x000000FF /*in unit of 16byte */
  90. #define SDIO_CRPLR_RX_PKT_LEN 0xFFFF0000 /*in unit of byte */
  91. #define SDIO_CTMCR_FW_OWN BIT(24)
  92. #define SDIO_CTMCR_PRBS_INIT_VAL 0x00FF0000
  93. #define SDIO_CTMCR_TEST_MODE_STATUS BIT(8)
  94. #define SDIO_CTMCT_TEST_MODE_SELECT 0x00000003
  95. #endif
  96. struct cbp_wait_event {
  97. wait_queue_head_t wait_q;
  98. atomic_t state;
  99. int wait_gpio;
  100. int wait_polar;
  101. };
  102. struct cbp_reset {
  103. struct mmc_host *host;
  104. const char *name;
  105. struct workqueue_struct *reset_wq;
  106. struct work_struct reset_work;
  107. struct timer_list timer_gpio;
  108. int rst_ind_gpio;
  109. int rst_ind_polar;
  110. };
  111. struct cbp_exception {
  112. struct mmc_host *host;
  113. const char *name;
  114. struct workqueue_struct *excp_wq;
  115. struct work_struct excp_work;
  116. struct timer_list timer_gpio;
  117. int excp_ind_gpio;
  118. int excp_ind_polar;
  119. };
  120. struct cbp_platform_data {
  121. char *bus;
  122. char *host_id;
  123. bool ipc_enable;
  124. bool data_ack_enable;
  125. bool rst_ind_enable;
  126. bool flow_ctrl_enable;
  127. bool tx_disable_irq;
  128. struct asc_config *tx_handle;
  129. int gpio_ap_wkup_cp;
  130. int gpio_cp_ready;
  131. int gpio_cp_wkup_ap;
  132. int gpio_ap_ready;
  133. int gpio_sync_polar;
  134. #ifndef CONFIG_EVDO_DT_VIA_SUPPORT
  135. int gpio_cp_exception;
  136. int c2k_wdt_irq_id;
  137. #endif
  138. int gpio_data_ack;
  139. int gpio_data_ack_polar;
  140. int gpio_rst_ind;
  141. int gpio_rst_ind_polar;
  142. int gpio_flow_ctrl;
  143. int gpio_flow_ctrl_polar;
  144. int gpio_pwr_on;
  145. int gpio_rst;
  146. /*for the level transfor chip fssd06 */
  147. int gpio_sd_select;
  148. int gpio_mc3_enable;
  149. struct sdio_modem *modem;
  150. struct cbp_wait_event *cbp_data_ack;
  151. void (*data_ack_wait_event)(struct cbp_wait_event *pdata_ack);
  152. struct cbp_wait_event *cbp_flow_ctrl;
  153. void (*flow_ctrl_wait_event)(struct cbp_wait_event *pflow_ctrl);
  154. int (*detect_host)(const char *host_id);
  155. int (*cbp_setup)(struct cbp_platform_data *pdata);
  156. void (*cbp_destroy)(void);
  157. };
  158. enum {
  159. MODEM_ST_READY = 0, /*modem ready */
  160. MODEM_ST_TX_RX,
  161. MODEM_ST_UNKNOWN
  162. };
  163. enum {
  164. FLOW_CTRL_DISABLE = 0,
  165. FLOW_CTRL_ENABLE
  166. };
  167. #if !defined(CONFIG_MTK_CLKMGR)
  168. #include <linux/clk.h>
  169. extern struct clk *clk_scp_sys_md2_main;
  170. #endif
  171. extern struct sdio_modem *c2k_modem;
  172. extern void modem_pre_stop(void);
  173. extern void modem_reset_handler(void);
  174. #ifndef CONFIG_EVDO_DT_VIA_SUPPORT
  175. extern unsigned int get_c2k_wdt_irq_id(void);
  176. extern void via_sdio_on(int sdio_port_num);
  177. extern void via_sdio_off(int sdio_port_num);
  178. #endif
  179. #ifdef WAKE_HOST_BY_SYNC /*wake up sdio host by four wire sync mechanis */
  180. /*extern void VIA_trigger_signal(int i_on);*/
  181. extern void SRC_trigger_signal(int i_on);
  182. #endif
  183. extern void c2k_modem_reset_platform(void);
  184. extern void c2k_reset_modem(void);
  185. extern void c2k_platform_restore_first_init(void);
  186. extern void enable_c2k_jtag(int mode);
  187. void modem_notify_event(int event);
  188. int c2k_gpio_get_ls(int gpio);
  189. extern void set_ap_ready(int value);
  190. extern void set_ap_wake_cp(int value);
  191. extern int modem_on_off_ctrl_chan(unsigned char on);
  192. extern void gpio_irq_cbp_rst_ind(void);
  193. extern int dump_c2k_sdio_status(struct sdio_modem *modem);
  194. extern void c2k_modem_power_on_platform(void);
  195. extern void c2k_modem_power_off_platform(void);
  196. extern void c2k_modem_reset_platform(void);
  197. extern void c2k_wake_host(int wake);
  198. extern void c2k_modem_reset_pccif(void);
  199. extern struct sdio_modem *c2k_modem;
  200. #ifndef CONFIG_EVDO_DT_VIA_SUPPORT
  201. extern void set_ets_sel(int value);
  202. extern int force_c2k_assert(struct sdio_modem *modem);
  203. #endif
  204. extern int modem_on_off_ctrl_chan(unsigned char on);
  205. extern void gpio_irq_cbp_rst_ind(void);
  206. extern void c2k_modem_power_on_platform(void);
  207. extern void c2k_modem_power_off_platform(void);
  208. extern void c2k_modem_reset_platform(void);
  209. extern void c2k_wake_host(int wake);
  210. extern void c2k_modem_reset_pccif(void);
  211. extern int dump_c2k_sdio_status(struct sdio_modem *modem);
  212. /*extern void gpio_irq_cbp_excp_ind(void);*/
  213. extern void dump_c2k_iram(void);
  214. #endif