Blame view

drivers/mfd/sec-core.c 11.3 KB
0f5f70783   Sangbeom Kim   mfd: Add S5M core...
1
  /*
63063bfbf   Sangbeom Kim   mfd: Modify samsu...
2
   * sec-core.c
0f5f70783   Sangbeom Kim   mfd: Add S5M core...
3
   *
63063bfbf   Sangbeom Kim   mfd: Modify samsu...
4
   * Copyright (c) 2012 Samsung Electronics Co., Ltd
0f5f70783   Sangbeom Kim   mfd: Add S5M core...
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
   *              http://www.samsung.com
   *
   *  This program is free software; you can redistribute  it and/or modify it
   *  under  the terms of  the GNU General  Public License as published by the
   *  Free Software Foundation;  either version 2 of the  License, or (at your
   *  option) any later version.
   *
   */
  
  #include <linux/module.h>
  #include <linux/moduleparam.h>
  #include <linux/init.h>
  #include <linux/err.h>
  #include <linux/slab.h>
  #include <linux/i2c.h>
1c5a099b2   Sachin Kamat   mfd: sec-core: In...
20
  #include <linux/of.h>
26aec009f   Amit Daniel Kachhap   regulator: add de...
21
  #include <linux/of_irq.h>
0f5f70783   Sangbeom Kim   mfd: Add S5M core...
22
23
24
25
  #include <linux/interrupt.h>
  #include <linux/pm_runtime.h>
  #include <linux/mutex.h>
  #include <linux/mfd/core.h>
54227bcf2   Sangbeom Kim   mfd: Modify samsu...
26
27
  #include <linux/mfd/samsung/core.h>
  #include <linux/mfd/samsung/irq.h>
ce24991e1   Sachin Kamat   mfd: Add support ...
28
  #include <linux/mfd/samsung/s2mpa01.h>
25f311fa5   Mark Brown   mfd: sec: Provide...
29
  #include <linux/mfd/samsung/s2mps11.h>
76b9840b2   Chanwoo Choi   regulator: s2mps1...
30
  #include <linux/mfd/samsung/s2mps13.h>
dc6919663   Krzysztof Kozlowski   mfd: sec: Add sup...
31
  #include <linux/mfd/samsung/s2mps14.h>
00e2573d2   Chanwoo Choi   regulator: s2mps1...
32
  #include <linux/mfd/samsung/s2mpu02.h>
25f311fa5   Mark Brown   mfd: sec: Provide...
33
34
  #include <linux/mfd/samsung/s5m8763.h>
  #include <linux/mfd/samsung/s5m8767.h>
0f5f70783   Sangbeom Kim   mfd: Add S5M core...
35
  #include <linux/regmap.h>
5ac98553a   Geert Uytterhoeven   mfd: Constify str...
36
  static const struct mfd_cell s5m8751_devs[] = {
88a1cfd6f   Sangbeom Kim   mfd: Add support ...
37
38
39
40
41
42
43
44
  	{
  		.name = "s5m8751-pmic",
  	}, {
  		.name = "s5m-charger",
  	}, {
  		.name = "s5m8751-codec",
  	},
  };
5ac98553a   Geert Uytterhoeven   mfd: Constify str...
45
  static const struct mfd_cell s5m8763_devs[] = {
88a1cfd6f   Sangbeom Kim   mfd: Add support ...
46
47
48
49
50
51
52
53
  	{
  		.name = "s5m8763-pmic",
  	}, {
  		.name = "s5m-rtc",
  	}, {
  		.name = "s5m-charger",
  	},
  };
5ac98553a   Geert Uytterhoeven   mfd: Constify str...
54
  static const struct mfd_cell s5m8767_devs[] = {
0f5f70783   Sangbeom Kim   mfd: Add S5M core...
55
56
57
58
  	{
  		.name = "s5m8767-pmic",
  	}, {
  		.name = "s5m-rtc",
39fed00f0   Tushar Behera   mfd: sec-core: Ad...
59
60
  	}, {
  		.name = "s5m8767-clk",
53c31b343   Krzysztof Kozlowski   mfd: sec-core: Ad...
61
  		.of_compatible = "samsung,s5m8767-clk",
39fed00f0   Tushar Behera   mfd: sec-core: Ad...
62
  	}
0f5f70783   Sangbeom Kim   mfd: Add S5M core...
63
  };
