* [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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.