Merge remote-tracking branches 'asoc/topic/fsi', 'asoc/topic/fsl', 'asoc/topic/fsl-asrc', 'asoc/topic/fsl-card' and 'asoc/topic/fsl-sai' into asoc-next
This commit is contained in:
commit
bb85d37358
|
@ -182,7 +182,7 @@ static int eukrea_tlv320_probe(struct platform_device *pdev)
|
|||
);
|
||||
} else {
|
||||
if (np) {
|
||||
/* The eukrea,asoc-tlv320 driver was explicitely
|
||||
/* The eukrea,asoc-tlv320 driver was explicitly
|
||||
* requested (through the device tree).
|
||||
*/
|
||||
dev_err(&pdev->dev,
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
|
||||
#include "../codecs/sgtl5000.h"
|
||||
#include "../codecs/wm8962.h"
|
||||
#include "../codecs/wm8960.h"
|
||||
|
||||
#define RX 0
|
||||
#define TX 1
|
||||
|
@ -407,6 +408,7 @@ static int fsl_asoc_card_probe(struct platform_device *pdev)
|
|||
struct fsl_asoc_card_priv *priv;
|
||||
struct i2c_client *codec_dev;
|
||||
struct clk *codec_clk;
|
||||
const char *codec_dai_name;
|
||||
u32 width;
|
||||
int ret;
|
||||
|
||||
|
@ -459,6 +461,7 @@ static int fsl_asoc_card_probe(struct platform_device *pdev)
|
|||
|
||||
/* Diversify the card configurations */
|
||||
if (of_device_is_compatible(np, "fsl,imx-audio-cs42888")) {
|
||||
codec_dai_name = "cs42888";
|
||||
priv->card.set_bias_level = NULL;
|
||||
priv->cpu_priv.sysclk_freq[TX] = priv->codec_priv.mclk_freq;
|
||||
priv->cpu_priv.sysclk_freq[RX] = priv->codec_priv.mclk_freq;
|
||||
|
@ -467,14 +470,22 @@ static int fsl_asoc_card_probe(struct platform_device *pdev)
|
|||
priv->cpu_priv.slot_width = 32;
|
||||
priv->dai_fmt |= SND_SOC_DAIFMT_CBS_CFS;
|
||||
} else if (of_device_is_compatible(np, "fsl,imx-audio-sgtl5000")) {
|
||||
codec_dai_name = "sgtl5000";
|
||||
priv->codec_priv.mclk_id = SGTL5000_SYSCLK;
|
||||
priv->dai_fmt |= SND_SOC_DAIFMT_CBM_CFM;
|
||||
} else if (of_device_is_compatible(np, "fsl,imx-audio-wm8962")) {
|
||||
codec_dai_name = "wm8962";
|
||||
priv->card.set_bias_level = fsl_asoc_card_set_bias_level;
|
||||
priv->codec_priv.mclk_id = WM8962_SYSCLK_MCLK;
|
||||
priv->codec_priv.fll_id = WM8962_SYSCLK_FLL;
|
||||
priv->codec_priv.pll_id = WM8962_FLL;
|
||||
priv->dai_fmt |= SND_SOC_DAIFMT_CBM_CFM;
|
||||
} else if (of_device_is_compatible(np, "fsl,imx-audio-wm8960")) {
|
||||
codec_dai_name = "wm8960-hifi";
|
||||
priv->card.set_bias_level = fsl_asoc_card_set_bias_level;
|
||||
priv->codec_priv.fll_id = WM8960_SYSCLK_AUTO;
|
||||
priv->codec_priv.pll_id = WM8960_SYSCLK_AUTO;
|
||||
priv->dai_fmt |= SND_SOC_DAIFMT_CBM_CFM;
|
||||
} else {
|
||||
dev_err(&pdev->dev, "unknown Device Tree compatible\n");
|
||||
return -EINVAL;
|
||||
|
@ -521,7 +532,7 @@ static int fsl_asoc_card_probe(struct platform_device *pdev)
|
|||
/* Normal DAI Link */
|
||||
priv->dai_link[0].cpu_of_node = cpu_np;
|
||||
priv->dai_link[0].codec_of_node = codec_np;
|
||||
priv->dai_link[0].codec_dai_name = codec_dev->name;
|
||||
priv->dai_link[0].codec_dai_name = codec_dai_name;
|
||||
priv->dai_link[0].platform_of_node = cpu_np;
|
||||
priv->dai_link[0].dai_fmt = priv->dai_fmt;
|
||||
priv->card.num_links = 1;
|
||||
|
@ -530,7 +541,7 @@ static int fsl_asoc_card_probe(struct platform_device *pdev)
|
|||
/* DPCM DAI Links only if ASRC exsits */
|
||||
priv->dai_link[1].cpu_of_node = asrc_np;
|
||||
priv->dai_link[1].platform_of_node = asrc_np;
|
||||
priv->dai_link[2].codec_dai_name = codec_dev->name;
|
||||
priv->dai_link[2].codec_dai_name = codec_dai_name;
|
||||
priv->dai_link[2].codec_of_node = codec_np;
|
||||
priv->dai_link[2].cpu_of_node = cpu_np;
|
||||
priv->dai_link[2].dai_fmt = priv->dai_fmt;
|
||||
|
@ -578,6 +589,7 @@ static const struct of_device_id fsl_asoc_card_dt_ids[] = {
|
|||
{ .compatible = "fsl,imx-audio-cs42888", },
|
||||
{ .compatible = "fsl,imx-audio-sgtl5000", },
|
||||
{ .compatible = "fsl,imx-audio-wm8962", },
|
||||
{ .compatible = "fsl,imx-audio-wm8960", },
|
||||
{}
|
||||
};
|
||||
|
||||
|
|
|
@ -931,14 +931,29 @@ static int fsl_asrc_probe(struct platform_device *pdev)
|
|||
static int fsl_asrc_runtime_resume(struct device *dev)
|
||||
{
|
||||
struct fsl_asrc *asrc_priv = dev_get_drvdata(dev);
|
||||
int i;
|
||||
int i, ret;
|
||||
|
||||
clk_prepare_enable(asrc_priv->mem_clk);
|
||||
clk_prepare_enable(asrc_priv->ipg_clk);
|
||||
for (i = 0; i < ASRC_CLK_MAX_NUM; i++)
|
||||
clk_prepare_enable(asrc_priv->asrck_clk[i]);
|
||||
ret = clk_prepare_enable(asrc_priv->mem_clk);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = clk_prepare_enable(asrc_priv->ipg_clk);
|
||||
if (ret)
|
||||
goto disable_mem_clk;
|
||||
for (i = 0; i < ASRC_CLK_MAX_NUM; i++) {
|
||||
ret = clk_prepare_enable(asrc_priv->asrck_clk[i]);
|
||||
if (ret)
|
||||
goto disable_asrck_clk;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
disable_asrck_clk:
|
||||
for (i--; i >= 0; i--)
|
||||
clk_disable_unprepare(asrc_priv->asrck_clk[i]);
|
||||
clk_disable_unprepare(asrc_priv->ipg_clk);
|
||||
disable_mem_clk:
|
||||
clk_disable_unprepare(asrc_priv->mem_clk);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int fsl_asrc_runtime_suspend(struct device *dev)
|
||||
|
|
|
@ -839,7 +839,7 @@ static int fsl_esai_probe(struct platform_device *pdev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
ret = imx_pcm_dma_init(pdev);
|
||||
ret = imx_pcm_dma_init(pdev, IMX_ESAI_DMABUF_SIZE);
|
||||
if (ret)
|
||||
dev_err(&pdev->dev, "failed to init imx pcm dma: %d\n", ret);
|
||||
|
||||
|
|
|
@ -791,7 +791,7 @@ static int fsl_sai_probe(struct platform_device *pdev)
|
|||
return ret;
|
||||
|
||||
if (sai->sai_on_imx)
|
||||
return imx_pcm_dma_init(pdev);
|
||||
return imx_pcm_dma_init(pdev, IMX_SAI_DMABUF_SIZE);
|
||||
else
|
||||
return devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
|
||||
}
|
||||
|
|
|
@ -13,7 +13,8 @@
|
|||
|
||||
#define FSL_SAI_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
|
||||
SNDRV_PCM_FMTBIT_S20_3LE |\
|
||||
SNDRV_PCM_FMTBIT_S24_LE)
|
||||
SNDRV_PCM_FMTBIT_S24_LE |\
|
||||
SNDRV_PCM_FMTBIT_S32_LE)
|
||||
|
||||
/* SAI Register Map Register */
|
||||
#define FSL_SAI_TCSR 0x00 /* SAI Transmit Control */
|
||||
|
@ -45,7 +46,7 @@
|
|||
#define FSL_SAI_xFR(tx) (tx ? FSL_SAI_TFR : FSL_SAI_RFR)
|
||||
#define FSL_SAI_xMR(tx) (tx ? FSL_SAI_TMR : FSL_SAI_RMR)
|
||||
|
||||
/* SAI Transmit/Recieve Control Register */
|
||||
/* SAI Transmit/Receive Control Register */
|
||||
#define FSL_SAI_CSR_TERE BIT(31)
|
||||
#define FSL_SAI_CSR_FR BIT(25)
|
||||
#define FSL_SAI_CSR_SR BIT(24)
|
||||
|
@ -67,10 +68,10 @@
|
|||
#define FSL_SAI_CSR_FRIE BIT(8)
|
||||
#define FSL_SAI_CSR_FRDE BIT(0)
|
||||
|
||||
/* SAI Transmit and Recieve Configuration 1 Register */
|
||||
/* SAI Transmit and Receive Configuration 1 Register */
|
||||
#define FSL_SAI_CR1_RFW_MASK 0x1f
|
||||
|
||||
/* SAI Transmit and Recieve Configuration 2 Register */
|
||||
/* SAI Transmit and Receive Configuration 2 Register */
|
||||
#define FSL_SAI_CR2_SYNC BIT(30)
|
||||
#define FSL_SAI_CR2_MSEL_MASK (0x3 << 26)
|
||||
#define FSL_SAI_CR2_MSEL_BUS 0
|
||||
|
@ -82,12 +83,12 @@
|
|||
#define FSL_SAI_CR2_BCD_MSTR BIT(24)
|
||||
#define FSL_SAI_CR2_DIV_MASK 0xff
|
||||
|
||||
/* SAI Transmit and Recieve Configuration 3 Register */
|
||||
/* SAI Transmit and Receive Configuration 3 Register */
|
||||
#define FSL_SAI_CR3_TRCE BIT(16)
|
||||
#define FSL_SAI_CR3_WDFL(x) (x)
|
||||
#define FSL_SAI_CR3_WDFL_MASK 0x1f
|
||||
|
||||
/* SAI Transmit and Recieve Configuration 4 Register */
|
||||
/* SAI Transmit and Receive Configuration 4 Register */
|
||||
#define FSL_SAI_CR4_FRSZ(x) (((x) - 1) << 16)
|
||||
#define FSL_SAI_CR4_FRSZ_MASK (0x1f << 16)
|
||||
#define FSL_SAI_CR4_SYWD(x) (((x) - 1) << 8)
|
||||
|
@ -97,7 +98,7 @@
|
|||
#define FSL_SAI_CR4_FSP BIT(1)
|
||||
#define FSL_SAI_CR4_FSD_MSTR BIT(0)
|
||||
|
||||
/* SAI Transmit and Recieve Configuration 5 Register */
|
||||
/* SAI Transmit and Receive Configuration 5 Register */
|
||||
#define FSL_SAI_CR5_WNW(x) (((x) - 1) << 24)
|
||||
#define FSL_SAI_CR5_WNW_MASK (0x1f << 24)
|
||||
#define FSL_SAI_CR5_W0W(x) (((x) - 1) << 16)
|
||||
|
|
|
@ -482,13 +482,18 @@ static int fsl_spdif_startup(struct snd_pcm_substream *substream,
|
|||
mask = SCR_TXFIFO_AUTOSYNC_MASK | SCR_TXFIFO_CTRL_MASK |
|
||||
SCR_TXSEL_MASK | SCR_USRC_SEL_MASK |
|
||||
SCR_TXFIFO_FSEL_MASK;
|
||||
for (i = 0; i < SPDIF_TXRATE_MAX; i++)
|
||||
clk_prepare_enable(spdif_priv->txclk[i]);
|
||||
for (i = 0; i < SPDIF_TXRATE_MAX; i++) {
|
||||
ret = clk_prepare_enable(spdif_priv->txclk[i]);
|
||||
if (ret)
|
||||
goto disable_txclk;
|
||||
}
|
||||
} else {
|
||||
scr = SCR_RXFIFO_FSEL_IF8 | SCR_RXFIFO_AUTOSYNC;
|
||||
mask = SCR_RXFIFO_FSEL_MASK | SCR_RXFIFO_AUTOSYNC_MASK|
|
||||
SCR_RXFIFO_CTL_MASK | SCR_RXFIFO_OFF_MASK;
|
||||
clk_prepare_enable(spdif_priv->rxclk);
|
||||
ret = clk_prepare_enable(spdif_priv->rxclk);
|
||||
if (ret)
|
||||
goto err;
|
||||
}
|
||||
regmap_update_bits(regmap, REG_SPDIF_SCR, mask, scr);
|
||||
|
||||
|
@ -497,6 +502,9 @@ static int fsl_spdif_startup(struct snd_pcm_substream *substream,
|
|||
|
||||
return 0;
|
||||
|
||||
disable_txclk:
|
||||
for (i--; i >= 0; i--)
|
||||
clk_disable_unprepare(spdif_priv->txclk[i]);
|
||||
err:
|
||||
clk_disable_unprepare(spdif_priv->coreclk);
|
||||
|
||||
|
@ -707,7 +715,7 @@ static int fsl_spdif_subcode_get(struct snd_kcontrol *kcontrol,
|
|||
return ret;
|
||||
}
|
||||
|
||||
/* Q-subcode infomation. The byte size is SPDIF_UBITS_SIZE/8 */
|
||||
/* Q-subcode information. The byte size is SPDIF_UBITS_SIZE/8 */
|
||||
static int fsl_spdif_qinfo(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_info *uinfo)
|
||||
{
|
||||
|
@ -739,7 +747,7 @@ static int fsl_spdif_qget(struct snd_kcontrol *kcontrol,
|
|||
return ret;
|
||||
}
|
||||
|
||||
/* Valid bit infomation */
|
||||
/* Valid bit information */
|
||||
static int fsl_spdif_vbit_info(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_info *uinfo)
|
||||
{
|
||||
|
@ -767,7 +775,7 @@ static int fsl_spdif_vbit_get(struct snd_kcontrol *kcontrol,
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* DPLL lock infomation */
|
||||
/* DPLL lock information */
|
||||
static int fsl_spdif_rxrate_info(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_info *uinfo)
|
||||
{
|
||||
|
@ -1255,7 +1263,7 @@ static int fsl_spdif_probe(struct platform_device *pdev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
ret = imx_pcm_dma_init(pdev);
|
||||
ret = imx_pcm_dma_init(pdev, IMX_SPDIF_DMABUF_SIZE);
|
||||
if (ret)
|
||||
dev_err(&pdev->dev, "imx_pcm_dma_init failed: %d\n", ret);
|
||||
|
||||
|
|
|
@ -156,7 +156,7 @@ struct fsl_ssi_soc_data {
|
|||
*
|
||||
* @dbg_stats: Debugging statistics
|
||||
*
|
||||
* @soc: SoC specifc data
|
||||
* @soc: SoC specific data
|
||||
*/
|
||||
struct fsl_ssi_private {
|
||||
struct regmap *regs;
|
||||
|
@ -1210,7 +1210,7 @@ static int fsl_ssi_imx_probe(struct platform_device *pdev,
|
|||
}
|
||||
}
|
||||
|
||||
/* For those SLAVE implementations, we ingore non-baudclk cases
|
||||
/* For those SLAVE implementations, we ignore non-baudclk cases
|
||||
* and, instead, abandon MASTER mode that needs baud clock.
|
||||
*/
|
||||
ssi_private->baudclk = devm_clk_get(&pdev->dev, "baud");
|
||||
|
@ -1257,7 +1257,7 @@ static int fsl_ssi_imx_probe(struct platform_device *pdev,
|
|||
if (ret)
|
||||
goto error_pcm;
|
||||
} else {
|
||||
ret = imx_pcm_dma_init(pdev);
|
||||
ret = imx_pcm_dma_init(pdev, IMX_SSI_DMABUF_SIZE);
|
||||
if (ret)
|
||||
goto error_pcm;
|
||||
}
|
||||
|
|
|
@ -40,7 +40,7 @@ static const struct snd_pcm_hardware imx_pcm_hardware = {
|
|||
SNDRV_PCM_INFO_MMAP_VALID |
|
||||
SNDRV_PCM_INFO_PAUSE |
|
||||
SNDRV_PCM_INFO_RESUME,
|
||||
.buffer_bytes_max = IMX_SSI_DMABUF_SIZE,
|
||||
.buffer_bytes_max = IMX_DEFAULT_DMABUF_SIZE,
|
||||
.period_bytes_min = 128,
|
||||
.period_bytes_max = 65535, /* Limited by SDMA engine */
|
||||
.periods_min = 2,
|
||||
|
@ -52,13 +52,30 @@ static const struct snd_dmaengine_pcm_config imx_dmaengine_pcm_config = {
|
|||
.pcm_hardware = &imx_pcm_hardware,
|
||||
.prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config,
|
||||
.compat_filter_fn = filter,
|
||||
.prealloc_buffer_size = IMX_SSI_DMABUF_SIZE,
|
||||
.prealloc_buffer_size = IMX_DEFAULT_DMABUF_SIZE,
|
||||
};
|
||||
|
||||
int imx_pcm_dma_init(struct platform_device *pdev)
|
||||
int imx_pcm_dma_init(struct platform_device *pdev, size_t size)
|
||||
{
|
||||
struct snd_dmaengine_pcm_config *config;
|
||||
struct snd_pcm_hardware *pcm_hardware;
|
||||
|
||||
config = devm_kzalloc(&pdev->dev,
|
||||
sizeof(struct snd_dmaengine_pcm_config), GFP_KERNEL);
|
||||
*config = imx_dmaengine_pcm_config;
|
||||
if (size)
|
||||
config->prealloc_buffer_size = size;
|
||||
|
||||
pcm_hardware = devm_kzalloc(&pdev->dev,
|
||||
sizeof(struct snd_pcm_hardware), GFP_KERNEL);
|
||||
*pcm_hardware = imx_pcm_hardware;
|
||||
if (size)
|
||||
pcm_hardware->buffer_bytes_max = size;
|
||||
|
||||
config->pcm_hardware = pcm_hardware;
|
||||
|
||||
return devm_snd_dmaengine_pcm_register(&pdev->dev,
|
||||
&imx_dmaengine_pcm_config,
|
||||
config,
|
||||
SND_DMAENGINE_PCM_FLAG_COMPAT);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(imx_pcm_dma_init);
|
||||
|
|
|
@ -20,6 +20,11 @@
|
|||
*/
|
||||
#define IMX_SSI_DMABUF_SIZE (64 * 1024)
|
||||
|
||||
#define IMX_DEFAULT_DMABUF_SIZE (64 * 1024)
|
||||
#define IMX_SAI_DMABUF_SIZE (64 * 1024)
|
||||
#define IMX_SPDIF_DMABUF_SIZE (64 * 1024)
|
||||
#define IMX_ESAI_DMABUF_SIZE (256 * 1024)
|
||||
|
||||
static inline void
|
||||
imx_pcm_dma_params_init_data(struct imx_dma_data *dma_data,
|
||||
int dma, enum sdma_peripheral_type peripheral_type)
|
||||
|
@ -39,9 +44,9 @@ struct imx_pcm_fiq_params {
|
|||
};
|
||||
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_IMX_PCM_DMA)
|
||||
int imx_pcm_dma_init(struct platform_device *pdev);
|
||||
int imx_pcm_dma_init(struct platform_device *pdev, size_t size);
|
||||
#else
|
||||
static inline int imx_pcm_dma_init(struct platform_device *pdev)
|
||||
static inline int imx_pcm_dma_init(struct platform_device *pdev, size_t size)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
|
|
@ -603,7 +603,7 @@ static int imx_ssi_probe(struct platform_device *pdev)
|
|||
ssi->fiq_params.dma_params_tx = &ssi->dma_params_tx;
|
||||
|
||||
ssi->fiq_init = imx_pcm_fiq_init(pdev, &ssi->fiq_params);
|
||||
ssi->dma_init = imx_pcm_dma_init(pdev);
|
||||
ssi->dma_init = imx_pcm_dma_init(pdev, IMX_SSI_DMABUF_SIZE);
|
||||
|
||||
if (ssi->fiq_init && ssi->dma_init) {
|
||||
ret = ssi->fiq_init;
|
||||
|
|
|
@ -1911,7 +1911,6 @@ MODULE_DEVICE_TABLE(of, fsi_of_match);
|
|||
|
||||
static const struct platform_device_id fsi_id_table[] = {
|
||||
{ "sh_fsi", (kernel_ulong_t)&fsi1_core },
|
||||
{ "sh_fsi2", (kernel_ulong_t)&fsi2_core },
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(platform, fsi_id_table);
|
||||
|
|
Loading…
Reference in New Issue