dmaengine: dw: platform: check nr_masters to be non-zero
[deliverable/linux.git] / 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.044608 seconds and 5 git commands to generate.