|
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.
|