aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/greybus/power_supply.c
diff options
context:
space:
mode:
authorRui Miguel Silva <rui.silva@linaro.org>2016-08-16 22:31:57 +0100
committerGreg Kroah-Hartman <gregkh@google.com>2016-08-18 17:34:01 +0200
commitb5fbe819af2f8d8dceb421635a976462bb6885b8 (patch)
treee66b0b76e99aa3bb11aa57f8626619f40ce183ec /drivers/staging/greybus/power_supply.c
parentgreybus: power_supply: fix update interval check at request handler (diff)
downloadlinux-dev-b5fbe819af2f8d8dceb421635a976462bb6885b8.tar.xz
linux-dev-b5fbe819af2f8d8dceb421635a976462bb6885b8.zip
greybus: power_supply: invalidate cache at update request
When we receive a update request we shall not trust the cache mechanism and for that we need a way to invalidate the cache. Add a field that will control the cache status and refactor the code to check if cache is valid in a helper function. This will fix the scenario where an update request is received within the cache expiration time after a previous update as happened and would be ignored. Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Diffstat (limited to 'drivers/staging/greybus/power_supply.c')
-rw-r--r--drivers/staging/greybus/power_supply.c31
1 files changed, 26 insertions, 5 deletions
diff --git a/drivers/staging/greybus/power_supply.c b/drivers/staging/greybus/power_supply.c
index 3d6f81017d98..199a19a634b6 100644
--- a/drivers/staging/greybus/power_supply.c
+++ b/drivers/staging/greybus/power_supply.c
@@ -45,6 +45,7 @@ struct gb_power_supply {
u8 properties_count;
u8 properties_count_str;
unsigned long last_update;
+ u8 cache_invalid;
unsigned int update_interval;
bool changed;
struct gb_power_supply_prop *props;
@@ -636,15 +637,28 @@ static int _gb_power_supply_property_get(struct gb_power_supply *gbpsy,
return 0;
}
-static int gb_power_supply_status_get(struct gb_power_supply *gbpsy)
+static int is_cache_valid(struct gb_power_supply *gbpsy)
{
- int ret = 0;
- int i;
+ /* check if cache is good enough or it has expired */
+ if (gbpsy->cache_invalid) {
+ gbpsy->cache_invalid = 0;
+ return 0;
+ }
- /* check if cache is good enough */
if (gbpsy->last_update &&
time_is_after_jiffies(gbpsy->last_update +
msecs_to_jiffies(cache_time)))
+ return 1;
+
+ return 0;
+}
+
+static int gb_power_supply_status_get(struct gb_power_supply *gbpsy)
+{
+ int ret = 0;
+ int i;
+
+ if (is_cache_valid(gbpsy))
return 0;
for (i = 0; i < gbpsy->properties_count; i++) {
@@ -987,8 +1001,15 @@ static int gb_supplies_request_handler(struct gb_operation *op)
goto out_unlock;
}
- if (event & GB_POWER_SUPPLY_UPDATE)
+ if (event & GB_POWER_SUPPLY_UPDATE) {
+ /*
+ * we need to make sure we invalidate cache, if not no new
+ * values for the properties will be fetch and the all propose
+ * of this event is missed
+ */
+ gbpsy->cache_invalid = 1;
gb_power_supply_status_update(gbpsy);
+ }
out_unlock:
mutex_unlock(&supplies->supplies_lock);