From patchwork Tue Jul 31 12:28:41 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jorge Sanjuan X-Patchwork-Id: 10550717 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 67548A748 for ; Tue, 31 Jul 2018 12:39:26 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 556762A98B for ; Tue, 31 Jul 2018 12:39:26 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 4A4642AA7E; Tue, 31 Jul 2018 12:39:26 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1B61B2A98B for ; Tue, 31 Jul 2018 12:39:25 +0000 (UTC) Received: from alsa0.perex.cz (localhost [127.0.0.1]) by alsa0.perex.cz (Postfix) with ESMTP id C2F2F2677C1; Tue, 31 Jul 2018 14:28:55 +0200 (CEST) X-Original-To: alsa-devel@alsa-project.org Delivered-To: alsa-devel@alsa-project.org Received: by alsa0.perex.cz (Postfix, from userid 1000) id 9C0382677D1; Tue, 31 Jul 2018 14:28:53 +0200 (CEST) Received: from imap1.codethink.co.uk (imap1.codethink.co.uk [176.9.8.82]) by alsa0.perex.cz (Postfix) with ESMTP id 6D05E2677C4 for ; Tue, 31 Jul 2018 14:28:50 +0200 (CEST) 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 1fkTlg-0000tp-VA; Tue, 31 Jul 2018 13:28:49 +0100 From: Jorge Sanjuan To: tiwai@suse.de Date: Tue, 31 Jul 2018 13:28:41 +0100 Message-Id: <20180731122845.4859-1-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> Cc: alsa-devel@alsa-project.org, linux-kernel@vger.kernel.org Subject: [alsa-devel] [PATCH v3 0/4] usb-audio: Add UAC3 Power Domains X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.14 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: , MIME-Version: 1.0 Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org X-Virus-Scanned: ClamAV using ClamSMTP This is what's new in this v3: - Add proper SPDX identifier for new source file. - Add delay unit in comment for BADD inferred recovery times and specify the actual delay time for them. - Suspend the usb stream *after* alsa has supended its stuff. - Make sure Power State changes to D0 happen *before* stream format is set. - Try to set the Power State to D0 on .prepare callback too as recovery from suspend state doesn't need .hw_params call. This patchset adds support for UAC3 Power Domains. This feature of the USB audio class 3 allows the host to notify the device what it is making use of so power comsumption can be optimized. This proposal implements this feature for Power Domains that include an Input/Output Terminal associated to an audio Streaming interface. This is the main usage of this feature according to the spec. For that reason, the logic for the Power Domain state change has been implemented within the ALSA PCMs logic and the suspend/resume callbacks of the usb_driver. The behaviour would be as follows: * Power Domain State D0: A Power Domain will reach this state only when the audio substream associated to that domain is being used (i,e. Audio playback/capture is happening). * Power Domain State D1: This is the Idle state where the driver is going to always want to be in order to reduce power consumption. * Power Domain State D2: This state is only set when the usb driver asumes the device is not going to be used anymore and hence, it wont care about getting any interrupts from the device. This will only happen when power level is set to "auto" in sysfs so the usb driver gets suspended when the interfaces are not in use. NOTE: The way this has been implemented will always try to put the Power Domain in state D1 if the Power Domain exists. The patch "ALSA: usb-audio: Operate UAC3 Power Domains in PCM callbacks" puts the logic for doing so inside the PCM's logic. Something to improve on that is to also tie up those D1<->D0 state changes to runtime PM maybe. Jorge Sanjuan (4): ALSA: usb-audio: Initial Power Domain support ALSA: usb-audio: AudioStreaming Power Domain parsing ALSA: usb-audio: Add UAC3 Power Domains to suspend/resume ALSA: usb-audio: Operate UAC3 Power Domains in PCM callbacks include/linux/usb/audio-v3.h | 4 ++ sound/usb/Makefile | 1 + sound/usb/card.c | 9 ++++ sound/usb/card.h | 2 + sound/usb/pcm.c | 68 ++++++++++++++++++++++++++-- sound/usb/pcm.h | 2 + sound/usb/power.c | 104 +++++++++++++++++++++++++++++++++++++++++++ sound/usb/power.h | 19 ++++++++ sound/usb/stream.c | 70 +++++++++++++++++++++++++---- 9 files changed, 268 insertions(+), 11 deletions(-) create mode 100644 sound/usb/power.c