Received: by 2002:a25:ab43:0:0:0:0:0 with SMTP id u61csp5100154ybi; Tue, 4 Jun 2019 01:00:22 -0700 (PDT) X-Google-Smtp-Source: APXvYqzlujLfWnAZC560q4HvSgYKiRHkFwK8+TEL5XUyLIvZDu4eP8TjN08JcotRChYfsQ8NThkV X-Received: by 2002:a17:90a:2430:: with SMTP id h45mr15187472pje.14.1559635222472; Tue, 04 Jun 2019 01:00:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1559635222; cv=none; d=google.com; s=arc-20160816; b=O4qCZPyaH44mN0YZy4LsUGnsmTAj7cKglOo6hBnopCrLPQS30TqwKREtLga9VuevtE 48oKgZxbsJxnHJgJDBVtuM7Rqb2WrkV3uNY59bnLsSZOkj5DGxeKh6gfXxrlf+ObsbAw t7wvnVsgbUpbXMxN26c/LDUv4epE711EDkjIWMTc8IUcdpVQavt+ygPcmmNk0/WJ5ZXX 8SnUC+SyLH/VseNkTgdvd4zekTOkGCcCrv2t6S7z69tZN2PBbYqD/Tq9YYWafZBYX1dk 7ayPf6r7b3lNACcGRW4Av+7ngoYBLBfmqOfps0nzg4ywDN2lGxDnmbw32K6+XHxVI6Yp WO3A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date; bh=yXNBZ7sMiHBUrAGriXlZq/8NvUBn2xBzqnrYPloNjl8=; b=BbCDDltJ0cO8rBAiluxQYYl9KOKv96Rh61M+Kp3TmRCEzgXNr1ML58fMYVgkvKGDb9 sueiyPC5kklM4FxAXsuTRJ5BTnKIjacnvFSbqVDTR9YRcy8Jd2ymcOJh+eE0hXVdiuQL 43iYq2AcRMEMj0FvNSflFZhFUNPGCs4bpGo+IjdhmIRsv/ruw287yKlX56B2A7nYHk9y B3yUfpAkh4R60aveiyr6LOVQ3fI+g/e0J25CGs7U6w/OdczuUMxE5nQpgqOhG2e0JrVQ W29oYMnhs5ZjsnDUThfJUeP2XHmadyf2PCwRx+nyoppJlf+cE3sY8+jz5Br4cLIO3DtN YwvQ== 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id r140si23546431pgr.29.2019.06.04.01.00.06; Tue, 04 Jun 2019 01:00:22 -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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727085AbfFDH6p (ORCPT + 99 others); Tue, 4 Jun 2019 03:58:45 -0400 Received: from relay8-d.mail.gandi.net ([217.70.183.201]:46343 "EHLO relay8-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726805AbfFDH6p (ORCPT ); Tue, 4 Jun 2019 03:58:45 -0400 X-Originating-IP: 90.88.144.139 Received: from localhost (aaubervilliers-681-1-24-139.w90-88.abo.wanadoo.fr [90.88.144.139]) (Authenticated sender: maxime.ripard@bootlin.com) by relay8-d.mail.gandi.net (Postfix) with ESMTPSA id C485B1BF209; Tue, 4 Jun 2019 07:58:40 +0000 (UTC) Date: Tue, 4 Jun 2019 09:58:40 +0200 From: Maxime Ripard To: codekipper@gmail.com Cc: wens@csie.org, linux-sunxi@googlegroups.com, linux-arm-kernel@lists.infradead.org, lgirdwood@gmail.com, broonie@kernel.org, linux-kernel@vger.kernel.org, alsa-devel@alsa-project.org, be17068@iperbole.bo.it Subject: Re: [PATCH v4 6/9] ASoC: sun4i-i2s: Add multi-lane functionality Message-ID: <20190604075840.kquy3zcuckuzmvzr@flea> References: <20190603174735.21002-1-codekipper@gmail.com> <20190603174735.21002-7-codekipper@gmail.com> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="nyo2exzeeeog6q2h" Content-Disposition: inline In-Reply-To: <20190603174735.21002-7-codekipper@gmail.com> User-Agent: NeoMutt/20180716 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org --nyo2exzeeeog6q2h Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Mon, Jun 03, 2019 at 07:47:32PM +0200, codekipper@gmail.com wrote: > From: Marcus Cooper > > The i2s block supports multi-lane i2s output however this functionality > is only possible in earlier SoCs where the pins are exposed and for > the i2s block used for HDMI audio on the later SoCs. > > To enable this functionality, an optional property has been added to > the bindings. > > Signed-off-by: Marcus Cooper I'd like to have Mark's input on this, but I'm really worried about the interaction with the proper TDM support. Our fundamental issue is that the controller can have up to 8 channels, but either on 4 lines (instead of 1), or 8 channels on 1 (like proper TDM) (or any combination between the two, but that should be pretty rare). You're trying to do the first one, and I'm trying to do the second one. There's a number of assumptions later on that will break the TDM case, see below for examples > --- > sound/soc/sunxi/sun4i-i2s.c | 44 ++++++++++++++++++++++++++++++++----- > 1 file changed, 39 insertions(+), 5 deletions(-) > > diff --git a/sound/soc/sunxi/sun4i-i2s.c b/sound/soc/sunxi/sun4i-i2s.c > index bca73b3c0d74..75217fb52bfa 100644 > --- a/sound/soc/sunxi/sun4i-i2s.c > +++ b/sound/soc/sunxi/sun4i-i2s.c > @@ -23,7 +23,7 @@ > > #define SUN4I_I2S_CTRL_REG 0x00 > #define SUN4I_I2S_CTRL_SDO_EN_MASK GENMASK(11, 8) > -#define SUN4I_I2S_CTRL_SDO_EN(sdo) BIT(8 + (sdo)) > +#define SUN4I_I2S_CTRL_SDO_EN(lines) (((1 << lines) - 1) << 8) > #define SUN4I_I2S_CTRL_MODE_MASK BIT(5) > #define SUN4I_I2S_CTRL_MODE_SLAVE (1 << 5) > #define SUN4I_I2S_CTRL_MODE_MASTER (0 << 5) > @@ -355,14 +355,23 @@ static int sun4i_i2s_hw_params(struct snd_pcm_substream *substream, > struct sun4i_i2s *i2s = snd_soc_dai_get_drvdata(dai); > int sr, wss, channels; > u32 width; > + int lines; > > channels = params_channels(params); > - if (channels != 2) { > + if ((channels > dai->driver->playback.channels_max) || > + (channels < dai->driver->playback.channels_min)) { > dev_err(dai->dev, "Unsupported number of channels: %d\n", > channels); > return -EINVAL; > } > > + lines = (channels + 1) / 2; > + > + /* Enable the required output lines */ > + regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG, > + SUN4I_I2S_CTRL_SDO_EN_MASK, > + SUN4I_I2S_CTRL_SDO_EN(lines)); > + This has the assumption that each line will have 2 channels, which is wrong. > if (i2s->variant->is_h3_i2s_based) { > regmap_update_bits(i2s->regmap, SUN8I_I2S_CHAN_CFG_REG, > SUN8I_I2S_CHAN_CFG_TX_SLOT_NUM_MASK, > @@ -373,8 +382,19 @@ static int sun4i_i2s_hw_params(struct snd_pcm_substream *substream, > } > > /* Map the channels for playback and capture */ > - regmap_field_write(i2s->field_txchanmap, 0x76543210); > regmap_field_write(i2s->field_rxchanmap, 0x00003210); > + regmap_field_write(i2s->field_txchanmap, 0x10); > + if (i2s->variant->is_h3_i2s_based) { > + if (channels > 2) > + regmap_write(i2s->regmap, > + SUN8I_I2S_TX_CHAN_MAP_REG+4, 0x32); > + if (channels > 4) > + regmap_write(i2s->regmap, > + SUN8I_I2S_TX_CHAN_MAP_REG+8, 0x54); > + if (channels > 6) > + regmap_write(i2s->regmap, > + SUN8I_I2S_TX_CHAN_MAP_REG+12, 0x76); > + } And this creates a mapping matching that. > /* Configure the channels */ > regmap_field_write(i2s->field_txchansel, > @@ -1057,9 +1077,10 @@ static int sun4i_i2s_init_regmap_fields(struct device *dev, > static int sun4i_i2s_probe(struct platform_device *pdev) > { > struct sun4i_i2s *i2s; > + struct snd_soc_dai_driver *soc_dai; > struct resource *res; > void __iomem *regs; > - int irq, ret; > + int irq, ret, val; > > i2s = devm_kzalloc(&pdev->dev, sizeof(*i2s), GFP_KERNEL); > if (!i2s) > @@ -1126,6 +1147,19 @@ static int sun4i_i2s_probe(struct platform_device *pdev) > i2s->capture_dma_data.addr = res->start + SUN4I_I2S_FIFO_RX_REG; > i2s->capture_dma_data.maxburst = 8; > > + soc_dai = devm_kmemdup(&pdev->dev, &sun4i_i2s_dai, > + sizeof(*soc_dai), GFP_KERNEL); > + if (!soc_dai) { > + ret = -ENOMEM; > + goto err_pm_disable; > + } > + > + if (!of_property_read_u32(pdev->dev.of_node, > + "allwinner,playback-channels", &val)) { > + if (val >= 2 && val <= 8) > + soc_dai->playback.channels_max = val; > + } > + I'm not quite sure how this works. of_property_read_u32 will return 0, so you will enter in the condition. But what happens if the property is missing? Maxime -- Maxime Ripard, Bootlin Embedded Linux and Kernel engineering https://bootlin.com --nyo2exzeeeog6q2h Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iHUEABYIAB0WIQRcEzekXsqa64kGDp7j7w1vZxhRxQUCXPYksAAKCRDj7w1vZxhR xYBQAQCYX/Uu2lP7J+mcD5tFPBbgLuQ9PtE3e9B6ovbn9juZOQEA3+ZUzorIBacX S9cvpP0cRQzxe6STHA66H3PfQRHFDA0= =qzcv -----END PGP SIGNATURE----- --nyo2exzeeeog6q2h--