aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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.c322
-rw-r--r--include/linux/mfd/max77693-private.h13
-rw-r--r--include/linux/mfd/max77693.h18
6 files changed, 418 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..ce4b96c15eba
--- /dev/null
+++ b/drivers/regulator/max77693.c
@@ -0,0 +1,322 @@
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 int min_uA, int max_uA)
93{
94 unsigned int chg_min_uA = rdev->constraints->min_uA;
95 int sel = 0;
96
97 while (chg_min_uA + CHGIN_ILIM_STEP_20mA * sel < min_uA)
98 sel++;