linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 3/3]
@ 2008-01-06 12:30 Dmitry Baryshkov
  2008-01-06 22:53 ` Anton Vorontsov
  2008-01-07  2:50 ` [PATCH 3/3] apm_power: Support using VOLTAGE_* properties for apm calculations Anton Vorontsov
  0 siblings, 2 replies; 4+ messages in thread
From: Dmitry Baryshkov @ 2008-01-06 12:30 UTC (permalink / raw)
  To: cbouatmailru, linux-kernel, cbou, dwmw2

Support using VOLTAGE_* properties for apm calculations. It's pretty
dummy, but useful for batteries for which we can only get voltages.

diff --git a/drivers/power/apm_power.c b/drivers/power/apm_power.c
index bbf3ee1..526c96e 100644
--- a/drivers/power/apm_power.c
+++ b/drivers/power/apm_power.c
@@ -13,6 +13,12 @@
 #include <linux/power_supply.h>
 #include <linux/apm-emulation.h>
 
+typedef enum {
+	SOURCE_ENERGY,
+	SOURCE_CHARGE,
+	SOURCE_VOLTAGE,
+} apm_source;
+
 #define PSY_PROP(psy, prop, val) psy->get_property(psy, \
 			 POWER_SUPPLY_PROP_##prop, val)
 
@@ -87,7 +93,7 @@ static void find_main_battery(void)
 	}
 }
 
-static int calculate_time(int status, int using_charge)
+static int calculate_time(int status, apm_source source)
 {
 	union power_supply_propval full;
 	union power_supply_propval empty;
@@ -106,20 +112,34 @@ static int calculate_time(int status, int using_charge)
 			return -1;
 	}
 
