pinctrl: intel: Introduce intel_pinctrl_probe_by_uid() internal API
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Thu, 30 Aug 2018 16:27:36 +0000 (19:27 +0300)
committerLinus Walleij <linus.walleij@linaro.org>
Fri, 31 Aug 2018 09:24:37 +0000 (11:24 +0200)
Introduce intel_pinctrl_probe_by_uid() internal API to simplify drivers,
which are using ACPI _UID to distinguish which SoC data needs to be used
when being probed.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/intel/pinctrl-intel.c
drivers/pinctrl/intel/pinctrl-intel.h

index a356a5b8bab2a91017004bc5c76135dfc6eed37d..ea2cc0a72b6731134059916353a8fc353b7b45cf 100644 (file)
@@ -7,11 +7,14 @@
  *          Mika Westerberg <mika.westerberg@linux.intel.com>
  */
 
+#include <linux/acpi.h>
 #include <linux/module.h>
 #include <linux/interrupt.h>
 #include <linux/gpio/driver.h>
 #include <linux/log2.h>
 #include <linux/platform_device.h>
+#include <linux/property.h>
+
 #include <linux/pinctrl/pinctrl.h>
 #include <linux/pinctrl/pinmux.h>
 #include <linux/pinctrl/pinconf.h>
@@ -1415,6 +1418,41 @@ int intel_pinctrl_probe(struct platform_device *pdev,
 }
 EXPORT_SYMBOL_GPL(intel_pinctrl_probe);
 
+int intel_pinctrl_probe_by_uid(struct platform_device *pdev)
+{
+       const struct intel_pinctrl_soc_data *data = NULL;
+       const struct intel_pinctrl_soc_data **table;
+       struct acpi_device *adev;
+       unsigned int i;
+
+       adev = ACPI_COMPANION(&pdev->dev);
+       if (adev) {
+               const void *match = device_get_match_data(&pdev->dev);
+
+               table = (const struct intel_pinctrl_soc_data **)match;
+               for (i = 0; table[i]; i++) {
+                       if (!strcmp(adev->pnp.unique_id, table[i]->uid)) {
+                               data = table[i];
+                               break;
+                       }
+               }
+       } else {
+               const struct platform_device_id *id;
+
+               id = platform_get_device_id(pdev);
+               if (!id)
+                       return -ENODEV;
+
+               table = (const struct intel_pinctrl_soc_data **)id->driver_data;
+               data = table[pdev->id];
+       }
+       if (!data)
+               return -ENODEV;
+
+       return intel_pinctrl_probe(pdev, data);
+}
+EXPORT_SYMBOL_GPL(intel_pinctrl_probe_by_uid);
+
 #ifdef CONFIG_PM_SLEEP
 static bool intel_pinctrl_should_save(struct intel_pinctrl *pctrl, unsigned pin)
 {
index 1785abf157e4b3ed3ac3abcbf199a7b6d64c05b6..05eaed257cf01fb58f6cdcd26533b196a89c0457 100644 (file)
@@ -173,6 +173,8 @@ struct intel_pinctrl_soc_data {
 
 int intel_pinctrl_probe(struct platform_device *pdev,
                        const struct intel_pinctrl_soc_data *soc_data);
+int intel_pinctrl_probe_by_uid(struct platform_device *pdev);
+
 #ifdef CONFIG_PM_SLEEP
 int intel_pinctrl_suspend(struct device *dev);
 int intel_pinctrl_resume(struct device *dev);