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 X-Spam-Level: X-Spam-Status: No, score=-9.7 required=3.0 tests=BAYES_00,DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED,DKIM_VALID,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,UNWANTED_LANGUAGE_BODY,URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3AF75C43463 for ; Mon, 21 Sep 2020 10:31:47 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id A4FBC20684 for ; Mon, 21 Sep 2020 10:31:46 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=alsa-project.org header.i=@alsa-project.org header.b="pDPQNA83"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="SpnhgmVQ" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org A4FBC20684 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org 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 3481B1655; Mon, 21 Sep 2020 12:30:55 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 3481B1655 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1600684305; bh=lUj4XAUCUpyxfxtPcQW1mXWWKe3jFfL8px8IFe8gnu8=; h=From:To:Subject:Date:In-Reply-To:References:Cc:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=pDPQNA83yBIAe0AL26Xb4JXeQyhcVNZcVG9kh2kkNu3x6N0IiHSZ/QVCBFRr1fScn gTcuYGjuGNQYAnOSkz8g9UAQ29AP7xDS21nqespENr4zzsC+t358sMpt0ovYzvsUm5 uZVNaprnm0HmU63XruJP0AN9UrNZS62gemCNuCMs= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id BAC9DF80306; Mon, 21 Sep 2020 12:28:16 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 5D507F802FB; Mon, 21 Sep 2020 12:28:01 +0200 (CEST) Received: from mail-wm1-x343.google.com (mail-wm1-x343.google.com [IPv6:2a00:1450:4864:20::343]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 4BDF8F8020B for ; Mon, 21 Sep 2020 12:27:40 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 4BDF8F8020B Authentication-Results: alsa1.perex.cz; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="SpnhgmVQ" Received: by mail-wm1-x343.google.com with SMTP id a9so12064211wmm.2 for ; Mon, 21 Sep 2020 03:27:40 -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=OyfHIE0qAhOjNCFNxAQ6O7ihABXSVqgxqKsK1DQfOYg=; b=SpnhgmVQ3YuEeVP1MZAZb3RaFcHQANWGceOw4Gx7SjtpR+vY96upAlDjkwSW1ic1Co 9R1DUNbJo9uOLFpOGg8qxZxrsiGIa2AuDa4J0cclitjA/T8J8grIpytwVpPHPnwZKese pTFPi17mNGOtv/YYA4vcznaUsDniewkm++hz4+Cio+icnnz5EifrRvkxe/yxDTxL3TNI QboMxSHH0SrGRGTcfC+CAPSIFxxXE7jfAT59cvwSUUXJrmsqPzXDmaHRyjrdInObmIVK eDGEy6/jV3W6aEN/w0p6blNKfgXe4BLB6igfppFurCjCPAtmAqDXlzCVcwH8z5i+XVyP xjFQ== 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=OyfHIE0qAhOjNCFNxAQ6O7ihABXSVqgxqKsK1DQfOYg=; b=NsQWcIo+oZKF3Oh8tcp75WVVbbZ1Pn99buFTXZIlp9XlujGDsSJiaJmbRnkfiSxQyK xBtg4wP6TiADc34qv9AfYJSv3KP5isQKRhAz2yEdA9xuYgP7NZp2NsN4X8Rp25DXM1Ir ID8y9lB/uiVIVXnTkXIP2m0Hhb5rS6i9WaNhYvJ8cpaql9353sak7NySfsa153AXfw4s QLFUqxkMqAiNDQPG9HDd8KQ2e0lcqollJ8Cmaj2JgV+/sVUs1Ubh9zq2aKjZgAHehkZI 2pHVX5PEF7EdgNAQdIcSroFELM3KtDEYS9LJMSxLRe8eJySqKwfHqzPkpM1nz61HQ8Sc yBeA== X-Gm-Message-State: AOAM532WRx4Dfgc5mTJmQezmDmzMNwYfbWVX4URaar3Ut3ERMJA7SCfQ 3PSk4mcNpj1cEXWeGCHOjAk= X-Google-Smtp-Source: ABdhPJytjGcuJCJv5OPh6T5eXzujOFlBSET7Lws+b7iziqckGMjDAWAp8ZFP0YSDVZm2xR7+fbzOkg== X-Received: by 2002:a05:600c:2742:: with SMTP id 2mr28433689wmw.136.1600684056266; Mon, 21 Sep 2020 03:27:36 -0700 (PDT) Received: from localhost.localdomain (lputeaux-656-1-11-33.w82-127.abo.wanadoo.fr. [82.127.142.33]) by smtp.gmail.com with ESMTPSA id h2sm20713774wrp.69.2020.09.21.03.27.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 21 Sep 2020 03:27:35 -0700 (PDT) From: =?UTF-8?q?Cl=C3=A9ment=20P=C3=A9ron?= To: Maxime Ripard , Chen-Yu Tsai , Rob Herring , Mark Brown , Liam Girdwood Subject: [PATCH v4 01/22] ASoC: sun4i-i2s: Add support for H6 I2S Date: Mon, 21 Sep 2020 12:27:10 +0200 Message-Id: <20200921102731.747736-2-peron.clem@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200921102731.747736-1-peron.clem@gmail.com> References: <20200921102731.747736-1-peron.clem@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: devicetree@vger.kernel.org, Jernej Skrabec , alsa-devel@alsa-project.org, linux-kernel@vger.kernel.org, Takashi Iwai , Marcus Cooper , linux-sunxi@googlegroups.com, =?UTF-8?q?Cl=C3=A9ment=20P=C3=A9ron?= , 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: Jernej Skrabec H6 I2S is very similar to that in H3, except it supports up to 16 channels. Signed-off-by: Jernej Skrabec Signed-off-by: Marcus Cooper Signed-off-by: Clément Péron --- sound/soc/sunxi/sun4i-i2s.c | 224 ++++++++++++++++++++++++++++++++++++ 1 file changed, 224 insertions(+) diff --git a/sound/soc/sunxi/sun4i-i2s.c b/sound/soc/sunxi/sun4i-i2s.c index f23ff29e7c1d..2baf6c276280 100644 --- a/sound/soc/sunxi/sun4i-i2s.c +++ b/sound/soc/sunxi/sun4i-i2s.c @@ -124,6 +124,21 @@ #define SUN8I_I2S_RX_CHAN_SEL_REG 0x54 #define SUN8I_I2S_RX_CHAN_MAP_REG 0x58 +/* Defines required for sun50i-h6 support */ +#define SUN50I_H6_I2S_TX_CHAN_SEL_OFFSET_MASK GENMASK(21, 20) +#define SUN50I_H6_I2S_TX_CHAN_SEL_OFFSET(offset) ((offset) << 20) +#define SUN50I_H6_I2S_TX_CHAN_SEL_MASK GENMASK(19, 16) +#define SUN50I_H6_I2S_TX_CHAN_SEL(chan) ((chan - 1) << 16) +#define SUN50I_H6_I2S_TX_CHAN_EN_MASK GENMASK(15, 0) +#define SUN50I_H6_I2S_TX_CHAN_EN(num_chan) (((1 << num_chan) - 1)) + +#define SUN50I_H6_I2S_TX_CHAN_MAP0_REG 0x44 +#define SUN50I_H6_I2S_TX_CHAN_MAP1_REG 0x48 + +#define SUN50I_H6_I2S_RX_CHAN_SEL_REG 0x64 +#define SUN50I_H6_I2S_RX_CHAN_MAP0_REG 0x68 +#define SUN50I_H6_I2S_RX_CHAN_MAP1_REG 0x6C + struct sun4i_i2s; /** @@ -474,6 +489,62 @@ static int sun8i_i2s_set_chan_cfg(const struct sun4i_i2s *i2s, return 0; } +static int sun50i_h6_i2s_set_chan_cfg(const struct sun4i_i2s *i2s, + const struct snd_pcm_hw_params *params) +{ + unsigned int channels = params_channels(params); + unsigned int slots = channels; + unsigned int lrck_period; + + if (i2s->slots) + slots = i2s->slots; + + /* Map the channels for playback and capture */ + regmap_write(i2s->regmap, SUN50I_H6_I2S_TX_CHAN_MAP1_REG, 0x76543210); + regmap_write(i2s->regmap, SUN50I_H6_I2S_RX_CHAN_MAP1_REG, 0x76543210); + + /* Configure the channels */ + regmap_update_bits(i2s->regmap, SUN8I_I2S_TX_CHAN_SEL_REG, + SUN50I_H6_I2S_TX_CHAN_SEL_MASK, + SUN50I_H6_I2S_TX_CHAN_SEL(channels)); + regmap_update_bits(i2s->regmap, SUN50I_H6_I2S_RX_CHAN_SEL_REG, + SUN50I_H6_I2S_TX_CHAN_SEL_MASK, + SUN50I_H6_I2S_TX_CHAN_SEL(channels)); + + regmap_update_bits(i2s->regmap, SUN8I_I2S_CHAN_CFG_REG, + SUN8I_I2S_CHAN_CFG_TX_SLOT_NUM_MASK, + SUN8I_I2S_CHAN_CFG_TX_SLOT_NUM(channels)); + regmap_update_bits(i2s->regmap, SUN8I_I2S_CHAN_CFG_REG, + SUN8I_I2S_CHAN_CFG_RX_SLOT_NUM_MASK, + SUN8I_I2S_CHAN_CFG_RX_SLOT_NUM(channels)); + + switch (i2s->format & SND_SOC_DAIFMT_FORMAT_MASK) { + case SND_SOC_DAIFMT_DSP_A: + case SND_SOC_DAIFMT_DSP_B: + case SND_SOC_DAIFMT_LEFT_J: + case SND_SOC_DAIFMT_RIGHT_J: + lrck_period = params_physical_width(params) * slots; + break; + + case SND_SOC_DAIFMT_I2S: + lrck_period = params_physical_width(params); + break; + + default: + return -EINVAL; + } + + regmap_update_bits(i2s->regmap, SUN4I_I2S_FMT0_REG, + SUN8I_I2S_FMT0_LRCK_PERIOD_MASK, + SUN8I_I2S_FMT0_LRCK_PERIOD(lrck_period)); + + regmap_update_bits(i2s->regmap, SUN8I_I2S_TX_CHAN_SEL_REG, + SUN50I_H6_I2S_TX_CHAN_EN_MASK, + SUN50I_H6_I2S_TX_CHAN_EN(channels)); + + return 0; +} + static int sun4i_i2s_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) @@ -699,6 +770,108 @@ static int sun8i_i2s_set_soc_fmt(const struct sun4i_i2s *i2s, return 0; } +static int sun50i_h6_i2s_set_soc_fmt(const struct sun4i_i2s *i2s, + unsigned int fmt) +{ + u32 mode, val; + u8 offset; + + /* + * DAI clock polarity + * + * The setup for LRCK contradicts the datasheet, but under a + * scope it's clear that the LRCK polarity is reversed + * compared to the expected polarity on the bus. + */ + switch (fmt & SND_SOC_DAIFMT_INV_MASK) { + case SND_SOC_DAIFMT_IB_IF: + /* Invert both clocks */ + val = SUN8I_I2S_FMT0_BCLK_POLARITY_INVERTED; + break; + case SND_SOC_DAIFMT_IB_NF: + /* Invert bit clock */ + val = SUN8I_I2S_FMT0_BCLK_POLARITY_INVERTED | + SUN8I_I2S_FMT0_LRCLK_POLARITY_INVERTED; + break; + case SND_SOC_DAIFMT_NB_IF: + /* Invert frame clock */ + val = 0; + break; + case SND_SOC_DAIFMT_NB_NF: + val = SUN8I_I2S_FMT0_LRCLK_POLARITY_INVERTED; + break; + default: + return -EINVAL; + } + + regmap_update_bits(i2s->regmap, SUN4I_I2S_FMT0_REG, + SUN8I_I2S_FMT0_LRCLK_POLARITY_MASK | + SUN8I_I2S_FMT0_BCLK_POLARITY_MASK, + val); + + /* DAI Mode */ + switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { + case SND_SOC_DAIFMT_DSP_A: + mode = SUN8I_I2S_CTRL_MODE_PCM; + offset = 1; + break; + + case SND_SOC_DAIFMT_DSP_B: + mode = SUN8I_I2S_CTRL_MODE_PCM; + offset = 0; + break; + + case SND_SOC_DAIFMT_I2S: + mode = SUN8I_I2S_CTRL_MODE_LEFT; + offset = 1; + break; + + case SND_SOC_DAIFMT_LEFT_J: + mode = SUN8I_I2S_CTRL_MODE_LEFT; + offset = 0; + break; + + case SND_SOC_DAIFMT_RIGHT_J: + mode = SUN8I_I2S_CTRL_MODE_RIGHT; + offset = 0; + break; + + default: + return -EINVAL; + } + + regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG, + SUN8I_I2S_CTRL_MODE_MASK, mode); + regmap_update_bits(i2s->regmap, SUN8I_I2S_TX_CHAN_SEL_REG, + SUN50I_H6_I2S_TX_CHAN_SEL_OFFSET_MASK, + SUN50I_H6_I2S_TX_CHAN_SEL_OFFSET(offset)); + regmap_update_bits(i2s->regmap, SUN50I_H6_I2S_RX_CHAN_SEL_REG, + SUN50I_H6_I2S_TX_CHAN_SEL_OFFSET_MASK, + SUN50I_H6_I2S_TX_CHAN_SEL_OFFSET(offset)); + + /* DAI clock master masks */ + switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { + case SND_SOC_DAIFMT_CBS_CFS: + /* BCLK and LRCLK master */ + val = SUN8I_I2S_CTRL_BCLK_OUT | SUN8I_I2S_CTRL_LRCK_OUT; + break; + + case SND_SOC_DAIFMT_CBM_CFM: + /* BCLK and LRCLK slave */ + val = 0; + break; + + default: + return -EINVAL; + } + + regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG, + SUN8I_I2S_CTRL_BCLK_OUT | SUN8I_I2S_CTRL_LRCK_OUT, + val); + + return 0; +} + static int sun4i_i2s_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) { struct sun4i_i2s *i2s = snd_soc_dai_get_drvdata(dai); @@ -979,6 +1152,22 @@ static const struct reg_default sun8i_i2s_reg_defaults[] = { { SUN8I_I2S_RX_CHAN_MAP_REG, 0x00000000 }, }; +static const struct reg_default sun50i_h6_i2s_reg_defaults[] = { + { SUN4I_I2S_CTRL_REG, 0x00060000 }, + { SUN4I_I2S_FMT0_REG, 0x00000033 }, + { SUN4I_I2S_FMT1_REG, 0x00000030 }, + { SUN4I_I2S_FIFO_CTRL_REG, 0x000400f0 }, + { SUN4I_I2S_DMA_INT_CTRL_REG, 0x00000000 }, + { SUN4I_I2S_CLK_DIV_REG, 0x00000000 }, + { SUN8I_I2S_CHAN_CFG_REG, 0x00000000 }, + { SUN8I_I2S_TX_CHAN_SEL_REG, 0x00000000 }, + { SUN50I_H6_I2S_TX_CHAN_MAP0_REG, 0x00000000 }, + { SUN50I_H6_I2S_TX_CHAN_MAP1_REG, 0x00000000 }, + { SUN50I_H6_I2S_RX_CHAN_SEL_REG, 0x00000000 }, + { SUN50I_H6_I2S_RX_CHAN_MAP0_REG, 0x00000000 }, + { SUN50I_H6_I2S_RX_CHAN_MAP1_REG, 0x00000000 }, +}; + static const struct regmap_config sun4i_i2s_regmap_config = { .reg_bits = 32, .reg_stride = 4, @@ -1006,6 +1195,19 @@ static const struct regmap_config sun8i_i2s_regmap_config = { .volatile_reg = sun8i_i2s_volatile_reg, }; +static const struct regmap_config sun50i_h6_i2s_regmap_config = { + .reg_bits = 32, + .reg_stride = 4, + .val_bits = 32, + .max_register = SUN50I_H6_I2S_RX_CHAN_MAP1_REG, + .cache_type = REGCACHE_FLAT, + .reg_defaults = sun50i_h6_i2s_reg_defaults, + .num_reg_defaults = ARRAY_SIZE(sun50i_h6_i2s_reg_defaults), + .writeable_reg = sun4i_i2s_wr_reg, + .readable_reg = sun8i_i2s_rd_reg, + .volatile_reg = sun8i_i2s_volatile_reg, +}; + static int sun4i_i2s_runtime_resume(struct device *dev) { struct sun4i_i2s *i2s = dev_get_drvdata(dev); @@ -1164,6 +1366,24 @@ static const struct sun4i_i2s_quirks sun50i_a64_codec_i2s_quirks = { .set_fmt = sun4i_i2s_set_soc_fmt, }; +static const struct sun4i_i2s_quirks sun50i_h6_i2s_quirks = { + .has_reset = true, + .reg_offset_txdata = SUN8I_I2S_FIFO_TX_REG, + .sun4i_i2s_regmap = &sun50i_h6_i2s_regmap_config, + .field_clkdiv_mclk_en = REG_FIELD(SUN4I_I2S_CLK_DIV_REG, 8, 8), + .field_fmt_wss = REG_FIELD(SUN4I_I2S_FMT0_REG, 0, 2), + .field_fmt_sr = REG_FIELD(SUN4I_I2S_FMT0_REG, 4, 6), + .bclk_dividers = sun8i_i2s_clk_div, + .num_bclk_dividers = ARRAY_SIZE(sun8i_i2s_clk_div), + .mclk_dividers = sun8i_i2s_clk_div, + .num_mclk_dividers = ARRAY_SIZE(sun8i_i2s_clk_div), + .get_bclk_parent_rate = sun8i_i2s_get_bclk_parent_rate, + .get_sr = sun8i_i2s_get_sr_wss, + .get_wss = sun8i_i2s_get_sr_wss, + .set_chan_cfg = sun50i_h6_i2s_set_chan_cfg, + .set_fmt = sun50i_h6_i2s_set_soc_fmt, +}; + static int sun4i_i2s_init_regmap_fields(struct device *dev, struct sun4i_i2s *i2s) { @@ -1333,6 +1553,10 @@ static const struct of_device_id sun4i_i2s_match[] = { .compatible = "allwinner,sun50i-a64-codec-i2s", .data = &sun50i_a64_codec_i2s_quirks, }, + { + .compatible = "allwinner,sun50i-h6-i2s", + .data = &sun50i_h6_i2s_quirks, + }, {} }; MODULE_DEVICE_TABLE(of, sun4i_i2s_match); -- 2.25.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 X-Spam-Level: X-Spam-Status: No, score=-9.7 required=3.0 tests=BAYES_00,DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED,DKIM_VALID,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,UNWANTED_LANGUAGE_BODY,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A5E4CC43464 for ; Mon, 21 Sep 2020 10:29:42 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 5978F207BC for ; Mon, 21 Sep 2020 10:29:42 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="fssmXmDM"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="SpnhgmVQ" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 5978F207BC Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:Message-Id:Date: Subject:To:From:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=IQ4Q8kpEQ5axpi/X7CXBP4ANnOypds/QQuxf4N7mjHw=; b=fssmXmDMfkX6QcJ/4GS8JTxRL kMBxBsvoHeY3ZgyPH44335/zLXAKyDX09b3+59FxksDaSc/mgcNMOH5nGgR30PtFrHpRRaJw6pOug PGsjqES5klm88rrGK72893XsQMQpOSP90UX+hSeElw501umDuXRVF+PtJWxlRZZ5Qj5ScMusbe4rI x8I0iY7xpojl+fZs+n1hG5NJgzu7YAyttZu5H9umkIh1juv/FAxuAmDMDlbsrclCruDWK881YdPiL opM4OcwmYgdFg9LAedX+SY//d4lJltN8X0wHuTmSp5ukbUUeATxhNe1UoYUcB4J2Z4/7N6Vxy9Cbu CiukAF2Ew==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kKJ2v-0007h1-7T; Mon, 21 Sep 2020 10:27:45 +0000 Received: from mail-wm1-x342.google.com ([2a00:1450:4864:20::342]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kKJ2n-0007dy-To for linux-arm-kernel@lists.infradead.org; Mon, 21 Sep 2020 10:27:38 +0000 Received: by mail-wm1-x342.google.com with SMTP id l15so11163825wmh.1 for ; Mon, 21 Sep 2020 03:27:37 -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=OyfHIE0qAhOjNCFNxAQ6O7ihABXSVqgxqKsK1DQfOYg=; b=SpnhgmVQ3YuEeVP1MZAZb3RaFcHQANWGceOw4Gx7SjtpR+vY96upAlDjkwSW1ic1Co 9R1DUNbJo9uOLFpOGg8qxZxrsiGIa2AuDa4J0cclitjA/T8J8grIpytwVpPHPnwZKese pTFPi17mNGOtv/YYA4vcznaUsDniewkm++hz4+Cio+icnnz5EifrRvkxe/yxDTxL3TNI QboMxSHH0SrGRGTcfC+CAPSIFxxXE7jfAT59cvwSUUXJrmsqPzXDmaHRyjrdInObmIVK eDGEy6/jV3W6aEN/w0p6blNKfgXe4BLB6igfppFurCjCPAtmAqDXlzCVcwH8z5i+XVyP xjFQ== 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=OyfHIE0qAhOjNCFNxAQ6O7ihABXSVqgxqKsK1DQfOYg=; b=AbsC9Fq3cuJeVXOPyYogBWtqXJx7p31fh10pgPLSB/ULUMPSd/yyhqtSyiuLWFH2ws 6cITnqPrT2v4QPyg+U7tSoLnDjsxB75+1JdHdIo5kfBZLTB7btCD8P0f27HDAk6hgCrz 5VjnmraUTg70ZiUe55oanabi1N6/7zinvgGooLhye7MnZpZ4Xr4VGO/d95u42Cp1sXK+ OwMIhc4k3/WucTC395xynSKSOyomTUuttg3/DBK3TaPSgO7A5rFWZNG+lIo0GmBf5+fB C1ZPYGnL6IfO/jB2CFAyHKlcGRF46tvhrotMAuNeMAoI+l+CUheCzbVMi2XVELwy7Y92 5Tpw== X-Gm-Message-State: AOAM5302Bix73xg4GhOhqm3Zs9dDMF2rD1XKQaadMZLvdJYzjlCCortT D5MS+ZG5Xc2ugx7JI2AEuQM= X-Google-Smtp-Source: ABdhPJytjGcuJCJv5OPh6T5eXzujOFlBSET7Lws+b7iziqckGMjDAWAp8ZFP0YSDVZm2xR7+fbzOkg== X-Received: by 2002:a05:600c:2742:: with SMTP id 2mr28433689wmw.136.1600684056266; Mon, 21 Sep 2020 03:27:36 -0700 (PDT) Received: from localhost.localdomain (lputeaux-656-1-11-33.w82-127.abo.wanadoo.fr. [82.127.142.33]) by smtp.gmail.com with ESMTPSA id h2sm20713774wrp.69.2020.09.21.03.27.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 21 Sep 2020 03:27:35 -0700 (PDT) From: =?UTF-8?q?Cl=C3=A9ment=20P=C3=A9ron?= To: Maxime Ripard , Chen-Yu Tsai , Rob Herring , Mark Brown , Liam Girdwood Subject: [PATCH v4 01/22] ASoC: sun4i-i2s: Add support for H6 I2S Date: Mon, 21 Sep 2020 12:27:10 +0200 Message-Id: <20200921102731.747736-2-peron.clem@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200921102731.747736-1-peron.clem@gmail.com> References: <20200921102731.747736-1-peron.clem@gmail.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200921_062737_973624_E1CC13D2 X-CRM114-Status: GOOD ( 22.52 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: devicetree@vger.kernel.org, Jernej Skrabec , alsa-devel@alsa-project.org, linux-kernel@vger.kernel.org, Takashi Iwai , Jaroslav Kysela , Marcus Cooper , linux-sunxi@googlegroups.com, =?UTF-8?q?Cl=C3=A9ment=20P=C3=A9ron?= , linux-arm-kernel@lists.infradead.org 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 RnJvbTogSmVybmVqIFNrcmFiZWMgPGplcm5lai5za3JhYmVjQHNpb2wubmV0PgoKSDYgSTJTIGlz IHZlcnkgc2ltaWxhciB0byB0aGF0IGluIEgzLCBleGNlcHQgaXQgc3VwcG9ydHMgdXAgdG8gMTYK Y2hhbm5lbHMuCgpTaWduZWQtb2ZmLWJ5OiBKZXJuZWogU2tyYWJlYyA8amVybmVqLnNrcmFiZWNA c2lvbC5uZXQ+ClNpZ25lZC1vZmYtYnk6IE1hcmN1cyBDb29wZXIgPGNvZGVraXBwZXJAZ21haWwu Y29tPgpTaWduZWQtb2ZmLWJ5OiBDbMOpbWVudCBQw6lyb24gPHBlcm9uLmNsZW1AZ21haWwuY29t PgotLS0KIHNvdW5kL3NvYy9zdW54aS9zdW40aS1pMnMuYyB8IDIyNCArKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysKIDEgZmlsZSBjaGFuZ2VkLCAyMjQgaW5zZXJ0aW9ucygrKQoK ZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zdW54aS9zdW40aS1pMnMuYyBiL3NvdW5kL3NvYy9zdW54 aS9zdW40aS1pMnMuYwppbmRleCBmMjNmZjI5ZTdjMWQuLjJiYWY2YzI3NjI4MCAxMDA2NDQKLS0t IGEvc291bmQvc29jL3N1bnhpL3N1bjRpLWkycy5jCisrKyBiL3NvdW5kL3NvYy9zdW54aS9zdW40 aS1pMnMuYwpAQCAtMTI0LDYgKzEyNCwyMSBAQAogI2RlZmluZSBTVU44SV9JMlNfUlhfQ0hBTl9T RUxfUkVHCTB4NTQKICNkZWZpbmUgU1VOOElfSTJTX1JYX0NIQU5fTUFQX1JFRwkweDU4CiAKKy8q IERlZmluZXMgcmVxdWlyZWQgZm9yIHN1bjUwaS1oNiBzdXBwb3J0ICovCisjZGVmaW5lIFNVTjUw SV9INl9JMlNfVFhfQ0hBTl9TRUxfT0ZGU0VUX01BU0sJR0VOTUFTSygyMSwgMjApCisjZGVmaW5l IFNVTjUwSV9INl9JMlNfVFhfQ0hBTl9TRUxfT0ZGU0VUKG9mZnNldCkJKChvZmZzZXQpIDw8IDIw KQorI2RlZmluZSBTVU41MElfSDZfSTJTX1RYX0NIQU5fU0VMX01BU0sJCUdFTk1BU0soMTksIDE2 KQorI2RlZmluZSBTVU41MElfSDZfSTJTX1RYX0NIQU5fU0VMKGNoYW4pCQkoKGNoYW4gLSAxKSA8 PCAxNikKKyNkZWZpbmUgU1VONTBJX0g2X0kyU19UWF9DSEFOX0VOX01BU0sJCUdFTk1BU0soMTUs IDApCisjZGVmaW5lIFNVTjUwSV9INl9JMlNfVFhfQ0hBTl9FTihudW1fY2hhbikJKCgoMSA8PCBu dW1fY2hhbikgLSAxKSkKKworI2RlZmluZSBTVU41MElfSDZfSTJTX1RYX0NIQU5fTUFQMF9SRUcJ MHg0NAorI2RlZmluZSBTVU41MElfSDZfSTJTX1RYX0NIQU5fTUFQMV9SRUcJMHg0OAorCisjZGVm aW5lIFNVTjUwSV9INl9JMlNfUlhfQ0hBTl9TRUxfUkVHCTB4NjQKKyNkZWZpbmUgU1VONTBJX0g2 X0kyU19SWF9DSEFOX01BUDBfUkVHCTB4NjgKKyNkZWZpbmUgU1VONTBJX0g2X0kyU19SWF9DSEFO X01BUDFfUkVHCTB4NkMKKwogc3RydWN0IHN1bjRpX2kyczsKIAogLyoqCkBAIC00NzQsNiArNDg5 LDYyIEBAIHN0YXRpYyBpbnQgc3VuOGlfaTJzX3NldF9jaGFuX2NmZyhjb25zdCBzdHJ1Y3Qgc3Vu NGlfaTJzICppMnMsCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgc3VuNTBpX2g2X2kyc19z ZXRfY2hhbl9jZmcoY29uc3Qgc3RydWN0IHN1bjRpX2kycyAqaTJzLAorCQkJCSAgICAgIGNvbnN0 IHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXVuc2lnbmVkIGludCBjaGFu bmVscyA9IHBhcmFtc19jaGFubmVscyhwYXJhbXMpOworCXVuc2lnbmVkIGludCBzbG90cyA9IGNo YW5uZWxzOworCXVuc2lnbmVkIGludCBscmNrX3BlcmlvZDsKKworCWlmIChpMnMtPnNsb3RzKQor CQlzbG90cyA9IGkycy0+c2xvdHM7CisKKwkvKiBNYXAgdGhlIGNoYW5uZWxzIGZvciBwbGF5YmFj ayBhbmQgY2FwdHVyZSAqLworCXJlZ21hcF93cml0ZShpMnMtPnJlZ21hcCwgU1VONTBJX0g2X0ky U19UWF9DSEFOX01BUDFfUkVHLCAweDc2NTQzMjEwKTsKKwlyZWdtYXBfd3JpdGUoaTJzLT5yZWdt YXAsIFNVTjUwSV9INl9JMlNfUlhfQ0hBTl9NQVAxX1JFRywgMHg3NjU0MzIxMCk7CisKKwkvKiBD b25maWd1cmUgdGhlIGNoYW5uZWxzICovCisJcmVnbWFwX3VwZGF0ZV9iaXRzKGkycy0+cmVnbWFw LCBTVU44SV9JMlNfVFhfQ0hBTl9TRUxfUkVHLAorCQkJICAgU1VONTBJX0g2X0kyU19UWF9DSEFO X1NFTF9NQVNLLAorCQkJICAgU1VONTBJX0g2X0kyU19UWF9DSEFOX1NFTChjaGFubmVscykpOwor CXJlZ21hcF91cGRhdGVfYml0cyhpMnMtPnJlZ21hcCwgU1VONTBJX0g2X0kyU19SWF9DSEFOX1NF TF9SRUcsCisJCQkgICBTVU41MElfSDZfSTJTX1RYX0NIQU5fU0VMX01BU0ssCisJCQkgICBTVU41 MElfSDZfSTJTX1RYX0NIQU5fU0VMKGNoYW5uZWxzKSk7CisKKwlyZWdtYXBfdXBkYXRlX2JpdHMo aTJzLT5yZWdtYXAsIFNVTjhJX0kyU19DSEFOX0NGR19SRUcsCisJCQkgICBTVU44SV9JMlNfQ0hB Tl9DRkdfVFhfU0xPVF9OVU1fTUFTSywKKwkJCSAgIFNVTjhJX0kyU19DSEFOX0NGR19UWF9TTE9U X05VTShjaGFubmVscykpOworCXJlZ21hcF91cGRhdGVfYml0cyhpMnMtPnJlZ21hcCwgU1VOOElf STJTX0NIQU5fQ0ZHX1JFRywKKwkJCSAgIFNVTjhJX0kyU19DSEFOX0NGR19SWF9TTE9UX05VTV9N QVNLLAorCQkJICAgU1VOOElfSTJTX0NIQU5fQ0ZHX1JYX1NMT1RfTlVNKGNoYW5uZWxzKSk7CisK Kwlzd2l0Y2ggKGkycy0+Zm9ybWF0ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0spIHsKKwlj YXNlIFNORF9TT0NfREFJRk1UX0RTUF9BOgorCWNhc2UgU05EX1NPQ19EQUlGTVRfRFNQX0I6CisJ Y2FzZSBTTkRfU09DX0RBSUZNVF9MRUZUX0o6CisJY2FzZSBTTkRfU09DX0RBSUZNVF9SSUdIVF9K OgorCQlscmNrX3BlcmlvZCA9IHBhcmFtc19waHlzaWNhbF93aWR0aChwYXJhbXMpICogc2xvdHM7 CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0RBSUZNVF9JMlM6CisJCWxyY2tfcGVyaW9kID0g cGFyYW1zX3BoeXNpY2FsX3dpZHRoKHBhcmFtcyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJ cmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmVnbWFwX3VwZGF0ZV9iaXRzKGkycy0+cmVnbWFwLCBT VU40SV9JMlNfRk1UMF9SRUcsCisJCQkgICBTVU44SV9JMlNfRk1UMF9MUkNLX1BFUklPRF9NQVNL LAorCQkJICAgU1VOOElfSTJTX0ZNVDBfTFJDS19QRVJJT0QobHJja19wZXJpb2QpKTsKKworCXJl Z21hcF91cGRhdGVfYml0cyhpMnMtPnJlZ21hcCwgU1VOOElfSTJTX1RYX0NIQU5fU0VMX1JFRywK KwkJCSAgIFNVTjUwSV9INl9JMlNfVFhfQ0hBTl9FTl9NQVNLLAorCQkJICAgU1VONTBJX0g2X0ky U19UWF9DSEFOX0VOKGNoYW5uZWxzKSk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBz dW40aV9pMnNfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAog CQkJICAgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAogCQkJICAgICAgIHN0 cnVjdCBzbmRfc29jX2RhaSAqZGFpKQpAQCAtNjk5LDYgKzc3MCwxMDggQEAgc3RhdGljIGludCBz dW44aV9pMnNfc2V0X3NvY19mbXQoY29uc3Qgc3RydWN0IHN1bjRpX2kycyAqaTJzLAogCXJldHVy biAwOwogfQogCitzdGF0aWMgaW50IHN1bjUwaV9oNl9pMnNfc2V0X3NvY19mbXQoY29uc3Qgc3Ry dWN0IHN1bjRpX2kycyAqaTJzLAorCQkJCSAgICAgdW5zaWduZWQgaW50IGZtdCkKK3sKKwl1MzIg bW9kZSwgdmFsOworCXU4IG9mZnNldDsKKworCS8qCisJICogREFJIGNsb2NrIHBvbGFyaXR5CisJ ICoKKwkgKiBUaGUgc2V0dXAgZm9yIExSQ0sgY29udHJhZGljdHMgdGhlIGRhdGFzaGVldCwgYnV0 IHVuZGVyIGEKKwkgKiBzY29wZSBpdCdzIGNsZWFyIHRoYXQgdGhlIExSQ0sgcG9sYXJpdHkgaXMg cmV2ZXJzZWQKKwkgKiBjb21wYXJlZCB0byB0aGUgZXhwZWN0ZWQgcG9sYXJpdHkgb24gdGhlIGJ1 cy4KKwkgKi8KKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX0lOVl9NQVNLKSB7CisJY2Fz ZSBTTkRfU09DX0RBSUZNVF9JQl9JRjoKKwkJLyogSW52ZXJ0IGJvdGggY2xvY2tzICovCisJCXZh bCA9IFNVTjhJX0kyU19GTVQwX0JDTEtfUE9MQVJJVFlfSU5WRVJURUQ7CisJCWJyZWFrOworCWNh c2UgU05EX1NPQ19EQUlGTVRfSUJfTkY6CisJCS8qIEludmVydCBiaXQgY2xvY2sgKi8KKwkJdmFs ID0gU1VOOElfSTJTX0ZNVDBfQkNMS19QT0xBUklUWV9JTlZFUlRFRCB8CisJCSAgICAgIFNVTjhJ X0kyU19GTVQwX0xSQ0xLX1BPTEFSSVRZX0lOVkVSVEVEOworCQlicmVhazsKKwljYXNlIFNORF9T T0NfREFJRk1UX05CX0lGOgorCQkvKiBJbnZlcnQgZnJhbWUgY2xvY2sgKi8KKwkJdmFsID0gMDsK KwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9OQl9ORjoKKwkJdmFsID0gU1VOOElfSTJT X0ZNVDBfTFJDTEtfUE9MQVJJVFlfSU5WRVJURUQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJl dHVybiAtRUlOVkFMOworCX0KKworCXJlZ21hcF91cGRhdGVfYml0cyhpMnMtPnJlZ21hcCwgU1VO NElfSTJTX0ZNVDBfUkVHLAorCQkJICAgU1VOOElfSTJTX0ZNVDBfTFJDTEtfUE9MQVJJVFlfTUFT SyB8CisJCQkgICBTVU44SV9JMlNfRk1UMF9CQ0xLX1BPTEFSSVRZX01BU0ssCisJCQkgICB2YWwp OworCisJLyogREFJIE1vZGUgKi8KKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX0ZPUk1B VF9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9EU1BfQToKKwkJbW9kZSA9IFNVTjhJX0ky U19DVFJMX01PREVfUENNOworCQlvZmZzZXQgPSAxOworCQlicmVhazsKKworCWNhc2UgU05EX1NP Q19EQUlGTVRfRFNQX0I6CisJCW1vZGUgPSBTVU44SV9JMlNfQ1RSTF9NT0RFX1BDTTsKKwkJb2Zm c2V0ID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFNORF9TT0NfREFJRk1UX0kyUzoKKwkJbW9kZSA9 IFNVTjhJX0kyU19DVFJMX01PREVfTEVGVDsKKwkJb2Zmc2V0ID0gMTsKKwkJYnJlYWs7CisKKwlj YXNlIFNORF9TT0NfREFJRk1UX0xFRlRfSjoKKwkJbW9kZSA9IFNVTjhJX0kyU19DVFJMX01PREVf TEVGVDsKKwkJb2Zmc2V0ID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFNORF9TT0NfREFJRk1UX1JJ R0hUX0o6CisJCW1vZGUgPSBTVU44SV9JMlNfQ1RSTF9NT0RFX1JJR0hUOworCQlvZmZzZXQgPSAw OworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJlZ21h cF91cGRhdGVfYml0cyhpMnMtPnJlZ21hcCwgU1VONElfSTJTX0NUUkxfUkVHLAorCQkJICAgU1VO OElfSTJTX0NUUkxfTU9ERV9NQVNLLCBtb2RlKTsKKwlyZWdtYXBfdXBkYXRlX2JpdHMoaTJzLT5y ZWdtYXAsIFNVTjhJX0kyU19UWF9DSEFOX1NFTF9SRUcsCisJCQkgICBTVU41MElfSDZfSTJTX1RY X0NIQU5fU0VMX09GRlNFVF9NQVNLLAorCQkJICAgU1VONTBJX0g2X0kyU19UWF9DSEFOX1NFTF9P RkZTRVQob2Zmc2V0KSk7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKGkycy0+cmVnbWFwLCBTVU41MElf SDZfSTJTX1JYX0NIQU5fU0VMX1JFRywKKwkJCSAgIFNVTjUwSV9INl9JMlNfVFhfQ0hBTl9TRUxf T0ZGU0VUX01BU0ssCisJCQkgICBTVU41MElfSDZfSTJTX1RYX0NIQU5fU0VMX09GRlNFVChvZmZz ZXQpKTsKKworCS8qIERBSSBjbG9jayBtYXN0ZXIgbWFza3MgKi8KKwlzd2l0Y2ggKGZtdCAmIFNO RF9TT0NfREFJRk1UX01BU1RFUl9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZT OgorCQkvKiBCQ0xLIGFuZCBMUkNMSyBtYXN0ZXIgKi8KKwkJdmFsID0gU1VOOElfSTJTX0NUUkxf QkNMS19PVVQgfAlTVU44SV9JMlNfQ1RSTF9MUkNLX09VVDsKKwkJYnJlYWs7CisKKwljYXNlIFNO RF9TT0NfREFJRk1UX0NCTV9DRk06CisJCS8qIEJDTEsgYW5kIExSQ0xLIHNsYXZlICovCisJCXZh bCA9IDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJ cmVnbWFwX3VwZGF0ZV9iaXRzKGkycy0+cmVnbWFwLCBTVU40SV9JMlNfQ1RSTF9SRUcsCisJCQkg ICBTVU44SV9JMlNfQ1RSTF9CQ0xLX09VVCB8IFNVTjhJX0kyU19DVFJMX0xSQ0tfT1VULAorCQkJ ICAgdmFsKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHN1bjRpX2kyc19zZXRfZm10 KHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCB1bnNpZ25lZCBpbnQgZm10KQogewogCXN0cnVjdCBz dW40aV9pMnMgKmkycyA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7CkBAIC05NzksNiAr MTE1MiwyMiBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19kZWZhdWx0IHN1bjhpX2kyc19yZWdf ZGVmYXVsdHNbXSA9IHsKIAl7IFNVTjhJX0kyU19SWF9DSEFOX01BUF9SRUcsIDB4MDAwMDAwMDAg fSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX2RlZmF1bHQgc3VuNTBpX2g2X2kyc19y ZWdfZGVmYXVsdHNbXSA9IHsKKwl7IFNVTjRJX0kyU19DVFJMX1JFRywgMHgwMDA2MDAwMCB9LAor CXsgU1VONElfSTJTX0ZNVDBfUkVHLCAweDAwMDAwMDMzIH0sCisJeyBTVU40SV9JMlNfRk1UMV9S RUcsIDB4MDAwMDAwMzAgfSwKKwl7IFNVTjRJX0kyU19GSUZPX0NUUkxfUkVHLCAweDAwMDQwMGYw IH0sCisJeyBTVU40SV9JMlNfRE1BX0lOVF9DVFJMX1JFRywgMHgwMDAwMDAwMCB9LAorCXsgU1VO NElfSTJTX0NMS19ESVZfUkVHLCAweDAwMDAwMDAwIH0sCisJeyBTVU44SV9JMlNfQ0hBTl9DRkdf UkVHLCAweDAwMDAwMDAwIH0sCisJeyBTVU44SV9JMlNfVFhfQ0hBTl9TRUxfUkVHLCAweDAwMDAw MDAwIH0sCisJeyBTVU41MElfSDZfSTJTX1RYX0NIQU5fTUFQMF9SRUcsIDB4MDAwMDAwMDAgfSwK Kwl7IFNVTjUwSV9INl9JMlNfVFhfQ0hBTl9NQVAxX1JFRywgMHgwMDAwMDAwMCB9LAorCXsgU1VO NTBJX0g2X0kyU19SWF9DSEFOX1NFTF9SRUcsIDB4MDAwMDAwMDAgfSwKKwl7IFNVTjUwSV9INl9J MlNfUlhfQ0hBTl9NQVAwX1JFRywgMHgwMDAwMDAwMCB9LAorCXsgU1VONTBJX0g2X0kyU19SWF9D SEFOX01BUDFfUkVHLCAweDAwMDAwMDAwIH0sCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJl Z21hcF9jb25maWcgc3VuNGlfaTJzX3JlZ21hcF9jb25maWcgPSB7CiAJLnJlZ19iaXRzCT0gMzIs CiAJLnJlZ19zdHJpZGUJPSA0LApAQCAtMTAwNiw2ICsxMTk1LDE5IEBAIHN0YXRpYyBjb25zdCBz dHJ1Y3QgcmVnbWFwX2NvbmZpZyBzdW44aV9pMnNfcmVnbWFwX2NvbmZpZyA9IHsKIAkudm9sYXRp bGVfcmVnCT0gc3VuOGlfaTJzX3ZvbGF0aWxlX3JlZywKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1 Y3QgcmVnbWFwX2NvbmZpZyBzdW41MGlfaDZfaTJzX3JlZ21hcF9jb25maWcgPSB7CisJLnJlZ19i aXRzCT0gMzIsCisJLnJlZ19zdHJpZGUJPSA0LAorCS52YWxfYml0cwk9IDMyLAorCS5tYXhfcmVn aXN0ZXIJPSBTVU41MElfSDZfSTJTX1JYX0NIQU5fTUFQMV9SRUcsCisJLmNhY2hlX3R5cGUJPSBS RUdDQUNIRV9GTEFULAorCS5yZWdfZGVmYXVsdHMJPSBzdW41MGlfaDZfaTJzX3JlZ19kZWZhdWx0 cywKKwkubnVtX3JlZ19kZWZhdWx0cwk9IEFSUkFZX1NJWkUoc3VuNTBpX2g2X2kyc19yZWdfZGVm YXVsdHMpLAorCS53cml0ZWFibGVfcmVnCT0gc3VuNGlfaTJzX3dyX3JlZywKKwkucmVhZGFibGVf cmVnCT0gc3VuOGlfaTJzX3JkX3JlZywKKwkudm9sYXRpbGVfcmVnCT0gc3VuOGlfaTJzX3ZvbGF0 aWxlX3JlZywKK307CisKIHN0YXRpYyBpbnQgc3VuNGlfaTJzX3J1bnRpbWVfcmVzdW1lKHN0cnVj dCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3Qgc3VuNGlfaTJzICppMnMgPSBkZXZfZ2V0X2RydmRh dGEoZGV2KTsKQEAgLTExNjQsNiArMTM2NiwyNCBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IHN1bjRp X2kyc19xdWlya3Mgc3VuNTBpX2E2NF9jb2RlY19pMnNfcXVpcmtzID0gewogCS5zZXRfZm10CQk9 IHN1bjRpX2kyc19zZXRfc29jX2ZtdCwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VuNGlf aTJzX3F1aXJrcyBzdW41MGlfaDZfaTJzX3F1aXJrcyA9IHsKKwkuaGFzX3Jlc2V0CQk9IHRydWUs CisJLnJlZ19vZmZzZXRfdHhkYXRhCT0gU1VOOElfSTJTX0ZJRk9fVFhfUkVHLAorCS5zdW40aV9p MnNfcmVnbWFwCT0gJnN1bjUwaV9oNl9pMnNfcmVnbWFwX2NvbmZpZywKKwkuZmllbGRfY2xrZGl2 X21jbGtfZW4JPSBSRUdfRklFTEQoU1VONElfSTJTX0NMS19ESVZfUkVHLCA4LCA4KSwKKwkuZmll bGRfZm10X3dzcwkJPSBSRUdfRklFTEQoU1VONElfSTJTX0ZNVDBfUkVHLCAwLCAyKSwKKwkuZmll bGRfZm10X3NyCQk9IFJFR19GSUVMRChTVU40SV9JMlNfRk1UMF9SRUcsIDQsIDYpLAorCS5iY2xr X2RpdmlkZXJzCQk9IHN1bjhpX2kyc19jbGtfZGl2LAorCS5udW1fYmNsa19kaXZpZGVycwk9IEFS UkFZX1NJWkUoc3VuOGlfaTJzX2Nsa19kaXYpLAorCS5tY2xrX2RpdmlkZXJzCQk9IHN1bjhpX2ky c19jbGtfZGl2LAorCS5udW1fbWNsa19kaXZpZGVycwk9IEFSUkFZX1NJWkUoc3VuOGlfaTJzX2Ns a19kaXYpLAorCS5nZXRfYmNsa19wYXJlbnRfcmF0ZQk9IHN1bjhpX2kyc19nZXRfYmNsa19wYXJl bnRfcmF0ZSwKKwkuZ2V0X3NyCQkJPSBzdW44aV9pMnNfZ2V0X3NyX3dzcywKKwkuZ2V0X3dzcwkJ PSBzdW44aV9pMnNfZ2V0X3NyX3dzcywKKwkuc2V0X2NoYW5fY2ZnCQk9IHN1bjUwaV9oNl9pMnNf c2V0X2NoYW5fY2ZnLAorCS5zZXRfZm10CQk9IHN1bjUwaV9oNl9pMnNfc2V0X3NvY19mbXQsCit9 OworCiBzdGF0aWMgaW50IHN1bjRpX2kyc19pbml0X3JlZ21hcF9maWVsZHMoc3RydWN0IGRldmlj ZSAqZGV2LAogCQkJCQlzdHJ1Y3Qgc3VuNGlfaTJzICppMnMpCiB7CkBAIC0xMzMzLDYgKzE1NTMs MTAgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3VuNGlfaTJzX21hdGNoW10g PSB7CiAJCS5jb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW41MGktYTY0LWNvZGVjLWkycyIsCiAJ CS5kYXRhID0gJnN1bjUwaV9hNjRfY29kZWNfaTJzX3F1aXJrcywKIAl9LAorCXsKKwkJLmNvbXBh dGlibGUgPSAiYWxsd2lubmVyLHN1bjUwaS1oNi1pMnMiLAorCQkuZGF0YSA9ICZzdW41MGlfaDZf aTJzX3F1aXJrcywKKwl9LAogCXt9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc3VuNGlf aTJzX21hdGNoKTsKLS0gCjIuMjUuMQoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1r ZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWls bWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK 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 X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,UNWANTED_LANGUAGE_BODY,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 842FAC43465 for ; Mon, 21 Sep 2020 10:27:43 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 375F921D43 for ; Mon, 21 Sep 2020 10:27:43 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="SpnhgmVQ" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726623AbgIUK1m (ORCPT ); Mon, 21 Sep 2020 06:27:42 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60224 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726479AbgIUK1i (ORCPT ); Mon, 21 Sep 2020 06:27:38 -0400 Received: from mail-wm1-x341.google.com (mail-wm1-x341.google.com [IPv6:2a00:1450:4864:20::341]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C669BC061755; Mon, 21 Sep 2020 03:27:37 -0700 (PDT) Received: by mail-wm1-x341.google.com with SMTP id e11so11176295wme.0; Mon, 21 Sep 2020 03:27:37 -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=OyfHIE0qAhOjNCFNxAQ6O7ihABXSVqgxqKsK1DQfOYg=; b=SpnhgmVQ3YuEeVP1MZAZb3RaFcHQANWGceOw4Gx7SjtpR+vY96upAlDjkwSW1ic1Co 9R1DUNbJo9uOLFpOGg8qxZxrsiGIa2AuDa4J0cclitjA/T8J8grIpytwVpPHPnwZKese pTFPi17mNGOtv/YYA4vcznaUsDniewkm++hz4+Cio+icnnz5EifrRvkxe/yxDTxL3TNI QboMxSHH0SrGRGTcfC+CAPSIFxxXE7jfAT59cvwSUUXJrmsqPzXDmaHRyjrdInObmIVK eDGEy6/jV3W6aEN/w0p6blNKfgXe4BLB6igfppFurCjCPAtmAqDXlzCVcwH8z5i+XVyP xjFQ== 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=OyfHIE0qAhOjNCFNxAQ6O7ihABXSVqgxqKsK1DQfOYg=; b=Uyfb13MbUHEclEnqONMpaEL01+kOeJzNa0xVyFcToMLsSCVjWlqSMvhgtsQCwcnW2B XhoqL33c/U45JWfbwXLNCwXaFWsuoxJ5vg/iVgjH1gtnd9dYOHkJJeVIvzIhFohk5Sor A0DUWzeHXGd7c7WHsOodYkMRt+sRwbX+qnxkEZ2lnBqo2paqcFiu6Vg47U4lvqO5xEXI O+Q6n6YC2WY6vp/xwzTpD9MZfmFhPRjZmGz5mD1iiQjd8VfUD3f5k/QpUO+bfmLwCTuv GX+oe9BfRWDSHibR3nIRpSfC1ZWSF3vwG9LBx2b1C4RZIgaxL/iSxBY0nM/JpkrbFVXo tz8g== X-Gm-Message-State: AOAM532K44eYs2l7JQ3RVvuhEHPlpVdsf6APtNQ2kkhXOkJHpzpI9fm1 TE29EEbeytxqtrv0oasYPL8= X-Google-Smtp-Source: ABdhPJytjGcuJCJv5OPh6T5eXzujOFlBSET7Lws+b7iziqckGMjDAWAp8ZFP0YSDVZm2xR7+fbzOkg== X-Received: by 2002:a05:600c:2742:: with SMTP id 2mr28433689wmw.136.1600684056266; Mon, 21 Sep 2020 03:27:36 -0700 (PDT) Received: from localhost.localdomain (lputeaux-656-1-11-33.w82-127.abo.wanadoo.fr. [82.127.142.33]) by smtp.gmail.com with ESMTPSA id h2sm20713774wrp.69.2020.09.21.03.27.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 21 Sep 2020 03:27:35 -0700 (PDT) From: =?UTF-8?q?Cl=C3=A9ment=20P=C3=A9ron?= To: Maxime Ripard , Chen-Yu Tsai , Rob Herring , Mark Brown , Liam Girdwood Cc: Jaroslav Kysela , Takashi Iwai , Marcus Cooper , Jernej Skrabec , alsa-devel@alsa-project.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-sunxi@googlegroups.com, =?UTF-8?q?Cl=C3=A9ment=20P=C3=A9ron?= Subject: [PATCH v4 01/22] ASoC: sun4i-i2s: Add support for H6 I2S Date: Mon, 21 Sep 2020 12:27:10 +0200 Message-Id: <20200921102731.747736-2-peron.clem@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200921102731.747736-1-peron.clem@gmail.com> References: <20200921102731.747736-1-peron.clem@gmail.com> 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: Jernej Skrabec H6 I2S is very similar to that in H3, except it supports up to 16 channels. Signed-off-by: Jernej Skrabec Signed-off-by: Marcus Cooper Signed-off-by: Clément Péron --- sound/soc/sunxi/sun4i-i2s.c | 224 ++++++++++++++++++++++++++++++++++++ 1 file changed, 224 insertions(+) diff --git a/sound/soc/sunxi/sun4i-i2s.c b/sound/soc/sunxi/sun4i-i2s.c index f23ff29e7c1d..2baf6c276280 100644 --- a/sound/soc/sunxi/sun4i-i2s.c +++ b/sound/soc/sunxi/sun4i-i2s.c @@ -124,6 +124,21 @@ #define SUN8I_I2S_RX_CHAN_SEL_REG 0x54 #define SUN8I_I2S_RX_CHAN_MAP_REG 0x58 +/* Defines required for sun50i-h6 support */ +#define SUN50I_H6_I2S_TX_CHAN_SEL_OFFSET_MASK GENMASK(21, 20) +#define SUN50I_H6_I2S_TX_CHAN_SEL_OFFSET(offset) ((offset) << 20) +#define SUN50I_H6_I2S_TX_CHAN_SEL_MASK GENMASK(19, 16) +#define SUN50I_H6_I2S_TX_CHAN_SEL(chan) ((chan - 1) << 16) +#define SUN50I_H6_I2S_TX_CHAN_EN_MASK GENMASK(15, 0) +#define SUN50I_H6_I2S_TX_CHAN_EN(num_chan) (((1 << num_chan) - 1)) + +#define SUN50I_H6_I2S_TX_CHAN_MAP0_REG 0x44 +#define SUN50I_H6_I2S_TX_CHAN_MAP1_REG 0x48 + +#define SUN50I_H6_I2S_RX_CHAN_SEL_REG 0x64 +#define SUN50I_H6_I2S_RX_CHAN_MAP0_REG 0x68 +#define SUN50I_H6_I2S_RX_CHAN_MAP1_REG 0x6C + struct sun4i_i2s; /** @@ -474,6 +489,62 @@ static int sun8i_i2s_set_chan_cfg(const struct sun4i_i2s *i2s, return 0; } +static int sun50i_h6_i2s_set_chan_cfg(const struct sun4i_i2s *i2s, + const struct snd_pcm_hw_params *params) +{ + unsigned int channels = params_channels(params); + unsigned int slots = channels; + unsigned int lrck_period; + + if (i2s->slots) + slots = i2s->slots; + + /* Map the channels for playback and capture */ + regmap_write(i2s->regmap, SUN50I_H6_I2S_TX_CHAN_MAP1_REG, 0x76543210); + regmap_write(i2s->regmap, SUN50I_H6_I2S_RX_CHAN_MAP1_REG, 0x76543210); + + /* Configure the channels */ + regmap_update_bits(i2s->regmap, SUN8I_I2S_TX_CHAN_SEL_REG, + SUN50I_H6_I2S_TX_CHAN_SEL_MASK, + SUN50I_H6_I2S_TX_CHAN_SEL(channels)); + regmap_update_bits(i2s->regmap, SUN50I_H6_I2S_RX_CHAN_SEL_REG, + SUN50I_H6_I2S_TX_CHAN_SEL_MASK, + SUN50I_H6_I2S_TX_CHAN_SEL(channels)); + + regmap_update_bits(i2s->regmap, SUN8I_I2S_CHAN_CFG_REG, + SUN8I_I2S_CHAN_CFG_TX_SLOT_NUM_MASK, + SUN8I_I2S_CHAN_CFG_TX_SLOT_NUM(channels)); + regmap_update_bits(i2s->regmap, SUN8I_I2S_CHAN_CFG_REG, + SUN8I_I2S_CHAN_CFG_RX_SLOT_NUM_MASK, + SUN8I_I2S_CHAN_CFG_RX_SLOT_NUM(channels)); + + switch (i2s->format & SND_SOC_DAIFMT_FORMAT_MASK) { + case SND_SOC_DAIFMT_DSP_A: + case SND_SOC_DAIFMT_DSP_B: + case SND_SOC_DAIFMT_LEFT_J: + case SND_SOC_DAIFMT_RIGHT_J: + lrck_period = params_physical_width(params) * slots; + break; + + case SND_SOC_DAIFMT_I2S: + lrck_period = params_physical_width(params); + break; + + default: + return -EINVAL; + } + + regmap_update_bits(i2s->regmap, SUN4I_I2S_FMT0_REG, + SUN8I_I2S_FMT0_LRCK_PERIOD_MASK, + SUN8I_I2S_FMT0_LRCK_PERIOD(lrck_period)); + + regmap_update_bits(i2s->regmap, SUN8I_I2S_TX_CHAN_SEL_REG, + SUN50I_H6_I2S_TX_CHAN_EN_MASK, + SUN50I_H6_I2S_TX_CHAN_EN(channels)); + + return 0; +} + static int sun4i_i2s_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) @@ -699,6 +770,108 @@ static int sun8i_i2s_set_soc_fmt(const struct sun4i_i2s *i2s, return 0; } +static int sun50i_h6_i2s_set_soc_fmt(const struct sun4i_i2s *i2s, + unsigned int fmt) +{ + u32 mode, val; + u8 offset; + + /* + * DAI clock polarity + * + * The setup for LRCK contradicts the datasheet, but under a + * scope it's clear that the LRCK polarity is reversed + * compared to the expected polarity on the bus. + */ + switch (fmt & SND_SOC_DAIFMT_INV_MASK) { + case SND_SOC_DAIFMT_IB_IF: + /* Invert both clocks */ + val = SUN8I_I2S_FMT0_BCLK_POLARITY_INVERTED; + break; + case SND_SOC_DAIFMT_IB_NF: + /* Invert bit clock */ + val = SUN8I_I2S_FMT0_BCLK_POLARITY_INVERTED | + SUN8I_I2S_FMT0_LRCLK_POLARITY_INVERTED; + break; + case SND_SOC_DAIFMT_NB_IF: + /* Invert frame clock */ + val = 0; + break; + case SND_SOC_DAIFMT_NB_NF: + val = SUN8I_I2S_FMT0_LRCLK_POLARITY_INVERTED; + break; + default: + return -EINVAL; + } + + regmap_update_bits(i2s->regmap, SUN4I_I2S_FMT0_REG, + SUN8I_I2S_FMT0_LRCLK_POLARITY_MASK | + SUN8I_I2S_FMT0_BCLK_POLARITY_MASK, + val); + + /* DAI Mode */ + switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { + case SND_SOC_DAIFMT_DSP_A: + mode = SUN8I_I2S_CTRL_MODE_PCM; + offset = 1; + break; + + case SND_SOC_DAIFMT_DSP_B: + mode = SUN8I_I2S_CTRL_MODE_PCM; + offset = 0; + break; + + case SND_SOC_DAIFMT_I2S: + mode = SUN8I_I2S_CTRL_MODE_LEFT; + offset = 1; + break; + + case SND_SOC_DAIFMT_LEFT_J: + mode = SUN8I_I2S_CTRL_MODE_LEFT; + offset = 0; + break; + + case SND_SOC_DAIFMT_RIGHT_J: + mode = SUN8I_I2S_CTRL_MODE_RIGHT; + offset = 0; + break; + + default: + return -EINVAL; + } + + regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG, + SUN8I_I2S_CTRL_MODE_MASK, mode); + regmap_update_bits(i2s->regmap, SUN8I_I2S_TX_CHAN_SEL_REG, + SUN50I_H6_I2S_TX_CHAN_SEL_OFFSET_MASK, + SUN50I_H6_I2S_TX_CHAN_SEL_OFFSET(offset)); + regmap_update_bits(i2s->regmap, SUN50I_H6_I2S_RX_CHAN_SEL_REG, + SUN50I_H6_I2S_TX_CHAN_SEL_OFFSET_MASK, + SUN50I_H6_I2S_TX_CHAN_SEL_OFFSET(offset)); + + /* DAI clock master masks */ + switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { + case SND_SOC_DAIFMT_CBS_CFS: + /* BCLK and LRCLK master */ + val = SUN8I_I2S_CTRL_BCLK_OUT | SUN8I_I2S_CTRL_LRCK_OUT; + break; + + case SND_SOC_DAIFMT_CBM_CFM: + /* BCLK and LRCLK slave */ + val = 0; + break; + + default: + return -EINVAL; + } + + regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG, + SUN8I_I2S_CTRL_BCLK_OUT | SUN8I_I2S_CTRL_LRCK_OUT, + val); + + return 0; +} + static int sun4i_i2s_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) { struct sun4i_i2s *i2s = snd_soc_dai_get_drvdata(dai); @@ -979,6 +1152,22 @@ static const struct reg_default sun8i_i2s_reg_defaults[] = { { SUN8I_I2S_RX_CHAN_MAP_REG, 0x00000000 }, }; +static const struct reg_default sun50i_h6_i2s_reg_defaults[] = { + { SUN4I_I2S_CTRL_REG, 0x00060000 }, + { SUN4I_I2S_FMT0_REG, 0x00000033 }, + { SUN4I_I2S_FMT1_REG, 0x00000030 }, + { SUN4I_I2S_FIFO_CTRL_REG, 0x000400f0 }, + { SUN4I_I2S_DMA_INT_CTRL_REG, 0x00000000 }, + { SUN4I_I2S_CLK_DIV_REG, 0x00000000 }, + { SUN8I_I2S_CHAN_CFG_REG, 0x00000000 }, + { SUN8I_I2S_TX_CHAN_SEL_REG, 0x00000000 }, + { SUN50I_H6_I2S_TX_CHAN_MAP0_REG, 0x00000000 }, + { SUN50I_H6_I2S_TX_CHAN_MAP1_REG, 0x00000000 }, + { SUN50I_H6_I2S_RX_CHAN_SEL_REG, 0x00000000 }, + { SUN50I_H6_I2S_RX_CHAN_MAP0_REG, 0x00000000 }, + { SUN50I_H6_I2S_RX_CHAN_MAP1_REG, 0x00000000 }, +}; + static const struct regmap_config sun4i_i2s_regmap_config = { .reg_bits = 32, .reg_stride = 4, @@ -1006,6 +1195,19 @@ static const struct regmap_config sun8i_i2s_regmap_config = { .volatile_reg = sun8i_i2s_volatile_reg, }; +static const struct regmap_config sun50i_h6_i2s_regmap_config = { + .reg_bits = 32, + .reg_stride = 4, + .val_bits = 32, + .max_register = SUN50I_H6_I2S_RX_CHAN_MAP1_REG, + .cache_type = REGCACHE_FLAT, + .reg_defaults = sun50i_h6_i2s_reg_defaults, + .num_reg_defaults = ARRAY_SIZE(sun50i_h6_i2s_reg_defaults), + .writeable_reg = sun4i_i2s_wr_reg, + .readable_reg = sun8i_i2s_rd_reg, + .volatile_reg = sun8i_i2s_volatile_reg, +}; + static int sun4i_i2s_runtime_resume(struct device *dev) { struct sun4i_i2s *i2s = dev_get_drvdata(dev); @@ -1164,6 +1366,24 @@ static const struct sun4i_i2s_quirks sun50i_a64_codec_i2s_quirks = { .set_fmt = sun4i_i2s_set_soc_fmt, }; +static const struct sun4i_i2s_quirks sun50i_h6_i2s_quirks = { + .has_reset = true, + .reg_offset_txdata = SUN8I_I2S_FIFO_TX_REG, + .sun4i_i2s_regmap = &sun50i_h6_i2s_regmap_config, + .field_clkdiv_mclk_en = REG_FIELD(SUN4I_I2S_CLK_DIV_REG, 8, 8), + .field_fmt_wss = REG_FIELD(SUN4I_I2S_FMT0_REG, 0, 2), + .field_fmt_sr = REG_FIELD(SUN4I_I2S_FMT0_REG, 4, 6), + .bclk_dividers = sun8i_i2s_clk_div, + .num_bclk_dividers = ARRAY_SIZE(sun8i_i2s_clk_div), + .mclk_dividers = sun8i_i2s_clk_div, + .num_mclk_dividers = ARRAY_SIZE(sun8i_i2s_clk_div), + .get_bclk_parent_rate = sun8i_i2s_get_bclk_parent_rate, + .get_sr = sun8i_i2s_get_sr_wss, + .get_wss = sun8i_i2s_get_sr_wss, + .set_chan_cfg = sun50i_h6_i2s_set_chan_cfg, + .set_fmt = sun50i_h6_i2s_set_soc_fmt, +}; + static int sun4i_i2s_init_regmap_fields(struct device *dev, struct sun4i_i2s *i2s) { @@ -1333,6 +1553,10 @@ static const struct of_device_id sun4i_i2s_match[] = { .compatible = "allwinner,sun50i-a64-codec-i2s", .data = &sun50i_a64_codec_i2s_quirks, }, + { + .compatible = "allwinner,sun50i-h6-i2s", + .data = &sun50i_h6_i2s_quirks, + }, {} }; MODULE_DEVICE_TABLE(of, sun4i_i2s_match); -- 2.25.1