5ac98553a   Geert Uytterhoeven   mfd: Constify str...
64
  static const struct mfd_cell s2mps11_devs[] = {
9b6d13430   Sangbeom Kim   mfd: Add samsung ...
65
66
  	{
  		.name = "s2mps11-pmic",
3134bcae4   Yadwinder Singh Brar   mfd: sec: Add clo...
67
68
  	}, {
  		.name = "s2mps11-clk",
53c31b343   Krzysztof Kozlowski   mfd: sec-core: Ad...
69
  		.of_compatible = "samsung,s2mps11-clk",
3134bcae4   Yadwinder Singh Brar   mfd: sec: Add clo...
70
  	}
9b6d13430   Sangbeom Kim   mfd: Add samsung ...
71
  };
3bc2ee91a   Chanwoo Choi   mfd: sec-core: Ad...
72
73
74
75
76
77
78
79
  static const struct mfd_cell s2mps13_devs[] = {
  	{ .name = "s2mps13-pmic", },
  	{ .name = "s2mps13-rtc", },
  	{
  		.name = "s2mps13-clk",
  		.of_compatible = "samsung,s2mps13-clk",
  	},
  };
dc6919663   Krzysztof Kozlowski   mfd: sec: Add sup...
80
81
82
83
84
85
86
  static const struct mfd_cell s2mps14_devs[] = {
  	{
  		.name = "s2mps14-pmic",
  	}, {
  		.name = "s2mps14-rtc",
  	}, {
  		.name = "s2mps14-clk",
53c31b343   Krzysztof Kozlowski   mfd: sec-core: Ad...
87
  		.of_compatible = "samsung,s2mps14-clk",
dc6919663   Krzysztof Kozlowski   mfd: sec: Add sup...
88
89
  	}
  };
ce24991e1   Sachin Kamat   mfd: Add support ...
90
91
92
93
94
  static const struct mfd_cell s2mpa01_devs[] = {
  	{
  		.name = "s2mpa01-pmic",
  	},
  };
54e8827d5   Chanwoo Choi   mfd: sec-core: Ad...
95
96
97
98
99
100
101
102
  static const struct mfd_cell s2mpu02_devs[] = {
  	{ .name = "s2mpu02-pmic", },
  	{ .name = "s2mpu02-rtc", },
  	{
  		.name = "s2mpu02-clk",
  		.of_compatible = "samsung,s2mpu02-clk",
  	}
  };
26aec009f   Amit Daniel Kachhap   regulator: add de...
103
  #ifdef CONFIG_OF
df20b7c53   Krzysztof Kozlowski   mfd: sec-core: Ma...
104
  static const struct of_device_id sec_dt_match[] = {
26aec009f   Amit Daniel Kachhap   regulator: add de...
105
106
  	{	.compatible = "samsung,s5m8767-pmic",
  		.data = (void *)S5M8767X,
ce24991e1   Sachin Kamat   mfd: Add support ...
107
108
  	}, {
  		.compatible = "samsung,s2mps11-pmic",
aa32acadc   Yadwinder Singh Brar   mfd: s2mps11: Add...
109
  		.data = (void *)S2MPS11X,
ce24991e1   Sachin Kamat   mfd: Add support ...
110
  	}, {
3bc2ee91a   Chanwoo Choi   mfd: sec-core: Ad...
111
112
113
  		.compatible = "samsung,s2mps13-pmic",
  		.data = (void *)S2MPS13X,
  	}, {
ce24991e1   Sachin Kamat   mfd: Add support ...
114
  		.compatible = "samsung,s2mps14-pmic",
dc6919663   Krzysztof Kozlowski   mfd: sec: Add sup...
115
  		.data = (void *)S2MPS14X,
ce24991e1   Sachin Kamat   mfd: Add support ...
116
117
118
119
  	}, {
  		.compatible = "samsung,s2mpa01-pmic",
  		.data = (void *)S2MPA01,
  	}, {
54e8827d5   Chanwoo Choi   mfd: sec-core: Ad...
120
121
122
  		.compatible = "samsung,s2mpu02-pmic",
  		.data = (void *)S2MPU02,
  	}, {
ce24991e1   Sachin Kamat   mfd: Add support ...
123
  		/* Sentinel */
dc6919663   Krzysztof Kozlowski   mfd: sec: Add sup...
124
  	},
26aec009f   Amit Daniel Kachhap   regulator: add de...
125
126
  };
  #endif
