Re: [PATCH] dmaengine: DW DMAC: split pdata to hardware properties and platform quirks
On Thu, 2016-09-15 at 16:14 +0300, Eugeniy Paltsev wrote: > This patch is to address a proposal by Andy in this thread: > http://www.spinics.net/lists/dmaengine/msg10754.html > Split platform data to actual hardware properties, and platform > quirks. > Now we able to use quirks and hardware properties separately from > different sources (pdata, device tree or autoconfig registers) > My comments below. Sorry for delayed answer. > Signed-off-by: Eugeniy Paltsev > --- > drivers/dma/dw/core.c| 31 +++--- > drivers/dma/dw/platform.c| 42 + > --- > include/linux/platform_data/dma-dw.h | 20 +++-- > 3 files changed, 57 insertions(+), 36 deletions(-) > > diff --git a/drivers/dma/dw/core.c b/drivers/dma/dw/core.c > index c2c0a61..9352735 100644 > --- a/drivers/dma/dw/core.c > +++ b/drivers/dma/dw/core.c > @@ -1451,10 +1451,25 @@ int dw_dma_probe(struct dw_dma_chip *chip) > > dw->regs = chip->regs; > chip->dw = dw; + empty line. > + /* Reassign the platform data pointer */ > + pdata = dw->pdata; > > pm_runtime_get_sync(chip->dev); > > - if (!chip->pdata) { > + if ((!chip->pdata) || > + (chip->pdata && test_bit(QUIRKS_ONLY_USED, &chip->pdata- I don't think you need atomic test / set of those bits. > >quirks))) { > + > + /* > + * Fill quirks with the default values in case of > pdata absence /* * Multi-line comments should include full sentences * (punctuation matters). */ > + */ > + if (!chip->pdata) { > + set_bit(QUIRKS_IS_PRIVATE, &pdata->quirks); > + set_bit(QUIRKS_IS_MEMCPY, &pdata->quirks); > + set_bit(QUIRKS_IS_NOLLP, &pdata->quirks); > + } else { > + pdata->quirks = chip->pdata->quirks; > + } > + > dw_params = dma_readl(dw, DW_PARAMS); > dev_dbg(chip->dev, "DW_PARAMS: 0x%08x\n", dw_params); > > @@ -1464,9 +1479,6 @@ int dw_dma_probe(struct dw_dma_chip *chip) > 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; > pdata->nr_masters = (dw_params >> DW_PARAMS_NR_MASTER > & 3) + 1; > @@ -1477,8 +1489,6 @@ int dw_dma_probe(struct dw_dma_chip *chip) > pdata->block_size = dma_readl(dw, MAX_BLK_SIZE); > > /* Fill platform data with the default values */ > - pdata->is_private = true; > - pdata->is_memcpy = true; > pdata->chan_allocation_order = > CHAN_ALLOCATION_ASCENDING; > pdata->chan_priority = CHAN_PRIORITY_ASCENDING; > } else if (chip->pdata->nr_channels > DW_DMA_MAX_NR_CHANNELS) > { > @@ -1486,9 +1496,6 @@ int dw_dma_probe(struct dw_dma_chip *chip) > goto err_pdata; > } else { > memcpy(dw->pdata, chip->pdata, sizeof(*dw->pdata)); > - > - /* Reassign the platform data pointer */ > - pdata = dw->pdata; > } > > dw->chan = devm_kcalloc(chip->dev, pdata->nr_channels, > sizeof(*dw->chan), > @@ -1569,7 +1576,7 @@ int dw_dma_probe(struct dw_dma_chip *chip) > (dwc_params >> DWC_PARAMS_MBLK_EN & > 0x1) == 0; > } else { > dwc->block_size = pdata->block_size; > - dwc->nollp = pdata->is_nollp; > + dwc->nollp = test_bit(QUIRKS_IS_NOLLP, > &pdata->quirks); Perhaps you need another patch which actually moves nollp to dwc->flags. > } > } > > @@ -1582,9 +1589,9 @@ int dw_dma_probe(struct dw_dma_chip *chip) > > /* Set capabilities */ > dma_cap_set(DMA_SLAVE, dw->dma.cap_mask); > - if (pdata->is_private) > + if (test_bit(QUIRKS_IS_PRIVATE, &pdata->quirks)) > dma_cap_set(DMA_PRIVATE, dw->dma.cap_mask); > - if (pdata->is_memcpy) > + if (test_bit(QUIRKS_IS_MEMCPY, &pdata->quirks)) > dma_cap_set(DMA_MEMCPY, dw->dma.cap_mask); > > dw->dma.dev = chip->dev; > diff --git a/drivers/dma/dw/platform.c b/drivers/dma/dw/platform.c > index 5bda0eb..308b977 100644 > --- a/drivers/dma/dw/platform.c > +++ b/drivers/dma/dw/platform.c > @@ -12,6 +12,7 @@ > * published by the Free Software Foundation. > */ > > +#include > #include > #include > #include > @@ -111,41 +112,48 @@ 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"
Re: [PATCH] dmaengine: DW DMAC: split pdata to hardware properties and platform quirks
On Thu, 2016-10-20 at 13:48 +0300, Andy Shevchenko wrote: > On Thu, 2016-09-15 at 16:14 +0300, Eugeniy Paltsev wrote: > > > > This patch is to address a proposal by Andy in this thread: > > http://www.spinics.net/lists/dmaengine/msg10754.html > > Split platform data to actual hardware properties, and platform > > quirks. > > Now we able to use quirks and hardware properties separately from > > different sources (pdata, device tree or autoconfig registers) > > > My comments below. > > Sorry for delayed answer. No problems. > > > > > Signed-off-by: Eugeniy Paltsev > > --- > > drivers/dma/dw/core.c| 31 +++- > > -- > > drivers/dma/dw/platform.c| 42 +--- > > - > > --- > > include/linux/platform_data/dma-dw.h | 20 +++-- > > 3 files changed, 57 insertions(+), 36 deletions(-) > > > > diff --git a/drivers/dma/dw/core.c b/drivers/dma/dw/core.c > > index c2c0a61..9352735 100644 > > --- a/drivers/dma/dw/core.c > > +++ b/drivers/dma/dw/core.c > > @@ -1451,10 +1451,25 @@ int dw_dma_probe(struct dw_dma_chip *chip) > > > > dw->regs = chip->regs; > > chip->dw = dw; > + empty line. > > > > > + /* Reassign the platform data pointer */ > > + pdata = dw->pdata; > > > > pm_runtime_get_sync(chip->dev); > > > > - if (!chip->pdata) { > > + if ((!chip->pdata) || > > + (chip->pdata && test_bit(QUIRKS_ONLY_USED, &chip- > > >pdata- > I don't think you need atomic test / set of those bits. I don't need atomic bit operations here, I just used standard bit API to make code more clear. > > > > > > > > quirks))) { > > + > > + /* > > + * Fill quirks with the default values in case of > > pdata absence > /* > * Multi-line comments should include full sentences > * (punctuation matters). > */ > > > > > + */ > > + if (!chip->pdata) { > > + set_bit(QUIRKS_IS_PRIVATE, &pdata- > > >quirks); > > + set_bit(QUIRKS_IS_MEMCPY, &pdata->quirks); > > + set_bit(QUIRKS_IS_NOLLP, &pdata->quirks); > > + } else { > > + pdata->quirks = chip->pdata->quirks; > > + } > > + > > dw_params = dma_readl(dw, DW_PARAMS); > > dev_dbg(chip->dev, "DW_PARAMS: 0x%08x\n", > > dw_params); > > > > @@ -1464,9 +1479,6 @@ int dw_dma_probe(struct dw_dma_chip *chip) > > 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; > > pdata->nr_masters = (dw_params >> > > DW_PARAMS_NR_MASTER > > & 3) + 1; > > @@ -1477,8 +1489,6 @@ int dw_dma_probe(struct dw_dma_chip *chip) > > pdata->block_size = dma_readl(dw, MAX_BLK_SIZE); > > > > /* Fill platform data with the default values */ > > - pdata->is_private = true; > > - pdata->is_memcpy = true; > > pdata->chan_allocation_order = > > CHAN_ALLOCATION_ASCENDING; > > pdata->chan_priority = CHAN_PRIORITY_ASCENDING; > > } else if (chip->pdata->nr_channels > > > DW_DMA_MAX_NR_CHANNELS) > > { > > @@ -1486,9 +1496,6 @@ int dw_dma_probe(struct dw_dma_chip *chip) > > goto err_pdata; > > } else { > > memcpy(dw->pdata, chip->pdata, sizeof(*dw- > > >pdata)); > > - > > - /* Reassign the platform data pointer */ > > - pdata = dw->pdata; > > } > > > > dw->chan = devm_kcalloc(chip->dev, pdata->nr_channels, > > sizeof(*dw->chan), > > @@ -1569,7 +1576,7 @@ int dw_dma_probe(struct dw_dma_chip *chip) > > (dwc_params >> DWC_PARAMS_MBLK_EN > > & > > 0x1) == 0; > > } else { > > dwc->block_size = pdata->block_size; > > - dwc->nollp = pdata->is_nollp; > > + dwc->nollp = test_bit(QUIRKS_IS_NOLLP, > > &pdata->quirks); > Perhaps you need another patch which actually moves nollp to dwc- > >flags. As I can see, we already have DW_DMA_IS_SOFT_LLP flag in "dwc->flags" with same functionality, which is set if "dwc->nollp" is true. Probably we can use this flag and get rid of "dwc->nollp". But I'm a bit confused why we clear DW_DMA_IS_SOFT_LLP bit in "dwc_scan_descriptors" and "dwc_terminate_all" functions. Any ideas about that? > > > > } > > } > > > > @@ -1582,9 +1589,9 @@ int dw_dma_probe(struct dw_dma_chip *chip) > > > > /* Set capabilities */ > > dma_cap_set(DMA_SLAVE, dw->dma.cap_mask); > > - if (pdata->is_private) > > + if (test_bit(QUIRKS_IS_PRIVATE, &pdata->quirks)) > > dma_cap_set(DMA_PRIVATE, dw->dma.cap_mask); > > - if (pdata->is_memcpy) > > + if (test_bit(QUIRKS_IS_MEMCPY, &pdata->quirks)) > > dma_cap_set(DMA_MEMCPY, dw->dma.cap_