diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index c8f128bc0070..96302ea67606 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -72,6 +72,8 @@ #include #include #include +#include + /* * Export tracepoints that act as a bare tracehook (ie: have no trace event * associated with them) to allow external modules to probe them. @@ -401,3 +403,4 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_delayacct_wpcopy_start); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_delayacct_wpcopy_end); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_usb_dev_suspend); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_usb_dev_resume); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_sound_usb_support_cpu_suspend); diff --git a/include/trace/hooks/sound.h b/include/trace/hooks/sound.h new file mode 100644 index 000000000000..08c58f995450 --- /dev/null +++ b/include/trace/hooks/sound.h @@ -0,0 +1,18 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM sound +#undef TRACE_INCLUDE_PATH +#define TRACE_INCLUDE_PATH trace/hooks +#if !defined(_TRACE_HOOK_SOUND_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_HOOK_SOUND_H +#include + +DECLARE_HOOK(android_vh_sound_usb_support_cpu_suspend, + TP_PROTO(struct usb_device *udev, + int direction, + bool *is_support), + TP_ARGS(udev, direction, is_support)); + +#endif /* _TRACE_HOOK_SOUND_H */ +/* This part must be outside protection */ +#include diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c index c27ef56dcd7c..daeb3025851e 100644 --- a/sound/usb/pcm.c +++ b/sound/usb/pcm.c @@ -14,6 +14,8 @@ #include #include +#include + #include "usbaudio.h" #include "card.h" #include "quirks.h" @@ -1175,6 +1177,7 @@ static int snd_usb_pcm_open(struct snd_pcm_substream *substream) struct snd_pcm_runtime *runtime = substream->runtime; struct snd_usb_substream *subs = &as->substream[direction]; int ret; + bool is_support = false; ret = snd_vendor_set_pcm_connection(subs->dev, SOUND_PCM_OPEN, direction); @@ -1204,6 +1207,11 @@ static int snd_usb_pcm_open(struct snd_pcm_substream *substream) ret = snd_media_stream_init(subs, as->pcm, direction); if (ret < 0) snd_usb_autosuspend(subs->stream->chip); + + trace_android_vh_sound_usb_support_cpu_suspend(subs->dev, direction, &is_support); + if (!ret && is_support) + snd_usb_autosuspend(subs->stream->chip); + return ret; } @@ -1213,6 +1221,11 @@ static int snd_usb_pcm_close(struct snd_pcm_substream *substream) struct snd_usb_stream *as = snd_pcm_substream_chip(substream); struct snd_usb_substream *subs = &as->substream[direction]; int ret; + bool is_support = false; + + trace_android_vh_sound_usb_support_cpu_suspend(subs->dev, direction, &is_support); + if (is_support) + snd_usb_autoresume(subs->stream->chip); ret = snd_vendor_set_pcm_connection(subs->dev, SOUND_PCM_CLOSE, direction);