ALSA: ASoC: OMAP: Add support for OMAP2430 and OMAP34xx in McBSP DAI driver
Thanks to Arun KS <arunks@mistralsolutions.com> for fixing one typo in original version of this patch. Signed-off-by: Jarkko Nikula <jarkko.nikula@nokia.com> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
8def464ddd
commit
406e2c48cf
|
@ -84,11 +84,22 @@ static const unsigned long omap1_mcbsp_port[][2] = {
|
|||
static const int omap1_dma_reqs[][2] = {};
|
||||
static const unsigned long omap1_mcbsp_port[][2] = {};
|
||||
#endif
|
||||
#if defined(CONFIG_ARCH_OMAP2420)
|
||||
static const int omap2420_dma_reqs[][2] = {
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX)
|
||||
static const int omap24xx_dma_reqs[][2] = {
|
||||
{ OMAP24XX_DMA_MCBSP1_TX, OMAP24XX_DMA_MCBSP1_RX },
|
||||
{ OMAP24XX_DMA_MCBSP2_TX, OMAP24XX_DMA_MCBSP2_RX },
|
||||
#if defined(CONFIG_ARCH_OMAP2430) || defined(CONFIG_ARCH_OMAP34XX)
|
||||
{ OMAP24XX_DMA_MCBSP3_TX, OMAP24XX_DMA_MCBSP3_RX },
|
||||
{ OMAP24XX_DMA_MCBSP4_TX, OMAP24XX_DMA_MCBSP4_RX },
|
||||
{ OMAP24XX_DMA_MCBSP5_TX, OMAP24XX_DMA_MCBSP5_RX },
|
||||
#endif
|
||||
};
|
||||
#else
|
||||
static const int omap24xx_dma_reqs[][2] = {};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP2420)
|
||||
static const unsigned long omap2420_mcbsp_port[][2] = {
|
||||
{ OMAP24XX_MCBSP1_BASE + OMAP_MCBSP_REG_DXR1,
|
||||
OMAP24XX_MCBSP1_BASE + OMAP_MCBSP_REG_DRR1 },
|
||||
|
@ -96,10 +107,43 @@ static const unsigned long omap2420_mcbsp_port[][2] = {
|
|||
OMAP24XX_MCBSP2_BASE + OMAP_MCBSP_REG_DRR1 },
|
||||
};
|
||||
#else
|
||||
static const int omap2420_dma_reqs[][2] = {};
|
||||
static const unsigned long omap2420_mcbsp_port[][2] = {};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP2430)
|
||||
static const unsigned long omap2430_mcbsp_port[][2] = {
|
||||
{ OMAP24XX_MCBSP1_BASE + OMAP_MCBSP_REG_DXR,
|
||||
OMAP24XX_MCBSP1_BASE + OMAP_MCBSP_REG_DRR },
|
||||
{ OMAP24XX_MCBSP2_BASE + OMAP_MCBSP_REG_DXR,
|
||||
OMAP24XX_MCBSP2_BASE + OMAP_MCBSP_REG_DRR },
|
||||
{ OMAP2430_MCBSP3_BASE + OMAP_MCBSP_REG_DXR,
|
||||
OMAP2430_MCBSP3_BASE + OMAP_MCBSP_REG_DRR },
|
||||
{ OMAP2430_MCBSP4_BASE + OMAP_MCBSP_REG_DXR,
|
||||
OMAP2430_MCBSP4_BASE + OMAP_MCBSP_REG_DRR },
|
||||
{ OMAP2430_MCBSP5_BASE + OMAP_MCBSP_REG_DXR,
|
||||
OMAP2430_MCBSP5_BASE + OMAP_MCBSP_REG_DRR },
|
||||
};
|
||||
#else
|
||||
static const unsigned long omap2430_mcbsp_port[][2] = {};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP34XX)
|
||||
static const unsigned long omap34xx_mcbsp_port[][2] = {
|
||||
{ OMAP34XX_MCBSP1_BASE + OMAP_MCBSP_REG_DXR,
|
||||
OMAP34XX_MCBSP1_BASE + OMAP_MCBSP_REG_DRR },
|
||||
{ OMAP34XX_MCBSP2_BASE + OMAP_MCBSP_REG_DXR,
|
||||
OMAP34XX_MCBSP2_BASE + OMAP_MCBSP_REG_DRR },
|
||||
{ OMAP34XX_MCBSP3_BASE + OMAP_MCBSP_REG_DXR,
|
||||
OMAP34XX_MCBSP3_BASE + OMAP_MCBSP_REG_DRR },
|
||||
{ OMAP34XX_MCBSP4_BASE + OMAP_MCBSP_REG_DXR,
|
||||
OMAP34XX_MCBSP4_BASE + OMAP_MCBSP_REG_DRR },
|
||||
{ OMAP34XX_MCBSP5_BASE + OMAP_MCBSP_REG_DXR,
|
||||
OMAP34XX_MCBSP5_BASE + OMAP_MCBSP_REG_DRR },
|
||||
};
|
||||
#else
|
||||
static const unsigned long omap34xx_mcbsp_port[][2] = {};
|
||||
#endif
|
||||
|
||||
static int omap_mcbsp_dai_startup(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||
|
@ -167,12 +211,15 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream,
|
|||
dma = omap1_dma_reqs[bus_id][substream->stream];
|
||||
port = omap1_mcbsp_port[bus_id][substream->stream];
|
||||
} else if (cpu_is_omap2420()) {
|
||||
dma = omap2420_dma_reqs[bus_id][substream->stream];
|
||||
dma = omap24xx_dma_reqs[bus_id][substream->stream];
|
||||
port = omap2420_mcbsp_port[bus_id][substream->stream];
|
||||
} else if (cpu_is_omap2430()) {
|
||||
dma = omap24xx_dma_reqs[bus_id][substream->stream];
|
||||
port = omap2430_mcbsp_port[bus_id][substream->stream];
|
||||
} else if (cpu_is_omap343x()) {
|
||||
dma = omap24xx_dma_reqs[bus_id][substream->stream];
|
||||
port = omap34xx_mcbsp_port[bus_id][substream->stream];
|
||||
} else {
|
||||
/*
|
||||
* TODO: Add support for 2430 and 3430
|
||||
*/
|
||||
return -ENODEV;
|
||||
}
|
||||
omap_mcbsp_dai_dma_params[id][substream->stream].dma_req = dma;
|
||||
|
@ -315,7 +362,7 @@ static int omap_mcbsp_dai_set_clks_src(struct omap_mcbsp_data *mcbsp_data,
|
|||
int clk_id)
|
||||
{
|
||||
int sel_bit;
|
||||
u16 reg;
|
||||
u16 reg, reg_devconf1 = OMAP243X_CONTROL_DEVCONF1;
|
||||
|
||||
if (cpu_class_is_omap1()) {
|
||||
/* OMAP1's can use only external source clock */
|
||||
|
@ -325,6 +372,12 @@ static int omap_mcbsp_dai_set_clks_src(struct omap_mcbsp_data *mcbsp_data,
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (cpu_is_omap2420() && mcbsp_data->bus_id > 1)
|
||||
return -EINVAL;
|
||||
|
||||
if (cpu_is_omap343x())
|
||||
reg_devconf1 = OMAP343X_CONTROL_DEVCONF1;
|
||||
|
||||
switch (mcbsp_data->bus_id) {
|
||||
case 0:
|
||||
reg = OMAP2_CONTROL_DEVCONF0;
|
||||
|
@ -334,20 +387,26 @@ static int omap_mcbsp_dai_set_clks_src(struct omap_mcbsp_data *mcbsp_data,
|
|||
reg = OMAP2_CONTROL_DEVCONF0;
|
||||
sel_bit = 6;
|
||||
break;
|
||||
/* TODO: Support for ports 3 - 5 in OMAP2430 and OMAP34xx */
|
||||
case 2:
|
||||
reg = reg_devconf1;
|
||||
sel_bit = 0;
|
||||
break;
|
||||
case 3:
|
||||
reg = reg_devconf1;
|
||||
sel_bit = 2;
|
||||
break;
|
||||
case 4:
|
||||
reg = reg_devconf1;
|
||||
sel_bit = 4;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (cpu_class_is_omap2()) {
|
||||
if (clk_id == OMAP_MCBSP_SYSCLK_CLKS_FCLK) {
|
||||
omap_ctrl_writel(omap_ctrl_readl(reg) &
|
||||
~(1 << sel_bit), reg);
|
||||
} else {
|
||||
omap_ctrl_writel(omap_ctrl_readl(reg) |
|
||||
(1 << sel_bit), reg);
|
||||
}
|
||||
}
|
||||
if (clk_id == OMAP_MCBSP_SYSCLK_CLKS_FCLK)
|
||||
omap_ctrl_writel(omap_ctrl_readl(reg) & ~(1 << sel_bit), reg);
|
||||
else
|
||||
omap_ctrl_writel(omap_ctrl_readl(reg) | (1 << sel_bit), reg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue