Lines Matching refs:tas
3 * Apple Onboard Audio driver for tas codec
26 * audacity, or recording the tas output via cable
71 MODULE_DESCRIPTION("tas codec driver for snd-aoa");
73 #include "tas.h"
74 #include "tas-gain-table.h"
75 #include "tas-basstreble.h"
79 #define PFX "snd-aoa-codec-tas: "
82 struct tas {
100 static int tas_reset_init(struct tas *tas);
102 static struct tas *codec_to_tas(struct aoa_codec *codec)
104 return container_of(codec, struct tas, codec);
107 static inline int tas_write_reg(struct tas *tas, u8 reg, u8 len, u8 *data)
110 return i2c_smbus_write_byte_data(tas->i2c, reg, *data);
112 return i2c_smbus_write_i2c_block_data(tas->i2c, reg, len, data);
115 static void tas3004_set_drc(struct tas *tas)
119 if (tas->drc_enabled)
124 if (tas->drc_range > 0xef)
126 else if (tas->drc_range < 0)
129 val[2] = tas->drc_range;
134 tas_write_reg(tas, TAS_REG_DRC, 6, val);
137 static void tas_set_treble(struct tas *tas)
141 tmp = tas3004_treble(tas->treble);
142 tas_write_reg(tas, TAS_REG_TREBLE, 1, &tmp);
145 static void tas_set_bass(struct tas *tas)
149 tmp = tas3004_bass(tas->bass);
150 tas_write_reg(tas, TAS_REG_BASS, 1, &tmp);
153 static void tas_set_volume(struct tas *tas)
159 left = tas->cached_volume_l;
160 right = tas->cached_volume_r;
165 if (tas->mute_l) left = 0;
166 if (tas->mute_r) right = 0;
182 tas_write_reg(tas, TAS_REG_VOL, 6, block);
185 static void tas_set_mixer(struct tas *tas)
192 val = tas->mixer_l[i];
199 tas_write_reg(tas, TAS_REG_LMIX, 9, block);
202 val = tas->mixer_r[i];
209 tas_write_reg(tas, TAS_REG_RMIX, 9, block);
236 struct tas *tas = snd_kcontrol_chip(kcontrol);
238 mutex_lock(&tas->mtx);
239 ucontrol->value.integer.value[0] = tas->cached_volume_l;
240 ucontrol->value.integer.value[1] = tas->cached_volume_r;
241 mutex_unlock(&tas->mtx);
248 struct tas *tas = snd_kcontrol_chip(kcontrol);
257 mutex_lock(&tas->mtx);
258 if (tas->cached_volume_l == ucontrol->value.integer.value[0]
259 && tas->cached_volume_r == ucontrol->value.integer.value[1]) {
260 mutex_unlock(&tas->mtx);
264 tas->cached_volume_l = ucontrol->value.integer.value[0];
265 tas->cached_volume_r = ucontrol->value.integer.value[1];
266 if (tas->hw_enabled)
267 tas_set_volume(tas);
268 mutex_unlock(&tas->mtx);
286 struct tas *tas = snd_kcontrol_chip(kcontrol);
288 mutex_lock(&tas->mtx);
289 ucontrol->value.integer.value[0] = !tas->mute_l;
290 ucontrol->value.integer.value[1] = !tas->mute_r;
291 mutex_unlock(&tas->mtx);
298 struct tas *tas = snd_kcontrol_chip(kcontrol);
300 mutex_lock(&tas->mtx);
301 if (tas->mute_l == !ucontrol->value.integer.value[0]
302 && tas->mute_r == !ucontrol->value.integer.value[1]) {
303 mutex_unlock(&tas->mtx);
307 tas->mute_l = !ucontrol->value.integer.value[0];
308 tas->mute_r = !ucontrol->value.integer.value[1];
309 if (tas->hw_enabled)
310 tas_set_volume(tas);
311 mutex_unlock(&tas->mtx);
337 struct tas *tas = snd_kcontrol_chip(kcontrol);
340 mutex_lock(&tas->mtx);
341 ucontrol->value.integer.value[0] = tas->mixer_l[idx];
342 ucontrol->value.integer.value[1] = tas->mixer_r[idx];
343 mutex_unlock(&tas->mtx);
351 struct tas *tas = snd_kcontrol_chip(kcontrol);
354 mutex_lock(&tas->mtx);
355 if (tas->mixer_l[idx] == ucontrol->value.integer.value[0]
356 && tas->mixer_r[idx] == ucontrol->value.integer.value[1]) {
357 mutex_unlock(&tas->mtx);
361 tas->mixer_l[idx] = ucontrol->value.integer.value[0];
362 tas->mixer_r[idx] = ucontrol->value.integer.value[1];
364 if (tas->hw_enabled)
365 tas_set_mixer(tas);
366 mutex_unlock(&tas->mtx);
397 struct tas *tas = snd_kcontrol_chip(kcontrol);
399 mutex_lock(&tas->mtx);
400 ucontrol->value.integer.value[0] = tas->drc_range;
401 mutex_unlock(&tas->mtx);
408 struct tas *tas = snd_kcontrol_chip(kcontrol);
414 mutex_lock(&tas->mtx);
415 if (tas->drc_range == ucontrol->value.integer.value[0]) {
416 mutex_unlock(&tas->mtx);
420 tas->drc_range = ucontrol->value.integer.value[0];
421 if (tas->hw_enabled)
422 tas3004_set_drc(tas);
423 mutex_unlock(&tas->mtx);
441 struct tas *tas = snd_kcontrol_chip(kcontrol);
443 mutex_lock(&tas->mtx);
444 ucontrol->value.integer.value[0] = tas->drc_enabled;
445 mutex_unlock(&tas->mtx);
452 struct tas *tas = snd_kcontrol_chip(kcontrol);
454 mutex_lock(&tas->mtx);
455 if (tas->drc_enabled == ucontrol->value.integer.value[0]) {
456 mutex_unlock(&tas->mtx);
460 tas->drc_enabled = !!ucontrol->value.integer.value[0];
461 if (tas->hw_enabled)
462 tas3004_set_drc(tas);
463 mutex_unlock(&tas->mtx);
487 struct tas *tas = snd_kcontrol_chip(kcontrol);
489 mutex_lock(&tas->mtx);
490 ucontrol->value.enumerated.item[0] = !!(tas->acr & TAS_ACR_INPUT_B);
491 mutex_unlock(&tas->mtx);
498 struct tas *tas = snd_kcontrol_chip(kcontrol);
503 mutex_lock(&tas->mtx);
504 oldacr = tas->acr;
511 tas->acr &= ~(TAS_ACR_INPUT_B | TAS_ACR_B_MONAUREAL);
513 tas->acr |= TAS_ACR_INPUT_B | TAS_ACR_B_MONAUREAL |
515 if (oldacr == tas->acr) {
516 mutex_unlock(&tas->mtx);
519 if (tas->hw_enabled)
520 tas_write_reg(tas, TAS_REG_ACR, 1, &tas->acr);
521 mutex_unlock(&tas->mtx);
558 struct tas *tas = snd_kcontrol_chip(kcontrol);
560 mutex_lock(&tas->mtx);
561 ucontrol->value.integer.value[0] = tas->treble;
562 mutex_unlock(&tas->mtx);
569 struct tas *tas = snd_kcontrol_chip(kcontrol);
574 mutex_lock(&tas->mtx);
575 if (tas->treble == ucontrol->value.integer.value[0]) {
576 mutex_unlock(&tas->mtx);
580 tas->treble = ucontrol->value.integer.value[0];
581 if (tas->hw_enabled)
582 tas_set_treble(tas);
583 mutex_unlock(&tas->mtx);
609 struct tas *tas = snd_kcontrol_chip(kcontrol);
611 mutex_lock(&tas->mtx);
612 ucontrol->value.integer.value[0] = tas->bass;
613 mutex_unlock(&tas->mtx);
620 struct tas *tas = snd_kcontrol_chip(kcontrol);
625 mutex_lock(&tas->mtx);
626 if (tas->bass == ucontrol->value.integer.value[0]) {
627 mutex_unlock(&tas->mtx);
631 tas->bass = ucontrol->value.integer.value[0];
632 if (tas->hw_enabled)
633 tas_set_bass(tas);
634 mutex_unlock(&tas->mtx);
670 static int tas_reset_init(struct tas *tas)
674 tas->codec.gpio->methods->all_amps_off(tas->codec.gpio);
676 tas->codec.gpio->methods->set_hw_reset(tas->codec.gpio, 0);
678 tas->codec.gpio->methods->set_hw_reset(tas->codec.gpio, 1);
680 tas->codec.gpio->methods->set_hw_reset(tas->codec.gpio, 0);
682 tas->codec.gpio->methods->all_amps_restore(tas->codec.gpio);
685 if (tas_write_reg(tas, TAS_REG_MCS, 1, &tmp))
688 tas->acr |= TAS_ACR_ANALOG_PDOWN;
689 if (tas_write_reg(tas, TAS_REG_ACR, 1, &tas->acr))
693 if (tas_write_reg(tas, TAS_REG_MCS2, 1, &tmp))
696 tas3004_set_drc(tas);
699 tas->treble = TAS3004_TREBLE_ZERO;
700 tas->bass = TAS3004_BASS_ZERO;
701 tas_set_treble(tas);
702 tas_set_bass(tas);
704 tas->acr &= ~TAS_ACR_ANALOG_PDOWN;
705 if (tas_write_reg(tas, TAS_REG_ACR, 1, &tas->acr))
715 struct tas *tas = cii->codec_data;
720 tas->codec.gpio->methods->all_amps_off(tas->codec.gpio);
721 tas->hw_enabled = 0;
725 mutex_lock(&tas->mtx);
726 tas_reset_init(tas);
727 tas_set_volume(tas);
728 tas_set_mixer(tas);
729 tas->hw_enabled = 1;
730 tas->codec.gpio->methods->all_amps_restore(tas->codec.gpio);
731 mutex_unlock(&tas->mtx);
744 static int tas_suspend(struct tas *tas)
746 mutex_lock(&tas->mtx);
747 tas->hw_enabled = 0;
748 tas->acr |= TAS_ACR_ANALOG_PDOWN;
749 tas_write_reg(tas, TAS_REG_ACR, 1, &tas->acr);
750 mutex_unlock(&tas->mtx);
754 static int tas_resume(struct tas *tas)
757 mutex_lock(&tas->mtx);
758 tas_reset_init(tas);
759 tas_set_volume(tas);
760 tas_set_mixer(tas);
761 tas->hw_enabled = 1;
762 mutex_unlock(&tas->mtx);
797 struct tas *tas = codec_to_tas(codec);
800 if (!tas->codec.gpio || !tas->codec.gpio->methods) {
805 mutex_lock(&tas->mtx);
806 if (tas_reset_init(tas)) {
807 printk(KERN_ERR PFX "tas failed to initialise\n");
808 mutex_unlock(&tas->mtx);
811 tas->hw_enabled = 1;
812 mutex_unlock(&tas->mtx);
814 if (tas->codec.soundbus_dev->attach_codec(tas->codec.soundbus_dev,
816 &tas_codec_info, tas)) {
817 printk(KERN_ERR PFX "error attaching tas to soundbus\n");
821 if (aoa_snd_device_new(SNDRV_DEV_CODEC, tas, &ops)) {
822 printk(KERN_ERR PFX "failed to create tas snd device!\n");
825 err = aoa_snd_ctl_add(snd_ctl_new1(&volume_control, tas));
829 err = aoa_snd_ctl_add(snd_ctl_new1(&mute_control, tas));
833 err = aoa_snd_ctl_add(snd_ctl_new1(&pcm1_control, tas));
837 err = aoa_snd_ctl_add(snd_ctl_new1(&monitor_control, tas));
841 err = aoa_snd_ctl_add(snd_ctl_new1(&capture_source_control, tas));
845 err = aoa_snd_ctl_add(snd_ctl_new1(&drc_range_control, tas));
849 err = aoa_snd_ctl_add(snd_ctl_new1(&drc_switch_control, tas));
853 err = aoa_snd_ctl_add(snd_ctl_new1(&treble_control, tas));
857 err = aoa_snd_ctl_add(snd_ctl_new1(&bass_control, tas));
863 tas->codec.soundbus_dev->detach_codec(tas->codec.soundbus_dev, tas);
864 snd_device_free(aoa_get_card(), tas);
870 struct tas *tas = codec_to_tas(codec);
872 if (!tas->codec.soundbus_dev)
874 tas->codec.soundbus_dev->detach_codec(tas->codec.soundbus_dev, tas);
881 struct tas *tas;
883 tas = kzalloc(sizeof(struct tas), GFP_KERNEL);
885 if (!tas)
888 mutex_init(&tas->mtx);
889 tas->i2c = client;
890 i2c_set_clientdata(client, tas);
893 tas->drc_range = TAS3004_DRC_MAX / 2;
895 strscpy(tas->codec.name, "tas", MAX_CODEC_NAME_LEN);
896 tas->codec.owner = THIS_MODULE;
897 tas->codec.init = tas_init_codec;
898 tas->codec.exit = tas_exit_codec;
899 tas->codec.node = of_node_get(node);
901 if (aoa_codec_register(&tas->codec)) {
905 "snd-aoa-codec-tas: tas found, addr 0x%02x on %pOF\n",
909 mutex_destroy(&tas->mtx);
910 kfree(tas);
916 struct tas *tas = i2c_get_clientdata(client);
919 aoa_codec_unregister(&tas->codec);
920 of_node_put(tas->codec.node);
923 tas_write_reg(tas, TAS_REG_ACR, 1, &tmp);
925 mutex_destroy(&tas->mtx);
926 kfree(tas);