-	if (using_charge) {
+	switch (source) {
+	case SOURCE_CHARGE:
 		full_prop = POWER_SUPPLY_PROP_CHARGE_FULL;
 		full_design_prop = POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN;
 		empty_prop = POWER_SUPPLY_PROP_CHARGE_EMPTY;
 		empty_design_prop = POWER_SUPPLY_PROP_CHARGE_EMPTY;
 		cur_avg_prop = POWER_SUPPLY_PROP_CHARGE_AVG;
 		cur_now_prop = POWER_SUPPLY_PROP_CHARGE_NOW;
-	} else {
+		break;
+	case SOURCE_ENERGY:
 		full_prop = POWER_SUPPLY_PROP_ENERGY_FULL;
 		full_design_prop = POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN;
 		empty_prop = POWER_SUPPLY_PROP_ENERGY_EMPTY;
 		empty_design_prop = POWER_SUPPLY_PROP_CHARGE_EMPTY;
 		cur_avg_prop = POWER_SUPPLY_PROP_ENERGY_AVG;
 		cur_now_prop = POWER_SUPPLY_PROP_ENERGY_NOW;
+		break;
+	case SOURCE_VOLTAGE:
+		full_prop = POWER_SUPPLY_PROP_VOLTAGE_MAX;
+		full_design_prop = POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN;
+		empty_prop = POWER_SUPPLY_PROP_VOLTAGE_MIN;
+		empty_design_prop = POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN;
+		cur_avg_prop = POWER_SUPPLY_PROP_VOLTAGE_AVG;
+		cur_now_prop = POWER_SUPPLY_PROP_VOLTAGE_NOW;
+		break;
+	default:
+		printk(KERN_ERR "Unsupported source: %d\n", source);
+		return -1;
 	}
 
 	if (_MPSY_PROP(full_prop, &full)) {
@@ -146,7 +166,7 @@ static int calculate_time(int status, int using_charge)
 		return -((cur.intval - empty.intval) * 60L) / I.intval;
 }
 
-static int calculate_capacity(int using_charge)
+static int calculate_capacity(apm_source source)
 {
 	enum power_supply_property full_prop, empty_prop;
 	enum power_supply_property full_design_prop, empty_design_prop;
@@ -154,20 +174,33 @@ static int calculate_capacity(int using_charge)
 	union power_supply_propval empty, full, cur;
 	int ret;
 
-	if (using_charge) {
+	switch (source) {
+	case SOURCE_CHARGE:
 		full_prop = POWER_SUPPLY_PROP_CHARGE_FULL;
 		empty_prop = POWER_SUPPLY_PROP_CHARGE_EMPTY;
 		full_design_prop = POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN;
 		empty_design_prop = POWER_SUPPLY_PROP_CHARGE_EMPTY_DESIGN;
 		now_prop = POWER_SUPPLY_PROP_CHARGE_NOW;
 		avg_prop = POWER_SUPPLY_PROP_CHARGE_AVG;
-	} else {
+		break;
+	case SOURCE_ENERGY:
 		full_prop = POWER_SUPPLY_PROP_ENERGY_FULL;
 		empty_prop = POWER_SUPPLY_PROP_ENERGY_EMPTY;
 		full_design_prop = POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN;
 		empty_design_prop = POWER_SUPPLY_PROP_ENERGY_EMPTY_DESIGN;
 		now_prop = POWER_SUPPLY_PROP_ENERGY_NOW;
 		avg_prop = POWER_SUPPLY_PROP_ENERGY_AVG;
+	case SOURCE_VOLTAGE:
+		full_prop = POWER_SUPPLY_PROP_VOLTAGE_MAX;
+		empty_prop = POWER_SUPPLY_PROP_VOLTAGE_MIN;
+		full_design_prop = POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN;
+		empty_design_prop = POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN;
+		now_prop = POWER_SUPPLY_PROP_VOLTAGE_NOW;
+		avg_prop = POWER_SUPPLY_PROP_VOLTAGE_AVG;
+		break;
+	default:
+		printk(KERN_ERR "Unsupported source: %d\n", source);
+		return -1;
 	}
 
 	if (_MPSY_PROP(full_prop, &full)) {
@@ -234,10 +267,12 @@ static void apm_battery_apm_get_power_status(struct apm_power_info *info)
 		info->battery_life = capacity.intval;
 	} else {
 		/* try calculate using energy */
-		info->battery_life = calculate_capacity(0);
+		info->battery_life = calculate_capacity(SOURCE_ENERGY);
 		/* if failed try calculate using charge instead */
 		if (info->battery_life == -1)
-			info->battery_life = calculate_capacity(1);
+			info->battery_life = calculate_capacity(SOURCE_CHARGE);
+		if (info->battery_life == -1)
+			info->battery_life = calculate_capacity(SOURCE_VOLTAGE);
 	}
 
 	/* charging status */
@@ -263,18 +298,22 @@ static void apm_battery_apm_get_power_status(struct apm_power_info *info)
 				!MPSY_PROP(TIME_TO_FULL_NOW, &time_to_full)) {
 			info->time = time_to_full.intval / 60;
 		} else {
-			info->time = calculate_time(status.intval, 0);
+			info->time = calculate_time(status.intval, SOURCE_ENERGY);
 			if (info->time == -1)
-				info->time = calculate_time(status.intval, 1);
+				info->time = calculate_time(status.intval, SOURCE_CHARGE);
+			if (info->time == -1)
+				info->time = calculate_time(status.intval, SOURCE_VOLTAGE);
 		}
 	} else {
 		if (!MPSY_PROP(TIME_TO_EMPTY_AVG, &time_to_empty) ||
 			      !MPSY_PROP(TIME_TO_EMPTY_NOW, &time_to_empty)) {
 			info->time = time_to_empty.intval / 60;
 		} else {
-			info->time = calculate_time(status.intval, 0);
+			info->time = calculate_time(status.intval, SOURCE_ENERGY);
+			if (info->time == -1)
+				info->time = calculate_time(status.intval, SOURCE_CHARGE);
 			if (info->time == -1)
-				info->time = calculate_time(status.intval, 1);
+				info->time = calculate_time(status.intval, SOURCE_VOLTAGE);
 		}
 	}
 
-- 
With best wishes
Dmitry


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 3/3]
  2008-01-06 12:30 [PATCH 3/3] Dmitry Baryshkov
