s3c_adc_battery: Average over more than one adc sample
[firefly-linux-kernel-4.4.55.git] / drivers / power / s3c_adc_battery.c
index e687ee7f18f277f18e6a9199915ee00fb613f4a1..8b804a566756a11c06ce08a8cdadc10828e6bcc0 100644 (file)
@@ -47,6 +47,22 @@ static void s3c_adc_bat_ext_power_changed(struct power_supply *psy)
                msecs_to_jiffies(JITTER_DELAY));
 }
 
+static int gather_samples(struct s3c_adc_client *client, int num, int channel)
+{
+       int value, i;
+
+       /* default to 1 if nothing is set */
+       if (num < 1)
+               num = 1;
+
+       value = 0;
+       for (i = 0; i < num; i++)
+               value += s3c_adc_read(client, channel);
+       value /= num;
+
+       return value;
+}
+
 static enum power_supply_property s3c_adc_backup_bat_props[] = {
        POWER_SUPPLY_PROP_VOLTAGE_NOW,
        POWER_SUPPLY_PROP_VOLTAGE_MIN,
@@ -67,7 +83,8 @@ static int s3c_adc_backup_bat_get_property(struct power_supply *psy,
        if (bat->volt_value < 0 ||
                jiffies_to_msecs(jiffies - bat->timestamp) >
                        BAT_POLL_INTERVAL) {
-               bat->volt_value = s3c_adc_read(bat->client,
+               bat->volt_value = gather_samples(bat->client,
+                       bat->pdata->backup_volt_samples,
                        bat->pdata->backup_volt_channel);
                bat->volt_value *= bat->pdata->backup_volt_mult;
                bat->timestamp = jiffies;
@@ -139,9 +156,11 @@ static int s3c_adc_bat_get_property(struct power_supply *psy,
        if (bat->volt_value < 0 || bat->cur_value < 0 ||
                jiffies_to_msecs(jiffies - bat->timestamp) >
                        BAT_POLL_INTERVAL) {
-               bat->volt_value = s3c_adc_read(bat->client,
+               bat->volt_value = gather_samples(bat->client,
+                       bat->pdata->volt_samples,
                        bat->pdata->volt_channel) * bat->pdata->volt_mult;
-               bat->cur_value = s3c_adc_read(bat->client,
+               bat->cur_value = gather_samples(bat->client,
+                       bat->pdata->current_samples,
                        bat->pdata->current_channel) * bat->pdata->current_mult;
                bat->timestamp = jiffies;
        }