Received: by 2002:ac0:a5a7:0:0:0:0:0 with SMTP id m36-v6csp1578160imm; Thu, 19 Jul 2018 04:24:02 -0700 (PDT) X-Google-Smtp-Source: AAOMgpcIrXVhFcEpyP7X2YjjW7aqcSde6S+WC8PWWItfD5//9VUshv0cg6qkXqd1rvTbMCR9h2nT X-Received: by 2002:a62:930c:: with SMTP id b12-v6mr9087057pfe.193.1531999442886; Thu, 19 Jul 2018 04:24:02 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1531999442; cv=none; d=google.com; s=arc-20160816; b=0BLelwYW0jqB+tkwa/Z/d5QnABrKt+fVUdyXzn6SgqqpcjJJOGQrV0xhQEm0d+h9YF Jvw4Y0DSbHzD3lmwP0g56VyXAKIKYfAMNMXuBWhNtuT6kfCsV/j8sPKbAYOztyucQ9ht wbwylTHGx+ZxI7+AuYrjgj26BAMb1hWfnfyYTOZlYbCYbshybwDWGBVJa0Y7LeFXhuZW 895nRYVkJuKB/4zLvjVyEQvJTQgr10sp09buDOkiZvyP8wiN3xJQB+1MSN0RnHgUr4zO as1GqU1rdBWVAiyK5EwLKgvy+1RBheqAWU4AWNVYBKotg3gFagEAjQBcODcnUngBgGLO 5BrA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=akGhS1qOY3kmjFDJeg50qWHmCt2X2kUSjIpimsJ/rLM=; b=ZGoxgmCY/VcTakJe/VVxIEWwPnoYP4NEVz9FhyxNjkg/2Hj7IH+WSxZfkd8l89XplX MImYmHx7BZb7XKEiNLUgPUuR/mGgQ7qi+j9kMzm70yVu7C5EAraLbfQXH4ZdNtxK7vkL fQu3sQj0Ji2/eiN6ie8j5A1kmWmhE3MAb9tDnGVWX4Z2stvJp0DDnUOz1zajJnaqOrNX X5j1zT0M/7tMjRrQUzFgh5SRr8MNwr7lMaU005OICjFu6AO6sLI4dvnCwga9EZweqM26 or3TY7Cml5uxwEByz4jal+itU/XujwXIQCwZXG9h89KBLNJXgtEzPN/R5HiuiYd8++Zl BsnA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=codethink.co.uk Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f27-v6si5759448pfk.107.2018.07.19.04.23.48; Thu, 19 Jul 2018 04:24:02 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=codethink.co.uk Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730922AbeGSMFE (ORCPT + 99 others); Thu, 19 Jul 2018 08:05:04 -0400 Received: from imap1.codethink.co.uk ([176.9.8.82]:59732 "EHLO imap1.codethink.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727504AbeGSMFE (ORCPT ); Thu, 19 Jul 2018 08:05:04 -0400 Received: from [148.252.241.226] (helo=ct-lt-1121.office.codethink.co.uk) by imap1.codethink.co.uk with esmtpsa (Exim 4.84_2 #1 (Debian)) id 1fg70l-0004fU-Az; Thu, 19 Jul 2018 12:22:19 +0100 From: Jorge Sanjuan To: tiwai@suse.de Cc: alsa-devel@alsa-project.org, linux-kernel@vger.kernel.org Subject: [PATCH 3/4] ALSA: usb-audio: Operate UAC3 Power Domains in PCM callbacks Date: Thu, 19 Jul 2018 12:22:14 +0100 Message-Id: <20180719112215.4219-4-jorge.sanjuan@codethink.co.uk> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180719112215.4219-1-jorge.sanjuan@codethink.co.uk> References: <20180719112215.4219-1-jorge.sanjuan@codethink.co.uk> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Make use of UAC3 Power Domains associated to an Audio Streaming path within the PCM's logic. This means, when there is no audio being transferred (pcm is closed), the host will set the Power Domain associated to that substream to state D1. When audio is being transferred (from hw_params onwards), the Power Domain will be set to D0 state. This is the way the host lets the device now which Terminal is going to be actively used and it is for the device to manage its own internal resources on that UAC3 Power Domain. Signed-off-by: Jorge Sanjuan --- sound/usb/pcm.c | 34 +++++++++++++++++++++++++++++++--- sound/usb/stream.c | 6 +++++- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c index 4b930fa47277..0ae5f539706d 100644 --- a/sound/usb/pcm.c +++ b/sound/usb/pcm.c @@ -711,6 +711,24 @@ static int configure_endpoint(struct snd_usb_substream *subs) return ret; } +static int snd_usb_pcm_change_state(struct snd_usb_substream *subs, int state) +{ + int ret; + + if (!subs->str_pd) + return 0; + + ret = snd_usb_power_domain_set(subs->stream->chip, subs->str_pd, state); + if (ret < 0) { + dev_err(&subs->dev->dev, + "Cannot change Power Domain ID: %d to state: %d. Err: %d\n", + subs->str_pd->pd_id, state, ret); + return ret; + } + + return 0; +} + /* * hw_params callback * @@ -755,16 +773,22 @@ static int snd_usb_hw_params(struct snd_pcm_substream *substream, ret = snd_usb_lock_shutdown(subs->stream->chip); if (ret < 0) return ret; + ret = set_format(subs, fmt); - snd_usb_unlock_shutdown(subs->stream->chip); if (ret < 0) - return ret; + goto unlock; + + ret = snd_usb_pcm_change_state(subs, UAC3_PD_STATE_D0); + if (ret < 0) + goto unlock; subs->interface = fmt->iface; subs->altset_idx = fmt->altset_idx; subs->need_setup_ep = true; - return 0; + unlock: + snd_usb_unlock_shutdown(subs->stream->chip); + return ret; } /* @@ -1265,6 +1289,7 @@ static int snd_usb_pcm_close(struct snd_pcm_substream *substream) int direction = substream->stream; struct snd_usb_stream *as = snd_pcm_substream_chip(substream); struct snd_usb_substream *subs = &as->substream[direction]; + int ret; stop_endpoints(subs, true); @@ -1273,7 +1298,10 @@ static int snd_usb_pcm_close(struct snd_pcm_substream *substream) !snd_usb_lock_shutdown(subs->stream->chip)) { usb_set_interface(subs->dev, subs->interface, 0); subs->interface = -1; + ret = snd_usb_pcm_change_state(subs, UAC3_PD_STATE_D1); snd_usb_unlock_shutdown(subs->stream->chip); + if (ret < 0) + return ret; } subs->pcm_substream = NULL; diff --git a/sound/usb/stream.c b/sound/usb/stream.c index 031878a2a481..96402ca87aa5 100644 --- a/sound/usb/stream.c +++ b/sound/usb/stream.c @@ -110,8 +110,12 @@ static void snd_usb_init_substream(struct snd_usb_stream *as, if (fp->channels > subs->channels_max) subs->channels_max = fp->channels; - if (pd) + if (pd) { subs->str_pd = pd; + /* Initialize Power Domain to idle status D1 */ + snd_usb_power_domain_set(subs->stream->chip, pd, + UAC3_PD_STATE_D1); + } snd_usb_preallocate_buffer(subs); } -- 2.11.0