Re: [PATCHv1 3/6] dmaengine: dw_dmac: Add PCI part of the driver

2012-09-26 Thread Andy Shevchenko
On Wed, 2012-09-26 at 09:30 +0530, viresh kumar wrote: 
> On Tue, Sep 25, 2012 at 5:43 PM, Andy Shevchenko
>  wrote:
> > diff --git a/drivers/dma/dw_dmac_at32.c b/drivers/dma/dw_dmac_at32.c
> > index 7bc7ac4..5c9180e 100644
> > --- a/drivers/dma/dw_dmac_at32.c
> > +++ b/drivers/dma/dw_dmac_at32.c
> > @@ -12,6 +12,7 @@
> >   * it under the terms of the GNU General Public License version 2 as
> >   * published by the Free Software Foundation.
> >   */
> > +
> 
> :(
Noticed and fixed already locally.
Perhaps it will be not needed accordingly to your comment about CLK
framework.

> 
> >  #include 
> >  #include 
> >  #include 
> > diff --git a/drivers/dma/dw_dmac_pci.c b/drivers/dma/dw_dmac_pci.c
> > new file mode 100644
> > index 000..7490894
> > --- /dev/null
> > +++ b/drivers/dma/dw_dmac_pci.c
> > @@ -0,0 +1,130 @@
> > +/*
> > + * PCI driver for the Synopsys DesignWare DMA Controller
> > + *
> > + * Copyright (C) 2012 Intel Corporation
> > + *
> > + * This program is free software; you can redistribute it and/or modify
> > + * it under the terms of the GNU General Public License version 2 as
> > + * published by the Free Software Foundation.
> > + */
> > +
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +
> > +#define DW_DRIVER_NAME "dw_dmac_pci"
> > +
> > +#define DRIVER(_is_private, _chan_order, _chan_pri)\
> > +   ((kernel_ulong_t)&(struct dw_dma_platform_data) {   \
> > +   .is_private = (_is_private),\
> > +   .chan_allocation_order = (_chan_order), \
> > +   .chan_priority = (_chan_pri),   \
> > +   })
> 
> See if you can align "\" at the end of every line in one column
Ok.

> 
> > +
> > +static int __devinit dw_pci_probe(struct pci_dev *pdev,
> > + const struct pci_device_id *id)
> > +{
> > +   struct platform_device  *pd;
> 
> no need of multiple spaces before *pd.
> 
> > +   struct resource r[2];
> > +   struct dw_dma_platform_data *driver = (void *)id->driver_data;
> > +   static int  instance;
> > +   int ret;
> 
> for all above lines too
Ok for both comments.

> 
> > +
> > +   ret = pci_enable_device(pdev);
> > +   if (ret)
> > +   return ret;
> > +
> > +   pci_set_power_state(pdev, PCI_D0);
> > +   pci_set_master(pdev);
> > +   pci_try_set_mwi(pdev);
> > +
> > +   ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
> > +   if (ret)
> > +   goto err0;
> > +
> > +   ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
> > +   if (ret)
> > +   goto err0;
> > +
> > +   pd = platform_device_alloc("dw_dmac", instance);
> > +   if (!pd) {
> > +   dev_err(>dev, "can't allocate dw_dmac platform 
> > device\n");
> > +   ret = -ENOMEM;
> > +   goto err0;
> > +   }
> > +
> > +   memset(r, 0, sizeof(r));
> > +
> > +   r[0].start  = pci_resource_start(pdev, 0);
> > +   r[0].end= pci_resource_end(pdev, 0);
> > +   r[0].flags  = IORESOURCE_MEM;
> 
> ditto
> 
> > +
> > +   r[1].start  = pdev->irq;
> > +   r[1].flags  = IORESOURCE_IRQ;
> 
> ditto
Ok.

> 
> > +   ret = platform_device_add_resources(pd, r, ARRAY_SIZE(r));
> > +   if (ret) {
> > +   dev_err(>dev, "can't add resources to platform 
> > device\n");
> > +   goto err1;
> > +   }
> > +
> > +   ret = platform_device_add_data(pd, driver, sizeof(*driver));
> > +   if (ret)
> > +   goto err1;
> > +
> > +   dma_set_coherent_mask(>dev, pdev->dev.coherent_dma_mask);
> > +   pd->dev.dma_mask = pdev->dev.dma_mask;
> > +   pd->dev.dma_parms = pdev->dev.dma_parms;
> > +   pd->dev.parent = >dev;
> > +
> > +   pci_set_drvdata(pdev, pd);
> > +
> > +   ret = platform_device_add(pd);
> > +   if (ret) {
> > +   dev_err(>dev, "platform_device_add failed\n");
> > +   goto err1;
> > +   }
> > +
> > +   instance++;
> > +   return 0;
> > +
> > +err1:
> > +   pci_set_drvdata(pdev, NULL);
> 
> Is this required?
Seems it's not.

> > +   platform_device_put(pd);
> > +err0:
> > +   pci_disable_device(pdev);
> > +
> > +   return ret;
> > +}
> > +
> > +static void __devexit dw_pci_remove(struct pci_dev *pdev)
> > +{
> > +   struct platform_device *pd = pci_get_drvdata(pdev);
> > +
> > +   platform_device_unregister(pd);
> > +   pci_set_drvdata(pdev, NULL);
> > +   pci_disable_device(pdev);
> > +}
> > +
> > +static DEFINE_PCI_DEVICE_TABLE(dw_pci_id_table) = {
> > +   { PCI_VDEVICE(INTEL, 0x0827), DRIVER(1, 0, 0) },
> > +   { PCI_VDEVICE(INTEL, 0x0830), DRIVER(1, 0, 0) },
> > +   { PCI_VDEVICE(INTEL, 0x0f06), DRIVER(1, 0, 0) },
> > +   { 0, }
> > +};
> > +MODULE_DEVICE_TABLE(pci, dw_pci_id_table);
> > +
> 

Re: [PATCHv1 3/6] dmaengine: dw_dmac: Add PCI part of the driver

2012-09-26 Thread Andy Shevchenko
On Wed, 2012-09-26 at 09:30 +0530, viresh kumar wrote: 
 On Tue, Sep 25, 2012 at 5:43 PM, Andy Shevchenko
 andriy.shevche...@linux.intel.com wrote:
  diff --git a/drivers/dma/dw_dmac_at32.c b/drivers/dma/dw_dmac_at32.c
  index 7bc7ac4..5c9180e 100644
  --- a/drivers/dma/dw_dmac_at32.c
  +++ b/drivers/dma/dw_dmac_at32.c
  @@ -12,6 +12,7 @@
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
  +
 
 :(
Noticed and fixed already locally.
Perhaps it will be not needed accordingly to your comment about CLK
framework.

 
   #include linux/module.h
   #include linux/platform_device.h
   #include linux/slab.h
  diff --git a/drivers/dma/dw_dmac_pci.c b/drivers/dma/dw_dmac_pci.c
  new file mode 100644
  index 000..7490894
  --- /dev/null
  +++ b/drivers/dma/dw_dmac_pci.c
  @@ -0,0 +1,130 @@
  +/*
  + * PCI driver for the Synopsys DesignWare DMA Controller
  + *
  + * Copyright (C) 2012 Intel Corporation
  + *
  + * This program is free software; you can redistribute it and/or modify
  + * it under the terms of the GNU General Public License version 2 as
  + * published by the Free Software Foundation.
  + */
  +
  +#include linux/module.h
  +#include linux/pci.h
  +#include linux/platform_device.h
  +#include linux/dw_dmac.h
  +
  +#define DW_DRIVER_NAME dw_dmac_pci
  +
  +#define DRIVER(_is_private, _chan_order, _chan_pri)\
  +   ((kernel_ulong_t)(struct dw_dma_platform_data) {   \
  +   .is_private = (_is_private),\
  +   .chan_allocation_order = (_chan_order), \
  +   .chan_priority = (_chan_pri),   \
  +   })
 
 See if you can align \ at the end of every line in one column
Ok.

 
  +
  +static int __devinit dw_pci_probe(struct pci_dev *pdev,
  + const struct pci_device_id *id)
  +{
  +   struct platform_device  *pd;
 
 no need of multiple spaces before *pd.
 
  +   struct resource r[2];
  +   struct dw_dma_platform_data *driver = (void *)id-driver_data;
  +   static int  instance;
  +   int ret;
 
 for all above lines too
Ok for both comments.

 
  +
  +   ret = pci_enable_device(pdev);
  +   if (ret)
  +   return ret;
  +
  +   pci_set_power_state(pdev, PCI_D0);
  +   pci_set_master(pdev);
  +   pci_try_set_mwi(pdev);
  +
  +   ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
  +   if (ret)
  +   goto err0;
  +
  +   ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
  +   if (ret)
  +   goto err0;
  +
  +   pd = platform_device_alloc(dw_dmac, instance);
  +   if (!pd) {
  +   dev_err(pdev-dev, can't allocate dw_dmac platform 
  device\n);
  +   ret = -ENOMEM;
  +   goto err0;
  +   }
  +
  +   memset(r, 0, sizeof(r));
  +
  +   r[0].start  = pci_resource_start(pdev, 0);
  +   r[0].end= pci_resource_end(pdev, 0);
  +   r[0].flags  = IORESOURCE_MEM;
 
 ditto
 
  +
  +   r[1].start  = pdev-irq;
  +   r[1].flags  = IORESOURCE_IRQ;
 
 ditto
Ok.

 
  +   ret = platform_device_add_resources(pd, r, ARRAY_SIZE(r));
  +   if (ret) {
  +   dev_err(pdev-dev, can't add resources to platform 
  device\n);
  +   goto err1;
  +   }
  +
  +   ret = platform_device_add_data(pd, driver, sizeof(*driver));
  +   if (ret)
  +   goto err1;
  +
  +   dma_set_coherent_mask(pd-dev, pdev-dev.coherent_dma_mask);
  +   pd-dev.dma_mask = pdev-dev.dma_mask;
  +   pd-dev.dma_parms = pdev-dev.dma_parms;
  +   pd-dev.parent = pdev-dev;
  +
  +   pci_set_drvdata(pdev, pd);
  +
  +   ret = platform_device_add(pd);
  +   if (ret) {
  +   dev_err(pdev-dev, platform_device_add failed\n);
  +   goto err1;
  +   }
  +
  +   instance++;
  +   return 0;
  +
  +err1:
  +   pci_set_drvdata(pdev, NULL);
 
 Is this required?
Seems it's not.

  +   platform_device_put(pd);
  +err0:
  +   pci_disable_device(pdev);
  +
  +   return ret;
  +}
  +
  +static void __devexit dw_pci_remove(struct pci_dev *pdev)
  +{
  +   struct platform_device *pd = pci_get_drvdata(pdev);
  +
  +   platform_device_unregister(pd);
  +   pci_set_drvdata(pdev, NULL);
  +   pci_disable_device(pdev);
  +}
  +
  +static DEFINE_PCI_DEVICE_TABLE(dw_pci_id_table) = {
  +   { PCI_VDEVICE(INTEL, 0x0827), DRIVER(1, 0, 0) },
  +   { PCI_VDEVICE(INTEL, 0x0830), DRIVER(1, 0, 0) },
  +   { PCI_VDEVICE(INTEL, 0x0f06), DRIVER(1, 0, 0) },
  +   { 0, }
  +};
  +MODULE_DEVICE_TABLE(pci, dw_pci_id_table);
  +
  +static struct pci_driver dw_pci_driver = {
  +   .name   = DW_DRIVER_NAME,
  +   .id_table   = dw_pci_id_table,
  +   .probe   

Re: [PATCHv1 3/6] dmaengine: dw_dmac: Add PCI part of the driver

2012-09-25 Thread viresh kumar
On Tue, Sep 25, 2012 at 5:43 PM, Andy Shevchenko
 wrote:
> diff --git a/drivers/dma/dw_dmac_at32.c b/drivers/dma/dw_dmac_at32.c
> index 7bc7ac4..5c9180e 100644
> --- a/drivers/dma/dw_dmac_at32.c
> +++ b/drivers/dma/dw_dmac_at32.c
> @@ -12,6 +12,7 @@
>   * it under the terms of the GNU General Public License version 2 as
>   * published by the Free Software Foundation.
>   */
> +

:(

>  #include 
>  #include 
>  #include 
> diff --git a/drivers/dma/dw_dmac_pci.c b/drivers/dma/dw_dmac_pci.c
> new file mode 100644
> index 000..7490894
> --- /dev/null
> +++ b/drivers/dma/dw_dmac_pci.c
> @@ -0,0 +1,130 @@
> +/*
> + * PCI driver for the Synopsys DesignWare DMA Controller
> + *
> + * Copyright (C) 2012 Intel Corporation
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + */
> +
> +#include 
> +#include 
> +#include 
> +#include 
> +
> +#define DW_DRIVER_NAME "dw_dmac_pci"
> +
> +#define DRIVER(_is_private, _chan_order, _chan_pri)\
> +   ((kernel_ulong_t)&(struct dw_dma_platform_data) {   \
> +   .is_private = (_is_private),\
> +   .chan_allocation_order = (_chan_order), \
> +   .chan_priority = (_chan_pri),   \
> +   })

See if you can align "\" at the end of every line in one column

> +
> +static int __devinit dw_pci_probe(struct pci_dev *pdev,
> + const struct pci_device_id *id)
> +{
> +   struct platform_device  *pd;

no need of multiple spaces before *pd.

> +   struct resource r[2];
> +   struct dw_dma_platform_data *driver = (void *)id->driver_data;
> +   static int  instance;
> +   int ret;

for all above lines too

> +
> +   ret = pci_enable_device(pdev);
> +   if (ret)
> +   return ret;
> +
> +   pci_set_power_state(pdev, PCI_D0);
> +   pci_set_master(pdev);
> +   pci_try_set_mwi(pdev);
> +
> +   ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
> +   if (ret)
> +   goto err0;
> +
> +   ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
> +   if (ret)
> +   goto err0;
> +
> +   pd = platform_device_alloc("dw_dmac", instance);
> +   if (!pd) {
> +   dev_err(>dev, "can't allocate dw_dmac platform 
> device\n");
> +   ret = -ENOMEM;
> +   goto err0;
> +   }
> +
> +   memset(r, 0, sizeof(r));
> +
> +   r[0].start  = pci_resource_start(pdev, 0);
> +   r[0].end= pci_resource_end(pdev, 0);
> +   r[0].flags  = IORESOURCE_MEM;

ditto

> +
> +   r[1].start  = pdev->irq;
> +   r[1].flags  = IORESOURCE_IRQ;

ditto

> +   ret = platform_device_add_resources(pd, r, ARRAY_SIZE(r));
> +   if (ret) {
> +   dev_err(>dev, "can't add resources to platform 
> device\n");
> +   goto err1;
> +   }
> +
> +   ret = platform_device_add_data(pd, driver, sizeof(*driver));
> +   if (ret)
> +   goto err1;
> +
> +   dma_set_coherent_mask(>dev, pdev->dev.coherent_dma_mask);
> +   pd->dev.dma_mask = pdev->dev.dma_mask;
> +   pd->dev.dma_parms = pdev->dev.dma_parms;
> +   pd->dev.parent = >dev;
> +
> +   pci_set_drvdata(pdev, pd);
> +
> +   ret = platform_device_add(pd);
> +   if (ret) {
> +   dev_err(>dev, "platform_device_add failed\n");
> +   goto err1;
> +   }
> +
> +   instance++;
> +   return 0;
> +
> +err1:
> +   pci_set_drvdata(pdev, NULL);

Is this required?

> +   platform_device_put(pd);
> +err0:
> +   pci_disable_device(pdev);
> +
> +   return ret;
> +}
> +
> +static void __devexit dw_pci_remove(struct pci_dev *pdev)
> +{
> +   struct platform_device *pd = pci_get_drvdata(pdev);
> +
> +   platform_device_unregister(pd);
> +   pci_set_drvdata(pdev, NULL);
> +   pci_disable_device(pdev);
> +}
> +
> +static DEFINE_PCI_DEVICE_TABLE(dw_pci_id_table) = {
> +   { PCI_VDEVICE(INTEL, 0x0827), DRIVER(1, 0, 0) },
> +   { PCI_VDEVICE(INTEL, 0x0830), DRIVER(1, 0, 0) },
> +   { PCI_VDEVICE(INTEL, 0x0f06), DRIVER(1, 0, 0) },
> +   { 0, }
> +};
> +MODULE_DEVICE_TABLE(pci, dw_pci_id_table);
> +
> +static struct pci_driver dw_pci_driver = {
> +   .name   = DW_DRIVER_NAME,
> +   .id_table   = dw_pci_id_table,
> +   .probe  = dw_pci_probe,
> +   .remove = __devexit_p(dw_pci_remove),
> +};
> +
> +module_pci_driver(dw_pci_driver);
> +
> +MODULE_LICENSE("GPL v2");
> +MODULE_DESCRIPTION("DesignWare DMAC PCI driver");
> +MODULE_AUTHOR("Heikki Krogerus ");
> +MODULE_AUTHOR("Andy Shevchenko ");
> --
> 1.7.10.4
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in

[PATCHv1 3/6] dmaengine: dw_dmac: Add PCI part of the driver

2012-09-25 Thread Andy Shevchenko
From: Heikki Krogerus 

This is the PCI part of the DesignWare DMAC driver. The controller is usually
used in the Intel hardware such as Medfield.

Signed-off-by: Heikki Krogerus 
Signed-off-by: Andy Shevchenko 
---
 drivers/dma/Kconfig|9 +++
 drivers/dma/Makefile   |1 +
 drivers/dma/dw_dmac_at32.c |1 +
 drivers/dma/dw_dmac_pci.c  |  130 
 4 files changed, 141 insertions(+)
 create mode 100644 drivers/dma/dw_dmac_pci.c

diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig
index e47cc90..3850f8d 100644
--- a/drivers/dma/Kconfig
+++ b/drivers/dma/Kconfig
@@ -98,6 +98,15 @@ config DW_DMAC_AT32
  Support the Synopsys DesignWare AHB DMA controller in the chips
  such as the Atmel AT32ap7000.
 
+config DW_DMAC_PCI
+   tristate "Synopsys DesignWare AHB DMA support (PCI bus)"
+   depends on PCI
+   select DW_DMAC
+   help
+ Support the Synopsys DesignWare AHB DMA controller on the platfroms
+ that provide it as a PCI device. For example, Intel Medfield has
+ integrated this GPDMA controller.
+
 config AT_HDMAC
tristate "Atmel AHB DMA support"
depends on ARCH_AT91
diff --git a/drivers/dma/Makefile b/drivers/dma/Makefile
index d76020b..ae660ed 100644
--- a/drivers/dma/Makefile
+++ b/drivers/dma/Makefile
@@ -13,6 +13,7 @@ obj-$(CONFIG_MPC512X_DMA) += mpc512x_dma.o
 obj-$(CONFIG_MV_XOR) += mv_xor.o
 obj-$(CONFIG_DW_DMAC) += dw_dmac.o
 obj-$(CONFIG_DW_DMAC_AT32) += dw_dmac_at32.o
+obj-$(CONFIG_DW_DMAC_PCI) += dw_dmac_pci.o
 obj-$(CONFIG_AT_HDMAC) += at_hdmac.o
 obj-$(CONFIG_MX3_IPU) += ipu/
 obj-$(CONFIG_TXX9_DMAC) += txx9dmac.o
diff --git a/drivers/dma/dw_dmac_at32.c b/drivers/dma/dw_dmac_at32.c
index 7bc7ac4..5c9180e 100644
--- a/drivers/dma/dw_dmac_at32.c
+++ b/drivers/dma/dw_dmac_at32.c
@@ -12,6 +12,7 @@
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  */
+
 #include 
 #include 
 #include 
diff --git a/drivers/dma/dw_dmac_pci.c b/drivers/dma/dw_dmac_pci.c
new file mode 100644
index 000..7490894
--- /dev/null
+++ b/drivers/dma/dw_dmac_pci.c
@@ -0,0 +1,130 @@
+/*
+ * PCI driver for the Synopsys DesignWare DMA Controller
+ *
+ * Copyright (C) 2012 Intel Corporation
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include 
+#include 
+#include 
+#include 
+
+#define DW_DRIVER_NAME "dw_dmac_pci"
+
+#define DRIVER(_is_private, _chan_order, _chan_pri)\
+   ((kernel_ulong_t)&(struct dw_dma_platform_data) {   \
+   .is_private = (_is_private),\
+   .chan_allocation_order = (_chan_order), \
+   .chan_priority = (_chan_pri),   \
+   })
+
+static int __devinit dw_pci_probe(struct pci_dev *pdev,
+ const struct pci_device_id *id)
+{
+   struct platform_device  *pd;
+   struct resource r[2];
+   struct dw_dma_platform_data *driver = (void *)id->driver_data;
+   static int  instance;
+   int ret;
+
+   ret = pci_enable_device(pdev);
+   if (ret)
+   return ret;
+
+   pci_set_power_state(pdev, PCI_D0);
+   pci_set_master(pdev);
+   pci_try_set_mwi(pdev);
+
+   ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
+   if (ret)
+   goto err0;
+
+   ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
+   if (ret)
+   goto err0;
+
+   pd = platform_device_alloc("dw_dmac", instance);
+   if (!pd) {
+   dev_err(>dev, "can't allocate dw_dmac platform device\n");
+   ret = -ENOMEM;
+   goto err0;
+   }
+
+   memset(r, 0, sizeof(r));
+
+   r[0].start  = pci_resource_start(pdev, 0);
+   r[0].end= pci_resource_end(pdev, 0);
+   r[0].flags  = IORESOURCE_MEM;
+
+   r[1].start  = pdev->irq;
+   r[1].flags  = IORESOURCE_IRQ;
+
+   ret = platform_device_add_resources(pd, r, ARRAY_SIZE(r));
+   if (ret) {
+   dev_err(>dev, "can't add resources to platform device\n");
+   goto err1;
+   }
+
+   ret = platform_device_add_data(pd, driver, sizeof(*driver));
+   if (ret)
+   goto err1;
+
+   dma_set_coherent_mask(>dev, pdev->dev.coherent_dma_mask);
+   pd->dev.dma_mask = pdev->dev.dma_mask;
+   pd->dev.dma_parms = pdev->dev.dma_parms;
+   pd->dev.parent = >dev;
+
+   pci_set_drvdata(pdev, pd);
+
+   ret = platform_device_add(pd);
+   if (ret) {
+   dev_err(>dev, "platform_device_add failed\n");
+   goto err1;
+   }
+
+   instance++;
+   return 0;
+
+err1:
+   

[PATCHv1 3/6] dmaengine: dw_dmac: Add PCI part of the driver

2012-09-25 Thread Andy Shevchenko
From: Heikki Krogerus heikki.kroge...@linux.intel.com

This is the PCI part of the DesignWare DMAC driver. The controller is usually
used in the Intel hardware such as Medfield.

Signed-off-by: Heikki Krogerus heikki.kroge...@linux.intel.com
Signed-off-by: Andy Shevchenko andriy.shevche...@linux.intel.com
---
 drivers/dma/Kconfig|9 +++
 drivers/dma/Makefile   |1 +
 drivers/dma/dw_dmac_at32.c |1 +
 drivers/dma/dw_dmac_pci.c  |  130 
 4 files changed, 141 insertions(+)
 create mode 100644 drivers/dma/dw_dmac_pci.c

diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig
index e47cc90..3850f8d 100644
--- a/drivers/dma/Kconfig
+++ b/drivers/dma/Kconfig
@@ -98,6 +98,15 @@ config DW_DMAC_AT32
  Support the Synopsys DesignWare AHB DMA controller in the chips
  such as the Atmel AT32ap7000.
 
+config DW_DMAC_PCI
+   tristate Synopsys DesignWare AHB DMA support (PCI bus)
+   depends on PCI
+   select DW_DMAC
+   help
+ Support the Synopsys DesignWare AHB DMA controller on the platfroms
+ that provide it as a PCI device. For example, Intel Medfield has
+ integrated this GPDMA controller.
+
 config AT_HDMAC
tristate Atmel AHB DMA support
depends on ARCH_AT91
diff --git a/drivers/dma/Makefile b/drivers/dma/Makefile
index d76020b..ae660ed 100644
--- a/drivers/dma/Makefile
+++ b/drivers/dma/Makefile
@@ -13,6 +13,7 @@ obj-$(CONFIG_MPC512X_DMA) += mpc512x_dma.o
 obj-$(CONFIG_MV_XOR) += mv_xor.o
 obj-$(CONFIG_DW_DMAC) += dw_dmac.o
 obj-$(CONFIG_DW_DMAC_AT32) += dw_dmac_at32.o
+obj-$(CONFIG_DW_DMAC_PCI) += dw_dmac_pci.o
 obj-$(CONFIG_AT_HDMAC) += at_hdmac.o
 obj-$(CONFIG_MX3_IPU) += ipu/
 obj-$(CONFIG_TXX9_DMAC) += txx9dmac.o
diff --git a/drivers/dma/dw_dmac_at32.c b/drivers/dma/dw_dmac_at32.c
index 7bc7ac4..5c9180e 100644
--- a/drivers/dma/dw_dmac_at32.c
+++ b/drivers/dma/dw_dmac_at32.c
@@ -12,6 +12,7 @@
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  */
+
 #include linux/module.h
 #include linux/platform_device.h
 #include linux/slab.h
diff --git a/drivers/dma/dw_dmac_pci.c b/drivers/dma/dw_dmac_pci.c
new file mode 100644
index 000..7490894
--- /dev/null
+++ b/drivers/dma/dw_dmac_pci.c
@@ -0,0 +1,130 @@
+/*
+ * PCI driver for the Synopsys DesignWare DMA Controller
+ *
+ * Copyright (C) 2012 Intel Corporation
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include linux/module.h
+#include linux/pci.h
+#include linux/platform_device.h
+#include linux/dw_dmac.h
+
+#define DW_DRIVER_NAME dw_dmac_pci
+
+#define DRIVER(_is_private, _chan_order, _chan_pri)\
+   ((kernel_ulong_t)(struct dw_dma_platform_data) {   \
+   .is_private = (_is_private),\
+   .chan_allocation_order = (_chan_order), \
+   .chan_priority = (_chan_pri),   \
+   })
+
+static int __devinit dw_pci_probe(struct pci_dev *pdev,
+ const struct pci_device_id *id)
+{
+   struct platform_device  *pd;
+   struct resource r[2];
+   struct dw_dma_platform_data *driver = (void *)id-driver_data;
+   static int  instance;
+   int ret;
+
+   ret = pci_enable_device(pdev);
+   if (ret)
+   return ret;
+
+   pci_set_power_state(pdev, PCI_D0);
+   pci_set_master(pdev);
+   pci_try_set_mwi(pdev);
+
+   ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
+   if (ret)
+   goto err0;
+
+   ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
+   if (ret)
+   goto err0;
+
+   pd = platform_device_alloc(dw_dmac, instance);
+   if (!pd) {
+   dev_err(pdev-dev, can't allocate dw_dmac platform device\n);
+   ret = -ENOMEM;
+   goto err0;
+   }
+
+   memset(r, 0, sizeof(r));
+
+   r[0].start  = pci_resource_start(pdev, 0);
+   r[0].end= pci_resource_end(pdev, 0);
+   r[0].flags  = IORESOURCE_MEM;
+
+   r[1].start  = pdev-irq;
+   r[1].flags  = IORESOURCE_IRQ;
+
+   ret = platform_device_add_resources(pd, r, ARRAY_SIZE(r));
+   if (ret) {
+   dev_err(pdev-dev, can't add resources to platform device\n);
+   goto err1;
+   }
+
+   ret = platform_device_add_data(pd, driver, sizeof(*driver));
+   if (ret)
+   goto err1;
+
+   dma_set_coherent_mask(pd-dev, pdev-dev.coherent_dma_mask);
+   pd-dev.dma_mask = pdev-dev.dma_mask;
+   pd-dev.dma_parms = pdev-dev.dma_parms;
+   pd-dev.parent = pdev-dev;
+
+   pci_set_drvdata(pdev, pd);
+
+   ret = 

Re: [PATCHv1 3/6] dmaengine: dw_dmac: Add PCI part of the driver

2012-09-25 Thread viresh kumar
On Tue, Sep 25, 2012 at 5:43 PM, Andy Shevchenko
andriy.shevche...@linux.intel.com wrote:
 diff --git a/drivers/dma/dw_dmac_at32.c b/drivers/dma/dw_dmac_at32.c
 index 7bc7ac4..5c9180e 100644
 --- a/drivers/dma/dw_dmac_at32.c
 +++ b/drivers/dma/dw_dmac_at32.c
 @@ -12,6 +12,7 @@
   * it under the terms of the GNU General Public License version 2 as
   * published by the Free Software Foundation.
   */
 +

:(

  #include linux/module.h
  #include linux/platform_device.h
  #include linux/slab.h
 diff --git a/drivers/dma/dw_dmac_pci.c b/drivers/dma/dw_dmac_pci.c
 new file mode 100644
 index 000..7490894
 --- /dev/null
 +++ b/drivers/dma/dw_dmac_pci.c
 @@ -0,0 +1,130 @@
 +/*
 + * PCI driver for the Synopsys DesignWare DMA Controller
 + *
 + * Copyright (C) 2012 Intel Corporation
 + *
 + * This program is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License version 2 as
 + * published by the Free Software Foundation.
 + */
 +
 +#include linux/module.h
 +#include linux/pci.h
 +#include linux/platform_device.h
 +#include linux/dw_dmac.h
 +
 +#define DW_DRIVER_NAME dw_dmac_pci
 +
 +#define DRIVER(_is_private, _chan_order, _chan_pri)\
 +   ((kernel_ulong_t)(struct dw_dma_platform_data) {   \
 +   .is_private = (_is_private),\
 +   .chan_allocation_order = (_chan_order), \
 +   .chan_priority = (_chan_pri),   \
 +   })

See if you can align \ at the end of every line in one column

 +
 +static int __devinit dw_pci_probe(struct pci_dev *pdev,
 + const struct pci_device_id *id)
 +{
 +   struct platform_device  *pd;

no need of multiple spaces before *pd.

 +   struct resource r[2];
 +   struct dw_dma_platform_data *driver = (void *)id-driver_data;
 +   static int  instance;
 +   int ret;

for all above lines too

 +
 +   ret = pci_enable_device(pdev);
 +   if (ret)
 +   return ret;
 +
 +   pci_set_power_state(pdev, PCI_D0);
 +   pci_set_master(pdev);
 +   pci_try_set_mwi(pdev);
 +
 +   ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
 +   if (ret)
 +   goto err0;
 +
 +   ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
 +   if (ret)
 +   goto err0;
 +
 +   pd = platform_device_alloc(dw_dmac, instance);
 +   if (!pd) {
 +   dev_err(pdev-dev, can't allocate dw_dmac platform 
 device\n);
 +   ret = -ENOMEM;
 +   goto err0;
 +   }
 +
 +   memset(r, 0, sizeof(r));
 +
 +   r[0].start  = pci_resource_start(pdev, 0);
 +   r[0].end= pci_resource_end(pdev, 0);
 +   r[0].flags  = IORESOURCE_MEM;

ditto

 +
 +   r[1].start  = pdev-irq;
 +   r[1].flags  = IORESOURCE_IRQ;

ditto

 +   ret = platform_device_add_resources(pd, r, ARRAY_SIZE(r));
 +   if (ret) {
 +   dev_err(pdev-dev, can't add resources to platform 
 device\n);
 +   goto err1;
 +   }
 +
 +   ret = platform_device_add_data(pd, driver, sizeof(*driver));
 +   if (ret)
 +   goto err1;
 +
 +   dma_set_coherent_mask(pd-dev, pdev-dev.coherent_dma_mask);
 +   pd-dev.dma_mask = pdev-dev.dma_mask;
 +   pd-dev.dma_parms = pdev-dev.dma_parms;
 +   pd-dev.parent = pdev-dev;
 +
 +   pci_set_drvdata(pdev, pd);
 +
 +   ret = platform_device_add(pd);
 +   if (ret) {
 +   dev_err(pdev-dev, platform_device_add failed\n);
 +   goto err1;
 +   }
 +
 +   instance++;
 +   return 0;
 +
 +err1:
 +   pci_set_drvdata(pdev, NULL);

Is this required?

 +   platform_device_put(pd);
 +err0:
 +   pci_disable_device(pdev);
 +
 +   return ret;
 +}
 +
 +static void __devexit dw_pci_remove(struct pci_dev *pdev)
 +{
 +   struct platform_device *pd = pci_get_drvdata(pdev);
 +
 +   platform_device_unregister(pd);
 +   pci_set_drvdata(pdev, NULL);
 +   pci_disable_device(pdev);
 +}
 +
 +static DEFINE_PCI_DEVICE_TABLE(dw_pci_id_table) = {
 +   { PCI_VDEVICE(INTEL, 0x0827), DRIVER(1, 0, 0) },
 +   { PCI_VDEVICE(INTEL, 0x0830), DRIVER(1, 0, 0) },
 +   { PCI_VDEVICE(INTEL, 0x0f06), DRIVER(1, 0, 0) },
 +   { 0, }
 +};
 +MODULE_DEVICE_TABLE(pci, dw_pci_id_table);
 +
 +static struct pci_driver dw_pci_driver = {
 +   .name   = DW_DRIVER_NAME,
 +   .id_table   = dw_pci_id_table,
 +   .probe  = dw_pci_probe,
 +   .remove = __devexit_p(dw_pci_remove),
 +};
 +
 +module_pci_driver(dw_pci_driver);
 +
 +MODULE_LICENSE(GPL v2);
 +MODULE_DESCRIPTION(DesignWare DMAC PCI driver);
 +MODULE_AUTHOR(Heikki Krogerus heikki.kroge...@linux.intel.com);
 +MODULE_AUTHOR(Andy Shevchenko andriy.shevche...@linux.intel.com);
 --
 1.7.10.4

--
To unsubscribe from this