From mboxrd@z Thu Jan 1 00:00:00 1970 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=-15.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED 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 7F4C0C47085 for ; Tue, 25 May 2021 16:01:20 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 65C8D61401 for ; Tue, 25 May 2021 16:01:20 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233329AbhEYQCt (ORCPT ); Tue, 25 May 2021 12:02:49 -0400 Received: from mx2.suse.de ([195.135.220.15]:44222 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233057AbhEYQCs (ORCPT ); Tue, 25 May 2021 12:02:48 -0400 X-Virus-Scanned: by amavisd-new at test-mx.suse.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1621958477; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=NnQk2EnrULXDbLlOknbDCceBI4BQxTF+S6KqI6l9suw=; b=ZKZRyalGloOyEqEutXS38VwiM65DSjWuu/yP8sylQ3T4wMy8KTFw21+l40cpDzhX7HU8K3 b+zQFGPiwNT/e8y2AKdvr3abYEV1xEx1IgjGrMr4jElYd/9ScsWYqn2bLqdgJFnvSPfiFI VShWwhBy6yFdKCN4D5l/OIE3bAYrxgw= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1621958477; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=NnQk2EnrULXDbLlOknbDCceBI4BQxTF+S6KqI6l9suw=; b=F0HaFIzq5DbMWZQEvbmayEfBjpqkUcyol2Rzlyjy3tWBLiIP6xnVi6o1rUJCW6cd/cGbLo vbqz0pqjxZB89WCw== Received: from relay2.suse.de (unknown [195.135.221.27]) by mx2.suse.de (Postfix) with ESMTP id D7C60AE5C; Tue, 25 May 2021 16:01:16 +0000 (UTC) Date: Tue, 25 May 2021 18:01:16 +0200 Message-ID: From: Takashi Iwai To: Maxime Ripard Cc: Jaroslav Kysela , Mark Brown , dri-devel@lists.freedesktop.org, Daniel Vetter , David Airlie , Maarten Lankhorst , Thomas Zimmermann , Liam Girdwood , Takashi Iwai , devicetree@vger.kernel.org, Dave Stevenson , Phil Elwell , Tim Gover , Dom Cobley , linux-doc@vger.kernel.org, Eric Anholt , Nicolas Saenz Julienne , linux-kernel@vger.kernel.org, alsa-devel@alsa-project.org, Maxime Ripard , Nicolas Saenz Julienne , bcm-kernel-feedback-list@broadcom.com, linux-arm-kernel@lists.infradead.org, Daniel Vetter , linux-rpi-kernel@lists.infradead.org, Jonathan Corbet , Rob Herring Subject: Re: [PATCH v2 02/12] ALSA: iec958: Split status creation and fill In-Reply-To: <20210525132354.297468-3-maxime@cerno.tech> References: <20210525132354.297468-1-maxime@cerno.tech> <20210525132354.297468-3-maxime@cerno.tech> User-Agent: Wanderlust/2.15.9 (Almost Unreal) SEMI/1.14.6 (Maruoka) FLIM/1.14.9 (=?UTF-8?B?R29qxY0=?=) APEL/10.8 Emacs/25.3 (x86_64-suse-linux-gnu) MULE/6.0 (HANACHIRUSATO) MIME-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka") Content-Type: text/plain; charset=US-ASCII Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, 25 May 2021 15:23:44 +0200, Maxime Ripard wrote: > > In some situations, like a codec probe, we need to provide an IEC status > default but don't have access to the sampling rate and width yet since > no stream has been configured yet. > > Each and every driver has its own default, whereas the core iec958 code > also has some buried in the snd_pcm_create_iec958_consumer functions. > > Let's split these functions in two to provide a default that doesn't > rely on the sampling rate and width, and another function to fill them > when available. > > Signed-off-by: Maxime Ripard Reviewed-by: Takashi Iwai thanks, Takashi > --- > include/sound/pcm_iec958.h | 8 ++ > sound/core/pcm_iec958.c | 176 ++++++++++++++++++++++++++++--------- > 2 files changed, 141 insertions(+), 43 deletions(-) > > diff --git a/include/sound/pcm_iec958.h b/include/sound/pcm_iec958.h > index 0939aa45e2fe..64e84441cde1 100644 > --- a/include/sound/pcm_iec958.h > +++ b/include/sound/pcm_iec958.h > @@ -4,6 +4,14 @@ > > #include > > +int snd_pcm_create_iec958_consumer_default(u8 *cs, size_t len); > + > +int snd_pcm_fill_iec958_consumer(struct snd_pcm_runtime *runtime, u8 *cs, > + size_t len); > + > +int snd_pcm_fill_iec958_consumer_hw_params(struct snd_pcm_hw_params *params, > + u8 *cs, size_t len); > + > int snd_pcm_create_iec958_consumer(struct snd_pcm_runtime *runtime, u8 *cs, > size_t len); > > diff --git a/sound/core/pcm_iec958.c b/sound/core/pcm_iec958.c > index f9a211cc1f2c..7a1b816f67cc 100644 > --- a/sound/core/pcm_iec958.c > +++ b/sound/core/pcm_iec958.c > @@ -9,41 +9,85 @@ > #include > #include > > -static int create_iec958_consumer(uint rate, uint sample_width, > - u8 *cs, size_t len) > +/** > + * snd_pcm_create_iec958_consumer_default - create default consumer format IEC958 channel status > + * @cs: channel status buffer, at least four bytes > + * @len: length of channel status buffer > + * > + * Create the consumer format channel status data in @cs of maximum size > + * @len. When relevant, the configuration-dependant bits will be set as > + * unspecified. > + * > + * Drivers should then call einter snd_pcm_fill_iec958_consumer() or > + * snd_pcm_fill_iec958_consumer_hw_params() to replace these unspecified > + * bits by their actual values. > + * > + * Drivers may wish to tweak the contents of the buffer after creation. > + * > + * Returns: length of buffer, or negative error code if something failed. > + */ > +int snd_pcm_create_iec958_consumer_default(u8 *cs, size_t len) > { > - unsigned int fs, ws; > - > if (len < 4) > return -EINVAL; > > - switch (rate) { > - case 32000: > - fs = IEC958_AES3_CON_FS_32000; > - break; > - case 44100: > - fs = IEC958_AES3_CON_FS_44100; > - break; > - case 48000: > - fs = IEC958_AES3_CON_FS_48000; > - break; > - case 88200: > - fs = IEC958_AES3_CON_FS_88200; > - break; > - case 96000: > - fs = IEC958_AES3_CON_FS_96000; > - break; > - case 176400: > - fs = IEC958_AES3_CON_FS_176400; > - break; > - case 192000: > - fs = IEC958_AES3_CON_FS_192000; > - break; > - default: > + memset(cs, 0, len); > + > + cs[0] = IEC958_AES0_CON_NOT_COPYRIGHT | IEC958_AES0_CON_EMPHASIS_NONE; > + cs[1] = IEC958_AES1_CON_GENERAL; > + cs[2] = IEC958_AES2_CON_SOURCE_UNSPEC | IEC958_AES2_CON_CHANNEL_UNSPEC; > + cs[3] = IEC958_AES3_CON_CLOCK_1000PPM | IEC958_AES3_CON_FS_NOTID; > + > + if (len > 4) > + cs[4] = IEC958_AES4_CON_WORDLEN_NOTID; > + > + return len; > +} > +EXPORT_SYMBOL_GPL(snd_pcm_create_iec958_consumer_default); > + > +static int fill_iec958_consumer(uint rate, uint sample_width, > + u8 *cs, size_t len) > +{ > + if (len < 4) > return -EINVAL; > + > + if ((cs[3] & IEC958_AES3_CON_FS) == IEC958_AES3_CON_FS_NOTID) { > + unsigned int fs; > + > + switch (rate) { > + case 32000: > + fs = IEC958_AES3_CON_FS_32000; > + break; > + case 44100: > + fs = IEC958_AES3_CON_FS_44100; > + break; > + case 48000: > + fs = IEC958_AES3_CON_FS_48000; > + break; > + case 88200: > + fs = IEC958_AES3_CON_FS_88200; > + break; > + case 96000: > + fs = IEC958_AES3_CON_FS_96000; > + break; > + case 176400: > + fs = IEC958_AES3_CON_FS_176400; > + break; > + case 192000: > + fs = IEC958_AES3_CON_FS_192000; > + break; > + default: > + return -EINVAL; > + } > + > + cs[3] &= ~IEC958_AES3_CON_FS; > + cs[3] |= fs; > } > > - if (len > 4) { > + if (len > 4 && > + (cs[4] & IEC958_AES4_CON_WORDLEN) == IEC958_AES4_CON_WORDLEN_NOTID) { > + unsigned int ws; > + > switch (sample_width) { > case 16: > ws = IEC958_AES4_CON_WORDLEN_20_16; > @@ -64,21 +108,58 @@ static int create_iec958_consumer(uint rate, uint sample_width, > default: > return -EINVAL; > } > + > + cs[4] &= ~IEC958_AES4_CON_WORDLEN; > + cs[4] |= ws; > } > > - memset(cs, 0, len); > - > - cs[0] = IEC958_AES0_CON_NOT_COPYRIGHT | IEC958_AES0_CON_EMPHASIS_NONE; > - cs[1] = IEC958_AES1_CON_GENERAL; > - cs[2] = IEC958_AES2_CON_SOURCE_UNSPEC | IEC958_AES2_CON_CHANNEL_UNSPEC; > - cs[3] = IEC958_AES3_CON_CLOCK_1000PPM | fs; > - > - if (len > 4) > - cs[4] = ws; > - > return len; > } > > +/** > + * snd_pcm_fill_iec958_consumer - Fill consumer format IEC958 channel status > + * @runtime: pcm runtime structure with ->rate filled in > + * @cs: channel status buffer, at least four bytes > + * @len: length of channel status buffer > + * > + * Fill the unspecified bits in an IEC958 status bits array using the > + * parameters of the PCM runtime @runtime. > + * > + * Drivers may wish to tweak the contents of the buffer after its been > + * filled. > + * > + * Returns: length of buffer, or negative error code if something failed. > + */ > +int snd_pcm_fill_iec958_consumer(struct snd_pcm_runtime *runtime, > + u8 *cs, size_t len) > +{ > + return fill_iec958_consumer(runtime->rate, > + snd_pcm_format_width(runtime->format), > + cs, len); > +} > +EXPORT_SYMBOL_GPL(snd_pcm_fill_iec958_consumer); > + > +/** > + * snd_pcm_fill_iec958_consumer_hw_params - Fill consumer format IEC958 channel status > + * @params: the hw_params instance for extracting rate and sample format > + * @cs: channel status buffer, at least four bytes > + * @len: length of channel status buffer > + * > + * Fill the unspecified bits in an IEC958 status bits array using the > + * parameters of the PCM hardware parameters @params. > + * > + * Drivers may wish to tweak the contents of the buffer after its been > + * filled.. > + * > + * Returns: length of buffer, or negative error code if something failed. > + */ > +int snd_pcm_fill_iec958_consumer_hw_params(struct snd_pcm_hw_params *params, > + u8 *cs, size_t len) > +{ > + return fill_iec958_consumer(params_rate(params), params_width(params), cs, len); > +} > +EXPORT_SYMBOL_GPL(snd_pcm_fill_iec958_consumer_hw_params); > + > /** > * snd_pcm_create_iec958_consumer - create consumer format IEC958 channel status > * @runtime: pcm runtime structure with ->rate filled in > @@ -95,9 +176,13 @@ static int create_iec958_consumer(uint rate, uint sample_width, > int snd_pcm_create_iec958_consumer(struct snd_pcm_runtime *runtime, u8 *cs, > size_t len) > { > - return create_iec958_consumer(runtime->rate, > - snd_pcm_format_width(runtime->format), > - cs, len); > + int ret; > + > + ret = snd_pcm_create_iec958_consumer_default(cs, len); > + if (ret < 0) > + return ret; > + > + return snd_pcm_fill_iec958_consumer(runtime, cs, len); > } > EXPORT_SYMBOL(snd_pcm_create_iec958_consumer); > > @@ -117,7 +202,12 @@ EXPORT_SYMBOL(snd_pcm_create_iec958_consumer); > int snd_pcm_create_iec958_consumer_hw_params(struct snd_pcm_hw_params *params, > u8 *cs, size_t len) > { > - return create_iec958_consumer(params_rate(params), params_width(params), > - cs, len); > + int ret; > + > + ret = snd_pcm_create_iec958_consumer_default(cs, len); > + if (ret < 0) > + return ret; > + > + return fill_iec958_consumer(params_rate(params), params_width(params), cs, len); > } > EXPORT_SYMBOL(snd_pcm_create_iec958_consumer_hw_params); > -- > 2.31.1 > From mboxrd@z Thu Jan 1 00:00:00 1970 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=-13.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 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 6C111C2B9F8 for ; Tue, 25 May 2021 16:02:16 +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 DE88861401 for ; Tue, 25 May 2021 16:02:15 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org DE88861401 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de 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 77673176C; Tue, 25 May 2021 18:01:24 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 77673176C DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1621958534; bh=LdRhNrjSw1h6JsCBBrVkPe+1fa1r3TDdgH1f6rvVMCc=; h=Date:From:To:Subject:In-Reply-To:References:Cc:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=CeHXBrJ3kFSRfiTGuPJf9zMN0Tw9uJxBYrYhihY071zcSvivPlKydHg7YO9NRNaOh rzN5q5zNcCuhcDuY2u/UvTSriWVSyIZSY2v9Is/RUQvmSbFZrv7pPAhEjvsSb1K4/o 2zqzpOZ1vfSeHtaj9W9Fm6QnF6lU/xPATycHpFCc= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 125A2F800C9; Tue, 25 May 2021 18:01:24 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 5675FF800CB; Tue, 25 May 2021 18:01:23 +0200 (CEST) Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 3ABACF800AC for ; Tue, 25 May 2021 18:01:17 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 3ABACF800AC Authentication-Results: alsa1.perex.cz; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.b="ZKZRyalG"; dkim=permerror (0-bit key) header.d=suse.de header.i=@suse.de header.b="F0HaFIzq" X-Virus-Scanned: by amavisd-new at test-mx.suse.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1621958477; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=NnQk2EnrULXDbLlOknbDCceBI4BQxTF+S6KqI6l9suw=; b=ZKZRyalGloOyEqEutXS38VwiM65DSjWuu/yP8sylQ3T4wMy8KTFw21+l40cpDzhX7HU8K3 b+zQFGPiwNT/e8y2AKdvr3abYEV1xEx1IgjGrMr4jElYd/9ScsWYqn2bLqdgJFnvSPfiFI VShWwhBy6yFdKCN4D5l/OIE3bAYrxgw= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1621958477; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=NnQk2EnrULXDbLlOknbDCceBI4BQxTF+S6KqI6l9suw=; b=F0HaFIzq5DbMWZQEvbmayEfBjpqkUcyol2Rzlyjy3tWBLiIP6xnVi6o1rUJCW6cd/cGbLo vbqz0pqjxZB89WCw== Received: from relay2.suse.de (unknown [195.135.221.27]) by mx2.suse.de (Postfix) with ESMTP id D7C60AE5C; Tue, 25 May 2021 16:01:16 +0000 (UTC) Date: Tue, 25 May 2021 18:01:16 +0200 Message-ID: From: Takashi Iwai To: Maxime Ripard Subject: Re: [PATCH v2 02/12] ALSA: iec958: Split status creation and fill In-Reply-To: <20210525132354.297468-3-maxime@cerno.tech> References: <20210525132354.297468-1-maxime@cerno.tech> <20210525132354.297468-3-maxime@cerno.tech> User-Agent: Wanderlust/2.15.9 (Almost Unreal) SEMI/1.14.6 (Maruoka) FLIM/1.14.9 (=?UTF-8?B?R29qxY0=?=) APEL/10.8 Emacs/25.3 (x86_64-suse-linux-gnu) MULE/6.0 (HANACHIRUSATO) MIME-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka") Content-Type: text/plain; charset=US-ASCII Cc: alsa-devel@alsa-project.org, Tim Gover , Liam Girdwood , David Airlie , dri-devel@lists.freedesktop.org, Takashi Iwai , Eric Anholt , Nicolas Saenz Julienne , Daniel Vetter , Phil Elwell , Dave Stevenson , linux-doc@vger.kernel.org, bcm-kernel-feedback-list@broadcom.com, devicetree@vger.kernel.org, Nicolas Saenz Julienne , Daniel Vetter , Maarten Lankhorst , Maxime Ripard , Mark Brown , linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org, Dom Cobley , Jonathan Corbet , linux-kernel@vger.kernel.org, Rob Herring , Thomas Zimmermann 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" On Tue, 25 May 2021 15:23:44 +0200, Maxime Ripard wrote: > > In some situations, like a codec probe, we need to provide an IEC status > default but don't have access to the sampling rate and width yet since > no stream has been configured yet. > > Each and every driver has its own default, whereas the core iec958 code > also has some buried in the snd_pcm_create_iec958_consumer functions. > > Let's split these functions in two to provide a default that doesn't > rely on the sampling rate and width, and another function to fill them > when available. > > Signed-off-by: Maxime Ripard Reviewed-by: Takashi Iwai thanks, Takashi > --- > include/sound/pcm_iec958.h | 8 ++ > sound/core/pcm_iec958.c | 176 ++++++++++++++++++++++++++++--------- > 2 files changed, 141 insertions(+), 43 deletions(-) > > diff --git a/include/sound/pcm_iec958.h b/include/sound/pcm_iec958.h > index 0939aa45e2fe..64e84441cde1 100644 > --- a/include/sound/pcm_iec958.h > +++ b/include/sound/pcm_iec958.h > @@ -4,6 +4,14 @@ > > #include > > +int snd_pcm_create_iec958_consumer_default(u8 *cs, size_t len); > + > +int snd_pcm_fill_iec958_consumer(struct snd_pcm_runtime *runtime, u8 *cs, > + size_t len); > + > +int snd_pcm_fill_iec958_consumer_hw_params(struct snd_pcm_hw_params *params, > + u8 *cs, size_t len); > + > int snd_pcm_create_iec958_consumer(struct snd_pcm_runtime *runtime, u8 *cs, > size_t len); > > diff --git a/sound/core/pcm_iec958.c b/sound/core/pcm_iec958.c > index f9a211cc1f2c..7a1b816f67cc 100644 > --- a/sound/core/pcm_iec958.c > +++ b/sound/core/pcm_iec958.c > @@ -9,41 +9,85 @@ > #include > #include > > -static int create_iec958_consumer(uint rate, uint sample_width, > - u8 *cs, size_t len) > +/** > + * snd_pcm_create_iec958_consumer_default - create default consumer format IEC958 channel status > + * @cs: channel status buffer, at least four bytes > + * @len: length of channel status buffer > + * > + * Create the consumer format channel status data in @cs of maximum size > + * @len. When relevant, the configuration-dependant bits will be set as > + * unspecified. > + * > + * Drivers should then call einter snd_pcm_fill_iec958_consumer() or > + * snd_pcm_fill_iec958_consumer_hw_params() to replace these unspecified > + * bits by their actual values. > + * > + * Drivers may wish to tweak the contents of the buffer after creation. > + * > + * Returns: length of buffer, or negative error code if something failed. > + */ > +int snd_pcm_create_iec958_consumer_default(u8 *cs, size_t len) > { > - unsigned int fs, ws; > - > if (len < 4) > return -EINVAL; > > - switch (rate) { > - case 32000: > - fs = IEC958_AES3_CON_FS_32000; > - break; > - case 44100: > - fs = IEC958_AES3_CON_FS_44100; > - break; > - case 48000: > - fs = IEC958_AES3_CON_FS_48000; > - break; > - case 88200: > - fs = IEC958_AES3_CON_FS_88200; > - break; > - case 96000: > - fs = IEC958_AES3_CON_FS_96000; > - break; > - case 176400: > - fs = IEC958_AES3_CON_FS_176400; > - break; > - case 192000: > - fs = IEC958_AES3_CON_FS_192000; > - break; > - default: > + memset(cs, 0, len); > + > + cs[0] = IEC958_AES0_CON_NOT_COPYRIGHT | IEC958_AES0_CON_EMPHASIS_NONE; > + cs[1] = IEC958_AES1_CON_GENERAL; > + cs[2] = IEC958_AES2_CON_SOURCE_UNSPEC | IEC958_AES2_CON_CHANNEL_UNSPEC; > + cs[3] = IEC958_AES3_CON_CLOCK_1000PPM | IEC958_AES3_CON_FS_NOTID; > + > + if (len > 4) > + cs[4] = IEC958_AES4_CON_WORDLEN_NOTID; > + > + return len; > +} > +EXPORT_SYMBOL_GPL(snd_pcm_create_iec958_consumer_default); > + > +static int fill_iec958_consumer(uint rate, uint sample_width, > + u8 *cs, size_t len) > +{ > + if (len < 4) > return -EINVAL; > + > + if ((cs[3] & IEC958_AES3_CON_FS) == IEC958_AES3_CON_FS_NOTID) { > + unsigned int fs; > + > + switch (rate) { > + case 32000: > + fs = IEC958_AES3_CON_FS_32000; > + break; > + case 44100: > + fs = IEC958_AES3_CON_FS_44100; > + break; > + case 48000: > + fs = IEC958_AES3_CON_FS_48000; > + break; > + case 88200: > + fs = IEC958_AES3_CON_FS_88200; > + break; > + case 96000: > + fs = IEC958_AES3_CON_FS_96000; > + break; > + case 176400: > + fs = IEC958_AES3_CON_FS_176400; > + break; > + case 192000: > + fs = IEC958_AES3_CON_FS_192000; > + break; > + default: > + return -EINVAL; > + } > + > + cs[3] &= ~IEC958_AES3_CON_FS; > + cs[3] |= fs; > } > > - if (len > 4) { > + if (len > 4 && > + (cs[4] & IEC958_AES4_CON_WORDLEN) == IEC958_AES4_CON_WORDLEN_NOTID) { > + unsigned int ws; > + > switch (sample_width) { > case 16: > ws = IEC958_AES4_CON_WORDLEN_20_16; > @@ -64,21 +108,58 @@ static int create_iec958_consumer(uint rate, uint sample_width, > default: > return -EINVAL; > } > + > + cs[4] &= ~IEC958_AES4_CON_WORDLEN; > + cs[4] |= ws; > } > > - memset(cs, 0, len); > - > - cs[0] = IEC958_AES0_CON_NOT_COPYRIGHT | IEC958_AES0_CON_EMPHASIS_NONE; > - cs[1] = IEC958_AES1_CON_GENERAL; > - cs[2] = IEC958_AES2_CON_SOURCE_UNSPEC | IEC958_AES2_CON_CHANNEL_UNSPEC; > - cs[3] = IEC958_AES3_CON_CLOCK_1000PPM | fs; > - > - if (len > 4) > - cs[4] = ws; > - > return len; > } > > +/** > + * snd_pcm_fill_iec958_consumer - Fill consumer format IEC958 channel status > + * @runtime: pcm runtime structure with ->rate filled in > + * @cs: channel status buffer, at least four bytes > + * @len: length of channel status buffer > + * > + * Fill the unspecified bits in an IEC958 status bits array using the > + * parameters of the PCM runtime @runtime. > + * > + * Drivers may wish to tweak the contents of the buffer after its been > + * filled. > + * > + * Returns: length of buffer, or negative error code if something failed. > + */ > +int snd_pcm_fill_iec958_consumer(struct snd_pcm_runtime *runtime, > + u8 *cs, size_t len) > +{ > + return fill_iec958_consumer(runtime->rate, > + snd_pcm_format_width(runtime->format), > + cs, len); > +} > +EXPORT_SYMBOL_GPL(snd_pcm_fill_iec958_consumer); > + > +/** > + * snd_pcm_fill_iec958_consumer_hw_params - Fill consumer format IEC958 channel status > + * @params: the hw_params instance for extracting rate and sample format > + * @cs: channel status buffer, at least four bytes > + * @len: length of channel status buffer > + * > + * Fill the unspecified bits in an IEC958 status bits array using the > + * parameters of the PCM hardware parameters @params. > + * > + * Drivers may wish to tweak the contents of the buffer after its been > + * filled.. > + * > + * Returns: length of buffer, or negative error code if something failed. > + */ > +int snd_pcm_fill_iec958_consumer_hw_params(struct snd_pcm_hw_params *params, > + u8 *cs, size_t len) > +{ > + return fill_iec958_consumer(params_rate(params), params_width(params), cs, len); > +} > +EXPORT_SYMBOL_GPL(snd_pcm_fill_iec958_consumer_hw_params); > + > /** > * snd_pcm_create_iec958_consumer - create consumer format IEC958 channel status > * @runtime: pcm runtime structure with ->rate filled in > @@ -95,9 +176,13 @@ static int create_iec958_consumer(uint rate, uint sample_width, > int snd_pcm_create_iec958_consumer(struct snd_pcm_runtime *runtime, u8 *cs, > size_t len) > { > - return create_iec958_consumer(runtime->rate, > - snd_pcm_format_width(runtime->format), > - cs, len); > + int ret; > + > + ret = snd_pcm_create_iec958_consumer_default(cs, len); > + if (ret < 0) > + return ret; > + > + return snd_pcm_fill_iec958_consumer(runtime, cs, len); > } > EXPORT_SYMBOL(snd_pcm_create_iec958_consumer); > > @@ -117,7 +202,12 @@ EXPORT_SYMBOL(snd_pcm_create_iec958_consumer); > int snd_pcm_create_iec958_consumer_hw_params(struct snd_pcm_hw_params *params, > u8 *cs, size_t len) > { > - return create_iec958_consumer(params_rate(params), params_width(params), > - cs, len); > + int ret; > + > + ret = snd_pcm_create_iec958_consumer_default(cs, len); > + if (ret < 0) > + return ret; > + > + return fill_iec958_consumer(params_rate(params), params_width(params), cs, len); > } > EXPORT_SYMBOL(snd_pcm_create_iec958_consumer_hw_params); > -- > 2.31.1 > From mboxrd@z Thu Jan 1 00:00:00 1970 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=-14.1 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED 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 7FD79C2B9F8 for ; Tue, 25 May 2021 16:26:23 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (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 3DFBC61420 for ; Tue, 25 May 2021 16:26:23 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 3DFBC61420 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Subject:Cc:To:From:Message-ID:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=DMvlpSygYtuzigz1A1YGZ+oNs8b8L5yLH/J73gdpCIs=; b=CIbg1cHx9SV68e wRKvuc08X2mQ08o0dOguHg0MrQfpScuHZ7OzMo15FPyIQQb3J63vjhQQv3n7xPGfBNVR2qUN/MrRN 4FYNWDMHU8qqamqwbHvmJRkea1Ax9BC9h46ZzAO9jhyUM1R/DcdHtH+NkPwFVki/jyVIfgR7DfOV8 PGoGNEOWtL2qw31TDgsMI0NgFljKZG1bi8tIqARq2wKKhL6rgJ/sAoiRRHrpSWCemO8iR+UPK2X/S eoJVfr75HM2O77OwYv2hz83QWYmrkmQXOKccjsyxp5R72te4LJF6p+hlFh9uK/QEJqmRWoAiiOjWX 6zVB9IZVcybiXubb6Zrw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1llZqb-006Ogy-Bc; Tue, 25 May 2021 16:24:02 +0000 Received: from mx2.suse.de ([195.135.220.15]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1llZUc-006DsP-FF; Tue, 25 May 2021 16:01:20 +0000 X-Virus-Scanned: by amavisd-new at test-mx.suse.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1621958477; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=NnQk2EnrULXDbLlOknbDCceBI4BQxTF+S6KqI6l9suw=; b=ZKZRyalGloOyEqEutXS38VwiM65DSjWuu/yP8sylQ3T4wMy8KTFw21+l40cpDzhX7HU8K3 b+zQFGPiwNT/e8y2AKdvr3abYEV1xEx1IgjGrMr4jElYd/9ScsWYqn2bLqdgJFnvSPfiFI VShWwhBy6yFdKCN4D5l/OIE3bAYrxgw= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1621958477; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=NnQk2EnrULXDbLlOknbDCceBI4BQxTF+S6KqI6l9suw=; b=F0HaFIzq5DbMWZQEvbmayEfBjpqkUcyol2Rzlyjy3tWBLiIP6xnVi6o1rUJCW6cd/cGbLo vbqz0pqjxZB89WCw== Received: from relay2.suse.de (unknown [195.135.221.27]) by mx2.suse.de (Postfix) with ESMTP id D7C60AE5C; Tue, 25 May 2021 16:01:16 +0000 (UTC) Date: Tue, 25 May 2021 18:01:16 +0200 Message-ID: From: Takashi Iwai To: Maxime Ripard Cc: Jaroslav Kysela , Mark Brown , dri-devel@lists.freedesktop.org, Daniel Vetter , David Airlie , Maarten Lankhorst , Thomas Zimmermann , Liam Girdwood , Takashi Iwai , devicetree@vger.kernel.org, Dave Stevenson , Phil Elwell , Tim Gover , Dom Cobley , linux-doc@vger.kernel.org, Eric Anholt , Nicolas Saenz Julienne , linux-kernel@vger.kernel.org, alsa-devel@alsa-project.org, Maxime Ripard , Nicolas Saenz Julienne , bcm-kernel-feedback-list@broadcom.com, linux-arm-kernel@lists.infradead.org, Daniel Vetter , linux-rpi-kernel@lists.infradead.org, Jonathan Corbet , Rob Herring Subject: Re: [PATCH v2 02/12] ALSA: iec958: Split status creation and fill In-Reply-To: <20210525132354.297468-3-maxime@cerno.tech> References: <20210525132354.297468-1-maxime@cerno.tech> <20210525132354.297468-3-maxime@cerno.tech> User-Agent: Wanderlust/2.15.9 (Almost Unreal) SEMI/1.14.6 (Maruoka) FLIM/1.14.9 (=?UTF-8?B?R29qxY0=?=) APEL/10.8 Emacs/25.3 (x86_64-suse-linux-gnu) MULE/6.0 (HANACHIRUSATO) MIME-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka") X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210525_090118_855462_9B614F02 X-CRM114-Status: GOOD ( 32.56 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org On Tue, 25 May 2021 15:23:44 +0200, Maxime Ripard wrote: > > In some situations, like a codec probe, we need to provide an IEC status > default but don't have access to the sampling rate and width yet since > no stream has been configured yet. > > Each and every driver has its own default, whereas the core iec958 code > also has some buried in the snd_pcm_create_iec958_consumer functions. > > Let's split these functions in two to provide a default that doesn't > rely on the sampling rate and width, and another function to fill them > when available. > > Signed-off-by: Maxime Ripard Reviewed-by: Takashi Iwai thanks, Takashi > --- > include/sound/pcm_iec958.h | 8 ++ > sound/core/pcm_iec958.c | 176 ++++++++++++++++++++++++++++--------- > 2 files changed, 141 insertions(+), 43 deletions(-) > > diff --git a/include/sound/pcm_iec958.h b/include/sound/pcm_iec958.h > index 0939aa45e2fe..64e84441cde1 100644 > --- a/include/sound/pcm_iec958.h > +++ b/include/sound/pcm_iec958.h > @@ -4,6 +4,14 @@ > > #include > > +int snd_pcm_create_iec958_consumer_default(u8 *cs, size_t len); > + > +int snd_pcm_fill_iec958_consumer(struct snd_pcm_runtime *runtime, u8 *cs, > + size_t len); > + > +int snd_pcm_fill_iec958_consumer_hw_params(struct snd_pcm_hw_params *params, > + u8 *cs, size_t len); > + > int snd_pcm_create_iec958_consumer(struct snd_pcm_runtime *runtime, u8 *cs, > size_t len); > > diff --git a/sound/core/pcm_iec958.c b/sound/core/pcm_iec958.c > index f9a211cc1f2c..7a1b816f67cc 100644 > --- a/sound/core/pcm_iec958.c > +++ b/sound/core/pcm_iec958.c > @@ -9,41 +9,85 @@ > #include > #include > > -static int create_iec958_consumer(uint rate, uint sample_width, > - u8 *cs, size_t len) > +/** > + * snd_pcm_create_iec958_consumer_default - create default consumer format IEC958 channel status > + * @cs: channel status buffer, at least four bytes > + * @len: length of channel status buffer > + * > + * Create the consumer format channel status data in @cs of maximum size > + * @len. When relevant, the configuration-dependant bits will be set as > + * unspecified. > + * > + * Drivers should then call einter snd_pcm_fill_iec958_consumer() or > + * snd_pcm_fill_iec958_consumer_hw_params() to replace these unspecified > + * bits by their actual values. > + * > + * Drivers may wish to tweak the contents of the buffer after creation. > + * > + * Returns: length of buffer, or negative error code if something failed. > + */ > +int snd_pcm_create_iec958_consumer_default(u8 *cs, size_t len) > { > - unsigned int fs, ws; > - > if (len < 4) > return -EINVAL; > > - switch (rate) { > - case 32000: > - fs = IEC958_AES3_CON_FS_32000; > - break; > - case 44100: > - fs = IEC958_AES3_CON_FS_44100; > - break; > - case 48000: > - fs = IEC958_AES3_CON_FS_48000; > - break; > - case 88200: > - fs = IEC958_AES3_CON_FS_88200; > - break; > - case 96000: > - fs = IEC958_AES3_CON_FS_96000; > - break; > - case 176400: > - fs = IEC958_AES3_CON_FS_176400; > - break; > - case 192000: > - fs = IEC958_AES3_CON_FS_192000; > - break; > - default: > + memset(cs, 0, len); > + > + cs[0] = IEC958_AES0_CON_NOT_COPYRIGHT | IEC958_AES0_CON_EMPHASIS_NONE; > + cs[1] = IEC958_AES1_CON_GENERAL; > + cs[2] = IEC958_AES2_CON_SOURCE_UNSPEC | IEC958_AES2_CON_CHANNEL_UNSPEC; > + cs[3] = IEC958_AES3_CON_CLOCK_1000PPM | IEC958_AES3_CON_FS_NOTID; > + > + if (len > 4) > + cs[4] = IEC958_AES4_CON_WORDLEN_NOTID; > + > + return len; > +} > +EXPORT_SYMBOL_GPL(snd_pcm_create_iec958_consumer_default); > + > +static int fill_iec958_consumer(uint rate, uint sample_width, > + u8 *cs, size_t len) > +{ > + if (len < 4) > return -EINVAL; > + > + if ((cs[3] & IEC958_AES3_CON_FS) == IEC958_AES3_CON_FS_NOTID) { > + unsigned int fs; > + > + switch (rate) { > + case 32000: > + fs = IEC958_AES3_CON_FS_32000; > + break; > + case 44100: > + fs = IEC958_AES3_CON_FS_44100; > + break; > + case 48000: > + fs = IEC958_AES3_CON_FS_48000; > + break; > + case 88200: > + fs = IEC958_AES3_CON_FS_88200; > + break; > + case 96000: > + fs = IEC958_AES3_CON_FS_96000; > + break; > + case 176400: > + fs = IEC958_AES3_CON_FS_176400; > + break; > + case 192000: > + fs = IEC958_AES3_CON_FS_192000; > + break; > + default: > + return -EINVAL; > + } > + > + cs[3] &= ~IEC958_AES3_CON_FS; > + cs[3] |= fs; > } > > - if (len > 4) { > + if (len > 4 && > + (cs[4] & IEC958_AES4_CON_WORDLEN) == IEC958_AES4_CON_WORDLEN_NOTID) { > + unsigned int ws; > + > switch (sample_width) { > case 16: > ws = IEC958_AES4_CON_WORDLEN_20_16; > @@ -64,21 +108,58 @@ static int create_iec958_consumer(uint rate, uint sample_width, > default: > return -EINVAL; > } > + > + cs[4] &= ~IEC958_AES4_CON_WORDLEN; > + cs[4] |= ws; > } > > - memset(cs, 0, len); > - > - cs[0] = IEC958_AES0_CON_NOT_COPYRIGHT | IEC958_AES0_CON_EMPHASIS_NONE; > - cs[1] = IEC958_AES1_CON_GENERAL; > - cs[2] = IEC958_AES2_CON_SOURCE_UNSPEC | IEC958_AES2_CON_CHANNEL_UNSPEC; > - cs[3] = IEC958_AES3_CON_CLOCK_1000PPM | fs; > - > - if (len > 4) > - cs[4] = ws; > - > return len; > } > > +/** > + * snd_pcm_fill_iec958_consumer - Fill consumer format IEC958 channel status > + * @runtime: pcm runtime structure with ->rate filled in > + * @cs: channel status buffer, at least four bytes > + * @len: length of channel status buffer > + * > + * Fill the unspecified bits in an IEC958 status bits array using the > + * parameters of the PCM runtime @runtime. > + * > + * Drivers may wish to tweak the contents of the buffer after its been > + * filled. > + * > + * Returns: length of buffer, or negative error code if something failed. > + */ > +int snd_pcm_fill_iec958_consumer(struct snd_pcm_runtime *runtime, > + u8 *cs, size_t len) > +{ > + return fill_iec958_consumer(runtime->rate, > + snd_pcm_format_width(runtime->format), > + cs, len); > +} > +EXPORT_SYMBOL_GPL(snd_pcm_fill_iec958_consumer); > + > +/** > + * snd_pcm_fill_iec958_consumer_hw_params - Fill consumer format IEC958 channel status > + * @params: the hw_params instance for extracting rate and sample format > + * @cs: channel status buffer, at least four bytes > + * @len: length of channel status buffer > + * > + * Fill the unspecified bits in an IEC958 status bits array using the > + * parameters of the PCM hardware parameters @params. > + * > + * Drivers may wish to tweak the contents of the buffer after its been > + * filled.. > + * > + * Returns: length of buffer, or negative error code if something failed. > + */ > +int snd_pcm_fill_iec958_consumer_hw_params(struct snd_pcm_hw_params *params, > + u8 *cs, size_t len) > +{ > + return fill_iec958_consumer(params_rate(params), params_width(params), cs, len); > +} > +EXPORT_SYMBOL_GPL(snd_pcm_fill_iec958_consumer_hw_params); > + > /** > * snd_pcm_create_iec958_consumer - create consumer format IEC958 channel status > * @runtime: pcm runtime structure with ->rate filled in > @@ -95,9 +176,13 @@ static int create_iec958_consumer(uint rate, uint sample_width, > int snd_pcm_create_iec958_consumer(struct snd_pcm_runtime *runtime, u8 *cs, > size_t len) > { > - return create_iec958_consumer(runtime->rate, > - snd_pcm_format_width(runtime->format), > - cs, len); > + int ret; > + > + ret = snd_pcm_create_iec958_consumer_default(cs, len); > + if (ret < 0) > + return ret; > + > + return snd_pcm_fill_iec958_consumer(runtime, cs, len); > } > EXPORT_SYMBOL(snd_pcm_create_iec958_consumer); > > @@ -117,7 +202,12 @@ EXPORT_SYMBOL(snd_pcm_create_iec958_consumer); > int snd_pcm_create_iec958_consumer_hw_params(struct snd_pcm_hw_params *params, > u8 *cs, size_t len) > { > - return create_iec958_consumer(params_rate(params), params_width(params), > - cs, len); > + int ret; > + > + ret = snd_pcm_create_iec958_consumer_default(cs, len); > + if (ret < 0) > + return ret; > + > + return fill_iec958_consumer(params_rate(params), params_width(params), cs, len); > } > EXPORT_SYMBOL(snd_pcm_create_iec958_consumer_hw_params); > -- > 2.31.1 > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel From mboxrd@z Thu Jan 1 00:00:00 1970 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=-13.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED 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 1C0E2C4707F for ; Tue, 25 May 2021 16:01:21 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (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 A72E761401 for ; Tue, 25 May 2021 16:01:20 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org A72E761401 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 1FCED6EA70; Tue, 25 May 2021 16:01:20 +0000 (UTC) Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by gabe.freedesktop.org (Postfix) with ESMTPS id 5D3B96EA68 for ; Tue, 25 May 2021 16:01:18 +0000 (UTC) X-Virus-Scanned: by amavisd-new at test-mx.suse.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1621958477; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=NnQk2EnrULXDbLlOknbDCceBI4BQxTF+S6KqI6l9suw=; b=ZKZRyalGloOyEqEutXS38VwiM65DSjWuu/yP8sylQ3T4wMy8KTFw21+l40cpDzhX7HU8K3 b+zQFGPiwNT/e8y2AKdvr3abYEV1xEx1IgjGrMr4jElYd/9ScsWYqn2bLqdgJFnvSPfiFI VShWwhBy6yFdKCN4D5l/OIE3bAYrxgw= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1621958477; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=NnQk2EnrULXDbLlOknbDCceBI4BQxTF+S6KqI6l9suw=; b=F0HaFIzq5DbMWZQEvbmayEfBjpqkUcyol2Rzlyjy3tWBLiIP6xnVi6o1rUJCW6cd/cGbLo vbqz0pqjxZB89WCw== Received: from relay2.suse.de (unknown [195.135.221.27]) by mx2.suse.de (Postfix) with ESMTP id D7C60AE5C; Tue, 25 May 2021 16:01:16 +0000 (UTC) Date: Tue, 25 May 2021 18:01:16 +0200 Message-ID: From: Takashi Iwai To: Maxime Ripard Subject: Re: [PATCH v2 02/12] ALSA: iec958: Split status creation and fill In-Reply-To: <20210525132354.297468-3-maxime@cerno.tech> References: <20210525132354.297468-1-maxime@cerno.tech> <20210525132354.297468-3-maxime@cerno.tech> User-Agent: Wanderlust/2.15.9 (Almost Unreal) SEMI/1.14.6 (Maruoka) FLIM/1.14.9 (=?UTF-8?B?R29qxY0=?=) APEL/10.8 Emacs/25.3 (x86_64-suse-linux-gnu) MULE/6.0 (HANACHIRUSATO) MIME-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka") Content-Type: text/plain; charset=US-ASCII X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: alsa-devel@alsa-project.org, Tim Gover , linux-doc@vger.kernel.org, David Airlie , dri-devel@lists.freedesktop.org, Takashi Iwai , Nicolas Saenz Julienne , Daniel Vetter , Phil Elwell , Dave Stevenson , bcm-kernel-feedback-list@broadcom.com, devicetree@vger.kernel.org, Nicolas Saenz Julienne , Liam Girdwood , Mark Brown , linux-rpi-kernel@lists.infradead.org, Jaroslav Kysela , linux-arm-kernel@lists.infradead.org, Dom Cobley , Jonathan Corbet , linux-kernel@vger.kernel.org, Rob Herring , Thomas Zimmermann Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" On Tue, 25 May 2021 15:23:44 +0200, Maxime Ripard wrote: > > In some situations, like a codec probe, we need to provide an IEC status > default but don't have access to the sampling rate and width yet since > no stream has been configured yet. > > Each and every driver has its own default, whereas the core iec958 code > also has some buried in the snd_pcm_create_iec958_consumer functions. > > Let's split these functions in two to provide a default that doesn't > rely on the sampling rate and width, and another function to fill them > when available. > > Signed-off-by: Maxime Ripard Reviewed-by: Takashi Iwai thanks, Takashi > --- > include/sound/pcm_iec958.h | 8 ++ > sound/core/pcm_iec958.c | 176 ++++++++++++++++++++++++++++--------- > 2 files changed, 141 insertions(+), 43 deletions(-) > > diff --git a/include/sound/pcm_iec958.h b/include/sound/pcm_iec958.h > index 0939aa45e2fe..64e84441cde1 100644 > --- a/include/sound/pcm_iec958.h > +++ b/include/sound/pcm_iec958.h > @@ -4,6 +4,14 @@ > > #include > > +int snd_pcm_create_iec958_consumer_default(u8 *cs, size_t len); > + > +int snd_pcm_fill_iec958_consumer(struct snd_pcm_runtime *runtime, u8 *cs, > + size_t len); > + > +int snd_pcm_fill_iec958_consumer_hw_params(struct snd_pcm_hw_params *params, > + u8 *cs, size_t len); > + > int snd_pcm_create_iec958_consumer(struct snd_pcm_runtime *runtime, u8 *cs, > size_t len); > > diff --git a/sound/core/pcm_iec958.c b/sound/core/pcm_iec958.c > index f9a211cc1f2c..7a1b816f67cc 100644 > --- a/sound/core/pcm_iec958.c > +++ b/sound/core/pcm_iec958.c > @@ -9,41 +9,85 @@ > #include > #include > > -static int create_iec958_consumer(uint rate, uint sample_width, > - u8 *cs, size_t len) > +/** > + * snd_pcm_create_iec958_consumer_default - create default consumer format IEC958 channel status > + * @cs: channel status buffer, at least four bytes > + * @len: length of channel status buffer > + * > + * Create the consumer format channel status data in @cs of maximum size > + * @len. When relevant, the configuration-dependant bits will be set as > + * unspecified. > + * > + * Drivers should then call einter snd_pcm_fill_iec958_consumer() or > + * snd_pcm_fill_iec958_consumer_hw_params() to replace these unspecified > + * bits by their actual values. > + * > + * Drivers may wish to tweak the contents of the buffer after creation. > + * > + * Returns: length of buffer, or negative error code if something failed. > + */ > +int snd_pcm_create_iec958_consumer_default(u8 *cs, size_t len) > { > - unsigned int fs, ws; > - > if (len < 4) > return -EINVAL; > > - switch (rate) { > - case 32000: > - fs = IEC958_AES3_CON_FS_32000; > - break; > - case 44100: > - fs = IEC958_AES3_CON_FS_44100; > - break; > - case 48000: > - fs = IEC958_AES3_CON_FS_48000; > - break; > - case 88200: > - fs = IEC958_AES3_CON_FS_88200; > - break; > - case 96000: > - fs = IEC958_AES3_CON_FS_96000; > - break; > - case 176400: > - fs = IEC958_AES3_CON_FS_176400; > - break; > - case 192000: > - fs = IEC958_AES3_CON_FS_192000; > - break; > - default: > + memset(cs, 0, len); > + > + cs[0] = IEC958_AES0_CON_NOT_COPYRIGHT | IEC958_AES0_CON_EMPHASIS_NONE; > + cs[1] = IEC958_AES1_CON_GENERAL; > + cs[2] = IEC958_AES2_CON_SOURCE_UNSPEC | IEC958_AES2_CON_CHANNEL_UNSPEC; > + cs[3] = IEC958_AES3_CON_CLOCK_1000PPM | IEC958_AES3_CON_FS_NOTID; > + > + if (len > 4) > + cs[4] = IEC958_AES4_CON_WORDLEN_NOTID; > + > + return len; > +} > +EXPORT_SYMBOL_GPL(snd_pcm_create_iec958_consumer_default); > + > +static int fill_iec958_consumer(uint rate, uint sample_width, > + u8 *cs, size_t len) > +{ > + if (len < 4) > return -EINVAL; > + > + if ((cs[3] & IEC958_AES3_CON_FS) == IEC958_AES3_CON_FS_NOTID) { > + unsigned int fs; > + > + switch (rate) { > + case 32000: > + fs = IEC958_AES3_CON_FS_32000; > + break; > + case 44100: > + fs = IEC958_AES3_CON_FS_44100; > + break; > + case 48000: > + fs = IEC958_AES3_CON_FS_48000; > + break; > + case 88200: > + fs = IEC958_AES3_CON_FS_88200; > + break; > + case 96000: > + fs = IEC958_AES3_CON_FS_96000; > + break; > + case 176400: > + fs = IEC958_AES3_CON_FS_176400; > + break; > + case 192000: > + fs = IEC958_AES3_CON_FS_192000; > + break; > + default: > + return -EINVAL; > + } > + > + cs[3] &= ~IEC958_AES3_CON_FS; > + cs[3] |= fs; > } > > - if (len > 4) { > + if (len > 4 && > + (cs[4] & IEC958_AES4_CON_WORDLEN) == IEC958_AES4_CON_WORDLEN_NOTID) { > + unsigned int ws; > + > switch (sample_width) { > case 16: > ws = IEC958_AES4_CON_WORDLEN_20_16; > @@ -64,21 +108,58 @@ static int create_iec958_consumer(uint rate, uint sample_width, > default: > return -EINVAL; > } > + > + cs[4] &= ~IEC958_AES4_CON_WORDLEN; > + cs[4] |= ws; > } > > - memset(cs, 0, len); > - > - cs[0] = IEC958_AES0_CON_NOT_COPYRIGHT | IEC958_AES0_CON_EMPHASIS_NONE; > - cs[1] = IEC958_AES1_CON_GENERAL; > - cs[2] = IEC958_AES2_CON_SOURCE_UNSPEC | IEC958_AES2_CON_CHANNEL_UNSPEC; > - cs[3] = IEC958_AES3_CON_CLOCK_1000PPM | fs; > - > - if (len > 4) > - cs[4] = ws; > - > return len; > } > > +/** > + * snd_pcm_fill_iec958_consumer - Fill consumer format IEC958 channel status > + * @runtime: pcm runtime structure with ->rate filled in > + * @cs: channel status buffer, at least four bytes > + * @len: length of channel status buffer > + * > + * Fill the unspecified bits in an IEC958 status bits array using the > + * parameters of the PCM runtime @runtime. > + * > + * Drivers may wish to tweak the contents of the buffer after its been > + * filled. > + * > + * Returns: length of buffer, or negative error code if something failed. > + */ > +int snd_pcm_fill_iec958_consumer(struct snd_pcm_runtime *runtime, > + u8 *cs, size_t len) > +{ > + return fill_iec958_consumer(runtime->rate, > + snd_pcm_format_width(runtime->format), > + cs, len); > +} > +EXPORT_SYMBOL_GPL(snd_pcm_fill_iec958_consumer); > + > +/** > + * snd_pcm_fill_iec958_consumer_hw_params - Fill consumer format IEC958 channel status > + * @params: the hw_params instance for extracting rate and sample format > + * @cs: channel status buffer, at least four bytes > + * @len: length of channel status buffer > + * > + * Fill the unspecified bits in an IEC958 status bits array using the > + * parameters of the PCM hardware parameters @params. > + * > + * Drivers may wish to tweak the contents of the buffer after its been > + * filled.. > + * > + * Returns: length of buffer, or negative error code if something failed. > + */ > +int snd_pcm_fill_iec958_consumer_hw_params(struct snd_pcm_hw_params *params, > + u8 *cs, size_t len) > +{ > + return fill_iec958_consumer(params_rate(params), params_width(params), cs, len); > +} > +EXPORT_SYMBOL_GPL(snd_pcm_fill_iec958_consumer_hw_params); > + > /** > * snd_pcm_create_iec958_consumer - create consumer format IEC958 channel status > * @runtime: pcm runtime structure with ->rate filled in > @@ -95,9 +176,13 @@ static int create_iec958_consumer(uint rate, uint sample_width, > int snd_pcm_create_iec958_consumer(struct snd_pcm_runtime *runtime, u8 *cs, > size_t len) > { > - return create_iec958_consumer(runtime->rate, > - snd_pcm_format_width(runtime->format), > - cs, len); > + int ret; > + > + ret = snd_pcm_create_iec958_consumer_default(cs, len); > + if (ret < 0) > + return ret; > + > + return snd_pcm_fill_iec958_consumer(runtime, cs, len); > } > EXPORT_SYMBOL(snd_pcm_create_iec958_consumer); > > @@ -117,7 +202,12 @@ EXPORT_SYMBOL(snd_pcm_create_iec958_consumer); > int snd_pcm_create_iec958_consumer_hw_params(struct snd_pcm_hw_params *params, > u8 *cs, size_t len) > { > - return create_iec958_consumer(params_rate(params), params_width(params), > - cs, len); > + int ret; > + > + ret = snd_pcm_create_iec958_consumer_default(cs, len); > + if (ret < 0) > + return ret; > + > + return fill_iec958_consumer(params_rate(params), params_width(params), cs, len); > } > EXPORT_SYMBOL(snd_pcm_create_iec958_consumer_hw_params); > -- > 2.31.1 >