From patchwork Tue Dec 20 14:55:24 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Code Kipper X-Patchwork-Id: 9481713 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id D67F960237 for ; Tue, 20 Dec 2016 15:43:56 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C12B626490 for ; Tue, 20 Dec 2016 15:43:56 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id B3A42283FF; Tue, 20 Dec 2016 15:43:56 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-1.3 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED,FREEMAIL_FROM,RCVD_IN_DNSWL_NONE,RCVD_IN_SORBS_SPAM, T_DKIM_INVALID autolearn=no version=3.3.1 Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id EAC2926490 for ; Tue, 20 Dec 2016 15:43:55 +0000 (UTC) Received: by alsa0.perex.cz (Postfix, from userid 1000) id 48063266F2B; Tue, 20 Dec 2016 16:43:54 +0100 (CET) Received: from alsa0.perex.cz (localhost [127.0.0.1]) by alsa0.perex.cz (Postfix) with ESMTP id 1B302266F3C; Tue, 20 Dec 2016 16:41:36 +0100 (CET) X-Original-To: alsa-devel@alsa-project.org Delivered-To: alsa-devel@alsa-project.org Received: by alsa0.perex.cz (Postfix, from userid 1000) id BB51B266EF2; Tue, 20 Dec 2016 15:55:28 +0100 (CET) Received: from mail-lf0-f67.google.com (mail-lf0-f67.google.com [209.85.215.67]) by alsa0.perex.cz (Postfix) with ESMTP id 0DD20266A34 for ; Tue, 20 Dec 2016 15:55:27 +0100 (CET) Received: by mail-lf0-f67.google.com with SMTP id 30so9174209lfy.1 for ; Tue, 20 Dec 2016 06:55:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=LSQ4AaDoOXxDqnFC+faCgs/JKO8OP6z+kBnS4p6nyP4=; b=PGuugs5ycYV9kURV18m3l3yXdeFkE/U568B8pIDK2nFasqsrmQXFc1y+hNEcBDb43s NZMyb0GRp5oQ22FKKcuMwxg+jXtNPO4LiWedO7tr796NCKdjNVbmyVBpilKSMSTFfUhk iQPWs7R7gJHlXEfXzgPB8t48G7NnfHQSHL6NpuQkydl+DduPuKahNj3/RE/OAVUTgL1Z 7kc22giCfjm+LcwqzlJnKWoLyjKRn+Xykhp15BTR9FER98soEfTX9zzrN/XlNFOjhsdM mtSmtB4fSfGMi1WwblhTEREl7pDMUzyRUMu4TLekrisQEPxmkSHxz5/PqsQSCciRZSEE v9Nw== 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; bh=LSQ4AaDoOXxDqnFC+faCgs/JKO8OP6z+kBnS4p6nyP4=; b=YRf+7IVjgfKDuuATqvvAKChdRdJTyQc1gjOA9wafeI2rnUFPScBatF1MU27tdUaLUj HSCJmCseorWJA9yXygu4zOHq1kmW7h9D1Q1LrA7dkyROCROI0B9t6Li8yqHJWc5Cd9Vl zJBLl8Hj9Kul+hYFgcUK5rxKlYTtX8X+HMRGS7GpiXWTWTpgEj2v4rW2mdhqQXE9Ha8C hpAMlLXZZVglAq01kWeaRc4fnGOOIzBLLB09gJ903oysFVTWX0JoJ+xz7lbjseVpOv/u 6Bh3HaFVXIwz/BDunkcMOMDGgIJQb0TZs7vI1IcpVL+449OTyeVaPYUH3Nq0fmYmkLmn qUYw== X-Gm-Message-State: AKaTC032iaLlPFY/yNmhnQn7mT96UcN/4qJGcxWsuHO6xeIfOlU06pClfdCEnC3nOo13TA== X-Received: by 10.25.141.147 with SMTP id p141mr7972341lfd.147.1482245726522; Tue, 20 Dec 2016 06:55:26 -0800 (PST) Received: from localhost.localdomain (c80-217-9-219.bredband.comhem.se. [80.217.9.219]) by smtp.gmail.com with ESMTPSA id f31sm4800517lfi.43.2016.12.20.06.55.25 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 20 Dec 2016 06:55:25 -0800 (PST) From: codekipper@gmail.com To: maxime.ripard@free-electrons.com Date: Tue, 20 Dec 2016 15:55:24 +0100 Message-Id: <20161220145524.31047-1-codekipper@gmail.com> X-Mailer: git-send-email 2.11.0 Cc: alsa-devel@alsa-project.org, Marcus Cooper , lgirdwood@gmail.com, linux-kernel@vger.kernel.org, be17068@iperbole.bo.it, linux-sunxi@googlegroups.com, broonie@kernel.org, linux-arm-kernel@lists.infradead.org Subject: [alsa-devel] [PATCH] ASoC: sun4i-i2s: Add quirks for newer SoCs X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.14 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: , MIME-Version: 1.0 Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org X-Virus-Scanned: ClamAV using ClamSMTP From: Marcus Cooper Newer SoCs have additional functionality so a quirks structure has been added to handle them. So far we've seen the use of a reset controller, a different address for the TXFIFO and varying register changes. This patch prepares the driver for these changes and adds the reset specifier. Signed-off-by: Marcus Cooper --- .../devicetree/bindings/sound/sun4i-i2s.txt | 2 + sound/soc/sunxi/sun4i-i2s.c | 47 ++++++++++++++++++++-- 2 files changed, 45 insertions(+), 4 deletions(-) diff --git a/Documentation/devicetree/bindings/sound/sun4i-i2s.txt b/Documentation/devicetree/bindings/sound/sun4i-i2s.txt index 7a2c0945fd22..494a881ccd21 100644 --- a/Documentation/devicetree/bindings/sound/sun4i-i2s.txt +++ b/Documentation/devicetree/bindings/sound/sun4i-i2s.txt @@ -18,6 +18,8 @@ Required properties: - "apb" : clock for the I2S bus interface - "mod" : module clock for the I2S controller - #sound-dai-cells : Must be equal to 0 +- resets: reset specifier for the ahb reset (A31 and newer only) + Example: diff --git a/sound/soc/sunxi/sun4i-i2s.c b/sound/soc/sunxi/sun4i-i2s.c index f24d19526603..80fe4f1d6e3b 100644 --- a/sound/soc/sunxi/sun4i-i2s.c +++ b/sound/soc/sunxi/sun4i-i2s.c @@ -14,9 +14,11 @@ #include #include #include +#include #include #include #include +#include #include #include @@ -92,6 +94,7 @@ struct sun4i_i2s { struct clk *bus_clk; struct clk *mod_clk; struct regmap *regmap; + struct reset_control *rst; unsigned int mclk_freq; @@ -104,6 +107,13 @@ struct sun4i_i2s_clk_div { u8 val; }; +struct sun4i_i2s_quirks { + unsigned int reg_dac_txdata; /* TX FIFO offset for DMA config */ + bool has_reset; + const struct regmap_config *sun4i_i2s_regmap; + const struct snd_soc_dai_ops *ops; +}; + static const struct sun4i_i2s_clk_div sun4i_i2s_bclk_div[] = { { .div = 2, .val = 0 }, { .div = 4, .val = 1 }, @@ -541,7 +551,6 @@ static struct snd_soc_dai_driver sun4i_i2s_dai = { .rates = SNDRV_PCM_RATE_8000_192000, .formats = SNDRV_PCM_FMTBIT_S16_LE, }, - .ops = &sun4i_i2s_dai_ops, .symmetric_rates = 1, }; @@ -655,6 +664,7 @@ static int sun4i_i2s_probe(struct platform_device *pdev) { struct sun4i_i2s *i2s; struct resource *res; + const struct sun4i_i2s_quirks *quirks; void __iomem *regs; int irq, ret; @@ -680,8 +690,14 @@ static int sun4i_i2s_probe(struct platform_device *pdev) return PTR_ERR(i2s->bus_clk); } + quirks = of_device_get_match_data(&pdev->dev); + if (quirks == NULL) { + dev_err(&pdev->dev, "Failed to determine the quirks to use\n"); + return -ENODEV; + } + i2s->regmap = devm_regmap_init_mmio(&pdev->dev, regs, - &sun4i_i2s_regmap_config); + quirks->sun4i_i2s_regmap); if (IS_ERR(i2s->regmap)) { dev_err(&pdev->dev, "Regmap initialisation failed\n"); return PTR_ERR(i2s->regmap); @@ -692,13 +708,25 @@ static int sun4i_i2s_probe(struct platform_device *pdev) dev_err(&pdev->dev, "Can't get our mod clock\n"); return PTR_ERR(i2s->mod_clk); } + - i2s->playback_dma_data.addr = res->start + SUN4I_I2S_FIFO_TX_REG; + i2s->playback_dma_data.addr = res->start + quirks->reg_dac_txdata; i2s->playback_dma_data.maxburst = 4; i2s->capture_dma_data.addr = res->start + SUN4I_I2S_FIFO_RX_REG; i2s->capture_dma_data.maxburst = 4; + if (quirks->has_reset) { + i2s->rst = devm_reset_control_get_optional(&pdev->dev, NULL); + if (IS_ERR(i2s->rst) && PTR_ERR(i2s->rst) == -EPROBE_DEFER) { + ret = -EPROBE_DEFER; + dev_err(&pdev->dev, "Failed to get reset: %d\n", ret); + goto err_pm_disable; + } + if (!IS_ERR(i2s->rst)) + reset_control_deassert(i2s->rst); + } + pm_runtime_enable(&pdev->dev); if (!pm_runtime_enabled(&pdev->dev)) { ret = sun4i_i2s_runtime_resume(&pdev->dev); @@ -706,6 +734,8 @@ static int sun4i_i2s_probe(struct platform_device *pdev) goto err_pm_disable; } + /* Register ops with dai */ + sun4i_i2s_dai.ops = quirks->ops; ret = devm_snd_soc_register_component(&pdev->dev, &sun4i_i2s_component, &sun4i_i2s_dai, 1); @@ -742,8 +772,17 @@ static int sun4i_i2s_remove(struct platform_device *pdev) return 0; } +static const struct sun4i_i2s_quirks sun4i_a10_i2s_quirks = { + .reg_dac_txdata = SUN4I_I2S_FIFO_TX_REG, + .sun4i_i2s_regmap = &sun4i_i2s_regmap_config, + .ops = &sun4i_i2s_dai_ops, +}; + static const struct of_device_id sun4i_i2s_match[] = { - { .compatible = "allwinner,sun4i-a10-i2s", }, + { + .compatible = "allwinner,sun4i-a10-i2s", + .data = &sun4i_a10_i2s_quirks, + }, {} }; MODULE_DEVICE_TABLE(of, sun4i_i2s_match);