sdio_autok.h 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. #ifndef MT6582_AUTOK_H
  2. #define MT6582_AUTOK_H
  3. #include <linux/mmc/card.h>
  4. #include <linux/mmc/host.h>
  5. #include <linux/mmc/sdio_func.h>
  6. #include <mt-plat/mt_boot_common.h>
  7. #include "mt_sd.h"
  8. #include <mt_vcore_dvfs.h>
  9. #define AUTOK_READ 0
  10. #define AUTOK_WRITE 1
  11. #define PROC_BUF_SIZE 512
  12. /*************************************************************************
  13. * AutoK Implementation
  14. *************************************************************************/
  15. /* #define AUTOK_DEBUG */
  16. #define USE_KERNEL_THREAD
  17. /* #define CHANGE_SCHED_POLICY */
  18. /* #define SCHED_POLICY_INFO */
  19. #define PMIC_MT6323
  20. /*TODO: just remove those def and include the correct one header*/
  21. #define SDIO_IP_WTMDR (0x00B0)
  22. #define SDIO_IP_WTMCR (0x00B4)
  23. #define SDIO_IP_WTMDPCR0 (0x00B8)
  24. #define SDIO_IP_WTMDPCR1 (0x00BC)
  25. #define SDIO_IP_WPLRCR (0x00D4)
  26. #define TEST_MODE_STATUS (0x100)
  27. struct sdio_autok_params {
  28. u32 cmd_edge;
  29. u32 rdata_edge;
  30. u32 wdata_edge;
  31. u32 clk_drv;
  32. u32 cmd_drv;
  33. u32 dat_drv;
  34. u32 dat0_rd_dly;
  35. u32 dat1_rd_dly;
  36. u32 dat2_rd_dly;
  37. u32 dat3_rd_dly;
  38. u32 dat_wrd_dly;
  39. u32 cmd_resp_rd_dly;
  40. u32 cmd_rd_dly;
  41. u32 int_dat_latch_ck;
  42. u32 ckgen_msdc_dly_sel;
  43. u32 cmd_rsp_ta_cntr;
  44. u32 wrdat_crcs_ta_cntr;
  45. u32 pad_clk_txdly;
  46. };
  47. typedef struct {
  48. unsigned int sel;
  49. } S_AUTOK_DATA;
  50. typedef union {
  51. unsigned int version;
  52. unsigned int freq;
  53. S_AUTOK_DATA data;
  54. } U_AUTOK_INTERFACE_DATA;
  55. #ifdef USE_KERNEL_THREAD
  56. struct sdio_autok_thread_data {
  57. struct msdc_host *host;
  58. struct autok_predata *p_autok_predata;
  59. char stage;
  60. struct autok_progress *p_autok_progress;
  61. u8 *is_autok_done;
  62. struct completion *autok_completion;
  63. char *log;
  64. };
  65. #else /* USE_KERNEL_THREAD */
  66. struct sdio_autok_workqueue_data {
  67. struct delayed_work autok_delayed_work;
  68. struct msdc_host *host;
  69. struct autok_predata *p_autok_predata;
  70. char stage;
  71. };
  72. #endif /* USE_KERNEL_THREAD */
  73. struct log_mmap_info {
  74. char *data; /* the data */
  75. int reference; /* how many times it is mmapped */
  76. int size;
  77. };
  78. typedef enum {
  79. /*CMD*/ E_MSDC_PAD_TUNE_CMDRRDLY = 0,
  80. E_MSDC_CMD_RSP_TA_CNTR,
  81. E_MSDC_IOCON_RSPL,
  82. E_MSDC_CKGEN_MSDC_DLY_SEL,
  83. E_MSDC_PAD_TUNE_CMDRDLY,
  84. /*READ*/ E_MSDC_INT_DAT_LATCH_CK_SEL,
  85. #if 1
  86. E_MSDC_IOCON_RDSPL,
  87. E_MSDC_PAD_TUNE_DATRRDLY,
  88. #else
  89. E_IOCON_RD0SPL,
  90. E_IOCON_RD1SPL,
  91. E_IOCON_RD2SPL,
  92. E_IOCON_RD3SPL,
  93. E_DAT_RDDLY0_D0,
  94. E_DAT_RDDLY0_D1,
  95. E_DAT_RDDLY0_D2,
  96. E_DAT_RDDLY0_D3,
  97. #endif
  98. /*WRITE*/ E_MSDC_WRDAT_CRCS_TA_CNTR,
  99. E_MSDC_IOCON_WDSPL,
  100. E_MSDC_PAD_TUNE_DATWRDLY,
  101. E_MSDC_PAD_DLY_PERIOD,
  102. E_MSDC_CMD_INT_MARGIN,
  103. E_MSDC_F_TINY_MARGIN,
  104. E_AUTOK_VERSION,
  105. E_AUTOK_FREQ,
  106. E_AUTOK_PARM_MAX
  107. } E_AUTOK_PARAM;
  108. #define MAX_AUTOK_DAT_NUM (E_AUTOK_PARM_MAX)
  109. #define E_AUTOK_DLY_PARAM_MAX (E_MSDC_PAD_TUNE_DATWRDLY+1)
  110. #define LTE_MODEM_FUNC (1)
  111. #define CMD_52 (52)
  112. #define CMD_53 (53)
  113. #define REQ_CMD_EIO (0x1 << 0)
  114. #define REQ_CMD_TMO (0x1 << 1)
  115. #define REQ_DAT_ERR (0x1 << 2)
  116. #define MSDC_READ (0)
  117. #define MSDC_WRITE (1)
  118. #define LOG_SIZE (PAGE_SIZE*8)
  119. enum AUTOK_PARAM {
  120. CMD_EDGE, /* command response sample selection (MSDC_SMPL_RISING, MSDC_SMPL_FALLING) */
  121. RDATA_EDGE, /* read data sample selection (MSDC_SMPL_RISING, MSDC_SMPL_FALLING) */
  122. WDATA_EDGE, /* write data sample selection (MSDC_SMPL_RISING, MSDC_SMPL_FALLING) */
  123. CLK_DRV, /* clock driving */
  124. CMD_DRV, /* command driving */
  125. DAT_DRV, /* data driving */
  126. DAT0_RD_DLY, /* DAT0 Pad RX Delay Line Control (for MSDC RD), Total 32 stages */
  127. DAT1_RD_DLY, /* DAT1 Pad RX Delay Line Control (for MSDC RD), Total 32 stages */
  128. DAT2_RD_DLY, /* DAT2 Pad RX Delay Line Control (for MSDC RD), Total 32 stages */
  129. DAT3_RD_DLY, /* DAT3 Pad RX Delay Line Control (for MSDC RD), Total 32 stages */
  130. DAT_WRD_DLY, /* Write Data Status Internal Delay Line Control. */
  131. /* This register is used to fine-tune write status phase latched */
  132. /* by MSDC internal clock. Total 32 stages */
  133. DAT_RD_DLY, /* Rx Delay Line Control. Total 32 stages */
  134. CMD_RESP_RD_DLY, /* CMD Response Internal Delay Line Control. This register is */
  135. /* used to fine-tune response phase latched by MSDC internal */
  136. /* clock. Total 32 stages */
  137. CMD_RD_DLY, /* CMD Pad RX Delay Line Control. This register is used to */
  138. /* fine-tune CMD pad macro respose latch timing. Total 32 stages */
  139. DATA_DLYLINE_SEL, /* Data line delay line fine tune selection. 1'b0: All data line */
  140. /* share one delay selection value indicated by */
  141. /* PAD_TUNE.PAD_DAT_RD_RXDLY. 1'b1: Each data line has its own */
  142. /* delay selection value indicated by Data line (x): */
  143. /* DAT_RD_DLY(x).DAT0_RD_DLY */
  144. READ_DATA_SMPL_SEL, /* Data line rising/falling latch fine tune selection in read */
  145. /* transaction. 1'b0: All data line share one value indicated by */
  146. /* MSDC_IOCON.R_D_SMPL. 1'b1: Each data line has its own */
  147. /* selection value indicated by Data line (x): */
  148. /* MSDC_IOCON.R_D(x)_SMPL */
  149. WRITE_DATA_SMPL_SEL, /* Data line rising/falling latch fine tune selection in write */
  150. /* transaction. 1'b0: All data line share one value indicated by */
  151. /* MSDC_IOCON.W_D_SMPL. 1'b1: Each data line has its own */
  152. /* selection value indicated by Data line (x): */
  153. /* MSDC_IOCON.W_D(x)_SMPL */
  154. INT_DAT_LATCH_CK, /* Internal MSDC clock phase selection. Total 8 stages, each */
  155. /* stage can delay 1 clock period of msdc_src_ck */
  156. CKGEN_MSDC_DLY_SEL, /* CKBUF in CKGEN Delay Selection. Total 32 stages */
  157. CMD_RSP_TA_CNTR, /* CMD response turn around period. The turn around cycle = */
  158. /* CMD_RSP_TA_CNTR + 2, Only for USH104 mode, this register */
  159. /* should be set to 0 in non-UHS104 mode */
  160. WRDAT_CRCS_TA_CNTR, /* Write data and CRC status turn around period. The turn around */
  161. /* cycle = WRDAT_CRCS_TA_CNTR + 2, Only for USH104 mode, this */
  162. /* register should be set to 0 in non-UHS104 mode */
  163. PAD_CLK_TXDLY, /* CLK Pad TX Delay Control. This register is used to add delay */
  164. /* to CLK phase. Total 32 stages */
  165. TOTAL_PARAM_COUNT
  166. };
  167. struct autok_progress {
  168. u32 host_id;
  169. u32 done;
  170. u32 fail;
  171. };
  172. struct autok_predata {
  173. u8 vol_count;
  174. u8 param_count;
  175. unsigned int *vol_list;
  176. U_AUTOK_INTERFACE_DATA **ai_data;
  177. };
  178. int msdc_autok_read(struct msdc_host *host, unsigned int u4Addr, unsigned int u4Func, void *pBuffer,
  179. unsigned int u4Len, unsigned int u4Cmd);
  180. int msdc_autok_write(struct msdc_host *host, unsigned int u4Addr, unsigned int u4Func,
  181. void *pBuffer, unsigned int u4Len, unsigned int u4Cmd);
  182. int msdc_autok_adjust_param(struct msdc_host *host, enum AUTOK_PARAM param, u32 *value, int rw);
  183. int msdc_autok_stg1_cal(struct msdc_host *host, unsigned int offset_restore,
  184. struct autok_predata *p_single_autok);
  185. /* int msdc_autok_stg1_data_get(void **ppData, int *pLen); */
  186. int msdc_autok_stg2_cal(struct msdc_host *host, struct autok_predata *p_autok_data,
  187. unsigned int vcore_uv_off);
  188. int msdc_autok_apply_param(struct msdc_host *host, unsigned int vcore_uv_off);
  189. int msdc_autok_get_suggetst_vcore(unsigned int **suggest_vol_tbl);
  190. extern char *reset_autok_cursor(int voltage);
  191. /* extern void clear_autok_buf(); */
  192. bool is_vcore_ss_corner(void);
  193. /*****************************************************************************
  194. * Functions Declearation *
  195. *****************************************************************************/
  196. extern unsigned int sdio_get_rings(unsigned int *io_ring, unsigned int *core_ring);
  197. extern unsigned int msdc_do_command(struct msdc_host *host,
  198. struct mmc_command *cmd, int tune, unsigned long timeout);
  199. extern int msdc_pio_read(struct msdc_host *host, struct mmc_data *data);
  200. extern int msdc_pio_write(struct msdc_host *host, struct mmc_data *data);
  201. extern struct msdc_host *mtk_msdc_host[];
  202. /* Auto-K Thread function */
  203. extern volatile int sdio_autok_processed;
  204. extern unsigned int autok_get_current_vcore_offset(void);
  205. #ifdef CONFIG_SDIOAUTOK_SUPPORT
  206. extern unsigned int g_autok_vcore_sel[];
  207. #endif
  208. extern void mmc_set_clock(struct mmc_host *host, unsigned int hz);
  209. extern void msdc_ungate_clock(struct msdc_host *host);
  210. extern void msdc_gate_clock(struct msdc_host *host, int delay);
  211. int send_autok_uevent(char *text, struct msdc_host *host);
  212. /* static DEFINE_SPINLOCK(autok_lock); */
  213. extern char *log_info;
  214. extern int total_msg_size;
  215. extern void msdc_sdio_set_long_timing_delay_by_freq(struct msdc_host *host, u32 clock);
  216. /* CALLBACK for device wait */
  217. #endif /* end of MT6582_AUTOK_H */