Lines Matching +full:ain2 +full:- +full:ain3

1 // SPDX-License-Identifier: GPL-2.0-or-later
7 * Copyright (c) 2012 Ondrej Zary <linux@rainbow-software.org>
16 /* low-level access */
24 wm->regs[addr] = data; in snd_wm8776_write()
25 wm->ops.write(wm, bus_addr, bus_data); in snd_wm8776_write()
28 /* register-level functions */
34 struct snd_card *card = wm->card; in snd_wm8776_activate_ctl()
42 index_offset = snd_ctl_get_ioff(kctl, &kctl->id); in snd_wm8776_activate_ctl()
43 vd = &kctl->vd[index_offset]; in snd_wm8776_activate_ctl()
45 vd->access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE; in snd_wm8776_activate_ctl()
47 vd->access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE; in snd_wm8776_activate_ctl()
48 snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_INFO, &kctl->id); in snd_wm8776_activate_ctl()
55 switch (wm->agc_mode) { in snd_wm8776_update_agc_ctl()
72 if (wm->ctl[i].flags & flags_off) in snd_wm8776_update_agc_ctl()
73 snd_wm8776_activate_ctl(wm, wm->ctl[i].name, false); in snd_wm8776_update_agc_ctl()
74 else if (wm->ctl[i].flags & flags_on) in snd_wm8776_update_agc_ctl()
75 snd_wm8776_activate_ctl(wm, wm->ctl[i].name, true); in snd_wm8776_update_agc_ctl()
80 u16 alc1 = wm->regs[WM8776_REG_ALCCTRL1] & ~WM8776_ALC1_LCT_MASK; in snd_wm8776_set_agc()
81 u16 alc2 = wm->regs[WM8776_REG_ALCCTRL2] & ~WM8776_ALC2_LCEN; in snd_wm8776_set_agc()
85 wm->agc_mode = WM8776_AGC_OFF; in snd_wm8776_set_agc()
89 wm->agc_mode = WM8776_AGC_LIM; in snd_wm8776_set_agc()
94 wm->agc_mode = WM8776_AGC_ALC_R; in snd_wm8776_set_agc()
99 wm->agc_mode = WM8776_AGC_ALC_L; in snd_wm8776_set_agc()
104 wm->agc_mode = WM8776_AGC_ALC_STEREO; in snd_wm8776_set_agc()
114 *mode = wm->agc_mode; in snd_wm8776_get_agc()
119 static const DECLARE_TLV_DB_SCALE(wm8776_hp_tlv, -7400, 100, 1);
120 static const DECLARE_TLV_DB_SCALE(wm8776_dac_tlv, -12750, 50, 1);
121 static const DECLARE_TLV_DB_SCALE(wm8776_adc_tlv, -10350, 50, 1);
122 static const DECLARE_TLV_DB_SCALE(wm8776_lct_tlv, -1600, 100, 0);
124 static const DECLARE_TLV_DB_SCALE(wm8776_ngth_tlv, -7800, 600, 0);
125 static const DECLARE_TLV_DB_SCALE(wm8776_maxatten_lim_tlv, -1200, 100, 0);
126 static const DECLARE_TLV_DB_SCALE(wm8776_maxatten_alc_tlv, -2100, 400, 0);
243 .name = "AIN2 Capture Switch",
249 .name = "AIN3 Capture Switch",
420 memcpy(wm->ctl, snd_wm8776_default_ctl, sizeof(wm->ctl)); in snd_wm8776_init()
434 snd_wm8776_write(wm, i, wm->regs[i]); in snd_wm8776_resume()
444 u16 val = wm->regs[WM8776_REG_DACRVOL]; in snd_wm8776_volume_restore()
455 int n = kcontrol->private_value; in snd_wm8776_volume_info()
457 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in snd_wm8776_volume_info()
458 uinfo->count = (wm->ctl[n].flags & WM8776_FLAG_STEREO) ? 2 : 1; in snd_wm8776_volume_info()
459 uinfo->value.integer.min = wm->ctl[n].min; in snd_wm8776_volume_info()
460 uinfo->value.integer.max = wm->ctl[n].max; in snd_wm8776_volume_info()
469 int n = kcontrol->private_value; in snd_wm8776_enum_info()
471 return snd_ctl_enum_info(uinfo, 1, wm->ctl[n].max, in snd_wm8776_enum_info()
472 wm->ctl[n].enum_names); in snd_wm8776_enum_info()
479 int n = kcontrol->private_value; in snd_wm8776_ctl_get()
482 if (wm->ctl[n].get) in snd_wm8776_ctl_get()
483 wm->ctl[n].get(wm, &val1, &val2); in snd_wm8776_ctl_get()
485 val1 = wm->regs[wm->ctl[n].reg1] & wm->ctl[n].mask1; in snd_wm8776_ctl_get()
486 val1 >>= __ffs(wm->ctl[n].mask1); in snd_wm8776_ctl_get()
487 if (wm->ctl[n].flags & WM8776_FLAG_STEREO) { in snd_wm8776_ctl_get()
488 val2 = wm->regs[wm->ctl[n].reg2] & wm->ctl[n].mask2; in snd_wm8776_ctl_get()
489 val2 >>= __ffs(wm->ctl[n].mask2); in snd_wm8776_ctl_get()
490 if (wm->ctl[n].flags & WM8776_FLAG_VOL_UPDATE) in snd_wm8776_ctl_get()
494 if (wm->ctl[n].flags & WM8776_FLAG_INVERT) { in snd_wm8776_ctl_get()
495 val1 = wm->ctl[n].max - (val1 - wm->ctl[n].min); in snd_wm8776_ctl_get()
496 if (wm->ctl[n].flags & WM8776_FLAG_STEREO) in snd_wm8776_ctl_get()
497 val2 = wm->ctl[n].max - (val2 - wm->ctl[n].min); in snd_wm8776_ctl_get()
499 ucontrol->value.integer.value[0] = val1; in snd_wm8776_ctl_get()
500 if (wm->ctl[n].flags & WM8776_FLAG_STEREO) in snd_wm8776_ctl_get()
501 ucontrol->value.integer.value[1] = val2; in snd_wm8776_ctl_get()
510 int n = kcontrol->private_value; in snd_wm8776_ctl_put()
514 regval1 = ucontrol->value.integer.value[0]; in snd_wm8776_ctl_put()
515 regval2 = ucontrol->value.integer.value[1]; in snd_wm8776_ctl_put()
516 if (wm->ctl[n].flags & WM8776_FLAG_INVERT) { in snd_wm8776_ctl_put()
517 regval1 = wm->ctl[n].max - (regval1 - wm->ctl[n].min); in snd_wm8776_ctl_put()
518 regval2 = wm->ctl[n].max - (regval2 - wm->ctl[n].min); in snd_wm8776_ctl_put()
520 if (wm->ctl[n].set) in snd_wm8776_ctl_put()
521 wm->ctl[n].set(wm, regval1, regval2); in snd_wm8776_ctl_put()
523 val = wm->regs[wm->ctl[n].reg1] & ~wm->ctl[n].mask1; in snd_wm8776_ctl_put()
524 val |= regval1 << __ffs(wm->ctl[n].mask1); in snd_wm8776_ctl_put()
526 if (wm->ctl[n].flags & WM8776_FLAG_STEREO && in snd_wm8776_ctl_put()
527 wm->ctl[n].reg1 == wm->ctl[n].reg2) { in snd_wm8776_ctl_put()
528 val &= ~wm->ctl[n].mask2; in snd_wm8776_ctl_put()
529 val |= regval2 << __ffs(wm->ctl[n].mask2); in snd_wm8776_ctl_put()
531 snd_wm8776_write(wm, wm->ctl[n].reg1, val); in snd_wm8776_ctl_put()
533 if (wm->ctl[n].flags & WM8776_FLAG_STEREO && in snd_wm8776_ctl_put()
534 wm->ctl[n].reg1 != wm->ctl[n].reg2) { in snd_wm8776_ctl_put()
535 val = wm->regs[wm->ctl[n].reg2] & ~wm->ctl[n].mask2; in snd_wm8776_ctl_put()
536 val |= regval2 << __ffs(wm->ctl[n].mask2); in snd_wm8776_ctl_put()
537 if (wm->ctl[n].flags & WM8776_FLAG_VOL_UPDATE) in snd_wm8776_ctl_put()
539 snd_wm8776_write(wm, wm->ctl[n].reg2, val); in snd_wm8776_ctl_put()
554 cont.name = wm->ctl[num].name; in snd_wm8776_add_control()
556 if (wm->ctl[num].flags & WM8776_FLAG_LIM || in snd_wm8776_add_control()
557 wm->ctl[num].flags & WM8776_FLAG_ALC) in snd_wm8776_add_control()
563 switch (wm->ctl[num].type) { in snd_wm8776_add_control()
567 cont.tlv.p = wm->ctl[num].tlv; in snd_wm8776_add_control()
570 wm->ctl[num].max = 1; in snd_wm8776_add_control()
571 if (wm->ctl[num].flags & WM8776_FLAG_STEREO) in snd_wm8776_add_control()
580 return -EINVAL; in snd_wm8776_add_control()
584 return -ENOMEM; in snd_wm8776_add_control()
586 return snd_ctl_add(wm->card, ctl); in snd_wm8776_add_control()
594 if (wm->ctl[i].name) { in snd_wm8776_build_controls()