ASoC: Intel: byt-max98090: Add GPIO ACPI mapping table
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Sat, 10 Jun 2017 16:37:41 +0000 (19:37 +0300)
committerMark Brown <broonie@kernel.org>
Tue, 13 Jun 2017 20:39:47 +0000 (21:39 +0100)
In order to make GPIO ACPI library stricter prepare users of
gpiod_get_index() to correctly behave when there no mapping is
provided by firmware.

Here we add explicit mapping between _CRS GpioIo() resources and
their names used in the driver.

Reviewed-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Tested-by: Nicolas Porcel <nicolasporcel06@gmail.com>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/intel/boards/byt-max98090.c

index d9f81b8..047be7f 100644 (file)
@@ -67,20 +67,27 @@ static struct snd_soc_jack_pin hs_jack_pins[] = {
 
 static struct snd_soc_jack_gpio hs_jack_gpios[] = {
        {
-               .name           = "hp-gpio",
-               .idx            = 0,
+               .name           = "hp",
                .report         = SND_JACK_HEADPHONE | SND_JACK_LINEOUT,
                .debounce_time  = 200,
        },
        {
-               .name           = "mic-gpio",
-               .idx            = 1,
+               .name           = "mic",
                .invert         = 1,
                .report         = SND_JACK_MICROPHONE,
                .debounce_time  = 200,
        },
 };
 
+static const struct acpi_gpio_params hp_gpios = { 0, 0, false };
+static const struct acpi_gpio_params mic_gpios = { 1, 0, false };
+
+static const struct acpi_gpio_mapping acpi_byt_max98090_gpios[] = {
+       { "hp-gpios", &hp_gpios, 1 },
+       { "mic-gpios", &mic_gpios, 1 },
+       {},
+};
+
 static int byt_max98090_init(struct snd_soc_pcm_runtime *runtime)
 {
        int ret;
@@ -140,8 +147,9 @@ static struct snd_soc_card byt_max98090_card = {
 
 static int byt_max98090_probe(struct platform_device *pdev)
 {
-       int ret_val = 0;
+       struct device *dev = &pdev->dev;
        struct byt_max98090_private *priv;
+       int ret_val;
 
        priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_ATOMIC);
        if (!priv) {
@@ -149,6 +157,10 @@ static int byt_max98090_probe(struct platform_device *pdev)
                return -ENOMEM;
        }
 
+       ret_val = devm_acpi_dev_add_driver_gpios(dev->parent, acpi_byt_max98090_gpios);
+       if (ret_val)
+               dev_dbg(dev, "Unable to add GPIO mapping table\n");
+
        byt_max98090_card.dev = &pdev->dev;
        snd_soc_card_set_drvdata(&byt_max98090_card, priv);
        ret_val = devm_snd_soc_register_card(&pdev->dev, &byt_max98090_card);
@@ -158,7 +170,7 @@ static int byt_max98090_probe(struct platform_device *pdev)
                return ret_val;
        }
 
-       return ret_val;
+       return 0;
 }
 
 static int byt_max98090_remove(struct platform_device *pdev)