Merge series "ASoC: tidyup snd_soc_of_parse_daifmt()" from Kuninori Morimoto <kuninor...
authorMark Brown <broonie@kernel.org>
Mon, 21 Jun 2021 18:16:53 +0000 (19:16 +0100)
committerMark Brown <broonie@kernel.org>
Mon, 21 Jun 2021 18:16:53 +0000 (19:16 +0100)
Hi Mark

These are v3 of parsing for daifmt.

I want to add new audio-graph-card2 sound card driver,
and this is last part of necessary soc-core cleanup for it.

Current some drivers are using DT, and then,
snd_soc_of_parse_daifmt() parses daifmt, but bitclock/frame provider
parsing part is one of headache, because we are assuming below both cases.

A) node {
bitclock-master;
frame-master;
...
};

B) link {
bitclock-master = <&xxx>;
frame-master = <&xxx>;
...
};

The original was style A), and style B) was added later.

snd_soc_of_parse_daifmt() parses A) style as original style,
and user need to update to B) style for clock_provider part if needed.

To handle it more flexibile, this patch-set adds new functions
which separates snd_soc_of_parse_daifmt() helper function.

snd_soc_daifmt_parse_format() : format part
snd_soc_daifmt_parse_clock_provider_as_flag() : clock part for style A)
snd_soc_daifmt_parse_clock_provider_as_phandl() : clock part for style B)
snd_soc_daifmt_parse_clock_provider_as_bitmap() : clock part use with _from_bitmap

v1 -> v2
- tidyup parse_clock_provider functions to _as_flag/phandle/bitmap()
- don't exchange code style on each drivers.

v2 -> v3
- use daifmt as much as possible (don't use daiclk) on each driver.

Link: https://lore.kernel.org/r/875yypdxlm.wl-kuninori.morimoto.gx@renesas.com
Link: https://lore.kernel.org/r/87czsvdc4o.wl-kuninori.morimoto.gx@renesas.com
Kuninori Morimoto (8):
  ASoC: soc-core: add snd_soc_daifmt_clock_provider_from_bitmap()
  ASoC: soc-core: add snd_soc_daifmt_clock_provider_fliped()
  ASoC: soc-core: add snd_soc_daifmt_parse_format/clock_provider()
  ASoC: atmel: switch to use snd_soc_daifmt_parse_format/clock_provider()
  ASoC: fsl: switch to use snd_soc_daifmt_parse_format/clock_provider()
  ASoC: meson: switch to use snd_soc_daifmt_parse_format/clock_provider()
  ASoC: simple-card-utils: switch to use snd_soc_daifmt_parse_format/clock_provider()
  ASoC: soc-core: remove snd_soc_of_parse_daifmt()

 include/sound/soc.h                   |  21 ++++-
 sound/soc/atmel/mikroe-proto.c        |   9 ++-
 sound/soc/fsl/fsl-asoc-card.c         |   7 +-
 sound/soc/generic/simple-card-utils.c |  16 ++--
 sound/soc/meson/meson-card-utils.c    |   6 +-
 sound/soc/soc-core.c                  | 109 +++++++++++++++++---------
 6 files changed, 106 insertions(+), 62 deletions(-)

--
2.25.1

14 files changed:
sound/soc/codecs/rt711-sdw.h
sound/soc/codecs/rt711.c
sound/soc/codecs/rt711.h
sound/soc/fsl/fsl_xcvr.c
sound/soc/qcom/apq8016_sbc.c
sound/soc/qcom/lpass-cpu.c
sound/soc/samsung/i2s.c
sound/soc/samsung/pcm.c
sound/soc/samsung/s3c2412-i2s.c
sound/soc/samsung/s3c24xx-i2s.c
sound/soc/sunxi/sun4i-codec.c
sound/soc/sunxi/sun4i-i2s.c
sound/soc/sunxi/sun4i-spdif.c
sound/soc/tegra/tegra_asoc_machine.c

index 43b2b984b29cb9bd79037d4efd0cdf2155958708..6acf9858330d78c95c862f80ef37b0347a93ae6c 100644 (file)
@@ -267,7 +267,9 @@ static const struct reg_default rt711_reg_defaults[] = {
        { 0x8393, 0x00 },
        { 0x7319, 0x00 },
        { 0x8399, 0x00 },
+       { 0x752008, 0xa807 },
        { 0x752009, 0x1029 },
+       { 0x75200b, 0x7770 },
        { 0x752011, 0x007a },
        { 0x75201a, 0x8003 },
        { 0x752045, 0x5289 },
index 9f5b2dc16c54f96352be787ca7bb2f69e59708b5..abaf150cc08710bfef3c8273796c6087660c187b 100644 (file)
@@ -389,6 +389,36 @@ static void rt711_jack_init(struct rt711_priv *rt711)
                                RT711_HP_JD_FINAL_RESULT_CTL_JD12,
                                RT711_HP_JD_FINAL_RESULT_CTL_JD12);
                        break;
+               case RT711_JD2_100K:
+                       rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG,
+                               RT711_JD_CTL2, RT711_JD2_2PORT_100K_DECODE | RT711_JD2_1PORT_TYPE_DECODE |
+                               RT711_HP_JD_SEL_JD2 | RT711_JD1_2PORT_TYPE_100K_DECODE,
+                               RT711_JD2_2PORT_100K_DECODE_HP | RT711_JD2_1PORT_JD_HP |
+                               RT711_HP_JD_SEL_JD2 | RT711_JD1_2PORT_JD_RESERVED);
+                       rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG,
+                               RT711_CC_DET1,
+                               RT711_HP_JD_FINAL_RESULT_CTL_JD12,
+                               RT711_HP_JD_FINAL_RESULT_CTL_JD12);
+                       break;
+               case RT711_JD2_1P8V_1PORT:
+                       rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG,
+                               RT711_JD_CTL1, RT711_JD2_DIGITAL_JD_MODE_SEL,
+                               RT711_JD2_1_JD_MODE);
+                       rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG,
+                               RT711_JD_CTL2, RT711_JD2_1PORT_TYPE_DECODE |
+                               RT711_HP_JD_SEL_JD2,
+                               RT711_JD2_1PORT_JD_HP |
+                               RT711_HP_JD_SEL_JD2);
+                       rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG,
+                               RT711_JD_CTL4, RT711_JD2_PAD_PULL_UP_MASK |
+                               RT711_JD2_MODE_SEL_MASK,
+                               RT711_JD2_PAD_PULL_UP |
+                               RT711_JD2_MODE2_1P8V_1PORT);
+                       rt711_index_update_bits(rt711->regmap, RT711_VENDOR_REG,
+                               RT711_CC_DET1,
+                               RT711_HP_JD_FINAL_RESULT_CTL_JD12,
+                               RT711_HP_JD_FINAL_RESULT_CTL_JD12);
+                       break;
                default:
                        dev_warn(rt711->component->dev, "Wrong JD source\n");
                        break;
