Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp4650110pxj; Tue, 25 May 2021 12:59:37 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxYVq/vkCYG/j/Ctj9C0fvUjr6DpXnFbCW8kuKGeGIC4ybEDRY1vrubznN7RqpYFzhdMepv X-Received: by 2002:a17:907:9691:: with SMTP id hd17mr30074559ejc.67.1621972776807; Tue, 25 May 2021 12:59:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1621972776; cv=none; d=google.com; s=arc-20160816; b=vUGHBpX96RqjjPj3i0iGIWLsf9B9DRWnriHmFQvn8B5MwfM4Y/HvNOBzCq7NbbMk3X wcsl7ifCVfrom3lEkC+4fKip06SaTUtOXG9RfzC5x//I+YLmcdy1iN0W+bxeSRit7apW m4oQCKpX4FSVbCH/lKFo2p1+DPTeYzHOi+5y6rgbBNel5EGNevRjmhbw9cRTNI7PVjBE 0g6B0BVwNYA8qsBkJ32gqkUQgOp+Zs+4Eut5RWNXoIboZd/0cTUm6yx+hHY0w9V664bl CUZBUn7EsRMjIe0Q9zjrSCk0yIQbCqQpNPKSqH3VrPDncdjqffh28iXq7ZTdX4J2MP+H PC9A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:user-agent:references:in-reply-to :subject:cc:to:from:message-id:date:dkim-signature:dkim-signature; bh=NnQk2EnrULXDbLlOknbDCceBI4BQxTF+S6KqI6l9suw=; b=c+wZvdqzyjOAVdOaYW8MFVqk21mB4oMa7e1TqnTcDUJvzCfT+BzvvR07BPa+U83DyO PSnh09uGwupOGXM1eLGOspHfHOl4dMmW/gmGusduGqILhesu7bgBzYiETtcGYa2sJA75 b0mUF6WAt9qnc+AOs+nMdaiwd3sI7Vd/Yftv4wBHaGL6/ER5u1SsZIoZfLEKGwBt1Uzt 7g7Ru/CJqztNDGoL5wO53JJ1Y0V0lnVDMxvT/crxFe4a9lsWhB9y/vQhPsdPbXQe5ggl 3/tiR+FkGJV5M+cKrWrfXsPyv8CR9gR3TBzjYzgj8oma3iJaD5nlwMSYKXaYneBl/ypK +9+g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@suse.de header.s=susede2_rsa header.b=ZKZRyalG; dkim=neutral (no key) header.i=@suse.de header.s=susede2_ed25519 header.b=F0HaFIzq; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id c9si14741047edv.447.2021.05.25.12.59.14; Tue, 25 May 2021 12:59:36 -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=@suse.de header.s=susede2_rsa header.b=ZKZRyalG; dkim=neutral (no key) header.i=@suse.de header.s=susede2_ed25519 header.b=F0HaFIzq; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233121AbhEYQCs (ORCPT + 99 others); Tue, 25 May 2021 12:02:48 -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 >