Merge branch 'asoc-omap' into for-3.7
This commit is contained in:
@@ -47,26 +47,10 @@ static int am3517evm_hw_params(struct snd_pcm_substream *substream,
|
||||
/* Set the codec system clock for DAC and ADC */
|
||||
ret = snd_soc_dai_set_sysclk(codec_dai, 0,
|
||||
CODEC_CLOCK, SND_SOC_CLOCK_IN);
|
||||
if (ret < 0) {
|
||||
if (ret < 0)
|
||||
printk(KERN_ERR "can't set codec system clock\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = snd_soc_dai_set_sysclk(cpu_dai, OMAP_MCBSP_CLKR_SRC_CLKX, 0,
|
||||
SND_SOC_CLOCK_IN);
|
||||
if (ret < 0) {
|
||||
printk(KERN_ERR "can't set CPU system clock OMAP_MCBSP_CLKR_SRC_CLKX\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
snd_soc_dai_set_sysclk(cpu_dai, OMAP_MCBSP_FSR_SRC_FSX, 0,
|
||||
SND_SOC_CLOCK_IN);
|
||||
if (ret < 0) {
|
||||
printk(KERN_ERR "can't set CPU system clock OMAP_MCBSP_FSR_SRC_FSX\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct snd_soc_ops am3517evm_ops = {
|
||||
|
@@ -24,6 +24,7 @@
|
||||
#include <linux/delay.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
|
||||
#include <plat/mcbsp.h>
|
||||
|
||||
@@ -726,19 +727,39 @@ void omap_mcbsp_stop(struct omap_mcbsp *mcbsp, int tx, int rx)
|
||||
|
||||
int omap2_mcbsp_set_clks_src(struct omap_mcbsp *mcbsp, u8 fck_src_id)
|
||||
{
|
||||
struct clk *fck_src;
|
||||
const char *src;
|
||||
int r;
|
||||
|
||||
if (fck_src_id == MCBSP_CLKS_PAD_SRC)
|
||||
src = "clks_ext";
|
||||
src = "pad_fck";
|
||||
else if (fck_src_id == MCBSP_CLKS_PRCM_SRC)
|
||||
src = "clks_fclk";
|
||||
src = "prcm_fck";
|
||||
else
|
||||
return -EINVAL;
|
||||
|
||||
if (mcbsp->pdata->set_clk_src)
|
||||
return mcbsp->pdata->set_clk_src(mcbsp->dev, mcbsp->fclk, src);
|
||||
else
|
||||
fck_src = clk_get(mcbsp->dev, src);
|
||||
if (IS_ERR(fck_src)) {
|
||||
dev_err(mcbsp->dev, "CLKS: could not clk_get() %s\n", src);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
pm_runtime_put_sync(mcbsp->dev);
|
||||
|
||||
r = clk_set_parent(mcbsp->fclk, fck_src);
|
||||
if (r) {
|
||||
dev_err(mcbsp->dev, "CLKS: could not clk_set_parent() to %s\n",
|
||||
src);
|
||||
clk_put(fck_src);
|
||||
return r;
|
||||
}
|
||||
|
||||
pm_runtime_get_sync(mcbsp->dev);
|
||||
|
||||
clk_put(fck_src);
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
int omap_mcbsp_6pin_src_mux(struct omap_mcbsp *mcbsp, u8 mux)
|
||||
|
@@ -334,9 +334,6 @@ void omap_mcbsp_stop(struct omap_mcbsp *mcbsp, int tx, int rx);
|
||||
/* McBSP functional clock source changing function */
|
||||
int omap2_mcbsp_set_clks_src(struct omap_mcbsp *mcbsp, u8 fck_src_id);
|
||||
|
||||
/* McBSP signal muxing API */
|
||||
int omap_mcbsp_6pin_src_mux(struct omap_mcbsp *mcbsp, u8 mux);
|
||||
|
||||
/* Sidetone specific API */
|
||||
int omap_st_set_chgain(struct omap_mcbsp *mcbsp, int channel, s16 chgain);
|
||||
int omap_st_get_chgain(struct omap_mcbsp *mcbsp, int channel, s16 *chgain);
|
||||
|
@@ -26,6 +26,8 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <sound/core.h>
|
||||
#include <sound/pcm.h>
|
||||
#include <sound/pcm_params.h>
|
||||
@@ -398,12 +400,14 @@ static int omap_mcbsp_dai_set_dai_fmt(struct snd_soc_dai *cpu_dai,
|
||||
/* Generic McBSP register settings */
|
||||
regs->spcr2 |= XINTM(3) | FREE;
|
||||
regs->spcr1 |= RINTM(3);
|
||||
/* RFIG and XFIG are not defined in 34xx */
|
||||
if (!cpu_is_omap34xx() && !cpu_is_omap44xx()) {
|
||||
/* RFIG and XFIG are not defined in 2430 and on OMAP3+ */
|
||||
if (!mcbsp->pdata->has_ccr) {
|
||||
regs->rcr2 |= RFIG;
|
||||
regs->xcr2 |= XFIG;
|
||||
}
|
||||
if (cpu_is_omap2430() || cpu_is_omap34xx() || cpu_is_omap44xx()) {
|
||||
|
||||
/* Configure XCCR/RCCR only for revisions which have ccr registers */
|
||||
if (mcbsp->pdata->has_ccr) {
|
||||
regs->xccr = DXENDLY(1) | XDMAEN | XDISABLE;
|
||||
regs->rccr = RFULL_CYCLE | RDMAEN | RDISABLE;
|
||||
}
|
||||
@@ -516,21 +520,9 @@ static int omap_mcbsp_dai_set_dai_sysclk(struct snd_soc_dai *cpu_dai,
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
if (clk_id == OMAP_MCBSP_SYSCLK_CLK ||
|
||||
clk_id == OMAP_MCBSP_SYSCLK_CLKS_FCLK ||
|
||||
clk_id == OMAP_MCBSP_SYSCLK_CLKS_EXT ||
|
||||
clk_id == OMAP_MCBSP_SYSCLK_CLKX_EXT ||
|
||||
clk_id == OMAP_MCBSP_SYSCLK_CLKR_EXT) {
|
||||
mcbsp->in_freq = freq;
|
||||
regs->srgr2 &= ~CLKSM;
|
||||
regs->pcr0 &= ~SCLKME;
|
||||
} else if (cpu_class_is_omap1()) {
|
||||
/*
|
||||
* McBSP CLKR/FSR signal muxing functions are only available on
|
||||
* OMAP2 or newer versions
|
||||
*/
|
||||
return -EINVAL;
|
||||
}
|
||||
mcbsp->in_freq = freq;
|
||||
regs->srgr2 &= ~CLKSM;
|
||||
regs->pcr0 &= ~SCLKME;
|
||||
|
||||
switch (clk_id) {
|
||||
case OMAP_MCBSP_SYSCLK_CLK:
|
||||
@@ -558,20 +550,6 @@ static int omap_mcbsp_dai_set_dai_sysclk(struct snd_soc_dai *cpu_dai,
|
||||
case OMAP_MCBSP_SYSCLK_CLKR_EXT:
|
||||
regs->pcr0 |= SCLKME;
|
||||
break;
|
||||
|
||||
|
||||
case OMAP_MCBSP_CLKR_SRC_CLKR:
|
||||
err = omap_mcbsp_6pin_src_mux(mcbsp, CLKR_SRC_CLKR);
|
||||
break;
|
||||
case OMAP_MCBSP_CLKR_SRC_CLKX:
|
||||
err = omap_mcbsp_6pin_src_mux(mcbsp, CLKR_SRC_CLKX);
|
||||
break;
|
||||
case OMAP_MCBSP_FSR_SRC_FSR:
|
||||
err = omap_mcbsp_6pin_src_mux(mcbsp, FSR_SRC_FSR);
|
||||
break;
|
||||
case OMAP_MCBSP_FSR_SRC_FSX:
|
||||
err = omap_mcbsp_6pin_src_mux(mcbsp, FSR_SRC_FSX);
|
||||
break;
|
||||
default:
|
||||
err = -ENODEV;
|
||||
}
|
||||
@@ -761,13 +739,74 @@ int omap_mcbsp_st_add_controls(struct snd_soc_pcm_runtime *rtd)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(omap_mcbsp_st_add_controls);
|
||||
|
||||
static struct omap_mcbsp_platform_data omap2420_pdata = {
|
||||
.reg_step = 4,
|
||||
.reg_size = 2,
|
||||
};
|
||||
|
||||
static struct omap_mcbsp_platform_data omap2430_pdata = {
|
||||
.reg_step = 4,
|
||||
.reg_size = 4,
|
||||
.has_ccr = true,
|
||||
};
|
||||
|
||||
static struct omap_mcbsp_platform_data omap3_pdata = {
|
||||
.reg_step = 4,
|
||||
.reg_size = 4,
|
||||
.has_ccr = true,
|
||||
.has_wakeup = true,
|
||||
};
|
||||
|
||||
static struct omap_mcbsp_platform_data omap4_pdata = {
|
||||
.reg_step = 4,
|
||||
.reg_size = 4,
|
||||
.has_ccr = true,
|
||||
.has_wakeup = true,
|
||||
};
|
||||
|
||||
static const struct of_device_id omap_mcbsp_of_match[] = {
|
||||
{
|
||||
.compatible = "ti,omap2420-mcbsp",
|
||||
.data = &omap2420_pdata,
|
||||
},
|
||||
{
|
||||
.compatible = "ti,omap2430-mcbsp",
|
||||
.data = &omap2430_pdata,
|
||||
},
|
||||
{
|
||||
.compatible = "ti,omap3-mcbsp",
|
||||
.data = &omap3_pdata,
|
||||
},
|
||||
{
|
||||
.compatible = "ti,omap4-mcbsp",
|
||||
.data = &omap4_pdata,
|
||||
},
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, omap_mcbsp_of_match);
|
||||
|
||||
static __devinit int asoc_mcbsp_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct omap_mcbsp_platform_data *pdata = dev_get_platdata(&pdev->dev);
|
||||
struct omap_mcbsp *mcbsp;
|
||||
const struct of_device_id *match;
|
||||
int ret;
|
||||
|
||||
if (!pdata) {
|
||||
match = of_match_device(omap_mcbsp_of_match, &pdev->dev);
|
||||
if (match) {
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
int buffer_size;
|
||||
|
||||
pdata = devm_kzalloc(&pdev->dev,
|
||||
sizeof(struct omap_mcbsp_platform_data),
|
||||
GFP_KERNEL);
|
||||
if (!pdata)
|
||||
return -ENOMEM;
|
||||
|
||||
memcpy(pdata, match->data, sizeof(*pdata));
|
||||
if (!of_property_read_u32(node, "ti,buffer-size", &buffer_size))
|
||||
pdata->buffer_size = buffer_size;
|
||||
} else if (!pdata) {
|
||||
dev_err(&pdev->dev, "missing platform data.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -809,6 +848,7 @@ static struct platform_driver asoc_mcbsp_driver = {
|
||||
.driver = {
|
||||
.name = "omap-mcbsp",
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = omap_mcbsp_of_match,
|
||||
},
|
||||
|
||||
.probe = asoc_mcbsp_probe,
|
||||
|
@@ -32,10 +32,6 @@ enum omap_mcbsp_clksrg_clk {
|
||||
OMAP_MCBSP_SYSCLK_CLK, /* Internal ICLK */
|
||||
OMAP_MCBSP_SYSCLK_CLKX_EXT, /* External CLKX pin */
|
||||
OMAP_MCBSP_SYSCLK_CLKR_EXT, /* External CLKR pin */
|
||||
OMAP_MCBSP_CLKR_SRC_CLKR, /* CLKR from CLKR pin */
|
||||
OMAP_MCBSP_CLKR_SRC_CLKX, /* CLKR from CLKX pin */
|
||||
OMAP_MCBSP_FSR_SRC_FSR, /* FSR from FSR pin */
|
||||
OMAP_MCBSP_FSR_SRC_FSX, /* FSR from FSX pin */
|
||||
};
|
||||
|
||||
/* McBSP dividers */
|
||||
@@ -43,22 +39,6 @@ enum omap_mcbsp_div {
|
||||
OMAP_MCBSP_CLKGDV, /* Sample rate generator divider */
|
||||
};
|
||||
|
||||
#if defined(CONFIG_SOC_OMAP2420)
|
||||
#define NUM_LINKS 2
|
||||
#endif
|
||||
#if defined(CONFIG_ARCH_OMAP15XX) || defined(CONFIG_ARCH_OMAP16XX)
|
||||
#undef NUM_LINKS
|
||||
#define NUM_LINKS 3
|
||||
#endif
|
||||
#if defined(CONFIG_ARCH_OMAP4)
|
||||
#undef NUM_LINKS
|
||||
#define NUM_LINKS 4
|
||||
#endif
|
||||
#if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_SOC_OMAP2430)
|
||||
#undef NUM_LINKS
|
||||
#define NUM_LINKS 5
|
||||
#endif
|
||||
|
||||
int omap_mcbsp_st_add_controls(struct snd_soc_pcm_runtime *rtd);
|
||||
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user