Lines Matching refs:tas

3  * Apple Onboard Audio driver for tas codec
26 * audacity, or recording the tas output via cable
72 MODULE_DESCRIPTION("tas codec driver for snd-aoa");
74 #include "tas.h"
75 #include "tas-gain-table.h"
76 #include "tas-basstreble.h"
80 #define PFX "snd-aoa-codec-tas: "
83 struct tas {
101 static int tas_reset_init(struct tas *tas);
103 static struct tas *codec_to_tas(struct aoa_codec *codec)
105 return container_of(codec, struct tas, codec);
108 static inline int tas_write_reg(struct tas *tas, u8 reg, u8 len, u8 *data)
111 return i2c_smbus_write_byte_data(tas->i2c, reg, *data);
113 return i2c_smbus_write_i2c_block_data(tas->i2c, reg, len, data);
116 static void tas3004_set_drc(struct tas *tas)
120 if (tas->drc_enabled)
125 if (tas->drc_range > 0xef)
127 else if (tas->drc_range < 0)
130 val[2] = tas->drc_range;
135 tas_write_reg(tas, TAS_REG_DRC, 6, val);
138 static void tas_set_treble(struct tas *tas)
142 tmp = tas3004_treble(tas->treble);
143 tas_write_reg(tas, TAS_REG_TREBLE, 1, &tmp);
146 static void tas_set_bass(struct tas *tas)
150 tmp = tas3004_bass(tas->bass);
151 tas_write_reg(tas, TAS_REG_BASS, 1, &tmp);
154 static void tas_set_volume(struct tas *tas)
160 left = tas->cached_volume_l;
161 right = tas->cached_volume_r;
166 if (tas->mute_l) left = 0;
167 if (tas->mute_r) right = 0;
183 tas_write_reg(tas, TAS_REG_VOL, 6, block);
186 static void tas_set_mixer(struct tas *tas)
193 val = tas->mixer_l[i];
200 tas_write_reg(tas, TAS_REG_LMIX, 9, block);
203 val = tas->mixer_r[i];
210 tas_write_reg(tas, TAS_REG_RMIX, 9, block);
237 struct tas *tas = snd_kcontrol_chip(kcontrol);
239 mutex_lock(&tas->mtx);
240 ucontrol->value.integer.value[0] = tas->cached_volume_l;
241 ucontrol->value.integer.value[1] = tas->cached_volume_r;
242 mutex_unlock(&tas->mtx);
249 struct tas *tas = snd_kcontrol_chip(kcontrol);
258 mutex_lock(&tas->mtx);
259 if (tas->cached_volume_l == ucontrol->value.integer.value[0]
260 && tas->cached_volume_r == ucontrol->value.integer.value[1]) {
261 mutex_unlock(&tas->mtx);
265 tas->cached_volume_l = ucontrol->value.integer.value[0];
266 tas->cached_volume_r = ucontrol->value.integer.value[1];
267 if (tas->hw_enabled)
268 tas_set_volume(tas);
269 mutex_unlock(&tas->mtx);
287 struct tas *tas = snd_kcontrol_chip(kcontrol);
289 mutex_lock(&tas->mtx);
290 ucontrol->value.integer.value[0] = !tas->mute_l;
291 ucontrol->value.integer.value[1] = !tas->mute_r;
292 mutex_unlock(&tas->mtx);
299 struct tas *tas = snd_kcontrol_chip(kcontrol);
301 mutex_lock(&tas->mtx);
302 if (tas->mute_l == !ucontrol->value.integer.value[0]
303 && tas->mute_r == !ucontrol->value.integer.value[1]) {
304 mutex_unlock(&tas->mtx);
308 tas->mute_l = !ucontrol->value.integer.value[0];
309 tas->mute_r = !ucontrol->value.integer.value[1];
310 if (tas->hw_enabled)
311 tas_set_volume(tas);
312 mutex_unlock(&tas->mtx);
338 struct tas *tas = snd_kcontrol_chip(kcontrol);
341 mutex_lock(&tas->mtx);
342 ucontrol->value.integer.value[0] = tas->mixer_l[idx];
343 ucontrol->value.integer.value[1] = tas->mixer_r[idx];
344 mutex_unlock(&tas->mtx);
352 struct tas *tas = snd_kcontrol_chip(kcontrol);
355 mutex_lock(&tas->mtx);
356 if (tas->mixer_l[idx] == ucontrol->value.integer.value[0]
357 && tas->mixer_r[idx] == ucontrol->value.integer.value[1]) {
358 mutex_unlock(&tas->mtx);
362 tas->mixer_l[idx] = ucontrol->value.integer.value[0];
363 tas->mixer_r[idx] = ucontrol->value.integer.value[1];
365 if (tas->hw_enabled)
366 tas_set_mixer(tas);
367 mutex_unlock(&tas->mtx);
398 struct tas *tas = snd_kcontrol_chip(kcontrol);
400 mutex_lock(&tas->mtx);
401 ucontrol->value.integer.value[0] = tas->drc_range;
402 mutex_unlock(&tas->mtx);
409 struct tas *tas = snd_kcontrol_chip(kcontrol);
415 mutex_lock(&tas->mtx);
416 if (tas->drc_range == ucontrol->value.integer.value[0]) {
417 mutex_unlock(&tas->mtx);
421 tas->drc_range = ucontrol->value.integer.value[0];
422 if (tas->hw_enabled)
423 tas3004_set_drc(tas);
424 mutex_unlock(&tas->mtx);
442 struct tas *tas = snd_kcontrol_chip(kcontrol);
444 mutex_lock(&tas->mtx);
445 ucontrol->value.integer.value[0] = tas->drc_enabled;
446 mutex_unlock(&tas->mtx);
453 struct tas *tas = snd_kcontrol_chip(kcontrol);
455 mutex_lock(&tas->mtx);
456 if (tas->drc_enabled == ucontrol->value.integer.value[0]) {
457 mutex_unlock(&tas->mtx);
461 tas->drc_enabled = !!ucontrol->value.integer.value[0];
462 if (tas->hw_enabled)
463 tas3004_set_drc(tas);
464 mutex_unlock(&tas->mtx);
488 struct tas *tas = snd_kcontrol_chip(kcontrol);
490 mutex_lock(&tas->mtx);
491 ucontrol->value.enumerated.item[0] = !!(tas->acr & TAS_ACR_INPUT_B);
492 mutex_unlock(&tas->mtx);
499 struct tas *tas = snd_kcontrol_chip(kcontrol);
504 mutex_lock(&tas->mtx);
505 oldacr = tas->acr;
512 tas->acr &= ~(TAS_ACR_INPUT_B | TAS_ACR_B_MONAUREAL);
514 tas->acr |= TAS_ACR_INPUT_B | TAS_ACR_B_MONAUREAL |
516 if (oldacr == tas->acr) {
517 mutex_unlock(&tas->mtx);
520 if (tas->hw_enabled)
521 tas_write_reg(tas, TAS_REG_ACR, 1, &tas->acr);
522 mutex_unlock(&tas->mtx);
559 struct tas *tas = snd_kcontrol_chip(kcontrol);
561 mutex_lock(&tas->mtx);
562 ucontrol->value.integer.value[0] = tas->treble;
563 mutex_unlock(&tas->mtx);
570 struct tas *tas = snd_kcontrol_chip(kcontrol);
575 mutex_lock(&tas->mtx);
576 if (tas->treble == ucontrol->value.integer.value[0]) {
577 mutex_unlock(&tas->mtx);
581 tas->treble = ucontrol->value.integer.value[0];
582 if (tas->hw_enabled)
583 tas_set_treble(tas);
584 mutex_unlock(&tas->mtx);
610 struct tas *tas = snd_kcontrol_chip(kcontrol);
612 mutex_lock(&tas->mtx);
613 ucontrol->value.integer.value[0] = tas->bass;
614 mutex_unlock(&tas->mtx);
621 struct tas *tas = snd_kcontrol_chip(kcontrol);
626 mutex_lock(&tas->mtx);
627 if (tas->bass == ucontrol->value.integer.value[0]) {
628 mutex_unlock(&tas->mtx);
632 tas->bass = ucontrol->value.integer.value[0];
633 if (tas->hw_enabled)
634 tas_set_bass(tas);
635 mutex_unlock(&tas->mtx);
671 static int tas_reset_init(struct tas *tas)
675 tas->codec.gpio->methods->all_amps_off(tas->codec.gpio);
677 tas->codec.gpio->methods->set_hw_reset(tas->codec.gpio, 0);
679 tas->codec.gpio->methods->set_hw_reset(tas->codec.gpio, 1);
681 tas->codec.gpio->methods->set_hw_reset(tas->codec.gpio, 0);
683 tas->codec.gpio->methods->all_amps_restore(tas->codec.gpio);
686 if (tas_write_reg(tas, TAS_REG_MCS, 1, &tmp))
689 tas->acr |= TAS_ACR_ANALOG_PDOWN;
690 if (tas_write_reg(tas, TAS_REG_ACR, 1, &tas->acr))
694 if (tas_write_reg(tas, TAS_REG_MCS2, 1, &tmp))
697 tas3004_set_drc(tas);
700 tas->treble = TAS3004_TREBLE_ZERO;
701 tas->bass = TAS3004_BASS_ZERO;
702 tas_set_treble(tas);
703 tas_set_bass(tas);
705 tas->acr &= ~TAS_ACR_ANALOG_PDOWN;
706 if (tas_write_reg(tas, TAS_REG_ACR, 1, &tas->acr))
716 struct tas *tas = cii->codec_data;
721 tas->codec.gpio->methods->all_amps_off(tas->codec.gpio);
722 tas->hw_enabled = 0;
726 mutex_lock(&tas->mtx);
727 tas_reset_init(tas);
728 tas_set_volume(tas);
729 tas_set_mixer(tas);
730 tas->hw_enabled = 1;
731 tas->codec.gpio->methods->all_amps_restore(tas->codec.gpio);
732 mutex_unlock(&tas->mtx);
745 static int tas_suspend(struct tas *tas)
747 mutex_lock(&tas->mtx);
748 tas->hw_enabled = 0;
749 tas->acr |= TAS_ACR_ANALOG_PDOWN;
750 tas_write_reg(tas, TAS_REG_ACR, 1, &tas->acr);
751 mutex_unlock(&tas->mtx);
755 static int tas_resume(struct tas *tas)
758 mutex_lock(&tas->mtx);
759 tas_reset_init(tas);
760 tas_set_volume(tas);
761 tas_set_mixer(tas);
762 tas->hw_enabled = 1;
763 mutex_unlock(&tas->mtx);
798 struct tas *tas = codec_to_tas(codec);
801 if (!tas->codec.gpio || !tas->codec.gpio->methods) {
806 mutex_lock(&tas->mtx);
807 if (tas_reset_init(tas)) {
808 printk(KERN_ERR PFX "tas failed to initialise\n");
809 mutex_unlock(&tas->mtx);
812 tas->hw_enabled = 1;
813 mutex_unlock(&tas->mtx);
815 if (tas->codec.soundbus_dev->attach_codec(tas->codec.soundbus_dev,
817 &tas_codec_info, tas)) {
818 printk(KERN_ERR PFX "error attaching tas to soundbus\n");
822 if (aoa_snd_device_new(SNDRV_DEV_CODEC, tas, &ops)) {
823 printk(KERN_ERR PFX "failed to create tas snd device!\n");
826 err = aoa_snd_ctl_add(snd_ctl_new1(&volume_control, tas));
830 err = aoa_snd_ctl_add(snd_ctl_new1(&mute_control, tas));
834 err = aoa_snd_ctl_add(snd_ctl_new1(&pcm1_control, tas));
838 err = aoa_snd_ctl_add(snd_ctl_new1(&monitor_control, tas));
842 err = aoa_snd_ctl_add(snd_ctl_new1(&capture_source_control, tas));
846 err = aoa_snd_ctl_add(snd_ctl_new1(&drc_range_control, tas));
850 err = aoa_snd_ctl_add(snd_ctl_new1(&drc_switch_control, tas));
854 err = aoa_snd_ctl_add(snd_ctl_new1(&treble_control, tas));
858 err = aoa_snd_ctl_add(snd_ctl_new1(&bass_control, tas));
864 tas->codec.soundbus_dev->detach_codec(tas->codec.soundbus_dev, tas);
865 snd_device_free(aoa_get_card(), tas);
871 struct tas *tas = codec_to_tas(codec);
873 if (!tas->codec.soundbus_dev)
875 tas->codec.soundbus_dev->detach_codec(tas->codec.soundbus_dev, tas);
883 struct tas *tas;
885 tas = kzalloc(sizeof(struct tas), GFP_KERNEL);
887 if (!tas)
890 mutex_init(&tas->mtx);
891 tas->i2c = client;
892 i2c_set_clientdata(client, tas);
895 tas->drc_range = TAS3004_DRC_MAX / 2;
897 strlcpy(tas->codec.name, "tas", MAX_CODEC_NAME_LEN);
898 tas->codec.owner = THIS_MODULE;
899 tas->codec.init = tas_init_codec;
900 tas->codec.exit = tas_exit_codec;
901 tas->codec.node = of_node_get(node);
903 if (aoa_codec_register(&tas->codec)) {
907 "snd-aoa-codec-tas: tas found, addr 0x%02x on %pOF\n",
911 mutex_destroy(&tas->mtx);
912 kfree(tas);
918 struct tas *tas = i2c_get_clientdata(client);
921 aoa_codec_unregister(&tas->codec);
922 of_node_put(tas->codec.node);
925 tas_write_reg(tas, TAS_REG_ACR, 1, &tmp);
927 mutex_destroy(&tas->mtx);
928 kfree(tas);