2
0
mirror of https://github.com/edk2-porting/linux-next.git synced 2024-12-23 20:53:53 +08:00

[ALSA] oxygen: use an array of snd_kcontrol pointers

Use an array for the pointers to known controls so that it is easier to
add more.

Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
Clemens Ladisch 2008-01-14 08:56:01 +01:00 committed by Jaroslav Kysela
parent 7113e95812
commit 01a3affb2e
4 changed files with 28 additions and 20 deletions

View File

@ -15,6 +15,12 @@
#define PCM_AC97 5 #define PCM_AC97 5
#define PCM_COUNT 6 #define PCM_COUNT 6
enum {
CONTROL_SPDIF_PCM,
CONTROL_SPDIF_INPUT_BITS,
CONTROL_COUNT
};
#define OXYGEN_PCI_SUBID(sv, sd) \ #define OXYGEN_PCI_SUBID(sv, sd) \
.vendor = PCI_VENDOR_ID_CMEDIA, \ .vendor = PCI_VENDOR_ID_CMEDIA, \
.device = 0x8788, \ .device = 0x8788, \
@ -50,8 +56,7 @@ struct oxygen {
u32 spdif_bits; u32 spdif_bits;
u32 spdif_pcm_bits; u32 spdif_pcm_bits;
struct snd_pcm_substream *streams[PCM_COUNT]; struct snd_pcm_substream *streams[PCM_COUNT];
struct snd_kcontrol *spdif_pcm_ctl; struct snd_kcontrol *controls[CONTROL_COUNT];
struct snd_kcontrol *spdif_input_bits_ctl;
struct work_struct spdif_input_bits_work; struct work_struct spdif_input_bits_work;
}; };

View File

@ -114,7 +114,7 @@ static void oxygen_spdif_input_bits_changed(struct work_struct *work)
} }
} }
if (chip->spdif_input_bits_ctl) { if (chip->controls[CONTROL_SPDIF_INPUT_BITS]) {
spin_lock_irq(&chip->reg_lock); spin_lock_irq(&chip->reg_lock);
chip->interrupt_mask |= OXYGEN_INT_SPDIF_IN_CHANGE; chip->interrupt_mask |= OXYGEN_INT_SPDIF_IN_CHANGE;
oxygen_write16(chip, OXYGEN_INTERRUPT_MASK, oxygen_write16(chip, OXYGEN_INTERRUPT_MASK,
@ -122,7 +122,7 @@ static void oxygen_spdif_input_bits_changed(struct work_struct *work)
spin_unlock_irq(&chip->reg_lock); spin_unlock_irq(&chip->reg_lock);
snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
&chip->spdif_input_bits_ctl->id); &chip->controls[CONTROL_SPDIF_INPUT_BITS]->id);
} }
} }

View File

@ -586,15 +586,22 @@ static const struct snd_kcontrol_new controls[] = {
static void oxygen_any_ctl_free(struct snd_kcontrol *ctl) static void oxygen_any_ctl_free(struct snd_kcontrol *ctl)
{ {
struct oxygen *chip = ctl->private_data; struct oxygen *chip = ctl->private_data;
unsigned int i;
/* I'm too lazy to write a function for each control :-) */ /* I'm too lazy to write a function for each control :-) */
chip->spdif_pcm_ctl = NULL; for (i = 0; i < ARRAY_SIZE(chip->controls); ++i)
chip->spdif_input_bits_ctl = NULL; chip->controls[i] = NULL;
} }
int oxygen_mixer_init(struct oxygen *chip) int oxygen_mixer_init(struct oxygen *chip)
{ {
unsigned int i; static const char *const known_ctl_names[CONTROL_COUNT] = {
[CONTROL_SPDIF_PCM] =
SNDRV_CTL_NAME_IEC958("", PLAYBACK, PCM_STREAM),
[CONTROL_SPDIF_INPUT_BITS] =
SNDRV_CTL_NAME_IEC958("", CAPTURE, DEFAULT),
};
unsigned int i, j;
struct snd_kcontrol *ctl; struct snd_kcontrol *ctl;
int err; int err;
@ -610,15 +617,11 @@ int oxygen_mixer_init(struct oxygen *chip)
err = snd_ctl_add(chip->card, ctl); err = snd_ctl_add(chip->card, ctl);
if (err < 0) if (err < 0)
return err; return err;
if (!strcmp(ctl->id.name, for (j = 0; j < CONTROL_COUNT; ++j)
SNDRV_CTL_NAME_IEC958("", PLAYBACK, PCM_STREAM))) { if (!strcmp(ctl->id.name, known_ctl_names[j])) {
chip->spdif_pcm_ctl = ctl; chip->controls[j] = ctl;
ctl->private_free = oxygen_any_ctl_free; ctl->private_free = oxygen_any_ctl_free;
} else if (!strcmp(ctl->id.name, }
SNDRV_CTL_NAME_IEC958("", CAPTURE, DEFAULT))) {
chip->spdif_input_bits_ctl = ctl;
ctl->private_free = oxygen_any_ctl_free;
}
} }
return chip->model->mixer_init ? chip->model->mixer_init(chip) : 0; return chip->model->mixer_init ? chip->model->mixer_init(chip) : 0;
} }

View File

@ -209,11 +209,11 @@ static int oxygen_open(struct snd_pcm_substream *substream,
chip->pcm_active |= 1 << channel; chip->pcm_active |= 1 << channel;
if (channel == PCM_SPDIF) { if (channel == PCM_SPDIF) {
chip->spdif_pcm_bits = chip->spdif_bits; chip->spdif_pcm_bits = chip->spdif_bits;
chip->spdif_pcm_ctl->vd[0].access &= chip->controls[CONTROL_SPDIF_PCM]->vd[0].access &=
~SNDRV_CTL_ELEM_ACCESS_INACTIVE; ~SNDRV_CTL_ELEM_ACCESS_INACTIVE;
snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE | snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE |
SNDRV_CTL_EVENT_MASK_INFO, SNDRV_CTL_EVENT_MASK_INFO,
&chip->spdif_pcm_ctl->id); &chip->controls[CONTROL_SPDIF_PCM]->id);
} }
mutex_unlock(&chip->mutex); mutex_unlock(&chip->mutex);
@ -258,11 +258,11 @@ static int oxygen_close(struct snd_pcm_substream *substream)
mutex_lock(&chip->mutex); mutex_lock(&chip->mutex);
chip->pcm_active &= ~(1 << channel); chip->pcm_active &= ~(1 << channel);
if (channel == PCM_SPDIF) { if (channel == PCM_SPDIF) {
chip->spdif_pcm_ctl->vd[0].access |= chip->controls[CONTROL_SPDIF_PCM]->vd[0].access |=
SNDRV_CTL_ELEM_ACCESS_INACTIVE; SNDRV_CTL_ELEM_ACCESS_INACTIVE;
snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE | snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE |
SNDRV_CTL_EVENT_MASK_INFO, SNDRV_CTL_EVENT_MASK_INFO,
&chip->spdif_pcm_ctl->id); &chip->controls[CONTROL_SPDIF_PCM]->id);
} }
if (channel == PCM_SPDIF || channel == PCM_MULTICH) if (channel == PCM_SPDIF || channel == PCM_MULTICH)
oxygen_update_spdif_source(chip); oxygen_update_spdif_source(chip);