[linux-yocto] [[PATCH 1/1] dma: dw: Fix Intel MID DMA driver and Designware DMA
chong.yi.chai at intel.com
chong.yi.chai at intel.com
Wed Mar 30 20:16:02 PDT 2016
From: "Chai, Chong Yi" <chong.yi.chai at intel.com>
---
features/soc/baytrail/baytrail.scc | 10 +
...Intel-MID-DMA-driver-and-Designware-DMA-d.patch | 39 ++
...dw-allocate-memory-in-two-stages-in-probe.patch | 88 +++++
...w-apply-both-HS-interfaces-and-remove-sla.patch | 155 ++++++++
...w-convert-dw_dma_slave-to-use-explicit-HS.patch | 114 ++++++
.../dmaengine-dw-enable-clock-before-access.patch | 48 +++
.../dmaengine-dw-fix-checkpatch.pl-warnings.patch | 40 ++
...ne-dw-fix-regression-in-dw_probe-function.patch | 114 ++++++
...gine-dw-introduce-generic-filter-function.patch | 195 ++++++++++
...ne-dw-move-clock-operations-to-platform.c.patch | 203 ++++++++++
...-dw-move-dw_dmac.h-to-where-it-belongs-to.patch | 412 +++++++++++++++++++++
11 files changed, 1418 insertions(+)
create mode 100644 features/soc/baytrail/dma-dw-Fix-Intel-MID-DMA-driver-and-Designware-DMA-d.patch
create mode 100644 features/soc/baytrail/dma-dw-allocate-memory-in-two-stages-in-probe.patch
create mode 100644 features/soc/baytrail/dmaengine-dw-apply-both-HS-interfaces-and-remove-sla.patch
create mode 100644 features/soc/baytrail/dmaengine-dw-convert-dw_dma_slave-to-use-explicit-HS.patch
create mode 100644 features/soc/baytrail/dmaengine-dw-enable-clock-before-access.patch
create mode 100644 features/soc/baytrail/dmaengine-dw-fix-checkpatch.pl-warnings.patch
create mode 100644 features/soc/baytrail/dmaengine-dw-fix-regression-in-dw_probe-function.patch
create mode 100644 features/soc/baytrail/dmaengine-dw-introduce-generic-filter-function.patch
create mode 100644 features/soc/baytrail/dmaengine-dw-move-clock-operations-to-platform.c.patch
create mode 100644 features/soc/baytrail/dmaengine-dw-move-dw_dmac.h-to-where-it-belongs-to.patch
diff --git a/features/soc/baytrail/baytrail.scc b/features/soc/baytrail/baytrail.scc
index bd2bb4b..03a22d0 100644
--- a/features/soc/baytrail/baytrail.scc
+++ b/features/soc/baytrail/baytrail.scc
@@ -44,3 +44,13 @@ patch mmc-block-refactor-read-only-handling.patch
patch mmc-block-implement-write-request-blocking.patch
patch mmc-support-whole-device-temporary-write-protection-.patch
patch mmc-block-Fix-checkpatch.pl-warning.patch
+patch dma-dw-Fix-Intel-MID-DMA-driver-and-Designware-DMA-d.patch
+patch dma-dw-allocate-memory-in-two-stages-in-probe.patch
+patch dmaengine-dw-enable-clock-before-access.patch
+patch dmaengine-dw-fix-regression-in-dw_probe-function.patch
+patch dmaengine-dw-move-dw_dmac.h-to-where-it-belongs-to.patch
+patch dmaengine-dw-convert-dw_dma_slave-to-use-explicit-HS.patch
+patch dmaengine-dw-apply-both-HS-interfaces-and-remove-sla.patch
+patch dmaengine-dw-introduce-generic-filter-function.patch
+patch dmaengine-dw-move-clock-operations-to-platform.c.patch
+patch dmaengine-dw-fix-checkpatch.pl-warnings.patch
diff --git a/features/soc/baytrail/dma-dw-Fix-Intel-MID-DMA-driver-and-Designware-DMA-d.patch b/features/soc/baytrail/dma-dw-Fix-Intel-MID-DMA-driver-and-Designware-DMA-d.patch
new file mode 100644
index 0000000..4fd2897
--- /dev/null
+++ b/features/soc/baytrail/dma-dw-Fix-Intel-MID-DMA-driver-and-Designware-DMA-d.patch
@@ -0,0 +1,39 @@
+From 3e0266d1190c6727f7757c069563aedb9a559fc5 Mon Sep 17 00:00:00 2001
+From: "Chew, Chiau Ee" <chiau.ee.chew at intel.com>
+Date: Wed, 8 May 2013 16:03:20 +0800
+Subject: [PATCH 003/164] dma: dw: Fix Intel MID DMA driver and Designware DMA
+ driver loading sequence
+
+There is channel resource contention between Intel MID DMA
+driver and Designware DMA driver if Intel MID DMA driver is
+enabled for LPE Audio usage. Since LPIO devices are tied to
+fixed DMA channel numbers, so the Designware DMA controller
+has to be first enumerated in order to occupy the required
+channel number.
+
+Signed-off-by: Chew, Chiau Ee <chiau.ee.chew at intel.com>
+Signed-off-by: Maurice Petallo <mauricex.r.petallo at intel.com>
+---
+ drivers/dma/Makefile | 2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/dma/Makefile b/drivers/dma/Makefile
+index a029d0f4..3df1ac8 100644
+--- a/drivers/dma/Makefile
++++ b/drivers/dma/Makefile
+@@ -7,7 +7,6 @@ obj-$(CONFIG_DMA_ACPI) += acpi-dma.o
+ obj-$(CONFIG_DMA_OF) += of-dma.o
+
+ obj-$(CONFIG_NET_DMA) += iovlock.o
+-obj-$(CONFIG_INTEL_MID_DMAC) += intel_mid_dma.o
+ obj-$(CONFIG_DMATEST) += dmatest.o
+ obj-$(CONFIG_INTEL_IOATDMA) += ioat/
+ obj-$(CONFIG_INTEL_IOP_ADMA) += iop-adma.o
+@@ -44,3 +43,4 @@ obj-$(CONFIG_DMA_JZ4740) += dma-jz4740.o
+ obj-$(CONFIG_TI_CPPI41) += cppi41.o
+ obj-$(CONFIG_K3_DMA) += k3dma.o
+ obj-$(CONFIG_MOXART_DMA) += moxart-dma.o
++obj-$(CONFIG_INTEL_MID_DMAC) += intel_mid_dma.o
+--
+1.7.7.6
+
diff --git a/features/soc/baytrail/dma-dw-allocate-memory-in-two-stages-in-probe.patch b/features/soc/baytrail/dma-dw-allocate-memory-in-two-stages-in-probe.patch
new file mode 100644
index 0000000..e0bdb61
--- /dev/null
+++ b/features/soc/baytrail/dma-dw-allocate-memory-in-two-stages-in-probe.patch
@@ -0,0 +1,88 @@
+From eabd6e958af4415d69eee87aad547185c14ae624 Mon Sep 17 00:00:00 2001
+From: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
+Date: Wed, 5 Mar 2014 15:48:12 +0200
+Subject: [PATCH 032/164] dma: dw: allocate memory in two stages in probe
+
+This makes the probe() function a little bit clearer.
+
+Signed-off-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
+Signed-off-by: Vinod Koul <vinod.koul at intel.com>
+(cherry picked from commit 000871ce0336572f5b126a4d7f1ec13fc9adfda2)
+Signed-off-by: Wan Ahmad Zainie <wan.ahmad.zainie.wan.mohamad at intel.com>
+---
+ drivers/dma/dw/core.c | 17 ++++++++++-------
+ drivers/dma/dw/regs.h | 4 ++--
+ 2 files changed, 12 insertions(+), 9 deletions(-)
+
+diff --git a/drivers/dma/dw/core.c b/drivers/dma/dw/core.c
+index b0972b3..c4fbd3e 100644
+--- a/drivers/dma/dw/core.c
++++ b/drivers/dma/dw/core.c
+@@ -1477,7 +1477,6 @@ static void dw_dma_off(struct dw_dma *dw)
+ int dw_dma_probe(struct dw_dma_chip *chip, struct dw_dma_platform_data *pdata)
+ {
+ struct dw_dma *dw;
+- size_t size;
+ bool autocfg;
+ unsigned int dw_params;
+ unsigned int nr_channels;
+@@ -1485,6 +1484,13 @@ int dw_dma_probe(struct dw_dma_chip *chip, struct dw_dma_platform_data *pdata)
+ int err;
+ int i;
+
++ dw = devm_kzalloc(chip->dev, sizeof(*dw), GFP_KERNEL);
++ if (!dw)
++ return -ENOMEM;
++
++ dw->regs = chip->regs;
++ chip->dw = dw;
++
+ dw_params = dma_read_byaddr(chip->regs, DW_PARAMS);
+ autocfg = dw_params >> DW_PARAMS_EN & 0x1;
+
+@@ -1507,9 +1513,9 @@ int dw_dma_probe(struct dw_dma_chip *chip, struct dw_dma_platform_data *pdata)
+ else
+ nr_channels = pdata->nr_channels;
+
+- size = sizeof(struct dw_dma) + nr_channels * sizeof(struct dw_dma_chan);
+- dw = devm_kzalloc(chip->dev, size, GFP_KERNEL);
+- if (!dw)
++ dw->chan = devm_kcalloc(chip->dev, nr_channels, sizeof(*dw->chan),
++ GFP_KERNEL);
++ if (!dw->chan)
+ return -ENOMEM;
+
+ dw->clk = devm_clk_get(chip->dev, "hclk");
+@@ -1517,9 +1523,6 @@ int dw_dma_probe(struct dw_dma_chip *chip, struct dw_dma_platform_data *pdata)
+ return PTR_ERR(dw->clk);
+ clk_prepare_enable(dw->clk);
+
+- dw->regs = chip->regs;
+- chip->dw = dw;
+-
+ /* Get hardware configuration parameters */
+ if (autocfg) {
+ max_blk_size = dma_readl(dw, MAX_BLK_SIZE);
+diff --git a/drivers/dma/dw/regs.h b/drivers/dma/dw/regs.h
+index deb4274..bb98d3e 100644
+--- a/drivers/dma/dw/regs.h
++++ b/drivers/dma/dw/regs.h
+@@ -252,13 +252,13 @@ struct dw_dma {
+ struct tasklet_struct tasklet;
+ struct clk *clk;
+
++ /* channels */
++ struct dw_dma_chan *chan;
+ u8 all_chan_mask;
+
+ /* hardware configuration */
+ unsigned char nr_masters;
+ unsigned char data_width[4];
+-
+- struct dw_dma_chan chan[0];
+ };
+
+ static inline struct dw_dma_regs __iomem *__dw_regs(struct dw_dma *dw)
+--
+1.7.7.6
+
diff --git a/features/soc/baytrail/dmaengine-dw-apply-both-HS-interfaces-and-remove-sla.patch b/features/soc/baytrail/dmaengine-dw-apply-both-HS-interfaces-and-remove-sla.patch
new file mode 100644
index 0000000..a0144f3
--- /dev/null
+++ b/features/soc/baytrail/dmaengine-dw-apply-both-HS-interfaces-and-remove-sla.patch
@@ -0,0 +1,155 @@
+From d2b2300659467eade49d809c7c3f85ff31eddbe9 Mon Sep 17 00:00:00 2001
+From: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
+Date: Tue, 19 Aug 2014 20:29:15 +0300
+Subject: [PATCH 037/164] dmaengine: dw: apply both HS interfaces and remove
+ slave_id usage
+
+Instead of one request line member let's use both source and destination ones.
+Usually we have no such hardware except Atmel MMC controller found on AVR32
+platform (see arch/avr32/mach-at32ap/at32ap700x.c and
+drivers/mmc/host/atmel-mci.c).
+
+This patch removes slave_id usage since it'll be removed from the generic
+structure in later. This breaks the non-ACPI / non-DT cases for the users of
+the driver, i.e. SPI and HSUART. However, these cases mean only PCI enumerated
+devices for now, which is anyway broken (considering more than one DMA
+controller in the system) and this patch series is intended to fix that
+eventually.
+
+The ACPI and DT cases shall be aware of the channel direction when setting
+request lines, but this is a minor problem that would be addressed in future.
+
+Suggested-by: Arnd Bergmann <arnd at arndb.de>
+Signed-off-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
+Signed-off-by: Vinod Koul <vinod.koul at intel.com>
+(cherry picked from commit 8950052029874a6738552debb45077c596e90e6b)
+Signed-off-by: Wan Ahmad Zainie <wan.ahmad.zainie.wan.mohamad at intel.com>
+---
+ drivers/dma/dw/core.c | 32 ++------------------------------
+ drivers/dma/dw/platform.c | 6 ++++--
+ drivers/dma/dw/regs.h | 7 ++++---
+ 3 files changed, 10 insertions(+), 35 deletions(-)
+
+diff --git a/drivers/dma/dw/core.c b/drivers/dma/dw/core.c
+index 25abadd..9a1eb07 100644
+--- a/drivers/dma/dw/core.c
++++ b/drivers/dma/dw/core.c
+@@ -37,24 +37,6 @@
+ * which does not support descriptor writeback.
+ */
+
+-static inline bool is_request_line_unset(struct dw_dma_chan *dwc)
+-{
+- return dwc->request_line == (typeof(dwc->request_line))~0;
+-}
+-
+-static inline void dwc_set_masters(struct dw_dma_chan *dwc)
+-{
+- struct dw_dma *dw = to_dw_dma(dwc->chan.device);
+- struct dw_dma_slave *dws = dwc->chan.private;
+- unsigned char mmax = dw->nr_masters - 1;
+-
+- if (!is_request_line_unset(dwc))
+- return;
+-
+- dwc->src_master = min_t(unsigned char, mmax, dwc_get_sms(dws));
+- dwc->dst_master = min_t(unsigned char, mmax, dwc_get_dms(dws));
+-}
+-
+ #define DWC_DEFAULT_CTLLO(_chan) ({ \
+ struct dw_dma_chan *_dwc = to_dw_dma_chan(_chan); \
+ struct dma_slave_config *_sconfig = &_dwc->dma_sconfig; \
+@@ -158,10 +140,8 @@ static void dwc_initialize(struct dw_dma_chan *dwc)
+ cfghi |= DWC_CFGH_DST_PER(dws->dst_id);
+ cfghi |= DWC_CFGH_SRC_PER(dws->src_id);
+ } else {
+- if (dwc->direction == DMA_MEM_TO_DEV)
+- cfghi = DWC_CFGH_DST_PER(dwc->request_line);
+- else if (dwc->direction == DMA_DEV_TO_MEM)
+- cfghi = DWC_CFGH_SRC_PER(dwc->request_line);
++ cfghi |= DWC_CFGH_DST_PER(dwc->dst_id);
++ cfghi |= DWC_CFGH_SRC_PER(dwc->src_id);
+ }
+
+ channel_writel(dwc, CFG_LO, cfglo);
+@@ -963,10 +943,6 @@ set_runtime_config(struct dma_chan *chan, struct dma_slave_config *sconfig)
+ memcpy(&dwc->dma_sconfig, sconfig, sizeof(*sconfig));
+ dwc->direction = sconfig->direction;
+
+- /* Take the request line from slave_id member */
+- if (is_request_line_unset(dwc))
+- dwc->request_line = sconfig->slave_id;
+-
+ convert_burst(&dwc->dma_sconfig.src_maxburst);
+ convert_burst(&dwc->dma_sconfig.dst_maxburst);
+
+@@ -1119,8 +1095,6 @@ static int dwc_alloc_chan_resources(struct dma_chan *chan)
+ * doesn't mean what you think it means), and status writeback.
+ */
+
+- dwc_set_masters(dwc);
+-
+ spin_lock_irqsave(&dwc->lock, flags);
+ i = dwc->descs_allocated;
+ while (dwc->descs_allocated < NR_DESCS_PER_CHANNEL) {
+@@ -1178,7 +1152,6 @@ static void dwc_free_chan_resources(struct dma_chan *chan)
+ list_splice_init(&dwc->free_list, &list);
+ dwc->descs_allocated = 0;
+ dwc->initialized = false;
+- dwc->request_line = ~0;
+
+ /* Disable interrupts */
+ channel_clear_bit(dw, MASK.XFER, dwc->mask);
+@@ -1600,7 +1573,6 @@ int dw_dma_probe(struct dw_dma_chip *chip, struct dw_dma_platform_data *pdata)
+ channel_clear_bit(dw, CH_EN, dwc->mask);
+
+ dwc->direction = DMA_TRANS_NONE;
+- dwc->request_line = ~0;
+
+ /* Hardware configuration */
+ if (autocfg) {
+diff --git a/drivers/dma/dw/platform.c b/drivers/dma/dw/platform.c
+index fe8b0c9..d878d22 100644
+--- a/drivers/dma/dw/platform.c
++++ b/drivers/dma/dw/platform.c
+@@ -41,7 +41,8 @@ static bool dw_dma_of_filter(struct dma_chan *chan, void *param)
+ if (chan->device != &fargs->dw->dma)
+ return false;
+
+- dwc->request_line = fargs->req;
++ dwc->src_id = fargs->req;
++ dwc->dst_id = fargs->req;
+ dwc->src_master = fargs->src;
+ dwc->dst_master = fargs->dst;
+
+@@ -88,7 +89,8 @@ static bool dw_dma_acpi_filter(struct dma_chan *chan, void *param)
+ chan->chan_id != dma_spec->chan_id)
+ return false;
+
+- dwc->request_line = dma_spec->slave_id;
++ dwc->src_id = dma_spec->slave_id;
++ dwc->dst_id = dma_spec->slave_id;
+ dwc->src_master = dwc_get_sms(NULL);
+ dwc->dst_master = dwc_get_dms(NULL);
+
+diff --git a/drivers/dma/dw/regs.h b/drivers/dma/dw/regs.h
+index af02439..0e82d99 100644
+--- a/drivers/dma/dw/regs.h
++++ b/drivers/dma/dw/regs.h
+@@ -221,9 +221,10 @@ struct dw_dma_chan {
+ bool nollp;
+
+ /* custom slave configuration */
+- unsigned int request_line;
+- unsigned char src_master;
+- unsigned char dst_master;
++ u8 src_id;
++ u8 dst_id;
++ u8 src_master;
++ u8 dst_master;
+
+ /* configuration passed via DMA_SLAVE_CONFIG */
+ struct dma_slave_config dma_sconfig;
+--
+1.7.7.6
+
diff --git a/features/soc/baytrail/dmaengine-dw-convert-dw_dma_slave-to-use-explicit-HS.patch b/features/soc/baytrail/dmaengine-dw-convert-dw_dma_slave-to-use-explicit-HS.patch
new file mode 100644
index 0000000..913556a
--- /dev/null
+++ b/features/soc/baytrail/dmaengine-dw-convert-dw_dma_slave-to-use-explicit-HS.patch
@@ -0,0 +1,114 @@
+From 3a4c583b4b77ffdca96e950750019de6b719104a Mon Sep 17 00:00:00 2001
+From: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
+Date: Tue, 19 Aug 2014 20:29:14 +0300
+Subject: [PATCH 036/164] dmaengine: dw: convert dw_dma_slave to use explicit
+ HS interfaces
+
+Instead of exposing the possibility to set DMA registers CFG_HI and CFG_LO
+strict user to provide handshake interfaces explicitly.
+
+Signed-off-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
+Acked-by: Hans-Christian Egtvedt <egtvedt at samfundet.no>
+Signed-off-by: Vinod Koul <vinod.koul at intel.com>
+(cherry picked from commit 7e1e2f27c5508518e58e5cbb11e26cbb815f4c56)
+Signed-off-by: Wan Ahmad Zainie <wan.ahmad.zainie.wan.mohamad at intel.com>
+
+Conflicts:
+ arch/avr32/mach-at32ap/at32ap700x.c
+---
+ arch/avr32/mach-at32ap/at32ap700x.c | 15 +++++----------
+ drivers/dma/dw/core.c | 4 ++--
+ include/linux/platform_data/dma-dw.h | 10 ++++------
+ 3 files changed, 11 insertions(+), 18 deletions(-)
+
+diff --git a/arch/avr32/mach-at32ap/at32ap700x.c b/arch/avr32/mach-at32ap/at32ap700x.c
+index 1756416..2ca9e66 100644
+--- a/arch/avr32/mach-at32ap/at32ap700x.c
++++ b/arch/avr32/mach-at32ap/at32ap700x.c
+@@ -1356,10 +1356,8 @@ at32_add_device_mci(unsigned int id, struct mci_platform_data *data)
+ goto fail;
+
+ slave->sdata.dma_dev = &dw_dmac0_device.dev;
+- slave->sdata.cfg_hi = (DWC_CFGH_SRC_PER(0)
+- | DWC_CFGH_DST_PER(1));
+- slave->sdata.cfg_lo &= ~(DWC_CFGL_HS_DST_POL
+- | DWC_CFGL_HS_SRC_POL);
++ slave->sdata.src_id = 0;
++ slave->sdata.dst_id = 1;
+
+ data->dma_slave = slave;
+
+@@ -2055,8 +2053,7 @@ at32_add_device_ac97c(unsigned int id, struct ac97c_platform_data *data,
+ /* Check if DMA slave interface for capture should be configured. */
+ if (flags & AC97C_CAPTURE) {
+ rx_dws->dma_dev = &dw_dmac0_device.dev;
+- rx_dws->cfg_hi = DWC_CFGH_SRC_PER(3);
+- rx_dws->cfg_lo &= ~(DWC_CFGL_HS_DST_POL | DWC_CFGL_HS_SRC_POL);
++ rx_dws->src_id = 3;
+ rx_dws->src_master = 0;
+ rx_dws->dst_master = 1;
+ }
+@@ -2064,8 +2061,7 @@ at32_add_device_ac97c(unsigned int id, struct ac97c_platform_data *data,
+ /* Check if DMA slave interface for playback should be configured. */
+ if (flags & AC97C_PLAYBACK) {
+ tx_dws->dma_dev = &dw_dmac0_device.dev;
+- tx_dws->cfg_hi = DWC_CFGH_DST_PER(4);
+- tx_dws->cfg_lo &= ~(DWC_CFGL_HS_DST_POL | DWC_CFGL_HS_SRC_POL);
++ tx_dws->dst_id = 4;
+ tx_dws->src_master = 0;
+ tx_dws->dst_master = 1;
+ }
+@@ -2137,8 +2133,7 @@ at32_add_device_abdac(unsigned int id, struct atmel_abdac_pdata *data)
+ dws = &data->dws;
+
+ dws->dma_dev = &dw_dmac0_device.dev;
+- dws->cfg_hi = DWC_CFGH_DST_PER(2);
+- dws->cfg_lo &= ~(DWC_CFGL_HS_DST_POL | DWC_CFGL_HS_SRC_POL);
++ dws->dst_id = 2;
+ dws->src_master = 0;
+ dws->dst_master = 1;
+
+diff --git a/drivers/dma/dw/core.c b/drivers/dma/dw/core.c
+index 80301a1..25abadd 100644
+--- a/drivers/dma/dw/core.c
++++ b/drivers/dma/dw/core.c
+@@ -155,8 +155,8 @@ static void dwc_initialize(struct dw_dma_chan *dwc)
+ */
+ BUG_ON(!dws->dma_dev || dws->dma_dev != dw->dma.dev);
+
+- cfghi = dws->cfg_hi;
+- cfglo |= dws->cfg_lo & ~DWC_CFGL_CH_PRIOR_MASK;
++ cfghi |= DWC_CFGH_DST_PER(dws->dst_id);
++ cfghi |= DWC_CFGH_SRC_PER(dws->src_id);
+ } else {
+ if (dwc->direction == DMA_MEM_TO_DEV)
+ cfghi = DWC_CFGH_DST_PER(dwc->request_line);
+diff --git a/include/linux/platform_data/dma-dw.h b/include/linux/platform_data/dma-dw.h
+index 481ab23..f2ad24b 100644
+--- a/include/linux/platform_data/dma-dw.h
++++ b/include/linux/platform_data/dma-dw.h
+@@ -18,17 +18,15 @@
+ * struct dw_dma_slave - Controller-specific information about a slave
+ *
+ * @dma_dev: required DMA master device. Depricated.
+- * @bus_id: name of this device channel, not just a device name since
+- * devices may have more than one channel e.g. "foo_tx"
+- * @cfg_hi: Platform-specific initializer for the CFG_HI register
+- * @cfg_lo: Platform-specific initializer for the CFG_LO register
++ * @src_id: src request line
++ * @dst_id: dst request line
+ * @src_master: src master for transfers on allocated channel.
+ * @dst_master: dest master for transfers on allocated channel.
+ */
+ struct dw_dma_slave {
+ struct device *dma_dev;
+- u32 cfg_hi;
+- u32 cfg_lo;
++ u8 src_id;
++ u8 dst_id;
+ u8 src_master;
+ u8 dst_master;
+ };
+--
+1.7.7.6
+
diff --git a/features/soc/baytrail/dmaengine-dw-enable-clock-before-access.patch b/features/soc/baytrail/dmaengine-dw-enable-clock-before-access.patch
new file mode 100644
index 0000000..3956a35
--- /dev/null
+++ b/features/soc/baytrail/dmaengine-dw-enable-clock-before-access.patch
@@ -0,0 +1,48 @@
+From 2508dcd5c8d5b9b9f4fafb44bcde6d6d04242b13 Mon Sep 17 00:00:00 2001
+From: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
+Date: Thu, 8 May 2014 12:01:48 +0300
+Subject: [PATCH 033/164] dmaengine: dw: enable clock before access
+
+hclk signal is a bus clock. So, it means we have to have it enabled during
+access to the DMA controller. This patch makes sure that we enable clock before
+access to the device, though it currently works on Intel hardware.
+
+Signed-off-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
+Signed-off-by: Vinod Koul <vinod.koul at intel.com>
+(cherry picked from commit d2f78e95e42a9130002c76f1a1f76e657a4b4004)
+Signed-off-by: Wan Ahmad Zainie <wan.ahmad.zainie.wan.mohamad at intel.com>
+---
+ drivers/dma/dw/core.c | 10 +++++-----
+ 1 files changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/dma/dw/core.c b/drivers/dma/dw/core.c
+index c4fbd3e..ba8ddba 100644
+--- a/drivers/dma/dw/core.c
++++ b/drivers/dma/dw/core.c
+@@ -1491,6 +1491,11 @@ int dw_dma_probe(struct dw_dma_chip *chip, struct dw_dma_platform_data *pdata)
+ dw->regs = chip->regs;
+ chip->dw = dw;
+
++ dw->clk = devm_clk_get(chip->dev, "hclk");
++ if (IS_ERR(dw->clk))
++ return PTR_ERR(dw->clk);
++ clk_prepare_enable(dw->clk);
++
+ dw_params = dma_read_byaddr(chip->regs, DW_PARAMS);
+ autocfg = dw_params >> DW_PARAMS_EN & 0x1;
+
+@@ -1518,11 +1523,6 @@ int dw_dma_probe(struct dw_dma_chip *chip, struct dw_dma_platform_data *pdata)
+ if (!dw->chan)
+ return -ENOMEM;
+
+- dw->clk = devm_clk_get(chip->dev, "hclk");
+- if (IS_ERR(dw->clk))
+- return PTR_ERR(dw->clk);
+- clk_prepare_enable(dw->clk);
+-
+ /* Get hardware configuration parameters */
+ if (autocfg) {
+ max_blk_size = dma_readl(dw, MAX_BLK_SIZE);
+--
+1.7.7.6
+
diff --git a/features/soc/baytrail/dmaengine-dw-fix-checkpatch.pl-warnings.patch b/features/soc/baytrail/dmaengine-dw-fix-checkpatch.pl-warnings.patch
new file mode 100644
index 0000000..a45de80
--- /dev/null
+++ b/features/soc/baytrail/dmaengine-dw-fix-checkpatch.pl-warnings.patch
@@ -0,0 +1,40 @@
+From a2bfe9dfba7a50b4a276d3f8bec89d8d476674e5 Mon Sep 17 00:00:00 2001
+From: Wan Ahmad Zainie <wan.ahmad.zainie.wan.mohamad at intel.com>
+Date: Fri, 21 Aug 2015 11:07:23 +0800
+Subject: [PATCH 151/164] dmaengine: dw: fix checkpatch.pl warnings
+
+This commit is to fix the result of running scripts/checkpatch.pl against
+0035-dmaengine-dw-move-dw_dmac.h-to-where-it-belongs-to.patch
+
+Signed-off-by: Wan Ahmad Zainie <wan.ahmad.zainie.wan.mohamad at intel.com>
+---
+ drivers/dma/dw/regs.h | 6 ++++--
+ 1 files changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/dma/dw/regs.h b/drivers/dma/dw/regs.h
+index 00d27a9..8f1e0fb 100644
+--- a/drivers/dma/dw/regs.h
++++ b/drivers/dma/dw/regs.h
+@@ -161,7 +161,8 @@ struct dw_dma_regs {
+ #define DWC_CTLH_DONE 0x00001000
+ #define DWC_CTLH_BLOCK_TS_MASK 0x00000fff
+
+-/* Bitfields in CFG_LO. Platform-configurable bits are in <linux/platform_data/dma-dw.h> */
++/* Bitfields in CFG_LO.
++ * Platform-configurable bits are in <linux/platform_data/dma-dw.h> */
+ #define DWC_CFGL_CH_PRIOR_MASK (0x7 << 5) /* priority mask */
+ #define DWC_CFGL_CH_PRIOR(x) ((x) << 5) /* priority */
+ #define DWC_CFGL_CH_SUSP (1 << 8) /* pause xfer */
+@@ -172,7 +173,8 @@ struct dw_dma_regs {
+ #define DWC_CFGL_RELOAD_SAR (1 << 30)
+ #define DWC_CFGL_RELOAD_DAR (1 << 31)
+
+-/* Bitfields in CFG_HI. Platform-configurable bits are in <linux/platform_data/dma-dw.h> */
++/* Bitfields in CFG_HI.
++ * Platform-configurable bits are in <linux/platform_data/dma-dw.h> */
+ #define DWC_CFGH_DS_UPD_EN (1 << 5)
+ #define DWC_CFGH_SS_UPD_EN (1 << 6)
+
+--
+1.7.7.6
+
diff --git a/features/soc/baytrail/dmaengine-dw-fix-regression-in-dw_probe-function.patch b/features/soc/baytrail/dmaengine-dw-fix-regression-in-dw_probe-function.patch
new file mode 100644
index 0000000..da1e13d
--- /dev/null
+++ b/features/soc/baytrail/dmaengine-dw-fix-regression-in-dw_probe-function.patch
@@ -0,0 +1,114 @@
+From fe77edb836d579f294b1f2c94992790e3ec44758 Mon Sep 17 00:00:00 2001
+From: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
+Date: Thu, 8 May 2014 12:01:49 +0300
+Subject: [PATCH 034/164] dmaengine: dw: fix regression in dw_probe() function
+
+The commit dbde5c29 "dw_dmac: use devm_* functions to simplify code" turns
+probe function to use devm_* helpers and simultaneously brings a regression.
+
+We have to 1) call clk_disable_unprepare() on error path, and 2) check error
+code of clk_enable_prepare(). First part was done in the original code, second
+one is an update.
+
+Signed-off-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
+Signed-off-by: Vinod Koul <vinod.koul at intel.com>
+(cherry picked from commit 8be4f523b48087765defd18483c66b268b3286e5)
+Signed-off-by: Wan Ahmad Zainie <wan.ahmad.zainie.wan.mohamad at intel.com>
+---
+ drivers/dma/dw/core.c | 33 ++++++++++++++++++++++++---------
+ 1 files changed, 24 insertions(+), 9 deletions(-)
+
+diff --git a/drivers/dma/dw/core.c b/drivers/dma/dw/core.c
+index ba8ddba..80301a1 100644
+--- a/drivers/dma/dw/core.c
++++ b/drivers/dma/dw/core.c
+@@ -1494,7 +1494,9 @@ int dw_dma_probe(struct dw_dma_chip *chip, struct dw_dma_platform_data *pdata)
+ dw->clk = devm_clk_get(chip->dev, "hclk");
+ if (IS_ERR(dw->clk))
+ return PTR_ERR(dw->clk);
+- clk_prepare_enable(dw->clk);
++ err = clk_prepare_enable(dw->clk);
++ if (err)
++ return err;
+
+ dw_params = dma_read_byaddr(chip->regs, DW_PARAMS);
+ autocfg = dw_params >> DW_PARAMS_EN & 0x1;
+@@ -1503,15 +1505,19 @@ int dw_dma_probe(struct dw_dma_chip *chip, struct dw_dma_platform_data *pdata)
+
+ if (!pdata && autocfg) {
+ pdata = devm_kzalloc(chip->dev, sizeof(*pdata), GFP_KERNEL);
+- if (!pdata)
+- return -ENOMEM;
++ if (!pdata) {
++ err = -ENOMEM;
++ goto err_pdata;
++ }
+
+ /* Fill platform data with the default values */
+ pdata->is_private = true;
+ pdata->chan_allocation_order = CHAN_ALLOCATION_ASCENDING;
+ pdata->chan_priority = CHAN_PRIORITY_ASCENDING;
+- } else if (!pdata || pdata->nr_channels > DW_DMA_MAX_NR_CHANNELS)
+- return -EINVAL;
++ } else if (!pdata || pdata->nr_channels > DW_DMA_MAX_NR_CHANNELS) {
++ err = -EINVAL;
++ goto err_pdata;
++ }
+
+ if (autocfg)
+ nr_channels = (dw_params >> DW_PARAMS_NR_CHAN & 0x7) + 1;
+@@ -1520,8 +1526,10 @@ int dw_dma_probe(struct dw_dma_chip *chip, struct dw_dma_platform_data *pdata)
+
+ dw->chan = devm_kcalloc(chip->dev, nr_channels, sizeof(*dw->chan),
+ GFP_KERNEL);
+- if (!dw->chan)
+- return -ENOMEM;
++ if (!dw->chan) {
++ err = -ENOMEM;
++ goto err_pdata;
++ }
+
+ /* Get hardware configuration parameters */
+ if (autocfg) {
+@@ -1551,7 +1559,8 @@ int dw_dma_probe(struct dw_dma_chip *chip, struct dw_dma_platform_data *pdata)
+ sizeof(struct dw_desc), 4, 0);
+ if (!dw->desc_pool) {
+ dev_err(chip->dev, "No memory for descriptors dma pool\n");
+- return -ENOMEM;
++ err = -ENOMEM;
++ goto err_pdata;
+ }
+
+ tasklet_init(&dw->tasklet, dw_dma_tasklet, (unsigned long)dw);
+@@ -1559,7 +1568,7 @@ int dw_dma_probe(struct dw_dma_chip *chip, struct dw_dma_platform_data *pdata)
+ err = request_irq(chip->irq, dw_dma_interrupt, IRQF_SHARED,
+ "dw_dmac", dw);
+ if (err)
+- return err;
++ goto err_pdata;
+
+ INIT_LIST_HEAD(&dw->dma.channels);
+ for (i = 0; i < nr_channels; i++) {
+@@ -1654,6 +1663,10 @@ int dw_dma_probe(struct dw_dma_chip *chip, struct dw_dma_platform_data *pdata)
+ dma_async_device_register(&dw->dma);
+
+ return 0;
++
++err_pdata:
++ clk_disable_unprepare(dw->clk);
++ return err;
+ }
+ EXPORT_SYMBOL_GPL(dw_dma_probe);
+
+@@ -1674,6 +1687,8 @@ int dw_dma_remove(struct dw_dma_chip *chip)
+ channel_clear_bit(dw, CH_EN, dwc->mask);
+ }
+
++ clk_disable_unprepare(dw->clk);
++
+ return 0;
+ }
+ EXPORT_SYMBOL_GPL(dw_dma_remove);
+--
+1.7.7.6
+
diff --git a/features/soc/baytrail/dmaengine-dw-introduce-generic-filter-function.patch b/features/soc/baytrail/dmaengine-dw-introduce-generic-filter-function.patch
new file mode 100644
index 0000000..85a60bc
--- /dev/null
+++ b/features/soc/baytrail/dmaengine-dw-introduce-generic-filter-function.patch
@@ -0,0 +1,195 @@
+From e2bc0ad33c7909de23bafe738f66e5dfc315fc45 Mon Sep 17 00:00:00 2001
+From: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
+Date: Tue, 19 Aug 2014 20:29:16 +0300
+Subject: [PATCH 038/164] dmaengine: dw: introduce generic filter function
+
+The introduced filter function would be reused in the ACPI and DT cases since
+in those cases we have to apply mandatory data to the requested channel. Thus,
+patch moves platform driver to use it in that case.
+
+The function unlikely can't be used by users of the driver due to an implicit
+dependency to the dw_dmac_core module.
+
+Signed-off-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
+Signed-off-by: Vinod Koul <vinod.koul at intel.com>
+(cherry picked from commit 4d130de20c3f39fc1a1aecd3969b50d49ff2e358)
+Signed-off-by: Wan Ahmad Zainie <wan.ahmad.zainie.wan.mohamad at intel.com>
+
+Conflicts:
+ drivers/dma/dw/platform.c
+ Due to commit
+ 1be347b dmaengine: dw: append MODULE_ALIAS for platform driver
+---
+ drivers/dma/dw/core.c | 20 ++++++++++++++
+ drivers/dma/dw/internal.h | 24 +----------------
+ drivers/dma/dw/platform.c | 63 +++++++++++++-------------------------------
+ 3 files changed, 40 insertions(+), 67 deletions(-)
+
+diff --git a/drivers/dma/dw/core.c b/drivers/dma/dw/core.c
+index 9a1eb07..91e5f22 100644
+--- a/drivers/dma/dw/core.c
++++ b/drivers/dma/dw/core.c
+@@ -915,6 +915,26 @@ err_desc_get:
+ return NULL;
+ }
+
++bool dw_dma_filter(struct dma_chan *chan, void *param)
++{
++ struct dw_dma_chan *dwc = to_dw_dma_chan(chan);
++ struct dw_dma_slave *dws = param;
++
++ if (!dws || dws->dma_dev != chan->device->dev)
++ return false;
++
++ /* We have to copy data since dws can be temporary storage */
++
++ dwc->src_id = dws->src_id;
++ dwc->dst_id = dws->dst_id;
++
++ dwc->src_master = dws->src_master;
++ dwc->dst_master = dws->dst_master;
++
++ return true;
++}
++EXPORT_SYMBOL_GPL(dw_dma_filter);
++
+ /*
+ * Fix sconfig's burst size according to dw_dmac. We need to convert them as:
+ * 1 -> 0, 4 -> 1, 8 -> 2, 16 -> 3.
+diff --git a/drivers/dma/dw/internal.h b/drivers/dma/dw/internal.h
+index 43cc1df..2c8d02f 100644
+--- a/drivers/dma/dw/internal.h
++++ b/drivers/dma/dw/internal.h
+@@ -43,28 +43,6 @@ int dw_dma_resume(struct dw_dma_chip *chip);
+
+ #endif /* CONFIG_PM_SLEEP */
+
+-/**
+- * dwc_get_dms - get destination master
+- * @slave: pointer to the custom slave configuration
+- *
+- * Returns destination master in the custom slave configuration if defined, or
+- * default value otherwise.
+- */
+-static inline unsigned int dwc_get_dms(struct dw_dma_slave *slave)
+-{
+- return slave ? slave->dst_master : 0;
+-}
+-
+-/**
+- * dwc_get_sms - get source master
+- * @slave: pointer to the custom slave configuration
+- *
+- * Returns source master in the custom slave configuration if defined, or
+- * default value otherwise.
+- */
+-static inline unsigned int dwc_get_sms(struct dw_dma_slave *slave)
+-{
+- return slave ? slave->src_master : 1;
+-}
++extern bool dw_dma_filter(struct dma_chan *chan, void *param);
+
+ #endif /* _DW_DMAC_INTERNAL_H */
+diff --git a/drivers/dma/dw/platform.c b/drivers/dma/dw/platform.c
+index d878d22..43122d6 100644
+--- a/drivers/dma/dw/platform.c
++++ b/drivers/dma/dw/platform.c
+@@ -25,76 +25,51 @@
+
+ #include "internal.h"
+
+-struct dw_dma_of_filter_args {
+- struct dw_dma *dw;
+- unsigned int req;
+- unsigned int src;
+- unsigned int dst;
+-};
+-
+-static bool dw_dma_of_filter(struct dma_chan *chan, void *param)
+-{
+- struct dw_dma_chan *dwc = to_dw_dma_chan(chan);
+- struct dw_dma_of_filter_args *fargs = param;
+-
+- /* Ensure the device matches our channel */
+- if (chan->device != &fargs->dw->dma)
+- return false;
+-
+- dwc->src_id = fargs->req;
+- dwc->dst_id = fargs->req;
+- dwc->src_master = fargs->src;
+- dwc->dst_master = fargs->dst;
+-
+- return true;
+-}
+-
+ #define DRV_NAME "dw_dmac"
+
+ static struct dma_chan *dw_dma_of_xlate(struct of_phandle_args *dma_spec,
+ struct of_dma *ofdma)
+ {
+ struct dw_dma *dw = ofdma->of_dma_data;
+- struct dw_dma_of_filter_args fargs = {
+- .dw = dw,
++ struct dw_dma_slave slave = {
++ .dma_dev = dw->dma.dev,
+ };
+ dma_cap_mask_t cap;
+
+ if (dma_spec->args_count != 3)
+ return NULL;
+
+- fargs.req = dma_spec->args[0];
+- fargs.src = dma_spec->args[1];
+- fargs.dst = dma_spec->args[2];
++ slave.src_id = dma_spec->args[0];
++ slave.dst_id = dma_spec->args[0];
++ slave.src_master = dma_spec->args[1];
++ slave.dst_master = dma_spec->args[2];
+
+- if (WARN_ON(fargs.req >= DW_DMA_MAX_NR_REQUESTS ||
+- fargs.src >= dw->nr_masters ||
+- fargs.dst >= dw->nr_masters))
++ if (WARN_ON(slave.src_id >= DW_DMA_MAX_NR_REQUESTS ||
++ slave.dst_id >= DW_DMA_MAX_NR_REQUESTS ||
++ slave.src_master >= dw->nr_masters ||
++ slave.dst_master >= dw->nr_masters))
+ return NULL;
+
+ dma_cap_zero(cap);
+ dma_cap_set(DMA_SLAVE, cap);
+
+ /* TODO: there should be a simpler way to do this */
+- return dma_request_channel(cap, dw_dma_of_filter, &fargs);
++ return dma_request_channel(cap, dw_dma_filter, &slave);
+ }
+
+ #ifdef CONFIG_ACPI
+ static bool dw_dma_acpi_filter(struct dma_chan *chan, void *param)
+ {
+- struct dw_dma_chan *dwc = to_dw_dma_chan(chan);
+ struct acpi_dma_spec *dma_spec = param;
++ struct dw_dma_slave slave = {
++ .dma_dev = dma_spec->dev,
++ .src_id = dma_spec->slave_id,
++ .dst_id = dma_spec->slave_id,
++ .src_master = 1,
++ .dst_master = 0,
++ };
+
+- if (chan->device->dev != dma_spec->dev ||
+- chan->chan_id != dma_spec->chan_id)
+- return false;
+-
+- dwc->src_id = dma_spec->slave_id;
+- dwc->dst_id = dma_spec->slave_id;
+- dwc->src_master = dwc_get_sms(NULL);
+- dwc->dst_master = dwc_get_dms(NULL);
+-
+- return true;
++ return dw_dma_filter(chan, &slave);
+ }
+
+ static void dw_dma_acpi_controller_register(struct dw_dma *dw)
+--
+1.7.7.6
+
diff --git a/features/soc/baytrail/dmaengine-dw-move-clock-operations-to-platform.c.patch b/features/soc/baytrail/dmaengine-dw-move-clock-operations-to-platform.c.patch
new file mode 100644
index 0000000..8736bd9
--- /dev/null
+++ b/features/soc/baytrail/dmaengine-dw-move-clock-operations-to-platform.c.patch
@@ -0,0 +1,203 @@
+From 91ec87b183fbaf9f06061957108ee2a50276b74c Mon Sep 17 00:00:00 2001
+From: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
+Date: Tue, 19 Aug 2014 20:29:17 +0300
+Subject: [PATCH 039/164] dmaengine: dw: move clock operations to platform.c
+
+On BayTrail platform DMA is not functional in the PCI mode, whereby it always
+failed and exit at the point when it tries to get a clock. It causes the PCI
+mode probe to exit with the error message:
+ dw_dmac_pci: probe of 0000:00:1e.0 failed with error -2
+
+This patch moves clock operations to where it belongs to. Thus, the clock is
+provided only in ACPI / non-PCI cases.
+
+Reported-by: Chew, Chiau Ee <chiau.ee.chew at intel.com>
+Signed-off-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
+Signed-off-by: Vinod Koul <vinod.koul at intel.com>
+(cherry picked from commit a15636e83eb0dedefcb1221be729023e4c281748)
+Signed-off-by: Wan Ahmad Zainie <wan.ahmad.zainie.wan.mohamad at intel.com>
+---
+ drivers/dma/dw/core.c | 16 ----------------
+ drivers/dma/dw/internal.h | 2 ++
+ drivers/dma/dw/platform.c | 25 ++++++++++++++++++++++---
+ drivers/dma/dw/regs.h | 1 -
+ 4 files changed, 24 insertions(+), 20 deletions(-)
+
+diff --git a/drivers/dma/dw/core.c b/drivers/dma/dw/core.c
+index 91e5f22..83a7a9c 100644
+--- a/drivers/dma/dw/core.c
++++ b/drivers/dma/dw/core.c
+@@ -11,7 +11,6 @@
+ */
+
+ #include <linux/bitops.h>
+-#include <linux/clk.h>
+ #include <linux/delay.h>
+ #include <linux/dmaengine.h>
+ #include <linux/dma-mapping.h>
+@@ -1484,13 +1483,6 @@ int dw_dma_probe(struct dw_dma_chip *chip, struct dw_dma_platform_data *pdata)
+ dw->regs = chip->regs;
+ chip->dw = dw;
+
+- dw->clk = devm_clk_get(chip->dev, "hclk");
+- if (IS_ERR(dw->clk))
+- return PTR_ERR(dw->clk);
+- err = clk_prepare_enable(dw->clk);
+- if (err)
+- return err;
+-
+ dw_params = dma_read_byaddr(chip->regs, DW_PARAMS);
+ autocfg = dw_params >> DW_PARAMS_EN & 0x1;
+
+@@ -1657,7 +1649,6 @@ int dw_dma_probe(struct dw_dma_chip *chip, struct dw_dma_platform_data *pdata)
+ return 0;
+
+ err_pdata:
+- clk_disable_unprepare(dw->clk);
+ return err;
+ }
+ EXPORT_SYMBOL_GPL(dw_dma_probe);
+@@ -1679,8 +1670,6 @@ int dw_dma_remove(struct dw_dma_chip *chip)
+ channel_clear_bit(dw, CH_EN, dwc->mask);
+ }
+
+- clk_disable_unprepare(dw->clk);
+-
+ return 0;
+ }
+ EXPORT_SYMBOL_GPL(dw_dma_remove);
+@@ -1690,7 +1679,6 @@ void dw_dma_shutdown(struct dw_dma_chip *chip)
+ struct dw_dma *dw = chip->dw;
+
+ dw_dma_off(dw);
+- clk_disable_unprepare(dw->clk);
+ }
+ EXPORT_SYMBOL_GPL(dw_dma_shutdown);
+
+@@ -1701,8 +1689,6 @@ int dw_dma_suspend(struct dw_dma_chip *chip)
+ struct dw_dma *dw = chip->dw;
+
+ dw_dma_off(dw);
+- clk_disable_unprepare(dw->clk);
+-
+ return 0;
+ }
+ EXPORT_SYMBOL_GPL(dw_dma_suspend);
+@@ -1711,9 +1697,7 @@ int dw_dma_resume(struct dw_dma_chip *chip)
+ {
+ struct dw_dma *dw = chip->dw;
+
+- clk_prepare_enable(dw->clk);
+ dma_writel(dw, CFG, DW_CFG_DMA_EN);
+-
+ return 0;
+ }
+ EXPORT_SYMBOL_GPL(dw_dma_resume);
+diff --git a/drivers/dma/dw/internal.h b/drivers/dma/dw/internal.h
+index 2c8d02f..82258a1 100644
+--- a/drivers/dma/dw/internal.h
++++ b/drivers/dma/dw/internal.h
+@@ -21,12 +21,14 @@
+ * @dev: struct device of the DMA controller
+ * @irq: irq line
+ * @regs: memory mapped I/O space
++ * @clk: hclk clock
+ * @dw: struct dw_dma that is filed by dw_dma_probe()
+ */
+ struct dw_dma_chip {
+ struct device *dev;
+ int irq;
+ void __iomem *regs;
++ struct clk *clk;
+ struct dw_dma *dw;
+ };
+
+diff --git a/drivers/dma/dw/platform.c b/drivers/dma/dw/platform.c
+index 43122d6..278b3ef 100644
+--- a/drivers/dma/dw/platform.c
++++ b/drivers/dma/dw/platform.c
+@@ -180,10 +180,17 @@ static int dw_probe(struct platform_device *pdev)
+
+ chip->dev = dev;
+
+- err = dw_dma_probe(chip, pdata);
++ chip->clk = devm_clk_get(chip->dev, "hclk");
++ if (IS_ERR(chip->clk))
++ return PTR_ERR(chip->clk);
++ err = clk_prepare_enable(chip->clk);
+ if (err)
+ return err;
+
++ err = dw_dma_probe(chip, pdata);
++ if (err)
++ goto err_dw_dma_probe;
++
+ platform_set_drvdata(pdev, chip);
+
+ if (pdev->dev.of_node) {
+@@ -198,6 +205,10 @@ static int dw_probe(struct platform_device *pdev)
+ dw_dma_acpi_controller_register(chip->dw);
+
+ return 0;
++
++err_dw_dma_probe:
++ clk_disable_unprepare(chip->clk);
++ return err;
+ }
+
+ static int dw_remove(struct platform_device *pdev)
+@@ -207,7 +218,10 @@ static int dw_remove(struct platform_device *pdev)
+ if (pdev->dev.of_node)
+ of_dma_controller_free(pdev->dev.of_node);
+
+- return dw_dma_remove(chip);
++ dw_dma_remove(chip);
++ clk_disable_unprepare(chip->clk);
++
++ return 0;
+ }
+
+ static void dw_shutdown(struct platform_device *pdev)
+@@ -215,6 +229,7 @@ static void dw_shutdown(struct platform_device *pdev)
+ struct dw_dma_chip *chip = platform_get_drvdata(pdev);
+
+ dw_dma_shutdown(chip);
++ clk_disable_unprepare(chip->clk);
+ }
+
+ #ifdef CONFIG_OF
+@@ -240,7 +255,10 @@ static int dw_suspend_noirq(struct device *dev)
+ struct platform_device *pdev = to_platform_device(dev);
+ struct dw_dma_chip *chip = platform_get_drvdata(pdev);
+
+- return dw_dma_suspend(chip);
++ dw_dma_suspend(chip);
++ clk_disable_unprepare(chip->clk);
++
++ return 0;
+ }
+
+ static int dw_resume_noirq(struct device *dev)
+@@ -248,6 +266,7 @@ static int dw_resume_noirq(struct device *dev)
+ struct platform_device *pdev = to_platform_device(dev);
+ struct dw_dma_chip *chip = platform_get_drvdata(pdev);
+
++ clk_prepare_enable(chip->clk);
+ return dw_dma_resume(chip);
+ }
+
+diff --git a/drivers/dma/dw/regs.h b/drivers/dma/dw/regs.h
+index 0e82d99..00d27a9 100644
+--- a/drivers/dma/dw/regs.h
++++ b/drivers/dma/dw/regs.h
+@@ -251,7 +251,6 @@ struct dw_dma {
+ void __iomem *regs;
+ struct dma_pool *desc_pool;
+ struct tasklet_struct tasklet;
+- struct clk *clk;
+
+ /* channels */
+ struct dw_dma_chan *chan;
+--
+1.7.7.6
+
diff --git a/features/soc/baytrail/dmaengine-dw-move-dw_dmac.h-to-where-it-belongs-to.patch b/features/soc/baytrail/dmaengine-dw-move-dw_dmac.h-to-where-it-belongs-to.patch
new file mode 100644
index 0000000..2af6388
--- /dev/null
+++ b/features/soc/baytrail/dmaengine-dw-move-dw_dmac.h-to-where-it-belongs-to.patch
@@ -0,0 +1,412 @@
+From 334b3b58b7ae3517a49439e4f603d760e85faa9c Mon Sep 17 00:00:00 2001
+From: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
+Date: Tue, 19 Aug 2014 20:29:12 +0300
+Subject: [PATCH 035/164] dmaengine: dw: move dw_dmac.h to where it belongs to
+
+There is a common storage for platform data related structures and definitions
+inside kernel source tree. The patch moves file from include/linux to
+include/linux/platform_data and renames it acoordingly. The users are also
+updated.
+
+Signed-off-by: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
+Acked-by: Viresh Kumar <viresh.kumar at linaro.org>
+[For the arch/avr32/.* and .*sound/atmel.*]
+Acked-by: Hans-Christian Egtvedt <egtvedt at samfundet.no>
+Signed-off-by: Vinod Koul <vinod.koul at intel.com>
+
+(cherry picked from commit 3d598f47e804a77208c6bb0a454123018e2f2281)
+Signed-off-by: Wan Ahmad Zainie <wan.ahmad.zainie.wan.mohamad at intel.com>
+---
+ MAINTAINERS | 2 +-
+ arch/avr32/mach-at32ap/at32ap700x.c | 2 +-
+ arch/avr32/mach-at32ap/include/mach/atmel-mci.h | 2 +-
+ drivers/dma/dw/internal.h | 2 +-
+ drivers/dma/dw/regs.h | 6 +-
+ include/linux/dw_dmac.h | 114 -----------------------
+ include/linux/platform_data/dma-dw.h | 114 +++++++++++++++++++++++
+ include/sound/atmel-abdac.h | 2 +-
+ include/sound/atmel-ac97c.h | 2 +-
+ sound/atmel/abdac.c | 2 +-
+ sound/atmel/ac97c.c | 2 +-
+ 11 files changed, 125 insertions(+), 125 deletions(-)
+ delete mode 100644 include/linux/dw_dmac.h
+ create mode 100644 include/linux/platform_data/dma-dw.h
+
+diff --git a/MAINTAINERS b/MAINTAINERS
+index 900d98e..c58539e 100644
+--- a/MAINTAINERS
++++ b/MAINTAINERS
+@@ -7551,7 +7551,7 @@ SYNOPSYS DESIGNWARE DMAC DRIVER
+ M: Viresh Kumar <viresh.linux at gmail.com>
+ M: Andy Shevchenko <andriy.shevchenko at linux.intel.com>
+ S: Maintained
+-F: include/linux/dw_dmac.h
++F: include/linux/platform_data/dma-dw.h
+ F: drivers/dma/dw/
+
+ SYNOPSYS DESIGNWARE MMC/SD/SDIO DRIVER
+diff --git a/arch/avr32/mach-at32ap/at32ap700x.c b/arch/avr32/mach-at32ap/at32ap700x.c
+index a1f4d1e..1756416 100644
+--- a/arch/avr32/mach-at32ap/at32ap700x.c
++++ b/arch/avr32/mach-at32ap/at32ap700x.c
+@@ -7,7 +7,7 @@
+ */
+ #include <linux/clk.h>
+ #include <linux/delay.h>
+-#include <linux/dw_dmac.h>
++#include <linux/platform_data/dma-dw.h>
+ #include <linux/fb.h>
+ #include <linux/init.h>
+ #include <linux/platform_device.h>
+diff --git a/arch/avr32/mach-at32ap/include/mach/atmel-mci.h b/arch/avr32/mach-at32ap/include/mach/atmel-mci.h
+index 4bba585..11d7f4b 100644
+--- a/arch/avr32/mach-at32ap/include/mach/atmel-mci.h
++++ b/arch/avr32/mach-at32ap/include/mach/atmel-mci.h
+@@ -1,7 +1,7 @@
+ #ifndef __MACH_ATMEL_MCI_H
+ #define __MACH_ATMEL_MCI_H
+
+-#include <linux/dw_dmac.h>
++#include <linux/platform_data/dma-dw.h>
+
+ /**
+ * struct mci_dma_data - DMA data for MCI interface
+diff --git a/drivers/dma/dw/internal.h b/drivers/dma/dw/internal.h
+index 32667f9..43cc1df 100644
+--- a/drivers/dma/dw/internal.h
++++ b/drivers/dma/dw/internal.h
+@@ -12,7 +12,7 @@
+ #define _DW_DMAC_INTERNAL_H
+
+ #include <linux/device.h>
+-#include <linux/dw_dmac.h>
++#include <linux/platform_data/dma-dw.h>
+
+ #include "regs.h"
+
+diff --git a/drivers/dma/dw/regs.h b/drivers/dma/dw/regs.h
+index bb98d3e..af02439 100644
+--- a/drivers/dma/dw/regs.h
++++ b/drivers/dma/dw/regs.h
+@@ -11,7 +11,7 @@
+
+ #include <linux/interrupt.h>
+ #include <linux/dmaengine.h>
+-#include <linux/dw_dmac.h>
++#include <linux/platform_data/dma-dw.h>
+
+ #define DW_DMA_MAX_NR_CHANNELS 8
+ #define DW_DMA_MAX_NR_REQUESTS 16
+@@ -161,7 +161,7 @@ struct dw_dma_regs {
+ #define DWC_CTLH_DONE 0x00001000
+ #define DWC_CTLH_BLOCK_TS_MASK 0x00000fff
+
+-/* Bitfields in CFG_LO. Platform-configurable bits are in <linux/dw_dmac.h> */
++/* Bitfields in CFG_LO. Platform-configurable bits are in <linux/platform_data/dma-dw.h> */
+ #define DWC_CFGL_CH_PRIOR_MASK (0x7 << 5) /* priority mask */
+ #define DWC_CFGL_CH_PRIOR(x) ((x) << 5) /* priority */
+ #define DWC_CFGL_CH_SUSP (1 << 8) /* pause xfer */
+@@ -172,7 +172,7 @@ struct dw_dma_regs {
+ #define DWC_CFGL_RELOAD_SAR (1 << 30)
+ #define DWC_CFGL_RELOAD_DAR (1 << 31)
+
+-/* Bitfields in CFG_HI. Platform-configurable bits are in <linux/dw_dmac.h> */
++/* Bitfields in CFG_HI. Platform-configurable bits are in <linux/platform_data/dma-dw.h> */
+ #define DWC_CFGH_DS_UPD_EN (1 << 5)
+ #define DWC_CFGH_SS_UPD_EN (1 << 6)
+
+diff --git a/include/linux/dw_dmac.h b/include/linux/dw_dmac.h
+deleted file mode 100644
+index 481ab23..0000000
+--- a/include/linux/dw_dmac.h
++++ /dev/null
+@@ -1,114 +0,0 @@
+-/*
+- * Driver for the Synopsys DesignWare DMA Controller (aka DMACA on
+- * AVR32 systems.)
+- *
+- * Copyright (C) 2007 Atmel Corporation
+- * Copyright (C) 2010-2011 ST Microelectronics
+- *
+- * 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.
+- */
+-#ifndef DW_DMAC_H
+-#define DW_DMAC_H
+-
+-#include <linux/dmaengine.h>
+-
+-/**
+- * struct dw_dma_slave - Controller-specific information about a slave
+- *
+- * @dma_dev: required DMA master device. Depricated.
+- * @bus_id: name of this device channel, not just a device name since
+- * devices may have more than one channel e.g. "foo_tx"
+- * @cfg_hi: Platform-specific initializer for the CFG_HI register
+- * @cfg_lo: Platform-specific initializer for the CFG_LO register
+- * @src_master: src master for transfers on allocated channel.
+- * @dst_master: dest master for transfers on allocated channel.
+- */
+-struct dw_dma_slave {
+- struct device *dma_dev;
+- u32 cfg_hi;
+- u32 cfg_lo;
+- u8 src_master;
+- u8 dst_master;
+-};
+-
+-/**
+- * struct dw_dma_platform_data - Controller configuration parameters
+- * @nr_channels: Number of channels supported by hardware (max 8)
+- * @is_private: The device channels should be marked as private and not for
+- * by the general purpose DMA channel allocator.
+- * @chan_allocation_order: Allocate channels starting from 0 or 7
+- * @chan_priority: Set channel priority increasing from 0 to 7 or 7 to 0.
+- * @block_size: Maximum block size supported by the controller
+- * @nr_masters: Number of AHB masters supported by the controller
+- * @data_width: Maximum data width supported by hardware per AHB master
+- * (0 - 8bits, 1 - 16bits, ..., 5 - 256bits)
+- * @sd: slave specific data. Used for configuring channels
+- * @sd_count: count of slave data structures passed.
+- */
+-struct dw_dma_platform_data {
+- unsigned int nr_channels;
+- bool is_private;
+-#define CHAN_ALLOCATION_ASCENDING 0 /* zero to seven */
+-#define CHAN_ALLOCATION_DESCENDING 1 /* seven to zero */
+- unsigned char chan_allocation_order;
+-#define CHAN_PRIORITY_ASCENDING 0 /* chan0 highest */
+-#define CHAN_PRIORITY_DESCENDING 1 /* chan7 highest */
+- unsigned char chan_priority;
+- unsigned short block_size;
+- unsigned char nr_masters;
+- unsigned char data_width[4];
+-};
+-
+-/* bursts size */
+-enum dw_dma_msize {
+- DW_DMA_MSIZE_1,
+- DW_DMA_MSIZE_4,
+- DW_DMA_MSIZE_8,
+- DW_DMA_MSIZE_16,
+- DW_DMA_MSIZE_32,
+- DW_DMA_MSIZE_64,
+- DW_DMA_MSIZE_128,
+- DW_DMA_MSIZE_256,
+-};
+-
+-/* Platform-configurable bits in CFG_HI */
+-#define DWC_CFGH_FCMODE (1 << 0)
+-#define DWC_CFGH_FIFO_MODE (1 << 1)
+-#define DWC_CFGH_PROTCTL(x) ((x) << 2)
+-#define DWC_CFGH_SRC_PER(x) ((x) << 7)
+-#define DWC_CFGH_DST_PER(x) ((x) << 11)
+-
+-/* Platform-configurable bits in CFG_LO */
+-#define DWC_CFGL_LOCK_CH_XFER (0 << 12) /* scope of LOCK_CH */
+-#define DWC_CFGL_LOCK_CH_BLOCK (1 << 12)
+-#define DWC_CFGL_LOCK_CH_XACT (2 << 12)
+-#define DWC_CFGL_LOCK_BUS_XFER (0 << 14) /* scope of LOCK_BUS */
+-#define DWC_CFGL_LOCK_BUS_BLOCK (1 << 14)
+-#define DWC_CFGL_LOCK_BUS_XACT (2 << 14)
+-#define DWC_CFGL_LOCK_CH (1 << 15) /* channel lockout */
+-#define DWC_CFGL_LOCK_BUS (1 << 16) /* busmaster lockout */
+-#define DWC_CFGL_HS_DST_POL (1 << 18) /* dst handshake active low */
+-#define DWC_CFGL_HS_SRC_POL (1 << 19) /* src handshake active low */
+-
+-/* DMA API extensions */
+-struct dw_cyclic_desc {
+- struct dw_desc **desc;
+- unsigned long periods;
+- void (*period_callback)(void *param);
+- void *period_callback_param;
+-};
+-
+-struct dw_cyclic_desc *dw_dma_cyclic_prep(struct dma_chan *chan,
+- dma_addr_t buf_addr, size_t buf_len, size_t period_len,
+- enum dma_transfer_direction direction);
+-void dw_dma_cyclic_free(struct dma_chan *chan);
+-int dw_dma_cyclic_start(struct dma_chan *chan);
+-void dw_dma_cyclic_stop(struct dma_chan *chan);
+-
+-dma_addr_t dw_dma_get_src_addr(struct dma_chan *chan);
+-
+-dma_addr_t dw_dma_get_dst_addr(struct dma_chan *chan);
+-
+-#endif /* DW_DMAC_H */
+diff --git a/include/linux/platform_data/dma-dw.h b/include/linux/platform_data/dma-dw.h
+new file mode 100644
+index 0000000..481ab23
+--- /dev/null
++++ b/include/linux/platform_data/dma-dw.h
+@@ -0,0 +1,114 @@
++/*
++ * Driver for the Synopsys DesignWare DMA Controller (aka DMACA on
++ * AVR32 systems.)
++ *
++ * Copyright (C) 2007 Atmel Corporation
++ * Copyright (C) 2010-2011 ST Microelectronics
++ *
++ * 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.
++ */
++#ifndef DW_DMAC_H
++#define DW_DMAC_H
++
++#include <linux/dmaengine.h>
++
++/**
++ * struct dw_dma_slave - Controller-specific information about a slave
++ *
++ * @dma_dev: required DMA master device. Depricated.
++ * @bus_id: name of this device channel, not just a device name since
++ * devices may have more than one channel e.g. "foo_tx"
++ * @cfg_hi: Platform-specific initializer for the CFG_HI register
++ * @cfg_lo: Platform-specific initializer for the CFG_LO register
++ * @src_master: src master for transfers on allocated channel.
++ * @dst_master: dest master for transfers on allocated channel.
++ */
++struct dw_dma_slave {
++ struct device *dma_dev;
++ u32 cfg_hi;
++ u32 cfg_lo;
++ u8 src_master;
++ u8 dst_master;
++};
++
++/**
++ * struct dw_dma_platform_data - Controller configuration parameters
++ * @nr_channels: Number of channels supported by hardware (max 8)
++ * @is_private: The device channels should be marked as private and not for
++ * by the general purpose DMA channel allocator.
++ * @chan_allocation_order: Allocate channels starting from 0 or 7
++ * @chan_priority: Set channel priority increasing from 0 to 7 or 7 to 0.
++ * @block_size: Maximum block size supported by the controller
++ * @nr_masters: Number of AHB masters supported by the controller
++ * @data_width: Maximum data width supported by hardware per AHB master
++ * (0 - 8bits, 1 - 16bits, ..., 5 - 256bits)
++ * @sd: slave specific data. Used for configuring channels
++ * @sd_count: count of slave data structures passed.
++ */
++struct dw_dma_platform_data {
++ unsigned int nr_channels;
++ bool is_private;
++#define CHAN_ALLOCATION_ASCENDING 0 /* zero to seven */
++#define CHAN_ALLOCATION_DESCENDING 1 /* seven to zero */
++ unsigned char chan_allocation_order;
++#define CHAN_PRIORITY_ASCENDING 0 /* chan0 highest */
++#define CHAN_PRIORITY_DESCENDING 1 /* chan7 highest */
++ unsigned char chan_priority;
++ unsigned short block_size;
++ unsigned char nr_masters;
++ unsigned char data_width[4];
++};
++
++/* bursts size */
++enum dw_dma_msize {
++ DW_DMA_MSIZE_1,
++ DW_DMA_MSIZE_4,
++ DW_DMA_MSIZE_8,
++ DW_DMA_MSIZE_16,
++ DW_DMA_MSIZE_32,
++ DW_DMA_MSIZE_64,
++ DW_DMA_MSIZE_128,
++ DW_DMA_MSIZE_256,
++};
++
++/* Platform-configurable bits in CFG_HI */
++#define DWC_CFGH_FCMODE (1 << 0)
++#define DWC_CFGH_FIFO_MODE (1 << 1)
++#define DWC_CFGH_PROTCTL(x) ((x) << 2)
++#define DWC_CFGH_SRC_PER(x) ((x) << 7)
++#define DWC_CFGH_DST_PER(x) ((x) << 11)
++
++/* Platform-configurable bits in CFG_LO */
++#define DWC_CFGL_LOCK_CH_XFER (0 << 12) /* scope of LOCK_CH */
++#define DWC_CFGL_LOCK_CH_BLOCK (1 << 12)
++#define DWC_CFGL_LOCK_CH_XACT (2 << 12)
++#define DWC_CFGL_LOCK_BUS_XFER (0 << 14) /* scope of LOCK_BUS */
++#define DWC_CFGL_LOCK_BUS_BLOCK (1 << 14)
++#define DWC_CFGL_LOCK_BUS_XACT (2 << 14)
++#define DWC_CFGL_LOCK_CH (1 << 15) /* channel lockout */
++#define DWC_CFGL_LOCK_BUS (1 << 16) /* busmaster lockout */
++#define DWC_CFGL_HS_DST_POL (1 << 18) /* dst handshake active low */
++#define DWC_CFGL_HS_SRC_POL (1 << 19) /* src handshake active low */
++
++/* DMA API extensions */
++struct dw_cyclic_desc {
++ struct dw_desc **desc;
++ unsigned long periods;
++ void (*period_callback)(void *param);
++ void *period_callback_param;
++};
++
++struct dw_cyclic_desc *dw_dma_cyclic_prep(struct dma_chan *chan,
++ dma_addr_t buf_addr, size_t buf_len, size_t period_len,
++ enum dma_transfer_direction direction);
++void dw_dma_cyclic_free(struct dma_chan *chan);
++int dw_dma_cyclic_start(struct dma_chan *chan);
++void dw_dma_cyclic_stop(struct dma_chan *chan);
++
++dma_addr_t dw_dma_get_src_addr(struct dma_chan *chan);
++
++dma_addr_t dw_dma_get_dst_addr(struct dma_chan *chan);
++
++#endif /* DW_DMAC_H */
+diff --git a/include/sound/atmel-abdac.h b/include/sound/atmel-abdac.h
+index edff6a8..a8f735d 100644
+--- a/include/sound/atmel-abdac.h
++++ b/include/sound/atmel-abdac.h
+@@ -10,7 +10,7 @@
+ #ifndef __INCLUDE_SOUND_ATMEL_ABDAC_H
+ #define __INCLUDE_SOUND_ATMEL_ABDAC_H
+
+-#include <linux/dw_dmac.h>
++#include <linux/platform_data/dma-dw.h>
+
+ /**
+ * struct atmel_abdac_pdata - board specific ABDAC configuration
+diff --git a/include/sound/atmel-ac97c.h b/include/sound/atmel-ac97c.h
+index e6aabdb..31979c4 100644
+--- a/include/sound/atmel-ac97c.h
++++ b/include/sound/atmel-ac97c.h
+@@ -10,7 +10,7 @@
+ #ifndef __INCLUDE_SOUND_ATMEL_AC97C_H
+ #define __INCLUDE_SOUND_ATMEL_AC97C_H
+
+-#include <linux/dw_dmac.h>
++#include <linux/platform_data/dma-dw.h>
+
+ #define AC97C_CAPTURE 0x01
+ #define AC97C_PLAYBACK 0x02
+diff --git a/sound/atmel/abdac.c b/sound/atmel/abdac.c
+index 3519518..412403b 100644
+--- a/sound/atmel/abdac.c
++++ b/sound/atmel/abdac.c
+@@ -9,7 +9,7 @@
+ */
+ #include <linux/clk.h>
+ #include <linux/bitmap.h>
+-#include <linux/dw_dmac.h>
++#include <linux/platform_data/dma-dw.h>
+ #include <linux/dmaengine.h>
+ #include <linux/dma-mapping.h>
+ #include <linux/init.h>
+diff --git a/sound/atmel/ac97c.c b/sound/atmel/ac97c.c
+index c5f0ddd..e005849 100644
+--- a/sound/atmel/ac97c.c
++++ b/sound/atmel/ac97c.c
+@@ -31,7 +31,7 @@
+ #include <sound/atmel-ac97c.h>
+ #include <sound/memalloc.h>
+
+-#include <linux/dw_dmac.h>
++#include <linux/platform_data/dma-dw.h>
+
+ #include <mach/cpu.h>
+
+--
+1.7.7.6
+
--
1.9.1
More information about the linux-yocto
mailing list