From 791a318ed73c8a417dc15202e784000f4924dfc5 Mon Sep 17 00:00:00 2001 From: Zain Wang Date: Mon, 13 Jan 2025 10:08:05 +0800 Subject: [PATCH] power: supply: rk816-battery: try to get extcon from battery node Extcon is useless for rk808 driver, move extcon definition to battery node. Change-Id: Ifb4cf8b132a0a397e651699d27cfb86c415be9dd Signed-off-by: Zain Wang --- drivers/power/supply/rk816_battery.c | 41 +++++++++++++++++++--------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/drivers/power/supply/rk816_battery.c b/drivers/power/supply/rk816_battery.c index c703414125dd..3c58315c1d27 100644 --- a/drivers/power/supply/rk816_battery.c +++ b/drivers/power/supply/rk816_battery.c @@ -4247,6 +4247,13 @@ static enum charger_t rk816_bat_init_dc_det(struct rk816_battery *di) return type; } +static int rk816_get_edev(struct rk816_battery *di, struct device *dev) +{ + di->cable_edev = extcon_get_edev_by_phandle(dev, 0); + + return IS_ERR(di->cable_edev) ? PTR_ERR(di->cable_edev) : 0; +} + static int rk816_bat_init_charger(struct rk816_battery *di) { enum charger_t dc_charger; @@ -4260,12 +4267,15 @@ static int rk816_bat_init_charger(struct rk816_battery *di) INIT_DELAYED_WORK(&di->dc_delay_work, rk816_bat_dc_delay_work); /* Find extcon phandle */ - edev = extcon_get_edev_by_phandle(dev->parent, 0); - if (IS_ERR(edev)) { - if (PTR_ERR(edev) != -EPROBE_DEFER) - dev_err(dev, "Invalid or missing extcon\n"); - return PTR_ERR(edev); + ret = rk816_get_edev(di, dev); + if (ret) { + if (ret == -EPROBE_DEFER) + return ret; + ret = rk816_get_edev(di, dev->parent); + if (ret) + return dev_err_probe(dev, ret, "Can't find extcon\n"); } + edev = di->cable_edev; /* Register chargers */ INIT_DELAYED_WORK(&di->usb_work, rk816_bat_charger_evt_worker); @@ -4332,8 +4342,6 @@ static int rk816_bat_init_charger(struct rk816_battery *di) return ret; } - di->cable_edev = edev; - /* Check usb and otg state */ schedule_delayed_work(&di->host_work, 0); schedule_delayed_work(&di->usb_work, 0); @@ -4737,12 +4745,15 @@ static int rk816_bat_parse_dt(struct rk816_battery *di) else pdata->zero_algorithm_vol = DEFAULT_ALGR_VOL_THRESD1; - pdata->extcon = device_property_read_bool(dev->parent, "extcon"); - if (!pdata->extcon) { + if (!device_property_read_bool(dev, "extcon") && + !device_property_read_bool(dev->parent, "extcon")) { dev_err(dev, "Can't find extcon node under rk816 node\n"); return -EINVAL; } + /* FIXME: extcon false case ?? */ + pdata->extcon = true; + /* parse unnecessary param */ of_property_read_u32(np, "sample_res", &pdata->sample_res); @@ -4952,7 +4963,10 @@ static int rk816_battery_probe(struct platform_device *pdev) rk816_bat_init_info(di); rk816_bat_init_fg(di); rk816_bat_init_leds(di); - rk816_bat_init_charger(di); + ret = rk816_bat_init_charger(di); + if (ret) + goto bat_fail; + rk816_bat_init_sysfs(di); rk816_bat_register_fb_notify(di); wake_lock_init(&di->wake_lock, WAKE_LOCK_SUSPEND, "rk816_bat_lock"); @@ -4974,12 +4988,13 @@ static int rk816_battery_probe(struct platform_device *pdev) return 0; irq_fail: + destroy_workqueue(di->bat_monitor_wq); cancel_delayed_work(&di->dc_delay_work); cancel_delayed_work(&di->bat_delay_work); - cancel_delayed_work(&di->calib_delay_work); - destroy_workqueue(di->bat_monitor_wq); - destroy_workqueue(di->usb_charger_wq); rk816_bat_unregister_fb_notify(di); +bat_fail: + cancel_delayed_work(&di->calib_delay_work); + destroy_workqueue(di->usb_charger_wq); del_timer(&di->caltimer); wake_lock_destroy(&di->wake_lock);