LKML Archive on lore.kernel.org
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; 5+ 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] 5+ 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; 5+ 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] 5+ messages in thread

* Re: [PATCH 3/3]
  2008-01-06 22:53 ` Anton Vorontsov
@ 2008-01-06 23:12   ` Dmitry
  0 siblings, 0 replies; 5+ 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] 5+ 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; 5+ 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] 5+ messages in thread

* [patch 3/3] 
@ 2004-08-27 21:53 trini
  0 siblings, 0 replies; 5+ messages in thread
From: trini @ 2004-08-27 21:53 UTC (permalink / raw)
  To: sam; +Cc: linux-kernel, trini


Additional Makefile fixes for Solaris 2.8

On Solaris, 'head' doesn't take a -q argument.  But we can use 'grep -h'
instead, so do that in Makefile.mod{inst,post}.  The built-in test to
/bin/sh doesn't like 'if ! cmd' syntax, so when determining if we need
to do modversion stuff, invert the if/else cases.  The built-in test
also doesn't understand -ef, so invoke a real version of test which does.

Signed-off-by: Tom Rini <trini@kernel.crashing.org>
---

 linux-2.6-solaris-trini/Makefile                 |    8 ++++----
 linux-2.6-solaris-trini/scripts/Makefile.build   |    6 +++---
 linux-2.6-solaris-trini/scripts/Makefile.modinst |    2 +-
 linux-2.6-solaris-trini/scripts/Makefile.modpost |    2 +-
 4 files changed, 9 insertions(+), 9 deletions(-)

diff -puN Makefile~shell_commands Makefile
--- linux-2.6-solaris/Makefile~shell_commands	2004-08-27 14:47:07.033077973 -0700
+++ linux-2.6-solaris-trini/Makefile	2004-08-27 14:47:07.042075885 -0700
@@ -673,10 +673,10 @@ $(vmlinux-dirs): prepare-all scripts
 # using a seperate output directory. This allows convinient use
 # of make in output directory
 prepare2:
-	$(Q)if [ ! $(srctree) -ef $(objtree) ]; then       \
-	$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile      \
-	    $(srctree) $(objtree) $(VERSION) $(PATCHLEVEL) \
-	    > $(objtree)/Makefile;                         \
+	$(Q)if /usr/bin/env test ! $(srctree) -ef $(objtree); then \
+	$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile              \
+	    $(srctree) $(objtree) $(VERSION) $(PATCHLEVEL)         \
+	    > $(objtree)/Makefile;                                 \
 	fi
 
 # prepare1 is used to check if we are building in a separate output directory,
diff -puN scripts/Makefile.build~shell_commands scripts/Makefile.build
--- linux-2.6-solaris/scripts/Makefile.build~shell_commands	2004-08-27 14:47:07.035077509 -0700
+++ linux-2.6-solaris-trini/scripts/Makefile.build	2004-08-27 14:47:07.043075653 -0700
@@ -160,9 +160,7 @@ else
 
 cmd_cc_o_c = $(CC) $(c_flags) -c -o $(@D)/.tmp_$(@F) $<
 cmd_modversions =							\
-	if ! $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then	\
-		mv $(@D)/.tmp_$(@F) $@;					\
-	else								\
+	if $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then	\
 		$(CPP) -D__GENKSYMS__ $(c_flags) $<			\
 		| $(GENKSYMS)						\
 		> $(@D)/.tmp_$(@F:.o=.ver);				\
@@ -170,6 +168,8 @@ cmd_modversions =							\
 		$(LD) $(LDFLAGS) -r -o $@ $(@D)/.tmp_$(@F) 		\
 			-T $(@D)/.tmp_$(@F:.o=.ver);			\
 		rm -f $(@D)/.tmp_$(@F) $(@D)/.tmp_$(@F:.o=.ver);	\
+	else								\
+		mv $(@D)/.tmp_$(@F) $@;					\
 	fi;
 endif
 
diff -puN scripts/Makefile.modinst~shell_commands scripts/Makefile.modinst
--- linux-2.6-solaris/scripts/Makefile.modinst~shell_commands	2004-08-27 14:47:07.036077277 -0700
+++ linux-2.6-solaris-trini/scripts/Makefile.modinst	2004-08-27 14:47:07.043075653 -0700
@@ -9,7 +9,7 @@ include scripts/Makefile.lib
 
 #
 
-__modules := $(sort $(shell head -q -n1 /dev/null $(wildcard $(MODVERDIR)/*.mod)))
+__modules := $(sort $(shell grep -h .ko /dev/null $(wildcard $(MODVERDIR)/*.mod)))
 modules := $(patsubst %.o,%.ko,$(wildcard $(__modules:.ko=.o)))
 
 .PHONY: $(modules)
diff -puN scripts/Makefile.modpost~shell_commands scripts/Makefile.modpost
--- linux-2.6-solaris/scripts/Makefile.modpost~shell_commands	2004-08-27 14:47:07.038076813 -0700
+++ linux-2.6-solaris-trini/scripts/Makefile.modpost	2004-08-27 14:47:07.043075653 -0700
@@ -41,7 +41,7 @@ include scripts/Makefile.lib
 symverfile := $(objtree)/Module.symvers
 
 # Step 1), find all modules listed in $(MODVERDIR)/
-__modules := $(sort $(shell head -q -n1 /dev/null $(wildcard $(MODVERDIR)/*.mod)))
+__modules := $(sort $(shell grep -h .ko /dev/null $(wildcard $(MODVERDIR)/*.mod)))
 modules   := $(patsubst %.o,%.ko, $(wildcard $(__modules:.ko=.o)))
 
 _modpost: $(modules)
_

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

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

Thread overview: 5+ 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
  -- strict thread matches above, loose matches on Subject: below --
2004-08-27 21:53 [patch 3/3] trini

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