summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Osipenko <digetx@gmail.com>2019-05-05 11:43:23 -0400
committerLee Jones <lee.jones@linaro.org>2019-05-08 07:50:06 -0400
commit4c58f7012f15a71f05cd447f7658a61376d11591 (patch)
treee8ec333d787092af1ada85f2e6af3f1a3787319f
parentea611d1cc180fbb56982c83cd5142a2b34881f5c (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.c69
-rw-r--r--include/linux/mfd/max77620.h1
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
114static 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
114static const struct regmap_range max77620_readable_ranges[] = { 134static 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
194static const struct regmap_range max77663_readable_ranges[] = {
195 regmap_reg_range(MAX77620_REG_CNFGGLBL1, MAX77620_REG_CID5),
196};
197
198static 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
203static const struct regmap_range max77663_writable_ranges[] = {
204 regmap_reg_range(MAX77620_REG_CNFGGLBL1, MAX77620_REG_CID5),
205};
206
207static 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
212static 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
377skip_fps: 432skip_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:
603static const struct i2c_device_id max77620_id[] = { 669static 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 {
324enum max77620_chip_id { 324enum max77620_chip_id {
325 MAX77620, 325 MAX77620,
326 MAX20024, 326 MAX20024,
327 MAX77663,
327}; 328};
328 329
329struct max77620_chip { 330struct max77620_chip {