int power_supply_register(struct device *parent, struct power_supply *psy) { int rc = 0; psy->dev = device_create_drvdata(power_supply_class, parent, 0, psy, "%s", psy->name); if (IS_ERR(psy->dev)) { rc = PTR_ERR(psy->dev); goto dev_create_failed; } INIT_WORK(&psy->changed_work, power_supply_changed_work); rc = power_supply_create_attrs(psy); if (rc) goto create_attrs_failed; rc = power_supply_create_triggers(psy); if (rc) goto create_triggers_failed; power_supply_changed(psy); goto success; create_triggers_failed: power_supply_remove_attrs(psy); create_attrs_failed: device_unregister(psy->dev); dev_create_failed: success: return rc; }
int power_supply_register(struct device *parent, struct power_supply *psy) { int rc = 0; psy->dev = device_create(power_supply_class, parent, 0, psy, "%s", psy->name); if (IS_ERR(psy->dev)) { rc = PTR_ERR(psy->dev); goto dev_create_failed; } INIT_WORK(&psy->changed_work, power_supply_changed_work); spin_lock_init(&psy->changed_lock); wake_lock_init(&psy->work_wake_lock, WAKE_LOCK_SUSPEND, "power-supply"); rc = power_supply_create_attrs(psy); if (rc) goto create_attrs_failed; rc = power_supply_create_triggers(psy); if (rc) goto create_triggers_failed; power_supply_changed(psy); goto success; create_triggers_failed: power_supply_remove_attrs(psy); create_attrs_failed: wake_lock_destroy(&psy->work_wake_lock); device_unregister(psy->dev); dev_create_failed: success: return rc; }