aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBeniamino Galvani <b.galvani@gmail.com>2014-08-30 08:50:23 -0400
committerLee Jones <lee.jones@linaro.org>2014-09-26 03:15:51 -0400
commit9bb9e29c78f8d8ee310987fd58a2b908a4ce0c40 (patch)
tree452bf5021eefa54b8d05a60554f83f306e726a16
parent6ac734d2242949f41eb1346ca0fd4ed010c937aa (diff)
mfd: Add Ricoh RN5T618 PMIC core driver
Ricoh RN5T618 is a power management IC which integrates 3 step-down DCDC converters, 7 low-dropout regulators, a Li-ion battery charger, fuel gauge, ADC, GPIOs and a watchdog timer. This commit adds a MFD core driver to support the I2C communication with the device. Signed-off-by: Beniamino Galvani <b.galvani@gmail.com> Signed-off-by: Lee Jones <lee.jones@linaro.org>
-rw-r--r--drivers/mfd/Kconfig11
-rw-r--r--drivers/mfd/Makefile1
-rw-r--r--drivers/mfd/rn5t618.c134
-rw-r--r--include/linux/mfd/rn5t618.h228
4 files changed, 374 insertions, 0 deletions
<
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index fc419da8d722..82f70dcab136 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -597,6 +597,17 @@ config MFD_RC5T583
597 Additional drivers must be enabled in order to use the 597 Additional drivers must be enabled in order to use the
598 different functionality of the device. 598 different functionality of the device.
599 599
600config MFD_RN5T618
601 tristate "Ricoh RN5T5618 PMIC"
602 depends on I2C
603 select MFD_CORE
604 select REGMAP_I2C
605 help
606 Say yes here to add support for the Ricoh RN5T618 PMIC. This
607 driver provides common support for accessing the device,
608 additional drivers must be enabled in order to use the
609 functionality of the device.
610
600config MFD_SEC_CORE 611config MFD_SEC_CORE
601 bool "SAMSUNG Electronics PMIC Series Support" 612 bool "SAMSUNG Electronics PMIC Series Support"
602 depends on I2C=y 613 depends on I2C=y
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
index d58068aa8aa9..aa5a73a5ba47 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -160,6 +160,7 @@ obj-$(CONFIG_MFD_INTEL_MSIC) += intel_msic.o
160obj-$(CONFIG_MFD_PALMAS) += palmas.o 160obj-$(CONFIG_MFD_PALMAS) += palmas.o
161obj-$(CONFIG_MFD_VIPERBOARD) += viperboard.o 161obj-$(CONFIG_MFD_VIPERBOARD) += viperboard.o
162obj-$(CONFIG_MFD_RC5T583) += rc5t583.o rc5t583-irq.o 162obj-$(CONFIG_MFD_RC5T583) += rc5t583.o rc5t583-irq.o
163obj-$(CONFIG_MFD_RN5T618) += rn5t618.o
163obj-$(CONFIG_MFD_SEC_CORE) += sec-core.o sec-irq.o 164obj-$(CONFIG_MFD_SEC_CORE) += sec-core.o sec-irq.o
164obj-$(CONFIG_MFD_SYSCON) += syscon.o 165obj-$(CONFIG_MFD_SYSCON) += syscon.o
165obj-$(CONFIG_MFD_LM3533) += lm3533-core.o lm3533-ctrlbank.o 166obj-$(CONFIG_MFD_LM3533) += lm3533-core.o lm3533-ctrlbank.o
diff --git a/drivers/mfd/rn5t618.c b/drivers/mfd/rn5t618.c
new file mode 100644
index 000000000000..666857192dbe
--- /dev/null
+++ b/drivers/mfd/rn5t618.c
@@ -0,0 +1,134 @@
1/*
2 * MFD core driver for Ricoh RN5T618 PMIC
3 *
4 * Copyright (C) 2014 Beniamino Galvani <b.galvani@gmail.com>
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * version 2 as published by the Free Software Foundation.
9 *
10 * You should have received a copy of the GNU General Public License
11 * along with this program. If not, see <http://www.gnu.org/licenses/>.
12 */
13
14#include <linux/i2c.h>
15#include <linux/mfd/core.h>
16#include <linux/mfd/rn5t618.h>
17#include <linux/module.h>
18#include <linux/regmap.h>
19
20static const struct mfd_cell rn5t618_cells[] = {
21 { .name = "rn5t618-regulator" },
22 { .name = "rn5t618-wdt" },
23};
24
25static bool rn5t618_volatile_reg(struct device *dev, unsigned int reg)
26{
27 switch (reg) {
28 case RN5T618_WATCHDOGCNT:
29 case RN5T618_DCIRQ:
30 case RN5T618_ILIMDATAH ... RN5T618_AIN0DATAL:
31 case RN5T618_IR_ADC1 ... RN5T618_IR_ADC3:
32 case RN5T618_IR_GPR:
33 case RN5T618_IR_GPF:
34 case RN5T618_MON_IOIN:
35 case RN5T618_INTMON:
36 return true;
37 default:
38 return false;
39 }
40}
41
42static const struct regmap_config rn5t618_regmap_config = {
43 .reg_bits = 8,
44 .val_bits = 8,
45 .volatile_reg = rn5t618_volatile_reg,
46 .max_register = RN5T618_MAX_REG,
47 .cache_type = REGCACHE_RBTREE,
48};
49
50static struct rn5t618 *rn5t618_pm_power_off;
51
52static void rn5t618_power_off(void)
53{
54 /* disable automatic repower-on */
55 regmap_update_bits(rn5t618_pm_power_off->regmap, RN5T618_REPCNT,
56 RN5T618_REPCNT_REPWRON, 0);
57 /* start power-off sequence */
58 regmap_update_bits(rn5t618_pm_power_off->regmap, RN5T618_SLPCNT,
59 RN5T618_SLPCNT_SWPWROFF, RN5T618_SLPCNT_SWPWROFF);
60}
61
62static int rn5t618_i2c_probe(struct i2c_client *i2c,
63 const struct i2c_device_id *id)
64{
65 struct rn5t618 *priv;
66 int ret;
67
68 priv = devm_kzalloc(&i2c->dev, sizeof(*priv), GFP_KERNEL);
69 if (!priv)
70 return -ENOMEM;
71
72 i2c_set_clientdata(i2c, priv);
73
74 priv->regmap = devm_regmap_init_i2c(i2c, &rn5t618_regmap_config);
75 if (IS_ERR(priv->regmap)) {
76 ret = PTR_ERR(priv->regmap);
77 dev_err(&i2c->dev, "regmap init failed: %d\n", ret);
78 return ret;
79 }
80
81 ret = mfd_add_devices(&i2c->dev, -1, rn5t618_cells,
82 ARRAY_SIZE(rn5t618_cells), NULL, 0, NULL);
83 if (ret) {
84 dev_err(&i2c->dev, "failed to add sub-devices: %d\n", ret);
85 return ret;
86 }
87
88 if (!pm_power_off) {
89 rn5t618_pm_power_off = priv;
90 pm_power_off = rn5t618_power_off;
91 }
92
93 return 0;
94}
95
96static int rn5t618_i2c_remove(struct i2c_client *i2c)
97{
98 struct rn5t618 *priv = i2c_get_clientdata(i2c);
99
100 if (priv == rn5t618_pm_power_off) {
101 rn5t618_pm_power_off = NULL;
102 pm_power_off = NULL;
103 }
104
105 mfd_remove_devices(&i2c->dev);
106 return 0;
107}
108
109static const struct of_device_id rn5t618_of_match[] = {
110 { .compatible = "ricoh,rn5t618" },
111 { }
112};
113MODULE_DEVICE_TABLE(of, rn5t618_of_match);
114
115static const struct i2c_device_id rn5t618_i2c_id[] = {
116 { }
117};
118MODULE_DEVICE_TABLE(i2c, rn5t618_i2c_id);
119
120static struct i2c_driver rn5t618_i2c_driver = {
121 .driver = {
122 .name = "rn5t618",
123 .of_match_table = of_match_ptr(rn5t618_of_match),
124 },
125 .probe = rn5t618_i2c_probe,
126 .remove = rn5t618_i2c_remove,
127 .id_table = rn5t618_i2c_id,
128};
129
130module_i2c_driver(rn5t618_i2c_driver);
131
132MODULE_AUTHOR("Beniamino Galvani <b.galvani@gmail.com>");
133MODULE_DESCRIPTION("Ricoh RN5T618 MFD driver");
134MODULE_LICENSE("GPL v2");
diff --git a/include/linux/mfd/rn5t618.h b/include/linux/mfd/rn5t618.h
new file mode 100644
index 000000000000..c72d5344f3b3
--- /dev/null
+++ b/include/linux/mfd/rn5t618.h
@@ -0,0 +1,228 @@
1/*
2 * MFD core driver for Ricoh RN5T618 PMIC
3 *
4 * Copyright (C) 2014 Beniamino Galvani <b.galvani@gmail.com>
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * version 2 as published by the Free Software Foundation.
9 *
10 * You should have received a copy of the GNU General Public License
11 * along with this program. If not, see <http://www.gnu.org/licenses/>.
12 */
13
14#ifndef __LINUX_MFD_RN5T618_H
15#define __LINUX_MFD_RN5T618_H
16
17#include <linux/regmap.h>
18
19#define RN5T618_LSIVER 0x00
20#define RN5T618_OTPVER 0x01
21#define RN5T618_IODAC 0x02
22#define RN5T618_VINDAC 0x03
23#define RN5T618_CPUCNT 0x06
24#define RN5T618_PSWR 0x07
25#define RN5T618_PONHIS 0x09
26#define RN5T618_POFFHIS 0x0a