|
@@ -29,6 +29,7 @@
|
|
|
#include <linux/of_address.h>
|
|
|
#include <linux/of_irq.h>
|
|
|
#include <linux/platform_device.h>
|
|
|
+#include <linux/regulator/consumer.h>
|
|
|
|
|
|
#include "exynos_thermal_common.h"
|
|
|
#include "exynos_tmu.h"
|
|
@@ -48,6 +49,7 @@
|
|
|
* @clk: pointer to the clock structure.
|
|
|
* @temp_error1: fused value of the first point trim.
|
|
|
* @temp_error2: fused value of the second point trim.
|
|
|
+ * @regulator: pointer to the TMU regulator structure.
|
|
|
* @reg_conf: pointer to structure to register with core thermal.
|
|
|
*/
|
|
|
struct exynos_tmu_data {
|
|
@@ -61,6 +63,7 @@ struct exynos_tmu_data {
|
|
|
struct mutex lock;
|
|
|
struct clk *clk;
|
|
|
u8 temp_error1, temp_error2;
|
|
|
+ struct regulator *regulator;
|
|
|
struct thermal_sensor_conf *reg_conf;
|
|
|
};
|
|
|
|
|
@@ -527,10 +530,27 @@ static int exynos_map_dt_data(struct platform_device *pdev)
|
|
|
struct exynos_tmu_data *data = platform_get_drvdata(pdev);
|
|
|
struct exynos_tmu_platform_data *pdata;
|
|
|
struct resource res;
|
|
|
+ int ret;
|
|
|
|
|
|
if (!data)
|
|
|
return -ENODEV;
|
|
|
|
|
|
+ /*
|
|
|
+ * Try enabling the regulator if found
|
|
|
+ * TODO: Add regulator as an SOC feature, so that regulator enable
|
|
|
+ * is a compulsory call.
|
|
|
+ */
|
|
|
+ data->regulator = devm_regulator_get(&pdev->dev, "vtmu");
|
|
|
+ if (!IS_ERR(data->regulator)) {
|
|
|
+ ret = regulator_enable(data->regulator);
|
|
|
+ if (ret) {
|
|
|
+ dev_err(&pdev->dev, "failed to enable vtmu\n");
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ dev_info(&pdev->dev, "Regulator node (vtmu) not found\n");
|
|
|
+ }
|
|
|
+
|
|
|
data->id = of_alias_get_id(pdev->dev.of_node, "tmuctrl");
|
|
|
if (data->id < 0)
|
|
|
data->id = 0;
|
|
@@ -698,6 +718,9 @@ static int exynos_tmu_remove(struct platform_device *pdev)
|
|
|
|
|
|
clk_unprepare(data->clk);
|
|
|
|
|
|
+ if (!IS_ERR(data->regulator))
|
|
|
+ regulator_disable(data->regulator);
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|