]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
regulator: smd: Add floor and corner operations
authorAndy Gross <agross@codeaurora.org>
Tue, 19 May 2015 06:44:28 +0000 (01:44 -0500)
committerSrinivas Kandagatla <srinivas.kandagatla@linaro.org>
Mon, 11 Jan 2016 09:55:11 +0000 (09:55 +0000)
This patch addes the Qualcomm specific functions for setting the floor and
corner voltages on the regulators.

Signed-off-by: Andy Gross <agross@codeaurora.org>
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
Conflicts:
drivers/regulator/qcom_smd-regulator.c

drivers/regulator/qcom_smd-regulator.c
include/linux/regulator/qcom_smd-regulator.h [new file with mode: 0644]

index 56a17ec5b5efe2432937351a7f45d441a9e48722..3cc8786fe94bcb9efec51cc1634c6673bb152086 100644 (file)
@@ -20,6 +20,7 @@
 #include <linux/regulator/machine.h>
 #include <linux/regulator/of_regulator.h>
 #include <linux/soc/qcom/smd-rpm.h>
+#include <linux/regulator/qcom_smd-regulator.h>
 
 struct qcom_rpm_reg {
        struct device *dev;
@@ -44,6 +45,11 @@ struct rpm_regulator_req {
 #define RPM_KEY_SWEN   0x6e657773 /* "swen" */
 #define RPM_KEY_UV     0x00007675 /* "uv" */
 #define RPM_KEY_MA     0x0000616d /* "ma" */
+#define RPM_KEY_FLOOR  0x00636676 /* "vfc" */
+#define RPM_KEY_CORNER 0x6e726f63 /* "corn" */
+
+#define RPM_MIN_FLOOR_CORNER   0
+#define RPM_MAX_FLOOR_CORNER   6
 
 static int rpm_reg_write_active(struct qcom_rpm_reg *vreg,
                                struct rpm_regulator_req *req,
@@ -56,6 +62,50 @@ static int rpm_reg_write_active(struct qcom_rpm_reg *vreg,
                                  req, size);
 }
 
+int qcom_rpm_set_floor(struct regulator_dev *rdev,
+                       int floor)
+{
+       struct qcom_rpm_reg *vreg = rdev_get_drvdata(rdev);
+       struct rpm_regulator_req req;
+       int ret;
+
+       req.key = RPM_KEY_FLOOR;
+       req.nbytes = sizeof(u32);
+       req.value = floor;
+
+       if (floor < RPM_MIN_FLOOR_CORNER || floor > RPM_MAX_FLOOR_CORNER)
+               return -EINVAL;
+
+       ret = rpm_reg_write_active(vreg, &req, sizeof(req));
+       if (!ret)
+               dev_err(rdev_get_dev(rdev), "Failed to set floor %d\n", floor);
+
+       return ret;
+}
+EXPORT_SYMBOL(qcom_rpm_set_floor);
+
+int qcom_rpm_set_corner(struct regulator_dev *rdev,
+                       int corner)
+{
+       struct qcom_rpm_reg *vreg = rdev_get_drvdata(rdev);
+       struct rpm_regulator_req req;
+       int ret;
+
+       req.key = RPM_KEY_CORNER;
+       req.nbytes = sizeof(u32);
+       req.value = corner;
+
+       if (corner < RPM_MIN_FLOOR_CORNER || corner > RPM_MAX_FLOOR_CORNER)
+               return -EINVAL;
+
+       ret = rpm_reg_write_active(vreg, &req, sizeof(req));
+       if (!ret)
+               dev_err(rdev_get_dev(rdev), "Failed to set corner %d\n", corner);
+
+       return ret;
+}
+EXPORT_SYMBOL(qcom_rpm_set_corner);
+
 static int rpm_reg_enable(struct regulator_dev *rdev)
 {
        struct qcom_rpm_reg *vreg = rdev_get_drvdata(rdev);
diff --git a/include/linux/regulator/qcom_smd-regulator.h b/include/linux/regulator/qcom_smd-regulator.h
new file mode 100644 (file)
index 0000000..b1201d7
--- /dev/null
@@ -0,0 +1,30 @@
+/* Copyright (c) 2015, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+#ifndef __QCOM_SMD_REGULATOR_H_
+#define __QCOM_SMD_REGULATOR_H_
+
+#ifdef CONFIG_REGULATOR_QCOM_SMD_RPM
+int qcom_rpm_set_floor(struct regulator_dev *rdev, int floor);
+int qcom_rpm_set_corner(struct regulator_dev *rdev, int corner);
+#else
+static inline int qcom_rpm_set_floor(struct regulator_dev *rdev, int floor)
+{
+       return -EINVAL;
+}
+
+static inline int qcom_rpm_set_corner(struct regulator_dev *rdev, int floor)
+{
+       return -EINVAL;
+}
+#endif
+
+#endif