Re: [PATCH v3 1/6] dmaengine: dw-edma: fix dw_edma_probe() can't be call globally

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Mar 09, 2022 at 10:37:51AM -0600, Zhi Li wrote:
> On Wed, Mar 9, 2022 at 7:39 AM Serge Semin <fancer.lancer@xxxxxxxxx> wrote:
> >
> > Hello Frank
> >
> > On Mon, Mar 07, 2022 at 04:47:45PM -0600, Frank Li wrote:
> > > "struct dw_edma_chip" contains an internal structure "struct dw_edma" that is
> > > used by the eDMA core internally. This structure should not be touched
> > > by the eDMA controller drivers themselves. But currently, the eDMA
> > > controller drivers like "dw-edma-pci" allocates and populates this
> > > internal structure then passes it on to eDMA core. The eDMA core further
> > > populates the structure and uses it. This is wrong!
> > >
> > > Hence, move all the "struct dw_edma" specifics from controller drivers
> > > to the eDMA core.
> >
> > Thanks for the patchset. Alas it has just drawn my attention on v3
> > stage, otherwise I would have given to you my thoughts stright away on
> > v1. Anyway first of all a cover letter would be very much appropriate
> > to have a general notion about all the changes introduced in the set.
> >
> > Secondly I've just been working on adding the eDMA platform support
> > myself, so you have been just about a week ahead of me submitting my
> > changes.  My work contains some of the modifications done by you (but
> > have some additional fixes too) so I'll need to rebase it on top of
> > your patchset when it's finished. Anyway am I understand correctly,
> > that you've also been working on the DW PCIe driver alteration so one
> > would properly initialize the eDMA-chip data structure? If so have you
> > sent the patchset already?  Could you give me a link and add me to Cc
> > in the emailing thread? (That's where the cover letter with all the
> > info and related patchsets would be very helpful.)
> >
> > Thirdly regarding this patch. Your modification is mainly correct, but
> > I would suggest to change the concept. Instead of needlessly converting
> > the code to using the dw_edma_chip structure pointer within the DW eDMA
> > driver, it would be much easier in modification and more logical to
> > keep using the struct dw_edma pointer. Especially seeing dw_edma
> > structure is going to be a pure private data. So to speak what I would
> > suggest is to have the next pointers setup:
> >
> > include/linux/dma/edma.h:
> > struct dw_edma_chip {
> >         /* drop struct dw_edma *dw; */
> > };
> 

> The key problem at dw_edma_remove(struct dw_edma_chip *chip)
> It needs dw information to do clean up work.

Not a problem. Just leave the structure declaration in the DW eDMA
global header file:

include/linux/dma/edma.h:
+ struct dw_edma;

and return the eDMA-descriptor from the probe method:
struct dw_edma *dw_edma_probe(struct dw_edma_chip *chip);

Then the probe-method callee will be able to clean all the eDMA driver
data up by passing the pointer to the eDMA data to the remove method:
void dw_edma_remove(struct dw_edma *);

-Sergey

