aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/power/s3c_adc_battery.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/power/s3c_adc_battery.c')
-rw-r--r--drivers/power/s3c_adc_battery.c25
1 files changed, 22 insertions, 3 deletions
diff --git a/drivers/power/s3c_adc_battery.c b/drivers/power/s3c_adc_battery.c
index e687ee7f18f2..8b804a566756 100644
--- a/drivers/power/s3c_adc_battery.c
+++ b/drivers/power/s3c_adc_battery.c
@@ -47,6 +47,22 @@ static void s3c_adc_bat_ext_power_changed(struct power_supply *psy)
47 msecs_to_jiffies(JITTER_DELAY)); 47 msecs_to_jiffies(JITTER_DELAY));
48} 48}
49 49
50static int gather_samples(struct s3c_adc_client *client, int num, int channel)
51{
52 int value, i;
53
54 /* default to 1 if nothing is set */
55 if (num < 1)
56 num = 1;
57
58 value = 0;
59 for (i = 0; i < num; i++)
60 value += s3c_adc_read(client, channel);
61 value /= num;
62
63 return value;
64}
65
50static enum power_supply_property s3c_adc_backup_bat_props[] = { 66static enum power_supply_property s3c_adc_backup_bat_props[] = {
51 POWER_SUPPLY_PROP_VOLTAGE_NOW, 67 POWER_SUPPLY_PROP_VOLTAGE_NOW,
52 POWER_SUPPLY_PROP_VOLTAGE_MIN, 68 POWER_SUPPLY_PROP_VOLTAGE_MIN,
@@ -67,7 +83,8 @@ static int s3c_adc_backup_bat_get_property(struct power_supply *psy,
67 if (bat->volt_value < 0 || 83 if (bat->volt_value < 0 ||
68 jiffies_to_msecs(jiffies - bat->timestamp) > 84 jiffies_to_msecs(jiffies - bat->timestamp) >
69 BAT_POLL_INTERVAL) { 85 BAT_POLL_INTERVAL) {
70 bat->volt_value = s3c_adc_read(bat->client, 86 bat->volt_value = gather_samples(bat->client,
87 bat->pdata->backup_volt_samples,
71 bat->pdata->backup_volt_channel); 88 bat->pdata->backup_volt_channel);
72 bat->volt_value *= bat->pdata->backup_volt_mult; 89 bat->volt_value *= bat->pdata->backup_volt_mult;
73 bat->timestamp = jiffies; 90 bat->timestamp = jiffies;
@@ -139,9 +156,11 @@ static int s3c_adc_bat_get_property(struct power_supply *psy,
139 if (bat->volt_value < 0 || bat->cur_value < 0 || 156 if (bat->volt_value < 0 || bat->cur_value < 0 ||
140 jiffies_to_msecs(jiffies - bat->timestamp) > 157 jiffies_to_msecs(jiffies - bat->timestamp) >
141 BAT_POLL_INTERVAL) { 158 BAT_POLL_INTERVAL) {
142 bat->volt_value = s3c_adc_read(bat->client, 159 bat->volt_value = gather_samples(bat->client,
160 bat->pdata->volt_samples,
143 bat->pdata->volt_channel) * bat->pdata->volt_mult; 161 bat->pdata->volt_channel) * bat->pdata->volt_mult;
144 bat->cur_value = s3c_adc_read(bat->client, 162 bat->cur_value = gather_samples(bat->client,
163 bat->pdata->current_samples,
145 bat->pdata->current_channel) * bat->pdata->current_mult; 164 bat->pdata->current_channel) * bat->pdata->current_mult;
146 bat->timestamp = jiffies; 165 bat->timestamp = jiffies;
147 } 166 }