Patchwork [meta-fsl-arm-extra,v4,2/3] cubox-i: add customized kernel

login
register
mail settings
Submitter dv
Date Jan. 27, 2014, 9:38 p.m.
Message ID <1390858694-24339-2-git-send-email-dv@pseudoterminal.org>
Download mbox | patch
Permalink /patch/65897/
State Changes Requested
Delegated to: Otavio Salvador
Headers show

Comments

dv - Jan. 27, 2014, 9:38 p.m.
This kernel is based on linux-imx 3.0.35, and adds patches for
CuBox-i and HummingBoard support

Signed-off-by: Carlos Rafael Giani <dv@pseudoterminal.org>
---
 ...fix-memset-related-crashes-caused-by-rece.patch | 259 +++++++++++++++
 .../0003-ARM-7670-1-fix-the-memset-fix.patch       |  87 +++++
 ...6-Fix-build-break-when-CONFIG_CLK_DEBUG-i.patch |  43 +++
 ...0005-ENGR00271359-Add-Multi-touch-support.patch |  98 ++++++
 .../0006-Add-support-for-DVI-monitors.patch        | 227 +++++++++++++
 ...6-board-mx6q_sabresd-Register-SDHC3-first.patch |  38 +++
 .../linux/linux-cubox-i-3.0.35/defconfig           | 366 +++++++++++++++++++++
 ...-Rename-mxcfb_epdc_kernel.h-to-mxc_epdc.h.patch | 143 ++++++++
 .../fix-install-breakage-for-fw-images.patch       |  32 ++
 .../mxc_hdmi-dont-require-cea-mode.patch           |  25 ++
 recipes-kernel/linux/linux-cubox-i_3.0.35.bb       |  23 ++
 11 files changed, 1341 insertions(+)
 create mode 100644 recipes-kernel/linux/linux-cubox-i-3.0.35/0002-ARM-7668-1-fix-memset-related-crashes-caused-by-rece.patch
 create mode 100644 recipes-kernel/linux/linux-cubox-i-3.0.35/0003-ARM-7670-1-fix-the-memset-fix.patch
 create mode 100644 recipes-kernel/linux/linux-cubox-i-3.0.35/0004-ENGR00271136-Fix-build-break-when-CONFIG_CLK_DEBUG-i.patch
 create mode 100644 recipes-kernel/linux/linux-cubox-i-3.0.35/0005-ENGR00271359-Add-Multi-touch-support.patch
 create mode 100644 recipes-kernel/linux/linux-cubox-i-3.0.35/0006-Add-support-for-DVI-monitors.patch
 create mode 100644 recipes-kernel/linux/linux-cubox-i-3.0.35/0007-ARM-mach-mx6-board-mx6q_sabresd-Register-SDHC3-first.patch
 create mode 100644 recipes-kernel/linux/linux-cubox-i-3.0.35/defconfig
 create mode 100644 recipes-kernel/linux/linux-cubox-i-3.0.35/epdc-Rename-mxcfb_epdc_kernel.h-to-mxc_epdc.h.patch
 create mode 100644 recipes-kernel/linux/linux-cubox-i-3.0.35/fix-install-breakage-for-fw-images.patch
 create mode 100644 recipes-kernel/linux/linux-cubox-i-3.0.35/mxc_hdmi-dont-require-cea-mode.patch
 create mode 100644 recipes-kernel/linux/linux-cubox-i_3.0.35.bb
Otavio Salvador - Jan. 28, 2014, 1:06 a.m.
Hello Carlos,

See the comments below ...