> 
> >
> > drivers/dma/dw-edma/dw-edma-core.h:
> > struct dw_edma {
> >         const struct dw_edma_chip *chip;
> > };
> >
> > struct dw_edma_chan {
> >         struct dw_edma *dw;
> > };
> >
> > Thus we'll have a cleaner concept here:
> > struct dw_edma_chip - DW eDMA controller descriptor, defined and
> > initialized in the client platform drivers. Can be static and const in
> > general (which in your approach is impossible).
> > struct dw_edma - pure DW eDMA driver private data. It will be used
> > the within the local driver only and won't be seen outside.
> >
> > Thus you won't need an almost a half of the modifications below,
> > would provide a cleaner interface, would support the const
> > static DW eDMA chip info objects.
> >
> > More comments regarding the suggested approach and some additional
> > notes are below.
> >
> > >
> > > Signed-off-by: Frank Li <Frank.Li@xxxxxxx>
> > > ---
> > >
> > > Resend added dmaengine@xxxxxxxxxxxxxxx
> > >
> > > Change from v2 to v3
> > >  - none
> > > Change from v1 to v2
> > >  - rework commit message
> > >  - remove duplicate field in struct dw_edma
> > >
> > >  drivers/dma/dw-edma/dw-edma-core.c       |  91 +++++-----
> > >  drivers/dma/dw-edma/dw-edma-core.h       |  30 +---
> > >  drivers/dma/dw-edma/dw-edma-v0-core.c    | 206 ++++++++++++-----------
> > >  drivers/dma/dw-edma/dw-edma-v0-core.h    |   8 +-
> > >  drivers/dma/dw-edma/dw-edma-v0-debugfs.c |  37 ++--
> > >  include/linux/dma/edma.h                 |  47 +++++-
> > >  6 files changed, 230 insertions(+), 189 deletions(-)
> > >
> > > diff --git a/drivers/dma/dw-edma/dw-edma-core.c b/drivers/dma/dw-edma/dw-edma-core.c
> > > index 53289927dd0d6..0cb66434f9e14 100644
> > > --- a/drivers/dma/dw-edma/dw-edma-core.c
> > > +++ b/drivers/dma/dw-edma/dw-edma-core.c
> > > @@ -65,7 +65,7 @@ static struct dw_edma_burst *dw_edma_alloc_burst(struct dw_edma_chunk *chunk)
> > >  static struct dw_edma_chunk *dw_edma_alloc_chunk(struct dw_edma_desc *desc)
> > >  {
> > >       struct dw_edma_chan *chan = desc->chan;
> >
> > > -     struct dw_edma *dw = chan->chip->dw;
> > > +     struct dw_edma_chip *chip = chan->chip;
> >
> > If you do as I suggest you won't need to modify this part.
> >
> > >       struct dw_edma_chunk *chunk;
> > >
> > >       chunk = kzalloc(sizeof(*chunk), GFP_NOWAIT);
> > > @@ -82,11 +82,11 @@ static struct dw_edma_chunk *dw_edma_alloc_chunk(struct dw_edma_desc *desc)
> > >        */
> > >       chunk->cb = !(desc->chunks_alloc % 2);
> > >       if (chan->dir == EDMA_DIR_WRITE) {
> >
> > > -             chunk->ll_region.paddr = dw->ll_region_wr[chan->id].paddr;
> > > -             chunk->ll_region.vaddr = dw->ll_region_wr[chan->id].vaddr;
> > > +             chunk->ll_region.paddr = chip->ll_region_wr[chan->id].paddr;
> > > +             chunk->ll_region.vaddr = chip->ll_region_wr[chan->id].vaddr;
> > >       } else {
> > > -             chunk->ll_region.paddr = dw->ll_region_rd[chan->id].paddr;
> > > -             chunk->ll_region.vaddr = dw->ll_region_rd[chan->id].vaddr;
> > > +             chunk->ll_region.paddr = chip->ll_region_rd[chan->id].paddr;
> > > +             chunk->ll_region.vaddr = chip->ll_region_rd[chan->id].vaddr;
> > >       }
> >
> > Here you would just need to change the pointers "sandwich" to
> > "dw->chip->...".
> >
> > >
> > >       if (desc->chunk) {
> > > @@ -601,7 +601,8 @@ static void dw_edma_abort_interrupt(struct dw_edma_chan *chan)
> > >  static irqreturn_t dw_edma_interrupt(int irq, void *data, bool write)
> > >  {
> > >       struct dw_edma_irq *dw_irq = data;
> >
> > > -     struct dw_edma *dw = dw_irq->dw;
> > > +     struct dw_edma_chip *chip = dw_irq->chip;
> > > +     struct dw_edma *dw = chip->dw;
> >
> > This also would have been unneeded, since the method relies on the data
> > from the dw_edma structure.
> >
> > >       unsigned long total, pos, val;
> > >       unsigned long off;
> > >       u32 mask;
> > > @@ -616,7 +617,7 @@ static irqreturn_t dw_edma_interrupt(int irq, void *data, bool write)
> > >               mask = dw_irq->rd_mask;
> > >       }
> > >
> >
> > > -     val = dw_edma_v0_core_status_done_int(dw, write ?
> > > +     val = dw_edma_v0_core_status_done_int(chip, write ?
> > >                                                         EDMA_DIR_WRITE :
> > >                                                         EDMA_DIR_READ);
> > >       val &= mask;
> > > @@ -626,7 +627,7 @@ static irqreturn_t dw_edma_interrupt(int irq, void *data, bool write)
> > >               dw_edma_done_interrupt(chan);
> > >       }
> > >
> > > -     val = dw_edma_v0_core_status_abort_int(dw, write ?
> > > +     val = dw_edma_v0_core_status_abort_int(chip, write ?
> > >                                                          EDMA_DIR_WRITE :
> > >                                                          EDMA_DIR_READ);
> >
> > This won't be needed.
> >
> > >       val &= mask;
> > > @@ -718,7 +719,7 @@ static int dw_edma_channel_setup(struct dw_edma_chip *chip, bool write,
> > >       }
> > >
> > >       INIT_LIST_HEAD(&dma->channels);
> >
> > > -     for (j = 0; (alloc || dw->nr_irqs == 1) && j < cnt; j++, i++) {
> > > +     for (j = 0; (alloc || chip->nr_irqs == 1) && j < cnt; j++, i++) {
> > >               chan = &dw->chan[i];
> > >
> > >               dt_region = devm_kzalloc(dev, sizeof(*dt_region), GFP_KERNEL);
> > > @@ -735,15 +736,15 @@ static int dw_edma_channel_setup(struct dw_edma_chip *chip, bool write,
> > >               chan->status = EDMA_ST_IDLE;
> > >
> > >               if (write)
> > > -                     chan->ll_max = (dw->ll_region_wr[j].sz / EDMA_LL_SZ);
> > > +                     chan->ll_max = (chip->ll_region_wr[j].sz / EDMA_LL_SZ);
> > >               else
> > > -                     chan->ll_max = (dw->ll_region_rd[j].sz / EDMA_LL_SZ);
> > > +                     chan->ll_max = (chip->ll_region_rd[j].sz / EDMA_LL_SZ);
> > >               chan->ll_max -= 1;
> > >
> > >               dev_vdbg(dev, "L. List:\tChannel %s[%u] max_cnt=%u\n",
> > >                        write ? "write" : "read", j, chan->ll_max);
> > >
> > > -             if (dw->nr_irqs == 1)
> > > +             if (chip->nr_irqs == 1)
> >
> > This would have been changed to using the "dw->chip->..." pattern.
> >
> > >                       pos = 0;
> > >               else
> > >                       pos = off_alloc + (j % alloc);
> > > @@ -755,7 +756,7 @@ static int dw_edma_channel_setup(struct dw_edma_chip *chip, bool write,
> > >               else
> > >                       irq->rd_mask |= BIT(j);
> > >
> >
> > > -             irq->dw = dw;
> > > +             irq->chip = chip;
> >
> > Won't be needed.
> >
> > >               memcpy(&chan->msi, &irq->msi, sizeof(chan->msi));
> > >
> > >               dev_vdbg(dev, "MSI:\t\tChannel %s[%u] addr=0x%.8x%.8x, data=0x%.8x\n",
> > > @@ -767,13 +768,13 @@ static int dw_edma_channel_setup(struct dw_edma_chip *chip, bool write,
> > >               vchan_init(&chan->vc, dma);
> > >
> > >               if (write) {
> >
> > > -                     dt_region->paddr = dw->dt_region_wr[j].paddr;
> > > -                     dt_region->vaddr = dw->dt_region_wr[j].vaddr;
> > > -                     dt_region->sz = dw->dt_region_wr[j].sz;
> > > +                     dt_region->paddr = chip->dt_region_wr[j].paddr;
> > > +                     dt_region->vaddr = chip->dt_region_wr[j].vaddr;
> > > +                     dt_region->sz = chip->dt_region_wr[j].sz;
> > >               } else {
> > > -                     dt_region->paddr = dw->dt_region_rd[j].paddr;
> > > -                     dt_region->vaddr = dw->dt_region_rd[j].vaddr;
> > > -                     dt_region->sz = dw->dt_region_rd[j].sz;
> > > +                     dt_region->paddr = chip->dt_region_rd[j].paddr;
> > > +                     dt_region->vaddr = chip->dt_region_rd[j].vaddr;
> > > +                     dt_region->sz = chip->dt_region_rd[j].sz;
> >
> > Just replace with "dw->chip->..."
> >
> > >               }
> > >
> > >               dw_edma_v0_core_device_config(chan);
> > > @@ -840,16 +841,16 @@ static int dw_edma_irq_request(struct dw_edma_chip *chip,
> > >
> > >       ch_cnt = dw->wr_ch_cnt + dw->rd_ch_cnt;
> > >
> >
> > > -     if (dw->nr_irqs < 1)
> > > +     if (chip->nr_irqs < 1)
> > >               return -EINVAL;
> > >
> > > -     if (dw->nr_irqs == 1) {
> > > +     if (chip->nr_irqs == 1) {
> > >               /* Common IRQ shared among all channels */
> > > -             irq = dw->ops->irq_vector(dev, 0);
> > > +             irq = chip->ops->irq_vector(dev, 0);
> > >               err = request_irq(irq, dw_edma_interrupt_common,
> > >                                 IRQF_SHARED, dw->name, &dw->irq[0]);
> > >               if (err) {
> > > -                     dw->nr_irqs = 0;
> > > +                     chip->nr_irqs = 0;
> > >                       return err;
> > >               }
> > >
> > > @@ -857,7 +858,7 @@ static int dw_edma_irq_request(struct dw_edma_chip *chip,
> > >                       get_cached_msi_msg(irq, &dw->irq[0].msi);
> > >       } else {
> > >               /* Distribute IRQs equally among all channels */
> > > -             int tmp = dw->nr_irqs;
> > > +             int tmp = chip->nr_irqs;
> > >
> > >               while (tmp && (*wr_alloc + *rd_alloc) < ch_cnt) {
> > >                       dw_edma_dec_irq_alloc(&tmp, wr_alloc, dw->wr_ch_cnt);
> > > @@ -868,7 +869,7 @@ static int dw_edma_irq_request(struct dw_edma_chip *chip,
> > >               dw_edma_add_irq_mask(&rd_mask, *rd_alloc, dw->rd_ch_cnt);
> > >
> > >               for (i = 0; i < (*wr_alloc + *rd_alloc); i++) {
> > > -                     irq = dw->ops->irq_vector(dev, i);
> > > +                     irq = chip->ops->irq_vector(dev, i);
> > >                       err = request_irq(irq,
> > >                                         i < *wr_alloc ?
> > >                                               dw_edma_interrupt_write :
> > > @@ -876,7 +877,7 @@ static int dw_edma_irq_request(struct dw_edma_chip *chip,
> > >                                         IRQF_SHARED, dw->name,
> > >                                         &dw->irq[i]);
> > >                       if (err) {
> > > -                             dw->nr_irqs = i;
> > > +                             chip->nr_irqs = i;
> > >                               return err;
> > >                       }
> > >
> > > @@ -884,7 +885,7 @@ static int dw_edma_irq_request(struct dw_edma_chip *chip,
> > >                               get_cached_msi_msg(irq, &dw->irq[i].msi);
> > >               }
> > >
> > > -             dw->nr_irqs = i;
> > > +             chip->nr_irqs = i;
> >
> > ditto
> >
> > >       }
> > >
> > >       return err;
> > > @@ -905,18 +906,24 @@ int dw_edma_probe(struct dw_edma_chip *chip)
> > >       if (!dev)
> > >               return -EINVAL;
> > >
> > > -     dw = chip->dw;
> > > -     if (!dw || !dw->irq || !dw->ops || !dw->ops->irq_vector)
> > > +     dw = devm_kzalloc(dev, sizeof(*dw), GFP_KERNEL);
> > > +     if (!dw)
> > > +             return -ENOMEM;
> > > +
> >
> > > +     chip->dw = dw;
> >
> > Convert this to "dw->chip = chip".
> >
> > > +
> > > +     if (!chip->nr_irqs || !chip->ops)
> > >               return -EINVAL;
> >
> > Move this to be performed before the pointer initialization, since
> > it's pointless to initialize anything if invalid data is passed.
> > You can join it in with the "if (!dev)" statement.
> >
> > >
> > >       raw_spin_lock_init(&dw->lock);
> > >
> > > -     dw->wr_ch_cnt = min_t(u16, dw->wr_ch_cnt,
> > > -                           dw_edma_v0_core_ch_count(dw, EDMA_DIR_WRITE));
> > > +
> >
> > > +     dw->wr_ch_cnt = min_t(u16, chip->ll_wr_cnt,
> > > +                           dw_edma_v0_core_ch_count(chip, EDMA_DIR_WRITE));
> > >       dw->wr_ch_cnt = min_t(u16, dw->wr_ch_cnt, EDMA_MAX_WR_CH);
> > >
> > > -     dw->rd_ch_cnt = min_t(u16, dw->rd_ch_cnt,
> > > -                           dw_edma_v0_core_ch_count(dw, EDMA_DIR_READ));
> > > +     dw->rd_ch_cnt = min_t(u16, chip->ll_rd_cnt,
> >
> > Regarding the field naming please see my comment to the dw_edma_chip
> > structure.
> >
> > > +                           dw_edma_v0_core_ch_count(chip, EDMA_DIR_READ));
> > >       dw->rd_ch_cnt = min_t(u16, dw->rd_ch_cnt, EDMA_MAX_RD_CH);
> > >
> > >       if (!dw->wr_ch_cnt && !dw->rd_ch_cnt)
> > > @@ -934,7 +941,11 @@ int dw_edma_probe(struct dw_edma_chip *chip)
> > >       snprintf(dw->name, sizeof(dw->name), "dw-edma-core:%d", chip->id);
> > >
> > >       /* Disable eDMA, only to establish the ideal initial conditions */
> >
> > > -     dw_edma_v0_core_off(dw);
> > > +     dw_edma_v0_core_off(chip);
> > > +
> > > +     dw->irq = devm_kcalloc(dev, chip->nr_irqs, sizeof(*dw->irq), GFP_KERNEL);
> > > +     if (!dw->irq)
> > > +             return -ENOMEM;
> >
> > ditto
> >
> > >
> > >       /* Request IRQs */
> > >       err = dw_edma_irq_request(chip, &wr_alloc, &rd_alloc);
> > > @@ -960,10 +971,10 @@ int dw_edma_probe(struct dw_edma_chip *chip)
> > >       return 0;
> > >
> > >  err_irq_free:
> >
> > > -     for (i = (dw->nr_irqs - 1); i >= 0; i--)
> > > -             free_irq(dw->ops->irq_vector(dev, i), &dw->irq[i]);
> > > +     for (i = (chip->nr_irqs - 1); i >= 0; i--)
> > > +             free_irq(chip->ops->irq_vector(dev, i), &dw->irq[i]);
> > >
> > > -     dw->nr_irqs = 0;
> > > +     chip->nr_irqs = 0;
> >
> > dw->chip->...
> >
> > >
> > >       return err;
> > >  }
> > > @@ -977,11 +988,11 @@ int dw_edma_remove(struct dw_edma_chip *chip)
> > >       int i;
> > >
> > >       /* Disable eDMA */
> >
> > > -     dw_edma_v0_core_off(dw);
> > > +     dw_edma_v0_core_off(chip);
> >
> > Won't need this.
> >
> > >
> > >       /* Free irqs */
> > > -     for (i = (dw->nr_irqs - 1); i >= 0; i--)
> > > -             free_irq(dw->ops->irq_vector(dev, i), &dw->irq[i]);
> > > +     for (i = (chip->nr_irqs - 1); i >= 0; i--)
> > > +             free_irq(chip->ops->irq_vector(dev, i), &dw->irq[i]);
> >
> > Use "dw->chip->..."
> >
> > >
> > >       /* Power management */
> > >       pm_runtime_disable(dev);
> > > diff --git a/drivers/dma/dw-edma/dw-edma-core.h b/drivers/dma/dw-edma/dw-edma-core.h
> > > index 60316d408c3e0..885f6719c9462 100644
> > > --- a/drivers/dma/dw-edma/dw-edma-core.h
> > > +++ b/drivers/dma/dw-edma/dw-edma-core.h
> > > @@ -15,20 +15,12 @@
> > >  #include "../virt-dma.h"
> > >
> > >  #define EDMA_LL_SZ                                   24
> > > -#define EDMA_MAX_WR_CH                                       8
> > > -#define EDMA_MAX_RD_CH                                       8
> > >
> > >  enum dw_edma_dir {
> > >       EDMA_DIR_WRITE = 0,
> > >       EDMA_DIR_READ
> > >  };
> > >
> > > -enum dw_edma_map_format {
> > > -     EDMA_MF_EDMA_LEGACY = 0x0,
> > > -     EDMA_MF_EDMA_UNROLL = 0x1,
> > > -     EDMA_MF_HDMA_COMPAT = 0x5
> > > -};
> > > -
> > >  enum dw_edma_request {
> > >       EDMA_REQ_NONE = 0,
> > >       EDMA_REQ_STOP,
> > > @@ -57,12 +49,6 @@ struct dw_edma_burst {
> > >       u32                             sz;
> > >  };
> > >
> > > -struct dw_edma_region {
> > > -     phys_addr_t                     paddr;
> > > -     void                            __iomem *vaddr;
> > > -     size_t                          sz;
> > > -};
> > > -
> > >  struct dw_edma_chunk {
> > >       struct list_head                list;
> > >       struct dw_edma_chan             *chan;
> > > @@ -106,11 +92,7 @@ struct dw_edma_irq {
> > >       struct msi_msg                  msi;
> > >       u32                             wr_mask;
> > >       u32                             rd_mask;
> > > -     struct dw_edma                  *dw;
> > > -};
> > > -
> > > -struct dw_edma_core_ops {
> > > -     int     (*irq_vector)(struct device *dev, unsigned int nr);
> > > +     struct dw_edma_chip             *chip;
> > >  };
> > >
> > >  struct dw_edma {
> > > @@ -122,19 +104,9 @@ struct dw_edma {
> > >       struct dma_device               rd_edma;
> > >       u16                             rd_ch_cnt;
> > >
> >
> > > -     struct dw_edma_region           rg_region;      /* Registers */
> >
> > AFAICS you replaced this with void __iomem *reg_base further in the
> > dw_edma_chip structure. Even though I do agree with this modification,
> > it's conceptually right, but the alteration is unrelated to the patch
> > topic. So please unpin it to a dedicated patch placed before this one
> > in the series.
> >
> > > -     struct dw_edma_region           ll_region_wr[EDMA_MAX_WR_CH];
> > > -     struct dw_edma_region           ll_region_rd[EDMA_MAX_RD_CH];
> > > -     struct dw_edma_region           dt_region_wr[EDMA_MAX_WR_CH];
> > > -     struct dw_edma_region           dt_region_rd[EDMA_MAX_RD_CH];
> > > -
> > >       struct dw_edma_irq              *irq;
> > > -     int                             nr_irqs;
> > > -
> > > -     enum dw_edma_map_format         mf;
> > >
> > >       struct dw_edma_chan             *chan;
> > > -     const struct dw_edma_core_ops   *ops;
> > >
> > >       raw_spinlock_t                  lock;           /* Only for legacy */
> > >  #ifdef CONFIG_DEBUG_FS
> > > diff --git a/drivers/dma/dw-edma/dw-edma-v0-core.c b/drivers/dma/dw-edma/dw-edma-v0-core.c
> > > index 329fc2e57b703..6e2f83e31a03a 100644
> > > --- a/drivers/dma/dw-edma/dw-edma-v0-core.c
> > > +++ b/drivers/dma/dw-edma/dw-edma-v0-core.c
> > > @@ -23,92 +23,94 @@ enum dw_edma_control {
> > >       DW_EDMA_V0_LLE                                  = BIT(9),
> > >  };
> > >
> >
> > > -static inline struct dw_edma_v0_regs __iomem *__dw_regs(struct dw_edma *dw)
> > > +static inline struct dw_edma_v0_regs __iomem *__dw_regs(struct dw_edma_chip *chip)
> > >  {
> > > -     return dw->rg_region.vaddr;
> > > +     return chip->reg_base;
> > >  }
> >
> > Just use "dw->chip->reg_base" here and you won't need to introduce the
> > most of the modifications below, since all of the them is connected
> > with the __dw_regs() function prototype change.
> >
> > >
> > > -#define SET_32(dw, name, value)                              \
> > > -     writel(value, &(__dw_regs(dw)->name))
> > > +#define SET_32(chip, name, value)                            \
> > > +     writel(value, &(__dw_regs(chip)->name))
> > >
> > > -#define GET_32(dw, name)                             \
> > > -     readl(&(__dw_regs(dw)->name))
> > > +#define GET_32(chip, name)                           \
> > > +     readl(&(__dw_regs(chip)->name))
> > >
> > > -#define SET_RW_32(dw, dir, name, value)                      \
> > > +#define SET_RW_32(chip, dir, name, value)                    \
> > >       do {                                            \
> > >               if ((dir) == EDMA_DIR_WRITE)            \
> > > -                     SET_32(dw, wr_##name, value);   \
> > > +                     SET_32(chip, wr_##name, value); \
> > >               else                                    \
> > > -                     SET_32(dw, rd_##name, value);   \
> > > +                     SET_32(chip, rd_##name, value); \
> > >       } while (0)
> > >
> > > -#define GET_RW_32(dw, dir, name)                     \
> > > +#define GET_RW_32(chip, dir, name)                   \
> > >       ((dir) == EDMA_DIR_WRITE                        \
> > > -       ? GET_32(dw, wr_##name)                       \
> > > -       : GET_32(dw, rd_##name))
> > > +       ? GET_32(chip, wr_##name)                     \
> > > +       : GET_32(chip, rd_##name))
> > >
> > > -#define SET_BOTH_32(dw, name, value)                 \
> > > +#define SET_BOTH_32(chip, name, value)                       \
> > >       do {                                            \
> > > -             SET_32(dw, wr_##name, value);           \
> > > -             SET_32(dw, rd_##name, value);           \
> > > +             SET_32(chip, wr_##name, value);         \
> > > +             SET_32(chip, rd_##name, value);         \
> > >       } while (0)
> > >
> > >  #ifdef CONFIG_64BIT
> > >
> > > -#define SET_64(dw, name, value)                              \
> > > -     writeq(value, &(__dw_regs(dw)->name))
> > > +#define SET_64(chip, name, value)                            \
> > > +     writeq(value, &(__dw_regs(chip)->name))
> > >
> > > -#define GET_64(dw, name)                             \
> > > -     readq(&(__dw_regs(dw)->name))
> > > +#define GET_64(chip, name)                           \
> > > +     readq(&(__dw_regs(chip)->name))
> > >
> > > -#define SET_RW_64(dw, dir, name, value)                      \
> > > +#define SET_RW_64(chip, dir, name, value)                    \
> > >       do {                                            \
> > >               if ((dir) == EDMA_DIR_WRITE)            \
> > > -                     SET_64(dw, wr_##name, value);   \
> > > +                     SET_64(chip, wr_##name, value); \
> > >               else                                    \
> > > -                     SET_64(dw, rd_##name, value);   \
> > > +                     SET_64(chip, rd_##name, value); \
> > >       } while (0)
> > >
> > > -#define GET_RW_64(dw, dir, name)                     \
> > > +#define GET_RW_64(chip, dir, name)                   \
> > >       ((dir) == EDMA_DIR_WRITE                        \
> > > -       ? GET_64(dw, wr_##name)                       \
> > > -       : GET_64(dw, rd_##name))
> > > +       ? GET_64(chip, wr_##name)                     \
> > > +       : GET_64(chip, rd_##name))
> > >
> > > -#define SET_BOTH_64(dw, name, value)                 \
> > > +#define SET_BOTH_64(chip, name, value)                       \
> > >       do {                                            \
> > > -             SET_64(dw, wr_##name, value);           \
> > > -             SET_64(dw, rd_##name, value);           \
> > > +             SET_64(chip, wr_##name, value);         \
> > > +             SET_64(chip, rd_##name, value);         \
> > >       } while (0)
> > >
> > >  #endif /* CONFIG_64BIT */
> > >
> > > -#define SET_COMPAT(dw, name, value)                  \
> > > -     writel(value, &(__dw_regs(dw)->type.unroll.name))
> > > +#define SET_COMPAT(chip, name, value)                        \
> > > +     writel(value, &(__dw_regs(chip)->type.unroll.name))
> > >
> > > -#define SET_RW_COMPAT(dw, dir, name, value)          \
> > > +#define SET_RW_COMPAT(chip, dir, name, value)                \
> > >       do {                                            \
> > >               if ((dir) == EDMA_DIR_WRITE)            \
> > > -                     SET_COMPAT(dw, wr_##name, value); \
> > > +                     SET_COMPAT(chip, wr_##name, value); \
> > >               else                                    \
> > > -                     SET_COMPAT(dw, rd_##name, value); \
> > > +                     SET_COMPAT(chip, rd_##name, value); \
> > >       } while (0)
> > >
> > >  static inline struct dw_edma_v0_ch_regs __iomem *
> > > -__dw_ch_regs(struct dw_edma *dw, enum dw_edma_dir dir, u16 ch)
> > > +__dw_ch_regs(struct dw_edma_chip *chip, enum dw_edma_dir dir, u16 ch)
> > >  {
> > > -     if (dw->mf == EDMA_MF_EDMA_LEGACY)
> > > -             return &(__dw_regs(dw)->type.legacy.ch);
> > > +     if (chip->mf == EDMA_MF_EDMA_LEGACY)
> > > +             return &(__dw_regs(chip)->type.legacy.ch);
> > >
> > >       if (dir == EDMA_DIR_WRITE)
> > > -             return &__dw_regs(dw)->type.unroll.ch[ch].wr;
> > > +             return &__dw_regs(chip)->type.unroll.ch[ch].wr;
> > >
> > > -     return &__dw_regs(dw)->type.unroll.ch[ch].rd;
> > > +     return &__dw_regs(chip)->type.unroll.ch[ch].rd;
> > >  }
> > >
> > > -static inline void writel_ch(struct dw_edma *dw, enum dw_edma_dir dir, u16 ch,
> > > +static inline void writel_ch(struct dw_edma_chip *chip, enum dw_edma_dir dir, u16 ch,
> > >                            u32 value, void __iomem *addr)
> > >  {
> > > -     if (dw->mf == EDMA_MF_EDMA_LEGACY) {
> > > +     struct dw_edma *dw = chip->dw;
> > > +
> > > +     if (chip->mf == EDMA_MF_EDMA_LEGACY) {
> > >               u32 viewport_sel;
> > >               unsigned long flags;
> > >
> > > @@ -119,7 +121,7 @@ static inline void writel_ch(struct dw_edma *dw, enum dw_edma_dir dir, u16 ch,
> > >                       viewport_sel |= BIT(31);
> > >
> > >               writel(viewport_sel,
> > > -                    &(__dw_regs(dw)->type.legacy.viewport_sel));
> > > +                    &(__dw_regs(chip)->type.legacy.viewport_sel));
> > >               writel(value, addr);
> > >
> > >               raw_spin_unlock_irqrestore(&dw->lock, flags);
> > > @@ -128,12 +130,13 @@ static inline void writel_ch(struct dw_edma *dw, enum dw_edma_dir dir, u16 ch,
> > >       }
> > >  }
> > >
> > > -static inline u32 readl_ch(struct dw_edma *dw, enum dw_edma_dir dir, u16 ch,
> > > +static inline u32 readl_ch(struct dw_edma_chip *chip, enum dw_edma_dir dir, u16 ch,
> > >                          const void __iomem *addr)
> > >  {
> > > +     struct dw_edma *dw = chip->dw;
> > >       u32 value;
> > >
> > > -     if (dw->mf == EDMA_MF_EDMA_LEGACY) {
> > > +     if (chip->mf == EDMA_MF_EDMA_LEGACY) {
> > >               u32 viewport_sel;
> > >               unsigned long flags;
> > >
> > > @@ -144,7 +147,7 @@ static inline u32 readl_ch(struct dw_edma *dw, enum dw_edma_dir dir, u16 ch,
> > >                       viewport_sel |= BIT(31);
> > >
> > >               writel(viewport_sel,
> > > -                    &(__dw_regs(dw)->type.legacy.viewport_sel));
> > > +                    &(__dw_regs(chip)->type.legacy.viewport_sel));
> > >               value = readl(addr);
> > >
> > >               raw_spin_unlock_irqrestore(&dw->lock, flags);
> > > @@ -166,10 +169,12 @@ static inline u32 readl_ch(struct dw_edma *dw, enum dw_edma_dir dir, u16 ch,
> > >
> > >  #ifdef CONFIG_64BIT
> > >
> > > -static inline void writeq_ch(struct dw_edma *dw, enum dw_edma_dir dir, u16 ch,
> > > +static inline void writeq_ch(struct dw_edma_chip *chip, enum dw_edma_dir dir, u16 ch,
> > >                            u64 value, void __iomem *addr)
> > >  {
> > > -     if (dw->mf == EDMA_MF_EDMA_LEGACY) {
> > > +     struct dw_edma *dw = chip->dw;
> > > +
> > > +     if (chip->mf == EDMA_MF_EDMA_LEGACY) {
> > >               u32 viewport_sel;
> > >               unsigned long flags;
> > >
> > > @@ -180,7 +185,7 @@ static inline void writeq_ch(struct dw_edma *dw, enum dw_edma_dir dir, u16 ch,
> > >                       viewport_sel |= BIT(31);
> > >
> > >               writel(viewport_sel,
> > > -                    &(__dw_regs(dw)->type.legacy.viewport_sel));
> > > +                    &(__dw_regs(chip)->type.legacy.viewport_sel));
> > >               writeq(value, addr);
> > >
> > >               raw_spin_unlock_irqrestore(&dw->lock, flags);
> > > @@ -189,12 +194,13 @@ static inline void writeq_ch(struct dw_edma *dw, enum dw_edma_dir dir, u16 ch,
> > >       }
> > >  }
> > >
> > > -static inline u64 readq_ch(struct dw_edma *dw, enum dw_edma_dir dir, u16 ch,
> > > +static inline u64 readq_ch(struct dw_edma_chip *chip, enum dw_edma_dir dir, u16 ch,
> > >                          const void __iomem *addr)
> > >  {
> > > +     struct dw_edma *dw = chip->dw;
> > >       u32 value;
> > >
> > > -     if (dw->mf == EDMA_MF_EDMA_LEGACY) {
> > > +     if (chip->mf == EDMA_MF_EDMA_LEGACY) {
> > >               u32 viewport_sel;
> > >               unsigned long flags;
> > >
> > > @@ -205,7 +211,7 @@ static inline u64 readq_ch(struct dw_edma *dw, enum dw_edma_dir dir, u16 ch,
> > >                       viewport_sel |= BIT(31);
> > >
> > >               writel(viewport_sel,
> > > -                    &(__dw_regs(dw)->type.legacy.viewport_sel));
> > > +                    &(__dw_regs(chip)->type.legacy.viewport_sel));
> > >               value = readq(addr);
> > >
> > >               raw_spin_unlock_irqrestore(&dw->lock, flags);
> > > @@ -228,25 +234,25 @@ static inline u64 readq_ch(struct dw_edma *dw, enum dw_edma_dir dir, u16 ch,
> > >  #endif /* CONFIG_64BIT */
> > >
> > >  /* eDMA management callbacks */
> > > -void dw_edma_v0_core_off(struct dw_edma *dw)
> > > +void dw_edma_v0_core_off(struct dw_edma_chip *chip)
> > >  {
> > > -     SET_BOTH_32(dw, int_mask,
> > > +     SET_BOTH_32(chip, int_mask,
> > >                   EDMA_V0_DONE_INT_MASK | EDMA_V0_ABORT_INT_MASK);
> > > -     SET_BOTH_32(dw, int_clear,
> > > +     SET_BOTH_32(chip, int_clear,
> > >                   EDMA_V0_DONE_INT_MASK | EDMA_V0_ABORT_INT_MASK);
> > > -     SET_BOTH_32(dw, engine_en, 0);
> > > +     SET_BOTH_32(chip, engine_en, 0);
> > >  }
> > >
> > > -u16 dw_edma_v0_core_ch_count(struct dw_edma *dw, enum dw_edma_dir dir)
> > > +u16 dw_edma_v0_core_ch_count(struct dw_edma_chip *chip, enum dw_edma_dir dir)
> > >  {
> > >       u32 num_ch;
> > >
> > >       if (dir == EDMA_DIR_WRITE)
> > >               num_ch = FIELD_GET(EDMA_V0_WRITE_CH_COUNT_MASK,
> > > -                                GET_32(dw, ctrl));
> > > +                                GET_32(chip, ctrl));
> > >       else
> > >               num_ch = FIELD_GET(EDMA_V0_READ_CH_COUNT_MASK,
> > > -                                GET_32(dw, ctrl));
> > > +                                GET_32(chip, ctrl));
> > >
> > >       if (num_ch > EDMA_V0_MAX_NR_CH)
> > >               num_ch = EDMA_V0_MAX_NR_CH;
> > > @@ -256,11 +262,11 @@ u16 dw_edma_v0_core_ch_count(struct dw_edma *dw, enum dw_edma_dir dir)
> >
> > So can omit most of the changes from the comment above and up to this
> > comment and use "dw->chip->..." where it's required.
> >
> > >
> > >  enum dma_status dw_edma_v0_core_ch_status(struct dw_edma_chan *chan)
> > >  {
> >
> > > -     struct dw_edma *dw = chan->chip->dw;
> > > +     struct dw_edma_chip *chip = chan->chip;
> >
> > Just use "dw = chan->dw" here or directly use "chan->dw" in the
> > method.
> >
> > >       u32 tmp;
> > >
> > >       tmp = FIELD_GET(EDMA_V0_CH_STATUS_MASK,
> > > -                     GET_CH_32(dw, chan->dir, chan->id, ch_control1));
> > > +                     GET_CH_32(chip, chan->dir, chan->id, ch_control1));
> > >
> > >       if (tmp == 1)
> > >               return DMA_IN_PROGRESS;
> > > @@ -272,30 +278,30 @@ enum dma_status dw_edma_v0_core_ch_status(struct dw_edma_chan *chan)
> > >
> > >  void dw_edma_v0_core_clear_done_int(struct dw_edma_chan *chan)
> > >  {
> >
> > > -     struct dw_edma *dw = chan->chip->dw;
> > > +     struct dw_edma_chip *chip = chan->chip;
> >
> > ditto
> >
> > >
> > > -     SET_RW_32(dw, chan->dir, int_clear,
> > > +     SET_RW_32(chip, chan->dir, int_clear,
> > >                 FIELD_PREP(EDMA_V0_DONE_INT_MASK, BIT(chan->id)));
> > >  }
> > >
> > >  void dw_edma_v0_core_clear_abort_int(struct dw_edma_chan *chan)
> > >  {
> >
> > > -     struct dw_edma *dw = chan->chip->dw;
> > > +     struct dw_edma_chip *chip = chan->chip;
> >
> > ditto
> >
> > >
> >
> > > -     SET_RW_32(dw, chan->dir, int_clear,
> > > +     SET_RW_32(chip, chan->dir, int_clear,
> > >                 FIELD_PREP(EDMA_V0_ABORT_INT_MASK, BIT(chan->id)));
> > >  }
> > >
> > > -u32 dw_edma_v0_core_status_done_int(struct dw_edma *dw, enum dw_edma_dir dir)
> > > +u32 dw_edma_v0_core_status_done_int(struct dw_edma_chip *chip, enum dw_edma_dir dir)
> > >  {
> > >       return FIELD_GET(EDMA_V0_DONE_INT_MASK,
> > > -                      GET_RW_32(dw, dir, int_status));
> > > +                      GET_RW_32(chip, dir, int_status));
> > >  }
> > >
> > > -u32 dw_edma_v0_core_status_abort_int(struct dw_edma *dw, enum dw_edma_dir dir)
> > > +u32 dw_edma_v0_core_status_abort_int(struct dw_edma_chip *chip, enum dw_edma_dir dir)
> > >  {
> > >       return FIELD_GET(EDMA_V0_ABORT_INT_MASK,
> > > -                      GET_RW_32(dw, dir, int_status));
> > > +                      GET_RW_32(chip, dir, int_status));
> >
> > Won't be needed
> >
> > >  }
> > >
> > >  static void dw_edma_v0_core_write_chunk(struct dw_edma_chunk *chunk)
> > > @@ -357,109 +363,109 @@ static void dw_edma_v0_core_write_chunk(struct dw_edma_chunk *chunk)
> > >  void dw_edma_v0_core_start(struct dw_edma_chunk *chunk, bool first)
> > >  {
> > >       struct dw_edma_chan *chan = chunk->chan;
> >
> > > -     struct dw_edma *dw = chan->chip->dw;
> > > +     struct dw_edma_chip *chip = chan->chip;
> >
> > Just replace with "dw = chan->dw" or directly use "chan->dw" in the
> > method. Thus you can omit the alterations below.
> >
> > >       u32 tmp;
> > >
> > >       dw_edma_v0_core_write_chunk(chunk);
> > >
> > >       if (first) {
> > >               /* Enable engine */
> > > -             SET_RW_32(dw, chan->dir, engine_en, BIT(0));
> > > -             if (dw->mf == EDMA_MF_HDMA_COMPAT) {
> > > +             SET_RW_32(chip, chan->dir, engine_en, BIT(0));
> > > +             if (chip->mf == EDMA_MF_HDMA_COMPAT) {
> > >                       switch (chan->id) {
> > >                       case 0:
> > > -                             SET_RW_COMPAT(dw, chan->dir, ch0_pwr_en,
> > > +                             SET_RW_COMPAT(chip, chan->dir, ch0_pwr_en,
> > >                                             BIT(0));
> > >                               break;
> > >                       case 1:
> > > -                             SET_RW_COMPAT(dw, chan->dir, ch1_pwr_en,
> > > +                             SET_RW_COMPAT(chip, chan->dir, ch1_pwr_en,
> > >                                             BIT(0));
> > >                               break;
> > >                       case 2:
> > > -                             SET_RW_COMPAT(dw, chan->dir, ch2_pwr_en,
> > > +                             SET_RW_COMPAT(chip, chan->dir, ch2_pwr_en,
> > >                                             BIT(0));
> > >                               break;
> > >                       case 3:
> > > -                             SET_RW_COMPAT(dw, chan->dir, ch3_pwr_en,
> > > +                             SET_RW_COMPAT(chip, chan->dir, ch3_pwr_en,
> > >                                             BIT(0));
> > >                               break;
> > >                       case 4:
> > > -                             SET_RW_COMPAT(dw, chan->dir, ch4_pwr_en,
> > > +                             SET_RW_COMPAT(chip, chan->dir, ch4_pwr_en,
> > >                                             BIT(0));
> > >                               break;
> > >                       case 5:
> > > -                             SET_RW_COMPAT(dw, chan->dir, ch5_pwr_en,
> > > +                             SET_RW_COMPAT(chip, chan->dir, ch5_pwr_en,
> > >                                             BIT(0));
> > >                               break;
> > >                       case 6:
> > > -                             SET_RW_COMPAT(dw, chan->dir, ch6_pwr_en,
> > > +                             SET_RW_COMPAT(chip, chan->dir, ch6_pwr_en,
> > >                                             BIT(0));
> > >                               break;
> > >                       case 7:
> > > -                             SET_RW_COMPAT(dw, chan->dir, ch7_pwr_en,
> > > +                             SET_RW_COMPAT(chip, chan->dir, ch7_pwr_en,
> > >                                             BIT(0));
> > >                               break;
> > >                       }
> > >               }
> > >               /* Interrupt unmask - done, abort */
> > > -             tmp = GET_RW_32(dw, chan->dir, int_mask);
> > > +             tmp = GET_RW_32(chip, chan->dir, int_mask);
> > >               tmp &= ~FIELD_PREP(EDMA_V0_DONE_INT_MASK, BIT(chan->id));
> > >               tmp &= ~FIELD_PREP(EDMA_V0_ABORT_INT_MASK, BIT(chan->id));
> > > -             SET_RW_32(dw, chan->dir, int_mask, tmp);
> > > +             SET_RW_32(chip, chan->dir, int_mask, tmp);
> > >               /* Linked list error */
> > > -             tmp = GET_RW_32(dw, chan->dir, linked_list_err_en);
> > > +             tmp = GET_RW_32(chip, chan->dir, linked_list_err_en);
> > >               tmp |= FIELD_PREP(EDMA_V0_LINKED_LIST_ERR_MASK, BIT(chan->id));
> > > -             SET_RW_32(dw, chan->dir, linked_list_err_en, tmp);
> > > +             SET_RW_32(chip, chan->dir, linked_list_err_en, tmp);
> > >               /* Channel control */
> > > -             SET_CH_32(dw, chan->dir, chan->id, ch_control1,
> > > +             SET_CH_32(chip, chan->dir, chan->id, ch_control1,
> > >                         (DW_EDMA_V0_CCS | DW_EDMA_V0_LLE));
> > >               /* Linked list */
> > >               #ifdef CONFIG_64BIT
> > > -                     SET_CH_64(dw, chan->dir, chan->id, llp.reg,
> > > +                     SET_CH_64(chip, chan->dir, chan->id, llp.reg,
> > >                                 chunk->ll_region.paddr);
> > >               #else /* CONFIG_64BIT */
> > > -                     SET_CH_32(dw, chan->dir, chan->id, llp.lsb,
> > > +                     SET_CH_32(chip, chan->dir, chan->id, llp.lsb,
> > >                                 lower_32_bits(chunk->ll_region.paddr));
> > > -                     SET_CH_32(dw, chan->dir, chan->id, llp.msb,
> > > +                     SET_CH_32(chip, chan->dir, chan->id, llp.msb,
> > >                                 upper_32_bits(chunk->ll_region.paddr));
> > >               #endif /* CONFIG_64BIT */
> > >       }
> > >       /* Doorbell */
> > > -     SET_RW_32(dw, chan->dir, doorbell,
> > > +     SET_RW_32(chip, chan->dir, doorbell,
> > >                 FIELD_PREP(EDMA_V0_DOORBELL_CH_MASK, chan->id));
> > >  }
> >
> > You can drop the changes from the previous comment up to this one.
> >
> > >
> > >  int dw_edma_v0_core_device_config(struct dw_edma_chan *chan)
> > >  {
> >
> > > -     struct dw_edma *dw = chan->chip->dw;
> > > +     struct dw_edma_chip *chip = chan->chip;
> >
> > Use "chan->dw" here.
> >
> > >       u32 tmp = 0;
> > >
> > >       /* MSI done addr - low, high */
> > > -     SET_RW_32(dw, chan->dir, done_imwr.lsb, chan->msi.address_lo);
> > > -     SET_RW_32(dw, chan->dir, done_imwr.msb, chan->msi.address_hi);
> > > +     SET_RW_32(chip, chan->dir, done_imwr.lsb, chan->msi.address_lo);
> > > +     SET_RW_32(chip, chan->dir, done_imwr.msb, chan->msi.address_hi);
> > >       /* MSI abort addr - low, high */
> > > -     SET_RW_32(dw, chan->dir, abort_imwr.lsb, chan->msi.address_lo);
> > > -     SET_RW_32(dw, chan->dir, abort_imwr.msb, chan->msi.address_hi);
> > > +     SET_RW_32(chip, chan->dir, abort_imwr.lsb, chan->msi.address_lo);
> > > +     SET_RW_32(chip, chan->dir, abort_imwr.msb, chan->msi.address_hi);
> > >       /* MSI data - low, high */
> > >       switch (chan->id) {
> > >       case 0:
> > >       case 1:
> > > -             tmp = GET_RW_32(dw, chan->dir, ch01_imwr_data);
> > > +             tmp = GET_RW_32(chip, chan->dir, ch01_imwr_data);
> > >               break;
> > >
> > >       case 2:
> > >       case 3:
> > > -             tmp = GET_RW_32(dw, chan->dir, ch23_imwr_data);
> > > +             tmp = GET_RW_32(chip, chan->dir, ch23_imwr_data);
> > >               break;
> > >
> > >       case 4:
> > >       case 5:
> > > -             tmp = GET_RW_32(dw, chan->dir, ch45_imwr_data);
> > > +             tmp = GET_RW_32(chip, chan->dir, ch45_imwr_data);
> > >               break;
> > >
> > >       case 6:
> > >       case 7:
> > > -             tmp = GET_RW_32(dw, chan->dir, ch67_imwr_data);
> > > +             tmp = GET_RW_32(chip, chan->dir, ch67_imwr_data);
> > >               break;
> > >       }
> > >
> > > @@ -478,22 +484,22 @@ int dw_edma_v0_core_device_config(struct dw_edma_chan *chan)
> > >       switch (chan->id) {
> > >       case 0:
> > >       case 1:
> > > -             SET_RW_32(dw, chan->dir, ch01_imwr_data, tmp);
> > > +             SET_RW_32(chip, chan->dir, ch01_imwr_data, tmp);
> > >               break;
> > >
> > >       case 2:
> > >       case 3:
> > > -             SET_RW_32(dw, chan->dir, ch23_imwr_data, tmp);
> > > +             SET_RW_32(chip, chan->dir, ch23_imwr_data, tmp);
> > >               break;
> > >
> > >       case 4:
> > >       case 5:
> > > -             SET_RW_32(dw, chan->dir, ch45_imwr_data, tmp);
> > > +             SET_RW_32(chip, chan->dir, ch45_imwr_data, tmp);
> > >               break;
> > >
> > >       case 6:
> > >       case 7:
> > > -             SET_RW_32(dw, chan->dir, ch67_imwr_data, tmp);
> > > +             SET_RW_32(chip, chan->dir, ch67_imwr_data, tmp);
> > >               break;
> >
> > The changes above won't be needed if you keep using the dw pointer
> > here as I suggest.
> >
> > >       }
> > >
> > > diff --git a/drivers/dma/dw-edma/dw-edma-v0-core.h b/drivers/dma/dw-edma/dw-edma-v0-core.h
> > > index 2afa626b8300c..01a29c74c0c43 100644
> > > --- a/drivers/dma/dw-edma/dw-edma-v0-core.h
> > > +++ b/drivers/dma/dw-edma/dw-edma-v0-core.h
> > > @@ -12,13 +12,13 @@
> > >  #include <linux/dma/edma.h>
> > >
> > >  /* eDMA management callbacks */
> >
> > > -void dw_edma_v0_core_off(struct dw_edma *chan);
> > > -u16 dw_edma_v0_core_ch_count(struct dw_edma *chan, enum dw_edma_dir dir);
> > > +void dw_edma_v0_core_off(struct dw_edma_chip *chip);
> > > +u16 dw_edma_v0_core_ch_count(struct dw_edma_chip *chip, enum dw_edma_dir dir);
> > >  enum dma_status dw_edma_v0_core_ch_status(struct dw_edma_chan *chan);
> > >  void dw_edma_v0_core_clear_done_int(struct dw_edma_chan *chan);
> > >  void dw_edma_v0_core_clear_abort_int(struct dw_edma_chan *chan);
> > > -u32 dw_edma_v0_core_status_done_int(struct dw_edma *chan, enum dw_edma_dir dir);
> > > -u32 dw_edma_v0_core_status_abort_int(struct dw_edma *chan, enum dw_edma_dir dir);
> > > +u32 dw_edma_v0_core_status_done_int(struct dw_edma_chip *chip, enum dw_edma_dir dir);
> > > +u32 dw_edma_v0_core_status_abort_int(struct dw_edma_chip *chip, enum dw_edma_dir dir);
> >
> > This modification won't be needed.
> >
> > >  void dw_edma_v0_core_start(struct dw_edma_chunk *chunk, bool first);
> > >  int dw_edma_v0_core_device_config(struct dw_edma_chan *chan);
> > >  /* eDMA debug fs callbacks */
> > > diff --git a/drivers/dma/dw-edma/dw-edma-v0-debugfs.c b/drivers/dma/dw-edma/dw-edma-v0-debugfs.c
> > > index 4b3bcffd15ef1..5819a64aceb0f 100644
> > > --- a/drivers/dma/dw-edma/dw-edma-v0-debugfs.c
> > > +++ b/drivers/dma/dw-edma/dw-edma-v0-debugfs.c
> > > @@ -38,7 +38,7 @@
> > >  #define CHANNEL_STR                          "channel"
> > >  #define REGISTERS_STR                                "registers"
> > >
> >
> > > -static struct dw_edma                                *dw;
> > > +static struct dw_edma_chip                   *chip;
> >
> > Hmmm, why on Earth is this static and global?.. What if we have more
> > than one host/EP controller with eDMA?.. Nice. I'll think on fixing
> > this if you don't want to bother...
> >
> > >  static struct dw_edma_v0_regs                        __iomem *regs;
> > >
> > >  static struct {
> > > @@ -53,8 +53,10 @@ struct debugfs_entries {
> > >
> > >  static int dw_edma_debugfs_u32_get(void *data, u64 *val)
> > >  {
> > > +     struct dw_edma *dw = chip->dw;
> > > +
> > >       void __iomem *reg = (void __force __iomem *)data;
> >
> > > -     if (dw->mf == EDMA_MF_EDMA_LEGACY &&
> > > +     if (chip->mf == EDMA_MF_EDMA_LEGACY &&
> >
> > Use "dw->chip-> ..." here
> >
> > >           reg >= (void __iomem *)&regs->type.legacy.ch) {
> > >               void __iomem *ptr = &regs->type.legacy.ch;
> > >               u32 viewport_sel = 0;
> > > @@ -127,6 +129,8 @@ static void dw_edma_debugfs_regs_ch(struct dw_edma_v0_ch_regs __iomem *regs,
> > >
> > >  static void dw_edma_debugfs_regs_wr(struct dentry *dir)
> > >  {
> > > +     struct dw_edma *dw = chip->dw;
> > > +
> > >       const struct debugfs_entries debugfs_regs[] = {
> > >               /* eDMA global registers */
> > >               WR_REGISTER(engine_en),
> > > @@ -173,7 +177,7 @@ static void dw_edma_debugfs_regs_wr(struct dentry *dir)
> > >       nr_entries = ARRAY_SIZE(debugfs_regs);
> > >       dw_edma_debugfs_create_x32(debugfs_regs, nr_entries, regs_dir);
> > >
> >
> > > -     if (dw->mf == EDMA_MF_HDMA_COMPAT) {
> > > +     if (chip->mf == EDMA_MF_HDMA_COMPAT) {
> >
> > ditto
> >
> > >               nr_entries = ARRAY_SIZE(debugfs_unroll_regs);
> > >               dw_edma_debugfs_create_x32(debugfs_unroll_regs, nr_entries,
> > >                                          regs_dir);
> > > @@ -195,6 +199,8 @@ static void dw_edma_debugfs_regs_wr(struct dentry *dir)
> > >
> > >  static void dw_edma_debugfs_regs_rd(struct dentry *dir)
> > >  {
> > > +     struct dw_edma *dw = chip->dw;
> > > +
> > >       const struct debugfs_entries debugfs_regs[] = {
> > >               /* eDMA global registers */
> > >               RD_REGISTER(engine_en),
> > > @@ -242,7 +248,7 @@ static void dw_edma_debugfs_regs_rd(struct dentry *dir)
> > >       nr_entries = ARRAY_SIZE(debugfs_regs);
> > >       dw_edma_debugfs_create_x32(debugfs_regs, nr_entries, regs_dir);
> > >
> >
> > > -     if (dw->mf == EDMA_MF_HDMA_COMPAT) {
> > > +     if (chip->mf == EDMA_MF_HDMA_COMPAT) {
> >
> > ditto
> >
> > >               nr_entries = ARRAY_SIZE(debugfs_unroll_regs);
> > >               dw_edma_debugfs_create_x32(debugfs_unroll_regs, nr_entries,
> > >                                          regs_dir);
> > > @@ -264,6 +270,7 @@ static void dw_edma_debugfs_regs_rd(struct dentry *dir)
> > >
> > >  static void dw_edma_debugfs_regs(void)
> > >  {
> > > +     struct dw_edma *dw = chip->dw;
> > >       const struct debugfs_entries debugfs_regs[] = {
> > >               REGISTER(ctrl_data_arb_prior),
> > >               REGISTER(ctrl),
> > > @@ -282,13 +289,15 @@ static void dw_edma_debugfs_regs(void)
> > >       dw_edma_debugfs_regs_rd(regs_dir);
> > >  }
> > >
> >
> > > -void dw_edma_v0_debugfs_on(struct dw_edma_chip *chip)
> > > +void dw_edma_v0_debugfs_on(struct dw_edma_chip *p)
> > >  {
> > > -     dw = chip->dw;
> > > -     if (!dw)
> > > +     struct dw_edma *dw;
> > > +     chip = p;
> > > +     if (!chip)
> > >               return;
> > >
> > > -     regs = dw->rg_region.vaddr;
> > > +     dw = chip->dw;
> > > +     regs = chip->reg_base;
> >
> > As I said this is unrelated change. Please unpin to another patch.
> >
> > >       if (!regs)
> > >               return;
> > >
> > > @@ -296,19 +305,19 @@ void dw_edma_v0_debugfs_on(struct dw_edma_chip *chip)
> > >       if (!dw->debugfs)
> > >               return;
> > >
> >
> > > -     debugfs_create_u32("mf", 0444, dw->debugfs, &dw->mf);
> > > +     debugfs_create_u32("mf", 0444, dw->debugfs, &chip->mf);
> >
> > "dw->chip->..."
> >
> > >       debugfs_create_u16("wr_ch_cnt", 0444, dw->debugfs, &dw->wr_ch_cnt);
> > >       debugfs_create_u16("rd_ch_cnt", 0444, dw->debugfs, &dw->rd_ch_cnt);
> > >
> > >       dw_edma_debugfs_regs();
> > >  }
> > >
> > > -void dw_edma_v0_debugfs_off(struct dw_edma_chip *chip)
> > > +void dw_edma_v0_debugfs_off(struct dw_edma_chip *p)
> > >  {
> > > -     dw = chip->dw;
> > > -     if (!dw)
> > > +     chip = p;
> > > +     if (!chip)
> > >               return;
> > >
> > > -     debugfs_remove_recursive(dw->debugfs);
> > > -     dw->debugfs = NULL;
> > > +     debugfs_remove_recursive(chip->dw->debugfs);
> >
> > This won't be needed.
> >
> > > +     chip->dw->debugfs = NULL;
> > >  }
> > > diff --git a/include/linux/dma/edma.h b/include/linux/dma/edma.h
> > > index cab6e18773dad..fcfbc0f47f83d 100644
> > > --- a/include/linux/dma/edma.h
> > > +++ b/include/linux/dma/edma.h
> > > @@ -12,19 +12,62 @@
> > >  #include <linux/device.h>
> > >  #include <linux/dmaengine.h>
> > >
> > > +#define EDMA_MAX_WR_CH                                  8
> > > +#define EDMA_MAX_RD_CH                                  8
> > > +
> >
> > >  struct dw_edma;
> >
> > This could be dropped.
> >
> > >
> > > +struct dw_edma_region {
> > > +     phys_addr_t     paddr;
> > > +     void __iomem    *vaddr;
> > > +     size_t          sz;
> > > +};
> > > +
> > > +struct dw_edma_core_ops {
> > > +     int (*irq_vector)(struct device *dev, unsigned int nr);
> > > +};
> > > +
> > > +enum dw_edma_map_format {
> > > +     EDMA_MF_EDMA_LEGACY = 0x0,
> > > +     EDMA_MF_EDMA_UNROLL = 0x1,
> > > +     EDMA_MF_HDMA_COMPAT = 0x5
> > > +};
> > > +
> > >  /**
> > >   * struct dw_edma_chip - representation of DesignWare eDMA controller hardware
> > >   * @dev:              struct device of the eDMA controller
> > >   * @id:                       instance ID
> >
> > > - * @irq:              irq line
> > > + * @nr_irqs:          total dma irq number
> >
> > Indeed, dw_edma_chip->irq field has been unused anyway...
> >
> > > + * reg64bit           if support 64bit write to register
> >
> > Do you have this field in the structure below? I don't see it there.
> > Drop this line then.
> >
> > > + * @ops                       DMA channel to IRQ number mapping
> > > + * @wr_ch_cnt                 DMA write channel number
> > > + * @rd_ch_cnt                 DMA read channel number
> >
> > > + * @rg_region                 DMA register region
> >
> > You changed this to reg_base in the structure below, but the doc has
> > been left with the old name and field type. Please unpin the modification
> > to a dedicated patch as I suggested before.
> >
> > > + * @ll_region_wr      DMA descriptor link list memory for write channel
> > > + * @ll_region_rd      DMA descriptor link list memory for read channel
> > > + * @mf                        DMA register map format
> > >   * @dw:                       struct dw_edma that is filed by dw_edma_probe()
> > >   */
> > >  struct dw_edma_chip {
> > >       struct device           *dev;
> > >       int                     id;
> > > -     int                     irq;
> > > +     int                     nr_irqs;
> > > +     const struct dw_edma_core_ops   *ops;
> > > +
> > > +     void __iomem            *reg_base;
> > > +
> > > +     u16                     ll_wr_cnt;
> > > +     u16                     ll_rd_cnt;
> >
> > Why did you name these fields with "ll_" prefix? These are the number of
> > read/write channels. Moreover the structure doc above have them named as
> > "wr_ch_cnt" and "rd_ch_cnt". So if you want to change the fields names
> > please add an addition patch and justify why it's needed.
> >
> > > +     /* link list address */
> > > +     struct dw_edma_region   ll_region_wr[EDMA_MAX_WR_CH];
> > > +     struct dw_edma_region   ll_region_rd[EDMA_MAX_RD_CH];
> > > +
> > > +     /* data region */
> > > +     struct dw_edma_region   dt_region_wr[EDMA_MAX_WR_CH];
> > > +     struct dw_edma_region   dt_region_rd[EDMA_MAX_RD_CH];
> > > +
> > > +     enum dw_edma_map_format mf;
> > > +
> >
> > >       struct dw_edma          *dw;
> >
> > Finally this could be dropped. Thus the dw_edma_chip structure will
> > be just the chip info data.
> >
> > -Sergey
> >
> > >  };
> > >
> > > --
> > > 2.24.0.rc1
> > >



[Index of Archives]     [DMA Engine]     [Linux Coverity]     [Linux USB]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Greybus]

  Powered by Linux