aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrea Adami <andrea.adami@gmail.com>2014-05-21 23:26:20 +0200
committerPaul Eggleton <paul.eggleton@linux.intel.com>2014-05-23 12:10:07 +0100
commited3f802a5f7984caf088c553a0c4bf6bd2d021c4 (patch)
tree4f1c106dc3e50be494e22ff3e9e01e36ba892a6e
parent675ed509acb1faa0db7fafc003fb79f4da62537c (diff)
downloadmeta-handheld-ed3f802a5f7984caf088c553a0c4bf6bd2d021c4.tar.gz
linux-yocto_3.14: add patches and defconfig for ipaq h1940
Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com> Signed-off-by: Andrea Adami <andrea.adami@gmail.com>
-rw-r--r--recipes-kernel/linux/linux-yocto-3.14/h1940/0001-rfkill-add-IR-type.patch59
-rw-r--r--recipes-kernel/linux/linux-yocto-3.14/h1940/0002-ARM-s3c24xx-Remove-S3C24XX_DMA-dependency-from-S3C24.patch30
-rw-r--r--recipes-kernel/linux/linux-yocto-3.14/h1940/0003-ARM-s3c24xx-add-dma_coherent_mask-for-DMA-devices.patch35
-rw-r--r--recipes-kernel/linux/linux-yocto-3.14/h1940/0004-ARM-s3c24xx-Add-DMA-resources-for-SDI-and-I2S.patch34
-rw-r--r--recipes-kernel/linux/linux-yocto-3.14/h1940/0005-ARM-s3c24xx-drop-RFKILL-driver-for-H1940-bluetooth.patch202
-rw-r--r--recipes-kernel/linux/linux-yocto-3.14/h1940/0006-ARM-s3c24xx-h1940-Add-nand-device.patch126
-rw-r--r--recipes-kernel/linux/linux-yocto-3.14/h1940/0007-ARM-s3c24xx-h1940-don-t-touch-UPLLCON.patch41
-rw-r--r--recipes-kernel/linux/linux-yocto-3.14/h1940/0008-ARM-s3c24xx-h1940-unlock-reset-button.patch52
-rw-r--r--recipes-kernel/linux/linux-yocto-3.14/h1940/0009-ARM-s3c24xx-h1940-add-bluetooth-RF-kill-switch.patch100
-rw-r--r--recipes-kernel/linux/linux-yocto-3.14/h1940/0010-ARM-s3c24xx-h1940-add-IR-switch.patch73
-rw-r--r--recipes-kernel/linux/linux-yocto-3.14/h1940/0011-ARM-s3c24xx-h1940-increase-oversampling-shift.patch29
-rw-r--r--recipes-kernel/linux/linux-yocto-3.14/h1940/0012-ARM-s3c24xx-h1940-Add-DMA-device.patch27
-rw-r--r--recipes-kernel/linux/linux-yocto-3.14/h1940/0013-dmaengine-s3c24xx-dma-Process-whole-SG-chain.patch27
-rw-r--r--recipes-kernel/linux/linux-yocto-3.14/h1940/0014-dmaengine-s3c24xx-dma-Add-cyclic-transfer-support.patch183
-rw-r--r--recipes-kernel/linux/linux-yocto-3.14/h1940/0015-s3cmci-port-DMA-code-to-dmaengine-API.patch370
-rw-r--r--recipes-kernel/linux/linux-yocto-3.14/h1940/0016-ASoC-samsung-s3c24-xx-12-i2s-port-to-use-generic-dma.patch385
-rw-r--r--recipes-kernel/linux/linux-yocto-3.14/h1940/0017-ASoC-samsung-drop-support-for-legacy-S3C24XX-DMA-API.patch515
-rw-r--r--recipes-kernel/linux/linux-yocto-3.14/h1940/defconfig200
-rw-r--r--recipes-kernel/linux/linux-yocto_3.14.bbappend27
19 files changed, 2514 insertions, 1 deletions
diff --git a/recipes-kernel/linux/linux-yocto-3.14/h1940/0001-rfkill-add-IR-type.patch b/recipes-kernel/linux/linux-yocto-3.14/h1940/0001-rfkill-add-IR-type.patch
new file mode 100644
index 0000000..0045cf2
--- /dev/null
+++ b/recipes-kernel/linux/linux-yocto-3.14/h1940/0001-rfkill-add-IR-type.patch
@@ -0,0 +1,59 @@
+From 674eef7154d529886d5e9fe77914e9bc77e549b0 Mon Sep 17 00:00:00 2001
+From: Vasily Khoruzhick <anarsoul@gmail.com>
+Date: Thu, 17 Oct 2013 12:19:47 +0300
+Subject: [PATCH 01/17] rfkill: add IR type
+
+Infrared receivers/transmitters can also be disabled,
+so add IR type to rfkill subsystem
+
+Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
+---
+ include/uapi/linux/rfkill.h | 2 ++
+ net/rfkill/core.c | 4 +++-
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/include/uapi/linux/rfkill.h b/include/uapi/linux/rfkill.h
+index 058757f..d4ae526 100644
+--- a/include/uapi/linux/rfkill.h
++++ b/include/uapi/linux/rfkill.h
+@@ -38,6 +38,7 @@
+ * @RFKILL_TYPE_GPS: switch is on a GPS device.
+ * @RFKILL_TYPE_FM: switch is on a FM radio device.
+ * @RFKILL_TYPE_NFC: switch is on an NFC device.
++ * @RFKILL_TYPE_IR: switch is on an IR device.
+ * @NUM_RFKILL_TYPES: number of defined rfkill types
+ */
+ enum rfkill_type {
+@@ -50,6 +51,7 @@ enum rfkill_type {
+ RFKILL_TYPE_GPS,
+ RFKILL_TYPE_FM,
+ RFKILL_TYPE_NFC,
++ RFKILL_TYPE_IR,
+ NUM_RFKILL_TYPES,
+ };
+
+diff --git a/net/rfkill/core.c b/net/rfkill/core.c
+index ed7e0b4..4c4abb6 100644
+--- a/net/rfkill/core.c
++++ b/net/rfkill/core.c
+@@ -585,7 +585,7 @@ static DEVICE_ATTR_RO(name);
+
+ static const char *rfkill_get_type_str(enum rfkill_type type)
+ {
+- BUILD_BUG_ON(NUM_RFKILL_TYPES != RFKILL_TYPE_NFC + 1);
++ BUILD_BUG_ON(NUM_RFKILL_TYPES != RFKILL_TYPE_IR + 1);
+
+ switch (type) {
+ case RFKILL_TYPE_WLAN:
+@@ -604,6 +604,8 @@ static const char *rfkill_get_type_str(enum rfkill_type type)
+ return "fm";
+ case RFKILL_TYPE_NFC:
+ return "nfc";
++ case RFKILL_TYPE_IR:
++ return "ir";
+ default:
+ BUG();
+ }
+--
+1.9.3
+
diff --git a/recipes-kernel/linux/linux-yocto-3.14/h1940/0002-ARM-s3c24xx-Remove-S3C24XX_DMA-dependency-from-S3C24.patch b/recipes-kernel/linux/linux-yocto-3.14/h1940/0002-ARM-s3c24xx-Remove-S3C24XX_DMA-dependency-from-S3C24.patch
new file mode 100644
index 0000000..0a2f0df
--- /dev/null
+++ b/recipes-kernel/linux/linux-yocto-3.14/h1940/0002-ARM-s3c24xx-Remove-S3C24XX_DMA-dependency-from-S3C24.patch
@@ -0,0 +1,30 @@
+From 43403f1d4744e0d71ef360655f44b489b57f443e Mon Sep 17 00:00:00 2001
+From: Vasily Khoruzhick <anarsoul@gmail.com>
+Date: Sun, 18 May 2014 12:43:35 +0300
+Subject: [PATCH 02/17] ARM: s3c24xx: Remove S3C24XX_DMA dependency from
+ S3C2410_DMA
+
+S3C24XX_DMA enables legacy DMA driver, and since we want to
+move to introduced generic dmaengine s3c24xx-dma driver,
+it's necessary to remove this redundant dependency.
+
+Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
+---
+ arch/arm/mach-s3c24xx/Kconfig | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/arch/arm/mach-s3c24xx/Kconfig b/arch/arm/mach-s3c24xx/Kconfig
+index d876431..3be853c 100644
+--- a/arch/arm/mach-s3c24xx/Kconfig
++++ b/arch/arm/mach-s3c24xx/Kconfig
+@@ -149,7 +149,6 @@ config S3C2410_DMA_DEBUG
+
+ config S3C2410_DMA
+ bool
+- depends on S3C24XX_DMA && (CPU_S3C2410 || CPU_S3C2442)
+ help
+ DMA device selection for S3C2410 and compatible CPUs
+
+--
+1.9.3
+
diff --git a/recipes-kernel/linux/linux-yocto-3.14/h1940/0003-ARM-s3c24xx-add-dma_coherent_mask-for-DMA-devices.patch b/recipes-kernel/linux/linux-yocto-3.14/h1940/0003-ARM-s3c24xx-add-dma_coherent_mask-for-DMA-devices.patch
new file mode 100644
index 0000000..5372b93
--- /dev/null
+++ b/recipes-kernel/linux/linux-yocto-3.14/h1940/0003-ARM-s3c24xx-add-dma_coherent_mask-for-DMA-devices.patch
@@ -0,0 +1,35 @@
+From acdc541821464171954cbd1a4e1a34f3e743e043 Mon Sep 17 00:00:00 2001
+From: Vasily Khoruzhick <anarsoul@gmail.com>
+Date: Sun, 18 May 2014 12:44:52 +0300
+Subject: [PATCH 03/17] ARM: s3c24xx: add dma_coherent_mask for DMA devices
+
+Otherwise dma_alloc_coherent() fails.
+
+Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
+---
+ arch/arm/mach-s3c24xx/common.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/arch/arm/mach-s3c24xx/common.c b/arch/arm/mach-s3c24xx/common.c
+index 4adaa4b..d61f611 100644
+--- a/arch/arm/mach-s3c24xx/common.c
++++ b/arch/arm/mach-s3c24xx/common.c
+@@ -383,6 +383,7 @@ struct platform_device s3c2410_device_dma = {
+ .resource = s3c2410_dma_resource,
+ .dev = {
+ .platform_data = &s3c2410_dma_platdata,
++ .coherent_dma_mask = ~0,
+ },
+ };
+ #endif
+@@ -480,6 +481,7 @@ struct platform_device s3c2440_device_dma = {
+ .resource = s3c2410_dma_resource,
+ .dev = {
+ .platform_data = &s3c2440_dma_platdata,
++ .coherent_dma_mask = ~0,
+ },
+ };
+ #endif
+--
+1.9.3
+
diff --git a/recipes-kernel/linux/linux-yocto-3.14/h1940/0004-ARM-s3c24xx-Add-DMA-resources-for-SDI-and-I2S.patch b/recipes-kernel/linux/linux-yocto-3.14/h1940/0004-ARM-s3c24xx-Add-DMA-resources-for-SDI-and-I2S.patch
new file mode 100644
index 0000000..9a25241
--- /dev/null
+++ b/recipes-kernel/linux/linux-yocto-3.14/h1940/0004-ARM-s3c24xx-Add-DMA-resources-for-SDI-and-I2S.patch
@@ -0,0 +1,34 @@
+From e62096b744e4fa4376f0fe10bbe72dc0cae32b0d Mon Sep 17 00:00:00 2001
+From: Vasily Khoruzhick <anarsoul@gmail.com>
+Date: Sun, 18 May 2014 12:45:39 +0300
+Subject: [PATCH 04/17] ARM: s3c24xx: Add DMA resources for SDI and I2S
+
+Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
+---
+ arch/arm/plat-samsung/devs.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/arch/arm/plat-samsung/devs.c b/arch/arm/plat-samsung/devs.c
+index ac07e87..a0575d5 100644
+--- a/arch/arm/plat-samsung/devs.c
++++ b/arch/arm/plat-samsung/devs.c
+@@ -787,6 +787,8 @@ void __init s5p_hdmi_set_platdata(struct i2c_board_info *hdmiphy_info,
+ #ifdef CONFIG_PLAT_S3C24XX
+ static struct resource s3c_iis_resource[] = {
+ [0] = DEFINE_RES_MEM(S3C24XX_PA_IIS, S3C24XX_SZ_IIS),
++ [1] = DEFINE_RES_DMA(DMACH_I2S_OUT),
++ [2] = DEFINE_RES_DMA(DMACH_I2S_IN),
+ };
+
+ struct platform_device s3c_device_iis = {
+@@ -1153,6 +1155,7 @@ struct platform_device s3c_device_rtc = {
+ static struct resource s3c_sdi_resource[] = {
+ [0] = DEFINE_RES_MEM(S3C24XX_PA_SDI, S3C24XX_SZ_SDI),
+ [1] = DEFINE_RES_IRQ(IRQ_SDI),
++ [2] = DEFINE_RES_DMA(DMACH_SDI),
+ };
+
+ struct platform_device s3c_device_sdi = {
+--
+1.9.3
+
diff --git a/recipes-kernel/linux/linux-yocto-3.14/h1940/0005-ARM-s3c24xx-drop-RFKILL-driver-for-H1940-bluetooth.patch b/recipes-kernel/linux/linux-yocto-3.14/h1940/0005-ARM-s3c24xx-drop-RFKILL-driver-for-H1940-bluetooth.patch
new file mode 100644
index 0000000..6347474
--- /dev/null
+++ b/recipes-kernel/linux/linux-yocto-3.14/h1940/0005-ARM-s3c24xx-drop-RFKILL-driver-for-H1940-bluetooth.patch
@@ -0,0 +1,202 @@
+From ead5b0c7815504351ae492c6445251769c75db7b Mon Sep 17 00:00:00 2001
+From: Vasily Khoruzhick <anarsoul@gmail.com>
+Date: Thu, 17 Oct 2013 12:09:19 +0300
+Subject: [PATCH 05/17] ARM: s3c24xx: drop RFKILL driver for H1940 bluetooth
+
+rfkill-gpio can do it's job easily.
+
+Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
+---
+ arch/arm/mach-s3c24xx/Kconfig | 8 --
+ arch/arm/mach-s3c24xx/Makefile | 1 -
+ arch/arm/mach-s3c24xx/h1940-bluetooth.c | 147 --------------------------------
+ 3 files changed, 156 deletions(-)
+ delete mode 100644 arch/arm/mach-s3c24xx/h1940-bluetooth.c
+
+diff --git a/arch/arm/mach-s3c24xx/Kconfig b/arch/arm/mach-s3c24xx/Kconfig
+index 3be853c..e115127 100644
+--- a/arch/arm/mach-s3c24xx/Kconfig
++++ b/arch/arm/mach-s3c24xx/Kconfig
+@@ -286,14 +286,6 @@ config ARCH_H1940
+ help
+ Say Y here if you are using the HP IPAQ H1940
+
+-config H1940BT
+- tristate "Control the state of H1940 bluetooth chip"
+- depends on ARCH_H1940
+- select RFKILL
+- help
+- This is a simple driver that is able to control
+- the state of built in bluetooth chip on h1940.
+-
+ config PM_H1940
+ bool
+ help
+diff --git a/arch/arm/mach-s3c24xx/Makefile b/arch/arm/mach-s3c24xx/Makefile
+index 7f54e5b..d326722 100644
+--- a/arch/arm/mach-s3c24xx/Makefile
++++ b/arch/arm/mach-s3c24xx/Makefile
+@@ -65,7 +65,6 @@ obj-$(CONFIG_MACH_AML_M5900) += mach-amlm5900.o
+ obj-$(CONFIG_ARCH_BAST) += mach-bast.o
+ obj-$(CONFIG_BAST_PC104_IRQ) += bast-irq.o
+ obj-$(CONFIG_ARCH_H1940) += mach-h1940.o
+-obj-$(CONFIG_H1940BT) += h1940-bluetooth.o
+ obj-$(CONFIG_PM_H1940) += pm-h1940.o
+ obj-$(CONFIG_MACH_N30) += mach-n30.o
+ obj-$(CONFIG_MACH_OTOM) += mach-otom.o
+diff --git a/arch/arm/mach-s3c24xx/h1940-bluetooth.c b/arch/arm/mach-s3c24xx/h1940-bluetooth.c
+deleted file mode 100644
+index b4d14b8..0000000
+--- a/arch/arm/mach-s3c24xx/h1940-bluetooth.c
++++ /dev/null
+@@ -1,147 +0,0 @@
+-/*
+- * arch/arm/mach-s3c2410/h1940-bluetooth.c
+- * Copyright (c) Arnaud Patard <arnaud.patard@rtp-net.org>
+- *
+- * This file is subject to the terms and conditions of the GNU General Public
+- * License. See the file COPYING in the main directory of this archive for
+- * more details.
+- *
+- * S3C2410 bluetooth "driver"
+- *
+- */
+-
+-#include <linux/module.h>
+-#include <linux/platform_device.h>
+-#include <linux/delay.h>
+-#include <linux/string.h>
+-#include <linux/ctype.h>
+-#include <linux/leds.h>
+-#include <linux/gpio.h>
+-#include <linux/rfkill.h>
+-
+-#include <plat/gpio-cfg.h>
+-#include <mach/hardware.h>
+-#include <mach/regs-gpio.h>
+-#include <mach/gpio-samsung.h>
+-
+-#include "h1940.h"
+-
+-#define DRV_NAME "h1940-bt"
+-
+-/* Bluetooth control */
+-static void h1940bt_enable(int on)
+-{
+- if (on) {
+- /* Power on the chip */
+- gpio_set_value(H1940_LATCH_BLUETOOTH_POWER, 1);
+- /* Reset the chip */
+- mdelay(10);
+-
+- gpio_set_value(S3C2410_GPH(1), 1);
+- mdelay(10);
+- gpio_set_value(S3C2410_GPH(1), 0);
+-
+- h1940_led_blink_set(-EINVAL, GPIO_LED_BLINK, NULL, NULL);
+- }
+- else {
+- gpio_set_value(S3C2410_GPH(1), 1);
+- mdelay(10);
+- gpio_set_value(S3C2410_GPH(1), 0);
+- mdelay(10);
+- gpio_set_value(H1940_LATCH_BLUETOOTH_POWER, 0);
+-
+- h1940_led_blink_set(-EINVAL, GPIO_LED_NO_BLINK_LOW, NULL, NULL);
+- }
+-}
+-
+-static int h1940bt_set_block(void *data, bool blocked)
+-{
+- h1940bt_enable(!blocked);
+- return 0;
+-}
+-
+-static const struct rfkill_ops h1940bt_rfkill_ops = {
+- .set_block = h1940bt_set_block,
+-};
+-
+-static int h1940bt_probe(struct platform_device *pdev)
+-{
+- struct rfkill *rfk;
+- int ret = 0;
+-
+- ret = gpio_request(S3C2410_GPH(1), dev_name(&pdev->dev));
+- if (ret) {
+- dev_err(&pdev->dev, "could not get GPH1\n");
+- return ret;
+- }
+-
+- ret = gpio_request(H1940_LATCH_BLUETOOTH_POWER, dev_name(&pdev->dev));
+- if (ret) {
+- gpio_free(S3C2410_GPH(1));
+- dev_err(&pdev->dev, "could not get BT_POWER\n");
+- return ret;
+- }
+-
+- /* Configures BT serial port GPIOs */
+- s3c_gpio_cfgpin(S3C2410_GPH(0), S3C2410_GPH0_nCTS0);
+- s3c_gpio_setpull(S3C2410_GPH(0), S3C_GPIO_PULL_NONE);
+- s3c_gpio_cfgpin(S3C2410_GPH(1), S3C2410_GPIO_OUTPUT);
+- s3c_gpio_setpull(S3C2410_GPH(1), S3C_GPIO_PULL_NONE);
+- s3c_gpio_cfgpin(S3C2410_GPH(2), S3C2410_GPH2_TXD0);
+- s3c_gpio_setpull(S3C2410_GPH(2), S3C_GPIO_PULL_NONE);
+- s3c_gpio_cfgpin(S3C2410_GPH(3), S3C2410_GPH3_RXD0);
+- s3c_gpio_setpull(S3C2410_GPH(3), S3C_GPIO_PULL_NONE);
+-
+- rfk = rfkill_alloc(DRV_NAME, &pdev->dev, RFKILL_TYPE_BLUETOOTH,
+- &h1940bt_rfkill_ops, NULL);
+- if (!rfk) {
+- ret = -ENOMEM;
+- goto err_rfk_alloc;
+- }
+-
+- ret = rfkill_register(rfk);
+- if (ret)
+- goto err_rfkill;
+-
+- platform_set_drvdata(pdev, rfk);
+-
+- return 0;
+-
+-err_rfkill:
+- rfkill_destroy(rfk);
+-err_rfk_alloc:
+- return ret;
+-}
+-
+-static int h1940bt_remove(struct platform_device *pdev)
+-{
+- struct rfkill *rfk = platform_get_drvdata(pdev);
+-
+- platform_set_drvdata(pdev, NULL);
+- gpio_free(S3C2410_GPH(1));
+-
+- if (rfk) {
+- rfkill_unregister(rfk);
+- rfkill_destroy(rfk);
+- }
+- rfk = NULL;
+-
+- h1940bt_enable(0);
+-
+- return 0;
+-}
+-
+-
+-static struct platform_driver h1940bt_driver = {
+- .driver = {
+- .name = DRV_NAME,
+- },
+- .probe = h1940bt_probe,
+- .remove = h1940bt_remove,
+-};
+-
+-module_platform_driver(h1940bt_driver);
+-
+-MODULE_AUTHOR("Arnaud Patard <arnaud.patard@rtp-net.org>");
+-MODULE_DESCRIPTION("Driver for the iPAQ H1940 bluetooth chip");
+-MODULE_LICENSE("GPL");
+--
+1.9.3
+
diff --git a/recipes-kernel/linux/linux-yocto-3.14/h1940/0006-ARM-s3c24xx-h1940-Add-nand-device.patch b/recipes-kernel/linux/linux-yocto-3.14/h1940/0006-ARM-s3c24xx-h1940-Add-nand-device.patch
new file mode 100644
index 0000000..c23984a
--- /dev/null
+++ b/recipes-kernel/linux/linux-yocto-3.14/h1940/0006-ARM-s3c24xx-h1940-Add-nand-device.patch
@@ -0,0 +1,126 @@
+From a63933b7f6b410c478a4fad08ec61f13ef1549a8 Mon Sep 17 00:00:00 2001
+From: Vasily Khoruzhick <anarsoul@gmail.com>
+Date: Thu, 17 Oct 2013 12:13:29 +0300
+Subject: [PATCH 06/17] ARM: s3c24xx: h1940: Add nand device
+
+Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
+---
+ arch/arm/mach-s3c24xx/mach-h1940.c | 74 ++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 74 insertions(+)
+
+diff --git a/arch/arm/mach-s3c24xx/mach-h1940.c b/arch/arm/mach-s3c24xx/mach-h1940.c
+index de08321..1b3807e 100644
+--- a/arch/arm/mach-s3c24xx/mach-h1940.c
++++ b/arch/arm/mach-s3c24xx/mach-h1940.c
+@@ -31,6 +31,9 @@
+ #include <linux/s3c_adc_battery.h>
+ #include <linux/delay.h>
+
++#include <linux/mtd/mtd.h>
++#include <linux/mtd/partitions.h>
++
+ #include <video/platform_lcd.h>
+
+ #include <linux/mmc/host.h>
+@@ -46,6 +49,7 @@
+ #include <linux/platform_data/mmc-s3cmci.h>
+ #include <linux/platform_data/touchscreen-s3c2410.h>
+ #include <linux/platform_data/usb-s3c2410_udc.h>
++#include <linux/platform_data/mtd-nand-s3c2410.h>
+
+ #include <sound/uda1380.h>
+
+@@ -466,6 +470,74 @@ static struct s3c24xx_mci_pdata h1940_mmc_cfg __initdata = {
+ .ocr_avail = MMC_VDD_32_33,
+ };
+
++static struct mtd_partition h1940_nand_part[] = {
++ [0] = {
++ .name = "Boot0",
++ .offset = 0,
++ .size = SZ_16K,
++ .mask_flags = MTD_WRITEABLE,
++ },
++ [1] = {
++ .name = "Boot1",
++ .offset = MTDPART_OFS_APPEND,
++ .size = SZ_1K * 240,
++ .mask_flags = 0,
++ },
++ [2] = {
++ .name = "Env",
++ .offset = MTDPART_OFS_APPEND,
++ .size = SZ_16K,
++ .mask_flags = 0,
++ },
++ [3] = {
++ .name = "Opts",
++ .offset = MTDPART_OFS_APPEND,
++ .size = SZ_32K,
++ .mask_flags = 0,
++ },
++ [4] = {
++ .name = "Kernel",
++ .offset = MTDPART_OFS_APPEND,
++ .size = SZ_1M * 3,
++ .mask_flags = 0,
++ },
++ [5] = {
++ .name = "Filesystem",
++ .offset = MTDPART_OFS_APPEND,
++ .size = MTDPART_SIZ_FULL,
++ .mask_flags = 0,
++ },
++};
++
++static struct nand_ecclayout h1940_ecc_layout = {
++ .eccbytes = 3,
++ .eccpos = {
++ 8, 9, 10
++ },
++ .oobfree = {
++ {2, 6},
++ {11, 5}
++ }
++};
++
++static struct s3c2410_nand_set h1940_nand_sets[] = {
++ [0] = {
++ .name = "Internal",
++ .nr_chips = 1,
++ .nr_partitions = ARRAY_SIZE(h1940_nand_part),
++ .partitions = h1940_nand_part,
++ .ecc_layout = &h1940_ecc_layout,
++ },
++};
++
++static struct s3c2410_platform_nand h1940_nand_info = {
++ .tacls = 14,
++ .twrph0 = 44,
++ .twrph1 = 20,
++ .nr_sets = ARRAY_SIZE(h1940_nand_sets),
++ .sets = h1940_nand_sets,
++};
++
+ static int h1940_backlight_init(struct device *dev)
+ {
+ gpio_request(S3C2410_GPB(0), "Backlight");
+@@ -634,6 +706,7 @@ static struct platform_device *h1940_devices[] __initdata = {
+ &h1940_device_bluetooth,
+ &s3c_device_sdi,
+ &s3c_device_rtc,
++ &s3c_device_nand,
+ &samsung_device_pwm,
+ &h1940_backlight,
+ &h1940_lcd_powerdev,
+@@ -678,6 +751,7 @@ static void __init h1940_init(void)
+ s3c24xx_udc_set_platdata(&h1940_udc_cfg);
+ s3c24xx_ts_set_platdata(&h1940_ts_cfg);
+ s3c_i2c0_set_platdata(NULL);
++ s3c_nand_set_platdata(&h1940_nand_info);
+
+ /* Turn off suspend on both USB ports, and switch the
+ * selectable USB port to USB device mode. */
+--
+1.9.3
+
diff --git a/recipes-kernel/linux/linux-yocto-3.14/h1940/0007-ARM-s3c24xx-h1940-don-t-touch-UPLLCON.patch b/recipes-kernel/linux/linux-yocto-3.14/h1940/0007-ARM-s3c24xx-h1940-don-t-touch-UPLLCON.patch
new file mode 100644
index 0000000..f327041
--- /dev/null
+++ b/recipes-kernel/linux/linux-yocto-3.14/h1940/0007-ARM-s3c24xx-h1940-don-t-touch-UPLLCON.patch
@@ -0,0 +1,41 @@
+From ef5846b814c7952910d5d0592ffc5ea713e7f84f Mon Sep 17 00:00:00 2001
+From: Vasily Khoruzhick <anarsoul@gmail.com>
+Date: Thu, 17 Oct 2013 12:15:16 +0300
+Subject: [PATCH 07/17] ARM: s3c24xx: h1940: don't touch UPLLCON
+
+It's a bit late to modify UPLLCON in board init,
+anyway bootloader already puts correct value in it.
+
+Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
+---
+ arch/arm/mach-s3c24xx/mach-h1940.c | 7 -------
+ 1 file changed, 7 deletions(-)
+
+diff --git a/arch/arm/mach-s3c24xx/mach-h1940.c b/arch/arm/mach-s3c24xx/mach-h1940.c
+index 1b3807e..9ca26d1 100644
+--- a/arch/arm/mach-s3c24xx/mach-h1940.c
++++ b/arch/arm/mach-s3c24xx/mach-h1940.c
+@@ -744,8 +744,6 @@ static void __init h1940_reserve(void)
+
+ static void __init h1940_init(void)
+ {
+- u32 tmp;
+-
+ s3c24xx_fb_set_platdata(&h1940_fb_info);
+ s3c24xx_mci_set_platdata(&h1940_mmc_cfg);
+ s3c24xx_udc_set_platdata(&h1940_udc_cfg);
+@@ -760,11 +758,6 @@ static void __init h1940_init(void)
+ S3C2410_MISCCR_USBSUSPND0 |
+ S3C2410_MISCCR_USBSUSPND1, 0x0);
+
+- tmp = (0x78 << S3C24XX_PLL_MDIV_SHIFT)
+- | (0x02 << S3C24XX_PLL_PDIV_SHIFT)
+- | (0x03 << S3C24XX_PLL_SDIV_SHIFT);
+- writel(tmp, S3C2410_UPLLCON);
+-
+ gpio_request(S3C2410_GPC(0), "LCD power");
+ gpio_request(S3C2410_GPC(1), "LCD power");
+ gpio_request(S3C2410_GPC(4), "LCD power");
+--
+1.9.3
+
diff --git a/recipes-kernel/linux/linux-yocto-3.14/h1940/0008-ARM-s3c24xx-h1940-unlock-reset-button.patch b/recipes-kernel/linux/linux-yocto-3.14/h1940/0008-ARM-s3c24xx-h1940-unlock-reset-button.patch
new file mode 100644
index 0000000..6c3c9d3
--- /dev/null
+++ b/recipes-kernel/linux/linux-yocto-3.14/h1940/0008-ARM-s3c24xx-h1940-unlock-reset-button.patch
@@ -0,0 +1,52 @@
+From f163da149d098264475000f33bf919fe3342a5f6 Mon Sep 17 00:00:00 2001
+From: Vasily Khoruzhick <anarsoul@gmail.com>
+Date: Sat, 3 Dec 2011 12:12:21 +0300
+Subject: [PATCH 08/17] ARM: s3c24xx: h1940: unlock reset button
+
+Reset button can be left locked by bootloader and in case of kernel panic
+user won't be able to reset a device by pressing reset button.
+
+Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
+---
+ arch/arm/mach-s3c24xx/mach-h1940.c | 17 +++++++++++++++--
+ 1 file changed, 15 insertions(+), 2 deletions(-)
+
+diff --git a/arch/arm/mach-s3c24xx/mach-h1940.c b/arch/arm/mach-s3c24xx/mach-h1940.c
+index 9ca26d1..6403d80 100644
+--- a/arch/arm/mach-s3c24xx/mach-h1940.c
++++ b/arch/arm/mach-s3c24xx/mach-h1940.c
+@@ -219,9 +219,9 @@ static struct s3c2410fb_mach_info h1940_fb_info __initdata = {
+ .gpcup = 0x0000ffff,
+ .gpcup_mask = 0xffffffff,
+ .gpdcon = 0xaa84aaa0,
+- .gpdcon_mask = 0xffffffff,
++ .gpdcon_mask = 0xfffffff3,
+ .gpdup = 0x0000faff,
+- .gpdup_mask = 0xffffffff,
++ .gpdup_mask = 0xfffffffd,
+ };
+
+ static int power_supply_init(struct device *dev)
+@@ -795,6 +795,19 @@ static void __init h1940_init(void)
+ gpio_direction_output(S3C2410_GPA(7), 0);
+ gpio_direction_output(H1940_LATCH_LED_FLASH, 0);
+
++ gpio_request(S3C2410_GPD(1), "Reset sense");
++ gpio_request(S3C2410_GPA(14), "Reset reset");
++ gpio_request(S3C2410_GPB(6), "Reset lock");
++ gpio_direction_input(S3C2410_GPD(1));
++ gpio_direction_output(S3C2410_GPA(14), 0);
++ if (gpio_get_value(S3C2410_GPD(1)))
++ gpio_set_value(S3C2410_GPA(14), 0);
++
++ gpio_direction_output(S3C2410_GPA(14), 1);
++ mdelay(100);
++ gpio_direction_output(S3C2410_GPB(6), 1);
++ gpio_direction_output(S3C2410_GPB(6), 0);
++
+ i2c_register_board_info(0, h1940_i2c_devices,
+ ARRAY_SIZE(h1940_i2c_devices));
+ }
+--
+1.9.3
+
diff --git a/recipes-kernel/linux/linux-yocto-3.14/h1940/0009-ARM-s3c24xx-h1940-add-bluetooth-RF-kill-switch.patch b/recipes-kernel/linux/linux-yocto-3.14/h1940/0009-ARM-s3c24xx-h1940-add-bluetooth-RF-kill-switch.patch
new file mode 100644
index 0000000..b397cd5
--- /dev/null
+++ b/recipes-kernel/linux/linux-yocto-3.14/h1940/0009-ARM-s3c24xx-h1940-add-bluetooth-RF-kill-switch.patch
@@ -0,0 +1,100 @@
+From 09e3a02c82c1bfce950951cbd690201266e2f133 Mon Sep 17 00:00:00 2001
+From: Vasily Khoruzhick <anarsoul@gmail.com>
+Date: Sat, 17 Dec 2011 13:14:51 +0300
+Subject: [PATCH 09/17] ARM: s3c24xx: h1940: add bluetooth RF kill switch
+
+Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
+---
+ arch/arm/mach-s3c24xx/h1940.h | 4 +++-
+ arch/arm/mach-s3c24xx/mach-h1940.c | 39 ++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 42 insertions(+), 1 deletion(-)
+
+diff --git a/arch/arm/mach-s3c24xx/h1940.h b/arch/arm/mach-s3c24xx/h1940.h
+index 2950cc4..96c69d5 100644
+--- a/arch/arm/mach-s3c24xx/h1940.h
++++ b/arch/arm/mach-s3c24xx/h1940.h
+@@ -46,7 +46,9 @@ extern int h1940_led_blink_set(unsigned gpio, int state,
+ #define H1940_LATCH_SM803_ENABLE H1940_LATCH_GPIO(10)
+ #define H1940_LATCH_LCD_P4 H1940_LATCH_GPIO(11)
+ #define H1940_LATCH_SD_POWER H1940_LATCH_GPIO(12)
+-#define H1940_LATCH_BLUETOOTH_POWER H1940_LATCH_GPIO(13)
++#define H1940_LATCH_BT_POWER_IDX 13
++#define H1940_LATCH_BLUETOOTH_POWER \
++ H1940_LATCH_GPIO(H1940_LATCH_BT_POWER_IDX)
+ #define H1940_LATCH_LED_GREEN H1940_LATCH_GPIO(14)
+ #define H1940_LATCH_LED_FLASH H1940_LATCH_GPIO(15)
+
+diff --git a/arch/arm/mach-s3c24xx/mach-h1940.c b/arch/arm/mach-s3c24xx/mach-h1940.c
+index 6403d80..fb2d5a1 100644
+--- a/arch/arm/mach-s3c24xx/mach-h1940.c
++++ b/arch/arm/mach-s3c24xx/mach-h1940.c
+@@ -30,6 +30,7 @@
+ #include <linux/pda_power.h>
+ #include <linux/s3c_adc_battery.h>
+ #include <linux/delay.h>
++#include <linux/rfkill-gpio.h>
+
+ #include <linux/mtd/mtd.h>
+ #include <linux/mtd/partitions.h>
+@@ -694,6 +695,29 @@ static struct platform_device h1940_dev_buttons = {
+ }
+ };
+
++static struct rfkill_gpio_platform_data h1940_bt_rfkill_pdata = {
++ .name = "h1940-bt",
++ .reset_gpio = -EINVAL,
++ .shutdown_gpio = H1940_LATCH_BLUETOOTH_POWER,
++ .type = RFKILL_TYPE_BLUETOOTH,
++};
++
++static struct platform_device h1940_bluetooth = {
++ .name = "rfkill_gpio",
++ .id = 0,
++ .dev = {
++ .platform_data = &h1940_bt_rfkill_pdata,
++ },
++};
++
++static struct gpiod_lookup_table bt_gpio_lookup = {
++ .dev_id = "h1940-bt",
++ .table = {
++ GPIO_LOOKUP_IDX("H1940_LATCH", 13, NULL, 0, 0),
++ { },
++ },
++};
++
+ static struct platform_device *h1940_devices[] __initdata = {
+ &h1940_dev_buttons,
+ &s3c_device_ohci,
+@@ -714,6 +738,7 @@ static struct platform_device *h1940_devices[] __initdata = {
+ &s3c_device_ts,
+ &power_supply,
+ &h1940_battery,
++ &h1940_bluetooth,
+ };
+
+ static void __init h1940_map_io(void)
+@@ -784,6 +809,20 @@ static void __init h1940_init(void)
+ gpio_request(H1940_LATCH_SD_POWER, "SD power");
+ gpio_direction_output(H1940_LATCH_SD_POWER, 0);
+
++ /* Configures BT serial port GPIOs */
++ s3c_gpio_cfgpin(S3C2410_GPH(0), S3C2410_GPH0_nCTS0);
++ s3c_gpio_setpull(S3C2410_GPH(0), S3C_GPIO_PULL_NONE);
++ s3c_gpio_cfgpin(S3C2410_GPH(1), S3C2410_GPH1_nRTS0);
++ s3c_gpio_setpull(S3C2410_GPH(1), S3C_GPIO_PULL_NONE);
++ s3c_gpio_cfgpin(S3C2410_GPH(2), S3C2410_GPH2_TXD0);
++ s3c_gpio_setpull(S3C2410_GPH(2), S3C_GPIO_PULL_NONE);
++ s3c_gpio_cfgpin(S3C2410_GPH(3), S3C2410_GPH3_RXD0);
++ s3c_gpio_setpull(S3C2410_GPH(3), S3C_GPIO_PULL_NONE);
++
++ gpio_request(S3C2410_GPC(9), "BT reset");
++ gpio_direction_output(S3C2410_GPC(9), 1);
++
++ gpiod_add_lookup_table(&bt_gpio_lookup);
+ platform_add_devices(h1940_devices, ARRAY_SIZE(h1940_devices));
+
+ gpio_request(S3C2410_GPA(1), "Red LED blink");
+--
+1.9.3
+
diff --git a/recipes-kernel/linux/linux-yocto-3.14/h1940/0010-ARM-s3c24xx-h1940-add-IR-switch.patch b/recipes-kernel/linux/linux-yocto-3.14/h1940/0010-ARM-s3c24xx-h1940-add-IR-switch.patch
new file mode 100644
index 0000000..851f0f1
--- /dev/null
+++ b/recipes-kernel/linux/linux-yocto-3.14/h1940/0010-ARM-s3c24xx-h1940-add-IR-switch.patch
@@ -0,0 +1,73 @@
+From 79a09055ff091d60bdedff17150d1ca15233db44 Mon Sep 17 00:00:00 2001
+From: Vasily Khoruzhick <anarsoul@gmail.com>
+Date: Sun, 18 Dec 2011 11:29:30 +0300
+Subject: [PATCH 10/17] ARM: s3c24xx: h1940: add IR switch
+
+Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
+---
+ arch/arm/mach-s3c24xx/mach-h1940.c | 31 +++++++++++++++++++++++++++++++
+ 1 file changed, 31 insertions(+)
+
+diff --git a/arch/arm/mach-s3c24xx/mach-h1940.c b/arch/arm/mach-s3c24xx/mach-h1940.c
+index fb2d5a1..df0e89f 100644
+--- a/arch/arm/mach-s3c24xx/mach-h1940.c
++++ b/arch/arm/mach-s3c24xx/mach-h1940.c
+@@ -718,6 +718,29 @@ static struct gpiod_lookup_table bt_gpio_lookup = {
+ },
+ };
+
++static struct rfkill_gpio_platform_data h1940_ir_rfkill_pdata = {
++ .name = "h1940-ir",
++ .reset_gpio = -EINVAL,
++ .shutdown_gpio = S3C2410_GPB(9),
++ .type = RFKILL_TYPE_IR,
++};
++
++static struct platform_device h1940_irda = {
++ .name = "rfkill_gpio",
++ .id = 1,
++ .dev = {
++ .platform_data = &h1940_ir_rfkill_pdata,
++ },
++};
++
++static struct gpiod_lookup_table ir_gpio_lookup = {
++ .dev_id = "h1940-ir",
++ .table = {
++ GPIO_LOOKUP_IDX("GPIOB", 9, NULL, 0, GPIO_ACTIVE_LOW),
++ { },
++ },
++};
++
+ static struct platform_device *h1940_devices[] __initdata = {
+ &h1940_dev_buttons,
+ &s3c_device_ohci,
+@@ -739,6 +762,7 @@ static struct platform_device *h1940_devices[] __initdata = {
+ &power_supply,
+ &h1940_battery,
+ &h1940_bluetooth,
++ &h1940_irda,
+ };
+
+ static void __init h1940_map_io(void)
+@@ -819,10 +843,17 @@ static void __init h1940_init(void)
+ s3c_gpio_cfgpin(S3C2410_GPH(3), S3C2410_GPH3_RXD0);
+ s3c_gpio_setpull(S3C2410_GPH(3), S3C_GPIO_PULL_NONE);
+
++ /* Configure IR serial port GPIOs */
++ s3c_gpio_cfgpin(S3C2410_GPH(6), S3C2410_GPH6_TXD2);
++ s3c_gpio_setpull(S3C2410_GPH(6), S3C_GPIO_PULL_NONE);
++ s3c_gpio_cfgpin(S3C2410_GPH(7), S3C2410_GPH7_RXD2);
++ s3c_gpio_setpull(S3C2410_GPH(7), S3C_GPIO_PULL_NONE);
++
+ gpio_request(S3C2410_GPC(9), "BT reset");
+ gpio_direction_output(S3C2410_GPC(9), 1);
+
+ gpiod_add_lookup_table(&bt_gpio_lookup);
++ gpiod_add_lookup_table(&ir_gpio_lookup);
+ platform_add_devices(h1940_devices, ARRAY_SIZE(h1940_devices));
+
+ gpio_request(S3C2410_GPA(1), "Red LED blink");
+--
+1.9.3
+
diff --git a/recipes-kernel/linux/linux-yocto-3.14/h1940/0011-ARM-s3c24xx-h1940-increase-oversampling-shift.patch b/recipes-kernel/linux/linux-yocto-3.14/h1940/0011-ARM-s3c24xx-h1940-increase-oversampling-shift.patch
new file mode 100644
index 0000000..93479fe
--- /dev/null
+++ b/recipes-kernel/linux/linux-yocto-3.14/h1940/0011-ARM-s3c24xx-h1940-increase-oversampling-shift.patch
@@ -0,0 +1,29 @@
+From 9b3fda3f079093bda68fab588da54ae305035cb9 Mon Sep 17 00:00:00 2001
+From: Vasily Khoruzhick <anarsoul@gmail.com>
+Date: Sun, 18 Dec 2011 11:47:03 +0300
+Subject: [PATCH 11/17] ARM: s3c24xx: h1940: increase oversampling shift
+
+4 samples seems to be not enough for touchscreen driver
+to work accurately
+
+Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
+---
+ arch/arm/mach-s3c24xx/mach-h1940.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/arm/mach-s3c24xx/mach-h1940.c b/arch/arm/mach-s3c24xx/mach-h1940.c
+index df0e89f..15e1039 100644
+--- a/arch/arm/mach-s3c24xx/mach-h1940.c
++++ b/arch/arm/mach-s3c24xx/mach-h1940.c
+@@ -182,7 +182,7 @@ static struct s3c2410_udc_mach_info h1940_udc_cfg __initdata = {
+ static struct s3c2410_ts_mach_info h1940_ts_cfg __initdata = {
+ .delay = 10000,
+ .presc = 49,
+- .oversampling_shift = 2,
++ .oversampling_shift = 5,
+ .cfg_gpio = s3c24xx_ts_cfg_gpio,
+ };
+
+--
+1.9.3
+
diff --git a/recipes-kernel/linux/linux-yocto-3.14/h1940/0012-ARM-s3c24xx-h1940-Add-DMA-device.patch b/recipes-kernel/linux/linux-yocto-3.14/h1940/0012-ARM-s3c24xx-h1940-Add-DMA-device.patch
new file mode 100644
index 0000000..8858529
--- /dev/null
+++ b/recipes-kernel/linux/linux-yocto-3.14/h1940/0012-ARM-s3c24xx-h1940-Add-DMA-device.patch
@@ -0,0 +1,27 @@
+From e6cc75e785cab181a29a9b97c9e37b7614e132f1 Mon Sep 17 00:00:00 2001
+From: Vasily Khoruzhick <anarsoul@gmail.com>
+Date: Sun, 18 May 2014 12:46:09 +0300
+Subject: [PATCH 12/17] ARM: s3c24xx: h1940: Add DMA device
+
+To use new s3c24xx-dma driver we need to add appropriate platform device.
+
+Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
+---
+ arch/arm/mach-s3c24xx/mach-h1940.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/arch/arm/mach-s3c24xx/mach-h1940.c b/arch/arm/mach-s3c24xx/mach-h1940.c
+index 15e1039..3a082f3 100644
+--- a/arch/arm/mach-s3c24xx/mach-h1940.c
++++ b/arch/arm/mach-s3c24xx/mach-h1940.c
+@@ -743,6 +743,7 @@ static struct gpiod_lookup_table ir_gpio_lookup = {
+
+ static struct platform_device *h1940_devices[] __initdata = {
+ &h1940_dev_buttons,
++ &s3c2410_device_dma,
+ &s3c_device_ohci,
+ &s3c_device_lcd,
+ &s3c_device_wdt,
+--
+1.9.3
+
diff --git a/recipes-kernel/linux/linux-yocto-3.14/h1940/0013-dmaengine-s3c24xx-dma-Process-whole-SG-chain.patch b/recipes-kernel/linux/linux-yocto-3.14/h1940/0013-dmaengine-s3c24xx-dma-Process-whole-SG-chain.patch
new file mode 100644
index 0000000..051efca
--- /dev/null
+++ b/recipes-kernel/linux/linux-yocto-3.14/h1940/0013-dmaengine-s3c24xx-dma-Process-whole-SG-chain.patch
@@ -0,0 +1,27 @@
+From ad9763daaad79c35803732ac9ffd21f714363ebd Mon Sep 17 00:00:00 2001
+From: Vasily Khoruzhick <anarsoul@gmail.com>
+Date: Sun, 18 May 2014 11:42:10 +0300
+Subject: [PATCH 13/17] dmaengine: s3c24xx-dma: Process whole SG chain
+
+Due to redundant 'break' in loop driver processed only first chunk.
+
+Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
+---
+ drivers/dma/s3c24xx-dma.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/drivers/dma/s3c24xx-dma.c b/drivers/dma/s3c24xx-dma.c
+index 4eddedb..2167608 100644
+--- a/drivers/dma/s3c24xx-dma.c
++++ b/drivers/dma/s3c24xx-dma.c
+@@ -961,7 +961,6 @@ static struct dma_async_tx_descriptor *s3c24xx_dma_prep_slave_sg(
+ dsg->src_addr = slave_addr;
+ dsg->dst_addr = sg_dma_address(sg);
+ }
+- break;
+ }
+
+ return vchan_tx_prep(&s3cchan->vc, &txd->vd, flags);
+--
+1.9.3
+
diff --git a/recipes-kernel/linux/linux-yocto-3.14/h1940/0014-dmaengine-s3c24xx-dma-Add-cyclic-transfer-support.patch b/recipes-kernel/linux/linux-yocto-3.14/h1940/0014-dmaengine-s3c24xx-dma-Add-cyclic-transfer-support.patch
new file mode 100644
index 0000000..b3c68ed
--- /dev/null
+++ b/recipes-kernel/linux/linux-yocto-3.14/h1940/0014-dmaengine-s3c24xx-dma-Add-cyclic-transfer-support.patch
@@ -0,0 +1,183 @@
+From a2b08b319caba9b3297efa7d1d48cba4f99281f2 Mon Sep 17 00:00:00 2001
+From: Vasily Khoruzhick <anarsoul@gmail.com>
+Date: Sun, 18 May 2014 11:44:51 +0300
+Subject: [PATCH 14/17] dmaengine: s3c24xx-dma: Add cyclic transfer support
+
+Many audio interface drivers require support of cyclic transfers to work
+correctly, for example Samsung ASoC DMA driver. This patch adds support
+for cyclic transfers to the s3c24xx-dma driver
+
+Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
+---
+ drivers/dma/s3c24xx-dma.c | 112 +++++++++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 111 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/dma/s3c24xx-dma.c b/drivers/dma/s3c24xx-dma.c
+index 2167608..141e220 100644
+--- a/drivers/dma/s3c24xx-dma.c
++++ b/drivers/dma/s3c24xx-dma.c
+@@ -164,6 +164,7 @@ struct s3c24xx_sg {
+ * @disrcc: value for source control register
+ * @didstc: value for destination control register
+ * @dcon: base value for dcon register
++ * @cyclic: indicate cyclic transfer
+ */
+ struct s3c24xx_txd {
+ struct virt_dma_desc vd;
+@@ -173,6 +174,7 @@ struct s3c24xx_txd {
+ u32 disrcc;
+ u32 didstc;
+ u32 dcon;
++ bool cyclic;
+ };
+
+ struct s3c24xx_dma_chan;
+@@ -669,8 +671,10 @@ static irqreturn_t s3c24xx_dma_irq(int irq, void *data)
+ /* when more sg's are in this txd, start the next one */
+ if (!list_is_last(txd->at, &txd->dsg_list)) {
+ txd->at = txd->at->next;
++ if (txd->cyclic)
++ vchan_cyclic_callback(&txd->vd);
+ s3c24xx_dma_start_next_sg(s3cchan, txd);
+- } else {
++ } else if (!txd->cyclic) {
+ s3cchan->at = NULL;
+ vchan_cookie_complete(&txd->vd);
+
+@@ -682,6 +686,12 @@ static irqreturn_t s3c24xx_dma_irq(int irq, void *data)
+ s3c24xx_dma_start_next_txd(s3cchan);
+ else
+ s3c24xx_dma_phy_free(s3cchan);
++ } else {
++ vchan_cyclic_callback(&txd->vd);
++
++ /* Cyclic: reset at beginning */
++ txd->at = txd->dsg_list.next;
++ s3c24xx_dma_start_next_sg(s3cchan, txd);
+ }
+ }
+ spin_unlock(&s3cchan->vc.lock);
+@@ -877,6 +887,104 @@ static struct dma_async_tx_descriptor *s3c24xx_dma_prep_memcpy(
+ return vchan_tx_prep(&s3cchan->vc, &txd->vd, flags);
+ }
+
++static struct dma_async_tx_descriptor *s3c24xx_dma_prep_dma_cyclic(
++ struct dma_chan *chan, dma_addr_t addr, size_t size, size_t period,
++ enum dma_transfer_direction direction, unsigned long flags,
++ void *context)
++{
++ struct s3c24xx_dma_chan *s3cchan = to_s3c24xx_dma_chan(chan);
++ struct s3c24xx_dma_engine *s3cdma = s3cchan->host;
++ const struct s3c24xx_dma_platdata *pdata = s3cdma->pdata;
++ struct s3c24xx_dma_channel *cdata = &pdata->channels[s3cchan->id];
++ struct s3c24xx_txd *txd;
++ struct s3c24xx_sg *dsg;
++ unsigned sg_len;
++ dma_addr_t slave_addr;
++ u32 hwcfg = 0;
++ int i;
++
++ dev_dbg(&s3cdma->pdev->dev,
++ "prepare cyclic transaction of %d bytes with period %d from %s\n",
++ size, period, s3cchan->name);
++
++ if (!is_slave_direction(direction)) {
++ dev_err(&s3cdma->pdev->dev,
++ "direction %d unsupported\n", direction);
++ return NULL;
++ }
++
++ txd = s3c24xx_dma_get_txd();
++ if (!txd)
++ return NULL;
++
++ txd->cyclic = 1;
++
++ if (cdata->handshake)
++ txd->dcon |= S3C24XX_DCON_HANDSHAKE;
++
++ switch (cdata->bus) {
++ case S3C24XX_DMA_APB:
++ txd->dcon |= S3C24XX_DCON_SYNC_PCLK;
++ hwcfg |= S3C24XX_DISRCC_LOC_APB;
++ break;
++ case S3C24XX_DMA_AHB:
++ txd->dcon |= S3C24XX_DCON_SYNC_HCLK;
++ hwcfg |= S3C24XX_DISRCC_LOC_AHB;
++ break;
++ }
++
++ /*
++ * Always assume our peripheral desintation is a fixed
++ * address in memory.
++ */
++ hwcfg |= S3C24XX_DISRCC_INC_FIXED;
++
++ /*
++ * Individual dma operations are requested by the slave,
++ * so serve only single atomic operations (S3C24XX_DCON_SERV_SINGLE).
++ */
++ txd->dcon |= S3C24XX_DCON_SERV_SINGLE;
++
++ if (direction == DMA_MEM_TO_DEV) {
++ txd->disrcc = S3C24XX_DISRCC_LOC_AHB |
++ S3C24XX_DISRCC_INC_INCREMENT;
++ txd->didstc = hwcfg;
++ slave_addr = s3cchan->cfg.dst_addr;
++ txd->width = s3cchan->cfg.dst_addr_width;
++ } else {
++ txd->disrcc = hwcfg;
++ txd->didstc = S3C24XX_DIDSTC_LOC_AHB |
++ S3C24XX_DIDSTC_INC_INCREMENT;
++ slave_addr = s3cchan->cfg.src_addr;
++ txd->width = s3cchan->cfg.src_addr_width;
++ }
++
++ sg_len = size / period;
++
++ for (i = 0; i < sg_len; i++) {
++ dsg = kzalloc(sizeof(*dsg), GFP_NOWAIT);
++ if (!dsg) {
++ s3c24xx_dma_free_txd(txd);
++ return NULL;
++ }
++ list_add_tail(&dsg->node, &txd->dsg_list);
++
++ dsg->len = period;
++ /* Check last period length */
++ if (i == (sg_len - 1))
++ dsg->len = size - (period * i);
++ if (direction == DMA_MEM_TO_DEV) {
++ dsg->src_addr = addr + (period * i);
++ dsg->dst_addr = slave_addr;
++ } else { /* DMA_DEV_TO_MEM */
++ dsg->src_addr = slave_addr;
++ dsg->dst_addr = addr + (period * i);
++ }
++ }
++
++ return vchan_tx_prep(&s3cchan->vc, &txd->vd, flags);
++}
++
+ static struct dma_async_tx_descriptor *s3c24xx_dma_prep_slave_sg(
+ struct dma_chan *chan, struct scatterlist *sgl,
+ unsigned int sg_len, enum dma_transfer_direction direction,
+@@ -1197,6 +1305,7 @@ static int s3c24xx_dma_probe(struct platform_device *pdev)
+
+ /* Initialize slave engine for SoC internal dedicated peripherals */
+ dma_cap_set(DMA_SLAVE, s3cdma->slave.cap_mask);
++ dma_cap_set(DMA_CYCLIC, s3cdma->slave.cap_mask);
+ dma_cap_set(DMA_PRIVATE, s3cdma->slave.cap_mask);
+ s3cdma->slave.dev = &pdev->dev;
+ s3cdma->slave.device_alloc_chan_resources =
+@@ -1206,6 +1315,7 @@ static int s3c24xx_dma_probe(struct platform_device *pdev)
+ s3cdma->slave.device_tx_status = s3c24xx_dma_tx_status;
+ s3cdma->slave.device_issue_pending = s3c24xx_dma_issue_pending;
+ s3cdma->slave.device_prep_slave_sg = s3c24xx_dma_prep_slave_sg;
++ s3cdma->slave.device_prep_dma_cyclic = s3c24xx_dma_prep_dma_cyclic;
+ s3cdma->slave.device_control = s3c24xx_dma_control;
+
+ /* Register as many memcpy channels as there are physical channels */
+--
+1.9.3
+
diff --git a/recipes-kernel/linux/linux-yocto-3.14/h1940/0015-s3cmci-port-DMA-code-to-dmaengine-API.patch b/recipes-kernel/linux/linux-yocto-3.14/h1940/0015-s3cmci-port-DMA-code-to-dmaengine-API.patch
new file mode 100644
index 0000000..735f558
--- /dev/null
+++ b/recipes-kernel/linux/linux-yocto-3.14/h1940/0015-s3cmci-port-DMA-code-to-dmaengine-API.patch
@@ -0,0 +1,370 @@
+From f237d97db372b315f940defc63ffb75b07d903f9 Mon Sep 17 00:00:00 2001
+From: Vasily Khoruzhick <anarsoul@gmail.com>
+Date: Fri, 13 Aug 2010 20:01:53 +0300
+Subject: [PATCH 15/17] s3cmci: port DMA code to dmaengine API
+
+Utilise new s3c24xx-dma dmaengine driver for DMA ops.
+
+Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
+---
+ drivers/mmc/host/Kconfig | 9 ---
+ drivers/mmc/host/s3cmci.c | 183 +++++++++++++++-------------------------------
+ drivers/mmc/host/s3cmci.h | 6 +-
+ 3 files changed, 61 insertions(+), 137 deletions(-)
+
+diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
+index 1384f67..45c791c3 100644
+--- a/drivers/mmc/host/Kconfig
++++ b/drivers/mmc/host/Kconfig
+@@ -457,15 +457,6 @@ config MMC_S3C_DMA
+ working properly and needs to be debugged before this
+ option is useful.
+
+-config MMC_S3C_PIODMA
+- bool "Support for both PIO and DMA"
+- help
+- Compile both the PIO and DMA transfer routines into the
+- driver and let the platform select at run-time which one
+- is best.
+-
+- See notes for the DMA option.
+-
+ endchoice
+
+ config MMC_SDRICOH_CS
+diff --git a/drivers/mmc/host/s3cmci.c b/drivers/mmc/host/s3cmci.c
+index f237826..9f32a30 100644
+--- a/drivers/mmc/host/s3cmci.c
++++ b/drivers/mmc/host/s3cmci.c
+@@ -12,6 +12,7 @@
+ */
+
+ #include <linux/module.h>
++#include <linux/dmaengine.h>
+ #include <linux/dma-mapping.h>
+ #include <linux/clk.h>
+ #include <linux/mmc/host.h>
+@@ -24,9 +25,9 @@
+ #include <linux/io.h>
+
+ #include <plat/gpio-cfg.h>
+-#include <mach/dma.h>
+ #include <mach/gpio-samsung.h>
+
++#include <linux/platform_data/dma-s3c24xx.h>
+ #include <linux/platform_data/mmc-s3cmci.h>
+
+ #include "s3cmci.h"
+@@ -140,10 +141,6 @@ static const int dbgmap_debug = dbg_err | dbg_debug;
+ dev_dbg(&host->pdev->dev, args); \
+ } while (0)
+
+-static struct s3c2410_dma_client s3cmci_dma_client = {
+- .name = "s3c-mci",
+-};
+-
+ static void finalize_request(struct s3cmci_host *host);
+ static void s3cmci_send_request(struct mmc_host *mmc);
+ static void s3cmci_reset(struct s3cmci_host *host);
+@@ -256,25 +253,8 @@ static inline bool s3cmci_host_usedma(struct s3cmci_host *host)
+ {
+ #ifdef CONFIG_MMC_S3C_PIO
+ return false;
+-#elif defined(CONFIG_MMC_S3C_DMA)
+- return true;
+-#else
+- return host->dodma;
+-#endif
+-}
+-
+-/**
+- * s3cmci_host_canpio - return true if host has pio code available
+- *
+- * Return true if the driver has been compiled with the PIO support code
+- * available.
+- */
+-static inline bool s3cmci_host_canpio(void)
+-{
+-#ifdef CONFIG_MMC_S3C_PIO
++#else /* CONFIG_MMC_S3C_DMA */
+ return true;
+-#else
+- return false;
+ #endif
+ }
+
+@@ -841,11 +821,9 @@ static irqreturn_t s3cmci_irq_cd(int irq, void *dev_id)
+ return IRQ_HANDLED;
+ }
+
+-static void s3cmci_dma_done_callback(struct s3c2410_dma_chan *dma_ch,
+- void *buf_id, int size,
+- enum s3c2410_dma_buffresult result)
++static void s3cmci_dma_done_callback(void *arg)
+ {
+- struct s3cmci_host *host = buf_id;
++ struct s3cmci_host *host = arg;
+ unsigned long iflags;
+ u32 mci_csta, mci_dsta, mci_fsta, mci_dcnt;
+
+@@ -856,45 +834,17 @@ static void s3cmci_dma_done_callback(struct s3c2410_dma_chan *dma_ch,
+
+ BUG_ON(!host->mrq);
+ BUG_ON(!host->mrq->data);
+- BUG_ON(!host->dmatogo);
+
+ spin_lock_irqsave(&host->complete_lock, iflags);
+
+- if (result != S3C2410_RES_OK) {
+- dbg(host, dbg_fail, "DMA FAILED: csta=0x%08x dsta=0x%08x "
+- "fsta=0x%08x dcnt:0x%08x result:0x%08x toGo:%u\n",
+- mci_csta, mci_dsta, mci_fsta,
+- mci_dcnt, result, host->dmatogo);
+-
+- goto fail_request;
+- }
+-
+- host->dmatogo--;
+- if (host->dmatogo) {
+- dbg(host, dbg_dma, "DMA DONE Size:%i DSTA:[%08x] "
+- "DCNT:[%08x] toGo:%u\n",
+- size, mci_dsta, mci_dcnt, host->dmatogo);
+-
+- goto out;
+- }
+-
+- dbg(host, dbg_dma, "DMA FINISHED Size:%i DSTA:%08x DCNT:%08x\n",
+- size, mci_dsta, mci_dcnt);
++ dbg(host, dbg_dma, "DMA FINISHED\n");
+
+ host->dma_complete = 1;
+ host->complete_what = COMPLETION_FINALIZE;
+
+-out:
+ tasklet_schedule(&host->pio_tasklet);
+ spin_unlock_irqrestore(&host->complete_lock, iflags);
+- return;
+
+-fail_request:
+- host->mrq->data->error = -EINVAL;
+- host->complete_what = COMPLETION_FINALIZE;
+- clear_imask(host);
+-
+- goto out;
+ }
+
+ static void finalize_request(struct s3cmci_host *host)
+@@ -966,7 +916,7 @@ static void finalize_request(struct s3cmci_host *host)
+ * DMA channel and the fifo to clear out any garbage. */
+ if (mrq->data->error != 0) {
+ if (s3cmci_host_usedma(host))
+- s3c2410_dma_ctrl(host->dma, S3C2410_DMAOP_FLUSH);
++ dmaengine_terminate_all(host->dma);
+
+ if (host->is2440) {
+ /* Clear failure register and reset fifo. */
+@@ -992,29 +942,6 @@ request_done:
+ mmc_request_done(host->mmc, mrq);
+ }
+
+-static void s3cmci_dma_setup(struct s3cmci_host *host,
+- enum dma_data_direction source)
+-{
+- static enum dma_data_direction last_source = -1;
+- static int setup_ok;
+-
+- if (last_source == source)
+- return;
+-
+- last_source = source;
+-
+- s3c2410_dma_devconfig(host->dma, source,
+- host->mem->start + host->sdidata);
+-
+- if (!setup_ok) {
+- s3c2410_dma_config(host->dma, 4);
+- s3c2410_dma_set_buffdone_fn(host->dma,
+- s3cmci_dma_done_callback);
+- s3c2410_dma_setflags(host->dma, S3C2410_DMAF_AUTOSTART);
+- setup_ok = 1;
+- }
+-}
+-
+ static void s3cmci_send_command(struct s3cmci_host *host,
+ struct mmc_command *cmd)
+ {
+@@ -1162,43 +1089,44 @@ static int s3cmci_prepare_pio(struct s3cmci_host *host, struct mmc_data *data)
+
+ static int s3cmci_prepare_dma(struct s3cmci_host *host, struct mmc_data *data)
+ {
+- int dma_len, i;
+ int rw = data->flags & MMC_DATA_WRITE;
++ struct dma_slave_config conf = {
++ .src_addr = host->mem->start + host->sdidata,
++ .dst_addr = host->mem->start + host->sdidata,
++ .src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES,
++ .dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES,
++ };
+
+ BUG_ON((data->flags & BOTH_DIR) == BOTH_DIR);
+
+- s3cmci_dma_setup(host, rw ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
+- s3c2410_dma_ctrl(host->dma, S3C2410_DMAOP_FLUSH);
+-
+- dma_len = dma_map_sg(mmc_dev(host->mmc), data->sg, data->sg_len,
+- rw ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
+-
+- if (dma_len == 0)
+- return -ENOMEM;
+-
+- host->dma_complete = 0;
+- host->dmatogo = dma_len;
+-
+- for (i = 0; i < dma_len; i++) {
+- int res;
+-
+- dbg(host, dbg_dma, "enqueue %i: %08x@%u\n", i,
+- sg_dma_address(&data->sg[i]),
+- sg_dma_len(&data->sg[i]));
++ /* Restore prescaler value */
++ writel(host->prescaler, host->base + S3C2410_SDIPRE);
+
+- res = s3c2410_dma_enqueue(host->dma, host,
+- sg_dma_address(&data->sg[i]),
+- sg_dma_len(&data->sg[i]));
++ if (!rw)
++ conf.direction = DMA_DEV_TO_MEM;
++ else
++ conf.direction = DMA_MEM_TO_DEV;
+
+- if (res) {
+- s3c2410_dma_ctrl(host->dma, S3C2410_DMAOP_FLUSH);
+- return -EBUSY;
+- }
+- }
++ dma_map_sg(mmc_dev(host->mmc), data->sg, data->sg_len,
++ rw ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
+
+- s3c2410_dma_ctrl(host->dma, S3C2410_DMAOP_START);
++ dmaengine_slave_config(host->dma, &conf);
++ host->desc = dmaengine_prep_slave_sg(host->dma, data->sg, data->sg_len,
++ conf.direction,
++ DMA_CTRL_ACK | DMA_PREP_INTERRUPT);
++ if (!host->desc)
++ goto unmap_exit;
++ host->desc->callback = s3cmci_dma_done_callback;
++ host->desc->callback_param = host;
++ dmaengine_submit(host->desc);
++ dma_async_issue_pending(host->dma);
+
+ return 0;
++
++unmap_exit:
++ dma_unmap_sg(mmc_dev(host->mmc), data->sg, data->sg_len,
++ rw ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
++ return -ENOMEM;
+ }
+
+ static void s3cmci_send_request(struct mmc_host *mmc)
+@@ -1676,10 +1604,6 @@ static int s3cmci_probe(struct platform_device *pdev)
+ host->complete_what = COMPLETION_NONE;
+ host->pio_active = XFER_NONE;
+
+-#ifdef CONFIG_MMC_S3C_PIODMA
+- host->dodma = host->pdata->use_dma;
+-#endif
+-
+ host->mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (!host->mem) {
+ dev_err(&pdev->dev,
+@@ -1765,17 +1689,26 @@ static int s3cmci_probe(struct platform_device *pdev)
+ /* depending on the dma state, get a dma channel to use. */
+
+ if (s3cmci_host_usedma(host)) {
+- host->dma = s3c2410_dma_request(DMACH_SDI, &s3cmci_dma_client,
+- host);
+- if (host->dma < 0) {
++ struct resource *res;
++ dma_cap_mask_t mask;
++
++ res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
++ if (!res) {
++ dev_err(&pdev->dev,
++ "failed to get dma resource.\n");
++ ret = -ENOENT;
++ goto probe_free_gpio_wp;
++ }
++
++ dma_cap_zero(mask);
++ dma_cap_set(DMA_SLAVE, mask);
++
++ host->dma = dma_request_channel(mask,
++ s3c24xx_dma_filter, (void *)res->start);
++ if (!host->dma) {
+ dev_err(&pdev->dev, "cannot get DMA channel.\n");
+- if (!s3cmci_host_canpio()) {
+- ret = -EBUSY;
+- goto probe_free_gpio_wp;
+- } else {
+- dev_warn(&pdev->dev, "falling back to PIO.\n");
+- host->dodma = 0;
+- }
++ ret = -EBUSY;
++ goto probe_free_gpio_wp;
+ }
+ }
+
+@@ -1816,7 +1749,7 @@ static int s3cmci_probe(struct platform_device *pdev)
+ mmc->max_segs = 128;
+
+ dbg(host, dbg_debug,
+- "probe: mode:%s mapped mci_base:%p irq:%u irq_cd:%u dma:%u.\n",
++ "probe: mode:%s mapped mci_base:%p irq:%u irq_cd:%u dma:%p.\n",
+ (host->is2440?"2440":""),
+ host->base, host->irq, host->irq_cd, host->dma);
+
+@@ -1852,7 +1785,7 @@ static int s3cmci_probe(struct platform_device *pdev)
+
+ probe_free_dma:
+ if (s3cmci_host_usedma(host))
+- s3c2410_dma_free(host->dma, &s3cmci_dma_client);
++ dma_release_channel(host->dma);
+
+ probe_free_gpio_wp:
+ if (!host->pdata->no_wprotect)
+@@ -1914,7 +1847,7 @@ static int s3cmci_remove(struct platform_device *pdev)
+ tasklet_disable(&host->pio_tasklet);
+
+ if (s3cmci_host_usedma(host))
+- s3c2410_dma_free(host->dma, &s3cmci_dma_client);
++ dma_release_channel(host->dma);
+
+ free_irq(host->irq, host);
+
+diff --git a/drivers/mmc/host/s3cmci.h b/drivers/mmc/host/s3cmci.h
+index c76b53d..09dbbcd 100644
+--- a/drivers/mmc/host/s3cmci.h
++++ b/drivers/mmc/host/s3cmci.h
+@@ -26,7 +26,9 @@ struct s3cmci_host {
+ void __iomem *base;
+ int irq;
+ int irq_cd;
+- int dma;
++ struct dma_chan *dma;
++ struct dma_async_tx_descriptor
++ *desc;
+
+ unsigned long clk_rate;
+ unsigned long clk_div;
+@@ -36,8 +38,6 @@ struct s3cmci_host {
+ int is2440;
+ unsigned sdiimsk;
+ unsigned sdidata;
+- int dodma;
+- int dmatogo;
+
+ bool irq_disabled;
+ bool irq_enabled;
+--
+1.9.3
+
diff --git a/recipes-kernel/linux/linux-yocto-3.14/h1940/0016-ASoC-samsung-s3c24-xx-12-i2s-port-to-use-generic-dma.patch b/recipes-kernel/linux/linux-yocto-3.14/h1940/0016-ASoC-samsung-s3c24-xx-12-i2s-port-to-use-generic-dma.patch
new file mode 100644
index 0000000..866ea91
--- /dev/null
+++ b/recipes-kernel/linux/linux-yocto-3.14/h1940/0016-ASoC-samsung-s3c24-xx-12-i2s-port-to-use-generic-dma.patch
@@ -0,0 +1,385 @@
+From e1a8f391f28967f4d2afa8fa31044abfafc57b0f Mon Sep 17 00:00:00 2001
+From: Vasily Khoruzhick <anarsoul@gmail.com>
+Date: Sun, 18 May 2014 12:38:57 +0300
+Subject: [PATCH 16/17] ASoC: samsung: s3c24{xx,12}-i2s: port to use generic
+ dmaengine API
+
+Use dmaengine instead of legacy s3c24xx DMA API for s3c24xx and s3c2412
+
+Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
+---
+ sound/soc/samsung/Kconfig | 9 ++----
+ sound/soc/samsung/dmaengine.c | 3 ++
+ sound/soc/samsung/s3c-i2s-v2.c | 17 +---------
+ sound/soc/samsung/s3c2412-i2s.c | 63 +++++++++++++++++++++---------------
+ sound/soc/samsung/s3c24xx-i2s.c | 72 +++++++++++++++++++++++------------------
+ 5 files changed, 84 insertions(+), 80 deletions(-)
+
+diff --git a/sound/soc/samsung/Kconfig b/sound/soc/samsung/Kconfig
+index 3507574..022c7a4 100644
+--- a/sound/soc/samsung/Kconfig
++++ b/sound/soc/samsung/Kconfig
+@@ -1,11 +1,10 @@
+ config SND_SOC_SAMSUNG
+ tristate "ASoC support for Samsung"
+ depends on PLAT_SAMSUNG
+- select S3C2410_DMA if ARCH_S3C24XX
++ select S3C24XX_DMAC if ARCH_S3C24XX
+ select S3C64XX_PL080 if ARCH_S3C64XX
+- select SND_S3C_DMA if !ARCH_S3C24XX
+- select SND_S3C_DMA_LEGACY if ARCH_S3C24XX
+- select SND_SOC_GENERIC_DMAENGINE_PCM if !ARCH_S3C24XX
++ select SND_S3C_DMA
++ select SND_SOC_GENERIC_DMAENGINE_PCM
+ help
+ Say Y or M if you want to add support for codecs attached to
+ the Samsung SoCs' Audio interfaces. You will also need to
+@@ -19,7 +18,6 @@ config SND_S3C_DMA_LEGACY
+
+ config SND_S3C24XX_I2S
+ tristate
+- select S3C24XX_DMA
+
+ config SND_S3C_I2SV2_SOC
+ tristate
+@@ -27,7 +25,6 @@ config SND_S3C_I2SV2_SOC
+ config SND_S3C2412_SOC_I2S
+ tristate
+ select SND_S3C_I2SV2_SOC
+- select S3C2410_DMA
+
+ config SND_SAMSUNG_PCM
+ tristate
+diff --git a/sound/soc/samsung/dmaengine.c b/sound/soc/samsung/dmaengine.c
+index 750ce58..72f27d1 100644
+--- a/sound/soc/samsung/dmaengine.c
++++ b/sound/soc/samsung/dmaengine.c
+@@ -17,6 +17,7 @@
+
+ #include <linux/module.h>
+ #include <linux/amba/pl08x.h>
++#include <linux/platform_data/dma-s3c24xx.h>
+
+ #include <sound/core.h>
+ #include <sound/pcm.h>
+@@ -29,6 +30,8 @@
+
+ #ifdef CONFIG_ARCH_S3C64XX
+ #define filter_fn pl08x_filter_id
++#elif defined(CONFIG_ARCH_S3C24XX)
++#define filter_fn s3c24xx_dma_filter
+ #else
+ #define filter_fn NULL
+ #endif
+diff --git a/sound/soc/samsung/s3c-i2s-v2.c b/sound/soc/samsung/s3c-i2s-v2.c
+index 79e7efb..1a74051 100644
+--- a/sound/soc/samsung/s3c-i2s-v2.c
++++ b/sound/soc/samsung/s3c-i2s-v2.c
+@@ -392,8 +392,6 @@ static int s3c2412_i2s_trigger(struct snd_pcm_substream *substream, int cmd,
+ int capture = (substream->stream == SNDRV_PCM_STREAM_CAPTURE);
+ unsigned long irqs;
+ int ret = 0;
+- struct s3c_dma_params *dma_data =
+- snd_soc_dai_get_dma_data(rtd->cpu_dai, substream);
+
+ pr_debug("Entered %s\n", __func__);
+
+@@ -424,13 +422,6 @@ static int s3c2412_i2s_trigger(struct snd_pcm_substream *substream, int cmd,
+
+ local_irq_restore(irqs);
+
+- /*
+- * Load the next buffer to DMA to meet the reqirement
+- * of the auto reload mechanism of S3C24XX.
+- * This call won't bother S3C64XX.
+- */
+- s3c2410_dma_ctrl(dma_data->channel, S3C2410_DMAOP_STARTED);
+-
+ break;
+
+ case SNDRV_PCM_TRIGGER_STOP:
+@@ -644,12 +635,6 @@ int s3c_i2sv2_probe(struct snd_soc_dai *dai,
+ /* record our i2s structure for later use in the callbacks */
+ snd_soc_dai_set_drvdata(dai, i2s);
+
+- i2s->regs = ioremap(base, 0x100);
+- if (i2s->regs == NULL) {
+- dev_err(dev, "cannot ioremap registers\n");
+- return -ENXIO;
+- }
+-
+ i2s->iis_pclk = clk_get(dev, "iis");
+ if (IS_ERR(i2s->iis_pclk)) {
+ dev_err(dev, "failed to get iis_clock\n");
+@@ -729,7 +714,7 @@ int s3c_i2sv2_register_component(struct device *dev, int id,
+ struct snd_soc_component_driver *cmp_drv,
+ struct snd_soc_dai_driver *dai_drv)
+ {
+- struct snd_soc_dai_ops *ops = dai_drv->ops;
++ struct snd_soc_dai_ops *ops = (struct snd_soc_dai_ops *)dai_drv->ops;
+
+ ops->trigger = s3c2412_i2s_trigger;
+ if (!ops->hw_params)
+diff --git a/sound/soc/samsung/s3c2412-i2s.c b/sound/soc/samsung/s3c2412-i2s.c
+index d079445..f672352 100644
+--- a/sound/soc/samsung/s3c2412-i2s.c
++++ b/sound/soc/samsung/s3c2412-i2s.c
+@@ -33,25 +33,17 @@
+ #include "regs-i2s-v2.h"
+ #include "s3c2412-i2s.h"
+
+-static struct s3c2410_dma_client s3c2412_dma_client_out = {
+- .name = "I2S PCM Stereo out"
+-};
+-
+-static struct s3c2410_dma_client s3c2412_dma_client_in = {
+- .name = "I2S PCM Stereo in"
+-};
+-
+ static struct s3c_dma_params s3c2412_i2s_pcm_stereo_out = {
+- .client = &s3c2412_dma_client_out,
+- .channel = DMACH_I2S_OUT,
+- .dma_addr = S3C2410_PA_IIS + S3C2412_IISTXD,
++ .client =
++ (struct s3c2410_dma_client *)&s3c2412_i2s_pcm_stereo_out,
++ .ch_name = "tx",
+ .dma_size = 4,
+ };
+
+ static struct s3c_dma_params s3c2412_i2s_pcm_stereo_in = {
+- .client = &s3c2412_dma_client_in,
+- .channel = DMACH_I2S_IN,
+- .dma_addr = S3C2410_PA_IIS + S3C2412_IISRXD,
++ .client =
++ (struct s3c2410_dma_client *)&s3c2412_i2s_pcm_stereo_in,
++ .ch_name = "rx",
+ .dma_size = 4,
+ };
+
+@@ -63,6 +55,9 @@ static int s3c2412_i2s_probe(struct snd_soc_dai *dai)
+
+ pr_debug("Entered %s\n", __func__);
+
++ samsung_asoc_init_dma_data(dai, &s3c2412_i2s_pcm_stereo_out,
++ &s3c2412_i2s_pcm_stereo_in);
++
+ ret = s3c_i2sv2_probe(dai, &s3c2412_i2s, S3C2410_PA_IIS);
+ if (ret)
+ return ret;
+@@ -70,10 +65,9 @@ static int s3c2412_i2s_probe(struct snd_soc_dai *dai)
+ s3c2412_i2s.dma_capture = &s3c2412_i2s_pcm_stereo_in;
+ s3c2412_i2s.dma_playback = &s3c2412_i2s_pcm_stereo_out;
+
+- s3c2412_i2s.iis_cclk = clk_get(dai->dev, "i2sclk");
++ s3c2412_i2s.iis_cclk = devm_clk_get(dai->dev, "i2sclk");
+ if (IS_ERR(s3c2412_i2s.iis_cclk)) {
+ pr_err("failed to get i2sclk clock\n");
+- iounmap(s3c2412_i2s.regs);
+ return PTR_ERR(s3c2412_i2s.iis_cclk);
+ }
+
+@@ -94,8 +88,6 @@ static int s3c2412_i2s_probe(struct snd_soc_dai *dai)
+ static int s3c2412_i2s_remove(struct snd_soc_dai *dai)
+ {
+ clk_disable(s3c2412_i2s.iis_cclk);
+- clk_put(s3c2412_i2s.iis_cclk);
+- iounmap(s3c2412_i2s.regs);
+
+ return 0;
+ }
+@@ -105,18 +97,10 @@ static int s3c2412_i2s_hw_params(struct snd_pcm_substream *substream,
+ struct snd_soc_dai *cpu_dai)
+ {
+ struct s3c_i2sv2_info *i2s = snd_soc_dai_get_drvdata(cpu_dai);
+- struct s3c_dma_params *dma_data;
+ u32 iismod;
+
+ pr_debug("Entered %s\n", __func__);
+
+- if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
+- dma_data = i2s->dma_playback;
+- else
+- dma_data = i2s->dma_capture;
+-
+- snd_soc_dai_set_dma_data(cpu_dai, substream, dma_data);
+-
+ iismod = readl(i2s->regs + S3C2412_IISMOD);
+ pr_debug("%s: r: IISMOD: %x\n", __func__, iismod);
+
+@@ -169,6 +153,33 @@ static const struct snd_soc_component_driver s3c2412_i2s_component = {
+ static int s3c2412_iis_dev_probe(struct platform_device *pdev)
+ {
+ int ret = 0;
++ struct resource *res;
++
++ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++ if (!res) {
++ dev_err(&pdev->dev, "Can't get IO resource.\n");
++ return -ENOENT;
++ }
++ s3c2412_i2s.regs = devm_ioremap_resource(&pdev->dev, res);
++ if (s3c2412_i2s.regs == NULL)
++ return -ENXIO;
++
++ s3c2412_i2s_pcm_stereo_out.dma_addr = res->start + S3C2412_IISTXD;
++ s3c2412_i2s_pcm_stereo_in.dma_addr = res->start + S3C2412_IISRXD;
++
++ res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
++ if (!res) {
++ dev_err(&pdev->dev, "Can't get DMA resource for playback.\n");
++ return -ENOENT;
++ }
++ s3c2412_i2s_pcm_stereo_out.channel = res->start;
++
++ res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
++ if (!res) {
++ dev_err(&pdev->dev, "Can't get DMA resource for capture.\n");
++ return -ENOENT;
++ }
++ s3c2412_i2s_pcm_stereo_in.channel = res->start;
+
+ ret = s3c_i2sv2_register_component(&pdev->dev, -1,
+ &s3c2412_i2s_component,
+diff --git a/sound/soc/samsung/s3c24xx-i2s.c b/sound/soc/samsung/s3c24xx-i2s.c
+index f31e916..f854d45 100644
+--- a/sound/soc/samsung/s3c24xx-i2s.c
++++ b/sound/soc/samsung/s3c24xx-i2s.c
+@@ -31,25 +31,17 @@
+ #include "dma.h"
+ #include "s3c24xx-i2s.h"
+
+-static struct s3c2410_dma_client s3c24xx_dma_client_out = {
+- .name = "I2S PCM Stereo out"
+-};
+-
+-static struct s3c2410_dma_client s3c24xx_dma_client_in = {
+- .name = "I2S PCM Stereo in"
+-};
+-
+ static struct s3c_dma_params s3c24xx_i2s_pcm_stereo_out = {
+- .client = &s3c24xx_dma_client_out,
+- .channel = DMACH_I2S_OUT,
+- .dma_addr = S3C2410_PA_IIS + S3C2410_IISFIFO,
++ .client =
++ (struct s3c2410_dma_client *)&s3c24xx_i2s_pcm_stereo_out,
++ .ch_name = "tx",
+ .dma_size = 2,
+ };
+
+ static struct s3c_dma_params s3c24xx_i2s_pcm_stereo_in = {
+- .client = &s3c24xx_dma_client_in,
+- .channel = DMACH_I2S_IN,
+- .dma_addr = S3C2410_PA_IIS + S3C2410_IISFIFO,
++ .client =
++ (struct s3c2410_dma_client *)&s3c24xx_i2s_pcm_stereo_in,
++ .ch_name = "rx",
+ .dma_size = 2,
+ };
+
+@@ -231,18 +223,12 @@ static int s3c24xx_i2s_hw_params(struct snd_pcm_substream *substream,
+ struct snd_pcm_hw_params *params,
+ struct snd_soc_dai *dai)
+ {
+- struct snd_soc_pcm_runtime *rtd = substream->private_data;
+- struct s3c_dma_params *dma_data;
++ struct snd_dmaengine_dai_dma_data *dma_data;
+ u32 iismod;
+
+ pr_debug("Entered %s\n", __func__);
+
+- if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
+- dma_data = &s3c24xx_i2s_pcm_stereo_out;
+- else
+- dma_data = &s3c24xx_i2s_pcm_stereo_in;
+-
+- snd_soc_dai_set_dma_data(rtd->cpu_dai, substream, dma_data);
++ dma_data = snd_soc_dai_get_dma_data(dai, substream);
+
+ /* Working copies of register */
+ iismod = readl(s3c24xx_i2s.regs + S3C2410_IISMOD);
+@@ -251,11 +237,11 @@ static int s3c24xx_i2s_hw_params(struct snd_pcm_substream *substream,
+ switch (params_format(params)) {
+ case SNDRV_PCM_FORMAT_S8:
+ iismod &= ~S3C2410_IISMOD_16BIT;
+- dma_data->dma_size = 1;
++ dma_data->addr_width = 1;
+ break;
+ case SNDRV_PCM_FORMAT_S16_LE:
+ iismod |= S3C2410_IISMOD_16BIT;
+- dma_data->dma_size = 2;
++ dma_data->addr_width = 2;
+ break;
+ default:
+ return -EINVAL;
+@@ -270,8 +256,6 @@ static int s3c24xx_i2s_trigger(struct snd_pcm_substream *substream, int cmd,
+ struct snd_soc_dai *dai)
+ {
+ int ret = 0;
+- struct s3c_dma_params *dma_data =
+- snd_soc_dai_get_dma_data(dai, substream);
+
+ pr_debug("Entered %s\n", __func__);
+
+@@ -290,7 +274,6 @@ static int s3c24xx_i2s_trigger(struct snd_pcm_substream *substream, int cmd,
+ else
+ s3c24xx_snd_txctrl(1);
+
+- s3c2410_dma_ctrl(dma_data->channel, S3C2410_DMAOP_STARTED);
+ break;
+ case SNDRV_PCM_TRIGGER_STOP:
+ case SNDRV_PCM_TRIGGER_SUSPEND:
+@@ -380,14 +363,12 @@ static int s3c24xx_i2s_probe(struct snd_soc_dai *dai)
+ {
+ pr_debug("Entered %s\n", __func__);
+
+- s3c24xx_i2s.regs = ioremap(S3C2410_PA_IIS, 0x100);
+- if (s3c24xx_i2s.regs == NULL)
+- return -ENXIO;
++ samsung_asoc_init_dma_data(dai, &s3c24xx_i2s_pcm_stereo_out,
++ &s3c24xx_i2s_pcm_stereo_in);
+
+- s3c24xx_i2s.iis_clk = clk_get(dai->dev, "iis");
++ s3c24xx_i2s.iis_clk = devm_clk_get(dai->dev, "iis");
+ if (IS_ERR(s3c24xx_i2s.iis_clk)) {
+ pr_err("failed to get iis_clock\n");
+- iounmap(s3c24xx_i2s.regs);
+ return PTR_ERR(s3c24xx_i2s.iis_clk);
+ }
+ clk_enable(s3c24xx_i2s.iis_clk);
+@@ -474,6 +455,33 @@ static const struct snd_soc_component_driver s3c24xx_i2s_component = {
+ static int s3c24xx_iis_dev_probe(struct platform_device *pdev)
+ {
+ int ret = 0;
++ struct resource *res;
++
++ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++ if (!res) {
++ dev_err(&pdev->dev, "Can't get IO resource.\n");
++ return -ENOENT;
++ }
++ s3c24xx_i2s.regs = devm_ioremap_resource(&pdev->dev, res);
++ if (s3c24xx_i2s.regs == NULL)
++ return -ENXIO;
++
++ s3c24xx_i2s_pcm_stereo_out.dma_addr = res->start + S3C2410_IISFIFO;
++ s3c24xx_i2s_pcm_stereo_in.dma_addr = res->start + S3C2410_IISFIFO;
++
++ res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
++ if (!res) {
++ dev_err(&pdev->dev, "Can't get DMA resource for playback.\n");
++ return -ENOENT;
++ }
++ s3c24xx_i2s_pcm_stereo_out.channel = res->start;
++
++ res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
++ if (!res) {
++ dev_err(&pdev->dev, "Can't get DMA resource for capture.\n");
++ return -ENOENT;
++ }
++ s3c24xx_i2s_pcm_stereo_in.channel = res->start;
+
+ ret = snd_soc_register_component(&pdev->dev, &s3c24xx_i2s_component,
+ &s3c24xx_i2s_dai, 1);
+--
+1.9.3
+
diff --git a/recipes-kernel/linux/linux-yocto-3.14/h1940/0017-ASoC-samsung-drop-support-for-legacy-S3C24XX-DMA-API.patch b/recipes-kernel/linux/linux-yocto-3.14/h1940/0017-ASoC-samsung-drop-support-for-legacy-S3C24XX-DMA-API.patch
new file mode 100644
index 0000000..8de8c21
--- /dev/null
+++ b/recipes-kernel/linux/linux-yocto-3.14/h1940/0017-ASoC-samsung-drop-support-for-legacy-S3C24XX-DMA-API.patch
@@ -0,0 +1,515 @@
+From b63f4747fb0f17d970b643bd648794d60fc15838 Mon Sep 17 00:00:00 2001
+From: Vasily Khoruzhick <anarsoul@gmail.com>
+Date: Mon, 19 May 2014 14:40:57 +0300
+Subject: [PATCH 17/17] ASoC: samsung: drop support for legacy S3C24XX DMA API
+
+Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
+---
+ sound/soc/samsung/Kconfig | 3 -
+ sound/soc/samsung/Makefile | 2 -
+ sound/soc/samsung/dma.c | 460 ---------------------------------------------
+ 3 files changed, 465 deletions(-)
+ delete mode 100644 sound/soc/samsung/dma.c
+
+diff --git a/sound/soc/samsung/Kconfig b/sound/soc/samsung/Kconfig
+index 022c7a4..bf4bb7b 100644
+--- a/sound/soc/samsung/Kconfig
++++ b/sound/soc/samsung/Kconfig
+@@ -13,9 +13,6 @@ config SND_SOC_SAMSUNG
+ config SND_S3C_DMA
+ tristate
+
+-config SND_S3C_DMA_LEGACY
+- tristate
+-
+ config SND_S3C24XX_I2S
+ tristate
+
+diff --git a/sound/soc/samsung/Makefile b/sound/soc/samsung/Makefile
+index 86715d8..bc02da0 100644
+--- a/sound/soc/samsung/Makefile
++++ b/sound/soc/samsung/Makefile
+@@ -1,6 +1,5 @@
+ # S3c24XX Platform Support
+ snd-soc-s3c-dma-objs := dmaengine.o
+-snd-soc-s3c-dma-legacy-objs := dma.o
+ snd-soc-idma-objs := idma.o
+ snd-soc-s3c24xx-i2s-objs := s3c24xx-i2s.o
+ snd-soc-s3c2412-i2s-objs := s3c2412-i2s.o
+@@ -11,7 +10,6 @@ snd-soc-pcm-objs := pcm.o
+ snd-soc-i2s-objs := i2s.o
+
+ obj-$(CONFIG_SND_S3C_DMA) += snd-soc-s3c-dma.o
+-obj-$(CONFIG_SND_S3C_DMA_LEGACY) += snd-soc-s3c-dma-legacy.o
+ obj-$(CONFIG_SND_S3C24XX_I2S) += snd-soc-s3c24xx-i2s.o
+ obj-$(CONFIG_SND_SAMSUNG_AC97) += snd-soc-ac97.o
+ obj-$(CONFIG_SND_S3C2412_SOC_I2S) += snd-soc-s3c2412-i2s.o
+diff --git a/sound/soc/samsung/dma.c b/sound/soc/samsung/dma.c
+deleted file mode 100644
+index dc09b71..0000000
+--- a/sound/soc/samsung/dma.c
++++ /dev/null
+@@ -1,460 +0,0 @@
+-/*
+- * dma.c -- ALSA Soc Audio Layer
+- *
+- * (c) 2006 Wolfson Microelectronics PLC.
+- * Graeme Gregory graeme.gregory@wolfsonmicro.com or linux@wolfsonmicro.com
+- *
+- * Copyright 2004-2005 Simtec Electronics
+- * http://armlinux.simtec.co.uk/
+- * Ben Dooks <ben@simtec.co.uk>
+- *
+- * This program is free software; you can redistribute it and/or modify it
+- * under the terms of the GNU General Public License as published by the
+- * Free Software Foundation; either version 2 of the License, or (at your
+- * option) any later version.
+- */
+-
+-#include <linux/slab.h>
+-#include <linux/dma-mapping.h>
+-#include <linux/module.h>
+-
+-#include <sound/soc.h>
+-#include <sound/pcm_params.h>
+-
+-#include <asm/dma.h>
+-#include <mach/hardware.h>
+-#include <mach/dma.h>
+-
+-#include "dma.h"
+-
+-#define ST_RUNNING (1<<0)
+-#define ST_OPENED (1<<1)
+-
+-static const struct snd_pcm_hardware dma_hardware = {
+- .info = SNDRV_PCM_INFO_INTERLEAVED |
+- SNDRV_PCM_INFO_BLOCK_TRANSFER |
+- SNDRV_PCM_INFO_MMAP |
+- SNDRV_PCM_INFO_MMAP_VALID,
+- .buffer_bytes_max = 128*1024,
+- .period_bytes_min = PAGE_SIZE,
+- .period_bytes_max = PAGE_SIZE*2,
+- .periods_min = 2,
+- .periods_max = 128,
+- .fifo_size = 32,
+-};
+-
+-struct runtime_data {
+- spinlock_t lock;
+- int state;
+- unsigned int dma_loaded;
+- unsigned int dma_period;
+- dma_addr_t dma_start;
+- dma_addr_t dma_pos;
+- dma_addr_t dma_end;
+- struct s3c_dma_params *params;
+-};
+-
+-static void audio_buffdone(void *data);
+-
+-/* dma_enqueue
+- *
+- * place a dma buffer onto the queue for the dma system
+- * to handle.
+- */
+-static void dma_enqueue(struct snd_pcm_substream *substream)
+-{
+- struct runtime_data *prtd = substream->runtime->private_data;
+- dma_addr_t pos = prtd->dma_pos;
+- unsigned int limit;
+- struct samsung_dma_prep dma_info;
+-
+- pr_debug("Entered %s\n", __func__);
+-
+- limit = (prtd->dma_end - prtd->dma_start) / prtd->dma_period;
+-
+- pr_debug("%s: loaded %d, limit %d\n",
+- __func__, prtd->dma_loaded, limit);
+-
+- dma_info.cap = (samsung_dma_has_circular() ? DMA_CYCLIC : DMA_SLAVE);
+- dma_info.direction =
+- (substream->stream == SNDRV_PCM_STREAM_PLAYBACK
+- ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM);
+- dma_info.fp = audio_buffdone;
+- dma_info.fp_param = substream;
+- dma_info.period = prtd->dma_period;
+- dma_info.len = prtd->dma_period*limit;
+-
+- if (dma_info.cap == DMA_CYCLIC) {
+- dma_info.buf = pos;
+- prtd->params->ops->prepare(prtd->params->ch, &dma_info);
+- prtd->dma_loaded += limit;
+- return;
+- }
+-
+- while (prtd->dma_loaded < limit) {
+- pr_debug("dma_loaded: %d\n", prtd->dma_loaded);
+-
+- if ((pos + dma_info.period) > prtd->dma_end) {
+- dma_info.period = prtd->dma_end - pos;
+- pr_debug("%s: corrected dma len %ld\n",
+- __func__, dma_info.period);
+- }
+-
+- dma_info.buf = pos;
+- prtd->params->ops->prepare(prtd->params->ch, &dma_info);
+-
+- prtd->dma_loaded++;
+- pos += prtd->dma_period;
+- if (pos >= prtd->dma_end)
+- pos = prtd->dma_start;
+- }
+-
+- prtd->dma_pos = pos;
+-}
+-
+-static void audio_buffdone(void *data)
+-{
+- struct snd_pcm_substream *substream = data;
+- struct runtime_data *prtd = substream->runtime->private_data;
+-
+- pr_debug("Entered %s\n", __func__);
+-
+- if (prtd->state & ST_RUNNING) {
+- prtd->dma_pos += prtd->dma_period;
+- if (prtd->dma_pos >= prtd->dma_end)
+- prtd->dma_pos = prtd->dma_start;
+-
+- if (substream)
+- snd_pcm_period_elapsed(substream);
+-
+- spin_lock(&prtd->lock);
+- if (!samsung_dma_has_circular()) {
+- prtd->dma_loaded--;
+- dma_enqueue(substream);
+- }
+- spin_unlock(&prtd->lock);
+- }
+-}
+-
+-static int dma_hw_params(struct snd_pcm_substream *substream,
+- struct snd_pcm_hw_params *params)
+-{
+- struct snd_pcm_runtime *runtime = substream->runtime;
+- struct runtime_data *prtd = runtime->private_data;
+- struct snd_soc_pcm_runtime *rtd = substream->private_data;
+- unsigned long totbytes = params_buffer_bytes(params);
+- struct s3c_dma_params *dma =
+- snd_soc_dai_get_dma_data(rtd->cpu_dai, substream);
+- struct samsung_dma_req req;
+- struct samsung_dma_config config;
+-
+- pr_debug("Entered %s\n", __func__);
+-
+- /* return if this is a bufferless transfer e.g.
+- * codec <--> BT codec or GSM modem -- lg FIXME */
+- if (!dma)
+- return 0;
+-
+- /* this may get called several times by oss emulation
+- * with different params -HW */
+- if (prtd->params == NULL) {
+- /* prepare DMA */
+- prtd->params = dma;
+-
+- pr_debug("params %p, client %p, channel %d\n", prtd->params,
+- prtd->params->client, prtd->params->channel);
+-
+- prtd->params->ops = samsung_dma_get_ops();
+-
+- req.cap = (samsung_dma_has_circular() ?
+- DMA_CYCLIC : DMA_SLAVE);
+- req.client = prtd->params->client;
+- config.direction =
+- (substream->stream == SNDRV_PCM_STREAM_PLAYBACK
+- ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM);
+- config.width = prtd->params->dma_size;
+- config.fifo = prtd->params->dma_addr;
+- prtd->params->ch = prtd->params->ops->request(
+- prtd->params->channel, &req, rtd->cpu_dai->dev,
+- prtd->params->ch_name);
+- if (!prtd->params->ch) {
+- pr_err("Failed to allocate DMA channel\n");
+- return -ENXIO;
+- }
+- prtd->params->ops->config(prtd->params->ch, &config);
+- }
+-
+- snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer);
+-
+- runtime->dma_bytes = totbytes;
+-
+- spin_lock_irq(&prtd->lock);
+- prtd->dma_loaded = 0;
+- prtd->dma_period = params_period_bytes(params);
+- prtd->dma_start = runtime->dma_addr;
+- prtd->dma_pos = prtd->dma_start;
+- prtd->dma_end = prtd->dma_start + totbytes;
+- spin_unlock_irq(&prtd->lock);
+-
+- return 0;
+-}
+-
+-static int dma_hw_free(struct snd_pcm_substream *substream)
+-{
+- struct runtime_data *prtd = substream->runtime->private_data;
+-
+- pr_debug("Entered %s\n", __func__);
+-
+- snd_pcm_set_runtime_buffer(substream, NULL);
+-
+- if (prtd->params) {
+- prtd->params->ops->flush(prtd->params->ch);
+- prtd->params->ops->release(prtd->params->ch,
+- prtd->params->client);
+- prtd->params = NULL;
+- }
+-
+- return 0;
+-}
+-
+-static int dma_prepare(struct snd_pcm_substream *substream)
+-{
+- struct runtime_data *prtd = substream->runtime->private_data;
+- int ret = 0;
+-
+- pr_debug("Entered %s\n", __func__);
+-
+- /* return if this is a bufferless transfer e.g.
+- * codec <--> BT codec or GSM modem -- lg FIXME */
+- if (!prtd->params)
+- return 0;
+-
+- /* flush the DMA channel */
+- prtd->params->ops->flush(prtd->params->ch);
+-
+- prtd->dma_loaded = 0;
+- prtd->dma_pos = prtd->dma_start;
+-
+- /* enqueue dma buffers */
+- dma_enqueue(substream);
+-
+- return ret;
+-}
+-
+-static int dma_trigger(struct snd_pcm_substream *substream, int cmd)
+-{
+- struct runtime_data *prtd = substream->runtime->private_data;
+- int ret = 0;
+-
+- pr_debug("Entered %s\n", __func__);
+-
+- spin_lock(&prtd->lock);
+-
+- switch (cmd) {
+- case SNDRV_PCM_TRIGGER_START:
+- prtd->state |= ST_RUNNING;
+- prtd->params->ops->trigger(prtd->params->ch);
+- break;
+-
+- case SNDRV_PCM_TRIGGER_STOP:
+- prtd->state &= ~ST_RUNNING;
+- prtd->params->ops->stop(prtd->params->ch);
+- break;
+-
+- default:
+- ret = -EINVAL;
+- break;
+- }
+-
+- spin_unlock(&prtd->lock);
+-
+- return ret;
+-}
+-
+-static snd_pcm_uframes_t
+-dma_pointer(struct snd_pcm_substream *substream)
+-{
+- struct snd_pcm_runtime *runtime = substream->runtime;
+- struct runtime_data *prtd = runtime->private_data;
+- unsigned long res;
+-
+- pr_debug("Entered %s\n", __func__);
+-
+- res = prtd->dma_pos - prtd->dma_start;
+-
+- pr_debug("Pointer offset: %lu\n", res);
+-
+- /* we seem to be getting the odd error from the pcm library due
+- * to out-of-bounds pointers. this is maybe due to the dma engine
+- * not having loaded the new values for the channel before being
+- * called... (todo - fix )
+- */
+-
+- if (res >= snd_pcm_lib_buffer_bytes(substream)) {
+- if (res == snd_pcm_lib_buffer_bytes(substream))
+- res = 0;
+- }
+-
+- return bytes_to_frames(substream->runtime, res);
+-}
+-
+-static int dma_open(struct snd_pcm_substream *substream)
+-{
+- struct snd_pcm_runtime *runtime = substream->runtime;
+- struct runtime_data *prtd;
+-
+- pr_debug("Entered %s\n", __func__);
+-
+- snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
+- snd_soc_set_runtime_hwparams(substream, &dma_hardware);
+-
+- prtd = kzalloc(sizeof(struct runtime_data), GFP_KERNEL);
+- if (prtd == NULL)
+- return -ENOMEM;
+-
+- spin_lock_init(&prtd->lock);
+-
+- runtime->private_data = prtd;
+- return 0;
+-}
+-
+-static int dma_close(struct snd_pcm_substream *substream)
+-{
+- struct snd_pcm_runtime *runtime = substream->runtime;
+- struct runtime_data *prtd = runtime->private_data;
+-
+- pr_debug("Entered %s\n", __func__);
+-
+- if (!prtd)
+- pr_debug("dma_close called with prtd == NULL\n");
+-
+- kfree(prtd);
+-
+- return 0;
+-}
+-
+-static int dma_mmap(struct snd_pcm_substream *substream,
+- struct vm_area_struct *vma)
+-{
+- struct snd_pcm_runtime *runtime = substream->runtime;
+-
+- pr_debug("Entered %s\n", __func__);
+-
+- return dma_mmap_writecombine(substream->pcm->card->dev, vma,
+- runtime->dma_area,
+- runtime->dma_addr,
+- runtime->dma_bytes);
+-}
+-
+-static struct snd_pcm_ops dma_ops = {
+- .open = dma_open,
+- .close = dma_close,
+- .ioctl = snd_pcm_lib_ioctl,
+- .hw_params = dma_hw_params,
+- .hw_free = dma_hw_free,
+- .prepare = dma_prepare,
+- .trigger = dma_trigger,
+- .pointer = dma_pointer,
+- .mmap = dma_mmap,
+-};
+-
+-static int preallocate_dma_buffer(struct snd_pcm *pcm, int stream)
+-{
+- struct snd_pcm_substream *substream = pcm->streams[stream].substream;
+- struct snd_dma_buffer *buf = &substream->dma_buffer;
+- size_t size = dma_hardware.buffer_bytes_max;
+-
+- pr_debug("Entered %s\n", __func__);
+-
+- buf->dev.type = SNDRV_DMA_TYPE_DEV;
+- buf->dev.dev = pcm->card->dev;
+- buf->private_data = NULL;
+- buf->area = dma_alloc_writecombine(pcm->card->dev, size,
+- &buf->addr, GFP_KERNEL);
+- if (!buf->area)
+- return -ENOMEM;
+- buf->bytes = size;
+- return 0;
+-}
+-
+-static void dma_free_dma_buffers(struct snd_pcm *pcm)
+-{
+- struct snd_pcm_substream *substream;
+- struct snd_dma_buffer *buf;
+- int stream;
+-
+- pr_debug("Entered %s\n", __func__);
+-
+- for (stream = 0; stream < 2; stream++) {
+- substream = pcm->streams[stream].substream;
+- if (!substream)
+- continue;
+-
+- buf = &substream->dma_buffer;
+- if (!buf->area)
+- continue;
+-
+- dma_free_writecombine(pcm->card->dev, buf->bytes,
+- buf->area, buf->addr);
+- buf->area = NULL;
+- }
+-}
+-
+-static int dma_new(struct snd_soc_pcm_runtime *rtd)
+-{
+- struct snd_card *card = rtd->card->snd_card;
+- struct snd_pcm *pcm = rtd->pcm;
+- int ret;
+-
+- pr_debug("Entered %s\n", __func__);
+-
+- ret = dma_coerce_mask_and_coherent(card->dev, DMA_BIT_MASK(32));
+- if (ret)
+- return ret;
+-
+- if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream) {
+- ret = preallocate_dma_buffer(pcm,
+- SNDRV_PCM_STREAM_PLAYBACK);
+- if (ret)
+- goto out;
+- }
+-
+- if (pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream) {
+- ret = preallocate_dma_buffer(pcm,
+- SNDRV_PCM_STREAM_CAPTURE);
+- if (ret)
+- goto out;
+- }
+-out:
+- return ret;
+-}
+-
+-static struct snd_soc_platform_driver samsung_asoc_platform = {
+- .ops = &dma_ops,
+- .pcm_new = dma_new,
+- .pcm_free = dma_free_dma_buffers,
+-};
+-
+-void samsung_asoc_init_dma_data(struct snd_soc_dai *dai,
+- struct s3c_dma_params *playback,
+- struct s3c_dma_params *capture)
+-{
+- snd_soc_dai_init_dma_data(dai, playback, capture);
+-}
+-EXPORT_SYMBOL_GPL(samsung_asoc_init_dma_data);
+-
+-int samsung_asoc_dma_platform_register(struct device *dev)
+-{
+- return snd_soc_register_platform(dev, &samsung_asoc_platform);
+-}
+-EXPORT_SYMBOL_GPL(samsung_asoc_dma_platform_register);
+-
+-void samsung_asoc_dma_platform_unregister(struct device *dev)
+-{
+- snd_soc_unregister_platform(dev);
+-}
+-EXPORT_SYMBOL_GPL(samsung_asoc_dma_platform_unregister);
+-
+-MODULE_AUTHOR("Ben Dooks, <ben@simtec.co.uk>");
+-MODULE_DESCRIPTION("Samsung ASoC DMA Driver");
+-MODULE_LICENSE("GPL");
+--
+1.9.3
+
diff --git a/recipes-kernel/linux/linux-yocto-3.14/h1940/defconfig b/recipes-kernel/linux/linux-yocto-3.14/h1940/defconfig
new file mode 100644
index 0000000..de546c6
--- /dev/null
+++ b/recipes-kernel/linux/linux-yocto-3.14/h1940/defconfig
@@ -0,0 +1,200 @@
+CONFIG_LOCALVERSION="-yocto-standard"
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SYSVIPC=y
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=18
+CONFIG_CGROUPS=y
+CONFIG_CGROUP_DEBUG=y
+CONFIG_CGROUP_FREEZER=y
+CONFIG_CGROUP_DEVICE=y
+CONFIG_CPUSETS=y
+CONFIG_CGROUP_CPUACCT=y
+CONFIG_RESOURCE_COUNTERS=y
+CONFIG_MEMCG=y
+CONFIG_MEMCG_SWAP=y
+# CONFIG_MEMCG_SWAP_ENABLED is not set
+CONFIG_MEMCG_KMEM=y
+CONFIG_CGROUP_SCHED=y
+CONFIG_BLK_CGROUP=y
+# CONFIG_UTS_NS is not set
+# CONFIG_IPC_NS is not set
+# CONFIG_PID_NS is not set
+# CONFIG_NET_NS is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+# CONFIG_COMPAT_BRK is not set
+CONFIG_SLAB=y
+CONFIG_MODULES=y
+CONFIG_MODULE_FORCE_LOAD=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+# CONFIG_BLK_DEV_BSG is not set
+CONFIG_PARTITION_ADVANCED=y
+CONFIG_BSD_DISKLABEL=y
+# CONFIG_EFI_PARTITION is not set
+# CONFIG_IOSCHED_DEADLINE is not set
+# CONFIG_IOSCHED_CFQ is not set
+CONFIG_ARCH_S3C24XX=y
+CONFIG_S3C_LOWLEVEL_UART_PORT=1
+CONFIG_SAMSUNG_GPIO_EXTRA=16
+CONFIG_S3C24XX_PWM=y
+CONFIG_CPU_S3C2442=y
+CONFIG_ARCH_H1940=y
+CONFIG_PREEMPT_VOLUNTARY=y
+CONFIG_AEABI=y
+# CONFIG_COMPACTION is not set
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CPU_IDLE=y
+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+CONFIG_APM_EMULATION=y
+CONFIG_NET=y
+CONFIG_PACKET=y
+CONFIG_UNIX=y
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_DHCP=y
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_LRO is not set
+# CONFIG_IPV6 is not set
+CONFIG_IRDA=m
+CONFIG_IRCOMM=m
+CONFIG_IRDA_CACHE_LAST_LSAP=y
+CONFIG_IRDA_FAST_RR=y
+CONFIG_IRTTY_SIR=m
+CONFIG_BT=m
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=m
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_H4=y
+CONFIG_BT_HCIUART_BCSP=y
+CONFIG_BT_HCIUART_ATH3K=y
+CONFIG_BT_HCIUART_LL=y
+CONFIG_CFG80211=m
+CONFIG_CFG80211_WEXT=y
+CONFIG_MAC80211=m
+CONFIG_RFKILL=m
+CONFIG_RFKILL_GPIO=m
+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
+# CONFIG_FIRMWARE_IN_KERNEL is not set
+CONFIG_MTD=y
+CONFIG_MTD_CMDLINE_PARTS=y
+CONFIG_MTD_BLOCK=y
+CONFIG_MTD_CFI=y
+CONFIG_MTD_JEDECPROBE=y
+CONFIG_MTD_CFI_INTELEXT=y
+CONFIG_MTD_CFI_AMDSTD=y
+CONFIG_MTD_ROM=y
+CONFIG_MTD_NAND=y
+CONFIG_MTD_NAND_S3C2410=y
+CONFIG_MTD_NAND_S3C2410_HWECC=y
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=1
+CONFIG_BLK_DEV_RAM_SIZE=8192
+CONFIG_NETDEVICES=y
+# CONFIG_ETHERNET is not set
+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=240
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=320
+CONFIG_INPUT_EVDEV=y
+# CONFIG_KEYBOARD_ATKBD is not set
+CONFIG_KEYBOARD_GPIO=y
+# CONFIG_INPUT_MOUSE is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+CONFIG_TOUCHSCREEN_S3C2410=y
+# CONFIG_LEGACY_PTYS is not set
+CONFIG_SERIAL_SAMSUNG=y
+CONFIG_SERIAL_SAMSUNG_CONSOLE=y
+# CONFIG_HW_RANDOM is not set
+CONFIG_I2C=y
+# CONFIG_I2C_COMPAT is not set
+CONFIG_I2C_CHARDEV=m
+CONFIG_I2C_S3C2410=m
+CONFIG_GPIO_SYSFS=y
+CONFIG_POWER_SUPPLY=y
+CONFIG_PDA_POWER=y
+CONFIG_APM_POWER=y
+CONFIG_BATTERY_S3C_ADC=y
+# CONFIG_HWMON is not set
+CONFIG_WATCHDOG=y
+CONFIG_S3C2410_WATCHDOG=y
+CONFIG_FB=y
+CONFIG_FB_S3C2410=y
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_LCD_PLATFORM=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+# CONFIG_BACKLIGHT_GENERIC is not set
+CONFIG_BACKLIGHT_PWM=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_SOUND=m
+# CONFIG_SOUND_OSS_CORE_PRECLAIM is not set
+CONFIG_SND=m
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+# CONFIG_SND_DRIVERS is not set
+# CONFIG_SND_ARM is not set
+CONFIG_SND_SOC=m
+CONFIG_SND_SOC_SAMSUNG=m
+CONFIG_SND_SOC_SAMSUNG_H1940_UDA1380=m
+CONFIG_USB_GADGET=y
+CONFIG_USB_GADGET_VBUS_DRAW=250
+CONFIG_USB_S3C2410=y
+CONFIG_USB_ETH=y
+CONFIG_MMC=y
+CONFIG_MMC_UNSAFE_RESUME=y
+CONFIG_MMC_S3C=y
+CONFIG_MMC_S3C_DMA=y
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+CONFIG_LEDS_GPIO=y
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_RTC_CLASS=y
+# CONFIG_RTC_INTF_PROC is not set
+CONFIG_RTC_DRV_S3C=y
+CONFIG_DMADEVICES=y
+CONFIG_S3C24XX_DMAC=y
+CONFIG_STAGING=y
+# CONFIG_IOMMU_SUPPORT is not set
+CONFIG_EXT2_FS=y
+CONFIG_EXT3_FS=m
+# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
+CONFIG_FUSE_FS=m
+CONFIG_VFAT_FS=y
+CONFIG_FAT_DEFAULT_CODEPAGE=866
+CONFIG_FAT_DEFAULT_IOCHARSET="utf8"
+CONFIG_TMPFS=y
+CONFIG_NFS_FS=y
+CONFIG_NFS_V4=y
+CONFIG_ROOT_NFS=y
+CONFIG_NLS_DEFAULT="utf8"
+CONFIG_NLS_CODEPAGE_866=y
+CONFIG_NLS_CODEPAGE_1251=y
+CONFIG_NLS_UTF8=y
+CONFIG_DEBUG_FS=y
+CONFIG_MAGIC_SYSRQ=y
+CONFIG_DEBUG_USER=y
+CONFIG_CRYPTO_CBC=y
+CONFIG_CRYPTO_ECB=y
+CONFIG_CRYPTO_MD5=y
+CONFIG_CRYPTO_MICHAEL_MIC=y
+CONFIG_CRYPTO_ARC4=y
+CONFIG_CRYPTO_DES=y
+CONFIG_CRYPTO_ANSI_CPRNG=y
+CONFIG_CRC_CCITT=y
+CONFIG_CRC16=y
+CONFIG_XZ_DEC_X86=y
+CONFIG_XZ_DEC_POWERPC=y
+CONFIG_XZ_DEC_IA64=y
+CONFIG_XZ_DEC_SPARC=y
+CONFIG_FONTS=y
+CONFIG_FONT_MINI_4x6=y
diff --git a/recipes-kernel/linux/linux-yocto_3.14.bbappend b/recipes-kernel/linux/linux-yocto_3.14.bbappend
index 335fe27..12f910a 100644
--- a/recipes-kernel/linux/linux-yocto_3.14.bbappend
+++ b/recipes-kernel/linux/linux-yocto_3.14.bbappend
@@ -1,11 +1,12 @@
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}-3.14:${THISDIR}/${PN}:"
# Declare more compatible machines
-COMPATIBLE_MACHINE .= "|akita|c7x0|collie|h3600|hx4700|poodle|spitz|tosa"
+COMPATIBLE_MACHINE .= "|akita|c7x0|collie|h1940|h3600|hx4700|poodle|spitz|tosa"
KERNEL_EXTRA_FEATURES_akita ?= ""
KERNEL_EXTRA_FEATURES_c7x0 ?= ""
KERNEL_EXTRA_FEATURES_collie ?= ""
+KERNEL_EXTRA_FEATURES_h1940 ?= ""
KERNEL_EXTRA_FEATURES_h3600 ?= ""
KERNEL_EXTRA_FEATURES_hx4700 ?= ""
KERNEL_EXTRA_FEATURES_poodle ?= ""
@@ -15,6 +16,7 @@ KERNEL_EXTRA_FEATURES_tosa ?= ""
KMACHINE_akita = "akita"
KMACHINE_c7x0 = "c7x0"
KMACHINE_collie = "collie"
+KMACHINE_h1940 = "h1940"
KMACHINE_h3600 = "h3600"
KMACHINE_hx4700 = "hx4700"
KMACHINE_poodle = "poodle"
@@ -26,6 +28,7 @@ KMACHINE_tosa = "tosa"
KCONFIG_MODE_akita = "--alldefconfig"
KCONFIG_MODE_c7x0 = "--alldefconfig"
KCONFIG_MODE_collie = "--alldefconfig"
+KCONFIG_MODE_h1940 = "--alldefconfig"
KCONFIG_MODE_h3600 = "--alldefconfig"
KCONFIG_MODE_hx4700 = "--alldefconfig"
KCONFIG_MODE_poodle = "--alldefconfig"
@@ -69,6 +72,28 @@ SRC_URI_append_collie = " \
\
"
+SRC_URI_append_h1940 = " \
+ file://defconfig \
+ file://OE-qvga-logo.patch \
+ file://0001-rfkill-add-IR-type.patch \
+ file://0002-ARM-s3c24xx-Remove-S3C24XX_DMA-dependency-from-S3C24.patch \
+ file://0003-ARM-s3c24xx-add-dma_coherent_mask-for-DMA-devices.patch \
+ file://0004-ARM-s3c24xx-Add-DMA-resources-for-SDI-and-I2S.patch \
+ file://0005-ARM-s3c24xx-drop-RFKILL-driver-for-H1940-bluetooth.patch \
+ file://0006-ARM-s3c24xx-h1940-Add-nand-device.patch \
+ file://0007-ARM-s3c24xx-h1940-don-t-touch-UPLLCON.patch \
+ file://0008-ARM-s3c24xx-h1940-unlock-reset-button.patch \
+ file://0009-ARM-s3c24xx-h1940-add-bluetooth-RF-kill-switch.patch \
+ file://0010-ARM-s3c24xx-h1940-add-IR-switch.patch \
+ file://0011-ARM-s3c24xx-h1940-increase-oversampling-shift.patch \
+ file://0012-ARM-s3c24xx-h1940-Add-DMA-device.patch \
+ file://0013-dmaengine-s3c24xx-dma-Process-whole-SG-chain.patch \
+ file://0014-dmaengine-s3c24xx-dma-Add-cyclic-transfer-support.patch \
+ file://0015-s3cmci-port-DMA-code-to-dmaengine-API.patch \
+ file://0016-ASoC-samsung-s3c24-xx-12-i2s-port-to-use-generic-dma.patch \
+ file://0017-ASoC-samsung-drop-support-for-legacy-S3C24XX-DMA-API.patch \
+ "
+
SRC_URI_append_h3600 = " \
file://defconfig \
file://OE-qvga-logo.patch \