aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMisael Lopez Cruz2014-10-30 01:23:34 -0500
committerMisael Lopez Cruz2014-10-30 01:23:53 -0500
commitb6085b513e1dc8ab1bb0d415dbeb69925f947611 (patch)
tree48b4b196cdcedc9b0443e3cfaac3d2c065921c87
parent7abae030ceb248e0a96d9be356ff672ca30a163f (diff)
downloadkernel-audio-b6085b513e1dc8ab1bb0d415dbeb69925f947611.tar.gz
kernel-audio-b6085b513e1dc8ab1bb0d415dbeb69925f947611.tar.xz
kernel-audio-b6085b513e1dc8ab1bb0d415dbeb69925f947611.zip
ASoC: davinci-mcasp: Add digital loopback mode
Add support for the digital loopback mode. Even serializers N transmit to odd serializers N+1 that receive. The above order must be set accordingly in the "serial-dir" DT property, e.g.: serial-dir = <1 2 0 0>; /* 0:INACTIVE, 1:TX, 2:RX */ Change-Id: I01a240b040497439b5781d0c2eb4023bf6562da0 Signed-off-by: Misael Lopez Cruz <misael.lopez@ti.com>
-rw-r--r--include/linux/platform_data/davinci_asp.h1
-rw-r--r--sound/soc/davinci/davinci-mcasp.c13
-rw-r--r--sound/soc/davinci/davinci-mcasp.h3
3 files changed, 17 insertions, 0 deletions
diff --git a/include/linux/platform_data/davinci_asp.h b/include/linux/platform_data/davinci_asp.h
index 416c1d2abe63..2227fa4359d8 100644
--- a/include/linux/platform_data/davinci_asp.h
+++ b/include/linux/platform_data/davinci_asp.h
@@ -86,6 +86,7 @@ struct snd_platform_data {
86 u8 rxnumevt; 86 u8 rxnumevt;
87 u32 tx_dismod; 87 u32 tx_dismod;
88 u32 rx_dismod; 88 u32 rx_dismod;
89 bool loopback;
89}; 90};
90 91
91enum { 92enum {
diff --git a/sound/soc/davinci/davinci-mcasp.c b/sound/soc/davinci/davinci-mcasp.c
index b264e8b69855..169d8c73cd0b 100644
--- a/sound/soc/davinci/davinci-mcasp.c
+++ b/sound/soc/davinci/davinci-mcasp.c
@@ -975,6 +975,13 @@ static int davinci_hw_param(struct davinci_audio_dev *dev, int stream,
975 mcasp_mod_bits(dev->base + DAVINCI_MCASP_RXFMCTL_REG, 975 mcasp_mod_bits(dev->base + DAVINCI_MCASP_RXFMCTL_REG,
976 FSRMOD(total_slots), FSRMOD(0x1FF)); 976 FSRMOD(total_slots), FSRMOD(0x1FF));
977 977
978 if (dev->loopback) {
979 dev_info(dev->dev, "%s configured in loopback mode",
980 stream ? "capture" : "playback");
981 mcasp_set_reg(dev->base + DAVINCI_MCASP_LBCTL_REG,
982 LBEN | LBORD | LBGENMODE(1));
983 }
984
978 return 0; 985 return 0;
979} 986}
980 987
@@ -1459,6 +1466,11 @@ static struct snd_platform_data *davinci_mcasp_set_pdata_from_of(
1459 if (ret >= 0) 1466 if (ret >= 0)
1460 pdata->sram_size_capture = val; 1467 pdata->sram_size_capture = val;
1461 1468
1469 if (of_find_property(np, "ti,loopback", NULL))
1470 pdata->loopback = true;
1471 else
1472 pdata->loopback = false;
1473
1462 return pdata; 1474 return pdata;
1463 1475
1464nodata: 1476nodata:
@@ -1556,6 +1568,7 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
1556 dev->rxnumevt = pdata->rxnumevt; 1568 dev->rxnumevt = pdata->rxnumevt;
1557 dev->tx_dismod = pdata->tx_dismod; 1569 dev->tx_dismod = pdata->tx_dismod;
1558 dev->rx_dismod = pdata->rx_dismod; 1570 dev->rx_dismod = pdata->rx_dismod;
1571 dev->loopback = pdata->loopback;
1559 dev->dev = &pdev->dev; 1572 dev->dev = &pdev->dev;
1560 1573
1561 davinci_mcasp_serializer_offset(dev); 1574 davinci_mcasp_serializer_offset(dev);
diff --git a/sound/soc/davinci/davinci-mcasp.h b/sound/soc/davinci/davinci-mcasp.h
index 3dfceb45dedb..b4317d76655a 100644
--- a/sound/soc/davinci/davinci-mcasp.h
+++ b/sound/soc/davinci/davinci-mcasp.h
@@ -54,6 +54,9 @@ struct davinci_audio_dev {
54 /* McASP port related */ 54 /* McASP port related */
55 bool dat_port; 55 bool dat_port;
56 56
57 /* Digital loopback */
58 bool loopback;
59
57 struct snd_pcm_substream *substreams[2]; 60 struct snd_pcm_substream *substreams[2];
58}; 61};
59 62