ASoC: fix SIU driver breakage, occurred during the multi-component transition
This patch fixes multiple bugs and a typo, occurred during the multi- component transition. Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
This commit is contained in:
Родитель
7d25d64441
Коммит
c6834dd2d2
|
@ -98,7 +98,9 @@ enum {
|
||||||
SIU_CLKB_EXT
|
SIU_CLKB_EXT
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct device;
|
||||||
struct siu_info {
|
struct siu_info {
|
||||||
|
struct device *dev;
|
||||||
int port_id;
|
int port_id;
|
||||||
u32 __iomem *pram;
|
u32 __iomem *pram;
|
||||||
u32 __iomem *xram;
|
u32 __iomem *xram;
|
||||||
|
|
|
@ -71,8 +71,7 @@ struct port_flag {
|
||||||
struct format_flag capture;
|
struct format_flag capture;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct siu_info *siu_i2s_data = NULL;
|
struct siu_info *siu_i2s_data;
|
||||||
EXPORT_SYMBOL_GPL(siu_i2s_data);
|
|
||||||
|
|
||||||
static struct port_flag siu_flags[SIU_PORT_NUM] = {
|
static struct port_flag siu_flags[SIU_PORT_NUM] = {
|
||||||
[SIU_PORT_A] = {
|
[SIU_PORT_A] = {
|
||||||
|
@ -113,7 +112,7 @@ static void siu_dai_start(struct siu_port *port_info)
|
||||||
dev_dbg(port_info->pcm->card->dev, "%s\n", __func__);
|
dev_dbg(port_info->pcm->card->dev, "%s\n", __func__);
|
||||||
|
|
||||||
/* Turn on SIU clock */
|
/* Turn on SIU clock */
|
||||||
pm_runtime_get_sync(port_info->pcm->card->dev);
|
pm_runtime_get_sync(info->dev);
|
||||||
|
|
||||||
/* Issue software reset to siu */
|
/* Issue software reset to siu */
|
||||||
siu_write32(base + SIU_SRCTL, 0);
|
siu_write32(base + SIU_SRCTL, 0);
|
||||||
|
@ -160,7 +159,7 @@ static void siu_dai_stop(struct siu_port *port_info)
|
||||||
siu_write32(base + SIU_SRCTL, 0);
|
siu_write32(base + SIU_SRCTL, 0);
|
||||||
|
|
||||||
/* Turn off SIU clock */
|
/* Turn off SIU clock */
|
||||||
pm_runtime_put_sync(port_info->pcm->card->dev);
|
pm_runtime_put_sync(info->dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void siu_dai_spbAselect(struct siu_port *port_info)
|
static void siu_dai_spbAselect(struct siu_port *port_info)
|
||||||
|
@ -675,20 +674,36 @@ static int siu_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id,
|
||||||
}
|
}
|
||||||
|
|
||||||
siu_clk = clk_get(dai->dev, siu_name);
|
siu_clk = clk_get(dai->dev, siu_name);
|
||||||
if (IS_ERR(siu_clk))
|
if (IS_ERR(siu_clk)) {
|
||||||
|
dev_err(dai->dev, "%s: cannot get a SIU clock: %ld\n", __func__,
|
||||||
|
PTR_ERR(siu_clk));
|
||||||
return PTR_ERR(siu_clk);
|
return PTR_ERR(siu_clk);
|
||||||
|
|
||||||
parent_clk = clk_get(dai->dev, parent_name);
|
|
||||||
if (!IS_ERR(parent_clk)) {
|
|
||||||
ret = clk_set_parent(siu_clk, parent_clk);
|
|
||||||
if (!ret)
|
|
||||||
clk_set_rate(siu_clk, freq);
|
|
||||||
clk_put(parent_clk);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
parent_clk = clk_get(dai->dev, parent_name);
|
||||||
|
if (IS_ERR(parent_clk)) {
|
||||||
|
ret = PTR_ERR(parent_clk);
|
||||||
|
dev_err(dai->dev, "cannot get a SIU clock parent: %d\n", ret);
|
||||||
|
goto epclkget;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = clk_set_parent(siu_clk, parent_clk);
|
||||||
|
if (ret < 0) {
|
||||||
|
dev_err(dai->dev, "cannot reparent the SIU clock: %d\n", ret);
|
||||||
|
goto eclksetp;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = clk_set_rate(siu_clk, freq);
|
||||||
|
if (ret < 0)
|
||||||
|
dev_err(dai->dev, "cannot set SIU clock rate: %d\n", ret);
|
||||||
|
|
||||||
|
/* TODO: when clkdev gets reference counting we'll move these to siu_dai_shutdown() */
|
||||||
|
eclksetp:
|
||||||
|
clk_put(parent_clk);
|
||||||
|
epclkget:
|
||||||
clk_put(siu_clk);
|
clk_put(siu_clk);
|
||||||
|
|
||||||
return 0;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct snd_soc_dai_ops siu_dai_ops = {
|
static struct snd_soc_dai_ops siu_dai_ops = {
|
||||||
|
@ -700,7 +715,7 @@ static struct snd_soc_dai_ops siu_dai_ops = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct snd_soc_dai_driver siu_i2s_dai = {
|
static struct snd_soc_dai_driver siu_i2s_dai = {
|
||||||
.name = "sui-i2s-dai",
|
.name = "siu-i2s-dai",
|
||||||
.playback = {
|
.playback = {
|
||||||
.channels_min = 2,
|
.channels_min = 2,
|
||||||
.channels_max = 2,
|
.channels_max = 2,
|
||||||
|
@ -727,6 +742,7 @@ static int __devinit siu_probe(struct platform_device *pdev)
|
||||||
if (!info)
|
if (!info)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
siu_i2s_data = info;
|
siu_i2s_data = info;
|
||||||
|
info->dev = &pdev->dev;
|
||||||
|
|
||||||
ret = request_firmware(&fw_entry, "siu_spb.bin", &pdev->dev);
|
ret = request_firmware(&fw_entry, "siu_spb.bin", &pdev->dev);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
@ -828,6 +844,7 @@ static int __devexit siu_remove(struct platform_device *pdev)
|
||||||
|
|
||||||
static struct platform_driver siu_driver = {
|
static struct platform_driver siu_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
|
.owner = THIS_MODULE,
|
||||||
.name = "siu-pcm-audio",
|
.name = "siu-pcm-audio",
|
||||||
},
|
},
|
||||||
.probe = siu_probe,
|
.probe = siu_probe,
|
||||||
|
|
|
@ -341,7 +341,7 @@ static int siu_pcm_open(struct snd_pcm_substream *ss)
|
||||||
{
|
{
|
||||||
/* Playback / Capture */
|
/* Playback / Capture */
|
||||||
struct snd_soc_pcm_runtime *rtd = ss->private_data;
|
struct snd_soc_pcm_runtime *rtd = ss->private_data;
|
||||||
struct siu_platform *pdata = snd_soc_platform_get_drvdata(rtd->platform);
|
struct siu_platform *pdata = rtd->platform->dev->platform_data;
|
||||||
struct siu_info *info = siu_i2s_data;
|
struct siu_info *info = siu_i2s_data;
|
||||||
struct siu_port *port_info = siu_port_info(ss);
|
struct siu_port *port_info = siu_port_info(ss);
|
||||||
struct siu_stream *siu_stream;
|
struct siu_stream *siu_stream;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче