Merge remote-tracking branch 'asoc/topic/omap' into asoc-next
This commit is contained in:
commit
fe2a1e53be
|
@ -1,49 +0,0 @@
|
|||
/**
|
||||
* omap-abe-twl6040.h - ASoC machine driver OMAP4+ devices, header.
|
||||
*
|
||||
* Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com
|
||||
* All rights reserved.
|
||||
*
|
||||
* Author: Peter Ujfalusi <peter.ujfalusi@ti.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* version 2 as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef _OMAP_ABE_TWL6040_H_
|
||||
#define _OMAP_ABE_TWL6040_H_
|
||||
|
||||
/* To select if only one channel is connected in a stereo port */
|
||||
#define ABE_TWL6040_LEFT (1 << 0)
|
||||
#define ABE_TWL6040_RIGHT (1 << 1)
|
||||
|
||||
struct omap_abe_twl6040_data {
|
||||
char *card_name;
|
||||
/* Feature flags for connected audio pins */
|
||||
u8 has_hs;
|
||||
u8 has_hf;
|
||||
bool has_ep;
|
||||
u8 has_aux;
|
||||
u8 has_vibra;
|
||||
bool has_dmic;
|
||||
bool has_hsmic;
|
||||
bool has_mainmic;
|
||||
bool has_submic;
|
||||
u8 has_afm;
|
||||
/* Other features */
|
||||
bool jack_detection; /* board can detect jack events */
|
||||
int mclk_freq; /* MCLK frequency speed for twl6040 */
|
||||
};
|
||||
|
||||
#endif /* _OMAP_ABE_TWL6040_H_ */
|
|
@ -1,6 +1,6 @@
|
|||
config SND_OMAP_SOC
|
||||
tristate "SoC Audio for the Texas Instruments OMAP chips"
|
||||
depends on ARCH_OMAP && DMA_OMAP
|
||||
depends on (ARCH_OMAP && DMA_OMAP) || (ARCH_ARM && COMPILE_TEST)
|
||||
select SND_DMAENGINE_PCM
|
||||
|
||||
config SND_OMAP_SOC_DMIC
|
||||
|
@ -26,7 +26,7 @@ config SND_OMAP_SOC_N810
|
|||
|
||||
config SND_OMAP_SOC_RX51
|
||||
tristate "SoC Audio support for Nokia RX-51"
|
||||
depends on SND_OMAP_SOC && MACH_NOKIA_RX51
|
||||
depends on SND_OMAP_SOC && ARCH_ARM && (MACH_NOKIA_RX51 || COMPILE_TEST)
|
||||
select SND_OMAP_SOC_MCBSP
|
||||
select SND_SOC_TLV320AIC3X
|
||||
select SND_SOC_TPA6130A2
|
||||
|
@ -87,7 +87,7 @@ config SND_OMAP_SOC_OMAP_TWL4030
|
|||
|
||||
config SND_OMAP_SOC_OMAP_ABE_TWL6040
|
||||
tristate "SoC Audio support for OMAP boards using ABE and twl6040 codec"
|
||||
depends on TWL6040_CORE && SND_OMAP_SOC && ARCH_OMAP4
|
||||
depends on TWL6040_CORE && SND_OMAP_SOC && (ARCH_OMAP4 || COMPILE_TEST)
|
||||
select SND_OMAP_SOC_DMIC
|
||||
select SND_OMAP_SOC_MCPDM
|
||||
select SND_SOC_TWL6040
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
#include <linux/clk.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/mfd/twl6040.h>
|
||||
#include <linux/platform_data/omap-abe-twl6040.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
|
||||
|
@ -166,19 +165,10 @@ static const struct snd_soc_dapm_route audio_map[] = {
|
|||
{"AFMR", NULL, "Line In"},
|
||||
};
|
||||
|
||||
static inline void twl6040_disconnect_pin(struct snd_soc_dapm_context *dapm,
|
||||
int connected, char *pin)
|
||||
{
|
||||
if (!connected)
|
||||
snd_soc_dapm_disable_pin(dapm, pin);
|
||||
}
|
||||
|
||||
static int omap_abe_twl6040_init(struct snd_soc_pcm_runtime *rtd)
|
||||
{
|
||||
struct snd_soc_codec *codec = rtd->codec;
|
||||
struct snd_soc_card *card = codec->card;
|
||||
struct snd_soc_dapm_context *dapm = &codec->dapm;
|
||||
struct omap_abe_twl6040_data *pdata = dev_get_platdata(card->dev);
|
||||
struct abe_twl6040 *priv = snd_soc_card_get_drvdata(card);
|
||||
int hs_trim;
|
||||
int ret = 0;
|
||||
|
@ -203,24 +193,6 @@ static int omap_abe_twl6040_init(struct snd_soc_pcm_runtime *rtd)
|
|||
twl6040_hs_jack_detect(codec, &hs_jack, SND_JACK_HEADSET);
|
||||
}
|
||||
|
||||
/*
|
||||
* NULL pdata means we booted with DT. In this case the routing is
|
||||
* provided and the card is fully routed, no need to mark pins.
|
||||
*/
|
||||
if (!pdata)
|
||||
return ret;
|
||||
|
||||
/* Disable not connected paths if not used */
|
||||
twl6040_disconnect_pin(dapm, pdata->has_hs, "Headset Stereophone");
|
||||
twl6040_disconnect_pin(dapm, pdata->has_hf, "Ext Spk");
|
||||
twl6040_disconnect_pin(dapm, pdata->has_ep, "Earphone Spk");
|
||||
twl6040_disconnect_pin(dapm, pdata->has_aux, "Line Out");
|
||||
twl6040_disconnect_pin(dapm, pdata->has_vibra, "Vibrator");
|
||||
twl6040_disconnect_pin(dapm, pdata->has_hsmic, "Headset Mic");
|
||||
twl6040_disconnect_pin(dapm, pdata->has_mainmic, "Main Handset Mic");
|
||||
twl6040_disconnect_pin(dapm, pdata->has_submic, "Sub Handset Mic");
|
||||
twl6040_disconnect_pin(dapm, pdata->has_afm, "Line In");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -274,13 +246,18 @@ static struct snd_soc_card omap_abe_card = {
|
|||
|
||||
static int omap_abe_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct omap_abe_twl6040_data *pdata = dev_get_platdata(&pdev->dev);
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
struct snd_soc_card *card = &omap_abe_card;
|
||||
struct device_node *dai_node;
|
||||
struct abe_twl6040 *priv;
|
||||
int num_links = 0;
|
||||
int ret = 0;
|
||||
|
||||
if (!node) {
|
||||
dev_err(&pdev->dev, "of node is missing.\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
card->dev = &pdev->dev;
|
||||
|
||||
priv = devm_kzalloc(&pdev->dev, sizeof(struct abe_twl6040), GFP_KERNEL);
|
||||
|
@ -289,78 +266,50 @@ static int omap_abe_probe(struct platform_device *pdev)
|
|||
|
||||
priv->dmic_codec_dev = ERR_PTR(-EINVAL);
|
||||
|
||||
if (node) {
|
||||
struct device_node *dai_node;
|
||||
|
||||
if (snd_soc_of_parse_card_name(card, "ti,model")) {
|
||||
dev_err(&pdev->dev, "Card name is not provided\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
ret = snd_soc_of_parse_audio_routing(card,
|
||||
"ti,audio-routing");
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev,
|
||||
"Error while parsing DAPM routing\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
dai_node = of_parse_phandle(node, "ti,mcpdm", 0);
|
||||
if (!dai_node) {
|
||||
dev_err(&pdev->dev, "McPDM node is not provided\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
abe_twl6040_dai_links[0].cpu_dai_name = NULL;
|
||||
abe_twl6040_dai_links[0].cpu_of_node = dai_node;
|
||||
|
||||
dai_node = of_parse_phandle(node, "ti,dmic", 0);
|
||||
if (dai_node) {
|
||||
num_links = 2;
|
||||
abe_twl6040_dai_links[1].cpu_dai_name = NULL;
|
||||
abe_twl6040_dai_links[1].cpu_of_node = dai_node;
|
||||
|
||||
priv->dmic_codec_dev = platform_device_register_simple(
|
||||
"dmic-codec", -1, NULL, 0);
|
||||
if (IS_ERR(priv->dmic_codec_dev)) {
|
||||
dev_err(&pdev->dev,
|
||||
"Can't instantiate dmic-codec\n");
|
||||
return PTR_ERR(priv->dmic_codec_dev);
|
||||
}
|
||||
} else {
|
||||
num_links = 1;
|
||||
}
|
||||
|
||||
priv->jack_detection = of_property_read_bool(node,
|
||||
"ti,jack-detection");
|
||||
of_property_read_u32(node, "ti,mclk-freq",
|
||||
&priv->mclk_freq);
|
||||
if (!priv->mclk_freq) {
|
||||
dev_err(&pdev->dev, "MCLK frequency not provided\n");
|
||||
ret = -EINVAL;
|
||||
goto err_unregister;
|
||||
}
|
||||
|
||||
omap_abe_card.fully_routed = 1;
|
||||
} else if (pdata) {
|
||||
if (pdata->card_name) {
|
||||
card->name = pdata->card_name;
|
||||
} else {
|
||||
dev_err(&pdev->dev, "Card name is not provided\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (pdata->has_dmic)
|
||||
num_links = 2;
|
||||
else
|
||||
num_links = 1;
|
||||
|
||||
priv->jack_detection = pdata->jack_detection;
|
||||
priv->mclk_freq = pdata->mclk_freq;
|
||||
} else {
|
||||
dev_err(&pdev->dev, "Missing pdata\n");
|
||||
if (snd_soc_of_parse_card_name(card, "ti,model")) {
|
||||
dev_err(&pdev->dev, "Card name is not provided\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
ret = snd_soc_of_parse_audio_routing(card, "ti,audio-routing");
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "Error while parsing DAPM routing\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
dai_node = of_parse_phandle(node, "ti,mcpdm", 0);
|
||||
if (!dai_node) {
|
||||
dev_err(&pdev->dev, "McPDM node is not provided\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
abe_twl6040_dai_links[0].cpu_dai_name = NULL;
|
||||
abe_twl6040_dai_links[0].cpu_of_node = dai_node;
|
||||
|
||||
dai_node = of_parse_phandle(node, "ti,dmic", 0);
|
||||
if (dai_node) {
|
||||
num_links = 2;
|
||||
abe_twl6040_dai_links[1].cpu_dai_name = NULL;
|
||||
abe_twl6040_dai_links[1].cpu_of_node = dai_node;
|
||||
|
||||
priv->dmic_codec_dev = platform_device_register_simple(
|
||||
"dmic-codec", -1, NULL, 0);
|
||||
if (IS_ERR(priv->dmic_codec_dev)) {
|
||||
dev_err(&pdev->dev, "Can't instantiate dmic-codec\n");
|
||||
return PTR_ERR(priv->dmic_codec_dev);
|
||||
}
|
||||
} else {
|
||||
num_links = 1;
|
||||
}
|
||||
|
||||
priv->jack_detection = of_property_read_bool(node, "ti,jack-detection");
|
||||
of_property_read_u32(node, "ti,mclk-freq", &priv->mclk_freq);
|
||||
if (!priv->mclk_freq) {
|
||||
dev_err(&pdev->dev, "MCLK frequency not provided\n");
|
||||
ret = -EINVAL;
|
||||
goto err_unregister;
|
||||
}
|
||||
|
||||
card->fully_routed = 1;
|
||||
|
||||
if (!priv->mclk_freq) {
|
||||
dev_err(&pdev->dev, "MCLK frequency missing\n");
|
||||
|
|
|
@ -480,15 +480,12 @@ static int asoc_dmic_probe(struct platform_device *pdev)
|
|||
dmic->dma_data.filter_data = "up_link";
|
||||
|
||||
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mpu");
|
||||
if (!res) {
|
||||
dev_err(dmic->dev, "invalid memory resource\n");
|
||||
ret = -ENODEV;
|
||||
dmic->io_base = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (IS_ERR(dmic->io_base)) {
|
||||
ret = PTR_ERR(dmic->io_base);
|
||||
goto err_put_clk;
|
||||
}
|
||||
|
||||
dmic->io_base = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (IS_ERR(dmic->io_base))
|
||||
return PTR_ERR(dmic->io_base);
|
||||
|
||||
ret = snd_soc_register_component(&pdev->dev, &omap_dmic_component,
|
||||
&omap_dmic_dai, 1);
|
||||
|
|
|
@ -433,6 +433,11 @@ static int omap_mcbsp_dai_set_dai_fmt(struct snd_soc_dai *cpu_dai,
|
|||
/* Sample rate generator drives the FS */
|
||||
regs->srgr2 |= FSGM;
|
||||
break;
|
||||
case SND_SOC_DAIFMT_CBM_CFS:
|
||||
/* McBSP slave. FS clock as output */
|
||||
regs->srgr2 |= FSGM;
|
||||
regs->pcr0 |= FSXM;
|
||||
break;
|
||||
case SND_SOC_DAIFMT_CBM_CFM:
|
||||
/* McBSP slave */
|
||||
break;
|
||||
|
|
|
@ -480,9 +480,6 @@ static int asoc_mcpdm_probe(struct platform_device *pdev)
|
|||
mcpdm->dma_data[1].filter_data = "up_link";
|
||||
|
||||
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mpu");
|
||||
if (res == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
mcpdm->io_base = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (IS_ERR(mcpdm->io_base))
|
||||
return PTR_ERR(mcpdm->io_base);
|
||||
|
|
Loading…
Reference in New Issue