mirror of https://gitee.com/openkylin/linux.git
dmaengine: dw: keep entire platform data in struct dw_dma
Keep the entire platform data in the struct dw_dma. It makes the driver a bit cleaner. 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>
This commit is contained in:
parent
2e65060e80
commit
161c3d04ae
|
@ -665,7 +665,7 @@ dwc_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dest, dma_addr_t src,
|
|||
u8 m_master = dwc->m_master;
|
||||
unsigned int src_width;
|
||||
unsigned int dst_width;
|
||||
unsigned int data_width = dw->data_width[m_master];
|
||||
unsigned int data_width = dw->pdata->data_width[m_master];
|
||||
u32 ctllo;
|
||||
u8 lms = DWC_LLP_LMS(m_master);
|
||||
|
||||
|
@ -745,7 +745,7 @@ dwc_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,
|
|||
dma_addr_t reg;
|
||||
unsigned int reg_width;
|
||||
unsigned int mem_width;
|
||||
unsigned int data_width = dw->data_width[m_master];
|
||||
unsigned int data_width = dw->pdata->data_width[m_master];
|
||||
unsigned int i;
|
||||
struct scatterlist *sg;
|
||||
size_t total_len = 0;
|
||||
|
@ -1444,7 +1444,6 @@ int dw_dma_probe(struct dw_dma_chip *chip, struct dw_dma_platform_data *pdata)
|
|||
struct dw_dma *dw;
|
||||
bool autocfg = false;
|
||||
unsigned int dw_params;
|
||||
unsigned int max_blk_size = 0;
|
||||
unsigned int i;
|
||||
int err;
|
||||
|
||||
|
@ -1452,6 +1451,10 @@ int dw_dma_probe(struct dw_dma_chip *chip, struct dw_dma_platform_data *pdata)
|
|||
if (!dw)
|
||||
return -ENOMEM;
|
||||
|
||||
dw->pdata = devm_kzalloc(chip->dev, sizeof(*dw->pdata), GFP_KERNEL);
|
||||
if (!dw->pdata)
|
||||
return -ENOMEM;
|
||||
|
||||
dw->regs = chip->regs;
|
||||
chip->dw = dw;
|
||||
|
||||
|
@ -1467,11 +1470,8 @@ int dw_dma_probe(struct dw_dma_chip *chip, struct dw_dma_platform_data *pdata)
|
|||
goto err_pdata;
|
||||
}
|
||||
|
||||
pdata = devm_kzalloc(chip->dev, sizeof(*pdata), GFP_KERNEL);
|
||||
if (!pdata) {
|
||||
err = -ENOMEM;
|
||||
goto err_pdata;
|
||||
}
|
||||
/* Reassign the platform data pointer */
|
||||
pdata = dw->pdata;
|
||||
|
||||
/* Get hardware configuration parameters */
|
||||
pdata->nr_channels = (dw_params >> DW_PARAMS_NR_CHAN & 7) + 1;
|
||||
|
@ -1480,7 +1480,7 @@ int dw_dma_probe(struct dw_dma_chip *chip, struct dw_dma_platform_data *pdata)
|
|||
pdata->data_width[i] =
|
||||
4 << (dw_params >> DW_PARAMS_DATA_WIDTH(i) & 3);
|
||||
}
|
||||
max_blk_size = dma_readl(dw, MAX_BLK_SIZE);
|
||||
pdata->block_size = dma_readl(dw, MAX_BLK_SIZE);
|
||||
|
||||
/* Fill platform data with the default values */
|
||||
pdata->is_private = true;
|
||||
|
@ -1490,6 +1490,11 @@ int dw_dma_probe(struct dw_dma_chip *chip, struct dw_dma_platform_data *pdata)
|
|||
} else if (pdata->nr_channels > DW_DMA_MAX_NR_CHANNELS) {
|
||||
err = -EINVAL;
|
||||
goto err_pdata;
|
||||
} else {
|
||||
memcpy(dw->pdata, pdata, sizeof(*dw->pdata));
|
||||
|
||||
/* Reassign the platform data pointer */
|
||||
pdata = dw->pdata;
|
||||
}
|
||||
|
||||
dw->chan = devm_kcalloc(chip->dev, pdata->nr_channels, sizeof(*dw->chan),
|
||||
|
@ -1499,11 +1504,6 @@ int dw_dma_probe(struct dw_dma_chip *chip, struct dw_dma_platform_data *pdata)
|
|||
goto err_pdata;
|
||||
}
|
||||
|
||||
/* Get hardware configuration parameters */
|
||||
dw->nr_masters = pdata->nr_masters;
|
||||
for (i = 0; i < dw->nr_masters; i++)
|
||||
dw->data_width[i] = pdata->data_width[i];
|
||||
|
||||
/* Calculate all channel mask before DMA setup */
|
||||
dw->all_chan_mask = (1 << pdata->nr_channels) - 1;
|
||||
|
||||
|
@ -1570,7 +1570,7 @@ int dw_dma_probe(struct dw_dma_chip *chip, struct dw_dma_platform_data *pdata)
|
|||
* up to 0x0a for 4095.
|
||||
*/
|
||||
dwc->block_size =
|
||||
(4 << ((max_blk_size >> 4 * i) & 0xf)) - 1;
|
||||
(4 << ((pdata->block_size >> 4 * i) & 0xf)) - 1;
|
||||
dwc->nollp =
|
||||
(dwc_params >> DWC_PARAMS_MBLK_EN & 0x1) == 0;
|
||||
} else {
|
||||
|
|
|
@ -47,8 +47,8 @@ static struct dma_chan *dw_dma_of_xlate(struct of_phandle_args *dma_spec,
|
|||
|
||||
if (WARN_ON(slave.src_id >= DW_DMA_MAX_NR_REQUESTS ||
|
||||
slave.dst_id >= DW_DMA_MAX_NR_REQUESTS ||
|
||||
slave.m_master >= dw->nr_masters ||
|
||||
slave.p_master >= dw->nr_masters))
|
||||
slave.m_master >= dw->pdata->nr_masters ||
|
||||
slave.p_master >= dw->pdata->nr_masters))
|
||||
return NULL;
|
||||
|
||||
dma_cap_zero(cap);
|
||||
|
|
|
@ -281,9 +281,8 @@ struct dw_dma {
|
|||
u8 all_chan_mask;
|
||||
u8 in_use;
|
||||
|
||||
/* hardware configuration */
|
||||
unsigned char nr_masters;
|
||||
unsigned char data_width[DW_DMA_MAX_NR_MASTERS];
|
||||
/* platform data */
|
||||
struct dw_dma_platform_data *pdata;
|
||||
};
|
||||
|
||||
static inline struct dw_dma_regs __iomem *__dw_regs(struct dw_dma *dw)
|
||||
|
|
|
@ -55,7 +55,7 @@ struct dw_dma_platform_data {
|
|||
#define CHAN_PRIORITY_ASCENDING 0 /* chan0 highest */
|
||||
#define CHAN_PRIORITY_DESCENDING 1 /* chan7 highest */
|
||||
unsigned char chan_priority;
|
||||
unsigned short block_size;
|
||||
unsigned int block_size;
|
||||
unsigned char nr_masters;
|
||||
unsigned char data_width[DW_DMA_MAX_NR_MASTERS];
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue