rt711-sdca.c 44 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. //
  3. // rt711-sdca.c -- rt711 SDCA ALSA SoC audio driver
  4. //
  5. // Copyright(c) 2021 Realtek Semiconductor Corp.
  6. //
  7. //
  8. #include <linux/module.h>
  9. #include <linux/moduleparam.h>
  10. #include <linux/kernel.h>
  11. #include <linux/init.h>
  12. #include <linux/delay.h>
  13. #include <linux/pm_runtime.h>
  14. #include <linux/soundwire/sdw_registers.h>
  15. #include <linux/slab.h>
  16. #include <linux/bitops.h>
  17. #include <sound/core.h>
  18. #include <sound/pcm.h>
  19. #include <sound/pcm_params.h>
  20. #include <sound/soc-dapm.h>
  21. #include <sound/initval.h>
  22. #include <sound/tlv.h>
  23. #include <sound/jack.h>
  24. #include "rt711-sdca.h"
  25. static int rt711_sdca_index_write(struct rt711_sdca_priv *rt711,
  26. unsigned int nid, unsigned int reg, unsigned int value)
  27. {
  28. int ret;
  29. struct regmap *regmap = rt711->mbq_regmap;
  30. unsigned int addr = (nid << 20) | reg;
  31. ret = regmap_write(regmap, addr, value);
  32. if (ret < 0)
  33. dev_err(&rt711->slave->dev,
  34. "Failed to set private value: %06x <= %04x ret=%d\n",
  35. addr, value, ret);
  36. return ret;
  37. }
  38. static int rt711_sdca_index_read(struct rt711_sdca_priv *rt711,
  39. unsigned int nid, unsigned int reg, unsigned int *value)
  40. {
  41. int ret;
  42. struct regmap *regmap = rt711->mbq_regmap;
  43. unsigned int addr = (nid << 20) | reg;
  44. ret = regmap_read(regmap, addr, value);
  45. if (ret < 0)
  46. dev_err(&rt711->slave->dev,
  47. "Failed to get private value: %06x => %04x ret=%d\n",
  48. addr, *value, ret);
  49. return ret;
  50. }
  51. static int rt711_sdca_index_update_bits(struct rt711_sdca_priv *rt711,
  52. unsigned int nid, unsigned int reg, unsigned int mask, unsigned int val)
  53. {
  54. unsigned int tmp;
  55. int ret;
  56. ret = rt711_sdca_index_read(rt711, nid, reg, &tmp);
  57. if (ret < 0)
  58. return ret;
  59. set_mask_bits(&tmp, mask, val);
  60. return rt711_sdca_index_write(rt711, nid, reg, tmp);
  61. }
  62. static void rt711_sdca_reset(struct rt711_sdca_priv *rt711)
  63. {
  64. rt711_sdca_index_update_bits(rt711, RT711_VENDOR_REG,
  65. RT711_PARA_VERB_CTL, RT711_HIDDEN_REG_SW_RESET,
  66. RT711_HIDDEN_REG_SW_RESET);
  67. rt711_sdca_index_update_bits(rt711, RT711_VENDOR_HDA_CTL,
  68. RT711_HDA_LEGACY_RESET_CTL, 0x1, 0x1);
  69. }
  70. static int rt711_sdca_calibration(struct rt711_sdca_priv *rt711)
  71. {
  72. unsigned int val, loop_rc = 0, loop_dc = 0;
  73. struct device *dev;
  74. struct regmap *regmap = rt711->regmap;
  75. int chk_cnt = 100;
  76. int ret = 0;
  77. mutex_lock(&rt711->calibrate_mutex);
  78. dev = regmap_get_device(regmap);
  79. regmap_read(rt711->regmap, RT711_RC_CAL_STATUS, &val);
  80. /* RC calibration */
  81. if (!(val & 0x40))
  82. rt711_sdca_index_update_bits(rt711, RT711_VENDOR_ANALOG_CTL,
  83. RT711_MISC_POWER_CTL0, 0x0010, 0x0010);
  84. for (loop_rc = 0; loop_rc < chk_cnt && !(val & 0x40); loop_rc++) {
  85. usleep_range(10000, 11000);
  86. ret = regmap_read(rt711->regmap, RT711_RC_CAL_STATUS, &val);
  87. if (ret < 0)
  88. goto _cali_fail_;
  89. }
  90. if (loop_rc == chk_cnt)
  91. dev_err(dev, "%s, RC calibration time-out!\n", __func__);
  92. /* HP calibration by manual mode setting */
  93. rt711_sdca_index_update_bits(rt711, RT711_VENDOR_REG,
  94. RT711_FSM_CTL, 0x2000, 0x2000);
  95. /* Calibration manual mode */
  96. rt711_sdca_index_update_bits(rt711, RT711_VENDOR_REG,
  97. RT711_FSM_CTL, 0xf, RT711_CALI_CTL);
  98. /* reset HP calibration */
  99. rt711_sdca_index_update_bits(rt711, RT711_VENDOR_CALI,
  100. RT711_DAC_DC_CALI_CTL1, RT711_DAC_DC_FORCE_CALI_RST, 0x00);
  101. rt711_sdca_index_update_bits(rt711, RT711_VENDOR_CALI,
  102. RT711_DAC_DC_CALI_CTL1, RT711_DAC_DC_FORCE_CALI_RST,
  103. RT711_DAC_DC_FORCE_CALI_RST);
  104. /* cal_clk_en_reg */
  105. if (rt711->hw_ver == RT711_VER_VD0)
  106. rt711_sdca_index_update_bits(rt711, RT711_VENDOR_CALI,
  107. RT711_DAC_DC_CALI_CTL1, RT711_DAC_DC_CALI_CLK_EN,
  108. RT711_DAC_DC_CALI_CLK_EN);
  109. /* trigger */
  110. rt711_sdca_index_update_bits(rt711, RT711_VENDOR_CALI,
  111. RT711_DAC_DC_CALI_CTL1, RT711_DAC_DC_CALI_TRIGGER,
  112. RT711_DAC_DC_CALI_TRIGGER);
  113. /* wait for calibration process */
  114. rt711_sdca_index_read(rt711, RT711_VENDOR_CALI,
  115. RT711_DAC_DC_CALI_CTL1, &val);
  116. for (loop_dc = 0; loop_dc < chk_cnt &&
  117. (val & RT711_DAC_DC_CALI_TRIGGER); loop_dc++) {
  118. usleep_range(10000, 11000);
  119. ret = rt711_sdca_index_read(rt711, RT711_VENDOR_CALI,
  120. RT711_DAC_DC_CALI_CTL1, &val);
  121. if (ret < 0)
  122. goto _cali_fail_;
  123. }
  124. if (loop_dc == chk_cnt)
  125. dev_err(dev, "%s, calibration time-out!\n", __func__);
  126. if (loop_dc == chk_cnt || loop_rc == chk_cnt)
  127. ret = -ETIMEDOUT;
  128. _cali_fail_:
  129. /* enable impedance sense */
  130. rt711_sdca_index_update_bits(rt711, RT711_VENDOR_REG,
  131. RT711_FSM_CTL, RT711_FSM_IMP_EN, RT711_FSM_IMP_EN);
  132. /* release HP-JD and trigger FSM */
  133. rt711_sdca_index_write(rt711, RT711_VENDOR_REG,
  134. RT711_DIGITAL_MISC_CTRL4, 0x201b);
  135. mutex_unlock(&rt711->calibrate_mutex);
  136. dev_dbg(dev, "%s calibration complete, ret=%d\n", __func__, ret);
  137. return ret;
  138. }
  139. static unsigned int rt711_sdca_button_detect(struct rt711_sdca_priv *rt711)
  140. {
  141. unsigned int btn_type = 0, offset, idx, val, owner;
  142. int ret;
  143. unsigned char buf[3];
  144. /* get current UMP message owner */
  145. ret = regmap_read(rt711->regmap,
  146. SDW_SDCA_CTL(FUNC_NUM_HID, RT711_SDCA_ENT_HID01, RT711_SDCA_CTL_HIDTX_CURRENT_OWNER, 0),
  147. &owner);
  148. if (ret < 0)
  149. return 0;
  150. /* if owner is device then there is no button event from device */
  151. if (owner == 1)
  152. return 0;
  153. /* read UMP message offset */
  154. ret = regmap_read(rt711->regmap,
  155. SDW_SDCA_CTL(FUNC_NUM_HID, RT711_SDCA_ENT_HID01, RT711_SDCA_CTL_HIDTX_MESSAGE_OFFSET, 0),
  156. &offset);
  157. if (ret < 0)
  158. goto _end_btn_det_;
  159. for (idx = 0; idx < sizeof(buf); idx++) {
  160. ret = regmap_read(rt711->regmap,
  161. RT711_BUF_ADDR_HID1 + offset + idx, &val);
  162. if (ret < 0)
  163. goto _end_btn_det_;
  164. buf[idx] = val & 0xff;
  165. }
  166. if (buf[0] == 0x11) {
  167. switch (buf[1] & 0xf0) {
  168. case 0x10:
  169. btn_type |= SND_JACK_BTN_2;
  170. break;
  171. case 0x20:
  172. btn_type |= SND_JACK_BTN_3;
  173. break;
  174. case 0x40:
  175. btn_type |= SND_JACK_BTN_0;
  176. break;
  177. case 0x80:
  178. btn_type |= SND_JACK_BTN_1;
  179. break;
  180. }
  181. switch (buf[2]) {
  182. case 0x01:
  183. case 0x10:
  184. btn_type |= SND_JACK_BTN_2;
  185. break;
  186. case 0x02:
  187. case 0x20:
  188. btn_type |= SND_JACK_BTN_3;
  189. break;
  190. case 0x04:
  191. case 0x40:
  192. btn_type |= SND_JACK_BTN_0;
  193. break;
  194. case 0x08:
  195. case 0x80:
  196. btn_type |= SND_JACK_BTN_1;
  197. break;
  198. }
  199. }
  200. _end_btn_det_:
  201. /* Host is owner, so set back to device */
  202. if (owner == 0)
  203. /* set owner to device */
  204. regmap_write(rt711->regmap,
  205. SDW_SDCA_CTL(FUNC_NUM_HID, RT711_SDCA_ENT_HID01,
  206. RT711_SDCA_CTL_HIDTX_SET_OWNER_TO_DEVICE, 0), 0x01);
  207. return btn_type;
  208. }
  209. static int rt711_sdca_headset_detect(struct rt711_sdca_priv *rt711)
  210. {
  211. unsigned int det_mode;
  212. int ret;
  213. /* get detected_mode */
  214. ret = regmap_read(rt711->regmap,
  215. SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_GE49, RT711_SDCA_CTL_DETECTED_MODE, 0),
  216. &det_mode);
  217. if (ret < 0)
  218. goto io_error;
  219. switch (det_mode) {
  220. case 0x00:
  221. rt711->jack_type = 0;
  222. break;
  223. case 0x03:
  224. rt711->jack_type = SND_JACK_HEADPHONE;
  225. break;
  226. case 0x05:
  227. rt711->jack_type = SND_JACK_HEADSET;
  228. break;
  229. }
  230. /* write selected_mode */
  231. if (det_mode) {
  232. ret = regmap_write(rt711->regmap,
  233. SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_GE49, RT711_SDCA_CTL_SELECTED_MODE, 0),
  234. det_mode);
  235. if (ret < 0)
  236. goto io_error;
  237. }
  238. dev_dbg(&rt711->slave->dev,
  239. "%s, detected_mode=0x%x\n", __func__, det_mode);
  240. return 0;
  241. io_error:
  242. pr_err_ratelimited("IO error in %s, ret %d\n", __func__, ret);
  243. return ret;
  244. }
  245. static void rt711_sdca_jack_detect_handler(struct work_struct *work)
  246. {
  247. struct rt711_sdca_priv *rt711 =
  248. container_of(work, struct rt711_sdca_priv, jack_detect_work.work);
  249. int btn_type = 0, ret;
  250. if (!rt711->hs_jack)
  251. return;
  252. if (!rt711->component->card || !rt711->component->card->instantiated)
  253. return;
  254. /* SDW_SCP_SDCA_INT_SDCA_0 is used for jack detection */
  255. if (rt711->scp_sdca_stat1 & SDW_SCP_SDCA_INT_SDCA_0) {
  256. ret = rt711_sdca_headset_detect(rt711);
  257. if (ret < 0)
  258. return;
  259. }
  260. /* SDW_SCP_SDCA_INT_SDCA_8 is used for button detection */
  261. if (rt711->scp_sdca_stat2 & SDW_SCP_SDCA_INT_SDCA_8)
  262. btn_type = rt711_sdca_button_detect(rt711);
  263. if (rt711->jack_type == 0)
  264. btn_type = 0;
  265. dev_dbg(&rt711->slave->dev,
  266. "in %s, jack_type=0x%x\n", __func__, rt711->jack_type);
  267. dev_dbg(&rt711->slave->dev,
  268. "in %s, btn_type=0x%x\n", __func__, btn_type);
  269. dev_dbg(&rt711->slave->dev,
  270. "in %s, scp_sdca_stat1=0x%x, scp_sdca_stat2=0x%x\n", __func__,
  271. rt711->scp_sdca_stat1, rt711->scp_sdca_stat2);
  272. snd_soc_jack_report(rt711->hs_jack, rt711->jack_type | btn_type,
  273. SND_JACK_HEADSET |
  274. SND_JACK_BTN_0 | SND_JACK_BTN_1 |
  275. SND_JACK_BTN_2 | SND_JACK_BTN_3);
  276. if (btn_type) {
  277. /* button released */
  278. snd_soc_jack_report(rt711->hs_jack, rt711->jack_type,
  279. SND_JACK_HEADSET |
  280. SND_JACK_BTN_0 | SND_JACK_BTN_1 |
  281. SND_JACK_BTN_2 | SND_JACK_BTN_3);
  282. mod_delayed_work(system_power_efficient_wq,
  283. &rt711->jack_btn_check_work, msecs_to_jiffies(200));
  284. }
  285. }
  286. static void rt711_sdca_btn_check_handler(struct work_struct *work)
  287. {
  288. struct rt711_sdca_priv *rt711 =
  289. container_of(work, struct rt711_sdca_priv, jack_btn_check_work.work);
  290. int btn_type = 0, ret, idx;
  291. unsigned int det_mode, offset, val;
  292. unsigned char buf[3];
  293. ret = regmap_read(rt711->regmap,
  294. SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_GE49, RT711_SDCA_CTL_DETECTED_MODE, 0),
  295. &det_mode);
  296. if (ret < 0)
  297. goto io_error;
  298. /* pin attached */
  299. if (det_mode) {
  300. /* read UMP message offset */
  301. ret = regmap_read(rt711->regmap,
  302. SDW_SDCA_CTL(FUNC_NUM_HID, RT711_SDCA_ENT_HID01, RT711_SDCA_CTL_HIDTX_MESSAGE_OFFSET, 0),
  303. &offset);
  304. if (ret < 0)
  305. goto io_error;
  306. for (idx = 0; idx < sizeof(buf); idx++) {
  307. ret = regmap_read(rt711->regmap,
  308. RT711_BUF_ADDR_HID1 + offset + idx, &val);
  309. if (ret < 0)
  310. goto io_error;
  311. buf[idx] = val & 0xff;
  312. }
  313. if (buf[0] == 0x11) {
  314. switch (buf[1] & 0xf0) {
  315. case 0x10:
  316. btn_type |= SND_JACK_BTN_2;
  317. break;
  318. case 0x20:
  319. btn_type |= SND_JACK_BTN_3;
  320. break;
  321. case 0x40:
  322. btn_type |= SND_JACK_BTN_0;
  323. break;
  324. case 0x80:
  325. btn_type |= SND_JACK_BTN_1;
  326. break;
  327. }
  328. switch (buf[2]) {
  329. case 0x01:
  330. case 0x10:
  331. btn_type |= SND_JACK_BTN_2;
  332. break;
  333. case 0x02:
  334. case 0x20:
  335. btn_type |= SND_JACK_BTN_3;
  336. break;
  337. case 0x04:
  338. case 0x40:
  339. btn_type |= SND_JACK_BTN_0;
  340. break;
  341. case 0x08:
  342. case 0x80:
  343. btn_type |= SND_JACK_BTN_1;
  344. break;
  345. }
  346. }
  347. } else
  348. rt711->jack_type = 0;
  349. dev_dbg(&rt711->slave->dev, "%s, btn_type=0x%x\n", __func__, btn_type);
  350. snd_soc_jack_report(rt711->hs_jack, rt711->jack_type | btn_type,
  351. SND_JACK_HEADSET |
  352. SND_JACK_BTN_0 | SND_JACK_BTN_1 |
  353. SND_JACK_BTN_2 | SND_JACK_BTN_3);
  354. if (btn_type) {
  355. /* button released */
  356. snd_soc_jack_report(rt711->hs_jack, rt711->jack_type,
  357. SND_JACK_HEADSET |
  358. SND_JACK_BTN_0 | SND_JACK_BTN_1 |
  359. SND_JACK_BTN_2 | SND_JACK_BTN_3);
  360. mod_delayed_work(system_power_efficient_wq,
  361. &rt711->jack_btn_check_work, msecs_to_jiffies(200));
  362. }
  363. return;
  364. io_error:
  365. pr_err_ratelimited("IO error in %s, ret %d\n", __func__, ret);
  366. }
  367. static void rt711_sdca_jack_init(struct rt711_sdca_priv *rt711)
  368. {
  369. mutex_lock(&rt711->calibrate_mutex);
  370. if (rt711->hs_jack) {
  371. /* Enable HID1 event & set button RTC mode */
  372. rt711_sdca_index_update_bits(rt711, RT711_VENDOR_HDA_CTL,
  373. RT711_PUSH_BTN_INT_CTL6, 0x80f0, 0x8000);
  374. rt711_sdca_index_update_bits(rt711, RT711_VENDOR_HDA_CTL,
  375. RT711_PUSH_BTN_INT_CTL2, 0x11dd, 0x11dd);
  376. rt711_sdca_index_write(rt711, RT711_VENDOR_HDA_CTL,
  377. RT711_PUSH_BTN_INT_CTL7, 0xffff);
  378. rt711_sdca_index_update_bits(rt711, RT711_VENDOR_HDA_CTL,
  379. RT711_PUSH_BTN_INT_CTL9, 0xf000, 0x0000);
  380. /* GE_mode_change_event_en & Hid1_push_button_event_en */
  381. rt711_sdca_index_update_bits(rt711, RT711_VENDOR_HDA_CTL,
  382. RT711_GE_MODE_RELATED_CTL, 0x0c00, 0x0c00);
  383. switch (rt711->jd_src) {
  384. case RT711_JD1:
  385. /* default settings was already for JD1 */
  386. break;
  387. case RT711_JD2:
  388. rt711_sdca_index_update_bits(rt711, RT711_VENDOR_REG,
  389. RT711_JD_CTL1, RT711_JD2_DIGITAL_MODE_SEL,
  390. RT711_JD2_DIGITAL_MODE_SEL);
  391. rt711_sdca_index_update_bits(rt711, RT711_VENDOR_REG,
  392. RT711_JD_CTL2, RT711_JD2_2PORT_200K_DECODE_HP | RT711_HP_JD_SEL_JD2,
  393. RT711_JD2_2PORT_200K_DECODE_HP | RT711_HP_JD_SEL_JD2);
  394. rt711_sdca_index_update_bits(rt711, RT711_VENDOR_REG,
  395. RT711_CC_DET1,
  396. RT711_HP_JD_FINAL_RESULT_CTL_JD12,
  397. RT711_HP_JD_FINAL_RESULT_CTL_JD12);
  398. break;
  399. default:
  400. dev_warn(rt711->component->dev, "Wrong JD source\n");
  401. break;
  402. }
  403. /* set SCP_SDCA_IntMask1[0]=1 */
  404. sdw_write_no_pm(rt711->slave, SDW_SCP_SDCA_INTMASK1, SDW_SCP_SDCA_INTMASK_SDCA_0);
  405. /* set SCP_SDCA_IntMask2[0]=1 */
  406. sdw_write_no_pm(rt711->slave, SDW_SCP_SDCA_INTMASK2, SDW_SCP_SDCA_INTMASK_SDCA_8);
  407. dev_dbg(&rt711->slave->dev, "in %s enable\n", __func__);
  408. } else {
  409. /* disable HID 1/2 event */
  410. rt711_sdca_index_update_bits(rt711, RT711_VENDOR_HDA_CTL,
  411. RT711_GE_MODE_RELATED_CTL, 0x0c00, 0x0000);
  412. dev_dbg(&rt711->slave->dev, "in %s disable\n", __func__);
  413. }
  414. mutex_unlock(&rt711->calibrate_mutex);
  415. }
  416. static int rt711_sdca_set_jack_detect(struct snd_soc_component *component,
  417. struct snd_soc_jack *hs_jack, void *data)
  418. {
  419. struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
  420. int ret;
  421. rt711->hs_jack = hs_jack;
  422. ret = pm_runtime_resume_and_get(component->dev);
  423. if (ret < 0) {
  424. if (ret != -EACCES) {
  425. dev_err(component->dev, "%s: failed to resume %d\n", __func__, ret);
  426. return ret;
  427. }
  428. /* pm_runtime not enabled yet */
  429. dev_dbg(component->dev, "%s: skipping jack init for now\n", __func__);
  430. return 0;
  431. }
  432. rt711_sdca_jack_init(rt711);
  433. pm_runtime_mark_last_busy(component->dev);
  434. pm_runtime_put_autosuspend(component->dev);
  435. return 0;
  436. }
  437. /* For SDCA control DAC/ADC Gain */
  438. static int rt711_sdca_set_gain_put(struct snd_kcontrol *kcontrol,
  439. struct snd_ctl_elem_value *ucontrol)
  440. {
  441. struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
  442. struct soc_mixer_control *mc =
  443. (struct soc_mixer_control *)kcontrol->private_value;
  444. struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
  445. unsigned int read_l, read_r, gain_l_val, gain_r_val;
  446. unsigned int i, adc_vol_flag = 0, changed = 0;
  447. unsigned int lvalue, rvalue;
  448. if (strstr(ucontrol->id.name, "FU1E Capture Volume") ||
  449. strstr(ucontrol->id.name, "FU0F Capture Volume"))
  450. adc_vol_flag = 1;
  451. regmap_read(rt711->mbq_regmap, mc->reg, &lvalue);
  452. regmap_read(rt711->mbq_regmap, mc->rreg, &rvalue);
  453. /* control value to 2's complement value */
  454. /* L Channel */
  455. gain_l_val = ucontrol->value.integer.value[0];
  456. if (gain_l_val > mc->max)
  457. gain_l_val = mc->max;
  458. read_l = gain_l_val;
  459. if (mc->shift == 8) /* boost gain */
  460. gain_l_val = (gain_l_val * 10) << mc->shift;
  461. else { /* ADC/DAC gain */
  462. if (adc_vol_flag && gain_l_val > mc->shift)
  463. gain_l_val = (gain_l_val - mc->shift) * 75;
  464. else
  465. gain_l_val = (mc->shift - gain_l_val) * 75;
  466. gain_l_val <<= 8;
  467. gain_l_val /= 100;
  468. if (!(adc_vol_flag && read_l > mc->shift)) {
  469. gain_l_val = ~gain_l_val;
  470. gain_l_val += 1;
  471. }
  472. gain_l_val &= 0xffff;
  473. }
  474. /* R Channel */
  475. gain_r_val = ucontrol->value.integer.value[1];
  476. if (gain_r_val > mc->max)
  477. gain_r_val = mc->max;
  478. read_r = gain_r_val;
  479. if (mc->shift == 8) /* boost gain */
  480. gain_r_val = (gain_r_val * 10) << mc->shift;
  481. else { /* ADC/DAC gain */
  482. if (adc_vol_flag && gain_r_val > mc->shift)
  483. gain_r_val = (gain_r_val - mc->shift) * 75;
  484. else
  485. gain_r_val = (mc->shift - gain_r_val) * 75;
  486. gain_r_val <<= 8;
  487. gain_r_val /= 100;
  488. if (!(adc_vol_flag && read_r > mc->shift)) {
  489. gain_r_val = ~gain_r_val;
  490. gain_r_val += 1;
  491. }
  492. gain_r_val &= 0xffff;
  493. }
  494. if (lvalue != gain_l_val || rvalue != gain_r_val)
  495. changed = 1;
  496. else
  497. return 0;
  498. for (i = 0; i < 3; i++) { /* retry 3 times at most */
  499. /* Lch*/
  500. regmap_write(rt711->mbq_regmap, mc->reg, gain_l_val);
  501. /* Rch */
  502. regmap_write(rt711->mbq_regmap, mc->rreg, gain_r_val);
  503. regmap_read(rt711->mbq_regmap, mc->reg, &read_l);
  504. regmap_read(rt711->mbq_regmap, mc->rreg, &read_r);
  505. if (read_r == gain_r_val && read_l == gain_l_val)
  506. break;
  507. }
  508. return i == 3 ? -EIO : changed;
  509. }
  510. static int rt711_sdca_set_gain_get(struct snd_kcontrol *kcontrol,
  511. struct snd_ctl_elem_value *ucontrol)
  512. {
  513. struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
  514. struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
  515. struct soc_mixer_control *mc =
  516. (struct soc_mixer_control *)kcontrol->private_value;
  517. unsigned int read_l, read_r, ctl_l = 0, ctl_r = 0;
  518. unsigned int adc_vol_flag = 0, neg_flag = 0;
  519. if (strstr(ucontrol->id.name, "FU1E Capture Volume") ||
  520. strstr(ucontrol->id.name, "FU0F Capture Volume"))
  521. adc_vol_flag = 1;
  522. regmap_read(rt711->mbq_regmap, mc->reg, &read_l);
  523. regmap_read(rt711->mbq_regmap, mc->rreg, &read_r);
  524. /* 2's complement value to control value */
  525. if (mc->shift == 8) /* boost gain */
  526. ctl_l = (read_l >> mc->shift) / 10;
  527. else { /* ADC/DAC gain */
  528. ctl_l = read_l;
  529. if (read_l & BIT(15)) {
  530. ctl_l = 0xffff & ~(read_l - 1);
  531. neg_flag = 1;
  532. }
  533. ctl_l *= 100;
  534. ctl_l >>= 8;
  535. if (adc_vol_flag) {
  536. if (neg_flag)
  537. ctl_l = mc->shift - (ctl_l / 75);
  538. else
  539. ctl_l = mc->shift + (ctl_l / 75);
  540. } else
  541. ctl_l = mc->max - (ctl_l / 75);
  542. }
  543. neg_flag = 0;
  544. if (read_l != read_r) {
  545. if (mc->shift == 8) /* boost gain */
  546. ctl_r = (read_r >> mc->shift) / 10;
  547. else { /* ADC/DAC gain */
  548. ctl_r = read_r;
  549. if (read_r & BIT(15)) {
  550. ctl_r = 0xffff & ~(read_r - 1);
  551. neg_flag = 1;
  552. }
  553. ctl_r *= 100;
  554. ctl_r >>= 8;
  555. if (adc_vol_flag) {
  556. if (neg_flag)
  557. ctl_r = mc->shift - (ctl_r / 75);
  558. else
  559. ctl_r = mc->shift + (ctl_r / 75);
  560. } else
  561. ctl_r = mc->max - (ctl_r / 75);
  562. }
  563. } else
  564. ctl_r = ctl_l;
  565. ucontrol->value.integer.value[0] = ctl_l;
  566. ucontrol->value.integer.value[1] = ctl_r;
  567. return 0;
  568. }
  569. static int rt711_sdca_set_fu0f_capture_ctl(struct rt711_sdca_priv *rt711)
  570. {
  571. int err;
  572. unsigned int ch_l, ch_r;
  573. ch_l = (rt711->fu0f_dapm_mute || rt711->fu0f_mixer_l_mute) ? 0x01 : 0x00;
  574. ch_r = (rt711->fu0f_dapm_mute || rt711->fu0f_mixer_r_mute) ? 0x01 : 0x00;
  575. err = regmap_write(rt711->regmap,
  576. SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_USER_FU0F,
  577. RT711_SDCA_CTL_FU_MUTE, CH_L), ch_l);
  578. if (err < 0)
  579. return err;
  580. err = regmap_write(rt711->regmap,
  581. SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_USER_FU0F,
  582. RT711_SDCA_CTL_FU_MUTE, CH_R), ch_r);
  583. if (err < 0)
  584. return err;
  585. return 0;
  586. }
  587. static int rt711_sdca_set_fu1e_capture_ctl(struct rt711_sdca_priv *rt711)
  588. {
  589. int err;
  590. unsigned int ch_l, ch_r;
  591. ch_l = (rt711->fu1e_dapm_mute || rt711->fu1e_mixer_l_mute) ? 0x01 : 0x00;
  592. ch_r = (rt711->fu1e_dapm_mute || rt711->fu1e_mixer_r_mute) ? 0x01 : 0x00;
  593. err = regmap_write(rt711->regmap,
  594. SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT711_SDCA_ENT_USER_FU1E,
  595. RT711_SDCA_CTL_FU_MUTE, CH_L), ch_l);
  596. if (err < 0)
  597. return err;
  598. err = regmap_write(rt711->regmap,
  599. SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT711_SDCA_ENT_USER_FU1E,
  600. RT711_SDCA_CTL_FU_MUTE, CH_R), ch_r);
  601. if (err < 0)
  602. return err;
  603. return 0;
  604. }
  605. static int rt711_sdca_fu1e_capture_get(struct snd_kcontrol *kcontrol,
  606. struct snd_ctl_elem_value *ucontrol)
  607. {
  608. struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
  609. struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
  610. ucontrol->value.integer.value[0] = !rt711->fu1e_mixer_l_mute;
  611. ucontrol->value.integer.value[1] = !rt711->fu1e_mixer_r_mute;
  612. return 0;
  613. }
  614. static int rt711_sdca_fu1e_capture_put(struct snd_kcontrol *kcontrol,
  615. struct snd_ctl_elem_value *ucontrol)
  616. {
  617. struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
  618. struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
  619. int err, changed = 0;
  620. if (rt711->fu1e_mixer_l_mute != !ucontrol->value.integer.value[0] ||
  621. rt711->fu1e_mixer_r_mute != !ucontrol->value.integer.value[1])
  622. changed = 1;
  623. rt711->fu1e_mixer_l_mute = !ucontrol->value.integer.value[0];
  624. rt711->fu1e_mixer_r_mute = !ucontrol->value.integer.value[1];
  625. err = rt711_sdca_set_fu1e_capture_ctl(rt711);
  626. if (err < 0)
  627. return err;
  628. return changed;
  629. }
  630. static int rt711_sdca_fu0f_capture_get(struct snd_kcontrol *kcontrol,
  631. struct snd_ctl_elem_value *ucontrol)
  632. {
  633. struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
  634. struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
  635. ucontrol->value.integer.value[0] = !rt711->fu0f_mixer_l_mute;
  636. ucontrol->value.integer.value[1] = !rt711->fu0f_mixer_r_mute;
  637. return 0;
  638. }
  639. static int rt711_sdca_fu0f_capture_put(struct snd_kcontrol *kcontrol,
  640. struct snd_ctl_elem_value *ucontrol)
  641. {
  642. struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
  643. struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
  644. int err, changed = 0;
  645. if (rt711->fu0f_mixer_l_mute != !ucontrol->value.integer.value[0] ||
  646. rt711->fu0f_mixer_r_mute != !ucontrol->value.integer.value[1])
  647. changed = 1;
  648. rt711->fu0f_mixer_l_mute = !ucontrol->value.integer.value[0];
  649. rt711->fu0f_mixer_r_mute = !ucontrol->value.integer.value[1];
  650. err = rt711_sdca_set_fu0f_capture_ctl(rt711);
  651. if (err < 0)
  652. return err;
  653. return changed;
  654. }
  655. static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -6525, 75, 0);
  656. static const DECLARE_TLV_DB_SCALE(in_vol_tlv, -1725, 75, 0);
  657. static const DECLARE_TLV_DB_SCALE(mic_vol_tlv, 0, 1000, 0);
  658. static const struct snd_kcontrol_new rt711_sdca_snd_controls[] = {
  659. SOC_DOUBLE_R_EXT_TLV("FU05 Playback Volume",
  660. SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_USER_FU05, RT711_SDCA_CTL_FU_VOLUME, CH_L),
  661. SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_USER_FU05, RT711_SDCA_CTL_FU_VOLUME, CH_R),
  662. 0x57, 0x57, 0,
  663. rt711_sdca_set_gain_get, rt711_sdca_set_gain_put, out_vol_tlv),
  664. SOC_DOUBLE_EXT("FU1E Capture Switch", SND_SOC_NOPM, 0, 1, 1, 0,
  665. rt711_sdca_fu1e_capture_get, rt711_sdca_fu1e_capture_put),
  666. SOC_DOUBLE_EXT("FU0F Capture Switch", SND_SOC_NOPM, 0, 1, 1, 0,
  667. rt711_sdca_fu0f_capture_get, rt711_sdca_fu0f_capture_put),
  668. SOC_DOUBLE_R_EXT_TLV("FU1E Capture Volume",
  669. SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT711_SDCA_ENT_USER_FU1E, RT711_SDCA_CTL_FU_VOLUME, CH_L),
  670. SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT711_SDCA_ENT_USER_FU1E, RT711_SDCA_CTL_FU_VOLUME, CH_R),
  671. 0x17, 0x3f, 0,
  672. rt711_sdca_set_gain_get, rt711_sdca_set_gain_put, in_vol_tlv),
  673. SOC_DOUBLE_R_EXT_TLV("FU0F Capture Volume",
  674. SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_USER_FU0F, RT711_SDCA_CTL_FU_VOLUME, CH_L),
  675. SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_USER_FU0F, RT711_SDCA_CTL_FU_VOLUME, CH_R),
  676. 0x17, 0x3f, 0,
  677. rt711_sdca_set_gain_get, rt711_sdca_set_gain_put, in_vol_tlv),
  678. SOC_DOUBLE_R_EXT_TLV("FU44 Gain Volume",
  679. SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_PLATFORM_FU44, RT711_SDCA_CTL_FU_CH_GAIN, CH_L),
  680. SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_PLATFORM_FU44, RT711_SDCA_CTL_FU_CH_GAIN, CH_R),
  681. 8, 3, 0,
  682. rt711_sdca_set_gain_get, rt711_sdca_set_gain_put, mic_vol_tlv),
  683. SOC_DOUBLE_R_EXT_TLV("FU15 Gain Volume",
  684. SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT711_SDCA_ENT_PLATFORM_FU15, RT711_SDCA_CTL_FU_CH_GAIN, CH_L),
  685. SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT711_SDCA_ENT_PLATFORM_FU15, RT711_SDCA_CTL_FU_CH_GAIN, CH_R),
  686. 8, 3, 0,
  687. rt711_sdca_set_gain_get, rt711_sdca_set_gain_put, mic_vol_tlv),
  688. };
  689. static int rt711_sdca_mux_get(struct snd_kcontrol *kcontrol,
  690. struct snd_ctl_elem_value *ucontrol)
  691. {
  692. struct snd_soc_component *component =
  693. snd_soc_dapm_kcontrol_component(kcontrol);
  694. struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
  695. unsigned int val = 0, mask_sft;
  696. if (strstr(ucontrol->id.name, "ADC 22 Mux"))
  697. mask_sft = 10;
  698. else if (strstr(ucontrol->id.name, "ADC 23 Mux"))
  699. mask_sft = 13;
  700. else
  701. return -EINVAL;
  702. rt711_sdca_index_read(rt711, RT711_VENDOR_HDA_CTL,
  703. RT711_HDA_LEGACY_MUX_CTL1, &val);
  704. ucontrol->value.enumerated.item[0] = (val >> mask_sft) & 0x7;
  705. return 0;
  706. }
  707. static int rt711_sdca_mux_put(struct snd_kcontrol *kcontrol,
  708. struct snd_ctl_elem_value *ucontrol)
  709. {
  710. struct snd_soc_component *component =
  711. snd_soc_dapm_kcontrol_component(kcontrol);
  712. struct snd_soc_dapm_context *dapm =
  713. snd_soc_dapm_kcontrol_dapm(kcontrol);
  714. struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
  715. struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
  716. unsigned int *item = ucontrol->value.enumerated.item;
  717. unsigned int val, val2 = 0, change, mask_sft;
  718. if (item[0] >= e->items)
  719. return -EINVAL;
  720. if (strstr(ucontrol->id.name, "ADC 22 Mux"))
  721. mask_sft = 10;
  722. else if (strstr(ucontrol->id.name, "ADC 23 Mux"))
  723. mask_sft = 13;
  724. else
  725. return -EINVAL;
  726. val = snd_soc_enum_item_to_val(e, item[0]) << e->shift_l;
  727. rt711_sdca_index_read(rt711, RT711_VENDOR_HDA_CTL,
  728. RT711_HDA_LEGACY_MUX_CTL1, &val2);
  729. val2 = (val2 >> mask_sft) & 0x7;
  730. if (val == val2)
  731. change = 0;
  732. else
  733. change = 1;
  734. if (change)
  735. rt711_sdca_index_update_bits(rt711, RT711_VENDOR_HDA_CTL,
  736. RT711_HDA_LEGACY_MUX_CTL1, 0x7 << mask_sft,
  737. val << mask_sft);
  738. snd_soc_dapm_mux_update_power(dapm, kcontrol,
  739. item[0], e, NULL);
  740. return change;
  741. }
  742. static const char * const adc_mux_text[] = {
  743. "MIC2",
  744. "LINE1",
  745. "LINE2",
  746. "DMIC",
  747. };
  748. static SOC_ENUM_SINGLE_DECL(
  749. rt711_adc22_enum, SND_SOC_NOPM, 0, adc_mux_text);
  750. static SOC_ENUM_SINGLE_DECL(
  751. rt711_adc23_enum, SND_SOC_NOPM, 0, adc_mux_text);
  752. static const struct snd_kcontrol_new rt711_sdca_adc22_mux =
  753. SOC_DAPM_ENUM_EXT("ADC 22 Mux", rt711_adc22_enum,
  754. rt711_sdca_mux_get, rt711_sdca_mux_put);
  755. static const struct snd_kcontrol_new rt711_sdca_adc23_mux =
  756. SOC_DAPM_ENUM_EXT("ADC 23 Mux", rt711_adc23_enum,
  757. rt711_sdca_mux_get, rt711_sdca_mux_put);
  758. static int rt711_sdca_fu05_event(struct snd_soc_dapm_widget *w,
  759. struct snd_kcontrol *kcontrol, int event)
  760. {
  761. struct snd_soc_component *component =
  762. snd_soc_dapm_to_component(w->dapm);
  763. struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
  764. unsigned char unmute = 0x0, mute = 0x1;
  765. switch (event) {
  766. case SND_SOC_DAPM_POST_PMU:
  767. regmap_write(rt711->regmap,
  768. SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_USER_FU05,
  769. RT711_SDCA_CTL_FU_MUTE, CH_L),
  770. unmute);
  771. regmap_write(rt711->regmap,
  772. SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_USER_FU05,
  773. RT711_SDCA_CTL_FU_MUTE, CH_R),
  774. unmute);
  775. break;
  776. case SND_SOC_DAPM_PRE_PMD:
  777. regmap_write(rt711->regmap,
  778. SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_USER_FU05,
  779. RT711_SDCA_CTL_FU_MUTE, CH_L),
  780. mute);
  781. regmap_write(rt711->regmap,
  782. SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_USER_FU05,
  783. RT711_SDCA_CTL_FU_MUTE, CH_R),
  784. mute);
  785. break;
  786. }
  787. return 0;
  788. }
  789. static int rt711_sdca_fu0f_event(struct snd_soc_dapm_widget *w,
  790. struct snd_kcontrol *kcontrol, int event)
  791. {
  792. struct snd_soc_component *component =
  793. snd_soc_dapm_to_component(w->dapm);
  794. struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
  795. switch (event) {
  796. case SND_SOC_DAPM_POST_PMU:
  797. rt711->fu0f_dapm_mute = false;
  798. rt711_sdca_set_fu0f_capture_ctl(rt711);
  799. break;
  800. case SND_SOC_DAPM_PRE_PMD:
  801. rt711->fu0f_dapm_mute = true;
  802. rt711_sdca_set_fu0f_capture_ctl(rt711);
  803. break;
  804. }
  805. return 0;
  806. }
  807. static int rt711_sdca_fu1e_event(struct snd_soc_dapm_widget *w,
  808. struct snd_kcontrol *kcontrol, int event)
  809. {
  810. struct snd_soc_component *component =
  811. snd_soc_dapm_to_component(w->dapm);
  812. struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
  813. switch (event) {
  814. case SND_SOC_DAPM_POST_PMU:
  815. rt711->fu1e_dapm_mute = false;
  816. rt711_sdca_set_fu1e_capture_ctl(rt711);
  817. break;
  818. case SND_SOC_DAPM_PRE_PMD:
  819. rt711->fu1e_dapm_mute = true;
  820. rt711_sdca_set_fu1e_capture_ctl(rt711);
  821. break;
  822. }
  823. return 0;
  824. }
  825. static int rt711_sdca_pde28_event(struct snd_soc_dapm_widget *w,
  826. struct snd_kcontrol *kcontrol, int event)
  827. {
  828. struct snd_soc_component *component =
  829. snd_soc_dapm_to_component(w->dapm);
  830. struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
  831. unsigned char ps0 = 0x0, ps3 = 0x3;
  832. switch (event) {
  833. case SND_SOC_DAPM_POST_PMU:
  834. regmap_write(rt711->regmap,
  835. SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_PDE28,
  836. RT711_SDCA_CTL_REQ_POWER_STATE, 0),
  837. ps0);
  838. break;
  839. case SND_SOC_DAPM_PRE_PMD:
  840. regmap_write(rt711->regmap,
  841. SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_PDE28,
  842. RT711_SDCA_CTL_REQ_POWER_STATE, 0),
  843. ps3);
  844. break;
  845. }
  846. return 0;
  847. }
  848. static int rt711_sdca_pde29_event(struct snd_soc_dapm_widget *w,
  849. struct snd_kcontrol *kcontrol, int event)
  850. {
  851. struct snd_soc_component *component =
  852. snd_soc_dapm_to_component(w->dapm);
  853. struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
  854. unsigned char ps0 = 0x0, ps3 = 0x3;
  855. switch (event) {
  856. case SND_SOC_DAPM_POST_PMU:
  857. regmap_write(rt711->regmap,
  858. SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_PDE29,
  859. RT711_SDCA_CTL_REQ_POWER_STATE, 0),
  860. ps0);
  861. break;
  862. case SND_SOC_DAPM_PRE_PMD:
  863. regmap_write(rt711->regmap,
  864. SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_PDE29,
  865. RT711_SDCA_CTL_REQ_POWER_STATE, 0),
  866. ps3);
  867. break;
  868. }
  869. return 0;
  870. }
  871. static int rt711_sdca_pde2a_event(struct snd_soc_dapm_widget *w,
  872. struct snd_kcontrol *kcontrol, int event)
  873. {
  874. struct snd_soc_component *component =
  875. snd_soc_dapm_to_component(w->dapm);
  876. struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
  877. unsigned char ps0 = 0x0, ps3 = 0x3;
  878. switch (event) {
  879. case SND_SOC_DAPM_POST_PMU:
  880. regmap_write(rt711->regmap,
  881. SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT711_SDCA_ENT_PDE2A,
  882. RT711_SDCA_CTL_REQ_POWER_STATE, 0),
  883. ps0);
  884. break;
  885. case SND_SOC_DAPM_PRE_PMD:
  886. regmap_write(rt711->regmap,
  887. SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT711_SDCA_ENT_PDE2A,
  888. RT711_SDCA_CTL_REQ_POWER_STATE, 0),
  889. ps3);
  890. break;
  891. }
  892. return 0;
  893. }
  894. static int rt711_sdca_line1_power_event(struct snd_soc_dapm_widget *w,
  895. struct snd_kcontrol *kcontrol, int event)
  896. {
  897. struct snd_soc_component *component =
  898. snd_soc_dapm_to_component(w->dapm);
  899. struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
  900. static unsigned int sel_mode = 0xffff;
  901. switch (event) {
  902. case SND_SOC_DAPM_POST_PMU:
  903. regmap_read(rt711->regmap,
  904. SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_GE49,
  905. RT711_SDCA_CTL_SELECTED_MODE, 0),
  906. &sel_mode);
  907. regmap_write(rt711->regmap,
  908. SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_LINE1,
  909. RT711_SDCA_CTL_VENDOR_DEF, 0),
  910. 0x1);
  911. regmap_write(rt711->regmap,
  912. SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_GE49,
  913. RT711_SDCA_CTL_SELECTED_MODE, 0),
  914. 0x7);
  915. break;
  916. case SND_SOC_DAPM_PRE_PMD:
  917. regmap_write(rt711->regmap,
  918. SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_LINE1,
  919. RT711_SDCA_CTL_VENDOR_DEF, 0),
  920. 0x0);
  921. if (sel_mode != 0xffff)
  922. regmap_write(rt711->regmap,
  923. SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_GE49,
  924. RT711_SDCA_CTL_SELECTED_MODE, 0),
  925. sel_mode);
  926. break;
  927. }
  928. return 0;
  929. }
  930. static int rt711_sdca_line2_power_event(struct snd_soc_dapm_widget *w,
  931. struct snd_kcontrol *kcontrol, int event)
  932. {
  933. struct snd_soc_component *component =
  934. snd_soc_dapm_to_component(w->dapm);
  935. struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
  936. unsigned char ps0 = 0x0, ps3 = 0x3;
  937. switch (event) {
  938. case SND_SOC_DAPM_POST_PMU:
  939. regmap_write(rt711->regmap,
  940. SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_PDELINE2,
  941. RT711_SDCA_CTL_REQ_POWER_STATE, 0),
  942. ps0);
  943. regmap_write(rt711->regmap,
  944. SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_LINE2,
  945. RT711_SDCA_CTL_VENDOR_DEF, 0),
  946. 0x1);
  947. break;
  948. case SND_SOC_DAPM_PRE_PMD:
  949. regmap_write(rt711->regmap,
  950. SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_LINE2,
  951. RT711_SDCA_CTL_VENDOR_DEF, 0),
  952. 0x0);
  953. regmap_write(rt711->regmap,
  954. SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_PDELINE2,
  955. RT711_SDCA_CTL_REQ_POWER_STATE, 0),
  956. ps3);
  957. break;
  958. }
  959. return 0;
  960. }
  961. static const struct snd_soc_dapm_widget rt711_sdca_dapm_widgets[] = {
  962. SND_SOC_DAPM_OUTPUT("HP"),
  963. SND_SOC_DAPM_INPUT("MIC2"),
  964. SND_SOC_DAPM_INPUT("DMIC1"),
  965. SND_SOC_DAPM_INPUT("DMIC2"),
  966. SND_SOC_DAPM_INPUT("LINE1"),
  967. SND_SOC_DAPM_INPUT("LINE2"),
  968. SND_SOC_DAPM_PGA_E("LINE1 Power", SND_SOC_NOPM,
  969. 0, 0, NULL, 0, rt711_sdca_line1_power_event,
  970. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
  971. SND_SOC_DAPM_PGA_E("LINE2 Power", SND_SOC_NOPM,
  972. 0, 0, NULL, 0, rt711_sdca_line2_power_event,
  973. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
  974. SND_SOC_DAPM_SUPPLY("PDE 28", SND_SOC_NOPM, 0, 0,
  975. rt711_sdca_pde28_event,
  976. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
  977. SND_SOC_DAPM_SUPPLY("PDE 29", SND_SOC_NOPM, 0, 0,
  978. rt711_sdca_pde29_event,
  979. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
  980. SND_SOC_DAPM_SUPPLY("PDE 2A", SND_SOC_NOPM, 0, 0,
  981. rt711_sdca_pde2a_event,
  982. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
  983. SND_SOC_DAPM_DAC_E("FU 05", NULL, SND_SOC_NOPM, 0, 0,
  984. rt711_sdca_fu05_event,
  985. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
  986. SND_SOC_DAPM_ADC_E("FU 0F", NULL, SND_SOC_NOPM, 0, 0,
  987. rt711_sdca_fu0f_event,
  988. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
  989. SND_SOC_DAPM_ADC_E("FU 1E", NULL, SND_SOC_NOPM, 0, 0,
  990. rt711_sdca_fu1e_event,
  991. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
  992. SND_SOC_DAPM_MUX("ADC 22 Mux", SND_SOC_NOPM, 0, 0,
  993. &rt711_sdca_adc22_mux),
  994. SND_SOC_DAPM_MUX("ADC 23 Mux", SND_SOC_NOPM, 0, 0,
  995. &rt711_sdca_adc23_mux),
  996. SND_SOC_DAPM_AIF_IN("DP3RX", "DP3 Playback", 0, SND_SOC_NOPM, 0, 0),
  997. SND_SOC_DAPM_AIF_OUT("DP2TX", "DP2 Capture", 0, SND_SOC_NOPM, 0, 0),
  998. SND_SOC_DAPM_AIF_OUT("DP4TX", "DP4 Capture", 0, SND_SOC_NOPM, 0, 0),
  999. };
  1000. static const struct snd_soc_dapm_route rt711_sdca_audio_map[] = {
  1001. {"FU 05", NULL, "DP3RX"},
  1002. {"DP2TX", NULL, "FU 0F"},
  1003. {"DP4TX", NULL, "FU 1E"},
  1004. {"LINE1 Power", NULL, "LINE1"},
  1005. {"LINE2 Power", NULL, "LINE2"},
  1006. {"HP", NULL, "PDE 28"},
  1007. {"FU 0F", NULL, "PDE 29"},
  1008. {"FU 1E", NULL, "PDE 2A"},
  1009. {"FU 0F", NULL, "ADC 22 Mux"},
  1010. {"FU 1E", NULL, "ADC 23 Mux"},
  1011. {"ADC 22 Mux", "DMIC", "DMIC1"},
  1012. {"ADC 22 Mux", "LINE1", "LINE1 Power"},
  1013. {"ADC 22 Mux", "LINE2", "LINE2 Power"},
  1014. {"ADC 22 Mux", "MIC2", "MIC2"},
  1015. {"ADC 23 Mux", "DMIC", "DMIC2"},
  1016. {"ADC 23 Mux", "LINE1", "LINE1 Power"},
  1017. {"ADC 23 Mux", "LINE2", "LINE2 Power"},
  1018. {"ADC 23 Mux", "MIC2", "MIC2"},
  1019. {"HP", NULL, "FU 05"},
  1020. };
  1021. static int rt711_sdca_parse_dt(struct rt711_sdca_priv *rt711, struct device *dev)
  1022. {
  1023. device_property_read_u32(dev, "realtek,jd-src", &rt711->jd_src);
  1024. return 0;
  1025. }
  1026. static int rt711_sdca_probe(struct snd_soc_component *component)
  1027. {
  1028. struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
  1029. int ret;
  1030. rt711_sdca_parse_dt(rt711, &rt711->slave->dev);
  1031. rt711->component = component;
  1032. ret = pm_runtime_resume(component->dev);
  1033. if (ret < 0 && ret != -EACCES)
  1034. return ret;
  1035. return 0;
  1036. }
  1037. static const struct snd_soc_component_driver soc_sdca_dev_rt711 = {
  1038. .probe = rt711_sdca_probe,
  1039. .controls = rt711_sdca_snd_controls,
  1040. .num_controls = ARRAY_SIZE(rt711_sdca_snd_controls),
  1041. .dapm_widgets = rt711_sdca_dapm_widgets,
  1042. .num_dapm_widgets = ARRAY_SIZE(rt711_sdca_dapm_widgets),
  1043. .dapm_routes = rt711_sdca_audio_map,
  1044. .num_dapm_routes = ARRAY_SIZE(rt711_sdca_audio_map),
  1045. .set_jack = rt711_sdca_set_jack_detect,
  1046. .endianness = 1,
  1047. };
  1048. static int rt711_sdca_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream,
  1049. int direction)
  1050. {
  1051. struct sdw_stream_data *stream;
  1052. if (!sdw_stream)
  1053. return 0;
  1054. stream = kzalloc(sizeof(*stream), GFP_KERNEL);
  1055. if (!stream)
  1056. return -ENOMEM;
  1057. stream->sdw_stream = sdw_stream;
  1058. /* Use tx_mask or rx_mask to configure stream tag and set dma_data */
  1059. if (direction == SNDRV_PCM_STREAM_PLAYBACK)
  1060. dai->playback_dma_data = stream;
  1061. else
  1062. dai->capture_dma_data = stream;
  1063. return 0;
  1064. }
  1065. static void rt711_sdca_shutdown(struct snd_pcm_substream *substream,
  1066. struct snd_soc_dai *dai)
  1067. {
  1068. struct sdw_stream_data *stream;
  1069. stream = snd_soc_dai_get_dma_data(dai, substream);
  1070. snd_soc_dai_set_dma_data(dai, substream, NULL);
  1071. kfree(stream);
  1072. }
  1073. static int rt711_sdca_pcm_hw_params(struct snd_pcm_substream *substream,
  1074. struct snd_pcm_hw_params *params,
  1075. struct snd_soc_dai *dai)
  1076. {
  1077. struct snd_soc_component *component = dai->component;
  1078. struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
  1079. struct sdw_stream_config stream_config;
  1080. struct sdw_port_config port_config;
  1081. enum sdw_data_direction direction;
  1082. struct sdw_stream_data *stream;
  1083. int retval, port, num_channels;
  1084. unsigned int sampling_rate;
  1085. dev_dbg(dai->dev, "%s %s", __func__, dai->name);
  1086. stream = snd_soc_dai_get_dma_data(dai, substream);
  1087. if (!stream)
  1088. return -EINVAL;
  1089. if (!rt711->slave)
  1090. return -EINVAL;
  1091. /* SoundWire specific configuration */
  1092. if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
  1093. direction = SDW_DATA_DIR_RX;
  1094. port = 3;
  1095. } else {
  1096. direction = SDW_DATA_DIR_TX;
  1097. if (dai->id == RT711_AIF1)
  1098. port = 2;
  1099. else if (dai->id == RT711_AIF2)
  1100. port = 4;
  1101. else
  1102. return -EINVAL;
  1103. }
  1104. stream_config.frame_rate = params_rate(params);
  1105. stream_config.ch_count = params_channels(params);
  1106. stream_config.bps = snd_pcm_format_width(params_format(params));
  1107. stream_config.direction = direction;
  1108. num_channels = params_channels(params);
  1109. port_config.ch_mask = GENMASK(num_channels - 1, 0);
  1110. port_config.num = port;
  1111. retval = sdw_stream_add_slave(rt711->slave, &stream_config,
  1112. &port_config, 1, stream->sdw_stream);
  1113. if (retval) {
  1114. dev_err(dai->dev, "Unable to configure port\n");
  1115. return retval;
  1116. }
  1117. if (params_channels(params) > 16) {
  1118. dev_err(component->dev, "Unsupported channels %d\n",
  1119. params_channels(params));
  1120. return -EINVAL;
  1121. }
  1122. /* sampling rate configuration */
  1123. switch (params_rate(params)) {
  1124. case 44100:
  1125. sampling_rate = RT711_SDCA_RATE_44100HZ;
  1126. break;
  1127. case 48000:
  1128. sampling_rate = RT711_SDCA_RATE_48000HZ;
  1129. break;
  1130. case 96000:
  1131. sampling_rate = RT711_SDCA_RATE_96000HZ;
  1132. break;
  1133. case 192000:
  1134. sampling_rate = RT711_SDCA_RATE_192000HZ;
  1135. break;
  1136. default:
  1137. dev_err(component->dev, "Rate %d is not supported\n",
  1138. params_rate(params));
  1139. return -EINVAL;
  1140. }
  1141. /* set sampling frequency */
  1142. regmap_write(rt711->regmap,
  1143. SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_CS01, RT711_SDCA_CTL_SAMPLE_FREQ_INDEX, 0),
  1144. sampling_rate);
  1145. regmap_write(rt711->regmap,
  1146. SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_CS11, RT711_SDCA_CTL_SAMPLE_FREQ_INDEX, 0),
  1147. sampling_rate);
  1148. regmap_write(rt711->regmap,
  1149. SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT711_SDCA_ENT_CS1F, RT711_SDCA_CTL_SAMPLE_FREQ_INDEX, 0),
  1150. sampling_rate);
  1151. return 0;
  1152. }
  1153. static int rt711_sdca_pcm_hw_free(struct snd_pcm_substream *substream,
  1154. struct snd_soc_dai *dai)
  1155. {
  1156. struct snd_soc_component *component = dai->component;
  1157. struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
  1158. struct sdw_stream_data *stream =
  1159. snd_soc_dai_get_dma_data(dai, substream);
  1160. if (!rt711->slave)
  1161. return -EINVAL;
  1162. sdw_stream_remove_slave(rt711->slave, stream->sdw_stream);
  1163. return 0;
  1164. }
  1165. #define RT711_STEREO_RATES (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 | \
  1166. SNDRV_PCM_RATE_192000)
  1167. #define RT711_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
  1168. SNDRV_PCM_FMTBIT_S24_LE)
  1169. static const struct snd_soc_dai_ops rt711_sdca_ops = {
  1170. .hw_params = rt711_sdca_pcm_hw_params,
  1171. .hw_free = rt711_sdca_pcm_hw_free,
  1172. .set_stream = rt711_sdca_set_sdw_stream,
  1173. .shutdown = rt711_sdca_shutdown,
  1174. };
  1175. static struct snd_soc_dai_driver rt711_sdca_dai[] = {
  1176. {
  1177. .name = "rt711-sdca-aif1",
  1178. .id = RT711_AIF1,
  1179. .playback = {
  1180. .stream_name = "DP3 Playback",
  1181. .channels_min = 1,
  1182. .channels_max = 2,
  1183. .rates = RT711_STEREO_RATES,
  1184. .formats = RT711_FORMATS,
  1185. },
  1186. .capture = {
  1187. .stream_name = "DP2 Capture",
  1188. .channels_min = 1,
  1189. .channels_max = 2,
  1190. .rates = RT711_STEREO_RATES,
  1191. .formats = RT711_FORMATS,
  1192. },
  1193. .ops = &rt711_sdca_ops,
  1194. },
  1195. {
  1196. .name = "rt711-sdca-aif2",
  1197. .id = RT711_AIF2,
  1198. .capture = {
  1199. .stream_name = "DP4 Capture",
  1200. .channels_min = 1,
  1201. .channels_max = 2,
  1202. .rates = RT711_STEREO_RATES,
  1203. .formats = RT711_FORMATS,
  1204. },
  1205. .ops = &rt711_sdca_ops,
  1206. }
  1207. };
  1208. int rt711_sdca_init(struct device *dev, struct regmap *regmap,
  1209. struct regmap *mbq_regmap, struct sdw_slave *slave)
  1210. {
  1211. struct rt711_sdca_priv *rt711;
  1212. int ret;
  1213. rt711 = devm_kzalloc(dev, sizeof(*rt711), GFP_KERNEL);
  1214. if (!rt711)
  1215. return -ENOMEM;
  1216. dev_set_drvdata(dev, rt711);
  1217. rt711->slave = slave;
  1218. rt711->regmap = regmap;
  1219. rt711->mbq_regmap = mbq_regmap;
  1220. mutex_init(&rt711->calibrate_mutex);
  1221. mutex_init(&rt711->disable_irq_lock);
  1222. INIT_DELAYED_WORK(&rt711->jack_detect_work, rt711_sdca_jack_detect_handler);
  1223. INIT_DELAYED_WORK(&rt711->jack_btn_check_work, rt711_sdca_btn_check_handler);
  1224. /*
  1225. * Mark hw_init to false
  1226. * HW init will be performed when device reports present
  1227. */
  1228. rt711->hw_init = false;
  1229. rt711->first_hw_init = false;
  1230. rt711->fu0f_dapm_mute = true;
  1231. rt711->fu1e_dapm_mute = true;
  1232. rt711->fu0f_mixer_l_mute = rt711->fu0f_mixer_r_mute = true;
  1233. rt711->fu1e_mixer_l_mute = rt711->fu1e_mixer_r_mute = true;
  1234. /* JD source uses JD2 in default */
  1235. rt711->jd_src = RT711_JD2;
  1236. ret = devm_snd_soc_register_component(dev,
  1237. &soc_sdca_dev_rt711,
  1238. rt711_sdca_dai,
  1239. ARRAY_SIZE(rt711_sdca_dai));
  1240. dev_dbg(&slave->dev, "%s\n", __func__);
  1241. return ret;
  1242. }
  1243. static void rt711_sdca_vd0_io_init(struct rt711_sdca_priv *rt711)
  1244. {
  1245. rt711_sdca_index_write(rt711, RT711_VENDOR_REG,
  1246. RT711_GPIO_TEST_MODE_CTL2, 0x0e00);
  1247. rt711_sdca_index_write(rt711, RT711_VENDOR_HDA_CTL,
  1248. RT711_HDA_LEGACY_GPIO_CTL, 0x0008);
  1249. regmap_write(rt711->regmap, 0x2f5a, 0x01);
  1250. rt711_sdca_index_write(rt711, RT711_VENDOR_REG,
  1251. RT711_ADC27_VOL_SET, 0x8728);
  1252. rt711_sdca_index_write(rt711, RT711_VENDOR_REG,
  1253. RT711_COMBO_JACK_AUTO_CTL3, 0xa472);
  1254. regmap_write(rt711->regmap, 0x2f50, 0x02);
  1255. rt711_sdca_index_update_bits(rt711, RT711_VENDOR_ANALOG_CTL,
  1256. RT711_MISC_POWER_CTL4, 0x6000, 0x6000);
  1257. rt711_sdca_index_update_bits(rt711, RT711_VENDOR_REG,
  1258. RT711_COMBO_JACK_AUTO_CTL3, 0x000c, 0x000c);
  1259. rt711_sdca_index_write(rt711, RT711_VENDOR_HDA_CTL,
  1260. RT711_HDA_LEGACY_CONFIG_CTL, 0x0000);
  1261. rt711_sdca_index_write(rt711, RT711_VENDOR_VAD,
  1262. RT711_VAD_SRAM_CTL1, 0x0050);
  1263. }
  1264. static void rt711_sdca_vd1_io_init(struct rt711_sdca_priv *rt711)
  1265. {
  1266. rt711_sdca_index_update_bits(rt711, RT711_VENDOR_HDA_CTL,
  1267. RT711_HDA_LEGACY_UNSOLICITED_CTL, 0x0300, 0x0000);
  1268. rt711_sdca_index_write(rt711, RT711_VENDOR_REG,
  1269. RT711_COMBO_JACK_AUTO_CTL3, 0xa43e);
  1270. regmap_write(rt711->regmap, 0x2f5a, 0x05);
  1271. rt711_sdca_index_write(rt711, RT711_VENDOR_REG,
  1272. RT711_JD_CTRL6, 0x0500);
  1273. rt711_sdca_index_write(rt711, RT711_VENDOR_REG,
  1274. RT711_DMIC_CTL1, 0x6173);
  1275. rt711_sdca_index_write(rt711, RT711_VENDOR_HDA_CTL,
  1276. RT711_HDA_LEGACY_CONFIG_CTL, 0x0000);
  1277. rt711_sdca_index_write(rt711, RT711_VENDOR_VAD,
  1278. RT711_VAD_SRAM_CTL1, 0x0050);
  1279. }
  1280. int rt711_sdca_io_init(struct device *dev, struct sdw_slave *slave)
  1281. {
  1282. struct rt711_sdca_priv *rt711 = dev_get_drvdata(dev);
  1283. int ret = 0;
  1284. unsigned int val;
  1285. rt711->disable_irq = false;
  1286. if (rt711->hw_init)
  1287. return 0;
  1288. if (rt711->first_hw_init) {
  1289. regcache_cache_only(rt711->regmap, false);
  1290. regcache_cache_bypass(rt711->regmap, true);
  1291. regcache_cache_only(rt711->mbq_regmap, false);
  1292. regcache_cache_bypass(rt711->mbq_regmap, true);
  1293. } else {
  1294. /*
  1295. * PM runtime is only enabled when a Slave reports as Attached
  1296. */
  1297. /* set autosuspend parameters */
  1298. pm_runtime_set_autosuspend_delay(&slave->dev, 3000);
  1299. pm_runtime_use_autosuspend(&slave->dev);
  1300. /* update count of parent 'active' children */
  1301. pm_runtime_set_active(&slave->dev);
  1302. /* make sure the device does not suspend immediately */
  1303. pm_runtime_mark_last_busy(&slave->dev);
  1304. pm_runtime_enable(&slave->dev);
  1305. }
  1306. pm_runtime_get_noresume(&slave->dev);
  1307. rt711_sdca_reset(rt711);
  1308. rt711_sdca_index_read(rt711, RT711_VENDOR_REG, RT711_JD_PRODUCT_NUM, &val);
  1309. rt711->hw_ver = val & 0xf;
  1310. if (rt711->hw_ver == RT711_VER_VD0)
  1311. rt711_sdca_vd0_io_init(rt711);
  1312. else
  1313. rt711_sdca_vd1_io_init(rt711);
  1314. /* DP4 mux select from 08_filter_Out_pri */
  1315. rt711_sdca_index_update_bits(rt711, RT711_VENDOR_REG,
  1316. RT711_FILTER_SRC_SEL, 0x1800, 0x0800);
  1317. /* ge_exclusive_inbox_en disable */
  1318. rt711_sdca_index_update_bits(rt711, RT711_VENDOR_HDA_CTL,
  1319. RT711_PUSH_BTN_INT_CTL0, 0x20, 0x00);
  1320. /* calibration */
  1321. ret = rt711_sdca_calibration(rt711);
  1322. if (ret < 0)
  1323. dev_err(dev, "%s, calibration failed!\n", __func__);
  1324. /* HP output enable */
  1325. regmap_write(rt711->regmap,
  1326. SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_OT1, RT711_SDCA_CTL_VENDOR_DEF, 0), 0x4);
  1327. /*
  1328. * if set_jack callback occurred early than io_init,
  1329. * we set up the jack detection function now
  1330. */
  1331. if (rt711->hs_jack)
  1332. rt711_sdca_jack_init(rt711);
  1333. if (rt711->first_hw_init) {
  1334. regcache_cache_bypass(rt711->regmap, false);
  1335. regcache_mark_dirty(rt711->regmap);
  1336. regcache_cache_bypass(rt711->mbq_regmap, false);
  1337. regcache_mark_dirty(rt711->mbq_regmap);
  1338. } else
  1339. rt711->first_hw_init = true;
  1340. /* Mark Slave initialization complete */
  1341. rt711->hw_init = true;
  1342. pm_runtime_mark_last_busy(&slave->dev);
  1343. pm_runtime_put_autosuspend(&slave->dev);
  1344. dev_dbg(&slave->dev, "%s hw_init complete\n", __func__);
  1345. return 0;
  1346. }
  1347. MODULE_DESCRIPTION("ASoC RT711 SDCA SDW driver");
  1348. MODULE_AUTHOR("Shuming Fan <[email protected]>");
  1349. MODULE_LICENSE("GPL");