@ 2008-01-06 22:53 ` Anton Vorontsov
  2008-01-06 23:12   ` Dmitry
  2008-01-07  2:50 ` [PATCH 3/3] apm_power: Support using VOLTAGE_* properties for apm calculations Anton Vorontsov
  1 sibling, 1 reply; 4+ messages in thread
From: Anton Vorontsov @ 2008-01-06 22:53 UTC (permalink / raw)
  To: Dmitry Baryshkov; +Cc: linux-kernel, cbou, dwmw2

On Sun, Jan 06, 2008 at 03:30:16PM +0300, Dmitry Baryshkov wrote:
> Support using VOLTAGE_* properties for apm calculations. It's pretty
> dummy, but useful for batteries for which we can only get voltages.

Here Signed-off-by: line is missing, please provide one so I could
apply the patch.

Thanks!

> diff --git a/drivers/power/apm_power.c b/drivers/power/apm_power.c
> index bbf3ee1..526c96e 100644
> --- a/drivers/power/apm_power.c
> +++ b/drivers/power/apm_power.c
> @@ -13,6 +13,12 @@
>  #include <linux/power_supply.h>
>  #include <linux/apm-emulation.h>
>  
> +typedef enum {
> +	SOURCE_ENERGY,
> +	SOURCE_CHARGE,
> +	SOURCE_VOLTAGE,
> +} apm_source;
> +
>  #define PSY_PROP(psy, prop, val) psy->get_property(psy, \
>  			 POWER_SUPPLY_PROP_##prop, val)
>  
> @@ -87,7 +93,7 @@ static void find_main_battery(void)
>  	}
>  }
>  
> -static int calculate_time(int status, int using_charge)
> +static int calculate_time(int status, apm_source source)
>  {
>  	union power_supply_propval full;
>  	union power_supply_propval empty;
> @@ -106,20 +112,34 @@ static int calculate_time(int status, int using_charge)
>  			return -1;
>  	}
>  
> -	if (using_charge) {
> +	switch (source) {
> +	case SOURCE_CHARGE:
>  		full_prop = POWER_SUPPLY_PROP_CHARGE_FULL;
>  		full_design_prop = POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN;
>  		empty_prop = POWER_SUPPLY_PROP_CHARGE_EMPTY;
>  		empty_design_prop = POWER_SUPPLY_PROP_CHARGE_EMPTY;
>  		cur_avg_prop = POWER_SUPPLY_PROP_CHARGE_AVG;
>  		cur_now_prop = POWER_SUPPLY_PROP_CHARGE_NOW;
> -	} else {
> +		break;
> +	case SOURCE_ENERGY:
>  		full_prop = POWER_SUPPLY_PROP_ENERGY_FULL;
>  		full_design_prop = POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN;
>  		empty_prop = POWER_SUPPLY_PROP_ENERGY_EMPTY;
>  		empty_design_prop = POWER_SUPPLY_PROP_CHARGE_EMPTY;
>  		cur_avg_prop = POWER_SUPPLY_PROP_ENERGY_AVG;
>  		cur_now_prop = POWER_SUPPLY_PROP_ENERGY_NOW;
> +		break;
> +	case SOURCE_VOLTAGE:
> +		full_prop = POWER_SUPPLY_PROP_VOLTAGE_MAX;
> +		full_design_prop = POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN;
> +		empty_prop = POWER_SUPPLY_PROP_VOLTAGE_MIN;
> +		empty_design_prop = POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN;
> +		cur_avg_prop = POWER_SUPPLY_PROP_VOLTAGE_AVG;
> +		cur_now_prop = POWER_SUPPLY_PROP_VOLTAGE_NOW;
> +		break;
> +	default:
> +		printk(KERN_ERR "Unsupported source: %d\n", source);
> +		return -1;
>  	}
>  
>  	if (_MPSY_PROP(full_prop, &full)) {
> @@ -146,7 +166,7 @@ static int calculate_time(int status, int using_charge)
>  		return -((cur.intval - empty.intval) * 60L) / I.intval;
>  }
>  
> -static int calculate_capacity(int using_charge)
> +static int calculate_capacity(apm_source source)
>  {
>  	enum power_supply_property full_prop, empty_prop;
>  	enum power_supply_property full_design_prop, empty_design_prop;
> @@ -154,20 +174,33 @@ static int calculate_capacity(int using_charge)
>  	union power_supply_propval empty, full, cur;
>  	int ret;
>  
> -	if (using_charge) {
> +	switch (source) {
> +	case SOURCE_CHARGE:
>  		full_prop = POWER_SUPPLY_PROP_CHARGE_FULL;
>  		empty_prop = POWER_SUPPLY_PROP_CHARGE_EMPTY;
>  		full_design_prop = POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN;
>  		empty_design_prop = POWER_SUPPLY_PROP_CHARGE_EMPTY_DESIGN;
>  		now_prop = POWER_SUPPLY_PROP_CHARGE_NOW;
>  		avg_prop = POWER_SUPPLY_PROP_CHARGE_AVG;
> -	} else {
> +		break;
> +	case SOURCE_ENERGY:
>  		full_prop = POWER_SUPPLY_PROP_ENERGY_FULL;
>  		empty_prop = POWER_SUPPLY_PROP_ENERGY_EMPTY;
>  		full_design_prop = POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN;
>  		empty_design_prop = POWER_SUPPLY_PROP_ENERGY_EMPTY_DESIGN;
>  		now_prop = POWER_SUPPLY_PROP_ENERGY_NOW;
>  		avg_prop = POWER_SUPPLY_PROP_ENERGY_AVG;
> +	case SOURCE_VOLTAGE:
> +		full_prop = POWER_SUPPLY_PROP_VOLTAGE_MAX;
> +		empty_prop = POWER_SUPPLY_PROP_VOLTAGE_MIN;
> +		full_design_prop = POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN;
> +		empty_design_prop = POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN;
> +		now_prop = POWER_SUPPLY_PROP_VOLTAGE_NOW;
> +		avg_prop = POWER_SUPPLY_PROP_VOLTAGE_AVG;
> +		break;
> +	default:
> +		printk(KERN_ERR "Unsupported source: %d\n", source);
> +		return -1;
>  	}
>  
>  	if (_MPSY_PROP(full_prop, &full)) {
> @@ -234,10 +267,12 @@ static void apm_battery_apm_get_power_status(struct apm_power_info *info)
>  		info->battery_life = capacity.intval;
>  	} else {
>  		/* try calculate using energy */
> -		info->battery_life = calculate_capacity(0);
> +		info->battery_life = calculate_capacity(SOURCE_ENERGY);
>  		/* if failed try calculate using charge instead */
>  		if (info->battery_life == -1)
> -			info->battery_life = calculate_capacity(1);
> +			info->battery_life = calculate_capacity(SOURCE_CHARGE);
> +		if (info->battery_life == -1)
> +			info->battery_life = calculate_capacity(SOURCE_VOLTAGE);
>  	}
>  
>  	/* charging status */
> @@ -263,18 +298,22 @@ static void apm_battery_apm_get_power_status(struct apm_power_info *info)
>  				!MPSY_PROP(TIME_TO_FULL_NOW, &time_to_full)) {
>  			info->time = time_to_full.intval / 60;
>  		} else {
> -			info->time = calculate_time(status.intval, 0);
> +			info->time = calculate_time(status.intval, SOURCE_ENERGY);
>  			if (info->time == -1)
> -				info->time = calculate_time(status.intval, 1);
> +				info->time = calculate_time(status.intval, SOURCE_CHARGE);
> +			if (info->time == -1)
> +				info->time = calculate_time(status.intval, SOURCE_VOLTAGE);
>  		}
>  	} else {
>  		if (!MPSY_PROP(TIME_TO_EMPTY_AVG, &time_to_empty) ||
>  			      !MPSY_PROP(TIME_TO_EMPTY_NOW, &time_to_empty)) {
>  			info->time = time_to_empty.intval / 60;
>  		} else {
> -			info->time = calculate_time(status.intval, 0);
> +			info->time = calculate_time(status.intval, SOURCE_ENERGY);
> +			if (info->time == -1)
> +				info->time = calculate_time(status.intval, SOURCE_CHARGE);
>  			if (info->time == -1)
> -				info->time = calculate_time(status.intval, 1);
> +				info->time = calculate_time(status.intval, SOURCE_VOLTAGE);
>  		}
>  	}
>  
> -- 
> With best wishes
> Dmitry
> 

-- 
Anton Vorontsov
email: cbou@mail.ru
backup email: ya-cbou@yandex.ru
irc://irc.freenode.net/bd2

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 3/3]
  2008-01-06 22:53 ` Anton Vorontsov
