diff --git a/drivers/power/supply/bq25890_charger.c b/drivers/power/supply/bq25890_charger.c index e740375cf034eef9a08fe2e6fe8e0d6af8dc68fe..cb3543cef59c9f9e441db248c90e74c8b8ab4d15 100644 --- a/drivers/power/supply/bq25890_charger.c +++ b/drivers/power/supply/bq25890_charger.c @@ -872,6 +872,13 @@ static void bq25890_external_power_changed(struct power_supply *psy) struct power_supply *psy_supply; union power_supply_propval val; + /* + * This function can be called before bq->charger is set; returning early + * is fine because it will be re-run at the end of the probe. + */ + if (!bq->charger) + return; + supplied = power_supply_am_i_supplied(bq->charger); dev_info(bq->dev, "Upstream supply changed: %d.\n", supplied); @@ -926,8 +933,9 @@ static int bq25890_power_supply_init(struct bq25890_device *bq) psy_cfg.num_supplicants = ARRAY_SIZE(bq25890_charger_supplied_to); psy_cfg.of_node = bq->dev->of_node; - bq->charger = power_supply_register(bq->dev, &bq25890_power_supply_desc, - &psy_cfg); + bq->charger = devm_power_supply_register(bq->dev, + &bq25890_power_supply_desc, + &psy_cfg); return PTR_ERR_OR_ZERO(bq->charger); } @@ -1217,32 +1225,30 @@ static int bq25890_probe(struct i2c_client *client, } else dev_info(dev, "No otg gpio found"); + ret = bq25890_power_supply_init(bq); + if (ret < 0) { + dev_err(dev, "Failed to register power supply\n"); + goto err_unregister_usb_notifier; + } + ret = devm_request_threaded_irq(dev, client->irq, NULL, bq25890_irq_handler_thread, IRQF_TRIGGER_FALLING | IRQF_ONESHOT, BQ25890_IRQ_PIN, bq); if (ret) - goto irq_fail; - - ret = bq25890_power_supply_init(bq); - if (ret < 0) { - dev_err(dev, "Failed to register power supply\n"); - goto irq_fail; - } + goto err_unregister_usb_notifier; ret = bq25890_battery_init(bq); if (ret < 0) { dev_err(dev, "Failed get battery information\n"); - goto battery_fail; + goto err_unregister_usb_notifier; } bq25890_external_power_changed(bq->charger); return 0; -battery_fail: - power_supply_unregister(bq->charger); -irq_fail: +err_unregister_usb_notifier: if (!IS_ERR_OR_NULL(bq->usb_phy)) usb_unregister_notifier(bq->usb_phy, &bq->usb_nb); @@ -1253,8 +1259,6 @@ static int bq25890_remove(struct i2c_client *client) { struct bq25890_device *bq = i2c_get_clientdata(client); - power_supply_unregister(bq->charger); - if (!IS_ERR_OR_NULL(bq->usb_phy)) usb_unregister_notifier(bq->usb_phy, &bq->usb_nb);