Merge remote-tracking branches 'asoc/topic/mediatek', 'asoc/topic/mtk', 'asoc/topic/nuc900', 'asoc/topic/of-name' and 'asoc/topic/omap' into asoc-next
This commit is contained in:
commit
acb47ad502
|
@ -1603,6 +1603,10 @@ int snd_soc_of_parse_audio_simple_widgets(struct snd_soc_card *card,
|
|||
int snd_soc_of_parse_tdm_slot(struct device_node *np,
|
||||
unsigned int *slots,
|
||||
unsigned int *slot_width);
|
||||
void snd_soc_of_parse_audio_prefix(struct snd_soc_card *card,
|
||||
struct snd_soc_codec_conf *codec_conf,
|
||||
struct device_node *of_node,
|
||||
const char *propname);
|
||||
int snd_soc_of_parse_audio_routing(struct snd_soc_card *card,
|
||||
const char *propname);
|
||||
unsigned int snd_soc_of_parse_daifmt(struct device_node *np,
|
||||
|
|
|
@ -203,7 +203,6 @@ MODULE_DEVICE_TABLE(of, mt8173_max98090_dt_match);
|
|||
static struct platform_driver mt8173_max98090_driver = {
|
||||
.driver = {
|
||||
.name = "mt8173-max98090",
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = mt8173_max98090_dt_match,
|
||||
#ifdef CONFIG_PM
|
||||
.pm = &snd_soc_pm_ops,
|
||||
|
|
|
@ -270,7 +270,6 @@ MODULE_DEVICE_TABLE(of, mt8173_rt5650_rt5676_dt_match);
|
|||
static struct platform_driver mt8173_rt5650_rt5676_driver = {
|
||||
.driver = {
|
||||
.name = "mtk-rt5650-rt5676",
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = mt8173_rt5650_rt5676_dt_match,
|
||||
#ifdef CONFIG_PM
|
||||
.pm = &snd_soc_pm_ops,
|
||||
|
|
|
@ -98,12 +98,4 @@ struct mtk_afe_memif {
|
|||
const struct mtk_afe_irq_data *irqdata;
|
||||
};
|
||||
|
||||
struct mtk_afe {
|
||||
/* address for ioremap audio hardware register */
|
||||
void __iomem *base_addr;
|
||||
struct device *dev;
|
||||
struct regmap *regmap;
|
||||
struct mtk_afe_memif memif[MTK_AFE_MEMIF_NUM];
|
||||
struct clk *clocks[MTK_CLK_NUM];
|
||||
};
|
||||
#endif
|
||||
|
|
|
@ -45,18 +45,21 @@
|
|||
/* Memory interface */
|
||||
#define AFE_DL1_BASE 0x0040
|
||||
#define AFE_DL1_CUR 0x0044
|
||||
#define AFE_DL1_END 0x0048
|
||||
#define AFE_DL2_BASE 0x0050
|
||||
#define AFE_DL2_CUR 0x0054
|
||||
#define AFE_AWB_BASE 0x0070
|
||||
#define AFE_AWB_CUR 0x007c
|
||||
#define AFE_VUL_BASE 0x0080
|
||||
#define AFE_VUL_CUR 0x008c
|
||||
#define AFE_VUL_END 0x0088
|
||||
#define AFE_DAI_BASE 0x0090
|
||||
#define AFE_DAI_CUR 0x009c
|
||||
#define AFE_MOD_PCM_BASE 0x0330
|
||||
#define AFE_MOD_PCM_CUR 0x033c
|
||||
#define AFE_HDMI_OUT_BASE 0x0374
|
||||
#define AFE_HDMI_OUT_CUR 0x0378
|
||||
#define AFE_HDMI_OUT_END 0x037c
|
||||
|
||||
#define AFE_ADDA2_TOP_CON0 0x0600
|
||||
|
||||
|
@ -127,6 +130,34 @@ enum afe_tdm_ch_start {
|
|||
AFE_TDM_CH_ZERO,
|
||||
};
|
||||
|
||||
static const unsigned int mtk_afe_backup_list[] = {
|
||||
AUDIO_TOP_CON0,
|
||||
AFE_CONN1,
|
||||
AFE_CONN2,
|
||||
AFE_CONN7,
|
||||
AFE_CONN8,
|
||||
AFE_DAC_CON1,
|
||||
AFE_DL1_BASE,
|
||||
AFE_DL1_END,
|
||||
AFE_VUL_BASE,
|
||||
AFE_VUL_END,
|
||||
AFE_HDMI_OUT_BASE,
|
||||
AFE_HDMI_OUT_END,
|
||||
AFE_HDMI_CONN0,
|
||||
AFE_DAC_CON0,
|
||||
};
|
||||
|
||||
struct mtk_afe {
|
||||
/* address for ioremap audio hardware register */
|
||||
void __iomem *base_addr;
|
||||
struct device *dev;
|
||||
struct regmap *regmap;
|
||||
struct mtk_afe_memif memif[MTK_AFE_MEMIF_NUM];
|
||||
struct clk *clocks[MTK_CLK_NUM];
|
||||
unsigned int backup_regs[ARRAY_SIZE(mtk_afe_backup_list)];
|
||||
bool suspended;
|
||||
};
|
||||
|
||||
static const struct snd_pcm_hardware mtk_afe_hardware = {
|
||||
.info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
|
||||
SNDRV_PCM_INFO_MMAP_VALID),
|
||||
|
@ -722,11 +753,53 @@ static const struct snd_soc_dai_ops mtk_afe_hdmi_ops = {
|
|||
|
||||
};
|
||||
|
||||
static int mtk_afe_runtime_suspend(struct device *dev);
|
||||
static int mtk_afe_runtime_resume(struct device *dev);
|
||||
|
||||
static int mtk_afe_dai_suspend(struct snd_soc_dai *dai)
|
||||
{
|
||||
struct mtk_afe *afe = snd_soc_dai_get_drvdata(dai);
|
||||
int i;
|
||||
|
||||
dev_dbg(afe->dev, "%s\n", __func__);
|
||||
if (pm_runtime_status_suspended(afe->dev) || afe->suspended)
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(mtk_afe_backup_list); i++)
|
||||
regmap_read(afe->regmap, mtk_afe_backup_list[i],
|
||||
&afe->backup_regs[i]);
|
||||
|
||||
afe->suspended = true;
|
||||
mtk_afe_runtime_suspend(afe->dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mtk_afe_dai_resume(struct snd_soc_dai *dai)
|
||||
{
|
||||
struct mtk_afe *afe = snd_soc_dai_get_drvdata(dai);
|
||||
int i = 0;
|
||||
|
||||
dev_dbg(afe->dev, "%s\n", __func__);
|
||||
if (pm_runtime_status_suspended(afe->dev) || !afe->suspended)
|
||||
return 0;
|
||||
|
||||
mtk_afe_runtime_resume(afe->dev);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(mtk_afe_backup_list); i++)
|
||||
regmap_write(afe->regmap, mtk_afe_backup_list[i],
|
||||
afe->backup_regs[i]);
|
||||
|
||||
afe->suspended = false;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct snd_soc_dai_driver mtk_afe_pcm_dais[] = {
|
||||
/* FE DAIs: memory intefaces to CPU */
|
||||
{
|
||||
.name = "DL1", /* downlink 1 */
|
||||
.id = MTK_AFE_MEMIF_DL1,
|
||||
.suspend = mtk_afe_dai_suspend,
|
||||
.resume = mtk_afe_dai_resume,
|
||||
.playback = {
|
||||
.stream_name = "DL1",
|
||||
.channels_min = 1,
|
||||
|
@ -738,6 +811,8 @@ static struct snd_soc_dai_driver mtk_afe_pcm_dais[] = {
|
|||
}, {
|
||||
.name = "VUL", /* voice uplink */
|
||||
.id = MTK_AFE_MEMIF_VUL,
|
||||
.suspend = mtk_afe_dai_suspend,
|
||||
.resume = mtk_afe_dai_resume,
|
||||
.capture = {
|
||||
.stream_name = "VUL",
|
||||
.channels_min = 1,
|
||||
|
@ -774,6 +849,8 @@ static struct snd_soc_dai_driver mtk_afe_hdmi_dais[] = {
|
|||
{
|
||||
.name = "HDMI",
|
||||
.id = MTK_AFE_MEMIF_HDMI,
|
||||
.suspend = mtk_afe_dai_suspend,
|
||||
.resume = mtk_afe_dai_resume,
|
||||
.playback = {
|
||||
.stream_name = "HDMI",
|
||||
.channels_min = 2,
|
||||
|
@ -820,10 +897,6 @@ static const struct snd_kcontrol_new mtk_afe_o10_mix[] = {
|
|||
};
|
||||
|
||||
static const struct snd_soc_dapm_widget mtk_afe_pcm_widgets[] = {
|
||||
/* Backend DAIs */
|
||||
SND_SOC_DAPM_AIF_IN("I2S Capture", NULL, 0, SND_SOC_NOPM, 0, 0),
|
||||
SND_SOC_DAPM_AIF_OUT("I2S Playback", NULL, 0, SND_SOC_NOPM, 0, 0),
|
||||
|
||||
/* inter-connections */
|
||||
SND_SOC_DAPM_MIXER("I05", SND_SOC_NOPM, 0, 0, NULL, 0),
|
||||
SND_SOC_DAPM_MIXER("I06", SND_SOC_NOPM, 0, 0, NULL, 0),
|
||||
|
@ -855,11 +928,6 @@ static const struct snd_soc_dapm_route mtk_afe_pcm_routes[] = {
|
|||
{ "O10", "I18 Switch", "I18" },
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_widget mtk_afe_hdmi_widgets[] = {
|
||||
/* Backend DAIs */
|
||||
SND_SOC_DAPM_AIF_OUT("HDMIO Playback", NULL, 0, SND_SOC_NOPM, 0, 0),
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_route mtk_afe_hdmi_routes[] = {
|
||||
{"HDMIO Playback", NULL, "HDMI"},
|
||||
};
|
||||
|
@ -874,8 +942,6 @@ static const struct snd_soc_component_driver mtk_afe_pcm_dai_component = {
|
|||
|
||||
static const struct snd_soc_component_driver mtk_afe_hdmi_dai_component = {
|
||||
.name = "mtk-afe-hdmi-dai",
|
||||
.dapm_widgets = mtk_afe_hdmi_widgets,
|
||||
.num_dapm_widgets = ARRAY_SIZE(mtk_afe_hdmi_widgets),
|
||||
.dapm_routes = mtk_afe_hdmi_routes,
|
||||
.num_dapm_routes = ARRAY_SIZE(mtk_afe_hdmi_routes),
|
||||
};
|
||||
|
@ -1220,7 +1286,6 @@ static const struct dev_pm_ops mtk_afe_pm_ops = {
|
|||
static struct platform_driver mtk_afe_pcm_driver = {
|
||||
.driver = {
|
||||
.name = "mtk-afe-pcm",
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = mtk_afe_pcm_dt_match,
|
||||
.pm = &mtk_afe_pm_ops,
|
||||
},
|
||||
|
|
|
@ -308,13 +308,7 @@ static struct snd_soc_platform_driver nuc900_soc_platform = {
|
|||
|
||||
static int nuc900_soc_platform_probe(struct platform_device *pdev)
|
||||
{
|
||||
return snd_soc_register_platform(&pdev->dev, &nuc900_soc_platform);
|
||||
}
|
||||
|
||||
static int nuc900_soc_platform_remove(struct platform_device *pdev)
|
||||
{
|
||||
snd_soc_unregister_platform(&pdev->dev);
|
||||
return 0;
|
||||
return devm_snd_soc_register_platform(&pdev->dev, &nuc900_soc_platform);
|
||||
}
|
||||
|
||||
static struct platform_driver nuc900_pcm_driver = {
|
||||
|
@ -323,7 +317,6 @@ static struct platform_driver nuc900_pcm_driver = {
|
|||
},
|
||||
|
||||
.probe = nuc900_soc_platform_probe,
|
||||
.remove = nuc900_soc_platform_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(nuc900_pcm_driver);
|
||||
|
|
|
@ -965,25 +965,15 @@ int omap_mcbsp_init(struct platform_device *pdev)
|
|||
mcbsp->free = true;
|
||||
|
||||
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mpu");
|
||||
if (!res) {
|
||||
if (!res)
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (!res) {
|
||||
dev_err(mcbsp->dev, "invalid memory resource\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
}
|
||||
if (!devm_request_mem_region(&pdev->dev, res->start, resource_size(res),
|
||||
dev_name(&pdev->dev))) {
|
||||
dev_err(mcbsp->dev, "memory region already claimed\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
mcbsp->io_base = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (IS_ERR(mcbsp->io_base))
|
||||
return PTR_ERR(mcbsp->io_base);
|
||||
|
||||
mcbsp->phys_base = res->start;
|
||||
mcbsp->reg_cache_size = resource_size(res);
|
||||
mcbsp->io_base = devm_ioremap(&pdev->dev, res->start,
|
||||
resource_size(res));
|
||||
if (!mcbsp->io_base)
|
||||
return -ENOMEM;
|
||||
|
||||
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dma");
|
||||
if (!res)
|
||||
|
|
|
@ -81,7 +81,15 @@ static int hdmi_dai_startup(struct snd_pcm_substream *substream,
|
|||
ret = snd_pcm_hw_constraint_step(substream->runtime, 0,
|
||||
SNDRV_PCM_HW_PARAM_PERIOD_BYTES, 128);
|
||||
if (ret < 0) {
|
||||
dev_err(dai->dev, "could not apply constraint\n");
|
||||
dev_err(dai->dev, "Could not apply period constraint: %d\n",
|
||||
ret);
|
||||
return ret;
|
||||
}
|
||||
ret = snd_pcm_hw_constraint_step(substream->runtime, 0,
|
||||
SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 128);
|
||||
if (ret < 0) {
|
||||
dev_err(dai->dev, "Could not apply buffer constraint: %d\n",
|
||||
ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -3320,6 +3320,26 @@ int snd_soc_of_parse_tdm_slot(struct device_node *np,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_of_parse_tdm_slot);
|
||||
|
||||
void snd_soc_of_parse_audio_prefix(struct snd_soc_card *card,
|
||||
struct snd_soc_codec_conf *codec_conf,
|
||||
struct device_node *of_node,
|
||||
const char *propname)
|
||||
{
|
||||
struct device_node *np = card->dev->of_node;
|
||||
const char *str;
|
||||
int ret;
|
||||
|
||||
ret = of_property_read_string(np, propname, &str);
|
||||
if (ret < 0) {
|
||||
/* no prefix is not error */
|
||||
return;
|
||||
}
|
||||
|
||||
codec_conf->of_node = of_node;
|
||||
codec_conf->name_prefix = str;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_of_parse_audio_prefix);
|
||||
|
||||
int snd_soc_of_parse_audio_routing(struct snd_soc_card *card,
|
||||
const char *propname)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue