Re: [PATCHv2 2/4] dmaengine: dw_dmac: Add PCI part of the driver

From: viresh kumar
Date: Wed Sep 26 2012 - 10:33:16 EST


Forgot earlier, please keep spear-devel in cc... They will be going to
use dw_dmac driver :)

On Wed, Sep 26, 2012 at 6:10 PM, Andy Shevchenko
<andriy.shevchenko@xxxxxxxxxxxxxxx> wrote:
> diff --git a/drivers/dma/dw_dmac_pci.c b/drivers/dma/dw_dmac_pci.c
> +#include <linux/module.h>
> +#include <linux/pci.h>
> +#include <linux/platform_device.h>
> +#include <linux/dw_dmac.h>
> +
> +#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), \

I believe you don't need these braces around input variables on right side
of "=". Even if there is something complex passed.

Did you try to align "\"? Sorry can't see it in gmail :(

> + })
> +
> +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;
> + }

Is this the correct approach? I doubt... We are creating a platform
device from a
pci driver... Don't know if it can lead to some issues within kernel.

Lets call the specialist for his comments :)
@Arnd: Can you please help us here?

> + 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 = platform_device_add(pd);
> + if (ret) {
> + dev_err(&pdev->dev, "platform_device_add failed\n");
> + goto err1;
> + }
> +
> + instance++;
> + return 0;
> +
> +err1:
> + 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_dmac_pci",
> + .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.krogerus@xxxxxxxxxxxxxxx>");
> +MODULE_AUTHOR("Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx>");
> --
> 1.7.10.4
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/