be2net: Fix memset() arg ordering.
[safe/jmp/linux-2.6] / drivers / power / power_supply_core.c
index cb1ccb4..cce75b4 100644 (file)
@@ -18,7 +18,9 @@
 #include <linux/power_supply.h>
 #include "power_supply.h"
 
+/* exported for the APM Power driver, APM emulation */
 struct class *power_supply_class;
+EXPORT_SYMBOL_GPL(power_supply_class);
 
 static int __power_supply_changed_work(struct device *dev, void *data)
 {
@@ -55,6 +57,7 @@ void power_supply_changed(struct power_supply *psy)
 
        schedule_work(&psy->changed_work);
 }
+EXPORT_SYMBOL_GPL(power_supply_changed);
 
 static int __power_supply_am_i_supplied(struct device *dev, void *data)
 {
@@ -86,13 +89,67 @@ int power_supply_am_i_supplied(struct power_supply *psy)
 
        return error;
 }
+EXPORT_SYMBOL_GPL(power_supply_am_i_supplied);
+
+static int __power_supply_is_system_supplied(struct device *dev, void *data)
+{
+       union power_supply_propval ret = {0,};
+       struct power_supply *psy = dev_get_drvdata(dev);
+
+       if (psy->type != POWER_SUPPLY_TYPE_BATTERY) {
+               if (psy->get_property(psy, POWER_SUPPLY_PROP_ONLINE, &ret))
+                       return 0;
+               if (ret.intval)
+                       return ret.intval;
+       }
+       return 0;
+}
+
+int power_supply_is_system_supplied(void)
+{
+       int error;
+
+       error = class_for_each_device(power_supply_class, NULL, NULL,
+                                     __power_supply_is_system_supplied);
+
+       return error;
+}
+EXPORT_SYMBOL_GPL(power_supply_is_system_supplied);
+
+int power_supply_set_battery_charged(struct power_supply *psy)
+{
+       if (psy->type == POWER_SUPPLY_TYPE_BATTERY && psy->set_charged) {
+               psy->set_charged(psy);
+               return 0;
+       }
+
+       return -EINVAL;
+}
+EXPORT_SYMBOL_GPL(power_supply_set_battery_charged);
+
+static int power_supply_match_device_by_name(struct device *dev, void *data)
+{
+       const char *name = data;
+       struct power_supply *psy = dev_get_drvdata(dev);
+
+       return strcmp(psy->name, name) == 0;
+}
+
+struct power_supply *power_supply_get_by_name(char *name)
+{
+       struct device *dev = class_find_device(power_supply_class, NULL, name,
+                                       power_supply_match_device_by_name);
+
+       return dev ? dev_get_drvdata(dev) : NULL;
+}
+EXPORT_SYMBOL_GPL(power_supply_get_by_name);
 
 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);
+       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;
@@ -120,6 +177,7 @@ dev_create_failed:
 success:
        return rc;
 }
+EXPORT_SYMBOL_GPL(power_supply_register);
 
 void power_supply_unregister(struct power_supply *psy)
 {
@@ -128,6 +186,7 @@ void power_supply_unregister(struct power_supply *psy)
        power_supply_remove_attrs(psy);
        device_unregister(psy->dev);
 }
+EXPORT_SYMBOL_GPL(power_supply_unregister);
 
 static int __init power_supply_class_init(void)
 {
@@ -146,14 +205,6 @@ static void __exit power_supply_class_exit(void)
        class_destroy(power_supply_class);
 }
 
-EXPORT_SYMBOL_GPL(power_supply_changed);
-EXPORT_SYMBOL_GPL(power_supply_am_i_supplied);
-EXPORT_SYMBOL_GPL(power_supply_register);
-EXPORT_SYMBOL_GPL(power_supply_unregister);
-
-/* exported for the APM Power driver, APM emulation */
-EXPORT_SYMBOL_GPL(power_supply_class);
-
 subsys_initcall(power_supply_class_init);
 module_exit(power_supply_class_exit);