Loading sound/pci/oxygen/oxygen.h +7 −2 Original line number Diff line number Diff line Loading @@ -15,6 +15,12 @@ #define PCM_AC97 5 #define PCM_COUNT 6 enum { CONTROL_SPDIF_PCM, CONTROL_SPDIF_INPUT_BITS, CONTROL_COUNT }; #define OXYGEN_PCI_SUBID(sv, sd) \ .vendor = PCI_VENDOR_ID_CMEDIA, \ .device = 0x8788, \ Loading Loading @@ -50,8 +56,7 @@ struct oxygen { u32 spdif_bits; u32 spdif_pcm_bits; struct snd_pcm_substream *streams[PCM_COUNT]; struct snd_kcontrol *spdif_pcm_ctl; struct snd_kcontrol *spdif_input_bits_ctl; struct snd_kcontrol *controls[CONTROL_COUNT]; struct work_struct spdif_input_bits_work; }; Loading sound/pci/oxygen/oxygen_lib.c +2 −2 Original line number Diff line number Diff line Loading @@ -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); chip->interrupt_mask |= OXYGEN_INT_SPDIF_IN_CHANGE; oxygen_write16(chip, OXYGEN_INTERRUPT_MASK, Loading @@ -122,7 +122,7 @@ static void oxygen_spdif_input_bits_changed(struct work_struct *work) spin_unlock_irq(&chip->reg_lock); snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, &chip->spdif_input_bits_ctl->id); &chip->controls[CONTROL_SPDIF_INPUT_BITS]->id); } } Loading sound/pci/oxygen/oxygen_mixer.c +15 −12 Original line number Diff line number Diff line Loading @@ -586,15 +586,22 @@ static const struct snd_kcontrol_new controls[] = { static void oxygen_any_ctl_free(struct snd_kcontrol *ctl) { struct oxygen *chip = ctl->private_data; unsigned int i; /* I'm too lazy to write a function for each control :-) */ chip->spdif_pcm_ctl = NULL; chip->spdif_input_bits_ctl = NULL; for (i = 0; i < ARRAY_SIZE(chip->controls); ++i) chip->controls[i] = NULL; } 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; int err; Loading @@ -610,13 +617,9 @@ int oxygen_mixer_init(struct oxygen *chip) err = snd_ctl_add(chip->card, ctl); if (err < 0) return err; if (!strcmp(ctl->id.name, SNDRV_CTL_NAME_IEC958("", PLAYBACK, PCM_STREAM))) { chip->spdif_pcm_ctl = ctl; 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; for (j = 0; j < CONTROL_COUNT; ++j) if (!strcmp(ctl->id.name, known_ctl_names[j])) { chip->controls[j] = ctl; ctl->private_free = oxygen_any_ctl_free; } } Loading sound/pci/oxygen/oxygen_pcm.c +4 −4 Original line number Diff line number Diff line Loading @@ -209,11 +209,11 @@ static int oxygen_open(struct snd_pcm_substream *substream, chip->pcm_active |= 1 << channel; if (channel == PCM_SPDIF) { 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; snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE | SNDRV_CTL_EVENT_MASK_INFO, &chip->spdif_pcm_ctl->id); &chip->controls[CONTROL_SPDIF_PCM]->id); } mutex_unlock(&chip->mutex); Loading Loading @@ -258,11 +258,11 @@ static int oxygen_close(struct snd_pcm_substream *substream) mutex_lock(&chip->mutex); chip->pcm_active &= ~(1 << channel); if (channel == PCM_SPDIF) { chip->spdif_pcm_ctl->vd[0].access |= chip->controls[CONTROL_SPDIF_PCM]->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE; snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE | SNDRV_CTL_EVENT_MASK_INFO, &chip->spdif_pcm_ctl->id); &chip->controls[CONTROL_SPDIF_PCM]->id); } if (channel == PCM_SPDIF || channel == PCM_MULTICH) oxygen_update_spdif_source(chip); Loading Loading
sound/pci/oxygen/oxygen.h +7 −2 Original line number Diff line number Diff line Loading @@ -15,6 +15,12 @@ #define PCM_AC97 5 #define PCM_COUNT 6 enum { CONTROL_SPDIF_PCM, CONTROL_SPDIF_INPUT_BITS, CONTROL_COUNT }; #define OXYGEN_PCI_SUBID(sv, sd) \ .vendor = PCI_VENDOR_ID_CMEDIA, \ .device = 0x8788, \ Loading Loading @@ -50,8 +56,7 @@ struct oxygen { u32 spdif_bits; u32 spdif_pcm_bits; struct snd_pcm_substream *streams[PCM_COUNT]; struct snd_kcontrol *spdif_pcm_ctl; struct snd_kcontrol *spdif_input_bits_ctl; struct snd_kcontrol *controls[CONTROL_COUNT]; struct work_struct spdif_input_bits_work; }; Loading
sound/pci/oxygen/oxygen_lib.c +2 −2 Original line number Diff line number Diff line Loading @@ -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); chip->interrupt_mask |= OXYGEN_INT_SPDIF_IN_CHANGE; oxygen_write16(chip, OXYGEN_INTERRUPT_MASK, Loading @@ -122,7 +122,7 @@ static void oxygen_spdif_input_bits_changed(struct work_struct *work) spin_unlock_irq(&chip->reg_lock); snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, &chip->spdif_input_bits_ctl->id); &chip->controls[CONTROL_SPDIF_INPUT_BITS]->id); } } Loading
sound/pci/oxygen/oxygen_mixer.c +15 −12 Original line number Diff line number Diff line Loading @@ -586,15 +586,22 @@ static const struct snd_kcontrol_new controls[] = { static void oxygen_any_ctl_free(struct snd_kcontrol *ctl) { struct oxygen *chip = ctl->private_data; unsigned int i; /* I'm too lazy to write a function for each control :-) */ chip->spdif_pcm_ctl = NULL; chip->spdif_input_bits_ctl = NULL; for (i = 0; i < ARRAY_SIZE(chip->controls); ++i) chip->controls[i] = NULL; } 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; int err; Loading @@ -610,13 +617,9 @@ int oxygen_mixer_init(struct oxygen *chip) err = snd_ctl_add(chip->card, ctl); if (err < 0) return err; if (!strcmp(ctl->id.name, SNDRV_CTL_NAME_IEC958("", PLAYBACK, PCM_STREAM))) { chip->spdif_pcm_ctl = ctl; 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; for (j = 0; j < CONTROL_COUNT; ++j) if (!strcmp(ctl->id.name, known_ctl_names[j])) { chip->controls[j] = ctl; ctl->private_free = oxygen_any_ctl_free; } } Loading
sound/pci/oxygen/oxygen_pcm.c +4 −4 Original line number Diff line number Diff line Loading @@ -209,11 +209,11 @@ static int oxygen_open(struct snd_pcm_substream *substream, chip->pcm_active |= 1 << channel; if (channel == PCM_SPDIF) { 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; snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE | SNDRV_CTL_EVENT_MASK_INFO, &chip->spdif_pcm_ctl->id); &chip->controls[CONTROL_SPDIF_PCM]->id); } mutex_unlock(&chip->mutex); Loading Loading @@ -258,11 +258,11 @@ static int oxygen_close(struct snd_pcm_substream *substream) mutex_lock(&chip->mutex); chip->pcm_active &= ~(1 << channel); if (channel == PCM_SPDIF) { chip->spdif_pcm_ctl->vd[0].access |= chip->controls[CONTROL_SPDIF_PCM]->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE; snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE | SNDRV_CTL_EVENT_MASK_INFO, &chip->spdif_pcm_ctl->id); &chip->controls[CONTROL_SPDIF_PCM]->id); } if (channel == PCM_SPDIF || channel == PCM_MULTICH) oxygen_update_spdif_source(chip); Loading