Commit c9098c61 authored by Mark Brown's avatar Mark Brown

Merge remote-tracking branches 'asoc/topic/multi-codec',...

Merge remote-tracking branches 'asoc/topic/multi-codec', 'asoc/topic/mxs-saif', 'asoc/topic/mxs-sgtl5000', 'asoc/topic/omap' and 'asoc/topic/pxa' into asoc-next
...@@ -923,6 +923,14 @@ static void __init spitz_i2c_init(void) ...@@ -923,6 +923,14 @@ static void __init spitz_i2c_init(void)
static inline void spitz_i2c_init(void) {} static inline void spitz_i2c_init(void) {}
#endif #endif
/******************************************************************************
* Audio devices
******************************************************************************/
static inline void spitz_audio_init(void)
{
platform_device_register_simple("spitz-audio", -1, NULL, 0);
}
/****************************************************************************** /******************************************************************************
* Machine init * Machine init
******************************************************************************/ ******************************************************************************/
...@@ -970,6 +978,7 @@ static void __init spitz_init(void) ...@@ -970,6 +978,7 @@ static void __init spitz_init(void)
spitz_nor_init(); spitz_nor_init();
spitz_nand_init(); spitz_nand_init();
spitz_i2c_init(); spitz_i2c_init();
spitz_audio_init();
} }
static void __init spitz_fixup(struct tag *tags, char **cmdline) static void __init spitz_fixup(struct tag *tags, char **cmdline)
......
...@@ -1496,6 +1496,9 @@ unsigned int snd_soc_of_parse_daifmt(struct device_node *np, ...@@ -1496,6 +1496,9 @@ unsigned int snd_soc_of_parse_daifmt(struct device_node *np,
struct device_node **framemaster); struct device_node **framemaster);
int snd_soc_of_get_dai_name(struct device_node *of_node, int snd_soc_of_get_dai_name(struct device_node *of_node,
const char **dai_name); const char **dai_name);
int snd_soc_of_get_dai_link_codecs(struct device *dev,
struct device_node *of_node,
struct snd_soc_dai_link *dai_link);
#include <sound/soc-dai.h> #include <sound/soc-dai.h>
......
...@@ -773,7 +773,7 @@ static int mxs_saif_probe(struct platform_device *pdev) ...@@ -773,7 +773,7 @@ static int mxs_saif_probe(struct platform_device *pdev)
saif->dev = &pdev->dev; saif->dev = &pdev->dev;
ret = devm_request_irq(&pdev->dev, saif->irq, mxs_saif_irq, 0, ret = devm_request_irq(&pdev->dev, saif->irq, mxs_saif_irq, 0,
"mxs-saif", saif); dev_name(&pdev->dev), saif);
if (ret) { if (ret) {
dev_err(&pdev->dev, "failed to request irq\n"); dev_err(&pdev->dev, "failed to request irq\n");
return ret; return ret;
......
...@@ -49,13 +49,6 @@ static int mxs_sgtl5000_hw_params(struct snd_pcm_substream *substream, ...@@ -49,13 +49,6 @@ static int mxs_sgtl5000_hw_params(struct snd_pcm_substream *substream,
break; break;
} }
/* Sgtl5000 sysclk should be >= 8MHz and <= 27M */
if (mclk < 8000000 || mclk > 27000000) {
dev_err(codec_dai->dev, "Invalid mclk frequency: %u.%03uMHz\n",
mclk / 1000000, mclk / 1000 % 1000);
return -EINVAL;
}
/* Set SGTL5000's SYSCLK (provided by SAIF MCLK) */ /* Set SGTL5000's SYSCLK (provided by SAIF MCLK) */
ret = snd_soc_dai_set_sysclk(codec_dai, SGTL5000_SYSCLK, mclk, 0); ret = snd_soc_dai_set_sysclk(codec_dai, SGTL5000_SYSCLK, mclk, 0);
if (ret) { if (ret) {
......
...@@ -25,15 +25,15 @@ config SND_OMAP_SOC_N810 ...@@ -25,15 +25,15 @@ config SND_OMAP_SOC_N810
Say Y if you want to add support for SoC audio on Nokia N810. Say Y if you want to add support for SoC audio on Nokia N810.
config SND_OMAP_SOC_RX51 config SND_OMAP_SOC_RX51
tristate "SoC Audio support for Nokia RX-51" tristate "SoC Audio support for Nokia N900 (RX-51)"
depends on SND_OMAP_SOC && ARM && (MACH_NOKIA_RX51 || COMPILE_TEST) && I2C depends on SND_OMAP_SOC && ARM && I2C
select SND_OMAP_SOC_MCBSP select SND_OMAP_SOC_MCBSP
select SND_SOC_TLV320AIC3X select SND_SOC_TLV320AIC3X
select SND_SOC_TPA6130A2 select SND_SOC_TPA6130A2
depends on GPIOLIB depends on GPIOLIB
help help
Say Y if you want to add support for SoC audio on Nokia RX-51 Say Y if you want to add support for SoC audio on Nokia N900
hardware. This is also known as Nokia N900 product. cellphone.
config SND_OMAP_SOC_AMS_DELTA config SND_OMAP_SOC_AMS_DELTA
tristate "SoC Audio support for Amstrad E3 (Delta) videophone" tristate "SoC Audio support for Amstrad E3 (Delta) videophone"
......
...@@ -621,8 +621,7 @@ void omap_mcbsp_free(struct omap_mcbsp *mcbsp) ...@@ -621,8 +621,7 @@ void omap_mcbsp_free(struct omap_mcbsp *mcbsp)
mcbsp->reg_cache = NULL; mcbsp->reg_cache = NULL;
spin_unlock(&mcbsp->lock); spin_unlock(&mcbsp->lock);
if (reg_cache) kfree(reg_cache);
kfree(reg_cache);
} }
/* /*
......
...@@ -127,15 +127,12 @@ static const struct snd_soc_dapm_route audio_map[] = { ...@@ -127,15 +127,12 @@ static const struct snd_soc_dapm_route audio_map[] = {
static int mioa701_wm9713_init(struct snd_soc_pcm_runtime *rtd) static int mioa701_wm9713_init(struct snd_soc_pcm_runtime *rtd)
{ {
struct snd_soc_codec *codec = rtd->codec; struct snd_soc_codec *codec = rtd->codec;
unsigned short reg;
/* Prepare GPIO8 for rear speaker amplifier */ /* Prepare GPIO8 for rear speaker amplifier */
reg = codec->driver->read(codec, AC97_GPIO_CFG); snd_soc_update_bits(codec, AC97_GPIO_CFG, 0x100, 0x100);
codec->driver->write(codec, AC97_GPIO_CFG, reg | 0x0100);
/* Prepare MIC input */ /* Prepare MIC input */
reg = codec->driver->read(codec, AC97_3D_CONTROL); snd_soc_update_bits(codec, AC97_3D_CONTROL, 0xc000, 0xc000);
codec->driver->write(codec, AC97_3D_CONTROL, reg | 0xc000);
return 0; return 0;
} }
......
...@@ -97,7 +97,7 @@ static int pxa_ssp_startup(struct snd_pcm_substream *substream, ...@@ -97,7 +97,7 @@ static int pxa_ssp_startup(struct snd_pcm_substream *substream,
int ret = 0; int ret = 0;
if (!cpu_dai->active) { if (!cpu_dai->active) {
clk_enable(ssp->clk); clk_prepare_enable(ssp->clk);
pxa_ssp_disable(ssp); pxa_ssp_disable(ssp);
} }
...@@ -121,7 +121,7 @@ static void pxa_ssp_shutdown(struct snd_pcm_substream *substream, ...@@ -121,7 +121,7 @@ static void pxa_ssp_shutdown(struct snd_pcm_substream *substream,
if (!cpu_dai->active) { if (!cpu_dai->active) {
pxa_ssp_disable(ssp); pxa_ssp_disable(ssp);
clk_disable(ssp->clk); clk_disable_unprepare(ssp->clk);
} }
kfree(snd_soc_dai_get_dma_data(cpu_dai, substream)); kfree(snd_soc_dai_get_dma_data(cpu_dai, substream));
...@@ -136,7 +136,7 @@ static int pxa_ssp_suspend(struct snd_soc_dai *cpu_dai) ...@@ -136,7 +136,7 @@ static int pxa_ssp_suspend(struct snd_soc_dai *cpu_dai)
struct ssp_device *ssp = priv->ssp; struct ssp_device *ssp = priv->ssp;
if (!cpu_dai->active) if (!cpu_dai->active)
clk_enable(ssp->clk); clk_prepare_enable(ssp->clk);
priv->cr0 = __raw_readl(ssp->mmio_base + SSCR0); priv->cr0 = __raw_readl(ssp->mmio_base + SSCR0);
priv->cr1 = __raw_readl(ssp->mmio_base + SSCR1); priv->cr1 = __raw_readl(ssp->mmio_base + SSCR1);
...@@ -144,7 +144,7 @@ static int pxa_ssp_suspend(struct snd_soc_dai *cpu_dai) ...@@ -144,7 +144,7 @@ static int pxa_ssp_suspend(struct snd_soc_dai *cpu_dai)
priv->psp = __raw_readl(ssp->mmio_base + SSPSP); priv->psp = __raw_readl(ssp->mmio_base + SSPSP);
pxa_ssp_disable(ssp); pxa_ssp_disable(ssp);
clk_disable(ssp->clk); clk_disable_unprepare(ssp->clk);
return 0; return 0;
} }
...@@ -154,7 +154,7 @@ static int pxa_ssp_resume(struct snd_soc_dai *cpu_dai) ...@@ -154,7 +154,7 @@ static int pxa_ssp_resume(struct snd_soc_dai *cpu_dai)
struct ssp_device *ssp = priv->ssp; struct ssp_device *ssp = priv->ssp;
uint32_t sssr = SSSR_ROR | SSSR_TUR | SSSR_BCE; uint32_t sssr = SSSR_ROR | SSSR_TUR | SSSR_BCE;
clk_enable(ssp->clk); clk_prepare_enable(ssp->clk);
__raw_writel(sssr, ssp->mmio_base + SSSR); __raw_writel(sssr, ssp->mmio_base + SSSR);
__raw_writel(priv->cr0 & ~SSCR0_SSE, ssp->mmio_base + SSCR0); __raw_writel(priv->cr0 & ~SSCR0_SSE, ssp->mmio_base + SSCR0);
...@@ -165,7 +165,7 @@ static int pxa_ssp_resume(struct snd_soc_dai *cpu_dai) ...@@ -165,7 +165,7 @@ static int pxa_ssp_resume(struct snd_soc_dai *cpu_dai)
if (cpu_dai->active) if (cpu_dai->active)
pxa_ssp_enable(ssp); pxa_ssp_enable(ssp);
else else
clk_disable(ssp->clk); clk_disable_unprepare(ssp->clk);
return 0; return 0;
} }
...@@ -256,11 +256,11 @@ static int pxa_ssp_set_dai_sysclk(struct snd_soc_dai *cpu_dai, ...@@ -256,11 +256,11 @@ static int pxa_ssp_set_dai_sysclk(struct snd_soc_dai *cpu_dai,
/* The SSP clock must be disabled when changing SSP clock mode /* The SSP clock must be disabled when changing SSP clock mode
* on PXA2xx. On PXA3xx it must be enabled when doing so. */ * on PXA2xx. On PXA3xx it must be enabled when doing so. */
if (ssp->type != PXA3xx_SSP) if (ssp->type != PXA3xx_SSP)
clk_disable(ssp->clk); clk_disable_unprepare(ssp->clk);
val = pxa_ssp_read_reg(ssp, SSCR0) | sscr0; val = pxa_ssp_read_reg(ssp, SSCR0) | sscr0;
pxa_ssp_write_reg(ssp, SSCR0, val); pxa_ssp_write_reg(ssp, SSCR0, val);
if (ssp->type != PXA3xx_SSP) if (ssp->type != PXA3xx_SSP)
clk_enable(ssp->clk); clk_prepare_enable(ssp->clk);
return 0; return 0;
} }
......
...@@ -305,19 +305,15 @@ static struct snd_soc_card snd_soc_spitz = { ...@@ -305,19 +305,15 @@ static struct snd_soc_card snd_soc_spitz = {
.num_dapm_routes = ARRAY_SIZE(spitz_audio_map), .num_dapm_routes = ARRAY_SIZE(spitz_audio_map),
}; };
static struct platform_device *spitz_snd_device; static int spitz_probe(struct platform_device *pdev)
static int __init spitz_init(void)
{ {
struct snd_soc_card *card = &snd_soc_spitz;
int ret; int ret;
if (!(machine_is_spitz() || machine_is_borzoi() || machine_is_akita())) if (machine_is_akita())
return -ENODEV;
if (machine_is_borzoi() || machine_is_spitz())
spitz_mic_gpio = SPITZ_GPIO_MIC_BIAS;
else
spitz_mic_gpio = AKITA_GPIO_MIC_BIAS; spitz_mic_gpio = AKITA_GPIO_MIC_BIAS;
else
spitz_mic_gpio = SPITZ_GPIO_MIC_BIAS;
ret = gpio_request(spitz_mic_gpio, "MIC GPIO"); ret = gpio_request(spitz_mic_gpio, "MIC GPIO");
if (ret) if (ret)
...@@ -327,37 +323,45 @@ static int __init spitz_init(void) ...@@ -327,37 +323,45 @@ static int __init spitz_init(void)
if (ret) if (ret)
goto err2; goto err2;
spitz_snd_device = platform_device_alloc("soc-audio", -1); card->dev = &pdev->dev;
if (!spitz_snd_device) {
ret = -ENOMEM; ret = snd_soc_register_card(card);
if (ret) {
dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n",
ret);
goto err2; goto err2;
} }
platform_set_drvdata(spitz_snd_device, &snd_soc_spitz);
ret = platform_device_add(spitz_snd_device);
if (ret)
goto err3;
return 0; return 0;
err3:
platform_device_put(spitz_snd_device);
err2: err2:
gpio_free(spitz_mic_gpio); gpio_free(spitz_mic_gpio);
err1: err1:
return ret; return ret;
} }
static void __exit spitz_exit(void) static int spitz_remove(struct platform_device *pdev)
{ {
platform_device_unregister(spitz_snd_device); struct snd_soc_card *card = platform_get_drvdata(pdev);
snd_soc_unregister_card(card);
gpio_free(spitz_mic_gpio); gpio_free(spitz_mic_gpio);
return 0;
} }
module_init(spitz_init); static struct platform_driver spitz_driver = {
module_exit(spitz_exit); .driver = {
.name = "spitz-audio",
.owner = THIS_MODULE,
.pm = &snd_soc_pm_ops,
},
.probe = spitz_probe,
.remove = spitz_remove,
};
module_platform_driver(spitz_driver);
MODULE_AUTHOR("Richard Purdie"); MODULE_AUTHOR("Richard Purdie");
MODULE_DESCRIPTION("ALSA SoC Spitz"); MODULE_DESCRIPTION("ALSA SoC Spitz");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:spitz-audio");
...@@ -3400,36 +3400,30 @@ unsigned int snd_soc_of_parse_daifmt(struct device_node *np, ...@@ -3400,36 +3400,30 @@ unsigned int snd_soc_of_parse_daifmt(struct device_node *np,
} }
EXPORT_SYMBOL_GPL(snd_soc_of_parse_daifmt); EXPORT_SYMBOL_GPL(snd_soc_of_parse_daifmt);
int snd_soc_of_get_dai_name(struct device_node *of_node, static int snd_soc_get_dai_name(struct of_phandle_args *args,
const char **dai_name) const char **dai_name)
{ {
struct snd_soc_component *pos; struct snd_soc_component *pos;
struct of_phandle_args args; int ret = -EPROBE_DEFER;
int ret;
ret = of_parse_phandle_with_args(of_node, "sound-dai",
"#sound-dai-cells", 0, &args);
if (ret)
return ret;
ret = -EPROBE_DEFER;
mutex_lock(&client_mutex); mutex_lock(&client_mutex);
list_for_each_entry(pos, &component_list, list) { list_for_each_entry(pos, &component_list, list) {
if (pos->dev->of_node != args.np) if (pos->dev->of_node != args->np)
continue; continue;
if (pos->driver->of_xlate_dai_name) { if (pos->driver->of_xlate_dai_name) {
ret = pos->driver->of_xlate_dai_name(pos, &args, dai_name); ret = pos->driver->of_xlate_dai_name(pos,
args,
dai_name);
} else { } else {
int id = -1; int id = -1;
switch (args.args_count) { switch (args->args_count) {
case 0: case 0:
id = 0; /* same as dai_drv[0] */ id = 0; /* same as dai_drv[0] */
break; break;
case 1: case 1:
id = args.args[0]; id = args->args[0];
break; break;
default: default:
/* not supported */ /* not supported */
...@@ -3451,6 +3445,21 @@ int snd_soc_of_get_dai_name(struct device_node *of_node, ...@@ -3451,6 +3445,21 @@ int snd_soc_of_get_dai_name(struct device_node *of_node,
break; break;
} }
mutex_unlock(&client_mutex); mutex_unlock(&client_mutex);
return ret;
}
int snd_soc_of_get_dai_name(struct device_node *of_node,
const char **dai_name)
{
struct of_phandle_args args;
int ret;
ret = of_parse_phandle_with_args(of_node, "sound-dai",
"#sound-dai-cells", 0, &args);
if (ret)
return ret;
ret = snd_soc_get_dai_name(&args, dai_name);
of_node_put(args.np); of_node_put(args.np);
...@@ -3458,6 +3467,77 @@ int snd_soc_of_get_dai_name(struct device_node *of_node, ...@@ -3458,6 +3467,77 @@ int snd_soc_of_get_dai_name(struct device_node *of_node,
} }
EXPORT_SYMBOL_GPL(snd_soc_of_get_dai_name); EXPORT_SYMBOL_GPL(snd_soc_of_get_dai_name);
/*
* snd_soc_of_get_dai_link_codecs - Parse a list of CODECs in the devicetree
* @dev: Card device
* @of_node: Device node
* @dai_link: DAI link
*
* Builds an array of CODEC DAI components from the DAI link property
* 'sound-dai'.
* The array is set in the DAI link and the number of DAIs is set accordingly.
* The device nodes in the array (of_node) must be dereferenced by the caller.
*
* Returns 0 for success
*/
int snd_soc_of_get_dai_link_codecs(struct device *dev,
struct device_node *of_node,
struct snd_soc_dai_link *dai_link)
{
struct of_phandle_args args;
struct snd_soc_dai_link_component *component;
char *name;
int index, num_codecs, ret;
/* Count the number of CODECs */
name = "sound-dai";
num_codecs = of_count_phandle_with_args(of_node, name,
"#sound-dai-cells");
if (num_codecs <= 0) {
if (num_codecs == -ENOENT)
dev_err(dev, "No 'sound-dai' property\n");
else
dev_err(dev, "Bad phandle in 'sound-dai'\n");
return num_codecs;
}
component = devm_kzalloc(dev,
sizeof *component * num_codecs,
GFP_KERNEL);
if (!component)
return -ENOMEM;
dai_link->codecs = component;
dai_link->num_codecs = num_codecs;
/* Parse the list */
for (index = 0, component = dai_link->codecs;
index < dai_link->num_codecs;
index++, component++) {
ret = of_parse_phandle_with_args(of_node, name,
"#sound-dai-cells",
index, &args);
if (ret)
goto err;
component->of_node = args.np;
ret = snd_soc_get_dai_name(&args, &component->dai_name);
if (ret < 0)
goto err;
}
return 0;
err:
for (index = 0, component = dai_link->codecs;
index < dai_link->num_codecs;
index++, component++) {
if (!component->of_node)
break;
of_node_put(component->of_node);
component->of_node = NULL;
}
dai_link->codecs = NULL;
dai_link->num_codecs = 0;
return ret;
}
EXPORT_SYMBOL_GPL(snd_soc_of_get_dai_link_codecs);
static int __init snd_soc_init(void) static int __init snd_soc_init(void)
{ {
#ifdef CONFIG_DEBUG_FS #ifdef CONFIG_DEBUG_FS
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment