aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChanwoo Choi <cw00.choi@samsung.com>2014-06-25 03:14:44 -0400
committerLee Jones <lee.jones@linaro.org>2014-07-09 09:58:11 -0400
commit54e8827d5f0e66d152ef63e7958030ef4880cd85 (patch)
tree6c8d1f67b3790c53cf00285334607ecc6a705a04
parent10f9edaeaa30468194e1dcd0e47e59b012f4cf8b (diff)
mfd: sec-core: Add support for S2MPU02 device
Add support for Samsung S2MPU02 PMIC device to the MFD sec-core driver. The S2MPU02 device includes PMIC/RTC/Clock devices. Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com> Reviewed-by: Krzysztof Kozlowski <k.kozlowski@samsung.com> Signed-off-by: Lee Jones <lee.jones@linaro.org>
-rw-r--r--drivers/mfd/sec-core.c46
-rw-r--r--drivers/mfd/sec-irq.c110
-rw-r--r--include/linux/mfd/samsung/core.h1
-rw-r--r--include/linux/mfd/samsung/irq.h24
-rw-r--r--include/linux/mfd/samsung/s2mpu02.h201
5 files changed, 352 insertions, 30 deletions
diff --git a/drivers/mfd/sec-core.c b/drivers/mfd/sec-core.c
index be06d0abbf19..15ba847b3d23 100644
--- a/drivers/mfd/sec-core.c
+++ b/drivers/mfd/sec-core.c
@@ -89,6 +89,15 @@ static const struct mfd_cell s2mpa01_devs[] = {
89 }, 89 },
90}; 90};
91 91
92static const struct mfd_cell s2mpu02_devs[] = {
93 { .name = "s2mpu02-pmic", },
94 { .name = "s2mpu02-rtc", },
95 {
96 .name = "s2mpu02-clk",
97 .of_compatible = "samsung,s2mpu02-clk",
98 }
99};
100
92#ifdef CONFIG_OF 101#ifdef CONFIG_OF
93static const struct of_device_id sec_dt_match[] = { 102static const struct of_device_id sec_dt_match[] = {
94 { .compatible = "samsung,s5m8767-pmic", 103 { .compatible = "samsung,s5m8767-pmic",
@@ -103,6 +112,9 @@ static const struct of_device_id sec_dt_match[] = {
103 .compatible = "samsung,s2mpa01-pmic", 112 .compatible = "samsung,s2mpa01-pmic",
104 .data = (void *)S2MPA01, 113 .data = (void *)S2MPA01,
105 }, { 114 }, {
115 .compatible = "samsung,s2mpu02-pmic",
116 .data = (void *)S2MPU02,
117 }, {
106 /* Sentinel */ 118 /* Sentinel */
107 }, 119 },
108}; 120};
@@ -250,9 +262,10 @@ static int sec_pmic_probe(struct i2c_client *i2c,
250{ 262{
251 struct sec_platform_data *pdata = dev_get_platdata(&i2c->dev); 263 struct sec_platform_data *pdata = dev_get_platdata(&i2c->dev);
252 const struct regmap_config *regmap; 264 const struct regmap_config *regmap;
265 const struct mfd_cell *sec_devs;
253 struct sec_pmic_dev *sec_pmic; 266 struct sec_pmic_dev *sec_pmic;
254 unsigned long device_type; 267 unsigned long device_type;
255 int ret; 268 int ret, num_sec_devs;
256 269
257 sec_pmic = devm_kzalloc(&i2c->dev, sizeof(struct sec_pmic_dev), 270 sec_pmic = devm_kzalloc(&i2c->dev, sizeof(struct sec_pmic_dev),
258 GFP_KERNEL); 271 GFP_KERNEL);
@@ -319,34 +332,39 @@ static int sec_pmic_probe(struct i2c_client *i2c,
319 332
320 switch (sec_pmic->device_type) { 333 switch (sec_pmic->device_type) {
321 case S5M8751X: 334 case S5M8751X:
322 ret = mfd_add_devices(sec_pmic->dev, -1, s5m8751_devs, 335 sec_devs = s5m8751_devs;
323 ARRAY_SIZE(s5m8751_devs), NULL, 0, NULL); 336 num_sec_devs = ARRAY_SIZE(s5m8751_devs);
324 break; 337 break;
325 case S5M8763X: 338 case S5M8763X:
326 ret = mfd_add_devices(sec_pmic->dev, -1, s5m8763_devs, 339 sec_devs = s5m8763_devs;
327 ARRAY_SIZE(s5m8763_devs), NULL, 0, NULL); 340 num_sec_devs = ARRAY_SIZE(s5m8763_devs);
328 break; 341 break;
329 case S5M8767X: 342 case S5M8767X:
330 ret = mfd_add_devices(sec_pmic->dev, -1, s5m8767_devs, 343 sec_devs = s5m8767_devs;
331 ARRAY_SIZE(s5m8767_devs), NULL, 0, NULL); 344 num_sec_devs = ARRAY_SIZE(s5m8767_devs);
332 break; 345 break;
333 case S2MPA01: 346 case S2MPA01:
334 ret = mfd_add_devices(sec_pmic->dev, -1, s2mpa01_devs, 347 sec_devs = s2mpa01_devs;
335 ARRAY_SIZE(s2mpa01_devs), NULL, 0, NULL); 348 num_sec_devs = ARRAY_SIZE(s2mpa01_devs);
336 break; 349 break;
337 case S2MPS11X: 350 case S2MPS11X:
338 ret = mfd_add_devices(sec_pmic->dev, -1, s2mps11_devs, 351 sec_devs = s2mps11_devs;
339 ARRAY_SIZE(s2mps11_devs), NULL, 0, NULL); 352 num_sec_devs = ARRAY_SIZE(s2mps11_devs);
340 break; 353 break;
341 case S2MPS14X: 354 case S2MPS14X:
342 ret = mfd_add_devices(sec_pmic->dev, -1, s2mps14_devs, 355 sec_devs = s2mps14_devs;
343 ARRAY_SIZE(s2mps14_devs), NULL, 0, NULL); 356 num_sec_devs = ARRAY_SIZE(s2mps14_devs);
357 break;
358 case S2MPU02:
359 sec_devs = s2mpu02_devs;
360 num_sec_devs = ARRAY_SIZE(s2mpu02_devs);
344 break; 361 break;
345 default: 362 default:
346 /* If this happens the probe function is problem */ 363 /* If this happens the probe function is problem */
347 BUG(); 364 BUG();
348 } 365 }
349 366 ret = mfd_add_devices(sec_pmic->dev, -1, sec_devs, num_sec_devs, NULL,
367 0, NULL);
350 if (ret) 368 if (ret)
351 goto err_mfd; 369 goto err_mfd;
352 370
diff --git a/drivers/mfd/sec-irq.c b/drivers/mfd/sec-irq.c
index 654e2c1dbf7a..f9a57869e3ec 100644
--- a/drivers/mfd/sec-irq.c
+++ b/drivers/mfd/sec-irq.c
@@ -20,6 +20,7 @@
20#include <linux/mfd/samsung/irq.h> 20#include <linux/mfd/samsung/irq.h>
21#include <linux/mfd/samsung/s2mps11.h> 21#include <linux/mfd/samsung/s2mps11.h>
22#include <linux/mfd/samsung/s2mps14.h> 22#include <linux/mfd/samsung/s2mps14.h>
23#include <linux/mfd/samsung/s2mpu02.h>
23#include <linux/mfd/samsung/s5m8763.h> 24#include <linux/mfd/samsung/s5m8763.h>
24#include <linux/mfd/samsung/s5m8767.h> 25#include <linux/mfd/samsung/s5m8767.h>
25 26
@@ -161,6 +162,77 @@ static const struct regmap_irq s2mps14_irqs[] = {
161 }, 162 },
162}; 163};
163 164
165static const struct regmap_irq s2mpu02_irqs[] = {
166 [S2MPU02_IRQ_PWRONF] = {
167 .reg_offset = 0,
168 .mask = S2MPS11_IRQ_PWRONF_MASK,
169 },
170 [S2MPU02_IRQ_PWRONR] = {
171 .reg_offset = 0,
172 .mask = S2MPS11_IRQ_PWRONR_MASK,
173 },
174 [S2MPU02_IRQ_JIGONBF] = {
175 .reg_offset = 0,
176 .mask = S2MPS11_IRQ_JIGONBF_MASK,
177 },
178 [S2MPU02_IRQ_JIGONBR] = {
179 .reg_offset = 0,
180 .mask = S2MPS11_IRQ_JIGONBR_MASK,
181 },
182 [S2MPU02_IRQ_ACOKBF] = {
183 .reg_offset = 0,
184 .mask = S2MPS11_IRQ_ACOKBF_MASK,
185 },
186 [S2MPU02_IRQ_ACOKBR] = {
187 .reg_offset = 0,
188 .mask = S2MPS11_IRQ_ACOKBR_MASK,
189 },
190 [S2MPU02_IRQ_PWRON1S] = {
191 .reg_offset = 0,
192 .mask = S2MPS11_IRQ_PWRON1S_MASK,
193 },
194 [S2MPU02_IRQ_MRB] = {
195 .reg_offset = 0,
196 .mask = S2MPS11_IRQ_MRB_MASK,
197 },
198 [S2MPU02_IRQ_RTC60S] = {
199 .reg_offset = 1,
200 .mask = S2MPS11_IRQ_RTC60S_MASK,
201 },
202 [S2MPU02_IRQ_RTCA1] = {
203 .reg_offset = 1,
204 .mask = S2MPS11_IRQ_RTCA1_MASK,
205 },
206 [S2MPU02_IRQ_RTCA0] = {
207 .reg_offset = 1,
208 .mask = S2MPS11_IRQ_RTCA0_MASK,
209 },
210 [S2MPU02_IRQ_SMPL] = {
211 .reg_offset = 1,
212 .mask = S2MPS11_IRQ_SMPL_MASK,
213 },
214 [S2MPU02_IRQ_RTC1S] = {
215 .reg_offset = 1,
216 .mask = S2MPS11_IRQ_RTC1S_MASK,
217 },
218 [S2MPU02_IRQ_WTSR] = {
219 .reg_offset = 1,
220 .mask = S2MPS11_IRQ_WTSR_MASK,
221 },
222 [S2MPU02_IRQ_INT120C] = {
223 .reg_offset = 2,
224 .mask = S2MPS11_IRQ_INT120C_MASK,
225 },
226 [S2MPU02_IRQ_INT140C] = {
227 .reg_offset = 2,
228