Lines Matching +full:ac +full:- +full:charger
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Driver for LP8727 Micro/Mini USB IC with integrated charger
79 struct power_supply *ac; member
91 /* Charger Data */
105 mutex_lock(&pchg->xfer_lock); in lp8727_read_bytes()
106 ret = i2c_smbus_read_i2c_block_data(pchg->client, reg, len, data); in lp8727_read_bytes()
107 mutex_unlock(&pchg->xfer_lock); in lp8727_read_bytes()
109 return (ret != len) ? -EIO : 0; in lp8727_read_bytes()
121 mutex_lock(&pchg->xfer_lock); in lp8727_write_byte()
122 ret = i2c_smbus_write_byte_data(pchg->client, reg, data); in lp8727_write_byte()
123 mutex_unlock(&pchg->xfer_lock); in lp8727_write_byte()
130 if (!strcmp(name, "ac")) in lp8727_is_charger_attached()
181 struct lp8727_platform_data *pdata = pchg->pdata; in lp8727_id_detection()
188 pchg->chg_param = pdata ? pdata->ac : NULL; in lp8727_id_detection()
192 pchg->chg_param = pdata ? pdata->ac : NULL; in lp8727_id_detection()
195 pchg->chg_param = pdata ? pdata->usb : NULL; in lp8727_id_detection()
205 pchg->chg_param = NULL; in lp8727_id_detection()
209 pchg->devid = devid; in lp8727_id_detection()
231 dev_err(pchg->dev, "can not read INT registers\n"); in lp8727_delayed_func()
241 power_supply_changed(pchg->psy->ac); in lp8727_delayed_func()
242 power_supply_changed(pchg->psy->usb); in lp8727_delayed_func()
243 power_supply_changed(pchg->psy->batt); in lp8727_delayed_func()
250 schedule_delayed_work(&pchg->work, pchg->debounce_jiffies); in lp8727_isr_func()
257 int irq = pchg->client->irq; in lp8727_setup_irq()
258 unsigned delay_msec = pchg->pdata ? pchg->pdata->debounce_msec : in lp8727_setup_irq()
261 INIT_DELAYED_WORK(&pchg->work, lp8727_delayed_func); in lp8727_setup_irq()
264 dev_warn(pchg->dev, "invalid irq number: %d\n", irq); in lp8727_setup_irq()
275 pchg->irq = irq; in lp8727_setup_irq()
276 pchg->debounce_jiffies = msecs_to_jiffies(delay_msec); in lp8727_setup_irq()
283 cancel_delayed_work_sync(&pchg->work); in lp8727_release_irq()
285 if (pchg->irq) in lp8727_release_irq()
286 free_irq(pchg->irq, pchg); in lp8727_release_irq()
310 struct lp8727_chg *pchg = dev_get_drvdata(psy->dev.parent); in lp8727_charger_get_property()
313 return -EINVAL; in lp8727_charger_get_property()
315 val->intval = lp8727_is_charger_attached(psy->desc->name, pchg->devid); in lp8727_charger_get_property()
336 struct lp8727_chg *pchg = dev_get_drvdata(psy->dev.parent); in lp8727_battery_get_property()
337 struct lp8727_platform_data *pdata = pchg->pdata; in lp8727_battery_get_property()
343 if (!lp8727_is_charger_attached(psy->desc->name, pchg->devid)) { in lp8727_battery_get_property()
344 val->intval = POWER_SUPPLY_STATUS_DISCHARGING; in lp8727_battery_get_property()
350 val->intval = (read & LP8727_CHGSTAT) == LP8727_STAT_EOC ? in lp8727_battery_get_property()
358 val->intval = lp8727_is_high_temperature(temp) ? in lp8727_battery_get_property()
364 return -EINVAL; in lp8727_battery_get_property()
366 if (pdata->get_batt_present) in lp8727_battery_get_property()
367 val->intval = pdata->get_batt_present(); in lp8727_battery_get_property()
371 return -EINVAL; in lp8727_battery_get_property()
373 if (pdata->get_batt_level) in lp8727_battery_get_property()
374 val->intval = pdata->get_batt_level(); in lp8727_battery_get_property()
378 return -EINVAL; in lp8727_battery_get_property()
380 if (pdata->get_batt_capacity) in lp8727_battery_get_property()
381 val->intval = pdata->get_batt_capacity(); in lp8727_battery_get_property()
385 return -EINVAL; in lp8727_battery_get_property()
387 if (pdata->get_batt_temp) in lp8727_battery_get_property()
388 val->intval = pdata->get_batt_temp(); in lp8727_battery_get_property()
399 struct lp8727_chg *pchg = dev_get_drvdata(psy->dev.parent); in lp8727_charger_changed()
404 /* skip if no charger exists */ in lp8727_charger_changed()
405 if (!lp8727_is_charger_attached(psy->desc->name, pchg->devid)) in lp8727_charger_changed()
409 if (pchg->chg_param) { in lp8727_charger_changed()
410 eoc_level = pchg->chg_param->eoc_level; in lp8727_charger_changed()
411 ichg = pchg->chg_param->ichg; in lp8727_charger_changed()
418 .name = "ac",
444 struct power_supply_config psy_cfg = {}; /* Only for ac and usb */ in lp8727_register_psy()
447 psy = devm_kzalloc(pchg->dev, sizeof(*psy), GFP_KERNEL); in lp8727_register_psy()
449 return -ENOMEM; in lp8727_register_psy()
451 pchg->psy = psy; in lp8727_register_psy()
456 psy->ac = power_supply_register(pchg->dev, &lp8727_ac_desc, &psy_cfg); in lp8727_register_psy()
457 if (IS_ERR(psy->ac)) in lp8727_register_psy()
460 psy->usb = power_supply_register(pchg->dev, &lp8727_usb_desc, in lp8727_register_psy()
462 if (IS_ERR(psy->usb)) in lp8727_register_psy()
465 psy->batt = power_supply_register(pchg->dev, &lp8727_batt_desc, NULL); in lp8727_register_psy()
466 if (IS_ERR(psy->batt)) in lp8727_register_psy()
472 power_supply_unregister(psy->usb); in lp8727_register_psy()
474 power_supply_unregister(psy->ac); in lp8727_register_psy()
476 return -EPERM; in lp8727_register_psy()
481 struct lp8727_psy *psy = pchg->psy; in lp8727_unregister_psy()
486 power_supply_unregister(psy->ac); in lp8727_unregister_psy()
487 power_supply_unregister(psy->usb); in lp8727_unregister_psy()
488 power_supply_unregister(psy->batt); in lp8727_unregister_psy()
501 of_property_read_u8(np, "eoc-level", (u8 *)¶m->eoc_level); in lp8727_parse_charge_pdata()
502 of_property_read_u8(np, "charging-current", (u8 *)¶m->ichg); in lp8727_parse_charge_pdata()
509 struct device_node *np = dev->of_node; in lp8727_parse_dt()
516 return ERR_PTR(-ENOMEM); in lp8727_parse_dt()
518 of_property_read_u32(np, "debounce-ms", &pdata->debounce_msec); in lp8727_parse_dt()
525 of_property_read_string(child, "charger-type", &type); in lp8727_parse_dt()
527 if (!strcmp(type, "ac")) in lp8727_parse_dt()
528 pdata->ac = lp8727_parse_charge_pdata(dev, child); in lp8727_parse_dt()
531 pdata->usb = lp8727_parse_charge_pdata(dev, child); in lp8727_parse_dt()
549 if (!i2c_check_functionality(cl->adapter, I2C_FUNC_SMBUS_I2C_BLOCK)) in lp8727_probe()
550 return -EIO; in lp8727_probe()
552 if (cl->dev.of_node) { in lp8727_probe()
553 pdata = lp8727_parse_dt(&cl->dev); in lp8727_probe()
557 pdata = dev_get_platdata(&cl->dev); in lp8727_probe()
560 pchg = devm_kzalloc(&cl->dev, sizeof(*pchg), GFP_KERNEL); in lp8727_probe()
562 return -ENOMEM; in lp8727_probe()
564 pchg->client = cl; in lp8727_probe()
565 pchg->dev = &cl->dev; in lp8727_probe()
566 pchg->pdata = pdata; in lp8727_probe()
569 mutex_init(&pchg->xfer_lock); in lp8727_probe()
573 dev_err(pchg->dev, "i2c communication err: %d", ret); in lp8727_probe()
579 dev_err(pchg->dev, "power supplies register err: %d", ret); in lp8727_probe()
585 dev_err(pchg->dev, "irq handler err: %d", ret); in lp8727_probe()
624 MODULE_DESCRIPTION("TI/National Semiconductor LP8727 charger driver");