From: <far...@us...> - 2006-12-07 15:49:27
|
Revision: 695 http://svn.sourceforge.net/hackndev/?rev=695&view=rev Author: farcaller Date: 2006-12-07 07:49:20 -0800 (Thu, 07 Dec 2006) Log Message: ----------- l4p: new release of battchargemon Modified Paths: -------------- linux4palm/linux/trunk/drivers/misc/battchargemon.c linux4palm/linux/trunk/include/linux/battchargemon.h Modified: linux4palm/linux/trunk/drivers/misc/battchargemon.c =================================================================== --- linux4palm/linux/trunk/drivers/misc/battchargemon.c 2006-12-03 17:25:38 UTC (rev 694) +++ linux4palm/linux/trunk/drivers/misc/battchargemon.c 2006-12-07 15:49:20 UTC (rev 695) @@ -25,26 +25,43 @@ return sprintf(buf, "%s\n", bat->id); } +static ssize_t battery_show_charge(struct class_device *cdev, char *buf) { + int v_normalized, v_max_normalized, voltage, charge; + struct battery *bat = container_of(cdev, struct battery, class_dev); + voltage = bat->get_voltage(bat); + v_normalized = voltage - bat->min_voltage; + v_normalized = (v_normalized>0) ? v_normalized : 0; + v_max_normalized = bat->max_voltage - bat->min_voltage; + charge = v_normalized * 100 / v_max_normalized; + charge = (charge>0) ? (charge<100?charge:100) : 0; + return sprintf(buf, "%d%%\n", charge); +} + static ssize_t charger_show_id(struct class_device *cdev, char *buf) { struct charger *bat = container_of(cdev, struct charger, class_dev); return sprintf(buf, "%s\n", bat->id); } +static ssize_t battery_show_voltage(struct class_device *cdev, char *buf) { + struct battery *cl = container_of(cdev, struct battery, class_dev); + return sprintf(buf, "%d\n", cl->get_voltage(cl)); +} + +static ssize_t charger_show_status(struct class_device *cdev, char *buf) { + struct charger *cl = container_of(cdev, struct charger, class_dev); + return sprintf(buf, "%d\n", cl->get_status(cl)); +} + #define show_int_val(_class, _name) \ static ssize_t _class##_show_##_name(struct class_device *cdev, char *buf) { \ struct _class *cl = container_of(cdev, struct _class, class_dev); \ - if (cl->get_##_name) \ - return sprintf(buf, "%d\n", cl->get_##_name(cl)); \ - return 0; \ + return sprintf(buf, "%d\n", cl->_name); \ } show_int_val(battery, min_voltage); show_int_val(battery, max_voltage); -show_int_val(battery, voltage); -show_int_val(battery, current); +show_int_val(battery, v_current); show_int_val(battery, temp); -show_int_val(battery, charge); -show_int_val(charger, status); static struct class battery_class = { .name = "battery", @@ -68,7 +85,7 @@ static CLS_DEV_ATTR (battery, min_voltage, 0444, battery_show_min_voltage, NULL); static CLS_DEV_ATTR (battery, max_voltage, 0444, battery_show_max_voltage, NULL); static CLS_DEV_ATTR (battery, voltage, 0444, battery_show_voltage, NULL); -static CLS_DEV_ATTR (battery, current, 0444, battery_show_current, NULL); +static CLS_DEV_ATTR (battery, v_current, 0444, battery_show_v_current, NULL); static CLS_DEV_ATTR (battery, temp, 0444, battery_show_temp, NULL); static CLS_DEV_ATTR (battery, charge, 0444, battery_show_charge, NULL); @@ -78,12 +95,16 @@ /**** class registration ****/ #define create_entry_conditional(_name) \ -if(bat->get_##_name) \ - class_device_create_file(&bat->class_dev, &battery_class_device_attr_##_name); + if(bat->_name != -1) \ + class_device_create_file(&bat->class_dev, &battery_class_device_attr_##_name); int battery_class_register(struct battery *bat) { int rc = 0; + + // init list + bat->attached_chargers.next = &bat->attached_chargers; + bat->attached_chargers.prev = &bat->attached_chargers; WARN_ON(!bat->name); bat->class_dev.class = &battery_class; @@ -96,10 +117,17 @@ class_device_create_file(&bat->class_dev, &battery_class_device_attr_id); create_entry_conditional(min_voltage); create_entry_conditional(max_voltage); - create_entry_conditional(voltage); - create_entry_conditional(current); + create_entry_conditional(v_current); create_entry_conditional(temp); - create_entry_conditional(charge); + printk(KERN_ERR "\n\n\tBATT: gw = 0x%p\n", bat->get_voltage); + if(bat->get_voltage) { + class_device_create_file(&bat->class_dev, &battery_class_device_attr_voltage); + printk(KERN_ERR "BATT: adding voltage\n"); + if((bat->min_voltage != -1) && (bat->max_voltage != -1)) { + class_device_create_file(&bat->class_dev, &battery_class_device_attr_charge); + printk(KERN_ERR "BATT: and charge\n"); + } + } out: return rc; @@ -115,7 +143,6 @@ int charger_class_register(struct charger *cha) { int rc = 0; - WARN_ON(!cha->name); cha->class_dev.class = &charger_class; strcpy(cha->class_dev.class_id, cha->name); @@ -125,8 +152,7 @@ if(cha->id) class_device_create_file(&cha->class_dev, &charger_class_device_attr_id); - if(cha->get_status) - class_device_create_file(&cha->class_dev, &charger_class_device_attr_status); + class_device_create_file(&cha->class_dev, &charger_class_device_attr_status); out: return rc; @@ -139,13 +165,50 @@ } EXPORT_SYMBOL (charger_class_unregister); +/**** cherger attaching ****/ + +// FIXME: there's no way to attach one charger to two batteries using lists.h +// possible workarounds: implement own linked list? +int battery_attach_charger(struct battery *batt, struct charger *cha) +{ + // TODO: do we need to grab charger device driver here? it would be removed + // anyway in correctly written driver... + list_add(&cha->list, &batt->attached_chargers); + printk(KERN_ERR "BATT: Adding %s to %s chargers\n", cha->name, batt->name); + return 0; +} +EXPORT_SYMBOL(battery_attach_charger); + +int battery_remove_charger(struct battery *batt, struct charger *cha) +{ + list_del(&cha->list); + return 0; +} +EXPORT_SYMBOL(battery_remove_charger); + +void battery_update_charge_link(struct battery *batt) +{ + struct charger *cha; + sysfs_remove_link(&batt->class_dev.kobj, "charger"); + list_for_each_entry(cha, &batt->attached_chargers, list) { + printk(KERN_ERR "BATT: LL: %s = %d\n", cha->name, cha->get_status(cha)); + if(cha->get_status(cha)) { + sysfs_create_link(&batt->class_dev.kobj, &cha->class_dev.kobj, "charger"); + printk(KERN_ERR "BATT: LL: linked\n"); + return; + } + } +} +EXPORT_SYMBOL(battery_update_charge_link); + /**** module init/exit ****/ static int __init battcharge_class_init(void) { int ret = class_register(&battery_class); - if(likely(ret)) { - if(likely((ret = class_register(&charger_class)) == 0)) { + if(!ret) { + ret = class_register(&charger_class); + if(!ret) { return 0; } else { class_unregister(&battery_class); Modified: linux4palm/linux/trunk/include/linux/battchargemon.h =================================================================== --- linux4palm/linux/trunk/include/linux/battchargemon.h 2006-12-03 17:25:38 UTC (rev 694) +++ linux4palm/linux/trunk/include/linux/battchargemon.h 2006-12-07 15:49:20 UTC (rev 695) @@ -18,15 +18,16 @@ struct class_device class_dev; const char *name; char *id; - int (*get_min_voltage)(struct battery *); - int (*get_max_voltage)(struct battery *); - int (*get_voltage)(struct battery *); - int (*get_current)(struct battery *); + int min_voltage; + int max_voltage; + + int v_current; + int temp; - int (*get_temp)(struct battery *); + int (*get_voltage)(struct battery *); - int (*get_charge)(struct battery *); + struct list_head attached_chargers; }; struct charger { @@ -37,11 +38,19 @@ #define CHARGER_DISCONNECTED 0 #define CHARGER_CONNECTED 1 int (*get_status)(struct charger *); + + struct list_head list; }; extern int battery_class_register(struct battery *); extern void battery_class_unregister(struct battery *); +extern int charger_class_register(struct charger *); +extern void charger_class_unregister(struct charger *); +extern int battery_attach_charger(struct battery *batt, struct charger *cha); +extern int battery_remove_charger(struct battery *batt, struct charger *cha); +extern void battery_update_charge_link(struct battery *batt); + #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |