All of lore.kernel.org
 help / color / mirror / Atom feed
From: Anton Vorontsov <cbouatmailru@gmail.com>
To: Dmitry Baryshkov <dbaryshkov@gmail.com>
Cc: linux-kernel@vger.kernel.org, cbou@mail.ru, dwmw2@infradead.org
Subject: Re: [PATCH 3/3]
Date: Mon, 7 Jan 2008 01:53:06 +0300	[thread overview]
Message-ID: <20080106225306.GA22551@zarina> (raw)
In-Reply-To: <20080106123016.GA13324@doriath.ww600.siemens.net>

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

  reply	other threads:[~2008-01-06 23:06 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-01-06 12:30 [PATCH 3/3] Dmitry Baryshkov
2008-01-06 22:53 ` Anton Vorontsov [this message]
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 --
2007-10-11  9:08 [PATCH][3/3] Zhang, Xiantao
     [not found] ` <42DFA526FC41B1429CE7279EF83C6BDC7AEDD9-wq7ZOvIWXbMAbVU2wMM1CrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2007-10-11  9:32   ` [PATCH][3/3] Zhang, Xiantao
2004-08-27 21:53 [patch 3/3] trini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20080106225306.GA22551@zarina \
    --to=cbouatmailru@gmail.com \
    --cc=cbou@mail.ru \
    --cc=dbaryshkov@gmail.com \
    --cc=dwmw2@infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.