Re: [PATCH] dmaengine: DW DMAC: split pdata to hardware properties and platform quirks

2016-10-20 Thread Andy Shevchenko
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

2016-10-20 Thread Eugeniy Paltsev
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_