UPSTREAM: ASoC: rockchip: i2s: compatible with different chips
authorSugar Zhang <sugar.zhang@rock-chips.com>
Tue, 10 Nov 2015 07:32:07 +0000 (15:32 +0800)
committerHuang, Tao <huangtao@rock-chips.com>
Wed, 30 Mar 2016 10:09:51 +0000 (18:09 +0800)
there maybe more than one i2s module inside chip, and these i2s modules
have different channels features.

for example: there are 3 i2s in rk3066, one support 8 channels playback
and 2 channels capture, but the others only support 2 channels playback
and 2 channels capture.

in order to compatible with these various chips, we add playback and
capture property to specify these values.

there are default channels configuration in driver: 8 channels playback
and 2 channels capture. if not add property, we use the default values.

Change-Id: I45f3214160877223ba9722bd38a36584e416b14d
Signed-off-by: Sugar Zhang <sugar.zhang@rock-chips.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
(cherry picked from commit c4f9374ddc461ed76be30f4d354a6d1ecb94dfa5)

sound/soc/rockchip/rockchip_i2s.c

index 04856ad892c4d652cd10c2fbafc31408f239b087..9b173b4d3396b4030c699627747d80188f91342a 100644 (file)
@@ -484,6 +484,7 @@ static int rockchip_i2s_probe(struct platform_device *pdev)
 {
        struct device_node *node = pdev->dev.of_node;
        struct rk_i2s_dev *i2s;
+       struct snd_soc_dai_driver *soc_dai;
        struct resource *res;
        void __iomem *regs;
        int ret;
@@ -544,17 +545,26 @@ static int rockchip_i2s_probe(struct platform_device *pdev)
                        goto err_pm_disable;
        }
 
-       /* refine capture channels */
+       soc_dai = devm_kzalloc(&pdev->dev,
+                              sizeof(*soc_dai), GFP_KERNEL);
+       if (!soc_dai)
+               return -ENOMEM;
+
+       memcpy(soc_dai, &rockchip_i2s_dai, sizeof(*soc_dai));
+       if (!of_property_read_u32(node, "rockchip,playback-channels", &val)) {
+               if (val >= 2 && val <= 8)
+                       soc_dai->playback.channels_max = val;
+       }
+
        if (!of_property_read_u32(node, "rockchip,capture-channels", &val)) {
                if (val >= 2 && val <= 8)
-                       rockchip_i2s_dai.capture.channels_max = val;
-               else
-                       rockchip_i2s_dai.capture.channels_max = 2;
+                       soc_dai->capture.channels_max = val;
        }
 
        ret = devm_snd_soc_register_component(&pdev->dev,
                                              &rockchip_i2s_component,
-                                             &rockchip_i2s_dai, 1);
+                                             soc_dai, 1);
+
        if (ret) {
                dev_err(&pdev->dev, "Could not register DAI\n");
                goto err_suspend;