summaryrefslogtreecommitdiff
path: root/sound/soc/imx/imx-esai.c
diff options
context:
space:
mode:
authorAlan Tull <r80115@freescale.com>2009-11-02 19:44:22 -0600
committerAlejandro Gonzalez <alex.gonzalez@digi.com>2010-02-12 17:19:31 +0100
commitfa012c4c0927fe862397110c7c23d3a6b516374e (patch)
tree29f2ef3da1bb4122f76e0a05ab68ca831564dfa3 /sound/soc/imx/imx-esai.c
parent90f3c1e8f3b63ae6a7aca35b17740e48b8055167 (diff)
ENGR00118016-1 ASoC : upgrade audio support to 2.6.31
Move regulator control into codec drivers. Move codec platform data to machine layer. Remove unused fields from mxc_audio_platform_data. soc multiple audio cards support: dai_list is a list for all registered codec/cpu dais. One codec/cpu dais can't be registered twice, so move the cpu dai registering into imx-ssi.c/imx-esai.c Fix ak4647_read_reg error. Put ssi/esai mode in the cpu_dai private_data. sgtl5000: Fix the power for MX35 1. MX35 vddio and vddd are directly connected to external 3V3. It has no regulator control. 2. sgtl5000 needs some time to be ready after vdda is switched on so msleep(1) is added before regiter read/write. 3. On MX35 platform, vdda is from VCAM. Signed-off-by: Alan Tull <r80115@freescale.com> Signed-off-by: Wallace Wang <r59996@freescale.com>
Diffstat (limited to 'sound/soc/imx/imx-esai.c')
-rw-r--r--sound/soc/imx/imx-esai.c131
1 files changed, 91 insertions, 40 deletions
diff --git a/sound/soc/imx/imx-esai.c b/sound/soc/imx/imx-esai.c
index 795e3d4bc704..71dd62cff509 100644
--- a/sound/soc/imx/imx-esai.c
+++ b/sound/soc/imx/imx-esai.c
@@ -320,6 +320,7 @@
#define ESAI_RX_DIV_FP 5
static int imx_esai_txrx_state;
+static struct imx_esai imx_esai_priv[3];
static int imx_esai_set_dai_sysclk(struct snd_soc_dai *cpu_dai,
int clk_id, unsigned int freq, int dir)
@@ -422,35 +423,25 @@ static int imx_esai_set_dai_clkdiv(struct snd_soc_dai *cpu_dai,
static int imx_esai_set_dai_tdm_slot(struct snd_soc_dai *cpu_dai,
unsigned int mask, int slots)
{
- u32 tcr, rcr, tccr, rccr;
+ u32 tccr, rccr;
if (cpu_dai->id & IMX_DAI_ESAI_TX) {
- tcr = __raw_readl(ESAI_TCR);
tccr = __raw_readl(ESAI_TCCR);
- tcr &= ESAI_TCR_TMOD_MASK;
- tcr |= ESAI_TCR_TMOD_NETWORK;
-
tccr &= ESAI_TCCR_TDC_MASK;
tccr |= ESAI_TCCR_TDC(slots - 1);
- __raw_writel(tcr, ESAI_TCR);
__raw_writel(tccr, ESAI_TCCR);
__raw_writel((mask & 0xffff), ESAI_TSMA);
__raw_writel(((mask >> 16) & 0xffff), ESAI_TSMB);
}
if (cpu_dai->id & IMX_DAI_ESAI_RX) {
- rcr = __raw_readl(ESAI_RCR);
rccr = __raw_readl(ESAI_RCCR);
- rcr &= ESAI_RCR_RMOD_MASK;
- rcr |= ESAI_RCR_RMOD_NETWORK;
-
rccr &= ESAI_RCCR_RDC_MASK;
rccr |= ESAI_RCCR_RDC(slots - 1);
- __raw_writel(rcr, ESAI_RCR);
__raw_writel(rccr, ESAI_RCCR);
__raw_writel((mask & 0xffff), ESAI_RSMA);
__raw_writel(((mask >> 16) & 0xffff), ESAI_RSMB);
@@ -466,7 +457,7 @@ static int imx_esai_set_dai_tdm_slot(struct snd_soc_dai *cpu_dai,
*/
static int imx_esai_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt)
{
- bool sync_mode = cpu_dai->symmetric_rates;
+ struct imx_esai *esai_mode = (struct imx_esai *)cpu_dai->private_data;
u32 tcr, tccr, rcr, rccr, saicr;
tcr = __raw_readl(ESAI_TCR);
@@ -549,11 +540,21 @@ static int imx_esai_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt)
}
/* sync */
- if (sync_mode)
+ if (esai_mode->sync_mode)
saicr |= ESAI_SAICR_SYNC;
else
saicr &= ~ESAI_SAICR_SYNC;
+ tcr &= ESAI_TCR_TMOD_MASK;
+ rcr &= ESAI_RCR_RMOD_MASK;
+ if (esai_mode->network_mode) {
+ tcr |= ESAI_TCR_TMOD_NETWORK;
+ rcr |= ESAI_RCR_RMOD_NETWORK;
+ } else {
+ tcr |= ESAI_TCR_TMOD_NORMAL;
+ rcr |= ESAI_RCR_RMOD_NORMAL;
+ }
+
if (cpu_dai->id & IMX_DAI_ESAI_TX) {
__raw_writel(tcr, ESAI_TCR);
__raw_writel(tccr, ESAI_TCCR);
@@ -828,17 +829,6 @@ static int imx_esai_resume(struct snd_soc_dai *dai)
static int imx_esai_probe(struct platform_device *pdev, struct snd_soc_dai *dai)
{
- if (!strcmp("imx-esai-tx", dai->name))
- dai->id = IMX_DAI_ESAI_TX;
- else if (!strcmp("imx-esai-rx", dai->name))
- dai->id = IMX_DAI_ESAI_RX;
- else if (!strcmp("imx-esai-txrx", dai->name))
- dai->id = IMX_DAI_ESAI_TXRX;
- else {
- pr_err("%s: invalid device %s\n", __func__, dai->name);
- return -ENODEV;
- }
-
imx_esai_txrx_state = 0;
esai_clk = clk_get(NULL, "esai_clk");
@@ -870,30 +860,91 @@ static struct snd_soc_dai_ops imx_esai_dai_ops = {
.set_tdm_slot = imx_esai_set_dai_tdm_slot,
};
-struct snd_soc_dai imx_esai_dai = {
- .name = "imx-esai",
- .id = 0,
- .probe = imx_esai_probe,
- .remove = imx_esai_remove,
- .suspend = imx_esai_suspend,
- .resume = imx_esai_resume,
- .playback = {
+struct snd_soc_dai imx_esai_dai[] = {
+ {
+ .name = "imx-esai-tx",
+ .id = IMX_DAI_ESAI_TX,
+ .probe = imx_esai_probe,
+ .remove = imx_esai_remove,
+ .suspend = imx_esai_suspend,
+ .resume = imx_esai_resume,
+ .playback = {
+ .channels_min = 1,
+ .channels_max = 6,
+ .rates = IMX_ESAI_RATES,
+ .formats = IMX_ESAI_FORMATS,
+ },
+ .capture = {
+ .channels_min = 1,
+ .channels_max = 4,
+ .rates = IMX_ESAI_RATES,
+ .formats = IMX_ESAI_FORMATS,
+ },
+ .ops = &imx_esai_dai_ops,
+ .private_data = &imx_esai_priv[0],
+ },
+ {
+ .name = "imx-esai-rx",
+ .id = IMX_DAI_ESAI_RX,
+ .probe = imx_esai_probe,
+ .remove = imx_esai_remove,
+ .suspend = imx_esai_suspend,
+ .resume = imx_esai_resume,
+ .playback = {
+ .channels_min = 1,
+ .channels_max = 6,
+ .rates = IMX_ESAI_RATES,
+ .formats = IMX_ESAI_FORMATS,
+ },
+ .capture = {
+ .channels_min = 1,
+ .channels_max = 4,
+ .rates = IMX_ESAI_RATES,
+ .formats = IMX_ESAI_FORMATS,
+ },
+ .ops = &imx_esai_dai_ops,
+ .private_data = &imx_esai_priv[1],
+ },
+ {
+ .name = "imx-esai-txrx",
+ .id = IMX_DAI_ESAI_TXRX,
+ .probe = imx_esai_probe,
+ .remove = imx_esai_remove,
+ .suspend = imx_esai_suspend,
+ .resume = imx_esai_resume,
+ .playback = {
+ .channels_min = 1,
+ .channels_max = 6,
+ .rates = IMX_ESAI_RATES,
+ .formats = IMX_ESAI_FORMATS,
+ },
+ .capture = {
.channels_min = 1,
- .channels_max = 6,
+ .channels_max = 4,
.rates = IMX_ESAI_RATES,
.formats = IMX_ESAI_FORMATS,
},
- .capture = {
- .channels_min = 1,
- .channels_max = 4,
- .rates = IMX_ESAI_RATES,
- .formats = IMX_ESAI_FORMATS,
- },
- .ops = &imx_esai_dai_ops,
+ .ops = &imx_esai_dai_ops,
+ .private_data = &imx_esai_priv[2],
+ },
+
};
EXPORT_SYMBOL_GPL(imx_esai_dai);
+static int __init imx_esai_init(void)
+{
+ return snd_soc_register_dais(imx_esai_dai, ARRAY_SIZE(imx_esai_dai));
+}
+
+static void __exit imx_esai_exit(void)
+{
+ snd_soc_unregister_dais(imx_esai_dai, ARRAY_SIZE(imx_esai_dai));
+}
+
+module_init(imx_esai_init);
+module_exit(imx_esai_exit);
+
MODULE_AUTHOR("Freescale Semiconductor, Inc.");
MODULE_DESCRIPTION("i.MX ASoC ESAI driver");
MODULE_LICENSE("GPL");