ac108.c 58 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783
  1. /*
  2. * Copyright (c) 2019-2025 Allwinner Technology Co., Ltd. ALL rights reserved.
  3. *
  4. * Allwinner is a trademark of Allwinner Technology Co.,Ltd., registered in
  5. * the the people's Republic of China and other countries.
  6. * All Allwinner Technology Co.,Ltd. trademarks are used with permission.
  7. *
  8. * DISCLAIMER
  9. * THIRD PARTY LICENCES MAY BE REQUIRED TO IMPLEMENT THE SOLUTION/PRODUCT.
  10. * IF YOU NEED TO INTEGRATE THIRD PARTY’S TECHNOLOGY (SONY, DTS, DOLBY, AVS OR MPEGLA, ETC.)
  11. * IN ALLWINNERS’SDK OR PRODUCTS, YOU SHALL BE SOLELY RESPONSIBLE TO OBTAIN
  12. * ALL APPROPRIATELY REQUIRED THIRD PARTY LICENCES.
  13. * ALLWINNER SHALL HAVE NO WARRANTY, INDEMNITY OR OTHER OBLIGATIONS WITH RESPECT TO MATTERS
  14. * COVERED UNDER ANY REQUIRED THIRD PARTY LICENSE.
  15. * YOU ARE SOLELY RESPONSIBLE FOR YOUR USAGE OF THIRD PARTY’S TECHNOLOGY.
  16. *
  17. *
  18. * THIS SOFTWARE IS PROVIDED BY ALLWINNER"AS IS" AND TO THE MAXIMUM EXTENT
  19. * PERMITTED BY LAW, ALLWINNER EXPRESSLY DISCLAIMS ALL WARRANTIES OF ANY KIND,
  20. * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION REGARDING
  21. * THE TITLE, NON-INFRINGEMENT, ACCURACY, CONDITION, COMPLETENESS, PERFORMANCE
  22. * OR MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  23. * IN NO EVENT SHALL ALLWINNER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  24. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  25. * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  26. * LOSS OF USE, DATA, OR PROFITS, OR BUSINESS INTERRUPTION)
  27. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  28. * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  29. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
  30. * OF THE POSSIBILITY OF SUCH DAMAGE.
  31. */
  32. #include <stdio.h>
  33. #include <stdlib.h>
  34. #include <string.h>
  35. #include <ctype.h>
  36. #include <getopt.h>
  37. #include <sound/snd_core.h>
  38. #include <sound/snd_pcm.h>
  39. #include <sound/pcm_common.h>
  40. #include <aw_common.h>
  41. #include <unistd.h>
  42. #include "ac108.h"
  43. //test config
  44. #define AC108_KCONTROL_TEST_EN
  45. //add to
  46. #undef AC108_IDLE_RESET_EN
  47. //AC108 SDO2/TX2 Enable (SDO1 has be enabled default)
  48. #define AC108_SDO2_EN 0
  49. #define AC108_DMIC_EN 0 //0:ADC 1:DMIC
  50. #undef AC108_IDLE_RESET_EN //reset AC108 when in idle time
  51. #define AC108_POWERON_RESET_EN 1 //AC108 poweron soft reset enable
  52. //add to
  53. #undef AC108_POWERON_RESET_EN
  54. #define AC108_REGULATOR_NAME "regulator_name"
  55. #define AC108_RATES (SNDRV_PCM_RATE_8000_96000 | SNDRV_PCM_RATE_KNOT)
  56. #define AC108_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \
  57. SNDRV_PCM_FMTBIT_S20_3LE | \
  58. SNDRV_PCM_FMTBIT_S24_LE | \
  59. SNDRV_PCM_FMTBIT_S32_LE)
  60. struct real_val_to_reg_val {
  61. unsigned int real_val;
  62. unsigned int reg_val;
  63. };
  64. struct pll_div {
  65. unsigned int freq_in;
  66. unsigned int freq_out;
  67. unsigned int m1;
  68. unsigned int m2;
  69. unsigned int n;
  70. unsigned int k1;
  71. unsigned int k2;
  72. };
  73. #if 0
  74. static const unsigned char ac108_reg_addr_list[] = {
  75. CHIP_AUDIO_RST,
  76. //Power Control
  77. PWR_CTRL1,
  78. PWR_CTRL2,
  79. PWR_CTRL3,
  80. PWR_CTRL4,
  81. PWR_CTRL5,
  82. PWR_CTRL6,
  83. PWR_CTRL7,
  84. PWR_CTRL8,
  85. PWR_CTRL9,
  86. //PLL Configure Control
  87. PLL_CTRL1,
  88. PLL_CTRL2,
  89. PLL_CTRL3,
  90. PLL_CTRL4,
  91. PLL_CTRL5,
  92. PLL_CTRL6,
  93. PLL_CTRL7,
  94. PLL_LOCK_CTRL,
  95. //System Clock Control
  96. SYSCLK_CTRL,
  97. MOD_CLK_EN,
  98. MOD_RST_CTRL,
  99. DSM_CLK_CTRL,
  100. //I2S Common Control
  101. I2S_CTRL,
  102. I2S_BCLK_CTRL,
  103. I2S_LRCK_CTRL1,
  104. I2S_LRCK_CTRL2,
  105. I2S_FMT_CTRL1,
  106. I2S_FMT_CTRL2,
  107. I2S_FMT_CTRL3,
  108. //I2S TX1 Control
  109. I2S_TX1_CTRL1,
  110. I2S_TX1_CTRL2,
  111. I2S_TX1_CTRL3,
  112. I2S_TX1_CHMP_CTRL1,
  113. I2S_TX1_CHMP_CTRL2,
  114. I2S_TX1_CHMP_CTRL3,
  115. I2S_TX1_CHMP_CTRL4,
  116. //I2S TX2 Control
  117. I2S_TX2_CTRL1,
  118. I2S_TX2_CTRL2,
  119. I2S_TX2_CTRL3,
  120. I2S_TX2_CHMP_CTRL1,
  121. I2S_TX2_CHMP_CTRL2,
  122. I2S_TX2_CHMP_CTRL3,
  123. I2S_TX2_CHMP_CTRL4,
  124. //I2S RX1 Control
  125. I2S_RX1_CTRL1,
  126. I2S_RX1_CHMP_CTRL1,
  127. I2S_RX1_CHMP_CTRL2,
  128. I2S_RX1_CHMP_CTRL3,
  129. I2S_RX1_CHMP_CTRL4,
  130. //I2S Loopback Debug
  131. I2S_LPB_DEBUG,
  132. //ADC Common Control
  133. ADC_SPRC,
  134. ADC_DIG_EN,
  135. DMIC_EN,
  136. ADC_DSR,
  137. ADC_FIR,
  138. ADC_DDT_CTRL,
  139. //HPF Control
  140. HPF_EN,
  141. HPF_COEF_REGH1,
  142. HPF_COEF_REGH2,
  143. HPF_COEF_REGL1,
  144. HPF_COEF_REGL2,
  145. HPF_GAIN_REGH1,
  146. HPF_GAIN_REGH2,
  147. HPF_GAIN_REGL1,
  148. HPF_GAIN_REGL2,
  149. //ADC Digital Channel Volume Control
  150. ADC1_DVOL_CTRL,
  151. ADC2_DVOL_CTRL,
  152. ADC3_DVOL_CTRL,
  153. ADC4_DVOL_CTRL,
  154. //ADC Digital Mixer Source and Gain Control
  155. ADC1_DMIX_SRC,
  156. ADC2_DMIX_SRC,
  157. ADC3_DMIX_SRC,
  158. ADC4_DMIX_SRC,
  159. //ADC Digital Debug Control
  160. ADC_DIG_DEBUG,
  161. //I2S Pad Drive Control
  162. I2S_DAT_PADDRV_CTRL,
  163. I2S_CLK_PADDRV_CTRL,
  164. //Analog PGA Control
  165. ANA_PGA1_CTRL,
  166. ANA_PGA2_CTRL,
  167. ANA_PGA3_CTRL,
  168. ANA_PGA4_CTRL,
  169. //MIC Offset Control
  170. MIC_OFFSET_CTRL1,
  171. MIC_OFFSET_CTRL2,
  172. MIC1_OFFSET_STATU1,
  173. MIC1_OFFSET_STATU2,
  174. MIC2_OFFSET_STATU1,
  175. MIC2_OFFSET_STATU2,
  176. MIC3_OFFSET_STATU1,
  177. MIC3_OFFSET_STATU2,
  178. MIC4_OFFSET_STATU1,
  179. MIC4_OFFSET_STATU2,
  180. //ADC1 Analog Control
  181. ANA_ADC1_CTRL1,
  182. ANA_ADC1_CTRL2,
  183. ANA_ADC1_CTRL3,
  184. ANA_ADC1_CTRL4,
  185. ANA_ADC1_CTRL5,
  186. ANA_ADC1_CTRL6,
  187. ANA_ADC1_CTRL7,
  188. //ADC2 Analog Control
  189. ANA_ADC2_CTRL1,
  190. ANA_ADC2_CTRL2,
  191. ANA_ADC2_CTRL3,
  192. ANA_ADC2_CTRL4,
  193. ANA_ADC2_CTRL5,
  194. ANA_ADC2_CTRL6,
  195. ANA_ADC2_CTRL7,
  196. //ADC3 Analog Control
  197. ANA_ADC3_CTRL1,
  198. ANA_ADC3_CTRL2,
  199. ANA_ADC3_CTRL3,
  200. ANA_ADC3_CTRL4,
  201. ANA_ADC3_CTRL5,
  202. ANA_ADC3_CTRL6,
  203. ANA_ADC3_CTRL7,
  204. //ADC4 Analog Control
  205. ANA_ADC4_CTRL1,
  206. ANA_ADC4_CTRL2,
  207. ANA_ADC4_CTRL3,
  208. ANA_ADC4_CTRL4,
  209. ANA_ADC4_CTRL5,
  210. ANA_ADC4_CTRL6,
  211. ANA_ADC4_CTRL7,
  212. //GPIO Configure
  213. GPIO_CFG1,
  214. GPIO_CFG2,
  215. GPIO_DAT,
  216. GPIO_DRV,
  217. GPIO_PULL,
  218. GPIO_INT_CFG,
  219. GPIO_INT_EN,
  220. GPIO_INT_STATUS,
  221. //Misc
  222. BGTC_DAT,
  223. BGVC_DAT,
  224. PRNG_CLK_CTRL,
  225. };
  226. #endif
  227. static const struct real_val_to_reg_val ac108_sample_rate[] = {
  228. {8000, 0},
  229. {11025, 1},
  230. {12000, 2},
  231. {16000, 3},
  232. {22050, 4},
  233. {24000, 5},
  234. {32000, 6},
  235. {44100, 7},
  236. {48000, 8},
  237. {96000, 9},
  238. };
  239. static const struct real_val_to_reg_val ac108_sample_resolution[] = {
  240. {8, 1},
  241. {12, 2},
  242. {16, 3},
  243. {20, 4},
  244. {24, 5},
  245. {28, 6},
  246. {32, 7},
  247. };
  248. static const struct real_val_to_reg_val ac108_bclk_div[] = {
  249. {0, 0},
  250. {1, 1},
  251. {2, 2},
  252. {4, 3},
  253. {6, 4},
  254. {8, 5},
  255. {12, 6},
  256. {16, 7},
  257. {24, 8},
  258. {32, 9},
  259. {48, 10},
  260. {64, 11},
  261. {96, 12},
  262. {128, 13},
  263. {176, 14},
  264. {192, 15},
  265. };
  266. //FOUT =(FIN * N) / [(M1+1) * (M2+1)*(K1+1)*(K2+1)] ;
  267. //M1[0,31], M2[0,1], N[0,1023], K1[0,31], K2[0,1]
  268. static const struct pll_div ac108_pll_div[] = {
  269. {400000, 24576000, 0, 0, 983, 7, 1}, //<out: 24.575M>
  270. {512000, 24576000, 0, 0, 960, 9, 1}, //24576000/48
  271. {768000, 24576000, 0, 0, 640, 9, 1}, //24576000/32
  272. {800000, 24576000, 0, 0, 768, 24, 0},
  273. {1024000, 24576000, 0, 0, 480, 9, 1}, //24576000/24
  274. {1600000, 24576000, 0, 0, 384, 24, 0},
  275. {2048000, 24576000, 0, 0, 240, 9, 1}, //24576000/12
  276. {3072000, 24576000, 0, 0, 160, 9, 1}, //24576000/8
  277. {4096000, 24576000, 0, 0, 120, 9, 1}, //24576000/6
  278. {6000000, 24576000, 4, 0, 512, 24, 0},
  279. {12000000, 24576000, 9, 0, 512, 24, 0},
  280. {13000000, 24576000, 12, 0, 639, 12, 1}, //<out: 24.577M>
  281. {15360000, 24576000, 9, 0, 320, 9, 1},
  282. {16000000, 24576000, 9, 0, 384, 24, 0},
  283. {19200000, 24576000, 11, 0, 384, 24, 0},
  284. {19680000, 24576000, 15, 1, 999, 24, 0}, //<out: 24.575M>
  285. {24000000, 24576000, 9, 0, 256, 24, 0},
  286. {400000, 22579200, 0, 0, 1016, 8, 1}, //<out: 22.5778M>
  287. {512000, 22579200, 0, 0, 882, 9, 1},
  288. {768000, 22579200, 0, 0, 588, 9, 1},
  289. {800000, 22579200, 0, 0, 508, 8, 1}, //<out: 22.5778M>
  290. {1024000, 22579200, 0, 0, 441, 9, 1},
  291. {1600000, 22579200, 0, 0, 254, 8, 1}, //<out: 22.5778M>
  292. {2048000, 22579200, 1, 0, 441, 9, 1},
  293. {3072000, 22579200, 2, 0, 441, 9, 1},
  294. {4096000, 22579200, 3, 0, 441, 9, 1},
  295. {6000000, 22579200, 5, 0, 429, 18, 0}, //<out: 22.5789M>
  296. {12000000, 22579200, 11, 0, 429, 18, 0}, //<out: 22.5789M>
  297. {13000000, 22579200, 12, 0, 429, 18, 0}, //<out: 22.5789M>
  298. {15360000, 22579200, 14, 0, 441, 9, 1},
  299. {16000000, 22579200, 24, 0, 882, 24, 0},
  300. {19200000, 22579200, 4, 0, 147, 24, 0},
  301. {19680000, 22579200, 13, 1, 771, 23, 0}, //<out: 22.5793M>
  302. {24000000, 22579200, 24, 0, 588, 24, 0},
  303. {12288000, 24576000, 9, 0, 400, 9, 1}, //24576000/2
  304. {11289600, 22579200, 9, 0, 400, 9, 1}, //22579200/2
  305. {24576000/1, 24576000, 9, 0, 200, 9, 1}, //24576000
  306. {24576000/4, 24576000, 4, 0, 400, 9, 1}, //6144000
  307. {24576000/16, 24576000, 0, 0, 320, 9, 1}, //1536000
  308. {24576000/64, 24576000, 0, 0, 640, 4, 1}, //384000
  309. {24576000/96, 24576000, 0, 0, 960, 4, 1}, //256000
  310. {24576000/128, 24576000, 0, 0, 512, 1, 1}, //192000
  311. {24576000/176, 24576000, 0, 0, 880, 4, 0}, //140000
  312. {24576000/192, 24576000, 0, 0, 960, 4, 0}, //128000
  313. {22579200/1, 22579200, 9, 0, 200, 9, 1}, //22579200
  314. {22579200/4, 22579200, 4, 0, 400, 9, 1}, //5644800
  315. {22579200/16, 22579200, 0, 0, 320, 9, 1}, //1411200
  316. {22579200/64, 22579200, 0, 0, 640, 4, 1}, //352800
  317. {22579200/96, 22579200, 0, 0, 960, 4, 1}, //235200
  318. {22579200/128, 22579200, 0, 0, 512, 1, 1}, //176400
  319. {22579200/176, 22579200, 0, 0, 880, 4, 0}, //128290
  320. {22579200/192, 22579200, 0, 0, 960, 4, 0}, //117600
  321. {22579200/6, 22579200, 2, 0, 360, 9, 1}, //3763200
  322. {22579200/8, 22579200, 0, 0, 160, 9, 1}, //2822400
  323. {22579200/12, 22579200, 0, 0, 240, 9, 1}, //1881600
  324. {22579200/24, 22579200, 0, 0, 480, 9, 1}, //940800
  325. {22579200/32, 22579200, 0, 0, 640, 9, 1}, //705600
  326. {22579200/48, 22579200, 0, 0, 960, 9, 1}, //470400
  327. };
  328. static twi_status_t ac108_init_i2c_device(twi_port_t port)
  329. {
  330. twi_status_t ret = 0;
  331. ret = hal_twi_init(port);
  332. if (ret != TWI_STATUS_OK) {
  333. snd_err("init i2c err ret=%d.\n", ret);
  334. return ret;
  335. }
  336. return TWI_STATUS_OK;
  337. }
  338. static twi_status_t ac108_deinit_i2c_device(twi_port_t port)
  339. {
  340. twi_status_t ret = 0;
  341. ret = hal_twi_uninit(port);
  342. if (ret != TWI_STATUS_OK) {
  343. snd_err("init i2c err ret=%d.\n", ret);
  344. return ret;
  345. }
  346. return TWI_STATUS_OK;
  347. }
  348. static twi_status_t ac108_read(struct twi_device *twi_dev,
  349. unsigned char reg, unsigned char *rt_value)
  350. {
  351. twi_status_t ret;
  352. hal_twi_control(twi_dev->bus, I2C_SLAVE, &twi_dev->addr);
  353. ret = hal_twi_read(twi_dev->bus, reg, rt_value, 1);
  354. if (ret != TWI_STATUS_OK) {
  355. snd_err("error = %d [REG-0x%02x]\n", ret, reg);
  356. return ret;
  357. }
  358. return TWI_STATUS_OK;
  359. }
  360. static int ac108_write(struct twi_device *twi_dev,
  361. unsigned char reg, unsigned char value)
  362. {
  363. twi_status_t ret;
  364. twi_msg_t msg;
  365. unsigned char buf[2] = {reg, value};
  366. msg.flags = 0;
  367. msg.addr = twi_dev->addr;
  368. msg.len = 2;
  369. msg.buf = buf;
  370. ret = hal_twi_control(twi_dev->bus, I2C_RDWR, &msg);
  371. if (ret != TWI_STATUS_OK) {
  372. snd_err("error = %d [REG-0x%02x]\n", ret, reg);
  373. return ret;
  374. }
  375. return TWI_STATUS_OK;
  376. }
  377. static int ac108_update_bits(struct twi_device *twi_dev,
  378. unsigned char reg, unsigned char mask, unsigned char value)
  379. {
  380. unsigned char val_old = 0;
  381. unsigned char val_new = 0;
  382. ac108_read(twi_dev, reg, &val_old);
  383. val_new = (val_old & ~mask) | (value & mask);
  384. if (val_new != val_old)
  385. ac108_write(twi_dev, reg, val_new);
  386. return 0;
  387. }
  388. static int ac108_multi_chips_write(struct ac108_priv *ac108,
  389. unsigned char reg, unsigned char value)
  390. {
  391. unsigned char i;
  392. for (i = 0; i < ac108->param.chip_num; i++)
  393. ac108_write(&(ac108->param.twi_dev[i]), reg, value);
  394. return 0;
  395. }
  396. static int ac108_multi_chips_update_bits(struct ac108_priv *ac108,
  397. unsigned char reg, unsigned char mask, unsigned char value)
  398. {
  399. unsigned char i;
  400. for (i = 0; i < ac108->param.chip_num; i++)
  401. ac108_update_bits(&(ac108->param.twi_dev[i]), reg, mask, value);
  402. return 0;
  403. }
  404. #ifdef AC108_KCONTROL_TEST_EN
  405. /* ac108 mixer controls define */
  406. static const char * const adc_digital_src_mux[] = {
  407. "ADC1_Switch", "ADC2_Switch", "ADC3_Switch", "ADC4_Switch",
  408. };
  409. static const char * const adc12_dmic1_src_mux[] = {
  410. "ADC12_Switch", "DMIC1_Switch",
  411. };
  412. static const char * const adc34_dmic2_src_mux[] = {
  413. "ADC34_Switch", "DMIC2_Switch",
  414. };
  415. static const char * const i2s_tx1ch_map_mux[] = {
  416. "ADC1_Sample_Switch", "ADC2_Sample_Switch",
  417. "ADC3_Sample_Switch", "ADC4_Sample_Switch",
  418. };
  419. static int ac108_ctl_enum_value_get(struct snd_kcontrol *kcontrol,
  420. struct snd_ctl_info *info)
  421. {
  422. unsigned int val = 0;
  423. if (kcontrol->type != SND_CTL_ELEM_TYPE_ENUMERATED) {
  424. snd_err("invalid kcontrol type = %d.\n", kcontrol->type);
  425. return -EINVAL;
  426. }
  427. if (kcontrol->private_data_type == SND_MODULE_CODEC) {
  428. struct snd_codec *codec = kcontrol->private_data;
  429. struct ac108_priv *ac108 = codec->private_data;
  430. struct ac108_param *param = &ac108->param;
  431. ac108_read(&param->twi_dev[0], kcontrol->reg, (unsigned char *)&val);
  432. } else {
  433. snd_err("%s invalid kcontrol data type = %d.\n", __func__,
  434. kcontrol->private_data_type);
  435. }
  436. snd_kcontrol_to_snd_ctl_info(kcontrol, info, val);
  437. return 0;
  438. }
  439. static int ac108_ctl_enum_value_set(struct snd_kcontrol *kcontrol, unsigned long val)
  440. {
  441. if (kcontrol->type != SND_CTL_ELEM_TYPE_ENUMERATED) {
  442. snd_err("invalid kcontrol type = %d.\n", kcontrol->type);
  443. return -EINVAL;
  444. }
  445. if (val >= kcontrol->items) {
  446. snd_err("invalid kcontrol items = %ld.\n", val);
  447. return -EINVAL;
  448. }
  449. if (kcontrol->private_data_type == SND_MODULE_CODEC) {
  450. struct snd_codec *codec = kcontrol->private_data;
  451. struct ac108_priv *ac108 = codec->private_data;
  452. struct ac108_param *param = &ac108->param;
  453. ac108_update_bits(&param->twi_dev[0], kcontrol->reg,
  454. (kcontrol->mask << kcontrol->shift),
  455. ((unsigned int)val << kcontrol->shift));
  456. } else {
  457. snd_err("invalid kcontrol data type = %d.\n",
  458. kcontrol->private_data_type);
  459. return -EINVAL;
  460. }
  461. kcontrol->value = val & kcontrol->mask;
  462. snd_info("mask:0x%x, shift:%d, value:0x%x\n",
  463. kcontrol->mask, kcontrol->shift, kcontrol->value);
  464. return 0;
  465. }
  466. static int ac108_ctl_value_get(struct snd_kcontrol *kcontrol,
  467. struct snd_ctl_info *info)
  468. {
  469. unsigned int val = 0;
  470. int mask = 0;
  471. if (kcontrol->type != SND_CTL_ELEM_TYPE_INTEGER) {
  472. snd_err("invalid kcontrol type = %d.\n", kcontrol->type);
  473. return -EINVAL;
  474. }
  475. if (kcontrol->private_data_type == SND_MODULE_CODEC) {
  476. struct snd_codec *codec = kcontrol->private_data;
  477. struct ac108_priv *ac108 = codec->private_data;
  478. struct ac108_param *param = &ac108->param;
  479. ac108_read(&param->twi_dev[0], kcontrol->reg, (unsigned char *)&val);
  480. } else {
  481. snd_err("%s invalid kcontrol data type = %d.\n", __func__,
  482. kcontrol->private_data_type);
  483. }
  484. snd_kcontrol_to_snd_ctl_info(kcontrol, info, val);
  485. return 0;
  486. }
  487. static int ac108_ctl_value_set(struct snd_kcontrol *kcontrol, unsigned long val)
  488. {
  489. if (kcontrol->type != SND_CTL_ELEM_TYPE_INTEGER) {
  490. snd_err("invalid kcontrol type = %d.\n", kcontrol->type);
  491. return -EINVAL;
  492. }
  493. if (kcontrol->private_data_type == SND_MODULE_CODEC) {
  494. struct snd_codec *codec = kcontrol->private_data;
  495. struct ac108_priv *ac108 = codec->private_data;
  496. struct ac108_param *param = &ac108->param;
  497. ac108_update_bits(&param->twi_dev[0], kcontrol->reg,
  498. (kcontrol->mask << kcontrol->shift),
  499. ((unsigned int)val << kcontrol->shift));
  500. } else {
  501. snd_err("%s invalid kcontrol data type = %d.\n", __func__,
  502. kcontrol->private_data_type);
  503. }
  504. snd_info("mask:0x%x, shitf:%d, value:0x%x\n",
  505. kcontrol->mask, kcontrol->shift, val);
  506. return 0;
  507. }
  508. static struct snd_kcontrol ac108_codec_controls[] = {
  509. //ADC1 DIG MUX
  510. SND_CTL_ENUM_VALUE_EXT("ADC1 DIG MUX", ARRAY_SIZE(adc_digital_src_mux),
  511. adc_digital_src_mux, ADC_DSR, DIG_ADC1_SRS,
  512. SND_CTL_ENUM_AUTO_MASK,
  513. ac108_ctl_enum_value_get, ac108_ctl_enum_value_set),
  514. //ADC2 DIG MUX
  515. SND_CTL_ENUM_VALUE_EXT("ADC2 DIG MUX", ARRAY_SIZE(adc_digital_src_mux),
  516. adc_digital_src_mux, ADC_DSR, DIG_ADC2_SRS,
  517. SND_CTL_ENUM_AUTO_MASK,
  518. ac108_ctl_enum_value_get, ac108_ctl_enum_value_set),
  519. //ADC3 DIG MUX
  520. SND_CTL_ENUM_VALUE_EXT("ADC3 DIG MUX", ARRAY_SIZE(adc_digital_src_mux),
  521. adc_digital_src_mux, ADC_DSR, DIG_ADC3_SRS,
  522. SND_CTL_ENUM_AUTO_MASK,
  523. ac108_ctl_enum_value_get, ac108_ctl_enum_value_set),
  524. //ADC4 DIG MUX
  525. SND_CTL_ENUM_VALUE_EXT("ADC4 DIG MUX", ARRAY_SIZE(adc_digital_src_mux),
  526. adc_digital_src_mux, ADC_DSR, DIG_ADC4_SRS,
  527. SND_CTL_ENUM_AUTO_MASK,
  528. ac108_ctl_enum_value_get, ac108_ctl_enum_value_set),
  529. //ADC12 DMIC1 MUX
  530. SND_CTL_ENUM_VALUE_EXT("ADC12 DMIC1 MUX", ARRAY_SIZE(adc12_dmic1_src_mux),
  531. adc12_dmic1_src_mux, DMIC_EN, DMIC1_EN,
  532. SND_CTL_ENUM_AUTO_MASK,
  533. ac108_ctl_enum_value_get, ac108_ctl_enum_value_set),
  534. //ADC34 DMIC2 MUX
  535. SND_CTL_ENUM_VALUE_EXT("ADC34 DMIC2 MUX", ARRAY_SIZE(adc34_dmic2_src_mux),
  536. adc34_dmic2_src_mux, DMIC_EN, DMIC2_EN,
  537. SND_CTL_ENUM_AUTO_MASK,
  538. ac108_ctl_enum_value_get, ac108_ctl_enum_value_set),
  539. //ADC1 DIG MIXER
  540. SND_CTL_KCONTROL_VALUE_EXT("ADC1 DIG MIXER ADC1 DAT switch",
  541. ADC1_DMIX_SRC, ADC1_ADC1_DMXL_SRC, 1, 0,
  542. ac108_ctl_value_get, ac108_ctl_value_set),
  543. SND_CTL_KCONTROL_VALUE_EXT("ADC1 DIG MIXER ADC2 DAT switch",
  544. ADC1_DMIX_SRC, ADC1_ADC2_DMXL_SRC, 1, 0,
  545. ac108_ctl_value_get, ac108_ctl_value_set),
  546. SND_CTL_KCONTROL_VALUE_EXT("ADC1 DIG MIXER ADC3 DAT switch",
  547. ADC1_DMIX_SRC, ADC1_ADC3_DMXL_SRC, 1, 0,
  548. ac108_ctl_value_get, ac108_ctl_value_set),
  549. SND_CTL_KCONTROL_VALUE_EXT("ADC1 DIG MIXER ADC4 DAT switch",
  550. ADC1_DMIX_SRC, ADC1_ADC4_DMXL_SRC, 1, 0,
  551. ac108_ctl_value_get, ac108_ctl_value_set),
  552. //ADC2 DIG MIXER
  553. SND_CTL_KCONTROL_VALUE_EXT("ADC2 DIG MIXER ADC1 DAT switch",
  554. ADC2_DMIX_SRC, ADC2_ADC1_DMXL_SRC, 1, 0,
  555. ac108_ctl_value_get, ac108_ctl_value_set),
  556. SND_CTL_KCONTROL_VALUE_EXT("ADC2 DIG MIXER ADC2 DAT switch",
  557. ADC2_DMIX_SRC, ADC2_ADC2_DMXL_SRC, 1, 0,
  558. ac108_ctl_value_get, ac108_ctl_value_set),
  559. SND_CTL_KCONTROL_VALUE_EXT("ADC2 DIG MIXER ADC3 DAT switch",
  560. ADC2_DMIX_SRC, ADC2_ADC3_DMXL_SRC, 1, 0,
  561. ac108_ctl_value_get, ac108_ctl_value_set),
  562. SND_CTL_KCONTROL_VALUE_EXT("ADC2 DIG MIXER ADC4 DAT switch",
  563. ADC2_DMIX_SRC, ADC2_ADC4_DMXL_SRC, 1, 0,
  564. ac108_ctl_value_get, ac108_ctl_value_set),
  565. //ADC3 DIG MIXER
  566. SND_CTL_KCONTROL_VALUE_EXT("ADC3 DIG MIXER ADC1 DAT switch",
  567. ADC3_DMIX_SRC, ADC3_ADC1_DMXL_SRC, 1, 0,
  568. ac108_ctl_value_get, ac108_ctl_value_set),
  569. SND_CTL_KCONTROL_VALUE_EXT("ADC3 DIG MIXER ADC2 DAT switch",
  570. ADC3_DMIX_SRC, ADC3_ADC2_DMXL_SRC, 1, 0,
  571. ac108_ctl_value_get, ac108_ctl_value_set),
  572. SND_CTL_KCONTROL_VALUE_EXT("ADC3 DIG MIXER ADC3 DAT switch",
  573. ADC3_DMIX_SRC, ADC3_ADC3_DMXL_SRC, 1, 0,
  574. ac108_ctl_value_get, ac108_ctl_value_set),
  575. SND_CTL_KCONTROL_VALUE_EXT("ADC3 DIG MIXER ADC4 DAT switch",
  576. ADC3_DMIX_SRC, ADC3_ADC4_DMXL_SRC, 1, 0,
  577. ac108_ctl_value_get, ac108_ctl_value_set),
  578. //ADC4 DIG MIXER
  579. SND_CTL_KCONTROL_VALUE_EXT("ADC4 DIG MIXER ADC1 DAT switch",
  580. ADC4_DMIX_SRC, ADC4_ADC1_DMXL_SRC, 1, 0,
  581. ac108_ctl_value_get, ac108_ctl_value_set),
  582. SND_CTL_KCONTROL_VALUE_EXT("ADC4 DIG MIXER ADC2 DAT switch",
  583. ADC4_DMIX_SRC, ADC4_ADC2_DMXL_SRC, 1, 0,
  584. ac108_ctl_value_get, ac108_ctl_value_set),
  585. SND_CTL_KCONTROL_VALUE_EXT("ADC4 DIG MIXER ADC3 DAT switch",
  586. ADC4_DMIX_SRC, ADC4_ADC3_DMXL_SRC, 1, 0,
  587. ac108_ctl_value_get, ac108_ctl_value_set),
  588. SND_CTL_KCONTROL_VALUE_EXT("ADC4 DIG MIXER ADC4 DAT switch",
  589. ADC4_DMIX_SRC, ADC4_ADC4_DMXL_SRC, 1, 0,
  590. ac108_ctl_value_get, ac108_ctl_value_set),
  591. //I2S TX1 CH1 MUX
  592. SND_CTL_ENUM_VALUE_EXT("I2S TX1 CH1 MUX", ARRAY_SIZE(i2s_tx1ch_map_mux),
  593. i2s_tx1ch_map_mux, I2S_TX1_CHMP_CTRL1, TX1_CH1_MAP,
  594. SND_CTL_ENUM_AUTO_MASK,
  595. ac108_ctl_enum_value_get, ac108_ctl_enum_value_set),
  596. //I2S TX1 CH2 MUX
  597. SND_CTL_ENUM_VALUE_EXT("I2S TX1 CH2 MUX", ARRAY_SIZE(i2s_tx1ch_map_mux),
  598. i2s_tx1ch_map_mux, I2S_TX1_CHMP_CTRL1, TX1_CH2_MAP,
  599. SND_CTL_ENUM_AUTO_MASK,
  600. ac108_ctl_enum_value_get, ac108_ctl_enum_value_set),
  601. //I2S TX1 CH3 MUX
  602. SND_CTL_ENUM_VALUE_EXT("I2S TX1 CH3 MUX", ARRAY_SIZE(i2s_tx1ch_map_mux),
  603. i2s_tx1ch_map_mux, I2S_TX1_CHMP_CTRL1, TX1_CH3_MAP,
  604. SND_CTL_ENUM_AUTO_MASK,
  605. ac108_ctl_enum_value_get, ac108_ctl_enum_value_set),
  606. //I2S TX1 CH4 MUX
  607. SND_CTL_ENUM_VALUE_EXT("I2S TX1 CH4 MUX", ARRAY_SIZE(i2s_tx1ch_map_mux),
  608. i2s_tx1ch_map_mux, I2S_TX1_CHMP_CTRL1, TX1_CH4_MAP,
  609. SND_CTL_ENUM_AUTO_MASK,
  610. ac108_ctl_enum_value_get, ac108_ctl_enum_value_set),
  611. };
  612. #endif
  613. static int ac108_codec_startup(struct snd_pcm_substream *substream,
  614. struct snd_dai *dai)
  615. {
  616. struct snd_codec *codec = dai->component;
  617. struct ac108_priv *ac108 = codec->private_data;
  618. struct ac108_param *param = &ac108->param;
  619. int ret = 0;
  620. snd_print("\n");
  621. return 0;
  622. }
  623. static int ac108_codec_set_pll(struct snd_dai *dai, int pll_id, int source,
  624. unsigned int freq_in, unsigned int freq_out)
  625. {
  626. struct snd_codec *codec = dai->component;
  627. struct ac108_priv *ac108 = codec->private_data;
  628. struct ac108_param *param = &ac108->param;
  629. unsigned int i = 0;
  630. unsigned int m1 = 0;
  631. unsigned int m2 = 0;
  632. unsigned int n = 0;
  633. unsigned int k1 = 0;
  634. unsigned int k2 = 0;
  635. snd_print("\n");
  636. if (freq_out == 0) {
  637. snd_err("freq_out is 0.\n");
  638. return 0;
  639. }
  640. //default: freq_int == freq_out; pll_id = 0; source = 0;
  641. if (freq_in < 128000 || freq_in > 24576000) {
  642. snd_err("AC108 PLLCLK source input freq only support [128K,24M],while now %u\n\n", freq_in);
  643. return -EINVAL;
  644. } else if ((freq_in == 24576000 || freq_in == 22579200) &&
  645. pll_id == SYSCLK_SRC_MCLK) {
  646. //System Clock Source Select MCLK, SYSCLK Enable
  647. snd_print("AC108 don't need to use PLL\n\n");
  648. ac108_multi_chips_update_bits(ac108, SYSCLK_CTRL,
  649. 0x1 << SYSCLK_SRC | 0x1 << SYSCLK_EN,
  650. 0x0 << SYSCLK_SRC | 0x1 << SYSCLK_EN);
  651. return 0; //Don't need to use PLL
  652. }
  653. //PLL Clock Source Select
  654. switch (pll_id) {
  655. case PLLCLK_SRC_MCLK:
  656. snd_print("AC108 PLLCLK input source select MCLK\n");
  657. ac108_multi_chips_update_bits(ac108, SYSCLK_CTRL, 0x3 << PLLCLK_SRC,
  658. 0x0 << PLLCLK_SRC);
  659. break;
  660. case PLLCLK_SRC_BCLK:
  661. snd_print("AC108 PLLCLK input source select BCLK\n");
  662. ac108_multi_chips_update_bits(ac108, SYSCLK_CTRL, 0x3 << PLLCLK_SRC,
  663. 0x1 << PLLCLK_SRC);
  664. break;
  665. case PLLCLK_SRC_GPIO2:
  666. snd_print("AC108 PLLCLK input source select GPIO2\n");
  667. ac108_multi_chips_update_bits(ac108, SYSCLK_CTRL, 0x3 << PLLCLK_SRC,
  668. 0x2 << PLLCLK_SRC);
  669. break;
  670. case PLLCLK_SRC_GPIO3:
  671. snd_print("AC108 PLLCLK input source select GPIO3\n");
  672. ac108_multi_chips_update_bits(ac108, SYSCLK_CTRL, 0x3 << PLLCLK_SRC,
  673. 0x3 << PLLCLK_SRC);
  674. break;
  675. default:
  676. snd_err("AC108 PLLCLK source config error:%d\n", pll_id);
  677. return -EINVAL;
  678. }
  679. //FOUT =(FIN * N) / [(M1+1) * (M2+1)*(K1+1)*(K2+1)] ;
  680. for (i = 0; i < ARRAY_SIZE(ac108_pll_div); i++) {
  681. if (ac108_pll_div[i].freq_in == freq_in &&
  682. ac108_pll_div[i].freq_out == freq_out) {
  683. m1 = ac108_pll_div[i].m1;
  684. m2 = ac108_pll_div[i].m2;
  685. n = ac108_pll_div[i].n;
  686. k1 = ac108_pll_div[i].k1;
  687. k2 = ac108_pll_div[i].k2;
  688. snd_print("AC108 PLL freq_in match:%u, freq_out:%u\n",
  689. freq_in, freq_out);
  690. break;
  691. }
  692. }
  693. if (i == ARRAY_SIZE(ac108_pll_div)) {
  694. snd_err("AC108 don't match PLLCLK freq_in and freq_out table\n");
  695. return -EINVAL;
  696. }
  697. //Config PLL DIV param M1/M2/N/K1/K2
  698. ac108_multi_chips_update_bits(ac108, PLL_CTRL2,
  699. 0x1f << PLL_PREDIV1 | 0x1 << PLL_PREDIV2,
  700. m1 << PLL_PREDIV1 | m2 << PLL_PREDIV2);
  701. ac108_multi_chips_update_bits(ac108, PLL_CTRL3, 0x3 << PLL_LOOPDIV_MSB,
  702. (n >> 8) << PLL_LOOPDIV_MSB);
  703. ac108_multi_chips_update_bits(ac108, PLL_CTRL4, 0xff << PLL_LOOPDIV_LSB,
  704. (u8)n << PLL_LOOPDIV_LSB);
  705. ac108_multi_chips_update_bits(ac108, PLL_CTRL5,
  706. (0x1f << PLL_POSTDIV1) | (0x1 << PLL_POSTDIV2),
  707. k1 << PLL_POSTDIV1 | (k2 << PLL_POSTDIV2));
  708. //Config PLL module current
  709. //ac108_multi_chips_update_bits(ac108, PLL_CTRL1, 0x7<<PLL_IBIAS, 0x4<<PLL_IBIAS);
  710. //ac108_multi_chips_update_bits(ac108, PLL_CTRL6, 0x1f<<PLL_CP, 0xf<<PLL_CP);
  711. //PLL module enable
  712. //PLL CLK lock enable
  713. ac108_multi_chips_update_bits(ac108, PLL_LOCK_CTRL, 0x1 << PLL_LOCK_EN,
  714. 0x1 << PLL_LOCK_EN);
  715. //PLL Common voltage Enable, PLL Enable
  716. //ac108_multi_chips_update_bits(ac108, PLL_CTRL1,
  717. // 0x1 << PLL_EN | 0x1 << PLL_COM_EN,
  718. // 0x1<<PLL_EN | 0x1<<PLL_COM_EN);
  719. //PLLCLK Enable, SYSCLK Enable
  720. //0x1<<SYSCLK_SRC
  721. ac108_multi_chips_update_bits(ac108, SYSCLK_CTRL,
  722. 0x1 << PLLCLK_EN | 0x1 << SYSCLK_EN,
  723. 0x1 << PLLCLK_EN | 0x1 << SYSCLK_EN);
  724. return 0;
  725. }
  726. static int ac108_codec_set_clkdiv(struct snd_dai *dai, int div_id, int div)
  727. {
  728. struct snd_codec *codec = dai->component;
  729. struct ac108_priv *ac108 = codec->private_data;
  730. struct ac108_param *param = &ac108->param;
  731. unsigned int i = 0;
  732. unsigned int bclk_div = 0;
  733. unsigned int bclk_div_reg_val = 0;
  734. snd_print("\n");
  735. /* default: div_id = 0; */
  736. if (param->daudio_master == 4) {
  737. /*
  738. *daudio_master(val << 12):
  739. * 1: SND_SOC_DAIFMT_CBM_CFM(codec clk & FRM master)
  740. * 4: SND_SOC_DAIFMT_CBS_CFS(codec clk & FRM slave)
  741. */
  742. snd_print("AC108 work as Slave mode, don't need to config BCLK_DIV.\n");
  743. return 0;
  744. }
  745. /* SND_SOC_DAIFMT_I2S*/
  746. switch (param->daudio_format) {
  747. case SND_SOC_DAIFMT_DSP_A:
  748. case SND_SOC_DAIFMT_DSP_B:
  749. bclk_div = div / param->lrck_period;
  750. break;
  751. case SND_SOC_DAIFMT_I2S:
  752. case SND_SOC_DAIFMT_RIGHT_J:
  753. case SND_SOC_DAIFMT_LEFT_J:
  754. default:
  755. bclk_div = div / (2 * param->lrck_period);
  756. break;
  757. }
  758. for (i = 0; i < ARRAY_SIZE(ac108_bclk_div); i++) {
  759. if (ac108_bclk_div[i].real_val == bclk_div) {
  760. bclk_div_reg_val = ac108_bclk_div[i].reg_val;
  761. snd_print("AC108 set BCLK_DIV_[%u]\n", bclk_div);
  762. break;
  763. }
  764. }
  765. if (i == ARRAY_SIZE(ac108_bclk_div)) {
  766. snd_err("AC108 don't support BCLK_DIV_[%u]\n", bclk_div);
  767. return -EINVAL;
  768. }
  769. //AC108 set BCLK DIV
  770. ac108_multi_chips_update_bits(ac108, I2S_BCLK_CTRL, 0xf << BCLKDIV,
  771. bclk_div_reg_val << BCLKDIV);
  772. return 0;
  773. }
  774. static int ac108_codec_set_fmt(struct snd_dai *dai, unsigned int fmt)
  775. {
  776. struct snd_codec *codec = dai->component;
  777. struct ac108_priv *ac108 = codec->private_data;
  778. struct ac108_param *param = &ac108->param;
  779. unsigned int i = 0;
  780. unsigned char tx_offset = 0;
  781. unsigned char i2s_mode = 0;
  782. unsigned char lrck_polarity = 0;
  783. unsigned char brck_polarity = 0;
  784. snd_print("\n");
  785. //AC108 config Master/Slave mode
  786. switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
  787. case SND_SOC_DAIFMT_CBM_CFM: //AC108 Master
  788. snd_print("AC108 set to work as Master\n");
  789. //BCLK & LRCK output
  790. ac108_update_bits(&param->twi_dev[0], I2S_CTRL, 0x3 << LRCK_IOEN,
  791. 0x3 << LRCK_IOEN);
  792. break;
  793. case SND_SOC_DAIFMT_CBS_CFS: //AC108 Slave
  794. snd_print("AC108 set to work as Slave\n");
  795. //BCLK & LRCK input
  796. ac108_update_bits(&param->twi_dev[0], I2S_CTRL, 0x3 << LRCK_IOEN,
  797. 0x0 << LRCK_IOEN);
  798. break;
  799. default:
  800. snd_err("AC108 Master/Slave mode config error:%u\n\n",
  801. (fmt & SND_SOC_DAIFMT_MASTER_MASK) >> 12);
  802. return -EINVAL;
  803. }
  804. for (i = 0; i < param->chip_num; i++) {
  805. /*
  806. * multi_chips: only one chip set as Master,
  807. * and the others also need to set as Slave
  808. */
  809. ac108_update_bits(&param->twi_dev[i], I2S_CTRL, 0x3 << LRCK_IOEN,
  810. 0x0 << LRCK_IOEN);
  811. }
  812. //AC108 config I2S/LJ/RJ/PCM format
  813. switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
  814. case SND_SOC_DAIFMT_I2S:
  815. snd_print("AC108 config I2S format\n");
  816. i2s_mode = LEFT_JUSTIFIED_FORMAT;
  817. tx_offset = 1;
  818. break;
  819. case SND_SOC_DAIFMT_RIGHT_J:
  820. snd_print("AC108 config RIGHT-JUSTIFIED format\n");
  821. i2s_mode = RIGHT_JUSTIFIED_FORMAT;
  822. tx_offset = 0;
  823. break;
  824. case SND_SOC_DAIFMT_LEFT_J:
  825. snd_print("AC108 config LEFT-JUSTIFIED format\n");
  826. i2s_mode = LEFT_JUSTIFIED_FORMAT;
  827. tx_offset = 0;
  828. break;
  829. case SND_SOC_DAIFMT_DSP_A:
  830. snd_print("AC108 config PCM-A format\n");
  831. i2s_mode = PCM_FORMAT;
  832. tx_offset = 1;
  833. break;
  834. case SND_SOC_DAIFMT_DSP_B:
  835. snd_print("AC108 config PCM-B format\n");
  836. i2s_mode = PCM_FORMAT;
  837. tx_offset = 0;
  838. break;
  839. default:
  840. snd_err("AC108 I2S format config error:%u\n\n",
  841. fmt & SND_SOC_DAIFMT_FORMAT_MASK);
  842. return -EINVAL;
  843. }
  844. ac108_multi_chips_update_bits(ac108, I2S_FMT_CTRL1,
  845. 0x3 << MODE_SEL | 0x1 << TX2_OFFSET | 0x1 << TX1_OFFSET,
  846. i2s_mode<<MODE_SEL | tx_offset<<TX2_OFFSET | tx_offset << TX1_OFFSET);
  847. //AC108 config BCLK&LRCK polarity
  848. switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
  849. case SND_SOC_DAIFMT_NB_NF:
  850. snd_print("AC108 config: BCLK_normal,LRCK_normal.\n");
  851. brck_polarity = BCLK_NORMAL_DRIVE_N_SAMPLE_P;
  852. lrck_polarity = LRCK_LEFT_LOW_RIGHT_HIGH;
  853. break;
  854. case SND_SOC_DAIFMT_NB_IF:
  855. snd_print("AC108 config: BCLK_normal,LRCK_invert.\n");
  856. brck_polarity = BCLK_NORMAL_DRIVE_N_SAMPLE_P;
  857. lrck_polarity = LRCK_LEFT_HIGH_RIGHT_LOW;
  858. break;
  859. case SND_SOC_DAIFMT_IB_NF:
  860. snd_print("AC108 config: BCLK_invert,LRCK_normal.\n");
  861. brck_polarity = BCLK_INVERT_DRIVE_P_SAMPLE_N;
  862. lrck_polarity = LRCK_LEFT_LOW_RIGHT_HIGH;
  863. break;
  864. case SND_SOC_DAIFMT_IB_IF:
  865. snd_print("AC108 config: BCLK_invert,LRCK_invert.\n");
  866. brck_polarity = BCLK_INVERT_DRIVE_P_SAMPLE_N;
  867. lrck_polarity = LRCK_LEFT_HIGH_RIGHT_LOW;
  868. break;
  869. default:
  870. snd_err("AC108 config BCLK/LRCLK polarity error:%u\n",
  871. (fmt & SND_SOC_DAIFMT_INV_MASK) >> 8);
  872. return -EINVAL;
  873. }
  874. ac108_multi_chips_update_bits(ac108, I2S_BCLK_CTRL, 0x1<<BCLK_POLARITY,
  875. brck_polarity << BCLK_POLARITY);
  876. ac108_multi_chips_update_bits(ac108, I2S_LRCK_CTRL1, 0x1<<LRCK_POLARITY,
  877. lrck_polarity << LRCK_POLARITY);
  878. return 0;
  879. }
  880. static void ac108_codec_set_pga_gain(struct twi_device *twi_dev, struct ac108_param *param)
  881. {
  882. unsigned int i;
  883. snd_print("\n");
  884. if (twi_dev->ref_chan.ref_channel != 0x0) {
  885. snd_info("ref_cfg.ref_channel:0x%x, set ref_pga_gain:%d\n",
  886. twi_dev->ref_chan.ref_channel, twi_dev->ref_chan.ref_pga);
  887. /* set the gain for referenced channels, always used for aec */
  888. for (i = 0; i < 4; i++) {
  889. if ((twi_dev->ref_chan.ref_channel >> i) & 0x1) {
  890. ac108_update_bits(twi_dev, ANA_PGA1_CTRL + i,
  891. 0x1F << ADC1_ANALOG_PGA,
  892. twi_dev->ref_chan.ref_pga << ADC1_ANALOG_PGA);
  893. } else
  894. ac108_update_bits(twi_dev, ANA_PGA1_CTRL + i,
  895. 0x1F << ADC1_ANALOG_PGA,
  896. param->pga_gain << ADC1_ANALOG_PGA);
  897. }
  898. } else {
  899. for (i = 0; i < 4; i++)
  900. ac108_update_bits(twi_dev, ANA_PGA1_CTRL + i,
  901. 0x1F << ADC1_ANALOG_PGA,
  902. param->pga_gain << ADC1_ANALOG_PGA);
  903. }
  904. }
  905. static void ac108_codec_hw_init(struct twi_device *twi_dev, struct ac108_param *param)
  906. {
  907. /*** Chip reset ***/
  908. /*0x00=0x12: reset all registers to their default state*/
  909. //ac108_write(twi_dev, CHIP_AUDIO_RST, 0x12);
  910. #if !AC108_DMIC_EN
  911. /*** Analog voltage enable ***/
  912. /*0x06=0x01: Enable Analog LDO*/
  913. ac108_write(twi_dev, PWR_CTRL6, 0x01);
  914. /*
  915. * 0x07=0x9b: VREF faststart Enable,
  916. * Enable VREF @ 3.4V (5V) or 3.1V (3.3V)
  917. * (needed for Analog LDO and MICBIAS)
  918. */
  919. ac108_write(twi_dev, PWR_CTRL7, 0x9b);
  920. /*
  921. * 0x09=0x81: VREFP faststart Enable, Enable VREFP_FASTSTART_ENABLE
  922. * (needed by all audio input channels)
  923. */
  924. ac108_write(twi_dev, PWR_CTRL9, 0x81);
  925. /*
  926. * DSM low power mode enable, Control bias current for
  927. * DSM integrator opamps
  928. */
  929. ac108_write(twi_dev, ANA_ADC3_CTRL7, 0x0b);
  930. #endif
  931. /*** SYSCLK Config ***/
  932. /*SYSCLK Enable*/
  933. ac108_update_bits(twi_dev, SYSCLK_CTRL, 0x1 << SYSCLK_EN, 0x1 << SYSCLK_EN);
  934. /*
  935. * 0x21=0x93: Module clock enable<I2S, ADC digital,
  936. * MIC offset Calibration, ADC analog>
  937. */
  938. ac108_write(twi_dev, MOD_CLK_EN, 0x93);
  939. /*
  940. * 0x22=0x93: Module reset de-asserted
  941. * <I2S, ADC digital, MIC offset Calibration, ADC analog>
  942. */
  943. ac108_write(twi_dev, MOD_RST_CTRL, 0x93);
  944. /*** I2S Common Config ***/
  945. /*SDO1 enable, SDO2 Enable*/
  946. ac108_update_bits(twi_dev, I2S_CTRL, ((0x1 << SDO1_EN) | (0x1 << SDO2_EN)),
  947. ((0x1 << SDO1_EN) | (!!AC108_SDO2_EN << SDO2_EN)));
  948. /*SDO drive data and SDI sample data at the different BCLK edge*/
  949. ac108_update_bits(twi_dev, I2S_BCLK_CTRL, (0x1 << EDGE_TRANSFER),
  950. (0x0 << EDGE_TRANSFER));
  951. ac108_update_bits(twi_dev, I2S_LRCK_CTRL1, 0x3 << LRCK_PERIODH,
  952. (((param->lrck_period - 1) >> 8) << LRCK_PERIODH));
  953. /*
  954. * config LRCK period:
  955. * 16bit * 8ch = 128,
  956. * 32bit * 8ch = 256,
  957. * 32bit *16ch = 512
  958. */
  959. ac108_write(twi_dev, I2S_LRCK_CTRL2, (param->lrck_period - 1) & 0xFF);
  960. /*
  961. * Encoding mode enable, Turn to hi-z state (TDM)
  962. * when not transferring slot
  963. */
  964. ac108_update_bits(twi_dev, I2S_FMT_CTRL1,
  965. 0x1 << ENCD_SEL | 0x1 << TX_SLOT_HIZ | 0x1 << TX_STATE,
  966. !!AC108_ENCODING_EN << ENCD_SEL | 0x0 << TX_SLOT_HIZ | 0x1 << TX_STATE);
  967. /* 8/12/16/20/24/28/32bit Slot Width */
  968. ac108_update_bits(twi_dev, I2S_FMT_CTRL2, 0x7 << SLOT_WIDTH_SEL,
  969. (param->slot_width / 4 - 1) << SLOT_WIDTH_SEL);
  970. /*
  971. * 0x36=0x70: TX MSB first, TX2 Mute, Transfer 0 after
  972. * each sample in each slot(sample resolution < slot width),
  973. * LRCK = 1 BCLK width (short frame), Linear PCM Data Mode
  974. */
  975. ac108_write(twi_dev, I2S_FMT_CTRL3, AC108_SDO2_EN ? 0x60 : 0x70);
  976. /*0x3C=0xe4: TX1 CHn Map to CHn adc sample, n=[1,4]*/
  977. ac108_write(twi_dev, I2S_TX1_CHMP_CTRL1, 0xe4);
  978. /*0x3D=0xe4: TX1 CHn Map to CH(n-4) adc sample, n=[5,8]*/
  979. ac108_write(twi_dev, I2S_TX1_CHMP_CTRL2, 0xe4);
  980. /*0x3E=0xe4: TX1 CHn Map to CH(n-8) adc sample, n=[9,12]*/
  981. ac108_write(twi_dev, I2S_TX1_CHMP_CTRL3, 0xe4);
  982. /*0x3F=0xe4: TX1 CHn Map to CH(n-12) adc sample, n=[13,16]*/
  983. ac108_write(twi_dev, I2S_TX1_CHMP_CTRL4, 0xe4);
  984. #if AC108_SDO2_EN
  985. /*
  986. * 0x44=0x4e: TX2 CH1/2 Map to CH3/4 adc sample,
  987. * TX2 CH3/4 Map to CH1/2 adc sample
  988. */
  989. ac108_write(twi_dev, I2S_TX2_CHMP_CTRL1, 0x4e);
  990. /*0x45=0xe4: TX2 CHn Map to CH(n-4) adc sample, n=[5,8]*/
  991. ac108_write(twi_dev, I2S_TX2_CHMP_CTRL2, 0xe4);
  992. /*0x46=0xe4: TX2 CHn Map to CH(n-8) adc sample, n=[9,12]*/
  993. ac108_write(twi_dev, I2S_TX2_CHMP_CTRL3, 0xe4);
  994. /*0x47=0xe4: TX2 CHn Map to CH(n-12) adc sample, n=[13,16]*/
  995. ac108_write(twi_dev, I2S_TX2_CHMP_CTRL4, 0xe4);
  996. #endif
  997. /*** ADC DIG part Config***/
  998. /*0x60=0x03: ADC Sample Rate 16KHz*/
  999. //ac108_write(ADC_SPRC, 0x03);
  1000. /*0x61=0x1f: Digital part globe enable, ADCs digital part enable*/
  1001. ac108_write(twi_dev, ADC_DIG_EN, 0x1f);
  1002. /*0xBB=0x0f: Gating ADCs CLK de-asserted (ADCs CLK Enable)*/
  1003. ac108_write(twi_dev, ANA_ADC4_CTRL7, 0x0f);
  1004. if (twi_dev->debug_mode) {
  1005. /*0x66=0x00: Digital ADCs channel HPF disable*/
  1006. ac108_write(twi_dev, HPF_EN, 0x00);
  1007. /*
  1008. * 0X7F=0x00: ADC pattern select: 0:ADC normal, 1:0x5A5A5A,
  1009. * 2:0x123456, 3:0x00, 4~7:I2S RX data
  1010. */
  1011. ac108_write(twi_dev, ADC_DIG_DEBUG, twi_dev->debug_mode & 0x7);
  1012. }
  1013. #if !AC108_DMIC_EN
  1014. /*** ADCs analog PGA gain Config***/
  1015. ac108_codec_set_pga_gain(twi_dev, param);
  1016. /*** enable AAF/ADC/PGA and UnMute Config ***/
  1017. /*
  1018. * 0xA0=0x07: ADC1 AAF & ADC enable, ADC1 PGA enable,
  1019. * ADC1 MICBIAS enable and UnMute
  1020. */
  1021. ac108_write(twi_dev, ANA_ADC1_CTRL1, 0x07);
  1022. /*
  1023. * 0xA7=0x07: ADC2 AAF & ADC enable, ADC2 PGA enable,
  1024. * ADC2 MICBIAS enable and UnMute
  1025. */
  1026. ac108_write(twi_dev, ANA_ADC2_CTRL1, 0x07);
  1027. /*
  1028. * 0xAE=0x07: ADC3 AAF & ADC enable, ADC3 PGA enable,
  1029. * ADC3 MICBIAS enable and UnMute
  1030. */
  1031. ac108_write(twi_dev, ANA_ADC3_CTRL1, 0x07);
  1032. /*
  1033. * 0xB5=0x07: ADC4 AAF & ADC enable, ADC4 PGA enable,
  1034. * ADC4 MICBIAS enable and UnMute
  1035. */
  1036. ac108_write(twi_dev, ANA_ADC4_CTRL1, 0x07);
  1037. /*
  1038. * delay 50ms to let VREF/VRP faststart powerup stable,
  1039. * then disable faststart
  1040. */
  1041. usleep(50 * 1000);
  1042. /* VREF faststart disable */
  1043. ac108_update_bits(twi_dev, PWR_CTRL7, 0x1 << VREF_FASTSTART_ENABLE,
  1044. 0x0 << VREF_FASTSTART_ENABLE);
  1045. /*VREFP faststart disable*/
  1046. ac108_update_bits(twi_dev, PWR_CTRL9, 0x1 << VREFP_FASTSTART_ENABLE,
  1047. 0x0 << VREFP_FASTSTART_ENABLE);
  1048. #else
  1049. /*** DMIC module Enable ***/
  1050. /*DMIC1/2 Enable, while ADC DIG source select DMIC1/2*/
  1051. ac108_write(twi_dev, DMIC_EN, 0x03);
  1052. /*GPIO1 as DMIC1_DAT, GPIO2 as DMIC_CLK*/
  1053. ac108_write(twi_dev, GPIO_CFG1, 0xee);
  1054. /*GPIO3 as DMIC2_DAT*/
  1055. ac108_write(twi_dev, GPIO_CFG2, 0x7e);
  1056. #endif
  1057. }
  1058. static int ac108_codec_hw_params(struct snd_pcm_substream *substream,
  1059. struct snd_pcm_hw_params *params, struct snd_dai *dai)
  1060. {
  1061. struct snd_codec *codec = dai->component;
  1062. struct ac108_priv *ac108 = codec->private_data;
  1063. struct ac108_param *param = &ac108->param;
  1064. int i = 0;
  1065. int ret = 0;
  1066. unsigned char reg_val = 0;
  1067. unsigned short channels = 0;
  1068. unsigned short channels_en = 0;
  1069. unsigned short sample_resolution = 0;
  1070. snd_print("\n");
  1071. /* set codec dai fmt */
  1072. ret = snd_soc_dai_set_fmt(dai, param->daudio_format
  1073. | (param->signal_inversion << SND_SOC_DAIFMT_SIG_SHIFT)
  1074. | (param->daudio_master << SND_SOC_DAIFMT_MASTER_SHIFT));
  1075. if (ret < 0) {
  1076. snd_err("codec_dai set pll failed\n");
  1077. return -EINVAL;
  1078. }
  1079. if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
  1080. snd_print("AC108 not need playback.\n");
  1081. return 0;
  1082. }
  1083. //AC108 hw init
  1084. for (i = 0; i < param->chip_num; i++)
  1085. ac108_codec_hw_init(&param->twi_dev[i], param);
  1086. //AC108 set sample rate
  1087. for (i = 0; i < ARRAY_SIZE(ac108_sample_rate); i++) {
  1088. if (ac108_sample_rate[i].real_val ==
  1089. params_rate(params) / (AC108_ENCODING_EN ? AC108_ENCODING_CH_NUMS / 2 : 1)) {
  1090. ac108_multi_chips_update_bits(ac108, ADC_SPRC,
  1091. 0xf << ADC_FS_I2S1,
  1092. ac108_sample_rate[i].reg_val << ADC_FS_I2S1);
  1093. break;
  1094. }
  1095. }
  1096. //AC108 set channels
  1097. #if !AC108_SDO2_EN
  1098. channels = params_channels(params) *
  1099. (AC108_ENCODING_EN ? AC108_ENCODING_CH_NUMS/2 : 1);
  1100. for (i = 0; i < (channels + 3) / 4; i++) {
  1101. channels_en = (channels >= 4 * (i + 1)) ? 0x000f << (4 * i) :
  1102. ((1 << (channels % 4)) - 1) << (4 * i);
  1103. ac108_write(&param->twi_dev[i], I2S_TX1_CTRL1, channels - 1);
  1104. ac108_write(&param->twi_dev[i], I2S_TX1_CTRL2, (unsigned char )channels_en);
  1105. ac108_write(&param->twi_dev[i], I2S_TX1_CTRL3, channels_en >> 8);
  1106. }
  1107. for (; i < param->chip_num; i++) {
  1108. ac108_write(&param->twi_dev[i], I2S_TX1_CTRL1, 0);
  1109. ac108_write(&param->twi_dev[i], I2S_TX1_CTRL2, 0);
  1110. ac108_write(&param->twi_dev[i], I2S_TX1_CTRL3, 0);
  1111. }
  1112. #else
  1113. channels = params_channels(params);
  1114. for (i = 0; i < (channels + 3) / 4; i++) {
  1115. //(2 >= 4*(i+1)) ? 0x000f<<(4*i) : ((1<<(2%4))-1)<<(4*i);
  1116. channels_en = 0x03;
  1117. ac108_write(&param->twi_dev[i], I2S_TX1_CTRL1, 2 - 1);
  1118. ac108_write(&param->twi_dev[i], I2S_TX1_CTRL2, (u8)channels_en);
  1119. ac108_write(&param->twi_dev[i], I2S_TX1_CTRL3, channels_en >> 8);
  1120. }
  1121. for (; i < param->chip_num; i++) {
  1122. ac108_write(&param->twi_dev[i], I2S_TX1_CTRL1, 0);
  1123. ac108_write(&param->twi_dev[i], I2S_TX1_CTRL2, 0);
  1124. ac108_write(&param->twi_dev[i], I2S_TX1_CTRL3, 0);
  1125. }
  1126. for (i = 0; i < (channels + 3) / 4; i++) {
  1127. //(2 >= 4*(i+1)) ? 0x000f<<(4*i) : ((1<<(2%4))-1)<<(4*i);
  1128. channels_en = 0x03;
  1129. ac108_write(&param->twi_dev[i], I2S_TX2_CTRL1, 2 - 1);
  1130. ac108_write(&param->twi_dev[i], I2S_TX2_CTRL2, (u8)channels_en);
  1131. ac108_write(&param->twi_dev[i], I2S_TX2_CTRL3, channels_en >> 8);
  1132. }
  1133. for (; i < param->chip_num; i++) {
  1134. ac108_write(&param->twi_dev[i], I2S_TX2_CTRL1, 0);
  1135. ac108_write(&param->twi_dev[i], I2S_TX2_CTRL2, 0);
  1136. ac108_write(&param->twi_dev[i], I2S_TX2_CTRL3, 0);
  1137. }
  1138. #endif
  1139. //AC108 set sample resorution
  1140. switch (params_format(params)) {
  1141. case SND_PCM_FORMAT_S16_LE:
  1142. sample_resolution = 16;
  1143. break;
  1144. case SND_PCM_FORMAT_S24_LE:
  1145. sample_resolution = 24;
  1146. break;
  1147. case SND_PCM_FORMAT_S32_LE:
  1148. sample_resolution = 32;
  1149. break;
  1150. default:
  1151. snd_err("AC108 don't supported the sample resolution: %u\n",
  1152. params_format(params));
  1153. return -EINVAL;
  1154. }
  1155. #if 0
  1156. //AC108_ENCODING_EN
  1157. //TX Encoding mode, SR add 4bits to mark channel number
  1158. if ((sample_resolution <= 24) && (sample_resolution != 16))
  1159. sample_resolution += 4;
  1160. #endif
  1161. for (i = 0; i < ARRAY_SIZE(ac108_sample_resolution); i++) {
  1162. if (ac108_sample_resolution[i].real_val == sample_resolution) {
  1163. ac108_multi_chips_update_bits(ac108, I2S_FMT_CTRL2,
  1164. 0x7 << SAMPLE_RESOLUTION,
  1165. ac108_sample_resolution[i].reg_val << SAMPLE_RESOLUTION);
  1166. break;
  1167. }
  1168. }
  1169. ac108_read(&param->twi_dev[0], SYSCLK_CTRL, &reg_val);
  1170. if (reg_val & 0x80) {
  1171. //PLLCLK Enable
  1172. //PLL Common voltage Enable, PLL Enable
  1173. ac108_multi_chips_update_bits(ac108, PLL_CTRL1,
  1174. 0x1 << PLL_EN | 0x1 << PLL_COM_EN,
  1175. 0x1 << PLL_EN | 0x1 << PLL_COM_EN);
  1176. if (!(reg_val & 0x08)) {
  1177. //SYSCLK select MCLK
  1178. //GPIO4 output Clock 24MHz from DPLL
  1179. ac108_multi_chips_update_bits(ac108, GPIO_CFG2,
  1180. 0xf << GPIO4_SELECT, 0x9 << GPIO4_SELECT);
  1181. }
  1182. }
  1183. return 0;
  1184. }
  1185. static int ac108_codec_set_sysclk(struct snd_dai *dai,
  1186. int clk_id, unsigned int freq, int dir)
  1187. {
  1188. struct snd_codec *codec = dai->component;
  1189. struct ac108_priv *ac108 = codec->private_data;
  1190. struct ac108_param *param = &ac108->param;
  1191. snd_print("\n");
  1192. //default: clk_id = 0;
  1193. switch (clk_id) {
  1194. case SYSCLK_SRC_MCLK:
  1195. snd_print("AC108 SYSCLK source select MCLK.\n");
  1196. //System Clock Source Select MCLK
  1197. ac108_multi_chips_update_bits(ac108,
  1198. SYSCLK_CTRL, 0x1 << SYSCLK_SRC,
  1199. 0x0 << SYSCLK_SRC);
  1200. break;
  1201. case SYSCLK_SRC_PLL:
  1202. snd_print("AC108 SYSCLK source select PLL.\n");
  1203. //System Clock Source Select PLL
  1204. ac108_multi_chips_update_bits(ac108,
  1205. SYSCLK_CTRL, 0x1 << SYSCLK_SRC,
  1206. 0x1 << SYSCLK_SRC);
  1207. break;
  1208. default:
  1209. snd_err("AC108 SYSCLK source config error:%d\n\n", clk_id);
  1210. return -EINVAL;
  1211. }
  1212. //SYSCLK Enable
  1213. ac108_multi_chips_update_bits(ac108,
  1214. SYSCLK_CTRL, 0x1 << SYSCLK_EN,
  1215. 0x1 << SYSCLK_EN);
  1216. //AC108 TX enable, Globle enable
  1217. ac108_multi_chips_update_bits(ac108, I2S_CTRL,
  1218. 0x1 << TXEN | 0x1 << GEN,
  1219. 0x1 << TXEN | 0x1 << GEN);
  1220. return 0;
  1221. }
  1222. static int ac108_codec_prepare(struct snd_pcm_substream *substream,
  1223. struct snd_dai *dai)
  1224. {
  1225. struct snd_codec *codec = dai->component;
  1226. struct ac108_priv *ac108 = codec->private_data;
  1227. struct ac108_param *param = &ac108->param;
  1228. snd_print("\n");
  1229. if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
  1230. snd_print("ac108 playback prepare.\n");
  1231. } else {
  1232. snd_print("ac108 capture prepare.\n");
  1233. }
  1234. return 0;
  1235. }
  1236. void ac108_reg_show(void);
  1237. static int ac108_codec_trigger(struct snd_pcm_substream *substream,
  1238. int cmd, struct snd_dai *dai)
  1239. {
  1240. struct snd_codec *codec = dai->component;
  1241. struct ac108_priv *ac108 = codec->private_data;
  1242. struct ac108_param *param = &ac108->param;
  1243. snd_print("\n");
  1244. switch (cmd) {
  1245. case SNDRV_PCM_TRIGGER_START:
  1246. case SNDRV_PCM_TRIGGER_RESUME:
  1247. case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
  1248. if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
  1249. snd_print("ac108 playback trigger start.\n");
  1250. } else {
  1251. snd_print("ac108 capture trigger start\n");
  1252. }
  1253. break;
  1254. case SNDRV_PCM_TRIGGER_STOP:
  1255. case SNDRV_PCM_TRIGGER_SUSPEND:
  1256. case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
  1257. if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
  1258. snd_print("ac108 playback trigger stop.\n");
  1259. } else {
  1260. snd_print("ac108 capture trigger stop\n");
  1261. }
  1262. break;
  1263. default:
  1264. return -EINVAL;
  1265. }
  1266. return 0;
  1267. }
  1268. static int ac108_codec_hw_free(struct snd_pcm_substream *substream,
  1269. struct snd_dai *dai)
  1270. {
  1271. struct snd_codec *codec = dai->component;
  1272. struct ac108_priv *ac108 = codec->private_data;
  1273. struct ac108_param *param = &ac108->param;
  1274. snd_print("\n");
  1275. if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
  1276. snd_print("AC108 playback hw_free.\n");
  1277. return 0;
  1278. }
  1279. //AC108 I2S Globle disable
  1280. ac108_multi_chips_update_bits(ac108, I2S_CTRL,
  1281. 0x1 << GEN, 0x0 << GEN);
  1282. #ifdef AC108_IDLE_RESET_EN
  1283. snd_print("AC108 reset all register to their default value\n");
  1284. ac108_multi_chips_write(ac108, CHIP_AUDIO_RST, 0x12);
  1285. #else
  1286. //repair PLL version no sync problem && Encoding no DAT
  1287. ac108_multi_chips_update_bits(ac108, PLL_CTRL1,
  1288. 0x1 << PLL_EN | 0x1 << PLL_COM_EN,
  1289. 0x0 << PLL_EN | 0x0 << PLL_COM_EN);
  1290. ac108_multi_chips_update_bits(ac108, MOD_CLK_EN,
  1291. 0x1 << I2S | 0x1 << ADC_DIGITAL,
  1292. 0x0<<I2S | 0x0<<ADC_DIGITAL);
  1293. ac108_multi_chips_update_bits(ac108, MOD_RST_CTRL,
  1294. 0x1 << I2S | 0x1 << ADC_DIGITAL,
  1295. 0x0 << I2S | 0x0 << ADC_DIGITAL);
  1296. #endif
  1297. return 0;
  1298. }
  1299. static void ac108_codec_shutdown(struct snd_pcm_substream *substream,
  1300. struct snd_dai *dai)
  1301. {
  1302. struct snd_codec *codec = dai->component;
  1303. struct ac108_priv *ac108 = codec->private_data;
  1304. struct ac108_param *param = &ac108->param;
  1305. int ret = 0;
  1306. unsigned int i = 0;
  1307. snd_print("\n");
  1308. if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
  1309. snd_print("AC108 playback shutdown.\n");
  1310. } else {
  1311. snd_print("AC108 capture shutdown.\n");
  1312. }
  1313. return;
  1314. }
  1315. static struct snd_dai_ops ac108_codec_dai_ops = {
  1316. .startup = ac108_codec_startup,
  1317. .set_sysclk = ac108_codec_set_sysclk,
  1318. .set_pll = ac108_codec_set_pll,
  1319. .set_clkdiv = ac108_codec_set_clkdiv,
  1320. .set_fmt = ac108_codec_set_fmt,
  1321. .hw_params = ac108_codec_hw_params,
  1322. .prepare = ac108_codec_prepare,
  1323. .trigger = ac108_codec_trigger,
  1324. .hw_free = ac108_codec_hw_free,
  1325. .shutdown = ac108_codec_shutdown,
  1326. };
  1327. static struct snd_dai ac108_codec_dai[] = {
  1328. {
  1329. .name = "ac108-codecdai",
  1330. .playback = {
  1331. .stream_name = "Playback",
  1332. .channels_min = 1,
  1333. .channels_max = 8,
  1334. .rates = SNDRV_PCM_RATE_8000_192000
  1335. | SNDRV_PCM_RATE_KNOT,
  1336. .formats = SNDRV_PCM_FMTBIT_S16_LE
  1337. | SNDRV_PCM_FMTBIT_S24_LE
  1338. | SNDRV_PCM_FMTBIT_S32_LE,
  1339. .rate_min = 8000,
  1340. .rate_max = 48000,
  1341. },
  1342. .capture = {
  1343. .stream_name = "Capture",
  1344. .channels_min = 1,
  1345. .channels_max = 8,
  1346. .rates = SNDRV_PCM_RATE_8000_48000
  1347. | SNDRV_PCM_RATE_KNOT,
  1348. .formats = SNDRV_PCM_FMTBIT_S16_LE
  1349. | SNDRV_PCM_FMTBIT_S24_LE,
  1350. .rate_min = 8000,
  1351. .rate_max = 48000,
  1352. },
  1353. .ops = &ac108_codec_dai_ops,
  1354. },
  1355. };
  1356. static int ac108_codec_probe(struct snd_codec *codec)
  1357. {
  1358. unsigned char read_data = 0x0;
  1359. struct ac108_priv *ac108 = NULL;
  1360. unsigned int i = 0;
  1361. twi_status_t ret = 0;
  1362. unsigned char reset_cmd[2] = {0x0, 0x12};
  1363. struct ac108_param default_param = {
  1364. .chip_num = AC108_CHIP_NUM,
  1365. .twi_dev = AC108_CHIP_CFG,
  1366. .pga_gain = AC108_PGA_GAIN,
  1367. .daudio_master = AC108_DAUDIO_MASTER,
  1368. .daudio_format = AC108_DAUDIO_FORMAT,
  1369. .signal_inversion = AC108_DAUDIO_SIG_INV,
  1370. .lrck_period = AC108_LRCK_PERIOD,
  1371. .slot_width = AC108_SLOT_WIDTH,
  1372. };
  1373. if (!codec->codec_dai) {
  1374. snd_err("codec->codec_dai is null.\n");
  1375. return -EFAULT;
  1376. }
  1377. ac108 = snd_malloc(sizeof(struct ac108_priv));
  1378. if (!ac108) {
  1379. snd_err("no memory\n");
  1380. return -ENOMEM;
  1381. }
  1382. snd_print("codec para init.\n");
  1383. codec->private_data = (void *)ac108;
  1384. ac108->param = default_param;
  1385. ac108->codec = codec;
  1386. codec->codec_dai->component = codec;
  1387. snd_print("init ac108 i2c port.\n");
  1388. ret = ac108_init_i2c_device(ac108->param.twi_dev[i].bus);
  1389. if (ret != TWI_STATUS_OK) {
  1390. snd_err("init i2c err\n");
  1391. ret = -EFAULT;
  1392. goto err_twi_init;
  1393. }
  1394. for (i = 0; i < ac108->param.chip_num; i++) {
  1395. hal_twi_control(ac108->param.twi_dev[i].bus, I2C_SLAVE, &default_param.twi_dev[i].addr);
  1396. }
  1397. snd_print("ac108 codec register finished.\n");
  1398. return 0;
  1399. err_twi_init:
  1400. snd_free(ac108);
  1401. return ret;
  1402. }
  1403. static int ac108_codec_remove(struct snd_codec *codec)
  1404. {
  1405. struct ac108_priv *ac108 = codec->private_data;
  1406. struct ac108_param *param = &ac108->param;
  1407. unsigned int i = 0;
  1408. int ret = 0;
  1409. snd_print("deinit ac108 i2c port.\n");
  1410. ret = ac108_deinit_i2c_device(param->twi_dev[i].bus);
  1411. if (ret != TWI_STATUS_OK) {
  1412. snd_err("i2c deinit port %d failed.\n",
  1413. param->twi_dev[i].bus);
  1414. }
  1415. snd_free(ac108);
  1416. codec->private_data = NULL;
  1417. return 0;
  1418. }
  1419. struct snd_codec ac108_codec = {
  1420. .name = "ac108-codec",
  1421. .codec_dai = ac108_codec_dai,
  1422. .codec_dai_num = ARRAY_SIZE(ac108_codec_dai),
  1423. .private_data = NULL,
  1424. .probe = ac108_codec_probe,
  1425. .remove = ac108_codec_remove,
  1426. #ifdef AC108_KCONTROL_TEST_EN
  1427. .controls = ac108_codec_controls,
  1428. .num_controls = ARRAY_SIZE(ac108_codec_controls),
  1429. #endif
  1430. };
  1431. /* for ac108 debug */
  1432. void ac108_reg_dump_usage(void)
  1433. {
  1434. printf("\n\n=========ac108 debug===========\n");
  1435. printf("Usage: ac108_reg [option]\n");
  1436. printf("\t-l, ac108 dev list\n");
  1437. printf("\t-h, tools help\n");
  1438. printf("\t-d, ac108 dev addr(hex)\n");
  1439. printf("\t-r, ac108 reg addr(hex)\n");
  1440. printf("\t-n, ac108 reg read num(hex)\n");
  1441. printf("\t-s, ac108 show all regs\n");
  1442. printf("\t-w, ac108 write reg val(hex)\n");
  1443. printf("\n");
  1444. }
  1445. void ac108_chip_list(void)
  1446. {
  1447. unsigned int chip_num = AC108_CHIP_NUM;
  1448. struct twi_device twi_dev[] = AC108_CHIP_CFG;
  1449. int i = 0;
  1450. printf("\n\n=========ac108 show ===========\n");
  1451. printf("\tac108 dev num:\t%d\n", chip_num);
  1452. for (i = 0; i < chip_num; i++)
  1453. printf("\t%d i2c%d-0x%02x\n", i, twi_dev[i].bus, twi_dev[i].addr);
  1454. printf("===============================\n");
  1455. }
  1456. void ac108_reg_show(void)
  1457. {
  1458. unsigned int chip_num = AC108_CHIP_NUM;
  1459. struct twi_device twi_dev[] = AC108_CHIP_CFG;
  1460. unsigned char read_command;
  1461. unsigned char read_data[1] = {0x0};
  1462. twi_status_t ret = 0;
  1463. unsigned int i = 0;
  1464. unsigned int j = 0;
  1465. for (i = 0; i < chip_num; i++) {
  1466. printf("\n=========ac108 chip [i2c%d-0x%02x] ===========\n",
  1467. twi_dev[i].bus, twi_dev[i].addr);
  1468. for (j = 0; j <= AC108_REG_MAX; j++) {
  1469. if (j % 8 == 0)
  1470. printf("\n");
  1471. read_command = 0x0 + j;
  1472. ret = ac108_read(&twi_dev[i], read_command, read_data);
  1473. if (ret != TWI_STATUS_OK) {
  1474. snd_err("[i2c%d-0x%02x] read [REG-0x%02x,val-0x%02x] ret = %d.\n",
  1475. twi_dev[i].bus, twi_dev[i].addr,
  1476. read_command, read_data[0], ret);
  1477. }
  1478. printf("[0x%02x]: 0x%02x ", read_command, read_data[0]);
  1479. }
  1480. printf("\n=========================================\n");
  1481. }
  1482. }
  1483. int cmd_ac108_reg(int argc, char ** argv)
  1484. {
  1485. twi_status_t ret = -1;
  1486. unsigned int i;
  1487. const struct option long_option[] = {
  1488. {"help", 0, NULL, 'h'},
  1489. {"list", 0, NULL, 'l'},
  1490. {"addr", 1, NULL, 'd'},
  1491. {"reg", 1, NULL, 'r'},
  1492. {"num", 1, NULL, 'n'},
  1493. {"show", 0, NULL, 's'},
  1494. {"write", 1, NULL, 'w'},
  1495. {NULL, 0, NULL, 0},
  1496. };
  1497. unsigned int chip_num = AC108_CHIP_NUM;
  1498. struct twi_device twi_dev[] = AC108_CHIP_CFG;
  1499. unsigned char reset_cmd[2] = {0x0, 0x12};
  1500. unsigned char write_cmd[2] = {0x0, 0x0};
  1501. unsigned char read_cmd[1] = {0x0};
  1502. unsigned char read_data[1] = {0x0};
  1503. unsigned int num = 1;
  1504. unsigned int twi_addr = 0x3b;
  1505. bool wr_flag = 0;
  1506. while (1) {
  1507. int c;
  1508. if ((c = getopt_long(argc, argv, "hlsd:r:n:w:", long_option, NULL)) < 0)
  1509. break;
  1510. switch (c) {
  1511. case 'h':
  1512. ac108_reg_dump_usage();
  1513. goto ac108_reg_exit;
  1514. case 'l':
  1515. ac108_chip_list();
  1516. goto ac108_reg_exit;
  1517. case 's':
  1518. ac108_reg_show();
  1519. goto ac108_reg_exit;
  1520. case 'd':
  1521. if (isdigit(*optarg)) {
  1522. sscanf(optarg, "0x%x", &twi_addr);
  1523. //twi_addr = atoi(optarg);
  1524. printf("\ntwi_addr slave address is 0x%02x.\n", twi_addr);
  1525. } else
  1526. fprintf(stderr, "twi addr is not a digital value.\n");
  1527. break;
  1528. case 'r':
  1529. if (isdigit(*optarg)) {
  1530. sscanf(optarg, "0x%hhx", &read_cmd[0]);
  1531. //read_cmd[0] = atoi(optarg);
  1532. write_cmd[0] = read_cmd[0];
  1533. printf("\nreg is 0x%02x.\n", read_cmd[0]);
  1534. } else
  1535. fprintf(stderr, "reg is not a digital value.\n");
  1536. break;
  1537. case 'n':
  1538. if (isdigit(*optarg)) {
  1539. sscanf(optarg, "0x%x", &num);
  1540. //num = atoi(optarg);
  1541. printf("\nnum is %d.\n", num);
  1542. } else
  1543. fprintf(stderr, "num is not a digital value.\n");
  1544. break;
  1545. case 'w':
  1546. if (isdigit(*optarg)) {
  1547. wr_flag = 1;
  1548. sscanf(optarg, "0x%hhx", &write_cmd[1]);
  1549. //write_cmd[1] = atoi(optarg);
  1550. printf("\nwrite val is 0x%02x.\n", write_cmd[1]);
  1551. } else
  1552. fprintf(stderr, "write val is not a digital value.\n");
  1553. break;
  1554. default:
  1555. fprintf(stderr, "Invalid switch or option needs an argument.\n");
  1556. break;
  1557. }
  1558. }
  1559. //checkout i2c port and addr.
  1560. for (i = 0; i < chip_num; i++) {
  1561. if (twi_addr == twi_dev[i].addr)
  1562. break;
  1563. }
  1564. if (i >= chip_num) {
  1565. fprintf(stderr, "the addr is error.\n");
  1566. goto ac108_reg_exit;
  1567. }
  1568. if ((read_cmd[0] > AC108_REG_MAX) ||
  1569. (write_cmd[0] > AC108_REG_MAX)) {
  1570. fprintf(stderr, "the reg is over 0x%02x error.\n", AC108_REG_MAX);
  1571. goto ac108_reg_exit;
  1572. }
  1573. if (wr_flag) {
  1574. ret = ac108_write(&twi_dev[i], write_cmd[0], write_cmd[1]);
  1575. if (ret != TWI_STATUS_OK) {
  1576. snd_err("write error [REG-0x%02x,val-0x%02x] ret = %d.\n",
  1577. write_cmd[0], write_cmd[1], ret);
  1578. }
  1579. ret = ac108_read(&twi_dev[i], read_cmd[0], read_data);
  1580. if (ret != TWI_STATUS_OK) {
  1581. snd_err("write error [I2C%d-0x%0x] REG=0x%02x, val=0x%02x] ret = %d.\n",
  1582. twi_dev[i].bus, twi_dev[i].addr, read_cmd[0], read_data[0], ret);
  1583. goto ac108_reg_exit;
  1584. }
  1585. if (read_data[0] == write_cmd[1]) {
  1586. printf("write success, [I2C%d-0x%0x] REG=0x%02x, val=0x%02x] ret = %d.\n",
  1587. twi_dev[i].bus, twi_dev[i].addr, read_cmd[0], read_data[0], ret);
  1588. } else {
  1589. printf("write val:0x%02x failed, [I2C%d-0x%0x] REG=0x%02x, val=0x%02x] ret = %d.\n",
  1590. write_cmd[1], twi_dev[i].bus, twi_dev[i].addr, read_cmd[0], read_data[0], ret);
  1591. }
  1592. } else {
  1593. for (i = 0; i < num; i++) {
  1594. ret = ac108_read(&twi_dev[i], read_cmd[0], read_data);
  1595. if (ret != TWI_STATUS_OK) {
  1596. snd_err("read error [I2C%d-0x%0x] REG=0x%02x, val=0x%02x] ret = %d.\n",
  1597. twi_dev[i].bus, twi_dev[i].addr, read_cmd[0], read_data[0], ret);
  1598. goto ac108_reg_exit;
  1599. } else {
  1600. printf("read success. [I2C%d-0x%0x] REG=0x%02x, val=0x%02x].\n",
  1601. twi_dev[i].bus, twi_dev[i].addr, read_cmd[0], read_data[0]);
  1602. }
  1603. }
  1604. }
  1605. ac108_reg_exit:
  1606. return 0;
  1607. }
  1608. FINSH_FUNCTION_EXPORT_CMD(cmd_ac108_reg, ac108_reg, ac108 regs dump);