Received: by 2002:ad5:4acb:0:0:0:0:0 with SMTP id n11csp5434791imw; Wed, 20 Jul 2022 05:50:52 -0700 (PDT) X-Google-Smtp-Source: AGRyM1svtzCBJ3MKM8insc/n+l8ueysFnxQNxvkk+IbJ/ZuyqiHa3Ot5Tpvk31Oqoi06quRQLy5p X-Received: by 2002:a05:6830:3982:b0:61c:901b:ca1d with SMTP id bs2-20020a056830398200b0061c901bca1dmr9458354otb.63.1658321451832; Wed, 20 Jul 2022 05:50:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1658321451; cv=none; d=google.com; s=arc-20160816; b=U3npfQ1fQZtv0WbNIvPbrG3SuYfyNyFIb/hN6L7DC9vO00yBSzLwh1tAn6rZ7e6d/e zfB8VbL+DuH5xzoRVMX5ag3ZAMAMVuFkzKi0eR3jzQ5KfibTHC+cSmLHm0FiDsn/bWCP wBg7yzuK4ruYkTNXcaMWNMfq10nyKga/K+OzIDhduyJkgLl/pL17vlO9fepz9wh5dXxc CbVDE5W4fW1b0vnWec1XAEopRuNEpNoTXD6/+ebxD/mo1M85oeOiwIFuVxDMMyzlZYCb HlUvtS35JZwQWRnHrUE5fe6s5+zLdM/9fZMgkQWHfqD84g+i3a5DYm9oCwt3azoF3b9C qExg== 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 :references:in-reply-to:message-id:cc:to:subject:from:date :dkim-signature; bh=gfVrDHEaoRWXZN/HPQzTExDiPVvqkM20tNaJY4XTG7k=; b=eA9zbJ6I7soUvNdCfpRpg2Fd6WYF2MNrFGKeHII3wKbE/c9htrY85Z3CiuIaYMO7rl 0mQq94QQblpUDMkmZiUqwno2RL23qawp3Hx6kEWokP/Oq9mN8fcT1HSxoAmQQmqYdNmK hJByhS7Zk1rKBejkMD/9pJFrcp9SuAtU84dN2MlxOauasGxHaVXob01r4wz7CAC8ps1/ qxjTZpw51c5EQKk5HWx31F6vSU4qAtLsAsxU1pptlZAU9J2S9odtXkmdQoxUTDjtq8vP uCI2PgQv0U29ACW2RRljOdxGQmZGmKrrvBnNQvi/G/FulCg8rUU+YaP+dJYMoa9hwJ2U GW2Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@crapouillou.net header.s=mail header.b=pmPNW73S; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=crapouillou.net Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id bj6-20020a056808198600b0033aa8f0b9eesi186972oib.10.2022.07.20.05.50.38; Wed, 20 Jul 2022 05:50:51 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@crapouillou.net header.s=mail header.b=pmPNW73S; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=crapouillou.net Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233060AbiGTLon (ORCPT + 99 others); Wed, 20 Jul 2022 07:44:43 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53590 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229712AbiGTLom (ORCPT ); Wed, 20 Jul 2022 07:44:42 -0400 Received: from aposti.net (aposti.net [89.234.176.197]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5CA51459B1; Wed, 20 Jul 2022 04:44:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=crapouillou.net; s=mail; t=1658317473; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=gfVrDHEaoRWXZN/HPQzTExDiPVvqkM20tNaJY4XTG7k=; b=pmPNW73SsabPhfkXe2GuaO61RJcyuQJkm6+2r6XRpoftHet7iBhMA/kK6MoZm71fxlgAqU GtJSNQlvwU5zitRxPk770YVdDWy26wAit7edFN6EJ6fQhXOtoXPD/pxCN9T9+D+VzSatGd rMYf2pWJsnKmQbjXbACt4m9i6azetrM= Date: Wed, 20 Jul 2022 12:44:18 +0100 From: Paul Cercueil Subject: Re: [PATCH v4 01/11] ASoC: jz4740-i2s: Handle independent FIFO flush bits To: Aidan MacDonald Cc: lgirdwood@gmail.com, broonie@kernel.org, perex@perex.cz, tiwai@suse.com, linux-mips@vger.kernel.org, alsa-devel@alsa-project.org, linux-kernel@vger.kernel.org Message-Id: In-Reply-To: <20220708160244.21933-2-aidanmacdonald.0x0@gmail.com> References: <20220708160244.21933-1-aidanmacdonald.0x0@gmail.com> <20220708160244.21933-2-aidanmacdonald.0x0@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1; format=flowed Content-Transfer-Encoding: quoted-printable X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_PASS,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Aidan, Le ven., juil. 8 2022 at 17:02:34 +0100, Aidan MacDonald=20 a =E9crit : > On the JZ4740, there is a single bit that flushes (empties) both > the transmit and receive FIFO. Later SoCs have independent flush > bits for each FIFO, which allows us to flush the right FIFO when > starting up a stream. >=20 > This also fixes a bug: since we were only setting the JZ4740's > flush bit, which corresponds to the TX FIFO flush bit on other > SoCs, other SoCs were not having their RX FIFO flushed at all. >=20 > Fixes: 967beb2e8777 ("ASoC: jz4740: Add jz4780 support") > Signed-off-by: Aidan MacDonald > --- > sound/soc/jz4740/jz4740-i2s.c | 33 ++++++++++++++++++++++++++++++--- > 1 file changed, 30 insertions(+), 3 deletions(-) >=20 > diff --git a/sound/soc/jz4740/jz4740-i2s.c=20 > b/sound/soc/jz4740/jz4740-i2s.c > index ecd8df70d39c..576f31f9d734 100644 > --- a/sound/soc/jz4740/jz4740-i2s.c > +++ b/sound/soc/jz4740/jz4740-i2s.c > @@ -64,6 +64,9 @@ > #define JZ_AIC_CTRL_ENABLE_PLAYBACK BIT(1) > #define JZ_AIC_CTRL_ENABLE_CAPTURE BIT(0) >=20 > +#define JZ4760_AIC_CTRL_TFLUSH BIT(8) > +#define JZ4760_AIC_CTRL_RFLUSH BIT(7) Just rename JZ_AIC_CTRL_FLUSH to JZ_AIC_CTRL_TFLUSH and introduce=20 JZ_AIC_CTRL_RLUSH. > + > #define JZ_AIC_CTRL_OUTPUT_SAMPLE_SIZE_OFFSET 19 > #define JZ_AIC_CTRL_INPUT_SAMPLE_SIZE_OFFSET 16 >=20 > @@ -90,6 +93,8 @@ enum jz47xx_i2s_version { > struct i2s_soc_info { > enum jz47xx_i2s_version version; > struct snd_soc_dai_driver *dai; > + > + bool shared_fifo_flush; > }; >=20 > struct jz4740_i2s { > @@ -124,12 +129,33 @@ static int jz4740_i2s_startup(struct=20 > snd_pcm_substream *substream, > uint32_t conf, ctrl; > int ret; >=20 > + /* > + * When we can flush FIFOs independently, only flush the > + * FIFO that is starting up. > + */ > + if (!i2s->soc_info->shared_fifo_flush) { > + ctrl =3D jz4740_i2s_read(i2s, JZ_REG_AIC_CTRL); > + > + if (substream->stream =3D=3D SNDRV_PCM_STREAM_PLAYBACK) > + ctrl |=3D JZ4760_AIC_CTRL_TFLUSH; > + else > + ctrl |=3D JZ4760_AIC_CTRL_RFLUSH; > + > + jz4740_i2s_write(i2s, JZ_REG_AIC_CTRL, ctrl); > + } Wouldn't it be simpler to do one single if/else? And hy is one checked=20 before the (snd_soc_dai_active(dai)) check, and the other is checked=20 after? You could do something like this: ctrl =3D jz4740_i2s_read(i2s, JZ_REG_AIC_CTRL); if (i2s->soc_info->shared_fifo_flush || substream->stream =3D=3D SNDRV_PCM_STREAM_PLAYBACK) { ctrl |=3D JZ_AIC_CTRL_TFLUSH; } else { ctrl |=3D JZ_AIC_CTRL_RFLUSH; } jz4740_i2s_write(i2s, JZ_REG_AIC_CTRL, ctrl); Cheers, -Paul > + > if (snd_soc_dai_active(dai)) > return 0; >=20 > - ctrl =3D jz4740_i2s_read(i2s, JZ_REG_AIC_CTRL); > - ctrl |=3D JZ_AIC_CTRL_FLUSH; > - jz4740_i2s_write(i2s, JZ_REG_AIC_CTRL, ctrl); > + /* > + * When there is a shared flush bit for both FIFOs we can > + * only flush the FIFOs if no other stream has started. > + */ > + if (i2s->soc_info->shared_fifo_flush) { > + ctrl =3D jz4740_i2s_read(i2s, JZ_REG_AIC_CTRL); > + ctrl |=3D JZ_AIC_CTRL_FLUSH; > + jz4740_i2s_write(i2s, JZ_REG_AIC_CTRL, ctrl); > + } >=20 > ret =3D clk_prepare_enable(i2s->clk_i2s); > if (ret) > @@ -444,6 +470,7 @@ static struct snd_soc_dai_driver jz4740_i2s_dai =3D=20 > { > static const struct i2s_soc_info jz4740_i2s_soc_info =3D { > .version =3D JZ_I2S_JZ4740, > .dai =3D &jz4740_i2s_dai, > + .shared_fifo_flush =3D true, > }; >=20 > static const struct i2s_soc_info jz4760_i2s_soc_info =3D { > -- > 2.35.1 >=20