diff options
| -rw-r--r-- | Documentation/devicetree/bindings/mfd/max77693.txt | 55 | ||||
| -rw-r--r-- | drivers/regulator/Kconfig | 9 | ||||
| -rw-r--r-- | drivers/regulator/Makefile | 1 | ||||
| -rw-r--r-- | drivers/regulator/max77693.c | 322 | ||||
| -rw-r--r-- | include/linux/mfd/max77693-private.h | 13 | ||||
| -rw-r--r-- | include/linux/mfd/max77693.h | 18 |
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 @@ | |||
| 1 | Maxim MAX77693 multi-function device | ||
| 2 | |||
| 3 | MAX77693 is a Multifunction device with the following submodules: | ||
| 4 | - PMIC, | ||
| 5 | - CHARGER, | ||
| 6 | - LED, | ||
| 7 | - MUIC, | ||
| 8 | - HAPTIC | ||
| 9 | |||
| 10 | It is interfaced to host controller using i2c. | ||
| 11 | This document describes the bindings for the mfd device. | ||
| 12 | |||
| 13 | Required 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 | |||
| 19 | Optional 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 | |||
| 30 | Example: | ||
| 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 | ||
| 253 | config 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 | |||
| 253 | config REGULATOR_PCAP | 262 | config 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 | |||
| 41 | obj-$(CONFIG_REGULATOR_MAX8997) += max8997.o | 41 | obj-$(CONFIG_REGULATOR_MAX8997) += max8997.o |
| 42 | obj-$(CONFIG_REGULATOR_MAX8998) += max8998.o | 42 | obj-$(CONFIG_REGULATOR_MAX8998) += max8998.o |
| 43 | obj-$(CONFIG_REGULATOR_MAX77686) += max77686.o | 43 | obj-$(CONFIG_REGULATOR_MAX77686) += max77686.o |
| 44 | obj-$(CONFIG_REGULATOR_MAX77693) += max77693.o | ||
| 44 | obj-$(CONFIG_REGULATOR_MC13783) += mc13783-regulator.o | 45 | obj-$(CONFIG_REGULATOR_MC13783) += mc13783-regulator.o |
| 45 | obj-$(CONFIG_REGULATOR_MC13892) += mc13892-regulator.o | 46 | obj-$(CONFIG_REGULATOR_MC13892) += mc13892-regulator.o |
| 46 | obj-$(CONFIG_REGULATOR_MC13XXX_CORE) += mc13xxx-regulator-core.o | 47 | obj-$(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 | |||
| 37 | struct 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 */ | ||
| 46 | static 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 | */ | ||
| 63 | static 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, ®); | ||
| 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 | |||
| 91 | static 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++; | ||
