greybus: power_supply: add callback to handle power supply changes
authorRui Miguel Silva <rui.silva@linaro.org>
Tue, 16 Aug 2016 21:31:55 +0000 (22:31 +0100)
committerGreg Kroah-Hartman <gregkh@google.com>
Thu, 18 Aug 2016 15:34:01 +0000 (17:34 +0200)
When checking for property changes we may need to act upon that change
besides reporting it using power_supply_changed. So, add a function that
will be call if the specific property changed.

As at it, adjust some indentation of the psy_props_changes array.

Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
drivers/staging/greybus/power_supply.c

index 058fd3c..aeb6a07 100644 (file)
@@ -70,17 +70,22 @@ static unsigned int update_interval_max = 30 * HZ;
 struct gb_power_supply_changes {
        enum power_supply_property      prop;
        u32                             tolerance_change;
+       void (*prop_changed)(struct gb_power_supply *gbpsy,
+                            struct gb_power_supply_prop *prop);
 };
 
 static const struct gb_power_supply_changes psy_props_changes[] = {
-       {       .prop =                 GB_POWER_SUPPLY_PROP_STATUS,
-               .tolerance_change =     0,
+       {       .prop                   = GB_POWER_SUPPLY_PROP_STATUS,
+               .tolerance_change       = 0,
+               .prop_changed           = NULL,
        },
-       {       .prop =                 GB_POWER_SUPPLY_PROP_TEMP,
-               .tolerance_change =     500,
+       {       .prop                   = GB_POWER_SUPPLY_PROP_TEMP,
+               .tolerance_change       = 500,
+               .prop_changed           = NULL,
        },
-       {       .prop =                 GB_POWER_SUPPLY_PROP_ONLINE,
-               .tolerance_change =     0,
+       {       .prop                   = GB_POWER_SUPPLY_PROP_ONLINE,
+               .tolerance_change       = 0,
+               .prop_changed           = NULL,
        },
 };
 
@@ -349,18 +354,25 @@ static void check_changed(struct gb_power_supply *gbpsy,
        const struct gb_power_supply_changes *psyc;
        int val = prop->val;
        int prev_val = prop->previous_val;
+       bool changed = false;
        int i;
 
        for (i = 0; i < ARRAY_SIZE(psy_props_changes); i++) {
                psyc = &psy_props_changes[i];
                if (prop->prop == psyc->prop) {
                        if (!psyc->tolerance_change)
-                               gbpsy->changed = true;
+                               changed = true;
                        else if (val < prev_val &&
                                 prev_val - val > psyc->tolerance_change)
-                               gbpsy->changed = true;
+                               changed = true;
                        else if (val > prev_val &&
                                 val - prev_val > psyc->tolerance_change)
+                               changed = true;
+
+                       if (changed && psyc->prop_changed)
+                               psyc->prop_changed(gbpsy, prop);
+
+                       if (changed)
                                gbpsy->changed = true;
                        break;
                }