summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTai Kuo <taikuo@google.com>2022-12-01 15:50:41 +0800
committerTreeHugger Robot <treehugger-gerrit@google.com>2023-02-15 07:39:29 +0000
commit00bf27577cb6d2d17721a575f18a02da54a0170a (patch)
tree6b4d683551fc33bbe1e8d812837917eb5fa8f88b
parentb03f7153f7cc45d4d894ab447e3b602ecb063e7d (diff)
downloadamplifiers-00bf27577cb6d2d17721a575f18a02da54a0170a.tar.gz
cs40l26: support profiling
1. Interrupt-based haptics awake, on and off. Events: AWAKE, TRIGGER_CP, TRIGGER_CPIO and TRIGGER_I2S. 2. ff-core IOCTL callback Events: cs40l26_set_gain, cs40l26_playback_effect, cs40l26_upload_effect and cs40l26_erase_effect. 3. PM state transition. Events: WAKEUP and PREVENT_HIBERNATE. Note: 1. Workqueue profiling is already supported. Event: cs40l26_set_gain_worker, cs40l26_vibe_start_worker, cs40l26_vibe_stop_worker, cs40l26_upload_worker and cs40l26_erase_worker Bug: 261427473 Test: Check Perfetto with default category Change-Id: I9757c88df182a3294b97dfa7053ef9ac368bcaef
-rw-r--r--cs40l26/cs40l26.c22
-rw-r--r--cs40l26/cs40l26.h1
2 files changed, 23 insertions, 0 deletions
diff --git a/cs40l26/cs40l26.c b/cs40l26/cs40l26.c
index 122842f..2073191 100644
--- a/cs40l26/cs40l26.c
+++ b/cs40l26/cs40l26.c
@@ -457,13 +457,17 @@ int cs40l26_pm_state_transition(struct cs40l26_private *cs40l26,
switch (state) {
case CS40L26_PM_STATE_WAKEUP:
+ ATRACE_BEGIN("CS40L26_PM_STATE_WAKEUP");
ret = cs40l26_ack_write(cs40l26, CS40L26_DSP_VIRTUAL1_MBOX_1,
cmd, CS40L26_DSP_MBOX_RESET);
if (ret)
return ret;
+ ATRACE_END();
+
break;
case CS40L26_PM_STATE_PREVENT_HIBERNATE:
+ ATRACE_BEGIN("CS40L26_PM_STATE_PREVENT_HIBERNATE");
for (i = 0; i < CS40L26_DSP_STATE_ATTEMPTS; i++) {
ret = cs40l26_ack_write(cs40l26,
CS40L26_DSP_VIRTUAL1_MBOX_1,
@@ -494,6 +498,8 @@ int cs40l26_pm_state_transition(struct cs40l26_private *cs40l26,
return -ETIMEDOUT;
}
+ ATRACE_END();
+
break;
case CS40L26_PM_STATE_ALLOW_HIBERNATE:
cs40l26->wksrc_sts = 0x00;
@@ -691,23 +697,27 @@ static int cs40l26_handle_mbox_buffer(struct cs40l26_private *cs40l26)
switch (val) {
case CS40L26_DSP_MBOX_COMPLETE_MBOX:
+ ATRACE_END();
dev_dbg(dev, "Mailbox: COMPLETE_MBOX\n");
complete_all(&cs40l26->erase_cont);
cs40l26_vibe_state_update(cs40l26,
CS40L26_VIBE_STATE_EVENT_MBOX_COMPLETE);
break;
case CS40L26_DSP_MBOX_COMPLETE_GPIO:
+ ATRACE_END();
dev_dbg(dev, "Mailbox: COMPLETE_GPIO\n");
cs40l26_vibe_state_update(cs40l26,
CS40L26_VIBE_STATE_EVENT_GPIO_COMPLETE);
break;
case CS40L26_DSP_MBOX_COMPLETE_I2S:
+ ATRACE_END();
dev_dbg(dev, "Mailbox: COMPLETE_I2S\n");
/* ASP is interrupted */
if (cs40l26->asp_enable)
complete(&cs40l26->i2s_cont);
break;
case CS40L26_DSP_MBOX_TRIGGER_I2S:
+ ATRACE_BEGIN("TRIGGER_I2S");
dev_dbg(dev, "Mailbox: TRIGGER_I2S\n");
complete(&cs40l26->i2s_cont);
break;
@@ -717,17 +727,21 @@ static int cs40l26_handle_mbox_buffer(struct cs40l26_private *cs40l26)
return -EPERM;
}
+ ATRACE_BEGIN("TRIGGER_CP");
dev_dbg(dev, "Mailbox: TRIGGER_CP\n");
cs40l26_vibe_state_update(cs40l26,
CS40L26_VIBE_STATE_EVENT_MBOX_PLAYBACK);
break;
case CS40L26_DSP_MBOX_TRIGGER_GPIO:
+ ATRACE_BEGIN("TRIGGER_GPIO");
dev_dbg(dev, "Mailbox: TRIGGER_GPIO\n");
cs40l26_vibe_state_update(cs40l26,
CS40L26_VIBE_STATE_EVENT_GPIO_TRIGGER);
break;
case CS40L26_DSP_MBOX_PM_AWAKE:
+ ATRACE_BEGIN("AWAKE");
cs40l26->wksrc_sts |= CS40L26_WKSRC_STS_EN;
+ ATRACE_END();
dev_dbg(dev, "Mailbox: AWAKE\n");
break;
case CS40L26_DSP_MBOX_F0_EST_START:
@@ -1980,6 +1994,7 @@ static void cs40l26_set_gain(struct input_dev *dev, u16 gain)
{
struct cs40l26_private *cs40l26 = input_get_drvdata(dev);
+ ATRACE_BEGIN(__func__);
if (gain >= CS40L26_NUM_PCT_MAP_VALUES) {
dev_err(cs40l26->dev, "Gain value %u %% out of bounds\n", gain);
return;
@@ -1988,6 +2003,7 @@ static void cs40l26_set_gain(struct input_dev *dev, u16 gain)
cs40l26->gain_pct = gain;
queue_work(cs40l26->vibe_workqueue, &cs40l26->set_gain_work);
+ ATRACE_END();
}
static int cs40l26_playback_effect(struct input_dev *dev,
@@ -1996,6 +2012,7 @@ static int cs40l26_playback_effect(struct input_dev *dev,
struct cs40l26_private *cs40l26 = input_get_drvdata(dev);
struct ff_effect *effect;
+ ATRACE_BEGIN(__func__);
dev_dbg(cs40l26->dev, "%s: effect ID = %d, val = %d\n", __func__,
effect_id, val);
@@ -2012,6 +2029,7 @@ static int cs40l26_playback_effect(struct input_dev *dev,
else
queue_work(cs40l26->vibe_workqueue, &cs40l26->vibe_stop_work);
+ ATRACE_END();
return 0;
}
@@ -2877,6 +2895,7 @@ static int cs40l26_upload_effect(struct input_dev *dev,
int len = effect->u.periodic.custom_len;
int ret;
+ ATRACE_BEGIN(__func__);
dev_dbg(cs40l26->dev, "%s: effect ID = %d\n", __func__, effect->id);
memcpy(&cs40l26->upload_effect, effect, sizeof(struct ff_effect));
@@ -2911,6 +2930,7 @@ out_free:
memset(&cs40l26->upload_effect, 0, sizeof(struct ff_effect));
kfree(cs40l26->raw_custom_data);
cs40l26->raw_custom_data = NULL;
+ ATRACE_END();
return ret;
}
@@ -3074,6 +3094,7 @@ static int cs40l26_erase_effect(struct input_dev *dev, int effect_id)
struct cs40l26_private *cs40l26 = input_get_drvdata(dev);
struct ff_effect *effect;
+ ATRACE_BEGIN(__func__);
dev_dbg(cs40l26->dev, "%s: effect ID = %d\n", __func__, effect_id);
effect = &dev->ff->effects[effect_id];
@@ -3089,6 +3110,7 @@ static int cs40l26_erase_effect(struct input_dev *dev, int effect_id)
/* Wait for erase to finish */
flush_work(&cs40l26->erase_work);
+ ATRACE_END();
return cs40l26->erase_ret;
}
diff --git a/cs40l26/cs40l26.h b/cs40l26/cs40l26.h
index 359abe1..69db4a0 100644
--- a/cs40l26/cs40l26.h
+++ b/cs40l26/cs40l26.h
@@ -43,6 +43,7 @@
#include <sound/tlv.h>
#include "cl_dsp.h"
+#include "../../../gs-google/drivers/soc/google/vh/kernel/systrace.h"
#define CS40L26_FIRSTREG 0x0
#define CS40L26_LASTREG 0x3C7DFE8