index ca0f581feec78285b696e14700739257b728559c..5f2ba1341085f581da0815a50fd9166ad011776c 100644 (file)
@@ -52,7 +52,9 @@ struct sdw_stream_data {
 
 /* Index (NID:20h) */
 #define RT711_DAC_DC_CALI_CTL1                         0x00
+#define RT711_JD_CTL1                          0x08
 #define RT711_JD_CTL2                          0x09
+#define RT711_JD_CTL4                          0x0b
 #define RT711_CC_DET1                          0x11
 #define RT711_PARA_VERB_CTL                            0x1a
 #define RT711_COMBO_JACK_AUTO_CTL1                             0x45
@@ -171,10 +173,33 @@ struct sdw_stream_data {
 /* DAC DC offset calibration control-1 (0x00)(NID:20h) */
 #define RT711_DAC_DC_CALI_TRIGGER (0x1 << 15)
 
+/* jack detect control 1 (0x08)(NID:20h) */
+#define RT711_JD2_DIGITAL_JD_MODE_SEL (0x1 << 1)
+#define RT711_JD2_1_JD_MODE (0x0 << 1)
+#define RT711_JD2_2_JD_MODE (0x1 << 1)
+
 /* jack detect control 2 (0x09)(NID:20h) */
 #define RT711_JD2_2PORT_200K_DECODE_HP (0x1 << 13)
+#define RT711_JD2_2PORT_100K_DECODE (0x1 << 12)
+#define RT711_JD2_2PORT_100K_DECODE_HP (0x0 << 12)
 #define RT711_HP_JD_SEL_JD1 (0x0 << 1)
 #define RT711_HP_JD_SEL_JD2 (0x1 << 1)
+#define RT711_JD2_1PORT_TYPE_DECODE (0x3 << 10)
+#define RT711_JD2_1PORT_JD_LINE2 (0x0 << 10)
+#define RT711_JD2_1PORT_JD_HP (0x1 << 10)
+#define RT711_JD2_1PORT_JD_LINE1 (0x2 << 10)
+#define RT711_JD1_2PORT_TYPE_100K_DECODE (0x1 << 0)
+#define RT711_JD1_2PORT_JD_RESERVED (0x0 << 0)
+#define RT711_JD1_2PORT_JD_LINE1 (0x1 << 0)
+
+/* jack detect control 4 (0x0b)(NID:20h) */
+#define RT711_JD2_PAD_PULL_UP_MASK (0x1 << 3)
+#define RT711_JD2_PAD_NOT_PULL_UP (0x0 << 3)
+#define RT711_JD2_PAD_PULL_UP (0x1 << 3)
+#define RT711_JD2_MODE_SEL_MASK (0x3 << 0)
+#define RT711_JD2_MODE0_2PORT (0x0 << 0)
+#define RT711_JD2_MODE1_3P3V_1PORT (0x1 << 0)
+#define RT711_JD2_MODE2_1P8V_1PORT (0x2 << 0)
 
 /* CC DET1 (0x11)(NID:20h) */
 #define RT711_HP_JD_FINAL_RESULT_CTL_JD12 (0x1 << 10)
@@ -215,7 +240,9 @@ enum {
 enum rt711_jd_src {
        RT711_JD_NULL,
        RT711_JD1,
-       RT711_JD2
+       RT711_JD2,
+       RT711_JD2_100K,
+       RT711_JD2_1P8V_1PORT
 };
 
 int rt711_io_init(struct device *dev, struct sdw_slave *slave);
index df7c189d97ddd673f7894ee82e7655c8a6041078..92dd99258edf9824c1fe7f81f18e3fe08ca3fd4b 100644 (file)
@@ -1233,6 +1233,16 @@ static __maybe_unused int fsl_xcvr_runtime_suspend(struct device *dev)
        struct fsl_xcvr *xcvr = dev_get_drvdata(dev);
        int ret;
 
+       /*
+        * Clear interrupts, when streams starts or resumes after
+        * suspend, interrupts are enabled in prepare(), so no need
+        * to enable interrupts in resume().
+        */
+       ret = regmap_update_bits(xcvr->regmap, FSL_XCVR_EXT_IER0,
+                                FSL_XCVR_IRQ_EARC_ALL, 0);
+       if (ret < 0)
+               dev_err(dev, "Failed to clear IER0: %d\n", ret);
+
        /* Assert M0+ reset */
        ret = regmap_update_bits(xcvr->regmap, FSL_XCVR_EXT_CTRL,
                                 FSL_XCVR_EXT_CTRL_CORE_RESET,
index 270986b2f1025cfbb857ab55ab8bd01907f6d80f..08a05f0ecad7e375b28fca0b546bcd24eb06d39f 100644 (file)
@@ -134,7 +134,6 @@ static int apq8016_sbc_platform_probe(struct platform_device *pdev)
        struct device *dev = &pdev->dev;
        struct snd_soc_card *card;
        struct apq8016_sbc_data *data;
-       struct resource *res;
        int ret;
 
        data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
@@ -151,13 +150,11 @@ static int apq8016_sbc_platform_probe(struct platform_device *pdev)
        if (ret)
                return ret;
 
-       res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mic-iomux");
-       data->mic_iomux = devm_ioremap_resource(dev, res);
+       data->mic_iomux = devm_platform_ioremap_resource_byname(pdev, "mic-iomux");
        if (IS_ERR(data->mic_iomux))
                return PTR_ERR(data->mic_iomux);
 
-       res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "spkr-iomux");
-       data->spkr_iomux = devm_ioremap_resource(dev, res);
+       data->spkr_iomux = devm_platform_ioremap_resource_byname(pdev, "spkr-iomux");
        if (IS_ERR(data->spkr_iomux))
                return PTR_ERR(data->spkr_iomux);
 
index 98f93240fb2aa5c091eb0b69eacc02b2f3fd1b42..2d52e9ee44fceca67b8ab8f6bd8b9f41a27bf500 100644 (file)
@@ -788,7 +788,6 @@ int asoc_qcom_lpass_cpu_platform_probe(struct platform_device *pdev)
 {
        struct lpass_data *drvdata;
        struct device_node *dsp_of_node;
-       struct resource *res;
        struct lpass_variant *variant;
        struct device *dev = &pdev->dev;
        const struct of_device_id *match;
@@ -814,9 +813,7 @@ int asoc_qcom_lpass_cpu_platform_probe(struct platform_device *pdev)
 
        of_lpass_cpu_parse_dai_data(dev, drvdata);
 
-       res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "lpass-lpaif");
-
-       drvdata->lpaif = devm_ioremap_resource(dev, res);
+       drvdata->lpaif = devm_platform_ioremap_resource_byname(pdev, "lpass-lpaif");
        if (IS_ERR(drvdata->lpaif))
                return PTR_ERR(drvdata->lpaif);
 
@@ -833,9 +830,7 @@ int asoc_qcom_lpass_cpu_platform_probe(struct platform_device *pdev)
        }
 
        if (drvdata->hdmi_port_enable) {
-               res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "lpass-hdmiif");
-
-               drvdata->hdmiif = devm_ioremap_resource(dev, res);
+               drvdata->hdmiif = devm_platform_ioremap_resource_byname(pdev, "lpass-hdmiif");
                if (IS_ERR(drvdata->hdmiif))
                        return PTR_ERR(drvdata->hdmiif);
 
index c632842d42ebf0de397195a8c0b8a756b8c7a065..309badc9729070db3af877fec873a2ea63534af8 100644 (file)
@@ -1441,8 +1441,7 @@ static int samsung_i2s_probe(struct platform_device *pdev)
                }
        }
 
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       priv->addr = devm_ioremap_resource(&pdev->dev, res);
+       priv->addr = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
        if (IS_ERR(priv->addr))
                return PTR_ERR(priv->addr);
 
