Lines Matching refs:chip

467 	struct pm860x_chip *chip = data;  in pm860x_irq()  local
473 i2c = (chip->id == CHIP_PM8607) ? chip->client : chip->companion; in pm860x_irq()
481 handle_nested_irq(chip->irq_base + i); in pm860x_irq()
488 struct pm860x_chip *chip = irq_data_get_irq_chip_data(data); in pm860x_irq_lock() local
490 mutex_lock(&chip->irq_lock); in pm860x_irq_lock()
495 struct pm860x_chip *chip = irq_data_get_irq_chip_data(data); in pm860x_irq_sync_unlock() local
502 i2c = (chip->id == CHIP_PM8607) ? chip->client : chip->companion; in pm860x_irq_sync_unlock()
522 dev_err(chip->dev, "wrong IRQ\n"); in pm860x_irq_sync_unlock()
534 mutex_unlock(&chip->irq_lock); in pm860x_irq_sync_unlock()
574 static int device_irq_init(struct pm860x_chip *chip, in device_irq_init() argument
577 struct i2c_client *i2c = (chip->id == CHIP_PM8607) ? in device_irq_init()
578 chip->client : chip->companion; in device_irq_init()
588 chip->irq_mode = 0; in device_irq_init()
596 chip->irq_mode = 1; in device_irq_init()
609 if (chip->irq_mode) { in device_irq_init()
622 mutex_init(&chip->irq_lock); in device_irq_init()
627 chip->irq_base = irq_alloc_descs(irq_base, 0, nr_irqs, 0); in device_irq_init()
628 if (chip->irq_base < 0) { in device_irq_init()
630 chip->irq_base); in device_irq_init()
634 irq_domain_add_legacy(node, nr_irqs, chip->irq_base, 0, in device_irq_init()
635 &pm860x_irq_domain_ops, chip); in device_irq_init()
636 chip->core_irq = i2c->irq; in device_irq_init()
637 if (!chip->core_irq) in device_irq_init()
640 ret = request_threaded_irq(chip->core_irq, NULL, pm860x_irq, in device_irq_init()
641 flags | IRQF_ONESHOT, "88pm860x", chip); in device_irq_init()
643 dev_err(chip->dev, "Failed to request IRQ: %d\n", ret); in device_irq_init()
644 chip->core_irq = 0; in device_irq_init()
649 chip->core_irq = 0; in device_irq_init()
653 static void device_irq_exit(struct pm860x_chip *chip) in device_irq_exit() argument
655 if (chip->core_irq) in device_irq_exit()
656 free_irq(chip->core_irq, chip); in device_irq_exit()
659 int pm8606_osc_enable(struct pm860x_chip *chip, unsigned short client) in pm8606_osc_enable() argument
662 struct i2c_client *i2c = (chip->id == CHIP_PM8606) ? in pm8606_osc_enable()
663 chip->client : chip->companion; in pm8606_osc_enable()
665 dev_dbg(chip->dev, "%s(B): client=0x%x\n", __func__, client); in pm8606_osc_enable()
666 dev_dbg(chip->dev, "%s(B): vote=0x%x status=%d\n", in pm8606_osc_enable()
667 __func__, chip->osc_vote, in pm8606_osc_enable()
668 chip->osc_status); in pm8606_osc_enable()
670 mutex_lock(&chip->osc_lock); in pm8606_osc_enable()
672 chip->osc_vote |= client; in pm8606_osc_enable()
674 if (chip->osc_status != PM8606_REF_GP_OSC_ON) { in pm8606_osc_enable()
675 chip->osc_status = PM8606_REF_GP_OSC_UNKNOWN; in pm8606_osc_enable()
686 chip->osc_status = PM8606_REF_GP_OSC_ON; in pm8606_osc_enable()
688 mutex_unlock(&chip->osc_lock); in pm8606_osc_enable()
690 dev_dbg(chip->dev, "%s(A): vote=0x%x status=%d ret=%d\n", in pm8606_osc_enable()
691 __func__, chip->osc_vote, in pm8606_osc_enable()
692 chip->osc_status, ret); in pm8606_osc_enable()
695 mutex_unlock(&chip->osc_lock); in pm8606_osc_enable()
700 int pm8606_osc_disable(struct pm860x_chip *chip, unsigned short client) in pm8606_osc_disable() argument
703 struct i2c_client *i2c = (chip->id == CHIP_PM8606) ? in pm8606_osc_disable()
704 chip->client : chip->companion; in pm8606_osc_disable()
706 dev_dbg(chip->dev, "%s(B): client=0x%x\n", __func__, client); in pm8606_osc_disable()
707 dev_dbg(chip->dev, "%s(B): vote=0x%x status=%d\n", in pm8606_osc_disable()
708 __func__, chip->osc_vote, in pm8606_osc_disable()
709 chip->osc_status); in pm8606_osc_disable()
711 mutex_lock(&chip->osc_lock); in pm8606_osc_disable()
713 chip->osc_vote &= ~(client); in pm8606_osc_disable()
716 if ((chip->osc_status != PM8606_REF_GP_OSC_OFF) && in pm8606_osc_disable()
717 (chip->osc_vote == REF_GP_NO_CLIENTS)) { in pm8606_osc_disable()
718 chip->osc_status = PM8606_REF_GP_OSC_UNKNOWN; in pm8606_osc_disable()
725 chip->osc_status = PM8606_REF_GP_OSC_OFF; in pm8606_osc_disable()
727 mutex_unlock(&chip->osc_lock); in pm8606_osc_disable()
729 dev_dbg(chip->dev, "%s(A): vote=0x%x status=%d ret=%d\n", in pm8606_osc_disable()
730 __func__, chip->osc_vote, in pm8606_osc_disable()
731 chip->osc_status, ret); in pm8606_osc_disable()
734 mutex_unlock(&chip->osc_lock); in pm8606_osc_disable()
741 struct pm860x_chip *chip = i2c_get_clientdata(i2c); in device_osc_init() local
743 mutex_init(&chip->osc_lock); in device_osc_init()
750 chip->osc_vote = REF_GP_NO_CLIENTS; in device_osc_init()
751 chip->osc_status = PM8606_REF_GP_OSC_OFF; in device_osc_init()
754 static void device_bk_init(struct pm860x_chip *chip, in device_bk_init() argument
768 ret = mfd_add_devices(chip->dev, 0, bk_devs, in device_bk_init()
771 dev_err(chip->dev, "Failed to add backlight subdev\n"); in device_bk_init()
774 static void device_led_init(struct pm860x_chip *chip, in device_led_init() argument
788 ret = mfd_add_devices(chip->dev, 0, led_devs, in device_led_init()
791 dev_err(chip->dev, "Failed to add led subdev\n"); in device_led_init()
796 static void device_regulator_init(struct pm860x_chip *chip, in device_regulator_init() argument
867 ret = mfd_add_devices(chip->dev, 0, reg_devs, in device_regulator_init()
870 dev_err(chip->dev, "Failed to add regulator subdev\n"); in device_regulator_init()
875 static void device_rtc_init(struct pm860x_chip *chip, in device_rtc_init() argument
887 ret = mfd_add_devices(chip->dev, 0, &rtc_devs[0], in device_rtc_init()
889 chip->irq_base, NULL); in device_rtc_init()
891 dev_err(chip->dev, "Failed to add rtc subdev\n"); in device_rtc_init()
894 static void device_touch_init(struct pm860x_chip *chip, in device_touch_init() argument
906 ret = mfd_add_devices(chip->dev, 0, &touch_devs[0], in device_touch_init()
908 chip->irq_base, NULL); in device_touch_init()
910 dev_err(chip->dev, "Failed to add touch subdev\n"); in device_touch_init()
913 static void device_power_init(struct pm860x_chip *chip, in device_power_init() argument
925 ret = mfd_add_devices(chip->dev, 0, &power_devs[0], 1, in device_power_init()
926 &battery_resources[0], chip->irq_base, NULL); in device_power_init()
928 dev_err(chip->dev, "Failed to add battery subdev\n"); in device_power_init()
934 ret = mfd_add_devices(chip->dev, 0, &power_devs[1], 1, in device_power_init()
935 &charger_resources[0], chip->irq_base, NULL); in device_power_init()
937 dev_err(chip->dev, "Failed to add charger subdev\n"); in device_power_init()
941 ret = mfd_add_devices(chip->dev, 0, &power_devs[2], 1, in device_power_init()
942 NULL, chip->irq_base, NULL); in device_power_init()
944 dev_err(chip->dev, "Failed to add preg subdev\n"); in device_power_init()
953 ret = mfd_add_devices(chip->dev, 0, &power_devs[3], 1, in device_power_init()
954 NULL, chip->irq_base, NULL); in device_power_init()
956 dev_err(chip->dev, "Failed to add chg-manager subdev\n"); in device_power_init()
960 static void device_onkey_init(struct pm860x_chip *chip, in device_onkey_init() argument
967 ret = mfd_add_devices(chip->dev, 0, &onkey_devs[0], in device_onkey_init()
969 chip->irq_base, NULL); in device_onkey_init()
971 dev_err(chip->dev, "Failed to add onkey subdev\n"); in device_onkey_init()
974 static void device_codec_init(struct pm860x_chip *chip, in device_codec_init() argument
981 ret = mfd_add_devices(chip->dev, 0, &codec_devs[0], in device_codec_init()
985 dev_err(chip->dev, "Failed to add codec subdev\n"); in device_codec_init()
988 static void device_8607_init(struct pm860x_chip *chip, in device_8607_init() argument
996 dev_err(chip->dev, "Failed to read CHIP ID: %d\n", ret); in device_8607_init()
1002 dev_info(chip->dev, "Marvell 88PM8607 (ID: %02x) detected\n", in device_8607_init()
1006 dev_err(chip->dev, in device_8607_init()
1014 dev_err(chip->dev, "Failed to read BUCK3 register: %d\n", ret); in device_8607_init()
1018 chip->buck3_double = 1; in device_8607_init()
1022 dev_err(chip->dev, "Failed to read MISC1 register: %d\n", ret); in device_8607_init()
1032 dev_err(chip->dev, "Failed to access MISC1:%d\n", ret); in device_8607_init()
1036 ret = device_irq_init(chip, pdata); in device_8607_init()
1040 device_regulator_init(chip, pdata); in device_8607_init()
1041 device_rtc_init(chip, pdata); in device_8607_init()
1042 device_onkey_init(chip, pdata); in device_8607_init()
1043 device_touch_init(chip, pdata); in device_8607_init()
1044 device_power_init(chip, pdata); in device_8607_init()
1045 device_codec_init(chip, pdata); in device_8607_init()
1050 static void device_8606_init(struct pm860x_chip *chip, in device_8606_init() argument
1055 device_bk_init(chip, pdata); in device_8606_init()
1056 device_led_init(chip, pdata); in device_8606_init()
1059 static int pm860x_device_init(struct pm860x_chip *chip, in pm860x_device_init() argument
1062 chip->core_irq = 0; in pm860x_device_init()
1064 switch (chip->id) { in pm860x_device_init()
1066 device_8606_init(chip, chip->client, pdata); in pm860x_device_init()
1069 device_8607_init(chip, chip->client, pdata); in pm860x_device_init()
1073 if (chip->companion) { in pm860x_device_init()
1074 switch (chip->id) { in pm860x_device_init()
1076 device_8606_init(chip, chip->companion, pdata); in pm860x_device_init()
1079 device_8607_init(chip, chip->companion, pdata); in pm860x_device_init()
1087 static void pm860x_device_exit(struct pm860x_chip *chip) in pm860x_device_exit() argument
1089 device_irq_exit(chip); in pm860x_device_exit()
1090 mfd_remove_devices(chip->dev); in pm860x_device_exit()
1142 struct pm860x_chip *chip; in pm860x_probe() local
1160 chip = devm_kzalloc(&client->dev, in pm860x_probe()
1162 if (chip == NULL) in pm860x_probe()
1165 chip->id = verify_addr(client); in pm860x_probe()
1166 chip->regmap = devm_regmap_init_i2c(client, &pm860x_regmap_config); in pm860x_probe()
1167 if (IS_ERR(chip->regmap)) { in pm860x_probe()
1168 ret = PTR_ERR(chip->regmap); in pm860x_probe()
1173 chip->client = client; in pm860x_probe()
1174 i2c_set_clientdata(client, chip); in pm860x_probe()
1175 chip->dev = &client->dev; in pm860x_probe()
1176 dev_set_drvdata(chip->dev, chip); in pm860x_probe()
1186 chip->companion_addr = pdata->companion_addr; in pm860x_probe()
1187 chip->companion = i2c_new_dummy(chip->client->adapter, in pm860x_probe()
1188 chip->companion_addr); in pm860x_probe()
1189 if (!chip->companion) { in pm860x_probe()
1194 chip->regmap_companion = regmap_init_i2c(chip->companion, in pm860x_probe()
1196 if (IS_ERR(chip->regmap_companion)) { in pm860x_probe()
1197 ret = PTR_ERR(chip->regmap_companion); in pm860x_probe()
1198 dev_err(&chip->companion->dev, in pm860x_probe()
1200 i2c_unregister_device(chip->companion); in pm860x_probe()
1203 i2c_set_clientdata(chip->companion, chip); in pm860x_probe()
1206 pm860x_device_init(chip, pdata); in pm860x_probe()
1212 struct pm860x_chip *chip = i2c_get_clientdata(client); in pm860x_remove() local
1214 pm860x_device_exit(chip); in pm860x_remove()
1215 if (chip->companion) { in pm860x_remove()
1216 regmap_exit(chip->regmap_companion); in pm860x_remove()
1217 i2c_unregister_device(chip->companion); in pm860x_remove()
1226 struct pm860x_chip *chip = i2c_get_clientdata(client); in pm860x_suspend() local
1228 if (device_may_wakeup(dev) && chip->wakeup_flag) in pm860x_suspend()
1229 enable_irq_wake(chip->core_irq); in pm860x_suspend()
1236 struct pm860x_chip *chip = i2c_get_clientdata(client); in pm860x_resume() local
1238 if (device_may_wakeup(dev) && chip->wakeup_flag) in pm860x_resume()
1239 disable_irq_wake(chip->core_irq); in pm860x_resume()