diff mbox

ALSA: emu10k1: add toggles for E-mu 1010 optical ports

Message ID 20150411095245.GA12192@zerfleddert.de (mailing list archive)
State New, archived
Headers show

Commit Message

Michael Gernoth April 11, 2015, 9:52 a.m. UTC
The optical ports on the E-mu 1010 (and dock) can be configured
for ADAT- or SP/DIF-mode, which is currently hardcoded to ADAT.
Add two mixer elements to expose this setting.
Tested on an E-mu 1010 PCIe with connected micro dock.

Signed-off-by: Michael Gernoth <michael@gernoth.net>
---
 sound/pci/emu10k1/emumixer.c | 120 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 120 insertions(+)

Comments

Takashi Iwai April 11, 2015, 3:29 p.m. UTC | #1
At Sat, 11 Apr 2015 11:52:45 +0200,
Michael Gernoth wrote:
> 
> The optical ports on the E-mu 1010 (and dock) can be configured
> for ADAT- or SP/DIF-mode, which is currently hardcoded to ADAT.
> Add two mixer elements to expose this setting.
> Tested on an E-mu 1010 PCIe with connected micro dock.
> 
> Signed-off-by: Michael Gernoth <michael@gernoth.net>

The changes look OK, but could you fix what checkpatch.pl complains,
at least the errors?


thanks,

Takashi

