drv_codec_icodec.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406
  1. /*
  2. * drv_codec_icodec.h
  3. *
  4. * Created on: 2017Äê1ÔÂ10ÈÕ
  5. * Author: Urey
  6. */
  7. #ifndef _DRV_CODEC_ICODEC_H_
  8. #define _DRV_CODEC_ICODEC_H_
  9. #include <stdint.h>
  10. #include "x1000.h"
  11. #include "drv_clock.h"
  12. struct jz_icodec
  13. {
  14. struct jz_i2s *i2s;
  15. struct rt_audio_configure replay_config;
  16. #ifdef AUDIO_DEVICE_USE_PRIVATE_BUFFER
  17. struct rt_mempool mp;
  18. #endif /* AUDIO_DEVICE_USE_PRIVATE_BUFFER */
  19. uint32_t mapped_base;
  20. /* replay */
  21. int user_replay_volume;
  22. int dac_user_mute; /*dac user mute state*/
  23. int aohp_in_pwsq; /*aohp in power up/down seq*/
  24. int hpl_wished_gain; /*keep original hpl/r gain register value*/
  25. int hpr_wished_gain;
  26. int linl_wished_gain; /*keep original hpl/r gain register value*/
  27. int linr_wished_gain;
  28. };
  29. #define ICODEC_PCM_FORMAT AUDIO_FMT_PCM_S16_LE
  30. #define ICODEC_SAMPLING_RATE 44100
  31. /* icodec internal register space */
  32. enum {
  33. SCODA_REG_SR = 0x0,
  34. SCODA_REG_SR2,
  35. SCODA_REG_SIGR,
  36. SCODA_REG_SIGR2,
  37. SCODA_REG_SIGR3,
  38. SCODA_REG_SIGR5,
  39. SCODA_REG_SIGR7,
  40. SCODA_REG_MR,
  41. SCODA_REG_AICR_DAC,
  42. SCODA_REG_AICR_ADC,
  43. SCODA_REG_CR_DMIC,
  44. SCODA_REG_CR_MIC1,
  45. SCODA_REG_CR_MIC2,
  46. SCODA_REG_CR_DAC,
  47. SCODA_REG_CR_DAC2,
  48. SCODA_REG_CR_ADC,
  49. SCODA_REG_CR_MIX,
  50. SCODA_REG_DR_MIX,
  51. SCODA_REG_CR_VIC,
  52. SCODA_REG_CR_CK,
  53. SCODA_REG_FCR_DAC,
  54. SCODA_REG_SFCCR_DAC,
  55. SCODA_REG_SFFCR_DAC,
  56. SCODA_REG_FCR_ADC,
  57. SCODA_REG_CR_TIMER_MSB,
  58. SCODA_REG_CR_TIMER_LSB,
  59. SCODA_REG_ICR,
  60. SCODA_REG_IMR,
  61. SCODA_REG_IFR,
  62. SCODA_REG_IMR2,
  63. SCODA_REG_IFR2,
  64. SCODA_REG_GCR_DACL,
  65. SCODA_REG_GCR_DACR,
  66. SCODA_REG_GCR_DACL2,
  67. SCODA_REG_GCR_DACR2,
  68. SCODA_REG_GCR_MIC1,
  69. SCODA_REG_GCR_MIC2,
  70. SCODA_REG_GCR_ADCL,
  71. SCODA_REG_GCR_ADCR,
  72. SCODA_REG_GCR_MIXDACL,
  73. SCODA_REG_GCR_MIXDACR,
  74. SCODA_REG_GCR_MIXADCL,
  75. SCODA_REG_GCR_MIXADCR,
  76. SCODA_REG_CR_DAC_AGC,
  77. SCODA_REG_DR_DAC_AGC,
  78. SCODA_REG_CR_DAC2_AGC,
  79. SCODA_REG_DR_DAC2_AGC,
  80. SCODA_REG_CR_ADC_AGC,
  81. SCODA_REG_DR_ADC_AGC,
  82. SCODA_REG_SR_ADC_AGCDGL,
  83. SCODA_REG_SR_ADC_AGCDGR,
  84. SCODA_REG_SR_ADC_AGCAGL,
  85. SCODA_REG_SR_ADC_AGCAGR,
  86. SCODA_REG_CR_TR,
  87. SCODA_REG_DR_TR,
  88. SCODA_REG_SR_TR1,
  89. SCODA_REG_SR_TR2,
  90. SCODA_REG_SR_TR_SRCDAC,
  91. /* icodec internal register extend space */
  92. SCODA_MIX_0,
  93. SCODA_MIX_1,
  94. SCODA_MIX_2,
  95. SCODA_MIX_3,
  96. SCODA_MIX_4,
  97. SCODA_DAC_AGC0,
  98. SCODA_DAC_AGC1,
  99. SCODA_DAC_AGC2,
  100. SCODA_DAC_AGC3,
  101. SCODA_DAC2_AGC0,
  102. SCODA_DAC2_AGC1,
  103. SCODA_DAC2_AGC2,
  104. SCODA_DAC2_AGC3,
  105. SCODA_ADC_AGC0,
  106. SCODA_ADC_AGC1,
  107. SCODA_ADC_AGC2,
  108. SCODA_ADC_AGC3,
  109. SCODA_ADC_AGC4,
  110. SCODA_MAX_REG_NUM,
  111. };
  112. /*aicr dac*/
  113. #define SCODA_AICR_DAC_ADWL_SHIFT (6)
  114. #define SCODA_AICR_DAC_ADWL_MASK (0x3 << SCODA_AICR_DAC_ADWL_SHIFT)
  115. #define SCODA_AICR_DAC_SLAVE_SHIFT (5)
  116. #define SCODA_AICR_DAC_SLAVE_MASK (0x1 << SCODA_AICR_DAC_SLAVE_SHIFT)
  117. #define SCODA_AICR_DAC_SLAVE (1 << 5)
  118. #define SCODA_AICR_DAC_SB_SHIFT (4)
  119. #define SCODA_AICR_DAC_SB_MASK (0x1 << SCODA_AICR_DAC_SB_SHIFT)
  120. #define SCODA_AICR_DAC_AUDIOIF_SHIFT (0)
  121. #define SCODA_AICR_DAC_AUDIO_MASK (0x3 << SCODA_AICR_DAC_AUDIOIF_SHIFT)
  122. #define SCODA_AICR_DAC_AUDIOIF_I2S (0x3)
  123. /* aicr adc */
  124. #define SCODA_AICR_ADC_ADWL_SHIFT (6)
  125. #define SCODA_AICR_ADC_ADWL_MASK (0x3 << SCODA_AICR_ADC_ADWL_SHIFT)
  126. #define SCODA_AICR_ADC_SB_SHIFT (4)
  127. #define SCODA_AICR_ADC_SB_MASK (0x1 << SCODA_AICR_ADC_SB_SHIFT)
  128. #define SCODA_AICR_ADC_AUDIOIF_SHIFT (0)
  129. #define SCODA_AICR_ADC_AUDIO_MASK (0x3 << SCODA_AICR_ADC_AUDIOIF_SHIFT)
  130. #define SCODA_AICR_ADC_AUDIOIF_I2S (0x3)
  131. /* cr vic */
  132. #define SCODA_CR_VIC_SB_SHIFT (0)
  133. #define SCODA_CR_VIC_SB_MASK (1 << SCODA_CR_VIC_SB_SHIFT)
  134. #define SCODA_CR_VIC_SB_SLEEP_SHIFT (1)
  135. #define SCODA_CR_VIC_SB_SLEEP_MASK (1 << SCODA_CR_VIC_SB_SLEEP_SHIFT)
  136. /* fcr adc/dac */
  137. #define SCODA_FCR_FREQ_SHIFT (0)
  138. #define SCODA_FCR_FREQ_MASK (0xf << SCODA_FCR_FREQ_SHIFT)
  139. /* cr dac */
  140. #define SCODA_CR_DAC_SMUTE_SHIFT (7)
  141. #define SCODA_CR_DAC_SMUTE_MASK (0x1 << SCODA_CR_DAC_SMUTE_SHIFT)
  142. #define SCODA_CR_DAC_SB_SHIFT (4)
  143. #define SCODA_CR_DAC_SB_MASK (0x1 << SCODA_CR_DAC_SB_SHIFT)
  144. #define SCODA_CR_DAC_ZERO_SHIFT (0)
  145. #define SCODA_CR_DAC_ZERO_MASK (0x1 << SCODA_CR_DAC_ZERO_SHIFT)
  146. /* cr dac */
  147. #define SCODA_CR_ADC_SMUTE_SHIFT (7)
  148. #define SCODA_CR_ADC_SMUTE_MASK (0x1 << SCODA_CR_ADC_SMUTE_SHIFT)
  149. #define SCODA_CR_ADC_MIC_SEL_SHIFT (6)
  150. #define SCODA_CR_ADC_MIC_SEL_MASK (0x1 << SCODA_CR_ADC_MIC_SEL_SHIFT)
  151. #define SCODA_CR_ADC_SB_SHIFT (4)
  152. #define SCODA_CR_ADC_SB_MASK (0x1 << SCODA_CR_ADC_SB_SHIFT)
  153. #define SCODA_CR_ADC_ZERO_SHIFT (0)
  154. #define SCODA_CR_ADC_ZERO_MASK (0x1 << SCODA_CR_ADC_ZERO_SHIFT)
  155. /* ifr */
  156. #define SCODA_IFR_DAC_MUTE_SHIFT (0)
  157. #define SCODA_IFR_DAC_MUTE_MASK (0x1 << SCODA_IFR_DAC_MUTE_SHIFT)
  158. #define SCODA_IFR_ADC_MUTE_SHIFT (2)
  159. #define SCODA_IFR_ADC_MUTE_MASK (0x1 << SCODA_IFR_ADC_MUTE_SHIFT)
  160. #define SCODA_IFR_ADAS_LOCK_SHIFT (7)
  161. #define SCODA_IFR_ADAS_LOCK_MASK (0x1 << SCODA_IFR_ADAS_LOCK_SHIFT)
  162. /* cr ck */
  163. #define SCODA_CR_CK_MCLK_DIV_SHIFT (6)
  164. #define SCODA_CR_CK_MCLK_DIV_MASK (0x1 << SCODA_CR_CK_MCLK_DIV_SHIFT)
  165. #define SCODA_CR_CK_SDCLK_SHIFT (4)
  166. #define SCODA_CR_CK_SDCLK_MASK (0x1 << SCODA_CR_CK_SDCLK_SHIFT)
  167. #define SCODA_CR_CRYSTAL_SHIFT (0)
  168. #define SCODA_CR_CRYSTAL_MASK (0xf << SCODA_CR_CRYSTAL_SHIFT)
  169. /* icr */
  170. #define SCODA_ICR_INT_FORM_SHIFT (6)
  171. #define SCODA_ICR_INT_FORM_MASK (0x3 << SCODA_ICR_INT_FORM_SHIFT)
  172. #define SCODA_ICR_INT_FORM_HIGH (0)
  173. #define SCODA_ICR_INT_FORM_LOW (1)
  174. /* imr */
  175. #define SCODA_IMR_COMMON_MASK (0xff)
  176. #define SCODA_IMR2_COMMON_MASK (0xff)
  177. /*For Codec*/
  178. #define RGADW (0x4)
  179. #define RGDATA (0x8)
  180. static inline void icodec_mapped_reg_set(uint32_t xreg, int xmask, int xval)
  181. {
  182. int val = readl(xreg);
  183. val &= ~(xmask);
  184. val |= xval;
  185. writel(val, xreg);
  186. }
  187. static inline int icodec_mapped_test_bits(uint32_t xreg, int xmask, int xval)
  188. {
  189. int val = readl(xreg);
  190. val &= xmask;
  191. return (val == xval);
  192. }
  193. /*
  194. * RGADW
  195. */
  196. #define SCODA_RGDIN_BIT (0)
  197. #define SCODA_RGDIN_MASK (0xff << SCODA_RGDIN_BIT)
  198. #define SCODA_RGADDR_BIT (8)
  199. #define SCODA_RGADDR_MASK (0x7f << SCODA_RGADDR_BIT)
  200. #define SCODA_RGWR_BIT (16)
  201. #define SCODA_RGWR_MASK (0x1 << SCODA_RGWR_BIT)
  202. #define icodec_test_rw_inval(icodec) \
  203. icodec_mapped_test_bits((icodec->mapped_base + RGADW), SCODA_RGWR_MASK, (1 << SCODA_RGWR_BIT))
  204. /*
  205. * RGDATA
  206. */
  207. #define SCODA_RGDOUT_BIT (0)
  208. #define SCODA_RGDOUT_MASK (0xff << SCODA_RGDOUT_BIT)
  209. #define SCODA_IRQ_BIT (8)
  210. #define SCODA_IRQ_MASK (0x1 << SCODA_IRQ_BIT)
  211. #define icodec_test_irq(icodec) \
  212. icodec_mapped_test_bits((icodec->mapped_base + RGDATA), SCODA_IRQ_MASK, (1 << SCODA_IRQ_BIT))
  213. static inline uint8_t icodec_hw_read_normal(struct jz_icodec *icodec, int reg)
  214. {
  215. uint32_t mapped_base = icodec->mapped_base;
  216. int reval;
  217. int timeout = 0xfffff;
  218. uint32_t flags;
  219. while (icodec_test_rw_inval(icodec))
  220. {
  221. timeout--;
  222. if (!timeout)
  223. {
  224. // rt_kprintf("icodec test_rw_inval timeout\n");
  225. break;
  226. }
  227. }
  228. icodec_mapped_reg_set((mapped_base + RGADW), SCODA_RGWR_MASK,(0 << SCODA_RGWR_BIT));
  229. icodec_mapped_reg_set((mapped_base + RGADW), SCODA_RGADDR_MASK,(reg << SCODA_RGADDR_BIT));
  230. reval = readl((mapped_base + RGDATA));
  231. reval = readl((mapped_base + RGDATA));
  232. reval = readl((mapped_base + RGDATA));
  233. reval = readl((mapped_base + RGDATA));
  234. reval = readl((mapped_base + RGDATA));
  235. reval = ((reval & SCODA_RGDOUT_MASK) >> SCODA_RGDOUT_BIT);
  236. // rt_kprintf("reg %x = %x\n", reg, reval);
  237. return (uint8_t) reval;
  238. }
  239. static inline int icodec_hw_write_normal(struct jz_icodec *icodec, int reg, int data)
  240. {
  241. uint32_t mapped_base = icodec->mapped_base;
  242. int ret = 0;
  243. int timeout = 0xfffff;
  244. uint32_t flags;
  245. while (icodec_test_rw_inval(icodec))
  246. {
  247. timeout--;
  248. if (!timeout)
  249. {
  250. // rt_kprintf("icodec test_rw_inval timeout\n");
  251. break;
  252. }
  253. }
  254. icodec_mapped_reg_set((mapped_base + RGADW), SCODA_RGDIN_MASK | SCODA_RGADDR_MASK,
  255. (data << SCODA_RGDIN_BIT) | (reg << SCODA_RGADDR_BIT));
  256. icodec_mapped_reg_set((mapped_base + RGADW), SCODA_RGWR_MASK ,
  257. 1 << SCODA_RGWR_BIT);
  258. if (reg != SCODA_REG_IFR && reg != SCODA_REG_IFR2)
  259. {
  260. ret = icodec_hw_read_normal(icodec, reg);
  261. if (data != ret)
  262. {
  263. // rt_kprintf("icdc write reg %x err exp %x now is %x\n", reg, data, ret);
  264. ret = -1;
  265. }
  266. }
  267. return ret;
  268. }
  269. static int icodec_hw_write_extend(struct jz_icodec *icodec, uint8_t sreg, uint8_t sdata)
  270. {
  271. int creg, cdata, dreg;
  272. switch (sreg) {
  273. case SCODA_MIX_0 ... SCODA_MIX_4:
  274. creg = SCODA_REG_CR_MIX;
  275. dreg = SCODA_REG_DR_MIX;
  276. sreg -= (SCODA_REG_SR_TR_SRCDAC + 1);
  277. break;
  278. case SCODA_DAC_AGC0 ... SCODA_DAC_AGC3:
  279. creg = SCODA_REG_CR_DAC_AGC;
  280. dreg = SCODA_REG_DR_DAC_AGC;
  281. sreg -= (SCODA_MIX_4 +1);
  282. break;
  283. case SCODA_DAC2_AGC0 ... SCODA_DAC2_AGC3:
  284. creg = SCODA_REG_CR_DAC2;
  285. dreg = SCODA_REG_DR_DAC2_AGC;
  286. sreg -= (SCODA_DAC_AGC3 + 1);
  287. break;
  288. case SCODA_ADC_AGC0 ... SCODA_ADC_AGC4:
  289. creg = SCODA_REG_CR_ADC_AGC;
  290. dreg = SCODA_REG_DR_ADC_AGC;
  291. sreg -= (SCODA_ADC_AGC4 + 1);
  292. break;
  293. default:
  294. return 0;
  295. }
  296. // rt_kprintf("write extend : sreg: %d [0 - 4], creg: %x sdata: %d\n", sreg, creg, sdata);
  297. cdata = (icodec_hw_read_normal(icodec,creg)&(~0x3f))|((sreg&0x3f)|0x40);
  298. icodec_hw_write_normal(icodec, creg, cdata);
  299. icodec_hw_write_normal(icodec, dreg, sdata);
  300. if(sdata!=icodec_hw_read_normal(icodec,dreg))
  301. return -1;
  302. return 0;
  303. }
  304. static uint8_t icodec_hw_read_extend(struct jz_icodec *icodec, uint8_t sreg)
  305. {
  306. int creg, cdata, dreg, ddata;
  307. switch (sreg)
  308. {
  309. case SCODA_MIX_0 ... SCODA_MIX_4:
  310. creg = SCODA_REG_CR_MIX;
  311. dreg = SCODA_REG_DR_MIX;
  312. sreg -= (SCODA_REG_SR_TR_SRCDAC + 1);
  313. break;
  314. case SCODA_DAC_AGC0 ... SCODA_DAC_AGC3:
  315. creg = SCODA_REG_CR_DAC_AGC;
  316. dreg = SCODA_REG_DR_DAC_AGC;
  317. sreg -= (SCODA_MIX_4 +1);
  318. break;
  319. case SCODA_DAC2_AGC0 ... SCODA_DAC2_AGC3:
  320. creg = SCODA_REG_CR_DAC2;
  321. dreg = SCODA_REG_DR_DAC2_AGC;
  322. sreg -= (SCODA_DAC_AGC3 + 1);
  323. break;
  324. case SCODA_ADC_AGC0 ... SCODA_ADC_AGC4:
  325. creg = SCODA_REG_CR_ADC_AGC;
  326. dreg = SCODA_REG_DR_ADC_AGC;
  327. sreg -= (SCODA_ADC_AGC4 + 1);
  328. break;
  329. default:
  330. return 0;
  331. }
  332. cdata = (icodec_hw_read_normal(icodec, creg) & (~0x7f)) | (sreg & 0x3f);
  333. icodec_hw_write_normal(icodec, creg, cdata);
  334. ddata = icodec_hw_read_normal(icodec, dreg);
  335. return (uint8_t) ddata;
  336. }
  337. static inline uint8_t icodec_hw_read(struct jz_icodec *icodec, int reg)
  338. {
  339. if (reg > SCODA_REG_SR_TR_SRCDAC)
  340. return icodec_hw_read_extend(icodec, reg);
  341. else
  342. return icodec_hw_read_normal(icodec, reg);
  343. }
  344. static inline int icodec_hw_write(struct jz_icodec *icodec, int reg, int data)
  345. {
  346. if (reg > SCODA_REG_SR_TR_SRCDAC)
  347. return icodec_hw_write_extend(icodec, reg, data);
  348. else
  349. return icodec_hw_write_normal(icodec, reg, data);
  350. }
  351. #endif /* _DRV_CODEC_ICODEC_H_ */