X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=drivers%2Fpower%2Fpower_supply_core.c;h=cb1ccb4729210c1a3cfd8901bf7dea5c56117146;hb=228428428138e231a155464239880201e5cc8b44;hp=e87ea515675568dc7e67aa7fb0eb2310cbe9916c;hpb=2f41fc806434f8466bb361570589a3f6099ca65d;p=linux-2.6 diff --git a/drivers/power/power_supply_core.c b/drivers/power/power_supply_core.c index e87ea51567..cb1ccb4729 100644 --- a/drivers/power/power_supply_core.c +++ b/drivers/power/power_supply_core.c @@ -20,86 +20,84 @@ struct class *power_supply_class; -static void power_supply_changed_work(struct work_struct *work) +static int __power_supply_changed_work(struct device *dev, void *data) { - struct power_supply *psy = container_of(work, struct power_supply, - changed_work); + struct power_supply *psy = (struct power_supply *)data; + struct power_supply *pst = dev_get_drvdata(dev); int i; - dev_dbg(psy->dev, "%s\n", __FUNCTION__); + for (i = 0; i < psy->num_supplicants; i++) + if (!strcmp(psy->supplied_to[i], pst->name)) { + if (pst->external_power_changed) + pst->external_power_changed(pst); + } + return 0; +} - for (i = 0; i < psy->num_supplicants; i++) { - struct device *dev; +static void power_supply_changed_work(struct work_struct *work) +{ + struct power_supply *psy = container_of(work, struct power_supply, + changed_work); - down(&power_supply_class->sem); - list_for_each_entry(dev, &power_supply_class->devices, node) { - struct power_supply *pst = dev_get_drvdata(dev); + dev_dbg(psy->dev, "%s\n", __func__); - if (!strcmp(psy->supplied_to[i], pst->name)) { - if (pst->external_power_changed) - pst->external_power_changed(pst); - } - } - up(&power_supply_class->sem); - } + class_for_each_device(power_supply_class, NULL, psy, + __power_supply_changed_work); power_supply_update_leds(psy); kobject_uevent(&psy->dev->kobj, KOBJ_CHANGE); - - return; } void power_supply_changed(struct power_supply *psy) { - dev_dbg(psy->dev, "%s\n", __FUNCTION__); + dev_dbg(psy->dev, "%s\n", __func__); schedule_work(&psy->changed_work); - - return; } -int power_supply_am_i_supplied(struct power_supply *psy) +static int __power_supply_am_i_supplied(struct device *dev, void *data) { union power_supply_propval ret = {0,}; - struct device *dev; - - down(&power_supply_class->sem); - list_for_each_entry(dev, &power_supply_class->devices, node) { - struct power_supply *epsy = dev_get_drvdata(dev); - int i; - - for (i = 0; i < epsy->num_supplicants; i++) { - if (!strcmp(epsy->supplied_to[i], psy->name)) { - if (epsy->get_property(epsy, - POWER_SUPPLY_PROP_ONLINE, &ret)) - continue; - if (ret.intval) - goto out; - } + struct power_supply *psy = (struct power_supply *)data; + struct power_supply *epsy = dev_get_drvdata(dev); + int i; + + for (i = 0; i < epsy->num_supplicants; i++) { + if (!strcmp(epsy->supplied_to[i], psy->name)) { + if (epsy->get_property(epsy, + POWER_SUPPLY_PROP_ONLINE, &ret)) + continue; + if (ret.intval) + return ret.intval; } } -out: - up(&power_supply_class->sem); + return 0; +} + +int power_supply_am_i_supplied(struct power_supply *psy) +{ + int error; + + error = class_for_each_device(power_supply_class, NULL, psy, + __power_supply_am_i_supplied); - dev_dbg(psy->dev, "%s %d\n", __FUNCTION__, ret.intval); + dev_dbg(psy->dev, "%s %d\n", __func__, error); - return ret.intval; + return error; } int power_supply_register(struct device *parent, struct power_supply *psy) { int rc = 0; - psy->dev = device_create(power_supply_class, parent, 0, - "%s", psy->name); + 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; } - dev_set_drvdata(psy->dev, psy); - INIT_WORK(&psy->changed_work, power_supply_changed_work); rc = power_supply_create_attrs(psy); @@ -129,7 +127,6 @@ void power_supply_unregister(struct power_supply *psy) power_supply_remove_triggers(psy); power_supply_remove_attrs(psy); device_unregister(psy->dev); - return; } static int __init power_supply_class_init(void) @@ -147,7 +144,6 @@ static int __init power_supply_class_init(void) static void __exit power_supply_class_exit(void) { class_destroy(power_supply_class); - return; } EXPORT_SYMBOL_GPL(power_supply_changed);