hif_sdio.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. /*! \file "hif_sdio.h"
  2. \brief
  3. */
  4. /*
  5. *
  6. * 07 25 2010 george.kuo
  7. *
  8. * Move hif_sdio driver to linux directory.
  9. *
  10. * 07 23 2010 george.kuo
  11. *
  12. * Add MT6620 driver source tree
  13. * , including char device driver (wmt, bt, gps), stp driver,
  14. * interface driver (tty ldisc and hif_sdio), and bt hci driver.
  15. **
  16. **
  17. */
  18. #ifndef _HIF_SDIO_H
  19. #define _HIF_SDIO_H
  20. /*******************************************************************************
  21. * C O M P I L E R F L A G S
  22. ********************************************************************************
  23. */
  24. #define HIF_SDIO_DEBUG (0) /* 0:turn off debug msg and assert, 1:turn off debug msg and assert */
  25. #define HIF_SDIO_API_EXTENSION (0)
  26. /*******************************************************************************
  27. * E X T E R N A L R E F E R E N C E S
  28. ********************************************************************************
  29. */
  30. #include <linux/mmc/card.h>
  31. #include <linux/mmc/host.h>
  32. #include <linux/mmc/sdio_func.h>
  33. #include <linux/mmc/sdio_ids.h>
  34. #include <linux/mm.h>
  35. #include <linux/firmware.h>
  36. #include <linux/module.h>
  37. #include <linux/init.h>
  38. #include <linux/interrupt.h>
  39. #include <linux/vmalloc.h>
  40. #include <asm/atomic.h>
  41. #include "osal_typedef.h"
  42. #include "osal.h"
  43. #include "wmt_exp.h"
  44. /*******************************************************************************
  45. * C O N S T A N T S
  46. ********************************************************************************
  47. */
  48. #define CFG_CLIENT_COUNT (11)
  49. #define HIF_DEFAULT_BLK_SIZE (256)
  50. #define HIF_DEFAULT_VENDOR (0x037A)
  51. #define HIF_SDIO_LOG_LOUD 4
  52. #define HIF_SDIO_LOG_DBG 3
  53. #define HIF_SDIO_LOG_INFO 2
  54. #define HIF_SDIO_LOG_WARN 1
  55. #define HIF_SDIO_LOG_ERR 0
  56. /*******************************************************************************
  57. * D A T A T Y P E S
  58. ********************************************************************************
  59. */
  60. /* Function info provided by client driver */
  61. typedef struct _MTK_WCN_HIF_SDIO_FUNCINFO MTK_WCN_HIF_SDIO_FUNCINFO;
  62. /* Client context provided by hif_sdio driver for the following function call */
  63. typedef UINT32 MTK_WCN_HIF_SDIO_CLTCTX;
  64. /* Callback functions provided by client driver */
  65. typedef INT32 (*MTK_WCN_HIF_SDIO_PROBE)(MTK_WCN_HIF_SDIO_CLTCTX,
  66. const MTK_WCN_HIF_SDIO_FUNCINFO *);
  67. typedef INT32 (*MTK_WCN_HIF_SDIO_REMOVE)(MTK_WCN_HIF_SDIO_CLTCTX);
  68. typedef INT32 (*MTK_WCN_HIF_SDIO_IRQ)(MTK_WCN_HIF_SDIO_CLTCTX);
  69. /* Function info provided by client driver */
  70. struct _MTK_WCN_HIF_SDIO_FUNCINFO {
  71. UINT16 manf_id; /* TPLMID_MANF: manufacturer ID */
  72. UINT16 card_id; /* TPLMID_CARD: card ID */
  73. UINT16 func_num; /* Function Number */
  74. UINT16 blk_sz; /* Function block size */
  75. };
  76. /* Client info provided by client driver */
  77. typedef struct _MTK_WCN_HIF_SDIO_CLTINFO {
  78. const MTK_WCN_HIF_SDIO_FUNCINFO *func_tbl; /* supported function info table */
  79. UINT32 func_tbl_size; /* supported function table info element number */
  80. MTK_WCN_HIF_SDIO_PROBE hif_clt_probe; /* callback function for probing */
  81. MTK_WCN_HIF_SDIO_REMOVE hif_clt_remove; /* callback function for removing */
  82. MTK_WCN_HIF_SDIO_IRQ hif_clt_irq; /* callback function for interrupt handling */
  83. } MTK_WCN_HIF_SDIO_CLTINFO;
  84. /* function info provided by registed function */
  85. typedef struct _MTK_WCN_HIF_SDIO_REGISTINFO {
  86. const MTK_WCN_HIF_SDIO_CLTINFO *sdio_cltinfo; /* client's MTK_WCN_HIF_SDIO_CLTINFO pointer */
  87. const MTK_WCN_HIF_SDIO_FUNCINFO *func_info; /* supported function info pointer */
  88. } MTK_WCN_HIF_SDIO_REGISTINFO;
  89. /* Card info provided by probed function */
  90. typedef struct _MTK_WCN_HIF_SDIO_PROBEINFO {
  91. struct sdio_func *func; /* probed sdio function pointer */
  92. PVOID private_data_p; /* clt's private data pointer */
  93. MTK_WCN_BOOL on_by_wmt; /* TRUE: on by wmt, FALSE: not on by wmt */
  94. /* added for sdio irq sync and mmc single_irq workaround */
  95. MTK_WCN_BOOL sdio_irq_enabled; /* TRUE: can handle sdio irq; FALSE: no sdio irq handling */
  96. INT32 clt_idx; /* registered function table info element number (initial value is -1) */
  97. } MTK_WCN_HIF_SDIO_PROBEINFO;
  98. /* work queue info needed by worker */
  99. typedef struct _MTK_WCN_HIF_SDIO_CLT_PROBE_WORKERINFO {
  100. struct work_struct probe_work; /* work queue structure */
  101. MTK_WCN_HIF_SDIO_REGISTINFO *registinfo_p; /* MTK_WCN_HIF_SDIO_REGISTINFO pointer of the client */
  102. INT8 probe_idx; /* probed function table info element number (initial value is -1) */
  103. } MTK_WCN_HIF_SDIO_CLT_PROBE_WORKERINFO;
  104. /* global resource locks info of hif_sdio drv */
  105. typedef struct _MTK_WCN_HIF_SDIO_LOCKINFO {
  106. spinlock_t probed_list_lock; /* spin lock for probed list */
  107. spinlock_t clt_list_lock; /* spin lock for client registed list */
  108. } MTK_WCN_HIF_SDIO_LOCKINFO;
  109. /* SDIO Deep Sleep Information by chip, maintained by HIF-SDIO itself */
  110. typedef struct _MTK_WCN_HIF_SDIO_DS_CLT_INFO {
  111. MTK_WCN_HIF_SDIO_CLTCTX ctx;
  112. UINT16 func_num;
  113. UINT8 act_flag;
  114. UINT8 ds_en_flag;
  115. } MTK_WCN_HIF_SDIO_DS_CLT_INFO;
  116. typedef struct _MTK_WCN_HIF_SDIO_DS_INFO {
  117. UINT32 chip_id; /*chipid */
  118. UINT32 reg_offset; /*offset in CCCR of control register of deep sleep */
  119. UINT8 value; /*value to set to CCCR reg_offset, when enable deep sleep */
  120. MTK_WCN_HIF_SDIO_DS_CLT_INFO clt_info[2]; /*currently, only BGF and WIFI function need this function */
  121. struct mutex lock;
  122. } MTK_WCN_HIF_SDIO_DS_INFO;
  123. /* error code returned by hif_sdio driver (use NEGATIVE number) */
  124. typedef enum {
  125. HIF_SDIO_ERR_SUCCESS = 0,
  126. HIF_SDIO_ERR_FAIL = HIF_SDIO_ERR_SUCCESS - 1, /* generic error */
  127. HIF_SDIO_ERR_INVALID_PARAM = HIF_SDIO_ERR_FAIL - 1,
  128. HIF_SDIO_ERR_DUPLICATED = HIF_SDIO_ERR_INVALID_PARAM - 1,
  129. HIF_SDIO_ERR_UNSUP_MANF_ID = HIF_SDIO_ERR_DUPLICATED - 1,
  130. HIF_SDIO_ERR_UNSUP_CARD_ID = HIF_SDIO_ERR_UNSUP_MANF_ID - 1,
  131. HIF_SDIO_ERR_INVALID_FUNC_NUM = HIF_SDIO_ERR_UNSUP_CARD_ID - 1,
  132. HIF_SDIO_ERR_INVALID_BLK_SZ = HIF_SDIO_ERR_INVALID_FUNC_NUM - 1,
  133. HIF_SDIO_ERR_NOT_PROBED = HIF_SDIO_ERR_INVALID_BLK_SZ - 1,
  134. HIF_SDIO_ERR_ALRDY_ON = HIF_SDIO_ERR_NOT_PROBED - 1,
  135. HIF_SDIO_ERR_ALRDY_OFF = HIF_SDIO_ERR_ALRDY_ON - 1,
  136. HIF_SDIO_ERR_CLT_NOT_REG = HIF_SDIO_ERR_ALRDY_OFF - 1,
  137. } MTK_WCN_HIF_SDIO_ERR;
  138. /*******************************************************************************
  139. * P U B L I C D A T A
  140. ********************************************************************************
  141. */
  142. /*******************************************************************************
  143. * P R I V A T E D A T A
  144. ********************************************************************************
  145. */
  146. /*******************************************************************************
  147. * M A C R O S
  148. ********************************************************************************
  149. */
  150. #if WMT_PLAT_ALPS
  151. #ifdef CONFIG_SDIOAUTOK_SUPPORT
  152. #define MTK_HIF_SDIO_AUTOK_ENABLED 1
  153. #else
  154. #define MTK_HIF_SDIO_AUTOK_ENABLED 0
  155. #endif
  156. #else
  157. #define MTK_HIF_SDIO_AUTOK_ENABLED 0
  158. #endif
  159. /*!
  160. * \brief A macro used to generate hif_sdio client's context
  161. *
  162. * Generate a context for hif_sdio client based on the following input parameters
  163. * |<-card id (16bits)->|<-block size in unit of 256 bytes(8 bits)->|<-function number(4bits)->|<-index(4bits)->|
  164. *
  165. * \param manf the 16 bit manufacturer id
  166. * \param card the 16 bit card id
  167. * \param func the 16 bit function number
  168. * \param b_sz the 16 bit function block size
  169. */
  170. #define CLTCTX(cid, func, blk_sz, idx) \
  171. (MTK_WCN_HIF_SDIO_CLTCTX)((((UINT32)(cid) & 0xFFFFUL) << 16) | \
  172. (((UINT32)(func) & 0xFUL) << 4) | \
  173. (((UINT32)(blk_sz) & 0xFF00UL) << 0) | \
  174. (((UINT32)idx & 0xFUL) << 0))
  175. /*!
  176. * \brief A set of macros used to get information out of an hif_sdio client context
  177. *
  178. * Generate a context for hif_sdio client based on the following input parameters
  179. */
  180. #define CLTCTX_CID(ctx) (((ctx) >> 16) & 0xFFFF)
  181. #define CLTCTX_FUNC(ctx) (((ctx) >> 4) & 0xF)
  182. #define CLTCTX_BLK_SZ(ctx) (((ctx) >> 0) & 0xFF00)
  183. #define CLTCTX_IDX(ctx) ((ctx) & 0xF)
  184. #define CLTCTX_IDX_VALID(idx) ((idx >= 0) && (idx < CFG_CLIENT_COUNT))
  185. /*!
  186. * \brief A macro used to describe an SDIO function
  187. *
  188. * Fill an MTK_WCN_HIF_SDIO_FUNCINFO structure with function-specific information
  189. *
  190. * \param manf the 16 bit manufacturer id
  191. * \param card the 16 bit card id
  192. * \param func the 16 bit function number
  193. * \param b_sz the 16 bit function block size
  194. */
  195. #define MTK_WCN_HIF_SDIO_FUNC(manf, card, func, b_sz) \
  196. .manf_id = (manf), .card_id = (card), .func_num = (func), .blk_sz = (b_sz)
  197. #ifdef DFT_TAG
  198. #undef DFT_TAG
  199. #endif
  200. #ifndef DFT_TAG
  201. #define DFT_TAG "[HIF-SDIO]"
  202. #endif
  203. extern UINT32 gHifSdioDbgLvl;
  204. #define HIF_SDIO_LOUD_FUNC(fmt, arg...) \
  205. do { if (gHifSdioDbgLvl >= HIF_SDIO_LOG_LOUD) \
  206. osal_dbg_print(DFT_TAG"[L]%s:" fmt, __func__ , ##arg); \
  207. } while (0)
  208. #define HIF_SDIO_DBG_FUNC(fmt, arg...) \
  209. do { if (gHifSdioDbgLvl >= HIF_SDIO_LOG_DBG) \
  210. osal_dbg_print(DFT_TAG"[D]%s:" fmt, __func__ , ##arg); \
  211. } while (0)
  212. #define HIF_SDIO_INFO_FUNC(fmt, arg...) \
  213. do { if (gHifSdioDbgLvl >= HIF_SDIO_LOG_INFO) \
  214. osal_info_print(DFT_TAG"[I]%s:" fmt, __func__ , ##arg); \
  215. } while (0)
  216. #define HIF_SDIO_WARN_FUNC(fmt, arg...) \
  217. do { if (gHifSdioDbgLvl >= HIF_SDIO_LOG_WARN) \
  218. osal_warn_print(DFT_TAG"[W]%s(%d):" fmt, __func__ , __LINE__, ##arg); \
  219. } while (0)
  220. #define HIF_SDIO_ERR_FUNC(fmt, arg...) \
  221. do { if (gHifSdioDbgLvl >= HIF_SDIO_LOG_ERR) \
  222. osal_err_print(DFT_TAG"[E]%s(%d):" fmt, __func__ , __LINE__, ##arg); \
  223. } while (0)
  224. /*!
  225. * \brief ASSERT function definition.
  226. *
  227. */
  228. #if HIF_SDIO_DEBUG
  229. #define HIF_SDIO_ASSERT(expr) \
  230. { \
  231. if (!(expr)) { \
  232. osal_dbg_print("assertion failed! %s[%d]: %s\n",\
  233. __func__, __LINE__, #expr); \
  234. osal_bug_on(!(expr));\
  235. } \
  236. }
  237. #else
  238. #define HIF_SDIO_ASSERT(expr) do {} while (0)
  239. #endif
  240. /*******************************************************************************
  241. * F U N C T I O N D E C L A R A T I O N S
  242. ********************************************************************************
  243. */
  244. /*!
  245. * \brief MTK hif sdio client registration function
  246. *
  247. * Client uses this function to do hif sdio registration
  248. *
  249. * \param pinfo a pointer of client's information
  250. *
  251. * \retval 0 register successfully
  252. * \retval < 0 error code
  253. */
  254. extern INT32 mtk_wcn_hif_sdio_client_reg(const MTK_WCN_HIF_SDIO_CLTINFO *pinfo);
  255. extern INT32 mtk_wcn_hif_sdio_client_unreg(const MTK_WCN_HIF_SDIO_CLTINFO *pinfo);
  256. extern INT32 mtk_wcn_hif_sdio_readb(MTK_WCN_HIF_SDIO_CLTCTX ctx, UINT32 offset, PUINT8 pvb);
  257. extern INT32 mtk_wcn_hif_sdio_writeb(MTK_WCN_HIF_SDIO_CLTCTX ctx, UINT32 offset, UINT8 vb);
  258. extern INT32 mtk_wcn_hif_sdio_readl(MTK_WCN_HIF_SDIO_CLTCTX ctx, UINT32 offset, PUINT32 pvl);
  259. extern INT32 mtk_wcn_hif_sdio_writel(MTK_WCN_HIF_SDIO_CLTCTX ctx, UINT32 offset, UINT32 vl);
  260. extern INT32 mtk_wcn_hif_sdio_read_buf(MTK_WCN_HIF_SDIO_CLTCTX ctx,
  261. UINT32 offset, PUINT32 pbuf, UINT32 len);
  262. extern INT32 mtk_wcn_hif_sdio_write_buf(MTK_WCN_HIF_SDIO_CLTCTX ctx,
  263. UINT32 offset, PUINT32 pbuf, UINT32 len);
  264. extern VOID mtk_wcn_hif_sdio_set_drvdata(MTK_WCN_HIF_SDIO_CLTCTX ctx, PVOID private_data_p);
  265. extern PVOID mtk_wcn_hif_sdio_get_drvdata(MTK_WCN_HIF_SDIO_CLTCTX ctx);
  266. extern INT32 mtk_wcn_hif_sdio_wmt_control(WMT_SDIO_FUNC_TYPE func_type, MTK_WCN_BOOL is_on);
  267. extern INT32 mtk_wcn_hif_sdio_bus_set_power(MTK_WCN_HIF_SDIO_CLTCTX ctx, UINT32 pwrState);
  268. extern VOID mtk_wcn_hif_sdio_get_dev(MTK_WCN_HIF_SDIO_CLTCTX ctx, struct device **dev);
  269. extern INT32 mtk_wcn_hif_sdio_update_cb_reg(INT32(*ts_update)(VOID));
  270. extern VOID mtk_wcn_hif_sdio_enable_irq(MTK_WCN_HIF_SDIO_CLTCTX ctx, MTK_WCN_BOOL enable);
  271. extern INT32 mtk_wcn_hif_sdio_do_autok(MTK_WCN_HIF_SDIO_CLTCTX ctx);
  272. extern INT32 mtk_wcn_hif_sdio_f0_writeb(MTK_WCN_HIF_SDIO_CLTCTX ctx, UINT32 offset, UINT8 vb);
  273. extern INT32 mtk_wcn_hif_sdio_f0_readb(MTK_WCN_HIF_SDIO_CLTCTX ctx, UINT32 offset, PUINT8 pvb);
  274. #define DELETE_HIF_SDIO_CHRDEV 1
  275. #if !(DELETE_HIF_SDIO_CHRDEV)
  276. INT32 mtk_wcn_hif_sdio_tell_chipid(INT32 chipId);
  277. INT32 mtk_wcn_hif_sdio_query_chipid(INT32 waitFlag);
  278. #endif
  279. extern INT32 mtk_wcn_hif_sdio_en_deep_sleep(MTK_WCN_HIF_SDIO_CLTCTX ctx);
  280. extern INT32 mtk_wcn_hif_sdio_dis_deep_sleep(MTK_WCN_HIF_SDIO_CLTCTX ctx);
  281. /*******************************************************************************
  282. * F U N C T I O N S
  283. ********************************************************************************
  284. */
  285. /*******************************************************************************
  286. * E X T E R N A L F U N C T I O N D E C L A R A T I O N S
  287. ********************************************************************************
  288. */
  289. #if MTK_HIF_SDIO_AUTOK_ENABLED
  290. extern int wait_sdio_autok_ready(PVOID);
  291. #endif
  292. /*******************************************************************************
  293. * F U N C T I O N S
  294. ********************************************************************************
  295. */
  296. #endif /* _HIF_SDIO_H */