> ---
>  sound/pci/emu10k1/emumixer.c | 120 +++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 120 insertions(+)
> 
> diff --git a/sound/pci/emu10k1/emumixer.c b/sound/pci/emu10k1/emumixer.c
> index 1de3302..e0d6053 100644
> --- a/sound/pci/emu10k1/emumixer.c
> +++ b/sound/pci/emu10k1/emumixer.c
> @@ -806,6 +806,110 @@ static struct snd_kcontrol_new snd_emu1010_internal_clock =
>  	.put =          snd_emu1010_internal_clock_put
>  };
>  
> +static int snd_emu1010_optical_out_info(struct snd_kcontrol *kcontrol,
> +					  struct snd_ctl_elem_info *uinfo)
> +{
> +	static const char * const texts[2] = {
> +		"SPDIF", "ADAT"
> +	};
> +
> +	return snd_ctl_enum_info(uinfo, 1, 2, texts);
> +}
> +
> +static int snd_emu1010_optical_out_get(struct snd_kcontrol *kcontrol,
> +					struct snd_ctl_elem_value *ucontrol)
> +{
> +	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
> +
> +	ucontrol->value.enumerated.item[0] = emu->emu1010.optical_out;
> +	return 0;
> +}
> +
> +static int snd_emu1010_optical_out_put(struct snd_kcontrol *kcontrol,
> +					struct snd_ctl_elem_value *ucontrol)
> +{
> +	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
> +	unsigned int val;
> +	u32 tmp;
> +	int change = 0;
> +
> +	val = ucontrol->value.enumerated.item[0] ;
> +	/* Limit: uinfo->value.enumerated.items = 2; */
> +	if (val >= 2)
> +		return -EINVAL;
> +	change = (emu->emu1010.optical_out != val);
> +	if (change) {
> +		emu->emu1010.optical_out = val;
> +		tmp = (emu->emu1010.optical_in ? EMU_HANA_OPTICAL_IN_ADAT : 0) |
> +			(emu->emu1010.optical_out ? EMU_HANA_OPTICAL_OUT_ADAT : 0);
> +		snd_emu1010_fpga_write(emu, EMU_HANA_OPTICAL_TYPE, tmp);
> +	}
> +        return change;
> +}
> +
> +static struct snd_kcontrol_new snd_emu1010_optical_out =
> +{
> +	.access =	SNDRV_CTL_ELEM_ACCESS_READWRITE,
> +	.iface =        SNDRV_CTL_ELEM_IFACE_MIXER,
> +	.name =         "Optical Output Mode",
> +	.count =	1,
> +	.info =         snd_emu1010_optical_out_info,
> +	.get =          snd_emu1010_optical_out_get,
> +	.put =          snd_emu1010_optical_out_put
> +};
> +
> +static int snd_emu1010_optical_in_info(struct snd_kcontrol *kcontrol,
> +					  struct snd_ctl_elem_info *uinfo)
> +{
> +	static const char * const texts[2] = {
> +		"SPDIF", "ADAT"
> +	};
> +
> +	return snd_ctl_enum_info(uinfo, 1, 2, texts);
> +}
> +
> +static int snd_emu1010_optical_in_get(struct snd_kcontrol *kcontrol,
> +					struct snd_ctl_elem_value *ucontrol)
> +{
> +	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
> +
> +	ucontrol->value.enumerated.item[0] = emu->emu1010.optical_in;
> +	return 0;
> +}
> +
> +static int snd_emu1010_optical_in_put(struct snd_kcontrol *kcontrol,
> +					struct snd_ctl_elem_value *ucontrol)
> +{
> +	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
> +	unsigned int val;
> +	u32 tmp;
> +	int change = 0;
> +
> +	val = ucontrol->value.enumerated.item[0] ;
> +	/* Limit: uinfo->value.enumerated.items = 2; */
> +	if (val >= 2)
> +		return -EINVAL;
> +	change = (emu->emu1010.optical_in != val);
> +	if (change) {
> +		emu->emu1010.optical_in = val;
> +		tmp = (emu->emu1010.optical_in ? EMU_HANA_OPTICAL_IN_ADAT : 0) |
> +			(emu->emu1010.optical_out ? EMU_HANA_OPTICAL_OUT_ADAT : 0);
> +		snd_emu1010_fpga_write(emu, EMU_HANA_OPTICAL_TYPE, tmp);
> +	}
> +        return change;
> +}
> +
> +static struct snd_kcontrol_new snd_emu1010_optical_in =
> +{
> +	.access =	SNDRV_CTL_ELEM_ACCESS_READWRITE,
> +	.iface =        SNDRV_CTL_ELEM_IFACE_MIXER,
> +	.name =         "Optical Input Mode",
> +	.count =	1,
> +	.info =         snd_emu1010_optical_in_info,
> +	.get =          snd_emu1010_optical_in_get,
> +	.put =          snd_emu1010_optical_in_put
> +};
> +
>  static int snd_audigy_i2c_capture_source_info(struct snd_kcontrol *kcontrol,
>  					  struct snd_ctl_elem_info *uinfo)
>  {
> @@ -2051,6 +2155,14 @@ int snd_emu10k1_mixer(struct snd_emu10k1 *emu,
>  			snd_ctl_new1(&snd_emu1010_internal_clock, emu));
>  		if (err < 0)
>  			return err;
> +		err = snd_ctl_add(card,
> +			snd_ctl_new1(&snd_emu1010_optical_out, emu));
> +		if (err < 0)
> +			return err;
> +		err = snd_ctl_add(card,
> +			snd_ctl_new1(&snd_emu1010_optical_in, emu));
> +		if (err < 0)
> +			return err;
>  
>  	} else if (emu->card_capabilities->emu_model) {
>  		/* all other e-mu cards for now */
> @@ -2086,6 +2198,14 @@ int snd_emu10k1_mixer(struct snd_emu10k1 *emu,
>  			snd_ctl_new1(&snd_emu1010_internal_clock, emu));
>  		if (err < 0)
>  			return err;
> +		err = snd_ctl_add(card,
> +			snd_ctl_new1(&snd_emu1010_optical_out, emu));
> +		if (err < 0)
> +			return err;
> +		err = snd_ctl_add(card,
> +			snd_ctl_new1(&snd_emu1010_optical_in, emu));
> +		if (err < 0)
> +			return err;
>  	}
>  
>  	if ( emu->card_capabilities->i2c_adc) {
> -- 
> 2.1.4
> 
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel@alsa-project.org
> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
>
Michael Gernoth April 11, 2015, 3:56 p.m. UTC | #2
On Sat, Apr 11, 2015 at 05:29:03PM +0200, Takashi Iwai wrote:
> The changes look OK, but could you fix what checkpatch.pl complains,
> at least the errors?

Yes, sorry. I forgot to run checkpatch.
I will post a new version shortly.

Thanks,
  Michael
diff mbox

Patch

diff --git a/sound/pci/emu10k1/emumixer.c b/sound/pci/emu10k1/emumixer.c
index 1de3302..e0d6053 100644
--- a/sound/pci/emu10k1/emumixer.c
+++ b/sound/pci/emu10k1/emumixer.c
@@ -806,6 +806,110 @@  static struct snd_kcontrol_new snd_emu1010_internal_clock =
 	.put =          snd_emu1010_internal_clock_put
 };
 
