Lines Matching refs:ddata

176 static int cpcap_charger_get_charge_voltage(struct cpcap_charger_ddata *ddata)  in cpcap_charger_get_charge_voltage()  argument
181 channel = ddata->channels[CPCAP_CHARGER_IIO_VOLTAGE]; in cpcap_charger_get_charge_voltage()
184 dev_warn(ddata->dev, "%s failed: %i\n", __func__, error); in cpcap_charger_get_charge_voltage()
192 static int cpcap_charger_get_charge_current(struct cpcap_charger_ddata *ddata) in cpcap_charger_get_charge_current() argument
197 channel = ddata->channels[CPCAP_CHARGER_IIO_CHRG_CURRENT]; in cpcap_charger_get_charge_current()
200 dev_warn(ddata->dev, "%s failed: %i\n", __func__, error); in cpcap_charger_get_charge_current()
212 struct cpcap_charger_ddata *ddata = dev_get_drvdata(psy->dev.parent); in cpcap_charger_get_property() local
216 val->intval = ddata->status; in cpcap_charger_get_property()
219 val->intval = ddata->limit_current; in cpcap_charger_get_property()
222 val->intval = ddata->voltage; in cpcap_charger_get_property()
225 if (ddata->status == POWER_SUPPLY_STATUS_CHARGING) in cpcap_charger_get_property()
226 val->intval = cpcap_charger_get_charge_voltage(ddata) * in cpcap_charger_get_property()
232 if (ddata->status == POWER_SUPPLY_STATUS_CHARGING) in cpcap_charger_get_property()
233 val->intval = cpcap_charger_get_charge_current(ddata) * in cpcap_charger_get_property()
239 val->intval = ddata->status == POWER_SUPPLY_STATUS_CHARGING; in cpcap_charger_get_property()
272 cpcap_charger_get_bat_const_charge_voltage(struct cpcap_charger_ddata *ddata) in cpcap_charger_get_bat_const_charge_voltage() argument
276 int voltage = ddata->voltage; in cpcap_charger_get_bat_const_charge_voltage()
317 struct cpcap_charger_ddata *ddata = dev_get_drvdata(psy->dev.parent); in cpcap_charger_set_property() local
324 ddata->limit_current = val->intval; in cpcap_charger_set_property()
325 schedule_delayed_work(&ddata->detect_work, 0); in cpcap_charger_set_property()
329 batvolt = cpcap_charger_get_bat_const_charge_voltage(ddata); in cpcap_charger_set_property()
332 ddata->voltage = voltage; in cpcap_charger_set_property()
333 schedule_delayed_work(&ddata->detect_work, 0); in cpcap_charger_set_property()
354 static void cpcap_charger_set_cable_path(struct cpcap_charger_ddata *ddata, in cpcap_charger_set_cable_path() argument
357 if (!ddata->gpio[0]) in cpcap_charger_set_cable_path()
360 gpiod_set_value(ddata->gpio[0], enabled); in cpcap_charger_set_cable_path()
363 static void cpcap_charger_set_inductive_path(struct cpcap_charger_ddata *ddata, in cpcap_charger_set_inductive_path() argument
366 if (!ddata->gpio[1]) in cpcap_charger_set_inductive_path()
369 gpiod_set_value(ddata->gpio[1], enabled); in cpcap_charger_set_inductive_path()
372 static void cpcap_charger_update_state(struct cpcap_charger_ddata *ddata, in cpcap_charger_update_state() argument
378 dev_warn(ddata->dev, "unknown state: %i\n", state); in cpcap_charger_update_state()
383 ddata->status = state; in cpcap_charger_update_state()
402 dev_dbg(ddata->dev, "state: %s\n", status); in cpcap_charger_update_state()
405 static int cpcap_charger_disable(struct cpcap_charger_ddata *ddata) in cpcap_charger_disable() argument
409 error = regmap_update_bits(ddata->reg, CPCAP_REG_CRM, 0x3fff, in cpcap_charger_disable()
413 dev_err(ddata->dev, "%s failed with %i\n", __func__, error); in cpcap_charger_disable()
418 static int cpcap_charger_enable(struct cpcap_charger_ddata *ddata, in cpcap_charger_enable() argument
427 dev_dbg(ddata->dev, "enable: %i %i %i\n", in cpcap_charger_enable()
430 error = regmap_update_bits(ddata->reg, CPCAP_REG_CRM, 0x3fff, in cpcap_charger_enable()
438 dev_err(ddata->dev, "%s failed with %i\n", __func__, error); in cpcap_charger_enable()
443 static bool cpcap_charger_vbus_valid(struct cpcap_charger_ddata *ddata) in cpcap_charger_vbus_valid() argument
447 ddata->channels[CPCAP_CHARGER_IIO_VBUS]; in cpcap_charger_vbus_valid()
453 dev_err(ddata->dev, "error reading VBUS: %i\n", error); in cpcap_charger_vbus_valid()
461 struct cpcap_charger_ddata *ddata; in cpcap_charger_vbus_work() local
465 ddata = container_of(work, struct cpcap_charger_ddata, in cpcap_charger_vbus_work()
468 if (ddata->vbus_enabled) { in cpcap_charger_vbus_work()
469 vbus = cpcap_charger_vbus_valid(ddata); in cpcap_charger_vbus_work()
471 dev_dbg(ddata->dev, "VBUS already provided\n"); in cpcap_charger_vbus_work()
476 ddata->feeding_vbus = true; in cpcap_charger_vbus_work()
477 cpcap_charger_set_cable_path(ddata, false); in cpcap_charger_vbus_work()
478 cpcap_charger_set_inductive_path(ddata, false); in cpcap_charger_vbus_work()
480 error = cpcap_charger_disable(ddata); in cpcap_charger_vbus_work()
484 cpcap_charger_update_state(ddata, in cpcap_charger_vbus_work()
487 error = regmap_update_bits(ddata->reg, CPCAP_REG_VUSBC, in cpcap_charger_vbus_work()
493 error = regmap_update_bits(ddata->reg, CPCAP_REG_CRM, in cpcap_charger_vbus_work()
499 error = regmap_update_bits(ddata->reg, CPCAP_REG_VUSBC, in cpcap_charger_vbus_work()
504 error = regmap_update_bits(ddata->reg, CPCAP_REG_CRM, in cpcap_charger_vbus_work()
509 cpcap_charger_set_cable_path(ddata, true); in cpcap_charger_vbus_work()
510 cpcap_charger_set_inductive_path(ddata, true); in cpcap_charger_vbus_work()
511 ddata->feeding_vbus = false; in cpcap_charger_vbus_work()
517 cpcap_charger_update_state(ddata, POWER_SUPPLY_STATUS_UNKNOWN); in cpcap_charger_vbus_work()
518 dev_err(ddata->dev, "%s could not %s vbus: %i\n", __func__, in cpcap_charger_vbus_work()
519 ddata->vbus_enabled ? "enable" : "disable", error); in cpcap_charger_vbus_work()
525 struct cpcap_charger_ddata *ddata = in cpcap_charger_set_vbus() local
529 ddata->vbus_enabled = enabled; in cpcap_charger_set_vbus()
530 schedule_delayed_work(&ddata->vbus_work, 0); in cpcap_charger_set_vbus()
537 static int cpcap_charger_get_ints_state(struct cpcap_charger_ddata *ddata, in cpcap_charger_get_ints_state() argument
542 error = regmap_read(ddata->reg, CPCAP_REG_INTS1, &val); in cpcap_charger_get_ints_state()
550 error = regmap_read(ddata->reg, CPCAP_REG_INTS2, &val); in cpcap_charger_get_ints_state()
560 error = regmap_read(ddata->reg, CPCAP_REG_INTS4, &val); in cpcap_charger_get_ints_state()
595 static void cpcap_charger_disconnect(struct cpcap_charger_ddata *ddata, in cpcap_charger_disconnect() argument
604 power_supply_changed(ddata->usb); in cpcap_charger_disconnect()
610 error = cpcap_charger_disable(ddata); in cpcap_charger_disconnect()
612 cpcap_charger_update_state(ddata, POWER_SUPPLY_STATUS_UNKNOWN); in cpcap_charger_disconnect()
616 cpcap_charger_update_state(ddata, state); in cpcap_charger_disconnect()
617 power_supply_changed(ddata->usb); in cpcap_charger_disconnect()
618 schedule_delayed_work(&ddata->detect_work, delay); in cpcap_charger_disconnect()
623 struct cpcap_charger_ddata *ddata; in cpcap_usb_detect() local
627 ddata = container_of(work, struct cpcap_charger_ddata, in cpcap_usb_detect()
630 error = cpcap_charger_get_ints_state(ddata, &s); in cpcap_usb_detect()
636 cpcap_charger_update_state(ddata, in cpcap_usb_detect()
646 if (cpcap_charger_get_charge_voltage(ddata) > ddata->voltage) { in cpcap_usb_detect()
647 cpcap_charger_disconnect(ddata, in cpcap_usb_detect()
658 switch (ddata->status) { in cpcap_usb_detect()
665 cpcap_charger_disconnect(ddata, new_state, HZ * 5); in cpcap_usb_detect()
677 cpcap_charger_disconnect(ddata, new_state, HZ * 5); in cpcap_usb_detect()
684 if (!ddata->feeding_vbus && cpcap_charger_vbus_valid(ddata) && in cpcap_usb_detect()
693 dev_err(ddata->dev, "battery power_supply not available %li\n", in cpcap_usb_detect()
706 dev_info(ddata->dev, "battery not inserted, charging disabled\n"); in cpcap_usb_detect()
710 if (max_current > ddata->limit_current) in cpcap_usb_detect()
711 max_current = ddata->limit_current; in cpcap_usb_detect()
714 vchrg = cpcap_charger_voltage_to_regval(ddata->voltage); in cpcap_usb_detect()
715 error = cpcap_charger_enable(ddata, in cpcap_usb_detect()
720 cpcap_charger_update_state(ddata, in cpcap_usb_detect()
723 error = cpcap_charger_disable(ddata); in cpcap_usb_detect()
726 cpcap_charger_update_state(ddata, in cpcap_usb_detect()
730 power_supply_changed(ddata->usb); in cpcap_usb_detect()
734 cpcap_charger_update_state(ddata, POWER_SUPPLY_STATUS_UNKNOWN); in cpcap_usb_detect()
735 dev_err(ddata->dev, "%s failed with %i\n", __func__, error); in cpcap_usb_detect()
740 struct cpcap_charger_ddata *ddata = data; in cpcap_charger_irq_thread() local
742 if (!atomic_read(&ddata->active)) in cpcap_charger_irq_thread()
745 schedule_delayed_work(&ddata->detect_work, 0); in cpcap_charger_irq_thread()
751 struct cpcap_charger_ddata *ddata, in cpcap_usb_init_irq() argument
761 error = devm_request_threaded_irq(ddata->dev, irq, NULL, in cpcap_usb_init_irq()
764 name, ddata); in cpcap_usb_init_irq()
766 dev_err(ddata->dev, "could not get irq %s: %i\n", in cpcap_usb_init_irq()
772 d = devm_kzalloc(ddata->dev, sizeof(*d), GFP_KERNEL); in cpcap_usb_init_irq()
778 list_add(&d->node, &ddata->irq_list); in cpcap_usb_init_irq()
795 struct cpcap_charger_ddata *ddata) in cpcap_usb_init_interrupts() argument
800 error = cpcap_usb_init_irq(pdev, ddata, cpcap_charger_irqs[i]); in cpcap_usb_init_interrupts()
808 static void cpcap_charger_init_optional_gpios(struct cpcap_charger_ddata *ddata) in cpcap_charger_init_optional_gpios() argument
813 ddata->gpio[i] = devm_gpiod_get_index(ddata->dev, "mode", in cpcap_charger_init_optional_gpios()
815 if (IS_ERR(ddata->gpio[i])) { in cpcap_charger_init_optional_gpios()
816 dev_info(ddata->dev, "no mode change GPIO%i: %li\n", in cpcap_charger_init_optional_gpios()
817 i, PTR_ERR(ddata->gpio[i])); in cpcap_charger_init_optional_gpios()
818 ddata->gpio[i] = NULL; in cpcap_charger_init_optional_gpios()
823 static int cpcap_charger_init_iio(struct cpcap_charger_ddata *ddata) in cpcap_charger_init_iio() argument
831 ddata->channels[i] = devm_iio_channel_get(ddata->dev, in cpcap_charger_init_iio()
833 if (IS_ERR(ddata->channels[i])) { in cpcap_charger_init_iio()
834 error = PTR_ERR(ddata->channels[i]); in cpcap_charger_init_iio()
838 if (!ddata->channels[i]->indio_dev) { in cpcap_charger_init_iio()
848 dev_err(ddata->dev, "could not initialize VBUS or ID IIO: %i\n", in cpcap_charger_init_iio()
880 struct cpcap_charger_ddata *ddata; in cpcap_charger_probe() local
890 ddata = devm_kzalloc(&pdev->dev, sizeof(*ddata), GFP_KERNEL); in cpcap_charger_probe()
891 if (!ddata) in cpcap_charger_probe()
894 ddata->dev = &pdev->dev; in cpcap_charger_probe()
895 ddata->voltage = 4200000; in cpcap_charger_probe()
896 ddata->limit_current = 532000; in cpcap_charger_probe()
898 ddata->reg = dev_get_regmap(ddata->dev->parent, NULL); in cpcap_charger_probe()
899 if (!ddata->reg) in cpcap_charger_probe()
902 INIT_LIST_HEAD(&ddata->irq_list); in cpcap_charger_probe()
903 INIT_DELAYED_WORK(&ddata->detect_work, cpcap_usb_detect); in cpcap_charger_probe()
904 INIT_DELAYED_WORK(&ddata->vbus_work, cpcap_charger_vbus_work); in cpcap_charger_probe()
905 platform_set_drvdata(pdev, ddata); in cpcap_charger_probe()
907 error = cpcap_charger_init_iio(ddata); in cpcap_charger_probe()
911 atomic_set(&ddata->active, 1); in cpcap_charger_probe()
914 psy_cfg.drv_data = ddata; in cpcap_charger_probe()
918 ddata->usb = devm_power_supply_register(ddata->dev, in cpcap_charger_probe()
921 if (IS_ERR(ddata->usb)) { in cpcap_charger_probe()
922 error = PTR_ERR(ddata->usb); in cpcap_charger_probe()
923 dev_err(ddata->dev, "failed to register USB charger: %i\n", in cpcap_charger_probe()
929 error = cpcap_usb_init_interrupts(pdev, ddata); in cpcap_charger_probe()
933 ddata->comparator.set_vbus = cpcap_charger_set_vbus; in cpcap_charger_probe()
934 error = omap_usb2_set_comparator(&ddata->comparator); in cpcap_charger_probe()
936 dev_info(ddata->dev, "charger needs phy, deferring probe\n"); in cpcap_charger_probe()
940 cpcap_charger_init_optional_gpios(ddata); in cpcap_charger_probe()
942 schedule_delayed_work(&ddata->detect_work, 0); in cpcap_charger_probe()
949 struct cpcap_charger_ddata *ddata = platform_get_drvdata(pdev); in cpcap_charger_shutdown() local
952 atomic_set(&ddata->active, 0); in cpcap_charger_shutdown()
955 dev_warn(ddata->dev, "could not clear USB comparator: %i\n", in cpcap_charger_shutdown()
958 error = cpcap_charger_disable(ddata); in cpcap_charger_shutdown()
960 cpcap_charger_update_state(ddata, POWER_SUPPLY_STATUS_UNKNOWN); in cpcap_charger_shutdown()
961 dev_warn(ddata->dev, "could not clear charger: %i\n", in cpcap_charger_shutdown()
964 cpcap_charger_update_state(ddata, POWER_SUPPLY_STATUS_DISCHARGING); in cpcap_charger_shutdown()
965 cancel_delayed_work_sync(&ddata->vbus_work); in cpcap_charger_shutdown()
966 cancel_delayed_work_sync(&ddata->detect_work); in cpcap_charger_shutdown()