struct intel_pinctrl *pctrl;
        int i, ret, irq;
 
-       if (!soc_data)
-               return -EINVAL;
-
        pctrl = devm_kzalloc(&pdev->dev, sizeof(*pctrl), GFP_KERNEL);
        if (!pctrl)
                return -ENOMEM;
        const struct intel_pinctrl_soc_data *data;
 
        data = device_get_match_data(&pdev->dev);
+       if (!data)
+               return -ENODATA;
+
        return intel_pinctrl_probe(pdev, data);
 }
 EXPORT_SYMBOL_GPL(intel_pinctrl_probe_by_hid);
 
 int intel_pinctrl_probe_by_uid(struct platform_device *pdev)
+{
+       const struct intel_pinctrl_soc_data *data;
+
+       data = intel_pinctrl_get_soc_data(pdev);
+       if (IS_ERR(data))
+               return PTR_ERR(data);
+
+       return intel_pinctrl_probe(pdev, data);
+}
+EXPORT_SYMBOL_GPL(intel_pinctrl_probe_by_uid);
+
+const struct intel_pinctrl_soc_data *intel_pinctrl_get_soc_data(struct platform_device *pdev)
 {
        const struct intel_pinctrl_soc_data *data = NULL;
        const struct intel_pinctrl_soc_data **table;
 
                id = platform_get_device_id(pdev);
                if (!id)
-                       return -ENODEV;
+                       return ERR_PTR(-ENODEV);
 
                table = (const struct intel_pinctrl_soc_data **)id->driver_data;
                data = table[pdev->id];
        }
 
-       return intel_pinctrl_probe(pdev, data);
+       return data ?: ERR_PTR(-ENODATA);
 }
-EXPORT_SYMBOL_GPL(intel_pinctrl_probe_by_uid);
+EXPORT_SYMBOL_GPL(intel_pinctrl_get_soc_data);
 
 #ifdef CONFIG_PM_SLEEP
 static bool intel_pinctrl_should_save(struct intel_pinctrl *pctrl, unsigned int pin)