index bfd76e9cc0cad6306eac0469d59f01acd21bdba0..4c4dfde0568febe454840bd6decbcb6f2ee35219 100644 (file)
@@ -512,8 +512,7 @@ static int s3c_pcm_dev_probe(struct platform_device *pdev)
        /* Default is 128fs */
        pcm->sclk_per_fs = 128;
 
-       mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       pcm->regs = devm_ioremap_resource(&pdev->dev, mem_res);
+       pcm->regs = devm_platform_get_and_ioremap_resource(pdev, 0, &mem_res);
        if (IS_ERR(pcm->regs))
                return PTR_ERR(pcm->regs);
 
index 81f416ac457e0b61de488efa0c7bab43702b6ac8..ec1c6f9d76ac755652f45e5f8a2c89b3daff681f 100644 (file)
@@ -208,8 +208,7 @@ static int s3c2412_iis_dev_probe(struct platform_device *pdev)
                return -ENXIO;
        }
 
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       s3c2412_i2s.regs = devm_ioremap_resource(&pdev->dev, res);
+       s3c2412_i2s.regs = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
        if (IS_ERR(s3c2412_i2s.regs))
                return PTR_ERR(s3c2412_i2s.regs);
 
index 50c08008aacb8c1fbebf2bd82b29d6d4deef212d..0f46304eaa4f309dc03d3e5befaebe3e6375a224 100644 (file)
@@ -425,8 +425,7 @@ static int s3c24xx_iis_dev_probe(struct platform_device *pdev)
        struct resource *res;
        int ret;
 
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       s3c24xx_i2s.regs = devm_ioremap_resource(&pdev->dev, res);
+       s3c24xx_i2s.regs = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
        if (IS_ERR(s3c24xx_i2s.regs))
                return PTR_ERR(s3c24xx_i2s.regs);
 
