dw_spi: add DMA support
PATCH 1/1 dw_spi: add DMA support
From: Feng Tang <[email protected]>
dw_spi driver in upstream only supports PIO mode, and this patch will support it to cowork with the Designware DMA controller used on Intel Moorestown platform
It has been tested with a Option GTM501L 3G modem, to use DMA mode, DMA controller 2 of Moorestown has to be enabled
---
drivers/spi/Kconfig | 4 + drivers/spi/Makefile | 3 - drivers/spi/dw_spi.c | 48 +++++---- drivers/spi/dw_spi_mid.c | 246 ++++++++++++++++++++++++++++++++++++++++++++ drivers/spi/dw_spi_pci.c | 14 ++- include/linux/spi/dw_spi.h | 15 +++ 6 files changed, 305 insertions(+), 25 deletions(-) create mode 100644 drivers/spi/dw_spi_mid.c
drivers/spi/Kconfig +4 -0
@@ -404,6 +404,10 @@ config SPI_DW_PCI tristate "PCI interface driver for DW SPI core" depends on SPI_DESIGNWARE && PCI +config SPI_DW_MID_DMA + bool "DMA support for DW SPI controller on Intel Moorestown platform" + depends on SPI_DW_PCI && INTEL_MID_DMAC + config SPI_DW_MMIO tristate "Memory-mapped io interface driver for DW SPI core" depends on SPI_DESIGNWARE && HAVE_CLK
drivers/spi/Makefile +2 -1
@@ -17,7 +17,8 @@ obj-$(CONFIG_SPI_BUTTERFLY) += spi_butterfly.o obj-$(CONFIG_SPI_COLDFIRE_QSPI) += coldfire_qspi.o obj-$(CONFIG_SPI_DAVINCI) += davinci_spi.o obj-$(CONFIG_SPI_DESIGNWARE) += dw_spi.o -obj-$(CONFIG_SPI_DW_PCI) += dw_spi_pci.o +obj-$(CONFIG_SPI_DW_PCI) += dw_spi_midpci.o +dw_spi_midpci-objs := dw_spi_pci.o dw_spi_mid.o obj-$(CONFIG_SPI_DW_MMIO) += dw_spi_mmio.o obj-$(CONFIG_SPI_EP93XX) += ep93xx_spi.o obj-$(CONFIG_SPI_GPIO) += spi_gpio.o
drivers/spi/dw_spi.c +29 -19
146 lines not on this page · raw message
drivers/spi/dw_spi_mid.c new file +246 -0
246 lines not on this page · raw message
drivers/spi/dw_spi_pci.c +9 -5
@@ -1,5 +1,5 @@/* -* mrst_spi_pci.c - PCI interface driver for DW SPI Core +* dw_spi_pci.c - PCI interface driver for DW SPI Core * * Copyright (c) 2009, Intel Corporation. *
@@ -26,8 +26,8 @@#define DRIVER_NAME "dw_spi_pci"struct dw_spi_pci { -struct pci_dev *pdev; -struct dw_spi dws; +struct pci_dev *pdev; +struct dw_spi dws; }; static int __devinit spi_pci_probe(struct pci_dev *pdev,
@@ -72,9 +72,13 @@ static int __devinit spi_pci_probe(struct pci_dev *pdev, dws->parent_dev = &pdev->dev; dws->bus_num =0 ; dws->num_cs =4 ; - dws->max_freq =25000000 ;/* for Moorestwon */ dws->irq = pdev->irq; - dws->fifo_len =40 ;/* FIFO has 40 words buffer */ + +if (pdev->device ==0x0800 ) { + ret =dw_spi_mid_init (dws); +if (ret) + goto err_unmap; + } ret =dw_spi_add_host (dws);if (ret)
include/linux/spi/dw_spi.h +15 -0
@@ -1,5 +1,6 @@#ifndef DW_SPI_HEADER_H #define DW_SPI_HEADER_H +#include <linux/io.h> /* Bit fields in CTRLR0 */
@@ -82,6 +83,13 @@ struct dw_spi_reg {though only low 16 bits matters */ } __packed; +struct dw_spi ; +struct dw_spi_dma_ops { +int (*dma_init)(struct dw_spi *dws); +void (*dma_exit)(struct dw_spi *dws); +int (*dma_transfer)(struct dw_spi *dws,int cs_change); +}; +struct dw_spi {struct spi_master *master;struct spi_device *cur_dev;
@@ -143,6 +151,9 @@ struct dw_spi {u64 rx_param;struct device *dma_dev;dma_addr_t dma_addr; +struct dw_spi_dma_ops *dma_ops; +void *dma_priv;/* platform relate info */ +struct pci_dev *dmac;/* Bus interface info */ void *priv;
@@ -216,4 +227,8 @@ extern int dw_spi_add_host(struct dw_spi *dws);extern void dw_spi_remove_host (struct dw_spi *dws);extern int dw_spi_suspend_host (struct dw_spi *dws);extern int dw_spi_resume_host (struct dw_spi *dws); +extern void dw_spi_xfer_done (struct dw_spi *dws); + +/* platform related setup */ +extern int dw_spi_mid_init (struct dw_spi *dws);/* Intel MID platforms */ #endif /* DW_SPI_HEADER_H */
------------------------------------------------------------------------------
Beautiful is writing same markup. Internet Explorer 9 supports standards for HTML5, CSS3, SVG 1.1, ECMAScript5, and DOM L2 & L3. Spend less time writing and rewriting code and more time creating great experiences on the web. Be a part of the beta today
http://p.sf.net/sfu/msIE9-sfdev2dev