Re: [PATCH 1/3] DMA: PL330: Infer transfer direction from transfer request instead of platform data

2011-08-24 Thread Rob Herring
Thomas,

On 08/22/2011 04:59 PM, Thomas Abraham wrote:
 The transfer direction for a channel can be inferred from the transfer
 request and the need for specifying transfer direction in platfrom data
 can be eliminated. So the structure definition 'struct dma_pl330_peri'
 is no longer required.
 
 With the 'struct dma_pl330_peri' removed, the dma controller transfer
 capabilities cannot be inferred any longer. Hence, the dma controller
 capabilities is specified using platforme data.
 
 Cc: Jassi Brar jassisinghb...@gmail.com
 Cc: Boojin Kim boojin@samsung.com
 Signed-off-by: Thomas Abraham thomas.abra...@linaro.org
 ---
  drivers/dma/pl330.c|   56 
 
  include/linux/amba/pl330.h |   14 +++
  2 files changed, 14 insertions(+), 56 deletions(-)
 
 diff --git a/drivers/dma/pl330.c b/drivers/dma/pl330.c
 index 3a0baac..6592b9a 100644
 --- a/drivers/dma/pl330.c
 +++ b/drivers/dma/pl330.c
 @@ -507,7 +507,7 @@ pluck_desc(struct dma_pl330_dmac *pdmac)
  static struct dma_pl330_desc *pl330_get_desc(struct dma_pl330_chan *pch)
  {
   struct dma_pl330_dmac *pdmac = pch-dmac;
 - struct dma_pl330_peri *peri = pch-chan.private;
 + u8 *peri_id = pch-chan.private;
   struct dma_pl330_desc *desc;
  
   /* Pluck one desc from the pool of DMAC */
 @@ -531,14 +531,7 @@ static struct dma_pl330_desc *pl330_get_desc(struct 
 dma_pl330_chan *pch)
   desc-pchan = pch;
   desc-txd.cookie = 0;
   async_tx_ack(desc-txd);
 -
 - if (peri) {
 - desc-req.rqtype = peri-rqtype;
 - desc-req.peri = pch-chan.chan_id;
 - } else {
 - desc-req.rqtype = MEMTOMEM;
 - desc-req.peri = 0;
 - }
 + desc-req.peri = (peri_id) ? pch-chan.chan_id : 0;
  
   dma_async_tx_descriptor_init(desc-txd, pch-chan);
  
 @@ -625,12 +618,14 @@ static struct dma_async_tx_descriptor 
 *pl330_prep_dma_cyclic(
   case DMA_TO_DEVICE:
   desc-rqcfg.src_inc = 1;
   desc-rqcfg.dst_inc = 0;
 + desc-req.rqtype = MEMTODEV;
   src = dma_addr;
   dst = pch-fifo_addr;
   break;
   case DMA_FROM_DEVICE:
   desc-rqcfg.src_inc = 0;
   desc-rqcfg.dst_inc = 1;
 + desc-req.rqtype = DEVTOMEM;
   src = pch-fifo_addr;
   dst = dma_addr;
   break;
 @@ -657,16 +652,12 @@ pl330_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t 
 dst,
  {
   struct dma_pl330_desc *desc;
   struct dma_pl330_chan *pch = to_pchan(chan);
 - struct dma_pl330_peri *peri = chan-private;
   struct pl330_info *pi;
   int burst;
  
   if (unlikely(!pch || !len))
   return NULL;
  
 - if (peri  peri-rqtype != MEMTOMEM)
 - return NULL;
 -
   pi = pch-dmac-pif;
  
   desc = __pl330_prep_dma_memcpy(pch, dst, src, len);
 @@ -675,6 +666,7 @@ pl330_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t 
 dst,
  
   desc-rqcfg.src_inc = 1;
   desc-rqcfg.dst_inc = 1;
 + desc-req.rqtype = MEMTOMEM;
  
   /* Select max possible burst size */
   burst = pi-pcfg.data_bus_width / 8;
 @@ -703,25 +695,14 @@ pl330_prep_slave_sg(struct dma_chan *chan, struct 
 scatterlist *sgl,
  {
   struct dma_pl330_desc *first, *desc = NULL;
   struct dma_pl330_chan *pch = to_pchan(chan);
 - struct dma_pl330_peri *peri = chan-private;
   struct scatterlist *sg;
   unsigned long flags;
   int i;
   dma_addr_t addr;
  
 - if (unlikely(!pch || !sgl || !sg_len || !peri))
 + if (unlikely(!pch || !sgl || !sg_len))
   return NULL;
  
 - /* Make sure the direction is consistent */
 - if ((direction == DMA_TO_DEVICE 
 - peri-rqtype != MEMTODEV) ||
 - (direction == DMA_FROM_DEVICE 
 - peri-rqtype != DEVTOMEM)) {
 - dev_err(pch-dmac-pif.dev, %s:%d Invalid Direction\n,
 - __func__, __LINE__);
 - return NULL;
 - }
 -
   addr = pch-fifo_addr;
  
   first = NULL;
 @@ -761,11 +742,13 @@ pl330_prep_slave_sg(struct dma_chan *chan, struct 
 scatterlist *sgl,
   if (direction == DMA_TO_DEVICE) {
   desc-rqcfg.src_inc = 1;
   desc-rqcfg.dst_inc = 0;
 + desc-req.rqtype = MEMTODEV;
   fill_px(desc-px,
   addr, sg_dma_address(sg), sg_dma_len(sg));
   } else {
   desc-rqcfg.src_inc = 0;
   desc-rqcfg.dst_inc = 1;
 + desc-req.rqtype = DEVTOMEM;
   fill_px(desc-px,
   sg_dma_address(sg), addr, sg_dma_len(sg));
   }
 @@ -872,27 +855,7 @@ pl330_probe(struct amba_device *adev, const struct 
 amba_id *id)
  
   for (i = 0; i  num_chan; i++) {
 

Re: [PATCH 1/3] DMA: PL330: Infer transfer direction from transfer request instead of platform data

2011-08-24 Thread Thomas Abraham
Hi Rob,

On 24 August 2011 17:14, Rob Herring robherri...@gmail.com wrote:
 Thomas,

 On 08/22/2011 04:59 PM, Thomas Abraham wrote:
 The transfer direction for a channel can be inferred from the transfer
 request and the need for specifying transfer direction in platfrom data
 can be eliminated. So the structure definition 'struct dma_pl330_peri'
 is no longer required.

 With the 'struct dma_pl330_peri' removed, the dma controller transfer
 capabilities cannot be inferred any longer. Hence, the dma controller
 capabilities is specified using platforme data.

 Cc: Jassi Brar jassisinghb...@gmail.com
 Cc: Boojin Kim boojin@samsung.com
 Signed-off-by: Thomas Abraham thomas.abra...@linaro.org
 ---
  drivers/dma/pl330.c        |   56 
 
  include/linux/amba/pl330.h |   14 +++
  2 files changed, 14 insertions(+), 56 deletions(-)

 diff --git a/drivers/dma/pl330.c b/drivers/dma/pl330.c
 index 3a0baac..6592b9a 100644
 --- a/drivers/dma/pl330.c
 +++ b/drivers/dma/pl330.c

[...]

 @@ -872,27 +855,7 @@ pl330_probe(struct amba_device *adev, const struct 
 amba_id *id)

       for (i = 0; i  num_chan; i++) {
               pch = pdmac-peripherals[i];
 -             if (pdat) {
 -                     struct dma_pl330_peri *peri = pdat-peri[i];
 -
 -                     switch (peri-rqtype) {
 -                     case MEMTOMEM:
 -                             dma_cap_set(DMA_MEMCPY, pd-cap_mask);
 -                             break;
 -                     case MEMTODEV:
 -                     case DEVTOMEM:
 -                             dma_cap_set(DMA_SLAVE, pd-cap_mask);
 -                             dma_cap_set(DMA_CYCLIC, pd-cap_mask);
 -                             break;
 -                     default:
 -                             dev_err(adev-dev, DEVTODEV Not 
 Supported\n);
 -                             continue;
 -                     }
 -                     pch-chan.private = peri;
 -             } else {
 -                     dma_cap_set(DMA_MEMCPY, pd-cap_mask);
 -                     pch-chan.private = NULL;
 -             }
 +             pch-chan.private = (pdat) ? pdat-peri_id[i] : NULL;

 Don't need parentheses here.

Ok. I will fix this in the next version of this patchset.



               INIT_LIST_HEAD(pch-work_list);
               spin_lock_init(pch-lock);
 @@ -907,6 +870,7 @@ pl330_probe(struct amba_device *adev, const struct 
 amba_id *id)
       }

       pd-dev = adev-dev;
 +     pd-cap_mask = pdat-cap_mask;

 You are re-introducing the requirement to have platform data which I
 just made optional. For mem to mem transfers, there is no reason to have
 platform data. In my case, we only support mem to mem transfers.

 How about:
 pd-cap_mask = pdat ? pdat-cap_mask : DMA_MEMCPY;

All of your changes to make platform data optional is still retained
in this patch. But, as you said, the above change that I did to get
the capabilities from pdata would not work when no pdata is supplied
(as in the case mem-to-mem transfers). Thanks for pointing this out.

This can be fixed as below

if (pdat)
pd-cap_mask = pdat-cap_mask;
else
dma_cap_set(DMA_MEMCPY, pd-cap_mask);


 Also, should you be using dma_cap_set here?

Yes. That would be required. I will do these changes and resubmit the
patch. Thanks for your review.

Regards,
Thomas.


 Rob


[...]
--
To unsubscribe from this list: send the line unsubscribe linux-samsung-soc in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 1/3] DMA: PL330: Infer transfer direction from transfer request instead of platform data

2011-08-23 Thread Jassi Brar
On Tue, Aug 23, 2011 at 3:20 AM, Thomas Abraham
thomas.abra...@linaro.org wrote:
 The transfer direction for a channel can be inferred from the transfer
 request and the need for specifying transfer direction in platfrom data
 can be eliminated. So the structure definition 'struct dma_pl330_peri'
 is no longer required.

 With the 'struct dma_pl330_peri' removed, the dma controller transfer
 capabilities cannot be inferred any longer. Hence, the dma controller
 capabilities is specified using platforme data.

 Cc: Jassi Brar jassisinghb...@gmail.com
 Cc: Boojin Kim boojin@samsung.com
 Signed-off-by: Thomas Abraham thomas.abra...@linaro.org

Looks ok.

Acked-by: Jassi Brar jassisinghb...@gmail.com
--
To unsubscribe from this list: send the line unsubscribe linux-samsung-soc in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


RE: [PATCH 1/3] DMA: PL330: Infer transfer direction from transfer request instead of platform data

2011-08-23 Thread Boojin Kim
Thomas Abraham wrote:
 Sent: Tuesday, August 23, 2011 7:00 AM
 To: linux-arm-ker...@lists.infradead.org
 Cc: linux-samsung-soc@vger.kernel.org; kgene@samsung.com;
 vinod.k...@intel.com; Jassi Brar; Boojin Kim
 Subject: [PATCH 1/3] DMA: PL330: Infer transfer direction from
 transfer request instead of platform data

 The transfer direction for a channel can be inferred from the transfer
 request and the need for specifying transfer direction in platfrom
 data
 can be eliminated. So the structure definition 'struct dma_pl330_peri'
 is no longer required.

 With the 'struct dma_pl330_peri' removed, the dma controller transfer
 capabilities cannot be inferred any longer. Hence, the dma controller
 capabilities is specified using platforme data.

 Cc: Jassi Brar jassisinghb...@gmail.com
 Cc: Boojin Kim boojin@samsung.com
 Signed-off-by: Thomas Abraham thomas.abra...@linaro.org
 ---
  drivers/dma/pl330.c|   56 --
 --
  include/linux/amba/pl330.h |   14 +++
  2 files changed, 14 insertions(+), 56 deletions(-)

 diff --git a/drivers/dma/pl330.c b/drivers/dma/pl330.c
 index 3a0baac..6592b9a 100644
 --- a/drivers/dma/pl330.c
 +++ b/drivers/dma/pl330.c
 @@ -507,7 +507,7 @@ pluck_desc(struct dma_pl330_dmac *pdmac)
  static struct dma_pl330_desc *pl330_get_desc(struct dma_pl330_chan
 *pch)
  {
   struct dma_pl330_dmac *pdmac = pch-dmac;
 - struct dma_pl330_peri *peri = pch-chan.private;
 + u8 *peri_id = pch-chan.private;
   struct dma_pl330_desc *desc;

   /* Pluck one desc from the pool of DMAC */
 @@ -531,14 +531,7 @@ static struct dma_pl330_desc
 *pl330_get_desc(struct dma_pl330_chan *pch)
   desc-pchan = pch;
   desc-txd.cookie = 0;
   async_tx_ack(desc-txd);
 -
 - if (peri) {
 - desc-req.rqtype = peri-rqtype;
 - desc-req.peri = pch-chan.chan_id;
 - } else {
 - desc-req.rqtype = MEMTOMEM;
 - desc-req.peri = 0;
 - }
 + desc-req.peri = (peri_id) ? pch-chan.chan_id : 0;

   dma_async_tx_descriptor_init(desc-txd, pch-chan);

 @@ -625,12 +618,14 @@ static struct dma_async_tx_descriptor
 *pl330_prep_dma_cyclic(
   case DMA_TO_DEVICE:
   desc-rqcfg.src_inc = 1;
   desc-rqcfg.dst_inc = 0;
 + desc-req.rqtype = MEMTODEV;
   src = dma_addr;
   dst = pch-fifo_addr;
   break;
   case DMA_FROM_DEVICE:
   desc-rqcfg.src_inc = 0;
   desc-rqcfg.dst_inc = 1;
 + desc-req.rqtype = DEVTOMEM;
   src = pch-fifo_addr;
   dst = dma_addr;
   break;
 @@ -657,16 +652,12 @@ pl330_prep_dma_memcpy(struct dma_chan *chan,
 dma_addr_t dst,
  {
   struct dma_pl330_desc *desc;
   struct dma_pl330_chan *pch = to_pchan(chan);
 - struct dma_pl330_peri *peri = chan-private;
   struct pl330_info *pi;
   int burst;

   if (unlikely(!pch || !len))
   return NULL;

 - if (peri  peri-rqtype != MEMTOMEM)
 - return NULL;
 -
   pi = pch-dmac-pif;

   desc = __pl330_prep_dma_memcpy(pch, dst, src, len);
 @@ -675,6 +666,7 @@ pl330_prep_dma_memcpy(struct dma_chan *chan,
 dma_addr_t dst,

   desc-rqcfg.src_inc = 1;
   desc-rqcfg.dst_inc = 1;
 + desc-req.rqtype = MEMTOMEM;

   /* Select max possible burst size */
   burst = pi-pcfg.data_bus_width / 8;
 @@ -703,25 +695,14 @@ pl330_prep_slave_sg(struct dma_chan *chan,
 struct scatterlist *sgl,
  {
   struct dma_pl330_desc *first, *desc = NULL;
   struct dma_pl330_chan *pch = to_pchan(chan);
 - struct dma_pl330_peri *peri = chan-private;
   struct scatterlist *sg;
   unsigned long flags;
   int i;
   dma_addr_t addr;

 - if (unlikely(!pch || !sgl || !sg_len || !peri))
 + if (unlikely(!pch || !sgl || !sg_len))
   return NULL;

 - /* Make sure the direction is consistent */
 - if ((direction == DMA_TO_DEVICE 
 - peri-rqtype != MEMTODEV) ||
 - (direction == DMA_FROM_DEVICE 
 - peri-rqtype != DEVTOMEM)) {
 - dev_err(pch-dmac-pif.dev, %s:%d Invalid Direction\n,
 - __func__, __LINE__);
 - return NULL;
 - }
 -
   addr = pch-fifo_addr;

   first = NULL;
 @@ -761,11 +742,13 @@ pl330_prep_slave_sg(struct dma_chan *chan,
 struct scatterlist *sgl,
   if (direction == DMA_TO_DEVICE) {
   desc-rqcfg.src_inc = 1;
   desc-rqcfg.dst_inc = 0;
 + desc-req.rqtype = MEMTODEV;
   fill_px(desc-px,
   addr, sg_dma_address(sg), sg_dma_len(sg));
   } else {
   desc-rqcfg.src_inc = 0;
   desc-rqcfg.dst_inc = 1;
 + desc-req.rqtype = DEVTOMEM;
   

Re: [PATCH 1/3] DMA: PL330: Infer transfer direction from transfer request instead of platform data

2011-08-23 Thread Thomas Abraham
Hi Boojin,

On 24 August 2011 06:51, Boojin Kim boojin@samsung.com wrote:
 Thomas Abraham wrote:
 Sent: Tuesday, August 23, 2011 7:00 AM
 To: linux-arm-ker...@lists.infradead.org
 Cc: linux-samsung-soc@vger.kernel.org; kgene@samsung.com;
 vinod.k...@intel.com; Jassi Brar; Boojin Kim
 Subject: [PATCH 1/3] DMA: PL330: Infer transfer direction from
 transfer request instead of platform data

 The transfer direction for a channel can be inferred from the transfer
 request and the need for specifying transfer direction in platfrom
 data
 can be eliminated. So the structure definition 'struct dma_pl330_peri'
 is no longer required.

 With the 'struct dma_pl330_peri' removed, the dma controller transfer
 capabilities cannot be inferred any longer. Hence, the dma controller
 capabilities is specified using platforme data.

 Cc: Jassi Brar jassisinghb...@gmail.com
 Cc: Boojin Kim boojin@samsung.com
 Signed-off-by: Thomas Abraham thomas.abra...@linaro.org
 ---
  drivers/dma/pl330.c        |   56 --
 --
  include/linux/amba/pl330.h |   14 +++
  2 files changed, 14 insertions(+), 56 deletions(-)


[...]

       for (i = 0; i  num_chan; i++) {
               pch = pdmac-peripherals[i];
 -             if (pdat) {
 -                     struct dma_pl330_peri *peri = pdat-peri[i];
 -
 -                     switch (peri-rqtype) {
 -                     case MEMTOMEM:
 -                             dma_cap_set(DMA_MEMCPY, pd-cap_mask);
 -                             break;
 -                     case MEMTODEV:
 -                     case DEVTOMEM:
 -                             dma_cap_set(DMA_SLAVE, pd-cap_mask);
 -                             dma_cap_set(DMA_CYCLIC, pd-cap_mask);
 -                             break;
 If remove capabilities setting, dmaengine() doesn't search the channel that
 client requests with specific capability.
 So, I think dma_request_channel() would fail.

The capabilities is now supplied using platform data. There is a new
member 'cap_mask' added to the pl330 driver platform data structure.
The capabilities for a pl330 controller can be specified using
cap_mask. For exynos4, the capabilities is set up in the
exynos4_dma_init function. These changes are part of the third patch
in this patchset.

Thanks for your review.

Regards,
Thomas.

[...]
--
To unsubscribe from this list: send the line unsubscribe linux-samsung-soc in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html