summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVijayavardhan Vennapusa <vvreddy@codeaurora.org>2017-04-26 11:10:15 +0530
committerVijayavardhan Vennapusa <vvreddy@codeaurora.org>2017-05-18 18:31:53 +0530
commit74fd4e30fc565dfbce5b0ce1ce56c0c42696338a (patch)
tree12783702599390055c4c155179048765785d548a
parent406ab7d2d4f3a72f3ef1dd10f894e6c88ee3ac01 (diff)
USB:dwc3-msm: Don't schedule work if pm_qos_latency is zero
Currently driver is scheduling pm_qos_work again even though pm_qos_latency is not passed from dts file. Add a check for pm_qos_latency and don't schedule work if pm_qos_latency value is zero. Also remove use of static variable for last_irq_count and add the variable for the same in dwc3 structure for the case where multi DWC3 usages are used. Change-Id: I55e1e3a7d48fbea0a421802aae176ac57a48869f Signed-off-by: Vijayavardhan Vennapusa <vvreddy@codeaurora.org>
-rw-r--r--drivers/usb/dwc3/core.h2
-rw-r--r--drivers/usb/dwc3/dwc3-msm.c11
2 files changed, 9 insertions, 4 deletions
diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
index 453eee734b23..1b4fb562ce4b 100644
--- a/drivers/usb/dwc3/core.h
+++ b/drivers/usb/dwc3/core.h
@@ -840,6 +840,7 @@ struct dwc3_scratchpad_array {
* @irq: irq number
* @bh: tasklet which handles the interrupt
* @irq_cnt: total irq count
+ * @last_irq_cnt: last irq count
* @bh_completion_time: time taken for taklet completion
* @bh_handled_evt_cnt: no. of events handled by tasklet per interrupt
* @bh_dbg_index: index for capturing bh_completion_time and bh_handled_evt_cnt
@@ -1028,6 +1029,7 @@ struct dwc3 {
/* IRQ timing statistics */
int irq;
unsigned long irq_cnt;
+ unsigned long last_irq_cnt;
unsigned long ep_cmd_timeout_cnt;
unsigned bh_completion_time[MAX_INTR_STATS];
unsigned bh_handled_evt_cnt[MAX_INTR_STATS];
diff --git a/drivers/usb/dwc3/dwc3-msm.c b/drivers/usb/dwc3/dwc3-msm.c
index a80fb34cdce8..7bfbbf4f96ec 100644
--- a/drivers/usb/dwc3/dwc3-msm.c
+++ b/drivers/usb/dwc3/dwc3-msm.c
@@ -3320,16 +3320,19 @@ static void msm_dwc3_perf_vote_work(struct work_struct *w)
struct dwc3_msm *mdwc = container_of(w, struct dwc3_msm,
perf_vote_work.work);
struct dwc3 *dwc = platform_get_drvdata(mdwc->dwc3);
- static unsigned long last_irq_cnt;
bool in_perf_mode = false;
+ int latency = mdwc->pm_qos_latency;
+
+ if (!latency)
+ return;
- if (dwc->irq_cnt - last_irq_cnt >= PM_QOS_THRESHOLD)
+ if (dwc->irq_cnt - dwc->last_irq_cnt >= PM_QOS_THRESHOLD)
in_perf_mode = true;
pr_debug("%s: in_perf_mode:%u, interrupts in last sample:%lu\n",
- __func__, in_perf_mode, (dwc->irq_cnt - last_irq_cnt));
+ __func__, in_perf_mode, (dwc->irq_cnt - dwc->last_irq_cnt));
- last_irq_cnt = dwc->irq_cnt;
+ dwc->last_irq_cnt = dwc->irq_cnt;
msm_dwc3_perf_vote_update(mdwc, in_perf_mode);
schedule_delayed_work(&mdwc->perf_vote_work,
msecs_to_jiffies(1000 * PM_QOS_SAMPLE_SEC));