dma: dw: allocate memory in two stages in probe
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Wed, 5 Mar 2014 13:48:12 +0000 (15:48 +0200)
committerVinod Koul <vinod.koul@intel.com>
Wed, 26 Mar 2014 06:14:27 +0000 (11:44 +0530)
This makes the probe() function a little bit clearer.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
drivers/dma/dw/core.c
drivers/dma/dw/regs.h

index 1b45097..cfdbb92 100644 (file)
@@ -1479,7 +1479,6 @@ static void dw_dma_off(struct dw_dma *dw)
 int dw_dma_probe(struct dw_dma_chip *chip, struct dw_dma_platform_data *pdata)
 {
        struct dw_dma           *dw;
-       size_t                  size;
        bool                    autocfg;
        unsigned int            dw_params;
        unsigned int            nr_channels;
@@ -1487,6 +1486,13 @@ int dw_dma_probe(struct dw_dma_chip *chip, struct dw_dma_platform_data *pdata)
        int                     err;
        int                     i;
 
+       dw = devm_kzalloc(chip->dev, sizeof(*dw), GFP_KERNEL);
+       if (!dw)
+               return -ENOMEM;
+
+       dw->regs = chip->regs;
+       chip->dw = dw;
+
        dw_params = dma_read_byaddr(chip->regs, DW_PARAMS);
        autocfg = dw_params >> DW_PARAMS_EN & 0x1;
 
@@ -1509,9 +1515,9 @@ int dw_dma_probe(struct dw_dma_chip *chip, struct dw_dma_platform_data *pdata)
        else
                nr_channels = pdata->nr_channels;
 
-       size = sizeof(struct dw_dma) + nr_channels * sizeof(struct dw_dma_chan);
-       dw = devm_kzalloc(chip->dev, size, GFP_KERNEL);
-       if (!dw)
+       dw->chan = devm_kcalloc(chip->dev, nr_channels, sizeof(*dw->chan),
+                               GFP_KERNEL);
+       if (!dw->chan)
                return -ENOMEM;
 
        dw->clk = devm_clk_get(chip->dev, "hclk");
@@ -1519,9 +1525,6 @@ int dw_dma_probe(struct dw_dma_chip *chip, struct dw_dma_platform_data *pdata)
                return PTR_ERR(dw->clk);
        clk_prepare_enable(dw->clk);
 
-       dw->regs = chip->regs;
-       chip->dw = dw;
-
        /* Get hardware configuration parameters */
        if (autocfg) {
                max_blk_size = dma_readl(dw, MAX_BLK_SIZE);
index deb4274..bb98d3e 100644 (file)
@@ -252,13 +252,13 @@ struct dw_dma {
        struct tasklet_struct   tasklet;
        struct clk              *clk;
 
+       /* channels */
+       struct dw_dma_chan      *chan;
        u8                      all_chan_mask;
 
        /* hardware configuration */
        unsigned char           nr_masters;
        unsigned char           data_width[4];
-
-       struct dw_dma_chan      chan[0];
 };
 
 static inline struct dw_dma_regs __iomem *__dw_regs(struct dw_dma *dw)