Lines Matching refs:ddata

181 static bool cpcap_charger_battery_found(struct cpcap_charger_ddata *ddata)  in cpcap_charger_battery_found()  argument
186 channel = ddata->channels[CPCAP_CHARGER_IIO_BATTDET]; in cpcap_charger_battery_found()
189 dev_warn(ddata->dev, "%s failed: %i\n", __func__, error); in cpcap_charger_battery_found()
197 static int cpcap_charger_get_charge_voltage(struct cpcap_charger_ddata *ddata) in cpcap_charger_get_charge_voltage() argument
202 channel = ddata->channels[CPCAP_CHARGER_IIO_VOLTAGE]; in cpcap_charger_get_charge_voltage()
205 dev_warn(ddata->dev, "%s failed: %i\n", __func__, error); in cpcap_charger_get_charge_voltage()
213 static int cpcap_charger_get_charge_current(struct cpcap_charger_ddata *ddata) in cpcap_charger_get_charge_current() argument
218 channel = ddata->channels[CPCAP_CHARGER_IIO_CHRG_CURRENT]; in cpcap_charger_get_charge_current()
221 dev_warn(ddata->dev, "%s failed: %i\n", __func__, error); in cpcap_charger_get_charge_current()
233 struct cpcap_charger_ddata *ddata = dev_get_drvdata(psy->dev.parent); in cpcap_charger_get_property() local
237 val->intval = ddata->status; in cpcap_charger_get_property()
240 val->intval = ddata->voltage; in cpcap_charger_get_property()
243 if (ddata->status == POWER_SUPPLY_STATUS_CHARGING) in cpcap_charger_get_property()
244 val->intval = cpcap_charger_get_charge_voltage(ddata) * in cpcap_charger_get_property()
250 if (ddata->status == POWER_SUPPLY_STATUS_CHARGING) in cpcap_charger_get_property()
251 val->intval = cpcap_charger_get_charge_current(ddata) * in cpcap_charger_get_property()
257 val->intval = ddata->status == POWER_SUPPLY_STATUS_CHARGING; in cpcap_charger_get_property()
290 cpcap_charger_get_bat_const_charge_voltage(struct cpcap_charger_ddata *ddata) in cpcap_charger_get_bat_const_charge_voltage() argument
294 int voltage = ddata->voltage; in cpcap_charger_get_bat_const_charge_voltage()
315 struct cpcap_charger_ddata *ddata = dev_get_drvdata(psy->dev.parent); in cpcap_charger_set_property() local
321 batvolt = cpcap_charger_get_bat_const_charge_voltage(ddata); in cpcap_charger_set_property()
324 ddata->voltage = voltage; in cpcap_charger_set_property()
325 schedule_delayed_work(&ddata->detect_work, 0); in cpcap_charger_set_property()
345 static void cpcap_charger_set_cable_path(struct cpcap_charger_ddata *ddata, in cpcap_charger_set_cable_path() argument
348 if (!ddata->gpio[0]) in cpcap_charger_set_cable_path()
351 gpiod_set_value(ddata->gpio[0], enabled); in cpcap_charger_set_cable_path()
354 static void cpcap_charger_set_inductive_path(struct cpcap_charger_ddata *ddata, in cpcap_charger_set_inductive_path() argument
357 if (!ddata->gpio[1]) in cpcap_charger_set_inductive_path()
360 gpiod_set_value(ddata->gpio[1], enabled); in cpcap_charger_set_inductive_path()
363 static int cpcap_charger_set_state(struct cpcap_charger_ddata *ddata, in cpcap_charger_set_state() argument
371 dev_dbg(ddata->dev, "%s enable: %i\n", __func__, enable); in cpcap_charger_set_state()
374 error = regmap_update_bits(ddata->reg, CPCAP_REG_CRM, in cpcap_charger_set_state()
379 ddata->status = POWER_SUPPLY_STATUS_UNKNOWN; in cpcap_charger_set_state()
383 ddata->status = POWER_SUPPLY_STATUS_DISCHARGING; in cpcap_charger_set_state()
388 error = regmap_update_bits(ddata->reg, CPCAP_REG_CRM, 0x3fff, in cpcap_charger_set_state()
396 ddata->status = POWER_SUPPLY_STATUS_UNKNOWN; in cpcap_charger_set_state()
400 ddata->status = POWER_SUPPLY_STATUS_CHARGING; in cpcap_charger_set_state()
405 dev_err(ddata->dev, "%s failed with %i\n", __func__, error); in cpcap_charger_set_state()
410 static bool cpcap_charger_vbus_valid(struct cpcap_charger_ddata *ddata) in cpcap_charger_vbus_valid() argument
414 ddata->channels[CPCAP_CHARGER_IIO_VBUS]; in cpcap_charger_vbus_valid()
420 dev_err(ddata->dev, "error reading VBUS: %i\n", error); in cpcap_charger_vbus_valid()
428 struct cpcap_charger_ddata *ddata; in cpcap_charger_vbus_work() local
432 ddata = container_of(work, struct cpcap_charger_ddata, in cpcap_charger_vbus_work()
435 if (ddata->vbus_enabled) { in cpcap_charger_vbus_work()
436 vbus = cpcap_charger_vbus_valid(ddata); in cpcap_charger_vbus_work()
438 dev_info(ddata->dev, "VBUS already provided\n"); in cpcap_charger_vbus_work()
443 ddata->feeding_vbus = true; in cpcap_charger_vbus_work()
444 cpcap_charger_set_cable_path(ddata, false); in cpcap_charger_vbus_work()
445 cpcap_charger_set_inductive_path(ddata, false); in cpcap_charger_vbus_work()
447 error = cpcap_charger_set_state(ddata, 0, 0, 0); in cpcap_charger_vbus_work()
451 error = regmap_update_bits(ddata->reg, CPCAP_REG_VUSBC, in cpcap_charger_vbus_work()
457 error = regmap_update_bits(ddata->reg, CPCAP_REG_CRM, in cpcap_charger_vbus_work()
463 error = regmap_update_bits(ddata->reg, CPCAP_REG_VUSBC, in cpcap_charger_vbus_work()
468 error = regmap_update_bits(ddata->reg, CPCAP_REG_CRM, in cpcap_charger_vbus_work()
473 cpcap_charger_set_cable_path(ddata, true); in cpcap_charger_vbus_work()
474 cpcap_charger_set_inductive_path(ddata, true); in cpcap_charger_vbus_work()
475 ddata->feeding_vbus = false; in cpcap_charger_vbus_work()
481 dev_err(ddata->dev, "%s could not %s vbus: %i\n", __func__, in cpcap_charger_vbus_work()
482 ddata->vbus_enabled ? "enable" : "disable", error); in cpcap_charger_vbus_work()
488 struct cpcap_charger_ddata *ddata = in cpcap_charger_set_vbus() local
492 ddata->vbus_enabled = enabled; in cpcap_charger_set_vbus()
493 schedule_delayed_work(&ddata->vbus_work, 0); in cpcap_charger_set_vbus()
500 static int cpcap_charger_get_ints_state(struct cpcap_charger_ddata *ddata, in cpcap_charger_get_ints_state() argument
505 error = regmap_read(ddata->reg, CPCAP_REG_INTS1, &val); in cpcap_charger_get_ints_state()
513 error = regmap_read(ddata->reg, CPCAP_REG_INTS2, &val); in cpcap_charger_get_ints_state()
523 error = regmap_read(ddata->reg, CPCAP_REG_INTS4, &val); in cpcap_charger_get_ints_state()
532 static void cpcap_charger_update_state(struct cpcap_charger_ddata *ddata, in cpcap_charger_update_state() argument
538 dev_warn(ddata->dev, "unknown state: %i\n", state); in cpcap_charger_update_state()
543 ddata->state = state; in cpcap_charger_update_state()
562 dev_dbg(ddata->dev, "state: %s\n", status); in cpcap_charger_update_state()
591 static void cpcap_charger_disconnect(struct cpcap_charger_ddata *ddata, in cpcap_charger_disconnect() argument
596 error = cpcap_charger_set_state(ddata, 0, 0, 0); in cpcap_charger_disconnect()
600 cpcap_charger_update_state(ddata, state); in cpcap_charger_disconnect()
601 power_supply_changed(ddata->usb); in cpcap_charger_disconnect()
602 schedule_delayed_work(&ddata->detect_work, delay); in cpcap_charger_disconnect()
607 struct cpcap_charger_ddata *ddata; in cpcap_usb_detect() local
611 ddata = container_of(work, struct cpcap_charger_ddata, in cpcap_usb_detect()
614 error = cpcap_charger_get_ints_state(ddata, &s); in cpcap_usb_detect()
620 cpcap_charger_update_state(ddata, CPCAP_CHARGER_DETECTING); in cpcap_usb_detect()
629 if (cpcap_charger_get_charge_voltage(ddata) > ddata->voltage) { in cpcap_usb_detect()
630 cpcap_charger_disconnect(ddata, CPCAP_CHARGER_DETECTING, in cpcap_usb_detect()
640 switch (ddata->state) { in cpcap_usb_detect()
645 cpcap_charger_disconnect(ddata, CPCAP_CHARGER_DONE, in cpcap_usb_detect()
653 cpcap_charger_disconnect(ddata, CPCAP_CHARGER_DETECTING, in cpcap_usb_detect()
660 if (!ddata->feeding_vbus && cpcap_charger_vbus_valid(ddata) && in cpcap_usb_detect()
665 if (cpcap_charger_battery_found(ddata)) in cpcap_usb_detect()
670 vchrg = cpcap_charger_voltage_to_regval(ddata->voltage); in cpcap_usb_detect()
671 error = cpcap_charger_set_state(ddata, in cpcap_usb_detect()
676 cpcap_charger_update_state(ddata, CPCAP_CHARGER_CHARGING); in cpcap_usb_detect()
678 error = cpcap_charger_set_state(ddata, 0, 0, 0); in cpcap_usb_detect()
681 cpcap_charger_update_state(ddata, CPCAP_CHARGER_DISCONNECTED); in cpcap_usb_detect()
684 power_supply_changed(ddata->usb); in cpcap_usb_detect()
688 dev_err(ddata->dev, "%s failed with %i\n", __func__, error); in cpcap_usb_detect()
693 struct cpcap_charger_ddata *ddata = data; in cpcap_charger_irq_thread() local
695 if (!atomic_read(&ddata->active)) in cpcap_charger_irq_thread()
698 schedule_delayed_work(&ddata->detect_work, 0); in cpcap_charger_irq_thread()
704 struct cpcap_charger_ddata *ddata, in cpcap_usb_init_irq() argument
714 error = devm_request_threaded_irq(ddata->dev, irq, NULL, in cpcap_usb_init_irq()
717 name, ddata); in cpcap_usb_init_irq()
719 dev_err(ddata->dev, "could not get irq %s: %i\n", in cpcap_usb_init_irq()
725 d = devm_kzalloc(ddata->dev, sizeof(*d), GFP_KERNEL); in cpcap_usb_init_irq()
731 list_add(&d->node, &ddata->irq_list); in cpcap_usb_init_irq()
748 struct cpcap_charger_ddata *ddata) in cpcap_usb_init_interrupts() argument
753 error = cpcap_usb_init_irq(pdev, ddata, cpcap_charger_irqs[i]); in cpcap_usb_init_interrupts()
761 static void cpcap_charger_init_optional_gpios(struct cpcap_charger_ddata *ddata) in cpcap_charger_init_optional_gpios() argument
766 ddata->gpio[i] = devm_gpiod_get_index(ddata->dev, "mode", in cpcap_charger_init_optional_gpios()
768 if (IS_ERR(ddata->gpio[i])) { in cpcap_charger_init_optional_gpios()
769 dev_info(ddata->dev, "no mode change GPIO%i: %li\n", in cpcap_charger_init_optional_gpios()
770 i, PTR_ERR(ddata->gpio[i])); in cpcap_charger_init_optional_gpios()
771 ddata->gpio[i] = NULL; in cpcap_charger_init_optional_gpios()
776 static int cpcap_charger_init_iio(struct cpcap_charger_ddata *ddata) in cpcap_charger_init_iio() argument
784 ddata->channels[i] = devm_iio_channel_get(ddata->dev, in cpcap_charger_init_iio()
786 if (IS_ERR(ddata->channels[i])) { in cpcap_charger_init_iio()
787 error = PTR_ERR(ddata->channels[i]); in cpcap_charger_init_iio()
791 if (!ddata->channels[i]->indio_dev) { in cpcap_charger_init_iio()
801 dev_err(ddata->dev, "could not initialize VBUS or ID IIO: %i\n", in cpcap_charger_init_iio()
829 struct cpcap_charger_ddata *ddata; in cpcap_charger_probe() local
839 ddata = devm_kzalloc(&pdev->dev, sizeof(*ddata), GFP_KERNEL); in cpcap_charger_probe()
840 if (!ddata) in cpcap_charger_probe()
843 ddata->dev = &pdev->dev; in cpcap_charger_probe()
844 ddata->voltage = 4200000; in cpcap_charger_probe()
846 ddata->reg = dev_get_regmap(ddata->dev->parent, NULL); in cpcap_charger_probe()
847 if (!ddata->reg) in cpcap_charger_probe()
850 INIT_LIST_HEAD(&ddata->irq_list); in cpcap_charger_probe()
851 INIT_DELAYED_WORK(&ddata->detect_work, cpcap_usb_detect); in cpcap_charger_probe()
852 INIT_DELAYED_WORK(&ddata->vbus_work, cpcap_charger_vbus_work); in cpcap_charger_probe()
853 platform_set_drvdata(pdev, ddata); in cpcap_charger_probe()
855 error = cpcap_charger_init_iio(ddata); in cpcap_charger_probe()
859 atomic_set(&ddata->active, 1); in cpcap_charger_probe()
862 psy_cfg.drv_data = ddata; in cpcap_charger_probe()
864 ddata->usb = devm_power_supply_register(ddata->dev, in cpcap_charger_probe()
867 if (IS_ERR(ddata->usb)) { in cpcap_charger_probe()
868 error = PTR_ERR(ddata->usb); in cpcap_charger_probe()
869 dev_err(ddata->dev, "failed to register USB charger: %i\n", in cpcap_charger_probe()
875 error = cpcap_usb_init_interrupts(pdev, ddata); in cpcap_charger_probe()
879 ddata->comparator.set_vbus = cpcap_charger_set_vbus; in cpcap_charger_probe()
880 error = omap_usb2_set_comparator(&ddata->comparator); in cpcap_charger_probe()
882 dev_info(ddata->dev, "charger needs phy, deferring probe\n"); in cpcap_charger_probe()
886 cpcap_charger_init_optional_gpios(ddata); in cpcap_charger_probe()
888 schedule_delayed_work(&ddata->detect_work, 0); in cpcap_charger_probe()
895 struct cpcap_charger_ddata *ddata = platform_get_drvdata(pdev); in cpcap_charger_remove() local
898 atomic_set(&ddata->active, 0); in cpcap_charger_remove()
901 dev_warn(ddata->dev, "could not clear USB comparator: %i\n", in cpcap_charger_remove()
904 error = cpcap_charger_set_state(ddata, 0, 0, 0); in cpcap_charger_remove()
906 dev_warn(ddata->dev, "could not clear charger: %i\n", in cpcap_charger_remove()
908 cancel_delayed_work_sync(&ddata->vbus_work); in cpcap_charger_remove()
909 cancel_delayed_work_sync(&ddata->detect_work); in cpcap_charger_remove()