diff options
| -rw-r--r-- | arch/arm/Kconfig | 1 | ||||
| -rw-r--r-- | arch/arm/configs/h3600_defconfig | 22 | ||||
| -rw-r--r-- | arch/arm/kernel/entry-armv.S | 1 | ||||
| -rw-r--r-- | arch/arm/kernel/signal.c | 14 | ||||
| -rw-r--r-- | arch/arm/mach-highbank/Kconfig | 2 | ||||
| -rw-r--r-- | arch/arm/mach-sa1100/assabet.c | 3 | ||||
| -rw-r--r-- | arch/arm/mach-sa1100/include/mach/gpio.h | 55 | ||||
| -rw-r--r-- | arch/arm/mach-sa1100/include/mach/h3xxx.h | 2 | ||||
| -rw-r--r-- | arch/arm/mach-sa1100/simpad.c | 1 | ||||
| -rw-r--r-- | arch/arm/mach-tegra/Kconfig | 2 | ||||
| -rw-r--r-- | arch/arm/mm/dma-mapping.c | 4 | ||||
| -rw-r--r-- | arch/arm/mm/extable.c | 7 | ||||
| -rw-r--r-- | arch/arm/vfp/vfpmodule.c | 6 | ||||
| -rw-r--r-- | drivers/gpio/gpio-sa1100.c | 2 | ||||
| -rw-r--r-- | drivers/mmc/host/mmci.c | 78 | ||||
| -rw-r--r-- | drivers/mmc/host/mmci.h | 4 |
16 files changed, 98 insertions, 106 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 1dbb58c1feed..9f2d203162b2 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
| @@ -696,7 +696,6 @@ config ARCH_SA1100 | |||
| 696 | select GENERIC_CLOCKEVENTS | 696 | select GENERIC_CLOCKEVENTS |
| 697 | select HAVE_IDE | 697 | select HAVE_IDE |
| 698 | select ISA | 698 | select ISA |
| 699 | select NEED_MACH_GPIO_H | ||
| 700 | select NEED_MACH_MEMORY_H | 699 | select NEED_MACH_MEMORY_H |
| 701 | select SPARSE_IRQ | 700 | select SPARSE_IRQ |
| 702 | help | 701 | help |
diff --git a/arch/arm/configs/h3600_defconfig b/arch/arm/configs/h3600_defconfig index 317960f12488..0142ec37e0be 100644 --- a/arch/arm/configs/h3600_defconfig +++ b/arch/arm/configs/h3600_defconfig | |||
| @@ -1,5 +1,6 @@ | |||
| 1 | CONFIG_EXPERIMENTAL=y | ||
| 2 | CONFIG_SYSVIPC=y | 1 | CONFIG_SYSVIPC=y |
| 2 | CONFIG_NO_HZ_IDLE=y | ||
| 3 | CONFIG_HIGH_RES_TIMERS=y | ||
| 3 | CONFIG_LOG_BUF_SHIFT=14 | 4 | CONFIG_LOG_BUF_SHIFT=14 |
| 4 | CONFIG_BLK_DEV_INITRD=y | 5 | CONFIG_BLK_DEV_INITRD=y |
| 5 | CONFIG_MODULES=y | 6 | CONFIG_MODULES=y |
| @@ -11,11 +12,11 @@ CONFIG_ARCH_SA1100=y | |||
| 11 | CONFIG_SA1100_H3600=y | 12 | CONFIG_SA1100_H3600=y |
| 12 | CONFIG_PCCARD=y | 13 | CONFIG_PCCARD=y |
| 13 | CONFIG_PCMCIA_SA1100=y | 14 | CONFIG_PCMCIA_SA1100=y |
| 15 | CONFIG_PREEMPT=y | ||
| 14 | CONFIG_ZBOOT_ROM_TEXT=0x0 | 16 | CONFIG_ZBOOT_ROM_TEXT=0x0 |
| 15 | CONFIG_ZBOOT_ROM_BSS=0x0 | 17 | CONFIG_ZBOOT_ROM_BSS=0x0 |
| 16 | # CONFIG_CPU_FREQ_STAT is not set | 18 | # CONFIG_CPU_FREQ_STAT is not set |
| 17 | CONFIG_FPE_NWFPE=y | 19 | CONFIG_FPE_NWFPE=y |
| 18 | CONFIG_PM=y | ||
| 19 | CONFIG_NET=y | 20 | CONFIG_NET=y |
| 20 | CONFIG_UNIX=y | 21 | CONFIG_UNIX=y |
| 21 | CONFIG_INET=y | 22 | CONFIG_INET=y |
| @@ -24,13 +25,10 @@ CONFIG_IRDA=m | |||
| 24 | CONFIG_IRLAN=m | 25 | CONFIG_IRLAN=m |
| 25 | CONFIG_IRNET=m | 26 | CONFIG_IRNET=m |
| 26 | CONFIG_IRCOMM=m | 27 | CONFIG_IRCOMM=m |
| 27 | CONFIG_SA1100_FIR=m | ||
| 28 | # CONFIG_WIRELESS is not set | 28 | # CONFIG_WIRELESS is not set |
| 29 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | 29 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" |
| 30 | CONFIG_MTD=y | 30 | CONFIG_MTD=y |
| 31 | CONFIG_MTD_PARTITIONS=y | ||
| 32 | CONFIG_MTD_REDBOOT_PARTS=y | 31 | CONFIG_MTD_REDBOOT_PARTS=y |
| 33 | CONFIG_MTD_CHAR=y | ||
| 34 | CONFIG_MTD_BLOCK=y | 32 | CONFIG_MTD_BLOCK=y |
| 35 | CONFIG_MTD_CFI=y | 33 | CONFIG_MTD_CFI=y |
| 36 | CONFIG_MTD_CFI_ADV_OPTIONS=y | 34 | CONFIG_MTD_CFI_ADV_OPTIONS=y |
| @@ -41,19 +39,15 @@ CONFIG_MTD_SA1100=y | |||
| 41 | CONFIG_BLK_DEV_LOOP=m | 39 | CONFIG_BLK_DEV_LOOP=m |
| 42 | CONFIG_BLK_DEV_RAM=y | 40 | CONFIG_BLK_DEV_RAM=y |
| 43 | CONFIG_BLK_DEV_RAM_SIZE=8192 | 41 | CONFIG_BLK_DEV_RAM_SIZE=8192 |
| 44 | # CONFIG_MISC_DEVICES is not set | ||
| 45 | CONFIG_IDE=y | 42 | CONFIG_IDE=y |
| 46 | CONFIG_BLK_DEV_IDECS=y | 43 | CONFIG_BLK_DEV_IDECS=y |
| 47 | CONFIG_NETDEVICES=y | 44 | CONFIG_NETDEVICES=y |
| 48 | # CONFIG_NETDEV_1000 is not set | ||
| 49 | # CONFIG_NETDEV_10000 is not set | ||
| 50 | # CONFIG_WLAN is not set | ||
| 51 | CONFIG_NET_PCMCIA=y | ||
| 52 | CONFIG_PCMCIA_PCNET=y | 45 | CONFIG_PCMCIA_PCNET=y |
| 53 | CONFIG_PPP=m | 46 | CONFIG_PPP=m |
| 54 | CONFIG_PPP_ASYNC=m | ||
| 55 | CONFIG_PPP_DEFLATE=m | ||
| 56 | CONFIG_PPP_BSDCOMP=m | 47 | CONFIG_PPP_BSDCOMP=m |
| 48 | CONFIG_PPP_DEFLATE=m | ||
| 49 | CONFIG_PPP_ASYNC=m | ||
| 50 | # CONFIG_WLAN is not set | ||
| 57 | # CONFIG_KEYBOARD_ATKBD is not set | 51 | # CONFIG_KEYBOARD_ATKBD is not set |
| 58 | CONFIG_KEYBOARD_GPIO=y | 52 | CONFIG_KEYBOARD_GPIO=y |
| 59 | # CONFIG_INPUT_MOUSE is not set | 53 | # CONFIG_INPUT_MOUSE is not set |
| @@ -64,8 +58,6 @@ CONFIG_SERIAL_SA1100_CONSOLE=y | |||
| 64 | # CONFIG_HWMON is not set | 58 | # CONFIG_HWMON is not set |
| 65 | CONFIG_FB=y | 59 | CONFIG_FB=y |
| 66 | CONFIG_FB_SA1100=y | 60 | CONFIG_FB_SA1100=y |
| 67 | # CONFIG_VGA_CONSOLE is not set | ||
| 68 | # CONFIG_HID_SUPPORT is not set | ||
| 69 | # CONFIG_USB_SUPPORT is not set | 61 | # CONFIG_USB_SUPPORT is not set |
| 70 | CONFIG_EXT2_FS=y | 62 | CONFIG_EXT2_FS=y |
| 71 | CONFIG_MSDOS_FS=m | 63 | CONFIG_MSDOS_FS=m |
| @@ -74,6 +66,4 @@ CONFIG_JFFS2_FS=y | |||
| 74 | CONFIG_CRAMFS=m | 66 | CONFIG_CRAMFS=m |
| 75 | CONFIG_NFS_FS=y | 67 | CONFIG_NFS_FS=y |
| 76 | CONFIG_NFSD=m | 68 | CONFIG_NFSD=m |
| 77 | CONFIG_SMB_FS=m | ||
| 78 | CONFIG_NLS=y | 69 | CONFIG_NLS=y |
| 79 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | ||
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index 55090fbb81a2..b3fb8c9e1ff2 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S | |||
| @@ -192,6 +192,7 @@ __dabt_svc: | |||
| 192 | svc_entry | 192 | svc_entry |
| 193 | mov r2, sp | 193 | mov r2, sp |
| 194 | dabt_helper | 194 | dabt_helper |
| 195 | THUMB( ldr r5, [sp, #S_PSR] ) @ potentially updated CPSR | ||
| 195 | svc_exit r5 @ return from exception | 196 | svc_exit r5 @ return from exception |
| 196 | UNWIND(.fnend ) | 197 | UNWIND(.fnend ) |
| 197 | ENDPROC(__dabt_svc) | 198 | ENDPROC(__dabt_svc) |
diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c index 64845fc4152a..04d63880037f 100644 --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c | |||
| @@ -353,12 +353,18 @@ setup_return(struct pt_regs *regs, struct ksignal *ksig, | |||
| 353 | */ | 353 | */ |
| 354 | thumb = handler & 1; | 354 | thumb = handler & 1; |
| 355 | 355 | ||
| 356 | if (thumb) { | ||
| 357 | cpsr |= PSR_T_BIT; | ||
| 358 | #if __LINUX_ARM_ARCH__ >= 7 | 356 | #if __LINUX_ARM_ARCH__ >= 7 |
| 359 | /* clear the If-Then Thumb-2 execution state */ | 357 | /* |
| 360 | cpsr &= ~PSR_IT_MASK; | 358 | * Clear the If-Then Thumb-2 execution state |
| 359 | * ARM spec requires this to be all 000s in ARM mode | ||
| 360 | * Snapdragon S4/Krait misbehaves on a Thumb=>ARM | ||
| 361 | * signal transition without this. | ||
| 362 | */ | ||
| 363 | cpsr &= ~PSR_IT_MASK; | ||
| 361 | #endif | 364 | #endif |
| 365 | |||
| 366 | if (thumb) { | ||
| 367 | cpsr |= PSR_T_BIT; | ||
| 362 | } else | 368 | } else |
| 363 | cpsr &= ~PSR_T_BIT; | 369 | cpsr &= ~PSR_T_BIT; |
| 364 | } | 370 | } |
diff --git a/arch/arm/mach-highbank/Kconfig b/arch/arm/mach-highbank/Kconfig index 3c3bff715b47..0ca7377746c8 100644 --- a/arch/arm/mach-highbank/Kconfig +++ b/arch/arm/mach-highbank/Kconfig | |||
| @@ -9,7 +9,7 @@ config ARCH_HIGHBANK | |||
| 9 | select ARM_AMBA | 9 | select ARM_AMBA |
| 10 | select ARM_ERRATA_764369 | 10 | select ARM_ERRATA_764369 |
| 11 | select ARM_ERRATA_775420 | 11 | select ARM_ERRATA_775420 |
| 12 | select ARM_ERRATA_798181 | 12 | select ARM_ERRATA_798181 if SMP |
| 13 | select ARM_GIC | 13 | select ARM_GIC |
| 14 | select ARM_TIMER_SP804 | 14 | select ARM_TIMER_SP804 |
| 15 | select CACHE_L2X0 | 15 | select CACHE_L2X0 |
diff --git a/arch/arm/mach-sa1100/assabet.c b/arch/arm/mach-sa1100/assabet.c index e838ba27e443..c9808c684152 100644 --- a/arch/arm/mach-sa1100/assabet.c +++ b/arch/arm/mach-sa1100/assabet.c | |||
| @@ -512,6 +512,9 @@ static void __init assabet_map_io(void) | |||
| 512 | * Its called GPCLKR0 in my SA1110 manual. | 512 | * Its called GPCLKR0 in my SA1110 manual. |
| 513 | */ | 513 | */ |
| 514 | Ser1SDCR0 |= SDCR0_SUS; | 514 | Ser1SDCR0 |= SDCR0_SUS; |
| 515 | MSC1 = (MSC1 & ~0xffff) | | ||
| 516 | MSC_NonBrst | MSC_32BitStMem | | ||
| 517 | MSC_RdAcc(2) | MSC_WrAcc(2) | MSC_Rec(0); | ||
| 515 | 518 | ||
| 516 | if (!machine_has_neponset()) | 519 | if (!machine_has_neponset()) |
| 517 | sa1100_register_uart_fns(&assabet_port_fns); | 520 | sa1100_register_uart_fns(&assabet_port_fns); |
diff --git a/arch/arm/mach-sa1100/include/mach/gpio.h b/arch/arm/mach-sa1100/include/mach/gpio.h deleted file mode 100644 index 6a9eecf3137e..000000000000 --- a/arch/arm/mach-sa1100/include/mach/gpio.h +++ /dev/null | |||
| @@ -1,55 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * arch/arm/mach-sa1100/include/mach/gpio.h | ||
| 3 | * | ||
| 4 | * SA1100 GPIO wrappers for arch-neutral GPIO calls | ||
| 5 | * | ||
| 6 | * Written by Philipp Zabel <philipp.zabel@gmail.com> | ||
| 7 | * | ||
| 8 | * This program is free software; you can redistribute it and/or modify | ||
| 9 | * it under the terms of the GNU General Public License as published by | ||
| 10 | * the Free Software Foundation; either version 2 of the License, or | ||
| 11 | * (at your option) any later version. | ||
| 12 | * | ||
| 13 | * This program is distributed in the hope that it will be useful, | ||
| 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 16 | * GNU General Public License for more details. | ||
| 17 | * | ||
| 18 | * You should have received a copy of the GNU General Public License | ||
| 19 | * along with this program; if not, write to the Free Software | ||
| 20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 21 | * | ||
| 22 | */ | ||
| 23 | |||
| 24 | #ifndef __ASM_ARCH_SA1100_GPIO_H | ||
| 25 | #define __ASM_ARCH_SA1100_GPIO_H | ||
| 26 | |||
| 27 | #include <linux/io.h> | ||
| 28 | #include <mach/hardware.h> | ||
| 29 | #include <asm/irq.h> | ||
| 30 | #include <asm-generic/gpio.h> | ||
| 31 | |||
| 32 | #define __ARM_GPIOLIB_COMPLEX | ||
| 33 | |||
| 34 | static inline int gpio_get_value(unsigned gpio) | ||
| 35 | { | ||
| 36 | if (__builtin_constant_p(gpio) && (gpio <= GPIO_MAX)) | ||
| 37 | return GPLR & GPIO_GPIO(gpio); | ||
| 38 | else | ||
| 39 | return __gpio_get_value(gpio); | ||
| 40 | } | ||
| 41 | |||
| 42 | static inline void gpio_set_value(unsigned gpio, int value) | ||
| 43 | { | ||
| 44 | if (__builtin_constant_p(gpio) && (gpio <= GPIO_MAX)) | ||
| 45 | if (value) | ||
| 46 | GPSR = GPIO_GPIO(gpio); | ||
| 47 | else | ||
| 48 | GPCR = GPIO_GPIO(gpio); | ||
| 49 | else | ||
| 50 | __gpio_set_value(gpio, value); | ||
| 51 | } | ||
| 52 | |||
| 53 | #define gpio_cansleep __gpio_cansleep | ||
| 54 | |||
| 55 | #endif | ||
diff --git a/arch/arm/mach-sa1100/include/mach/h3xxx.h b/arch/arm/mach-sa1100/include/mach/h3xxx.h index 7d9df16f04a2..c810620db53d 100644 --- a/arch/arm/mach-sa1100/include/mach/h3xxx.h +++ b/arch/arm/mach-sa1100/include/mach/h3xxx.h | |||
| @@ -13,6 +13,8 @@ | |||
| 13 | #ifndef _INCLUDE_H3XXX_H_ | 13 | #ifndef _INCLUDE_H3XXX_H_ |
| 14 | #define _INCLUDE_H3XXX_H_ | 14 | #define _INCLUDE_H3XXX_H_ |
| 15 | 15 | ||
| 16 | #include "hardware.h" /* Gives GPIO_MAX */ | ||
| 17 | |||
| 16 | /* Physical memory regions corresponding to chip selects */ | 18 | /* Physical memory regions corresponding to chip selects */ |
| 17 | #define H3600_EGPIO_PHYS (SA1100_CS5_PHYS + 0x01000000) | 19 | #define H3600_EGPIO_PHYS (SA1100_CS5_PHYS + 0x01000000) |
| 18 | #define H3600_BANK_2_PHYS SA1100_CS2_PHYS | 20 | #define H3600_BANK_2_PHYS SA1100_CS2_PHYS |
diff --git a/arch/arm/mach-sa1100/simpad.c b/arch/arm/mach-sa1100/simpad.c index bcbc94540e45..41e476e571d7 100644 --- a/arch/arm/mach-sa1100/simpad.c +++ b/arch/arm/mach-sa1100/simpad.c | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | 19 | ||
| 20 | #include <mach/hardware.h> | 20 | #include <mach/hardware.h> |
| 21 | #include <asm/setup.h> | 21 | #include <asm/setup.h> |
| 22 | #include <asm/irq.h> | ||
| 22 | 23 | ||
| 23 | #include <asm/mach-types.h> | 24 | #include <asm/mach-types.h> |
| 24 | #include <asm/mach/arch.h> | 25 | #include <asm/mach/arch.h> |
diff --git a/arch/arm/mach-tegra/Kconfig b/arch/arm/mach-tegra/Kconfig index 67a76f2dfb9f..f26428d8b62a 100644 --- a/arch/arm/mach-tegra/Kconfig +++ b/arch/arm/mach-tegra/Kconfig | |||
| @@ -54,7 +54,7 @@ config ARCH_TEGRA_3x_SOC | |||
| 54 | config ARCH_TEGRA_114_SOC | 54 | config ARCH_TEGRA_114_SOC |
| 55 | bool "Enable support for Tegra114 family" | 55 | bool "Enable support for Tegra114 family" |
| 56 | select HAVE_ARM_ARCH_TIMER | 56 | select HAVE_ARM_ARCH_TIMER |
| 57 | select ARM_ERRATA_798181 | 57 | select ARM_ERRATA_798181 if SMP |
| 58 | select ARM_L1_CACHE_SHIFT_6 | 58 | select ARM_L1_CACHE_SHIFT_6 |
| 59 | select PINCTRL_TEGRA114 | 59 | select PINCTRL_TEGRA114 |
| 60 | help | 60 | help |
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 1272ed202dde..b5a3f6031146 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c | |||
| @@ -687,7 +687,7 @@ static void *__dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, | |||
| 687 | void *arm_dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, | 687 | void *arm_dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, |
| 688 | gfp_t gfp, struct dma_attrs *attrs) | 688 | gfp_t gfp, struct dma_attrs *attrs) |
| 689 | { | 689 | { |
| 690 | pgprot_t prot = __get_dma_pgprot(attrs, pgprot_kernel); | 690 | pgprot_t prot = __get_dma_pgprot(attrs, PAGE_KERNEL); |
| 691 | void *memory; | 691 | void *memory; |
| 692 | 692 | ||
| 693 | if (dma_alloc_from_coherent(dev, size, handle, &memory)) | 693 | if (dma_alloc_from_coherent(dev, size, handle, &memory)) |
| @@ -700,7 +700,7 @@ void *arm_dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, | |||
| 700 | static void *arm_coherent_dma_alloc(struct device *dev, size_t size, | 700 | static void *arm_coherent_dma_alloc(struct device *dev, size_t size, |
| 701 | dma_addr_t *handle, gfp_t gfp, struct dma_attrs *attrs) | 701 | dma_addr_t *handle, gfp_t gfp, struct dma_attrs *attrs) |
| 702 | { | 702 | { |
| 703 | pgprot_t prot = __get_dma_pgprot(attrs, pgprot_kernel); | 703 | pgprot_t prot = __get_dma_pgprot(attrs, PAGE_KERNEL); |
| 704 | void *memory; | 704 | void *memory; |
| 705 | 705 | ||
| 706 | if (dma_alloc_from_coherent(dev, size, handle, &memory)) | 706 | if (dma_alloc_from_coherent(dev, size, handle, &memory)) |
diff --git a/arch/arm/mm/extable.c b/arch/arm/mm/extable.c index 9d285626bc7d..312e15e6d00b 100644 --- a/arch/arm/mm/extable.c +++ b/arch/arm/mm/extable.c | |||
| @@ -9,8 +9,13 @@ int fixup_exception(struct pt_regs *regs) | |||
| 9 | const struct exception_table_entry *fixup; | 9 | const struct exception_table_entry *fixup; |
| 10 | 10 | ||
| 11 | fixup = search_exception_tables(instruction_pointer(regs)); | 11 | fixup = search_exception_tables(instruction_pointer(regs)); |
| 12 | if (fixup) | 12 | if (fixup) { |
| 13 | regs->ARM_pc = fixup->fixup; | 13 | regs->ARM_pc = fixup->fixup; |
| 14 | #ifdef CONFIG_THUMB2_KERNEL | ||
| 15 | /* Clear the IT state to avoid nasty surprises in the fixup */ | ||
| 16 | regs->ARM_cpsr &= ~PSR_IT_MASK; | ||
| 17 | #endif | ||
| 18 | } | ||
| 14 | 19 | ||
| 15 | return fixup != NULL; | 20 | return fixup != NULL; |
| 16 | } | 21 | } |
diff --git a/arch/arm/vfp/vfpmodule.c b/arch/arm/vfp/vfpmodule.c index 52b8f40b1c73..2f37e1d6cb45 100644 --- a/arch/arm/vfp/vfpmodule.c +++ b/arch/arm/vfp/vfpmodule.c | |||
| @@ -642,9 +642,9 @@ int vfp_restore_user_hwstate(struct user_vfp __user *ufp, | |||
| 642 | static int vfp_hotplug(struct notifier_block *b, unsigned long action, | 642 | static int vfp_hotplug(struct notifier_block *b, unsigned long action, |
| 643 | void *hcpu) | 643 | void *hcpu) |
| 644 | { | 644 | { |
| 645 | if (action == CPU_DYING || action == CPU_DYING_FROZEN) { | 645 | if (action == CPU_DYING || action == CPU_DYING_FROZEN) |
| 646 | vfp_force_reload((long)hcpu, current_thread_info()); | 646 | vfp_current_hw_state[(long)hcpu] = NULL; |
| 647 | } else if (action == CPU_STARTING || action == CPU_STARTING_FROZEN) | 647 | else if (action == CPU_STARTING || action == CPU_STARTING_FROZEN) |
| 648 | vfp_enable(NULL); | 648 | vfp_enable(NULL); |
| 649 | return NOTIFY_OK; | 649 | return NOTIFY_OK; |
| 650 | } | 650 | } |
diff --git a/drivers/gpio/gpio-sa1100.c b/drivers/gpio/gpio-sa1100.c index 8ea3b33d4b40..a90be34e4d5c 100644 --- a/drivers/gpio/gpio-sa1100.c +++ b/drivers/gpio/gpio-sa1100.c | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | #include <linux/gpio.h> | 10 | #include <linux/gpio.h> |
| 11 | #include <linux/init.h> | 11 | #include <linux/init.h> |
| 12 | #include <linux/module.h> | 12 | #include <linux/module.h> |
| 13 | 13 | #include <linux/io.h> | |
| 14 | #include <mach/hardware.h> | 14 | #include <mach/hardware.h> |
| 15 | #include <mach/irqs.h> | 15 | #include <mach/irqs.h> |
| 16 | 16 | ||
diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c index c3785edc0e92..d135c76c4855 100644 --- a/drivers/mmc/host/mmci.c +++ b/drivers/mmc/host/mmci.c | |||
| @@ -62,6 +62,7 @@ static unsigned int fmax = 515633; | |||
| 62 | * @signal_direction: input/out direction of bus signals can be indicated | 62 | * @signal_direction: input/out direction of bus signals can be indicated |
| 63 | * @pwrreg_clkgate: MMCIPOWER register must be used to gate the clock | 63 | * @pwrreg_clkgate: MMCIPOWER register must be used to gate the clock |
| 64 | * @busy_detect: true if busy detection on dat0 is supported | 64 | * @busy_detect: true if busy detection on dat0 is supported |
| 65 | * @pwrreg_nopower: bits in MMCIPOWER don't controls ext. power supply | ||
| 65 | */ | 66 | */ |
| 66 | struct variant_data { | 67 | struct variant_data { |
| 67 | unsigned int clkreg; | 68 | unsigned int clkreg; |
| @@ -76,6 +77,7 @@ struct variant_data { | |||
| 76 | bool signal_direction; | 77 | bool signal_direction; |
| 77 | bool pwrreg_clkgate; | 78 | bool pwrreg_clkgate; |
| 78 | bool busy_detect; | 79 | bool busy_detect; |
| 80 | bool pwrreg_nopower; | ||
| 79 | }; | 81 | }; |
| 80 | 82 | ||
| 81 | static struct variant_data variant_arm = { | 83 | static struct variant_data variant_arm = { |
| @@ -109,6 +111,7 @@ static struct variant_data variant_u300 = { | |||
| 109 | .pwrreg_powerup = MCI_PWR_ON, | 111 | .pwrreg_powerup = MCI_PWR_ON, |
| 110 | .signal_direction = true, | 112 | .signal_direction = true, |
| 111 | .pwrreg_clkgate = true, | 113 | .pwrreg_clkgate = true, |
| 114 | .pwrreg_nopower = true, | ||
| 112 | }; | 115 | }; |
| 113 | 116 | ||
| 114 | static struct variant_data variant_nomadik = { | 117 | static struct variant_data variant_nomadik = { |
| @@ -121,6 +124,7 @@ static struct variant_data variant_nomadik = { | |||
| 121 | .pwrreg_powerup = MCI_PWR_ON, | 124 | .pwrreg_powerup = MCI_PWR_ON, |
| 122 | .signal_direction = true, | 125 | .signal_direction = true, |
| 123 | .pwrreg_clkgate = true, | 126 | .pwrreg_clkgate = true, |
| 127 | .pwrreg_nopower = true, | ||
| 124 | }; | 128 | }; |
| 125 | 129 | ||
| 126 | static struct variant_data variant_ux500 = { | 130 | static struct variant_data variant_ux500 = { |
| @@ -135,6 +139,7 @@ static struct variant_data variant_ux500 = { | |||
| 135 | .signal_direction = true, | 139 | .signal_direction = true, |
| 136 | .pwrreg_clkgate = true, | 140 | .pwrreg_clkgate = true, |
| 137 | .busy_detect = true, | 141 | .busy_detect = true, |
| 142 | .pwrreg_nopower = true, | ||
| 138 | }; | 143 | }; |
| 139 | 144 | ||
| 140 | static struct variant_data variant_ux500v2 = { | 145 | static struct variant_data variant_ux500v2 = { |
| @@ -150,6 +155,7 @@ static struct variant_data variant_ux500v2 = { | |||
| 150 | .signal_direction = true, | 155 | .signal_direction = true, |
| 151 | .pwrreg_clkgate = true, | 156 | .pwrreg_clkgate = true, |
| 152 | .busy_detect = true, | 157 | .busy_detect = true, |
| 158 | .pwrreg_nopower = true, | ||
| 153 | }; | 159 | }; |
| 154 | 160 | ||
| 155 | static int mmci_card_busy(struct mmc_host *mmc) | 161 | static int mmci_card_busy(struct mmc_host *mmc) |
| @@ -189,6 +195,21 @@ static int mmci_validate_data(struct mmci_host *host, | |||
| 189 | return 0; | 195 | return 0; |
| 190 | } | 196 | } |
| 191 | 197 | ||
| 198 | static void mmci_reg_delay(struct mmci_host *host) | ||
| 199 | { | ||
| 200 | /* | ||
| 201 | * According to the spec, at least three feedback clock cycles | ||
| 202 | * of max 52 MHz must pass between two writes to the MMCICLOCK reg. | ||
| 203 | * Three MCLK clock cycles must pass between two MMCIPOWER reg writes. | ||
| 204 | * Worst delay time during card init is at 100 kHz => 30 us. | ||
| 205 | * Worst delay time when up and running is at 25 MHz => 120 ns. | ||
| 206 | */ | ||
| 207 | if (host->cclk < 25000000) | ||
| 208 | udelay(30); | ||
| 209 | else | ||
| 210 | ndelay(120); | ||
| 211 | } | ||
| 212 | |||
| 192 | /* | 213 | /* |
| 193 | * This must be called with host->lock held | 214 | * This must be called with host->lock held |
| 194 | */ | 215 | */ |
| @@ -1264,6 +1285,7 @@ static void mmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) | |||
| 1264 | 1285 | ||
| 1265 | mmci_set_clkreg(host, ios->clock); | 1286 | mmci_set_clkreg(host, ios->clock); |
| 1266 | mmci_write_pwrreg(host, pwr); | 1287 | mmci_write_pwrreg(host, pwr); |
| 1288 | mmci_reg_delay(host); | ||
| 1267 | 1289 | ||
| 1268 | spin_unlock_irqrestore(&host->lock, flags); | 1290 | spin_unlock_irqrestore(&host->lock, flags); |
| 1269 | 1291 | ||
| @@ -1510,23 +1532,6 @@ static int mmci_probe(struct amba_device *dev, | |||
| 1510 | mmc->f_max = min(host->mclk, fmax); | 1532 | mmc->f_max = min(host->mclk, fmax); |
| 1511 | dev_dbg(mmc_dev(mmc), "clocking block at %u Hz\n", mmc->f_max); | 1533 | dev_dbg(mmc_dev(mmc), "clocking block at %u Hz\n", mmc->f_max); |
| 1512 | 1534 | ||
| 1513 | host->pinctrl = devm_pinctrl_get(&dev->dev); | ||
| 1514 | if (IS_ERR(host->pinctrl)) { | ||
| 1515 | ret = PTR_ERR(host->pinctrl); | ||
| 1516 | goto clk_disable; | ||
| 1517 | } | ||
| 1518 | |||
| 1519 | host->pins_default = pinctrl_lookup_state(host->pinctrl, | ||
| 1520 | PINCTRL_STATE_DEFAULT); | ||
| 1521 | |||
| 1522 | /* enable pins to be muxed in and configured */ | ||
| 1523 | if (!IS_ERR(host->pins_default)) { | ||
| 1524 | ret = pinctrl_select_state(host->pinctrl, host->pins_default); | ||
| 1525 | if (ret) | ||
| 1526 | dev_warn(&dev->dev, "could not set default pins\n"); | ||
| 1527 | } else | ||
| 1528 | dev_warn(&dev->dev, "could not get default pinstate\n"); | ||
| 1529 | |||
| 1530 | /* Get regulators and the supported OCR mask */ | 1535 | /* Get regulators and the supported OCR mask */ |
| 1531 | mmc_regulator_get_supply(mmc); | 1536 | mmc_regulator_get_supply(mmc); |
| 1532 | if (!mmc->ocr_avail) | 1537 | if (!mmc->ocr_avail) |
| @@ -1760,6 +1765,41 @@ static int mmci_resume(struct device *dev) | |||
| 1760 | #endif | 1765 | #endif |
| 1761 | 1766 | ||
| 1762 | #ifdef CONFIG_PM_RUNTIME | 1767 | #ifdef CONFIG_PM_RUNTIME |
| 1768 | static void mmci_save(struct mmci_host *host) | ||
| 1769 | { | ||
| 1770 | unsigned long flags; | ||
| 1771 | |||
| 1772 | if (host->variant->pwrreg_nopower) { | ||
| 1773 | spin_lock_irqsave(&host->lock, flags); | ||
| 1774 | |||
| 1775 | writel(0, host->base + MMCIMASK0); | ||
| 1776 | writel(0, host->base + MMCIDATACTRL); | ||
| 1777 | writel(0, host->base + MMCIPOWER); | ||
| 1778 | writel(0, host->base + MMCICLOCK); | ||
| 1779 | mmci_reg_delay(host); | ||
| 1780 | |||
| 1781 | spin_unlock_irqrestore(&host->lock, flags); | ||
| 1782 | } | ||
| 1783 | |||
| 1784 | } | ||
| 1785 | |||
| 1786 | static void mmci_restore(struct mmci_host *host) | ||
| 1787 | { | ||
| 1788 | unsigned long flags; | ||
| 1789 | |||
| 1790 | if (host->variant->pwrreg_nopower) { | ||
| 1791 | spin_lock_irqsave(&host->lock, flags); | ||
| 1792 | |||
| 1793 | writel(host->clk_reg, host->base + MMCICLOCK); | ||
| 1794 | writel(host->datactrl_reg, host->base + MMCIDATACTRL); | ||
| 1795 | writel(host->pwr_reg, host->base + MMCIPOWER); | ||
| 1796 | writel(MCI_IRQENABLE, host->base + MMCIMASK0); | ||
| 1797 | mmci_reg_delay(host); | ||
| 1798 | |||
| 1799 | spin_unlock_irqrestore(&host->lock, flags); | ||
| 1800 | } | ||
| 1801 | } | ||
| 1802 | |||
| 1763 | static int mmci_runtime_suspend(struct device *dev) | 1803 | static int mmci_runtime_suspend(struct device *dev) |
| 1764 | { | 1804 | { |
| 1765 | struct amba_device *adev = to_amba_device(dev); | 1805 | struct amba_device *adev = to_amba_device(dev); |
| @@ -1767,6 +1807,8 @@ static int mmci_runtime_suspend(struct device *dev) | |||
| 1767 | 1807 | ||
| 1768 | if (mmc) { | 1808 | if (mmc) { |
| 1769 | struct mmci_host *host = mmc_priv(mmc); | 1809 | struct mmci_host *host = mmc_priv(mmc); |
| 1810 | pinctrl_pm_select_sleep_state(dev); | ||
| 1811 | mmci_save(host); | ||
| 1770 | clk_disable_unprepare(host->clk); | 1812 | clk_disable_unprepare(host->clk); |
| 1771 | } | 1813 | } |
| 1772 | 1814 | ||
| @@ -1781,6 +1823,8 @@ static int mmci_runtime_resume(struct device *dev) | |||
| 1781 | if (mmc) { | 1823 | if (mmc) { |
| 1782 | struct mmci_host *host = mmc_priv(mmc); | 1824 | struct mmci_host *host = mmc_priv(mmc); |
| 1783 | clk_prepare_enable(host->clk); | 1825 | clk_prepare_enable(host->clk); |
| 1826 | mmci_restore(host); | ||
| 1827 | pinctrl_pm_select_default_state(dev); | ||
| 1784 | } | 1828 | } |
| 1785 | 1829 | ||
| 1786 | return 0; | 1830 | return 0; |
diff --git a/drivers/mmc/host/mmci.h b/drivers/mmc/host/mmci.h index 69080fab6375..168bc72f7a94 100644 --- a/drivers/mmc/host/mmci.h +++ b/drivers/mmc/host/mmci.h | |||
| @@ -200,10 +200,6 @@ struct mmci_host { | |||
| 200 | struct sg_mapping_iter sg_miter; | 200 | struct sg_mapping_iter sg_miter; |
| 201 | unsigned int size; | 201 | unsigned int size; |
| 202 | 202 | ||
| 203 | /* pinctrl handles */ | ||
| 204 | struct pinctrl *pinctrl; | ||
| 205 | struct pinctrl_state *pins_default; | ||
| 206 | |||
| 207 | #ifdef CONFIG_DMA_ENGINE | 203 | #ifdef CONFIG_DMA_ENGINE |
| 208 | /* DMA stuff */ | 204 | /* DMA stuff */ |
| 209 | struct dma_chan *dma_current; | 205 | struct dma_chan *dma_current; |
