Skip to content

Commit

Permalink
ASoC: simple-card: simplify code
Browse files Browse the repository at this point in the history
The OF pointers are put in the stack and then copied to the card
descriptor.
Put them directly at their right place.

Signed-off-by: Jean-Francois Moine <moinejf@free.fr>
Signed-off-by: Mark Brown <broonie@linaro.org>
  • Loading branch information
Jean-Francois Moine authored and Mark Brown committed Feb 3, 2014
1 parent 2bee991 commit 201a0ea
Showing 1 changed file with 20 additions and 35 deletions.
55 changes: 20 additions & 35 deletions sound/soc/generic/simple-card.c
Original file line number Diff line number Diff line change
Expand Up @@ -60,18 +60,20 @@ static int asoc_simple_card_dai_init(struct snd_soc_pcm_runtime *rtd)
static int
asoc_simple_card_sub_parse_of(struct device_node *np,
struct asoc_simple_dai *dai,
struct device_node **node)
const struct device_node **p_node)
{
struct device_node *node;
struct clk *clk;
int ret;

/*
* get node via "sound-dai = <&phandle port>"
* it will be used as xxx_of_node on soc_bind_dai_link()
*/
*node = of_parse_phandle(np, "sound-dai", 0);
if (!*node)
node = of_parse_phandle(np, "sound-dai", 0);
if (!node)
return -ENODEV;
*p_node = node;

/* get dai->name */
ret = snd_soc_of_get_dai_name(np, &dai->name);
Expand Down Expand Up @@ -104,25 +106,22 @@ asoc_simple_card_sub_parse_of(struct device_node *np,
"system-clock-frequency",
&dai->sysclk);
} else {
clk = of_clk_get(*node, 0);
clk = of_clk_get(node, 0);
if (!IS_ERR(clk))
dai->sysclk = clk_get_rate(clk);
}

ret = 0;

parse_error:
of_node_put(*node);
of_node_put(node);

return ret;
}

static int asoc_simple_card_parse_of(struct device_node *node,
struct asoc_simple_card_info *info,
struct device *dev,
struct device_node **of_cpu,
struct device_node **of_codec,
struct device_node **of_platform)
struct device *dev)
{
struct device_node *np;
char *name;
Expand All @@ -146,7 +145,7 @@ static int asoc_simple_card_parse_of(struct device_node *node,
if (np)
ret = asoc_simple_card_sub_parse_of(np,
&info->cpu_dai,
of_cpu);
&info->snd_link.cpu_of_node);
if (ret < 0)
return ret;

Expand All @@ -156,7 +155,7 @@ static int asoc_simple_card_parse_of(struct device_node *node,
if (np)
ret = asoc_simple_card_sub_parse_of(np,
&info->codec_dai,
of_codec);
&info->snd_link.codec_of_node);
if (ret < 0)
return ret;

Expand All @@ -173,7 +172,7 @@ static int asoc_simple_card_parse_of(struct device_node *node,
info->snd_link.name = info->snd_link.stream_name = name;

/* simple-card assumes platform == cpu */
*of_platform = *of_cpu;
info->snd_link.platform_of_node = info->snd_link.cpu_of_node;

dev_dbg(dev, "card-name : %s\n", name);
dev_dbg(dev, "platform : %04x\n", info->daifmt);
Expand All @@ -193,43 +192,36 @@ static int asoc_simple_card_probe(struct platform_device *pdev)
{
struct asoc_simple_card_info *cinfo;
struct device_node *np = pdev->dev.of_node;
struct device_node *of_cpu, *of_codec, *of_platform;
struct device *dev = &pdev->dev;
int ret;

cinfo = NULL;
of_cpu = NULL;
of_codec = NULL;
of_platform = NULL;

cinfo = devm_kzalloc(dev, sizeof(*cinfo), GFP_KERNEL);
if (!cinfo)
return -ENOMEM;

/*
* init snd_soc_card
*/
cinfo->snd_card.owner = THIS_MODULE;
cinfo->snd_card.dev = dev;
cinfo->snd_card.dai_link = &cinfo->snd_link;
cinfo->snd_card.num_links = 1;

if (np && of_device_is_available(np)) {
cinfo->snd_card.dev = dev;

ret = asoc_simple_card_parse_of(np, cinfo, dev,
&of_cpu,
&of_codec,
&of_platform);
ret = asoc_simple_card_parse_of(np, cinfo, dev);
if (ret < 0) {
if (ret != -EPROBE_DEFER)
dev_err(dev, "parse error %d\n", ret);
return ret;
}
cinfo->snd_link.cpu_of_node = of_cpu;
cinfo->snd_link.codec_of_node = of_codec;
cinfo->snd_link.platform_of_node = of_platform;
} else {
if (!dev->platform_data) {
dev_err(dev, "no info for asoc-simple-card\n");
return -EINVAL;
}

memcpy(cinfo, dev->platform_data, sizeof(*cinfo));
cinfo->snd_card.dev = dev;

if (!cinfo->name ||
!cinfo->card ||
!cinfo->codec_dai.name ||
Expand All @@ -254,13 +246,6 @@ static int asoc_simple_card_probe(struct platform_device *pdev)
cinfo->snd_link.codec_dai_name = cinfo->codec_dai.name;
cinfo->snd_link.init = asoc_simple_card_dai_init;

/*
* init snd_soc_card
*/
cinfo->snd_card.owner = THIS_MODULE;
cinfo->snd_card.dai_link = &cinfo->snd_link;
cinfo->snd_card.num_links = 1;

snd_soc_card_set_drvdata(&cinfo->snd_card, cinfo);

return devm_snd_soc_register_card(&pdev->dev, &cinfo->snd_card);
Expand Down

0 comments on commit 201a0ea

Please sign in to comment.