aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Abraham <thomas.ab@samsung.com>2015-11-20 05:37:51 -0500
committerLee Jones <lee.jones@linaro.org>2015-11-23 05:33:16 -0500
commit9e4808d2c6a6660d5d2cd572e689570df14a8472 (patch)
tree4f67d44a6244c675ab8531d1ef46d3516faab758
parent1ec218373b8ebda821aec00bb156a9c94fad9cd4 (diff)
mfd: sec: Add support for S2MPS15 PMIC
Add support for S2MPS15 PMIC which is similar to S2MPS11 PMIC. The S2MPS15 PMIC supports 27 LDO regulators, 10 buck regulators, RTC, three 32.768KHz clock outputs and battery charger. This patch adds initial support for LDO and buck regulators of S2MPS15 device. Signed-off-by: Thomas Abraham <thomas.ab@samsung.com> Signed-off-by: Alim Akhtar <alim.akhtar@samsung.com> Reviewed-by: Krzysztof Kozlowski <k.kozlowski@samsung.com> [Alim: Added s2mps15_devs like rtc and clk and related changes] Signed-off-by: Lee Jones <lee.jones@linaro.org>
-rw-r--r--drivers/mfd/sec-core.c31
-rw-r--r--drivers/mfd/sec-irq.c8
-rw-r--r--include/linux/mfd/samsung/core.h1
-rw-r--r--include/linux/mfd/samsung/s2mps15.h158
4 files changed, 198 insertions, 0 deletions
diff --git a/drivers/mfd/sec-core.c b/drivers/mfd/sec-core.c
index 989076d6cb83..7c4e7be17f1e 100644
--- a/drivers/mfd/sec-core.c
+++ b/drivers/mfd/sec-core.c
@@ -29,6 +29,7 @@
29#include <linux/mfd/samsung/s2mps11.h> 29#include <linux/mfd/samsung/s2mps11.h>
30#include <linux/mfd/samsung/s2mps13.h> 30#include <linux/mfd/samsung/s2mps13.h>
31#include <linux/mfd/samsung/s2mps14.h> 31#include <linux/mfd/samsung/s2mps14.h>
32#include <linux/mfd/samsung/s2mps15.h>
32#include <linux/mfd/samsung/s2mpu02.h> 33#include <linux/mfd/samsung/s2mpu02.h>
33#include <linux/mfd/samsung/s5m8763.h> 34#include <linux/mfd/samsung/s5m8763.h>
34#include <linux/mfd/samsung/s5m8767.h> 35#include <linux/mfd/samsung/s5m8767.h>
@@ -96,6 +97,17 @@ static const struct mfd_cell s2mps14_devs[] = {
96 } 97 }
97}; 98};
98 99
100static const struct mfd_cell s2mps15_devs[] = {
101 {
102 .name = "s2mps15-regulator",
103 }, {
104 .name = "s2mps15-rtc",
105 }, {
106 .name = "s2mps13-clk",
107 .of_compatible = "samsung,s2mps13-clk",
108 },
109};
110
99static const struct mfd_cell s2mpa01_devs[] = { 111static const struct mfd_cell s2mpa01_devs[] = {
100 { 112 {
101 .name = "s2mpa01-pmic", 113 .name = "s2mpa01-pmic",
@@ -122,6 +134,9 @@ static const struct of_device_id sec_dt_match[] = {
122 .compatible = "samsung,s2mps14-pmic", 134 .compatible = "samsung,s2mps14-pmic",
123 .data = (void *)S2MPS14X, 135 .data = (void *)S2MPS14X,
124 }, { 136 }, {
137 .compatible = "samsung,s2mps15-pmic",
138 .data = (void *)S2MPS15X,
139 }, {
125 .compatible = "samsung,s2mpa01-pmic", 140 .compatible = "samsung,s2mpa01-pmic",
126 .data = (void *)S2MPA01, 141 .data = (void *)S2MPA01,
127 }, { 142 }, {
@@ -223,6 +238,15 @@ static const struct regmap_config s2mps14_regmap_config = {
223 .cache_type = REGCACHE_FLAT, 238 .cache_type = REGCACHE_FLAT,
224}; 239};
225 240
241static const struct regmap_config s2mps15_regmap_config = {
242 .reg_bits = 8,
243 .val_bits = 8,
244
245 .max_register = S2MPS15_REG_LDODSCH4,
246 .volatile_reg = s2mps11_volatile,
247 .cache_type = REGCACHE_FLAT,
248};
249
226static const struct regmap_config s2mpu02_regmap_config = { 250static const struct regmap_config s2mpu02_regmap_config = {
227 .reg_bits = 8, 251 .reg_bits = 8,
228 .val_bits = 8, 252 .val_bits = 8,
@@ -384,6 +408,9 @@ static int sec_pmic_probe(struct i2c_client *i2c,
384 case S2MPS14X: 408 case S2MPS14X:
385 regmap = &s2mps14_regmap_config; 409 regmap = &s2mps14_regmap_config;
386 break; 410 break;
411 case S2MPS15X:
412 regmap = &s2mps15_regmap_config;
413 break;
387 case S5M8763X: 414 case S5M8763X:
388 regmap = &s5m8763_regmap_config; 415 regmap = &s5m8763_regmap_config;
389 break; 416 break;
@@ -442,6 +469,10 @@ static int sec_pmic_probe(struct i2c_client *i2c,
442 sec_devs = s2mps14_devs; 469 sec_devs = s2mps14_devs;
443 num_sec_devs = ARRAY_SIZE(s2mps14_devs); 470 num_sec_devs = ARRAY_SIZE(s2mps14_devs);
444 break; 471 break;
472 case S2MPS15X:
473 sec_devs = s2mps15_devs;
474 num_sec_devs = ARRAY_SIZE(s2mps15_devs);
475 break;
445 case S2MPU02: 476 case S2MPU02:
446 sec_devs = s2mpu02_devs; 477 sec_devs = s2mpu02_devs;
447 num_sec_devs = ARRAY_SIZE(s2mpu02_devs); 478 num_sec_devs = ARRAY_SIZE(s2mpu02_devs);
diff --git a/drivers/mfd/sec-irq.c b/drivers/mfd/sec-irq.c
index 806fa8dbb22d..d77de431cc50 100644
--- a/drivers/mfd/sec-irq.c
+++ b/drivers/mfd/sec-irq.c
@@ -407,6 +407,11 @@ static const struct regmap_irq_chip s2mps14_irq_chip = {
407 S2MPS1X_IRQ_CHIP_COMMON_DATA, 407 S2MPS1X_IRQ_CHIP_COMMON_DATA,
408}; 408};
409 409
410static const struct regmap_irq_chip s2mps15_irq_chip = {
411 .name = "s2mps15",
412 S2MPS1X_IRQ_CHIP_COMMON_DATA,
413};
414
410static const struct regmap_irq_chip s2mpu02_irq_chip = { 415static const struct regmap_irq_chip s2mpu02_irq_chip = {
411 .name = "s2mpu02", 416 .name = "s2mpu02",
412 .irqs = s2mpu02_irqs, 417 .irqs = s2mpu02_irqs,
@@ -466,6 +471,9 @@ int sec_irq_init(struct sec_pmic_dev *sec_pmic)
466 case S2MPS14X: 471 case S2MPS14X:
467 sec_irq_chip = &s2mps14_irq_chip; 472 sec_irq_chip = &s2mps14_irq_chip;
468 break; 473 break;
474 case S2MPS15X:
475 sec_irq_chip = &s2mps15_irq_chip;
476 break;
469 case S2MPU02: 477 case S2MPU02:
470 sec_irq_chip = &s2mpu02_irq_chip; 478 sec_irq_chip = &s2mpu02_irq_chip;
471 break; 479 break;
diff --git a/include/linux/mfd/samsung/core.h b/include/linux/mfd/samsung/core.h
index a06098639399..6bc4bcd488ac 100644
--- a/include/linux/mfd/samsung/core.h
+++ b/include/linux/mfd/samsung/core.h
@@ -44,6 +44,7 @@ enum sec_device_type {
44 S2MPS11X, 44 S2MPS11X,
45 S2MPS13X, 45 S2MPS13X,
46 S2MPS14X, 46 S2MPS14X,
47 S2MPS15X,
47 S2MPU02, 48 S2MPU02,
48}; 49};
49 50
diff --git a/include/linux/mfd/samsung/s2mps15.h b/include/linux/mfd/samsung/s2mps15.h
new file mode 100644
index 000000000000..36d35287c3c0
--- /dev/null
+++ b/include/linux/mfd/samsung/s2mps15.h
@@ -0,0 +1,158 @@
1/*
2 * Copyright (c) 2015 Samsung Electronics Co., Ltd
3 * http://www.samsung.com
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published by the
7 * Free Software Foundation; either version 2 of the License, or (at your
8 * option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 */
15
16#ifndef __LINUX_MFD_S2MPS15_H
17#define __LINUX_MFD_S2MPS15_H
18
19/* S2MPS15 registers */
20enum s2mps15_reg {
21 S2MPS15_REG_ID,
22 S2MPS15_REG_INT1,
23 S2MPS15_REG_INT2,
24 S2MPS15_REG_INT3,
25 S2MPS15_REG_INT1M,
26 S2MPS15_REG_INT2M,
27 S2MPS15_REG_INT3M,
28 S2MPS15_REG_ST1,
29 S2MPS15_REG_ST2,
30 S2MPS15_REG_PWRONSRC,
31 S2MPS15_REG_OFFSRC,
32 S2MPS15_REG_BU_CHG,
33 S2MPS15_REG_RTC_BUF,
34 S2MPS15_REG_CTRL1,
35 S2MPS15_REG_CTRL2,
36 S2MPS15_REG_RSVD1,
37 S2MPS15_REG_RSVD2,
38 S2MPS15_REG_RSVD3,
39 S2MPS15_REG_RSVD4,
40 S2MPS15_REG_RSVD5,
41 S2MPS15_REG_RSVD6,
42 S2MPS15_REG_CTRL3,
43 S2MPS15_REG_RSVD7,
44 S2MPS15_REG_RSVD8,
45 S2MPS15_REG_RSVD9,
46 S2MPS15_REG_B1CTRL1,
47 S2MPS15_REG_B1CTRL2,
48 S2MPS15_REG_B2CTRL1,
49 S2MPS15_REG_B2CTRL2,
50 S2MPS15_REG_B3CTRL1,
51 S2MPS15_REG_B3CTRL2,
52 S2MPS15_REG_B4CTRL1,
53 S2MPS15_REG_B4CTRL2,
54 S2MPS15_REG_B5CTRL1,
55 S2MPS15_REG_B5CTRL2,
56 S2MPS15_REG_B6CTRL1,
57 S2MPS15_REG_B6CTRL2,
58 S2MPS15_REG_B7CTRL1,
59 S2MPS15_REG_B7CTRL2,
60 S2MPS15_REG_B8CTRL1,
61 S2MPS15_REG_B8CTRL2,
62 S2MPS15_REG_B9CTRL1,
63 S2MPS15_REG_B9CTRL2,
64 S2MPS15_REG_B10CTRL1,
65 S2MPS15_REG_B10CTRL2,
66 S2MPS15_REG_BBCTRL1,
67 S2MPS15_REG_BBCTRL2,
68 S2MPS15_REG_BRAMP,
69 S2MPS15_REG_LDODVS1,
70 S2MPS15_REG_LDODVS2,
71 S2MPS15_REG_LDODVS3,
72 S2MPS15_REG_LDODVS4,
73 S2MPS15_REG_L1CTRL,
74 S2MPS15_REG_L2CTRL,
75 S2MPS15_REG_L3CTRL,
76 S2MPS15_REG_L4CTRL,
77 S2MPS15_REG_L5CTRL,
78 S2MPS15_REG_L6CTRL,
79 S2MPS15_REG_L7CTRL,
80 S2MPS15_REG_L8CTRL,
81 S2MPS15_REG_L9CTRL,
82 S2MPS15_REG_L10CTRL,
83 S2MPS15_REG_L11CTRL,
84 S2MPS15_REG_L12CTRL,
85 S2MPS15_REG_L13CTRL,
86 S2MPS15_REG_L14CTRL,
87 S2MPS15_REG_L15CTRL,
88 S2MPS15_REG_L16CTRL,
89 S2MPS15_REG_L17CTRL,
90 S2MPS15_REG_L18CTRL,
91 S2MPS15_REG_L19CTRL,
92 S2MPS15_REG_L20CTRL,
93 S2MPS15_REG_L21CTRL,
94 S2MPS15_REG_L22CTRL,
95 S2MPS15_REG_L23CTRL,
96 S2MPS15_REG_L24CTRL,
97 S2MPS15_REG_L25CTRL,
98 S2MPS15_REG_L26CTRL,
99 S2MPS15_REG_L27CTRL,
100 S2MPS15_REG_LDODSCH1,
101 S2MPS15_REG_LDODSCH2,
102 S2MPS15_REG_LDODSCH3,
103 S2MPS15_REG_LDODSCH4,
104};
105
106/* S2MPS15 regulator ids */
107enum s2mps15_regulators {
108 S2MPS15_LDO1,
109 S2MPS15_LDO2,
110 S2MPS15_LDO3,
111 S2MPS15_LDO4,
112 S2MPS15_LDO5,
113 S2MPS15_LDO6,
114 S2MPS15_LDO7,
115 S2MPS15_LDO8,
116 S2MPS15_LDO9,
117 S2MPS15_LDO10,
118 S2MPS15_LDO11,
119 S2MPS15_LDO12,
120 S2MPS15_LDO13,
121 S2MPS15_LDO14,
122 S2MPS15_LDO15,
123 S2MPS15_LDO16,
124 S2MPS15_LDO17,
125 S2MPS15_LDO18,
126 S2MPS15_LDO19,
127 S2MPS15_LDO20,
128 S2MPS15_LDO21,
129 S2MPS15_LDO22,
130 S2MPS15_LDO23,
131 S2MPS15_LDO24,
132 S2MPS15_LDO25,
133 S2MPS15_LDO26,
134 S2MPS15_LDO27,
135 S2MPS15_BUCK1,
136 S2MPS15_BUCK2,
137 S2MPS15_BUCK3,
138 S2MPS15_BUCK4,
139 S2MPS15_BUCK5,
140 S2MPS15_BUCK6,
141 S2MPS15_BUCK7,
142 S2MPS15_BUCK8,
143 S2MPS15_BUCK9,
144 S2MPS15_BUCK10,
145 S2MPS15_BUCK11,
146 S2MPS15_REGULATOR_MAX,
147};
148
149#define S2MPS15_LDO_VSEL_MASK (0x3F)
150#define S2MPS15_BUCK_VSEL_MASK (0xFF)
151
152#define S2MPS15_ENABLE_SHIFT (0x06)
153#define S2MPS15_ENABLE_MASK (0x03 << S2MPS15_ENABLE_SHIFT)
154
155#define S2MPS15_LDO_N_VOLTAGES (S2MPS15_LDO_VSEL_MASK + 1)
156#define S2MPS15_BUCK_N_VOLTAGES (S2MPS15_BUCK_VSEL_MASK + 1)
157
158#endif /* __LINUX_MFD_S2MPS15_H */