|
@@ -23,6 +23,7 @@
|
|
#include <sound/driver.h>
|
|
#include <sound/driver.h>
|
|
#include <sound/core.h>
|
|
#include <sound/core.h>
|
|
#include <sound/control.h>
|
|
#include <sound/control.h>
|
|
|
|
+#include <sound/tlv.h>
|
|
#include <sound/vx_core.h>
|
|
#include <sound/vx_core.h>
|
|
#include "vx_cmd.h"
|
|
#include "vx_cmd.h"
|
|
|
|
|
|
@@ -455,10 +456,13 @@ static int vx_output_level_put(struct snd_kcontrol *kcontrol, struct snd_ctl_ele
|
|
|
|
|
|
static struct snd_kcontrol_new vx_control_output_level = {
|
|
static struct snd_kcontrol_new vx_control_output_level = {
|
|
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
|
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
|
|
|
+ .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE |
|
|
|
|
+ SNDRV_CTL_ELEM_ACCESS_TLV_READ),
|
|
.name = "Master Playback Volume",
|
|
.name = "Master Playback Volume",
|
|
.info = vx_output_level_info,
|
|
.info = vx_output_level_info,
|
|
.get = vx_output_level_get,
|
|
.get = vx_output_level_get,
|
|
.put = vx_output_level_put,
|
|
.put = vx_output_level_put,
|
|
|
|
+ /* tlv will be filled later */
|
|
};
|
|
};
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -712,12 +716,17 @@ static int vx_monitor_sw_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static DECLARE_TLV_DB_SCALE(db_scale_audio_gain, -10975, 25, 0);
|
|
|
|
+
|
|
static struct snd_kcontrol_new vx_control_audio_gain = {
|
|
static struct snd_kcontrol_new vx_control_audio_gain = {
|
|
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
|
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
|
|
|
+ .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE |
|
|
|
|
+ SNDRV_CTL_ELEM_ACCESS_TLV_READ),
|
|
/* name will be filled later */
|
|
/* name will be filled later */
|
|
.info = vx_audio_gain_info,
|
|
.info = vx_audio_gain_info,
|
|
.get = vx_audio_gain_get,
|
|
.get = vx_audio_gain_get,
|
|
- .put = vx_audio_gain_put
|
|
|
|
|
|
+ .put = vx_audio_gain_put,
|
|
|
|
+ .tlv = { .p = db_scale_audio_gain },
|
|
};
|
|
};
|
|
static struct snd_kcontrol_new vx_control_output_switch = {
|
|
static struct snd_kcontrol_new vx_control_output_switch = {
|
|
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
|
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
|
@@ -729,9 +738,12 @@ static struct snd_kcontrol_new vx_control_output_switch = {
|
|
static struct snd_kcontrol_new vx_control_monitor_gain = {
|
|
static struct snd_kcontrol_new vx_control_monitor_gain = {
|
|
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
|
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
|
.name = "Monitoring Volume",
|
|
.name = "Monitoring Volume",
|
|
|
|
+ .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE |
|
|
|
|
+ SNDRV_CTL_ELEM_ACCESS_TLV_READ),
|
|
.info = vx_audio_gain_info, /* shared */
|
|
.info = vx_audio_gain_info, /* shared */
|
|
.get = vx_audio_monitor_get,
|
|
.get = vx_audio_monitor_get,
|
|
- .put = vx_audio_monitor_put
|
|
|
|
|
|
+ .put = vx_audio_monitor_put,
|
|
|
|
+ .tlv = { .p = db_scale_audio_gain },
|
|
};
|
|
};
|
|
static struct snd_kcontrol_new vx_control_monitor_switch = {
|
|
static struct snd_kcontrol_new vx_control_monitor_switch = {
|
|
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
|
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
|
@@ -918,6 +930,7 @@ int snd_vx_mixer_new(struct vx_core *chip)
|
|
for (i = 0; i < chip->hw->num_outs; i++) {
|
|
for (i = 0; i < chip->hw->num_outs; i++) {
|
|
temp = vx_control_output_level;
|
|
temp = vx_control_output_level;
|
|
temp.index = i;
|
|
temp.index = i;
|
|
|
|
+ temp.tlv.p = chip->hw->output_level_db_scale;
|
|
if ((err = snd_ctl_add(card, snd_ctl_new1(&temp, chip))) < 0)
|
|
if ((err = snd_ctl_add(card, snd_ctl_new1(&temp, chip))) < 0)
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|