ce24991e1   Sachin Kamat   mfd: Add support ...
127
128
129
130
131
132
133
134
135
136
137
  static bool s2mpa01_volatile(struct device *dev, unsigned int reg)
  {
  	switch (reg) {
  	case S2MPA01_REG_INT1M:
  	case S2MPA01_REG_INT2M:
  	case S2MPA01_REG_INT3M:
  		return false;
  	default:
  		return true;
  	}
  }
6b845ba93   Mark Brown   mfd: sec: Add reg...
138
139
140
141
142
143
144
145
146
147
148
  static bool s2mps11_volatile(struct device *dev, unsigned int reg)
  {
  	switch (reg) {
  	case S2MPS11_REG_INT1M:
  	case S2MPS11_REG_INT2M:
  	case S2MPS11_REG_INT3M:
  		return false;
  	default:
  		return true;
  	}
  }
00e2573d2   Chanwoo Choi   regulator: s2mps1...
149
150
151
152
153
154
155
156
157
158
159
  static bool s2mpu02_volatile(struct device *dev, unsigned int reg)
  {
  	switch (reg) {
  	case S2MPU02_REG_INT1M:
  	case S2MPU02_REG_INT2M:
  	case S2MPU02_REG_INT3M:
  		return false;
  	default:
  		return true;
  	}
  }
6b845ba93   Mark Brown   mfd: sec: Add reg...
160
161
162
163
164
165
166
167
168
169
170
171
  static bool s5m8763_volatile(struct device *dev, unsigned int reg)
  {
  	switch (reg) {
  	case S5M8763_REG_IRQM1:
  	case S5M8763_REG_IRQM2:
  	case S5M8763_REG_IRQM3:
  	case S5M8763_REG_IRQM4:
  		return false;
  	default:
  		return true;
  	}
  }
a30fffb06   Krzysztof Kozlowski   mfd: sec: Constif...
172
  static const struct regmap_config sec_regmap_config = {
0f5f70783   Sangbeom Kim   mfd: Add S5M core...
173
174
175
  	.reg_bits = 8,
  	.val_bits = 8,
  };
ce24991e1   Sachin Kamat   mfd: Add support ...
176
177
178
179
180
181
182
183
  static const struct regmap_config s2mpa01_regmap_config = {
  	.reg_bits = 8,
  	.val_bits = 8,
  
  	.max_register = S2MPA01_REG_LDO_OVCB4,
  	.volatile_reg = s2mpa01_volatile,
  	.cache_type = REGCACHE_FLAT,
  };
a30fffb06   Krzysztof Kozlowski   mfd: sec: Constif...
184
  static const struct regmap_config s2mps11_regmap_config = {
25f311fa5   Mark Brown   mfd: sec: Provide...
185
186
187
188
  	.reg_bits = 8,
  	.val_bits = 8,
  
  	.max_register = S2MPS11_REG_L38CTRL,
6b845ba93   Mark Brown   mfd: sec: Add reg...
189
190
  	.volatile_reg = s2mps11_volatile,
  	.cache_type = REGCACHE_FLAT,
25f311fa5   Mark Brown   mfd: sec: Provide...
191
  };
76b9840b2   Chanwoo Choi   regulator: s2mps1...
192
193
194
195
196
197
198
199
  static const struct regmap_config s2mps13_regmap_config = {
  	.reg_bits = 8,
  	.val_bits = 8,
  
  	.max_register = S2MPS13_REG_LDODSCH5,
  	.volatile_reg = s2mps11_volatile,
  	.cache_type = REGCACHE_FLAT,
  };
dc6919663   Krzysztof Kozlowski   mfd: sec: Add sup...
200
201
202
203
204
205
206
207
  static const struct regmap_config s2mps14_regmap_config = {
  	.reg_bits = 8,
  	.val_bits = 8,
  
  	.max_register = S2MPS14_REG_LDODSCH3,
  	.volatile_reg = s2mps11_volatile,
  	.cache_type = REGCACHE_FLAT,
  };
