ASoC: Intel: cht_bsw_rt5645: harden ACPI device detection
authorPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Tue, 4 Apr 2017 19:32:29 +0000 (19:32 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 12 Apr 2017 10:41:20 +0000 (12:41 +0200)
[ 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>
sound/soc/intel/boards/cht_bsw_rt5645.c

index 16c94c4..5b3418a 100644 (file)
@@ -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 */