diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 4bea5f851083..7da0fbf06d9d 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -69,6 +69,7 @@ #include #include #include +#include /* * Export tracepoints that act as a bare tracehook (ie: have no trace event @@ -355,3 +356,4 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_check_bpf_syscall); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_usb_dev_suspend); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_usb_dev_resume); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ipv6_gen_linklocal_addr); +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..2bf018edf392 --- /dev/null +++ b/include/trace/hooks/sound.h @@ -0,0 +1,20 @@ +/* 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 +#include +#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 0b90a4d04d7d..9e93a43ab353 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" @@ -1508,6 +1510,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); @@ -1532,6 +1535,11 @@ static int snd_usb_pcm_open(struct snd_pcm_substream *substream) if (ret) 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; } @@ -1541,12 +1549,17 @@ 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; ret = snd_vendor_set_pcm_connection(subs->dev, SOUND_PCM_CLOSE, direction); if (ret) return ret; + trace_android_vh_sound_usb_support_cpu_suspend(subs->dev, direction, &is_support); + if (!ret && is_support) + snd_usb_autoresume(subs->stream->chip); + snd_media_stop_pipeline(subs); if (!as->chip->keep_iface &&