index 6f3d9148a18579c4d9e66a6be30d3020ef2770f3..da597e456beb253027fa88c34b8f350af01aa438 100644 (file)
@@ -1709,8 +1709,7 @@ static int sun4i_codec_probe(struct platform_device *pdev)
 
        scodec->dev = &pdev->dev;
 
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       base = devm_ioremap_resource(&pdev->dev, res);
+       base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
        if (IS_ERR(base))
                return PTR_ERR(base);
 
index c57feae3396e934404e9454f6c417420472be0f7..1e9116cd365e58c45badca758ff6aac3f1986681 100644 (file)
@@ -1470,8 +1470,7 @@ static int sun4i_i2s_probe(struct platform_device *pdev)
                return -ENOMEM;
        platform_set_drvdata(pdev, i2s);
 
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       regs = devm_ioremap_resource(&pdev->dev, res);
+       regs = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
        if (IS_ERR(regs))
                return PTR_ERR(regs);
 
index 228485fe073426229566eb3bf0d3a23fd7c34275..a10949bf0ca1ed69fabd588ef5535cd5d8d0e58d 100644 (file)
@@ -518,8 +518,7 @@ static int sun4i_spdif_probe(struct platform_device *pdev)
        host->cpu_dai_drv.name = dev_name(&pdev->dev);
 
        /* Get the addresses */
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       base = devm_ioremap_resource(&pdev->dev, res);
+       base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
        if (IS_ERR(base))
                return PTR_ERR(base);
 
index a53aec361a7714bd653fac30d27e8aaac5202700..735909310a262d3310647137401bb8c058dd8293 100644 (file)
@@ -409,7 +409,7 @@ int tegra_asoc_machine_probe(struct platform_device *pdev)
                return PTR_ERR(np_codec);
 
        np_i2s = tegra_machine_parse_phandle(dev, "nvidia,i2s-controller");
-       if (!np_i2s)
+       if (IS_ERR(np_i2s))
                return PTR_ERR(np_i2s);
 
        card->dai_link->cpus->of_node = np_i2s;