OSDN Git Service

qcom: storm-watch: add support to reset storm count
authorSubbaraman Narayanamurthy <subbaram@codeaurora.org>
Tue, 7 Feb 2017 00:04:32 +0000 (16:04 -0800)
committerSubbaraman Narayanamurthy <subbaram@codeaurora.org>
Sat, 11 Feb 2017 00:57:48 +0000 (16:57 -0800)
There are some circumstances where we have to reset the storm
watch interrupt count. Add support for it.

Change-Id: Iacbeb3258d53010aab8ba881d10de773fe54dd93
Signed-off-by: Subbaraman Narayanamurthy <subbaram@codeaurora.org>
drivers/power/supply/qcom/qpnp-smb2.c
drivers/power/supply/qcom/smb138x-charger.c
drivers/power/supply/qcom/storm-watch.c
drivers/power/supply/qcom/storm-watch.h

index 1fb0cab..4f0d85b 100644 (file)
@@ -1881,6 +1881,7 @@ static int smb2_request_interrupt(struct smb2 *chip,
        irq_data->parent_data = chip;
        irq_data->name = irq_name;
        irq_data->storm_data = smb2_irqs[irq_index].storm_data;
+       mutex_init(&irq_data->storm_data.storm_lock);
 
        rc = devm_request_threaded_irq(chg->dev, irq, NULL,
                                        smb2_irqs[irq_index].handler,
index 7e1f34e..8f91642 100644 (file)
@@ -1197,6 +1197,7 @@ static int smb138x_request_interrupt(struct smb138x *chip,
        irq_data->parent_data = chip;
        irq_data->name = irq_name;
        irq_data->storm_data = smb138x_irqs[irq_index].storm_data;
+       mutex_init(&irq_data->storm_data.storm_lock);
 
        rc = devm_request_threaded_irq(chg->dev, irq, NULL,
                                        smb138x_irqs[irq_index].handler,
index 90fec12..5275079 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016 The Linux Foundation. All rights reserved.
+/* Copyright (c) 2016-2017 The Linux Foundation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 and
@@ -39,6 +39,7 @@ bool is_storming(struct storm_watch *data)
        if (data->storm_period_ms <= 0)
                return false;
 
+       mutex_lock(&data->storm_lock);
        curr_kt = ktime_get_boottime();
        delta_kt = ktime_sub(curr_kt, data->last_kt);
 
@@ -53,5 +54,13 @@ bool is_storming(struct storm_watch *data)
        }
 
        data->last_kt = curr_kt;
+       mutex_unlock(&data->storm_lock);
        return is_storming;
 }
+
+void reset_storm_count(struct storm_watch *data)
+{
+       mutex_lock(&data->storm_lock);
+       data->storm_count = 0;
+       mutex_unlock(&data->storm_lock);
+}
index 44b9d64..ff05c4a 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016 The Linux Foundation. All rights reserved.
+/* Copyright (c) 2016-2017 The Linux Foundation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 and
@@ -13,6 +13,7 @@
 #ifndef __STORM_WATCH_H
 #define __STORM_WATCH_H
 #include <linux/ktime.h>
+#include <linux/mutex.h>
 
 /**
  * Data used to track an event storm.
  * @max_storm_count: The number of chained events required to trigger a storm.
  * @storm_count:     The current number of chained events.
  * @last_kt:         Kernel time of the last event seen.
+ * @storm_lock:      Mutex lock to protect storm_watch data.
  */
 struct storm_watch {
-       bool    enabled;
-       int     storm_period_ms;
-       int     max_storm_count;
-       int     storm_count;
-       ktime_t last_kt;
+       bool            enabled;
+       int             storm_period_ms;
+       int             max_storm_count;
+       int             storm_count;
+       ktime_t         last_kt;
+       struct mutex    storm_lock;
 };
 
 bool is_storming(struct storm_watch *data);
+void reset_storm_count(struct storm_watch *data);
 #endif