Lines Matching +full:chip +full:- +full:id
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",
171 .id = 0,
175 .name = "88pm860x-backlight",
176 .id = 1,
180 .name = "88pm860x-backlight",
181 .id = 2,
189 .name = "88pm860x-led",
190 .id = 0,
194 .name = "88pm860x-led",
195 .id = 1,
199 .name = "88pm860x-led",
200 .id = 2,
204 .name = "88pm860x-led",
205 .id = 3,
209 .name = "88pm860x-led",
210 .id = 4,
214 .name = "88pm860x-led",
215 .id = 5,
223 .name = "88pm860x-regulator",
224 .id = 0,
228 .name = "88pm860x-regulator",
229 .id = 1,
233 .name = "88pm860x-regulator",
234 .id = 2,
238 .name = "88pm860x-regulator",
239 .id = 3,
243 .name = "88pm860x-regulator",
244 .id = 4,
248 .name = "88pm860x-regulator",
249 .id = 5,
253 .name = "88pm860x-regulator",
254 .id = 6,
258 .name = "88pm860x-regulator",
259 .id = 7,
263 .name = "88pm860x-regulator",
264 .id = 8,
268 .name = "88pm860x-regulator",
269 .id = 9,
273 .name = "88pm860x-regulator",
274 .id = 10,
278 .name = "88pm860x-regulator",
279 .id = 11,
283 .name = "88pm860x-regulator",
284 .id = 12,
288 .name = "88pm860x-regulator",
289 .id = 13,
293 .name = "88pm860x-regulator",
294 .id = 14,
298 .name = "88pm860x-regulator",
299 .id = 15,
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,},
464 struct pm860x_chip *chip = data; in pm860x_irq() local
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()
485 struct pm860x_chip *chip = irq_data_get_irq_chip_data(data); in pm860x_irq_lock() local
487 mutex_lock(&chip->irq_lock); in pm860x_irq_lock()
492 struct pm860x_chip *chip = irq_data_get_irq_chip_data(data); in pm860x_irq_sync_unlock() local
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()
567 static int device_irq_init(struct pm860x_chip *chip, in device_irq_init() argument
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()
580 chip->irq_mode = 0; in device_irq_init()
581 if (pdata && pdata->irq_mode) { in device_irq_init()
588 chip->irq_mode = 1; in device_irq_init()
601 if (chip->irq_mode) { in device_irq_init()
614 mutex_init(&chip->irq_lock); in device_irq_init()
616 if (pdata && pdata->irq_base) in device_irq_init()
617 irq_base = pdata->irq_base; in device_irq_init()
619 chip->irq_base = irq_alloc_descs(irq_base, 0, nr_irqs, 0); in device_irq_init()
620 if (chip->irq_base < 0) { in device_irq_init()
621 dev_err(&i2c->dev, "Failed to allocate interrupts, ret:%d\n", in device_irq_init()
622 chip->irq_base); in device_irq_init()
623 ret = -EBUSY; in device_irq_init()
626 irq_domain_create_legacy(dev_fwnode(&i2c->dev), nr_irqs, chip->irq_base, 0, in device_irq_init()
627 &pm860x_irq_domain_ops, chip); in device_irq_init()
628 chip->core_irq = i2c->irq; in device_irq_init()
629 if (!chip->core_irq) in device_irq_init()
632 ret = request_threaded_irq(chip->core_irq, NULL, pm860x_irq, in device_irq_init()
633 flags | IRQF_ONESHOT, "88pm860x", chip); in device_irq_init()
635 dev_err(chip->dev, "Failed to request IRQ: %d\n", ret); in device_irq_init()
636 chip->core_irq = 0; in device_irq_init()
641 chip->core_irq = 0; in device_irq_init()
645 static void device_irq_exit(struct pm860x_chip *chip) in device_irq_exit() argument
647 if (chip->core_irq) in device_irq_exit()
648 free_irq(chip->core_irq, chip); in device_irq_exit()
651 int pm8606_osc_enable(struct pm860x_chip *chip, unsigned short client) in pm8606_osc_enable() argument
653 int ret = -EIO; in pm8606_osc_enable()
654 struct i2c_client *i2c = (chip->id == CHIP_PM8606) ? in pm8606_osc_enable()
655 chip->client : chip->companion; in pm8606_osc_enable()
657 dev_dbg(chip->dev, "%s(B): client=0x%x\n", __func__, client); in pm8606_osc_enable()
658 dev_dbg(chip->dev, "%s(B): vote=0x%x status=%d\n", in pm8606_osc_enable()
659 __func__, chip->osc_vote, in pm8606_osc_enable()
660 chip->osc_status); in pm8606_osc_enable()
662 mutex_lock(&chip->osc_lock); in pm8606_osc_enable()
664 chip->osc_vote |= client; in pm8606_osc_enable()
665 /* If reference group is off - turn on*/ in pm8606_osc_enable()
666 if (chip->osc_status != PM8606_REF_GP_OSC_ON) { in pm8606_osc_enable()
667 chip->osc_status = PM8606_REF_GP_OSC_UNKNOWN; in pm8606_osc_enable()
678 chip->osc_status = PM8606_REF_GP_OSC_ON; in pm8606_osc_enable()
680 mutex_unlock(&chip->osc_lock); in pm8606_osc_enable()
682 dev_dbg(chip->dev, "%s(A): vote=0x%x status=%d ret=%d\n", in pm8606_osc_enable()
683 __func__, chip->osc_vote, in pm8606_osc_enable()
684 chip->osc_status, ret); in pm8606_osc_enable()
687 mutex_unlock(&chip->osc_lock); in pm8606_osc_enable()
692 int pm8606_osc_disable(struct pm860x_chip *chip, unsigned short client) in pm8606_osc_disable() argument
694 int ret = -EIO; in pm8606_osc_disable()
695 struct i2c_client *i2c = (chip->id == CHIP_PM8606) ? in pm8606_osc_disable()
696 chip->client : chip->companion; in pm8606_osc_disable()
698 dev_dbg(chip->dev, "%s(B): client=0x%x\n", __func__, client); in pm8606_osc_disable()
699 dev_dbg(chip->dev, "%s(B): vote=0x%x status=%d\n", in pm8606_osc_disable()
700 __func__, chip->osc_vote, in pm8606_osc_disable()
701 chip->osc_status); in pm8606_osc_disable()
703 mutex_lock(&chip->osc_lock); in pm8606_osc_disable()
705 chip->osc_vote &= ~(client); in pm8606_osc_disable()
708 * - turn off in pm8606_osc_disable()
710 if ((chip->osc_status != PM8606_REF_GP_OSC_OFF) && in pm8606_osc_disable()
711 (chip->osc_vote == REF_GP_NO_CLIENTS)) { in pm8606_osc_disable()
712 chip->osc_status = PM8606_REF_GP_OSC_UNKNOWN; in pm8606_osc_disable()
719 chip->osc_status = PM8606_REF_GP_OSC_OFF; in pm8606_osc_disable()
721 mutex_unlock(&chip->osc_lock); in pm8606_osc_disable()
723 dev_dbg(chip->dev, "%s(A): vote=0x%x status=%d ret=%d\n", in pm8606_osc_disable()
724 __func__, chip->osc_vote, in pm8606_osc_disable()
725 chip->osc_status, ret); in pm8606_osc_disable()
728 mutex_unlock(&chip->osc_lock); in pm8606_osc_disable()
735 struct pm860x_chip *chip = i2c_get_clientdata(i2c); in device_osc_init() local
737 mutex_init(&chip->osc_lock); in device_osc_init()
744 chip->osc_vote = REF_GP_NO_CLIENTS; in device_osc_init()
745 chip->osc_status = PM8606_REF_GP_OSC_OFF; in device_osc_init()
748 static void device_bk_init(struct pm860x_chip *chip, in device_bk_init() argument
753 if (pdata && pdata->backlight) { in device_bk_init()
754 if (pdata->num_backlights > ARRAY_SIZE(bk_devs)) in device_bk_init()
755 pdata->num_backlights = ARRAY_SIZE(bk_devs); in device_bk_init()
756 for (i = 0; i < pdata->num_backlights; i++) { in device_bk_init()
757 bk_devs[i].platform_data = &pdata->backlight[i]; in device_bk_init()
762 ret = mfd_add_devices(chip->dev, 0, bk_devs, in device_bk_init()
765 dev_err(chip->dev, "Failed to add backlight subdev\n"); in device_bk_init()
768 static void device_led_init(struct pm860x_chip *chip, in device_led_init() argument
773 if (pdata && pdata->led) { in device_led_init()
774 if (pdata->num_leds > ARRAY_SIZE(led_devs)) in device_led_init()
775 pdata->num_leds = ARRAY_SIZE(led_devs); in device_led_init()
776 for (i = 0; i < pdata->num_leds; i++) { in device_led_init()
777 led_devs[i].platform_data = &pdata->led[i]; in device_led_init()
782 ret = mfd_add_devices(chip->dev, 0, led_devs, in device_led_init()
785 dev_err(chip->dev, "Failed to add led subdev\n"); in device_led_init()
790 static void device_regulator_init(struct pm860x_chip *chip, in device_regulator_init() argument
797 if (pdata->buck1) { in device_regulator_init()
798 reg_devs[0].platform_data = pdata->buck1; in device_regulator_init()
801 if (pdata->buck2) { in device_regulator_init()
802 reg_devs[1].platform_data = pdata->buck2; in device_regulator_init()
805 if (pdata->buck3) { in device_regulator_init()
806 reg_devs[2].platform_data = pdata->buck3; in device_regulator_init()
809 if (pdata->ldo1) { in device_regulator_init()
810 reg_devs[3].platform_data = pdata->ldo1; in device_regulator_init()
813 if (pdata->ldo2) { in device_regulator_init()
814 reg_devs[4].platform_data = pdata->ldo2; in device_regulator_init()
817 if (pdata->ldo3) { in device_regulator_init()
818 reg_devs[5].platform_data = pdata->ldo3; in device_regulator_init()
821 if (pdata->ldo4) { in device_regulator_init()
822 reg_devs[6].platform_data = pdata->ldo4; in device_regulator_init()
825 if (pdata->ldo5) { in device_regulator_init()
826 reg_devs[7].platform_data = pdata->ldo5; in device_regulator_init()
829 if (pdata->ldo6) { in device_regulator_init()
830 reg_devs[8].platform_data = pdata->ldo6; in device_regulator_init()
833 if (pdata->ldo7) { in device_regulator_init()
834 reg_devs[9].platform_data = pdata->ldo7; in device_regulator_init()
837 if (pdata->ldo8) { in device_regulator_init()
838 reg_devs[10].platform_data = pdata->ldo8; in device_regulator_init()
841 if (pdata->ldo9) { in device_regulator_init()
842 reg_devs[11].platform_data = pdata->ldo9; in device_regulator_init()
845 if (pdata->ldo10) { in device_regulator_init()
846 reg_devs[12].platform_data = pdata->ldo10; in device_regulator_init()
849 if (pdata->ldo12) { in device_regulator_init()
850 reg_devs[13].platform_data = pdata->ldo12; in device_regulator_init()
853 if (pdata->ldo_vibrator) { in device_regulator_init()
854 reg_devs[14].platform_data = pdata->ldo_vibrator; in device_regulator_init()
857 if (pdata->ldo14) { in device_regulator_init()
858 reg_devs[15].platform_data = pdata->ldo14; in device_regulator_init()
861 ret = mfd_add_devices(chip->dev, 0, reg_devs, in device_regulator_init()
864 dev_err(chip->dev, "Failed to add regulator subdev\n"); in device_regulator_init()
869 static void device_rtc_init(struct pm860x_chip *chip, in device_rtc_init() argument
877 rtc_devs[0].platform_data = pdata->rtc; in device_rtc_init()
881 ret = mfd_add_devices(chip->dev, 0, &rtc_devs[0], in device_rtc_init()
883 chip->irq_base, NULL); in device_rtc_init()
885 dev_err(chip->dev, "Failed to add rtc subdev\n"); in device_rtc_init()
888 static void device_touch_init(struct pm860x_chip *chip, in device_touch_init() argument
896 touch_devs[0].platform_data = pdata->touch; in device_touch_init()
900 ret = mfd_add_devices(chip->dev, 0, &touch_devs[0], in device_touch_init()
902 chip->irq_base, NULL); in device_touch_init()
904 dev_err(chip->dev, "Failed to add touch subdev\n"); in device_touch_init()
907 static void device_power_init(struct pm860x_chip *chip, in device_power_init() argument
915 power_devs[0].platform_data = pdata->power; in device_power_init()
919 ret = mfd_add_devices(chip->dev, 0, &power_devs[0], 1, in device_power_init()
920 &battery_resources[0], chip->irq_base, NULL); in device_power_init()
922 dev_err(chip->dev, "Failed to add battery subdev\n"); in device_power_init()
924 power_devs[1].platform_data = pdata->power; in device_power_init()
928 ret = mfd_add_devices(chip->dev, 0, &power_devs[1], 1, in device_power_init()
929 &charger_resources[0], chip->irq_base, NULL); in device_power_init()
931 dev_err(chip->dev, "Failed to add charger subdev\n"); in device_power_init()
935 ret = mfd_add_devices(chip->dev, 0, &power_devs[2], 1, in device_power_init()
936 NULL, chip->irq_base, NULL); in device_power_init()
938 dev_err(chip->dev, "Failed to add preg subdev\n"); in device_power_init()
940 if (pdata->chg_desc) { in device_power_init()
941 pdata->chg_desc->charger_regulators = in device_power_init()
943 pdata->chg_desc->num_charger_regulators = in device_power_init()
945 power_devs[3].platform_data = pdata->chg_desc; in device_power_init()
946 power_devs[3].pdata_size = sizeof(*pdata->chg_desc); in device_power_init()
947 ret = mfd_add_devices(chip->dev, 0, &power_devs[3], 1, in device_power_init()
948 NULL, chip->irq_base, NULL); in device_power_init()
950 dev_err(chip->dev, "Failed to add chg-manager subdev\n"); in device_power_init()
954 static void device_onkey_init(struct pm860x_chip *chip, in device_onkey_init() argument
961 ret = mfd_add_devices(chip->dev, 0, &onkey_devs[0], in device_onkey_init()
963 chip->irq_base, NULL); in device_onkey_init()
965 dev_err(chip->dev, "Failed to add onkey subdev\n"); in device_onkey_init()
968 static void device_codec_init(struct pm860x_chip *chip, in device_codec_init() argument
975 ret = mfd_add_devices(chip->dev, 0, &codec_devs[0], in device_codec_init()
979 dev_err(chip->dev, "Failed to add codec subdev\n"); in device_codec_init()
982 static void device_8607_init(struct pm860x_chip *chip, in device_8607_init() argument
990 dev_err(chip->dev, "Failed to read CHIP ID: %d\n", ret); in device_8607_init()
996 dev_info(chip->dev, "Marvell 88PM8607 (ID: %02x) detected\n", in device_8607_init()
1000 dev_err(chip->dev, in device_8607_init()
1001 "Failed to detect Marvell 88PM8607. Chip ID: %02x\n", in device_8607_init()
1008 dev_err(chip->dev, "Failed to read BUCK3 register: %d\n", ret); in device_8607_init()
1012 chip->buck3_double = 1; in device_8607_init()
1016 dev_err(chip->dev, "Failed to read MISC1 register: %d\n", ret); in device_8607_init()
1020 if (pdata && (pdata->i2c_port == PI2C_PORT)) in device_8607_init()
1026 dev_err(chip->dev, "Failed to access MISC1:%d\n", ret); in device_8607_init()
1030 ret = device_irq_init(chip, pdata); in device_8607_init()
1034 device_regulator_init(chip, pdata); in device_8607_init()
1035 device_rtc_init(chip, pdata); in device_8607_init()
1036 device_onkey_init(chip, pdata); in device_8607_init()
1037 device_touch_init(chip, pdata); in device_8607_init()
1038 device_power_init(chip, pdata); in device_8607_init()
1039 device_codec_init(chip, pdata); in device_8607_init()
1044 static void device_8606_init(struct pm860x_chip *chip, in device_8606_init() argument
1049 device_bk_init(chip, pdata); in device_8606_init()
1050 device_led_init(chip, pdata); in device_8606_init()
1053 static int pm860x_device_init(struct pm860x_chip *chip, in pm860x_device_init() argument
1056 chip->core_irq = 0; in pm860x_device_init()
1058 switch (chip->id) { in pm860x_device_init()
1060 device_8606_init(chip, chip->client, pdata); in pm860x_device_init()
1063 device_8607_init(chip, chip->client, pdata); in pm860x_device_init()
1067 if (chip->companion) { in pm860x_device_init()
1068 switch (chip->id) { in pm860x_device_init()
1070 device_8606_init(chip, chip->companion, pdata); in pm860x_device_init()
1073 device_8607_init(chip, chip->companion, pdata); in pm860x_device_init()
1081 static void pm860x_device_exit(struct pm860x_chip *chip) in pm860x_device_exit() argument
1083 device_irq_exit(chip); in pm860x_device_exit()
1084 mfd_remove_devices(chip->dev); in pm860x_device_exit()
1097 if (i2c->addr == *(addr_8606 + i)) in verify_addr()
1102 if (i2c->addr == *(addr_8607 + i)) in verify_addr()
1119 pdata->irq_mode = of_property_read_bool(np, "marvell,88pm860x-irq-read-clr"); in pm860x_dt_init()
1120 ret = of_property_read_u32(np, "marvell,88pm860x-slave-addr", in pm860x_dt_init()
1121 &pdata->companion_addr); in pm860x_dt_init()
1124 "Not found \"marvell,88pm860x-slave-addr\" property\n"); in pm860x_dt_init()
1125 pdata->companion_addr = 0; in pm860x_dt_init()
1132 struct pm860x_platform_data *pdata = dev_get_platdata(&client->dev); in pm860x_probe()
1133 struct device_node *node = client->dev.of_node; in pm860x_probe()
1134 struct pm860x_chip *chip; in pm860x_probe() local
1139 pdata = devm_kzalloc(&client->dev, in pm860x_probe()
1143 return -ENOMEM; in pm860x_probe()
1144 ret = pm860x_dt_init(node, &client->dev, pdata); in pm860x_probe()
1149 return -EINVAL; in pm860x_probe()
1152 chip = devm_kzalloc(&client->dev, in pm860x_probe()
1154 if (chip == NULL) in pm860x_probe()
1155 return -ENOMEM; in pm860x_probe()
1157 chip->id = verify_addr(client); in pm860x_probe()
1158 chip->regmap = devm_regmap_init_i2c(client, &pm860x_regmap_config); in pm860x_probe()
1159 if (IS_ERR(chip->regmap)) { in pm860x_probe()
1160 ret = PTR_ERR(chip->regmap); in pm860x_probe()
1161 dev_err(&client->dev, "Failed to allocate register map: %d\n", in pm860x_probe()
1165 chip->client = client; in pm860x_probe()
1166 i2c_set_clientdata(client, chip); in pm860x_probe()
1167 chip->dev = &client->dev; in pm860x_probe()
1171 * Driver distinguishes them by pdata->companion_addr. in pm860x_probe()
1172 * pdata->companion_addr is only assigned if companion chip exists. in pm860x_probe()
1176 if (pdata->companion_addr && (pdata->companion_addr != client->addr)) { in pm860x_probe()
1177 chip->companion_addr = pdata->companion_addr; in pm860x_probe()
1178 chip->companion = i2c_new_dummy_device(chip->client->adapter, in pm860x_probe()
1179 chip->companion_addr); in pm860x_probe()
1180 if (IS_ERR(chip->companion)) { in pm860x_probe()
1181 dev_err(&client->dev, in pm860x_probe()
1183 return PTR_ERR(chip->companion); in pm860x_probe()
1185 chip->regmap_companion = regmap_init_i2c(chip->companion, in pm860x_probe()
1187 if (IS_ERR(chip->regmap_companion)) { in pm860x_probe()
1188 ret = PTR_ERR(chip->regmap_companion); in pm860x_probe()
1189 dev_err(&chip->companion->dev, in pm860x_probe()
1191 i2c_unregister_device(chip->companion); in pm860x_probe()
1194 i2c_set_clientdata(chip->companion, chip); in pm860x_probe()
1197 pm860x_device_init(chip, pdata); in pm860x_probe()
1203 struct pm860x_chip *chip = i2c_get_clientdata(client); in pm860x_remove() local
1205 pm860x_device_exit(chip); in pm860x_remove()
1206 if (chip->companion) { in pm860x_remove()
1207 regmap_exit(chip->regmap_companion); in pm860x_remove()
1208 i2c_unregister_device(chip->companion); in pm860x_remove()
1215 struct pm860x_chip *chip = i2c_get_clientdata(client); in pm860x_suspend() local
1217 if (device_may_wakeup(dev) && chip->wakeup_flag) in pm860x_suspend()
1218 enable_irq_wake(chip->core_irq); in pm860x_suspend()
1225 struct pm860x_chip *chip = i2c_get_clientdata(client); in pm860x_resume() local
1227 if (device_may_wakeup(dev) && chip->wakeup_flag) in pm860x_resume()
1228 disable_irq_wake(chip->core_irq); in pm860x_resume()