Skip to content

Commit

Permalink
ASoC: Fix possible codec_dai->ops NULL pointer problems
Browse files Browse the repository at this point in the history
Some codec DAIs like stac9766, wm9712, wm9713, ad1980 don't register themselves
then it loses to the chance to be given a null_dai_ops in snd_soc_register_dai
if they have no ops. When functions like soc_pcm_open, soc_pcm_hw_params etc.
access the ops field in these DAIs, panic will happen.

Signed-off-by: Barry Song <21cnbao@gmail.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
  • Loading branch information
Barry Song authored and Mark Brown committed Oct 19, 2009
1 parent 8e8b2d6 commit 02a06d3
Showing 1 changed file with 8 additions and 3 deletions.
11 changes: 8 additions & 3 deletions sound/soc/soc-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -834,6 +834,9 @@ EXPORT_SYMBOL_GPL(snd_soc_resume_device);
#define soc_resume NULL
#endif

static struct snd_soc_dai_ops null_dai_ops = {
};

static void snd_soc_instantiate_card(struct snd_soc_card *card)
{
struct platform_device *pdev = container_of(card->dev,
Expand Down Expand Up @@ -877,6 +880,11 @@ static void snd_soc_instantiate_card(struct snd_soc_card *card)
ac97 = 1;
}

for (i = 0; i < card->num_links; i++) {
if (!card->dai_link[i].codec_dai->ops)
card->dai_link[i].codec_dai->ops = &null_dai_ops;
}

/* If we have AC97 in the system then don't wait for the
* codec. This will need revisiting if we have to handle
* systems with mixed AC97 and non-AC97 parts. Only check for
Expand Down Expand Up @@ -2329,9 +2337,6 @@ static int snd_soc_unregister_card(struct snd_soc_card *card)
return 0;
}

static struct snd_soc_dai_ops null_dai_ops = {
};

/**
* snd_soc_register_dai - Register a DAI with the ASoC core
*
Expand Down

0 comments on commit 02a06d3

Please sign in to comment.