diff options
author | Dmitry Osipenko <digetx@gmail.com> | 2019-05-05 11:43:23 -0400 |
---|---|---|
committer | Lee Jones <lee.jones@linaro.org> | 2019-05-08 07:50:06 -0400 |
commit | 4c58f7012f15a71f05cd447f7658a61376d11591 (patch) | |
tree | e8ec333d787092af1ada85f2e6af3f1a3787319f | |
parent | ea611d1cc180fbb56982c83cd5142a2b34881f5c (diff) |
mfd: max77620: Support Maxim 77663
Add support for Maxim 77663 using the Max77620 driver. The hardware
is very similar to Max77663/20024, although there are couple minor
differences.
Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
Signed-off-by: Lee Jones <lee.jones@linaro.org>
-rw-r--r-- | drivers/mfd/max77620.c | 69 | ||||
-rw-r--r-- | include/linux/mfd/max77620.h | 1 |
2 files changed, 69 insertions, 1 deletions
diff --git a/drivers/mfd/max77620.c b/drivers/mfd/max77620.c index d8ddd1a6f304..c2d88a5eca7a 100644 --- a/drivers/mfd/max77620.c +++ b/drivers/mfd/max77620.c | |||
@@ -111,6 +111,26 @@ static const struct mfd_cell max20024_children[] = { | |||
111 | }, | 111 | }, |
112 | }; | 112 | }; |
113 | 113 | ||
114 | static const struct mfd_cell max77663_children[] = { | ||
115 | { .name = "max77620-pinctrl", }, | ||
116 | { .name = "max77620-clock", }, | ||
117 | { .name = "max77663-pmic", }, | ||
118 | { .name = "max77620-watchdog", }, | ||
119 | { | ||
120 | .name = "max77620-gpio", | ||
121 | .resources = gpio_resources, | ||
122 | .num_resources = ARRAY_SIZE(gpio_resources), | ||
123 | }, { | ||
124 | .name = "max77620-rtc", | ||
125 | .resources = rtc_resources, | ||
126 | .num_resources = ARRAY_SIZE(rtc_resources), | ||
127 | }, { | ||
128 | .name = "max77663-power", | ||
129 | .resources = power_resources, | ||
130 | .num_resources = ARRAY_SIZE(power_resources), | ||
131 | }, | ||
132 | }; | ||
133 | |||
114 | static const struct regmap_range max77620_readable_ranges[] = { | 134 | static const struct regmap_range max77620_readable_ranges[] = { |
115 | regmap_reg_range(MAX77620_REG_CNFGGLBL1, MAX77620_REG_DVSSD4), | 135 | regmap_reg_range(MAX77620_REG_CNFGGLBL1, MAX77620_REG_DVSSD4), |
116 | }; | 136 | }; |
@@ -171,6 +191,35 @@ static const struct regmap_config max20024_regmap_config = { | |||
171 | .volatile_table = &max77620_volatile_table, | 191 | .volatile_table = &max77620_volatile_table, |
172 | }; | 192 | }; |
173 | 193 | ||
194 | static const struct regmap_range max77663_readable_ranges[] = { | ||
195 | regmap_reg_range(MAX77620_REG_CNFGGLBL1, MAX77620_REG_CID5), | ||
196 | }; | ||
197 | |||
198 | static const struct regmap_access_table max77663_readable_table = { | ||
199 | .yes_ranges = max77663_readable_ranges, | ||
200 | .n_yes_ranges = ARRAY_SIZE(max77663_readable_ranges), | ||
201 | }; | ||
202 | |||
203 | static const struct regmap_range max77663_writable_ranges[] = { | ||
204 | regmap_reg_range(MAX77620_REG_CNFGGLBL1, MAX77620_REG_CID5), | ||
205 | }; | ||
206 | |||
207 | static const struct regmap_access_table max77663_writable_table = { | ||
208 | .yes_ranges = max77663_writable_ranges, | ||
209 | .n_yes_ranges = ARRAY_SIZE(max77663_writable_ranges), | ||
210 | }; | ||
211 | |||
212 | static const struct regmap_config max77663_regmap_config = { | ||
213 | .name = "power-slave", | ||
214 | .reg_bits = 8, | ||
215 | .val_bits = 8, | ||
216 | .max_register = MAX77620_REG_CID5 + 1, | ||
217 | .cache_type = REGCACHE_RBTREE, | ||
218 | .rd_table = &max77663_readable_table, | ||
219 | .wr_table = &max77663_writable_table, | ||
220 | .volatile_table = &max77620_volatile_table, | ||
221 | }; | ||
222 | |||
174 | /* | 223 | /* |
175 | * MAX77620 and MAX20024 has the following steps of the interrupt handling | 224 | * MAX77620 and MAX20024 has the following steps of the interrupt handling |
176 | * for TOP interrupts: | 225 | * for TOP interrupts: |
@@ -240,6 +289,9 @@ static int max77620_get_fps_period_reg_value(struct max77620_chip *chip, | |||
240 | case MAX77620: | 289 | case MAX77620: |
241 | fps_min_period = MAX77620_FPS_PERIOD_MIN_US; | 290 | fps_min_period = MAX77620_FPS_PERIOD_MIN_US; |
242 | break; | 291 | break; |
292 | case MAX77663: | ||
293 | fps_min_period = MAX20024_FPS_PERIOD_MIN_US; | ||
294 | break; | ||
243 | default: | 295 | default: |
244 | return -EINVAL; | 296 | return -EINVAL; |
245 | } | 297 | } |
@@ -274,6 +326,9 @@ static int max77620_config_fps(struct max77620_chip *chip, | |||
274 | case MAX77620: | 326 | case MAX77620: |
275 | fps_max_period = MAX77620_FPS_PERIOD_MAX_US; | 327 | fps_max_period = MAX77620_FPS_PERIOD_MAX_US; |
276 | break; | 328 | break; |
329 | case MAX77663: | ||
330 | fps_max_period = MAX20024_FPS_PERIOD_MAX_US; | ||
331 | break; | ||
277 | default: | 332 | default: |
278 | return -EINVAL; | 333 | return -EINVAL; |
279 | } | 334 | } |
@@ -375,6 +430,9 @@ static int max77620_initialise_fps(struct max77620_chip *chip) | |||
375 | } | 430 | } |
376 | 431 | ||
377 | skip_fps: | 432 | skip_fps: |
433 | if (chip->chip_id == MAX77663) | ||
434 | return 0; | ||
435 | |||
378 | /* Enable wake on EN0 pin */ | 436 | /* Enable wake on EN0 pin */ |
379 | ret = regmap_update_bits(chip->rmap, MAX77620_REG_ONOFFCNFG2, | 437 | ret = regmap_update_bits(chip->rmap, MAX77620_REG_ONOFFCNFG2, |
380 | MAX77620_ONOFFCNFG2_WK_EN0, | 438 | MAX77620_ONOFFCNFG2_WK_EN0, |
@@ -453,6 +511,11 @@ static int max77620_probe(struct i2c_client *client, | |||
453 | n_mfd_cells = ARRAY_SIZE(max20024_children); | 511 | n_mfd_cells = ARRAY_SIZE(max20024_children); |
454 | rmap_config = &max20024_regmap_config; | 512 | rmap_config = &max20024_regmap_config; |
455 | break; | 513 | break; |
514 | case MAX77663: | ||
515 | mfd_cells = max77663_children; | ||
516 | n_mfd_cells = ARRAY_SIZE(max77663_children); | ||
517 | rmap_config = &max77663_regmap_config; | ||
518 | break; | ||
456 | default: | 519 | default: |
457 | dev_err(chip->dev, "ChipID is invalid %d\n", chip->chip_id); | 520 | dev_err(chip->dev, "ChipID is invalid %d\n", chip->chip_id); |
458 | return -EINVAL; | 521 | return -EINVAL; |
@@ -546,6 +609,9 @@ static int max77620_i2c_suspend(struct device *dev) | |||
546 | return ret; | 609 | return ret; |
547 | } | 610 | } |
548 | 611 | ||
612 | if (chip->chip_id == MAX77663) | ||
613 | goto out; | ||
614 | |||
549 | /* Disable WK_EN0 */ | 615 | /* Disable WK_EN0 */ |
550 | ret = regmap_update_bits(chip->rmap, MAX77620_REG_ONOFFCNFG2, | 616 | ret = regmap_update_bits(chip->rmap, MAX77620_REG_ONOFFCNFG2, |
551 | MAX77620_ONOFFCNFG2_WK_EN0, 0); | 617 | MAX77620_ONOFFCNFG2_WK_EN0, 0); |
@@ -581,7 +647,7 @@ static int max77620_i2c_resume(struct device *dev) | |||
581 | * For MAX20024: No need to configure WKEN0 on resume as | 647 | * For MAX20024: No need to configure WKEN0 on resume as |
582 | * it is configured on Init. | 648 | * it is configured on Init. |
583 | */ | 649 | */ |
584 | if (chip->chip_id == MAX20024) | 650 | if (chip->chip_id == MAX20024 || chip->chip_id == MAX77663) |
585 | goto out; | 651 | goto out; |
586 | 652 | ||
587 | /* Enable WK_EN0 */ | 653 | /* Enable WK_EN0 */ |
@@ -603,6 +669,7 @@ out: | |||
603 | static const struct i2c_device_id max77620_id[] = { | 669 | static const struct i2c_device_id max77620_id[] = { |
604 | {"max77620", MAX77620}, | 670 | {"max77620", MAX77620}, |
605 | {"max20024", MAX20024}, | 671 | {"max20024", MAX20024}, |
672 | {"max77663", MAX77663}, | ||
606 | {}, | 673 | {}, |
607 | }; | 674 | }; |
608 | 675 | ||
diff --git a/include/linux/mfd/max77620.h b/include/linux/mfd/max77620.h index b4fd5a7c2aaa..82407fe85ca2 100644 --- a/include/linux/mfd/max77620.h +++ b/include/linux/mfd/max77620.h | |||
@@ -324,6 +324,7 @@ enum max77620_fps_src { | |||
324 | enum max77620_chip_id { | 324 | enum max77620_chip_id { |
325 | MAX77620, | 325 | MAX77620, |
326 | MAX20024, | 326 | MAX20024, |
327 | MAX77663, | ||
327 | }; | 328 | }; |
328 | 329 | ||
329 | struct max77620_chip { | 330 | struct max77620_chip { |