aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonghwa Lee <jonghwa3.lee@samsung.com>2013-06-24 21:08:38 -0400
committerMark Brown <broonie@linaro.org>2013-06-25 06:31:29 -0400
commit80b022e29bfdffb6c9ac0a283bcad3e1030c4c7e (patch)
treeda245ac34d194fc608aad26c5f162860a8754397
parent9e895ace5d82df8929b16f58e9f515f6d54ab82d (diff)
regulator: max77693: Add max77693 regualtor driver.
This patch adds new regulator driver to support max77693 chip's regulators. max77693 has two linear voltage regulators and one current regulator which can be controlled through I2C bus. This driver also supports device tree. Signed-off-by: Jonghwa Lee <jonghwa3.lee@samsung.com> Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com> Signed-off-by: Mark Brown <broonie@linaro.org>
-rw-r--r--Documentation/devicetree/bindings/mfd/max77693.txt55
-rw-r--r--drivers/regulator/Kconfig9
-rw-r--r--drivers/regulator/Makefile1
-rw-r--r--drivers/regulator/max77693.c324
-rw-r--r--include/linux/mfd/max77693-private.h13
-rw-r--r--include/linux/mfd/max77693.h18
6 files changed, 420 insertions, 0 deletions
diff --git a/Documentation/devicetree/bindings/mfd/max77693.txt b/Documentation/devicetree/bindings/mfd/max77693.txt
new file mode 100644
index 000000000000..11921cc417bf
--- /dev/null
+++ b/Documentation/devicetree/bindings/mfd/max77693.txt
@@ -0,0 +1,55 @@
1Maxim MAX77693 multi-function device
2
3MAX77693 is a Multifunction device with the following submodules:
4- PMIC,
5- CHARGER,
6- LED,
7- MUIC,
8- HAPTIC
9
10It is interfaced to host controller using i2c.
11This document describes the bindings for the mfd device.
12
13Required properties:
14- compatible : Must be "maxim,max77693".
15- reg : Specifies the i2c slave address of PMIC block.
16- interrupts : This i2c device has an IRQ line connected to the main SoC.
17- interrupt-parent : The parent interrupt controller.
18
19Optional properties:
20- regulators : The regulators of max77693 have to be instantiated under subnod
21 named "regulators" using the following format.
22
23 regulators {
24 regualtor-compatible = ESAFEOUT1/ESAFEOUT2/CHARGER
25 standard regulator constratints[*].
26 };
27
28 [*] refer Documentation/devicetree/bindings/regulator/regulator.txt
29
30Example:
31 max77693@66 {
32 compatible = "maxim,max77693";
33 reg = <0x66>;
34 interrupt-parent = <&gpx1>;
35 interrupts = <5 2>;
36
37 regulators {
38 esafeout@1 {
39 regulator-compatible = "ESAFEOUT1";
40 regulator-name = "ESAFEOUT1";
41 regulator-boot-on;
42 };
43 esafeout@2 {
44 regulator-compatible = "ESAFEOUT2";
45 regulator-name = "ESAFEOUT2";
46 };
47 charger@0 {
48 regulator-compatible = "CHARGER";
49 regulator-name = "CHARGER";
50 regulator-min-microamp = <60000>;
51 regulator-max-microamp = <2580000>;
52 regulator-boot-on;
53 };
54 };
55 };
diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig
index 8bb26446037e..9744437afe32 100644
--- a/drivers/regulator/Kconfig
+++ b/drivers/regulator/Kconfig
@@ -250,6 +250,15 @@ config REGULATOR_MAX77686
250 via I2C bus. The provided regulator is suitable for 250 via I2C bus. The provided regulator is suitable for
251 Exynos-4 chips to control VARM and VINT voltages. 251 Exynos-4 chips to control VARM and VINT voltages.
252 252
253config REGULATOR_MAX77693
254 tristate "Maxim MAX77693 regulator"
255 depends on MFD_MAX77693
256 help
257 This driver controls a Maxim 77693 regulator via I2C bus.
258 The regulators include two LDOs, 'SAFEOUT1', 'SAFEOUT2'
259 and one current regulator 'CHARGER'. This is suitable for
260 Exynos-4x12 chips.
261
253config REGULATOR_PCAP 262config REGULATOR_PCAP
254 tristate "Motorola PCAP2 regulator driver" 263 tristate "Motorola PCAP2 regulator driver"
255 depends on EZX_PCAP 264 depends on EZX_PCAP
diff --git a/drivers/regulator/Makefile b/drivers/regulator/Makefile
index 47a34ff88f98..a4094cd274be 100644
--- a/drivers/regulator/Makefile
+++ b/drivers/regulator/Makefile
@@ -41,6 +41,7 @@ obj-$(CONFIG_REGULATOR_MAX8973) += max8973-regulator.o
41obj-$(CONFIG_REGULATOR_MAX8997) += max8997.o 41obj-$(CONFIG_REGULATOR_MAX8997) += max8997.o
42obj-$(CONFIG_REGULATOR_MAX8998) += max8998.o 42obj-$(CONFIG_REGULATOR_MAX8998) += max8998.o
43obj-$(CONFIG_REGULATOR_MAX77686) += max77686.o 43obj-$(CONFIG_REGULATOR_MAX77686) += max77686.o
44obj-$(CONFIG_REGULATOR_MAX77693) += max77693.o
44obj-$(CONFIG_REGULATOR_MC13783) += mc13783-regulator.o 45obj-$(CONFIG_REGULATOR_MC13783) += mc13783-regulator.o
45obj-$(CONFIG_REGULATOR_MC13892) += mc13892-regulator.o 46obj-$(CONFIG_REGULATOR_MC13892) += mc13892-regulator.o
46obj-$(CONFIG_REGULATOR_MC13XXX_CORE) += mc13xxx-regulator-core.o 47obj-$(CONFIG_REGULATOR_MC13XXX_CORE) += mc13xxx-regulator-core.o
diff --git a/drivers/regulator/max77693.c b/drivers/regulator/max77693.c
new file mode 100644
index 000000000000..674ece7c832b
--- /dev/null
+++ b/drivers/regulator/max77693.c
@@ -0,0 +1,324 @@
1/*
2 * max77693.c - Regulator driver for the Maxim 77693
3 *
4 * Copyright (C) 2013 Samsung Electronics
5 * Jonghwa Lee <jonghwa3.lee@samsung.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 *
21 * This driver is based on max77686.c
22 */
23
24#include <linux/err.h>
25#include <linux/slab.h>
26#include <linux/platform_device.h>
27#include <linux/module.h>
28#include <linux/export.h>
29#include <linux/regulator/driver.h>
30#include <linux/regulator/machine.h>
31#include <linux/mfd/max77693.h>
32#include <linux/mfd/max77693-private.h>
33#include <linux/regulator/of_regulator.h>
34
35#define CHGIN_ILIM_STEP_20mA 20000
36
37struct max77693_pmic_dev {
38 struct device *dev;
39 struct max77693_dev *iodev;
40 int num_regulators;
41 struct regulator_dev **rdev;
42};
43
44/* CHARGER regulator ops */
45/* CHARGER regulator uses two bits for enabling */
46static int max77693_chg_is_enabled(struct regulator_dev *rdev)
47{
48 int ret;
49 u8 val;
50
51 ret = max77693_read_reg(rdev->regmap, rdev->desc->enable_reg, &val);
52 if (ret)
53 return ret;
54
55 return (val & rdev->desc->enable_mask) == rdev->desc->enable_mask;
56}
57
58/*
59 * CHARGER regulator - Min : 20mA, Max : 2580mA, step : 20mA
60 * 0x00, 0x01, 0x2, 0x03 = 60 mA
61 * 0x04 ~ 0x7E = (60 + (X - 3) * 20) mA
62 */
63static int max77693_chg_get_current_limit(struct regulator_dev *rdev)
64{
65 unsigned int chg_min_uA = rdev->constraints->min_uA;
66 unsigned int chg_max_uA = rdev->constraints->max_uA;
67 u8 reg, sel;
68 unsigned int val;
69 int ret;
70
71 ret = max77693_read_reg(rdev->regmap,
72 MAX77693_CHG_REG_CHG_CNFG_09, &reg);
73 if (ret < 0)
74 return ret;
75
76 sel = reg & CHG_CNFG_09_CHGIN_ILIM_MASK;
77
78 /* the first four codes for charger current are all 60mA */
79 if (sel <= 3)
80 sel = 0;
81 else
82 sel -= 3;
83
84 val = chg_min_uA + CHGIN_ILIM_STEP_20mA * sel;
85 if (val > chg_max_uA)
86 return -EINVAL;
87
88 return val;
89}
90
91static int max77693_chg_set_current_limit(struct regulator_dev *rdev,
92