gpu: arm: midgard: add regulator control
authorJoonyoung Shim <jy0922.shim@samsung.com>
Wed, 8 Apr 2015 04:23:56 +0000 (13:23 +0900)
committerMarek Szyprowski <m.szyprowski@samsung.com>
Mon, 13 Apr 2015 10:45:00 +0000 (12:45 +0200)
Support to control regulator from mali core code instead of each
platform driver.

Signed-off-by: Joonyoung Shim <jy0922.shim@samsung.com>
drivers/gpu/arm/midgard/mali_kbase_core_linux.c
drivers/gpu/arm/midgard/mali_kbase_defs.h

index 901f3c8dd96b7786d38d67c7090c2ec1e0e6d87a..fec874511dab90dca2cb69e38fed348b83407101 100644 (file)
@@ -69,6 +69,7 @@
 #include <linux/devfreq.h>
 #endif /* CONFIG_PM_DEVFREQ */
 #include <linux/clk.h>
+#include <linux/regulator/consumer.h>
 
 /*
  * This file is included since when we support device tree we don't
@@ -2970,6 +2971,18 @@ static int kbase_platform_device_probe(struct platform_device *pdev)
        }
 #endif /* CONFIG_DEBUG_FS */
 
+       kbdev->vdd = devm_regulator_get(kbdev->dev, "vdd_g3d");
+       if (IS_ERR(kbdev->vdd)) {
+               dev_err(kbdev->dev, "Failed to get vdd_g3d regulator\n");
+               err = PTR_ERR(kbdev->vdd);
+               goto out_debugfs_remove;
+       }
+
+       err = regulator_enable(kbdev->vdd);
+       if (err < 0) {
+               dev_err(kbdev->dev, "Failed to enable vdd_g3d regulator\n");
+               goto out_debugfs_remove;
+       }
 
        err = kbase_device_init(kbdev);
        if (err < 0 || MALI_ERROR_NONE != err) {
@@ -2977,7 +2990,7 @@ static int kbase_platform_device_probe(struct platform_device *pdev)
 
                if (err > MALI_ERROR_NONE)
                        err = -ENOMEM;
-               goto out_debugfs_remove;
+               goto out_regulator_disable;
        }
 
        /* obtain min/max configured gpu frequencies */
@@ -2995,6 +3008,8 @@ static int kbase_platform_device_probe(struct platform_device *pdev)
 
 out_term_dev:
        kbase_device_term(kbdev);
+out_regulator_disable:
+       regulator_disable(kbdev->vdd);
 out_debugfs_remove:
 #ifdef CONFIG_DEBUG_FS
        kbasep_jd_debugfs_term(kbdev);
@@ -3072,6 +3087,7 @@ static int kbase_common_device_remove(struct kbase_device *kbdev)
        put_device(kbdev->dev);
        kbase_common_reg_unmap(kbdev);
        kbase_device_term(kbdev);
+       regulator_disable(kbdev->vdd);
 #ifdef CONFIG_DEBUG_FS
        kbasep_jd_debugfs_term(kbdev);
        debugfs_remove(kbdev->memory_profile_directory);
index 736e3f533e790e34d1c78f01df5779bd47590aca..9484f0f72aa69f2fc719d0c1dfe5e55bca32b7dc 100644 (file)
@@ -641,6 +641,7 @@ struct kbase_device {
 #ifdef CONFIG_HAVE_CLK
        struct clk *clock;
 #endif
+       struct regulator *vdd;
        char devname[DEVNAME_SIZE];
 
 #ifdef CONFIG_MALI_NO_MALI