diff --git a/core/linux-kirkwood/PKGBUILD b/core/linux-kirkwood/PKGBUILD index 7593c8072..4d5e04fa5 100644 --- a/core/linux-kirkwood/PKGBUILD +++ b/core/linux-kirkwood/PKGBUILD @@ -7,10 +7,10 @@ pkgbase=linux-kirkwood pkgname=('linux-kirkwood' 'linux-headers-kirkwood') #pkgname=linux-test # Build kernel with a different name _kernelname=${pkgname#linux} -_basekernel=3.4.7 +_basekernel=3.5.1 pkgver=${_basekernel} pkgrel=0 -cryptover=1.4 +cryptover=1.5 arch=('arm') url="http://www.kernel.org/" license=('GPL2') @@ -19,21 +19,21 @@ options=('!strip') source=("ftp://ftp.kernel.org/pub/linux/kernel/v3.x/linux-${_basekernel}.tar.bz2" 'archlinuxarm.patch' 'support.patch' - 'aufs3-3.4.patch.xz' + 'aufs3.5-patch.xz' 'config' 'mach-types::http://www.arm.linux.org.uk/developer/machines/download.php' 'change-default-console-loglevel.patch' 'usb-add-reset-resume-quirk-for-several-webcams.patch' "http://download.gna.org/cryptodev-linux/cryptodev-linux-${cryptover}.tar.gz") -md5sums=('006c874fe8169b1b1d783551ef3e7ac9' - 'cb59c253388108d0a1d4ab33167847e1' +md5sums=('d59404c0828d8f52540bb670246ca8b3' + '878106d4eb87650b92c94da6dc55359e' 'f5d3635da03cb45904bedd69b47133de' - '852ba24ebd20ca85f8bbee03243ccf91' - '4cf4bf5db2acb94a5b73fb7e2047c369' - '6ac08372b29e1b0a2a7f94f863de451a' + '227356bd0efdc6b9a6925d46b3701141' + '16a089a35649c4f98c079346464a1834' + '3df59cf78eaadec44a858949e1ca17d4' '9d3c56a4b999c8bfbd4018089a62f662' 'd00814b57448895e65fbbc800e8a58ba' - '7b0ac1c0a88d8fbe7316db02f21666e6') + '3a4b8d23c1708283e29477931d63ffb8') build() { cd "${srcdir}/linux-${_basekernel}" @@ -48,7 +48,7 @@ build() { cp "${srcdir}/mach-types" arch/arm/tools # Add AUFS3 patches - patch -Np1 -i "${srcdir}/aufs3-3.4.patch" + patch -Np1 -i "${srcdir}/aufs3.5-patch" # add latest fixes from stable queue, if needed # http://git.kernel.org/?p=linux/kernel/git/stable/stable-queue.git diff --git a/core/linux-kirkwood/archlinuxarm.patch b/core/linux-kirkwood/archlinuxarm.patch index 30b960360..5f7c44d03 100644 --- a/core/linux-kirkwood/archlinuxarm.patch +++ b/core/linux-kirkwood/archlinuxarm.patch @@ -1,26 +1,18 @@ diff -urN a/arch/arm/mach-kirkwood/dockstar-setup.c b/arch/arm/mach-kirkwood/dockstar-setup.c ---- a/arch/arm/mach-kirkwood/dockstar-setup.c 2012-05-20 18:29:13.000000000 -0400 -+++ b/arch/arm/mach-kirkwood/dockstar-setup.c 2012-05-24 12:02:12.000000000 -0400 -@@ -19,7 +19,6 @@ - #include - #include - #include --#include - #include "common.h" - #include "mpp.h" - -@@ -33,6 +32,10 @@ - .offset = MTDPART_OFS_NXTBLK, - .size = SZ_4M +--- a/arch/arm/mach-kirkwood/dockstar-setup.c 2012-08-09 11:23:56.000000000 -0400 ++++ b/arch/arm/mach-kirkwood/dockstar-setup.c 2012-08-10 10:47:31.000000000 -0400 +@@ -29,6 +29,10 @@ + .offset = 0, + .size = SZ_1M }, { + .name = "pogoplug", + .offset = MTDPART_OFS_NXTBLK, + .size = SZ_32M + }, { - .name = "root", + .name = "uImage", .offset = MTDPART_OFS_NXTBLK, - .size = MTDPART_SIZ_FULL -@@ -45,17 +48,17 @@ + .size = SZ_4M +@@ -45,17 +49,17 @@ static struct gpio_led dockstar_led_pins[] = { { @@ -41,21 +33,21 @@ diff -urN a/arch/arm/mach-kirkwood/dockstar-setup.c b/arch/arm/mach-kirkwood/doc }; static struct gpio_led_platform_data dockstar_led_data = { -@@ -73,8 +76,8 @@ +@@ -73,8 +77,8 @@ static unsigned int dockstar_mpp_config[] __initdata = { MPP29_GPIO, /* USB Power Enable */ - MPP46_GPIO, /* LED green */ - MPP47_GPIO, /* LED orange */ -+ MPP47_GPIO, /* LED Orange */ + MPP46_GPIO, /* LED Green */ ++ MPP47_GPIO, /* LED Orange */ 0 }; diff -urN a/arch/arm/mach-kirkwood/goflexhome-setup.c b/arch/arm/mach-kirkwood/goflexhome-setup.c --- a/arch/arm/mach-kirkwood/goflexhome-setup.c 1969-12-31 19:00:00.000000000 -0500 -+++ b/arch/arm/mach-kirkwood/goflexhome-setup.c 2012-05-24 12:02:12.000000000 -0400 -@@ -0,0 +1,123 @@ ++++ b/arch/arm/mach-kirkwood/goflexhome-setup.c 2012-08-10 11:00:53.000000000 -0400 +@@ -0,0 +1,124 @@ +/* + * arch/arm/mach-kirkwood/goflexhome-setup.c + * @@ -177,12 +169,13 @@ diff -urN a/arch/arm/mach-kirkwood/goflexhome-setup.c b/arch/arm/mach-kirkwood/g + .init_early = kirkwood_init_early, + .init_irq = kirkwood_init_irq, + .timer = &kirkwood_timer, ++ .restart = kirkwood_restart, +MACHINE_END + diff -urN a/arch/arm/mach-kirkwood/goflexnet-setup.c b/arch/arm/mach-kirkwood/goflexnet-setup.c --- a/arch/arm/mach-kirkwood/goflexnet-setup.c 1969-12-31 19:00:00.000000000 -0500 -+++ b/arch/arm/mach-kirkwood/goflexnet-setup.c 2012-05-24 12:02:12.000000000 -0400 -@@ -0,0 +1,176 @@ ++++ b/arch/arm/mach-kirkwood/goflexnet-setup.c 2012-08-10 11:01:57.000000000 -0400 +@@ -0,0 +1,177 @@ +/* + * arch/arm/mach-kirkwood/goflexnet-setup.c + * @@ -357,11 +350,12 @@ diff -urN a/arch/arm/mach-kirkwood/goflexnet-setup.c b/arch/arm/mach-kirkwood/go + .init_early = kirkwood_init_early, + .init_irq = kirkwood_init_irq, + .timer = &kirkwood_timer, ++ .restart = kirkwood_restart, +MACHINE_END + diff -urN a/arch/arm/mach-kirkwood/guruplug-setup.c b/arch/arm/mach-kirkwood/guruplug-setup.c ---- a/arch/arm/mach-kirkwood/guruplug-setup.c 2012-05-20 18:29:13.000000000 -0400 -+++ b/arch/arm/mach-kirkwood/guruplug-setup.c 2012-05-24 12:02:12.000000000 -0400 +--- a/arch/arm/mach-kirkwood/guruplug-setup.c 2012-08-09 11:23:56.000000000 -0400 ++++ b/arch/arm/mach-kirkwood/guruplug-setup.c 2012-08-10 11:03:53.000000000 -0400 @@ -57,22 +57,24 @@ static struct gpio_led guruplug_led_pins[] = { @@ -393,8 +387,8 @@ diff -urN a/arch/arm/mach-kirkwood/guruplug-setup.c b/arch/arm/mach-kirkwood/gur }, diff -urN a/arch/arm/mach-kirkwood/iconnect-setup.c b/arch/arm/mach-kirkwood/iconnect-setup.c --- a/arch/arm/mach-kirkwood/iconnect-setup.c 1969-12-31 19:00:00.000000000 -0500 -+++ b/arch/arm/mach-kirkwood/iconnect-setup.c 2012-05-24 12:02:12.000000000 -0400 -@@ -0,0 +1,203 @@ ++++ b/arch/arm/mach-kirkwood/iconnect-setup.c 2012-08-10 11:05:01.000000000 -0400 +@@ -0,0 +1,204 @@ +/* + * arch/arm/mach-kirkwood/iconnect-setup.c + * @@ -597,11 +591,12 @@ diff -urN a/arch/arm/mach-kirkwood/iconnect-setup.c b/arch/arm/mach-kirkwood/ico + .init_early = kirkwood_init_early, + .init_irq = kirkwood_init_irq, + .timer = &kirkwood_timer, ++ .restart = kirkwood_restart, +MACHINE_END diff -urN a/arch/arm/mach-kirkwood/ionics-stratus-setup.c b/arch/arm/mach-kirkwood/ionics-stratus-setup.c --- a/arch/arm/mach-kirkwood/ionics-stratus-setup.c 1969-12-31 19:00:00.000000000 -0500 -+++ b/arch/arm/mach-kirkwood/ionics-stratus-setup.c 2012-05-24 12:02:12.000000000 -0400 -@@ -0,0 +1,136 @@ ++++ b/arch/arm/mach-kirkwood/ionics-stratus-setup.c 2012-08-10 11:05:45.000000000 -0400 +@@ -0,0 +1,137 @@ +/* + * arch/arm/mach-kirkwood/ionics-stratus-setup.c + * @@ -737,11 +732,12 @@ diff -urN a/arch/arm/mach-kirkwood/ionics-stratus-setup.c b/arch/arm/mach-kirkwo + .init_early = kirkwood_init_early, + .init_irq = kirkwood_init_irq, + .timer = &kirkwood_timer, ++ .restart = kirkwood_restart, +MACHINE_END diff -urN a/arch/arm/mach-kirkwood/Kconfig b/arch/arm/mach-kirkwood/Kconfig ---- a/arch/arm/mach-kirkwood/Kconfig 2012-05-20 18:29:13.000000000 -0400 -+++ b/arch/arm/mach-kirkwood/Kconfig 2012-05-24 12:02:12.000000000 -0400 -@@ -78,6 +78,54 @@ +--- a/arch/arm/mach-kirkwood/Kconfig 2012-08-09 11:23:56.000000000 -0400 ++++ b/arch/arm/mach-kirkwood/Kconfig 2012-08-10 11:08:21.000000000 -0400 +@@ -100,6 +100,54 @@ Say 'Y' here if you want your kernel to support the Seagate FreeAgent DockStar. @@ -796,162 +792,9 @@ diff -urN a/arch/arm/mach-kirkwood/Kconfig b/arch/arm/mach-kirkwood/Kconfig config MACH_OPENRD bool -diff -urN a/arch/arm/mach-kirkwood/Kconfig.orig b/arch/arm/mach-kirkwood/Kconfig.orig ---- a/arch/arm/mach-kirkwood/Kconfig.orig 1969-12-31 19:00:00.000000000 -0500 -+++ b/arch/arm/mach-kirkwood/Kconfig.orig 2012-05-24 12:02:12.000000000 -0400 -@@ -0,0 +1,149 @@ -+if ARCH_KIRKWOOD -+ -+menu "Marvell Kirkwood Implementations" -+ -+config MACH_DB88F6281_BP -+ bool "Marvell DB-88F6281-BP Development Board" -+ help -+ Say 'Y' here if you want your kernel to support the -+ Marvell DB-88F6281-BP Development Board. -+ -+config MACH_RD88F6192_NAS -+ bool "Marvell RD-88F6192-NAS Reference Board" -+ help -+ Say 'Y' here if you want your kernel to support the -+ Marvell RD-88F6192-NAS Reference Board. -+ -+config MACH_RD88F6281 -+ bool "Marvell RD-88F6281 Reference Board" -+ help -+ Say 'Y' here if you want your kernel to support the -+ Marvell RD-88F6281 Reference Board. -+ -+config MACH_MV88F6281GTW_GE -+ bool "Marvell 88F6281 GTW GE Board" -+ help -+ Say 'Y' here if you want your kernel to support the -+ Marvell 88F6281 GTW GE Board. -+ -+config MACH_SHEEVAPLUG -+ bool "Marvell SheevaPlug Reference Board" -+ help -+ Say 'Y' here if you want your kernel to support the -+ Marvell SheevaPlug Reference Board. -+ -+config MACH_ESATA_SHEEVAPLUG -+ bool "Marvell eSATA SheevaPlug Reference Board" -+ help -+ Say 'Y' here if you want your kernel to support the -+ Marvell eSATA SheevaPlug Reference Board. -+ -+config MACH_GURUPLUG -+ bool "Marvell GuruPlug Reference Board" -+ help -+ Say 'Y' here if you want your kernel to support the -+ Marvell GuruPlug Reference Board. -+ -+config ARCH_KIRKWOOD_DT -+ bool "Marvell Kirkwood Flattened Device Tree" -+ select USE_OF -+ help -+ Say 'Y' here if you want your kernel to support the -+ Marvell Kirkwood using flattened device tree. -+ -+config MACH_DREAMPLUG_DT -+ bool "Marvell DreamPlug (Flattened Device Tree)" -+ select ARCH_KIRKWOOD_DT -+ help -+ Say 'Y' here if you want your kernel to support the -+ Marvell DreamPlug (Flattened Device Tree). -+ -+config MACH_TS219 -+ bool "QNAP TS-110, TS-119, TS-119P+, TS-210, TS-219, TS-219P and TS-219P+ Turbo NAS" -+ help -+ Say 'Y' here if you want your kernel to support the -+ QNAP TS-110, TS-119, TS-119P+, TS-210, TS-219, TS-219P and -+ TS-219P+ Turbo NAS devices. -+ -+config MACH_TS41X -+ bool "QNAP TS-410, TS-410U, TS-419P, TS-419P+ and TS-419U Turbo NAS" -+ help -+ Say 'Y' here if you want your kernel to support the -+ QNAP TS-410, TS-410U, TS-419P, TS-419P+ and TS-419U Turbo -+ NAS devices. -+ -+config MACH_DOCKSTAR -+ bool "Seagate FreeAgent DockStar" -+ help -+ Say 'Y' here if you want your kernel to support the -+ Seagate FreeAgent DockStar. -+ -+config MACH_OPENRD -+ bool -+ -+config MACH_OPENRD_BASE -+ bool "Marvell OpenRD Base Board" -+ select MACH_OPENRD -+ help -+ Say 'Y' here if you want your kernel to support the -+ Marvell OpenRD Base Board. -+ -+config MACH_OPENRD_CLIENT -+ bool "Marvell OpenRD Client Board" -+ select MACH_OPENRD -+ help -+ Say 'Y' here if you want your kernel to support the -+ Marvell OpenRD Client Board. -+ -+config MACH_OPENRD_ULTIMATE -+ bool "Marvell OpenRD Ultimate Board" -+ select MACH_OPENRD -+ help -+ Say 'Y' here if you want your kernel to support the -+ Marvell OpenRD Ultimate Board. -+ -+config MACH_NETSPACE_V2 -+ bool "LaCie Network Space v2 NAS Board" -+ help -+ Say 'Y' here if you want your kernel to support the -+ LaCie Network Space v2 NAS. -+ -+config MACH_INETSPACE_V2 -+ bool "LaCie Internet Space v2 NAS Board" -+ help -+ Say 'Y' here if you want your kernel to support the -+ LaCie Internet Space v2 NAS. -+ -+config MACH_NETSPACE_MAX_V2 -+ bool "LaCie Network Space Max v2 NAS Board" -+ help -+ Say 'Y' here if you want your kernel to support the -+ LaCie Network Space Max v2 NAS. -+ -+config MACH_D2NET_V2 -+ bool "LaCie d2 Network v2 NAS Board" -+ help -+ Say 'Y' here if you want your kernel to support the -+ LaCie d2 Network v2 NAS. -+ -+config MACH_NET2BIG_V2 -+ bool "LaCie 2Big Network v2 NAS Board" -+ help -+ Say 'Y' here if you want your kernel to support the -+ LaCie 2Big Network v2 NAS. -+ -+config MACH_NET5BIG_V2 -+ bool "LaCie 5Big Network v2 NAS Board" -+ help -+ Say 'Y' here if you want your kernel to support the -+ LaCie 5Big Network v2 NAS. -+ -+config MACH_T5325 -+ bool "HP t5325 Thin Client" -+ help -+ Say 'Y' here if you want your kernel to support the -+ HP t5325 Thin Client. -+ -+endmenu -+ -+endif diff -urN a/arch/arm/mach-kirkwood/Makefile b/arch/arm/mach-kirkwood/Makefile ---- a/arch/arm/mach-kirkwood/Makefile 2012-05-20 18:29:13.000000000 -0400 -+++ b/arch/arm/mach-kirkwood/Makefile 2012-05-24 12:02:12.000000000 -0400 +--- a/arch/arm/mach-kirkwood/Makefile 2012-08-09 11:23:56.000000000 -0400 ++++ b/arch/arm/mach-kirkwood/Makefile 2012-08-10 11:09:35.000000000 -0400 @@ -8,6 +8,14 @@ obj-$(CONFIG_MACH_ESATA_SHEEVAPLUG) += sheevaplug-setup.o obj-$(CONFIG_MACH_GURUPLUG) += guruplug-setup.o @@ -968,8 +811,8 @@ diff -urN a/arch/arm/mach-kirkwood/Makefile b/arch/arm/mach-kirkwood/Makefile obj-$(CONFIG_MACH_TS41X) += ts41x-setup.o tsx1x-common.o obj-$(CONFIG_MACH_OPENRD) += openrd-setup.o diff -urN a/arch/arm/mach-kirkwood/mpp.h b/arch/arm/mach-kirkwood/mpp.h ---- a/arch/arm/mach-kirkwood/mpp.h 2012-05-20 18:29:13.000000000 -0400 -+++ b/arch/arm/mach-kirkwood/mpp.h 2012-05-24 12:02:12.000000000 -0400 +--- a/arch/arm/mach-kirkwood/mpp.h 2012-08-09 11:23:56.000000000 -0400 ++++ b/arch/arm/mach-kirkwood/mpp.h 2012-08-10 11:10:55.000000000 -0400 @@ -102,7 +102,7 @@ #define MPP11_SATA0_ACTn MPP( 11, 0x5, 0, 0, 0, 1, 1, 1, 1 ) @@ -981,8 +824,8 @@ diff -urN a/arch/arm/mach-kirkwood/mpp.h b/arch/arm/mach-kirkwood/mpp.h #define MPP12_SPI_MOSI MPP( 12, 0xb, 0, 0, 0, 0, 0, 0, 1 ) diff -urN a/arch/arm/mach-kirkwood/nas6210-setup.c b/arch/arm/mach-kirkwood/nas6210-setup.c --- a/arch/arm/mach-kirkwood/nas6210-setup.c 1969-12-31 19:00:00.000000000 -0500 -+++ b/arch/arm/mach-kirkwood/nas6210-setup.c 2012-05-24 12:02:12.000000000 -0400 -@@ -0,0 +1,185 @@ ++++ b/arch/arm/mach-kirkwood/nas6210-setup.c 2012-08-10 11:12:03.000000000 -0400 +@@ -0,0 +1,186 @@ +/* + * arch/arm/mach-kirkwood/nas6210-setup.c + * @@ -1167,11 +1010,12 @@ diff -urN a/arch/arm/mach-kirkwood/nas6210-setup.c b/arch/arm/mach-kirkwood/nas6 + .init_early = kirkwood_init_early, + .init_irq = kirkwood_init_irq, + .timer = &kirkwood_timer, ++ .restart = kirkwood_restart, +MACHINE_END diff -urN a/arch/arm/mach-kirkwood/pogo_e02-setup.c b/arch/arm/mach-kirkwood/pogo_e02-setup.c --- a/arch/arm/mach-kirkwood/pogo_e02-setup.c 1969-12-31 19:00:00.000000000 -0500 -+++ b/arch/arm/mach-kirkwood/pogo_e02-setup.c 2012-05-24 12:02:12.000000000 -0400 -@@ -0,0 +1,114 @@ ++++ b/arch/arm/mach-kirkwood/pogo_e02-setup.c 2012-08-10 11:12:53.000000000 -0400 +@@ -0,0 +1,115 @@ +/* + * arch/arm/mach-kirkwood/pogo_e02-setup.c + * @@ -1285,11 +1129,12 @@ diff -urN a/arch/arm/mach-kirkwood/pogo_e02-setup.c b/arch/arm/mach-kirkwood/pog + .init_early = kirkwood_init_early, + .init_irq = kirkwood_init_irq, + .timer = &kirkwood_timer, ++ .restart = kirkwood_restart, +MACHINE_END diff -urN a/arch/arm/mach-kirkwood/pogoplugv4-setup.c b/arch/arm/mach-kirkwood/pogoplugv4-setup.c --- a/arch/arm/mach-kirkwood/pogoplugv4-setup.c 1969-12-31 19:00:00.000000000 -0500 -+++ b/arch/arm/mach-kirkwood/pogoplugv4-setup.c 2012-05-24 12:02:12.000000000 -0400 -@@ -0,0 +1,194 @@ ++++ b/arch/arm/mach-kirkwood/pogoplugv4-setup.c 2012-08-10 11:13:39.000000000 -0400 +@@ -0,0 +1,195 @@ +/* + * arch/arm/mach-kirkwood/pogoplugv4-setup.c + * @@ -1483,10 +1328,11 @@ diff -urN a/arch/arm/mach-kirkwood/pogoplugv4-setup.c b/arch/arm/mach-kirkwood/p + .init_early = kirkwood_init_early, + .init_irq = kirkwood_init_irq, + .timer = &kirkwood_timer, ++ .restart = kirkwood_restart, +MACHINE_END diff -urN a/arch/arm/mach-kirkwood/sheevaplug-setup.c b/arch/arm/mach-kirkwood/sheevaplug-setup.c ---- a/arch/arm/mach-kirkwood/sheevaplug-setup.c 2012-05-20 18:29:13.000000000 -0400 -+++ b/arch/arm/mach-kirkwood/sheevaplug-setup.c 2012-05-24 12:05:49.000000000 -0400 +--- a/arch/arm/mach-kirkwood/sheevaplug-setup.c 2012-08-09 11:23:56.000000000 -0400 ++++ b/arch/arm/mach-kirkwood/sheevaplug-setup.c 2012-08-10 11:19:35.000000000 -0400 @@ -43,7 +43,7 @@ .phy_addr = MV643XX_ETH_PHY_ADDR(0), }; @@ -1567,8 +1413,8 @@ diff -urN a/arch/arm/mach-kirkwood/sheevaplug-setup.c b/arch/arm/mach-kirkwood/s diff -urN a/arch/arm/mach-kirkwood/topkick-setup.c b/arch/arm/mach-kirkwood/topkick-setup.c --- a/arch/arm/mach-kirkwood/topkick-setup.c 1969-12-31 19:00:00.000000000 -0500 -+++ b/arch/arm/mach-kirkwood/topkick-setup.c 2012-05-24 12:02:12.000000000 -0400 -@@ -0,0 +1,164 @@ ++++ b/arch/arm/mach-kirkwood/topkick-setup.c 2012-08-10 11:20:38.000000000 -0400 +@@ -0,0 +1,165 @@ +/* + * arch/arm/mach-kirkwood/topkick-setup.c + * @@ -1732,11 +1578,12 @@ diff -urN a/arch/arm/mach-kirkwood/topkick-setup.c b/arch/arm/mach-kirkwood/topk + .init_early = kirkwood_init_early, + .init_irq = kirkwood_init_irq, + .timer = &kirkwood_timer, ++ .restart = kirkwood_restart, +MACHINE_END diff -urN a/arch/arm/plat-orion/common.c b/arch/arm/plat-orion/common.c ---- a/arch/arm/plat-orion/common.c 2012-05-20 18:29:13.000000000 -0400 -+++ b/arch/arm/plat-orion/common.c 2012-05-24 12:02:12.000000000 -0400 -@@ -222,7 +222,9 @@ +--- a/arch/arm/plat-orion/common.c 2012-08-09 11:23:56.000000000 -0400 ++++ b/arch/arm/plat-orion/common.c 2012-08-10 11:22:56.000000000 -0400 +@@ -252,7 +252,9 @@ /***************************************************************************** * GE00 ****************************************************************************/ @@ -1747,950 +1594,10 @@ diff -urN a/arch/arm/plat-orion/common.c b/arch/arm/plat-orion/common.c static struct resource orion_ge00_shared_resources[] = { { -diff -urN a/arch/arm/plat-orion/common.c.orig b/arch/arm/plat-orion/common.c.orig ---- a/arch/arm/plat-orion/common.c.orig 1969-12-31 19:00:00.000000000 -0500 -+++ b/arch/arm/plat-orion/common.c.orig 2012-05-24 12:02:12.000000000 -0400 -@@ -0,0 +1,936 @@ -+/* -+ * arch/arm/plat-orion/common.c -+ * -+ * Marvell Orion SoC common setup code used by multiple mach-/common.c -+ * -+ * This file is licensed under the terms of the GNU General Public -+ * License version 2. This program is licensed "as is" without any -+ * warranty of any kind, whether express or implied. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+/* Fill in the resources structure and link it into the platform -+ device structure. There is always a memory region, and nearly -+ always an interrupt.*/ -+static void fill_resources(struct platform_device *device, -+ struct resource *resources, -+ resource_size_t mapbase, -+ resource_size_t size, -+ unsigned int irq) -+{ -+ device->resource = resources; -+ device->num_resources = 1; -+ resources[0].flags = IORESOURCE_MEM; -+ resources[0].start = mapbase; -+ resources[0].end = mapbase + size; -+ -+ if (irq != NO_IRQ) { -+ device->num_resources++; -+ resources[1].flags = IORESOURCE_IRQ; -+ resources[1].start = irq; -+ resources[1].end = irq; -+ } -+} -+ -+/***************************************************************************** -+ * UART -+ ****************************************************************************/ -+static void __init uart_complete( -+ struct platform_device *orion_uart, -+ struct plat_serial8250_port *data, -+ struct resource *resources, -+ unsigned int membase, -+ resource_size_t mapbase, -+ unsigned int irq, -+ unsigned int uartclk) -+{ -+ data->mapbase = mapbase; -+ data->membase = (void __iomem *)membase; -+ data->irq = irq; -+ data->uartclk = uartclk; -+ orion_uart->dev.platform_data = data; -+ -+ fill_resources(orion_uart, resources, mapbase, 0xff, irq); -+ platform_device_register(orion_uart); -+} -+ -+/***************************************************************************** -+ * UART0 -+ ****************************************************************************/ -+static struct plat_serial8250_port orion_uart0_data[] = { -+ { -+ .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF, -+ .iotype = UPIO_MEM, -+ .regshift = 2, -+ }, { -+ }, -+}; -+ -+static struct resource orion_uart0_resources[2]; -+ -+static struct platform_device orion_uart0 = { -+ .name = "serial8250", -+ .id = PLAT8250_DEV_PLATFORM, -+}; -+ -+void __init orion_uart0_init(unsigned int membase, -+ resource_size_t mapbase, -+ unsigned int irq, -+ unsigned int uartclk) -+{ -+ uart_complete(&orion_uart0, orion_uart0_data, orion_uart0_resources, -+ membase, mapbase, irq, uartclk); -+} -+ -+/***************************************************************************** -+ * UART1 -+ ****************************************************************************/ -+static struct plat_serial8250_port orion_uart1_data[] = { -+ { -+ .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF, -+ .iotype = UPIO_MEM, -+ .regshift = 2, -+ }, { -+ }, -+}; -+ -+static struct resource orion_uart1_resources[2]; -+ -+static struct platform_device orion_uart1 = { -+ .name = "serial8250", -+ .id = PLAT8250_DEV_PLATFORM1, -+}; -+ -+void __init orion_uart1_init(unsigned int membase, -+ resource_size_t mapbase, -+ unsigned int irq, -+ unsigned int uartclk) -+{ -+ uart_complete(&orion_uart1, orion_uart1_data, orion_uart1_resources, -+ membase, mapbase, irq, uartclk); -+} -+ -+/***************************************************************************** -+ * UART2 -+ ****************************************************************************/ -+static struct plat_serial8250_port orion_uart2_data[] = { -+ { -+ .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF, -+ .iotype = UPIO_MEM, -+ .regshift = 2, -+ }, { -+ }, -+}; -+ -+static struct resource orion_uart2_resources[2]; -+ -+static struct platform_device orion_uart2 = { -+ .name = "serial8250", -+ .id = PLAT8250_DEV_PLATFORM2, -+}; -+ -+void __init orion_uart2_init(unsigned int membase, -+ resource_size_t mapbase, -+ unsigned int irq, -+ unsigned int uartclk) -+{ -+ uart_complete(&orion_uart2, orion_uart2_data, orion_uart2_resources, -+ membase, mapbase, irq, uartclk); -+} -+ -+/***************************************************************************** -+ * UART3 -+ ****************************************************************************/ -+static struct plat_serial8250_port orion_uart3_data[] = { -+ { -+ .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF, -+ .iotype = UPIO_MEM, -+ .regshift = 2, -+ }, { -+ }, -+}; -+ -+static struct resource orion_uart3_resources[2]; -+ -+static struct platform_device orion_uart3 = { -+ .name = "serial8250", -+ .id = 3, -+}; -+ -+void __init orion_uart3_init(unsigned int membase, -+ resource_size_t mapbase, -+ unsigned int irq, -+ unsigned int uartclk) -+{ -+ uart_complete(&orion_uart3, orion_uart3_data, orion_uart3_resources, -+ membase, mapbase, irq, uartclk); -+} -+ -+/***************************************************************************** -+ * SoC RTC -+ ****************************************************************************/ -+static struct resource orion_rtc_resource[2]; -+ -+void __init orion_rtc_init(unsigned long mapbase, -+ unsigned long irq) -+{ -+ orion_rtc_resource[0].start = mapbase; -+ orion_rtc_resource[0].end = mapbase + SZ_32 - 1; -+ orion_rtc_resource[0].flags = IORESOURCE_MEM; -+ orion_rtc_resource[1].start = irq; -+ orion_rtc_resource[1].end = irq; -+ orion_rtc_resource[1].flags = IORESOURCE_IRQ; -+ -+ platform_device_register_simple("rtc-mv", -1, orion_rtc_resource, 2); -+} -+ -+/***************************************************************************** -+ * GE -+ ****************************************************************************/ -+static __init void ge_complete( -+ struct mv643xx_eth_shared_platform_data *orion_ge_shared_data, -+ int tclk, -+ struct resource *orion_ge_resource, unsigned long irq, -+ struct platform_device *orion_ge_shared, -+ struct mv643xx_eth_platform_data *eth_data, -+ struct platform_device *orion_ge) -+{ -+ orion_ge_shared_data->t_clk = tclk; -+ orion_ge_resource->start = irq; -+ orion_ge_resource->end = irq; -+ eth_data->shared = orion_ge_shared; -+ orion_ge->dev.platform_data = eth_data; -+ -+ platform_device_register(orion_ge_shared); -+ platform_device_register(orion_ge); -+} -+ -+/***************************************************************************** -+ * GE00 -+ ****************************************************************************/ -+struct mv643xx_eth_shared_platform_data orion_ge00_shared_data; -+ -+static struct resource orion_ge00_shared_resources[] = { -+ { -+ .name = "ge00 base", -+ }, { -+ .name = "ge00 err irq", -+ }, -+}; -+ -+static struct platform_device orion_ge00_shared = { -+ .name = MV643XX_ETH_SHARED_NAME, -+ .id = 0, -+ .dev = { -+ .platform_data = &orion_ge00_shared_data, -+ }, -+}; -+ -+static struct resource orion_ge00_resources[] = { -+ { -+ .name = "ge00 irq", -+ .flags = IORESOURCE_IRQ, -+ }, -+}; -+ -+static struct platform_device orion_ge00 = { -+ .name = MV643XX_ETH_NAME, -+ .id = 0, -+ .num_resources = 1, -+ .resource = orion_ge00_resources, -+ .dev = { -+ .coherent_dma_mask = DMA_BIT_MASK(32), -+ }, -+}; -+ -+void __init orion_ge00_init(struct mv643xx_eth_platform_data *eth_data, -+ unsigned long mapbase, -+ unsigned long irq, -+ unsigned long irq_err, -+ int tclk) -+{ -+ fill_resources(&orion_ge00_shared, orion_ge00_shared_resources, -+ mapbase + 0x2000, SZ_16K - 1, irq_err); -+ ge_complete(&orion_ge00_shared_data, tclk, -+ orion_ge00_resources, irq, &orion_ge00_shared, -+ eth_data, &orion_ge00); -+} -+ -+/***************************************************************************** -+ * GE01 -+ ****************************************************************************/ -+struct mv643xx_eth_shared_platform_data orion_ge01_shared_data = { -+ .shared_smi = &orion_ge00_shared, -+}; -+ -+static struct resource orion_ge01_shared_resources[] = { -+ { -+ .name = "ge01 base", -+ }, { -+ .name = "ge01 err irq", -+ }, -+}; -+ -+static struct platform_device orion_ge01_shared = { -+ .name = MV643XX_ETH_SHARED_NAME, -+ .id = 1, -+ .dev = { -+ .platform_data = &orion_ge01_shared_data, -+ }, -+}; -+ -+static struct resource orion_ge01_resources[] = { -+ { -+ .name = "ge01 irq", -+ .flags = IORESOURCE_IRQ, -+ }, -+}; -+ -+static struct platform_device orion_ge01 = { -+ .name = MV643XX_ETH_NAME, -+ .id = 1, -+ .num_resources = 1, -+ .resource = orion_ge01_resources, -+ .dev = { -+ .coherent_dma_mask = DMA_BIT_MASK(32), -+ }, -+}; -+ -+void __init orion_ge01_init(struct mv643xx_eth_platform_data *eth_data, -+ unsigned long mapbase, -+ unsigned long irq, -+ unsigned long irq_err, -+ int tclk) -+{ -+ fill_resources(&orion_ge01_shared, orion_ge01_shared_resources, -+ mapbase + 0x2000, SZ_16K - 1, irq_err); -+ ge_complete(&orion_ge01_shared_data, tclk, -+ orion_ge01_resources, irq, &orion_ge01_shared, -+ eth_data, &orion_ge01); -+} -+ -+/***************************************************************************** -+ * GE10 -+ ****************************************************************************/ -+struct mv643xx_eth_shared_platform_data orion_ge10_shared_data = { -+ .shared_smi = &orion_ge00_shared, -+}; -+ -+static struct resource orion_ge10_shared_resources[] = { -+ { -+ .name = "ge10 base", -+ }, { -+ .name = "ge10 err irq", -+ }, -+}; -+ -+static struct platform_device orion_ge10_shared = { -+ .name = MV643XX_ETH_SHARED_NAME, -+ .id = 1, -+ .dev = { -+ .platform_data = &orion_ge10_shared_data, -+ }, -+}; -+ -+static struct resource orion_ge10_resources[] = { -+ { -+ .name = "ge10 irq", -+ .flags = IORESOURCE_IRQ, -+ }, -+}; -+ -+static struct platform_device orion_ge10 = { -+ .name = MV643XX_ETH_NAME, -+ .id = 1, -+ .num_resources = 2, -+ .resource = orion_ge10_resources, -+ .dev = { -+ .coherent_dma_mask = DMA_BIT_MASK(32), -+ }, -+}; -+ -+void __init orion_ge10_init(struct mv643xx_eth_platform_data *eth_data, -+ unsigned long mapbase, -+ unsigned long irq, -+ unsigned long irq_err, -+ int tclk) -+{ -+ fill_resources(&orion_ge10_shared, orion_ge10_shared_resources, -+ mapbase + 0x2000, SZ_16K - 1, irq_err); -+ ge_complete(&orion_ge10_shared_data, tclk, -+ orion_ge10_resources, irq, &orion_ge10_shared, -+ eth_data, &orion_ge10); -+} -+ -+/***************************************************************************** -+ * GE11 -+ ****************************************************************************/ -+struct mv643xx_eth_shared_platform_data orion_ge11_shared_data = { -+ .shared_smi = &orion_ge00_shared, -+}; -+ -+static struct resource orion_ge11_shared_resources[] = { -+ { -+ .name = "ge11 base", -+ }, { -+ .name = "ge11 err irq", -+ }, -+}; -+ -+static struct platform_device orion_ge11_shared = { -+ .name = MV643XX_ETH_SHARED_NAME, -+ .id = 1, -+ .dev = { -+ .platform_data = &orion_ge11_shared_data, -+ }, -+}; -+ -+static struct resource orion_ge11_resources[] = { -+ { -+ .name = "ge11 irq", -+ .flags = IORESOURCE_IRQ, -+ }, -+}; -+ -+static struct platform_device orion_ge11 = { -+ .name = MV643XX_ETH_NAME, -+ .id = 1, -+ .num_resources = 2, -+ .resource = orion_ge11_resources, -+ .dev = { -+ .coherent_dma_mask = DMA_BIT_MASK(32), -+ }, -+}; -+ -+void __init orion_ge11_init(struct mv643xx_eth_platform_data *eth_data, -+ unsigned long mapbase, -+ unsigned long irq, -+ unsigned long irq_err, -+ int tclk) -+{ -+ fill_resources(&orion_ge11_shared, orion_ge11_shared_resources, -+ mapbase + 0x2000, SZ_16K - 1, irq_err); -+ ge_complete(&orion_ge11_shared_data, tclk, -+ orion_ge11_resources, irq, &orion_ge11_shared, -+ eth_data, &orion_ge11); -+} -+ -+/***************************************************************************** -+ * Ethernet switch -+ ****************************************************************************/ -+static struct resource orion_switch_resources[] = { -+ { -+ .start = 0, -+ .end = 0, -+ .flags = IORESOURCE_IRQ, -+ }, -+}; -+ -+static struct platform_device orion_switch_device = { -+ .name = "dsa", -+ .id = 0, -+ .num_resources = 0, -+ .resource = orion_switch_resources, -+}; -+ -+void __init orion_ge00_switch_init(struct dsa_platform_data *d, int irq) -+{ -+ int i; -+ -+ if (irq != NO_IRQ) { -+ orion_switch_resources[0].start = irq; -+ orion_switch_resources[0].end = irq; -+ orion_switch_device.num_resources = 1; -+ } -+ -+ d->netdev = &orion_ge00.dev; -+ for (i = 0; i < d->nr_chips; i++) -+ d->chip[i].mii_bus = &orion_ge00_shared.dev; -+ orion_switch_device.dev.platform_data = d; -+ -+ platform_device_register(&orion_switch_device); -+} -+ -+/***************************************************************************** -+ * I2C -+ ****************************************************************************/ -+static struct mv64xxx_i2c_pdata orion_i2c_pdata = { -+ .freq_n = 3, -+ .timeout = 1000, /* Default timeout of 1 second */ -+}; -+ -+static struct resource orion_i2c_resources[2]; -+ -+static struct platform_device orion_i2c = { -+ .name = MV64XXX_I2C_CTLR_NAME, -+ .id = 0, -+ .dev = { -+ .platform_data = &orion_i2c_pdata, -+ }, -+}; -+ -+static struct mv64xxx_i2c_pdata orion_i2c_1_pdata = { -+ .freq_n = 3, -+ .timeout = 1000, /* Default timeout of 1 second */ -+}; -+ -+static struct resource orion_i2c_1_resources[2]; -+ -+static struct platform_device orion_i2c_1 = { -+ .name = MV64XXX_I2C_CTLR_NAME, -+ .id = 1, -+ .dev = { -+ .platform_data = &orion_i2c_1_pdata, -+ }, -+}; -+ -+void __init orion_i2c_init(unsigned long mapbase, -+ unsigned long irq, -+ unsigned long freq_m) -+{ -+ orion_i2c_pdata.freq_m = freq_m; -+ fill_resources(&orion_i2c, orion_i2c_resources, mapbase, -+ SZ_32 - 1, irq); -+ platform_device_register(&orion_i2c); -+} -+ -+void __init orion_i2c_1_init(unsigned long mapbase, -+ unsigned long irq, -+ unsigned long freq_m) -+{ -+ orion_i2c_1_pdata.freq_m = freq_m; -+ fill_resources(&orion_i2c_1, orion_i2c_1_resources, mapbase, -+ SZ_32 - 1, irq); -+ platform_device_register(&orion_i2c_1); -+} -+ -+/***************************************************************************** -+ * SPI -+ ****************************************************************************/ -+static struct orion_spi_info orion_spi_plat_data; -+static struct resource orion_spi_resources; -+ -+static struct platform_device orion_spi = { -+ .name = "orion_spi", -+ .id = 0, -+ .dev = { -+ .platform_data = &orion_spi_plat_data, -+ }, -+}; -+ -+static struct orion_spi_info orion_spi_1_plat_data; -+static struct resource orion_spi_1_resources; -+ -+static struct platform_device orion_spi_1 = { -+ .name = "orion_spi", -+ .id = 1, -+ .dev = { -+ .platform_data = &orion_spi_1_plat_data, -+ }, -+}; -+ -+/* Note: The SPI silicon core does have interrupts. However the -+ * current Linux software driver does not use interrupts. */ -+ -+void __init orion_spi_init(unsigned long mapbase, -+ unsigned long tclk) -+{ -+ orion_spi_plat_data.tclk = tclk; -+ fill_resources(&orion_spi, &orion_spi_resources, -+ mapbase, SZ_512 - 1, NO_IRQ); -+ platform_device_register(&orion_spi); -+} -+ -+void __init orion_spi_1_init(unsigned long mapbase, -+ unsigned long tclk) -+{ -+ orion_spi_1_plat_data.tclk = tclk; -+ fill_resources(&orion_spi_1, &orion_spi_1_resources, -+ mapbase, SZ_512 - 1, NO_IRQ); -+ platform_device_register(&orion_spi_1); -+} -+ -+/***************************************************************************** -+ * Watchdog -+ ****************************************************************************/ -+static struct orion_wdt_platform_data orion_wdt_data; -+ -+static struct resource orion_wdt_resource = -+ DEFINE_RES_MEM(TIMER_VIRT_BASE, 0x28); -+ -+static struct platform_device orion_wdt_device = { -+ .name = "orion_wdt", -+ .id = -1, -+ .dev = { -+ .platform_data = &orion_wdt_data, -+ }, -+ .resource = &orion_wdt_resource, -+ .num_resources = 1, -+}; -+ -+void __init orion_wdt_init(unsigned long tclk) -+{ -+ orion_wdt_data.tclk = tclk; -+ platform_device_register(&orion_wdt_device); -+} -+ -+/***************************************************************************** -+ * XOR -+ ****************************************************************************/ -+static u64 orion_xor_dmamask = DMA_BIT_MASK(32); -+ -+void __init orion_xor_init_channels( -+ struct mv_xor_platform_data *orion_xor0_data, -+ struct platform_device *orion_xor0_channel, -+ struct mv_xor_platform_data *orion_xor1_data, -+ struct platform_device *orion_xor1_channel) -+{ -+ /* -+ * two engines can't do memset simultaneously, this limitation -+ * satisfied by removing memset support from one of the engines. -+ */ -+ dma_cap_set(DMA_MEMCPY, orion_xor0_data->cap_mask); -+ dma_cap_set(DMA_XOR, orion_xor0_data->cap_mask); -+ platform_device_register(orion_xor0_channel); -+ -+ dma_cap_set(DMA_MEMCPY, orion_xor1_data->cap_mask); -+ dma_cap_set(DMA_MEMSET, orion_xor1_data->cap_mask); -+ dma_cap_set(DMA_XOR, orion_xor1_data->cap_mask); -+ platform_device_register(orion_xor1_channel); -+} -+ -+/***************************************************************************** -+ * XOR0 -+ ****************************************************************************/ -+static struct resource orion_xor0_shared_resources[] = { -+ { -+ .name = "xor 0 low", -+ .flags = IORESOURCE_MEM, -+ }, { -+ .name = "xor 0 high", -+ .flags = IORESOURCE_MEM, -+ }, -+}; -+ -+static struct platform_device orion_xor0_shared = { -+ .name = MV_XOR_SHARED_NAME, -+ .id = 0, -+ .num_resources = ARRAY_SIZE(orion_xor0_shared_resources), -+ .resource = orion_xor0_shared_resources, -+}; -+ -+static struct resource orion_xor00_resources[] = { -+ [0] = { -+ .flags = IORESOURCE_IRQ, -+ }, -+}; -+ -+static struct mv_xor_platform_data orion_xor00_data = { -+ .shared = &orion_xor0_shared, -+ .hw_id = 0, -+ .pool_size = PAGE_SIZE, -+}; -+ -+static struct platform_device orion_xor00_channel = { -+ .name = MV_XOR_NAME, -+ .id = 0, -+ .num_resources = ARRAY_SIZE(orion_xor00_resources), -+ .resource = orion_xor00_resources, -+ .dev = { -+ .dma_mask = &orion_xor_dmamask, -+ .coherent_dma_mask = DMA_BIT_MASK(64), -+ .platform_data = &orion_xor00_data, -+ }, -+}; -+ -+static struct resource orion_xor01_resources[] = { -+ [0] = { -+ .flags = IORESOURCE_IRQ, -+ }, -+}; -+ -+static struct mv_xor_platform_data orion_xor01_data = { -+ .shared = &orion_xor0_shared, -+ .hw_id = 1, -+ .pool_size = PAGE_SIZE, -+}; -+ -+static struct platform_device orion_xor01_channel = { -+ .name = MV_XOR_NAME, -+ .id = 1, -+ .num_resources = ARRAY_SIZE(orion_xor01_resources), -+ .resource = orion_xor01_resources, -+ .dev = { -+ .dma_mask = &orion_xor_dmamask, -+ .coherent_dma_mask = DMA_BIT_MASK(64), -+ .platform_data = &orion_xor01_data, -+ }, -+}; -+ -+void __init orion_xor0_init(unsigned long mapbase_low, -+ unsigned long mapbase_high, -+ unsigned long irq_0, -+ unsigned long irq_1) -+{ -+ orion_xor0_shared_resources[0].start = mapbase_low; -+ orion_xor0_shared_resources[0].end = mapbase_low + 0xff; -+ orion_xor0_shared_resources[1].start = mapbase_high; -+ orion_xor0_shared_resources[1].end = mapbase_high + 0xff; -+ -+ orion_xor00_resources[0].start = irq_0; -+ orion_xor00_resources[0].end = irq_0; -+ orion_xor01_resources[0].start = irq_1; -+ orion_xor01_resources[0].end = irq_1; -+ -+ platform_device_register(&orion_xor0_shared); -+ -+ orion_xor_init_channels(&orion_xor00_data, &orion_xor00_channel, -+ &orion_xor01_data, &orion_xor01_channel); -+} -+ -+/***************************************************************************** -+ * XOR1 -+ ****************************************************************************/ -+static struct resource orion_xor1_shared_resources[] = { -+ { -+ .name = "xor 1 low", -+ .flags = IORESOURCE_MEM, -+ }, { -+ .name = "xor 1 high", -+ .flags = IORESOURCE_MEM, -+ }, -+}; -+ -+static struct platform_device orion_xor1_shared = { -+ .name = MV_XOR_SHARED_NAME, -+ .id = 1, -+ .num_resources = ARRAY_SIZE(orion_xor1_shared_resources), -+ .resource = orion_xor1_shared_resources, -+}; -+ -+static struct resource orion_xor10_resources[] = { -+ [0] = { -+ .flags = IORESOURCE_IRQ, -+ }, -+}; -+ -+static struct mv_xor_platform_data orion_xor10_data = { -+ .shared = &orion_xor1_shared, -+ .hw_id = 0, -+ .pool_size = PAGE_SIZE, -+}; -+ -+static struct platform_device orion_xor10_channel = { -+ .name = MV_XOR_NAME, -+ .id = 2, -+ .num_resources = ARRAY_SIZE(orion_xor10_resources), -+ .resource = orion_xor10_resources, -+ .dev = { -+ .dma_mask = &orion_xor_dmamask, -+ .coherent_dma_mask = DMA_BIT_MASK(64), -+ .platform_data = &orion_xor10_data, -+ }, -+}; -+ -+static struct resource orion_xor11_resources[] = { -+ [0] = { -+ .flags = IORESOURCE_IRQ, -+ }, -+}; -+ -+static struct mv_xor_platform_data orion_xor11_data = { -+ .shared = &orion_xor1_shared, -+ .hw_id = 1, -+ .pool_size = PAGE_SIZE, -+}; -+ -+static struct platform_device orion_xor11_channel = { -+ .name = MV_XOR_NAME, -+ .id = 3, -+ .num_resources = ARRAY_SIZE(orion_xor11_resources), -+ .resource = orion_xor11_resources, -+ .dev = { -+ .dma_mask = &orion_xor_dmamask, -+ .coherent_dma_mask = DMA_BIT_MASK(64), -+ .platform_data = &orion_xor11_data, -+ }, -+}; -+ -+void __init orion_xor1_init(unsigned long mapbase_low, -+ unsigned long mapbase_high, -+ unsigned long irq_0, -+ unsigned long irq_1) -+{ -+ orion_xor1_shared_resources[0].start = mapbase_low; -+ orion_xor1_shared_resources[0].end = mapbase_low + 0xff; -+ orion_xor1_shared_resources[1].start = mapbase_high; -+ orion_xor1_shared_resources[1].end = mapbase_high + 0xff; -+ -+ orion_xor10_resources[0].start = irq_0; -+ orion_xor10_resources[0].end = irq_0; -+ orion_xor11_resources[0].start = irq_1; -+ orion_xor11_resources[0].end = irq_1; -+ -+ platform_device_register(&orion_xor1_shared); -+ -+ orion_xor_init_channels(&orion_xor10_data, &orion_xor10_channel, -+ &orion_xor11_data, &orion_xor11_channel); -+} -+ -+/***************************************************************************** -+ * EHCI -+ ****************************************************************************/ -+static struct orion_ehci_data orion_ehci_data; -+static u64 ehci_dmamask = DMA_BIT_MASK(32); -+ -+ -+/***************************************************************************** -+ * EHCI0 -+ ****************************************************************************/ -+static struct resource orion_ehci_resources[2]; -+ -+static struct platform_device orion_ehci = { -+ .name = "orion-ehci", -+ .id = 0, -+ .dev = { -+ .dma_mask = &ehci_dmamask, -+ .coherent_dma_mask = DMA_BIT_MASK(32), -+ .platform_data = &orion_ehci_data, -+ }, -+}; -+ -+void __init orion_ehci_init(unsigned long mapbase, -+ unsigned long irq, -+ enum orion_ehci_phy_ver phy_version) -+{ -+ orion_ehci_data.phy_version = phy_version; -+ fill_resources(&orion_ehci, orion_ehci_resources, mapbase, SZ_4K - 1, -+ irq); -+ -+ platform_device_register(&orion_ehci); -+} -+ -+/***************************************************************************** -+ * EHCI1 -+ ****************************************************************************/ -+static struct resource orion_ehci_1_resources[2]; -+ -+static struct platform_device orion_ehci_1 = { -+ .name = "orion-ehci", -+ .id = 1, -+ .dev = { -+ .dma_mask = &ehci_dmamask, -+ .coherent_dma_mask = DMA_BIT_MASK(32), -+ .platform_data = &orion_ehci_data, -+ }, -+}; -+ -+void __init orion_ehci_1_init(unsigned long mapbase, -+ unsigned long irq) -+{ -+ fill_resources(&orion_ehci_1, orion_ehci_1_resources, -+ mapbase, SZ_4K - 1, irq); -+ -+ platform_device_register(&orion_ehci_1); -+} -+ -+/***************************************************************************** -+ * EHCI2 -+ ****************************************************************************/ -+static struct resource orion_ehci_2_resources[2]; -+ -+static struct platform_device orion_ehci_2 = { -+ .name = "orion-ehci", -+ .id = 2, -+ .dev = { -+ .dma_mask = &ehci_dmamask, -+ .coherent_dma_mask = DMA_BIT_MASK(32), -+ .platform_data = &orion_ehci_data, -+ }, -+}; -+ -+void __init orion_ehci_2_init(unsigned long mapbase, -+ unsigned long irq) -+{ -+ fill_resources(&orion_ehci_2, orion_ehci_2_resources, -+ mapbase, SZ_4K - 1, irq); -+ -+ platform_device_register(&orion_ehci_2); -+} -+ -+/***************************************************************************** -+ * SATA -+ ****************************************************************************/ -+static struct resource orion_sata_resources[2] = { -+ { -+ .name = "sata base", -+ }, { -+ .name = "sata irq", -+ }, -+}; -+ -+static struct platform_device orion_sata = { -+ .name = "sata_mv", -+ .id = 0, -+ .dev = { -+ .coherent_dma_mask = DMA_BIT_MASK(32), -+ }, -+}; -+ -+void __init orion_sata_init(struct mv_sata_platform_data *sata_data, -+ unsigned long mapbase, -+ unsigned long irq) -+{ -+ orion_sata.dev.platform_data = sata_data; -+ fill_resources(&orion_sata, orion_sata_resources, -+ mapbase, 0x5000 - 1, irq); -+ -+ platform_device_register(&orion_sata); -+} -+ -+/***************************************************************************** -+ * Cryptographic Engines and Security Accelerator (CESA) -+ ****************************************************************************/ -+static struct resource orion_crypto_resources[] = { -+ { -+ .name = "regs", -+ }, { -+ .name = "crypto interrupt", -+ }, { -+ .name = "sram", -+ .flags = IORESOURCE_MEM, -+ }, -+}; -+ -+static struct platform_device orion_crypto = { -+ .name = "mv_crypto", -+ .id = -1, -+}; -+ -+void __init orion_crypto_init(unsigned long mapbase, -+ unsigned long srambase, -+ unsigned long sram_size, -+ unsigned long irq) -+{ -+ fill_resources(&orion_crypto, orion_crypto_resources, -+ mapbase, 0xffff, irq); -+ orion_crypto.num_resources = 3; -+ orion_crypto_resources[2].start = srambase; -+ orion_crypto_resources[2].end = srambase + sram_size - 1; -+ -+ platform_device_register(&orion_crypto); -+} diff -urN a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c ---- a/drivers/mmc/core/core.c 2012-05-20 18:29:13.000000000 -0400 -+++ b/drivers/mmc/core/core.c 2012-05-24 12:02:12.000000000 -0400 -@@ -536,7 +536,7 @@ +--- a/drivers/mmc/core/core.c 2012-08-09 11:23:56.000000000 -0400 ++++ b/drivers/mmc/core/core.c 2012-08-10 11:24:17.000000000 -0400 +@@ -537,7 +537,7 @@ */ limit_us = 3000000; else @@ -2700,8 +1607,8 @@ diff -urN a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c /* * SDHC cards always use these fixed values. diff -urN a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c ---- a/drivers/mmc/core/sd.c 2012-05-20 18:29:13.000000000 -0400 -+++ b/drivers/mmc/core/sd.c 2012-05-24 12:02:12.000000000 -0400 +--- a/drivers/mmc/core/sd.c 2012-08-09 11:23:56.000000000 -0400 ++++ b/drivers/mmc/core/sd.c 2012-08-10 11:25:11.000000000 -0400 @@ -389,6 +389,15 @@ return -ENOMEM; } @@ -2718,1267 +1625,18 @@ diff -urN a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c err = mmc_sd_switch(card, 1, 0, 1, status); if (err) goto out; -diff -urN a/drivers/mmc/core/sd.c.orig b/drivers/mmc/core/sd.c.orig ---- a/drivers/mmc/core/sd.c.orig 1969-12-31 19:00:00.000000000 -0500 -+++ b/drivers/mmc/core/sd.c.orig 2012-05-24 12:02:12.000000000 -0400 -@@ -0,0 +1,1245 @@ -+/* -+ * linux/drivers/mmc/core/sd.c -+ * -+ * Copyright (C) 2003-2004 Russell King, All Rights Reserved. -+ * SD support Copyright (C) 2004 Ian Molton, All Rights Reserved. -+ * Copyright (C) 2005-2007 Pierre Ossman, 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 version 2 as -+ * published by the Free Software Foundation. -+ */ -+ -+#include -+#include -+#include -+ -+#include -+#include -+#include -+#include -+ -+#include "core.h" -+#include "bus.h" -+#include "mmc_ops.h" -+#include "sd.h" -+#include "sd_ops.h" -+ -+static const unsigned int tran_exp[] = { -+ 10000, 100000, 1000000, 10000000, -+ 0, 0, 0, 0 -+}; -+ -+static const unsigned char tran_mant[] = { -+ 0, 10, 12, 13, 15, 20, 25, 30, -+ 35, 40, 45, 50, 55, 60, 70, 80, -+}; -+ -+static const unsigned int tacc_exp[] = { -+ 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, -+}; -+ -+static const unsigned int tacc_mant[] = { -+ 0, 10, 12, 13, 15, 20, 25, 30, -+ 35, 40, 45, 50, 55, 60, 70, 80, -+}; -+ -+#define UNSTUFF_BITS(resp,start,size) \ -+ ({ \ -+ const int __size = size; \ -+ const u32 __mask = (__size < 32 ? 1 << __size : 0) - 1; \ -+ const int __off = 3 - ((start) / 32); \ -+ const int __shft = (start) & 31; \ -+ u32 __res; \ -+ \ -+ __res = resp[__off] >> __shft; \ -+ if (__size + __shft > 32) \ -+ __res |= resp[__off-1] << ((32 - __shft) % 32); \ -+ __res & __mask; \ -+ }) -+ -+/* -+ * Given the decoded CSD structure, decode the raw CID to our CID structure. -+ */ -+void mmc_decode_cid(struct mmc_card *card) -+{ -+ u32 *resp = card->raw_cid; -+ -+ memset(&card->cid, 0, sizeof(struct mmc_cid)); -+ -+ /* -+ * SD doesn't currently have a version field so we will -+ * have to assume we can parse this. -+ */ -+ card->cid.manfid = UNSTUFF_BITS(resp, 120, 8); -+ card->cid.oemid = UNSTUFF_BITS(resp, 104, 16); -+ card->cid.prod_name[0] = UNSTUFF_BITS(resp, 96, 8); -+ card->cid.prod_name[1] = UNSTUFF_BITS(resp, 88, 8); -+ card->cid.prod_name[2] = UNSTUFF_BITS(resp, 80, 8); -+ card->cid.prod_name[3] = UNSTUFF_BITS(resp, 72, 8); -+ card->cid.prod_name[4] = UNSTUFF_BITS(resp, 64, 8); -+ card->cid.hwrev = UNSTUFF_BITS(resp, 60, 4); -+ card->cid.fwrev = UNSTUFF_BITS(resp, 56, 4); -+ card->cid.serial = UNSTUFF_BITS(resp, 24, 32); -+ card->cid.year = UNSTUFF_BITS(resp, 12, 8); -+ card->cid.month = UNSTUFF_BITS(resp, 8, 4); -+ -+ card->cid.year += 2000; /* SD cards year offset */ -+} -+ -+/* -+ * Given a 128-bit response, decode to our card CSD structure. -+ */ -+static int mmc_decode_csd(struct mmc_card *card) -+{ -+ struct mmc_csd *csd = &card->csd; -+ unsigned int e, m, csd_struct; -+ u32 *resp = card->raw_csd; -+ -+ csd_struct = UNSTUFF_BITS(resp, 126, 2); -+ -+ switch (csd_struct) { -+ case 0: -+ m = UNSTUFF_BITS(resp, 115, 4); -+ e = UNSTUFF_BITS(resp, 112, 3); -+ csd->tacc_ns = (tacc_exp[e] * tacc_mant[m] + 9) / 10; -+ csd->tacc_clks = UNSTUFF_BITS(resp, 104, 8) * 100; -+ -+ m = UNSTUFF_BITS(resp, 99, 4); -+ e = UNSTUFF_BITS(resp, 96, 3); -+ csd->max_dtr = tran_exp[e] * tran_mant[m]; -+ csd->cmdclass = UNSTUFF_BITS(resp, 84, 12); -+ -+ e = UNSTUFF_BITS(resp, 47, 3); -+ m = UNSTUFF_BITS(resp, 62, 12); -+ csd->capacity = (1 + m) << (e + 2); -+ -+ csd->read_blkbits = UNSTUFF_BITS(resp, 80, 4); -+ csd->read_partial = UNSTUFF_BITS(resp, 79, 1); -+ csd->write_misalign = UNSTUFF_BITS(resp, 78, 1); -+ csd->read_misalign = UNSTUFF_BITS(resp, 77, 1); -+ csd->r2w_factor = UNSTUFF_BITS(resp, 26, 3); -+ csd->write_blkbits = UNSTUFF_BITS(resp, 22, 4); -+ csd->write_partial = UNSTUFF_BITS(resp, 21, 1); -+ -+ if (UNSTUFF_BITS(resp, 46, 1)) { -+ csd->erase_size = 1; -+ } else if (csd->write_blkbits >= 9) { -+ csd->erase_size = UNSTUFF_BITS(resp, 39, 7) + 1; -+ csd->erase_size <<= csd->write_blkbits - 9; -+ } -+ break; -+ case 1: -+ /* -+ * This is a block-addressed SDHC or SDXC card. Most -+ * interesting fields are unused and have fixed -+ * values. To avoid getting tripped by buggy cards, -+ * we assume those fixed values ourselves. -+ */ -+ mmc_card_set_blockaddr(card); -+ -+ csd->tacc_ns = 0; /* Unused */ -+ csd->tacc_clks = 0; /* Unused */ -+ -+ m = UNSTUFF_BITS(resp, 99, 4); -+ e = UNSTUFF_BITS(resp, 96, 3); -+ csd->max_dtr = tran_exp[e] * tran_mant[m]; -+ csd->cmdclass = UNSTUFF_BITS(resp, 84, 12); -+ csd->c_size = UNSTUFF_BITS(resp, 48, 22); -+ -+ /* SDXC cards have a minimum C_SIZE of 0x00FFFF */ -+ if (csd->c_size >= 0xFFFF) -+ mmc_card_set_ext_capacity(card); -+ -+ m = UNSTUFF_BITS(resp, 48, 22); -+ csd->capacity = (1 + m) << 10; -+ -+ csd->read_blkbits = 9; -+ csd->read_partial = 0; -+ csd->write_misalign = 0; -+ csd->read_misalign = 0; -+ csd->r2w_factor = 4; /* Unused */ -+ csd->write_blkbits = 9; -+ csd->write_partial = 0; -+ csd->erase_size = 1; -+ break; -+ default: -+ pr_err("%s: unrecognised CSD structure version %d\n", -+ mmc_hostname(card->host), csd_struct); -+ return -EINVAL; -+ } -+ -+ card->erase_size = csd->erase_size; -+ -+ return 0; -+} -+ -+/* -+ * Given a 64-bit response, decode to our card SCR structure. -+ */ -+static int mmc_decode_scr(struct mmc_card *card) -+{ -+ struct sd_scr *scr = &card->scr; -+ unsigned int scr_struct; -+ u32 resp[4]; -+ -+ resp[3] = card->raw_scr[1]; -+ resp[2] = card->raw_scr[0]; -+ -+ scr_struct = UNSTUFF_BITS(resp, 60, 4); -+ if (scr_struct != 0) { -+ pr_err("%s: unrecognised SCR structure version %d\n", -+ mmc_hostname(card->host), scr_struct); -+ return -EINVAL; -+ } -+ -+ scr->sda_vsn = UNSTUFF_BITS(resp, 56, 4); -+ scr->bus_widths = UNSTUFF_BITS(resp, 48, 4); -+ if (scr->sda_vsn == SCR_SPEC_VER_2) -+ /* Check if Physical Layer Spec v3.0 is supported */ -+ scr->sda_spec3 = UNSTUFF_BITS(resp, 47, 1); -+ -+ if (UNSTUFF_BITS(resp, 55, 1)) -+ card->erased_byte = 0xFF; -+ else -+ card->erased_byte = 0x0; -+ -+ if (scr->sda_spec3) -+ scr->cmds = UNSTUFF_BITS(resp, 32, 2); -+ return 0; -+} -+ -+/* -+ * Fetch and process SD Status register. -+ */ -+static int mmc_read_ssr(struct mmc_card *card) -+{ -+ unsigned int au, es, et, eo; -+ int err, i; -+ u32 *ssr; -+ -+ if (!(card->csd.cmdclass & CCC_APP_SPEC)) { -+ pr_warning("%s: card lacks mandatory SD Status " -+ "function.\n", mmc_hostname(card->host)); -+ return 0; -+ } -+ -+ ssr = kmalloc(64, GFP_KERNEL); -+ if (!ssr) -+ return -ENOMEM; -+ -+ err = mmc_app_sd_status(card, ssr); -+ if (err) { -+ pr_warning("%s: problem reading SD Status " -+ "register.\n", mmc_hostname(card->host)); -+ err = 0; -+ goto out; -+ } -+ -+ for (i = 0; i < 16; i++) -+ ssr[i] = be32_to_cpu(ssr[i]); -+ -+ /* -+ * UNSTUFF_BITS only works with four u32s so we have to offset the -+ * bitfield positions accordingly. -+ */ -+ au = UNSTUFF_BITS(ssr, 428 - 384, 4); -+ if (au > 0 || au <= 9) { -+ card->ssr.au = 1 << (au + 4); -+ es = UNSTUFF_BITS(ssr, 408 - 384, 16); -+ et = UNSTUFF_BITS(ssr, 402 - 384, 6); -+ eo = UNSTUFF_BITS(ssr, 400 - 384, 2); -+ if (es && et) { -+ card->ssr.erase_timeout = (et * 1000) / es; -+ card->ssr.erase_offset = eo * 1000; -+ } -+ } else { -+ pr_warning("%s: SD Status: Invalid Allocation Unit " -+ "size.\n", mmc_hostname(card->host)); -+ } -+out: -+ kfree(ssr); -+ return err; -+} -+ -+/* -+ * Fetches and decodes switch information -+ */ -+static int mmc_read_switch(struct mmc_card *card) -+{ -+ int err; -+ u8 *status; -+ -+ if (card->scr.sda_vsn < SCR_SPEC_VER_1) -+ return 0; -+ -+ if (!(card->csd.cmdclass & CCC_SWITCH)) { -+ pr_warning("%s: card lacks mandatory switch " -+ "function, performance might suffer.\n", -+ mmc_hostname(card->host)); -+ return 0; -+ } -+ -+ err = -EIO; -+ -+ status = kmalloc(64, GFP_KERNEL); -+ if (!status) { -+ pr_err("%s: could not allocate a buffer for " -+ "switch capabilities.\n", -+ mmc_hostname(card->host)); -+ return -ENOMEM; -+ } -+ -+ /* Find out the supported Bus Speed Modes. */ -+ err = mmc_sd_switch(card, 0, 0, 1, status); -+ if (err) { -+ /* -+ * If the host or the card can't do the switch, -+ * fail more gracefully. -+ */ -+ if (err != -EINVAL && err != -ENOSYS && err != -EFAULT) -+ goto out; -+ -+ pr_warning("%s: problem reading Bus Speed modes.\n", -+ mmc_hostname(card->host)); -+ err = 0; -+ -+ goto out; -+ } -+ -+ if (status[13] & SD_MODE_HIGH_SPEED) -+ card->sw_caps.hs_max_dtr = HIGH_SPEED_MAX_DTR; -+ -+ if (card->scr.sda_spec3) { -+ card->sw_caps.sd3_bus_mode = status[13]; -+ -+ /* Find out Driver Strengths supported by the card */ -+ err = mmc_sd_switch(card, 0, 2, 1, status); -+ if (err) { -+ /* -+ * If the host or the card can't do the switch, -+ * fail more gracefully. -+ */ -+ if (err != -EINVAL && err != -ENOSYS && err != -EFAULT) -+ goto out; -+ -+ pr_warning("%s: problem reading " -+ "Driver Strength.\n", -+ mmc_hostname(card->host)); -+ err = 0; -+ -+ goto out; -+ } -+ -+ card->sw_caps.sd3_drv_type = status[9]; -+ -+ /* Find out Current Limits supported by the card */ -+ err = mmc_sd_switch(card, 0, 3, 1, status); -+ if (err) { -+ /* -+ * If the host or the card can't do the switch, -+ * fail more gracefully. -+ */ -+ if (err != -EINVAL && err != -ENOSYS && err != -EFAULT) -+ goto out; -+ -+ pr_warning("%s: problem reading " -+ "Current Limit.\n", -+ mmc_hostname(card->host)); -+ err = 0; -+ -+ goto out; -+ } -+ -+ card->sw_caps.sd3_curr_limit = status[7]; -+ } -+ -+out: -+ kfree(status); -+ -+ return err; -+} -+ -+/* -+ * Test if the card supports high-speed mode and, if so, switch to it. -+ */ -+int mmc_sd_switch_hs(struct mmc_card *card) -+{ -+ int err; -+ u8 *status; -+ -+ if (card->scr.sda_vsn < SCR_SPEC_VER_1) -+ return 0; -+ -+ if (!(card->csd.cmdclass & CCC_SWITCH)) -+ return 0; -+ -+ if (!(card->host->caps & MMC_CAP_SD_HIGHSPEED)) -+ return 0; -+ -+ if (card->sw_caps.hs_max_dtr == 0) -+ return 0; -+ -+ err = -EIO; -+ -+ status = kmalloc(64, GFP_KERNEL); -+ if (!status) { -+ pr_err("%s: could not allocate a buffer for " -+ "switch capabilities.\n", mmc_hostname(card->host)); -+ return -ENOMEM; -+ } -+ -+ err = mmc_sd_switch(card, 1, 0, 1, status); -+ if (err) -+ goto out; -+ -+ if ((status[16] & 0xF) != 1) { -+ pr_warning("%s: Problem switching card " -+ "into high-speed mode!\n", -+ mmc_hostname(card->host)); -+ err = 0; -+ } else { -+ err = 1; -+ } -+ -+out: -+ kfree(status); -+ -+ return err; -+} -+ -+static int sd_select_driver_type(struct mmc_card *card, u8 *status) -+{ -+ int host_drv_type = SD_DRIVER_TYPE_B; -+ int card_drv_type = SD_DRIVER_TYPE_B; -+ int drive_strength; -+ int err; -+ -+ /* -+ * If the host doesn't support any of the Driver Types A,C or D, -+ * or there is no board specific handler then default Driver -+ * Type B is used. -+ */ -+ if (!(card->host->caps & (MMC_CAP_DRIVER_TYPE_A | MMC_CAP_DRIVER_TYPE_C -+ | MMC_CAP_DRIVER_TYPE_D))) -+ return 0; -+ -+ if (!card->host->ops->select_drive_strength) -+ return 0; -+ -+ if (card->host->caps & MMC_CAP_DRIVER_TYPE_A) -+ host_drv_type |= SD_DRIVER_TYPE_A; -+ -+ if (card->host->caps & MMC_CAP_DRIVER_TYPE_C) -+ host_drv_type |= SD_DRIVER_TYPE_C; -+ -+ if (card->host->caps & MMC_CAP_DRIVER_TYPE_D) -+ host_drv_type |= SD_DRIVER_TYPE_D; -+ -+ if (card->sw_caps.sd3_drv_type & SD_DRIVER_TYPE_A) -+ card_drv_type |= SD_DRIVER_TYPE_A; -+ -+ if (card->sw_caps.sd3_drv_type & SD_DRIVER_TYPE_C) -+ card_drv_type |= SD_DRIVER_TYPE_C; -+ -+ if (card->sw_caps.sd3_drv_type & SD_DRIVER_TYPE_D) -+ card_drv_type |= SD_DRIVER_TYPE_D; -+ -+ /* -+ * The drive strength that the hardware can support -+ * depends on the board design. Pass the appropriate -+ * information and let the hardware specific code -+ * return what is possible given the options -+ */ -+ mmc_host_clk_hold(card->host); -+ drive_strength = card->host->ops->select_drive_strength( -+ card->sw_caps.uhs_max_dtr, -+ host_drv_type, card_drv_type); -+ mmc_host_clk_release(card->host); -+ -+ err = mmc_sd_switch(card, 1, 2, drive_strength, status); -+ if (err) -+ return err; -+ -+ if ((status[15] & 0xF) != drive_strength) { -+ pr_warning("%s: Problem setting drive strength!\n", -+ mmc_hostname(card->host)); -+ return 0; -+ } -+ -+ mmc_set_driver_type(card->host, drive_strength); -+ -+ return 0; -+} -+ -+static void sd_update_bus_speed_mode(struct mmc_card *card) -+{ -+ /* -+ * If the host doesn't support any of the UHS-I modes, fallback on -+ * default speed. -+ */ -+ if (!(card->host->caps & (MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25 | -+ MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_SDR104 | MMC_CAP_UHS_DDR50))) { -+ card->sd_bus_speed = 0; -+ return; -+ } -+ -+ if ((card->host->caps & MMC_CAP_UHS_SDR104) && -+ (card->sw_caps.sd3_bus_mode & SD_MODE_UHS_SDR104)) { -+ card->sd_bus_speed = UHS_SDR104_BUS_SPEED; -+ } else if ((card->host->caps & MMC_CAP_UHS_DDR50) && -+ (card->sw_caps.sd3_bus_mode & SD_MODE_UHS_DDR50)) { -+ card->sd_bus_speed = UHS_DDR50_BUS_SPEED; -+ } else if ((card->host->caps & (MMC_CAP_UHS_SDR104 | -+ MMC_CAP_UHS_SDR50)) && (card->sw_caps.sd3_bus_mode & -+ SD_MODE_UHS_SDR50)) { -+ card->sd_bus_speed = UHS_SDR50_BUS_SPEED; -+ } else if ((card->host->caps & (MMC_CAP_UHS_SDR104 | -+ MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_SDR25)) && -+ (card->sw_caps.sd3_bus_mode & SD_MODE_UHS_SDR25)) { -+ card->sd_bus_speed = UHS_SDR25_BUS_SPEED; -+ } else if ((card->host->caps & (MMC_CAP_UHS_SDR104 | -+ MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_SDR25 | -+ MMC_CAP_UHS_SDR12)) && (card->sw_caps.sd3_bus_mode & -+ SD_MODE_UHS_SDR12)) { -+ card->sd_bus_speed = UHS_SDR12_BUS_SPEED; -+ } -+} -+ -+static int sd_set_bus_speed_mode(struct mmc_card *card, u8 *status) -+{ -+ int err; -+ unsigned int timing = 0; -+ -+ switch (card->sd_bus_speed) { -+ case UHS_SDR104_BUS_SPEED: -+ timing = MMC_TIMING_UHS_SDR104; -+ card->sw_caps.uhs_max_dtr = UHS_SDR104_MAX_DTR; -+ break; -+ case UHS_DDR50_BUS_SPEED: -+ timing = MMC_TIMING_UHS_DDR50; -+ card->sw_caps.uhs_max_dtr = UHS_DDR50_MAX_DTR; -+ break; -+ case UHS_SDR50_BUS_SPEED: -+ timing = MMC_TIMING_UHS_SDR50; -+ card->sw_caps.uhs_max_dtr = UHS_SDR50_MAX_DTR; -+ break; -+ case UHS_SDR25_BUS_SPEED: -+ timing = MMC_TIMING_UHS_SDR25; -+ card->sw_caps.uhs_max_dtr = UHS_SDR25_MAX_DTR; -+ break; -+ case UHS_SDR12_BUS_SPEED: -+ timing = MMC_TIMING_UHS_SDR12; -+ card->sw_caps.uhs_max_dtr = UHS_SDR12_MAX_DTR; -+ break; -+ default: -+ return 0; -+ } -+ -+ err = mmc_sd_switch(card, 1, 0, card->sd_bus_speed, status); -+ if (err) -+ return err; -+ -+ if ((status[16] & 0xF) != card->sd_bus_speed) -+ pr_warning("%s: Problem setting bus speed mode!\n", -+ mmc_hostname(card->host)); -+ else { -+ mmc_set_timing(card->host, timing); -+ mmc_set_clock(card->host, card->sw_caps.uhs_max_dtr); -+ } -+ -+ return 0; -+} -+ -+static int sd_set_current_limit(struct mmc_card *card, u8 *status) -+{ -+ int current_limit = 0; -+ int err; -+ -+ /* -+ * Current limit switch is only defined for SDR50, SDR104, and DDR50 -+ * bus speed modes. For other bus speed modes, we set the default -+ * current limit of 200mA. -+ */ -+ if ((card->sd_bus_speed == UHS_SDR50_BUS_SPEED) || -+ (card->sd_bus_speed == UHS_SDR104_BUS_SPEED) || -+ (card->sd_bus_speed == UHS_DDR50_BUS_SPEED)) { -+ if (card->host->caps & MMC_CAP_MAX_CURRENT_800) { -+ if (card->sw_caps.sd3_curr_limit & SD_MAX_CURRENT_800) -+ current_limit = SD_SET_CURRENT_LIMIT_800; -+ else if (card->sw_caps.sd3_curr_limit & -+ SD_MAX_CURRENT_600) -+ current_limit = SD_SET_CURRENT_LIMIT_600; -+ else if (card->sw_caps.sd3_curr_limit & -+ SD_MAX_CURRENT_400) -+ current_limit = SD_SET_CURRENT_LIMIT_400; -+ else if (card->sw_caps.sd3_curr_limit & -+ SD_MAX_CURRENT_200) -+ current_limit = SD_SET_CURRENT_LIMIT_200; -+ } else if (card->host->caps & MMC_CAP_MAX_CURRENT_600) { -+ if (card->sw_caps.sd3_curr_limit & SD_MAX_CURRENT_600) -+ current_limit = SD_SET_CURRENT_LIMIT_600; -+ else if (card->sw_caps.sd3_curr_limit & -+ SD_MAX_CURRENT_400) -+ current_limit = SD_SET_CURRENT_LIMIT_400; -+ else if (card->sw_caps.sd3_curr_limit & -+ SD_MAX_CURRENT_200) -+ current_limit = SD_SET_CURRENT_LIMIT_200; -+ } else if (card->host->caps & MMC_CAP_MAX_CURRENT_400) { -+ if (card->sw_caps.sd3_curr_limit & SD_MAX_CURRENT_400) -+ current_limit = SD_SET_CURRENT_LIMIT_400; -+ else if (card->sw_caps.sd3_curr_limit & -+ SD_MAX_CURRENT_200) -+ current_limit = SD_SET_CURRENT_LIMIT_200; -+ } else if (card->host->caps & MMC_CAP_MAX_CURRENT_200) { -+ if (card->sw_caps.sd3_curr_limit & SD_MAX_CURRENT_200) -+ current_limit = SD_SET_CURRENT_LIMIT_200; -+ } -+ } else -+ current_limit = SD_SET_CURRENT_LIMIT_200; -+ -+ err = mmc_sd_switch(card, 1, 3, current_limit, status); -+ if (err) -+ return err; -+ -+ if (((status[15] >> 4) & 0x0F) != current_limit) -+ pr_warning("%s: Problem setting current limit!\n", -+ mmc_hostname(card->host)); -+ -+ return 0; -+} -+ -+/* -+ * UHS-I specific initialization procedure -+ */ -+static int mmc_sd_init_uhs_card(struct mmc_card *card) -+{ -+ int err; -+ u8 *status; -+ -+ if (!card->scr.sda_spec3) -+ return 0; -+ -+ if (!(card->csd.cmdclass & CCC_SWITCH)) -+ return 0; -+ -+ status = kmalloc(64, GFP_KERNEL); -+ if (!status) { -+ pr_err("%s: could not allocate a buffer for " -+ "switch capabilities.\n", mmc_hostname(card->host)); -+ return -ENOMEM; -+ } -+ -+ /* Set 4-bit bus width */ -+ if ((card->host->caps & MMC_CAP_4_BIT_DATA) && -+ (card->scr.bus_widths & SD_SCR_BUS_WIDTH_4)) { -+ err = mmc_app_set_bus_width(card, MMC_BUS_WIDTH_4); -+ if (err) -+ goto out; -+ -+ mmc_set_bus_width(card->host, MMC_BUS_WIDTH_4); -+ } -+ -+ /* -+ * Select the bus speed mode depending on host -+ * and card capability. -+ */ -+ sd_update_bus_speed_mode(card); -+ -+ /* Set the driver strength for the card */ -+ err = sd_select_driver_type(card, status); -+ if (err) -+ goto out; -+ -+ /* Set current limit for the card */ -+ err = sd_set_current_limit(card, status); -+ if (err) -+ goto out; -+ -+ /* Set bus speed mode of the card */ -+ err = sd_set_bus_speed_mode(card, status); -+ if (err) -+ goto out; -+ -+ /* SPI mode doesn't define CMD19 */ -+ if (!mmc_host_is_spi(card->host) && card->host->ops->execute_tuning) { -+ mmc_host_clk_hold(card->host); -+ err = card->host->ops->execute_tuning(card->host, -+ MMC_SEND_TUNING_BLOCK); -+ mmc_host_clk_release(card->host); -+ } -+ -+out: -+ kfree(status); -+ -+ return err; -+} -+ -+MMC_DEV_ATTR(cid, "%08x%08x%08x%08x\n", card->raw_cid[0], card->raw_cid[1], -+ card->raw_cid[2], card->raw_cid[3]); -+MMC_DEV_ATTR(csd, "%08x%08x%08x%08x\n", card->raw_csd[0], card->raw_csd[1], -+ card->raw_csd[2], card->raw_csd[3]); -+MMC_DEV_ATTR(scr, "%08x%08x\n", card->raw_scr[0], card->raw_scr[1]); -+MMC_DEV_ATTR(date, "%02d/%04d\n", card->cid.month, card->cid.year); -+MMC_DEV_ATTR(erase_size, "%u\n", card->erase_size << 9); -+MMC_DEV_ATTR(preferred_erase_size, "%u\n", card->pref_erase << 9); -+MMC_DEV_ATTR(fwrev, "0x%x\n", card->cid.fwrev); -+MMC_DEV_ATTR(hwrev, "0x%x\n", card->cid.hwrev); -+MMC_DEV_ATTR(manfid, "0x%06x\n", card->cid.manfid); -+MMC_DEV_ATTR(name, "%s\n", card->cid.prod_name); -+MMC_DEV_ATTR(oemid, "0x%04x\n", card->cid.oemid); -+MMC_DEV_ATTR(serial, "0x%08x\n", card->cid.serial); -+ -+ -+static struct attribute *sd_std_attrs[] = { -+ &dev_attr_cid.attr, -+ &dev_attr_csd.attr, -+ &dev_attr_scr.attr, -+ &dev_attr_date.attr, -+ &dev_attr_erase_size.attr, -+ &dev_attr_preferred_erase_size.attr, -+ &dev_attr_fwrev.attr, -+ &dev_attr_hwrev.attr, -+ &dev_attr_manfid.attr, -+ &dev_attr_name.attr, -+ &dev_attr_oemid.attr, -+ &dev_attr_serial.attr, -+ NULL, -+}; -+ -+static struct attribute_group sd_std_attr_group = { -+ .attrs = sd_std_attrs, -+}; -+ -+static const struct attribute_group *sd_attr_groups[] = { -+ &sd_std_attr_group, -+ NULL, -+}; -+ -+struct device_type sd_type = { -+ .groups = sd_attr_groups, -+}; -+ -+/* -+ * Fetch CID from card. -+ */ -+int mmc_sd_get_cid(struct mmc_host *host, u32 ocr, u32 *cid, u32 *rocr) -+{ -+ int err; -+ -+ /* -+ * Since we're changing the OCR value, we seem to -+ * need to tell some cards to go back to the idle -+ * state. We wait 1ms to give cards time to -+ * respond. -+ */ -+ mmc_go_idle(host); -+ -+ /* -+ * If SD_SEND_IF_COND indicates an SD 2.0 -+ * compliant card and we should set bit 30 -+ * of the ocr to indicate that we can handle -+ * block-addressed SDHC cards. -+ */ -+ err = mmc_send_if_cond(host, ocr); -+ if (!err) -+ ocr |= SD_OCR_CCS; -+ -+ /* -+ * If the host supports one of UHS-I modes, request the card -+ * to switch to 1.8V signaling level. -+ */ -+ if (host->caps & (MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25 | -+ MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_SDR104 | MMC_CAP_UHS_DDR50)) -+ ocr |= SD_OCR_S18R; -+ -+ /* If the host can supply more than 150mA, XPC should be set to 1. */ -+ if (host->caps & (MMC_CAP_SET_XPC_330 | MMC_CAP_SET_XPC_300 | -+ MMC_CAP_SET_XPC_180)) -+ ocr |= SD_OCR_XPC; -+ -+try_again: -+ err = mmc_send_app_op_cond(host, ocr, rocr); -+ if (err) -+ return err; -+ -+ /* -+ * In case CCS and S18A in the response is set, start Signal Voltage -+ * Switch procedure. SPI mode doesn't support CMD11. -+ */ -+ if (!mmc_host_is_spi(host) && rocr && -+ ((*rocr & 0x41000000) == 0x41000000)) { -+ err = mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_180, true); -+ if (err) { -+ ocr &= ~SD_OCR_S18R; -+ goto try_again; -+ } -+ } -+ -+ if (mmc_host_is_spi(host)) -+ err = mmc_send_cid(host, cid); -+ else -+ err = mmc_all_send_cid(host, cid); -+ -+ return err; -+} -+ -+int mmc_sd_get_csd(struct mmc_host *host, struct mmc_card *card) -+{ -+ int err; -+ -+ /* -+ * Fetch CSD from card. -+ */ -+ err = mmc_send_csd(card, card->raw_csd); -+ if (err) -+ return err; -+ -+ err = mmc_decode_csd(card); -+ if (err) -+ return err; -+ -+ return 0; -+} -+ -+int mmc_sd_setup_card(struct mmc_host *host, struct mmc_card *card, -+ bool reinit) -+{ -+ int err; -+ -+ if (!reinit) { -+ /* -+ * Fetch SCR from card. -+ */ -+ err = mmc_app_send_scr(card, card->raw_scr); -+ if (err) -+ return err; -+ -+ err = mmc_decode_scr(card); -+ if (err) -+ return err; -+ -+ /* -+ * Fetch and process SD Status register. -+ */ -+ err = mmc_read_ssr(card); -+ if (err) -+ return err; -+ -+ /* Erase init depends on CSD and SSR */ -+ mmc_init_erase(card); -+ -+ /* -+ * Fetch switch information from card. -+ */ -+ err = mmc_read_switch(card); -+ if (err) -+ return err; -+ } -+ -+ /* -+ * For SPI, enable CRC as appropriate. -+ * This CRC enable is located AFTER the reading of the -+ * card registers because some SDHC cards are not able -+ * to provide valid CRCs for non-512-byte blocks. -+ */ -+ if (mmc_host_is_spi(host)) { -+ err = mmc_spi_set_crc(host, use_spi_crc); -+ if (err) -+ return err; -+ } -+ -+ /* -+ * Check if read-only switch is active. -+ */ -+ if (!reinit) { -+ int ro = -1; -+ -+ if (host->ops->get_ro) { -+ mmc_host_clk_hold(card->host); -+ ro = host->ops->get_ro(host); -+ mmc_host_clk_release(card->host); -+ } -+ -+ if (ro < 0) { -+ pr_warning("%s: host does not " -+ "support reading read-only " -+ "switch. assuming write-enable.\n", -+ mmc_hostname(host)); -+ } else if (ro > 0) { -+ mmc_card_set_readonly(card); -+ } -+ } -+ -+ return 0; -+} -+ -+unsigned mmc_sd_get_max_clock(struct mmc_card *card) -+{ -+ unsigned max_dtr = (unsigned int)-1; -+ -+ if (mmc_card_highspeed(card)) { -+ if (max_dtr > card->sw_caps.hs_max_dtr) -+ max_dtr = card->sw_caps.hs_max_dtr; -+ } else if (max_dtr > card->csd.max_dtr) { -+ max_dtr = card->csd.max_dtr; -+ } -+ -+ return max_dtr; -+} -+ -+void mmc_sd_go_highspeed(struct mmc_card *card) -+{ -+ mmc_card_set_highspeed(card); -+ mmc_set_timing(card->host, MMC_TIMING_SD_HS); -+} -+ -+/* -+ * Handle the detection and initialisation of a card. -+ * -+ * In the case of a resume, "oldcard" will contain the card -+ * we're trying to reinitialise. -+ */ -+static int mmc_sd_init_card(struct mmc_host *host, u32 ocr, -+ struct mmc_card *oldcard) -+{ -+ struct mmc_card *card; -+ int err; -+ u32 cid[4]; -+ u32 rocr = 0; -+ -+ BUG_ON(!host); -+ WARN_ON(!host->claimed); -+ -+ /* The initialization should be done at 3.3 V I/O voltage. */ -+ mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330, 0); -+ -+ err = mmc_sd_get_cid(host, ocr, cid, &rocr); -+ if (err) -+ return err; -+ -+ if (oldcard) { -+ if (memcmp(cid, oldcard->raw_cid, sizeof(cid)) != 0) -+ return -ENOENT; -+ -+ card = oldcard; -+ } else { -+ /* -+ * Allocate card structure. -+ */ -+ card = mmc_alloc_card(host, &sd_type); -+ if (IS_ERR(card)) -+ return PTR_ERR(card); -+ -+ card->type = MMC_TYPE_SD; -+ memcpy(card->raw_cid, cid, sizeof(card->raw_cid)); -+ } -+ -+ /* -+ * For native busses: get card RCA and quit open drain mode. -+ */ -+ if (!mmc_host_is_spi(host)) { -+ err = mmc_send_relative_addr(host, &card->rca); -+ if (err) -+ return err; -+ } -+ -+ if (!oldcard) { -+ err = mmc_sd_get_csd(host, card); -+ if (err) -+ return err; -+ -+ mmc_decode_cid(card); -+ } -+ -+ /* -+ * Select card, as all following commands rely on that. -+ */ -+ if (!mmc_host_is_spi(host)) { -+ err = mmc_select_card(card); -+ if (err) -+ return err; -+ } -+ -+ err = mmc_sd_setup_card(host, card, oldcard != NULL); -+ if (err) -+ goto free_card; -+ -+ /* Initialization sequence for UHS-I cards */ -+ if (rocr & SD_ROCR_S18A) { -+ err = mmc_sd_init_uhs_card(card); -+ if (err) -+ goto free_card; -+ -+ /* Card is an ultra-high-speed card */ -+ mmc_card_set_uhs(card); -+ -+ /* -+ * Since initialization is now complete, enable preset -+ * value registers for UHS-I cards. -+ */ -+ if (host->ops->enable_preset_value) { -+ mmc_host_clk_hold(card->host); -+ host->ops->enable_preset_value(host, true); -+ mmc_host_clk_release(card->host); -+ } -+ } else { -+ /* -+ * Attempt to change to high-speed (if supported) -+ */ -+ err = mmc_sd_switch_hs(card); -+ if (err > 0) -+ mmc_sd_go_highspeed(card); -+ else if (err) -+ goto free_card; -+ -+ /* -+ * Set bus speed. -+ */ -+ mmc_set_clock(host, mmc_sd_get_max_clock(card)); -+ -+ /* -+ * Switch to wider bus (if supported). -+ */ -+ if ((host->caps & MMC_CAP_4_BIT_DATA) && -+ (card->scr.bus_widths & SD_SCR_BUS_WIDTH_4)) { -+ err = mmc_app_set_bus_width(card, MMC_BUS_WIDTH_4); -+ if (err) -+ goto free_card; -+ -+ mmc_set_bus_width(host, MMC_BUS_WIDTH_4); -+ } -+ } -+ -+ host->card = card; -+ return 0; -+ -+free_card: -+ if (!oldcard) -+ mmc_remove_card(card); -+ -+ return err; -+} -+ -+/* -+ * Host is being removed. Free up the current card. -+ */ -+static void mmc_sd_remove(struct mmc_host *host) -+{ -+ BUG_ON(!host); -+ BUG_ON(!host->card); -+ -+ mmc_remove_card(host->card); -+ host->card = NULL; -+} -+ -+/* -+ * Card detection - card is alive. -+ */ -+static int mmc_sd_alive(struct mmc_host *host) -+{ -+ return mmc_send_status(host->card, NULL); -+} -+ -+/* -+ * Card detection callback from host. -+ */ -+static void mmc_sd_detect(struct mmc_host *host) -+{ -+ int err; -+ -+ BUG_ON(!host); -+ BUG_ON(!host->card); -+ -+ mmc_claim_host(host); -+ -+ /* -+ * Just check if our card has been removed. -+ */ -+ err = _mmc_detect_card_removed(host); -+ -+ mmc_release_host(host); -+ -+ if (err) { -+ mmc_sd_remove(host); -+ -+ mmc_claim_host(host); -+ mmc_detach_bus(host); -+ mmc_power_off(host); -+ mmc_release_host(host); -+ } -+} -+ -+/* -+ * Suspend callback from host. -+ */ -+static int mmc_sd_suspend(struct mmc_host *host) -+{ -+ BUG_ON(!host); -+ BUG_ON(!host->card); -+ -+ mmc_claim_host(host); -+ if (!mmc_host_is_spi(host)) -+ mmc_deselect_cards(host); -+ host->card->state &= ~MMC_STATE_HIGHSPEED; -+ mmc_release_host(host); -+ -+ return 0; -+} -+ -+/* -+ * Resume callback from host. -+ * -+ * This function tries to determine if the same card is still present -+ * and, if so, restore all state to it. -+ */ -+static int mmc_sd_resume(struct mmc_host *host) -+{ -+ int err; -+ -+ BUG_ON(!host); -+ BUG_ON(!host->card); -+ -+ mmc_claim_host(host); -+ err = mmc_sd_init_card(host, host->ocr, host->card); -+ mmc_release_host(host); -+ -+ return err; -+} -+ -+static int mmc_sd_power_restore(struct mmc_host *host) -+{ -+ int ret; -+ -+ host->card->state &= ~MMC_STATE_HIGHSPEED; -+ mmc_claim_host(host); -+ ret = mmc_sd_init_card(host, host->ocr, host->card); -+ mmc_release_host(host); -+ -+ return ret; -+} -+ -+static const struct mmc_bus_ops mmc_sd_ops = { -+ .remove = mmc_sd_remove, -+ .detect = mmc_sd_detect, -+ .suspend = NULL, -+ .resume = NULL, -+ .power_restore = mmc_sd_power_restore, -+ .alive = mmc_sd_alive, -+}; -+ -+static const struct mmc_bus_ops mmc_sd_ops_unsafe = { -+ .remove = mmc_sd_remove, -+ .detect = mmc_sd_detect, -+ .suspend = mmc_sd_suspend, -+ .resume = mmc_sd_resume, -+ .power_restore = mmc_sd_power_restore, -+ .alive = mmc_sd_alive, -+}; -+ -+static void mmc_sd_attach_bus_ops(struct mmc_host *host) -+{ -+ const struct mmc_bus_ops *bus_ops; -+ -+ if (!mmc_card_is_removable(host)) -+ bus_ops = &mmc_sd_ops_unsafe; -+ else -+ bus_ops = &mmc_sd_ops; -+ mmc_attach_bus(host, bus_ops); -+} -+ -+/* -+ * Starting point for SD card init. -+ */ -+int mmc_attach_sd(struct mmc_host *host) -+{ -+ int err; -+ u32 ocr; -+ -+ BUG_ON(!host); -+ WARN_ON(!host->claimed); -+ -+ /* Disable preset value enable if already set since last time */ -+ if (host->ops->enable_preset_value) { -+ mmc_host_clk_hold(host); -+ host->ops->enable_preset_value(host, false); -+ mmc_host_clk_release(host); -+ } -+ -+ err = mmc_send_app_op_cond(host, 0, &ocr); -+ if (err) -+ return err; -+ -+ mmc_sd_attach_bus_ops(host); -+ if (host->ocr_avail_sd) -+ host->ocr_avail = host->ocr_avail_sd; -+ -+ /* -+ * We need to get OCR a different way for SPI. -+ */ -+ if (mmc_host_is_spi(host)) { -+ mmc_go_idle(host); -+ -+ err = mmc_spi_read_ocr(host, 0, &ocr); -+ if (err) -+ goto err; -+ } -+ -+ /* -+ * Sanity check the voltages that the card claims to -+ * support. -+ */ -+ if (ocr & 0x7F) { -+ pr_warning("%s: card claims to support voltages " -+ "below the defined range. These will be ignored.\n", -+ mmc_hostname(host)); -+ ocr &= ~0x7F; -+ } -+ -+ if ((ocr & MMC_VDD_165_195) && -+ !(host->ocr_avail_sd & MMC_VDD_165_195)) { -+ pr_warning("%s: SD card claims to support the " -+ "incompletely defined 'low voltage range'. This " -+ "will be ignored.\n", mmc_hostname(host)); -+ ocr &= ~MMC_VDD_165_195; -+ } -+ -+ host->ocr = mmc_select_voltage(host, ocr); -+ -+ /* -+ * Can we support the voltage(s) of the card(s)? -+ */ -+ if (!host->ocr) { -+ err = -EINVAL; -+ goto err; -+ } -+ -+ /* -+ * Detect and init the card. -+ */ -+ err = mmc_sd_init_card(host, host->ocr, NULL); -+ if (err) -+ goto err; -+ -+ mmc_release_host(host); -+ err = mmc_add_card(host->card); -+ mmc_claim_host(host); -+ if (err) -+ goto remove_card; -+ -+ return 0; -+ -+remove_card: -+ mmc_release_host(host); -+ mmc_remove_card(host->card); -+ host->card = NULL; -+ mmc_claim_host(host); -+err: -+ mmc_detach_bus(host); -+ -+ pr_err("%s: error %d whilst initialising SD card\n", -+ mmc_hostname(host), err); -+ -+ return err; -+} -+ diff -urN a/drivers/mmc/host/mvsdio.c b/drivers/mmc/host/mvsdio.c ---- a/drivers/mmc/host/mvsdio.c 2012-05-20 18:29:13.000000000 -0400 -+++ b/drivers/mmc/host/mvsdio.c 2012-05-24 12:02:12.000000000 -0400 -@@ -21,6 +21,7 @@ - #include +--- a/drivers/mmc/host/mvsdio.c 2012-08-09 11:23:56.000000000 -0400 ++++ b/drivers/mmc/host/mvsdio.c 2012-08-10 11:26:52.000000000 -0400 +@@ -22,6 +22,7 @@ + #include #include #include +#include #include #include -@@ -148,6 +149,7 @@ +@@ -150,6 +151,7 @@ dev_dbg(host->dev, "cmd %d (hw state 0x%04x)\n", cmd->opcode, mvsd_read(MVSD_HW_STATE)); diff --git a/core/linux-kirkwood/aufs3-3.4.patch.xz b/core/linux-kirkwood/aufs3-3.4.patch.xz deleted file mode 100644 index bc3af7f35..000000000 Binary files a/core/linux-kirkwood/aufs3-3.4.patch.xz and /dev/null differ diff --git a/core/linux-kirkwood/aufs3.5-patch.xz b/core/linux-kirkwood/aufs3.5-patch.xz new file mode 100644 index 000000000..931465b30 Binary files /dev/null and b/core/linux-kirkwood/aufs3.5-patch.xz differ diff --git a/core/linux-kirkwood/config b/core/linux-kirkwood/config index e03e307ed..5b0a24f4e 100644 --- a/core/linux-kirkwood/config +++ b/core/linux-kirkwood/config @@ -1,22 +1,16 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm 3.4.0-0 Kernel Configuration +# Linux/arm 3.5.1-0 Kernel Configuration # CONFIG_ARM=y CONFIG_SYS_SUPPORTS_APM_EMULATION=y CONFIG_GENERIC_GPIO=y -# CONFIG_ARCH_USES_GETTIMEOFFSET is not set -CONFIG_GENERIC_CLOCKEVENTS=y -CONFIG_KTIME_SCALAR=y CONFIG_HAVE_PROC_CPU=y CONFIG_STACKTRACE_SUPPORT=y CONFIG_HAVE_LATENCYTOP_SUPPORT=y CONFIG_LOCKDEP_SUPPORT=y CONFIG_TRACE_IRQFLAGS_SUPPORT=y -CONFIG_HARDIRQS_SW_RESEND=y -CONFIG_GENERIC_IRQ_PROBE=y CONFIG_RWSEM_GENERIC_SPINLOCK=y -CONFIG_ARCH_HAS_CPU_IDLE_WAIT=y CONFIG_GENERIC_HWEIGHT=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_NEED_DMA_MAP_STATE=y @@ -67,8 +61,20 @@ CONFIG_HAVE_GENERIC_HARDIRQS=y # IRQ subsystem # CONFIG_GENERIC_HARDIRQS=y +CONFIG_GENERIC_IRQ_PROBE=y CONFIG_GENERIC_IRQ_SHOW=y +CONFIG_HARDIRQS_SW_RESEND=y CONFIG_GENERIC_IRQ_CHIP=y +CONFIG_KTIME_SCALAR=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_GENERIC_CLOCKEVENTS_BUILD=y + +# +# Timers subsystem +# +CONFIG_TICK_ONESHOT=y +CONFIG_NO_HZ=y +CONFIG_HIGH_RES_TIMERS=y # # RCU Subsystem @@ -103,7 +109,6 @@ CONFIG_BLK_CGROUP=y CONFIG_NAMESPACES=y CONFIG_UTS_NS=y CONFIG_IPC_NS=y -CONFIG_USER_NS=y CONFIG_PID_NS=y CONFIG_NET_NS=y # CONFIG_SCHED_AUTOGROUP is not set @@ -145,7 +150,6 @@ CONFIG_PERF_USE_VMALLOC=y # Kernel Performance Events And Counters # CONFIG_PERF_EVENTS=y -# CONFIG_PERF_COUNTERS is not set # CONFIG_DEBUG_PERF_USE_VMALLOC is not set CONFIG_VM_EVENT_COUNTERS=y CONFIG_PCI_QUIRKS=y @@ -162,7 +166,11 @@ CONFIG_KPROBES=y CONFIG_KRETPROBES=y CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y +CONFIG_HAVE_ARCH_TRACEHOOK=y +CONFIG_HAVE_DMA_ATTRS=y +CONFIG_GENERIC_SMP_IDLE_THREAD=y CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y +CONFIG_HAVE_CLK=y CONFIG_HAVE_DMA_API_DEBUG=y CONFIG_HAVE_ARCH_JUMP_LABEL=y @@ -277,8 +285,6 @@ CONFIG_MMU=y # CONFIG_ARCH_IOP13XX is not set # CONFIG_ARCH_IOP32X is not set # CONFIG_ARCH_IOP33X is not set -# CONFIG_ARCH_IXP23XX is not set -# CONFIG_ARCH_IXP2000 is not set # CONFIG_ARCH_IXP4XX is not set # CONFIG_ARCH_DOVE is not set CONFIG_ARCH_KIRKWOOD=y @@ -326,6 +332,9 @@ CONFIG_MACH_ESATA_SHEEVAPLUG=y CONFIG_MACH_GURUPLUG=y # CONFIG_ARCH_KIRKWOOD_DT is not set # CONFIG_MACH_DREAMPLUG_DT is not set +# CONFIG_MACH_ICONNECT_DT is not set +# CONFIG_MACH_DLINK_KIRKWOOD_DT is not set +# CONFIG_MACH_IB62X0_DT is not set CONFIG_MACH_TS219=y CONFIG_MACH_TS41X=y CONFIG_MACH_DOCKSTAR=y @@ -348,10 +357,6 @@ CONFIG_MACH_D2NET_V2=y CONFIG_MACH_NET2BIG_V2=y CONFIG_MACH_NET5BIG_V2=y CONFIG_MACH_T5325=y - -# -# System MMU -# CONFIG_PLAT_ORION=y # @@ -400,10 +405,6 @@ CONFIG_PCI_SYSCALL=y # # Kernel Features # -CONFIG_TICK_ONESHOT=y -CONFIG_NO_HZ=y -CONFIG_HIGH_RES_TIMERS=y -CONFIG_GENERIC_CLOCKEVENTS_BUILD=y CONFIG_VMSPLIT_3G=y # CONFIG_VMSPLIT_2G is not set # CONFIG_VMSPLIT_1G is not set @@ -433,8 +434,10 @@ CONFIG_ZONE_DMA_FLAG=0 CONFIG_VIRT_TO_BUS=y CONFIG_KSM=y CONFIG_DEFAULT_MMAP_MIN_ADDR=32768 +CONFIG_CROSS_MEMORY_ATTACH=y CONFIG_NEED_PER_CPU_KM=y # CONFIG_CLEANCACHE is not set +# CONFIG_FRONTSWAP is not set CONFIG_FORCE_MAX_ZONEORDER=11 CONFIG_ALIGNMENT_TRAP=y CONFIG_UACCESS_WITH_MEMCPY=y @@ -487,6 +490,7 @@ CONFIG_PM=y CONFIG_PM_DEBUG=y CONFIG_PM_ADVANCED_DEBUG=y # CONFIG_APM_EMULATION is not set +CONFIG_PM_CLK=y # CONFIG_ARM_CPU_SUSPEND is not set CONFIG_NET=y @@ -497,6 +501,7 @@ CONFIG_PACKET=y CONFIG_UNIX=y # CONFIG_UNIX_DIAG is not set CONFIG_XFRM=y +CONFIG_XFRM_ALGO=m CONFIG_XFRM_USER=m # CONFIG_XFRM_SUB_POLICY is not set # CONFIG_XFRM_MIGRATE is not set @@ -623,6 +628,7 @@ CONFIG_NETFILTER_XT_TARGET_CONNMARK=m CONFIG_NETFILTER_XT_TARGET_CT=m CONFIG_NETFILTER_XT_TARGET_DSCP=m CONFIG_NETFILTER_XT_TARGET_HL=m +# CONFIG_NETFILTER_XT_TARGET_HMARK is not set CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m CONFIG_NETFILTER_XT_TARGET_LED=m # CONFIG_NETFILTER_XT_TARGET_LOG is not set @@ -729,7 +735,6 @@ CONFIG_IP_NF_ARP_MANGLE=m # CONFIG_NF_DEFRAG_IPV6=m CONFIG_NF_CONNTRACK_IPV6=m -# CONFIG_IP6_NF_QUEUE is not set CONFIG_IP6_NF_IPTABLES=m CONFIG_IP6_NF_MATCH_AH=m CONFIG_IP6_NF_MATCH_EUI64=m @@ -802,7 +807,6 @@ CONFIG_IPDDP=m # CONFIG_IPDDP_DECAP is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set -# CONFIG_ECONET is not set CONFIG_WAN_ROUTER=m # CONFIG_PHONET is not set # CONFIG_IEEE802154 is not set @@ -828,6 +832,8 @@ CONFIG_NET_SCH_DRR=m CONFIG_NET_SCH_MQPRIO=m CONFIG_NET_SCH_CHOKE=m # CONFIG_NET_SCH_QFQ is not set +# CONFIG_NET_SCH_CODEL is not set +# CONFIG_NET_SCH_FQ_CODEL is not set # CONFIG_NET_SCH_INGRESS is not set # CONFIG_NET_SCH_PLUG is not set @@ -872,7 +878,6 @@ CONFIG_DNS_RESOLVER=y # CONFIG_OPENVSWITCH is not set # CONFIG_NETPRIO_CGROUP is not set CONFIG_BQL=y -CONFIG_HAVE_BPF_JIT=y # CONFIG_BPF_JIT is not set # @@ -1015,6 +1020,7 @@ CONFIG_WIMAX_DEBUG_LEVEL=8 CONFIG_RFKILL=m CONFIG_RFKILL_LEDS=y CONFIG_RFKILL_INPUT=y +CONFIG_RFKILL_GPIO=m # CONFIG_NET_9P is not set CONFIG_CAIF=m # CONFIG_CAIF_DEBUG is not set @@ -1022,6 +1028,7 @@ CONFIG_CAIF_NETDEV=m # CONFIG_CAIF_USB is not set # CONFIG_CEPH_LIB is not set # CONFIG_NFC is not set +CONFIG_HAVE_BPF_JIT=y # # Device Drivers @@ -1154,7 +1161,6 @@ CONFIG_MTD_UBI=y CONFIG_MTD_UBI_WL_THRESHOLD=4096 CONFIG_MTD_UBI_BEB_RESERVE=1 # CONFIG_MTD_UBI_GLUEBI is not set -# CONFIG_MTD_UBI_DEBUG is not set # CONFIG_PARPORT is not set CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set @@ -1190,6 +1196,7 @@ CONFIG_ATA_OVER_ETH=m CONFIG_AD525X_DPOT=m # CONFIG_AD525X_DPOT_I2C is not set # CONFIG_AD525X_DPOT_SPI is not set +# CONFIG_ATMEL_PWM is not set CONFIG_PHANTOM=m # CONFIG_INTEL_MID_PTI is not set CONFIG_SGI_IOC4=m @@ -1208,7 +1215,8 @@ CONFIG_SENSORS_BH1780=m CONFIG_HMC6352=m CONFIG_DS1682=m CONFIG_TI_DAC7512=m -CONFIG_BMP085=m +# CONFIG_BMP085_I2C is not set +# CONFIG_BMP085_SPI is not set # CONFIG_PCH_PHUB is not set # CONFIG_USB_SWITCH_FSA9480 is not set CONFIG_C2PORT=m @@ -1640,6 +1648,9 @@ CONFIG_NET_VENDOR_TI=y CONFIG_NET_VENDOR_VIA=y # CONFIG_VIA_RHINE is not set # CONFIG_VIA_VELOCITY is not set +CONFIG_NET_VENDOR_WIZNET=y +# CONFIG_WIZNET_W5100 is not set +# CONFIG_WIZNET_W5300 is not set CONFIG_FDDI=m CONFIG_DEFXX=m # CONFIG_DEFXX_MMIO is not set @@ -1682,7 +1693,6 @@ CONFIG_PPP_ASYNC=m CONFIG_PPP_SYNC_TTY=m # CONFIG_SLIP is not set CONFIG_SLHC=m -# CONFIG_TR is not set # # USB Network Adapters @@ -1724,7 +1734,6 @@ CONFIG_WLAN=y CONFIG_LIBERTAS_THINFIRM=m # CONFIG_LIBERTAS_THINFIRM_DEBUG is not set CONFIG_LIBERTAS_THINFIRM_USB=m -CONFIG_LIBERTAS_UAP=m # CONFIG_ATMEL is not set CONFIG_AT76C50X_USB=m # CONFIG_PRISM54 is not set @@ -1843,19 +1852,13 @@ CONFIG_RTL8192CU=m CONFIG_RTLWIFI=m CONFIG_RTLWIFI_DEBUG=y CONFIG_RTL8192C_COMMON=m -CONFIG_WL1251=m -CONFIG_WL1251_SPI=m -CONFIG_WL1251_SDIO=m -CONFIG_WL12XX_MENU=m -CONFIG_WL12XX=m -# CONFIG_WL12XX_SPI is not set -CONFIG_WL12XX_SDIO=m -CONFIG_WL12XX_PLATFORM_DATA=y +# CONFIG_WL_TI is not set CONFIG_ZD1211RW=m # CONFIG_ZD1211RW_DEBUG is not set CONFIG_MWIFIEX=m CONFIG_MWIFIEX_SDIO=m # CONFIG_MWIFIEX_PCIE is not set +# CONFIG_MWIFIEX_USB is not set # # WiMAX Wireless Broadband devices @@ -1876,6 +1879,7 @@ CONFIG_INPUT=y CONFIG_INPUT_FF_MEMLESS=m # CONFIG_INPUT_POLLDEV is not set # CONFIG_INPUT_SPARSEKMAP is not set +# CONFIG_INPUT_MATRIXKMAP is not set # # Userland interfaces @@ -1903,11 +1907,13 @@ CONFIG_KEYBOARD_TCA6416=m # CONFIG_KEYBOARD_TCA8418 is not set # CONFIG_KEYBOARD_MATRIX is not set # CONFIG_KEYBOARD_LM8323 is not set +# CONFIG_KEYBOARD_LM8333 is not set # CONFIG_KEYBOARD_MAX7359 is not set # CONFIG_KEYBOARD_MCS is not set # CONFIG_KEYBOARD_MPR121 is not set # CONFIG_KEYBOARD_NEWTON is not set # CONFIG_KEYBOARD_OPENCORES is not set +# CONFIG_KEYBOARD_SAMSUNG is not set # CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_OMAP4 is not set @@ -1956,6 +1962,7 @@ CONFIG_TOUCHSCREEN_FUJITSU=m CONFIG_TOUCHSCREEN_GUNZE=m CONFIG_TOUCHSCREEN_ELO=m CONFIG_TOUCHSCREEN_WACOM_W8001=m +# CONFIG_TOUCHSCREEN_WACOM_I2C is not set # CONFIG_TOUCHSCREEN_MAX11801 is not set CONFIG_TOUCHSCREEN_MCS5000=m CONFIG_TOUCHSCREEN_MTOUCH=m @@ -1988,6 +1995,7 @@ CONFIG_TOUCHSCREEN_USB_EASYTOUCH=y # CONFIG_TOUCHSCREEN_TSC_SERIO is not set # CONFIG_TOUCHSCREEN_TSC2005 is not set CONFIG_TOUCHSCREEN_TSC2007=m +# CONFIG_TOUCHSCREEN_W90X900 is not set # CONFIG_TOUCHSCREEN_ST1232 is not set CONFIG_TOUCHSCREEN_TPS6507X=m # CONFIG_INPUT_MISC is not set @@ -2031,6 +2039,7 @@ CONFIG_SERIAL_8250_PCI=y CONFIG_SERIAL_8250_NR_UARTS=4 CONFIG_SERIAL_8250_RUNTIME_UARTS=2 # CONFIG_SERIAL_8250_EXTENDED is not set +# CONFIG_SERIAL_8250_EM is not set # # Non-8250 serial port support @@ -2055,7 +2064,6 @@ CONFIG_SERIAL_CORE_CONSOLE=y # CONFIG_RAW_DRIVER is not set # CONFIG_TCG_TPM is not set CONFIG_DEVPORT=y -CONFIG_RAMOOPS=m CONFIG_I2C=m CONFIG_I2C_BOARDINFO=y CONFIG_I2C_COMPAT=y @@ -2089,6 +2097,7 @@ CONFIG_I2C_ALGOBIT=m # # I2C system bus drivers (mostly embedded / system-on-chip) # +# CONFIG_I2C_DESIGNWARE_PLATFORM is not set # CONFIG_I2C_DESIGNWARE_PCI is not set # CONFIG_I2C_EG20T is not set # CONFIG_I2C_GPIO is not set @@ -2155,6 +2164,7 @@ CONFIG_SPI_ORION=y # # Enable Device Drivers -> PPS to see the PTP clock options. # +CONFIG_ARCH_HAVE_CUSTOM_GPIO_H=y CONFIG_ARCH_REQUIRE_GPIOLIB=y CONFIG_GPIOLIB=y # CONFIG_DEBUG_GPIO is not set @@ -2164,6 +2174,7 @@ CONFIG_GPIO_SYSFS=y # Memory mapped GPIO drivers: # # CONFIG_GPIO_GENERIC_PLATFORM is not set +# CONFIG_GPIO_EM is not set # CONFIG_GPIO_VX855 is not set # @@ -2221,7 +2232,7 @@ CONFIG_W1_SLAVE_DS2760=m # CONFIG_W1_SLAVE_DS2780 is not set # CONFIG_W1_SLAVE_DS2781 is not set CONFIG_W1_SLAVE_BQ27000=m -CONFIG_POWER_SUPPLY=m +CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set # CONFIG_PDA_POWER is not set # CONFIG_TEST_POWER is not set @@ -2323,6 +2334,7 @@ CONFIG_SENSORS_LM90=m # CONFIG_SENSORS_ADS7828 is not set # CONFIG_SENSORS_ADS7871 is not set # CONFIG_SENSORS_AMC6821 is not set +# CONFIG_SENSORS_INA2XX is not set # CONFIG_SENSORS_THMC50 is not set # CONFIG_SENSORS_TMP102 is not set # CONFIG_SENSORS_TMP401 is not set @@ -2349,9 +2361,11 @@ CONFIG_WATCHDOG_CORE=y # Watchdog Device Drivers # CONFIG_SOFT_WATCHDOG=m +# CONFIG_DW_WATCHDOG is not set CONFIG_ORION_WATCHDOG=m # CONFIG_MAX63XX_WATCHDOG is not set # CONFIG_ALIM7101_WDT is not set +# CONFIG_I6300ESB_WDT is not set # # PCI-based Watchdog Cards @@ -2394,6 +2408,7 @@ CONFIG_BCMA_POSSIBLE=y # CONFIG_MFD_ASIC3 is not set # CONFIG_HTC_EGPIO is not set # CONFIG_HTC_PASIC3 is not set +# CONFIG_MFD_LM3533 is not set # CONFIG_TPS6105X is not set # CONFIG_TPS65010 is not set # CONFIG_TPS6507X is not set @@ -2401,15 +2416,19 @@ CONFIG_BCMA_POSSIBLE=y # CONFIG_MFD_TPS65912_SPI is not set # CONFIG_MFD_STMPE is not set # CONFIG_MFD_TMIO is not set +# CONFIG_MFD_T7L66XB is not set +# CONFIG_MFD_TC6387XB is not set +# CONFIG_MFD_TC6393XB is not set # CONFIG_MFD_DA9052_SPI is not set -# CONFIG_MFD_WM8400 is not set # CONFIG_MFD_WM831X_SPI is not set # CONFIG_MFD_PCF50633 is not set -# CONFIG_MFD_MC13XXX is not set +# CONFIG_MFD_MC13XXX_SPI is not set +# CONFIG_MFD_MC13XXX_I2C is not set # CONFIG_ABX500_CORE is not set # CONFIG_EZX_PCAP is not set # CONFIG_MFD_TIMBERDALE is not set # CONFIG_LPC_SCH is not set +# CONFIG_LPC_ICH is not set # CONFIG_MFD_RDC321X is not set # CONFIG_MFD_JANZ_CMODIO is not set # CONFIG_MFD_VX855 is not set @@ -2477,7 +2496,11 @@ CONFIG_MEDIA_TUNER_MXL5007T=m CONFIG_MEDIA_TUNER_MC44S803=m CONFIG_MEDIA_TUNER_MAX2165=m CONFIG_MEDIA_TUNER_TDA18218=m +CONFIG_MEDIA_TUNER_FC0011=m +CONFIG_MEDIA_TUNER_FC0012=m +CONFIG_MEDIA_TUNER_FC0013=m CONFIG_MEDIA_TUNER_TDA18212=m +CONFIG_MEDIA_TUNER_TUA9001=m CONFIG_VIDEO_V4L2=m CONFIG_VIDEOBUF_GEN=m CONFIG_VIDEOBUF_VMALLOC=m @@ -2549,6 +2572,7 @@ CONFIG_VIDEO_UPD64083=m CONFIG_VIDEO_M52790=m # CONFIG_VIDEO_VIVI is not set CONFIG_V4L_USB_DRIVERS=y +# CONFIG_VIDEO_AU0828 is not set CONFIG_USB_VIDEO_CLASS=m CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y CONFIG_USB_GSPCA=m @@ -2606,7 +2630,7 @@ CONFIG_VIDEO_HDPVR=m CONFIG_VIDEO_EM28XX=m CONFIG_VIDEO_EM28XX_ALSA=m CONFIG_VIDEO_EM28XX_DVB=m -CONFIG_VIDEO_EM28XX_RC=y +CONFIG_VIDEO_EM28XX_RC=m CONFIG_VIDEO_TLG2300=m CONFIG_VIDEO_CX231XX=m CONFIG_VIDEO_CX231XX_RC=y @@ -2616,7 +2640,6 @@ CONFIG_VIDEO_TM6000=m CONFIG_VIDEO_TM6000_ALSA=m CONFIG_VIDEO_TM6000_DVB=m CONFIG_VIDEO_USBVISION=m -CONFIG_USB_ET61X251=m CONFIG_USB_SN9C102=m CONFIG_USB_PWC=m # CONFIG_USB_PWC_DEBUG is not set @@ -2626,7 +2649,6 @@ CONFIG_USB_ZR364XX=m CONFIG_USB_STKWEBCAM=m CONFIG_USB_S2255=m CONFIG_V4L_PCI_DRIVERS=y -# CONFIG_VIDEO_AU0828 is not set # CONFIG_VIDEO_BT848 is not set # CONFIG_VIDEO_CX18 is not set # CONFIG_VIDEO_CX23885 is not set @@ -2713,6 +2735,7 @@ CONFIG_DVB_USB_TECHNISAT_USB2=m # CONFIG_DVB_USB_IT913X is not set # CONFIG_DVB_USB_MXL111SF is not set # CONFIG_DVB_USB_RTL28XXU is not set +# CONFIG_DVB_USB_AF9035 is not set CONFIG_DVB_TTUSB_BUDGET=m CONFIG_DVB_TTUSB_DEC=m CONFIG_SMS_SIANO_MDTV=m @@ -2935,6 +2958,7 @@ CONFIG_FB_UDL=m # CONFIG_FB_METRONOME is not set # CONFIG_FB_MB862XX is not set # CONFIG_FB_BROADSHEET is not set +# CONFIG_FB_AUO_K190X is not set # CONFIG_EXYNOS_VIDEO is not set CONFIG_BACKLIGHT_LCD_SUPPORT=y CONFIG_LCD_CLASS_DEVICE=m @@ -3006,17 +3030,13 @@ CONFIG_SND_USB_CAIAQ=m # CONFIG_SND_USB_6FIRE is not set # CONFIG_SND_SOC is not set # CONFIG_SOUND_PRIME is not set -CONFIG_HID_SUPPORT=y -CONFIG_HID=m -# CONFIG_HID_BATTERY_STRENGTH is not set -# CONFIG_HIDRAW is not set # -# USB Input Devices +# HID support # -CONFIG_USB_HID=m -# CONFIG_HID_PID is not set -CONFIG_USB_HIDDEV=y +CONFIG_HID=m +# CONFIG_HIDRAW is not set +CONFIG_HID_GENERIC=m # # Special HID drivers @@ -3025,6 +3045,7 @@ CONFIG_HID_A4TECH=m CONFIG_HID_ACRUX=m CONFIG_HID_ACRUX_FF=y CONFIG_HID_APPLE=m +# CONFIG_HID_AUREAL is not set CONFIG_HID_BELKIN=m CONFIG_HID_CHERRY=m CONFIG_HID_CHICONY=m @@ -3081,12 +3102,18 @@ CONFIG_HID_TOPSEED=m CONFIG_HID_THRUSTMASTER=m CONFIG_THRUSTMASTER_FF=y CONFIG_HID_WACOM=m -CONFIG_HID_WACOM_POWER_SUPPLY=y CONFIG_HID_WIIMOTE=m CONFIG_HID_WIIMOTE_EXT=y CONFIG_HID_ZEROPLUS=m CONFIG_ZEROPLUS_FF=y CONFIG_HID_ZYDACRON=m + +# +# USB HID support +# +CONFIG_USB_HID=m +# CONFIG_HID_PID is not set +CONFIG_USB_HIDDEV=y CONFIG_USB_ARCH_HAS_OHCI=y CONFIG_USB_ARCH_HAS_EHCI=y CONFIG_USB_ARCH_HAS_XHCI=y @@ -3100,8 +3127,6 @@ CONFIG_USB=y # # Miscellaneous USB options # -CONFIG_USB_DEVICEFS=y -CONFIG_USB_DEVICE_CLASS=y # CONFIG_USB_DYNAMIC_MINORS is not set CONFIG_USB_SUSPEND=y # CONFIG_USB_OTG is not set @@ -3129,6 +3154,8 @@ CONFIG_USB_EHCI_TT_NEWSCHED=y # CONFIG_USB_R8A66597_HCD is not set # CONFIG_USB_WHCI_HCD is not set # CONFIG_USB_HWA_HCD is not set +# CONFIG_USB_HCD_SSB is not set +# CONFIG_USB_CHIPIDEA is not set # # USB Device Class drivers @@ -3238,6 +3265,7 @@ CONFIG_USB_SERIAL_OPTICON=m # CONFIG_USB_SERIAL_VIVOPAY_SERIAL is not set # CONFIG_USB_SERIAL_ZIO is not set # CONFIG_USB_SERIAL_SSU100 is not set +# CONFIG_USB_SERIAL_QT2 is not set CONFIG_USB_SERIAL_DEBUG=m # @@ -3264,6 +3292,11 @@ CONFIG_USB_SISUSBVGA_CON=y # CONFIG_USB_TEST is not set CONFIG_USB_ISIGHTFW=m # CONFIG_USB_YUREX is not set + +# +# USB Physical Layer drivers +# +# CONFIG_USB_ISP1301 is not set # CONFIG_USB_GADGET is not set # @@ -3295,6 +3328,8 @@ CONFIG_SDIO_UART=y CONFIG_MMC_SDHCI=y # CONFIG_MMC_SDHCI_PCI is not set CONFIG_MMC_SDHCI_PLTFM=y +# CONFIG_MMC_SDHCI_PXAV3 is not set +# CONFIG_MMC_SDHCI_PXAV2 is not set # CONFIG_MMC_TIFM_SD is not set CONFIG_MMC_MVSDIO=y # CONFIG_MMC_SPI is not set @@ -3323,6 +3358,7 @@ CONFIG_LEDS_GPIO=y # CONFIG_LEDS_LT3593 is not set CONFIG_LEDS_NS2=y CONFIG_LEDS_NETXBIG=y +# CONFIG_LEDS_RENESAS_TPU is not set # CONFIG_LEDS_TCA6507 is not set # CONFIG_LEDS_OT200 is not set CONFIG_LEDS_TRIGGERS=y @@ -3339,6 +3375,7 @@ CONFIG_LEDS_TRIGGER_DEFAULT_ON=y # # iptables trigger is under Netfilter config (LED target) # +# CONFIG_LEDS_TRIGGER_TRANSIENT is not set # CONFIG_ACCESSIBILITY is not set # CONFIG_INFINIBAND is not set CONFIG_RTC_LIB=y @@ -3420,6 +3457,7 @@ CONFIG_DMADEVICES=y # DMA Devices # CONFIG_ASYNC_TX_ENABLE_CHANNEL_SWITCH=y +# CONFIG_DW_DMAC is not set CONFIG_MV_XOR=y # CONFIG_TIMB_DMA is not set CONFIG_DMA_ENGINE=y @@ -3463,12 +3501,9 @@ CONFIG_R8712U=y # CONFIG_IDE_PHISON is not set # CONFIG_LINE6_USB is not set CONFIG_USB_SERIAL_QUATECH2=m -CONFIG_USB_SERIAL_QUATECH_USB2=m # CONFIG_VT6655 is not set # CONFIG_VT6656 is not set -# CONFIG_VME_BUS is not set # CONFIG_DX_SEP is not set -# CONFIG_IIO is not set # CONFIG_FB_SM7XX is not set # CONFIG_CRYSTALHD is not set CONFIG_FB_XGI=m @@ -3490,6 +3525,16 @@ CONFIG_FB_XGI=m # CONFIG_ANDROID is not set # CONFIG_PHONE is not set # CONFIG_USB_WPAN_HCD is not set +# CONFIG_IPACK_BUS is not set +# CONFIG_WIMAX_GDM72XX is not set +CONFIG_CLKDEV_LOOKUP=y +CONFIG_HAVE_CLK_PREPARE=y +CONFIG_COMMON_CLK=y + +# +# Common Clock Framework +# +# CONFIG_COMMON_CLK_DEBUG is not set # # Hardware Spinlock drivers @@ -3506,6 +3551,10 @@ CONFIG_IOMMU_SUPPORT=y # # CONFIG_VIRT_DRIVERS is not set # CONFIG_PM_DEVFREQ is not set +# CONFIG_EXTCON is not set +# CONFIG_MEMORY is not set +# CONFIG_IIO is not set +# CONFIG_VME_BUS is not set # # File systems @@ -3638,11 +3687,9 @@ CONFIG_JFFS2_ZLIB=y CONFIG_JFFS2_RTIME=y # CONFIG_JFFS2_RUBIN is not set CONFIG_UBIFS_FS=y -# CONFIG_UBIFS_FS_XATTR is not set # CONFIG_UBIFS_FS_ADVANCED_COMPR is not set CONFIG_UBIFS_FS_LZO=y CONFIG_UBIFS_FS_ZLIB=y -# CONFIG_UBIFS_FS_DEBUG is not set # CONFIG_LOGFS is not set CONFIG_CRAMFS=y CONFIG_SQUASHFS=m @@ -3688,6 +3735,7 @@ CONFIG_AUFS_BDEV_LOOP=y # CONFIG_AUFS_DEBUG is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=m +CONFIG_NFS_V2=y CONFIG_NFS_V3=y # CONFIG_NFS_V3_ACL is not set CONFIG_NFS_V4=y @@ -3760,6 +3808,17 @@ CONFIG_NLS_ISO8859_2=y # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set +# CONFIG_NLS_MAC_ROMAN is not set +# CONFIG_NLS_MAC_CELTIC is not set +# CONFIG_NLS_MAC_CENTEURO is not set +# CONFIG_NLS_MAC_CROATIAN is not set +# CONFIG_NLS_MAC_CYRILLIC is not set +# CONFIG_NLS_MAC_GAELIC is not set +# CONFIG_NLS_MAC_GREEK is not set +# CONFIG_NLS_MAC_ICELAND is not set +# CONFIG_NLS_MAC_INUIT is not set +# CONFIG_NLS_MAC_ROMANIAN is not set +# CONFIG_NLS_MAC_TURKISH is not set CONFIG_NLS_UTF8=y # CONFIG_DLM is not set @@ -3773,6 +3832,7 @@ CONFIG_ENABLE_MUST_CHECK=y CONFIG_FRAME_WARN=1024 CONFIG_MAGIC_SYSRQ=y # CONFIG_STRIP_ASM_SYMS is not set +# CONFIG_READABLE_ASM is not set # CONFIG_UNUSED_SYMBOLS is not set CONFIG_DEBUG_FS=y # CONFIG_HEADERS_CHECK is not set @@ -3781,6 +3841,8 @@ CONFIG_DEBUG_KERNEL=y # CONFIG_DEBUG_SHIRQ is not set # CONFIG_LOCKUP_DETECTOR is not set # CONFIG_HARDLOCKUP_DETECTOR is not set +# CONFIG_PANIC_ON_OOPS is not set +CONFIG_PANIC_ON_OOPS_VALUE=0 CONFIG_DETECT_HUNG_TASK=y CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 # CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set @@ -3852,6 +3914,7 @@ CONFIG_BRANCH_PROFILE_NONE=y # CONFIG_STACK_TRACER is not set # CONFIG_BLK_DEV_IO_TRACE is not set CONFIG_KPROBE_EVENT=y +CONFIG_PROBE_EVENTS=y # CONFIG_RING_BUFFER_BENCHMARK is not set # CONFIG_DYNAMIC_DEBUG is not set # CONFIG_DMA_API_DEBUG is not set @@ -4066,3 +4129,4 @@ CONFIG_NLATTR=y CONFIG_GENERIC_ATOMIC64=y CONFIG_AVERAGE=y # CONFIG_CORDIC is not set +# CONFIG_DDR is not set