.update_dac_volume = update_ak4396_volume,
.update_dac_mute = update_ak4396_mute,
.model_data_size = sizeof(struct generic_data),
+ .dac_channels = 8,
.used_channels = OXYGEN_CHANNEL_A |
OXYGEN_CHANNEL_C |
OXYGEN_CHANNEL_SPDIF |
.update_dac_volume = update_ak4396_volume,
.update_dac_mute = update_ak4396_mute,
.model_data_size = sizeof(struct generic_data),
+ .dac_channels = 8,
.used_channels = OXYGEN_CHANNEL_B |
OXYGEN_CHANNEL_C |
OXYGEN_CHANNEL_SPDIF |
static int dac_volume_info(struct snd_kcontrol *ctl,
struct snd_ctl_elem_info *info)
{
+ struct oxygen *chip = ctl->private_data;
+
info->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
- info->count = 8;
+ info->count = chip->model->dac_channels;
info->value.integer.min = 0;
info->value.integer.max = 0xff;
return 0;
unsigned int i;
mutex_lock(&chip->mutex);
- for (i = 0; i < 8; ++i)
+ for (i = 0; i < chip->model->dac_channels; ++i)
value->value.integer.value[i] = chip->dac_volume[i];
mutex_unlock(&chip->mutex);
return 0;
changed = 0;
mutex_lock(&chip->mutex);
- for (i = 0; i < 8; ++i)
+ for (i = 0; i < chip->model->dac_channels; ++i)
if (value->value.integer.value[i] != chip->dac_volume[i]) {
chip->dac_volume[i] = value->value.integer.value[i];
changed = 1;
static const char *const names[3] = {
"Front", "Front+Surround", "Front+Surround+Back"
};
+ struct oxygen *chip = ctl->private_data;
+ unsigned int count = 2 + (chip->model->dac_channels == 8);
+
info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
info->count = 1;
- info->value.enumerated.items = 3;
- if (info->value.enumerated.item > 2)
- info->value.enumerated.item = 2;
+ info->value.enumerated.items = count;
+ if (info->value.enumerated.item >= count)
+ info->value.enumerated.item = count - 1;
strcpy(info->value.enumerated.name, names[info->value.enumerated.item]);
return 0;
}
static int upmix_put(struct snd_kcontrol *ctl, struct snd_ctl_elem_value *value)
{
struct oxygen *chip = ctl->private_data;
+ unsigned int count = 2 + (chip->model->dac_channels == 8);
int changed;
mutex_lock(&chip->mutex);
changed = value->value.enumerated.item[0] != chip->dac_routing;
if (changed) {
- chip->dac_routing = min(value->value.enumerated.item[0], 2u);
+ chip->dac_routing = min(value->value.enumerated.item[0],
+ count - 1);
spin_lock_irq(&chip->reg_lock);
oxygen_update_dac_routing(chip);
spin_unlock_irq(&chip->reg_lock);
runtime->private_data = (void *)(uintptr_t)channel;
runtime->hw = *oxygen_hardware[channel];
- if (channel == PCM_C) {
+ switch (channel) {
+ case PCM_C:
runtime->hw.rates &= ~(SNDRV_PCM_RATE_32000 |
SNDRV_PCM_RATE_64000);
runtime->hw.rate_min = 44100;
+ break;
+ case PCM_MULTICH:
+ runtime->hw.channels_max = chip->model->dac_channels;
+ break;
}
if (chip->model->pcm_hardware_filter)
chip->model->pcm_hardware_filter(channel, &runtime->hw);