Received: by 2002:a05:6a10:c604:0:0:0:0 with SMTP id y4csp3774278pxt; Tue, 10 Aug 2021 11:01:47 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx+yPpULW8b4Pku2h8Rbe5/Ieo/iEDUATMgPP7umZkmXfX99mzf0FKdm7EqS+VDKqfTahY0 X-Received: by 2002:a50:8fe1:: with SMTP id y88mr6365897edy.101.1628618507183; Tue, 10 Aug 2021 11:01:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1628618507; cv=none; d=google.com; s=arc-20160816; b=J9BRb+/POdht0VpdFd41XN1sO2di5oa0BI3C1KPfpnSbEZnh/rIwMehVaN7plZUxBL IqN0tVSJrBws5TWrRCed9QdJOxVc72dfeYZclxMKKBzfIZ4LctQL21+TIS2j/+53jiYl Vuo2hhnQbAo6mPGBIxL66HupYlN/7YSTR6bjsF4f0lHgM67zV7yy3bf3v6fQjIDA/VGO yvTVYEcaPxoks81wsJU6y/wDKFW/0BzJ9YUwEPQz8gvDxarc7XJ4G6I+0wPDFrDe1n2D b9QPe91g7dQnBNQlOXtlkURx5Ygta6Ya1kNFgnMnGNBsRhFnWYLCg4GjGnhJ3CE+arFS KhsQ== 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 :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=ZcQ48tdQUHDBeh5vpdfQAJFqn2B/H2GL6Ym40BBcjOg=; b=usIbGTfBY/wNWrJrv14+PuCdnye9odyutZ0dZG/pHdDzElawkTcySmoA2Rg9hsYyuz 268rPanLpH1TQKpXHRpXlfOIxEgjVACCwdJuywf+e0TSclnjLMhQVrQB9Fs3AOZcT95N R3CxMEMDtpMmNl4ktGyqLdo/RoJk1VJBVJBGcOTEyYQd74HWt+iMVrvUwrASRMWezHjI LY2xhHRe15cEEG7r8oJ8YVn01lp26lTXK1gr0mlIW6qmDfwaN3jomAnqNSffMWAVLCzy jAhEH5cYDnoBEXj3YU+eh7996TIAwwnXeK0Bzsmh6VTWKWcunZ5M4d1Ouv3piBPUBYXS toxA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=Cz5eSkjH; 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=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id hp23si28824ejc.39.2021.08.10.11.01.21; Tue, 10 Aug 2021 11:01:47 -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; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=Cz5eSkjH; 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=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238507AbhHJR7j (ORCPT + 99 others); Tue, 10 Aug 2021 13:59:39 -0400 Received: from mail.kernel.org ([198.145.29.99]:55478 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237080AbhHJR4g (ORCPT ); Tue, 10 Aug 2021 13:56:36 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 8E702610CC; Tue, 10 Aug 2021 17:45:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1628617506; bh=LhevaPbSOWKNVze6HPaYFtDGUY+O3AQEDigxjY6v5cg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Cz5eSkjHrteiw6EPjBun93ldtfR+oymx9UhnHcbumdgptssu6dhSRzcJ3hQDzMJ7V 7YXhDfi+em58qCr36bqY0kucE7V7NJbYghdbZL82mou87MfOIbKjN1Is6iEOxXQtRo 9cBDE9oJWOaUdRmruDut/RjOlpBo06HghQShJ8vU= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Takashi Iwai Subject: [PATCH 5.13 088/175] ALSA: usb-audio: Avoid unnecessary or invalid connector selection at resume Date: Tue, 10 Aug 2021 19:29:56 +0200 Message-Id: <20210810173003.842326036@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210810173000.928681411@linuxfoundation.org> References: <20210810173000.928681411@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Takashi Iwai commit 8dde723fcde4479f256441da03793e37181d9f21 upstream. The recent fix for the resume on Lenovo machines seems causing a regression on others. It's because the change always triggers the connector selection no matter which widget node type is. This patch addresses the regression by setting the resume callback selectively only for the connector widget. Fixes: 44609fc01f28 ("ALSA: usb-audio: Check connector value on resume") Cc: BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=213897 Link: https://lore.kernel.org/r/20210729185126.24432-1-tiwai@suse.de Signed-off-by: Takashi Iwai Signed-off-by: Greg Kroah-Hartman --- sound/usb/mixer.c | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) --- a/sound/usb/mixer.c +++ b/sound/usb/mixer.c @@ -1816,6 +1816,15 @@ static void get_connector_control_name(s strlcat(name, " - Output Jack", name_size); } +/* get connector value to "wake up" the USB audio */ +static int connector_mixer_resume(struct usb_mixer_elem_list *list) +{ + struct usb_mixer_elem_info *cval = mixer_elem_list_to_info(list); + + get_connector_value(cval, NULL, NULL); + return 0; +} + /* Build a mixer control for a UAC connector control (jack-detect) */ static void build_connector_control(struct usb_mixer_interface *mixer, const struct usbmix_name_map *imap, @@ -1833,6 +1842,10 @@ static void build_connector_control(stru if (!cval) return; snd_usb_mixer_elem_init_std(&cval->head, mixer, term->id); + + /* set up a specific resume callback */ + cval->head.resume = connector_mixer_resume; + /* * UAC2: The first byte from reading the UAC2_TE_CONNECTOR control returns the * number of channels connected. @@ -3642,23 +3655,15 @@ static int restore_mixer_value(struct us return 0; } -static int default_mixer_resume(struct usb_mixer_elem_list *list) -{ - struct usb_mixer_elem_info *cval = mixer_elem_list_to_info(list); - - /* get connector value to "wake up" the USB audio */ - if (cval->val_type == USB_MIXER_BOOLEAN && cval->channels == 1) - get_connector_value(cval, NULL, NULL); - - return 0; -} - static int default_mixer_reset_resume(struct usb_mixer_elem_list *list) { - int err = default_mixer_resume(list); + int err; - if (err < 0) - return err; + if (list->resume) { + err = list->resume(list); + if (err < 0) + return err; + } return restore_mixer_value(list); } @@ -3697,7 +3702,7 @@ void snd_usb_mixer_elem_init_std(struct list->id = unitid; list->dump = snd_usb_mixer_dump_cval; #ifdef CONFIG_PM - list->resume = default_mixer_resume; + list->resume = NULL; list->reset_resume = default_mixer_reset_resume; #endif }