+static int snd_emu1010_optical_out_info(struct snd_kcontrol *kcontrol,
+					  struct snd_ctl_elem_info *uinfo)
+{
+	static const char * const texts[2] = {
+		"SPDIF", "ADAT"
+	};
+
+	return snd_ctl_enum_info(uinfo, 1, 2, texts);
+}
+
+static int snd_emu1010_optical_out_get(struct snd_kcontrol *kcontrol,
+					struct snd_ctl_elem_value *ucontrol)
+{
+	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
+
+	ucontrol->value.enumerated.item[0] = emu->emu1010.optical_out;
+	return 0;
+}
+
+static int snd_emu1010_optical_out_put(struct snd_kcontrol *kcontrol,
+					struct snd_ctl_elem_value *ucontrol)
+{
+	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
+	unsigned int val;
+	u32 tmp;
+	int change = 0;
+
+	val = ucontrol->value.enumerated.item[0] ;
+	/* Limit: uinfo->value.enumerated.items = 2; */
+	if (val >= 2)
+		return -EINVAL;
+	change = (emu->emu1010.optical_out != val);
+	if (change) {
+		emu->emu1010.optical_out = val;
+		tmp = (emu->emu1010.optical_in ? EMU_HANA_OPTICAL_IN_ADAT : 0) |
+			(emu->emu1010.optical_out ? EMU_HANA_OPTICAL_OUT_ADAT : 0);
+		snd_emu1010_fpga_write(emu, EMU_HANA_OPTICAL_TYPE, tmp);
+	}
+        return change;
+}
+
+static struct snd_kcontrol_new snd_emu1010_optical_out =
+{
+	.access =	SNDRV_CTL_ELEM_ACCESS_READWRITE,
+	.iface =        SNDRV_CTL_ELEM_IFACE_MIXER,
+	.name =         "Optical Output Mode",
+	.count =	1,
+	.info =         snd_emu1010_optical_out_info,
+	.get =          snd_emu1010_optical_out_get,
+	.put =          snd_emu1010_optical_out_put
+};
+
+static int snd_emu1010_optical_in_info(struct snd_kcontrol *kcontrol,
+					  struct snd_ctl_elem_info *uinfo)
+{
+	static const char * const texts[2] = {
+		"SPDIF", "ADAT"
+	};
+
+	return snd_ctl_enum_info(uinfo, 1, 2, texts);
+}
+
+static int snd_emu1010_optical_in_get(struct snd_kcontrol *kcontrol,
+					struct snd_ctl_elem_value *ucontrol)
+{
+	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
+
+	ucontrol->value.enumerated.item[0] = emu->emu1010.optical_in;
+	return 0;
+}
+
+static int snd_emu1010_optical_in_put(struct snd_kcontrol *kcontrol,
+					struct snd_ctl_elem_value *ucontrol)
+{
+	struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
+	unsigned int val;
+	u32 tmp;
+	int change = 0;
+
+	val = ucontrol->value.enumerated.item[0] ;
+	/* Limit: uinfo->value.enumerated.items = 2; */
+	if (val >= 2)
+		return -EINVAL;
+	change = (emu->emu1010.optical_in != val);
+	if (change) {
+		emu->emu1010.optical_in = val;
+		tmp = (emu->emu1010.optical_in ? EMU_HANA_OPTICAL_IN_ADAT : 0) |
+			(emu->emu1010.optical_out ? EMU_HANA_OPTICAL_OUT_ADAT : 0);
+		snd_emu1010_fpga_write(emu, EMU_HANA_OPTICAL_TYPE, tmp);
+	}
+        return change;
+}
+
+static struct snd_kcontrol_new snd_emu1010_optical_in =
+{
+	.access =	SNDRV_CTL_ELEM_ACCESS_READWRITE,
+	.iface =        SNDRV_CTL_ELEM_IFACE_MIXER,
+	.name =         "Optical Input Mode",
+	.count =	1,
+	.info =         snd_emu1010_optical_in_info,
+	.get =          snd_emu1010_optical_in_get,
+	.put =          snd_emu1010_optical_in_put
+};
+
 static int snd_audigy_i2c_capture_source_info(struct snd_kcontrol *kcontrol,
 					  struct snd_ctl_elem_info *uinfo)
 {
@@ -2051,6 +2155,14 @@  int snd_emu10k1_mixer(struct snd_emu10k1 *emu,
 			snd_ctl_new1(&snd_emu1010_internal_clock, emu));
 		if (err < 0)
 			return err;
+		err = snd_ctl_add(card,
+			snd_ctl_new1(&snd_emu1010_optical_out, emu));
+		if (err < 0)
+			return err;
+		err = snd_ctl_add(card,
+			snd_ctl_new1(&snd_emu1010_optical_in, emu));
+		if (err < 0)
+			return err;
 
 	} else if (emu->card_capabilities->emu_model) {
 		/* all other e-mu cards for now */
@@ -2086,6 +2198,14 @@  int snd_emu10k1_mixer(struct snd_emu10k1 *emu,
 			snd_ctl_new1(&snd_emu1010_internal_clock, emu));
 		if (err < 0)
 			return err;
+		err = snd_ctl_add(card,
+			snd_ctl_new1(&snd_emu1010_optical_out, emu));
+		if (err < 0)
+			return err;
+		err = snd_ctl_add(card,
+			snd_ctl_new1(&snd_emu1010_optical_in, emu));
+		if (err < 0)
+			return err;
 	}
 
 	if ( emu->card_capabilities->i2c_adc) {