Lines Matching refs:wm
18 static void snd_wm8776_write(struct snd_wm8776 *wm, u16 addr, u16 data) in snd_wm8776_write() argument
24 wm->regs[addr] = data; in snd_wm8776_write()
25 wm->ops.write(wm, bus_addr, bus_data); in snd_wm8776_write()
30 static void snd_wm8776_activate_ctl(struct snd_wm8776 *wm, in snd_wm8776_activate_ctl() argument
34 struct snd_card *card = wm->card; in snd_wm8776_activate_ctl()
55 static void snd_wm8776_update_agc_ctl(struct snd_wm8776 *wm) in snd_wm8776_update_agc_ctl() argument
59 switch (wm->agc_mode) { in snd_wm8776_update_agc_ctl()
76 if (wm->ctl[i].flags & flags_off) in snd_wm8776_update_agc_ctl()
77 snd_wm8776_activate_ctl(wm, wm->ctl[i].name, false); in snd_wm8776_update_agc_ctl()
78 else if (wm->ctl[i].flags & flags_on) in snd_wm8776_update_agc_ctl()
79 snd_wm8776_activate_ctl(wm, wm->ctl[i].name, true); in snd_wm8776_update_agc_ctl()
82 static void snd_wm8776_set_agc(struct snd_wm8776 *wm, u16 agc, u16 nothing) in snd_wm8776_set_agc() argument
84 u16 alc1 = wm->regs[WM8776_REG_ALCCTRL1] & ~WM8776_ALC1_LCT_MASK; in snd_wm8776_set_agc()
85 u16 alc2 = wm->regs[WM8776_REG_ALCCTRL2] & ~WM8776_ALC2_LCEN; in snd_wm8776_set_agc()
89 wm->agc_mode = WM8776_AGC_OFF; in snd_wm8776_set_agc()
93 wm->agc_mode = WM8776_AGC_LIM; in snd_wm8776_set_agc()
98 wm->agc_mode = WM8776_AGC_ALC_R; in snd_wm8776_set_agc()
103 wm->agc_mode = WM8776_AGC_ALC_L; in snd_wm8776_set_agc()
108 wm->agc_mode = WM8776_AGC_ALC_STEREO; in snd_wm8776_set_agc()
111 snd_wm8776_write(wm, WM8776_REG_ALCCTRL1, alc1); in snd_wm8776_set_agc()
112 snd_wm8776_write(wm, WM8776_REG_ALCCTRL2, alc2); in snd_wm8776_set_agc()
113 snd_wm8776_update_agc_ctl(wm); in snd_wm8776_set_agc()
116 static void snd_wm8776_get_agc(struct snd_wm8776 *wm, u16 *mode, u16 *nothing) in snd_wm8776_get_agc() argument
118 *mode = wm->agc_mode; in snd_wm8776_get_agc()
412 void snd_wm8776_init(struct snd_wm8776 *wm) in snd_wm8776_init() argument
424 memcpy(wm->ctl, snd_wm8776_default_ctl, sizeof(wm->ctl)); in snd_wm8776_init()
426 snd_wm8776_write(wm, WM8776_REG_RESET, 0x00); /* reset */ in snd_wm8776_init()
430 snd_wm8776_write(wm, i, default_values[i]); in snd_wm8776_init()
433 void snd_wm8776_resume(struct snd_wm8776 *wm) in snd_wm8776_resume() argument
438 snd_wm8776_write(wm, i, wm->regs[i]); in snd_wm8776_resume()
441 void snd_wm8776_set_power(struct snd_wm8776 *wm, u16 power) in snd_wm8776_set_power() argument
443 snd_wm8776_write(wm, WM8776_REG_PWRDOWN, power); in snd_wm8776_set_power()
446 void snd_wm8776_volume_restore(struct snd_wm8776 *wm) in snd_wm8776_volume_restore() argument
448 u16 val = wm->regs[WM8776_REG_DACRVOL]; in snd_wm8776_volume_restore()
450 snd_wm8776_write(wm, WM8776_REG_DACRVOL, val | WM8776_VOL_UPDATE); in snd_wm8776_volume_restore()
458 struct snd_wm8776 *wm = snd_kcontrol_chip(kcontrol); in snd_wm8776_volume_info() local
462 uinfo->count = (wm->ctl[n].flags & WM8776_FLAG_STEREO) ? 2 : 1; in snd_wm8776_volume_info()
463 uinfo->value.integer.min = wm->ctl[n].min; in snd_wm8776_volume_info()
464 uinfo->value.integer.max = wm->ctl[n].max; in snd_wm8776_volume_info()
472 struct snd_wm8776 *wm = snd_kcontrol_chip(kcontrol); in snd_wm8776_enum_info() local
475 return snd_ctl_enum_info(uinfo, 1, wm->ctl[n].max, in snd_wm8776_enum_info()
476 wm->ctl[n].enum_names); in snd_wm8776_enum_info()
482 struct snd_wm8776 *wm = snd_kcontrol_chip(kcontrol); in snd_wm8776_ctl_get() local
486 if (wm->ctl[n].get) in snd_wm8776_ctl_get()
487 wm->ctl[n].get(wm, &val1, &val2); in snd_wm8776_ctl_get()
489 val1 = wm->regs[wm->ctl[n].reg1] & wm->ctl[n].mask1; in snd_wm8776_ctl_get()
490 val1 >>= __ffs(wm->ctl[n].mask1); in snd_wm8776_ctl_get()
491 if (wm->ctl[n].flags & WM8776_FLAG_STEREO) { in snd_wm8776_ctl_get()
492 val2 = wm->regs[wm->ctl[n].reg2] & wm->ctl[n].mask2; in snd_wm8776_ctl_get()
493 val2 >>= __ffs(wm->ctl[n].mask2); in snd_wm8776_ctl_get()
494 if (wm->ctl[n].flags & WM8776_FLAG_VOL_UPDATE) in snd_wm8776_ctl_get()
498 if (wm->ctl[n].flags & WM8776_FLAG_INVERT) { in snd_wm8776_ctl_get()
499 val1 = wm->ctl[n].max - (val1 - wm->ctl[n].min); in snd_wm8776_ctl_get()
500 if (wm->ctl[n].flags & WM8776_FLAG_STEREO) in snd_wm8776_ctl_get()
501 val2 = wm->ctl[n].max - (val2 - wm->ctl[n].min); in snd_wm8776_ctl_get()
504 if (wm->ctl[n].flags & WM8776_FLAG_STEREO) in snd_wm8776_ctl_get()
513 struct snd_wm8776 *wm = snd_kcontrol_chip(kcontrol); in snd_wm8776_ctl_put() local
520 if (wm->ctl[n].flags & WM8776_FLAG_INVERT) { in snd_wm8776_ctl_put()
521 regval1 = wm->ctl[n].max - (regval1 - wm->ctl[n].min); in snd_wm8776_ctl_put()
522 regval2 = wm->ctl[n].max - (regval2 - wm->ctl[n].min); in snd_wm8776_ctl_put()
524 if (wm->ctl[n].set) in snd_wm8776_ctl_put()
525 wm->ctl[n].set(wm, regval1, regval2); in snd_wm8776_ctl_put()
527 val = wm->regs[wm->ctl[n].reg1] & ~wm->ctl[n].mask1; in snd_wm8776_ctl_put()
528 val |= regval1 << __ffs(wm->ctl[n].mask1); in snd_wm8776_ctl_put()
530 if (wm->ctl[n].flags & WM8776_FLAG_STEREO && in snd_wm8776_ctl_put()
531 wm->ctl[n].reg1 == wm->ctl[n].reg2) { in snd_wm8776_ctl_put()
532 val &= ~wm->ctl[n].mask2; in snd_wm8776_ctl_put()
533 val |= regval2 << __ffs(wm->ctl[n].mask2); in snd_wm8776_ctl_put()
535 snd_wm8776_write(wm, wm->ctl[n].reg1, val); in snd_wm8776_ctl_put()
537 if (wm->ctl[n].flags & WM8776_FLAG_STEREO && in snd_wm8776_ctl_put()
538 wm->ctl[n].reg1 != wm->ctl[n].reg2) { in snd_wm8776_ctl_put()
539 val = wm->regs[wm->ctl[n].reg2] & ~wm->ctl[n].mask2; in snd_wm8776_ctl_put()
540 val |= regval2 << __ffs(wm->ctl[n].mask2); in snd_wm8776_ctl_put()
541 if (wm->ctl[n].flags & WM8776_FLAG_VOL_UPDATE) in snd_wm8776_ctl_put()
543 snd_wm8776_write(wm, wm->ctl[n].reg2, val); in snd_wm8776_ctl_put()
550 static int snd_wm8776_add_control(struct snd_wm8776 *wm, int num) in snd_wm8776_add_control() argument
558 cont.name = wm->ctl[num].name; in snd_wm8776_add_control()
560 if (wm->ctl[num].flags & WM8776_FLAG_LIM || in snd_wm8776_add_control()
561 wm->ctl[num].flags & WM8776_FLAG_ALC) in snd_wm8776_add_control()
567 switch (wm->ctl[num].type) { in snd_wm8776_add_control()
571 cont.tlv.p = wm->ctl[num].tlv; in snd_wm8776_add_control()
574 wm->ctl[num].max = 1; in snd_wm8776_add_control()
575 if (wm->ctl[num].flags & WM8776_FLAG_STEREO) in snd_wm8776_add_control()
586 ctl = snd_ctl_new1(&cont, wm); in snd_wm8776_add_control()
590 return snd_ctl_add(wm->card, ctl); in snd_wm8776_add_control()
593 int snd_wm8776_build_controls(struct snd_wm8776 *wm) in snd_wm8776_build_controls() argument
598 if (wm->ctl[i].name) { in snd_wm8776_build_controls()
599 err = snd_wm8776_add_control(wm, i); in snd_wm8776_build_controls()