From: <far...@us...> - 2006-11-03 21:24:17
|
Revision: 661 http://svn.sourceforge.net/hackndev/?rev=661&view=rev Author: farcaller Date: 2006-11-03 13:23:57 -0800 (Fri, 03 Nov 2006) Log Message: ----------- l4p: made battchargemon usable 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-11-03 20:09:33 UTC (rev 660) +++ linux4palm/linux/trunk/drivers/misc/battchargemon.c 2006-11-03 21:23:57 UTC (rev 661) @@ -19,9 +19,35 @@ #include <linux/device.h> #include <linux/battchargemon.h> +#define DEB(s) printk(KERN_ERR s "\n"); +/**** handlers ****/ +static ssize_t battery_show_id(struct class_device *cdev, char *buf) { + struct battery *bat = container_of(cdev, struct battery, class_dev); + return sprintf(buf, "%s\n", bat->id); +} +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); +} +#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; \ +} + +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, temp); +show_int_val(battery, charge); +show_int_val(charger, status); + static struct class battery_class = { .name = "battery", // .hotplug = battery_class_hotplug, @@ -32,9 +58,95 @@ .name = "charger", }; +#define CLS_DEV_ATTR(_class, _name, _mode, _show, _store) \ + struct class_device_attribute _class##_class_device_attr_##_name = { \ + .attr = { .name = #_name, .mode = _mode, .owner = THIS_MODULE }, \ + .show = _show, \ + .store = _store, \ + } + +/**** device attributes ****/ +static CLS_DEV_ATTR (battery, id, 0444, battery_show_id, NULL); +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, temp, 0444, battery_show_temp, NULL); +static CLS_DEV_ATTR (battery, charge, 0444, battery_show_charge, NULL); + +static CLS_DEV_ATTR (charger, id, 0444, charger_show_id, NULL); +static CLS_DEV_ATTR (charger, status, 0444, charger_show_status, NULL); + +/**** class registration ****/ + +#define create_entry_conditional(_name) \ +if(bat->get_##_name) \ + class_device_create_file(&bat->class_dev, &battery_class_device_attr_##_name); + +int battery_class_register(struct battery *bat) +{ + int rc = 0; + + WARN_ON(!bat->name); + bat->class_dev.class = &battery_class; + strcpy(bat->class_dev.class_id, bat->name); + rc = class_device_register(&bat->class_dev); + if(rc) + goto out; + + if(bat->id) + 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(temp); + create_entry_conditional(charge); + +out: + return rc; +} +EXPORT_SYMBOL (battery_class_register); + +void battery_class_unregister (struct battery *bat) +{ + class_device_unregister(&bat->class_dev); +} +EXPORT_SYMBOL (battery_class_unregister); + +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); + rc = class_device_register(&cha->class_dev); + if(rc) + goto out; + + 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); + +out: + return rc; +} +EXPORT_SYMBOL (charger_class_register); + +void charger_class_unregister (struct charger *cha) +{ + class_device_unregister(&cha->class_dev); +} +EXPORT_SYMBOL (charger_class_unregister); + +/**** module init/exit ****/ + static int __init battcharge_class_init(void) { int ret = class_register(&battery_class); + DEB("initializing battcharge"); if(likely(ret)) { if(likely((ret = class_register(&charger_class)) == 0)) { return 0; @@ -47,6 +159,7 @@ static void __exit battcharge_class_exit(void) { + DEB("modexit"); class_unregister(&charger_class); class_unregister(&battery_class); } Modified: linux4palm/linux/trunk/include/linux/battchargemon.h =================================================================== --- linux4palm/linux/trunk/include/linux/battchargemon.h 2006-11-03 20:09:33 UTC (rev 660) +++ linux4palm/linux/trunk/include/linux/battchargemon.h 2006-11-03 21:23:57 UTC (rev 661) @@ -32,17 +32,13 @@ struct charger { struct class_device class_dev; const char *name; + char *id; #define CHARGER_DISCONNECTED 0 #define CHARGER_CONNECTED 1 int (*get_status)(struct charger *); }; -#define BATTERY_STATUS_UNKNOWN 0 -#define BATTERY_STATUS_CHARGING 1 -#define BATTERY_STATUS_DISCHARGING 2 -#define BATTERY_STATUS_NOT_CHARGING 3 - extern int battery_class_register(struct battery *); extern void battery_class_unregister(struct battery *); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |