diff options
author | Clemens Ladisch <clemens@ladisch.de> | 2008-01-25 02:37:49 -0500 |
---|---|---|
committer | Jaroslav Kysela <perex@perex.cz> | 2008-01-31 11:30:14 -0500 |
commit | 976cd62700ae378df330ec82112da3d17e33a0fe (patch) | |
tree | 22d31425c0940b8d7105c4914fd944fcc3c2a8d9 | |
parent | 09189ac793d7fef7d0f058815043e3d4bf7097c0 (diff) |
[ALSA] oxygen: make the number of analog output configurable
Add a field to struct oxygen_model to allow model drivers for cards with
less than eight output channels.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
-rw-r--r-- | sound/pci/oxygen/oxygen.c | 2 | ||||
-rw-r--r-- | sound/pci/oxygen/oxygen.h | 1 | ||||
-rw-r--r-- | sound/pci/oxygen/oxygen_mixer.c | 21 | ||||
-rw-r--r-- | sound/pci/oxygen/oxygen_pcm.c | 7 | ||||
-rw-r--r-- | sound/pci/oxygen/virtuoso.c | 1 |
5 files changed, 24 insertions, 8 deletions
diff --git a/sound/pci/oxygen/oxygen.c b/sound/pci/oxygen/oxygen.c index 4f809bdc75e1..60af3a7d9824 100644 --- a/sound/pci/oxygen/oxygen.c +++ b/sound/pci/oxygen/oxygen.c | |||
@@ -350,6 +350,7 @@ static const struct oxygen_model model_generic = { | |||
350 | .update_dac_volume = update_ak4396_volume, | 350 | .update_dac_volume = update_ak4396_volume, |
351 | .update_dac_mute = update_ak4396_mute, | 351 | .update_dac_mute = update_ak4396_mute, |
352 | .model_data_size = sizeof(struct generic_data), | 352 | .model_data_size = sizeof(struct generic_data), |
353 | .dac_channels = 8, | ||
353 | .used_channels = OXYGEN_CHANNEL_A | | 354 | .used_channels = OXYGEN_CHANNEL_A | |
354 | OXYGEN_CHANNEL_C | | 355 | OXYGEN_CHANNEL_C | |
355 | OXYGEN_CHANNEL_SPDIF | | 356 | OXYGEN_CHANNEL_SPDIF | |
@@ -372,6 +373,7 @@ static const struct oxygen_model model_meridian = { | |||
372 | .update_dac_volume = update_ak4396_volume, | 373 | .update_dac_volume = update_ak4396_volume, |
373 | .update_dac_mute = update_ak4396_mute, | 374 | .update_dac_mute = update_ak4396_mute, |
374 | .model_data_size = sizeof(struct generic_data), | 375 | .model_data_size = sizeof(struct generic_data), |
376 | .dac_channels = 8, | ||
375 | .used_channels = OXYGEN_CHANNEL_B | | 377 | .used_channels = OXYGEN_CHANNEL_B | |
376 | OXYGEN_CHANNEL_C | | 378 | OXYGEN_CHANNEL_C | |
377 | OXYGEN_CHANNEL_SPDIF | | 379 | OXYGEN_CHANNEL_SPDIF | |
diff --git a/sound/pci/oxygen/oxygen.h b/sound/pci/oxygen/oxygen.h index 4894dbd28126..9ec9e6bab7d7 100644 --- a/sound/pci/oxygen/oxygen.h +++ b/sound/pci/oxygen/oxygen.h | |||
@@ -85,6 +85,7 @@ struct oxygen_model { | |||
85 | void (*update_dac_volume)(struct oxygen *chip); | 85 | void (*update_dac_volume)(struct oxygen *chip); |
86 | void (*update_dac_mute)(struct oxygen *chip); | 86 | void (*update_dac_mute)(struct oxygen *chip); |
87 | size_t model_data_size; | 87 | size_t model_data_size; |
88 | u8 dac_channels; | ||
88 | u8 used_channels; | 89 | u8 used_channels; |
89 | u8 function_flags; | 90 | u8 function_flags; |
90 | u16 dac_i2s_format; | 91 | u16 dac_i2s_format; |
diff --git a/sound/pci/oxygen/oxygen_mixer.c b/sound/pci/oxygen/oxygen_mixer.c index 6b7420fdd026..21b227a94ace 100644 --- a/sound/pci/oxygen/oxygen_mixer.c +++ b/sound/pci/oxygen/oxygen_mixer.c | |||
@@ -28,8 +28,10 @@ | |||
28 | static int dac_volume_info(struct snd_kcontrol *ctl, | 28 | static int dac_volume_info(struct snd_kcontrol *ctl, |
29 | struct snd_ctl_elem_info *info) | 29 | struct snd_ctl_elem_info *info) |
30 | { | 30 | { |
31 | struct oxygen *chip = ctl->private_data; | ||
32 | |||
31 | info->type = SNDRV_CTL_ELEM_TYPE_INTEGER; | 33 | info->type = SNDRV_CTL_ELEM_TYPE_INTEGER; |
32 | info->count = 8; | 34 | info->count = chip->model->dac_channels; |
33 | info->value.integer.min = 0; | 35 | info->value.integer.min = 0; |
34 | info->value.integer.max = 0xff; | 36 | info->value.integer.max = 0xff; |
35 | return 0; | 37 | return 0; |
@@ -42,7 +44,7 @@ static int dac_volume_get(struct snd_kcontrol *ctl, | |||
42 | unsigned int i; | 44 | unsigned int i; |
43 | 45 | ||
44 | mutex_lock(&chip->mutex); | 46 | mutex_lock(&chip->mutex); |
45 | for (i = 0; i < 8; ++i) | 47 | for (i = 0; i < chip->model->dac_channels; ++i) |
46 | value->value.integer.value[i] = chip->dac_volume[i]; | 48 | value->value.integer.value[i] = chip->dac_volume[i]; |
47 | mutex_unlock(&chip->mutex); | 49 | mutex_unlock(&chip->mutex); |
48 | return 0; | 50 | return 0; |
@@ -57,7 +59,7 @@ static int dac_volume_put(struct snd_kcontrol *ctl, | |||
57 | 59 | ||
58 | changed = 0; | 60 | changed = 0; |
59 | mutex_lock(&chip->mutex); | 61 | mutex_lock(&chip->mutex); |
60 | for (i = 0; i < 8; ++i) | 62 | for (i = 0; i < chip->model->dac_channels; ++i) |
61 | if (value->value.integer.value[i] != chip->dac_volume[i]) { | 63 | if (value->value.integer.value[i] != chip->dac_volume[i]) { |
62 | chip->dac_volume[i] = value->value.integer.value[i]; | 64 | chip->dac_volume[i] = value->value.integer.value[i]; |
63 | changed = 1; | 65 | changed = 1; |
@@ -100,11 +102,14 @@ static int upmix_info(struct snd_kcontrol *ctl, struct snd_ctl_elem_info *info) | |||
100 | static const char *const names[3] = { | 102 | static const char *const names[3] = { |
101 | "Front", "Front+Surround", "Front+Surround+Back" | 103 | "Front", "Front+Surround", "Front+Surround+Back" |
102 | }; | 104 | }; |
105 | struct oxygen *chip = ctl->private_data; | ||
106 | unsigned int count = 2 + (chip->model->dac_channels == 8); | ||
107 | |||
103 | info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; | 108 | info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; |
104 | info->count = 1; | 109 | info->count = 1; |
105 | info->value.enumerated.items = 3; | 110 | info->value.enumerated.items = count; |
106 | if (info->value.enumerated.item > 2) | 111 | if (info->value.enumerated.item >= count) |
107 | info->value.enumerated.item = 2; | 112 | info->value.enumerated.item = count - 1; |
108 | strcpy(info->value.enumerated.name, names[info->value.enumerated.item]); | 113 | strcpy(info->value.enumerated.name, names[info->value.enumerated.item]); |
109 | return 0; | 114 | return 0; |
110 | } | 115 | } |
@@ -167,12 +172,14 @@ void oxygen_update_dac_routing(struct oxygen *chip) | |||
167 | static int upmix_put(struct snd_kcontrol *ctl, struct snd_ctl_elem_value *value) | 172 | static int upmix_put(struct snd_kcontrol *ctl, struct snd_ctl_elem_value *value) |
168 | { | 173 | { |
169 | struct oxygen *chip = ctl->private_data; | 174 | struct oxygen *chip = ctl->private_data; |
175 | unsigned int count = 2 + (chip->model->dac_channels == 8); | ||
170 | int changed; | 176 | int changed; |
171 | 177 | ||
172 | mutex_lock(&chip->mutex); | 178 | mutex_lock(&chip->mutex); |
173 | changed = value->value.enumerated.item[0] != chip->dac_routing; | 179 | changed = value->value.enumerated.item[0] != chip->dac_routing; |
174 | if (changed) { | 180 | if (changed) { |
175 | chip->dac_routing = min(value->value.enumerated.item[0], 2u); | 181 | chip->dac_routing = min(value->value.enumerated.item[0], |
182 | count - 1); | ||
176 | spin_lock_irq(&chip->reg_lock); | 183 | spin_lock_irq(&chip->reg_lock); |
177 | oxygen_update_dac_routing(chip); | 184 | oxygen_update_dac_routing(chip); |
178 | spin_unlock_irq(&chip->reg_lock); | 185 | spin_unlock_irq(&chip->reg_lock); |
diff --git a/sound/pci/oxygen/oxygen_pcm.c b/sound/pci/oxygen/oxygen_pcm.c index 2785660957d0..df1d0cae1dad 100644 --- a/sound/pci/oxygen/oxygen_pcm.c +++ b/sound/pci/oxygen/oxygen_pcm.c | |||
@@ -119,10 +119,15 @@ static int oxygen_open(struct snd_pcm_substream *substream, | |||
119 | 119 | ||
120 | runtime->private_data = (void *)(uintptr_t)channel; | 120 | runtime->private_data = (void *)(uintptr_t)channel; |
121 | runtime->hw = *oxygen_hardware[channel]; | 121 | runtime->hw = *oxygen_hardware[channel]; |
122 | if (channel == PCM_C) { | 122 | switch (channel) { |
123 | case PCM_C: | ||
123 | runtime->hw.rates &= ~(SNDRV_PCM_RATE_32000 | | 124 | runtime->hw.rates &= ~(SNDRV_PCM_RATE_32000 | |
124 | SNDRV_PCM_RATE_64000); | 125 | SNDRV_PCM_RATE_64000); |
125 | runtime->hw.rate_min = 44100; | 126 | runtime->hw.rate_min = 44100; |
127 | break; | ||
128 | case PCM_MULTICH: | ||
129 | runtime->hw.channels_max = chip->model->dac_channels; | ||
130 | break; | ||
126 | } | 131 | } |
127 | if (chip->model->pcm_hardware_filter) | 132 | if (chip->model->pcm_hardware_filter) |
128 | chip->model->pcm_hardware_filter(channel, &runtime->hw); | 133 | chip->model->pcm_hardware_filter(channel, &runtime->hw); |
diff --git a/sound/pci/oxygen/virtuoso.c b/sound/pci/oxygen/virtuoso.c index 7b240c778759..665115d23627 100644 --- a/sound/pci/oxygen/virtuoso.c +++ b/sound/pci/oxygen/virtuoso.c | |||
@@ -310,6 +310,7 @@ static const struct oxygen_model model_xonar = { | |||
310 | .set_adc_params = set_cs5381_params, | 310 | .set_adc_params = set_cs5381_params, |
311 | .update_dac_volume = update_pcm1796_volume, | 311 | .update_dac_volume = update_pcm1796_volume, |
312 | .update_dac_mute = update_pcm1796_mute, | 312 | .update_dac_mute = update_pcm1796_mute, |
313 | .dac_channels = 8, | ||
313 | .used_channels = OXYGEN_CHANNEL_B | | 314 | .used_channels = OXYGEN_CHANNEL_B | |
314 | OXYGEN_CHANNEL_C | | 315 | OXYGEN_CHANNEL_C | |
315 | OXYGEN_CHANNEL_SPDIF | | 316 | OXYGEN_CHANNEL_SPDIF | |