From patchwork Wed Mar 24 17:14:07 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kai-Heng Feng X-Patchwork-Id: 12161863 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7C349C433DB for ; Wed, 24 Mar 2021 17:15:44 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 33B8561A1A for ; Wed, 24 Mar 2021 17:15:43 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 33B8561A1A Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=canonical.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 6D106165D; Wed, 24 Mar 2021 18:14:51 +0100 (CET) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 6D106165D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1616606141; bh=Smv1/2B7jaAEm9r6AUsFlIPgkB5uQKB59jUujCAkoJ4=; h=From:To:Subject:Date:Cc:List-Id:List-Unsubscribe:List-Archive: List-Post:List-Help:List-Subscribe:From; b=GjY519ihm3jH0axBl52J3NsA5XJ3WhDVSfP/pKMQFCpgoT4eY6FZHwj4VHzaEygS2 2ld+LMNk9HefmN1vJ+MYkofdioSZjgH5aqb54hadqQJVdXFKmWH+ZSpee7p8mEp4Km jGNuv2yCeyPUogzYk+8TkHO4MI4caTX4HFApr3g4= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id B5E66F8016B; Wed, 24 Mar 2021 18:14:50 +0100 (CET) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 39E40F8016B; Wed, 24 Mar 2021 18:14:49 +0100 (CET) Received: from youngberry.canonical.com (youngberry.canonical.com [91.189.89.112]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 8466DF80156 for ; Wed, 24 Mar 2021 18:14:37 +0100 (CET) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 8466DF80156 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 1lP75D-0002q7-UY; Wed, 24 Mar 2021 17:14:16 +0000 From: Kai-Heng Feng To: tiwai@suse.com Subject: [PATCH 1/2] ALSA: usb-audio: Carve out connector value checking into a helper Date: Thu, 25 Mar 2021 01:14:07 +0800 Message-Id: <20210324171410.285848-1-kai.heng.feng@canonical.com> X-Mailer: git-send-email 2.30.2 MIME-Version: 1.0 Cc: Kai-Heng Feng , "moderated list:SOUND" , Lars-Peter Clausen , Chris Chiu , open list , Mark Brown , Joe Perches , Tom Yan X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: "Alsa-devel mailing list for ALSA developers - http://www.alsa-project.org" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" This is preparation for next patch, no functional change intended. Signed-off-by: Kai-Heng Feng --- sound/usb/mixer.c | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c index b004b2e63a5d..98f5417a70e4 100644 --- a/sound/usb/mixer.c +++ b/sound/usb/mixer.c @@ -1446,13 +1446,11 @@ static int mixer_ctl_master_bool_get(struct snd_kcontrol *kcontrol, return 0; } -/* get the connectors status and report it as boolean type */ -static int mixer_ctl_connector_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) +static int get_connector_value(struct usb_mixer_elem_info *cval, + char *name, int *val) { - struct usb_mixer_elem_info *cval = kcontrol->private_data; struct snd_usb_audio *chip = cval->head.mixer->chip; - int idx = 0, validx, ret, val; + int idx = 0, validx, ret; validx = cval->control << 8 | 0; @@ -1467,21 +1465,24 @@ static int mixer_ctl_connector_get(struct snd_kcontrol *kcontrol, ret = snd_usb_ctl_msg(chip->dev, usb_rcvctrlpipe(chip->dev, 0), UAC2_CS_CUR, USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN, validx, idx, &uac2_conn, sizeof(uac2_conn)); - val = !!uac2_conn.bNrChannels; + if (val) + *val = !!uac2_conn.bNrChannels; } else { /* UAC_VERSION_3 */ struct uac3_insertion_ctl_blk uac3_conn; ret = snd_usb_ctl_msg(chip->dev, usb_rcvctrlpipe(chip->dev, 0), UAC2_CS_CUR, USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN, validx, idx, &uac3_conn, sizeof(uac3_conn)); - val = !!uac3_conn.bmConInserted; + if (val) + *val = !!uac3_conn.bmConInserted; } snd_usb_unlock_shutdown(chip); if (ret < 0) { - if (strstr(kcontrol->id.name, "Speaker")) { - ucontrol->value.integer.value[0] = 1; + if (name && strstr(name, "Speaker")) { + if (val) + *val = 1; return 0; } error: @@ -1491,6 +1492,21 @@ static int mixer_ctl_connector_get(struct snd_kcontrol *kcontrol, return filter_error(cval, ret); } + return ret; +} + +/* get the connectors status and report it as boolean type */ +static int mixer_ctl_connector_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct usb_mixer_elem_info *cval = kcontrol->private_data; + int ret, val; + + ret = get_connector_value(cval, kcontrol->id.name, &val); + + if (ret) + return ret; + ucontrol->value.integer.value[0] = val; return 0; } From patchwork Wed Mar 24 17:14:08 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kai-Heng Feng X-Patchwork-Id: 12161865 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B6C17C433DB for ; Wed, 24 Mar 2021 17:16:34 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 9B25761A19 for ; Wed, 24 Mar 2021 17:16:33 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 9B25761A19 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=canonical.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 269F01679; Wed, 24 Mar 2021 18:15:42 +0100 (CET) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 269F01679 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1616606192; bh=prd4n3hJYvAyQrBWQcFsLTVrSxI04fm5fPyAnKHJ90U=; h=From:To:Subject:Date:In-Reply-To:References:Cc:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=MT3obQNLUk80htOmzMskQzhrOzPycWPXEfSuhjXPH4PW6mNGp/pJSJCPO3s4bcspJ nZroZi7sy0y1DSL/rEw4hTIfmvoSkzAAv/1z4Q1FjanN6q3czwQWy9poV0JY2Ssib6 FismWbVKKjSGv2JvnlrAO/UcLT7JNi3zFcpqzghw= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 9A04CF801D5; Wed, 24 Mar 2021 18:14:56 +0100 (CET) Received: by alsa1.perex.cz (Postfix, from userid 50401) id DAAABF801D5; Wed, 24 Mar 2021 18:14:54 +0100 (CET) Received: from youngberry.canonical.com (youngberry.canonical.com [91.189.89.112]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 89C45F8012B for ; Wed, 24 Mar 2021 18:14:43 +0100 (CET) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 89C45F8012B 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 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 Cc: "moderated list:SOUND" , Lars-Peter Clausen , Chris Chiu , open list , Tom Yan , Kai-Heng Feng , Joe Perches X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: "Alsa-devel mailing list for ALSA developers - http://www.alsa-project.org" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" 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 */