diff options
| author | Chanwoo Choi <cw00.choi@samsung.com> | 2014-06-25 03:14:44 -0400 |
|---|---|---|
| committer | Lee Jones <lee.jones@linaro.org> | 2014-07-09 09:58:11 -0400 |
| commit | 54e8827d5f0e66d152ef63e7958030ef4880cd85 (patch) | |
| tree | 6c8d1f67b3790c53cf00285334607ecc6a705a04 | |
| parent | 10f9edaeaa30468194e1dcd0e47e59b012f4cf8b (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.c | 46 | ||||
| -rw-r--r-- | drivers/mfd/sec-irq.c | 110 | ||||
| -rw-r--r-- | include/linux/mfd/samsung/core.h | 1 | ||||
| -rw-r--r-- | include/linux/mfd/samsung/irq.h | 24 | ||||
| -rw-r--r-- | include/linux/mfd/samsung/s2mpu02.h | 201 |
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 | ||
| 92 | static 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 |
| 93 | static const struct of_device_id sec_dt_match[] = { | 102 | static 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 | ||
| 165 | static 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 | |||
