Received: by 2002:a25:8b12:0:0:0:0:0 with SMTP id i18csp391815ybl; Tue, 13 Aug 2019 23:10:41 -0700 (PDT) X-Google-Smtp-Source: APXvYqxepZPH47Vsu4z0DvzOuCoa4Cmt8fVADlJVmkhO2kKFtWRWl9ZD+hOVVo3fBXl3gN7xRAuL X-Received: by 2002:a17:902:b604:: with SMTP id b4mr25586971pls.94.1565763041799; Tue, 13 Aug 2019 23:10:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1565763041; cv=none; d=google.com; s=arc-20160816; b=eDgwqEU7aEW8/Mrv5ClhYOMMWQzwvR0AP5K/pNpAJbJz2n/dKvM588V+LpAg5iZWlC 4FK77G6N1Umiizl3tfCJQX+aQKzsq1MCLEhekmerGW3qBJ+nNq2sDhwV2R35uZJFGrl2 HMh7giwjsvfLmCh3fMq4L+bKClNIz22774eBhv/2/f9JWVnZ5U5a/QnHSnVOq6LBQw5Y +Xknvolzi07JYMGGZaqPi0rBrI43+iftvlf35kV4dMt6UHgYsRpLFY5JO1nZqRSnT+M+ VuH5+pR2Zed4XvvqL0cUiTxccpAXkj9Xd0mM4teXX4KY4tNhLDhbdiV+nKRrK32g/HGv U10g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=Ou3x7y4s8p5adLbVD6HKEYQ2kNImM5q4bilXS/ylyGo=; b=lWtMk0Sctv0THcUJZNX7Yc+M76e25cPiKKgwWrJUuSWfAeWmAQuZb8kKBFq2vFXK2a udf9Skx+hLbpIBhwrZi8XHh6qZko9O3b2OV3sazcd2ICJCI7a1w87lNizoEeoQnpL6Um gV9xQonFhs04d+7G3vWdx0KkJm908gws59FtS+5VCcHQdjb7p3dnWVTzZcM1w9rTl55B VB12kWG5D0oyuDXQSOpriKw93gDgoRF2j5uBDwcNddYVV1o3UDQk1aj+LHfFw8s1FJiV UppEHYVWBE1ThDjLSyHA+YngXp/1sD3m9eNCJWkp+HlDS3GPMnAiPmVb9mK5huKdr1yy QshQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=b2FZTp02; 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; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id r74si8119763pfr.79.2019.08.13.23.10.23; Tue, 13 Aug 2019 23:10:41 -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; dkim=pass header.i=@gmail.com header.s=20161025 header.b=b2FZTp02; 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; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727671AbfHNGJV (ORCPT + 99 others); Wed, 14 Aug 2019 02:09:21 -0400 Received: from mail-lf1-f68.google.com ([209.85.167.68]:43334 "EHLO mail-lf1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727628AbfHNGJS (ORCPT ); Wed, 14 Aug 2019 02:09:18 -0400 Received: by mail-lf1-f68.google.com with SMTP id c19so78488565lfm.10 for ; Tue, 13 Aug 2019 23:09:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Ou3x7y4s8p5adLbVD6HKEYQ2kNImM5q4bilXS/ylyGo=; b=b2FZTp02TAHqQew35c6kwrKuCTzZoo3W8NqhcIPMlerWaVlqYLkYg7VlVI9gUC/5Lb fDQRW6yAa1Yq7q9Dyxn0APRJEK0w2aRzx/5pLZU83Nu0ZVvpfqNYEac7n+zvM9XjvUg3 mdUJ9mFIq42CoP9BRv8v22FCaPgPzBhLaI4sjjX8sWSY0ITdxMrvKl+LO71NlX+8XTuU zfHk5NOwMAurs0Ps4Uk60hws46rQ4Me+gwvud+d0SzYV7zelpS1hnTIMNQAvnIDb0dAV /Kaxmqo6nstOyiQ91V8eLhpBaRaIJBacuByzyg+ifpPuoJrgA2vKzCSSMNXIF/XtIN1o nEJQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Ou3x7y4s8p5adLbVD6HKEYQ2kNImM5q4bilXS/ylyGo=; b=PvC8jIvU0wO8+ZtXed4ilYaXc5nRb+nh/9JAcAf0QB7+ml3ZvuzR61FasNq61frXno kw/VY68kogV+j+PsV4yfWqUMZVTC7iaC+E3qNNIKRR0kDNu/nMhV5Ex5BsdjR+lMXLRm XFriaKKhPJKEvzwLOxtESBisV9o0/0OmtZCj1BNNx+lqL14Et68ovrfau0Lwvc/vjVy3 fvCu/JqD6oHsQL3n1WlVFtPd4hF6KYwt7fUCCuq71YHEFjJ+axexa0+2hOsmQDXZ8dhq lPtS2jxs0F4vX/tv9r+gvl/qT9DPmcsxEVazzUqrntNUmOmrz5nQFYa/Ya+zjWOTvXcG FR0Q== X-Gm-Message-State: APjAAAUdLXnV8Zudl6T0NXKyY4Lqablf0dCN3uxYDIwpnjeabQbB22PD ktFXQuXkxbGvRoXhnYRSEcg= X-Received: by 2002:a19:f603:: with SMTP id x3mr22065770lfe.125.1565762956491; Tue, 13 Aug 2019 23:09:16 -0700 (PDT) Received: from localhost.localdomain (c213-102-74-69.bredband.comhem.se. [213.102.74.69]) by smtp.gmail.com with ESMTPSA id s10sm3124235ljm.35.2019.08.13.23.09.15 (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Tue, 13 Aug 2019 23:09:15 -0700 (PDT) From: codekipper@gmail.com To: maxime.ripard@free-electrons.com, wens@csie.org, linux-sunxi@googlegroups.com Cc: 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, Marcus Cooper Subject: [PATCH v5 12/15] ASoC: sun4i-i2s: Add multi-lane functionality Date: Wed, 14 Aug 2019 08:08:51 +0200 Message-Id: <20190814060854.26345-13-codekipper@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190814060854.26345-1-codekipper@gmail.com> References: <20190814060854.26345-1-codekipper@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 --- sound/soc/sunxi/sun4i-i2s.c | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/sound/soc/sunxi/sun4i-i2s.c b/sound/soc/sunxi/sun4i-i2s.c index a8d98696fe7c..a020c3b372a8 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) @@ -614,6 +614,7 @@ 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) { @@ -622,6 +623,13 @@ static int sun4i_i2s_hw_params(struct snd_pcm_substream *substream, 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)); + if (i2s->variant->has_chcfg) { regmap_update_bits(i2s->regmap, SUN8I_I2S_CHAN_CFG_REG, SUN8I_I2S_CHAN_CFG_TX_SLOT_NUM_MASK, @@ -1389,9 +1397,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) @@ -1456,6 +1465,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; + } + pm_runtime_enable(&pdev->dev); if (!pm_runtime_enabled(&pdev->dev)) { ret = sun4i_i2s_runtime_resume(&pdev->dev); @@ -1465,7 +1487,7 @@ static int sun4i_i2s_probe(struct platform_device *pdev) ret = devm_snd_soc_register_component(&pdev->dev, &sun4i_i2s_component, - &sun4i_i2s_dai, 1); + soc_dai, 1); if (ret) { dev_err(&pdev->dev, "Could not register DAI\n"); goto err_suspend; -- 2.22.0