On Mon, Jan 27, 2014 at 7:38 PM, Carlos Rafael Giani
<dv@pseudoterminal.org> wrote:
> This kernel is based on linux-imx 3.0.35, and adds patches for
> CuBox-i and HummingBoard support
>
> Signed-off-by: Carlos Rafael Giani <dv@pseudoterminal.org>
> ---
>  ...fix-memset-related-crashes-caused-by-rece.patch | 259 +++++++++++++++
>  .../0003-ARM-7670-1-fix-the-memset-fix.patch       |  87 +++++
>  ...6-Fix-build-break-when-CONFIG_CLK_DEBUG-i.patch |  43 +++
>  ...0005-ENGR00271359-Add-Multi-touch-support.patch |  98 ++++++
>  .../0006-Add-support-for-DVI-monitors.patch        | 227 +++++++++++++
>  ...6-board-mx6q_sabresd-Register-SDHC3-first.patch |  38 +++
>  .../linux/linux-cubox-i-3.0.35/defconfig           | 366 +++++++++++++++++++++
>  ...-Rename-mxcfb_epdc_kernel.h-to-mxc_epdc.h.patch | 143 ++++++++
>  .../fix-install-breakage-for-fw-images.patch       |  32 ++
>  .../mxc_hdmi-dont-require-cea-mode.patch           |  25 ++
>  recipes-kernel/linux/linux-cubox-i_3.0.35.bb       |  23 ++
>  11 files changed, 1341 insertions(+)
>  create mode 100644 recipes-kernel/linux/linux-cubox-i-3.0.35/0002-ARM-7668-1-fix-memset-related-crashes-caused-by-rece.patch
>  create mode 100644 recipes-kernel/linux/linux-cubox-i-3.0.35/0003-ARM-7670-1-fix-the-memset-fix.patch
>  create mode 100644 recipes-kernel/linux/linux-cubox-i-3.0.35/0004-ENGR00271136-Fix-build-break-when-CONFIG_CLK_DEBUG-i.patch
>  create mode 100644 recipes-kernel/linux/linux-cubox-i-3.0.35/0005-ENGR00271359-Add-Multi-touch-support.patch
>  create mode 100644 recipes-kernel/linux/linux-cubox-i-3.0.35/0006-Add-support-for-DVI-monitors.patch
>  create mode 100644 recipes-kernel/linux/linux-cubox-i-3.0.35/0007-ARM-mach-mx6-board-mx6q_sabresd-Register-SDHC3-first.patch
>  create mode 100644 recipes-kernel/linux/linux-cubox-i-3.0.35/defconfig
>  create mode 100644 recipes-kernel/linux/linux-cubox-i-3.0.35/epdc-Rename-mxcfb_epdc_kernel.h-to-mxc_epdc.h.patch
>  create mode 100644 recipes-kernel/linux/linux-cubox-i-3.0.35/fix-install-breakage-for-fw-images.patch
>  create mode 100644 recipes-kernel/linux/linux-cubox-i-3.0.35/mxc_hdmi-dont-require-cea-mode.patch
>  create mode 100644 recipes-kernel/linux/linux-cubox-i_3.0.35.bb
>
> diff --git a/recipes-kernel/linux/linux-cubox-i-3.0.35/0002-ARM-7668-1-fix-memset-related-crashes-caused-by-rece.patch b/recipes-kernel/linux/linux-cubox-i-3.0.35/0002-ARM-7668-1-fix-memset-related-crashes-caused-by-rece.patch
> new file mode 100644
> index 0000000..4c31e74
> --- /dev/null
> +++ b/recipes-kernel/linux/linux-cubox-i-3.0.35/0002-ARM-7668-1-fix-memset-related-crashes-caused-by-rece.patch
> @@ -0,0 +1,259 @@
> +From 2235b85f1c76d98b5f1e160cbd0a61a84c15e125 Mon Sep 17 00:00:00 2001
> +From: Ivan Djelic <ivan.djelic@parrot.com>
> +Date: Wed, 6 Mar 2013 20:09:27 +0100
> +Subject: [PATCH] ARM: 7668/1: fix memset-related crashes caused by recent GCC
> + (4.7.2) optimizations
> +Organization: O.S. Systems Software LTDA.
> +
> +Recent GCC versions (e.g. GCC-4.7.2) perform optimizations based on
> +assumptions about the implementation of memset and similar functions.
> +The current ARM optimized memset code does not return the value of
> +its first argument, as is usually expected from standard implementations.
> +
> +For instance in the following function:
> +
> +void debug_mutex_lock_common(struct mutex *lock, struct mutex_waiter *waiter)
> +{
> +       memset(waiter, MUTEX_DEBUG_INIT, sizeof(*waiter));
> +       waiter->magic = waiter;
> +       INIT_LIST_HEAD(&waiter->list);
> +}
> +
> +compiled as:
> +
> +800554d0 <debug_mutex_lock_common>:
> +800554d0:       e92d4008        push    {r3, lr}
> +800554d4:       e1a00001        mov     r0, r1
> +800554d8:       e3a02010        mov     r2, #16 ; 0x10
> +800554dc:       e3a01011        mov     r1, #17 ; 0x11
> +800554e0:       eb04426e        bl      80165ea0 <memset>
> +800554e4:       e1a03000        mov     r3, r0
> +800554e8:       e583000c        str     r0, [r3, #12]
> +800554ec:       e5830000        str     r0, [r3]
> +800554f0:       e5830004        str     r0, [r3, #4]
> +800554f4:       e8bd8008        pop     {r3, pc}
> +
> +GCC assumes memset returns the value of pointer 'waiter' in register r0; causing
> +register/memory corruptions.
> +
> +This patch fixes the return value of the assembly version of memset.
> +It adds a 'mov' instruction and merges an additional load+store into
> +existing load/store instructions.
> +For ease of review, here is a breakdown of the patch into 4 simple steps:
> +
> +Step 1
> +======
> +Perform the following substitutions:
> +ip -> r8, then
> +r0 -> ip,
> +and insert 'mov ip, r0' as the first statement of the function.
> +At this point, we have a memset() implementation returning the proper result,
> +but corrupting r8 on some paths (the ones that were using ip).
> +
> +Step 2
> +======
> +Make sure r8 is saved and restored when (! CALGN(1)+0) == 1:
> +
> +save r8:
> +-       str     lr, [sp, #-4]!
> ++       stmfd   sp!, {r8, lr}
> +
> +and restore r8 on both exit paths:
> +-       ldmeqfd sp!, {pc}               @ Now <64 bytes to go.
> ++       ldmeqfd sp!, {r8, pc}           @ Now <64 bytes to go.
> +(...)
> +        tst     r2, #16
> +        stmneia ip!, {r1, r3, r8, lr}
> +-       ldr     lr, [sp], #4
> ++       ldmfd   sp!, {r8, lr}
> +
> +Step 3
> +======
> +Make sure r8 is saved and restored when (! CALGN(1)+0) == 0:
> +
> +save r8:
> +-       stmfd   sp!, {r4-r7, lr}
> ++       stmfd   sp!, {r4-r8, lr}
> +
> +and restore r8 on both exit paths:
> +        bgt     3b
> +-       ldmeqfd sp!, {r4-r7, pc}
> ++       ldmeqfd sp!, {r4-r8, pc}
> +(...)
> +        tst     r2, #16
> +        stmneia ip!, {r4-r7}
> +-       ldmfd   sp!, {r4-r7, lr}
> ++       ldmfd   sp!, {r4-r8, lr}
> +
> +Step 4
> +======
> +Rewrite register list "r4-r7, r8" as "r4-r8".
> +
> +Upstream-Status: Pending
> +
> +Signed-off-by: Ivan Djelic <ivan.djelic@parrot.com>
> +Reviewed-by: Nicolas Pitre <nico@linaro.org>
> +Signed-off-by: Dirk Behme <dirk.behme@gmail.com>
> +Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
> +(cherry picked from commit 455bd4c430b0c0a361f38e8658a0d6cb469942b5)
> +---
> + arch/arm/lib/memset.S | 85 ++++++++++++++++++++++++++-------------------------
> + 1 file changed, 44 insertions(+), 41 deletions(-)
> +
> +diff --git a/arch/arm/lib/memset.S b/arch/arm/lib/memset.S
> +index 650d592..d912e73 100644
> +--- a/arch/arm/lib/memset.S
> ++++ b/arch/arm/lib/memset.S
> +@@ -19,9 +19,9 @@
> + 1:    subs    r2, r2, #4              @ 1 do we have enough
> +       blt     5f                      @ 1 bytes to align with?
> +       cmp     r3, #2                  @ 1
> +-      strltb  r1, [r0], #1            @ 1
> +-      strleb  r1, [r0], #1            @ 1
> +-      strb    r1, [r0], #1            @ 1
> ++      strltb  r1, [ip], #1            @ 1
> ++      strleb  r1, [ip], #1            @ 1
> ++      strb    r1, [ip], #1            @ 1
> +       add     r2, r2, r3              @ 1 (r2 = r2 - (4 - r3))
> + /*
> +  * The pointer is now aligned and the length is adjusted.  Try doing the
> +@@ -29,10 +29,14 @@
> +  */
> +
> + ENTRY(memset)
> +-      ands    r3, r0, #3              @ 1 unaligned?
> ++/*
> ++ * Preserve the contents of r0 for the return value.
> ++ */
> ++      mov     ip, r0
> ++      ands    r3, ip, #3              @ 1 unaligned?
> +       bne     1b                      @ 1
> + /*
> +- * we know that the pointer in r0 is aligned to a word boundary.
> ++ * we know that the pointer in ip is aligned to a word boundary.
> +  */
> +       orr     r1, r1, r1, lsl #8
> +       orr     r1, r1, r1, lsl #16
> +@@ -43,29 +47,28 @@ ENTRY(memset)
> + #if ! CALGN(1)+0
> +
> + /*
> +- * We need an extra register for this loop - save the return address and
> +- * use the LR
> ++ * We need 2 extra registers for this loop - use r8 and the LR
> +  */
> +-      str     lr, [sp, #-4]!
> +-      mov     ip, r1
> ++      stmfd   sp!, {r8, lr}
> ++      mov     r8, r1
> +       mov     lr, r1
> +
> + 2:    subs    r2, r2, #64
> +-      stmgeia r0!, {r1, r3, ip, lr}   @ 64 bytes at a time.
> +-      stmgeia r0!, {r1, r3, ip, lr}
> +-      stmgeia r0!, {r1, r3, ip, lr}
> +-      stmgeia r0!, {r1, r3, ip, lr}
> ++      stmgeia ip!, {r1, r3, r8, lr}   @ 64 bytes at a time.
> ++      stmgeia ip!, {r1, r3, r8, lr}
> ++      stmgeia ip!, {r1, r3, r8, lr}
> ++      stmgeia ip!, {r1, r3, r8, lr}
> +       bgt     2b
> +-      ldmeqfd sp!, {pc}               @ Now <64 bytes to go.
> ++      ldmeqfd sp!, {r8, pc}           @ Now <64 bytes to go.
> + /*
> +  * No need to correct the count; we're only testing bits from now on
> +  */
> +       tst     r2, #32
> +-      stmneia r0!, {r1, r3, ip, lr}
> +-      stmneia r0!, {r1, r3, ip, lr}
> ++      stmneia ip!, {r1, r3, r8, lr}
> ++      stmneia ip!, {r1, r3, r8, lr}
> +       tst     r2, #16
> +-      stmneia r0!, {r1, r3, ip, lr}
> +-      ldr     lr, [sp], #4
> ++      stmneia ip!, {r1, r3, r8, lr}
> ++      ldmfd   sp!, {r8, lr}
> +
> + #else
> +
> +@@ -74,54 +77,54 @@ ENTRY(memset)
> +  * whole cache lines at once.
> +  */
> +
> +-      stmfd   sp!, {r4-r7, lr}
> ++      stmfd   sp!, {r4-r8, lr}
> +       mov     r4, r1
> +       mov     r5, r1
> +       mov     r6, r1
> +       mov     r7, r1
> +-      mov     ip, r1
> ++      mov     r8, r1
> +       mov     lr, r1
> +
> +       cmp     r2, #96
> +-      tstgt   r0, #31
> ++      tstgt   ip, #31
> +       ble     3f
> +
> +-      and     ip, r0, #31
> +-      rsb     ip, ip, #32
> +-      sub     r2, r2, ip
> +-      movs    ip, ip, lsl #(32 - 4)
> +-      stmcsia r0!, {r4, r5, r6, r7}
> +-      stmmiia r0!, {r4, r5}
> +-      tst     ip, #(1 << 30)
> +-      mov     ip, r1
> +-      strne   r1, [r0], #4
> ++      and     r8, ip, #31
> ++      rsb     r8, r8, #32
> ++      sub     r2, r2, r8
> ++      movs    r8, r8, lsl #(32 - 4)
> ++      stmcsia ip!, {r4, r5, r6, r7}
> ++      stmmiia ip!, {r4, r5}
> ++      tst     r8, #(1 << 30)
> ++      mov     r8, r1
> ++      strne   r1, [ip], #4
> +
> + 3:    subs    r2, r2, #64
> +-      stmgeia r0!, {r1, r3-r7, ip, lr}
> +-      stmgeia r0!, {r1, r3-r7, ip, lr}
> ++      stmgeia ip!, {r1, r3-r8, lr}
> ++      stmgeia ip!, {r1, r3-r8, lr}
> +       bgt     3b
> +-      ldmeqfd sp!, {r4-r7, pc}
> ++      ldmeqfd sp!, {r4-r8, pc}
> +
> +       tst     r2, #32
> +-      stmneia r0!, {r1, r3-r7, ip, lr}
> ++      stmneia ip!, {r1, r3-r8, lr}
> +       tst     r2, #16
> +-      stmneia r0!, {r4-r7}
> +-      ldmfd   sp!, {r4-r7, lr}
> ++      stmneia ip!, {r4-r7}
> ++      ldmfd   sp!, {r4-r8, lr}
> +
> + #endif
> +
> + 4:    tst     r2, #8
> +-      stmneia r0!, {r1, r3}
> ++      stmneia ip!, {r1, r3}
> +       tst     r2, #4
> +-      strne   r1, [r0], #4
> ++      strne   r1, [ip], #4
> + /*
> +  * When we get here, we've got less than 4 bytes to zero.  We
> +  * may have an unaligned pointer as well.
> +  */
> + 5:    tst     r2, #2
> +-      strneb  r1, [r0], #1
> +-      strneb  r1, [r0], #1
> ++      strneb  r1, [ip], #1
> ++      strneb  r1, [ip], #1
> +       tst     r2, #1
> +-      strneb  r1, [r0], #1
> ++      strneb  r1, [ip], #1
> +       mov     pc, lr
> + ENDPROC(memset)
> +--
> +1.8.4.rc3
> +
> diff --git a/recipes-kernel/linux/linux-cubox-i-3.0.35/0003-ARM-7670-1-fix-the-memset-fix.patch b/recipes-kernel/linux/linux-cubox-i-3.0.35/0003-ARM-7670-1-fix-the-memset-fix.patch
> new file mode 100644
> index 0000000..b8d6f53
> --- /dev/null
> +++ b/recipes-kernel/linux/linux-cubox-i-3.0.35/0003-ARM-7670-1-fix-the-memset-fix.patch
> @@ -0,0 +1,87 @@
> +From 2ba23fa6c4128febaaf57fe184420a7111caa237 Mon Sep 17 00:00:00 2001
> +From: Nicolas Pitre <nicolas.pitre@linaro.org>
> +Date: Tue, 12 Mar 2013 13:00:42 +0100
> +Subject: [PATCH] ARM: 7670/1: fix the memset fix
> +Organization: O.S. Systems Software LTDA.
> +
> +Commit 455bd4c430b0 ("ARM: 7668/1: fix memset-related crashes caused by
> +recent GCC (4.7.2) optimizations") attempted to fix a compliance issue
> +with the memset return value.  However the memset itself became broken
> +by that patch for misaligned pointers.
> +
> +This fixes the above by branching over the entry code from the
> +misaligned fixup code to avoid reloading the original pointer.
> +
> +Also, because the function entry alignment is wrong in the Thumb mode
> +compilation, that fixup code is moved to the end.
> +
> +While at it, the entry instructions are slightly reworked to help dual
> +issue pipelines.
> +
> +Upstream-Status: Pending
> +
> +Signed-off-by: Nicolas Pitre <nico@linaro.org>
> +Tested-by: Alexander Holler <holler@ahsoftware.de>
> +Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
> +(cherry picked from commit 418df63adac56841ef6b0f1fcf435bc64d4ed177)
> +---
> + arch/arm/lib/memset.S | 33 +++++++++++++--------------------
> + 1 file changed, 13 insertions(+), 20 deletions(-)
> +
> +diff --git a/arch/arm/lib/memset.S b/arch/arm/lib/memset.S
> +index d912e73..94b0650 100644
> +--- a/arch/arm/lib/memset.S
> ++++ b/arch/arm/lib/memset.S
> +@@ -14,31 +14,15 @@
> +
> +       .text
> +       .align  5
> +-      .word   0
> +-
> +-1:    subs    r2, r2, #4              @ 1 do we have enough
> +-      blt     5f                      @ 1 bytes to align with?
> +-      cmp     r3, #2                  @ 1
> +-      strltb  r1, [ip], #1            @ 1
> +-      strleb  r1, [ip], #1            @ 1
> +-      strb    r1, [ip], #1            @ 1
> +-      add     r2, r2, r3              @ 1 (r2 = r2 - (4 - r3))
> +-/*
> +- * The pointer is now aligned and the length is adjusted.  Try doing the
> +- * memset again.
> +- */
> +
> + ENTRY(memset)
> +-/*
> +- * Preserve the contents of r0 for the return value.
> +- */
> +-      mov     ip, r0
> +-      ands    r3, ip, #3              @ 1 unaligned?
> +-      bne     1b                      @ 1
> ++      ands    r3, r0, #3              @ 1 unaligned?
> ++      mov     ip, r0                  @ preserve r0 as return value
> ++      bne     6f                      @ 1
> + /*
> +  * we know that the pointer in ip is aligned to a word boundary.
> +  */
> +-      orr     r1, r1, r1, lsl #8
> ++1:    orr     r1, r1, r1, lsl #8
> +       orr     r1, r1, r1, lsl #16
> +       mov     r3, r1
> +       cmp     r2, #16
> +@@ -127,4 +111,13 @@ ENTRY(memset)
> +       tst     r2, #1
> +       strneb  r1, [ip], #1
> +       mov     pc, lr
> ++
> ++6:    subs    r2, r2, #4              @ 1 do we have enough
> ++      blt     5b                      @ 1 bytes to align with?
> ++      cmp     r3, #2                  @ 1
> ++      strltb  r1, [ip], #1            @ 1
> ++      strleb  r1, [ip], #1            @ 1
> ++      strb    r1, [ip], #1            @ 1
> ++      add     r2, r2, r3              @ 1 (r2 = r2 - (4 - r3))
> ++      b       1b
> + ENDPROC(memset)
> +--
> +1.8.4.rc3
> +
> diff --git a/recipes-kernel/linux/linux-cubox-i-3.0.35/0004-ENGR00271136-Fix-build-break-when-CONFIG_CLK_DEBUG-i.patch b/recipes-kernel/linux/linux-cubox-i-3.0.35/0004-ENGR00271136-Fix-build-break-when-CONFIG_CLK_DEBUG-i.patch
> new file mode 100644
> index 0000000..7316351
> --- /dev/null
> +++ b/recipes-kernel/linux/linux-cubox-i-3.0.35/0004-ENGR00271136-Fix-build-break-when-CONFIG_CLK_DEBUG-i.patch
> @@ -0,0 +1,43 @@
> +From d8601292ae25e0af47aa4486055221ab44113f0e Mon Sep 17 00:00:00 2001
> +From: Mahesh Mahadevan <Mahesh.Mahadevan@freescale.com>
> +Date: Mon, 15 Jul 2013 15:34:54 -0500
> +Subject: [PATCH] ENGR00271136 Fix build break when CONFIG_CLK_DEBUG is
> + disabled
> +Organization: O.S. Systems Software LTDA.
> +
> +clk structure member name is defined only when CONFIG_CLK_DEBUG is enabled.
> +Hence need to encapsulate the code with this config.
> +
> +Patch received from imx community:
> +https://community.freescale.com/thread/308482
> +
> +Upstream-Status: Pending
> +
> +Signed-off-by: xiongweihuang
> +Signed-off-by: Mahesh Mahadevan <Mahesh.Mahadevan@freescale.com>
> +---
> + arch/arm/plat-mxc/clock.c | 4 ++--
> + 1 file changed, 2 insertions(+), 2 deletions(-)
> +
> +diff --git a/arch/arm/plat-mxc/clock.c b/arch/arm/plat-mxc/clock.c
> +index 93347eb..1aa2664 100755
> +--- a/arch/arm/plat-mxc/clock.c
> ++++ b/arch/arm/plat-mxc/clock.c
> +@@ -58,12 +58,12 @@ static void __clk_disable(struct clk *clk)
> + {
> +       if (clk == NULL || IS_ERR(clk))
> +               return;
> +-
> ++#ifdef CONFIG_CLK_DEBUG
> +       if (!clk->usecount) {
> +               WARN(1, "clock enable/disable mismatch! clk  %s\n", clk->name);
> +               return;
> +       }
> +-
> ++#endif
> +       if (!(--clk->usecount)) {
> +               if (clk->disable)
> +                       clk->disable(clk);
> +--
> +1.8.4.rc3
> +
> diff --git a/recipes-kernel/linux/linux-cubox-i-3.0.35/0005-ENGR00271359-Add-Multi-touch-support.patch b/recipes-kernel/linux/linux-cubox-i-3.0.35/0005-ENGR00271359-Add-Multi-touch-support.patch
> new file mode 100644
> index 0000000..cb20198
> --- /dev/null
> +++ b/recipes-kernel/linux/linux-cubox-i-3.0.35/0005-ENGR00271359-Add-Multi-touch-support.patch
> @@ -0,0 +1,98 @@
> +From 538f4bb2f7a51f267395550a5be9f0ab2e426712 Mon Sep 17 00:00:00 2001
> +From: Erik Boto <erik.boto@pelagicore.com>
> +Date: Tue, 16 Jul 2013 12:06:05 -0500
> +Subject: [PATCH] ENGR00271359 Add Multi-touch support
> +Organization: O.S. Systems Software LTDA.
> +
> +The previous behavior of the driver did not work properly with Qt5
> +QtQuick multi touch-point gestures, due to how touch-points are
> +reported when removing a touch-point. My interpretation of the
> +available documentation [1] was that the driver should report all
> +touch-points between SYN_REPORTs, but it is not explicitly stated so.
> +I've found another mail-thread [2] where the creator of the protocol
> +states:
> +
> +"The protocol defines a generic way of sending a variable amount of
> +contacts. The contact count is obtained by counting the number of
> +non-empty finger packets between SYN_REPORT events."-Henrik Rydberg
> +
> +I think this verifies my assumption that all touch-points should be
> +reported between SYN_REPORTs, otherwise it can not be used to obtain
> +the count.
> +
> +[1] https://www.kernel.org/doc/Documentation/input/multi-touch-protocol.txt
> +[2] http://lists.x.org/archives/xorg-devel/2010-March/006466.html
> +
> +Upstream-Status: Pending
> +
> +Signed-off-by: Erik Boto <erik.boto@pelagicore.com>
> +Signed-off-by: Mahesh Mahadevan <Mahesh.Mahadevan@freescale.com>
> +(cherry picked from commit 7cba001c5a502680f6dbf902821726779a9c9287)
> +---
> + drivers/input/touchscreen/egalax_ts.c | 36 +++++++++++++++++------------------
> + 1 file changed, 18 insertions(+), 18 deletions(-)
> +
> +diff --git a/drivers/input/touchscreen/egalax_ts.c b/drivers/input/touchscreen/egalax_ts.c
> +index 0b6cde7..271f820 100644
> +--- a/drivers/input/touchscreen/egalax_ts.c
> ++++ b/drivers/input/touchscreen/egalax_ts.c
> +@@ -133,7 +133,6 @@ retry:
> +       }
> +
> +       if (down) {
> +-              /* should also report old pointers */
> +               events[id].valid = valid;
> +               events[id].status = down;
> +               events[id].x = x;
> +@@ -144,23 +143,6 @@ retry:
> +               input_report_abs(input_dev, ABS_Y, y);
> +               input_event(data->input_dev, EV_KEY, BTN_TOUCH, 1);
> +               input_report_abs(input_dev, ABS_PRESSURE, 1);
> +-#else
> +-              for (i = 0; i < MAX_SUPPORT_POINTS; i++) {
> +-                      if (!events[i].valid)
> +-                              continue;
> +-                      dev_dbg(&client->dev, "report id:%d valid:%d x:%d y:%d",
> +-                              i, valid, x, y);
> +-
> +-                      input_report_abs(input_dev,
> +-                                       ABS_MT_TRACKING_ID, i);
> +-                      input_report_abs(input_dev,
> +-                                       ABS_MT_TOUCH_MAJOR, 1);
> +-                      input_report_abs(input_dev,
> +-                                       ABS_MT_POSITION_X, events[i].x);
> +-                      input_report_abs(input_dev,
> +-                                       ABS_MT_POSITION_Y, events[i].y);
> +-                      input_mt_sync(input_dev);
> +-              }
> + #endif
> +       } else {
> +               dev_dbg(&client->dev, "release id:%d\n", id);
> +@@ -176,6 +158,24 @@ retry:
> + #endif
> +       }
> +
> ++#ifndef CONFIG_TOUCHSCREEN_EGALAX_SINGLE_TOUCH
> ++      /* report all pointers */
> ++      for (i = 0; i < MAX_SUPPORT_POINTS; i++) {
> ++              if (!events[i].valid)
> ++                      continue;
> ++              dev_dbg(&client->dev, "report id:%d valid:%d x:%d y:%d",
> ++                      i, valid, x, y);
> ++                      input_report_abs(input_dev,
> ++                               ABS_MT_TRACKING_ID, i);
> ++              input_report_abs(input_dev,
> ++                               ABS_MT_TOUCH_MAJOR, 1);
> ++              input_report_abs(input_dev,
> ++                               ABS_MT_POSITION_X, events[i].x);
> ++              input_report_abs(input_dev,
> ++                               ABS_MT_POSITION_Y, events[i].y);
> ++              input_mt_sync(input_dev);
> ++      }
> ++#endif
> +       input_sync(input_dev);
> +       return IRQ_HANDLED;
> + }
> +--
> +1.8.4.rc3
> +
> diff --git a/recipes-kernel/linux/linux-cubox-i-3.0.35/0006-Add-support-for-DVI-monitors.patch b/recipes-kernel/linux/linux-cubox-i-3.0.35/0006-Add-support-for-DVI-monitors.patch
> new file mode 100644
> index 0000000..00a6b5c
> --- /dev/null
> +++ b/recipes-kernel/linux/linux-cubox-i-3.0.35/0006-Add-support-for-DVI-monitors.patch
> @@ -0,0 +1,227 @@
> +From 3e6441d113f72b412081a2c87f39011e4c253a35 Mon Sep 17 00:00:00 2001
> +From: Robert Winkler <robert.winkler@boundarydevices.com>
> +Date: Fri, 19 Jul 2013 19:00:41 -0700
> +Subject: [PATCH] Add support for DVI monitors
> +Organization: O.S. Systems Software LTDA.
> +
> +Upstream-Status: Pending
> +
> +Signed-off-by: Robert Winkler <robert.winkler@boundarydevices.com>
> +---
> + arch/arm/plat-mxc/include/mach/mxc_hdmi.h |  7 +++
> + drivers/video/mxc_hdmi.c                  | 98 +++++++++++++------------------
> + 2 files changed, 49 insertions(+), 56 deletions(-)
> +
> +diff --git a/arch/arm/plat-mxc/include/mach/mxc_hdmi.h b/arch/arm/plat-mxc/include/mach/mxc_hdmi.h
> +index 94f7638..af59c62 100644
> +--- a/arch/arm/plat-mxc/include/mach/mxc_hdmi.h
> ++++ b/arch/arm/plat-mxc/include/mach/mxc_hdmi.h
> +@@ -605,6 +605,10 @@ enum {
> +       HDMI_IH_MUTE_PHY_STAT0_TX_PHY_LOCK = 0x2,
> +       HDMI_IH_MUTE_PHY_STAT0_HPD = 0x1,
> +
> ++/* IH and IH_MUTE convenience macro RX_SENSE | HPD*/
> ++      HDMI_DVI_IH_STAT = 0x3D,
> ++
> ++
> + /* IH_AHBDMAAUD_STAT0 field values */
> +       HDMI_IH_AHBDMAAUD_STAT0_ERROR = 0x20,
> +       HDMI_IH_AHBDMAAUD_STAT0_LOST = 0x10,
> +@@ -903,6 +907,9 @@ enum {
> +       HDMI_PHY_HPD = 0x02,
> +       HDMI_PHY_TX_PHY_LOCK = 0x01,
> +
> ++/* HDMI STAT convenience RX_SENSE | HPD */
> ++      HDMI_DVI_STAT = 0xF2,
> ++
> + /* PHY_I2CM_SLAVE_ADDR field values */
> +       HDMI_PHY_I2CM_SLAVE_ADDR_PHY_GEN2 = 0x69,
> +       HDMI_PHY_I2CM_SLAVE_ADDR_HEAC_PHY = 0x49,
> +diff --git a/drivers/video/mxc_hdmi.c b/drivers/video/mxc_hdmi.c
> +index c5069aa..544f352 100644
> +--- a/drivers/video/mxc_hdmi.c
> ++++ b/drivers/video/mxc_hdmi.c
> +@@ -180,7 +180,6 @@ struct mxc_hdmi {
> +       bool dft_mode_set;
> +       char *dft_mode_str;
> +       int default_bpp;
> +-      u8 latest_intr_stat;
> +       bool irq_enabled;
> +       spinlock_t irq_lock;
> +       bool phy_enabled;
> +@@ -1996,58 +1995,48 @@ static void hotplug_worker(struct work_struct *work)
> +       struct delayed_work *delay_work = to_delayed_work(work);
> +       struct mxc_hdmi *hdmi =
> +               container_of(delay_work, struct mxc_hdmi, hotplug_work);
> +-      u32 phy_int_stat, phy_int_pol, phy_int_mask;
> +-      u8 val;
> ++      u32 hdmi_phy_stat0, hdmi_phy_pol0, hdmi_phy_mask0;
> +       unsigned long flags;
> +       char event_string[32];
> +       char *envp[] = { event_string, NULL };
> +
> +-      phy_int_stat = hdmi->latest_intr_stat;
> +-      phy_int_pol = hdmi_readb(HDMI_PHY_POL0);
> +
> +-      dev_dbg(&hdmi->pdev->dev, "phy_int_stat=0x%x, phy_int_pol=0x%x\n",
> +-                      phy_int_stat, phy_int_pol);
> ++      hdmi_phy_stat0 = hdmi_readb(HDMI_PHY_STAT0);
> ++      hdmi_phy_pol0 = hdmi_readb(HDMI_PHY_POL0);
> ++
> ++      dev_dbg(&hdmi->pdev->dev, "hdmi_phy_stat0=0x%x, hdmi_phy_pol0=0x%x\n",
> ++                      hdmi_phy_stat0, hdmi_phy_pol0);
> ++
> ++      /* Make HPD intr active low to capture unplug event or
> ++       * active high to capture plugin event */
> ++      hdmi_writeb((HDMI_DVI_STAT & ~hdmi_phy_stat0), HDMI_PHY_POL0);
> +
> +       /* check cable status */
> +-      if (phy_int_stat & HDMI_IH_PHY_STAT0_HPD) {
> +-              /* cable connection changes */
> +-              if (phy_int_pol & HDMI_PHY_HPD) {
> +-                      /* Plugin event */
> +-                      dev_dbg(&hdmi->pdev->dev, "EVENT=plugin\n");
> +-                      mxc_hdmi_cable_connected(hdmi);
> +-
> +-                      /* Make HPD intr active low to capture unplug event */
> +-                      val = hdmi_readb(HDMI_PHY_POL0);
> +-                      val &= ~HDMI_PHY_HPD;
> +-                      hdmi_writeb(val, HDMI_PHY_POL0);
> +-
> +-                      sprintf(event_string, "EVENT=plugin");
> +-                      kobject_uevent_env(&hdmi->pdev->dev.kobj, KOBJ_CHANGE, envp);
> ++      if (hdmi_phy_stat0 & HDMI_DVI_STAT) {
> ++              /* Plugin event */
> ++              dev_dbg(&hdmi->pdev->dev, "EVENT=plugin\n");
> ++              mxc_hdmi_cable_connected(hdmi);
> ++
> ++              sprintf(event_string, "EVENT=plugin");
> ++              kobject_uevent_env(&hdmi->pdev->dev.kobj, KOBJ_CHANGE, envp);
> + #ifdef CONFIG_MXC_HDMI_CEC
> +-                      mxc_hdmi_cec_handle(0x80);
> ++              mxc_hdmi_cec_handle(0x80);
> + #endif
> +-                      hdmi_set_cable_state(1);
> +-
> +-              } else if (!(phy_int_pol & HDMI_PHY_HPD)) {
> +-                      /* Plugout event */
> +-                      dev_dbg(&hdmi->pdev->dev, "EVENT=plugout\n");
> +-                      hdmi_set_cable_state(0);
> +-                      mxc_hdmi_abort_stream();
> +-                      mxc_hdmi_cable_disconnected(hdmi);
> ++              hdmi_set_cable_state(1);
> +
> +-                      /* Make HPD intr active high to capture plugin event */
> +-                      val = hdmi_readb(HDMI_PHY_POL0);
> +-                      val |= HDMI_PHY_HPD;
> +-                      hdmi_writeb(val, HDMI_PHY_POL0);
> ++      } else {
> ++              /* Plugout event */
> ++              dev_dbg(&hdmi->pdev->dev, "EVENT=plugout\n");
> ++              hdmi_set_cable_state(0);
> ++              mxc_hdmi_abort_stream();
> ++              mxc_hdmi_cable_disconnected(hdmi);
> +
> +-                      sprintf(event_string, "EVENT=plugout");
> +-                      kobject_uevent_env(&hdmi->pdev->dev.kobj, KOBJ_CHANGE, envp);
> ++              sprintf(event_string, "EVENT=plugout");
> ++              kobject_uevent_env(&hdmi->pdev->dev.kobj, KOBJ_CHANGE, envp);
> + #ifdef CONFIG_MXC_HDMI_CEC
> +-                      mxc_hdmi_cec_handle(0x100);
> ++              mxc_hdmi_cec_handle(0x100);
> + #endif
> +
> +-              } else
> +-                      dev_dbg(&hdmi->pdev->dev, "EVENT=none?\n");
> +       }
> +
> +       /* Lock here to ensure full powerdown sequence
> +@@ -2055,12 +2044,12 @@ static void hotplug_worker(struct work_struct *work)
> +       spin_lock_irqsave(&hdmi->irq_lock, flags);
> +
> +       /* Re-enable HPD interrupts */
> +-      phy_int_mask = hdmi_readb(HDMI_PHY_MASK0);
> +-      phy_int_mask &= ~HDMI_PHY_HPD;
> +-      hdmi_writeb(phy_int_mask, HDMI_PHY_MASK0);
> ++      hdmi_phy_mask0 = hdmi_readb(HDMI_PHY_MASK0);
> ++      hdmi_phy_mask0 &= ~HDMI_DVI_STAT;
> ++      hdmi_writeb(hdmi_phy_mask0, HDMI_PHY_MASK0);
> +
> +       /* Unmute interrupts */
> +-      hdmi_writeb(~HDMI_IH_MUTE_PHY_STAT0_HPD, HDMI_IH_MUTE_PHY_STAT0);
> ++      hdmi_writeb(~HDMI_DVI_IH_STAT, HDMI_IH_MUTE_PHY_STAT0);
> +
> +       if (hdmi_readb(HDMI_IH_FC_STAT2) & HDMI_IH_FC_STAT2_OVERFLOW_MASK)
> +               mxc_hdmi_clear_overflow();
> +@@ -2086,7 +2075,7 @@ static void hdcp_hdp_worker(struct work_struct *work)
> + static irqreturn_t mxc_hdmi_hotplug(int irq, void *data)
> + {
> +       struct mxc_hdmi *hdmi = data;
> +-      u8 val, intr_stat;
> ++      u8 val;
> +       unsigned long flags;
> +
> +       spin_lock_irqsave(&hdmi->irq_lock, flags);
> +@@ -2108,25 +2097,22 @@ static irqreturn_t mxc_hdmi_hotplug(int irq, void *data)
> +        * HDMI registers.
> +        */
> +       /* Capture status - used in hotplug_worker ISR */
> +-      intr_stat = hdmi_readb(HDMI_IH_PHY_STAT0);
> +-
> +-      if (intr_stat & HDMI_IH_PHY_STAT0_HPD) {
> ++      if (hdmi_readb(HDMI_IH_PHY_STAT0) & HDMI_DVI_IH_STAT) {
> +
> +               dev_dbg(&hdmi->pdev->dev, "Hotplug interrupt received\n");
> +-              hdmi->latest_intr_stat = intr_stat;
> +
> +               /* Mute interrupts until handled */
> +
> +               val = hdmi_readb(HDMI_IH_MUTE_PHY_STAT0);
> +-              val |= HDMI_IH_MUTE_PHY_STAT0_HPD;
> ++              val |= HDMI_DVI_IH_STAT;
> +               hdmi_writeb(val, HDMI_IH_MUTE_PHY_STAT0);
> +
> +               val = hdmi_readb(HDMI_PHY_MASK0);
> +-              val |= HDMI_PHY_HPD;
> ++              val |= HDMI_DVI_STAT;
> +               hdmi_writeb(val, HDMI_PHY_MASK0);
> +
> +               /* Clear Hotplug interrupts */
> +-              hdmi_writeb(HDMI_IH_PHY_STAT0_HPD, HDMI_IH_PHY_STAT0);
> ++              hdmi_writeb(HDMI_DVI_IH_STAT, HDMI_IH_PHY_STAT0);
> +
> +               schedule_delayed_work(&(hdmi->hotplug_work), msecs_to_jiffies(20));
> +       }
> +@@ -2282,13 +2268,13 @@ static void mxc_hdmi_fb_registered(struct mxc_hdmi *hdmi)
> +                   HDMI_PHY_I2CM_CTLINT_ADDR);
> +
> +       /* enable cable hot plug irq */
> +-      hdmi_writeb((u8)~HDMI_PHY_HPD, HDMI_PHY_MASK0);
> ++      hdmi_writeb((u8)~HDMI_DVI_STAT, HDMI_PHY_MASK0);
> +
> +       /* Clear Hotplug interrupts */
> +-      hdmi_writeb(HDMI_IH_PHY_STAT0_HPD, HDMI_IH_PHY_STAT0);
> ++      hdmi_writeb(HDMI_DVI_IH_STAT, HDMI_IH_PHY_STAT0);
> +
> +       /* Unmute interrupts */
> +-      hdmi_writeb(~HDMI_IH_MUTE_PHY_STAT0_HPD, HDMI_IH_MUTE_PHY_STAT0);
> ++      hdmi_writeb(~HDMI_DVI_IH_STAT, HDMI_IH_MUTE_PHY_STAT0);
> +
> +       hdmi->fb_reg = true;
> +
> +@@ -2522,10 +2508,10 @@ static int mxc_hdmi_disp_init(struct mxc_dispdrv_handle *disp,
> +
> +       /* Configure registers related to HDMI interrupt
> +        * generation before registering IRQ. */
> +-      hdmi_writeb(HDMI_PHY_HPD, HDMI_PHY_POL0);
> ++      hdmi_writeb(HDMI_DVI_STAT, HDMI_PHY_POL0);
> +
> +       /* Clear Hotplug interrupts */
> +-      hdmi_writeb(HDMI_IH_PHY_STAT0_HPD, HDMI_IH_PHY_STAT0);
> ++      hdmi_writeb(HDMI_DVI_IH_STAT, HDMI_IH_PHY_STAT0);
> +
> +       hdmi->nb.notifier_call = mxc_hdmi_fb_event;
> +       ret = fb_register_client(&hdmi->nb);
> +--
> +1.8.4.rc3
> +
> diff --git a/recipes-kernel/linux/linux-cubox-i-3.0.35/0007-ARM-mach-mx6-board-mx6q_sabresd-Register-SDHC3-first.patch b/recipes-kernel/linux/linux-cubox-i-3.0.35/0007-ARM-mach-mx6-board-mx6q_sabresd-Register-SDHC3-first.patch
> new file mode 100644
> index 0000000..d02aa40
> --- /dev/null
> +++ b/recipes-kernel/linux/linux-cubox-i-3.0.35/0007-ARM-mach-mx6-board-mx6q_sabresd-Register-SDHC3-first.patch
> @@ -0,0 +1,38 @@
> +From cd31abbe08372fa870fac78ae845edd4859f8835 Mon Sep 17 00:00:00 2001
> +From: Fabio Estevam <fabio.estevam@freescale.com>
> +Date: Sat, 28 Sep 2013 18:46:18 -0300
> +Subject: [PATCH] ARM: mach-mx6: board-mx6q_sabresd: Register SDHC3 first
> +Organization: O.S. Systems Software LTDA.
> +
> +On sabresd boards we boot from SDHC3, so let's register it as mmc0.
> +
> +Currently eMMC is mmc0 and mmc1 can be SDHC3 or SDHC2 (if present).
> +
> +Registering SDHC3 is safer as we can always find the rootfs.
> +
> +Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
> +---
> + arch/arm/mach-mx6/board-mx6q_sabresd.c | 5 +----
> + 1 file changed, 1 insertion(+), 4 deletions(-)
> +
> +diff --git a/arch/arm/mach-mx6/board-mx6q_sabresd.c b/arch/arm/mach-mx6/board-mx6q_sabresd.c
> +index 3f9a845..4e6b323 100644
> +--- a/arch/arm/mach-mx6/board-mx6q_sabresd.c
> ++++ b/arch/arm/mach-mx6/board-mx6q_sabresd.c
> +@@ -1847,12 +1847,9 @@ static void __init mx6_sabresd_board_init(void)
> +
> +       imx6q_add_pm_imx(0, &mx6q_sabresd_pm_data);
> +
> +-      /* Move sd4 to first because sd4 connect to emmc.
> +-         Mfgtools want emmc is mmcblk0 and other sd card is mmcblk1.
> +-      */
> ++      imx6q_add_sdhci_usdhc_imx(2, &mx6q_sabresd_sd3_data);
> +       imx6q_add_sdhci_usdhc_imx(3, &mx6q_sabresd_sd4_data);
> +       imx6q_add_sdhci_usdhc_imx(1, &mx6q_sabresd_sd2_data);
> +-      imx6q_add_sdhci_usdhc_imx(2, &mx6q_sabresd_sd3_data);
> +       imx_add_viv_gpu(&imx6_gpu_data, &imx6q_gpu_pdata);
> +       imx6q_sabresd_init_usb();
> +       /* SATA is not supported by MX6DL/Solo */
> +--
> +1.8.4.rc3
> +
> diff --git a/recipes-kernel/linux/linux-cubox-i-3.0.35/defconfig b/recipes-kernel/linux/linux-cubox-i-3.0.35/defconfig
> new file mode 100644
> index 0000000..bd0cef0
> --- /dev/null
> +++ b/recipes-kernel/linux/linux-cubox-i-3.0.35/defconfig
> @@ -0,0 +1,366 @@
> +CONFIG_EXPERIMENTAL=y
> +CONFIG_LOCALVERSION="-4.1.0+yocto"
> +CONFIG_SYSVIPC=y
> +CONFIG_IKCONFIG=y
> +CONFIG_IKCONFIG_PROC=y
> +CONFIG_LOG_BUF_SHIFT=14
> +CONFIG_CGROUPS=y
> +CONFIG_CGROUP_FREEZER=y
> +CONFIG_CGROUP_DEVICE=y
> +CONFIG_CGROUP_CPUACCT=y
> +CONFIG_CGROUP_PERF=y
> +CONFIG_CGROUP_SCHED=y
> +CONFIG_EMBEDDED=y
> +CONFIG_PERF_EVENTS=y
> +CONFIG_MODULES=y
> +CONFIG_MODULE_UNLOAD=y
> +CONFIG_MODULE_FORCE_UNLOAD=y
> +CONFIG_MODVERSIONS=y
> +# CONFIG_BLK_DEV_BSG is not set
> +CONFIG_ARCH_MXC=y
> +CONFIG_GPIO_PCA953X=y
> +CONFIG_ARCH_MX6=y
> +CONFIG_FORCE_MAX_ZONEORDER=14
> +CONFIG_MACH_MX6Q_ARM2=y
> +CONFIG_MACH_MX6Q_SABRELITE=y
> +CONFIG_MACH_MX6Q_SABRESD=y
> +CONFIG_MACH_MX6Q_SABREAUTO=y
> +CONFIG_MACH_MX6Q_HDMIDONGLE=y
> +CONFIG_MACH_C1=y
> +CONFIG_MACH_CUBOX_I=y
> +CONFIG_USB_EHCI_ARC_H1=y
> +CONFIG_USB_FSL_ARC_OTG=y
> +CONFIG_MXC_PWM=y
> +CONFIG_MXC_REBOOT_MFGMODE=y
> +CONFIG_CLK_DEBUG=y
> +CONFIG_DMA_ZONE_SIZE=184
> +# CONFIG_SWP_EMULATE is not set
> +CONFIG_ARM_ERRATA_743622=y
> +CONFIG_ARM_ERRATA_751472=y
> +CONFIG_ARM_ERRATA_754322=y
> +CONFIG_ARM_ERRATA_775420=y
> +CONFIG_ARM_ERRATA_764369=y
> +CONFIG_PL310_ERRATA_769419=y
> +CONFIG_NO_HZ=y
> +CONFIG_HIGH_RES_TIMERS=y
> +CONFIG_SMP=y
> +CONFIG_VMSPLIT_2G=y
> +CONFIG_PREEMPT=y
> +CONFIG_AEABI=y
> +# CONFIG_OABI_COMPAT is not set
> +CONFIG_HIGHMEM=y
> +CONFIG_COMPACTION=y
> +CONFIG_KSM=y
> +CONFIG_ZBOOT_ROM_TEXT=0x0
> +CONFIG_ZBOOT_ROM_BSS=0x0
> +CONFIG_CMDLINE="noinitrd console=ttymxc0,115200 root=/dev/mtdblock2 rw rootfstype=jffs2 ip=off"
> +CONFIG_CPU_FREQ=y
> +CONFIG_CPU_FREQ_DEFAULT_GOV_INTERACTIVE=y
> +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
> +CONFIG_CPU_FREQ_GOV_POWERSAVE=y
> +CONFIG_CPU_FREQ_GOV_USERSPACE=y
> +CONFIG_CPU_FREQ_GOV_ONDEMAND=y
> +CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
> +CONFIG_CPU_FREQ_IMX=y
> +CONFIG_VFP=y
> +CONFIG_NEON=y
> +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
> +CONFIG_SUSPEND_DEVICE_TIME_DEBUG=y
> +CONFIG_PM_RUNTIME=y
> +CONFIG_PM_DEBUG=y
> +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_IP_PNP_BOOTP=y
> +# CONFIG_INET_LRO is not set
> +# CONFIG_IPV6 is not set
> +CONFIG_LLC2=y
> +CONFIG_CAN=y
> +CONFIG_CAN_RAW=y
> +CONFIG_CAN_BCM=y
> +CONFIG_CAN_VCAN=y
> +CONFIG_CAN_FLEXCAN=y
> +CONFIG_BT=y
> +CONFIG_BT_L2CAP=y
> +CONFIG_BT_SCO=y
> +CONFIG_BT_RFCOMM=y
> +CONFIG_BT_RFCOMM_TTY=y
> +CONFIG_BT_BNEP=y
> +CONFIG_BT_BNEP_MC_FILTER=y
> +CONFIG_BT_BNEP_PROTO_FILTER=y
> +CONFIG_BT_HIDP=y
> +CONFIG_BT_HCIBTUSB=y
> +CONFIG_BT_HCIUART=y
> +CONFIG_BT_HCIUART_ATH3K=y
> +CONFIG_BT_HCIVHCI=y
> +CONFIG_CFG80211=y
> +CONFIG_RFKILL=y
> +CONFIG_RFKILL_INPUT=y
> +CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
> +CONFIG_DEVTMPFS=y
> +CONFIG_DEVTMPFS_MOUNT=y
> +CONFIG_CONNECTOR=y
> +CONFIG_MTD=y
> +CONFIG_MTD_CHAR=y
> +CONFIG_MTD_BLOCK=y
> +CONFIG_MTD_CFI=y
> +CONFIG_MTD_CFI_AMDSTD=y
> +CONFIG_MTD_PHYSMAP=y
> +CONFIG_MTD_M25P80=y
> +CONFIG_MTD_NAND=y
> +CONFIG_MTD_NAND_GPMI_NAND=y
> +CONFIG_MTD_UBI=y
> +CONFIG_BLK_DEV_LOOP=y
> +CONFIG_MISC_DEVICES=y
> +CONFIG_MXS_PERFMON=m
> +CONFIG_BLK_DEV_SD=y
> +CONFIG_SCSI_MULTI_LUN=y
> +CONFIG_ATA=y
> +# CONFIG_SATA_PMP is not set
> +CONFIG_SATA_AHCI_PLATFORM=y
> +CONFIG_NETDEVICES=y
> +CONFIG_MICREL_PHY=y
> +CONFIG_NET_ETHERNET=y
> +CONFIG_SMSC911X=y
> +CONFIG_FEC_NAPI=y
> +# CONFIG_NETDEV_1000 is not set
> +# CONFIG_NETDEV_10000 is not set
> +CONFIG_ATH_COMMON=m
> +CONFIG_ATH6KL=m
> +CONFIG_BRCMFMAC=y
> +CONFIG_HOSTAP=y
> +CONFIG_INPUT_POLLDEV=y
> +CONFIG_INPUT_EVDEV=y
> +CONFIG_KEYBOARD_GPIO=y
> +# CONFIG_INPUT_MOUSE is not set
> +CONFIG_INPUT_TOUCHSCREEN=y
> +CONFIG_TOUCHSCREEN_EGALAX=y
> +CONFIG_TOUCHSCREEN_ELAN=y
> +CONFIG_TOUCHSCREEN_MAX11801=y
> +CONFIG_INPUT_MISC=y
> +CONFIG_INPUT_UINPUT=y
> +CONFIG_INPUT_ISL29023=y
> +CONFIG_VT_HW_CONSOLE_BINDING=y
> +CONFIG_SERIAL_IMX=y
> +CONFIG_SERIAL_IMX_CONSOLE=y
> +CONFIG_FSL_OTP=y
> +CONFIG_HW_RANDOM=y
> +CONFIG_MXS_VIIM=y
> +CONFIG_I2C_CHARDEV=y
> +CONFIG_I2C_IMX=y
> +CONFIG_SPI=y
> +CONFIG_SPI_IMX=y
> +CONFIG_GPIO_SYSFS=y
> +CONFIG_SABRESD_MAX8903=y
> +CONFIG_SENSORS_MAX17135=y
> +CONFIG_SENSORS_MAG3110=y
> +# CONFIG_MXC_MMA8450 is not set
> +CONFIG_WATCHDOG=y
> +CONFIG_WATCHDOG_NOWAYOUT=y
> +CONFIG_IMX2_WDT=y
> +CONFIG_MFD_WM8994=y
> +CONFIG_MFD_PFUZE=y
> +CONFIG_MFD_MAX17135=y
> +CONFIG_REGULATOR=y
> +CONFIG_REGULATOR_FIXED_VOLTAGE=y
> +CONFIG_REGULATOR_PFUZE100=y
> +CONFIG_REGULATOR_MAX17135=y
> +CONFIG_MEDIA_SUPPORT=y
> +CONFIG_VIDEO_DEV=y
> +CONFIG_IR_GPIO_CIR=y
> +# CONFIG_MEDIA_TUNER_CUSTOMISE is not set
> +CONFIG_VIDEO_MXC_CAMERA=m
> +CONFIG_MXC_CAMERA_OV3640=m
> +CONFIG_MXC_CAMERA_OV5640=m
> +CONFIG_MXC_CAMERA_OV8820_MIPI=m
> +CONFIG_MXC_CAMERA_OV5642=m
> +CONFIG_MXC_TVIN_ADV7180=m
> +CONFIG_MXC_CAMERA_OV5640_MIPI=m
> +CONFIG_MXC_IPU_DEVICE_QUEUE_SDC=m
> +CONFIG_USB_VIDEO_CLASS=m
> +# CONFIG_RADIO_ADAPTERS is not set
> +CONFIG_DRM=y
> +CONFIG_DRM_VIVANTE=y
> +CONFIG_FB=y
> +CONFIG_BACKLIGHT_LCD_SUPPORT=y
> +# CONFIG_LCD_CLASS_DEVICE is not set
> +CONFIG_BACKLIGHT_CLASS_DEVICE=y
> +# CONFIG_BACKLIGHT_GENERIC is not set
> +CONFIG_BACKLIGHT_PWM=y
> +CONFIG_FB_MXC_LDB=y
> +CONFIG_FB_MXC_MIPI_DSI=y
> +CONFIG_FB_MXC_TRULY_WVGA_SYNC_PANEL=y
> +CONFIG_FB_MXC_EINK_PANEL=y
> +CONFIG_FB_MXC_HDMI=y
> +CONFIG_FRAMEBUFFER_CONSOLE=y
> +CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
> +CONFIG_FONTS=y
> +CONFIG_FONT_8x16=y
> +CONFIG_LOGO=y
> +CONFIG_SOUND=y
> +CONFIG_SND=y
> +CONFIG_SND_USB_AUDIO=y
> +CONFIG_SND_SOC=y
> +CONFIG_SND_IMX_SOC=y
> +CONFIG_SND_SOC_IMX_SGTL5000=y
> +CONFIG_SND_SOC_IMX_WM8962=y
> +CONFIG_SND_SOC_IMX_CS42888=y
> +CONFIG_SND_SOC_IMX_SPDIF=y
> +CONFIG_SND_SOC_IMX_HDMI=y
> +CONFIG_HIDRAW=y
> +CONFIG_HID_A4TECH=m
> +CONFIG_HID_APPLE=m
> +CONFIG_HID_BELKIN=m
> +CONFIG_HID_CHERRY=m
> +CONFIG_HID_CHICONY=m
> +CONFIG_HID_CYPRESS=m
> +CONFIG_HID_EZKEY=m
> +CONFIG_HID_GYRATION=m
> +CONFIG_HID_LOGITECH=m
> +CONFIG_HID_MICROSOFT=m
> +CONFIG_HID_MONTEREY=m
> +CONFIG_HID_PANTHERLORD=m
> +CONFIG_HID_PETALYNX=m
> +CONFIG_HID_SAMSUNG=m
> +CONFIG_HID_SONY=m
> +CONFIG_HID_SUNPLUS=m
> +CONFIG_USB=y
> +# CONFIG_USB_DEVICE_CLASS is not set
> +CONFIG_USB_SUSPEND=y
> +# CONFIG_USB_OTG_WHITELIST is not set
> +CONFIG_USB_EHCI_HCD=y
> +CONFIG_USB_EHCI_ARC=y
> +CONFIG_USB_EHCI_ROOT_HUB_TT=y
> +CONFIG_USB_STORAGE=y
> +CONFIG_USB_SERIAL=y
> +CONFIG_USB_SERIAL_CONSOLE=y
> +CONFIG_USB_SERIAL_GENERIC=y
> +CONFIG_USB_SERIAL_AIRCABLE=m
> +CONFIG_USB_SERIAL_ARK3116=m
> +CONFIG_USB_SERIAL_BELKIN=m
> +CONFIG_USB_SERIAL_CH341=m
> +CONFIG_USB_SERIAL_WHITEHEAT=m
> +CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
> +CONFIG_USB_SERIAL_CP210X=m
> +CONFIG_USB_SERIAL_CYPRESS_M8=m
> +CONFIG_USB_SERIAL_EMPEG=m
> +CONFIG_USB_SERIAL_FTDI_SIO=y
> +CONFIG_USB_SERIAL_FUNSOFT=m
> +CONFIG_USB_SERIAL_VISOR=m
> +CONFIG_USB_SERIAL_IPAQ=m
> +CONFIG_USB_SERIAL_IR=m
> +CONFIG_USB_SERIAL_EDGEPORT=m
> +CONFIG_USB_SERIAL_EDGEPORT_TI=m
> +CONFIG_USB_SERIAL_GARMIN=m
> +CONFIG_USB_SERIAL_IPW=m
> +CONFIG_USB_SERIAL_IUU=m
> +CONFIG_USB_SERIAL_KEYSPAN_PDA=m
> +CONFIG_USB_SERIAL_KLSI=m
> +CONFIG_USB_SERIAL_KOBIL_SCT=m
> +CONFIG_USB_SERIAL_MCT_U232=m
> +CONFIG_USB_SERIAL_MOS7720=m
> +CONFIG_USB_SERIAL_MOS7840=m
> +CONFIG_USB_SERIAL_MOTOROLA=m
> +CONFIG_USB_SERIAL_NAVMAN=m
> +CONFIG_USB_SERIAL_PL2303=y
> +CONFIG_USB_SERIAL_OTI6858=m
> +CONFIG_USB_SERIAL_QCAUX=m
> +CONFIG_USB_SERIAL_QUALCOMM=m
> +CONFIG_USB_SERIAL_SPCP8X5=m
> +CONFIG_USB_SERIAL_HP4X=m
> +CONFIG_USB_SERIAL_SAFE=m
> +CONFIG_USB_SERIAL_SAFE_PADDED=y
> +CONFIG_USB_SERIAL_SIEMENS_MPI=m
> +CONFIG_USB_SERIAL_SIERRAWIRELESS=m
> +CONFIG_USB_SERIAL_SYMBOL=m
> +CONFIG_USB_SERIAL_TI=m
> +CONFIG_USB_SERIAL_CYBERJACK=m
> +CONFIG_USB_SERIAL_XIRCOM=m
> +CONFIG_USB_SERIAL_OPTION=m
> +CONFIG_USB_SERIAL_OMNINET=m
> +CONFIG_USB_SERIAL_OPTICON=m
> +CONFIG_USB_SERIAL_VIVOPAY_SERIAL=m
> +CONFIG_USB_SERIAL_ZIO=m
> +CONFIG_USB_SERIAL_SSU100=m
> +CONFIG_USB_GADGET=y
> +CONFIG_USB_AUDIO=m
> +CONFIG_USB_ETH=m
> +CONFIG_USB_FILE_STORAGE=m
> +CONFIG_USB_G_SERIAL=m
> +CONFIG_MXC_OTG=y
> +CONFIG_MMC=y
> +CONFIG_MMC_UNSAFE_RESUME=y
> +CONFIG_MMC_SDHCI=y
> +CONFIG_MMC_SDHCI_PLTFM=y
> +CONFIG_MMC_SDHCI_ESDHC_IMX=y
> +CONFIG_NEW_LEDS=y
> +CONFIG_LEDS_CLASS=y
> +CONFIG_LEDS_GPIO=y
> +CONFIG_LEDS_TRIGGERS=y
> +CONFIG_LEDS_TRIGGER_GPIO=y
> +CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
> +CONFIG_RTC_CLASS=y
> +CONFIG_RTC_INTF_DEV_UIE_EMUL=y
> +CONFIG_RTC_DRV_PCF8523=y
> +CONFIG_RTC_DRV_SNVS=y
> +CONFIG_DMADEVICES=y
> +CONFIG_MXC_PXP_V2=y
> +CONFIG_IMX_SDMA=y
> +CONFIG_MXC_IPU=y
> +# CONFIG_MXC_HMP4E is not set
> +# CONFIG_MXC_HWEVENT is not set
> +CONFIG_MXC_ASRC=y
> +CONFIG_MXC_MLB150=m
> +CONFIG_MXC_GPU_VIV=y
> +CONFIG_MXC_MIPI_CSI2=y
> +CONFIG_MXC_HDMI_CEC=y
> +CONFIG_EXT2_FS=y
> +CONFIG_EXT3_FS=y
> +# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
> +CONFIG_EXT4_FS=y
> +CONFIG_AUTOFS4_FS=m
> +CONFIG_FUSE_FS=y
> +CONFIG_CUSE=y
> +CONFIG_MSDOS_FS=y
> +CONFIG_VFAT_FS=y
> +CONFIG_TMPFS=y
> +CONFIG_JFFS2_FS=y
> +CONFIG_UBIFS_FS=y
> +CONFIG_CRAMFS=y
> +CONFIG_NFS_FS=y
> +CONFIG_NFS_V3=y
> +CONFIG_ROOT_NFS=y
> +CONFIG_CIFS=y
> +CONFIG_CIFS_STATS=y
> +CONFIG_CIFS_STATS2=y
> +CONFIG_CIFS_XATTR=y
> +CONFIG_CIFS_POSIX=y
> +CONFIG_PARTITION_ADVANCED=y
> +CONFIG_EFI_PARTITION=y
> +CONFIG_NLS_CODEPAGE_437=y
> +CONFIG_NLS_ASCII=m
> +CONFIG_NLS_ISO8859_1=y
> +CONFIG_NLS_UTF8=m
> +CONFIG_MAGIC_SYSRQ=y
> +CONFIG_DEBUG_FS=y
> +CONFIG_SYSCTL_SYSCALL_CHECK=y
> +# CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set
> +CONFIG_CRYPTO_TEST=m
> +CONFIG_CRYPTO_CCM=y
> +CONFIG_CRYPTO_GCM=y
> +CONFIG_CRYPTO_CBC=y
> +CONFIG_CRYPTO_CTS=y
> +CONFIG_CRYPTO_LRW=y
> +CONFIG_CRYPTO_PCBC=y
> +CONFIG_CRYPTO_XTS=y
> +# CONFIG_CRYPTO_ANSI_CPRNG is not set
> +CONFIG_CRYPTO_DEV_FSL_CAAM=y
> +CONFIG_CRYPTO_DEV_FSL_CAAM_SM=y
> +CONFIG_CRYPTO_DEV_FSL_CAAM_SM_TEST=y
> +CONFIG_CRYPTO_DEV_FSL_CAAM_SECVIO=y
> +CONFIG_CRC_CCITT=m
> diff --git a/recipes-kernel/linux/linux-cubox-i-3.0.35/epdc-Rename-mxcfb_epdc_kernel.h-to-mxc_epdc.h.patch b/recipes-kernel/linux/linux-cubox-i-3.0.35/epdc-Rename-mxcfb_epdc_kernel.h-to-mxc_epdc.h.patch
> new file mode 100644
> index 0000000..0a20b3f
> --- /dev/null
> +++ b/recipes-kernel/linux/linux-cubox-i-3.0.35/epdc-Rename-mxcfb_epdc_kernel.h-to-mxc_epdc.h.patch
> @@ -0,0 +1,143 @@
> +From 149545df26169d257b144ff78934ce9cb5b6818b Mon Sep 17 00:00:00 2001
> +From: Otavio Salvador <otavio@ossystems.com.br>
> +Date: Sat, 19 Oct 2013 10:55:11 -0300
> +Subject: [PATCH] epdc: Rename mxcfb_epdc_kernel.h to mxc_epdc.h
> +Organization: O.S. Systems Software LTDA.
> +
> +This allow for forward compatibility with imx-test >= 3.10.9-1.0.0.
> +
> +Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
> +---
> + drivers/video/mxc/mxc_epdc_fb.c   |  2 +-
> + include/linux/mxcfb_epdc.h        | 49 +++++++++++++++++++++++++++++++++++++++
> + include/linux/mxcfb_epdc_kernel.h | 49 ---------------------------------------
> + 3 files changed, 50 insertions(+), 50 deletions(-)
> + create mode 100644 include/linux/mxcfb_epdc.h
> + delete mode 100644 include/linux/mxcfb_epdc_kernel.h
> +
> +diff --git a/drivers/video/mxc/mxc_epdc_fb.c b/drivers/video/mxc/mxc_epdc_fb.c
> +index 4103498..b3ef8ea 100644
> +--- a/drivers/video/mxc/mxc_epdc_fb.c
> ++++ b/drivers/video/mxc/mxc_epdc_fb.c
> +@@ -43,7 +43,7 @@
> + #include <linux/dmaengine.h>
> + #include <linux/pxp_dma.h>
> + #include <linux/mxcfb.h>
> +-#include <linux/mxcfb_epdc_kernel.h>
> ++#include <linux/mxcfb_epdc.h>
> + #include <linux/gpio.h>
> + #include <linux/regulator/driver.h>
> + #include <linux/fsl_devices.h>
> +diff --git a/include/linux/mxcfb_epdc.h b/include/linux/mxcfb_epdc.h
> +new file mode 100644
> +index 0000000..06fea6f
> +--- /dev/null
> ++++ b/include/linux/mxcfb_epdc.h
> +@@ -0,0 +1,49 @@
> ++/*
> ++ * Copyright (C) 2010-2012 Freescale Semiconductor, Inc. All Rights Reserved.
> ++ *
> ++ * 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.
> ++ *
> ++ * This program is distributed in the hope that it will be useful,
> ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
> ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> ++ * GNU General Public License for more details.
> ++ *
> ++ * You should have received a copy of the GNU General Public License
> ++ * along with this program; if not, write to the Free Software
> ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
> ++ *
> ++ */
> ++#ifndef _MXCFB_EPDC_KERNEL
> ++#define _MXCFB_EPDC_KERNEL
> ++
> ++void mxc_epdc_fb_set_waveform_modes(struct mxcfb_waveform_modes *modes,
> ++                                              struct fb_info *info);
> ++int mxc_epdc_fb_set_temperature(int temperature, struct fb_info *info);
> ++int mxc_epdc_fb_set_auto_update(u32 auto_mode, struct fb_info *info);
> ++int mxc_epdc_fb_send_update(struct mxcfb_update_data *upd_data,
> ++                                 struct fb_info *info);
> ++int mxc_epdc_fb_wait_update_complete(
> ++                              struct mxcfb_update_marker_data *marker_data,
> ++                              struct fb_info *info);
> ++int mxc_epdc_fb_set_pwrdown_delay(u32 pwrdown_delay,
> ++                                          struct fb_info *info);
> ++int mxc_epdc_get_pwrdown_delay(struct fb_info *info);
> ++int mxc_epdc_fb_set_upd_scheme(u32 upd_scheme, struct fb_info *info);
> ++
> ++void mxc_spdc_fb_set_waveform_modes(struct mxcfb_waveform_modes *modes,
> ++                                              struct fb_info *info);
> ++int mxc_spdc_fb_set_temperature(int temperature, struct fb_info *info);
> ++int mxc_spdc_fb_set_auto_update(u32 auto_mode, struct fb_info *info);
> ++int mxc_spdc_fb_send_update(struct mxcfb_update_data *upd_data,
> ++                                 struct fb_info *info);
> ++int mxc_spdc_fb_wait_update_complete(
> ++                              struct mxcfb_update_marker_data *marker_data,
> ++                              struct fb_info *info);
> ++int mxc_spdc_fb_set_pwrdown_delay(u32 pwrdown_delay,
> ++                                          struct fb_info *info);
> ++int mxc_spdc_get_pwrdown_delay(struct fb_info *info);
> ++int mxc_spdc_fb_set_upd_scheme(u32 upd_scheme, struct fb_info *info);
> ++#endif
> +diff --git a/include/linux/mxcfb_epdc_kernel.h b/include/linux/mxcfb_epdc_kernel.h
> +deleted file mode 100644
> +index 06fea6f..0000000
> +--- a/include/linux/mxcfb_epdc_kernel.h
> ++++ /dev/null
> +@@ -1,49 +0,0 @@
> +-/*
> +- * Copyright (C) 2010-2012 Freescale Semiconductor, Inc. All Rights Reserved.
> +- *
> +- * 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.
> +- *
> +- * This program is distributed in the hope that it will be useful,
> +- * but WITHOUT ANY WARRANTY; without even the implied warranty of
> +- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +- * GNU General Public License for more details.
> +- *
> +- * You should have received a copy of the GNU General Public License
> +- * along with this program; if not, write to the Free Software
> +- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
> +- *
> +- */
> +-#ifndef _MXCFB_EPDC_KERNEL
> +-#define _MXCFB_EPDC_KERNEL
> +-
> +-void mxc_epdc_fb_set_waveform_modes(struct mxcfb_waveform_modes *modes,
> +-                                              struct fb_info *info);
> +-int mxc_epdc_fb_set_temperature(int temperature, struct fb_info *info);
> +-int mxc_epdc_fb_set_auto_update(u32 auto_mode, struct fb_info *info);
> +-int mxc_epdc_fb_send_update(struct mxcfb_update_data *upd_data,
> +-                                 struct fb_info *info);
> +-int mxc_epdc_fb_wait_update_complete(
> +-                              struct mxcfb_update_marker_data *marker_data,
> +-                              struct fb_info *info);
> +-int mxc_epdc_fb_set_pwrdown_delay(u32 pwrdown_delay,
> +-                                          struct fb_info *info);
> +-int mxc_epdc_get_pwrdown_delay(struct fb_info *info);
> +-int mxc_epdc_fb_set_upd_scheme(u32 upd_scheme, struct fb_info *info);
> +-
> +-void mxc_spdc_fb_set_waveform_modes(struct mxcfb_waveform_modes *modes,
> +-                                              struct fb_info *info);
> +-int mxc_spdc_fb_set_temperature(int temperature, struct fb_info *info);
> +-int mxc_spdc_fb_set_auto_update(u32 auto_mode, struct fb_info *info);
> +-int mxc_spdc_fb_send_update(struct mxcfb_update_data *upd_data,
> +-                                 struct fb_info *info);
> +-int mxc_spdc_fb_wait_update_complete(
> +-                              struct mxcfb_update_marker_data *marker_data,
> +-                              struct fb_info *info);
> +-int mxc_spdc_fb_set_pwrdown_delay(u32 pwrdown_delay,
> +-                                          struct fb_info *info);
> +-int mxc_spdc_get_pwrdown_delay(struct fb_info *info);
> +-int mxc_spdc_fb_set_upd_scheme(u32 upd_scheme, struct fb_info *info);
> +-#endif
> +--
> +1.8.4.rc3
> +
> diff --git a/recipes-kernel/linux/linux-cubox-i-3.0.35/fix-install-breakage-for-fw-images.patch b/recipes-kernel/linux/linux-cubox-i-3.0.35/fix-install-breakage-for-fw-images.patch
> new file mode 100644
> index 0000000..86d4c37
> --- /dev/null
> +++ b/recipes-kernel/linux/linux-cubox-i-3.0.35/fix-install-breakage-for-fw-images.patch
> @@ -0,0 +1,32 @@
> +From f6a15304bc2730ba091eb747c413d4ef4124565e Mon Sep 17 00:00:00 2001
> +From: Denys Dmytriyenko <denys at ti.com>
> +Date: Mon, 5 Mar 2012 16:34:53 -0500
> +Subject: [PATCH] Makefile.fwinst: fix install breakage for FW images residing
> + in firmware/ dir
> +
> +This fixes below error found on some distros (Gentoo and Fedora):
> +*** No rule to make target `lib/firmware/./', needed by `lib/firmware/ti_3410.fw'.  Stop.
> +
> +Upstream-Status: Pending
> +
> +Signed-off-by: Denys Dmytriyenko <denys at ti.com>
> +---
> + scripts/Makefile.fwinst |    2 +-
> + 1 files changed, 1 insertions(+), 1 deletions(-)
> +
> +diff --git a/scripts/Makefile.fwinst b/scripts/Makefile.fwinst
> +index 6bf8e87..4d908d1 100644
> +--- a/scripts/Makefile.fwinst
> ++++ b/scripts/Makefile.fwinst
> +@@ -27,7 +27,7 @@ endif
> + installed-mod-fw := $(addprefix $(INSTALL_FW_PATH)/,$(mod-fw))
> +
> + installed-fw := $(addprefix $(INSTALL_FW_PATH)/,$(fw-shipped-all))
> +-installed-fw-dirs := $(sort $(dir $(installed-fw))) $(INSTALL_FW_PATH)/.
> ++installed-fw-dirs := $(sort $(dir $(installed-fw))) $(INSTALL_FW_PATH)/./
> +
> + # Workaround for make < 3.81, where .SECONDEXPANSION doesn't work.
> + PHONY += $(INSTALL_FW_PATH)/$$(%) install-all-dirs
> +--
> +1.7.8.5
> +
> diff --git a/recipes-kernel/linux/linux-cubox-i-3.0.35/mxc_hdmi-dont-require-cea-mode.patch b/recipes-kernel/linux/linux-cubox-i-3.0.35/mxc_hdmi-dont-require-cea-mode.patch
> new file mode 100644
> index 0000000..99d7f0c
> --- /dev/null
> +++ b/recipes-kernel/linux/linux-cubox-i-3.0.35/mxc_hdmi-dont-require-cea-mode.patch
> @@ -0,0 +1,25 @@
> +This fixes problems with DVI monitors connected to the HDMI port
> +via a DVI <-> HDMI cable. With dvi monitors, the list of CEA modes
> +is always zero, preventing modes higher than 1024x768 to be used.
> +This patch disables the CEA mode check.
> +
> +Upstream-Status: Pending
> +
> +diff --git a/drivers/video/mxc_hdmi.c b/drivers/video/mxc_hdmi.c
> +index 544f352..fa67128 100644
> +--- a/drivers/video/mxc_hdmi.c
> ++++ b/drivers/video/mxc_hdmi.c
> +@@ -1804,10 +1804,10 @@ static void mxc_hdmi_edid_rebuild_modelist(struct mxc_hdmi *hdmi)
> +                */
> +               mode = &hdmi->fbi->monspecs.modedb[i];
> +
> +-              if (!(mode->vmode & FB_VMODE_INTERLACED) &&
> +-                              (mxc_edid_mode_to_vic(mode) != 0)) {
> ++              if (!(mode->vmode & FB_VMODE_INTERLACED)) {
> ++                      int vic = mxc_edid_mode_to_vic(mode);
> +
> +-                      dev_dbg(&hdmi->pdev->dev, "Added mode %d:", i);
> ++                      dev_dbg(&hdmi->pdev->dev, "%s: Added mode %d(VIC %u):", __func__, i, vic);
> +                       dev_dbg(&hdmi->pdev->dev,
> +                               "xres = %d, yres = %d, freq = %d, vmode = %d, flag = %d\n",
> +                               hdmi->fbi->monspecs.modedb[i].xres,
> diff --git a/recipes-kernel/linux/linux-cubox-i_3.0.35.bb b/recipes-kernel/linux/linux-cubox-i_3.0.35.bb
> new file mode 100644
> index 0000000..eb1cd81
> --- /dev/null
> +++ b/recipes-kernel/linux/linux-cubox-i_3.0.35.bb
> @@ -0,0 +1,23 @@
> +include recipes-kernel/linux/linux-imx.inc
> +
> +SRCREV = "be699c6777f376b5f28e60d8d65942ac94b39908"
> +LOCALVERSION_cubox = "-4.1.0-cubox-i+yocto"
> +SRCBRANCH ?= "imx_3.0.35_4.1.0"
> +
> +# The added patches are the ones from linux-imx 3.0.35 , with exception of these which
> +# are already included in the kernel repository:
> +#   drm-vivante-Add-00-sufix-in-returned-bus-Id.patch
> +#   0001-perf-tools-Fix-getrusage-related-build-failure-on-gl.patch
> +SRC_URI = "git://github.com/SolidRun/linux-imx6.git;branch=${SRCBRANCH} \
> +           file://defconfig \
> +           file://epdc-Rename-mxcfb_epdc_kernel.h-to-mxc_epdc.h.patch \
> +           file://0002-ARM-7668-1-fix-memset-related-crashes-caused-by-rece.patch \
> +           file://0003-ARM-7670-1-fix-the-memset-fix.patch \
> +           file://0004-ENGR00271136-Fix-build-break-when-CONFIG_CLK_DEBUG-i.patch \
> +           file://0005-ENGR00271359-Add-Multi-touch-support.patch \
> +           file://0006-Add-support-for-DVI-monitors.patch \
> +           file://0007-ARM-mach-mx6-board-mx6q_sabresd-Register-SDHC3-first.patch \
> +           file://mxc_hdmi-dont-require-cea-mode.patch \
> +           file://fix-install-breakage-for-fw-images.patch"
> +
> +COMPATIBLE_MACHINE = "(cubox-i)"
> --
> 1.8.5.2
>
> _______________________________________________
> meta-freescale mailing list
> meta-freescale@yoctoproject.org
> https://lists.yoctoproject.org/listinfo/meta-freescale
Otavio Salvador - Jan. 28, 2014, 1:11 a.m.
On Mon, Jan 27, 2014 at 11:06 PM, Otavio Salvador
<otavio@ossystems.com.br> wrote:
> Hello Carlos,
>
> See the comments below ...

Oops...

> On Mon, Jan 27, 2014 at 7:38 PM, Carlos Rafael Giani
> <dv@pseudoterminal.org> wrote:
>> This kernel is based on linux-imx 3.0.35, and adds patches for
>> CuBox-i and HummingBoard support
>>
>> Signed-off-by: Carlos Rafael Giani <dv@pseudoterminal.org>
...
>> +++ b/recipes-kernel/linux/linux-cubox-i_3.0.35.bb
>> @@ -0,0 +1,23 @@
>> +include recipes-kernel/linux/linux-imx.inc
>> +
>> +SRCREV = "be699c6777f376b5f28e60d8d65942ac94b39908"
>> +LOCALVERSION_cubox = "-4.1.0-cubox-i+yocto"

The _cubox won't work here as your machien is cubox-i. So please drop
the _cubox as you already restrict it in the compatible machine
filter.

>> +SRCBRANCH ?= "imx_3.0.35_4.1.0"
>> +
>> +# The added patches are the ones from linux-imx 3.0.35 , with exception of these which
>> +# are already included in the kernel repository:
>> +#   drm-vivante-Add-00-sufix-in-returned-bus-Id.patch
>> +#   0001-perf-tools-Fix-getrusage-related-build-failure-on-gl.patch
>> +SRC_URI = "git://github.com/SolidRun/linux-imx6.git;branch=${SRCBRANCH} \
>> +           file://defconfig \
>> +           file://epdc-Rename-mxcfb_epdc_kernel.h-to-mxc_epdc.h.patch \
>> +           file://0002-ARM-7668-1-fix-memset-related-crashes-caused-by-rece.patch \
>> +           file://0003-ARM-7670-1-fix-the-memset-fix.patch \
>> +           file://0004-ENGR00271136-Fix-build-break-when-CONFIG_CLK_DEBUG-i.patch \
>> +           file://0005-ENGR00271359-Add-Multi-touch-support.patch \
>> +           file://0006-Add-support-for-DVI-monitors.patch \
>> +           file://0007-ARM-mach-mx6-board-mx6q_sabresd-Register-SDHC3-first.patch \
>> +           file://mxc_hdmi-dont-require-cea-mode.patch \
>> +           file://fix-install-breakage-for-fw-images.patch"
>> +
>> +COMPATIBLE_MACHINE = "(cubox-i)"
>> --
>> 1.8.5.2
>>
>> _______________________________________________
>> meta-freescale mailing list
>> meta-freescale@yoctoproject.org
>> https://lists.yoctoproject.org/listinfo/meta-freescale
>
>
>
> --
> Otavio Salvador                             O.S. Systems
> http://www.ossystems.com.br        http://code.ossystems.com.br
> Mobile: +55 (53) 9981-7854            Mobile: +1 (347) 903-9750

Patch

diff --git a/recipes-kernel/linux/linux-cubox-i-3.0.35/0002-ARM-7668-1-fix-memset-related-crashes-caused-by-rece.patch b/recipes-kernel/linux/linux-cubox-i-3.0.35/0002-ARM-7668-1-fix-memset-related-crashes-caused-by-rece.patch
new file mode 100644
index 0000000..4c31e74
--- /dev/null
+++ b/recipes-kernel/linux/linux-cubox-i-3.0.35/0002-ARM-7668-1-fix-memset-related-crashes-caused-by-rece.patch
@@ -0,0 +1,259 @@ 
+From 2235b85f1c76d98b5f1e160cbd0a61a84c15e125 Mon Sep 17 00:00:00 2001
+From: Ivan Djelic <ivan.djelic@parrot.com>
+Date: Wed, 6 Mar 2013 20:09:27 +0100
+Subject: [PATCH] ARM: 7668/1: fix memset-related crashes caused by recent GCC
+ (4.7.2) optimizations
+Organization: O.S. Systems Software LTDA.
+
+Recent GCC versions (e.g. GCC-4.7.2) perform optimizations based on
+assumptions about the implementation of memset and similar functions.
+The current ARM optimized memset code does not return the value of
+its first argument, as is usually expected from standard implementations.
+
+For instance in the following function:
+
+void debug_mutex_lock_common(struct mutex *lock, struct mutex_waiter *waiter)
+{
+	memset(waiter, MUTEX_DEBUG_INIT, sizeof(*waiter));
+	waiter->magic = waiter;
+	INIT_LIST_HEAD(&waiter->list);
+}
+
+compiled as:
+
+800554d0 <debug_mutex_lock_common>:
+800554d0:       e92d4008        push    {r3, lr}
+800554d4:       e1a00001        mov     r0, r1
+800554d8:       e3a02010        mov     r2, #16 ; 0x10
+800554dc:       e3a01011        mov     r1, #17 ; 0x11
+800554e0:       eb04426e        bl      80165ea0 <memset>
+800554e4:       e1a03000        mov     r3, r0
+800554e8:       e583000c        str     r0, [r3, #12]
+800554ec:       e5830000        str     r0, [r3]
+800554f0:       e5830004        str     r0, [r3, #4]
+800554f4:       e8bd8008        pop     {r3, pc}
+
+GCC assumes memset returns the value of pointer 'waiter' in register r0; causing
+register/memory corruptions.
+
+This patch fixes the return value of the assembly version of memset.
+It adds a 'mov' instruction and merges an additional load+store into
+existing load/store instructions.
+For ease of review, here is a breakdown of the patch into 4 simple steps:
+
+Step 1
+======
+Perform the following substitutions:
+ip -> r8, then
+r0 -> ip,
+and insert 'mov ip, r0' as the first statement of the function.
+At this point, we have a memset() implementation returning the proper result,
+but corrupting r8 on some paths (the ones that were using ip).
+
+Step 2
+======
+Make sure r8 is saved and restored when (! CALGN(1)+0) == 1:
+
+save r8:
+-       str     lr, [sp, #-4]!
++       stmfd   sp!, {r8, lr}
+
+and restore r8 on both exit paths:
+-       ldmeqfd sp!, {pc}               @ Now <64 bytes to go.
++       ldmeqfd sp!, {r8, pc}           @ Now <64 bytes to go.
+(...)
+        tst     r2, #16
+        stmneia ip!, {r1, r3, r8, lr}
+-       ldr     lr, [sp], #4
++       ldmfd   sp!, {r8, lr}
+
+Step 3
+======
+Make sure r8 is saved and restored when (! CALGN(1)+0) == 0:
+
+save r8:
+-       stmfd   sp!, {r4-r7, lr}
++       stmfd   sp!, {r4-r8, lr}
+
+and restore r8 on both exit paths:
+        bgt     3b
+-       ldmeqfd sp!, {r4-r7, pc}
++       ldmeqfd sp!, {r4-r8, pc}
+(...)
+        tst     r2, #16
+        stmneia ip!, {r4-r7}
+-       ldmfd   sp!, {r4-r7, lr}
++       ldmfd   sp!, {r4-r8, lr}
+
+Step 4
+======
+Rewrite register list "r4-r7, r8" as "r4-r8".
+
+Upstream-Status: Pending
+
+Signed-off-by: Ivan Djelic <ivan.djelic@parrot.com>
+Reviewed-by: Nicolas Pitre <nico@linaro.org>
+Signed-off-by: Dirk Behme <dirk.behme@gmail.com>
+Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
+(cherry picked from commit 455bd4c430b0c0a361f38e8658a0d6cb469942b5)
+---
+ arch/arm/lib/memset.S | 85 ++++++++++++++++++++++++++-------------------------
+ 1 file changed, 44 insertions(+), 41 deletions(-)
+
+diff --git a/arch/arm/lib/memset.S b/arch/arm/lib/memset.S
+index 650d592..d912e73 100644
+--- a/arch/arm/lib/memset.S
++++ b/arch/arm/lib/memset.S
+@@ -19,9 +19,9 @@
+ 1:	subs	r2, r2, #4		@ 1 do we have enough
+ 	blt	5f			@ 1 bytes to align with?
+ 	cmp	r3, #2			@ 1
+-	strltb	r1, [r0], #1		@ 1
+-	strleb	r1, [r0], #1		@ 1
+-	strb	r1, [r0], #1		@ 1
++	strltb	r1, [ip], #1		@ 1
++	strleb	r1, [ip], #1		@ 1
++	strb	r1, [ip], #1		@ 1
+ 	add	r2, r2, r3		@ 1 (r2 = r2 - (4 - r3))
+ /*
+  * The pointer is now aligned and the length is adjusted.  Try doing the
+@@ -29,10 +29,14 @@
+  */
+ 
+ ENTRY(memset)
+-	ands	r3, r0, #3		@ 1 unaligned?
++/*
++ * Preserve the contents of r0 for the return value.
++ */
++	mov	ip, r0
++	ands	r3, ip, #3		@ 1 unaligned?
+ 	bne	1b			@ 1
+ /*
+- * we know that the pointer in r0 is aligned to a word boundary.
++ * we know that the pointer in ip is aligned to a word boundary.
+  */
+ 	orr	r1, r1, r1, lsl #8
+ 	orr	r1, r1, r1, lsl #16
+@@ -43,29 +47,28 @@ ENTRY(memset)
+ #if ! CALGN(1)+0
+ 
+ /*
+- * We need an extra register for this loop - save the return address and
+- * use the LR
++ * We need 2 extra registers for this loop - use r8 and the LR
+  */
+-	str	lr, [sp, #-4]!
+-	mov	ip, r1
++	stmfd	sp!, {r8, lr}
++	mov	r8, r1
+ 	mov	lr, r1
+ 
+ 2:	subs	r2, r2, #64
+-	stmgeia	r0!, {r1, r3, ip, lr}	@ 64 bytes at a time.
+-	stmgeia	r0!, {r1, r3, ip, lr}
+-	stmgeia	r0!, {r1, r3, ip, lr}
+-	stmgeia	r0!, {r1, r3, ip, lr}
++	stmgeia	ip!, {r1, r3, r8, lr}	@ 64 bytes at a time.
++	stmgeia	ip!, {r1, r3, r8, lr}
++	stmgeia	ip!, {r1, r3, r8, lr}
++	stmgeia	ip!, {r1, r3, r8, lr}
+ 	bgt	2b
+-	ldmeqfd	sp!, {pc}		@ Now <64 bytes to go.
++	ldmeqfd	sp!, {r8, pc}		@ Now <64 bytes to go.
+ /*
+  * No need to correct the count; we're only testing bits from now on
+  */
+ 	tst	r2, #32
+-	stmneia	r0!, {r1, r3, ip, lr}
+-	stmneia	r0!, {r1, r3, ip, lr}
++	stmneia	ip!, {r1, r3, r8, lr}
++	stmneia	ip!, {r1, r3, r8, lr}
+ 	tst	r2, #16
+-	stmneia	r0!, {r1, r3, ip, lr}
+-	ldr	lr, [sp], #4
++	stmneia	ip!, {r1, r3, r8, lr}
++	ldmfd	sp!, {r8, lr}
+ 
+ #else
+ 
+@@ -74,54 +77,54 @@ ENTRY(memset)
+  * whole cache lines at once.
+  */
+ 
+-	stmfd	sp!, {r4-r7, lr}
++	stmfd	sp!, {r4-r8, lr}
+ 	mov	r4, r1
+ 	mov	r5, r1
+ 	mov	r6, r1
+ 	mov	r7, r1
+-	mov	ip, r1
++	mov	r8, r1
+ 	mov	lr, r1
+ 
+ 	cmp	r2, #96
+-	tstgt	r0, #31
++	tstgt	ip, #31
+ 	ble	3f
+ 
+-	and	ip, r0, #31
+-	rsb	ip, ip, #32
+-	sub	r2, r2, ip
+-	movs	ip, ip, lsl #(32 - 4)
+-	stmcsia	r0!, {r4, r5, r6, r7}
+-	stmmiia	r0!, {r4, r5}
+-	tst	ip, #(1 << 30)
+-	mov	ip, r1
+-	strne	r1, [r0], #4
++	and	r8, ip, #31
++	rsb	r8, r8, #32
++	sub	r2, r2, r8
++	movs	r8, r8, lsl #(32 - 4)
++	stmcsia	ip!, {r4, r5, r6, r7}
++	stmmiia	ip!, {r4, r5}
++	tst	r8, #(1 << 30)
++	mov	r8, r1
++	strne	r1, [ip], #4
+ 
+ 3:	subs	r2, r2, #64
+-	stmgeia	r0!, {r1, r3-r7, ip, lr}
+-	stmgeia	r0!, {r1, r3-r7, ip, lr}
++	stmgeia	ip!, {r1, r3-r8, lr}
++	stmgeia	ip!, {r1, r3-r8, lr}
+ 	bgt	3b
+-	ldmeqfd	sp!, {r4-r7, pc}
++	ldmeqfd	sp!, {r4-r8, pc}
+ 
+ 	tst	r2, #32
+-	stmneia	r0!, {r1, r3-r7, ip, lr}
++	stmneia	ip!, {r1, r3-r8, lr}
+ 	tst	r2, #16
+-	stmneia	r0!, {r4-r7}
+-	ldmfd	sp!, {r4-r7, lr}
++	stmneia	ip!, {r4-r7}
++	ldmfd	sp!, {r4-r8, lr}
+ 
+ #endif
+ 
+ 4:	tst	r2, #8
+-	stmneia	r0!, {r1, r3}
++	stmneia	ip!, {r1, r3}
+ 	tst	r2, #4
+-	strne	r1, [r0], #4
++	strne	r1, [ip], #4
+ /*
+  * When we get here, we've got less than 4 bytes to zero.  We
+  * may have an unaligned pointer as well.
+  */
+ 5:	tst	r2, #2
+-	strneb	r1, [r0], #1
+-	strneb	r1, [r0], #1
++	strneb	r1, [ip], #1
++	strneb	r1, [ip], #1
+ 	tst	r2, #1
+-	strneb	r1, [r0], #1
++	strneb	r1, [ip], #1
+ 	mov	pc, lr
+ ENDPROC(memset)
+-- 
+1.8.4.rc3
+
diff --git a/recipes-kernel/linux/linux-cubox-i-3.0.35/0003-ARM-7670-1-fix-the-memset-fix.patch b/recipes-kernel/linux/linux-cubox-i-3.0.35/0003-ARM-7670-1-fix-the-memset-fix.patch
new file mode 100644
index 0000000..b8d6f53
--- /dev/null
+++ b/recipes-kernel/linux/linux-cubox-i-3.0.35/0003-ARM-7670-1-fix-the-memset-fix.patch
@@ -0,0 +1,87 @@ 
+From 2ba23fa6c4128febaaf57fe184420a7111caa237 Mon Sep 17 00:00:00 2001
+From: Nicolas Pitre <nicolas.pitre@linaro.org>
+Date: Tue, 12 Mar 2013 13:00:42 +0100
+Subject: [PATCH] ARM: 7670/1: fix the memset fix
+Organization: O.S. Systems Software LTDA.
+
+Commit 455bd4c430b0 ("ARM: 7668/1: fix memset-related crashes caused by
+recent GCC (4.7.2) optimizations") attempted to fix a compliance issue
+with the memset return value.  However the memset itself became broken
+by that patch for misaligned pointers.
+
+This fixes the above by branching over the entry code from the
+misaligned fixup code to avoid reloading the original pointer.
+
+Also, because the function entry alignment is wrong in the Thumb mode
+compilation, that fixup code is moved to the end.
+
+While at it, the entry instructions are slightly reworked to help dual
+issue pipelines.
+
+Upstream-Status: Pending
+
+Signed-off-by: Nicolas Pitre <nico@linaro.org>
+Tested-by: Alexander Holler <holler@ahsoftware.de>
+Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
+(cherry picked from commit 418df63adac56841ef6b0f1fcf435bc64d4ed177)
+---
+ arch/arm/lib/memset.S | 33 +++++++++++++--------------------
+ 1 file changed, 13 insertions(+), 20 deletions(-)
+
+diff --git a/arch/arm/lib/memset.S b/arch/arm/lib/memset.S
+index d912e73..94b0650 100644
+--- a/arch/arm/lib/memset.S
++++ b/arch/arm/lib/memset.S
+@@ -14,31 +14,15 @@
+ 
+ 	.text
+ 	.align	5
+-	.word	0
+-
+-1:	subs	r2, r2, #4		@ 1 do we have enough
+-	blt	5f			@ 1 bytes to align with?
+-	cmp	r3, #2			@ 1
+-	strltb	r1, [ip], #1		@ 1
+-	strleb	r1, [ip], #1		@ 1
+-	strb	r1, [ip], #1		@ 1
+-	add	r2, r2, r3		@ 1 (r2 = r2 - (4 - r3))
+-/*
+- * The pointer is now aligned and the length is adjusted.  Try doing the
+- * memset again.
+- */
+ 
+ ENTRY(memset)
+-/*
+- * Preserve the contents of r0 for the return value.
+- */
+-	mov	ip, r0
+-	ands	r3, ip, #3		@ 1 unaligned?
+-	bne	1b			@ 1
++	ands	r3, r0, #3		@ 1 unaligned?
++	mov	ip, r0			@ preserve r0 as return value
++	bne	6f			@ 1
+ /*
+  * we know that the pointer in ip is aligned to a word boundary.
+  */
+-	orr	r1, r1, r1, lsl #8
++1:	orr	r1, r1, r1, lsl #8
+ 	orr	r1, r1, r1, lsl #16
+ 	mov	r3, r1
+ 	cmp	r2, #16
+@@ -127,4 +111,13 @@ ENTRY(memset)
+ 	tst	r2, #1
+ 	strneb	r1, [ip], #1
+ 	mov	pc, lr
++
++6:	subs	r2, r2, #4		@ 1 do we have enough
++	blt	5b			@ 1 bytes to align with?
++	cmp	r3, #2			@ 1
++	strltb	r1, [ip], #1		@ 1
++	strleb	r1, [ip], #1		@ 1
++	strb	r1, [ip], #1		@ 1
++	add	r2, r2, r3		@ 1 (r2 = r2 - (4 - r3))
++	b	1b
+ ENDPROC(memset)
+-- 
+1.8.4.rc3
+
diff --git a/recipes-kernel/linux/linux-cubox-i-3.0.35/0004-ENGR00271136-Fix-build-break-when-CONFIG_CLK_DEBUG-i.patch b/recipes-kernel/linux/linux-cubox-i-3.0.35/0004-ENGR00271136-Fix-build-break-when-CONFIG_CLK_DEBUG-i.patch
new file mode 100644
index 0000000..7316351
--- /dev/null
+++ b/recipes-kernel/linux/linux-cubox-i-3.0.35/0004-ENGR00271136-Fix-build-break-when-CONFIG_CLK_DEBUG-i.patch
@@ -0,0 +1,43 @@ 
+From d8601292ae25e0af47aa4486055221ab44113f0e Mon Sep 17 00:00:00 2001
+From: Mahesh Mahadevan <Mahesh.Mahadevan@freescale.com>
+Date: Mon, 15 Jul 2013 15:34:54 -0500
+Subject: [PATCH] ENGR00271136 Fix build break when CONFIG_CLK_DEBUG is
+ disabled
+Organization: O.S. Systems Software LTDA.
+
+clk structure member name is defined only when CONFIG_CLK_DEBUG is enabled.
+Hence need to encapsulate the code with this config.
+
+Patch received from imx community:
+https://community.freescale.com/thread/308482
+
+Upstream-Status: Pending
+
+Signed-off-by: xiongweihuang
+Signed-off-by: Mahesh Mahadevan <Mahesh.Mahadevan@freescale.com>
+---
+ arch/arm/plat-mxc/clock.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/arch/arm/plat-mxc/clock.c b/arch/arm/plat-mxc/clock.c
+index 93347eb..1aa2664 100755
+--- a/arch/arm/plat-mxc/clock.c
++++ b/arch/arm/plat-mxc/clock.c
+@@ -58,12 +58,12 @@ static void __clk_disable(struct clk *clk)
+ {
+ 	if (clk == NULL || IS_ERR(clk))
+ 		return;
+-
++#ifdef CONFIG_CLK_DEBUG
+ 	if (!clk->usecount) {
+ 		WARN(1, "clock enable/disable mismatch! clk  %s\n", clk->name);
+ 		return;
+ 	}
+-
++#endif
+ 	if (!(--clk->usecount)) {
+ 		if (clk->disable)
+ 			clk->disable(clk);
+-- 
+1.8.4.rc3
+
diff --git a/recipes-kernel/linux/linux-cubox-i-3.0.35/0005-ENGR00271359-Add-Multi-touch-support.patch b/recipes-kernel/linux/linux-cubox-i-3.0.35/0005-ENGR00271359-Add-Multi-touch-support.patch
new file mode 100644
index 0000000..cb20198
--- /dev/null
+++ b/recipes-kernel/linux/linux-cubox-i-3.0.35/0005-ENGR00271359-Add-Multi-touch-support.patch
@@ -0,0 +1,98 @@ 
+From 538f4bb2f7a51f267395550a5be9f0ab2e426712 Mon Sep 17 00:00:00 2001
+From: Erik Boto <erik.boto@pelagicore.com>
+Date: Tue, 16 Jul 2013 12:06:05 -0500
+Subject: [PATCH] ENGR00271359 Add Multi-touch support
+Organization: O.S. Systems Software LTDA.
+
+The previous behavior of the driver did not work properly with Qt5
+QtQuick multi touch-point gestures, due to how touch-points are
+reported when removing a touch-point. My interpretation of the
+available documentation [1] was that the driver should report all
+touch-points between SYN_REPORTs, but it is not explicitly stated so.
+I've found another mail-thread [2] where the creator of the protocol
+states:
+
+"The protocol defines a generic way of sending a variable amount of
+contacts. The contact count is obtained by counting the number of
+non-empty finger packets between SYN_REPORT events."-Henrik Rydberg
+
+I think this verifies my assumption that all touch-points should be
+reported between SYN_REPORTs, otherwise it can not be used to obtain
+the count.
+
+[1] https://www.kernel.org/doc/Documentation/input/multi-touch-protocol.txt
+[2] http://lists.x.org/archives/xorg-devel/2010-March/006466.html
+
+Upstream-Status: Pending
+
+Signed-off-by: Erik Boto <erik.boto@pelagicore.com>
+Signed-off-by: Mahesh Mahadevan <Mahesh.Mahadevan@freescale.com>
+(cherry picked from commit 7cba001c5a502680f6dbf902821726779a9c9287)
+---
+ drivers/input/touchscreen/egalax_ts.c | 36 +++++++++++++++++------------------
+ 1 file changed, 18 insertions(+), 18 deletions(-)
+
+diff --git a/drivers/input/touchscreen/egalax_ts.c b/drivers/input/touchscreen/egalax_ts.c
+index 0b6cde7..271f820 100644
+--- a/drivers/input/touchscreen/egalax_ts.c
++++ b/drivers/input/touchscreen/egalax_ts.c
+@@ -133,7 +133,6 @@ retry:
+ 	}
+ 
+ 	if (down) {
+-		/* should also report old pointers */
+ 		events[id].valid = valid;
+ 		events[id].status = down;
+ 		events[id].x = x;
+@@ -144,23 +143,6 @@ retry:
+ 		input_report_abs(input_dev, ABS_Y, y);
+ 		input_event(data->input_dev, EV_KEY, BTN_TOUCH, 1);
+ 		input_report_abs(input_dev, ABS_PRESSURE, 1);
+-#else
+-		for (i = 0; i < MAX_SUPPORT_POINTS; i++) {
+-			if (!events[i].valid)
+-				continue;
+-			dev_dbg(&client->dev, "report id:%d valid:%d x:%d y:%d",
+-				i, valid, x, y);
+-
+-			input_report_abs(input_dev,
+-					 ABS_MT_TRACKING_ID, i);
+-			input_report_abs(input_dev,
+-					 ABS_MT_TOUCH_MAJOR, 1);
+-			input_report_abs(input_dev,
+-					 ABS_MT_POSITION_X, events[i].x);
+-			input_report_abs(input_dev,
+-					 ABS_MT_POSITION_Y, events[i].y);
+-			input_mt_sync(input_dev);
+-		}
+ #endif
+ 	} else {
+ 		dev_dbg(&client->dev, "release id:%d\n", id);
+@@ -176,6 +158,24 @@ retry:
+ #endif
+ 	}
+ 
++#ifndef CONFIG_TOUCHSCREEN_EGALAX_SINGLE_TOUCH
++	/* report all pointers */
++	for (i = 0; i < MAX_SUPPORT_POINTS; i++) {
++		if (!events[i].valid)
++			continue;
++		dev_dbg(&client->dev, "report id:%d valid:%d x:%d y:%d",
++			i, valid, x, y);
++			input_report_abs(input_dev,
++				 ABS_MT_TRACKING_ID, i);
++		input_report_abs(input_dev,
++				 ABS_MT_TOUCH_MAJOR, 1);
++		input_report_abs(input_dev,
++				 ABS_MT_POSITION_X, events[i].x);
++		input_report_abs(input_dev,
++				 ABS_MT_POSITION_Y, events[i].y);
++		input_mt_sync(input_dev);
++	}
++#endif
+ 	input_sync(input_dev);
+ 	return IRQ_HANDLED;
+ }
+-- 
+1.8.4.rc3
+
diff --git a/recipes-kernel/linux/linux-cubox-i-3.0.35/0006-Add-support-for-DVI-monitors.patch b/recipes-kernel/linux/linux-cubox-i-3.0.35/0006-Add-support-for-DVI-monitors.patch
new file mode 100644
index 0000000..00a6b5c
--- /dev/null
+++ b/recipes-kernel/linux/linux-cubox-i-3.0.35/0006-Add-support-for-DVI-monitors.patch
@@ -0,0 +1,227 @@ 
+From 3e6441d113f72b412081a2c87f39011e4c253a35 Mon Sep 17 00:00:00 2001
+From: Robert Winkler <robert.winkler@boundarydevices.com>
+Date: Fri, 19 Jul 2013 19:00:41 -0700
+Subject: [PATCH] Add support for DVI monitors
+Organization: O.S. Systems Software LTDA.
+
+Upstream-Status: Pending
+
+Signed-off-by: Robert Winkler <robert.winkler@boundarydevices.com>
+---
+ arch/arm/plat-mxc/include/mach/mxc_hdmi.h |  7 +++
+ drivers/video/mxc_hdmi.c                  | 98 +++++++++++++------------------
+ 2 files changed, 49 insertions(+), 56 deletions(-)
+
+diff --git a/arch/arm/plat-mxc/include/mach/mxc_hdmi.h b/arch/arm/plat-mxc/include/mach/mxc_hdmi.h
+index 94f7638..af59c62 100644
+--- a/arch/arm/plat-mxc/include/mach/mxc_hdmi.h
++++ b/arch/arm/plat-mxc/include/mach/mxc_hdmi.h
+@@ -605,6 +605,10 @@ enum {
+ 	HDMI_IH_MUTE_PHY_STAT0_TX_PHY_LOCK = 0x2,
+ 	HDMI_IH_MUTE_PHY_STAT0_HPD = 0x1,
+ 
++/* IH and IH_MUTE convenience macro RX_SENSE | HPD*/
++	HDMI_DVI_IH_STAT = 0x3D,
++
++
+ /* IH_AHBDMAAUD_STAT0 field values */
+ 	HDMI_IH_AHBDMAAUD_STAT0_ERROR = 0x20,
+ 	HDMI_IH_AHBDMAAUD_STAT0_LOST = 0x10,
+@@ -903,6 +907,9 @@ enum {
+ 	HDMI_PHY_HPD = 0x02,
+ 	HDMI_PHY_TX_PHY_LOCK = 0x01,
+ 
++/* HDMI STAT convenience RX_SENSE | HPD */
++	HDMI_DVI_STAT = 0xF2,
++
+ /* PHY_I2CM_SLAVE_ADDR field values */
+ 	HDMI_PHY_I2CM_SLAVE_ADDR_PHY_GEN2 = 0x69,
+ 	HDMI_PHY_I2CM_SLAVE_ADDR_HEAC_PHY = 0x49,
+diff --git a/drivers/video/mxc_hdmi.c b/drivers/video/mxc_hdmi.c
+index c5069aa..544f352 100644
+--- a/drivers/video/mxc_hdmi.c
++++ b/drivers/video/mxc_hdmi.c
+@@ -180,7 +180,6 @@ struct mxc_hdmi {
+ 	bool dft_mode_set;
+ 	char *dft_mode_str;
+ 	int default_bpp;
+-	u8 latest_intr_stat;
+ 	bool irq_enabled;
+ 	spinlock_t irq_lock;
+ 	bool phy_enabled;
+@@ -1996,58 +1995,48 @@ static void hotplug_worker(struct work_struct *work)
+ 	struct delayed_work *delay_work = to_delayed_work(work);
+ 	struct mxc_hdmi *hdmi =
+ 		container_of(delay_work, struct mxc_hdmi, hotplug_work);
+-	u32 phy_int_stat, phy_int_pol, phy_int_mask;
+-	u8 val;
++	u32 hdmi_phy_stat0, hdmi_phy_pol0, hdmi_phy_mask0;
+ 	unsigned long flags;
+ 	char event_string[32];
+ 	char *envp[] = { event_string, NULL };
+ 
+-	phy_int_stat = hdmi->latest_intr_stat;
+-	phy_int_pol = hdmi_readb(HDMI_PHY_POL0);
+ 
+-	dev_dbg(&hdmi->pdev->dev, "phy_int_stat=0x%x, phy_int_pol=0x%x\n",
+-			phy_int_stat, phy_int_pol);
++	hdmi_phy_stat0 = hdmi_readb(HDMI_PHY_STAT0);
++	hdmi_phy_pol0 = hdmi_readb(HDMI_PHY_POL0);
++
++	dev_dbg(&hdmi->pdev->dev, "hdmi_phy_stat0=0x%x, hdmi_phy_pol0=0x%x\n",
++			hdmi_phy_stat0, hdmi_phy_pol0);
++
++	/* Make HPD intr active low to capture unplug event or
++	 * active high to capture plugin event */
++	hdmi_writeb((HDMI_DVI_STAT & ~hdmi_phy_stat0), HDMI_PHY_POL0);
+ 
+ 	/* check cable status */
+-	if (phy_int_stat & HDMI_IH_PHY_STAT0_HPD) {
+-		/* cable connection changes */
+-		if (phy_int_pol & HDMI_PHY_HPD) {
+-			/* Plugin event */
+-			dev_dbg(&hdmi->pdev->dev, "EVENT=plugin\n");
+-			mxc_hdmi_cable_connected(hdmi);
+-
+-			/* Make HPD intr active low to capture unplug event */
+-			val = hdmi_readb(HDMI_PHY_POL0);
+-			val &= ~HDMI_PHY_HPD;
+-			hdmi_writeb(val, HDMI_PHY_POL0);
+-
+-			sprintf(event_string, "EVENT=plugin");
+-			kobject_uevent_env(&hdmi->pdev->dev.kobj, KOBJ_CHANGE, envp);
++	if (hdmi_phy_stat0 & HDMI_DVI_STAT) {
++		/* Plugin event */
++		dev_dbg(&hdmi->pdev->dev, "EVENT=plugin\n");
++		mxc_hdmi_cable_connected(hdmi);
++
++		sprintf(event_string, "EVENT=plugin");
++		kobject_uevent_env(&hdmi->pdev->dev.kobj, KOBJ_CHANGE, envp);
+ #ifdef CONFIG_MXC_HDMI_CEC
+-			mxc_hdmi_cec_handle(0x80);
++		mxc_hdmi_cec_handle(0x80);
+ #endif
+-			hdmi_set_cable_state(1);
+-
+-		} else if (!(phy_int_pol & HDMI_PHY_HPD)) {
+-			/* Plugout event */
+-			dev_dbg(&hdmi->pdev->dev, "EVENT=plugout\n");
+-			hdmi_set_cable_state(0);
+-			mxc_hdmi_abort_stream();
+-			mxc_hdmi_cable_disconnected(hdmi);
++		hdmi_set_cable_state(1);
+ 
+-			/* Make HPD intr active high to capture plugin event */
+-			val = hdmi_readb(HDMI_PHY_POL0);
+-			val |= HDMI_PHY_HPD;
+-			hdmi_writeb(val, HDMI_PHY_POL0);
++	} else {
++		/* Plugout event */
++		dev_dbg(&hdmi->pdev->dev, "EVENT=plugout\n");
++		hdmi_set_cable_state(0);
++		mxc_hdmi_abort_stream();
++		mxc_hdmi_cable_disconnected(hdmi);
+ 
+-			sprintf(event_string, "EVENT=plugout");
+-			kobject_uevent_env(&hdmi->pdev->dev.kobj, KOBJ_CHANGE, envp);
++		sprintf(event_string, "EVENT=plugout");
++		kobject_uevent_env(&hdmi->pdev->dev.kobj, KOBJ_CHANGE, envp);
+ #ifdef CONFIG_MXC_HDMI_CEC
+-			mxc_hdmi_cec_handle(0x100);
++		mxc_hdmi_cec_handle(0x100);
+ #endif
+ 
+-		} else
+-			dev_dbg(&hdmi->pdev->dev, "EVENT=none?\n");
+ 	}
+ 
+ 	/* Lock here to ensure full powerdown sequence
+@@ -2055,12 +2044,12 @@ static void hotplug_worker(struct work_struct *work)
+ 	spin_lock_irqsave(&hdmi->irq_lock, flags);
+ 
+ 	/* Re-enable HPD interrupts */
+-	phy_int_mask = hdmi_readb(HDMI_PHY_MASK0);
+-	phy_int_mask &= ~HDMI_PHY_HPD;
+-	hdmi_writeb(phy_int_mask, HDMI_PHY_MASK0);
++	hdmi_phy_mask0 = hdmi_readb(HDMI_PHY_MASK0);
++	hdmi_phy_mask0 &= ~HDMI_DVI_STAT;
++	hdmi_writeb(hdmi_phy_mask0, HDMI_PHY_MASK0);
+ 
+ 	/* Unmute interrupts */
+-	hdmi_writeb(~HDMI_IH_MUTE_PHY_STAT0_HPD, HDMI_IH_MUTE_PHY_STAT0);
++	hdmi_writeb(~HDMI_DVI_IH_STAT, HDMI_IH_MUTE_PHY_STAT0);
+ 
+ 	if (hdmi_readb(HDMI_IH_FC_STAT2) & HDMI_IH_FC_STAT2_OVERFLOW_MASK)
+ 		mxc_hdmi_clear_overflow();
+@@ -2086,7 +2075,7 @@ static void hdcp_hdp_worker(struct work_struct *work)
+ static irqreturn_t mxc_hdmi_hotplug(int irq, void *data)
+ {
+ 	struct mxc_hdmi *hdmi = data;
+-	u8 val, intr_stat;
++	u8 val;
+ 	unsigned long flags;
+ 
+ 	spin_lock_irqsave(&hdmi->irq_lock, flags);
+@@ -2108,25 +2097,22 @@ static irqreturn_t mxc_hdmi_hotplug(int irq, void *data)
+ 	 * HDMI registers.
+ 	 */
+ 	/* Capture status - used in hotplug_worker ISR */
+-	intr_stat = hdmi_readb(HDMI_IH_PHY_STAT0);
+-
+-	if (intr_stat & HDMI_IH_PHY_STAT0_HPD) {
++	if (hdmi_readb(HDMI_IH_PHY_STAT0) & HDMI_DVI_IH_STAT) {
+ 
+ 		dev_dbg(&hdmi->pdev->dev, "Hotplug interrupt received\n");
+-		hdmi->latest_intr_stat = intr_stat;
+ 
+ 		/* Mute interrupts until handled */
+ 
+ 		val = hdmi_readb(HDMI_IH_MUTE_PHY_STAT0);
+-		val |= HDMI_IH_MUTE_PHY_STAT0_HPD;
++		val |= HDMI_DVI_IH_STAT;
+ 		hdmi_writeb(val, HDMI_IH_MUTE_PHY_STAT0);
+ 
+ 		val = hdmi_readb(HDMI_PHY_MASK0);
+-		val |= HDMI_PHY_HPD;
++		val |= HDMI_DVI_STAT;
+ 		hdmi_writeb(val, HDMI_PHY_MASK0);
+ 
+ 		/* Clear Hotplug interrupts */
+-		hdmi_writeb(HDMI_IH_PHY_STAT0_HPD, HDMI_IH_PHY_STAT0);
++		hdmi_writeb(HDMI_DVI_IH_STAT, HDMI_IH_PHY_STAT0);
+ 
+ 		schedule_delayed_work(&(hdmi->hotplug_work), msecs_to_jiffies(20));
+ 	}
+@@ -2282,13 +2268,13 @@ static void mxc_hdmi_fb_registered(struct mxc_hdmi *hdmi)
+ 		    HDMI_PHY_I2CM_CTLINT_ADDR);
+ 
+ 	/* enable cable hot plug irq */
+-	hdmi_writeb((u8)~HDMI_PHY_HPD, HDMI_PHY_MASK0);
++	hdmi_writeb((u8)~HDMI_DVI_STAT, HDMI_PHY_MASK0);
+ 
+ 	/* Clear Hotplug interrupts */
+-	hdmi_writeb(HDMI_IH_PHY_STAT0_HPD, HDMI_IH_PHY_STAT0);
++	hdmi_writeb(HDMI_DVI_IH_STAT, HDMI_IH_PHY_STAT0);
+ 
+ 	/* Unmute interrupts */
+-	hdmi_writeb(~HDMI_IH_MUTE_PHY_STAT0_HPD, HDMI_IH_MUTE_PHY_STAT0);
++	hdmi_writeb(~HDMI_DVI_IH_STAT, HDMI_IH_MUTE_PHY_STAT0);
+ 
+ 	hdmi->fb_reg = true;
+ 
+@@ -2522,10 +2508,10 @@ static int mxc_hdmi_disp_init(struct mxc_dispdrv_handle *disp,
+ 
+ 	/* Configure registers related to HDMI interrupt
+ 	 * generation before registering IRQ. */
+-	hdmi_writeb(HDMI_PHY_HPD, HDMI_PHY_POL0);
++	hdmi_writeb(HDMI_DVI_STAT, HDMI_PHY_POL0);
+ 
+ 	/* Clear Hotplug interrupts */
+-	hdmi_writeb(HDMI_IH_PHY_STAT0_HPD, HDMI_IH_PHY_STAT0);
++	hdmi_writeb(HDMI_DVI_IH_STAT, HDMI_IH_PHY_STAT0);
+ 
+ 	hdmi->nb.notifier_call = mxc_hdmi_fb_event;
+ 	ret = fb_register_client(&hdmi->nb);
+-- 
+1.8.4.rc3
+
diff --git a/recipes-kernel/linux/linux-cubox-i-3.0.35/0007-ARM-mach-mx6-board-mx6q_sabresd-Register-SDHC3-first.patch b/recipes-kernel/linux/linux-cubox-i-3.0.35/0007-ARM-mach-mx6-board-mx6q_sabresd-Register-SDHC3-first.patch
new file mode 100644
index 0000000..d02aa40
--- /dev/null
+++ b/recipes-kernel/linux/linux-cubox-i-3.0.35/0007-ARM-mach-mx6-board-mx6q_sabresd-Register-SDHC3-first.patch
@@ -0,0 +1,38 @@ 
+From cd31abbe08372fa870fac78ae845edd4859f8835 Mon Sep 17 00:00:00 2001
+From: Fabio Estevam <fabio.estevam@freescale.com>
+Date: Sat, 28 Sep 2013 18:46:18 -0300
+Subject: [PATCH] ARM: mach-mx6: board-mx6q_sabresd: Register SDHC3 first
+Organization: O.S. Systems Software LTDA.
+
+On sabresd boards we boot from SDHC3, so let's register it as mmc0.
+
+Currently eMMC is mmc0 and mmc1 can be SDHC3 or SDHC2 (if present).
+
+Registering SDHC3 is safer as we can always find the rootfs.
+
+Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
+---
+ arch/arm/mach-mx6/board-mx6q_sabresd.c | 5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
+
+diff --git a/arch/arm/mach-mx6/board-mx6q_sabresd.c b/arch/arm/mach-mx6/board-mx6q_sabresd.c
+index 3f9a845..4e6b323 100644
+--- a/arch/arm/mach-mx6/board-mx6q_sabresd.c
++++ b/arch/arm/mach-mx6/board-mx6q_sabresd.c
+@@ -1847,12 +1847,9 @@ static void __init mx6_sabresd_board_init(void)
+ 
+ 	imx6q_add_pm_imx(0, &mx6q_sabresd_pm_data);
+ 
+-	/* Move sd4 to first because sd4 connect to emmc.
+-	   Mfgtools want emmc is mmcblk0 and other sd card is mmcblk1.
+-	*/
++	imx6q_add_sdhci_usdhc_imx(2, &mx6q_sabresd_sd3_data);
+ 	imx6q_add_sdhci_usdhc_imx(3, &mx6q_sabresd_sd4_data);
+ 	imx6q_add_sdhci_usdhc_imx(1, &mx6q_sabresd_sd2_data);
+-	imx6q_add_sdhci_usdhc_imx(2, &mx6q_sabresd_sd3_data);
+ 	imx_add_viv_gpu(&imx6_gpu_data, &imx6q_gpu_pdata);
+ 	imx6q_sabresd_init_usb();
+ 	/* SATA is not supported by MX6DL/Solo */
+-- 
+1.8.4.rc3
+
diff --git a/recipes-kernel/linux/linux-cubox-i-3.0.35/defconfig b/recipes-kernel/linux/linux-cubox-i-3.0.35/defconfig
new file mode 100644
index 0000000..bd0cef0
--- /dev/null
+++ b/recipes-kernel/linux/linux-cubox-i-3.0.35/defconfig
@@ -0,0 +1,366 @@ 
+CONFIG_EXPERIMENTAL=y
+CONFIG_LOCALVERSION="-4.1.0+yocto"
+CONFIG_SYSVIPC=y
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_CGROUPS=y
+CONFIG_CGROUP_FREEZER=y
+CONFIG_CGROUP_DEVICE=y
+CONFIG_CGROUP_CPUACCT=y
+CONFIG_CGROUP_PERF=y
+CONFIG_CGROUP_SCHED=y
+CONFIG_EMBEDDED=y
+CONFIG_PERF_EVENTS=y
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+CONFIG_MODVERSIONS=y
+# CONFIG_BLK_DEV_BSG is not set
+CONFIG_ARCH_MXC=y
+CONFIG_GPIO_PCA953X=y
+CONFIG_ARCH_MX6=y
+CONFIG_FORCE_MAX_ZONEORDER=14
+CONFIG_MACH_MX6Q_ARM2=y
+CONFIG_MACH_MX6Q_SABRELITE=y
+CONFIG_MACH_MX6Q_SABRESD=y
+CONFIG_MACH_MX6Q_SABREAUTO=y
+CONFIG_MACH_MX6Q_HDMIDONGLE=y
+CONFIG_MACH_C1=y
+CONFIG_MACH_CUBOX_I=y
+CONFIG_USB_EHCI_ARC_H1=y
+CONFIG_USB_FSL_ARC_OTG=y
+CONFIG_MXC_PWM=y
+CONFIG_MXC_REBOOT_MFGMODE=y
+CONFIG_CLK_DEBUG=y
+CONFIG_DMA_ZONE_SIZE=184
+# CONFIG_SWP_EMULATE is not set
+CONFIG_ARM_ERRATA_743622=y
+CONFIG_ARM_ERRATA_751472=y
+CONFIG_ARM_ERRATA_754322=y
+CONFIG_ARM_ERRATA_775420=y
+CONFIG_ARM_ERRATA_764369=y
+CONFIG_PL310_ERRATA_769419=y
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_SMP=y
+CONFIG_VMSPLIT_2G=y
+CONFIG_PREEMPT=y
+CONFIG_AEABI=y
+# CONFIG_OABI_COMPAT is not set
+CONFIG_HIGHMEM=y
+CONFIG_COMPACTION=y
+CONFIG_KSM=y
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="noinitrd console=ttymxc0,115200 root=/dev/mtdblock2 rw rootfstype=jffs2 ip=off"
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_DEFAULT_GOV_INTERACTIVE=y
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=y
+CONFIG_CPU_FREQ_GOV_USERSPACE=y
+CONFIG_CPU_FREQ_GOV_ONDEMAND=y
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
+CONFIG_CPU_FREQ_IMX=y
+CONFIG_VFP=y
+CONFIG_NEON=y
+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+CONFIG_SUSPEND_DEVICE_TIME_DEBUG=y
+CONFIG_PM_RUNTIME=y
+CONFIG_PM_DEBUG=y
+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_IP_PNP_BOOTP=y
+# CONFIG_INET_LRO is not set
+# CONFIG_IPV6 is not set
+CONFIG_LLC2=y
+CONFIG_CAN=y
+CONFIG_CAN_RAW=y
+CONFIG_CAN_BCM=y
+CONFIG_CAN_VCAN=y
+CONFIG_CAN_FLEXCAN=y
+CONFIG_BT=y
+CONFIG_BT_L2CAP=y
+CONFIG_BT_SCO=y
+CONFIG_BT_RFCOMM=y
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=y
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+CONFIG_BT_HIDP=y
+CONFIG_BT_HCIBTUSB=y
+CONFIG_BT_HCIUART=y
+CONFIG_BT_HCIUART_ATH3K=y
+CONFIG_BT_HCIVHCI=y
+CONFIG_CFG80211=y
+CONFIG_RFKILL=y
+CONFIG_RFKILL_INPUT=y
+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
+CONFIG_CONNECTOR=y
+CONFIG_MTD=y
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLOCK=y
+CONFIG_MTD_CFI=y
+CONFIG_MTD_CFI_AMDSTD=y
+CONFIG_MTD_PHYSMAP=y
+CONFIG_MTD_M25P80=y
+CONFIG_MTD_NAND=y
+CONFIG_MTD_NAND_GPMI_NAND=y
+CONFIG_MTD_UBI=y
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_MISC_DEVICES=y
+CONFIG_MXS_PERFMON=m
+CONFIG_BLK_DEV_SD=y
+CONFIG_SCSI_MULTI_LUN=y
+CONFIG_ATA=y
+# CONFIG_SATA_PMP is not set
+CONFIG_SATA_AHCI_PLATFORM=y
+CONFIG_NETDEVICES=y
+CONFIG_MICREL_PHY=y
+CONFIG_NET_ETHERNET=y
+CONFIG_SMSC911X=y
+CONFIG_FEC_NAPI=y
+# CONFIG_NETDEV_1000 is not set
+# CONFIG_NETDEV_10000 is not set
+CONFIG_ATH_COMMON=m
+CONFIG_ATH6KL=m
+CONFIG_BRCMFMAC=y
+CONFIG_HOSTAP=y
+CONFIG_INPUT_POLLDEV=y
+CONFIG_INPUT_EVDEV=y
+CONFIG_KEYBOARD_GPIO=y
+# CONFIG_INPUT_MOUSE is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+CONFIG_TOUCHSCREEN_EGALAX=y
+CONFIG_TOUCHSCREEN_ELAN=y
+CONFIG_TOUCHSCREEN_MAX11801=y
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=y
+CONFIG_INPUT_ISL29023=y
+CONFIG_VT_HW_CONSOLE_BINDING=y
+CONFIG_SERIAL_IMX=y
+CONFIG_SERIAL_IMX_CONSOLE=y
+CONFIG_FSL_OTP=y
+CONFIG_HW_RANDOM=y
+CONFIG_MXS_VIIM=y
+CONFIG_I2C_CHARDEV=y
+CONFIG_I2C_IMX=y
+CONFIG_SPI=y
+CONFIG_SPI_IMX=y
+CONFIG_GPIO_SYSFS=y
+CONFIG_SABRESD_MAX8903=y
+CONFIG_SENSORS_MAX17135=y
+CONFIG_SENSORS_MAG3110=y
+# CONFIG_MXC_MMA8450 is not set
+CONFIG_WATCHDOG=y
+CONFIG_WATCHDOG_NOWAYOUT=y
+CONFIG_IMX2_WDT=y
+CONFIG_MFD_WM8994=y
+CONFIG_MFD_PFUZE=y
+CONFIG_MFD_MAX17135=y
+CONFIG_REGULATOR=y
+CONFIG_REGULATOR_FIXED_VOLTAGE=y
+CONFIG_REGULATOR_PFUZE100=y
+CONFIG_REGULATOR_MAX17135=y
+CONFIG_MEDIA_SUPPORT=y
+CONFIG_VIDEO_DEV=y
+CONFIG_IR_GPIO_CIR=y
+# CONFIG_MEDIA_TUNER_CUSTOMISE is not set
+CONFIG_VIDEO_MXC_CAMERA=m
+CONFIG_MXC_CAMERA_OV3640=m
+CONFIG_MXC_CAMERA_OV5640=m
+CONFIG_MXC_CAMERA_OV8820_MIPI=m
+CONFIG_MXC_CAMERA_OV5642=m
+CONFIG_MXC_TVIN_ADV7180=m
+CONFIG_MXC_CAMERA_OV5640_MIPI=m
+CONFIG_MXC_IPU_DEVICE_QUEUE_SDC=m
+CONFIG_USB_VIDEO_CLASS=m
+# CONFIG_RADIO_ADAPTERS is not set
+CONFIG_DRM=y
+CONFIG_DRM_VIVANTE=y
+CONFIG_FB=y
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+# CONFIG_LCD_CLASS_DEVICE is not set
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+# CONFIG_BACKLIGHT_GENERIC is not set
+CONFIG_BACKLIGHT_PWM=y
+CONFIG_FB_MXC_LDB=y
+CONFIG_FB_MXC_MIPI_DSI=y
+CONFIG_FB_MXC_TRULY_WVGA_SYNC_PANEL=y
+CONFIG_FB_MXC_EINK_PANEL=y
+CONFIG_FB_MXC_HDMI=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
+CONFIG_FONTS=y
+CONFIG_FONT_8x16=y
+CONFIG_LOGO=y
+CONFIG_SOUND=y
+CONFIG_SND=y
+CONFIG_SND_USB_AUDIO=y
+CONFIG_SND_SOC=y
+CONFIG_SND_IMX_SOC=y
+CONFIG_SND_SOC_IMX_SGTL5000=y
+CONFIG_SND_SOC_IMX_WM8962=y
+CONFIG_SND_SOC_IMX_CS42888=y
+CONFIG_SND_SOC_IMX_SPDIF=y
+CONFIG_SND_SOC_IMX_HDMI=y
+CONFIG_HIDRAW=y
+CONFIG_HID_A4TECH=m
+CONFIG_HID_APPLE=m
+CONFIG_HID_BELKIN=m
+CONFIG_HID_CHERRY=m
+CONFIG_HID_CHICONY=m
+CONFIG_HID_CYPRESS=m
+CONFIG_HID_EZKEY=m
+CONFIG_HID_GYRATION=m
+CONFIG_HID_LOGITECH=m
+CONFIG_HID_MICROSOFT=m
+CONFIG_HID_MONTEREY=m
+CONFIG_HID_PANTHERLORD=m
+CONFIG_HID_PETALYNX=m
+CONFIG_HID_SAMSUNG=m
+CONFIG_HID_SONY=m
+CONFIG_HID_SUNPLUS=m
+CONFIG_USB=y
+# CONFIG_USB_DEVICE_CLASS is not set
+CONFIG_USB_SUSPEND=y
+# CONFIG_USB_OTG_WHITELIST is not set
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_EHCI_ARC=y
+CONFIG_USB_EHCI_ROOT_HUB_TT=y
+CONFIG_USB_STORAGE=y
+CONFIG_USB_SERIAL=y
+CONFIG_USB_SERIAL_CONSOLE=y
+CONFIG_USB_SERIAL_GENERIC=y
+CONFIG_USB_SERIAL_AIRCABLE=m
+CONFIG_USB_SERIAL_ARK3116=m
+CONFIG_USB_SERIAL_BELKIN=m
+CONFIG_USB_SERIAL_CH341=m
+CONFIG_USB_SERIAL_WHITEHEAT=m
+CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
+CONFIG_USB_SERIAL_CP210X=m
+CONFIG_USB_SERIAL_CYPRESS_M8=m
+CONFIG_USB_SERIAL_EMPEG=m
+CONFIG_USB_SERIAL_FTDI_SIO=y
+CONFIG_USB_SERIAL_FUNSOFT=m
+CONFIG_USB_SERIAL_VISOR=m
+CONFIG_USB_SERIAL_IPAQ=m
+CONFIG_USB_SERIAL_IR=m
+CONFIG_USB_SERIAL_EDGEPORT=m
+CONFIG_USB_SERIAL_EDGEPORT_TI=m
+CONFIG_USB_SERIAL_GARMIN=m
+CONFIG_USB_SERIAL_IPW=m
+CONFIG_USB_SERIAL_IUU=m
+CONFIG_USB_SERIAL_KEYSPAN_PDA=m
+CONFIG_USB_SERIAL_KLSI=m
+CONFIG_USB_SERIAL_KOBIL_SCT=m
+CONFIG_USB_SERIAL_MCT_U232=m
+CONFIG_USB_SERIAL_MOS7720=m
+CONFIG_USB_SERIAL_MOS7840=m
+CONFIG_USB_SERIAL_MOTOROLA=m
+CONFIG_USB_SERIAL_NAVMAN=m
+CONFIG_USB_SERIAL_PL2303=y
+CONFIG_USB_SERIAL_OTI6858=m
+CONFIG_USB_SERIAL_QCAUX=m
+CONFIG_USB_SERIAL_QUALCOMM=m
+CONFIG_USB_SERIAL_SPCP8X5=m
+CONFIG_USB_SERIAL_HP4X=m
+CONFIG_USB_SERIAL_SAFE=m
+CONFIG_USB_SERIAL_SAFE_PADDED=y
+CONFIG_USB_SERIAL_SIEMENS_MPI=m
+CONFIG_USB_SERIAL_SIERRAWIRELESS=m
+CONFIG_USB_SERIAL_SYMBOL=m
+CONFIG_USB_SERIAL_TI=m
+CONFIG_USB_SERIAL_CYBERJACK=m
+CONFIG_USB_SERIAL_XIRCOM=m
+CONFIG_USB_SERIAL_OPTION=m
+CONFIG_USB_SERIAL_OMNINET=m
+CONFIG_USB_SERIAL_OPTICON=m
+CONFIG_USB_SERIAL_VIVOPAY_SERIAL=m
+CONFIG_USB_SERIAL_ZIO=m
+CONFIG_USB_SERIAL_SSU100=m
+CONFIG_USB_GADGET=y
+CONFIG_USB_AUDIO=m
+CONFIG_USB_ETH=m
+CONFIG_USB_FILE_STORAGE=m
+CONFIG_USB_G_SERIAL=m
+CONFIG_MXC_OTG=y
+CONFIG_MMC=y
+CONFIG_MMC_UNSAFE_RESUME=y
+CONFIG_MMC_SDHCI=y
+CONFIG_MMC_SDHCI_PLTFM=y
+CONFIG_MMC_SDHCI_ESDHC_IMX=y
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+CONFIG_LEDS_GPIO=y
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_GPIO=y
+CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_INTF_DEV_UIE_EMUL=y
+CONFIG_RTC_DRV_PCF8523=y
+CONFIG_RTC_DRV_SNVS=y
+CONFIG_DMADEVICES=y
+CONFIG_MXC_PXP_V2=y
+CONFIG_IMX_SDMA=y
+CONFIG_MXC_IPU=y
+# CONFIG_MXC_HMP4E is not set
+# CONFIG_MXC_HWEVENT is not set
+CONFIG_MXC_ASRC=y
+CONFIG_MXC_MLB150=m
+CONFIG_MXC_GPU_VIV=y
+CONFIG_MXC_MIPI_CSI2=y
+CONFIG_MXC_HDMI_CEC=y
+CONFIG_EXT2_FS=y
+CONFIG_EXT3_FS=y
+# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
+CONFIG_EXT4_FS=y
+CONFIG_AUTOFS4_FS=m
+CONFIG_FUSE_FS=y
+CONFIG_CUSE=y
+CONFIG_MSDOS_FS=y
+CONFIG_VFAT_FS=y
+CONFIG_TMPFS=y
+CONFIG_JFFS2_FS=y
+CONFIG_UBIFS_FS=y
+CONFIG_CRAMFS=y
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+CONFIG_ROOT_NFS=y
+CONFIG_CIFS=y
+CONFIG_CIFS_STATS=y
+CONFIG_CIFS_STATS2=y
+CONFIG_CIFS_XATTR=y
+CONFIG_CIFS_POSIX=y
+CONFIG_PARTITION_ADVANCED=y
+CONFIG_EFI_PARTITION=y
+CONFIG_NLS_CODEPAGE_437=y
+CONFIG_NLS_ASCII=m
+CONFIG_NLS_ISO8859_1=y
+CONFIG_NLS_UTF8=m
+CONFIG_MAGIC_SYSRQ=y
+CONFIG_DEBUG_FS=y
+CONFIG_SYSCTL_SYSCALL_CHECK=y
+# CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set
+CONFIG_CRYPTO_TEST=m
+CONFIG_CRYPTO_CCM=y
+CONFIG_CRYPTO_GCM=y
+CONFIG_CRYPTO_CBC=y
+CONFIG_CRYPTO_CTS=y
+CONFIG_CRYPTO_LRW=y
+CONFIG_CRYPTO_PCBC=y
+CONFIG_CRYPTO_XTS=y
+# CONFIG_CRYPTO_ANSI_CPRNG is not set
+CONFIG_CRYPTO_DEV_FSL_CAAM=y
+CONFIG_CRYPTO_DEV_FSL_CAAM_SM=y
+CONFIG_CRYPTO_DEV_FSL_CAAM_SM_TEST=y
+CONFIG_CRYPTO_DEV_FSL_CAAM_SECVIO=y
+CONFIG_CRC_CCITT=m
diff --git a/recipes-kernel/linux/linux-cubox-i-3.0.35/epdc-Rename-mxcfb_epdc_kernel.h-to-mxc_epdc.h.patch b/recipes-kernel/linux/linux-cubox-i-3.0.35/epdc-Rename-mxcfb_epdc_kernel.h-to-mxc_epdc.h.patch
new file mode 100644
index 0000000..0a20b3f
--- /dev/null
+++ b/recipes-kernel/linux/linux-cubox-i-3.0.35/epdc-Rename-mxcfb_epdc_kernel.h-to-mxc_epdc.h.patch
@@ -0,0 +1,143 @@ 
+From 149545df26169d257b144ff78934ce9cb5b6818b Mon Sep 17 00:00:00 2001
+From: Otavio Salvador <otavio@ossystems.com.br>
+Date: Sat, 19 Oct 2013 10:55:11 -0300
+Subject: [PATCH] epdc: Rename mxcfb_epdc_kernel.h to mxc_epdc.h
+Organization: O.S. Systems Software LTDA.
+
+This allow for forward compatibility with imx-test >= 3.10.9-1.0.0.
+
+Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
+---
+ drivers/video/mxc/mxc_epdc_fb.c   |  2 +-
+ include/linux/mxcfb_epdc.h        | 49 +++++++++++++++++++++++++++++++++++++++
+ include/linux/mxcfb_epdc_kernel.h | 49 ---------------------------------------
+ 3 files changed, 50 insertions(+), 50 deletions(-)
+ create mode 100644 include/linux/mxcfb_epdc.h
+ delete mode 100644 include/linux/mxcfb_epdc_kernel.h
+
+diff --git a/drivers/video/mxc/mxc_epdc_fb.c b/drivers/video/mxc/mxc_epdc_fb.c
+index 4103498..b3ef8ea 100644
+--- a/drivers/video/mxc/mxc_epdc_fb.c
++++ b/drivers/video/mxc/mxc_epdc_fb.c
+@@ -43,7 +43,7 @@
+ #include <linux/dmaengine.h>
+ #include <linux/pxp_dma.h>
+ #include <linux/mxcfb.h>
+-#include <linux/mxcfb_epdc_kernel.h>
++#include <linux/mxcfb_epdc.h>
+ #include <linux/gpio.h>
+ #include <linux/regulator/driver.h>
+ #include <linux/fsl_devices.h>
+diff --git a/include/linux/mxcfb_epdc.h b/include/linux/mxcfb_epdc.h
+new file mode 100644
+index 0000000..06fea6f
+--- /dev/null
++++ b/include/linux/mxcfb_epdc.h
+@@ -0,0 +1,49 @@
++/*
++ * Copyright (C) 2010-2012 Freescale Semiconductor, Inc. All Rights Reserved.
++ *
++ * 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.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
++ *
++ */
++#ifndef _MXCFB_EPDC_KERNEL
++#define _MXCFB_EPDC_KERNEL
++
++void mxc_epdc_fb_set_waveform_modes(struct mxcfb_waveform_modes *modes,
++						struct fb_info *info);
++int mxc_epdc_fb_set_temperature(int temperature, struct fb_info *info);
++int mxc_epdc_fb_set_auto_update(u32 auto_mode, struct fb_info *info);
++int mxc_epdc_fb_send_update(struct mxcfb_update_data *upd_data,
++				   struct fb_info *info);
++int mxc_epdc_fb_wait_update_complete(
++				struct mxcfb_update_marker_data *marker_data,
++				struct fb_info *info);
++int mxc_epdc_fb_set_pwrdown_delay(u32 pwrdown_delay,
++					    struct fb_info *info);
++int mxc_epdc_get_pwrdown_delay(struct fb_info *info);
++int mxc_epdc_fb_set_upd_scheme(u32 upd_scheme, struct fb_info *info);
++
++void mxc_spdc_fb_set_waveform_modes(struct mxcfb_waveform_modes *modes,
++						struct fb_info *info);
++int mxc_spdc_fb_set_temperature(int temperature, struct fb_info *info);
++int mxc_spdc_fb_set_auto_update(u32 auto_mode, struct fb_info *info);
++int mxc_spdc_fb_send_update(struct mxcfb_update_data *upd_data,
++				   struct fb_info *info);
++int mxc_spdc_fb_wait_update_complete(
++				struct mxcfb_update_marker_data *marker_data,
++				struct fb_info *info);
++int mxc_spdc_fb_set_pwrdown_delay(u32 pwrdown_delay,
++					    struct fb_info *info);
++int mxc_spdc_get_pwrdown_delay(struct fb_info *info);
++int mxc_spdc_fb_set_upd_scheme(u32 upd_scheme, struct fb_info *info);
++#endif
+diff --git a/include/linux/mxcfb_epdc_kernel.h b/include/linux/mxcfb_epdc_kernel.h
+deleted file mode 100644
+index 06fea6f..0000000
+--- a/include/linux/mxcfb_epdc_kernel.h
++++ /dev/null
+@@ -1,49 +0,0 @@
+-/*
+- * Copyright (C) 2010-2012 Freescale Semiconductor, Inc. All Rights Reserved.
+- *
+- * 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.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+- *
+- */
+-#ifndef _MXCFB_EPDC_KERNEL
+-#define _MXCFB_EPDC_KERNEL
+-
+-void mxc_epdc_fb_set_waveform_modes(struct mxcfb_waveform_modes *modes,
+-						struct fb_info *info);
+-int mxc_epdc_fb_set_temperature(int temperature, struct fb_info *info);
+-int mxc_epdc_fb_set_auto_update(u32 auto_mode, struct fb_info *info);
+-int mxc_epdc_fb_send_update(struct mxcfb_update_data *upd_data,
+-				   struct fb_info *info);
+-int mxc_epdc_fb_wait_update_complete(
+-				struct mxcfb_update_marker_data *marker_data,
+-				struct fb_info *info);
+-int mxc_epdc_fb_set_pwrdown_delay(u32 pwrdown_delay,
+-					    struct fb_info *info);
+-int mxc_epdc_get_pwrdown_delay(struct fb_info *info);
+-int mxc_epdc_fb_set_upd_scheme(u32 upd_scheme, struct fb_info *info);
+-
+-void mxc_spdc_fb_set_waveform_modes(struct mxcfb_waveform_modes *modes,
+-						struct fb_info *info);
+-int mxc_spdc_fb_set_temperature(int temperature, struct fb_info *info);
+-int mxc_spdc_fb_set_auto_update(u32 auto_mode, struct fb_info *info);
+-int mxc_spdc_fb_send_update(struct mxcfb_update_data *upd_data,
+-				   struct fb_info *info);
+-int mxc_spdc_fb_wait_update_complete(
+-				struct mxcfb_update_marker_data *marker_data,
+-				struct fb_info *info);
+-int mxc_spdc_fb_set_pwrdown_delay(u32 pwrdown_delay,
+-					    struct fb_info *info);
+-int mxc_spdc_get_pwrdown_delay(struct fb_info *info);
+-int mxc_spdc_fb_set_upd_scheme(u32 upd_scheme, struct fb_info *info);
+-#endif
+-- 
+1.8.4.rc3
+
diff --git a/recipes-kernel/linux/linux-cubox-i-3.0.35/fix-install-breakage-for-fw-images.patch b/recipes-kernel/linux/linux-cubox-i-3.0.35/fix-install-breakage-for-fw-images.patch
new file mode 100644
index 0000000..86d4c37
--- /dev/null
+++ b/recipes-kernel/linux/linux-cubox-i-3.0.35/fix-install-breakage-for-fw-images.patch
@@ -0,0 +1,32 @@ 
+From f6a15304bc2730ba091eb747c413d4ef4124565e Mon Sep 17 00:00:00 2001
+From: Denys Dmytriyenko <denys at ti.com>
+Date: Mon, 5 Mar 2012 16:34:53 -0500
+Subject: [PATCH] Makefile.fwinst: fix install breakage for FW images residing
+ in firmware/ dir
+
+This fixes below error found on some distros (Gentoo and Fedora):
+*** No rule to make target `lib/firmware/./', needed by `lib/firmware/ti_3410.fw'.  Stop.
+
+Upstream-Status: Pending
+
+Signed-off-by: Denys Dmytriyenko <denys at ti.com>
+---
+ scripts/Makefile.fwinst |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/scripts/Makefile.fwinst b/scripts/Makefile.fwinst
+index 6bf8e87..4d908d1 100644
+--- a/scripts/Makefile.fwinst
++++ b/scripts/Makefile.fwinst
+@@ -27,7 +27,7 @@ endif
+ installed-mod-fw := $(addprefix $(INSTALL_FW_PATH)/,$(mod-fw))
+ 
+ installed-fw := $(addprefix $(INSTALL_FW_PATH)/,$(fw-shipped-all))
+-installed-fw-dirs := $(sort $(dir $(installed-fw))) $(INSTALL_FW_PATH)/.
++installed-fw-dirs := $(sort $(dir $(installed-fw))) $(INSTALL_FW_PATH)/./
+ 
+ # Workaround for make < 3.81, where .SECONDEXPANSION doesn't work.
+ PHONY += $(INSTALL_FW_PATH)/$$(%) install-all-dirs
+-- 
+1.7.8.5
+
diff --git a/recipes-kernel/linux/linux-cubox-i-3.0.35/mxc_hdmi-dont-require-cea-mode.patch b/recipes-kernel/linux/linux-cubox-i-3.0.35/mxc_hdmi-dont-require-cea-mode.patch
new file mode 100644
index 0000000..99d7f0c
--- /dev/null
+++ b/recipes-kernel/linux/linux-cubox-i-3.0.35/mxc_hdmi-dont-require-cea-mode.patch
@@ -0,0 +1,25 @@ 
+This fixes problems with DVI monitors connected to the HDMI port
+via a DVI <-> HDMI cable. With dvi monitors, the list of CEA modes
+is always zero, preventing modes higher than 1024x768 to be used.
+This patch disables the CEA mode check.
+
+Upstream-Status: Pending
+
+diff --git a/drivers/video/mxc_hdmi.c b/drivers/video/mxc_hdmi.c
+index 544f352..fa67128 100644
+--- a/drivers/video/mxc_hdmi.c
++++ b/drivers/video/mxc_hdmi.c
+@@ -1804,10 +1804,10 @@ static void mxc_hdmi_edid_rebuild_modelist(struct mxc_hdmi *hdmi)
+ 		 */
+ 		mode = &hdmi->fbi->monspecs.modedb[i];
+ 
+-		if (!(mode->vmode & FB_VMODE_INTERLACED) &&
+-				(mxc_edid_mode_to_vic(mode) != 0)) {
++		if (!(mode->vmode & FB_VMODE_INTERLACED)) {
++			int vic = mxc_edid_mode_to_vic(mode);
+ 
+-			dev_dbg(&hdmi->pdev->dev, "Added mode %d:", i);
++			dev_dbg(&hdmi->pdev->dev, "%s: Added mode %d(VIC %u):", __func__, i, vic);
+ 			dev_dbg(&hdmi->pdev->dev,
+ 				"xres = %d, yres = %d, freq = %d, vmode = %d, flag = %d\n",
+ 				hdmi->fbi->monspecs.modedb[i].xres,
diff --git a/recipes-kernel/linux/linux-cubox-i_3.0.35.bb b/recipes-kernel/linux/linux-cubox-i_3.0.35.bb
new file mode 100644
index 0000000..eb1cd81
--- /dev/null
+++ b/recipes-kernel/linux/linux-cubox-i_3.0.35.bb
@@ -0,0 +1,23 @@ 
+include recipes-kernel/linux/linux-imx.inc
+
+SRCREV = "be699c6777f376b5f28e60d8d65942ac94b39908"
+LOCALVERSION_cubox = "-4.1.0-cubox-i+yocto"
+SRCBRANCH ?= "imx_3.0.35_4.1.0"
+
+# The added patches are the ones from linux-imx 3.0.35 , with exception of these which
+# are already included in the kernel repository:
+#   drm-vivante-Add-00-sufix-in-returned-bus-Id.patch
+#   0001-perf-tools-Fix-getrusage-related-build-failure-on-gl.patch
+SRC_URI = "git://github.com/SolidRun/linux-imx6.git;branch=${SRCBRANCH} \
+           file://defconfig \
+           file://epdc-Rename-mxcfb_epdc_kernel.h-to-mxc_epdc.h.patch \
+           file://0002-ARM-7668-1-fix-memset-related-crashes-caused-by-rece.patch \
+           file://0003-ARM-7670-1-fix-the-memset-fix.patch \
+           file://0004-ENGR00271136-Fix-build-break-when-CONFIG_CLK_DEBUG-i.patch \
+           file://0005-ENGR00271359-Add-Multi-touch-support.patch \
+           file://0006-Add-support-for-DVI-monitors.patch \
+           file://0007-ARM-mach-mx6-board-mx6q_sabresd-Register-SDHC3-first.patch \
+           file://mxc_hdmi-dont-require-cea-mode.patch \
+           file://fix-install-breakage-for-fw-images.patch"
+
+COMPATIBLE_MACHINE = "(cubox-i)"