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 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 smtp.lore.kernel.org (Postfix) with ESMTPS id 1F530C54EE9 for ; Tue, 20 Sep 2022 13:29:41 +0000 (UTC) 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 3BCDEE0E; Tue, 20 Sep 2022 15:28:49 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 3BCDEE0E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1663680579; bh=/dxfWhqmMkQmV7S5CRMZVDD51+9HbcPvMYerh1tpzBg=; h=From:To:Subject:Date:In-Reply-To:References:Cc:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=FaTrQfFM1Sx0GriTjnl+hGTsZu7GuvJz3qtZPK8v69tnSHly2uG8s6hxWv9Hr3Org GaKFd4GihOAwAAA4Bf0RjHnpPu/hZzetm2EGoDKCCGzYxBYn9n8m0YnjHBRvkh8p2q Ua7WPSZcGMCbbkjY1xvKo1orCZ2ASuEcdbZImgUs= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 26BD4F80549; Tue, 20 Sep 2022 15:27:43 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 1F8E7F801D5; Tue, 20 Sep 2022 15:27:40 +0200 (CEST) Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 1B65AF80153 for ; Tue, 20 Sep 2022 15:27:33 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 1B65AF80153 Authentication-Results: alsa1.perex.cz; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="STSFalZE" Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id C1B11620D1; Tue, 20 Sep 2022 13:27:31 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id CE75DC433D7; Tue, 20 Sep 2022 13:27:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1663680451; bh=/dxfWhqmMkQmV7S5CRMZVDD51+9HbcPvMYerh1tpzBg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=STSFalZEwXGSEbc6nzmDWOmroSB9N7vampXEwj0HJR6GHPGblhrcNNSGuZL1lggO7 v+FPFbxoj6zVWhkCs2gQeKfD2+Q/xNK7SOrsQzi1q5igaHHZ6rSXtkg7C44XEK6wq3 jFfPgH8EufOtbDAaU/gU0osBDkYeqFMSvXv869DRAQOsGIzIYvxFIYFdGpx7OtB6ij bk50QXw6rV2MC0/HqyLr9aIyrQRJCaCoiTii94KZdE+fSEfUJMVPjIRVFEGIg+bJ2G sFveGHx3WWc5hbVZxENS+TuEV7wp+f6fBC7qkdhPLXE0DfSENDwMNMSfdtaNbo6anC pFwb9VxQYe0Mw== Received: by pali.im (Postfix) id 378762B6E; Tue, 20 Sep 2022 15:27:28 +0200 (CEST) From: =?UTF-8?q?Pali=20Roh=C3=A1r?= To: Liam Girdwood , Mark Brown , Andrew Lunn , Gregory Clement , Sebastian Hesselbarth , Marcin Wojtas Subject: [PATCH 1/5] ASoC: kirkwood: enable Kirkwood driver for Armada 38x platforms Date: Tue, 20 Sep 2022 15:26:44 +0200 Message-Id: <20220920132648.2008-2-pali@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20220920132648.2008-1-pali@kernel.org> References: <20220920132648.2008-1-pali@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: devicetree@vger.kernel.org, alsa-devel@alsa-project.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org 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" From: Marcin Wojtas The audio unit of Marvell Armada38x SoC is similar to the ones comprised by other Marvell SoCs (Kirkwood, Dove and Armada 370). Therefore KW audio driver can be used to support it and this commit adds new compatible string to identify Armada 38x variant. Two new memory regions are added: first one for PLL configuration and the second one for choosing one of audio I/O modes (I2S or S/PDIF). For the latter purpose a new optional DT property is added ('spdif-mode'). kirkwood-i2s driver is extended by adding a new init function for Armada 38x flavor and also a routine that enables PLL output (i.e. MCLK) configuration. Signed-off-by: Marcin Wojtas Tested-by: Star_Automation Reviewed-by: Nadav Haklai Reviewed-by: Lior Amsalem Tested-by: Lior Amsalem Signed-off-by: Hezi Shahmoon Reviewed-by: Neta Zur Hershkovits [pali: Fix support for pre-38x SoCs] Signed-off-by: Pali Rohár --- .../devicetree/bindings/sound/mvebu-audio.txt | 14 +- sound/soc/kirkwood/kirkwood-i2s.c | 136 +++++++++++++++++- sound/soc/kirkwood/kirkwood.h | 2 + 3 files changed, 149 insertions(+), 3 deletions(-) diff --git a/Documentation/devicetree/bindings/sound/mvebu-audio.txt b/Documentation/devicetree/bindings/sound/mvebu-audio.txt index cb8c07c81ce4..4f5dec5cb3c2 100644 --- a/Documentation/devicetree/bindings/sound/mvebu-audio.txt +++ b/Documentation/devicetree/bindings/sound/mvebu-audio.txt @@ -6,9 +6,14 @@ Required properties: "marvell,kirkwood-audio" for Kirkwood platforms "marvell,dove-audio" for Dove platforms "marvell,armada370-audio" for Armada 370 platforms + "marvell,armada-380-audio" for Armada 38x platforms - reg: physical base address of the controller and length of memory mapped - region. + region (named "i2s_regs"). + With "marvell,armada-380-audio" two other regions are required: + first of those is dedicated for Audio PLL Configuration registers + (named "pll_regs") and the second one ("soc_ctrl") - for register + where one of exceptive I/O types (I2S or S/PDIF) is set. - interrupts: with "marvell,kirkwood-audio", the audio interrupt @@ -23,6 +28,13 @@ Required properties: "internal" for the internal clock "extclk" for the external clock +Optional properties: + +- spdif-mode: + Enable S/PDIF mode on Armada 38x SoC. Using this property + disables standard I2S I/O. Valid only with "marvell,armada-380-audio" + compatible string. + Example: i2s1: audio-controller@b4000 { diff --git a/sound/soc/kirkwood/kirkwood-i2s.c b/sound/soc/kirkwood/kirkwood-i2s.c index 2a4ffe945177..ac387b5ca094 100644 --- a/sound/soc/kirkwood/kirkwood-i2s.c +++ b/sound/soc/kirkwood/kirkwood-i2s.c @@ -31,6 +31,122 @@ (SNDRV_PCM_FMTBIT_S16_LE | \ SNDRV_PCM_FMTBIT_S24_LE) +/* These registers are relative to the second register region - + * audio pll configuration. + */ +#define A38X_PLL_CONF_REG0 0x0 +#define A38X_PLL_FB_CLK_DIV_OFFSET 10 +#define A38X_PLL_FB_CLK_DIV_MASK 0x7fc00 +#define A38X_PLL_CONF_REG1 0x4 +#define A38X_PLL_FREQ_OFFSET_MASK 0xffff +#define A38X_PLL_FREQ_OFFSET_VALID BIT(16) +#define A38X_PLL_SW_RESET BIT(31) +#define A38X_PLL_CONF_REG2 0x8 +#define A38X_PLL_AUDIO_POSTDIV_MASK 0x7f + +/* Bit below belongs to SoC control register corresponding to the third + * register region. + */ +#define A38X_SPDIF_MODE_ENABLE BIT(27) + +static int armada_38x_i2s_init_quirk(struct platform_device *pdev, + struct kirkwood_dma_data *priv, + struct snd_soc_dai_driver *dai_drv) +{ + struct device_node *np = pdev->dev.of_node; + u32 reg_val; + int i; + + priv->pll_config = devm_platform_ioremap_resource_byname(pdev, "pll_regs"); + if (IS_ERR(priv->pll_config)) + return -ENOMEM; + + priv->soc_control = devm_platform_ioremap_resource_byname(pdev, "soc_ctrl"); + if (IS_ERR(priv->soc_control)) + return -ENOMEM; + + /* Select one of exceptive modes: I2S or S/PDIF */ + reg_val = readl(priv->soc_control); + if (of_property_read_bool(np, "spdif-mode")) { + reg_val |= A38X_SPDIF_MODE_ENABLE; + dev_info(&pdev->dev, "using S/PDIF mode\n"); + } else { + reg_val &= ~A38X_SPDIF_MODE_ENABLE; + dev_info(&pdev->dev, "using I2S mode\n"); + } + writel(reg_val, priv->soc_control); + + /* Update available rates of mclk's fs */ + for (i = 0; i < 2; i++) { + dai_drv[i].playback.rates |= SNDRV_PCM_RATE_192000; + dai_drv[i].capture.rates |= SNDRV_PCM_RATE_192000; + } + + return 0; +} + +static inline void armada_38x_set_pll(void __iomem *base, unsigned long rate) +{ + u32 reg_val; + u16 freq_offset = 0x22b0; + u8 audio_postdiv, fb_clk_div = 0x1d; + + /* Set frequency offset value to not valid and enable PLL reset */ + reg_val = readl(base + A38X_PLL_CONF_REG1); + reg_val &= ~A38X_PLL_FREQ_OFFSET_VALID; + reg_val &= ~A38X_PLL_SW_RESET; + writel(reg_val, base + A38X_PLL_CONF_REG1); + + udelay(1); + + /* Update PLL parameters */ + switch (rate) { + default: + case 44100: + freq_offset = 0x735; + fb_clk_div = 0x1b; + audio_postdiv = 0xc; + break; + case 48000: + audio_postdiv = 0xc; + break; + case 96000: + audio_postdiv = 0x6; + break; + case 192000: + audio_postdiv = 0x3; + break; + } + + reg_val = readl(base + A38X_PLL_CONF_REG0); + reg_val &= ~A38X_PLL_FB_CLK_DIV_MASK; + reg_val |= (fb_clk_div << A38X_PLL_FB_CLK_DIV_OFFSET); + writel(reg_val, base + A38X_PLL_CONF_REG0); + + reg_val = readl(base + A38X_PLL_CONF_REG2); + reg_val &= ~A38X_PLL_AUDIO_POSTDIV_MASK; + reg_val |= audio_postdiv; + writel(reg_val, base + A38X_PLL_CONF_REG2); + + reg_val = readl(base + A38X_PLL_CONF_REG1); + reg_val &= ~A38X_PLL_FREQ_OFFSET_MASK; + reg_val |= freq_offset; + writel(reg_val, base + A38X_PLL_CONF_REG1); + + udelay(1); + + /* Disable reset */ + reg_val |= A38X_PLL_SW_RESET; + writel(reg_val, base + A38X_PLL_CONF_REG1); + + /* Wait 50us for PLL to lock */ + udelay(50); + + /* Restore frequency offset value validity */ + reg_val |= A38X_PLL_FREQ_OFFSET_VALID; + writel(reg_val, base + A38X_PLL_CONF_REG1); +} + static int kirkwood_i2s_set_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt) { @@ -106,7 +222,10 @@ static void kirkwood_set_rate(struct snd_soc_dai *dai, * defined in kirkwood_i2s_dai */ dev_dbg(dai->dev, "%s: dco set rate = %lu\n", __func__, rate); - kirkwood_set_dco(priv->io, rate); + if (priv->pll_config) + armada_38x_set_pll(priv->pll_config, rate); + else + kirkwood_set_dco(priv->io, rate); clks_ctrl = KIRKWOOD_MCLK_SOURCE_DCO; } else { @@ -532,7 +651,10 @@ static int kirkwood_i2s_dev_probe(struct platform_device *pdev) dev_set_drvdata(&pdev->dev, priv); - priv->io = devm_platform_ioremap_resource(pdev, 0); + if (of_device_is_compatible(np, "marvell,armada-380-audio")) + priv->io = devm_platform_ioremap_resource_byname(pdev, "i2s_regs"); + else + priv->io = devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(priv->io)) return PTR_ERR(priv->io); @@ -540,6 +662,15 @@ static int kirkwood_i2s_dev_probe(struct platform_device *pdev) if (priv->irq < 0) return priv->irq; + if (of_device_is_compatible(np, "marvell,armada-380-audio")) { + err = armada_38x_i2s_init_quirk(pdev, priv, soc_dai); + /* Set initial pll frequency */ + if (priv->pll_config) + armada_38x_set_pll(priv->pll_config, 44100); + if (err < 0) + return err; + } + if (np) { priv->burst = 128; /* might be 32 or 128 */ } else if (data) { @@ -623,6 +754,7 @@ static const struct of_device_id mvebu_audio_of_match[] = { { .compatible = "marvell,kirkwood-audio" }, { .compatible = "marvell,dove-audio" }, { .compatible = "marvell,armada370-audio" }, + { .compatible = "marvell,armada-380-audio" }, { } }; MODULE_DEVICE_TABLE(of, mvebu_audio_of_match); diff --git a/sound/soc/kirkwood/kirkwood.h b/sound/soc/kirkwood/kirkwood.h index a1733a6aace5..79bb9aa7f086 100644 --- a/sound/soc/kirkwood/kirkwood.h +++ b/sound/soc/kirkwood/kirkwood.h @@ -131,6 +131,8 @@ struct kirkwood_dma_data { void __iomem *io; + void __iomem *pll_config; + void __iomem *soc_control; struct clk *clk; struct clk *extclk; uint32_t ctl_play; -- 2.20.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 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 smtp.lore.kernel.org (Postfix) with ESMTPS id 9E1A3C54EE9 for ; Tue, 20 Sep 2022 13:29:00 +0000 (UTC) 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: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=/88/AeKLfsIHt2NFQRTdCRR43iWuFVU/bAg+i2wB23o=; b=i6ocy7qPdG4+qA rvEJsabXGVJnhYP39vcgH2KXrksABtSZgbIunMeyBwcQVUaB8sG6uJETKZ0xY3g+yORdaMlwxqagI ti4OZhH2rU+zGz+p6e4nWmMGWHg5M/cWtdRCDcWDulo6CUVOPJRb0qh9fX+di0Z7Z7Rdn77tZhvLw fQOE8JwrYejRYQznNZ+aKA5ZopI+69WBiBuBsY9dRpFXwOW7nypPwwXhL1Y6RLEphQUXp8sYbDAtW foEHgOMGbiDcX5HJaoSeVZz3kYCFhNKDqm2ozHYga1UMhV2kBKAFkfMU/5oIOCPvkWBf6gyulvVzD 6dQb50S9qLONGP1p06Yg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1oadI5-0044kj-99; Tue, 20 Sep 2022 13:27:57 +0000 Received: from dfw.source.kernel.org ([2604:1380:4641:c500::1]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1oadHg-0044c0-JZ for linux-arm-kernel@lists.infradead.org; Tue, 20 Sep 2022 13:27:35 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id C1B11620D1; Tue, 20 Sep 2022 13:27:31 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id CE75DC433D7; Tue, 20 Sep 2022 13:27:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1663680451; bh=/dxfWhqmMkQmV7S5CRMZVDD51+9HbcPvMYerh1tpzBg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=STSFalZEwXGSEbc6nzmDWOmroSB9N7vampXEwj0HJR6GHPGblhrcNNSGuZL1lggO7 v+FPFbxoj6zVWhkCs2gQeKfD2+Q/xNK7SOrsQzi1q5igaHHZ6rSXtkg7C44XEK6wq3 jFfPgH8EufOtbDAaU/gU0osBDkYeqFMSvXv869DRAQOsGIzIYvxFIYFdGpx7OtB6ij bk50QXw6rV2MC0/HqyLr9aIyrQRJCaCoiTii94KZdE+fSEfUJMVPjIRVFEGIg+bJ2G sFveGHx3WWc5hbVZxENS+TuEV7wp+f6fBC7qkdhPLXE0DfSENDwMNMSfdtaNbo6anC pFwb9VxQYe0Mw== Received: by pali.im (Postfix) id 378762B6E; Tue, 20 Sep 2022 15:27:28 +0200 (CEST) From: =?UTF-8?q?Pali=20Roh=C3=A1r?= To: Liam Girdwood , Mark Brown , Andrew Lunn , Gregory Clement , Sebastian Hesselbarth , Marcin Wojtas Cc: alsa-devel@alsa-project.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH 1/5] ASoC: kirkwood: enable Kirkwood driver for Armada 38x platforms Date: Tue, 20 Sep 2022 15:26:44 +0200 Message-Id: <20220920132648.2008-2-pali@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20220920132648.2008-1-pali@kernel.org> References: <20220920132648.2008-1-pali@kernel.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220920_062732_770956_FECBC458 X-CRM114-Status: GOOD ( 30.64 ) 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="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org RnJvbTogTWFyY2luIFdvanRhcyA8bXdAc2VtaWhhbGYuY29tPgoKVGhlIGF1ZGlvIHVuaXQgb2Yg TWFydmVsbCBBcm1hZGEzOHggU29DIGlzIHNpbWlsYXIgdG8gdGhlIG9uZXMgY29tcHJpc2VkIGJ5 Cm90aGVyIE1hcnZlbGwgU29DcyAoS2lya3dvb2QsIERvdmUgYW5kIEFybWFkYSAzNzApLiBUaGVy ZWZvcmUgS1cgYXVkaW8KZHJpdmVyIGNhbiBiZSB1c2VkIHRvIHN1cHBvcnQgaXQgYW5kIHRoaXMg Y29tbWl0IGFkZHMgbmV3IGNvbXBhdGlibGUgc3RyaW5nCnRvIGlkZW50aWZ5IEFybWFkYSAzOHgg dmFyaWFudC4KClR3byBuZXcgbWVtb3J5IHJlZ2lvbnMgYXJlIGFkZGVkOiBmaXJzdCBvbmUgZm9y IFBMTCBjb25maWd1cmF0aW9uIGFuZAp0aGUgc2Vjb25kIG9uZSBmb3IgY2hvb3Npbmcgb25lIG9m IGF1ZGlvIEkvTyBtb2RlcyAoSTJTIG9yIFMvUERJRikuCkZvciB0aGUgbGF0dGVyIHB1cnBvc2Ug YSBuZXcgb3B0aW9uYWwgRFQgcHJvcGVydHkgaXMgYWRkZWQgKCdzcGRpZi1tb2RlJykuCgpraXJr d29vZC1pMnMgZHJpdmVyIGlzIGV4dGVuZGVkIGJ5IGFkZGluZyBhIG5ldyBpbml0IGZ1bmN0aW9u IGZvciBBcm1hZGEKMzh4IGZsYXZvciBhbmQgYWxzbyBhIHJvdXRpbmUgdGhhdCBlbmFibGVzIFBM TCBvdXRwdXQgKGkuZS4gTUNMSykKY29uZmlndXJhdGlvbi4KClNpZ25lZC1vZmYtYnk6IE1hcmNp biBXb2p0YXMgPG13QHNlbWloYWxmLmNvbT4KVGVzdGVkLWJ5OiBTdGFyX0F1dG9tYXRpb24gPHN0 YXJAbWFydmVsbC5jb20+ClJldmlld2VkLWJ5OiBOYWRhdiBIYWtsYWkgPG5hZGF2aEBtYXJ2ZWxs LmNvbT4KUmV2aWV3ZWQtYnk6IExpb3IgQW1zYWxlbSA8YWxpb3JAbWFydmVsbC5jb20+ClRlc3Rl ZC1ieTogTGlvciBBbXNhbGVtIDxhbGlvckBtYXJ2ZWxsLmNvbT4KU2lnbmVkLW9mZi1ieTogSGV6 aSBTaGFobW9vbiA8aGV6aUBtYXJ2ZWxsLmNvbT4KUmV2aWV3ZWQtYnk6IE5ldGEgWnVyIEhlcnNo a292aXRzIDxuZXRhQG1hcnZlbGwuY29tPgpbcGFsaTogRml4IHN1cHBvcnQgZm9yIHByZS0zOHgg U29Dc10KU2lnbmVkLW9mZi1ieTogUGFsaSBSb2jDoXIgPHBhbGlAa2VybmVsLm9yZz4KLS0tCiAu Li4vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9tdmVidS1hdWRpby50eHQgfCAgMTQgKy0KIHNv dW5kL3NvYy9raXJrd29vZC9raXJrd29vZC1pMnMuYyAgICAgICAgICAgICB8IDEzNiArKysrKysr KysrKysrKysrKy0KIHNvdW5kL3NvYy9raXJrd29vZC9raXJrd29vZC5oICAgICAgICAgICAgICAg ICB8ICAgMiArCiAzIGZpbGVzIGNoYW5nZWQsIDE0OSBpbnNlcnRpb25zKCspLCAzIGRlbGV0aW9u cygtKQoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3Vu ZC9tdmVidS1hdWRpby50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291 bmQvbXZlYnUtYXVkaW8udHh0CmluZGV4IGNiOGMwN2M4MWNlNC4uNGY1ZGVjNWNiM2MyIDEwMDY0 NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvbXZlYnUtYXVk aW8udHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9tdmVi dS1hdWRpby50eHQKQEAgLTYsOSArNiwxNCBAQCBSZXF1aXJlZCBwcm9wZXJ0aWVzOgogICAibWFy dmVsbCxraXJrd29vZC1hdWRpbyIgZm9yIEtpcmt3b29kIHBsYXRmb3JtcwogICAibWFydmVsbCxk b3ZlLWF1ZGlvIiBmb3IgRG92ZSBwbGF0Zm9ybXMKICAgIm1hcnZlbGwsYXJtYWRhMzcwLWF1ZGlv IiBmb3IgQXJtYWRhIDM3MCBwbGF0Zm9ybXMKKyAgIm1hcnZlbGwsYXJtYWRhLTM4MC1hdWRpbyIg Zm9yIEFybWFkYSAzOHggcGxhdGZvcm1zCiAKIC0gcmVnOiBwaHlzaWNhbCBiYXNlIGFkZHJlc3Mg b2YgdGhlIGNvbnRyb2xsZXIgYW5kIGxlbmd0aCBvZiBtZW1vcnkgbWFwcGVkCi0gIHJlZ2lvbi4K KyAgcmVnaW9uIChuYW1lZCAiaTJzX3JlZ3MiKS4KKyAgV2l0aCAibWFydmVsbCxhcm1hZGEtMzgw LWF1ZGlvIiB0d28gb3RoZXIgcmVnaW9ucyBhcmUgcmVxdWlyZWQ6CisgIGZpcnN0IG9mIHRob3Nl IGlzIGRlZGljYXRlZCBmb3IgQXVkaW8gUExMIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzCisgIChu YW1lZCAicGxsX3JlZ3MiKSBhbmQgdGhlIHNlY29uZCBvbmUgKCJzb2NfY3RybCIpIC0gZm9yIHJl Z2lzdGVyCisgIHdoZXJlIG9uZSBvZiBleGNlcHRpdmUgSS9PIHR5cGVzIChJMlMgb3IgUy9QRElG KSBpcyBzZXQuCiAKIC0gaW50ZXJydXB0czoKICAgd2l0aCAibWFydmVsbCxraXJrd29vZC1hdWRp byIsIHRoZSBhdWRpbyBpbnRlcnJ1cHQKQEAgLTIzLDYgKzI4LDEzIEBAIFJlcXVpcmVkIHByb3Bl cnRpZXM6CiAJImludGVybmFsIiBmb3IgdGhlIGludGVybmFsIGNsb2NrCiAJImV4dGNsayIgZm9y IHRoZSBleHRlcm5hbCBjbG9jawogCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorCistIHNwZGlmLW1v ZGU6CisgIEVuYWJsZSBTL1BESUYgbW9kZSBvbiBBcm1hZGEgMzh4IFNvQy4gVXNpbmcgdGhpcyBw cm9wZXJ0eQorICBkaXNhYmxlcyBzdGFuZGFyZCBJMlMgSS9PLiBWYWxpZCBvbmx5IHdpdGggIm1h cnZlbGwsYXJtYWRhLTM4MC1hdWRpbyIKKyAgY29tcGF0aWJsZSBzdHJpbmcuCisKIEV4YW1wbGU6 CiAKIGkyczE6IGF1ZGlvLWNvbnRyb2xsZXJAYjQwMDAgewpkaWZmIC0tZ2l0IGEvc291bmQvc29j L2tpcmt3b29kL2tpcmt3b29kLWkycy5jIGIvc291bmQvc29jL2tpcmt3b29kL2tpcmt3b29kLWky cy5jCmluZGV4IDJhNGZmZTk0NTE3Ny4uYWMzODdiNWNhMDk0IDEwMDY0NAotLS0gYS9zb3VuZC9z b2Mva2lya3dvb2Qva2lya3dvb2QtaTJzLmMKKysrIGIvc291bmQvc29jL2tpcmt3b29kL2tpcmt3 b29kLWkycy5jCkBAIC0zMSw2ICszMSwxMjIgQEAKIAkoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUg fCBcCiAJIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKQogCisvKiBUaGVzZSByZWdpc3RlcnMgYXJl IHJlbGF0aXZlIHRvIHRoZSBzZWNvbmQgcmVnaXN0ZXIgcmVnaW9uIC0KKyAqIGF1ZGlvIHBsbCBj b25maWd1cmF0aW9uLgorICovCisjZGVmaW5lIEEzOFhfUExMX0NPTkZfUkVHMAkJCTB4MAorI2Rl ZmluZSAgICAgQTM4WF9QTExfRkJfQ0xLX0RJVl9PRkZTRVQJCTEwCisjZGVmaW5lICAgICBBMzhY X1BMTF9GQl9DTEtfRElWX01BU0sJCTB4N2ZjMDAKKyNkZWZpbmUgQTM4WF9QTExfQ09ORl9SRUcx CQkJMHg0CisjZGVmaW5lICAgICBBMzhYX1BMTF9GUkVRX09GRlNFVF9NQVNLCQkweGZmZmYKKyNk ZWZpbmUgICAgIEEzOFhfUExMX0ZSRVFfT0ZGU0VUX1ZBTElECQlCSVQoMTYpCisjZGVmaW5lICAg ICBBMzhYX1BMTF9TV19SRVNFVAkJCUJJVCgzMSkKKyNkZWZpbmUgQTM4WF9QTExfQ09ORl9SRUcy CQkJMHg4CisjZGVmaW5lICAgICBBMzhYX1BMTF9BVURJT19QT1NURElWX01BU0sJCTB4N2YKKwor LyogQml0IGJlbG93IGJlbG9uZ3MgdG8gU29DIGNvbnRyb2wgcmVnaXN0ZXIgY29ycmVzcG9uZGlu ZyB0byB0aGUgdGhpcmQKKyAqIHJlZ2lzdGVyIHJlZ2lvbi4KKyAqLworI2RlZmluZSBBMzhYX1NQ RElGX01PREVfRU5BQkxFCQkJQklUKDI3KQorCitzdGF0aWMgaW50IGFybWFkYV8zOHhfaTJzX2lu aXRfcXVpcmsoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQkgICAgIHN0cnVjdCBr aXJrd29vZF9kbWFfZGF0YSAqcHJpdiwKKwkJCQkgICAgIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2 ZXIgKmRhaV9kcnYpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9u b2RlOworCXUzMiByZWdfdmFsOworCWludCBpOworCisJcHJpdi0+cGxsX2NvbmZpZyA9IGRldm1f cGxhdGZvcm1faW9yZW1hcF9yZXNvdXJjZV9ieW5hbWUocGRldiwgInBsbF9yZWdzIik7CisJaWYg KElTX0VSUihwcml2LT5wbGxfY29uZmlnKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwcml2LT5z b2NfY29udHJvbCA9IGRldm1fcGxhdGZvcm1faW9yZW1hcF9yZXNvdXJjZV9ieW5hbWUocGRldiwg InNvY19jdHJsIik7CisJaWYgKElTX0VSUihwcml2LT5zb2NfY29udHJvbCkpCisJCXJldHVybiAt RU5PTUVNOworCisJLyogU2VsZWN0IG9uZSBvZiBleGNlcHRpdmUgbW9kZXM6IEkyUyBvciBTL1BE SUYgKi8KKwlyZWdfdmFsID0gcmVhZGwocHJpdi0+c29jX2NvbnRyb2wpOworCWlmIChvZl9wcm9w ZXJ0eV9yZWFkX2Jvb2wobnAsICJzcGRpZi1tb2RlIikpIHsKKwkJcmVnX3ZhbCB8PSBBMzhYX1NQ RElGX01PREVfRU5BQkxFOworCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAidXNpbmcgUy9QRElGIG1v ZGVcbiIpOworCX0gZWxzZSB7CisJCXJlZ192YWwgJj0gfkEzOFhfU1BESUZfTU9ERV9FTkFCTEU7 CisJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJ1c2luZyBJMlMgbW9kZVxuIik7CisJfQorCXdyaXRl bChyZWdfdmFsLCBwcml2LT5zb2NfY29udHJvbCk7CisKKwkvKiBVcGRhdGUgYXZhaWxhYmxlIHJh dGVzIG9mIG1jbGsncyBmcyAqLworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJZGFpX2Ry dltpXS5wbGF5YmFjay5yYXRlcyB8PSBTTkRSVl9QQ01fUkFURV8xOTIwMDA7CisJCWRhaV9kcnZb aV0uY2FwdHVyZS5yYXRlcyB8PSBTTkRSVl9QQ01fUkFURV8xOTIwMDA7CisJfQorCisJcmV0dXJu IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhcm1hZGFfMzh4X3NldF9wbGwodm9pZCBfX2lv bWVtICpiYXNlLCB1bnNpZ25lZCBsb25nIHJhdGUpCit7CisJdTMyIHJlZ192YWw7CisJdTE2IGZy ZXFfb2Zmc2V0ID0gMHgyMmIwOworCXU4IGF1ZGlvX3Bvc3RkaXYsIGZiX2Nsa19kaXYgPSAweDFk OworCisJLyogU2V0IGZyZXF1ZW5jeSBvZmZzZXQgdmFsdWUgdG8gbm90IHZhbGlkIGFuZCBlbmFi bGUgUExMIHJlc2V0ICovCisJcmVnX3ZhbCA9IHJlYWRsKGJhc2UgKyBBMzhYX1BMTF9DT05GX1JF RzEpOworCXJlZ192YWwgJj0gfkEzOFhfUExMX0ZSRVFfT0ZGU0VUX1ZBTElEOworCXJlZ192YWwg Jj0gfkEzOFhfUExMX1NXX1JFU0VUOworCXdyaXRlbChyZWdfdmFsLCBiYXNlICsgQTM4WF9QTExf Q09ORl9SRUcxKTsKKworCXVkZWxheSgxKTsKKworCS8qIFVwZGF0ZSBQTEwgcGFyYW1ldGVycyAq LworCXN3aXRjaCAocmF0ZSkgeworCWRlZmF1bHQ6CisJY2FzZSA0NDEwMDoKKwkJZnJlcV9vZmZz ZXQgPSAweDczNTsKKwkJZmJfY2xrX2RpdiA9IDB4MWI7CisJCWF1ZGlvX3Bvc3RkaXYgPSAweGM7 CisJCWJyZWFrOworCWNhc2UgNDgwMDA6CisJCWF1ZGlvX3Bvc3RkaXYgPSAweGM7CisJCWJyZWFr OworCWNhc2UgOTYwMDA6CisJCWF1ZGlvX3Bvc3RkaXYgPSAweDY7CisJCWJyZWFrOworCWNhc2Ug MTkyMDAwOgorCQlhdWRpb19wb3N0ZGl2ID0gMHgzOworCQlicmVhazsKKwl9CisKKwlyZWdfdmFs ID0gcmVhZGwoYmFzZSArIEEzOFhfUExMX0NPTkZfUkVHMCk7CisJcmVnX3ZhbCAmPSB+QTM4WF9Q TExfRkJfQ0xLX0RJVl9NQVNLOworCXJlZ192YWwgfD0gKGZiX2Nsa19kaXYgPDwgQTM4WF9QTExf RkJfQ0xLX0RJVl9PRkZTRVQpOworCXdyaXRlbChyZWdfdmFsLCBiYXNlICsgQTM4WF9QTExfQ09O Rl9SRUcwKTsKKworCXJlZ192YWwgPSByZWFkbChiYXNlICsgQTM4WF9QTExfQ09ORl9SRUcyKTsK KwlyZWdfdmFsICY9IH5BMzhYX1BMTF9BVURJT19QT1NURElWX01BU0s7CisJcmVnX3ZhbCB8PSBh dWRpb19wb3N0ZGl2OworCXdyaXRlbChyZWdfdmFsLCBiYXNlICsgQTM4WF9QTExfQ09ORl9SRUcy KTsKKworCXJlZ192YWwgPSByZWFkbChiYXNlICsgQTM4WF9QTExfQ09ORl9SRUcxKTsKKwlyZWdf dmFsICY9IH5BMzhYX1BMTF9GUkVRX09GRlNFVF9NQVNLOworCXJlZ192YWwgfD0gZnJlcV9vZmZz ZXQ7CisJd3JpdGVsKHJlZ192YWwsIGJhc2UgKyBBMzhYX1BMTF9DT05GX1JFRzEpOworCisJdWRl bGF5KDEpOworCisJLyogRGlzYWJsZSByZXNldCAqLworCXJlZ192YWwgfD0gQTM4WF9QTExfU1df UkVTRVQ7CisJd3JpdGVsKHJlZ192YWwsIGJhc2UgKyBBMzhYX1BMTF9DT05GX1JFRzEpOworCisJ LyogV2FpdCA1MHVzIGZvciBQTEwgdG8gbG9jayAqLworCXVkZWxheSg1MCk7CisKKwkvKiBSZXN0 b3JlIGZyZXF1ZW5jeSBvZmZzZXQgdmFsdWUgdmFsaWRpdHkgKi8KKwlyZWdfdmFsIHw9IEEzOFhf UExMX0ZSRVFfT0ZGU0VUX1ZBTElEOworCXdyaXRlbChyZWdfdmFsLCBiYXNlICsgQTM4WF9QTExf Q09ORl9SRUcxKTsKK30KKwogc3RhdGljIGludCBraXJrd29vZF9pMnNfc2V0X2ZtdChzdHJ1Y3Qg c25kX3NvY19kYWkgKmNwdV9kYWksCiAJCXVuc2lnbmVkIGludCBmbXQpCiB7CkBAIC0xMDYsNyAr MjIyLDEwIEBAIHN0YXRpYyB2b2lkIGtpcmt3b29kX3NldF9yYXRlKHN0cnVjdCBzbmRfc29jX2Rh aSAqZGFpLAogCQkgKiBkZWZpbmVkIGluIGtpcmt3b29kX2kyc19kYWkgKi8KIAkJZGV2X2RiZyhk YWktPmRldiwgIiVzOiBkY28gc2V0IHJhdGUgPSAlbHVcbiIsCiAJCQlfX2Z1bmNfXywgcmF0ZSk7 Ci0JCWtpcmt3b29kX3NldF9kY28ocHJpdi0+aW8sIHJhdGUpOworCQlpZiAocHJpdi0+cGxsX2Nv bmZpZykKKwkJCWFybWFkYV8zOHhfc2V0X3BsbChwcml2LT5wbGxfY29uZmlnLCByYXRlKTsKKwkJ ZWxzZQorCQkJa2lya3dvb2Rfc2V0X2Rjbyhwcml2LT5pbywgcmF0ZSk7CiAKIAkJY2xrc19jdHJs ID0gS0lSS1dPT0RfTUNMS19TT1VSQ0VfRENPOwogCX0gZWxzZSB7CkBAIC01MzIsNyArNjUxLDEw IEBAIHN0YXRpYyBpbnQga2lya3dvb2RfaTJzX2Rldl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2 aWNlICpwZGV2KQogCiAJZGV2X3NldF9kcnZkYXRhKCZwZGV2LT5kZXYsIHByaXYpOwogCi0JcHJp di0+aW8gPSBkZXZtX3BsYXRmb3JtX2lvcmVtYXBfcmVzb3VyY2UocGRldiwgMCk7CisJaWYgKG9m X2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAibWFydmVsbCxhcm1hZGEtMzgwLWF1ZGlvIikpCisJ CXByaXYtPmlvID0gZGV2bV9wbGF0Zm9ybV9pb3JlbWFwX3Jlc291cmNlX2J5bmFtZShwZGV2LCAi aTJzX3JlZ3MiKTsKKwllbHNlCisJCXByaXYtPmlvID0gZGV2bV9wbGF0Zm9ybV9pb3JlbWFwX3Jl c291cmNlKHBkZXYsIDApOwogCWlmIChJU19FUlIocHJpdi0+aW8pKQogCQlyZXR1cm4gUFRSX0VS Uihwcml2LT5pbyk7CiAKQEAgLTU0MCw2ICs2NjIsMTUgQEAgc3RhdGljIGludCBraXJrd29vZF9p MnNfZGV2X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiAJaWYgKHByaXYtPmly cSA8IDApCiAJCXJldHVybiBwcml2LT5pcnE7CiAKKwlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGli bGUobnAsICJtYXJ2ZWxsLGFybWFkYS0zODAtYXVkaW8iKSkgeworCQllcnIgPSBhcm1hZGFfMzh4 X2kyc19pbml0X3F1aXJrKHBkZXYsIHByaXYsIHNvY19kYWkpOworCQkvKiBTZXQgaW5pdGlhbCBw bGwgZnJlcXVlbmN5ICovCisJCWlmIChwcml2LT5wbGxfY29uZmlnKQorCQkJYXJtYWRhXzM4eF9z ZXRfcGxsKHByaXYtPnBsbF9jb25maWcsIDQ0MTAwKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1 cm4gZXJyOworCX0KKwogCWlmIChucCkgewogCQlwcml2LT5idXJzdCA9IDEyODsJCS8qIG1pZ2h0 IGJlIDMyIG9yIDEyOCAqLwogCX0gZWxzZSBpZiAoZGF0YSkgewpAQCAtNjIzLDYgKzc1NCw3IEBA IHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG12ZWJ1X2F1ZGlvX29mX21hdGNoW10g PSB7CiAJeyAuY29tcGF0aWJsZSA9ICJtYXJ2ZWxsLGtpcmt3b29kLWF1ZGlvIiB9LAogCXsgLmNv bXBhdGlibGUgPSAibWFydmVsbCxkb3ZlLWF1ZGlvIiB9LAogCXsgLmNvbXBhdGlibGUgPSAibWFy dmVsbCxhcm1hZGEzNzAtYXVkaW8iIH0sCisJeyAuY29tcGF0aWJsZSA9ICJtYXJ2ZWxsLGFybWFk YS0zODAtYXVkaW8iIH0sCiAJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXZlYnVf YXVkaW9fb2ZfbWF0Y2gpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2tpcmt3b29kL2tpcmt3b29k LmggYi9zb3VuZC9zb2Mva2lya3dvb2Qva2lya3dvb2QuaAppbmRleCBhMTczM2E2YWFjZTUuLjc5 YmI5YWE3ZjA4NiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2tpcmt3b29kL2tpcmt3b29kLmgKKysr IGIvc291bmQvc29jL2tpcmt3b29kL2tpcmt3b29kLmgKQEAgLTEzMSw2ICsxMzEsOCBAQAogCiBz dHJ1Y3Qga2lya3dvb2RfZG1hX2RhdGEgewogCXZvaWQgX19pb21lbSAqaW87CisJdm9pZCBfX2lv bWVtICpwbGxfY29uZmlnOworCXZvaWQgX19pb21lbSAqc29jX2NvbnRyb2w7CiAJc3RydWN0IGNs ayAqY2xrOwogCXN0cnVjdCBjbGsgKmV4dGNsazsKIAl1aW50MzJfdCBjdGxfcGxheTsKLS0gCjIu MjAuMQoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxp bnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFk ZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4 LWFybS1rZXJuZWwK 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 Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8428AC54EE9 for ; Tue, 20 Sep 2022 13:27:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230268AbiITN1f (ORCPT ); Tue, 20 Sep 2022 09:27:35 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35922 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229785AbiITN1d (ORCPT ); Tue, 20 Sep 2022 09:27:33 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4654449B59; Tue, 20 Sep 2022 06:27:32 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id C8C59623BB; Tue, 20 Sep 2022 13:27:31 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id CE75DC433D7; Tue, 20 Sep 2022 13:27:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1663680451; bh=/dxfWhqmMkQmV7S5CRMZVDD51+9HbcPvMYerh1tpzBg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=STSFalZEwXGSEbc6nzmDWOmroSB9N7vampXEwj0HJR6GHPGblhrcNNSGuZL1lggO7 v+FPFbxoj6zVWhkCs2gQeKfD2+Q/xNK7SOrsQzi1q5igaHHZ6rSXtkg7C44XEK6wq3 jFfPgH8EufOtbDAaU/gU0osBDkYeqFMSvXv869DRAQOsGIzIYvxFIYFdGpx7OtB6ij bk50QXw6rV2MC0/HqyLr9aIyrQRJCaCoiTii94KZdE+fSEfUJMVPjIRVFEGIg+bJ2G sFveGHx3WWc5hbVZxENS+TuEV7wp+f6fBC7qkdhPLXE0DfSENDwMNMSfdtaNbo6anC pFwb9VxQYe0Mw== Received: by pali.im (Postfix) id 378762B6E; Tue, 20 Sep 2022 15:27:28 +0200 (CEST) From: =?UTF-8?q?Pali=20Roh=C3=A1r?= To: Liam Girdwood , Mark Brown , Andrew Lunn , Gregory Clement , Sebastian Hesselbarth , Marcin Wojtas Cc: alsa-devel@alsa-project.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH 1/5] ASoC: kirkwood: enable Kirkwood driver for Armada 38x platforms Date: Tue, 20 Sep 2022 15:26:44 +0200 Message-Id: <20220920132648.2008-2-pali@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20220920132648.2008-1-pali@kernel.org> References: <20220920132648.2008-1-pali@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org From: Marcin Wojtas The audio unit of Marvell Armada38x SoC is similar to the ones comprised by other Marvell SoCs (Kirkwood, Dove and Armada 370). Therefore KW audio driver can be used to support it and this commit adds new compatible string to identify Armada 38x variant. Two new memory regions are added: first one for PLL configuration and the second one for choosing one of audio I/O modes (I2S or S/PDIF). For the latter purpose a new optional DT property is added ('spdif-mode'). kirkwood-i2s driver is extended by adding a new init function for Armada 38x flavor and also a routine that enables PLL output (i.e. MCLK) configuration. Signed-off-by: Marcin Wojtas Tested-by: Star_Automation Reviewed-by: Nadav Haklai Reviewed-by: Lior Amsalem Tested-by: Lior Amsalem Signed-off-by: Hezi Shahmoon Reviewed-by: Neta Zur Hershkovits [pali: Fix support for pre-38x SoCs] Signed-off-by: Pali Rohár --- .../devicetree/bindings/sound/mvebu-audio.txt | 14 +- sound/soc/kirkwood/kirkwood-i2s.c | 136 +++++++++++++++++- sound/soc/kirkwood/kirkwood.h | 2 + 3 files changed, 149 insertions(+), 3 deletions(-) diff --git a/Documentation/devicetree/bindings/sound/mvebu-audio.txt b/Documentation/devicetree/bindings/sound/mvebu-audio.txt index cb8c07c81ce4..4f5dec5cb3c2 100644 --- a/Documentation/devicetree/bindings/sound/mvebu-audio.txt +++ b/Documentation/devicetree/bindings/sound/mvebu-audio.txt @@ -6,9 +6,14 @@ Required properties: "marvell,kirkwood-audio" for Kirkwood platforms "marvell,dove-audio" for Dove platforms "marvell,armada370-audio" for Armada 370 platforms + "marvell,armada-380-audio" for Armada 38x platforms - reg: physical base address of the controller and length of memory mapped - region. + region (named "i2s_regs"). + With "marvell,armada-380-audio" two other regions are required: + first of those is dedicated for Audio PLL Configuration registers + (named "pll_regs") and the second one ("soc_ctrl") - for register + where one of exceptive I/O types (I2S or S/PDIF) is set. - interrupts: with "marvell,kirkwood-audio", the audio interrupt @@ -23,6 +28,13 @@ Required properties: "internal" for the internal clock "extclk" for the external clock +Optional properties: + +- spdif-mode: + Enable S/PDIF mode on Armada 38x SoC. Using this property + disables standard I2S I/O. Valid only with "marvell,armada-380-audio" + compatible string. + Example: i2s1: audio-controller@b4000 { diff --git a/sound/soc/kirkwood/kirkwood-i2s.c b/sound/soc/kirkwood/kirkwood-i2s.c index 2a4ffe945177..ac387b5ca094 100644 --- a/sound/soc/kirkwood/kirkwood-i2s.c +++ b/sound/soc/kirkwood/kirkwood-i2s.c @@ -31,6 +31,122 @@ (SNDRV_PCM_FMTBIT_S16_LE | \ SNDRV_PCM_FMTBIT_S24_LE) +/* These registers are relative to the second register region - + * audio pll configuration. + */ +#define A38X_PLL_CONF_REG0 0x0 +#define A38X_PLL_FB_CLK_DIV_OFFSET 10 +#define A38X_PLL_FB_CLK_DIV_MASK 0x7fc00 +#define A38X_PLL_CONF_REG1 0x4 +#define A38X_PLL_FREQ_OFFSET_MASK 0xffff +#define A38X_PLL_FREQ_OFFSET_VALID BIT(16) +#define A38X_PLL_SW_RESET BIT(31) +#define A38X_PLL_CONF_REG2 0x8 +#define A38X_PLL_AUDIO_POSTDIV_MASK 0x7f + +/* Bit below belongs to SoC control register corresponding to the third + * register region. + */ +#define A38X_SPDIF_MODE_ENABLE BIT(27) + +static int armada_38x_i2s_init_quirk(struct platform_device *pdev, + struct kirkwood_dma_data *priv, + struct snd_soc_dai_driver *dai_drv) +{ + struct device_node *np = pdev->dev.of_node; + u32 reg_val; + int i; + + priv->pll_config = devm_platform_ioremap_resource_byname(pdev, "pll_regs"); + if (IS_ERR(priv->pll_config)) + return -ENOMEM; + + priv->soc_control = devm_platform_ioremap_resource_byname(pdev, "soc_ctrl"); + if (IS_ERR(priv->soc_control)) + return -ENOMEM; + + /* Select one of exceptive modes: I2S or S/PDIF */ + reg_val = readl(priv->soc_control); + if (of_property_read_bool(np, "spdif-mode")) { + reg_val |= A38X_SPDIF_MODE_ENABLE; + dev_info(&pdev->dev, "using S/PDIF mode\n"); + } else { + reg_val &= ~A38X_SPDIF_MODE_ENABLE; + dev_info(&pdev->dev, "using I2S mode\n"); + } + writel(reg_val, priv->soc_control); + + /* Update available rates of mclk's fs */ + for (i = 0; i < 2; i++) { + dai_drv[i].playback.rates |= SNDRV_PCM_RATE_192000; + dai_drv[i].capture.rates |= SNDRV_PCM_RATE_192000; + } + + return 0; +} + +static inline void armada_38x_set_pll(void __iomem *base, unsigned long rate) +{ + u32 reg_val; + u16 freq_offset = 0x22b0; + u8 audio_postdiv, fb_clk_div = 0x1d; + + /* Set frequency offset value to not valid and enable PLL reset */ + reg_val = readl(base + A38X_PLL_CONF_REG1); + reg_val &= ~A38X_PLL_FREQ_OFFSET_VALID; + reg_val &= ~A38X_PLL_SW_RESET; + writel(reg_val, base + A38X_PLL_CONF_REG1); + + udelay(1); + + /* Update PLL parameters */ + switch (rate) { + default: + case 44100: + freq_offset = 0x735; + fb_clk_div = 0x1b; + audio_postdiv = 0xc; + break; + case 48000: + audio_postdiv = 0xc; + break; + case 96000: + audio_postdiv = 0x6; + break; + case 192000: + audio_postdiv = 0x3; + break; + } + + reg_val = readl(base + A38X_PLL_CONF_REG0); + reg_val &= ~A38X_PLL_FB_CLK_DIV_MASK; + reg_val |= (fb_clk_div << A38X_PLL_FB_CLK_DIV_OFFSET); + writel(reg_val, base + A38X_PLL_CONF_REG0); + + reg_val = readl(base + A38X_PLL_CONF_REG2); + reg_val &= ~A38X_PLL_AUDIO_POSTDIV_MASK; + reg_val |= audio_postdiv; + writel(reg_val, base + A38X_PLL_CONF_REG2); + + reg_val = readl(base + A38X_PLL_CONF_REG1); + reg_val &= ~A38X_PLL_FREQ_OFFSET_MASK; + reg_val |= freq_offset; + writel(reg_val, base + A38X_PLL_CONF_REG1); + + udelay(1); + + /* Disable reset */ + reg_val |= A38X_PLL_SW_RESET; + writel(reg_val, base + A38X_PLL_CONF_REG1); + + /* Wait 50us for PLL to lock */ + udelay(50); + + /* Restore frequency offset value validity */ + reg_val |= A38X_PLL_FREQ_OFFSET_VALID; + writel(reg_val, base + A38X_PLL_CONF_REG1); +} + static int kirkwood_i2s_set_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt) { @@ -106,7 +222,10 @@ static void kirkwood_set_rate(struct snd_soc_dai *dai, * defined in kirkwood_i2s_dai */ dev_dbg(dai->dev, "%s: dco set rate = %lu\n", __func__, rate); - kirkwood_set_dco(priv->io, rate); + if (priv->pll_config) + armada_38x_set_pll(priv->pll_config, rate); + else + kirkwood_set_dco(priv->io, rate); clks_ctrl = KIRKWOOD_MCLK_SOURCE_DCO; } else { @@ -532,7 +651,10 @@ static int kirkwood_i2s_dev_probe(struct platform_device *pdev) dev_set_drvdata(&pdev->dev, priv); - priv->io = devm_platform_ioremap_resource(pdev, 0); + if (of_device_is_compatible(np, "marvell,armada-380-audio")) + priv->io = devm_platform_ioremap_resource_byname(pdev, "i2s_regs"); + else + priv->io = devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(priv->io)) return PTR_ERR(priv->io); @@ -540,6 +662,15 @@ static int kirkwood_i2s_dev_probe(struct platform_device *pdev) if (priv->irq < 0) return priv->irq; + if (of_device_is_compatible(np, "marvell,armada-380-audio")) { + err = armada_38x_i2s_init_quirk(pdev, priv, soc_dai); + /* Set initial pll frequency */ + if (priv->pll_config) + armada_38x_set_pll(priv->pll_config, 44100); + if (err < 0) + return err; + } + if (np) { priv->burst = 128; /* might be 32 or 128 */ } else if (data) { @@ -623,6 +754,7 @@ static const struct of_device_id mvebu_audio_of_match[] = { { .compatible = "marvell,kirkwood-audio" }, { .compatible = "marvell,dove-audio" }, { .compatible = "marvell,armada370-audio" }, + { .compatible = "marvell,armada-380-audio" }, { } }; MODULE_DEVICE_TABLE(of, mvebu_audio_of_match); diff --git a/sound/soc/kirkwood/kirkwood.h b/sound/soc/kirkwood/kirkwood.h index a1733a6aace5..79bb9aa7f086 100644 --- a/sound/soc/kirkwood/kirkwood.h +++ b/sound/soc/kirkwood/kirkwood.h @@ -131,6 +131,8 @@ struct kirkwood_dma_data { void __iomem *io; + void __iomem *pll_config; + void __iomem *soc_control; struct clk *clk; struct clk *extclk; uint32_t ctl_play; -- 2.20.1