Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp557372pxf; Wed, 24 Mar 2021 10:19:00 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwsliHdO9JjbLRm6Ckdzf/Z9ed1mBZRddbi00cad0ffK0PAZg8I/NKaYo6VpinAuNPbY9SD X-Received: by 2002:a17:906:5689:: with SMTP id am9mr4698224ejc.298.1616606340148; Wed, 24 Mar 2021 10:19:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1616606340; cv=none; d=google.com; s=arc-20160816; b=wA3kSCiR/PRQWsUnunAIc1wbkWqppEjZkVaoVp2ZEvSaya6BkMgjMopD0gz7kWDxLx 8ltVUwMvhyX9FzOyZOsmYRzzp3G8M3J8XrTY0w3XtJSTzSL9tpnUj+kfpDOMR2sPw5RT vklU2LTyPyJERxVdrdgUynC6jsH0cpdipwALJlyHg1NxUWr0IPuFZWFtte9Ri3YPj92R IQteQgBg5p/6RC+3T1K39pcIVEi+WLsKj0gAUGOiwqaKt1Wu9G2xuCsZ/eBjbCucTIzH zP9Fr+0b+shN4R5vKH5ZfFn+8SZa7HnNRpBRhJcusiIq2/2Glv5gbcWFnbAM5a7caQga oQZQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=JP2U4CymMAQSCpQRNRQ9z2X5Bat44uFuEqGE6Wyh7vE=; b=uNcfrnva+9S/6JQrNGUn8qgkrE37aTHvBki77MHdiGvFYcvuVlMFFcYV4DPCZbEX0e 43F8Z1RitwPB1YcGYm7ESjcepJ+Jv3w0gpjf9XkRNQ/6DY8f5nbENbS8znv6kSm6cQBb DrtyAHg9KGBSOrb9GGDWrI+MO/BNVQgRZ4TF/ijZESDDrH6PFKtO7JNNG0Bmlg240+LA 2jgkZZJur1ldA8mvVu+jHauaD4XEIuoBchHL8Ar+XdMFocrpu1DtbG4QWgvMAG9cSwrf 7d+V+5nWgzRQtr9KNHfMbw02JHAOXv9SiQolu0IsGee0DoHQnWc4I0Jj7pgC3t2aWp0L S6NQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=canonical.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id do3si2245212ejc.486.2021.03.24.10.18.36; Wed, 24 Mar 2021 10:19:00 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=canonical.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237266AbhCXRPI (ORCPT + 99 others); Wed, 24 Mar 2021 13:15:08 -0400 Received: from youngberry.canonical.com ([91.189.89.112]:51357 "EHLO youngberry.canonical.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237170AbhCXROu (ORCPT ); Wed, 24 Mar 2021 13:14:50 -0400 Received: from 1-171-92-165.dynamic-ip.hinet.net ([1.171.92.165] helo=localhost) by youngberry.canonical.com with esmtpsa (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1lP75J-0002qF-Lu; Wed, 24 Mar 2021 17:14:22 +0000 From: Kai-Heng Feng To: tiwai@suse.com Cc: Kai-Heng Feng , Jaroslav Kysela , Lars-Peter Clausen , Chris Chiu , Joe Perches , Tom Yan , alsa-devel@alsa-project.org (moderated list:SOUND), linux-kernel@vger.kernel.org (open list) Subject: [PATCH 2/2] ALSA: usb-audio: Check connector value on resume Date: Thu, 25 Mar 2021 01:14:08 +0800 Message-Id: <20210324171410.285848-2-kai.heng.feng@canonical.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210324171410.285848-1-kai.heng.feng@canonical.com> References: <20210324171410.285848-1-kai.heng.feng@canonical.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Rear Mic on Lenovo P620 cannot record after S3, despite that there's no error and the other two functions of the USB audio, Line In and Line Out, work just fine. The mic starts to work again after running userspace app like "alsactl store". Following the lead, the evidence shows that as soon as connector status is queried, the mic can work again. So also check connector value on resume to "wake up" the USB audio to make it functional. This can be device specific, however I think this generic approach may benefit more than one device. Signed-off-by: Kai-Heng Feng --- sound/usb/mixer.c | 18 ++++++++++++++++++ sound/usb/mixer.h | 1 + 2 files changed, 19 insertions(+) diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c index 98f5417a70e4..6a553d891b0f 100644 --- a/sound/usb/mixer.c +++ b/sound/usb/mixer.c @@ -3631,11 +3631,28 @@ static int restore_mixer_value(struct usb_mixer_elem_list *list) return 0; } +static int resume_connector(struct usb_mixer_elem_list *list) +{ + struct usb_mixer_elem_info *cval = mixer_elem_list_to_info(list); + + if (cval->val_type != USB_MIXER_BOOLEAN || cval->channels != 1) + return 0; + + return get_connector_value(cval, NULL, NULL); +} + int snd_usb_mixer_resume(struct usb_mixer_interface *mixer, bool reset_resume) { struct usb_mixer_elem_list *list; int id, err; + for (id = 0; id < MAX_ID_ELEMS; id++) { + for_each_mixer_elem(list, mixer, id) { + if (list->resume_connector) + list->resume_connector(list); + } + } + if (reset_resume) { /* restore cached mixer values */ for (id = 0; id < MAX_ID_ELEMS; id++) { @@ -3664,5 +3681,6 @@ void snd_usb_mixer_elem_init_std(struct usb_mixer_elem_list *list, list->dump = snd_usb_mixer_dump_cval; #ifdef CONFIG_PM list->resume = restore_mixer_value; + list->resume_connector = resume_connector; #endif } diff --git a/sound/usb/mixer.h b/sound/usb/mixer.h index c29e27ac43a7..843ccff0eea3 100644 --- a/sound/usb/mixer.h +++ b/sound/usb/mixer.h @@ -69,6 +69,7 @@ struct usb_mixer_elem_list { bool is_std_info; usb_mixer_elem_dump_func_t dump; usb_mixer_elem_resume_func_t resume; + usb_mixer_elem_resume_func_t resume_connector; }; /* iterate over mixer element list of the given unit id */ -- 2.30.2