patch_cs8409-tables.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * patch_cs8409-tables.c -- HD audio interface patch for Cirrus Logic CS8409 HDA bridge chip
  4. *
  5. * Copyright (C) 2021 Cirrus Logic, Inc. and
  6. * Cirrus Logic International Semiconductor Ltd.
  7. *
  8. * Author: Lucas Tanure <[email protected]>
  9. */
  10. #include "patch_cs8409.h"
  11. /******************************************************************************
  12. * CS42L42 Specific Data
  13. *
  14. ******************************************************************************/
  15. static const DECLARE_TLV_DB_SCALE(cs42l42_dac_db_scale, CS42L42_HP_VOL_REAL_MIN * 100, 100, 1);
  16. static const DECLARE_TLV_DB_SCALE(cs42l42_adc_db_scale, CS42L42_AMIC_VOL_REAL_MIN * 100, 100, 1);
  17. const struct snd_kcontrol_new cs42l42_dac_volume_mixer = {
  18. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  19. .index = 0,
  20. .subdevice = (HDA_SUBDEV_AMP_FLAG | HDA_SUBDEV_NID_FLAG),
  21. .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ),
  22. .info = cs42l42_volume_info,
  23. .get = cs42l42_volume_get,
  24. .put = cs42l42_volume_put,
  25. .tlv = { .p = cs42l42_dac_db_scale },
  26. .private_value = HDA_COMPOSE_AMP_VAL_OFS(CS8409_PIN_ASP1_TRANSMITTER_A, 3, CS8409_CODEC0,
  27. HDA_OUTPUT, CS42L42_VOL_DAC) | HDA_AMP_VAL_MIN_MUTE
  28. };
  29. const struct snd_kcontrol_new cs42l42_adc_volume_mixer = {
  30. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  31. .index = 0,
  32. .subdevice = (HDA_SUBDEV_AMP_FLAG | HDA_SUBDEV_NID_FLAG),
  33. .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ),
  34. .info = cs42l42_volume_info,
  35. .get = cs42l42_volume_get,
  36. .put = cs42l42_volume_put,
  37. .tlv = { .p = cs42l42_adc_db_scale },
  38. .private_value = HDA_COMPOSE_AMP_VAL_OFS(CS8409_PIN_ASP1_RECEIVER_A, 1, CS8409_CODEC0,
  39. HDA_INPUT, CS42L42_VOL_ADC) | HDA_AMP_VAL_MIN_MUTE
  40. };
  41. const struct hda_pcm_stream cs42l42_48k_pcm_analog_playback = {
  42. .rates = SNDRV_PCM_RATE_48000, /* fixed rate */
  43. };
  44. const struct hda_pcm_stream cs42l42_48k_pcm_analog_capture = {
  45. .rates = SNDRV_PCM_RATE_48000, /* fixed rate */
  46. };
  47. /******************************************************************************
  48. * BULLSEYE / WARLOCK / CYBORG Specific Arrays
  49. * CS8409/CS42L42
  50. ******************************************************************************/
  51. const struct hda_verb cs8409_cs42l42_init_verbs[] = {
  52. { CS8409_PIN_AFG, AC_VERB_SET_GPIO_WAKE_MASK, 0x0018 }, /* WAKE from GPIO 3,4 */
  53. { CS8409_PIN_VENDOR_WIDGET, AC_VERB_SET_PROC_STATE, 0x0001 }, /* Enable VPW processing */
  54. { CS8409_PIN_VENDOR_WIDGET, AC_VERB_SET_COEF_INDEX, 0x0002 }, /* Configure GPIO 6,7 */
  55. { CS8409_PIN_VENDOR_WIDGET, AC_VERB_SET_PROC_COEF, 0x0080 }, /* I2C mode */
  56. { CS8409_PIN_VENDOR_WIDGET, AC_VERB_SET_COEF_INDEX, 0x005b }, /* Set I2C bus speed */
  57. { CS8409_PIN_VENDOR_WIDGET, AC_VERB_SET_PROC_COEF, 0x0200 }, /* 100kHz I2C_STO = 2 */
  58. {} /* terminator */
  59. };
  60. static const struct hda_pintbl cs8409_cs42l42_pincfgs[] = {
  61. { CS8409_PIN_ASP1_TRANSMITTER_A, 0x042120f0 }, /* ASP-1-TX */
  62. { CS8409_PIN_ASP1_RECEIVER_A, 0x04a12050 }, /* ASP-1-RX */
  63. { CS8409_PIN_ASP2_TRANSMITTER_A, 0x901000f0 }, /* ASP-2-TX */
  64. { CS8409_PIN_DMIC1_IN, 0x90a00090 }, /* DMIC-1 */
  65. {} /* terminator */
  66. };
  67. static const struct hda_pintbl cs8409_cs42l42_pincfgs_no_dmic[] = {
  68. { CS8409_PIN_ASP1_TRANSMITTER_A, 0x042120f0 }, /* ASP-1-TX */
  69. { CS8409_PIN_ASP1_RECEIVER_A, 0x04a12050 }, /* ASP-1-RX */
  70. { CS8409_PIN_ASP2_TRANSMITTER_A, 0x901000f0 }, /* ASP-2-TX */
  71. {} /* terminator */
  72. };
  73. /* Vendor specific HW configuration for CS42L42 */
  74. static const struct cs8409_i2c_param cs42l42_init_reg_seq[] = {
  75. { CS42L42_I2C_TIMEOUT, 0xB0 },
  76. { CS42L42_ADC_CTL, 0x00 },
  77. { 0x1D02, 0x06 },
  78. { CS42L42_ADC_VOLUME, 0x9F },
  79. { CS42L42_OSC_SWITCH, 0x01 },
  80. { CS42L42_MCLK_CTL, 0x02 },
  81. { CS42L42_SRC_CTL, 0x03 },
  82. { CS42L42_MCLK_SRC_SEL, 0x00 },
  83. { CS42L42_ASP_FRM_CFG, 0x13 },
  84. { CS42L42_FSYNC_P_LOWER, 0xFF },
  85. { CS42L42_FSYNC_P_UPPER, 0x00 },
  86. { CS42L42_ASP_CLK_CFG, 0x20 },
  87. { CS42L42_SPDIF_CLK_CFG, 0x0D },
  88. { CS42L42_ASP_RX_DAI0_CH1_AP_RES, 0x02 },
  89. { CS42L42_ASP_RX_DAI0_CH1_BIT_MSB, 0x00 },
  90. { CS42L42_ASP_RX_DAI0_CH1_BIT_LSB, 0x00 },
  91. { CS42L42_ASP_RX_DAI0_CH2_AP_RES, 0x02 },
  92. { CS42L42_ASP_RX_DAI0_CH2_BIT_MSB, 0x00 },
  93. { CS42L42_ASP_RX_DAI0_CH2_BIT_LSB, 0x20 },
  94. { CS42L42_ASP_RX_DAI0_CH3_AP_RES, 0x02 },
  95. { CS42L42_ASP_RX_DAI0_CH3_BIT_MSB, 0x00 },
  96. { CS42L42_ASP_RX_DAI0_CH3_BIT_LSB, 0x80 },
  97. { CS42L42_ASP_RX_DAI0_CH4_AP_RES, 0x02 },
  98. { CS42L42_ASP_RX_DAI0_CH4_BIT_MSB, 0x00 },
  99. { CS42L42_ASP_RX_DAI0_CH4_BIT_LSB, 0xA0 },
  100. { CS42L42_ASP_RX_DAI0_EN, 0x0C },
  101. { CS42L42_ASP_TX_CH_EN, 0x01 },
  102. { CS42L42_ASP_TX_CH_AP_RES, 0x02 },
  103. { CS42L42_ASP_TX_CH1_BIT_MSB, 0x00 },
  104. { CS42L42_ASP_TX_CH1_BIT_LSB, 0x00 },
  105. { CS42L42_ASP_TX_SZ_EN, 0x01 },
  106. { CS42L42_PWR_CTL1, 0x0A },
  107. { CS42L42_PWR_CTL2, 0x84 },
  108. { CS42L42_MIXER_CHA_VOL, 0x3F },
  109. { CS42L42_MIXER_CHB_VOL, 0x3F },
  110. { CS42L42_MIXER_ADC_VOL, 0x3f },
  111. { CS42L42_HP_CTL, 0x03 },
  112. { CS42L42_MIC_DET_CTL1, 0xB6 },
  113. { CS42L42_TIPSENSE_CTL, 0xC2 },
  114. { CS42L42_HS_CLAMP_DISABLE, 0x01 },
  115. { CS42L42_HS_SWITCH_CTL, 0xF3 },
  116. { CS42L42_PWR_CTL3, 0x20 },
  117. { CS42L42_RSENSE_CTL2, 0x00 },
  118. { CS42L42_RSENSE_CTL3, 0x00 },
  119. { CS42L42_TSENSE_CTL, 0x80 },
  120. { CS42L42_HS_BIAS_CTL, 0xC0 },
  121. { CS42L42_PWR_CTL1, 0x02 },
  122. { CS42L42_ADC_OVFL_INT_MASK, 0xff },
  123. { CS42L42_MIXER_INT_MASK, 0xff },
  124. { CS42L42_SRC_INT_MASK, 0xff },
  125. { CS42L42_ASP_RX_INT_MASK, 0xff },
  126. { CS42L42_ASP_TX_INT_MASK, 0xff },
  127. { CS42L42_CODEC_INT_MASK, 0xff },
  128. { CS42L42_SRCPL_INT_MASK, 0xff },
  129. { CS42L42_VPMON_INT_MASK, 0xff },
  130. { CS42L42_PLL_LOCK_INT_MASK, 0xff },
  131. { CS42L42_TSRS_PLUG_INT_MASK, 0xff },
  132. { CS42L42_DET_INT1_MASK, 0xff },
  133. { CS42L42_DET_INT2_MASK, 0xff },
  134. };
  135. /* Vendor specific hw configuration for CS8409 */
  136. const struct cs8409_cir_param cs8409_cs42l42_hw_cfg[] = {
  137. /* +PLL1/2_EN, +I2C_EN */
  138. { CS8409_PIN_VENDOR_WIDGET, CS8409_DEV_CFG1, 0xb008 },
  139. /* ASP1/2_EN=0, ASP1_STP=1 */
  140. { CS8409_PIN_VENDOR_WIDGET, CS8409_DEV_CFG2, 0x0002 },
  141. /* ASP1/2_BUS_IDLE=10, +GPIO_I2C */
  142. { CS8409_PIN_VENDOR_WIDGET, CS8409_DEV_CFG3, 0x0a80 },
  143. /* ASP1.A: TX.LAP=0, TX.LSZ=24 bits, TX.LCS=0 */
  144. { CS8409_PIN_VENDOR_WIDGET, ASP1_A_TX_CTRL1, 0x0800 },
  145. /* ASP1.A: TX.RAP=0, TX.RSZ=24 bits, TX.RCS=32 */
  146. { CS8409_PIN_VENDOR_WIDGET, ASP1_A_TX_CTRL2, 0x0820 },
  147. /* ASP2.A: TX.LAP=0, TX.LSZ=24 bits, TX.LCS=0 */
  148. { CS8409_PIN_VENDOR_WIDGET, ASP2_A_TX_CTRL1, 0x0800 },
  149. /* ASP2.A: TX.RAP=1, TX.RSZ=24 bits, TX.RCS=0 */
  150. { CS8409_PIN_VENDOR_WIDGET, ASP2_A_TX_CTRL2, 0x2800 },
  151. /* ASP1.A: RX.LAP=0, RX.LSZ=24 bits, RX.LCS=0 */
  152. { CS8409_PIN_VENDOR_WIDGET, ASP1_A_RX_CTRL1, 0x0800 },
  153. /* ASP1.A: RX.RAP=0, RX.RSZ=24 bits, RX.RCS=0 */
  154. { CS8409_PIN_VENDOR_WIDGET, ASP1_A_RX_CTRL2, 0x0800 },
  155. /* ASP1: LCHI = 00h */
  156. { CS8409_PIN_VENDOR_WIDGET, CS8409_ASP1_CLK_CTRL1, 0x8000 },
  157. /* ASP1: MC/SC_SRCSEL=PLL1, LCPR=FFh */
  158. { CS8409_PIN_VENDOR_WIDGET, CS8409_ASP1_CLK_CTRL2, 0x28ff },
  159. /* ASP1: MCEN=0, FSD=011, SCPOL_IN/OUT=0, SCDIV=1:4 */
  160. { CS8409_PIN_VENDOR_WIDGET, CS8409_ASP1_CLK_CTRL3, 0x0062 },
  161. /* ASP2: LCHI=1Fh */
  162. { CS8409_PIN_VENDOR_WIDGET, CS8409_ASP2_CLK_CTRL1, 0x801f },
  163. /* ASP2: MC/SC_SRCSEL=PLL1, LCPR=3Fh */
  164. { CS8409_PIN_VENDOR_WIDGET, CS8409_ASP2_CLK_CTRL2, 0x283f },
  165. /* ASP2: 5050=1, MCEN=0, FSD=010, SCPOL_IN/OUT=1, SCDIV=1:16 */
  166. { CS8409_PIN_VENDOR_WIDGET, CS8409_ASP2_CLK_CTRL3, 0x805c },
  167. /* DMIC1_MO=10b, DMIC1/2_SR=1 */
  168. { CS8409_PIN_VENDOR_WIDGET, CS8409_DMIC_CFG, 0x0023 },
  169. /* ASP1/2_BEEP=0 */
  170. { CS8409_PIN_VENDOR_WIDGET, CS8409_BEEP_CFG, 0x0000 },
  171. /* ASP1/2_EN=1, ASP1_STP=1 */
  172. { CS8409_PIN_VENDOR_WIDGET, CS8409_DEV_CFG2, 0x0062 },
  173. /* -PLL2_EN */
  174. { CS8409_PIN_VENDOR_WIDGET, CS8409_DEV_CFG1, 0x9008 },
  175. /* TX2.A: pre-scale att.=0 dB */
  176. { CS8409_PIN_VENDOR_WIDGET, CS8409_PRE_SCALE_ATTN2, 0x0000 },
  177. /* ASP1/2_xxx_EN=1, ASP1/2_MCLK_EN=0, DMIC1_SCL_EN=1 */
  178. { CS8409_PIN_VENDOR_WIDGET, CS8409_PAD_CFG_SLW_RATE_CTRL, 0xfc03 },
  179. /* test mode on */
  180. { CS8409_PIN_VENDOR_WIDGET, 0xc0, 0x9999 },
  181. /* GPIO hysteresis = 30 us */
  182. { CS8409_PIN_VENDOR_WIDGET, 0xc5, 0x0000 },
  183. /* test mode off */
  184. { CS8409_PIN_VENDOR_WIDGET, 0xc0, 0x0000 },
  185. {} /* Terminator */
  186. };
  187. const struct cs8409_cir_param cs8409_cs42l42_bullseye_atn[] = {
  188. /* EQ_SEL=1, EQ1/2_EN=0 */
  189. { CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_CTRL1, 0x4000 },
  190. /* +EQ_ACC */
  191. { CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W2, 0x4000 },
  192. /* +EQ2_EN */
  193. { CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_CTRL1, 0x4010 },
  194. /* EQ_DATA_HI=0x0647 */
  195. { CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W1, 0x0647 },
  196. /* +EQ_WRT, +EQ_ACC, EQ_ADR=0, EQ_DATA_LO=0x67 */
  197. { CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W2, 0xc0c7 },
  198. /* EQ_DATA_HI=0x0647 */
  199. { CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W1, 0x0647 },
  200. /* +EQ_WRT, +EQ_ACC, EQ_ADR=1, EQ_DATA_LO=0x67 */
  201. { CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W2, 0xc1c7 },
  202. /* EQ_DATA_HI=0xf370 */
  203. { CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W1, 0xf370 },
  204. /* +EQ_WRT, +EQ_ACC, EQ_ADR=2, EQ_DATA_LO=0x71 */
  205. { CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W2, 0xc271 },
  206. /* EQ_DATA_HI=0x1ef8 */
  207. { CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W1, 0x1ef8 },
  208. /* +EQ_WRT, +EQ_ACC, EQ_ADR=3, EQ_DATA_LO=0x48 */
  209. { CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W2, 0xc348 },
  210. /* EQ_DATA_HI=0xc110 */
  211. { CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W1, 0xc110 },
  212. /* +EQ_WRT, +EQ_ACC, EQ_ADR=4, EQ_DATA_LO=0x5a */
  213. { CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W2, 0xc45a },
  214. /* EQ_DATA_HI=0x1f29 */
  215. { CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W1, 0x1f29 },
  216. /* +EQ_WRT, +EQ_ACC, EQ_ADR=5, EQ_DATA_LO=0x74 */
  217. { CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W2, 0xc574 },
  218. /* EQ_DATA_HI=0x1d7a */
  219. { CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W1, 0x1d7a },
  220. /* +EQ_WRT, +EQ_ACC, EQ_ADR=6, EQ_DATA_LO=0x53 */
  221. { CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W2, 0xc653 },
  222. /* EQ_DATA_HI=0xc38c */
  223. { CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W1, 0xc38c },
  224. /* +EQ_WRT, +EQ_ACC, EQ_ADR=7, EQ_DATA_LO=0x14 */
  225. { CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W2, 0xc714 },
  226. /* EQ_DATA_HI=0x1ca3 */
  227. { CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W1, 0x1ca3 },
  228. /* +EQ_WRT, +EQ_ACC, EQ_ADR=8, EQ_DATA_LO=0xc7 */
  229. { CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W2, 0xc8c7 },
  230. /* EQ_DATA_HI=0xc38c */
  231. { CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W1, 0xc38c },
  232. /* +EQ_WRT, +EQ_ACC, EQ_ADR=9, EQ_DATA_LO=0x14 */
  233. { CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W2, 0xc914 },
  234. /* -EQ_ACC, -EQ_WRT */
  235. { CS8409_PIN_VENDOR_WIDGET, CS8409_PFE_COEF_W2, 0x0000 },
  236. {} /* Terminator */
  237. };
  238. struct sub_codec cs8409_cs42l42_codec = {
  239. .addr = CS42L42_I2C_ADDR,
  240. .reset_gpio = CS8409_CS42L42_RESET,
  241. .irq_mask = CS8409_CS42L42_INT,
  242. .init_seq = cs42l42_init_reg_seq,
  243. .init_seq_num = ARRAY_SIZE(cs42l42_init_reg_seq),
  244. .hp_jack_in = 0,
  245. .mic_jack_in = 0,
  246. .paged = 1,
  247. .suspended = 1,
  248. .no_type_dect = 0,
  249. };
  250. /******************************************************************************
  251. * Dolphin Specific Arrays
  252. * CS8409/ 2 X CS42L42
  253. ******************************************************************************/
  254. const struct hda_verb dolphin_init_verbs[] = {
  255. { 0x01, AC_VERB_SET_GPIO_WAKE_MASK, DOLPHIN_WAKE }, /* WAKE from GPIO 0,4 */
  256. { CS8409_PIN_VENDOR_WIDGET, AC_VERB_SET_PROC_STATE, 0x0001 }, /* Enable VPW processing */
  257. { CS8409_PIN_VENDOR_WIDGET, AC_VERB_SET_COEF_INDEX, 0x0002 }, /* Configure GPIO 6,7 */
  258. { CS8409_PIN_VENDOR_WIDGET, AC_VERB_SET_PROC_COEF, 0x0080 }, /* I2C mode */
  259. { CS8409_PIN_VENDOR_WIDGET, AC_VERB_SET_COEF_INDEX, 0x005b }, /* Set I2C bus speed */
  260. { CS8409_PIN_VENDOR_WIDGET, AC_VERB_SET_PROC_COEF, 0x0200 }, /* 100kHz I2C_STO = 2 */
  261. {} /* terminator */
  262. };
  263. static const struct hda_pintbl dolphin_pincfgs[] = {
  264. { 0x24, 0x022210f0 }, /* ASP-1-TX-A */
  265. { 0x25, 0x010240f0 }, /* ASP-1-TX-B */
  266. { 0x34, 0x02a21050 }, /* ASP-1-RX */
  267. {} /* terminator */
  268. };
  269. /* Vendor specific HW configuration for CS42L42 */
  270. static const struct cs8409_i2c_param dolphin_c0_init_reg_seq[] = {
  271. { CS42L42_I2C_TIMEOUT, 0xB0 },
  272. { CS42L42_ADC_CTL, 0x00 },
  273. { 0x1D02, 0x06 },
  274. { CS42L42_ADC_VOLUME, 0x9F },
  275. { CS42L42_OSC_SWITCH, 0x01 },
  276. { CS42L42_MCLK_CTL, 0x02 },
  277. { CS42L42_SRC_CTL, 0x03 },
  278. { CS42L42_MCLK_SRC_SEL, 0x00 },
  279. { CS42L42_ASP_FRM_CFG, 0x13 },
  280. { CS42L42_FSYNC_P_LOWER, 0xFF },
  281. { CS42L42_FSYNC_P_UPPER, 0x00 },
  282. { CS42L42_ASP_CLK_CFG, 0x20 },
  283. { CS42L42_SPDIF_CLK_CFG, 0x0D },
  284. { CS42L42_ASP_RX_DAI0_CH1_AP_RES, 0x02 },
  285. { CS42L42_ASP_RX_DAI0_CH1_BIT_MSB, 0x00 },
  286. { CS42L42_ASP_RX_DAI0_CH1_BIT_LSB, 0x00 },
  287. { CS42L42_ASP_RX_DAI0_CH2_AP_RES, 0x02 },
  288. { CS42L42_ASP_RX_DAI0_CH2_BIT_MSB, 0x00 },
  289. { CS42L42_ASP_RX_DAI0_CH2_BIT_LSB, 0x20 },
  290. { CS42L42_ASP_RX_DAI0_EN, 0x0C },
  291. { CS42L42_ASP_TX_CH_EN, 0x01 },
  292. { CS42L42_ASP_TX_CH_AP_RES, 0x02 },
  293. { CS42L42_ASP_TX_CH1_BIT_MSB, 0x00 },
  294. { CS42L42_ASP_TX_CH1_BIT_LSB, 0x00 },
  295. { CS42L42_ASP_TX_SZ_EN, 0x01 },
  296. { CS42L42_PWR_CTL1, 0x0A },
  297. { CS42L42_PWR_CTL2, 0x84 },
  298. { CS42L42_HP_CTL, 0x03 },
  299. { CS42L42_MIXER_CHA_VOL, 0x3F },
  300. { CS42L42_MIXER_CHB_VOL, 0x3F },
  301. { CS42L42_MIXER_ADC_VOL, 0x3f },
  302. { CS42L42_MIC_DET_CTL1, 0xB6 },
  303. { CS42L42_TIPSENSE_CTL, 0xC2 },
  304. { CS42L42_HS_CLAMP_DISABLE, 0x01 },
  305. { CS42L42_HS_SWITCH_CTL, 0xF3 },
  306. { CS42L42_PWR_CTL3, 0x20 },
  307. { CS42L42_RSENSE_CTL2, 0x00 },
  308. { CS42L42_RSENSE_CTL3, 0x00 },
  309. { CS42L42_TSENSE_CTL, 0x80 },
  310. { CS42L42_HS_BIAS_CTL, 0xC0 },
  311. { CS42L42_PWR_CTL1, 0x02 },
  312. { CS42L42_ADC_OVFL_INT_MASK, 0xff },
  313. { CS42L42_MIXER_INT_MASK, 0xff },
  314. { CS42L42_SRC_INT_MASK, 0xff },
  315. { CS42L42_ASP_RX_INT_MASK, 0xff },
  316. { CS42L42_ASP_TX_INT_MASK, 0xff },
  317. { CS42L42_CODEC_INT_MASK, 0xff },
  318. { CS42L42_SRCPL_INT_MASK, 0xff },
  319. { CS42L42_VPMON_INT_MASK, 0xff },
  320. { CS42L42_PLL_LOCK_INT_MASK, 0xff },
  321. { CS42L42_TSRS_PLUG_INT_MASK, 0xff },
  322. { CS42L42_DET_INT1_MASK, 0xff },
  323. { CS42L42_DET_INT2_MASK, 0xff }
  324. };
  325. static const struct cs8409_i2c_param dolphin_c1_init_reg_seq[] = {
  326. { CS42L42_I2C_TIMEOUT, 0xB0 },
  327. { CS42L42_ADC_CTL, 0x00 },
  328. { 0x1D02, 0x06 },
  329. { CS42L42_ADC_VOLUME, 0x9F },
  330. { CS42L42_OSC_SWITCH, 0x01 },
  331. { CS42L42_MCLK_CTL, 0x02 },
  332. { CS42L42_SRC_CTL, 0x03 },
  333. { CS42L42_MCLK_SRC_SEL, 0x00 },
  334. { CS42L42_ASP_FRM_CFG, 0x13 },
  335. { CS42L42_FSYNC_P_LOWER, 0xFF },
  336. { CS42L42_FSYNC_P_UPPER, 0x00 },
  337. { CS42L42_ASP_CLK_CFG, 0x20 },
  338. { CS42L42_SPDIF_CLK_CFG, 0x0D },
  339. { CS42L42_ASP_RX_DAI0_CH1_AP_RES, 0x02 },
  340. { CS42L42_ASP_RX_DAI0_CH1_BIT_MSB, 0x00 },
  341. { CS42L42_ASP_RX_DAI0_CH1_BIT_LSB, 0x80 },
  342. { CS42L42_ASP_RX_DAI0_CH2_AP_RES, 0x02 },
  343. { CS42L42_ASP_RX_DAI0_CH2_BIT_MSB, 0x00 },
  344. { CS42L42_ASP_RX_DAI0_CH2_BIT_LSB, 0xA0 },
  345. { CS42L42_ASP_RX_DAI0_EN, 0x0C },
  346. { CS42L42_ASP_TX_CH_EN, 0x00 },
  347. { CS42L42_ASP_TX_CH_AP_RES, 0x02 },
  348. { CS42L42_ASP_TX_CH1_BIT_MSB, 0x00 },
  349. { CS42L42_ASP_TX_CH1_BIT_LSB, 0x00 },
  350. { CS42L42_ASP_TX_SZ_EN, 0x00 },
  351. { CS42L42_PWR_CTL1, 0x0E },
  352. { CS42L42_PWR_CTL2, 0x84 },
  353. { CS42L42_HP_CTL, 0x01 },
  354. { CS42L42_MIXER_CHA_VOL, 0x3F },
  355. { CS42L42_MIXER_CHB_VOL, 0x3F },
  356. { CS42L42_MIXER_ADC_VOL, 0x3f },
  357. { CS42L42_MIC_DET_CTL1, 0xB6 },
  358. { CS42L42_TIPSENSE_CTL, 0xC2 },
  359. { CS42L42_HS_CLAMP_DISABLE, 0x01 },
  360. { CS42L42_HS_SWITCH_CTL, 0xF3 },
  361. { CS42L42_PWR_CTL3, 0x20 },
  362. { CS42L42_RSENSE_CTL2, 0x00 },
  363. { CS42L42_RSENSE_CTL3, 0x00 },
  364. { CS42L42_TSENSE_CTL, 0x80 },
  365. { CS42L42_HS_BIAS_CTL, 0xC0 },
  366. { CS42L42_PWR_CTL1, 0x06 },
  367. { CS42L42_ADC_OVFL_INT_MASK, 0xff },
  368. { CS42L42_MIXER_INT_MASK, 0xff },
  369. { CS42L42_SRC_INT_MASK, 0xff },
  370. { CS42L42_ASP_RX_INT_MASK, 0xff },
  371. { CS42L42_ASP_TX_INT_MASK, 0xff },
  372. { CS42L42_CODEC_INT_MASK, 0xff },
  373. { CS42L42_SRCPL_INT_MASK, 0xff },
  374. { CS42L42_VPMON_INT_MASK, 0xff },
  375. { CS42L42_PLL_LOCK_INT_MASK, 0xff },
  376. { CS42L42_TSRS_PLUG_INT_MASK, 0xff },
  377. { CS42L42_DET_INT1_MASK, 0xff },
  378. { CS42L42_DET_INT2_MASK, 0xff }
  379. };
  380. /* Vendor specific hw configuration for CS8409 */
  381. const struct cs8409_cir_param dolphin_hw_cfg[] = {
  382. /* +PLL1/2_EN, +I2C_EN */
  383. { CS8409_PIN_VENDOR_WIDGET, CS8409_DEV_CFG1, 0xb008 },
  384. /* ASP1_EN=0, ASP1_STP=1 */
  385. { CS8409_PIN_VENDOR_WIDGET, CS8409_DEV_CFG2, 0x0002 },
  386. /* ASP1/2_BUS_IDLE=10, +GPIO_I2C */
  387. { CS8409_PIN_VENDOR_WIDGET, CS8409_DEV_CFG3, 0x0a80 },
  388. /* ASP1.A: TX.LAP=0, TX.LSZ=24 bits, TX.LCS=0 */
  389. { CS8409_PIN_VENDOR_WIDGET, ASP1_A_TX_CTRL1, 0x0800 },
  390. /* ASP1.A: TX.RAP=0, TX.RSZ=24 bits, TX.RCS=32 */
  391. { CS8409_PIN_VENDOR_WIDGET, ASP1_A_TX_CTRL2, 0x0820 },
  392. /* ASP1.B: TX.LAP=0, TX.LSZ=24 bits, TX.LCS=128 */
  393. { CS8409_PIN_VENDOR_WIDGET, ASP1_B_TX_CTRL1, 0x0880 },
  394. /* ASP1.B: TX.RAP=0, TX.RSZ=24 bits, TX.RCS=160 */
  395. { CS8409_PIN_VENDOR_WIDGET, ASP1_B_TX_CTRL2, 0x08a0 },
  396. /* ASP1.A: RX.LAP=0, RX.LSZ=24 bits, RX.LCS=0 */
  397. { CS8409_PIN_VENDOR_WIDGET, ASP1_A_RX_CTRL1, 0x0800 },
  398. /* ASP1.A: RX.RAP=0, RX.RSZ=24 bits, RX.RCS=0 */
  399. { CS8409_PIN_VENDOR_WIDGET, ASP1_A_RX_CTRL2, 0x0800 },
  400. /* ASP1: LCHI = 00h */
  401. { CS8409_PIN_VENDOR_WIDGET, CS8409_ASP1_CLK_CTRL1, 0x8000 },
  402. /* ASP1: MC/SC_SRCSEL=PLL1, LCPR=FFh */
  403. { CS8409_PIN_VENDOR_WIDGET, CS8409_ASP1_CLK_CTRL2, 0x28ff },
  404. /* ASP1: MCEN=0, FSD=011, SCPOL_IN/OUT=0, SCDIV=1:4 */
  405. { CS8409_PIN_VENDOR_WIDGET, CS8409_ASP1_CLK_CTRL3, 0x0062 },
  406. /* ASP1/2_BEEP=0 */
  407. { CS8409_PIN_VENDOR_WIDGET, CS8409_BEEP_CFG, 0x0000 },
  408. /* ASP1_EN=1, ASP1_STP=1 */
  409. { CS8409_PIN_VENDOR_WIDGET, CS8409_DEV_CFG2, 0x0022 },
  410. /* -PLL2_EN */
  411. { CS8409_PIN_VENDOR_WIDGET, CS8409_DEV_CFG1, 0x9008 },
  412. /* ASP1_xxx_EN=1, ASP1_MCLK_EN=0 */
  413. { CS8409_PIN_VENDOR_WIDGET, CS8409_PAD_CFG_SLW_RATE_CTRL, 0x5400 },
  414. /* test mode on */
  415. { CS8409_PIN_VENDOR_WIDGET, 0xc0, 0x9999 },
  416. /* GPIO hysteresis = 30 us */
  417. { CS8409_PIN_VENDOR_WIDGET, 0xc5, 0x0000 },
  418. /* test mode off */
  419. { CS8409_PIN_VENDOR_WIDGET, 0xc0, 0x0000 },
  420. {} /* Terminator */
  421. };
  422. struct sub_codec dolphin_cs42l42_0 = {
  423. .addr = DOLPHIN_C0_I2C_ADDR,
  424. .reset_gpio = DOLPHIN_C0_RESET,
  425. .irq_mask = DOLPHIN_C0_INT,
  426. .init_seq = dolphin_c0_init_reg_seq,
  427. .init_seq_num = ARRAY_SIZE(dolphin_c0_init_reg_seq),
  428. .hp_jack_in = 0,
  429. .mic_jack_in = 0,
  430. .paged = 1,
  431. .suspended = 1,
  432. .no_type_dect = 0,
  433. };
  434. struct sub_codec dolphin_cs42l42_1 = {
  435. .addr = DOLPHIN_C1_I2C_ADDR,
  436. .reset_gpio = DOLPHIN_C1_RESET,
  437. .irq_mask = DOLPHIN_C1_INT,
  438. .init_seq = dolphin_c1_init_reg_seq,
  439. .init_seq_num = ARRAY_SIZE(dolphin_c1_init_reg_seq),
  440. .hp_jack_in = 0,
  441. .mic_jack_in = 0,
  442. .paged = 1,
  443. .suspended = 1,
  444. .no_type_dect = 1,
  445. };
  446. /******************************************************************************
  447. * CS8409 Patch Driver Structs
  448. * Arrays Used for all projects using CS8409
  449. ******************************************************************************/
  450. const struct snd_pci_quirk cs8409_fixup_tbl[] = {
  451. SND_PCI_QUIRK(0x1028, 0x0A11, "Bullseye", CS8409_BULLSEYE),
  452. SND_PCI_QUIRK(0x1028, 0x0A12, "Bullseye", CS8409_BULLSEYE),
  453. SND_PCI_QUIRK(0x1028, 0x0A23, "Bullseye", CS8409_BULLSEYE),
  454. SND_PCI_QUIRK(0x1028, 0x0A24, "Bullseye", CS8409_BULLSEYE),
  455. SND_PCI_QUIRK(0x1028, 0x0A25, "Bullseye", CS8409_BULLSEYE),
  456. SND_PCI_QUIRK(0x1028, 0x0A29, "Bullseye", CS8409_BULLSEYE),
  457. SND_PCI_QUIRK(0x1028, 0x0A2A, "Bullseye", CS8409_BULLSEYE),
  458. SND_PCI_QUIRK(0x1028, 0x0A2B, "Bullseye", CS8409_BULLSEYE),
  459. SND_PCI_QUIRK(0x1028, 0x0A77, "Cyborg", CS8409_CYBORG),
  460. SND_PCI_QUIRK(0x1028, 0x0A78, "Cyborg", CS8409_CYBORG),
  461. SND_PCI_QUIRK(0x1028, 0x0A79, "Cyborg", CS8409_CYBORG),
  462. SND_PCI_QUIRK(0x1028, 0x0A7A, "Cyborg", CS8409_CYBORG),
  463. SND_PCI_QUIRK(0x1028, 0x0A7D, "Cyborg", CS8409_CYBORG),
  464. SND_PCI_QUIRK(0x1028, 0x0A7E, "Cyborg", CS8409_CYBORG),
  465. SND_PCI_QUIRK(0x1028, 0x0A7F, "Cyborg", CS8409_CYBORG),
  466. SND_PCI_QUIRK(0x1028, 0x0A80, "Cyborg", CS8409_CYBORG),
  467. SND_PCI_QUIRK(0x1028, 0x0AB0, "Warlock", CS8409_WARLOCK),
  468. SND_PCI_QUIRK(0x1028, 0x0AB2, "Warlock", CS8409_WARLOCK),
  469. SND_PCI_QUIRK(0x1028, 0x0AB1, "Warlock", CS8409_WARLOCK),
  470. SND_PCI_QUIRK(0x1028, 0x0AB3, "Warlock", CS8409_WARLOCK),
  471. SND_PCI_QUIRK(0x1028, 0x0AB4, "Warlock", CS8409_WARLOCK),
  472. SND_PCI_QUIRK(0x1028, 0x0AB5, "Warlock", CS8409_WARLOCK),
  473. SND_PCI_QUIRK(0x1028, 0x0ACF, "Dolphin", CS8409_DOLPHIN),
  474. SND_PCI_QUIRK(0x1028, 0x0AD0, "Dolphin", CS8409_DOLPHIN),
  475. SND_PCI_QUIRK(0x1028, 0x0AD1, "Dolphin", CS8409_DOLPHIN),
  476. SND_PCI_QUIRK(0x1028, 0x0AD2, "Dolphin", CS8409_DOLPHIN),
  477. SND_PCI_QUIRK(0x1028, 0x0AD3, "Dolphin", CS8409_DOLPHIN),
  478. SND_PCI_QUIRK(0x1028, 0x0AD9, "Warlock", CS8409_WARLOCK),
  479. SND_PCI_QUIRK(0x1028, 0x0ADA, "Warlock", CS8409_WARLOCK),
  480. SND_PCI_QUIRK(0x1028, 0x0ADB, "Warlock", CS8409_WARLOCK),
  481. SND_PCI_QUIRK(0x1028, 0x0ADC, "Warlock", CS8409_WARLOCK),
  482. SND_PCI_QUIRK(0x1028, 0x0ADF, "Cyborg", CS8409_CYBORG),
  483. SND_PCI_QUIRK(0x1028, 0x0AE0, "Cyborg", CS8409_CYBORG),
  484. SND_PCI_QUIRK(0x1028, 0x0AE1, "Cyborg", CS8409_CYBORG),
  485. SND_PCI_QUIRK(0x1028, 0x0AE2, "Cyborg", CS8409_CYBORG),
  486. SND_PCI_QUIRK(0x1028, 0x0AE9, "Cyborg", CS8409_CYBORG),
  487. SND_PCI_QUIRK(0x1028, 0x0AEA, "Cyborg", CS8409_CYBORG),
  488. SND_PCI_QUIRK(0x1028, 0x0AEB, "Cyborg", CS8409_CYBORG),
  489. SND_PCI_QUIRK(0x1028, 0x0AEC, "Cyborg", CS8409_CYBORG),
  490. SND_PCI_QUIRK(0x1028, 0x0AED, "Cyborg", CS8409_CYBORG),
  491. SND_PCI_QUIRK(0x1028, 0x0AEE, "Cyborg", CS8409_CYBORG),
  492. SND_PCI_QUIRK(0x1028, 0x0AEF, "Cyborg", CS8409_CYBORG),
  493. SND_PCI_QUIRK(0x1028, 0x0AF0, "Cyborg", CS8409_CYBORG),
  494. SND_PCI_QUIRK(0x1028, 0x0AF4, "Warlock", CS8409_WARLOCK),
  495. SND_PCI_QUIRK(0x1028, 0x0AF5, "Warlock", CS8409_WARLOCK),
  496. SND_PCI_QUIRK(0x1028, 0x0B92, "Warlock MLK", CS8409_WARLOCK_MLK),
  497. SND_PCI_QUIRK(0x1028, 0x0B93, "Warlock MLK Dual Mic", CS8409_WARLOCK_MLK_DUAL_MIC),
  498. SND_PCI_QUIRK(0x1028, 0x0B94, "Warlock MLK", CS8409_WARLOCK_MLK),
  499. SND_PCI_QUIRK(0x1028, 0x0B95, "Warlock MLK Dual Mic", CS8409_WARLOCK_MLK_DUAL_MIC),
  500. SND_PCI_QUIRK(0x1028, 0x0B96, "Warlock MLK", CS8409_WARLOCK_MLK),
  501. SND_PCI_QUIRK(0x1028, 0x0B97, "Warlock MLK Dual Mic", CS8409_WARLOCK_MLK_DUAL_MIC),
  502. SND_PCI_QUIRK(0x1028, 0x0BA5, "Odin", CS8409_ODIN),
  503. SND_PCI_QUIRK(0x1028, 0x0BA6, "Odin", CS8409_ODIN),
  504. SND_PCI_QUIRK(0x1028, 0x0BA8, "Odin", CS8409_ODIN),
  505. SND_PCI_QUIRK(0x1028, 0x0BAA, "Odin", CS8409_ODIN),
  506. SND_PCI_QUIRK(0x1028, 0x0BAE, "Odin", CS8409_ODIN),
  507. SND_PCI_QUIRK(0x1028, 0x0BB2, "Warlock MLK", CS8409_WARLOCK_MLK),
  508. SND_PCI_QUIRK(0x1028, 0x0BB3, "Warlock MLK", CS8409_WARLOCK_MLK),
  509. SND_PCI_QUIRK(0x1028, 0x0BB4, "Warlock MLK", CS8409_WARLOCK_MLK),
  510. SND_PCI_QUIRK(0x1028, 0x0BB5, "Warlock N3 15 TGL-U Nuvoton EC", CS8409_WARLOCK),
  511. SND_PCI_QUIRK(0x1028, 0x0BB6, "Warlock V3 15 TGL-U Nuvoton EC", CS8409_WARLOCK),
  512. SND_PCI_QUIRK(0x1028, 0x0BB8, "Warlock MLK", CS8409_WARLOCK_MLK),
  513. SND_PCI_QUIRK(0x1028, 0x0BB9, "Warlock MLK Dual Mic", CS8409_WARLOCK_MLK_DUAL_MIC),
  514. SND_PCI_QUIRK(0x1028, 0x0BBA, "Warlock MLK", CS8409_WARLOCK_MLK),
  515. SND_PCI_QUIRK(0x1028, 0x0BBB, "Warlock MLK Dual Mic", CS8409_WARLOCK_MLK_DUAL_MIC),
  516. SND_PCI_QUIRK(0x1028, 0x0BBC, "Warlock MLK", CS8409_WARLOCK_MLK),
  517. SND_PCI_QUIRK(0x1028, 0x0BBD, "Warlock MLK Dual Mic", CS8409_WARLOCK_MLK_DUAL_MIC),
  518. SND_PCI_QUIRK(0x1028, 0x0BD4, "Dolphin", CS8409_DOLPHIN),
  519. SND_PCI_QUIRK(0x1028, 0x0BD5, "Dolphin", CS8409_DOLPHIN),
  520. SND_PCI_QUIRK(0x1028, 0x0BD6, "Dolphin", CS8409_DOLPHIN),
  521. SND_PCI_QUIRK(0x1028, 0x0BD7, "Dolphin", CS8409_DOLPHIN),
  522. SND_PCI_QUIRK(0x1028, 0x0BD8, "Dolphin", CS8409_DOLPHIN),
  523. SND_PCI_QUIRK(0x1028, 0x0C43, "Dolphin", CS8409_DOLPHIN),
  524. SND_PCI_QUIRK(0x1028, 0x0C50, "Dolphin", CS8409_DOLPHIN),
  525. SND_PCI_QUIRK(0x1028, 0x0C51, "Dolphin", CS8409_DOLPHIN),
  526. SND_PCI_QUIRK(0x1028, 0x0C52, "Dolphin", CS8409_DOLPHIN),
  527. {} /* terminator */
  528. };
  529. /* Dell Inspiron models with cs8409/cs42l42 */
  530. const struct hda_model_fixup cs8409_models[] = {
  531. { .id = CS8409_BULLSEYE, .name = "bullseye" },
  532. { .id = CS8409_WARLOCK, .name = "warlock" },
  533. { .id = CS8409_WARLOCK_MLK, .name = "warlock mlk" },
  534. { .id = CS8409_WARLOCK_MLK_DUAL_MIC, .name = "warlock mlk dual mic" },
  535. { .id = CS8409_CYBORG, .name = "cyborg" },
  536. { .id = CS8409_DOLPHIN, .name = "dolphin" },
  537. { .id = CS8409_ODIN, .name = "odin" },
  538. {}
  539. };
  540. const struct hda_fixup cs8409_fixups[] = {
  541. [CS8409_BULLSEYE] = {
  542. .type = HDA_FIXUP_PINS,
  543. .v.pins = cs8409_cs42l42_pincfgs,
  544. .chained = true,
  545. .chain_id = CS8409_FIXUPS,
  546. },
  547. [CS8409_WARLOCK] = {
  548. .type = HDA_FIXUP_PINS,
  549. .v.pins = cs8409_cs42l42_pincfgs,
  550. .chained = true,
  551. .chain_id = CS8409_FIXUPS,
  552. },
  553. [CS8409_WARLOCK_MLK] = {
  554. .type = HDA_FIXUP_PINS,
  555. .v.pins = cs8409_cs42l42_pincfgs,
  556. .chained = true,
  557. .chain_id = CS8409_FIXUPS,
  558. },
  559. [CS8409_WARLOCK_MLK_DUAL_MIC] = {
  560. .type = HDA_FIXUP_PINS,
  561. .v.pins = cs8409_cs42l42_pincfgs,
  562. .chained = true,
  563. .chain_id = CS8409_FIXUPS,
  564. },
  565. [CS8409_CYBORG] = {
  566. .type = HDA_FIXUP_PINS,
  567. .v.pins = cs8409_cs42l42_pincfgs,
  568. .chained = true,
  569. .chain_id = CS8409_FIXUPS,
  570. },
  571. [CS8409_FIXUPS] = {
  572. .type = HDA_FIXUP_FUNC,
  573. .v.func = cs8409_cs42l42_fixups,
  574. },
  575. [CS8409_DOLPHIN] = {
  576. .type = HDA_FIXUP_PINS,
  577. .v.pins = dolphin_pincfgs,
  578. .chained = true,
  579. .chain_id = CS8409_DOLPHIN_FIXUPS,
  580. },
  581. [CS8409_DOLPHIN_FIXUPS] = {
  582. .type = HDA_FIXUP_FUNC,
  583. .v.func = dolphin_fixups,
  584. },
  585. [CS8409_ODIN] = {
  586. .type = HDA_FIXUP_PINS,
  587. .v.pins = cs8409_cs42l42_pincfgs_no_dmic,
  588. .chained = true,
  589. .chain_id = CS8409_FIXUPS,
  590. },
  591. };