@ 2008-01-06 23:12   ` Dmitry
  0 siblings, 0 replies; 4+ messages in thread
From: Dmitry @ 2008-01-06 23:12 UTC (permalink / raw)
  To: cbouatmailru; +Cc: linux-kernel, cbou, dwmw2

Hi,

2008/1/7, Anton Vorontsov <cbouatmailru@gmail.com>:
> On Sun, Jan 06, 2008 at 03:30:16PM +0300, Dmitry Baryshkov wrote:
> > Support using VOLTAGE_* properties for apm calculations. It's pretty
> > dummy, but useful for batteries for which we can only get voltages.
>
> Here Signed-off-by: line is missing, please provide one so I could
> apply the patch.

Signed-off-by: Dmitry Baryshkov <dbaryshkov@gmail.com>

:)

>
> Thanks!
>
> > diff --git a/drivers/power/apm_power.c b/drivers/power/apm_power.c
> > index bbf3ee1..526c96e 100644
> > --- a/drivers/power/apm_power.c
> > +++ b/drivers/power/apm_power.c
> > @@ -13,6 +13,12 @@
> >  #include <linux/power_supply.h>
> >  #include <linux/apm-emulation.h>
> >
> > +typedef enum {
> > +     SOURCE_ENERGY,
> > +     SOURCE_CHARGE,
> > +     SOURCE_VOLTAGE,
> > +} apm_source;
> > +
> >  #define PSY_PROP(psy, prop, val) psy->get_property(psy, \
> >                        POWER_SUPPLY_PROP_##prop, val)
> >
> > @@ -87,7 +93,7 @@ static void find_main_battery(void)
> >       }
> >  }
> >
> > -static int calculate_time(int status, int using_charge)
> > +static int calculate_time(int status, apm_source source)
> >  {
> >       union power_supply_propval full;
> >       union power_supply_propval empty;
> > @@ -106,20 +112,34 @@ static int calculate_time(int status, int using_charge)
> >                       return -1;
> >       }
> >
> > -     if (using_charge) {
> > +     switch (source) {
> > +     case SOURCE_CHARGE:
> >               full_prop = POWER_SUPPLY_PROP_CHARGE_FULL;
> >               full_design_prop = POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN;
> >               empty_prop = POWER_SUPPLY_PROP_CHARGE_EMPTY;
> >               empty_design_prop = POWER_SUPPLY_PROP_CHARGE_EMPTY;
> >               cur_avg_prop = POWER_SUPPLY_PROP_CHARGE_AVG;
> >               cur_now_prop = POWER_SUPPLY_PROP_CHARGE_NOW;
> > -     } else {
> > +             break;
> > +     case SOURCE_ENERGY:
> >               full_prop = POWER_SUPPLY_PROP_ENERGY_FULL;
> >               full_design_prop = POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN;
> >               empty_prop = POWER_SUPPLY_PROP_ENERGY_EMPTY;
> >               empty_design_prop = POWER_SUPPLY_PROP_CHARGE_EMPTY;
> >               cur_avg_prop = POWER_SUPPLY_PROP_ENERGY_AVG;
> >               cur_now_prop = POWER_SUPPLY_PROP_ENERGY_NOW;
> > +             break;
> > +     case SOURCE_VOLTAGE:
> > +             full_prop = POWER_SUPPLY_PROP_VOLTAGE_MAX;
> > +             full_design_prop = POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN;
> > +             empty_prop = POWER_SUPPLY_PROP_VOLTAGE_MIN;
> > +             empty_design_prop = POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN;
> > +             cur_avg_prop = POWER_SUPPLY_PROP_VOLTAGE_AVG;
> > +             cur_now_prop = POWER_SUPPLY_PROP_VOLTAGE_NOW;
> > +             break;
> > +     default:
> > +             printk(KERN_ERR "Unsupported source: %d\n", source);
> > +             return -1;
> >       }
> >
> >       if (_MPSY_PROP(full_prop, &full)) {
> > @@ -146,7 +166,7 @@ static int calculate_time(int status, int using_charge)
> >               return -((cur.intval - empty.intval) * 60L) / I.intval;
> >  }
> >
> > -static int calculate_capacity(int using_charge)
> > +static int calculate_capacity(apm_source source)
> >  {
> >       enum power_supply_property full_prop, empty_prop;
> >       enum power_supply_property full_design_prop, empty_design_prop;
> > @@ -154,20 +174,33 @@ static int calculate_capacity(int using_charge)
> >       union power_supply_propval empty, full, cur;
> >       int ret;
> >
> > -     if (using_charge) {
> > +     switch (source) {
> > +     case SOURCE_CHARGE:
> >               full_prop = POWER_SUPPLY_PROP_CHARGE_FULL;
> >               empty_prop = POWER_SUPPLY_PROP_CHARGE_EMPTY;
> >               full_design_prop = POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN;
> >               empty_design_prop = POWER_SUPPLY_PROP_CHARGE_EMPTY_DESIGN;
> >               now_prop = POWER_SUPPLY_PROP_CHARGE_NOW;
> >               avg_prop = POWER_SUPPLY_PROP_CHARGE_AVG;
> > -     } else {
> > +             break;
> > +     case SOURCE_ENERGY:
> >               full_prop = POWER_SUPPLY_PROP_ENERGY_FULL;
> >               empty_prop = POWER_SUPPLY_PROP_ENERGY_EMPTY;
> >               full_design_prop = POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN;
> >               empty_design_prop = POWER_SUPPLY_PROP_ENERGY_EMPTY_DESIGN;
> >               now_prop = POWER_SUPPLY_PROP_ENERGY_NOW;
> >               avg_prop = POWER_SUPPLY_PROP_ENERGY_AVG;
> > +     case SOURCE_VOLTAGE:
> > +             full_prop = POWER_SUPPLY_PROP_VOLTAGE_MAX;
> > +             empty_prop = POWER_SUPPLY_PROP_VOLTAGE_MIN;
> > +             full_design_prop = POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN;
> > +             empty_design_prop = POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN;
> > +             now_prop = POWER_SUPPLY_PROP_VOLTAGE_NOW;
> > +             avg_prop = POWER_SUPPLY_PROP_VOLTAGE_AVG;
> > +             break;
> > +     default:
> > +             printk(KERN_ERR "Unsupported source: %d\n", source);
> > +             return -1;
> >       }
> >
> >       if (_MPSY_PROP(full_prop, &full)) {
> > @@ -234,10 +267,12 @@ static void apm_battery_apm_get_power_status(struct apm_power_info *info)
> >               info->battery_life = capacity.intval;
> >       } else {
> >               /* try calculate using energy */
> > -             info->battery_life = calculate_capacity(0);
> > +             info->battery_life = calculate_capacity(SOURCE_ENERGY);
> >               /* if failed try calculate using charge instead */
> >               if (info->battery_life == -1)
> > -                     info->battery_life = calculate_capacity(1);
> > +                     info->battery_life = calculate_capacity(SOURCE_CHARGE);
> > +             if (info->battery_life == -1)
> > +                     info->battery_life = calculate_capacity(SOURCE_VOLTAGE);
> >       }
> >
> >       /* charging status */
> > @@ -263,18 +298,22 @@ static void apm_battery_apm_get_power_status(struct apm_power_info *info)
> >                               !MPSY_PROP(TIME_TO_FULL_NOW, &time_to_full)) {
> >                       info->time = time_to_full.intval / 60;
> >               } else {
> > -                     info->time = calculate_time(status.intval, 0);
> > +                     info->time = calculate_time(status.intval, SOURCE_ENERGY);
> >                       if (info->time == -1)
> > -                             info->time = calculate_time(status.intval, 1);
> > +                             info->time = calculate_time(status.intval, SOURCE_CHARGE);
> > +                     if (info->time == -1)
> > +                             info->time = calculate_time(status.intval, SOURCE_VOLTAGE);
> >               }
> >       } else {
> >               if (!MPSY_PROP(TIME_TO_EMPTY_AVG, &time_to_empty) ||
> >                             !MPSY_PROP(TIME_TO_EMPTY_NOW, &time_to_empty)) {
> >                       info->time = time_to_empty.intval / 60;
> >               } else {
> > -                     info->time = calculate_time(status.intval, 0);
> > +                     info->time = calculate_time(status.intval, SOURCE_ENERGY);
> > +                     if (info->time == -1)
> > +                             info->time = calculate_time(status.intval, SOURCE_CHARGE);
> >                       if (info->time == -1)
> > -                             info->time = calculate_time(status.intval, 1);
> > +                             info->time = calculate_time(status.intval, SOURCE_VOLTAGE);
> >               }
> >       }
> >
> > --
> > With best wishes
> > Dmitry
> >
>
> --
> Anton Vorontsov
> email: cbou@mail.ru
> backup email: ya-cbou@yandex.ru
> irc://irc.freenode.net/bd2
>


-- 
With best wishes
Dmitry

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 3/3] apm_power: Support using VOLTAGE_* properties for apm calculations
  2008-01-06 12:30 [PATCH 3/3] Dmitry Baryshkov
  2008-01-06 22:53 ` Anton Vorontsov
