oxygen_mixer.c 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098
  1. /*
  2. * C-Media CMI8788 driver - mixer code
  3. *
  4. * Copyright (c) Clemens Ladisch <clemens@ladisch.de>
  5. *
  6. *
  7. * This driver is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License, version 2.
  9. *
  10. * This driver is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this driver; if not, write to the Free Software
  17. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  18. */
  19. #include <linux/mutex.h>
  20. #include <sound/ac97_codec.h>
  21. #include <sound/asoundef.h>
  22. #include <sound/control.h>
  23. #include <sound/tlv.h>
  24. #include "oxygen.h"
  25. #include "cm9780.h"
  26. static int dac_volume_info(struct snd_kcontrol *ctl,
  27. struct snd_ctl_elem_info *info)
  28. {
  29. struct oxygen *chip = ctl->private_data;
  30. info->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
  31. info->count = chip->model.dac_channels_mixer;
  32. info->value.integer.min = chip->model.dac_volume_min;
  33. info->value.integer.max = chip->model.dac_volume_max;
  34. return 0;
  35. }
  36. static int dac_volume_get(struct snd_kcontrol *ctl,
  37. struct snd_ctl_elem_value *value)
  38. {
  39. struct oxygen *chip = ctl->private_data;
  40. unsigned int i;
  41. mutex_lock(&chip->mutex);
  42. for (i = 0; i < chip->model.dac_channels_mixer; ++i)
  43. value->value.integer.value[i] = chip->dac_volume[i];
  44. mutex_unlock(&chip->mutex);
  45. return 0;
  46. }
  47. static int dac_volume_put(struct snd_kcontrol *ctl,
  48. struct snd_ctl_elem_value *value)
  49. {
  50. struct oxygen *chip = ctl->private_data;
  51. unsigned int i;
  52. int changed;
  53. changed = 0;
  54. mutex_lock(&chip->mutex);
  55. for (i = 0; i < chip->model.dac_channels_mixer; ++i)
  56. if (value->value.integer.value[i] != chip->dac_volume[i]) {
  57. chip->dac_volume[i] = value->value.integer.value[i];
  58. changed = 1;
  59. }
  60. if (changed)
  61. chip->model.update_dac_volume(chip);
  62. mutex_unlock(&chip->mutex);
  63. return changed;
  64. }
  65. static int dac_mute_get(struct snd_kcontrol *ctl,
  66. struct snd_ctl_elem_value *value)
  67. {
  68. struct oxygen *chip = ctl->private_data;
  69. mutex_lock(&chip->mutex);
  70. value->value.integer.value[0] = !chip->dac_mute;
  71. mutex_unlock(&chip->mutex);
  72. return 0;
  73. }
  74. static int dac_mute_put(struct snd_kcontrol *ctl,
  75. struct snd_ctl_elem_value *value)
  76. {
  77. struct oxygen *chip = ctl->private_data;
  78. int changed;
  79. mutex_lock(&chip->mutex);
  80. changed = !value->value.integer.value[0] != chip->dac_mute;
  81. if (changed) {
  82. chip->dac_mute = !value->value.integer.value[0];
  83. chip->model.update_dac_mute(chip);
  84. }
  85. mutex_unlock(&chip->mutex);
  86. return changed;
  87. }
  88. static unsigned int upmix_item_count(struct oxygen *chip)
  89. {
  90. if (chip->model.dac_channels_pcm < 8)
  91. return 2;
  92. else if (chip->model.update_center_lfe_mix)
  93. return 5;
  94. else
  95. return 3;
  96. }
  97. static int upmix_info(struct snd_kcontrol *ctl, struct snd_ctl_elem_info *info)
  98. {
  99. static const char *const names[5] = {
  100. "Front",
  101. "Front+Surround",
  102. "Front+Surround+Back",
  103. "Front+Surround+Center/LFE",
  104. "Front+Surround+Center/LFE+Back",
  105. };
  106. struct oxygen *chip = ctl->private_data;
  107. unsigned int count = upmix_item_count(chip);
  108. info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
  109. info->count = 1;
  110. info->value.enumerated.items = count;
  111. if (info->value.enumerated.item >= count)
  112. info->value.enumerated.item = count - 1;
  113. strcpy(info->value.enumerated.name, names[info->value.enumerated.item]);
  114. return 0;
  115. }
  116. static int upmix_get(struct snd_kcontrol *ctl, struct snd_ctl_elem_value *value)
  117. {
  118. struct oxygen *chip = ctl->private_data;
  119. mutex_lock(&chip->mutex);
  120. value->value.enumerated.item[0] = chip->dac_routing;
  121. mutex_unlock(&chip->mutex);
  122. return 0;
  123. }
  124. void oxygen_update_dac_routing(struct oxygen *chip)
  125. {
  126. /* DAC 0: front, DAC 1: surround, DAC 2: center/LFE, DAC 3: back */
  127. static const unsigned int reg_values[5] = {
  128. /* stereo -> front */
  129. (0 << OXYGEN_PLAY_DAC0_SOURCE_SHIFT) |
  130. (1 << OXYGEN_PLAY_DAC1_SOURCE_SHIFT) |
  131. (2 << OXYGEN_PLAY_DAC2_SOURCE_SHIFT) |
  132. (3 << OXYGEN_PLAY_DAC3_SOURCE_SHIFT),
  133. /* stereo -> front+surround */
  134. (0 << OXYGEN_PLAY_DAC0_SOURCE_SHIFT) |
  135. (0 << OXYGEN_PLAY_DAC1_SOURCE_SHIFT) |
  136. (2 << OXYGEN_PLAY_DAC2_SOURCE_SHIFT) |
  137. (3 << OXYGEN_PLAY_DAC3_SOURCE_SHIFT),
  138. /* stereo -> front+surround+back */
  139. (0 << OXYGEN_PLAY_DAC0_SOURCE_SHIFT) |
  140. (0 << OXYGEN_PLAY_DAC1_SOURCE_SHIFT) |
  141. (2 << OXYGEN_PLAY_DAC2_SOURCE_SHIFT) |
  142. (0 << OXYGEN_PLAY_DAC3_SOURCE_SHIFT),
  143. /* stereo -> front+surround+center/LFE */
  144. (0 << OXYGEN_PLAY_DAC0_SOURCE_SHIFT) |
  145. (0 << OXYGEN_PLAY_DAC1_SOURCE_SHIFT) |
  146. (0 << OXYGEN_PLAY_DAC2_SOURCE_SHIFT) |
  147. (3 << OXYGEN_PLAY_DAC3_SOURCE_SHIFT),
  148. /* stereo -> front+surround+center/LFE+back */
  149. (0 << OXYGEN_PLAY_DAC0_SOURCE_SHIFT) |
  150. (0 << OXYGEN_PLAY_DAC1_SOURCE_SHIFT) |
  151. (0 << OXYGEN_PLAY_DAC2_SOURCE_SHIFT) |
  152. (0 << OXYGEN_PLAY_DAC3_SOURCE_SHIFT),
  153. };
  154. u8 channels;
  155. unsigned int reg_value;
  156. channels = oxygen_read8(chip, OXYGEN_PLAY_CHANNELS) &
  157. OXYGEN_PLAY_CHANNELS_MASK;
  158. if (channels == OXYGEN_PLAY_CHANNELS_2)
  159. reg_value = reg_values[chip->dac_routing];
  160. else if (channels == OXYGEN_PLAY_CHANNELS_8)
  161. /* in 7.1 mode, "rear" channels go to the "back" jack */
  162. reg_value = (0 << OXYGEN_PLAY_DAC0_SOURCE_SHIFT) |
  163. (3 << OXYGEN_PLAY_DAC1_SOURCE_SHIFT) |
  164. (2 << OXYGEN_PLAY_DAC2_SOURCE_SHIFT) |
  165. (1 << OXYGEN_PLAY_DAC3_SOURCE_SHIFT);
  166. else
  167. reg_value = (0 << OXYGEN_PLAY_DAC0_SOURCE_SHIFT) |
  168. (1 << OXYGEN_PLAY_DAC1_SOURCE_SHIFT) |
  169. (2 << OXYGEN_PLAY_DAC2_SOURCE_SHIFT) |
  170. (3 << OXYGEN_PLAY_DAC3_SOURCE_SHIFT);
  171. oxygen_write16_masked(chip, OXYGEN_PLAY_ROUTING, reg_value,
  172. OXYGEN_PLAY_DAC0_SOURCE_MASK |
  173. OXYGEN_PLAY_DAC1_SOURCE_MASK |
  174. OXYGEN_PLAY_DAC2_SOURCE_MASK |
  175. OXYGEN_PLAY_DAC3_SOURCE_MASK);
  176. if (chip->model.update_center_lfe_mix)
  177. chip->model.update_center_lfe_mix(chip, chip->dac_routing > 2);
  178. }
  179. static int upmix_put(struct snd_kcontrol *ctl, struct snd_ctl_elem_value *value)
  180. {
  181. struct oxygen *chip = ctl->private_data;
  182. unsigned int count = upmix_item_count(chip);
  183. int changed;
  184. if (value->value.enumerated.item[0] >= count)
  185. return -EINVAL;
  186. mutex_lock(&chip->mutex);
  187. changed = value->value.enumerated.item[0] != chip->dac_routing;
  188. if (changed) {
  189. chip->dac_routing = value->value.enumerated.item[0];
  190. oxygen_update_dac_routing(chip);
  191. }
  192. mutex_unlock(&chip->mutex);
  193. return changed;
  194. }
  195. static int spdif_switch_get(struct snd_kcontrol *ctl,
  196. struct snd_ctl_elem_value *value)
  197. {
  198. struct oxygen *chip = ctl->private_data;
  199. mutex_lock(&chip->mutex);
  200. value->value.integer.value[0] = chip->spdif_playback_enable;
  201. mutex_unlock(&chip->mutex);
  202. return 0;
  203. }
  204. static unsigned int oxygen_spdif_rate(unsigned int oxygen_rate)
  205. {
  206. switch (oxygen_rate) {
  207. case OXYGEN_RATE_32000:
  208. return IEC958_AES3_CON_FS_32000 << OXYGEN_SPDIF_CS_RATE_SHIFT;
  209. case OXYGEN_RATE_44100:
  210. return IEC958_AES3_CON_FS_44100 << OXYGEN_SPDIF_CS_RATE_SHIFT;
  211. default: /* OXYGEN_RATE_48000 */
  212. return IEC958_AES3_CON_FS_48000 << OXYGEN_SPDIF_CS_RATE_SHIFT;
  213. case OXYGEN_RATE_64000:
  214. return 0xb << OXYGEN_SPDIF_CS_RATE_SHIFT;
  215. case OXYGEN_RATE_88200:
  216. return IEC958_AES3_CON_FS_88200 << OXYGEN_SPDIF_CS_RATE_SHIFT;
  217. case OXYGEN_RATE_96000:
  218. return IEC958_AES3_CON_FS_96000 << OXYGEN_SPDIF_CS_RATE_SHIFT;
  219. case OXYGEN_RATE_176400:
  220. return IEC958_AES3_CON_FS_176400 << OXYGEN_SPDIF_CS_RATE_SHIFT;
  221. case OXYGEN_RATE_192000:
  222. return IEC958_AES3_CON_FS_192000 << OXYGEN_SPDIF_CS_RATE_SHIFT;
  223. }
  224. }
  225. void oxygen_update_spdif_source(struct oxygen *chip)
  226. {
  227. u32 old_control, new_control;
  228. u16 old_routing, new_routing;
  229. unsigned int oxygen_rate;
  230. old_control = oxygen_read32(chip, OXYGEN_SPDIF_CONTROL);
  231. old_routing = oxygen_read16(chip, OXYGEN_PLAY_ROUTING);
  232. if (chip->pcm_active & (1 << PCM_SPDIF)) {
  233. new_control = old_control | OXYGEN_SPDIF_OUT_ENABLE;
  234. new_routing = (old_routing & ~OXYGEN_PLAY_SPDIF_MASK)
  235. | OXYGEN_PLAY_SPDIF_SPDIF;
  236. oxygen_rate = (old_control >> OXYGEN_SPDIF_OUT_RATE_SHIFT)
  237. & OXYGEN_I2S_RATE_MASK;
  238. /* S/PDIF rate was already set by the caller */
  239. } else if ((chip->pcm_active & (1 << PCM_MULTICH)) &&
  240. chip->spdif_playback_enable) {
  241. new_routing = (old_routing & ~OXYGEN_PLAY_SPDIF_MASK)
  242. | OXYGEN_PLAY_SPDIF_MULTICH_01;
  243. oxygen_rate = oxygen_read16(chip, OXYGEN_I2S_MULTICH_FORMAT)
  244. & OXYGEN_I2S_RATE_MASK;
  245. new_control = (old_control & ~OXYGEN_SPDIF_OUT_RATE_MASK) |
  246. (oxygen_rate << OXYGEN_SPDIF_OUT_RATE_SHIFT) |
  247. OXYGEN_SPDIF_OUT_ENABLE;
  248. } else {
  249. new_control = old_control & ~OXYGEN_SPDIF_OUT_ENABLE;
  250. new_routing = old_routing;
  251. oxygen_rate = OXYGEN_RATE_44100;
  252. }
  253. if (old_routing != new_routing) {
  254. oxygen_write32(chip, OXYGEN_SPDIF_CONTROL,
  255. new_control & ~OXYGEN_SPDIF_OUT_ENABLE);
  256. oxygen_write16(chip, OXYGEN_PLAY_ROUTING, new_routing);
  257. }
  258. if (new_control & OXYGEN_SPDIF_OUT_ENABLE)
  259. oxygen_write32(chip, OXYGEN_SPDIF_OUTPUT_BITS,
  260. oxygen_spdif_rate(oxygen_rate) |
  261. ((chip->pcm_active & (1 << PCM_SPDIF)) ?
  262. chip->spdif_pcm_bits : chip->spdif_bits));
  263. oxygen_write32(chip, OXYGEN_SPDIF_CONTROL, new_control);
  264. }
  265. static int spdif_switch_put(struct snd_kcontrol *ctl,
  266. struct snd_ctl_elem_value *value)
  267. {
  268. struct oxygen *chip = ctl->private_data;
  269. int changed;
  270. mutex_lock(&chip->mutex);
  271. changed = value->value.integer.value[0] != chip->spdif_playback_enable;
  272. if (changed) {
  273. chip->spdif_playback_enable = !!value->value.integer.value[0];
  274. spin_lock_irq(&chip->reg_lock);
  275. oxygen_update_spdif_source(chip);
  276. spin_unlock_irq(&chip->reg_lock);
  277. }
  278. mutex_unlock(&chip->mutex);
  279. return changed;
  280. }
  281. static int spdif_info(struct snd_kcontrol *ctl, struct snd_ctl_elem_info *info)
  282. {
  283. info->type = SNDRV_CTL_ELEM_TYPE_IEC958;
  284. info->count = 1;
  285. return 0;
  286. }
  287. static void oxygen_to_iec958(u32 bits, struct snd_ctl_elem_value *value)
  288. {
  289. value->value.iec958.status[0] =
  290. bits & (OXYGEN_SPDIF_NONAUDIO | OXYGEN_SPDIF_C |
  291. OXYGEN_SPDIF_PREEMPHASIS);
  292. value->value.iec958.status[1] = /* category and original */
  293. bits >> OXYGEN_SPDIF_CATEGORY_SHIFT;
  294. }
  295. static u32 iec958_to_oxygen(struct snd_ctl_elem_value *value)
  296. {
  297. u32 bits;
  298. bits = value->value.iec958.status[0] &
  299. (OXYGEN_SPDIF_NONAUDIO | OXYGEN_SPDIF_C |
  300. OXYGEN_SPDIF_PREEMPHASIS);
  301. bits |= value->value.iec958.status[1] << OXYGEN_SPDIF_CATEGORY_SHIFT;
  302. if (bits & OXYGEN_SPDIF_NONAUDIO)
  303. bits |= OXYGEN_SPDIF_V;
  304. return bits;
  305. }
  306. static inline void write_spdif_bits(struct oxygen *chip, u32 bits)
  307. {
  308. oxygen_write32_masked(chip, OXYGEN_SPDIF_OUTPUT_BITS, bits,
  309. OXYGEN_SPDIF_NONAUDIO |
  310. OXYGEN_SPDIF_C |
  311. OXYGEN_SPDIF_PREEMPHASIS |
  312. OXYGEN_SPDIF_CATEGORY_MASK |
  313. OXYGEN_SPDIF_ORIGINAL |
  314. OXYGEN_SPDIF_V);
  315. }
  316. static int spdif_default_get(struct snd_kcontrol *ctl,
  317. struct snd_ctl_elem_value *value)
  318. {
  319. struct oxygen *chip = ctl->private_data;
  320. mutex_lock(&chip->mutex);
  321. oxygen_to_iec958(chip->spdif_bits, value);
  322. mutex_unlock(&chip->mutex);
  323. return 0;
  324. }
  325. static int spdif_default_put(struct snd_kcontrol *ctl,
  326. struct snd_ctl_elem_value *value)
  327. {
  328. struct oxygen *chip = ctl->private_data;
  329. u32 new_bits;
  330. int changed;
  331. new_bits = iec958_to_oxygen(value);
  332. mutex_lock(&chip->mutex);
  333. changed = new_bits != chip->spdif_bits;
  334. if (changed) {
  335. chip->spdif_bits = new_bits;
  336. if (!(chip->pcm_active & (1 << PCM_SPDIF)))
  337. write_spdif_bits(chip, new_bits);
  338. }
  339. mutex_unlock(&chip->mutex);
  340. return changed;
  341. }
  342. static int spdif_mask_get(struct snd_kcontrol *ctl,
  343. struct snd_ctl_elem_value *value)
  344. {
  345. value->value.iec958.status[0] = IEC958_AES0_NONAUDIO |
  346. IEC958_AES0_CON_NOT_COPYRIGHT | IEC958_AES0_CON_EMPHASIS;
  347. value->value.iec958.status[1] =
  348. IEC958_AES1_CON_CATEGORY | IEC958_AES1_CON_ORIGINAL;
  349. return 0;
  350. }
  351. static int spdif_pcm_get(struct snd_kcontrol *ctl,
  352. struct snd_ctl_elem_value *value)
  353. {
  354. struct oxygen *chip = ctl->private_data;
  355. mutex_lock(&chip->mutex);
  356. oxygen_to_iec958(chip->spdif_pcm_bits, value);
  357. mutex_unlock(&chip->mutex);
  358. return 0;
  359. }
  360. static int spdif_pcm_put(struct snd_kcontrol *ctl,
  361. struct snd_ctl_elem_value *value)
  362. {
  363. struct oxygen *chip = ctl->private_data;
  364. u32 new_bits;
  365. int changed;
  366. new_bits = iec958_to_oxygen(value);
  367. mutex_lock(&chip->mutex);
  368. changed = new_bits != chip->spdif_pcm_bits;
  369. if (changed) {
  370. chip->spdif_pcm_bits = new_bits;
  371. if (chip->pcm_active & (1 << PCM_SPDIF))
  372. write_spdif_bits(chip, new_bits);
  373. }
  374. mutex_unlock(&chip->mutex);
  375. return changed;
  376. }
  377. static int spdif_input_mask_get(struct snd_kcontrol *ctl,
  378. struct snd_ctl_elem_value *value)
  379. {
  380. value->value.iec958.status[0] = 0xff;
  381. value->value.iec958.status[1] = 0xff;
  382. value->value.iec958.status[2] = 0xff;
  383. value->value.iec958.status[3] = 0xff;
  384. return 0;
  385. }
  386. static int spdif_input_default_get(struct snd_kcontrol *ctl,
  387. struct snd_ctl_elem_value *value)
  388. {
  389. struct oxygen *chip = ctl->private_data;
  390. u32 bits;
  391. bits = oxygen_read32(chip, OXYGEN_SPDIF_INPUT_BITS);
  392. value->value.iec958.status[0] = bits;
  393. value->value.iec958.status[1] = bits >> 8;
  394. value->value.iec958.status[2] = bits >> 16;
  395. value->value.iec958.status[3] = bits >> 24;
  396. return 0;
  397. }
  398. static int spdif_loopback_get(struct snd_kcontrol *ctl,
  399. struct snd_ctl_elem_value *value)
  400. {
  401. struct oxygen *chip = ctl->private_data;
  402. value->value.integer.value[0] =
  403. !!(oxygen_read32(chip, OXYGEN_SPDIF_CONTROL)
  404. & OXYGEN_SPDIF_LOOPBACK);
  405. return 0;
  406. }
  407. static int spdif_loopback_put(struct snd_kcontrol *ctl,
  408. struct snd_ctl_elem_value *value)
  409. {
  410. struct oxygen *chip = ctl->private_data;
  411. u32 oldreg, newreg;
  412. int changed;
  413. spin_lock_irq(&chip->reg_lock);
  414. oldreg = oxygen_read32(chip, OXYGEN_SPDIF_CONTROL);
  415. if (value->value.integer.value[0])
  416. newreg = oldreg | OXYGEN_SPDIF_LOOPBACK;
  417. else
  418. newreg = oldreg & ~OXYGEN_SPDIF_LOOPBACK;
  419. changed = newreg != oldreg;
  420. if (changed)
  421. oxygen_write32(chip, OXYGEN_SPDIF_CONTROL, newreg);
  422. spin_unlock_irq(&chip->reg_lock);
  423. return changed;
  424. }
  425. static int monitor_volume_info(struct snd_kcontrol *ctl,
  426. struct snd_ctl_elem_info *info)
  427. {
  428. info->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
  429. info->count = 1;
  430. info->value.integer.min = 0;
  431. info->value.integer.max = 1;
  432. return 0;
  433. }
  434. static int monitor_get(struct snd_kcontrol *ctl,
  435. struct snd_ctl_elem_value *value)
  436. {
  437. struct oxygen *chip = ctl->private_data;
  438. u8 bit = ctl->private_value;
  439. int invert = ctl->private_value & (1 << 8);
  440. value->value.integer.value[0] =
  441. !!invert ^ !!(oxygen_read8(chip, OXYGEN_ADC_MONITOR) & bit);
  442. return 0;
  443. }
  444. static int monitor_put(struct snd_kcontrol *ctl,
  445. struct snd_ctl_elem_value *value)
  446. {
  447. struct oxygen *chip = ctl->private_data;
  448. u8 bit = ctl->private_value;
  449. int invert = ctl->private_value & (1 << 8);
  450. u8 oldreg, newreg;
  451. int changed;
  452. spin_lock_irq(&chip->reg_lock);
  453. oldreg = oxygen_read8(chip, OXYGEN_ADC_MONITOR);
  454. if ((!!value->value.integer.value[0] ^ !!invert) != 0)
  455. newreg = oldreg | bit;
  456. else
  457. newreg = oldreg & ~bit;
  458. changed = newreg != oldreg;
  459. if (changed)
  460. oxygen_write8(chip, OXYGEN_ADC_MONITOR, newreg);
  461. spin_unlock_irq(&chip->reg_lock);
  462. return changed;
  463. }
  464. static int ac97_switch_get(struct snd_kcontrol *ctl,
  465. struct snd_ctl_elem_value *value)
  466. {
  467. struct oxygen *chip = ctl->private_data;
  468. unsigned int codec = (ctl->private_value >> 24) & 1;
  469. unsigned int index = ctl->private_value & 0xff;
  470. unsigned int bitnr = (ctl->private_value >> 8) & 0xff;
  471. int invert = ctl->private_value & (1 << 16);
  472. u16 reg;
  473. mutex_lock(&chip->mutex);
  474. reg = oxygen_read_ac97(chip, codec, index);
  475. mutex_unlock(&chip->mutex);
  476. if (!(reg & (1 << bitnr)) ^ !invert)
  477. value->value.integer.value[0] = 1;
  478. else
  479. value->value.integer.value[0] = 0;
  480. return 0;
  481. }
  482. static void mute_ac97_ctl(struct oxygen *chip, unsigned int control)
  483. {
  484. unsigned int priv_idx;
  485. u16 value;
  486. if (!chip->controls[control])
  487. return;
  488. priv_idx = chip->controls[control]->private_value & 0xff;
  489. value = oxygen_read_ac97(chip, 0, priv_idx);
  490. if (!(value & 0x8000)) {
  491. oxygen_write_ac97(chip, 0, priv_idx, value | 0x8000);
  492. if (chip->model.ac97_switch)
  493. chip->model.ac97_switch(chip, priv_idx, 0x8000);
  494. snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
  495. &chip->controls[control]->id);
  496. }
  497. }
  498. static int ac97_switch_put(struct snd_kcontrol *ctl,
  499. struct snd_ctl_elem_value *value)
  500. {
  501. struct oxygen *chip = ctl->private_data;
  502. unsigned int codec = (ctl->private_value >> 24) & 1;
  503. unsigned int index = ctl->private_value & 0xff;
  504. unsigned int bitnr = (ctl->private_value >> 8) & 0xff;
  505. int invert = ctl->private_value & (1 << 16);
  506. u16 oldreg, newreg;
  507. int change;
  508. mutex_lock(&chip->mutex);
  509. oldreg = oxygen_read_ac97(chip, codec, index);
  510. newreg = oldreg;
  511. if (!value->value.integer.value[0] ^ !invert)
  512. newreg |= 1 << bitnr;
  513. else
  514. newreg &= ~(1 << bitnr);
  515. change = newreg != oldreg;
  516. if (change) {
  517. oxygen_write_ac97(chip, codec, index, newreg);
  518. if (codec == 0 && chip->model.ac97_switch)
  519. chip->model.ac97_switch(chip, index, newreg & 0x8000);
  520. if (index == AC97_LINE) {
  521. oxygen_write_ac97_masked(chip, 0, CM9780_GPIO_STATUS,
  522. newreg & 0x8000 ?
  523. CM9780_GPO0 : 0, CM9780_GPO0);
  524. if (!(newreg & 0x8000)) {
  525. mute_ac97_ctl(chip, CONTROL_MIC_CAPTURE_SWITCH);
  526. mute_ac97_ctl(chip, CONTROL_CD_CAPTURE_SWITCH);
  527. mute_ac97_ctl(chip, CONTROL_AUX_CAPTURE_SWITCH);
  528. }
  529. } else if ((index == AC97_MIC || index == AC97_CD ||
  530. index == AC97_VIDEO || index == AC97_AUX) &&
  531. bitnr == 15 && !(newreg & 0x8000)) {
  532. mute_ac97_ctl(chip, CONTROL_LINE_CAPTURE_SWITCH);
  533. oxygen_write_ac97_masked(chip, 0, CM9780_GPIO_STATUS,
  534. CM9780_GPO0, CM9780_GPO0);
  535. }
  536. }
  537. mutex_unlock(&chip->mutex);
  538. return change;
  539. }
  540. static int ac97_volume_info(struct snd_kcontrol *ctl,
  541. struct snd_ctl_elem_info *info)
  542. {
  543. int stereo = (ctl->private_value >> 16) & 1;
  544. info->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
  545. info->count = stereo ? 2 : 1;
  546. info->value.integer.min = 0;
  547. info->value.integer.max = 0x1f;
  548. return 0;
  549. }
  550. static int ac97_volume_get(struct snd_kcontrol *ctl,
  551. struct snd_ctl_elem_value *value)
  552. {
  553. struct oxygen *chip = ctl->private_data;
  554. unsigned int codec = (ctl->private_value >> 24) & 1;
  555. int stereo = (ctl->private_value >> 16) & 1;
  556. unsigned int index = ctl->private_value & 0xff;
  557. u16 reg;
  558. mutex_lock(&chip->mutex);
  559. reg = oxygen_read_ac97(chip, codec, index);
  560. mutex_unlock(&chip->mutex);
  561. value->value.integer.value[0] = 31 - (reg & 0x1f);
  562. if (stereo)
  563. value->value.integer.value[1] = 31 - ((reg >> 8) & 0x1f);
  564. return 0;
  565. }
  566. static int ac97_volume_put(struct snd_kcontrol *ctl,
  567. struct snd_ctl_elem_value *value)
  568. {
  569. struct oxygen *chip = ctl->private_data;
  570. unsigned int codec = (ctl->private_value >> 24) & 1;
  571. int stereo = (ctl->private_value >> 16) & 1;
  572. unsigned int index = ctl->private_value & 0xff;
  573. u16 oldreg, newreg;
  574. int change;
  575. mutex_lock(&chip->mutex);
  576. oldreg = oxygen_read_ac97(chip, codec, index);
  577. newreg = oldreg;
  578. newreg = (newreg & ~0x1f) |
  579. (31 - (value->value.integer.value[0] & 0x1f));
  580. if (stereo)
  581. newreg = (newreg & ~0x1f00) |
  582. ((31 - (value->value.integer.value[1] & 0x1f)) << 8);
  583. else
  584. newreg = (newreg & ~0x1f00) | ((newreg & 0x1f) << 8);
  585. change = newreg != oldreg;
  586. if (change)
  587. oxygen_write_ac97(chip, codec, index, newreg);
  588. mutex_unlock(&chip->mutex);
  589. return change;
  590. }
  591. static int mic_fmic_source_info(struct snd_kcontrol *ctl,
  592. struct snd_ctl_elem_info *info)
  593. {
  594. static const char *const names[] = { "Mic Jack", "Front Panel" };
  595. info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
  596. info->count = 1;
  597. info->value.enumerated.items = 2;
  598. info->value.enumerated.item &= 1;
  599. strcpy(info->value.enumerated.name, names[info->value.enumerated.item]);
  600. return 0;
  601. }
  602. static int mic_fmic_source_get(struct snd_kcontrol *ctl,
  603. struct snd_ctl_elem_value *value)
  604. {
  605. struct oxygen *chip = ctl->private_data;
  606. mutex_lock(&chip->mutex);
  607. value->value.enumerated.item[0] =
  608. !!(oxygen_read_ac97(chip, 0, CM9780_JACK) & CM9780_FMIC2MIC);
  609. mutex_unlock(&chip->mutex);
  610. return 0;
  611. }
  612. static int mic_fmic_source_put(struct snd_kcontrol *ctl,
  613. struct snd_ctl_elem_value *value)
  614. {
  615. struct oxygen *chip = ctl->private_data;
  616. u16 oldreg, newreg;
  617. int change;
  618. mutex_lock(&chip->mutex);
  619. oldreg = oxygen_read_ac97(chip, 0, CM9780_JACK);
  620. if (value->value.enumerated.item[0])
  621. newreg = oldreg | CM9780_FMIC2MIC;
  622. else
  623. newreg = oldreg & ~CM9780_FMIC2MIC;
  624. change = newreg != oldreg;
  625. if (change)
  626. oxygen_write_ac97(chip, 0, CM9780_JACK, newreg);
  627. mutex_unlock(&chip->mutex);
  628. return change;
  629. }
  630. static int ac97_fp_rec_volume_info(struct snd_kcontrol *ctl,
  631. struct snd_ctl_elem_info *info)
  632. {
  633. info->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
  634. info->count = 2;
  635. info->value.integer.min = 0;
  636. info->value.integer.max = 7;
  637. return 0;
  638. }
  639. static int ac97_fp_rec_volume_get(struct snd_kcontrol *ctl,
  640. struct snd_ctl_elem_value *value)
  641. {
  642. struct oxygen *chip = ctl->private_data;
  643. u16 reg;
  644. mutex_lock(&chip->mutex);
  645. reg = oxygen_read_ac97(chip, 1, AC97_REC_GAIN);
  646. mutex_unlock(&chip->mutex);
  647. value->value.integer.value[0] = reg & 7;
  648. value->value.integer.value[1] = (reg >> 8) & 7;
  649. return 0;
  650. }
  651. static int ac97_fp_rec_volume_put(struct snd_kcontrol *ctl,
  652. struct snd_ctl_elem_value *value)
  653. {
  654. struct oxygen *chip = ctl->private_data;
  655. u16 oldreg, newreg;
  656. int change;
  657. mutex_lock(&chip->mutex);
  658. oldreg = oxygen_read_ac97(chip, 1, AC97_REC_GAIN);
  659. newreg = oldreg & ~0x0707;
  660. newreg = newreg | (value->value.integer.value[0] & 7);
  661. newreg = newreg | ((value->value.integer.value[0] & 7) << 8);
  662. change = newreg != oldreg;
  663. if (change)
  664. oxygen_write_ac97(chip, 1, AC97_REC_GAIN, newreg);
  665. mutex_unlock(&chip->mutex);
  666. return change;
  667. }
  668. #define AC97_SWITCH(xname, codec, index, bitnr, invert) { \
  669. .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
  670. .name = xname, \
  671. .info = snd_ctl_boolean_mono_info, \
  672. .get = ac97_switch_get, \
  673. .put = ac97_switch_put, \
  674. .private_value = ((codec) << 24) | ((invert) << 16) | \
  675. ((bitnr) << 8) | (index), \
  676. }
  677. #define AC97_VOLUME(xname, codec, index, stereo) { \
  678. .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
  679. .name = xname, \
  680. .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \
  681. SNDRV_CTL_ELEM_ACCESS_TLV_READ, \
  682. .info = ac97_volume_info, \
  683. .get = ac97_volume_get, \
  684. .put = ac97_volume_put, \
  685. .tlv = { .p = ac97_db_scale, }, \
  686. .private_value = ((codec) << 24) | ((stereo) << 16) | (index), \
  687. }
  688. static DECLARE_TLV_DB_SCALE(monitor_db_scale, -600, 600, 0);
  689. static DECLARE_TLV_DB_SCALE(ac97_db_scale, -3450, 150, 0);
  690. static DECLARE_TLV_DB_SCALE(ac97_rec_db_scale, 0, 150, 0);
  691. static const struct snd_kcontrol_new controls[] = {
  692. {
  693. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  694. .name = "Master Playback Volume",
  695. .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
  696. .info = dac_volume_info,
  697. .get = dac_volume_get,
  698. .put = dac_volume_put,
  699. },
  700. {
  701. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  702. .name = "Master Playback Switch",
  703. .info = snd_ctl_boolean_mono_info,
  704. .get = dac_mute_get,
  705. .put = dac_mute_put,
  706. },
  707. {
  708. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  709. .name = "Stereo Upmixing",
  710. .info = upmix_info,
  711. .get = upmix_get,
  712. .put = upmix_put,
  713. },
  714. {
  715. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  716. .name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, SWITCH),
  717. .info = snd_ctl_boolean_mono_info,
  718. .get = spdif_switch_get,
  719. .put = spdif_switch_put,
  720. },
  721. {
  722. .iface = SNDRV_CTL_ELEM_IFACE_PCM,
  723. .device = 1,
  724. .name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, DEFAULT),
  725. .info = spdif_info,
  726. .get = spdif_default_get,
  727. .put = spdif_default_put,
  728. },
  729. {
  730. .iface = SNDRV_CTL_ELEM_IFACE_PCM,
  731. .device = 1,
  732. .name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, CON_MASK),
  733. .access = SNDRV_CTL_ELEM_ACCESS_READ,
  734. .info = spdif_info,
  735. .get = spdif_mask_get,
  736. },
  737. {
  738. .iface = SNDRV_CTL_ELEM_IFACE_PCM,
  739. .device = 1,
  740. .name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, PCM_STREAM),
  741. .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
  742. SNDRV_CTL_ELEM_ACCESS_INACTIVE,
  743. .info = spdif_info,
  744. .get = spdif_pcm_get,
  745. .put = spdif_pcm_put,
  746. },
  747. };
  748. static const struct snd_kcontrol_new spdif_input_controls[] = {
  749. {
  750. .iface = SNDRV_CTL_ELEM_IFACE_PCM,
  751. .device = 1,
  752. .name = SNDRV_CTL_NAME_IEC958("", CAPTURE, MASK),
  753. .access = SNDRV_CTL_ELEM_ACCESS_READ,
  754. .info = spdif_info,
  755. .get = spdif_input_mask_get,
  756. },
  757. {
  758. .iface = SNDRV_CTL_ELEM_IFACE_PCM,
  759. .device = 1,
  760. .name = SNDRV_CTL_NAME_IEC958("", CAPTURE, DEFAULT),
  761. .access = SNDRV_CTL_ELEM_ACCESS_READ,
  762. .info = spdif_info,
  763. .get = spdif_input_default_get,
  764. },
  765. {
  766. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  767. .name = SNDRV_CTL_NAME_IEC958("Loopback ", NONE, SWITCH),
  768. .info = snd_ctl_boolean_mono_info,
  769. .get = spdif_loopback_get,
  770. .put = spdif_loopback_put,
  771. },
  772. };
  773. static const struct {
  774. unsigned int pcm_dev;
  775. struct snd_kcontrol_new controls[2];
  776. } monitor_controls[] = {
  777. {
  778. .pcm_dev = CAPTURE_0_FROM_I2S_1,
  779. .controls = {
  780. {
  781. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  782. .name = "Analog Input Monitor Playback Switch",
  783. .info = snd_ctl_boolean_mono_info,
  784. .get = monitor_get,
  785. .put = monitor_put,
  786. .private_value = OXYGEN_ADC_MONITOR_A,
  787. },
  788. {
  789. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  790. .name = "Analog Input Monitor Playback Volume",
  791. .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
  792. SNDRV_CTL_ELEM_ACCESS_TLV_READ,
  793. .info = monitor_volume_info,
  794. .get = monitor_get,
  795. .put = monitor_put,
  796. .private_value = OXYGEN_ADC_MONITOR_A_HALF_VOL
  797. | (1 << 8),
  798. .tlv = { .p = monitor_db_scale, },
  799. },
  800. },
  801. },
  802. {
  803. .pcm_dev = CAPTURE_0_FROM_I2S_2,
  804. .controls = {
  805. {
  806. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  807. .name = "Analog Input Monitor Playback Switch",
  808. .info = snd_ctl_boolean_mono_info,
  809. .get = monitor_get,
  810. .put = monitor_put,
  811. .private_value = OXYGEN_ADC_MONITOR_B,
  812. },
  813. {
  814. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  815. .name = "Analog Input Monitor Playback Volume",
  816. .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
  817. SNDRV_CTL_ELEM_ACCESS_TLV_READ,
  818. .info = monitor_volume_info,
  819. .get = monitor_get,
  820. .put = monitor_put,
  821. .private_value = OXYGEN_ADC_MONITOR_B_HALF_VOL
  822. | (1 << 8),
  823. .tlv = { .p = monitor_db_scale, },
  824. },
  825. },
  826. },
  827. {
  828. .pcm_dev = CAPTURE_2_FROM_I2S_2,
  829. .controls = {
  830. {
  831. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  832. .name = "Analog Input Monitor Playback Switch",
  833. .index = 1,
  834. .info = snd_ctl_boolean_mono_info,
  835. .get = monitor_get,
  836. .put = monitor_put,
  837. .private_value = OXYGEN_ADC_MONITOR_B,
  838. },
  839. {
  840. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  841. .name = "Analog Input Monitor Playback Volume",
  842. .index = 1,
  843. .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
  844. SNDRV_CTL_ELEM_ACCESS_TLV_READ,
  845. .info = monitor_volume_info,
  846. .get = monitor_get,
  847. .put = monitor_put,
  848. .private_value = OXYGEN_ADC_MONITOR_B_HALF_VOL
  849. | (1 << 8),
  850. .tlv = { .p = monitor_db_scale, },
  851. },
  852. },
  853. },
  854. {
  855. .pcm_dev = CAPTURE_1_FROM_SPDIF,
  856. .controls = {
  857. {
  858. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  859. .name = "Digital Input Monitor Playback Switch",
  860. .info = snd_ctl_boolean_mono_info,
  861. .get = monitor_get,
  862. .put = monitor_put,
  863. .private_value = OXYGEN_ADC_MONITOR_C,
  864. },
  865. {
  866. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  867. .name = "Digital Input Monitor Playback Volume",
  868. .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
  869. SNDRV_CTL_ELEM_ACCESS_TLV_READ,
  870. .info = monitor_volume_info,
  871. .get = monitor_get,
  872. .put = monitor_put,
  873. .private_value = OXYGEN_ADC_MONITOR_C_HALF_VOL
  874. | (1 << 8),
  875. .tlv = { .p = monitor_db_scale, },
  876. },
  877. },
  878. },
  879. };
  880. static const struct snd_kcontrol_new ac97_controls[] = {
  881. AC97_VOLUME("Mic Capture Volume", 0, AC97_MIC, 0),
  882. AC97_SWITCH("Mic Capture Switch", 0, AC97_MIC, 15, 1),
  883. AC97_SWITCH("Mic Boost (+20dB)", 0, AC97_MIC, 6, 0),
  884. {
  885. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  886. .name = "Mic Source Capture Enum",
  887. .info = mic_fmic_source_info,
  888. .get = mic_fmic_source_get,
  889. .put = mic_fmic_source_put,
  890. },
  891. AC97_SWITCH("Line Capture Switch", 0, AC97_LINE, 15, 1),
  892. AC97_VOLUME("CD Capture Volume", 0, AC97_CD, 1),
  893. AC97_SWITCH("CD Capture Switch", 0, AC97_CD, 15, 1),
  894. AC97_VOLUME("Aux Capture Volume", 0, AC97_AUX, 1),
  895. AC97_SWITCH("Aux Capture Switch", 0, AC97_AUX, 15, 1),
  896. };
  897. static const struct snd_kcontrol_new ac97_fp_controls[] = {
  898. AC97_VOLUME("Front Panel Playback Volume", 1, AC97_HEADPHONE, 1),
  899. AC97_SWITCH("Front Panel Playback Switch", 1, AC97_HEADPHONE, 15, 1),
  900. {
  901. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  902. .name = "Front Panel Capture Volume",
  903. .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
  904. SNDRV_CTL_ELEM_ACCESS_TLV_READ,
  905. .info = ac97_fp_rec_volume_info,
  906. .get = ac97_fp_rec_volume_get,
  907. .put = ac97_fp_rec_volume_put,
  908. .tlv = { .p = ac97_rec_db_scale, },
  909. },
  910. AC97_SWITCH("Front Panel Capture Switch", 1, AC97_REC_GAIN, 15, 1),
  911. };
  912. static void oxygen_any_ctl_free(struct snd_kcontrol *ctl)
  913. {
  914. struct oxygen *chip = ctl->private_data;
  915. unsigned int i;
  916. /* I'm too lazy to write a function for each control :-) */
  917. for (i = 0; i < ARRAY_SIZE(chip->controls); ++i)
  918. chip->controls[i] = NULL;
  919. }
  920. static int add_controls(struct oxygen *chip,
  921. const struct snd_kcontrol_new controls[],
  922. unsigned int count)
  923. {
  924. static const char *const known_ctl_names[CONTROL_COUNT] = {
  925. [CONTROL_SPDIF_PCM] =
  926. SNDRV_CTL_NAME_IEC958("", PLAYBACK, PCM_STREAM),
  927. [CONTROL_SPDIF_INPUT_BITS] =
  928. SNDRV_CTL_NAME_IEC958("", CAPTURE, DEFAULT),
  929. [CONTROL_MIC_CAPTURE_SWITCH] = "Mic Capture Switch",
  930. [CONTROL_LINE_CAPTURE_SWITCH] = "Line Capture Switch",
  931. [CONTROL_CD_CAPTURE_SWITCH] = "CD Capture Switch",
  932. [CONTROL_AUX_CAPTURE_SWITCH] = "Aux Capture Switch",
  933. };
  934. unsigned int i, j;
  935. struct snd_kcontrol_new template;
  936. struct snd_kcontrol *ctl;
  937. int err;
  938. for (i = 0; i < count; ++i) {
  939. template = controls[i];
  940. if (chip->model.control_filter) {
  941. err = chip->model.control_filter(&template);
  942. if (err < 0)
  943. return err;
  944. if (err == 1)
  945. continue;
  946. }
  947. if (!strcmp(template.name, "Stereo Upmixing") &&
  948. chip->model.dac_channels_pcm == 2)
  949. continue;
  950. if (!strcmp(template.name, "Mic Source Capture Enum") &&
  951. !(chip->model.device_config & AC97_FMIC_SWITCH))
  952. continue;
  953. if (!strncmp(template.name, "CD Capture ", 11) &&
  954. !(chip->model.device_config & AC97_CD_INPUT))
  955. continue;
  956. if (!strcmp(template.name, "Master Playback Volume") &&
  957. chip->model.dac_tlv) {
  958. template.tlv.p = chip->model.dac_tlv;
  959. template.access |= SNDRV_CTL_ELEM_ACCESS_TLV_READ;
  960. }
  961. ctl = snd_ctl_new1(&template, chip);
  962. if (!ctl)
  963. return -ENOMEM;
  964. err = snd_ctl_add(chip->card, ctl);
  965. if (err < 0)
  966. return err;
  967. for (j = 0; j < CONTROL_COUNT; ++j)
  968. if (!strcmp(ctl->id.name, known_ctl_names[j])) {
  969. chip->controls[j] = ctl;
  970. ctl->private_free = oxygen_any_ctl_free;
  971. }
  972. }
  973. return 0;
  974. }
  975. int oxygen_mixer_init(struct oxygen *chip)
  976. {
  977. unsigned int i;
  978. int err;
  979. err = add_controls(chip, controls, ARRAY_SIZE(controls));
  980. if (err < 0)
  981. return err;
  982. if (chip->model.device_config & CAPTURE_1_FROM_SPDIF) {
  983. err = add_controls(chip, spdif_input_controls,
  984. ARRAY_SIZE(spdif_input_controls));
  985. if (err < 0)
  986. return err;
  987. }
  988. for (i = 0; i < ARRAY_SIZE(monitor_controls); ++i) {
  989. if (!(chip->model.device_config & monitor_controls[i].pcm_dev))
  990. continue;
  991. err = add_controls(chip, monitor_controls[i].controls,
  992. ARRAY_SIZE(monitor_controls[i].controls));
  993. if (err < 0)
  994. return err;
  995. }
  996. if (chip->has_ac97_0) {
  997. err = add_controls(chip, ac97_controls,
  998. ARRAY_SIZE(ac97_controls));
  999. if (err < 0)
  1000. return err;
  1001. }
  1002. if (chip->has_ac97_1) {
  1003. err = add_controls(chip, ac97_fp_controls,
  1004. ARRAY_SIZE(ac97_fp_controls));
  1005. if (err < 0)
  1006. return err;
  1007. }
  1008. return chip->model.mixer_init ? chip->model.mixer_init(chip) : 0;
  1009. }