Add support for Maxim 77663 using the Max77620 driver. The hardware is very similar to Max77663/20024, although there are couple minor differences.
Unified · Split
| @@ -111,6 +111,26 @@ static const struct mfd_cell max20024_children[] = { · 110 unmodified lines | |||
| 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 = { · 54 unmodified lines | |||
| 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, · 63 unmodified lines | |||
| 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, · 28 unmodified lines | |||
| 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) · 95 unmodified lines | |||
| 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, · 72 unmodified lines | |||
| 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) · 87 unmodified lines | |||
| 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) · 29 unmodified lines | |||
| 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: · 15 unmodified lines | |||
| 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 | ||
| @@ -324,6 +324,7 @@ enum max77620_fps_src { · 323 unmodified lines | |||
| 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 { |