diff options
author | Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> | 2017-04-04 19:32:29 +0000 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-04-12 12:41:20 +0200 |
commit | 584f4318f9236a8b30b0d8717bb047749bc72095 (patch) | |
tree | fe5a839590370490884d5defa7704df7d53ed7b6 /sound | |
parent | 4060a32e9d2471b030ce21f0519daecf2f17db5e (diff) | |
download | linux-rpi3-584f4318f9236a8b30b0d8717bb047749bc72095.tar.gz linux-rpi3-584f4318f9236a8b30b0d8717bb047749bc72095.tar.bz2 linux-rpi3-584f4318f9236a8b30b0d8717bb047749bc72095.zip |
ASoC: Intel: cht_bsw_rt5645: harden ACPI device detection
[ Upstream commit 42648c2270ca0c96935dfc5d0f5c4f8d2406cf75 ]
Fix classic issue of having multiple codecs listed in DSDT
but a single one actually enabled. The previous code did
not handle such errors and could also lead to uninitalized
configurations
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/soc/intel/boards/cht_bsw_rt5645.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/sound/soc/intel/boards/cht_bsw_rt5645.c b/sound/soc/intel/boards/cht_bsw_rt5645.c index 16c94c45ce50..5b3418af6a88 100644 --- a/sound/soc/intel/boards/cht_bsw_rt5645.c +++ b/sound/soc/intel/boards/cht_bsw_rt5645.c @@ -358,22 +358,32 @@ static int snd_cht_mc_probe(struct platform_device *pdev) struct sst_acpi_mach *mach; const char *i2c_name = NULL; int dai_index = 0; + bool found = false; drv = devm_kzalloc(&pdev->dev, sizeof(*drv), GFP_ATOMIC); if (!drv) return -ENOMEM; + mach = (&pdev->dev)->platform_data; + for (i = 0; i < ARRAY_SIZE(snd_soc_cards); i++) { - if (acpi_dev_found(snd_soc_cards[i].codec_id)) { + if (acpi_dev_found(snd_soc_cards[i].codec_id) && + (!strncmp(snd_soc_cards[i].codec_id, mach->id, 8))) { dev_dbg(&pdev->dev, "found codec %s\n", snd_soc_cards[i].codec_id); card = snd_soc_cards[i].soc_card; drv->acpi_card = &snd_soc_cards[i]; + found = true; break; } } + + if (!found) { + dev_err(&pdev->dev, "No matching HID found in supported list\n"); + return -ENODEV; + } + card->dev = &pdev->dev; - mach = card->dev->platform_data; sprintf(drv->codec_name, "i2c-%s:00", drv->acpi_card->codec_id); /* set correct codec name */ |