@ 2008-01-07  2:50 ` Anton Vorontsov
  1 sibling, 0 replies; 4+ messages in thread
From: Anton Vorontsov @ 2008-01-07  2:50 UTC (permalink / raw)
  To: Dmitry Baryshkov; +Cc: linux-kernel, cbou, dwmw2

On Sun, Jan 06, 2008 at 03:30:16PM +0300, Dmitry Baryshkov wrote:
> Support using VOLTAGE_* properties for apm calculations. It's pretty
> dummy, but useful for batteries for which we can only get voltages.

By the way...

> diff --git a/drivers/power/apm_power.c b/drivers/power/apm_power.c
> index bbf3ee1..526c96e 100644
> --- a/drivers/power/apm_power.c
> +++ b/drivers/power/apm_power.c
[...]
> -static int calculate_time(int status, int using_charge)
> +static int calculate_time(int status, apm_source source)
[...]
> +	case SOURCE_VOLTAGE:
> +		full_prop = POWER_SUPPLY_PROP_VOLTAGE_MAX;
> +		full_design_prop = POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN;
> +		empty_prop = POWER_SUPPLY_PROP_VOLTAGE_MIN;
> +		empty_design_prop = POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN;
> +		cur_avg_prop = POWER_SUPPLY_PROP_VOLTAGE_AVG;
> +		cur_now_prop = POWER_SUPPLY_PROP_VOLTAGE_NOW;
> +		break;
[...]
>  		return -((cur.intval - empty.intval) * 60L) / I.intval;

This formula will return nonsense if you'll feed it with voltage:
Ohms * 60 minutes? ;-)

I'd suppose you can get better accuracy if you'll divide it by
some constant (resistance, we can define new property for it),
but I still doubt it, because this formula doesn't work good
enough even for batteries reporting charge. ;-)

It's interesting what actual values you're getting and how they
accurate.

There is another option though: if you know battery charge
full/empty thresholds (usually you know design values, they
should be written on the battery pack), then you can use this
formula to calculate "charge_now":

((voltage_now - voltage_min) * (charge_full - charge_empty)) /
(voltage_max - voltage_min)

And then you can calculate time as usual, using
charge_{now,full,empty} and current_now. But still, this is
very inaccurate, there isn't direct correlation between
charge and voltage. Oh well, power_supply_class.txt already
states about apm_power.c limitations.


So, with few cosmetic corrections I applied all your patches to
git://git.infradead.org/battery-2.6.git

I also applied few my patches I sent here earlier, hope they
don't break anything (at least they survived my tests).

Good luck,

-- 
Anton Vorontsov
email: cbou@mail.ru
backup email: ya-cbou@yandex.ru
irc://irc.freenode.net/bd2

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2008-01-07  3:04 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-01-06 12:30 [PATCH 3/3] Dmitry Baryshkov
2008-01-06 22:53 ` Anton Vorontsov
2008-01-06 23:12   ` Dmitry
2008-01-07  2:50 ` [PATCH 3/3] apm_power: Support using VOLTAGE_* properties for apm calculations Anton Vorontsov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).