]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/soc/samsung/exynos-pmu.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf
[karo-tx-linux.git] / drivers / soc / samsung / exynos-pmu.c
index 0acdfd82e7510189bc8bb4a254c653667d012e89..56d9244ff98147d056fc094fb6dcee6ad7f6830e 100644 (file)
@@ -11,6 +11,8 @@
 
 #include <linux/of.h>
 #include <linux/of_address.h>
+#include <linux/of_device.h>
+#include <linux/mfd/syscon.h>
 #include <linux/platform_device.h>
 #include <linux/delay.h>
 
@@ -42,7 +44,7 @@ void exynos_sys_powerdown_conf(enum sys_powerdown mode)
        unsigned int i;
        const struct exynos_pmu_data *pmu_data;
 
-       if (!pmu_context)
+       if (!pmu_context || !pmu_context->pmu_data)
                return;
 
        pmu_data = pmu_context->pmu_data;
@@ -88,13 +90,24 @@ static const struct of_device_id exynos_pmu_of_device_ids[] = {
        }, {
                .compatible = "samsung,exynos5420-pmu",
                .data = &exynos5420_pmu_data,
+       }, {
+               .compatible = "samsung,exynos5433-pmu",
        },
        { /*sentinel*/ },
 };
 
+struct regmap *exynos_get_pmu_regmap(void)
+{
+       struct device_node *np = of_find_matching_node(NULL,
+                                                     exynos_pmu_of_device_ids);
+       if (np)
+               return syscon_node_to_regmap(np);
+       return ERR_PTR(-ENODEV);
+}
+EXPORT_SYMBOL_GPL(exynos_get_pmu_regmap);
+
 static int exynos_pmu_probe(struct platform_device *pdev)
 {
-       const struct of_device_id *match;
        struct device *dev = &pdev->dev;
        struct resource *res;
 
@@ -106,17 +119,12 @@ static int exynos_pmu_probe(struct platform_device *pdev)
        pmu_context = devm_kzalloc(&pdev->dev,
                        sizeof(struct exynos_pmu_context),
                        GFP_KERNEL);
-       if (!pmu_context) {
-               dev_err(dev, "Cannot allocate memory.\n");
+       if (!pmu_context)
                return -ENOMEM;
-       }
        pmu_context->dev = dev;
+       pmu_context->pmu_data = of_device_get_match_data(dev);
 
-       match = of_match_node(exynos_pmu_of_device_ids, dev->of_node);
-
-       pmu_context->pmu_data = match->data;
-
-       if (pmu_context->pmu_data->pmu_init)
+       if (pmu_context->pmu_data && pmu_context->pmu_data->pmu_init)
                pmu_context->pmu_data->pmu_init();
 
        platform_set_drvdata(pdev, pmu_context);