]> git.karo-electronics.de Git - linux-beck.git/commitdiff
ASoC: arizona: Allow runtime reconfiguration of the output mode
authorMark Brown <broonie@opensource.wolfsonmicro.com>
Fri, 4 Jan 2013 19:31:00 +0000 (19:31 +0000)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Fri, 4 Jan 2013 21:20:59 +0000 (21:20 +0000)
Some systems use external analogue switches to connect more analogue
devices to the CODEC than are supported by the device.  In some systems
this requires changing the switched output from single ended to
differential mode dynamically at runtime. Add a new function
arizona_set_output_mode() to support this.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
sound/soc/codecs/arizona.c
sound/soc/codecs/arizona.h

index 27c6a52442a0787e93bbb74ac39f3f83fa8f0719..bcd225853eb53eb723f38f6e84a31355e653180a 100644 (file)
@@ -1164,6 +1164,40 @@ int arizona_init_fll(struct arizona *arizona, int id, int base, int lock_irq,
 }
 EXPORT_SYMBOL_GPL(arizona_init_fll);
 
+/**
+ * arizona_set_output_mode - Set the mode of the specified output
+ *
+ * @codec: Device to configure
+ * @output: Output number
+ * @diff: True to set the output to differential mode
+ *
+ * Some systems use external analogue switches to connect more
+ * analogue devices to the CODEC than are supported by the device.  In
+ * some systems this requires changing the switched output from single
+ * ended to differential mode dynamically at runtime, an operation
+ * supported using this function.
+ *
+ * Most systems have a single static configuration and should use
+ * platform data instead.
+ */
+int arizona_set_output_mode(struct snd_soc_codec *codec, int output, bool diff)
+{
+       unsigned int reg, val;
+
+       if (output < 1 || output > 6)
+               return -EINVAL;
+
+       reg = ARIZONA_OUTPUT_PATH_CONFIG_1L + (output - 1) * 8;
+
+       if (diff)
+               val = ARIZONA_OUT1_MONO;
+       else
+               val = 0;
+
+       return snd_soc_update_bits(codec, reg, ARIZONA_OUT1_MONO, val);
+}
+EXPORT_SYMBOL_GPL(arizona_set_output_mode);
+
 MODULE_DESCRIPTION("ASoC Wolfson Arizona class device support");
 MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
 MODULE_LICENSE("GPL");
index 7f22b4f84369819e1750bb98a54e3b69802e0fdf..0973fd9bd9a76f6b9f394bd357948bdf5306821f 100644 (file)
@@ -213,4 +213,7 @@ extern int arizona_set_fll(struct arizona_fll *fll, int source,
 
 extern int arizona_init_dai(struct arizona_priv *priv, int dai);
 
+int arizona_set_output_mode(struct snd_soc_codec *codec, int output,
+                           bool diff);
+
 #endif