Lines Matching +full:ldo10 +full:- +full:12
1 // SPDX-License-Identifier: GPL-2.0-only
25 #include <linux/power/charger-manager.h>
136 /* Hook-switch press or release */
141 {PM8607_IRQ_AUDIO_SHORT, PM8607_IRQ_AUDIO_SHORT, "audio-short",
170 .name = "88pm860x-backlight",
175 .name = "88pm860x-backlight",
180 .name = "88pm860x-backlight",
189 .name = "88pm860x-led",
194 .name = "88pm860x-led",
199 .name = "88pm860x-led",
204 .name = "88pm860x-led",
209 .name = "88pm860x-led",
214 .name = "88pm860x-led",
223 .name = "88pm860x-regulator",
228 .name = "88pm860x-regulator",
233 .name = "88pm860x-regulator",
238 .name = "88pm860x-regulator",
243 .name = "88pm860x-regulator",
248 .name = "88pm860x-regulator",
253 .name = "88pm860x-regulator",
258 .name = "88pm860x-regulator",
263 .name = "88pm860x-regulator",
268 .name = "88pm860x-regulator",
273 .name = "88pm860x-regulator",
278 .name = "88pm860x-regulator",
283 .name = "88pm860x-regulator",
284 .id = 12,
288 .name = "88pm860x-regulator",
293 .name = "88pm860x-regulator",
298 .name = "88pm860x-regulator",
306 {"88pm860x-touch", -1,},
310 {"88pm860x-onkey", -1,},
314 {"88pm860x-codec", -1,},
318 REGULATOR_SUPPLY("preg", "charger-manager"),
331 {"88pm860x-battery", -1,},
332 {"88pm860x-charger", -1,},
333 {"88pm860x-preg", -1,},
334 {"charger-manager", -1,},
338 {"88pm860x-rtc", -1,},
467 int read_reg = -1, value = 0; in pm860x_irq()
470 i2c = (chip->id == CHIP_PM8607) ? chip->client : chip->companion; in pm860x_irq()
473 if (read_reg != irq_data->reg) { in pm860x_irq()
474 read_reg = irq_data->reg; in pm860x_irq()
475 value = pm860x_reg_read(i2c, irq_data->reg); in pm860x_irq()
477 if (value & irq_data->enable) in pm860x_irq()
478 handle_nested_irq(chip->irq_base + i); in pm860x_irq()
487 mutex_lock(&chip->irq_lock); in pm860x_irq_lock()
499 i2c = (chip->id == CHIP_PM8607) ? chip->client : chip->companion; in pm860x_irq_sync_unlock()
505 switch (irq_data->mask_reg) { in pm860x_irq_sync_unlock()
507 mask[0] &= ~irq_data->offs; in pm860x_irq_sync_unlock()
508 mask[0] |= irq_data->enable; in pm860x_irq_sync_unlock()
511 mask[1] &= ~irq_data->offs; in pm860x_irq_sync_unlock()
512 mask[1] |= irq_data->enable; in pm860x_irq_sync_unlock()
515 mask[2] &= ~irq_data->offs; in pm860x_irq_sync_unlock()
516 mask[2] |= irq_data->enable; in pm860x_irq_sync_unlock()
519 dev_err(chip->dev, "wrong IRQ\n"); in pm860x_irq_sync_unlock()
531 mutex_unlock(&chip->irq_lock); in pm860x_irq_sync_unlock()
536 pm860x_irqs[data->hwirq].enable = pm860x_irqs[data->hwirq].offs; in pm860x_irq_enable()
541 pm860x_irqs[data->hwirq].enable = 0; in pm860x_irq_disable()
555 irq_set_chip_data(virq, d->host_data); in pm860x_irq_domain_map()
570 struct i2c_client *i2c = (chip->id == CHIP_PM8607) ? in device_irq_init()
571 chip->client : chip->companion; in device_irq_init()
574 int data, mask, ret = -EINVAL; in device_irq_init()
575 int nr_irqs, irq_base = -1; in device_irq_init()
576 struct device_node *node = i2c->dev.of_node; in device_irq_init()
581 chip->irq_mode = 0; in device_irq_init()
582 if (pdata && pdata->irq_mode) { in device_irq_init()
589 chip->irq_mode = 1; in device_irq_init()
602 if (chip->irq_mode) { in device_irq_init()
615 mutex_init(&chip->irq_lock); in device_irq_init()
617 if (pdata && pdata->irq_base) in device_irq_init()
618 irq_base = pdata->irq_base; in device_irq_init()
620 chip->irq_base = irq_alloc_descs(irq_base, 0, nr_irqs, 0); in device_irq_init()
621 if (chip->irq_base < 0) { in device_irq_init()
622 dev_err(&i2c->dev, "Failed to allocate interrupts, ret:%d\n", in device_irq_init()
623 chip->irq_base); in device_irq_init()
624 ret = -EBUSY; in device_irq_init()
627 irq_domain_add_legacy(node, nr_irqs, chip->irq_base, 0, in device_irq_init()
629 chip->core_irq = i2c->irq; in device_irq_init()
630 if (!chip->core_irq) in device_irq_init()
633 ret = request_threaded_irq(chip->core_irq, NULL, pm860x_irq, in device_irq_init()
636 dev_err(chip->dev, "Failed to request IRQ: %d\n", ret); in device_irq_init()
637 chip->core_irq = 0; in device_irq_init()
642 chip->core_irq = 0; in device_irq_init()
648 if (chip->core_irq) in device_irq_exit()
649 free_irq(chip->core_irq, chip); in device_irq_exit()
654 int ret = -EIO; in pm8606_osc_enable()
655 struct i2c_client *i2c = (chip->id == CHIP_PM8606) ? in pm8606_osc_enable()
656 chip->client : chip->companion; in pm8606_osc_enable()
658 dev_dbg(chip->dev, "%s(B): client=0x%x\n", __func__, client); in pm8606_osc_enable()
659 dev_dbg(chip->dev, "%s(B): vote=0x%x status=%d\n", in pm8606_osc_enable()
660 __func__, chip->osc_vote, in pm8606_osc_enable()
661 chip->osc_status); in pm8606_osc_enable()
663 mutex_lock(&chip->osc_lock); in pm8606_osc_enable()
665 chip->osc_vote |= client; in pm8606_osc_enable()
666 /* If reference group is off - turn on*/ in pm8606_osc_enable()
667 if (chip->osc_status != PM8606_REF_GP_OSC_ON) { in pm8606_osc_enable()
668 chip->osc_status = PM8606_REF_GP_OSC_UNKNOWN; in pm8606_osc_enable()
679 chip->osc_status = PM8606_REF_GP_OSC_ON; in pm8606_osc_enable()
681 mutex_unlock(&chip->osc_lock); in pm8606_osc_enable()
683 dev_dbg(chip->dev, "%s(A): vote=0x%x status=%d ret=%d\n", in pm8606_osc_enable()
684 __func__, chip->osc_vote, in pm8606_osc_enable()
685 chip->osc_status, ret); in pm8606_osc_enable()
688 mutex_unlock(&chip->osc_lock); in pm8606_osc_enable()
695 int ret = -EIO; in pm8606_osc_disable()
696 struct i2c_client *i2c = (chip->id == CHIP_PM8606) ? in pm8606_osc_disable()
697 chip->client : chip->companion; in pm8606_osc_disable()
699 dev_dbg(chip->dev, "%s(B): client=0x%x\n", __func__, client); in pm8606_osc_disable()
700 dev_dbg(chip->dev, "%s(B): vote=0x%x status=%d\n", in pm8606_osc_disable()
701 __func__, chip->osc_vote, in pm8606_osc_disable()
702 chip->osc_status); in pm8606_osc_disable()
704 mutex_lock(&chip->osc_lock); in pm8606_osc_disable()
706 chip->osc_vote &= ~(client); in pm8606_osc_disable()
709 * - turn off in pm8606_osc_disable()
711 if ((chip->osc_status != PM8606_REF_GP_OSC_OFF) && in pm8606_osc_disable()
712 (chip->osc_vote == REF_GP_NO_CLIENTS)) { in pm8606_osc_disable()
713 chip->osc_status = PM8606_REF_GP_OSC_UNKNOWN; in pm8606_osc_disable()
720 chip->osc_status = PM8606_REF_GP_OSC_OFF; in pm8606_osc_disable()
722 mutex_unlock(&chip->osc_lock); in pm8606_osc_disable()
724 dev_dbg(chip->dev, "%s(A): vote=0x%x status=%d ret=%d\n", in pm8606_osc_disable()
725 __func__, chip->osc_vote, in pm8606_osc_disable()
726 chip->osc_status, ret); in pm8606_osc_disable()
729 mutex_unlock(&chip->osc_lock); in pm8606_osc_disable()
738 mutex_init(&chip->osc_lock); in device_osc_init()
745 chip->osc_vote = REF_GP_NO_CLIENTS; in device_osc_init()
746 chip->osc_status = PM8606_REF_GP_OSC_OFF; in device_osc_init()
754 if (pdata && pdata->backlight) { in device_bk_init()
755 if (pdata->num_backlights > ARRAY_SIZE(bk_devs)) in device_bk_init()
756 pdata->num_backlights = ARRAY_SIZE(bk_devs); in device_bk_init()
757 for (i = 0; i < pdata->num_backlights; i++) { in device_bk_init()
758 bk_devs[i].platform_data = &pdata->backlight[i]; in device_bk_init()
763 ret = mfd_add_devices(chip->dev, 0, bk_devs, in device_bk_init()
766 dev_err(chip->dev, "Failed to add backlight subdev\n"); in device_bk_init()
774 if (pdata && pdata->led) { in device_led_init()
775 if (pdata->num_leds > ARRAY_SIZE(led_devs)) in device_led_init()
776 pdata->num_leds = ARRAY_SIZE(led_devs); in device_led_init()
777 for (i = 0; i < pdata->num_leds; i++) { in device_led_init()
778 led_devs[i].platform_data = &pdata->led[i]; in device_led_init()
783 ret = mfd_add_devices(chip->dev, 0, led_devs, in device_led_init()
786 dev_err(chip->dev, "Failed to add led subdev\n"); in device_led_init()
798 if (pdata->buck1) { in device_regulator_init()
799 reg_devs[0].platform_data = pdata->buck1; in device_regulator_init()
802 if (pdata->buck2) { in device_regulator_init()
803 reg_devs[1].platform_data = pdata->buck2; in device_regulator_init()
806 if (pdata->buck3) { in device_regulator_init()
807 reg_devs[2].platform_data = pdata->buck3; in device_regulator_init()
810 if (pdata->ldo1) { in device_regulator_init()
811 reg_devs[3].platform_data = pdata->ldo1; in device_regulator_init()
814 if (pdata->ldo2) { in device_regulator_init()
815 reg_devs[4].platform_data = pdata->ldo2; in device_regulator_init()
818 if (pdata->ldo3) { in device_regulator_init()
819 reg_devs[5].platform_data = pdata->ldo3; in device_regulator_init()
822 if (pdata->ldo4) { in device_regulator_init()
823 reg_devs[6].platform_data = pdata->ldo4; in device_regulator_init()
826 if (pdata->ldo5) { in device_regulator_init()
827 reg_devs[7].platform_data = pdata->ldo5; in device_regulator_init()
830 if (pdata->ldo6) { in device_regulator_init()
831 reg_devs[8].platform_data = pdata->ldo6; in device_regulator_init()
834 if (pdata->ldo7) { in device_regulator_init()
835 reg_devs[9].platform_data = pdata->ldo7; in device_regulator_init()
838 if (pdata->ldo8) { in device_regulator_init()
839 reg_devs[10].platform_data = pdata->ldo8; in device_regulator_init()
842 if (pdata->ldo9) { in device_regulator_init()
843 reg_devs[11].platform_data = pdata->ldo9; in device_regulator_init()
846 if (pdata->ldo10) { in device_regulator_init()
847 reg_devs[12].platform_data = pdata->ldo10; in device_regulator_init()
848 reg_devs[12].pdata_size = sizeof(struct regulator_init_data); in device_regulator_init()
850 if (pdata->ldo12) { in device_regulator_init()
851 reg_devs[13].platform_data = pdata->ldo12; in device_regulator_init()
854 if (pdata->ldo_vibrator) { in device_regulator_init()
855 reg_devs[14].platform_data = pdata->ldo_vibrator; in device_regulator_init()
858 if (pdata->ldo14) { in device_regulator_init()
859 reg_devs[15].platform_data = pdata->ldo14; in device_regulator_init()
862 ret = mfd_add_devices(chip->dev, 0, reg_devs, in device_regulator_init()
865 dev_err(chip->dev, "Failed to add regulator subdev\n"); in device_regulator_init()
878 rtc_devs[0].platform_data = pdata->rtc; in device_rtc_init()
882 ret = mfd_add_devices(chip->dev, 0, &rtc_devs[0], in device_rtc_init()
884 chip->irq_base, NULL); in device_rtc_init()
886 dev_err(chip->dev, "Failed to add rtc subdev\n"); in device_rtc_init()
897 touch_devs[0].platform_data = pdata->touch; in device_touch_init()
901 ret = mfd_add_devices(chip->dev, 0, &touch_devs[0], in device_touch_init()
903 chip->irq_base, NULL); in device_touch_init()
905 dev_err(chip->dev, "Failed to add touch subdev\n"); in device_touch_init()
916 power_devs[0].platform_data = pdata->power; in device_power_init()
920 ret = mfd_add_devices(chip->dev, 0, &power_devs[0], 1, in device_power_init()
921 &battery_resources[0], chip->irq_base, NULL); in device_power_init()
923 dev_err(chip->dev, "Failed to add battery subdev\n"); in device_power_init()
925 power_devs[1].platform_data = pdata->power; in device_power_init()
929 ret = mfd_add_devices(chip->dev, 0, &power_devs[1], 1, in device_power_init()
930 &charger_resources[0], chip->irq_base, NULL); in device_power_init()
932 dev_err(chip->dev, "Failed to add charger subdev\n"); in device_power_init()
936 ret = mfd_add_devices(chip->dev, 0, &power_devs[2], 1, in device_power_init()
937 NULL, chip->irq_base, NULL); in device_power_init()
939 dev_err(chip->dev, "Failed to add preg subdev\n"); in device_power_init()
941 if (pdata->chg_desc) { in device_power_init()
942 pdata->chg_desc->charger_regulators = in device_power_init()
944 pdata->chg_desc->num_charger_regulators = in device_power_init()
946 power_devs[3].platform_data = pdata->chg_desc; in device_power_init()
947 power_devs[3].pdata_size = sizeof(*pdata->chg_desc); in device_power_init()
948 ret = mfd_add_devices(chip->dev, 0, &power_devs[3], 1, in device_power_init()
949 NULL, chip->irq_base, NULL); in device_power_init()
951 dev_err(chip->dev, "Failed to add chg-manager subdev\n"); in device_power_init()
962 ret = mfd_add_devices(chip->dev, 0, &onkey_devs[0], in device_onkey_init()
964 chip->irq_base, NULL); in device_onkey_init()
966 dev_err(chip->dev, "Failed to add onkey subdev\n"); in device_onkey_init()
976 ret = mfd_add_devices(chip->dev, 0, &codec_devs[0], in device_codec_init()
980 dev_err(chip->dev, "Failed to add codec subdev\n"); in device_codec_init()
991 dev_err(chip->dev, "Failed to read CHIP ID: %d\n", ret); in device_8607_init()
997 dev_info(chip->dev, "Marvell 88PM8607 (ID: %02x) detected\n", in device_8607_init()
1001 dev_err(chip->dev, in device_8607_init()
1009 dev_err(chip->dev, "Failed to read BUCK3 register: %d\n", ret); in device_8607_init()
1013 chip->buck3_double = 1; in device_8607_init()
1017 dev_err(chip->dev, "Failed to read MISC1 register: %d\n", ret); in device_8607_init()
1021 if (pdata && (pdata->i2c_port == PI2C_PORT)) in device_8607_init()
1027 dev_err(chip->dev, "Failed to access MISC1:%d\n", ret); in device_8607_init()
1057 chip->core_irq = 0; in pm860x_device_init()
1059 switch (chip->id) { in pm860x_device_init()
1061 device_8606_init(chip, chip->client, pdata); in pm860x_device_init()
1064 device_8607_init(chip, chip->client, pdata); in pm860x_device_init()
1068 if (chip->companion) { in pm860x_device_init()
1069 switch (chip->id) { in pm860x_device_init()
1071 device_8606_init(chip, chip->companion, pdata); in pm860x_device_init()
1074 device_8607_init(chip, chip->companion, pdata); in pm860x_device_init()
1085 mfd_remove_devices(chip->dev); in pm860x_device_exit()
1098 if (i2c->addr == *(addr_8606 + i)) in verify_addr()
1103 if (i2c->addr == *(addr_8607 + i)) in verify_addr()
1120 pdata->irq_mode = of_property_read_bool(np, "marvell,88pm860x-irq-read-clr"); in pm860x_dt_init()
1121 ret = of_property_read_u32(np, "marvell,88pm860x-slave-addr", in pm860x_dt_init()
1122 &pdata->companion_addr); in pm860x_dt_init()
1125 "Not found \"marvell,88pm860x-slave-addr\" property\n"); in pm860x_dt_init()
1126 pdata->companion_addr = 0; in pm860x_dt_init()
1133 struct pm860x_platform_data *pdata = dev_get_platdata(&client->dev); in pm860x_probe()
1134 struct device_node *node = client->dev.of_node; in pm860x_probe()
1140 pdata = devm_kzalloc(&client->dev, in pm860x_probe()
1144 return -ENOMEM; in pm860x_probe()
1145 ret = pm860x_dt_init(node, &client->dev, pdata); in pm860x_probe()
1150 return -EINVAL; in pm860x_probe()
1153 chip = devm_kzalloc(&client->dev, in pm860x_probe()
1156 return -ENOMEM; in pm860x_probe()
1158 chip->id = verify_addr(client); in pm860x_probe()
1159 chip->regmap = devm_regmap_init_i2c(client, &pm860x_regmap_config); in pm860x_probe()
1160 if (IS_ERR(chip->regmap)) { in pm860x_probe()
1161 ret = PTR_ERR(chip->regmap); in pm860x_probe()
1162 dev_err(&client->dev, "Failed to allocate register map: %d\n", in pm860x_probe()
1166 chip->client = client; in pm860x_probe()
1168 chip->dev = &client->dev; in pm860x_probe()
1172 * Driver distinguishes them by pdata->companion_addr. in pm860x_probe()
1173 * pdata->companion_addr is only assigned if companion chip exists. in pm860x_probe()
1177 if (pdata->companion_addr && (pdata->companion_addr != client->addr)) { in pm860x_probe()
1178 chip->companion_addr = pdata->companion_addr; in pm860x_probe()
1179 chip->companion = i2c_new_dummy_device(chip->client->adapter, in pm860x_probe()
1180 chip->companion_addr); in pm860x_probe()
1181 if (IS_ERR(chip->companion)) { in pm860x_probe()
1182 dev_err(&client->dev, in pm860x_probe()
1184 return PTR_ERR(chip->companion); in pm860x_probe()
1186 chip->regmap_companion = regmap_init_i2c(chip->companion, in pm860x_probe()
1188 if (IS_ERR(chip->regmap_companion)) { in pm860x_probe()
1189 ret = PTR_ERR(chip->regmap_companion); in pm860x_probe()
1190 dev_err(&chip->companion->dev, in pm860x_probe()
1192 i2c_unregister_device(chip->companion); in pm860x_probe()
1195 i2c_set_clientdata(chip->companion, chip); in pm860x_probe()
1207 if (chip->companion) { in pm860x_remove()
1208 regmap_exit(chip->regmap_companion); in pm860x_remove()
1209 i2c_unregister_device(chip->companion); in pm860x_remove()
1218 if (device_may_wakeup(dev) && chip->wakeup_flag) in pm860x_suspend()
1219 enable_irq_wake(chip->core_irq); in pm860x_suspend()
1228 if (device_may_wakeup(dev) && chip->wakeup_flag) in pm860x_resume()
1229 disable_irq_wake(chip->core_irq); in pm860x_resume()