Skip to content

Commit

Permalink
dma: dw: allocate memory in two stages in probe
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Andy Shevchenko authored and Vinod Koul committed Mar 26, 2014
1 parent 2acec15 commit 000871c
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 9 deletions.
17 changes: 10 additions & 7 deletions drivers/dma/dw/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -1479,14 +1479,20 @@ 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;
unsigned int max_blk_size = 0;
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;

Expand All @@ -1509,19 +1515,16 @@ 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");
if (IS_ERR(dw->clk))
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);
Expand Down
4 changes: 2 additions & 2 deletions drivers/dma/dw/regs.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit 000871c

Please sign in to comment.