[linux-yocto] [PATCH 11/22] valleyisland-io: add PCI support in dw_dmac_pci.c

boon.leong.ong at intel.com boon.leong.ong at intel.com
Wed Jan 29 10:41:36 PST 2014


From: Ong Boon Leong <boon.leong.ong at 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: Ong Boon Leong <boon.leong.ong at intel.com>
---
 ...engine-dw_dmac-add-PCI-part-of-the-driver.patch |  198 ++++++++++++++++++++
 1 file changed, 198 insertions(+)
 create mode 100644 meta/cfg/kernel-cache/features/valleyisland-io/0009-dmaengine-dw_dmac-add-PCI-part-of-the-driver.patch

diff --git a/meta/cfg/kernel-cache/features/valleyisland-io/0009-dmaengine-dw_dmac-add-PCI-part-of-the-driver.patch b/meta/cfg/kernel-cache/features/valleyisland-io/0009-dmaengine-dw_dmac-add-PCI-part-of-the-driver.patch
new file mode 100644
index 0000000..6d86dae
--- /dev/null
+++ b/meta/cfg/kernel-cache/features/valleyisland-io/0009-dmaengine-dw_dmac-add-PCI-part-of-the-driver.patch
@@ -0,0 +1,198 @@
+From 25f0bcaf36b9b1f512f1cf7794f96cde3c360507 Mon Sep 17 00:00:00 2001
+From: Heikki Krogerus <heikki.krogerus at linux.intel.com>
+Date: Wed, 16 Jan 2013 16:01:10 +0200
+Subject: [PATCH 09/17] dmaengine: dw_dmac: add PCI part of the driver
+
+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.krogerus at linux.intel.com>
+Signed-off-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
+
+< From v3.11 onward, dw_dmac.c and dw_dmac_pci.c file are being split
+into multiple files, mainly pci.c, platform.c, core.c and placed in
+a new folder "dw" under /drivers/dma directory. Partial code churn
+in this commit are upstreamed (fed42c19).  This commit is contributed
+by Heikki & Andy before the file structure refactoring. >
+
+Signed-off-by: Chew, Chiau Ee <chiau.ee.chew at intel.com>
+---
+ drivers/dma/Kconfig       |    9 +++
+ drivers/dma/Makefile      |    1
+ drivers/dma/dw_dmac_pci.c |  132 +++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 142 insertions(+), 0 deletions(-)
+ create mode 100644 drivers/dma/dw_dmac_pci.c
+
+diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig
+index 0217a2b..40eaa37 100644
+--- a/drivers/dma/Kconfig
++++ b/drivers/dma/Kconfig
+@@ -100,6 +100,15 @@ config DW_DMAC_BIG_ENDIAN_IO
+
+ 	  If unsure, use the default setting.
+
++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 8ceb37a..ab18ed5 100644
+--- a/drivers/dma/Makefile
++++ b/drivers/dma/Makefile
+@@ -15,6 +15,7 @@ obj-$(CONFIG_FSL_DMA) += fsldma.o
+ 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_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_pci.c b/drivers/dma/dw_dmac_pci.c
+new file mode 100644
+index 0000000..a30a9e9
+--- /dev/null
++++ b/drivers/dma/dw_dmac_pci.c
+@@ -0,0 +1,132 @@
++/*
++ * 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/idr.h>
++#include <linux/pci.h>
++#include <linux/platform_device.h>
++#include <linux/dw_dmac.h>
++
++static struct dw_dma_platform_data dw_pci_pdata = {
++	.is_private = 1,
++	.chan_allocation_order = CHAN_ALLOCATION_ASCENDING,
++	.chan_priority = CHAN_PRIORITY_ASCENDING,
++};
++
++static DEFINE_IDA(dw_pci_ida);
++
++static int dw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *pid)
++{
++	struct platform_device *pd;
++	struct resource r[2];
++	struct dw_dma_platform_data *driver = (void *)pid->driver_data;
++	int id, ret;
++
++	id = ida_simple_get(&dw_pci_ida, 0, 0, GFP_KERNEL);
++	if (id < 0)
++		return id;
++
++	ret = pci_enable_device(pdev);
++	if (ret)
++		goto put_id;
++
++	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", id);
++	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 = platform_device_add(pd);
++	if (ret) {
++		dev_err(&pdev->dev, "platform_device_add failed\n");
++		goto err1;
++	}
++
++	return 0;
++
++err1:
++	platform_device_put(pd);
++err0:
++	pci_disable_device(pdev);
++put_id:
++	ida_simple_remove(&dw_pci_ida, id);
++	return ret;
++}
++
++static void dw_pci_remove(struct pci_dev *pdev)
++{
++	struct platform_device *pd = pci_get_drvdata(pdev);
++
++	platform_device_unregister(pd);
++	ida_simple_remove(&dw_pci_ida, pd->id);
++	pci_set_drvdata(pdev, NULL);
++	pci_disable_device(pdev);
++}
++
++static DEFINE_PCI_DEVICE_TABLE(dw_pci_id_table) = {
++	{ PCI_VDEVICE(INTEL, 0x0827), (kernel_ulong_t)&dw_pci_pdata },
++	{ PCI_VDEVICE(INTEL, 0x0830), (kernel_ulong_t)&dw_pci_pdata },
++	{ PCI_VDEVICE(INTEL, 0x0f06), (kernel_ulong_t)&dw_pci_pdata },
++	{ 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		= 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 at linux.intel.com>");
++MODULE_AUTHOR("Andy Shevchenko <andriy.shevchenko at linux.intel.com>");
+--
+1.7.4.4
+
-- 
1.7.10.4



More information about the linux-yocto mailing list