00e2573d2   Chanwoo Choi   regulator: s2mps1...
208
209
210
211
212
213
214
215
  static const struct regmap_config s2mpu02_regmap_config = {
  	.reg_bits = 8,
  	.val_bits = 8,
  
  	.max_register = S2MPU02_REG_DVSDATA,
  	.volatile_reg = s2mpu02_volatile,
  	.cache_type = REGCACHE_FLAT,
  };
a30fffb06   Krzysztof Kozlowski   mfd: sec: Constif...
216
  static const struct regmap_config s5m8763_regmap_config = {
25f311fa5   Mark Brown   mfd: sec: Provide...
217
218
219
220
  	.reg_bits = 8,
  	.val_bits = 8,
  
  	.max_register = S5M8763_REG_LBCNFG2,
6b845ba93   Mark Brown   mfd: sec: Add reg...
221
222
  	.volatile_reg = s5m8763_volatile,
  	.cache_type = REGCACHE_FLAT,
25f311fa5   Mark Brown   mfd: sec: Provide...
223
  };
a30fffb06   Krzysztof Kozlowski   mfd: sec: Constif...
224
  static const struct regmap_config s5m8767_regmap_config = {
25f311fa5   Mark Brown   mfd: sec: Provide...
225
226
227
228
  	.reg_bits = 8,
  	.val_bits = 8,
  
  	.max_register = S5M8767_REG_LDO28CTRL,
6b845ba93   Mark Brown   mfd: sec: Add reg...
229
230
  	.volatile_reg = s2mps11_volatile,
  	.cache_type = REGCACHE_FLAT,
25f311fa5   Mark Brown   mfd: sec: Provide...
231
  };
