aboutsummaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
authorMarkus Pargmann <mpa@pengutronix.de>2014-01-27 07:03:05 -0500
committerMark Brown <broonie@linaro.org>2014-01-27 13:13:40 -0500
commitb44aa40f875b06b1986a18251d601ee1832c4476 (patch)
tree17c1992a43fb4c674f6558e5df3d58127da1da53 /sound
parent7552f34a790069a008bd3e2ab4c0954b30c2f63b (diff)
ASoC: tlv320aic32x4: Fix mono playback
Playback of a mono stream should output the same stream on both channels. At the moment only the left analog signal is valid, the right one is just noise. This patch maps the left digital channel onto both DACs when receiving a mono stream. Signed-off-by: Markus Pargmann <mpa@pengutronix.de> Signed-off-by: Mark Brown <broonie@linaro.org>
Diffstat (limited to 'sound')
-rw-r--r--sound/soc/codecs/tlv320aic32x4.c18
-rw-r--r--sound/soc/codecs/tlv320aic32x4.h1
2 files changed, 12 insertions, 7 deletions
diff --git a/sound/soc/codecs/tlv320aic32x4.c b/sound/soc/codecs/tlv320aic32x4.c
index 385dec16eb8a..ee9ad05f9137 100644
--- a/sound/soc/codecs/tlv320aic32x4.c
+++ b/sound/soc/codecs/tlv320aic32x4.c
@@ -450,6 +450,17 @@ static int aic32x4_hw_params(struct snd_pcm_substream *substream,
450 } 450 }
451 snd_soc_write(codec, AIC32X4_IFACE1, data); 451 snd_soc_write(codec, AIC32X4_IFACE1, data);
452 452
453 if (params_channels(params) == 1) {
454 data = AIC32X4_RDAC2LCHN | AIC32X4_LDAC2LCHN;
455 } else {
456 if (aic32x4->swapdacs)
457 data = AIC32X4_RDAC2LCHN | AIC32X4_LDAC2RCHN;
458 else
459 data = AIC32X4_LDAC2LCHN | AIC32X4_RDAC2RCHN;
460 }
461 snd_soc_update_bits(codec, AIC32X4_DACSETUP, AIC32X4_DAC_CHAN_MASK,
462 data);
463
453 return 0; 464 return 0;
454} 465}
455 466
@@ -606,13 +617,6 @@ static int aic32x4_probe(struct snd_soc_codec *codec)
606 } 617 }
607 snd_soc_write(codec, AIC32X4_CMMODE, tmp_reg); 618 snd_soc_write(codec, AIC32X4_CMMODE, tmp_reg);
608 619
609 /* Do DACs need to be swapped? */
610 if (aic32x4->swapdacs) {
611 snd_soc_write(codec, AIC32X4_DACSETUP, AIC32X4_LDAC2RCHN | AIC32X4_RDAC2LCHN);
612 } else {
613 snd_soc_write(codec, AIC32X4_DACSETUP, AIC32X4_LDAC2LCHN | AIC32X4_RDAC2RCHN);
614 }
615
616 /* Mic PGA routing */ 620 /* Mic PGA routing */
617 if (aic32x4->micpga_routing & AIC32X4_MICPGA_ROUTE_LMIC_IN2R_10K) { 621 if (aic32x4->micpga_routing & AIC32X4_MICPGA_ROUTE_LMIC_IN2R_10K) {
618 snd_soc_write(codec, AIC32X4_LMICPGANIN, AIC32X4_LMICPGANIN_IN2R_10K); 622 snd_soc_write(codec, AIC32X4_LMICPGANIN, AIC32X4_LMICPGANIN_IN2R_10K);
diff --git a/sound/soc/codecs/tlv320aic32x4.h b/sound/soc/codecs/tlv320aic32x4.h
index 35774223fd91..83795af8c75f 100644
--- a/sound/soc/codecs/tlv320aic32x4.h
+++ b/sound/soc/codecs/tlv320aic32x4.h
@@ -138,6 +138,7 @@
138#define AIC32X4_LDAC2RCHN (0x02 << 4) 138#define AIC32X4_LDAC2RCHN (0x02 << 4)
139#define AIC32X4_LDAC2LCHN (0x01 << 4) 139#define AIC32X4_LDAC2LCHN (0x01 << 4)
140#define AIC32X4_RDAC2RCHN (0x01 << 2) 140#define AIC32X4_RDAC2RCHN (0x01 << 2)
141#define AIC32X4_DAC_CHAN_MASK 0x3c
141 142
142#define AIC32X4_SSTEP2WCLK 0x01 143#define AIC32X4_SSTEP2WCLK 0x01
143#define AIC32X4_MUTEON 0x0C 144#define AIC32X4_MUTEON 0x0C