diff options
Diffstat (limited to 'arch/arm')
| -rw-r--r-- | arch/arm/boot/Makefile | 2 | ||||
| -rw-r--r-- | arch/arm/include/asm/hardware/cache-l2x0.h | 2 | ||||
| -rw-r--r-- | arch/arm/include/asm/mach/arch.h | 1 | ||||
| -rw-r--r-- | arch/arm/include/asm/unistd.h | 2 | ||||
| -rw-r--r-- | arch/arm/kernel/calls.S | 2 | ||||
| -rw-r--r-- | arch/arm/kernel/head.S | 2 | ||||
| -rw-r--r-- | arch/arm/kernel/machine_kexec.c | 35 | ||||
| -rw-r--r-- | arch/arm/kernel/setup.c | 6 | ||||
| -rw-r--r-- | arch/arm/mach-bcmring/core.c | 2 | ||||
| -rw-r--r-- | arch/arm/mach-bcmring/dma.c | 1 | ||||
| -rw-r--r-- | arch/arm/mach-shmobile/pm-sh7372.c | 33 | ||||
| -rw-r--r-- | arch/arm/mach-w90x900/dev.c | 4 | ||||
| -rw-r--r-- | arch/arm/mach-w90x900/include/mach/mfp.h | 3 | ||||
| -rw-r--r-- | arch/arm/mach-w90x900/include/mach/nuc900_spi.h | 2 | ||||
| -rw-r--r-- | arch/arm/mach-w90x900/mfp.c | 48 |
15 files changed, 106 insertions, 39 deletions
diff --git a/arch/arm/boot/Makefile b/arch/arm/boot/Makefile index 176062ac7f07..5df26a9976a2 100644 --- a/arch/arm/boot/Makefile +++ b/arch/arm/boot/Makefile | |||
| @@ -65,6 +65,8 @@ $(obj)/%.dtb: $(src)/dts/%.dts | |||
| 65 | 65 | ||
| 66 | $(obj)/dtbs: $(addprefix $(obj)/, $(dtb-y)) | 66 | $(obj)/dtbs: $(addprefix $(obj)/, $(dtb-y)) |
| 67 | 67 | ||
| 68 | clean-files := *.dtb | ||
| 69 | |||
| 68 | quiet_cmd_uimage = UIMAGE $@ | 70 | quiet_cmd_uimage = UIMAGE $@ |
| 69 | cmd_uimage = $(CONFIG_SHELL) $(MKIMAGE) -A arm -O linux -T kernel \ | 71 | cmd_uimage = $(CONFIG_SHELL) $(MKIMAGE) -A arm -O linux -T kernel \ |
| 70 | -C none -a $(LOADADDR) -e $(STARTADDR) \ | 72 | -C none -a $(LOADADDR) -e $(STARTADDR) \ |
diff --git a/arch/arm/include/asm/hardware/cache-l2x0.h b/arch/arm/include/asm/hardware/cache-l2x0.h index 1db1143a9483..7df239bcdf27 100644 --- a/arch/arm/include/asm/hardware/cache-l2x0.h +++ b/arch/arm/include/asm/hardware/cache-l2x0.h | |||
| @@ -20,6 +20,8 @@ | |||
| 20 | #ifndef __ASM_ARM_HARDWARE_L2X0_H | 20 | #ifndef __ASM_ARM_HARDWARE_L2X0_H |
| 21 | #define __ASM_ARM_HARDWARE_L2X0_H | 21 | #define __ASM_ARM_HARDWARE_L2X0_H |
| 22 | 22 | ||
| 23 | #include <linux/errno.h> | ||
| 24 | |||
| 23 | #define L2X0_CACHE_ID 0x000 | 25 | #define L2X0_CACHE_ID 0x000 |
| 24 | #define L2X0_CACHE_TYPE 0x004 | 26 | #define L2X0_CACHE_TYPE 0x004 |
| 25 | #define L2X0_CTRL 0x100 | 27 | #define L2X0_CTRL 0x100 |
diff --git a/arch/arm/include/asm/mach/arch.h b/arch/arm/include/asm/mach/arch.h index 7d19425dd496..2b0efc3104ac 100644 --- a/arch/arm/include/asm/mach/arch.h +++ b/arch/arm/include/asm/mach/arch.h | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | struct tag; | 13 | struct tag; |
| 14 | struct meminfo; | 14 | struct meminfo; |
| 15 | struct sys_timer; | 15 | struct sys_timer; |
| 16 | struct pt_regs; | ||
| 16 | 17 | ||
| 17 | struct machine_desc { | 18 | struct machine_desc { |
| 18 | unsigned int nr; /* architecture number */ | 19 | unsigned int nr; /* architecture number */ |
diff --git a/arch/arm/include/asm/unistd.h b/arch/arm/include/asm/unistd.h index c60a2944f95b..4a1123783806 100644 --- a/arch/arm/include/asm/unistd.h +++ b/arch/arm/include/asm/unistd.h | |||
| @@ -402,6 +402,8 @@ | |||
| 402 | #define __NR_syncfs (__NR_SYSCALL_BASE+373) | 402 | #define __NR_syncfs (__NR_SYSCALL_BASE+373) |
| 403 | #define __NR_sendmmsg (__NR_SYSCALL_BASE+374) | 403 | #define __NR_sendmmsg (__NR_SYSCALL_BASE+374) |
| 404 | #define __NR_setns (__NR_SYSCALL_BASE+375) | 404 | #define __NR_setns (__NR_SYSCALL_BASE+375) |
| 405 | #define __NR_process_vm_readv (__NR_SYSCALL_BASE+376) | ||
| 406 | #define __NR_process_vm_writev (__NR_SYSCALL_BASE+377) | ||
| 405 | 407 | ||
| 406 | /* | 408 | /* |
| 407 | * The following SWIs are ARM private. | 409 | * The following SWIs are ARM private. |
diff --git a/arch/arm/kernel/calls.S b/arch/arm/kernel/calls.S index 9943e9e74a1b..463ff4a0ec8a 100644 --- a/arch/arm/kernel/calls.S +++ b/arch/arm/kernel/calls.S | |||
| @@ -385,6 +385,8 @@ | |||
| 385 | CALL(sys_syncfs) | 385 | CALL(sys_syncfs) |
| 386 | CALL(sys_sendmmsg) | 386 | CALL(sys_sendmmsg) |
| 387 | /* 375 */ CALL(sys_setns) | 387 | /* 375 */ CALL(sys_setns) |
| 388 | CALL(sys_process_vm_readv) | ||
| 389 | CALL(sys_process_vm_writev) | ||
| 388 | #ifndef syscalls_counted | 390 | #ifndef syscalls_counted |
| 389 | .equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls | 391 | .equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls |
| 390 | #define syscalls_counted | 392 | #define syscalls_counted |
diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S index 566c54c2a1fe..08c82fd844a8 100644 --- a/arch/arm/kernel/head.S +++ b/arch/arm/kernel/head.S | |||
| @@ -360,7 +360,7 @@ __secondary_data: | |||
| 360 | * r13 = *virtual* address to jump to upon completion | 360 | * r13 = *virtual* address to jump to upon completion |
| 361 | */ | 361 | */ |
| 362 | __enable_mmu: | 362 | __enable_mmu: |
| 363 | #ifdef CONFIG_ALIGNMENT_TRAP | 363 | #if defined(CONFIG_ALIGNMENT_TRAP) && __LINUX_ARM_ARCH__ < 6 |
| 364 | orr r0, r0, #CR_A | 364 | orr r0, r0, #CR_A |
| 365 | #else | 365 | #else |
| 366 | bic r0, r0, #CR_A | 366 | bic r0, r0, #CR_A |
diff --git a/arch/arm/kernel/machine_kexec.c b/arch/arm/kernel/machine_kexec.c index c1b4463dcc83..e59bbd496c39 100644 --- a/arch/arm/kernel/machine_kexec.c +++ b/arch/arm/kernel/machine_kexec.c | |||
| @@ -32,24 +32,6 @@ static atomic_t waiting_for_crash_ipi; | |||
| 32 | 32 | ||
| 33 | int machine_kexec_prepare(struct kimage *image) | 33 | int machine_kexec_prepare(struct kimage *image) |
| 34 | { | 34 | { |
| 35 | unsigned long page_list; | ||
| 36 | void *reboot_code_buffer; | ||
| 37 | page_list = image->head & PAGE_MASK; | ||
| 38 | |||
| 39 | reboot_code_buffer = page_address(image->control_code_page); | ||
| 40 | |||
| 41 | /* Prepare parameters for reboot_code_buffer*/ | ||
| 42 | kexec_start_address = image->start; | ||
| 43 | kexec_indirection_page = page_list; | ||
| 44 | kexec_mach_type = machine_arch_type; | ||
| 45 | kexec_boot_atags = image->start - KEXEC_ARM_ZIMAGE_OFFSET + KEXEC_ARM_ATAGS_OFFSET; | ||
| 46 | |||
| 47 | /* copy our kernel relocation code to the control code page */ | ||
| 48 | memcpy(reboot_code_buffer, | ||
| 49 | relocate_new_kernel, relocate_new_kernel_size); | ||
| 50 | |||
| 51 | flush_icache_range((unsigned long) reboot_code_buffer, | ||
| 52 | (unsigned long) reboot_code_buffer + KEXEC_CONTROL_PAGE_SIZE); | ||
| 53 | return 0; | 35 | return 0; |
| 54 | } | 36 | } |
| 55 | 37 | ||
| @@ -100,14 +82,31 @@ void (*kexec_reinit)(void); | |||
| 100 | 82 | ||
| 101 | void machine_kexec(struct kimage *image) | 83 | void machine_kexec(struct kimage *image) |
| 102 | { | 84 | { |
| 85 | unsigned long page_list; | ||
| 103 | unsigned long reboot_code_buffer_phys; | 86 | unsigned long reboot_code_buffer_phys; |
| 104 | void *reboot_code_buffer; | 87 | void *reboot_code_buffer; |
| 105 | 88 | ||
| 89 | |||
| 90 | page_list = image->head & PAGE_MASK; | ||
| 91 | |||
| 106 | /* we need both effective and real address here */ | 92 | /* we need both effective and real address here */ |
| 107 | reboot_code_buffer_phys = | 93 | reboot_code_buffer_phys = |
| 108 | page_to_pfn(image->control_code_page) << PAGE_SHIFT; | 94 | page_to_pfn(image->control_code_page) << PAGE_SHIFT; |
| 109 | reboot_code_buffer = page_address(image->control_code_page); | 95 | reboot_code_buffer = page_address(image->control_code_page); |
| 110 | 96 | ||
| 97 | /* Prepare parameters for reboot_code_buffer*/ | ||
| 98 | kexec_start_address = image->start; | ||
| 99 | kexec_indirection_page = page_list; | ||
| 100 | kexec_mach_type = machine_arch_type; | ||
| 101 | kexec_boot_atags = image->start - KEXEC_ARM_ZIMAGE_OFFSET + KEXEC_ARM_ATAGS_OFFSET; | ||
| 102 | |||
| 103 | /* copy our kernel relocation code to the control code page */ | ||
| 104 | memcpy(reboot_code_buffer, | ||
| 105 | relocate_new_kernel, relocate_new_kernel_size); | ||
| 106 | |||
| 107 | |||
| 108 | flush_icache_range((unsigned long) reboot_code_buffer, | ||
| 109 | (unsigned long) reboot_code_buffer + KEXEC_CONTROL_PAGE_SIZE); | ||
| 111 | printk(KERN_INFO "Bye!\n"); | 110 | printk(KERN_INFO "Bye!\n"); |
| 112 | 111 | ||
| 113 | if (kexec_reinit) | 112 | if (kexec_reinit) |
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 7e7977ab994f..3448a3f9cc8c 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c | |||
| @@ -461,8 +461,10 @@ static void __init setup_processor(void) | |||
| 461 | cpu_name, read_cpuid_id(), read_cpuid_id() & 15, | 461 | cpu_name, read_cpuid_id(), read_cpuid_id() & 15, |
| 462 | proc_arch[cpu_architecture()], cr_alignment); | 462 | proc_arch[cpu_architecture()], cr_alignment); |
| 463 | 463 | ||
| 464 | sprintf(init_utsname()->machine, "%s%c", list->arch_name, ENDIANNESS); | 464 | snprintf(init_utsname()->machine, __NEW_UTS_LEN + 1, "%s%c", |
| 465 | sprintf(elf_platform, "%s%c", list->elf_name, ENDIANNESS); | 465 | list->arch_name, ENDIANNESS); |
| 466 | snprintf(elf_platform, ELF_PLATFORM_SIZE, "%s%c", | ||
| 467 | list->elf_name, ENDIANNESS); | ||
| 466 | elf_hwcap = list->elf_hwcap; | 468 | elf_hwcap = list->elf_hwcap; |
| 467 | #ifndef CONFIG_ARM_THUMB | 469 | #ifndef CONFIG_ARM_THUMB |
| 468 | elf_hwcap &= ~HWCAP_THUMB; | 470 | elf_hwcap &= ~HWCAP_THUMB; |
diff --git a/arch/arm/mach-bcmring/core.c b/arch/arm/mach-bcmring/core.c index 43eadbcc29ed..430da120a297 100644 --- a/arch/arm/mach-bcmring/core.c +++ b/arch/arm/mach-bcmring/core.c | |||
| @@ -235,7 +235,7 @@ void __init bcmring_init_timer(void) | |||
| 235 | */ | 235 | */ |
| 236 | bcmring_clocksource_init(); | 236 | bcmring_clocksource_init(); |
| 237 | 237 | ||
| 238 | sp804_clockevents_register(TIMER0_VA_BASE, IRQ_TIMER0, "timer0"); | 238 | sp804_clockevents_init(TIMER0_VA_BASE, IRQ_TIMER0, "timer0"); |
| 239 | } | 239 | } |
| 240 | 240 | ||
| 241 | struct sys_timer bcmring_timer = { | 241 | struct sys_timer bcmring_timer = { |
diff --git a/arch/arm/mach-bcmring/dma.c b/arch/arm/mach-bcmring/dma.c index b52b8de91bde..f4d4d6d174d0 100644 --- a/arch/arm/mach-bcmring/dma.c +++ b/arch/arm/mach-bcmring/dma.c | |||
| @@ -36,6 +36,7 @@ | |||
| 36 | #include <linux/mm.h> | 36 | #include <linux/mm.h> |
| 37 | #include <linux/pfn.h> | 37 | #include <linux/pfn.h> |
| 38 | #include <linux/atomic.h> | 38 | #include <linux/atomic.h> |
| 39 | #include <linux/sched.h> | ||
| 39 | #include <mach/dma.h> | 40 | #include <mach/dma.h> |
| 40 | 41 | ||
| 41 | /* I don't quite understand why dc4 fails when this is set to 1 and DMA is enabled */ | 42 | /* I don't quite understand why dc4 fails when this is set to 1 and DMA is enabled */ |
diff --git a/arch/arm/mach-shmobile/pm-sh7372.c b/arch/arm/mach-shmobile/pm-sh7372.c index 0a5b22942fd3..34bbcbfb1706 100644 --- a/arch/arm/mach-shmobile/pm-sh7372.c +++ b/arch/arm/mach-shmobile/pm-sh7372.c | |||
| @@ -20,6 +20,7 @@ | |||
| 20 | #include <linux/delay.h> | 20 | #include <linux/delay.h> |
| 21 | #include <linux/irq.h> | 21 | #include <linux/irq.h> |
| 22 | #include <linux/bitrev.h> | 22 | #include <linux/bitrev.h> |
| 23 | #include <linux/console.h> | ||
| 23 | #include <asm/system.h> | 24 | #include <asm/system.h> |
| 24 | #include <asm/io.h> | 25 | #include <asm/io.h> |
| 25 | #include <asm/tlbflush.h> | 26 | #include <asm/tlbflush.h> |
| @@ -106,9 +107,8 @@ static int pd_power_down(struct generic_pm_domain *genpd) | |||
| 106 | return 0; | 107 | return 0; |
| 107 | } | 108 | } |
| 108 | 109 | ||
| 109 | static int pd_power_up(struct generic_pm_domain *genpd) | 110 | static int __pd_power_up(struct sh7372_pm_domain *sh7372_pd, bool do_resume) |
| 110 | { | 111 | { |
| 111 | struct sh7372_pm_domain *sh7372_pd = to_sh7372_pd(genpd); | ||
| 112 | unsigned int mask = 1 << sh7372_pd->bit_shift; | 112 | unsigned int mask = 1 << sh7372_pd->bit_shift; |
| 113 | unsigned int retry_count; | 113 | unsigned int retry_count; |
| 114 | int ret = 0; | 114 | int ret = 0; |
| @@ -123,13 +123,13 @@ static int pd_power_up(struct generic_pm_domain *genpd) | |||
| 123 | 123 | ||
| 124 | for (retry_count = 2 * PSTR_RETRIES; retry_count; retry_count--) { | 124 | for (retry_count = 2 * PSTR_RETRIES; retry_count; retry_count--) { |
| 125 | if (!(__raw_readl(SWUCR) & mask)) | 125 | if (!(__raw_readl(SWUCR) & mask)) |
| 126 | goto out; | 126 | break; |
| 127 | if (retry_count > PSTR_RETRIES) | 127 | if (retry_count > PSTR_RETRIES) |
| 128 | udelay(PSTR_DELAY_US); | 128 | udelay(PSTR_DELAY_US); |
| 129 | else | 129 | else |
| 130 | cpu_relax(); | 130 | cpu_relax(); |
| 131 | } | 131 | } |
| 132 | if (__raw_readl(SWUCR) & mask) | 132 | if (!retry_count) |
| 133 | ret = -EIO; | 133 | ret = -EIO; |
| 134 | 134 | ||
| 135 | if (!sh7372_pd->no_debug) | 135 | if (!sh7372_pd->no_debug) |
| @@ -137,12 +137,17 @@ static int pd_power_up(struct generic_pm_domain *genpd) | |||
| 137 | mask, __raw_readl(PSTR)); | 137 | mask, __raw_readl(PSTR)); |
| 138 | 138 | ||
| 139 | out: | 139 | out: |
| 140 | if (ret == 0 && sh7372_pd->resume) | 140 | if (ret == 0 && sh7372_pd->resume && do_resume) |
| 141 | sh7372_pd->resume(); | 141 | sh7372_pd->resume(); |
| 142 | 142 | ||
| 143 | return ret; | 143 | return ret; |
| 144 | } | 144 | } |
| 145 | 145 | ||
| 146 | static int pd_power_up(struct generic_pm_domain *genpd) | ||
| 147 | { | ||
| 148 | return __pd_power_up(to_sh7372_pd(genpd), true); | ||
| 149 | } | ||
| 150 | |||
| 146 | static void sh7372_a4r_suspend(void) | 151 | static void sh7372_a4r_suspend(void) |
| 147 | { | 152 | { |
| 148 | sh7372_intcs_suspend(); | 153 | sh7372_intcs_suspend(); |
| @@ -174,7 +179,7 @@ void sh7372_init_pm_domain(struct sh7372_pm_domain *sh7372_pd) | |||
| 174 | genpd->active_wakeup = pd_active_wakeup; | 179 | genpd->active_wakeup = pd_active_wakeup; |
| 175 | genpd->power_off = pd_power_down; | 180 | genpd->power_off = pd_power_down; |
| 176 | genpd->power_on = pd_power_up; | 181 | genpd->power_on = pd_power_up; |
| 177 | genpd->power_on(&sh7372_pd->genpd); | 182 | __pd_power_up(sh7372_pd, false); |
| 178 | } | 183 | } |
| 179 | 184 | ||
| 180 | void sh7372_add_device_to_domain(struct sh7372_pm_domain *sh7372_pd, | 185 | void sh7372_add_device_to_domain(struct sh7372_pm_domain *sh7372_pd, |
| @@ -227,11 +232,23 @@ struct sh7372_pm_domain sh7372_a3sp = { | |||
| 227 | .no_debug = true, | 232 | .no_debug = true, |
| 228 | }; | 233 | }; |
| 229 | 234 | ||
| 235 | static void sh7372_a3sp_init(void) | ||
| 236 | { | ||
| 237 | /* serial consoles make use of SCIF hardware located in A3SP, | ||
| 238 | * keep such power domain on if "no_console_suspend" is set. | ||
| 239 | */ | ||
| 240 | sh7372_a3sp.stay_on = !console_suspend_enabled; | ||
| 241 | } | ||
| 242 | |||
| 230 | struct sh7372_pm_domain sh7372_a3sg = { | 243 | struct sh7372_pm_domain sh7372_a3sg = { |
| 231 | .bit_shift = 13, | 244 | .bit_shift = 13, |
| 232 | }; | 245 | }; |
| 233 | 246 | ||
| 234 | #endif /* CONFIG_PM */ | 247 | #else /* !CONFIG_PM */ |
| 248 | |||
| 249 | static inline void sh7372_a3sp_init(void) {} | ||
| 250 | |||
| 251 | #endif /* !CONFIG_PM */ | ||
| 235 | 252 | ||
| 236 | #if defined(CONFIG_SUSPEND) || defined(CONFIG_CPU_IDLE) | 253 | #if defined(CONFIG_SUSPEND) || defined(CONFIG_CPU_IDLE) |
| 237 | static int sh7372_do_idle_core_standby(unsigned long unused) | 254 | static int sh7372_do_idle_core_standby(unsigned long unused) |
| @@ -465,6 +482,8 @@ void __init sh7372_pm_init(void) | |||
| 465 | /* do not convert A3SM, A3SP, A3SG, A4R power down into A4S */ | 482 | /* do not convert A3SM, A3SP, A3SG, A4R power down into A4S */ |
| 466 | __raw_writel(0, PDNSEL); | 483 | __raw_writel(0, PDNSEL); |
| 467 | 484 | ||
| 485 | sh7372_a3sp_init(); | ||
| 486 | |||
| 468 | sh7372_suspend_init(); | 487 | sh7372_suspend_init(); |
| 469 | sh7372_cpuidle_init(); | 488 | sh7372_cpuidle_init(); |
| 470 | } | 489 | } |
diff --git a/arch/arm/mach-w90x900/dev.c b/arch/arm/mach-w90x900/dev.c index 7a1fa6adb7c3..5b0c38abacc1 100644 --- a/arch/arm/mach-w90x900/dev.c +++ b/arch/arm/mach-w90x900/dev.c | |||
| @@ -422,7 +422,7 @@ struct platform_device nuc900_device_kpi = { | |||
| 422 | 422 | ||
| 423 | /* LCD controller*/ | 423 | /* LCD controller*/ |
| 424 | 424 | ||
| 425 | static struct nuc900fb_display __initdata nuc900_lcd_info[] = { | 425 | static struct nuc900fb_display nuc900_lcd_info[] = { |
| 426 | /* Giantplus Technology GPM1040A0 320x240 Color TFT LCD */ | 426 | /* Giantplus Technology GPM1040A0 320x240 Color TFT LCD */ |
| 427 | [0] = { | 427 | [0] = { |
| 428 | .type = LCM_DCCS_VA_SRC_RGB565, | 428 | .type = LCM_DCCS_VA_SRC_RGB565, |
| @@ -445,7 +445,7 @@ static struct nuc900fb_display __initdata nuc900_lcd_info[] = { | |||
| 445 | }, | 445 | }, |
| 446 | }; | 446 | }; |
| 447 | 447 | ||
| 448 | static struct nuc900fb_mach_info nuc900_fb_info __initdata = { | 448 | static struct nuc900fb_mach_info nuc900_fb_info = { |
| 449 | #if defined(CONFIG_GPM1040A0_320X240) | 449 | #if defined(CONFIG_GPM1040A0_320X240) |
| 450 | .displays = &nuc900_lcd_info[0], | 450 | .displays = &nuc900_lcd_info[0], |
| 451 | #else | 451 | #else |
diff --git a/arch/arm/mach-w90x900/include/mach/mfp.h b/arch/arm/mach-w90x900/include/mach/mfp.h index 94c0e71617c6..23ef1f573abd 100644 --- a/arch/arm/mach-w90x900/include/mach/mfp.h +++ b/arch/arm/mach-w90x900/include/mach/mfp.h | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | extern void mfp_set_groupf(struct device *dev); | 19 | extern void mfp_set_groupf(struct device *dev); |
| 20 | extern void mfp_set_groupc(struct device *dev); | 20 | extern void mfp_set_groupc(struct device *dev); |
| 21 | extern void mfp_set_groupi(struct device *dev); | 21 | extern void mfp_set_groupi(struct device *dev); |
| 22 | extern void mfp_set_groupg(struct device *dev); | 22 | extern void mfp_set_groupg(struct device *dev, const char *subname); |
| 23 | extern void mfp_set_groupd(struct device *dev, const char *subname); | ||
| 23 | 24 | ||
| 24 | #endif /* __ASM_ARCH_MFP_H */ | 25 | #endif /* __ASM_ARCH_MFP_H */ |
diff --git a/arch/arm/mach-w90x900/include/mach/nuc900_spi.h b/arch/arm/mach-w90x900/include/mach/nuc900_spi.h index bd94819e314f..2c4e0c128501 100644 --- a/arch/arm/mach-w90x900/include/mach/nuc900_spi.h +++ b/arch/arm/mach-w90x900/include/mach/nuc900_spi.h | |||
| @@ -14,7 +14,7 @@ | |||
| 14 | #ifndef __ASM_ARCH_SPI_H | 14 | #ifndef __ASM_ARCH_SPI_H |
| 15 | #define __ASM_ARCH_SPI_H | 15 | #define __ASM_ARCH_SPI_H |
| 16 | 16 | ||
| 17 | extern void mfp_set_groupg(struct device *dev); | 17 | extern void mfp_set_groupg(struct device *dev, const char *subname); |
| 18 | 18 | ||
| 19 | struct nuc900_spi_info { | 19 | struct nuc900_spi_info { |
| 20 | unsigned int num_cs; | 20 | unsigned int num_cs; |
diff --git a/arch/arm/mach-w90x900/mfp.c b/arch/arm/mach-w90x900/mfp.c index fb7fb627b1a5..9dd74612bb87 100644 --- a/arch/arm/mach-w90x900/mfp.c +++ b/arch/arm/mach-w90x900/mfp.c | |||
| @@ -26,10 +26,8 @@ | |||
| 26 | #define REG_MFSEL (W90X900_VA_GCR + 0xC) | 26 | #define REG_MFSEL (W90X900_VA_GCR + 0xC) |
| 27 | 27 | ||
| 28 | #define GPSELF (0x01 << 1) | 28 | #define GPSELF (0x01 << 1) |
| 29 | |||
| 30 | #define GPSELC (0x03 << 2) | 29 | #define GPSELC (0x03 << 2) |
| 31 | #define ENKPI (0x02 << 2) | 30 | #define GPSELD (0x0f << 4) |
| 32 | #define ENNAND (0x01 << 2) | ||
| 33 | 31 | ||
| 34 | #define GPSELEI0 (0x01 << 26) | 32 | #define GPSELEI0 (0x01 << 26) |
| 35 | #define GPSELEI1 (0x01 << 27) | 33 | #define GPSELEI1 (0x01 << 27) |
| @@ -37,11 +35,16 @@ | |||
| 37 | #define GPIOG0TO1 (0x03 << 14) | 35 | #define GPIOG0TO1 (0x03 << 14) |
| 38 | #define GPIOG2TO3 (0x03 << 16) | 36 | #define GPIOG2TO3 (0x03 << 16) |
| 39 | #define GPIOG22TO23 (0x03 << 22) | 37 | #define GPIOG22TO23 (0x03 << 22) |
| 38 | #define GPIOG18TO20 (0x07 << 18) | ||
| 40 | 39 | ||
| 41 | #define ENSPI (0x0a << 14) | 40 | #define ENSPI (0x0a << 14) |
| 42 | #define ENI2C0 (0x01 << 14) | 41 | #define ENI2C0 (0x01 << 14) |
| 43 | #define ENI2C1 (0x01 << 16) | 42 | #define ENI2C1 (0x01 << 16) |
| 44 | #define ENAC97 (0x02 << 22) | 43 | #define ENAC97 (0x02 << 22) |
| 44 | #define ENSD1 (0x02 << 18) | ||
| 45 | #define ENSD0 (0x0a << 4) | ||
| 46 | #define ENKPI (0x02 << 2) | ||
| 47 | #define ENNAND (0x01 << 2) | ||
| 45 | 48 | ||
| 46 | static DEFINE_MUTEX(mfp_mutex); | 49 | static DEFINE_MUTEX(mfp_mutex); |
| 47 | 50 | ||
| @@ -127,16 +130,19 @@ void mfp_set_groupi(struct device *dev) | |||
| 127 | } | 130 | } |
| 128 | EXPORT_SYMBOL(mfp_set_groupi); | 131 | EXPORT_SYMBOL(mfp_set_groupi); |
| 129 | 132 | ||
| 130 | void mfp_set_groupg(struct device *dev) | 133 | void mfp_set_groupg(struct device *dev, const char *subname) |
| 131 | { | 134 | { |
| 132 | unsigned long mfpen; | 135 | unsigned long mfpen; |
| 133 | const char *dev_id; | 136 | const char *dev_id; |
| 134 | 137 | ||
| 135 | BUG_ON(!dev); | 138 | BUG_ON((!dev) && (!subname)); |
| 136 | 139 | ||
| 137 | mutex_lock(&mfp_mutex); | 140 | mutex_lock(&mfp_mutex); |
| 138 | 141 | ||
| 139 | dev_id = dev_name(dev); | 142 | if (subname != NULL) |
| 143 | dev_id = subname; | ||
| 144 | else | ||
| 145 | dev_id = dev_name(dev); | ||
| 140 | 146 | ||
| 141 | mfpen = __raw_readl(REG_MFSEL); | 147 | mfpen = __raw_readl(REG_MFSEL); |
| 142 | 148 | ||
| @@ -152,6 +158,9 @@ void mfp_set_groupg(struct device *dev) | |||
| 152 | } else if (strcmp(dev_id, "nuc900-audio") == 0) { | 158 | } else if (strcmp(dev_id, "nuc900-audio") == 0) { |
| 153 | mfpen &= ~(GPIOG22TO23); | 159 | mfpen &= ~(GPIOG22TO23); |
| 154 | mfpen |= ENAC97;/*enable AC97*/ | 160 | mfpen |= ENAC97;/*enable AC97*/ |
| 161 | } else if (strcmp(dev_id, "nuc900-mmc-port1") == 0) { | ||
| 162 | mfpen &= ~(GPIOG18TO20); | ||
| 163 | mfpen |= (ENSD1 | 0x01);/*enable sd1*/ | ||
| 155 | } else { | 164 | } else { |
| 156 | mfpen &= ~(GPIOG0TO1 | GPIOG2TO3);/*GPIOG[3:0]*/ | 165 | mfpen &= ~(GPIOG0TO1 | GPIOG2TO3);/*GPIOG[3:0]*/ |
| 157 | } | 166 | } |
| @@ -162,3 +171,30 @@ void mfp_set_groupg(struct device *dev) | |||
| 162 | } | 171 | } |
| 163 | EXPORT_SYMBOL(mfp_set_groupg); | 172 | EXPORT_SYMBOL(mfp_set_groupg); |
| 164 | 173 | ||
| 174 | void mfp_set_groupd(struct device *dev, const char *subname) | ||
| 175 | { | ||
| 176 | unsigned long mfpen; | ||
| 177 | const char *dev_id; | ||
| 178 | |||
| 179 | BUG_ON((!dev) && (!subname)); | ||
| 180 | |||
| 181 | mutex_lock(&mfp_mutex); | ||
| 182 | |||
| 183 | if (subname != NULL) | ||
| 184 | dev_id = subname; | ||
| 185 | else | ||
| 186 | dev_id = dev_name(dev); | ||
| 187 | |||
| 188 | mfpen = __raw_readl(REG_MFSEL); | ||
| 189 | |||
| 190 | if (strcmp(dev_id, "nuc900-mmc-port0") == 0) { | ||
| 191 | mfpen &= ~GPSELD;/*enable sd0*/ | ||
| 192 | mfpen |= ENSD0; | ||
| 193 | } else | ||
| 194 | mfpen &= (~GPSELD); | ||
| 195 | |||
| 196 | __raw_writel(mfpen, REG_MFSEL); | ||
| 197 | |||
| 198 | mutex_unlock(&mfp_mutex); | ||
| 199 | } | ||
| 200 | EXPORT_SYMBOL(mfp_set_groupd); | ||
