Merge tag 'tty-3.14-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty
[firefly-linux-kernel-4.4.55.git] / sound / soc / ux500 / ux500_msp_i2s.c
index 1ca8b08ae993d34a100b22032315b9c94ce9ec03..959d7b4edf56a94d167d09ea07ca7a597a64bbce 100644 (file)
@@ -646,6 +646,34 @@ int ux500_msp_i2s_close(struct ux500_msp *msp, unsigned int dir)
 
 }
 
+static int ux500_msp_i2s_of_init_msp(struct platform_device *pdev,
+                               struct ux500_msp *msp,
+                               struct msp_i2s_platform_data **platform_data)
+{
+       struct msp_i2s_platform_data *pdata;
+
+       *platform_data = devm_kzalloc(&pdev->dev,
+                                    sizeof(struct msp_i2s_platform_data),
+                                    GFP_KERNEL);
+       pdata = *platform_data;
+       if (!pdata)
+               return -ENOMEM;
+
+       msp->playback_dma_data.dma_cfg = devm_kzalloc(&pdev->dev,
+                                       sizeof(struct stedma40_chan_cfg),
+                                       GFP_KERNEL);
+       if (!msp->playback_dma_data.dma_cfg)
+               return -ENOMEM;
+
+       msp->capture_dma_data.dma_cfg = devm_kzalloc(&pdev->dev,
+                                       sizeof(struct stedma40_chan_cfg),
+                                       GFP_KERNEL);
+       if (!msp->capture_dma_data.dma_cfg)
+               return -ENOMEM;
+
+       return 0;
+}
+
 int ux500_msp_i2s_init_msp(struct platform_device *pdev,
                        struct ux500_msp **msp_p,
                        struct msp_i2s_platform_data *platform_data)
@@ -653,30 +681,28 @@ int ux500_msp_i2s_init_msp(struct platform_device *pdev,
        struct resource *res = NULL;
        struct device_node *np = pdev->dev.of_node;
        struct ux500_msp *msp;
+       int ret;
 
        *msp_p = devm_kzalloc(&pdev->dev, sizeof(struct ux500_msp), GFP_KERNEL);
        msp = *msp_p;
        if (!msp)
                return -ENOMEM;
 
-       if (np) {
-               if (!platform_data) {
-                       platform_data = devm_kzalloc(&pdev->dev,
-                               sizeof(struct msp_i2s_platform_data), GFP_KERNEL);
-                       if (!platform_data)
-                               return -ENOMEM;
-               }
-       } else
-               if (!platform_data)
+       if (!platform_data) {
+               if (np) {
+                       ret = ux500_msp_i2s_of_init_msp(pdev, msp,
+                                                       &platform_data);
+                       if (ret)
+                               return ret;
+               } else
                        return -EINVAL;
+       } else {
+               msp->playback_dma_data.dma_cfg = platform_data->msp_i2s_dma_tx;
+               msp->capture_dma_data.dma_cfg = platform_data->msp_i2s_dma_rx;
+               msp->id = platform_data->id;
+       }
 
-       dev_dbg(&pdev->dev, "%s: Enter (name: %s, id: %d).\n", __func__,
-               pdev->name, platform_data->id);
-
-       msp->id = platform_data->id;
        msp->dev = &pdev->dev;
-       msp->playback_dma_data.dma_cfg = platform_data->msp_i2s_dma_tx;
-       msp->capture_dma_data.dma_cfg = platform_data->msp_i2s_dma_rx;
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (res == NULL) {