diff options
Diffstat (limited to 'sound/aoa')
-rw-r--r-- | sound/aoa/codecs/snd-aoa-codec-tas.c | 95 |
1 files changed, 94 insertions, 1 deletions
diff --git a/sound/aoa/codecs/snd-aoa-codec-tas.c b/sound/aoa/codecs/snd-aoa-codec-tas.c index 23643b342cb0..009f57576f9c 100644 --- a/sound/aoa/codecs/snd-aoa-codec-tas.c +++ b/sound/aoa/codecs/snd-aoa-codec-tas.c | |||
@@ -342,6 +342,90 @@ static struct snd_kcontrol_new n##_control = { \ | |||
342 | MIXER_CONTROL(pcm1, "PCM", 0); | 342 | MIXER_CONTROL(pcm1, "PCM", 0); |
343 | MIXER_CONTROL(monitor, "Monitor", 2); | 343 | MIXER_CONTROL(monitor, "Monitor", 2); |
344 | 344 | ||
345 | static int tas_snd_drc_range_info(struct snd_kcontrol *kcontrol, | ||
346 | struct snd_ctl_elem_info *uinfo) | ||
347 | { | ||
348 | uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; | ||
349 | uinfo->count = 1; | ||
350 | uinfo->value.integer.min = 0; | ||
351 | uinfo->value.integer.max = TAS3004_DRC_MAX; | ||
352 | return 0; | ||
353 | } | ||
354 | |||
355 | static int tas_snd_drc_range_get(struct snd_kcontrol *kcontrol, | ||
356 | struct snd_ctl_elem_value *ucontrol) | ||
357 | { | ||
358 | struct tas *tas = snd_kcontrol_chip(kcontrol); | ||
359 | |||
360 | ucontrol->value.integer.value[0] = tas->drc_range; | ||
361 | return 0; | ||
362 | } | ||
363 | |||
364 | static int tas_snd_drc_range_put(struct snd_kcontrol *kcontrol, | ||
365 | struct snd_ctl_elem_value *ucontrol) | ||
366 | { | ||
367 | struct tas *tas = snd_kcontrol_chip(kcontrol); | ||
368 | |||
369 | if (tas->drc_range == ucontrol->value.integer.value[0]) | ||
370 | return 0; | ||
371 | |||
372 | tas->drc_range = ucontrol->value.integer.value[0]; | ||
373 | if (tas->hw_enabled) | ||
374 | tas3004_set_drc(tas); | ||
375 | return 1; | ||
376 | } | ||
377 | |||
378 | static struct snd_kcontrol_new drc_range_control = { | ||
379 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | ||
380 | .name = "DRC Range", | ||
381 | .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, | ||
382 | .info = tas_snd_drc_range_info, | ||
383 | .get = tas_snd_drc_range_get, | ||
384 | .put = tas_snd_drc_range_put, | ||
385 | }; | ||
386 | |||
387 | static int tas_snd_drc_switch_info(struct snd_kcontrol *kcontrol, | ||
388 | struct snd_ctl_elem_info *uinfo) | ||
389 | { | ||
390 | uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; | ||
391 | uinfo->count = 1; | ||
392 | uinfo->value.integer.min = 0; | ||
393 | uinfo->value.integer.max = 1; | ||
394 | return 0; | ||
395 | } | ||
396 | |||
397 | static int tas_snd_drc_switch_get(struct snd_kcontrol *kcontrol, | ||
398 | struct snd_ctl_elem_value *ucontrol) | ||
399 | { | ||
400 | struct tas *tas = snd_kcontrol_chip(kcontrol); | ||
401 | |||
402 | ucontrol->value.integer.value[0] = tas->drc_enabled; | ||
403 | return 0; | ||
404 | } | ||
405 | |||
406 | static int tas_snd_drc_switch_put(struct snd_kcontrol *kcontrol, | ||
407 | struct snd_ctl_elem_value *ucontrol) | ||
408 | { | ||
409 | struct tas *tas = snd_kcontrol_chip(kcontrol); | ||
410 | |||
411 | if (tas->drc_enabled == ucontrol->value.integer.value[0]) | ||
412 | return 0; | ||
413 | |||
414 | tas->drc_enabled = ucontrol->value.integer.value[0]; | ||
415 | if (tas->hw_enabled) | ||
416 | tas3004_set_drc(tas); | ||
417 | return 1; | ||
418 | } | ||
419 | |||
420 | static struct snd_kcontrol_new drc_switch_control = { | ||
421 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | ||
422 | .name = "DRC Range Switch", | ||
423 | .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, | ||
424 | .info = tas_snd_drc_switch_info, | ||
425 | .get = tas_snd_drc_switch_get, | ||
426 | .put = tas_snd_drc_switch_put, | ||
427 | }; | ||
428 | |||
345 | static int tas_snd_capture_source_info(struct snd_kcontrol *kcontrol, | 429 | static int tas_snd_capture_source_info(struct snd_kcontrol *kcontrol, |
346 | struct snd_ctl_elem_info *uinfo) | 430 | struct snd_ctl_elem_info *uinfo) |
347 | { | 431 | { |
@@ -590,6 +674,14 @@ static int tas_init_codec(struct aoa_codec *codec) | |||
590 | if (err) | 674 | if (err) |
591 | goto error; | 675 | goto error; |
592 | 676 | ||
677 | err = aoa_snd_ctl_add(snd_ctl_new1(&drc_range_control, tas)); | ||
678 | if (err) | ||
679 | goto error; | ||
680 | |||
681 | err = aoa_snd_ctl_add(snd_ctl_new1(&drc_switch_control, tas)); | ||
682 | if (err) | ||
683 | goto error; | ||
684 | |||
593 | return 0; | 685 | return 0; |
594 | error: | 686 | error: |
595 | tas->codec.soundbus_dev->detach_codec(tas->codec.soundbus_dev, tas); | 687 | tas->codec.soundbus_dev->detach_codec(tas->codec.soundbus_dev, tas); |
@@ -623,7 +715,8 @@ static int tas_create(struct i2c_adapter *adapter, | |||
623 | tas->i2c.driver = &tas_driver; | 715 | tas->i2c.driver = &tas_driver; |
624 | tas->i2c.adapter = adapter; | 716 | tas->i2c.adapter = adapter; |
625 | tas->i2c.addr = addr; | 717 | tas->i2c.addr = addr; |
626 | tas->drc_range = TAS3004_DRC_MAX; | 718 | /* seems that half is a saner default */ |
719 | tas->drc_range = TAS3004_DRC_MAX / 2; | ||
627 | strlcpy(tas->i2c.name, "tas audio codec", I2C_NAME_SIZE-1); | 720 | strlcpy(tas->i2c.name, "tas audio codec", I2C_NAME_SIZE-1); |
628 | 721 | ||
629 | if (i2c_attach_client(&tas->i2c)) { | 722 | if (i2c_attach_client(&tas->i2c)) { |