26aec009f   Amit Daniel Kachhap   regulator: add de...
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
  
  #ifdef CONFIG_OF
  /*
   * Only the common platform data elements for s5m8767 are parsed here from the
   * device tree. Other sub-modules of s5m8767 such as pmic, rtc , charger and
   * others have to parse their own platform data elements from device tree.
   *
   * The s5m8767 platform data structure is instantiated here and the drivers for
   * the sub-modules need not instantiate another instance while parsing their
   * platform data.
   */
  static struct sec_platform_data *sec_pmic_i2c_parse_dt_pdata(
  					struct device *dev)
  {
  	struct sec_platform_data *pd;
  
  	pd = devm_kzalloc(dev, sizeof(*pd), GFP_KERNEL);
  	if (!pd) {
  		dev_err(dev, "could not allocate memory for pdata
  ");
  		return ERR_PTR(-ENOMEM);
  	}
  
  	/*
  	 * ToDo: the 'wakeup' member in the platform data is more of a linux
  	 * specfic information. Hence, there is no binding for that yet and
  	 * not parsed here.
  	 */
  
  	return pd;
  }
  #else
197bf8563   Mark Brown   regulator: s5m876...
264
  static struct sec_platform_data *sec_pmic_i2c_parse_dt_pdata(
26aec009f   Amit Daniel Kachhap   regulator: add de...
265
266
  					struct device *dev)
  {
005718c08   Wei Yongjun   mfd: sec-core: Fi...
267
  	return NULL;
26aec009f   Amit Daniel Kachhap   regulator: add de...
268
269
  }
  #endif
8f695de51   Pankaj Dubey   mfd: sec-core: Si...
270
  static inline unsigned long sec_i2c_get_driver_data(struct i2c_client *i2c,
26aec009f   Amit Daniel Kachhap   regulator: add de...
271
272
273
274
275
  						const struct i2c_device_id *id)
  {
  #ifdef CONFIG_OF
  	if (i2c->dev.of_node) {
  		const struct of_device_id *match;
b6c1cb4d9   Lee Jones   mfd: sec-core: Fi...
276

26aec009f   Amit Daniel Kachhap   regulator: add de...
277
  		match = of_match_node(sec_dt_match, i2c->dev.of_node);
8f695de51   Pankaj Dubey   mfd: sec-core: Si...
278
  		return (unsigned long)match->data;
26aec009f   Amit Daniel Kachhap   regulator: add de...
279
280
  	}
  #endif
8f695de51   Pankaj Dubey   mfd: sec-core: Si...
281
  	return id->driver_data;
26aec009f   Amit Daniel Kachhap   regulator: add de...
282
  }
63063bfbf   Sangbeom Kim   mfd: Modify samsu...
283
  static int sec_pmic_probe(struct i2c_client *i2c,
0f5f70783   Sangbeom Kim   mfd: Add S5M core...
284
285
  			    const struct i2c_device_id *id)
  {
334a41ce9   Jingoo Han   mfd: Use dev_get_...
286
  	struct sec_platform_data *pdata = dev_get_platdata(&i2c->dev);
e349c910e   Krzysztof Kozlowski   mfd/rtc: s5m: Do ...
287
  	const struct regmap_config *regmap;
54e8827d5   Chanwoo Choi   mfd: sec-core: Ad...
288
  	const struct mfd_cell *sec_devs;
63063bfbf   Sangbeom Kim   mfd: Modify samsu...
289
  	struct sec_pmic_dev *sec_pmic;
9549b5ff0   Krzysztof Kozlowski   mfd: sec-core: Re...
290
  	unsigned long device_type;
54e8827d5   Chanwoo Choi   mfd: sec-core: Ad...
291
  	int ret, num_sec_devs;
0f5f70783   Sangbeom Kim   mfd: Add S5M core...
292

63063bfbf   Sangbeom Kim   mfd: Modify samsu...
293
  	sec_pmic = devm_kzalloc(&i2c->dev, sizeof(struct sec_pmic_dev),
621210e25   Sangbeom Kim   mfd: Convert s5m ...
294
  				GFP_KERNEL);
63063bfbf   Sangbeom Kim   mfd: Modify samsu...
295
  	if (sec_pmic == NULL)
0f5f70783   Sangbeom Kim   mfd: Add S5M core...
296
  		return -ENOMEM;
63063bfbf   Sangbeom Kim   mfd: Modify samsu...
297
298
299
300
  	i2c_set_clientdata(i2c, sec_pmic);
  	sec_pmic->dev = &i2c->dev;
  	sec_pmic->i2c = i2c;
  	sec_pmic->irq = i2c->irq;
9549b5ff0   Krzysztof Kozlowski   mfd: sec-core: Re...
301
  	device_type = sec_i2c_get_driver_data(i2c, id);
26aec009f   Amit Daniel Kachhap   regulator: add de...
302
303
304
305
306
307
308
  
  	if (sec_pmic->dev->of_node) {
  		pdata = sec_pmic_i2c_parse_dt_pdata(sec_pmic->dev);
  		if (IS_ERR(pdata)) {
  			ret = PTR_ERR(pdata);
  			return ret;
  		}
9549b5ff0   Krzysztof Kozlowski   mfd: sec-core: Re...
309
  		pdata->device_type = device_type;
26aec009f   Amit Daniel Kachhap   regulator: add de...
310
  	}
0f5f70783   Sangbeom Kim   mfd: Add S5M core...
311
  	if (pdata) {
63063bfbf   Sangbeom Kim   mfd: Modify samsu...
312
313
314
315
  		sec_pmic->device_type = pdata->device_type;
  		sec_pmic->ono = pdata->ono;
  		sec_pmic->irq_base = pdata->irq_base;
  		sec_pmic->wakeup = pdata->wakeup;
26aec009f   Amit Daniel Kachhap   regulator: add de...
316
  		sec_pmic->pdata = pdata;
0f5f70783   Sangbeom Kim   mfd: Add S5M core...
317
  	}
25f311fa5   Mark Brown   mfd: sec: Provide...
318
  	switch (sec_pmic->device_type) {
ce24991e1   Sachin Kamat   mfd: Add support ...
319
320
321
  	case S2MPA01:
  		regmap = &s2mpa01_regmap_config;
  		break;
25f311fa5   Mark Brown   mfd: sec: Provide...
322
323
  	case S2MPS11X:
  		regmap = &s2mps11_regmap_config;
dc6919663   Krzysztof Kozlowski   mfd: sec: Add sup...
324
  		break;
76b9840b2   Chanwoo Choi   regulator: s2mps1...
325
326
327
  	case S2MPS13X:
  		regmap = &s2mps13_regmap_config;
  		break;
dc6919663   Krzysztof Kozlowski   mfd: sec: Add sup...
328
329
  	case S2MPS14X:
  		regmap = &s2mps14_regmap_config;
25f311fa5   Mark Brown   mfd: sec: Provide...
330
331
332
333
334
335
336
  		break;
  	case S5M8763X:
  		regmap = &s5m8763_regmap_config;
  		break;
  	case S5M8767X:
  		regmap = &s5m8767_regmap_config;
  		break;
00e2573d2   Chanwoo Choi   regulator: s2mps1...
337
338
339
  	case S2MPU02:
  		regmap = &s2mpu02_regmap_config;
  		break;
25f311fa5   Mark Brown   mfd: sec: Provide...
340
341
342
343
  	default:
  		regmap = &sec_regmap_config;
  		break;
  	}
3e1e4a5f3   Krzysztof Kozlowski   mfd/rtc: s5m: fix...
344
345
346
  	sec_pmic->regmap_pmic = devm_regmap_init_i2c(i2c, regmap);
  	if (IS_ERR(sec_pmic->regmap_pmic)) {
  		ret = PTR_ERR(sec_pmic->regmap_pmic);
0f5f70783   Sangbeom Kim   mfd: Add S5M core...
347
348
  		dev_err(&i2c->dev, "Failed to allocate register map: %d
  ",
61a2af301   Axel Lin   mfd: Return prope...
349
  			ret);
1092e1c76   Axel Lin   mfd: Convert s5m-...
350
  		return ret;
0f5f70783   Sangbeom Kim   mfd: Add S5M core...
351
  	}
c3ebb30aa   Jonghwan Choi   mfd: Fix possible...
352
  	if (pdata && pdata->cfg_pmic_irq)
0f5f70783   Sangbeom Kim   mfd: Add S5M core...
353
  		pdata->cfg_pmic_irq();
63063bfbf   Sangbeom Kim   mfd: Modify samsu...
354
  	sec_irq_init(sec_pmic);
0f5f70783   Sangbeom Kim   mfd: Add S5M core...
355

63063bfbf   Sangbeom Kim   mfd: Modify samsu...
356
  	pm_runtime_set_active(sec_pmic->dev);
0f5f70783   Sangbeom Kim   mfd: Add S5M core...
357

63063bfbf   Sangbeom Kim   mfd: Modify samsu...
358
  	switch (sec_pmic->device_type) {
88a1cfd6f   Sangbeom Kim   mfd: Add support ...
359
  	case S5M8751X:
54e8827d5   Chanwoo Choi   mfd: sec-core: Ad...
360
361
  		sec_devs = s5m8751_devs;
  		num_sec_devs = ARRAY_SIZE(s5m8751_devs);
88a1cfd6f   Sangbeom Kim   mfd: Add support ...
362
363
  		break;
  	case S5M8763X:
54e8827d5   Chanwoo Choi   mfd: sec-core: Ad...
364
365
  		sec_devs = s5m8763_devs;
  		num_sec_devs = ARRAY_SIZE(s5m8763_devs);
88a1cfd6f   Sangbeom Kim   mfd: Add support ...
366
367
  		break;
  	case S5M8767X:
54e8827d5   Chanwoo Choi   mfd: sec-core: Ad...
368
369
  		sec_devs = s5m8767_devs;
  		num_sec_devs = ARRAY_SIZE(s5m8767_devs);
88a1cfd6f   Sangbeom Kim   mfd: Add support ...
370
  		break;
ce24991e1   Sachin Kamat   mfd: Add support ...
371
  	case S2MPA01:
54e8827d5   Chanwoo Choi   mfd: sec-core: Ad...
372
373
  		sec_devs = s2mpa01_devs;
  		num_sec_devs = ARRAY_SIZE(s2mpa01_devs);
ce24991e1   Sachin Kamat   mfd: Add support ...
374
  		break;
9b6d13430   Sangbeom Kim   mfd: Add samsung ...
375
  	case S2MPS11X:
54e8827d5   Chanwoo Choi   mfd: sec-core: Ad...
376
377
  		sec_devs = s2mps11_devs;
  		num_sec_devs = ARRAY_SIZE(s2mps11_devs);
9b6d13430   Sangbeom Kim   mfd: Add samsung ...
378
  		break;
3bc2ee91a   Chanwoo Choi   mfd: sec-core: Ad...
379
380
381
382
  	case S2MPS13X:
  		sec_devs = s2mps13_devs;
  		num_sec_devs = ARRAY_SIZE(s2mps13_devs);
  		break;
dc6919663   Krzysztof Kozlowski   mfd: sec: Add sup...
383
  	case S2MPS14X:
54e8827d5   Chanwoo Choi   mfd: sec-core: Ad...
384
385
386
387
388
389
  		sec_devs = s2mps14_devs;
  		num_sec_devs = ARRAY_SIZE(s2mps14_devs);
  		break;
  	case S2MPU02:
  		sec_devs = s2mpu02_devs;
  		num_sec_devs = ARRAY_SIZE(s2mpu02_devs);
dc6919663   Krzysztof Kozlowski   mfd: sec: Add sup...
390
  		break;
88a1cfd6f   Sangbeom Kim   mfd: Add support ...
391
392
393
394
  	default:
  		/* If this happens the probe function is problem */
  		BUG();
  	}
54e8827d5   Chanwoo Choi   mfd: sec-core: Ad...
395
396
  	ret = mfd_add_devices(sec_pmic->dev, -1, sec_devs, num_sec_devs, NULL,
  			      0, NULL);
15447a46a   Leon Romanovsky   mfd: sec-core: Re...
397
  	if (ret)
8c66eeced   Krzysztof Kozlowski   mfd: sec-core: Fi...
398
  		goto err_mfd;
0f5f70783   Sangbeom Kim   mfd: Add S5M core...
399

f6d6daaf9   Krzysztof Kozlowski   mfd: sec: Add PM ...
400
  	device_init_wakeup(sec_pmic->dev, sec_pmic->wakeup);
0f5f70783   Sangbeom Kim   mfd: Add S5M core...
401
  	return ret;
8c66eeced   Krzysztof Kozlowski   mfd: sec-core: Fi...
402
  err_mfd:
63063bfbf   Sangbeom Kim   mfd: Modify samsu...
403
  	sec_irq_exit(sec_pmic);
0f5f70783   Sangbeom Kim   mfd: Add S5M core...
404
405
  	return ret;
  }
63063bfbf   Sangbeom Kim   mfd: Modify samsu...
406
  static int sec_pmic_remove(struct i2c_client *i2c)
0f5f70783   Sangbeom Kim   mfd: Add S5M core...
407
  {
63063bfbf   Sangbeom Kim   mfd: Modify samsu...
408
  	struct sec_pmic_dev *sec_pmic = i2c_get_clientdata(i2c);
0f5f70783   Sangbeom Kim   mfd: Add S5M core...
409

63063bfbf   Sangbeom Kim   mfd: Modify samsu...
410
411
  	mfd_remove_devices(sec_pmic->dev);
  	sec_irq_exit(sec_pmic);
0f5f70783   Sangbeom Kim   mfd: Add S5M core...
412
413
  	return 0;
  }
8321bbf89   Geert Uytterhoeven   mfd: sec-core: se...
414
  #ifdef CONFIG_PM_SLEEP
f6d6daaf9   Krzysztof Kozlowski   mfd: sec: Add PM ...
415
416
417
418
  static int sec_pmic_suspend(struct device *dev)
  {
  	struct i2c_client *i2c = container_of(dev, struct i2c_client, dev);
  	struct sec_pmic_dev *sec_pmic = i2c_get_clientdata(i2c);
360d15d6e   Krzysztof Kozlowski   mfd: sec-core: Fi...
419
  	if (device_may_wakeup(dev))
f6d6daaf9   Krzysztof Kozlowski   mfd: sec: Add PM ...
420
  		enable_irq_wake(sec_pmic->irq);
360d15d6e   Krzysztof Kozlowski   mfd: sec-core: Fi...
421
422
423
424
425
426
427
428
429
430
  	/*
  	 * PMIC IRQ must be disabled during suspend for RTC alarm
  	 * to work properly.
  	 * When device is woken up from suspend, an
  	 * interrupt occurs before resuming I2C bus controller.
  	 * The interrupt is handled by regmap_irq_thread which tries
  	 * to read RTC registers. This read fails (I2C is still
  	 * suspended) and RTC Alarm interrupt is disabled.
  	 */
  	disable_irq(sec_pmic->irq);
f6d6daaf9   Krzysztof Kozlowski   mfd: sec: Add PM ...
431
432
433
434
435
436
437
438
  
  	return 0;
  }
  
  static int sec_pmic_resume(struct device *dev)
  {
  	struct i2c_client *i2c = container_of(dev, struct i2c_client, dev);
  	struct sec_pmic_dev *sec_pmic = i2c_get_clientdata(i2c);
360d15d6e   Krzysztof Kozlowski   mfd: sec-core: Fi...
439
  	if (device_may_wakeup(dev))
f6d6daaf9   Krzysztof Kozlowski   mfd: sec: Add PM ...
440
  		disable_irq_wake(sec_pmic->irq);
360d15d6e   Krzysztof Kozlowski   mfd: sec-core: Fi...
441
  	enable_irq(sec_pmic->irq);
f6d6daaf9   Krzysztof Kozlowski   mfd: sec: Add PM ...
442
443
444
  
  	return 0;
  }
8321bbf89   Geert Uytterhoeven   mfd: sec-core: se...
445
  #endif /* CONFIG_PM_SLEEP */
f6d6daaf9   Krzysztof Kozlowski   mfd: sec: Add PM ...
446
447
  
  static SIMPLE_DEV_PM_OPS(sec_pmic_pm_ops, sec_pmic_suspend, sec_pmic_resume);
63063bfbf   Sangbeom Kim   mfd: Modify samsu...
448
449
  static const struct i2c_device_id sec_pmic_id[] = {
  	{ "sec_pmic", 0 },
0f5f70783   Sangbeom Kim   mfd: Add S5M core...
450
451
  	{ }
  };
63063bfbf   Sangbeom Kim   mfd: Modify samsu...
452
  MODULE_DEVICE_TABLE(i2c, sec_pmic_id);
0f5f70783   Sangbeom Kim   mfd: Add S5M core...
453

63063bfbf   Sangbeom Kim   mfd: Modify samsu...
454
  static struct i2c_driver sec_pmic_driver = {
0f5f70783   Sangbeom Kim   mfd: Add S5M core...
455
  	.driver = {
63063bfbf   Sangbeom Kim   mfd: Modify samsu...
456
  		   .name = "sec_pmic",
0f5f70783   Sangbeom Kim   mfd: Add S5M core...
457
  		   .owner = THIS_MODULE,
f6d6daaf9   Krzysztof Kozlowski   mfd: sec: Add PM ...
458
  		   .pm = &sec_pmic_pm_ops,
26aec009f   Amit Daniel Kachhap   regulator: add de...
459
  		   .of_match_table = of_match_ptr(sec_dt_match),
0f5f70783   Sangbeom Kim   mfd: Add S5M core...
460
  	},
63063bfbf   Sangbeom Kim   mfd: Modify samsu...
461
462
463
  	.probe = sec_pmic_probe,
  	.remove = sec_pmic_remove,
  	.id_table = sec_pmic_id,
0f5f70783   Sangbeom Kim   mfd: Add S5M core...
464
  };
63063bfbf   Sangbeom Kim   mfd: Modify samsu...
465
  static int __init sec_pmic_init(void)
0f5f70783   Sangbeom Kim   mfd: Add S5M core...
466
  {
63063bfbf   Sangbeom Kim   mfd: Modify samsu...
467
  	return i2c_add_driver(&sec_pmic_driver);
0f5f70783   Sangbeom Kim   mfd: Add S5M core...
468
  }
63063bfbf   Sangbeom Kim   mfd: Modify samsu...
469
  subsys_initcall(sec_pmic_init);
0f5f70783   Sangbeom Kim   mfd: Add S5M core...
470

63063bfbf   Sangbeom Kim   mfd: Modify samsu...
471
  static void __exit sec_pmic_exit(void)
0f5f70783   Sangbeom Kim   mfd: Add S5M core...
472
  {
63063bfbf   Sangbeom Kim   mfd: Modify samsu...
473
  	i2c_del_driver(&sec_pmic_driver);
0f5f70783   Sangbeom Kim   mfd: Add S5M core...
474
  }
63063bfbf   Sangbeom Kim   mfd: Modify samsu...
475
  module_exit(sec_pmic_exit);
0f5f70783   Sangbeom Kim   mfd: Add S5M core...
476
477
478
479
  
  MODULE_AUTHOR("Sangbeom Kim <sbkim73@samsung.com>");
  MODULE_DESCRIPTION("Core support for the S5M MFD");
  MODULE_LICENSE("GPL");