dmaengine: dw: platform: check nr_masters to be non-zero
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Wed, 27 Apr 2016 11:15:37 +0000 (14:15 +0300)
committerVinod Koul <vinod.koul@intel.com>
Mon, 2 May 2016 10:00:25 +0000 (15:30 +0530)
The value of nr_masters equal to 0 is invalid since this DMA controller has to
have at least one master.

Check this before we proceed with the rest of properties.

Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
drivers/dma/dw/platform.c

index 23616c57645c25c6c530dc1da390ff3df3ba8526..e65ebe5ab88f557278a8fafcfb184495f3eb2b0f 100644 (file)
@@ -103,6 +103,7 @@ dw_dma_parse_dt(struct platform_device *pdev)
        struct device_node *np = pdev->dev.of_node;
        struct dw_dma_platform_data *pdata;
        u32 tmp, arr[DW_DMA_MAX_NR_MASTERS];
+       u32 nr_masters;
        u32 nr_channels;
 
        if (!np) {
@@ -110,6 +111,11 @@ dw_dma_parse_dt(struct platform_device *pdev)
                return NULL;
        }
 
+       if (of_property_read_u32(np, "dma-masters", &nr_masters))
+               return NULL;
+       if (nr_masters < 1 || nr_masters > DW_DMA_MAX_NR_MASTERS)
+               return NULL;
+
        if (of_property_read_u32(np, "dma-channels", &nr_channels))
                return NULL;
 
@@ -117,6 +123,7 @@ dw_dma_parse_dt(struct platform_device *pdev)
        if (!pdata)
                return NULL;
 
+       pdata->nr_masters = nr_masters;
        pdata->nr_channels = nr_channels;
 
        if (of_property_read_bool(np, "is_private"))
@@ -131,17 +138,10 @@ dw_dma_parse_dt(struct platform_device *pdev)
        if (!of_property_read_u32(np, "block_size", &tmp))
                pdata->block_size = tmp;
 
-       if (!of_property_read_u32(np, "dma-masters", &tmp)) {
-               if (tmp > DW_DMA_MAX_NR_MASTERS)
-                       return NULL;
-
-               pdata->nr_masters = tmp;
-       }
-
-       if (!of_property_read_u32_array(np, "data_width", arr,
-                               pdata->nr_masters))
-               for (tmp = 0; tmp < pdata->nr_masters; tmp++)
+       if (!of_property_read_u32_array(np, "data_width", arr, nr_masters)) {
+               for (tmp = 0; tmp < nr_masters; tmp++)
                        pdata->data_width[tmp] = arr[tmp];
+       }
 
        return pdata;
 }
This page took 0.026629 seconds and 5 git commands to generate.