diff options
931 files changed, 8065 insertions, 7936 deletions
diff --git a/Documentation/ABI/testing/sysfs-bus-rbd b/Documentation/ABI/testing/sysfs-bus-rbd index fa72ccb2282..dbedafb095e 100644 --- a/Documentation/ABI/testing/sysfs-bus-rbd +++ b/Documentation/ABI/testing/sysfs-bus-rbd | |||
| @@ -57,13 +57,6 @@ create_snap | |||
| 57 | 57 | ||
| 58 | $ echo <snap-name> > /sys/bus/rbd/devices/<dev-id>/snap_create | 58 | $ echo <snap-name> > /sys/bus/rbd/devices/<dev-id>/snap_create |
| 59 | 59 | ||
| 60 | rollback_snap | ||
| 61 | |||
| 62 | Rolls back data to the specified snapshot. This goes over the entire | ||
| 63 | list of rados blocks and sends a rollback command to each. | ||
| 64 | |||
| 65 | $ echo <snap-name> > /sys/bus/rbd/devices/<dev-id>/snap_rollback | ||
| 66 | |||
| 67 | snap_* | 60 | snap_* |
| 68 | 61 | ||
| 69 | A directory per each snapshot | 62 | A directory per each snapshot |
diff --git a/MAINTAINERS b/MAINTAINERS index 796d67a5849..94f3eb76c64 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -1124,13 +1124,6 @@ S: Supported | |||
| 1124 | F: arch/arm/mach-shmobile/ | 1124 | F: arch/arm/mach-shmobile/ |
| 1125 | F: drivers/sh/ | 1125 | F: drivers/sh/ |
| 1126 | 1126 | ||
| 1127 | ARM/TELECHIPS ARM ARCHITECTURE | ||
| 1128 | M: "Hans J. Koch" <hjk@hansjkoch.de> | ||
| 1129 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | ||
| 1130 | S: Maintained | ||
| 1131 | F: arch/arm/plat-tcc/ | ||
| 1132 | F: arch/arm/mach-tcc8k/ | ||
| 1133 | |||
| 1134 | ARM/TECHNOLOGIC SYSTEMS TS7250 MACHINE SUPPORT | 1127 | ARM/TECHNOLOGIC SYSTEMS TS7250 MACHINE SUPPORT |
| 1135 | M: Lennert Buytenhek <kernel@wantstofly.org> | 1128 | M: Lennert Buytenhek <kernel@wantstofly.org> |
| 1136 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 1129 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
| @@ -3101,6 +3094,7 @@ F: include/linux/hid* | |||
| 3101 | 3094 | ||
| 3102 | HIGH-RESOLUTION TIMERS, CLOCKEVENTS, DYNTICKS | 3095 | HIGH-RESOLUTION TIMERS, CLOCKEVENTS, DYNTICKS |
| 3103 | M: Thomas Gleixner <tglx@linutronix.de> | 3096 | M: Thomas Gleixner <tglx@linutronix.de> |
| 3097 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core | ||
| 3104 | S: Maintained | 3098 | S: Maintained |
| 3105 | F: Documentation/timers/ | 3099 | F: Documentation/timers/ |
| 3106 | F: kernel/hrtimer.c | 3100 | F: kernel/hrtimer.c |
| @@ -3610,7 +3604,7 @@ F: net/irda/ | |||
| 3610 | IRQ SUBSYSTEM | 3604 | IRQ SUBSYSTEM |
| 3611 | M: Thomas Gleixner <tglx@linutronix.de> | 3605 | M: Thomas Gleixner <tglx@linutronix.de> |
| 3612 | S: Maintained | 3606 | S: Maintained |
| 3613 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git irq/core | 3607 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git irq/core |
| 3614 | F: kernel/irq/ | 3608 | F: kernel/irq/ |
| 3615 | 3609 | ||
| 3616 | ISAPNP | 3610 | ISAPNP |
| @@ -4098,7 +4092,7 @@ F: drivers/hwmon/lm90.c | |||
| 4098 | LOCKDEP AND LOCKSTAT | 4092 | LOCKDEP AND LOCKSTAT |
| 4099 | M: Peter Zijlstra <peterz@infradead.org> | 4093 | M: Peter Zijlstra <peterz@infradead.org> |
| 4100 | M: Ingo Molnar <mingo@redhat.com> | 4094 | M: Ingo Molnar <mingo@redhat.com> |
| 4101 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/peterz/linux-2.6-lockdep.git | 4095 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git core/locking |
| 4102 | S: Maintained | 4096 | S: Maintained |
| 4103 | F: Documentation/lockdep*.txt | 4097 | F: Documentation/lockdep*.txt |
| 4104 | F: Documentation/lockstat.txt | 4098 | F: Documentation/lockstat.txt |
| @@ -4280,7 +4274,9 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git | |||
| 4280 | S: Maintained | 4274 | S: Maintained |
| 4281 | F: Documentation/dvb/ | 4275 | F: Documentation/dvb/ |
| 4282 | F: Documentation/video4linux/ | 4276 | F: Documentation/video4linux/ |
| 4277 | F: Documentation/DocBook/media/ | ||
| 4283 | F: drivers/media/ | 4278 | F: drivers/media/ |
| 4279 | F: drivers/staging/media/ | ||
| 4284 | F: include/media/ | 4280 | F: include/media/ |
| 4285 | F: include/linux/dvb/ | 4281 | F: include/linux/dvb/ |
| 4286 | F: include/linux/videodev*.h | 4282 | F: include/linux/videodev*.h |
| @@ -5086,6 +5082,7 @@ M: Peter Zijlstra <a.p.zijlstra@chello.nl> | |||
| 5086 | M: Paul Mackerras <paulus@samba.org> | 5082 | M: Paul Mackerras <paulus@samba.org> |
| 5087 | M: Ingo Molnar <mingo@elte.hu> | 5083 | M: Ingo Molnar <mingo@elte.hu> |
| 5088 | M: Arnaldo Carvalho de Melo <acme@ghostprotocols.net> | 5084 | M: Arnaldo Carvalho de Melo <acme@ghostprotocols.net> |
| 5085 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf/core | ||
| 5089 | S: Supported | 5086 | S: Supported |
| 5090 | F: kernel/events/* | 5087 | F: kernel/events/* |
| 5091 | F: include/linux/perf_event.h | 5088 | F: include/linux/perf_event.h |
| @@ -5174,6 +5171,7 @@ F: drivers/scsi/pm8001/ | |||
| 5174 | 5171 | ||
| 5175 | POSIX CLOCKS and TIMERS | 5172 | POSIX CLOCKS and TIMERS |
| 5176 | M: Thomas Gleixner <tglx@linutronix.de> | 5173 | M: Thomas Gleixner <tglx@linutronix.de> |
| 5174 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core | ||
| 5177 | S: Supported | 5175 | S: Supported |
| 5178 | F: fs/timerfd.c | 5176 | F: fs/timerfd.c |
| 5179 | F: include/linux/timer* | 5177 | F: include/linux/timer* |
| @@ -5689,6 +5687,7 @@ F: drivers/dma/dw_dmac.c | |||
| 5689 | TIMEKEEPING, NTP | 5687 | TIMEKEEPING, NTP |
| 5690 | M: John Stultz <johnstul@us.ibm.com> | 5688 | M: John Stultz <johnstul@us.ibm.com> |
| 5691 | M: Thomas Gleixner <tglx@linutronix.de> | 5689 | M: Thomas Gleixner <tglx@linutronix.de> |
| 5690 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core | ||
| 5692 | S: Supported | 5691 | S: Supported |
| 5693 | F: include/linux/clocksource.h | 5692 | F: include/linux/clocksource.h |
| 5694 | F: include/linux/time.h | 5693 | F: include/linux/time.h |
| @@ -5713,6 +5712,7 @@ F: drivers/watchdog/sc1200wdt.c | |||
| 5713 | SCHEDULER | 5712 | SCHEDULER |
| 5714 | M: Ingo Molnar <mingo@elte.hu> | 5713 | M: Ingo Molnar <mingo@elte.hu> |
| 5715 | M: Peter Zijlstra <peterz@infradead.org> | 5714 | M: Peter Zijlstra <peterz@infradead.org> |
| 5715 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git sched/core | ||
| 5716 | S: Maintained | 5716 | S: Maintained |
| 5717 | F: kernel/sched* | 5717 | F: kernel/sched* |
| 5718 | F: include/linux/sched.h | 5718 | F: include/linux/sched.h |
| @@ -6640,7 +6640,7 @@ TRACING | |||
| 6640 | M: Steven Rostedt <rostedt@goodmis.org> | 6640 | M: Steven Rostedt <rostedt@goodmis.org> |
| 6641 | M: Frederic Weisbecker <fweisbec@gmail.com> | 6641 | M: Frederic Weisbecker <fweisbec@gmail.com> |
| 6642 | M: Ingo Molnar <mingo@redhat.com> | 6642 | M: Ingo Molnar <mingo@redhat.com> |
| 6643 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git perf/core | 6643 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf/core |
| 6644 | S: Maintained | 6644 | S: Maintained |
| 6645 | F: Documentation/trace/ftrace.txt | 6645 | F: Documentation/trace/ftrace.txt |
| 6646 | F: arch/*/*/*/ftrace.h | 6646 | F: arch/*/*/*/ftrace.h |
| @@ -7390,7 +7390,7 @@ M: Thomas Gleixner <tglx@linutronix.de> | |||
| 7390 | M: Ingo Molnar <mingo@redhat.com> | 7390 | M: Ingo Molnar <mingo@redhat.com> |
| 7391 | M: "H. Peter Anvin" <hpa@zytor.com> | 7391 | M: "H. Peter Anvin" <hpa@zytor.com> |
| 7392 | M: x86@kernel.org | 7392 | M: x86@kernel.org |
| 7393 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-x86.git | 7393 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86/core |
| 7394 | S: Maintained | 7394 | S: Maintained |
| 7395 | F: Documentation/x86/ | 7395 | F: Documentation/x86/ |
| 7396 | F: arch/x86/ | 7396 | F: arch/x86/ |
| @@ -1,7 +1,7 @@ | |||
| 1 | VERSION = 3 | 1 | VERSION = 3 |
| 2 | PATCHLEVEL = 2 | 2 | PATCHLEVEL = 2 |
| 3 | SUBLEVEL = 0 | 3 | SUBLEVEL = 0 |
| 4 | EXTRAVERSION = -rc5 | 4 | EXTRAVERSION = -rc7 |
| 5 | NAME = Saber-toothed Squirrel | 5 | NAME = Saber-toothed Squirrel |
| 6 | 6 | ||
| 7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 540a6618084..2deb911d59f 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
| @@ -220,8 +220,9 @@ config NEED_MACH_MEMORY_H | |||
| 220 | be avoided when possible. | 220 | be avoided when possible. |
| 221 | 221 | ||
| 222 | config PHYS_OFFSET | 222 | config PHYS_OFFSET |
| 223 | hex "Physical address of main memory" | 223 | hex "Physical address of main memory" if MMU |
| 224 | depends on !ARM_PATCH_PHYS_VIRT && !NEED_MACH_MEMORY_H | 224 | depends on !ARM_PATCH_PHYS_VIRT && !NEED_MACH_MEMORY_H |
| 225 | default DRAM_BASE if !MMU | ||
| 225 | help | 226 | help |
| 226 | Please provide the physical address corresponding to the | 227 | Please provide the physical address corresponding to the |
| 227 | location of main memory in your system. | 228 | location of main memory in your system. |
| @@ -868,16 +869,6 @@ config ARCH_SHARK | |||
| 868 | Support for the StrongARM based Digital DNARD machine, also known | 869 | Support for the StrongARM based Digital DNARD machine, also known |
| 869 | as "Shark" (<http://www.shark-linux.de/shark.html>). | 870 | as "Shark" (<http://www.shark-linux.de/shark.html>). |
| 870 | 871 | ||
| 871 | config ARCH_TCC_926 | ||
| 872 | bool "Telechips TCC ARM926-based systems" | ||
| 873 | select CLKSRC_MMIO | ||
| 874 | select CPU_ARM926T | ||
| 875 | select HAVE_CLK | ||
| 876 | select CLKDEV_LOOKUP | ||
| 877 | select GENERIC_CLOCKEVENTS | ||
| 878 | help | ||
| 879 | Support for Telechips TCC ARM926-based systems. | ||
| 880 | |||
| 881 | config ARCH_U300 | 872 | config ARCH_U300 |
| 882 | bool "ST-Ericsson U300 Series" | 873 | bool "ST-Ericsson U300 Series" |
| 883 | depends on MMU | 874 | depends on MMU |
| @@ -1059,8 +1050,6 @@ source "arch/arm/plat-s5p/Kconfig" | |||
| 1059 | 1050 | ||
| 1060 | source "arch/arm/plat-spear/Kconfig" | 1051 | source "arch/arm/plat-spear/Kconfig" |
| 1061 | 1052 | ||
| 1062 | source "arch/arm/plat-tcc/Kconfig" | ||
| 1063 | |||
| 1064 | if ARCH_S3C2410 | 1053 | if ARCH_S3C2410 |
| 1065 | source "arch/arm/mach-s3c2410/Kconfig" | 1054 | source "arch/arm/mach-s3c2410/Kconfig" |
| 1066 | source "arch/arm/mach-s3c2412/Kconfig" | 1055 | source "arch/arm/mach-s3c2412/Kconfig" |
diff --git a/arch/arm/Makefile b/arch/arm/Makefile index dfcf3b033e1..40319d91bb7 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile | |||
| @@ -184,7 +184,6 @@ machine-$(CONFIG_ARCH_EXYNOS4) := exynos | |||
| 184 | machine-$(CONFIG_ARCH_SA1100) := sa1100 | 184 | machine-$(CONFIG_ARCH_SA1100) := sa1100 |
| 185 | machine-$(CONFIG_ARCH_SHARK) := shark | 185 | machine-$(CONFIG_ARCH_SHARK) := shark |
| 186 | machine-$(CONFIG_ARCH_SHMOBILE) := shmobile | 186 | machine-$(CONFIG_ARCH_SHMOBILE) := shmobile |
| 187 | machine-$(CONFIG_ARCH_TCC8K) := tcc8k | ||
| 188 | machine-$(CONFIG_ARCH_TEGRA) := tegra | 187 | machine-$(CONFIG_ARCH_TEGRA) := tegra |
| 189 | machine-$(CONFIG_ARCH_U300) := u300 | 188 | machine-$(CONFIG_ARCH_U300) := u300 |
| 190 | machine-$(CONFIG_ARCH_U8500) := ux500 | 189 | machine-$(CONFIG_ARCH_U8500) := ux500 |
| @@ -204,7 +203,6 @@ machine-$(CONFIG_ARCH_ZYNQ) := zynq | |||
| 204 | plat-$(CONFIG_ARCH_MXC) := mxc | 203 | plat-$(CONFIG_ARCH_MXC) := mxc |
| 205 | plat-$(CONFIG_ARCH_OMAP) := omap | 204 | plat-$(CONFIG_ARCH_OMAP) := omap |
| 206 | plat-$(CONFIG_ARCH_S3C64XX) := samsung | 205 | plat-$(CONFIG_ARCH_S3C64XX) := samsung |
| 207 | plat-$(CONFIG_ARCH_TCC_926) := tcc | ||
| 208 | plat-$(CONFIG_ARCH_ZYNQ) := versatile | 206 | plat-$(CONFIG_ARCH_ZYNQ) := versatile |
| 209 | plat-$(CONFIG_PLAT_IOP) := iop | 207 | plat-$(CONFIG_PLAT_IOP) := iop |
| 210 | plat-$(CONFIG_PLAT_NOMADIK) := nomadik | 208 | plat-$(CONFIG_PLAT_NOMADIK) := nomadik |
diff --git a/arch/arm/include/asm/hardware/iop3xx.h b/arch/arm/include/asm/hardware/iop3xx.h index 5daea2961d4..077c32326c6 100644 --- a/arch/arm/include/asm/hardware/iop3xx.h +++ b/arch/arm/include/asm/hardware/iop3xx.h | |||
| @@ -234,6 +234,7 @@ extern int iop3xx_get_init_atu(void); | |||
| 234 | void iop3xx_map_io(void); | 234 | void iop3xx_map_io(void); |
| 235 | void iop_init_cp6_handler(void); | 235 | void iop_init_cp6_handler(void); |
| 236 | void iop_init_time(unsigned long tickrate); | 236 | void iop_init_time(unsigned long tickrate); |
| 237 | void iop3xx_restart(char, const char *); | ||
| 237 | 238 | ||
| 238 | static inline u32 read_tmr0(void) | 239 | static inline u32 read_tmr0(void) |
| 239 | { | 240 | { |
diff --git a/arch/arm/include/asm/system.h b/arch/arm/include/asm/system.h index 53785828744..e4c96cc6ec0 100644 --- a/arch/arm/include/asm/system.h +++ b/arch/arm/include/asm/system.h | |||
| @@ -108,7 +108,6 @@ extern void __show_regs(struct pt_regs *); | |||
| 108 | extern int __pure cpu_architecture(void); | 108 | extern int __pure cpu_architecture(void); |
| 109 | extern void cpu_init(void); | 109 | extern void cpu_init(void); |
| 110 | 110 | ||
| 111 | void arm_machine_restart(char mode, const char *cmd); | ||
| 112 | void soft_restart(unsigned long); | 111 | void soft_restart(unsigned long); |
| 113 | extern void (*arm_pm_restart)(char str, const char *cmd); | 112 | extern void (*arm_pm_restart)(char str, const char *cmd); |
| 114 | 113 | ||
diff --git a/arch/arm/include/asm/unwind.h b/arch/arm/include/asm/unwind.h index a5edf421005..d1c3f3a71c9 100644 --- a/arch/arm/include/asm/unwind.h +++ b/arch/arm/include/asm/unwind.h | |||
| @@ -30,14 +30,15 @@ enum unwind_reason_code { | |||
| 30 | }; | 30 | }; |
| 31 | 31 | ||
| 32 | struct unwind_idx { | 32 | struct unwind_idx { |
| 33 | unsigned long addr; | 33 | unsigned long addr_offset; |
| 34 | unsigned long insn; | 34 | unsigned long insn; |
| 35 | }; | 35 | }; |
| 36 | 36 | ||
| 37 | struct unwind_table { | 37 | struct unwind_table { |
| 38 | struct list_head list; | 38 | struct list_head list; |
| 39 | struct unwind_idx *start; | 39 | const struct unwind_idx *start; |
| 40 | struct unwind_idx *stop; | 40 | const struct unwind_idx *origin; |
| 41 | const struct unwind_idx *stop; | ||
| 41 | unsigned long begin_addr; | 42 | unsigned long begin_addr; |
| 42 | unsigned long end_addr; | 43 | unsigned long end_addr; |
| 43 | }; | 44 | }; |
| @@ -49,15 +50,6 @@ extern struct unwind_table *unwind_table_add(unsigned long start, | |||
| 49 | extern void unwind_table_del(struct unwind_table *tab); | 50 | extern void unwind_table_del(struct unwind_table *tab); |
| 50 | extern void unwind_backtrace(struct pt_regs *regs, struct task_struct *tsk); | 51 | extern void unwind_backtrace(struct pt_regs *regs, struct task_struct *tsk); |
| 51 | 52 | ||
| 52 | #ifdef CONFIG_ARM_UNWIND | ||
| 53 | extern int __init unwind_init(void); | ||
| 54 | #else | ||
| 55 | static inline int __init unwind_init(void) | ||
| 56 | { | ||
| 57 | return 0; | ||
| 58 | } | ||
| 59 | #endif | ||
| 60 | |||
| 61 | #endif /* !__ASSEMBLY__ */ | 53 | #endif /* !__ASSEMBLY__ */ |
| 62 | 54 | ||
| 63 | #ifdef CONFIG_ARM_UNWIND | 55 | #ifdef CONFIG_ARM_UNWIND |
diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c index a4f192cc51b..5bb91bf3d47 100644 --- a/arch/arm/kernel/perf_event.c +++ b/arch/arm/kernel/perf_event.c | |||
| @@ -639,6 +639,9 @@ static struct platform_device_id armpmu_plat_device_ids[] = { | |||
| 639 | 639 | ||
| 640 | static int __devinit armpmu_device_probe(struct platform_device *pdev) | 640 | static int __devinit armpmu_device_probe(struct platform_device *pdev) |
| 641 | { | 641 | { |
| 642 | if (!cpu_pmu) | ||
| 643 | return -ENODEV; | ||
| 644 | |||
| 642 | cpu_pmu->plat_device = pdev; | 645 | cpu_pmu->plat_device = pdev; |
| 643 | return 0; | 646 | return 0; |
| 644 | } | 647 | } |
diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c index 423bb201945..b29776aa658 100644 --- a/arch/arm/kernel/process.c +++ b/arch/arm/kernel/process.c | |||
| @@ -147,14 +147,8 @@ void soft_restart(unsigned long addr) | |||
| 147 | BUG(); | 147 | BUG(); |
| 148 | } | 148 | } |
| 149 | 149 | ||
| 150 | void arm_machine_restart(char mode, const char *cmd) | 150 | static void null_restart(char mode, const char *cmd) |
| 151 | { | 151 | { |
| 152 | /* Disable interrupts first */ | ||
| 153 | local_irq_disable(); | ||
| 154 | local_fiq_disable(); | ||
| 155 | |||
| 156 | /* Call the architecture specific reboot code. */ | ||
| 157 | arch_reset(mode, cmd); | ||
| 158 | } | 152 | } |
| 159 | 153 | ||
| 160 | /* | 154 | /* |
| @@ -163,7 +157,7 @@ void arm_machine_restart(char mode, const char *cmd) | |||
| 163 | void (*pm_power_off)(void); | 157 | void (*pm_power_off)(void); |
| 164 | EXPORT_SYMBOL(pm_power_off); | 158 | EXPORT_SYMBOL(pm_power_off); |
| 165 | 159 | ||
| 166 | void (*arm_pm_restart)(char str, const char *cmd) = arm_machine_restart; | 160 | void (*arm_pm_restart)(char str, const char *cmd) = null_restart; |
| 167 | EXPORT_SYMBOL_GPL(arm_pm_restart); | 161 | EXPORT_SYMBOL_GPL(arm_pm_restart); |
| 168 | 162 | ||
| 169 | static void do_nothing(void *unused) | 163 | static void do_nothing(void *unused) |
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 5c7094e8f6e..095d6611c84 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c | |||
| @@ -902,8 +902,6 @@ void __init setup_arch(char **cmdline_p) | |||
| 902 | { | 902 | { |
| 903 | struct machine_desc *mdesc; | 903 | struct machine_desc *mdesc; |
| 904 | 904 | ||
| 905 | unwind_init(); | ||
| 906 | |||
| 907 | setup_processor(); | 905 | setup_processor(); |
| 908 | mdesc = setup_machine_fdt(__atags_pointer); | 906 | mdesc = setup_machine_fdt(__atags_pointer); |
| 909 | if (!mdesc) | 907 | if (!mdesc) |
| @@ -911,6 +909,12 @@ void __init setup_arch(char **cmdline_p) | |||
| 911 | machine_desc = mdesc; | 909 | machine_desc = mdesc; |
| 912 | machine_name = mdesc->name; | 910 | machine_name = mdesc->name; |
| 913 | 911 | ||
| 912 | #ifdef CONFIG_ZONE_DMA | ||
| 913 | if (mdesc->dma_zone_size) { | ||
| 914 | extern unsigned long arm_dma_zone_size; | ||
| 915 | arm_dma_zone_size = mdesc->dma_zone_size; | ||
| 916 | } | ||
| 917 | #endif | ||
| 914 | if (mdesc->restart_mode) | 918 | if (mdesc->restart_mode) |
| 915 | reboot_setup(&mdesc->restart_mode); | 919 | reboot_setup(&mdesc->restart_mode); |
| 916 | 920 | ||
| @@ -945,12 +949,6 @@ void __init setup_arch(char **cmdline_p) | |||
| 945 | 949 | ||
| 946 | tcm_init(); | 950 | tcm_init(); |
| 947 | 951 | ||
| 948 | #ifdef CONFIG_ZONE_DMA | ||
| 949 | if (mdesc->dma_zone_size) { | ||
| 950 | extern unsigned long arm_dma_zone_size; | ||
| 951 | arm_dma_zone_size = mdesc->dma_zone_size; | ||
| 952 | } | ||
| 953 | #endif | ||
| 954 | #ifdef CONFIG_MULTI_IRQ_HANDLER | 952 | #ifdef CONFIG_MULTI_IRQ_HANDLER |
| 955 | handle_arch_irq = mdesc->handle_irq; | 953 | handle_arch_irq = mdesc->handle_irq; |
| 956 | #endif | 954 | #endif |
diff --git a/arch/arm/kernel/unwind.c b/arch/arm/kernel/unwind.c index e7e8365795c..00df012c467 100644 --- a/arch/arm/kernel/unwind.c +++ b/arch/arm/kernel/unwind.c | |||
| @@ -67,7 +67,7 @@ EXPORT_SYMBOL(__aeabi_unwind_cpp_pr2); | |||
| 67 | 67 | ||
| 68 | struct unwind_ctrl_block { | 68 | struct unwind_ctrl_block { |
| 69 | unsigned long vrs[16]; /* virtual register set */ | 69 | unsigned long vrs[16]; /* virtual register set */ |
| 70 | unsigned long *insn; /* pointer to the current instructions word */ | 70 | const unsigned long *insn; /* pointer to the current instructions word */ |
| 71 | int entries; /* number of entries left to interpret */ | 71 | int entries; /* number of entries left to interpret */ |
| 72 | int byte; /* current byte number in the instructions word */ | 72 | int byte; /* current byte number in the instructions word */ |
| 73 | }; | 73 | }; |
| @@ -83,8 +83,9 @@ enum regs { | |||
| 83 | PC = 15 | 83 | PC = 15 |
| 84 | }; | 84 | }; |
| 85 | 85 | ||
| 86 | extern struct unwind_idx __start_unwind_idx[]; | 86 | extern const struct unwind_idx __start_unwind_idx[]; |
| 87 | extern struct unwind_idx __stop_unwind_idx[]; | 87 | static const struct unwind_idx *__origin_unwind_idx; |
| 88 | extern const struct unwind_idx __stop_unwind_idx[]; | ||
| 88 | 89 | ||
| 89 | static DEFINE_SPINLOCK(unwind_lock); | 90 | static DEFINE_SPINLOCK(unwind_lock); |
| 90 | static LIST_HEAD(unwind_tables); | 91 | static LIST_HEAD(unwind_tables); |
| @@ -98,45 +99,99 @@ static LIST_HEAD(unwind_tables); | |||
| 98 | }) | 99 | }) |
| 99 | 100 | ||
| 100 | /* | 101 | /* |
| 101 | * Binary search in the unwind index. The entries entries are | 102 | * Binary search in the unwind index. The entries are |
| 102 | * guaranteed to be sorted in ascending order by the linker. | 103 | * guaranteed to be sorted in ascending order by the linker. |
| 104 | * | ||
| 105 | * start = first entry | ||
| 106 | * origin = first entry with positive offset (or stop if there is no such entry) | ||
| 107 | * stop - 1 = last entry | ||
| 103 | */ | 108 | */ |
| 104 | static struct unwind_idx *search_index(unsigned long addr, | 109 | static const struct unwind_idx *search_index(unsigned long addr, |
| 105 | struct unwind_idx *first, | 110 | const struct unwind_idx *start, |
| 106 | struct unwind_idx *last) | 111 | const struct unwind_idx *origin, |
| 112 | const struct unwind_idx *stop) | ||
| 107 | { | 113 | { |
| 108 | pr_debug("%s(%08lx, %p, %p)\n", __func__, addr, first, last); | 114 | unsigned long addr_prel31; |
| 115 | |||
| 116 | pr_debug("%s(%08lx, %p, %p, %p)\n", | ||
| 117 | __func__, addr, start, origin, stop); | ||
| 118 | |||
| 119 | /* | ||
| 120 | * only search in the section with the matching sign. This way the | ||
| 121 | * prel31 numbers can be compared as unsigned longs. | ||
| 122 | */ | ||
| 123 | if (addr < (unsigned long)start) | ||
| 124 | /* negative offsets: [start; origin) */ | ||
| 125 | stop = origin; | ||
| 126 | else | ||
| 127 | /* positive offsets: [origin; stop) */ | ||
| 128 | start = origin; | ||
| 129 | |||
| 130 | /* prel31 for address relavive to start */ | ||
| 131 | addr_prel31 = (addr - (unsigned long)start) & 0x7fffffff; | ||
| 109 | 132 | ||
| 110 | if (addr < first->addr) { | 133 | while (start < stop - 1) { |
| 134 | const struct unwind_idx *mid = start + ((stop - start) >> 1); | ||
| 135 | |||
| 136 | /* | ||
| 137 | * As addr_prel31 is relative to start an offset is needed to | ||
| 138 | * make it relative to mid. | ||
| 139 | */ | ||
| 140 | if (addr_prel31 - ((unsigned long)mid - (unsigned long)start) < | ||
| 141 | mid->addr_offset) | ||
| 142 | stop = mid; | ||
| 143 | else { | ||
| 144 | /* keep addr_prel31 relative to start */ | ||
| 145 | addr_prel31 -= ((unsigned long)mid - | ||
| 146 | (unsigned long)start); | ||
| 147 | start = mid; | ||
| 148 | } | ||
| 149 | } | ||
| 150 | |||
| 151 | if (likely(start->addr_offset <= addr_prel31)) | ||
| 152 | return start; | ||
| 153 | else { | ||
| 111 | pr_warning("unwind: Unknown symbol address %08lx\n", addr); | 154 | pr_warning("unwind: Unknown symbol address %08lx\n", addr); |
| 112 | return NULL; | 155 | return NULL; |
| 113 | } else if (addr >= last->addr) | 156 | } |
| 114 | return last; | 157 | } |
| 115 | 158 | ||
| 116 | while (first < last - 1) { | 159 | static const struct unwind_idx *unwind_find_origin( |
| 117 | struct unwind_idx *mid = first + ((last - first + 1) >> 1); | 160 | const struct unwind_idx *start, const struct unwind_idx *stop) |
| 161 | { | ||
| 162 | pr_debug("%s(%p, %p)\n", __func__, start, stop); | ||
| 163 | while (start < stop) { | ||
| 164 | const struct unwind_idx *mid = start + ((stop - start) >> 1); | ||
| 118 | 165 | ||
| 119 | if (addr < mid->addr) | 166 | if (mid->addr_offset >= 0x40000000) |
| 120 | last = mid; | 167 | /* negative offset */ |
| 168 | start = mid + 1; | ||
| 121 | else | 169 | else |
| 122 | first = mid; | 170 | /* positive offset */ |
| 171 | stop = mid; | ||
| 123 | } | 172 | } |
| 124 | 173 | pr_debug("%s -> %p\n", __func__, stop); | |
| 125 | return first; | 174 | return stop; |
| 126 | } | 175 | } |
| 127 | 176 | ||
| 128 | static struct unwind_idx *unwind_find_idx(unsigned long addr) | 177 | static const struct unwind_idx *unwind_find_idx(unsigned long addr) |
| 129 | { | 178 | { |
| 130 | struct unwind_idx *idx = NULL; | 179 | const struct unwind_idx *idx = NULL; |
| 131 | unsigned long flags; | 180 | unsigned long flags; |
| 132 | 181 | ||
| 133 | pr_debug("%s(%08lx)\n", __func__, addr); | 182 | pr_debug("%s(%08lx)\n", __func__, addr); |
| 134 | 183 | ||
| 135 | if (core_kernel_text(addr)) | 184 | if (core_kernel_text(addr)) { |
| 185 | if (unlikely(!__origin_unwind_idx)) | ||
| 186 | __origin_unwind_idx = | ||
| 187 | unwind_find_origin(__start_unwind_idx, | ||
| 188 | __stop_unwind_idx); | ||
| 189 | |||
| 136 | /* main unwind table */ | 190 | /* main unwind table */ |
| 137 | idx = search_index(addr, __start_unwind_idx, | 191 | idx = search_index(addr, __start_unwind_idx, |
| 138 | __stop_unwind_idx - 1); | 192 | __origin_unwind_idx, |
| 139 | else { | 193 | __stop_unwind_idx); |
| 194 | } else { | ||
| 140 | /* module unwind tables */ | 195 | /* module unwind tables */ |
| 141 | struct unwind_table *table; | 196 | struct unwind_table *table; |
| 142 | 197 | ||
| @@ -145,7 +200,8 @@ static struct unwind_idx *unwind_find_idx(unsigned long addr) | |||
| 145 | if (addr >= table->begin_addr && | 200 | if (addr >= table->begin_addr && |
| 146 | addr < table->end_addr) { | 201 | addr < table->end_addr) { |
| 147 | idx = search_index(addr, table->start, | 202 | idx = search_index(addr, table->start, |
| 148 | table->stop - 1); | 203 | table->origin, |
| 204 | table->stop); | ||
| 149 | /* Move-to-front to exploit common traces */ | 205 | /* Move-to-front to exploit common traces */ |
| 150 | list_move(&table->list, &unwind_tables); | 206 | list_move(&table->list, &unwind_tables); |
| 151 | break; | 207 | break; |
| @@ -274,7 +330,7 @@ static int unwind_exec_insn(struct unwind_ctrl_block *ctrl) | |||
| 274 | int unwind_frame(struct stackframe *frame) | 330 | int unwind_frame(struct stackframe *frame) |
| 275 | { | 331 | { |
| 276 | unsigned long high, low; | 332 | unsigned long high, low; |
| 277 | struct unwind_idx *idx; | 333 | const struct unwind_idx *idx; |
| 278 | struct unwind_ctrl_block ctrl; | 334 | struct unwind_ctrl_block ctrl; |
| 279 | 335 | ||
| 280 | /* only go to a higher address on the stack */ | 336 | /* only go to a higher address on the stack */ |
| @@ -399,7 +455,6 @@ struct unwind_table *unwind_table_add(unsigned long start, unsigned long size, | |||
| 399 | unsigned long text_size) | 455 | unsigned long text_size) |
| 400 | { | 456 | { |
| 401 | unsigned long flags; | 457 | unsigned long flags; |
| 402 | struct unwind_idx *idx; | ||
| 403 | struct unwind_table *tab = kmalloc(sizeof(*tab), GFP_KERNEL); | 458 | struct unwind_table *tab = kmalloc(sizeof(*tab), GFP_KERNEL); |
| 404 | 459 | ||
| 405 | pr_debug("%s(%08lx, %08lx, %08lx, %08lx)\n", __func__, start, size, | 460 | pr_debug("%s(%08lx, %08lx, %08lx, %08lx)\n", __func__, start, size, |
| @@ -408,15 +463,12 @@ struct unwind_table *unwind_table_add(unsigned long start, unsigned long size, | |||
| 408 | if (!tab) | 463 | if (!tab) |
| 409 | return tab; | 464 | return tab; |
| 410 | 465 | ||
| 411 | tab->start = (struct unwind_idx *)start; | 466 | tab->start = (const struct unwind_idx *)start; |
| 412 | tab->stop = (struct unwind_idx *)(start + size); | 467 | tab->stop = (const struct unwind_idx *)(start + size); |
| 468 | tab->origin = unwind_find_origin(tab->start, tab->stop); | ||
| 413 | tab->begin_addr = text_addr; | 469 | tab->begin_addr = text_addr; |
| 414 | tab->end_addr = text_addr + text_size; | 470 | tab->end_addr = text_addr + text_size; |
| 415 | 471 | ||
| 416 | /* Convert the symbol addresses to absolute values */ | ||
| 417 | for (idx = tab->start; idx < tab->stop; idx++) | ||
| 418 | idx->addr = prel31_to_addr(&idx->addr); | ||
| 419 | |||
| 420 | spin_lock_irqsave(&unwind_lock, flags); | 472 | spin_lock_irqsave(&unwind_lock, flags); |
| 421 | list_add_tail(&tab->list, &unwind_tables); | 473 | list_add_tail(&tab->list, &unwind_tables); |
| 422 | spin_unlock_irqrestore(&unwind_lock, flags); | 474 | spin_unlock_irqrestore(&unwind_lock, flags); |
| @@ -437,16 +489,3 @@ void unwind_table_del(struct unwind_table *tab) | |||
| 437 | 489 | ||
| 438 | kfree(tab); | 490 | kfree(tab); |
| 439 | } | 491 | } |
| 440 | |||
| 441 | int __init unwind_init(void) | ||
| 442 | { | ||
| 443 | struct unwind_idx *idx; | ||
| 444 | |||
| 445 | /* Convert the symbol addresses to absolute values */ | ||
| 446 | for (idx = __start_unwind_idx; idx < __stop_unwind_idx; idx++) | ||
| 447 | idx->addr = prel31_to_addr(&idx->addr); | ||
| 448 | |||
| 449 | pr_debug("unwind: ARM stack unwinding initialised\n"); | ||
| 450 | |||
| 451 | return 0; | ||
| 452 | } | ||
diff --git a/arch/arm/mach-at91/at91cap9.c b/arch/arm/mach-at91/at91cap9.c index 506a26c3fff..edb879ac04c 100644 --- a/arch/arm/mach-at91/at91cap9.c +++ b/arch/arm/mach-at91/at91cap9.c | |||
| @@ -314,7 +314,7 @@ static struct at91_gpio_bank at91cap9_gpio[] __initdata = { | |||
| 314 | } | 314 | } |
| 315 | }; | 315 | }; |
| 316 | 316 | ||
| 317 | static void at91cap9_reset(void) | 317 | static void at91cap9_restart(char mode, const char *cmd) |
| 318 | { | 318 | { |
| 319 | at91_sys_write(AT91_RSTC_CR, AT91_RSTC_KEY | AT91_RSTC_PROCRST | AT91_RSTC_PERRST); | 319 | at91_sys_write(AT91_RSTC_CR, AT91_RSTC_KEY | AT91_RSTC_PROCRST | AT91_RSTC_PERRST); |
| 320 | } | 320 | } |
| @@ -337,7 +337,7 @@ static void __init at91cap9_ioremap_registers(void) | |||
| 337 | 337 | ||
| 338 | static void __init at91cap9_initialize(void) | 338 | static void __init at91cap9_initialize(void) |
| 339 | { | 339 | { |
| 340 | at91_arch_reset = at91cap9_reset; | 340 | arm_pm_restart = at91cap9_restart; |
| 341 | at91_extern_irq = (1 << AT91CAP9_ID_IRQ0) | (1 << AT91CAP9_ID_IRQ1); | 341 | at91_extern_irq = (1 << AT91CAP9_ID_IRQ0) | (1 << AT91CAP9_ID_IRQ1); |
| 342 | 342 | ||
| 343 | /* Register GPIO subsystem */ | 343 | /* Register GPIO subsystem */ |
diff --git a/arch/arm/mach-at91/at91rm9200.c b/arch/arm/mach-at91/at91rm9200.c index 9163d7d5f76..99c3174e24a 100644 --- a/arch/arm/mach-at91/at91rm9200.c +++ b/arch/arm/mach-at91/at91rm9200.c | |||
| @@ -289,7 +289,7 @@ static struct at91_gpio_bank at91rm9200_gpio[] __initdata = { | |||
| 289 | } | 289 | } |
| 290 | }; | 290 | }; |
| 291 | 291 | ||
| 292 | static void at91rm9200_reset(void) | 292 | static void at91rm9200_restart(char mode, const char *cmd) |
| 293 | { | 293 | { |
| 294 | /* | 294 | /* |
| 295 | * Perform a hardware reset with the use of the Watchdog timer. | 295 | * Perform a hardware reset with the use of the Watchdog timer. |
| @@ -314,7 +314,7 @@ static void __init at91rm9200_ioremap_registers(void) | |||
| 314 | 314 | ||
| 315 | static void __init at91rm9200_initialize(void) | 315 | static void __init at91rm9200_initialize(void) |
| 316 | { | 316 | { |
| 317 | at91_arch_reset = at91rm9200_reset; | 317 | arm_pm_restart = at91rm9200_restart; |
| 318 | at91_extern_irq = (1 << AT91RM9200_ID_IRQ0) | (1 << AT91RM9200_ID_IRQ1) | 318 | at91_extern_irq = (1 << AT91RM9200_ID_IRQ0) | (1 << AT91RM9200_ID_IRQ1) |
| 319 | | (1 << AT91RM9200_ID_IRQ2) | (1 << AT91RM9200_ID_IRQ3) | 319 | | (1 << AT91RM9200_ID_IRQ2) | (1 << AT91RM9200_ID_IRQ3) |
| 320 | | (1 << AT91RM9200_ID_IRQ4) | (1 << AT91RM9200_ID_IRQ5) | 320 | | (1 << AT91RM9200_ID_IRQ4) | (1 << AT91RM9200_ID_IRQ5) |
diff --git a/arch/arm/mach-at91/at91sam9260.c b/arch/arm/mach-at91/at91sam9260.c index 3a960d2740b..5e46e4a9643 100644 --- a/arch/arm/mach-at91/at91sam9260.c +++ b/arch/arm/mach-at91/at91sam9260.c | |||
| @@ -329,7 +329,7 @@ static void __init at91sam9260_ioremap_registers(void) | |||
| 329 | 329 | ||
| 330 | static void __init at91sam9260_initialize(void) | 330 | static void __init at91sam9260_initialize(void) |
| 331 | { | 331 | { |
| 332 | at91_arch_reset = at91sam9_alt_reset; | 332 | arm_pm_restart = at91sam9_alt_restart; |
| 333 | at91_extern_irq = (1 << AT91SAM9260_ID_IRQ0) | (1 << AT91SAM9260_ID_IRQ1) | 333 | at91_extern_irq = (1 << AT91SAM9260_ID_IRQ0) | (1 << AT91SAM9260_ID_IRQ1) |
| 334 | | (1 << AT91SAM9260_ID_IRQ2); | 334 | | (1 << AT91SAM9260_ID_IRQ2); |
| 335 | 335 | ||
diff --git a/arch/arm/mach-at91/at91sam9261.c b/arch/arm/mach-at91/at91sam9261.c index a0538c5c252..b85b9ea6017 100644 --- a/arch/arm/mach-at91/at91sam9261.c +++ b/arch/arm/mach-at91/at91sam9261.c | |||
| @@ -287,7 +287,7 @@ static void __init at91sam9261_ioremap_registers(void) | |||
| 287 | 287 | ||
| 288 | static void __init at91sam9261_initialize(void) | 288 | static void __init at91sam9261_initialize(void) |
| 289 | { | 289 | { |
| 290 | at91_arch_reset = at91sam9_alt_reset; | 290 | arm_pm_restart = at91sam9_alt_restart; |
| 291 | at91_extern_irq = (1 << AT91SAM9261_ID_IRQ0) | (1 << AT91SAM9261_ID_IRQ1) | 291 | at91_extern_irq = (1 << AT91SAM9261_ID_IRQ0) | (1 << AT91SAM9261_ID_IRQ1) |
| 292 | | (1 << AT91SAM9261_ID_IRQ2); | 292 | | (1 << AT91SAM9261_ID_IRQ2); |
| 293 | 293 | ||
diff --git a/arch/arm/mach-at91/at91sam9263.c b/arch/arm/mach-at91/at91sam9263.c index 5ffbbb024c1..79e3669b111 100644 --- a/arch/arm/mach-at91/at91sam9263.c +++ b/arch/arm/mach-at91/at91sam9263.c | |||
| @@ -308,7 +308,7 @@ static void __init at91sam9263_ioremap_registers(void) | |||
| 308 | 308 | ||
| 309 | static void __init at91sam9263_initialize(void) | 309 | static void __init at91sam9263_initialize(void) |
| 310 | { | 310 | { |
| 311 | at91_arch_reset = at91sam9_alt_reset; | 311 | arm_pm_restart = at91sam9_alt_restart; |
| 312 | at91_extern_irq = (1 << AT91SAM9263_ID_IRQ0) | (1 << AT91SAM9263_ID_IRQ1); | 312 | at91_extern_irq = (1 << AT91SAM9263_ID_IRQ0) | (1 << AT91SAM9263_ID_IRQ1); |
| 313 | 313 | ||
| 314 | /* Register GPIO subsystem */ | 314 | /* Register GPIO subsystem */ |
diff --git a/arch/arm/mach-at91/at91sam9_alt_reset.S b/arch/arm/mach-at91/at91sam9_alt_reset.S index e0256deb91f..d3f931c5942 100644 --- a/arch/arm/mach-at91/at91sam9_alt_reset.S +++ b/arch/arm/mach-at91/at91sam9_alt_reset.S | |||
| @@ -14,20 +14,15 @@ | |||
| 14 | */ | 14 | */ |
| 15 | 15 | ||
| 16 | #include <linux/linkage.h> | 16 | #include <linux/linkage.h> |
| 17 | #include <asm/system.h> | ||
| 18 | #include <mach/hardware.h> | 17 | #include <mach/hardware.h> |
| 19 | #include <mach/at91sam9_sdramc.h> | 18 | #include <mach/at91sam9_sdramc.h> |
| 20 | #include <mach/at91_rstc.h> | 19 | #include <mach/at91_rstc.h> |
| 21 | 20 | ||
| 22 | .arm | 21 | .arm |
| 23 | 22 | ||
| 24 | .globl at91sam9_alt_reset | 23 | .globl at91sam9_alt_restart |
| 25 | 24 | ||
| 26 | at91sam9_alt_reset: mrc p15, 0, r0, c1, c0, 0 | 25 | at91sam9_alt_restart: ldr r0, .at91_va_base_sdramc @ preload constants |
| 27 | orr r0, r0, #CR_I | ||
| 28 | mcr p15, 0, r0, c1, c0, 0 @ enable I-cache | ||
| 29 | |||
| 30 | ldr r0, .at91_va_base_sdramc @ preload constants | ||
| 31 | ldr r1, .at91_va_base_rstc_cr | 26 | ldr r1, .at91_va_base_rstc_cr |
| 32 | 27 | ||
| 33 | mov r2, #1 | 28 | mov r2, #1 |
diff --git a/arch/arm/mach-at91/at91sam9g45.c b/arch/arm/mach-at91/at91sam9g45.c index f61eb64e6b3..7032dd32cdf 100644 --- a/arch/arm/mach-at91/at91sam9g45.c +++ b/arch/arm/mach-at91/at91sam9g45.c | |||
| @@ -318,7 +318,7 @@ static struct at91_gpio_bank at91sam9g45_gpio[] __initdata = { | |||
| 318 | } | 318 | } |
| 319 | }; | 319 | }; |
| 320 | 320 | ||
| 321 | static void at91sam9g45_reset(void) | 321 | static void at91sam9g45_restart(char mode, const char *cmd) |
| 322 | { | 322 | { |
| 323 | at91_sys_write(AT91_RSTC_CR, AT91_RSTC_KEY | AT91_RSTC_PROCRST | AT91_RSTC_PERRST); | 323 | at91_sys_write(AT91_RSTC_CR, AT91_RSTC_KEY | AT91_RSTC_PROCRST | AT91_RSTC_PERRST); |
| 324 | } | 324 | } |
| @@ -342,7 +342,7 @@ static void __init at91sam9g45_ioremap_registers(void) | |||
| 342 | 342 | ||
| 343 | static void __init at91sam9g45_initialize(void) | 343 | static void __init at91sam9g45_initialize(void) |
| 344 | { | 344 | { |
| 345 | at91_arch_reset = at91sam9g45_reset; | 345 | arm_pm_restart = at91sam9g45_restart; |
| 346 | at91_extern_irq = (1 << AT91SAM9G45_ID_IRQ0); | 346 | at91_extern_irq = (1 << AT91SAM9G45_ID_IRQ0); |
| 347 | 347 | ||
| 348 | /* Register GPIO subsystem */ | 348 | /* Register GPIO subsystem */ |
diff --git a/arch/arm/mach-at91/at91sam9rl.c b/arch/arm/mach-at91/at91sam9rl.c index 96247f68b9d..d6bcb1da11d 100644 --- a/arch/arm/mach-at91/at91sam9rl.c +++ b/arch/arm/mach-at91/at91sam9rl.c | |||
| @@ -292,7 +292,7 @@ static void __init at91sam9rl_ioremap_registers(void) | |||
| 292 | 292 | ||
| 293 | static void __init at91sam9rl_initialize(void) | 293 | static void __init at91sam9rl_initialize(void) |
| 294 | { | 294 | { |
| 295 | at91_arch_reset = at91sam9_alt_reset; | 295 | arm_pm_restart = at91sam9_alt_restart; |
| 296 | at91_extern_irq = (1 << AT91SAM9RL_ID_IRQ0); | 296 | at91_extern_irq = (1 << AT91SAM9RL_ID_IRQ0); |
| 297 | 297 | ||
| 298 | /* Register GPIO subsystem */ | 298 | /* Register GPIO subsystem */ |
diff --git a/arch/arm/mach-at91/generic.h b/arch/arm/mach-at91/generic.h index 40309588f36..4866b8180d6 100644 --- a/arch/arm/mach-at91/generic.h +++ b/arch/arm/mach-at91/generic.h | |||
| @@ -58,7 +58,7 @@ extern void at91_irq_suspend(void); | |||
| 58 | extern void at91_irq_resume(void); | 58 | extern void at91_irq_resume(void); |
| 59 | 59 | ||
| 60 | /* reset */ | 60 | /* reset */ |
| 61 | extern void at91sam9_alt_reset(void); | 61 | extern void at91sam9_alt_restart(char, const char *); |
| 62 | 62 | ||
| 63 | /* shutdown */ | 63 | /* shutdown */ |
| 64 | extern void at91_ioremap_shdwc(u32 base_addr); | 64 | extern void at91_ioremap_shdwc(u32 base_addr); |
| @@ -74,5 +74,4 @@ struct at91_gpio_bank { | |||
| 74 | extern void __init at91_gpio_init(struct at91_gpio_bank *, int nr_banks); | 74 | extern void __init at91_gpio_init(struct at91_gpio_bank *, int nr_banks); |
| 75 | extern void __init at91_gpio_irq_setup(void); | 75 | extern void __init at91_gpio_irq_setup(void); |
| 76 | 76 | ||
| 77 | extern void (*at91_arch_reset)(void); | ||
| 78 | extern int at91_extern_irq; | 77 | extern int at91_extern_irq; |
diff --git a/arch/arm/mach-at91/include/mach/system.h b/arch/arm/mach-at91/include/mach/system.h index 36af14bc13b..cbd64f3bcec 100644 --- a/arch/arm/mach-at91/include/mach/system.h +++ b/arch/arm/mach-at91/include/mach/system.h | |||
| @@ -47,13 +47,4 @@ static inline void arch_idle(void) | |||
| 47 | #endif | 47 | #endif |
| 48 | } | 48 | } |
| 49 | 49 | ||
| 50 | void (*at91_arch_reset)(void); | ||
| 51 | |||
| 52 | static inline void arch_reset(char mode, const char *cmd) | ||
| 53 | { | ||
| 54 | /* call the CPU-specific reset function */ | ||
| 55 | if (at91_arch_reset) | ||
| 56 | (at91_arch_reset)(); | ||
| 57 | } | ||
| 58 | |||
| 59 | #endif | 50 | #endif |
diff --git a/arch/arm/mach-bcmring/arch.c b/arch/arm/mach-bcmring/arch.c index 31a143592c8..9e5e7552498 100644 --- a/arch/arm/mach-bcmring/arch.c +++ b/arch/arm/mach-bcmring/arch.c | |||
| @@ -49,7 +49,29 @@ HW_DECLARE_SPINLOCK(gpio) | |||
| 49 | #endif | 49 | #endif |
| 50 | 50 | ||
| 51 | /* sysctl */ | 51 | /* sysctl */ |
| 52 | int bcmring_arch_warm_reboot; /* do a warm reboot on hard reset */ | 52 | static int bcmring_arch_warm_reboot; /* do a warm reboot on hard reset */ |
| 53 | |||
| 54 | static void bcmring_restart(char mode, const char *cmd) | ||
| 55 | { | ||
| 56 | printk("arch_reset:%c %x\n", mode, bcmring_arch_warm_reboot); | ||
| 57 | |||
| 58 | if (mode == 'h') { | ||
| 59 | /* Reboot configured in proc entry */ | ||
| 60 | if (bcmring_arch_warm_reboot) { | ||
| 61 | printk("warm reset\n"); | ||
| 62 | /* Issue Warm reset (do not reset ethernet switch, keep alive) */ | ||
| 63 | chipcHw_reset(chipcHw_REG_SOFT_RESET_CHIP_WARM); | ||
| 64 | } else { | ||
| 65 | /* Force reset of everything */ | ||
| 66 | printk("force reset\n"); | ||
| 67 | chipcHw_reset(chipcHw_REG_SOFT_RESET_CHIP_SOFT); | ||
| 68 | } | ||
| 69 | } else { | ||
| 70 | /* Force reset of everything */ | ||
| 71 | printk("force reset\n"); | ||
| 72 | chipcHw_reset(chipcHw_REG_SOFT_RESET_CHIP_SOFT); | ||
| 73 | } | ||
| 74 | } | ||
| 53 | 75 | ||
| 54 | static struct ctl_table_header *bcmring_sysctl_header; | 76 | static struct ctl_table_header *bcmring_sysctl_header; |
| 55 | 77 | ||
| @@ -173,4 +195,5 @@ MACHINE_START(BCMRING, "BCMRING") | |||
| 173 | .init_irq = bcmring_init_irq, | 195 | .init_irq = bcmring_init_irq, |
| 174 | .timer = &bcmring_timer, | 196 | .timer = &bcmring_timer, |
| 175 | .init_machine = bcmring_init_machine | 197 | .init_machine = bcmring_init_machine |
| 198 | .restart = bcmring_restart, | ||
| 176 | MACHINE_END | 199 | MACHINE_END |
diff --git a/arch/arm/mach-bcmring/include/mach/system.h b/arch/arm/mach-bcmring/include/mach/system.h index 38b37060d42..cb78250db64 100644 --- a/arch/arm/mach-bcmring/include/mach/system.h +++ b/arch/arm/mach-bcmring/include/mach/system.h | |||
| @@ -20,35 +20,9 @@ | |||
| 20 | #ifndef __ASM_ARCH_SYSTEM_H | 20 | #ifndef __ASM_ARCH_SYSTEM_H |
| 21 | #define __ASM_ARCH_SYSTEM_H | 21 | #define __ASM_ARCH_SYSTEM_H |
| 22 | 22 | ||
| 23 | #include <mach/csp/chipcHw_inline.h> | ||
| 24 | |||
| 25 | extern int bcmring_arch_warm_reboot; | ||
| 26 | |||
| 27 | static inline void arch_idle(void) | 23 | static inline void arch_idle(void) |
| 28 | { | 24 | { |
| 29 | cpu_do_idle(); | 25 | cpu_do_idle(); |
| 30 | } | 26 | } |
| 31 | 27 | ||
| 32 | static inline void arch_reset(char mode, const char *cmd) | ||
| 33 | { | ||
| 34 | printk("arch_reset:%c %x\n", mode, bcmring_arch_warm_reboot); | ||
| 35 | |||
| 36 | if (mode == 'h') { | ||
| 37 | /* Reboot configured in proc entry */ | ||
| 38 | if (bcmring_arch_warm_reboot) { | ||
| 39 | printk("warm reset\n"); | ||
| 40 | /* Issue Warm reset (do not reset ethernet switch, keep alive) */ | ||
| 41 | chipcHw_reset(chipcHw_REG_SOFT_RESET_CHIP_WARM); | ||
| 42 | } else { | ||
| 43 | /* Force reset of everything */ | ||
| 44 | printk("force reset\n"); | ||
| 45 | chipcHw_reset(chipcHw_REG_SOFT_RESET_CHIP_SOFT); | ||
| 46 | } | ||
| 47 | } else { | ||
| 48 | /* Force reset of everything */ | ||
| 49 | printk("force reset\n"); | ||
| 50 | chipcHw_reset(chipcHw_REG_SOFT_RESET_CHIP_SOFT); | ||
| 51 | } | ||
| 52 | } | ||
| 53 | |||
| 54 | #endif | 28 | #endif |
diff --git a/arch/arm/mach-clps711x/autcpu12.c b/arch/arm/mach-clps711x/autcpu12.c index 0276091b7f8..3fb79a1d0bd 100644 --- a/arch/arm/mach-clps711x/autcpu12.c +++ b/arch/arm/mach-clps711x/autcpu12.c | |||
| @@ -68,5 +68,6 @@ MACHINE_START(AUTCPU12, "autronix autcpu12") | |||
| 68 | .map_io = autcpu12_map_io, | 68 | .map_io = autcpu12_map_io, |
| 69 | .init_irq = clps711x_init_irq, | 69 | .init_irq = clps711x_init_irq, |
| 70 | .timer = &clps711x_timer, | 70 | .timer = &clps711x_timer, |
| 71 | .restart = clps711x_restart, | ||
| 71 | MACHINE_END | 72 | MACHINE_END |
| 72 | 73 | ||
diff --git a/arch/arm/mach-clps711x/cdb89712.c b/arch/arm/mach-clps711x/cdb89712.c index 25b3bfd0e85..c314f49d6ef 100644 --- a/arch/arm/mach-clps711x/cdb89712.c +++ b/arch/arm/mach-clps711x/cdb89712.c | |||
| @@ -59,4 +59,5 @@ MACHINE_START(CDB89712, "Cirrus-CDB89712") | |||
| 59 | .map_io = cdb89712_map_io, | 59 | .map_io = cdb89712_map_io, |
| 60 | .init_irq = clps711x_init_irq, | 60 | .init_irq = clps711x_init_irq, |
| 61 | .timer = &clps711x_timer, | 61 | .timer = &clps711x_timer, |
| 62 | .restart = clps711x_restart, | ||
| 62 | MACHINE_END | 63 | MACHINE_END |
diff --git a/arch/arm/mach-clps711x/ceiva.c b/arch/arm/mach-clps711x/ceiva.c index 1df9ec67aa9..a70147e347a 100644 --- a/arch/arm/mach-clps711x/ceiva.c +++ b/arch/arm/mach-clps711x/ceiva.c | |||
| @@ -60,4 +60,5 @@ MACHINE_START(CEIVA, "CEIVA/Polaroid Photo MAX Digital Picture Frame") | |||
| 60 | .map_io = ceiva_map_io, | 60 | .map_io = ceiva_map_io, |
| 61 | .init_irq = clps711x_init_irq, | 61 | .init_irq = clps711x_init_irq, |
| 62 | .timer = &clps711x_timer, | 62 | .timer = &clps711x_timer, |
| 63 | .restart = clps711x_restart, | ||
| 63 | MACHINE_END | 64 | MACHINE_END |
diff --git a/arch/arm/mach-clps711x/clep7312.c b/arch/arm/mach-clps711x/clep7312.c index 80496c09ac5..dbc7842639d 100644 --- a/arch/arm/mach-clps711x/clep7312.c +++ b/arch/arm/mach-clps711x/clep7312.c | |||
| @@ -41,5 +41,6 @@ MACHINE_START(CLEP7212, "Cirrus Logic 7212/7312") | |||
| 41 | .map_io = clps711x_map_io, | 41 | .map_io = clps711x_map_io, |
| 42 | .init_irq = clps711x_init_irq, | 42 | .init_irq = clps711x_init_irq, |
| 43 | .timer = &clps711x_timer, | 43 | .timer = &clps711x_timer, |
| 44 | .restart = clps711x_restart, | ||
| 44 | MACHINE_END | 45 | MACHINE_END |
| 45 | 46 | ||
diff --git a/arch/arm/mach-clps711x/common.c b/arch/arm/mach-clps711x/common.c index ced2a4e406f..ab1711b9b4d 100644 --- a/arch/arm/mach-clps711x/common.c +++ b/arch/arm/mach-clps711x/common.c | |||
| @@ -220,3 +220,8 @@ struct sys_timer clps711x_timer = { | |||
| 220 | .init = clps711x_timer_init, | 220 | .init = clps711x_timer_init, |
| 221 | .offset = clps711x_gettimeoffset, | 221 | .offset = clps711x_gettimeoffset, |
| 222 | }; | 222 | }; |
| 223 | |||
| 224 | void clps711x_restart(char mode, const char *cmd) | ||
| 225 | { | ||
| 226 | soft_restart(0); | ||
| 227 | } | ||
diff --git a/arch/arm/mach-clps711x/common.h b/arch/arm/mach-clps711x/common.h index 2b8b801f1dc..fc0f0650dcb 100644 --- a/arch/arm/mach-clps711x/common.h +++ b/arch/arm/mach-clps711x/common.h | |||
| @@ -9,3 +9,4 @@ struct sys_timer; | |||
| 9 | extern void clps711x_map_io(void); | 9 | extern void clps711x_map_io(void); |
| 10 | extern void clps711x_init_irq(void); | 10 | extern void clps711x_init_irq(void); |
| 11 | extern struct sys_timer clps711x_timer; | 11 | extern struct sys_timer clps711x_timer; |
| 12 | extern void clps711x_restart(char mode, const char *cmd); | ||
diff --git a/arch/arm/mach-clps711x/edb7211-arch.c b/arch/arm/mach-clps711x/edb7211-arch.c index 9721f6111dc..5fad0b4f40a 100644 --- a/arch/arm/mach-clps711x/edb7211-arch.c +++ b/arch/arm/mach-clps711x/edb7211-arch.c | |||
| @@ -62,4 +62,5 @@ MACHINE_START(EDB7211, "CL-EDB7211 (EP7211 eval board)") | |||
| 62 | .reserve = edb7211_reserve, | 62 | .reserve = edb7211_reserve, |
| 63 | .init_irq = clps711x_init_irq, | 63 | .init_irq = clps711x_init_irq, |
| 64 | .timer = &clps711x_timer, | 64 | .timer = &clps711x_timer, |
| 65 | .restart = clps711x_restart, | ||
| 65 | MACHINE_END | 66 | MACHINE_END |
diff --git a/arch/arm/mach-clps711x/fortunet.c b/arch/arm/mach-clps711x/fortunet.c index d9925668729..3a3f0b702cb 100644 --- a/arch/arm/mach-clps711x/fortunet.c +++ b/arch/arm/mach-clps711x/fortunet.c | |||
| @@ -78,4 +78,5 @@ MACHINE_START(FORTUNET, "ARM-FortuNet") | |||
| 78 | .map_io = clps711x_map_io, | 78 | .map_io = clps711x_map_io, |
| 79 | .init_irq = clps711x_init_irq, | 79 | .init_irq = clps711x_init_irq, |
| 80 | .timer = &clps711x_timer, | 80 | .timer = &clps711x_timer, |
| 81 | .restart = clps711x_restart, | ||
| 81 | MACHINE_END | 82 | MACHINE_END |
diff --git a/arch/arm/mach-clps711x/include/mach/system.h b/arch/arm/mach-clps711x/include/mach/system.h index 6c119937d39..23d6ef8c84d 100644 --- a/arch/arm/mach-clps711x/include/mach/system.h +++ b/arch/arm/mach-clps711x/include/mach/system.h | |||
| @@ -32,9 +32,4 @@ static inline void arch_idle(void) | |||
| 32 | mov r0, r0"); | 32 | mov r0, r0"); |
| 33 | } | 33 | } |
| 34 | 34 | ||
| 35 | static inline void arch_reset(char mode, const char *cmd) | ||
| 36 | { | ||
| 37 | soft_restart(0); | ||
| 38 | } | ||
| 39 | |||
| 40 | #endif | 35 | #endif |
diff --git a/arch/arm/mach-clps711x/p720t.c b/arch/arm/mach-clps711x/p720t.c index 6ecea95f38b..42ee8f33eaf 100644 --- a/arch/arm/mach-clps711x/p720t.c +++ b/arch/arm/mach-clps711x/p720t.c | |||
| @@ -93,6 +93,7 @@ MACHINE_START(P720T, "ARM-Prospector720T") | |||
| 93 | .map_io = p720t_map_io, | 93 | .map_io = p720t_map_io, |
| 94 | .init_irq = clps711x_init_irq, | 94 | .init_irq = clps711x_init_irq, |
| 95 | .timer = &clps711x_timer, | 95 | .timer = &clps711x_timer, |
| 96 | .restart = clps711x_restart, | ||
| 96 | MACHINE_END | 97 | MACHINE_END |
| 97 | 98 | ||
| 98 | static int p720t_hw_init(void) | 99 | static int p720t_hw_init(void) |
diff --git a/arch/arm/mach-cns3xxx/cns3420vb.c b/arch/arm/mach-cns3xxx/cns3420vb.c index 594852fe24c..2c5fb4c7e50 100644 --- a/arch/arm/mach-cns3xxx/cns3420vb.c +++ b/arch/arm/mach-cns3xxx/cns3420vb.c | |||
| @@ -204,4 +204,5 @@ MACHINE_START(CNS3420VB, "Cavium Networks CNS3420 Validation Board") | |||
| 204 | .timer = &cns3xxx_timer, | 204 | .timer = &cns3xxx_timer, |
| 205 | .handle_irq = gic_handle_irq, | 205 | .handle_irq = gic_handle_irq, |
| 206 | .init_machine = cns3420_init, | 206 | .init_machine = cns3420_init, |
| 207 | .restart = cns3xxx_restart, | ||
| 207 | MACHINE_END | 208 | MACHINE_END |
diff --git a/arch/arm/mach-cns3xxx/core.h b/arch/arm/mach-cns3xxx/core.h index fcd225343c6..4894b8c1715 100644 --- a/arch/arm/mach-cns3xxx/core.h +++ b/arch/arm/mach-cns3xxx/core.h | |||
| @@ -22,5 +22,6 @@ static inline void cns3xxx_l2x0_init(void) {} | |||
| 22 | void __init cns3xxx_map_io(void); | 22 | void __init cns3xxx_map_io(void); |
| 23 | void __init cns3xxx_init_irq(void); | 23 | void __init cns3xxx_init_irq(void); |
| 24 | void cns3xxx_power_off(void); | 24 | void cns3xxx_power_off(void); |
| 25 | void cns3xxx_restart(char, const char *); | ||
| 25 | 26 | ||
| 26 | #endif /* __CNS3XXX_CORE_H */ | 27 | #endif /* __CNS3XXX_CORE_H */ |
diff --git a/arch/arm/mach-cns3xxx/include/mach/system.h b/arch/arm/mach-cns3xxx/include/mach/system.h index 4f16c9b79f7..9e56b7dc133 100644 --- a/arch/arm/mach-cns3xxx/include/mach/system.h +++ b/arch/arm/mach-cns3xxx/include/mach/system.h | |||
| @@ -11,7 +11,6 @@ | |||
| 11 | #ifndef __MACH_SYSTEM_H | 11 | #ifndef __MACH_SYSTEM_H |
| 12 | #define __MACH_SYSTEM_H | 12 | #define __MACH_SYSTEM_H |
| 13 | 13 | ||
| 14 | #include <linux/io.h> | ||
| 15 | #include <asm/proc-fns.h> | 14 | #include <asm/proc-fns.h> |
| 16 | 15 | ||
| 17 | static inline void arch_idle(void) | 16 | static inline void arch_idle(void) |
| @@ -23,6 +22,4 @@ static inline void arch_idle(void) | |||
| 23 | cpu_do_idle(); | 22 | cpu_do_idle(); |
| 24 | } | 23 | } |
| 25 | 24 | ||
| 26 | void arch_reset(char mode, const char *cmd); | ||
| 27 | |||
| 28 | #endif | 25 | #endif |
diff --git a/arch/arm/mach-cns3xxx/pm.c b/arch/arm/mach-cns3xxx/pm.c index 0c04678615c..36458080332 100644 --- a/arch/arm/mach-cns3xxx/pm.c +++ b/arch/arm/mach-cns3xxx/pm.c | |||
| @@ -11,9 +11,9 @@ | |||
| 11 | #include <linux/io.h> | 11 | #include <linux/io.h> |
| 12 | #include <linux/delay.h> | 12 | #include <linux/delay.h> |
| 13 | #include <linux/atomic.h> | 13 | #include <linux/atomic.h> |
| 14 | #include <mach/system.h> | ||
| 15 | #include <mach/cns3xxx.h> | 14 | #include <mach/cns3xxx.h> |
| 16 | #include <mach/pm.h> | 15 | #include <mach/pm.h> |
| 16 | #include "core.h" | ||
| 17 | 17 | ||
| 18 | void cns3xxx_pwr_clk_en(unsigned int block) | 18 | void cns3xxx_pwr_clk_en(unsigned int block) |
| 19 | { | 19 | { |
| @@ -89,7 +89,7 @@ void cns3xxx_pwr_soft_rst(unsigned int block) | |||
| 89 | } | 89 | } |
| 90 | EXPORT_SYMBOL(cns3xxx_pwr_soft_rst); | 90 | EXPORT_SYMBOL(cns3xxx_pwr_soft_rst); |
| 91 | 91 | ||
| 92 | void arch_reset(char mode, const char *cmd) | 92 | void cns3xxx_restart(char mode, const char *cmd) |
| 93 | { | 93 | { |
| 94 | /* | 94 | /* |
| 95 | * To reset, we hit the on-board reset register | 95 | * To reset, we hit the on-board reset register |
diff --git a/arch/arm/mach-davinci/board-da830-evm.c b/arch/arm/mach-davinci/board-da830-evm.c index 11c3db98528..dc1afe5be20 100644 --- a/arch/arm/mach-davinci/board-da830-evm.c +++ b/arch/arm/mach-davinci/board-da830-evm.c | |||
| @@ -682,4 +682,5 @@ MACHINE_START(DAVINCI_DA830_EVM, "DaVinci DA830/OMAP-L137/AM17x EVM") | |||
| 682 | .timer = &davinci_timer, | 682 | .timer = &davinci_timer, |
| 683 | .init_machine = da830_evm_init, | 683 | .init_machine = da830_evm_init, |
| 684 | .dma_zone_size = SZ_128M, | 684 | .dma_zone_size = SZ_128M, |
| 685 | .restart = da8xx_restart, | ||
| 685 | MACHINE_END | 686 | MACHINE_END |
diff --git a/arch/arm/mach-davinci/board-da850-evm.c b/arch/arm/mach-davinci/board-da850-evm.c index 6659a90dbca..f8a682f60a4 100644 --- a/arch/arm/mach-davinci/board-da850-evm.c +++ b/arch/arm/mach-davinci/board-da850-evm.c | |||
| @@ -1411,4 +1411,5 @@ MACHINE_START(DAVINCI_DA850_EVM, "DaVinci DA850/OMAP-L138/AM18x EVM") | |||
| 1411 | .timer = &davinci_timer, | 1411 | .timer = &davinci_timer, |
| 1412 | .init_machine = da850_evm_init, | 1412 | .init_machine = da850_evm_init, |
| 1413 | .dma_zone_size = SZ_128M, | 1413 | .dma_zone_size = SZ_128M, |
| 1414 | .restart = da8xx_restart, | ||
| 1414 | MACHINE_END | 1415 | MACHINE_END |
diff --git a/arch/arm/mach-davinci/board-dm355-evm.c b/arch/arm/mach-davinci/board-dm355-evm.c index 4e0e707c313..275341f159f 100644 --- a/arch/arm/mach-davinci/board-dm355-evm.c +++ b/arch/arm/mach-davinci/board-dm355-evm.c | |||
| @@ -357,4 +357,5 @@ MACHINE_START(DAVINCI_DM355_EVM, "DaVinci DM355 EVM") | |||
| 357 | .timer = &davinci_timer, | 357 | .timer = &davinci_timer, |
| 358 | .init_machine = dm355_evm_init, | 358 | .init_machine = dm355_evm_init, |
| 359 | .dma_zone_size = SZ_128M, | 359 | .dma_zone_size = SZ_128M, |
| 360 | .restart = davinci_restart, | ||
| 360 | MACHINE_END | 361 | MACHINE_END |
diff --git a/arch/arm/mach-davinci/board-dm355-leopard.c b/arch/arm/mach-davinci/board-dm355-leopard.c index ff2d2413279..e99db28181a 100644 --- a/arch/arm/mach-davinci/board-dm355-leopard.c +++ b/arch/arm/mach-davinci/board-dm355-leopard.c | |||
| @@ -276,4 +276,5 @@ MACHINE_START(DM355_LEOPARD, "DaVinci DM355 leopard") | |||
| 276 | .timer = &davinci_timer, | 276 | .timer = &davinci_timer, |
| 277 | .init_machine = dm355_leopard_init, | 277 | .init_machine = dm355_leopard_init, |
| 278 | .dma_zone_size = SZ_128M, | 278 | .dma_zone_size = SZ_128M, |
| 279 | .restart = davinci_restart, | ||
| 279 | MACHINE_END | 280 | MACHINE_END |
diff --git a/arch/arm/mach-davinci/board-dm365-evm.c b/arch/arm/mach-davinci/board-dm365-evm.c index 46e1f4173b9..346e1de2f5a 100644 --- a/arch/arm/mach-davinci/board-dm365-evm.c +++ b/arch/arm/mach-davinci/board-dm365-evm.c | |||
| @@ -618,5 +618,6 @@ MACHINE_START(DAVINCI_DM365_EVM, "DaVinci DM365 EVM") | |||
| 618 | .timer = &davinci_timer, | 618 | .timer = &davinci_timer, |
| 619 | .init_machine = dm365_evm_init, | 619 | .init_machine = dm365_evm_init, |
| 620 | .dma_zone_size = SZ_128M, | 620 | .dma_zone_size = SZ_128M, |
| 621 | .restart = davinci_restart, | ||
| 621 | MACHINE_END | 622 | MACHINE_END |
| 622 | 623 | ||
diff --git a/arch/arm/mach-davinci/board-dm644x-evm.c b/arch/arm/mach-davinci/board-dm644x-evm.c index 0cf8abf78d3..a64b49cfedc 100644 --- a/arch/arm/mach-davinci/board-dm644x-evm.c +++ b/arch/arm/mach-davinci/board-dm644x-evm.c | |||
| @@ -719,4 +719,5 @@ MACHINE_START(DAVINCI_EVM, "DaVinci DM644x EVM") | |||
| 719 | .timer = &davinci_timer, | 719 | .timer = &davinci_timer, |
| 720 | .init_machine = davinci_evm_init, | 720 | .init_machine = davinci_evm_init, |
| 721 | .dma_zone_size = SZ_128M, | 721 | .dma_zone_size = SZ_128M, |
| 722 | .restart = davinci_restart, | ||
| 722 | MACHINE_END | 723 | MACHINE_END |
diff --git a/arch/arm/mach-davinci/board-dm646x-evm.c b/arch/arm/mach-davinci/board-dm646x-evm.c index 635bf774015..64017558860 100644 --- a/arch/arm/mach-davinci/board-dm646x-evm.c +++ b/arch/arm/mach-davinci/board-dm646x-evm.c | |||
| @@ -799,6 +799,7 @@ MACHINE_START(DAVINCI_DM6467_EVM, "DaVinci DM646x EVM") | |||
| 799 | .timer = &davinci_timer, | 799 | .timer = &davinci_timer, |
| 800 | .init_machine = evm_init, | 800 | .init_machine = evm_init, |
| 801 | .dma_zone_size = SZ_128M, | 801 | .dma_zone_size = SZ_128M, |
| 802 | .restart = davinci_restart, | ||
| 802 | MACHINE_END | 803 | MACHINE_END |
| 803 | 804 | ||
| 804 | MACHINE_START(DAVINCI_DM6467TEVM, "DaVinci DM6467T EVM") | 805 | MACHINE_START(DAVINCI_DM6467TEVM, "DaVinci DM6467T EVM") |
| @@ -808,5 +809,6 @@ MACHINE_START(DAVINCI_DM6467TEVM, "DaVinci DM6467T EVM") | |||
| 808 | .timer = &davinci_timer, | 809 | .timer = &davinci_timer, |
| 809 | .init_machine = evm_init, | 810 | .init_machine = evm_init, |
| 810 | .dma_zone_size = SZ_128M, | 811 | .dma_zone_size = SZ_128M, |
| 812 | .restart = davinci_restart, | ||
| 811 | MACHINE_END | 813 | MACHINE_END |
| 812 | 814 | ||
diff --git a/arch/arm/mach-davinci/board-mityomapl138.c b/arch/arm/mach-davinci/board-mityomapl138.c index 3cfff555e8f..672d820e2aa 100644 --- a/arch/arm/mach-davinci/board-mityomapl138.c +++ b/arch/arm/mach-davinci/board-mityomapl138.c | |||
| @@ -573,4 +573,5 @@ MACHINE_START(MITYOMAPL138, "MityDSP-L138/MityARM-1808") | |||
| 573 | .timer = &davinci_timer, | 573 | .timer = &davinci_timer, |
| 574 | .init_machine = mityomapl138_init, | 574 | .init_machine = mityomapl138_init, |
| 575 | .dma_zone_size = SZ_128M, | 575 | .dma_zone_size = SZ_128M, |
| 576 | .restart = da8xx_restart, | ||
| 576 | MACHINE_END | 577 | MACHINE_END |
diff --git a/arch/arm/mach-davinci/board-neuros-osd2.c b/arch/arm/mach-davinci/board-neuros-osd2.c index e5f231aefee..6c4a16415d4 100644 --- a/arch/arm/mach-davinci/board-neuros-osd2.c +++ b/arch/arm/mach-davinci/board-neuros-osd2.c | |||
| @@ -278,4 +278,5 @@ MACHINE_START(NEUROS_OSD2, "Neuros OSD2") | |||
| 278 | .timer = &davinci_timer, | 278 | .timer = &davinci_timer, |
| 279 | .init_machine = davinci_ntosd2_init, | 279 | .init_machine = davinci_ntosd2_init, |
| 280 | .dma_zone_size = SZ_128M, | 280 | .dma_zone_size = SZ_128M, |
| 281 | .restart = davinci_restart, | ||
| 281 | MACHINE_END | 282 | MACHINE_END |
diff --git a/arch/arm/mach-davinci/board-omapl138-hawk.c b/arch/arm/mach-davinci/board-omapl138-hawk.c index c6701e4a795..e7c0c7c5349 100644 --- a/arch/arm/mach-davinci/board-omapl138-hawk.c +++ b/arch/arm/mach-davinci/board-omapl138-hawk.c | |||
| @@ -344,4 +344,5 @@ MACHINE_START(OMAPL138_HAWKBOARD, "AM18x/OMAP-L138 Hawkboard") | |||
| 344 | .timer = &davinci_timer, | 344 | .timer = &davinci_timer, |
| 345 | .init_machine = omapl138_hawk_init, | 345 | .init_machine = omapl138_hawk_init, |
| 346 | .dma_zone_size = SZ_128M, | 346 | .dma_zone_size = SZ_128M, |
| 347 | .restart = da8xx_restart, | ||
| 347 | MACHINE_END | 348 | MACHINE_END |
diff --git a/arch/arm/mach-davinci/board-sffsdr.c b/arch/arm/mach-davinci/board-sffsdr.c index 5dd4da9d230..0b136a831c5 100644 --- a/arch/arm/mach-davinci/board-sffsdr.c +++ b/arch/arm/mach-davinci/board-sffsdr.c | |||
| @@ -157,4 +157,5 @@ MACHINE_START(SFFSDR, "Lyrtech SFFSDR") | |||
| 157 | .timer = &davinci_timer, | 157 | .timer = &davinci_timer, |
| 158 | .init_machine = davinci_sffsdr_init, | 158 | .init_machine = davinci_sffsdr_init, |
| 159 | .dma_zone_size = SZ_128M, | 159 | .dma_zone_size = SZ_128M, |
| 160 | .restart = davinci_restart, | ||
| 160 | MACHINE_END | 161 | MACHINE_END |
diff --git a/arch/arm/mach-davinci/board-tnetv107x-evm.c b/arch/arm/mach-davinci/board-tnetv107x-evm.c index f69e40a29e0..5f14e30b00d 100644 --- a/arch/arm/mach-davinci/board-tnetv107x-evm.c +++ b/arch/arm/mach-davinci/board-tnetv107x-evm.c | |||
| @@ -283,4 +283,5 @@ MACHINE_START(TNETV107X, "TNETV107X EVM") | |||
| 283 | .timer = &davinci_timer, | 283 | .timer = &davinci_timer, |
| 284 | .init_machine = tnetv107x_evm_board_init, | 284 | .init_machine = tnetv107x_evm_board_init, |
| 285 | .dma_zone_size = SZ_128M, | 285 | .dma_zone_size = SZ_128M, |
| 286 | .restart = tnetv107x_restart, | ||
| 286 | MACHINE_END | 287 | MACHINE_END |
diff --git a/arch/arm/mach-davinci/common.c b/arch/arm/mach-davinci/common.c index 865ffe5899a..cb9b2e47510 100644 --- a/arch/arm/mach-davinci/common.c +++ b/arch/arm/mach-davinci/common.c | |||
| @@ -97,9 +97,6 @@ void __init davinci_common_init(struct davinci_soc_info *soc_info) | |||
| 97 | local_flush_tlb_all(); | 97 | local_flush_tlb_all(); |
| 98 | flush_cache_all(); | 98 | flush_cache_all(); |
| 99 | 99 | ||
| 100 | if (!davinci_soc_info.reset) | ||
| 101 | davinci_soc_info.reset = davinci_watchdog_reset; | ||
| 102 | |||
| 103 | /* | 100 | /* |
| 104 | * We want to check CPU revision early for cpu_is_xxxx() macros. | 101 | * We want to check CPU revision early for cpu_is_xxxx() macros. |
| 105 | * IO space mapping must be initialized before we can do that. | 102 | * IO space mapping must be initialized before we can do that. |
diff --git a/arch/arm/mach-davinci/da830.c b/arch/arm/mach-davinci/da830.c index a6bf5dcaef1..deee5c2da75 100644 --- a/arch/arm/mach-davinci/da830.c +++ b/arch/arm/mach-davinci/da830.c | |||
| @@ -1201,7 +1201,6 @@ static struct davinci_soc_info davinci_soc_info_da830 = { | |||
| 1201 | .gpio_irq = IRQ_DA8XX_GPIO0, | 1201 | .gpio_irq = IRQ_DA8XX_GPIO0, |
| 1202 | .serial_dev = &da8xx_serial_device, | 1202 | .serial_dev = &da8xx_serial_device, |
| 1203 | .emac_pdata = &da8xx_emac_pdata, | 1203 | .emac_pdata = &da8xx_emac_pdata, |
| 1204 | .reset_device = &da8xx_wdt_device, | ||
| 1205 | }; | 1204 | }; |
| 1206 | 1205 | ||
| 1207 | void __init da830_init(void) | 1206 | void __init da830_init(void) |
diff --git a/arch/arm/mach-davinci/da850.c b/arch/arm/mach-davinci/da850.c index b047f870227..0ed7fdb64ef 100644 --- a/arch/arm/mach-davinci/da850.c +++ b/arch/arm/mach-davinci/da850.c | |||
| @@ -1121,7 +1121,6 @@ static struct davinci_soc_info davinci_soc_info_da850 = { | |||
| 1121 | .emac_pdata = &da8xx_emac_pdata, | 1121 | .emac_pdata = &da8xx_emac_pdata, |
| 1122 | .sram_dma = DA8XX_ARM_RAM_BASE, | 1122 | .sram_dma = DA8XX_ARM_RAM_BASE, |
| 1123 | .sram_len = SZ_8K, | 1123 | .sram_len = SZ_8K, |
| 1124 | .reset_device = &da8xx_wdt_device, | ||
| 1125 | }; | 1124 | }; |
| 1126 | 1125 | ||
| 1127 | void __init da850_init(void) | 1126 | void __init da850_init(void) |
diff --git a/arch/arm/mach-davinci/devices-da8xx.c b/arch/arm/mach-davinci/devices-da8xx.c index 68def718886..42dbf3dc11a 100644 --- a/arch/arm/mach-davinci/devices-da8xx.c +++ b/arch/arm/mach-davinci/devices-da8xx.c | |||
| @@ -363,6 +363,11 @@ struct platform_device da8xx_wdt_device = { | |||
| 363 | .resource = da8xx_watchdog_resources, | 363 | .resource = da8xx_watchdog_resources, |
| 364 | }; | 364 | }; |
| 365 | 365 | ||
| 366 | void da8xx_restart(char mode, const char *cmd) | ||
| 367 | { | ||
| 368 | davinci_watchdog_reset(&da8xx_wdt_device); | ||
| 369 | } | ||
| 370 | |||
| 366 | int __init da8xx_register_watchdog(void) | 371 | int __init da8xx_register_watchdog(void) |
| 367 | { | 372 | { |
| 368 | return platform_device_register(&da8xx_wdt_device); | 373 | return platform_device_register(&da8xx_wdt_device); |
diff --git a/arch/arm/mach-davinci/devices.c b/arch/arm/mach-davinci/devices.c index 806a2f02b98..50c0156b426 100644 --- a/arch/arm/mach-davinci/devices.c +++ b/arch/arm/mach-davinci/devices.c | |||
| @@ -291,6 +291,11 @@ struct platform_device davinci_wdt_device = { | |||
| 291 | .resource = wdt_resources, | 291 | .resource = wdt_resources, |
| 292 | }; | 292 | }; |
| 293 | 293 | ||
| 294 | void davinci_restart(char mode, const char *cmd) | ||
| 295 | { | ||
| 296 | davinci_watchdog_reset(&davinci_wdt_device); | ||
| 297 | } | ||
| 298 | |||
| 294 | static void davinci_init_wdt(void) | 299 | static void davinci_init_wdt(void) |
| 295 | { | 300 | { |
| 296 | platform_device_register(&davinci_wdt_device); | 301 | platform_device_register(&davinci_wdt_device); |
diff --git a/arch/arm/mach-davinci/dm355.c b/arch/arm/mach-davinci/dm355.c index fe520d4167a..19667cfc5de 100644 --- a/arch/arm/mach-davinci/dm355.c +++ b/arch/arm/mach-davinci/dm355.c | |||
| @@ -853,7 +853,6 @@ static struct davinci_soc_info davinci_soc_info_dm355 = { | |||
| 853 | .serial_dev = &dm355_serial_device, | 853 | .serial_dev = &dm355_serial_device, |
| 854 | .sram_dma = 0x00010000, | 854 | .sram_dma = 0x00010000, |
| 855 | .sram_len = SZ_32K, | 855 | .sram_len = SZ_32K, |
| 856 | .reset_device = &davinci_wdt_device, | ||
| 857 | }; | 856 | }; |
| 858 | 857 | ||
| 859 | void __init dm355_init_asp1(u32 evt_enable, struct snd_platform_data *pdata) | 858 | void __init dm355_init_asp1(u32 evt_enable, struct snd_platform_data *pdata) |
diff --git a/arch/arm/mach-davinci/dm365.c b/arch/arm/mach-davinci/dm365.c index 679e168dce3..f15b435cc65 100644 --- a/arch/arm/mach-davinci/dm365.c +++ b/arch/arm/mach-davinci/dm365.c | |||
| @@ -1083,7 +1083,6 @@ static struct davinci_soc_info davinci_soc_info_dm365 = { | |||
| 1083 | .emac_pdata = &dm365_emac_pdata, | 1083 | .emac_pdata = &dm365_emac_pdata, |
| 1084 | .sram_dma = 0x00010000, | 1084 | .sram_dma = 0x00010000, |
| 1085 | .sram_len = SZ_32K, | 1085 | .sram_len = SZ_32K, |
| 1086 | .reset_device = &davinci_wdt_device, | ||
| 1087 | }; | 1086 | }; |
| 1088 | 1087 | ||
| 1089 | void __init dm365_init_asp(struct snd_platform_data *pdata) | 1088 | void __init dm365_init_asp(struct snd_platform_data *pdata) |
diff --git a/arch/arm/mach-davinci/dm644x.c b/arch/arm/mach-davinci/dm644x.c index 3470983aa34..0800f9cf33b 100644 --- a/arch/arm/mach-davinci/dm644x.c +++ b/arch/arm/mach-davinci/dm644x.c | |||
| @@ -767,7 +767,6 @@ static struct davinci_soc_info davinci_soc_info_dm644x = { | |||
| 767 | .emac_pdata = &dm644x_emac_pdata, | 767 | .emac_pdata = &dm644x_emac_pdata, |
| 768 | .sram_dma = 0x00008000, | 768 | .sram_dma = 0x00008000, |
| 769 | .sram_len = SZ_16K, | 769 | .sram_len = SZ_16K, |
| 770 | .reset_device = &davinci_wdt_device, | ||
| 771 | }; | 770 | }; |
| 772 | 771 | ||
| 773 | void __init dm644x_init_asp(struct snd_platform_data *pdata) | 772 | void __init dm644x_init_asp(struct snd_platform_data *pdata) |
diff --git a/arch/arm/mach-davinci/dm646x.c b/arch/arm/mach-davinci/dm646x.c index af27c130595..00f774394b1 100644 --- a/arch/arm/mach-davinci/dm646x.c +++ b/arch/arm/mach-davinci/dm646x.c | |||
| @@ -854,7 +854,6 @@ static struct davinci_soc_info davinci_soc_info_dm646x = { | |||
| 854 | .emac_pdata = &dm646x_emac_pdata, | 854 | .emac_pdata = &dm646x_emac_pdata, |
| 855 | .sram_dma = 0x10010000, | 855 | .sram_dma = 0x10010000, |
| 856 | .sram_len = SZ_32K, | 856 | .sram_len = SZ_32K, |
| 857 | .reset_device = &davinci_wdt_device, | ||
| 858 | }; | 857 | }; |
| 859 | 858 | ||
| 860 | void __init dm646x_init_mcasp0(struct snd_platform_data *pdata) | 859 | void __init dm646x_init_mcasp0(struct snd_platform_data *pdata) |
diff --git a/arch/arm/mach-davinci/include/mach/common.h b/arch/arm/mach-davinci/include/mach/common.h index a57cba21e21..5cd39a4e0c9 100644 --- a/arch/arm/mach-davinci/include/mach/common.h +++ b/arch/arm/mach-davinci/include/mach/common.h | |||
| @@ -77,14 +77,13 @@ struct davinci_soc_info { | |||
| 77 | struct emac_platform_data *emac_pdata; | 77 | struct emac_platform_data *emac_pdata; |
| 78 | dma_addr_t sram_dma; | 78 | dma_addr_t sram_dma; |
| 79 | unsigned sram_len; | 79 | unsigned sram_len; |
| 80 | struct platform_device *reset_device; | ||
| 81 | void (*reset)(struct platform_device *); | ||
| 82 | }; | 80 | }; |
| 83 | 81 | ||
| 84 | extern struct davinci_soc_info davinci_soc_info; | 82 | extern struct davinci_soc_info davinci_soc_info; |
| 85 | 83 | ||
| 86 | extern void davinci_common_init(struct davinci_soc_info *soc_info); | 84 | extern void davinci_common_init(struct davinci_soc_info *soc_info); |
| 87 | extern void davinci_init_ide(void); | 85 | extern void davinci_init_ide(void); |
| 86 | void davinci_restart(char mode, const char *cmd); | ||
| 88 | 87 | ||
| 89 | /* standard place to map on-chip SRAMs; they *may* support DMA */ | 88 | /* standard place to map on-chip SRAMs; they *may* support DMA */ |
| 90 | #define SRAM_VIRT 0xfffe0000 | 89 | #define SRAM_VIRT 0xfffe0000 |
diff --git a/arch/arm/mach-davinci/include/mach/da8xx.h b/arch/arm/mach-davinci/include/mach/da8xx.h index eaca7d8b9d6..ee3461d7ec1 100644 --- a/arch/arm/mach-davinci/include/mach/da8xx.h +++ b/arch/arm/mach-davinci/include/mach/da8xx.h | |||
| @@ -91,6 +91,7 @@ int da8xx_register_cpuidle(void); | |||
| 91 | void __iomem * __init da8xx_get_mem_ctlr(void); | 91 | void __iomem * __init da8xx_get_mem_ctlr(void); |
| 92 | int da850_register_pm(struct platform_device *pdev); | 92 | int da850_register_pm(struct platform_device *pdev); |
| 93 | int __init da850_register_sata(unsigned long refclkpn); | 93 | int __init da850_register_sata(unsigned long refclkpn); |
| 94 | void da8xx_restart(char mode, const char *cmd); | ||
| 94 | 95 | ||
| 95 | extern struct platform_device da8xx_serial_device; | 96 | extern struct platform_device da8xx_serial_device; |
| 96 | extern struct emac_platform_data da8xx_emac_pdata; | 97 | extern struct emac_platform_data da8xx_emac_pdata; |
diff --git a/arch/arm/mach-davinci/include/mach/system.h b/arch/arm/mach-davinci/include/mach/system.h index e65629c2076..fcb7a015aba 100644 --- a/arch/arm/mach-davinci/include/mach/system.h +++ b/arch/arm/mach-davinci/include/mach/system.h | |||
| @@ -18,10 +18,4 @@ static inline void arch_idle(void) | |||
| 18 | cpu_do_idle(); | 18 | cpu_do_idle(); |
| 19 | } | 19 | } |
| 20 | 20 | ||
| 21 | static inline void arch_reset(char mode, const char *cmd) | ||
| 22 | { | ||
| 23 | if (davinci_soc_info.reset) | ||
| 24 | davinci_soc_info.reset(davinci_soc_info.reset_device); | ||
| 25 | } | ||
| 26 | |||
| 27 | #endif /* __ASM_ARCH_SYSTEM_H */ | 21 | #endif /* __ASM_ARCH_SYSTEM_H */ |
diff --git a/arch/arm/mach-davinci/include/mach/tnetv107x.h b/arch/arm/mach-davinci/include/mach/tnetv107x.h index 89c1fdc63c0..83e5926f3c4 100644 --- a/arch/arm/mach-davinci/include/mach/tnetv107x.h +++ b/arch/arm/mach-davinci/include/mach/tnetv107x.h | |||
| @@ -54,6 +54,7 @@ extern struct platform_device tnetv107x_serial_device; | |||
| 54 | extern void __init tnetv107x_init(void); | 54 | extern void __init tnetv107x_init(void); |
| 55 | extern void __init tnetv107x_devices_init(struct tnetv107x_device_info *); | 55 | extern void __init tnetv107x_devices_init(struct tnetv107x_device_info *); |
| 56 | extern void __init tnetv107x_irq_init(void); | 56 | extern void __init tnetv107x_irq_init(void); |
| 57 | void tnetv107x_restart(char mode, const char *cmd); | ||
| 57 | 58 | ||
| 58 | #endif | 59 | #endif |
| 59 | 60 | ||
diff --git a/arch/arm/mach-davinci/tnetv107x.c b/arch/arm/mach-davinci/tnetv107x.c index 409bb869c7c..dc1a209b9b6 100644 --- a/arch/arm/mach-davinci/tnetv107x.c +++ b/arch/arm/mach-davinci/tnetv107x.c | |||
| @@ -730,6 +730,11 @@ static void tnetv107x_watchdog_reset(struct platform_device *pdev) | |||
| 730 | __raw_writel(1, ®s->kick); | 730 | __raw_writel(1, ®s->kick); |
| 731 | } | 731 | } |
| 732 | 732 | ||
| 733 | void tnetv107x_restart(char mode, const char *cmd) | ||
| 734 | { | ||
| 735 | tnetv107x_watchdog_reset(&tnetv107x_wdt_device); | ||
| 736 | } | ||
| 737 | |||
| 733 | static struct davinci_soc_info tnetv107x_soc_info = { | 738 | static struct davinci_soc_info tnetv107x_soc_info = { |
| 734 | .io_desc = io_desc, | 739 | .io_desc = io_desc, |
| 735 | .io_desc_num = ARRAY_SIZE(io_desc), | 740 | .io_desc_num = ARRAY_SIZE(io_desc), |
| @@ -752,8 +757,6 @@ static struct davinci_soc_info tnetv107x_soc_info = { | |||
| 752 | .gpio_num = TNETV107X_N_GPIO, | 757 | .gpio_num = TNETV107X_N_GPIO, |
| 753 | .timer_info = &timer_info, | 758 | .timer_info = &timer_info, |
| 754 | .serial_dev = &tnetv107x_serial_device, | 759 | .serial_dev = &tnetv107x_serial_device, |
| 755 | .reset = tnetv107x_watchdog_reset, | ||
| 756 | .reset_device = &tnetv107x_wdt_device, | ||
| 757 | }; | 760 | }; |
| 758 | 761 | ||
| 759 | void __init tnetv107x_init(void) | 762 | void __init tnetv107x_init(void) |
diff --git a/arch/arm/mach-dove/cm-a510.c b/arch/arm/mach-dove/cm-a510.c index c8a406f7e94..792b4e2e24f 100644 --- a/arch/arm/mach-dove/cm-a510.c +++ b/arch/arm/mach-dove/cm-a510.c | |||
| @@ -93,4 +93,5 @@ MACHINE_START(CM_A510, "Compulab CM-A510 Board") | |||
| 93 | .init_early = dove_init_early, | 93 | .init_early = dove_init_early, |
| 94 | .init_irq = dove_init_irq, | 94 | .init_irq = dove_init_irq, |
| 95 | .timer = &dove_timer, | 95 | .timer = &dove_timer, |
| 96 | .restart = dove_restart, | ||
| 96 | MACHINE_END | 97 | MACHINE_END |
diff --git a/arch/arm/mach-dove/common.c b/arch/arm/mach-dove/common.c index a9e0dae86a2..13bb236cd0c 100644 --- a/arch/arm/mach-dove/common.c +++ b/arch/arm/mach-dove/common.c | |||
| @@ -292,3 +292,19 @@ void __init dove_init(void) | |||
| 292 | dove_xor0_init(); | 292 | dove_xor0_init(); |
| 293 | dove_xor1_init(); | 293 | dove_xor1_init(); |
| 294 | } | 294 | } |
| 295 | |||
| 296 | void dove_restart(char mode, const char *cmd) | ||
| 297 | { | ||
| 298 | /* | ||
| 299 | * Enable soft reset to assert RSTOUTn. | ||
| 300 | */ | ||
| 301 | writel(SOFT_RESET_OUT_EN, RSTOUTn_MASK); | ||
| 302 | |||
| 303 | /* | ||
| 304 | * Assert soft reset. | ||
| 305 | */ | ||
| 306 | writel(SOFT_RESET, SYSTEM_SOFT_RESET); | ||
| 307 | |||
| 308 | while (1) | ||
| 309 | ; | ||
| 310 | } | ||
diff --git a/arch/arm/mach-dove/common.h b/arch/arm/mach-dove/common.h index 6a2046e4470..42027305c10 100644 --- a/arch/arm/mach-dove/common.h +++ b/arch/arm/mach-dove/common.h | |||
| @@ -39,5 +39,6 @@ void dove_spi1_init(void); | |||
| 39 | void dove_i2c_init(void); | 39 | void dove_i2c_init(void); |
| 40 | void dove_sdio0_init(void); | 40 | void dove_sdio0_init(void); |
| 41 | void dove_sdio1_init(void); | 41 | void dove_sdio1_init(void); |
| 42 | void dove_restart(char, const char *); | ||
| 42 | 43 | ||
| 43 | #endif | 44 | #endif |
diff --git a/arch/arm/mach-dove/dove-db-setup.c b/arch/arm/mach-dove/dove-db-setup.c index 11ea34e4fc7..ea77ae430b2 100644 --- a/arch/arm/mach-dove/dove-db-setup.c +++ b/arch/arm/mach-dove/dove-db-setup.c | |||
| @@ -100,4 +100,5 @@ MACHINE_START(DOVE_DB, "Marvell DB-MV88AP510-BP Development Board") | |||
| 100 | .init_early = dove_init_early, | 100 | .init_early = dove_init_early, |
| 101 | .init_irq = dove_init_irq, | 101 | .init_irq = dove_init_irq, |
| 102 | .timer = &dove_timer, | 102 | .timer = &dove_timer, |
| 103 | .restart = dove_restart, | ||
| 103 | MACHINE_END | 104 | MACHINE_END |
diff --git a/arch/arm/mach-dove/include/mach/system.h b/arch/arm/mach-dove/include/mach/system.h index 356afda5685..3027954f616 100644 --- a/arch/arm/mach-dove/include/mach/system.h +++ b/arch/arm/mach-dove/include/mach/system.h | |||
| @@ -9,28 +9,9 @@ | |||
| 9 | #ifndef __ASM_ARCH_SYSTEM_H | 9 | #ifndef __ASM_ARCH_SYSTEM_H |
| 10 | #define __ASM_ARCH_SYSTEM_H | 10 | #define __ASM_ARCH_SYSTEM_H |
| 11 | 11 | ||
| 12 | #include <mach/bridge-regs.h> | ||
| 13 | |||
| 14 | static inline void arch_idle(void) | 12 | static inline void arch_idle(void) |
| 15 | { | 13 | { |
| 16 | cpu_do_idle(); | 14 | cpu_do_idle(); |
| 17 | } | 15 | } |
| 18 | 16 | ||
| 19 | static inline void arch_reset(char mode, const char *cmd) | ||
| 20 | { | ||
| 21 | /* | ||
| 22 | * Enable soft reset to assert RSTOUTn. | ||
| 23 | */ | ||
| 24 | writel(SOFT_RESET_OUT_EN, RSTOUTn_MASK); | ||
| 25 | |||
| 26 | /* | ||
| 27 | * Assert soft reset. | ||
| 28 | */ | ||
| 29 | writel(SOFT_RESET, SYSTEM_SOFT_RESET); | ||
| 30 | |||
| 31 | while (1) | ||
| 32 | ; | ||
| 33 | } | ||
| 34 | |||
| 35 | |||
| 36 | #endif | 17 | #endif |
diff --git a/arch/arm/mach-ebsa110/core.c b/arch/arm/mach-ebsa110/core.c index ce3ed244c4b..294aad07f7a 100644 --- a/arch/arm/mach-ebsa110/core.c +++ b/arch/arm/mach-ebsa110/core.c | |||
| @@ -278,6 +278,11 @@ static int __init ebsa110_init(void) | |||
| 278 | 278 | ||
| 279 | arch_initcall(ebsa110_init); | 279 | arch_initcall(ebsa110_init); |
| 280 | 280 | ||
| 281 | static void ebsa110_restart(char mode, const char *cmd) | ||
| 282 | { | ||
| 283 | soft_restart(0x80000000); | ||
| 284 | } | ||
| 285 | |||
| 281 | MACHINE_START(EBSA110, "EBSA110") | 286 | MACHINE_START(EBSA110, "EBSA110") |
| 282 | /* Maintainer: Russell King */ | 287 | /* Maintainer: Russell King */ |
| 283 | .atag_offset = 0x400, | 288 | .atag_offset = 0x400, |
| @@ -287,4 +292,5 @@ MACHINE_START(EBSA110, "EBSA110") | |||
| 287 | .map_io = ebsa110_map_io, | 292 | .map_io = ebsa110_map_io, |
| 288 | .init_irq = ebsa110_init_irq, | 293 | .init_irq = ebsa110_init_irq, |
| 289 | .timer = &ebsa110_timer, | 294 | .timer = &ebsa110_timer, |
| 295 | .restart = ebsa110_restart, | ||
| 290 | MACHINE_END | 296 | MACHINE_END |
diff --git a/arch/arm/mach-ebsa110/include/mach/system.h b/arch/arm/mach-ebsa110/include/mach/system.h index 0d5df72a03f..2e4af65edb6 100644 --- a/arch/arm/mach-ebsa110/include/mach/system.h +++ b/arch/arm/mach-ebsa110/include/mach/system.h | |||
| @@ -34,6 +34,4 @@ static inline void arch_idle(void) | |||
| 34 | asm volatile ("mcr p15, 0, ip, c15, c1, 2" : : : "cc"); | 34 | asm volatile ("mcr p15, 0, ip, c15, c1, 2" : : : "cc"); |
| 35 | } | 35 | } |
| 36 | 36 | ||
| 37 | #define arch_reset(mode, cmd) soft_restart(0x80000000) | ||
| 38 | |||
| 39 | #endif | 37 | #endif |
diff --git a/arch/arm/mach-ep93xx/adssphere.c b/arch/arm/mach-ep93xx/adssphere.c index d9b0ea2ba4d..681e939407d 100644 --- a/arch/arm/mach-ep93xx/adssphere.c +++ b/arch/arm/mach-ep93xx/adssphere.c | |||
| @@ -40,4 +40,5 @@ MACHINE_START(ADSSPHERE, "ADS Sphere board") | |||
| 40 | .handle_irq = vic_handle_irq, | 40 | .handle_irq = vic_handle_irq, |
| 41 | .timer = &ep93xx_timer, | 41 | .timer = &ep93xx_timer, |
| 42 | .init_machine = adssphere_init_machine, | 42 | .init_machine = adssphere_init_machine, |
| 43 | .restart = ep93xx_restart, | ||
| 43 | MACHINE_END | 44 | MACHINE_END |
diff --git a/arch/arm/mach-ep93xx/core.c b/arch/arm/mach-ep93xx/core.c index 2432a6b7dca..24203f9a679 100644 --- a/arch/arm/mach-ep93xx/core.c +++ b/arch/arm/mach-ep93xx/core.c | |||
| @@ -906,3 +906,15 @@ void __init ep93xx_init_devices(void) | |||
| 906 | platform_device_register(&ep93xx_ohci_device); | 906 | platform_device_register(&ep93xx_ohci_device); |
| 907 | platform_device_register(&ep93xx_leds); | 907 | platform_device_register(&ep93xx_leds); |
| 908 | } | 908 | } |
| 909 | |||
| 910 | void ep93xx_restart(char mode, const char *cmd) | ||
| 911 | { | ||
| 912 | /* | ||
| 913 | * Set then clear the SWRST bit to initiate a software reset | ||
| 914 | */ | ||
| 915 | ep93xx_devcfg_set_bits(EP93XX_SYSCON_DEVCFG_SWRST); | ||
| 916 | ep93xx_devcfg_clear_bits(EP93XX_SYSCON_DEVCFG_SWRST); | ||
| 917 | |||
| 918 | while (1) | ||
| 919 | ; | ||
| 920 | } | ||
diff --git a/arch/arm/mach-ep93xx/edb93xx.c b/arch/arm/mach-ep93xx/edb93xx.c index 9bbae0835f2..d115653edca 100644 --- a/arch/arm/mach-ep93xx/edb93xx.c +++ b/arch/arm/mach-ep93xx/edb93xx.c | |||
| @@ -254,6 +254,7 @@ MACHINE_START(EDB9301, "Cirrus Logic EDB9301 Evaluation Board") | |||
| 254 | .handle_irq = vic_handle_irq, | 254 | .handle_irq = vic_handle_irq, |
| 255 | .timer = &ep93xx_timer, | 255 | .timer = &ep93xx_timer, |
| 256 | .init_machine = edb93xx_init_machine, | 256 | .init_machine = edb93xx_init_machine, |
| 257 | .restart = ep93xx_restart, | ||
| 257 | MACHINE_END | 258 | MACHINE_END |
| 258 | #endif | 259 | #endif |
| 259 | 260 | ||
| @@ -266,6 +267,7 @@ MACHINE_START(EDB9302, "Cirrus Logic EDB9302 Evaluation Board") | |||
| 266 | .handle_irq = vic_handle_irq, | 267 | .handle_irq = vic_handle_irq, |
| 267 | .timer = &ep93xx_timer, | 268 | .timer = &ep93xx_timer, |
| 268 | .init_machine = edb93xx_init_machine, | 269 | .init_machine = edb93xx_init_machine, |
| 270 | .restart = ep93xx_restart, | ||
| 269 | MACHINE_END | 271 | MACHINE_END |
| 270 | #endif | 272 | #endif |
| 271 | 273 | ||
| @@ -278,6 +280,7 @@ MACHINE_START(EDB9302A, "Cirrus Logic EDB9302A Evaluation Board") | |||
| 278 | .handle_irq = vic_handle_irq, | 280 | .handle_irq = vic_handle_irq, |
| 279 | .timer = &ep93xx_timer, | 281 | .timer = &ep93xx_timer, |
| 280 | .init_machine = edb93xx_init_machine, | 282 | .init_machine = edb93xx_init_machine, |
| 283 | .restart = ep93xx_restart, | ||
| 281 | MACHINE_END | 284 | MACHINE_END |
| 282 | #endif | 285 | #endif |
| 283 | 286 | ||
| @@ -290,6 +293,7 @@ MACHINE_START(EDB9307, "Cirrus Logic EDB9307 Evaluation Board") | |||
| 290 | .handle_irq = vic_handle_irq, | 293 | .handle_irq = vic_handle_irq, |
| 291 | .timer = &ep93xx_timer, | 294 | .timer = &ep93xx_timer, |
| 292 | .init_machine = edb93xx_init_machine, | 295 | .init_machine = edb93xx_init_machine, |
| 296 | .restart = ep93xx_restart, | ||
| 293 | MACHINE_END | 297 | MACHINE_END |
| 294 | #endif | 298 | #endif |
| 295 | 299 | ||
| @@ -302,6 +306,7 @@ MACHINE_START(EDB9307A, "Cirrus Logic EDB9307A Evaluation Board") | |||
| 302 | .handle_irq = vic_handle_irq, | 306 | .handle_irq = vic_handle_irq, |
| 303 | .timer = &ep93xx_timer, | 307 | .timer = &ep93xx_timer, |
| 304 | .init_machine = edb93xx_init_machine, | 308 | .init_machine = edb93xx_init_machine, |
| 309 | .restart = ep93xx_restart, | ||
| 305 | MACHINE_END | 310 | MACHINE_END |
| 306 | #endif | 311 | #endif |
| 307 | 312 | ||
| @@ -314,6 +319,7 @@ MACHINE_START(EDB9312, "Cirrus Logic EDB9312 Evaluation Board") | |||
| 314 | .handle_irq = vic_handle_irq, | 319 | .handle_irq = vic_handle_irq, |
| 315 | .timer = &ep93xx_timer, | 320 | .timer = &ep93xx_timer, |
| 316 | .init_machine = edb93xx_init_machine, | 321 | .init_machine = edb93xx_init_machine, |
| 322 | .restart = ep93xx_restart, | ||
| 317 | MACHINE_END | 323 | MACHINE_END |
| 318 | #endif | 324 | #endif |
| 319 | 325 | ||
| @@ -326,6 +332,7 @@ MACHINE_START(EDB9315, "Cirrus Logic EDB9315 Evaluation Board") | |||
| 326 | .handle_irq = vic_handle_irq, | 332 | .handle_irq = vic_handle_irq, |
| 327 | .timer = &ep93xx_timer, | 333 | .timer = &ep93xx_timer, |
| 328 | .init_machine = edb93xx_init_machine, | 334 | .init_machine = edb93xx_init_machine, |
| 335 | .restart = ep93xx_restart, | ||
| 329 | MACHINE_END | 336 | MACHINE_END |
| 330 | #endif | 337 | #endif |
| 331 | 338 | ||
| @@ -338,5 +345,6 @@ MACHINE_START(EDB9315A, "Cirrus Logic EDB9315A Evaluation Board") | |||
| 338 | .handle_irq = vic_handle_irq, | 345 | .handle_irq = vic_handle_irq, |
| 339 | .timer = &ep93xx_timer, | 346 | .timer = &ep93xx_timer, |
| 340 | .init_machine = edb93xx_init_machine, | 347 | .init_machine = edb93xx_init_machine, |
| 348 | .restart = ep93xx_restart, | ||
| 341 | MACHINE_END | 349 | MACHINE_END |
| 342 | #endif | 350 | #endif |
diff --git a/arch/arm/mach-ep93xx/gesbc9312.c b/arch/arm/mach-ep93xx/gesbc9312.c index 1dd32a7c5f1..af46970dc58 100644 --- a/arch/arm/mach-ep93xx/gesbc9312.c +++ b/arch/arm/mach-ep93xx/gesbc9312.c | |||
| @@ -40,4 +40,5 @@ MACHINE_START(GESBC9312, "Glomation GESBC-9312-sx") | |||
| 40 | .handle_irq = vic_handle_irq, | 40 | .handle_irq = vic_handle_irq, |
| 41 | .timer = &ep93xx_timer, | 41 | .timer = &ep93xx_timer, |
| 42 | .init_machine = gesbc9312_init_machine, | 42 | .init_machine = gesbc9312_init_machine, |
| 43 | .restart = ep93xx_restart, | ||
| 43 | MACHINE_END | 44 | MACHINE_END |
diff --git a/arch/arm/mach-ep93xx/include/mach/platform.h b/arch/arm/mach-ep93xx/include/mach/platform.h index 50660455b1d..d4c934931f9 100644 --- a/arch/arm/mach-ep93xx/include/mach/platform.h +++ b/arch/arm/mach-ep93xx/include/mach/platform.h | |||
| @@ -66,4 +66,6 @@ void ep93xx_register_ac97(void); | |||
| 66 | void ep93xx_init_devices(void); | 66 | void ep93xx_init_devices(void); |
| 67 | extern struct sys_timer ep93xx_timer; | 67 | extern struct sys_timer ep93xx_timer; |
| 68 | 68 | ||
| 69 | void ep93xx_restart(char, const char *); | ||
| 70 | |||
| 69 | #endif | 71 | #endif |
diff --git a/arch/arm/mach-ep93xx/include/mach/system.h b/arch/arm/mach-ep93xx/include/mach/system.h index bdf6c4f1fee..b5bec7cb9b5 100644 --- a/arch/arm/mach-ep93xx/include/mach/system.h +++ b/arch/arm/mach-ep93xx/include/mach/system.h | |||
| @@ -1,22 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * arch/arm/mach-ep93xx/include/mach/system.h | 2 | * arch/arm/mach-ep93xx/include/mach/system.h |
| 3 | */ | 3 | */ |
| 4 | |||
| 5 | #include <mach/hardware.h> | ||
| 6 | |||
| 7 | static inline void arch_idle(void) | 4 | static inline void arch_idle(void) |
| 8 | { | 5 | { |
| 9 | cpu_do_idle(); | 6 | cpu_do_idle(); |
| 10 | } | 7 | } |
| 11 | |||
| 12 | static inline void arch_reset(char mode, const char *cmd) | ||
| 13 | { | ||
| 14 | /* | ||
| 15 | * Set then clear the SWRST bit to initiate a software reset | ||
| 16 | */ | ||
| 17 | ep93xx_devcfg_set_bits(EP93XX_SYSCON_DEVCFG_SWRST); | ||
| 18 | ep93xx_devcfg_clear_bits(EP93XX_SYSCON_DEVCFG_SWRST); | ||
| 19 | |||
| 20 | while (1) | ||
| 21 | ; | ||
| 22 | } | ||
diff --git a/arch/arm/mach-ep93xx/micro9.c b/arch/arm/mach-ep93xx/micro9.c index a6dae6c2e3c..7b98084f0c9 100644 --- a/arch/arm/mach-ep93xx/micro9.c +++ b/arch/arm/mach-ep93xx/micro9.c | |||
| @@ -84,6 +84,7 @@ MACHINE_START(MICRO9, "Contec Micro9-High") | |||
| 84 | .handle_irq = vic_handle_irq, | 84 | .handle_irq = vic_handle_irq, |
| 85 | .timer = &ep93xx_timer, | 85 | .timer = &ep93xx_timer, |
| 86 | .init_machine = micro9_init_machine, | 86 | .init_machine = micro9_init_machine, |
| 87 | .restart = ep93xx_restart, | ||
| 87 | MACHINE_END | 88 | MACHINE_END |
| 88 | #endif | 89 | #endif |
| 89 | 90 | ||
| @@ -96,6 +97,7 @@ MACHINE_START(MICRO9M, "Contec Micro9-Mid") | |||
| 96 | .handle_irq = vic_handle_irq, | 97 | .handle_irq = vic_handle_irq, |
| 97 | .timer = &ep93xx_timer, | 98 | .timer = &ep93xx_timer, |
| 98 | .init_machine = micro9_init_machine, | 99 | .init_machine = micro9_init_machine, |
| 100 | .restart = ep93xx_restart, | ||
| 99 | MACHINE_END | 101 | MACHINE_END |
| 100 | #endif | 102 | #endif |
| 101 | 103 | ||
| @@ -108,6 +110,7 @@ MACHINE_START(MICRO9L, "Contec Micro9-Lite") | |||
| 108 | .handle_irq = vic_handle_irq, | 110 | .handle_irq = vic_handle_irq, |
| 109 | .timer = &ep93xx_timer, | 111 | .timer = &ep93xx_timer, |
| 110 | .init_machine = micro9_init_machine, | 112 | .init_machine = micro9_init_machine, |
| 113 | .restart = ep93xx_restart, | ||
| 111 | MACHINE_END | 114 | MACHINE_END |
| 112 | #endif | 115 | #endif |
| 113 | 116 | ||
| @@ -120,5 +123,6 @@ MACHINE_START(MICRO9S, "Contec Micro9-Slim") | |||
| 120 | .handle_irq = vic_handle_irq, | 123 | .handle_irq = vic_handle_irq, |
| 121 | .timer = &ep93xx_timer, | 124 | .timer = &ep93xx_timer, |
| 122 | .init_machine = micro9_init_machine, | 125 | .init_machine = micro9_init_machine, |
| 126 | .restart = ep93xx_restart, | ||
| 123 | MACHINE_END | 127 | MACHINE_END |
| 124 | #endif | 128 | #endif |
diff --git a/arch/arm/mach-ep93xx/simone.c b/arch/arm/mach-ep93xx/simone.c index 40121ba8e71..f4e553eca21 100644 --- a/arch/arm/mach-ep93xx/simone.c +++ b/arch/arm/mach-ep93xx/simone.c | |||
| @@ -84,4 +84,5 @@ MACHINE_START(SIM_ONE, "Simplemachines Sim.One Board") | |||
| 84 | .handle_irq = vic_handle_irq, | 84 | .handle_irq = vic_handle_irq, |
| 85 | .timer = &ep93xx_timer, | 85 | .timer = &ep93xx_timer, |
| 86 | .init_machine = simone_init_machine, | 86 | .init_machine = simone_init_machine, |
| 87 | .restart = ep93xx_restart, | ||
| 87 | MACHINE_END | 88 | MACHINE_END |
diff --git a/arch/arm/mach-ep93xx/snappercl15.c b/arch/arm/mach-ep93xx/snappercl15.c index ec7c63ff01e..fd846331ddf 100644 --- a/arch/arm/mach-ep93xx/snappercl15.c +++ b/arch/arm/mach-ep93xx/snappercl15.c | |||
| @@ -181,4 +181,5 @@ MACHINE_START(SNAPPER_CL15, "Bluewater Systems Snapper CL15") | |||
| 181 | .handle_irq = vic_handle_irq, | 181 | .handle_irq = vic_handle_irq, |
| 182 | .timer = &ep93xx_timer, | 182 | .timer = &ep93xx_timer, |
| 183 | .init_machine = snappercl15_init_machine, | 183 | .init_machine = snappercl15_init_machine, |
| 184 | .restart = ep93xx_restart, | ||
| 184 | MACHINE_END | 185 | MACHINE_END |
diff --git a/arch/arm/mach-ep93xx/ts72xx.c b/arch/arm/mach-ep93xx/ts72xx.c index 760384e6407..79f8ecf07a1 100644 --- a/arch/arm/mach-ep93xx/ts72xx.c +++ b/arch/arm/mach-ep93xx/ts72xx.c | |||
| @@ -251,4 +251,5 @@ MACHINE_START(TS72XX, "Technologic Systems TS-72xx SBC") | |||
| 251 | .handle_irq = vic_handle_irq, | 251 | .handle_irq = vic_handle_irq, |
| 252 | .timer = &ep93xx_timer, | 252 | .timer = &ep93xx_timer, |
| 253 | .init_machine = ts72xx_init_machine, | 253 | .init_machine = ts72xx_init_machine, |
| 254 | .restart = ep93xx_restart, | ||
| 254 | MACHINE_END | 255 | MACHINE_END |
diff --git a/arch/arm/mach-ep93xx/vision_ep9307.c b/arch/arm/mach-ep93xx/vision_ep9307.c index d96e4dbec6a..03dd4012043 100644 --- a/arch/arm/mach-ep93xx/vision_ep9307.c +++ b/arch/arm/mach-ep93xx/vision_ep9307.c | |||
| @@ -361,4 +361,5 @@ MACHINE_START(VISION_EP9307, "Vision Engraving Systems EP9307") | |||
| 361 | .init_irq = ep93xx_init_irq, | 361 | .init_irq = ep93xx_init_irq, |
| 362 | .timer = &ep93xx_timer, | 362 | .timer = &ep93xx_timer, |
| 363 | .init_machine = vision_init_machine, | 363 | .init_machine = vision_init_machine, |
| 364 | .restart = ep93xx_restart, | ||
| 364 | MACHINE_END | 365 | MACHINE_END |
diff --git a/arch/arm/mach-exynos/Makefile b/arch/arm/mach-exynos/Makefile index 59069a35e40..bcb9efc576e 100644 --- a/arch/arm/mach-exynos/Makefile +++ b/arch/arm/mach-exynos/Makefile | |||
| @@ -10,15 +10,17 @@ obj-m := | |||
| 10 | obj-n := | 10 | obj-n := |
| 11 | obj- := | 11 | obj- := |
| 12 | 12 | ||
| 13 | # Core support for EXYNOS4 system | 13 | # Core |
| 14 | 14 | ||
| 15 | obj-$(CONFIG_ARCH_EXYNOS4) += cpu.o init.o clock.o irq-combiner.o setup-i2c0.o | 15 | obj-$(CONFIG_ARCH_EXYNOS4) += common.o clock.o |
| 16 | obj-$(CONFIG_ARCH_EXYNOS4) += irq-eint.o dma.o pmu.o | ||
| 17 | obj-$(CONFIG_CPU_EXYNOS4210) += clock-exynos4210.o | 16 | obj-$(CONFIG_CPU_EXYNOS4210) += clock-exynos4210.o |
| 18 | obj-$(CONFIG_SOC_EXYNOS4212) += clock-exynos4212.o | 17 | obj-$(CONFIG_SOC_EXYNOS4212) += clock-exynos4212.o |
| 18 | |||
| 19 | obj-$(CONFIG_PM) += pm.o | 19 | obj-$(CONFIG_PM) += pm.o |
| 20 | obj-$(CONFIG_CPU_IDLE) += cpuidle.o | 20 | obj-$(CONFIG_CPU_IDLE) += cpuidle.o |
| 21 | 21 | ||
| 22 | obj-$(CONFIG_ARCH_EXYNOS4) += dma.o pmu.o | ||
| 23 | |||
| 22 | obj-$(CONFIG_SMP) += platsmp.o headsmp.o | 24 | obj-$(CONFIG_SMP) += platsmp.o headsmp.o |
| 23 | 25 | ||
| 24 | obj-$(CONFIG_EXYNOS4_MCT) += mct.o | 26 | obj-$(CONFIG_EXYNOS4_MCT) += mct.o |
| @@ -45,6 +47,7 @@ obj-$(CONFIG_EXYNOS4_DEV_PD) += dev-pd.o | |||
| 45 | obj-$(CONFIG_EXYNOS4_DEV_SYSMMU) += dev-sysmmu.o | 47 | obj-$(CONFIG_EXYNOS4_DEV_SYSMMU) += dev-sysmmu.o |
| 46 | obj-$(CONFIG_EXYNOS4_DEV_DWMCI) += dev-dwmci.o | 48 | obj-$(CONFIG_EXYNOS4_DEV_DWMCI) += dev-dwmci.o |
| 47 | 49 | ||
| 50 | obj-$(CONFIG_ARCH_EXYNOS4) += setup-i2c0.o | ||
| 48 | obj-$(CONFIG_EXYNOS4_SETUP_FIMC) += setup-fimc.o | 51 | obj-$(CONFIG_EXYNOS4_SETUP_FIMC) += setup-fimc.o |
| 49 | obj-$(CONFIG_EXYNOS4_SETUP_FIMD0) += setup-fimd0.o | 52 | obj-$(CONFIG_EXYNOS4_SETUP_FIMD0) += setup-fimd0.o |
| 50 | obj-$(CONFIG_EXYNOS4_SETUP_I2C1) += setup-i2c1.o | 53 | obj-$(CONFIG_EXYNOS4_SETUP_I2C1) += setup-i2c1.o |
diff --git a/arch/arm/mach-exynos/clock-exynos4210.c b/arch/arm/mach-exynos/clock-exynos4210.c index b9d5ef670eb..a5823a7f249 100644 --- a/arch/arm/mach-exynos/clock-exynos4210.c +++ b/arch/arm/mach-exynos/clock-exynos4210.c | |||
| @@ -23,7 +23,6 @@ | |||
| 23 | #include <plat/pll.h> | 23 | #include <plat/pll.h> |
| 24 | #include <plat/s5p-clock.h> | 24 | #include <plat/s5p-clock.h> |
| 25 | #include <plat/clock-clksrc.h> | 25 | #include <plat/clock-clksrc.h> |
| 26 | #include <plat/exynos4.h> | ||
| 27 | #include <plat/pm.h> | 26 | #include <plat/pm.h> |
| 28 | 27 | ||
| 29 | #include <mach/hardware.h> | 28 | #include <mach/hardware.h> |
| @@ -31,6 +30,8 @@ | |||
| 31 | #include <mach/regs-clock.h> | 30 | #include <mach/regs-clock.h> |
| 32 | #include <mach/exynos4-clock.h> | 31 | #include <mach/exynos4-clock.h> |
| 33 | 32 | ||
| 33 | #include "common.h" | ||
| 34 | |||
| 34 | static struct sleep_save exynos4210_clock_save[] = { | 35 | static struct sleep_save exynos4210_clock_save[] = { |
| 35 | SAVE_ITEM(S5P_CLKSRC_IMAGE), | 36 | SAVE_ITEM(S5P_CLKSRC_IMAGE), |
| 36 | SAVE_ITEM(S5P_CLKSRC_LCD1), | 37 | SAVE_ITEM(S5P_CLKSRC_LCD1), |
diff --git a/arch/arm/mach-exynos/clock-exynos4212.c b/arch/arm/mach-exynos/clock-exynos4212.c index 77d5decb34f..26a668b0d10 100644 --- a/arch/arm/mach-exynos/clock-exynos4212.c +++ b/arch/arm/mach-exynos/clock-exynos4212.c | |||
| @@ -23,7 +23,6 @@ | |||
| 23 | #include <plat/pll.h> | 23 | #include <plat/pll.h> |
| 24 | #include <plat/s5p-clock.h> | 24 | #include <plat/s5p-clock.h> |
| 25 | #include <plat/clock-clksrc.h> | 25 | #include <plat/clock-clksrc.h> |
| 26 | #include <plat/exynos4.h> | ||
| 27 | #include <plat/pm.h> | 26 | #include <plat/pm.h> |
| 28 | 27 | ||
| 29 | #include <mach/hardware.h> | 28 | #include <mach/hardware.h> |
| @@ -31,6 +30,8 @@ | |||
| 31 | #include <mach/regs-clock.h> | 30 | #include <mach/regs-clock.h> |
| 32 | #include <mach/exynos4-clock.h> | 31 | #include <mach/exynos4-clock.h> |
| 33 | 32 | ||
| 33 | #include "common.h" | ||
| 34 | |||
| 34 | static struct sleep_save exynos4212_clock_save[] = { | 35 | static struct sleep_save exynos4212_clock_save[] = { |
| 35 | SAVE_ITEM(S5P_CLKSRC_IMAGE), | 36 | SAVE_ITEM(S5P_CLKSRC_IMAGE), |
| 36 | SAVE_ITEM(S5P_CLKDIV_IMAGE), | 37 | SAVE_ITEM(S5P_CLKDIV_IMAGE), |
diff --git a/arch/arm/mach-exynos/clock.c b/arch/arm/mach-exynos/clock.c index 2894f0adef5..83616a039b1 100644 --- a/arch/arm/mach-exynos/clock.c +++ b/arch/arm/mach-exynos/clock.c | |||
| @@ -21,7 +21,6 @@ | |||
| 21 | #include <plat/pll.h> | 21 | #include <plat/pll.h> |
| 22 | #include <plat/s5p-clock.h> | 22 | #include <plat/s5p-clock.h> |
| 23 | #include <plat/clock-clksrc.h> | 23 | #include <plat/clock-clksrc.h> |
| 24 | #include <plat/exynos4.h> | ||
| 25 | #include <plat/pm.h> | 24 | #include <plat/pm.h> |
| 26 | 25 | ||
| 27 | #include <mach/map.h> | 26 | #include <mach/map.h> |
| @@ -29,6 +28,8 @@ | |||
| 29 | #include <mach/sysmmu.h> | 28 | #include <mach/sysmmu.h> |
| 30 | #include <mach/exynos4-clock.h> | 29 | #include <mach/exynos4-clock.h> |
| 31 | 30 | ||
| 31 | #include "common.h" | ||
| 32 | |||
| 32 | static struct sleep_save exynos4_clock_save[] = { | 33 | static struct sleep_save exynos4_clock_save[] = { |
| 33 | SAVE_ITEM(S5P_CLKDIV_LEFTBUS), | 34 | SAVE_ITEM(S5P_CLKDIV_LEFTBUS), |
| 34 | SAVE_ITEM(S5P_CLKGATE_IP_LEFTBUS), | 35 | SAVE_ITEM(S5P_CLKGATE_IP_LEFTBUS), |
diff --git a/arch/arm/mach-exynos/common.c b/arch/arm/mach-exynos/common.c new file mode 100644 index 00000000000..5de4214fa78 --- /dev/null +++ b/arch/arm/mach-exynos/common.c | |||
| @@ -0,0 +1,704 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. | ||
| 3 | * http://www.samsung.com | ||
| 4 | * | ||
| 5 | * Common Codes for EXYNOS | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #include <linux/kernel.h> | ||
| 13 | #include <linux/interrupt.h> | ||
| 14 | #include <linux/irq.h> | ||
| 15 | #include <linux/io.h> | ||
| 16 | #include <linux/sysdev.h> | ||
| 17 | #include <linux/gpio.h> | ||
| 18 | #include <linux/sched.h> | ||
| 19 | #include <linux/serial_core.h> | ||
| 20 | |||
| 21 | #include <asm/proc-fns.h> | ||
| 22 | #include <asm/exception.h> | ||
| 23 | #include <asm/hardware/cache-l2x0.h> | ||
| 24 | #include <asm/hardware/gic.h> | ||
| 25 | #include <asm/mach/map.h> | ||
| 26 | #include <asm/mach/irq.h> | ||
| 27 | |||
| 28 | #include <mach/regs-irq.h> | ||
| 29 | #include <mach/regs-pmu.h> | ||
| 30 | #include <mach/regs-gpio.h> | ||
| 31 | |||
| 32 | #include <plat/cpu.h> | ||
| 33 | #include <plat/clock.h> | ||
| 34 | #include <plat/devs.h> | ||
| 35 | #include <plat/pm.h> | ||
| 36 | #include <plat/sdhci.h> | ||
| 37 | #include <plat/gpio-cfg.h> | ||
| 38 | #include <plat/adc-core.h> | ||
| 39 | #include <plat/fb-core.h> | ||
| 40 | #include <plat/fimc-core.h> | ||
| 41 | #include <plat/iic-core.h> | ||
| 42 | #include <plat/tv-core.h> | ||
| 43 | #include <plat/regs-serial.h> | ||
| 44 | |||
| 45 | #include "common.h" | ||
| 46 | |||
| 47 | static const char name_exynos4210[] = "EXYNOS4210"; | ||
| 48 | static const char name_exynos4212[] = "EXYNOS4212"; | ||
| 49 | static const char name_exynos4412[] = "EXYNOS4412"; | ||
| 50 | |||
| 51 | static struct cpu_table cpu_ids[] __initdata = { | ||
| 52 | { | ||
| 53 | .idcode = EXYNOS4210_CPU_ID, | ||
| 54 | .idmask = EXYNOS4_CPU_MASK, | ||
| 55 | .map_io = exynos4_map_io, | ||
| 56 | .init_clocks = exynos4_init_clocks, | ||
| 57 | .init_uarts = exynos4_init_uarts, | ||
| 58 | .init = exynos_init, | ||
| 59 | .name = name_exynos4210, | ||
| 60 | }, { | ||
| 61 | .idcode = EXYNOS4212_CPU_ID, | ||
| 62 | .idmask = EXYNOS4_CPU_MASK, | ||
| 63 | .map_io = exynos4_map_io, | ||
| 64 | .init_clocks = exynos4_init_clocks, | ||
| 65 | .init_uarts = exynos4_init_uarts, | ||
| 66 | .init = exynos_init, | ||
| 67 | .name = name_exynos4212, | ||
| 68 | }, { | ||
| 69 | .idcode = EXYNOS4412_CPU_ID, | ||
| 70 | .idmask = EXYNOS4_CPU_MASK, | ||
| 71 | .map_io = exynos4_map_io, | ||
| 72 | .init_clocks = exynos4_init_clocks, | ||
| 73 | .init_uarts = exynos4_init_uarts, | ||
| 74 | .init = exynos_init, | ||
| 75 | .name = name_exynos4412, | ||
| 76 | }, | ||
| 77 | }; | ||
| 78 | |||
| 79 | /* Initial IO mappings */ | ||
| 80 | |||
| 81 | static struct map_desc exynos_iodesc[] __initdata = { | ||
| 82 | { | ||
| 83 | .virtual = (unsigned long)S5P_VA_CHIPID, | ||
| 84 | .pfn = __phys_to_pfn(EXYNOS4_PA_CHIPID), | ||
| 85 | .length = SZ_4K, | ||
| 86 | .type = MT_DEVICE, | ||
| 87 | }, { | ||
| 88 | .virtual = (unsigned long)S3C_VA_SYS, | ||
| 89 | .pfn = __phys_to_pfn(EXYNOS4_PA_SYSCON), | ||
| 90 | .length = SZ_64K, | ||
| 91 | .type = MT_DEVICE, | ||
| 92 | }, { | ||
| 93 | .virtual = (unsigned long)S3C_VA_TIMER, | ||
| 94 | .pfn = __phys_to_pfn(EXYNOS4_PA_TIMER), | ||
| 95 | .length = SZ_16K, | ||
| 96 | .type = MT_DEVICE, | ||
| 97 | }, { | ||
| 98 | .virtual = (unsigned long)S3C_VA_WATCHDOG, | ||
| 99 | .pfn = __phys_to_pfn(EXYNOS4_PA_WATCHDOG), | ||
| 100 | .length = SZ_4K, | ||
| 101 | .type = MT_DEVICE, | ||
| 102 | }, { | ||
| 103 | .virtual = (unsigned long)S5P_VA_SROMC, | ||
| 104 | .pfn = __phys_to_pfn(EXYNOS4_PA_SROMC), | ||
| 105 | .length = SZ_4K, | ||
| 106 | .type = MT_DEVICE, | ||
| 107 | }, { | ||
| 108 | .virtual = (unsigned long)S5P_VA_SYSTIMER, | ||
| 109 | .pfn = __phys_to_pfn(EXYNOS4_PA_SYSTIMER), | ||
| 110 | .length = SZ_4K, | ||
| 111 | .type = MT_DEVICE, | ||
| 112 | }, { | ||
| 113 | .virtual = (unsigned long)S5P_VA_PMU, | ||
| 114 | .pfn = __phys_to_pfn(EXYNOS4_PA_PMU), | ||
| 115 | .length = SZ_64K, | ||
| 116 | .type = MT_DEVICE, | ||
| 117 | }, { | ||
| 118 | .virtual = (unsigned long)S5P_VA_COMBINER_BASE, | ||
| 119 | .pfn = __phys_to_pfn(EXYNOS4_PA_COMBINER), | ||
| 120 | .length = SZ_4K, | ||
| 121 | .type = MT_DEVICE, | ||
| 122 | }, { | ||
| 123 | .virtual = (unsigned long)S5P_VA_GIC_CPU, | ||
| 124 | .pfn = __phys_to_pfn(EXYNOS4_PA_GIC_CPU), | ||
| 125 | .length = SZ_64K, | ||
| 126 | .type = MT_DEVICE, | ||
| 127 | }, { | ||
| 128 | .virtual = (unsigned long)S5P_VA_GIC_DIST, | ||
| 129 | .pfn = __phys_to_pfn(EXYNOS4_PA_GIC_DIST), | ||
| 130 | .length = SZ_64K, | ||
| 131 | .type = MT_DEVICE, | ||
| 132 | }, { | ||
| 133 | .virtual = (unsigned long)S3C_VA_UART, | ||
| 134 | .pfn = __phys_to_pfn(EXYNOS4_PA_UART), | ||
| 135 | .length = SZ_512K, | ||
| 136 | .type = MT_DEVICE, | ||
| 137 | }, | ||
| 138 | }; | ||
| 139 | |||
| 140 | static struct map_desc exynos4_iodesc[] __initdata = { | ||
| 141 | { | ||
| 142 | .virtual = (unsigned long)S5P_VA_CMU, | ||
| 143 | .pfn = __phys_to_pfn(EXYNOS4_PA_CMU), | ||
| 144 | .length = SZ_128K, | ||
| 145 | .type = MT_DEVICE, | ||
| 146 | }, { | ||
| 147 | .virtual = (unsigned long)S5P_VA_COREPERI_BASE, | ||
| 148 | .pfn = __phys_to_pfn(EXYNOS4_PA_COREPERI), | ||
| 149 | .length = SZ_8K, | ||
| 150 | .type = MT_DEVICE, | ||
| 151 | }, { | ||
| 152 | .virtual = (unsigned long)S5P_VA_L2CC, | ||
| 153 | .pfn = __phys_to_pfn(EXYNOS4_PA_L2CC), | ||
| 154 | .length = SZ_4K, | ||
| 155 | .type = MT_DEVICE, | ||
| 156 | }, { | ||
| 157 | .virtual = (unsigned long)S5P_VA_GPIO1, | ||
| 158 | .pfn = __phys_to_pfn(EXYNOS4_PA_GPIO1), | ||
| 159 | .length = SZ_4K, | ||
| 160 | .type = MT_DEVICE, | ||
| 161 | }, { | ||
| 162 | .virtual = (unsigned long)S5P_VA_GPIO2, | ||
| 163 | .pfn = __phys_to_pfn(EXYNOS4_PA_GPIO2), | ||
| 164 | .length = SZ_4K, | ||
| 165 | .type = MT_DEVICE, | ||
| 166 | }, { | ||
| 167 | .virtual = (unsigned long)S5P_VA_GPIO3, | ||
| 168 | .pfn = __phys_to_pfn(EXYNOS4_PA_GPIO3), | ||
| 169 | .length = SZ_256, | ||
| 170 | .type = MT_DEVICE, | ||
| 171 | }, { | ||
| 172 | .virtual = (unsigned long)S5P_VA_DMC0, | ||
| 173 | .pfn = __phys_to_pfn(EXYNOS4_PA_DMC0), | ||
| 174 | .length = SZ_4K, | ||
| 175 | .type = MT_DEVICE, | ||
| 176 | }, { | ||
| 177 | .virtual = (unsigned long)S5P_VA_SROMC, | ||
| 178 | .pfn = __phys_to_pfn(EXYNOS4_PA_SROMC), | ||
| 179 | .length = SZ_4K, | ||
| 180 | .type = MT_DEVICE, | ||
| 181 | }, { | ||
| 182 | .virtual = (unsigned long)S3C_VA_USB_HSPHY, | ||
| 183 | .pfn = __phys_to_pfn(EXYNOS4_PA_HSPHY), | ||
| 184 | .length = SZ_4K, | ||
| 185 | .type = MT_DEVICE, | ||
| 186 | }, | ||
| 187 | }; | ||
| 188 | |||
| 189 | static struct map_desc exynos4_iodesc0[] __initdata = { | ||
| 190 | { | ||
| 191 | .virtual = (unsigned long)S5P_VA_SYSRAM, | ||
| 192 | .pfn = __phys_to_pfn(EXYNOS4_PA_SYSRAM0), | ||
| 193 | .length = SZ_4K, | ||
| 194 | .type = MT_DEVICE, | ||
| 195 | }, | ||
| 196 | }; | ||
| 197 | |||
| 198 | static struct map_desc exynos4_iodesc1[] __initdata = { | ||
| 199 | { | ||
| 200 | .virtual = (unsigned long)S5P_VA_SYSRAM, | ||
| 201 | .pfn = __phys_to_pfn(EXYNOS4_PA_SYSRAM1), | ||
| 202 | .length = SZ_4K, | ||
| 203 | .type = MT_DEVICE, | ||
| 204 | }, | ||
| 205 | }; | ||
| 206 | |||
| 207 | static void exynos_idle(void) | ||
| 208 | { | ||
| 209 | if (!need_resched()) | ||
| 210 | cpu_do_idle(); | ||
| 211 | |||
| 212 | local_irq_enable(); | ||
| 213 | } | ||
| 214 | |||
| 215 | void exynos4_restart(char mode, const char *cmd) | ||
| 216 | { | ||
| 217 | __raw_writel(0x1, S5P_SWRESET); | ||
| 218 | } | ||
| 219 | |||
| 220 | /* | ||
| 221 | * exynos_map_io | ||
| 222 | * | ||
| 223 | * register the standard cpu IO areas | ||
| 224 | */ | ||
| 225 | |||
| 226 | void __init exynos_init_io(struct map_desc *mach_desc, int size) | ||
| 227 | { | ||
| 228 | /* initialize the io descriptors we need for initialization */ | ||
| 229 | iotable_init(exynos_iodesc, ARRAY_SIZE(exynos_iodesc)); | ||
| 230 | if (mach_desc) | ||
| 231 | iotable_init(mach_desc, size); | ||
| 232 | |||
| 233 | /* detect cpu id and rev. */ | ||
| 234 | s5p_init_cpu(S5P_VA_CHIPID); | ||
| 235 | |||
| 236 | s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids)); | ||
| 237 | } | ||
| 238 | |||
| 239 | void __init exynos4_map_io(void) | ||
| 240 | { | ||
| 241 | iotable_init(exynos4_iodesc, ARRAY_SIZE(exynos4_iodesc)); | ||
| 242 | |||
| 243 | if (soc_is_exynos4210() && samsung_rev() == EXYNOS4210_REV_0) | ||
| 244 | iotable_init(exynos4_iodesc0, ARRAY_SIZE(exynos4_iodesc0)); | ||
| 245 | else | ||
| 246 | iotable_init(exynos4_iodesc1, ARRAY_SIZE(exynos4_iodesc1)); | ||
| 247 | |||
| 248 | /* initialize device information early */ | ||
| 249 | exynos4_default_sdhci0(); | ||
| 250 | exynos4_default_sdhci1(); | ||
| 251 | exynos4_default_sdhci2(); | ||
| 252 | exynos4_default_sdhci3(); | ||
| 253 | |||
| 254 | s3c_adc_setname("samsung-adc-v3"); | ||
| 255 | |||
| 256 | s3c_fimc_setname(0, "exynos4-fimc"); | ||
| 257 | s3c_fimc_setname(1, "exynos4-fimc"); | ||
| 258 | s3c_fimc_setname(2, "exynos4-fimc"); | ||
| 259 | s3c_fimc_setname(3, "exynos4-fimc"); | ||
| 260 | |||
| 261 | /* The I2C bus controllers are directly compatible with s3c2440 */ | ||
| 262 | s3c_i2c0_setname("s3c2440-i2c"); | ||
| 263 | s3c_i2c1_setname("s3c2440-i2c"); | ||
| 264 | s3c_i2c2_setname("s3c2440-i2c"); | ||
| 265 | |||
| 266 | s5p_fb_setname(0, "exynos4-fb"); | ||
| 267 | s5p_hdmi_setname("exynos4-hdmi"); | ||
| 268 | } | ||
| 269 | |||
| 270 | void __init exynos4_init_clocks(int xtal) | ||
| 271 | { | ||
| 272 | printk(KERN_DEBUG "%s: initializing clocks\n", __func__); | ||
| 273 | |||
| 274 | s3c24xx_register_baseclocks(xtal); | ||
| 275 | s5p_register_clocks(xtal); | ||
| 276 | |||
| 277 | if (soc_is_exynos4210()) | ||
| 278 | exynos4210_register_clocks(); | ||
| 279 | else if (soc_is_exynos4212() || soc_is_exynos4412()) | ||
| 280 | exynos4212_register_clocks(); | ||
| 281 | |||
| 282 | exynos4_register_clocks(); | ||
| 283 | exynos4_setup_clocks(); | ||
| 284 | } | ||
| 285 | |||
| 286 | #define COMBINER_ENABLE_SET 0x0 | ||
| 287 | #define COMBINER_ENABLE_CLEAR 0x4 | ||
| 288 | #define COMBINER_INT_STATUS 0xC | ||
| 289 | |||
| 290 | static DEFINE_SPINLOCK(irq_controller_lock); | ||
| 291 | |||
| 292 | struct combiner_chip_data { | ||
| 293 | unsigned int irq_offset; | ||
| 294 | unsigned int irq_mask; | ||
| 295 | void __iomem *base; | ||
| 296 | }; | ||
| 297 | |||
| 298 | static struct combiner_chip_data combiner_data[MAX_COMBINER_NR]; | ||
| 299 | |||
| 300 | static inline void __iomem *combiner_base(struct irq_data *data) | ||
| 301 | { | ||
| 302 | struct combiner_chip_data *combiner_data = | ||
| 303 | irq_data_get_irq_chip_data(data); | ||
| 304 | |||
| 305 | return combiner_data->base; | ||
| 306 | } | ||
| 307 | |||
| 308 | static void combiner_mask_irq(struct irq_data *data) | ||
| 309 | { | ||
| 310 | u32 mask = 1 << (data->irq % 32); | ||
| 311 | |||
| 312 | __raw_writel(mask, combiner_base(data) + COMBINER_ENABLE_CLEAR); | ||
| 313 | } | ||
| 314 | |||
| 315 | static void combiner_unmask_irq(struct irq_data *data) | ||
| 316 | { | ||
| 317 | u32 mask = 1 << (data->irq % 32); | ||
| 318 | |||
| 319 | __raw_writel(mask, combiner_base(data) + COMBINER_ENABLE_SET); | ||
| 320 | } | ||
| 321 | |||
| 322 | static void combiner_handle_cascade_irq(unsigned int irq, struct irq_desc *desc) | ||
| 323 | { | ||
| 324 | struct combiner_chip_data *chip_data = irq_get_handler_data(irq); | ||
| 325 | struct irq_chip *chip = irq_get_chip(irq); | ||
| 326 | unsigned int cascade_irq, combiner_irq; | ||
| 327 | unsigned long status; | ||
| 328 | |||
| 329 | chained_irq_enter(chip, desc); | ||
| 330 | |||
| 331 | spin_lock(&irq_controller_lock); | ||
| 332 | status = __raw_readl(chip_data->base + COMBINER_INT_STATUS); | ||
| 333 | spin_unlock(&irq_controller_lock); | ||
| 334 | status &= chip_data->irq_mask; | ||
| 335 | |||
| 336 | if (status == 0) | ||
| 337 | goto out; | ||
| 338 | |||
| 339 | combiner_irq = __ffs(status); | ||
| 340 | |||
| 341 | cascade_irq = combiner_irq + (chip_data->irq_offset & ~31); | ||
| 342 | if (unlikely(cascade_irq >= NR_IRQS)) | ||
| 343 | do_bad_IRQ(cascade_irq, desc); | ||
| 344 | else | ||
| 345 | generic_handle_irq(cascade_irq); | ||
| 346 | |||
| 347 | out: | ||
| 348 | chained_irq_exit(chip, desc); | ||
| 349 | } | ||
| 350 | |||
| 351 | static struct irq_chip combiner_chip = { | ||
| 352 | .name = "COMBINER", | ||
| 353 | .irq_mask = combiner_mask_irq, | ||
| 354 | .irq_unmask = combiner_unmask_irq, | ||
| 355 | }; | ||
| 356 | |||
| 357 | static void __init combiner_cascade_irq(unsigned int combiner_nr, unsigned int irq) | ||
| 358 | { | ||
| 359 | if (combiner_nr >= MAX_COMBINER_NR) | ||
| 360 | BUG(); | ||
| 361 | if (irq_set_handler_data(irq, &combiner_data[combiner_nr]) != 0) | ||
| 362 | BUG(); | ||
| 363 | irq_set_chained_handler(irq, combiner_handle_cascade_irq); | ||
| 364 | } | ||
| 365 | |||
| 366 | static void __init combiner_init(unsigned int combiner_nr, void __iomem *base, | ||
| 367 | unsigned int irq_start) | ||
| 368 | { | ||
| 369 | unsigned int i; | ||
| 370 | |||
| 371 | if (combiner_nr >= MAX_COMBINER_NR) | ||
| 372 | BUG(); | ||
| 373 | |||
| 374 | combiner_data[combiner_nr].base = base; | ||
| 375 | combiner_data[combiner_nr].irq_offset = irq_start; | ||
| 376 | combiner_data[combiner_nr].irq_mask = 0xff << ((combiner_nr % 4) << 3); | ||
| 377 | |||
| 378 | /* Disable all interrupts */ | ||
| 379 | |||
| 380 | __raw_writel(combiner_data[combiner_nr].irq_mask, | ||
| 381 | base + COMBINER_ENABLE_CLEAR); | ||
| 382 | |||
| 383 | /* Setup the Linux IRQ subsystem */ | ||
| 384 | |||
| 385 | for (i = irq_start; i < combiner_data[combiner_nr].irq_offset | ||
| 386 | + MAX_IRQ_IN_COMBINER; i++) { | ||
| 387 | irq_set_chip_and_handler(i, &combiner_chip, handle_level_irq); | ||
| 388 | irq_set_chip_data(i, &combiner_data[combiner_nr]); | ||
| 389 | set_irq_flags(i, IRQF_VALID | IRQF_PROBE); | ||
| 390 | } | ||
| 391 | } | ||
| 392 | |||
| 393 | void __init exynos4_init_irq(void) | ||
| 394 | { | ||
| 395 | int irq; | ||
| 396 | unsigned int gic_bank_offset; | ||
| 397 | |||
| 398 | gic_bank_offset = soc_is_exynos4412() ? 0x4000 : 0x8000; | ||
| 399 | |||
| 400 | gic_init_bases(0, IRQ_PPI(0), S5P_VA_GIC_DIST, S5P_VA_GIC_CPU, gic_bank_offset); | ||
| 401 | |||
| 402 | for (irq = 0; irq < MAX_COMBINER_NR; irq++) { | ||
| 403 | |||
| 404 | combiner_init(irq, (void __iomem *)S5P_VA_COMBINER(irq), | ||
| 405 | COMBINER_IRQ(irq, 0)); | ||
| 406 | combiner_cascade_irq(irq, IRQ_SPI(irq)); | ||
| 407 | } | ||
| 408 | |||
| 409 | /* | ||
| 410 | * The parameters of s5p_init_irq() are for VIC init. | ||
| 411 | * Theses parameters should be NULL and 0 because EXYNOS4 | ||
| 412 | * uses GIC instead of VIC. | ||
| 413 | */ | ||
| 414 | s5p_init_irq(NULL, 0); | ||
| 415 | } | ||
| 416 | |||
| 417 | struct sysdev_class exynos4_sysclass = { | ||
| 418 | .name = "exynos4-core", | ||
| 419 | }; | ||
| 420 | |||
| 421 | static struct sys_device exynos4_sysdev = { | ||
| 422 | .cls = &exynos4_sysclass, | ||
| 423 | }; | ||
| 424 | |||
| 425 | static int __init exynos4_core_init(void) | ||
| 426 | { | ||
| 427 | return sysdev_class_register(&exynos4_sysclass); | ||
| 428 | } | ||
| 429 | core_initcall(exynos4_core_init); | ||
| 430 | |||
| 431 | #ifdef CONFIG_CACHE_L2X0 | ||
| 432 | static int __init exynos4_l2x0_cache_init(void) | ||
| 433 | { | ||
| 434 | /* TAG, Data Latency Control: 2cycle */ | ||
| 435 | __raw_writel(0x110, S5P_VA_L2CC + L2X0_TAG_LATENCY_CTRL); | ||
| 436 | |||
| 437 | if (soc_is_exynos4210()) | ||
| 438 | __raw_writel(0x110, S5P_VA_L2CC + L2X0_DATA_LATENCY_CTRL); | ||
| 439 | else if (soc_is_exynos4212() || soc_is_exynos4412()) | ||
| 440 | __raw_writel(0x120, S5P_VA_L2CC + L2X0_DATA_LATENCY_CTRL); | ||
| 441 | |||
| 442 | /* L2X0 Prefetch Control */ | ||
| 443 | __raw_writel(0x30000007, S5P_VA_L2CC + L2X0_PREFETCH_CTRL); | ||
| 444 | |||
| 445 | /* L2X0 Power Control */ | ||
| 446 | __raw_writel(L2X0_DYNAMIC_CLK_GATING_EN | L2X0_STNDBY_MODE_EN, | ||
| 447 | S5P_VA_L2CC + L2X0_POWER_CTRL); | ||
| 448 | |||
| 449 | l2x0_init(S5P_VA_L2CC, 0x7C470001, 0xC200ffff); | ||
| 450 | |||
| 451 | return 0; | ||
| 452 | } | ||
| 453 | |||
| 454 | early_initcall(exynos4_l2x0_cache_init); | ||
| 455 | #endif | ||
| 456 | |||
| 457 | int __init exynos_init(void) | ||
| 458 | { | ||
| 459 | printk(KERN_INFO "EXYNOS: Initializing architecture\n"); | ||
| 460 | |||
| 461 | /* set idle function */ | ||
| 462 | pm_idle = exynos_idle; | ||
| 463 | |||
| 464 | return sysdev_register(&exynos4_sysdev); | ||
| 465 | } | ||
| 466 | |||
| 467 | static struct s3c24xx_uart_clksrc exynos4_serial_clocks[] = { | ||
| 468 | [0] = { | ||
| 469 | .name = "uclk1", | ||
| 470 | .divisor = 1, | ||
| 471 | .min_baud = 0, | ||
| 472 | .max_baud = 0, | ||
| 473 | }, | ||
| 474 | }; | ||
| 475 | |||
| 476 | /* uart registration process */ | ||
| 477 | |||
| 478 | void __init exynos4_init_uarts(struct s3c2410_uartcfg *cfg, int no) | ||
| 479 | { | ||
| 480 | struct s3c2410_uartcfg *tcfg = cfg; | ||
| 481 | u32 ucnt; | ||
| 482 | |||
| 483 | for (ucnt = 0; ucnt < no; ucnt++, tcfg++) { | ||
| 484 | if (!tcfg->clocks) { | ||
| 485 | tcfg->has_fracval = 1; | ||
| 486 | tcfg->clocks = exynos4_serial_clocks; | ||
| 487 | tcfg->clocks_size = ARRAY_SIZE(exynos4_serial_clocks); | ||
| 488 | } | ||
| 489 | tcfg->flags |= NO_NEED_CHECK_CLKSRC; | ||
| 490 | } | ||
| 491 | |||
| 492 | s3c24xx_init_uartdevs("s5pv210-uart", s5p_uart_resources, cfg, no); | ||
| 493 | } | ||
| 494 | |||
| 495 | static DEFINE_SPINLOCK(eint_lock); | ||
| 496 | |||
| 497 | static unsigned int eint0_15_data[16]; | ||
| 498 | |||
| 499 | static unsigned int exynos4_get_irq_nr(unsigned int number) | ||
| 500 | { | ||
| 501 | u32 ret = 0; | ||
| 502 | |||
| 503 | switch (number) { | ||
| 504 | case 0 ... 3: | ||
| 505 | ret = (number + IRQ_EINT0); | ||
| 506 | break; | ||
| 507 | case 4 ... 7: | ||
| 508 | ret = (number + (IRQ_EINT4 - 4)); | ||
| 509 | break; | ||
| 510 | case 8 ... 15: | ||
| 511 | ret = (number + (IRQ_EINT8 - 8)); | ||
| 512 | break; | ||
| 513 | default: | ||
| 514 | printk(KERN_ERR "number available : %d\n", number); | ||
| 515 | } | ||
| 516 | |||
| 517 | return ret; | ||
| 518 | } | ||
| 519 | |||
| 520 | static inline void exynos4_irq_eint_mask(struct irq_data *data) | ||
| 521 | { | ||
| 522 | u32 mask; | ||
| 523 | |||
| 524 | spin_lock(&eint_lock); | ||
| 525 | mask = __raw_readl(S5P_EINT_MASK(EINT_REG_NR(data->irq))); | ||
| 526 | mask |= eint_irq_to_bit(data->irq); | ||
| 527 | __raw_writel(mask, S5P_EINT_MASK(EINT_REG_NR(data->irq))); | ||
| 528 | spin_unlock(&eint_lock); | ||
| 529 | } | ||
| 530 | |||
| 531 | static void exynos4_irq_eint_unmask(struct irq_data *data) | ||
| 532 | { | ||
| 533 | u32 mask; | ||
| 534 | |||
| 535 | spin_lock(&eint_lock); | ||
| 536 | mask = __raw_readl(S5P_EINT_MASK(EINT_REG_NR(data->irq))); | ||
| 537 | mask &= ~(eint_irq_to_bit(data->irq)); | ||
| 538 | __raw_writel(mask, S5P_EINT_MASK(EINT_REG_NR(data->irq))); | ||
| 539 | spin_unlock(&eint_lock); | ||
| 540 | } | ||
| 541 | |||
| 542 | static inline void exynos4_irq_eint_ack(struct irq_data *data) | ||
| 543 | { | ||
| 544 | __raw_writel(eint_irq_to_bit(data->irq), | ||
| 545 | S5P_EINT_PEND(EINT_REG_NR(data->irq))); | ||
| 546 | } | ||
| 547 | |||
| 548 | static void exynos4_irq_eint_maskack(struct irq_data *data) | ||
| 549 | { | ||
| 550 | exynos4_irq_eint_mask(data); | ||
| 551 | exynos4_irq_eint_ack(data); | ||
| 552 | } | ||
| 553 | |||
| 554 | static int exynos4_irq_eint_set_type(struct irq_data *data, unsigned int type) | ||
| 555 | { | ||
| 556 | int offs = EINT_OFFSET(data->irq); | ||
| 557 | int shift; | ||
| 558 | u32 ctrl, mask; | ||
| 559 | u32 newvalue = 0; | ||
| 560 | |||
| 561 | switch (type) { | ||
| 562 | case IRQ_TYPE_EDGE_RISING: | ||
| 563 | newvalue = S5P_IRQ_TYPE_EDGE_RISING; | ||
| 564 | break; | ||
| 565 | |||
| 566 | case IRQ_TYPE_EDGE_FALLING: | ||
| 567 | newvalue = S5P_IRQ_TYPE_EDGE_FALLING; | ||
| 568 | break; | ||
| 569 | |||
| 570 | case IRQ_TYPE_EDGE_BOTH: | ||
| 571 | newvalue = S5P_IRQ_TYPE_EDGE_BOTH; | ||
| 572 | break; | ||
| 573 | |||
| 574 | case IRQ_TYPE_LEVEL_LOW: | ||
| 575 | newvalue = S5P_IRQ_TYPE_LEVEL_LOW; | ||
| 576 | break; | ||
| 577 | |||
| 578 | case IRQ_TYPE_LEVEL_HIGH: | ||
| 579 | newvalue = S5P_IRQ_TYPE_LEVEL_HIGH; | ||
| 580 | break; | ||
| 581 | |||
| 582 | default: | ||
| 583 | printk(KERN_ERR "No such irq type %d", type); | ||
| 584 | return -EINVAL; | ||
| 585 | } | ||
| 586 | |||
| 587 | shift = (offs & 0x7) * 4; | ||
| 588 | mask = 0x7 << shift; | ||
| 589 | |||
| 590 | spin_lock(&eint_lock); | ||
| 591 | ctrl = __raw_readl(S5P_EINT_CON(EINT_REG_NR(data->irq))); | ||
| 592 | ctrl &= ~mask; | ||
| 593 | ctrl |= newvalue << shift; | ||
| 594 | __raw_writel(ctrl, S5P_EINT_CON(EINT_REG_NR(data->irq))); | ||
| 595 | spin_unlock(&eint_lock); | ||
| 596 | |||
| 597 | switch (offs) { | ||
| 598 | case 0 ... 7: | ||
| 599 | s3c_gpio_cfgpin(EINT_GPIO_0(offs & 0x7), EINT_MODE); | ||
| 600 | break; | ||
| 601 | case 8 ... 15: | ||
| 602 | s3c_gpio_cfgpin(EINT_GPIO_1(offs & 0x7), EINT_MODE); | ||
| 603 | break; | ||
| 604 | case 16 ... 23: | ||
| 605 | s3c_gpio_cfgpin(EINT_GPIO_2(offs & 0x7), EINT_MODE); | ||
| 606 | break; | ||
| 607 | case 24 ... 31: | ||
| 608 | s3c_gpio_cfgpin(EINT_GPIO_3(offs & 0x7), EINT_MODE); | ||
| 609 | break; | ||
| 610 | default: | ||
| 611 | printk(KERN_ERR "No such irq number %d", offs); | ||
| 612 | } | ||
| 613 | |||
| 614 | return 0; | ||
| 615 | } | ||
| 616 | |||
| 617 | static struct irq_chip exynos4_irq_eint = { | ||
| 618 | .name = "exynos4-eint", | ||
| 619 | .irq_mask = exynos4_irq_eint_mask, | ||
| 620 | .irq_unmask = exynos4_irq_eint_unmask, | ||
| 621 | .irq_mask_ack = exynos4_irq_eint_maskack, | ||
| 622 | .irq_ack = exynos4_irq_eint_ack, | ||
| 623 | .irq_set_type = exynos4_irq_eint_set_type, | ||
| 624 | #ifdef CONFIG_PM | ||
| 625 | .irq_set_wake = s3c_irqext_wake, | ||
| 626 | #endif | ||
| 627 | }; | ||
| 628 | |||
| 629 | /* | ||
| 630 | * exynos4_irq_demux_eint | ||
| 631 | * | ||
| 632 | * This function demuxes the IRQ from from EINTs 16 to 31. | ||
| 633 | * It is designed to be inlined into the specific handler | ||
| 634 | * s5p_irq_demux_eintX_Y. | ||
| 635 | * | ||
| 636 | * Each EINT pend/mask registers handle eight of them. | ||
| 637 | */ | ||
| 638 | static inline void exynos4_irq_demux_eint(unsigned int start) | ||
| 639 | { | ||
| 640 | unsigned int irq; | ||
| 641 | |||
| 642 | u32 status = __raw_readl(S5P_EINT_PEND(EINT_REG_NR(start))); | ||
| 643 | u32 mask = __raw_readl(S5P_EINT_MASK(EINT_REG_NR(start))); | ||
| 644 | |||
| 645 | status &= ~mask; | ||
| 646 | status &= 0xff; | ||
| 647 | |||
| 648 | while (status) { | ||
| 649 | irq = fls(status) - 1; | ||
| 650 | generic_handle_irq(irq + start); | ||
| 651 | status &= ~(1 << irq); | ||
| 652 | } | ||
| 653 | } | ||
| 654 | |||
| 655 | static void exynos4_irq_demux_eint16_31(unsigned int irq, struct irq_desc *desc) | ||
| 656 | { | ||
| 657 | struct irq_chip *chip = irq_get_chip(irq); | ||
| 658 | chained_irq_enter(chip, desc); | ||
| 659 | exynos4_irq_demux_eint(IRQ_EINT(16)); | ||
| 660 | exynos4_irq_demux_eint(IRQ_EINT(24)); | ||
| 661 | chained_irq_exit(chip, desc); | ||
| 662 | } | ||
| 663 | |||
| 664 | static void exynos4_irq_eint0_15(unsigned int irq, struct irq_desc *desc) | ||
| 665 | { | ||
| 666 | u32 *irq_data = irq_get_handler_data(irq); | ||
| 667 | struct irq_chip *chip = irq_get_chip(irq); | ||
| 668 | |||
| 669 | chained_irq_enter(chip, desc); | ||
| 670 | chip->irq_mask(&desc->irq_data); | ||
| 671 | |||
| 672 | if (chip->irq_ack) | ||
| 673 | chip->irq_ack(&desc->irq_data); | ||
| 674 | |||
| 675 | generic_handle_irq(*irq_data); | ||
| 676 | |||
| 677 | chip->irq_unmask(&desc->irq_data); | ||
| 678 | chained_irq_exit(chip, desc); | ||
| 679 | } | ||
| 680 | |||
| 681 | int __init exynos4_init_irq_eint(void) | ||
| 682 | { | ||
| 683 | int irq; | ||
| 684 | |||
| 685 | for (irq = 0 ; irq <= 31 ; irq++) { | ||
| 686 | irq_set_chip_and_handler(IRQ_EINT(irq), &exynos4_irq_eint, | ||
| 687 | handle_level_irq); | ||
| 688 | set_irq_flags(IRQ_EINT(irq), IRQF_VALID); | ||
| 689 | } | ||
| 690 | |||
| 691 | irq_set_chained_handler(IRQ_EINT16_31, exynos4_irq_demux_eint16_31); | ||
| 692 | |||
| 693 | for (irq = 0 ; irq <= 15 ; irq++) { | ||
| 694 | eint0_15_data[irq] = IRQ_EINT(irq); | ||
| 695 | |||
| 696 | irq_set_handler_data(exynos4_get_irq_nr(irq), | ||
| 697 | &eint0_15_data[irq]); | ||
| 698 | irq_set_chained_handler(exynos4_get_irq_nr(irq), | ||
| 699 | exynos4_irq_eint0_15); | ||
| 700 | } | ||
| 701 | |||
| 702 | return 0; | ||
| 703 | } | ||
| 704 | arch_initcall(exynos4_init_irq_eint); | ||
diff --git a/arch/arm/mach-exynos/common.h b/arch/arm/mach-exynos/common.h new file mode 100644 index 00000000000..1ac49de0f39 --- /dev/null +++ b/arch/arm/mach-exynos/common.h | |||
| @@ -0,0 +1,41 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (c) 2011 Samsung Electronics Co., Ltd. | ||
| 3 | * http://www.samsung.com | ||
| 4 | * | ||
| 5 | * Common Header for EXYNOS machines | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef __ARCH_ARM_MACH_EXYNOS_COMMON_H | ||
| 13 | #define __ARCH_ARM_MACH_EXYNOS_COMMON_H | ||
| 14 | |||
| 15 | void exynos_init_io(struct map_desc *mach_desc, int size); | ||
| 16 | void exynos4_init_irq(void); | ||
| 17 | |||
| 18 | void exynos4_register_clocks(void); | ||
| 19 | void exynos4_setup_clocks(void); | ||
| 20 | |||
| 21 | void exynos4210_register_clocks(void); | ||
| 22 | void exynos4212_register_clocks(void); | ||
| 23 | |||
| 24 | void exynos4_restart(char mode, const char *cmd); | ||
| 25 | |||
| 26 | extern struct sys_timer exynos4_timer; | ||
| 27 | |||
| 28 | #ifdef CONFIG_ARCH_EXYNOS | ||
| 29 | extern int exynos_init(void); | ||
| 30 | extern void exynos4_map_io(void); | ||
| 31 | extern void exynos4_init_clocks(int xtal); | ||
| 32 | extern void exynos4_init_uarts(struct s3c2410_uartcfg *cfg, int no); | ||
| 33 | |||
| 34 | #else | ||
| 35 | #define exynos4_init_clocks NULL | ||
| 36 | #define exynos4_init_uarts NULL | ||
| 37 | #define exynos4_map_io NULL | ||
| 38 | #define exynos_init NULL | ||
| 39 | #endif | ||
| 40 | |||
| 41 | #endif /* __ARCH_ARM_MACH_EXYNOS_COMMON_H */ | ||
diff --git a/arch/arm/mach-exynos/cpu.c b/arch/arm/mach-exynos/cpu.c deleted file mode 100644 index 22316cb31a8..00000000000 --- a/arch/arm/mach-exynos/cpu.c +++ /dev/null | |||
| @@ -1,284 +0,0 @@ | |||
| 1 | /* linux/arch/arm/mach-exynos/cpu.c | ||
| 2 | * | ||
| 3 | * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. | ||
| 4 | * http://www.samsung.com | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License version 2 as | ||
| 8 | * published by the Free Software Foundation. | ||
| 9 | */ | ||
| 10 | |||
| 11 | #include <linux/sched.h> | ||
| 12 | #include <linux/sysdev.h> | ||
| 13 | |||
| 14 | #include <asm/mach/map.h> | ||
| 15 | #include <asm/mach/irq.h> | ||
| 16 | |||
| 17 | #include <asm/proc-fns.h> | ||
| 18 | #include <asm/exception.h> | ||
| 19 | #include <asm/hardware/cache-l2x0.h> | ||
| 20 | #include <asm/hardware/gic.h> | ||
| 21 | |||
| 22 | #include <plat/cpu.h> | ||
| 23 | #include <plat/clock.h> | ||
| 24 | #include <plat/devs.h> | ||
| 25 | #include <plat/exynos4.h> | ||
| 26 | #include <plat/adc-core.h> | ||
| 27 | #include <plat/sdhci.h> | ||
| 28 | #include <plat/fb-core.h> | ||
| 29 | #include <plat/fimc-core.h> | ||
| 30 | #include <plat/iic-core.h> | ||
| 31 | #include <plat/reset.h> | ||
| 32 | #include <plat/tv-core.h> | ||
| 33 | |||
| 34 | #include <mach/regs-irq.h> | ||
| 35 | #include <mach/regs-pmu.h> | ||
| 36 | |||
| 37 | extern int combiner_init(unsigned int combiner_nr, void __iomem *base, | ||
| 38 | unsigned int irq_start); | ||
| 39 | extern void combiner_cascade_irq(unsigned int combiner_nr, unsigned int irq); | ||
| 40 | |||
| 41 | /* Initial IO mappings */ | ||
| 42 | static struct map_desc exynos_iodesc[] __initdata = { | ||
| 43 | { | ||
| 44 | .virtual = (unsigned long)S5P_VA_SYSTIMER, | ||
| 45 | .pfn = __phys_to_pfn(EXYNOS_PA_SYSTIMER), | ||
| 46 | .length = SZ_4K, | ||
| 47 | .type = MT_DEVICE, | ||
| 48 | }, { | ||
| 49 | .virtual = (unsigned long)S5P_VA_PMU, | ||
| 50 | .pfn = __phys_to_pfn(EXYNOS_PA_PMU), | ||
| 51 | .length = SZ_64K, | ||
| 52 | .type = MT_DEVICE, | ||
| 53 | }, { | ||
| 54 | .virtual = (unsigned long)S5P_VA_COMBINER_BASE, | ||
| 55 | .pfn = __phys_to_pfn(EXYNOS_PA_COMBINER), | ||
| 56 | .length = SZ_4K, | ||
| 57 | .type = MT_DEVICE, | ||
| 58 | }, { | ||
| 59 | .virtual = (unsigned long)S5P_VA_GIC_CPU, | ||
| 60 | .pfn = __phys_to_pfn(EXYNOS_PA_GIC_CPU), | ||
| 61 | .length = SZ_64K, | ||
| 62 | .type = MT_DEVICE, | ||
| 63 | }, { | ||
| 64 | .virtual = (unsigned long)S5P_VA_GIC_DIST, | ||
| 65 | .pfn = __phys_to_pfn(EXYNOS_PA_GIC_DIST), | ||
| 66 | .length = SZ_64K, | ||
| 67 | .type = MT_DEVICE, | ||
| 68 | }, { | ||
| 69 | .virtual = (unsigned long)S3C_VA_UART, | ||
| 70 | .pfn = __phys_to_pfn(S3C_PA_UART), | ||
| 71 | .length = SZ_512K, | ||
| 72 | .type = MT_DEVICE, | ||
| 73 | }, | ||
| 74 | }; | ||
| 75 | |||
| 76 | static struct map_desc exynos4_iodesc[] __initdata = { | ||
| 77 | { | ||
| 78 | .virtual = (unsigned long)S5P_VA_CMU, | ||
| 79 | .pfn = __phys_to_pfn(EXYNOS4_PA_CMU), | ||
| 80 | .length = SZ_128K, | ||
| 81 | .type = MT_DEVICE, | ||
| 82 | }, { | ||
| 83 | .virtual = (unsigned long)S5P_VA_COREPERI_BASE, | ||
| 84 | .pfn = __phys_to_pfn(EXYNOS4_PA_COREPERI), | ||
| 85 | .length = SZ_8K, | ||
| 86 | .type = MT_DEVICE, | ||
| 87 | }, { | ||
| 88 | .virtual = (unsigned long)S5P_VA_L2CC, | ||
| 89 | .pfn = __phys_to_pfn(EXYNOS4_PA_L2CC), | ||
| 90 | .length = SZ_4K, | ||
| 91 | .type = MT_DEVICE, | ||
| 92 | }, { | ||
| 93 | .virtual = (unsigned long)S5P_VA_GPIO1, | ||
| 94 | .pfn = __phys_to_pfn(EXYNOS4_PA_GPIO1), | ||
| 95 | .length = SZ_4K, | ||
| 96 | .type = MT_DEVICE, | ||
| 97 | }, { | ||
| 98 | .virtual = (unsigned long)S5P_VA_GPIO2, | ||
| 99 | .pfn = __phys_to_pfn(EXYNOS4_PA_GPIO2), | ||
| 100 | .length = SZ_4K, | ||
| 101 | .type = MT_DEVICE, | ||
| 102 | }, { | ||
| 103 | .virtual = (unsigned long)S5P_VA_GPIO3, | ||
| 104 | .pfn = __phys_to_pfn(EXYNOS4_PA_GPIO3), | ||
| 105 | .length = SZ_256, | ||
| 106 | .type = MT_DEVICE, | ||
| 107 | }, { | ||
| 108 | .virtual = (unsigned long)S5P_VA_DMC0, | ||
| 109 | .pfn = __phys_to_pfn(EXYNOS4_PA_DMC0), | ||
| 110 | .length = SZ_4K, | ||
| 111 | .type = MT_DEVICE, | ||
| 112 | }, { | ||
| 113 | .virtual = (unsigned long)S5P_VA_SROMC, | ||
| 114 | .pfn = __phys_to_pfn(EXYNOS4_PA_SROMC), | ||
| 115 | .length = SZ_4K, | ||
| 116 | .type = MT_DEVICE, | ||
| 117 | }, { | ||
| 118 | .virtual = (unsigned long)S3C_VA_USB_HSPHY, | ||
| 119 | .pfn = __phys_to_pfn(EXYNOS4_PA_HSPHY), | ||
| 120 | .length = SZ_4K, | ||
| 121 | .type = MT_DEVICE, | ||
| 122 | }, | ||
| 123 | }; | ||
| 124 | |||
| 125 | static struct map_desc exynos4_iodesc0[] __initdata = { | ||
| 126 | { | ||
| 127 | .virtual = (unsigned long)S5P_VA_SYSRAM, | ||
| 128 | .pfn = __phys_to_pfn(EXYNOS4_PA_SYSRAM0), | ||
| 129 | .length = SZ_4K, | ||
| 130 | .type = MT_DEVICE, | ||
| 131 | }, | ||
| 132 | }; | ||
| 133 | |||
| 134 | static struct map_desc exynos4_iodesc1[] __initdata = { | ||
| 135 | { | ||
| 136 | .virtual = (unsigned long)S5P_VA_SYSRAM, | ||
| 137 | .pfn = __phys_to_pfn(EXYNOS4_PA_SYSRAM1), | ||
| 138 | .length = SZ_4K, | ||
| 139 | .type = MT_DEVICE, | ||
| 140 | }, | ||
| 141 | }; | ||
| 142 | |||
| 143 | static void exynos_idle(void) | ||
| 144 | { | ||
| 145 | if (!need_resched()) | ||
| 146 | cpu_do_idle(); | ||
| 147 | |||
| 148 | local_irq_enable(); | ||
| 149 | } | ||
| 150 | |||
| 151 | static void exynos4_sw_reset(void) | ||
| 152 | { | ||
| 153 | __raw_writel(0x1, S5P_SWRESET); | ||
| 154 | } | ||
| 155 | |||
| 156 | /* | ||
| 157 | * exynos_map_io | ||
| 158 | * | ||
| 159 | * register the standard cpu IO areas | ||
| 160 | */ | ||
| 161 | void __init exynos4_map_io(void) | ||
| 162 | { | ||
| 163 | iotable_init(exynos_iodesc, ARRAY_SIZE(exynos_iodesc)); | ||
| 164 | iotable_init(exynos4_iodesc, ARRAY_SIZE(exynos4_iodesc)); | ||
| 165 | |||
| 166 | if (soc_is_exynos4210() && samsung_rev() == EXYNOS4210_REV_0) | ||
| 167 | iotable_init(exynos4_iodesc0, ARRAY_SIZE(exynos4_iodesc0)); | ||
| 168 | else | ||
| 169 | iotable_init(exynos4_iodesc1, ARRAY_SIZE(exynos4_iodesc1)); | ||
| 170 | |||
| 171 | /* initialize device information early */ | ||
| 172 | exynos4_default_sdhci0(); | ||
| 173 | exynos4_default_sdhci1(); | ||
| 174 | exynos4_default_sdhci2(); | ||
| 175 | exynos4_default_sdhci3(); | ||
| 176 | |||
| 177 | s3c_adc_setname("samsung-adc-v3"); | ||
| 178 | |||
| 179 | s3c_fimc_setname(0, "exynos4-fimc"); | ||
| 180 | s3c_fimc_setname(1, "exynos4-fimc"); | ||
| 181 | s3c_fimc_setname(2, "exynos4-fimc"); | ||
| 182 | s3c_fimc_setname(3, "exynos4-fimc"); | ||
| 183 | |||
| 184 | /* The I2C bus controllers are directly compatible with s3c2440 */ | ||
| 185 | s3c_i2c0_setname("s3c2440-i2c"); | ||
| 186 | s3c_i2c1_setname("s3c2440-i2c"); | ||
| 187 | s3c_i2c2_setname("s3c2440-i2c"); | ||
| 188 | |||
| 189 | s5p_fb_setname(0, "exynos4-fb"); | ||
| 190 | s5p_hdmi_setname("exynos4-hdmi"); | ||
| 191 | } | ||
| 192 | |||
| 193 | void __init exynos4_init_clocks(int xtal) | ||
| 194 | { | ||
| 195 | printk(KERN_DEBUG "%s: initializing clocks\n", __func__); | ||
| 196 | |||
| 197 | s3c24xx_register_baseclocks(xtal); | ||
| 198 | s5p_register_clocks(xtal); | ||
| 199 | |||
| 200 | if (soc_is_exynos4210()) | ||
| 201 | exynos4210_register_clocks(); | ||
| 202 | else if (soc_is_exynos4212() || soc_is_exynos4412()) | ||
| 203 | exynos4212_register_clocks(); | ||
| 204 | |||
| 205 | exynos4_register_clocks(); | ||
| 206 | exynos4_setup_clocks(); | ||
| 207 | } | ||
| 208 | |||
| 209 | void __init exynos4_init_irq(void) | ||
| 210 | { | ||
| 211 | int irq; | ||
| 212 | unsigned int gic_bank_offset; | ||
| 213 | |||
| 214 | gic_bank_offset = soc_is_exynos4412() ? 0x4000 : 0x8000; | ||
| 215 | |||
| 216 | gic_init_bases(0, IRQ_PPI(0), S5P_VA_GIC_DIST, S5P_VA_GIC_CPU, gic_bank_offset); | ||
| 217 | |||
| 218 | for (irq = 0; irq < MAX_COMBINER_NR; irq++) { | ||
| 219 | |||
| 220 | combiner_init(irq, (void __iomem *)S5P_VA_COMBINER(irq), | ||
| 221 | COMBINER_IRQ(irq, 0)); | ||
| 222 | combiner_cascade_irq(irq, IRQ_SPI(irq)); | ||
| 223 | } | ||
| 224 | |||
| 225 | /* The parameters of s5p_init_irq() are for VIC init. | ||
| 226 | * Theses parameters should be NULL and 0 because EXYNOS4 | ||
| 227 | * uses GIC instead of VIC. | ||
| 228 | */ | ||
| 229 | s5p_init_irq(NULL, 0); | ||
| 230 | } | ||
| 231 | |||
| 232 | struct sysdev_class exynos4_sysclass = { | ||
| 233 | .name = "exynos4-core", | ||
| 234 | }; | ||
| 235 | |||
| 236 | static struct sys_device exynos4_sysdev = { | ||
| 237 | .cls = &exynos4_sysclass, | ||
| 238 | }; | ||
| 239 | |||
| 240 | static int __init exynos4_core_init(void) | ||
| 241 | { | ||
| 242 | return sysdev_class_register(&exynos4_sysclass); | ||
| 243 | } | ||
| 244 | core_initcall(exynos4_core_init); | ||
| 245 | |||
| 246 | #ifdef CONFIG_CACHE_L2X0 | ||
| 247 | static int __init exynos4_l2x0_cache_init(void) | ||
| 248 | { | ||
| 249 | /* TAG, Data Latency Control: 2cycle */ | ||
| 250 | __raw_writel(0x110, S5P_VA_L2CC + L2X0_TAG_LATENCY_CTRL); | ||
| 251 | |||
| 252 | if (soc_is_exynos4210()) | ||
| 253 | __raw_writel(0x110, S5P_VA_L2CC + L2X0_DATA_LATENCY_CTRL); | ||
| 254 | else if (soc_is_exynos4212() || soc_is_exynos4412()) | ||
| 255 | __raw_writel(0x120, S5P_VA_L2CC + L2X0_DATA_LATENCY_CTRL); | ||
| 256 | |||
| 257 | /* L2X0 Prefetch Control */ | ||
| 258 | __raw_writel(0x30000007, S5P_VA_L2CC + L2X0_PREFETCH_CTRL); | ||
| 259 | |||
| 260 | /* L2X0 Power Control */ | ||
| 261 | __raw_writel(L2X0_DYNAMIC_CLK_GATING_EN | L2X0_STNDBY_MODE_EN, | ||
| 262 | S5P_VA_L2CC + L2X0_POWER_CTRL); | ||
| 263 | |||
| 264 | l2x0_init(S5P_VA_L2CC, 0x7C470001, 0xC200ffff); | ||
| 265 | |||
| 266 | return 0; | ||
| 267 | } | ||
| 268 | |||
| 269 | early_initcall(exynos4_l2x0_cache_init); | ||
| 270 | #endif | ||
| 271 | |||
| 272 | int __init exynos_init(void) | ||
| 273 | { | ||
| 274 | printk(KERN_INFO "EXYNOS: Initializing architecture\n"); | ||
| 275 | |||
| 276 | /* set idle function */ | ||
| 277 | pm_idle = exynos_idle; | ||
| 278 | |||
| 279 | /* set sw_reset function */ | ||
| 280 | if (soc_is_exynos4210() || soc_is_exynos4212() || soc_is_exynos4412()) | ||
| 281 | s5p_reset_hook = exynos4_sw_reset; | ||
| 282 | |||
| 283 | return sysdev_register(&exynos4_sysdev); | ||
| 284 | } | ||
diff --git a/arch/arm/mach-exynos/include/mach/map.h b/arch/arm/mach-exynos/include/mach/map.h index 058541d45af..d1829860a0e 100644 --- a/arch/arm/mach-exynos/include/mach/map.h +++ b/arch/arm/mach-exynos/include/mach/map.h | |||
| @@ -149,7 +149,6 @@ | |||
| 149 | #define S3C_PA_WDT EXYNOS4_PA_WATCHDOG | 149 | #define S3C_PA_WDT EXYNOS4_PA_WATCHDOG |
| 150 | #define S3C_PA_UART EXYNOS4_PA_UART | 150 | #define S3C_PA_UART EXYNOS4_PA_UART |
| 151 | 151 | ||
| 152 | #define S5P_PA_CHIPID EXYNOS4_PA_CHIPID | ||
| 153 | #define S5P_PA_EHCI EXYNOS4_PA_EHCI | 152 | #define S5P_PA_EHCI EXYNOS4_PA_EHCI |
| 154 | #define S5P_PA_FIMC0 EXYNOS4_PA_FIMC0 | 153 | #define S5P_PA_FIMC0 EXYNOS4_PA_FIMC0 |
| 155 | #define S5P_PA_FIMC1 EXYNOS4_PA_FIMC1 | 154 | #define S5P_PA_FIMC1 EXYNOS4_PA_FIMC1 |
| @@ -166,26 +165,17 @@ | |||
| 166 | #define S5P_PA_ONENAND_DMA EXYNOS4_PA_ONENAND_DMA | 165 | #define S5P_PA_ONENAND_DMA EXYNOS4_PA_ONENAND_DMA |
| 167 | #define S5P_PA_SDO EXYNOS4_PA_SDO | 166 | #define S5P_PA_SDO EXYNOS4_PA_SDO |
| 168 | #define S5P_PA_SDRAM EXYNOS4_PA_SDRAM | 167 | #define S5P_PA_SDRAM EXYNOS4_PA_SDRAM |
| 169 | #define S5P_PA_SROMC EXYNOS4_PA_SROMC | ||
| 170 | #define S5P_PA_SYSCON EXYNOS4_PA_SYSCON | ||
| 171 | #define S5P_PA_TIMER EXYNOS4_PA_TIMER | ||
| 172 | #define S5P_PA_VP EXYNOS4_PA_VP | 168 | #define S5P_PA_VP EXYNOS4_PA_VP |
| 173 | 169 | ||
| 174 | #define SAMSUNG_PA_ADC EXYNOS4_PA_ADC | 170 | #define SAMSUNG_PA_ADC EXYNOS4_PA_ADC |
| 175 | #define SAMSUNG_PA_ADC1 EXYNOS4_PA_ADC1 | 171 | #define SAMSUNG_PA_ADC1 EXYNOS4_PA_ADC1 |
| 176 | #define SAMSUNG_PA_KEYPAD EXYNOS4_PA_KEYPAD | 172 | #define SAMSUNG_PA_KEYPAD EXYNOS4_PA_KEYPAD |
| 177 | 173 | ||
| 178 | #define EXYNOS_PA_COMBINER EXYNOS4_PA_COMBINER | ||
| 179 | #define EXYNOS_PA_GIC_CPU EXYNOS4_PA_GIC_CPU | ||
| 180 | #define EXYNOS_PA_GIC_DIST EXYNOS4_PA_GIC_DIST | ||
| 181 | #define EXYNOS_PA_PMU EXYNOS4_PA_PMU | ||
| 182 | #define EXYNOS_PA_SYSTIMER EXYNOS4_PA_SYSTIMER | ||
| 183 | |||
| 184 | /* Compatibility UART */ | 174 | /* Compatibility UART */ |
| 185 | 175 | ||
| 186 | #define S3C_VA_UARTx(x) (S3C_VA_UART + ((x) * S3C_UART_OFFSET)) | 176 | #define S3C_VA_UARTx(x) (S3C_VA_UART + ((x) * S3C_UART_OFFSET)) |
| 187 | 177 | ||
| 188 | #define S5P_PA_UART(x) (S3C_PA_UART + ((x) * S3C_UART_OFFSET)) | 178 | #define S5P_PA_UART(x) (EXYNOS4_PA_UART + ((x) * S3C_UART_OFFSET)) |
| 189 | #define S5P_PA_UART0 S5P_PA_UART(0) | 179 | #define S5P_PA_UART0 S5P_PA_UART(0) |
| 190 | #define S5P_PA_UART1 S5P_PA_UART(1) | 180 | #define S5P_PA_UART1 S5P_PA_UART(1) |
| 191 | #define S5P_PA_UART2 S5P_PA_UART(2) | 181 | #define S5P_PA_UART2 S5P_PA_UART(2) |
diff --git a/arch/arm/mach-exynos/include/mach/system.h b/arch/arm/mach-exynos/include/mach/system.h index 5e3220c18fc..0063a6de3dc 100644 --- a/arch/arm/mach-exynos/include/mach/system.h +++ b/arch/arm/mach-exynos/include/mach/system.h | |||
| @@ -13,8 +13,6 @@ | |||
| 13 | #ifndef __ASM_ARCH_SYSTEM_H | 13 | #ifndef __ASM_ARCH_SYSTEM_H |
| 14 | #define __ASM_ARCH_SYSTEM_H __FILE__ | 14 | #define __ASM_ARCH_SYSTEM_H __FILE__ |
| 15 | 15 | ||
| 16 | #include <plat/system-reset.h> | ||
| 17 | |||
| 18 | static void arch_idle(void) | 16 | static void arch_idle(void) |
| 19 | { | 17 | { |
| 20 | /* nothing here yet */ | 18 | /* nothing here yet */ |
diff --git a/arch/arm/mach-exynos/init.c b/arch/arm/mach-exynos/init.c deleted file mode 100644 index a8a83e3881a..00000000000 --- a/arch/arm/mach-exynos/init.c +++ /dev/null | |||
| @@ -1,42 +0,0 @@ | |||
| 1 | /* linux/arch/arm/mach-exynos4/init.c | ||
| 2 | * | ||
| 3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
| 4 | * http://www.samsung.com/ | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License version 2 as | ||
| 8 | * published by the Free Software Foundation. | ||
| 9 | */ | ||
| 10 | |||
| 11 | #include <linux/serial_core.h> | ||
| 12 | |||
| 13 | #include <plat/cpu.h> | ||
| 14 | #include <plat/devs.h> | ||
| 15 | #include <plat/regs-serial.h> | ||
| 16 | |||
| 17 | static struct s3c24xx_uart_clksrc exynos4_serial_clocks[] = { | ||
| 18 | [0] = { | ||
| 19 | .name = "uclk1", | ||
| 20 | .divisor = 1, | ||
| 21 | .min_baud = 0, | ||
| 22 | .max_baud = 0, | ||
| 23 | }, | ||
| 24 | }; | ||
| 25 | |||
| 26 | /* uart registration process */ | ||
| 27 | void __init exynos4_common_init_uarts(struct s3c2410_uartcfg *cfg, int no) | ||
| 28 | { | ||
| 29 | struct s3c2410_uartcfg *tcfg = cfg; | ||
| 30 | u32 ucnt; | ||
| 31 | |||
| 32 | for (ucnt = 0; ucnt < no; ucnt++, tcfg++) { | ||
| 33 | if (!tcfg->clocks) { | ||
| 34 | tcfg->has_fracval = 1; | ||
| 35 | tcfg->clocks = exynos4_serial_clocks; | ||
| 36 | tcfg->clocks_size = ARRAY_SIZE(exynos4_serial_clocks); | ||
| 37 | } | ||
| 38 | tcfg->flags |= NO_NEED_CHECK_CLKSRC; | ||
| 39 | } | ||
| 40 | |||
| 41 | s3c24xx_init_uartdevs("s5pv210-uart", s5p_uart_resources, cfg, no); | ||
| 42 | } | ||
diff --git a/arch/arm/mach-exynos/irq-combiner.c b/arch/arm/mach-exynos/irq-combiner.c deleted file mode 100644 index 5a2758ab055..00000000000 --- a/arch/arm/mach-exynos/irq-combiner.c +++ /dev/null | |||
| @@ -1,124 +0,0 @@ | |||
| 1 | /* linux/arch/arm/mach-exynos4/irq-combiner.c | ||
| 2 | * | ||
| 3 | * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. | ||
| 4 | * http://www.samsung.com | ||
| 5 | * | ||
| 6 | * Based on arch/arm/common/gic.c | ||
| 7 | * | ||
| 8 | * IRQ COMBINER support | ||
| 9 | * | ||
| 10 | * This program is free software; you can redistribute it and/or modify | ||
| 11 | * it under the terms of the GNU General Public License version 2 as | ||
| 12 | * published by the Free Software Foundation. | ||
| 13 | */ | ||
| 14 | |||
| 15 | #include <linux/io.h> | ||
| 16 | |||
| 17 | #include <asm/mach/irq.h> | ||
| 18 | |||
| 19 | #define COMBINER_ENABLE_SET 0x0 | ||
| 20 | #define COMBINER_ENABLE_CLEAR 0x4 | ||
| 21 | #define COMBINER_INT_STATUS 0xC | ||
| 22 | |||
| 23 | static DEFINE_SPINLOCK(irq_controller_lock); | ||
| 24 | |||
| 25 | struct combiner_chip_data { | ||
| 26 | unsigned int irq_offset; | ||
| 27 | unsigned int irq_mask; | ||
| 28 | void __iomem *base; | ||
| 29 | }; | ||
| 30 | |||
| 31 | static struct combiner_chip_data combiner_data[MAX_COMBINER_NR]; | ||
| 32 | |||
| 33 | static inline void __iomem *combiner_base(struct irq_data *data) | ||
| 34 | { | ||
| 35 | struct combiner_chip_data *combiner_data = | ||
| 36 | irq_data_get_irq_chip_data(data); | ||
| 37 | |||
| 38 | return combiner_data->base; | ||
| 39 | } | ||
| 40 | |||
| 41 | static void combiner_mask_irq(struct irq_data *data) | ||
| 42 | { | ||
| 43 | u32 mask = 1 << (data->irq % 32); | ||
| 44 | |||
| 45 | __raw_writel(mask, combiner_base(data) + COMBINER_ENABLE_CLEAR); | ||
| 46 | } | ||
| 47 | |||
| 48 | static void combiner_unmask_irq(struct irq_data *data) | ||
| 49 | { | ||
| 50 | u32 mask = 1 << (data->irq % 32); | ||
| 51 | |||
| 52 | __raw_writel(mask, combiner_base(data) + COMBINER_ENABLE_SET); | ||
| 53 | } | ||
| 54 | |||
| 55 | static void combiner_handle_cascade_irq(unsigned int irq, struct irq_desc *desc) | ||
| 56 | { | ||
| 57 | struct combiner_chip_data *chip_data = irq_get_handler_data(irq); | ||
| 58 | struct irq_chip *chip = irq_get_chip(irq); | ||
| 59 | unsigned int cascade_irq, combiner_irq; | ||
| 60 | unsigned long status; | ||
| 61 | |||
| 62 | chained_irq_enter(chip, desc); | ||
| 63 | |||
| 64 | spin_lock(&irq_controller_lock); | ||
| 65 | status = __raw_readl(chip_data->base + COMBINER_INT_STATUS); | ||
| 66 | spin_unlock(&irq_controller_lock); | ||
| 67 | status &= chip_data->irq_mask; | ||
| 68 | |||
| 69 | if (status == 0) | ||
| 70 | goto out; | ||
| 71 | |||
| 72 | combiner_irq = __ffs(status); | ||
| 73 | |||
| 74 | cascade_irq = combiner_irq + (chip_data->irq_offset & ~31); | ||
| 75 | if (unlikely(cascade_irq >= NR_IRQS)) | ||
| 76 | do_bad_IRQ(cascade_irq, desc); | ||
| 77 | else | ||
| 78 | generic_handle_irq(cascade_irq); | ||
| 79 | |||
| 80 | out: | ||
| 81 | chained_irq_exit(chip, desc); | ||
| 82 | } | ||
| 83 | |||
| 84 | static struct irq_chip combiner_chip = { | ||
| 85 | .name = "COMBINER", | ||
| 86 | .irq_mask = combiner_mask_irq, | ||
| 87 | .irq_unmask = combiner_unmask_irq, | ||
| 88 | }; | ||
| 89 | |||
| 90 | void __init combiner_cascade_irq(unsigned int combiner_nr, unsigned int irq) | ||
| 91 | { | ||
| 92 | if (combiner_nr >= MAX_COMBINER_NR) | ||
| 93 | BUG(); | ||
| 94 | if (irq_set_handler_data(irq, &combiner_data[combiner_nr]) != 0) | ||
| 95 | BUG(); | ||
| 96 | irq_set_chained_handler(irq, combiner_handle_cascade_irq); | ||
| 97 | } | ||
| 98 | |||
| 99 | void __init combiner_init(unsigned int combiner_nr, void __iomem *base, | ||
| 100 | unsigned int irq_start) | ||
| 101 | { | ||
| 102 | unsigned int i; | ||
| 103 | |||
| 104 | if (combiner_nr >= MAX_COMBINER_NR) | ||
| 105 | BUG(); | ||
| 106 | |||
| 107 | combiner_data[combiner_nr].base = base; | ||
| 108 | combiner_data[combiner_nr].irq_offset = irq_start; | ||
| 109 | combiner_data[combiner_nr].irq_mask = 0xff << ((combiner_nr % 4) << 3); | ||
| 110 | |||
| 111 | /* Disable all interrupts */ | ||
| 112 | |||
| 113 | __raw_writel(combiner_data[combiner_nr].irq_mask, | ||
| 114 | base + COMBINER_ENABLE_CLEAR); | ||
| 115 | |||
| 116 | /* Setup the Linux IRQ subsystem */ | ||
| 117 | |||
| 118 | for (i = irq_start; i < combiner_data[combiner_nr].irq_offset | ||
| 119 | + MAX_IRQ_IN_COMBINER; i++) { | ||
| 120 | irq_set_chip_and_handler(i, &combiner_chip, handle_level_irq); | ||
| 121 | irq_set_chip_data(i, &combiner_data[combiner_nr]); | ||
| 122 | set_irq_flags(i, IRQF_VALID | IRQF_PROBE); | ||
| 123 | } | ||
| 124 | } | ||
diff --git a/arch/arm/mach-exynos/irq-eint.c b/arch/arm/mach-exynos/irq-eint.c deleted file mode 100644 index badb8c66fc9..00000000000 --- a/arch/arm/mach-exynos/irq-eint.c +++ /dev/null | |||
| @@ -1,237 +0,0 @@ | |||
| 1 | /* linux/arch/arm/mach-exynos4/irq-eint.c | ||
| 2 | * | ||
| 3 | * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. | ||
| 4 | * http://www.samsung.com | ||
| 5 | * | ||
| 6 | * EXYNOS4 - IRQ EINT support | ||
| 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 version 2 as | ||
| 10 | * published by the Free Software Foundation. | ||
| 11 | */ | ||
| 12 | |||
| 13 | #include <linux/kernel.h> | ||
| 14 | #include <linux/interrupt.h> | ||
| 15 | #include <linux/irq.h> | ||
| 16 | #include <linux/io.h> | ||
| 17 | #include <linux/sysdev.h> | ||
| 18 | #include <linux/gpio.h> | ||
| 19 | |||
| 20 | #include <plat/pm.h> | ||
| 21 | #include <plat/cpu.h> | ||
| 22 | #include <plat/gpio-cfg.h> | ||
| 23 | |||
| 24 | #include <mach/regs-gpio.h> | ||
| 25 | |||
| 26 | #include <asm/mach/irq.h> | ||
| 27 | |||
| 28 | static DEFINE_SPINLOCK(eint_lock); | ||
| 29 | |||
| 30 | static unsigned int eint0_15_data[16]; | ||
| 31 | |||
| 32 | static unsigned int exynos4_get_irq_nr(unsigned int number) | ||
| 33 | { | ||
| 34 | u32 ret = 0; | ||
| 35 | |||
| 36 | switch (number) { | ||
| 37 | case 0 ... 3: | ||
| 38 | ret = (number + IRQ_EINT0); | ||
| 39 | break; | ||
| 40 | case 4 ... 7: | ||
| 41 | ret = (number + (IRQ_EINT4 - 4)); | ||
| 42 | break; | ||
| 43 | case 8 ... 15: | ||
| 44 | ret = (number + (IRQ_EINT8 - 8)); | ||
| 45 | break; | ||
| 46 | default: | ||
| 47 | printk(KERN_ERR "number available : %d\n", number); | ||
| 48 | } | ||
| 49 | |||
| 50 | return ret; | ||
| 51 | } | ||
| 52 | |||
| 53 | static inline void exynos4_irq_eint_mask(struct irq_data *data) | ||
| 54 | { | ||
| 55 | u32 mask; | ||
| 56 | |||
| 57 | spin_lock(&eint_lock); | ||
| 58 | mask = __raw_readl(S5P_EINT_MASK(EINT_REG_NR(data->irq))); | ||
| 59 | mask |= eint_irq_to_bit(data->irq); | ||
| 60 | __raw_writel(mask, S5P_EINT_MASK(EINT_REG_NR(data->irq))); | ||
| 61 | spin_unlock(&eint_lock); | ||
| 62 | } | ||
| 63 | |||
| 64 | static void exynos4_irq_eint_unmask(struct irq_data *data) | ||
| 65 | { | ||
| 66 | u32 mask; | ||
| 67 | |||
| 68 | spin_lock(&eint_lock); | ||
| 69 | mask = __raw_readl(S5P_EINT_MASK(EINT_REG_NR(data->irq))); | ||
| 70 | mask &= ~(eint_irq_to_bit(data->irq)); | ||
| 71 | __raw_writel(mask, S5P_EINT_MASK(EINT_REG_NR(data->irq))); | ||
| 72 | spin_unlock(&eint_lock); | ||
| 73 | } | ||
| 74 | |||
| 75 | static inline void exynos4_irq_eint_ack(struct irq_data *data) | ||
| 76 | { | ||
| 77 | __raw_writel(eint_irq_to_bit(data->irq), | ||
| 78 | S5P_EINT_PEND(EINT_REG_NR(data->irq))); | ||
| 79 | } | ||
| 80 | |||
| 81 | static void exynos4_irq_eint_maskack(struct irq_data *data) | ||
| 82 | { | ||
| 83 | exynos4_irq_eint_mask(data); | ||
| 84 | exynos4_irq_eint_ack(data); | ||
| 85 | } | ||
| 86 | |||
| 87 | static int exynos4_irq_eint_set_type(struct irq_data *data, unsigned int type) | ||
| 88 | { | ||
| 89 | int offs = EINT_OFFSET(data->irq); | ||
| 90 | int shift; | ||
| 91 | u32 ctrl, mask; | ||
| 92 | u32 newvalue = 0; | ||
| 93 | |||
| 94 | switch (type) { | ||
| 95 | case IRQ_TYPE_EDGE_RISING: | ||
| 96 | newvalue = S5P_IRQ_TYPE_EDGE_RISING; | ||
| 97 | break; | ||
| 98 | |||
| 99 | case IRQ_TYPE_EDGE_FALLING: | ||
| 100 | newvalue = S5P_IRQ_TYPE_EDGE_FALLING; | ||
| 101 | break; | ||
| 102 | |||
| 103 | case IRQ_TYPE_EDGE_BOTH: | ||
| 104 | newvalue = S5P_IRQ_TYPE_EDGE_BOTH; | ||
| 105 | break; | ||
| 106 | |||
| 107 | case IRQ_TYPE_LEVEL_LOW: | ||
| 108 | newvalue = S5P_IRQ_TYPE_LEVEL_LOW; | ||
| 109 | break; | ||
| 110 | |||
| 111 | case IRQ_TYPE_LEVEL_HIGH: | ||
| 112 | newvalue = S5P_IRQ_TYPE_LEVEL_HIGH; | ||
| 113 | break; | ||
| 114 | |||
| 115 | default: | ||
| 116 | printk(KERN_ERR "No such irq type %d", type); | ||
| 117 | return -EINVAL; | ||
| 118 | } | ||
| 119 | |||
| 120 | shift = (offs & 0x7) * 4; | ||
| 121 | mask = 0x7 << shift; | ||
| 122 | |||
| 123 | spin_lock(&eint_lock); | ||
| 124 | ctrl = __raw_readl(S5P_EINT_CON(EINT_REG_NR(data->irq))); | ||
| 125 | ctrl &= ~mask; | ||
| 126 | ctrl |= newvalue << shift; | ||
| 127 | __raw_writel(ctrl, S5P_EINT_CON(EINT_REG_NR(data->irq))); | ||
| 128 | spin_unlock(&eint_lock); | ||
| 129 | |||
| 130 | switch (offs) { | ||
| 131 | case 0 ... 7: | ||
| 132 | s3c_gpio_cfgpin(EINT_GPIO_0(offs & 0x7), EINT_MODE); | ||
| 133 | break; | ||
| 134 | case 8 ... 15: | ||
| 135 | s3c_gpio_cfgpin(EINT_GPIO_1(offs & 0x7), EINT_MODE); | ||
| 136 | break; | ||
| 137 | case 16 ... 23: | ||
| 138 | s3c_gpio_cfgpin(EINT_GPIO_2(offs & 0x7), EINT_MODE); | ||
| 139 | break; | ||
| 140 | case 24 ... 31: | ||
| 141 | s3c_gpio_cfgpin(EINT_GPIO_3(offs & 0x7), EINT_MODE); | ||
| 142 | break; | ||
| 143 | default: | ||
| 144 | printk(KERN_ERR "No such irq number %d", offs); | ||
| 145 | } | ||
| 146 | |||
| 147 | return 0; | ||
| 148 | } | ||
| 149 | |||
| 150 | static struct irq_chip exynos4_irq_eint = { | ||
| 151 | .name = "exynos4-eint", | ||
| 152 | .irq_mask = exynos4_irq_eint_mask, | ||
| 153 | .irq_unmask = exynos4_irq_eint_unmask, | ||
| 154 | .irq_mask_ack = exynos4_irq_eint_maskack, | ||
| 155 | .irq_ack = exynos4_irq_eint_ack, | ||
| 156 | .irq_set_type = exynos4_irq_eint_set_type, | ||
| 157 | #ifdef CONFIG_PM | ||
| 158 | .irq_set_wake = s3c_irqext_wake, | ||
| 159 | #endif | ||
| 160 | }; | ||
| 161 | |||
| 162 | /* exynos4_irq_demux_eint | ||
| 163 | * | ||
| 164 | * This function demuxes the IRQ from from EINTs 16 to 31. | ||
| 165 | * It is designed to be inlined into the specific handler | ||
| 166 | * s5p_irq_demux_eintX_Y. | ||
| 167 | * | ||
| 168 | * Each EINT pend/mask registers handle eight of them. | ||
| 169 | */ | ||
| 170 | static inline void exynos4_irq_demux_eint(unsigned int start) | ||
| 171 | { | ||
| 172 | unsigned int irq; | ||
| 173 | |||
| 174 | u32 status = __raw_readl(S5P_EINT_PEND(EINT_REG_NR(start))); | ||
| 175 | u32 mask = __raw_readl(S5P_EINT_MASK(EINT_REG_NR(start))); | ||
| 176 | |||
| 177 | status &= ~mask; | ||
| 178 | status &= 0xff; | ||
| 179 | |||
| 180 | while (status) { | ||
| 181 | irq = fls(status) - 1; | ||
| 182 | generic_handle_irq(irq + start); | ||
| 183 | status &= ~(1 << irq); | ||
| 184 | } | ||
| 185 | } | ||
| 186 | |||
| 187 | static void exynos4_irq_demux_eint16_31(unsigned int irq, struct irq_desc *desc) | ||
| 188 | { | ||
| 189 | struct irq_chip *chip = irq_get_chip(irq); | ||
| 190 | chained_irq_enter(chip, desc); | ||
| 191 | exynos4_irq_demux_eint(IRQ_EINT(16)); | ||
| 192 | exynos4_irq_demux_eint(IRQ_EINT(24)); | ||
| 193 | chained_irq_exit(chip, desc); | ||
| 194 | } | ||
| 195 | |||
| 196 | static void exynos4_irq_eint0_15(unsigned int irq, struct irq_desc *desc) | ||
| 197 | { | ||
| 198 | u32 *irq_data = irq_get_handler_data(irq); | ||
| 199 | struct irq_chip *chip = irq_get_chip(irq); | ||
| 200 | |||
| 201 | chained_irq_enter(chip, desc); | ||
| 202 | chip->irq_mask(&desc->irq_data); | ||
| 203 | |||
| 204 | if (chip->irq_ack) | ||
| 205 | chip->irq_ack(&desc->irq_data); | ||
| 206 | |||
| 207 | generic_handle_irq(*irq_data); | ||
| 208 | |||
| 209 | chip->irq_unmask(&desc->irq_data); | ||
| 210 | chained_irq_exit(chip, desc); | ||
| 211 | } | ||
| 212 | |||
| 213 | int __init exynos4_init_irq_eint(void) | ||
| 214 | { | ||
| 215 | int irq; | ||
| 216 | |||
| 217 | for (irq = 0 ; irq <= 31 ; irq++) { | ||
| 218 | irq_set_chip_and_handler(IRQ_EINT(irq), &exynos4_irq_eint, | ||
| 219 | handle_level_irq); | ||
| 220 | set_irq_flags(IRQ_EINT(irq), IRQF_VALID); | ||
| 221 | } | ||
| 222 | |||
| 223 | irq_set_chained_handler(IRQ_EINT16_31, exynos4_irq_demux_eint16_31); | ||
| 224 | |||
| 225 | for (irq = 0 ; irq <= 15 ; irq++) { | ||
| 226 | eint0_15_data[irq] = IRQ_EINT(irq); | ||
| 227 | |||
| 228 | irq_set_handler_data(exynos4_get_irq_nr(irq), | ||
| 229 | &eint0_15_data[irq]); | ||
| 230 | irq_set_chained_handler(exynos4_get_irq_nr(irq), | ||
| 231 | exynos4_irq_eint0_15); | ||
| 232 | } | ||
| 233 | |||
| 234 | return 0; | ||
| 235 | } | ||
| 236 | |||
| 237 | arch_initcall(exynos4_init_irq_eint); | ||
diff --git a/arch/arm/mach-exynos/mach-armlex4210.c b/arch/arm/mach-exynos/mach-armlex4210.c index 49da3089249..d726fcd3acf 100644 --- a/arch/arm/mach-exynos/mach-armlex4210.c +++ b/arch/arm/mach-exynos/mach-armlex4210.c | |||
| @@ -21,7 +21,6 @@ | |||
| 21 | 21 | ||
| 22 | #include <plat/cpu.h> | 22 | #include <plat/cpu.h> |
| 23 | #include <plat/devs.h> | 23 | #include <plat/devs.h> |
| 24 | #include <plat/exynos4.h> | ||
| 25 | #include <plat/gpio-cfg.h> | 24 | #include <plat/gpio-cfg.h> |
| 26 | #include <plat/regs-serial.h> | 25 | #include <plat/regs-serial.h> |
| 27 | #include <plat/regs-srom.h> | 26 | #include <plat/regs-srom.h> |
| @@ -29,6 +28,8 @@ | |||
| 29 | 28 | ||
| 30 | #include <mach/map.h> | 29 | #include <mach/map.h> |
| 31 | 30 | ||
| 31 | #include "common.h" | ||
| 32 | |||
| 32 | /* Following are default values for UCON, ULCON and UFCON UART registers */ | 33 | /* Following are default values for UCON, ULCON and UFCON UART registers */ |
| 33 | #define ARMLEX4210_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ | 34 | #define ARMLEX4210_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ |
| 34 | S3C2410_UCON_RXILEVEL | \ | 35 | S3C2410_UCON_RXILEVEL | \ |
| @@ -188,7 +189,7 @@ static void __init armlex4210_smsc911x_init(void) | |||
| 188 | 189 | ||
| 189 | static void __init armlex4210_map_io(void) | 190 | static void __init armlex4210_map_io(void) |
| 190 | { | 191 | { |
| 191 | s5p_init_io(NULL, 0, S5P_VA_CHIPID); | 192 | exynos_init_io(NULL, 0); |
| 192 | s3c24xx_init_clocks(24000000); | 193 | s3c24xx_init_clocks(24000000); |
| 193 | s3c24xx_init_uarts(armlex4210_uartcfgs, | 194 | s3c24xx_init_uarts(armlex4210_uartcfgs, |
| 194 | ARRAY_SIZE(armlex4210_uartcfgs)); | 195 | ARRAY_SIZE(armlex4210_uartcfgs)); |
| @@ -214,4 +215,5 @@ MACHINE_START(ARMLEX4210, "ARMLEX4210") | |||
| 214 | .handle_irq = gic_handle_irq, | 215 | .handle_irq = gic_handle_irq, |
| 215 | .init_machine = armlex4210_machine_init, | 216 | .init_machine = armlex4210_machine_init, |
| 216 | .timer = &exynos4_timer, | 217 | .timer = &exynos4_timer, |
| 218 | .restart = exynos4_restart, | ||
| 217 | MACHINE_END | 219 | MACHINE_END |
diff --git a/arch/arm/mach-exynos/mach-nuri.c b/arch/arm/mach-exynos/mach-nuri.c index 5acec11821a..635fb97e31a 100644 --- a/arch/arm/mach-exynos/mach-nuri.c +++ b/arch/arm/mach-exynos/mach-nuri.c | |||
| @@ -38,7 +38,6 @@ | |||
| 38 | #include <plat/adc.h> | 38 | #include <plat/adc.h> |
| 39 | #include <plat/regs-fb-v4.h> | 39 | #include <plat/regs-fb-v4.h> |
| 40 | #include <plat/regs-serial.h> | 40 | #include <plat/regs-serial.h> |
| 41 | #include <plat/exynos4.h> | ||
| 42 | #include <plat/cpu.h> | 41 | #include <plat/cpu.h> |
| 43 | #include <plat/devs.h> | 42 | #include <plat/devs.h> |
| 44 | #include <plat/fb.h> | 43 | #include <plat/fb.h> |
| @@ -55,6 +54,8 @@ | |||
| 55 | 54 | ||
| 56 | #include <mach/map.h> | 55 | #include <mach/map.h> |
| 57 | 56 | ||
| 57 | #include "common.h" | ||
| 58 | |||
| 58 | /* Following are default values for UCON, ULCON and UFCON UART registers */ | 59 | /* Following are default values for UCON, ULCON and UFCON UART registers */ |
| 59 | #define NURI_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ | 60 | #define NURI_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ |
| 60 | S3C2410_UCON_RXILEVEL | \ | 61 | S3C2410_UCON_RXILEVEL | \ |
| @@ -1284,7 +1285,7 @@ static struct platform_device *nuri_devices[] __initdata = { | |||
| 1284 | 1285 | ||
| 1285 | static void __init nuri_map_io(void) | 1286 | static void __init nuri_map_io(void) |
| 1286 | { | 1287 | { |
| 1287 | s5p_init_io(NULL, 0, S5P_VA_CHIPID); | 1288 | exynos_init_io(NULL, 0); |
| 1288 | s3c24xx_init_clocks(24000000); | 1289 | s3c24xx_init_clocks(24000000); |
| 1289 | s3c24xx_init_uarts(nuri_uartcfgs, ARRAY_SIZE(nuri_uartcfgs)); | 1290 | s3c24xx_init_uarts(nuri_uartcfgs, ARRAY_SIZE(nuri_uartcfgs)); |
| 1290 | } | 1291 | } |
| @@ -1338,4 +1339,5 @@ MACHINE_START(NURI, "NURI") | |||
| 1338 | .init_machine = nuri_machine_init, | 1339 | .init_machine = nuri_machine_init, |
| 1339 | .timer = &exynos4_timer, | 1340 | .timer = &exynos4_timer, |
| 1340 | .reserve = &nuri_reserve, | 1341 | .reserve = &nuri_reserve, |
| 1342 | .restart = exynos4_restart, | ||
| 1341 | MACHINE_END | 1343 | MACHINE_END |
diff --git a/arch/arm/mach-exynos/mach-origen.c b/arch/arm/mach-exynos/mach-origen.c index 5561b06c38e..586eb995aa9 100644 --- a/arch/arm/mach-exynos/mach-origen.c +++ b/arch/arm/mach-exynos/mach-origen.c | |||
| @@ -29,7 +29,6 @@ | |||
| 29 | 29 | ||
| 30 | #include <plat/regs-serial.h> | 30 | #include <plat/regs-serial.h> |
| 31 | #include <plat/regs-fb-v4.h> | 31 | #include <plat/regs-fb-v4.h> |
| 32 | #include <plat/exynos4.h> | ||
| 33 | #include <plat/cpu.h> | 32 | #include <plat/cpu.h> |
| 34 | #include <plat/devs.h> | 33 | #include <plat/devs.h> |
| 35 | #include <plat/sdhci.h> | 34 | #include <plat/sdhci.h> |
| @@ -44,6 +43,8 @@ | |||
| 44 | 43 | ||
| 45 | #include <mach/map.h> | 44 | #include <mach/map.h> |
| 46 | 45 | ||
| 46 | #include "common.h" | ||
| 47 | |||
| 47 | /* Following are default values for UCON, ULCON and UFCON UART registers */ | 48 | /* Following are default values for UCON, ULCON and UFCON UART registers */ |
| 48 | #define ORIGEN_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ | 49 | #define ORIGEN_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ |
| 49 | S3C2410_UCON_RXILEVEL | \ | 50 | S3C2410_UCON_RXILEVEL | \ |
| @@ -639,7 +640,7 @@ static void s5p_tv_setup(void) | |||
| 639 | 640 | ||
| 640 | static void __init origen_map_io(void) | 641 | static void __init origen_map_io(void) |
| 641 | { | 642 | { |
| 642 | s5p_init_io(NULL, 0, S5P_VA_CHIPID); | 643 | exynos_init_io(NULL, 0); |
| 643 | s3c24xx_init_clocks(24000000); | 644 | s3c24xx_init_clocks(24000000); |
| 644 | s3c24xx_init_uarts(origen_uartcfgs, ARRAY_SIZE(origen_uartcfgs)); | 645 | s3c24xx_init_uarts(origen_uartcfgs, ARRAY_SIZE(origen_uartcfgs)); |
| 645 | } | 646 | } |
| @@ -699,4 +700,5 @@ MACHINE_START(ORIGEN, "ORIGEN") | |||
| 699 | .init_machine = origen_machine_init, | 700 | .init_machine = origen_machine_init, |
| 700 | .timer = &exynos4_timer, | 701 | .timer = &exynos4_timer, |
| 701 | .reserve = &origen_reserve, | 702 | .reserve = &origen_reserve, |
| 703 | .restart = exynos4_restart, | ||
| 702 | MACHINE_END | 704 | MACHINE_END |
diff --git a/arch/arm/mach-exynos/mach-smdk4x12.c b/arch/arm/mach-exynos/mach-smdk4x12.c index 722d82d7f21..d00e4f016a6 100644 --- a/arch/arm/mach-exynos/mach-smdk4x12.c +++ b/arch/arm/mach-exynos/mach-smdk4x12.c | |||
| @@ -28,7 +28,6 @@ | |||
| 28 | #include <plat/clock.h> | 28 | #include <plat/clock.h> |
| 29 | #include <plat/cpu.h> | 29 | #include <plat/cpu.h> |
| 30 | #include <plat/devs.h> | 30 | #include <plat/devs.h> |
| 31 | #include <plat/exynos4.h> | ||
| 32 | #include <plat/gpio-cfg.h> | 31 | #include <plat/gpio-cfg.h> |
| 33 | #include <plat/iic.h> | 32 | #include <plat/iic.h> |
| 34 | #include <plat/keypad.h> | 33 | #include <plat/keypad.h> |
| @@ -37,6 +36,8 @@ | |||
| 37 | 36 | ||
| 38 | #include <mach/map.h> | 37 | #include <mach/map.h> |
| 39 | 38 | ||
| 39 | #include "common.h" | ||
| 40 | |||
| 40 | /* Following are default values for UCON, ULCON and UFCON UART registers */ | 41 | /* Following are default values for UCON, ULCON and UFCON UART registers */ |
| 41 | #define SMDK4X12_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ | 42 | #define SMDK4X12_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ |
| 42 | S3C2410_UCON_RXILEVEL | \ | 43 | S3C2410_UCON_RXILEVEL | \ |
| @@ -250,7 +251,7 @@ static void __init smdk4x12_map_io(void) | |||
| 250 | { | 251 | { |
| 251 | clk_xusbxti.rate = 24000000; | 252 | clk_xusbxti.rate = 24000000; |
| 252 | 253 | ||
| 253 | s5p_init_io(NULL, 0, S5P_VA_CHIPID); | 254 | exynos_init_io(NULL, 0); |
| 254 | s3c24xx_init_clocks(clk_xusbxti.rate); | 255 | s3c24xx_init_clocks(clk_xusbxti.rate); |
| 255 | s3c24xx_init_uarts(smdk4x12_uartcfgs, ARRAY_SIZE(smdk4x12_uartcfgs)); | 256 | s3c24xx_init_uarts(smdk4x12_uartcfgs, ARRAY_SIZE(smdk4x12_uartcfgs)); |
| 256 | } | 257 | } |
| @@ -291,6 +292,7 @@ MACHINE_START(SMDK4212, "SMDK4212") | |||
| 291 | .handle_irq = gic_handle_irq, | 292 | .handle_irq = gic_handle_irq, |
| 292 | .init_machine = smdk4x12_machine_init, | 293 | .init_machine = smdk4x12_machine_init, |
| 293 | .timer = &exynos4_timer, | 294 | .timer = &exynos4_timer, |
| 295 | .restart = exynos4_restart, | ||
| 294 | MACHINE_END | 296 | MACHINE_END |
| 295 | 297 | ||
| 296 | MACHINE_START(SMDK4412, "SMDK4412") | 298 | MACHINE_START(SMDK4412, "SMDK4412") |
| @@ -302,4 +304,5 @@ MACHINE_START(SMDK4412, "SMDK4412") | |||
| 302 | .handle_irq = gic_handle_irq, | 304 | .handle_irq = gic_handle_irq, |
| 303 | .init_machine = smdk4x12_machine_init, | 305 | .init_machine = smdk4x12_machine_init, |
| 304 | .timer = &exynos4_timer, | 306 | .timer = &exynos4_timer, |
| 307 | .restart = exynos4_restart, | ||
| 305 | MACHINE_END | 308 | MACHINE_END |
diff --git a/arch/arm/mach-exynos/mach-smdkv310.c b/arch/arm/mach-exynos/mach-smdkv310.c index edc60b6108e..5b365613b47 100644 --- a/arch/arm/mach-exynos/mach-smdkv310.c +++ b/arch/arm/mach-exynos/mach-smdkv310.c | |||
| @@ -28,7 +28,6 @@ | |||
| 28 | #include <plat/regs-serial.h> | 28 | #include <plat/regs-serial.h> |
| 29 | #include <plat/regs-srom.h> | 29 | #include <plat/regs-srom.h> |
| 30 | #include <plat/regs-fb-v4.h> | 30 | #include <plat/regs-fb-v4.h> |
| 31 | #include <plat/exynos4.h> | ||
| 32 | #include <plat/cpu.h> | 31 | #include <plat/cpu.h> |
| 33 | #include <plat/devs.h> | 32 | #include <plat/devs.h> |
| 34 | #include <plat/fb.h> | 33 | #include <plat/fb.h> |
| @@ -44,6 +43,8 @@ | |||
| 44 | 43 | ||
| 45 | #include <mach/map.h> | 44 | #include <mach/map.h> |
| 46 | 45 | ||
| 46 | #include "common.h" | ||
| 47 | |||
| 47 | /* Following are default values for UCON, ULCON and UFCON UART registers */ | 48 | /* Following are default values for UCON, ULCON and UFCON UART registers */ |
| 48 | #define SMDKV310_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ | 49 | #define SMDKV310_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ |
| 49 | S3C2410_UCON_RXILEVEL | \ | 50 | S3C2410_UCON_RXILEVEL | \ |
| @@ -333,7 +334,7 @@ static void s5p_tv_setup(void) | |||
| 333 | 334 | ||
| 334 | static void __init smdkv310_map_io(void) | 335 | static void __init smdkv310_map_io(void) |
| 335 | { | 336 | { |
| 336 | s5p_init_io(NULL, 0, S5P_VA_CHIPID); | 337 | exynos_init_io(NULL, 0); |
| 337 | s3c24xx_init_clocks(24000000); | 338 | s3c24xx_init_clocks(24000000); |
| 338 | s3c24xx_init_uarts(smdkv310_uartcfgs, ARRAY_SIZE(smdkv310_uartcfgs)); | 339 | s3c24xx_init_uarts(smdkv310_uartcfgs, ARRAY_SIZE(smdkv310_uartcfgs)); |
| 339 | } | 340 | } |
| @@ -380,6 +381,7 @@ MACHINE_START(SMDKV310, "SMDKV310") | |||
| 380 | .init_machine = smdkv310_machine_init, | 381 | .init_machine = smdkv310_machine_init, |
| 381 | .timer = &exynos4_timer, | 382 | .timer = &exynos4_timer, |
| 382 | .reserve = &smdkv310_reserve, | 383 | .reserve = &smdkv310_reserve, |
| 384 | .restart = exynos4_restart, | ||
| 383 | MACHINE_END | 385 | MACHINE_END |
| 384 | 386 | ||
| 385 | MACHINE_START(SMDKC210, "SMDKC210") | 387 | MACHINE_START(SMDKC210, "SMDKC210") |
| @@ -390,4 +392,5 @@ MACHINE_START(SMDKC210, "SMDKC210") | |||
| 390 | .handle_irq = gic_handle_irq, | 392 | .handle_irq = gic_handle_irq, |
| 391 | .init_machine = smdkv310_machine_init, | 393 | .init_machine = smdkv310_machine_init, |
| 392 | .timer = &exynos4_timer, | 394 | .timer = &exynos4_timer, |
| 395 | .restart = exynos4_restart, | ||
| 393 | MACHINE_END | 396 | MACHINE_END |
diff --git a/arch/arm/mach-exynos/mach-universal_c210.c b/arch/arm/mach-exynos/mach-universal_c210.c index cfc7d5076f5..52aea972746 100644 --- a/arch/arm/mach-exynos/mach-universal_c210.c +++ b/arch/arm/mach-exynos/mach-universal_c210.c | |||
| @@ -28,7 +28,6 @@ | |||
| 28 | #include <asm/mach-types.h> | 28 | #include <asm/mach-types.h> |
| 29 | 29 | ||
| 30 | #include <plat/regs-serial.h> | 30 | #include <plat/regs-serial.h> |
| 31 | #include <plat/exynos4.h> | ||
| 32 | #include <plat/cpu.h> | 31 | #include <plat/cpu.h> |
| 33 | #include <plat/devs.h> | 32 | #include <plat/devs.h> |
| 34 | #include <plat/iic.h> | 33 | #include <plat/iic.h> |
| @@ -48,6 +47,8 @@ | |||
| 48 | #include <media/s5p_fimc.h> | 47 | #include <media/s5p_fimc.h> |
| 49 | #include <media/m5mols.h> | 48 | #include <media/m5mols.h> |
| 50 | 49 | ||
| 50 | #include "common.h" | ||
| 51 | |||
| 51 | /* Following are default values for UCON, ULCON and UFCON UART registers */ | 52 | /* Following are default values for UCON, ULCON and UFCON UART registers */ |
| 52 | #define UNIVERSAL_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ | 53 | #define UNIVERSAL_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ |
| 53 | S3C2410_UCON_RXILEVEL | \ | 54 | S3C2410_UCON_RXILEVEL | \ |
| @@ -993,7 +994,7 @@ static struct platform_device *universal_devices[] __initdata = { | |||
| 993 | 994 | ||
| 994 | static void __init universal_map_io(void) | 995 | static void __init universal_map_io(void) |
| 995 | { | 996 | { |
| 996 | s5p_init_io(NULL, 0, S5P_VA_CHIPID); | 997 | exynos_init_io(NULL, 0); |
| 997 | s3c24xx_init_clocks(24000000); | 998 | s3c24xx_init_clocks(24000000); |
| 998 | s3c24xx_init_uarts(universal_uartcfgs, ARRAY_SIZE(universal_uartcfgs)); | 999 | s3c24xx_init_uarts(universal_uartcfgs, ARRAY_SIZE(universal_uartcfgs)); |
| 999 | } | 1000 | } |
| @@ -1063,4 +1064,5 @@ MACHINE_START(UNIVERSAL_C210, "UNIVERSAL_C210") | |||
| 1063 | .init_machine = universal_machine_init, | 1064 | .init_machine = universal_machine_init, |
| 1064 | .timer = &exynos4_timer, | 1065 | .timer = &exynos4_timer, |
| 1065 | .reserve = &universal_reserve, | 1066 | .reserve = &universal_reserve, |
| 1067 | .restart = exynos4_restart, | ||
| 1066 | MACHINE_END | 1068 | MACHINE_END |
diff --git a/arch/arm/mach-exynos/mct.c b/arch/arm/mach-exynos/mct.c index 97343df8f13..85b5527d091 100644 --- a/arch/arm/mach-exynos/mct.c +++ b/arch/arm/mach-exynos/mct.c | |||
| @@ -44,8 +44,6 @@ struct mct_clock_event_device { | |||
| 44 | char name[10]; | 44 | char name[10]; |
| 45 | }; | 45 | }; |
| 46 | 46 | ||
| 47 | static DEFINE_PER_CPU(struct mct_clock_event_device, percpu_mct_tick); | ||
| 48 | |||
| 49 | static void exynos4_mct_write(unsigned int value, void *addr) | 47 | static void exynos4_mct_write(unsigned int value, void *addr) |
| 50 | { | 48 | { |
| 51 | void __iomem *stat_addr; | 49 | void __iomem *stat_addr; |
| @@ -264,6 +262,9 @@ static void exynos4_clockevent_init(void) | |||
| 264 | } | 262 | } |
| 265 | 263 | ||
| 266 | #ifdef CONFIG_LOCAL_TIMERS | 264 | #ifdef CONFIG_LOCAL_TIMERS |
| 265 | |||
| 266 | static DEFINE_PER_CPU(struct mct_clock_event_device, percpu_mct_tick); | ||
| 267 | |||
| 267 | /* Clock event handling */ | 268 | /* Clock event handling */ |
| 268 | static void exynos4_mct_tick_stop(struct mct_clock_event_device *mevt) | 269 | static void exynos4_mct_tick_stop(struct mct_clock_event_device *mevt) |
| 269 | { | 270 | { |
| @@ -428,9 +429,13 @@ int __cpuinit local_timer_setup(struct clock_event_device *evt) | |||
| 428 | 429 | ||
| 429 | void local_timer_stop(struct clock_event_device *evt) | 430 | void local_timer_stop(struct clock_event_device *evt) |
| 430 | { | 431 | { |
| 432 | unsigned int cpu = smp_processor_id(); | ||
| 431 | evt->set_mode(CLOCK_EVT_MODE_UNUSED, evt); | 433 | evt->set_mode(CLOCK_EVT_MODE_UNUSED, evt); |
| 432 | if (mct_int_type == MCT_INT_SPI) | 434 | if (mct_int_type == MCT_INT_SPI) |
| 433 | disable_irq(evt->irq); | 435 | if (cpu == 0) |
| 436 | remove_irq(evt->irq, &mct_tick0_event_irq); | ||
| 437 | else | ||
| 438 | remove_irq(evt->irq, &mct_tick1_event_irq); | ||
| 434 | else | 439 | else |
| 435 | disable_percpu_irq(IRQ_MCT_LOCALTIMER); | 440 | disable_percpu_irq(IRQ_MCT_LOCALTIMER); |
| 436 | } | 441 | } |
| @@ -443,6 +448,7 @@ static void __init exynos4_timer_resources(void) | |||
| 443 | 448 | ||
| 444 | clk_rate = clk_get_rate(mct_clk); | 449 | clk_rate = clk_get_rate(mct_clk); |
| 445 | 450 | ||
| 451 | #ifdef CONFIG_LOCAL_TIMERS | ||
| 446 | if (mct_int_type == MCT_INT_PPI) { | 452 | if (mct_int_type == MCT_INT_PPI) { |
| 447 | int err; | 453 | int err; |
| 448 | 454 | ||
| @@ -452,6 +458,7 @@ static void __init exynos4_timer_resources(void) | |||
| 452 | WARN(err, "MCT: can't request IRQ %d (%d)\n", | 458 | WARN(err, "MCT: can't request IRQ %d (%d)\n", |
| 453 | IRQ_MCT_LOCALTIMER, err); | 459 | IRQ_MCT_LOCALTIMER, err); |
| 454 | } | 460 | } |
| 461 | #endif /* CONFIG_LOCAL_TIMERS */ | ||
| 455 | } | 462 | } |
| 456 | 463 | ||
| 457 | static void __init exynos4_timer_init(void) | 464 | static void __init exynos4_timer_init(void) |
diff --git a/arch/arm/mach-footbridge/cats-hw.c b/arch/arm/mach-footbridge/cats-hw.c index 60b6774e1ea..25b453601ac 100644 --- a/arch/arm/mach-footbridge/cats-hw.c +++ b/arch/arm/mach-footbridge/cats-hw.c | |||
| @@ -91,4 +91,5 @@ MACHINE_START(CATS, "Chalice-CATS") | |||
| 91 | .map_io = footbridge_map_io, | 91 | .map_io = footbridge_map_io, |
| 92 | .init_irq = footbridge_init_irq, | 92 | .init_irq = footbridge_init_irq, |
| 93 | .timer = &isa_timer, | 93 | .timer = &isa_timer, |
| 94 | .restart = footbridge_restart, | ||
| 94 | MACHINE_END | 95 | MACHINE_END |
diff --git a/arch/arm/mach-footbridge/common.c b/arch/arm/mach-footbridge/common.c index 38a44f9b9da..41978ee4f9d 100644 --- a/arch/arm/mach-footbridge/common.c +++ b/arch/arm/mach-footbridge/common.c | |||
| @@ -199,6 +199,33 @@ void __init footbridge_map_io(void) | |||
| 199 | iotable_init(ebsa285_host_io_desc, ARRAY_SIZE(ebsa285_host_io_desc)); | 199 | iotable_init(ebsa285_host_io_desc, ARRAY_SIZE(ebsa285_host_io_desc)); |
| 200 | } | 200 | } |
| 201 | 201 | ||
| 202 | void footbridge_restart(char mode, const char *cmd) | ||
| 203 | { | ||
| 204 | if (mode == 's') { | ||
| 205 | /* Jump into the ROM */ | ||
| 206 | soft_restart(0x41000000); | ||
| 207 | } else { | ||
| 208 | /* | ||
| 209 | * Force the watchdog to do a CPU reset. | ||
| 210 | * | ||
| 211 | * After making sure that the watchdog is disabled | ||
| 212 | * (so we can change the timer registers) we first | ||
| 213 | * enable the timer to autoreload itself. Next, the | ||
| 214 | * timer interval is set really short and any | ||
| 215 | * current interrupt request is cleared (so we can | ||
| 216 | * see an edge transition). Finally, TIMER4 is | ||
| 217 | * enabled as the watchdog. | ||
| 218 | */ | ||
| 219 | *CSR_SA110_CNTL &= ~(1 << 13); | ||
| 220 | *CSR_TIMER4_CNTL = TIMER_CNTL_ENABLE | | ||
| 221 | TIMER_CNTL_AUTORELOAD | | ||
| 222 | TIMER_CNTL_DIV16; | ||
| 223 | *CSR_TIMER4_LOAD = 0x2; | ||
| 224 | *CSR_TIMER4_CLR = 0; | ||
| 225 | *CSR_SA110_CNTL |= (1 << 13); | ||
| 226 | } | ||
| 227 | } | ||
| 228 | |||
| 202 | #ifdef CONFIG_FOOTBRIDGE_ADDIN | 229 | #ifdef CONFIG_FOOTBRIDGE_ADDIN |
| 203 | 230 | ||
| 204 | static inline unsigned long fb_bus_sdram_offset(void) | 231 | static inline unsigned long fb_bus_sdram_offset(void) |
diff --git a/arch/arm/mach-footbridge/common.h b/arch/arm/mach-footbridge/common.h index b05e662d21a..c9767b892cb 100644 --- a/arch/arm/mach-footbridge/common.h +++ b/arch/arm/mach-footbridge/common.h | |||
| @@ -8,3 +8,4 @@ extern void footbridge_map_io(void); | |||
| 8 | extern void footbridge_init_irq(void); | 8 | extern void footbridge_init_irq(void); |
| 9 | 9 | ||
| 10 | extern void isa_init_irq(unsigned int irq); | 10 | extern void isa_init_irq(unsigned int irq); |
| 11 | extern void footbridge_restart(char, const char *); | ||
diff --git a/arch/arm/mach-footbridge/ebsa285.c b/arch/arm/mach-footbridge/ebsa285.c index 012210cf7d1..27716a7e5fc 100644 --- a/arch/arm/mach-footbridge/ebsa285.c +++ b/arch/arm/mach-footbridge/ebsa285.c | |||
| @@ -21,5 +21,6 @@ MACHINE_START(EBSA285, "EBSA285") | |||
| 21 | .map_io = footbridge_map_io, | 21 | .map_io = footbridge_map_io, |
| 22 | .init_irq = footbridge_init_irq, | 22 | .init_irq = footbridge_init_irq, |
| 23 | .timer = &footbridge_timer, | 23 | .timer = &footbridge_timer, |
| 24 | .restart = footbridge_restart, | ||
| 24 | MACHINE_END | 25 | MACHINE_END |
| 25 | 26 | ||
diff --git a/arch/arm/mach-footbridge/include/mach/system.h b/arch/arm/mach-footbridge/include/mach/system.h index 249f895910f..a174a5841bc 100644 --- a/arch/arm/mach-footbridge/include/mach/system.h +++ b/arch/arm/mach-footbridge/include/mach/system.h | |||
| @@ -7,63 +7,7 @@ | |||
| 7 | * it under the terms of the GNU General Public License version 2 as | 7 | * it under the terms of the GNU General Public License version 2 as |
| 8 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
| 9 | */ | 9 | */ |
| 10 | #include <linux/io.h> | ||
| 11 | #include <asm/hardware/dec21285.h> | ||
| 12 | #include <mach/hardware.h> | ||
| 13 | #include <asm/leds.h> | ||
| 14 | #include <asm/mach-types.h> | ||
| 15 | |||
| 16 | static inline void arch_idle(void) | 10 | static inline void arch_idle(void) |
| 17 | { | 11 | { |
| 18 | cpu_do_idle(); | 12 | cpu_do_idle(); |
| 19 | } | 13 | } |
| 20 | |||
| 21 | static inline void arch_reset(char mode, const char *cmd) | ||
| 22 | { | ||
| 23 | if (mode == 's') { | ||
| 24 | /* | ||
| 25 | * Jump into the ROM | ||
| 26 | */ | ||
| 27 | soft_restart(0x41000000); | ||
| 28 | } else { | ||
| 29 | if (machine_is_netwinder()) { | ||
| 30 | /* open up the SuperIO chip | ||
| 31 | */ | ||
| 32 | outb(0x87, 0x370); | ||
| 33 | outb(0x87, 0x370); | ||
| 34 | |||
| 35 | /* aux function group 1 (logical device 7) | ||
| 36 | */ | ||
| 37 | outb(0x07, 0x370); | ||
| 38 | outb(0x07, 0x371); | ||
| 39 | |||
| 40 | /* set GP16 for WD-TIMER output | ||
| 41 | */ | ||
| 42 | outb(0xe6, 0x370); | ||
| 43 | outb(0x00, 0x371); | ||
| 44 | |||
| 45 | /* set a RED LED and toggle WD_TIMER for rebooting | ||
| 46 | */ | ||
| 47 | outb(0xc4, 0x338); | ||
| 48 | } else { | ||
| 49 | /* | ||
| 50 | * Force the watchdog to do a CPU reset. | ||
| 51 | * | ||
| 52 | * After making sure that the watchdog is disabled | ||
| 53 | * (so we can change the timer registers) we first | ||
| 54 | * enable the timer to autoreload itself. Next, the | ||
| 55 | * timer interval is set really short and any | ||
| 56 | * current interrupt request is cleared (so we can | ||
| 57 | * see an edge transition). Finally, TIMER4 is | ||
| 58 | * enabled as the watchdog. | ||
| 59 | */ | ||
| 60 | *CSR_SA110_CNTL &= ~(1 << 13); | ||
| 61 | *CSR_TIMER4_CNTL = TIMER_CNTL_ENABLE | | ||
| 62 | TIMER_CNTL_AUTORELOAD | | ||
| 63 | TIMER_CNTL_DIV16; | ||
| 64 | *CSR_TIMER4_LOAD = 0x2; | ||
| 65 | *CSR_TIMER4_CLR = 0; | ||
| 66 | *CSR_SA110_CNTL |= (1 << 13); | ||
| 67 | } | ||
| 68 | } | ||
| 69 | } | ||
diff --git a/arch/arm/mach-footbridge/netwinder-hw.c b/arch/arm/mach-footbridge/netwinder-hw.c index 0d3846f3b60..80a1c5cc907 100644 --- a/arch/arm/mach-footbridge/netwinder-hw.c +++ b/arch/arm/mach-footbridge/netwinder-hw.c | |||
| @@ -645,6 +645,32 @@ fixup_netwinder(struct tag *tags, char **cmdline, struct meminfo *mi) | |||
| 645 | #endif | 645 | #endif |
| 646 | } | 646 | } |
| 647 | 647 | ||
| 648 | static void netwinder_restart(char mode, const char *cmd) | ||
| 649 | { | ||
| 650 | if (mode == 's') { | ||
| 651 | /* Jump into the ROM */ | ||
| 652 | soft_restart(0x41000000); | ||
| 653 | } else { | ||
| 654 | local_irq_disable(); | ||
| 655 | local_fiq_disable(); | ||
| 656 | |||
| 657 | /* open up the SuperIO chip */ | ||
| 658 | outb(0x87, 0x370); | ||
| 659 | outb(0x87, 0x370); | ||
| 660 | |||
| 661 | /* aux function group 1 (logical device 7) */ | ||
| 662 | outb(0x07, 0x370); | ||
| 663 | outb(0x07, 0x371); | ||
| 664 | |||
| 665 | /* set GP16 for WD-TIMER output */ | ||
| 666 | outb(0xe6, 0x370); | ||
| 667 | outb(0x00, 0x371); | ||
| 668 | |||
| 669 | /* set a RED LED and toggle WD_TIMER for rebooting */ | ||
| 670 | outb(0xc4, 0x338); | ||
| 671 | } | ||
| 672 | } | ||
| 673 | |||
| 648 | MACHINE_START(NETWINDER, "Rebel-NetWinder") | 674 | MACHINE_START(NETWINDER, "Rebel-NetWinder") |
| 649 | /* Maintainer: Russell King/Rebel.com */ | 675 | /* Maintainer: Russell King/Rebel.com */ |
| 650 | .atag_offset = 0x100, | 676 | .atag_offset = 0x100, |
| @@ -656,4 +682,5 @@ MACHINE_START(NETWINDER, "Rebel-NetWinder") | |||
| 656 | .map_io = footbridge_map_io, | 682 | .map_io = footbridge_map_io, |
| 657 | .init_irq = footbridge_init_irq, | 683 | .init_irq = footbridge_init_irq, |
| 658 | .timer = &isa_timer, | 684 | .timer = &isa_timer, |
| 685 | .restart = netwinder_restart, | ||
| 659 | MACHINE_END | 686 | MACHINE_END |
diff --git a/arch/arm/mach-footbridge/personal.c b/arch/arm/mach-footbridge/personal.c index f41dba39b32..e1e9990fa95 100644 --- a/arch/arm/mach-footbridge/personal.c +++ b/arch/arm/mach-footbridge/personal.c | |||
| @@ -19,5 +19,6 @@ MACHINE_START(PERSONAL_SERVER, "Compaq-PersonalServer") | |||
| 19 | .map_io = footbridge_map_io, | 19 | .map_io = footbridge_map_io, |
| 20 | .init_irq = footbridge_init_irq, | 20 | .init_irq = footbridge_init_irq, |
| 21 | .timer = &footbridge_timer, | 21 | .timer = &footbridge_timer, |
| 22 | .restart = footbridge_restart, | ||
| 22 | MACHINE_END | 23 | MACHINE_END |
| 23 | 24 | ||
diff --git a/arch/arm/mach-h720x/common.c b/arch/arm/mach-h720x/common.c index 51d4e44ab97..f8a2f6bb548 100644 --- a/arch/arm/mach-h720x/common.c +++ b/arch/arm/mach-h720x/common.c | |||
| @@ -242,3 +242,8 @@ void __init h720x_map_io(void) | |||
| 242 | { | 242 | { |
| 243 | iotable_init(h720x_io_desc,ARRAY_SIZE(h720x_io_desc)); | 243 | iotable_init(h720x_io_desc,ARRAY_SIZE(h720x_io_desc)); |
| 244 | } | 244 | } |
| 245 | |||
| 246 | void h720x_restart(char mode, const char *cmd) | ||
| 247 | { | ||
| 248 | CPU_REG (PMU_BASE, PMU_STAT) |= PMU_WARMRESET; | ||
| 249 | } | ||
diff --git a/arch/arm/mach-h720x/common.h b/arch/arm/mach-h720x/common.h index 7dd5fa604ef..2489537d33d 100644 --- a/arch/arm/mach-h720x/common.h +++ b/arch/arm/mach-h720x/common.h | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | extern unsigned long h720x_gettimeoffset(void); | 16 | extern unsigned long h720x_gettimeoffset(void); |
| 17 | extern void __init h720x_init_irq(void); | 17 | extern void __init h720x_init_irq(void); |
| 18 | extern void __init h720x_map_io(void); | 18 | extern void __init h720x_map_io(void); |
| 19 | extern void h720x_restart(char, const char *); | ||
| 19 | 20 | ||
| 20 | #ifdef CONFIG_ARCH_H7202 | 21 | #ifdef CONFIG_ARCH_H7202 |
| 21 | extern struct sys_timer h7202_timer; | 22 | extern struct sys_timer h7202_timer; |
diff --git a/arch/arm/mach-h720x/h7201-eval.c b/arch/arm/mach-h720x/h7201-eval.c index 9886f19805f..5fdb20c855e 100644 --- a/arch/arm/mach-h720x/h7201-eval.c +++ b/arch/arm/mach-h720x/h7201-eval.c | |||
| @@ -34,4 +34,5 @@ MACHINE_START(H7201, "Hynix GMS30C7201") | |||
| 34 | .init_irq = h720x_init_irq, | 34 | .init_irq = h720x_init_irq, |
| 35 | .timer = &h7201_timer, | 35 | .timer = &h7201_timer, |
| 36 | .dma_zone_size = SZ_256M, | 36 | .dma_zone_size = SZ_256M, |
| 37 | .restart = h720x_restart, | ||
| 37 | MACHINE_END | 38 | MACHINE_END |
diff --git a/arch/arm/mach-h720x/h7202-eval.c b/arch/arm/mach-h720x/h7202-eval.c index 284a134819e..169673036c5 100644 --- a/arch/arm/mach-h720x/h7202-eval.c +++ b/arch/arm/mach-h720x/h7202-eval.c | |||
| @@ -77,4 +77,5 @@ MACHINE_START(H7202, "Hynix HMS30C7202") | |||
| 77 | .timer = &h7202_timer, | 77 | .timer = &h7202_timer, |
| 78 | .init_machine = init_eval_h7202, | 78 | .init_machine = init_eval_h7202, |
| 79 | .dma_zone_size = SZ_256M, | 79 | .dma_zone_size = SZ_256M, |
| 80 | .restart = h720x_restart, | ||
| 80 | MACHINE_END | 81 | MACHINE_END |
diff --git a/arch/arm/mach-h720x/include/mach/system.h b/arch/arm/mach-h720x/include/mach/system.h index a708d24ee46..16ac46e239a 100644 --- a/arch/arm/mach-h720x/include/mach/system.h +++ b/arch/arm/mach-h720x/include/mach/system.h | |||
| @@ -24,10 +24,4 @@ static void arch_idle(void) | |||
| 24 | nop(); | 24 | nop(); |
| 25 | } | 25 | } |
| 26 | 26 | ||
| 27 | |||
| 28 | static __inline__ void arch_reset(char mode, const char *cmd) | ||
| 29 | { | ||
| 30 | CPU_REG (PMU_BASE, PMU_STAT) |= PMU_WARMRESET; | ||
| 31 | } | ||
| 32 | |||
| 33 | #endif | 27 | #endif |
diff --git a/arch/arm/mach-highbank/core.h b/arch/arm/mach-highbank/core.h index 7e33fc94cd1..d8e2d0be64a 100644 --- a/arch/arm/mach-highbank/core.h +++ b/arch/arm/mach-highbank/core.h | |||
| @@ -1,5 +1,6 @@ | |||
| 1 | extern void highbank_set_cpu_jump(int cpu, void *jump_addr); | 1 | extern void highbank_set_cpu_jump(int cpu, void *jump_addr); |
| 2 | extern void highbank_clocks_init(void); | 2 | extern void highbank_clocks_init(void); |
| 3 | extern void highbank_restart(char, const char *); | ||
| 3 | extern void __iomem *scu_base_addr; | 4 | extern void __iomem *scu_base_addr; |
| 4 | #ifdef CONFIG_DEBUG_HIGHBANK_UART | 5 | #ifdef CONFIG_DEBUG_HIGHBANK_UART |
| 5 | extern void highbank_lluart_map_io(void); | 6 | extern void highbank_lluart_map_io(void); |
diff --git a/arch/arm/mach-highbank/highbank.c b/arch/arm/mach-highbank/highbank.c index 7266dd510f1..804c4a55f80 100644 --- a/arch/arm/mach-highbank/highbank.c +++ b/arch/arm/mach-highbank/highbank.c | |||
| @@ -147,4 +147,5 @@ DT_MACHINE_START(HIGHBANK, "Highbank") | |||
| 147 | .handle_irq = gic_handle_irq, | 147 | .handle_irq = gic_handle_irq, |
| 148 | .init_machine = highbank_init, | 148 | .init_machine = highbank_init, |
| 149 | .dt_compat = highbank_match, | 149 | .dt_compat = highbank_match, |
| 150 | .restart = highbank_restart, | ||
| 150 | MACHINE_END | 151 | MACHINE_END |
diff --git a/arch/arm/mach-highbank/include/mach/system.h b/arch/arm/mach-highbank/include/mach/system.h index 7e8192296ca..b1d8b5fbe37 100644 --- a/arch/arm/mach-highbank/include/mach/system.h +++ b/arch/arm/mach-highbank/include/mach/system.h | |||
| @@ -21,6 +21,4 @@ static inline void arch_idle(void) | |||
| 21 | cpu_do_idle(); | 21 | cpu_do_idle(); |
| 22 | } | 22 | } |
| 23 | 23 | ||
| 24 | extern void arch_reset(char mode, const char *cmd); | ||
| 25 | |||
| 26 | #endif | 24 | #endif |
diff --git a/arch/arm/mach-highbank/system.c b/arch/arm/mach-highbank/system.c index 53f0c4c5ef1..82c27230d4a 100644 --- a/arch/arm/mach-highbank/system.c +++ b/arch/arm/mach-highbank/system.c | |||
| @@ -20,7 +20,7 @@ | |||
| 20 | #include "core.h" | 20 | #include "core.h" |
| 21 | #include "sysregs.h" | 21 | #include "sysregs.h" |
| 22 | 22 | ||
| 23 | void arch_reset(char mode, const char *cmd) | 23 | void highbank_restart(char mode, const char *cmd) |
| 24 | { | 24 | { |
| 25 | if (mode == 'h') | 25 | if (mode == 'h') |
| 26 | hignbank_set_pwr_hard_reset(); | 26 | hignbank_set_pwr_hard_reset(); |
diff --git a/arch/arm/mach-imx/clock-imx6q.c b/arch/arm/mach-imx/clock-imx6q.c index 039a7abb165..9273c2a24b5 100644 --- a/arch/arm/mach-imx/clock-imx6q.c +++ b/arch/arm/mach-imx/clock-imx6q.c | |||
| @@ -1931,14 +1931,12 @@ int imx6q_set_lpm(enum mxc_cpu_pwr_mode mode) | |||
| 1931 | val |= 0x1 << BP_CLPCR_LPM; | 1931 | val |= 0x1 << BP_CLPCR_LPM; |
| 1932 | val &= ~BM_CLPCR_VSTBY; | 1932 | val &= ~BM_CLPCR_VSTBY; |
| 1933 | val &= ~BM_CLPCR_SBYOS; | 1933 | val &= ~BM_CLPCR_SBYOS; |
| 1934 | val |= BM_CLPCR_BYP_MMDC_CH1_LPM_HS; | ||
| 1935 | break; | 1934 | break; |
| 1936 | case STOP_POWER_OFF: | 1935 | case STOP_POWER_OFF: |
| 1937 | val |= 0x2 << BP_CLPCR_LPM; | 1936 | val |= 0x2 << BP_CLPCR_LPM; |
| 1938 | val |= 0x3 << BP_CLPCR_STBY_COUNT; | 1937 | val |= 0x3 << BP_CLPCR_STBY_COUNT; |
| 1939 | val |= BM_CLPCR_VSTBY; | 1938 | val |= BM_CLPCR_VSTBY; |
| 1940 | val |= BM_CLPCR_SBYOS; | 1939 | val |= BM_CLPCR_SBYOS; |
| 1941 | val |= BM_CLPCR_BYP_MMDC_CH1_LPM_HS; | ||
| 1942 | break; | 1940 | break; |
| 1943 | default: | 1941 | default: |
| 1944 | return -EINVAL; | 1942 | return -EINVAL; |
diff --git a/arch/arm/mach-imx/mach-apf9328.c b/arch/arm/mach-imx/mach-apf9328.c index 1e486e67dab..146a4f07346 100644 --- a/arch/arm/mach-imx/mach-apf9328.c +++ b/arch/arm/mach-imx/mach-apf9328.c | |||
| @@ -139,4 +139,5 @@ MACHINE_START(APF9328, "Armadeus APF9328") | |||
| 139 | .handle_irq = imx1_handle_irq, | 139 | .handle_irq = imx1_handle_irq, |
| 140 | .timer = &apf9328_timer, | 140 | .timer = &apf9328_timer, |
| 141 | .init_machine = apf9328_init, | 141 | .init_machine = apf9328_init, |
| 142 | .restart = mxc_restart, | ||
| 142 | MACHINE_END | 143 | MACHINE_END |
diff --git a/arch/arm/mach-imx/mach-armadillo5x0.c b/arch/arm/mach-imx/mach-armadillo5x0.c index c9a9cf67755..e4f426a0989 100644 --- a/arch/arm/mach-imx/mach-armadillo5x0.c +++ b/arch/arm/mach-imx/mach-armadillo5x0.c | |||
| @@ -561,4 +561,5 @@ MACHINE_START(ARMADILLO5X0, "Armadillo-500") | |||
| 561 | .handle_irq = imx31_handle_irq, | 561 | .handle_irq = imx31_handle_irq, |
| 562 | .timer = &armadillo5x0_timer, | 562 | .timer = &armadillo5x0_timer, |
| 563 | .init_machine = armadillo5x0_init, | 563 | .init_machine = armadillo5x0_init, |
| 564 | .restart = mxc_restart, | ||
| 564 | MACHINE_END | 565 | MACHINE_END |
diff --git a/arch/arm/mach-imx/mach-bug.c b/arch/arm/mach-imx/mach-bug.c index 313f62ddc1e..9a9897749dd 100644 --- a/arch/arm/mach-imx/mach-bug.c +++ b/arch/arm/mach-imx/mach-bug.c | |||
| @@ -65,4 +65,5 @@ MACHINE_START(BUG, "BugLabs BUGBase") | |||
| 65 | .handle_irq = imx31_handle_irq, | 65 | .handle_irq = imx31_handle_irq, |
| 66 | .timer = &bug_timer, | 66 | .timer = &bug_timer, |
| 67 | .init_machine = bug_board_init, | 67 | .init_machine = bug_board_init, |
| 68 | .restart = mxc_restart, | ||
| 68 | MACHINE_END | 69 | MACHINE_END |
diff --git a/arch/arm/mach-imx/mach-cpuimx27.c b/arch/arm/mach-imx/mach-cpuimx27.c index edb37305257..d085aea0870 100644 --- a/arch/arm/mach-imx/mach-cpuimx27.c +++ b/arch/arm/mach-imx/mach-cpuimx27.c | |||
| @@ -318,4 +318,5 @@ MACHINE_START(EUKREA_CPUIMX27, "EUKREA CPUIMX27") | |||
| 318 | .handle_irq = imx27_handle_irq, | 318 | .handle_irq = imx27_handle_irq, |
| 319 | .timer = &eukrea_cpuimx27_timer, | 319 | .timer = &eukrea_cpuimx27_timer, |
| 320 | .init_machine = eukrea_cpuimx27_init, | 320 | .init_machine = eukrea_cpuimx27_init, |
| 321 | .restart = mxc_restart, | ||
| 321 | MACHINE_END | 322 | MACHINE_END |
diff --git a/arch/arm/mach-imx/mach-cpuimx35.c b/arch/arm/mach-imx/mach-cpuimx35.c index 66af2e8f7e5..012e120509e 100644 --- a/arch/arm/mach-imx/mach-cpuimx35.c +++ b/arch/arm/mach-imx/mach-cpuimx35.c | |||
| @@ -201,4 +201,5 @@ MACHINE_START(EUKREA_CPUIMX35SD, "Eukrea CPUIMX35") | |||
| 201 | .handle_irq = imx35_handle_irq, | 201 | .handle_irq = imx35_handle_irq, |
| 202 | .timer = &eukrea_cpuimx35_timer, | 202 | .timer = &eukrea_cpuimx35_timer, |
| 203 | .init_machine = eukrea_cpuimx35_init, | 203 | .init_machine = eukrea_cpuimx35_init, |
| 204 | .restart = mxc_restart, | ||
| 204 | MACHINE_END | 205 | MACHINE_END |
diff --git a/arch/arm/mach-imx/mach-eukrea_cpuimx25.c b/arch/arm/mach-imx/mach-eukrea_cpuimx25.c index ab8fbcc472b..76a97a598b9 100644 --- a/arch/arm/mach-imx/mach-eukrea_cpuimx25.c +++ b/arch/arm/mach-imx/mach-eukrea_cpuimx25.c | |||
| @@ -170,4 +170,5 @@ MACHINE_START(EUKREA_CPUIMX25SD, "Eukrea CPUIMX25") | |||
| 170 | .handle_irq = imx25_handle_irq, | 170 | .handle_irq = imx25_handle_irq, |
| 171 | .timer = &eukrea_cpuimx25_timer, | 171 | .timer = &eukrea_cpuimx25_timer, |
| 172 | .init_machine = eukrea_cpuimx25_init, | 172 | .init_machine = eukrea_cpuimx25_init, |
| 173 | .restart = mxc_restart, | ||
| 173 | MACHINE_END | 174 | MACHINE_END |
diff --git a/arch/arm/mach-imx/mach-imx27_visstrim_m10.c b/arch/arm/mach-imx/mach-imx27_visstrim_m10.c index 38eb9e45110..c2766ae02b4 100644 --- a/arch/arm/mach-imx/mach-imx27_visstrim_m10.c +++ b/arch/arm/mach-imx/mach-imx27_visstrim_m10.c | |||
| @@ -282,4 +282,5 @@ MACHINE_START(IMX27_VISSTRIM_M10, "Vista Silicon Visstrim_M10") | |||
| 282 | .handle_irq = imx27_handle_irq, | 282 | .handle_irq = imx27_handle_irq, |
| 283 | .timer = &visstrim_m10_timer, | 283 | .timer = &visstrim_m10_timer, |
| 284 | .init_machine = visstrim_m10_board_init, | 284 | .init_machine = visstrim_m10_board_init, |
| 285 | .restart = mxc_restart, | ||
| 285 | MACHINE_END | 286 | MACHINE_END |
diff --git a/arch/arm/mach-imx/mach-imx27ipcam.c b/arch/arm/mach-imx/mach-imx27ipcam.c index 7052155d055..c9d350c5dcc 100644 --- a/arch/arm/mach-imx/mach-imx27ipcam.c +++ b/arch/arm/mach-imx/mach-imx27ipcam.c | |||
| @@ -78,4 +78,5 @@ MACHINE_START(IMX27IPCAM, "Freescale IMX27IPCAM") | |||
| 78 | .handle_irq = imx27_handle_irq, | 78 | .handle_irq = imx27_handle_irq, |
| 79 | .timer = &mx27ipcam_timer, | 79 | .timer = &mx27ipcam_timer, |
| 80 | .init_machine = mx27ipcam_init, | 80 | .init_machine = mx27ipcam_init, |
| 81 | .restart = mxc_restart, | ||
| 81 | MACHINE_END | 82 | MACHINE_END |
diff --git a/arch/arm/mach-imx/mach-imx27lite.c b/arch/arm/mach-imx/mach-imx27lite.c index 8d6a63521f1..1f45b918922 100644 --- a/arch/arm/mach-imx/mach-imx27lite.c +++ b/arch/arm/mach-imx/mach-imx27lite.c | |||
| @@ -84,4 +84,5 @@ MACHINE_START(IMX27LITE, "LogicPD i.MX27LITE") | |||
| 84 | .handle_irq = imx27_handle_irq, | 84 | .handle_irq = imx27_handle_irq, |
| 85 | .timer = &mx27lite_timer, | 85 | .timer = &mx27lite_timer, |
| 86 | .init_machine = mx27lite_init, | 86 | .init_machine = mx27lite_init, |
| 87 | .restart = mxc_restart, | ||
| 87 | MACHINE_END | 88 | MACHINE_END |
diff --git a/arch/arm/mach-imx/mach-imx6q.c b/arch/arm/mach-imx/mach-imx6q.c index 8deb012189b..05b49bb5d67 100644 --- a/arch/arm/mach-imx/mach-imx6q.c +++ b/arch/arm/mach-imx/mach-imx6q.c | |||
| @@ -10,10 +10,13 @@ | |||
| 10 | * http://www.gnu.org/copyleft/gpl.html | 10 | * http://www.gnu.org/copyleft/gpl.html |
| 11 | */ | 11 | */ |
| 12 | 12 | ||
| 13 | #include <linux/delay.h> | ||
| 13 | #include <linux/init.h> | 14 | #include <linux/init.h> |
| 15 | #include <linux/io.h> | ||
| 14 | #include <linux/irq.h> | 16 | #include <linux/irq.h> |
| 15 | #include <linux/irqdomain.h> | 17 | #include <linux/irqdomain.h> |
| 16 | #include <linux/of.h> | 18 | #include <linux/of.h> |
| 19 | #include <linux/of_address.h> | ||
| 17 | #include <linux/of_irq.h> | 20 | #include <linux/of_irq.h> |
| 18 | #include <linux/of_platform.h> | 21 | #include <linux/of_platform.h> |
| 19 | #include <asm/hardware/cache-l2x0.h> | 22 | #include <asm/hardware/cache-l2x0.h> |
| @@ -23,6 +26,36 @@ | |||
| 23 | #include <mach/common.h> | 26 | #include <mach/common.h> |
| 24 | #include <mach/hardware.h> | 27 | #include <mach/hardware.h> |
| 25 | 28 | ||
| 29 | void imx6q_restart(char mode, const char *cmd) | ||
| 30 | { | ||
| 31 | struct device_node *np; | ||
| 32 | void __iomem *wdog_base; | ||
| 33 | |||
| 34 | np = of_find_compatible_node(NULL, NULL, "fsl,imx6q-wdt"); | ||
| 35 | wdog_base = of_iomap(np, 0); | ||
| 36 | if (!wdog_base) | ||
| 37 | goto soft; | ||
| 38 | |||
| 39 | imx_src_prepare_restart(); | ||
| 40 | |||
| 41 | /* enable wdog */ | ||
| 42 | writew_relaxed(1 << 2, wdog_base); | ||
| 43 | /* write twice to ensure the request will not get ignored */ | ||
| 44 | writew_relaxed(1 << 2, wdog_base); | ||
| 45 | |||
| 46 | /* wait for reset to assert ... */ | ||
| 47 | mdelay(500); | ||
| 48 | |||
| 49 | pr_err("Watchdog reset failed to assert reset\n"); | ||
| 50 | |||
| 51 | /* delay to allow the serial port to show the message */ | ||
| 52 | mdelay(50); | ||
| 53 | |||
| 54 | soft: | ||
| 55 | /* we'll take a jump through zero as a poor second */ | ||
| 56 | soft_restart(0); | ||
| 57 | } | ||
| 58 | |||
| 26 | static void __init imx6q_init_machine(void) | 59 | static void __init imx6q_init_machine(void) |
| 27 | { | 60 | { |
| 28 | of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); | 61 | of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); |
| @@ -83,4 +116,5 @@ DT_MACHINE_START(IMX6Q, "Freescale i.MX6 Quad (Device Tree)") | |||
| 83 | .timer = &imx6q_timer, | 116 | .timer = &imx6q_timer, |
| 84 | .init_machine = imx6q_init_machine, | 117 | .init_machine = imx6q_init_machine, |
| 85 | .dt_compat = imx6q_dt_compat, | 118 | .dt_compat = imx6q_dt_compat, |
| 119 | .restart = imx6q_restart, | ||
| 86 | MACHINE_END | 120 | MACHINE_END |
diff --git a/arch/arm/mach-imx/mach-kzm_arm11_01.c b/arch/arm/mach-imx/mach-kzm_arm11_01.c index 5f37f89e40f..fc78e8071cd 100644 --- a/arch/arm/mach-imx/mach-kzm_arm11_01.c +++ b/arch/arm/mach-imx/mach-kzm_arm11_01.c | |||
| @@ -279,4 +279,5 @@ MACHINE_START(KZM_ARM11_01, "Kyoto Microcomputer Co., Ltd. KZM-ARM11-01") | |||
| 279 | .handle_irq = imx31_handle_irq, | 279 | .handle_irq = imx31_handle_irq, |
| 280 | .timer = &kzm_timer, | 280 | .timer = &kzm_timer, |
| 281 | .init_machine = kzm_board_init, | 281 | .init_machine = kzm_board_init, |
| 282 | .restart = mxc_restart, | ||
| 282 | MACHINE_END | 283 | MACHINE_END |
diff --git a/arch/arm/mach-imx/mach-mx1ads.c b/arch/arm/mach-imx/mach-mx1ads.c index fc49785e734..97046088ff1 100644 --- a/arch/arm/mach-imx/mach-mx1ads.c +++ b/arch/arm/mach-imx/mach-mx1ads.c | |||
| @@ -147,6 +147,7 @@ MACHINE_START(MX1ADS, "Freescale MX1ADS") | |||
| 147 | .handle_irq = imx1_handle_irq, | 147 | .handle_irq = imx1_handle_irq, |
| 148 | .timer = &mx1ads_timer, | 148 | .timer = &mx1ads_timer, |
| 149 | .init_machine = mx1ads_init, | 149 | .init_machine = mx1ads_init, |
| 150 | .restart = mxc_restart, | ||
| 150 | MACHINE_END | 151 | MACHINE_END |
| 151 | 152 | ||
| 152 | MACHINE_START(MXLADS, "Freescale MXLADS") | 153 | MACHINE_START(MXLADS, "Freescale MXLADS") |
| @@ -157,4 +158,5 @@ MACHINE_START(MXLADS, "Freescale MXLADS") | |||
| 157 | .handle_irq = imx1_handle_irq, | 158 | .handle_irq = imx1_handle_irq, |
| 158 | .timer = &mx1ads_timer, | 159 | .timer = &mx1ads_timer, |
| 159 | .init_machine = mx1ads_init, | 160 | .init_machine = mx1ads_init, |
| 161 | .restart = mxc_restart, | ||
| 160 | MACHINE_END | 162 | MACHINE_END |
diff --git a/arch/arm/mach-imx/mach-mx21ads.c b/arch/arm/mach-imx/mach-mx21ads.c index 25f84028d05..8d9f95514b1 100644 --- a/arch/arm/mach-imx/mach-mx21ads.c +++ b/arch/arm/mach-imx/mach-mx21ads.c | |||
| @@ -312,4 +312,5 @@ MACHINE_START(MX21ADS, "Freescale i.MX21ADS") | |||
| 312 | .handle_irq = imx21_handle_irq, | 312 | .handle_irq = imx21_handle_irq, |
| 313 | .timer = &mx21ads_timer, | 313 | .timer = &mx21ads_timer, |
| 314 | .init_machine = mx21ads_board_init, | 314 | .init_machine = mx21ads_board_init, |
| 315 | .restart = mxc_restart, | ||
| 315 | MACHINE_END | 316 | MACHINE_END |
diff --git a/arch/arm/mach-imx/mach-mx25_3ds.c b/arch/arm/mach-imx/mach-mx25_3ds.c index 88dccf12224..f26734298aa 100644 --- a/arch/arm/mach-imx/mach-mx25_3ds.c +++ b/arch/arm/mach-imx/mach-mx25_3ds.c | |||
| @@ -270,4 +270,5 @@ MACHINE_START(MX25_3DS, "Freescale MX25PDK (3DS)") | |||
| 270 | .handle_irq = imx25_handle_irq, | 270 | .handle_irq = imx25_handle_irq, |
| 271 | .timer = &mx25pdk_timer, | 271 | .timer = &mx25pdk_timer, |
| 272 | .init_machine = mx25pdk_init, | 272 | .init_machine = mx25pdk_init, |
| 273 | .restart = mxc_restart, | ||
| 273 | MACHINE_END | 274 | MACHINE_END |
diff --git a/arch/arm/mach-imx/mach-mx27_3ds.c b/arch/arm/mach-imx/mach-mx27_3ds.c index ba232d79fa8..18f35816706 100644 --- a/arch/arm/mach-imx/mach-mx27_3ds.c +++ b/arch/arm/mach-imx/mach-mx27_3ds.c | |||
| @@ -425,4 +425,5 @@ MACHINE_START(MX27_3DS, "Freescale MX27PDK") | |||
| 425 | .handle_irq = imx27_handle_irq, | 425 | .handle_irq = imx27_handle_irq, |
| 426 | .timer = &mx27pdk_timer, | 426 | .timer = &mx27pdk_timer, |
| 427 | .init_machine = mx27pdk_init, | 427 | .init_machine = mx27pdk_init, |
| 428 | .restart = mxc_restart, | ||
| 428 | MACHINE_END | 429 | MACHINE_END |
diff --git a/arch/arm/mach-imx/mach-mx27ads.c b/arch/arm/mach-imx/mach-mx27ads.c index 74dd5731eb6..0228d2e07fe 100644 --- a/arch/arm/mach-imx/mach-mx27ads.c +++ b/arch/arm/mach-imx/mach-mx27ads.c | |||
| @@ -351,4 +351,5 @@ MACHINE_START(MX27ADS, "Freescale i.MX27ADS") | |||
| 351 | .handle_irq = imx27_handle_irq, | 351 | .handle_irq = imx27_handle_irq, |
| 352 | .timer = &mx27ads_timer, | 352 | .timer = &mx27ads_timer, |
| 353 | .init_machine = mx27ads_board_init, | 353 | .init_machine = mx27ads_board_init, |
| 354 | .restart = mxc_restart, | ||
| 354 | MACHINE_END | 355 | MACHINE_END |
diff --git a/arch/arm/mach-imx/mach-mx31_3ds.c b/arch/arm/mach-imx/mach-mx31_3ds.c index b8c54b84018..2b565c38134 100644 --- a/arch/arm/mach-imx/mach-mx31_3ds.c +++ b/arch/arm/mach-imx/mach-mx31_3ds.c | |||
| @@ -770,4 +770,5 @@ MACHINE_START(MX31_3DS, "Freescale MX31PDK (3DS)") | |||
| 770 | .timer = &mx31_3ds_timer, | 770 | .timer = &mx31_3ds_timer, |
| 771 | .init_machine = mx31_3ds_init, | 771 | .init_machine = mx31_3ds_init, |
| 772 | .reserve = mx31_3ds_reserve, | 772 | .reserve = mx31_3ds_reserve, |
| 773 | .restart = mxc_restart, | ||
| 773 | MACHINE_END | 774 | MACHINE_END |
diff --git a/arch/arm/mach-imx/mach-mx31ads.c b/arch/arm/mach-imx/mach-mx31ads.c index 9cc1a49053b..4917aab0e25 100644 --- a/arch/arm/mach-imx/mach-mx31ads.c +++ b/arch/arm/mach-imx/mach-mx31ads.c | |||
| @@ -542,4 +542,5 @@ MACHINE_START(MX31ADS, "Freescale MX31ADS") | |||
| 542 | .handle_irq = imx31_handle_irq, | 542 | .handle_irq = imx31_handle_irq, |
| 543 | .timer = &mx31ads_timer, | 543 | .timer = &mx31ads_timer, |
| 544 | .init_machine = mx31ads_init, | 544 | .init_machine = mx31ads_init, |
| 545 | .restart = mxc_restart, | ||
| 545 | MACHINE_END | 546 | MACHINE_END |
diff --git a/arch/arm/mach-imx/mach-mx31lilly.c b/arch/arm/mach-imx/mach-mx31lilly.c index 102ec99357c..02401bbd6d5 100644 --- a/arch/arm/mach-imx/mach-mx31lilly.c +++ b/arch/arm/mach-imx/mach-mx31lilly.c | |||
| @@ -303,4 +303,5 @@ MACHINE_START(LILLY1131, "INCO startec LILLY-1131") | |||
| 303 | .handle_irq = imx31_handle_irq, | 303 | .handle_irq = imx31_handle_irq, |
| 304 | .timer = &mx31lilly_timer, | 304 | .timer = &mx31lilly_timer, |
| 305 | .init_machine = mx31lilly_board_init, | 305 | .init_machine = mx31lilly_board_init, |
| 306 | .restart = mxc_restart, | ||
| 306 | MACHINE_END | 307 | MACHINE_END |
diff --git a/arch/arm/mach-imx/mach-mx31lite.c b/arch/arm/mach-imx/mach-mx31lite.c index 5366d2de18f..ef80751712e 100644 --- a/arch/arm/mach-imx/mach-mx31lite.c +++ b/arch/arm/mach-imx/mach-mx31lite.c | |||
| @@ -287,4 +287,5 @@ MACHINE_START(MX31LITE, "LogicPD i.MX31 SOM") | |||
| 287 | .handle_irq = imx31_handle_irq, | 287 | .handle_irq = imx31_handle_irq, |
| 288 | .timer = &mx31lite_timer, | 288 | .timer = &mx31lite_timer, |
| 289 | .init_machine = mx31lite_init, | 289 | .init_machine = mx31lite_init, |
| 290 | .restart = mxc_restart, | ||
| 290 | MACHINE_END | 291 | MACHINE_END |
diff --git a/arch/arm/mach-imx/mach-mx31moboard.c b/arch/arm/mach-imx/mach-mx31moboard.c index 93269150309..b95981dacb2 100644 --- a/arch/arm/mach-imx/mach-mx31moboard.c +++ b/arch/arm/mach-imx/mach-mx31moboard.c | |||
| @@ -600,4 +600,5 @@ MACHINE_START(MX31MOBOARD, "EPFL Mobots mx31moboard") | |||
| 600 | .handle_irq = imx31_handle_irq, | 600 | .handle_irq = imx31_handle_irq, |
| 601 | .timer = &mx31moboard_timer, | 601 | .timer = &mx31moboard_timer, |
| 602 | .init_machine = mx31moboard_init, | 602 | .init_machine = mx31moboard_init, |
| 603 | .restart = mxc_restart, | ||
| 603 | MACHINE_END | 604 | MACHINE_END |
diff --git a/arch/arm/mach-imx/mach-mx35_3ds.c b/arch/arm/mach-imx/mach-mx35_3ds.c index 7a462025a0f..0af6c9c5b3f 100644 --- a/arch/arm/mach-imx/mach-mx35_3ds.c +++ b/arch/arm/mach-imx/mach-mx35_3ds.c | |||
| @@ -224,4 +224,5 @@ MACHINE_START(MX35_3DS, "Freescale MX35PDK") | |||
| 224 | .handle_irq = imx35_handle_irq, | 224 | .handle_irq = imx35_handle_irq, |
| 225 | .timer = &mx35pdk_timer, | 225 | .timer = &mx35pdk_timer, |
| 226 | .init_machine = mx35_3ds_init, | 226 | .init_machine = mx35_3ds_init, |
| 227 | .restart = mxc_restart, | ||
| 227 | MACHINE_END | 228 | MACHINE_END |
diff --git a/arch/arm/mach-imx/mach-mxt_td60.c b/arch/arm/mach-imx/mach-mxt_td60.c index 125c19643b0..8b3d3f07d89 100644 --- a/arch/arm/mach-imx/mach-mxt_td60.c +++ b/arch/arm/mach-imx/mach-mxt_td60.c | |||
| @@ -274,4 +274,5 @@ MACHINE_START(MXT_TD60, "Maxtrack i-MXT TD60") | |||
| 274 | .handle_irq = imx27_handle_irq, | 274 | .handle_irq = imx27_handle_irq, |
| 275 | .timer = &mxt_td60_timer, | 275 | .timer = &mxt_td60_timer, |
| 276 | .init_machine = mxt_td60_board_init, | 276 | .init_machine = mxt_td60_board_init, |
| 277 | .restart = mxc_restart, | ||
| 277 | MACHINE_END | 278 | MACHINE_END |
diff --git a/arch/arm/mach-imx/mach-pca100.c b/arch/arm/mach-imx/mach-pca100.c index 26072f4b02e..d3b9c6b5edd 100644 --- a/arch/arm/mach-imx/mach-pca100.c +++ b/arch/arm/mach-imx/mach-pca100.c | |||
| @@ -442,4 +442,5 @@ MACHINE_START(PCA100, "phyCARD-i.MX27") | |||
| 442 | .handle_irq = imx27_handle_irq, | 442 | .handle_irq = imx27_handle_irq, |
| 443 | .init_machine = pca100_init, | 443 | .init_machine = pca100_init, |
| 444 | .timer = &pca100_timer, | 444 | .timer = &pca100_timer, |
| 445 | .restart = mxc_restart, | ||
| 445 | MACHINE_END | 446 | MACHINE_END |
diff --git a/arch/arm/mach-imx/mach-pcm037.c b/arch/arm/mach-imx/mach-pcm037.c index efd6b536ef6..d7e151669ed 100644 --- a/arch/arm/mach-imx/mach-pcm037.c +++ b/arch/arm/mach-imx/mach-pcm037.c | |||
| @@ -696,4 +696,5 @@ MACHINE_START(PCM037, "Phytec Phycore pcm037") | |||
| 696 | .handle_irq = imx31_handle_irq, | 696 | .handle_irq = imx31_handle_irq, |
| 697 | .timer = &pcm037_timer, | 697 | .timer = &pcm037_timer, |
| 698 | .init_machine = pcm037_init, | 698 | .init_machine = pcm037_init, |
| 699 | .restart = mxc_restart, | ||
| 699 | MACHINE_END | 700 | MACHINE_END |
diff --git a/arch/arm/mach-imx/mach-pcm038.c b/arch/arm/mach-imx/mach-pcm038.c index a17e9c7dfca..16f126da9f8 100644 --- a/arch/arm/mach-imx/mach-pcm038.c +++ b/arch/arm/mach-imx/mach-pcm038.c | |||
| @@ -357,4 +357,5 @@ MACHINE_START(PCM038, "phyCORE-i.MX27") | |||
| 357 | .handle_irq = imx27_handle_irq, | 357 | .handle_irq = imx27_handle_irq, |
| 358 | .timer = &pcm038_timer, | 358 | .timer = &pcm038_timer, |
| 359 | .init_machine = pcm038_init, | 359 | .init_machine = pcm038_init, |
| 360 | .restart = mxc_restart, | ||
| 360 | MACHINE_END | 361 | MACHINE_END |
diff --git a/arch/arm/mach-imx/mach-pcm043.c b/arch/arm/mach-imx/mach-pcm043.c index 7366c2ae3ea..06dc106519a 100644 --- a/arch/arm/mach-imx/mach-pcm043.c +++ b/arch/arm/mach-imx/mach-pcm043.c | |||
| @@ -425,4 +425,5 @@ MACHINE_START(PCM043, "Phytec Phycore pcm043") | |||
| 425 | .handle_irq = imx35_handle_irq, | 425 | .handle_irq = imx35_handle_irq, |
| 426 | .timer = &pcm043_timer, | 426 | .timer = &pcm043_timer, |
| 427 | .init_machine = pcm043_init, | 427 | .init_machine = pcm043_init, |
| 428 | .restart = mxc_restart, | ||
| 428 | MACHINE_END | 429 | MACHINE_END |
diff --git a/arch/arm/mach-imx/mach-qong.c b/arch/arm/mach-imx/mach-qong.c index 4ff5faf102a..260621055b6 100644 --- a/arch/arm/mach-imx/mach-qong.c +++ b/arch/arm/mach-imx/mach-qong.c | |||
| @@ -273,4 +273,5 @@ MACHINE_START(QONG, "Dave/DENX QongEVB-LITE") | |||
| 273 | .handle_irq = imx31_handle_irq, | 273 | .handle_irq = imx31_handle_irq, |
| 274 | .timer = &qong_timer, | 274 | .timer = &qong_timer, |
| 275 | .init_machine = qong_init, | 275 | .init_machine = qong_init, |
| 276 | .restart = mxc_restart, | ||
| 276 | MACHINE_END | 277 | MACHINE_END |
diff --git a/arch/arm/mach-imx/mach-scb9328.c b/arch/arm/mach-imx/mach-scb9328.c index bb6e5b25d8d..cb9ceae2f64 100644 --- a/arch/arm/mach-imx/mach-scb9328.c +++ b/arch/arm/mach-imx/mach-scb9328.c | |||
| @@ -144,4 +144,5 @@ MACHINE_START(SCB9328, "Synertronixx scb9328") | |||
| 144 | .handle_irq = imx1_handle_irq, | 144 | .handle_irq = imx1_handle_irq, |
| 145 | .timer = &scb9328_timer, | 145 | .timer = &scb9328_timer, |
| 146 | .init_machine = scb9328_init, | 146 | .init_machine = scb9328_init, |
| 147 | .restart = mxc_restart, | ||
| 147 | MACHINE_END | 148 | MACHINE_END |
diff --git a/arch/arm/mach-imx/mach-vpr200.c b/arch/arm/mach-imx/mach-vpr200.c index 69092458f2d..033257e553e 100644 --- a/arch/arm/mach-imx/mach-vpr200.c +++ b/arch/arm/mach-imx/mach-vpr200.c | |||
| @@ -322,4 +322,5 @@ MACHINE_START(VPR200, "VPR200") | |||
| 322 | .handle_irq = imx35_handle_irq, | 322 | .handle_irq = imx35_handle_irq, |
| 323 | .timer = &vpr200_timer, | 323 | .timer = &vpr200_timer, |
| 324 | .init_machine = vpr200_board_init, | 324 | .init_machine = vpr200_board_init, |
| 325 | .restart = mxc_restart, | ||
| 325 | MACHINE_END | 326 | MACHINE_END |
diff --git a/arch/arm/mach-imx/src.c b/arch/arm/mach-imx/src.c index a8e33681b73..4bde04f99e3 100644 --- a/arch/arm/mach-imx/src.c +++ b/arch/arm/mach-imx/src.c | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | 19 | ||
| 20 | #define SRC_SCR 0x000 | 20 | #define SRC_SCR 0x000 |
| 21 | #define SRC_GPR1 0x020 | 21 | #define SRC_GPR1 0x020 |
| 22 | #define BP_SRC_SCR_WARM_RESET_ENABLE 0 | ||
| 22 | #define BP_SRC_SCR_CORE1_RST 14 | 23 | #define BP_SRC_SCR_CORE1_RST 14 |
| 23 | #define BP_SRC_SCR_CORE1_ENABLE 22 | 24 | #define BP_SRC_SCR_CORE1_ENABLE 22 |
| 24 | 25 | ||
| @@ -46,11 +47,33 @@ void imx_set_cpu_jump(int cpu, void *jump_addr) | |||
| 46 | src_base + SRC_GPR1 + cpu * 8); | 47 | src_base + SRC_GPR1 + cpu * 8); |
| 47 | } | 48 | } |
| 48 | 49 | ||
| 50 | void imx_src_prepare_restart(void) | ||
| 51 | { | ||
| 52 | u32 val; | ||
| 53 | |||
| 54 | /* clear enable bits of secondary cores */ | ||
| 55 | val = readl_relaxed(src_base + SRC_SCR); | ||
| 56 | val &= ~(0x7 << BP_SRC_SCR_CORE1_ENABLE); | ||
| 57 | writel_relaxed(val, src_base + SRC_SCR); | ||
| 58 | |||
| 59 | /* clear persistent entry register of primary core */ | ||
| 60 | writel_relaxed(0, src_base + SRC_GPR1); | ||
| 61 | } | ||
| 62 | |||
| 49 | void __init imx_src_init(void) | 63 | void __init imx_src_init(void) |
| 50 | { | 64 | { |
| 51 | struct device_node *np; | 65 | struct device_node *np; |
| 66 | u32 val; | ||
| 52 | 67 | ||
| 53 | np = of_find_compatible_node(NULL, NULL, "fsl,imx6q-src"); | 68 | np = of_find_compatible_node(NULL, NULL, "fsl,imx6q-src"); |
| 54 | src_base = of_iomap(np, 0); | 69 | src_base = of_iomap(np, 0); |
| 55 | WARN_ON(!src_base); | 70 | WARN_ON(!src_base); |
| 71 | |||
| 72 | /* | ||
| 73 | * force warm reset sources to generate cold reset | ||
| 74 | * for a more reliable restart | ||
| 75 | */ | ||
| 76 | val = readl_relaxed(src_base + SRC_SCR); | ||
| 77 | val &= ~(1 << BP_SRC_SCR_WARM_RESET_ENABLE); | ||
| 78 | writel_relaxed(val, src_base + SRC_SCR); | ||
| 56 | } | 79 | } |
diff --git a/arch/arm/mach-integrator/common.h b/arch/arm/mach-integrator/common.h index a08f9b0299d..899561d8db2 100644 --- a/arch/arm/mach-integrator/common.h +++ b/arch/arm/mach-integrator/common.h | |||
| @@ -1,2 +1,3 @@ | |||
| 1 | void integrator_init_early(void); | 1 | void integrator_init_early(void); |
| 2 | void integrator_reserve(void); | 2 | void integrator_reserve(void); |
| 3 | void integrator_restart(char, const char *); | ||
diff --git a/arch/arm/mach-integrator/core.c b/arch/arm/mach-integrator/core.c index 4b38e13667a..0a3e0974398 100644 --- a/arch/arm/mach-integrator/core.c +++ b/arch/arm/mach-integrator/core.c | |||
| @@ -238,3 +238,11 @@ void __init integrator_reserve(void) | |||
| 238 | { | 238 | { |
| 239 | memblock_reserve(PHYS_OFFSET, __pa(swapper_pg_dir) - PHYS_OFFSET); | 239 | memblock_reserve(PHYS_OFFSET, __pa(swapper_pg_dir) - PHYS_OFFSET); |
| 240 | } | 240 | } |
| 241 | |||
| 242 | /* | ||
| 243 | * To reset, we hit the on-board reset register in the system FPGA | ||
| 244 | */ | ||
| 245 | void integrator_restart(char mode, const char *cmd) | ||
| 246 | { | ||
| 247 | cm_control(CM_CTRL_RESET, CM_CTRL_RESET); | ||
| 248 | } | ||
diff --git a/arch/arm/mach-integrator/include/mach/system.h b/arch/arm/mach-integrator/include/mach/system.h index e1551b8dab7..901514eba4a 100644 --- a/arch/arm/mach-integrator/include/mach/system.h +++ b/arch/arm/mach-integrator/include/mach/system.h | |||
| @@ -21,8 +21,6 @@ | |||
| 21 | #ifndef __ASM_ARCH_SYSTEM_H | 21 | #ifndef __ASM_ARCH_SYSTEM_H |
| 22 | #define __ASM_ARCH_SYSTEM_H | 22 | #define __ASM_ARCH_SYSTEM_H |
| 23 | 23 | ||
| 24 | #include <mach/cm.h> | ||
| 25 | |||
| 26 | static inline void arch_idle(void) | 24 | static inline void arch_idle(void) |
| 27 | { | 25 | { |
| 28 | /* | 26 | /* |
| @@ -32,13 +30,4 @@ static inline void arch_idle(void) | |||
| 32 | cpu_do_idle(); | 30 | cpu_do_idle(); |
| 33 | } | 31 | } |
| 34 | 32 | ||
| 35 | static inline void arch_reset(char mode, const char *cmd) | ||
| 36 | { | ||
| 37 | /* | ||
| 38 | * To reset, we hit the on-board reset register | ||
| 39 | * in the system FPGA | ||
| 40 | */ | ||
| 41 | cm_control(CM_CTRL_RESET, CM_CTRL_RESET); | ||
| 42 | } | ||
| 43 | |||
| 44 | #endif | 33 | #endif |
diff --git a/arch/arm/mach-integrator/integrator_ap.c b/arch/arm/mach-integrator/integrator_ap.c index a1769f35a86..21a1d6cbef4 100644 --- a/arch/arm/mach-integrator/integrator_ap.c +++ b/arch/arm/mach-integrator/integrator_ap.c | |||
| @@ -472,4 +472,5 @@ MACHINE_START(INTEGRATOR, "ARM-Integrator") | |||
| 472 | .init_irq = ap_init_irq, | 472 | .init_irq = ap_init_irq, |
| 473 | .timer = &ap_timer, | 473 | .timer = &ap_timer, |
| 474 | .init_machine = ap_init, | 474 | .init_machine = ap_init, |
| 475 | .restart = integrator_restart, | ||
| 475 | MACHINE_END | 476 | MACHINE_END |
diff --git a/arch/arm/mach-integrator/integrator_cp.c b/arch/arm/mach-integrator/integrator_cp.c index 5de49c33e4d..3a730d447c9 100644 --- a/arch/arm/mach-integrator/integrator_cp.c +++ b/arch/arm/mach-integrator/integrator_cp.c | |||
| @@ -499,4 +499,5 @@ MACHINE_START(CINTEGRATOR, "ARM-IntegratorCP") | |||
| 499 | .init_irq = intcp_init_irq, | 499 | .init_irq = intcp_init_irq, |
| 500 | .timer = &cp_timer, | 500 | .timer = &cp_timer, |
| 501 | .init_machine = intcp_init, | 501 | .init_machine = intcp_init, |
| 502 | .restart = integrator_restart, | ||
| 502 | MACHINE_END | 503 | MACHINE_END |
diff --git a/arch/arm/mach-iop13xx/include/mach/iop13xx.h b/arch/arm/mach-iop13xx/include/mach/iop13xx.h index 52b7fab7ef6..07e9ff7adaf 100644 --- a/arch/arm/mach-iop13xx/include/mach/iop13xx.h +++ b/arch/arm/mach-iop13xx/include/mach/iop13xx.h | |||
| @@ -10,6 +10,7 @@ void iop13xx_map_io(void); | |||
| 10 | void iop13xx_platform_init(void); | 10 | void iop13xx_platform_init(void); |
| 11 | void iop13xx_add_tpmi_devices(void); | 11 | void iop13xx_add_tpmi_devices(void); |
| 12 | void iop13xx_init_irq(void); | 12 | void iop13xx_init_irq(void); |
| 13 | void iop13xx_restart(char, const char *); | ||
| 13 | 14 | ||
| 14 | /* CPUID CP6 R0 Page 0 */ | 15 | /* CPUID CP6 R0 Page 0 */ |
| 15 | static inline int iop13xx_cpu_id(void) | 16 | static inline int iop13xx_cpu_id(void) |
diff --git a/arch/arm/mach-iop13xx/include/mach/system.h b/arch/arm/mach-iop13xx/include/mach/system.h index d0c66ef450a..1f31ed3f8ae 100644 --- a/arch/arm/mach-iop13xx/include/mach/system.h +++ b/arch/arm/mach-iop13xx/include/mach/system.h | |||
| @@ -7,21 +7,7 @@ | |||
| 7 | * it under the terms of the GNU General Public License version 2 as | 7 | * it under the terms of the GNU General Public License version 2 as |
| 8 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
| 9 | */ | 9 | */ |
| 10 | #include <mach/iop13xx.h> | ||
| 11 | static inline void arch_idle(void) | 10 | static inline void arch_idle(void) |
| 12 | { | 11 | { |
| 13 | cpu_do_idle(); | 12 | cpu_do_idle(); |
| 14 | } | 13 | } |
| 15 | |||
| 16 | static inline void arch_reset(char mode, const char *cmd) | ||
| 17 | { | ||
| 18 | /* | ||
| 19 | * Reset the internal bus (warning both cores are reset) | ||
| 20 | */ | ||
| 21 | write_wdtcr(IOP_WDTCR_EN_ARM); | ||
| 22 | write_wdtcr(IOP_WDTCR_EN); | ||
| 23 | write_wdtsr(IOP13XX_WDTSR_WRITE_EN | IOP13XX_WDTCR_IB_RESET); | ||
| 24 | write_wdtcr(0x1000); | ||
| 25 | |||
| 26 | for(;;); | ||
| 27 | } | ||
diff --git a/arch/arm/mach-iop13xx/iq81340mc.c b/arch/arm/mach-iop13xx/iq81340mc.c index 4cf2cc477ea..abaee883358 100644 --- a/arch/arm/mach-iop13xx/iq81340mc.c +++ b/arch/arm/mach-iop13xx/iq81340mc.c | |||
| @@ -96,4 +96,5 @@ MACHINE_START(IQ81340MC, "Intel IQ81340MC") | |||
| 96 | .init_irq = iop13xx_init_irq, | 96 | .init_irq = iop13xx_init_irq, |
| 97 | .timer = &iq81340mc_timer, | 97 | .timer = &iq81340mc_timer, |
| 98 | .init_machine = iq81340mc_init, | 98 | .init_machine = iq81340mc_init, |
| 99 | .restart = iop13xx_restart, | ||
| 99 | MACHINE_END | 100 | MACHINE_END |
diff --git a/arch/arm/mach-iop13xx/iq81340sc.c b/arch/arm/mach-iop13xx/iq81340sc.c index cd9e27499a1..690916a09dc 100644 --- a/arch/arm/mach-iop13xx/iq81340sc.c +++ b/arch/arm/mach-iop13xx/iq81340sc.c | |||
| @@ -98,4 +98,5 @@ MACHINE_START(IQ81340SC, "Intel IQ81340SC") | |||
| 98 | .init_irq = iop13xx_init_irq, | 98 | .init_irq = iop13xx_init_irq, |
| 99 | .timer = &iq81340sc_timer, | 99 | .timer = &iq81340sc_timer, |
| 100 | .init_machine = iq81340sc_init, | 100 | .init_machine = iq81340sc_init, |
| 101 | .restart = iop13xx_restart, | ||
| 101 | MACHINE_END | 102 | MACHINE_END |
diff --git a/arch/arm/mach-iop13xx/setup.c b/arch/arm/mach-iop13xx/setup.c index a5b989728b9..daabb1fa6c2 100644 --- a/arch/arm/mach-iop13xx/setup.c +++ b/arch/arm/mach-iop13xx/setup.c | |||
| @@ -606,3 +606,14 @@ static int __init iop13xx_init_adma_setup(char *str) | |||
| 606 | __setup("iop13xx_init_adma", iop13xx_init_adma_setup); | 606 | __setup("iop13xx_init_adma", iop13xx_init_adma_setup); |
| 607 | __setup("iop13xx_init_uart", iop13xx_init_uart_setup); | 607 | __setup("iop13xx_init_uart", iop13xx_init_uart_setup); |
| 608 | __setup("iop13xx_init_i2c", iop13xx_init_i2c_setup); | 608 | __setup("iop13xx_init_i2c", iop13xx_init_i2c_setup); |
| 609 | |||
| 610 | void iop13xx_restart(char mode, const char *cmd) | ||
| 611 | { | ||
| 612 | /* | ||
| 613 | * Reset the internal bus (warning both cores are reset) | ||
| 614 | */ | ||
| 615 | write_wdtcr(IOP_WDTCR_EN_ARM); | ||
| 616 | write_wdtcr(IOP_WDTCR_EN); | ||
| 617 | write_wdtsr(IOP13XX_WDTSR_WRITE_EN | IOP13XX_WDTCR_IB_RESET); | ||
| 618 | write_wdtcr(0x1000); | ||
| 619 | } | ||
diff --git a/arch/arm/mach-iop32x/em7210.c b/arch/arm/mach-iop32x/em7210.c index 4325055d4e1..24069e03fdc 100644 --- a/arch/arm/mach-iop32x/em7210.c +++ b/arch/arm/mach-iop32x/em7210.c | |||
| @@ -208,4 +208,5 @@ MACHINE_START(EM7210, "Lanner EM7210") | |||
| 208 | .init_irq = iop32x_init_irq, | 208 | .init_irq = iop32x_init_irq, |
| 209 | .timer = &em7210_timer, | 209 | .timer = &em7210_timer, |
| 210 | .init_machine = em7210_init_machine, | 210 | .init_machine = em7210_init_machine, |
| 211 | .restart = iop3xx_restart, | ||
| 211 | MACHINE_END | 212 | MACHINE_END |
diff --git a/arch/arm/mach-iop32x/glantank.c b/arch/arm/mach-iop32x/glantank.c index 0edc8802057..204e1d1cd76 100644 --- a/arch/arm/mach-iop32x/glantank.c +++ b/arch/arm/mach-iop32x/glantank.c | |||
| @@ -212,4 +212,5 @@ MACHINE_START(GLANTANK, "GLAN Tank") | |||
| 212 | .init_irq = iop32x_init_irq, | 212 | .init_irq = iop32x_init_irq, |
| 213 | .timer = &glantank_timer, | 213 | .timer = &glantank_timer, |
| 214 | .init_machine = glantank_init_machine, | 214 | .init_machine = glantank_init_machine, |
| 215 | .restart = iop3xx_restart, | ||
| 215 | MACHINE_END | 216 | MACHINE_END |
diff --git a/arch/arm/mach-iop32x/include/mach/system.h b/arch/arm/mach-iop32x/include/mach/system.h index b4f83e5973b..4a88727bca9 100644 --- a/arch/arm/mach-iop32x/include/mach/system.h +++ b/arch/arm/mach-iop32x/include/mach/system.h | |||
| @@ -7,26 +7,7 @@ | |||
| 7 | * it under the terms of the GNU General Public License version 2 as | 7 | * it under the terms of the GNU General Public License version 2 as |
| 8 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
| 9 | */ | 9 | */ |
| 10 | #include <asm/mach-types.h> | ||
| 11 | #include <asm/hardware/iop3xx.h> | ||
| 12 | #include <mach/n2100.h> | ||
| 13 | |||
| 14 | static inline void arch_idle(void) | 10 | static inline void arch_idle(void) |
| 15 | { | 11 | { |
| 16 | cpu_do_idle(); | 12 | cpu_do_idle(); |
| 17 | } | 13 | } |
| 18 | |||
| 19 | static inline void arch_reset(char mode, const char *cmd) | ||
| 20 | { | ||
| 21 | if (machine_is_n2100()) { | ||
| 22 | gpio_line_set(N2100_HARDWARE_RESET, GPIO_LOW); | ||
| 23 | gpio_line_config(N2100_HARDWARE_RESET, GPIO_OUT); | ||
| 24 | while (1) | ||
| 25 | ; | ||
| 26 | } | ||
| 27 | |||
| 28 | *IOP3XX_PCSR = 0x30; | ||
| 29 | |||
| 30 | /* Jump into ROM at address 0 */ | ||
| 31 | soft_restart(0); | ||
| 32 | } | ||
diff --git a/arch/arm/mach-iop32x/iq31244.c b/arch/arm/mach-iop32x/iq31244.c index 9e7aaccfeba..3eb642af1cd 100644 --- a/arch/arm/mach-iop32x/iq31244.c +++ b/arch/arm/mach-iop32x/iq31244.c | |||
| @@ -318,6 +318,7 @@ MACHINE_START(IQ31244, "Intel IQ31244") | |||
| 318 | .init_irq = iop32x_init_irq, | 318 | .init_irq = iop32x_init_irq, |
| 319 | .timer = &iq31244_timer, | 319 | .timer = &iq31244_timer, |
| 320 | .init_machine = iq31244_init_machine, | 320 | .init_machine = iq31244_init_machine, |
| 321 | .restart = iop3xx_restart, | ||
| 321 | MACHINE_END | 322 | MACHINE_END |
| 322 | 323 | ||
| 323 | /* There should have been an ep80219 machine identifier from the beginning. | 324 | /* There should have been an ep80219 machine identifier from the beginning. |
| @@ -332,4 +333,5 @@ MACHINE_START(EP80219, "Intel EP80219") | |||
| 332 | .init_irq = iop32x_init_irq, | 333 | .init_irq = iop32x_init_irq, |
| 333 | .timer = &iq31244_timer, | 334 | .timer = &iq31244_timer, |
| 334 | .init_machine = iq31244_init_machine, | 335 | .init_machine = iq31244_init_machine, |
| 336 | .restart = iop3xx_restart, | ||
| 335 | MACHINE_END | 337 | MACHINE_END |
diff --git a/arch/arm/mach-iop32x/iq80321.c b/arch/arm/mach-iop32x/iq80321.c index 53ea86f649d..2ec724b58a2 100644 --- a/arch/arm/mach-iop32x/iq80321.c +++ b/arch/arm/mach-iop32x/iq80321.c | |||
| @@ -191,4 +191,5 @@ MACHINE_START(IQ80321, "Intel IQ80321") | |||
| 191 | .init_irq = iop32x_init_irq, | 191 | .init_irq = iop32x_init_irq, |
| 192 | .timer = &iq80321_timer, | 192 | .timer = &iq80321_timer, |
| 193 | .init_machine = iq80321_init_machine, | 193 | .init_machine = iq80321_init_machine, |
| 194 | .restart = iop3xx_restart, | ||
| 194 | MACHINE_END | 195 | MACHINE_END |
diff --git a/arch/arm/mach-iop32x/n2100.c b/arch/arm/mach-iop32x/n2100.c index d7269279968..6b6d5591244 100644 --- a/arch/arm/mach-iop32x/n2100.c +++ b/arch/arm/mach-iop32x/n2100.c | |||
| @@ -291,6 +291,14 @@ static void n2100_power_off(void) | |||
| 291 | ; | 291 | ; |
| 292 | } | 292 | } |
| 293 | 293 | ||
| 294 | static void n2100_restart(char mode, const char *cmd) | ||
| 295 | { | ||
| 296 | gpio_line_set(N2100_HARDWARE_RESET, GPIO_LOW); | ||
| 297 | gpio_line_config(N2100_HARDWARE_RESET, GPIO_OUT); | ||
| 298 | while (1) | ||
| 299 | ; | ||
| 300 | } | ||
| 301 | |||
| 294 | 302 | ||
| 295 | static struct timer_list power_button_poll_timer; | 303 | static struct timer_list power_button_poll_timer; |
| 296 | 304 | ||
| @@ -332,4 +340,5 @@ MACHINE_START(N2100, "Thecus N2100") | |||
| 332 | .init_irq = iop32x_init_irq, | 340 | .init_irq = iop32x_init_irq, |
| 333 | .timer = &n2100_timer, | 341 | .timer = &n2100_timer, |
| 334 | .init_machine = n2100_init_machine, | 342 | .init_machine = n2100_init_machine, |
| 343 | .restart = n2100_restart, | ||
| 335 | MACHINE_END | 344 | MACHINE_END |
diff --git a/arch/arm/mach-iop33x/include/mach/system.h b/arch/arm/mach-iop33x/include/mach/system.h index 86d1b20dd69..4f98e765397 100644 --- a/arch/arm/mach-iop33x/include/mach/system.h +++ b/arch/arm/mach-iop33x/include/mach/system.h | |||
| @@ -7,17 +7,7 @@ | |||
| 7 | * it under the terms of the GNU General Public License version 2 as | 7 | * it under the terms of the GNU General Public License version 2 as |
| 8 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
| 9 | */ | 9 | */ |
| 10 | #include <asm/hardware/iop3xx.h> | ||
| 11 | |||
| 12 | static inline void arch_idle(void) | 10 | static inline void arch_idle(void) |
| 13 | { | 11 | { |
| 14 | cpu_do_idle(); | 12 | cpu_do_idle(); |
| 15 | } | 13 | } |
| 16 | |||
| 17 | static inline void arch_reset(char mode, const char *cmd) | ||
| 18 | { | ||
| 19 | *IOP3XX_PCSR = 0x30; | ||
| 20 | |||
| 21 | /* Jump into ROM at address 0 */ | ||
| 22 | soft_restart(0); | ||
| 23 | } | ||
diff --git a/arch/arm/mach-iop33x/iq80331.c b/arch/arm/mach-iop33x/iq80331.c index 9e14ccc56f8..abce934f381 100644 --- a/arch/arm/mach-iop33x/iq80331.c +++ b/arch/arm/mach-iop33x/iq80331.c | |||
| @@ -146,4 +146,5 @@ MACHINE_START(IQ80331, "Intel IQ80331") | |||
| 146 | .init_irq = iop33x_init_irq, | 146 | .init_irq = iop33x_init_irq, |
| 147 | .timer = &iq80331_timer, | 147 | .timer = &iq80331_timer, |
| 148 | .init_machine = iq80331_init_machine, | 148 | .init_machine = iq80331_init_machine, |
| 149 | .restart = iop3xx_restart, | ||
| 149 | MACHINE_END | 150 | MACHINE_END |
diff --git a/arch/arm/mach-iop33x/iq80332.c b/arch/arm/mach-iop33x/iq80332.c index 09c899a2523..7513559e25b 100644 --- a/arch/arm/mach-iop33x/iq80332.c +++ b/arch/arm/mach-iop33x/iq80332.c | |||
| @@ -146,4 +146,5 @@ MACHINE_START(IQ80332, "Intel IQ80332") | |||
| 146 | .init_irq = iop33x_init_irq, | 146 | .init_irq = iop33x_init_irq, |
| 147 | .timer = &iq80332_timer, | 147 | .timer = &iq80332_timer, |
| 148 | .init_machine = iq80332_init_machine, | 148 | .init_machine = iq80332_init_machine, |
| 149 | .restart = iop3xx_restart, | ||
| 149 | MACHINE_END | 150 | MACHINE_END |
diff --git a/arch/arm/mach-ixp2000/core.c b/arch/arm/mach-ixp2000/core.c index 24f0fe35f4a..81c45370a4e 100644 --- a/arch/arm/mach-ixp2000/core.c +++ b/arch/arm/mach-ixp2000/core.c | |||
| @@ -515,3 +515,7 @@ void __init ixp2000_init_irq(void) | |||
| 515 | } | 515 | } |
| 516 | } | 516 | } |
| 517 | 517 | ||
| 518 | void ixp2000_restart(char mode, const char *cmd) | ||
| 519 | { | ||
| 520 | ixp2000_reg_wrb(IXP2000_RESET0, RSTALL); | ||
| 521 | } | ||
diff --git a/arch/arm/mach-ixp2000/enp2611.c b/arch/arm/mach-ixp2000/enp2611.c index af9994537e0..ee525416f0d 100644 --- a/arch/arm/mach-ixp2000/enp2611.c +++ b/arch/arm/mach-ixp2000/enp2611.c | |||
| @@ -259,6 +259,7 @@ MACHINE_START(ENP2611, "Radisys ENP-2611 PCI network processor board") | |||
| 259 | .init_irq = ixp2000_init_irq, | 259 | .init_irq = ixp2000_init_irq, |
| 260 | .timer = &enp2611_timer, | 260 | .timer = &enp2611_timer, |
| 261 | .init_machine = enp2611_init_machine, | 261 | .init_machine = enp2611_init_machine, |
| 262 | .restart = ixp2000_restart, | ||
| 262 | MACHINE_END | 263 | MACHINE_END |
| 263 | 264 | ||
| 264 | 265 | ||
diff --git a/arch/arm/mach-ixp2000/include/mach/platform.h b/arch/arm/mach-ixp2000/include/mach/platform.h index 42182c79ed9..bb0f8dcf9ee 100644 --- a/arch/arm/mach-ixp2000/include/mach/platform.h +++ b/arch/arm/mach-ixp2000/include/mach/platform.h | |||
| @@ -122,6 +122,7 @@ void ixp2000_map_io(void); | |||
| 122 | void ixp2000_uart_init(void); | 122 | void ixp2000_uart_init(void); |
| 123 | void ixp2000_init_irq(void); | 123 | void ixp2000_init_irq(void); |
| 124 | void ixp2000_init_time(unsigned long); | 124 | void ixp2000_init_time(unsigned long); |
| 125 | void ixp2000_restart(char, const char *); | ||
| 125 | unsigned long ixp2000_gettimeoffset(void); | 126 | unsigned long ixp2000_gettimeoffset(void); |
| 126 | 127 | ||
| 127 | struct pci_sys_data; | 128 | struct pci_sys_data; |
diff --git a/arch/arm/mach-ixp2000/include/mach/system.h b/arch/arm/mach-ixp2000/include/mach/system.h index 810df7b9398..a7fb08b2b8e 100644 --- a/arch/arm/mach-ixp2000/include/mach/system.h +++ b/arch/arm/mach-ixp2000/include/mach/system.h | |||
| @@ -8,40 +8,7 @@ | |||
| 8 | * it under the terms of the GNU General Public License version 2 as | 8 | * it under the terms of the GNU General Public License version 2 as |
| 9 | * published by the Free Software Foundation. | 9 | * published by the Free Software Foundation. |
| 10 | */ | 10 | */ |
| 11 | |||
| 12 | #include <mach/hardware.h> | ||
| 13 | #include <asm/mach-types.h> | ||
| 14 | |||
| 15 | static inline void arch_idle(void) | 11 | static inline void arch_idle(void) |
| 16 | { | 12 | { |
| 17 | cpu_do_idle(); | 13 | cpu_do_idle(); |
| 18 | } | 14 | } |
| 19 | |||
| 20 | static inline void arch_reset(char mode, const char *cmd) | ||
| 21 | { | ||
| 22 | /* | ||
| 23 | * Reset flash banking register so that we are pointing at | ||
| 24 | * RedBoot bank. | ||
| 25 | */ | ||
| 26 | if (machine_is_ixdp2401()) { | ||
| 27 | ixp2000_reg_write(IXDP2X01_CPLD_FLASH_REG, | ||
| 28 | ((0 >> IXDP2X01_FLASH_WINDOW_BITS) | ||
| 29 | | IXDP2X01_CPLD_FLASH_INTERN)); | ||
| 30 | ixp2000_reg_wrb(IXDP2X01_CPLD_RESET_REG, 0xffffffff); | ||
| 31 | } | ||
| 32 | |||
| 33 | /* | ||
| 34 | * On IXDP2801 we need to write this magic sequence to the CPLD | ||
| 35 | * to cause a complete reset of the CPU and all external devices | ||
| 36 | * and move the flash bank register back to 0. | ||
| 37 | */ | ||
| 38 | if (machine_is_ixdp2801() || machine_is_ixdp28x5()) { | ||
| 39 | unsigned long reset_reg = *IXDP2X01_CPLD_RESET_REG; | ||
| 40 | |||
| 41 | reset_reg = 0x55AA0000 | (reset_reg & 0x0000FFFF); | ||
| 42 | ixp2000_reg_write(IXDP2X01_CPLD_RESET_REG, reset_reg); | ||
| 43 | ixp2000_reg_wrb(IXDP2X01_CPLD_RESET_REG, 0x80000000); | ||
| 44 | } | ||
| 45 | |||
| 46 | ixp2000_reg_wrb(IXP2000_RESET0, RSTALL); | ||
| 47 | } | ||
diff --git a/arch/arm/mach-ixp2000/ixdp2400.c b/arch/arm/mach-ixp2000/ixdp2400.c index f7dfd970014..f53e911ec94 100644 --- a/arch/arm/mach-ixp2000/ixdp2400.c +++ b/arch/arm/mach-ixp2000/ixdp2400.c | |||
| @@ -176,5 +176,6 @@ MACHINE_START(IXDP2400, "Intel IXDP2400 Development Platform") | |||
| 176 | .init_irq = ixdp2400_init_irq, | 176 | .init_irq = ixdp2400_init_irq, |
| 177 | .timer = &ixdp2400_timer, | 177 | .timer = &ixdp2400_timer, |
| 178 | .init_machine = ixdp2x00_init_machine, | 178 | .init_machine = ixdp2x00_init_machine, |
| 179 | .restart = ixp2000_restart, | ||
| 179 | MACHINE_END | 180 | MACHINE_END |
| 180 | 181 | ||
diff --git a/arch/arm/mach-ixp2000/ixdp2800.c b/arch/arm/mach-ixp2000/ixdp2800.c index d33bcac1ec9..a2e7c393e74 100644 --- a/arch/arm/mach-ixp2000/ixdp2800.c +++ b/arch/arm/mach-ixp2000/ixdp2800.c | |||
| @@ -291,5 +291,6 @@ MACHINE_START(IXDP2800, "Intel IXDP2800 Development Platform") | |||
| 291 | .init_irq = ixdp2800_init_irq, | 291 | .init_irq = ixdp2800_init_irq, |
| 292 | .timer = &ixdp2800_timer, | 292 | .timer = &ixdp2800_timer, |
| 293 | .init_machine = ixdp2x00_init_machine, | 293 | .init_machine = ixdp2x00_init_machine, |
| 294 | .restart = ixp2000_restart, | ||
| 294 | MACHINE_END | 295 | MACHINE_END |
| 295 | 296 | ||
diff --git a/arch/arm/mach-ixp2000/ixdp2x01.c b/arch/arm/mach-ixp2000/ixdp2x01.c index 61a28676b5b..7632beadabf 100644 --- a/arch/arm/mach-ixp2000/ixdp2x01.c +++ b/arch/arm/mach-ixp2000/ixdp2x01.c | |||
| @@ -413,6 +413,35 @@ static void __init ixdp2x01_init_machine(void) | |||
| 413 | ixdp2x01_uart_init(); | 413 | ixdp2x01_uart_init(); |
| 414 | } | 414 | } |
| 415 | 415 | ||
| 416 | static void ixdp2401_restart(char mode, const char *cmd) | ||
| 417 | { | ||
| 418 | /* | ||
| 419 | * Reset flash banking register so that we are pointing at | ||
| 420 | * RedBoot bank. | ||
| 421 | */ | ||
| 422 | ixp2000_reg_write(IXDP2X01_CPLD_FLASH_REG, | ||
| 423 | ((0 >> IXDP2X01_FLASH_WINDOW_BITS) | ||
| 424 | | IXDP2X01_CPLD_FLASH_INTERN)); | ||
| 425 | ixp2000_reg_wrb(IXDP2X01_CPLD_RESET_REG, 0xffffffff); | ||
| 426 | |||
| 427 | ixp2000_restart(mode, cmd); | ||
| 428 | } | ||
| 429 | |||
| 430 | static void ixdp280x_restart(char mode, const char *cmd) | ||
| 431 | { | ||
| 432 | /* | ||
| 433 | * On IXDP2801 we need to write this magic sequence to the CPLD | ||
| 434 | * to cause a complete reset of the CPU and all external devices | ||
| 435 | * and move the flash bank register back to 0. | ||
| 436 | */ | ||
| 437 | unsigned long reset_reg = *IXDP2X01_CPLD_RESET_REG; | ||
| 438 | |||
| 439 | reset_reg = 0x55AA0000 | (reset_reg & 0x0000FFFF); | ||
| 440 | ixp2000_reg_write(IXDP2X01_CPLD_RESET_REG, reset_reg); | ||
| 441 | ixp2000_reg_wrb(IXDP2X01_CPLD_RESET_REG, 0x80000000); | ||
| 442 | |||
| 443 | ixp2000_restart(mode, cmd); | ||
| 444 | } | ||
| 416 | 445 | ||
| 417 | #ifdef CONFIG_ARCH_IXDP2401 | 446 | #ifdef CONFIG_ARCH_IXDP2401 |
| 418 | MACHINE_START(IXDP2401, "Intel IXDP2401 Development Platform") | 447 | MACHINE_START(IXDP2401, "Intel IXDP2401 Development Platform") |
| @@ -422,6 +451,7 @@ MACHINE_START(IXDP2401, "Intel IXDP2401 Development Platform") | |||
| 422 | .init_irq = ixdp2x01_init_irq, | 451 | .init_irq = ixdp2x01_init_irq, |
| 423 | .timer = &ixdp2x01_timer, | 452 | .timer = &ixdp2x01_timer, |
| 424 | .init_machine = ixdp2x01_init_machine, | 453 | .init_machine = ixdp2x01_init_machine, |
| 454 | .restart = ixdp2401_restart, | ||
| 425 | MACHINE_END | 455 | MACHINE_END |
| 426 | #endif | 456 | #endif |
| 427 | 457 | ||
| @@ -433,6 +463,7 @@ MACHINE_START(IXDP2801, "Intel IXDP2801 Development Platform") | |||
| 433 | .init_irq = ixdp2x01_init_irq, | 463 | .init_irq = ixdp2x01_init_irq, |
| 434 | .timer = &ixdp2x01_timer, | 464 | .timer = &ixdp2x01_timer, |
| 435 | .init_machine = ixdp2x01_init_machine, | 465 | .init_machine = ixdp2x01_init_machine, |
| 466 | .restart = ixdp280x_restart, | ||
| 436 | MACHINE_END | 467 | MACHINE_END |
| 437 | 468 | ||
| 438 | /* | 469 | /* |
| @@ -446,6 +477,7 @@ MACHINE_START(IXDP28X5, "Intel IXDP2805/2855 Development Platform") | |||
| 446 | .init_irq = ixdp2x01_init_irq, | 477 | .init_irq = ixdp2x01_init_irq, |
| 447 | .timer = &ixdp2x01_timer, | 478 | .timer = &ixdp2x01_timer, |
| 448 | .init_machine = ixdp2x01_init_machine, | 479 | .init_machine = ixdp2x01_init_machine, |
| 480 | .restart = ixdp280x_restart, | ||
| 449 | MACHINE_END | 481 | MACHINE_END |
| 450 | #endif | 482 | #endif |
| 451 | 483 | ||
diff --git a/arch/arm/mach-ixp23xx/core.c b/arch/arm/mach-ixp23xx/core.c index a1bee33d183..0923bb905cc 100644 --- a/arch/arm/mach-ixp23xx/core.c +++ b/arch/arm/mach-ixp23xx/core.c | |||
| @@ -444,3 +444,9 @@ void __init ixp23xx_sys_init(void) | |||
| 444 | *IXP23XX_EXP_UNIT_FUSE |= 0xf; | 444 | *IXP23XX_EXP_UNIT_FUSE |= 0xf; |
| 445 | platform_add_devices(ixp23xx_devices, ARRAY_SIZE(ixp23xx_devices)); | 445 | platform_add_devices(ixp23xx_devices, ARRAY_SIZE(ixp23xx_devices)); |
| 446 | } | 446 | } |
| 447 | |||
| 448 | void ixp23xx_restart(char mode, const char *cmd) | ||
| 449 | { | ||
| 450 | /* Use on-chip reset capability */ | ||
| 451 | *IXP23XX_RESET0 |= IXP23XX_RST_ALL; | ||
| 452 | } | ||
diff --git a/arch/arm/mach-ixp23xx/espresso.c b/arch/arm/mach-ixp23xx/espresso.c index 30dd31652e9..8f2487e1fc4 100644 --- a/arch/arm/mach-ixp23xx/espresso.c +++ b/arch/arm/mach-ixp23xx/espresso.c | |||
| @@ -90,4 +90,5 @@ MACHINE_START(ESPRESSO, "IP Fabrics Double Espresso") | |||
| 90 | .timer = &ixp23xx_timer, | 90 | .timer = &ixp23xx_timer, |
| 91 | .atag_offset = 0x100, | 91 | .atag_offset = 0x100, |
| 92 | .init_machine = espresso_init, | 92 | .init_machine = espresso_init, |
| 93 | .restart = ixp23xx_restart, | ||
| 93 | MACHINE_END | 94 | MACHINE_END |
diff --git a/arch/arm/mach-ixp23xx/include/mach/platform.h b/arch/arm/mach-ixp23xx/include/mach/platform.h index db9d9416e5e..50de558e722 100644 --- a/arch/arm/mach-ixp23xx/include/mach/platform.h +++ b/arch/arm/mach-ixp23xx/include/mach/platform.h | |||
| @@ -34,6 +34,7 @@ struct pci_sys_data; | |||
| 34 | void ixp23xx_map_io(void); | 34 | void ixp23xx_map_io(void); |
| 35 | void ixp23xx_init_irq(void); | 35 | void ixp23xx_init_irq(void); |
| 36 | void ixp23xx_sys_init(void); | 36 | void ixp23xx_sys_init(void); |
| 37 | void ixp23xx_restart(char, const char *); | ||
| 37 | int ixp23xx_pci_setup(int, struct pci_sys_data *); | 38 | int ixp23xx_pci_setup(int, struct pci_sys_data *); |
| 38 | void ixp23xx_pci_preinit(void); | 39 | void ixp23xx_pci_preinit(void); |
| 39 | struct pci_bus *ixp23xx_pci_scan_bus(int, struct pci_sys_data*); | 40 | struct pci_bus *ixp23xx_pci_scan_bus(int, struct pci_sys_data*); |
diff --git a/arch/arm/mach-ixp23xx/include/mach/system.h b/arch/arm/mach-ixp23xx/include/mach/system.h index 8920ff2dff1..277dda7334b 100644 --- a/arch/arm/mach-ixp23xx/include/mach/system.h +++ b/arch/arm/mach-ixp23xx/include/mach/system.h | |||
| @@ -7,10 +7,6 @@ | |||
| 7 | * it under the terms of the GNU General Public License version 2 as | 7 | * it under the terms of the GNU General Public License version 2 as |
| 8 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
| 9 | */ | 9 | */ |
| 10 | |||
| 11 | #include <mach/hardware.h> | ||
| 12 | #include <asm/mach-types.h> | ||
| 13 | |||
| 14 | static inline void arch_idle(void) | 10 | static inline void arch_idle(void) |
| 15 | { | 11 | { |
| 16 | #if 0 | 12 | #if 0 |
| @@ -18,16 +14,3 @@ static inline void arch_idle(void) | |||
| 18 | cpu_do_idle(); | 14 | cpu_do_idle(); |
| 19 | #endif | 15 | #endif |
| 20 | } | 16 | } |
| 21 | |||
| 22 | static inline void arch_reset(char mode, const char *cmd) | ||
| 23 | { | ||
| 24 | /* First try machine specific support */ | ||
| 25 | if (machine_is_ixdp2351()) { | ||
| 26 | *IXDP2351_CPLD_RESET1_REG = IXDP2351_CPLD_RESET1_MAGIC; | ||
| 27 | (void) *IXDP2351_CPLD_RESET1_REG; | ||
| 28 | *IXDP2351_CPLD_RESET1_REG = IXDP2351_CPLD_RESET1_ENABLE; | ||
| 29 | } | ||
| 30 | |||
| 31 | /* Use on-chip reset capability */ | ||
| 32 | *IXP23XX_RESET0 |= IXP23XX_RST_ALL; | ||
| 33 | } | ||
diff --git a/arch/arm/mach-ixp23xx/ixdp2351.c b/arch/arm/mach-ixp23xx/ixdp2351.c index b3a57e0f341..5d5dd3e8d06 100644 --- a/arch/arm/mach-ixp23xx/ixdp2351.c +++ b/arch/arm/mach-ixp23xx/ixdp2351.c | |||
| @@ -326,6 +326,17 @@ static void __init ixdp2351_init(void) | |||
| 326 | ixp23xx_sys_init(); | 326 | ixp23xx_sys_init(); |
| 327 | } | 327 | } |
| 328 | 328 | ||
| 329 | static void ixdp2351_restart(char mode, const char *cmd) | ||
| 330 | { | ||
| 331 | /* First try machine specific support */ | ||
| 332 | |||
| 333 | *IXDP2351_CPLD_RESET1_REG = IXDP2351_CPLD_RESET1_MAGIC; | ||
| 334 | (void) *IXDP2351_CPLD_RESET1_REG; | ||
| 335 | *IXDP2351_CPLD_RESET1_REG = IXDP2351_CPLD_RESET1_ENABLE; | ||
| 336 | |||
| 337 | ixp23xx_restart(mode, cmd); | ||
| 338 | } | ||
| 339 | |||
| 329 | MACHINE_START(IXDP2351, "Intel IXDP2351 Development Platform") | 340 | MACHINE_START(IXDP2351, "Intel IXDP2351 Development Platform") |
| 330 | /* Maintainer: MontaVista Software, Inc. */ | 341 | /* Maintainer: MontaVista Software, Inc. */ |
| 331 | .map_io = ixdp2351_map_io, | 342 | .map_io = ixdp2351_map_io, |
| @@ -333,4 +344,5 @@ MACHINE_START(IXDP2351, "Intel IXDP2351 Development Platform") | |||
| 333 | .timer = &ixp23xx_timer, | 344 | .timer = &ixp23xx_timer, |
| 334 | .atag_offset = 0x100, | 345 | .atag_offset = 0x100, |
| 335 | .init_machine = ixdp2351_init, | 346 | .init_machine = ixdp2351_init, |
| 347 | .restart = ixdp2351_restart, | ||
| 336 | MACHINE_END | 348 | MACHINE_END |
diff --git a/arch/arm/mach-ixp23xx/roadrunner.c b/arch/arm/mach-ixp23xx/roadrunner.c index 8f4dcbba902..377283fc658 100644 --- a/arch/arm/mach-ixp23xx/roadrunner.c +++ b/arch/arm/mach-ixp23xx/roadrunner.c | |||
| @@ -177,4 +177,5 @@ MACHINE_START(ROADRUNNER, "ADI Engineering RoadRunner Development Platform") | |||
| 177 | .timer = &ixp23xx_timer, | 177 | .timer = &ixp23xx_timer, |
| 178 | .atag_offset = 0x100, | 178 | .atag_offset = 0x100, |
| 179 | .init_machine = roadrunner_init, | 179 | .init_machine = roadrunner_init, |
| 180 | .restart = ixp23xx_restart, | ||
| 180 | MACHINE_END | 181 | MACHINE_END |
diff --git a/arch/arm/mach-ixp4xx/avila-setup.c b/arch/arm/mach-ixp4xx/avila-setup.c index 37609a22c45..a7277ad470a 100644 --- a/arch/arm/mach-ixp4xx/avila-setup.c +++ b/arch/arm/mach-ixp4xx/avila-setup.c | |||
| @@ -172,6 +172,7 @@ MACHINE_START(AVILA, "Gateworks Avila Network Platform") | |||
| 172 | #if defined(CONFIG_PCI) | 172 | #if defined(CONFIG_PCI) |
| 173 | .dma_zone_size = SZ_64M, | 173 | .dma_zone_size = SZ_64M, |
| 174 | #endif | 174 | #endif |
| 175 | .restart = ixp4xx_restart, | ||
| 175 | MACHINE_END | 176 | MACHINE_END |
| 176 | 177 | ||
| 177 | /* | 178 | /* |
| @@ -190,6 +191,7 @@ MACHINE_START(LOFT, "Giant Shoulder Inc Loft board") | |||
| 190 | #if defined(CONFIG_PCI) | 191 | #if defined(CONFIG_PCI) |
| 191 | .dma_zone_size = SZ_64M, | 192 | .dma_zone_size = SZ_64M, |
| 192 | #endif | 193 | #endif |
| 194 | .restart = ixp4xx_restart, | ||
| 193 | MACHINE_END | 195 | MACHINE_END |
| 194 | #endif | 196 | #endif |
| 195 | 197 | ||
diff --git a/arch/arm/mach-ixp4xx/common.c b/arch/arm/mach-ixp4xx/common.c index b86a0055ab9..04aa12103bc 100644 --- a/arch/arm/mach-ixp4xx/common.c +++ b/arch/arm/mach-ixp4xx/common.c | |||
| @@ -501,3 +501,23 @@ static void __init ixp4xx_clockevent_init(void) | |||
| 501 | 501 | ||
| 502 | clockevents_register_device(&clockevent_ixp4xx); | 502 | clockevents_register_device(&clockevent_ixp4xx); |
| 503 | } | 503 | } |
| 504 | |||
| 505 | void ixp4xx_restart(char mode, const char *cmd) | ||
| 506 | { | ||
| 507 | if ( 1 && mode == 's') { | ||
| 508 | /* Jump into ROM at address 0 */ | ||
| 509 | soft_restart(0); | ||
| 510 | } else { | ||
| 511 | /* Use on-chip reset capability */ | ||
| 512 | |||
| 513 | /* set the "key" register to enable access to | ||
| 514 | * "timer" and "enable" registers | ||
| 515 | */ | ||
| 516 | *IXP4XX_OSWK = IXP4XX_WDT_KEY; | ||
| 517 | |||
| 518 | /* write 0 to the timer register for an immediate reset */ | ||
| 519 | *IXP4XX_OSWT = 0; | ||
| 520 | |||
| 521 | *IXP4XX_OSWE = IXP4XX_WDT_RESET_ENABLE | IXP4XX_WDT_COUNT_ENABLE; | ||
| 522 | } | ||
| 523 | } | ||
diff --git a/arch/arm/mach-ixp4xx/coyote-setup.c b/arch/arm/mach-ixp4xx/coyote-setup.c index 81dfec31842..a74f86ce8bc 100644 --- a/arch/arm/mach-ixp4xx/coyote-setup.c +++ b/arch/arm/mach-ixp4xx/coyote-setup.c | |||
| @@ -117,6 +117,7 @@ MACHINE_START(ADI_COYOTE, "ADI Engineering Coyote") | |||
| 117 | #if defined(CONFIG_PCI) | 117 | #if defined(CONFIG_PCI) |
| 118 | .dma_zone_size = SZ_64M, | 118 | .dma_zone_size = SZ_64M, |
| 119 | #endif | 119 | #endif |
| 120 | .restart = ixp4xx_restart, | ||
| 120 | MACHINE_END | 121 | MACHINE_END |
| 121 | #endif | 122 | #endif |
| 122 | 123 | ||
| @@ -132,6 +133,7 @@ MACHINE_START(IXDPG425, "Intel IXDPG425") | |||
| 132 | .timer = &ixp4xx_timer, | 133 | .timer = &ixp4xx_timer, |
| 133 | .atag_offset = 0x100, | 134 | .atag_offset = 0x100, |
| 134 | .init_machine = coyote_init, | 135 | .init_machine = coyote_init, |
| 136 | .restart = ixp4xx_restart, | ||
| 135 | MACHINE_END | 137 | MACHINE_END |
| 136 | #endif | 138 | #endif |
| 137 | 139 | ||
diff --git a/arch/arm/mach-ixp4xx/dsmg600-setup.c b/arch/arm/mach-ixp4xx/dsmg600-setup.c index 8837fbca27c..67be177b336 100644 --- a/arch/arm/mach-ixp4xx/dsmg600-setup.c +++ b/arch/arm/mach-ixp4xx/dsmg600-setup.c | |||
| @@ -286,4 +286,5 @@ MACHINE_START(DSMG600, "D-Link DSM-G600 RevA") | |||
| 286 | #if defined(CONFIG_PCI) | 286 | #if defined(CONFIG_PCI) |
| 287 | .dma_zone_size = SZ_64M, | 287 | .dma_zone_size = SZ_64M, |
| 288 | #endif | 288 | #endif |
| 289 | .restart = ixp4xx_restart, | ||
| 289 | MACHINE_END | 290 | MACHINE_END |
diff --git a/arch/arm/mach-ixp4xx/fsg-setup.c b/arch/arm/mach-ixp4xx/fsg-setup.c index 2887c3578c1..6d5818285af 100644 --- a/arch/arm/mach-ixp4xx/fsg-setup.c +++ b/arch/arm/mach-ixp4xx/fsg-setup.c | |||
| @@ -277,5 +277,6 @@ MACHINE_START(FSG, "Freecom FSG-3") | |||
| 277 | #if defined(CONFIG_PCI) | 277 | #if defined(CONFIG_PCI) |
| 278 | .dma_zone_size = SZ_64M, | 278 | .dma_zone_size = SZ_64M, |
| 279 | #endif | 279 | #endif |
| 280 | .restart = ixp4xx_restart, | ||
| 280 | MACHINE_END | 281 | MACHINE_END |
| 281 | 282 | ||
diff --git a/arch/arm/mach-ixp4xx/gateway7001-setup.c b/arch/arm/mach-ixp4xx/gateway7001-setup.c index d69d1b053bb..7ecf9b28f1c 100644 --- a/arch/arm/mach-ixp4xx/gateway7001-setup.c +++ b/arch/arm/mach-ixp4xx/gateway7001-setup.c | |||
| @@ -104,5 +104,6 @@ MACHINE_START(GATEWAY7001, "Gateway 7001 AP") | |||
| 104 | #if defined(CONFIG_PCI) | 104 | #if defined(CONFIG_PCI) |
| 105 | .dma_zone_size = SZ_64M, | 105 | .dma_zone_size = SZ_64M, |
| 106 | #endif | 106 | #endif |
| 107 | .restart = ixp4xx_restart, | ||
| 107 | MACHINE_END | 108 | MACHINE_END |
| 108 | #endif | 109 | #endif |
diff --git a/arch/arm/mach-ixp4xx/goramo_mlr.c b/arch/arm/mach-ixp4xx/goramo_mlr.c index bf6678d1a92..c0e3d69a8ae 100644 --- a/arch/arm/mach-ixp4xx/goramo_mlr.c +++ b/arch/arm/mach-ixp4xx/goramo_mlr.c | |||
| @@ -504,4 +504,5 @@ MACHINE_START(GORAMO_MLR, "MultiLink") | |||
| 504 | #if defined(CONFIG_PCI) | 504 | #if defined(CONFIG_PCI) |
| 505 | .dma_zone_size = SZ_64M, | 505 | .dma_zone_size = SZ_64M, |
| 506 | #endif | 506 | #endif |
| 507 | .restart = ixp4xx_restart, | ||
| 507 | MACHINE_END | 508 | MACHINE_END |
diff --git a/arch/arm/mach-ixp4xx/gtwx5715-setup.c b/arch/arm/mach-ixp4xx/gtwx5715-setup.c index aa029fc1914..a23f8939145 100644 --- a/arch/arm/mach-ixp4xx/gtwx5715-setup.c +++ b/arch/arm/mach-ixp4xx/gtwx5715-setup.c | |||
| @@ -172,6 +172,7 @@ MACHINE_START(GTWX5715, "Gemtek GTWX5715 (Linksys WRV54G)") | |||
| 172 | #if defined(CONFIG_PCI) | 172 | #if defined(CONFIG_PCI) |
| 173 | .dma_zone_size = SZ_64M, | 173 | .dma_zone_size = SZ_64M, |
| 174 | #endif | 174 | #endif |
| 175 | .restart = ixp4xx_restart, | ||
| 175 | MACHINE_END | 176 | MACHINE_END |
| 176 | 177 | ||
| 177 | 178 | ||
diff --git a/arch/arm/mach-ixp4xx/include/mach/platform.h b/arch/arm/mach-ixp4xx/include/mach/platform.h index e824c02c825..df9250bbf13 100644 --- a/arch/arm/mach-ixp4xx/include/mach/platform.h +++ b/arch/arm/mach-ixp4xx/include/mach/platform.h | |||
| @@ -125,6 +125,7 @@ extern void ixp4xx_init_irq(void); | |||
| 125 | extern void ixp4xx_sys_init(void); | 125 | extern void ixp4xx_sys_init(void); |
| 126 | extern void ixp4xx_timer_init(void); | 126 | extern void ixp4xx_timer_init(void); |
| 127 | extern struct sys_timer ixp4xx_timer; | 127 | extern struct sys_timer ixp4xx_timer; |
| 128 | extern void ixp4xx_restart(char, const char *); | ||
| 128 | extern void ixp4xx_pci_preinit(void); | 129 | extern void ixp4xx_pci_preinit(void); |
| 129 | struct pci_sys_data; | 130 | struct pci_sys_data; |
| 130 | extern int ixp4xx_setup(int nr, struct pci_sys_data *sys); | 131 | extern int ixp4xx_setup(int nr, struct pci_sys_data *sys); |
diff --git a/arch/arm/mach-ixp4xx/include/mach/system.h b/arch/arm/mach-ixp4xx/include/mach/system.h index 24337d9d275..140a9bef446 100644 --- a/arch/arm/mach-ixp4xx/include/mach/system.h +++ b/arch/arm/mach-ixp4xx/include/mach/system.h | |||
| @@ -8,9 +8,6 @@ | |||
| 8 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
| 9 | * | 9 | * |
| 10 | */ | 10 | */ |
| 11 | |||
| 12 | #include <mach/hardware.h> | ||
| 13 | |||
| 14 | static inline void arch_idle(void) | 11 | static inline void arch_idle(void) |
| 15 | { | 12 | { |
| 16 | /* ixp4xx does not implement the XScale PWRMODE register, | 13 | /* ixp4xx does not implement the XScale PWRMODE register, |
| @@ -20,25 +17,3 @@ static inline void arch_idle(void) | |||
| 20 | cpu_do_idle(); | 17 | cpu_do_idle(); |
| 21 | #endif | 18 | #endif |
| 22 | } | 19 | } |
| 23 | |||
| 24 | |||
| 25 | static inline void arch_reset(char mode, const char *cmd) | ||
| 26 | { | ||
| 27 | if ( 1 && mode == 's') { | ||
| 28 | /* Jump into ROM at address 0 */ | ||
| 29 | soft_restart(0); | ||
| 30 | } else { | ||
| 31 | /* Use on-chip reset capability */ | ||
| 32 | |||
| 33 | /* set the "key" register to enable access to | ||
| 34 | * "timer" and "enable" registers | ||
| 35 | */ | ||
| 36 | *IXP4XX_OSWK = IXP4XX_WDT_KEY; | ||
| 37 | |||
| 38 | /* write 0 to the timer register for an immediate reset */ | ||
| 39 | *IXP4XX_OSWT = 0; | ||
| 40 | |||
| 41 | *IXP4XX_OSWE = IXP4XX_WDT_RESET_ENABLE | IXP4XX_WDT_COUNT_ENABLE; | ||
| 42 | } | ||
| 43 | } | ||
| 44 | |||
diff --git a/arch/arm/mach-ixp4xx/ixdp425-setup.c b/arch/arm/mach-ixp4xx/ixdp425-setup.c index f235f829dfa..8a38b39999f 100644 --- a/arch/arm/mach-ixp4xx/ixdp425-setup.c +++ b/arch/arm/mach-ixp4xx/ixdp425-setup.c | |||
| @@ -261,6 +261,7 @@ MACHINE_START(IXDP425, "Intel IXDP425 Development Platform") | |||
| 261 | #if defined(CONFIG_PCI) | 261 | #if defined(CONFIG_PCI) |
| 262 | .dma_zone_size = SZ_64M, | 262 | .dma_zone_size = SZ_64M, |
| 263 | #endif | 263 | #endif |
| 264 | .restart = ixp4xx_restart, | ||
| 264 | MACHINE_END | 265 | MACHINE_END |
| 265 | #endif | 266 | #endif |
| 266 | 267 | ||
diff --git a/arch/arm/mach-ixp4xx/nas100d-setup.c b/arch/arm/mach-ixp4xx/nas100d-setup.c index de716fa1aab..1010eb7b008 100644 --- a/arch/arm/mach-ixp4xx/nas100d-setup.c +++ b/arch/arm/mach-ixp4xx/nas100d-setup.c | |||
| @@ -321,4 +321,5 @@ MACHINE_START(NAS100D, "Iomega NAS 100d") | |||
| 321 | #if defined(CONFIG_PCI) | 321 | #if defined(CONFIG_PCI) |
| 322 | .dma_zone_size = SZ_64M, | 322 | .dma_zone_size = SZ_64M, |
| 323 | #endif | 323 | #endif |
| 324 | .restart = ixp4xx_restart, | ||
| 324 | MACHINE_END | 325 | MACHINE_END |
diff --git a/arch/arm/mach-ixp4xx/nslu2-setup.c b/arch/arm/mach-ixp4xx/nslu2-setup.c index ac81ccb26bf..aa355c360d5 100644 --- a/arch/arm/mach-ixp4xx/nslu2-setup.c +++ b/arch/arm/mach-ixp4xx/nslu2-setup.c | |||
| @@ -307,4 +307,5 @@ MACHINE_START(NSLU2, "Linksys NSLU2") | |||
| 307 | #if defined(CONFIG_PCI) | 307 | #if defined(CONFIG_PCI) |
| 308 | .dma_zone_size = SZ_64M, | 308 | .dma_zone_size = SZ_64M, |
| 309 | #endif | 309 | #endif |
| 310 | .restart = ixp4xx_restart, | ||
| 310 | MACHINE_END | 311 | MACHINE_END |
diff --git a/arch/arm/mach-ixp4xx/omixp-setup.c b/arch/arm/mach-ixp4xx/omixp-setup.c index 3b6a81a696f..0940869fcfd 100644 --- a/arch/arm/mach-ixp4xx/omixp-setup.c +++ b/arch/arm/mach-ixp4xx/omixp-setup.c | |||
| @@ -246,6 +246,7 @@ MACHINE_START(DEVIXP, "Omicron DEVIXP") | |||
| 246 | .init_irq = ixp4xx_init_irq, | 246 | .init_irq = ixp4xx_init_irq, |
| 247 | .timer = &ixp4xx_timer, | 247 | .timer = &ixp4xx_timer, |
| 248 | .init_machine = omixp_init, | 248 | .init_machine = omixp_init, |
| 249 | .restart = ixp4xx_restart, | ||
| 249 | MACHINE_END | 250 | MACHINE_END |
| 250 | #endif | 251 | #endif |
| 251 | 252 | ||
| @@ -259,6 +260,7 @@ MACHINE_START(MICCPT, "Omicron MICCPT") | |||
| 259 | #if defined(CONFIG_PCI) | 260 | #if defined(CONFIG_PCI) |
| 260 | .dma_zone_size = SZ_64M, | 261 | .dma_zone_size = SZ_64M, |
| 261 | #endif | 262 | #endif |
| 263 | .restart = ixp4xx_restart, | ||
| 262 | MACHINE_END | 264 | MACHINE_END |
| 263 | #endif | 265 | #endif |
| 264 | 266 | ||
| @@ -269,5 +271,6 @@ MACHINE_START(MIC256, "Omicron MIC256") | |||
| 269 | .init_irq = ixp4xx_init_irq, | 271 | .init_irq = ixp4xx_init_irq, |
| 270 | .timer = &ixp4xx_timer, | 272 | .timer = &ixp4xx_timer, |
| 271 | .init_machine = omixp_init, | 273 | .init_machine = omixp_init, |
| 274 | .restart = ixp4xx_restart, | ||
| 272 | MACHINE_END | 275 | MACHINE_END |
| 273 | #endif | 276 | #endif |
diff --git a/arch/arm/mach-ixp4xx/vulcan-setup.c b/arch/arm/mach-ixp4xx/vulcan-setup.c index 27e469ef452..9dec2068329 100644 --- a/arch/arm/mach-ixp4xx/vulcan-setup.c +++ b/arch/arm/mach-ixp4xx/vulcan-setup.c | |||
| @@ -244,4 +244,5 @@ MACHINE_START(ARCOM_VULCAN, "Arcom/Eurotech Vulcan") | |||
| 244 | #if defined(CONFIG_PCI) | 244 | #if defined(CONFIG_PCI) |
| 245 | .dma_zone_size = SZ_64M, | 245 | .dma_zone_size = SZ_64M, |
| 246 | #endif | 246 | #endif |
| 247 | .restart = ixp4xx_restart, | ||
| 247 | MACHINE_END | 248 | MACHINE_END |
diff --git a/arch/arm/mach-ixp4xx/wg302v2-setup.c b/arch/arm/mach-ixp4xx/wg302v2-setup.c index b14144b967a..5ac0f0a0fd8 100644 --- a/arch/arm/mach-ixp4xx/wg302v2-setup.c +++ b/arch/arm/mach-ixp4xx/wg302v2-setup.c | |||
| @@ -105,5 +105,6 @@ MACHINE_START(WG302V2, "Netgear WG302 v2 / WAG302 v2") | |||
| 105 | #if defined(CONFIG_PCI) | 105 | #if defined(CONFIG_PCI) |
| 106 | .dma_zone_size = SZ_64M, | 106 | .dma_zone_size = SZ_64M, |
| 107 | #endif | 107 | #endif |
| 108 | .restart = ixp4xx_restart, | ||
| 108 | MACHINE_END | 109 | MACHINE_END |
| 109 | #endif | 110 | #endif |
diff --git a/arch/arm/mach-kirkwood/common.c b/arch/arm/mach-kirkwood/common.c index f3248cfbe51..0bff4a91623 100644 --- a/arch/arm/mach-kirkwood/common.c +++ b/arch/arm/mach-kirkwood/common.c | |||
| @@ -534,3 +534,19 @@ static int __init kirkwood_clock_gate(void) | |||
| 534 | return 0; | 534 | return 0; |
| 535 | } | 535 | } |
| 536 | late_initcall(kirkwood_clock_gate); | 536 | late_initcall(kirkwood_clock_gate); |
| 537 | |||
| 538 | void kirkwood_restart(char mode, const char *cmd) | ||
| 539 | { | ||
| 540 | /* | ||
| 541 | * Enable soft reset to assert RSTOUTn. | ||
| 542 | */ | ||
| 543 | writel(SOFT_RESET_OUT_EN, RSTOUTn_MASK); | ||
| 544 | |||
| 545 | /* | ||
| 546 | * Assert soft reset. | ||
| 547 | */ | ||
| 548 | writel(SOFT_RESET, SYSTEM_SOFT_RESET); | ||
| 549 | |||
| 550 | while (1) | ||
| 551 | ; | ||
| 552 | } | ||
diff --git a/arch/arm/mach-kirkwood/common.h b/arch/arm/mach-kirkwood/common.h index b9b0f0968a3..1529280246d 100644 --- a/arch/arm/mach-kirkwood/common.h +++ b/arch/arm/mach-kirkwood/common.h | |||
| @@ -50,6 +50,7 @@ void kirkwood_uart1_init(void); | |||
| 50 | void kirkwood_nand_init(struct mtd_partition *parts, int nr_parts, int delay); | 50 | void kirkwood_nand_init(struct mtd_partition *parts, int nr_parts, int delay); |
| 51 | void kirkwood_nand_init_rnb(struct mtd_partition *parts, int nr_parts, int (*dev_ready)(struct mtd_info *)); | 51 | void kirkwood_nand_init_rnb(struct mtd_partition *parts, int nr_parts, int (*dev_ready)(struct mtd_info *)); |
| 52 | void kirkwood_audio_init(void); | 52 | void kirkwood_audio_init(void); |
| 53 | void kirkwood_restart(char, const char *); | ||
| 53 | 54 | ||
| 54 | extern int kirkwood_tclk; | 55 | extern int kirkwood_tclk; |
| 55 | extern struct sys_timer kirkwood_timer; | 56 | extern struct sys_timer kirkwood_timer; |
diff --git a/arch/arm/mach-kirkwood/d2net_v2-setup.c b/arch/arm/mach-kirkwood/d2net_v2-setup.c index f457e07a65f..6e1bac929ab 100644 --- a/arch/arm/mach-kirkwood/d2net_v2-setup.c +++ b/arch/arm/mach-kirkwood/d2net_v2-setup.c | |||
| @@ -227,4 +227,5 @@ MACHINE_START(D2NET_V2, "LaCie d2 Network v2") | |||
| 227 | .init_early = kirkwood_init_early, | 227 | .init_early = kirkwood_init_early, |
| 228 | .init_irq = kirkwood_init_irq, | 228 | .init_irq = kirkwood_init_irq, |
| 229 | .timer = &kirkwood_timer, | 229 | .timer = &kirkwood_timer, |
| 230 | .restart = kirkwood_restart, | ||
| 230 | MACHINE_END | 231 | MACHINE_END |
diff --git a/arch/arm/mach-kirkwood/db88f6281-bp-setup.c b/arch/arm/mach-kirkwood/db88f6281-bp-setup.c index ff4c21c1f92..d9335937959 100644 --- a/arch/arm/mach-kirkwood/db88f6281-bp-setup.c +++ b/arch/arm/mach-kirkwood/db88f6281-bp-setup.c | |||
| @@ -103,4 +103,5 @@ MACHINE_START(DB88F6281_BP, "Marvell DB-88F6281-BP Development Board") | |||
| 103 | .init_early = kirkwood_init_early, | 103 | .init_early = kirkwood_init_early, |
| 104 | .init_irq = kirkwood_init_irq, | 104 | .init_irq = kirkwood_init_irq, |
| 105 | .timer = &kirkwood_timer, | 105 | .timer = &kirkwood_timer, |
| 106 | .restart = kirkwood_restart, | ||
| 106 | MACHINE_END | 107 | MACHINE_END |
diff --git a/arch/arm/mach-kirkwood/dockstar-setup.c b/arch/arm/mach-kirkwood/dockstar-setup.c index e4d199b2b1e..61d9a552a05 100644 --- a/arch/arm/mach-kirkwood/dockstar-setup.c +++ b/arch/arm/mach-kirkwood/dockstar-setup.c | |||
| @@ -108,4 +108,5 @@ MACHINE_START(DOCKSTAR, "Seagate FreeAgent DockStar") | |||
| 108 | .init_early = kirkwood_init_early, | 108 | .init_early = kirkwood_init_early, |
| 109 | .init_irq = kirkwood_init_irq, | 109 | .init_irq = kirkwood_init_irq, |
| 110 | .timer = &kirkwood_timer, | 110 | .timer = &kirkwood_timer, |
| 111 | .restart = kirkwood_restart, | ||
| 111 | MACHINE_END | 112 | MACHINE_END |
diff --git a/arch/arm/mach-kirkwood/guruplug-setup.c b/arch/arm/mach-kirkwood/guruplug-setup.c index 6c40f784b51..bdaed3867d1 100644 --- a/arch/arm/mach-kirkwood/guruplug-setup.c +++ b/arch/arm/mach-kirkwood/guruplug-setup.c | |||
| @@ -127,4 +127,5 @@ MACHINE_START(GURUPLUG, "Marvell GuruPlug Reference Board") | |||
| 127 | .init_early = kirkwood_init_early, | 127 | .init_early = kirkwood_init_early, |
| 128 | .init_irq = kirkwood_init_irq, | 128 | .init_irq = kirkwood_init_irq, |
| 129 | .timer = &kirkwood_timer, | 129 | .timer = &kirkwood_timer, |
| 130 | .restart = kirkwood_restart, | ||
| 130 | MACHINE_END | 131 | MACHINE_END |
diff --git a/arch/arm/mach-kirkwood/include/mach/system.h b/arch/arm/mach-kirkwood/include/mach/system.h index 7568e95d279..5fddde002b5 100644 --- a/arch/arm/mach-kirkwood/include/mach/system.h +++ b/arch/arm/mach-kirkwood/include/mach/system.h | |||
| @@ -9,28 +9,9 @@ | |||
| 9 | #ifndef __ASM_ARCH_SYSTEM_H | 9 | #ifndef __ASM_ARCH_SYSTEM_H |
| 10 | #define __ASM_ARCH_SYSTEM_H | 10 | #define __ASM_ARCH_SYSTEM_H |
| 11 | 11 | ||
| 12 | #include <mach/bridge-regs.h> | ||
| 13 | |||
| 14 | static inline void arch_idle(void) | 12 | static inline void arch_idle(void) |
| 15 | { | 13 | { |
| 16 | cpu_do_idle(); | 14 | cpu_do_idle(); |
| 17 | } | 15 | } |
| 18 | 16 | ||
| 19 | static inline void arch_reset(char mode, const char *cmd) | ||
| 20 | { | ||
| 21 | /* | ||
| 22 | * Enable soft reset to assert RSTOUTn. | ||
| 23 | */ | ||
| 24 | writel(SOFT_RESET_OUT_EN, RSTOUTn_MASK); | ||
| 25 | |||
| 26 | /* | ||
| 27 | * Assert soft reset. | ||
| 28 | */ | ||
| 29 | writel(SOFT_RESET, SYSTEM_SOFT_RESET); | ||
| 30 | |||
| 31 | while (1) | ||
| 32 | ; | ||
| 33 | } | ||
| 34 | |||
| 35 | |||
| 36 | #endif | 17 | #endif |
diff --git a/arch/arm/mach-kirkwood/mv88f6281gtw_ge-setup.c b/arch/arm/mach-kirkwood/mv88f6281gtw_ge-setup.c index 9a1e917352f..85f6169c248 100644 --- a/arch/arm/mach-kirkwood/mv88f6281gtw_ge-setup.c +++ b/arch/arm/mach-kirkwood/mv88f6281gtw_ge-setup.c | |||
| @@ -169,4 +169,5 @@ MACHINE_START(MV88F6281GTW_GE, "Marvell 88F6281 GTW GE Board") | |||
| 169 | .init_early = kirkwood_init_early, | 169 | .init_early = kirkwood_init_early, |
| 170 | .init_irq = kirkwood_init_irq, | 170 | .init_irq = kirkwood_init_irq, |
| 171 | .timer = &kirkwood_timer, | 171 | .timer = &kirkwood_timer, |
| 172 | .restart = kirkwood_restart, | ||
| 172 | MACHINE_END | 173 | MACHINE_END |
diff --git a/arch/arm/mach-kirkwood/netspace_v2-setup.c b/arch/arm/mach-kirkwood/netspace_v2-setup.c index 8849bcc7328..e6bba01bae3 100644 --- a/arch/arm/mach-kirkwood/netspace_v2-setup.c +++ b/arch/arm/mach-kirkwood/netspace_v2-setup.c | |||
| @@ -264,6 +264,7 @@ MACHINE_START(NETSPACE_V2, "LaCie Network Space v2") | |||
| 264 | .init_early = kirkwood_init_early, | 264 | .init_early = kirkwood_init_early, |
| 265 | .init_irq = kirkwood_init_irq, | 265 | .init_irq = kirkwood_init_irq, |
| 266 | .timer = &kirkwood_timer, | 266 | .timer = &kirkwood_timer, |
| 267 | .restart = kirkwood_restart, | ||
| 267 | MACHINE_END | 268 | MACHINE_END |
| 268 | #endif | 269 | #endif |
| 269 | 270 | ||
| @@ -275,6 +276,7 @@ MACHINE_START(INETSPACE_V2, "LaCie Internet Space v2") | |||
| 275 | .init_early = kirkwood_init_early, | 276 | .init_early = kirkwood_init_early, |
| 276 | .init_irq = kirkwood_init_irq, | 277 | .init_irq = kirkwood_init_irq, |
| 277 | .timer = &kirkwood_timer, | 278 | .timer = &kirkwood_timer, |
| 279 | .restart = kirkwood_restart, | ||
| 278 | MACHINE_END | 280 | MACHINE_END |
| 279 | #endif | 281 | #endif |
| 280 | 282 | ||
| @@ -286,5 +288,6 @@ MACHINE_START(NETSPACE_MAX_V2, "LaCie Network Space Max v2") | |||
| 286 | .init_early = kirkwood_init_early, | 288 | .init_early = kirkwood_init_early, |
| 287 | .init_irq = kirkwood_init_irq, | 289 | .init_irq = kirkwood_init_irq, |
| 288 | .timer = &kirkwood_timer, | 290 | .timer = &kirkwood_timer, |
| 291 | .restart = kirkwood_restart, | ||
| 289 | MACHINE_END | 292 | MACHINE_END |
| 290 | #endif | 293 | #endif |
diff --git a/arch/arm/mach-kirkwood/netxbig_v2-setup.c b/arch/arm/mach-kirkwood/netxbig_v2-setup.c index 1ba12c4dff8..31ae8de34e9 100644 --- a/arch/arm/mach-kirkwood/netxbig_v2-setup.c +++ b/arch/arm/mach-kirkwood/netxbig_v2-setup.c | |||
| @@ -405,6 +405,7 @@ MACHINE_START(NET2BIG_V2, "LaCie 2Big Network v2") | |||
| 405 | .init_early = kirkwood_init_early, | 405 | .init_early = kirkwood_init_early, |
| 406 | .init_irq = kirkwood_init_irq, | 406 | .init_irq = kirkwood_init_irq, |
| 407 | .timer = &kirkwood_timer, | 407 | .timer = &kirkwood_timer, |
| 408 | .restart = kirkwood_restart, | ||
| 408 | MACHINE_END | 409 | MACHINE_END |
| 409 | #endif | 410 | #endif |
| 410 | 411 | ||
| @@ -416,5 +417,6 @@ MACHINE_START(NET5BIG_V2, "LaCie 5Big Network v2") | |||
| 416 | .init_early = kirkwood_init_early, | 417 | .init_early = kirkwood_init_early, |
| 417 | .init_irq = kirkwood_init_irq, | 418 | .init_irq = kirkwood_init_irq, |
| 418 | .timer = &kirkwood_timer, | 419 | .timer = &kirkwood_timer, |
| 420 | .restart = kirkwood_restart, | ||
| 419 | MACHINE_END | 421 | MACHINE_END |
| 420 | #endif | 422 | #endif |
diff --git a/arch/arm/mach-kirkwood/openrd-setup.c b/arch/arm/mach-kirkwood/openrd-setup.c index 5660ca6c3d8..01f8c899288 100644 --- a/arch/arm/mach-kirkwood/openrd-setup.c +++ b/arch/arm/mach-kirkwood/openrd-setup.c | |||
| @@ -220,6 +220,7 @@ MACHINE_START(OPENRD_BASE, "Marvell OpenRD Base Board") | |||
| 220 | .init_early = kirkwood_init_early, | 220 | .init_early = kirkwood_init_early, |
| 221 | .init_irq = kirkwood_init_irq, | 221 | .init_irq = kirkwood_init_irq, |
| 222 | .timer = &kirkwood_timer, | 222 | .timer = &kirkwood_timer, |
| 223 | .restart = kirkwood_restart, | ||
| 223 | MACHINE_END | 224 | MACHINE_END |
| 224 | #endif | 225 | #endif |
| 225 | 226 | ||
| @@ -232,6 +233,7 @@ MACHINE_START(OPENRD_CLIENT, "Marvell OpenRD Client Board") | |||
| 232 | .init_early = kirkwood_init_early, | 233 | .init_early = kirkwood_init_early, |
| 233 | .init_irq = kirkwood_init_irq, | 234 | .init_irq = kirkwood_init_irq, |
| 234 | .timer = &kirkwood_timer, | 235 | .timer = &kirkwood_timer, |
| 236 | .restart = kirkwood_restart, | ||
| 235 | MACHINE_END | 237 | MACHINE_END |
| 236 | #endif | 238 | #endif |
| 237 | 239 | ||
| @@ -244,5 +246,6 @@ MACHINE_START(OPENRD_ULTIMATE, "Marvell OpenRD Ultimate Board") | |||
| 244 | .init_early = kirkwood_init_early, | 246 | .init_early = kirkwood_init_early, |
| 245 | .init_irq = kirkwood_init_irq, | 247 | .init_irq = kirkwood_init_irq, |
| 246 | .timer = &kirkwood_timer, | 248 | .timer = &kirkwood_timer, |
| 249 | .restart = kirkwood_restart, | ||
| 247 | MACHINE_END | 250 | MACHINE_END |
| 248 | #endif | 251 | #endif |
diff --git a/arch/arm/mach-kirkwood/rd88f6192-nas-setup.c b/arch/arm/mach-kirkwood/rd88f6192-nas-setup.c index 6663869773a..fd2c9c8b683 100644 --- a/arch/arm/mach-kirkwood/rd88f6192-nas-setup.c +++ b/arch/arm/mach-kirkwood/rd88f6192-nas-setup.c | |||
| @@ -85,4 +85,5 @@ MACHINE_START(RD88F6192_NAS, "Marvell RD-88F6192-NAS Development Board") | |||
| 85 | .init_early = kirkwood_init_early, | 85 | .init_early = kirkwood_init_early, |
| 86 | .init_irq = kirkwood_init_irq, | 86 | .init_irq = kirkwood_init_irq, |
| 87 | .timer = &kirkwood_timer, | 87 | .timer = &kirkwood_timer, |
| 88 | .restart = kirkwood_restart, | ||
| 88 | MACHINE_END | 89 | MACHINE_END |
diff --git a/arch/arm/mach-kirkwood/rd88f6281-setup.c b/arch/arm/mach-kirkwood/rd88f6281-setup.c index 66b3c05e37a..ef922079348 100644 --- a/arch/arm/mach-kirkwood/rd88f6281-setup.c +++ b/arch/arm/mach-kirkwood/rd88f6281-setup.c | |||
| @@ -121,4 +121,5 @@ MACHINE_START(RD88F6281, "Marvell RD-88F6281 Reference Board") | |||
| 121 | .init_early = kirkwood_init_early, | 121 | .init_early = kirkwood_init_early, |
| 122 | .init_irq = kirkwood_init_irq, | 122 | .init_irq = kirkwood_init_irq, |
| 123 | .timer = &kirkwood_timer, | 123 | .timer = &kirkwood_timer, |
| 124 | .restart = kirkwood_restart, | ||
| 124 | MACHINE_END | 125 | MACHINE_END |
diff --git a/arch/arm/mach-kirkwood/sheevaplug-setup.c b/arch/arm/mach-kirkwood/sheevaplug-setup.c index 8b102d62e82..85bff6b7699 100644 --- a/arch/arm/mach-kirkwood/sheevaplug-setup.c +++ b/arch/arm/mach-kirkwood/sheevaplug-setup.c | |||
| @@ -144,6 +144,7 @@ MACHINE_START(SHEEVAPLUG, "Marvell SheevaPlug Reference Board") | |||
| 144 | .init_early = kirkwood_init_early, | 144 | .init_early = kirkwood_init_early, |
| 145 | .init_irq = kirkwood_init_irq, | 145 | .init_irq = kirkwood_init_irq, |
| 146 | .timer = &kirkwood_timer, | 146 | .timer = &kirkwood_timer, |
| 147 | .restart = kirkwood_restart, | ||
| 147 | MACHINE_END | 148 | MACHINE_END |
| 148 | #endif | 149 | #endif |
| 149 | 150 | ||
| @@ -155,5 +156,6 @@ MACHINE_START(ESATA_SHEEVAPLUG, "Marvell eSATA SheevaPlug Reference Board") | |||
| 155 | .init_early = kirkwood_init_early, | 156 | .init_early = kirkwood_init_early, |
| 156 | .init_irq = kirkwood_init_irq, | 157 | .init_irq = kirkwood_init_irq, |
| 157 | .timer = &kirkwood_timer, | 158 | .timer = &kirkwood_timer, |
| 159 | .restart = kirkwood_restart, | ||
| 158 | MACHINE_END | 160 | MACHINE_END |
| 159 | #endif | 161 | #endif |
diff --git a/arch/arm/mach-kirkwood/t5325-setup.c b/arch/arm/mach-kirkwood/t5325-setup.c index ea104fb5ec3..966b2b3bb81 100644 --- a/arch/arm/mach-kirkwood/t5325-setup.c +++ b/arch/arm/mach-kirkwood/t5325-setup.c | |||
| @@ -207,4 +207,5 @@ MACHINE_START(T5325, "HP t5325 Thin Client") | |||
| 207 | .init_early = kirkwood_init_early, | 207 | .init_early = kirkwood_init_early, |
| 208 | .init_irq = kirkwood_init_irq, | 208 | .init_irq = kirkwood_init_irq, |
| 209 | .timer = &kirkwood_timer, | 209 | .timer = &kirkwood_timer, |
| 210 | .restart = kirkwood_restart, | ||
| 210 | MACHINE_END | 211 | MACHINE_END |
diff --git a/arch/arm/mach-kirkwood/ts219-setup.c b/arch/arm/mach-kirkwood/ts219-setup.c index 262c034836d..73e2b6ca956 100644 --- a/arch/arm/mach-kirkwood/ts219-setup.c +++ b/arch/arm/mach-kirkwood/ts219-setup.c | |||
| @@ -138,4 +138,5 @@ MACHINE_START(TS219, "QNAP TS-119/TS-219") | |||
| 138 | .init_early = kirkwood_init_early, | 138 | .init_early = kirkwood_init_early, |
| 139 | .init_irq = kirkwood_init_irq, | 139 | .init_irq = kirkwood_init_irq, |
| 140 | .timer = &kirkwood_timer, | 140 | .timer = &kirkwood_timer, |
| 141 | .restart = kirkwood_restart, | ||
| 141 | MACHINE_END | 142 | MACHINE_END |
diff --git a/arch/arm/mach-kirkwood/ts41x-setup.c b/arch/arm/mach-kirkwood/ts41x-setup.c index b68f5b4a9ec..5bbca268044 100644 --- a/arch/arm/mach-kirkwood/ts41x-setup.c +++ b/arch/arm/mach-kirkwood/ts41x-setup.c | |||
| @@ -182,4 +182,5 @@ MACHINE_START(TS41X, "QNAP TS-41x") | |||
| 182 | .init_early = kirkwood_init_early, | 182 | .init_early = kirkwood_init_early, |
| 183 | .init_irq = kirkwood_init_irq, | 183 | .init_irq = kirkwood_init_irq, |
| 184 | .timer = &kirkwood_timer, | 184 | .timer = &kirkwood_timer, |
| 185 | .restart = kirkwood_restart, | ||
| 185 | MACHINE_END | 186 | MACHINE_END |
diff --git a/arch/arm/mach-ks8695/board-acs5k.c b/arch/arm/mach-ks8695/board-acs5k.c index a91f99d265a..255502ddd87 100644 --- a/arch/arm/mach-ks8695/board-acs5k.c +++ b/arch/arm/mach-ks8695/board-acs5k.c | |||
| @@ -228,4 +228,5 @@ MACHINE_START(ACS5K, "Brivo Systems LLC ACS-5000 Master board") | |||
| 228 | .init_irq = ks8695_init_irq, | 228 | .init_irq = ks8695_init_irq, |
| 229 | .init_machine = acs5k_init, | 229 | .init_machine = acs5k_init, |
| 230 | .timer = &ks8695_timer, | 230 | .timer = &ks8695_timer, |
| 231 | .restart = ks8695_restart, | ||
| 231 | MACHINE_END | 232 | MACHINE_END |
diff --git a/arch/arm/mach-ks8695/board-dsm320.c b/arch/arm/mach-ks8695/board-dsm320.c index d24bcef2e2d..e0d36cef2c5 100644 --- a/arch/arm/mach-ks8695/board-dsm320.c +++ b/arch/arm/mach-ks8695/board-dsm320.c | |||
| @@ -126,4 +126,5 @@ MACHINE_START(DSM320, "D-Link DSM-320 Wireless Media Player") | |||
| 126 | .init_irq = ks8695_init_irq, | 126 | .init_irq = ks8695_init_irq, |
| 127 | .init_machine = dsm320_init, | 127 | .init_machine = dsm320_init, |
| 128 | .timer = &ks8695_timer, | 128 | .timer = &ks8695_timer, |
| 129 | .restart = ks8695_restart, | ||
| 129 | MACHINE_END | 130 | MACHINE_END |
diff --git a/arch/arm/mach-ks8695/board-micrel.c b/arch/arm/mach-ks8695/board-micrel.c index 16c95657f8f..a8270725b76 100644 --- a/arch/arm/mach-ks8695/board-micrel.c +++ b/arch/arm/mach-ks8695/board-micrel.c | |||
| @@ -58,4 +58,5 @@ MACHINE_START(KS8695, "KS8695 Centaur Development Board") | |||
| 58 | .init_irq = ks8695_init_irq, | 58 | .init_irq = ks8695_init_irq, |
| 59 | .init_machine = micrel_init, | 59 | .init_machine = micrel_init, |
| 60 | .timer = &ks8695_timer, | 60 | .timer = &ks8695_timer, |
| 61 | .restart = ks8695_restart, | ||
| 61 | MACHINE_END | 62 | MACHINE_END |
diff --git a/arch/arm/mach-ks8695/generic.h b/arch/arm/mach-ks8695/generic.h index 2fbfab8d5fa..f8bdb11a9c3 100644 --- a/arch/arm/mach-ks8695/generic.h +++ b/arch/arm/mach-ks8695/generic.h | |||
| @@ -12,4 +12,5 @@ | |||
| 12 | 12 | ||
| 13 | extern __init void ks8695_map_io(void); | 13 | extern __init void ks8695_map_io(void); |
| 14 | extern __init void ks8695_init_irq(void); | 14 | extern __init void ks8695_init_irq(void); |
| 15 | extern void ks8695_restart(char, const char *); | ||
| 15 | extern struct sys_timer ks8695_timer; | 16 | extern struct sys_timer ks8695_timer; |
diff --git a/arch/arm/mach-ks8695/include/mach/system.h b/arch/arm/mach-ks8695/include/mach/system.h index ceb19c90aa5..59fe992395b 100644 --- a/arch/arm/mach-ks8695/include/mach/system.h +++ b/arch/arm/mach-ks8695/include/mach/system.h | |||
| @@ -14,9 +14,6 @@ | |||
| 14 | #ifndef __ASM_ARCH_SYSTEM_H | 14 | #ifndef __ASM_ARCH_SYSTEM_H |
| 15 | #define __ASM_ARCH_SYSTEM_H | 15 | #define __ASM_ARCH_SYSTEM_H |
| 16 | 16 | ||
| 17 | #include <linux/io.h> | ||
| 18 | #include <mach/regs-timer.h> | ||
| 19 | |||
| 20 | static void arch_idle(void) | 17 | static void arch_idle(void) |
| 21 | { | 18 | { |
| 22 | /* | 19 | /* |
| @@ -27,22 +24,4 @@ static void arch_idle(void) | |||
| 27 | 24 | ||
| 28 | } | 25 | } |
| 29 | 26 | ||
| 30 | static void arch_reset(char mode, const char *cmd) | ||
| 31 | { | ||
| 32 | unsigned int reg; | ||
| 33 | |||
| 34 | if (mode == 's') | ||
| 35 | soft_restart(0); | ||
| 36 | |||
| 37 | /* disable timer0 */ | ||
| 38 | reg = __raw_readl(KS8695_TMR_VA + KS8695_TMCON); | ||
| 39 | __raw_writel(reg & ~TMCON_T0EN, KS8695_TMR_VA + KS8695_TMCON); | ||
| 40 | |||
| 41 | /* enable watchdog mode */ | ||
| 42 | __raw_writel((10 << 8) | T0TC_WATCHDOG, KS8695_TMR_VA + KS8695_T0TC); | ||
| 43 | |||
| 44 | /* re-enable timer0 */ | ||
| 45 | __raw_writel(reg | TMCON_T0EN, KS8695_TMR_VA + KS8695_TMCON); | ||
| 46 | } | ||
| 47 | |||
| 48 | #endif | 27 | #endif |
diff --git a/arch/arm/mach-ks8695/time.c b/arch/arm/mach-ks8695/time.c index 69c072c2c0f..37dfcd5bd2a 100644 --- a/arch/arm/mach-ks8695/time.c +++ b/arch/arm/mach-ks8695/time.c | |||
| @@ -109,3 +109,21 @@ struct sys_timer ks8695_timer = { | |||
| 109 | .offset = ks8695_gettimeoffset, | 109 | .offset = ks8695_gettimeoffset, |
| 110 | .resume = ks8695_timer_setup, | 110 | .resume = ks8695_timer_setup, |
| 111 | }; | 111 | }; |
| 112 | |||
| 113 | void ks8695_restart(char mode, const char *cmd) | ||
| 114 | { | ||
| 115 | unsigned int reg; | ||
| 116 | |||
| 117 | if (mode == 's') | ||
| 118 | soft_restart(0); | ||
| 119 | |||
| 120 | /* disable timer0 */ | ||
| 121 | reg = __raw_readl(KS8695_TMR_VA + KS8695_TMCON); | ||
| 122 | __raw_writel(reg & ~TMCON_T0EN, KS8695_TMR_VA + KS8695_TMCON); | ||
| 123 | |||
| 124 | /* enable watchdog mode */ | ||
| 125 | __raw_writel((10 << 8) | T0TC_WATCHDOG, KS8695_TMR_VA + KS8695_T0TC); | ||
| 126 | |||
| 127 | /* re-enable timer0 */ | ||
| 128 | __raw_writel(reg | TMCON_T0EN, KS8695_TMR_VA + KS8695_TMCON); | ||
| 129 | } | ||
diff --git a/arch/arm/mach-lpc32xx/common.c b/arch/arm/mach-lpc32xx/common.c index 205b2dbb565..369b152896c 100644 --- a/arch/arm/mach-lpc32xx/common.c +++ b/arch/arm/mach-lpc32xx/common.c | |||
| @@ -164,7 +164,7 @@ int clk_is_sysclk_mainosc(void) | |||
| 164 | /* | 164 | /* |
| 165 | * System reset via the watchdog timer | 165 | * System reset via the watchdog timer |
| 166 | */ | 166 | */ |
| 167 | void lpc32xx_watchdog_reset(void) | 167 | static void lpc32xx_watchdog_reset(void) |
| 168 | { | 168 | { |
| 169 | /* Make sure WDT clocks are enabled */ | 169 | /* Make sure WDT clocks are enabled */ |
| 170 | __raw_writel(LPC32XX_CLKPWR_PWMCLK_WDOG_EN, | 170 | __raw_writel(LPC32XX_CLKPWR_PWMCLK_WDOG_EN, |
| @@ -311,3 +311,21 @@ void __init lpc32xx_map_io(void) | |||
| 311 | { | 311 | { |
| 312 | iotable_init(lpc32xx_io_desc, ARRAY_SIZE(lpc32xx_io_desc)); | 312 | iotable_init(lpc32xx_io_desc, ARRAY_SIZE(lpc32xx_io_desc)); |
| 313 | } | 313 | } |
| 314 | |||
| 315 | void lpc23xx_restart(char mode, const char *cmd) | ||
| 316 | { | ||
| 317 | switch (mode) { | ||
| 318 | case 's': | ||
| 319 | case 'h': | ||
| 320 | lpc32xx_watchdog_reset(); | ||
| 321 | break; | ||
| 322 | |||
| 323 | default: | ||
| 324 | /* Do nothing */ | ||
| 325 | break; | ||
| 326 | } | ||
| 327 | |||
| 328 | /* Wait for watchdog to reset system */ | ||
| 329 | while (1) | ||
| 330 | ; | ||
| 331 | } | ||
diff --git a/arch/arm/mach-lpc32xx/common.h b/arch/arm/mach-lpc32xx/common.h index 5583f52662b..4b4e700343c 100644 --- a/arch/arm/mach-lpc32xx/common.h +++ b/arch/arm/mach-lpc32xx/common.h | |||
| @@ -39,6 +39,8 @@ extern void __init lpc32xx_init_irq(void); | |||
| 39 | extern void __init lpc32xx_map_io(void); | 39 | extern void __init lpc32xx_map_io(void); |
| 40 | extern void __init lpc32xx_serial_init(void); | 40 | extern void __init lpc32xx_serial_init(void); |
| 41 | extern void __init lpc32xx_gpio_init(void); | 41 | extern void __init lpc32xx_gpio_init(void); |
| 42 | extern void lpc23xx_restart(char, const char *); | ||
| 43 | |||
| 42 | 44 | ||
| 43 | /* | 45 | /* |
| 44 | * Structure used for setting up and querying the PLLS | 46 | * Structure used for setting up and querying the PLLS |
diff --git a/arch/arm/mach-lpc32xx/include/mach/system.h b/arch/arm/mach-lpc32xx/include/mach/system.h index d47f3b1c24b..bf176c99152 100644 --- a/arch/arm/mach-lpc32xx/include/mach/system.h +++ b/arch/arm/mach-lpc32xx/include/mach/system.h | |||
| @@ -24,26 +24,4 @@ static void arch_idle(void) | |||
| 24 | cpu_do_idle(); | 24 | cpu_do_idle(); |
| 25 | } | 25 | } |
| 26 | 26 | ||
| 27 | static inline void arch_reset(char mode, const char *cmd) | ||
| 28 | { | ||
| 29 | extern void lpc32xx_watchdog_reset(void); | ||
| 30 | |||
| 31 | switch (mode) { | ||
| 32 | case 's': | ||
| 33 | case 'h': | ||
| 34 | printk(KERN_CRIT "RESET: Rebooting system\n"); | ||
| 35 | |||
| 36 | lpc32xx_watchdog_reset(); | ||
| 37 | break; | ||
| 38 | |||
| 39 | default: | ||
| 40 | /* Do nothing */ | ||
| 41 | break; | ||
| 42 | } | ||
| 43 | |||
| 44 | /* Wait for watchdog to reset system */ | ||
| 45 | while (1) | ||
| 46 | ; | ||
| 47 | } | ||
| 48 | |||
| 49 | #endif | 27 | #endif |
diff --git a/arch/arm/mach-lpc32xx/phy3250.c b/arch/arm/mach-lpc32xx/phy3250.c index 6d2f0d1b937..ecb94114c81 100644 --- a/arch/arm/mach-lpc32xx/phy3250.c +++ b/arch/arm/mach-lpc32xx/phy3250.c | |||
| @@ -388,4 +388,5 @@ MACHINE_START(PHY3250, "Phytec 3250 board with the LPC3250 Microcontroller") | |||
| 388 | .init_irq = lpc32xx_init_irq, | 388 | .init_irq = lpc32xx_init_irq, |
| 389 | .timer = &lpc32xx_timer, | 389 | .timer = &lpc32xx_timer, |
| 390 | .init_machine = phy3250_board_init, | 390 | .init_machine = phy3250_board_init, |
| 391 | .restart = lpc23xx_restart, | ||
| 391 | MACHINE_END | 392 | MACHINE_END |
diff --git a/arch/arm/mach-mmp/aspenite.c b/arch/arm/mach-mmp/aspenite.c index 7a60bbbce7a..3e6dfab59ef 100644 --- a/arch/arm/mach-mmp/aspenite.c +++ b/arch/arm/mach-mmp/aspenite.c | |||
| @@ -243,6 +243,7 @@ MACHINE_START(ASPENITE, "PXA168-based Aspenite Development Platform") | |||
| 243 | .init_irq = pxa168_init_irq, | 243 | .init_irq = pxa168_init_irq, |
| 244 | .timer = &pxa168_timer, | 244 | .timer = &pxa168_timer, |
| 245 | .init_machine = common_init, | 245 | .init_machine = common_init, |
| 246 | .restart = pxa168_restart, | ||
| 246 | MACHINE_END | 247 | MACHINE_END |
| 247 | 248 | ||
| 248 | MACHINE_START(ZYLONITE2, "PXA168-based Zylonite2 Development Platform") | 249 | MACHINE_START(ZYLONITE2, "PXA168-based Zylonite2 Development Platform") |
| @@ -251,4 +252,5 @@ MACHINE_START(ZYLONITE2, "PXA168-based Zylonite2 Development Platform") | |||
| 251 | .init_irq = pxa168_init_irq, | 252 | .init_irq = pxa168_init_irq, |
| 252 | .timer = &pxa168_timer, | 253 | .timer = &pxa168_timer, |
| 253 | .init_machine = common_init, | 254 | .init_machine = common_init, |
| 255 | .restart = pxa168_restart, | ||
| 254 | MACHINE_END | 256 | MACHINE_END |
diff --git a/arch/arm/mach-mmp/avengers_lite.c b/arch/arm/mach-mmp/avengers_lite.c index 39f0878d64a..8de3dc6131a 100644 --- a/arch/arm/mach-mmp/avengers_lite.c +++ b/arch/arm/mach-mmp/avengers_lite.c | |||
| @@ -45,4 +45,5 @@ MACHINE_START(AVENGERS_LITE, "PXA168 Avengers lite Development Platform") | |||
| 45 | .init_irq = pxa168_init_irq, | 45 | .init_irq = pxa168_init_irq, |
| 46 | .timer = &pxa168_timer, | 46 | .timer = &pxa168_timer, |
| 47 | .init_machine = avengers_lite_init, | 47 | .init_machine = avengers_lite_init, |
| 48 | .restart = pxa168_restart, | ||
| 48 | MACHINE_END | 49 | MACHINE_END |
diff --git a/arch/arm/mach-mmp/brownstone.c b/arch/arm/mach-mmp/brownstone.c index 983cfb15fbd..e16f04b39b1 100644 --- a/arch/arm/mach-mmp/brownstone.c +++ b/arch/arm/mach-mmp/brownstone.c | |||
| @@ -219,4 +219,5 @@ MACHINE_START(BROWNSTONE, "Brownstone Development Platform") | |||
| 219 | .init_irq = mmp2_init_irq, | 219 | .init_irq = mmp2_init_irq, |
| 220 | .timer = &mmp2_timer, | 220 | .timer = &mmp2_timer, |
| 221 | .init_machine = brownstone_init, | 221 | .init_machine = brownstone_init, |
| 222 | .restart = mmp_restart, | ||
| 222 | MACHINE_END | 223 | MACHINE_END |
diff --git a/arch/arm/mach-mmp/common.c b/arch/arm/mach-mmp/common.c index 5720674739f..062b5b93c50 100644 --- a/arch/arm/mach-mmp/common.c +++ b/arch/arm/mach-mmp/common.c | |||
| @@ -45,3 +45,8 @@ void __init mmp_map_io(void) | |||
| 45 | /* this is early, initialize mmp_chip_id here */ | 45 | /* this is early, initialize mmp_chip_id here */ |
| 46 | mmp_chip_id = __raw_readl(MMP_CHIPID); | 46 | mmp_chip_id = __raw_readl(MMP_CHIPID); |
| 47 | } | 47 | } |
| 48 | |||
| 49 | void mmp_restart(char mode, const char *cmd) | ||
| 50 | { | ||
| 51 | soft_restart(0); | ||
| 52 | } | ||
diff --git a/arch/arm/mach-mmp/common.h b/arch/arm/mach-mmp/common.h index ec8d65ded25..1c9d6c1ea97 100644 --- a/arch/arm/mach-mmp/common.h +++ b/arch/arm/mach-mmp/common.h | |||
| @@ -6,3 +6,4 @@ extern void timer_init(int irq); | |||
| 6 | 6 | ||
| 7 | extern void __init icu_init_irq(void); | 7 | extern void __init icu_init_irq(void); |
| 8 | extern void __init mmp_map_io(void); | 8 | extern void __init mmp_map_io(void); |
| 9 | extern void mmp_restart(char, const char *); | ||
diff --git a/arch/arm/mach-mmp/flint.c b/arch/arm/mach-mmp/flint.c index c4fd806b15b..5a6a27a6cfd 100644 --- a/arch/arm/mach-mmp/flint.c +++ b/arch/arm/mach-mmp/flint.c | |||
| @@ -121,4 +121,5 @@ MACHINE_START(FLINT, "Flint Development Platform") | |||
| 121 | .init_irq = mmp2_init_irq, | 121 | .init_irq = mmp2_init_irq, |
| 122 | .timer = &mmp2_timer, | 122 | .timer = &mmp2_timer, |
| 123 | .init_machine = flint_init, | 123 | .init_machine = flint_init, |
| 124 | .restart = mmp_restart, | ||
| 124 | MACHINE_END | 125 | MACHINE_END |
diff --git a/arch/arm/mach-mmp/gplugd.c b/arch/arm/mach-mmp/gplugd.c index 4665767a4f7..1e3abbe37ca 100644 --- a/arch/arm/mach-mmp/gplugd.c +++ b/arch/arm/mach-mmp/gplugd.c | |||
| @@ -194,4 +194,5 @@ MACHINE_START(GPLUGD, "PXA168-based GuruPlug Display (gplugD) Platform") | |||
| 194 | .init_irq = pxa168_init_irq, | 194 | .init_irq = pxa168_init_irq, |
| 195 | .timer = &pxa168_timer, | 195 | .timer = &pxa168_timer, |
| 196 | .init_machine = gplugd_init, | 196 | .init_machine = gplugd_init, |
| 197 | .restart = pxa168_restart, | ||
| 197 | MACHINE_END | 198 | MACHINE_END |
diff --git a/arch/arm/mach-mmp/include/mach/pxa168.h b/arch/arm/mach-mmp/include/mach/pxa168.h index 7fb568d2845..a677aa732c2 100644 --- a/arch/arm/mach-mmp/include/mach/pxa168.h +++ b/arch/arm/mach-mmp/include/mach/pxa168.h | |||
| @@ -5,6 +5,7 @@ struct sys_timer; | |||
| 5 | 5 | ||
| 6 | extern struct sys_timer pxa168_timer; | 6 | extern struct sys_timer pxa168_timer; |
| 7 | extern void __init pxa168_init_irq(void); | 7 | extern void __init pxa168_init_irq(void); |
| 8 | extern void pxa168_restart(char, const char *); | ||
| 8 | extern void pxa168_clear_keypad_wakeup(void); | 9 | extern void pxa168_clear_keypad_wakeup(void); |
| 9 | 10 | ||
| 10 | #include <linux/i2c.h> | 11 | #include <linux/i2c.h> |
diff --git a/arch/arm/mach-mmp/include/mach/system.h b/arch/arm/mach-mmp/include/mach/system.h index cb0637933a8..1d001eab81e 100644 --- a/arch/arm/mach-mmp/include/mach/system.h +++ b/arch/arm/mach-mmp/include/mach/system.h | |||
| @@ -9,18 +9,8 @@ | |||
| 9 | #ifndef __ASM_MACH_SYSTEM_H | 9 | #ifndef __ASM_MACH_SYSTEM_H |
| 10 | #define __ASM_MACH_SYSTEM_H | 10 | #define __ASM_MACH_SYSTEM_H |
| 11 | 11 | ||
| 12 | #include <mach/cputype.h> | ||
| 13 | |||
| 14 | static inline void arch_idle(void) | 12 | static inline void arch_idle(void) |
| 15 | { | 13 | { |
| 16 | cpu_do_idle(); | 14 | cpu_do_idle(); |
| 17 | } | 15 | } |
| 18 | |||
| 19 | static inline void arch_reset(char mode, const char *cmd) | ||
| 20 | { | ||
| 21 | if (cpu_is_pxa168()) | ||
| 22 | soft_restart(0xffff0000); | ||
| 23 | else | ||
| 24 | soft_restart(0); | ||
| 25 | } | ||
| 26 | #endif /* __ASM_MACH_SYSTEM_H */ | 16 | #endif /* __ASM_MACH_SYSTEM_H */ |
diff --git a/arch/arm/mach-mmp/jasper.c b/arch/arm/mach-mmp/jasper.c index 8bfac661262..96cf5c8fe47 100644 --- a/arch/arm/mach-mmp/jasper.c +++ b/arch/arm/mach-mmp/jasper.c | |||
| @@ -175,4 +175,5 @@ MACHINE_START(MARVELL_JASPER, "Jasper Development Platform") | |||
| 175 | .init_irq = mmp2_init_irq, | 175 | .init_irq = mmp2_init_irq, |
| 176 | .timer = &mmp2_timer, | 176 | .timer = &mmp2_timer, |
| 177 | .init_machine = jasper_init, | 177 | .init_machine = jasper_init, |
| 178 | .restart = mmp_restart, | ||
| 178 | MACHINE_END | 179 | MACHINE_END |
diff --git a/arch/arm/mach-mmp/pxa168.c b/arch/arm/mach-mmp/pxa168.c index 76ca15c00e4..13f23867a86 100644 --- a/arch/arm/mach-mmp/pxa168.c +++ b/arch/arm/mach-mmp/pxa168.c | |||
| @@ -214,3 +214,8 @@ int __init pxa168_add_usb_host(struct pxa168_usb_pdata *pdata) | |||
| 214 | pxa168_device_usb_host.dev.platform_data = pdata; | 214 | pxa168_device_usb_host.dev.platform_data = pdata; |
| 215 | return platform_device_register(&pxa168_device_usb_host); | 215 | return platform_device_register(&pxa168_device_usb_host); |
| 216 | } | 216 | } |
| 217 | |||
| 218 | void pxa168_restart(char mode, const char *cmd) | ||
| 219 | { | ||
| 220 | soft_restart(0xffff0000); | ||
| 221 | } | ||
diff --git a/arch/arm/mach-mmp/tavorevb.c b/arch/arm/mach-mmp/tavorevb.c index eb5be879fd8..257a21283ec 100644 --- a/arch/arm/mach-mmp/tavorevb.c +++ b/arch/arm/mach-mmp/tavorevb.c | |||
| @@ -103,4 +103,5 @@ MACHINE_START(TAVOREVB, "PXA910 Evaluation Board (aka TavorEVB)") | |||
| 103 | .init_irq = pxa910_init_irq, | 103 | .init_irq = pxa910_init_irq, |
| 104 | .timer = &pxa910_timer, | 104 | .timer = &pxa910_timer, |
| 105 | .init_machine = tavorevb_init, | 105 | .init_machine = tavorevb_init, |
| 106 | .restart = mmp_restart, | ||
| 106 | MACHINE_END | 107 | MACHINE_END |
diff --git a/arch/arm/mach-mmp/teton_bga.c b/arch/arm/mach-mmp/teton_bga.c index bbe4727b96c..8ac22a62bf1 100644 --- a/arch/arm/mach-mmp/teton_bga.c +++ b/arch/arm/mach-mmp/teton_bga.c | |||
| @@ -86,4 +86,5 @@ MACHINE_START(TETON_BGA, "PXA168-based Teton BGA Development Platform") | |||
| 86 | .init_irq = pxa168_init_irq, | 86 | .init_irq = pxa168_init_irq, |
| 87 | .timer = &pxa168_timer, | 87 | .timer = &pxa168_timer, |
| 88 | .init_machine = teton_bga_init, | 88 | .init_machine = teton_bga_init, |
| 89 | .restart = pxa168_restart, | ||
| 89 | MACHINE_END | 90 | MACHINE_END |
diff --git a/arch/arm/mach-mmp/ttc_dkb.c b/arch/arm/mach-mmp/ttc_dkb.c index 176515a7698..f0265882557 100644 --- a/arch/arm/mach-mmp/ttc_dkb.c +++ b/arch/arm/mach-mmp/ttc_dkb.c | |||
| @@ -159,4 +159,5 @@ MACHINE_START(TTC_DKB, "PXA910-based TTC_DKB Development Platform") | |||
| 159 | .init_irq = pxa910_init_irq, | 159 | .init_irq = pxa910_init_irq, |
| 160 | .timer = &pxa910_timer, | 160 | .timer = &pxa910_timer, |
| 161 | .init_machine = ttc_dkb_init, | 161 | .init_machine = ttc_dkb_init, |
| 162 | .restart = mmp_restart, | ||
| 162 | MACHINE_END | 163 | MACHINE_END |
diff --git a/arch/arm/mach-msm/include/mach/system.h b/arch/arm/mach-msm/include/mach/system.h index d2e83f42ba1..311db2b35da 100644 --- a/arch/arm/mach-msm/include/mach/system.h +++ b/arch/arm/mach-msm/include/mach/system.h | |||
| @@ -12,16 +12,8 @@ | |||
| 12 | * GNU General Public License for more details. | 12 | * GNU General Public License for more details. |
| 13 | * | 13 | * |
| 14 | */ | 14 | */ |
| 15 | |||
| 16 | #include <mach/hardware.h> | ||
| 17 | |||
| 18 | void arch_idle(void); | 15 | void arch_idle(void); |
| 19 | 16 | ||
| 20 | static inline void arch_reset(char mode, const char *cmd) | ||
| 21 | { | ||
| 22 | for (;;) ; /* depends on IPC w/ other core */ | ||
| 23 | } | ||
| 24 | |||
| 25 | /* low level hardware reset hook -- for example, hitting the | 17 | /* low level hardware reset hook -- for example, hitting the |
| 26 | * PSHOLD line on the PMIC to hard reset the system | 18 | * PSHOLD line on the PMIC to hard reset the system |
| 27 | */ | 19 | */ |
diff --git a/arch/arm/mach-mv78xx0/buffalo-wxl-setup.c b/arch/arm/mach-mv78xx0/buffalo-wxl-setup.c index 0e94268d6e6..ee74ec97c14 100644 --- a/arch/arm/mach-mv78xx0/buffalo-wxl-setup.c +++ b/arch/arm/mach-mv78xx0/buffalo-wxl-setup.c | |||
| @@ -151,4 +151,5 @@ MACHINE_START(TERASTATION_WXL, "Buffalo Nas WXL") | |||
| 151 | .init_early = mv78xx0_init_early, | 151 | .init_early = mv78xx0_init_early, |
| 152 | .init_irq = mv78xx0_init_irq, | 152 | .init_irq = mv78xx0_init_irq, |
| 153 | .timer = &mv78xx0_timer, | 153 | .timer = &mv78xx0_timer, |
| 154 | .restart = mv78xx0_restart, | ||
| 154 | MACHINE_END | 155 | MACHINE_END |
diff --git a/arch/arm/mach-mv78xx0/common.c b/arch/arm/mach-mv78xx0/common.c index 23d3980ef59..5b9632b0116 100644 --- a/arch/arm/mach-mv78xx0/common.c +++ b/arch/arm/mach-mv78xx0/common.c | |||
| @@ -401,3 +401,19 @@ void __init mv78xx0_init(void) | |||
| 401 | feroceon_l2_init(is_l2_writethrough()); | 401 | feroceon_l2_init(is_l2_writethrough()); |
| 402 | #endif | 402 | #endif |
| 403 | } | 403 | } |
| 404 | |||
| 405 | void mv78xx0_restart(char mode, const char *cmd) | ||
| 406 | { | ||
| 407 | /* | ||
| 408 | * Enable soft reset to assert RSTOUTn. | ||
| 409 | */ | ||
| 410 | writel(SOFT_RESET_OUT_EN, RSTOUTn_MASK); | ||
| 411 | |||
| 412 | /* | ||
| 413 | * Assert soft reset. | ||
| 414 | */ | ||
| 415 | writel(SOFT_RESET, SYSTEM_SOFT_RESET); | ||
| 416 | |||
| 417 | while (1) | ||
| 418 | ; | ||
| 419 | } | ||
diff --git a/arch/arm/mach-mv78xx0/common.h b/arch/arm/mach-mv78xx0/common.h index 632e63d65e7..07d5f8f6be7 100644 --- a/arch/arm/mach-mv78xx0/common.h +++ b/arch/arm/mach-mv78xx0/common.h | |||
| @@ -46,6 +46,7 @@ void mv78xx0_uart1_init(void); | |||
| 46 | void mv78xx0_uart2_init(void); | 46 | void mv78xx0_uart2_init(void); |
| 47 | void mv78xx0_uart3_init(void); | 47 | void mv78xx0_uart3_init(void); |
| 48 | void mv78xx0_i2c_init(void); | 48 | void mv78xx0_i2c_init(void); |
| 49 | void mv78xx0_restart(char, const char *); | ||
| 49 | 50 | ||
| 50 | extern struct sys_timer mv78xx0_timer; | 51 | extern struct sys_timer mv78xx0_timer; |
| 51 | 52 | ||
diff --git a/arch/arm/mach-mv78xx0/db78x00-bp-setup.c b/arch/arm/mach-mv78xx0/db78x00-bp-setup.c index 50b85ae2da5..4d6d48bf51e 100644 --- a/arch/arm/mach-mv78xx0/db78x00-bp-setup.c +++ b/arch/arm/mach-mv78xx0/db78x00-bp-setup.c | |||
| @@ -99,4 +99,5 @@ MACHINE_START(DB78X00_BP, "Marvell DB-78x00-BP Development Board") | |||
| 99 | .init_early = mv78xx0_init_early, | 99 | .init_early = mv78xx0_init_early, |
| 100 | .init_irq = mv78xx0_init_irq, | 100 | .init_irq = mv78xx0_init_irq, |
| 101 | .timer = &mv78xx0_timer, | 101 | .timer = &mv78xx0_timer, |
| 102 | .restart = mv78xx0_restart, | ||
| 102 | MACHINE_END | 103 | MACHINE_END |
diff --git a/arch/arm/mach-mv78xx0/include/mach/system.h b/arch/arm/mach-mv78xx0/include/mach/system.h index 66e7ce4e90b..8c3a5387cec 100644 --- a/arch/arm/mach-mv78xx0/include/mach/system.h +++ b/arch/arm/mach-mv78xx0/include/mach/system.h | |||
| @@ -9,28 +9,9 @@ | |||
| 9 | #ifndef __ASM_ARCH_SYSTEM_H | 9 | #ifndef __ASM_ARCH_SYSTEM_H |
| 10 | #define __ASM_ARCH_SYSTEM_H | 10 | #define __ASM_ARCH_SYSTEM_H |
| 11 | 11 | ||
| 12 | #include <mach/bridge-regs.h> | ||
| 13 | |||
| 14 | static inline void arch_idle(void) | 12 | static inline void arch_idle(void) |
| 15 | { | 13 | { |
| 16 | cpu_do_idle(); | 14 | cpu_do_idle(); |
| 17 | } | 15 | } |
| 18 | 16 | ||
| 19 | static inline void arch_reset(char mode, const char *cmd) | ||
| 20 | { | ||
| 21 | /* | ||
| 22 | * Enable soft reset to assert RSTOUTn. | ||
| 23 | */ | ||
| 24 | writel(SOFT_RESET_OUT_EN, RSTOUTn_MASK); | ||
| 25 | |||
| 26 | /* | ||
| 27 | * Assert soft reset. | ||
| 28 | */ | ||
| 29 | writel(SOFT_RESET, SYSTEM_SOFT_RESET); | ||
| 30 | |||
| 31 | while (1) | ||
| 32 | ; | ||
| 33 | } | ||
| 34 | |||
| 35 | |||
| 36 | #endif | 17 | #endif |
diff --git a/arch/arm/mach-mv78xx0/rd78x00-masa-setup.c b/arch/arm/mach-mv78xx0/rd78x00-masa-setup.c index e85222e5357..9a882706e13 100644 --- a/arch/arm/mach-mv78xx0/rd78x00-masa-setup.c +++ b/arch/arm/mach-mv78xx0/rd78x00-masa-setup.c | |||
| @@ -84,4 +84,5 @@ MACHINE_START(RD78X00_MASA, "Marvell RD-78x00-MASA Development Board") | |||
| 84 | .init_early = mv78xx0_init_early, | 84 | .init_early = mv78xx0_init_early, |
| 85 | .init_irq = mv78xx0_init_irq, | 85 | .init_irq = mv78xx0_init_irq, |
| 86 | .timer = &mv78xx0_timer, | 86 | .timer = &mv78xx0_timer, |
| 87 | .restart = mv78xx0_restart, | ||
| 87 | MACHINE_END | 88 | MACHINE_END |
diff --git a/arch/arm/mach-mx5/board-cpuimx51.c b/arch/arm/mach-mx5/board-cpuimx51.c index 1fc11034804..944025da833 100644 --- a/arch/arm/mach-mx5/board-cpuimx51.c +++ b/arch/arm/mach-mx5/board-cpuimx51.c | |||
| @@ -297,4 +297,5 @@ MACHINE_START(EUKREA_CPUIMX51, "Eukrea CPUIMX51 Module") | |||
| 297 | .handle_irq = imx51_handle_irq, | 297 | .handle_irq = imx51_handle_irq, |
| 298 | .timer = &mxc_timer, | 298 | .timer = &mxc_timer, |
| 299 | .init_machine = eukrea_cpuimx51_init, | 299 | .init_machine = eukrea_cpuimx51_init, |
| 300 | .restart = mxc_restart, | ||
| 300 | MACHINE_END | 301 | MACHINE_END |
diff --git a/arch/arm/mach-mx5/board-cpuimx51sd.c b/arch/arm/mach-mx5/board-cpuimx51sd.c index 52a11c1898e..9fbe923c8b0 100644 --- a/arch/arm/mach-mx5/board-cpuimx51sd.c +++ b/arch/arm/mach-mx5/board-cpuimx51sd.c | |||
| @@ -335,4 +335,5 @@ MACHINE_START(EUKREA_CPUIMX51SD, "Eukrea CPUIMX51SD") | |||
| 335 | .handle_irq = imx51_handle_irq, | 335 | .handle_irq = imx51_handle_irq, |
| 336 | .timer = &mxc_timer, | 336 | .timer = &mxc_timer, |
| 337 | .init_machine = eukrea_cpuimx51sd_init, | 337 | .init_machine = eukrea_cpuimx51sd_init, |
| 338 | .restart = mxc_restart, | ||
| 338 | MACHINE_END | 339 | MACHINE_END |
diff --git a/arch/arm/mach-mx5/board-mx50_rdp.c b/arch/arm/mach-mx5/board-mx50_rdp.c index fc3621d90bd..42b66e8d961 100644 --- a/arch/arm/mach-mx5/board-mx50_rdp.c +++ b/arch/arm/mach-mx5/board-mx50_rdp.c | |||
| @@ -222,4 +222,5 @@ MACHINE_START(MX50_RDP, "Freescale MX50 Reference Design Platform") | |||
| 222 | .handle_irq = imx50_handle_irq, | 222 | .handle_irq = imx50_handle_irq, |
| 223 | .timer = &mx50_rdp_timer, | 223 | .timer = &mx50_rdp_timer, |
| 224 | .init_machine = mx50_rdp_board_init, | 224 | .init_machine = mx50_rdp_board_init, |
| 225 | .restart = mxc_restart, | ||
| 225 | MACHINE_END | 226 | MACHINE_END |
diff --git a/arch/arm/mach-mx5/board-mx51_3ds.c b/arch/arm/mach-mx5/board-mx51_3ds.c index 05783906db2..83eab4176ca 100644 --- a/arch/arm/mach-mx5/board-mx51_3ds.c +++ b/arch/arm/mach-mx5/board-mx51_3ds.c | |||
| @@ -175,4 +175,5 @@ MACHINE_START(MX51_3DS, "Freescale MX51 3-Stack Board") | |||
| 175 | .handle_irq = imx51_handle_irq, | 175 | .handle_irq = imx51_handle_irq, |
| 176 | .timer = &mx51_3ds_timer, | 176 | .timer = &mx51_3ds_timer, |
| 177 | .init_machine = mx51_3ds_init, | 177 | .init_machine = mx51_3ds_init, |
| 178 | .restart = mxc_restart, | ||
| 178 | MACHINE_END | 179 | MACHINE_END |
diff --git a/arch/arm/mach-mx5/board-mx51_babbage.c b/arch/arm/mach-mx5/board-mx51_babbage.c index 5c837603ff0..e4b822e9f71 100644 --- a/arch/arm/mach-mx5/board-mx51_babbage.c +++ b/arch/arm/mach-mx5/board-mx51_babbage.c | |||
| @@ -362,7 +362,7 @@ static void __init mx51_babbage_init(void) | |||
| 362 | { | 362 | { |
| 363 | iomux_v3_cfg_t usbh1stp = MX51_PAD_USBH1_STP__USBH1_STP; | 363 | iomux_v3_cfg_t usbh1stp = MX51_PAD_USBH1_STP__USBH1_STP; |
| 364 | iomux_v3_cfg_t power_key = NEW_PAD_CTRL(MX51_PAD_EIM_A27__GPIO2_21, | 364 | iomux_v3_cfg_t power_key = NEW_PAD_CTRL(MX51_PAD_EIM_A27__GPIO2_21, |
| 365 | PAD_CTL_SRE_FAST | PAD_CTL_DSE_HIGH | PAD_CTL_PUS_100K_UP); | 365 | PAD_CTL_SRE_FAST | PAD_CTL_DSE_HIGH); |
| 366 | 366 | ||
| 367 | imx51_soc_init(); | 367 | imx51_soc_init(); |
| 368 | 368 | ||
| @@ -426,4 +426,5 @@ MACHINE_START(MX51_BABBAGE, "Freescale MX51 Babbage Board") | |||
| 426 | .handle_irq = imx51_handle_irq, | 426 | .handle_irq = imx51_handle_irq, |
| 427 | .timer = &mx51_babbage_timer, | 427 | .timer = &mx51_babbage_timer, |
| 428 | .init_machine = mx51_babbage_init, | 428 | .init_machine = mx51_babbage_init, |
| 429 | .restart = mxc_restart, | ||
| 429 | MACHINE_END | 430 | MACHINE_END |
diff --git a/arch/arm/mach-mx5/board-mx51_efikamx.c b/arch/arm/mach-mx5/board-mx51_efikamx.c index a9e48662cf7..3a5ed2dd885 100644 --- a/arch/arm/mach-mx5/board-mx51_efikamx.c +++ b/arch/arm/mach-mx5/board-mx51_efikamx.c | |||
| @@ -182,7 +182,7 @@ static const struct gpio_keys_platform_data mx51_efikamx_powerkey_data __initcon | |||
| 182 | .nbuttons = ARRAY_SIZE(mx51_efikamx_powerkey), | 182 | .nbuttons = ARRAY_SIZE(mx51_efikamx_powerkey), |
| 183 | }; | 183 | }; |
| 184 | 184 | ||
| 185 | void mx51_efikamx_reset(void) | 185 | static void mx51_efikamx_restart(char mode, const char *cmd) |
| 186 | { | 186 | { |
| 187 | if (system_rev == 0x11) | 187 | if (system_rev == 0x11) |
| 188 | gpio_direction_output(EFIKAMX_RESET1_1, 0); | 188 | gpio_direction_output(EFIKAMX_RESET1_1, 0); |
| @@ -292,4 +292,5 @@ MACHINE_START(MX51_EFIKAMX, "Genesi EfikaMX nettop") | |||
| 292 | .handle_irq = imx51_handle_irq, | 292 | .handle_irq = imx51_handle_irq, |
| 293 | .timer = &mx51_efikamx_timer, | 293 | .timer = &mx51_efikamx_timer, |
| 294 | .init_machine = mx51_efikamx_init, | 294 | .init_machine = mx51_efikamx_init, |
| 295 | .restart = mx51_efikamx_restart, | ||
| 295 | MACHINE_END | 296 | MACHINE_END |
diff --git a/arch/arm/mach-mx5/board-mx51_efikasb.c b/arch/arm/mach-mx5/board-mx51_efikasb.c index 38c4a3e28d3..ea5f65b0381 100644 --- a/arch/arm/mach-mx5/board-mx51_efikasb.c +++ b/arch/arm/mach-mx5/board-mx51_efikasb.c | |||
| @@ -287,4 +287,5 @@ MACHINE_START(MX51_EFIKASB, "Genesi Efika Smartbook") | |||
| 287 | .handle_irq = imx51_handle_irq, | 287 | .handle_irq = imx51_handle_irq, |
| 288 | .init_machine = efikasb_board_init, | 288 | .init_machine = efikasb_board_init, |
| 289 | .timer = &mx51_efikasb_timer, | 289 | .timer = &mx51_efikasb_timer, |
| 290 | .restart = mxc_restart, | ||
| 290 | MACHINE_END | 291 | MACHINE_END |
diff --git a/arch/arm/mach-mx5/board-mx53_ard.c b/arch/arm/mach-mx5/board-mx53_ard.c index 0d7f0fffb23..5f224f1c3eb 100644 --- a/arch/arm/mach-mx5/board-mx53_ard.c +++ b/arch/arm/mach-mx5/board-mx53_ard.c | |||
| @@ -257,4 +257,5 @@ MACHINE_START(MX53_ARD, "Freescale MX53 ARD Board") | |||
| 257 | .handle_irq = imx53_handle_irq, | 257 | .handle_irq = imx53_handle_irq, |
| 258 | .timer = &mx53_ard_timer, | 258 | .timer = &mx53_ard_timer, |
| 259 | .init_machine = mx53_ard_board_init, | 259 | .init_machine = mx53_ard_board_init, |
| 260 | .restart = mxc_restart, | ||
| 260 | MACHINE_END | 261 | MACHINE_END |
diff --git a/arch/arm/mach-mx5/board-mx53_evk.c b/arch/arm/mach-mx5/board-mx53_evk.c index 6bea31ab8f8..d6ce137896d 100644 --- a/arch/arm/mach-mx5/board-mx53_evk.c +++ b/arch/arm/mach-mx5/board-mx53_evk.c | |||
| @@ -106,7 +106,7 @@ static inline void mx53_evk_fec_reset(void) | |||
| 106 | gpio_set_value(MX53_EVK_FEC_PHY_RST, 1); | 106 | gpio_set_value(MX53_EVK_FEC_PHY_RST, 1); |
| 107 | } | 107 | } |
| 108 | 108 | ||
| 109 | static struct fec_platform_data mx53_evk_fec_pdata = { | 109 | static const struct fec_platform_data mx53_evk_fec_pdata __initconst = { |
| 110 | .phy = PHY_INTERFACE_MODE_RMII, | 110 | .phy = PHY_INTERFACE_MODE_RMII, |
| 111 | }; | 111 | }; |
| 112 | 112 | ||
| @@ -175,4 +175,5 @@ MACHINE_START(MX53_EVK, "Freescale MX53 EVK Board") | |||
| 175 | .handle_irq = imx53_handle_irq, | 175 | .handle_irq = imx53_handle_irq, |
| 176 | .timer = &mx53_evk_timer, | 176 | .timer = &mx53_evk_timer, |
| 177 | .init_machine = mx53_evk_board_init, | 177 | .init_machine = mx53_evk_board_init, |
| 178 | .restart = mxc_restart, | ||
| 178 | MACHINE_END | 179 | MACHINE_END |
diff --git a/arch/arm/mach-mx5/board-mx53_loco.c b/arch/arm/mach-mx5/board-mx53_loco.c index 7678f7734db..fd8b524e1c5 100644 --- a/arch/arm/mach-mx5/board-mx53_loco.c +++ b/arch/arm/mach-mx5/board-mx53_loco.c | |||
| @@ -242,7 +242,7 @@ static inline void mx53_loco_fec_reset(void) | |||
| 242 | gpio_set_value(LOCO_FEC_PHY_RST, 1); | 242 | gpio_set_value(LOCO_FEC_PHY_RST, 1); |
| 243 | } | 243 | } |
| 244 | 244 | ||
| 245 | static struct fec_platform_data mx53_loco_fec_data = { | 245 | static const struct fec_platform_data mx53_loco_fec_data __initconst = { |
| 246 | .phy = PHY_INTERFACE_MODE_RMII, | 246 | .phy = PHY_INTERFACE_MODE_RMII, |
| 247 | }; | 247 | }; |
| 248 | 248 | ||
| @@ -317,4 +317,5 @@ MACHINE_START(MX53_LOCO, "Freescale MX53 LOCO Board") | |||
| 317 | .handle_irq = imx53_handle_irq, | 317 | .handle_irq = imx53_handle_irq, |
| 318 | .timer = &mx53_loco_timer, | 318 | .timer = &mx53_loco_timer, |
| 319 | .init_machine = mx53_loco_board_init, | 319 | .init_machine = mx53_loco_board_init, |
| 320 | .restart = mxc_restart, | ||
| 320 | MACHINE_END | 321 | MACHINE_END |
diff --git a/arch/arm/mach-mx5/board-mx53_smd.c b/arch/arm/mach-mx5/board-mx53_smd.c index 59c0845eb4a..22c53c9b18a 100644 --- a/arch/arm/mach-mx5/board-mx53_smd.c +++ b/arch/arm/mach-mx5/board-mx53_smd.c | |||
| @@ -104,7 +104,7 @@ static inline void mx53_smd_fec_reset(void) | |||
| 104 | gpio_set_value(SMD_FEC_PHY_RST, 1); | 104 | gpio_set_value(SMD_FEC_PHY_RST, 1); |
| 105 | } | 105 | } |
| 106 | 106 | ||
| 107 | static struct fec_platform_data mx53_smd_fec_data = { | 107 | static const struct fec_platform_data mx53_smd_fec_data __initconst = { |
| 108 | .phy = PHY_INTERFACE_MODE_RMII, | 108 | .phy = PHY_INTERFACE_MODE_RMII, |
| 109 | }; | 109 | }; |
| 110 | 110 | ||
| @@ -164,4 +164,5 @@ MACHINE_START(MX53_SMD, "Freescale MX53 SMD Board") | |||
| 164 | .handle_irq = imx53_handle_irq, | 164 | .handle_irq = imx53_handle_irq, |
| 165 | .timer = &mx53_smd_timer, | 165 | .timer = &mx53_smd_timer, |
| 166 | .init_machine = mx53_smd_board_init, | 166 | .init_machine = mx53_smd_board_init, |
| 167 | .restart = mxc_restart, | ||
| 167 | MACHINE_END | 168 | MACHINE_END |
diff --git a/arch/arm/mach-mx5/imx51-dt.c b/arch/arm/mach-mx5/imx51-dt.c index 596edd967db..e6bad17b908 100644 --- a/arch/arm/mach-mx5/imx51-dt.c +++ b/arch/arm/mach-mx5/imx51-dt.c | |||
| @@ -115,4 +115,5 @@ DT_MACHINE_START(IMX51_DT, "Freescale i.MX51 (Device Tree Support)") | |||
| 115 | .timer = &imx51_timer, | 115 | .timer = &imx51_timer, |
| 116 | .init_machine = imx51_dt_init, | 116 | .init_machine = imx51_dt_init, |
| 117 | .dt_compat = imx51_dt_board_compat, | 117 | .dt_compat = imx51_dt_board_compat, |
| 118 | .restart = mxc_restart, | ||
| 118 | MACHINE_END | 119 | MACHINE_END |
diff --git a/arch/arm/mach-mx5/imx53-dt.c b/arch/arm/mach-mx5/imx53-dt.c index 85bfd5ff21b..05ebb3e6867 100644 --- a/arch/arm/mach-mx5/imx53-dt.c +++ b/arch/arm/mach-mx5/imx53-dt.c | |||
| @@ -125,4 +125,5 @@ DT_MACHINE_START(IMX53_DT, "Freescale i.MX53 (Device Tree Support)") | |||
| 125 | .timer = &imx53_timer, | 125 | .timer = &imx53_timer, |
| 126 | .init_machine = imx53_dt_init, | 126 | .init_machine = imx53_dt_init, |
| 127 | .dt_compat = imx53_dt_board_compat, | 127 | .dt_compat = imx53_dt_board_compat, |
| 128 | .restart = mxc_restart, | ||
| 128 | MACHINE_END | 129 | MACHINE_END |
diff --git a/arch/arm/mach-mxs/include/mach/common.h b/arch/arm/mach-mxs/include/mach/common.h index 635bb5d9a20..1388485414c 100644 --- a/arch/arm/mach-mxs/include/mach/common.h +++ b/arch/arm/mach-mxs/include/mach/common.h | |||
| @@ -16,6 +16,7 @@ struct clk; | |||
| 16 | extern const u32 *mxs_get_ocotp(void); | 16 | extern const u32 *mxs_get_ocotp(void); |
| 17 | extern int mxs_reset_block(void __iomem *); | 17 | extern int mxs_reset_block(void __iomem *); |
| 18 | extern void mxs_timer_init(struct clk *, int); | 18 | extern void mxs_timer_init(struct clk *, int); |
| 19 | extern void mxs_restart(char, const char *); | ||
| 19 | 20 | ||
| 20 | extern int mx23_register_gpios(void); | 21 | extern int mx23_register_gpios(void); |
| 21 | extern int mx23_clocks_init(void); | 22 | extern int mx23_clocks_init(void); |
diff --git a/arch/arm/mach-mxs/include/mach/system.h b/arch/arm/mach-mxs/include/mach/system.h index 0e428239b43..e7ad1bb2942 100644 --- a/arch/arm/mach-mxs/include/mach/system.h +++ b/arch/arm/mach-mxs/include/mach/system.h | |||
| @@ -22,6 +22,4 @@ static inline void arch_idle(void) | |||
| 22 | cpu_do_idle(); | 22 | cpu_do_idle(); |
| 23 | } | 23 | } |
| 24 | 24 | ||
| 25 | void arch_reset(char mode, const char *cmd); | ||
| 26 | |||
| 27 | #endif /* __MACH_MXS_SYSTEM_H__ */ | 25 | #endif /* __MACH_MXS_SYSTEM_H__ */ |
diff --git a/arch/arm/mach-mxs/mach-m28evk.c b/arch/arm/mach-mxs/mach-m28evk.c index 6b00577b702..2f2758230ed 100644 --- a/arch/arm/mach-mxs/mach-m28evk.c +++ b/arch/arm/mach-mxs/mach-m28evk.c | |||
| @@ -363,4 +363,5 @@ MACHINE_START(M28EVK, "DENX M28 EVK") | |||
| 363 | .init_irq = mx28_init_irq, | 363 | .init_irq = mx28_init_irq, |
| 364 | .timer = &m28evk_timer, | 364 | .timer = &m28evk_timer, |
| 365 | .init_machine = m28evk_init, | 365 | .init_machine = m28evk_init, |
| 366 | .restart = mxs_restart, | ||
| 366 | MACHINE_END | 367 | MACHINE_END |
diff --git a/arch/arm/mach-mxs/mach-mx23evk.c b/arch/arm/mach-mxs/mach-mx23evk.c index c325fbe4e4c..5ea1c57d260 100644 --- a/arch/arm/mach-mxs/mach-mx23evk.c +++ b/arch/arm/mach-mxs/mach-mx23evk.c | |||
| @@ -184,4 +184,5 @@ MACHINE_START(MX23EVK, "Freescale MX23 EVK") | |||
| 184 | .init_irq = mx23_init_irq, | 184 | .init_irq = mx23_init_irq, |
| 185 | .timer = &mx23evk_timer, | 185 | .timer = &mx23evk_timer, |
| 186 | .init_machine = mx23evk_init, | 186 | .init_machine = mx23evk_init, |
| 187 | .restart = mxs_restart, | ||
| 187 | MACHINE_END | 188 | MACHINE_END |
diff --git a/arch/arm/mach-mxs/mach-mx28evk.c b/arch/arm/mach-mxs/mach-mx28evk.c index 064ec5abaa5..d0cc37fd23a 100644 --- a/arch/arm/mach-mxs/mach-mx28evk.c +++ b/arch/arm/mach-mxs/mach-mx28evk.c | |||
| @@ -501,4 +501,5 @@ MACHINE_START(MX28EVK, "Freescale MX28 EVK") | |||
| 501 | .init_irq = mx28_init_irq, | 501 | .init_irq = mx28_init_irq, |
| 502 | .timer = &mx28evk_timer, | 502 | .timer = &mx28evk_timer, |
| 503 | .init_machine = mx28evk_init, | 503 | .init_machine = mx28evk_init, |
| 504 | .restart = mxs_restart, | ||
| 504 | MACHINE_END | 505 | MACHINE_END |
diff --git a/arch/arm/mach-mxs/mach-stmp378x_devb.c b/arch/arm/mach-mxs/mach-stmp378x_devb.c index 6834dea38c0..a626c07b871 100644 --- a/arch/arm/mach-mxs/mach-stmp378x_devb.c +++ b/arch/arm/mach-mxs/mach-stmp378x_devb.c | |||
| @@ -117,4 +117,5 @@ MACHINE_START(STMP378X, "STMP378X") | |||
| 117 | .init_irq = mx23_init_irq, | 117 | .init_irq = mx23_init_irq, |
| 118 | .timer = &stmp378x_dvb_timer, | 118 | .timer = &stmp378x_dvb_timer, |
| 119 | .init_machine = stmp378x_dvb_init, | 119 | .init_machine = stmp378x_dvb_init, |
| 120 | .restart = mxs_restart, | ||
| 120 | MACHINE_END | 121 | MACHINE_END |
diff --git a/arch/arm/mach-mxs/mach-tx28.c b/arch/arm/mach-mxs/mach-tx28.c index 9a1f0e7a338..2c0862e655e 100644 --- a/arch/arm/mach-mxs/mach-tx28.c +++ b/arch/arm/mach-mxs/mach-tx28.c | |||
| @@ -178,4 +178,5 @@ MACHINE_START(TX28, "Ka-Ro electronics TX28 module") | |||
| 178 | .init_irq = mx28_init_irq, | 178 | .init_irq = mx28_init_irq, |
| 179 | .timer = &tx28_timer, | 179 | .timer = &tx28_timer, |
| 180 | .init_machine = tx28_stk5v3_init, | 180 | .init_machine = tx28_stk5v3_init, |
| 181 | .restart = mxs_restart, | ||
| 181 | MACHINE_END | 182 | MACHINE_END |
diff --git a/arch/arm/mach-mxs/system.c b/arch/arm/mach-mxs/system.c index cab88364e7c..b936633b768 100644 --- a/arch/arm/mach-mxs/system.c +++ b/arch/arm/mach-mxs/system.c | |||
| @@ -42,7 +42,7 @@ static void __iomem *mxs_clkctrl_reset_addr; | |||
| 42 | /* | 42 | /* |
| 43 | * Reset the system. It is called by machine_restart(). | 43 | * Reset the system. It is called by machine_restart(). |
| 44 | */ | 44 | */ |
| 45 | void arch_reset(char mode, const char *cmd) | 45 | void mxs_restart(char mode, const char *cmd) |
| 46 | { | 46 | { |
| 47 | /* reset the chip */ | 47 | /* reset the chip */ |
| 48 | __mxs_setl(MXS_CLKCTRL_RESET_CHIP, mxs_clkctrl_reset_addr); | 48 | __mxs_setl(MXS_CLKCTRL_RESET_CHIP, mxs_clkctrl_reset_addr); |
diff --git a/arch/arm/mach-netx/generic.c b/arch/arm/mach-netx/generic.c index 00023b5cf12..59e67979f19 100644 --- a/arch/arm/mach-netx/generic.c +++ b/arch/arm/mach-netx/generic.c | |||
| @@ -187,3 +187,8 @@ static int __init netx_init(void) | |||
| 187 | 187 | ||
| 188 | subsys_initcall(netx_init); | 188 | subsys_initcall(netx_init); |
| 189 | 189 | ||
| 190 | void netx_restart(char mode, const char *cmd) | ||
| 191 | { | ||
| 192 | writel(NETX_SYSTEM_RES_CR_FIRMW_RES_EN | NETX_SYSTEM_RES_CR_FIRMW_RES, | ||
| 193 | NETX_SYSTEM_RES_CR); | ||
| 194 | } | ||
diff --git a/arch/arm/mach-netx/generic.h b/arch/arm/mach-netx/generic.h index ede2d35341c..9b915119b8d 100644 --- a/arch/arm/mach-netx/generic.h +++ b/arch/arm/mach-netx/generic.h | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | 19 | ||
| 20 | extern void __init netx_map_io(void); | 20 | extern void __init netx_map_io(void); |
| 21 | extern void __init netx_init_irq(void); | 21 | extern void __init netx_init_irq(void); |
| 22 | extern void netx_restart(char, const char *); | ||
| 22 | 23 | ||
| 23 | struct sys_timer; | 24 | struct sys_timer; |
| 24 | extern struct sys_timer netx_timer; | 25 | extern struct sys_timer netx_timer; |
diff --git a/arch/arm/mach-netx/include/mach/system.h b/arch/arm/mach-netx/include/mach/system.h index dc7b4bc003c..b38fa36d58c 100644 --- a/arch/arm/mach-netx/include/mach/system.h +++ b/arch/arm/mach-netx/include/mach/system.h | |||
| @@ -19,20 +19,10 @@ | |||
| 19 | #ifndef __ASM_ARCH_SYSTEM_H | 19 | #ifndef __ASM_ARCH_SYSTEM_H |
| 20 | #define __ASM_ARCH_SYSTEM_H | 20 | #define __ASM_ARCH_SYSTEM_H |
| 21 | 21 | ||
| 22 | #include <linux/io.h> | ||
| 23 | #include <mach/hardware.h> | ||
| 24 | #include "netx-regs.h" | ||
| 25 | |||
| 26 | static inline void arch_idle(void) | 22 | static inline void arch_idle(void) |
| 27 | { | 23 | { |
| 28 | cpu_do_idle(); | 24 | cpu_do_idle(); |
| 29 | } | 25 | } |
| 30 | 26 | ||
| 31 | static inline void arch_reset(char mode, const char *cmd) | ||
| 32 | { | ||
| 33 | writel(NETX_SYSTEM_RES_CR_FIRMW_RES_EN | NETX_SYSTEM_RES_CR_FIRMW_RES, | ||
| 34 | NETX_SYSTEM_RES_CR); | ||
| 35 | } | ||
| 36 | |||
| 37 | #endif | 27 | #endif |
| 38 | 28 | ||
diff --git a/arch/arm/mach-netx/nxdb500.c b/arch/arm/mach-netx/nxdb500.c index ef8cf3574a0..180ea899a48 100644 --- a/arch/arm/mach-netx/nxdb500.c +++ b/arch/arm/mach-netx/nxdb500.c | |||
| @@ -207,4 +207,5 @@ MACHINE_START(NXDB500, "Hilscher nxdb500") | |||
| 207 | .handle_irq = vic_handle_irq, | 207 | .handle_irq = vic_handle_irq, |
| 208 | .timer = &netx_timer, | 208 | .timer = &netx_timer, |
| 209 | .init_machine = nxdb500_init, | 209 | .init_machine = nxdb500_init, |
| 210 | .restart = netx_restart, | ||
| 210 | MACHINE_END | 211 | MACHINE_END |
diff --git a/arch/arm/mach-netx/nxdkn.c b/arch/arm/mach-netx/nxdkn.c index 588558bdd80..58009e29b20 100644 --- a/arch/arm/mach-netx/nxdkn.c +++ b/arch/arm/mach-netx/nxdkn.c | |||
| @@ -100,4 +100,5 @@ MACHINE_START(NXDKN, "Hilscher nxdkn") | |||
| 100 | .handle_irq = vic_handle_irq, | 100 | .handle_irq = vic_handle_irq, |
| 101 | .timer = &netx_timer, | 101 | .timer = &netx_timer, |
| 102 | .init_machine = nxdkn_init, | 102 | .init_machine = nxdkn_init, |
| 103 | .restart = netx_restart, | ||
| 103 | MACHINE_END | 104 | MACHINE_END |
diff --git a/arch/arm/mach-netx/nxeb500hmi.c b/arch/arm/mach-netx/nxeb500hmi.c index cfcbb503864..122e99826ef 100644 --- a/arch/arm/mach-netx/nxeb500hmi.c +++ b/arch/arm/mach-netx/nxeb500hmi.c | |||
| @@ -184,4 +184,5 @@ MACHINE_START(NXEB500HMI, "Hilscher nxeb500hmi") | |||
| 184 | .handle_irq = vic_handle_irq, | 184 | .handle_irq = vic_handle_irq, |
| 185 | .timer = &netx_timer, | 185 | .timer = &netx_timer, |
| 186 | .init_machine = nxeb500hmi_init, | 186 | .init_machine = nxeb500hmi_init, |
| 187 | .restart = netx_restart, | ||
| 187 | MACHINE_END | 188 | MACHINE_END |
diff --git a/arch/arm/mach-nomadik/board-nhk8815.c b/arch/arm/mach-nomadik/board-nhk8815.c index f98259c050e..7c878bf0034 100644 --- a/arch/arm/mach-nomadik/board-nhk8815.c +++ b/arch/arm/mach-nomadik/board-nhk8815.c | |||
| @@ -35,6 +35,8 @@ | |||
| 35 | #include <mach/nand.h> | 35 | #include <mach/nand.h> |
| 36 | #include <mach/fsmc.h> | 36 | #include <mach/fsmc.h> |
| 37 | 37 | ||
| 38 | #include "cpu-8815.h" | ||
| 39 | |||
| 38 | /* Initial value for SRC control register: all timers use MXTAL/8 source */ | 40 | /* Initial value for SRC control register: all timers use MXTAL/8 source */ |
| 39 | #define SRC_CR_INIT_MASK 0x00007fff | 41 | #define SRC_CR_INIT_MASK 0x00007fff |
| 40 | #define SRC_CR_INIT_VAL 0x2aaa8000 | 42 | #define SRC_CR_INIT_VAL 0x2aaa8000 |
| @@ -284,4 +286,5 @@ MACHINE_START(NOMADIK, "NHK8815") | |||
| 284 | .handle_irq = vic_handle_irq, | 286 | .handle_irq = vic_handle_irq, |
| 285 | .timer = &nomadik_timer, | 287 | .timer = &nomadik_timer, |
| 286 | .init_machine = nhk8815_platform_init, | 288 | .init_machine = nhk8815_platform_init, |
| 289 | .restart = cpu8815_restart, | ||
| 287 | MACHINE_END | 290 | MACHINE_END |
diff --git a/arch/arm/mach-nomadik/cpu-8815.c b/arch/arm/mach-nomadik/cpu-8815.c index dc67717db6f..65df7b4fdd3 100644 --- a/arch/arm/mach-nomadik/cpu-8815.c +++ b/arch/arm/mach-nomadik/cpu-8815.c | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | #include <linux/device.h> | 21 | #include <linux/device.h> |
| 22 | #include <linux/amba/bus.h> | 22 | #include <linux/amba/bus.h> |
| 23 | #include <linux/platform_device.h> | 23 | #include <linux/platform_device.h> |
| 24 | #include <linux/io.h> | ||
| 24 | 25 | ||
| 25 | #include <plat/gpio-nomadik.h> | 26 | #include <plat/gpio-nomadik.h> |
| 26 | #include <mach/hardware.h> | 27 | #include <mach/hardware.h> |
| @@ -32,6 +33,7 @@ | |||
| 32 | #include <asm/hardware/cache-l2x0.h> | 33 | #include <asm/hardware/cache-l2x0.h> |
| 33 | 34 | ||
| 34 | #include "clock.h" | 35 | #include "clock.h" |
| 36 | #include "cpu-8815.h" | ||
| 35 | 37 | ||
| 36 | #define __MEM_4K_RESOURCE(x) \ | 38 | #define __MEM_4K_RESOURCE(x) \ |
| 37 | .res = {.start = (x), .end = (x) + SZ_4K - 1, .flags = IORESOURCE_MEM} | 39 | .res = {.start = (x), .end = (x) + SZ_4K - 1, .flags = IORESOURCE_MEM} |
| @@ -164,3 +166,13 @@ void __init cpu8815_init_irq(void) | |||
| 164 | #endif | 166 | #endif |
| 165 | return; | 167 | return; |
| 166 | } | 168 | } |
| 169 | |||
| 170 | void cpu8815_restart(char mode, const char *cmd) | ||
| 171 | { | ||
| 172 | void __iomem *src_rstsr = io_p2v(NOMADIK_SRC_BASE + 0x18); | ||
| 173 | |||
| 174 | /* FIXME: use egpio when implemented */ | ||
| 175 | |||
| 176 | /* Write anything to Reset status register */ | ||
| 177 | writel(1, src_rstsr); | ||
| 178 | } | ||
diff --git a/arch/arm/mach-nomadik/cpu-8815.h b/arch/arm/mach-nomadik/cpu-8815.h new file mode 100644 index 00000000000..71c21e8a11d --- /dev/null +++ b/arch/arm/mach-nomadik/cpu-8815.h | |||
| @@ -0,0 +1,4 @@ | |||
| 1 | extern void cpu8815_map_io(void); | ||
| 2 | extern void cpu8815_platform_init(void); | ||
| 3 | extern void cpu8815_init_irq(void); | ||
| 4 | extern void cpu8815_restart(char, const char *); | ||
diff --git a/arch/arm/mach-nomadik/include/mach/setup.h b/arch/arm/mach-nomadik/include/mach/setup.h index b7897edf1f3..bcaeaf41c05 100644 --- a/arch/arm/mach-nomadik/include/mach/setup.h +++ b/arch/arm/mach-nomadik/include/mach/setup.h | |||
| @@ -12,9 +12,6 @@ | |||
| 12 | 12 | ||
| 13 | #ifdef CONFIG_NOMADIK_8815 | 13 | #ifdef CONFIG_NOMADIK_8815 |
| 14 | 14 | ||
| 15 | extern void cpu8815_map_io(void); | ||
| 16 | extern void cpu8815_platform_init(void); | ||
| 17 | extern void cpu8815_init_irq(void); | ||
| 18 | extern void nmdk_timer_init(void); | 15 | extern void nmdk_timer_init(void); |
| 19 | 16 | ||
| 20 | #endif /* NOMADIK_8815 */ | 17 | #endif /* NOMADIK_8815 */ |
diff --git a/arch/arm/mach-nomadik/include/mach/system.h b/arch/arm/mach-nomadik/include/mach/system.h index 7119f688116..25e198b8976 100644 --- a/arch/arm/mach-nomadik/include/mach/system.h +++ b/arch/arm/mach-nomadik/include/mach/system.h | |||
| @@ -20,9 +20,6 @@ | |||
| 20 | #ifndef __ASM_ARCH_SYSTEM_H | 20 | #ifndef __ASM_ARCH_SYSTEM_H |
| 21 | #define __ASM_ARCH_SYSTEM_H | 21 | #define __ASM_ARCH_SYSTEM_H |
| 22 | 22 | ||
| 23 | #include <linux/io.h> | ||
| 24 | #include <mach/hardware.h> | ||
| 25 | |||
| 26 | static inline void arch_idle(void) | 23 | static inline void arch_idle(void) |
| 27 | { | 24 | { |
| 28 | /* | 25 | /* |
| @@ -32,14 +29,4 @@ static inline void arch_idle(void) | |||
| 32 | cpu_do_idle(); | 29 | cpu_do_idle(); |
| 33 | } | 30 | } |
| 34 | 31 | ||
| 35 | static inline void arch_reset(char mode, const char *cmd) | ||
| 36 | { | ||
| 37 | void __iomem *src_rstsr = io_p2v(NOMADIK_SRC_BASE + 0x18); | ||
| 38 | |||
| 39 | /* FIXME: use egpio when implemented */ | ||
| 40 | |||
| 41 | /* Write anything to Reset status register */ | ||
| 42 | writel(1, src_rstsr); | ||
| 43 | } | ||
| 44 | |||
| 45 | #endif | 32 | #endif |
diff --git a/arch/arm/mach-omap1/board-ams-delta.c b/arch/arm/mach-omap1/board-ams-delta.c index af7911963c0..88909cc0b25 100644 --- a/arch/arm/mach-omap1/board-ams-delta.c +++ b/arch/arm/mach-omap1/board-ams-delta.c | |||
| @@ -386,6 +386,7 @@ MACHINE_START(AMS_DELTA, "Amstrad E3 (Delta)") | |||
| 386 | .init_irq = omap1_init_irq, | 386 | .init_irq = omap1_init_irq, |
| 387 | .init_machine = ams_delta_init, | 387 | .init_machine = ams_delta_init, |
| 388 | .timer = &omap1_timer, | 388 | .timer = &omap1_timer, |
| 389 | .restart = omap1_restart, | ||
| 389 | MACHINE_END | 390 | MACHINE_END |
| 390 | 391 | ||
| 391 | EXPORT_SYMBOL(ams_delta_latch1_write); | 392 | EXPORT_SYMBOL(ams_delta_latch1_write); |
diff --git a/arch/arm/mach-omap1/board-fsample.c b/arch/arm/mach-omap1/board-fsample.c index b9c4c0f933e..0b9464b4121 100644 --- a/arch/arm/mach-omap1/board-fsample.c +++ b/arch/arm/mach-omap1/board-fsample.c | |||
| @@ -390,4 +390,5 @@ MACHINE_START(OMAP_FSAMPLE, "OMAP730 F-Sample") | |||
| 390 | .init_irq = omap1_init_irq, | 390 | .init_irq = omap1_init_irq, |
| 391 | .init_machine = omap_fsample_init, | 391 | .init_machine = omap_fsample_init, |
| 392 | .timer = &omap1_timer, | 392 | .timer = &omap1_timer, |
| 393 | .restart = omap1_restart, | ||
| 393 | MACHINE_END | 394 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/board-generic.c b/arch/arm/mach-omap1/board-generic.c index 7f41d7a504a..9a5fe581bc1 100644 --- a/arch/arm/mach-omap1/board-generic.c +++ b/arch/arm/mach-omap1/board-generic.c | |||
| @@ -89,4 +89,5 @@ MACHINE_START(OMAP_GENERIC, "Generic OMAP1510/1610/1710") | |||
| 89 | .init_irq = omap1_init_irq, | 89 | .init_irq = omap1_init_irq, |
| 90 | .init_machine = omap_generic_init, | 90 | .init_machine = omap_generic_init, |
| 91 | .timer = &omap1_timer, | 91 | .timer = &omap1_timer, |
| 92 | .restart = omap1_restart, | ||
| 92 | MACHINE_END | 93 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/board-h2.c b/arch/arm/mach-omap1/board-h2.c index 7933b97698f..00ad6b22d60 100644 --- a/arch/arm/mach-omap1/board-h2.c +++ b/arch/arm/mach-omap1/board-h2.c | |||
| @@ -456,4 +456,5 @@ MACHINE_START(OMAP_H2, "TI-H2") | |||
| 456 | .init_irq = omap1_init_irq, | 456 | .init_irq = omap1_init_irq, |
| 457 | .init_machine = h2_init, | 457 | .init_machine = h2_init, |
| 458 | .timer = &omap1_timer, | 458 | .timer = &omap1_timer, |
| 459 | .restart = omap1_restart, | ||
| 459 | MACHINE_END | 460 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/board-h3.c b/arch/arm/mach-omap1/board-h3.c index 04be2f83ca0..4a7f2514970 100644 --- a/arch/arm/mach-omap1/board-h3.c +++ b/arch/arm/mach-omap1/board-h3.c | |||
| @@ -444,4 +444,5 @@ MACHINE_START(OMAP_H3, "TI OMAP1710 H3 board") | |||
| 444 | .init_irq = omap1_init_irq, | 444 | .init_irq = omap1_init_irq, |
| 445 | .init_machine = h3_init, | 445 | .init_machine = h3_init, |
| 446 | .timer = &omap1_timer, | 446 | .timer = &omap1_timer, |
| 447 | .restart = omap1_restart, | ||
| 447 | MACHINE_END | 448 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/board-htcherald.c b/arch/arm/mach-omap1/board-htcherald.c index 46fcfeb1f11..731cc3db7ab 100644 --- a/arch/arm/mach-omap1/board-htcherald.c +++ b/arch/arm/mach-omap1/board-htcherald.c | |||
| @@ -610,4 +610,5 @@ MACHINE_START(HERALD, "HTC Herald") | |||
| 610 | .init_irq = omap1_init_irq, | 610 | .init_irq = omap1_init_irq, |
| 611 | .init_machine = htcherald_init, | 611 | .init_machine = htcherald_init, |
| 612 | .timer = &omap1_timer, | 612 | .timer = &omap1_timer, |
| 613 | .restart = omap1_restart, | ||
| 613 | MACHINE_END | 614 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/board-innovator.c b/arch/arm/mach-omap1/board-innovator.c index f99d11de153..309369ea697 100644 --- a/arch/arm/mach-omap1/board-innovator.c +++ b/arch/arm/mach-omap1/board-innovator.c | |||
| @@ -460,4 +460,5 @@ MACHINE_START(OMAP_INNOVATOR, "TI-Innovator") | |||
| 460 | .init_irq = omap1_init_irq, | 460 | .init_irq = omap1_init_irq, |
| 461 | .init_machine = innovator_init, | 461 | .init_machine = innovator_init, |
| 462 | .timer = &omap1_timer, | 462 | .timer = &omap1_timer, |
| 463 | .restart = omap1_restart, | ||
| 463 | MACHINE_END | 464 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/board-nokia770.c b/arch/arm/mach-omap1/board-nokia770.c index c64342388ec..f9efc036ba9 100644 --- a/arch/arm/mach-omap1/board-nokia770.c +++ b/arch/arm/mach-omap1/board-nokia770.c | |||
| @@ -259,4 +259,5 @@ MACHINE_START(NOKIA770, "Nokia 770") | |||
| 259 | .init_irq = omap1_init_irq, | 259 | .init_irq = omap1_init_irq, |
| 260 | .init_machine = omap_nokia770_init, | 260 | .init_machine = omap_nokia770_init, |
| 261 | .timer = &omap1_timer, | 261 | .timer = &omap1_timer, |
| 262 | .restart = omap1_restart, | ||
| 262 | MACHINE_END | 263 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/board-osk.c b/arch/arm/mach-omap1/board-osk.c index a409dfcc5b1..675de06557a 100644 --- a/arch/arm/mach-omap1/board-osk.c +++ b/arch/arm/mach-omap1/board-osk.c | |||
| @@ -578,4 +578,5 @@ MACHINE_START(OMAP_OSK, "TI-OSK") | |||
| 578 | .init_irq = omap1_init_irq, | 578 | .init_irq = omap1_init_irq, |
| 579 | .init_machine = osk_init, | 579 | .init_machine = osk_init, |
| 580 | .timer = &omap1_timer, | 580 | .timer = &omap1_timer, |
| 581 | .restart = omap1_restart, | ||
| 581 | MACHINE_END | 582 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/board-palmte.c b/arch/arm/mach-omap1/board-palmte.c index 105292d3948..81fa27f8836 100644 --- a/arch/arm/mach-omap1/board-palmte.c +++ b/arch/arm/mach-omap1/board-palmte.c | |||
| @@ -270,4 +270,5 @@ MACHINE_START(OMAP_PALMTE, "OMAP310 based Palm Tungsten E") | |||
| 270 | .init_irq = omap1_init_irq, | 270 | .init_irq = omap1_init_irq, |
| 271 | .init_machine = omap_palmte_init, | 271 | .init_machine = omap_palmte_init, |
| 272 | .timer = &omap1_timer, | 272 | .timer = &omap1_timer, |
| 273 | .restart = omap1_restart, | ||
| 273 | MACHINE_END | 274 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/board-palmtt.c b/arch/arm/mach-omap1/board-palmtt.c index 387a9006358..81cb8217838 100644 --- a/arch/arm/mach-omap1/board-palmtt.c +++ b/arch/arm/mach-omap1/board-palmtt.c | |||
| @@ -317,4 +317,5 @@ MACHINE_START(OMAP_PALMTT, "OMAP1510 based Palm Tungsten|T") | |||
| 317 | .init_irq = omap1_init_irq, | 317 | .init_irq = omap1_init_irq, |
| 318 | .init_machine = omap_palmtt_init, | 318 | .init_machine = omap_palmtt_init, |
| 319 | .timer = &omap1_timer, | 319 | .timer = &omap1_timer, |
| 320 | .restart = omap1_restart, | ||
| 320 | MACHINE_END | 321 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/board-palmz71.c b/arch/arm/mach-omap1/board-palmz71.c index df6d15e68aa..e881945ce8e 100644 --- a/arch/arm/mach-omap1/board-palmz71.c +++ b/arch/arm/mach-omap1/board-palmz71.c | |||
| @@ -334,4 +334,5 @@ MACHINE_START(OMAP_PALMZ71, "OMAP310 based Palm Zire71") | |||
| 334 | .init_irq = omap1_init_irq, | 334 | .init_irq = omap1_init_irq, |
| 335 | .init_machine = omap_palmz71_init, | 335 | .init_machine = omap_palmz71_init, |
| 336 | .timer = &omap1_timer, | 336 | .timer = &omap1_timer, |
| 337 | .restart = omap1_restart, | ||
| 337 | MACHINE_END | 338 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/board-perseus2.c b/arch/arm/mach-omap1/board-perseus2.c index 57ecd7e0983..c000bed7627 100644 --- a/arch/arm/mach-omap1/board-perseus2.c +++ b/arch/arm/mach-omap1/board-perseus2.c | |||
| @@ -352,4 +352,5 @@ MACHINE_START(OMAP_PERSEUS2, "OMAP730 Perseus2") | |||
| 352 | .init_irq = omap1_init_irq, | 352 | .init_irq = omap1_init_irq, |
| 353 | .init_machine = omap_perseus2_init, | 353 | .init_machine = omap_perseus2_init, |
| 354 | .timer = &omap1_timer, | 354 | .timer = &omap1_timer, |
| 355 | .restart = omap1_restart, | ||
| 355 | MACHINE_END | 356 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/board-sx1.c b/arch/arm/mach-omap1/board-sx1.c index 774ae39fd63..7bcd82ab0fd 100644 --- a/arch/arm/mach-omap1/board-sx1.c +++ b/arch/arm/mach-omap1/board-sx1.c | |||
| @@ -416,4 +416,5 @@ MACHINE_START(SX1, "OMAP310 based Siemens SX1") | |||
| 416 | .init_irq = omap1_init_irq, | 416 | .init_irq = omap1_init_irq, |
| 417 | .init_machine = omap_sx1_init, | 417 | .init_machine = omap_sx1_init, |
| 418 | .timer = &omap1_timer, | 418 | .timer = &omap1_timer, |
| 419 | .restart = omap1_restart, | ||
| 419 | MACHINE_END | 420 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/board-voiceblue.c b/arch/arm/mach-omap1/board-voiceblue.c index 7721c146d8d..f83a502dc93 100644 --- a/arch/arm/mach-omap1/board-voiceblue.c +++ b/arch/arm/mach-omap1/board-voiceblue.c | |||
| @@ -28,7 +28,6 @@ | |||
| 28 | #include <linux/export.h> | 28 | #include <linux/export.h> |
| 29 | 29 | ||
| 30 | #include <mach/hardware.h> | 30 | #include <mach/hardware.h> |
| 31 | #include <mach/system.h> | ||
| 32 | #include <asm/mach-types.h> | 31 | #include <asm/mach-types.h> |
| 33 | #include <asm/mach/arch.h> | 32 | #include <asm/mach/arch.h> |
| 34 | #include <asm/mach/map.h> | 33 | #include <asm/mach/map.h> |
| @@ -221,7 +220,7 @@ void voiceblue_wdt_ping(void) | |||
| 221 | gpio_set_value(0, wdt_gpio_state); | 220 | gpio_set_value(0, wdt_gpio_state); |
| 222 | } | 221 | } |
| 223 | 222 | ||
| 224 | static void voiceblue_reset(char mode, const char *cmd) | 223 | static void voiceblue_restart(char mode, const char *cmd) |
| 225 | { | 224 | { |
| 226 | /* | 225 | /* |
| 227 | * Workaround for 5912/1611b bug mentioned in sprz209d.pdf p. 28 | 226 | * Workaround for 5912/1611b bug mentioned in sprz209d.pdf p. 28 |
| @@ -285,8 +284,6 @@ static void __init voiceblue_init(void) | |||
| 285 | * (it is connected through invertor) */ | 284 | * (it is connected through invertor) */ |
| 286 | omap_writeb(0x00, OMAP_LPG1_LCR); | 285 | omap_writeb(0x00, OMAP_LPG1_LCR); |
| 287 | omap_writeb(0x00, OMAP_LPG1_PMR); /* Disable clock */ | 286 | omap_writeb(0x00, OMAP_LPG1_PMR); /* Disable clock */ |
| 288 | |||
| 289 | arch_reset = voiceblue_reset; | ||
| 290 | } | 287 | } |
| 291 | 288 | ||
| 292 | MACHINE_START(VOICEBLUE, "VoiceBlue OMAP5910") | 289 | MACHINE_START(VOICEBLUE, "VoiceBlue OMAP5910") |
| @@ -298,4 +295,5 @@ MACHINE_START(VOICEBLUE, "VoiceBlue OMAP5910") | |||
| 298 | .init_irq = omap1_init_irq, | 295 | .init_irq = omap1_init_irq, |
| 299 | .init_machine = voiceblue_init, | 296 | .init_machine = voiceblue_init, |
| 300 | .timer = &omap1_timer, | 297 | .timer = &omap1_timer, |
| 298 | .restart = voiceblue_restart, | ||
| 301 | MACHINE_END | 299 | MACHINE_END |
diff --git a/arch/arm/mach-omap1/common.h b/arch/arm/mach-omap1/common.h index 52c4eda97fa..a9a5146dd2d 100644 --- a/arch/arm/mach-omap1/common.h +++ b/arch/arm/mach-omap1/common.h | |||
| @@ -54,6 +54,7 @@ static inline void omap16xx_map_io(void) | |||
| 54 | 54 | ||
| 55 | void omap1_init_early(void); | 55 | void omap1_init_early(void); |
| 56 | void omap1_init_irq(void); | 56 | void omap1_init_irq(void); |
| 57 | void omap1_restart(char, const char *); | ||
| 57 | 58 | ||
| 58 | extern struct sys_timer omap1_timer; | 59 | extern struct sys_timer omap1_timer; |
| 59 | extern bool omap_32k_timer_init(void); | 60 | extern bool omap_32k_timer_init(void); |
diff --git a/arch/arm/mach-omap1/reset.c b/arch/arm/mach-omap1/reset.c index ad951ee6920..91d199b6497 100644 --- a/arch/arm/mach-omap1/reset.c +++ b/arch/arm/mach-omap1/reset.c | |||
| @@ -5,10 +5,9 @@ | |||
| 5 | #include <linux/io.h> | 5 | #include <linux/io.h> |
| 6 | 6 | ||
| 7 | #include <mach/hardware.h> | 7 | #include <mach/hardware.h> |
| 8 | #include <mach/system.h> | ||
| 9 | #include <plat/prcm.h> | 8 | #include <plat/prcm.h> |
| 10 | 9 | ||
| 11 | void omap1_arch_reset(char mode, const char *cmd) | 10 | void omap1_restart(char mode, const char *cmd) |
| 12 | { | 11 | { |
| 13 | /* | 12 | /* |
| 14 | * Workaround for 5912/1611b bug mentioned in sprz209d.pdf p. 28 | 13 | * Workaround for 5912/1611b bug mentioned in sprz209d.pdf p. 28 |
| @@ -21,5 +20,3 @@ void omap1_arch_reset(char mode, const char *cmd) | |||
| 21 | 20 | ||
| 22 | omap_writew(1, ARM_RSTCT1); | 21 | omap_writew(1, ARM_RSTCT1); |
| 23 | } | 22 | } |
| 24 | |||
| 25 | void (*arch_reset)(char, const char *) = omap1_arch_reset; | ||
diff --git a/arch/arm/mach-omap2/board-2430sdp.c b/arch/arm/mach-omap2/board-2430sdp.c index d88143faca5..7370983f809 100644 --- a/arch/arm/mach-omap2/board-2430sdp.c +++ b/arch/arm/mach-omap2/board-2430sdp.c | |||
| @@ -304,4 +304,5 @@ MACHINE_START(OMAP_2430SDP, "OMAP2430 sdp2430 board") | |||
| 304 | .handle_irq = omap2_intc_handle_irq, | 304 | .handle_irq = omap2_intc_handle_irq, |
| 305 | .init_machine = omap_2430sdp_init, | 305 | .init_machine = omap_2430sdp_init, |
| 306 | .timer = &omap2_timer, | 306 | .timer = &omap2_timer, |
| 307 | .restart = omap_prcm_restart, | ||
| 307 | MACHINE_END | 308 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-3430sdp.c b/arch/arm/mach-omap2/board-3430sdp.c index 83126368ed9..9996334cb68 100644 --- a/arch/arm/mach-omap2/board-3430sdp.c +++ b/arch/arm/mach-omap2/board-3430sdp.c | |||
| @@ -731,4 +731,5 @@ MACHINE_START(OMAP_3430SDP, "OMAP3430 3430SDP board") | |||
| 731 | .handle_irq = omap3_intc_handle_irq, | 731 | .handle_irq = omap3_intc_handle_irq, |
| 732 | .init_machine = omap_3430sdp_init, | 732 | .init_machine = omap_3430sdp_init, |
| 733 | .timer = &omap3_timer, | 733 | .timer = &omap3_timer, |
| 734 | .restart = omap_prcm_restart, | ||
| 734 | MACHINE_END | 735 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-3630sdp.c b/arch/arm/mach-omap2/board-3630sdp.c index 7969dd904bd..6ef350d1ae4 100644 --- a/arch/arm/mach-omap2/board-3630sdp.c +++ b/arch/arm/mach-omap2/board-3630sdp.c | |||
| @@ -218,4 +218,5 @@ MACHINE_START(OMAP_3630SDP, "OMAP 3630SDP board") | |||
| 218 | .handle_irq = omap3_intc_handle_irq, | 218 | .handle_irq = omap3_intc_handle_irq, |
| 219 | .init_machine = omap_sdp_init, | 219 | .init_machine = omap_sdp_init, |
| 220 | .timer = &omap3_timer, | 220 | .timer = &omap3_timer, |
| 221 | .restart = omap_prcm_restart, | ||
| 221 | MACHINE_END | 222 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c index ef2bbc09428..bad5d5a5ef7 100644 --- a/arch/arm/mach-omap2/board-4430sdp.c +++ b/arch/arm/mach-omap2/board-4430sdp.c | |||
| @@ -987,4 +987,5 @@ MACHINE_START(OMAP_4430SDP, "OMAP4430 4430SDP board") | |||
| 987 | .handle_irq = gic_handle_irq, | 987 | .handle_irq = gic_handle_irq, |
| 988 | .init_machine = omap_4430sdp_init, | 988 | .init_machine = omap_4430sdp_init, |
| 989 | .timer = &omap4_timer, | 989 | .timer = &omap4_timer, |
| 990 | .restart = omap_prcm_restart, | ||
| 990 | MACHINE_END | 991 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-am3517crane.c b/arch/arm/mach-omap2/board-am3517crane.c index 7e90f93263d..c3851e8de28 100644 --- a/arch/arm/mach-omap2/board-am3517crane.c +++ b/arch/arm/mach-omap2/board-am3517crane.c | |||
| @@ -101,4 +101,5 @@ MACHINE_START(CRANEBOARD, "AM3517/05 CRANEBOARD") | |||
| 101 | .handle_irq = omap3_intc_handle_irq, | 101 | .handle_irq = omap3_intc_handle_irq, |
| 102 | .init_machine = am3517_crane_init, | 102 | .init_machine = am3517_crane_init, |
| 103 | .timer = &omap3_timer, | 103 | .timer = &omap3_timer, |
| 104 | .restart = omap_prcm_restart, | ||
| 104 | MACHINE_END | 105 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-am3517evm.c b/arch/arm/mach-omap2/board-am3517evm.c index 551cae8d9b8..f5a3a3f1173 100644 --- a/arch/arm/mach-omap2/board-am3517evm.c +++ b/arch/arm/mach-omap2/board-am3517evm.c | |||
| @@ -494,4 +494,5 @@ MACHINE_START(OMAP3517EVM, "OMAP3517/AM3517 EVM") | |||
| 494 | .handle_irq = omap3_intc_handle_irq, | 494 | .handle_irq = omap3_intc_handle_irq, |
| 495 | .init_machine = am3517_evm_init, | 495 | .init_machine = am3517_evm_init, |
| 496 | .timer = &omap3_timer, | 496 | .timer = &omap3_timer, |
| 497 | .restart = omap_prcm_restart, | ||
| 497 | MACHINE_END | 498 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-apollon.c b/arch/arm/mach-omap2/board-apollon.c index 5a66480feed..ac773829941 100644 --- a/arch/arm/mach-omap2/board-apollon.c +++ b/arch/arm/mach-omap2/board-apollon.c | |||
| @@ -357,4 +357,5 @@ MACHINE_START(OMAP_APOLLON, "OMAP24xx Apollon") | |||
| 357 | .handle_irq = omap2_intc_handle_irq, | 357 | .handle_irq = omap2_intc_handle_irq, |
| 358 | .init_machine = omap_apollon_init, | 358 | .init_machine = omap_apollon_init, |
| 359 | .timer = &omap2_timer, | 359 | .timer = &omap2_timer, |
| 360 | .restart = omap_prcm_restart, | ||
| 360 | MACHINE_END | 361 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-cm-t35.c b/arch/arm/mach-omap2/board-cm-t35.c index 510b6a2ff0f..1545102d1f9 100644 --- a/arch/arm/mach-omap2/board-cm-t35.c +++ b/arch/arm/mach-omap2/board-cm-t35.c | |||
| @@ -637,6 +637,7 @@ MACHINE_START(CM_T35, "Compulab CM-T35") | |||
| 637 | .handle_irq = omap3_intc_handle_irq, | 637 | .handle_irq = omap3_intc_handle_irq, |
| 638 | .init_machine = cm_t35_init, | 638 | .init_machine = cm_t35_init, |
| 639 | .timer = &omap3_timer, | 639 | .timer = &omap3_timer, |
| 640 | .restart = omap_prcm_restart, | ||
| 640 | MACHINE_END | 641 | MACHINE_END |
| 641 | 642 | ||
| 642 | MACHINE_START(CM_T3730, "Compulab CM-T3730") | 643 | MACHINE_START(CM_T3730, "Compulab CM-T3730") |
| @@ -648,4 +649,5 @@ MACHINE_START(CM_T3730, "Compulab CM-T3730") | |||
| 648 | .handle_irq = omap3_intc_handle_irq, | 649 | .handle_irq = omap3_intc_handle_irq, |
| 649 | .init_machine = cm_t3730_init, | 650 | .init_machine = cm_t3730_init, |
| 650 | .timer = &omap3_timer, | 651 | .timer = &omap3_timer, |
| 652 | .restart = omap_prcm_restart, | ||
| 651 | MACHINE_END | 653 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-cm-t3517.c b/arch/arm/mach-omap2/board-cm-t3517.c index efc5cedb1fb..f36d694d215 100644 --- a/arch/arm/mach-omap2/board-cm-t3517.c +++ b/arch/arm/mach-omap2/board-cm-t3517.c | |||
| @@ -302,4 +302,5 @@ MACHINE_START(CM_T3517, "Compulab CM-T3517") | |||
| 302 | .handle_irq = omap3_intc_handle_irq, | 302 | .handle_irq = omap3_intc_handle_irq, |
| 303 | .init_machine = cm_t3517_init, | 303 | .init_machine = cm_t3517_init, |
| 304 | .timer = &omap3_timer, | 304 | .timer = &omap3_timer, |
| 305 | .restart = omap_prcm_restart, | ||
| 305 | MACHINE_END | 306 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-devkit8000.c b/arch/arm/mach-omap2/board-devkit8000.c index d81ea7fa75e..e873063f4fd 100644 --- a/arch/arm/mach-omap2/board-devkit8000.c +++ b/arch/arm/mach-omap2/board-devkit8000.c | |||
| @@ -663,4 +663,5 @@ MACHINE_START(DEVKIT8000, "OMAP3 Devkit8000") | |||
| 663 | .handle_irq = omap3_intc_handle_irq, | 663 | .handle_irq = omap3_intc_handle_irq, |
| 664 | .init_machine = devkit8000_init, | 664 | .init_machine = devkit8000_init, |
| 665 | .timer = &omap3_secure_timer, | 665 | .timer = &omap3_secure_timer, |
| 666 | .restart = omap_prcm_restart, | ||
| 666 | MACHINE_END | 667 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-generic.c b/arch/arm/mach-omap2/board-generic.c index 63b54163b99..f8c5b2cc7c9 100644 --- a/arch/arm/mach-omap2/board-generic.c +++ b/arch/arm/mach-omap2/board-generic.c | |||
| @@ -106,6 +106,7 @@ DT_MACHINE_START(OMAP242X_DT, "Generic OMAP2420 (Flattened Device Tree)") | |||
| 106 | .init_machine = omap_generic_init, | 106 | .init_machine = omap_generic_init, |
| 107 | .timer = &omap2_timer, | 107 | .timer = &omap2_timer, |
| 108 | .dt_compat = omap242x_boards_compat, | 108 | .dt_compat = omap242x_boards_compat, |
| 109 | .restart = omap_prcm_restart, | ||
| 109 | MACHINE_END | 110 | MACHINE_END |
| 110 | #endif | 111 | #endif |
| 111 | 112 | ||
| @@ -125,6 +126,7 @@ DT_MACHINE_START(OMAP243X_DT, "Generic OMAP2430 (Flattened Device Tree)") | |||
| 125 | .init_machine = omap_generic_init, | 126 | .init_machine = omap_generic_init, |
| 126 | .timer = &omap2_timer, | 127 | .timer = &omap2_timer, |
| 127 | .dt_compat = omap243x_boards_compat, | 128 | .dt_compat = omap243x_boards_compat, |
| 129 | .restart = omap_prcm_restart, | ||
| 128 | MACHINE_END | 130 | MACHINE_END |
| 129 | #endif | 131 | #endif |
| 130 | 132 | ||
| @@ -143,6 +145,7 @@ DT_MACHINE_START(OMAP3_DT, "Generic OMAP3 (Flattened Device Tree)") | |||
| 143 | .init_machine = omap3_init, | 145 | .init_machine = omap3_init, |
| 144 | .timer = &omap3_timer, | 146 | .timer = &omap3_timer, |
| 145 | .dt_compat = omap3_boards_compat, | 147 | .dt_compat = omap3_boards_compat, |
| 148 | .restart = omap_prcm_restart, | ||
| 146 | MACHINE_END | 149 | MACHINE_END |
| 147 | #endif | 150 | #endif |
| 148 | 151 | ||
| @@ -161,5 +164,6 @@ DT_MACHINE_START(OMAP4_DT, "Generic OMAP4 (Flattened Device Tree)") | |||
| 161 | .init_machine = omap4_init, | 164 | .init_machine = omap4_init, |
| 162 | .timer = &omap4_timer, | 165 | .timer = &omap4_timer, |
| 163 | .dt_compat = omap4_boards_compat, | 166 | .dt_compat = omap4_boards_compat, |
| 167 | .restart = omap_prcm_restart, | ||
| 164 | MACHINE_END | 168 | MACHINE_END |
| 165 | #endif | 169 | #endif |
diff --git a/arch/arm/mach-omap2/board-h4.c b/arch/arm/mach-omap2/board-h4.c index ec4018362e8..54af800d143 100644 --- a/arch/arm/mach-omap2/board-h4.c +++ b/arch/arm/mach-omap2/board-h4.c | |||
| @@ -399,4 +399,5 @@ MACHINE_START(OMAP_H4, "OMAP2420 H4 board") | |||
| 399 | .handle_irq = omap2_intc_handle_irq, | 399 | .handle_irq = omap2_intc_handle_irq, |
| 400 | .init_machine = omap_h4_init, | 400 | .init_machine = omap_h4_init, |
| 401 | .timer = &omap2_timer, | 401 | .timer = &omap2_timer, |
| 402 | .restart = omap_prcm_restart, | ||
| 402 | MACHINE_END | 403 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-igep0020.c b/arch/arm/mach-omap2/board-igep0020.c index 5949f6ae3ed..a59ace0ed56 100644 --- a/arch/arm/mach-omap2/board-igep0020.c +++ b/arch/arm/mach-omap2/board-igep0020.c | |||
| @@ -675,6 +675,7 @@ MACHINE_START(IGEP0020, "IGEP v2 board") | |||
| 675 | .handle_irq = omap3_intc_handle_irq, | 675 | .handle_irq = omap3_intc_handle_irq, |
| 676 | .init_machine = igep_init, | 676 | .init_machine = igep_init, |
| 677 | .timer = &omap3_timer, | 677 | .timer = &omap3_timer, |
| 678 | .restart = omap_prcm_restart, | ||
| 678 | MACHINE_END | 679 | MACHINE_END |
| 679 | 680 | ||
| 680 | MACHINE_START(IGEP0030, "IGEP OMAP3 module") | 681 | MACHINE_START(IGEP0030, "IGEP OMAP3 module") |
| @@ -686,4 +687,5 @@ MACHINE_START(IGEP0030, "IGEP OMAP3 module") | |||
| 686 | .handle_irq = omap3_intc_handle_irq, | 687 | .handle_irq = omap3_intc_handle_irq, |
| 687 | .init_machine = igep_init, | 688 | .init_machine = igep_init, |
| 688 | .timer = &omap3_timer, | 689 | .timer = &omap3_timer, |
| 690 | .restart = omap_prcm_restart, | ||
| 689 | MACHINE_END | 691 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-ldp.c b/arch/arm/mach-omap2/board-ldp.c index 13bde0e6693..2d2a61f7dcb 100644 --- a/arch/arm/mach-omap2/board-ldp.c +++ b/arch/arm/mach-omap2/board-ldp.c | |||
| @@ -437,4 +437,5 @@ MACHINE_START(OMAP_LDP, "OMAP LDP board") | |||
| 437 | .handle_irq = omap3_intc_handle_irq, | 437 | .handle_irq = omap3_intc_handle_irq, |
| 438 | .init_machine = omap_ldp_init, | 438 | .init_machine = omap_ldp_init, |
| 439 | .timer = &omap3_timer, | 439 | .timer = &omap3_timer, |
| 440 | .restart = omap_prcm_restart, | ||
| 440 | MACHINE_END | 441 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-n8x0.c b/arch/arm/mach-omap2/board-n8x0.c index bebd3d84365..cef2cf1c0b8 100644 --- a/arch/arm/mach-omap2/board-n8x0.c +++ b/arch/arm/mach-omap2/board-n8x0.c | |||
| @@ -692,6 +692,7 @@ MACHINE_START(NOKIA_N800, "Nokia N800") | |||
| 692 | .handle_irq = omap2_intc_handle_irq, | 692 | .handle_irq = omap2_intc_handle_irq, |
| 693 | .init_machine = n8x0_init_machine, | 693 | .init_machine = n8x0_init_machine, |
| 694 | .timer = &omap2_timer, | 694 | .timer = &omap2_timer, |
| 695 | .restart = omap_prcm_restart, | ||
| 695 | MACHINE_END | 696 | MACHINE_END |
| 696 | 697 | ||
| 697 | MACHINE_START(NOKIA_N810, "Nokia N810") | 698 | MACHINE_START(NOKIA_N810, "Nokia N810") |
| @@ -703,6 +704,7 @@ MACHINE_START(NOKIA_N810, "Nokia N810") | |||
| 703 | .handle_irq = omap2_intc_handle_irq, | 704 | .handle_irq = omap2_intc_handle_irq, |
| 704 | .init_machine = n8x0_init_machine, | 705 | .init_machine = n8x0_init_machine, |
| 705 | .timer = &omap2_timer, | 706 | .timer = &omap2_timer, |
| 707 | .restart = omap_prcm_restart, | ||
| 706 | MACHINE_END | 708 | MACHINE_END |
| 707 | 709 | ||
| 708 | MACHINE_START(NOKIA_N810_WIMAX, "Nokia N810 WiMAX") | 710 | MACHINE_START(NOKIA_N810_WIMAX, "Nokia N810 WiMAX") |
| @@ -714,4 +716,5 @@ MACHINE_START(NOKIA_N810_WIMAX, "Nokia N810 WiMAX") | |||
| 714 | .handle_irq = omap2_intc_handle_irq, | 716 | .handle_irq = omap2_intc_handle_irq, |
| 715 | .init_machine = n8x0_init_machine, | 717 | .init_machine = n8x0_init_machine, |
| 716 | .timer = &omap2_timer, | 718 | .timer = &omap2_timer, |
| 719 | .restart = omap_prcm_restart, | ||
| 717 | MACHINE_END | 720 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c index c34f5658828..7ffcd2839e7 100644 --- a/arch/arm/mach-omap2/board-omap3beagle.c +++ b/arch/arm/mach-omap2/board-omap3beagle.c | |||
| @@ -562,4 +562,5 @@ MACHINE_START(OMAP3_BEAGLE, "OMAP3 Beagle Board") | |||
| 562 | .handle_irq = omap3_intc_handle_irq, | 562 | .handle_irq = omap3_intc_handle_irq, |
| 563 | .init_machine = omap3_beagle_init, | 563 | .init_machine = omap3_beagle_init, |
| 564 | .timer = &omap3_secure_timer, | 564 | .timer = &omap3_secure_timer, |
| 565 | .restart = omap_prcm_restart, | ||
| 565 | MACHINE_END | 566 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c index f11bc444e7b..003fe34c934 100644 --- a/arch/arm/mach-omap2/board-omap3evm.c +++ b/arch/arm/mach-omap2/board-omap3evm.c | |||
| @@ -684,4 +684,5 @@ MACHINE_START(OMAP3EVM, "OMAP3 EVM") | |||
| 684 | .handle_irq = omap3_intc_handle_irq, | 684 | .handle_irq = omap3_intc_handle_irq, |
| 685 | .init_machine = omap3_evm_init, | 685 | .init_machine = omap3_evm_init, |
| 686 | .timer = &omap3_timer, | 686 | .timer = &omap3_timer, |
| 687 | .restart = omap_prcm_restart, | ||
| 687 | MACHINE_END | 688 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-omap3logic.c b/arch/arm/mach-omap2/board-omap3logic.c index 5fa6bad9574..4198dd017d8 100644 --- a/arch/arm/mach-omap2/board-omap3logic.c +++ b/arch/arm/mach-omap2/board-omap3logic.c | |||
| @@ -211,6 +211,7 @@ MACHINE_START(OMAP3_TORPEDO, "Logic OMAP3 Torpedo board") | |||
| 211 | .handle_irq = omap3_intc_handle_irq, | 211 | .handle_irq = omap3_intc_handle_irq, |
| 212 | .init_machine = omap3logic_init, | 212 | .init_machine = omap3logic_init, |
| 213 | .timer = &omap3_timer, | 213 | .timer = &omap3_timer, |
| 214 | .restart = omap_prcm_restart, | ||
| 214 | MACHINE_END | 215 | MACHINE_END |
| 215 | 216 | ||
| 216 | MACHINE_START(OMAP3530_LV_SOM, "OMAP Logic 3530 LV SOM board") | 217 | MACHINE_START(OMAP3530_LV_SOM, "OMAP Logic 3530 LV SOM board") |
| @@ -221,4 +222,5 @@ MACHINE_START(OMAP3530_LV_SOM, "OMAP Logic 3530 LV SOM board") | |||
| 221 | .handle_irq = omap3_intc_handle_irq, | 222 | .handle_irq = omap3_intc_handle_irq, |
| 222 | .init_machine = omap3logic_init, | 223 | .init_machine = omap3logic_init, |
| 223 | .timer = &omap3_timer, | 224 | .timer = &omap3_timer, |
| 225 | .restart = omap_prcm_restart, | ||
| 224 | MACHINE_END | 226 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-omap3pandora.c b/arch/arm/mach-omap2/board-omap3pandora.c index ef315c585b7..1644b73017f 100644 --- a/arch/arm/mach-omap2/board-omap3pandora.c +++ b/arch/arm/mach-omap2/board-omap3pandora.c | |||
| @@ -609,4 +609,5 @@ MACHINE_START(OMAP3_PANDORA, "Pandora Handheld Console") | |||
| 609 | .handle_irq = omap3_intc_handle_irq, | 609 | .handle_irq = omap3_intc_handle_irq, |
| 610 | .init_machine = omap3pandora_init, | 610 | .init_machine = omap3pandora_init, |
| 611 | .timer = &omap3_timer, | 611 | .timer = &omap3_timer, |
| 612 | .restart = omap_prcm_restart, | ||
| 612 | MACHINE_END | 613 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-omap3stalker.c b/arch/arm/mach-omap2/board-omap3stalker.c index b21d70a2e4a..cb089a46f62 100644 --- a/arch/arm/mach-omap2/board-omap3stalker.c +++ b/arch/arm/mach-omap2/board-omap3stalker.c | |||
| @@ -457,4 +457,5 @@ MACHINE_START(SBC3530, "OMAP3 STALKER") | |||
| 457 | .handle_irq = omap3_intc_handle_irq, | 457 | .handle_irq = omap3_intc_handle_irq, |
| 458 | .init_machine = omap3_stalker_init, | 458 | .init_machine = omap3_stalker_init, |
| 459 | .timer = &omap3_secure_timer, | 459 | .timer = &omap3_secure_timer, |
| 460 | .restart = omap_prcm_restart, | ||
| 460 | MACHINE_END | 461 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-omap3touchbook.c b/arch/arm/mach-omap2/board-omap3touchbook.c index 18cd340f9b7..a0b851aafcc 100644 --- a/arch/arm/mach-omap2/board-omap3touchbook.c +++ b/arch/arm/mach-omap2/board-omap3touchbook.c | |||
| @@ -384,4 +384,5 @@ MACHINE_START(TOUCHBOOK, "OMAP3 touchbook Board") | |||
| 384 | .handle_irq = omap3_intc_handle_irq, | 384 | .handle_irq = omap3_intc_handle_irq, |
| 385 | .init_machine = omap3_touchbook_init, | 385 | .init_machine = omap3_touchbook_init, |
| 386 | .timer = &omap3_secure_timer, | 386 | .timer = &omap3_secure_timer, |
| 387 | .restart = omap_prcm_restart, | ||
| 387 | MACHINE_END | 388 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c index b6f114436db..8b06c6a60d0 100644 --- a/arch/arm/mach-omap2/board-omap4panda.c +++ b/arch/arm/mach-omap2/board-omap4panda.c | |||
| @@ -580,4 +580,5 @@ MACHINE_START(OMAP4_PANDA, "OMAP4 Panda board") | |||
| 580 | .handle_irq = gic_handle_irq, | 580 | .handle_irq = gic_handle_irq, |
| 581 | .init_machine = omap4_panda_init, | 581 | .init_machine = omap4_panda_init, |
| 582 | .timer = &omap4_timer, | 582 | .timer = &omap4_timer, |
| 583 | .restart = omap_prcm_restart, | ||
| 583 | MACHINE_END | 584 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-overo.c b/arch/arm/mach-omap2/board-overo.c index 60a61ea759b..52c0cef7716 100644 --- a/arch/arm/mach-omap2/board-overo.c +++ b/arch/arm/mach-omap2/board-overo.c | |||
| @@ -565,4 +565,5 @@ MACHINE_START(OVERO, "Gumstix Overo") | |||
| 565 | .handle_irq = omap3_intc_handle_irq, | 565 | .handle_irq = omap3_intc_handle_irq, |
| 566 | .init_machine = overo_init, | 566 | .init_machine = overo_init, |
| 567 | .timer = &omap3_timer, | 567 | .timer = &omap3_timer, |
| 568 | .restart = omap_prcm_restart, | ||
| 568 | MACHINE_END | 569 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-rm680.c b/arch/arm/mach-omap2/board-rm680.c index a79d49e3fe0..8678b386c6a 100644 --- a/arch/arm/mach-omap2/board-rm680.c +++ b/arch/arm/mach-omap2/board-rm680.c | |||
| @@ -152,4 +152,5 @@ MACHINE_START(NOKIA_RM680, "Nokia RM-680 board") | |||
| 152 | .handle_irq = omap3_intc_handle_irq, | 152 | .handle_irq = omap3_intc_handle_irq, |
| 153 | .init_machine = rm680_init, | 153 | .init_machine = rm680_init, |
| 154 | .timer = &omap3_timer, | 154 | .timer = &omap3_timer, |
| 155 | .restart = omap_prcm_restart, | ||
| 155 | MACHINE_END | 156 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-rx51-peripherals.c b/arch/arm/mach-omap2/board-rx51-peripherals.c index bd18d691c6a..108fee6146f 100644 --- a/arch/arm/mach-omap2/board-rx51-peripherals.c +++ b/arch/arm/mach-omap2/board-rx51-peripherals.c | |||
| @@ -193,7 +193,7 @@ static struct platform_device rx51_charger_device = { | |||
| 193 | static void __init rx51_charger_init(void) | 193 | static void __init rx51_charger_init(void) |
| 194 | { | 194 | { |
| 195 | WARN_ON(gpio_request_one(RX51_USB_TRANSCEIVER_RST_GPIO, | 195 | WARN_ON(gpio_request_one(RX51_USB_TRANSCEIVER_RST_GPIO, |
| 196 | GPIOF_OUT_INIT_LOW, "isp1704_reset")); | 196 | GPIOF_OUT_INIT_HIGH, "isp1704_reset")); |
| 197 | 197 | ||
| 198 | platform_device_register(&rx51_charger_device); | 198 | platform_device_register(&rx51_charger_device); |
| 199 | } | 199 | } |
diff --git a/arch/arm/mach-omap2/board-rx51.c b/arch/arm/mach-omap2/board-rx51.c index 4e3c0965edf..27f01f051df 100644 --- a/arch/arm/mach-omap2/board-rx51.c +++ b/arch/arm/mach-omap2/board-rx51.c | |||
| @@ -130,4 +130,5 @@ MACHINE_START(NOKIA_RX51, "Nokia RX-51 board") | |||
| 130 | .handle_irq = omap3_intc_handle_irq, | 130 | .handle_irq = omap3_intc_handle_irq, |
| 131 | .init_machine = rx51_init, | 131 | .init_machine = rx51_init, |
| 132 | .timer = &omap3_timer, | 132 | .timer = &omap3_timer, |
| 133 | .restart = omap_prcm_restart, | ||
| 133 | MACHINE_END | 134 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-ti8168evm.c b/arch/arm/mach-omap2/board-ti8168evm.c index 8402b39b284..74713e3993e 100644 --- a/arch/arm/mach-omap2/board-ti8168evm.c +++ b/arch/arm/mach-omap2/board-ti8168evm.c | |||
| @@ -48,4 +48,5 @@ MACHINE_START(TI8168EVM, "ti8168evm") | |||
| 48 | .init_irq = ti816x_init_irq, | 48 | .init_irq = ti816x_init_irq, |
| 49 | .timer = &omap3_timer, | 49 | .timer = &omap3_timer, |
| 50 | .init_machine = ti8168_evm_init, | 50 | .init_machine = ti8168_evm_init, |
| 51 | .restart = omap_prcm_restart, | ||
| 51 | MACHINE_END | 52 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-zoom.c b/arch/arm/mach-omap2/board-zoom.c index 70e5b54a211..5c20bcc57f2 100644 --- a/arch/arm/mach-omap2/board-zoom.c +++ b/arch/arm/mach-omap2/board-zoom.c | |||
| @@ -138,6 +138,7 @@ MACHINE_START(OMAP_ZOOM2, "OMAP Zoom2 board") | |||
| 138 | .handle_irq = omap3_intc_handle_irq, | 138 | .handle_irq = omap3_intc_handle_irq, |
| 139 | .init_machine = omap_zoom_init, | 139 | .init_machine = omap_zoom_init, |
| 140 | .timer = &omap3_timer, | 140 | .timer = &omap3_timer, |
| 141 | .restart = omap_prcm_restart, | ||
| 141 | MACHINE_END | 142 | MACHINE_END |
| 142 | 143 | ||
| 143 | MACHINE_START(OMAP_ZOOM3, "OMAP Zoom3 board") | 144 | MACHINE_START(OMAP_ZOOM3, "OMAP Zoom3 board") |
| @@ -149,4 +150,5 @@ MACHINE_START(OMAP_ZOOM3, "OMAP Zoom3 board") | |||
| 149 | .handle_irq = omap3_intc_handle_irq, | 150 | .handle_irq = omap3_intc_handle_irq, |
| 150 | .init_machine = omap_zoom_init, | 151 | .init_machine = omap_zoom_init, |
| 151 | .timer = &omap3_timer, | 152 | .timer = &omap3_timer, |
| 153 | .restart = omap_prcm_restart, | ||
| 152 | MACHINE_END | 154 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/common.h b/arch/arm/mach-omap2/common.h index 012bac7d56a..cda888a2e63 100644 --- a/arch/arm/mach-omap2/common.h +++ b/arch/arm/mach-omap2/common.h | |||
| @@ -84,6 +84,7 @@ void omap3_init_early(void); /* Do not use this one */ | |||
| 84 | void am35xx_init_early(void); | 84 | void am35xx_init_early(void); |
| 85 | void ti816x_init_early(void); | 85 | void ti816x_init_early(void); |
| 86 | void omap4430_init_early(void); | 86 | void omap4430_init_early(void); |
| 87 | void omap_prcm_restart(char, const char *); | ||
| 87 | 88 | ||
| 88 | /* | 89 | /* |
| 89 | * IO bases for various OMAP processors | 90 | * IO bases for various OMAP processors |
diff --git a/arch/arm/mach-omap2/mcbsp.c b/arch/arm/mach-omap2/mcbsp.c index 292eee3be15..28fcb27005d 100644 --- a/arch/arm/mach-omap2/mcbsp.c +++ b/arch/arm/mach-omap2/mcbsp.c | |||
| @@ -145,6 +145,9 @@ static int omap_init_mcbsp(struct omap_hwmod *oh, void *unused) | |||
| 145 | pdata->reg_size = 4; | 145 | pdata->reg_size = 4; |
| 146 | pdata->has_ccr = true; | 146 | pdata->has_ccr = true; |
| 147 | } | 147 | } |
| 148 | pdata->set_clk_src = omap2_mcbsp_set_clk_src; | ||
| 149 | if (id == 1) | ||
| 150 | pdata->mux_signal = omap2_mcbsp1_mux_rx_clk; | ||
| 148 | 151 | ||
| 149 | if (oh->class->rev == MCBSP_CONFIG_TYPE3) { | 152 | if (oh->class->rev == MCBSP_CONFIG_TYPE3) { |
| 150 | if (id == 2) | 153 | if (id == 2) |
| @@ -174,9 +177,6 @@ static int omap_init_mcbsp(struct omap_hwmod *oh, void *unused) | |||
| 174 | name, oh->name); | 177 | name, oh->name); |
| 175 | return PTR_ERR(pdev); | 178 | return PTR_ERR(pdev); |
| 176 | } | 179 | } |
| 177 | pdata->set_clk_src = omap2_mcbsp_set_clk_src; | ||
| 178 | if (id == 1) | ||
| 179 | pdata->mux_signal = omap2_mcbsp1_mux_rx_clk; | ||
| 180 | omap_mcbsp_count++; | 180 | omap_mcbsp_count++; |
| 181 | return 0; | 181 | return 0; |
| 182 | } | 182 | } |
diff --git a/arch/arm/mach-omap2/prcm.c b/arch/arm/mach-omap2/prcm.c index c35e5cea9f8..626acfad719 100644 --- a/arch/arm/mach-omap2/prcm.c +++ b/arch/arm/mach-omap2/prcm.c | |||
| @@ -25,7 +25,6 @@ | |||
| 25 | #include <linux/delay.h> | 25 | #include <linux/delay.h> |
| 26 | #include <linux/export.h> | 26 | #include <linux/export.h> |
| 27 | 27 | ||
| 28 | #include <mach/system.h> | ||
| 29 | #include "common.h" | 28 | #include "common.h" |
| 30 | #include <plat/prcm.h> | 29 | #include <plat/prcm.h> |
| 31 | #include <plat/irqs.h> | 30 | #include <plat/irqs.h> |
| @@ -59,7 +58,7 @@ u32 omap_prcm_get_reset_sources(void) | |||
| 59 | EXPORT_SYMBOL(omap_prcm_get_reset_sources); | 58 | EXPORT_SYMBOL(omap_prcm_get_reset_sources); |
| 60 | 59 | ||
| 61 | /* Resets clock rates and reboots the system. Only called from system.h */ | 60 | /* Resets clock rates and reboots the system. Only called from system.h */ |
| 62 | static void omap_prcm_arch_reset(char mode, const char *cmd) | 61 | void omap_prcm_restart(char mode, const char *cmd) |
| 63 | { | 62 | { |
| 64 | s16 prcm_offs = 0; | 63 | s16 prcm_offs = 0; |
| 65 | 64 | ||
| @@ -110,8 +109,6 @@ static void omap_prcm_arch_reset(char mode, const char *cmd) | |||
| 110 | omap2_prm_read_mod_reg(prcm_offs, OMAP2_RM_RSTCTRL); /* OCP barrier */ | 109 | omap2_prm_read_mod_reg(prcm_offs, OMAP2_RM_RSTCTRL); /* OCP barrier */ |
| 111 | } | 110 | } |
| 112 | 111 | ||
| 113 | void (*arch_reset)(char, const char *) = omap_prcm_arch_reset; | ||
| 114 | |||
| 115 | /** | 112 | /** |
| 116 | * omap2_cm_wait_idlest - wait for IDLEST bit to indicate module readiness | 113 | * omap2_cm_wait_idlest - wait for IDLEST bit to indicate module readiness |
| 117 | * @reg: physical address of module IDLEST register | 114 | * @reg: physical address of module IDLEST register |
diff --git a/arch/arm/mach-orion5x/common.c b/arch/arm/mach-orion5x/common.c index 22ace0bf2f9..41127e80cc1 100644 --- a/arch/arm/mach-orion5x/common.c +++ b/arch/arm/mach-orion5x/common.c | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | #include <linux/mbus.h> | 18 | #include <linux/mbus.h> |
| 19 | #include <linux/mv643xx_i2c.h> | 19 | #include <linux/mv643xx_i2c.h> |
| 20 | #include <linux/ata_platform.h> | 20 | #include <linux/ata_platform.h> |
| 21 | #include <linux/delay.h> | ||
| 21 | #include <net/dsa.h> | 22 | #include <net/dsa.h> |
| 22 | #include <asm/page.h> | 23 | #include <asm/page.h> |
| 23 | #include <asm/setup.h> | 24 | #include <asm/setup.h> |
| @@ -304,6 +305,17 @@ void __init orion5x_init(void) | |||
| 304 | orion5x_wdt_init(); | 305 | orion5x_wdt_init(); |
| 305 | } | 306 | } |
| 306 | 307 | ||
| 308 | void orion5x_restart(char mode, const char *cmd) | ||
| 309 | { | ||
| 310 | /* | ||
| 311 | * Enable and issue soft reset | ||
| 312 | */ | ||
| 313 | orion5x_setbits(RSTOUTn_MASK, (1 << 2)); | ||
| 314 | orion5x_setbits(CPU_SOFT_RESET, 1); | ||
| 315 | mdelay(200); | ||
| 316 | orion5x_clrbits(CPU_SOFT_RESET, 1); | ||
| 317 | } | ||
| 318 | |||
| 307 | /* | 319 | /* |
| 308 | * Many orion-based systems have buggy bootloader implementations. | 320 | * Many orion-based systems have buggy bootloader implementations. |
| 309 | * This is a common fixup for bogus memory tags. | 321 | * This is a common fixup for bogus memory tags. |
diff --git a/arch/arm/mach-orion5x/common.h b/arch/arm/mach-orion5x/common.h index 909489f4d23..37ef18de61b 100644 --- a/arch/arm/mach-orion5x/common.h +++ b/arch/arm/mach-orion5x/common.h | |||
| @@ -39,6 +39,7 @@ void orion5x_spi_init(void); | |||
| 39 | void orion5x_uart0_init(void); | 39 | void orion5x_uart0_init(void); |
| 40 | void orion5x_uart1_init(void); | 40 | void orion5x_uart1_init(void); |
| 41 | void orion5x_xor_init(void); | 41 | void orion5x_xor_init(void); |
| 42 | void orion5x_restart(char, const char *); | ||
| 42 | 43 | ||
| 43 | /* | 44 | /* |
| 44 | * PCIe/PCI functions. | 45 | * PCIe/PCI functions. |
diff --git a/arch/arm/mach-orion5x/d2net-setup.c b/arch/arm/mach-orion5x/d2net-setup.c index 8c8300951f4..d75dcfa0f01 100644 --- a/arch/arm/mach-orion5x/d2net-setup.c +++ b/arch/arm/mach-orion5x/d2net-setup.c | |||
| @@ -343,6 +343,7 @@ MACHINE_START(D2NET, "LaCie d2 Network") | |||
| 343 | .init_irq = orion5x_init_irq, | 343 | .init_irq = orion5x_init_irq, |
| 344 | .timer = &orion5x_timer, | 344 | .timer = &orion5x_timer, |
| 345 | .fixup = tag_fixup_mem32, | 345 | .fixup = tag_fixup_mem32, |
| 346 | .restart = orion5x_restart, | ||
| 346 | MACHINE_END | 347 | MACHINE_END |
| 347 | #endif | 348 | #endif |
| 348 | 349 | ||
| @@ -355,6 +356,7 @@ MACHINE_START(BIGDISK, "LaCie Big Disk Network") | |||
| 355 | .init_irq = orion5x_init_irq, | 356 | .init_irq = orion5x_init_irq, |
| 356 | .timer = &orion5x_timer, | 357 | .timer = &orion5x_timer, |
| 357 | .fixup = tag_fixup_mem32, | 358 | .fixup = tag_fixup_mem32, |
| 359 | .restart = orion5x_restart, | ||
| 358 | MACHINE_END | 360 | MACHINE_END |
| 359 | #endif | 361 | #endif |
| 360 | 362 | ||
diff --git a/arch/arm/mach-orion5x/db88f5281-setup.c b/arch/arm/mach-orion5x/db88f5281-setup.c index 4b79a80d5e1..a104d5a80e1 100644 --- a/arch/arm/mach-orion5x/db88f5281-setup.c +++ b/arch/arm/mach-orion5x/db88f5281-setup.c | |||
| @@ -364,4 +364,5 @@ MACHINE_START(DB88F5281, "Marvell Orion-2 Development Board") | |||
| 364 | .init_early = orion5x_init_early, | 364 | .init_early = orion5x_init_early, |
| 365 | .init_irq = orion5x_init_irq, | 365 | .init_irq = orion5x_init_irq, |
| 366 | .timer = &orion5x_timer, | 366 | .timer = &orion5x_timer, |
| 367 | .restart = orion5x_restart, | ||
| 367 | MACHINE_END | 368 | MACHINE_END |
diff --git a/arch/arm/mach-orion5x/dns323-setup.c b/arch/arm/mach-orion5x/dns323-setup.c index 343f60e9639..91b0f478859 100644 --- a/arch/arm/mach-orion5x/dns323-setup.c +++ b/arch/arm/mach-orion5x/dns323-setup.c | |||
| @@ -736,4 +736,5 @@ MACHINE_START(DNS323, "D-Link DNS-323") | |||
| 736 | .init_irq = orion5x_init_irq, | 736 | .init_irq = orion5x_init_irq, |
| 737 | .timer = &orion5x_timer, | 737 | .timer = &orion5x_timer, |
| 738 | .fixup = tag_fixup_mem32, | 738 | .fixup = tag_fixup_mem32, |
| 739 | .restart = orion5x_restart, | ||
| 739 | MACHINE_END | 740 | MACHINE_END |
diff --git a/arch/arm/mach-orion5x/edmini_v2-setup.c b/arch/arm/mach-orion5x/edmini_v2-setup.c index 70a4e9265f0..355e962137c 100644 --- a/arch/arm/mach-orion5x/edmini_v2-setup.c +++ b/arch/arm/mach-orion5x/edmini_v2-setup.c | |||
| @@ -258,4 +258,5 @@ MACHINE_START(EDMINI_V2, "LaCie Ethernet Disk mini V2") | |||
| 258 | .init_irq = orion5x_init_irq, | 258 | .init_irq = orion5x_init_irq, |
| 259 | .timer = &orion5x_timer, | 259 | .timer = &orion5x_timer, |
| 260 | .fixup = tag_fixup_mem32, | 260 | .fixup = tag_fixup_mem32, |
| 261 | .restart = orion5x_restart, | ||
| 261 | MACHINE_END | 262 | MACHINE_END |
diff --git a/arch/arm/mach-orion5x/include/mach/system.h b/arch/arm/mach-orion5x/include/mach/system.h index a1d6e46ab03..825a2650cef 100644 --- a/arch/arm/mach-orion5x/include/mach/system.h +++ b/arch/arm/mach-orion5x/include/mach/system.h | |||
| @@ -11,23 +11,9 @@ | |||
| 11 | #ifndef __ASM_ARCH_SYSTEM_H | 11 | #ifndef __ASM_ARCH_SYSTEM_H |
| 12 | #define __ASM_ARCH_SYSTEM_H | 12 | #define __ASM_ARCH_SYSTEM_H |
| 13 | 13 | ||
| 14 | #include <mach/bridge-regs.h> | ||
| 15 | |||
| 16 | static inline void arch_idle(void) | 14 | static inline void arch_idle(void) |
| 17 | { | 15 | { |
| 18 | cpu_do_idle(); | 16 | cpu_do_idle(); |
| 19 | } | 17 | } |
| 20 | 18 | ||
| 21 | static inline void arch_reset(char mode, const char *cmd) | ||
| 22 | { | ||
| 23 | /* | ||
| 24 | * Enable and issue soft reset | ||
| 25 | */ | ||
| 26 | orion5x_setbits(RSTOUTn_MASK, (1 << 2)); | ||
| 27 | orion5x_setbits(CPU_SOFT_RESET, 1); | ||
| 28 | mdelay(200); | ||
| 29 | orion5x_clrbits(CPU_SOFT_RESET, 1); | ||
| 30 | } | ||
| 31 | |||
| 32 | |||
| 33 | #endif | 19 | #endif |
diff --git a/arch/arm/mach-orion5x/kurobox_pro-setup.c b/arch/arm/mach-orion5x/kurobox_pro-setup.c index d3cd3f63258..47587b83284 100644 --- a/arch/arm/mach-orion5x/kurobox_pro-setup.c +++ b/arch/arm/mach-orion5x/kurobox_pro-setup.c | |||
| @@ -386,6 +386,7 @@ MACHINE_START(KUROBOX_PRO, "Buffalo/Revogear Kurobox Pro") | |||
| 386 | .init_irq = orion5x_init_irq, | 386 | .init_irq = orion5x_init_irq, |
| 387 | .timer = &orion5x_timer, | 387 | .timer = &orion5x_timer, |
| 388 | .fixup = tag_fixup_mem32, | 388 | .fixup = tag_fixup_mem32, |
| 389 | .restart = orion5x_restart, | ||
| 389 | MACHINE_END | 390 | MACHINE_END |
| 390 | #endif | 391 | #endif |
| 391 | 392 | ||
| @@ -399,5 +400,6 @@ MACHINE_START(LINKSTATION_PRO, "Buffalo Linkstation Pro/Live") | |||
| 399 | .init_irq = orion5x_init_irq, | 400 | .init_irq = orion5x_init_irq, |
| 400 | .timer = &orion5x_timer, | 401 | .timer = &orion5x_timer, |
| 401 | .fixup = tag_fixup_mem32, | 402 | .fixup = tag_fixup_mem32, |
| 403 | .restart = orion5x_restart, | ||
| 402 | MACHINE_END | 404 | MACHINE_END |
| 403 | #endif | 405 | #endif |
diff --git a/arch/arm/mach-orion5x/ls-chl-setup.c b/arch/arm/mach-orion5x/ls-chl-setup.c index 9503fff404e..527213169db 100644 --- a/arch/arm/mach-orion5x/ls-chl-setup.c +++ b/arch/arm/mach-orion5x/ls-chl-setup.c | |||
| @@ -140,7 +140,7 @@ static struct mv_sata_platform_data lschl_sata_data = { | |||
| 140 | 140 | ||
| 141 | static void lschl_power_off(void) | 141 | static void lschl_power_off(void) |
| 142 | { | 142 | { |
| 143 | arm_machine_restart('h', NULL); | 143 | orion5x_restart('h', NULL); |
| 144 | } | 144 | } |
| 145 | 145 | ||
| 146 | /***************************************************************************** | 146 | /***************************************************************************** |
| @@ -325,4 +325,5 @@ MACHINE_START(LINKSTATION_LSCHL, "Buffalo Linkstation LiveV3 (LS-CHL)") | |||
| 325 | .init_irq = orion5x_init_irq, | 325 | .init_irq = orion5x_init_irq, |
| 326 | .timer = &orion5x_timer, | 326 | .timer = &orion5x_timer, |
| 327 | .fixup = tag_fixup_mem32, | 327 | .fixup = tag_fixup_mem32, |
| 328 | .restart = orion5x_restart, | ||
| 328 | MACHINE_END | 329 | MACHINE_END |
diff --git a/arch/arm/mach-orion5x/ls_hgl-setup.c b/arch/arm/mach-orion5x/ls_hgl-setup.c index ed6d772f4a2..9a8697b97dd 100644 --- a/arch/arm/mach-orion5x/ls_hgl-setup.c +++ b/arch/arm/mach-orion5x/ls_hgl-setup.c | |||
| @@ -186,7 +186,7 @@ static struct mv_sata_platform_data ls_hgl_sata_data = { | |||
| 186 | 186 | ||
| 187 | static void ls_hgl_power_off(void) | 187 | static void ls_hgl_power_off(void) |
| 188 | { | 188 | { |
| 189 | arm_machine_restart('h', NULL); | 189 | orion5x_restart('h', NULL); |
| 190 | } | 190 | } |
| 191 | 191 | ||
| 192 | 192 | ||
| @@ -272,4 +272,5 @@ MACHINE_START(LINKSTATION_LS_HGL, "Buffalo Linkstation LS-HGL") | |||
| 272 | .init_irq = orion5x_init_irq, | 272 | .init_irq = orion5x_init_irq, |
| 273 | .timer = &orion5x_timer, | 273 | .timer = &orion5x_timer, |
| 274 | .fixup = tag_fixup_mem32, | 274 | .fixup = tag_fixup_mem32, |
| 275 | .restart = orion5x_restart, | ||
| 275 | MACHINE_END | 276 | MACHINE_END |
diff --git a/arch/arm/mach-orion5x/lsmini-setup.c b/arch/arm/mach-orion5x/lsmini-setup.c index 743f7f1db18..09c73659f46 100644 --- a/arch/arm/mach-orion5x/lsmini-setup.c +++ b/arch/arm/mach-orion5x/lsmini-setup.c | |||
| @@ -186,7 +186,7 @@ static struct mv_sata_platform_data lsmini_sata_data = { | |||
| 186 | 186 | ||
| 187 | static void lsmini_power_off(void) | 187 | static void lsmini_power_off(void) |
| 188 | { | 188 | { |
| 189 | arm_machine_restart('h', NULL); | 189 | orion5x_restart('h', NULL); |
| 190 | } | 190 | } |
| 191 | 191 | ||
| 192 | 192 | ||
| @@ -274,5 +274,6 @@ MACHINE_START(LINKSTATION_MINI, "Buffalo Linkstation Mini") | |||
| 274 | .init_irq = orion5x_init_irq, | 274 | .init_irq = orion5x_init_irq, |
| 275 | .timer = &orion5x_timer, | 275 | .timer = &orion5x_timer, |
| 276 | .fixup = tag_fixup_mem32, | 276 | .fixup = tag_fixup_mem32, |
| 277 | .restart = orion5x_restart, | ||
| 277 | MACHINE_END | 278 | MACHINE_END |
| 278 | #endif | 279 | #endif |
diff --git a/arch/arm/mach-orion5x/mss2-setup.c b/arch/arm/mach-orion5x/mss2-setup.c index 6020e26b1c7..65faaa34de6 100644 --- a/arch/arm/mach-orion5x/mss2-setup.c +++ b/arch/arm/mach-orion5x/mss2-setup.c | |||
| @@ -267,5 +267,6 @@ MACHINE_START(MSS2, "Maxtor Shared Storage II") | |||
| 267 | .init_early = orion5x_init_early, | 267 | .init_early = orion5x_init_early, |
| 268 | .init_irq = orion5x_init_irq, | 268 | .init_irq = orion5x_init_irq, |
| 269 | .timer = &orion5x_timer, | 269 | .timer = &orion5x_timer, |
| 270 | .fixup = tag_fixup_mem32 | 270 | .fixup = tag_fixup_mem32, |
| 271 | .restart = orion5x_restart, | ||
| 271 | MACHINE_END | 272 | MACHINE_END |
diff --git a/arch/arm/mach-orion5x/mv2120-setup.c b/arch/arm/mach-orion5x/mv2120-setup.c index 201ae367628..c87fde4deec 100644 --- a/arch/arm/mach-orion5x/mv2120-setup.c +++ b/arch/arm/mach-orion5x/mv2120-setup.c | |||
| @@ -234,5 +234,6 @@ MACHINE_START(MV2120, "HP Media Vault mv2120") | |||
| 234 | .init_early = orion5x_init_early, | 234 | .init_early = orion5x_init_early, |
| 235 | .init_irq = orion5x_init_irq, | 235 | .init_irq = orion5x_init_irq, |
| 236 | .timer = &orion5x_timer, | 236 | .timer = &orion5x_timer, |
| 237 | .fixup = tag_fixup_mem32 | 237 | .fixup = tag_fixup_mem32, |
| 238 | .restart = orion5x_restart, | ||
| 238 | MACHINE_END | 239 | MACHINE_END |
diff --git a/arch/arm/mach-orion5x/net2big-setup.c b/arch/arm/mach-orion5x/net2big-setup.c index 6197c79a2ec..0180c393c71 100644 --- a/arch/arm/mach-orion5x/net2big-setup.c +++ b/arch/arm/mach-orion5x/net2big-setup.c | |||
| @@ -426,5 +426,6 @@ MACHINE_START(NET2BIG, "LaCie 2Big Network") | |||
| 426 | .init_irq = orion5x_init_irq, | 426 | .init_irq = orion5x_init_irq, |
| 427 | .timer = &orion5x_timer, | 427 | .timer = &orion5x_timer, |
| 428 | .fixup = tag_fixup_mem32, | 428 | .fixup = tag_fixup_mem32, |
| 429 | .restart = orion5x_restart, | ||
| 429 | MACHINE_END | 430 | MACHINE_END |
| 430 | 431 | ||
diff --git a/arch/arm/mach-orion5x/rd88f5181l-fxo-setup.c b/arch/arm/mach-orion5x/rd88f5181l-fxo-setup.c index ebd6767d8e8..292038fc59f 100644 --- a/arch/arm/mach-orion5x/rd88f5181l-fxo-setup.c +++ b/arch/arm/mach-orion5x/rd88f5181l-fxo-setup.c | |||
| @@ -175,4 +175,5 @@ MACHINE_START(RD88F5181L_FXO, "Marvell Orion-VoIP FXO Reference Design") | |||
| 175 | .init_irq = orion5x_init_irq, | 175 | .init_irq = orion5x_init_irq, |
| 176 | .timer = &orion5x_timer, | 176 | .timer = &orion5x_timer, |
| 177 | .fixup = tag_fixup_mem32, | 177 | .fixup = tag_fixup_mem32, |
| 178 | .restart = orion5x_restart, | ||
| 178 | MACHINE_END | 179 | MACHINE_END |
diff --git a/arch/arm/mach-orion5x/rd88f5181l-ge-setup.c b/arch/arm/mach-orion5x/rd88f5181l-ge-setup.c index 05db2d336b0..c44eabaabc1 100644 --- a/arch/arm/mach-orion5x/rd88f5181l-ge-setup.c +++ b/arch/arm/mach-orion5x/rd88f5181l-ge-setup.c | |||
| @@ -187,4 +187,5 @@ MACHINE_START(RD88F5181L_GE, "Marvell Orion-VoIP GE Reference Design") | |||
| 187 | .init_irq = orion5x_init_irq, | 187 | .init_irq = orion5x_init_irq, |
| 188 | .timer = &orion5x_timer, | 188 | .timer = &orion5x_timer, |
| 189 | .fixup = tag_fixup_mem32, | 189 | .fixup = tag_fixup_mem32, |
| 190 | .restart = orion5x_restart, | ||
| 190 | MACHINE_END | 191 | MACHINE_END |
diff --git a/arch/arm/mach-orion5x/rd88f5182-setup.c b/arch/arm/mach-orion5x/rd88f5182-setup.c index e47fa0578ae..96438b6b202 100644 --- a/arch/arm/mach-orion5x/rd88f5182-setup.c +++ b/arch/arm/mach-orion5x/rd88f5182-setup.c | |||
| @@ -311,4 +311,5 @@ MACHINE_START(RD88F5182, "Marvell Orion-NAS Reference Design") | |||
| 311 | .init_early = orion5x_init_early, | 311 | .init_early = orion5x_init_early, |
| 312 | .init_irq = orion5x_init_irq, | 312 | .init_irq = orion5x_init_irq, |
| 313 | .timer = &orion5x_timer, | 313 | .timer = &orion5x_timer, |
| 314 | .restart = orion5x_restart, | ||
| 314 | MACHINE_END | 315 | MACHINE_END |
diff --git a/arch/arm/mach-orion5x/rd88f6183ap-ge-setup.c b/arch/arm/mach-orion5x/rd88f6183ap-ge-setup.c index 64317251ec0..2c5fab00d20 100644 --- a/arch/arm/mach-orion5x/rd88f6183ap-ge-setup.c +++ b/arch/arm/mach-orion5x/rd88f6183ap-ge-setup.c | |||
| @@ -128,4 +128,5 @@ MACHINE_START(RD88F6183AP_GE, "Marvell Orion-1-90 AP GE Reference Design") | |||
| 128 | .init_irq = orion5x_init_irq, | 128 | .init_irq = orion5x_init_irq, |
| 129 | .timer = &orion5x_timer, | 129 | .timer = &orion5x_timer, |
| 130 | .fixup = tag_fixup_mem32, | 130 | .fixup = tag_fixup_mem32, |
| 131 | .restart = orion5x_restart, | ||
| 131 | MACHINE_END | 132 | MACHINE_END |
diff --git a/arch/arm/mach-orion5x/terastation_pro2-setup.c b/arch/arm/mach-orion5x/terastation_pro2-setup.c index 29f1526f7b7..632a861ef82 100644 --- a/arch/arm/mach-orion5x/terastation_pro2-setup.c +++ b/arch/arm/mach-orion5x/terastation_pro2-setup.c | |||
| @@ -364,4 +364,5 @@ MACHINE_START(TERASTATION_PRO2, "Buffalo Terastation Pro II/Live") | |||
| 364 | .init_irq = orion5x_init_irq, | 364 | .init_irq = orion5x_init_irq, |
| 365 | .timer = &orion5x_timer, | 365 | .timer = &orion5x_timer, |
| 366 | .fixup = tag_fixup_mem32, | 366 | .fixup = tag_fixup_mem32, |
| 367 | .restart = orion5x_restart, | ||
| 367 | MACHINE_END | 368 | MACHINE_END |
diff --git a/arch/arm/mach-orion5x/ts209-setup.c b/arch/arm/mach-orion5x/ts209-setup.c index 31e51f9b4b6..62c156b20cc 100644 --- a/arch/arm/mach-orion5x/ts209-setup.c +++ b/arch/arm/mach-orion5x/ts209-setup.c | |||
| @@ -329,4 +329,5 @@ MACHINE_START(TS209, "QNAP TS-109/TS-209") | |||
| 329 | .init_irq = orion5x_init_irq, | 329 | .init_irq = orion5x_init_irq, |
| 330 | .timer = &orion5x_timer, | 330 | .timer = &orion5x_timer, |
| 331 | .fixup = tag_fixup_mem32, | 331 | .fixup = tag_fixup_mem32, |
| 332 | .restart = orion5x_restart, | ||
| 332 | MACHINE_END | 333 | MACHINE_END |
diff --git a/arch/arm/mach-orion5x/ts409-setup.c b/arch/arm/mach-orion5x/ts409-setup.c index 0fbcc14e09d..4e6ff759cd3 100644 --- a/arch/arm/mach-orion5x/ts409-setup.c +++ b/arch/arm/mach-orion5x/ts409-setup.c | |||
| @@ -318,4 +318,5 @@ MACHINE_START(TS409, "QNAP TS-409") | |||
| 318 | .init_irq = orion5x_init_irq, | 318 | .init_irq = orion5x_init_irq, |
| 319 | .timer = &orion5x_timer, | 319 | .timer = &orion5x_timer, |
| 320 | .fixup = tag_fixup_mem32, | 320 | .fixup = tag_fixup_mem32, |
| 321 | .restart = orion5x_restart, | ||
| 321 | MACHINE_END | 322 | MACHINE_END |
diff --git a/arch/arm/mach-orion5x/ts78xx-setup.c b/arch/arm/mach-orion5x/ts78xx-setup.c index b35e2005a34..c96f37472ed 100644 --- a/arch/arm/mach-orion5x/ts78xx-setup.c +++ b/arch/arm/mach-orion5x/ts78xx-setup.c | |||
| @@ -627,4 +627,5 @@ MACHINE_START(TS78XX, "Technologic Systems TS-78xx SBC") | |||
| 627 | .init_early = orion5x_init_early, | 627 | .init_early = orion5x_init_early, |
| 628 | .init_irq = orion5x_init_irq, | 628 | .init_irq = orion5x_init_irq, |
| 629 | .timer = &orion5x_timer, | 629 | .timer = &orion5x_timer, |
| 630 | .restart = orion5x_restart, | ||
| 630 | MACHINE_END | 631 | MACHINE_END |
diff --git a/arch/arm/mach-orion5x/wnr854t-setup.c b/arch/arm/mach-orion5x/wnr854t-setup.c index b8be7d8d0cf..078c03f7cd5 100644 --- a/arch/arm/mach-orion5x/wnr854t-setup.c +++ b/arch/arm/mach-orion5x/wnr854t-setup.c | |||
| @@ -179,4 +179,5 @@ MACHINE_START(WNR854T, "Netgear WNR854T") | |||
| 179 | .init_irq = orion5x_init_irq, | 179 | .init_irq = orion5x_init_irq, |
| 180 | .timer = &orion5x_timer, | 180 | .timer = &orion5x_timer, |
| 181 | .fixup = tag_fixup_mem32, | 181 | .fixup = tag_fixup_mem32, |
| 182 | .restart = orion5x_restart, | ||
| 182 | MACHINE_END | 183 | MACHINE_END |
diff --git a/arch/arm/mach-orion5x/wrt350n-v2-setup.c b/arch/arm/mach-orion5x/wrt350n-v2-setup.c index faf81a03936..46a9778171c 100644 --- a/arch/arm/mach-orion5x/wrt350n-v2-setup.c +++ b/arch/arm/mach-orion5x/wrt350n-v2-setup.c | |||
| @@ -267,4 +267,5 @@ MACHINE_START(WRT350N_V2, "Linksys WRT350N v2") | |||
| 267 | .init_irq = orion5x_init_irq, | 267 | .init_irq = orion5x_init_irq, |
| 268 | .timer = &orion5x_timer, | 268 | .timer = &orion5x_timer, |
| 269 | .fixup = tag_fixup_mem32, | 269 | .fixup = tag_fixup_mem32, |
| 270 | .restart = orion5x_restart, | ||
| 270 | MACHINE_END | 271 | MACHINE_END |
diff --git a/arch/arm/mach-picoxcell/include/mach/system.h b/arch/arm/mach-picoxcell/include/mach/system.h index 67c589b0c1b..1a5d8cb57df 100644 --- a/arch/arm/mach-picoxcell/include/mach/system.h +++ b/arch/arm/mach-picoxcell/include/mach/system.h | |||
| @@ -23,9 +23,4 @@ static inline void arch_idle(void) | |||
| 23 | cpu_do_idle(); | 23 | cpu_do_idle(); |
| 24 | } | 24 | } |
| 25 | 25 | ||
| 26 | static inline void arch_reset(int mode, const char *cmd) | ||
| 27 | { | ||
| 28 | /* Watchdog reset to go here. */ | ||
| 29 | } | ||
| 30 | |||
| 31 | #endif /* __ASM_ARCH_SYSTEM_H */ | 26 | #endif /* __ASM_ARCH_SYSTEM_H */ |
diff --git a/arch/arm/mach-pnx4008/core.c b/arch/arm/mach-pnx4008/core.c index cdb95e726f5..4cfb40b2ec1 100644 --- a/arch/arm/mach-pnx4008/core.c +++ b/arch/arm/mach-pnx4008/core.c | |||
| @@ -260,6 +260,11 @@ void __init pnx4008_map_io(void) | |||
| 260 | iotable_init(pnx4008_io_desc, ARRAY_SIZE(pnx4008_io_desc)); | 260 | iotable_init(pnx4008_io_desc, ARRAY_SIZE(pnx4008_io_desc)); |
| 261 | } | 261 | } |
| 262 | 262 | ||
| 263 | static void pnx4008_restart(char mode, const char *cmd) | ||
| 264 | { | ||
| 265 | soft_restart(0); | ||
| 266 | } | ||
| 267 | |||
| 263 | extern struct sys_timer pnx4008_timer; | 268 | extern struct sys_timer pnx4008_timer; |
| 264 | 269 | ||
| 265 | MACHINE_START(PNX4008, "Philips PNX4008") | 270 | MACHINE_START(PNX4008, "Philips PNX4008") |
| @@ -269,4 +274,5 @@ MACHINE_START(PNX4008, "Philips PNX4008") | |||
| 269 | .init_irq = pnx4008_init_irq, | 274 | .init_irq = pnx4008_init_irq, |
| 270 | .init_machine = pnx4008_init, | 275 | .init_machine = pnx4008_init, |
| 271 | .timer = &pnx4008_timer, | 276 | .timer = &pnx4008_timer, |
| 277 | .restart = pnx4008_restart, | ||
| 272 | MACHINE_END | 278 | MACHINE_END |
diff --git a/arch/arm/mach-pnx4008/include/mach/system.h b/arch/arm/mach-pnx4008/include/mach/system.h index 5d6384a6128..60cfe718809 100644 --- a/arch/arm/mach-pnx4008/include/mach/system.h +++ b/arch/arm/mach-pnx4008/include/mach/system.h | |||
| @@ -21,18 +21,9 @@ | |||
| 21 | #ifndef __ASM_ARCH_SYSTEM_H | 21 | #ifndef __ASM_ARCH_SYSTEM_H |
| 22 | #define __ASM_ARCH_SYSTEM_H | 22 | #define __ASM_ARCH_SYSTEM_H |
| 23 | 23 | ||
| 24 | #include <linux/io.h> | ||
| 25 | #include <mach/hardware.h> | ||
| 26 | #include <mach/platform.h> | ||
| 27 | |||
| 28 | static void arch_idle(void) | 24 | static void arch_idle(void) |
| 29 | { | 25 | { |
| 30 | cpu_do_idle(); | 26 | cpu_do_idle(); |
| 31 | } | 27 | } |
| 32 | 28 | ||
| 33 | static inline void arch_reset(char mode, const char *cmd) | ||
| 34 | { | ||
| 35 | soft_restart(0); | ||
| 36 | } | ||
| 37 | |||
| 38 | #endif | 29 | #endif |
diff --git a/arch/arm/mach-prima2/common.h b/arch/arm/mach-prima2/common.h index 83e5d212811..b28a930d4f8 100644 --- a/arch/arm/mach-prima2/common.h +++ b/arch/arm/mach-prima2/common.h | |||
| @@ -16,6 +16,7 @@ extern struct sys_timer sirfsoc_timer; | |||
| 16 | 16 | ||
| 17 | extern void __init sirfsoc_of_irq_init(void); | 17 | extern void __init sirfsoc_of_irq_init(void); |
| 18 | extern void __init sirfsoc_of_clk_init(void); | 18 | extern void __init sirfsoc_of_clk_init(void); |
| 19 | extern void sirfsoc_restart(char, const char *); | ||
| 19 | 20 | ||
| 20 | #ifndef CONFIG_DEBUG_LL | 21 | #ifndef CONFIG_DEBUG_LL |
| 21 | static inline void sirfsoc_map_lluart(void) {} | 22 | static inline void sirfsoc_map_lluart(void) {} |
diff --git a/arch/arm/mach-prima2/include/mach/system.h b/arch/arm/mach-prima2/include/mach/system.h index 0dbd257ad16..2c7d2a9d0c9 100644 --- a/arch/arm/mach-prima2/include/mach/system.h +++ b/arch/arm/mach-prima2/include/mach/system.h | |||
| @@ -9,21 +9,9 @@ | |||
| 9 | #ifndef __MACH_SYSTEM_H__ | 9 | #ifndef __MACH_SYSTEM_H__ |
| 10 | #define __MACH_SYSTEM_H__ | 10 | #define __MACH_SYSTEM_H__ |
| 11 | 11 | ||
| 12 | #include <linux/bitops.h> | ||
| 13 | #include <mach/hardware.h> | ||
| 14 | |||
| 15 | #define SIRFSOC_SYS_RST_BIT BIT(31) | ||
| 16 | |||
| 17 | extern void __iomem *sirfsoc_rstc_base; | ||
| 18 | |||
| 19 | static inline void arch_idle(void) | 12 | static inline void arch_idle(void) |
| 20 | { | 13 | { |
| 21 | cpu_do_idle(); | 14 | cpu_do_idle(); |
| 22 | } | 15 | } |
| 23 | 16 | ||
| 24 | static inline void arch_reset(char mode, const char *cmd) | ||
| 25 | { | ||
| 26 | writel(SIRFSOC_SYS_RST_BIT, sirfsoc_rstc_base); | ||
| 27 | } | ||
| 28 | |||
| 29 | #endif | 17 | #endif |
diff --git a/arch/arm/mach-prima2/prima2.c b/arch/arm/mach-prima2/prima2.c index a12b689a870..02b9c05ff99 100644 --- a/arch/arm/mach-prima2/prima2.c +++ b/arch/arm/mach-prima2/prima2.c | |||
| @@ -40,4 +40,5 @@ MACHINE_START(PRIMA2_EVB, "prima2cb") | |||
| 40 | .dma_zone_size = SZ_256M, | 40 | .dma_zone_size = SZ_256M, |
| 41 | .init_machine = sirfsoc_mach_init, | 41 | .init_machine = sirfsoc_mach_init, |
| 42 | .dt_compat = prima2cb_dt_match, | 42 | .dt_compat = prima2cb_dt_match, |
| 43 | .restart = sirfsoc_restart, | ||
| 43 | MACHINE_END | 44 | MACHINE_END |
diff --git a/arch/arm/mach-prima2/rstc.c b/arch/arm/mach-prima2/rstc.c index 492cfa8d261..762adb73ab7 100644 --- a/arch/arm/mach-prima2/rstc.c +++ b/arch/arm/mach-prima2/rstc.c | |||
| @@ -68,3 +68,10 @@ int sirfsoc_reset_device(struct device *dev) | |||
| 68 | 68 | ||
| 69 | return 0; | 69 | return 0; |
| 70 | } | 70 | } |
| 71 | |||
| 72 | #define SIRFSOC_SYS_RST_BIT BIT(31) | ||
| 73 | |||
| 74 | void sirfsoc_restart(char mode, const char *cmd) | ||
| 75 | { | ||
| 76 | writel(SIRFSOC_SYS_RST_BIT, sirfsoc_rstc_base); | ||
| 77 | } | ||
diff --git a/arch/arm/mach-pxa/balloon3.c b/arch/arm/mach-pxa/balloon3.c index 4b81f59a4cb..82514f5c38f 100644 --- a/arch/arm/mach-pxa/balloon3.c +++ b/arch/arm/mach-pxa/balloon3.c | |||
| @@ -829,4 +829,5 @@ MACHINE_START(BALLOON3, "Balloon3") | |||
| 829 | .timer = &pxa_timer, | 829 | .timer = &pxa_timer, |
| 830 | .init_machine = balloon3_init, | 830 | .init_machine = balloon3_init, |
| 831 | .atag_offset = 0x100, | 831 | .atag_offset = 0x100, |
| 832 | .restart = pxa_restart, | ||
| 832 | MACHINE_END | 833 | MACHINE_END |
diff --git a/arch/arm/mach-pxa/capc7117.c b/arch/arm/mach-pxa/capc7117.c index 4efc16d39c7..c2f0be040d2 100644 --- a/arch/arm/mach-pxa/capc7117.c +++ b/arch/arm/mach-pxa/capc7117.c | |||
| @@ -153,5 +153,6 @@ MACHINE_START(CAPC7117, | |||
| 153 | .init_irq = pxa3xx_init_irq, | 153 | .init_irq = pxa3xx_init_irq, |
| 154 | .handle_irq = pxa3xx_handle_irq, | 154 | .handle_irq = pxa3xx_handle_irq, |
| 155 | .timer = &pxa_timer, | 155 | .timer = &pxa_timer, |
| 156 | .init_machine = capc7117_init | 156 | .init_machine = capc7117_init, |
| 157 | .restart = pxa_restart, | ||
| 157 | MACHINE_END | 158 | MACHINE_END |
diff --git a/arch/arm/mach-pxa/cm-x2xx.c b/arch/arm/mach-pxa/cm-x2xx.c index f2e4190080c..ec170a552c2 100644 --- a/arch/arm/mach-pxa/cm-x2xx.c +++ b/arch/arm/mach-pxa/cm-x2xx.c | |||
| @@ -524,4 +524,5 @@ MACHINE_START(ARMCORE, "Compulab CM-X2XX") | |||
| 524 | #ifdef CONFIG_PCI | 524 | #ifdef CONFIG_PCI |
| 525 | .dma_zone_size = SZ_64M, | 525 | .dma_zone_size = SZ_64M, |
| 526 | #endif | 526 | #endif |
| 527 | .restart = pxa_restart, | ||
| 527 | MACHINE_END | 528 | MACHINE_END |
diff --git a/arch/arm/mach-pxa/cm-x300.c b/arch/arm/mach-pxa/cm-x300.c index e096bba8fd5..7236974da0b 100644 --- a/arch/arm/mach-pxa/cm-x300.c +++ b/arch/arm/mach-pxa/cm-x300.c | |||
| @@ -858,4 +858,5 @@ MACHINE_START(CM_X300, "CM-X300 module") | |||
| 858 | .timer = &pxa_timer, | 858 | .timer = &pxa_timer, |
| 859 | .init_machine = cm_x300_init, | 859 | .init_machine = cm_x300_init, |
| 860 | .fixup = cm_x300_fixup, | 860 | .fixup = cm_x300_fixup, |
| 861 | .restart = pxa_restart, | ||
| 861 | MACHINE_END | 862 | MACHINE_END |
diff --git a/arch/arm/mach-pxa/colibri-pxa270.c b/arch/arm/mach-pxa/colibri-pxa270.c index 05bfa1b1c00..6a685165c9f 100644 --- a/arch/arm/mach-pxa/colibri-pxa270.c +++ b/arch/arm/mach-pxa/colibri-pxa270.c | |||
| @@ -313,6 +313,7 @@ MACHINE_START(COLIBRI, "Toradex Colibri PXA270") | |||
| 313 | .init_irq = pxa27x_init_irq, | 313 | .init_irq = pxa27x_init_irq, |
| 314 | .handle_irq = pxa27x_handle_irq, | 314 | .handle_irq = pxa27x_handle_irq, |
| 315 | .timer = &pxa_timer, | 315 | .timer = &pxa_timer, |
| 316 | .restart = pxa_restart, | ||
| 316 | MACHINE_END | 317 | MACHINE_END |
| 317 | 318 | ||
| 318 | MACHINE_START(INCOME, "Income s.r.o. SH-Dmaster PXA270 SBC") | 319 | MACHINE_START(INCOME, "Income s.r.o. SH-Dmaster PXA270 SBC") |
| @@ -322,5 +323,6 @@ MACHINE_START(INCOME, "Income s.r.o. SH-Dmaster PXA270 SBC") | |||
| 322 | .init_irq = pxa27x_init_irq, | 323 | .init_irq = pxa27x_init_irq, |
| 323 | .handle_irq = pxa27x_handle_irq, | 324 | .handle_irq = pxa27x_handle_irq, |
| 324 | .timer = &pxa_timer, | 325 | .timer = &pxa_timer, |
| 326 | .restart = pxa_restart, | ||
| 325 | MACHINE_END | 327 | MACHINE_END |
| 326 | 328 | ||
diff --git a/arch/arm/mach-pxa/colibri-pxa300.c b/arch/arm/mach-pxa/colibri-pxa300.c index c825e8bf2db..c01059a61f3 100644 --- a/arch/arm/mach-pxa/colibri-pxa300.c +++ b/arch/arm/mach-pxa/colibri-pxa300.c | |||
| @@ -189,5 +189,6 @@ MACHINE_START(COLIBRI300, "Toradex Colibri PXA300") | |||
| 189 | .init_irq = pxa3xx_init_irq, | 189 | .init_irq = pxa3xx_init_irq, |
| 190 | .handle_irq = pxa3xx_handle_irq, | 190 | .handle_irq = pxa3xx_handle_irq, |
| 191 | .timer = &pxa_timer, | 191 | .timer = &pxa_timer, |
| 192 | .restart = pxa_restart, | ||
| 192 | MACHINE_END | 193 | MACHINE_END |
| 193 | 194 | ||
diff --git a/arch/arm/mach-pxa/colibri-pxa320.c b/arch/arm/mach-pxa/colibri-pxa320.c index d23b92b8048..5028f2300d5 100644 --- a/arch/arm/mach-pxa/colibri-pxa320.c +++ b/arch/arm/mach-pxa/colibri-pxa320.c | |||
| @@ -259,5 +259,6 @@ MACHINE_START(COLIBRI320, "Toradex Colibri PXA320") | |||
| 259 | .init_irq = pxa3xx_init_irq, | 259 | .init_irq = pxa3xx_init_irq, |
| 260 | .handle_irq = pxa3xx_handle_irq, | 260 | .handle_irq = pxa3xx_handle_irq, |
| 261 | .timer = &pxa_timer, | 261 | .timer = &pxa_timer, |
| 262 | .restart = pxa_restart, | ||
| 262 | MACHINE_END | 263 | MACHINE_END |
| 263 | 264 | ||
diff --git a/arch/arm/mach-pxa/corgi.c b/arch/arm/mach-pxa/corgi.c index 549468d088b..9d4dc5970b9 100644 --- a/arch/arm/mach-pxa/corgi.c +++ b/arch/arm/mach-pxa/corgi.c | |||
| @@ -655,7 +655,7 @@ static void corgi_poweroff(void) | |||
| 655 | /* Green LED off tells the bootloader to halt */ | 655 | /* Green LED off tells the bootloader to halt */ |
| 656 | gpio_set_value(CORGI_GPIO_LED_GREEN, 0); | 656 | gpio_set_value(CORGI_GPIO_LED_GREEN, 0); |
| 657 | 657 | ||
| 658 | arm_machine_restart('h', NULL); | 658 | pxa_restart('h', NULL); |
| 659 | } | 659 | } |
| 660 | 660 | ||
| 661 | static void corgi_restart(char mode, const char *cmd) | 661 | static void corgi_restart(char mode, const char *cmd) |
| @@ -664,13 +664,12 @@ static void corgi_restart(char mode, const char *cmd) | |||
| 664 | /* Green LED on tells the bootloader to reboot */ | 664 | /* Green LED on tells the bootloader to reboot */ |
| 665 | gpio_set_value(CORGI_GPIO_LED_GREEN, 1); | 665 | gpio_set_value(CORGI_GPIO_LED_GREEN, 1); |
| 666 | 666 | ||
| 667 | arm_machine_restart('h', cmd); | 667 | pxa_restart('h', cmd); |
| 668 | } | 668 | } |
| 669 | 669 | ||
| 670 | static void __init corgi_init(void) | 670 | static void __init corgi_init(void) |
| 671 | { | 671 | { |
| 672 | pm_power_off = corgi_poweroff; | 672 | pm_power_off = corgi_poweroff; |
| 673 | arm_pm_restart = corgi_restart; | ||
| 674 | 673 | ||
| 675 | /* Stop 3.6MHz and drive HIGH to PCMCIA and CS */ | 674 | /* Stop 3.6MHz and drive HIGH to PCMCIA and CS */ |
| 676 | PCFR |= PCFR_OPDE; | 675 | PCFR |= PCFR_OPDE; |
| @@ -726,6 +725,7 @@ MACHINE_START(CORGI, "SHARP Corgi") | |||
| 726 | .handle_irq = pxa25x_handle_irq, | 725 | .handle_irq = pxa25x_handle_irq, |
| 727 | .init_machine = corgi_init, | 726 | .init_machine = corgi_init, |
| 728 | .timer = &pxa_timer, | 727 | .timer = &pxa_timer, |
| 728 | .restart = corgi_restart, | ||
| 729 | MACHINE_END | 729 | MACHINE_END |
| 730 | #endif | 730 | #endif |
| 731 | 731 | ||
| @@ -737,6 +737,7 @@ MACHINE_START(SHEPHERD, "SHARP Shepherd") | |||
| 737 | .handle_irq = pxa25x_handle_irq, | 737 | .handle_irq = pxa25x_handle_irq, |
| 738 | .init_machine = corgi_init, | 738 | .init_machine = corgi_init, |
| 739 | .timer = &pxa_timer, | 739 | .timer = &pxa_timer, |
| 740 | .restart = corgi_restart, | ||
| 740 | MACHINE_END | 741 | MACHINE_END |
| 741 | #endif | 742 | #endif |
| 742 | 743 | ||
| @@ -748,6 +749,7 @@ MACHINE_START(HUSKY, "SHARP Husky") | |||
| 748 | .handle_irq = pxa25x_handle_irq, | 749 | .handle_irq = pxa25x_handle_irq, |
| 749 | .init_machine = corgi_init, | 750 | .init_machine = corgi_init, |
| 750 | .timer = &pxa_timer, | 751 | .timer = &pxa_timer, |
| 752 | .restart = corgi_restart, | ||
| 751 | MACHINE_END | 753 | MACHINE_END |
| 752 | #endif | 754 | #endif |
| 753 | 755 | ||
diff --git a/arch/arm/mach-pxa/csb726.c b/arch/arm/mach-pxa/csb726.c index 5e2cf39e9e4..fb5a51d834e 100644 --- a/arch/arm/mach-pxa/csb726.c +++ b/arch/arm/mach-pxa/csb726.c | |||
| @@ -278,4 +278,5 @@ MACHINE_START(CSB726, "Cogent CSB726") | |||
| 278 | .handle_irq = pxa27x_handle_irq, | 278 | .handle_irq = pxa27x_handle_irq, |
| 279 | .init_machine = csb726_init, | 279 | .init_machine = csb726_init, |
| 280 | .timer = &pxa_timer, | 280 | .timer = &pxa_timer, |
| 281 | .restart = pxa_restart, | ||
| 281 | MACHINE_END | 282 | MACHINE_END |
diff --git a/arch/arm/mach-pxa/em-x270.c b/arch/arm/mach-pxa/em-x270.c index 94acc0b01dd..bd396ba67af 100644 --- a/arch/arm/mach-pxa/em-x270.c +++ b/arch/arm/mach-pxa/em-x270.c | |||
| @@ -1305,6 +1305,7 @@ MACHINE_START(EM_X270, "Compulab EM-X270") | |||
| 1305 | .handle_irq = pxa27x_handle_irq, | 1305 | .handle_irq = pxa27x_handle_irq, |
| 1306 | .timer = &pxa_timer, | 1306 | .timer = &pxa_timer, |
| 1307 | .init_machine = em_x270_init, | 1307 | .init_machine = em_x270_init, |
| 1308 | .restart = pxa_restart, | ||
| 1308 | MACHINE_END | 1309 | MACHINE_END |
| 1309 | 1310 | ||
| 1310 | MACHINE_START(EXEDA, "Compulab eXeda") | 1311 | MACHINE_START(EXEDA, "Compulab eXeda") |
| @@ -1314,4 +1315,5 @@ MACHINE_START(EXEDA, "Compulab eXeda") | |||
| 1314 | .handle_irq = pxa27x_handle_irq, | 1315 | .handle_irq = pxa27x_handle_irq, |
| 1315 | .timer = &pxa_timer, | 1316 | .timer = &pxa_timer, |
| 1316 | .init_machine = em_x270_init, | 1317 | .init_machine = em_x270_init, |
| 1318 | .restart = pxa_restart, | ||
| 1317 | MACHINE_END | 1319 | MACHINE_END |
diff --git a/arch/arm/mach-pxa/eseries.c b/arch/arm/mach-pxa/eseries.c index d82b7aa3c09..69473db9775 100644 --- a/arch/arm/mach-pxa/eseries.c +++ b/arch/arm/mach-pxa/eseries.c | |||
| @@ -196,6 +196,7 @@ MACHINE_START(E330, "Toshiba e330") | |||
| 196 | .fixup = eseries_fixup, | 196 | .fixup = eseries_fixup, |
| 197 | .init_machine = e330_init, | 197 | .init_machine = e330_init, |
| 198 | .timer = &pxa_timer, | 198 | .timer = &pxa_timer, |
| 199 | .restart = pxa_restart, | ||
| 199 | MACHINE_END | 200 | MACHINE_END |
| 200 | #endif | 201 | #endif |
| 201 | 202 | ||
| @@ -246,6 +247,7 @@ MACHINE_START(E350, "Toshiba e350") | |||
| 246 | .fixup = eseries_fixup, | 247 | .fixup = eseries_fixup, |
| 247 | .init_machine = e350_init, | 248 | .init_machine = e350_init, |
| 248 | .timer = &pxa_timer, | 249 | .timer = &pxa_timer, |
| 250 | .restart = pxa_restart, | ||
| 249 | MACHINE_END | 251 | MACHINE_END |
| 250 | #endif | 252 | #endif |
| 251 | 253 | ||
| @@ -369,6 +371,7 @@ MACHINE_START(E400, "Toshiba e400") | |||
| 369 | .fixup = eseries_fixup, | 371 | .fixup = eseries_fixup, |
| 370 | .init_machine = e400_init, | 372 | .init_machine = e400_init, |
| 371 | .timer = &pxa_timer, | 373 | .timer = &pxa_timer, |
| 374 | .restart = pxa_restart, | ||
| 372 | MACHINE_END | 375 | MACHINE_END |
| 373 | #endif | 376 | #endif |
| 374 | 377 | ||
| @@ -558,6 +561,7 @@ MACHINE_START(E740, "Toshiba e740") | |||
| 558 | .fixup = eseries_fixup, | 561 | .fixup = eseries_fixup, |
| 559 | .init_machine = e740_init, | 562 | .init_machine = e740_init, |
| 560 | .timer = &pxa_timer, | 563 | .timer = &pxa_timer, |
| 564 | .restart = pxa_restart, | ||
| 561 | MACHINE_END | 565 | MACHINE_END |
| 562 | #endif | 566 | #endif |
| 563 | 567 | ||
| @@ -750,6 +754,7 @@ MACHINE_START(E750, "Toshiba e750") | |||
| 750 | .fixup = eseries_fixup, | 754 | .fixup = eseries_fixup, |
| 751 | .init_machine = e750_init, | 755 | .init_machine = e750_init, |
| 752 | .timer = &pxa_timer, | 756 | .timer = &pxa_timer, |
| 757 | .restart = pxa_restart, | ||
| 753 | MACHINE_END | 758 | MACHINE_END |
| 754 | #endif | 759 | #endif |
| 755 | 760 | ||
| @@ -955,5 +960,6 @@ MACHINE_START(E800, "Toshiba e800") | |||
| 955 | .fixup = eseries_fixup, | 960 | .fixup = eseries_fixup, |
| 956 | .init_machine = e800_init, | 961 | .init_machine = e800_init, |
| 957 | .timer = &pxa_timer, | 962 | .timer = &pxa_timer, |
| 963 | .restart = pxa_restart, | ||
| 958 | MACHINE_END | 964 | MACHINE_END |
| 959 | #endif | 965 | #endif |
diff --git a/arch/arm/mach-pxa/ezx.c b/arch/arm/mach-pxa/ezx.c index 8308eee5a92..15ab2533667 100644 --- a/arch/arm/mach-pxa/ezx.c +++ b/arch/arm/mach-pxa/ezx.c | |||
| @@ -804,6 +804,7 @@ MACHINE_START(EZX_A780, "Motorola EZX A780") | |||
| 804 | .handle_irq = pxa27x_handle_irq, | 804 | .handle_irq = pxa27x_handle_irq, |
| 805 | .timer = &pxa_timer, | 805 | .timer = &pxa_timer, |
| 806 | .init_machine = a780_init, | 806 | .init_machine = a780_init, |
| 807 | .restart = pxa_restart, | ||
| 807 | MACHINE_END | 808 | MACHINE_END |
| 808 | #endif | 809 | #endif |
| 809 | 810 | ||
| @@ -870,6 +871,7 @@ MACHINE_START(EZX_E680, "Motorola EZX E680") | |||
| 870 | .handle_irq = pxa27x_handle_irq, | 871 | .handle_irq = pxa27x_handle_irq, |
| 871 | .timer = &pxa_timer, | 872 | .timer = &pxa_timer, |
| 872 | .init_machine = e680_init, | 873 | .init_machine = e680_init, |
| 874 | .restart = pxa_restart, | ||
| 873 | MACHINE_END | 875 | MACHINE_END |
| 874 | #endif | 876 | #endif |
| 875 | 877 | ||
| @@ -936,6 +938,7 @@ MACHINE_START(EZX_A1200, "Motorola EZX A1200") | |||
| 936 | .handle_irq = pxa27x_handle_irq, | 938 | .handle_irq = pxa27x_handle_irq, |
| 937 | .timer = &pxa_timer, | 939 | .timer = &pxa_timer, |
| 938 | .init_machine = a1200_init, | 940 | .init_machine = a1200_init, |
| 941 | .restart = pxa_restart, | ||
| 939 | MACHINE_END | 942 | MACHINE_END |
| 940 | #endif | 943 | #endif |
| 941 | 944 | ||
| @@ -1127,6 +1130,7 @@ MACHINE_START(EZX_A910, "Motorola EZX A910") | |||
| 1127 | .handle_irq = pxa27x_handle_irq, | 1130 | .handle_irq = pxa27x_handle_irq, |
| 1128 | .timer = &pxa_timer, | 1131 | .timer = &pxa_timer, |
| 1129 | .init_machine = a910_init, | 1132 | .init_machine = a910_init, |
| 1133 | .restart = pxa_restart, | ||
| 1130 | MACHINE_END | 1134 | MACHINE_END |
| 1131 | #endif | 1135 | #endif |
| 1132 | 1136 | ||
| @@ -1193,6 +1197,7 @@ MACHINE_START(EZX_E6, "Motorola EZX E6") | |||
| 1193 | .handle_irq = pxa27x_handle_irq, | 1197 | .handle_irq = pxa27x_handle_irq, |
| 1194 | .timer = &pxa_timer, | 1198 | .timer = &pxa_timer, |
| 1195 | .init_machine = e6_init, | 1199 | .init_machine = e6_init, |
| 1200 | .restart = pxa_restart, | ||
| 1196 | MACHINE_END | 1201 | MACHINE_END |
| 1197 | #endif | 1202 | #endif |
| 1198 | 1203 | ||
| @@ -1233,5 +1238,6 @@ MACHINE_START(EZX_E2, "Motorola EZX E2") | |||
| 1233 | .handle_irq = pxa27x_handle_irq, | 1238 | .handle_irq = pxa27x_handle_irq, |
| 1234 | .timer = &pxa_timer, | 1239 | .timer = &pxa_timer, |
| 1235 | .init_machine = e2_init, | 1240 | .init_machine = e2_init, |
| 1241 | .restart = pxa_restart, | ||
| 1236 | MACHINE_END | 1242 | MACHINE_END |
| 1237 | #endif | 1243 | #endif |
diff --git a/arch/arm/mach-pxa/generic.h b/arch/arm/mach-pxa/generic.h index 92a2e85ab02..0d729e6619d 100644 --- a/arch/arm/mach-pxa/generic.h +++ b/arch/arm/mach-pxa/generic.h | |||
| @@ -57,3 +57,5 @@ void __init pxa_set_ffuart_info(void *info); | |||
| 57 | void __init pxa_set_btuart_info(void *info); | 57 | void __init pxa_set_btuart_info(void *info); |
| 58 | void __init pxa_set_stuart_info(void *info); | 58 | void __init pxa_set_stuart_info(void *info); |
| 59 | void __init pxa_set_hwuart_info(void *info); | 59 | void __init pxa_set_hwuart_info(void *info); |
| 60 | |||
| 61 | void pxa_restart(char, const char *); | ||
diff --git a/arch/arm/mach-pxa/gumstix.c b/arch/arm/mach-pxa/gumstix.c index ffdd70dad32..ac3b1cef475 100644 --- a/arch/arm/mach-pxa/gumstix.c +++ b/arch/arm/mach-pxa/gumstix.c | |||
| @@ -239,4 +239,5 @@ MACHINE_START(GUMSTIX, "Gumstix") | |||
| 239 | .handle_irq = pxa25x_handle_irq, | 239 | .handle_irq = pxa25x_handle_irq, |
| 240 | .timer = &pxa_timer, | 240 | .timer = &pxa_timer, |
| 241 | .init_machine = gumstix_init, | 241 | .init_machine = gumstix_init, |
| 242 | .restart = pxa_restart, | ||
| 242 | MACHINE_END | 243 | MACHINE_END |
diff --git a/arch/arm/mach-pxa/h5000.c b/arch/arm/mach-pxa/h5000.c index 4b5e110640b..fde6b4c873c 100644 --- a/arch/arm/mach-pxa/h5000.c +++ b/arch/arm/mach-pxa/h5000.c | |||
| @@ -209,4 +209,5 @@ MACHINE_START(H5400, "HP iPAQ H5000") | |||
| 209 | .handle_irq = pxa25x_handle_irq, | 209 | .handle_irq = pxa25x_handle_irq, |
| 210 | .timer = &pxa_timer, | 210 | .timer = &pxa_timer, |
| 211 | .init_machine = h5000_init, | 211 | .init_machine = h5000_init, |
| 212 | .restart = pxa_restart, | ||
| 212 | MACHINE_END | 213 | MACHINE_END |
diff --git a/arch/arm/mach-pxa/himalaya.c b/arch/arm/mach-pxa/himalaya.c index f2c32457084..26d069a9f90 100644 --- a/arch/arm/mach-pxa/himalaya.c +++ b/arch/arm/mach-pxa/himalaya.c | |||
| @@ -164,4 +164,5 @@ MACHINE_START(HIMALAYA, "HTC Himalaya") | |||
| 164 | .handle_irq = pxa25x_handle_irq, | 164 | .handle_irq = pxa25x_handle_irq, |
| 165 | .init_machine = himalaya_init, | 165 | .init_machine = himalaya_init, |
| 166 | .timer = &pxa_timer, | 166 | .timer = &pxa_timer, |
| 167 | .restart = pxa_restart, | ||
| 167 | MACHINE_END | 168 | MACHINE_END |
diff --git a/arch/arm/mach-pxa/hx4700.c b/arch/arm/mach-pxa/hx4700.c index 6f6368ece9b..ce16bdae96d 100644 --- a/arch/arm/mach-pxa/hx4700.c +++ b/arch/arm/mach-pxa/hx4700.c | |||
| @@ -845,4 +845,5 @@ MACHINE_START(H4700, "HP iPAQ HX4700") | |||
| 845 | .handle_irq = pxa27x_handle_irq, | 845 | .handle_irq = pxa27x_handle_irq, |
| 846 | .init_machine = hx4700_init, | 846 | .init_machine = hx4700_init, |
| 847 | .timer = &pxa_timer, | 847 | .timer = &pxa_timer, |
| 848 | .restart = pxa_restart, | ||
| 848 | MACHINE_END | 849 | MACHINE_END |
diff --git a/arch/arm/mach-pxa/icontrol.c b/arch/arm/mach-pxa/icontrol.c index f78d5db758d..e239b82c99d 100644 --- a/arch/arm/mach-pxa/icontrol.c +++ b/arch/arm/mach-pxa/icontrol.c | |||
| @@ -196,5 +196,6 @@ MACHINE_START(ICONTROL, "iControl/SafeTcam boards using Embedian MXM-8x10 CoM") | |||
| 196 | .init_irq = pxa3xx_init_irq, | 196 | .init_irq = pxa3xx_init_irq, |
| 197 | .handle_irq = pxa3xx_handle_irq, | 197 | .handle_irq = pxa3xx_handle_irq, |
| 198 | .timer = &pxa_timer, | 198 | .timer = &pxa_timer, |
| 199 | .init_machine = icontrol_init | 199 | .init_machine = icontrol_init, |
| 200 | .restart = pxa_restart, | ||
| 200 | MACHINE_END | 201 | MACHINE_END |
diff --git a/arch/arm/mach-pxa/idp.c b/arch/arm/mach-pxa/idp.c index ddf20e5c376..fbabd84e110 100644 --- a/arch/arm/mach-pxa/idp.c +++ b/arch/arm/mach-pxa/idp.c | |||
| @@ -199,4 +199,5 @@ MACHINE_START(PXA_IDP, "Vibren PXA255 IDP") | |||
| 199 | .handle_irq = pxa25x_handle_irq, | 199 | .handle_irq = pxa25x_handle_irq, |
| 200 | .timer = &pxa_timer, | 200 | .timer = &pxa_timer, |
| 201 | .init_machine = idp_init, | 201 | .init_machine = idp_init, |
| 202 | .restart = pxa_restart, | ||
| 202 | MACHINE_END | 203 | MACHINE_END |
diff --git a/arch/arm/mach-pxa/include/mach/system.h b/arch/arm/mach-pxa/include/mach/system.h index d1fce8b6d10..c5afacd3cc0 100644 --- a/arch/arm/mach-pxa/include/mach/system.h +++ b/arch/arm/mach-pxa/include/mach/system.h | |||
| @@ -9,15 +9,7 @@ | |||
| 9 | * it under the terms of the GNU General Public License version 2 as | 9 | * it under the terms of the GNU General Public License version 2 as |
| 10 | * published by the Free Software Foundation. | 10 | * published by the Free Software Foundation. |
| 11 | */ | 11 | */ |
| 12 | |||
| 13 | #include <asm/proc-fns.h> | ||
| 14 | #include "hardware.h" | ||
| 15 | #include "pxa2xx-regs.h" | ||
| 16 | |||
| 17 | static inline void arch_idle(void) | 12 | static inline void arch_idle(void) |
| 18 | { | 13 | { |
| 19 | cpu_do_idle(); | 14 | cpu_do_idle(); |
| 20 | } | 15 | } |
| 21 | |||
| 22 | |||
| 23 | void arch_reset(char mode, const char *cmd); | ||
diff --git a/arch/arm/mach-pxa/littleton.c b/arch/arm/mach-pxa/littleton.c index 7b324ec6449..c337c7eed51 100644 --- a/arch/arm/mach-pxa/littleton.c +++ b/arch/arm/mach-pxa/littleton.c | |||
| @@ -445,4 +445,5 @@ MACHINE_START(LITTLETON, "Marvell Form Factor Development Platform (aka Littleto | |||
| 445 | .handle_irq = pxa3xx_handle_irq, | 445 | .handle_irq = pxa3xx_handle_irq, |
| 446 | .timer = &pxa_timer, | 446 | .timer = &pxa_timer, |
| 447 | .init_machine = littleton_init, | 447 | .init_machine = littleton_init, |
| 448 | .restart = pxa_restart, | ||
| 448 | MACHINE_END | 449 | MACHINE_END |
diff --git a/arch/arm/mach-pxa/lpd270.c b/arch/arm/mach-pxa/lpd270.c index 1dd530279e0..6119c015f39 100644 --- a/arch/arm/mach-pxa/lpd270.c +++ b/arch/arm/mach-pxa/lpd270.c | |||
| @@ -505,4 +505,5 @@ MACHINE_START(LOGICPD_PXA270, "LogicPD PXA270 Card Engine") | |||
| 505 | .handle_irq = pxa27x_handle_irq, | 505 | .handle_irq = pxa27x_handle_irq, |
| 506 | .timer = &pxa_timer, | 506 | .timer = &pxa_timer, |
| 507 | .init_machine = lpd270_init, | 507 | .init_machine = lpd270_init, |
| 508 | .restart = pxa_restart, | ||
| 508 | MACHINE_END | 509 | MACHINE_END |
diff --git a/arch/arm/mach-pxa/lubbock.c b/arch/arm/mach-pxa/lubbock.c index c48ce6da918..4b7a5287165 100644 --- a/arch/arm/mach-pxa/lubbock.c +++ b/arch/arm/mach-pxa/lubbock.c | |||
| @@ -556,4 +556,5 @@ MACHINE_START(LUBBOCK, "Intel DBPXA250 Development Platform (aka Lubbock)") | |||
| 556 | .handle_irq = pxa25x_handle_irq, | 556 | .handle_irq = pxa25x_handle_irq, |
| 557 | .timer = &pxa_timer, | 557 | .timer = &pxa_timer, |
| 558 | .init_machine = lubbock_init, | 558 | .init_machine = lubbock_init, |
| 559 | .restart = pxa_restart, | ||
| 559 | MACHINE_END | 560 | MACHINE_END |
diff --git a/arch/arm/mach-pxa/magician.c b/arch/arm/mach-pxa/magician.c index 4b796c37af3..4e6774fff42 100644 --- a/arch/arm/mach-pxa/magician.c +++ b/arch/arm/mach-pxa/magician.c | |||
| @@ -760,4 +760,5 @@ MACHINE_START(MAGICIAN, "HTC Magician") | |||
| 760 | .handle_irq = pxa27x_handle_irq, | 760 | .handle_irq = pxa27x_handle_irq, |
| 761 | .init_machine = magician_init, | 761 | .init_machine = magician_init, |
| 762 | .timer = &pxa_timer, | 762 | .timer = &pxa_timer, |
| 763 | .restart = pxa_restart, | ||
| 763 | MACHINE_END | 764 | MACHINE_END |
diff --git a/arch/arm/mach-pxa/mainstone.c b/arch/arm/mach-pxa/mainstone.c index 0567d3965fd..ca14555d5e1 100644 --- a/arch/arm/mach-pxa/mainstone.c +++ b/arch/arm/mach-pxa/mainstone.c | |||
| @@ -622,4 +622,5 @@ MACHINE_START(MAINSTONE, "Intel HCDDBBVA0 Development Platform (aka Mainstone)") | |||
| 622 | .handle_irq = pxa27x_handle_irq, | 622 | .handle_irq = pxa27x_handle_irq, |
| 623 | .timer = &pxa_timer, | 623 | .timer = &pxa_timer, |
| 624 | .init_machine = mainstone_init, | 624 | .init_machine = mainstone_init, |
| 625 | .restart = pxa_restart, | ||
| 625 | MACHINE_END | 626 | MACHINE_END |
diff --git a/arch/arm/mach-pxa/mioa701.c b/arch/arm/mach-pxa/mioa701.c index 4f47a760398..924a3b5f8da 100644 --- a/arch/arm/mach-pxa/mioa701.c +++ b/arch/arm/mach-pxa/mioa701.c | |||
| @@ -696,13 +696,13 @@ static void mioa701_machine_exit(void); | |||
| 696 | static void mioa701_poweroff(void) | 696 | static void mioa701_poweroff(void) |
| 697 | { | 697 | { |
| 698 | mioa701_machine_exit(); | 698 | mioa701_machine_exit(); |
| 699 | arm_machine_restart('s', NULL); | 699 | pxa_restart('s', NULL); |
| 700 | } | 700 | } |
| 701 | 701 | ||
| 702 | static void mioa701_restart(char c, const char *cmd) | 702 | static void mioa701_restart(char c, const char *cmd) |
| 703 | { | 703 | { |
| 704 | mioa701_machine_exit(); | 704 | mioa701_machine_exit(); |
| 705 | arm_machine_restart('s', cmd); | 705 | pxa_restart('s', cmd); |
| 706 | } | 706 | } |
| 707 | 707 | ||
| 708 | static struct gpio global_gpios[] = { | 708 | static struct gpio global_gpios[] = { |
| @@ -734,7 +734,6 @@ static void __init mioa701_machine_init(void) | |||
| 734 | pxa_set_udc_info(&mioa701_udc_info); | 734 | pxa_set_udc_info(&mioa701_udc_info); |
| 735 | pxa_set_ac97_info(&mioa701_ac97_info); | 735 | pxa_set_ac97_info(&mioa701_ac97_info); |
| 736 | pm_power_off = mioa701_poweroff; | 736 | pm_power_off = mioa701_poweroff; |
| 737 | arm_pm_restart = mioa701_restart; | ||
| 738 | platform_add_devices(devices, ARRAY_SIZE(devices)); | 737 | platform_add_devices(devices, ARRAY_SIZE(devices)); |
| 739 | gsm_init(); | 738 | gsm_init(); |
| 740 | 739 | ||
| @@ -758,4 +757,5 @@ MACHINE_START(MIOA701, "MIO A701") | |||
| 758 | .handle_irq = &pxa27x_handle_irq, | 757 | .handle_irq = &pxa27x_handle_irq, |
| 759 | .init_machine = mioa701_machine_init, | 758 | .init_machine = mioa701_machine_init, |
| 760 | .timer = &pxa_timer, | 759 | .timer = &pxa_timer, |
| 760 | .restart = mioa701_restart, | ||
| 761 | MACHINE_END | 761 | MACHINE_END |
diff --git a/arch/arm/mach-pxa/mp900.c b/arch/arm/mach-pxa/mp900.c index 4af5d513c38..169bf8f97af 100644 --- a/arch/arm/mach-pxa/mp900.c +++ b/arch/arm/mach-pxa/mp900.c | |||
| @@ -98,5 +98,6 @@ MACHINE_START(NEC_MP900, "MobilePro900/C") | |||
| 98 | .init_irq = pxa25x_init_irq, | 98 | .init_irq = pxa25x_init_irq, |
| 99 | .handle_irq = pxa25x_handle_irq, | 99 | .handle_irq = pxa25x_handle_irq, |
| 100 | .init_machine = mp900c_init, | 100 | .init_machine = mp900c_init, |
| 101 | .restart = pxa_restart, | ||
| 101 | MACHINE_END | 102 | MACHINE_END |
| 102 | 103 | ||
diff --git a/arch/arm/mach-pxa/palmld.c b/arch/arm/mach-pxa/palmld.c index 3d4a2819cae..1fa80f4f80c 100644 --- a/arch/arm/mach-pxa/palmld.c +++ b/arch/arm/mach-pxa/palmld.c | |||
| @@ -347,5 +347,6 @@ MACHINE_START(PALMLD, "Palm LifeDrive") | |||
| 347 | .init_irq = pxa27x_init_irq, | 347 | .init_irq = pxa27x_init_irq, |
| 348 | .handle_irq = pxa27x_handle_irq, | 348 | .handle_irq = pxa27x_handle_irq, |
| 349 | .timer = &pxa_timer, | 349 | .timer = &pxa_timer, |
| 350 | .init_machine = palmld_init | 350 | .init_machine = palmld_init, |
| 351 | .restart = pxa_restart, | ||
| 351 | MACHINE_END | 352 | MACHINE_END |
diff --git a/arch/arm/mach-pxa/palmt5.c b/arch/arm/mach-pxa/palmt5.c index 99d6bcf1f97..5ba14316bd9 100644 --- a/arch/arm/mach-pxa/palmt5.c +++ b/arch/arm/mach-pxa/palmt5.c | |||
| @@ -208,5 +208,6 @@ MACHINE_START(PALMT5, "Palm Tungsten|T5") | |||
| 208 | .init_irq = pxa27x_init_irq, | 208 | .init_irq = pxa27x_init_irq, |
| 209 | .handle_irq = pxa27x_handle_irq, | 209 | .handle_irq = pxa27x_handle_irq, |
| 210 | .timer = &pxa_timer, | 210 | .timer = &pxa_timer, |
| 211 | .init_machine = palmt5_init | 211 | .init_machine = palmt5_init, |
| 212 | .restart = pxa_restart, | ||
| 212 | MACHINE_END | 213 | MACHINE_END |
diff --git a/arch/arm/mach-pxa/palmtc.c b/arch/arm/mach-pxa/palmtc.c index 2c24c67fd92..29b51b40f09 100644 --- a/arch/arm/mach-pxa/palmtc.c +++ b/arch/arm/mach-pxa/palmtc.c | |||
| @@ -542,5 +542,6 @@ MACHINE_START(PALMTC, "Palm Tungsten|C") | |||
| 542 | .init_irq = pxa25x_init_irq, | 542 | .init_irq = pxa25x_init_irq, |
| 543 | .handle_irq = pxa25x_handle_irq, | 543 | .handle_irq = pxa25x_handle_irq, |
| 544 | .timer = &pxa_timer, | 544 | .timer = &pxa_timer, |
| 545 | .init_machine = palmtc_init | 545 | .init_machine = palmtc_init, |
| 546 | .restart = pxa_restart, | ||
| 546 | MACHINE_END | 547 | MACHINE_END |
diff --git a/arch/arm/mach-pxa/palmte2.c b/arch/arm/mach-pxa/palmte2.c index 9376da06404..5ebf49acb82 100644 --- a/arch/arm/mach-pxa/palmte2.c +++ b/arch/arm/mach-pxa/palmte2.c | |||
| @@ -361,5 +361,6 @@ MACHINE_START(PALMTE2, "Palm Tungsten|E2") | |||
| 361 | .init_irq = pxa25x_init_irq, | 361 | .init_irq = pxa25x_init_irq, |
| 362 | .handle_irq = pxa25x_handle_irq, | 362 | .handle_irq = pxa25x_handle_irq, |
| 363 | .timer = &pxa_timer, | 363 | .timer = &pxa_timer, |
| 364 | .init_machine = palmte2_init | 364 | .init_machine = palmte2_init, |
| 365 | .restart = pxa_restart, | ||
| 365 | MACHINE_END | 366 | MACHINE_END |
diff --git a/arch/arm/mach-pxa/palmtreo.c b/arch/arm/mach-pxa/palmtreo.c index 94e9708b349..ec8249156c0 100644 --- a/arch/arm/mach-pxa/palmtreo.c +++ b/arch/arm/mach-pxa/palmtreo.c | |||
| @@ -452,6 +452,7 @@ MACHINE_START(TREO680, "Palm Treo 680") | |||
| 452 | .handle_irq = pxa27x_handle_irq, | 452 | .handle_irq = pxa27x_handle_irq, |
| 453 | .timer = &pxa_timer, | 453 | .timer = &pxa_timer, |
| 454 | .init_machine = treo680_init, | 454 | .init_machine = treo680_init, |
| 455 | .restart = pxa_restart, | ||
| 455 | MACHINE_END | 456 | MACHINE_END |
| 456 | #endif | 457 | #endif |
| 457 | 458 | ||
| @@ -464,5 +465,6 @@ MACHINE_START(CENTRO, "Palm Centro 685") | |||
| 464 | .handle_irq = pxa27x_handle_irq, | 465 | .handle_irq = pxa27x_handle_irq, |
| 465 | .timer = &pxa_timer, | 466 | .timer = &pxa_timer, |
| 466 | .init_machine = centro_init, | 467 | .init_machine = centro_init, |
| 468 | .restart = pxa_restart, | ||
| 467 | MACHINE_END | 469 | MACHINE_END |
| 468 | #endif | 470 | #endif |
diff --git a/arch/arm/mach-pxa/palmtx.c b/arch/arm/mach-pxa/palmtx.c index 4e3e45927e9..6170d76dfba 100644 --- a/arch/arm/mach-pxa/palmtx.c +++ b/arch/arm/mach-pxa/palmtx.c | |||
| @@ -369,5 +369,6 @@ MACHINE_START(PALMTX, "Palm T|X") | |||
| 369 | .init_irq = pxa27x_init_irq, | 369 | .init_irq = pxa27x_init_irq, |
| 370 | .handle_irq = pxa27x_handle_irq, | 370 | .handle_irq = pxa27x_handle_irq, |
| 371 | .timer = &pxa_timer, | 371 | .timer = &pxa_timer, |
| 372 | .init_machine = palmtx_init | 372 | .init_machine = palmtx_init, |
| 373 | .restart = pxa_restart, | ||
| 373 | MACHINE_END | 374 | MACHINE_END |
diff --git a/arch/arm/mach-pxa/palmz72.c b/arch/arm/mach-pxa/palmz72.c index 68e18baf8e0..b2dff9d415e 100644 --- a/arch/arm/mach-pxa/palmz72.c +++ b/arch/arm/mach-pxa/palmz72.c | |||
| @@ -404,5 +404,6 @@ MACHINE_START(PALMZ72, "Palm Zire72") | |||
| 404 | .init_irq = pxa27x_init_irq, | 404 | .init_irq = pxa27x_init_irq, |
| 405 | .handle_irq = pxa27x_handle_irq, | 405 | .handle_irq = pxa27x_handle_irq, |
| 406 | .timer = &pxa_timer, | 406 | .timer = &pxa_timer, |
| 407 | .init_machine = palmz72_init | 407 | .init_machine = palmz72_init, |
| 408 | .restart = pxa_restart, | ||
| 408 | MACHINE_END | 409 | MACHINE_END |
diff --git a/arch/arm/mach-pxa/pcm027.c b/arch/arm/mach-pxa/pcm027.c index 0b825a35353..fe9054435b6 100644 --- a/arch/arm/mach-pxa/pcm027.c +++ b/arch/arm/mach-pxa/pcm027.c | |||
| @@ -265,4 +265,5 @@ MACHINE_START(PCM027, "Phytec Messtechnik GmbH phyCORE-PXA270") | |||
| 265 | .handle_irq = pxa27x_handle_irq, | 265 | .handle_irq = pxa27x_handle_irq, |
| 266 | .timer = &pxa_timer, | 266 | .timer = &pxa_timer, |
| 267 | .init_machine = pcm027_init, | 267 | .init_machine = pcm027_init, |
| 268 | .restart = pxa_restart, | ||
| 268 | MACHINE_END | 269 | MACHINE_END |
diff --git a/arch/arm/mach-pxa/poodle.c b/arch/arm/mach-pxa/poodle.c index afcb48a5792..b260ce872d2 100644 --- a/arch/arm/mach-pxa/poodle.c +++ b/arch/arm/mach-pxa/poodle.c | |||
| @@ -417,7 +417,7 @@ static struct i2c_board_info __initdata poodle_i2c_devices[] = { | |||
| 417 | 417 | ||
| 418 | static void poodle_poweroff(void) | 418 | static void poodle_poweroff(void) |
| 419 | { | 419 | { |
| 420 | arm_machine_restart('h', NULL); | 420 | pxa_restart('h', NULL); |
| 421 | } | 421 | } |
| 422 | 422 | ||
| 423 | static void __init poodle_init(void) | 423 | static void __init poodle_init(void) |
| @@ -466,4 +466,5 @@ MACHINE_START(POODLE, "SHARP Poodle") | |||
| 466 | .handle_irq = pxa25x_handle_irq, | 466 | .handle_irq = pxa25x_handle_irq, |
| 467 | .timer = &pxa_timer, | 467 | .timer = &pxa_timer, |
| 468 | .init_machine = poodle_init, | 468 | .init_machine = poodle_init, |
| 469 | .restart = pxa_restart, | ||
| 469 | MACHINE_END | 470 | MACHINE_END |
diff --git a/arch/arm/mach-pxa/raumfeld.c b/arch/arm/mach-pxa/raumfeld.c index f0c05f4d12e..4962b167662 100644 --- a/arch/arm/mach-pxa/raumfeld.c +++ b/arch/arm/mach-pxa/raumfeld.c | |||
| @@ -1093,6 +1093,7 @@ MACHINE_START(RAUMFELD_RC, "Raumfeld Controller") | |||
| 1093 | .init_irq = pxa3xx_init_irq, | 1093 | .init_irq = pxa3xx_init_irq, |
| 1094 | .handle_irq = pxa3xx_handle_irq, | 1094 | .handle_irq = pxa3xx_handle_irq, |
| 1095 | .timer = &pxa_timer, | 1095 | .timer = &pxa_timer, |
| 1096 | .restart = pxa_restart, | ||
| 1096 | MACHINE_END | 1097 | MACHINE_END |
| 1097 | #endif | 1098 | #endif |
| 1098 | 1099 | ||
| @@ -1104,6 +1105,7 @@ MACHINE_START(RAUMFELD_CONNECTOR, "Raumfeld Connector") | |||
| 1104 | .init_irq = pxa3xx_init_irq, | 1105 | .init_irq = pxa3xx_init_irq, |
| 1105 | .handle_irq = pxa3xx_handle_irq, | 1106 | .handle_irq = pxa3xx_handle_irq, |
| 1106 | .timer = &pxa_timer, | 1107 | .timer = &pxa_timer, |
| 1108 | .restart = pxa_restart, | ||
| 1107 | MACHINE_END | 1109 | MACHINE_END |
| 1108 | #endif | 1110 | #endif |
| 1109 | 1111 | ||
| @@ -1115,5 +1117,6 @@ MACHINE_START(RAUMFELD_SPEAKER, "Raumfeld Speaker") | |||
| 1115 | .init_irq = pxa3xx_init_irq, | 1117 | .init_irq = pxa3xx_init_irq, |
| 1116 | .handle_irq = pxa3xx_handle_irq, | 1118 | .handle_irq = pxa3xx_handle_irq, |
| 1117 | .timer = &pxa_timer, | 1119 | .timer = &pxa_timer, |
| 1120 | .restart = pxa_restart, | ||
| 1118 | MACHINE_END | 1121 | MACHINE_END |
| 1119 | #endif | 1122 | #endif |
diff --git a/arch/arm/mach-pxa/reset.c b/arch/arm/mach-pxa/reset.c index b8bcda15da8..c8497b00cdf 100644 --- a/arch/arm/mach-pxa/reset.c +++ b/arch/arm/mach-pxa/reset.c | |||
| @@ -81,8 +81,11 @@ static void do_hw_reset(void) | |||
| 81 | OSMR3 = OSCR + 368640; /* ... in 100 ms */ | 81 | OSMR3 = OSCR + 368640; /* ... in 100 ms */ |
| 82 | } | 82 | } |
| 83 | 83 | ||
| 84 | void arch_reset(char mode, const char *cmd) | 84 | void pxa_restart(char mode, const char *cmd) |
| 85 | { | 85 | { |
| 86 | local_irq_disable(); | ||
| 87 | local_fiq_disable(); | ||
| 88 | |||
| 86 | clear_reset_status(RESET_STATUS_ALL); | 89 | clear_reset_status(RESET_STATUS_ALL); |
| 87 | 90 | ||
| 88 | switch (mode) { | 91 | switch (mode) { |
diff --git a/arch/arm/mach-pxa/saar.c b/arch/arm/mach-pxa/saar.c index fc2c1e05af9..878707056e6 100644 --- a/arch/arm/mach-pxa/saar.c +++ b/arch/arm/mach-pxa/saar.c | |||
| @@ -602,4 +602,5 @@ MACHINE_START(SAAR, "PXA930 Handheld Platform (aka SAAR)") | |||
| 602 | .handle_irq = pxa3xx_handle_irq, | 602 | .handle_irq = pxa3xx_handle_irq, |
| 603 | .timer = &pxa_timer, | 603 | .timer = &pxa_timer, |
| 604 | .init_machine = saar_init, | 604 | .init_machine = saar_init, |
| 605 | .restart = pxa_restart, | ||
| 605 | MACHINE_END | 606 | MACHINE_END |
diff --git a/arch/arm/mach-pxa/saarb.c b/arch/arm/mach-pxa/saarb.c index 3e999e308a2..b6dbaca460c 100644 --- a/arch/arm/mach-pxa/saarb.c +++ b/arch/arm/mach-pxa/saarb.c | |||
| @@ -111,5 +111,6 @@ MACHINE_START(SAARB, "PXA955 Handheld Platform (aka SAARB)") | |||
| 111 | .handle_irq = pxa3xx_handle_irq, | 111 | .handle_irq = pxa3xx_handle_irq, |
| 112 | .timer = &pxa_timer, | 112 | .timer = &pxa_timer, |
| 113 | .init_machine = saarb_init, | 113 | .init_machine = saarb_init, |
| 114 | .restart = pxa_restart, | ||
| 114 | MACHINE_END | 115 | MACHINE_END |
| 115 | 116 | ||
diff --git a/arch/arm/mach-pxa/spitz.c b/arch/arm/mach-pxa/spitz.c index 2f57d94de72..a7f81a3fd13 100644 --- a/arch/arm/mach-pxa/spitz.c +++ b/arch/arm/mach-pxa/spitz.c | |||
| @@ -926,7 +926,7 @@ static inline void spitz_i2c_init(void) {} | |||
| 926 | ******************************************************************************/ | 926 | ******************************************************************************/ |
| 927 | static void spitz_poweroff(void) | 927 | static void spitz_poweroff(void) |
| 928 | { | 928 | { |
| 929 | arm_machine_restart('g', NULL); | 929 | pxa_restart('g', NULL); |
| 930 | } | 930 | } |
| 931 | 931 | ||
| 932 | static void spitz_restart(char mode, const char *cmd) | 932 | static void spitz_restart(char mode, const char *cmd) |
| @@ -943,7 +943,6 @@ static void __init spitz_init(void) | |||
| 943 | { | 943 | { |
| 944 | init_gpio_reset(SPITZ_GPIO_ON_RESET, 1, 0); | 944 | init_gpio_reset(SPITZ_GPIO_ON_RESET, 1, 0); |
| 945 | pm_power_off = spitz_poweroff; | 945 | pm_power_off = spitz_poweroff; |
| 946 | arm_pm_restart = spitz_restart; | ||
| 947 | 946 | ||
| 948 | PMCR = 0x00; | 947 | PMCR = 0x00; |
| 949 | 948 | ||
| @@ -989,6 +988,7 @@ MACHINE_START(SPITZ, "SHARP Spitz") | |||
| 989 | .handle_irq = pxa27x_handle_irq, | 988 | .handle_irq = pxa27x_handle_irq, |
| 990 | .init_machine = spitz_init, | 989 | .init_machine = spitz_init, |
| 991 | .timer = &pxa_timer, | 990 | .timer = &pxa_timer, |
| 991 | .restart = spitz_restart, | ||
| 992 | MACHINE_END | 992 | MACHINE_END |
| 993 | #endif | 993 | #endif |
| 994 | 994 | ||
| @@ -1001,6 +1001,7 @@ MACHINE_START(BORZOI, "SHARP Borzoi") | |||
| 1001 | .handle_irq = pxa27x_handle_irq, | 1001 | .handle_irq = pxa27x_handle_irq, |
| 1002 | .init_machine = spitz_init, | 1002 | .init_machine = spitz_init, |
| 1003 | .timer = &pxa_timer, | 1003 | .timer = &pxa_timer, |
| 1004 | .restart = spitz_restart, | ||
| 1004 | MACHINE_END | 1005 | MACHINE_END |
| 1005 | #endif | 1006 | #endif |
| 1006 | 1007 | ||
| @@ -1013,5 +1014,6 @@ MACHINE_START(AKITA, "SHARP Akita") | |||
| 1013 | .handle_irq = pxa27x_handle_irq, | 1014 | .handle_irq = pxa27x_handle_irq, |
| 1014 | .init_machine = spitz_init, | 1015 | .init_machine = spitz_init, |
| 1015 | .timer = &pxa_timer, | 1016 | .timer = &pxa_timer, |
| 1017 | .restart = spitz_restart, | ||
| 1016 | MACHINE_END | 1018 | MACHINE_END |
| 1017 | #endif | 1019 | #endif |
diff --git a/arch/arm/mach-pxa/stargate2.c b/arch/arm/mach-pxa/stargate2.c index 4c9a48bef56..80d7f23ad0f 100644 --- a/arch/arm/mach-pxa/stargate2.c +++ b/arch/arm/mach-pxa/stargate2.c | |||
| @@ -1005,6 +1005,7 @@ MACHINE_START(INTELMOTE2, "IMOTE 2") | |||
| 1005 | .timer = &pxa_timer, | 1005 | .timer = &pxa_timer, |
| 1006 | .init_machine = imote2_init, | 1006 | .init_machine = imote2_init, |
| 1007 | .atag_offset = 0x100, | 1007 | .atag_offset = 0x100, |
| 1008 | .restart = pxa_restart, | ||
| 1008 | MACHINE_END | 1009 | MACHINE_END |
| 1009 | #endif | 1010 | #endif |
| 1010 | 1011 | ||
| @@ -1017,5 +1018,6 @@ MACHINE_START(STARGATE2, "Stargate 2") | |||
| 1017 | .timer = &pxa_timer, | 1018 | .timer = &pxa_timer, |
| 1018 | .init_machine = stargate2_init, | 1019 | .init_machine = stargate2_init, |
| 1019 | .atag_offset = 0x100, | 1020 | .atag_offset = 0x100, |
| 1021 | .restart = pxa_restart, | ||
| 1020 | MACHINE_END | 1022 | MACHINE_END |
| 1021 | #endif | 1023 | #endif |
diff --git a/arch/arm/mach-pxa/tavorevb.c b/arch/arm/mach-pxa/tavorevb.c index ad47bb98f30..4fa36a3e383 100644 --- a/arch/arm/mach-pxa/tavorevb.c +++ b/arch/arm/mach-pxa/tavorevb.c | |||
| @@ -495,4 +495,5 @@ MACHINE_START(TAVOREVB, "PXA930 Evaluation Board (aka TavorEVB)") | |||
| 495 | .handle_irq = pxa3xx_handle_irq, | 495 | .handle_irq = pxa3xx_handle_irq, |
| 496 | .timer = &pxa_timer, | 496 | .timer = &pxa_timer, |
| 497 | .init_machine = tavorevb_init, | 497 | .init_machine = tavorevb_init, |
| 498 | .restart = pxa_restart, | ||
| 498 | MACHINE_END | 499 | MACHINE_END |
diff --git a/arch/arm/mach-pxa/tavorevb3.c b/arch/arm/mach-pxa/tavorevb3.c index fd569167302..8a22879f0bb 100644 --- a/arch/arm/mach-pxa/tavorevb3.c +++ b/arch/arm/mach-pxa/tavorevb3.c | |||
| @@ -132,4 +132,5 @@ MACHINE_START(TAVOREVB3, "PXA950 Evaluation Board (aka TavorEVB3)") | |||
| 132 | .handle_irq = pxa3xx_handle_irq, | 132 | .handle_irq = pxa3xx_handle_irq, |
| 133 | .timer = &pxa_timer, | 133 | .timer = &pxa_timer, |
| 134 | .init_machine = evb3_init, | 134 | .init_machine = evb3_init, |
| 135 | .restart = pxa_restart, | ||
| 135 | MACHINE_END | 136 | MACHINE_END |
diff --git a/arch/arm/mach-pxa/tosa.c b/arch/arm/mach-pxa/tosa.c index ef6453041cf..dfe40f8705a 100644 --- a/arch/arm/mach-pxa/tosa.c +++ b/arch/arm/mach-pxa/tosa.c | |||
| @@ -905,7 +905,7 @@ static struct platform_device *devices[] __initdata = { | |||
| 905 | 905 | ||
| 906 | static void tosa_poweroff(void) | 906 | static void tosa_poweroff(void) |
| 907 | { | 907 | { |
| 908 | arm_machine_restart('g', NULL); | 908 | pxa_restart('g', NULL); |
| 909 | } | 909 | } |
| 910 | 910 | ||
| 911 | static void tosa_restart(char mode, const char *cmd) | 911 | static void tosa_restart(char mode, const char *cmd) |
| @@ -935,7 +935,6 @@ static void __init tosa_init(void) | |||
| 935 | init_gpio_reset(TOSA_GPIO_ON_RESET, 0, 0); | 935 | init_gpio_reset(TOSA_GPIO_ON_RESET, 0, 0); |
| 936 | 936 | ||
| 937 | pm_power_off = tosa_poweroff; | 937 | pm_power_off = tosa_poweroff; |
| 938 | arm_pm_restart = tosa_restart; | ||
| 939 | 938 | ||
| 940 | PCFR |= PCFR_OPDE; | 939 | PCFR |= PCFR_OPDE; |
| 941 | 940 | ||
| @@ -978,4 +977,5 @@ MACHINE_START(TOSA, "SHARP Tosa") | |||
| 978 | .handle_irq = pxa25x_handle_irq, | 977 | .handle_irq = pxa25x_handle_irq, |
| 979 | .init_machine = tosa_init, | 978 | .init_machine = tosa_init, |
| 980 | .timer = &pxa_timer, | 979 | .timer = &pxa_timer, |
| 980 | .restart = tosa_restart, | ||
| 981 | MACHINE_END | 981 | MACHINE_END |
diff --git a/arch/arm/mach-pxa/trizeps4.c b/arch/arm/mach-pxa/trizeps4.c index 1aaed2b17e1..0f30af617d8 100644 --- a/arch/arm/mach-pxa/trizeps4.c +++ b/arch/arm/mach-pxa/trizeps4.c | |||
| @@ -561,6 +561,7 @@ MACHINE_START(TRIZEPS4, "Keith und Koep Trizeps IV module") | |||
| 561 | .init_irq = pxa27x_init_irq, | 561 | .init_irq = pxa27x_init_irq, |
| 562 | .handle_irq = pxa27x_handle_irq, | 562 | .handle_irq = pxa27x_handle_irq, |
| 563 | .timer = &pxa_timer, | 563 | .timer = &pxa_timer, |
| 564 | .restart = pxa_restart, | ||
| 564 | MACHINE_END | 565 | MACHINE_END |
| 565 | 566 | ||
| 566 | MACHINE_START(TRIZEPS4WL, "Keith und Koep Trizeps IV-WL module") | 567 | MACHINE_START(TRIZEPS4WL, "Keith und Koep Trizeps IV-WL module") |
| @@ -571,4 +572,5 @@ MACHINE_START(TRIZEPS4WL, "Keith und Koep Trizeps IV-WL module") | |||
| 571 | .init_irq = pxa27x_init_irq, | 572 | .init_irq = pxa27x_init_irq, |
| 572 | .handle_irq = pxa27x_handle_irq, | 573 | .handle_irq = pxa27x_handle_irq, |
| 573 | .timer = &pxa_timer, | 574 | .timer = &pxa_timer, |
| 575 | .restart = pxa_restart, | ||
| 574 | MACHINE_END | 576 | MACHINE_END |
diff --git a/arch/arm/mach-pxa/viper.c b/arch/arm/mach-pxa/viper.c index 242ddae332d..afe2b749552 100644 --- a/arch/arm/mach-pxa/viper.c +++ b/arch/arm/mach-pxa/viper.c | |||
| @@ -998,4 +998,5 @@ MACHINE_START(VIPER, "Arcom/Eurotech VIPER SBC") | |||
| 998 | .handle_irq = pxa25x_handle_irq, | 998 | .handle_irq = pxa25x_handle_irq, |
| 999 | .timer = &pxa_timer, | 999 | .timer = &pxa_timer, |
| 1000 | .init_machine = viper_init, | 1000 | .init_machine = viper_init, |
| 1001 | .restart = pxa_restart, | ||
| 1001 | MACHINE_END | 1002 | MACHINE_END |
diff --git a/arch/arm/mach-pxa/vpac270.c b/arch/arm/mach-pxa/vpac270.c index ca0c6615028..fed5fb08871 100644 --- a/arch/arm/mach-pxa/vpac270.c +++ b/arch/arm/mach-pxa/vpac270.c | |||
| @@ -721,5 +721,6 @@ MACHINE_START(VPAC270, "Voipac PXA270") | |||
| 721 | .init_irq = pxa27x_init_irq, | 721 | .init_irq = pxa27x_init_irq, |
| 722 | .handle_irq = pxa27x_handle_irq, | 722 | .handle_irq = pxa27x_handle_irq, |
| 723 | .timer = &pxa_timer, | 723 | .timer = &pxa_timer, |
| 724 | .init_machine = vpac270_init | 724 | .init_machine = vpac270_init, |
| 725 | .restart = pxa_restart, | ||
| 725 | MACHINE_END | 726 | MACHINE_END |
diff --git a/arch/arm/mach-pxa/xcep.c b/arch/arm/mach-pxa/xcep.c index 70e1730ef28..4bbe9a36fe7 100644 --- a/arch/arm/mach-pxa/xcep.c +++ b/arch/arm/mach-pxa/xcep.c | |||
| @@ -185,5 +185,6 @@ MACHINE_START(XCEP, "Iskratel XCEP") | |||
| 185 | .init_irq = pxa25x_init_irq, | 185 | .init_irq = pxa25x_init_irq, |
| 186 | .handle_irq = pxa25x_handle_irq, | 186 | .handle_irq = pxa25x_handle_irq, |
| 187 | .timer = &pxa_timer, | 187 | .timer = &pxa_timer, |
| 188 | .restart = pxa_restart, | ||
| 188 | MACHINE_END | 189 | MACHINE_END |
| 189 | 190 | ||
diff --git a/arch/arm/mach-pxa/z2.c b/arch/arm/mach-pxa/z2.c index ead32c90fec..d75f66ab8c3 100644 --- a/arch/arm/mach-pxa/z2.c +++ b/arch/arm/mach-pxa/z2.c | |||
| @@ -725,4 +725,5 @@ MACHINE_START(ZIPIT2, "Zipit Z2") | |||
| 725 | .handle_irq = pxa27x_handle_irq, | 725 | .handle_irq = pxa27x_handle_irq, |
| 726 | .timer = &pxa_timer, | 726 | .timer = &pxa_timer, |
| 727 | .init_machine = z2_init, | 727 | .init_machine = z2_init, |
| 728 | .restart = pxa_restart, | ||
| 728 | MACHINE_END | 729 | MACHINE_END |
diff --git a/arch/arm/mach-pxa/zeus.c b/arch/arm/mach-pxa/zeus.c index 498b83b089f..9db35a7fcfc 100644 --- a/arch/arm/mach-pxa/zeus.c +++ b/arch/arm/mach-pxa/zeus.c | |||
| @@ -911,5 +911,6 @@ MACHINE_START(ARCOM_ZEUS, "Arcom/Eurotech ZEUS") | |||
| 911 | .handle_irq = pxa27x_handle_irq, | 911 | .handle_irq = pxa27x_handle_irq, |
| 912 | .timer = &pxa_timer, | 912 | .timer = &pxa_timer, |
| 913 | .init_machine = zeus_init, | 913 | .init_machine = zeus_init, |
| 914 | .restart = pxa_restart, | ||
| 914 | MACHINE_END | 915 | MACHINE_END |
| 915 | 916 | ||
diff --git a/arch/arm/mach-pxa/zylonite.c b/arch/arm/mach-pxa/zylonite.c index 6c39c332841..7678b1bf790 100644 --- a/arch/arm/mach-pxa/zylonite.c +++ b/arch/arm/mach-pxa/zylonite.c | |||
| @@ -430,4 +430,5 @@ MACHINE_START(ZYLONITE, "PXA3xx Platform Development Kit (aka Zylonite)") | |||
| 430 | .handle_irq = pxa3xx_handle_irq, | 430 | .handle_irq = pxa3xx_handle_irq, |
| 431 | .timer = &pxa_timer, | 431 | .timer = &pxa_timer, |
| 432 | .init_machine = zylonite_init, | 432 | .init_machine = zylonite_init, |
| 433 | .restart = pxa_restart, | ||
| 433 | MACHINE_END | 434 | MACHINE_END |
diff --git a/arch/arm/mach-realview/core.h b/arch/arm/mach-realview/core.h index 47259c89a75..735b57aaf2d 100644 --- a/arch/arm/mach-realview/core.h +++ b/arch/arm/mach-realview/core.h | |||
| @@ -65,6 +65,5 @@ extern int realview_usb_register(struct resource *res); | |||
| 65 | extern void realview_init_early(void); | 65 | extern void realview_init_early(void); |
| 66 | extern void realview_fixup(struct tag *tags, char **from, | 66 | extern void realview_fixup(struct tag *tags, char **from, |
| 67 | struct meminfo *meminfo); | 67 | struct meminfo *meminfo); |
| 68 | extern void (*realview_reset)(char); | ||
| 69 | 68 | ||
| 70 | #endif | 69 | #endif |
diff --git a/arch/arm/mach-realview/include/mach/system.h b/arch/arm/mach-realview/include/mach/system.h index 6657ff23116..471b671159c 100644 --- a/arch/arm/mach-realview/include/mach/system.h +++ b/arch/arm/mach-realview/include/mach/system.h | |||
| @@ -21,12 +21,6 @@ | |||
| 21 | #ifndef __ASM_ARCH_SYSTEM_H | 21 | #ifndef __ASM_ARCH_SYSTEM_H |
| 22 | #define __ASM_ARCH_SYSTEM_H | 22 | #define __ASM_ARCH_SYSTEM_H |
| 23 | 23 | ||
| 24 | #include <linux/io.h> | ||
| 25 | #include <mach/hardware.h> | ||
| 26 | #include <mach/platform.h> | ||
| 27 | |||
| 28 | void (*realview_reset)(char mode); | ||
| 29 | |||
| 30 | static inline void arch_idle(void) | 24 | static inline void arch_idle(void) |
| 31 | { | 25 | { |
| 32 | /* | 26 | /* |
| @@ -36,15 +30,4 @@ static inline void arch_idle(void) | |||
| 36 | cpu_do_idle(); | 30 | cpu_do_idle(); |
| 37 | } | 31 | } |
| 38 | 32 | ||
| 39 | static inline void arch_reset(char mode, const char *cmd) | ||
| 40 | { | ||
| 41 | /* | ||
| 42 | * To reset, we hit the on-board reset register | ||
| 43 | * in the system FPGA | ||
| 44 | */ | ||
| 45 | if (realview_reset) | ||
| 46 | realview_reset(mode); | ||
| 47 | dsb(); | ||
| 48 | } | ||
| 49 | |||
| 50 | #endif | 33 | #endif |
diff --git a/arch/arm/mach-realview/realview_eb.c b/arch/arm/mach-realview/realview_eb.c index 1ca944aea7f..f92a920cf50 100644 --- a/arch/arm/mach-realview/realview_eb.c +++ b/arch/arm/mach-realview/realview_eb.c | |||
| @@ -415,7 +415,7 @@ static struct sys_timer realview_eb_timer = { | |||
| 415 | .init = realview_eb_timer_init, | 415 | .init = realview_eb_timer_init, |
| 416 | }; | 416 | }; |
| 417 | 417 | ||
| 418 | static void realview_eb_reset(char mode) | 418 | static void realview_eb_restart(char mode, const char *cmd) |
| 419 | { | 419 | { |
| 420 | void __iomem *reset_ctrl = __io_address(REALVIEW_SYS_RESETCTL); | 420 | void __iomem *reset_ctrl = __io_address(REALVIEW_SYS_RESETCTL); |
| 421 | void __iomem *lock_ctrl = __io_address(REALVIEW_SYS_LOCK); | 421 | void __iomem *lock_ctrl = __io_address(REALVIEW_SYS_LOCK); |
| @@ -427,6 +427,7 @@ static void realview_eb_reset(char mode) | |||
| 427 | __raw_writel(REALVIEW_SYS_LOCK_VAL, lock_ctrl); | 427 | __raw_writel(REALVIEW_SYS_LOCK_VAL, lock_ctrl); |
| 428 | if (core_tile_eb11mp()) | 428 | if (core_tile_eb11mp()) |
| 429 | __raw_writel(0x0008, reset_ctrl); | 429 | __raw_writel(0x0008, reset_ctrl); |
| 430 | dsb(); | ||
| 430 | } | 431 | } |
| 431 | 432 | ||
| 432 | static void __init realview_eb_init(void) | 433 | static void __init realview_eb_init(void) |
| @@ -458,7 +459,6 @@ static void __init realview_eb_init(void) | |||
| 458 | #ifdef CONFIG_LEDS | 459 | #ifdef CONFIG_LEDS |
| 459 | leds_event = realview_leds_event; | 460 | leds_event = realview_leds_event; |
| 460 | #endif | 461 | #endif |
| 461 | realview_reset = realview_eb_reset; | ||
| 462 | } | 462 | } |
| 463 | 463 | ||
| 464 | MACHINE_START(REALVIEW_EB, "ARM-RealView EB") | 464 | MACHINE_START(REALVIEW_EB, "ARM-RealView EB") |
| @@ -474,4 +474,5 @@ MACHINE_START(REALVIEW_EB, "ARM-RealView EB") | |||
| 474 | #ifdef CONFIG_ZONE_DMA | 474 | #ifdef CONFIG_ZONE_DMA |
| 475 | .dma_zone_size = SZ_256M, | 475 | .dma_zone_size = SZ_256M, |
| 476 | #endif | 476 | #endif |
| 477 | .restart = realview_eb_restart, | ||
| 477 | MACHINE_END | 478 | MACHINE_END |
diff --git a/arch/arm/mach-realview/realview_pb1176.c b/arch/arm/mach-realview/realview_pb1176.c index bd8fec8b20d..8ec37b29e0f 100644 --- a/arch/arm/mach-realview/realview_pb1176.c +++ b/arch/arm/mach-realview/realview_pb1176.c | |||
| @@ -336,12 +336,13 @@ static struct sys_timer realview_pb1176_timer = { | |||
| 336 | .init = realview_pb1176_timer_init, | 336 | .init = realview_pb1176_timer_init, |
| 337 | }; | 337 | }; |
| 338 | 338 | ||
| 339 | static void realview_pb1176_reset(char mode) | 339 | static void realview_pb1176_restart(char mode, const char *cmd) |
| 340 | { | 340 | { |
| 341 | void __iomem *reset_ctrl = __io_address(REALVIEW_SYS_RESETCTL); | 341 | void __iomem *reset_ctrl = __io_address(REALVIEW_SYS_RESETCTL); |
| 342 | void __iomem *lock_ctrl = __io_address(REALVIEW_SYS_LOCK); | 342 | void __iomem *lock_ctrl = __io_address(REALVIEW_SYS_LOCK); |
| 343 | __raw_writel(REALVIEW_SYS_LOCK_VAL, lock_ctrl); | 343 | __raw_writel(REALVIEW_SYS_LOCK_VAL, lock_ctrl); |
| 344 | __raw_writel(REALVIEW_PB1176_SYS_SOFT_RESET, reset_ctrl); | 344 | __raw_writel(REALVIEW_PB1176_SYS_SOFT_RESET, reset_ctrl); |
| 345 | dsb(); | ||
| 345 | } | 346 | } |
| 346 | 347 | ||
| 347 | static void realview_pb1176_fixup(struct tag *tags, char **from, | 348 | static void realview_pb1176_fixup(struct tag *tags, char **from, |
| @@ -381,7 +382,6 @@ static void __init realview_pb1176_init(void) | |||
| 381 | #ifdef CONFIG_LEDS | 382 | #ifdef CONFIG_LEDS |
| 382 | leds_event = realview_leds_event; | 383 | leds_event = realview_leds_event; |
| 383 | #endif | 384 | #endif |
| 384 | realview_reset = realview_pb1176_reset; | ||
| 385 | } | 385 | } |
| 386 | 386 | ||
| 387 | MACHINE_START(REALVIEW_PB1176, "ARM-RealView PB1176") | 387 | MACHINE_START(REALVIEW_PB1176, "ARM-RealView PB1176") |
| @@ -397,4 +397,5 @@ MACHINE_START(REALVIEW_PB1176, "ARM-RealView PB1176") | |||
| 397 | #ifdef CONFIG_ZONE_DMA | 397 | #ifdef CONFIG_ZONE_DMA |
| 398 | .dma_zone_size = SZ_256M, | 398 | .dma_zone_size = SZ_256M, |
| 399 | #endif | 399 | #endif |
| 400 | .restart = realview_pb1176_restart, | ||
| 400 | MACHINE_END | 401 | MACHINE_END |
diff --git a/arch/arm/mach-realview/realview_pb11mp.c b/arch/arm/mach-realview/realview_pb11mp.c index fa73ba81a44..f035fda8b61 100644 --- a/arch/arm/mach-realview/realview_pb11mp.c +++ b/arch/arm/mach-realview/realview_pb11mp.c | |||
| @@ -315,7 +315,7 @@ static struct sys_timer realview_pb11mp_timer = { | |||
| 315 | .init = realview_pb11mp_timer_init, | 315 | .init = realview_pb11mp_timer_init, |
| 316 | }; | 316 | }; |
| 317 | 317 | ||
| 318 | static void realview_pb11mp_reset(char mode) | 318 | static void realview_pb11mp_restart(char mode, const char *cmd) |
| 319 | { | 319 | { |
| 320 | void __iomem *reset_ctrl = __io_address(REALVIEW_SYS_RESETCTL); | 320 | void __iomem *reset_ctrl = __io_address(REALVIEW_SYS_RESETCTL); |
| 321 | void __iomem *lock_ctrl = __io_address(REALVIEW_SYS_LOCK); | 321 | void __iomem *lock_ctrl = __io_address(REALVIEW_SYS_LOCK); |
| @@ -327,6 +327,7 @@ static void realview_pb11mp_reset(char mode) | |||
| 327 | __raw_writel(REALVIEW_SYS_LOCK_VAL, lock_ctrl); | 327 | __raw_writel(REALVIEW_SYS_LOCK_VAL, lock_ctrl); |
| 328 | __raw_writel(0x0000, reset_ctrl); | 328 | __raw_writel(0x0000, reset_ctrl); |
| 329 | __raw_writel(0x0004, reset_ctrl); | 329 | __raw_writel(0x0004, reset_ctrl); |
| 330 | dsb(); | ||
| 330 | } | 331 | } |
| 331 | 332 | ||
| 332 | static void __init realview_pb11mp_init(void) | 333 | static void __init realview_pb11mp_init(void) |
| @@ -355,7 +356,6 @@ static void __init realview_pb11mp_init(void) | |||
| 355 | #ifdef CONFIG_LEDS | 356 | #ifdef CONFIG_LEDS |
| 356 | leds_event = realview_leds_event; | 357 | leds_event = realview_leds_event; |
| 357 | #endif | 358 | #endif |
| 358 | realview_reset = realview_pb11mp_reset; | ||
| 359 | } | 359 | } |
| 360 | 360 | ||
| 361 | MACHINE_START(REALVIEW_PB11MP, "ARM-RealView PB11MPCore") | 361 | MACHINE_START(REALVIEW_PB11MP, "ARM-RealView PB11MPCore") |
| @@ -371,4 +371,5 @@ MACHINE_START(REALVIEW_PB11MP, "ARM-RealView PB11MPCore") | |||
| 371 | #ifdef CONFIG_ZONE_DMA | 371 | #ifdef CONFIG_ZONE_DMA |
| 372 | .dma_zone_size = SZ_256M, | 372 | .dma_zone_size = SZ_256M, |
| 373 | #endif | 373 | #endif |
| 374 | .restart = realview_pb11mp_restart, | ||
| 374 | MACHINE_END | 375 | MACHINE_END |
diff --git a/arch/arm/mach-realview/realview_pba8.c b/arch/arm/mach-realview/realview_pba8.c index 6e5f2b9ddb7..0109c8b440c 100644 --- a/arch/arm/mach-realview/realview_pba8.c +++ b/arch/arm/mach-realview/realview_pba8.c | |||
| @@ -271,7 +271,7 @@ static struct sys_timer realview_pba8_timer = { | |||
| 271 | .init = realview_pba8_timer_init, | 271 | .init = realview_pba8_timer_init, |
| 272 | }; | 272 | }; |
| 273 | 273 | ||
| 274 | static void realview_pba8_reset(char mode) | 274 | static void realview_pba8_restart(char mode, const char *cmd) |
| 275 | { | 275 | { |
| 276 | void __iomem *reset_ctrl = __io_address(REALVIEW_SYS_RESETCTL); | 276 | void __iomem *reset_ctrl = __io_address(REALVIEW_SYS_RESETCTL); |
| 277 | void __iomem *lock_ctrl = __io_address(REALVIEW_SYS_LOCK); | 277 | void __iomem *lock_ctrl = __io_address(REALVIEW_SYS_LOCK); |
| @@ -283,6 +283,7 @@ static void realview_pba8_reset(char mode) | |||
| 283 | __raw_writel(REALVIEW_SYS_LOCK_VAL, lock_ctrl); | 283 | __raw_writel(REALVIEW_SYS_LOCK_VAL, lock_ctrl); |
| 284 | __raw_writel(0x0000, reset_ctrl); | 284 | __raw_writel(0x0000, reset_ctrl); |
| 285 | __raw_writel(0x0004, reset_ctrl); | 285 | __raw_writel(0x0004, reset_ctrl); |
| 286 | dsb(); | ||
| 286 | } | 287 | } |
| 287 | 288 | ||
| 288 | static void __init realview_pba8_init(void) | 289 | static void __init realview_pba8_init(void) |
| @@ -305,7 +306,6 @@ static void __init realview_pba8_init(void) | |||
| 305 | #ifdef CONFIG_LEDS | 306 | #ifdef CONFIG_LEDS |
| 306 | leds_event = realview_leds_event; | 307 | leds_event = realview_leds_event; |
| 307 | #endif | 308 | #endif |
| 308 | realview_reset = realview_pba8_reset; | ||
| 309 | } | 309 | } |
| 310 | 310 | ||
| 311 | MACHINE_START(REALVIEW_PBA8, "ARM-RealView PB-A8") | 311 | MACHINE_START(REALVIEW_PBA8, "ARM-RealView PB-A8") |
| @@ -321,4 +321,5 @@ MACHINE_START(REALVIEW_PBA8, "ARM-RealView PB-A8") | |||
| 321 | #ifdef CONFIG_ZONE_DMA | 321 | #ifdef CONFIG_ZONE_DMA |
| 322 | .dma_zone_size = SZ_256M, | 322 | .dma_zone_size = SZ_256M, |
| 323 | #endif | 323 | #endif |
| 324 | .restart = realview_pba8_restart, | ||
| 324 | MACHINE_END | 325 | MACHINE_END |
diff --git a/arch/arm/mach-realview/realview_pbx.c b/arch/arm/mach-realview/realview_pbx.c index 7aabc21af01..0194b3e26dc 100644 --- a/arch/arm/mach-realview/realview_pbx.c +++ b/arch/arm/mach-realview/realview_pbx.c | |||
| @@ -339,7 +339,7 @@ static void realview_pbx_fixup(struct tag *tags, char **from, | |||
| 339 | #endif | 339 | #endif |
| 340 | } | 340 | } |
| 341 | 341 | ||
| 342 | static void realview_pbx_reset(char mode) | 342 | static void realview_pbx_restart(char mode, const char *cmd) |
| 343 | { | 343 | { |
| 344 | void __iomem *reset_ctrl = __io_address(REALVIEW_SYS_RESETCTL); | 344 | void __iomem *reset_ctrl = __io_address(REALVIEW_SYS_RESETCTL); |
| 345 | void __iomem *lock_ctrl = __io_address(REALVIEW_SYS_LOCK); | 345 | void __iomem *lock_ctrl = __io_address(REALVIEW_SYS_LOCK); |
| @@ -351,6 +351,7 @@ static void realview_pbx_reset(char mode) | |||
| 351 | __raw_writel(REALVIEW_SYS_LOCK_VAL, lock_ctrl); | 351 | __raw_writel(REALVIEW_SYS_LOCK_VAL, lock_ctrl); |
| 352 | __raw_writel(0x00F0, reset_ctrl); | 352 | __raw_writel(0x00F0, reset_ctrl); |
| 353 | __raw_writel(0x00F4, reset_ctrl); | 353 | __raw_writel(0x00F4, reset_ctrl); |
| 354 | dsb(); | ||
| 354 | } | 355 | } |
| 355 | 356 | ||
| 356 | static void __init realview_pbx_init(void) | 357 | static void __init realview_pbx_init(void) |
| @@ -388,7 +389,6 @@ static void __init realview_pbx_init(void) | |||
| 388 | #ifdef CONFIG_LEDS | 389 | #ifdef CONFIG_LEDS |
| 389 | leds_event = realview_leds_event; | 390 | leds_event = realview_leds_event; |
| 390 | #endif | 391 | #endif |
| 391 | realview_reset = realview_pbx_reset; | ||
| 392 | } | 392 | } |
| 393 | 393 | ||
| 394 | MACHINE_START(REALVIEW_PBX, "ARM-RealView PBX") | 394 | MACHINE_START(REALVIEW_PBX, "ARM-RealView PBX") |
| @@ -404,4 +404,5 @@ MACHINE_START(REALVIEW_PBX, "ARM-RealView PBX") | |||
| 404 | #ifdef CONFIG_ZONE_DMA | 404 | #ifdef CONFIG_ZONE_DMA |
| 405 | .dma_zone_size = SZ_256M, | 405 | .dma_zone_size = SZ_256M, |
| 406 | #endif | 406 | #endif |
| 407 | .restart = realview_pbx_restart, | ||
| 407 | MACHINE_END | 408 | MACHINE_END |
diff --git a/arch/arm/mach-rpc/include/mach/system.h b/arch/arm/mach-rpc/include/mach/system.h index a354f4d092c..359bab94b6a 100644 --- a/arch/arm/mach-rpc/include/mach/system.h +++ b/arch/arm/mach-rpc/include/mach/system.h | |||
| @@ -7,21 +7,7 @@ | |||
| 7 | * it under the terms of the GNU General Public License version 2 as | 7 | * it under the terms of the GNU General Public License version 2 as |
| 8 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
| 9 | */ | 9 | */ |
| 10 | #include <linux/io.h> | ||
| 11 | #include <mach/hardware.h> | ||
| 12 | #include <asm/hardware/iomd.h> | ||
| 13 | |||
| 14 | static inline void arch_idle(void) | 10 | static inline void arch_idle(void) |
| 15 | { | 11 | { |
| 16 | cpu_do_idle(); | 12 | cpu_do_idle(); |
| 17 | } | 13 | } |
| 18 | |||
| 19 | static inline void arch_reset(char mode, const char *cmd) | ||
| 20 | { | ||
| 21 | iomd_writeb(0, IOMD_ROMCR0); | ||
| 22 | |||
| 23 | /* | ||
| 24 | * Jump into the ROM | ||
| 25 | */ | ||
| 26 | soft_restart(0); | ||
| 27 | } | ||
diff --git a/arch/arm/mach-rpc/riscpc.c b/arch/arm/mach-rpc/riscpc.c index 8559598ab76..3d44a59fc0d 100644 --- a/arch/arm/mach-rpc/riscpc.c +++ b/arch/arm/mach-rpc/riscpc.c | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | #include <asm/elf.h> | 24 | #include <asm/elf.h> |
| 25 | #include <asm/mach-types.h> | 25 | #include <asm/mach-types.h> |
| 26 | #include <mach/hardware.h> | 26 | #include <mach/hardware.h> |
| 27 | #include <asm/hardware/iomd.h> | ||
| 27 | #include <asm/page.h> | 28 | #include <asm/page.h> |
| 28 | #include <asm/domain.h> | 29 | #include <asm/domain.h> |
| 29 | #include <asm/setup.h> | 30 | #include <asm/setup.h> |
| @@ -214,6 +215,16 @@ static int __init rpc_init(void) | |||
| 214 | 215 | ||
| 215 | arch_initcall(rpc_init); | 216 | arch_initcall(rpc_init); |
| 216 | 217 | ||
| 218 | static void rpc_restart(char mode, const char *cmd) | ||
| 219 | { | ||
| 220 | iomd_writeb(0, IOMD_ROMCR0); | ||
| 221 | |||
| 222 | /* | ||
| 223 | * Jump into the ROM | ||
| 224 | */ | ||
| 225 | soft_restart(0); | ||
| 226 | } | ||
| 227 | |||
| 217 | extern struct sys_timer ioc_timer; | 228 | extern struct sys_timer ioc_timer; |
| 218 | 229 | ||
| 219 | MACHINE_START(RISCPC, "Acorn-RiscPC") | 230 | MACHINE_START(RISCPC, "Acorn-RiscPC") |
| @@ -224,4 +235,5 @@ MACHINE_START(RISCPC, "Acorn-RiscPC") | |||
| 224 | .map_io = rpc_map_io, | 235 | .map_io = rpc_map_io, |
| 225 | .init_irq = rpc_init_irq, | 236 | .init_irq = rpc_init_irq, |
| 226 | .timer = &ioc_timer, | 237 | .timer = &ioc_timer, |
| 238 | .restart = rpc_restart, | ||
| 227 | MACHINE_END | 239 | MACHINE_END |
diff --git a/arch/arm/mach-s3c2410/common.h b/arch/arm/mach-s3c2410/common.h new file mode 100644 index 00000000000..f65dc806296 --- /dev/null +++ b/arch/arm/mach-s3c2410/common.h | |||
| @@ -0,0 +1,17 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (c) 2011 Samsung Electronics Co., Ltd. | ||
| 3 | * http://www.samsung.com | ||
| 4 | * | ||
| 5 | * Common Header for S3C2410 machines | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef __ARCH_ARM_MACH_S3C2410_COMMON_H | ||
| 13 | #define __ARCH_ARM_MACH_S3C2410_COMMON_H | ||
| 14 | |||
| 15 | void s3c2410_restart(char mode, const char *cmd); | ||
| 16 | |||
| 17 | #endif /* __ARCH_ARM_MACH_S3C2410_COMMON_H */ | ||
diff --git a/arch/arm/mach-s3c2410/include/mach/reset.h b/arch/arm/mach-s3c2410/include/mach/reset.h deleted file mode 100644 index f8c9387b049..00000000000 --- a/arch/arm/mach-s3c2410/include/mach/reset.h +++ /dev/null | |||
| @@ -1,22 +0,0 @@ | |||
| 1 | /* arch/arm/mach-s3c2410/include/mach/reset.h | ||
| 2 | * | ||
| 3 | * Copyright (c) 2007 Simtec Electronics | ||
| 4 | * Ben Dooks <ben@simtec.co.uk> | ||
| 5 | * http://armlinux.simtec.co.uk/ | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | * | ||
| 11 | * S3C2410 CPU reset controls | ||
| 12 | */ | ||
| 13 | |||
| 14 | #ifndef __ASM_ARCH_RESET_H | ||
| 15 | #define __ASM_ARCH_RESET_H __FILE__ | ||
| 16 | |||
| 17 | /* This allows the over-ride of the default reset code | ||
| 18 | */ | ||
| 19 | |||
| 20 | extern void (*s3c24xx_reset_hook)(void); | ||
| 21 | |||
| 22 | #endif /* __ASM_ARCH_RESET_H */ | ||
diff --git a/arch/arm/mach-s3c2410/include/mach/system-reset.h b/arch/arm/mach-s3c2410/include/mach/system-reset.h deleted file mode 100644 index 913893d4465..00000000000 --- a/arch/arm/mach-s3c2410/include/mach/system-reset.h +++ /dev/null | |||
| @@ -1,32 +0,0 @@ | |||
| 1 | /* arch/arm/mach-s3c2410/include/mach/system-reset.h | ||
| 2 | * | ||
| 3 | * Copyright (c) 2008 Simtec Electronics | ||
| 4 | * Ben Dooks <ben@simtec.co.uk> | ||
| 5 | * | ||
| 6 | * S3C2410 - System define for arch_reset() function | ||
| 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 version 2 as | ||
| 10 | * published by the Free Software Foundation. | ||
| 11 | */ | ||
| 12 | |||
| 13 | #include <mach/hardware.h> | ||
| 14 | #include <plat/watchdog-reset.h> | ||
| 15 | |||
| 16 | extern void (*s3c24xx_reset_hook)(void); | ||
| 17 | |||
| 18 | static void | ||
| 19 | arch_reset(char mode, const char *cmd) | ||
| 20 | { | ||
| 21 | if (mode == 's') { | ||
| 22 | soft_restart(0); | ||
| 23 | } | ||
| 24 | |||
| 25 | if (s3c24xx_reset_hook) | ||
| 26 | s3c24xx_reset_hook(); | ||
| 27 | |||
| 28 | arch_wdt_reset(); | ||
| 29 | |||
| 30 | /* we'll take a jump through zero as a poor second */ | ||
| 31 | soft_restart(0); | ||
| 32 | } | ||
diff --git a/arch/arm/mach-s3c2410/include/mach/system.h b/arch/arm/mach-s3c2410/include/mach/system.h index a8cbca6701e..5e215c1a5c8 100644 --- a/arch/arm/mach-s3c2410/include/mach/system.h +++ b/arch/arm/mach-s3c2410/include/mach/system.h | |||
| @@ -15,12 +15,10 @@ | |||
| 15 | 15 | ||
| 16 | #include <mach/map.h> | 16 | #include <mach/map.h> |
| 17 | #include <mach/idle.h> | 17 | #include <mach/idle.h> |
| 18 | #include <mach/reset.h> | ||
| 19 | 18 | ||
| 20 | #include <mach/regs-clock.h> | 19 | #include <mach/regs-clock.h> |
| 21 | 20 | ||
| 22 | void (*s3c24xx_idle)(void); | 21 | void (*s3c24xx_idle)(void); |
| 23 | void (*s3c24xx_reset_hook)(void); | ||
| 24 | 22 | ||
| 25 | void s3c24xx_default_idle(void) | 23 | void s3c24xx_default_idle(void) |
| 26 | { | 24 | { |
| @@ -54,5 +52,3 @@ static void arch_idle(void) | |||
| 54 | else | 52 | else |
| 55 | s3c24xx_default_idle(); | 53 | s3c24xx_default_idle(); |
| 56 | } | 54 | } |
| 57 | |||
| 58 | #include <mach/system-reset.h> | ||
diff --git a/arch/arm/mach-s3c2410/mach-amlm5900.c b/arch/arm/mach-s3c2410/mach-amlm5900.c index 79838942b0a..4220cc60de3 100644 --- a/arch/arm/mach-s3c2410/mach-amlm5900.c +++ b/arch/arm/mach-s3c2410/mach-amlm5900.c | |||
| @@ -63,6 +63,8 @@ | |||
| 63 | #include <linux/mtd/map.h> | 63 | #include <linux/mtd/map.h> |
| 64 | #include <linux/mtd/physmap.h> | 64 | #include <linux/mtd/physmap.h> |
| 65 | 65 | ||
| 66 | #include "common.h" | ||
| 67 | |||
| 66 | static struct resource amlm5900_nor_resource = { | 68 | static struct resource amlm5900_nor_resource = { |
| 67 | .start = 0x00000000, | 69 | .start = 0x00000000, |
| 68 | .end = 0x01000000 - 1, | 70 | .end = 0x01000000 - 1, |
| @@ -241,4 +243,5 @@ MACHINE_START(AML_M5900, "AML_M5900") | |||
| 241 | .init_irq = s3c24xx_init_irq, | 243 | .init_irq = s3c24xx_init_irq, |
| 242 | .init_machine = amlm5900_init, | 244 | .init_machine = amlm5900_init, |
| 243 | .timer = &s3c24xx_timer, | 245 | .timer = &s3c24xx_timer, |
| 246 | .restart = s3c2410_restart, | ||
| 244 | MACHINE_END | 247 | MACHINE_END |
diff --git a/arch/arm/mach-s3c2410/mach-bast.c b/arch/arm/mach-s3c2410/mach-bast.c index a20ae1ad406..c6133c6ec18 100644 --- a/arch/arm/mach-s3c2410/mach-bast.c +++ b/arch/arm/mach-s3c2410/mach-bast.c | |||
| @@ -66,6 +66,7 @@ | |||
| 66 | 66 | ||
| 67 | #include "usb-simtec.h" | 67 | #include "usb-simtec.h" |
| 68 | #include "nor-simtec.h" | 68 | #include "nor-simtec.h" |
| 69 | #include "common.h" | ||
| 69 | 70 | ||
| 70 | #define COPYRIGHT ", Copyright 2004-2008 Simtec Electronics" | 71 | #define COPYRIGHT ", Copyright 2004-2008 Simtec Electronics" |
| 71 | 72 | ||
| @@ -662,4 +663,5 @@ MACHINE_START(BAST, "Simtec-BAST") | |||
| 662 | .init_irq = s3c24xx_init_irq, | 663 | .init_irq = s3c24xx_init_irq, |
| 663 | .init_machine = bast_init, | 664 | .init_machine = bast_init, |
| 664 | .timer = &s3c24xx_timer, | 665 | .timer = &s3c24xx_timer, |
| 666 | .restart = s3c2410_restart, | ||
| 665 | MACHINE_END | 667 | MACHINE_END |
diff --git a/arch/arm/mach-s3c2410/mach-h1940.c b/arch/arm/mach-s3c2410/mach-h1940.c index 05a7d16e59f..ad9d865651d 100644 --- a/arch/arm/mach-s3c2410/mach-h1940.c +++ b/arch/arm/mach-s3c2410/mach-h1940.c | |||
| @@ -70,6 +70,8 @@ | |||
| 70 | 70 | ||
| 71 | #include <sound/uda1380.h> | 71 | #include <sound/uda1380.h> |
| 72 | 72 | ||
| 73 | #include "common.h" | ||
| 74 | |||
| 73 | #define H1940_LATCH ((void __force __iomem *)0xF8000000) | 75 | #define H1940_LATCH ((void __force __iomem *)0xF8000000) |
| 74 | 76 | ||
| 75 | #define H1940_PA_LATCH S3C2410_CS2 | 77 | #define H1940_PA_LATCH S3C2410_CS2 |
| @@ -751,4 +753,5 @@ MACHINE_START(H1940, "IPAQ-H1940") | |||
| 751 | .init_irq = h1940_init_irq, | 753 | .init_irq = h1940_init_irq, |
| 752 | .init_machine = h1940_init, | 754 | .init_machine = h1940_init, |
| 753 | .timer = &s3c24xx_timer, | 755 | .timer = &s3c24xx_timer, |
| 756 | .restart = s3c2410_restart, | ||
| 754 | MACHINE_END | 757 | MACHINE_END |
diff --git a/arch/arm/mach-s3c2410/mach-n30.c b/arch/arm/mach-s3c2410/mach-n30.c index 1dc3e323441..383d00ca8f6 100644 --- a/arch/arm/mach-s3c2410/mach-n30.c +++ b/arch/arm/mach-s3c2410/mach-n30.c | |||
| @@ -51,6 +51,8 @@ | |||
| 51 | #include <plat/s3c2410.h> | 51 | #include <plat/s3c2410.h> |
| 52 | #include <plat/udc.h> | 52 | #include <plat/udc.h> |
| 53 | 53 | ||
| 54 | #include "common.h" | ||
| 55 | |||
| 54 | static struct map_desc n30_iodesc[] __initdata = { | 56 | static struct map_desc n30_iodesc[] __initdata = { |
| 55 | /* nothing here yet */ | 57 | /* nothing here yet */ |
| 56 | }; | 58 | }; |
| @@ -591,6 +593,7 @@ MACHINE_START(N30, "Acer-N30") | |||
| 591 | .init_machine = n30_init, | 593 | .init_machine = n30_init, |
| 592 | .init_irq = s3c24xx_init_irq, | 594 | .init_irq = s3c24xx_init_irq, |
| 593 | .map_io = n30_map_io, | 595 | .map_io = n30_map_io, |
| 596 | .restart = s3c2410_restart, | ||
| 594 | MACHINE_END | 597 | MACHINE_END |
| 595 | 598 | ||
| 596 | MACHINE_START(N35, "Acer-N35") | 599 | MACHINE_START(N35, "Acer-N35") |
| @@ -601,4 +604,5 @@ MACHINE_START(N35, "Acer-N35") | |||
| 601 | .init_machine = n30_init, | 604 | .init_machine = n30_init, |
| 602 | .init_irq = s3c24xx_init_irq, | 605 | .init_irq = s3c24xx_init_irq, |
| 603 | .map_io = n30_map_io, | 606 | .map_io = n30_map_io, |
| 607 | .restart = s3c2410_restart, | ||
| 604 | MACHINE_END | 608 | MACHINE_END |
diff --git a/arch/arm/mach-s3c2410/mach-otom.c b/arch/arm/mach-s3c2410/mach-otom.c index f03f3fd9cec..5f1e0eeb38a 100644 --- a/arch/arm/mach-s3c2410/mach-otom.c +++ b/arch/arm/mach-s3c2410/mach-otom.c | |||
| @@ -38,6 +38,8 @@ | |||
| 38 | #include <plat/iic.h> | 38 | #include <plat/iic.h> |
| 39 | #include <plat/cpu.h> | 39 | #include <plat/cpu.h> |
| 40 | 40 | ||
| 41 | #include "common.h" | ||
| 42 | |||
| 41 | static struct map_desc otom11_iodesc[] __initdata = { | 43 | static struct map_desc otom11_iodesc[] __initdata = { |
| 42 | /* Device area */ | 44 | /* Device area */ |
| 43 | { (u32)OTOM_VA_CS8900A_BASE, OTOM_PA_CS8900A_BASE, SZ_16M, MT_DEVICE }, | 45 | { (u32)OTOM_VA_CS8900A_BASE, OTOM_PA_CS8900A_BASE, SZ_16M, MT_DEVICE }, |
| @@ -121,4 +123,5 @@ MACHINE_START(OTOM, "Nex Vision - Otom 1.1") | |||
| 121 | .init_machine = otom11_init, | 123 | .init_machine = otom11_init, |
| 122 | .init_irq = s3c24xx_init_irq, | 124 | .init_irq = s3c24xx_init_irq, |
| 123 | .timer = &s3c24xx_timer, | 125 | .timer = &s3c24xx_timer, |
| 126 | .restart = s3c2410_restart, | ||
| 124 | MACHINE_END | 127 | MACHINE_END |
diff --git a/arch/arm/mach-s3c2410/mach-qt2410.c b/arch/arm/mach-s3c2410/mach-qt2410.c index 45185215625..58f2c17b9f0 100644 --- a/arch/arm/mach-s3c2410/mach-qt2410.c +++ b/arch/arm/mach-s3c2410/mach-qt2410.c | |||
| @@ -62,6 +62,8 @@ | |||
| 62 | #include <plat/cpu.h> | 62 | #include <plat/cpu.h> |
| 63 | #include <plat/pm.h> | 63 | #include <plat/pm.h> |
| 64 | 64 | ||
| 65 | #include "common.h" | ||
| 66 | |||
| 65 | static struct map_desc qt2410_iodesc[] __initdata = { | 67 | static struct map_desc qt2410_iodesc[] __initdata = { |
| 66 | { 0xe0000000, __phys_to_pfn(S3C2410_CS3+0x01000000), SZ_1M, MT_DEVICE } | 68 | { 0xe0000000, __phys_to_pfn(S3C2410_CS3+0x01000000), SZ_1M, MT_DEVICE } |
| 67 | }; | 69 | }; |
| @@ -350,6 +352,5 @@ MACHINE_START(QT2410, "QT2410") | |||
| 350 | .init_irq = s3c24xx_init_irq, | 352 | .init_irq = s3c24xx_init_irq, |
| 351 | .init_machine = qt2410_machine_init, | 353 | .init_machine = qt2410_machine_init, |
| 352 | .timer = &s3c24xx_timer, | 354 | .timer = &s3c24xx_timer, |
| 355 | .restart = s3c2410_restart, | ||
| 353 | MACHINE_END | 356 | MACHINE_END |
| 354 | |||
| 355 | |||
diff --git a/arch/arm/mach-s3c2410/mach-smdk2410.c b/arch/arm/mach-s3c2410/mach-smdk2410.c index 99c9dfdb71c..bdc27e77287 100644 --- a/arch/arm/mach-s3c2410/mach-smdk2410.c +++ b/arch/arm/mach-s3c2410/mach-smdk2410.c | |||
| @@ -54,6 +54,8 @@ | |||
| 54 | 54 | ||
| 55 | #include <plat/common-smdk.h> | 55 | #include <plat/common-smdk.h> |
| 56 | 56 | ||
| 57 | #include "common.h" | ||
| 58 | |||
| 57 | static struct map_desc smdk2410_iodesc[] __initdata = { | 59 | static struct map_desc smdk2410_iodesc[] __initdata = { |
| 58 | /* nothing here yet */ | 60 | /* nothing here yet */ |
| 59 | }; | 61 | }; |
| @@ -116,6 +118,5 @@ MACHINE_START(SMDK2410, "SMDK2410") /* @TODO: request a new identifier and switc | |||
| 116 | .init_irq = s3c24xx_init_irq, | 118 | .init_irq = s3c24xx_init_irq, |
| 117 | .init_machine = smdk2410_init, | 119 | .init_machine = smdk2410_init, |
| 118 | .timer = &s3c24xx_timer, | 120 | .timer = &s3c24xx_timer, |
| 121 | .restart = s3c2410_restart, | ||
| 119 | MACHINE_END | 122 | MACHINE_END |
| 120 | |||
| 121 | |||
diff --git a/arch/arm/mach-s3c2410/mach-tct_hammer.c b/arch/arm/mach-s3c2410/mach-tct_hammer.c index e0d0b6fb280..1114666f0ef 100644 --- a/arch/arm/mach-s3c2410/mach-tct_hammer.c +++ b/arch/arm/mach-s3c2410/mach-tct_hammer.c | |||
| @@ -54,6 +54,8 @@ | |||
| 54 | #include <linux/mtd/map.h> | 54 | #include <linux/mtd/map.h> |
| 55 | #include <linux/mtd/physmap.h> | 55 | #include <linux/mtd/physmap.h> |
| 56 | 56 | ||
| 57 | #include "common.h" | ||
| 58 | |||
| 57 | static struct resource tct_hammer_nor_resource = { | 59 | static struct resource tct_hammer_nor_resource = { |
| 58 | .start = 0x00000000, | 60 | .start = 0x00000000, |
| 59 | .end = 0x01000000 - 1, | 61 | .end = 0x01000000 - 1, |
| @@ -151,4 +153,5 @@ MACHINE_START(TCT_HAMMER, "TCT_HAMMER") | |||
| 151 | .init_irq = s3c24xx_init_irq, | 153 | .init_irq = s3c24xx_init_irq, |
| 152 | .init_machine = tct_hammer_init, | 154 | .init_machine = tct_hammer_init, |
| 153 | .timer = &s3c24xx_timer, | 155 | .timer = &s3c24xx_timer, |
| 156 | .restart = s3c2410_restart, | ||
| 154 | MACHINE_END | 157 | MACHINE_END |
diff --git a/arch/arm/mach-s3c2410/mach-vr1000.c b/arch/arm/mach-s3c2410/mach-vr1000.c index df47e8e9006..cc7032b5c65 100644 --- a/arch/arm/mach-s3c2410/mach-vr1000.c +++ b/arch/arm/mach-s3c2410/mach-vr1000.c | |||
| @@ -53,6 +53,7 @@ | |||
| 53 | 53 | ||
| 54 | #include "usb-simtec.h" | 54 | #include "usb-simtec.h" |
| 55 | #include "nor-simtec.h" | 55 | #include "nor-simtec.h" |
| 56 | #include "common.h" | ||
| 56 | 57 | ||
| 57 | /* macros for virtual address mods for the io space entries */ | 58 | /* macros for virtual address mods for the io space entries */ |
| 58 | #define VA_C5(item) ((unsigned long)(item) + BAST_VAM_CS5) | 59 | #define VA_C5(item) ((unsigned long)(item) + BAST_VAM_CS5) |
| @@ -405,4 +406,5 @@ MACHINE_START(VR1000, "Thorcom-VR1000") | |||
| 405 | .init_machine = vr1000_init, | 406 | .init_machine = vr1000_init, |
| 406 | .init_irq = s3c24xx_init_irq, | 407 | .init_irq = s3c24xx_init_irq, |
| 407 | .timer = &s3c24xx_timer, | 408 | .timer = &s3c24xx_timer, |
| 409 | .restart = s3c2410_restart, | ||
| 408 | MACHINE_END | 410 | MACHINE_END |
diff --git a/arch/arm/mach-s3c2410/s3c2410.c b/arch/arm/mach-s3c2410/s3c2410.c index 3d7ebc557a7..489c826e92a 100644 --- a/arch/arm/mach-s3c2410/s3c2410.c +++ b/arch/arm/mach-s3c2410/s3c2410.c | |||
| @@ -42,6 +42,7 @@ | |||
| 42 | #include <plat/clock.h> | 42 | #include <plat/clock.h> |
| 43 | #include <plat/pll.h> | 43 | #include <plat/pll.h> |
| 44 | #include <plat/pm.h> | 44 | #include <plat/pm.h> |
| 45 | #include <plat/watchdog-reset.h> | ||
| 45 | 46 | ||
| 46 | #include <plat/gpio-core.h> | 47 | #include <plat/gpio-core.h> |
| 47 | #include <plat/gpio-cfg.h> | 48 | #include <plat/gpio-cfg.h> |
| @@ -183,3 +184,15 @@ int __init s3c2410a_init(void) | |||
| 183 | s3c2410_sysdev.cls = &s3c2410a_sysclass; | 184 | s3c2410_sysdev.cls = &s3c2410a_sysclass; |
| 184 | return s3c2410_init(); | 185 | return s3c2410_init(); |
| 185 | } | 186 | } |
| 187 | |||
| 188 | void s3c2410_restart(char mode, const char *cmd) | ||
| 189 | { | ||
| 190 | if (mode == 's') { | ||
| 191 | soft_restart(0); | ||
| 192 | } | ||
| 193 | |||
| 194 | arch_wdt_reset(); | ||
| 195 | |||
| 196 | /* we'll take a jump through zero as a poor second */ | ||
| 197 | soft_restart(0); | ||
| 198 | } | ||
diff --git a/arch/arm/mach-s3c2412/mach-jive.c b/arch/arm/mach-s3c2412/mach-jive.c index 286ef1738c6..ae73ba34ecc 100644 --- a/arch/arm/mach-s3c2412/mach-jive.c +++ b/arch/arm/mach-s3c2412/mach-jive.c | |||
| @@ -48,6 +48,7 @@ | |||
| 48 | #include <linux/mtd/nand_ecc.h> | 48 | #include <linux/mtd/nand_ecc.h> |
| 49 | #include <linux/mtd/partitions.h> | 49 | #include <linux/mtd/partitions.h> |
| 50 | 50 | ||
| 51 | #include <plat/s3c2412.h> | ||
| 51 | #include <plat/gpio-cfg.h> | 52 | #include <plat/gpio-cfg.h> |
| 52 | #include <plat/clock.h> | 53 | #include <plat/clock.h> |
| 53 | #include <plat/devs.h> | 54 | #include <plat/devs.h> |
| @@ -661,4 +662,5 @@ MACHINE_START(JIVE, "JIVE") | |||
| 661 | .map_io = jive_map_io, | 662 | .map_io = jive_map_io, |
| 662 | .init_machine = jive_machine_init, | 663 | .init_machine = jive_machine_init, |
| 663 | .timer = &s3c24xx_timer, | 664 | .timer = &s3c24xx_timer, |
| 665 | .restart = s3c2412_restart, | ||
| 664 | MACHINE_END | 666 | MACHINE_END |
diff --git a/arch/arm/mach-s3c2412/mach-smdk2413.c b/arch/arm/mach-s3c2412/mach-smdk2413.c index f1eec1b5493..b11451b853d 100644 --- a/arch/arm/mach-s3c2412/mach-smdk2413.c +++ b/arch/arm/mach-s3c2412/mach-smdk2413.c | |||
| @@ -134,6 +134,7 @@ MACHINE_START(S3C2413, "S3C2413") | |||
| 134 | .map_io = smdk2413_map_io, | 134 | .map_io = smdk2413_map_io, |
| 135 | .init_machine = smdk2413_machine_init, | 135 | .init_machine = smdk2413_machine_init, |
| 136 | .timer = &s3c24xx_timer, | 136 | .timer = &s3c24xx_timer, |
| 137 | .restart = s3c2412_restart, | ||
| 137 | MACHINE_END | 138 | MACHINE_END |
| 138 | 139 | ||
| 139 | MACHINE_START(SMDK2412, "SMDK2412") | 140 | MACHINE_START(SMDK2412, "SMDK2412") |
| @@ -145,6 +146,7 @@ MACHINE_START(SMDK2412, "SMDK2412") | |||
| 145 | .map_io = smdk2413_map_io, | 146 | .map_io = smdk2413_map_io, |
| 146 | .init_machine = smdk2413_machine_init, | 147 | .init_machine = smdk2413_machine_init, |
| 147 | .timer = &s3c24xx_timer, | 148 | .timer = &s3c24xx_timer, |
| 149 | .restart = s3c2412_restart, | ||
| 148 | MACHINE_END | 150 | MACHINE_END |
| 149 | 151 | ||
| 150 | MACHINE_START(SMDK2413, "SMDK2413") | 152 | MACHINE_START(SMDK2413, "SMDK2413") |
| @@ -156,4 +158,5 @@ MACHINE_START(SMDK2413, "SMDK2413") | |||
| 156 | .map_io = smdk2413_map_io, | 158 | .map_io = smdk2413_map_io, |
| 157 | .init_machine = smdk2413_machine_init, | 159 | .init_machine = smdk2413_machine_init, |
| 158 | .timer = &s3c24xx_timer, | 160 | .timer = &s3c24xx_timer, |
| 161 | .restart = s3c2412_restart, | ||
| 159 | MACHINE_END | 162 | MACHINE_END |
diff --git a/arch/arm/mach-s3c2412/mach-vstms.c b/arch/arm/mach-s3c2412/mach-vstms.c index 1bbb1ef5f4f..94bfaa1fb14 100644 --- a/arch/arm/mach-s3c2412/mach-vstms.c +++ b/arch/arm/mach-s3c2412/mach-vstms.c | |||
| @@ -162,4 +162,5 @@ MACHINE_START(VSTMS, "VSTMS") | |||
| 162 | .init_machine = vstms_init, | 162 | .init_machine = vstms_init, |
| 163 | .map_io = vstms_map_io, | 163 | .map_io = vstms_map_io, |
| 164 | .timer = &s3c24xx_timer, | 164 | .timer = &s3c24xx_timer, |
| 165 | .restart = s3c2412_restart, | ||
| 165 | MACHINE_END | 166 | MACHINE_END |
diff --git a/arch/arm/mach-s3c2412/s3c2412.c b/arch/arm/mach-s3c2412/s3c2412.c index 57a1e01e4e5..867ce2e269f 100644 --- a/arch/arm/mach-s3c2412/s3c2412.c +++ b/arch/arm/mach-s3c2412/s3c2412.c | |||
| @@ -32,7 +32,6 @@ | |||
| 32 | #include <asm/proc-fns.h> | 32 | #include <asm/proc-fns.h> |
| 33 | #include <asm/irq.h> | 33 | #include <asm/irq.h> |
| 34 | 34 | ||
| 35 | #include <mach/reset.h> | ||
| 36 | #include <mach/idle.h> | 35 | #include <mach/idle.h> |
| 37 | 36 | ||
| 38 | #include <plat/cpu-freq.h> | 37 | #include <plat/cpu-freq.h> |
| @@ -131,8 +130,11 @@ static void s3c2412_idle(void) | |||
| 131 | cpu_do_idle(); | 130 | cpu_do_idle(); |
| 132 | } | 131 | } |
| 133 | 132 | ||
| 134 | static void s3c2412_hard_reset(void) | 133 | void s3c2412_restart(char mode, const char *cmd) |
| 135 | { | 134 | { |
| 135 | if (mode == 's') | ||
| 136 | soft_restart(0); | ||
| 137 | |||
| 136 | /* errata "Watch-dog/Software Reset Problem" specifies that | 138 | /* errata "Watch-dog/Software Reset Problem" specifies that |
| 137 | * this reset must be done with the SYSCLK sourced from | 139 | * this reset must be done with the SYSCLK sourced from |
| 138 | * EXTCLK instead of FOUT to avoid a glitch in the reset | 140 | * EXTCLK instead of FOUT to avoid a glitch in the reset |
| @@ -164,10 +166,6 @@ void __init s3c2412_map_io(void) | |||
| 164 | 166 | ||
| 165 | s3c24xx_idle = s3c2412_idle; | 167 | s3c24xx_idle = s3c2412_idle; |
| 166 | 168 | ||
| 167 | /* set custom reset hook */ | ||
| 168 | |||
| 169 | s3c24xx_reset_hook = s3c2412_hard_reset; | ||
| 170 | |||
| 171 | /* register our io-tables */ | 169 | /* register our io-tables */ |
| 172 | 170 | ||
| 173 | iotable_init(s3c2412_iodesc, ARRAY_SIZE(s3c2412_iodesc)); | 171 | iotable_init(s3c2412_iodesc, ARRAY_SIZE(s3c2412_iodesc)); |
diff --git a/arch/arm/mach-s3c2416/mach-smdk2416.c b/arch/arm/mach-s3c2416/mach-smdk2416.c index a9eee531ca7..66b71736609 100644 --- a/arch/arm/mach-s3c2416/mach-smdk2416.c +++ b/arch/arm/mach-s3c2416/mach-smdk2416.c | |||
| @@ -251,4 +251,5 @@ MACHINE_START(SMDK2416, "SMDK2416") | |||
| 251 | .map_io = smdk2416_map_io, | 251 | .map_io = smdk2416_map_io, |
| 252 | .init_machine = smdk2416_machine_init, | 252 | .init_machine = smdk2416_machine_init, |
| 253 | .timer = &s3c24xx_timer, | 253 | .timer = &s3c24xx_timer, |
| 254 | .restart = s3c2416_restart, | ||
| 254 | MACHINE_END | 255 | MACHINE_END |
diff --git a/arch/arm/mach-s3c2416/s3c2416.c b/arch/arm/mach-s3c2416/s3c2416.c index ee214bc83c8..46062232bbc 100644 --- a/arch/arm/mach-s3c2416/s3c2416.c +++ b/arch/arm/mach-s3c2416/s3c2416.c | |||
| @@ -44,7 +44,6 @@ | |||
| 44 | #include <asm/proc-fns.h> | 44 | #include <asm/proc-fns.h> |
| 45 | #include <asm/irq.h> | 45 | #include <asm/irq.h> |
| 46 | 46 | ||
| 47 | #include <mach/reset.h> | ||
| 48 | #include <mach/idle.h> | 47 | #include <mach/idle.h> |
| 49 | #include <mach/regs-s3c2443-clock.h> | 48 | #include <mach/regs-s3c2443-clock.h> |
| 50 | 49 | ||
| @@ -76,8 +75,11 @@ static struct sys_device s3c2416_sysdev = { | |||
| 76 | .cls = &s3c2416_sysclass, | 75 | .cls = &s3c2416_sysclass, |
| 77 | }; | 76 | }; |
| 78 | 77 | ||
| 79 | static void s3c2416_hard_reset(void) | 78 | void s3c2416_restart(char mode, const char *cmd) |
| 80 | { | 79 | { |
| 80 | if (mode == 's') | ||
| 81 | soft_restart(0); | ||
| 82 | |||
| 81 | __raw_writel(S3C2443_SWRST_RESET, S3C2443_SWRST); | 83 | __raw_writel(S3C2443_SWRST_RESET, S3C2443_SWRST); |
| 82 | } | 84 | } |
| 83 | 85 | ||
| @@ -85,7 +87,6 @@ int __init s3c2416_init(void) | |||
| 85 | { | 87 | { |
| 86 | printk(KERN_INFO "S3C2416: Initializing architecture\n"); | 88 | printk(KERN_INFO "S3C2416: Initializing architecture\n"); |
| 87 | 89 | ||
| 88 | s3c24xx_reset_hook = s3c2416_hard_reset; | ||
| 89 | /* s3c24xx_idle = s3c2416_idle; */ | 90 | /* s3c24xx_idle = s3c2416_idle; */ |
| 90 | 91 | ||
| 91 | /* change WDT IRQ number */ | 92 | /* change WDT IRQ number */ |
diff --git a/arch/arm/mach-s3c2440/common.h b/arch/arm/mach-s3c2440/common.h new file mode 100644 index 00000000000..db8a98ac68c --- /dev/null +++ b/arch/arm/mach-s3c2440/common.h | |||
| @@ -0,0 +1,17 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (c) 2011 Samsung Electronics Co., Ltd. | ||
| 3 | * http://www.samsung.com | ||
| 4 | * | ||
| 5 | * Common Header for S3C2440 machines | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef __ARCH_ARM_MACH_S3C2440_COMMON_H | ||
| 13 | #define __ARCH_ARM_MACH_S3C2440_COMMON_H | ||
| 14 | |||
| 15 | void s3c2440_restart(char mode, const char *cmd); | ||
| 16 | |||
| 17 | #endif /* __ARCH_ARM_MACH_S3C2440_COMMON_H */ | ||
diff --git a/arch/arm/mach-s3c2440/mach-anubis.c b/arch/arm/mach-s3c2440/mach-anubis.c index 74f92fc3fd0..121ff8d2c88 100644 --- a/arch/arm/mach-s3c2440/mach-anubis.c +++ b/arch/arm/mach-s3c2440/mach-anubis.c | |||
| @@ -55,6 +55,8 @@ | |||
| 55 | #include <plat/cpu.h> | 55 | #include <plat/cpu.h> |
| 56 | #include <plat/audio-simtec.h> | 56 | #include <plat/audio-simtec.h> |
| 57 | 57 | ||
| 58 | #include "common.h" | ||
| 59 | |||
| 58 | #define COPYRIGHT ", Copyright 2005-2009 Simtec Electronics" | 60 | #define COPYRIGHT ", Copyright 2005-2009 Simtec Electronics" |
| 59 | 61 | ||
| 60 | static struct map_desc anubis_iodesc[] __initdata = { | 62 | static struct map_desc anubis_iodesc[] __initdata = { |
| @@ -503,4 +505,5 @@ MACHINE_START(ANUBIS, "Simtec-Anubis") | |||
| 503 | .init_machine = anubis_init, | 505 | .init_machine = anubis_init, |
| 504 | .init_irq = s3c24xx_init_irq, | 506 | .init_irq = s3c24xx_init_irq, |
| 505 | .timer = &s3c24xx_timer, | 507 | .timer = &s3c24xx_timer, |
| 508 | .restart = s3c2440_restart, | ||
| 506 | MACHINE_END | 509 | MACHINE_END |
diff --git a/arch/arm/mach-s3c2440/mach-at2440evb.c b/arch/arm/mach-s3c2440/mach-at2440evb.c index 38887ee0c78..b7e334f07da 100644 --- a/arch/arm/mach-s3c2440/mach-at2440evb.c +++ b/arch/arm/mach-s3c2440/mach-at2440evb.c | |||
| @@ -49,6 +49,8 @@ | |||
| 49 | #include <plat/cpu.h> | 49 | #include <plat/cpu.h> |
| 50 | #include <plat/mci.h> | 50 | #include <plat/mci.h> |
| 51 | 51 | ||
| 52 | #include "common.h" | ||
| 53 | |||
| 52 | static struct map_desc at2440evb_iodesc[] __initdata = { | 54 | static struct map_desc at2440evb_iodesc[] __initdata = { |
| 53 | /* Nothing here */ | 55 | /* Nothing here */ |
| 54 | }; | 56 | }; |
| @@ -238,4 +240,5 @@ MACHINE_START(AT2440EVB, "AT2440EVB") | |||
| 238 | .init_machine = at2440evb_init, | 240 | .init_machine = at2440evb_init, |
| 239 | .init_irq = s3c24xx_init_irq, | 241 | .init_irq = s3c24xx_init_irq, |
| 240 | .timer = &s3c24xx_timer, | 242 | .timer = &s3c24xx_timer, |
| 243 | .restart = s3c2440_restart, | ||
| 241 | MACHINE_END | 244 | MACHINE_END |
diff --git a/arch/arm/mach-s3c2440/mach-gta02.c b/arch/arm/mach-s3c2440/mach-gta02.c index de1e0ff46ce..5859e609d28 100644 --- a/arch/arm/mach-s3c2440/mach-gta02.c +++ b/arch/arm/mach-s3c2440/mach-gta02.c | |||
| @@ -90,6 +90,7 @@ | |||
| 90 | #include <plat/iic.h> | 90 | #include <plat/iic.h> |
| 91 | #include <plat/ts.h> | 91 | #include <plat/ts.h> |
| 92 | 92 | ||
| 93 | #include "common.h" | ||
| 93 | 94 | ||
| 94 | static struct pcf50633 *gta02_pcf; | 95 | static struct pcf50633 *gta02_pcf; |
| 95 | 96 | ||
| @@ -600,4 +601,5 @@ MACHINE_START(NEO1973_GTA02, "GTA02") | |||
| 600 | .init_irq = s3c24xx_init_irq, | 601 | .init_irq = s3c24xx_init_irq, |
| 601 | .init_machine = gta02_machine_init, | 602 | .init_machine = gta02_machine_init, |
| 602 | .timer = &s3c24xx_timer, | 603 | .timer = &s3c24xx_timer, |
| 604 | .restart = s3c2440_restart, | ||
| 603 | MACHINE_END | 605 | MACHINE_END |
diff --git a/arch/arm/mach-s3c2440/mach-mini2440.c b/arch/arm/mach-s3c2440/mach-mini2440.c index 91fe0b4c95f..437322ffd88 100644 --- a/arch/arm/mach-s3c2440/mach-mini2440.c +++ b/arch/arm/mach-s3c2440/mach-mini2440.c | |||
| @@ -60,6 +60,8 @@ | |||
| 60 | 60 | ||
| 61 | #include <sound/s3c24xx_uda134x.h> | 61 | #include <sound/s3c24xx_uda134x.h> |
| 62 | 62 | ||
| 63 | #include "common.h" | ||
| 64 | |||
| 63 | #define MACH_MINI2440_DM9K_BASE (S3C2410_CS4 + 0x300) | 65 | #define MACH_MINI2440_DM9K_BASE (S3C2410_CS4 + 0x300) |
| 64 | 66 | ||
| 65 | static struct map_desc mini2440_iodesc[] __initdata = { | 67 | static struct map_desc mini2440_iodesc[] __initdata = { |
| @@ -681,4 +683,5 @@ MACHINE_START(MINI2440, "MINI2440") | |||
| 681 | .init_machine = mini2440_init, | 683 | .init_machine = mini2440_init, |
| 682 | .init_irq = s3c24xx_init_irq, | 684 | .init_irq = s3c24xx_init_irq, |
| 683 | .timer = &s3c24xx_timer, | 685 | .timer = &s3c24xx_timer, |
| 686 | .restart = s3c2440_restart, | ||
| 684 | MACHINE_END | 687 | MACHINE_END |
diff --git a/arch/arm/mach-s3c2440/mach-nexcoder.c b/arch/arm/mach-s3c2440/mach-nexcoder.c index 61c0bf14816..40eaf844bc1 100644 --- a/arch/arm/mach-s3c2440/mach-nexcoder.c +++ b/arch/arm/mach-s3c2440/mach-nexcoder.c | |||
| @@ -47,6 +47,8 @@ | |||
| 47 | #include <plat/devs.h> | 47 | #include <plat/devs.h> |
| 48 | #include <plat/cpu.h> | 48 | #include <plat/cpu.h> |
| 49 | 49 | ||
| 50 | #include "common.h" | ||
| 51 | |||
| 50 | static struct map_desc nexcoder_iodesc[] __initdata = { | 52 | static struct map_desc nexcoder_iodesc[] __initdata = { |
| 51 | /* nothing here yet */ | 53 | /* nothing here yet */ |
| 52 | }; | 54 | }; |
| @@ -156,4 +158,5 @@ MACHINE_START(NEXCODER_2440, "NexVision - Nexcoder 2440") | |||
| 156 | .init_machine = nexcoder_init, | 158 | .init_machine = nexcoder_init, |
| 157 | .init_irq = s3c24xx_init_irq, | 159 | .init_irq = s3c24xx_init_irq, |
| 158 | .timer = &s3c24xx_timer, | 160 | .timer = &s3c24xx_timer, |
| 161 | .restart = s3c2440_restart, | ||
| 159 | MACHINE_END | 162 | MACHINE_END |
diff --git a/arch/arm/mach-s3c2440/mach-osiris.c b/arch/arm/mach-s3c2440/mach-osiris.c index dc142ebf8cb..e795715fba3 100644 --- a/arch/arm/mach-s3c2440/mach-osiris.c +++ b/arch/arm/mach-s3c2440/mach-osiris.c | |||
| @@ -54,6 +54,8 @@ | |||
| 54 | #include <plat/devs.h> | 54 | #include <plat/devs.h> |
| 55 | #include <plat/cpu.h> | 55 | #include <plat/cpu.h> |
| 56 | 56 | ||
| 57 | #include "common.h" | ||
| 58 | |||
| 57 | /* onboard perihperal map */ | 59 | /* onboard perihperal map */ |
| 58 | 60 | ||
| 59 | static struct map_desc osiris_iodesc[] __initdata = { | 61 | static struct map_desc osiris_iodesc[] __initdata = { |
| @@ -452,4 +454,5 @@ MACHINE_START(OSIRIS, "Simtec-OSIRIS") | |||
| 452 | .init_irq = s3c24xx_init_irq, | 454 | .init_irq = s3c24xx_init_irq, |
| 453 | .init_machine = osiris_init, | 455 | .init_machine = osiris_init, |
| 454 | .timer = &s3c24xx_timer, | 456 | .timer = &s3c24xx_timer, |
| 457 | .restart = s3c2440_restart, | ||
| 455 | MACHINE_END | 458 | MACHINE_END |
diff --git a/arch/arm/mach-s3c2440/mach-rx1950.c b/arch/arm/mach-s3c2440/mach-rx1950.c index 0d3453bf567..1c50d3e0917 100644 --- a/arch/arm/mach-s3c2440/mach-rx1950.c +++ b/arch/arm/mach-s3c2440/mach-rx1950.c | |||
| @@ -62,6 +62,8 @@ | |||
| 62 | 62 | ||
| 63 | #include <sound/uda1380.h> | 63 | #include <sound/uda1380.h> |
| 64 | 64 | ||
| 65 | #include "common.h" | ||
| 66 | |||
| 65 | #define LCD_PWM_PERIOD 192960 | 67 | #define LCD_PWM_PERIOD 192960 |
| 66 | #define LCD_PWM_DUTY 127353 | 68 | #define LCD_PWM_DUTY 127353 |
| 67 | 69 | ||
| @@ -832,4 +834,5 @@ MACHINE_START(RX1950, "HP iPAQ RX1950") | |||
| 832 | .init_irq = s3c24xx_init_irq, | 834 | .init_irq = s3c24xx_init_irq, |
| 833 | .init_machine = rx1950_init_machine, | 835 | .init_machine = rx1950_init_machine, |
| 834 | .timer = &s3c24xx_timer, | 836 | .timer = &s3c24xx_timer, |
| 837 | .restart = s3c2440_restart, | ||
| 835 | MACHINE_END | 838 | MACHINE_END |
diff --git a/arch/arm/mach-s3c2440/mach-rx3715.c b/arch/arm/mach-s3c2440/mach-rx3715.c index e19499c2f90..4d20a016b85 100644 --- a/arch/arm/mach-s3c2440/mach-rx3715.c +++ b/arch/arm/mach-s3c2440/mach-rx3715.c | |||
| @@ -51,6 +51,8 @@ | |||
| 51 | #include <plat/cpu.h> | 51 | #include <plat/cpu.h> |
| 52 | #include <plat/pm.h> | 52 | #include <plat/pm.h> |
| 53 | 53 | ||
| 54 | #include "common.h" | ||
| 55 | |||
| 54 | static struct map_desc rx3715_iodesc[] __initdata = { | 56 | static struct map_desc rx3715_iodesc[] __initdata = { |
| 55 | /* dump ISA space somewhere unused */ | 57 | /* dump ISA space somewhere unused */ |
| 56 | 58 | ||
| @@ -224,4 +226,5 @@ MACHINE_START(RX3715, "IPAQ-RX3715") | |||
| 224 | .init_irq = rx3715_init_irq, | 226 | .init_irq = rx3715_init_irq, |
| 225 | .init_machine = rx3715_init_machine, | 227 | .init_machine = rx3715_init_machine, |
| 226 | .timer = &s3c24xx_timer, | 228 | .timer = &s3c24xx_timer, |
| 229 | .restart = s3c2440_restart, | ||
| 227 | MACHINE_END | 230 | MACHINE_END |
diff --git a/arch/arm/mach-s3c2440/mach-smdk2440.c b/arch/arm/mach-s3c2440/mach-smdk2440.c index 36eeb4197a8..1deb60d12a6 100644 --- a/arch/arm/mach-s3c2440/mach-smdk2440.c +++ b/arch/arm/mach-s3c2440/mach-smdk2440.c | |||
| @@ -47,6 +47,8 @@ | |||
| 47 | 47 | ||
| 48 | #include <plat/common-smdk.h> | 48 | #include <plat/common-smdk.h> |
| 49 | 49 | ||
| 50 | #include "common.h" | ||
| 51 | |||
| 50 | static struct map_desc smdk2440_iodesc[] __initdata = { | 52 | static struct map_desc smdk2440_iodesc[] __initdata = { |
| 51 | /* ISA IO Space map (memory space selected by A24) */ | 53 | /* ISA IO Space map (memory space selected by A24) */ |
| 52 | 54 | ||
| @@ -181,4 +183,5 @@ MACHINE_START(S3C2440, "SMDK2440") | |||
| 181 | .map_io = smdk2440_map_io, | 183 | .map_io = smdk2440_map_io, |
| 182 | .init_machine = smdk2440_machine_init, | 184 | .init_machine = smdk2440_machine_init, |
| 183 | .timer = &s3c24xx_timer, | 185 | .timer = &s3c24xx_timer, |
| 186 | .restart = s3c2440_restart, | ||
| 184 | MACHINE_END | 187 | MACHINE_END |
diff --git a/arch/arm/mach-s3c2440/s3c2440.c b/arch/arm/mach-s3c2440/s3c2440.c index 37f8cc6aabd..42d73f1e0ce 100644 --- a/arch/arm/mach-s3c2440/s3c2440.c +++ b/arch/arm/mach-s3c2440/s3c2440.c | |||
| @@ -35,6 +35,7 @@ | |||
| 35 | #include <plat/cpu.h> | 35 | #include <plat/cpu.h> |
| 36 | #include <plat/s3c244x.h> | 36 | #include <plat/s3c244x.h> |
| 37 | #include <plat/pm.h> | 37 | #include <plat/pm.h> |
| 38 | #include <plat/watchdog-reset.h> | ||
| 38 | 39 | ||
| 39 | #include <plat/gpio-core.h> | 40 | #include <plat/gpio-core.h> |
| 40 | #include <plat/gpio-cfg.h> | 41 | #include <plat/gpio-cfg.h> |
| @@ -73,3 +74,15 @@ void __init s3c2440_map_io(void) | |||
| 73 | s3c24xx_gpiocfg_default.set_pull = s3c24xx_gpio_setpull_1up; | 74 | s3c24xx_gpiocfg_default.set_pull = s3c24xx_gpio_setpull_1up; |
| 74 | s3c24xx_gpiocfg_default.get_pull = s3c24xx_gpio_getpull_1up; | 75 | s3c24xx_gpiocfg_default.get_pull = s3c24xx_gpio_getpull_1up; |
| 75 | } | 76 | } |
| 77 | |||
| 78 | void s3c2440_restart(char mode, const char *cmd) | ||
| 79 | { | ||
| 80 | if (mode == 's') { | ||
| 81 | soft_restart(0); | ||
| 82 | } | ||
| 83 | |||
| 84 | arch_wdt_reset(); | ||
| 85 | |||
| 86 | /* we'll take a jump through zero as a poor second */ | ||
| 87 | soft_restart(0); | ||
| 88 | } | ||
diff --git a/arch/arm/mach-s3c2443/mach-smdk2443.c b/arch/arm/mach-s3c2443/mach-smdk2443.c index bec107e0044..20923695622 100644 --- a/arch/arm/mach-s3c2443/mach-smdk2443.c +++ b/arch/arm/mach-s3c2443/mach-smdk2443.c | |||
| @@ -145,4 +145,5 @@ MACHINE_START(SMDK2443, "SMDK2443") | |||
| 145 | .map_io = smdk2443_map_io, | 145 | .map_io = smdk2443_map_io, |
| 146 | .init_machine = smdk2443_machine_init, | 146 | .init_machine = smdk2443_machine_init, |
| 147 | .timer = &s3c24xx_timer, | 147 | .timer = &s3c24xx_timer, |
| 148 | .restart = s3c2443_restart, | ||
| 148 | MACHINE_END | 149 | MACHINE_END |
diff --git a/arch/arm/mach-s3c2443/s3c2443.c b/arch/arm/mach-s3c2443/s3c2443.c index a22b771b0f3..4568ded338d 100644 --- a/arch/arm/mach-s3c2443/s3c2443.c +++ b/arch/arm/mach-s3c2443/s3c2443.c | |||
| @@ -31,7 +31,6 @@ | |||
| 31 | #include <asm/irq.h> | 31 | #include <asm/irq.h> |
| 32 | 32 | ||
| 33 | #include <mach/regs-s3c2443-clock.h> | 33 | #include <mach/regs-s3c2443-clock.h> |
| 34 | #include <mach/reset.h> | ||
| 35 | 34 | ||
| 36 | #include <plat/gpio-core.h> | 35 | #include <plat/gpio-core.h> |
| 37 | #include <plat/gpio-cfg.h> | 36 | #include <plat/gpio-cfg.h> |
| @@ -57,8 +56,11 @@ static struct sys_device s3c2443_sysdev = { | |||
| 57 | .cls = &s3c2443_sysclass, | 56 | .cls = &s3c2443_sysclass, |
| 58 | }; | 57 | }; |
| 59 | 58 | ||
| 60 | static void s3c2443_hard_reset(void) | 59 | void s3c2443_restart(char mode, const char *cmd) |
| 61 | { | 60 | { |
| 61 | if (mode == 's') | ||
| 62 | soft_restart(0); | ||
| 63 | |||
| 62 | __raw_writel(S3C2443_SWRST_RESET, S3C2443_SWRST); | 64 | __raw_writel(S3C2443_SWRST_RESET, S3C2443_SWRST); |
| 63 | } | 65 | } |
| 64 | 66 | ||
| @@ -66,8 +68,6 @@ int __init s3c2443_init(void) | |||
| 66 | { | 68 | { |
| 67 | printk("S3C2443: Initialising architecture\n"); | 69 | printk("S3C2443: Initialising architecture\n"); |
| 68 | 70 | ||
| 69 | s3c24xx_reset_hook = s3c2443_hard_reset; | ||
| 70 | |||
| 71 | s3c_nand_setname("s3c2412-nand"); | 71 | s3c_nand_setname("s3c2412-nand"); |
| 72 | s3c_fb_setname("s3c2443-fb"); | 72 | s3c_fb_setname("s3c2443-fb"); |
| 73 | 73 | ||
diff --git a/arch/arm/mach-s3c64xx/Makefile b/arch/arm/mach-s3c64xx/Makefile index cfc0b994180..f37016cebbe 100644 --- a/arch/arm/mach-s3c64xx/Makefile +++ b/arch/arm/mach-s3c64xx/Makefile | |||
| @@ -10,54 +10,49 @@ obj-m := | |||
| 10 | obj-n := | 10 | obj-n := |
| 11 | obj- := | 11 | obj- := |
| 12 | 12 | ||
| 13 | # Core files | 13 | # Core |
| 14 | obj-y += cpu.o | ||
| 15 | obj-y += clock.o | ||
| 16 | 14 | ||
| 17 | # Core support for S3C6400 system | 15 | obj-y += common.o clock.o |
| 16 | |||
| 17 | # Core support | ||
| 18 | 18 | ||
| 19 | obj-$(CONFIG_CPU_S3C6400) += s3c6400.o | 19 | obj-$(CONFIG_CPU_S3C6400) += s3c6400.o |
| 20 | obj-$(CONFIG_CPU_S3C6410) += s3c6410.o | 20 | obj-$(CONFIG_CPU_S3C6410) += s3c6410.o |
| 21 | 21 | ||
| 22 | obj-y += irq.o | 22 | # PM |
| 23 | obj-y += irq-eint.o | 23 | |
| 24 | obj-$(CONFIG_PM) += pm.o irq-pm.o sleep.o | ||
| 24 | 25 | ||
| 25 | # DMA support | 26 | # DMA support |
| 26 | 27 | ||
| 27 | obj-$(CONFIG_S3C64XX_DMA) += dma.o | 28 | obj-$(CONFIG_S3C64XX_DMA) += dma.o |
| 28 | 29 | ||
| 29 | # Device setup | 30 | # Device support |
| 30 | 31 | ||
| 31 | obj-$(CONFIG_S3C64XX_SETUP_I2C0) += setup-i2c0.o | 32 | obj-y += dev-uart.o |
| 32 | obj-$(CONFIG_S3C64XX_SETUP_I2C1) += setup-i2c1.o | 33 | obj-y += dev-audio.o |
| 33 | obj-$(CONFIG_S3C64XX_SETUP_IDE) += setup-ide.o | 34 | obj-$(CONFIG_S3C64XX_DEV_SPI) += dev-spi.o |
| 34 | obj-$(CONFIG_S3C64XX_SETUP_KEYPAD) += setup-keypad.o | ||
| 35 | obj-$(CONFIG_S3C64XX_SETUP_SDHCI) += setup-sdhci.o | ||
| 36 | obj-$(CONFIG_S3C64XX_SETUP_FB_24BPP) += setup-fb-24bpp.o | ||
| 37 | obj-$(CONFIG_S3C64XX_SETUP_SDHCI_GPIO) += setup-sdhci-gpio.o | ||
| 38 | 35 | ||
| 39 | # PM | 36 | # Device setup |
| 40 | 37 | ||
| 41 | obj-$(CONFIG_PM) += pm.o | 38 | obj-$(CONFIG_S3C64XX_SETUP_FB_24BPP) += setup-fb-24bpp.o |
| 42 | obj-$(CONFIG_PM) += sleep.o | 39 | obj-$(CONFIG_S3C64XX_SETUP_I2C0) += setup-i2c0.o |
| 43 | obj-$(CONFIG_PM) += irq-pm.o | 40 | obj-$(CONFIG_S3C64XX_SETUP_I2C1) += setup-i2c1.o |
| 41 | obj-$(CONFIG_S3C64XX_SETUP_IDE) += setup-ide.o | ||
| 42 | obj-$(CONFIG_S3C64XX_SETUP_KEYPAD) += setup-keypad.o | ||
| 43 | obj-$(CONFIG_S3C64XX_SETUP_SDHCI) += setup-sdhci.o | ||
| 44 | obj-$(CONFIG_S3C64XX_SETUP_SDHCI_GPIO) += setup-sdhci-gpio.o | ||
| 44 | 45 | ||
| 45 | # Machine support | 46 | # Machine support |
| 46 | 47 | ||
| 47 | obj-$(CONFIG_MACH_ANW6410) += mach-anw6410.o | 48 | obj-$(CONFIG_MACH_ANW6410) += mach-anw6410.o |
| 48 | obj-$(CONFIG_MACH_SMDK6400) += mach-smdk6400.o | 49 | obj-$(CONFIG_MACH_HMT) += mach-hmt.o |
| 49 | obj-$(CONFIG_MACH_SMDK6410) += mach-smdk6410.o | 50 | obj-$(CONFIG_MACH_MINI6410) += mach-mini6410.o |
| 50 | obj-$(CONFIG_MACH_REAL6410) += mach-real6410.o | 51 | obj-$(CONFIG_MACH_NCP) += mach-ncp.o |
| 51 | obj-$(CONFIG_MACH_MINI6410) += mach-mini6410.o | 52 | obj-$(CONFIG_MACH_REAL6410) += mach-real6410.o |
| 52 | obj-$(CONFIG_MACH_NCP) += mach-ncp.o | 53 | obj-$(CONFIG_MACH_SMARTQ) += mach-smartq.o |
| 53 | obj-$(CONFIG_MACH_HMT) += mach-hmt.o | 54 | obj-$(CONFIG_MACH_SMARTQ5) += mach-smartq5.o |
| 54 | obj-$(CONFIG_MACH_SMARTQ) += mach-smartq.o | 55 | obj-$(CONFIG_MACH_SMARTQ7) += mach-smartq7.o |
| 55 | obj-$(CONFIG_MACH_SMARTQ5) += mach-smartq5.o | 56 | obj-$(CONFIG_MACH_SMDK6400) += mach-smdk6400.o |
| 56 | obj-$(CONFIG_MACH_SMARTQ7) += mach-smartq7.o | 57 | obj-$(CONFIG_MACH_SMDK6410) += mach-smdk6410.o |
| 57 | obj-$(CONFIG_MACH_WLF_CRAGG_6410) += mach-crag6410.o mach-crag6410-module.o | 58 | obj-$(CONFIG_MACH_WLF_CRAGG_6410) += mach-crag6410.o mach-crag6410-module.o |
| 58 | |||
| 59 | # device support | ||
| 60 | |||
| 61 | obj-y += dev-uart.o | ||
| 62 | obj-y += dev-audio.o | ||
| 63 | obj-$(CONFIG_S3C64XX_DEV_SPI) += dev-spi.o | ||
diff --git a/arch/arm/mach-s3c64xx/clock.c b/arch/arm/mach-s3c64xx/clock.c index 39c238d7a3d..625219b9cef 100644 --- a/arch/arm/mach-s3c64xx/clock.c +++ b/arch/arm/mach-s3c64xx/clock.c | |||
| @@ -705,7 +705,7 @@ static struct clksrc_clk *init_parents[] = { | |||
| 705 | 705 | ||
| 706 | #define GET_DIV(clk, field) ((((clk) & field##_MASK) >> field##_SHIFT) + 1) | 706 | #define GET_DIV(clk, field) ((((clk) & field##_MASK) >> field##_SHIFT) + 1) |
| 707 | 707 | ||
| 708 | void __init_or_cpufreq s3c6400_setup_clocks(void) | 708 | void __init_or_cpufreq s3c64xx_setup_clocks(void) |
| 709 | { | 709 | { |
| 710 | struct clk *xtal_clk; | 710 | struct clk *xtal_clk; |
| 711 | unsigned long xtal; | 711 | unsigned long xtal; |
| @@ -804,7 +804,7 @@ static struct clk *clks[] __initdata = { | |||
| 804 | * as ARMCLK as well as the necessary parent clocks. | 804 | * as ARMCLK as well as the necessary parent clocks. |
| 805 | * | 805 | * |
| 806 | * This call does not setup the clocks, which is left to the | 806 | * This call does not setup the clocks, which is left to the |
| 807 | * s3c6400_setup_clocks() call which may be needed by the cpufreq | 807 | * s3c64xx_setup_clocks() call which may be needed by the cpufreq |
| 808 | * or resume code to re-set the clocks if the bootloader has changed | 808 | * or resume code to re-set the clocks if the bootloader has changed |
| 809 | * them. | 809 | * them. |
| 810 | */ | 810 | */ |
diff --git a/arch/arm/mach-s3c64xx/irq-eint.c b/arch/arm/mach-s3c64xx/common.c index 4d203be1f4c..35182ba049d 100644 --- a/arch/arm/mach-s3c64xx/irq-eint.c +++ b/arch/arm/mach-s3c64xx/common.c | |||
| @@ -1,11 +1,13 @@ | |||
| 1 | /* arch/arm/plat-s3c64xx/irq-eint.c | 1 | /* |
| 2 | * Copyright (c) 2011 Samsung Electronics Co., Ltd. | ||
| 3 | * http://www.samsung.com | ||
| 2 | * | 4 | * |
| 3 | * Copyright 2008 Openmoko, Inc. | 5 | * Copyright 2008 Openmoko, Inc. |
| 4 | * Copyright 2008 Simtec Electronics | 6 | * Copyright 2008 Simtec Electronics |
| 5 | * Ben Dooks <ben@simtec.co.uk> | 7 | * Ben Dooks <ben@simtec.co.uk> |
| 6 | * http://armlinux.simtec.co.uk/ | 8 | * http://armlinux.simtec.co.uk/ |
| 7 | * | 9 | * |
| 8 | * S3C64XX - Interrupt handling for IRQ_EINT(x) | 10 | * Common Codes for S3C64XX machines |
| 9 | * | 11 | * |
| 10 | * This program is free software; you can redistribute it and/or modify | 12 | * This program is free software; you can redistribute it and/or modify |
| 11 | * it under the terms of the GNU General Public License version 2 as | 13 | * it under the terms of the GNU General Public License version 2 as |
| @@ -13,21 +15,183 @@ | |||
| 13 | */ | 15 | */ |
| 14 | 16 | ||
| 15 | #include <linux/kernel.h> | 17 | #include <linux/kernel.h> |
| 18 | #include <linux/init.h> | ||
| 19 | #include <linux/module.h> | ||
| 16 | #include <linux/interrupt.h> | 20 | #include <linux/interrupt.h> |
| 21 | #include <linux/ioport.h> | ||
| 17 | #include <linux/sysdev.h> | 22 | #include <linux/sysdev.h> |
| 18 | #include <linux/gpio.h> | 23 | #include <linux/serial_core.h> |
| 19 | #include <linux/irq.h> | 24 | #include <linux/platform_device.h> |
| 20 | #include <linux/io.h> | 25 | #include <linux/io.h> |
| 26 | #include <linux/dma-mapping.h> | ||
| 27 | #include <linux/irq.h> | ||
| 28 | #include <linux/gpio.h> | ||
| 21 | 29 | ||
| 30 | #include <asm/mach/arch.h> | ||
| 31 | #include <asm/mach/map.h> | ||
| 22 | #include <asm/hardware/vic.h> | 32 | #include <asm/hardware/vic.h> |
| 23 | 33 | ||
| 24 | #include <plat/regs-irqtype.h> | 34 | #include <mach/map.h> |
| 35 | #include <mach/hardware.h> | ||
| 25 | #include <mach/regs-gpio.h> | 36 | #include <mach/regs-gpio.h> |
| 26 | #include <plat/gpio-cfg.h> | ||
| 27 | 37 | ||
| 28 | #include <mach/map.h> | ||
| 29 | #include <plat/cpu.h> | 38 | #include <plat/cpu.h> |
| 39 | #include <plat/clock.h> | ||
| 40 | #include <plat/devs.h> | ||
| 30 | #include <plat/pm.h> | 41 | #include <plat/pm.h> |
| 42 | #include <plat/gpio-cfg.h> | ||
| 43 | #include <plat/irq-uart.h> | ||
| 44 | #include <plat/irq-vic-timer.h> | ||
| 45 | #include <plat/regs-irqtype.h> | ||
| 46 | #include <plat/regs-serial.h> | ||
| 47 | #include <plat/watchdog-reset.h> | ||
| 48 | |||
| 49 | #include "common.h" | ||
| 50 | |||
| 51 | /* uart registration process */ | ||
| 52 | |||
| 53 | void __init s3c64xx_init_uarts(struct s3c2410_uartcfg *cfg, int no) | ||
| 54 | { | ||
| 55 | s3c24xx_init_uartdevs("s3c6400-uart", s3c64xx_uart_resources, cfg, no); | ||
| 56 | } | ||
| 57 | |||
| 58 | /* table of supported CPUs */ | ||
| 59 | |||
| 60 | static const char name_s3c6400[] = "S3C6400"; | ||
| 61 | static const char name_s3c6410[] = "S3C6410"; | ||
| 62 | |||
| 63 | static struct cpu_table cpu_ids[] __initdata = { | ||
| 64 | { | ||
| 65 | .idcode = S3C6400_CPU_ID, | ||
| 66 | .idmask = S3C64XX_CPU_MASK, | ||
| 67 | .map_io = s3c6400_map_io, | ||
| 68 | .init_clocks = s3c6400_init_clocks, | ||
| 69 | .init_uarts = s3c64xx_init_uarts, | ||
| 70 | .init = s3c6400_init, | ||
| 71 | .name = name_s3c6400, | ||
| 72 | }, { | ||
| 73 | .idcode = S3C6410_CPU_ID, | ||
| 74 | .idmask = S3C64XX_CPU_MASK, | ||
| 75 | .map_io = s3c6410_map_io, | ||
| 76 | .init_clocks = s3c6410_init_clocks, | ||
| 77 | .init_uarts = s3c64xx_init_uarts, | ||
| 78 | .init = s3c6410_init, | ||
| 79 | .name = name_s3c6410, | ||
| 80 | }, | ||
| 81 | }; | ||
| 82 | |||
| 83 | /* minimal IO mapping */ | ||
| 84 | |||
| 85 | /* see notes on uart map in arch/arm/mach-s3c64xx/include/mach/debug-macro.S */ | ||
| 86 | #define UART_OFFS (S3C_PA_UART & 0xfffff) | ||
| 87 | |||
| 88 | static struct map_desc s3c_iodesc[] __initdata = { | ||
| 89 | { | ||
| 90 | .virtual = (unsigned long)S3C_VA_SYS, | ||
| 91 | .pfn = __phys_to_pfn(S3C64XX_PA_SYSCON), | ||
| 92 | .length = SZ_4K, | ||
| 93 | .type = MT_DEVICE, | ||
| 94 | }, { | ||
| 95 | .virtual = (unsigned long)S3C_VA_MEM, | ||
| 96 | .pfn = __phys_to_pfn(S3C64XX_PA_SROM), | ||
| 97 | .length = SZ_4K, | ||
| 98 | .type = MT_DEVICE, | ||
| 99 | }, { | ||
| 100 | .virtual = (unsigned long)(S3C_VA_UART + UART_OFFS), | ||
| 101 | .pfn = __phys_to_pfn(S3C_PA_UART), | ||
| 102 | .length = SZ_4K, | ||
| 103 | .type = MT_DEVICE, | ||
| 104 | }, { | ||
| 105 | .virtual = (unsigned long)VA_VIC0, | ||
| 106 | .pfn = __phys_to_pfn(S3C64XX_PA_VIC0), | ||
| 107 | .length = SZ_16K, | ||
| 108 | .type = MT_DEVICE, | ||
| 109 | }, { | ||
| 110 | .virtual = (unsigned long)VA_VIC1, | ||
| 111 | .pfn = __phys_to_pfn(S3C64XX_PA_VIC1), | ||
| 112 | .length = SZ_16K, | ||
| 113 | .type = MT_DEVICE, | ||
| 114 | }, { | ||
| 115 | .virtual = (unsigned long)S3C_VA_TIMER, | ||
| 116 | .pfn = __phys_to_pfn(S3C_PA_TIMER), | ||
| 117 | .length = SZ_16K, | ||
| 118 | .type = MT_DEVICE, | ||
| 119 | }, { | ||
| 120 | .virtual = (unsigned long)S3C64XX_VA_GPIO, | ||
| 121 | .pfn = __phys_to_pfn(S3C64XX_PA_GPIO), | ||
| 122 | .length = SZ_4K, | ||
| 123 | .type = MT_DEVICE, | ||
| 124 | }, { | ||
| 125 | .virtual = (unsigned long)S3C64XX_VA_MODEM, | ||
| 126 | .pfn = __phys_to_pfn(S3C64XX_PA_MODEM), | ||
| 127 | .length = SZ_4K, | ||
| 128 | .type = MT_DEVICE, | ||
| 129 | }, { | ||
| 130 | .virtual = (unsigned long)S3C_VA_WATCHDOG, | ||
| 131 | .pfn = __phys_to_pfn(S3C64XX_PA_WATCHDOG), | ||
| 132 | .length = SZ_4K, | ||
| 133 | .type = MT_DEVICE, | ||
| 134 | }, { | ||
| 135 | .virtual = (unsigned long)S3C_VA_USB_HSPHY, | ||
| 136 | .pfn = __phys_to_pfn(S3C64XX_PA_USB_HSPHY), | ||
| 137 | .length = SZ_1K, | ||
| 138 | .type = MT_DEVICE, | ||
| 139 | }, | ||
| 140 | }; | ||
| 141 | |||
| 142 | struct sysdev_class s3c64xx_sysclass = { | ||
| 143 | .name = "s3c64xx-core", | ||
| 144 | }; | ||
| 145 | |||
| 146 | static struct sys_device s3c64xx_sysdev = { | ||
| 147 | .cls = &s3c64xx_sysclass, | ||
| 148 | }; | ||
| 149 | |||
| 150 | /* read cpu identification code */ | ||
| 151 | |||
| 152 | void __init s3c64xx_init_io(struct map_desc *mach_desc, int size) | ||
| 153 | { | ||
| 154 | /* initialise the io descriptors we need for initialisation */ | ||
| 155 | iotable_init(s3c_iodesc, ARRAY_SIZE(s3c_iodesc)); | ||
| 156 | iotable_init(mach_desc, size); | ||
| 157 | init_consistent_dma_size(SZ_8M); | ||
| 158 | |||
| 159 | /* detect cpu id */ | ||
| 160 | s3c64xx_init_cpu(); | ||
| 161 | |||
| 162 | s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids)); | ||
| 163 | } | ||
| 164 | |||
| 165 | static __init int s3c64xx_sysdev_init(void) | ||
| 166 | { | ||
| 167 | sysdev_class_register(&s3c64xx_sysclass); | ||
| 168 | return sysdev_register(&s3c64xx_sysdev); | ||
| 169 | } | ||
| 170 | core_initcall(s3c64xx_sysdev_init); | ||
| 171 | |||
| 172 | /* | ||
| 173 | * setup the sources the vic should advertise resume | ||
| 174 | * for, even though it is not doing the wake | ||
| 175 | * (set_irq_wake needs to be valid) | ||
| 176 | */ | ||
| 177 | #define IRQ_VIC0_RESUME (1 << (IRQ_RTC_TIC - IRQ_VIC0_BASE)) | ||
| 178 | #define IRQ_VIC1_RESUME (1 << (IRQ_RTC_ALARM - IRQ_VIC1_BASE) | \ | ||
| 179 | 1 << (IRQ_PENDN - IRQ_VIC1_BASE) | \ | ||
| 180 | 1 << (IRQ_HSMMC0 - IRQ_VIC1_BASE) | \ | ||
| 181 | 1 << (IRQ_HSMMC1 - IRQ_VIC1_BASE) | \ | ||
| 182 | 1 << (IRQ_HSMMC2 - IRQ_VIC1_BASE)) | ||
| 183 | |||
| 184 | void __init s3c64xx_init_irq(u32 vic0_valid, u32 vic1_valid) | ||
| 185 | { | ||
| 186 | printk(KERN_DEBUG "%s: initialising interrupts\n", __func__); | ||
| 187 | |||
| 188 | /* initialise the pair of VICs */ | ||
| 189 | vic_init(VA_VIC0, IRQ_VIC0_BASE, vic0_valid, IRQ_VIC0_RESUME); | ||
| 190 | vic_init(VA_VIC1, IRQ_VIC1_BASE, vic1_valid, IRQ_VIC1_RESUME); | ||
| 191 | |||
| 192 | /* add the timer sub-irqs */ | ||
| 193 | s3c_init_vic_timer_irq(5, IRQ_TIMER0); | ||
| 194 | } | ||
| 31 | 195 | ||
| 32 | #define eint_offset(irq) ((irq) - IRQ_EINT(0)) | 196 | #define eint_offset(irq) ((irq) - IRQ_EINT(0)) |
| 33 | #define eint_irq_to_bit(irq) ((u32)(1 << eint_offset(irq))) | 197 | #define eint_irq_to_bit(irq) ((u32)(1 << eint_offset(irq))) |
| @@ -209,5 +373,13 @@ static int __init s3c64xx_init_irq_eint(void) | |||
| 209 | 373 | ||
| 210 | return 0; | 374 | return 0; |
| 211 | } | 375 | } |
| 212 | |||
| 213 | arch_initcall(s3c64xx_init_irq_eint); | 376 | arch_initcall(s3c64xx_init_irq_eint); |
| 377 | |||
| 378 | void s3c64xx_restart(char mode, const char *cmd) | ||
| 379 | { | ||
| 380 | if (mode != 's') | ||
| 381 | arch_wdt_reset(); | ||
| 382 | |||
| 383 | /* if all else fails, or mode was for soft, jump to 0 */ | ||
| 384 | soft_restart(0); | ||
| 385 | } | ||
diff --git a/arch/arm/mach-s3c64xx/common.h b/arch/arm/mach-s3c64xx/common.h new file mode 100644 index 00000000000..8dc8ab6d8d6 --- /dev/null +++ b/arch/arm/mach-s3c64xx/common.h | |||
| @@ -0,0 +1,57 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (c) 2011 Samsung Electronics Co., Ltd. | ||
| 3 | * http://www.samsung.com | ||
| 4 | * | ||
| 5 | * Copyright 2008 Openmoko, Inc. | ||
| 6 | * Copyright 2008 Simtec Electronics | ||
| 7 | * Ben Dooks <ben@simtec.co.uk> | ||
| 8 | * http://armlinux.simtec.co.uk/ | ||
| 9 | * | ||
| 10 | * Common Header for S3C64XX machines | ||
| 11 | * | ||
| 12 | * This program is free software; you can redistribute it and/or modify | ||
| 13 | * it under the terms of the GNU General Public License version 2 as | ||
| 14 | * published by the Free Software Foundation. | ||
| 15 | */ | ||
| 16 | |||
| 17 | #ifndef __ARCH_ARM_MACH_S3C64XX_COMMON_H | ||
| 18 | #define __ARCH_ARM_MACH_S3C64XX_COMMON_H | ||
| 19 | |||
| 20 | void s3c64xx_init_irq(u32 vic0, u32 vic1); | ||
| 21 | void s3c64xx_init_io(struct map_desc *mach_desc, int size); | ||
| 22 | |||
| 23 | void s3c64xx_register_clocks(unsigned long xtal, unsigned armclk_limit); | ||
| 24 | void s3c64xx_setup_clocks(void); | ||
| 25 | |||
| 26 | void s3c64xx_restart(char mode, const char *cmd); | ||
| 27 | |||
| 28 | extern struct syscore_ops s3c64xx_irq_syscore_ops; | ||
| 29 | extern struct sysdev_class s3c64xx_sysclass; | ||
| 30 | |||
| 31 | #ifdef CONFIG_CPU_S3C6400 | ||
| 32 | |||
| 33 | extern int s3c6400_init(void); | ||
| 34 | extern void s3c6400_init_irq(void); | ||
| 35 | extern void s3c6400_map_io(void); | ||
| 36 | extern void s3c6400_init_clocks(int xtal); | ||
| 37 | |||
| 38 | #else | ||
| 39 | #define s3c6400_init_clocks NULL | ||
| 40 | #define s3c6400_map_io NULL | ||
| 41 | #define s3c6400_init NULL | ||
| 42 | #endif | ||
| 43 | |||
| 44 | #ifdef CONFIG_CPU_S3C6410 | ||
| 45 | |||
| 46 | extern int s3c6410_init(void); | ||
| 47 | extern void s3c6410_init_irq(void); | ||
| 48 | extern void s3c6410_map_io(void); | ||
| 49 | extern void s3c6410_init_clocks(int xtal); | ||
| 50 | |||
| 51 | #else | ||
| 52 | #define s3c6410_init_clocks NULL | ||
| 53 | #define s3c6410_map_io NULL | ||
| 54 | #define s3c6410_init NULL | ||
| 55 | #endif | ||
| 56 | |||
| 57 | #endif /* __ARCH_ARM_MACH_S3C64XX_COMMON_H */ | ||
diff --git a/arch/arm/mach-s3c64xx/cpu.c b/arch/arm/mach-s3c64xx/cpu.c deleted file mode 100644 index de085b798aa..00000000000 --- a/arch/arm/mach-s3c64xx/cpu.c +++ /dev/null | |||
| @@ -1,161 +0,0 @@ | |||
| 1 | /* linux/arch/arm/plat-s3c64xx/cpu.c | ||
| 2 | * | ||
| 3 | * Copyright 2008 Openmoko, Inc. | ||
| 4 | * Copyright 2008 Simtec Electronics | ||
| 5 | * Ben Dooks <ben@simtec.co.uk> | ||
| 6 | * http://armlinux.simtec.co.uk/ | ||
| 7 | * | ||
| 8 | * S3C64XX CPU Support | ||
| 9 | * | ||
| 10 | * This program is free software; you can redistribute it and/or modify | ||
| 11 | * it under the terms of the GNU General Public License version 2 as | ||
| 12 | * published by the Free Software Foundation. | ||
| 13 | */ | ||
| 14 | |||
| 15 | #include <linux/init.h> | ||
| 16 | #include <linux/module.h> | ||
| 17 | #include <linux/interrupt.h> | ||
| 18 | #include <linux/ioport.h> | ||
| 19 | #include <linux/sysdev.h> | ||
| 20 | #include <linux/serial_core.h> | ||
| 21 | #include <linux/platform_device.h> | ||
| 22 | #include <linux/io.h> | ||
| 23 | #include <linux/dma-mapping.h> | ||
| 24 | |||
| 25 | #include <mach/hardware.h> | ||
| 26 | #include <mach/map.h> | ||
| 27 | |||
| 28 | #include <asm/mach/arch.h> | ||
| 29 | #include <asm/mach/map.h> | ||
| 30 | |||
| 31 | #include <plat/regs-serial.h> | ||
| 32 | |||
| 33 | #include <plat/cpu.h> | ||
| 34 | #include <plat/devs.h> | ||
| 35 | #include <plat/clock.h> | ||
| 36 | |||
| 37 | #include <plat/s3c6400.h> | ||
| 38 | #include <plat/s3c6410.h> | ||
| 39 | |||
| 40 | /* table of supported CPUs */ | ||
| 41 | |||
| 42 | static const char name_s3c6400[] = "S3C6400"; | ||
| 43 | static const char name_s3c6410[] = "S3C6410"; | ||
| 44 | |||
| 45 | static struct cpu_table cpu_ids[] __initdata = { | ||
| 46 | { | ||
| 47 | .idcode = S3C6400_CPU_ID, | ||
| 48 | .idmask = S3C64XX_CPU_MASK, | ||
| 49 | .map_io = s3c6400_map_io, | ||
| 50 | .init_clocks = s3c6400_init_clocks, | ||
| 51 | .init_uarts = s3c6400_init_uarts, | ||
| 52 | .init = s3c6400_init, | ||
| 53 | .name = name_s3c6400, | ||
| 54 | }, { | ||
| 55 | .idcode = S3C6410_CPU_ID, | ||
| 56 | .idmask = S3C64XX_CPU_MASK, | ||
| 57 | .map_io = s3c6410_map_io, | ||
| 58 | .init_clocks = s3c6410_init_clocks, | ||
| 59 | .init_uarts = s3c6410_init_uarts, | ||
| 60 | .init = s3c6410_init, | ||
| 61 | .name = name_s3c6410, | ||
| 62 | }, | ||
| 63 | }; | ||
| 64 | |||
| 65 | /* minimal IO mapping */ | ||
| 66 | |||
| 67 | /* see notes on uart map in arch/arm/mach-s3c6400/include/mach/debug-macro.S */ | ||
| 68 | #define UART_OFFS (S3C_PA_UART & 0xfffff) | ||
| 69 | |||
| 70 | static struct map_desc s3c_iodesc[] __initdata = { | ||
| 71 | { | ||
| 72 | .virtual = (unsigned long)S3C_VA_SYS, | ||
| 73 | .pfn = __phys_to_pfn(S3C64XX_PA_SYSCON), | ||
| 74 | .length = SZ_4K, | ||
| 75 | .type = MT_DEVICE, | ||
| 76 | }, { | ||
| 77 | .virtual = (unsigned long)S3C_VA_MEM, | ||
| 78 | .pfn = __phys_to_pfn(S3C64XX_PA_SROM), | ||
| 79 | .length = SZ_4K, | ||
| 80 | .type = MT_DEVICE, | ||
| 81 | }, { | ||
| 82 | .virtual = (unsigned long)(S3C_VA_UART + UART_OFFS), | ||
| 83 | .pfn = __phys_to_pfn(S3C_PA_UART), | ||
| 84 | .length = SZ_4K, | ||
| 85 | .type = MT_DEVICE, | ||
| 86 | }, { | ||
| 87 | .virtual = (unsigned long)VA_VIC0, | ||
| 88 | .pfn = __phys_to_pfn(S3C64XX_PA_VIC0), | ||
| 89 | .length = SZ_16K, | ||
| 90 | .type = MT_DEVICE, | ||
| 91 | }, { | ||
| 92 | .virtual = (unsigned long)VA_VIC1, | ||
| 93 | .pfn = __phys_to_pfn(S3C64XX_PA_VIC1), | ||
| 94 | .length = SZ_16K, | ||
| 95 | .type = MT_DEVICE, | ||
| 96 | }, { | ||
| 97 | .virtual = (unsigned long)S3C_VA_TIMER, | ||
| 98 | .pfn = __phys_to_pfn(S3C_PA_TIMER), | ||
| 99 | .length = SZ_16K, | ||
| 100 | .type = MT_DEVICE, | ||
| 101 | }, { | ||
| 102 | .virtual = (unsigned long)S3C64XX_VA_GPIO, | ||
| 103 | .pfn = __phys_to_pfn(S3C64XX_PA_GPIO), | ||
| 104 | .length = SZ_4K, | ||
| 105 | .type = MT_DEVICE, | ||
| 106 | }, { | ||
| 107 | .virtual = (unsigned long)S3C64XX_VA_MODEM, | ||
| 108 | .pfn = __phys_to_pfn(S3C64XX_PA_MODEM), | ||
| 109 | .length = SZ_4K, | ||
| 110 | .type = MT_DEVICE, | ||
| 111 | }, { | ||
| 112 | .virtual = (unsigned long)S3C_VA_WATCHDOG, | ||
| 113 | .pfn = __phys_to_pfn(S3C64XX_PA_WATCHDOG), | ||
| 114 | .length = SZ_4K, | ||
| 115 | .type = MT_DEVICE, | ||
| 116 | }, { | ||
| 117 | .virtual = (unsigned long)S3C_VA_USB_HSPHY, | ||
| 118 | .pfn = __phys_to_pfn(S3C64XX_PA_USB_HSPHY), | ||
| 119 | .length = SZ_1K, | ||
| 120 | .type = MT_DEVICE, | ||
| 121 | }, | ||
| 122 | }; | ||
| 123 | |||
| 124 | |||
| 125 | struct sysdev_class s3c64xx_sysclass = { | ||
| 126 | .name = "s3c64xx-core", | ||
| 127 | }; | ||
| 128 | |||
| 129 | static struct sys_device s3c64xx_sysdev = { | ||
| 130 | .cls = &s3c64xx_sysclass, | ||
| 131 | }; | ||
| 132 | |||
| 133 | /* uart registration process */ | ||
| 134 | |||
| 135 | void __init s3c6400_common_init_uarts(struct s3c2410_uartcfg *cfg, int no) | ||
| 136 | { | ||
| 137 | s3c24xx_init_uartdevs("s3c6400-uart", s3c64xx_uart_resources, cfg, no); | ||
| 138 | } | ||
| 139 | |||
| 140 | /* read cpu identification code */ | ||
| 141 | |||
| 142 | void __init s3c64xx_init_io(struct map_desc *mach_desc, int size) | ||
| 143 | { | ||
| 144 | /* initialise the io descriptors we need for initialisation */ | ||
| 145 | iotable_init(s3c_iodesc, ARRAY_SIZE(s3c_iodesc)); | ||
| 146 | iotable_init(mach_desc, size); | ||
| 147 | init_consistent_dma_size(SZ_8M); | ||
| 148 | |||
| 149 | /* detect cpu id */ | ||
| 150 | s3c64xx_init_cpu(); | ||
| 151 | |||
| 152 | s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids)); | ||
| 153 | } | ||
| 154 | |||
| 155 | static __init int s3c64xx_sysdev_init(void) | ||
| 156 | { | ||
| 157 | sysdev_class_register(&s3c64xx_sysclass); | ||
| 158 | return sysdev_register(&s3c64xx_sysdev); | ||
| 159 | } | ||
| 160 | |||
| 161 | core_initcall(s3c64xx_sysdev_init); | ||
diff --git a/arch/arm/mach-s3c64xx/include/mach/system.h b/arch/arm/mach-s3c64xx/include/mach/system.h index d8ca5786ba2..353ed4389ae 100644 --- a/arch/arm/mach-s3c64xx/include/mach/system.h +++ b/arch/arm/mach-s3c64xx/include/mach/system.h | |||
| @@ -11,20 +11,9 @@ | |||
| 11 | #ifndef __ASM_ARCH_SYSTEM_H | 11 | #ifndef __ASM_ARCH_SYSTEM_H |
| 12 | #define __ASM_ARCH_SYSTEM_H __FILE__ | 12 | #define __ASM_ARCH_SYSTEM_H __FILE__ |
| 13 | 13 | ||
| 14 | #include <plat/watchdog-reset.h> | ||
| 15 | |||
| 16 | static void arch_idle(void) | 14 | static void arch_idle(void) |
| 17 | { | 15 | { |
| 18 | /* nothing here yet */ | 16 | /* nothing here yet */ |
| 19 | } | 17 | } |
| 20 | 18 | ||
| 21 | static void arch_reset(char mode, const char *cmd) | ||
| 22 | { | ||
| 23 | if (mode != 's') | ||
| 24 | arch_wdt_reset(); | ||
| 25 | |||
| 26 | /* if all else fails, or mode was for soft, jump to 0 */ | ||
| 27 | soft_restart(0); | ||
| 28 | } | ||
| 29 | |||
| 30 | #endif /* __ASM_ARCH_IRQ_H */ | 19 | #endif /* __ASM_ARCH_IRQ_H */ |
diff --git a/arch/arm/mach-s3c64xx/irq.c b/arch/arm/mach-s3c64xx/irq.c deleted file mode 100644 index b07357e9495..00000000000 --- a/arch/arm/mach-s3c64xx/irq.c +++ /dev/null | |||
| @@ -1,47 +0,0 @@ | |||
| 1 | /* arch/arm/plat-s3c64xx/irq.c | ||
| 2 | * | ||
| 3 | * Copyright 2008 Openmoko, Inc. | ||
| 4 | * Copyright 2008 Simtec Electronics | ||
| 5 | * Ben Dooks <ben@simtec.co.uk> | ||
| 6 | * http://armlinux.simtec.co.uk/ | ||
| 7 | * | ||
| 8 | * S3C64XX - Interrupt handling | ||
| 9 | * | ||
| 10 | * This program is free software; you can redistribute it and/or modify | ||
| 11 | * it under the terms of the GNU General Public License version 2 as | ||
| 12 | * published by the Free Software Foundation. | ||
| 13 | */ | ||
| 14 | |||
| 15 | #include <linux/kernel.h> | ||
| 16 | #include <linux/interrupt.h> | ||
| 17 | #include <linux/serial_core.h> | ||
| 18 | #include <linux/irq.h> | ||
| 19 | #include <linux/io.h> | ||
| 20 | |||
| 21 | #include <asm/hardware/vic.h> | ||
| 22 | |||
| 23 | #include <mach/map.h> | ||
| 24 | #include <plat/irq-vic-timer.h> | ||
| 25 | #include <plat/irq-uart.h> | ||
| 26 | #include <plat/cpu.h> | ||
| 27 | |||
| 28 | /* setup the sources the vic should advertise resume for, even though it | ||
| 29 | * is not doing the wake (set_irq_wake needs to be valid) */ | ||
| 30 | #define IRQ_VIC0_RESUME (1 << (IRQ_RTC_TIC - IRQ_VIC0_BASE)) | ||
| 31 | #define IRQ_VIC1_RESUME (1 << (IRQ_RTC_ALARM - IRQ_VIC1_BASE) | \ | ||
| 32 | 1 << (IRQ_PENDN - IRQ_VIC1_BASE) | \ | ||
| 33 | 1 << (IRQ_HSMMC0 - IRQ_VIC1_BASE) | \ | ||
| 34 | 1 << (IRQ_HSMMC1 - IRQ_VIC1_BASE) | \ | ||
| 35 | 1 << (IRQ_HSMMC2 - IRQ_VIC1_BASE)) | ||
| 36 | |||
| 37 | void __init s3c64xx_init_irq(u32 vic0_valid, u32 vic1_valid) | ||
| 38 | { | ||
| 39 | printk(KERN_DEBUG "%s: initialising interrupts\n", __func__); | ||
| 40 | |||
| 41 | /* initialise the pair of VICs */ | ||
| 42 | vic_init(VA_VIC0, IRQ_VIC0_BASE, vic0_valid, IRQ_VIC0_RESUME); | ||
| 43 | vic_init(VA_VIC1, IRQ_VIC1_BASE, vic1_valid, IRQ_VIC1_RESUME); | ||
| 44 | |||
| 45 | /* add the timer sub-irqs */ | ||
| 46 | s3c_init_vic_timer_irq(5, IRQ_TIMER0); | ||
| 47 | } | ||
diff --git a/arch/arm/mach-s3c64xx/mach-anw6410.c b/arch/arm/mach-s3c64xx/mach-anw6410.c index 2bbc14d9342..b86f2779e4e 100644 --- a/arch/arm/mach-s3c64xx/mach-anw6410.c +++ b/arch/arm/mach-s3c64xx/mach-anw6410.c | |||
| @@ -46,13 +46,14 @@ | |||
| 46 | #include <plat/fb.h> | 46 | #include <plat/fb.h> |
| 47 | #include <plat/regs-fb-v4.h> | 47 | #include <plat/regs-fb-v4.h> |
| 48 | 48 | ||
| 49 | #include <plat/s3c6410.h> | ||
| 50 | #include <plat/clock.h> | 49 | #include <plat/clock.h> |
| 51 | #include <plat/devs.h> | 50 | #include <plat/devs.h> |
| 52 | #include <plat/cpu.h> | 51 | #include <plat/cpu.h> |
| 53 | #include <mach/regs-gpio.h> | 52 | #include <mach/regs-gpio.h> |
| 54 | #include <mach/regs-modem.h> | 53 | #include <mach/regs-modem.h> |
| 55 | 54 | ||
| 55 | #include "common.h" | ||
| 56 | |||
| 56 | /* DM9000 */ | 57 | /* DM9000 */ |
| 57 | #define ANW6410_PA_DM9000 (0x18000000) | 58 | #define ANW6410_PA_DM9000 (0x18000000) |
| 58 | 59 | ||
| @@ -241,4 +242,5 @@ MACHINE_START(ANW6410, "A&W6410") | |||
| 241 | .map_io = anw6410_map_io, | 242 | .map_io = anw6410_map_io, |
| 242 | .init_machine = anw6410_machine_init, | 243 | .init_machine = anw6410_machine_init, |
| 243 | .timer = &s3c24xx_timer, | 244 | .timer = &s3c24xx_timer, |
| 245 | .restart = s3c64xx_restart, | ||
| 244 | MACHINE_END | 246 | MACHINE_END |
diff --git a/arch/arm/mach-s3c64xx/mach-crag6410.c b/arch/arm/mach-s3c64xx/mach-crag6410.c index 988ac2e48f0..f1c848aa4a1 100644 --- a/arch/arm/mach-s3c64xx/mach-crag6410.c +++ b/arch/arm/mach-s3c64xx/mach-crag6410.c | |||
| @@ -51,7 +51,6 @@ | |||
| 51 | 51 | ||
| 52 | #include <mach/regs-gpio-memport.h> | 52 | #include <mach/regs-gpio-memport.h> |
| 53 | 53 | ||
| 54 | #include <plat/s3c6410.h> | ||
| 55 | #include <plat/regs-serial.h> | 54 | #include <plat/regs-serial.h> |
| 56 | #include <plat/regs-fb-v4.h> | 55 | #include <plat/regs-fb-v4.h> |
| 57 | #include <plat/fb.h> | 56 | #include <plat/fb.h> |
| @@ -67,6 +66,8 @@ | |||
| 67 | #include <plat/iic.h> | 66 | #include <plat/iic.h> |
| 68 | #include <plat/pm.h> | 67 | #include <plat/pm.h> |
| 69 | 68 | ||
| 69 | #include "common.h" | ||
| 70 | |||
| 70 | /* serial port setup */ | 71 | /* serial port setup */ |
| 71 | 72 | ||
| 72 | #define UCON (S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK) | 73 | #define UCON (S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK) |
| @@ -716,4 +717,5 @@ MACHINE_START(WLF_CRAGG_6410, "Wolfson Cragganmore 6410") | |||
| 716 | .map_io = crag6410_map_io, | 717 | .map_io = crag6410_map_io, |
| 717 | .init_machine = crag6410_machine_init, | 718 | .init_machine = crag6410_machine_init, |
| 718 | .timer = &s3c24xx_timer, | 719 | .timer = &s3c24xx_timer, |
| 720 | .restart = s3c64xx_restart, | ||
| 719 | MACHINE_END | 721 | MACHINE_END |
diff --git a/arch/arm/mach-s3c64xx/mach-hmt.c b/arch/arm/mach-s3c64xx/mach-hmt.c index c5955f30170..521e07b8501 100644 --- a/arch/arm/mach-s3c64xx/mach-hmt.c +++ b/arch/arm/mach-s3c64xx/mach-hmt.c | |||
| @@ -38,12 +38,13 @@ | |||
| 38 | #include <plat/fb.h> | 38 | #include <plat/fb.h> |
| 39 | #include <plat/nand.h> | 39 | #include <plat/nand.h> |
| 40 | 40 | ||
| 41 | #include <plat/s3c6410.h> | ||
| 42 | #include <plat/clock.h> | 41 | #include <plat/clock.h> |
| 43 | #include <plat/devs.h> | 42 | #include <plat/devs.h> |
| 44 | #include <plat/cpu.h> | 43 | #include <plat/cpu.h> |
| 45 | #include <plat/regs-fb-v4.h> | 44 | #include <plat/regs-fb-v4.h> |
| 46 | 45 | ||
| 46 | #include "common.h" | ||
| 47 | |||
| 47 | #define UCON S3C2410_UCON_DEFAULT | 48 | #define UCON S3C2410_UCON_DEFAULT |
| 48 | #define ULCON (S3C2410_LCON_CS8 | S3C2410_LCON_PNONE) | 49 | #define ULCON (S3C2410_LCON_CS8 | S3C2410_LCON_PNONE) |
| 49 | #define UFCON (S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE) | 50 | #define UFCON (S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE) |
| @@ -272,4 +273,5 @@ MACHINE_START(HMT, "Airgoo-HMT") | |||
| 272 | .map_io = hmt_map_io, | 273 | .map_io = hmt_map_io, |
| 273 | .init_machine = hmt_machine_init, | 274 | .init_machine = hmt_machine_init, |
| 274 | .timer = &s3c24xx_timer, | 275 | .timer = &s3c24xx_timer, |
| 276 | .restart = s3c64xx_restart, | ||
| 275 | MACHINE_END | 277 | MACHINE_END |
diff --git a/arch/arm/mach-s3c64xx/mach-mini6410.c b/arch/arm/mach-s3c64xx/mach-mini6410.c index 4415c85e3f6..c34c2ab22ea 100644 --- a/arch/arm/mach-s3c64xx/mach-mini6410.c +++ b/arch/arm/mach-s3c64xx/mach-mini6410.c | |||
| @@ -34,7 +34,6 @@ | |||
| 34 | #include <mach/regs-modem.h> | 34 | #include <mach/regs-modem.h> |
| 35 | #include <mach/regs-srom.h> | 35 | #include <mach/regs-srom.h> |
| 36 | 36 | ||
| 37 | #include <plat/s3c6410.h> | ||
| 38 | #include <plat/adc.h> | 37 | #include <plat/adc.h> |
| 39 | #include <plat/cpu.h> | 38 | #include <plat/cpu.h> |
| 40 | #include <plat/devs.h> | 39 | #include <plat/devs.h> |
| @@ -46,6 +45,8 @@ | |||
| 46 | 45 | ||
| 47 | #include <video/platform_lcd.h> | 46 | #include <video/platform_lcd.h> |
| 48 | 47 | ||
| 48 | #include "common.h" | ||
| 49 | |||
| 49 | #define UCON S3C2410_UCON_DEFAULT | 50 | #define UCON S3C2410_UCON_DEFAULT |
| 50 | #define ULCON (S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB) | 51 | #define ULCON (S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB) |
| 51 | #define UFCON (S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE) | 52 | #define UFCON (S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE) |
| @@ -350,4 +351,5 @@ MACHINE_START(MINI6410, "MINI6410") | |||
| 350 | .map_io = mini6410_map_io, | 351 | .map_io = mini6410_map_io, |
| 351 | .init_machine = mini6410_machine_init, | 352 | .init_machine = mini6410_machine_init, |
| 352 | .timer = &s3c24xx_timer, | 353 | .timer = &s3c24xx_timer, |
| 354 | .restart = s3c64xx_restart, | ||
| 353 | MACHINE_END | 355 | MACHINE_END |
diff --git a/arch/arm/mach-s3c64xx/mach-ncp.c b/arch/arm/mach-s3c64xx/mach-ncp.c index 9b2c610eac2..0efa2ba783b 100644 --- a/arch/arm/mach-s3c64xx/mach-ncp.c +++ b/arch/arm/mach-s3c64xx/mach-ncp.c | |||
| @@ -40,12 +40,13 @@ | |||
| 40 | #include <plat/iic.h> | 40 | #include <plat/iic.h> |
| 41 | #include <plat/fb.h> | 41 | #include <plat/fb.h> |
| 42 | 42 | ||
| 43 | #include <plat/s3c6410.h> | ||
| 44 | #include <plat/clock.h> | 43 | #include <plat/clock.h> |
| 45 | #include <plat/devs.h> | 44 | #include <plat/devs.h> |
| 46 | #include <plat/cpu.h> | 45 | #include <plat/cpu.h> |
| 47 | #include <plat/regs-fb-v4.h> | 46 | #include <plat/regs-fb-v4.h> |
| 48 | 47 | ||
| 48 | #include "common.h" | ||
| 49 | |||
| 49 | #define UCON S3C2410_UCON_DEFAULT | 50 | #define UCON S3C2410_UCON_DEFAULT |
| 50 | #define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | 51 | #define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE |
| 51 | #define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE | 52 | #define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE |
| @@ -104,4 +105,5 @@ MACHINE_START(NCP, "NCP") | |||
| 104 | .map_io = ncp_map_io, | 105 | .map_io = ncp_map_io, |
| 105 | .init_machine = ncp_machine_init, | 106 | .init_machine = ncp_machine_init, |
| 106 | .timer = &s3c24xx_timer, | 107 | .timer = &s3c24xx_timer, |
| 108 | .restart = s3c64xx_restart, | ||
| 107 | MACHINE_END | 109 | MACHINE_END |
diff --git a/arch/arm/mach-s3c64xx/mach-real6410.c b/arch/arm/mach-s3c64xx/mach-real6410.c index dbab49f2713..be2a9a22ab7 100644 --- a/arch/arm/mach-s3c64xx/mach-real6410.c +++ b/arch/arm/mach-s3c64xx/mach-real6410.c | |||
| @@ -35,7 +35,6 @@ | |||
| 35 | #include <mach/regs-modem.h> | 35 | #include <mach/regs-modem.h> |
| 36 | #include <mach/regs-srom.h> | 36 | #include <mach/regs-srom.h> |
| 37 | 37 | ||
| 38 | #include <plat/s3c6410.h> | ||
| 39 | #include <plat/adc.h> | 38 | #include <plat/adc.h> |
| 40 | #include <plat/cpu.h> | 39 | #include <plat/cpu.h> |
| 41 | #include <plat/devs.h> | 40 | #include <plat/devs.h> |
| @@ -47,6 +46,8 @@ | |||
| 47 | 46 | ||
| 48 | #include <video/platform_lcd.h> | 47 | #include <video/platform_lcd.h> |
| 49 | 48 | ||
| 49 | #include "common.h" | ||
| 50 | |||
| 50 | #define UCON S3C2410_UCON_DEFAULT | 51 | #define UCON S3C2410_UCON_DEFAULT |
| 51 | #define ULCON (S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB) | 52 | #define ULCON (S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB) |
| 52 | #define UFCON (S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE) | 53 | #define UFCON (S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE) |
| @@ -331,4 +332,5 @@ MACHINE_START(REAL6410, "REAL6410") | |||
| 331 | .map_io = real6410_map_io, | 332 | .map_io = real6410_map_io, |
| 332 | .init_machine = real6410_machine_init, | 333 | .init_machine = real6410_machine_init, |
| 333 | .timer = &s3c24xx_timer, | 334 | .timer = &s3c24xx_timer, |
| 335 | .restart = s3c64xx_restart, | ||
| 334 | MACHINE_END | 336 | MACHINE_END |
diff --git a/arch/arm/mach-s3c64xx/mach-smartq.c b/arch/arm/mach-s3c64xx/mach-smartq.c index cb1ebeb0876..ce31db13623 100644 --- a/arch/arm/mach-s3c64xx/mach-smartq.c +++ b/arch/arm/mach-s3c64xx/mach-smartq.c | |||
| @@ -40,6 +40,8 @@ | |||
| 40 | 40 | ||
| 41 | #include <video/platform_lcd.h> | 41 | #include <video/platform_lcd.h> |
| 42 | 42 | ||
| 43 | #include "common.h" | ||
| 44 | |||
| 43 | #define UCON S3C2410_UCON_DEFAULT | 45 | #define UCON S3C2410_UCON_DEFAULT |
| 44 | #define ULCON (S3C2410_LCON_CS8 | S3C2410_LCON_PNONE) | 46 | #define ULCON (S3C2410_LCON_CS8 | S3C2410_LCON_PNONE) |
| 45 | #define UFCON (S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE) | 47 | #define UFCON (S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE) |
diff --git a/arch/arm/mach-s3c64xx/mach-smartq5.c b/arch/arm/mach-s3c64xx/mach-smartq5.c index 05394528265..3f42431d4dd 100644 --- a/arch/arm/mach-s3c64xx/mach-smartq5.c +++ b/arch/arm/mach-s3c64xx/mach-smartq5.c | |||
| @@ -24,13 +24,13 @@ | |||
| 24 | #include <mach/map.h> | 24 | #include <mach/map.h> |
| 25 | #include <mach/regs-gpio.h> | 25 | #include <mach/regs-gpio.h> |
| 26 | 26 | ||
| 27 | #include <plat/s3c6410.h> | ||
| 28 | #include <plat/cpu.h> | 27 | #include <plat/cpu.h> |
| 29 | #include <plat/devs.h> | 28 | #include <plat/devs.h> |
| 30 | #include <plat/fb.h> | 29 | #include <plat/fb.h> |
| 31 | #include <plat/gpio-cfg.h> | 30 | #include <plat/gpio-cfg.h> |
| 32 | #include <plat/regs-fb-v4.h> | 31 | #include <plat/regs-fb-v4.h> |
| 33 | 32 | ||
| 33 | #include "common.h" | ||
| 34 | #include "mach-smartq.h" | 34 | #include "mach-smartq.h" |
| 35 | 35 | ||
| 36 | static struct gpio_led smartq5_leds[] = { | 36 | static struct gpio_led smartq5_leds[] = { |
| @@ -153,4 +153,5 @@ MACHINE_START(SMARTQ5, "SmartQ 5") | |||
| 153 | .map_io = smartq_map_io, | 153 | .map_io = smartq_map_io, |
| 154 | .init_machine = smartq5_machine_init, | 154 | .init_machine = smartq5_machine_init, |
| 155 | .timer = &s3c24xx_timer, | 155 | .timer = &s3c24xx_timer, |
| 156 | .restart = s3c64xx_restart, | ||
| 156 | MACHINE_END | 157 | MACHINE_END |
diff --git a/arch/arm/mach-s3c64xx/mach-smartq7.c b/arch/arm/mach-s3c64xx/mach-smartq7.c index a58d1ba5cba..e5c09b6db96 100644 --- a/arch/arm/mach-s3c64xx/mach-smartq7.c +++ b/arch/arm/mach-s3c64xx/mach-smartq7.c | |||
| @@ -24,13 +24,13 @@ | |||
| 24 | #include <mach/map.h> | 24 | #include <mach/map.h> |
| 25 | #include <mach/regs-gpio.h> | 25 | #include <mach/regs-gpio.h> |
| 26 | 26 | ||
| 27 | #include <plat/s3c6410.h> | ||
| 28 | #include <plat/cpu.h> | 27 | #include <plat/cpu.h> |
| 29 | #include <plat/devs.h> | 28 | #include <plat/devs.h> |
| 30 | #include <plat/fb.h> | 29 | #include <plat/fb.h> |
| 31 | #include <plat/gpio-cfg.h> | 30 | #include <plat/gpio-cfg.h> |
| 32 | #include <plat/regs-fb-v4.h> | 31 | #include <plat/regs-fb-v4.h> |
| 33 | 32 | ||
| 33 | #include "common.h" | ||
| 34 | #include "mach-smartq.h" | 34 | #include "mach-smartq.h" |
| 35 | 35 | ||
| 36 | static struct gpio_led smartq7_leds[] = { | 36 | static struct gpio_led smartq7_leds[] = { |
| @@ -169,4 +169,5 @@ MACHINE_START(SMARTQ7, "SmartQ 7") | |||
| 169 | .map_io = smartq_map_io, | 169 | .map_io = smartq_map_io, |
| 170 | .init_machine = smartq7_machine_init, | 170 | .init_machine = smartq7_machine_init, |
| 171 | .timer = &s3c24xx_timer, | 171 | .timer = &s3c24xx_timer, |
| 172 | .restart = s3c64xx_restart, | ||
| 172 | MACHINE_END | 173 | MACHINE_END |
diff --git a/arch/arm/mach-s3c64xx/mach-smdk6400.c b/arch/arm/mach-s3c64xx/mach-smdk6400.c index be28a59e3f5..5f096534f4c 100644 --- a/arch/arm/mach-s3c64xx/mach-smdk6400.c +++ b/arch/arm/mach-s3c64xx/mach-smdk6400.c | |||
| @@ -32,12 +32,13 @@ | |||
| 32 | 32 | ||
| 33 | #include <plat/regs-serial.h> | 33 | #include <plat/regs-serial.h> |
| 34 | 34 | ||
| 35 | #include <plat/s3c6400.h> | ||
| 36 | #include <plat/clock.h> | 35 | #include <plat/clock.h> |
| 37 | #include <plat/devs.h> | 36 | #include <plat/devs.h> |
| 38 | #include <plat/cpu.h> | 37 | #include <plat/cpu.h> |
| 39 | #include <plat/iic.h> | 38 | #include <plat/iic.h> |
| 40 | 39 | ||
| 40 | #include "common.h" | ||
| 41 | |||
| 41 | #define UCON S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK | 42 | #define UCON S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK |
| 42 | #define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB | 43 | #define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB |
| 43 | #define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE | 44 | #define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE |
| @@ -93,4 +94,5 @@ MACHINE_START(SMDK6400, "SMDK6400") | |||
| 93 | .map_io = smdk6400_map_io, | 94 | .map_io = smdk6400_map_io, |
| 94 | .init_machine = smdk6400_machine_init, | 95 | .init_machine = smdk6400_machine_init, |
| 95 | .timer = &s3c24xx_timer, | 96 | .timer = &s3c24xx_timer, |
| 97 | .restart = s3c64xx_restart, | ||
| 96 | MACHINE_END | 98 | MACHINE_END |
diff --git a/arch/arm/mach-s3c64xx/mach-smdk6410.c b/arch/arm/mach-s3c64xx/mach-smdk6410.c index 08309155d08..ca6fc204f0e 100644 --- a/arch/arm/mach-s3c64xx/mach-smdk6410.c +++ b/arch/arm/mach-s3c64xx/mach-smdk6410.c | |||
| @@ -64,7 +64,6 @@ | |||
| 64 | #include <plat/fb.h> | 64 | #include <plat/fb.h> |
| 65 | #include <plat/gpio-cfg.h> | 65 | #include <plat/gpio-cfg.h> |
| 66 | 66 | ||
| 67 | #include <plat/s3c6410.h> | ||
| 68 | #include <plat/clock.h> | 67 | #include <plat/clock.h> |
| 69 | #include <plat/devs.h> | 68 | #include <plat/devs.h> |
| 70 | #include <plat/cpu.h> | 69 | #include <plat/cpu.h> |
| @@ -74,6 +73,8 @@ | |||
| 74 | #include <plat/backlight.h> | 73 | #include <plat/backlight.h> |
| 75 | #include <plat/regs-fb-v4.h> | 74 | #include <plat/regs-fb-v4.h> |
| 76 | 75 | ||
| 76 | #include "common.h" | ||
| 77 | |||
| 77 | #define UCON S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK | 78 | #define UCON S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK |
| 78 | #define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB | 79 | #define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB |
| 79 | #define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE | 80 | #define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE |
| @@ -705,4 +706,5 @@ MACHINE_START(SMDK6410, "SMDK6410") | |||
| 705 | .map_io = smdk6410_map_io, | 706 | .map_io = smdk6410_map_io, |
| 706 | .init_machine = smdk6410_machine_init, | 707 | .init_machine = smdk6410_machine_init, |
| 707 | .timer = &s3c24xx_timer, | 708 | .timer = &s3c24xx_timer, |
| 709 | .restart = s3c64xx_restart, | ||
| 708 | MACHINE_END | 710 | MACHINE_END |
diff --git a/arch/arm/mach-s3c64xx/s3c6400.c b/arch/arm/mach-s3c64xx/s3c6400.c index 51c00f2453c..b1e1571f2f6 100644 --- a/arch/arm/mach-s3c64xx/s3c6400.c +++ b/arch/arm/mach-s3c64xx/s3c6400.c | |||
| @@ -38,7 +38,8 @@ | |||
| 38 | #include <plat/sdhci.h> | 38 | #include <plat/sdhci.h> |
| 39 | #include <plat/iic-core.h> | 39 | #include <plat/iic-core.h> |
| 40 | #include <plat/onenand-core.h> | 40 | #include <plat/onenand-core.h> |
| 41 | #include <plat/s3c6400.h> | 41 | |
| 42 | #include "common.h" | ||
| 42 | 43 | ||
| 43 | void __init s3c6400_map_io(void) | 44 | void __init s3c6400_map_io(void) |
| 44 | { | 45 | { |
| @@ -60,7 +61,7 @@ void __init s3c6400_map_io(void) | |||
| 60 | void __init s3c6400_init_clocks(int xtal) | 61 | void __init s3c6400_init_clocks(int xtal) |
| 61 | { | 62 | { |
| 62 | s3c64xx_register_clocks(xtal, S3C6400_CLKDIV0_ARM_MASK); | 63 | s3c64xx_register_clocks(xtal, S3C6400_CLKDIV0_ARM_MASK); |
| 63 | s3c6400_setup_clocks(); | 64 | s3c64xx_setup_clocks(); |
| 64 | } | 65 | } |
| 65 | 66 | ||
| 66 | void __init s3c6400_init_irq(void) | 67 | void __init s3c6400_init_irq(void) |
diff --git a/arch/arm/mach-s3c64xx/s3c6410.c b/arch/arm/mach-s3c64xx/s3c6410.c index 4117003464a..fba71bd991c 100644 --- a/arch/arm/mach-s3c64xx/s3c6410.c +++ b/arch/arm/mach-s3c64xx/s3c6410.c | |||
| @@ -41,8 +41,8 @@ | |||
| 41 | #include <plat/adc-core.h> | 41 | #include <plat/adc-core.h> |
| 42 | #include <plat/iic-core.h> | 42 | #include <plat/iic-core.h> |
| 43 | #include <plat/onenand-core.h> | 43 | #include <plat/onenand-core.h> |
| 44 | #include <plat/s3c6400.h> | 44 | |
| 45 | #include <plat/s3c6410.h> | 45 | #include "common.h" |
| 46 | 46 | ||
| 47 | void __init s3c6410_map_io(void) | 47 | void __init s3c6410_map_io(void) |
| 48 | { | 48 | { |
| @@ -66,7 +66,7 @@ void __init s3c6410_init_clocks(int xtal) | |||
| 66 | { | 66 | { |
| 67 | printk(KERN_DEBUG "%s: initialising clocks\n", __func__); | 67 | printk(KERN_DEBUG "%s: initialising clocks\n", __func__); |
| 68 | s3c64xx_register_clocks(xtal, S3C6410_CLKDIV0_ARM_MASK); | 68 | s3c64xx_register_clocks(xtal, S3C6410_CLKDIV0_ARM_MASK); |
| 69 | s3c6400_setup_clocks(); | 69 | s3c64xx_setup_clocks(); |
| 70 | } | 70 | } |
| 71 | 71 | ||
| 72 | void __init s3c6410_init_irq(void) | 72 | void __init s3c6410_init_irq(void) |
diff --git a/arch/arm/mach-s5p64x0/Makefile b/arch/arm/mach-s5p64x0/Makefile index a1324d8dc4e..d3f7409999f 100644 --- a/arch/arm/mach-s5p64x0/Makefile +++ b/arch/arm/mach-s5p64x0/Makefile | |||
| @@ -10,14 +10,16 @@ obj-m := | |||
| 10 | obj-n := | 10 | obj-n := |
| 11 | obj- := | 11 | obj- := |
| 12 | 12 | ||
| 13 | # Core support for S5P64X0 system | 13 | # Core |
| 14 | 14 | ||
| 15 | obj-$(CONFIG_ARCH_S5P64X0) += cpu.o init.o clock.o dma.o | 15 | obj-y += common.o clock.o |
| 16 | obj-$(CONFIG_ARCH_S5P64X0) += setup-i2c0.o irq-eint.o | ||
| 17 | obj-$(CONFIG_CPU_S5P6440) += clock-s5p6440.o | 16 | obj-$(CONFIG_CPU_S5P6440) += clock-s5p6440.o |
| 18 | obj-$(CONFIG_CPU_S5P6450) += clock-s5p6450.o | 17 | obj-$(CONFIG_CPU_S5P6450) += clock-s5p6450.o |
| 18 | |||
| 19 | obj-$(CONFIG_PM) += pm.o irq-pm.o | 19 | obj-$(CONFIG_PM) += pm.o irq-pm.o |
| 20 | 20 | ||
| 21 | obj-y += dma.o | ||
| 22 | |||
| 21 | # machine support | 23 | # machine support |
| 22 | 24 | ||
| 23 | obj-$(CONFIG_MACH_SMDK6440) += mach-smdk6440.o | 25 | obj-$(CONFIG_MACH_SMDK6440) += mach-smdk6440.o |
| @@ -28,5 +30,6 @@ obj-$(CONFIG_MACH_SMDK6450) += mach-smdk6450.o | |||
| 28 | obj-y += dev-audio.o | 30 | obj-y += dev-audio.o |
| 29 | obj-$(CONFIG_S3C64XX_DEV_SPI) += dev-spi.o | 31 | obj-$(CONFIG_S3C64XX_DEV_SPI) += dev-spi.o |
| 30 | 32 | ||
| 33 | obj-y += setup-i2c0.o | ||
| 31 | obj-$(CONFIG_S5P64X0_SETUP_I2C1) += setup-i2c1.o | 34 | obj-$(CONFIG_S5P64X0_SETUP_I2C1) += setup-i2c1.o |
| 32 | obj-$(CONFIG_S5P64X0_SETUP_FB_24BPP) += setup-fb-24bpp.o | 35 | obj-$(CONFIG_S5P64X0_SETUP_FB_24BPP) += setup-fb-24bpp.o |
diff --git a/arch/arm/mach-s5p64x0/clock-s5p6440.c b/arch/arm/mach-s5p64x0/clock-s5p6440.c index c54c65d511f..dd2b8daef0c 100644 --- a/arch/arm/mach-s5p64x0/clock-s5p6440.c +++ b/arch/arm/mach-s5p64x0/clock-s5p6440.c | |||
| @@ -31,7 +31,8 @@ | |||
| 31 | #include <plat/pll.h> | 31 | #include <plat/pll.h> |
| 32 | #include <plat/s5p-clock.h> | 32 | #include <plat/s5p-clock.h> |
| 33 | #include <plat/clock-clksrc.h> | 33 | #include <plat/clock-clksrc.h> |
| 34 | #include <plat/s5p6440.h> | 34 | |
| 35 | #include "common.h" | ||
| 35 | 36 | ||
| 36 | static u32 epll_div[][5] = { | 37 | static u32 epll_div[][5] = { |
| 37 | { 36000000, 0, 48, 1, 4 }, | 38 | { 36000000, 0, 48, 1, 4 }, |
diff --git a/arch/arm/mach-s5p64x0/clock-s5p6450.c b/arch/arm/mach-s5p64x0/clock-s5p6450.c index 2d04abfba12..328a224f007 100644 --- a/arch/arm/mach-s5p64x0/clock-s5p6450.c +++ b/arch/arm/mach-s5p64x0/clock-s5p6450.c | |||
| @@ -31,7 +31,8 @@ | |||
| 31 | #include <plat/pll.h> | 31 | #include <plat/pll.h> |
| 32 | #include <plat/s5p-clock.h> | 32 | #include <plat/s5p-clock.h> |
| 33 | #include <plat/clock-clksrc.h> | 33 | #include <plat/clock-clksrc.h> |
| 34 | #include <plat/s5p6450.h> | 34 | |
| 35 | #include "common.h" | ||
| 35 | 36 | ||
| 36 | static struct clksrc_clk clk_mout_dpll = { | 37 | static struct clksrc_clk clk_mout_dpll = { |
| 37 | .clk = { | 38 | .clk = { |
diff --git a/arch/arm/mach-s5p64x0/clock.c b/arch/arm/mach-s5p64x0/clock.c index b52c6e2f37a..b289b726a7d 100644 --- a/arch/arm/mach-s5p64x0/clock.c +++ b/arch/arm/mach-s5p64x0/clock.c | |||
| @@ -30,8 +30,8 @@ | |||
| 30 | #include <plat/pll.h> | 30 | #include <plat/pll.h> |
| 31 | #include <plat/s5p-clock.h> | 31 | #include <plat/s5p-clock.h> |
| 32 | #include <plat/clock-clksrc.h> | 32 | #include <plat/clock-clksrc.h> |
| 33 | #include <plat/s5p6440.h> | 33 | |
| 34 | #include <plat/s5p6450.h> | 34 | #include "common.h" |
| 35 | 35 | ||
| 36 | struct clksrc_clk clk_mout_apll = { | 36 | struct clksrc_clk clk_mout_apll = { |
| 37 | .clk = { | 37 | .clk = { |
diff --git a/arch/arm/mach-s5p64x0/common.c b/arch/arm/mach-s5p64x0/common.c new file mode 100644 index 00000000000..b7555a0fb0f --- /dev/null +++ b/arch/arm/mach-s5p64x0/common.c | |||
| @@ -0,0 +1,468 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (c) 2009-2011 Samsung Electronics Co., Ltd. | ||
| 3 | * http://www.samsung.com | ||
| 4 | * | ||
| 5 | * Common Codes for S5P64X0 machines | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #include <linux/kernel.h> | ||
| 13 | #include <linux/types.h> | ||
| 14 | #include <linux/interrupt.h> | ||
| 15 | #include <linux/list.h> | ||
| 16 | #include <linux/timer.h> | ||
| 17 | #include <linux/init.h> | ||
| 18 | #include <linux/clk.h> | ||
| 19 | #include <linux/io.h> | ||
| 20 | #include <linux/sysdev.h> | ||
| 21 | #include <linux/serial_core.h> | ||
| 22 | #include <linux/platform_device.h> | ||
| 23 | #include <linux/sched.h> | ||
| 24 | #include <linux/dma-mapping.h> | ||
| 25 | #include <linux/gpio.h> | ||
| 26 | #include <linux/irq.h> | ||
| 27 | |||
| 28 | #include <asm/irq.h> | ||
| 29 | #include <asm/proc-fns.h> | ||
| 30 | #include <asm/mach/arch.h> | ||
| 31 | #include <asm/mach/map.h> | ||
| 32 | #include <asm/mach/irq.h> | ||
| 33 | |||
| 34 | #include <mach/map.h> | ||
| 35 | #include <mach/hardware.h> | ||
| 36 | #include <mach/regs-clock.h> | ||
| 37 | #include <mach/regs-gpio.h> | ||
| 38 | |||
| 39 | #include <plat/cpu.h> | ||
| 40 | #include <plat/clock.h> | ||
| 41 | #include <plat/devs.h> | ||
| 42 | #include <plat/pm.h> | ||
| 43 | #include <plat/adc-core.h> | ||
| 44 | #include <plat/fb-core.h> | ||
| 45 | #include <plat/gpio-cfg.h> | ||
| 46 | #include <plat/regs-irqtype.h> | ||
| 47 | #include <plat/regs-serial.h> | ||
| 48 | #include <plat/watchdog-reset.h> | ||
| 49 | |||
| 50 | #include "common.h" | ||
| 51 | |||
| 52 | static const char name_s5p6440[] = "S5P6440"; | ||
| 53 | static const char name_s5p6450[] = "S5P6450"; | ||
| 54 | |||
| 55 | static struct cpu_table cpu_ids[] __initdata = { | ||
| 56 | { | ||
| 57 | .idcode = S5P6440_CPU_ID, | ||
| 58 | .idmask = S5P64XX_CPU_MASK, | ||
| 59 | .map_io = s5p6440_map_io, | ||
| 60 | .init_clocks = s5p6440_init_clocks, | ||
| 61 | .init_uarts = s5p6440_init_uarts, | ||
| 62 | .init = s5p64x0_init, | ||
| 63 | .name = name_s5p6440, | ||
| 64 | }, { | ||
| 65 | .idcode = S5P6450_CPU_ID, | ||
| 66 | .idmask = S5P64XX_CPU_MASK, | ||
| 67 | .map_io = s5p6450_map_io, | ||
| 68 | .init_clocks = s5p6450_init_clocks, | ||
| 69 | .init_uarts = s5p6450_init_uarts, | ||
| 70 | .init = s5p64x0_init, | ||
| 71 | .name = name_s5p6450, | ||
| 72 | }, | ||
| 73 | }; | ||
| 74 | |||
| 75 | /* Initial IO mappings */ | ||
| 76 | |||
| 77 | static struct map_desc s5p64x0_iodesc[] __initdata = { | ||
| 78 | { | ||
| 79 | .virtual = (unsigned long)S5P_VA_CHIPID, | ||
| 80 | .pfn = __phys_to_pfn(S5P64X0_PA_CHIPID), | ||
| 81 | .length = SZ_4K, | ||
| 82 | .type = MT_DEVICE, | ||
| 83 | }, { | ||
| 84 | .virtual = (unsigned long)S3C_VA_SYS, | ||
| 85 | .pfn = __phys_to_pfn(S5P64X0_PA_SYSCON), | ||
| 86 | .length = SZ_64K, | ||
| 87 | .type = MT_DEVICE, | ||
| 88 | }, { | ||
| 89 | .virtual = (unsigned long)S3C_VA_TIMER, | ||
| 90 | .pfn = __phys_to_pfn(S5P64X0_PA_TIMER), | ||
| 91 | .length = SZ_16K, | ||
| 92 | .type = MT_DEVICE, | ||
| 93 | }, { | ||
| 94 | .virtual = (unsigned long)S3C_VA_WATCHDOG, | ||
| 95 | .pfn = __phys_to_pfn(S5P64X0_PA_WDT), | ||
| 96 | .length = SZ_4K, | ||
| 97 | .type = MT_DEVICE, | ||
| 98 | }, { | ||
| 99 | .virtual = (unsigned long)S5P_VA_SROMC, | ||
| 100 | .pfn = __phys_to_pfn(S5P64X0_PA_SROMC), | ||
| 101 | .length = SZ_4K, | ||
| 102 | .type = MT_DEVICE, | ||
| 103 | }, { | ||
| 104 | .virtual = (unsigned long)S5P_VA_GPIO, | ||
| 105 | .pfn = __phys_to_pfn(S5P64X0_PA_GPIO), | ||
| 106 | .length = SZ_4K, | ||
| 107 | .type = MT_DEVICE, | ||
| 108 | }, { | ||
| 109 | .virtual = (unsigned long)VA_VIC0, | ||
| 110 | .pfn = __phys_to_pfn(S5P64X0_PA_VIC0), | ||
| 111 | .length = SZ_16K, | ||
| 112 | .type = MT_DEVICE, | ||
| 113 | }, { | ||
| 114 | .virtual = (unsigned long)VA_VIC1, | ||
| 115 | .pfn = __phys_to_pfn(S5P64X0_PA_VIC1), | ||
| 116 | .length = SZ_16K, | ||
| 117 | .type = MT_DEVICE, | ||
| 118 | }, | ||
| 119 | }; | ||
| 120 | |||
| 121 | static struct map_desc s5p6440_iodesc[] __initdata = { | ||
| 122 | { | ||
| 123 | .virtual = (unsigned long)S3C_VA_UART, | ||
| 124 | .pfn = __phys_to_pfn(S5P6440_PA_UART(0)), | ||
| 125 | .length = SZ_4K, | ||
| 126 | .type = MT_DEVICE, | ||
| 127 | }, | ||
| 128 | }; | ||
| 129 | |||
| 130 | static struct map_desc s5p6450_iodesc[] __initdata = { | ||
| 131 | { | ||
| 132 | .virtual = (unsigned long)S3C_VA_UART, | ||
| 133 | .pfn = __phys_to_pfn(S5P6450_PA_UART(0)), | ||
| 134 | .length = SZ_512K, | ||
| 135 | .type = MT_DEVICE, | ||
| 136 | }, { | ||
| 137 | .virtual = (unsigned long)S3C_VA_UART + SZ_512K, | ||
| 138 | .pfn = __phys_to_pfn(S5P6450_PA_UART(5)), | ||
| 139 | .length = SZ_4K, | ||
| 140 | .type = MT_DEVICE, | ||
| 141 | }, | ||
| 142 | }; | ||
| 143 | |||
| 144 | static void s5p64x0_idle(void) | ||
| 145 | { | ||
| 146 | unsigned long val; | ||
| 147 | |||
| 148 | if (!need_resched()) { | ||
| 149 | val = __raw_readl(S5P64X0_PWR_CFG); | ||
| 150 | val &= ~(0x3 << 5); | ||
| 151 | val |= (0x1 << 5); | ||
| 152 | __raw_writel(val, S5P64X0_PWR_CFG); | ||
| 153 | |||
| 154 | cpu_do_idle(); | ||
| 155 | } | ||
| 156 | local_irq_enable(); | ||
| 157 | } | ||
| 158 | |||
| 159 | /* | ||
| 160 | * s5p64x0_map_io | ||
| 161 | * | ||
| 162 | * register the standard CPU IO areas | ||
| 163 | */ | ||
| 164 | |||
| 165 | void __init s5p64x0_init_io(struct map_desc *mach_desc, int size) | ||
| 166 | { | ||
| 167 | /* initialize the io descriptors we need for initialization */ | ||
| 168 | iotable_init(s5p64x0_iodesc, ARRAY_SIZE(s5p64x0_iodesc)); | ||
| 169 | if (mach_desc) | ||
| 170 | iotable_init(mach_desc, size); | ||
| 171 | |||
| 172 | /* detect cpu id and rev. */ | ||
| 173 | s5p_init_cpu(S5P64X0_SYS_ID); | ||
| 174 | |||
| 175 | s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids)); | ||
| 176 | } | ||
| 177 | |||
| 178 | void __init s5p6440_map_io(void) | ||
| 179 | { | ||
| 180 | /* initialize any device information early */ | ||
| 181 | s3c_adc_setname("s3c64xx-adc"); | ||
| 182 | s3c_fb_setname("s5p64x0-fb"); | ||
| 183 | |||
| 184 | iotable_init(s5p6440_iodesc, ARRAY_SIZE(s5p6440_iodesc)); | ||
| 185 | init_consistent_dma_size(SZ_8M); | ||
| 186 | } | ||
| 187 | |||
| 188 | void __init s5p6450_map_io(void) | ||
| 189 | { | ||
| 190 | /* initialize any device information early */ | ||
| 191 | s3c_adc_setname("s3c64xx-adc"); | ||
| 192 | s3c_fb_setname("s5p64x0-fb"); | ||
| 193 | |||
| 194 | iotable_init(s5p6450_iodesc, ARRAY_SIZE(s5p6450_iodesc)); | ||
| 195 | init_consistent_dma_size(SZ_8M); | ||
| 196 | } | ||
| 197 | |||
| 198 | /* | ||
| 199 | * s5p64x0_init_clocks | ||
| 200 | * | ||
| 201 | * register and setup the CPU clocks | ||
| 202 | */ | ||
| 203 | |||
| 204 | void __init s5p6440_init_clocks(int xtal) | ||
| 205 | { | ||
| 206 | printk(KERN_DEBUG "%s: initializing clocks\n", __func__); | ||
| 207 | |||
| 208 | s3c24xx_register_baseclocks(xtal); | ||
| 209 | s5p_register_clocks(xtal); | ||
| 210 | s5p6440_register_clocks(); | ||
| 211 | s5p6440_setup_clocks(); | ||
| 212 | } | ||
| 213 | |||
| 214 | void __init s5p6450_init_clocks(int xtal) | ||
| 215 | { | ||
| 216 | printk(KERN_DEBUG "%s: initializing clocks\n", __func__); | ||
| 217 | |||
| 218 | s3c24xx_register_baseclocks(xtal); | ||
| 219 | s5p_register_clocks(xtal); | ||
| 220 | s5p6450_register_clocks(); | ||
| 221 | s5p6450_setup_clocks(); | ||
| 222 | } | ||
| 223 | |||
| 224 | /* | ||
| 225 | * s5p64x0_init_irq | ||
| 226 | * | ||
| 227 | * register the CPU interrupts | ||
| 228 | */ | ||
| 229 | |||
| 230 | void __init s5p6440_init_irq(void) | ||
| 231 | { | ||
| 232 | /* S5P6440 supports 2 VIC */ | ||
| 233 | u32 vic[2]; | ||
| 234 | |||
| 235 | /* | ||
| 236 | * VIC0 is missing IRQ_VIC0[3, 4, 8, 10, (12-22)] | ||
| 237 | * VIC1 is missing IRQ VIC1[1, 3, 4, 10, 11, 12, 14, 15, 22] | ||
| 238 | */ | ||
| 239 | vic[0] = 0xff800ae7; | ||
| 240 | vic[1] = 0xffbf23e5; | ||
| 241 | |||
| 242 | s5p_init_irq(vic, ARRAY_SIZE(vic)); | ||
| 243 | } | ||
| 244 | |||
| 245 | void __init s5p6450_init_irq(void) | ||
| 246 | { | ||
| 247 | /* S5P6450 supports only 2 VIC */ | ||
| 248 | u32 vic[2]; | ||
| 249 | |||
| 250 | /* | ||
| 251 | * VIC0 is missing IRQ_VIC0[(13-15), (21-22)] | ||
| 252 | * VIC1 is missing IRQ VIC1[12, 14, 23] | ||
| 253 | */ | ||
| 254 | vic[0] = 0xff9f1fff; | ||
| 255 | vic[1] = 0xff7fafff; | ||
| 256 | |||
| 257 | s5p_init_irq(vic, ARRAY_SIZE(vic)); | ||
| 258 | } | ||
| 259 | |||
| 260 | struct sysdev_class s5p64x0_sysclass = { | ||
| 261 | .name = "s5p64x0-core", | ||
| 262 | }; | ||
| 263 | |||
| 264 | static struct sys_device s5p64x0_sysdev = { | ||
| 265 | .cls = &s5p64x0_sysclass, | ||
| 266 | }; | ||
| 267 | |||
| 268 | static int __init s5p64x0_core_init(void) | ||
| 269 | { | ||
| 270 | return sysdev_class_register(&s5p64x0_sysclass); | ||
| 271 | } | ||
| 272 | core_initcall(s5p64x0_core_init); | ||
| 273 | |||
| 274 | int __init s5p64x0_init(void) | ||
| 275 | { | ||
| 276 | printk(KERN_INFO "S5P64X0(S5P6440/S5P6450): Initializing architecture\n"); | ||
| 277 | |||
| 278 | /* set idle function */ | ||
| 279 | pm_idle = s5p64x0_idle; | ||
| 280 | |||
| 281 | return sysdev_register(&s5p64x0_sysdev); | ||
| 282 | } | ||
| 283 | |||
| 284 | static struct s3c24xx_uart_clksrc s5p64x0_serial_clocks[] = { | ||
| 285 | [0] = { | ||
| 286 | .name = "pclk_low", | ||
| 287 | .divisor = 1, | ||
| 288 | .min_baud = 0, | ||
| 289 | .max_baud = 0, | ||
| 290 | }, | ||
| 291 | [1] = { | ||
| 292 | .name = "uclk1", | ||
| 293 | .divisor = 1, | ||
| 294 | .min_baud = 0, | ||
| 295 | .max_baud = 0, | ||
| 296 | }, | ||
| 297 | }; | ||
| 298 | |||
| 299 | /* uart registration process */ | ||
| 300 | |||
| 301 | void __init s5p64x0_common_init_uarts(struct s3c2410_uartcfg *cfg, int no) | ||
| 302 | { | ||
| 303 | struct s3c2410_uartcfg *tcfg = cfg; | ||
| 304 | u32 ucnt; | ||
| 305 | |||
| 306 | for (ucnt = 0; ucnt < no; ucnt++, tcfg++) { | ||
| 307 | if (!tcfg->clocks) { | ||
| 308 | tcfg->clocks = s5p64x0_serial_clocks; | ||
| 309 | tcfg->clocks_size = ARRAY_SIZE(s5p64x0_serial_clocks); | ||
| 310 | } | ||
| 311 | } | ||
| 312 | } | ||
| 313 | |||
| 314 | void __init s5p6440_init_uarts(struct s3c2410_uartcfg *cfg, int no) | ||
| 315 | { | ||
| 316 | int uart; | ||
| 317 | |||
| 318 | for (uart = 0; uart < no; uart++) { | ||
| 319 | s5p_uart_resources[uart].resources->start = S5P6440_PA_UART(uart); | ||
| 320 | s5p_uart_resources[uart].resources->end = S5P6440_PA_UART(uart) + S5P_SZ_UART; | ||
| 321 | } | ||
| 322 | |||
| 323 | s5p64x0_common_init_uarts(cfg, no); | ||
| 324 | s3c24xx_init_uartdevs("s3c6400-uart", s5p_uart_resources, cfg, no); | ||
| 325 | } | ||
| 326 | |||
| 327 | void __init s5p6450_init_uarts(struct s3c2410_uartcfg *cfg, int no) | ||
| 328 | { | ||
| 329 | s5p64x0_common_init_uarts(cfg, no); | ||
| 330 | s3c24xx_init_uartdevs("s3c6400-uart", s5p_uart_resources, cfg, no); | ||
| 331 | } | ||
| 332 | |||
| 333 | #define eint_offset(irq) ((irq) - IRQ_EINT(0)) | ||
| 334 | |||
| 335 | static int s5p64x0_irq_eint_set_type(struct irq_data *data, unsigned int type) | ||
| 336 | { | ||
| 337 | int offs = eint_offset(data->irq); | ||
| 338 | int shift; | ||
| 339 | u32 ctrl, mask; | ||
| 340 | u32 newvalue = 0; | ||
| 341 | |||
| 342 | if (offs > 15) | ||
| 343 | return -EINVAL; | ||
| 344 | |||
| 345 | switch (type) { | ||
| 346 | case IRQ_TYPE_NONE: | ||
| 347 | printk(KERN_WARNING "No edge setting!\n"); | ||
| 348 | break; | ||
| 349 | case IRQ_TYPE_EDGE_RISING: | ||
| 350 | newvalue = S3C2410_EXTINT_RISEEDGE; | ||
| 351 | break; | ||
| 352 | case IRQ_TYPE_EDGE_FALLING: | ||
| 353 | newvalue = S3C2410_EXTINT_FALLEDGE; | ||
| 354 | break; | ||
| 355 | case IRQ_TYPE_EDGE_BOTH: | ||
| 356 | newvalue = S3C2410_EXTINT_BOTHEDGE; | ||
| 357 | break; | ||
| 358 | case IRQ_TYPE_LEVEL_LOW: | ||
| 359 | newvalue = S3C2410_EXTINT_LOWLEV; | ||
| 360 | break; | ||
| 361 | case IRQ_TYPE_LEVEL_HIGH: | ||
| 362 | newvalue = S3C2410_EXTINT_HILEV; | ||
| 363 | break; | ||
| 364 | default: | ||
| 365 | printk(KERN_ERR "No such irq type %d", type); | ||
| 366 | return -EINVAL; | ||
| 367 | } | ||
| 368 | |||
| 369 | shift = (offs / 2) * 4; | ||
| 370 | mask = 0x7 << shift; | ||
| 371 | |||
| 372 | ctrl = __raw_readl(S5P64X0_EINT0CON0) & ~mask; | ||
| 373 | ctrl |= newvalue << shift; | ||
| 374 | __raw_writel(ctrl, S5P64X0_EINT0CON0); | ||
| 375 | |||
| 376 | /* Configure the GPIO pin for 6450 or 6440 based on CPU ID */ | ||
| 377 | if (soc_is_s5p6450()) | ||
| 378 | s3c_gpio_cfgpin(S5P6450_GPN(offs), S3C_GPIO_SFN(2)); | ||
| 379 | else | ||
| 380 | s3c_gpio_cfgpin(S5P6440_GPN(offs), S3C_GPIO_SFN(2)); | ||
| 381 | |||
| 382 | return 0; | ||
| 383 | } | ||
| 384 | |||
| 385 | /* | ||
| 386 | * s5p64x0_irq_demux_eint | ||
| 387 | * | ||
| 388 | * This function demuxes the IRQ from the group0 external interrupts, | ||
| 389 | * from IRQ_EINT(0) to IRQ_EINT(15). It is designed to be inlined into | ||
| 390 | * the specific handlers s5p64x0_irq_demux_eintX_Y. | ||
| 391 | */ | ||
| 392 | static inline void s5p64x0_irq_demux_eint(unsigned int start, unsigned int end) | ||
| 393 | { | ||
| 394 | u32 status = __raw_readl(S5P64X0_EINT0PEND); | ||
| 395 | u32 mask = __raw_readl(S5P64X0_EINT0MASK); | ||
| 396 | unsigned int irq; | ||
| 397 | |||
| 398 | status &= ~mask; | ||
| 399 | status >>= start; | ||
| 400 | status &= (1 << (end - start + 1)) - 1; | ||
| 401 | |||
| 402 | for (irq = IRQ_EINT(start); irq <= IRQ_EINT(end); irq++) { | ||
| 403 | if (status & 1) | ||
| 404 | generic_handle_irq(irq); | ||
| 405 | status >>= 1; | ||
| 406 | } | ||
| 407 | } | ||
| 408 | |||
| 409 | static void s5p64x0_irq_demux_eint0_3(unsigned int irq, struct irq_desc *desc) | ||
| 410 | { | ||
| 411 | s5p64x0_irq_demux_eint(0, 3); | ||
| 412 | } | ||
| 413 | |||
| 414 | static void s5p64x0_irq_demux_eint4_11(unsigned int irq, struct irq_desc *desc) | ||
| 415 | { | ||
| 416 | s5p64x0_irq_demux_eint(4, 11); | ||
| 417 | } | ||
| 418 | |||
| 419 | static void s5p64x0_irq_demux_eint12_15(unsigned int irq, | ||
| 420 | struct irq_desc *desc) | ||
| 421 | { | ||
| 422 | s5p64x0_irq_demux_eint(12, 15); | ||
| 423 | } | ||
| 424 | |||
| 425 | static int s5p64x0_alloc_gc(void) | ||
| 426 | { | ||
| 427 | struct irq_chip_generic *gc; | ||
| 428 | struct irq_chip_type *ct; | ||
| 429 | |||
| 430 | gc = irq_alloc_generic_chip("s5p64x0-eint", 1, S5P_IRQ_EINT_BASE, | ||
| 431 | S5P_VA_GPIO, handle_level_irq); | ||
| 432 | if (!gc) { | ||
| 433 | printk(KERN_ERR "%s: irq_alloc_generic_chip for group 0" | ||
| 434 | "external interrupts failed\n", __func__); | ||
| 435 | return -EINVAL; | ||
| 436 | } | ||
| 437 | |||
| 438 | ct = gc->chip_types; | ||
| 439 | ct->chip.irq_ack = irq_gc_ack_set_bit; | ||
| 440 | ct->chip.irq_mask = irq_gc_mask_set_bit; | ||
| 441 | ct->chip.irq_unmask = irq_gc_mask_clr_bit; | ||
| 442 | ct->chip.irq_set_type = s5p64x0_irq_eint_set_type; | ||
| 443 | ct->chip.irq_set_wake = s3c_irqext_wake; | ||
| 444 | ct->regs.ack = EINT0PEND_OFFSET; | ||
| 445 | ct->regs.mask = EINT0MASK_OFFSET; | ||
| 446 | irq_setup_generic_chip(gc, IRQ_MSK(16), IRQ_GC_INIT_MASK_CACHE, | ||
| 447 | IRQ_NOREQUEST | IRQ_NOPROBE, 0); | ||
| 448 | return 0; | ||
| 449 | } | ||
| 450 | |||
| 451 | static int __init s5p64x0_init_irq_eint(void) | ||
| 452 | { | ||
| 453 | int ret = s5p64x0_alloc_gc(); | ||
| 454 | irq_set_chained_handler(IRQ_EINT0_3, s5p64x0_irq_demux_eint0_3); | ||
| 455 | irq_set_chained_handler(IRQ_EINT4_11, s5p64x0_irq_demux_eint4_11); | ||
| 456 | irq_set_chained_handler(IRQ_EINT12_15, s5p64x0_irq_demux_eint12_15); | ||
| 457 | |||
| 458 | return ret; | ||
| 459 | } | ||
| 460 | arch_initcall(s5p64x0_init_irq_eint); | ||
| 461 | |||
| 462 | void s5p64x0_restart(char mode, const char *cmd) | ||
| 463 | { | ||
| 464 | if (mode != 's') | ||
| 465 | arch_wdt_reset(); | ||
| 466 | |||
| 467 | soft_restart(0); | ||
| 468 | } | ||
diff --git a/arch/arm/mach-s5p64x0/common.h b/arch/arm/mach-s5p64x0/common.h new file mode 100644 index 00000000000..f8a60fdc588 --- /dev/null +++ b/arch/arm/mach-s5p64x0/common.h | |||
| @@ -0,0 +1,57 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (c) 2011 Samsung Electronics Co., Ltd. | ||
| 3 | * http://www.samsung.com | ||
| 4 | * | ||
| 5 | * Common Header for S5P64X0 machines | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef __ARCH_ARM_MACH_S5P64X0_COMMON_H | ||
| 13 | #define __ARCH_ARM_MACH_S5P64X0_COMMON_H | ||
| 14 | |||
| 15 | void s5p6440_init_irq(void); | ||
| 16 | void s5p6450_init_irq(void); | ||
| 17 | void s5p64x0_init_io(struct map_desc *mach_desc, int size); | ||
| 18 | |||
| 19 | void s5p6440_register_clocks(void); | ||
| 20 | void s5p6440_setup_clocks(void); | ||
| 21 | |||
| 22 | void s5p6450_register_clocks(void); | ||
| 23 | void s5p6450_setup_clocks(void); | ||
| 24 | |||
| 25 | void s5p64x0_restart(char mode, const char *cmd); | ||
| 26 | |||
| 27 | #ifdef CONFIG_CPU_S5P6440 | ||
| 28 | |||
| 29 | extern int s5p64x0_init(void); | ||
| 30 | extern void s5p6440_map_io(void); | ||
| 31 | extern void s5p6440_init_clocks(int xtal); | ||
| 32 | |||
| 33 | extern void s5p6440_init_uarts(struct s3c2410_uartcfg *cfg, int no); | ||
| 34 | |||
| 35 | #else | ||
| 36 | #define s5p6440_init_clocks NULL | ||
| 37 | #define s5p6440_init_uarts NULL | ||
| 38 | #define s5p6440_map_io NULL | ||
| 39 | #define s5p64x0_init NULL | ||
| 40 | #endif | ||
| 41 | |||
| 42 | #ifdef CONFIG_CPU_S5P6450 | ||
| 43 | |||
| 44 | extern int s5p64x0_init(void); | ||
| 45 | extern void s5p6450_map_io(void); | ||
| 46 | extern void s5p6450_init_clocks(int xtal); | ||
| 47 | |||
| 48 | extern void s5p6450_init_uarts(struct s3c2410_uartcfg *cfg, int no); | ||
| 49 | |||
| 50 | #else | ||
| 51 | #define s5p6450_init_clocks NULL | ||
| 52 | #define s5p6450_init_uarts NULL | ||
| 53 | #define s5p6450_map_io NULL | ||
| 54 | #define s5p64x0_init NULL | ||
| 55 | #endif | ||
| 56 | |||
| 57 | #endif /* __ARCH_ARM_MACH_S5P64X0_COMMON_H */ | ||
diff --git a/arch/arm/mach-s5p64x0/cpu.c b/arch/arm/mach-s5p64x0/cpu.c deleted file mode 100644 index ecab40cf19a..00000000000 --- a/arch/arm/mach-s5p64x0/cpu.c +++ /dev/null | |||
| @@ -1,215 +0,0 @@ | |||
| 1 | /* linux/arch/arm/mach-s5p64x0/cpu.c | ||
| 2 | * | ||
| 3 | * Copyright (c) 2009-2010 Samsung Electronics Co., Ltd. | ||
| 4 | * http://www.samsung.com | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License version 2 as | ||
| 8 | * published by the Free Software Foundation. | ||
| 9 | */ | ||
| 10 | |||
| 11 | #include <linux/kernel.h> | ||
| 12 | #include <linux/types.h> | ||
| 13 | #include <linux/interrupt.h> | ||
| 14 | #include <linux/list.h> | ||
| 15 | #include <linux/timer.h> | ||
| 16 | #include <linux/init.h> | ||
| 17 | #include <linux/clk.h> | ||
| 18 | #include <linux/io.h> | ||
| 19 | #include <linux/sysdev.h> | ||
| 20 | #include <linux/serial_core.h> | ||
| 21 | #include <linux/platform_device.h> | ||
| 22 | #include <linux/sched.h> | ||
| 23 | #include <linux/dma-mapping.h> | ||
| 24 | |||
| 25 | #include <asm/mach/arch.h> | ||
| 26 | #include <asm/mach/map.h> | ||
| 27 | #include <asm/mach/irq.h> | ||
| 28 | #include <asm/proc-fns.h> | ||
| 29 | #include <asm/irq.h> | ||
| 30 | |||
| 31 | #include <mach/hardware.h> | ||
| 32 | #include <mach/map.h> | ||
| 33 | #include <mach/regs-clock.h> | ||
| 34 | |||
| 35 | #include <plat/regs-serial.h> | ||
| 36 | #include <plat/cpu.h> | ||
| 37 | #include <plat/devs.h> | ||
| 38 | #include <plat/clock.h> | ||
| 39 | #include <plat/s5p6440.h> | ||
| 40 | #include <plat/s5p6450.h> | ||
| 41 | #include <plat/adc-core.h> | ||
| 42 | #include <plat/fb-core.h> | ||
| 43 | |||
| 44 | /* Initial IO mappings */ | ||
| 45 | |||
| 46 | static struct map_desc s5p64x0_iodesc[] __initdata = { | ||
| 47 | { | ||
| 48 | .virtual = (unsigned long)S5P_VA_GPIO, | ||
| 49 | .pfn = __phys_to_pfn(S5P64X0_PA_GPIO), | ||
| 50 | .length = SZ_4K, | ||
| 51 | .type = MT_DEVICE, | ||
| 52 | }, { | ||
| 53 | .virtual = (unsigned long)VA_VIC0, | ||
| 54 | .pfn = __phys_to_pfn(S5P64X0_PA_VIC0), | ||
| 55 | .length = SZ_16K, | ||
| 56 | .type = MT_DEVICE, | ||
| 57 | }, { | ||
| 58 | .virtual = (unsigned long)VA_VIC1, | ||
| 59 | .pfn = __phys_to_pfn(S5P64X0_PA_VIC1), | ||
| 60 | .length = SZ_16K, | ||
| 61 | .type = MT_DEVICE, | ||
| 62 | }, | ||
| 63 | }; | ||
| 64 | |||
| 65 | static struct map_desc s5p6440_iodesc[] __initdata = { | ||
| 66 | { | ||
| 67 | .virtual = (unsigned long)S3C_VA_UART, | ||
| 68 | .pfn = __phys_to_pfn(S5P6440_PA_UART(0)), | ||
| 69 | .length = SZ_4K, | ||
| 70 | .type = MT_DEVICE, | ||
| 71 | }, | ||
| 72 | }; | ||
| 73 | |||
| 74 | static struct map_desc s5p6450_iodesc[] __initdata = { | ||
| 75 | { | ||
| 76 | .virtual = (unsigned long)S3C_VA_UART, | ||
| 77 | .pfn = __phys_to_pfn(S5P6450_PA_UART(0)), | ||
| 78 | .length = SZ_512K, | ||
| 79 | .type = MT_DEVICE, | ||
| 80 | }, { | ||
| 81 | .virtual = (unsigned long)S3C_VA_UART + SZ_512K, | ||
| 82 | .pfn = __phys_to_pfn(S5P6450_PA_UART(5)), | ||
| 83 | .length = SZ_4K, | ||
| 84 | .type = MT_DEVICE, | ||
| 85 | }, | ||
| 86 | }; | ||
| 87 | |||
| 88 | static void s5p64x0_idle(void) | ||
| 89 | { | ||
| 90 | unsigned long val; | ||
| 91 | |||
| 92 | if (!need_resched()) { | ||
| 93 | val = __raw_readl(S5P64X0_PWR_CFG); | ||
| 94 | val &= ~(0x3 << 5); | ||
| 95 | val |= (0x1 << 5); | ||
| 96 | __raw_writel(val, S5P64X0_PWR_CFG); | ||
| 97 | |||
| 98 | cpu_do_idle(); | ||
| 99 | } | ||
| 100 | local_irq_enable(); | ||
| 101 | } | ||
| 102 | |||
| 103 | /* | ||
| 104 | * s5p64x0_map_io | ||
| 105 | * | ||
| 106 | * register the standard CPU IO areas | ||
| 107 | */ | ||
| 108 | |||
| 109 | void __init s5p6440_map_io(void) | ||
| 110 | { | ||
| 111 | /* initialize any device information early */ | ||
| 112 | s3c_adc_setname("s3c64xx-adc"); | ||
| 113 | s3c_fb_setname("s5p64x0-fb"); | ||
| 114 | |||
| 115 | iotable_init(s5p64x0_iodesc, ARRAY_SIZE(s5p64x0_iodesc)); | ||
| 116 | iotable_init(s5p6440_iodesc, ARRAY_SIZE(s5p6440_iodesc)); | ||
| 117 | init_consistent_dma_size(SZ_8M); | ||
| 118 | } | ||
| 119 | |||
| 120 | void __init s5p6450_map_io(void) | ||
| 121 | { | ||
| 122 | /* initialize any device information early */ | ||
| 123 | s3c_adc_setname("s3c64xx-adc"); | ||
| 124 | s3c_fb_setname("s5p64x0-fb"); | ||
| 125 | |||
| 126 | iotable_init(s5p64x0_iodesc, ARRAY_SIZE(s5p64x0_iodesc)); | ||
| 127 | iotable_init(s5p6450_iodesc, ARRAY_SIZE(s5p6450_iodesc)); | ||
| 128 | init_consistent_dma_size(SZ_8M); | ||
| 129 | } | ||
| 130 | |||
| 131 | /* | ||
| 132 | * s5p64x0_init_clocks | ||
| 133 | * | ||
| 134 | * register and setup the CPU clocks | ||
| 135 | */ | ||
| 136 | |||
| 137 | void __init s5p6440_init_clocks(int xtal) | ||
| 138 | { | ||
| 139 | printk(KERN_DEBUG "%s: initializing clocks\n", __func__); | ||
| 140 | |||
| 141 | s3c24xx_register_baseclocks(xtal); | ||
| 142 | s5p_register_clocks(xtal); | ||
| 143 | s5p6440_register_clocks(); | ||
| 144 | s5p6440_setup_clocks(); | ||
| 145 | } | ||
| 146 | |||
| 147 | void __init s5p6450_init_clocks(int xtal) | ||
| 148 | { | ||
| 149 | printk(KERN_DEBUG "%s: initializing clocks\n", __func__); | ||
| 150 | |||
| 151 | s3c24xx_register_baseclocks(xtal); | ||
| 152 | s5p_register_clocks(xtal); | ||
| 153 | s5p6450_register_clocks(); | ||
| 154 | s5p6450_setup_clocks(); | ||
| 155 | } | ||
| 156 | |||
| 157 | /* | ||
| 158 | * s5p64x0_init_irq | ||
| 159 | * | ||
| 160 | * register the CPU interrupts | ||
| 161 | */ | ||
| 162 | |||
| 163 | void __init s5p6440_init_irq(void) | ||
| 164 | { | ||
| 165 | /* S5P6440 supports 2 VIC */ | ||
| 166 | u32 vic[2]; | ||
| 167 | |||
| 168 | /* | ||
| 169 | * VIC0 is missing IRQ_VIC0[3, 4, 8, 10, (12-22)] | ||
| 170 | * VIC1 is missing IRQ VIC1[1, 3, 4, 10, 11, 12, 14, 15, 22] | ||
| 171 | */ | ||
| 172 | vic[0] = 0xff800ae7; | ||
| 173 | vic[1] = 0xffbf23e5; | ||
| 174 | |||
| 175 | s5p_init_irq(vic, ARRAY_SIZE(vic)); | ||
| 176 | } | ||
| 177 | |||
| 178 | void __init s5p6450_init_irq(void) | ||
| 179 | { | ||
| 180 | /* S5P6450 supports only 2 VIC */ | ||
| 181 | u32 vic[2]; | ||
| 182 | |||
| 183 | /* | ||
| 184 | * VIC0 is missing IRQ_VIC0[(13-15), (21-22)] | ||
| 185 | * VIC1 is missing IRQ VIC1[12, 14, 23] | ||
| 186 | */ | ||
| 187 | vic[0] = 0xff9f1fff; | ||
| 188 | vic[1] = 0xff7fafff; | ||
| 189 | |||
| 190 | s5p_init_irq(vic, ARRAY_SIZE(vic)); | ||
| 191 | } | ||
| 192 | |||
| 193 | struct sysdev_class s5p64x0_sysclass = { | ||
| 194 | .name = "s5p64x0-core", | ||
| 195 | }; | ||
| 196 | |||
| 197 | static struct sys_device s5p64x0_sysdev = { | ||
| 198 | .cls = &s5p64x0_sysclass, | ||
| 199 | }; | ||
| 200 | |||
| 201 | static int __init s5p64x0_core_init(void) | ||
| 202 | { | ||
| 203 | return sysdev_class_register(&s5p64x0_sysclass); | ||
| 204 | } | ||
| 205 | core_initcall(s5p64x0_core_init); | ||
| 206 | |||
| 207 | int __init s5p64x0_init(void) | ||
| 208 | { | ||
| 209 | printk(KERN_INFO "S5P64X0(S5P6440/S5P6450): Initializing architecture\n"); | ||
| 210 | |||
| 211 | /* set idle function */ | ||
| 212 | pm_idle = s5p64x0_idle; | ||
| 213 | |||
| 214 | return sysdev_register(&s5p64x0_sysdev); | ||
| 215 | } | ||
diff --git a/arch/arm/mach-s5p64x0/include/mach/system.h b/arch/arm/mach-s5p64x0/include/mach/system.h index 60f57532c97..cf26e0954a2 100644 --- a/arch/arm/mach-s5p64x0/include/mach/system.h +++ b/arch/arm/mach-s5p64x0/include/mach/system.h | |||
| @@ -13,8 +13,6 @@ | |||
| 13 | #ifndef __ASM_ARCH_SYSTEM_H | 13 | #ifndef __ASM_ARCH_SYSTEM_H |
| 14 | #define __ASM_ARCH_SYSTEM_H __FILE__ | 14 | #define __ASM_ARCH_SYSTEM_H __FILE__ |
| 15 | 15 | ||
| 16 | #include <plat/system-reset.h> | ||
| 17 | |||
| 18 | static void arch_idle(void) | 16 | static void arch_idle(void) |
| 19 | { | 17 | { |
| 20 | /* nothing here yet */ | 18 | /* nothing here yet */ |
diff --git a/arch/arm/mach-s5p64x0/init.c b/arch/arm/mach-s5p64x0/init.c deleted file mode 100644 index 79833caf816..00000000000 --- a/arch/arm/mach-s5p64x0/init.c +++ /dev/null | |||
| @@ -1,73 +0,0 @@ | |||
| 1 | /* linux/arch/arm/mach-s5p64x0/init.c | ||
| 2 | * | ||
| 3 | * Copyright (c) 2009-2010 Samsung Electronics Co., Ltd. | ||
| 4 | * http://www.samsung.com | ||
| 5 | * | ||
| 6 | * S5P64X0 - Init support | ||
| 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 version 2 as | ||
| 10 | * published by the Free Software Foundation. | ||
| 11 | */ | ||
| 12 | |||
| 13 | #include <linux/kernel.h> | ||
| 14 | #include <linux/types.h> | ||
| 15 | #include <linux/init.h> | ||
| 16 | #include <linux/serial_core.h> | ||
| 17 | |||
| 18 | #include <mach/map.h> | ||
| 19 | |||
| 20 | #include <plat/cpu.h> | ||
| 21 | #include <plat/devs.h> | ||
| 22 | #include <plat/s5p6440.h> | ||
| 23 | #include <plat/s5p6450.h> | ||
| 24 | #include <plat/regs-serial.h> | ||
| 25 | |||
| 26 | static struct s3c24xx_uart_clksrc s5p64x0_serial_clocks[] = { | ||
| 27 | [0] = { | ||
| 28 | .name = "pclk_low", | ||
| 29 | .divisor = 1, | ||
| 30 | .min_baud = 0, | ||
| 31 | .max_baud = 0, | ||
| 32 | }, | ||
| 33 | [1] = { | ||
| 34 | .name = "uclk1", | ||
| 35 | .divisor = 1, | ||
| 36 | .min_baud = 0, | ||
| 37 | .max_baud = 0, | ||
| 38 | }, | ||
| 39 | }; | ||
| 40 | |||
| 41 | /* uart registration process */ | ||
| 42 | |||
| 43 | void __init s5p64x0_common_init_uarts(struct s3c2410_uartcfg *cfg, int no) | ||
| 44 | { | ||
| 45 | struct s3c2410_uartcfg *tcfg = cfg; | ||
| 46 | u32 ucnt; | ||
| 47 | |||
| 48 | for (ucnt = 0; ucnt < no; ucnt++, tcfg++) { | ||
| 49 | if (!tcfg->clocks) { | ||
| 50 | tcfg->clocks = s5p64x0_serial_clocks; | ||
| 51 | tcfg->clocks_size = ARRAY_SIZE(s5p64x0_serial_clocks); | ||
| 52 | } | ||
| 53 | } | ||
| 54 | } | ||
| 55 | |||
| 56 | void __init s5p6440_init_uarts(struct s3c2410_uartcfg *cfg, int no) | ||
| 57 | { | ||
| 58 | int uart; | ||
| 59 | |||
| 60 | for (uart = 0; uart < no; uart++) { | ||
| 61 | s5p_uart_resources[uart].resources->start = S5P6440_PA_UART(uart); | ||
| 62 | s5p_uart_resources[uart].resources->end = S5P6440_PA_UART(uart) + S5P_SZ_UART; | ||
| 63 | } | ||
| 64 | |||
| 65 | s5p64x0_common_init_uarts(cfg, no); | ||
| 66 | s3c24xx_init_uartdevs("s3c6400-uart", s5p_uart_resources, cfg, no); | ||
| 67 | } | ||
| 68 | |||
| 69 | void __init s5p6450_init_uarts(struct s3c2410_uartcfg *cfg, int no) | ||
| 70 | { | ||
| 71 | s5p64x0_common_init_uarts(cfg, no); | ||
| 72 | s3c24xx_init_uartdevs("s3c6400-uart", s5p_uart_resources, cfg, no); | ||
| 73 | } | ||
diff --git a/arch/arm/mach-s5p64x0/irq-eint.c b/arch/arm/mach-s5p64x0/irq-eint.c deleted file mode 100644 index 275dc74f4a7..00000000000 --- a/arch/arm/mach-s5p64x0/irq-eint.c +++ /dev/null | |||
| @@ -1,155 +0,0 @@ | |||
| 1 | /* arch/arm/mach-s5p64x0/irq-eint.c | ||
| 2 | * | ||
| 3 | * Copyright (c) 2011 Samsung Electronics Co., Ltd | ||
| 4 | * http://www.samsung.com/ | ||
| 5 | * | ||
| 6 | * Based on linux/arch/arm/mach-s3c64xx/irq-eint.c | ||
| 7 | * | ||
| 8 | * S5P64X0 - Interrupt handling for External Interrupts. | ||
| 9 | * | ||
| 10 | * This program is free software; you can redistribute it and/or modify | ||
| 11 | * it under the terms of the GNU General Public License version 2 as | ||
| 12 | * published by the Free Software Foundation. | ||
| 13 | */ | ||
| 14 | |||
| 15 | #include <linux/kernel.h> | ||
| 16 | #include <linux/gpio.h> | ||
| 17 | #include <linux/irq.h> | ||
| 18 | #include <linux/io.h> | ||
| 19 | |||
| 20 | #include <plat/cpu.h> | ||
| 21 | #include <plat/regs-irqtype.h> | ||
| 22 | #include <plat/gpio-cfg.h> | ||
| 23 | #include <plat/pm.h> | ||
| 24 | |||
| 25 | #include <mach/regs-gpio.h> | ||
| 26 | #include <mach/regs-clock.h> | ||
| 27 | |||
| 28 | #define eint_offset(irq) ((irq) - IRQ_EINT(0)) | ||
| 29 | |||
| 30 | static int s5p64x0_irq_eint_set_type(struct irq_data *data, unsigned int type) | ||
| 31 | { | ||
| 32 | int offs = eint_offset(data->irq); | ||
| 33 | int shift; | ||
| 34 | u32 ctrl, mask; | ||
| 35 | u32 newvalue = 0; | ||
| 36 | |||
| 37 | if (offs > 15) | ||
| 38 | return -EINVAL; | ||
| 39 | |||
| 40 | switch (type) { | ||
| 41 | case IRQ_TYPE_NONE: | ||
| 42 | printk(KERN_WARNING "No edge setting!\n"); | ||
| 43 | break; | ||
| 44 | case IRQ_TYPE_EDGE_RISING: | ||
| 45 | newvalue = S3C2410_EXTINT_RISEEDGE; | ||
| 46 | break; | ||
| 47 | case IRQ_TYPE_EDGE_FALLING: | ||
| 48 | newvalue = S3C2410_EXTINT_FALLEDGE; | ||
| 49 | break; | ||
| 50 | case IRQ_TYPE_EDGE_BOTH: | ||
| 51 | newvalue = S3C2410_EXTINT_BOTHEDGE; | ||
| 52 | break; | ||
| 53 | case IRQ_TYPE_LEVEL_LOW: | ||
| 54 | newvalue = S3C2410_EXTINT_LOWLEV; | ||
| 55 | break; | ||
| 56 | case IRQ_TYPE_LEVEL_HIGH: | ||
| 57 | newvalue = S3C2410_EXTINT_HILEV; | ||
| 58 | break; | ||
| 59 | default: | ||
| 60 | printk(KERN_ERR "No such irq type %d", type); | ||
| 61 | return -EINVAL; | ||
| 62 | } | ||
| 63 | |||
| 64 | shift = (offs / 2) * 4; | ||
| 65 | mask = 0x7 << shift; | ||
| 66 | |||
| 67 | ctrl = __raw_readl(S5P64X0_EINT0CON0) & ~mask; | ||
| 68 | ctrl |= newvalue << shift; | ||
| 69 | __raw_writel(ctrl, S5P64X0_EINT0CON0); | ||
| 70 | |||
| 71 | /* Configure the GPIO pin for 6450 or 6440 based on CPU ID */ | ||
| 72 | if (soc_is_s5p6450()) | ||
| 73 | s3c_gpio_cfgpin(S5P6450_GPN(offs), S3C_GPIO_SFN(2)); | ||
| 74 | else | ||
| 75 | s3c_gpio_cfgpin(S5P6440_GPN(offs), S3C_GPIO_SFN(2)); | ||
| 76 | |||
| 77 | return 0; | ||
| 78 | } | ||
| 79 | |||
| 80 | /* | ||
| 81 | * s5p64x0_irq_demux_eint | ||
| 82 | * | ||
| 83 | * This function demuxes the IRQ from the group0 external interrupts, | ||
| 84 | * from IRQ_EINT(0) to IRQ_EINT(15). It is designed to be inlined into | ||
| 85 | * the specific handlers s5p64x0_irq_demux_eintX_Y. | ||
| 86 | */ | ||
| 87 | static inline void s5p64x0_irq_demux_eint(unsigned int start, unsigned int end) | ||
| 88 | { | ||
| 89 | u32 status = __raw_readl(S5P64X0_EINT0PEND); | ||
| 90 | u32 mask = __raw_readl(S5P64X0_EINT0MASK); | ||
| 91 | unsigned int irq; | ||
| 92 | |||
| 93 | status &= ~mask; | ||
| 94 | status >>= start; | ||
| 95 | status &= (1 << (end - start + 1)) - 1; | ||
| 96 | |||
| 97 | for (irq = IRQ_EINT(start); irq <= IRQ_EINT(end); irq++) { | ||
| 98 | if (status & 1) | ||
| 99 | generic_handle_irq(irq); | ||
| 100 | status >>= 1; | ||
| 101 | } | ||
| 102 | } | ||
| 103 | |||
| 104 | static void s5p64x0_irq_demux_eint0_3(unsigned int irq, struct irq_desc *desc) | ||
| 105 | { | ||
| 106 | s5p64x0_irq_demux_eint(0, 3); | ||
| 107 | } | ||
| 108 | |||
| 109 | static void s5p64x0_irq_demux_eint4_11(unsigned int irq, struct irq_desc *desc) | ||
| 110 | { | ||
| 111 | s5p64x0_irq_demux_eint(4, 11); | ||
| 112 | } | ||
| 113 | |||
| 114 | static void s5p64x0_irq_demux_eint12_15(unsigned int irq, | ||
| 115 | struct irq_desc *desc) | ||
| 116 | { | ||
| 117 | s5p64x0_irq_demux_eint(12, 15); | ||
| 118 | } | ||
| 119 | |||
| 120 | static int s5p64x0_alloc_gc(void) | ||
| 121 | { | ||
| 122 | struct irq_chip_generic *gc; | ||
| 123 | struct irq_chip_type *ct; | ||
| 124 | |||
| 125 | gc = irq_alloc_generic_chip("s5p64x0-eint", 1, S5P_IRQ_EINT_BASE, | ||
| 126 | S5P_VA_GPIO, handle_level_irq); | ||
| 127 | if (!gc) { | ||
| 128 | printk(KERN_ERR "%s: irq_alloc_generic_chip for group 0" | ||
| 129 | "external interrupts failed\n", __func__); | ||
| 130 | return -EINVAL; | ||
| 131 | } | ||
| 132 | |||
| 133 | ct = gc->chip_types; | ||
| 134 | ct->chip.irq_ack = irq_gc_ack_set_bit; | ||
| 135 | ct->chip.irq_mask = irq_gc_mask_set_bit; | ||
| 136 | ct->chip.irq_unmask = irq_gc_mask_clr_bit; | ||
| 137 | ct->chip.irq_set_type = s5p64x0_irq_eint_set_type; | ||
| 138 | ct->chip.irq_set_wake = s3c_irqext_wake; | ||
| 139 | ct->regs.ack = EINT0PEND_OFFSET; | ||
| 140 | ct->regs.mask = EINT0MASK_OFFSET; | ||
| 141 | irq_setup_generic_chip(gc, IRQ_MSK(16), IRQ_GC_INIT_MASK_CACHE, | ||
| 142 | IRQ_NOREQUEST | IRQ_NOPROBE, 0); | ||
| 143 | return 0; | ||
| 144 | } | ||
| 145 | |||
| 146 | static int __init s5p64x0_init_irq_eint(void) | ||
| 147 | { | ||
| 148 | int ret = s5p64x0_alloc_gc(); | ||
| 149 | irq_set_chained_handler(IRQ_EINT0_3, s5p64x0_irq_demux_eint0_3); | ||
| 150 | irq_set_chained_handler(IRQ_EINT4_11, s5p64x0_irq_demux_eint4_11); | ||
| 151 | irq_set_chained_handler(IRQ_EINT12_15, s5p64x0_irq_demux_eint12_15); | ||
| 152 | |||
| 153 | return ret; | ||
| 154 | } | ||
| 155 | arch_initcall(s5p64x0_init_irq_eint); | ||
diff --git a/arch/arm/mach-s5p64x0/mach-smdk6440.c b/arch/arm/mach-s5p64x0/mach-smdk6440.c index c272c3f7d6d..34d98a1dae5 100644 --- a/arch/arm/mach-s5p64x0/mach-smdk6440.c +++ b/arch/arm/mach-s5p64x0/mach-smdk6440.c | |||
| @@ -41,7 +41,6 @@ | |||
| 41 | 41 | ||
| 42 | #include <plat/regs-serial.h> | 42 | #include <plat/regs-serial.h> |
| 43 | #include <plat/gpio-cfg.h> | 43 | #include <plat/gpio-cfg.h> |
| 44 | #include <plat/s5p6440.h> | ||
| 45 | #include <plat/clock.h> | 44 | #include <plat/clock.h> |
| 46 | #include <plat/devs.h> | 45 | #include <plat/devs.h> |
| 47 | #include <plat/cpu.h> | 46 | #include <plat/cpu.h> |
| @@ -54,6 +53,8 @@ | |||
| 54 | #include <plat/fb.h> | 53 | #include <plat/fb.h> |
| 55 | #include <plat/regs-fb.h> | 54 | #include <plat/regs-fb.h> |
| 56 | 55 | ||
| 56 | #include "common.h" | ||
| 57 | |||
| 57 | #define SMDK6440_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ | 58 | #define SMDK6440_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ |
| 58 | S3C2410_UCON_RXILEVEL | \ | 59 | S3C2410_UCON_RXILEVEL | \ |
| 59 | S3C2410_UCON_TXIRQMODE | \ | 60 | S3C2410_UCON_TXIRQMODE | \ |
| @@ -202,7 +203,7 @@ static struct platform_pwm_backlight_data smdk6440_bl_data = { | |||
| 202 | 203 | ||
| 203 | static void __init smdk6440_map_io(void) | 204 | static void __init smdk6440_map_io(void) |
| 204 | { | 205 | { |
| 205 | s5p_init_io(NULL, 0, S5P64X0_SYS_ID); | 206 | s5p64x0_init_io(NULL, 0); |
| 206 | s3c24xx_init_clocks(12000000); | 207 | s3c24xx_init_clocks(12000000); |
| 207 | s3c24xx_init_uarts(smdk6440_uartcfgs, ARRAY_SIZE(smdk6440_uartcfgs)); | 208 | s3c24xx_init_uarts(smdk6440_uartcfgs, ARRAY_SIZE(smdk6440_uartcfgs)); |
| 208 | s5p_set_timer_source(S5P_PWM3, S5P_PWM4); | 209 | s5p_set_timer_source(S5P_PWM3, S5P_PWM4); |
| @@ -247,4 +248,5 @@ MACHINE_START(SMDK6440, "SMDK6440") | |||
| 247 | .map_io = smdk6440_map_io, | 248 | .map_io = smdk6440_map_io, |
| 248 | .init_machine = smdk6440_machine_init, | 249 | .init_machine = smdk6440_machine_init, |
| 249 | .timer = &s5p_timer, | 250 | .timer = &s5p_timer, |
| 251 | .restart = s5p64x0_restart, | ||
| 250 | MACHINE_END | 252 | MACHINE_END |
diff --git a/arch/arm/mach-s5p64x0/mach-smdk6450.c b/arch/arm/mach-s5p64x0/mach-smdk6450.c index 7a470095961..135cf5d8473 100644 --- a/arch/arm/mach-s5p64x0/mach-smdk6450.c +++ b/arch/arm/mach-s5p64x0/mach-smdk6450.c | |||
| @@ -41,7 +41,6 @@ | |||
| 41 | 41 | ||
| 42 | #include <plat/regs-serial.h> | 42 | #include <plat/regs-serial.h> |
| 43 | #include <plat/gpio-cfg.h> | 43 | #include <plat/gpio-cfg.h> |
| 44 | #include <plat/s5p6450.h> | ||
| 45 | #include <plat/clock.h> | 44 | #include <plat/clock.h> |
| 46 | #include <plat/devs.h> | 45 | #include <plat/devs.h> |
| 47 | #include <plat/cpu.h> | 46 | #include <plat/cpu.h> |
| @@ -54,6 +53,8 @@ | |||
| 54 | #include <plat/fb.h> | 53 | #include <plat/fb.h> |
| 55 | #include <plat/regs-fb.h> | 54 | #include <plat/regs-fb.h> |
| 56 | 55 | ||
| 56 | #include "common.h" | ||
| 57 | |||
| 57 | #define SMDK6450_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ | 58 | #define SMDK6450_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ |
| 58 | S3C2410_UCON_RXILEVEL | \ | 59 | S3C2410_UCON_RXILEVEL | \ |
| 59 | S3C2410_UCON_TXIRQMODE | \ | 60 | S3C2410_UCON_TXIRQMODE | \ |
| @@ -222,7 +223,7 @@ static struct platform_pwm_backlight_data smdk6450_bl_data = { | |||
| 222 | 223 | ||
| 223 | static void __init smdk6450_map_io(void) | 224 | static void __init smdk6450_map_io(void) |
| 224 | { | 225 | { |
| 225 | s5p_init_io(NULL, 0, S5P64X0_SYS_ID); | 226 | s5p64x0_init_io(NULL, 0); |
| 226 | s3c24xx_init_clocks(19200000); | 227 | s3c24xx_init_clocks(19200000); |
| 227 | s3c24xx_init_uarts(smdk6450_uartcfgs, ARRAY_SIZE(smdk6450_uartcfgs)); | 228 | s3c24xx_init_uarts(smdk6450_uartcfgs, ARRAY_SIZE(smdk6450_uartcfgs)); |
| 228 | s5p_set_timer_source(S5P_PWM3, S5P_PWM4); | 229 | s5p_set_timer_source(S5P_PWM3, S5P_PWM4); |
| @@ -267,4 +268,5 @@ MACHINE_START(SMDK6450, "SMDK6450") | |||
| 267 | .map_io = smdk6450_map_io, | 268 | .map_io = smdk6450_map_io, |
| 268 | .init_machine = smdk6450_machine_init, | 269 | .init_machine = smdk6450_machine_init, |
| 269 | .timer = &s5p_timer, | 270 | .timer = &s5p_timer, |
| 271 | .restart = s5p64x0_restart, | ||
| 270 | MACHINE_END | 272 | MACHINE_END |
diff --git a/arch/arm/mach-s5pc100/Makefile b/arch/arm/mach-s5pc100/Makefile index a5e6e608b49..c3166c4d2ac 100644 --- a/arch/arm/mach-s5pc100/Makefile +++ b/arch/arm/mach-s5pc100/Makefile | |||
| @@ -9,28 +9,25 @@ obj-m := | |||
| 9 | obj-n := | 9 | obj-n := |
| 10 | obj- := | 10 | obj- := |
| 11 | 11 | ||
| 12 | # Core support for S5PC100 system | 12 | # Core |
| 13 | 13 | ||
| 14 | obj-$(CONFIG_CPU_S5PC100) += cpu.o init.o clock.o | 14 | obj-y += common.o clock.o |
| 15 | obj-$(CONFIG_CPU_S5PC100) += setup-i2c0.o | ||
| 16 | obj-$(CONFIG_CPU_S5PC100) += dma.o | ||
| 17 | 15 | ||
| 18 | # Helper and device support | 16 | obj-y += dma.o |
| 19 | |||
| 20 | obj-$(CONFIG_S5PC100_SETUP_FB_24BPP) += setup-fb-24bpp.o | ||
| 21 | obj-$(CONFIG_S5PC100_SETUP_I2C1) += setup-i2c1.o | ||
| 22 | obj-$(CONFIG_S5PC100_SETUP_IDE) += setup-ide.o | ||
| 23 | obj-$(CONFIG_S5PC100_SETUP_KEYPAD) += setup-keypad.o | ||
| 24 | obj-$(CONFIG_S5PC100_SETUP_SDHCI) += setup-sdhci.o | ||
| 25 | obj-$(CONFIG_S5PC100_SETUP_SDHCI_GPIO) += setup-sdhci-gpio.o | ||
| 26 | |||
| 27 | # device support | ||
| 28 | obj-y += dev-audio.o | ||
| 29 | obj-$(CONFIG_S3C64XX_DEV_SPI) += dev-spi.o | ||
| 30 | 17 | ||
| 31 | # machine support | 18 | # machine support |
| 32 | 19 | ||
| 33 | obj-$(CONFIG_MACH_SMDKC100) += mach-smdkc100.o | 20 | obj-$(CONFIG_MACH_SMDKC100) += mach-smdkc100.o |
| 34 | 21 | ||
| 35 | # device support | 22 | # device support |
| 23 | |||
| 36 | obj-y += dev-audio.o | 24 | obj-y += dev-audio.o |
| 25 | obj-$(CONFIG_S3C64XX_DEV_SPI) += dev-spi.o | ||
| 26 | |||
| 27 | obj-y += setup-i2c0.o | ||
| 28 | obj-$(CONFIG_S5PC100_SETUP_FB_24BPP) += setup-fb-24bpp.o | ||
| 29 | obj-$(CONFIG_S5PC100_SETUP_I2C1) += setup-i2c1.o | ||
| 30 | obj-$(CONFIG_S5PC100_SETUP_IDE) += setup-ide.o | ||
| 31 | obj-$(CONFIG_S5PC100_SETUP_KEYPAD) += setup-keypad.o | ||
| 32 | obj-$(CONFIG_S5PC100_SETUP_SDHCI) += setup-sdhci.o | ||
| 33 | obj-$(CONFIG_S5PC100_SETUP_SDHCI_GPIO) += setup-sdhci-gpio.o | ||
diff --git a/arch/arm/mach-s5pc100/clock.c b/arch/arm/mach-s5pc100/clock.c index 8d47709da71..c4c74893f53 100644 --- a/arch/arm/mach-s5pc100/clock.c +++ b/arch/arm/mach-s5pc100/clock.c | |||
| @@ -27,7 +27,8 @@ | |||
| 27 | #include <plat/pll.h> | 27 | #include <plat/pll.h> |
| 28 | #include <plat/s5p-clock.h> | 28 | #include <plat/s5p-clock.h> |
| 29 | #include <plat/clock-clksrc.h> | 29 | #include <plat/clock-clksrc.h> |
| 30 | #include <plat/s5pc100.h> | 30 | |
| 31 | #include "common.h" | ||
| 31 | 32 | ||
| 32 | static struct clk s5p_clk_otgphy = { | 33 | static struct clk s5p_clk_otgphy = { |
| 33 | .name = "otg_phy", | 34 | .name = "otg_phy", |
diff --git a/arch/arm/mach-s5pc100/cpu.c b/arch/arm/mach-s5pc100/common.c index fd2708e7d8a..73594a2fcf2 100644 --- a/arch/arm/mach-s5pc100/cpu.c +++ b/arch/arm/mach-s5pc100/common.c | |||
| @@ -1,17 +1,16 @@ | |||
| 1 | /* linux/arch/arm/mach-s5pc100/cpu.c | 1 | /* |
| 2 | * | 2 | * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. |
| 3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
| 4 | * http://www.samsung.com | 3 | * http://www.samsung.com |
| 5 | * | 4 | * |
| 6 | * Copyright 2009 Samsung Electronics Co. | 5 | * Copyright 2009 Samsung Electronics Co. |
| 7 | * Byungho Min <bhmin@samsung.com> | 6 | * Byungho Min <bhmin@samsung.com> |
| 8 | * | 7 | * |
| 9 | * Based on mach-s3c6410/cpu.c | 8 | * Common Codes for S5PC100 |
| 10 | * | 9 | * |
| 11 | * This program is free software; you can redistribute it and/or modify | 10 | * This program is free software; you can redistribute it and/or modify |
| 12 | * it under the terms of the GNU General Public License version 2 as | 11 | * it under the terms of the GNU General Public License version 2 as |
| 13 | * published by the Free Software Foundation. | 12 | * published by the Free Software Foundation. |
| 14 | */ | 13 | */ |
| 15 | 14 | ||
| 16 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
| 17 | #include <linux/types.h> | 16 | #include <linux/types.h> |
| @@ -26,35 +25,73 @@ | |||
| 26 | #include <linux/platform_device.h> | 25 | #include <linux/platform_device.h> |
| 27 | #include <linux/sched.h> | 26 | #include <linux/sched.h> |
| 28 | 27 | ||
| 28 | #include <asm/irq.h> | ||
| 29 | #include <asm/proc-fns.h> | ||
| 29 | #include <asm/mach/arch.h> | 30 | #include <asm/mach/arch.h> |
| 30 | #include <asm/mach/map.h> | 31 | #include <asm/mach/map.h> |
| 31 | #include <asm/mach/irq.h> | 32 | #include <asm/mach/irq.h> |
| 32 | 33 | ||
| 33 | #include <asm/proc-fns.h> | ||
| 34 | |||
| 35 | #include <mach/hardware.h> | ||
| 36 | #include <mach/map.h> | 34 | #include <mach/map.h> |
| 37 | #include <asm/irq.h> | 35 | #include <mach/hardware.h> |
| 38 | |||
| 39 | #include <plat/regs-serial.h> | ||
| 40 | #include <mach/regs-clock.h> | 36 | #include <mach/regs-clock.h> |
| 41 | 37 | ||
| 42 | #include <plat/cpu.h> | 38 | #include <plat/cpu.h> |
| 43 | #include <plat/devs.h> | 39 | #include <plat/devs.h> |
| 44 | #include <plat/clock.h> | 40 | #include <plat/clock.h> |
| 45 | #include <plat/ata-core.h> | ||
| 46 | #include <plat/iic-core.h> | ||
| 47 | #include <plat/sdhci.h> | 41 | #include <plat/sdhci.h> |
| 48 | #include <plat/adc-core.h> | 42 | #include <plat/adc-core.h> |
| 49 | #include <plat/onenand-core.h> | 43 | #include <plat/ata-core.h> |
| 50 | #include <plat/fb-core.h> | 44 | #include <plat/fb-core.h> |
| 45 | #include <plat/iic-core.h> | ||
| 46 | #include <plat/onenand-core.h> | ||
| 47 | #include <plat/regs-serial.h> | ||
| 48 | #include <plat/watchdog-reset.h> | ||
| 49 | |||
| 50 | #include "common.h" | ||
| 51 | |||
| 52 | static const char name_s5pc100[] = "S5PC100"; | ||
| 51 | 53 | ||
| 52 | #include <plat/s5pc100.h> | 54 | static struct cpu_table cpu_ids[] __initdata = { |
| 55 | { | ||
| 56 | .idcode = S5PC100_CPU_ID, | ||
| 57 | .idmask = S5PC100_CPU_MASK, | ||
| 58 | .map_io = s5pc100_map_io, | ||
| 59 | .init_clocks = s5pc100_init_clocks, | ||
| 60 | .init_uarts = s5pc100_init_uarts, | ||
| 61 | .init = s5pc100_init, | ||
| 62 | .name = name_s5pc100, | ||
| 63 | }, | ||
| 64 | }; | ||
| 53 | 65 | ||
| 54 | /* Initial IO mappings */ | 66 | /* Initial IO mappings */ |
| 55 | 67 | ||
| 56 | static struct map_desc s5pc100_iodesc[] __initdata = { | 68 | static struct map_desc s5pc100_iodesc[] __initdata = { |
| 57 | { | 69 | { |
| 70 | .virtual = (unsigned long)S5P_VA_CHIPID, | ||
| 71 | .pfn = __phys_to_pfn(S5PC100_PA_CHIPID), | ||
| 72 | .length = SZ_4K, | ||
| 73 | .type = MT_DEVICE, | ||
| 74 | }, { | ||
| 75 | .virtual = (unsigned long)S3C_VA_SYS, | ||
| 76 | .pfn = __phys_to_pfn(S5PC100_PA_SYSCON), | ||
| 77 | .length = SZ_64K, | ||
| 78 | .type = MT_DEVICE, | ||
| 79 | }, { | ||
| 80 | .virtual = (unsigned long)S3C_VA_TIMER, | ||
| 81 | .pfn = __phys_to_pfn(S5PC100_PA_TIMER), | ||
| 82 | .length = SZ_16K, | ||
| 83 | .type = MT_DEVICE, | ||
| 84 | }, { | ||
| 85 | .virtual = (unsigned long)S3C_VA_WATCHDOG, | ||
| 86 | .pfn = __phys_to_pfn(S5PC100_PA_WATCHDOG), | ||
| 87 | .length = SZ_4K, | ||
| 88 | .type = MT_DEVICE, | ||
| 89 | }, { | ||
| 90 | .virtual = (unsigned long)S5P_VA_SROMC, | ||
| 91 | .pfn = __phys_to_pfn(S5PC100_PA_SROMC), | ||
| 92 | .length = SZ_4K, | ||
| 93 | .type = MT_DEVICE, | ||
| 94 | }, { | ||
| 58 | .virtual = (unsigned long)S5P_VA_SYSTIMER, | 95 | .virtual = (unsigned long)S5P_VA_SYSTIMER, |
| 59 | .pfn = __phys_to_pfn(S5PC100_PA_SYSTIMER), | 96 | .pfn = __phys_to_pfn(S5PC100_PA_SYSTIMER), |
| 60 | .length = SZ_16K, | 97 | .length = SZ_16K, |
| @@ -100,15 +137,27 @@ static void s5pc100_idle(void) | |||
| 100 | local_irq_enable(); | 137 | local_irq_enable(); |
| 101 | } | 138 | } |
| 102 | 139 | ||
| 103 | /* s5pc100_map_io | 140 | /* |
| 141 | * s5pc100_map_io | ||
| 104 | * | 142 | * |
| 105 | * register the standard cpu IO areas | 143 | * register the standard CPU IO areas |
| 106 | */ | 144 | */ |
| 107 | 145 | ||
| 108 | void __init s5pc100_map_io(void) | 146 | void __init s5pc100_init_io(struct map_desc *mach_desc, int size) |
| 109 | { | 147 | { |
| 148 | /* initialize the io descriptors we need for initialization */ | ||
| 110 | iotable_init(s5pc100_iodesc, ARRAY_SIZE(s5pc100_iodesc)); | 149 | iotable_init(s5pc100_iodesc, ARRAY_SIZE(s5pc100_iodesc)); |
| 150 | if (mach_desc) | ||
| 151 | iotable_init(mach_desc, size); | ||
| 152 | |||
| 153 | /* detect cpu id and rev. */ | ||
| 154 | s5p_init_cpu(S5P_VA_CHIPID); | ||
| 111 | 155 | ||
| 156 | s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids)); | ||
| 157 | } | ||
| 158 | |||
| 159 | void __init s5pc100_map_io(void) | ||
| 160 | { | ||
| 112 | /* initialise device information early */ | 161 | /* initialise device information early */ |
| 113 | s5pc100_default_sdhci0(); | 162 | s5pc100_default_sdhci0(); |
| 114 | s5pc100_default_sdhci1(); | 163 | s5pc100_default_sdhci1(); |
| @@ -155,7 +204,6 @@ static int __init s5pc100_core_init(void) | |||
| 155 | { | 204 | { |
| 156 | return sysdev_class_register(&s5pc100_sysclass); | 205 | return sysdev_class_register(&s5pc100_sysclass); |
| 157 | } | 206 | } |
| 158 | |||
| 159 | core_initcall(s5pc100_core_init); | 207 | core_initcall(s5pc100_core_init); |
| 160 | 208 | ||
| 161 | int __init s5pc100_init(void) | 209 | int __init s5pc100_init(void) |
| @@ -167,3 +215,18 @@ int __init s5pc100_init(void) | |||
| 167 | 215 | ||
| 168 | return sysdev_register(&s5pc100_sysdev); | 216 | return sysdev_register(&s5pc100_sysdev); |
| 169 | } | 217 | } |
| 218 | |||
| 219 | /* uart registration process */ | ||
| 220 | |||
| 221 | void __init s5pc100_init_uarts(struct s3c2410_uartcfg *cfg, int no) | ||
| 222 | { | ||
| 223 | s3c24xx_init_uartdevs("s3c6400-uart", s5p_uart_resources, cfg, no); | ||
| 224 | } | ||
| 225 | |||
| 226 | void s5pc100_restart(char mode, const char *cmd) | ||
| 227 | { | ||
| 228 | if (mode != 's') | ||
| 229 | arch_wdt_reset(); | ||
| 230 | |||
| 231 | soft_restart(0); | ||
| 232 | } | ||
diff --git a/arch/arm/mach-s5pc100/common.h b/arch/arm/mach-s5pc100/common.h new file mode 100644 index 00000000000..9fbd3ae2b40 --- /dev/null +++ b/arch/arm/mach-s5pc100/common.h | |||
| @@ -0,0 +1,37 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (c) 2011 Samsung Electronics Co., Ltd. | ||
| 3 | * http://www.samsung.com | ||
| 4 | * | ||
| 5 | * Common Header for S5PC100 machines | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef __ARCH_ARM_MACH_S5PC100_COMMON_H | ||
| 13 | #define __ARCH_ARM_MACH_S5PC100_COMMON_H | ||
| 14 | |||
| 15 | void s5pc100_init_io(struct map_desc *mach_desc, int size); | ||
| 16 | void s5pc100_init_irq(void); | ||
| 17 | |||
| 18 | void s5pc100_register_clocks(void); | ||
| 19 | void s5pc100_setup_clocks(void); | ||
| 20 | |||
| 21 | void s5pc100_restart(char mode, const char *cmd); | ||
| 22 | |||
| 23 | #ifdef CONFIG_CPU_S5PC100 | ||
| 24 | |||
| 25 | extern int s5pc100_init(void); | ||
| 26 | extern void s5pc100_map_io(void); | ||
| 27 | extern void s5pc100_init_clocks(int xtal); | ||
| 28 | extern void s5pc100_init_uarts(struct s3c2410_uartcfg *cfg, int no); | ||
| 29 | |||
| 30 | #else | ||
| 31 | #define s5pc100_init_clocks NULL | ||
| 32 | #define s5pc100_init_uarts NULL | ||
| 33 | #define s5pc100_map_io NULL | ||
| 34 | #define s5pc100_init NULL | ||
| 35 | #endif | ||
| 36 | |||
| 37 | #endif /* __ARCH_ARM_MACH_S5PC100_COMMON_H */ | ||
diff --git a/arch/arm/mach-s5pc100/include/mach/system.h b/arch/arm/mach-s5pc100/include/mach/system.h index a9ea57c0660..afc96c29851 100644 --- a/arch/arm/mach-s5pc100/include/mach/system.h +++ b/arch/arm/mach-s5pc100/include/mach/system.h | |||
| @@ -11,8 +11,6 @@ | |||
| 11 | #ifndef __ASM_ARCH_SYSTEM_H | 11 | #ifndef __ASM_ARCH_SYSTEM_H |
| 12 | #define __ASM_ARCH_SYSTEM_H __FILE__ | 12 | #define __ASM_ARCH_SYSTEM_H __FILE__ |
| 13 | 13 | ||
| 14 | #include <plat/system-reset.h> | ||
| 15 | |||
| 16 | static void arch_idle(void) | 14 | static void arch_idle(void) |
| 17 | { | 15 | { |
| 18 | /* nothing here yet */ | 16 | /* nothing here yet */ |
diff --git a/arch/arm/mach-s5pc100/init.c b/arch/arm/mach-s5pc100/init.c deleted file mode 100644 index 19d7b523c13..00000000000 --- a/arch/arm/mach-s5pc100/init.c +++ /dev/null | |||
| @@ -1,24 +0,0 @@ | |||
| 1 | /* linux/arch/arm/plat-s5pc100/s5pc100-init.c | ||
| 2 | * | ||
| 3 | * Copyright 2009 Samsung Electronics Co. | ||
| 4 | * Byungho Min <bhmin@samsung.com> | ||
| 5 | * | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #include <linux/kernel.h> | ||
| 13 | #include <linux/types.h> | ||
| 14 | #include <linux/init.h> | ||
| 15 | |||
| 16 | #include <plat/cpu.h> | ||
| 17 | #include <plat/devs.h> | ||
| 18 | #include <plat/s5pc100.h> | ||
| 19 | |||
| 20 | /* uart registration process */ | ||
| 21 | void __init s5pc100_common_init_uarts(struct s3c2410_uartcfg *cfg, int no) | ||
| 22 | { | ||
| 23 | s3c24xx_init_uartdevs("s3c6400-uart", s5p_uart_resources, cfg, no); | ||
| 24 | } | ||
diff --git a/arch/arm/mach-s5pc100/mach-smdkc100.c b/arch/arm/mach-s5pc100/mach-smdkc100.c index 93ebe3a92d1..674d22992f3 100644 --- a/arch/arm/mach-s5pc100/mach-smdkc100.c +++ b/arch/arm/mach-s5pc100/mach-smdkc100.c | |||
| @@ -43,7 +43,6 @@ | |||
| 43 | #include <plat/clock.h> | 43 | #include <plat/clock.h> |
| 44 | #include <plat/devs.h> | 44 | #include <plat/devs.h> |
| 45 | #include <plat/cpu.h> | 45 | #include <plat/cpu.h> |
| 46 | #include <plat/s5pc100.h> | ||
| 47 | #include <plat/fb.h> | 46 | #include <plat/fb.h> |
| 48 | #include <plat/iic.h> | 47 | #include <plat/iic.h> |
| 49 | #include <plat/ata.h> | 48 | #include <plat/ata.h> |
| @@ -54,6 +53,8 @@ | |||
| 54 | #include <plat/backlight.h> | 53 | #include <plat/backlight.h> |
| 55 | #include <plat/regs-fb-v4.h> | 54 | #include <plat/regs-fb-v4.h> |
| 56 | 55 | ||
| 56 | #include "common.h" | ||
| 57 | |||
| 57 | /* Following are default values for UCON, ULCON and UFCON UART registers */ | 58 | /* Following are default values for UCON, ULCON and UFCON UART registers */ |
| 58 | #define SMDKC100_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ | 59 | #define SMDKC100_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ |
| 59 | S3C2410_UCON_RXILEVEL | \ | 60 | S3C2410_UCON_RXILEVEL | \ |
| @@ -216,7 +217,7 @@ static struct platform_pwm_backlight_data smdkc100_bl_data = { | |||
| 216 | 217 | ||
| 217 | static void __init smdkc100_map_io(void) | 218 | static void __init smdkc100_map_io(void) |
| 218 | { | 219 | { |
| 219 | s5p_init_io(NULL, 0, S5P_VA_CHIPID); | 220 | s5pc100_init_io(NULL, 0); |
| 220 | s3c24xx_init_clocks(12000000); | 221 | s3c24xx_init_clocks(12000000); |
| 221 | s3c24xx_init_uarts(smdkc100_uartcfgs, ARRAY_SIZE(smdkc100_uartcfgs)); | 222 | s3c24xx_init_uarts(smdkc100_uartcfgs, ARRAY_SIZE(smdkc100_uartcfgs)); |
| 222 | } | 223 | } |
| @@ -255,4 +256,5 @@ MACHINE_START(SMDKC100, "SMDKC100") | |||
| 255 | .map_io = smdkc100_map_io, | 256 | .map_io = smdkc100_map_io, |
| 256 | .init_machine = smdkc100_machine_init, | 257 | .init_machine = smdkc100_machine_init, |
| 257 | .timer = &s3c24xx_timer, | 258 | .timer = &s3c24xx_timer, |
| 259 | .restart = s5pc100_restart, | ||
| 258 | MACHINE_END | 260 | MACHINE_END |
diff --git a/arch/arm/mach-s5pv210/Makefile b/arch/arm/mach-s5pv210/Makefile index 009fbe53df9..4c59186de95 100644 --- a/arch/arm/mach-s5pv210/Makefile +++ b/arch/arm/mach-s5pv210/Makefile | |||
| @@ -10,18 +10,20 @@ obj-m := | |||
| 10 | obj-n := | 10 | obj-n := |
| 11 | obj- := | 11 | obj- := |
| 12 | 12 | ||
| 13 | # Core support for S5PV210 system | 13 | # Core |
| 14 | |||
| 15 | obj-y += common.o clock.o | ||
| 14 | 16 | ||
| 15 | obj-$(CONFIG_CPU_S5PV210) += cpu.o init.o clock.o dma.o | ||
| 16 | obj-$(CONFIG_CPU_S5PV210) += setup-i2c0.o | ||
| 17 | obj-$(CONFIG_PM) += pm.o | 17 | obj-$(CONFIG_PM) += pm.o |
| 18 | 18 | ||
| 19 | obj-y += dma.o | ||
| 20 | |||
| 19 | # machine support | 21 | # machine support |
| 20 | 22 | ||
| 21 | obj-$(CONFIG_MACH_AQUILA) += mach-aquila.o | 23 | obj-$(CONFIG_MACH_AQUILA) += mach-aquila.o |
| 22 | obj-$(CONFIG_MACH_SMDKV210) += mach-smdkv210.o | ||
| 23 | obj-$(CONFIG_MACH_SMDKC110) += mach-smdkc110.o | ||
| 24 | obj-$(CONFIG_MACH_GONI) += mach-goni.o | 24 | obj-$(CONFIG_MACH_GONI) += mach-goni.o |
| 25 | obj-$(CONFIG_MACH_SMDKC110) += mach-smdkc110.o | ||
| 26 | obj-$(CONFIG_MACH_SMDKV210) += mach-smdkv210.o | ||
| 25 | obj-$(CONFIG_MACH_TORBRECK) += mach-torbreck.o | 27 | obj-$(CONFIG_MACH_TORBRECK) += mach-torbreck.o |
| 26 | 28 | ||
| 27 | # device support | 29 | # device support |
| @@ -29,11 +31,12 @@ obj-$(CONFIG_MACH_TORBRECK) += mach-torbreck.o | |||
| 29 | obj-y += dev-audio.o | 31 | obj-y += dev-audio.o |
| 30 | obj-$(CONFIG_S3C64XX_DEV_SPI) += dev-spi.o | 32 | obj-$(CONFIG_S3C64XX_DEV_SPI) += dev-spi.o |
| 31 | 33 | ||
| 34 | obj-y += setup-i2c0.o | ||
| 32 | obj-$(CONFIG_S5PV210_SETUP_FB_24BPP) += setup-fb-24bpp.o | 35 | obj-$(CONFIG_S5PV210_SETUP_FB_24BPP) += setup-fb-24bpp.o |
| 33 | obj-$(CONFIG_S5PV210_SETUP_FIMC) += setup-fimc.o | 36 | obj-$(CONFIG_S5PV210_SETUP_FIMC) += setup-fimc.o |
| 34 | obj-$(CONFIG_S5PV210_SETUP_I2C1) += setup-i2c1.o | 37 | obj-$(CONFIG_S5PV210_SETUP_I2C1) += setup-i2c1.o |
| 35 | obj-$(CONFIG_S5PV210_SETUP_I2C2) += setup-i2c2.o | 38 | obj-$(CONFIG_S5PV210_SETUP_I2C2) += setup-i2c2.o |
| 36 | obj-$(CONFIG_S5PV210_SETUP_IDE) += setup-ide.o | 39 | obj-$(CONFIG_S5PV210_SETUP_IDE) += setup-ide.o |
| 37 | obj-$(CONFIG_S5PV210_SETUP_KEYPAD) += setup-keypad.o | 40 | obj-$(CONFIG_S5PV210_SETUP_KEYPAD) += setup-keypad.o |
| 38 | obj-$(CONFIG_S5PV210_SETUP_SDHCI) += setup-sdhci.o | 41 | obj-$(CONFIG_S5PV210_SETUP_SDHCI) += setup-sdhci.o |
| 39 | obj-$(CONFIG_S5PV210_SETUP_SDHCI_GPIO) += setup-sdhci-gpio.o | 42 | obj-$(CONFIG_S5PV210_SETUP_SDHCI_GPIO) += setup-sdhci-gpio.o |
diff --git a/arch/arm/mach-s5pv210/clock.c b/arch/arm/mach-s5pv210/clock.c index 4c5ac7a69e9..f2dbf5f75a2 100644 --- a/arch/arm/mach-s5pv210/clock.c +++ b/arch/arm/mach-s5pv210/clock.c | |||
| @@ -29,7 +29,8 @@ | |||
| 29 | #include <plat/pll.h> | 29 | #include <plat/pll.h> |
| 30 | #include <plat/s5p-clock.h> | 30 | #include <plat/s5p-clock.h> |
| 31 | #include <plat/clock-clksrc.h> | 31 | #include <plat/clock-clksrc.h> |
| 32 | #include <plat/s5pv210.h> | 32 | |
| 33 | #include "common.h" | ||
| 33 | 34 | ||
| 34 | static unsigned long xtal; | 35 | static unsigned long xtal; |
| 35 | 36 | ||
diff --git a/arch/arm/mach-s5pv210/cpu.c b/arch/arm/mach-s5pv210/common.c index 84ec7463323..a4921bc9f1d 100644 --- a/arch/arm/mach-s5pv210/cpu.c +++ b/arch/arm/mach-s5pv210/common.c | |||
| @@ -1,12 +1,13 @@ | |||
| 1 | /* linux/arch/arm/mach-s5pv210/cpu.c | 1 | /* |
| 2 | * | 2 | * Copyright (c) 2009-2011 Samsung Electronics Co., Ltd. |
| 3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
| 4 | * http://www.samsung.com | 3 | * http://www.samsung.com |
| 5 | * | 4 | * |
| 5 | * Common Codes for S5PV210 | ||
| 6 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | 7 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License version 2 as | 8 | * it under the terms of the GNU General Public License version 2 as |
| 8 | * published by the Free Software Foundation. | 9 | * published by the Free Software Foundation. |
| 9 | */ | 10 | */ |
| 10 | 11 | ||
| 11 | #include <linux/kernel.h> | 12 | #include <linux/kernel.h> |
| 12 | #include <linux/types.h> | 13 | #include <linux/types.h> |
| @@ -21,33 +22,74 @@ | |||
| 21 | #include <linux/platform_device.h> | 22 | #include <linux/platform_device.h> |
| 22 | #include <linux/sched.h> | 23 | #include <linux/sched.h> |
| 23 | #include <linux/dma-mapping.h> | 24 | #include <linux/dma-mapping.h> |
| 25 | #include <linux/serial_core.h> | ||
| 24 | 26 | ||
| 27 | #include <asm/proc-fns.h> | ||
| 25 | #include <asm/mach/arch.h> | 28 | #include <asm/mach/arch.h> |
| 26 | #include <asm/mach/map.h> | 29 | #include <asm/mach/map.h> |
| 27 | #include <asm/mach/irq.h> | 30 | #include <asm/mach/irq.h> |
| 28 | 31 | ||
| 29 | #include <asm/proc-fns.h> | ||
| 30 | #include <mach/map.h> | 32 | #include <mach/map.h> |
| 31 | #include <mach/regs-clock.h> | 33 | #include <mach/regs-clock.h> |
| 32 | 34 | ||
| 33 | #include <plat/cpu.h> | 35 | #include <plat/cpu.h> |
| 34 | #include <plat/devs.h> | ||
| 35 | #include <plat/clock.h> | 36 | #include <plat/clock.h> |
| 36 | #include <plat/fb-core.h> | 37 | #include <plat/devs.h> |
| 37 | #include <plat/s5pv210.h> | 38 | #include <plat/sdhci.h> |
| 38 | #include <plat/adc-core.h> | 39 | #include <plat/adc-core.h> |
| 39 | #include <plat/ata-core.h> | 40 | #include <plat/ata-core.h> |
| 41 | #include <plat/fb-core.h> | ||
| 40 | #include <plat/fimc-core.h> | 42 | #include <plat/fimc-core.h> |
| 41 | #include <plat/iic-core.h> | 43 | #include <plat/iic-core.h> |
| 42 | #include <plat/keypad-core.h> | 44 | #include <plat/keypad-core.h> |
| 43 | #include <plat/sdhci.h> | ||
| 44 | #include <plat/reset.h> | ||
| 45 | #include <plat/tv-core.h> | 45 | #include <plat/tv-core.h> |
| 46 | #include <plat/regs-serial.h> | ||
| 47 | |||
| 48 | #include "common.h" | ||
| 49 | |||
| 50 | static const char name_s5pv210[] = "S5PV210/S5PC110"; | ||
| 51 | |||
| 52 | static struct cpu_table cpu_ids[] __initdata = { | ||
| 53 | { | ||
| 54 | .idcode = S5PV210_CPU_ID, | ||
| 55 | .idmask = S5PV210_CPU_MASK, | ||
| 56 | .map_io = s5pv210_map_io, | ||
| 57 | .init_clocks = s5pv210_init_clocks, | ||
| 58 | .init_uarts = s5pv210_init_uarts, | ||
| 59 | .init = s5pv210_init, | ||
| 60 | .name = name_s5pv210, | ||
| 61 | }, | ||
| 62 | }; | ||
| 46 | 63 | ||
| 47 | /* Initial IO mappings */ | 64 | /* Initial IO mappings */ |
| 48 | 65 | ||
| 49 | static struct map_desc s5pv210_iodesc[] __initdata = { | 66 | static struct map_desc s5pv210_iodesc[] __initdata = { |
| 50 | { | 67 | { |
| 68 | .virtual = (unsigned long)S5P_VA_CHIPID, | ||
| 69 | .pfn = __phys_to_pfn(S5PV210_PA_CHIPID), | ||
| 70 | .length = SZ_4K, | ||
| 71 | .type = MT_DEVICE, | ||
| 72 | }, { | ||
| 73 | .virtual = (unsigned long)S3C_VA_SYS, | ||
| 74 | .pfn = __phys_to_pfn(S5PV210_PA_SYSCON), | ||
| 75 | .length = SZ_64K, | ||
| 76 | .type = MT_DEVICE, | ||
| 77 | }, { | ||
| 78 | .virtual = (unsigned long)S3C_VA_TIMER, | ||
| 79 | .pfn = __phys_to_pfn(S5PV210_PA_TIMER), | ||
| 80 | .length = SZ_16K, | ||
| 81 | .type = MT_DEVICE, | ||
| 82 | }, { | ||
| 83 | .virtual = (unsigned long)S3C_VA_WATCHDOG, | ||
| 84 | .pfn = __phys_to_pfn(S5PV210_PA_WATCHDOG), | ||
| 85 | .length = SZ_4K, | ||
| 86 | .type = MT_DEVICE, | ||
| 87 | }, { | ||
| 88 | .virtual = (unsigned long)S5P_VA_SROMC, | ||
| 89 | .pfn = __phys_to_pfn(S5PV210_PA_SROMC), | ||
| 90 | .length = SZ_4K, | ||
| 91 | .type = MT_DEVICE, | ||
| 92 | }, { | ||
| 51 | .virtual = (unsigned long)S5P_VA_SYSTIMER, | 93 | .virtual = (unsigned long)S5P_VA_SYSTIMER, |
| 52 | .pfn = __phys_to_pfn(S5PV210_PA_SYSTIMER), | 94 | .pfn = __phys_to_pfn(S5PV210_PA_SYSTIMER), |
| 53 | .length = SZ_4K, | 95 | .length = SZ_4K, |
| @@ -108,19 +150,32 @@ static void s5pv210_idle(void) | |||
| 108 | local_irq_enable(); | 150 | local_irq_enable(); |
| 109 | } | 151 | } |
| 110 | 152 | ||
| 111 | static void s5pv210_sw_reset(void) | 153 | void s5pv210_restart(char mode, const char *cmd) |
| 112 | { | 154 | { |
| 113 | __raw_writel(0x1, S5P_SWRESET); | 155 | __raw_writel(0x1, S5P_SWRESET); |
| 114 | } | 156 | } |
| 115 | 157 | ||
| 116 | /* s5pv210_map_io | 158 | /* |
| 159 | * s5pv210_map_io | ||
| 117 | * | 160 | * |
| 118 | * register the standard cpu IO areas | 161 | * register the standard cpu IO areas |
| 119 | */ | 162 | */ |
| 120 | 163 | ||
| 121 | void __init s5pv210_map_io(void) | 164 | void __init s5pv210_init_io(struct map_desc *mach_desc, int size) |
| 122 | { | 165 | { |
| 166 | /* initialize the io descriptors we need for initialization */ | ||
| 123 | iotable_init(s5pv210_iodesc, ARRAY_SIZE(s5pv210_iodesc)); | 167 | iotable_init(s5pv210_iodesc, ARRAY_SIZE(s5pv210_iodesc)); |
| 168 | if (mach_desc) | ||
| 169 | iotable_init(mach_desc, size); | ||
| 170 | |||
| 171 | /* detect cpu id and rev. */ | ||
| 172 | s5p_init_cpu(S5P_VA_CHIPID); | ||
| 173 | |||
| 174 | s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids)); | ||
| 175 | } | ||
| 176 | |||
| 177 | void __init s5pv210_map_io(void) | ||
| 178 | { | ||
| 124 | init_consistent_dma_size(14 << 20); | 179 | init_consistent_dma_size(14 << 20); |
| 125 | 180 | ||
| 126 | /* initialise device information early */ | 181 | /* initialise device information early */ |
| @@ -186,7 +241,6 @@ static int __init s5pv210_core_init(void) | |||
| 186 | { | 241 | { |
| 187 | return sysdev_class_register(&s5pv210_sysclass); | 242 | return sysdev_class_register(&s5pv210_sysclass); |
| 188 | } | 243 | } |
| 189 | |||
| 190 | core_initcall(s5pv210_core_init); | 244 | core_initcall(s5pv210_core_init); |
| 191 | 245 | ||
| 192 | int __init s5pv210_init(void) | 246 | int __init s5pv210_init(void) |
| @@ -196,8 +250,31 @@ int __init s5pv210_init(void) | |||
| 196 | /* set idle function */ | 250 | /* set idle function */ |
| 197 | pm_idle = s5pv210_idle; | 251 | pm_idle = s5pv210_idle; |
| 198 | 252 | ||
| 199 | /* set sw_reset function */ | ||
| 200 | s5p_reset_hook = s5pv210_sw_reset; | ||
| 201 | |||
| 202 | return sysdev_register(&s5pv210_sysdev); | 253 | return sysdev_register(&s5pv210_sysdev); |
| 203 | } | 254 | } |
| 255 | |||
| 256 | static struct s3c24xx_uart_clksrc s5pv210_serial_clocks[] = { | ||
| 257 | [0] = { | ||
| 258 | .name = "pclk", | ||
| 259 | .divisor = 1, | ||
| 260 | .min_baud = 0, | ||
| 261 | .max_baud = 0, | ||
| 262 | }, | ||
| 263 | }; | ||
| 264 | |||
| 265 | /* uart registration process */ | ||
| 266 | |||
| 267 | void __init s5pv210_init_uarts(struct s3c2410_uartcfg *cfg, int no) | ||
| 268 | { | ||
| 269 | struct s3c2410_uartcfg *tcfg = cfg; | ||
| 270 | u32 ucnt; | ||
| 271 | |||
| 272 | for (ucnt = 0; ucnt < no; ucnt++, tcfg++) { | ||
| 273 | if (!tcfg->clocks) { | ||
| 274 | tcfg->clocks = s5pv210_serial_clocks; | ||
| 275 | tcfg->clocks_size = ARRAY_SIZE(s5pv210_serial_clocks); | ||
| 276 | } | ||
| 277 | } | ||
| 278 | |||
| 279 | s3c24xx_init_uartdevs("s5pv210-uart", s5p_uart_resources, cfg, no); | ||
| 280 | } | ||
diff --git a/arch/arm/mach-s5pv210/common.h b/arch/arm/mach-s5pv210/common.h new file mode 100644 index 00000000000..6ed2af5c751 --- /dev/null +++ b/arch/arm/mach-s5pv210/common.h | |||
| @@ -0,0 +1,37 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (c) 2011 Samsung Electronics Co., Ltd. | ||
| 3 | * http://www.samsung.com | ||
| 4 | * | ||
| 5 | * Common Header for S5PV210 machines | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef __ARCH_ARM_MACH_S5PV210_COMMON_H | ||
| 13 | #define __ARCH_ARM_MACH_S5PV210_COMMON_H | ||
| 14 | |||
| 15 | void s5pv210_init_io(struct map_desc *mach_desc, int size); | ||
| 16 | void s5pv210_init_irq(void); | ||
| 17 | |||
| 18 | void s5pv210_register_clocks(void); | ||
| 19 | void s5pv210_setup_clocks(void); | ||
| 20 | |||
| 21 | void s5pv210_restart(char mode, const char *cmd); | ||
| 22 | |||
| 23 | #ifdef CONFIG_CPU_S5PV210 | ||
| 24 | |||
| 25 | extern int s5pv210_init(void); | ||
| 26 | extern void s5pv210_map_io(void); | ||
| 27 | extern void s5pv210_init_clocks(int xtal); | ||
| 28 | extern void s5pv210_init_uarts(struct s3c2410_uartcfg *cfg, int no); | ||
| 29 | |||
| 30 | #else | ||
| 31 | #define s5pv210_init_clocks NULL | ||
| 32 | #define s5pv210_init_uarts NULL | ||
| 33 | #define s5pv210_map_io NULL | ||
| 34 | #define s5pv210_init NULL | ||
| 35 | #endif | ||
| 36 | |||
| 37 | #endif /* __ARCH_ARM_MACH_S5PV210_COMMON_H */ | ||
diff --git a/arch/arm/mach-s5pv210/include/mach/system.h b/arch/arm/mach-s5pv210/include/mach/system.h index af8a200b213..bf288ced860 100644 --- a/arch/arm/mach-s5pv210/include/mach/system.h +++ b/arch/arm/mach-s5pv210/include/mach/system.h | |||
| @@ -13,8 +13,6 @@ | |||
| 13 | #ifndef __ASM_ARCH_SYSTEM_H | 13 | #ifndef __ASM_ARCH_SYSTEM_H |
| 14 | #define __ASM_ARCH_SYSTEM_H __FILE__ | 14 | #define __ASM_ARCH_SYSTEM_H __FILE__ |
| 15 | 15 | ||
| 16 | #include <plat/system-reset.h> | ||
| 17 | |||
| 18 | static void arch_idle(void) | 16 | static void arch_idle(void) |
| 19 | { | 17 | { |
| 20 | /* nothing here yet */ | 18 | /* nothing here yet */ |
diff --git a/arch/arm/mach-s5pv210/init.c b/arch/arm/mach-s5pv210/init.c deleted file mode 100644 index 4865ae2c475..00000000000 --- a/arch/arm/mach-s5pv210/init.c +++ /dev/null | |||
| @@ -1,44 +0,0 @@ | |||
| 1 | /* linux/arch/arm/mach-s5pv210/init.c | ||
| 2 | * | ||
| 3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
| 4 | * http://www.samsung.com/ | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License version 2 as | ||
| 8 | * published by the Free Software Foundation. | ||
| 9 | */ | ||
| 10 | |||
| 11 | #include <linux/kernel.h> | ||
| 12 | #include <linux/types.h> | ||
| 13 | #include <linux/init.h> | ||
| 14 | #include <linux/serial_core.h> | ||
| 15 | |||
| 16 | #include <plat/cpu.h> | ||
| 17 | #include <plat/devs.h> | ||
| 18 | #include <plat/s5pv210.h> | ||
| 19 | #include <plat/regs-serial.h> | ||
| 20 | |||
| 21 | static struct s3c24xx_uart_clksrc s5pv210_serial_clocks[] = { | ||
| 22 | [0] = { | ||
| 23 | .name = "pclk", | ||
| 24 | .divisor = 1, | ||
| 25 | .min_baud = 0, | ||
| 26 | .max_baud = 0, | ||
| 27 | }, | ||
| 28 | }; | ||
| 29 | |||
| 30 | /* uart registration process */ | ||
| 31 | void __init s5pv210_common_init_uarts(struct s3c2410_uartcfg *cfg, int no) | ||
| 32 | { | ||
| 33 | struct s3c2410_uartcfg *tcfg = cfg; | ||
| 34 | u32 ucnt; | ||
| 35 | |||
| 36 | for (ucnt = 0; ucnt < no; ucnt++, tcfg++) { | ||
| 37 | if (!tcfg->clocks) { | ||
| 38 | tcfg->clocks = s5pv210_serial_clocks; | ||
| 39 | tcfg->clocks_size = ARRAY_SIZE(s5pv210_serial_clocks); | ||
| 40 | } | ||
| 41 | } | ||
| 42 | |||
| 43 | s3c24xx_init_uartdevs("s5pv210-uart", s5p_uart_resources, cfg, no); | ||
| 44 | } | ||
diff --git a/arch/arm/mach-s5pv210/mach-aquila.c b/arch/arm/mach-s5pv210/mach-aquila.c index 71ca95604d6..6f7dfe993c1 100644 --- a/arch/arm/mach-s5pv210/mach-aquila.c +++ b/arch/arm/mach-s5pv210/mach-aquila.c | |||
| @@ -33,7 +33,6 @@ | |||
| 33 | 33 | ||
| 34 | #include <plat/gpio-cfg.h> | 34 | #include <plat/gpio-cfg.h> |
| 35 | #include <plat/regs-serial.h> | 35 | #include <plat/regs-serial.h> |
| 36 | #include <plat/s5pv210.h> | ||
| 37 | #include <plat/devs.h> | 36 | #include <plat/devs.h> |
| 38 | #include <plat/cpu.h> | 37 | #include <plat/cpu.h> |
| 39 | #include <plat/fb.h> | 38 | #include <plat/fb.h> |
| @@ -42,6 +41,8 @@ | |||
| 42 | #include <plat/s5p-time.h> | 41 | #include <plat/s5p-time.h> |
| 43 | #include <plat/regs-fb-v4.h> | 42 | #include <plat/regs-fb-v4.h> |
| 44 | 43 | ||
| 44 | #include "common.h" | ||
| 45 | |||
| 45 | /* Following are default values for UCON, ULCON and UFCON UART registers */ | 46 | /* Following are default values for UCON, ULCON and UFCON UART registers */ |
| 46 | #define AQUILA_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ | 47 | #define AQUILA_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ |
| 47 | S3C2410_UCON_RXILEVEL | \ | 48 | S3C2410_UCON_RXILEVEL | \ |
| @@ -645,7 +646,7 @@ static void __init aquila_sound_init(void) | |||
| 645 | 646 | ||
| 646 | static void __init aquila_map_io(void) | 647 | static void __init aquila_map_io(void) |
| 647 | { | 648 | { |
| 648 | s5p_init_io(NULL, 0, S5P_VA_CHIPID); | 649 | s5pv210_init_io(NULL, 0); |
| 649 | s3c24xx_init_clocks(24000000); | 650 | s3c24xx_init_clocks(24000000); |
| 650 | s3c24xx_init_uarts(aquila_uartcfgs, ARRAY_SIZE(aquila_uartcfgs)); | 651 | s3c24xx_init_uarts(aquila_uartcfgs, ARRAY_SIZE(aquila_uartcfgs)); |
| 651 | s5p_set_timer_source(S5P_PWM3, S5P_PWM4); | 652 | s5p_set_timer_source(S5P_PWM3, S5P_PWM4); |
| @@ -685,4 +686,5 @@ MACHINE_START(AQUILA, "Aquila") | |||
| 685 | .map_io = aquila_map_io, | 686 | .map_io = aquila_map_io, |
| 686 | .init_machine = aquila_machine_init, | 687 | .init_machine = aquila_machine_init, |
| 687 | .timer = &s5p_timer, | 688 | .timer = &s5p_timer, |
| 689 | .restart = s5pv210_restart, | ||
| 688 | MACHINE_END | 690 | MACHINE_END |
diff --git a/arch/arm/mach-s5pv210/mach-goni.c b/arch/arm/mach-s5pv210/mach-goni.c index 448fd9ea96f..12c69371739 100644 --- a/arch/arm/mach-s5pv210/mach-goni.c +++ b/arch/arm/mach-s5pv210/mach-goni.c | |||
| @@ -38,7 +38,6 @@ | |||
| 38 | 38 | ||
| 39 | #include <plat/gpio-cfg.h> | 39 | #include <plat/gpio-cfg.h> |
| 40 | #include <plat/regs-serial.h> | 40 | #include <plat/regs-serial.h> |
| 41 | #include <plat/s5pv210.h> | ||
| 42 | #include <plat/devs.h> | 41 | #include <plat/devs.h> |
| 43 | #include <plat/cpu.h> | 42 | #include <plat/cpu.h> |
| 44 | #include <plat/fb.h> | 43 | #include <plat/fb.h> |
| @@ -55,6 +54,8 @@ | |||
| 55 | #include <media/s5p_fimc.h> | 54 | #include <media/s5p_fimc.h> |
| 56 | #include <media/noon010pc30.h> | 55 | #include <media/noon010pc30.h> |
| 57 | 56 | ||
| 57 | #include "common.h" | ||
| 58 | |||
| 58 | /* Following are default values for UCON, ULCON and UFCON UART registers */ | 59 | /* Following are default values for UCON, ULCON and UFCON UART registers */ |
| 59 | #define GONI_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ | 60 | #define GONI_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ |
| 60 | S3C2410_UCON_RXILEVEL | \ | 61 | S3C2410_UCON_RXILEVEL | \ |
| @@ -891,7 +892,7 @@ static void __init goni_sound_init(void) | |||
| 891 | 892 | ||
| 892 | static void __init goni_map_io(void) | 893 | static void __init goni_map_io(void) |
| 893 | { | 894 | { |
| 894 | s5p_init_io(NULL, 0, S5P_VA_CHIPID); | 895 | s5pv210_init_io(NULL, 0); |
| 895 | s3c24xx_init_clocks(24000000); | 896 | s3c24xx_init_clocks(24000000); |
| 896 | s3c24xx_init_uarts(goni_uartcfgs, ARRAY_SIZE(goni_uartcfgs)); | 897 | s3c24xx_init_uarts(goni_uartcfgs, ARRAY_SIZE(goni_uartcfgs)); |
| 897 | s5p_set_timer_source(S5P_PWM3, S5P_PWM4); | 898 | s5p_set_timer_source(S5P_PWM3, S5P_PWM4); |
| @@ -962,4 +963,5 @@ MACHINE_START(GONI, "GONI") | |||
| 962 | .init_machine = goni_machine_init, | 963 | .init_machine = goni_machine_init, |
| 963 | .timer = &s5p_timer, | 964 | .timer = &s5p_timer, |
| 964 | .reserve = &goni_reserve, | 965 | .reserve = &goni_reserve, |
| 966 | .restart = s5pv210_restart, | ||
| 965 | MACHINE_END | 967 | MACHINE_END |
diff --git a/arch/arm/mach-s5pv210/mach-smdkc110.c b/arch/arm/mach-s5pv210/mach-smdkc110.c index c2531ffc720..9405da4ae3a 100644 --- a/arch/arm/mach-s5pv210/mach-smdkc110.c +++ b/arch/arm/mach-s5pv210/mach-smdkc110.c | |||
| @@ -25,7 +25,6 @@ | |||
| 25 | #include <mach/regs-clock.h> | 25 | #include <mach/regs-clock.h> |
| 26 | 26 | ||
| 27 | #include <plat/regs-serial.h> | 27 | #include <plat/regs-serial.h> |
| 28 | #include <plat/s5pv210.h> | ||
| 29 | #include <plat/devs.h> | 28 | #include <plat/devs.h> |
| 30 | #include <plat/cpu.h> | 29 | #include <plat/cpu.h> |
| 31 | #include <plat/ata.h> | 30 | #include <plat/ata.h> |
| @@ -33,6 +32,8 @@ | |||
| 33 | #include <plat/pm.h> | 32 | #include <plat/pm.h> |
| 34 | #include <plat/s5p-time.h> | 33 | #include <plat/s5p-time.h> |
| 35 | 34 | ||
| 35 | #include "common.h" | ||
| 36 | |||
| 36 | /* Following are default values for UCON, ULCON and UFCON UART registers */ | 37 | /* Following are default values for UCON, ULCON and UFCON UART registers */ |
| 37 | #define SMDKC110_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ | 38 | #define SMDKC110_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ |
| 38 | S3C2410_UCON_RXILEVEL | \ | 39 | S3C2410_UCON_RXILEVEL | \ |
| @@ -110,7 +111,7 @@ static struct i2c_board_info smdkc110_i2c_devs2[] __initdata = { | |||
| 110 | 111 | ||
| 111 | static void __init smdkc110_map_io(void) | 112 | static void __init smdkc110_map_io(void) |
| 112 | { | 113 | { |
| 113 | s5p_init_io(NULL, 0, S5P_VA_CHIPID); | 114 | s5pv210_init_io(NULL, 0); |
| 114 | s3c24xx_init_clocks(24000000); | 115 | s3c24xx_init_clocks(24000000); |
| 115 | s3c24xx_init_uarts(smdkv210_uartcfgs, ARRAY_SIZE(smdkv210_uartcfgs)); | 116 | s3c24xx_init_uarts(smdkv210_uartcfgs, ARRAY_SIZE(smdkv210_uartcfgs)); |
| 116 | s5p_set_timer_source(S5P_PWM3, S5P_PWM4); | 117 | s5p_set_timer_source(S5P_PWM3, S5P_PWM4); |
| @@ -143,4 +144,5 @@ MACHINE_START(SMDKC110, "SMDKC110") | |||
| 143 | .map_io = smdkc110_map_io, | 144 | .map_io = smdkc110_map_io, |
| 144 | .init_machine = smdkc110_machine_init, | 145 | .init_machine = smdkc110_machine_init, |
| 145 | .timer = &s5p_timer, | 146 | .timer = &s5p_timer, |
| 147 | .restart = s5pv210_restart, | ||
| 146 | MACHINE_END | 148 | MACHINE_END |
diff --git a/arch/arm/mach-s5pv210/mach-smdkv210.c b/arch/arm/mach-s5pv210/mach-smdkv210.c index 4ca77c41d49..cf4da739382 100644 --- a/arch/arm/mach-s5pv210/mach-smdkv210.c +++ b/arch/arm/mach-s5pv210/mach-smdkv210.c | |||
| @@ -34,7 +34,6 @@ | |||
| 34 | #include <plat/regs-serial.h> | 34 | #include <plat/regs-serial.h> |
| 35 | #include <plat/regs-srom.h> | 35 | #include <plat/regs-srom.h> |
| 36 | #include <plat/gpio-cfg.h> | 36 | #include <plat/gpio-cfg.h> |
| 37 | #include <plat/s5pv210.h> | ||
| 38 | #include <plat/devs.h> | 37 | #include <plat/devs.h> |
| 39 | #include <plat/cpu.h> | 38 | #include <plat/cpu.h> |
| 40 | #include <plat/adc.h> | 39 | #include <plat/adc.h> |
| @@ -48,6 +47,8 @@ | |||
| 48 | #include <plat/backlight.h> | 47 | #include <plat/backlight.h> |
| 49 | #include <plat/regs-fb-v4.h> | 48 | #include <plat/regs-fb-v4.h> |
| 50 | 49 | ||
| 50 | #include "common.h" | ||
| 51 | |||
| 51 | /* Following are default values for UCON, ULCON and UFCON UART registers */ | 52 | /* Following are default values for UCON, ULCON and UFCON UART registers */ |
| 52 | #define SMDKV210_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ | 53 | #define SMDKV210_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ |
| 53 | S3C2410_UCON_RXILEVEL | \ | 54 | S3C2410_UCON_RXILEVEL | \ |
| @@ -274,11 +275,12 @@ static struct samsung_bl_gpio_info smdkv210_bl_gpio_info = { | |||
| 274 | 275 | ||
| 275 | static struct platform_pwm_backlight_data smdkv210_bl_data = { | 276 | static struct platform_pwm_backlight_data smdkv210_bl_data = { |
| 276 | .pwm_id = 3, | 277 | .pwm_id = 3, |
| 278 | .pwm_period_ns = 1000, | ||
| 277 | }; | 279 | }; |
| 278 | 280 | ||
| 279 | static void __init smdkv210_map_io(void) | 281 | static void __init smdkv210_map_io(void) |
| 280 | { | 282 | { |
| 281 | s5p_init_io(NULL, 0, S5P_VA_CHIPID); | 283 | s5pv210_init_io(NULL, 0); |
| 282 | s3c24xx_init_clocks(24000000); | 284 | s3c24xx_init_clocks(24000000); |
| 283 | s3c24xx_init_uarts(smdkv210_uartcfgs, ARRAY_SIZE(smdkv210_uartcfgs)); | 285 | s3c24xx_init_uarts(smdkv210_uartcfgs, ARRAY_SIZE(smdkv210_uartcfgs)); |
| 284 | s5p_set_timer_source(S5P_PWM2, S5P_PWM4); | 286 | s5p_set_timer_source(S5P_PWM2, S5P_PWM4); |
| @@ -320,4 +322,5 @@ MACHINE_START(SMDKV210, "SMDKV210") | |||
| 320 | .map_io = smdkv210_map_io, | 322 | .map_io = smdkv210_map_io, |
| 321 | .init_machine = smdkv210_machine_init, | 323 | .init_machine = smdkv210_machine_init, |
| 322 | .timer = &s5p_timer, | 324 | .timer = &s5p_timer, |
| 325 | .restart = s5pv210_restart, | ||
| 323 | MACHINE_END | 326 | MACHINE_END |
diff --git a/arch/arm/mach-s5pv210/mach-torbreck.c b/arch/arm/mach-s5pv210/mach-torbreck.c index df70fcb3451..74e99bc0dc9 100644 --- a/arch/arm/mach-s5pv210/mach-torbreck.c +++ b/arch/arm/mach-s5pv210/mach-torbreck.c | |||
| @@ -24,12 +24,13 @@ | |||
| 24 | #include <mach/regs-clock.h> | 24 | #include <mach/regs-clock.h> |
| 25 | 25 | ||
| 26 | #include <plat/regs-serial.h> | 26 | #include <plat/regs-serial.h> |
| 27 | #include <plat/s5pv210.h> | ||
| 28 | #include <plat/devs.h> | 27 | #include <plat/devs.h> |
| 29 | #include <plat/cpu.h> | 28 | #include <plat/cpu.h> |
| 30 | #include <plat/iic.h> | 29 | #include <plat/iic.h> |
| 31 | #include <plat/s5p-time.h> | 30 | #include <plat/s5p-time.h> |
| 32 | 31 | ||
| 32 | #include "common.h" | ||
| 33 | |||
| 33 | /* Following are default values for UCON, ULCON and UFCON UART registers */ | 34 | /* Following are default values for UCON, ULCON and UFCON UART registers */ |
| 34 | #define TORBRECK_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ | 35 | #define TORBRECK_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ |
| 35 | S3C2410_UCON_RXILEVEL | \ | 36 | S3C2410_UCON_RXILEVEL | \ |
| @@ -103,7 +104,7 @@ static struct i2c_board_info torbreck_i2c_devs2[] __initdata = { | |||
| 103 | 104 | ||
| 104 | static void __init torbreck_map_io(void) | 105 | static void __init torbreck_map_io(void) |
| 105 | { | 106 | { |
| 106 | s5p_init_io(NULL, 0, S5P_VA_CHIPID); | 107 | s5pv210_init_io(NULL, 0); |
| 107 | s3c24xx_init_clocks(24000000); | 108 | s3c24xx_init_clocks(24000000); |
| 108 | s3c24xx_init_uarts(torbreck_uartcfgs, ARRAY_SIZE(torbreck_uartcfgs)); | 109 | s3c24xx_init_uarts(torbreck_uartcfgs, ARRAY_SIZE(torbreck_uartcfgs)); |
| 109 | s5p_set_timer_source(S5P_PWM3, S5P_PWM4); | 110 | s5p_set_timer_source(S5P_PWM3, S5P_PWM4); |
| @@ -132,4 +133,5 @@ MACHINE_START(TORBRECK, "TORBRECK") | |||
| 132 | .map_io = torbreck_map_io, | 133 | .map_io = torbreck_map_io, |
| 133 | .init_machine = torbreck_machine_init, | 134 | .init_machine = torbreck_machine_init, |
| 134 | .timer = &s5p_timer, | 135 | .timer = &s5p_timer, |
| 136 | .restart = s5pv210_restart, | ||
| 135 | MACHINE_END | 137 | MACHINE_END |
diff --git a/arch/arm/mach-sa1100/assabet.c b/arch/arm/mach-sa1100/assabet.c index 3dd133f1841..6b93e200bca 100644 --- a/arch/arm/mach-sa1100/assabet.c +++ b/arch/arm/mach-sa1100/assabet.c | |||
| @@ -455,4 +455,5 @@ MACHINE_START(ASSABET, "Intel-Assabet") | |||
| 455 | #ifdef CONFIG_SA1111 | 455 | #ifdef CONFIG_SA1111 |
| 456 | .dma_zone_size = SZ_1M, | 456 | .dma_zone_size = SZ_1M, |
| 457 | #endif | 457 | #endif |
| 458 | .restart = sa11x0_restart, | ||
| 458 | MACHINE_END | 459 | MACHINE_END |
diff --git a/arch/arm/mach-sa1100/badge4.c b/arch/arm/mach-sa1100/badge4.c index bda83e1ab07..b07a2c024cb 100644 --- a/arch/arm/mach-sa1100/badge4.c +++ b/arch/arm/mach-sa1100/badge4.c | |||
| @@ -309,4 +309,5 @@ MACHINE_START(BADGE4, "Hewlett-Packard Laboratories BadgePAD 4") | |||
| 309 | #ifdef CONFIG_SA1111 | 309 | #ifdef CONFIG_SA1111 |
| 310 | .dma_zone_size = SZ_1M, | 310 | .dma_zone_size = SZ_1M, |
| 311 | #endif | 311 | #endif |
| 312 | .restart = sa11x0_restart, | ||
| 312 | MACHINE_END | 313 | MACHINE_END |
diff --git a/arch/arm/mach-sa1100/cerf.c b/arch/arm/mach-sa1100/cerf.c index 7f3da4b11ec..11bb6d0b9be 100644 --- a/arch/arm/mach-sa1100/cerf.c +++ b/arch/arm/mach-sa1100/cerf.c | |||
| @@ -139,4 +139,5 @@ MACHINE_START(CERF, "Intrinsyc CerfBoard/CerfCube") | |||
| 139 | .init_irq = cerf_init_irq, | 139 | .init_irq = cerf_init_irq, |
| 140 | .timer = &sa1100_timer, | 140 | .timer = &sa1100_timer, |
| 141 | .init_machine = cerf_init, | 141 | .init_machine = cerf_init, |
| 142 | .restart = sa11x0_restart, | ||
| 142 | MACHINE_END | 143 | MACHINE_END |
diff --git a/arch/arm/mach-sa1100/collie.c b/arch/arm/mach-sa1100/collie.c index 2965cc9d424..b9060e236de 100644 --- a/arch/arm/mach-sa1100/collie.c +++ b/arch/arm/mach-sa1100/collie.c | |||
| @@ -387,4 +387,5 @@ MACHINE_START(COLLIE, "Sharp-Collie") | |||
| 387 | .init_irq = sa1100_init_irq, | 387 | .init_irq = sa1100_init_irq, |
| 388 | .timer = &sa1100_timer, | 388 | .timer = &sa1100_timer, |
| 389 | .init_machine = collie_init, | 389 | .init_machine = collie_init, |
| 390 | .restart = sa11x0_restart, | ||
| 390 | MACHINE_END | 391 | MACHINE_END |
diff --git a/arch/arm/mach-sa1100/generic.c b/arch/arm/mach-sa1100/generic.c index 5fa5ae1f39e..bb10ee2cb89 100644 --- a/arch/arm/mach-sa1100/generic.c +++ b/arch/arm/mach-sa1100/generic.c | |||
| @@ -126,6 +126,17 @@ static void sa1100_power_off(void) | |||
| 126 | PMCR = PMCR_SF; | 126 | PMCR = PMCR_SF; |
| 127 | } | 127 | } |
| 128 | 128 | ||
| 129 | void sa11x0_restart(char mode, const char *cmd) | ||
| 130 | { | ||
| 131 | if (mode == 's') { | ||
| 132 | /* Jump into ROM at address 0 */ | ||
| 133 | soft_restart(0); | ||
| 134 | } else { | ||
| 135 | /* Use on-chip reset capability */ | ||
| 136 | RSRR = RSRR_SWR; | ||
| 137 | } | ||
| 138 | } | ||
| 139 | |||
| 129 | static void sa11x0_register_device(struct platform_device *dev, void *data) | 140 | static void sa11x0_register_device(struct platform_device *dev, void *data) |
| 130 | { | 141 | { |
| 131 | int err; | 142 | int err; |
diff --git a/arch/arm/mach-sa1100/generic.h b/arch/arm/mach-sa1100/generic.h index b7a9a601c2d..33268cf6be3 100644 --- a/arch/arm/mach-sa1100/generic.h +++ b/arch/arm/mach-sa1100/generic.h | |||
| @@ -10,6 +10,7 @@ extern struct sys_timer sa1100_timer; | |||
| 10 | extern void __init sa1100_map_io(void); | 10 | extern void __init sa1100_map_io(void); |
| 11 | extern void __init sa1100_init_irq(void); | 11 | extern void __init sa1100_init_irq(void); |
| 12 | extern void __init sa1100_init_gpio(void); | 12 | extern void __init sa1100_init_gpio(void); |
| 13 | extern void sa11x0_restart(char, const char *); | ||
| 13 | 14 | ||
| 14 | #define SET_BANK(__nr,__start,__size) \ | 15 | #define SET_BANK(__nr,__start,__size) \ |
| 15 | mi->bank[__nr].start = (__start), \ | 16 | mi->bank[__nr].start = (__start), \ |
diff --git a/arch/arm/mach-sa1100/h3100.c b/arch/arm/mach-sa1100/h3100.c index b30733a2b82..1e6b3c105ba 100644 --- a/arch/arm/mach-sa1100/h3100.c +++ b/arch/arm/mach-sa1100/h3100.c | |||
| @@ -89,5 +89,6 @@ MACHINE_START(H3100, "Compaq iPAQ H3100") | |||
| 89 | .init_irq = sa1100_init_irq, | 89 | .init_irq = sa1100_init_irq, |
| 90 | .timer = &sa1100_timer, | 90 | .timer = &sa1100_timer, |
| 91 | .init_machine = h3100_mach_init, | 91 | .init_machine = h3100_mach_init, |
| 92 | .restart = sa11x0_restart, | ||
| 92 | MACHINE_END | 93 | MACHINE_END |
| 93 | 94 | ||
diff --git a/arch/arm/mach-sa1100/h3600.c b/arch/arm/mach-sa1100/h3600.c index 6fd324d9238..6b58e7460ec 100644 --- a/arch/arm/mach-sa1100/h3600.c +++ b/arch/arm/mach-sa1100/h3600.c | |||
| @@ -130,5 +130,6 @@ MACHINE_START(H3600, "Compaq iPAQ H3600") | |||
| 130 | .init_irq = sa1100_init_irq, | 130 | .init_irq = sa1100_init_irq, |
| 131 | .timer = &sa1100_timer, | 131 | .timer = &sa1100_timer, |
| 132 | .init_machine = h3600_mach_init, | 132 | .init_machine = h3600_mach_init, |
| 133 | .restart = sa11x0_restart, | ||
| 133 | MACHINE_END | 134 | MACHINE_END |
| 134 | 135 | ||
diff --git a/arch/arm/mach-sa1100/hackkit.c b/arch/arm/mach-sa1100/hackkit.c index 30f4a551b8e..c01bb36db94 100644 --- a/arch/arm/mach-sa1100/hackkit.c +++ b/arch/arm/mach-sa1100/hackkit.c | |||
| @@ -200,4 +200,5 @@ MACHINE_START(HACKKIT, "HackKit Cpu Board") | |||
| 200 | .init_irq = sa1100_init_irq, | 200 | .init_irq = sa1100_init_irq, |
| 201 | .timer = &sa1100_timer, | 201 | .timer = &sa1100_timer, |
| 202 | .init_machine = hackkit_init, | 202 | .init_machine = hackkit_init, |
| 203 | .restart = sa11x0_restart, | ||
| 203 | MACHINE_END | 204 | MACHINE_END |
diff --git a/arch/arm/mach-sa1100/include/mach/system.h b/arch/arm/mach-sa1100/include/mach/system.h index 345d35b7450..e17b208f76d 100644 --- a/arch/arm/mach-sa1100/include/mach/system.h +++ b/arch/arm/mach-sa1100/include/mach/system.h | |||
| @@ -3,20 +3,7 @@ | |||
| 3 | * | 3 | * |
| 4 | * Copyright (c) 1999 Nicolas Pitre <nico@fluxnic.net> | 4 | * Copyright (c) 1999 Nicolas Pitre <nico@fluxnic.net> |
| 5 | */ | 5 | */ |
| 6 | #include <mach/hardware.h> | ||
| 7 | |||
| 8 | static inline void arch_idle(void) | 6 | static inline void arch_idle(void) |
| 9 | { | 7 | { |
| 10 | cpu_do_idle(); | 8 | cpu_do_idle(); |
| 11 | } | 9 | } |
| 12 | |||
| 13 | static inline void arch_reset(char mode, const char *cmd) | ||
| 14 | { | ||
| 15 | if (mode == 's') { | ||
| 16 | /* Jump into ROM at address 0 */ | ||
| 17 | soft_restart(0); | ||
| 18 | } else { | ||
| 19 | /* Use on-chip reset capability */ | ||
| 20 | RSRR = RSRR_SWR; | ||
| 21 | } | ||
| 22 | } | ||
diff --git a/arch/arm/mach-sa1100/jornada720.c b/arch/arm/mach-sa1100/jornada720.c index 77198fe02bc..ee121d6f048 100644 --- a/arch/arm/mach-sa1100/jornada720.c +++ b/arch/arm/mach-sa1100/jornada720.c | |||
| @@ -373,4 +373,5 @@ MACHINE_START(JORNADA720, "HP Jornada 720") | |||
| 373 | #ifdef CONFIG_SA1111 | 373 | #ifdef CONFIG_SA1111 |
| 374 | .dma_zone_size = SZ_1M, | 374 | .dma_zone_size = SZ_1M, |
| 375 | #endif | 375 | #endif |
| 376 | .restart = sa11x0_restart, | ||
| 376 | MACHINE_END | 377 | MACHINE_END |
diff --git a/arch/arm/mach-sa1100/lart.c b/arch/arm/mach-sa1100/lart.c index 5bc59d0947b..af4e2761f3d 100644 --- a/arch/arm/mach-sa1100/lart.c +++ b/arch/arm/mach-sa1100/lart.c | |||
| @@ -66,4 +66,5 @@ MACHINE_START(LART, "LART") | |||
| 66 | .init_irq = sa1100_init_irq, | 66 | .init_irq = sa1100_init_irq, |
| 67 | .init_machine = lart_init, | 67 | .init_machine = lart_init, |
| 68 | .timer = &sa1100_timer, | 68 | .timer = &sa1100_timer, |
| 69 | .restart = sa11x0_restart, | ||
| 69 | MACHINE_END | 70 | MACHINE_END |
diff --git a/arch/arm/mach-sa1100/nanoengine.c b/arch/arm/mach-sa1100/nanoengine.c index 032f3881d14..ed77f85b995 100644 --- a/arch/arm/mach-sa1100/nanoengine.c +++ b/arch/arm/mach-sa1100/nanoengine.c | |||
| @@ -116,4 +116,5 @@ MACHINE_START(NANOENGINE, "BSE nanoEngine") | |||
| 116 | .init_irq = sa1100_init_irq, | 116 | .init_irq = sa1100_init_irq, |
| 117 | .timer = &sa1100_timer, | 117 | .timer = &sa1100_timer, |
| 118 | .init_machine = nanoengine_init, | 118 | .init_machine = nanoengine_init, |
| 119 | .restart = sa11x0_restart, | ||
| 119 | MACHINE_END | 120 | MACHINE_END |
diff --git a/arch/arm/mach-sa1100/pleb.c b/arch/arm/mach-sa1100/pleb.c index 65161f2bea2..9307df05353 100644 --- a/arch/arm/mach-sa1100/pleb.c +++ b/arch/arm/mach-sa1100/pleb.c | |||
| @@ -150,4 +150,5 @@ MACHINE_START(PLEB, "PLEB") | |||
| 150 | .init_irq = sa1100_init_irq, | 150 | .init_irq = sa1100_init_irq, |
| 151 | .timer = &sa1100_timer, | 151 | .timer = &sa1100_timer, |
| 152 | .init_machine = pleb_init, | 152 | .init_machine = pleb_init, |
| 153 | .restart = sa11x0_restart, | ||
| 153 | MACHINE_END | 154 | MACHINE_END |
diff --git a/arch/arm/mach-sa1100/shannon.c b/arch/arm/mach-sa1100/shannon.c index 1cccbf5b9e9..318b2b766a0 100644 --- a/arch/arm/mach-sa1100/shannon.c +++ b/arch/arm/mach-sa1100/shannon.c | |||
| @@ -87,4 +87,5 @@ MACHINE_START(SHANNON, "Shannon (AKA: Tuxscreen)") | |||
| 87 | .init_irq = sa1100_init_irq, | 87 | .init_irq = sa1100_init_irq, |
| 88 | .timer = &sa1100_timer, | 88 | .timer = &sa1100_timer, |
| 89 | .init_machine = shannon_init, | 89 | .init_machine = shannon_init, |
| 90 | .restart = sa11x0_restart, | ||
| 90 | MACHINE_END | 91 | MACHINE_END |
diff --git a/arch/arm/mach-sa1100/simpad.c b/arch/arm/mach-sa1100/simpad.c index 4790f3f3d00..e17c04d6e32 100644 --- a/arch/arm/mach-sa1100/simpad.c +++ b/arch/arm/mach-sa1100/simpad.c | |||
| @@ -396,4 +396,5 @@ MACHINE_START(SIMPAD, "Simpad") | |||
| 396 | .map_io = simpad_map_io, | 396 | .map_io = simpad_map_io, |
| 397 | .init_irq = sa1100_init_irq, | 397 | .init_irq = sa1100_init_irq, |
| 398 | .timer = &sa1100_timer, | 398 | .timer = &sa1100_timer, |
| 399 | .restart = sa11x0_restart, | ||
| 399 | MACHINE_END | 400 | MACHINE_END |
diff --git a/arch/arm/mach-shark/core.c b/arch/arm/mach-shark/core.c index f4b25d875f3..a851c254ad6 100644 --- a/arch/arm/mach-shark/core.c +++ b/arch/arm/mach-shark/core.c | |||
| @@ -26,7 +26,7 @@ | |||
| 26 | #define ROMCARD_SIZE 0x08000000 | 26 | #define ROMCARD_SIZE 0x08000000 |
| 27 | #define ROMCARD_START 0x10000000 | 27 | #define ROMCARD_START 0x10000000 |
| 28 | 28 | ||
| 29 | void arch_reset(char mode, const char *cmd) | 29 | static void shark_restart(char mode, const char *cmd) |
| 30 | { | 30 | { |
| 31 | short temp; | 31 | short temp; |
| 32 | /* Reset the Machine via pc[3] of the sequoia chipset */ | 32 | /* Reset the Machine via pc[3] of the sequoia chipset */ |
| @@ -156,4 +156,5 @@ MACHINE_START(SHARK, "Shark") | |||
| 156 | .init_irq = shark_init_irq, | 156 | .init_irq = shark_init_irq, |
| 157 | .timer = &shark_timer, | 157 | .timer = &shark_timer, |
| 158 | .dma_zone_size = SZ_4M, | 158 | .dma_zone_size = SZ_4M, |
| 159 | .restart = shark_restart, | ||
| 159 | MACHINE_END | 160 | MACHINE_END |
diff --git a/arch/arm/mach-shark/include/mach/system.h b/arch/arm/mach-shark/include/mach/system.h index 21c373b30bb..1b2f2c5050a 100644 --- a/arch/arm/mach-shark/include/mach/system.h +++ b/arch/arm/mach-shark/include/mach/system.h | |||
| @@ -6,9 +6,6 @@ | |||
| 6 | #ifndef __ASM_ARCH_SYSTEM_H | 6 | #ifndef __ASM_ARCH_SYSTEM_H |
| 7 | #define __ASM_ARCH_SYSTEM_H | 7 | #define __ASM_ARCH_SYSTEM_H |
| 8 | 8 | ||
| 9 | /* Found in arch/mach-shark/core.c */ | ||
| 10 | extern void arch_reset(char mode, const char *cmd); | ||
| 11 | |||
| 12 | static inline void arch_idle(void) | 9 | static inline void arch_idle(void) |
| 13 | { | 10 | { |
| 14 | } | 11 | } |
diff --git a/arch/arm/mach-shmobile/board-ag5evm.c b/arch/arm/mach-shmobile/board-ag5evm.c index 202c3c6ec9d..f71fa3c13c8 100644 --- a/arch/arm/mach-shmobile/board-ag5evm.c +++ b/arch/arm/mach-shmobile/board-ag5evm.c | |||
| @@ -607,6 +607,7 @@ struct sys_timer ag5evm_timer = { | |||
| 607 | 607 | ||
| 608 | MACHINE_START(AG5EVM, "ag5evm") | 608 | MACHINE_START(AG5EVM, "ag5evm") |
| 609 | .map_io = ag5evm_map_io, | 609 | .map_io = ag5evm_map_io, |
| 610 | .nr_irqs = NR_IRQS_LEGACY, | ||
| 610 | .init_irq = sh73a0_init_irq, | 611 | .init_irq = sh73a0_init_irq, |
| 611 | .handle_irq = gic_handle_irq, | 612 | .handle_irq = gic_handle_irq, |
| 612 | .init_machine = ag5evm_init, | 613 | .init_machine = ag5evm_init, |
diff --git a/arch/arm/mach-shmobile/board-kota2.c b/arch/arm/mach-shmobile/board-kota2.c index 1b4439d3f9d..857ceeec1bb 100644 --- a/arch/arm/mach-shmobile/board-kota2.c +++ b/arch/arm/mach-shmobile/board-kota2.c | |||
| @@ -33,6 +33,7 @@ | |||
| 33 | #include <linux/input/sh_keysc.h> | 33 | #include <linux/input/sh_keysc.h> |
| 34 | #include <linux/gpio_keys.h> | 34 | #include <linux/gpio_keys.h> |
| 35 | #include <linux/leds.h> | 35 | #include <linux/leds.h> |
| 36 | #include <linux/platform_data/leds-renesas-tpu.h> | ||
| 36 | #include <linux/mmc/host.h> | 37 | #include <linux/mmc/host.h> |
| 37 | #include <linux/mmc/sh_mmcif.h> | 38 | #include <linux/mmc/sh_mmcif.h> |
| 38 | #include <linux/mfd/tmio.h> | 39 | #include <linux/mfd/tmio.h> |
| @@ -56,7 +57,7 @@ static struct resource smsc9220_resources[] = { | |||
| 56 | .flags = IORESOURCE_MEM, | 57 | .flags = IORESOURCE_MEM, |
| 57 | }, | 58 | }, |
| 58 | [1] = { | 59 | [1] = { |
| 59 | .start = gic_spi(33), /* PINTA2 @ PORT144 */ | 60 | .start = SH73A0_PINT0_IRQ(2), /* PINTA2 */ |
| 60 | .flags = IORESOURCE_IRQ, | 61 | .flags = IORESOURCE_IRQ, |
| 61 | }, | 62 | }, |
| 62 | }; | 63 | }; |
| @@ -157,10 +158,6 @@ static struct platform_device gpio_keys_device = { | |||
| 157 | #define GPIO_LED(n, g) { .name = n, .gpio = g } | 158 | #define GPIO_LED(n, g) { .name = n, .gpio = g } |
| 158 | 159 | ||
| 159 | static struct gpio_led gpio_leds[] = { | 160 | static struct gpio_led gpio_leds[] = { |
| 160 | GPIO_LED("V2513", GPIO_PORT153), /* PORT153 [TPU1T02] -> V2513 */ | ||
| 161 | GPIO_LED("V2514", GPIO_PORT199), /* PORT199 [TPU4TO1] -> V2514 */ | ||
| 162 | GPIO_LED("V2515", GPIO_PORT197), /* PORT197 [TPU2TO1] -> V2515 */ | ||
| 163 | GPIO_LED("KEYLED", GPIO_PORT163), /* PORT163 [TPU3TO0] -> KEYLED */ | ||
| 164 | GPIO_LED("G", GPIO_PORT20), /* PORT20 [GPO0] -> LED7 -> "G" */ | 161 | GPIO_LED("G", GPIO_PORT20), /* PORT20 [GPO0] -> LED7 -> "G" */ |
| 165 | GPIO_LED("H", GPIO_PORT21), /* PORT21 [GPO1] -> LED8 -> "H" */ | 162 | GPIO_LED("H", GPIO_PORT21), /* PORT21 [GPO1] -> LED8 -> "H" */ |
| 166 | GPIO_LED("J", GPIO_PORT22), /* PORT22 [GPO2] -> LED9 -> "J" */ | 163 | GPIO_LED("J", GPIO_PORT22), /* PORT22 [GPO2] -> LED9 -> "J" */ |
| @@ -179,6 +176,119 @@ static struct platform_device gpio_leds_device = { | |||
| 179 | }, | 176 | }, |
| 180 | }; | 177 | }; |
| 181 | 178 | ||
| 179 | /* TPU LED */ | ||
| 180 | static struct led_renesas_tpu_config led_renesas_tpu12_pdata = { | ||
| 181 | .name = "V2513", | ||
| 182 | .pin_gpio_fn = GPIO_FN_TPU1TO2, | ||
| 183 | .pin_gpio = GPIO_PORT153, | ||
| 184 | .channel_offset = 0x90, | ||
| 185 | .timer_bit = 2, | ||
| 186 | .max_brightness = 1000, | ||
| 187 | }; | ||
| 188 | |||
| 189 | static struct resource tpu12_resources[] = { | ||
| 190 | [0] = { | ||
| 191 | .name = "TPU12", | ||
| 192 | .start = 0xe6610090, | ||
| 193 | .end = 0xe66100b5, | ||
| 194 | .flags = IORESOURCE_MEM, | ||
| 195 | }, | ||
| 196 | }; | ||
| 197 | |||
| 198 | static struct platform_device leds_tpu12_device = { | ||
| 199 | .name = "leds-renesas-tpu", | ||
| 200 | .id = 12, | ||
| 201 | .dev = { | ||
| 202 | .platform_data = &led_renesas_tpu12_pdata, | ||
| 203 | }, | ||
| 204 | .num_resources = ARRAY_SIZE(tpu12_resources), | ||
| 205 | .resource = tpu12_resources, | ||
| 206 | }; | ||
| 207 | |||
| 208 | static struct led_renesas_tpu_config led_renesas_tpu41_pdata = { | ||
| 209 | .name = "V2514", | ||
| 210 | .pin_gpio_fn = GPIO_FN_TPU4TO1, | ||
| 211 | .pin_gpio = GPIO_PORT199, | ||
| 212 | .channel_offset = 0x50, | ||
| 213 | .timer_bit = 1, | ||
| 214 | .max_brightness = 1000, | ||
| 215 | }; | ||
| 216 | |||
| 217 | static struct resource tpu41_resources[] = { | ||
| 218 | [0] = { | ||
| 219 | .name = "TPU41", | ||
| 220 | .start = 0xe6640050, | ||
| 221 | .end = 0xe6640075, | ||
| 222 | .flags = IORESOURCE_MEM, | ||
| 223 | }, | ||
| 224 | }; | ||
| 225 | |||
| 226 | static struct platform_device leds_tpu41_device = { | ||
| 227 | .name = "leds-renesas-tpu", | ||
| 228 | .id = 41, | ||
| 229 | .dev = { | ||
| 230 | .platform_data = &led_renesas_tpu41_pdata, | ||
| 231 | }, | ||
| 232 | .num_resources = ARRAY_SIZE(tpu41_resources), | ||
| 233 | .resource = tpu41_resources, | ||
| 234 | }; | ||
| 235 | |||
| 236 | static struct led_renesas_tpu_config led_renesas_tpu21_pdata = { | ||
| 237 | .name = "V2515", | ||
| 238 | .pin_gpio_fn = GPIO_FN_TPU2TO1, | ||
| 239 | .pin_gpio = GPIO_PORT197, | ||
| 240 | .channel_offset = 0x50, | ||
| 241 | .timer_bit = 1, | ||
| 242 | .max_brightness = 1000, | ||
| 243 | }; | ||
| 244 | |||
| 245 | static struct resource tpu21_resources[] = { | ||
| 246 | [0] = { | ||
| 247 | .name = "TPU21", | ||
| 248 | .start = 0xe6620050, | ||
| 249 | .end = 0xe6620075, | ||
| 250 | .flags = IORESOURCE_MEM, | ||
| 251 | }, | ||
| 252 | }; | ||
| 253 | |||
| 254 | static struct platform_device leds_tpu21_device = { | ||
| 255 | .name = "leds-renesas-tpu", | ||
| 256 | .id = 21, | ||
| 257 | .dev = { | ||
| 258 | .platform_data = &led_renesas_tpu21_pdata, | ||
| 259 | }, | ||
| 260 | .num_resources = ARRAY_SIZE(tpu21_resources), | ||
| 261 | .resource = tpu21_resources, | ||
| 262 | }; | ||
| 263 | |||
| 264 | static struct led_renesas_tpu_config led_renesas_tpu30_pdata = { | ||
| 265 | .name = "KEYLED", | ||
| 266 | .pin_gpio_fn = GPIO_FN_TPU3TO0, | ||
| 267 | .pin_gpio = GPIO_PORT163, | ||
| 268 | .channel_offset = 0x10, | ||
| 269 | .timer_bit = 0, | ||
| 270 | .max_brightness = 1000, | ||
| 271 | }; | ||
| 272 | |||
| 273 | static struct resource tpu30_resources[] = { | ||
| 274 | [0] = { | ||
| 275 | .name = "TPU30", | ||
| 276 | .start = 0xe6630010, | ||
| 277 | .end = 0xe6630035, | ||
| 278 | .flags = IORESOURCE_MEM, | ||
| 279 | }, | ||
| 280 | }; | ||
| 281 | |||
| 282 | static struct platform_device leds_tpu30_device = { | ||
| 283 | .name = "leds-renesas-tpu", | ||
| 284 | .id = 30, | ||
| 285 | .dev = { | ||
| 286 | .platform_data = &led_renesas_tpu30_pdata, | ||
| 287 | }, | ||
| 288 | .num_resources = ARRAY_SIZE(tpu30_resources), | ||
| 289 | .resource = tpu30_resources, | ||
| 290 | }; | ||
| 291 | |||
| 182 | /* MMCIF */ | 292 | /* MMCIF */ |
| 183 | static struct resource mmcif_resources[] = { | 293 | static struct resource mmcif_resources[] = { |
| 184 | [0] = { | 294 | [0] = { |
| @@ -291,6 +401,10 @@ static struct platform_device *kota2_devices[] __initdata = { | |||
| 291 | &keysc_device, | 401 | &keysc_device, |
| 292 | &gpio_keys_device, | 402 | &gpio_keys_device, |
| 293 | &gpio_leds_device, | 403 | &gpio_leds_device, |
| 404 | &leds_tpu12_device, | ||
| 405 | &leds_tpu41_device, | ||
| 406 | &leds_tpu21_device, | ||
| 407 | &leds_tpu30_device, | ||
| 294 | &mmcif_device, | 408 | &mmcif_device, |
| 295 | &sdhi0_device, | 409 | &sdhi0_device, |
| 296 | &sdhi1_device, | 410 | &sdhi1_device, |
| @@ -317,18 +431,6 @@ static void __init kota2_map_io(void) | |||
| 317 | shmobile_setup_console(); | 431 | shmobile_setup_console(); |
| 318 | } | 432 | } |
| 319 | 433 | ||
| 320 | #define PINTER0A 0xe69000a0 | ||
| 321 | #define PINTCR0A 0xe69000b0 | ||
| 322 | |||
| 323 | void __init kota2_init_irq(void) | ||
| 324 | { | ||
| 325 | sh73a0_init_irq(); | ||
| 326 | |||
| 327 | /* setup PINT: enable PINTA2 as active low */ | ||
| 328 | __raw_writel(1 << 29, PINTER0A); | ||
| 329 | __raw_writew(2 << 10, PINTCR0A); | ||
| 330 | } | ||
| 331 | |||
| 332 | static void __init kota2_init(void) | 434 | static void __init kota2_init(void) |
| 333 | { | 435 | { |
| 334 | sh73a0_pinmux_init(); | 436 | sh73a0_pinmux_init(); |
| @@ -447,7 +549,8 @@ struct sys_timer kota2_timer = { | |||
| 447 | 549 | ||
| 448 | MACHINE_START(KOTA2, "kota2") | 550 | MACHINE_START(KOTA2, "kota2") |
| 449 | .map_io = kota2_map_io, | 551 | .map_io = kota2_map_io, |
| 450 | .init_irq = kota2_init_irq, | 552 | .nr_irqs = NR_IRQS_LEGACY, |
| 553 | .init_irq = sh73a0_init_irq, | ||
| 451 | .handle_irq = gic_handle_irq, | 554 | .handle_irq = gic_handle_irq, |
| 452 | .init_machine = kota2_init, | 555 | .init_machine = kota2_init, |
| 453 | .timer = &kota2_timer, | 556 | .timer = &kota2_timer, |
diff --git a/arch/arm/mach-shmobile/clock-sh73a0.c b/arch/arm/mach-shmobile/clock-sh73a0.c index 61a846bb30f..1370a89ca35 100644 --- a/arch/arm/mach-shmobile/clock-sh73a0.c +++ b/arch/arm/mach-shmobile/clock-sh73a0.c | |||
| @@ -113,6 +113,12 @@ static struct clk main_clk = { | |||
| 113 | .ops = &main_clk_ops, | 113 | .ops = &main_clk_ops, |
| 114 | }; | 114 | }; |
| 115 | 115 | ||
| 116 | /* Divide Main clock by two */ | ||
| 117 | static struct clk main_div2_clk = { | ||
| 118 | .ops = &div2_clk_ops, | ||
| 119 | .parent = &main_clk, | ||
| 120 | }; | ||
| 121 | |||
| 116 | /* PLL0, PLL1, PLL2, PLL3 */ | 122 | /* PLL0, PLL1, PLL2, PLL3 */ |
| 117 | static unsigned long pll_recalc(struct clk *clk) | 123 | static unsigned long pll_recalc(struct clk *clk) |
| 118 | { | 124 | { |
| @@ -181,6 +187,7 @@ static struct clk *main_clks[] = { | |||
| 181 | &extal1_div2_clk, | 187 | &extal1_div2_clk, |
| 182 | &extal2_div2_clk, | 188 | &extal2_div2_clk, |
| 183 | &main_clk, | 189 | &main_clk, |
| 190 | &main_div2_clk, | ||
| 184 | &pll0_clk, | 191 | &pll0_clk, |
| 185 | &pll1_clk, | 192 | &pll1_clk, |
| 186 | &pll2_clk, | 193 | &pll2_clk, |
| @@ -243,7 +250,7 @@ static struct clk div6_clks[DIV6_NR] = { | |||
| 243 | [DIV6_VCK1] = SH_CLK_DIV6(&pll1_div2_clk, VCLKCR1, 0), | 250 | [DIV6_VCK1] = SH_CLK_DIV6(&pll1_div2_clk, VCLKCR1, 0), |
| 244 | [DIV6_VCK2] = SH_CLK_DIV6(&pll1_div2_clk, VCLKCR2, 0), | 251 | [DIV6_VCK2] = SH_CLK_DIV6(&pll1_div2_clk, VCLKCR2, 0), |
| 245 | [DIV6_VCK3] = SH_CLK_DIV6(&pll1_div2_clk, VCLKCR3, 0), | 252 | [DIV6_VCK3] = SH_CLK_DIV6(&pll1_div2_clk, VCLKCR3, 0), |
| 246 | [DIV6_ZB1] = SH_CLK_DIV6(&pll1_div2_clk, ZBCKCR, 0), | 253 | [DIV6_ZB1] = SH_CLK_DIV6(&pll1_div2_clk, ZBCKCR, CLK_ENABLE_ON_INIT), |
| 247 | [DIV6_FLCTL] = SH_CLK_DIV6(&pll1_div2_clk, FLCKCR, 0), | 254 | [DIV6_FLCTL] = SH_CLK_DIV6(&pll1_div2_clk, FLCKCR, 0), |
| 248 | [DIV6_SDHI0] = SH_CLK_DIV6(&pll1_div2_clk, SD0CKCR, 0), | 255 | [DIV6_SDHI0] = SH_CLK_DIV6(&pll1_div2_clk, SD0CKCR, 0), |
| 249 | [DIV6_SDHI1] = SH_CLK_DIV6(&pll1_div2_clk, SD1CKCR, 0), | 256 | [DIV6_SDHI1] = SH_CLK_DIV6(&pll1_div2_clk, SD1CKCR, 0), |
| @@ -268,6 +275,7 @@ enum { MSTP001, | |||
| 268 | MSTP207, MSTP206, MSTP204, MSTP203, MSTP202, MSTP201, MSTP200, | 275 | MSTP207, MSTP206, MSTP204, MSTP203, MSTP202, MSTP201, MSTP200, |
| 269 | MSTP331, MSTP329, MSTP325, MSTP323, MSTP318, | 276 | MSTP331, MSTP329, MSTP325, MSTP323, MSTP318, |
| 270 | MSTP314, MSTP313, MSTP312, MSTP311, | 277 | MSTP314, MSTP313, MSTP312, MSTP311, |
| 278 | MSTP303, MSTP302, MSTP301, MSTP300, | ||
| 271 | MSTP411, MSTP410, MSTP403, | 279 | MSTP411, MSTP410, MSTP403, |
| 272 | MSTP_NR }; | 280 | MSTP_NR }; |
| 273 | 281 | ||
| @@ -301,6 +309,10 @@ static struct clk mstp_clks[MSTP_NR] = { | |||
| 301 | [MSTP313] = MSTP(&div6_clks[DIV6_SDHI1], SMSTPCR3, 13, 0), /* SDHI1 */ | 309 | [MSTP313] = MSTP(&div6_clks[DIV6_SDHI1], SMSTPCR3, 13, 0), /* SDHI1 */ |
| 302 | [MSTP312] = MSTP(&div4_clks[DIV4_HP], SMSTPCR3, 12, 0), /* MMCIF0 */ | 310 | [MSTP312] = MSTP(&div4_clks[DIV4_HP], SMSTPCR3, 12, 0), /* MMCIF0 */ |
| 303 | [MSTP311] = MSTP(&div6_clks[DIV6_SDHI2], SMSTPCR3, 11, 0), /* SDHI2 */ | 311 | [MSTP311] = MSTP(&div6_clks[DIV6_SDHI2], SMSTPCR3, 11, 0), /* SDHI2 */ |
| 312 | [MSTP303] = MSTP(&main_div2_clk, SMSTPCR3, 3, 0), /* TPU1 */ | ||
| 313 | [MSTP302] = MSTP(&main_div2_clk, SMSTPCR3, 2, 0), /* TPU2 */ | ||
| 314 | [MSTP301] = MSTP(&main_div2_clk, SMSTPCR3, 1, 0), /* TPU3 */ | ||
| 315 | [MSTP300] = MSTP(&main_div2_clk, SMSTPCR3, 0, 0), /* TPU4 */ | ||
| 304 | [MSTP411] = MSTP(&div4_clks[DIV4_HP], SMSTPCR4, 11, 0), /* IIC3 */ | 316 | [MSTP411] = MSTP(&div4_clks[DIV4_HP], SMSTPCR4, 11, 0), /* IIC3 */ |
| 305 | [MSTP410] = MSTP(&div4_clks[DIV4_HP], SMSTPCR4, 10, 0), /* IIC4 */ | 317 | [MSTP410] = MSTP(&div4_clks[DIV4_HP], SMSTPCR4, 10, 0), /* IIC4 */ |
| 306 | [MSTP403] = MSTP(&r_clk, SMSTPCR4, 3, 0), /* KEYSC */ | 318 | [MSTP403] = MSTP(&r_clk, SMSTPCR4, 3, 0), /* KEYSC */ |
| @@ -350,6 +362,10 @@ static struct clk_lookup lookups[] = { | |||
| 350 | CLKDEV_DEV_ID("sh_mobile_sdhi.1", &mstp_clks[MSTP313]), /* SDHI1 */ | 362 | CLKDEV_DEV_ID("sh_mobile_sdhi.1", &mstp_clks[MSTP313]), /* SDHI1 */ |
| 351 | CLKDEV_DEV_ID("sh_mmcif.0", &mstp_clks[MSTP312]), /* MMCIF0 */ | 363 | CLKDEV_DEV_ID("sh_mmcif.0", &mstp_clks[MSTP312]), /* MMCIF0 */ |
| 352 | CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP311]), /* SDHI2 */ | 364 | CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP311]), /* SDHI2 */ |
| 365 | CLKDEV_DEV_ID("leds-renesas-tpu.12", &mstp_clks[MSTP303]), /* TPU1 */ | ||
| 366 | CLKDEV_DEV_ID("leds-renesas-tpu.21", &mstp_clks[MSTP302]), /* TPU2 */ | ||
| 367 | CLKDEV_DEV_ID("leds-renesas-tpu.30", &mstp_clks[MSTP301]), /* TPU3 */ | ||
| 368 | CLKDEV_DEV_ID("leds-renesas-tpu.41", &mstp_clks[MSTP300]), /* TPU4 */ | ||
| 353 | CLKDEV_DEV_ID("i2c-sh_mobile.3", &mstp_clks[MSTP411]), /* I2C3 */ | 369 | CLKDEV_DEV_ID("i2c-sh_mobile.3", &mstp_clks[MSTP411]), /* I2C3 */ |
| 354 | CLKDEV_DEV_ID("i2c-sh_mobile.4", &mstp_clks[MSTP410]), /* I2C4 */ | 370 | CLKDEV_DEV_ID("i2c-sh_mobile.4", &mstp_clks[MSTP410]), /* I2C4 */ |
| 355 | CLKDEV_DEV_ID("sh_keysc.0", &mstp_clks[MSTP403]), /* KEYSC */ | 371 | CLKDEV_DEV_ID("sh_keysc.0", &mstp_clks[MSTP403]), /* KEYSC */ |
diff --git a/arch/arm/mach-spear3xx/include/mach/generic.h b/arch/arm/mach-spear3xx/include/mach/generic.h index b8f31c3935f..14276e5a98d 100644 --- a/arch/arm/mach-spear3xx/include/mach/generic.h +++ b/arch/arm/mach-spear3xx/include/mach/generic.h | |||
| @@ -42,6 +42,8 @@ void __init spear3xx_map_io(void); | |||
| 42 | void __init spear3xx_init_irq(void); | 42 | void __init spear3xx_init_irq(void); |
| 43 | void __init spear3xx_init(void); | 43 | void __init spear3xx_init(void); |
| 44 | 44 | ||
| 45 | void spear_restart(char, const char *); | ||
| 46 | |||
| 45 | /* pad mux declarations */ | 47 | /* pad mux declarations */ |
| 46 | #define PMX_FIRDA_MASK (1 << 14) | 48 | #define PMX_FIRDA_MASK (1 << 14) |
| 47 | #define PMX_I2C_MASK (1 << 13) | 49 | #define PMX_I2C_MASK (1 << 13) |
diff --git a/arch/arm/mach-spear3xx/spear300_evb.c b/arch/arm/mach-spear3xx/spear300_evb.c index 61068ba6792..3462ab9d612 100644 --- a/arch/arm/mach-spear3xx/spear300_evb.c +++ b/arch/arm/mach-spear3xx/spear300_evb.c | |||
| @@ -71,4 +71,5 @@ MACHINE_START(SPEAR300, "ST-SPEAR300-EVB") | |||
| 71 | .handle_irq = vic_handle_irq, | 71 | .handle_irq = vic_handle_irq, |
| 72 | .timer = &spear3xx_timer, | 72 | .timer = &spear3xx_timer, |
| 73 | .init_machine = spear300_evb_init, | 73 | .init_machine = spear300_evb_init, |
| 74 | .restart = spear_restart, | ||
| 74 | MACHINE_END | 75 | MACHINE_END |
diff --git a/arch/arm/mach-spear3xx/spear310_evb.c b/arch/arm/mach-spear3xx/spear310_evb.c index 7903abe92bf..f92c4993f65 100644 --- a/arch/arm/mach-spear3xx/spear310_evb.c +++ b/arch/arm/mach-spear3xx/spear310_evb.c | |||
| @@ -77,4 +77,5 @@ MACHINE_START(SPEAR310, "ST-SPEAR310-EVB") | |||
| 77 | .handle_irq = vic_handle_irq, | 77 | .handle_irq = vic_handle_irq, |
| 78 | .timer = &spear3xx_timer, | 78 | .timer = &spear3xx_timer, |
| 79 | .init_machine = spear310_evb_init, | 79 | .init_machine = spear310_evb_init, |
| 80 | .restart = spear_restart, | ||
| 80 | MACHINE_END | 81 | MACHINE_END |
diff --git a/arch/arm/mach-spear3xx/spear320_evb.c b/arch/arm/mach-spear3xx/spear320_evb.c index e9751f97093..105334ab702 100644 --- a/arch/arm/mach-spear3xx/spear320_evb.c +++ b/arch/arm/mach-spear3xx/spear320_evb.c | |||
| @@ -75,4 +75,5 @@ MACHINE_START(SPEAR320, "ST-SPEAR320-EVB") | |||
| 75 | .handle_irq = vic_handle_irq, | 75 | .handle_irq = vic_handle_irq, |
| 76 | .timer = &spear3xx_timer, | 76 | .timer = &spear3xx_timer, |
| 77 | .init_machine = spear320_evb_init, | 77 | .init_machine = spear320_evb_init, |
| 78 | .restart = spear_restart, | ||
| 78 | MACHINE_END | 79 | MACHINE_END |
diff --git a/arch/arm/mach-spear6xx/include/mach/generic.h b/arch/arm/mach-spear6xx/include/mach/generic.h index 183f0238c5e..116b99301cf 100644 --- a/arch/arm/mach-spear6xx/include/mach/generic.h +++ b/arch/arm/mach-spear6xx/include/mach/generic.h | |||
| @@ -41,6 +41,8 @@ void __init spear6xx_init(void); | |||
| 41 | void __init spear600_init(void); | 41 | void __init spear600_init(void); |
| 42 | void __init spear6xx_clk_init(void); | 42 | void __init spear6xx_clk_init(void); |
| 43 | 43 | ||
| 44 | void spear_restart(char, const char *); | ||
| 45 | |||
| 44 | /* Add spear600 machine device structure declarations here */ | 46 | /* Add spear600 machine device structure declarations here */ |
| 45 | 47 | ||
| 46 | #endif /* __MACH_GENERIC_H */ | 48 | #endif /* __MACH_GENERIC_H */ |
diff --git a/arch/arm/mach-spear6xx/spear600_evb.c b/arch/arm/mach-spear6xx/spear600_evb.c index ff139ed0a61..c6e4254741c 100644 --- a/arch/arm/mach-spear6xx/spear600_evb.c +++ b/arch/arm/mach-spear6xx/spear600_evb.c | |||
| @@ -50,4 +50,5 @@ MACHINE_START(SPEAR600, "ST-SPEAR600-EVB") | |||
| 50 | .handle_irq = vic_handle_irq, | 50 | .handle_irq = vic_handle_irq, |
| 51 | .timer = &spear6xx_timer, | 51 | .timer = &spear6xx_timer, |
| 52 | .init_machine = spear600_evb_init, | 52 | .init_machine = spear600_evb_init, |
| 53 | .restart = spear_restart, | ||
| 53 | MACHINE_END | 54 | MACHINE_END |
diff --git a/arch/arm/mach-tcc8k/Kconfig b/arch/arm/mach-tcc8k/Kconfig deleted file mode 100644 index ad86415d157..00000000000 --- a/arch/arm/mach-tcc8k/Kconfig +++ /dev/null | |||
| @@ -1,11 +0,0 @@ | |||
| 1 | if ARCH_TCC8K | ||
| 2 | |||
| 3 | comment "TCC8000 systems:" | ||
| 4 | |||
| 5 | config MACH_TCC8000_SDK | ||
| 6 | bool "Telechips TCC8000-SDK development kit" | ||
| 7 | default y | ||
| 8 | help | ||
| 9 | Support for the Telechips TCC8000-SDK board. | ||
| 10 | |||
| 11 | endif | ||
diff --git a/arch/arm/mach-tcc8k/Makefile b/arch/arm/mach-tcc8k/Makefile deleted file mode 100644 index 9bacf31e49b..00000000000 --- a/arch/arm/mach-tcc8k/Makefile +++ /dev/null | |||
| @@ -1,9 +0,0 @@ | |||
| 1 | # | ||
| 2 | # Makefile for TCC8K boards and common files. | ||
| 3 | # | ||
| 4 | |||
| 5 | # Common support | ||
| 6 | obj-y += clock.o irq.o time.o io.o devices.o | ||
| 7 | |||
| 8 | # Board specific support | ||
| 9 | obj-$(CONFIG_MACH_TCC8000_SDK) += board-tcc8000-sdk.o | ||
diff --git a/arch/arm/mach-tcc8k/Makefile.boot b/arch/arm/mach-tcc8k/Makefile.boot deleted file mode 100644 index 5e02d4156b0..00000000000 --- a/arch/arm/mach-tcc8k/Makefile.boot +++ /dev/null | |||
| @@ -1,3 +0,0 @@ | |||
| 1 | zreladdr-y += 0x20008000 | ||
| 2 | params_phys-y := 0x20000100 | ||
| 3 | initrd_phys-y := 0x20800000 | ||
diff --git a/arch/arm/mach-tcc8k/board-tcc8000-sdk.c b/arch/arm/mach-tcc8k/board-tcc8000-sdk.c deleted file mode 100644 index 777a5bb9eed..00000000000 --- a/arch/arm/mach-tcc8k/board-tcc8000-sdk.c +++ /dev/null | |||
| @@ -1,81 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2009 Hans J. Koch <hjk@linutronix.de> | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify | ||
| 5 | * it under the terms of the GNU General Public License version 2 as | ||
| 6 | * published by the Free Software Foundation. | ||
| 7 | */ | ||
| 8 | |||
| 9 | #include <linux/delay.h> | ||
| 10 | #include <linux/init.h> | ||
| 11 | #include <linux/kernel.h> | ||
| 12 | #include <linux/platform_device.h> | ||
| 13 | |||
| 14 | #include <asm/mach-types.h> | ||
| 15 | |||
| 16 | #include <asm/mach/arch.h> | ||
| 17 | #include <asm/mach/map.h> | ||
| 18 | #include <asm/mach/time.h> | ||
| 19 | |||
| 20 | #include <mach/clock.h> | ||
| 21 | #include <mach/tcc-nand.h> | ||
| 22 | #include <mach/tcc8k-regs.h> | ||
| 23 | |||
| 24 | #include "common.h" | ||
| 25 | |||
| 26 | #define XI_FREQUENCY 12000000 | ||
| 27 | #define XTI_FREQUENCY 32768 | ||
| 28 | |||
| 29 | #ifdef CONFIG_MTD_NAND_TCC | ||
| 30 | /* NAND */ | ||
| 31 | static struct tcc_nand_platform_data tcc8k_sdk_nand_data = { | ||
| 32 | .width = 1, | ||
| 33 | .hw_ecc = 0, | ||
| 34 | }; | ||
| 35 | #endif | ||
| 36 | |||
| 37 | static void __init tcc8k_init(void) | ||
| 38 | { | ||
| 39 | #ifdef CONFIG_MTD_NAND_TCC | ||
| 40 | tcc_nand_device.dev.platform_data = &tcc8k_sdk_nand_data; | ||
| 41 | platform_device_register(&tcc_nand_device); | ||
| 42 | #endif | ||
| 43 | } | ||
| 44 | |||
| 45 | static void __init tcc8k_init_timer(void) | ||
| 46 | { | ||
| 47 | tcc_clocks_init(XI_FREQUENCY, XTI_FREQUENCY); | ||
| 48 | } | ||
| 49 | |||
| 50 | static struct sys_timer tcc8k_timer = { | ||
| 51 | .init = tcc8k_init_timer, | ||
| 52 | }; | ||
| 53 | |||
| 54 | static void __init tcc8k_map_io(void) | ||
| 55 | { | ||
| 56 | tcc8k_map_common_io(); | ||
| 57 | |||
| 58 | /* set PLL0 clock to 96MHz, adapt UART0 divisor */ | ||
| 59 | __raw_writel(0x00026003, CKC_BASE + PLL0CFG_OFFS); | ||
| 60 | __raw_writel(0x10000001, CKC_BASE + ACLKUART0_OFFS); | ||
| 61 | |||
| 62 | /* set PLL1 clock to 192MHz */ | ||
| 63 | __raw_writel(0x00016003, CKC_BASE + PLL1CFG_OFFS); | ||
| 64 | |||
| 65 | /* set PLL2 clock to 48MHz */ | ||
| 66 | __raw_writel(0x00036003, CKC_BASE + PLL2CFG_OFFS); | ||
| 67 | |||
| 68 | /* with CPU freq higher than 150 MHz, need extra DTCM wait */ | ||
| 69 | __raw_writel(0x00000001, SCFG_BASE + DTCMWAIT_OFFS); | ||
| 70 | |||
| 71 | /* PLL locking time as specified */ | ||
| 72 | udelay(300); | ||
| 73 | } | ||
| 74 | |||
| 75 | MACHINE_START(TCC8000_SDK, "Telechips TCC8000-SDK Demo Board") | ||
| 76 | .atag_offset = 0x100, | ||
| 77 | .map_io = tcc8k_map_io, | ||
| 78 | .init_irq = tcc8k_init_irq, | ||
| 79 | .init_machine = tcc8k_init, | ||
| 80 | .timer = &tcc8k_timer, | ||
| 81 | MACHINE_END | ||
diff --git a/arch/arm/mach-tcc8k/clock.c b/arch/arm/mach-tcc8k/clock.c deleted file mode 100644 index e7cdae5c77a..00000000000 --- a/arch/arm/mach-tcc8k/clock.c +++ /dev/null | |||
| @@ -1,580 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Lowlevel clock handling for Telechips TCC8xxx SoCs | ||
| 3 | * | ||
| 4 | * Copyright (C) 2010 by Hans J. Koch <hjk@linutronix.de> | ||
| 5 | * | ||
| 6 | * Licensed under the terms of the GPL v2 | ||
| 7 | */ | ||
| 8 | |||
| 9 | #include <linux/clk.h> | ||
| 10 | #include <linux/delay.h> | ||
| 11 | #include <linux/err.h> | ||
| 12 | #include <linux/io.h> | ||
| 13 | #include <linux/module.h> | ||
| 14 | #include <linux/spinlock.h> | ||
| 15 | #include <linux/clkdev.h> | ||
| 16 | |||
| 17 | #include <mach/clock.h> | ||
| 18 | #include <mach/irqs.h> | ||
| 19 | #include <mach/tcc8k-regs.h> | ||
| 20 | |||
| 21 | #include "common.h" | ||
| 22 | |||
| 23 | #define BCLKCTR0 (CKC_BASE + BCLKCTR0_OFFS) | ||
| 24 | #define BCLKCTR1 (CKC_BASE + BCLKCTR1_OFFS) | ||
| 25 | |||
| 26 | #define ACLKREF (CKC_BASE + ACLKREF_OFFS) | ||
| 27 | #define ACLKUART0 (CKC_BASE + ACLKUART0_OFFS) | ||
| 28 | #define ACLKUART1 (CKC_BASE + ACLKUART1_OFFS) | ||
| 29 | #define ACLKUART2 (CKC_BASE + ACLKUART2_OFFS) | ||
| 30 | #define ACLKUART3 (CKC_BASE + ACLKUART3_OFFS) | ||
| 31 | #define ACLKUART4 (CKC_BASE + ACLKUART4_OFFS) | ||
| 32 | #define ACLKI2C (CKC_BASE + ACLKI2C_OFFS) | ||
| 33 | #define ACLKADC (CKC_BASE + ACLKADC_OFFS) | ||
| 34 | #define ACLKUSBH (CKC_BASE + ACLKUSBH_OFFS) | ||
| 35 | #define ACLKLCD (CKC_BASE + ACLKLCD_OFFS) | ||
| 36 | #define ACLKSDH0 (CKC_BASE + ACLKSDH0_OFFS) | ||
| 37 | #define ACLKSDH1 (CKC_BASE + ACLKSDH1_OFFS) | ||
| 38 | #define ACLKSPI0 (CKC_BASE + ACLKSPI0_OFFS) | ||
| 39 | #define ACLKSPI1 (CKC_BASE + ACLKSPI1_OFFS) | ||
| 40 | #define ACLKSPDIF (CKC_BASE + ACLKSPDIF_OFFS) | ||
| 41 | #define ACLKC3DEC (CKC_BASE + ACLKC3DEC_OFFS) | ||
| 42 | #define ACLKCAN0 (CKC_BASE + ACLKCAN0_OFFS) | ||
| 43 | #define ACLKCAN1 (CKC_BASE + ACLKCAN1_OFFS) | ||
| 44 | #define ACLKGSB0 (CKC_BASE + ACLKGSB0_OFFS) | ||
| 45 | #define ACLKGSB1 (CKC_BASE + ACLKGSB1_OFFS) | ||
| 46 | #define ACLKGSB2 (CKC_BASE + ACLKGSB2_OFFS) | ||
| 47 | #define ACLKGSB3 (CKC_BASE + ACLKGSB3_OFFS) | ||
| 48 | #define ACLKTCT (CKC_BASE + ACLKTCT_OFFS) | ||
| 49 | #define ACLKTCX (CKC_BASE + ACLKTCX_OFFS) | ||
| 50 | #define ACLKTCZ (CKC_BASE + ACLKTCZ_OFFS) | ||
| 51 | |||
| 52 | #define ACLK_MAX_DIV (0xfff + 1) | ||
| 53 | |||
| 54 | /* Crystal frequencies */ | ||
| 55 | static unsigned long xi_rate, xti_rate; | ||
| 56 | |||
| 57 | static void __iomem *pll_cfg_addr(int pll) | ||
| 58 | { | ||
| 59 | switch (pll) { | ||
| 60 | case 0: return (CKC_BASE + PLL0CFG_OFFS); | ||
| 61 | case 1: return (CKC_BASE + PLL1CFG_OFFS); | ||
| 62 | case 2: return (CKC_BASE + PLL2CFG_OFFS); | ||
| 63 | default: | ||
| 64 | BUG(); | ||
| 65 | } | ||
| 66 | } | ||
| 67 | |||
| 68 | static int pll_enable(int pll, int enable) | ||
| 69 | { | ||
| 70 | u32 reg; | ||
| 71 | void __iomem *addr = pll_cfg_addr(pll); | ||
| 72 | |||
| 73 | reg = __raw_readl(addr); | ||
| 74 | if (enable) | ||
| 75 | reg &= ~PLLxCFG_PD; | ||
| 76 | else | ||
| 77 | reg |= PLLxCFG_PD; | ||
| 78 | |||
| 79 | __raw_writel(reg, addr); | ||
| 80 | return 0; | ||
| 81 | } | ||
| 82 | |||
| 83 | static int xi_enable(int enable) | ||
| 84 | { | ||
| 85 | u32 reg; | ||
| 86 | |||
| 87 | reg = __raw_readl(CKC_BASE + CLKCTRL_OFFS); | ||
| 88 | if (enable) | ||
| 89 | reg |= CLKCTRL_XE; | ||
| 90 | else | ||
| 91 | reg &= ~CLKCTRL_XE; | ||
| 92 | |||
| 93 | __raw_writel(reg, CKC_BASE + CLKCTRL_OFFS); | ||
| 94 | return 0; | ||
| 95 | } | ||
| 96 | |||
| 97 | static int root_clk_enable(enum root_clks src) | ||
| 98 | { | ||
| 99 | switch (src) { | ||
| 100 | case CLK_SRC_PLL0: return pll_enable(0, 1); | ||
| 101 | case CLK_SRC_PLL1: return pll_enable(1, 1); | ||
| 102 | case CLK_SRC_PLL2: return pll_enable(2, 1); | ||
| 103 | case CLK_SRC_XI: return xi_enable(1); | ||
| 104 | default: | ||
| 105 | BUG(); | ||
| 106 | } | ||
| 107 | return 0; | ||
| 108 | } | ||
| 109 | |||
| 110 | static int root_clk_disable(enum root_clks src) | ||
| 111 | { | ||
| 112 | switch (src) { | ||
| 113 | case CLK_SRC_PLL0: return pll_enable(0, 0); | ||
| 114 | case CLK_SRC_PLL1: return pll_enable(1, 0); | ||
| 115 | case CLK_SRC_PLL2: return pll_enable(2, 0); | ||
| 116 | case CLK_SRC_XI: return xi_enable(0); | ||
| 117 | default: | ||
| 118 | BUG(); | ||
| 119 | } | ||
| 120 | return 0; | ||
| 121 | } | ||
| 122 | |||
| 123 | static int enable_clk(struct clk *clk) | ||
| 124 | { | ||
| 125 | u32 reg; | ||
| 126 | |||
| 127 | if (clk->root_id != CLK_SRC_NOROOT) | ||
| 128 | return root_clk_enable(clk->root_id); | ||
| 129 | |||
| 130 | if (clk->aclkreg) { | ||
| 131 | reg = __raw_readl(clk->aclkreg); | ||
| 132 | reg |= ACLK_EN; | ||
| 133 | __raw_writel(reg, clk->aclkreg); | ||
| 134 | } | ||
| 135 | if (clk->bclkctr) { | ||
| 136 | reg = __raw_readl(clk->bclkctr); | ||
| 137 | reg |= 1 << clk->bclk_shift; | ||
| 138 | __raw_writel(reg, clk->bclkctr); | ||
| 139 | } | ||
| 140 | return 0; | ||
| 141 | } | ||
| 142 | |||
| 143 | static void disable_clk(struct clk *clk) | ||
| 144 | { | ||
| 145 | u32 reg; | ||
| 146 | |||
| 147 | if (clk->root_id != CLK_SRC_NOROOT) { | ||
| 148 | root_clk_disable(clk->root_id); | ||
| 149 | return; | ||
| 150 | } | ||
| 151 | |||
| 152 | if (clk->bclkctr) { | ||
| 153 | reg = __raw_readl(clk->bclkctr); | ||
| 154 | reg &= ~(1 << clk->bclk_shift); | ||
| 155 | __raw_writel(reg, clk->bclkctr); | ||
| 156 | } | ||
| 157 | if (clk->aclkreg) { | ||
| 158 | reg = __raw_readl(clk->aclkreg); | ||
| 159 | reg &= ~ACLK_EN; | ||
| 160 | __raw_writel(reg, clk->aclkreg); | ||
| 161 | } | ||
| 162 | } | ||
| 163 | |||
| 164 | static unsigned long get_rate_pll(int pll) | ||
| 165 | { | ||
| 166 | u32 reg; | ||
| 167 | unsigned long s, m, p; | ||
| 168 | void __iomem *addr = pll_cfg_addr(pll); | ||
| 169 | |||
| 170 | reg = __raw_readl(addr); | ||
| 171 | s = (reg >> 16) & 0x07; | ||
| 172 | m = (reg >> 8) & 0xff; | ||
| 173 | p = reg & 0x3f; | ||
| 174 | |||
| 175 | return (m * xi_rate) / (p * (1 << s)); | ||
| 176 | } | ||
| 177 | |||
| 178 | static unsigned long get_rate_pll_div(int pll) | ||
| 179 | { | ||
| 180 | u32 reg; | ||
| 181 | unsigned long div = 0; | ||
| 182 | void __iomem *addr; | ||
| 183 | |||
| 184 | switch (pll) { | ||
| 185 | case 0: | ||
| 186 | addr = CKC_BASE + CLKDIVC0_OFFS; | ||
| 187 | reg = __raw_readl(addr); | ||
| 188 | if (reg & CLKDIVC0_P0E) | ||
| 189 | div = (reg >> 24) & 0x3f; | ||
| 190 | break; | ||
| 191 | case 1: | ||
| 192 | addr = CKC_BASE + CLKDIVC0_OFFS; | ||
| 193 | reg = __raw_readl(addr); | ||
| 194 | if (reg & CLKDIVC0_P1E) | ||
| 195 | div = (reg >> 16) & 0x3f; | ||
| 196 | break; | ||
| 197 | case 2: | ||
| 198 | addr = CKC_BASE + CLKDIVC1_OFFS; | ||
| 199 | reg = __raw_readl(addr); | ||
| 200 | if (reg & CLKDIVC1_P2E) | ||
| 201 | div = reg & 0x3f; | ||
| 202 | break; | ||
| 203 | } | ||
| 204 | return get_rate_pll(pll) / (div + 1); | ||
| 205 | } | ||
| 206 | |||
| 207 | static unsigned long get_rate_xi_div(void) | ||
| 208 | { | ||
| 209 | unsigned long div = 0; | ||
| 210 | u32 reg = __raw_readl(CKC_BASE + CLKDIVC0_OFFS); | ||
| 211 | |||
| 212 | if (reg & CLKDIVC0_XE) | ||
| 213 | div = (reg >> 8) & 0x3f; | ||
| 214 | |||
| 215 | return xi_rate / (div + 1); | ||
| 216 | } | ||
| 217 | |||
| 218 | static unsigned long get_rate_xti_div(void) | ||
| 219 | { | ||
| 220 | unsigned long div = 0; | ||
| 221 | u32 reg = __raw_readl(CKC_BASE + CLKDIVC0_OFFS); | ||
| 222 | |||
| 223 | if (reg & CLKDIVC0_XTE) | ||
| 224 | div = reg & 0x3f; | ||
| 225 | |||
| 226 | return xti_rate / (div + 1); | ||
| 227 | } | ||
| 228 | |||
| 229 | static unsigned long root_clk_get_rate(enum root_clks src) | ||
| 230 | { | ||
| 231 | switch (src) { | ||
| 232 | case CLK_SRC_PLL0: return get_rate_pll(0); | ||
| 233 | case CLK_SRC_PLL1: return get_rate_pll(1); | ||
| 234 | case CLK_SRC_PLL2: return get_rate_pll(2); | ||
| 235 | case CLK_SRC_PLL0DIV: return get_rate_pll_div(0); | ||
| 236 | case CLK_SRC_PLL1DIV: return get_rate_pll_div(1); | ||
| 237 | case CLK_SRC_PLL2DIV: return get_rate_pll_div(2); | ||
| 238 | case CLK_SRC_XI: return xi_rate; | ||
| 239 | case CLK_SRC_XTI: return xti_rate; | ||
| 240 | case CLK_SRC_XIDIV: return get_rate_xi_div(); | ||
| 241 | case CLK_SRC_XTIDIV: return get_rate_xti_div(); | ||
| 242 | default: return 0; | ||
| 243 | } | ||
| 244 | } | ||
| 245 | |||
| 246 | static unsigned long aclk_get_rate(struct clk *clk) | ||
| 247 | { | ||
| 248 | u32 reg; | ||
| 249 | unsigned long div; | ||
| 250 | unsigned int src; | ||
| 251 | |||
| 252 | reg = __raw_readl(clk->aclkreg); | ||
| 253 | div = reg & 0x0fff; | ||
| 254 | src = (reg >> ACLK_SEL_SHIFT) & CLK_SRC_MASK; | ||
| 255 | return root_clk_get_rate(src) / (div + 1); | ||
| 256 | } | ||
| 257 | |||
| 258 | static unsigned long aclk_best_div(struct clk *clk, unsigned long rate) | ||
| 259 | { | ||
| 260 | unsigned long div, src, freq, r1, r2; | ||
| 261 | |||
| 262 | if (!rate) | ||
| 263 | return ACLK_MAX_DIV; | ||
| 264 | |||
| 265 | src = __raw_readl(clk->aclkreg) >> ACLK_SEL_SHIFT; | ||
| 266 | src &= CLK_SRC_MASK; | ||
| 267 | freq = root_clk_get_rate(src); | ||
| 268 | div = freq / rate; | ||
| 269 | if (!div) | ||
| 270 | return 1; | ||
| 271 | if (div >= ACLK_MAX_DIV) | ||
| 272 | return ACLK_MAX_DIV; | ||
| 273 | r1 = freq / div; | ||
| 274 | r2 = freq / (div + 1); | ||
| 275 | if ((rate - r2) < (r1 - rate)) | ||
| 276 | return div + 1; | ||
| 277 | |||
| 278 | return div; | ||
| 279 | } | ||
| 280 | |||
| 281 | static unsigned long aclk_round_rate(struct clk *clk, unsigned long rate) | ||
| 282 | { | ||
| 283 | unsigned int src; | ||
| 284 | |||
| 285 | src = __raw_readl(clk->aclkreg) >> ACLK_SEL_SHIFT; | ||
| 286 | src &= CLK_SRC_MASK; | ||
| 287 | |||
| 288 | return root_clk_get_rate(src) / aclk_best_div(clk, rate); | ||
| 289 | } | ||
| 290 | |||
| 291 | static int aclk_set_rate(struct clk *clk, unsigned long rate) | ||
| 292 | { | ||
| 293 | u32 reg; | ||
| 294 | |||
| 295 | reg = __raw_readl(clk->aclkreg) & ~ACLK_DIV_MASK; | ||
| 296 | reg |= aclk_best_div(clk, rate) - 1; | ||
| 297 | __raw_writel(reg, clk->aclkreg); | ||
| 298 | return 0; | ||
| 299 | } | ||
| 300 | |||
| 301 | static unsigned long get_rate_sys(struct clk *clk) | ||
| 302 | { | ||
| 303 | unsigned int src; | ||
| 304 | |||
| 305 | src = __raw_readl(CKC_BASE + CLKCTRL_OFFS) & CLK_SRC_MASK; | ||
| 306 | return root_clk_get_rate(src); | ||
| 307 | } | ||
| 308 | |||
| 309 | static unsigned long get_rate_bus(struct clk *clk) | ||
| 310 | { | ||
| 311 | unsigned int reg, sdiv, bdiv, rate; | ||
| 312 | |||
| 313 | reg = __raw_readl(CKC_BASE + CLKCTRL_OFFS); | ||
| 314 | rate = get_rate_sys(clk); | ||
| 315 | sdiv = (reg >> 20) & 3; | ||
| 316 | if (sdiv) | ||
| 317 | rate /= sdiv + 1; | ||
| 318 | bdiv = (reg >> 4) & 0xff; | ||
| 319 | if (bdiv) | ||
| 320 | rate /= bdiv + 1; | ||
| 321 | return rate; | ||
| 322 | } | ||
| 323 | |||
| 324 | static unsigned long get_rate_cpu(struct clk *clk) | ||
| 325 | { | ||
| 326 | unsigned int reg, div, fsys, fbus; | ||
| 327 | |||
| 328 | fbus = get_rate_bus(clk); | ||
| 329 | reg = __raw_readl(CKC_BASE + CLKCTRL_OFFS); | ||
| 330 | if (reg & (1 << 29)) | ||
| 331 | return fbus; | ||
| 332 | fsys = get_rate_sys(clk); | ||
| 333 | div = (reg >> 16) & 0x0f; | ||
| 334 | return fbus + ((fsys - fbus) * (div + 1)) / 16; | ||
| 335 | } | ||
| 336 | |||
| 337 | static unsigned long get_rate_root(struct clk *clk) | ||
| 338 | { | ||
| 339 | return root_clk_get_rate(clk->root_id); | ||
| 340 | } | ||
| 341 | |||
| 342 | static int aclk_set_parent(struct clk *clock, struct clk *parent) | ||
| 343 | { | ||
| 344 | u32 reg; | ||
| 345 | |||
| 346 | if (clock->parent == parent) | ||
| 347 | return 0; | ||
| 348 | |||
| 349 | clock->parent = parent; | ||
| 350 | |||
| 351 | if (!parent) | ||
| 352 | return 0; | ||
| 353 | |||
| 354 | if (parent->root_id == CLK_SRC_NOROOT) | ||
| 355 | return 0; | ||
| 356 | reg = __raw_readl(clock->aclkreg); | ||
| 357 | reg &= ~ACLK_SEL_MASK; | ||
| 358 | reg |= (parent->root_id << ACLK_SEL_SHIFT) & ACLK_SEL_MASK; | ||
| 359 | __raw_writel(reg, clock->aclkreg); | ||
| 360 | |||
| 361 | return 0; | ||
| 362 | } | ||
| 363 | |||
| 364 | #define DEFINE_ROOT_CLOCK(name, ri, p) \ | ||
| 365 | static struct clk name = { \ | ||
| 366 | .root_id = ri, \ | ||
| 367 | .get_rate = get_rate_root, \ | ||
| 368 | .enable = enable_clk, \ | ||
| 369 | .disable = disable_clk, \ | ||
| 370 | .parent = p, \ | ||
| 371 | }; | ||
| 372 | |||
| 373 | #define DEFINE_SPECIAL_CLOCK(name, gr, p) \ | ||
| 374 | static struct clk name = { \ | ||
| 375 | .root_id = CLK_SRC_NOROOT, \ | ||
| 376 | .get_rate = gr, \ | ||
| 377 | .parent = p, \ | ||
| 378 | }; | ||
| 379 | |||
| 380 | #define DEFINE_ACLOCK(name, bc, bs, ar) \ | ||
| 381 | static struct clk name = { \ | ||
| 382 | .root_id = CLK_SRC_NOROOT, \ | ||
| 383 | .bclkctr = bc, \ | ||
| 384 | .bclk_shift = bs, \ | ||
| 385 | .aclkreg = ar, \ | ||
| 386 | .get_rate = aclk_get_rate, \ | ||
| 387 | .set_rate = aclk_set_rate, \ | ||
| 388 | .round_rate = aclk_round_rate, \ | ||
| 389 | .enable = enable_clk, \ | ||
| 390 | .disable = disable_clk, \ | ||
| 391 | .set_parent = aclk_set_parent, \ | ||
| 392 | }; | ||
| 393 | |||
| 394 | #define DEFINE_BCLOCK(name, bc, bs, gr, p) \ | ||
| 395 | static struct clk name = { \ | ||
| 396 | .root_id = CLK_SRC_NOROOT, \ | ||
| 397 | .bclkctr = bc, \ | ||
| 398 | .bclk_shift = bs, \ | ||
| 399 | .get_rate = gr, \ | ||
| 400 | .enable = enable_clk, \ | ||
| 401 | .disable = disable_clk, \ | ||
| 402 | .parent = p, \ | ||
| 403 | }; | ||
| 404 | |||
| 405 | DEFINE_ROOT_CLOCK(xi, CLK_SRC_XI, NULL) | ||
| 406 | DEFINE_ROOT_CLOCK(xti, CLK_SRC_XTI, NULL) | ||
| 407 | DEFINE_ROOT_CLOCK(xidiv, CLK_SRC_XIDIV, &xi) | ||
| 408 | DEFINE_ROOT_CLOCK(xtidiv, CLK_SRC_XTIDIV, &xti) | ||
| 409 | DEFINE_ROOT_CLOCK(pll0, CLK_SRC_PLL0, &xi) | ||
| 410 | DEFINE_ROOT_CLOCK(pll1, CLK_SRC_PLL1, &xi) | ||
| 411 | DEFINE_ROOT_CLOCK(pll2, CLK_SRC_PLL2, &xi) | ||
| 412 | DEFINE_ROOT_CLOCK(pll0div, CLK_SRC_PLL0DIV, &pll0) | ||
| 413 | DEFINE_ROOT_CLOCK(pll1div, CLK_SRC_PLL1DIV, &pll1) | ||
| 414 | DEFINE_ROOT_CLOCK(pll2div, CLK_SRC_PLL2DIV, &pll2) | ||
| 415 | |||
| 416 | /* The following 3 clocks are special and are initialized explicitly later */ | ||
| 417 | DEFINE_SPECIAL_CLOCK(sys, get_rate_sys, NULL) | ||
| 418 | DEFINE_SPECIAL_CLOCK(bus, get_rate_bus, &sys) | ||
| 419 | DEFINE_SPECIAL_CLOCK(cpu, get_rate_cpu, &sys) | ||
| 420 | |||
| 421 | DEFINE_ACLOCK(tct, NULL, 0, ACLKTCT) | ||
| 422 | DEFINE_ACLOCK(tcx, NULL, 0, ACLKTCX) | ||
| 423 | DEFINE_ACLOCK(tcz, NULL, 0, ACLKTCZ) | ||
| 424 | DEFINE_ACLOCK(ref, NULL, 0, ACLKREF) | ||
| 425 | DEFINE_ACLOCK(uart0, BCLKCTR0, 5, ACLKUART0) | ||
| 426 | DEFINE_ACLOCK(uart1, BCLKCTR0, 23, ACLKUART1) | ||
| 427 | DEFINE_ACLOCK(uart2, BCLKCTR0, 6, ACLKUART2) | ||
| 428 | DEFINE_ACLOCK(uart3, BCLKCTR0, 8, ACLKUART3) | ||
| 429 | DEFINE_ACLOCK(uart4, BCLKCTR1, 6, ACLKUART4) | ||
| 430 | DEFINE_ACLOCK(i2c, BCLKCTR0, 7, ACLKI2C) | ||
| 431 | DEFINE_ACLOCK(adc, BCLKCTR0, 10, ACLKADC) | ||
| 432 | DEFINE_ACLOCK(usbh0, BCLKCTR0, 11, ACLKUSBH) | ||
| 433 | DEFINE_ACLOCK(lcd, BCLKCTR0, 13, ACLKLCD) | ||
| 434 | DEFINE_ACLOCK(sd0, BCLKCTR0, 17, ACLKSDH0) | ||
| 435 | DEFINE_ACLOCK(sd1, BCLKCTR1, 5, ACLKSDH1) | ||
| 436 | DEFINE_ACLOCK(spi0, BCLKCTR0, 24, ACLKSPI0) | ||
| 437 | DEFINE_ACLOCK(spi1, BCLKCTR0, 30, ACLKSPI1) | ||
| 438 | DEFINE_ACLOCK(spdif, BCLKCTR1, 2, ACLKSPDIF) | ||
| 439 | DEFINE_ACLOCK(c3dec, BCLKCTR1, 9, ACLKC3DEC) | ||
| 440 | DEFINE_ACLOCK(can0, BCLKCTR1, 10, ACLKCAN0) | ||
| 441 | DEFINE_ACLOCK(can1, BCLKCTR1, 11, ACLKCAN1) | ||
| 442 | DEFINE_ACLOCK(gsb0, BCLKCTR1, 13, ACLKGSB0) | ||
| 443 | DEFINE_ACLOCK(gsb1, BCLKCTR1, 14, ACLKGSB1) | ||
| 444 | DEFINE_ACLOCK(gsb2, BCLKCTR1, 15, ACLKGSB2) | ||
| 445 | DEFINE_ACLOCK(gsb3, BCLKCTR1, 16, ACLKGSB3) | ||
| 446 | DEFINE_ACLOCK(usbh1, BCLKCTR1, 20, ACLKUSBH) | ||
| 447 | |||
| 448 | DEFINE_BCLOCK(dai0, BCLKCTR0, 0, NULL, NULL) | ||
| 449 | DEFINE_BCLOCK(pic, BCLKCTR0, 1, NULL, NULL) | ||
| 450 | DEFINE_BCLOCK(tc, BCLKCTR0, 2, NULL, NULL) | ||
| 451 | DEFINE_BCLOCK(gpio, BCLKCTR0, 3, NULL, NULL) | ||
| 452 | DEFINE_BCLOCK(usbd, BCLKCTR0, 4, NULL, NULL) | ||
| 453 | DEFINE_BCLOCK(ecc, BCLKCTR0, 9, NULL, NULL) | ||
| 454 | DEFINE_BCLOCK(gdma0, BCLKCTR0, 12, NULL, NULL) | ||
| 455 | DEFINE_BCLOCK(rtc, BCLKCTR0, 15, NULL, NULL) | ||
| 456 | DEFINE_BCLOCK(nfc, BCLKCTR0, 16, NULL, NULL) | ||
| 457 | DEFINE_BCLOCK(g2d, BCLKCTR0, 18, NULL, NULL) | ||
| 458 | DEFINE_BCLOCK(gdma1, BCLKCTR0, 22, NULL, NULL) | ||
| 459 | DEFINE_BCLOCK(mscl, BCLKCTR0, 25, NULL, NULL) | ||
| 460 | DEFINE_BCLOCK(bdma, BCLKCTR1, 0, NULL, NULL) | ||
| 461 | DEFINE_BCLOCK(adma0, BCLKCTR1, 1, NULL, NULL) | ||
| 462 | DEFINE_BCLOCK(scfg, BCLKCTR1, 3, NULL, NULL) | ||
| 463 | DEFINE_BCLOCK(cid, BCLKCTR1, 4, NULL, NULL) | ||
| 464 | DEFINE_BCLOCK(dai1, BCLKCTR1, 7, NULL, NULL) | ||
| 465 | DEFINE_BCLOCK(adma1, BCLKCTR1, 8, NULL, NULL) | ||
| 466 | DEFINE_BCLOCK(gps, BCLKCTR1, 12, NULL, NULL) | ||
| 467 | DEFINE_BCLOCK(gdma2, BCLKCTR1, 17, NULL, NULL) | ||
| 468 | DEFINE_BCLOCK(gdma3, BCLKCTR1, 18, NULL, NULL) | ||
| 469 | DEFINE_BCLOCK(ddrc, BCLKCTR1, 19, NULL, NULL) | ||
| 470 | |||
| 471 | #define _REGISTER_CLOCK(d, n, c) \ | ||
| 472 | { \ | ||
| 473 | .dev_id = d, \ | ||
| 474 | .con_id = n, \ | ||
| 475 | .clk = &c, \ | ||
| 476 | }, | ||
| 477 | |||
| 478 | static struct clk_lookup lookups[] = { | ||
| 479 | _REGISTER_CLOCK(NULL, "bus", bus) | ||
| 480 | _REGISTER_CLOCK(NULL, "cpu", cpu) | ||
| 481 | _REGISTER_CLOCK(NULL, "tct", tct) | ||
| 482 | _REGISTER_CLOCK(NULL, "tcx", tcx) | ||
| 483 | _REGISTER_CLOCK(NULL, "tcz", tcz) | ||
| 484 | _REGISTER_CLOCK(NULL, "ref", ref) | ||
| 485 | _REGISTER_CLOCK(NULL, "dai0", dai0) | ||
| 486 | _REGISTER_CLOCK(NULL, "pic", pic) | ||
| 487 | _REGISTER_CLOCK(NULL, "tc", tc) | ||
| 488 | _REGISTER_CLOCK(NULL, "gpio", gpio) | ||
| 489 | _REGISTER_CLOCK(NULL, "usbd", usbd) | ||
| 490 | _REGISTER_CLOCK("tcc-uart.0", NULL, uart0) | ||
| 491 | _REGISTER_CLOCK("tcc-uart.2", NULL, uart2) | ||
| 492 | _REGISTER_CLOCK("tcc-i2c", NULL, i2c) | ||
| 493 | _REGISTER_CLOCK("tcc-uart.3", NULL, uart3) | ||
| 494 | _REGISTER_CLOCK(NULL, "ecc", ecc) | ||
| 495 | _REGISTER_CLOCK(NULL, "adc", adc) | ||
| 496 | _REGISTER_CLOCK("tcc-usbh.0", "usb", usbh0) | ||
| 497 | _REGISTER_CLOCK(NULL, "gdma0", gdma0) | ||
| 498 | _REGISTER_CLOCK(NULL, "lcd", lcd) | ||
| 499 | _REGISTER_CLOCK(NULL, "rtc", rtc) | ||
| 500 | _REGISTER_CLOCK(NULL, "nfc", nfc) | ||
| 501 | _REGISTER_CLOCK("tcc-mmc.0", NULL, sd0) | ||
| 502 | _REGISTER_CLOCK(NULL, "g2d", g2d) | ||
| 503 | _REGISTER_CLOCK(NULL, "gdma1", gdma1) | ||
| 504 | _REGISTER_CLOCK("tcc-uart.1", NULL, uart1) | ||
| 505 | _REGISTER_CLOCK("tcc-spi.0", NULL, spi0) | ||
| 506 | _REGISTER_CLOCK(NULL, "mscl", mscl) | ||
| 507 | _REGISTER_CLOCK("tcc-spi.1", NULL, spi1) | ||
| 508 | _REGISTER_CLOCK(NULL, "bdma", bdma) | ||
| 509 | _REGISTER_CLOCK(NULL, "adma0", adma0) | ||
| 510 | _REGISTER_CLOCK(NULL, "spdif", spdif) | ||
| 511 | _REGISTER_CLOCK(NULL, "scfg", scfg) | ||
| 512 | _REGISTER_CLOCK(NULL, "cid", cid) | ||
| 513 | _REGISTER_CLOCK("tcc-mmc.1", NULL, sd1) | ||
| 514 | _REGISTER_CLOCK("tcc-uart.4", NULL, uart4) | ||
| 515 | _REGISTER_CLOCK(NULL, "dai1", dai1) | ||
| 516 | _REGISTER_CLOCK(NULL, "adma1", adma1) | ||
| 517 | _REGISTER_CLOCK(NULL, "c3dec", c3dec) | ||
| 518 | _REGISTER_CLOCK("tcc-can.0", NULL, can0) | ||
| 519 | _REGISTER_CLOCK("tcc-can.1", NULL, can1) | ||
| 520 | _REGISTER_CLOCK(NULL, "gps", gps) | ||
| 521 | _REGISTER_CLOCK("tcc-gsb.0", NULL, gsb0) | ||
| 522 | _REGISTER_CLOCK("tcc-gsb.1", NULL, gsb1) | ||
| 523 | _REGISTER_CLOCK("tcc-gsb.2", NULL, gsb2) | ||
| 524 | _REGISTER_CLOCK("tcc-gsb.3", NULL, gsb3) | ||
| 525 | _REGISTER_CLOCK(NULL, "gdma2", gdma2) | ||
| 526 | _REGISTER_CLOCK(NULL, "gdma3", gdma3) | ||
| 527 | _REGISTER_CLOCK(NULL, "ddrc", ddrc) | ||
| 528 | _REGISTER_CLOCK("tcc-usbh.1", "usb", usbh1) | ||
| 529 | }; | ||
| 530 | |||
| 531 | static struct clk *root_clk_by_index(enum root_clks src) | ||
| 532 | { | ||
| 533 | switch (src) { | ||
| 534 | case CLK_SRC_PLL0: return &pll0; | ||
| 535 | case CLK_SRC_PLL1: return &pll1; | ||
| 536 | case CLK_SRC_PLL2: return &pll2; | ||
| 537 | case CLK_SRC_PLL0DIV: return &pll0div; | ||
| 538 | case CLK_SRC_PLL1DIV: return &pll1div; | ||
| 539 | case CLK_SRC_PLL2DIV: return &pll2div; | ||
| 540 | case CLK_SRC_XI: return ξ | ||
| 541 | case CLK_SRC_XTI: return &xti; | ||
| 542 | case CLK_SRC_XIDIV: return &xidiv; | ||
| 543 | case CLK_SRC_XTIDIV: return &xtidiv; | ||
| 544 | default: return NULL; | ||
| 545 | } | ||
| 546 | } | ||
| 547 | |||
| 548 | static void find_aclk_parent(struct clk *clk) | ||
| 549 | { | ||
| 550 | unsigned int src; | ||
| 551 | struct clk *clock; | ||
| 552 | |||
| 553 | if (!clk->aclkreg) | ||
| 554 | return; | ||
| 555 | |||
| 556 | src = __raw_readl(clk->aclkreg) >> ACLK_SEL_SHIFT; | ||
| 557 | src &= CLK_SRC_MASK; | ||
| 558 | |||
| 559 | clock = root_clk_by_index(src); | ||
| 560 | if (!clock) | ||
| 561 | return; | ||
| 562 | |||
| 563 | clk->parent = clock; | ||
| 564 | clk->set_parent = aclk_set_parent; | ||
| 565 | } | ||
| 566 | |||
| 567 | void __init tcc_clocks_init(unsigned long xi_freq, unsigned long xti_freq) | ||
| 568 | { | ||
| 569 | int i; | ||
| 570 | |||
| 571 | xi_rate = xi_freq; | ||
| 572 | xti_rate = xti_freq; | ||
| 573 | |||
| 574 | /* fixup parents and add the clock */ | ||
| 575 | for (i = 0; i < ARRAY_SIZE(lookups); i++) { | ||
| 576 | find_aclk_parent(lookups[i].clk); | ||
| 577 | clkdev_add(&lookups[i]); | ||
| 578 | } | ||
| 579 | tcc8k_timer_init(&tcz, (void __iomem *)TIMER_BASE, INT_TC32); | ||
| 580 | } | ||
diff --git a/arch/arm/mach-tcc8k/common.h b/arch/arm/mach-tcc8k/common.h deleted file mode 100644 index 705690add39..00000000000 --- a/arch/arm/mach-tcc8k/common.h +++ /dev/null | |||
| @@ -1,15 +0,0 @@ | |||
| 1 | #ifndef MACH_TCC8K_COMMON_H | ||
| 2 | #define MACH_TCC8K_COMMON_H | ||
| 3 | |||
| 4 | #include <linux/platform_device.h> | ||
| 5 | |||
| 6 | extern struct platform_device tcc_nand_device; | ||
| 7 | |||
| 8 | struct clk; | ||
| 9 | |||
| 10 | extern void tcc_clocks_init(unsigned long xi_freq, unsigned long xti_freq); | ||
| 11 | extern void tcc8k_timer_init(struct clk *clock, void __iomem *base, int irq); | ||
| 12 | extern void tcc8k_init_irq(void); | ||
| 13 | extern void tcc8k_map_common_io(void); | ||
| 14 | |||
| 15 | #endif | ||
diff --git a/arch/arm/mach-tcc8k/devices.c b/arch/arm/mach-tcc8k/devices.c deleted file mode 100644 index 6722ad7c283..00000000000 --- a/arch/arm/mach-tcc8k/devices.c +++ /dev/null | |||
| @@ -1,239 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * linux/arch/arm/mach-tcc8k/devices.c | ||
| 3 | * | ||
| 4 | * Copyright (C) Telechips, Inc. | ||
| 5 | * Copyright (C) 2009 Hans J. Koch <hjk@linutronix.de> | ||
| 6 | * | ||
| 7 | * Licensed under the terms of GPL v2. | ||
| 8 | * | ||
| 9 | */ | ||
| 10 | |||
| 11 | #include <linux/dma-mapping.h> | ||
| 12 | #include <linux/init.h> | ||
| 13 | #include <linux/io.h> | ||
| 14 | #include <linux/kernel.h> | ||
| 15 | #include <linux/module.h> | ||
| 16 | |||
| 17 | #include <asm/mach/map.h> | ||
| 18 | |||
| 19 | #include <mach/tcc8k-regs.h> | ||
| 20 | #include <mach/irqs.h> | ||
| 21 | |||
| 22 | #include "common.h" | ||
| 23 | |||
| 24 | static u64 tcc8k_dmamask = DMA_BIT_MASK(32); | ||
| 25 | |||
| 26 | #ifdef CONFIG_MTD_NAND_TCC | ||
| 27 | /* NAND controller */ | ||
| 28 | static struct resource tcc_nand_resources[] = { | ||
| 29 | { | ||
| 30 | .start = (resource_size_t)NFC_BASE, | ||
| 31 | .end = (resource_size_t)NFC_BASE + 0x7f, | ||
| 32 | .flags = IORESOURCE_MEM, | ||
| 33 | }, { | ||
| 34 | .start = INT_NFC, | ||
| 35 | .end = INT_NFC, | ||
| 36 | .flags = IORESOURCE_IRQ, | ||
| 37 | }, | ||
| 38 | }; | ||
| 39 | |||
| 40 | struct platform_device tcc_nand_device = { | ||
| 41 | .name = "tcc_nand", | ||
| 42 | .id = 0, | ||
| 43 | .num_resources = ARRAY_SIZE(tcc_nand_resources), | ||
| 44 | .resource = tcc_nand_resources, | ||
| 45 | }; | ||
| 46 | #endif | ||
| 47 | |||
| 48 | #ifdef CONFIG_MMC_TCC8K | ||
| 49 | /* MMC controller */ | ||
| 50 | static struct resource tcc8k_mmc0_resource[] = { | ||
| 51 | { | ||
| 52 | .start = INT_SD0, | ||
| 53 | .end = INT_SD0, | ||
| 54 | .flags = IORESOURCE_IRQ, | ||
| 55 | }, | ||
| 56 | }; | ||
| 57 | |||
| 58 | static struct resource tcc8k_mmc1_resource[] = { | ||
| 59 | { | ||
| 60 | .start = INT_SD1, | ||
| 61 | .end = INT_SD1, | ||
| 62 | .flags = IORESOURCE_IRQ, | ||
| 63 | }, | ||
| 64 | }; | ||
| 65 | |||
| 66 | struct platform_device tcc8k_mmc0_device = { | ||
| 67 | .name = "tcc-mmc", | ||
| 68 | .id = 0, | ||
| 69 | .num_resources = ARRAY_SIZE(tcc8k_mmc0_resource), | ||
| 70 | .resource = tcc8k_mmc0_resource, | ||
| 71 | .dev = { | ||
| 72 | .dma_mask = &tcc8k_dmamask, | ||
| 73 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
| 74 | } | ||
| 75 | }; | ||
| 76 | |||
| 77 | struct platform_device tcc8k_mmc1_device = { | ||
| 78 | .name = "tcc-mmc", | ||
| 79 | .id = 1, | ||
| 80 | .num_resources = ARRAY_SIZE(tcc8k_mmc1_resource), | ||
| 81 | .resource = tcc8k_mmc1_resource, | ||
| 82 | .dev = { | ||
| 83 | .dma_mask = &tcc8k_dmamask, | ||
| 84 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
| 85 | } | ||
| 86 | }; | ||
| 87 | |||
| 88 | static inline void tcc8k_init_mmc(void) | ||
| 89 | { | ||
| 90 | u32 reg = __raw_readl(GPIOPS_BASE + GPIOPS_FS1_OFFS); | ||
| 91 | |||
| 92 | reg |= GPIOPS_FS1_SDH0_BITS | GPIOPS_FS1_SDH1_BITS; | ||
| 93 | __raw_writel(reg, GPIOPS_BASE + GPIOPS_FS1_OFFS); | ||
| 94 | |||
| 95 | platform_device_register(&tcc8k_mmc0_device); | ||
| 96 | platform_device_register(&tcc8k_mmc1_device); | ||
| 97 | } | ||
| 98 | #else | ||
| 99 | static inline void tcc8k_init_mmc(void) { } | ||
| 100 | #endif | ||
| 101 | |||
| 102 | #ifdef CONFIG_USB_OHCI_HCD | ||
| 103 | static int tcc8k_ohci_init(struct device *dev) | ||
| 104 | { | ||
| 105 | u32 reg; | ||
| 106 | |||
| 107 | /* Use GPIO PK19 as VBUS control output */ | ||
| 108 | reg = __raw_readl(GPIOPK_BASE + GPIOPK_FS0_OFFS); | ||
| 109 | reg &= ~(1 << 19); | ||
| 110 | __raw_writel(reg, GPIOPK_BASE + GPIOPK_FS0_OFFS); | ||
| 111 | reg = __raw_readl(GPIOPK_BASE + GPIOPK_FS1_OFFS); | ||
| 112 | reg &= ~(1 << 19); | ||
| 113 | __raw_writel(reg, GPIOPK_BASE + GPIOPK_FS1_OFFS); | ||
| 114 | |||
| 115 | reg = __raw_readl(GPIOPK_BASE + GPIOPK_DOE_OFFS); | ||
| 116 | reg |= (1 << 19); | ||
| 117 | __raw_writel(reg, GPIOPK_BASE + GPIOPK_DOE_OFFS); | ||
| 118 | /* Turn on VBUS */ | ||
| 119 | reg = __raw_readl(GPIOPK_BASE + GPIOPK_DAT_OFFS); | ||
| 120 | reg |= (1 << 19); | ||
| 121 | __raw_writel(reg, GPIOPK_BASE + GPIOPK_DAT_OFFS); | ||
| 122 | |||
| 123 | return 0; | ||
| 124 | } | ||
| 125 | |||
| 126 | static struct resource tcc8k_ohci0_resources[] = { | ||
| 127 | [0] = { | ||
| 128 | .start = (resource_size_t)USBH0_BASE, | ||
| 129 | .end = (resource_size_t)USBH0_BASE + 0x5c, | ||
| 130 | .flags = IORESOURCE_MEM, | ||
| 131 | }, | ||
| 132 | [1] = { | ||
| 133 | .start = INT_USBH0, | ||
| 134 | .end = INT_USBH0, | ||
| 135 | .flags = IORESOURCE_IRQ, | ||
| 136 | } | ||
| 137 | }; | ||
| 138 | |||
| 139 | static struct resource tcc8k_ohci1_resources[] = { | ||
| 140 | [0] = { | ||
| 141 | .start = (resource_size_t)USBH1_BASE, | ||
| 142 | .end = (resource_size_t)USBH1_BASE + 0x5c, | ||
| 143 | .flags = IORESOURCE_MEM, | ||
| 144 | }, | ||
| 145 | [1] = { | ||
| 146 | .start = INT_USBH1, | ||
| 147 | .end = INT_USBH1, | ||
| 148 | .flags = IORESOURCE_IRQ, | ||
| 149 | } | ||
| 150 | }; | ||
| 151 | |||
| 152 | static struct tccohci_platform_data tcc8k_ohci0_platform_data = { | ||
| 153 | .controller = 0, | ||
| 154 | .port_mode = PMM_PERPORT_MODE, | ||
| 155 | .init = tcc8k_ohci_init, | ||
| 156 | }; | ||
| 157 | |||
| 158 | static struct tccohci_platform_data tcc8k_ohci1_platform_data = { | ||
| 159 | .controller = 1, | ||
| 160 | .port_mode = PMM_PERPORT_MODE, | ||
| 161 | .init = tcc8k_ohci_init, | ||
| 162 | }; | ||
| 163 | |||
| 164 | static struct platform_device ohci0_device = { | ||
| 165 | .name = "tcc-ohci", | ||
| 166 | .id = 0, | ||
| 167 | .dev = { | ||
| 168 | .dma_mask = &tcc8k_dmamask, | ||
| 169 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
| 170 | .platform_data = &tcc8k_ohci0_platform_data, | ||
| 171 | }, | ||
| 172 | .num_resources = ARRAY_SIZE(tcc8k_ohci0_resources), | ||
| 173 | .resource = tcc8k_ohci0_resources, | ||
| 174 | }; | ||
| 175 | |||
| 176 | static struct platform_device ohci1_device = { | ||
| 177 | .name = "tcc-ohci", | ||
| 178 | .id = 1, | ||
| 179 | .dev = { | ||
| 180 | .dma_mask = &tcc8k_dmamask, | ||
| 181 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
| 182 | .platform_data = &tcc8k_ohci1_platform_data, | ||
| 183 | }, | ||
| 184 | .num_resources = ARRAY_SIZE(tcc8k_ohci1_resources), | ||
| 185 | .resource = tcc8k_ohci1_resources, | ||
| 186 | }; | ||
| 187 | |||
| 188 | static void __init tcc8k_init_usbhost(void) | ||
| 189 | { | ||
| 190 | platform_device_register(&ohci0_device); | ||
| 191 | platform_device_register(&ohci1_device); | ||
| 192 | } | ||
| 193 | #else | ||
| 194 | static void __init tcc8k_init_usbhost(void) { } | ||
| 195 | #endif | ||
| 196 | |||
| 197 | /* USB device controller*/ | ||
| 198 | #ifdef CONFIG_USB_GADGET_TCC8K | ||
| 199 | static struct resource udc_resources[] = { | ||
| 200 | [0] = { | ||
| 201 | .start = INT_USBD, | ||
| 202 | .end = INT_USBD, | ||
| 203 | .flags = IORESOURCE_IRQ, | ||
| 204 | }, | ||
| 205 | [1] = { | ||
| 206 | .start = INT_UDMA, | ||
| 207 | .end = INT_UDMA, | ||
| 208 | .flags = IORESOURCE_IRQ, | ||
| 209 | }, | ||
| 210 | }; | ||
| 211 | |||
| 212 | static struct platform_device tcc8k_udc_device = { | ||
| 213 | .name = "tcc-udc", | ||
| 214 | .id = 0, | ||
| 215 | .resource = udc_resources, | ||
| 216 | .num_resources = ARRAY_SIZE(udc_resources), | ||
| 217 | .dev = { | ||
| 218 | .dma_mask = &tcc8k_dmamask, | ||
| 219 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
| 220 | }, | ||
| 221 | }; | ||
| 222 | |||
| 223 | static void __init tcc8k_init_usb_gadget(void) | ||
| 224 | { | ||
| 225 | platform_device_register(&tcc8k_udc_device); | ||
| 226 | } | ||
| 227 | #else | ||
| 228 | static void __init tcc8k_init_usb_gadget(void) { } | ||
| 229 | #endif /* CONFIG_USB_GADGET_TCC83X */ | ||
| 230 | |||
| 231 | static int __init tcc8k_init_devices(void) | ||
| 232 | { | ||
| 233 | tcc8k_init_mmc(); | ||
| 234 | tcc8k_init_usbhost(); | ||
| 235 | tcc8k_init_usb_gadget(); | ||
| 236 | return 0; | ||
| 237 | } | ||
| 238 | |||
| 239 | arch_initcall(tcc8k_init_devices); | ||
diff --git a/arch/arm/mach-tcc8k/io.c b/arch/arm/mach-tcc8k/io.c deleted file mode 100644 index 9b39d7fa658..00000000000 --- a/arch/arm/mach-tcc8k/io.c +++ /dev/null | |||
| @@ -1,62 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * linux/arch/arm/mach-tcc8k/io.c | ||
| 3 | * | ||
| 4 | * (C) 2009 Hans J. Koch <hjk@linutronix.de> | ||
| 5 | * | ||
| 6 | * derived from TCC83xx io.c | ||
| 7 | * Copyright (C) Telechips, Inc. | ||
| 8 | * | ||
| 9 | * This program is free software; you can redistribute it and/or modify | ||
| 10 | * it under the terms of the GNU General Public License version 2 as | ||
| 11 | * published by the Free Software Foundation. | ||
| 12 | */ | ||
| 13 | |||
| 14 | #include <linux/init.h> | ||
| 15 | #include <linux/io.h> | ||
| 16 | #include <linux/kernel.h> | ||
| 17 | |||
| 18 | #include <asm/mach/map.h> | ||
| 19 | |||
| 20 | #include <mach/tcc8k-regs.h> | ||
| 21 | |||
| 22 | /* | ||
| 23 | * The machine specific code may provide the extra mapping besides the | ||
| 24 | * default mapping provided here. | ||
| 25 | */ | ||
| 26 | static struct map_desc tcc8k_io_desc[] __initdata = { | ||
| 27 | { | ||
| 28 | .virtual = (unsigned long)CS1_BASE_VIRT, | ||
| 29 | .pfn = __phys_to_pfn(CS1_BASE), | ||
| 30 | .length = CS1_SIZE, | ||
| 31 | .type = MT_DEVICE, | ||
| 32 | }, { | ||
| 33 | .virtual = (unsigned long)AHB_PERI_BASE_VIRT, | ||
| 34 | .pfn = __phys_to_pfn(AHB_PERI_BASE), | ||
| 35 | .length = AHB_PERI_SIZE, | ||
| 36 | .type = MT_DEVICE, | ||
| 37 | }, { | ||
| 38 | .virtual = (unsigned long)APB0_PERI_BASE_VIRT, | ||
| 39 | .pfn = __phys_to_pfn(APB0_PERI_BASE), | ||
| 40 | .length = APB0_PERI_SIZE, | ||
| 41 | .type = MT_DEVICE, | ||
| 42 | }, { | ||
| 43 | .virtual = (unsigned long)APB1_PERI_BASE_VIRT, | ||
| 44 | .pfn = __phys_to_pfn(APB1_PERI_BASE), | ||
| 45 | .length = APB1_PERI_SIZE, | ||
| 46 | .type = MT_DEVICE, | ||
| 47 | }, { | ||
| 48 | .virtual = (unsigned long)EXT_MEM_CTRL_BASE_VIRT, | ||
| 49 | .pfn = __phys_to_pfn(EXT_MEM_CTRL_BASE), | ||
| 50 | .length = EXT_MEM_CTRL_SIZE, | ||
| 51 | .type = MT_DEVICE, | ||
| 52 | }, | ||
| 53 | }; | ||
| 54 | |||
| 55 | /* | ||
| 56 | * Maps common IO regions for tcc8k. | ||
| 57 | * | ||
| 58 | */ | ||
| 59 | void __init tcc8k_map_common_io(void) | ||
| 60 | { | ||
| 61 | iotable_init(tcc8k_io_desc, ARRAY_SIZE(tcc8k_io_desc)); | ||
| 62 | } | ||
diff --git a/arch/arm/mach-tcc8k/irq.c b/arch/arm/mach-tcc8k/irq.c deleted file mode 100644 index 209fa5c65d4..00000000000 --- a/arch/arm/mach-tcc8k/irq.c +++ /dev/null | |||
| @@ -1,111 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) Telechips, Inc. | ||
| 3 | * Copyright (C) 2009-2010 Hans J. Koch <hjk@linutronix.de> | ||
| 4 | * | ||
| 5 | * Licensed under the terms of the GNU GPL version 2. | ||
| 6 | */ | ||
| 7 | |||
| 8 | #include <linux/init.h> | ||
| 9 | #include <linux/interrupt.h> | ||
| 10 | #include <linux/io.h> | ||
| 11 | |||
| 12 | #include <asm/irq.h> | ||
| 13 | #include <asm/mach/irq.h> | ||
| 14 | |||
| 15 | #include <mach/tcc8k-regs.h> | ||
| 16 | #include <mach/irqs.h> | ||
| 17 | |||
| 18 | #include "common.h" | ||
| 19 | |||
| 20 | /* Disable IRQ */ | ||
| 21 | static void tcc8000_mask_ack_irq0(struct irq_data *d) | ||
| 22 | { | ||
| 23 | PIC0_IEN &= ~(1 << d->irq); | ||
| 24 | PIC0_CREQ |= (1 << d->irq); | ||
| 25 | } | ||
| 26 | |||
| 27 | static void tcc8000_mask_ack_irq1(struct irq_data *d) | ||
| 28 | { | ||
| 29 | PIC1_IEN &= ~(1 << (d->irq - 32)); | ||
| 30 | PIC1_CREQ |= (1 << (d->irq - 32)); | ||
| 31 | } | ||
| 32 | |||
| 33 | static void tcc8000_mask_irq0(struct irq_data *d) | ||
| 34 | { | ||
| 35 | PIC0_IEN &= ~(1 << d->irq); | ||
| 36 | } | ||
| 37 | |||
| 38 | static void tcc8000_mask_irq1(struct irq_data *d) | ||
| 39 | { | ||
| 40 | PIC1_IEN &= ~(1 << (d->irq - 32)); | ||
| 41 | } | ||
| 42 | |||
| 43 | static void tcc8000_ack_irq0(struct irq_data *d) | ||
| 44 | { | ||
| 45 | PIC0_CREQ |= (1 << d->irq); | ||
| 46 | } | ||
| 47 | |||
| 48 | static void tcc8000_ack_irq1(struct irq_data *d) | ||
| 49 | { | ||
| 50 | PIC1_CREQ |= (1 << (d->irq - 32)); | ||
| 51 | } | ||
| 52 | |||
| 53 | /* Enable IRQ */ | ||
| 54 | static void tcc8000_unmask_irq0(struct irq_data *d) | ||
| 55 | { | ||
| 56 | PIC0_IEN |= (1 << d->irq); | ||
| 57 | PIC0_INTOEN |= (1 << d->irq); | ||
| 58 | } | ||
| 59 | |||
| 60 | static void tcc8000_unmask_irq1(struct irq_data *d) | ||
| 61 | { | ||
| 62 | PIC1_IEN |= (1 << (d->irq - 32)); | ||
| 63 | PIC1_INTOEN |= (1 << (d->irq - 32)); | ||
| 64 | } | ||
| 65 | |||
| 66 | static struct irq_chip tcc8000_irq_chip0 = { | ||
| 67 | .name = "tcc_irq0", | ||
| 68 | .irq_mask = tcc8000_mask_irq0, | ||
| 69 | .irq_ack = tcc8000_ack_irq0, | ||
| 70 | .irq_mask_ack = tcc8000_mask_ack_irq0, | ||
| 71 | .irq_unmask = tcc8000_unmask_irq0, | ||
| 72 | }; | ||
| 73 | |||
| 74 | static struct irq_chip tcc8000_irq_chip1 = { | ||
| 75 | .name = "tcc_irq1", | ||
| 76 | .irq_mask = tcc8000_mask_irq1, | ||
| 77 | .irq_ack = tcc8000_ack_irq1, | ||
| 78 | .irq_mask_ack = tcc8000_mask_ack_irq1, | ||
| 79 | .irq_unmask = tcc8000_unmask_irq1, | ||
| 80 | }; | ||
| 81 | |||
| 82 | void __init tcc8k_init_irq(void) | ||
| 83 | { | ||
| 84 | int irqno; | ||
| 85 | |||
| 86 | /* Mask and clear all interrupts */ | ||
| 87 | PIC0_IEN = 0x00000000; | ||
| 88 | PIC0_CREQ = 0xffffffff; | ||
| 89 | PIC1_IEN = 0x00000000; | ||
| 90 | PIC1_CREQ = 0xffffffff; | ||
| 91 | |||
| 92 | PIC0_MEN0 = 0x00000003; | ||
| 93 | PIC1_MEN1 = 0x00000003; | ||
| 94 | PIC1_MEN = 0x00000003; | ||
| 95 | |||
| 96 | /* let all IRQs be level triggered */ | ||
| 97 | PIC0_TMODE = 0xffffffff; | ||
| 98 | PIC1_TMODE = 0xffffffff; | ||
| 99 | /* all IRQs are IRQs (not FIQs) */ | ||
| 100 | PIC0_IRQSEL = 0xffffffff; | ||
| 101 | PIC1_IRQSEL = 0xffffffff; | ||
| 102 | |||
| 103 | for (irqno = 0; irqno < NR_IRQS; irqno++) { | ||
| 104 | if (irqno < 32) | ||
| 105 | irq_set_chip(irqno, &tcc8000_irq_chip0); | ||
| 106 | else | ||
| 107 | irq_set_chip(irqno, &tcc8000_irq_chip1); | ||
| 108 | irq_set_handler(irqno, handle_level_irq); | ||
| 109 | set_irq_flags(irqno, IRQF_VALID); | ||
| 110 | } | ||
| 111 | } | ||
diff --git a/arch/arm/mach-tcc8k/time.c b/arch/arm/mach-tcc8k/time.c deleted file mode 100644 index a96babe8377..00000000000 --- a/arch/arm/mach-tcc8k/time.c +++ /dev/null | |||
| @@ -1,134 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * TCC8000 system timer setup | ||
| 3 | * | ||
| 4 | * (C) 2009 Hans J. Koch <hjk@linutronix.de> | ||
| 5 | * | ||
| 6 | * Licensed under the terms of the GPL version 2. | ||
| 7 | * | ||
| 8 | */ | ||
| 9 | |||
| 10 | #include <linux/clk.h> | ||
| 11 | #include <linux/clockchips.h> | ||
| 12 | #include <linux/init.h> | ||
| 13 | #include <linux/interrupt.h> | ||
| 14 | #include <linux/io.h> | ||
| 15 | #include <linux/irq.h> | ||
| 16 | #include <linux/kernel.h> | ||
| 17 | #include <linux/spinlock.h> | ||
| 18 | |||
| 19 | #include <asm/mach/time.h> | ||
| 20 | |||
| 21 | #include <mach/tcc8k-regs.h> | ||
| 22 | #include <mach/irqs.h> | ||
| 23 | |||
| 24 | #include "common.h" | ||
| 25 | |||
| 26 | static void __iomem *timer_base; | ||
| 27 | |||
| 28 | static int tcc_set_next_event(unsigned long evt, | ||
| 29 | struct clock_event_device *unused) | ||
| 30 | { | ||
| 31 | unsigned long reg = __raw_readl(timer_base + TC32MCNT_OFFS); | ||
| 32 | |||
| 33 | __raw_writel(reg + evt, timer_base + TC32CMP0_OFFS); | ||
| 34 | return 0; | ||
| 35 | } | ||
| 36 | |||
| 37 | static void tcc_set_mode(enum clock_event_mode mode, | ||
| 38 | struct clock_event_device *evt) | ||
| 39 | { | ||
| 40 | unsigned long tc32irq; | ||
| 41 | |||
| 42 | switch (mode) { | ||
| 43 | case CLOCK_EVT_MODE_ONESHOT: | ||
| 44 | tc32irq = __raw_readl(timer_base + TC32IRQ_OFFS); | ||
| 45 | tc32irq |= TC32IRQ_IRQEN0; | ||
| 46 | __raw_writel(tc32irq, timer_base + TC32IRQ_OFFS); | ||
| 47 | break; | ||
| 48 | case CLOCK_EVT_MODE_SHUTDOWN: | ||
| 49 | case CLOCK_EVT_MODE_UNUSED: | ||
| 50 | tc32irq = __raw_readl(timer_base + TC32IRQ_OFFS); | ||
| 51 | tc32irq &= ~TC32IRQ_IRQEN0; | ||
| 52 | __raw_writel(tc32irq, timer_base + TC32IRQ_OFFS); | ||
| 53 | break; | ||
| 54 | case CLOCK_EVT_MODE_PERIODIC: | ||
| 55 | case CLOCK_EVT_MODE_RESUME: | ||
| 56 | break; | ||
| 57 | } | ||
| 58 | } | ||
| 59 | |||
| 60 | static irqreturn_t tcc8k_timer_interrupt(int irq, void *dev_id) | ||
| 61 | { | ||
| 62 | struct clock_event_device *evt = dev_id; | ||
| 63 | |||
| 64 | /* Acknowledge TC32 interrupt by reading TC32IRQ */ | ||
| 65 | __raw_readl(timer_base + TC32IRQ_OFFS); | ||
| 66 | |||
| 67 | evt->event_handler(evt); | ||
| 68 | |||
| 69 | return IRQ_HANDLED; | ||
| 70 | } | ||
| 71 | |||
| 72 | static struct clock_event_device clockevent_tcc = { | ||
| 73 | .name = "tcc_timer1", | ||
| 74 | .features = CLOCK_EVT_FEAT_ONESHOT, | ||
| 75 | .shift = 32, | ||
| 76 | .set_mode = tcc_set_mode, | ||
| 77 | .set_next_event = tcc_set_next_event, | ||
| 78 | .rating = 200, | ||
| 79 | }; | ||
| 80 | |||
| 81 | static struct irqaction tcc8k_timer_irq = { | ||
| 82 | .name = "TC32_timer", | ||
| 83 | .flags = IRQF_DISABLED | IRQF_TIMER, | ||
| 84 | .handler = tcc8k_timer_interrupt, | ||
| 85 | .dev_id = &clockevent_tcc, | ||
| 86 | }; | ||
| 87 | |||
| 88 | static int __init tcc_clockevent_init(struct clk *clock) | ||
| 89 | { | ||
| 90 | unsigned int c = clk_get_rate(clock); | ||
| 91 | |||
| 92 | clocksource_mmio_init(timer_base + TC32MCNT_OFFS, "tcc_tc32", c, | ||
| 93 | 200, 32, clocksource_mmio_readl_up); | ||
| 94 | |||
| 95 | clockevent_tcc.mult = div_sc(c, NSEC_PER_SEC, | ||
| 96 | clockevent_tcc.shift); | ||
| 97 | clockevent_tcc.max_delta_ns = | ||
| 98 | clockevent_delta2ns(0xfffffffe, &clockevent_tcc); | ||
| 99 | clockevent_tcc.min_delta_ns = | ||
| 100 | clockevent_delta2ns(0xff, &clockevent_tcc); | ||
| 101 | |||
| 102 | clockevent_tcc.cpumask = cpumask_of(0); | ||
| 103 | |||
| 104 | clockevents_register_device(&clockevent_tcc); | ||
| 105 | |||
| 106 | return 0; | ||
| 107 | } | ||
| 108 | |||
| 109 | void __init tcc8k_timer_init(struct clk *clock, void __iomem *base, int irq) | ||
| 110 | { | ||
| 111 | u32 reg; | ||
| 112 | |||
| 113 | timer_base = base; | ||
| 114 | tcc8k_timer_irq.irq = irq; | ||
| 115 | |||
| 116 | /* Enable clocks */ | ||
| 117 | clk_enable(clock); | ||
| 118 | |||
| 119 | /* Initialize 32-bit timer */ | ||
| 120 | reg = __raw_readl(timer_base + TC32EN_OFFS); | ||
| 121 | reg &= ~TC32EN_ENABLE; /* Disable timer */ | ||
| 122 | __raw_writel(reg, timer_base + TC32EN_OFFS); | ||
| 123 | /* Free running timer, counting from 0 to 0xffffffff */ | ||
| 124 | __raw_writel(0, timer_base + TC32EN_OFFS); | ||
| 125 | __raw_writel(0, timer_base + TC32LDV_OFFS); | ||
| 126 | reg = __raw_readl(timer_base + TC32IRQ_OFFS); | ||
| 127 | reg |= TC32IRQ_IRQEN0; /* irq at match with CMP0 */ | ||
| 128 | __raw_writel(reg, timer_base + TC32IRQ_OFFS); | ||
| 129 | |||
| 130 | __raw_writel(TC32EN_ENABLE, timer_base + TC32EN_OFFS); | ||
| 131 | |||
| 132 | tcc_clockevent_init(clock); | ||
| 133 | setup_irq(irq, &tcc8k_timer_irq); | ||
| 134 | } | ||
diff --git a/arch/arm/mach-tegra/board-dt.c b/arch/arm/mach-tegra/board-dt.c index f6f03ce340f..e417a8383db 100644 --- a/arch/arm/mach-tegra/board-dt.c +++ b/arch/arm/mach-tegra/board-dt.c | |||
| @@ -134,5 +134,6 @@ DT_MACHINE_START(TEGRA_DT, "nVidia Tegra (Flattened Device Tree)") | |||
| 134 | .handle_irq = gic_handle_irq, | 134 | .handle_irq = gic_handle_irq, |
| 135 | .timer = &tegra_timer, | 135 | .timer = &tegra_timer, |
| 136 | .init_machine = tegra_dt_init, | 136 | .init_machine = tegra_dt_init, |
| 137 | .restart = tegra_assert_system_reset, | ||
| 137 | .dt_compat = tegra_dt_board_compat, | 138 | .dt_compat = tegra_dt_board_compat, |
| 138 | MACHINE_END | 139 | MACHINE_END |
diff --git a/arch/arm/mach-tegra/board-harmony.c b/arch/arm/mach-tegra/board-harmony.c index fd190a8dc66..70ee674131f 100644 --- a/arch/arm/mach-tegra/board-harmony.c +++ b/arch/arm/mach-tegra/board-harmony.c | |||
| @@ -191,4 +191,5 @@ MACHINE_START(HARMONY, "harmony") | |||
| 191 | .handle_irq = gic_handle_irq, | 191 | .handle_irq = gic_handle_irq, |
| 192 | .timer = &tegra_timer, | 192 | .timer = &tegra_timer, |
| 193 | .init_machine = tegra_harmony_init, | 193 | .init_machine = tegra_harmony_init, |
| 194 | .restart = tegra_assert_system_reset, | ||
| 194 | MACHINE_END | 195 | MACHINE_END |
diff --git a/arch/arm/mach-tegra/board-paz00.c b/arch/arm/mach-tegra/board-paz00.c index 0b7e1cfee70..33d6205ad30 100644 --- a/arch/arm/mach-tegra/board-paz00.c +++ b/arch/arm/mach-tegra/board-paz00.c | |||
| @@ -194,4 +194,5 @@ MACHINE_START(PAZ00, "Toshiba AC100 / Dynabook AZ") | |||
| 194 | .handle_irq = gic_handle_irq, | 194 | .handle_irq = gic_handle_irq, |
| 195 | .timer = &tegra_timer, | 195 | .timer = &tegra_timer, |
| 196 | .init_machine = tegra_paz00_init, | 196 | .init_machine = tegra_paz00_init, |
| 197 | .restart = tegra_assert_system_reset, | ||
| 197 | MACHINE_END | 198 | MACHINE_END |
diff --git a/arch/arm/mach-tegra/board-seaboard.c b/arch/arm/mach-tegra/board-seaboard.c index 7328379b135..c1599eb8e0c 100644 --- a/arch/arm/mach-tegra/board-seaboard.c +++ b/arch/arm/mach-tegra/board-seaboard.c | |||
| @@ -288,6 +288,7 @@ MACHINE_START(SEABOARD, "seaboard") | |||
| 288 | .handle_irq = gic_handle_irq, | 288 | .handle_irq = gic_handle_irq, |
| 289 | .timer = &tegra_timer, | 289 | .timer = &tegra_timer, |
| 290 | .init_machine = tegra_seaboard_init, | 290 | .init_machine = tegra_seaboard_init, |
| 291 | .restart = tegra_assert_system_reset, | ||
| 291 | MACHINE_END | 292 | MACHINE_END |
| 292 | 293 | ||
| 293 | MACHINE_START(KAEN, "kaen") | 294 | MACHINE_START(KAEN, "kaen") |
| @@ -298,6 +299,7 @@ MACHINE_START(KAEN, "kaen") | |||
| 298 | .handle_irq = gic_handle_irq, | 299 | .handle_irq = gic_handle_irq, |
| 299 | .timer = &tegra_timer, | 300 | .timer = &tegra_timer, |
| 300 | .init_machine = tegra_kaen_init, | 301 | .init_machine = tegra_kaen_init, |
| 302 | .restart = tegra_assert_system_reset, | ||
| 301 | MACHINE_END | 303 | MACHINE_END |
| 302 | 304 | ||
| 303 | MACHINE_START(WARIO, "wario") | 305 | MACHINE_START(WARIO, "wario") |
| @@ -308,4 +310,5 @@ MACHINE_START(WARIO, "wario") | |||
| 308 | .handle_irq = gic_handle_irq, | 310 | .handle_irq = gic_handle_irq, |
| 309 | .timer = &tegra_timer, | 311 | .timer = &tegra_timer, |
| 310 | .init_machine = tegra_wario_init, | 312 | .init_machine = tegra_wario_init, |
| 313 | .restart = tegra_assert_system_reset, | ||
| 311 | MACHINE_END | 314 | MACHINE_END |
diff --git a/arch/arm/mach-tegra/board-trimslice.c b/arch/arm/mach-tegra/board-trimslice.c index 60a36a2e0be..c242314a1db 100644 --- a/arch/arm/mach-tegra/board-trimslice.c +++ b/arch/arm/mach-tegra/board-trimslice.c | |||
| @@ -180,4 +180,5 @@ MACHINE_START(TRIMSLICE, "trimslice") | |||
| 180 | .handle_irq = gic_handle_irq, | 180 | .handle_irq = gic_handle_irq, |
| 181 | .timer = &tegra_timer, | 181 | .timer = &tegra_timer, |
| 182 | .init_machine = tegra_trimslice_init, | 182 | .init_machine = tegra_trimslice_init, |
| 183 | .restart = tegra_assert_system_reset, | ||
| 183 | MACHINE_END | 184 | MACHINE_END |
diff --git a/arch/arm/mach-tegra/common.c b/arch/arm/mach-tegra/common.c index 690b888be50..20f396d740f 100644 --- a/arch/arm/mach-tegra/common.c +++ b/arch/arm/mach-tegra/common.c | |||
| @@ -31,8 +31,6 @@ | |||
| 31 | #include "clock.h" | 31 | #include "clock.h" |
| 32 | #include "fuse.h" | 32 | #include "fuse.h" |
| 33 | 33 | ||
| 34 | void (*arch_reset)(char mode, const char *cmd) = tegra_assert_system_reset; | ||
| 35 | |||
| 36 | void tegra_assert_system_reset(char mode, const char *cmd) | 34 | void tegra_assert_system_reset(char mode, const char *cmd) |
| 37 | { | 35 | { |
| 38 | void __iomem *reset = IO_ADDRESS(TEGRA_CLK_RESET_BASE + 0x04); | 36 | void __iomem *reset = IO_ADDRESS(TEGRA_CLK_RESET_BASE + 0x04); |
diff --git a/arch/arm/mach-tegra/include/mach/system.h b/arch/arm/mach-tegra/include/mach/system.h index 027c4215d31..a312988bf6f 100644 --- a/arch/arm/mach-tegra/include/mach/system.h +++ b/arch/arm/mach-tegra/include/mach/system.h | |||
| @@ -21,10 +21,6 @@ | |||
| 21 | #ifndef __MACH_TEGRA_SYSTEM_H | 21 | #ifndef __MACH_TEGRA_SYSTEM_H |
| 22 | #define __MACH_TEGRA_SYSTEM_H | 22 | #define __MACH_TEGRA_SYSTEM_H |
| 23 | 23 | ||
| 24 | #include <mach/iomap.h> | ||
| 25 | |||
| 26 | extern void (*arch_reset)(char mode, const char *cmd); | ||
| 27 | |||
| 28 | static inline void arch_idle(void) | 24 | static inline void arch_idle(void) |
| 29 | { | 25 | { |
| 30 | } | 26 | } |
diff --git a/arch/arm/mach-u300/core.c b/arch/arm/mach-u300/core.c index ac0791e924b..697930761b3 100644 --- a/arch/arm/mach-u300/core.c +++ b/arch/arm/mach-u300/core.c | |||
| @@ -1888,3 +1888,23 @@ static int core_module_init(void) | |||
| 1888 | return mmc_init(&mmcsd_device); | 1888 | return mmc_init(&mmcsd_device); |
| 1889 | } | 1889 | } |
| 1890 | module_init(core_module_init); | 1890 | module_init(core_module_init); |
| 1891 | |||
| 1892 | /* Forward declare this function from the watchdog */ | ||
| 1893 | void coh901327_watchdog_reset(void); | ||
| 1894 | |||
| 1895 | void u300_restart(char mode, const char *cmd) | ||
| 1896 | { | ||
| 1897 | switch (mode) { | ||
| 1898 | case 's': | ||
| 1899 | case 'h': | ||
| 1900 | #ifdef CONFIG_COH901327_WATCHDOG | ||
| 1901 | coh901327_watchdog_reset(); | ||
| 1902 | #endif | ||
| 1903 | break; | ||
| 1904 | default: | ||
| 1905 | /* Do nothing */ | ||
| 1906 | break; | ||
| 1907 | } | ||
| 1908 | /* Wait for system do die/reset. */ | ||
| 1909 | while (1); | ||
| 1910 | } | ||
diff --git a/arch/arm/mach-u300/include/mach/platform.h b/arch/arm/mach-u300/include/mach/platform.h index 77d9210a82e..096333f32fc 100644 --- a/arch/arm/mach-u300/include/mach/platform.h +++ b/arch/arm/mach-u300/include/mach/platform.h | |||
| @@ -14,6 +14,7 @@ | |||
| 14 | void u300_map_io(void); | 14 | void u300_map_io(void); |
| 15 | void u300_init_irq(void); | 15 | void u300_init_irq(void); |
| 16 | void u300_init_devices(void); | 16 | void u300_init_devices(void); |
| 17 | void u300_restart(char, const char *); | ||
| 17 | extern struct sys_timer u300_timer; | 18 | extern struct sys_timer u300_timer; |
| 18 | 19 | ||
| 19 | #endif | 20 | #endif |
diff --git a/arch/arm/mach-u300/include/mach/system.h b/arch/arm/mach-u300/include/mach/system.h index 6b6fef7a438..574d46e3829 100644 --- a/arch/arm/mach-u300/include/mach/system.h +++ b/arch/arm/mach-u300/include/mach/system.h | |||
| @@ -8,33 +8,7 @@ | |||
| 8 | * System shutdown and reset functions. | 8 | * System shutdown and reset functions. |
| 9 | * Author: Linus Walleij <linus.walleij@stericsson.com> | 9 | * Author: Linus Walleij <linus.walleij@stericsson.com> |
| 10 | */ | 10 | */ |
| 11 | #include <mach/hardware.h> | ||
| 12 | #include <asm/io.h> | ||
| 13 | #include <asm/hardware/vic.h> | ||
| 14 | #include <asm/irq.h> | ||
| 15 | |||
| 16 | /* Forward declare this function from the watchdog */ | ||
| 17 | void coh901327_watchdog_reset(void); | ||
| 18 | |||
| 19 | static inline void arch_idle(void) | 11 | static inline void arch_idle(void) |
| 20 | { | 12 | { |
| 21 | cpu_do_idle(); | 13 | cpu_do_idle(); |
| 22 | } | 14 | } |
| 23 | |||
| 24 | static void arch_reset(char mode, const char *cmd) | ||
| 25 | { | ||
| 26 | switch (mode) { | ||
| 27 | case 's': | ||
| 28 | case 'h': | ||
| 29 | printk(KERN_CRIT "RESET: shutting down/rebooting system\n"); | ||
| 30 | #ifdef CONFIG_COH901327_WATCHDOG | ||
| 31 | coh901327_watchdog_reset(); | ||
| 32 | #endif | ||
| 33 | break; | ||
| 34 | default: | ||
| 35 | /* Do nothing */ | ||
| 36 | break; | ||
| 37 | } | ||
| 38 | /* Wait for system do die/reset. */ | ||
| 39 | while (1); | ||
| 40 | } | ||
diff --git a/arch/arm/mach-u300/u300.c b/arch/arm/mach-u300/u300.c index 5f0f7060f3a..f30c69d91d9 100644 --- a/arch/arm/mach-u300/u300.c +++ b/arch/arm/mach-u300/u300.c | |||
| @@ -53,4 +53,5 @@ MACHINE_START(U300, MACH_U300_STRING) | |||
| 53 | .handle_irq = vic_handle_irq, | 53 | .handle_irq = vic_handle_irq, |
| 54 | .timer = &u300_timer, | 54 | .timer = &u300_timer, |
| 55 | .init_machine = u300_init_machine, | 55 | .init_machine = u300_init_machine, |
| 56 | .restart = u300_restart, | ||
| 56 | MACHINE_END | 57 | MACHINE_END |
diff --git a/arch/arm/mach-ux500/include/mach/system.h b/arch/arm/mach-ux500/include/mach/system.h index c0cd8006f1a..258e5c919c2 100644 --- a/arch/arm/mach-ux500/include/mach/system.h +++ b/arch/arm/mach-ux500/include/mach/system.h | |||
| @@ -17,9 +17,4 @@ static inline void arch_idle(void) | |||
| 17 | cpu_do_idle(); | 17 | cpu_do_idle(); |
| 18 | } | 18 | } |
| 19 | 19 | ||
| 20 | static inline void arch_reset(char mode, const char *cmd) | ||
| 21 | { | ||
| 22 | /* yet to be implemented - TODO */ | ||
| 23 | } | ||
| 24 | |||
| 25 | #endif | 20 | #endif |
diff --git a/arch/arm/mach-versatile/core.c b/arch/arm/mach-versatile/core.c index 4d8dfc15f3e..cbcda61162d 100644 --- a/arch/arm/mach-versatile/core.c +++ b/arch/arm/mach-versatile/core.c | |||
| @@ -740,6 +740,19 @@ static void versatile_leds_event(led_event_t ledevt) | |||
| 740 | } | 740 | } |
| 741 | #endif /* CONFIG_LEDS */ | 741 | #endif /* CONFIG_LEDS */ |
| 742 | 742 | ||
| 743 | void versatile_restart(char mode, const char *cmd) | ||
| 744 | { | ||
| 745 | void __iomem *sys = __io_address(VERSATILE_SYS_BASE); | ||
| 746 | u32 val; | ||
| 747 | |||
| 748 | val = __raw_readl(sys + VERSATILE_SYS_RESETCTL_OFFSET); | ||
| 749 | val |= 0x105; | ||
| 750 | |||
| 751 | __raw_writel(0xa05f, sys + VERSATILE_SYS_LOCK_OFFSET); | ||
| 752 | __raw_writel(val, sys + VERSATILE_SYS_RESETCTL_OFFSET); | ||
| 753 | __raw_writel(0, sys + VERSATILE_SYS_LOCK_OFFSET); | ||
| 754 | } | ||
| 755 | |||
| 743 | /* Early initializations */ | 756 | /* Early initializations */ |
| 744 | void __init versatile_init_early(void) | 757 | void __init versatile_init_early(void) |
| 745 | { | 758 | { |
diff --git a/arch/arm/mach-versatile/core.h b/arch/arm/mach-versatile/core.h index e01422700eb..2ef2f555f31 100644 --- a/arch/arm/mach-versatile/core.h +++ b/arch/arm/mach-versatile/core.h | |||
| @@ -30,6 +30,7 @@ extern void __init versatile_init_early(void); | |||
| 30 | extern void __init versatile_init_irq(void); | 30 | extern void __init versatile_init_irq(void); |
| 31 | extern void __init versatile_map_io(void); | 31 | extern void __init versatile_map_io(void); |
| 32 | extern struct sys_timer versatile_timer; | 32 | extern struct sys_timer versatile_timer; |
| 33 | extern void versatile_restart(char, const char *); | ||
| 33 | extern unsigned int mmc_status(struct device *dev); | 34 | extern unsigned int mmc_status(struct device *dev); |
| 34 | #ifdef CONFIG_OF | 35 | #ifdef CONFIG_OF |
| 35 | extern struct of_dev_auxdata versatile_auxdata_lookup[]; | 36 | extern struct of_dev_auxdata versatile_auxdata_lookup[]; |
diff --git a/arch/arm/mach-versatile/include/mach/system.h b/arch/arm/mach-versatile/include/mach/system.h index 8ffc12a7cb2..f3fa347895f 100644 --- a/arch/arm/mach-versatile/include/mach/system.h +++ b/arch/arm/mach-versatile/include/mach/system.h | |||
| @@ -21,10 +21,6 @@ | |||
| 21 | #ifndef __ASM_ARCH_SYSTEM_H | 21 | #ifndef __ASM_ARCH_SYSTEM_H |
| 22 | #define __ASM_ARCH_SYSTEM_H | 22 | #define __ASM_ARCH_SYSTEM_H |
| 23 | 23 | ||
| 24 | #include <linux/io.h> | ||
| 25 | #include <mach/hardware.h> | ||
| 26 | #include <mach/platform.h> | ||
| 27 | |||
| 28 | static inline void arch_idle(void) | 24 | static inline void arch_idle(void) |
| 29 | { | 25 | { |
| 30 | /* | 26 | /* |
| @@ -34,16 +30,4 @@ static inline void arch_idle(void) | |||
| 34 | cpu_do_idle(); | 30 | cpu_do_idle(); |
| 35 | } | 31 | } |
| 36 | 32 | ||
| 37 | static inline void arch_reset(char mode, const char *cmd) | ||
| 38 | { | ||
| 39 | u32 val; | ||
| 40 | |||
| 41 | val = __raw_readl(IO_ADDRESS(VERSATILE_SYS_RESETCTL)) & ~0x7; | ||
| 42 | val |= 0x105; | ||
| 43 | |||
| 44 | __raw_writel(0xa05f, IO_ADDRESS(VERSATILE_SYS_LOCK)); | ||
| 45 | __raw_writel(val, IO_ADDRESS(VERSATILE_SYS_RESETCTL)); | ||
| 46 | __raw_writel(0, IO_ADDRESS(VERSATILE_SYS_LOCK)); | ||
| 47 | } | ||
| 48 | |||
| 49 | #endif | 33 | #endif |
diff --git a/arch/arm/mach-versatile/versatile_ab.c b/arch/arm/mach-versatile/versatile_ab.c index c83a1f379f7..63b8dd2b9f4 100644 --- a/arch/arm/mach-versatile/versatile_ab.c +++ b/arch/arm/mach-versatile/versatile_ab.c | |||
| @@ -43,4 +43,5 @@ MACHINE_START(VERSATILE_AB, "ARM-Versatile AB") | |||
| 43 | .handle_irq = vic_handle_irq, | 43 | .handle_irq = vic_handle_irq, |
| 44 | .timer = &versatile_timer, | 44 | .timer = &versatile_timer, |
| 45 | .init_machine = versatile_init, | 45 | .init_machine = versatile_init, |
| 46 | .restart = versatile_restart, | ||
| 46 | MACHINE_END | 47 | MACHINE_END |
diff --git a/arch/arm/mach-versatile/versatile_dt.c b/arch/arm/mach-versatile/versatile_dt.c index f4d1e0f072c..ae5ad3c8f3d 100644 --- a/arch/arm/mach-versatile/versatile_dt.c +++ b/arch/arm/mach-versatile/versatile_dt.c | |||
| @@ -50,4 +50,5 @@ DT_MACHINE_START(VERSATILE_PB, "ARM-Versatile (Device Tree Support)") | |||
| 50 | .timer = &versatile_timer, | 50 | .timer = &versatile_timer, |
| 51 | .init_machine = versatile_dt_init, | 51 | .init_machine = versatile_dt_init, |
| 52 | .dt_compat = versatile_dt_match, | 52 | .dt_compat = versatile_dt_match, |
| 53 | .restart = versatile_restart, | ||
| 53 | MACHINE_END | 54 | MACHINE_END |
diff --git a/arch/arm/mach-versatile/versatile_pb.c b/arch/arm/mach-versatile/versatile_pb.c index 4d31eeb6c10..7aab79b665e 100644 --- a/arch/arm/mach-versatile/versatile_pb.c +++ b/arch/arm/mach-versatile/versatile_pb.c | |||
| @@ -111,4 +111,5 @@ MACHINE_START(VERSATILE_PB, "ARM-Versatile PB") | |||
| 111 | .handle_irq = vic_handle_irq, | 111 | .handle_irq = vic_handle_irq, |
| 112 | .timer = &versatile_timer, | 112 | .timer = &versatile_timer, |
| 113 | .init_machine = versatile_pb_init, | 113 | .init_machine = versatile_pb_init, |
| 114 | .restart = versatile_restart, | ||
| 114 | MACHINE_END | 115 | MACHINE_END |
diff --git a/arch/arm/mach-vexpress/include/mach/system.h b/arch/arm/mach-vexpress/include/mach/system.h index 899a4e628a4..f653a8e265b 100644 --- a/arch/arm/mach-vexpress/include/mach/system.h +++ b/arch/arm/mach-vexpress/include/mach/system.h | |||
| @@ -30,8 +30,4 @@ static inline void arch_idle(void) | |||
| 30 | cpu_do_idle(); | 30 | cpu_do_idle(); |
| 31 | } | 31 | } |
| 32 | 32 | ||
| 33 | static inline void arch_reset(char mode, const char *cmd) | ||
| 34 | { | ||
| 35 | } | ||
| 36 | |||
| 37 | #endif | 33 | #endif |
diff --git a/arch/arm/mach-vexpress/v2m.c b/arch/arm/mach-vexpress/v2m.c index 7aa07a8ce23..6dd10e320ef 100644 --- a/arch/arm/mach-vexpress/v2m.c +++ b/arch/arm/mach-vexpress/v2m.c | |||
| @@ -438,7 +438,6 @@ static void __init v2m_init(void) | |||
| 438 | amba_device_register(v2m_amba_devs[i], &iomem_resource); | 438 | amba_device_register(v2m_amba_devs[i], &iomem_resource); |
| 439 | 439 | ||
| 440 | pm_power_off = v2m_power_off; | 440 | pm_power_off = v2m_power_off; |
| 441 | arm_pm_restart = v2m_restart; | ||
| 442 | 441 | ||
| 443 | ct_desc->init_tile(); | 442 | ct_desc->init_tile(); |
| 444 | } | 443 | } |
| @@ -451,4 +450,5 @@ MACHINE_START(VEXPRESS, "ARM-Versatile Express") | |||
| 451 | .timer = &v2m_timer, | 450 | .timer = &v2m_timer, |
| 452 | .handle_irq = gic_handle_irq, | 451 | .handle_irq = gic_handle_irq, |
| 453 | .init_machine = v2m_init, | 452 | .init_machine = v2m_init, |
| 453 | .restart = v2m_restart, | ||
| 454 | MACHINE_END | 454 | MACHINE_END |
diff --git a/arch/arm/mach-w90x900/cpu.c b/arch/arm/mach-w90x900/cpu.c index 0a235e50233..604e1db266e 100644 --- a/arch/arm/mach-w90x900/cpu.c +++ b/arch/arm/mach-w90x900/cpu.c | |||
| @@ -33,9 +33,11 @@ | |||
| 33 | #include <mach/regs-serial.h> | 33 | #include <mach/regs-serial.h> |
| 34 | #include <mach/regs-clock.h> | 34 | #include <mach/regs-clock.h> |
| 35 | #include <mach/regs-ebi.h> | 35 | #include <mach/regs-ebi.h> |
| 36 | #include <mach/regs-timer.h> | ||
| 36 | 37 | ||
| 37 | #include "cpu.h" | 38 | #include "cpu.h" |
| 38 | #include "clock.h" | 39 | #include "clock.h" |
| 40 | #include "nuc9xx.h" | ||
| 39 | 41 | ||
| 40 | /* Initial IO mappings */ | 42 | /* Initial IO mappings */ |
| 41 | 43 | ||
| @@ -222,3 +224,17 @@ void __init nuc900_init_clocks(void) | |||
| 222 | clkdev_add_table(nuc900_clkregs, ARRAY_SIZE(nuc900_clkregs)); | 224 | clkdev_add_table(nuc900_clkregs, ARRAY_SIZE(nuc900_clkregs)); |
| 223 | } | 225 | } |
| 224 | 226 | ||
| 227 | #define WTCR (TMR_BA + 0x1C) | ||
| 228 | #define WTCLK (1 << 10) | ||
| 229 | #define WTE (1 << 7) | ||
| 230 | #define WTRE (1 << 1) | ||
| 231 | |||
| 232 | void nuc9xx_restart(char mode, const char *cmd) | ||
| 233 | { | ||
| 234 | if (mode == 's') { | ||
| 235 | /* Jump into ROM at address 0 */ | ||
| 236 | soft_restart(0); | ||
| 237 | } else { | ||
| 238 | __raw_writel(WTE | WTRE | WTCLK, WTCR); | ||
| 239 | } | ||
| 240 | } | ||
diff --git a/arch/arm/mach-w90x900/include/mach/system.h b/arch/arm/mach-w90x900/include/mach/system.h index 68875a1c16b..2aaeb931161 100644 --- a/arch/arm/mach-w90x900/include/mach/system.h +++ b/arch/arm/mach-w90x900/include/mach/system.h | |||
| @@ -14,28 +14,6 @@ | |||
| 14 | * (at your option) any later version. | 14 | * (at your option) any later version. |
| 15 | * | 15 | * |
| 16 | */ | 16 | */ |
| 17 | |||
| 18 | #include <linux/io.h> | ||
| 19 | #include <asm/proc-fns.h> | ||
| 20 | #include <mach/map.h> | ||
| 21 | #include <mach/regs-timer.h> | ||
| 22 | |||
| 23 | #define WTCR (TMR_BA + 0x1C) | ||
| 24 | #define WTCLK (1 << 10) | ||
| 25 | #define WTE (1 << 7) | ||
| 26 | #define WTRE (1 << 1) | ||
| 27 | |||
| 28 | static void arch_idle(void) | 17 | static void arch_idle(void) |
| 29 | { | 18 | { |
| 30 | } | 19 | } |
| 31 | |||
| 32 | static void arch_reset(char mode, const char *cmd) | ||
| 33 | { | ||
| 34 | if (mode == 's') { | ||
| 35 | /* Jump into ROM at address 0 */ | ||
| 36 | soft_restart(0); | ||
| 37 | } else { | ||
| 38 | __raw_writel(WTE | WTRE | WTCLK, WTCR); | ||
| 39 | } | ||
| 40 | } | ||
| 41 | |||
diff --git a/arch/arm/mach-w90x900/mach-nuc910evb.c b/arch/arm/mach-w90x900/mach-nuc910evb.c index 31c10901822..b4243e4f156 100644 --- a/arch/arm/mach-w90x900/mach-nuc910evb.c +++ b/arch/arm/mach-w90x900/mach-nuc910evb.c | |||
| @@ -38,4 +38,5 @@ MACHINE_START(W90P910EVB, "W90P910EVB") | |||
| 38 | .init_irq = nuc900_init_irq, | 38 | .init_irq = nuc900_init_irq, |
| 39 | .init_machine = nuc910evb_init, | 39 | .init_machine = nuc910evb_init, |
| 40 | .timer = &nuc900_timer, | 40 | .timer = &nuc900_timer, |
| 41 | .restart = nuc9xx_restart, | ||
| 41 | MACHINE_END | 42 | MACHINE_END |
diff --git a/arch/arm/mach-w90x900/mach-nuc950evb.c b/arch/arm/mach-w90x900/mach-nuc950evb.c index 4062e55a57d..067d8f9166d 100644 --- a/arch/arm/mach-w90x900/mach-nuc950evb.c +++ b/arch/arm/mach-w90x900/mach-nuc950evb.c | |||
| @@ -41,4 +41,5 @@ MACHINE_START(W90P950EVB, "W90P950EVB") | |||
| 41 | .init_irq = nuc900_init_irq, | 41 | .init_irq = nuc900_init_irq, |
| 42 | .init_machine = nuc950evb_init, | 42 | .init_machine = nuc950evb_init, |
| 43 | .timer = &nuc900_timer, | 43 | .timer = &nuc900_timer, |
| 44 | .restart = nuc9xx_restart, | ||
| 44 | MACHINE_END | 45 | MACHINE_END |
diff --git a/arch/arm/mach-w90x900/mach-nuc960evb.c b/arch/arm/mach-w90x900/mach-nuc960evb.c index 0ab9995d5b5..cbb3adc3db1 100644 --- a/arch/arm/mach-w90x900/mach-nuc960evb.c +++ b/arch/arm/mach-w90x900/mach-nuc960evb.c | |||
| @@ -38,4 +38,5 @@ MACHINE_START(W90N960EVB, "W90N960EVB") | |||
| 38 | .init_irq = nuc900_init_irq, | 38 | .init_irq = nuc900_init_irq, |
| 39 | .init_machine = nuc960evb_init, | 39 | .init_machine = nuc960evb_init, |
| 40 | .timer = &nuc900_timer, | 40 | .timer = &nuc900_timer, |
| 41 | .restart = nuc9xx_restart, | ||
| 41 | MACHINE_END | 42 | MACHINE_END |
diff --git a/arch/arm/mach-w90x900/nuc9xx.h b/arch/arm/mach-w90x900/nuc9xx.h index 847c4f3e044..91acb404779 100644 --- a/arch/arm/mach-w90x900/nuc9xx.h +++ b/arch/arm/mach-w90x900/nuc9xx.h | |||
| @@ -21,3 +21,4 @@ struct sys_timer; | |||
| 21 | 21 | ||
| 22 | extern void nuc900_init_irq(void); | 22 | extern void nuc900_init_irq(void); |
| 23 | extern struct sys_timer nuc900_timer; | 23 | extern struct sys_timer nuc900_timer; |
| 24 | extern void nuc9xx_restart(char, const char *); | ||
diff --git a/arch/arm/mach-zynq/include/mach/system.h b/arch/arm/mach-zynq/include/mach/system.h index 1b84d705c67..8e88e0b8d2b 100644 --- a/arch/arm/mach-zynq/include/mach/system.h +++ b/arch/arm/mach-zynq/include/mach/system.h | |||
| @@ -20,9 +20,4 @@ static inline void arch_idle(void) | |||
| 20 | cpu_do_idle(); | 20 | cpu_do_idle(); |
| 21 | } | 21 | } |
| 22 | 22 | ||
| 23 | static inline void arch_reset(char mode, const char *cmd) | ||
| 24 | { | ||
| 25 | /* Add architecture specific reset processing here */ | ||
| 26 | } | ||
| 27 | |||
| 28 | #endif | 23 | #endif |
diff --git a/arch/arm/plat-iop/Makefile b/arch/arm/plat-iop/Makefile index 90f7153a8d7..a99dc15a70f 100644 --- a/arch/arm/plat-iop/Makefile +++ b/arch/arm/plat-iop/Makefile | |||
| @@ -13,6 +13,7 @@ obj-$(CONFIG_ARCH_IOP32X) += time.o | |||
| 13 | obj-$(CONFIG_ARCH_IOP32X) += cp6.o | 13 | obj-$(CONFIG_ARCH_IOP32X) += cp6.o |
| 14 | obj-$(CONFIG_ARCH_IOP32X) += adma.o | 14 | obj-$(CONFIG_ARCH_IOP32X) += adma.o |
| 15 | obj-$(CONFIG_ARCH_IOP32X) += pmu.o | 15 | obj-$(CONFIG_ARCH_IOP32X) += pmu.o |
| 16 | obj-$(CONFIG_ARCH_IOP32X) += restart.o | ||
| 16 | 17 | ||
| 17 | # IOP33X | 18 | # IOP33X |
| 18 | obj-$(CONFIG_ARCH_IOP33X) += gpio.o | 19 | obj-$(CONFIG_ARCH_IOP33X) += gpio.o |
| @@ -23,6 +24,7 @@ obj-$(CONFIG_ARCH_IOP33X) += time.o | |||
| 23 | obj-$(CONFIG_ARCH_IOP33X) += cp6.o | 24 | obj-$(CONFIG_ARCH_IOP33X) += cp6.o |
| 24 | obj-$(CONFIG_ARCH_IOP33X) += adma.o | 25 | obj-$(CONFIG_ARCH_IOP33X) += adma.o |
| 25 | obj-$(CONFIG_ARCH_IOP33X) += pmu.o | 26 | obj-$(CONFIG_ARCH_IOP33X) += pmu.o |
| 27 | obj-$(CONFIG_ARCH_IOP33X) += restart.o | ||
| 26 | 28 | ||
| 27 | # IOP13XX | 29 | # IOP13XX |
| 28 | obj-$(CONFIG_ARCH_IOP13XX) += cp6.o | 30 | obj-$(CONFIG_ARCH_IOP13XX) += cp6.o |
diff --git a/arch/arm/plat-iop/restart.c b/arch/arm/plat-iop/restart.c new file mode 100644 index 00000000000..6a85a0c502e --- /dev/null +++ b/arch/arm/plat-iop/restart.c | |||
| @@ -0,0 +1,19 @@ | |||
| 1 | /* | ||
| 2 | * restart.c | ||
| 3 | * | ||
| 4 | * Copyright (C) 2001 MontaVista Software, Inc. | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License version 2 as | ||
| 8 | * published by the Free Software Foundation. | ||
| 9 | */ | ||
| 10 | #include <asm/hardware/iop3xx.h> | ||
| 11 | #include <mach/hardware.h> | ||
| 12 | |||
| 13 | void iop3xx_restart(char mode, const char *cmd) | ||
| 14 | { | ||
| 15 | *IOP3XX_PCSR = 0x30; | ||
| 16 | |||
| 17 | /* Jump into ROM at address 0 */ | ||
| 18 | soft_restart(0); | ||
| 19 | } | ||
diff --git a/arch/arm/plat-mxc/cpufreq.c b/arch/arm/plat-mxc/cpufreq.c index 74aac96cda2..adbff706ef6 100644 --- a/arch/arm/plat-mxc/cpufreq.c +++ b/arch/arm/plat-mxc/cpufreq.c | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | * the CPU clock speed on the fly. | 17 | * the CPU clock speed on the fly. |
| 18 | */ | 18 | */ |
| 19 | 19 | ||
| 20 | #include <linux/module.h> | ||
| 20 | #include <linux/cpufreq.h> | 21 | #include <linux/cpufreq.h> |
| 21 | #include <linux/clk.h> | 22 | #include <linux/clk.h> |
| 22 | #include <linux/err.h> | 23 | #include <linux/err.h> |
diff --git a/arch/arm/plat-mxc/include/mach/common.h b/arch/arm/plat-mxc/include/mach/common.h index 6698cae942f..83cca9bcfc9 100644 --- a/arch/arm/plat-mxc/include/mach/common.h +++ b/arch/arm/plat-mxc/include/mach/common.h | |||
| @@ -71,8 +71,8 @@ extern int mx6q_clocks_init(void); | |||
| 71 | extern struct platform_device *mxc_register_gpio(char *name, int id, | 71 | extern struct platform_device *mxc_register_gpio(char *name, int id, |
| 72 | resource_size_t iobase, resource_size_t iosize, int irq, int irq_high); | 72 | resource_size_t iobase, resource_size_t iosize, int irq, int irq_high); |
| 73 | extern void mxc_set_cpu_type(unsigned int type); | 73 | extern void mxc_set_cpu_type(unsigned int type); |
| 74 | extern void mxc_restart(char, const char *); | ||
| 74 | extern void mxc_arch_reset_init(void __iomem *); | 75 | extern void mxc_arch_reset_init(void __iomem *); |
| 75 | extern void mx51_efikamx_reset(void); | ||
| 76 | extern int mx53_revision(void); | 76 | extern int mx53_revision(void); |
| 77 | extern int mx53_display_revision(void); | 77 | extern int mx53_display_revision(void); |
| 78 | 78 | ||
| @@ -121,6 +121,7 @@ static inline void imx_smp_prepare(void) {} | |||
| 121 | extern void imx_enable_cpu(int cpu, bool enable); | 121 | extern void imx_enable_cpu(int cpu, bool enable); |
| 122 | extern void imx_set_cpu_jump(int cpu, void *jump_addr); | 122 | extern void imx_set_cpu_jump(int cpu, void *jump_addr); |
| 123 | extern void imx_src_init(void); | 123 | extern void imx_src_init(void); |
| 124 | extern void imx_src_prepare_restart(void); | ||
| 124 | extern void imx_gpc_init(void); | 125 | extern void imx_gpc_init(void); |
| 125 | extern void imx_gpc_pre_suspend(void); | 126 | extern void imx_gpc_pre_suspend(void); |
| 126 | extern void imx_gpc_post_resume(void); | 127 | extern void imx_gpc_post_resume(void); |
diff --git a/arch/arm/plat-mxc/include/mach/system.h b/arch/arm/plat-mxc/include/mach/system.h index b9895d25016..13ad0df2e86 100644 --- a/arch/arm/plat-mxc/include/mach/system.h +++ b/arch/arm/plat-mxc/include/mach/system.h | |||
| @@ -22,6 +22,4 @@ static inline void arch_idle(void) | |||
| 22 | cpu_do_idle(); | 22 | cpu_do_idle(); |
| 23 | } | 23 | } |
| 24 | 24 | ||
| 25 | void arch_reset(char mode, const char *cmd); | ||
| 26 | |||
| 27 | #endif /* __ASM_ARCH_MXC_SYSTEM_H__ */ | 25 | #endif /* __ASM_ARCH_MXC_SYSTEM_H__ */ |
diff --git a/arch/arm/plat-mxc/pwm.c b/arch/arm/plat-mxc/pwm.c index 42d74ea5908..845de59f07e 100644 --- a/arch/arm/plat-mxc/pwm.c +++ b/arch/arm/plat-mxc/pwm.c | |||
| @@ -32,6 +32,9 @@ | |||
| 32 | #define MX3_PWMSAR 0x0C /* PWM Sample Register */ | 32 | #define MX3_PWMSAR 0x0C /* PWM Sample Register */ |
| 33 | #define MX3_PWMPR 0x10 /* PWM Period Register */ | 33 | #define MX3_PWMPR 0x10 /* PWM Period Register */ |
| 34 | #define MX3_PWMCR_PRESCALER(x) (((x - 1) & 0xFFF) << 4) | 34 | #define MX3_PWMCR_PRESCALER(x) (((x - 1) & 0xFFF) << 4) |
| 35 | #define MX3_PWMCR_DOZEEN (1 << 24) | ||
| 36 | #define MX3_PWMCR_WAITEN (1 << 23) | ||
| 37 | #define MX3_PWMCR_DBGEN (1 << 22) | ||
| 35 | #define MX3_PWMCR_CLKSRC_IPG_HIGH (2 << 16) | 38 | #define MX3_PWMCR_CLKSRC_IPG_HIGH (2 << 16) |
| 36 | #define MX3_PWMCR_CLKSRC_IPG (1 << 16) | 39 | #define MX3_PWMCR_CLKSRC_IPG (1 << 16) |
| 37 | #define MX3_PWMCR_EN (1 << 0) | 40 | #define MX3_PWMCR_EN (1 << 0) |
| @@ -77,7 +80,9 @@ int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns) | |||
| 77 | writel(duty_cycles, pwm->mmio_base + MX3_PWMSAR); | 80 | writel(duty_cycles, pwm->mmio_base + MX3_PWMSAR); |
| 78 | writel(period_cycles, pwm->mmio_base + MX3_PWMPR); | 81 | writel(period_cycles, pwm->mmio_base + MX3_PWMPR); |
| 79 | 82 | ||
| 80 | cr = MX3_PWMCR_PRESCALER(prescale) | MX3_PWMCR_EN; | 83 | cr = MX3_PWMCR_PRESCALER(prescale) | |
| 84 | MX3_PWMCR_DOZEEN | MX3_PWMCR_WAITEN | | ||
| 85 | MX3_PWMCR_DBGEN | MX3_PWMCR_EN; | ||
| 81 | 86 | ||
| 82 | if (cpu_is_mx25()) | 87 | if (cpu_is_mx25()) |
| 83 | cr |= MX3_PWMCR_CLKSRC_IPG; | 88 | cr |= MX3_PWMCR_CLKSRC_IPG; |
diff --git a/arch/arm/plat-mxc/system.c b/arch/arm/plat-mxc/system.c index 7e5c76ea446..3599bf2cfd4 100644 --- a/arch/arm/plat-mxc/system.c +++ b/arch/arm/plat-mxc/system.c | |||
| @@ -37,17 +37,10 @@ static void __iomem *wdog_base; | |||
| 37 | /* | 37 | /* |
| 38 | * Reset the system. It is called by machine_restart(). | 38 | * Reset the system. It is called by machine_restart(). |
| 39 | */ | 39 | */ |
| 40 | void arch_reset(char mode, const char *cmd) | 40 | void mxc_restart(char mode, const char *cmd) |
| 41 | { | 41 | { |
| 42 | unsigned int wcr_enable; | 42 | unsigned int wcr_enable; |
| 43 | 43 | ||
| 44 | #ifdef CONFIG_MACH_MX51_EFIKAMX | ||
| 45 | if (machine_is_mx51_efikamx()) { | ||
| 46 | mx51_efikamx_reset(); | ||
| 47 | return; | ||
| 48 | } | ||
| 49 | #endif | ||
| 50 | |||
| 51 | if (cpu_is_mx1()) { | 44 | if (cpu_is_mx1()) { |
| 52 | wcr_enable = (1 << 0); | 45 | wcr_enable = (1 << 0); |
| 53 | } else { | 46 | } else { |
diff --git a/arch/arm/plat-omap/include/plat/system.h b/arch/arm/plat-omap/include/plat/system.h index c5fa9e92900..8e5ebd74b12 100644 --- a/arch/arm/plat-omap/include/plat/system.h +++ b/arch/arm/plat-omap/include/plat/system.h | |||
| @@ -12,6 +12,4 @@ static inline void arch_idle(void) | |||
| 12 | cpu_do_idle(); | 12 | cpu_do_idle(); |
| 13 | } | 13 | } |
| 14 | 14 | ||
| 15 | extern void (*arch_reset)(char, const char *); | ||
| 16 | |||
| 17 | #endif | 15 | #endif |
diff --git a/arch/arm/plat-s3c24xx/cpu.c b/arch/arm/plat-s3c24xx/cpu.c index 3c6335307fb..1121df13e15 100644 --- a/arch/arm/plat-s3c24xx/cpu.c +++ b/arch/arm/plat-s3c24xx/cpu.c | |||
| @@ -192,27 +192,6 @@ static unsigned long s3c24xx_read_idcode_v4(void) | |||
| 192 | return __raw_readl(S3C2410_GSTATUS1); | 192 | return __raw_readl(S3C2410_GSTATUS1); |
| 193 | } | 193 | } |
| 194 | 194 | ||
| 195 | /* Hook for arm_pm_restart to ensure we execute the reset code | ||
| 196 | * with the caches enabled. It seems at least the S3C2440 has a problem | ||
| 197 | * resetting if there is bus activity interrupted by the reset. | ||
| 198 | */ | ||
| 199 | static void s3c24xx_pm_restart(char mode, const char *cmd) | ||
| 200 | { | ||
| 201 | if (mode != 's') { | ||
| 202 | unsigned long flags; | ||
| 203 | |||
| 204 | local_irq_save(flags); | ||
| 205 | __cpuc_flush_kern_all(); | ||
| 206 | __cpuc_flush_user_all(); | ||
| 207 | |||
| 208 | arch_reset(mode, cmd); | ||
| 209 | local_irq_restore(flags); | ||
| 210 | } | ||
| 211 | |||
| 212 | /* fallback, or unhandled */ | ||
| 213 | arm_machine_restart(mode, cmd); | ||
| 214 | } | ||
| 215 | |||
| 216 | void __init s3c24xx_init_io(struct map_desc *mach_desc, int size) | 195 | void __init s3c24xx_init_io(struct map_desc *mach_desc, int size) |
| 217 | { | 196 | { |
| 218 | /* initialise the io descriptors we need for initialisation */ | 197 | /* initialise the io descriptors we need for initialisation */ |
| @@ -226,7 +205,5 @@ void __init s3c24xx_init_io(struct map_desc *mach_desc, int size) | |||
| 226 | } | 205 | } |
| 227 | s3c24xx_init_cpu(); | 206 | s3c24xx_init_cpu(); |
| 228 | 207 | ||
| 229 | arm_pm_restart = s3c24xx_pm_restart; | ||
| 230 | |||
| 231 | s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids)); | 208 | s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids)); |
| 232 | } | 209 | } |
diff --git a/arch/arm/plat-s5p/Makefile b/arch/arm/plat-s5p/Makefile index 876344038b8..30d8c3016e6 100644 --- a/arch/arm/plat-s5p/Makefile +++ b/arch/arm/plat-s5p/Makefile | |||
| @@ -13,7 +13,6 @@ obj- := | |||
| 13 | # Core files | 13 | # Core files |
| 14 | 14 | ||
| 15 | obj-y += dev-uart.o | 15 | obj-y += dev-uart.o |
| 16 | obj-y += cpu.o | ||
| 17 | obj-y += clock.o | 16 | obj-y += clock.o |
| 18 | obj-y += irq.o | 17 | obj-y += irq.o |
| 19 | obj-$(CONFIG_S5P_EXT_INT) += irq-eint.o | 18 | obj-$(CONFIG_S5P_EXT_INT) += irq-eint.o |
diff --git a/arch/arm/plat-s5p/cpu.c b/arch/arm/plat-s5p/cpu.c deleted file mode 100644 index a56959e8351..00000000000 --- a/arch/arm/plat-s5p/cpu.c +++ /dev/null | |||
| @@ -1,144 +0,0 @@ | |||
| 1 | /* linux/arch/arm/plat-s5p/cpu.c | ||
| 2 | * | ||
| 3 | * Copyright (c) 2009-2011 Samsung Electronics Co., Ltd. | ||
| 4 | * http://www.samsung.com | ||
| 5 | * | ||
| 6 | * S5P CPU Support | ||
| 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 version 2 as | ||
| 10 | * published by the Free Software Foundation. | ||
| 11 | */ | ||
| 12 | |||
| 13 | #include <linux/init.h> | ||
| 14 | #include <linux/module.h> | ||
| 15 | |||
| 16 | #include <asm/mach/arch.h> | ||
| 17 | #include <asm/mach/map.h> | ||
| 18 | |||
| 19 | #include <mach/map.h> | ||
| 20 | #include <mach/regs-clock.h> | ||
| 21 | |||
| 22 | #include <plat/cpu.h> | ||
| 23 | #include <plat/s5p6440.h> | ||
| 24 | #include <plat/s5p6450.h> | ||
| 25 | #include <plat/s5pc100.h> | ||
| 26 | #include <plat/s5pv210.h> | ||
| 27 | #include <plat/exynos4.h> | ||
| 28 | |||
| 29 | /* table of supported CPUs */ | ||
| 30 | |||
| 31 | static const char name_s5p6440[] = "S5P6440"; | ||
| 32 | static const char name_s5p6450[] = "S5P6450"; | ||
| 33 | static const char name_s5pc100[] = "S5PC100"; | ||
| 34 | static const char name_s5pv210[] = "S5PV210/S5PC110"; | ||
| 35 | static const char name_exynos4210[] = "EXYNOS4210"; | ||
| 36 | static const char name_exynos4212[] = "EXYNOS4212"; | ||
| 37 | static const char name_exynos4412[] = "EXYNOS4412"; | ||
| 38 | |||
| 39 | static struct cpu_table cpu_ids[] __initdata = { | ||
| 40 | { | ||
| 41 | .idcode = S5P6440_CPU_ID, | ||
| 42 | .idmask = S5P64XX_CPU_MASK, | ||
| 43 | .map_io = s5p6440_map_io, | ||
| 44 | .init_clocks = s5p6440_init_clocks, | ||
| 45 | .init_uarts = s5p6440_init_uarts, | ||
| 46 | .init = s5p64x0_init, | ||
| 47 | .name = name_s5p6440, | ||
| 48 | }, { | ||
| 49 | .idcode = S5P6450_CPU_ID, | ||
| 50 | .idmask = S5P64XX_CPU_MASK, | ||
| 51 | .map_io = s5p6450_map_io, | ||
| 52 | .init_clocks = s5p6450_init_clocks, | ||
| 53 | .init_uarts = s5p6450_init_uarts, | ||
| 54 | .init = s5p64x0_init, | ||
| 55 | .name = name_s5p6450, | ||
| 56 | }, { | ||
| 57 | .idcode = S5PC100_CPU_ID, | ||
| 58 | .idmask = S5PC100_CPU_MASK, | ||
| 59 | .map_io = s5pc100_map_io, | ||
| 60 | .init_clocks = s5pc100_init_clocks, | ||
| 61 | .init_uarts = s5pc100_init_uarts, | ||
| 62 | .init = s5pc100_init, | ||
| 63 | .name = name_s5pc100, | ||
| 64 | }, { | ||
| 65 | .idcode = S5PV210_CPU_ID, | ||
| 66 | .idmask = S5PV210_CPU_MASK, | ||
| 67 | .map_io = s5pv210_map_io, | ||
| 68 | .init_clocks = s5pv210_init_clocks, | ||
| 69 | .init_uarts = s5pv210_init_uarts, | ||
| 70 | .init = s5pv210_init, | ||
| 71 | .name = name_s5pv210, | ||
| 72 | }, { | ||
| 73 | .idcode = EXYNOS4210_CPU_ID, | ||
| 74 | .idmask = EXYNOS4_CPU_MASK, | ||
| 75 | .map_io = exynos4_map_io, | ||
| 76 | .init_clocks = exynos4_init_clocks, | ||
| 77 | .init_uarts = exynos4_init_uarts, | ||
| 78 | .init = exynos_init, | ||
| 79 | .name = name_exynos4210, | ||
| 80 | }, { | ||
| 81 | .idcode = EXYNOS4212_CPU_ID, | ||
| 82 | .idmask = EXYNOS4_CPU_MASK, | ||
| 83 | .map_io = exynos4_map_io, | ||
| 84 | .init_clocks = exynos4_init_clocks, | ||
| 85 | .init_uarts = exynos4_init_uarts, | ||
| 86 | .init = exynos_init, | ||
| 87 | .name = name_exynos4212, | ||
| 88 | }, { | ||
| 89 | .idcode = EXYNOS4412_CPU_ID, | ||
| 90 | .idmask = EXYNOS4_CPU_MASK, | ||
| 91 | .map_io = exynos4_map_io, | ||
| 92 | .init_clocks = exynos4_init_clocks, | ||
| 93 | .init_uarts = exynos4_init_uarts, | ||
| 94 | .init = exynos_init, | ||
| 95 | .name = name_exynos4412, | ||
| 96 | }, | ||
| 97 | }; | ||
| 98 | |||
| 99 | /* minimal IO mapping */ | ||
| 100 | |||
| 101 | static struct map_desc s5p_iodesc[] __initdata = { | ||
| 102 | { | ||
| 103 | .virtual = (unsigned long)S5P_VA_CHIPID, | ||
| 104 | .pfn = __phys_to_pfn(S5P_PA_CHIPID), | ||
| 105 | .length = SZ_4K, | ||
| 106 | .type = MT_DEVICE, | ||
| 107 | }, { | ||
| 108 | .virtual = (unsigned long)S3C_VA_SYS, | ||
| 109 | .pfn = __phys_to_pfn(S5P_PA_SYSCON), | ||
| 110 | .length = SZ_64K, | ||
| 111 | .type = MT_DEVICE, | ||
| 112 | }, { | ||
| 113 | .virtual = (unsigned long)S3C_VA_TIMER, | ||
| 114 | .pfn = __phys_to_pfn(S5P_PA_TIMER), | ||
| 115 | .length = SZ_16K, | ||
| 116 | .type = MT_DEVICE, | ||
| 117 | }, { | ||
| 118 | .virtual = (unsigned long)S3C_VA_WATCHDOG, | ||
| 119 | .pfn = __phys_to_pfn(S3C_PA_WDT), | ||
| 120 | .length = SZ_4K, | ||
| 121 | .type = MT_DEVICE, | ||
| 122 | }, { | ||
| 123 | .virtual = (unsigned long)S5P_VA_SROMC, | ||
| 124 | .pfn = __phys_to_pfn(S5P_PA_SROMC), | ||
| 125 | .length = SZ_4K, | ||
| 126 | .type = MT_DEVICE, | ||
| 127 | }, | ||
| 128 | }; | ||
| 129 | |||
| 130 | /* read cpu identification code */ | ||
| 131 | |||
| 132 | void __init s5p_init_io(struct map_desc *mach_desc, | ||
| 133 | int size, void __iomem *cpuid_addr) | ||
| 134 | { | ||
| 135 | /* initialize the io descriptors we need for initialization */ | ||
| 136 | iotable_init(s5p_iodesc, ARRAY_SIZE(s5p_iodesc)); | ||
| 137 | if (mach_desc) | ||
| 138 | iotable_init(mach_desc, size); | ||
| 139 | |||
| 140 | /* detect cpu id and rev. */ | ||
| 141 | s5p_init_cpu(cpuid_addr); | ||
| 142 | |||
| 143 | s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids)); | ||
| 144 | } | ||
diff --git a/arch/arm/plat-samsung/dev-backlight.c b/arch/arm/plat-samsung/dev-backlight.c index e657305644c..a976c023b28 100644 --- a/arch/arm/plat-samsung/dev-backlight.c +++ b/arch/arm/plat-samsung/dev-backlight.c | |||
| @@ -15,7 +15,6 @@ | |||
| 15 | #include <linux/slab.h> | 15 | #include <linux/slab.h> |
| 16 | #include <linux/io.h> | 16 | #include <linux/io.h> |
| 17 | #include <linux/pwm_backlight.h> | 17 | #include <linux/pwm_backlight.h> |
| 18 | #include <linux/slab.h> | ||
| 19 | 18 | ||
| 20 | #include <plat/devs.h> | 19 | #include <plat/devs.h> |
| 21 | #include <plat/gpio-cfg.h> | 20 | #include <plat/gpio-cfg.h> |
diff --git a/arch/arm/plat-samsung/include/plat/cpu.h b/arch/arm/plat-samsung/include/plat/cpu.h index 40fd7b6b5e6..258d9d8a94f 100644 --- a/arch/arm/plat-samsung/include/plat/cpu.h +++ b/arch/arm/plat-samsung/include/plat/cpu.h | |||
| @@ -152,13 +152,9 @@ extern void s3c_init_cpu(unsigned long idcode, | |||
| 152 | /* core initialisation functions */ | 152 | /* core initialisation functions */ |
| 153 | 153 | ||
| 154 | extern void s3c24xx_init_irq(void); | 154 | extern void s3c24xx_init_irq(void); |
| 155 | extern void s3c64xx_init_irq(u32 vic0, u32 vic1); | ||
| 156 | extern void s5p_init_irq(u32 *vic, u32 num_vic); | 155 | extern void s5p_init_irq(u32 *vic, u32 num_vic); |
| 157 | 156 | ||
| 158 | extern void s3c24xx_init_io(struct map_desc *mach_desc, int size); | 157 | extern void s3c24xx_init_io(struct map_desc *mach_desc, int size); |
| 159 | extern void s3c64xx_init_io(struct map_desc *mach_desc, int size); | ||
| 160 | extern void s5p_init_io(struct map_desc *mach_desc, | ||
| 161 | int size, void __iomem *cpuid_addr); | ||
| 162 | 158 | ||
| 163 | extern void s3c24xx_init_cpu(void); | 159 | extern void s3c24xx_init_cpu(void); |
| 164 | extern void s3c64xx_init_cpu(void); | 160 | extern void s3c64xx_init_cpu(void); |
| @@ -183,7 +179,6 @@ extern struct syscore_ops s3c2410_pm_syscore_ops; | |||
| 183 | extern struct syscore_ops s3c2412_pm_syscore_ops; | 179 | extern struct syscore_ops s3c2412_pm_syscore_ops; |
| 184 | extern struct syscore_ops s3c2416_pm_syscore_ops; | 180 | extern struct syscore_ops s3c2416_pm_syscore_ops; |
| 185 | extern struct syscore_ops s3c244x_pm_syscore_ops; | 181 | extern struct syscore_ops s3c244x_pm_syscore_ops; |
| 186 | extern struct syscore_ops s3c64xx_irq_syscore_ops; | ||
| 187 | 182 | ||
| 188 | /* system device classes */ | 183 | /* system device classes */ |
| 189 | 184 | ||
| @@ -195,7 +190,6 @@ extern struct sysdev_class s3c2440_sysclass; | |||
| 195 | extern struct sysdev_class s3c2442_sysclass; | 190 | extern struct sysdev_class s3c2442_sysclass; |
| 196 | extern struct sysdev_class s3c2443_sysclass; | 191 | extern struct sysdev_class s3c2443_sysclass; |
| 197 | extern struct sysdev_class s3c6410_sysclass; | 192 | extern struct sysdev_class s3c6410_sysclass; |
| 198 | extern struct sysdev_class s3c64xx_sysclass; | ||
| 199 | extern struct sysdev_class s5p64x0_sysclass; | 193 | extern struct sysdev_class s5p64x0_sysclass; |
| 200 | extern struct sysdev_class s5pv210_sysclass; | 194 | extern struct sysdev_class s5pv210_sysclass; |
| 201 | extern struct sysdev_class exynos4_sysclass; | 195 | extern struct sysdev_class exynos4_sysclass; |
diff --git a/arch/arm/plat-samsung/include/plat/exynos4.h b/arch/arm/plat-samsung/include/plat/exynos4.h deleted file mode 100644 index f546e88ebc9..00000000000 --- a/arch/arm/plat-samsung/include/plat/exynos4.h +++ /dev/null | |||
| @@ -1,35 +0,0 @@ | |||
| 1 | /* linux/arch/arm/plat-samsung/include/plat/exynos4.h | ||
| 2 | * | ||
| 3 | * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. | ||
| 4 | * http://www.samsung.com | ||
| 5 | * | ||
| 6 | * Header file for exynos4 cpu support | ||
| 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 version 2 as | ||
| 10 | * published by the Free Software Foundation. | ||
| 11 | */ | ||
| 12 | |||
| 13 | /* Common init code for EXYNOS4 related SoCs */ | ||
| 14 | |||
| 15 | extern void exynos4_common_init_uarts(struct s3c2410_uartcfg *cfg, int no); | ||
| 16 | extern void exynos4_register_clocks(void); | ||
| 17 | extern void exynos4210_register_clocks(void); | ||
| 18 | extern void exynos4212_register_clocks(void); | ||
| 19 | extern void exynos4_setup_clocks(void); | ||
| 20 | |||
| 21 | #ifdef CONFIG_ARCH_EXYNOS | ||
| 22 | extern int exynos_init(void); | ||
| 23 | extern void exynos4_init_irq(void); | ||
| 24 | extern void exynos4_map_io(void); | ||
| 25 | extern void exynos4_init_clocks(int xtal); | ||
| 26 | extern struct sys_timer exynos4_timer; | ||
| 27 | |||
| 28 | #define exynos4_init_uarts exynos4_common_init_uarts | ||
| 29 | |||
| 30 | #else | ||
| 31 | #define exynos4_init_clocks NULL | ||
| 32 | #define exynos4_init_uarts NULL | ||
| 33 | #define exynos4_map_io NULL | ||
| 34 | #define exynos_init NULL | ||
| 35 | #endif | ||
diff --git a/arch/arm/plat-samsung/include/plat/reset.h b/arch/arm/plat-samsung/include/plat/reset.h deleted file mode 100644 index 32ca5179c6e..00000000000 --- a/arch/arm/plat-samsung/include/plat/reset.h +++ /dev/null | |||
| @@ -1,16 +0,0 @@ | |||
| 1 | /* linux/arch/arm/plat-samsung/include/plat/reset.h | ||
| 2 | * | ||
| 3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
| 4 | * http://www.samsung.com/ | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License version 2 as | ||
| 8 | * published by the Free Software Foundation. | ||
| 9 | */ | ||
| 10 | |||
| 11 | #ifndef __PLAT_SAMSUNG_RESET_H | ||
| 12 | #define __PLAT_SAMSUNG_RESET_H __FILE__ | ||
| 13 | |||
| 14 | extern void (*s5p_reset_hook)(void); | ||
| 15 | |||
| 16 | #endif /* __PLAT_SAMSUNG_RESET_H */ | ||
diff --git a/arch/arm/plat-samsung/include/plat/s3c2412.h b/arch/arm/plat-samsung/include/plat/s3c2412.h index 5bcfd143ba1..cbae50ddacc 100644 --- a/arch/arm/plat-samsung/include/plat/s3c2412.h +++ b/arch/arm/plat-samsung/include/plat/s3c2412.h | |||
| @@ -21,9 +21,12 @@ extern void s3c2412_init_uarts(struct s3c2410_uartcfg *cfg, int no); | |||
| 21 | extern void s3c2412_init_clocks(int xtal); | 21 | extern void s3c2412_init_clocks(int xtal); |
| 22 | 22 | ||
| 23 | extern int s3c2412_baseclk_add(void); | 23 | extern int s3c2412_baseclk_add(void); |
| 24 | |||
| 25 | extern void s3c2412_restart(char mode, const char *cmd); | ||
| 24 | #else | 26 | #else |
| 25 | #define s3c2412_init_clocks NULL | 27 | #define s3c2412_init_clocks NULL |
| 26 | #define s3c2412_init_uarts NULL | 28 | #define s3c2412_init_uarts NULL |
| 27 | #define s3c2412_map_io NULL | 29 | #define s3c2412_map_io NULL |
| 28 | #define s3c2412_init NULL | 30 | #define s3c2412_init NULL |
| 31 | #define s3c2412_restart NULL | ||
| 29 | #endif | 32 | #endif |
diff --git a/arch/arm/plat-samsung/include/plat/s3c2416.h b/arch/arm/plat-samsung/include/plat/s3c2416.h index a764f8503f5..de2b5bdc5eb 100644 --- a/arch/arm/plat-samsung/include/plat/s3c2416.h +++ b/arch/arm/plat-samsung/include/plat/s3c2416.h | |||
| @@ -23,9 +23,11 @@ extern void s3c2416_init_clocks(int xtal); | |||
| 23 | 23 | ||
| 24 | extern int s3c2416_baseclk_add(void); | 24 | extern int s3c2416_baseclk_add(void); |
| 25 | 25 | ||
| 26 | extern void s3c2416_restart(char mode, const char *cmd); | ||
| 26 | #else | 27 | #else |
| 27 | #define s3c2416_init_clocks NULL | 28 | #define s3c2416_init_clocks NULL |
| 28 | #define s3c2416_init_uarts NULL | 29 | #define s3c2416_init_uarts NULL |
| 29 | #define s3c2416_map_io NULL | 30 | #define s3c2416_map_io NULL |
| 30 | #define s3c2416_init NULL | 31 | #define s3c2416_init NULL |
| 32 | #define s3c2416_restart NULL | ||
| 31 | #endif | 33 | #endif |
diff --git a/arch/arm/plat-samsung/include/plat/s3c2443.h b/arch/arm/plat-samsung/include/plat/s3c2443.h index 7fae1a05069..dce05b43d51 100644 --- a/arch/arm/plat-samsung/include/plat/s3c2443.h +++ b/arch/arm/plat-samsung/include/plat/s3c2443.h | |||
| @@ -24,11 +24,13 @@ extern void s3c2443_init_clocks(int xtal); | |||
| 24 | 24 | ||
| 25 | extern int s3c2443_baseclk_add(void); | 25 | extern int s3c2443_baseclk_add(void); |
| 26 | 26 | ||
| 27 | extern void s3c2443_restart(char mode, const char *cmd); | ||
| 27 | #else | 28 | #else |
| 28 | #define s3c2443_init_clocks NULL | 29 | #define s3c2443_init_clocks NULL |
| 29 | #define s3c2443_init_uarts NULL | 30 | #define s3c2443_init_uarts NULL |
| 30 | #define s3c2443_map_io NULL | 31 | #define s3c2443_map_io NULL |
| 31 | #define s3c2443_init NULL | 32 | #define s3c2443_init NULL |
| 33 | #define s3c2443_restart NULL | ||
| 32 | #endif | 34 | #endif |
| 33 | 35 | ||
| 34 | /* common code used by s3c2443 and others. | 36 | /* common code used by s3c2443 and others. |
diff --git a/arch/arm/plat-samsung/include/plat/s3c6400.h b/arch/arm/plat-samsung/include/plat/s3c6400.h deleted file mode 100644 index 37d428aaaeb..00000000000 --- a/arch/arm/plat-samsung/include/plat/s3c6400.h +++ /dev/null | |||
| @@ -1,36 +0,0 @@ | |||
| 1 | /* linux/arch/arm/plat-samsung/include/plat/s3c6400.h | ||
| 2 | * | ||
| 3 | * Copyright 2008 Openmoko, Inc. | ||
| 4 | * Copyright 2008 Simtec Electronics | ||
| 5 | * Ben Dooks <ben@simtec.co.uk> | ||
| 6 | * http://armlinux.simtec.co.uk/ | ||
| 7 | * | ||
| 8 | * Header file for s3c6400 cpu support | ||
| 9 | * | ||
| 10 | * This program is free software; you can redistribute it and/or modify | ||
| 11 | * it under the terms of the GNU General Public License version 2 as | ||
| 12 | * published by the Free Software Foundation. | ||
| 13 | */ | ||
| 14 | |||
| 15 | /* Common init code for S3C6400 related SoCs */ | ||
| 16 | |||
| 17 | extern void s3c6400_common_init_uarts(struct s3c2410_uartcfg *cfg, int no); | ||
| 18 | extern void s3c6400_setup_clocks(void); | ||
| 19 | |||
| 20 | extern void s3c64xx_register_clocks(unsigned long xtal, unsigned armclk_limit); | ||
| 21 | |||
| 22 | #ifdef CONFIG_CPU_S3C6400 | ||
| 23 | |||
| 24 | extern int s3c6400_init(void); | ||
| 25 | extern void s3c6400_init_irq(void); | ||
| 26 | extern void s3c6400_map_io(void); | ||
| 27 | extern void s3c6400_init_clocks(int xtal); | ||
| 28 | |||
| 29 | #define s3c6400_init_uarts s3c6400_common_init_uarts | ||
| 30 | |||
| 31 | #else | ||
| 32 | #define s3c6400_init_clocks NULL | ||
| 33 | #define s3c6400_init_uarts NULL | ||
| 34 | #define s3c6400_map_io NULL | ||
| 35 | #define s3c6400_init NULL | ||
| 36 | #endif | ||
diff --git a/arch/arm/plat-samsung/include/plat/s3c6410.h b/arch/arm/plat-samsung/include/plat/s3c6410.h deleted file mode 100644 index 20a6675b9d1..00000000000 --- a/arch/arm/plat-samsung/include/plat/s3c6410.h +++ /dev/null | |||
| @@ -1,29 +0,0 @@ | |||
| 1 | /* linux/arch/arm/plat-samsung/include/plat/s3c6410.h | ||
| 2 | * | ||
| 3 | * Copyright 2008 Openmoko, Inc. | ||
| 4 | * Copyright 2008 Simtec Electronics | ||
| 5 | * Ben Dooks <ben@simtec.co.uk> | ||
| 6 | * http://armlinux.simtec.co.uk/ | ||
| 7 | * | ||
| 8 | * Header file for s3c6410 cpu support | ||
| 9 | * | ||
| 10 | * This program is free software; you can redistribute it and/or modify | ||
| 11 | * it under the terms of the GNU General Public License version 2 as | ||
| 12 | * published by the Free Software Foundation. | ||
| 13 | */ | ||
| 14 | |||
| 15 | #ifdef CONFIG_CPU_S3C6410 | ||
| 16 | |||
| 17 | extern int s3c6410_init(void); | ||
| 18 | extern void s3c6410_init_irq(void); | ||
| 19 | extern void s3c6410_map_io(void); | ||
| 20 | extern void s3c6410_init_clocks(int xtal); | ||
| 21 | |||
| 22 | #define s3c6410_init_uarts s3c6400_common_init_uarts | ||
| 23 | |||
| 24 | #else | ||
| 25 | #define s3c6410_init_clocks NULL | ||
| 26 | #define s3c6410_init_uarts NULL | ||
| 27 | #define s3c6410_map_io NULL | ||
| 28 | #define s3c6410_init NULL | ||
| 29 | #endif | ||
diff --git a/arch/arm/plat-samsung/include/plat/s5p6440.h b/arch/arm/plat-samsung/include/plat/s5p6440.h deleted file mode 100644 index bf85ebbb4fb..00000000000 --- a/arch/arm/plat-samsung/include/plat/s5p6440.h +++ /dev/null | |||
| @@ -1,36 +0,0 @@ | |||
| 1 | /* linux/arch/arm/plat-samsung/include/plat/s5p6440.h | ||
| 2 | * | ||
| 3 | * Copyright (c) 2009 Samsung Electronics Co., Ltd. | ||
| 4 | * http://www.samsung.com/ | ||
| 5 | * | ||
| 6 | * Header file for s5p6440 cpu support | ||
| 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 version 2 as | ||
| 10 | * published by the Free Software Foundation. | ||
| 11 | */ | ||
| 12 | |||
| 13 | /* Common init code for S5P6440 related SoCs */ | ||
| 14 | |||
| 15 | extern void s5p6440_register_clocks(void); | ||
| 16 | extern void s5p6440_setup_clocks(void); | ||
| 17 | |||
| 18 | #ifdef CONFIG_CPU_S5P6440 | ||
| 19 | |||
| 20 | extern int s5p64x0_init(void); | ||
| 21 | extern void s5p6440_init_irq(void); | ||
| 22 | extern void s5p6440_map_io(void); | ||
| 23 | extern void s5p6440_init_clocks(int xtal); | ||
| 24 | |||
| 25 | extern void s5p6440_init_uarts(struct s3c2410_uartcfg *cfg, int no); | ||
| 26 | |||
| 27 | #else | ||
| 28 | #define s5p6440_init_clocks NULL | ||
| 29 | #define s5p6440_init_uarts NULL | ||
| 30 | #define s5p6440_map_io NULL | ||
| 31 | #define s5p64x0_init NULL | ||
| 32 | #endif | ||
| 33 | |||
| 34 | /* S5P6440 timer */ | ||
| 35 | |||
| 36 | extern struct sys_timer s5p6440_timer; | ||
diff --git a/arch/arm/plat-samsung/include/plat/s5p6450.h b/arch/arm/plat-samsung/include/plat/s5p6450.h deleted file mode 100644 index da25f9a1c54..00000000000 --- a/arch/arm/plat-samsung/include/plat/s5p6450.h +++ /dev/null | |||
| @@ -1,36 +0,0 @@ | |||
| 1 | /* linux/arch/arm/plat-samsung/include/plat/s5p6450.h | ||
| 2 | * | ||
| 3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
| 4 | * http://www.samsung.com | ||
| 5 | * | ||
| 6 | * Header file for s5p6450 cpu support | ||
| 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 version 2 as | ||
| 10 | * published by the Free Software Foundation. | ||
| 11 | */ | ||
| 12 | |||
| 13 | /* Common init code for S5P6450 related SoCs */ | ||
| 14 | |||
| 15 | extern void s5p6450_register_clocks(void); | ||
| 16 | extern void s5p6450_setup_clocks(void); | ||
| 17 | |||
| 18 | #ifdef CONFIG_CPU_S5P6450 | ||
| 19 | |||
| 20 | extern int s5p64x0_init(void); | ||
| 21 | extern void s5p6450_init_irq(void); | ||
| 22 | extern void s5p6450_map_io(void); | ||
| 23 | extern void s5p6450_init_clocks(int xtal); | ||
| 24 | |||
| 25 | extern void s5p6450_init_uarts(struct s3c2410_uartcfg *cfg, int no); | ||
| 26 | |||
| 27 | #else | ||
| 28 | #define s5p6450_init_clocks NULL | ||
| 29 | #define s5p6450_init_uarts NULL | ||
| 30 | #define s5p6450_map_io NULL | ||
| 31 | #define s5p64x0_init NULL | ||
| 32 | #endif | ||
| 33 | |||
| 34 | /* S5P6450 timer */ | ||
| 35 | |||
| 36 | extern struct sys_timer s5p6450_timer; | ||
diff --git a/arch/arm/plat-samsung/include/plat/s5pc100.h b/arch/arm/plat-samsung/include/plat/s5pc100.h deleted file mode 100644 index 9a21aeaaf45..00000000000 --- a/arch/arm/plat-samsung/include/plat/s5pc100.h +++ /dev/null | |||
| @@ -1,33 +0,0 @@ | |||
| 1 | /* linux/arch/arm/plat-samsung/include/plat/s5pc100.h | ||
| 2 | * | ||
| 3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
| 4 | * http://www.samsung.com/ | ||
| 5 | * | ||
| 6 | * Header file for s5pc100 cpu support | ||
| 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 version 2 as | ||
| 10 | * published by the Free Software Foundation. | ||
| 11 | */ | ||
| 12 | |||
| 13 | /* Common init code for S5PC100 related SoCs */ | ||
| 14 | |||
| 15 | extern void s5pc100_common_init_uarts(struct s3c2410_uartcfg *cfg, int no); | ||
| 16 | extern void s5pc100_register_clocks(void); | ||
| 17 | extern void s5pc100_setup_clocks(void); | ||
| 18 | |||
| 19 | #ifdef CONFIG_CPU_S5PC100 | ||
| 20 | |||
| 21 | extern int s5pc100_init(void); | ||
| 22 | extern void s5pc100_init_irq(void); | ||
| 23 | extern void s5pc100_map_io(void); | ||
| 24 | extern void s5pc100_init_clocks(int xtal); | ||
| 25 | |||
| 26 | #define s5pc100_init_uarts s5pc100_common_init_uarts | ||
| 27 | |||
| 28 | #else | ||
| 29 | #define s5pc100_init_clocks NULL | ||
| 30 | #define s5pc100_init_uarts NULL | ||
| 31 | #define s5pc100_map_io NULL | ||
| 32 | #define s5pc100_init NULL | ||
| 33 | #endif | ||
diff --git a/arch/arm/plat-samsung/include/plat/s5pv210.h b/arch/arm/plat-samsung/include/plat/s5pv210.h deleted file mode 100644 index b4bc6be7707..00000000000 --- a/arch/arm/plat-samsung/include/plat/s5pv210.h +++ /dev/null | |||
| @@ -1,33 +0,0 @@ | |||
| 1 | /* linux/arch/arm/plat-samsung/include/plat/s5pv210.h | ||
| 2 | * | ||
| 3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
| 4 | * http://www.samsung.com/ | ||
| 5 | * | ||
| 6 | * Header file for s5pv210 cpu support | ||
| 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 version 2 as | ||
| 10 | * published by the Free Software Foundation. | ||
| 11 | */ | ||
| 12 | |||
| 13 | /* Common init code for S5PV210 related SoCs */ | ||
| 14 | |||
| 15 | extern void s5pv210_common_init_uarts(struct s3c2410_uartcfg *cfg, int no); | ||
| 16 | extern void s5pv210_register_clocks(void); | ||
| 17 | extern void s5pv210_setup_clocks(void); | ||
| 18 | |||
| 19 | #ifdef CONFIG_CPU_S5PV210 | ||
| 20 | |||
| 21 | extern int s5pv210_init(void); | ||
| 22 | extern void s5pv210_init_irq(void); | ||
| 23 | extern void s5pv210_map_io(void); | ||
| 24 | extern void s5pv210_init_clocks(int xtal); | ||
| 25 | |||
| 26 | #define s5pv210_init_uarts s5pv210_common_init_uarts | ||
| 27 | |||
| 28 | #else | ||
| 29 | #define s5pv210_init_clocks NULL | ||
| 30 | #define s5pv210_init_uarts NULL | ||
| 31 | #define s5pv210_map_io NULL | ||
| 32 | #define s5pv210_init NULL | ||
| 33 | #endif | ||
diff --git a/arch/arm/plat-samsung/include/plat/system-reset.h b/arch/arm/plat-samsung/include/plat/system-reset.h deleted file mode 100644 index a448e990964..00000000000 --- a/arch/arm/plat-samsung/include/plat/system-reset.h +++ /dev/null | |||
| @@ -1,31 +0,0 @@ | |||
| 1 | /* linux/arch/arm/plat-samsung/include/plat/system-reset.h | ||
| 2 | * | ||
| 3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
| 4 | * http://www.samsung.com | ||
| 5 | * | ||
| 6 | * Based on arch/arm/mach-s3c2410/include/mach/system-reset.h | ||
| 7 | * | ||
| 8 | * S5P - System define for arch_reset() | ||
| 9 | * | ||
| 10 | * This program is free software; you can redistribute it and/or modify | ||
| 11 | * it under the terms of the GNU General Public License version 2 as | ||
| 12 | * published by the Free Software Foundation. | ||
| 13 | */ | ||
| 14 | |||
| 15 | #include <plat/watchdog-reset.h> | ||
| 16 | |||
| 17 | void (*s5p_reset_hook)(void); | ||
| 18 | |||
| 19 | static void arch_reset(char mode, const char *cmd) | ||
| 20 | { | ||
| 21 | /* SWRESET support in s5p_reset_hook() */ | ||
| 22 | |||
| 23 | if (s5p_reset_hook) | ||
| 24 | s5p_reset_hook(); | ||
| 25 | |||
| 26 | /* Perform reset using Watchdog reset | ||
| 27 | * if there is no s5p_reset_hook() | ||
| 28 | */ | ||
| 29 | |||
| 30 | arch_wdt_reset(); | ||
| 31 | } | ||
diff --git a/arch/arm/plat-samsung/include/plat/watchdog-reset.h b/arch/arm/plat-samsung/include/plat/watchdog-reset.h index 40dbb2b0ae2..f19aff19205 100644 --- a/arch/arm/plat-samsung/include/plat/watchdog-reset.h +++ b/arch/arm/plat-samsung/include/plat/watchdog-reset.h | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | #include <linux/clk.h> | 17 | #include <linux/clk.h> |
| 18 | #include <linux/err.h> | 18 | #include <linux/err.h> |
| 19 | #include <linux/io.h> | 19 | #include <linux/io.h> |
| 20 | #include <linux/delay.h> | ||
| 20 | 21 | ||
| 21 | static inline void arch_wdt_reset(void) | 22 | static inline void arch_wdt_reset(void) |
| 22 | { | 23 | { |
diff --git a/arch/arm/plat-spear/Makefile b/arch/arm/plat-spear/Makefile index b4f340b8f1f..e0f2e5b9530 100644 --- a/arch/arm/plat-spear/Makefile +++ b/arch/arm/plat-spear/Makefile | |||
| @@ -3,6 +3,6 @@ | |||
| 3 | # | 3 | # |
| 4 | 4 | ||
| 5 | # Common support | 5 | # Common support |
| 6 | obj-y := clock.o time.o | 6 | obj-y := clock.o restart.o time.o |
| 7 | 7 | ||
| 8 | obj-$(CONFIG_ARCH_SPEAR3XX) += shirq.o padmux.o | 8 | obj-$(CONFIG_ARCH_SPEAR3XX) += shirq.o padmux.o |
diff --git a/arch/arm/plat-spear/include/plat/system.h b/arch/arm/plat-spear/include/plat/system.h index 1171f228d71..86c6f83b44c 100644 --- a/arch/arm/plat-spear/include/plat/system.h +++ b/arch/arm/plat-spear/include/plat/system.h | |||
| @@ -14,10 +14,6 @@ | |||
| 14 | #ifndef __PLAT_SYSTEM_H | 14 | #ifndef __PLAT_SYSTEM_H |
| 15 | #define __PLAT_SYSTEM_H | 15 | #define __PLAT_SYSTEM_H |
| 16 | 16 | ||
| 17 | #include <linux/io.h> | ||
| 18 | #include <asm/hardware/sp810.h> | ||
| 19 | #include <mach/hardware.h> | ||
| 20 | |||
| 21 | static inline void arch_idle(void) | 17 | static inline void arch_idle(void) |
| 22 | { | 18 | { |
| 23 | /* | 19 | /* |
| @@ -27,15 +23,4 @@ static inline void arch_idle(void) | |||
| 27 | cpu_do_idle(); | 23 | cpu_do_idle(); |
| 28 | } | 24 | } |
| 29 | 25 | ||
| 30 | static inline void arch_reset(char mode, const char *cmd) | ||
| 31 | { | ||
| 32 | if (mode == 's') { | ||
| 33 | /* software reset, Jump into ROM at address 0 */ | ||
| 34 | soft_restart(0); | ||
| 35 | } else { | ||
| 36 | /* hardware reset, Use on-chip reset capability */ | ||
| 37 | sysctl_soft_reset((void __iomem *)VA_SPEAR_SYS_CTRL_BASE); | ||
| 38 | } | ||
| 39 | } | ||
| 40 | |||
| 41 | #endif /* __PLAT_SYSTEM_H */ | 26 | #endif /* __PLAT_SYSTEM_H */ |
diff --git a/arch/arm/plat-spear/restart.c b/arch/arm/plat-spear/restart.c new file mode 100644 index 00000000000..2b4e3d82957 --- /dev/null +++ b/arch/arm/plat-spear/restart.c | |||
| @@ -0,0 +1,27 @@ | |||
| 1 | /* | ||
| 2 | * arch/arm/plat-spear/restart.c | ||
| 3 | * | ||
| 4 | * SPEAr platform specific restart functions | ||
| 5 | * | ||
| 6 | * Copyright (C) 2009 ST Microelectronics | ||
| 7 | * Viresh Kumar<viresh.kumar@st.com> | ||
| 8 | * | ||
| 9 | * This file is licensed under the terms of the GNU General Public | ||
| 10 | * License version 2. This program is licensed "as is" without any | ||
| 11 | * warranty of any kind, whether express or implied. | ||
| 12 | */ | ||
| 13 | #include <linux/io.h> | ||
| 14 | #include <asm/hardware/sp810.h> | ||
| 15 | #include <mach/hardware.h> | ||
| 16 | #include <mach/generic.h> | ||
| 17 | |||
| 18 | void spear_restart(char mode, const char *cmd) | ||
| 19 | { | ||
| 20 | if (mode == 's') { | ||
| 21 | /* software reset, Jump into ROM at address 0 */ | ||
| 22 | soft_restart(0); | ||
| 23 | } else { | ||
| 24 | /* hardware reset, Use on-chip reset capability */ | ||
| 25 | sysctl_soft_reset((void __iomem *)VA_SPEAR_SYS_CTRL_BASE); | ||
| 26 | } | ||
| 27 | } | ||
diff --git a/arch/arm/plat-tcc/Kconfig b/arch/arm/plat-tcc/Kconfig deleted file mode 100644 index 1bf499570f4..00000000000 --- a/arch/arm/plat-tcc/Kconfig +++ /dev/null | |||
| @@ -1,20 +0,0 @@ | |||
| 1 | if ARCH_TCC_926 | ||
| 2 | |||
| 3 | menu "Telechips ARM926-based CPUs" | ||
| 4 | |||
| 5 | choice | ||
| 6 | prompt "Telechips CPU type:" | ||
| 7 | default ARCH_TCC8K | ||
| 8 | |||
| 9 | config ARCH_TCC8K | ||
| 10 | bool TCC8000 | ||
| 11 | select USB_ARCH_HAS_OHCI | ||
| 12 | help | ||
| 13 | Support for Telechips TCC8000 systems | ||
| 14 | |||
| 15 | endchoice | ||
| 16 | |||
| 17 | source "arch/arm/mach-tcc8k/Kconfig" | ||
| 18 | |||
| 19 | endmenu | ||
| 20 | endif | ||
diff --git a/arch/arm/plat-tcc/Makefile b/arch/arm/plat-tcc/Makefile deleted file mode 100644 index eceabc869b8..00000000000 --- a/arch/arm/plat-tcc/Makefile +++ /dev/null | |||
| @@ -1,3 +0,0 @@ | |||
| 1 | # "Telechips Platform Common Modules" | ||
| 2 | |||
| 3 | obj-y := clock.o system.o | ||
diff --git a/arch/arm/plat-tcc/clock.c b/arch/arm/plat-tcc/clock.c deleted file mode 100644 index f3ced10d527..00000000000 --- a/arch/arm/plat-tcc/clock.c +++ /dev/null | |||
| @@ -1,179 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Clock framework for Telechips SoCs | ||
| 3 | * Based on arch/arm/plat-mxc/clock.c | ||
| 4 | * | ||
| 5 | * Copyright (C) 2004 - 2005 Nokia corporation | ||
| 6 | * Written by Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com> | ||
| 7 | * Modified for omap shared clock framework by Tony Lindgren <tony@atomide.com> | ||
| 8 | * Copyright 2007 Freescale Semiconductor, Inc. All Rights Reserved. | ||
| 9 | * Copyright 2008 Juergen Beisert, kernel@pengutronix.de | ||
| 10 | * Copyright 2010 Hans J. Koch, hjk@linutronix.de | ||
| 11 | * | ||
| 12 | * Licensed under the terms of the GPL v2. | ||
| 13 | */ | ||
| 14 | |||
| 15 | #include <linux/clk.h> | ||
| 16 | #include <linux/err.h> | ||
| 17 | #include <linux/errno.h> | ||
| 18 | #include <linux/module.h> | ||
| 19 | #include <linux/mutex.h> | ||
| 20 | #include <linux/string.h> | ||
| 21 | |||
| 22 | #include <mach/clock.h> | ||
| 23 | #include <mach/hardware.h> | ||
| 24 | |||
| 25 | static DEFINE_MUTEX(clocks_mutex); | ||
| 26 | |||
| 27 | /*------------------------------------------------------------------------- | ||
| 28 | * Standard clock functions defined in include/linux/clk.h | ||
| 29 | *-------------------------------------------------------------------------*/ | ||
| 30 | |||
| 31 | static void __clk_disable(struct clk *clk) | ||
| 32 | { | ||
| 33 | BUG_ON(clk->refcount == 0); | ||
| 34 | |||
| 35 | if (!(--clk->refcount) && clk->disable) { | ||
| 36 | /* Unconditionally disable the clock in hardware */ | ||
| 37 | clk->disable(clk); | ||
| 38 | /* recursively disable parents */ | ||
| 39 | if (clk->parent) | ||
| 40 | __clk_disable(clk->parent); | ||
| 41 | } | ||
| 42 | } | ||
| 43 | |||
| 44 | static int __clk_enable(struct clk *clk) | ||
| 45 | { | ||
| 46 | int ret = 0; | ||
| 47 | |||
| 48 | if (clk->refcount++ == 0 && clk->enable) { | ||
| 49 | if (clk->parent) | ||
| 50 | ret = __clk_enable(clk->parent); | ||
| 51 | if (ret) | ||
| 52 | return ret; | ||
| 53 | else | ||
| 54 | return clk->enable(clk); | ||
| 55 | } | ||
| 56 | |||
| 57 | return 0; | ||
| 58 | } | ||
| 59 | |||
| 60 | /* This function increments the reference count on the clock and enables the | ||
| 61 | * clock if not already enabled. The parent clock tree is recursively enabled | ||
| 62 | */ | ||
| 63 | int clk_enable(struct clk *clk) | ||
| 64 | { | ||
| 65 | int ret = 0; | ||
| 66 | |||
| 67 | if (!clk) | ||
| 68 | return -EINVAL; | ||
| 69 | |||
| 70 | mutex_lock(&clocks_mutex); | ||
| 71 | ret = __clk_enable(clk); | ||
| 72 | mutex_unlock(&clocks_mutex); | ||
| 73 | |||
| 74 | return ret; | ||
| 75 | } | ||
| 76 | EXPORT_SYMBOL_GPL(clk_enable); | ||
| 77 | |||
| 78 | /* This function decrements the reference count on the clock and disables | ||
| 79 | * the clock when reference count is 0. The parent clock tree is | ||
| 80 | * recursively disabled | ||
| 81 | */ | ||
| 82 | void clk_disable(struct clk *clk) | ||
| 83 | { | ||
| 84 | if (!clk) | ||
| 85 | return; | ||
| 86 | |||
| 87 | mutex_lock(&clocks_mutex); | ||
| 88 | __clk_disable(clk); | ||
| 89 | mutex_unlock(&clocks_mutex); | ||
| 90 | } | ||
| 91 | EXPORT_SYMBOL_GPL(clk_disable); | ||
| 92 | |||
| 93 | /* Retrieve the *current* clock rate. If the clock itself | ||
| 94 | * does not provide a special calculation routine, ask | ||
| 95 | * its parent and so on, until one is able to return | ||
| 96 | * a valid clock rate | ||
| 97 | */ | ||
| 98 | unsigned long clk_get_rate(struct clk *clk) | ||
| 99 | { | ||
| 100 | if (!clk) | ||
| 101 | return 0UL; | ||
| 102 | |||
| 103 | if (clk->get_rate) | ||
| 104 | return clk->get_rate(clk); | ||
| 105 | |||
| 106 | return clk_get_rate(clk->parent); | ||
| 107 | } | ||
| 108 | EXPORT_SYMBOL_GPL(clk_get_rate); | ||
| 109 | |||
| 110 | /* Round the requested clock rate to the nearest supported | ||
| 111 | * rate that is less than or equal to the requested rate. | ||
| 112 | * This is dependent on the clock's current parent. | ||
| 113 | */ | ||
| 114 | long clk_round_rate(struct clk *clk, unsigned long rate) | ||
| 115 | { | ||
| 116 | if (!clk) | ||
| 117 | return 0; | ||
| 118 | if (!clk->round_rate) | ||
| 119 | return 0; | ||
| 120 | |||
| 121 | return clk->round_rate(clk, rate); | ||
| 122 | } | ||
| 123 | EXPORT_SYMBOL_GPL(clk_round_rate); | ||
| 124 | |||
| 125 | /* Set the clock to the requested clock rate. The rate must | ||
| 126 | * match a supported rate exactly based on what clk_round_rate returns | ||
| 127 | */ | ||
| 128 | int clk_set_rate(struct clk *clk, unsigned long rate) | ||
| 129 | { | ||
| 130 | int ret = -EINVAL; | ||
| 131 | |||
| 132 | if (!clk) | ||
| 133 | return ret; | ||
| 134 | if (!clk->set_rate || !rate) | ||
| 135 | return ret; | ||
| 136 | |||
| 137 | mutex_lock(&clocks_mutex); | ||
| 138 | ret = clk->set_rate(clk, rate); | ||
| 139 | mutex_unlock(&clocks_mutex); | ||
| 140 | |||
| 141 | return ret; | ||
| 142 | } | ||
| 143 | EXPORT_SYMBOL_GPL(clk_set_rate); | ||
| 144 | |||
| 145 | /* Set the clock's parent to another clock source */ | ||
| 146 | int clk_set_parent(struct clk *clk, struct clk *parent) | ||
| 147 | { | ||
| 148 | struct clk *old; | ||
| 149 | int ret = -EINVAL; | ||
| 150 | |||
| 151 | if (!clk) | ||
| 152 | return ret; | ||
| 153 | if (!clk->set_parent || !parent) | ||
| 154 | return ret; | ||
| 155 | |||
| 156 | mutex_lock(&clocks_mutex); | ||
| 157 | old = clk->parent; | ||
| 158 | if (clk->refcount) | ||
| 159 | __clk_enable(parent); | ||
| 160 | ret = clk->set_parent(clk, parent); | ||
| 161 | if (ret) | ||
| 162 | old = parent; | ||
| 163 | if (clk->refcount) | ||
| 164 | __clk_disable(old); | ||
| 165 | mutex_unlock(&clocks_mutex); | ||
| 166 | |||
| 167 | return ret; | ||
| 168 | } | ||
| 169 | EXPORT_SYMBOL_GPL(clk_set_parent); | ||
| 170 | |||
| 171 | /* Retrieve the clock's parent clock source */ | ||
| 172 | struct clk *clk_get_parent(struct clk *clk) | ||
| 173 | { | ||
| 174 | if (!clk) | ||
| 175 | return NULL; | ||
| 176 | |||
| 177 | return clk->parent; | ||
| 178 | } | ||
| 179 | EXPORT_SYMBOL_GPL(clk_get_parent); | ||
diff --git a/arch/arm/plat-tcc/include/mach/clock.h b/arch/arm/plat-tcc/include/mach/clock.h deleted file mode 100644 index a12f58ad71a..00000000000 --- a/arch/arm/plat-tcc/include/mach/clock.h +++ /dev/null | |||
| @@ -1,48 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Low level clock header file for Telechips TCC architecture | ||
| 3 | * (C) 2010 Hans J. Koch <hjk@linutronix.de> | ||
| 4 | * | ||
| 5 | * Licensed under the GPL v2. | ||
| 6 | */ | ||
| 7 | |||
| 8 | #ifndef __ASM_ARCH_TCC_CLOCK_H__ | ||
| 9 | #define __ASM_ARCH_TCC_CLOCK_H__ | ||
| 10 | |||
| 11 | #ifndef __ASSEMBLY__ | ||
| 12 | |||
| 13 | struct clk { | ||
| 14 | struct clk *parent; | ||
| 15 | /* id number of a root clock, 0 for normal clocks */ | ||
| 16 | int root_id; | ||
| 17 | /* Reference count of clock enable/disable */ | ||
| 18 | int refcount; | ||
| 19 | /* Address of associated BCLKCTRx register. Must be set. */ | ||
| 20 | void __iomem *bclkctr; | ||
| 21 | /* Bit position for BCLKCTRx. Must be set. */ | ||
| 22 | int bclk_shift; | ||
| 23 | /* Address of ACLKxxx register, if any. */ | ||
| 24 | void __iomem *aclkreg; | ||
| 25 | /* get the current clock rate (always a fresh value) */ | ||
| 26 | unsigned long (*get_rate) (struct clk *); | ||
| 27 | /* Function ptr to set the clock to a new rate. The rate must match a | ||
| 28 | supported rate returned from round_rate. Leave blank if clock is not | ||
| 29 | programmable */ | ||
| 30 | int (*set_rate) (struct clk *, unsigned long); | ||
| 31 | /* Function ptr to round the requested clock rate to the nearest | ||
| 32 | supported rate that is less than or equal to the requested rate. */ | ||
| 33 | unsigned long (*round_rate) (struct clk *, unsigned long); | ||
| 34 | /* Function ptr to enable the clock. Leave blank if clock can not | ||
| 35 | be gated. */ | ||
| 36 | int (*enable) (struct clk *); | ||
| 37 | /* Function ptr to disable the clock. Leave blank if clock can not | ||
| 38 | be gated. */ | ||
| 39 | void (*disable) (struct clk *); | ||
| 40 | /* Function ptr to set the parent clock of the clock. */ | ||
| 41 | int (*set_parent) (struct clk *, struct clk *); | ||
| 42 | }; | ||
| 43 | |||
| 44 | int clk_register(struct clk *clk); | ||
| 45 | void clk_unregister(struct clk *clk); | ||
| 46 | |||
| 47 | #endif /* __ASSEMBLY__ */ | ||
| 48 | #endif /* __ASM_ARCH_MXC_CLOCK_H__ */ | ||
diff --git a/arch/arm/plat-tcc/include/mach/debug-macro.S b/arch/arm/plat-tcc/include/mach/debug-macro.S deleted file mode 100644 index cf17d04ec30..00000000000 --- a/arch/arm/plat-tcc/include/mach/debug-macro.S +++ /dev/null | |||
| @@ -1,32 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 1994-1999 Russell King | ||
| 3 | * Copyright (C) 2008-2009 Telechips | ||
| 4 | * Copyright (C) 2009 Hans J. Koch <hjk@linutronix.de> | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License version 2 as | ||
| 8 | * published by the Free Software Foundation. | ||
| 9 | * | ||
| 10 | */ | ||
| 11 | |||
| 12 | .macro addruart, rp, rv, tmp | ||
| 13 | moveq \rp, #0x90000000 @ physical base address | ||
| 14 | movne \rv, #0xF1000000 @ virtual base | ||
| 15 | orr \rp, \rp, #0x00007000 @ UART0 | ||
| 16 | orr \rv, \rv, #0x00007000 @ UART0 | ||
| 17 | .endm | ||
| 18 | |||
| 19 | .macro senduart,rd,rx | ||
| 20 | strb \rd, [\rx, #0x44] | ||
| 21 | .endm | ||
| 22 | |||
| 23 | .macro waituart,rd,rx | ||
| 24 | .endm | ||
| 25 | |||
| 26 | .macro busyuart,rd,rx | ||
| 27 | 1001: | ||
| 28 | ldr \rd, [\rx, #0x14] | ||
| 29 | tst \rd, #0x20 | ||
| 30 | |||
| 31 | beq 1001b | ||
| 32 | .endm | ||
diff --git a/arch/arm/plat-tcc/include/mach/entry-macro.S b/arch/arm/plat-tcc/include/mach/entry-macro.S deleted file mode 100644 index 748f401e4b6..00000000000 --- a/arch/arm/plat-tcc/include/mach/entry-macro.S +++ /dev/null | |||
| @@ -1,68 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * include/asm-arm/arch-tcc83x/entry-macro.S | ||
| 3 | * | ||
| 4 | * Author : <linux@telechips.com> | ||
| 5 | * Created: June 10, 2008 | ||
| 6 | * Description: Low-level IRQ helper macros for Telechips-based platforms | ||
| 7 | * | ||
| 8 | * Copyright (C) 2008-2009 Telechips | ||
| 9 | * | ||
| 10 | * This file is licensed under the terms of the GNU General Public | ||
| 11 | * License version 2. This program is licensed "as is" without any | ||
| 12 | * warranty of any kind, whether express or implied. | ||
| 13 | */ | ||
| 14 | |||
| 15 | #include <mach/hardware.h> | ||
| 16 | #include <mach/irqs.h> | ||
| 17 | |||
| 18 | .macro disable_fiq | ||
| 19 | .endm | ||
| 20 | |||
| 21 | .macro get_irqnr_preamble, base, tmp | ||
| 22 | .endm | ||
| 23 | |||
| 24 | .macro arch_ret_to_user, tmp1, tmp2 | ||
| 25 | .endm | ||
| 26 | |||
| 27 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
| 28 | |||
| 29 | ldr \base, =0xF2003000 @ base address of PIC registers | ||
| 30 | |||
| 31 | @@ read MREQ register of PIC0 | ||
| 32 | |||
| 33 | mov \irqnr, #0 | ||
| 34 | ldr \irqstat, [\base, #0x00000014 ] @ lower 32 interrupts | ||
| 35 | cmp \irqstat, #0 | ||
| 36 | bne 1001f | ||
| 37 | |||
| 38 | @@ read MREQ register of PIC1 | ||
| 39 | |||
| 40 | ldr \irqstat, [\base, #0x00000094] @ upper 32 interrupts | ||
| 41 | cmp \irqstat, #0 | ||
| 42 | beq 1002f | ||
| 43 | mov \irqnr, #0x20 | ||
| 44 | |||
| 45 | 1001: | ||
| 46 | movs \tmp, \irqstat, lsl #16 | ||
| 47 | movne \irqstat, \tmp | ||
| 48 | addeq \irqnr, \irqnr, #16 | ||
| 49 | |||
| 50 | movs \tmp, \irqstat, lsl #8 | ||
| 51 | movne \irqstat, \tmp | ||
| 52 | addeq \irqnr, \irqnr, #8 | ||
| 53 | |||
| 54 | movs \tmp, \irqstat, lsl #4 | ||
| 55 | movne \irqstat, \tmp | ||
| 56 | addeq \irqnr, \irqnr, #4 | ||
| 57 | |||
| 58 | movs \tmp, \irqstat, lsl #2 | ||
| 59 | movne \irqstat, \tmp | ||
| 60 | addeq \irqnr, \irqnr, #2 | ||
| 61 | |||
| 62 | movs \tmp, \irqstat, lsl #1 | ||
| 63 | addeq \irqnr, \irqnr, #1 | ||
| 64 | orrs \base, \base, #1 | ||
| 65 | 1002: | ||
| 66 | @@ exit here, Z flag unset if IRQ | ||
| 67 | |||
| 68 | .endm | ||
diff --git a/arch/arm/plat-tcc/include/mach/hardware.h b/arch/arm/plat-tcc/include/mach/hardware.h deleted file mode 100644 index e70d126ccaf..00000000000 --- a/arch/arm/plat-tcc/include/mach/hardware.h +++ /dev/null | |||
| @@ -1,43 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Author: RidgeRun, Inc. Greg Lonnon <glonnon@ridgerun.com> | ||
| 3 | * Reorganized for Linux-2.6 by Tony Lindgren <tony@atomide.com> | ||
| 4 | * and Dirk Behme <dirk.behme@de.bosch.com> | ||
| 5 | * Rewritten by: <linux@telechips.com> | ||
| 6 | * Description: Hardware definitions for TCC8300 processors and boards | ||
| 7 | * | ||
| 8 | * Copyright (C) 2001 RidgeRun, Inc. | ||
| 9 | * Copyright (C) 2008-2009 Telechips | ||
| 10 | * | ||
| 11 | * Modifications for mainline (C) 2009 Hans J. Koch <hjk@linutronix.de> | ||
| 12 | * | ||
| 13 | * Licensed under the terms of the GNU Pulic License version 2. | ||
| 14 | */ | ||
| 15 | |||
| 16 | #ifndef __ASM_ARCH_TCC_HARDWARE_H | ||
| 17 | #define __ASM_ARCH_TCC_HARDWARE_H | ||
| 18 | |||
| 19 | #include <asm/sizes.h> | ||
| 20 | #ifndef __ASSEMBLER__ | ||
| 21 | #include <asm/types.h> | ||
| 22 | #endif | ||
| 23 | #include <mach/io.h> | ||
| 24 | |||
| 25 | /* | ||
| 26 | * ---------------------------------------------------------------------------- | ||
| 27 | * Clocks | ||
| 28 | * ---------------------------------------------------------------------------- | ||
| 29 | */ | ||
| 30 | #define CLKGEN_REG_BASE 0xfffece00 | ||
| 31 | #define ARM_CKCTL (CLKGEN_REG_BASE + 0x0) | ||
| 32 | #define ARM_IDLECT1 (CLKGEN_REG_BASE + 0x4) | ||
| 33 | #define ARM_IDLECT2 (CLKGEN_REG_BASE + 0x8) | ||
| 34 | #define ARM_EWUPCT (CLKGEN_REG_BASE + 0xC) | ||
| 35 | #define ARM_RSTCT1 (CLKGEN_REG_BASE + 0x10) | ||
| 36 | #define ARM_RSTCT2 (CLKGEN_REG_BASE + 0x14) | ||
| 37 | #define ARM_SYSST (CLKGEN_REG_BASE + 0x18) | ||
| 38 | #define ARM_IDLECT3 (CLKGEN_REG_BASE + 0x24) | ||
| 39 | |||
| 40 | /* DPLL control registers */ | ||
| 41 | #define DPLL_CTL 0xfffecf00 | ||
| 42 | |||
| 43 | #endif /* __ASM_ARCH_TCC_HARDWARE_H */ | ||
diff --git a/arch/arm/plat-tcc/include/mach/io.h b/arch/arm/plat-tcc/include/mach/io.h deleted file mode 100644 index 3e911d3ea0f..00000000000 --- a/arch/arm/plat-tcc/include/mach/io.h +++ /dev/null | |||
| @@ -1,23 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * IO definitions for TCC8000 processors and boards | ||
| 3 | * | ||
| 4 | * Copyright (C) 1997-1999 Russell King | ||
| 5 | * Copyright (C) 2008-2009 Telechips | ||
| 6 | * Copyright (C) 2010 Hans J. Koch <hjk@linutronix.de> | ||
| 7 | * | ||
| 8 | * Licensed under the terms of the GNU Public License version 2. | ||
| 9 | */ | ||
| 10 | |||
| 11 | #ifndef __ASM_ARM_ARCH_IO_H | ||
| 12 | #define __ASM_ARM_ARCH_IO_H | ||
| 13 | |||
| 14 | #define IO_SPACE_LIMIT 0xffffffff | ||
| 15 | |||
| 16 | /* | ||
| 17 | * We don't actually have real ISA nor PCI buses, but there is so many | ||
| 18 | * drivers out there that might just work if we fake them... | ||
| 19 | */ | ||
| 20 | #define __io(a) __typesafe_io(a) | ||
| 21 | #define __mem_pci(a) (a) | ||
| 22 | |||
| 23 | #endif | ||
diff --git a/arch/arm/plat-tcc/include/mach/irqs.h b/arch/arm/plat-tcc/include/mach/irqs.h deleted file mode 100644 index da863894d49..00000000000 --- a/arch/arm/plat-tcc/include/mach/irqs.h +++ /dev/null | |||
| @@ -1,83 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * IRQ definitions for TCC8xxx | ||
| 3 | * | ||
| 4 | * Copyright (C) 2008-2009 Telechips | ||
| 5 | * Copyright (C) 2009 Hans J. Koch <hjk@linutronix.de> | ||
| 6 | * | ||
| 7 | * Licensed under the terms of the GPL v2. | ||
| 8 | * | ||
| 9 | */ | ||
| 10 | |||
| 11 | #ifndef __ASM_ARCH_TCC_IRQS_H | ||
| 12 | #define __ASM_ARCH_TCC_IRQS_H | ||
| 13 | |||
| 14 | #define NR_IRQS 64 | ||
| 15 | |||
| 16 | /* PIC0 interrupts */ | ||
| 17 | #define INT_ADMA1 0 | ||
| 18 | #define INT_BDMA 1 | ||
| 19 | #define INT_ADMA0 2 | ||
| 20 | #define INT_GDMA1 3 | ||
| 21 | #define INT_I2S0RX 4 | ||
| 22 | #define INT_I2S0TX 5 | ||
| 23 | #define INT_TC 6 | ||
| 24 | #define INT_UART0 7 | ||
| 25 | #define INT_USBD 8 | ||
| 26 | #define INT_SPI0TX 9 | ||
| 27 | #define INT_UDMA 10 | ||
| 28 | #define INT_LIRQ 11 | ||
| 29 | #define INT_GDMA2 12 | ||
| 30 | #define INT_GDMA0 13 | ||
| 31 | #define INT_TC32 14 | ||
| 32 | #define INT_LCD 15 | ||
| 33 | #define INT_ADC 16 | ||
| 34 | #define INT_I2C 17 | ||
| 35 | #define INT_RTCP 18 | ||
| 36 | #define INT_RTCA 19 | ||
| 37 | #define INT_NFC 20 | ||
| 38 | #define INT_SD0 21 | ||
| 39 | #define INT_GSB0 22 | ||
| 40 | #define INT_PK 23 | ||
| 41 | #define INT_USBH0 24 | ||
| 42 | #define INT_USBH1 25 | ||
| 43 | #define INT_G2D 26 | ||
| 44 | #define INT_ECC 27 | ||
| 45 | #define INT_SPI0RX 28 | ||
| 46 | #define INT_UART1 29 | ||
| 47 | #define INT_MSCL 30 | ||
| 48 | #define INT_GSB1 31 | ||
| 49 | /* PIC1 interrupts */ | ||
| 50 | #define INT_E0 32 | ||
| 51 | #define INT_E1 33 | ||
| 52 | #define INT_E2 34 | ||
| 53 | #define INT_E3 35 | ||
| 54 | #define INT_E4 36 | ||
| 55 | #define INT_E5 37 | ||
| 56 | #define INT_E6 38 | ||
| 57 | #define INT_E7 39 | ||
| 58 | #define INT_UART2 40 | ||
| 59 | #define INT_UART3 41 | ||
| 60 | #define INT_SPI1TX 42 | ||
| 61 | #define INT_SPI1RX 43 | ||
| 62 | #define INT_GSB2 44 | ||
| 63 | #define INT_SPDIF 45 | ||
| 64 | #define INT_CDIF 46 | ||
| 65 | #define INT_VBON 47 | ||
| 66 | #define INT_VBOFF 48 | ||
| 67 | #define INT_SD1 49 | ||
| 68 | #define INT_UART4 50 | ||
| 69 | #define INT_GDMA3 51 | ||
| 70 | #define INT_I2S1RX 52 | ||
| 71 | #define INT_I2S1TX 53 | ||
| 72 | #define INT_CAN0 54 | ||
| 73 | #define INT_CAN1 55 | ||
| 74 | #define INT_GSB3 56 | ||
| 75 | #define INT_KRST 57 | ||
| 76 | #define INT_UNUSED 58 | ||
| 77 | #define INT_SD0D3 59 | ||
| 78 | #define INT_SD1D3 60 | ||
| 79 | #define INT_GPS0 61 | ||
| 80 | #define INT_GPS1 62 | ||
| 81 | #define INT_GPS2 63 | ||
| 82 | |||
| 83 | #endif /* ASM_ARCH_TCC_IRQS_H */ | ||
diff --git a/arch/arm/plat-tcc/include/mach/system.h b/arch/arm/plat-tcc/include/mach/system.h deleted file mode 100644 index 909e6035d84..00000000000 --- a/arch/arm/plat-tcc/include/mach/system.h +++ /dev/null | |||
| @@ -1,31 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Author: <linux@telechips.com> | ||
| 3 | * Created: June 10, 2008 | ||
| 4 | * Description: LINUX SYSTEM FUNCTIONS for TCC83x | ||
| 5 | * | ||
| 6 | * Copyright (C) 2008-2009 Telechips | ||
| 7 | * | ||
| 8 | * Licensed under the terms of the GPL v2. | ||
| 9 | * | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef __ASM_ARCH_SYSTEM_H | ||
| 13 | #define __ASM_ARCH_SYSTEM_H | ||
| 14 | #include <linux/clk.h> | ||
| 15 | |||
| 16 | #include <asm/mach-types.h> | ||
| 17 | #include <mach/hardware.h> | ||
| 18 | |||
| 19 | extern void plat_tcc_reboot(void); | ||
| 20 | |||
| 21 | static inline void arch_idle(void) | ||
| 22 | { | ||
| 23 | cpu_do_idle(); | ||
| 24 | } | ||
| 25 | |||
| 26 | static inline void arch_reset(char mode, const char *cmd) | ||
| 27 | { | ||
| 28 | plat_tcc_reboot(); | ||
| 29 | } | ||
| 30 | |||
| 31 | #endif | ||
diff --git a/arch/arm/plat-tcc/include/mach/tcc8k-regs.h b/arch/arm/plat-tcc/include/mach/tcc8k-regs.h deleted file mode 100644 index 1d942829533..00000000000 --- a/arch/arm/plat-tcc/include/mach/tcc8k-regs.h +++ /dev/null | |||
| @@ -1,807 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Telechips TCC8000 register definitions | ||
| 3 | * | ||
| 4 | * (C) 2009 Hans J. Koch <hjk@linutronix.de> | ||
| 5 | * | ||
| 6 | * Licensed under the terms of the GPLv2. | ||
| 7 | */ | ||
| 8 | |||
| 9 | #ifndef TCC8K_REGS_H | ||
| 10 | #define TCC8K_REGS_H | ||
| 11 | |||
| 12 | #include <linux/types.h> | ||
| 13 | |||
| 14 | #define EXT_SDRAM_BASE 0x20000000 | ||
| 15 | #define INT_SRAM_BASE 0x30000000 | ||
| 16 | #define INT_SRAM_SIZE SZ_32K | ||
| 17 | #define CS0_BASE 0x40000000 | ||
| 18 | #define CS1_BASE 0x50000000 | ||
| 19 | #define CS1_SIZE SZ_64K | ||
| 20 | #define CS2_BASE 0x60000000 | ||
| 21 | #define CS3_BASE 0x70000000 | ||
| 22 | #define AHB_PERI_BASE 0x80000000 | ||
| 23 | #define AHB_PERI_SIZE SZ_64K | ||
| 24 | #define APB0_PERI_BASE 0x90000000 | ||
| 25 | #define APB0_PERI_SIZE SZ_128K | ||
| 26 | #define APB1_PERI_BASE 0x98000000 | ||
| 27 | #define APB1_PERI_SIZE SZ_128K | ||
| 28 | #define DATA_TCM_BASE 0xa0000000 | ||
| 29 | #define DATA_TCM_SIZE SZ_8K | ||
| 30 | #define EXT_MEM_CTRL_BASE 0xf0000000 | ||
| 31 | #define EXT_MEM_CTRL_SIZE SZ_4K | ||
| 32 | |||
| 33 | #define CS1_BASE_VIRT (void __iomem *)0xf7000000 | ||
| 34 | #define AHB_PERI_BASE_VIRT (void __iomem *)0xf4000000 | ||
| 35 | #define APB0_PERI_BASE_VIRT (void __iomem *)0xf1000000 | ||
| 36 | #define APB1_PERI_BASE_VIRT (void __iomem *)0xf2000000 | ||
| 37 | #define EXT_MEM_CTRL_BASE_VIRT (void __iomem *)0xf3000000 | ||
| 38 | #define INT_SRAM_BASE_VIRT (void __iomem *)0xf5000000 | ||
| 39 | #define DATA_TCM_BASE_VIRT (void __iomem *)0xf6000000 | ||
| 40 | |||
| 41 | #define __REG(x) (*((volatile u32 *)(x))) | ||
| 42 | |||
| 43 | /* USB Device Controller Registers */ | ||
| 44 | #define UDC_BASE (AHB_PERI_BASE_VIRT + 0x8000) | ||
| 45 | #define UDC_BASE_PHYS (AHB_PERI_BASE + 0x8000) | ||
| 46 | |||
| 47 | #define UDC_IR_OFFS 0x00 | ||
| 48 | #define UDC_EIR_OFFS 0x04 | ||
| 49 | #define UDC_EIER_OFFS 0x08 | ||
| 50 | #define UDC_FAR_OFFS 0x0c | ||
| 51 | #define UDC_FNR_OFFS 0x10 | ||
| 52 | #define UDC_EDR_OFFS 0x14 | ||
| 53 | #define UDC_RT_OFFS 0x18 | ||
| 54 | #define UDC_SSR_OFFS 0x1c | ||
| 55 | #define UDC_SCR_OFFS 0x20 | ||
| 56 | #define UDC_EP0SR_OFFS 0x24 | ||
| 57 | #define UDC_EP0CR_OFFS 0x28 | ||
| 58 | |||
| 59 | #define UDC_ESR_OFFS 0x2c | ||
| 60 | #define UDC_ECR_OFFS 0x30 | ||
| 61 | #define UDC_BRCR_OFFS 0x34 | ||
| 62 | #define UDC_BWCR_OFFS 0x38 | ||
| 63 | #define UDC_MPR_OFFS 0x3c | ||
| 64 | #define UDC_DCR_OFFS 0x40 | ||
| 65 | #define UDC_DTCR_OFFS 0x44 | ||
| 66 | #define UDC_DFCR_OFFS 0x48 | ||
| 67 | #define UDC_DTTCR1_OFFS 0x4c | ||
| 68 | #define UDC_DTTCR2_OFFS 0x50 | ||
| 69 | #define UDC_ESR2_OFFS 0x54 | ||
| 70 | |||
| 71 | #define UDC_SCR2_OFFS 0x58 | ||
| 72 | #define UDC_EP0BUF_OFFS 0x60 | ||
| 73 | #define UDC_EP1BUF_OFFS 0x64 | ||
| 74 | #define UDC_EP2BUF_OFFS 0x68 | ||
| 75 | #define UDC_EP3BUF_OFFS 0x6c | ||
| 76 | #define UDC_PLICR_OFFS 0xa0 | ||
| 77 | #define UDC_PCR_OFFS 0xa4 | ||
| 78 | |||
| 79 | #define UDC_UPCR0_OFFS 0xc8 | ||
| 80 | #define UDC_UPCR1_OFFS 0xcc | ||
| 81 | #define UDC_UPCR2_OFFS 0xd0 | ||
| 82 | #define UDC_UPCR3_OFFS 0xd4 | ||
| 83 | |||
| 84 | /* Bits in UDC_EIR */ | ||
| 85 | #define UDC_EIR_EP0I (1 << 0) | ||
| 86 | #define UDC_EIR_EP1I (1 << 1) | ||
| 87 | #define UDC_EIR_EP2I (1 << 2) | ||
| 88 | #define UDC_EIR_EP3I (1 << 3) | ||
| 89 | #define UDC_EIR_EPI_MASK 0x0f | ||
| 90 | |||
| 91 | /* Bits in UDC_EIER */ | ||
| 92 | #define UDC_EIER_EP0IE (1 << 0) | ||
| 93 | #define UDC_EIER_EP1IE (1 << 1) | ||
| 94 | #define UDC_EIER_EP2IE (1 << 2) | ||
| 95 | #define UDC_EIER_EP3IE (1 << 3) | ||
| 96 | |||
| 97 | /* Bits in UDC_FNR */ | ||
| 98 | #define UDC_FNR_FN_MASK 0x7ff | ||
| 99 | #define UDC_FNR_SM (1 << 13) | ||
| 100 | #define UDC_FNR_FTL (1 << 14) | ||
| 101 | |||
| 102 | /* Bits in UDC_SSR */ | ||
| 103 | #define UDC_SSR_HFRES (1 << 0) | ||
| 104 | #define UDC_SSR_HFSUSP (1 << 1) | ||
| 105 | #define UDC_SSR_HFRM (1 << 2) | ||
| 106 | #define UDC_SSR_SDE (1 << 3) | ||
| 107 | #define UDC_SSR_HSP (1 << 4) | ||
| 108 | #define UDC_SSR_DM (1 << 5) | ||
| 109 | #define UDC_SSR_DP (1 << 6) | ||
| 110 | #define UDC_SSR_TBM (1 << 7) | ||
| 111 | #define UDC_SSR_VBON (1 << 8) | ||
| 112 | #define UDC_SSR_VBOFF (1 << 9) | ||
| 113 | #define UDC_SSR_EOERR (1 << 10) | ||
| 114 | #define UDC_SSR_DCERR (1 << 11) | ||
| 115 | #define UDC_SSR_TCERR (1 << 12) | ||
| 116 | #define UDC_SSR_BSERR (1 << 13) | ||
| 117 | #define UDC_SSR_TMERR (1 << 14) | ||
| 118 | #define UDC_SSR_BAERR (1 << 15) | ||
| 119 | |||
| 120 | /* Bits in UDC_SCR */ | ||
| 121 | #define UDC_SCR_HRESE (1 << 0) | ||
| 122 | #define UDC_SCR_HSSPE (1 << 1) | ||
| 123 | #define UDC_SCR_RRDE (1 << 5) | ||
| 124 | #define UDC_SCR_SPDEN (1 << 6) | ||
| 125 | #define UDC_SCR_DIEN (1 << 12) | ||
| 126 | |||
| 127 | /* Bits in UDC_EP0SR */ | ||
| 128 | #define UDC_EP0SR_RSR (1 << 0) | ||
| 129 | #define UDC_EP0SR_TST (1 << 1) | ||
| 130 | #define UDC_EP0SR_SHT (1 << 4) | ||
| 131 | #define UDC_EP0SR_LWO (1 << 6) | ||
| 132 | |||
| 133 | /* Bits in UDC_EP0CR */ | ||
| 134 | #define UDC_EP0CR_ESS (1 << 1) | ||
| 135 | |||
| 136 | /* Bits in UDC_ESR */ | ||
| 137 | #define UDC_ESR_RPS (1 << 0) | ||
| 138 | #define UDC_ESR_TPS (1 << 1) | ||
| 139 | #define UDC_ESR_LWO (1 << 4) | ||
| 140 | #define UDC_ESR_FFS (1 << 6) | ||
| 141 | |||
| 142 | /* Bits in UDC_ECR */ | ||
| 143 | #define UDC_ECR_ESS (1 << 1) | ||
| 144 | #define UDC_ECR_CDP (1 << 2) | ||
| 145 | |||
| 146 | #define UDC_ECR_FLUSH (1 << 6) | ||
| 147 | #define UDC_ECR_DUEN (1 << 7) | ||
| 148 | |||
| 149 | /* Bits in UDC_UPCR0 */ | ||
| 150 | #define UDC_UPCR0_VBD (1 << 1) | ||
| 151 | #define UDC_UPCR0_VBDS (1 << 6) | ||
| 152 | #define UDC_UPCR0_RCD_12 (0x0 << 9) | ||
| 153 | #define UDC_UPCR0_RCD_24 (0x1 << 9) | ||
| 154 | #define UDC_UPCR0_RCD_48 (0x2 << 9) | ||
| 155 | #define UDC_UPCR0_RCS_EXT (0x1 << 11) | ||
| 156 | #define UDC_UPCR0_RCS_XTAL (0x0 << 11) | ||
| 157 | |||
| 158 | /* Bits in UDC_UPCR1 */ | ||
| 159 | #define UDC_UPCR1_CDT(x) ((x) << 0) | ||
| 160 | #define UDC_UPCR1_OTGT(x) ((x) << 3) | ||
| 161 | #define UDC_UPCR1_SQRXT(x) ((x) << 8) | ||
| 162 | #define UDC_UPCR1_TXFSLST(x) ((x) << 12) | ||
| 163 | |||
| 164 | /* Bits in UDC_UPCR2 */ | ||
| 165 | #define UDC_UPCR2_TP (1 << 0) | ||
| 166 | #define UDC_UPCR2_TXRT(x) ((x) << 2) | ||
| 167 | #define UDC_UPCR2_TXVRT(x) ((x) << 5) | ||
| 168 | #define UDC_UPCR2_OPMODE(x) ((x) << 9) | ||
| 169 | #define UDC_UPCR2_XCVRSEL(x) ((x) << 12) | ||
| 170 | #define UDC_UPCR2_TM (1 << 14) | ||
| 171 | |||
| 172 | /* USB Host Controller registers */ | ||
| 173 | #define USBH0_BASE (AHB_PERI_BASE_VIRT + 0xb000) | ||
| 174 | #define USBH1_BASE (AHB_PERI_BASE_VIRT + 0xb800) | ||
| 175 | |||
| 176 | #define OHCI_INT_ENABLE_OFFS 0x10 | ||
| 177 | |||
| 178 | #define RH_DESCRIPTOR_A_OFFS 0x48 | ||
| 179 | #define RH_DESCRIPTOR_B_OFFS 0x4c | ||
| 180 | |||
| 181 | #define USBHTCFG0_OFFS 0x100 | ||
| 182 | #define USBHHCFG0_OFFS 0x104 | ||
| 183 | #define USBHHCFG1_OFFS 0x104 | ||
| 184 | |||
| 185 | /* DMA controller registers */ | ||
| 186 | #define DMAC0_BASE (AHB_PERI_BASE + 0x4000) | ||
| 187 | #define DMAC1_BASE (AHB_PERI_BASE + 0xa000) | ||
| 188 | #define DMAC2_BASE (AHB_PERI_BASE + 0x4800) | ||
| 189 | #define DMAC3_BASE (AHB_PERI_BASE + 0xa800) | ||
| 190 | |||
| 191 | #define DMAC_CH_OFFSET(ch) (ch * 0x30) | ||
| 192 | |||
| 193 | #define ST_SADR_OFFS 0x00 | ||
| 194 | #define SPARAM_OFFS 0x04 | ||
| 195 | #define C_SADR_OFFS 0x0c | ||
| 196 | #define ST_DADR_OFFS 0x10 | ||
| 197 | #define DPARAM_OFFS 0x14 | ||
| 198 | #define C_DADR_OFFS 0x1c | ||
| 199 | #define HCOUNT_OFFS 0x20 | ||
| 200 | #define CHCTRL_OFFS 0x24 | ||
| 201 | #define RPTCTRL_OFFS 0x28 | ||
| 202 | #define EXTREQ_A_OFFS 0x2c | ||
| 203 | |||
| 204 | /* Bits in CHCTRL register */ | ||
| 205 | #define CHCTRL_EN (1 << 0) | ||
| 206 | |||
| 207 | #define CHCTRL_IEN (1 << 2) | ||
| 208 | #define CHCTRL_FLAG (1 << 3) | ||
| 209 | #define CHCTRL_WSIZE8 (0 << 4) | ||
| 210 | #define CHCTRL_WSIZE16 (1 << 4) | ||
| 211 | #define CHCTRL_WSIZE32 (2 << 4) | ||
| 212 | |||
| 213 | #define CHCTRL_BSIZE1 (0 << 6) | ||
| 214 | #define CHCTRL_BSIZE2 (1 << 6) | ||
| 215 | #define CHCTRL_BSIZE4 (2 << 6) | ||
| 216 | #define CHCTRL_BSIZE8 (3 << 6) | ||
| 217 | |||
| 218 | #define CHCTRL_TYPE_SINGLE_E (0 << 8) | ||
| 219 | #define CHCTRL_TYPE_HW (1 << 8) | ||
| 220 | #define CHCTRL_TYPE_SW (2 << 8) | ||
| 221 | #define CHCTRL_TYPE_SINGLE_L (3 << 8) | ||
| 222 | |||
| 223 | #define CHCTRL_BST (1 << 10) | ||
| 224 | |||
| 225 | /* Use DMA controller 0, channel 2 for USB */ | ||
| 226 | #define USB_DMA_BASE (DMAC0_BASE + DMAC_CH_OFFSET(2)) | ||
| 227 | |||
| 228 | /* NAND flash controller registers */ | ||
| 229 | #define NFC_BASE (AHB_PERI_BASE_VIRT + 0xd000) | ||
| 230 | #define NFC_BASE_PHYS (AHB_PERI_BASE + 0xd000) | ||
| 231 | |||
| 232 | #define NFC_CMD_OFFS 0x00 | ||
| 233 | #define NFC_LADDR_OFFS 0x04 | ||
| 234 | #define NFC_BADDR_OFFS 0x08 | ||
| 235 | #define NFC_SADDR_OFFS 0x0c | ||
| 236 | #define NFC_WDATA_OFFS 0x10 | ||
| 237 | #define NFC_LDATA_OFFS 0x20 | ||
| 238 | #define NFC_SDATA_OFFS 0x40 | ||
| 239 | #define NFC_CTRL_OFFS 0x50 | ||
| 240 | #define NFC_PSTART_OFFS 0x54 | ||
| 241 | #define NFC_RSTART_OFFS 0x58 | ||
| 242 | #define NFC_DSIZE_OFFS 0x5c | ||
| 243 | #define NFC_IREQ_OFFS 0x60 | ||
| 244 | #define NFC_RST_OFFS 0x64 | ||
| 245 | #define NFC_CTRL1_OFFS 0x68 | ||
| 246 | #define NFC_MDATA_OFFS 0x70 | ||
| 247 | |||
| 248 | #define NFC_WDATA_PHYS_ADDR (NFC_BASE_PHYS + NFC_WDATA_OFFS) | ||
| 249 | |||
| 250 | /* Bits in NFC_CTRL */ | ||
| 251 | #define NFC_CTRL_BHLD_MASK (0xf << 0) | ||
| 252 | #define NFC_CTRL_BPW_MASK (0xf << 4) | ||
| 253 | #define NFC_CTRL_BSTP_MASK (0xf << 8) | ||
| 254 | #define NFC_CTRL_CADDR_MASK (0x7 << 12) | ||
| 255 | #define NFC_CTRL_CADDR_1 (0x0 << 12) | ||
| 256 | #define NFC_CTRL_CADDR_2 (0x1 << 12) | ||
| 257 | #define NFC_CTRL_CADDR_3 (0x2 << 12) | ||
| 258 | #define NFC_CTRL_CADDR_4 (0x3 << 12) | ||
| 259 | #define NFC_CTRL_CADDR_5 (0x4 << 12) | ||
| 260 | #define NFC_CTRL_MSK (1 << 15) | ||
| 261 | #define NFC_CTRL_PSIZE256 (0 << 16) | ||
| 262 | #define NFC_CTRL_PSIZE512 (1 << 16) | ||
| 263 | #define NFC_CTRL_PSIZE1024 (2 << 16) | ||
| 264 | #define NFC_CTRL_PSIZE2048 (3 << 16) | ||
| 265 | #define NFC_CTRL_PSIZE4096 (4 << 16) | ||
| 266 | #define NFC_CTRL_PSIZE_MASK (7 << 16) | ||
| 267 | #define NFC_CTRL_BSIZE1 (0 << 19) | ||
| 268 | #define NFC_CTRL_BSIZE2 (1 << 19) | ||
| 269 | #define NFC_CTRL_BSIZE4 (2 << 19) | ||
| 270 | #define NFC_CTRL_BSIZE8 (3 << 19) | ||
| 271 | #define NFC_CTRL_BSIZE_MASK (3 << 19) | ||
| 272 | #define NFC_CTRL_RDY (1 << 21) | ||
| 273 | #define NFC_CTRL_CS0SEL (1 << 22) | ||
| 274 | #define NFC_CTRL_CS1SEL (1 << 23) | ||
| 275 | #define NFC_CTRL_CS2SEL (1 << 24) | ||
| 276 | #define NFC_CTRL_CS3SEL (1 << 25) | ||
| 277 | #define NFC_CTRL_CSMASK (0xf << 22) | ||
| 278 | #define NFC_CTRL_BW (1 << 26) | ||
| 279 | #define NFC_CTRL_FS (1 << 27) | ||
| 280 | #define NFC_CTRL_DEN (1 << 28) | ||
| 281 | #define NFC_CTRL_READ_IEN (1 << 29) | ||
| 282 | #define NFC_CTRL_PROG_IEN (1 << 30) | ||
| 283 | #define NFC_CTRL_RDY_IEN (1 << 31) | ||
| 284 | |||
| 285 | /* Bits in NFC_IREQ */ | ||
| 286 | #define NFC_IREQ_IRQ0 (1 << 0) | ||
| 287 | #define NFC_IREQ_IRQ1 (1 << 1) | ||
| 288 | #define NFC_IREQ_IRQ2 (1 << 2) | ||
| 289 | |||
| 290 | #define NFC_IREQ_FLAG0 (1 << 4) | ||
| 291 | #define NFC_IREQ_FLAG1 (1 << 5) | ||
| 292 | #define NFC_IREQ_FLAG2 (1 << 6) | ||
| 293 | |||
| 294 | /* MMC controller registers */ | ||
| 295 | #define MMC0_BASE (AHB_PERI_BASE_VIRT + 0xe000) | ||
| 296 | #define MMC1_BASE (AHB_PERI_BASE_VIRT + 0xe800) | ||
| 297 | |||
| 298 | /* UART base addresses */ | ||
| 299 | |||
| 300 | #define UART0_BASE (APB0_PERI_BASE_VIRT + 0x07000) | ||
| 301 | #define UART0_BASE_PHYS (APB0_PERI_BASE + 0x07000) | ||
| 302 | #define UART1_BASE (APB0_PERI_BASE_VIRT + 0x08000) | ||
| 303 | #define UART1_BASE_PHYS (APB0_PERI_BASE + 0x08000) | ||
| 304 | #define UART2_BASE (APB0_PERI_BASE_VIRT + 0x09000) | ||
| 305 | #define UART2_BASE_PHYS (APB0_PERI_BASE + 0x09000) | ||
| 306 | #define UART3_BASE (APB0_PERI_BASE_VIRT + 0x0a000) | ||
| 307 | #define UART3_BASE_PHYS (APB0_PERI_BASE + 0x0a000) | ||
| 308 | #define UART4_BASE (APB0_PERI_BASE_VIRT + 0x15000) | ||
| 309 | #define UART4_BASE_PHYS (APB0_PERI_BASE + 0x15000) | ||
| 310 | |||
| 311 | #define UART_BASE UART0_BASE | ||
| 312 | #define UART_BASE_PHYS UART0_BASE_PHYS | ||
| 313 | |||
| 314 | /* ECC controller */ | ||
| 315 | #define ECC_CTR_BASE (APB0_PERI_BASE_VIRT + 0xd000) | ||
| 316 | |||
| 317 | #define ECC_CTRL_OFFS 0x00 | ||
| 318 | #define ECC_BASE_OFFS 0x04 | ||
| 319 | #define ECC_MASK_OFFS 0x08 | ||
| 320 | #define ECC_CLEAR_OFFS 0x0c | ||
| 321 | #define ECC4_0_OFFS 0x10 | ||
| 322 | #define ECC4_1_OFFS 0x14 | ||
| 323 | |||
| 324 | #define ECC_EADDR0_OFFS 0x50 | ||
| 325 | |||
| 326 | #define ECC_ERRNUM_OFFS 0x90 | ||
| 327 | #define ECC_IREQ_OFFS 0x94 | ||
| 328 | |||
| 329 | /* Bits in ECC_CTRL */ | ||
| 330 | #define ECC_CTRL_ECC4_DIEN (1 << 28) | ||
| 331 | #define ECC_CTRL_ECC8_DIEN (1 << 29) | ||
| 332 | #define ECC_CTRL_ECC12_DIEN (1 << 30) | ||
| 333 | #define ECC_CTRL_ECC_DISABLE 0x0 | ||
| 334 | #define ECC_CTRL_ECC_SLC_ENC 0x8 | ||
| 335 | #define ECC_CTRL_ECC_SLC_DEC 0x9 | ||
| 336 | #define ECC_CTRL_ECC4_ENC 0xa | ||
| 337 | #define ECC_CTRL_ECC4_DEC 0xb | ||
| 338 | #define ECC_CTRL_ECC8_ENC 0xc | ||
| 339 | #define ECC_CTRL_ECC8_DEC 0xd | ||
| 340 | #define ECC_CTRL_ECC12_ENC 0xe | ||
| 341 | #define ECC_CTRL_ECC12_DEC 0xf | ||
| 342 | |||
| 343 | /* Bits in ECC_IREQ */ | ||
| 344 | #define ECC_IREQ_E4DI (1 << 4) | ||
| 345 | |||
| 346 | #define ECC_IREQ_E4DF (1 << 20) | ||
| 347 | #define ECC_IREQ_E4EF (1 << 21) | ||
| 348 | |||
| 349 | /* Interrupt controller */ | ||
| 350 | |||
| 351 | #define PIC0_BASE (APB1_PERI_BASE_VIRT + 0x3000) | ||
| 352 | #define PIC0_BASE_PHYS (APB1_PERI_BASE + 0x3000) | ||
| 353 | |||
| 354 | #define PIC0_IEN_OFFS 0x00 | ||
| 355 | #define PIC0_CREQ_OFFS 0x04 | ||
| 356 | #define PIC0_IREQ_OFFS 0x08 | ||
| 357 | #define PIC0_IRQSEL_OFFS 0x0c | ||
| 358 | #define PIC0_SRC_OFFS 0x10 | ||
| 359 | #define PIC0_MREQ_OFFS 0x14 | ||
| 360 | #define PIC0_TSTREQ_OFFS 0x18 | ||
| 361 | #define PIC0_POL_OFFS 0x1c | ||
| 362 | #define PIC0_IRQ_OFFS 0x20 | ||
| 363 | #define PIC0_FIQ_OFFS 0x24 | ||
| 364 | #define PIC0_MIRQ_OFFS 0x28 | ||
| 365 | #define PIC0_MFIQ_OFFS 0x2c | ||
| 366 | #define PIC0_TMODE_OFFS 0x30 | ||
| 367 | #define PIC0_SYNC_OFFS 0x34 | ||
| 368 | #define PIC0_WKUP_OFFS 0x38 | ||
| 369 | #define PIC0_TMODEA_OFFS 0x3c | ||
| 370 | #define PIC0_INTOEN_OFFS 0x40 | ||
| 371 | #define PIC0_MEN0_OFFS 0x44 | ||
| 372 | #define PIC0_MEN_OFFS 0x48 | ||
| 373 | |||
| 374 | #define PIC0_IEN __REG(PIC0_BASE + PIC0_IEN_OFFS) | ||
| 375 | #define PIC0_IEN_PHYS __REG(PIC0_BASE_PHYS + PIC0_IEN_OFFS) | ||
| 376 | #define PIC0_CREQ __REG(PIC0_BASE + PIC0_CREQ_OFFS) | ||
| 377 | #define PIC0_CREQ_PHYS __REG(PIC0_BASE_PHYS + PIC0_CREQ_OFFS) | ||
| 378 | #define PIC0_IREQ __REG(PIC0_BASE + PIC0_IREQ_OFFS) | ||
| 379 | #define PIC0_IRQSEL __REG(PIC0_BASE + PIC0_IRQSEL_OFFS) | ||
| 380 | #define PIC0_IRQSEL_PHYS __REG(PIC0_BASE_PHYS + PIC0_IRQSEL_OFFS) | ||
| 381 | #define PIC0_SRC __REG(PIC0_BASE + PIC0_SRC_OFFS) | ||
| 382 | #define PIC0_MREQ __REG(PIC0_BASE + PIC0_MREQ_OFFS) | ||
| 383 | #define PIC0_TSTREQ __REG(PIC0_BASE + PIC0_TSTREQ_OFFS) | ||
| 384 | #define PIC0_POL __REG(PIC0_BASE + PIC0_POL_OFFS) | ||
| 385 | #define PIC0_IRQ __REG(PIC0_BASE + PIC0_IRQ_OFFS) | ||
| 386 | #define PIC0_FIQ __REG(PIC0_BASE + PIC0_FIQ_OFFS) | ||
| 387 | #define PIC0_MIRQ __REG(PIC0_BASE + PIC0_MIRQ_OFFS) | ||
| 388 | #define PIC0_MFIQ __REG(PIC0_BASE + PIC0_MFIQ_OFFS) | ||
| 389 | #define PIC0_TMODE __REG(PIC0_BASE + PIC0_TMODE_OFFS) | ||
| 390 | #define PIC0_TMODE_PHYS __REG(PIC0_BASE_PHYS + PIC0_TMODE_OFFS) | ||
| 391 | #define PIC0_SYNC __REG(PIC0_BASE + PIC0_SYNC_OFFS) | ||
| 392 | #define PIC0_WKUP __REG(PIC0_BASE + PIC0_WKUP_OFFS) | ||
| 393 | #define PIC0_TMODEA __REG(PIC0_BASE + PIC0_TMODEA_OFFS) | ||
| 394 | #define PIC0_INTOEN __REG(PIC0_BASE + PIC0_INTOEN_OFFS) | ||
| 395 | #define PIC0_MEN0 __REG(PIC0_BASE + PIC0_MEN0_OFFS) | ||
| 396 | #define PIC0_MEN __REG(PIC0_BASE + PIC0_MEN_OFFS) | ||
| 397 | |||
| 398 | #define PIC1_BASE (APB1_PERI_BASE_VIRT + 0x3080) | ||
| 399 | |||
| 400 | #define PIC1_IEN_OFFS 0x00 | ||
| 401 | #define PIC1_CREQ_OFFS 0x04 | ||
| 402 | #define PIC1_IREQ_OFFS 0x08 | ||
| 403 | #define PIC1_IRQSEL_OFFS 0x0c | ||
| 404 | #define PIC1_SRC_OFFS 0x10 | ||
| 405 | #define PIC1_MREQ_OFFS 0x14 | ||
| 406 | #define PIC1_TSTREQ_OFFS 0x18 | ||
| 407 | #define PIC1_POL_OFFS 0x1c | ||
| 408 | #define PIC1_IRQ_OFFS 0x20 | ||
| 409 | #define PIC1_FIQ_OFFS 0x24 | ||
| 410 | #define PIC1_MIRQ_OFFS 0x28 | ||
| 411 | #define PIC1_MFIQ_OFFS 0x2c | ||
| 412 | #define PIC1_TMODE_OFFS 0x30 | ||
| 413 | #define PIC1_SYNC_OFFS 0x34 | ||
| 414 | #define PIC1_WKUP_OFFS 0x38 | ||
| 415 | #define PIC1_TMODEA_OFFS 0x3c | ||
| 416 | #define PIC1_INTOEN_OFFS 0x40 | ||
| 417 | #define PIC1_MEN1_OFFS 0x44 | ||
| 418 | #define PIC1_MEN_OFFS 0x48 | ||
| 419 | |||
| 420 | #define PIC1_IEN __REG(PIC1_BASE + PIC1_IEN_OFFS) | ||
| 421 | #define PIC1_CREQ __REG(PIC1_BASE + PIC1_CREQ_OFFS) | ||
| 422 | #define PIC1_IREQ __REG(PIC1_BASE + PIC1_IREQ_OFFS) | ||
| 423 | #define PIC1_IRQSEL __REG(PIC1_BASE + PIC1_IRQSEL_OFFS) | ||
| 424 | #define PIC1_SRC __REG(PIC1_BASE + PIC1_SRC_OFFS) | ||
| 425 | #define PIC1_MREQ __REG(PIC1_BASE + PIC1_MREQ_OFFS) | ||
| 426 | #define PIC1_TSTREQ __REG(PIC1_BASE + PIC1_TSTREQ_OFFS) | ||
| 427 | #define PIC1_POL __REG(PIC1_BASE + PIC1_POL_OFFS) | ||
| 428 | #define PIC1_IRQ __REG(PIC1_BASE + PIC1_IRQ_OFFS) | ||
| 429 | #define PIC1_FIQ __REG(PIC1_BASE + PIC1_FIQ_OFFS) | ||
| 430 | #define PIC1_MIRQ __REG(PIC1_BASE + PIC1_MIRQ_OFFS) | ||
| 431 | #define PIC1_MFIQ __REG(PIC1_BASE + PIC1_MFIQ_OFFS) | ||
| 432 | #define PIC1_TMODE __REG(PIC1_BASE + PIC1_TMODE_OFFS) | ||
| 433 | #define PIC1_SYNC __REG(PIC1_BASE + PIC1_SYNC_OFFS) | ||
| 434 | #define PIC1_WKUP __REG(PIC1_BASE + PIC1_WKUP_OFFS) | ||
| 435 | #define PIC1_TMODEA __REG(PIC1_BASE + PIC1_TMODEA_OFFS) | ||
| 436 | #define PIC1_INTOEN __REG(PIC1_BASE + PIC1_INTOEN_OFFS) | ||
| 437 | #define PIC1_MEN1 __REG(PIC1_BASE + PIC1_MEN1_OFFS) | ||
| 438 | #define PIC1_MEN __REG(PIC1_BASE + PIC1_MEN_OFFS) | ||
| 439 | |||
| 440 | /* Timer registers */ | ||
| 441 | #define TIMER_BASE (APB1_PERI_BASE_VIRT + 0x4000) | ||
| 442 | #define TIMER_BASE_PHYS (APB1_PERI_BASE + 0x4000) | ||
| 443 | |||
| 444 | #define TWDCFG_OFFS 0x70 | ||
| 445 | |||
| 446 | #define TC32EN_OFFS 0x80 | ||
| 447 | #define TC32LDV_OFFS 0x84 | ||
| 448 | #define TC32CMP0_OFFS 0x88 | ||
| 449 | #define TC32CMP1_OFFS 0x8c | ||
| 450 | #define TC32PCNT_OFFS 0x90 | ||
| 451 | #define TC32MCNT_OFFS 0x94 | ||
| 452 | #define TC32IRQ_OFFS 0x98 | ||
| 453 | |||
| 454 | /* Bits in TC32EN */ | ||
| 455 | #define TC32EN_PRESCALE_MASK 0x00ffffff | ||
| 456 | #define TC32EN_ENABLE (1 << 24) | ||
| 457 | #define TC32EN_LOADZERO (1 << 25) | ||
| 458 | #define TC32EN_STOPMODE (1 << 26) | ||
| 459 | #define TC32EN_LDM0 (1 << 28) | ||
| 460 | #define TC32EN_LDM1 (1 << 29) | ||
| 461 | |||
| 462 | /* Bits in TC32IRQ */ | ||
| 463 | #define TC32IRQ_MSTAT_MASK 0x0000001f | ||
| 464 | #define TC32IRQ_RSTAT_MASK (0x1f << 8) | ||
| 465 | #define TC32IRQ_IRQEN0 (1 << 16) | ||
| 466 | #define TC32IRQ_IRQEN1 (1 << 17) | ||
| 467 | #define TC32IRQ_IRQEN2 (1 << 18) | ||
| 468 | #define TC32IRQ_IRQEN3 (1 << 19) | ||
| 469 | #define TC32IRQ_IRQEN4 (1 << 20) | ||
| 470 | #define TC32IRQ_RSYNC (1 << 30) | ||
| 471 | #define TC32IRQ_IRQCLR (1 << 31) | ||
| 472 | |||
| 473 | /* GPIO registers */ | ||
| 474 | #define GPIOPD_BASE (APB1_PERI_BASE_VIRT + 0x5000) | ||
| 475 | |||
| 476 | #define GPIOPD_DAT_OFFS 0x00 | ||
| 477 | #define GPIOPD_DOE_OFFS 0x04 | ||
| 478 | #define GPIOPD_FS0_OFFS 0x08 | ||
| 479 | #define GPIOPD_FS1_OFFS 0x0c | ||
| 480 | #define GPIOPD_FS2_OFFS 0x10 | ||
| 481 | #define GPIOPD_RPU_OFFS 0x30 | ||
| 482 | #define GPIOPD_RPD_OFFS 0x34 | ||
| 483 | #define GPIOPD_DV0_OFFS 0x38 | ||
| 484 | #define GPIOPD_DV1_OFFS 0x3c | ||
| 485 | |||
| 486 | #define GPIOPS_BASE (APB1_PERI_BASE_VIRT + 0x5000) | ||
| 487 | |||
| 488 | #define GPIOPS_DAT_OFFS 0x40 | ||
| 489 | #define GPIOPS_DOE_OFFS 0x44 | ||
| 490 | #define GPIOPS_FS0_OFFS 0x48 | ||
| 491 | #define GPIOPS_FS1_OFFS 0x4c | ||
| 492 | #define GPIOPS_FS2_OFFS 0x50 | ||
| 493 | #define GPIOPS_FS3_OFFS 0x54 | ||
| 494 | #define GPIOPS_RPU_OFFS 0x70 | ||
| 495 | #define GPIOPS_RPD_OFFS 0x74 | ||
| 496 | #define GPIOPS_DV0_OFFS 0x78 | ||
| 497 | #define GPIOPS_DV1_OFFS 0x7c | ||
| 498 | |||
| 499 | #define GPIOPS_FS1_SDH0_BITS 0x000000ff | ||
| 500 | #define GPIOPS_FS1_SDH1_BITS 0x0000ff00 | ||
| 501 | |||
| 502 | #define GPIOPU_BASE (APB1_PERI_BASE_VIRT + 0x5000) | ||
| 503 | |||
| 504 | #define GPIOPU_DAT_OFFS 0x80 | ||
| 505 | #define GPIOPU_DOE_OFFS 0x84 | ||
| 506 | #define GPIOPU_FS0_OFFS 0x88 | ||
| 507 | #define GPIOPU_FS1_OFFS 0x8c | ||
| 508 | #define GPIOPU_FS2_OFFS 0x90 | ||
| 509 | #define GPIOPU_RPU_OFFS 0xb0 | ||
| 510 | #define GPIOPU_RPD_OFFS 0xb4 | ||
| 511 | #define GPIOPU_DV0_OFFS 0xb8 | ||
| 512 | #define GPIOPU_DV1_OFFS 0xbc | ||
| 513 | |||
| 514 | #define GPIOPU_FS0_TXD0 (1 << 0) | ||
| 515 | #define GPIOPU_FS0_RXD0 (1 << 1) | ||
| 516 | #define GPIOPU_FS0_CTS0 (1 << 2) | ||
| 517 | #define GPIOPU_FS0_RTS0 (1 << 3) | ||
| 518 | #define GPIOPU_FS0_TXD1 (1 << 4) | ||
| 519 | #define GPIOPU_FS0_RXD1 (1 << 5) | ||
| 520 | #define GPIOPU_FS0_CTS1 (1 << 6) | ||
| 521 | #define GPIOPU_FS0_RTS1 (1 << 7) | ||
| 522 | #define GPIOPU_FS0_TXD2 (1 << 8) | ||
| 523 | #define GPIOPU_FS0_RXD2 (1 << 9) | ||
| 524 | #define GPIOPU_FS0_CTS2 (1 << 10) | ||
| 525 | #define GPIOPU_FS0_RTS2 (1 << 11) | ||
| 526 | #define GPIOPU_FS0_TXD3 (1 << 12) | ||
| 527 | #define GPIOPU_FS0_RXD3 (1 << 13) | ||
| 528 | #define GPIOPU_FS0_CTS3 (1 << 14) | ||
| 529 | #define GPIOPU_FS0_RTS3 (1 << 15) | ||
| 530 | #define GPIOPU_FS0_TXD4 (1 << 16) | ||
| 531 | #define GPIOPU_FS0_RXD4 (1 << 17) | ||
| 532 | #define GPIOPU_FS0_CTS4 (1 << 18) | ||
| 533 | #define GPIOPU_FS0_RTS4 (1 << 19) | ||
| 534 | |||
| 535 | #define GPIOFC_BASE (APB1_PERI_BASE_VIRT + 0x5000) | ||
| 536 | |||
| 537 | #define GPIOFC_DAT_OFFS 0xc0 | ||
| 538 | #define GPIOFC_DOE_OFFS 0xc4 | ||
| 539 | #define GPIOFC_FS0_OFFS 0xc8 | ||
| 540 | #define GPIOFC_FS1_OFFS 0xcc | ||
| 541 | #define GPIOFC_FS2_OFFS 0xd0 | ||
| 542 | #define GPIOFC_FS3_OFFS 0xd4 | ||
| 543 | #define GPIOFC_RPU_OFFS 0xf0 | ||
| 544 | #define GPIOFC_RPD_OFFS 0xf4 | ||
| 545 | #define GPIOFC_DV0_OFFS 0xf8 | ||
| 546 | #define GPIOFC_DV1_OFFS 0xfc | ||
| 547 | |||
| 548 | #define GPIOFD_BASE (APB1_PERI_BASE_VIRT + 0x5000) | ||
| 549 | |||
| 550 | #define GPIOFD_DAT_OFFS 0x100 | ||
| 551 | #define GPIOFD_DOE_OFFS 0x104 | ||
| 552 | #define GPIOFD_FS0_OFFS 0x108 | ||
| 553 | #define GPIOFD_FS1_OFFS 0x10c | ||
| 554 | #define GPIOFD_FS2_OFFS 0x110 | ||
| 555 | #define GPIOFD_RPU_OFFS 0x130 | ||
| 556 | #define GPIOFD_RPD_OFFS 0x134 | ||
| 557 | #define GPIOFD_DV0_OFFS 0x138 | ||
| 558 | #define GPIOFD_DV1_OFFS 0x13c | ||
| 559 | |||
| 560 | #define GPIOLC_BASE (APB1_PERI_BASE_VIRT + 0x5000) | ||
| 561 | |||
| 562 | #define GPIOLC_DAT_OFFS 0x140 | ||
| 563 | #define GPIOLC_DOE_OFFS 0x144 | ||
| 564 | #define GPIOLC_FS0_OFFS 0x148 | ||
| 565 | #define GPIOLC_FS1_OFFS 0x14c | ||
| 566 | #define GPIOLC_RPU_OFFS 0x170 | ||
| 567 | #define GPIOLC_RPD_OFFS 0x174 | ||
| 568 | #define GPIOLC_DV0_OFFS 0x178 | ||
| 569 | #define GPIOLC_DV1_OFFS 0x17c | ||
| 570 | |||
| 571 | #define GPIOLD_BASE (APB1_PERI_BASE_VIRT + 0x5000) | ||
| 572 | |||
| 573 | #define GPIOLD_DAT_OFFS 0x180 | ||
| 574 | #define GPIOLD_DOE_OFFS 0x184 | ||
| 575 | #define GPIOLD_FS0_OFFS 0x188 | ||
| 576 | #define GPIOLD_FS1_OFFS 0x18c | ||
| 577 | #define GPIOLD_FS2_OFFS 0x190 | ||
| 578 | #define GPIOLD_RPU_OFFS 0x1b0 | ||
| 579 | #define GPIOLD_RPD_OFFS 0x1b4 | ||
| 580 | #define GPIOLD_DV0_OFFS 0x1b8 | ||
| 581 | #define GPIOLD_DV1_OFFS 0x1bc | ||
| 582 | |||
| 583 | #define GPIOAD_BASE (APB1_PERI_BASE_VIRT + 0x5000) | ||
| 584 | |||
| 585 | #define GPIOAD_DAT_OFFS 0x1c0 | ||
| 586 | #define GPIOAD_DOE_OFFS 0x1c4 | ||
| 587 | #define GPIOAD_FS0_OFFS 0x1c8 | ||
| 588 | #define GPIOAD_RPU_OFFS 0x1f0 | ||
| 589 | #define GPIOAD_RPD_OFFS 0x1f4 | ||
| 590 | #define GPIOAD_DV0_OFFS 0x1f8 | ||
| 591 | #define GPIOAD_DV1_OFFS 0x1fc | ||
| 592 | |||
| 593 | #define GPIOXC_BASE (APB1_PERI_BASE_VIRT + 0x5000) | ||
| 594 | |||
| 595 | #define GPIOXC_DAT_OFFS 0x200 | ||
| 596 | #define GPIOXC_DOE_OFFS 0x204 | ||
| 597 | #define GPIOXC_FS0_OFFS 0x208 | ||
| 598 | #define GPIOXC_RPU_OFFS 0x230 | ||
| 599 | #define GPIOXC_RPD_OFFS 0x234 | ||
| 600 | #define GPIOXC_DV0_OFFS 0x238 | ||
| 601 | #define GPIOXC_DV1_OFFS 0x23c | ||
| 602 | |||
| 603 | #define GPIOXC_FS0 __REG(GPIOXC_BASE + GPIOXC_FS0_OFFS) | ||
| 604 | |||
| 605 | #define GPIOXC_FS0_CS0 (1 << 26) | ||
| 606 | #define GPIOXC_FS0_CS1 (1 << 27) | ||
| 607 | |||
| 608 | #define GPIOXD_BASE (APB1_PERI_BASE_VIRT + 0x5000) | ||
| 609 | |||
| 610 | #define GPIOXD_DAT_OFFS 0x240 | ||
| 611 | #define GPIOXD_FS0_OFFS 0x248 | ||
| 612 | #define GPIOXD_RPU_OFFS 0x270 | ||
| 613 | #define GPIOXD_RPD_OFFS 0x274 | ||
| 614 | #define GPIOXD_DV0_OFFS 0x278 | ||
| 615 | #define GPIOXD_DV1_OFFS 0x27c | ||
| 616 | |||
| 617 | #define GPIOPK_BASE (APB1_PERI_BASE_VIRT + 0x1c000) | ||
| 618 | |||
| 619 | #define GPIOPK_RST_OFFS 0x008 | ||
| 620 | #define GPIOPK_DAT_OFFS 0x100 | ||
| 621 | #define GPIOPK_DOE_OFFS 0x104 | ||
| 622 | #define GPIOPK_FS0_OFFS 0x108 | ||
| 623 | #define GPIOPK_FS1_OFFS 0x10c | ||
| 624 | #define GPIOPK_FS2_OFFS 0x110 | ||
| 625 | #define GPIOPK_IRQST_OFFS 0x210 | ||
| 626 | #define GPIOPK_IRQEN_OFFS 0x214 | ||
| 627 | #define GPIOPK_IRQPOL_OFFS 0x218 | ||
| 628 | #define GPIOPK_IRQTM0_OFFS 0x21c | ||
| 629 | #define GPIOPK_IRQTM1_OFFS 0x220 | ||
| 630 | #define GPIOPK_CTL_OFFS 0x22c | ||
| 631 | |||
| 632 | #define PMGPIO_BASE (APB1_PERI_BASE_VIRT + 0x10000) | ||
| 633 | #define BACKUP_RAM_BASE PMGPIO_BASE | ||
| 634 | |||
| 635 | #define PMGPIO_DAT_OFFS 0x800 | ||
| 636 | #define PMGPIO_DOE_OFFS 0x804 | ||
| 637 | #define PMGPIO_FS0_OFFS 0x808 | ||
| 638 | #define PMGPIO_RPU_OFFS 0x810 | ||
| 639 | #define PMGPIO_RPD_OFFS 0x814 | ||
| 640 | #define PMGPIO_DV0_OFFS 0x818 | ||
| 641 | #define PMGPIO_DV1_OFFS 0x81c | ||
| 642 | #define PMGPIO_EE0_OFFS 0x820 | ||
| 643 | #define PMGPIO_EE1_OFFS 0x824 | ||
| 644 | #define PMGPIO_CTL_OFFS 0x828 | ||
| 645 | #define PMGPIO_DI_OFFS 0x82c | ||
| 646 | #define PMGPIO_STR_OFFS 0x830 | ||
| 647 | #define PMGPIO_STF_OFFS 0x834 | ||
| 648 | #define PMGPIO_POL_OFFS 0x838 | ||
| 649 | #define PMGPIO_APB_OFFS 0x800 | ||
| 650 | |||
| 651 | /* Clock controller registers */ | ||
| 652 | #define CKC_BASE ((void __iomem *)(APB1_PERI_BASE_VIRT + 0x6000)) | ||
| 653 | |||
| 654 | #define CLKCTRL_OFFS 0x00 | ||
| 655 | #define PLL0CFG_OFFS 0x04 | ||
| 656 | #define PLL1CFG_OFFS 0x08 | ||
| 657 | #define CLKDIVC0_OFFS 0x0c | ||
| 658 | |||
| 659 | #define BCLKCTR0_OFFS 0x14 | ||
| 660 | #define SWRESET0_OFFS 0x18 | ||
| 661 | |||
| 662 | #define BCLKCTR1_OFFS 0x60 | ||
| 663 | #define SWRESET1_OFFS 0x64 | ||
| 664 | #define PWDCTL_OFFS 0x68 | ||
| 665 | #define PLL2CFG_OFFS 0x6c | ||
| 666 | #define CLKDIVC1_OFFS 0x70 | ||
| 667 | |||
| 668 | #define ACLKREF_OFFS 0x80 | ||
| 669 | #define ACLKI2C_OFFS 0x84 | ||
| 670 | #define ACLKSPI0_OFFS 0x88 | ||
| 671 | #define ACLKSPI1_OFFS 0x8c | ||
| 672 | #define ACLKUART0_OFFS 0x90 | ||
| 673 | #define ACLKUART1_OFFS 0x94 | ||
| 674 | #define ACLKUART2_OFFS 0x98 | ||
| 675 | #define ACLKUART3_OFFS 0x9c | ||
| 676 | #define ACLKUART4_OFFS 0xa0 | ||
| 677 | #define ACLKTCT_OFFS 0xa4 | ||
| 678 | #define ACLKTCX_OFFS 0xa8 | ||
| 679 | #define ACLKTCZ_OFFS 0xac | ||
| 680 | #define ACLKADC_OFFS 0xb0 | ||
| 681 | #define ACLKDAI0_OFFS 0xb4 | ||
| 682 | #define ACLKDAI1_OFFS 0xb8 | ||
| 683 | #define ACLKLCD_OFFS 0xbc | ||
| 684 | #define ACLKSPDIF_OFFS 0xc0 | ||
| 685 | #define ACLKUSBH_OFFS 0xc4 | ||
| 686 | #define ACLKSDH0_OFFS 0xc8 | ||
| 687 | #define ACLKSDH1_OFFS 0xcc | ||
| 688 | #define ACLKC3DEC_OFFS 0xd0 | ||
| 689 | #define ACLKEXT_OFFS 0xd4 | ||
| 690 | #define ACLKCAN0_OFFS 0xd8 | ||
| 691 | #define ACLKCAN1_OFFS 0xdc | ||
| 692 | #define ACLKGSB0_OFFS 0xe0 | ||
| 693 | #define ACLKGSB1_OFFS 0xe4 | ||
| 694 | #define ACLKGSB2_OFFS 0xe8 | ||
| 695 | #define ACLKGSB3_OFFS 0xec | ||
| 696 | |||
| 697 | #define PLLxCFG_PD (1 << 31) | ||
| 698 | |||
| 699 | /* CLKCTRL bits */ | ||
| 700 | #define CLKCTRL_XE (1 << 31) | ||
| 701 | |||
| 702 | /* CLKDIVCx bits */ | ||
| 703 | #define CLKDIVC0_XTE (1 << 7) | ||
| 704 | #define CLKDIVC0_XE (1 << 15) | ||
| 705 | #define CLKDIVC0_P1E (1 << 23) | ||
| 706 | #define CLKDIVC0_P0E (1 << 31) | ||
| 707 | |||
| 708 | #define CLKDIVC1_P2E (1 << 7) | ||
| 709 | |||
| 710 | /* BCLKCTR0 clock bits */ | ||
| 711 | #define BCLKCTR0_USBD (1 << 4) | ||
| 712 | #define BCLKCTR0_ECC (1 << 9) | ||
| 713 | #define BCLKCTR0_USBH0 (1 << 11) | ||
| 714 | #define BCLKCTR0_NFC (1 << 16) | ||
| 715 | |||
| 716 | /* BCLKCTR1 clock bits */ | ||
| 717 | #define BCLKCTR1_USBH1 (1 << 20) | ||
| 718 | |||
| 719 | /* SWRESET0 bits */ | ||
| 720 | #define SWRESET0_USBD (1 << 4) | ||
| 721 | #define SWRESET0_USBH0 (1 << 11) | ||
| 722 | |||
| 723 | /* SWRESET1 bits */ | ||
| 724 | #define SWRESET1_USBH1 (1 << 20) | ||
| 725 | |||
| 726 | /* System clock sources. | ||
| 727 | * Note: These are the clock sources that serve as parents for | ||
| 728 | * all other clocks. They have no parents themselves. | ||
| 729 | * | ||
| 730 | * These values are used for struct clk->root_id. All clocks | ||
| 731 | * that are not system clock sources have this value set to | ||
| 732 | * CLK_SRC_NOROOT. | ||
| 733 | * The values for system clocks start with CLK_SRC_PLL0 == 0 | ||
| 734 | * because this gives us exactly the values needed for the lower | ||
| 735 | * 4 bits of ACLK_* registers. Therefore, CLK_SRC_NOROOT is | ||
| 736 | * defined as -1 to not disturb the order. | ||
| 737 | */ | ||
| 738 | enum root_clks { | ||
| 739 | CLK_SRC_NOROOT = -1, | ||
| 740 | CLK_SRC_PLL0 = 0, | ||
| 741 | CLK_SRC_PLL1, | ||
| 742 | CLK_SRC_PLL0DIV, | ||
| 743 | CLK_SRC_PLL1DIV, | ||
| 744 | CLK_SRC_XI, | ||
| 745 | CLK_SRC_XIDIV, | ||
| 746 | CLK_SRC_XTI, | ||
| 747 | CLK_SRC_XTIDIV, | ||
| 748 | CLK_SRC_PLL2, | ||
| 749 | CLK_SRC_PLL2DIV, | ||
| 750 | CLK_SRC_PK0, | ||
| 751 | CLK_SRC_PK1, | ||
| 752 | CLK_SRC_PK2, | ||
| 753 | CLK_SRC_PK3, | ||
| 754 | CLK_SRC_PK4, | ||
| 755 | CLK_SRC_48MHZ | ||
| 756 | }; | ||
| 757 | |||
| 758 | #define CLK_SRC_MASK 0xf | ||
| 759 | |||
| 760 | /* Bits in ACLK* registers */ | ||
| 761 | #define ACLK_EN (1 << 28) | ||
| 762 | #define ACLK_SEL_SHIFT 24 | ||
| 763 | #define ACLK_SEL_MASK 0x0f000000 | ||
| 764 | #define ACLK_DIV_MASK 0x00000fff | ||
| 765 | |||
| 766 | /* System configuration registers */ | ||
| 767 | |||
| 768 | #define SCFG_BASE (APB1_PERI_BASE_VIRT + 0x13000) | ||
| 769 | |||
| 770 | #define BMI_OFFS 0x00 | ||
| 771 | #define AHBCON0_OFFS 0x04 | ||
| 772 | #define APBPWE_OFFS 0x08 | ||
| 773 | #define DTCMWAIT_OFFS 0x0c | ||
| 774 | #define ECCSEL_OFFS 0x10 | ||
| 775 | #define AHBCON1_OFFS 0x14 | ||
| 776 | #define SDHCFG_OFFS 0x18 | ||
| 777 | #define REMAP_OFFS 0x20 | ||
| 778 | #define LCDSIAE_OFFS 0x24 | ||
| 779 | #define XMCCFG_OFFS 0xe0 | ||
| 780 | #define IMCCFG_OFFS 0xe4 | ||
| 781 | |||
| 782 | /* Values for ECCSEL */ | ||
| 783 | #define ECCSEL_EXTMEM 0x0 | ||
| 784 | #define ECCSEL_DTCM 0x1 | ||
| 785 | #define ECCSEL_INT_SRAM 0x2 | ||
| 786 | #define ECCSEL_AHB 0x3 | ||
| 787 | |||
| 788 | /* Bits in XMCCFG */ | ||
| 789 | #define XMCCFG_NFCE (1 << 1) | ||
| 790 | #define XMCCFG_FDXD (1 << 2) | ||
| 791 | |||
| 792 | /* External memory controller registers */ | ||
| 793 | |||
| 794 | #define EMC_BASE EXT_MEM_CTRL_BASE | ||
| 795 | |||
| 796 | #define SDCFG_OFFS 0x00 | ||
| 797 | #define SDFSM_OFFS 0x04 | ||
| 798 | #define MCFG_OFFS 0x08 | ||
| 799 | |||
| 800 | #define CSCFG0_OFFS 0x10 | ||
| 801 | #define CSCFG1_OFFS 0x14 | ||
| 802 | #define CSCFG2_OFFS 0x18 | ||
| 803 | #define CSCFG3_OFFS 0x1c | ||
| 804 | |||
| 805 | #define MCFG_SDEN (1 << 4) | ||
| 806 | |||
| 807 | #endif /* TCC8K_REGS_H */ | ||
diff --git a/arch/arm/plat-tcc/include/mach/timex.h b/arch/arm/plat-tcc/include/mach/timex.h deleted file mode 100644 index 057acbe651d..00000000000 --- a/arch/arm/plat-tcc/include/mach/timex.h +++ /dev/null | |||
| @@ -1,5 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * A definition needed by arch core code. | ||
| 3 | * | ||
| 4 | */ | ||
| 5 | #define CLOCK_TICK_RATE (HZ * 100000UL) | ||
diff --git a/arch/arm/plat-tcc/include/mach/uncompress.h b/arch/arm/plat-tcc/include/mach/uncompress.h deleted file mode 100644 index 7a3e33a27a3..00000000000 --- a/arch/arm/plat-tcc/include/mach/uncompress.h +++ /dev/null | |||
| @@ -1,34 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2009 Hans J. Koch <hjk@linutronix.de> | ||
| 3 | * | ||
| 4 | * This file is licensed under the terms of the GPL version 2. | ||
| 5 | */ | ||
| 6 | |||
| 7 | #include <linux/serial_reg.h> | ||
| 8 | #include <linux/types.h> | ||
| 9 | |||
| 10 | #include <mach/tcc8k-regs.h> | ||
| 11 | |||
| 12 | unsigned int system_rev; | ||
| 13 | |||
| 14 | #define ID_MASK 0x7fff | ||
| 15 | |||
| 16 | static void putc(int c) | ||
| 17 | { | ||
| 18 | u32 *uart_lsr = (u32 *)(UART_BASE_PHYS + (UART_LSR << 2)); | ||
| 19 | u32 *uart_tx = (u32 *)(UART_BASE_PHYS + (UART_TX << 2)); | ||
| 20 | |||
| 21 | while (!(*uart_lsr & UART_LSR_THRE)) | ||
| 22 | barrier(); | ||
| 23 | *uart_tx = c; | ||
| 24 | } | ||
| 25 | |||
| 26 | static inline void flush(void) | ||
| 27 | { | ||
| 28 | } | ||
| 29 | |||
| 30 | /* | ||
| 31 | * nothing to do | ||
| 32 | */ | ||
| 33 | #define arch_decomp_setup() | ||
| 34 | #define arch_decomp_wdog() | ||
diff --git a/arch/arm/plat-tcc/system.c b/arch/arm/plat-tcc/system.c deleted file mode 100644 index cc208fae3e7..00000000000 --- a/arch/arm/plat-tcc/system.c +++ /dev/null | |||
| @@ -1,25 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * System functions for Telechips TCCxxxx SoCs | ||
| 3 | * | ||
| 4 | * Copyright (C) Hans J. Koch <hjk@linutronix.de> | ||
| 5 | * | ||
| 6 | * Licensed under the terms of the GPL v2. | ||
| 7 | * | ||
| 8 | */ | ||
| 9 | |||
| 10 | #include <linux/io.h> | ||
| 11 | |||
| 12 | #include <mach/tcc8k-regs.h> | ||
| 13 | |||
| 14 | /* System reboot */ | ||
| 15 | void plat_tcc_reboot(void) | ||
| 16 | { | ||
| 17 | /* Make sure clocks are on */ | ||
| 18 | __raw_writel(0xffffffff, CKC_BASE + BCLKCTR0_OFFS); | ||
| 19 | |||
| 20 | /* Enable watchdog reset */ | ||
| 21 | __raw_writel(0x49, TIMER_BASE + TWDCFG_OFFS); | ||
| 22 | /* Wait for reset */ | ||
| 23 | while(1) | ||
| 24 | ; | ||
| 25 | } | ||
diff --git a/arch/s390/oprofile/init.c b/arch/s390/oprofile/init.c index 6efc18b5e60..bd58b72454c 100644 --- a/arch/s390/oprofile/init.c +++ b/arch/s390/oprofile/init.c | |||
| @@ -88,7 +88,7 @@ static ssize_t hwsampler_write(struct file *file, char const __user *buf, | |||
| 88 | return -EINVAL; | 88 | return -EINVAL; |
| 89 | 89 | ||
| 90 | retval = oprofilefs_ulong_from_user(&val, buf, count); | 90 | retval = oprofilefs_ulong_from_user(&val, buf, count); |
| 91 | if (retval) | 91 | if (retval <= 0) |
| 92 | return retval; | 92 | return retval; |
| 93 | 93 | ||
| 94 | if (oprofile_started) | 94 | if (oprofile_started) |
diff --git a/arch/sh/boards/board-sh7757lcr.c b/arch/sh/boards/board-sh7757lcr.c index ec8c84c14b1..895e337c79b 100644 --- a/arch/sh/boards/board-sh7757lcr.c +++ b/arch/sh/boards/board-sh7757lcr.c | |||
| @@ -50,9 +50,9 @@ static struct platform_device heartbeat_device = { | |||
| 50 | #define GBECONT 0xffc10100 | 50 | #define GBECONT 0xffc10100 |
| 51 | #define GBECONT_RMII1 BIT(17) | 51 | #define GBECONT_RMII1 BIT(17) |
| 52 | #define GBECONT_RMII0 BIT(16) | 52 | #define GBECONT_RMII0 BIT(16) |
| 53 | static void sh7757_eth_set_mdio_gate(unsigned long addr) | 53 | static void sh7757_eth_set_mdio_gate(void *addr) |
| 54 | { | 54 | { |
| 55 | if ((addr & 0x00000fff) < 0x0800) | 55 | if (((unsigned long)addr & 0x00000fff) < 0x0800) |
| 56 | writel(readl(GBECONT) | GBECONT_RMII0, GBECONT); | 56 | writel(readl(GBECONT) | GBECONT_RMII0, GBECONT); |
| 57 | else | 57 | else |
| 58 | writel(readl(GBECONT) | GBECONT_RMII1, GBECONT); | 58 | writel(readl(GBECONT) | GBECONT_RMII1, GBECONT); |
| @@ -116,9 +116,9 @@ static struct platform_device sh7757_eth1_device = { | |||
| 116 | }, | 116 | }, |
| 117 | }; | 117 | }; |
| 118 | 118 | ||
| 119 | static void sh7757_eth_giga_set_mdio_gate(unsigned long addr) | 119 | static void sh7757_eth_giga_set_mdio_gate(void *addr) |
| 120 | { | 120 | { |
| 121 | if ((addr & 0x00000fff) < 0x0800) { | 121 | if (((unsigned long)addr & 0x00000fff) < 0x0800) { |
| 122 | gpio_set_value(GPIO_PTT4, 1); | 122 | gpio_set_value(GPIO_PTT4, 1); |
| 123 | writel(readl(GBECONT) & ~GBECONT_RMII0, GBECONT); | 123 | writel(readl(GBECONT) & ~GBECONT_RMII0, GBECONT); |
| 124 | } else { | 124 | } else { |
| @@ -210,8 +210,12 @@ static struct resource sh_mmcif_resources[] = { | |||
| 210 | }; | 210 | }; |
| 211 | 211 | ||
| 212 | static struct sh_mmcif_dma sh7757lcr_mmcif_dma = { | 212 | static struct sh_mmcif_dma sh7757lcr_mmcif_dma = { |
| 213 | .chan_priv_tx = SHDMA_SLAVE_MMCIF_TX, | 213 | .chan_priv_tx = { |
| 214 | .chan_priv_rx = SHDMA_SLAVE_MMCIF_RX, | 214 | .slave_id = SHDMA_SLAVE_MMCIF_TX, |
| 215 | }, | ||
| 216 | .chan_priv_rx = { | ||
| 217 | .slave_id = SHDMA_SLAVE_MMCIF_RX, | ||
| 218 | } | ||
| 215 | }; | 219 | }; |
| 216 | 220 | ||
| 217 | static struct sh_mmcif_plat_data sh_mmcif_plat = { | 221 | static struct sh_mmcif_plat_data sh_mmcif_plat = { |
diff --git a/arch/sparc/kernel/ds.c b/arch/sparc/kernel/ds.c index 7429b47c3ac..381edcd5bc2 100644 --- a/arch/sparc/kernel/ds.c +++ b/arch/sparc/kernel/ds.c | |||
| @@ -1181,13 +1181,11 @@ static int __devinit ds_probe(struct vio_dev *vdev, | |||
| 1181 | 1181 | ||
| 1182 | dp->rcv_buf_len = 4096; | 1182 | dp->rcv_buf_len = 4096; |
| 1183 | 1183 | ||
| 1184 | dp->ds_states = kzalloc(sizeof(ds_states_template), | 1184 | dp->ds_states = kmemdup(ds_states_template, |
| 1185 | GFP_KERNEL); | 1185 | sizeof(ds_states_template), GFP_KERNEL); |
| 1186 | if (!dp->ds_states) | 1186 | if (!dp->ds_states) |
| 1187 | goto out_free_rcv_buf; | 1187 | goto out_free_rcv_buf; |
| 1188 | 1188 | ||
| 1189 | memcpy(dp->ds_states, ds_states_template, | ||
| 1190 | sizeof(ds_states_template)); | ||
| 1191 | dp->num_ds_states = ARRAY_SIZE(ds_states_template); | 1189 | dp->num_ds_states = ARRAY_SIZE(ds_states_template); |
| 1192 | 1190 | ||
| 1193 | for (i = 0; i < dp->num_ds_states; i++) | 1191 | for (i = 0; i < dp->num_ds_states; i++) |
diff --git a/arch/sparc/kernel/pci_sun4v.c b/arch/sparc/kernel/pci_sun4v.c index b272cda35a0..af5755d20fb 100644 --- a/arch/sparc/kernel/pci_sun4v.c +++ b/arch/sparc/kernel/pci_sun4v.c | |||
| @@ -849,10 +849,10 @@ static int pci_sun4v_msiq_build_irq(struct pci_pbm_info *pbm, | |||
| 849 | if (!irq) | 849 | if (!irq) |
| 850 | return -ENOMEM; | 850 | return -ENOMEM; |
| 851 | 851 | ||
| 852 | if (pci_sun4v_msiq_setstate(pbm->devhandle, msiqid, HV_MSIQSTATE_IDLE)) | ||
| 853 | return -EINVAL; | ||
| 854 | if (pci_sun4v_msiq_setvalid(pbm->devhandle, msiqid, HV_MSIQ_VALID)) | 852 | if (pci_sun4v_msiq_setvalid(pbm->devhandle, msiqid, HV_MSIQ_VALID)) |
| 855 | return -EINVAL; | 853 | return -EINVAL; |
| 854 | if (pci_sun4v_msiq_setstate(pbm->devhandle, msiqid, HV_MSIQSTATE_IDLE)) | ||
| 855 | return -EINVAL; | ||
| 856 | 856 | ||
| 857 | return irq; | 857 | return irq; |
| 858 | } | 858 | } |
diff --git a/arch/sparc/kernel/prom_common.c b/arch/sparc/kernel/prom_common.c index 46614807a57..741df916c12 100644 --- a/arch/sparc/kernel/prom_common.c +++ b/arch/sparc/kernel/prom_common.c | |||
| @@ -58,12 +58,10 @@ int of_set_property(struct device_node *dp, const char *name, void *val, int len | |||
| 58 | void *new_val; | 58 | void *new_val; |
| 59 | int err; | 59 | int err; |
| 60 | 60 | ||
| 61 | new_val = kmalloc(len, GFP_KERNEL); | 61 | new_val = kmemdup(val, len, GFP_KERNEL); |
| 62 | if (!new_val) | 62 | if (!new_val) |
| 63 | return -ENOMEM; | 63 | return -ENOMEM; |
| 64 | 64 | ||
| 65 | memcpy(new_val, val, len); | ||
| 66 | |||
| 67 | err = -ENODEV; | 65 | err = -ENODEV; |
| 68 | 66 | ||
| 69 | mutex_lock(&of_set_property_mutex); | 67 | mutex_lock(&of_set_property_mutex); |
diff --git a/arch/sparc/mm/btfixup.c b/arch/sparc/mm/btfixup.c index 5175ac2f482..8a7f81743c1 100644 --- a/arch/sparc/mm/btfixup.c +++ b/arch/sparc/mm/btfixup.c | |||
| @@ -302,8 +302,7 @@ void __init btfixup(void) | |||
| 302 | case 'i': /* INT */ | 302 | case 'i': /* INT */ |
| 303 | if ((insn & 0xc1c00000) == 0x01000000) /* %HI */ | 303 | if ((insn & 0xc1c00000) == 0x01000000) /* %HI */ |
| 304 | set_addr(addr, q[1], fmangled, (insn & 0xffc00000) | (p[1] >> 10)); | 304 | set_addr(addr, q[1], fmangled, (insn & 0xffc00000) | (p[1] >> 10)); |
| 305 | else if ((insn & 0x80002000) == 0x80002000 && | 305 | else if ((insn & 0x80002000) == 0x80002000) /* %LO */ |
| 306 | (insn & 0x01800000) != 0x01800000) /* %LO */ | ||
| 307 | set_addr(addr, q[1], fmangled, (insn & 0xffffe000) | (p[1] & 0x3ff)); | 306 | set_addr(addr, q[1], fmangled, (insn & 0xffffe000) | (p[1] & 0x3ff)); |
| 308 | else { | 307 | else { |
| 309 | prom_printf(insn_i, p, addr, insn); | 308 | prom_printf(insn_i, p, addr, insn); |
diff --git a/arch/x86/include/asm/e820.h b/arch/x86/include/asm/e820.h index c9547033e38..908b96957d8 100644 --- a/arch/x86/include/asm/e820.h +++ b/arch/x86/include/asm/e820.h | |||
| @@ -53,13 +53,6 @@ | |||
| 53 | */ | 53 | */ |
| 54 | #define E820_RESERVED_KERN 128 | 54 | #define E820_RESERVED_KERN 128 |
| 55 | 55 | ||
| 56 | /* | ||
| 57 | * Address ranges that need to be mapped by the kernel direct | ||
| 58 | * mapping. This is used to make sure regions such as | ||
| 59 | * EFI_RUNTIME_SERVICES_DATA are directly mapped. See setup_arch(). | ||
| 60 | */ | ||
| 61 | #define E820_RESERVED_EFI 129 | ||
| 62 | |||
| 63 | #ifndef __ASSEMBLY__ | 56 | #ifndef __ASSEMBLY__ |
| 64 | #include <linux/types.h> | 57 | #include <linux/types.h> |
| 65 | struct e820entry { | 58 | struct e820entry { |
| @@ -122,7 +115,6 @@ static inline void early_memtest(unsigned long start, unsigned long end) | |||
| 122 | } | 115 | } |
| 123 | #endif | 116 | #endif |
| 124 | 117 | ||
| 125 | extern unsigned long e820_end_pfn(unsigned long limit_pfn, unsigned type); | ||
| 126 | extern unsigned long e820_end_of_ram_pfn(void); | 118 | extern unsigned long e820_end_of_ram_pfn(void); |
| 127 | extern unsigned long e820_end_of_low_ram_pfn(void); | 119 | extern unsigned long e820_end_of_low_ram_pfn(void); |
| 128 | extern u64 early_reserve_e820(u64 startt, u64 sizet, u64 align); | 120 | extern u64 early_reserve_e820(u64 startt, u64 sizet, u64 align); |
diff --git a/arch/x86/include/asm/efi.h b/arch/x86/include/asm/efi.h index b8d8bfcd44a..7093e4a6a0b 100644 --- a/arch/x86/include/asm/efi.h +++ b/arch/x86/include/asm/efi.h | |||
| @@ -33,6 +33,8 @@ extern unsigned long asmlinkage efi_call_phys(void *, ...); | |||
| 33 | #define efi_call_virt6(f, a1, a2, a3, a4, a5, a6) \ | 33 | #define efi_call_virt6(f, a1, a2, a3, a4, a5, a6) \ |
| 34 | efi_call_virt(f, a1, a2, a3, a4, a5, a6) | 34 | efi_call_virt(f, a1, a2, a3, a4, a5, a6) |
| 35 | 35 | ||
| 36 | #define efi_ioremap(addr, size, type) ioremap_cache(addr, size) | ||
| 37 | |||
| 36 | #else /* !CONFIG_X86_32 */ | 38 | #else /* !CONFIG_X86_32 */ |
| 37 | 39 | ||
| 38 | extern u64 efi_call0(void *fp); | 40 | extern u64 efi_call0(void *fp); |
| @@ -82,6 +84,9 @@ extern u64 efi_call6(void *fp, u64 arg1, u64 arg2, u64 arg3, | |||
| 82 | efi_call6((void *)(efi.systab->runtime->f), (u64)(a1), (u64)(a2), \ | 84 | efi_call6((void *)(efi.systab->runtime->f), (u64)(a1), (u64)(a2), \ |
| 83 | (u64)(a3), (u64)(a4), (u64)(a5), (u64)(a6)) | 85 | (u64)(a3), (u64)(a4), (u64)(a5), (u64)(a6)) |
| 84 | 86 | ||
| 87 | extern void __iomem *efi_ioremap(unsigned long addr, unsigned long size, | ||
| 88 | u32 type); | ||
| 89 | |||
| 85 | #endif /* CONFIG_X86_32 */ | 90 | #endif /* CONFIG_X86_32 */ |
| 86 | 91 | ||
| 87 | extern int add_efi_memmap; | 92 | extern int add_efi_memmap; |
diff --git a/arch/x86/kernel/dumpstack_32.c b/arch/x86/kernel/dumpstack_32.c index 3b97a80ce32..c99f9ed013d 100644 --- a/arch/x86/kernel/dumpstack_32.c +++ b/arch/x86/kernel/dumpstack_32.c | |||
| @@ -116,16 +116,16 @@ void show_registers(struct pt_regs *regs) | |||
| 116 | for (i = 0; i < code_len; i++, ip++) { | 116 | for (i = 0; i < code_len; i++, ip++) { |
| 117 | if (ip < (u8 *)PAGE_OFFSET || | 117 | if (ip < (u8 *)PAGE_OFFSET || |
| 118 | probe_kernel_address(ip, c)) { | 118 | probe_kernel_address(ip, c)) { |
| 119 | printk(" Bad EIP value."); | 119 | printk(KERN_CONT " Bad EIP value."); |
| 120 | break; | 120 | break; |
| 121 | } | 121 | } |
| 122 | if (ip == (u8 *)regs->ip) | 122 | if (ip == (u8 *)regs->ip) |
| 123 | printk("<%02x> ", c); | 123 | printk(KERN_CONT "<%02x> ", c); |
| 124 | else | 124 | else |
| 125 | printk("%02x ", c); | 125 | printk(KERN_CONT "%02x ", c); |
| 126 | } | 126 | } |
| 127 | } | 127 | } |
| 128 | printk("\n"); | 128 | printk(KERN_CONT "\n"); |
| 129 | } | 129 | } |
| 130 | 130 | ||
| 131 | int is_valid_bugaddr(unsigned long ip) | 131 | int is_valid_bugaddr(unsigned long ip) |
diff --git a/arch/x86/kernel/dumpstack_64.c b/arch/x86/kernel/dumpstack_64.c index 19853ad8afc..6d728d9284b 100644 --- a/arch/x86/kernel/dumpstack_64.c +++ b/arch/x86/kernel/dumpstack_64.c | |||
| @@ -284,16 +284,16 @@ void show_registers(struct pt_regs *regs) | |||
| 284 | for (i = 0; i < code_len; i++, ip++) { | 284 | for (i = 0; i < code_len; i++, ip++) { |
| 285 | if (ip < (u8 *)PAGE_OFFSET || | 285 | if (ip < (u8 *)PAGE_OFFSET || |
| 286 | probe_kernel_address(ip, c)) { | 286 | probe_kernel_address(ip, c)) { |
| 287 | printk(" Bad RIP value."); | 287 | printk(KERN_CONT " Bad RIP value."); |
| 288 | break; | 288 | break; |
| 289 | } | 289 | } |
| 290 | if (ip == (u8 *)regs->ip) | 290 | if (ip == (u8 *)regs->ip) |
| 291 | printk("<%02x> ", c); | 291 | printk(KERN_CONT "<%02x> ", c); |
| 292 | else | 292 | else |
| 293 | printk("%02x ", c); | 293 | printk(KERN_CONT "%02x ", c); |
| 294 | } | 294 | } |
| 295 | } | 295 | } |
| 296 | printk("\n"); | 296 | printk(KERN_CONT "\n"); |
| 297 | } | 297 | } |
| 298 | 298 | ||
| 299 | int is_valid_bugaddr(unsigned long ip) | 299 | int is_valid_bugaddr(unsigned long ip) |
diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c index 65ffd110a81..303a0e48f07 100644 --- a/arch/x86/kernel/e820.c +++ b/arch/x86/kernel/e820.c | |||
| @@ -135,7 +135,6 @@ static void __init e820_print_type(u32 type) | |||
| 135 | printk(KERN_CONT "(usable)"); | 135 | printk(KERN_CONT "(usable)"); |
| 136 | break; | 136 | break; |
| 137 | case E820_RESERVED: | 137 | case E820_RESERVED: |
| 138 | case E820_RESERVED_EFI: | ||
| 139 | printk(KERN_CONT "(reserved)"); | 138 | printk(KERN_CONT "(reserved)"); |
| 140 | break; | 139 | break; |
| 141 | case E820_ACPI: | 140 | case E820_ACPI: |
| @@ -784,7 +783,7 @@ u64 __init early_reserve_e820(u64 startt, u64 sizet, u64 align) | |||
| 784 | /* | 783 | /* |
| 785 | * Find the highest page frame number we have available | 784 | * Find the highest page frame number we have available |
| 786 | */ | 785 | */ |
| 787 | unsigned long __init e820_end_pfn(unsigned long limit_pfn, unsigned type) | 786 | static unsigned long __init e820_end_pfn(unsigned long limit_pfn, unsigned type) |
| 788 | { | 787 | { |
| 789 | int i; | 788 | int i; |
| 790 | unsigned long last_pfn = 0; | 789 | unsigned long last_pfn = 0; |
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index 9a9e40fb091..cf0ef986cb6 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
| @@ -691,8 +691,6 @@ early_param("reservelow", parse_reservelow); | |||
| 691 | 691 | ||
| 692 | void __init setup_arch(char **cmdline_p) | 692 | void __init setup_arch(char **cmdline_p) |
| 693 | { | 693 | { |
| 694 | unsigned long end_pfn; | ||
| 695 | |||
| 696 | #ifdef CONFIG_X86_32 | 694 | #ifdef CONFIG_X86_32 |
| 697 | memcpy(&boot_cpu_data, &new_cpu_data, sizeof(new_cpu_data)); | 695 | memcpy(&boot_cpu_data, &new_cpu_data, sizeof(new_cpu_data)); |
| 698 | visws_early_detect(); | 696 | visws_early_detect(); |
| @@ -934,24 +932,7 @@ void __init setup_arch(char **cmdline_p) | |||
| 934 | init_gbpages(); | 932 | init_gbpages(); |
| 935 | 933 | ||
| 936 | /* max_pfn_mapped is updated here */ | 934 | /* max_pfn_mapped is updated here */ |
| 937 | end_pfn = max_low_pfn; | 935 | max_low_pfn_mapped = init_memory_mapping(0, max_low_pfn<<PAGE_SHIFT); |
| 938 | |||
| 939 | #ifdef CONFIG_X86_64 | ||
| 940 | /* | ||
| 941 | * There may be regions after the last E820_RAM region that we | ||
| 942 | * want to include in the kernel direct mapping, such as | ||
| 943 | * EFI_RUNTIME_SERVICES_DATA. | ||
| 944 | */ | ||
| 945 | if (efi_enabled) { | ||
| 946 | unsigned long efi_end; | ||
| 947 | |||
| 948 | efi_end = e820_end_pfn(MAXMEM>>PAGE_SHIFT, E820_RESERVED_EFI); | ||
| 949 | if (efi_end > max_low_pfn) | ||
| 950 | end_pfn = efi_end; | ||
| 951 | } | ||
| 952 | #endif | ||
| 953 | |||
| 954 | max_low_pfn_mapped = init_memory_mapping(0, end_pfn << PAGE_SHIFT); | ||
| 955 | max_pfn_mapped = max_low_pfn_mapped; | 936 | max_pfn_mapped = max_low_pfn_mapped; |
| 956 | 937 | ||
| 957 | #ifdef CONFIG_X86_64 | 938 | #ifdef CONFIG_X86_64 |
diff --git a/arch/x86/net/bpf_jit_comp.c b/arch/x86/net/bpf_jit_comp.c index bfab3fa10ed..7b65f752c5f 100644 --- a/arch/x86/net/bpf_jit_comp.c +++ b/arch/x86/net/bpf_jit_comp.c | |||
| @@ -568,8 +568,8 @@ cond_branch: f_offset = addrs[i + filter[i].jf] - addrs[i]; | |||
| 568 | break; | 568 | break; |
| 569 | } | 569 | } |
| 570 | if (filter[i].jt != 0) { | 570 | if (filter[i].jt != 0) { |
| 571 | if (filter[i].jf) | 571 | if (filter[i].jf && f_offset) |
| 572 | t_offset += is_near(f_offset) ? 2 : 6; | 572 | t_offset += is_near(f_offset) ? 2 : 5; |
| 573 | EMIT_COND_JMP(t_op, t_offset); | 573 | EMIT_COND_JMP(t_op, t_offset); |
| 574 | if (filter[i].jf) | 574 | if (filter[i].jf) |
| 575 | EMIT_JMP(f_offset); | 575 | EMIT_JMP(f_offset); |
diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c index c9718a16be1..37718f0f053 100644 --- a/arch/x86/platform/efi/efi.c +++ b/arch/x86/platform/efi/efi.c | |||
| @@ -323,13 +323,10 @@ static void __init do_add_efi_memmap(void) | |||
| 323 | case EFI_UNUSABLE_MEMORY: | 323 | case EFI_UNUSABLE_MEMORY: |
| 324 | e820_type = E820_UNUSABLE; | 324 | e820_type = E820_UNUSABLE; |
| 325 | break; | 325 | break; |
| 326 | case EFI_RUNTIME_SERVICES_DATA: | ||
| 327 | e820_type = E820_RESERVED_EFI; | ||
| 328 | break; | ||
| 329 | default: | 326 | default: |
| 330 | /* | 327 | /* |
| 331 | * EFI_RESERVED_TYPE EFI_RUNTIME_SERVICES_CODE | 328 | * EFI_RESERVED_TYPE EFI_RUNTIME_SERVICES_CODE |
| 332 | * EFI_MEMORY_MAPPED_IO | 329 | * EFI_RUNTIME_SERVICES_DATA EFI_MEMORY_MAPPED_IO |
| 333 | * EFI_MEMORY_MAPPED_IO_PORT_SPACE EFI_PAL_CODE | 330 | * EFI_MEMORY_MAPPED_IO_PORT_SPACE EFI_PAL_CODE |
| 334 | */ | 331 | */ |
| 335 | e820_type = E820_RESERVED; | 332 | e820_type = E820_RESERVED; |
| @@ -674,21 +671,10 @@ void __init efi_enter_virtual_mode(void) | |||
| 674 | end_pfn = PFN_UP(end); | 671 | end_pfn = PFN_UP(end); |
| 675 | if (end_pfn <= max_low_pfn_mapped | 672 | if (end_pfn <= max_low_pfn_mapped |
| 676 | || (end_pfn > (1UL << (32 - PAGE_SHIFT)) | 673 | || (end_pfn > (1UL << (32 - PAGE_SHIFT)) |
| 677 | && end_pfn <= max_pfn_mapped)) { | 674 | && end_pfn <= max_pfn_mapped)) |
| 678 | va = __va(md->phys_addr); | 675 | va = __va(md->phys_addr); |
| 679 | 676 | else | |
| 680 | if (!(md->attribute & EFI_MEMORY_WB)) { | 677 | va = efi_ioremap(md->phys_addr, size, md->type); |
| 681 | addr = (u64) (unsigned long)va; | ||
| 682 | npages = md->num_pages; | ||
| 683 | memrange_efi_to_native(&addr, &npages); | ||
| 684 | set_memory_uc(addr, npages); | ||
| 685 | } | ||
| 686 | } else { | ||
| 687 | if (!(md->attribute & EFI_MEMORY_WB)) | ||
| 688 | va = ioremap_nocache(md->phys_addr, size); | ||
| 689 | else | ||
| 690 | va = ioremap_cache(md->phys_addr, size); | ||
| 691 | } | ||
| 692 | 678 | ||
| 693 | md->virt_addr = (u64) (unsigned long) va; | 679 | md->virt_addr = (u64) (unsigned long) va; |
| 694 | 680 | ||
| @@ -698,6 +684,13 @@ void __init efi_enter_virtual_mode(void) | |||
| 698 | continue; | 684 | continue; |
| 699 | } | 685 | } |
| 700 | 686 | ||
| 687 | if (!(md->attribute & EFI_MEMORY_WB)) { | ||
| 688 | addr = md->virt_addr; | ||
| 689 | npages = md->num_pages; | ||
| 690 | memrange_efi_to_native(&addr, &npages); | ||
| 691 | set_memory_uc(addr, npages); | ||
| 692 | } | ||
| 693 | |||
| 701 | systab = (u64) (unsigned long) efi_phys.systab; | 694 | systab = (u64) (unsigned long) efi_phys.systab; |
| 702 | if (md->phys_addr <= systab && systab < end) { | 695 | if (md->phys_addr <= systab && systab < end) { |
| 703 | systab += md->virt_addr - md->phys_addr; | 696 | systab += md->virt_addr - md->phys_addr; |
diff --git a/arch/x86/platform/efi/efi_32.c b/arch/x86/platform/efi/efi_32.c index e36bf714cb7..40e446941dd 100644 --- a/arch/x86/platform/efi/efi_32.c +++ b/arch/x86/platform/efi/efi_32.c | |||
| @@ -39,43 +39,14 @@ | |||
| 39 | */ | 39 | */ |
| 40 | 40 | ||
| 41 | static unsigned long efi_rt_eflags; | 41 | static unsigned long efi_rt_eflags; |
| 42 | static pgd_t efi_bak_pg_dir_pointer[2]; | ||
| 43 | 42 | ||
| 44 | void efi_call_phys_prelog(void) | 43 | void efi_call_phys_prelog(void) |
| 45 | { | 44 | { |
| 46 | unsigned long cr4; | ||
| 47 | unsigned long temp; | ||
| 48 | struct desc_ptr gdt_descr; | 45 | struct desc_ptr gdt_descr; |
| 49 | 46 | ||
| 50 | local_irq_save(efi_rt_eflags); | 47 | local_irq_save(efi_rt_eflags); |
| 51 | 48 | ||
| 52 | /* | 49 | load_cr3(initial_page_table); |
| 53 | * If I don't have PAE, I should just duplicate two entries in page | ||
| 54 | * directory. If I have PAE, I just need to duplicate one entry in | ||
| 55 | * page directory. | ||
| 56 | */ | ||
| 57 | cr4 = read_cr4_safe(); | ||
| 58 | |||
| 59 | if (cr4 & X86_CR4_PAE) { | ||
| 60 | efi_bak_pg_dir_pointer[0].pgd = | ||
| 61 | swapper_pg_dir[pgd_index(0)].pgd; | ||
| 62 | swapper_pg_dir[0].pgd = | ||
| 63 | swapper_pg_dir[pgd_index(PAGE_OFFSET)].pgd; | ||
| 64 | } else { | ||
| 65 | efi_bak_pg_dir_pointer[0].pgd = | ||
| 66 | swapper_pg_dir[pgd_index(0)].pgd; | ||
| 67 | efi_bak_pg_dir_pointer[1].pgd = | ||
| 68 | swapper_pg_dir[pgd_index(0x400000)].pgd; | ||
| 69 | swapper_pg_dir[pgd_index(0)].pgd = | ||
| 70 | swapper_pg_dir[pgd_index(PAGE_OFFSET)].pgd; | ||
| 71 | temp = PAGE_OFFSET + 0x400000; | ||
| 72 | swapper_pg_dir[pgd_index(0x400000)].pgd = | ||
| 73 | swapper_pg_dir[pgd_index(temp)].pgd; | ||
| 74 | } | ||
| 75 | |||
| 76 | /* | ||
| 77 | * After the lock is released, the original page table is restored. | ||
| 78 | */ | ||
| 79 | __flush_tlb_all(); | 50 | __flush_tlb_all(); |
| 80 | 51 | ||
| 81 | gdt_descr.address = __pa(get_cpu_gdt_table(0)); | 52 | gdt_descr.address = __pa(get_cpu_gdt_table(0)); |
| @@ -85,28 +56,13 @@ void efi_call_phys_prelog(void) | |||
| 85 | 56 | ||
| 86 | void efi_call_phys_epilog(void) | 57 | void efi_call_phys_epilog(void) |
| 87 | { | 58 | { |
| 88 | unsigned long cr4; | ||
| 89 | struct desc_ptr gdt_descr; | 59 | struct desc_ptr gdt_descr; |
| 90 | 60 | ||
| 91 | gdt_descr.address = (unsigned long)get_cpu_gdt_table(0); | 61 | gdt_descr.address = (unsigned long)get_cpu_gdt_table(0); |
| 92 | gdt_descr.size = GDT_SIZE - 1; | 62 | gdt_descr.size = GDT_SIZE - 1; |
| 93 | load_gdt(&gdt_descr); | 63 | load_gdt(&gdt_descr); |
| 94 | 64 | ||
| 95 | cr4 = read_cr4_safe(); | 65 | load_cr3(swapper_pg_dir); |
| 96 | |||
| 97 | if (cr4 & X86_CR4_PAE) { | ||
| 98 | swapper_pg_dir[pgd_index(0)].pgd = | ||
| 99 | efi_bak_pg_dir_pointer[0].pgd; | ||
| 100 | } else { | ||
| 101 | swapper_pg_dir[pgd_index(0)].pgd = | ||
| 102 | efi_bak_pg_dir_pointer[0].pgd; | ||
| 103 | swapper_pg_dir[pgd_index(0x400000)].pgd = | ||
| 104 | efi_bak_pg_dir_pointer[1].pgd; | ||
| 105 | } | ||
| 106 | |||
| 107 | /* | ||
| 108 | * After the lock is released, the original page table is restored. | ||
| 109 | */ | ||
| 110 | __flush_tlb_all(); | 66 | __flush_tlb_all(); |
| 111 | 67 | ||
| 112 | local_irq_restore(efi_rt_eflags); | 68 | local_irq_restore(efi_rt_eflags); |
diff --git a/arch/x86/platform/efi/efi_64.c b/arch/x86/platform/efi/efi_64.c index 312250c6b2d..ac3aa54e265 100644 --- a/arch/x86/platform/efi/efi_64.c +++ b/arch/x86/platform/efi/efi_64.c | |||
| @@ -80,3 +80,20 @@ void __init efi_call_phys_epilog(void) | |||
| 80 | local_irq_restore(efi_flags); | 80 | local_irq_restore(efi_flags); |
| 81 | early_code_mapping_set_exec(0); | 81 | early_code_mapping_set_exec(0); |
| 82 | } | 82 | } |
| 83 | |||
| 84 | void __iomem *__init efi_ioremap(unsigned long phys_addr, unsigned long size, | ||
| 85 | u32 type) | ||
| 86 | { | ||
| 87 | unsigned long last_map_pfn; | ||
| 88 | |||
| 89 | if (type == EFI_MEMORY_MAPPED_IO) | ||
| 90 | return ioremap(phys_addr, size); | ||
| 91 | |||
| 92 | last_map_pfn = init_memory_mapping(phys_addr, phys_addr + size); | ||
| 93 | if ((last_map_pfn << PAGE_SHIFT) < phys_addr + size) { | ||
| 94 | unsigned long top = last_map_pfn << PAGE_SHIFT; | ||
| 95 | efi_ioremap(top, size - (top - phys_addr), type); | ||
| 96 | } | ||
| 97 | |||
| 98 | return (void __iomem *)__va(phys_addr); | ||
| 99 | } | ||
diff --git a/arch/x86/xen/setup.c b/arch/x86/xen/setup.c index 1093f80c162..b2c7179fa26 100644 --- a/arch/x86/xen/setup.c +++ b/arch/x86/xen/setup.c | |||
| @@ -173,9 +173,21 @@ static unsigned long __init xen_get_max_pages(void) | |||
| 173 | domid_t domid = DOMID_SELF; | 173 | domid_t domid = DOMID_SELF; |
| 174 | int ret; | 174 | int ret; |
| 175 | 175 | ||
| 176 | ret = HYPERVISOR_memory_op(XENMEM_maximum_reservation, &domid); | 176 | /* |
| 177 | if (ret > 0) | 177 | * For the initial domain we use the maximum reservation as |
| 178 | max_pages = ret; | 178 | * the maximum page. |
| 179 | * | ||
| 180 | * For guest domains the current maximum reservation reflects | ||
| 181 | * the current maximum rather than the static maximum. In this | ||
| 182 | * case the e820 map provided to us will cover the static | ||
| 183 | * maximum region. | ||
| 184 | */ | ||
| 185 | if (xen_initial_domain()) { | ||
| 186 | ret = HYPERVISOR_memory_op(XENMEM_maximum_reservation, &domid); | ||
| 187 | if (ret > 0) | ||
| 188 | max_pages = ret; | ||
| 189 | } | ||
| 190 | |||
| 179 | return min(max_pages, MAX_DOMAIN_PAGES); | 191 | return min(max_pages, MAX_DOMAIN_PAGES); |
| 180 | } | 192 | } |
| 181 | 193 | ||
diff --git a/block/blk-core.c b/block/blk-core.c index ea70e6c80cd..15de223c7f9 100644 --- a/block/blk-core.c +++ b/block/blk-core.c | |||
| @@ -366,7 +366,14 @@ void blk_drain_queue(struct request_queue *q, bool drain_all) | |||
| 366 | if (drain_all) | 366 | if (drain_all) |
| 367 | blk_throtl_drain(q); | 367 | blk_throtl_drain(q); |
| 368 | 368 | ||
| 369 | __blk_run_queue(q); | 369 | /* |
| 370 | * This function might be called on a queue which failed | ||
| 371 | * driver init after queue creation. Some drivers | ||
| 372 | * (e.g. fd) get unhappy in such cases. Kick queue iff | ||
| 373 | * dispatch queue has something on it. | ||
| 374 | */ | ||
| 375 | if (!list_empty(&q->queue_head)) | ||
| 376 | __blk_run_queue(q); | ||
| 370 | 377 | ||
| 371 | if (drain_all) | 378 | if (drain_all) |
| 372 | nr_rqs = q->rq.count[0] + q->rq.count[1]; | 379 | nr_rqs = q->rq.count[0] + q->rq.count[1]; |
| @@ -467,6 +474,7 @@ struct request_queue *blk_alloc_queue_node(gfp_t gfp_mask, int node_id) | |||
| 467 | q->backing_dev_info.state = 0; | 474 | q->backing_dev_info.state = 0; |
| 468 | q->backing_dev_info.capabilities = BDI_CAP_MAP_COPY; | 475 | q->backing_dev_info.capabilities = BDI_CAP_MAP_COPY; |
| 469 | q->backing_dev_info.name = "block"; | 476 | q->backing_dev_info.name = "block"; |
| 477 | q->node = node_id; | ||
| 470 | 478 | ||
| 471 | err = bdi_init(&q->backing_dev_info); | 479 | err = bdi_init(&q->backing_dev_info); |
| 472 | if (err) { | 480 | if (err) { |
| @@ -551,7 +559,7 @@ blk_init_queue_node(request_fn_proc *rfn, spinlock_t *lock, int node_id) | |||
| 551 | if (!uninit_q) | 559 | if (!uninit_q) |
| 552 | return NULL; | 560 | return NULL; |
| 553 | 561 | ||
| 554 | q = blk_init_allocated_queue_node(uninit_q, rfn, lock, node_id); | 562 | q = blk_init_allocated_queue(uninit_q, rfn, lock); |
| 555 | if (!q) | 563 | if (!q) |
| 556 | blk_cleanup_queue(uninit_q); | 564 | blk_cleanup_queue(uninit_q); |
| 557 | 565 | ||
| @@ -563,18 +571,9 @@ struct request_queue * | |||
| 563 | blk_init_allocated_queue(struct request_queue *q, request_fn_proc *rfn, | 571 | blk_init_allocated_queue(struct request_queue *q, request_fn_proc *rfn, |
| 564 | spinlock_t *lock) | 572 | spinlock_t *lock) |
| 565 | { | 573 | { |
| 566 | return blk_init_allocated_queue_node(q, rfn, lock, -1); | ||
| 567 | } | ||
| 568 | EXPORT_SYMBOL(blk_init_allocated_queue); | ||
| 569 | |||
| 570 | struct request_queue * | ||
| 571 | blk_init_allocated_queue_node(struct request_queue *q, request_fn_proc *rfn, | ||
| 572 | spinlock_t *lock, int node_id) | ||
| 573 | { | ||
| 574 | if (!q) | 574 | if (!q) |
| 575 | return NULL; | 575 | return NULL; |
| 576 | 576 | ||
| 577 | q->node = node_id; | ||
| 578 | if (blk_init_free_list(q)) | 577 | if (blk_init_free_list(q)) |
| 579 | return NULL; | 578 | return NULL; |
| 580 | 579 | ||
| @@ -604,7 +603,7 @@ blk_init_allocated_queue_node(struct request_queue *q, request_fn_proc *rfn, | |||
| 604 | 603 | ||
| 605 | return NULL; | 604 | return NULL; |
| 606 | } | 605 | } |
| 607 | EXPORT_SYMBOL(blk_init_allocated_queue_node); | 606 | EXPORT_SYMBOL(blk_init_allocated_queue); |
| 608 | 607 | ||
| 609 | int blk_get_queue(struct request_queue *q) | 608 | int blk_get_queue(struct request_queue *q) |
| 610 | { | 609 | { |
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index 16ace89613b..4c12869fcf7 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c | |||
| @@ -3184,7 +3184,7 @@ static int cfq_cic_link(struct cfq_data *cfqd, struct io_context *ioc, | |||
| 3184 | } | 3184 | } |
| 3185 | } | 3185 | } |
| 3186 | 3186 | ||
| 3187 | if (ret) | 3187 | if (ret && ret != -EEXIST) |
| 3188 | printk(KERN_ERR "cfq: cic link failed!\n"); | 3188 | printk(KERN_ERR "cfq: cic link failed!\n"); |
| 3189 | 3189 | ||
| 3190 | return ret; | 3190 | return ret; |
| @@ -3200,6 +3200,7 @@ cfq_get_io_context(struct cfq_data *cfqd, gfp_t gfp_mask) | |||
| 3200 | { | 3200 | { |
| 3201 | struct io_context *ioc = NULL; | 3201 | struct io_context *ioc = NULL; |
| 3202 | struct cfq_io_context *cic; | 3202 | struct cfq_io_context *cic; |
| 3203 | int ret; | ||
| 3203 | 3204 | ||
| 3204 | might_sleep_if(gfp_mask & __GFP_WAIT); | 3205 | might_sleep_if(gfp_mask & __GFP_WAIT); |
| 3205 | 3206 | ||
| @@ -3207,6 +3208,7 @@ cfq_get_io_context(struct cfq_data *cfqd, gfp_t gfp_mask) | |||
| 3207 | if (!ioc) | 3208 | if (!ioc) |
| 3208 | return NULL; | 3209 | return NULL; |
| 3209 | 3210 | ||
| 3211 | retry: | ||
| 3210 | cic = cfq_cic_lookup(cfqd, ioc); | 3212 | cic = cfq_cic_lookup(cfqd, ioc); |
| 3211 | if (cic) | 3213 | if (cic) |
| 3212 | goto out; | 3214 | goto out; |
| @@ -3215,7 +3217,12 @@ cfq_get_io_context(struct cfq_data *cfqd, gfp_t gfp_mask) | |||
| 3215 | if (cic == NULL) | 3217 | if (cic == NULL) |
| 3216 | goto err; | 3218 | goto err; |
| 3217 | 3219 | ||
| 3218 | if (cfq_cic_link(cfqd, ioc, cic, gfp_mask)) | 3220 | ret = cfq_cic_link(cfqd, ioc, cic, gfp_mask); |
| 3221 | if (ret == -EEXIST) { | ||
| 3222 | /* someone has linked cic to ioc already */ | ||
| 3223 | cfq_cic_free(cic); | ||
| 3224 | goto retry; | ||
| 3225 | } else if (ret) | ||
| 3219 | goto err_free; | 3226 | goto err_free; |
| 3220 | 3227 | ||
| 3221 | out: | 3228 | out: |
| @@ -4036,6 +4043,11 @@ static void *cfq_init_queue(struct request_queue *q) | |||
| 4036 | 4043 | ||
| 4037 | if (blkio_alloc_blkg_stats(&cfqg->blkg)) { | 4044 | if (blkio_alloc_blkg_stats(&cfqg->blkg)) { |
| 4038 | kfree(cfqg); | 4045 | kfree(cfqg); |
| 4046 | |||
| 4047 | spin_lock(&cic_index_lock); | ||
| 4048 | ida_remove(&cic_index_ida, cfqd->cic_index); | ||
| 4049 | spin_unlock(&cic_index_lock); | ||
| 4050 | |||
| 4039 | kfree(cfqd); | 4051 | kfree(cfqd); |
| 4040 | return NULL; | 4052 | return NULL; |
| 4041 | } | 4053 | } |
diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig index 6bdedd7cca2..cf047c406d9 100644 --- a/drivers/ata/Kconfig +++ b/drivers/ata/Kconfig | |||
| @@ -820,7 +820,7 @@ config PATA_PLATFORM | |||
| 820 | 820 | ||
| 821 | config PATA_OF_PLATFORM | 821 | config PATA_OF_PLATFORM |
| 822 | tristate "OpenFirmware platform device PATA support" | 822 | tristate "OpenFirmware platform device PATA support" |
| 823 | depends on PATA_PLATFORM && OF | 823 | depends on PATA_PLATFORM && OF && OF_IRQ |
| 824 | help | 824 | help |
| 825 | This option enables support for generic directly connected ATA | 825 | This option enables support for generic directly connected ATA |
| 826 | devices commonly found on embedded systems with OpenFirmware | 826 | devices commonly found on embedded systems with OpenFirmware |
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index 8004ac30a7a..587cce57ada 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c | |||
| @@ -2601,6 +2601,8 @@ static int fill_cmd(ctlr_info_t *h, CommandList_struct *c, __u8 cmd, void *buff, | |||
| 2601 | c->Request.Timeout = 0; | 2601 | c->Request.Timeout = 0; |
| 2602 | c->Request.CDB[0] = BMIC_WRITE; | 2602 | c->Request.CDB[0] = BMIC_WRITE; |
| 2603 | c->Request.CDB[6] = BMIC_CACHE_FLUSH; | 2603 | c->Request.CDB[6] = BMIC_CACHE_FLUSH; |
| 2604 | c->Request.CDB[7] = (size >> 8) & 0xFF; | ||
| 2605 | c->Request.CDB[8] = size & 0xFF; | ||
| 2604 | break; | 2606 | break; |
| 2605 | case TEST_UNIT_READY: | 2607 | case TEST_UNIT_READY: |
| 2606 | c->Request.CDBLen = 6; | 2608 | c->Request.CDBLen = 6; |
| @@ -4880,7 +4882,7 @@ static int cciss_request_irq(ctlr_info_t *h, | |||
| 4880 | { | 4882 | { |
| 4881 | if (h->msix_vector || h->msi_vector) { | 4883 | if (h->msix_vector || h->msi_vector) { |
| 4882 | if (!request_irq(h->intr[h->intr_mode], msixhandler, | 4884 | if (!request_irq(h->intr[h->intr_mode], msixhandler, |
| 4883 | IRQF_DISABLED, h->devname, h)) | 4885 | 0, h->devname, h)) |
| 4884 | return 0; | 4886 | return 0; |
| 4885 | dev_err(&h->pdev->dev, "Unable to get msi irq %d" | 4887 | dev_err(&h->pdev->dev, "Unable to get msi irq %d" |
| 4886 | " for %s\n", h->intr[h->intr_mode], | 4888 | " for %s\n", h->intr[h->intr_mode], |
| @@ -4889,7 +4891,7 @@ static int cciss_request_irq(ctlr_info_t *h, | |||
| 4889 | } | 4891 | } |
| 4890 | 4892 | ||
| 4891 | if (!request_irq(h->intr[h->intr_mode], intxhandler, | 4893 | if (!request_irq(h->intr[h->intr_mode], intxhandler, |
| 4892 | IRQF_DISABLED, h->devname, h)) | 4894 | IRQF_SHARED, h->devname, h)) |
| 4893 | return 0; | 4895 | return 0; |
| 4894 | dev_err(&h->pdev->dev, "Unable to get irq %d for %s\n", | 4896 | dev_err(&h->pdev->dev, "Unable to get irq %d for %s\n", |
| 4895 | h->intr[h->intr_mode], h->devname); | 4897 | h->intr[h->intr_mode], h->devname); |
diff --git a/drivers/block/loop.c b/drivers/block/loop.c index 68b205a9338..1e888c9e85b 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c | |||
| @@ -422,7 +422,7 @@ static int do_bio_filebacked(struct loop_device *lo, struct bio *bio) | |||
| 422 | 422 | ||
| 423 | /* | 423 | /* |
| 424 | * We use punch hole to reclaim the free space used by the | 424 | * We use punch hole to reclaim the free space used by the |
| 425 | * image a.k.a. discard. However we do support discard if | 425 | * image a.k.a. discard. However we do not support discard if |
| 426 | * encryption is enabled, because it may give an attacker | 426 | * encryption is enabled, because it may give an attacker |
| 427 | * useful information. | 427 | * useful information. |
| 428 | */ | 428 | */ |
| @@ -797,7 +797,7 @@ static void loop_config_discard(struct loop_device *lo) | |||
| 797 | } | 797 | } |
| 798 | 798 | ||
| 799 | q->limits.discard_granularity = inode->i_sb->s_blocksize; | 799 | q->limits.discard_granularity = inode->i_sb->s_blocksize; |
| 800 | q->limits.discard_alignment = inode->i_sb->s_blocksize; | 800 | q->limits.discard_alignment = 0; |
| 801 | q->limits.max_discard_sectors = UINT_MAX >> 9; | 801 | q->limits.max_discard_sectors = UINT_MAX >> 9; |
| 802 | q->limits.discard_zeroes_data = 1; | 802 | q->limits.discard_zeroes_data = 1; |
| 803 | queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, q); | 803 | queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, q); |
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 65cc424359b..148ab944378 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c | |||
| @@ -183,10 +183,6 @@ static LIST_HEAD(rbd_client_list); /* clients */ | |||
| 183 | 183 | ||
| 184 | static int __rbd_init_snaps_header(struct rbd_device *rbd_dev); | 184 | static int __rbd_init_snaps_header(struct rbd_device *rbd_dev); |
| 185 | static void rbd_dev_release(struct device *dev); | 185 | static void rbd_dev_release(struct device *dev); |
| 186 | static ssize_t rbd_snap_rollback(struct device *dev, | ||
| 187 | struct device_attribute *attr, | ||
| 188 | const char *buf, | ||
| 189 | size_t size); | ||
| 190 | static ssize_t rbd_snap_add(struct device *dev, | 186 | static ssize_t rbd_snap_add(struct device *dev, |
| 191 | struct device_attribute *attr, | 187 | struct device_attribute *attr, |
| 192 | const char *buf, | 188 | const char *buf, |
| @@ -461,6 +457,10 @@ static int rbd_header_from_disk(struct rbd_image_header *header, | |||
| 461 | u32 snap_count = le32_to_cpu(ondisk->snap_count); | 457 | u32 snap_count = le32_to_cpu(ondisk->snap_count); |
| 462 | int ret = -ENOMEM; | 458 | int ret = -ENOMEM; |
| 463 | 459 | ||
| 460 | if (memcmp(ondisk, RBD_HEADER_TEXT, sizeof(RBD_HEADER_TEXT))) { | ||
| 461 | return -ENXIO; | ||
| 462 | } | ||
| 463 | |||
| 464 | init_rwsem(&header->snap_rwsem); | 464 | init_rwsem(&header->snap_rwsem); |
| 465 | header->snap_names_len = le64_to_cpu(ondisk->snap_names_len); | 465 | header->snap_names_len = le64_to_cpu(ondisk->snap_names_len); |
| 466 | header->snapc = kmalloc(sizeof(struct ceph_snap_context) + | 466 | header->snapc = kmalloc(sizeof(struct ceph_snap_context) + |
| @@ -1356,32 +1356,6 @@ fail: | |||
| 1356 | } | 1356 | } |
| 1357 | 1357 | ||
| 1358 | /* | 1358 | /* |
| 1359 | * Request sync osd rollback | ||
| 1360 | */ | ||
| 1361 | static int rbd_req_sync_rollback_obj(struct rbd_device *dev, | ||
| 1362 | u64 snapid, | ||
| 1363 | const char *obj) | ||
| 1364 | { | ||
| 1365 | struct ceph_osd_req_op *ops; | ||
| 1366 | int ret = rbd_create_rw_ops(&ops, 1, CEPH_OSD_OP_ROLLBACK, 0); | ||
| 1367 | if (ret < 0) | ||
| 1368 | return ret; | ||
| 1369 | |||
| 1370 | ops[0].snap.snapid = snapid; | ||
| 1371 | |||
| 1372 | ret = rbd_req_sync_op(dev, NULL, | ||
| 1373 | CEPH_NOSNAP, | ||
| 1374 | 0, | ||
| 1375 | CEPH_OSD_FLAG_WRITE | CEPH_OSD_FLAG_ONDISK, | ||
| 1376 | ops, | ||
| 1377 | 1, obj, 0, 0, NULL, NULL, NULL); | ||
| 1378 | |||
| 1379 | rbd_destroy_ops(ops); | ||
| 1380 | |||
| 1381 | return ret; | ||
| 1382 | } | ||
| 1383 | |||
| 1384 | /* | ||
| 1385 | * Request sync osd read | 1359 | * Request sync osd read |
| 1386 | */ | 1360 | */ |
| 1387 | static int rbd_req_sync_exec(struct rbd_device *dev, | 1361 | static int rbd_req_sync_exec(struct rbd_device *dev, |
| @@ -1610,8 +1584,13 @@ static int rbd_read_header(struct rbd_device *rbd_dev, | |||
| 1610 | goto out_dh; | 1584 | goto out_dh; |
| 1611 | 1585 | ||
| 1612 | rc = rbd_header_from_disk(header, dh, snap_count, GFP_KERNEL); | 1586 | rc = rbd_header_from_disk(header, dh, snap_count, GFP_KERNEL); |
| 1613 | if (rc < 0) | 1587 | if (rc < 0) { |
| 1588 | if (rc == -ENXIO) { | ||
| 1589 | pr_warning("unrecognized header format" | ||
| 1590 | " for image %s", rbd_dev->obj); | ||
| 1591 | } | ||
| 1614 | goto out_dh; | 1592 | goto out_dh; |
| 1593 | } | ||
| 1615 | 1594 | ||
| 1616 | if (snap_count != header->total_snaps) { | 1595 | if (snap_count != header->total_snaps) { |
| 1617 | snap_count = header->total_snaps; | 1596 | snap_count = header->total_snaps; |
| @@ -1882,7 +1861,6 @@ static DEVICE_ATTR(name, S_IRUGO, rbd_name_show, NULL); | |||
| 1882 | static DEVICE_ATTR(refresh, S_IWUSR, NULL, rbd_image_refresh); | 1861 | static DEVICE_ATTR(refresh, S_IWUSR, NULL, rbd_image_refresh); |
| 1883 | static DEVICE_ATTR(current_snap, S_IRUGO, rbd_snap_show, NULL); | 1862 | static DEVICE_ATTR(current_snap, S_IRUGO, rbd_snap_show, NULL); |
| 1884 | static DEVICE_ATTR(create_snap, S_IWUSR, NULL, rbd_snap_add); | 1863 | static DEVICE_ATTR(create_snap, S_IWUSR, NULL, rbd_snap_add); |
| 1885 | static DEVICE_ATTR(rollback_snap, S_IWUSR, NULL, rbd_snap_rollback); | ||
| 1886 | 1864 | ||
| 1887 | static struct attribute *rbd_attrs[] = { | 1865 | static struct attribute *rbd_attrs[] = { |
| 1888 | &dev_attr_size.attr, | 1866 | &dev_attr_size.attr, |
| @@ -1893,7 +1871,6 @@ static struct attribute *rbd_attrs[] = { | |||
| 1893 | &dev_attr_current_snap.attr, | 1871 | &dev_attr_current_snap.attr, |
| 1894 | &dev_attr_refresh.attr, | 1872 | &dev_attr_refresh.attr, |
| 1895 | &dev_attr_create_snap.attr, | 1873 | &dev_attr_create_snap.attr, |
| 1896 | &dev_attr_rollback_snap.attr, | ||
| 1897 | NULL | 1874 | NULL |
| 1898 | }; | 1875 | }; |
| 1899 | 1876 | ||
| @@ -2424,64 +2401,6 @@ err_unlock: | |||
| 2424 | return ret; | 2401 | return ret; |
| 2425 | } | 2402 | } |
| 2426 | 2403 | ||
| 2427 | static ssize_t rbd_snap_rollback(struct device *dev, | ||
| 2428 | struct device_attribute *attr, | ||
| 2429 | const char *buf, | ||
| 2430 | size_t count) | ||
| 2431 | { | ||
| 2432 | struct rbd_device *rbd_dev = dev_to_rbd(dev); | ||
| 2433 | int ret; | ||
| 2434 | u64 snapid; | ||
| 2435 | u64 cur_ofs; | ||
| 2436 | char *seg_name = NULL; | ||
| 2437 | char *snap_name = kmalloc(count + 1, GFP_KERNEL); | ||
| 2438 | ret = -ENOMEM; | ||
| 2439 | if (!snap_name) | ||
| 2440 | return ret; | ||
| 2441 | |||
| 2442 | /* parse snaps add command */ | ||
| 2443 | snprintf(snap_name, count, "%s", buf); | ||
| 2444 | seg_name = kmalloc(RBD_MAX_SEG_NAME_LEN + 1, GFP_NOIO); | ||
| 2445 | if (!seg_name) | ||
| 2446 | goto done; | ||
| 2447 | |||
| 2448 | mutex_lock_nested(&ctl_mutex, SINGLE_DEPTH_NESTING); | ||
| 2449 | |||
| 2450 | ret = snap_by_name(&rbd_dev->header, snap_name, &snapid, NULL); | ||
| 2451 | if (ret < 0) | ||
| 2452 | goto done_unlock; | ||
| 2453 | |||
| 2454 | dout("snapid=%lld\n", snapid); | ||
| 2455 | |||
| 2456 | cur_ofs = 0; | ||
| 2457 | while (cur_ofs < rbd_dev->header.image_size) { | ||
| 2458 | cur_ofs += rbd_get_segment(&rbd_dev->header, | ||
| 2459 | rbd_dev->obj, | ||
| 2460 | cur_ofs, (u64)-1, | ||
| 2461 | seg_name, NULL); | ||
| 2462 | dout("seg_name=%s\n", seg_name); | ||
| 2463 | |||
| 2464 | ret = rbd_req_sync_rollback_obj(rbd_dev, snapid, seg_name); | ||
| 2465 | if (ret < 0) | ||
| 2466 | pr_warning("could not roll back obj %s err=%d\n", | ||
| 2467 | seg_name, ret); | ||
| 2468 | } | ||
| 2469 | |||
| 2470 | ret = __rbd_update_snaps(rbd_dev); | ||
| 2471 | if (ret < 0) | ||
| 2472 | goto done_unlock; | ||
| 2473 | |||
| 2474 | ret = count; | ||
| 2475 | |||
| 2476 | done_unlock: | ||
| 2477 | mutex_unlock(&ctl_mutex); | ||
| 2478 | done: | ||
| 2479 | kfree(seg_name); | ||
| 2480 | kfree(snap_name); | ||
| 2481 | |||
| 2482 | return ret; | ||
| 2483 | } | ||
| 2484 | |||
| 2485 | static struct bus_attribute rbd_bus_attrs[] = { | 2404 | static struct bus_attribute rbd_bus_attrs[] = { |
| 2486 | __ATTR(add, S_IWUSR, NULL, rbd_add), | 2405 | __ATTR(add, S_IWUSR, NULL, rbd_add), |
| 2487 | __ATTR(remove, S_IWUSR, NULL, rbd_remove), | 2406 | __ATTR(remove, S_IWUSR, NULL, rbd_remove), |
diff --git a/drivers/block/swim3.c b/drivers/block/swim3.c index ae3e167e17a..89ddab127e3 100644 --- a/drivers/block/swim3.c +++ b/drivers/block/swim3.c | |||
| @@ -16,6 +16,8 @@ | |||
| 16 | * handle GCR disks | 16 | * handle GCR disks |
| 17 | */ | 17 | */ |
| 18 | 18 | ||
| 19 | #undef DEBUG | ||
| 20 | |||
| 19 | #include <linux/stddef.h> | 21 | #include <linux/stddef.h> |
| 20 | #include <linux/kernel.h> | 22 | #include <linux/kernel.h> |
| 21 | #include <linux/sched.h> | 23 | #include <linux/sched.h> |
| @@ -36,13 +38,11 @@ | |||
| 36 | #include <asm/machdep.h> | 38 | #include <asm/machdep.h> |
| 37 | #include <asm/pmac_feature.h> | 39 | #include <asm/pmac_feature.h> |
| 38 | 40 | ||
| 39 | static DEFINE_MUTEX(swim3_mutex); | ||
| 40 | static struct request_queue *swim3_queue; | ||
| 41 | static struct gendisk *disks[2]; | ||
| 42 | static struct request *fd_req; | ||
| 43 | |||
| 44 | #define MAX_FLOPPIES 2 | 41 | #define MAX_FLOPPIES 2 |
| 45 | 42 | ||
| 43 | static DEFINE_MUTEX(swim3_mutex); | ||
| 44 | static struct gendisk *disks[MAX_FLOPPIES]; | ||
| 45 | |||
| 46 | enum swim_state { | 46 | enum swim_state { |
| 47 | idle, | 47 | idle, |
| 48 | locating, | 48 | locating, |
| @@ -177,7 +177,6 @@ struct swim3 { | |||
| 177 | 177 | ||
| 178 | struct floppy_state { | 178 | struct floppy_state { |
| 179 | enum swim_state state; | 179 | enum swim_state state; |
| 180 | spinlock_t lock; | ||
| 181 | struct swim3 __iomem *swim3; /* hardware registers */ | 180 | struct swim3 __iomem *swim3; /* hardware registers */ |
| 182 | struct dbdma_regs __iomem *dma; /* DMA controller registers */ | 181 | struct dbdma_regs __iomem *dma; /* DMA controller registers */ |
| 183 | int swim3_intr; /* interrupt number for SWIM3 */ | 182 | int swim3_intr; /* interrupt number for SWIM3 */ |
| @@ -204,8 +203,20 @@ struct floppy_state { | |||
| 204 | int wanted; | 203 | int wanted; |
| 205 | struct macio_dev *mdev; | 204 | struct macio_dev *mdev; |
| 206 | char dbdma_cmd_space[5 * sizeof(struct dbdma_cmd)]; | 205 | char dbdma_cmd_space[5 * sizeof(struct dbdma_cmd)]; |
| 206 | int index; | ||
| 207 | struct request *cur_req; | ||
| 207 | }; | 208 | }; |
| 208 | 209 | ||
| 210 | #define swim3_err(fmt, arg...) dev_err(&fs->mdev->ofdev.dev, "[fd%d] " fmt, fs->index, arg) | ||
| 211 | #define swim3_warn(fmt, arg...) dev_warn(&fs->mdev->ofdev.dev, "[fd%d] " fmt, fs->index, arg) | ||
| 212 | #define swim3_info(fmt, arg...) dev_info(&fs->mdev->ofdev.dev, "[fd%d] " fmt, fs->index, arg) | ||
| 213 | |||
| 214 | #ifdef DEBUG | ||
| 215 | #define swim3_dbg(fmt, arg...) dev_dbg(&fs->mdev->ofdev.dev, "[fd%d] " fmt, fs->index, arg) | ||
| 216 | #else | ||
| 217 | #define swim3_dbg(fmt, arg...) do { } while(0) | ||
| 218 | #endif | ||
| 219 | |||
| 209 | static struct floppy_state floppy_states[MAX_FLOPPIES]; | 220 | static struct floppy_state floppy_states[MAX_FLOPPIES]; |
| 210 | static int floppy_count = 0; | 221 | static int floppy_count = 0; |
| 211 | static DEFINE_SPINLOCK(swim3_lock); | 222 | static DEFINE_SPINLOCK(swim3_lock); |
| @@ -224,17 +235,8 @@ static unsigned short write_postamble[] = { | |||
| 224 | 0, 0, 0, 0, 0, 0 | 235 | 0, 0, 0, 0, 0, 0 |
| 225 | }; | 236 | }; |
| 226 | 237 | ||
| 227 | static void swim3_select(struct floppy_state *fs, int sel); | ||
| 228 | static void swim3_action(struct floppy_state *fs, int action); | ||
| 229 | static int swim3_readbit(struct floppy_state *fs, int bit); | ||
| 230 | static void do_fd_request(struct request_queue * q); | ||
| 231 | static void start_request(struct floppy_state *fs); | ||
| 232 | static void set_timeout(struct floppy_state *fs, int nticks, | ||
| 233 | void (*proc)(unsigned long)); | ||
| 234 | static void scan_track(struct floppy_state *fs); | ||
| 235 | static void seek_track(struct floppy_state *fs, int n); | 238 | static void seek_track(struct floppy_state *fs, int n); |
| 236 | static void init_dma(struct dbdma_cmd *cp, int cmd, void *buf, int count); | 239 | static void init_dma(struct dbdma_cmd *cp, int cmd, void *buf, int count); |
| 237 | static void setup_transfer(struct floppy_state *fs); | ||
| 238 | static void act(struct floppy_state *fs); | 240 | static void act(struct floppy_state *fs); |
| 239 | static void scan_timeout(unsigned long data); | 241 | static void scan_timeout(unsigned long data); |
| 240 | static void seek_timeout(unsigned long data); | 242 | static void seek_timeout(unsigned long data); |
| @@ -254,18 +256,21 @@ static unsigned int floppy_check_events(struct gendisk *disk, | |||
| 254 | unsigned int clearing); | 256 | unsigned int clearing); |
| 255 | static int floppy_revalidate(struct gendisk *disk); | 257 | static int floppy_revalidate(struct gendisk *disk); |
| 256 | 258 | ||
| 257 | static bool swim3_end_request(int err, unsigned int nr_bytes) | 259 | static bool swim3_end_request(struct floppy_state *fs, int err, unsigned int nr_bytes) |
| 258 | { | 260 | { |
| 259 | if (__blk_end_request(fd_req, err, nr_bytes)) | 261 | struct request *req = fs->cur_req; |
| 260 | return true; | 262 | int rc; |
| 261 | 263 | ||
| 262 | fd_req = NULL; | 264 | swim3_dbg(" end request, err=%d nr_bytes=%d, cur_req=%p\n", |
| 263 | return false; | 265 | err, nr_bytes, req); |
| 264 | } | ||
| 265 | 266 | ||
| 266 | static bool swim3_end_request_cur(int err) | 267 | if (err) |
| 267 | { | 268 | nr_bytes = blk_rq_cur_bytes(req); |
| 268 | return swim3_end_request(err, blk_rq_cur_bytes(fd_req)); | 269 | rc = __blk_end_request(req, err, nr_bytes); |
| 270 | if (rc) | ||
| 271 | return true; | ||
| 272 | fs->cur_req = NULL; | ||
| 273 | return false; | ||
| 269 | } | 274 | } |
| 270 | 275 | ||
| 271 | static void swim3_select(struct floppy_state *fs, int sel) | 276 | static void swim3_select(struct floppy_state *fs, int sel) |
| @@ -303,50 +308,53 @@ static int swim3_readbit(struct floppy_state *fs, int bit) | |||
| 303 | return (stat & DATA) == 0; | 308 | return (stat & DATA) == 0; |
| 304 | } | 309 | } |
| 305 | 310 | ||
| 306 | static void do_fd_request(struct request_queue * q) | ||
| 307 | { | ||
| 308 | int i; | ||
| 309 | |||
| 310 | for(i=0; i<floppy_count; i++) { | ||
| 311 | struct floppy_state *fs = &floppy_states[i]; | ||
| 312 | if (fs->mdev->media_bay && | ||
| 313 | check_media_bay(fs->mdev->media_bay) != MB_FD) | ||
| 314 | continue; | ||
| 315 | start_request(fs); | ||
| 316 | } | ||
| 317 | } | ||
| 318 | |||
| 319 | static void start_request(struct floppy_state *fs) | 311 | static void start_request(struct floppy_state *fs) |
| 320 | { | 312 | { |
| 321 | struct request *req; | 313 | struct request *req; |
| 322 | unsigned long x; | 314 | unsigned long x; |
| 323 | 315 | ||
| 316 | swim3_dbg("start request, initial state=%d\n", fs->state); | ||
| 317 | |||
| 324 | if (fs->state == idle && fs->wanted) { | 318 | if (fs->state == idle && fs->wanted) { |
| 325 | fs->state = available; | 319 | fs->state = available; |
| 326 | wake_up(&fs->wait); | 320 | wake_up(&fs->wait); |
| 327 | return; | 321 | return; |
| 328 | } | 322 | } |
| 329 | while (fs->state == idle) { | 323 | while (fs->state == idle) { |
| 330 | if (!fd_req) { | 324 | swim3_dbg("start request, idle loop, cur_req=%p\n", fs->cur_req); |
| 331 | fd_req = blk_fetch_request(swim3_queue); | 325 | if (!fs->cur_req) { |
| 332 | if (!fd_req) | 326 | fs->cur_req = blk_fetch_request(disks[fs->index]->queue); |
| 327 | swim3_dbg(" fetched request %p\n", fs->cur_req); | ||
| 328 | if (!fs->cur_req) | ||
| 333 | break; | 329 | break; |
| 334 | } | 330 | } |
| 335 | req = fd_req; | 331 | req = fs->cur_req; |
| 336 | #if 0 | 332 | |
| 337 | printk("do_fd_req: dev=%s cmd=%d sec=%ld nr_sec=%u buf=%p\n", | 333 | if (fs->mdev->media_bay && |
| 338 | req->rq_disk->disk_name, req->cmd, | 334 | check_media_bay(fs->mdev->media_bay) != MB_FD) { |
| 339 | (long)blk_rq_pos(req), blk_rq_sectors(req), req->buffer); | 335 | swim3_dbg("%s", " media bay absent, dropping req\n"); |
| 340 | printk(" errors=%d current_nr_sectors=%u\n", | 336 | swim3_end_request(fs, -ENODEV, 0); |
| 341 | req->errors, blk_rq_cur_sectors(req)); | 337 | continue; |
| 338 | } | ||
| 339 | |||
| 340 | #if 0 /* This is really too verbose */ | ||
| 341 | swim3_dbg("do_fd_req: dev=%s cmd=%d sec=%ld nr_sec=%u buf=%p\n", | ||
| 342 | req->rq_disk->disk_name, req->cmd, | ||
| 343 | (long)blk_rq_pos(req), blk_rq_sectors(req), | ||
| 344 | req->buffer); | ||
| 345 | swim3_dbg(" errors=%d current_nr_sectors=%u\n", | ||
| 346 | req->errors, blk_rq_cur_sectors(req)); | ||
| 342 | #endif | 347 | #endif |
| 343 | 348 | ||
| 344 | if (blk_rq_pos(req) >= fs->total_secs) { | 349 | if (blk_rq_pos(req) >= fs->total_secs) { |
| 345 | swim3_end_request_cur(-EIO); | 350 | swim3_dbg(" pos out of bounds (%ld, max is %ld)\n", |
| 351 | (long)blk_rq_pos(req), (long)fs->total_secs); | ||
| 352 | swim3_end_request(fs, -EIO, 0); | ||
| 346 | continue; | 353 | continue; |
| 347 | } | 354 | } |
| 348 | if (fs->ejected) { | 355 | if (fs->ejected) { |
| 349 | swim3_end_request_cur(-EIO); | 356 | swim3_dbg("%s", " disk ejected\n"); |
| 357 | swim3_end_request(fs, -EIO, 0); | ||
| 350 | continue; | 358 | continue; |
| 351 | } | 359 | } |
| 352 | 360 | ||
| @@ -354,7 +362,8 @@ static void start_request(struct floppy_state *fs) | |||
| 354 | if (fs->write_prot < 0) | 362 | if (fs->write_prot < 0) |
| 355 | fs->write_prot = swim3_readbit(fs, WRITE_PROT); | 363 | fs->write_prot = swim3_readbit(fs, WRITE_PROT); |
| 356 | if (fs->write_prot) { | 364 | if (fs->write_prot) { |
| 357 | swim3_end_request_cur(-EIO); | 365 | swim3_dbg("%s", " try to write, disk write protected\n"); |
| 366 | swim3_end_request(fs, -EIO, 0); | ||
| 358 | continue; | 367 | continue; |
| 359 | } | 368 | } |
| 360 | } | 369 | } |
| @@ -369,7 +378,6 @@ static void start_request(struct floppy_state *fs) | |||
| 369 | x = ((long)blk_rq_pos(req)) % fs->secpercyl; | 378 | x = ((long)blk_rq_pos(req)) % fs->secpercyl; |
| 370 | fs->head = x / fs->secpertrack; | 379 | fs->head = x / fs->secpertrack; |
| 371 | fs->req_sector = x % fs->secpertrack + 1; | 380 | fs->req_sector = x % fs->secpertrack + 1; |
| 372 | fd_req = req; | ||
| 373 | fs->state = do_transfer; | 381 | fs->state = do_transfer; |
| 374 | fs->retries = 0; | 382 | fs->retries = 0; |
| 375 | 383 | ||
| @@ -377,12 +385,14 @@ static void start_request(struct floppy_state *fs) | |||
| 377 | } | 385 | } |
| 378 | } | 386 | } |
| 379 | 387 | ||
| 388 | static void do_fd_request(struct request_queue * q) | ||
| 389 | { | ||
| 390 | start_request(q->queuedata); | ||
| 391 | } | ||
| 392 | |||
| 380 | static void set_timeout(struct floppy_state *fs, int nticks, | 393 | static void set_timeout(struct floppy_state *fs, int nticks, |
| 381 | void (*proc)(unsigned long)) | 394 | void (*proc)(unsigned long)) |
| 382 | { | 395 | { |
| 383 | unsigned long flags; | ||
| 384 | |||
| 385 | spin_lock_irqsave(&fs->lock, flags); | ||
| 386 | if (fs->timeout_pending) | 396 | if (fs->timeout_pending) |
| 387 | del_timer(&fs->timeout); | 397 | del_timer(&fs->timeout); |
| 388 | fs->timeout.expires = jiffies + nticks; | 398 | fs->timeout.expires = jiffies + nticks; |
| @@ -390,7 +400,6 @@ static void set_timeout(struct floppy_state *fs, int nticks, | |||
| 390 | fs->timeout.data = (unsigned long) fs; | 400 | fs->timeout.data = (unsigned long) fs; |
| 391 | add_timer(&fs->timeout); | 401 | add_timer(&fs->timeout); |
| 392 | fs->timeout_pending = 1; | 402 | fs->timeout_pending = 1; |
| 393 | spin_unlock_irqrestore(&fs->lock, flags); | ||
| 394 | } | 403 | } |
| 395 | 404 | ||
| 396 | static inline void scan_track(struct floppy_state *fs) | 405 | static inline void scan_track(struct floppy_state *fs) |
| @@ -442,40 +451,45 @@ static inline void setup_transfer(struct floppy_state *fs) | |||
| 442 | struct swim3 __iomem *sw = fs->swim3; | 451 | struct swim3 __iomem *sw = fs->swim3; |
| 443 | struct dbdma_cmd *cp = fs->dma_cmd; | 452 | struct dbdma_cmd *cp = fs->dma_cmd; |
| 444 | struct dbdma_regs __iomem *dr = fs->dma; | 453 | struct dbdma_regs __iomem *dr = fs->dma; |
| 454 | struct request *req = fs->cur_req; | ||
| 445 | 455 | ||
| 446 | if (blk_rq_cur_sectors(fd_req) <= 0) { | 456 | if (blk_rq_cur_sectors(req) <= 0) { |
| 447 | printk(KERN_ERR "swim3: transfer 0 sectors?\n"); | 457 | swim3_warn("%s", "Transfer 0 sectors ?\n"); |
| 448 | return; | 458 | return; |
| 449 | } | 459 | } |
| 450 | if (rq_data_dir(fd_req) == WRITE) | 460 | if (rq_data_dir(req) == WRITE) |
| 451 | n = 1; | 461 | n = 1; |
| 452 | else { | 462 | else { |
| 453 | n = fs->secpertrack - fs->req_sector + 1; | 463 | n = fs->secpertrack - fs->req_sector + 1; |
| 454 | if (n > blk_rq_cur_sectors(fd_req)) | 464 | if (n > blk_rq_cur_sectors(req)) |
| 455 | n = blk_rq_cur_sectors(fd_req); | 465 | n = blk_rq_cur_sectors(req); |
| 456 | } | 466 | } |
| 467 | |||
| 468 | swim3_dbg(" setup xfer at sect %d (of %d) head %d for %d\n", | ||
| 469 | fs->req_sector, fs->secpertrack, fs->head, n); | ||
| 470 | |||
| 457 | fs->scount = n; | 471 | fs->scount = n; |
| 458 | swim3_select(fs, fs->head? READ_DATA_1: READ_DATA_0); | 472 | swim3_select(fs, fs->head? READ_DATA_1: READ_DATA_0); |
| 459 | out_8(&sw->sector, fs->req_sector); | 473 | out_8(&sw->sector, fs->req_sector); |
| 460 | out_8(&sw->nsect, n); | 474 | out_8(&sw->nsect, n); |
| 461 | out_8(&sw->gap3, 0); | 475 | out_8(&sw->gap3, 0); |
| 462 | out_le32(&dr->cmdptr, virt_to_bus(cp)); | 476 | out_le32(&dr->cmdptr, virt_to_bus(cp)); |
| 463 | if (rq_data_dir(fd_req) == WRITE) { | 477 | if (rq_data_dir(req) == WRITE) { |
| 464 | /* Set up 3 dma commands: write preamble, data, postamble */ | 478 | /* Set up 3 dma commands: write preamble, data, postamble */ |
| 465 | init_dma(cp, OUTPUT_MORE, write_preamble, sizeof(write_preamble)); | 479 | init_dma(cp, OUTPUT_MORE, write_preamble, sizeof(write_preamble)); |
| 466 | ++cp; | 480 | ++cp; |
| 467 | init_dma(cp, OUTPUT_MORE, fd_req->buffer, 512); | 481 | init_dma(cp, OUTPUT_MORE, req->buffer, 512); |
| 468 | ++cp; | 482 | ++cp; |
| 469 | init_dma(cp, OUTPUT_LAST, write_postamble, sizeof(write_postamble)); | 483 | init_dma(cp, OUTPUT_LAST, write_postamble, sizeof(write_postamble)); |
| 470 | } else { | 484 | } else { |
| 471 | init_dma(cp, INPUT_LAST, fd_req->buffer, n * 512); | 485 | init_dma(cp, INPUT_LAST, req->buffer, n * 512); |
| 472 | } | 486 | } |
| 473 | ++cp; | 487 | ++cp; |
| 474 | out_le16(&cp->command, DBDMA_STOP); | 488 | out_le16(&cp->command, DBDMA_STOP); |
| 475 | out_8(&sw->control_bic, DO_ACTION | WRITE_SECTORS); | 489 | out_8(&sw->control_bic, DO_ACTION | WRITE_SECTORS); |
| 476 | in_8(&sw->error); | 490 | in_8(&sw->error); |
| 477 | out_8(&sw->control_bic, DO_ACTION | WRITE_SECTORS); | 491 | out_8(&sw->control_bic, DO_ACTION | WRITE_SECTORS); |
| 478 | if (rq_data_dir(fd_req) == WRITE) | 492 | if (rq_data_dir(req) == WRITE) |
| 479 | out_8(&sw->control_bis, WRITE_SECTORS); | 493 | out_8(&sw->control_bis, WRITE_SECTORS); |
| 480 | in_8(&sw->intr); | 494 | in_8(&sw->intr); |
| 481 | out_le32(&dr->control, (RUN << 16) | RUN); | 495 | out_le32(&dr->control, (RUN << 16) | RUN); |
| @@ -488,12 +502,16 @@ static inline void setup_transfer(struct floppy_state *fs) | |||
| 488 | static void act(struct floppy_state *fs) | 502 | static void act(struct floppy_state *fs) |
| 489 | { | 503 | { |
| 490 | for (;;) { | 504 | for (;;) { |
| 505 | swim3_dbg(" act loop, state=%d, req_cyl=%d, cur_cyl=%d\n", | ||
| 506 | fs->state, fs->req_cyl, fs->cur_cyl); | ||
| 507 | |||
| 491 | switch (fs->state) { | 508 | switch (fs->state) { |
| 492 | case idle: | 509 | case idle: |
| 493 | return; /* XXX shouldn't get here */ | 510 | return; /* XXX shouldn't get here */ |
| 494 | 511 | ||
| 495 | case locating: | 512 | case locating: |
| 496 | if (swim3_readbit(fs, TRACK_ZERO)) { | 513 | if (swim3_readbit(fs, TRACK_ZERO)) { |
| 514 | swim3_dbg("%s", " locate track 0\n"); | ||
| 497 | fs->cur_cyl = 0; | 515 | fs->cur_cyl = 0; |
| 498 | if (fs->req_cyl == 0) | 516 | if (fs->req_cyl == 0) |
| 499 | fs->state = do_transfer; | 517 | fs->state = do_transfer; |
| @@ -511,7 +529,7 @@ static void act(struct floppy_state *fs) | |||
| 511 | break; | 529 | break; |
| 512 | } | 530 | } |
| 513 | if (fs->req_cyl == fs->cur_cyl) { | 531 | if (fs->req_cyl == fs->cur_cyl) { |
| 514 | printk("whoops, seeking 0\n"); | 532 | swim3_warn("%s", "Whoops, seeking 0\n"); |
| 515 | fs->state = do_transfer; | 533 | fs->state = do_transfer; |
| 516 | break; | 534 | break; |
| 517 | } | 535 | } |
| @@ -527,7 +545,9 @@ static void act(struct floppy_state *fs) | |||
| 527 | case do_transfer: | 545 | case do_transfer: |
| 528 | if (fs->cur_cyl != fs->req_cyl) { | 546 | if (fs->cur_cyl != fs->req_cyl) { |
| 529 | if (fs->retries > 5) { | 547 | if (fs->retries > 5) { |
| 530 | swim3_end_request_cur(-EIO); | 548 | swim3_err("Wrong cylinder in transfer, want: %d got %d\n", |
| 549 | fs->req_cyl, fs->cur_cyl); | ||
| 550 | swim3_end_request(fs, -EIO, 0); | ||
| 531 | fs->state = idle; | 551 | fs->state = idle; |
| 532 | return; | 552 | return; |
| 533 | } | 553 | } |
| @@ -542,7 +562,7 @@ static void act(struct floppy_state *fs) | |||
| 542 | return; | 562 | return; |
| 543 | 563 | ||
| 544 | default: | 564 | default: |
| 545 | printk(KERN_ERR"swim3: unknown state %d\n", fs->state); | 565 | swim3_err("Unknown state %d\n", fs->state); |
| 546 | return; | 566 | return; |
| 547 | } | 567 | } |
| 548 | } | 568 | } |
| @@ -552,59 +572,75 @@ static void scan_timeout(unsigned long data) | |||
| 552 | { | 572 | { |
| 553 | struct floppy_state *fs = (struct floppy_state *) data; | 573 | struct floppy_state *fs = (struct floppy_state *) data; |
| 554 | struct swim3 __iomem *sw = fs->swim3; | 574 | struct swim3 __iomem *sw = fs->swim3; |
| 575 | unsigned long flags; | ||
| 576 | |||
| 577 | swim3_dbg("* scan timeout, state=%d\n", fs->state); | ||
| 555 | 578 | ||
| 579 | spin_lock_irqsave(&swim3_lock, flags); | ||
| 556 | fs->timeout_pending = 0; | 580 | fs->timeout_pending = 0; |
| 557 | out_8(&sw->control_bic, DO_ACTION | WRITE_SECTORS); | 581 | out_8(&sw->control_bic, DO_ACTION | WRITE_SECTORS); |
| 558 | out_8(&sw->select, RELAX); | 582 | out_8(&sw->select, RELAX); |
| 559 | out_8(&sw->intr_enable, 0); | 583 | out_8(&sw->intr_enable, 0); |
| 560 | fs->cur_cyl = -1; | 584 | fs->cur_cyl = -1; |
| 561 | if (fs->retries > 5) { | 585 | if (fs->retries > 5) { |
| 562 | swim3_end_request_cur(-EIO); | 586 | swim3_end_request(fs, -EIO, 0); |
| 563 | fs->state = idle; | 587 | fs->state = idle; |
| 564 | start_request(fs); | 588 | start_request(fs); |
| 565 | } else { | 589 | } else { |
| 566 | fs->state = jogging; | 590 | fs->state = jogging; |
| 567 | act(fs); | 591 | act(fs); |
| 568 | } | 592 | } |
| 593 | spin_unlock_irqrestore(&swim3_lock, flags); | ||
| 569 | } | 594 | } |
| 570 | 595 | ||
| 571 | static void seek_timeout(unsigned long data) | 596 | static void seek_timeout(unsigned long data) |
| 572 | { | 597 | { |
| 573 | struct floppy_state *fs = (struct floppy_state *) data; | 598 | struct floppy_state *fs = (struct floppy_state *) data; |
| 574 | struct swim3 __iomem *sw = fs->swim3; | 599 | struct swim3 __iomem *sw = fs->swim3; |
| 600 | unsigned long flags; | ||
| 601 | |||
| 602 | swim3_dbg("* seek timeout, state=%d\n", fs->state); | ||
| 575 | 603 | ||
| 604 | spin_lock_irqsave(&swim3_lock, flags); | ||
| 576 | fs->timeout_pending = 0; | 605 | fs->timeout_pending = 0; |
| 577 | out_8(&sw->control_bic, DO_SEEK); | 606 | out_8(&sw->control_bic, DO_SEEK); |
| 578 | out_8(&sw->select, RELAX); | 607 | out_8(&sw->select, RELAX); |
| 579 | out_8(&sw->intr_enable, 0); | 608 | out_8(&sw->intr_enable, 0); |
| 580 | printk(KERN_ERR "swim3: seek timeout\n"); | 609 | swim3_err("%s", "Seek timeout\n"); |
| 581 | swim3_end_request_cur(-EIO); | 610 | swim3_end_request(fs, -EIO, 0); |
| 582 | fs->state = idle; | 611 | fs->state = idle; |
| 583 | start_request(fs); | 612 | start_request(fs); |
| 613 | spin_unlock_irqrestore(&swim3_lock, flags); | ||
| 584 | } | 614 | } |
| 585 | 615 | ||
| 586 | static void settle_timeout(unsigned long data) | 616 | static void settle_timeout(unsigned long data) |
| 587 | { | 617 | { |
| 588 | struct floppy_state *fs = (struct floppy_state *) data; | 618 | struct floppy_state *fs = (struct floppy_state *) data; |
| 589 | struct swim3 __iomem *sw = fs->swim3; | 619 | struct swim3 __iomem *sw = fs->swim3; |
| 620 | unsigned long flags; | ||
| 621 | |||
| 622 | swim3_dbg("* settle timeout, state=%d\n", fs->state); | ||
| 590 | 623 | ||
| 624 | spin_lock_irqsave(&swim3_lock, flags); | ||
| 591 | fs->timeout_pending = 0; | 625 | fs->timeout_pending = 0; |
| 592 | if (swim3_readbit(fs, SEEK_COMPLETE)) { | 626 | if (swim3_readbit(fs, SEEK_COMPLETE)) { |
| 593 | out_8(&sw->select, RELAX); | 627 | out_8(&sw->select, RELAX); |
| 594 | fs->state = locating; | 628 | fs->state = locating; |
| 595 | act(fs); | 629 | act(fs); |
| 596 | return; | 630 | goto unlock; |
| 597 | } | 631 | } |
| 598 | out_8(&sw->select, RELAX); | 632 | out_8(&sw->select, RELAX); |
| 599 | if (fs->settle_time < 2*HZ) { | 633 | if (fs->settle_time < 2*HZ) { |
| 600 | ++fs->settle_time; | 634 | ++fs->settle_time; |
| 601 | set_timeout(fs, 1, settle_timeout); | 635 | set_timeout(fs, 1, settle_timeout); |
| 602 | return; | 636 | goto unlock; |
| 603 | } | 637 | } |
| 604 | printk(KERN_ERR "swim3: seek settle timeout\n"); | 638 | swim3_err("%s", "Seek settle timeout\n"); |
| 605 | swim3_end_request_cur(-EIO); | 639 | swim3_end_request(fs, -EIO, 0); |
| 606 | fs->state = idle; | 640 | fs->state = idle; |
| 607 | start_request(fs); | 641 | start_request(fs); |
| 642 | unlock: | ||
| 643 | spin_unlock_irqrestore(&swim3_lock, flags); | ||
| 608 | } | 644 | } |
| 609 | 645 | ||
| 610 | static void xfer_timeout(unsigned long data) | 646 | static void xfer_timeout(unsigned long data) |
| @@ -612,8 +648,12 @@ static void xfer_timeout(unsigned long data) | |||
| 612 | struct floppy_state *fs = (struct floppy_state *) data; | 648 | struct floppy_state *fs = (struct floppy_state *) data; |
| 613 | struct swim3 __iomem *sw = fs->swim3; | 649 | struct swim3 __iomem *sw = fs->swim3; |
| 614 | struct dbdma_regs __iomem *dr = fs->dma; | 650 | struct dbdma_regs __iomem *dr = fs->dma; |
| 651 | unsigned long flags; | ||
| 615 | int n; | 652 | int n; |
| 616 | 653 | ||
| 654 | swim3_dbg("* xfer timeout, state=%d\n", fs->state); | ||
| 655 | |||
| 656 | spin_lock_irqsave(&swim3_lock, flags); | ||
| 617 | fs->timeout_pending = 0; | 657 | fs->timeout_pending = 0; |
| 618 | out_le32(&dr->control, RUN << 16); | 658 | out_le32(&dr->control, RUN << 16); |
| 619 | /* We must wait a bit for dbdma to stop */ | 659 | /* We must wait a bit for dbdma to stop */ |
| @@ -622,12 +662,13 @@ static void xfer_timeout(unsigned long data) | |||
| 622 | out_8(&sw->intr_enable, 0); | 662 | out_8(&sw->intr_enable, 0); |
| 623 | out_8(&sw->control_bic, WRITE_SECTORS | DO_ACTION); | 663 | out_8(&sw->control_bic, WRITE_SECTORS | DO_ACTION); |
| 624 | out_8(&sw->select, RELAX); | 664 | out_8(&sw->select, RELAX); |
| 625 | printk(KERN_ERR "swim3: timeout %sing sector %ld\n", | 665 | swim3_err("Timeout %sing sector %ld\n", |
| 626 | (rq_data_dir(fd_req)==WRITE? "writ": "read"), | 666 | (rq_data_dir(fs->cur_req)==WRITE? "writ": "read"), |
| 627 | (long)blk_rq_pos(fd_req)); | 667 | (long)blk_rq_pos(fs->cur_req)); |
| 628 | swim3_end_request_cur(-EIO); | 668 | swim3_end_request(fs, -EIO, 0); |
| 629 | fs->state = idle; | 669 | fs->state = idle; |
| 630 | start_request(fs); | 670 | start_request(fs); |
| 671 | spin_unlock_irqrestore(&swim3_lock, flags); | ||
| 631 | } | 672 | } |
| 632 | 673 | ||
| 633 | static irqreturn_t swim3_interrupt(int irq, void *dev_id) | 674 | static irqreturn_t swim3_interrupt(int irq, void *dev_id) |
| @@ -638,12 +679,17 @@ static irqreturn_t swim3_interrupt(int irq, void *dev_id) | |||
| 638 | int stat, resid; | 679 | int stat, resid; |
| 639 | struct dbdma_regs __iomem *dr; | 680 | struct dbdma_regs __iomem *dr; |
| 640 | struct dbdma_cmd *cp; | 681 | struct dbdma_cmd *cp; |
| 682 | unsigned long flags; | ||
| 683 | struct request *req = fs->cur_req; | ||
| 684 | |||
| 685 | swim3_dbg("* interrupt, state=%d\n", fs->state); | ||
| 641 | 686 | ||
| 687 | spin_lock_irqsave(&swim3_lock, flags); | ||
| 642 | intr = in_8(&sw->intr); | 688 | intr = in_8(&sw->intr); |
| 643 | err = (intr & ERROR_INTR)? in_8(&sw->error): 0; | 689 | err = (intr & ERROR_INTR)? in_8(&sw->error): 0; |
| 644 | if ((intr & ERROR_INTR) && fs->state != do_transfer) | 690 | if ((intr & ERROR_INTR) && fs->state != do_transfer) |
| 645 | printk(KERN_ERR "swim3_interrupt, state=%d, dir=%x, intr=%x, err=%x\n", | 691 | swim3_err("Non-transfer error interrupt: state=%d, dir=%x, intr=%x, err=%x\n", |
| 646 | fs->state, rq_data_dir(fd_req), intr, err); | 692 | fs->state, rq_data_dir(req), intr, err); |
| 647 | switch (fs->state) { | 693 | switch (fs->state) { |
| 648 | case locating: | 694 | case locating: |
| 649 | if (intr & SEEN_SECTOR) { | 695 | if (intr & SEEN_SECTOR) { |
| @@ -653,10 +699,10 @@ static irqreturn_t swim3_interrupt(int irq, void *dev_id) | |||
| 653 | del_timer(&fs->timeout); | 699 | del_timer(&fs->timeout); |
| 654 | fs->timeout_pending = 0; | 700 | fs->timeout_pending = 0; |
| 655 | if (sw->ctrack == 0xff) { | 701 | if (sw->ctrack == 0xff) { |
| 656 | printk(KERN_ERR "swim3: seen sector but cyl=ff?\n"); | 702 | swim3_err("%s", "Seen sector but cyl=ff?\n"); |
| 657 | fs->cur_cyl = -1; | 703 | fs->cur_cyl = -1; |
| 658 | if (fs->retries > 5) { | 704 | if (fs->retries > 5) { |
| 659 | swim3_end_request_cur(-EIO); | 705 | swim3_end_request(fs, -EIO, 0); |
| 660 | fs->state = idle; | 706 | fs->state = idle; |
| 661 | start_request(fs); | 707 | start_request(fs); |
| 662 | } else { | 708 | } else { |
| @@ -668,8 +714,8 @@ static irqreturn_t swim3_interrupt(int irq, void *dev_id) | |||
| 668 | fs->cur_cyl = sw->ctrack; | 714 | fs->cur_cyl = sw->ctrack; |
| 669 | fs->cur_sector = sw->csect; | 715 | fs->cur_sector = sw->csect; |
| 670 | if (fs->expect_cyl != -1 && fs->expect_cyl != fs->cur_cyl) | 716 | if (fs->expect_cyl != -1 && fs->expect_cyl != fs->cur_cyl) |
| 671 | printk(KERN_ERR "swim3: expected cyl %d, got %d\n", | 717 | swim3_err("Expected cyl %d, got %d\n", |
| 672 | fs->expect_cyl, fs->cur_cyl); | 718 | fs->expect_cyl, fs->cur_cyl); |
| 673 | fs->state = do_transfer; | 719 | fs->state = do_transfer; |
| 674 | act(fs); | 720 | act(fs); |
| 675 | } | 721 | } |
| @@ -704,7 +750,7 @@ static irqreturn_t swim3_interrupt(int irq, void *dev_id) | |||
| 704 | fs->timeout_pending = 0; | 750 | fs->timeout_pending = 0; |
| 705 | dr = fs->dma; | 751 | dr = fs->dma; |
| 706 | cp = fs->dma_cmd; | 752 | cp = fs->dma_cmd; |
| 707 | if (rq_data_dir(fd_req) == WRITE) | 753 | if (rq_data_dir(req) == WRITE) |
| 708 | ++cp; | 754 | ++cp; |
| 709 | /* | 755 | /* |
| 710 | * Check that the main data transfer has finished. | 756 | * Check that the main data transfer has finished. |
| @@ -729,31 +775,32 @@ static irqreturn_t swim3_interrupt(int irq, void *dev_id) | |||
| 729 | if (intr & ERROR_INTR) { | 775 | if (intr & ERROR_INTR) { |
| 730 | n = fs->scount - 1 - resid / 512; | 776 | n = fs->scount - 1 - resid / 512; |
| 731 | if (n > 0) { | 777 | if (n > 0) { |
| 732 | blk_update_request(fd_req, 0, n << 9); | 778 | blk_update_request(req, 0, n << 9); |
| 733 | fs->req_sector += n; | 779 | fs->req_sector += n; |
| 734 | } | 780 | } |
| 735 | if (fs->retries < 5) { | 781 | if (fs->retries < 5) { |
| 736 | ++fs->retries; | 782 | ++fs->retries; |
| 737 | act(fs); | 783 | act(fs); |
| 738 | } else { | 784 | } else { |
| 739 | printk("swim3: error %sing block %ld (err=%x)\n", | 785 | swim3_err("Error %sing block %ld (err=%x)\n", |
| 740 | rq_data_dir(fd_req) == WRITE? "writ": "read", | 786 | rq_data_dir(req) == WRITE? "writ": "read", |
| 741 | (long)blk_rq_pos(fd_req), err); | 787 | (long)blk_rq_pos(req), err); |
| 742 | swim3_end_request_cur(-EIO); | 788 | swim3_end_request(fs, -EIO, 0); |
| 743 | fs->state = idle; | 789 | fs->state = idle; |
| 744 | } | 790 | } |
| 745 | } else { | 791 | } else { |
| 746 | if ((stat & ACTIVE) == 0 || resid != 0) { | 792 | if ((stat & ACTIVE) == 0 || resid != 0) { |
| 747 | /* musta been an error */ | 793 | /* musta been an error */ |
| 748 | printk(KERN_ERR "swim3: fd dma: stat=%x resid=%d\n", stat, resid); | 794 | swim3_err("fd dma error: stat=%x resid=%d\n", stat, resid); |
| 749 | printk(KERN_ERR " state=%d, dir=%x, intr=%x, err=%x\n", | 795 | swim3_err(" state=%d, dir=%x, intr=%x, err=%x\n", |
| 750 | fs->state, rq_data_dir(fd_req), intr, err); | 796 | fs->state, rq_data_dir(req), intr, err); |
| 751 | swim3_end_request_cur(-EIO); | 797 | swim3_end_request(fs, -EIO, 0); |
| 752 | fs->state = idle; | 798 | fs->state = idle; |
| 753 | start_request(fs); | 799 | start_request(fs); |
| 754 | break; | 800 | break; |
| 755 | } | 801 | } |
| 756 | if (swim3_end_request(0, fs->scount << 9)) { | 802 | fs->retries = 0; |
| 803 | if (swim3_end_request(fs, 0, fs->scount << 9)) { | ||
| 757 | fs->req_sector += fs->scount; | 804 | fs->req_sector += fs->scount; |
| 758 | if (fs->req_sector > fs->secpertrack) { | 805 | if (fs->req_sector > fs->secpertrack) { |
| 759 | fs->req_sector -= fs->secpertrack; | 806 | fs->req_sector -= fs->secpertrack; |
| @@ -770,8 +817,9 @@ static irqreturn_t swim3_interrupt(int irq, void *dev_id) | |||
| 770 | start_request(fs); | 817 | start_request(fs); |
| 771 | break; | 818 | break; |
| 772 | default: | 819 | default: |
| 773 | printk(KERN_ERR "swim3: don't know what to do in state %d\n", fs->state); | 820 | swim3_err("Don't know what to do in state %d\n", fs->state); |
| 774 | } | 821 | } |
| 822 | spin_unlock_irqrestore(&swim3_lock, flags); | ||
| 775 | return IRQ_HANDLED; | 823 | return IRQ_HANDLED; |
| 776 | } | 824 | } |
| 777 | 825 | ||
| @@ -781,26 +829,31 @@ static void fd_dma_interrupt(int irq, void *dev_id) | |||
| 781 | } | 829 | } |
| 782 | */ | 830 | */ |
| 783 | 831 | ||
| 832 | /* Called under the mutex to grab exclusive access to a drive */ | ||
| 784 | static int grab_drive(struct floppy_state *fs, enum swim_state state, | 833 | static int grab_drive(struct floppy_state *fs, enum swim_state state, |
| 785 | int interruptible) | 834 | int interruptible) |
| 786 | { | 835 | { |
| 787 | unsigned long flags; | 836 | unsigned long flags; |
| 788 | 837 | ||
| 789 | spin_lock_irqsave(&fs->lock, flags); | 838 | swim3_dbg("%s", "-> grab drive\n"); |
| 790 | if (fs->state != idle) { | 839 | |
| 840 | spin_lock_irqsave(&swim3_lock, flags); | ||
| 841 | if (fs->state != idle && fs->state != available) { | ||
| 791 | ++fs->wanted; | 842 | ++fs->wanted; |
| 792 | while (fs->state != available) { | 843 | while (fs->state != available) { |
| 844 | spin_unlock_irqrestore(&swim3_lock, flags); | ||
| 793 | if (interruptible && signal_pending(current)) { | 845 | if (interruptible && signal_pending(current)) { |
| 794 | --fs->wanted; | 846 | --fs->wanted; |
| 795 | spin_unlock_irqrestore(&fs->lock, flags); | ||
| 796 | return -EINTR; | 847 | return -EINTR; |
| 797 | } | 848 | } |
| 798 | interruptible_sleep_on(&fs->wait); | 849 | interruptible_sleep_on(&fs->wait); |
| 850 | spin_lock_irqsave(&swim3_lock, flags); | ||
| 799 | } | 851 | } |
| 800 | --fs->wanted; | 852 | --fs->wanted; |
| 801 | } | 853 | } |
| 802 | fs->state = state; | 854 | fs->state = state; |
| 803 | spin_unlock_irqrestore(&fs->lock, flags); | 855 | spin_unlock_irqrestore(&swim3_lock, flags); |
| 856 | |||
| 804 | return 0; | 857 | return 0; |
| 805 | } | 858 | } |
| 806 | 859 | ||
| @@ -808,10 +861,12 @@ static void release_drive(struct floppy_state *fs) | |||
| 808 | { | 861 | { |
| 809 | unsigned long flags; | 862 | unsigned long flags; |
| 810 | 863 | ||
| 811 | spin_lock_irqsave(&fs->lock, flags); | 864 | swim3_dbg("%s", "-> release drive\n"); |
| 865 | |||
| 866 | spin_lock_irqsave(&swim3_lock, flags); | ||
| 812 | fs->state = idle; | 867 | fs->state = idle; |
| 813 | start_request(fs); | 868 | start_request(fs); |
| 814 | spin_unlock_irqrestore(&fs->lock, flags); | 869 | spin_unlock_irqrestore(&swim3_lock, flags); |
| 815 | } | 870 | } |
| 816 | 871 | ||
| 817 | static int fd_eject(struct floppy_state *fs) | 872 | static int fd_eject(struct floppy_state *fs) |
| @@ -966,6 +1021,7 @@ static int floppy_release(struct gendisk *disk, fmode_t mode) | |||
| 966 | { | 1021 | { |
| 967 | struct floppy_state *fs = disk->private_data; | 1022 | struct floppy_state *fs = disk->private_data; |
| 968 | struct swim3 __iomem *sw = fs->swim3; | 1023 | struct swim3 __iomem *sw = fs->swim3; |
| 1024 | |||
| 969 | mutex_lock(&swim3_mutex); | 1025 | mutex_lock(&swim3_mutex); |
| 970 | if (fs->ref_count > 0 && --fs->ref_count == 0) { | 1026 | if (fs->ref_count > 0 && --fs->ref_count == 0) { |
| 971 | swim3_action(fs, MOTOR_OFF); | 1027 | swim3_action(fs, MOTOR_OFF); |
| @@ -1031,30 +1087,48 @@ static const struct block_device_operations floppy_fops = { | |||
| 1031 | .revalidate_disk= floppy_revalidate, | 1087 | .revalidate_disk= floppy_revalidate, |
| 1032 | }; | 1088 | }; |
| 1033 | 1089 | ||
| 1090 | static void swim3_mb_event(struct macio_dev* mdev, int mb_state) | ||
| 1091 | { | ||
| 1092 | struct floppy_state *fs = macio_get_drvdata(mdev); | ||
| 1093 | struct swim3 __iomem *sw = fs->swim3; | ||
| 1094 | |||
| 1095 | if (!fs) | ||
| 1096 | return; | ||
| 1097 | if (mb_state != MB_FD) | ||
| 1098 | return; | ||
| 1099 | |||
| 1100 | /* Clear state */ | ||
| 1101 | out_8(&sw->intr_enable, 0); | ||
| 1102 | in_8(&sw->intr); | ||
| 1103 | in_8(&sw->error); | ||
| 1104 | } | ||
| 1105 | |||
| 1034 | static int swim3_add_device(struct macio_dev *mdev, int index) | 1106 | static int swim3_add_device(struct macio_dev *mdev, int index) |
| 1035 | { | 1107 | { |
| 1036 | struct device_node *swim = mdev->ofdev.dev.of_node; | 1108 | struct device_node *swim = mdev->ofdev.dev.of_node; |
| 1037 | struct floppy_state *fs = &floppy_states[index]; | 1109 | struct floppy_state *fs = &floppy_states[index]; |
| 1038 | int rc = -EBUSY; | 1110 | int rc = -EBUSY; |
| 1039 | 1111 | ||
| 1112 | /* Do this first for message macros */ | ||
| 1113 | memset(fs, 0, sizeof(*fs)); | ||
| 1114 | fs->mdev = mdev; | ||
| 1115 | fs->index = index; | ||
| 1116 | |||
| 1040 | /* Check & Request resources */ | 1117 | /* Check & Request resources */ |
| 1041 | if (macio_resource_count(mdev) < 2) { | 1118 | if (macio_resource_count(mdev) < 2) { |
| 1042 | printk(KERN_WARNING "ifd%d: no address for %s\n", | 1119 | swim3_err("%s", "No address in device-tree\n"); |
| 1043 | index, swim->full_name); | ||
| 1044 | return -ENXIO; | 1120 | return -ENXIO; |
| 1045 | } | 1121 | } |
| 1046 | if (macio_irq_count(mdev) < 2) { | 1122 | if (macio_irq_count(mdev) < 1) { |
| 1047 | printk(KERN_WARNING "fd%d: no intrs for device %s\n", | 1123 | swim3_err("%s", "No interrupt in device-tree\n"); |
| 1048 | index, swim->full_name); | 1124 | return -ENXIO; |
| 1049 | } | 1125 | } |
| 1050 | if (macio_request_resource(mdev, 0, "swim3 (mmio)")) { | 1126 | if (macio_request_resource(mdev, 0, "swim3 (mmio)")) { |
| 1051 | printk(KERN_ERR "fd%d: can't request mmio resource for %s\n", | 1127 | swim3_err("%s", "Can't request mmio resource\n"); |
| 1052 | index, swim->full_name); | ||
| 1053 | return -EBUSY; | 1128 | return -EBUSY; |
| 1054 | } | 1129 | } |
| 1055 | if (macio_request_resource(mdev, 1, "swim3 (dma)")) { | 1130 | if (macio_request_resource(mdev, 1, "swim3 (dma)")) { |
| 1056 | printk(KERN_ERR "fd%d: can't request dma resource for %s\n", | 1131 | swim3_err("%s", "Can't request dma resource\n"); |
| 1057 | index, swim->full_name); | ||
| 1058 | macio_release_resource(mdev, 0); | 1132 | macio_release_resource(mdev, 0); |
| 1059 | return -EBUSY; | 1133 | return -EBUSY; |
| 1060 | } | 1134 | } |
| @@ -1063,22 +1137,18 @@ static int swim3_add_device(struct macio_dev *mdev, int index) | |||
| 1063 | if (mdev->media_bay == NULL) | 1137 | if (mdev->media_bay == NULL) |
| 1064 | pmac_call_feature(PMAC_FTR_SWIM3_ENABLE, swim, 0, 1); | 1138 | pmac_call_feature(PMAC_FTR_SWIM3_ENABLE, swim, 0, 1); |
| 1065 | 1139 | ||
| 1066 | memset(fs, 0, sizeof(*fs)); | ||
| 1067 | spin_lock_init(&fs->lock); | ||
| 1068 | fs->state = idle; | 1140 | fs->state = idle; |
| 1069 | fs->swim3 = (struct swim3 __iomem *) | 1141 | fs->swim3 = (struct swim3 __iomem *) |
| 1070 | ioremap(macio_resource_start(mdev, 0), 0x200); | 1142 | ioremap(macio_resource_start(mdev, 0), 0x200); |
| 1071 | if (fs->swim3 == NULL) { | 1143 | if (fs->swim3 == NULL) { |
| 1072 | printk("fd%d: couldn't map registers for %s\n", | 1144 | swim3_err("%s", "Couldn't map mmio registers\n"); |
| 1073 | index, swim->full_name); | ||
| 1074 | rc = -ENOMEM; | 1145 | rc = -ENOMEM; |
| 1075 | goto out_release; | 1146 | goto out_release; |
| 1076 | } | 1147 | } |
| 1077 | fs->dma = (struct dbdma_regs __iomem *) | 1148 | fs->dma = (struct dbdma_regs __iomem *) |
| 1078 | ioremap(macio_resource_start(mdev, 1), 0x200); | 1149 | ioremap(macio_resource_start(mdev, 1), 0x200); |
| 1079 | if (fs->dma == NULL) { | 1150 | if (fs->dma == NULL) { |
| 1080 | printk("fd%d: couldn't map DMA for %s\n", | 1151 | swim3_err("%s", "Couldn't map dma registers\n"); |
| 1081 | index, swim->full_name); | ||
| 1082 | iounmap(fs->swim3); | 1152 | iounmap(fs->swim3); |
| 1083 | rc = -ENOMEM; | 1153 | rc = -ENOMEM; |
| 1084 | goto out_release; | 1154 | goto out_release; |
| @@ -1090,31 +1160,25 @@ static int swim3_add_device(struct macio_dev *mdev, int index) | |||
| 1090 | fs->secpercyl = 36; | 1160 | fs->secpercyl = 36; |
| 1091 | fs->secpertrack = 18; | 1161 | fs->secpertrack = 18; |
| 1092 | fs->total_secs = 2880; | 1162 | fs->total_secs = 2880; |
| 1093 | fs->mdev = mdev; | ||
| 1094 | init_waitqueue_head(&fs->wait); | 1163 | init_waitqueue_head(&fs->wait); |
| 1095 | 1164 | ||
| 1096 | fs->dma_cmd = (struct dbdma_cmd *) DBDMA_ALIGN(fs->dbdma_cmd_space); | 1165 | fs->dma_cmd = (struct dbdma_cmd *) DBDMA_ALIGN(fs->dbdma_cmd_space); |
| 1097 | memset(fs->dma_cmd, 0, 2 * sizeof(struct dbdma_cmd)); | 1166 | memset(fs->dma_cmd, 0, 2 * sizeof(struct dbdma_cmd)); |
| 1098 | st_le16(&fs->dma_cmd[1].command, DBDMA_STOP); | 1167 | st_le16(&fs->dma_cmd[1].command, DBDMA_STOP); |
| 1099 | 1168 | ||
| 1169 | if (mdev->media_bay == NULL || check_media_bay(mdev->media_bay) == MB_FD) | ||
| 1170 | swim3_mb_event(mdev, MB_FD); | ||
| 1171 | |||
| 1100 | if (request_irq(fs->swim3_intr, swim3_interrupt, 0, "SWIM3", fs)) { | 1172 | if (request_irq(fs->swim3_intr, swim3_interrupt, 0, "SWIM3", fs)) { |
| 1101 | printk(KERN_ERR "fd%d: couldn't request irq %d for %s\n", | 1173 | swim3_err("%s", "Couldn't request interrupt\n"); |
| 1102 | index, fs->swim3_intr, swim->full_name); | ||
| 1103 | pmac_call_feature(PMAC_FTR_SWIM3_ENABLE, swim, 0, 0); | 1174 | pmac_call_feature(PMAC_FTR_SWIM3_ENABLE, swim, 0, 0); |
| 1104 | goto out_unmap; | 1175 | goto out_unmap; |
| 1105 | return -EBUSY; | 1176 | return -EBUSY; |
| 1106 | } | 1177 | } |
| 1107 | /* | ||
| 1108 | if (request_irq(fs->dma_intr, fd_dma_interrupt, 0, "SWIM3-dma", fs)) { | ||
| 1109 | printk(KERN_ERR "Couldn't get irq %d for SWIM3 DMA", | ||
| 1110 | fs->dma_intr); | ||
| 1111 | return -EBUSY; | ||
| 1112 | } | ||
| 1113 | */ | ||
| 1114 | 1178 | ||
| 1115 | init_timer(&fs->timeout); | 1179 | init_timer(&fs->timeout); |
| 1116 | 1180 | ||
| 1117 | printk(KERN_INFO "fd%d: SWIM3 floppy controller %s\n", floppy_count, | 1181 | swim3_info("SWIM3 floppy controller %s\n", |
| 1118 | mdev->media_bay ? "in media bay" : ""); | 1182 | mdev->media_bay ? "in media bay" : ""); |
| 1119 | 1183 | ||
| 1120 | return 0; | 1184 | return 0; |
| @@ -1132,41 +1196,42 @@ static int swim3_add_device(struct macio_dev *mdev, int index) | |||
| 1132 | 1196 | ||
| 1133 | static int __devinit swim3_attach(struct macio_dev *mdev, const struct of_device_id *match) | 1197 | static int __devinit swim3_attach(struct macio_dev *mdev, const struct of_device_id *match) |
| 1134 | { | 1198 | { |
| 1135 | int i, rc; | ||
| 1136 | struct gendisk *disk; | 1199 | struct gendisk *disk; |
| 1200 | int index, rc; | ||
| 1201 | |||
| 1202 | index = floppy_count++; | ||
| 1203 | if (index >= MAX_FLOPPIES) | ||
| 1204 | return -ENXIO; | ||
| 1137 | 1205 | ||
| 1138 | /* Add the drive */ | 1206 | /* Add the drive */ |
| 1139 | rc = swim3_add_device(mdev, floppy_count); | 1207 | rc = swim3_add_device(mdev, index); |
| 1140 | if (rc) | 1208 | if (rc) |
| 1141 | return rc; | 1209 | return rc; |
| 1210 | /* Now register that disk. Same comment about failure handling */ | ||
| 1211 | disk = disks[index] = alloc_disk(1); | ||
| 1212 | if (disk == NULL) | ||
| 1213 | return -ENOMEM; | ||
| 1214 | disk->queue = blk_init_queue(do_fd_request, &swim3_lock); | ||
| 1215 | if (disk->queue == NULL) { | ||
| 1216 | put_disk(disk); | ||
| 1217 | return -ENOMEM; | ||
| 1218 | } | ||
| 1219 | disk->queue->queuedata = &floppy_states[index]; | ||
| 1142 | 1220 | ||
| 1143 | /* Now create the queue if not there yet */ | 1221 | if (index == 0) { |
| 1144 | if (swim3_queue == NULL) { | ||
| 1145 | /* If we failed, there isn't much we can do as the driver is still | 1222 | /* If we failed, there isn't much we can do as the driver is still |
| 1146 | * too dumb to remove the device, just bail out | 1223 | * too dumb to remove the device, just bail out |
| 1147 | */ | 1224 | */ |
| 1148 | if (register_blkdev(FLOPPY_MAJOR, "fd")) | 1225 | if (register_blkdev(FLOPPY_MAJOR, "fd")) |
| 1149 | return 0; | 1226 | return 0; |
| 1150 | swim3_queue = blk_init_queue(do_fd_request, &swim3_lock); | ||
| 1151 | if (swim3_queue == NULL) { | ||
| 1152 | unregister_blkdev(FLOPPY_MAJOR, "fd"); | ||
| 1153 | return 0; | ||
| 1154 | } | ||
| 1155 | } | 1227 | } |
| 1156 | 1228 | ||
| 1157 | /* Now register that disk. Same comment about failure handling */ | ||
| 1158 | i = floppy_count++; | ||
| 1159 | disk = disks[i] = alloc_disk(1); | ||
| 1160 | if (disk == NULL) | ||
| 1161 | return 0; | ||
| 1162 | |||
| 1163 | disk->major = FLOPPY_MAJOR; | 1229 | disk->major = FLOPPY_MAJOR; |
| 1164 | disk->first_minor = i; | 1230 | disk->first_minor = index; |
| 1165 | disk->fops = &floppy_fops; | 1231 | disk->fops = &floppy_fops; |
| 1166 | disk->private_data = &floppy_states[i]; | 1232 | disk->private_data = &floppy_states[index]; |
| 1167 | disk->queue = swim3_queue; | ||
| 1168 | disk->flags |= GENHD_FL_REMOVABLE; | 1233 | disk->flags |= GENHD_FL_REMOVABLE; |
| 1169 | sprintf(disk->disk_name, "fd%d", i); | 1234 | sprintf(disk->disk_name, "fd%d", index); |
| 1170 | set_capacity(disk, 2880); | 1235 | set_capacity(disk, 2880); |
| 1171 | add_disk(disk); | 1236 | add_disk(disk); |
| 1172 | 1237 | ||
| @@ -1194,6 +1259,9 @@ static struct macio_driver swim3_driver = | |||
| 1194 | .of_match_table = swim3_match, | 1259 | .of_match_table = swim3_match, |
| 1195 | }, | 1260 | }, |
| 1196 | .probe = swim3_attach, | 1261 | .probe = swim3_attach, |
| 1262 | #ifdef CONFIG_PMAC_MEDIABAY | ||
| 1263 | .mediabay_event = swim3_mb_event, | ||
| 1264 | #endif | ||
| 1197 | #if 0 | 1265 | #if 0 |
| 1198 | .suspend = swim3_suspend, | 1266 | .suspend = swim3_suspend, |
| 1199 | .resume = swim3_resume, | 1267 | .resume = swim3_resume, |
diff --git a/drivers/bluetooth/Kconfig b/drivers/bluetooth/Kconfig index 11b41fd40c2..5ccf142ef0b 100644 --- a/drivers/bluetooth/Kconfig +++ b/drivers/bluetooth/Kconfig | |||
| @@ -188,7 +188,7 @@ config BT_MRVL | |||
| 188 | The core driver to support Marvell Bluetooth devices. | 188 | The core driver to support Marvell Bluetooth devices. |
| 189 | 189 | ||
| 190 | This driver is required if you want to support | 190 | This driver is required if you want to support |
| 191 | Marvell Bluetooth devices, such as 8688/8787. | 191 | Marvell Bluetooth devices, such as 8688/8787/8797. |
| 192 | 192 | ||
| 193 | Say Y here to compile Marvell Bluetooth driver | 193 | Say Y here to compile Marvell Bluetooth driver |
| 194 | into the kernel or say M to compile it as module. | 194 | into the kernel or say M to compile it as module. |
| @@ -201,8 +201,8 @@ config BT_MRVL_SDIO | |||
| 201 | The driver for Marvell Bluetooth chipsets with SDIO interface. | 201 | The driver for Marvell Bluetooth chipsets with SDIO interface. |
| 202 | 202 | ||
| 203 | This driver is required if you want to use Marvell Bluetooth | 203 | This driver is required if you want to use Marvell Bluetooth |
| 204 | devices with SDIO interface. Currently SD8688/SD8787 chipsets are | 204 | devices with SDIO interface. Currently SD8688/SD8787/SD8797 |
| 205 | supported. | 205 | chipsets are supported. |
| 206 | 206 | ||
| 207 | Say Y here to compile support for Marvell BT-over-SDIO driver | 207 | Say Y here to compile support for Marvell BT-over-SDIO driver |
| 208 | into the kernel or say M to compile it as module. | 208 | into the kernel or say M to compile it as module. |
diff --git a/drivers/bluetooth/btmrvl_sdio.c b/drivers/bluetooth/btmrvl_sdio.c index 9ef48167e2c..27b74b0d547 100644 --- a/drivers/bluetooth/btmrvl_sdio.c +++ b/drivers/bluetooth/btmrvl_sdio.c | |||
| @@ -65,7 +65,7 @@ static const struct btmrvl_sdio_card_reg btmrvl_reg_8688 = { | |||
| 65 | .io_port_1 = 0x01, | 65 | .io_port_1 = 0x01, |
| 66 | .io_port_2 = 0x02, | 66 | .io_port_2 = 0x02, |
| 67 | }; | 67 | }; |
| 68 | static const struct btmrvl_sdio_card_reg btmrvl_reg_8787 = { | 68 | static const struct btmrvl_sdio_card_reg btmrvl_reg_87xx = { |
| 69 | .cfg = 0x00, | 69 | .cfg = 0x00, |
| 70 | .host_int_mask = 0x02, | 70 | .host_int_mask = 0x02, |
| 71 | .host_intstatus = 0x03, | 71 | .host_intstatus = 0x03, |
| @@ -92,7 +92,14 @@ static const struct btmrvl_sdio_device btmrvl_sdio_sd8688 = { | |||
| 92 | static const struct btmrvl_sdio_device btmrvl_sdio_sd8787 = { | 92 | static const struct btmrvl_sdio_device btmrvl_sdio_sd8787 = { |
| 93 | .helper = NULL, | 93 | .helper = NULL, |
| 94 | .firmware = "mrvl/sd8787_uapsta.bin", | 94 | .firmware = "mrvl/sd8787_uapsta.bin", |
| 95 | .reg = &btmrvl_reg_8787, | 95 | .reg = &btmrvl_reg_87xx, |
| 96 | .sd_blksz_fw_dl = 256, | ||
| 97 | }; | ||
| 98 | |||
| 99 | static const struct btmrvl_sdio_device btmrvl_sdio_sd8797 = { | ||
| 100 | .helper = NULL, | ||
| 101 | .firmware = "mrvl/sd8797_uapsta.bin", | ||
| 102 | .reg = &btmrvl_reg_87xx, | ||
| 96 | .sd_blksz_fw_dl = 256, | 103 | .sd_blksz_fw_dl = 256, |
| 97 | }; | 104 | }; |
| 98 | 105 | ||
| @@ -103,6 +110,9 @@ static const struct sdio_device_id btmrvl_sdio_ids[] = { | |||
| 103 | /* Marvell SD8787 Bluetooth device */ | 110 | /* Marvell SD8787 Bluetooth device */ |
| 104 | { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, 0x911A), | 111 | { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, 0x911A), |
| 105 | .driver_data = (unsigned long) &btmrvl_sdio_sd8787 }, | 112 | .driver_data = (unsigned long) &btmrvl_sdio_sd8787 }, |
| 113 | /* Marvell SD8797 Bluetooth device */ | ||
| 114 | { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, 0x912A), | ||
| 115 | .driver_data = (unsigned long) &btmrvl_sdio_sd8797 }, | ||
| 106 | 116 | ||
| 107 | { } /* Terminating entry */ | 117 | { } /* Terminating entry */ |
| 108 | }; | 118 | }; |
| @@ -1076,3 +1086,4 @@ MODULE_LICENSE("GPL v2"); | |||
| 1076 | MODULE_FIRMWARE("sd8688_helper.bin"); | 1086 | MODULE_FIRMWARE("sd8688_helper.bin"); |
| 1077 | MODULE_FIRMWARE("sd8688.bin"); | 1087 | MODULE_FIRMWARE("sd8688.bin"); |
| 1078 | MODULE_FIRMWARE("mrvl/sd8787_uapsta.bin"); | 1088 | MODULE_FIRMWARE("mrvl/sd8787_uapsta.bin"); |
| 1089 | MODULE_FIRMWARE("mrvl/sd8797_uapsta.bin"); | ||
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c index fe4ebc375b3..eabc437ce50 100644 --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c | |||
| @@ -777,9 +777,8 @@ skip_waking: | |||
| 777 | usb_mark_last_busy(data->udev); | 777 | usb_mark_last_busy(data->udev); |
| 778 | } | 778 | } |
| 779 | 779 | ||
| 780 | usb_free_urb(urb); | ||
| 781 | |||
| 782 | done: | 780 | done: |
| 781 | usb_free_urb(urb); | ||
| 783 | return err; | 782 | return err; |
| 784 | } | 783 | } |
| 785 | 784 | ||
diff --git a/drivers/char/ipmi/ipmi_watchdog.c b/drivers/char/ipmi/ipmi_watchdog.c index c2917ffad2c..34767a6d7f4 100644 --- a/drivers/char/ipmi/ipmi_watchdog.c +++ b/drivers/char/ipmi/ipmi_watchdog.c | |||
| @@ -139,6 +139,8 @@ | |||
| 139 | #define IPMI_WDOG_SET_TIMER 0x24 | 139 | #define IPMI_WDOG_SET_TIMER 0x24 |
| 140 | #define IPMI_WDOG_GET_TIMER 0x25 | 140 | #define IPMI_WDOG_GET_TIMER 0x25 |
| 141 | 141 | ||
| 142 | #define IPMI_WDOG_TIMER_NOT_INIT_RESP 0x80 | ||
| 143 | |||
| 142 | /* These are here until the real ones get into the watchdog.h interface. */ | 144 | /* These are here until the real ones get into the watchdog.h interface. */ |
| 143 | #ifndef WDIOC_GETTIMEOUT | 145 | #ifndef WDIOC_GETTIMEOUT |
| 144 | #define WDIOC_GETTIMEOUT _IOW(WATCHDOG_IOCTL_BASE, 20, int) | 146 | #define WDIOC_GETTIMEOUT _IOW(WATCHDOG_IOCTL_BASE, 20, int) |
| @@ -596,6 +598,7 @@ static int ipmi_heartbeat(void) | |||
| 596 | struct kernel_ipmi_msg msg; | 598 | struct kernel_ipmi_msg msg; |
| 597 | int rv; | 599 | int rv; |
| 598 | struct ipmi_system_interface_addr addr; | 600 | struct ipmi_system_interface_addr addr; |
| 601 | int timeout_retries = 0; | ||
| 599 | 602 | ||
| 600 | if (ipmi_ignore_heartbeat) | 603 | if (ipmi_ignore_heartbeat) |
| 601 | return 0; | 604 | return 0; |
| @@ -616,6 +619,7 @@ static int ipmi_heartbeat(void) | |||
| 616 | 619 | ||
| 617 | mutex_lock(&heartbeat_lock); | 620 | mutex_lock(&heartbeat_lock); |
| 618 | 621 | ||
| 622 | restart: | ||
| 619 | atomic_set(&heartbeat_tofree, 2); | 623 | atomic_set(&heartbeat_tofree, 2); |
| 620 | 624 | ||
| 621 | /* | 625 | /* |
| @@ -653,7 +657,33 @@ static int ipmi_heartbeat(void) | |||
| 653 | /* Wait for the heartbeat to be sent. */ | 657 | /* Wait for the heartbeat to be sent. */ |
| 654 | wait_for_completion(&heartbeat_wait); | 658 | wait_for_completion(&heartbeat_wait); |
| 655 | 659 | ||
| 656 | if (heartbeat_recv_msg.msg.data[0] != 0) { | 660 | if (heartbeat_recv_msg.msg.data[0] == IPMI_WDOG_TIMER_NOT_INIT_RESP) { |
| 661 | timeout_retries++; | ||
| 662 | if (timeout_retries > 3) { | ||
| 663 | printk(KERN_ERR PFX ": Unable to restore the IPMI" | ||
| 664 | " watchdog's settings, giving up.\n"); | ||
| 665 | rv = -EIO; | ||
| 666 | goto out_unlock; | ||
| 667 | } | ||
| 668 | |||
| 669 | /* | ||
| 670 | * The timer was not initialized, that means the BMC was | ||
| 671 | * probably reset and lost the watchdog information. Attempt | ||
| 672 | * to restore the timer's info. Note that we still hold | ||
| 673 | * the heartbeat lock, to keep a heartbeat from happening | ||
| 674 | * in this process, so must say no heartbeat to avoid a | ||
| 675 | * deadlock on this mutex. | ||
| 676 | */ | ||
| 677 | rv = ipmi_set_timeout(IPMI_SET_TIMEOUT_NO_HB); | ||
| 678 | if (rv) { | ||
| 679 | printk(KERN_ERR PFX ": Unable to send the command to" | ||
| 680 | " set the watchdog's settings, giving up.\n"); | ||
| 681 | goto out_unlock; | ||
| 682 | } | ||
| 683 | |||
| 684 | /* We might need a new heartbeat, so do it now */ | ||
| 685 | goto restart; | ||
| 686 | } else if (heartbeat_recv_msg.msg.data[0] != 0) { | ||
| 657 | /* | 687 | /* |
| 658 | * Got an error in the heartbeat response. It was already | 688 | * Got an error in the heartbeat response. It was already |
| 659 | * reported in ipmi_wdog_msg_handler, but we should return | 689 | * reported in ipmi_wdog_msg_handler, but we should return |
| @@ -662,6 +692,7 @@ static int ipmi_heartbeat(void) | |||
| 662 | rv = -EINVAL; | 692 | rv = -EINVAL; |
| 663 | } | 693 | } |
| 664 | 694 | ||
| 695 | out_unlock: | ||
| 665 | mutex_unlock(&heartbeat_lock); | 696 | mutex_unlock(&heartbeat_lock); |
| 666 | 697 | ||
| 667 | return rv; | 698 | return rv; |
| @@ -922,11 +953,15 @@ static struct miscdevice ipmi_wdog_miscdev = { | |||
| 922 | static void ipmi_wdog_msg_handler(struct ipmi_recv_msg *msg, | 953 | static void ipmi_wdog_msg_handler(struct ipmi_recv_msg *msg, |
| 923 | void *handler_data) | 954 | void *handler_data) |
| 924 | { | 955 | { |
| 925 | if (msg->msg.data[0] != 0) { | 956 | if (msg->msg.cmd == IPMI_WDOG_RESET_TIMER && |
| 957 | msg->msg.data[0] == IPMI_WDOG_TIMER_NOT_INIT_RESP) | ||
| 958 | printk(KERN_INFO PFX "response: The IPMI controller appears" | ||
| 959 | " to have been reset, will attempt to reinitialize" | ||
| 960 | " the watchdog timer\n"); | ||
| 961 | else if (msg->msg.data[0] != 0) | ||
| 926 | printk(KERN_ERR PFX "response: Error %x on cmd %x\n", | 962 | printk(KERN_ERR PFX "response: Error %x on cmd %x\n", |
| 927 | msg->msg.data[0], | 963 | msg->msg.data[0], |
| 928 | msg->msg.cmd); | 964 | msg->msg.cmd); |
| 929 | } | ||
| 930 | 965 | ||
| 931 | ipmi_free_recv_msg(msg); | 966 | ipmi_free_recv_msg(msg); |
| 932 | } | 967 | } |
diff --git a/drivers/firmware/iscsi_ibft.c b/drivers/firmware/iscsi_ibft.c index c811cb10790..2cce44a1d7d 100644 --- a/drivers/firmware/iscsi_ibft.c +++ b/drivers/firmware/iscsi_ibft.c | |||
| @@ -746,6 +746,37 @@ static void __exit ibft_exit(void) | |||
| 746 | ibft_cleanup(); | 746 | ibft_cleanup(); |
| 747 | } | 747 | } |
| 748 | 748 | ||
| 749 | #ifdef CONFIG_ACPI | ||
| 750 | static const struct { | ||
| 751 | char *sign; | ||
| 752 | } ibft_signs[] = { | ||
| 753 | /* | ||
| 754 | * One spec says "IBFT", the other says "iBFT". We have to check | ||
| 755 | * for both. | ||
| 756 | */ | ||
| 757 | { ACPI_SIG_IBFT }, | ||
| 758 | { "iBFT" }, | ||
| 759 | }; | ||
| 760 | |||
| 761 | static void __init acpi_find_ibft_region(void) | ||
| 762 | { | ||
| 763 | int i; | ||
| 764 | struct acpi_table_header *table = NULL; | ||
| 765 | |||
| 766 | if (acpi_disabled) | ||
| 767 | return; | ||
| 768 | |||
| 769 | for (i = 0; i < ARRAY_SIZE(ibft_signs) && !ibft_addr; i++) { | ||
| 770 | acpi_get_table(ibft_signs[i].sign, 0, &table); | ||
| 771 | ibft_addr = (struct acpi_table_ibft *)table; | ||
| 772 | } | ||
| 773 | } | ||
| 774 | #else | ||
| 775 | static void __init acpi_find_ibft_region(void) | ||
| 776 | { | ||
| 777 | } | ||
| 778 | #endif | ||
| 779 | |||
| 749 | /* | 780 | /* |
| 750 | * ibft_init() - creates sysfs tree entries for the iBFT data. | 781 | * ibft_init() - creates sysfs tree entries for the iBFT data. |
| 751 | */ | 782 | */ |
| @@ -753,9 +784,16 @@ static int __init ibft_init(void) | |||
| 753 | { | 784 | { |
| 754 | int rc = 0; | 785 | int rc = 0; |
| 755 | 786 | ||
| 787 | /* | ||
| 788 | As on UEFI systems the setup_arch()/find_ibft_region() | ||
| 789 | is called before ACPI tables are parsed and it only does | ||
| 790 | legacy finding. | ||
| 791 | */ | ||
| 792 | if (!ibft_addr) | ||
| 793 | acpi_find_ibft_region(); | ||
| 794 | |||
| 756 | if (ibft_addr) { | 795 | if (ibft_addr) { |
| 757 | printk(KERN_INFO "iBFT detected at 0x%llx.\n", | 796 | pr_info("iBFT detected.\n"); |
| 758 | (u64)isa_virt_to_bus(ibft_addr)); | ||
| 759 | 797 | ||
| 760 | rc = ibft_check_device(); | 798 | rc = ibft_check_device(); |
| 761 | if (rc) | 799 | if (rc) |
diff --git a/drivers/firmware/iscsi_ibft_find.c b/drivers/firmware/iscsi_ibft_find.c index bfe723266fd..4da4eb9ae92 100644 --- a/drivers/firmware/iscsi_ibft_find.c +++ b/drivers/firmware/iscsi_ibft_find.c | |||
| @@ -45,13 +45,6 @@ EXPORT_SYMBOL_GPL(ibft_addr); | |||
| 45 | static const struct { | 45 | static const struct { |
| 46 | char *sign; | 46 | char *sign; |
| 47 | } ibft_signs[] = { | 47 | } ibft_signs[] = { |
| 48 | #ifdef CONFIG_ACPI | ||
| 49 | /* | ||
| 50 | * One spec says "IBFT", the other says "iBFT". We have to check | ||
| 51 | * for both. | ||
| 52 | */ | ||
| 53 | { ACPI_SIG_IBFT }, | ||
| 54 | #endif | ||
| 55 | { "iBFT" }, | 48 | { "iBFT" }, |
| 56 | { "BIFT" }, /* Broadcom iSCSI Offload */ | 49 | { "BIFT" }, /* Broadcom iSCSI Offload */ |
| 57 | }; | 50 | }; |
| @@ -62,14 +55,6 @@ static const struct { | |||
| 62 | #define VGA_MEM 0xA0000 /* VGA buffer */ | 55 | #define VGA_MEM 0xA0000 /* VGA buffer */ |
| 63 | #define VGA_SIZE 0x20000 /* 128kB */ | 56 | #define VGA_SIZE 0x20000 /* 128kB */ |
| 64 | 57 | ||
| 65 | #ifdef CONFIG_ACPI | ||
| 66 | static int __init acpi_find_ibft(struct acpi_table_header *header) | ||
| 67 | { | ||
| 68 | ibft_addr = (struct acpi_table_ibft *)header; | ||
| 69 | return 0; | ||
| 70 | } | ||
| 71 | #endif /* CONFIG_ACPI */ | ||
| 72 | |||
| 73 | static int __init find_ibft_in_mem(void) | 58 | static int __init find_ibft_in_mem(void) |
| 74 | { | 59 | { |
| 75 | unsigned long pos; | 60 | unsigned long pos; |
| @@ -94,6 +79,7 @@ static int __init find_ibft_in_mem(void) | |||
| 94 | * the table cannot be valid. */ | 79 | * the table cannot be valid. */ |
| 95 | if (pos + len <= (IBFT_END-1)) { | 80 | if (pos + len <= (IBFT_END-1)) { |
| 96 | ibft_addr = (struct acpi_table_ibft *)virt; | 81 | ibft_addr = (struct acpi_table_ibft *)virt; |
| 82 | pr_info("iBFT found at 0x%lx.\n", pos); | ||
| 97 | goto done; | 83 | goto done; |
| 98 | } | 84 | } |
| 99 | } | 85 | } |
| @@ -108,20 +94,12 @@ done: | |||
| 108 | */ | 94 | */ |
| 109 | unsigned long __init find_ibft_region(unsigned long *sizep) | 95 | unsigned long __init find_ibft_region(unsigned long *sizep) |
| 110 | { | 96 | { |
| 111 | #ifdef CONFIG_ACPI | ||
| 112 | int i; | ||
| 113 | #endif | ||
| 114 | ibft_addr = NULL; | 97 | ibft_addr = NULL; |
| 115 | 98 | ||
| 116 | #ifdef CONFIG_ACPI | ||
| 117 | for (i = 0; i < ARRAY_SIZE(ibft_signs) && !ibft_addr; i++) | ||
| 118 | acpi_table_parse(ibft_signs[i].sign, acpi_find_ibft); | ||
| 119 | #endif /* CONFIG_ACPI */ | ||
| 120 | |||
| 121 | /* iBFT 1.03 section 1.4.3.1 mandates that UEFI machines will | 99 | /* iBFT 1.03 section 1.4.3.1 mandates that UEFI machines will |
| 122 | * only use ACPI for this */ | 100 | * only use ACPI for this */ |
| 123 | 101 | ||
| 124 | if (!ibft_addr && !efi_enabled) | 102 | if (!efi_enabled) |
| 125 | find_ibft_in_mem(); | 103 | find_ibft_in_mem(); |
| 126 | 104 | ||
| 127 | if (ibft_addr) { | 105 | if (ibft_addr) { |
diff --git a/drivers/gpio/gpio-da9052.c b/drivers/gpio/gpio-da9052.c index 038f5eb8b13..f8ce29ef9f8 100644 --- a/drivers/gpio/gpio-da9052.c +++ b/drivers/gpio/gpio-da9052.c | |||
| @@ -22,7 +22,6 @@ | |||
| 22 | #include <linux/mfd/da9052/da9052.h> | 22 | #include <linux/mfd/da9052/da9052.h> |
| 23 | #include <linux/mfd/da9052/reg.h> | 23 | #include <linux/mfd/da9052/reg.h> |
| 24 | #include <linux/mfd/da9052/pdata.h> | 24 | #include <linux/mfd/da9052/pdata.h> |
| 25 | #include <linux/mfd/da9052/gpio.h> | ||
| 26 | 25 | ||
| 27 | #define DA9052_INPUT 1 | 26 | #define DA9052_INPUT 1 |
| 28 | #define DA9052_OUTPUT_OPENDRAIN 2 | 27 | #define DA9052_OUTPUT_OPENDRAIN 2 |
| @@ -43,6 +42,9 @@ | |||
| 43 | #define DA9052_GPIO_MASK_UPPER_NIBBLE 0xF0 | 42 | #define DA9052_GPIO_MASK_UPPER_NIBBLE 0xF0 |
| 44 | #define DA9052_GPIO_MASK_LOWER_NIBBLE 0x0F | 43 | #define DA9052_GPIO_MASK_LOWER_NIBBLE 0x0F |
| 45 | #define DA9052_GPIO_NIBBLE_SHIFT 4 | 44 | #define DA9052_GPIO_NIBBLE_SHIFT 4 |
| 45 | #define DA9052_IRQ_GPI0 16 | ||
| 46 | #define DA9052_GPIO_ODD_SHIFT 7 | ||
| 47 | #define DA9052_GPIO_EVEN_SHIFT 3 | ||
| 46 | 48 | ||
| 47 | struct da9052_gpio { | 49 | struct da9052_gpio { |
| 48 | struct da9052 *da9052; | 50 | struct da9052 *da9052; |
| @@ -104,33 +106,26 @@ static int da9052_gpio_get(struct gpio_chip *gc, unsigned offset) | |||
| 104 | static void da9052_gpio_set(struct gpio_chip *gc, unsigned offset, int value) | 106 | static void da9052_gpio_set(struct gpio_chip *gc, unsigned offset, int value) |
| 105 | { | 107 | { |
| 106 | struct da9052_gpio *gpio = to_da9052_gpio(gc); | 108 | struct da9052_gpio *gpio = to_da9052_gpio(gc); |
| 107 | unsigned char register_value = 0; | ||
| 108 | int ret; | 109 | int ret; |
| 109 | 110 | ||
| 110 | if (da9052_gpio_port_odd(offset)) { | 111 | if (da9052_gpio_port_odd(offset)) { |
| 111 | if (value) { | ||
| 112 | register_value = DA9052_GPIO_ODD_PORT_MODE; | ||
| 113 | ret = da9052_reg_update(gpio->da9052, (offset >> 1) + | 112 | ret = da9052_reg_update(gpio->da9052, (offset >> 1) + |
| 114 | DA9052_GPIO_0_1_REG, | 113 | DA9052_GPIO_0_1_REG, |
| 115 | DA9052_GPIO_ODD_PORT_MODE, | 114 | DA9052_GPIO_ODD_PORT_MODE, |
| 116 | register_value); | 115 | value << DA9052_GPIO_ODD_SHIFT); |
| 117 | if (ret != 0) | 116 | if (ret != 0) |
| 118 | dev_err(gpio->da9052->dev, | 117 | dev_err(gpio->da9052->dev, |
| 119 | "Failed to updated gpio odd reg,%d", | 118 | "Failed to updated gpio odd reg,%d", |
| 120 | ret); | 119 | ret); |
| 121 | } | ||
| 122 | } else { | 120 | } else { |
| 123 | if (value) { | ||
| 124 | register_value = DA9052_GPIO_EVEN_PORT_MODE; | ||
| 125 | ret = da9052_reg_update(gpio->da9052, (offset >> 1) + | 121 | ret = da9052_reg_update(gpio->da9052, (offset >> 1) + |
| 126 | DA9052_GPIO_0_1_REG, | 122 | DA9052_GPIO_0_1_REG, |
| 127 | DA9052_GPIO_EVEN_PORT_MODE, | 123 | DA9052_GPIO_EVEN_PORT_MODE, |
| 128 | register_value); | 124 | value << DA9052_GPIO_EVEN_SHIFT); |
| 129 | if (ret != 0) | 125 | if (ret != 0) |
| 130 | dev_err(gpio->da9052->dev, | 126 | dev_err(gpio->da9052->dev, |
| 131 | "Failed to updated gpio even reg,%d", | 127 | "Failed to updated gpio even reg,%d", |
| 132 | ret); | 128 | ret); |
| 133 | } | ||
| 134 | } | 129 | } |
| 135 | } | 130 | } |
| 136 | 131 | ||
| @@ -201,9 +196,9 @@ static struct gpio_chip reference_gp __devinitdata = { | |||
| 201 | .direction_input = da9052_gpio_direction_input, | 196 | .direction_input = da9052_gpio_direction_input, |
| 202 | .direction_output = da9052_gpio_direction_output, | 197 | .direction_output = da9052_gpio_direction_output, |
| 203 | .to_irq = da9052_gpio_to_irq, | 198 | .to_irq = da9052_gpio_to_irq, |
| 204 | .can_sleep = 1; | 199 | .can_sleep = 1, |
| 205 | .ngpio = 16; | 200 | .ngpio = 16, |
| 206 | .base = -1; | 201 | .base = -1, |
| 207 | }; | 202 | }; |
| 208 | 203 | ||
| 209 | static int __devinit da9052_gpio_probe(struct platform_device *pdev) | 204 | static int __devinit da9052_gpio_probe(struct platform_device *pdev) |
diff --git a/drivers/gpio/gpio-ml-ioh.c b/drivers/gpio/gpio-ml-ioh.c index ea8e7386925..461958fc226 100644 --- a/drivers/gpio/gpio-ml-ioh.c +++ b/drivers/gpio/gpio-ml-ioh.c | |||
| @@ -332,6 +332,34 @@ static void ioh_irq_mask(struct irq_data *d) | |||
| 332 | &chip->reg->regs[chip->ch].imask); | 332 | &chip->reg->regs[chip->ch].imask); |
| 333 | } | 333 | } |
| 334 | 334 | ||
| 335 | static void ioh_irq_disable(struct irq_data *d) | ||
| 336 | { | ||
| 337 | struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); | ||
| 338 | struct ioh_gpio *chip = gc->private; | ||
| 339 | unsigned long flags; | ||
| 340 | u32 ien; | ||
| 341 | |||
| 342 | spin_lock_irqsave(&chip->spinlock, flags); | ||
| 343 | ien = ioread32(&chip->reg->regs[chip->ch].ien); | ||
| 344 | ien &= ~(1 << (d->irq - chip->irq_base)); | ||
| 345 | iowrite32(ien, &chip->reg->regs[chip->ch].ien); | ||
| 346 | spin_unlock_irqrestore(&chip->spinlock, flags); | ||
| 347 | } | ||
| 348 | |||
| 349 | static void ioh_irq_enable(struct irq_data *d) | ||
| 350 | { | ||
| 351 | struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); | ||
| 352 | struct ioh_gpio *chip = gc->private; | ||
| 353 | unsigned long flags; | ||
| 354 | u32 ien; | ||
| 355 | |||
| 356 | spin_lock_irqsave(&chip->spinlock, flags); | ||
| 357 | ien = ioread32(&chip->reg->regs[chip->ch].ien); | ||
| 358 | ien |= 1 << (d->irq - chip->irq_base); | ||
| 359 | iowrite32(ien, &chip->reg->regs[chip->ch].ien); | ||
| 360 | spin_unlock_irqrestore(&chip->spinlock, flags); | ||
| 361 | } | ||
| 362 | |||
| 335 | static irqreturn_t ioh_gpio_handler(int irq, void *dev_id) | 363 | static irqreturn_t ioh_gpio_handler(int irq, void *dev_id) |
| 336 | { | 364 | { |
| 337 | struct ioh_gpio *chip = dev_id; | 365 | struct ioh_gpio *chip = dev_id; |
| @@ -339,7 +367,7 @@ static irqreturn_t ioh_gpio_handler(int irq, void *dev_id) | |||
| 339 | int i, j; | 367 | int i, j; |
| 340 | int ret = IRQ_NONE; | 368 | int ret = IRQ_NONE; |
| 341 | 369 | ||
| 342 | for (i = 0; i < 8; i++) { | 370 | for (i = 0; i < 8; i++, chip++) { |
| 343 | reg_val = ioread32(&chip->reg->regs[i].istatus); | 371 | reg_val = ioread32(&chip->reg->regs[i].istatus); |
| 344 | for (j = 0; j < num_ports[i]; j++) { | 372 | for (j = 0; j < num_ports[i]; j++) { |
| 345 | if (reg_val & BIT(j)) { | 373 | if (reg_val & BIT(j)) { |
| @@ -370,6 +398,8 @@ static __devinit void ioh_gpio_alloc_generic_chip(struct ioh_gpio *chip, | |||
| 370 | ct->chip.irq_mask = ioh_irq_mask; | 398 | ct->chip.irq_mask = ioh_irq_mask; |
| 371 | ct->chip.irq_unmask = ioh_irq_unmask; | 399 | ct->chip.irq_unmask = ioh_irq_unmask; |
| 372 | ct->chip.irq_set_type = ioh_irq_type; | 400 | ct->chip.irq_set_type = ioh_irq_type; |
| 401 | ct->chip.irq_disable = ioh_irq_disable; | ||
| 402 | ct->chip.irq_enable = ioh_irq_enable; | ||
| 373 | 403 | ||
| 374 | irq_setup_generic_chip(gc, IRQ_MSK(num), IRQ_GC_INIT_MASK_CACHE, | 404 | irq_setup_generic_chip(gc, IRQ_MSK(num), IRQ_GC_INIT_MASK_CACHE, |
| 375 | IRQ_NOREQUEST | IRQ_NOPROBE, 0); | 405 | IRQ_NOREQUEST | IRQ_NOPROBE, 0); |
diff --git a/drivers/gpio/gpio-mpc8xxx.c b/drivers/gpio/gpio-mpc8xxx.c index ec3fcf0a7e1..5cd04b65c55 100644 --- a/drivers/gpio/gpio-mpc8xxx.c +++ b/drivers/gpio/gpio-mpc8xxx.c | |||
| @@ -132,6 +132,15 @@ static int mpc8xxx_gpio_dir_out(struct gpio_chip *gc, unsigned int gpio, int val | |||
| 132 | return 0; | 132 | return 0; |
| 133 | } | 133 | } |
| 134 | 134 | ||
| 135 | static int mpc5121_gpio_dir_out(struct gpio_chip *gc, unsigned int gpio, int val) | ||
| 136 | { | ||
| 137 | /* GPIO 28..31 are input only on MPC5121 */ | ||
| 138 | if (gpio >= 28) | ||
| 139 | return -EINVAL; | ||
| 140 | |||
| 141 | return mpc8xxx_gpio_dir_out(gc, gpio, val); | ||
| 142 | } | ||
| 143 | |||
| 135 | static int mpc8xxx_gpio_to_irq(struct gpio_chip *gc, unsigned offset) | 144 | static int mpc8xxx_gpio_to_irq(struct gpio_chip *gc, unsigned offset) |
| 136 | { | 145 | { |
| 137 | struct of_mm_gpio_chip *mm = to_of_mm_gpio_chip(gc); | 146 | struct of_mm_gpio_chip *mm = to_of_mm_gpio_chip(gc); |
| @@ -340,11 +349,10 @@ static void __init mpc8xxx_add_controller(struct device_node *np) | |||
| 340 | mm_gc->save_regs = mpc8xxx_gpio_save_regs; | 349 | mm_gc->save_regs = mpc8xxx_gpio_save_regs; |
| 341 | gc->ngpio = MPC8XXX_GPIO_PINS; | 350 | gc->ngpio = MPC8XXX_GPIO_PINS; |
| 342 | gc->direction_input = mpc8xxx_gpio_dir_in; | 351 | gc->direction_input = mpc8xxx_gpio_dir_in; |
| 343 | gc->direction_output = mpc8xxx_gpio_dir_out; | 352 | gc->direction_output = of_device_is_compatible(np, "fsl,mpc5121-gpio") ? |
| 344 | if (of_device_is_compatible(np, "fsl,mpc8572-gpio")) | 353 | mpc5121_gpio_dir_out : mpc8xxx_gpio_dir_out; |
| 345 | gc->get = mpc8572_gpio_get; | 354 | gc->get = of_device_is_compatible(np, "fsl,mpc8572-gpio") ? |
| 346 | else | 355 | mpc8572_gpio_get : mpc8xxx_gpio_get; |
| 347 | gc->get = mpc8xxx_gpio_get; | ||
| 348 | gc->set = mpc8xxx_gpio_set; | 356 | gc->set = mpc8xxx_gpio_set; |
| 349 | gc->to_irq = mpc8xxx_gpio_to_irq; | 357 | gc->to_irq = mpc8xxx_gpio_to_irq; |
| 350 | 358 | ||
diff --git a/drivers/gpio/gpio-pl061.c b/drivers/gpio/gpio-pl061.c index 093c90bd3c1..4102f63230f 100644 --- a/drivers/gpio/gpio-pl061.c +++ b/drivers/gpio/gpio-pl061.c | |||
| @@ -238,10 +238,6 @@ static int pl061_probe(struct amba_device *dev, const struct amba_id *id) | |||
| 238 | int ret, irq, i; | 238 | int ret, irq, i; |
| 239 | static DECLARE_BITMAP(init_irq, NR_IRQS); | 239 | static DECLARE_BITMAP(init_irq, NR_IRQS); |
| 240 | 240 | ||
| 241 | pdata = dev->dev.platform_data; | ||
| 242 | if (pdata == NULL) | ||
| 243 | return -ENODEV; | ||
| 244 | |||
| 245 | chip = kzalloc(sizeof(*chip), GFP_KERNEL); | 241 | chip = kzalloc(sizeof(*chip), GFP_KERNEL); |
| 246 | if (chip == NULL) | 242 | if (chip == NULL) |
| 247 | return -ENOMEM; | 243 | return -ENOMEM; |
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index d09a6e02dc9..004b048c519 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c | |||
| @@ -62,6 +62,7 @@ static int i915_capabilities(struct seq_file *m, void *data) | |||
| 62 | const struct intel_device_info *info = INTEL_INFO(dev); | 62 | const struct intel_device_info *info = INTEL_INFO(dev); |
| 63 | 63 | ||
| 64 | seq_printf(m, "gen: %d\n", info->gen); | 64 | seq_printf(m, "gen: %d\n", info->gen); |
| 65 | seq_printf(m, "pch: %d\n", INTEL_PCH_TYPE(dev)); | ||
| 65 | #define B(x) seq_printf(m, #x ": %s\n", yesno(info->x)) | 66 | #define B(x) seq_printf(m, #x ": %s\n", yesno(info->x)) |
| 66 | B(is_mobile); | 67 | B(is_mobile); |
| 67 | B(is_i85x); | 68 | B(is_i85x); |
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index a9533c54c93..a9ae374861e 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c | |||
| @@ -1454,6 +1454,14 @@ unsigned long i915_chipset_val(struct drm_i915_private *dev_priv) | |||
| 1454 | 1454 | ||
| 1455 | diff1 = now - dev_priv->last_time1; | 1455 | diff1 = now - dev_priv->last_time1; |
| 1456 | 1456 | ||
| 1457 | /* Prevent division-by-zero if we are asking too fast. | ||
| 1458 | * Also, we don't get interesting results if we are polling | ||
| 1459 | * faster than once in 10ms, so just return the saved value | ||
| 1460 | * in such cases. | ||
| 1461 | */ | ||
| 1462 | if (diff1 <= 10) | ||
| 1463 | return dev_priv->chipset_power; | ||
| 1464 | |||
| 1457 | count1 = I915_READ(DMIEC); | 1465 | count1 = I915_READ(DMIEC); |
| 1458 | count2 = I915_READ(DDREC); | 1466 | count2 = I915_READ(DDREC); |
| 1459 | count3 = I915_READ(CSIEC); | 1467 | count3 = I915_READ(CSIEC); |
| @@ -1484,6 +1492,8 @@ unsigned long i915_chipset_val(struct drm_i915_private *dev_priv) | |||
| 1484 | dev_priv->last_count1 = total_count; | 1492 | dev_priv->last_count1 = total_count; |
| 1485 | dev_priv->last_time1 = now; | 1493 | dev_priv->last_time1 = now; |
| 1486 | 1494 | ||
| 1495 | dev_priv->chipset_power = ret; | ||
| 1496 | |||
| 1487 | return ret; | 1497 | return ret; |
| 1488 | } | 1498 | } |
| 1489 | 1499 | ||
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 15bfa9145d2..a1103fc6597 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c | |||
| @@ -58,15 +58,15 @@ module_param_named(powersave, i915_powersave, int, 0600); | |||
| 58 | MODULE_PARM_DESC(powersave, | 58 | MODULE_PARM_DESC(powersave, |
| 59 | "Enable powersavings, fbc, downclocking, etc. (default: true)"); | 59 | "Enable powersavings, fbc, downclocking, etc. (default: true)"); |
| 60 | 60 | ||
| 61 | unsigned int i915_semaphores __read_mostly = 0; | 61 | int i915_semaphores __read_mostly = -1; |
| 62 | module_param_named(semaphores, i915_semaphores, int, 0600); | 62 | module_param_named(semaphores, i915_semaphores, int, 0600); |
| 63 | MODULE_PARM_DESC(semaphores, | 63 | MODULE_PARM_DESC(semaphores, |
| 64 | "Use semaphores for inter-ring sync (default: false)"); | 64 | "Use semaphores for inter-ring sync (default: -1 (use per-chip defaults))"); |
| 65 | 65 | ||
| 66 | unsigned int i915_enable_rc6 __read_mostly = 0; | 66 | int i915_enable_rc6 __read_mostly = -1; |
| 67 | module_param_named(i915_enable_rc6, i915_enable_rc6, int, 0600); | 67 | module_param_named(i915_enable_rc6, i915_enable_rc6, int, 0600); |
| 68 | MODULE_PARM_DESC(i915_enable_rc6, | 68 | MODULE_PARM_DESC(i915_enable_rc6, |
| 69 | "Enable power-saving render C-state 6 (default: true)"); | 69 | "Enable power-saving render C-state 6 (default: -1 (use per-chip default)"); |
| 70 | 70 | ||
| 71 | int i915_enable_fbc __read_mostly = -1; | 71 | int i915_enable_fbc __read_mostly = -1; |
| 72 | module_param_named(i915_enable_fbc, i915_enable_fbc, int, 0600); | 72 | module_param_named(i915_enable_fbc, i915_enable_fbc, int, 0600); |
| @@ -328,7 +328,7 @@ void intel_detect_pch(struct drm_device *dev) | |||
| 328 | } | 328 | } |
| 329 | } | 329 | } |
| 330 | 330 | ||
| 331 | static void __gen6_gt_force_wake_get(struct drm_i915_private *dev_priv) | 331 | void __gen6_gt_force_wake_get(struct drm_i915_private *dev_priv) |
| 332 | { | 332 | { |
| 333 | int count; | 333 | int count; |
| 334 | 334 | ||
| @@ -344,6 +344,22 @@ static void __gen6_gt_force_wake_get(struct drm_i915_private *dev_priv) | |||
| 344 | udelay(10); | 344 | udelay(10); |
| 345 | } | 345 | } |
| 346 | 346 | ||
| 347 | void __gen6_gt_force_wake_mt_get(struct drm_i915_private *dev_priv) | ||
| 348 | { | ||
| 349 | int count; | ||
| 350 | |||
| 351 | count = 0; | ||
| 352 | while (count++ < 50 && (I915_READ_NOTRACE(FORCEWAKE_MT_ACK) & 1)) | ||
| 353 | udelay(10); | ||
| 354 | |||
| 355 | I915_WRITE_NOTRACE(FORCEWAKE_MT, (1<<16) | 1); | ||
| 356 | POSTING_READ(FORCEWAKE_MT); | ||
| 357 | |||
| 358 | count = 0; | ||
| 359 | while (count++ < 50 && (I915_READ_NOTRACE(FORCEWAKE_MT_ACK) & 1) == 0) | ||
| 360 | udelay(10); | ||
| 361 | } | ||
| 362 | |||
| 347 | /* | 363 | /* |
| 348 | * Generally this is called implicitly by the register read function. However, | 364 | * Generally this is called implicitly by the register read function. However, |
| 349 | * if some sequence requires the GT to not power down then this function should | 365 | * if some sequence requires the GT to not power down then this function should |
| @@ -356,15 +372,21 @@ void gen6_gt_force_wake_get(struct drm_i915_private *dev_priv) | |||
| 356 | 372 | ||
| 357 | /* Forcewake is atomic in case we get in here without the lock */ | 373 | /* Forcewake is atomic in case we get in here without the lock */ |
| 358 | if (atomic_add_return(1, &dev_priv->forcewake_count) == 1) | 374 | if (atomic_add_return(1, &dev_priv->forcewake_count) == 1) |
| 359 | __gen6_gt_force_wake_get(dev_priv); | 375 | dev_priv->display.force_wake_get(dev_priv); |
| 360 | } | 376 | } |
| 361 | 377 | ||
| 362 | static void __gen6_gt_force_wake_put(struct drm_i915_private *dev_priv) | 378 | void __gen6_gt_force_wake_put(struct drm_i915_private *dev_priv) |
| 363 | { | 379 | { |
| 364 | I915_WRITE_NOTRACE(FORCEWAKE, 0); | 380 | I915_WRITE_NOTRACE(FORCEWAKE, 0); |
| 365 | POSTING_READ(FORCEWAKE); | 381 | POSTING_READ(FORCEWAKE); |
| 366 | } | 382 | } |
| 367 | 383 | ||
| 384 | void __gen6_gt_force_wake_mt_put(struct drm_i915_private *dev_priv) | ||
| 385 | { | ||
| 386 | I915_WRITE_NOTRACE(FORCEWAKE_MT, (1<<16) | 0); | ||
| 387 | POSTING_READ(FORCEWAKE_MT); | ||
| 388 | } | ||
| 389 | |||
| 368 | /* | 390 | /* |
| 369 | * see gen6_gt_force_wake_get() | 391 | * see gen6_gt_force_wake_get() |
| 370 | */ | 392 | */ |
| @@ -373,7 +395,7 @@ void gen6_gt_force_wake_put(struct drm_i915_private *dev_priv) | |||
| 373 | WARN_ON(!mutex_is_locked(&dev_priv->dev->struct_mutex)); | 395 | WARN_ON(!mutex_is_locked(&dev_priv->dev->struct_mutex)); |
| 374 | 396 | ||
| 375 | if (atomic_dec_and_test(&dev_priv->forcewake_count)) | 397 | if (atomic_dec_and_test(&dev_priv->forcewake_count)) |
| 376 | __gen6_gt_force_wake_put(dev_priv); | 398 | dev_priv->display.force_wake_put(dev_priv); |
| 377 | } | 399 | } |
| 378 | 400 | ||
| 379 | void __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv) | 401 | void __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv) |
| @@ -903,8 +925,9 @@ MODULE_LICENSE("GPL and additional rights"); | |||
| 903 | /* We give fast paths for the really cool registers */ | 925 | /* We give fast paths for the really cool registers */ |
| 904 | #define NEEDS_FORCE_WAKE(dev_priv, reg) \ | 926 | #define NEEDS_FORCE_WAKE(dev_priv, reg) \ |
| 905 | (((dev_priv)->info->gen >= 6) && \ | 927 | (((dev_priv)->info->gen >= 6) && \ |
| 906 | ((reg) < 0x40000) && \ | 928 | ((reg) < 0x40000) && \ |
| 907 | ((reg) != FORCEWAKE)) | 929 | ((reg) != FORCEWAKE) && \ |
| 930 | ((reg) != ECOBUS)) | ||
| 908 | 931 | ||
| 909 | #define __i915_read(x, y) \ | 932 | #define __i915_read(x, y) \ |
| 910 | u##x i915_read##x(struct drm_i915_private *dev_priv, u32 reg) { \ | 933 | u##x i915_read##x(struct drm_i915_private *dev_priv, u32 reg) { \ |
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 4a9c1b97980..554bef7a3b9 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
| @@ -107,6 +107,7 @@ struct opregion_header; | |||
| 107 | struct opregion_acpi; | 107 | struct opregion_acpi; |
| 108 | struct opregion_swsci; | 108 | struct opregion_swsci; |
| 109 | struct opregion_asle; | 109 | struct opregion_asle; |
| 110 | struct drm_i915_private; | ||
| 110 | 111 | ||
| 111 | struct intel_opregion { | 112 | struct intel_opregion { |
| 112 | struct opregion_header *header; | 113 | struct opregion_header *header; |
| @@ -221,6 +222,8 @@ struct drm_i915_display_funcs { | |||
| 221 | struct drm_i915_gem_object *obj); | 222 | struct drm_i915_gem_object *obj); |
| 222 | int (*update_plane)(struct drm_crtc *crtc, struct drm_framebuffer *fb, | 223 | int (*update_plane)(struct drm_crtc *crtc, struct drm_framebuffer *fb, |
| 223 | int x, int y); | 224 | int x, int y); |
| 225 | void (*force_wake_get)(struct drm_i915_private *dev_priv); | ||
| 226 | void (*force_wake_put)(struct drm_i915_private *dev_priv); | ||
| 224 | /* clock updates for mode set */ | 227 | /* clock updates for mode set */ |
| 225 | /* cursor updates */ | 228 | /* cursor updates */ |
| 226 | /* render clock increase/decrease */ | 229 | /* render clock increase/decrease */ |
| @@ -710,6 +713,7 @@ typedef struct drm_i915_private { | |||
| 710 | 713 | ||
| 711 | u64 last_count1; | 714 | u64 last_count1; |
| 712 | unsigned long last_time1; | 715 | unsigned long last_time1; |
| 716 | unsigned long chipset_power; | ||
| 713 | u64 last_count2; | 717 | u64 last_count2; |
| 714 | struct timespec last_time2; | 718 | struct timespec last_time2; |
| 715 | unsigned long gfx_power; | 719 | unsigned long gfx_power; |
| @@ -998,11 +1002,11 @@ extern int i915_max_ioctl; | |||
| 998 | extern unsigned int i915_fbpercrtc __always_unused; | 1002 | extern unsigned int i915_fbpercrtc __always_unused; |
| 999 | extern int i915_panel_ignore_lid __read_mostly; | 1003 | extern int i915_panel_ignore_lid __read_mostly; |
| 1000 | extern unsigned int i915_powersave __read_mostly; | 1004 | extern unsigned int i915_powersave __read_mostly; |
| 1001 | extern unsigned int i915_semaphores __read_mostly; | 1005 | extern int i915_semaphores __read_mostly; |
| 1002 | extern unsigned int i915_lvds_downclock __read_mostly; | 1006 | extern unsigned int i915_lvds_downclock __read_mostly; |
| 1003 | extern int i915_panel_use_ssc __read_mostly; | 1007 | extern int i915_panel_use_ssc __read_mostly; |
| 1004 | extern int i915_vbt_sdvo_panel_type __read_mostly; | 1008 | extern int i915_vbt_sdvo_panel_type __read_mostly; |
| 1005 | extern unsigned int i915_enable_rc6 __read_mostly; | 1009 | extern int i915_enable_rc6 __read_mostly; |
| 1006 | extern int i915_enable_fbc __read_mostly; | 1010 | extern int i915_enable_fbc __read_mostly; |
| 1007 | extern bool i915_enable_hangcheck __read_mostly; | 1011 | extern bool i915_enable_hangcheck __read_mostly; |
| 1008 | 1012 | ||
| @@ -1308,6 +1312,11 @@ extern void gen6_set_rps(struct drm_device *dev, u8 val); | |||
| 1308 | extern void intel_detect_pch(struct drm_device *dev); | 1312 | extern void intel_detect_pch(struct drm_device *dev); |
| 1309 | extern int intel_trans_dp_port_sel(struct drm_crtc *crtc); | 1313 | extern int intel_trans_dp_port_sel(struct drm_crtc *crtc); |
| 1310 | 1314 | ||
| 1315 | extern void __gen6_gt_force_wake_get(struct drm_i915_private *dev_priv); | ||
| 1316 | extern void __gen6_gt_force_wake_mt_get(struct drm_i915_private *dev_priv); | ||
| 1317 | extern void __gen6_gt_force_wake_put(struct drm_i915_private *dev_priv); | ||
| 1318 | extern void __gen6_gt_force_wake_mt_put(struct drm_i915_private *dev_priv); | ||
| 1319 | |||
| 1311 | /* overlay */ | 1320 | /* overlay */ |
| 1312 | #ifdef CONFIG_DEBUG_FS | 1321 | #ifdef CONFIG_DEBUG_FS |
| 1313 | extern struct intel_overlay_error_state *intel_overlay_capture_error_state(struct drm_device *dev); | 1322 | extern struct intel_overlay_error_state *intel_overlay_capture_error_state(struct drm_device *dev); |
| @@ -1352,8 +1361,9 @@ void __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv); | |||
| 1352 | /* We give fast paths for the really cool registers */ | 1361 | /* We give fast paths for the really cool registers */ |
| 1353 | #define NEEDS_FORCE_WAKE(dev_priv, reg) \ | 1362 | #define NEEDS_FORCE_WAKE(dev_priv, reg) \ |
| 1354 | (((dev_priv)->info->gen >= 6) && \ | 1363 | (((dev_priv)->info->gen >= 6) && \ |
| 1355 | ((reg) < 0x40000) && \ | 1364 | ((reg) < 0x40000) && \ |
| 1356 | ((reg) != FORCEWAKE)) | 1365 | ((reg) != FORCEWAKE) && \ |
| 1366 | ((reg) != ECOBUS)) | ||
| 1357 | 1367 | ||
| 1358 | #define __i915_read(x, y) \ | 1368 | #define __i915_read(x, y) \ |
| 1359 | u##x i915_read##x(struct drm_i915_private *dev_priv, u32 reg); | 1369 | u##x i915_read##x(struct drm_i915_private *dev_priv, u32 reg); |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 60ff1b63b56..8359dc77704 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -2026,13 +2026,8 @@ i915_wait_request(struct intel_ring_buffer *ring, | |||
| 2026 | * to handle this, the waiter on a request often wants an associated | 2026 | * to handle this, the waiter on a request often wants an associated |
| 2027 | * buffer to have made it to the inactive list, and we would need | 2027 | * buffer to have made it to the inactive list, and we would need |
| 2028 | * a separate wait queue to handle that. | 2028 | * a separate wait queue to handle that. |
| 2029 | * | ||
| 2030 | * To avoid a recursion with the ilk VT-d workaround (that calls | ||
| 2031 | * gpu_idle when unbinding objects with interruptible==false) don't | ||
| 2032 | * retire requests in that case (because it might call unbind if the | ||
| 2033 | * active list holds the last reference to the object). | ||
| 2034 | */ | 2029 | */ |
| 2035 | if (ret == 0 && dev_priv->mm.interruptible) | 2030 | if (ret == 0) |
| 2036 | i915_gem_retire_requests_ring(ring); | 2031 | i915_gem_retire_requests_ring(ring); |
| 2037 | 2032 | ||
| 2038 | return ret; | 2033 | return ret; |
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c index 3693e83a97f..c681dc149d2 100644 --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c | |||
| @@ -32,6 +32,7 @@ | |||
| 32 | #include "i915_drv.h" | 32 | #include "i915_drv.h" |
| 33 | #include "i915_trace.h" | 33 | #include "i915_trace.h" |
| 34 | #include "intel_drv.h" | 34 | #include "intel_drv.h" |
| 35 | #include <linux/dma_remapping.h> | ||
| 35 | 36 | ||
| 36 | struct change_domains { | 37 | struct change_domains { |
| 37 | uint32_t invalidate_domains; | 38 | uint32_t invalidate_domains; |
| @@ -746,6 +747,22 @@ i915_gem_execbuffer_flush(struct drm_device *dev, | |||
| 746 | return 0; | 747 | return 0; |
| 747 | } | 748 | } |
| 748 | 749 | ||
| 750 | static bool | ||
| 751 | intel_enable_semaphores(struct drm_device *dev) | ||
| 752 | { | ||
| 753 | if (INTEL_INFO(dev)->gen < 6) | ||
| 754 | return 0; | ||
| 755 | |||
| 756 | if (i915_semaphores >= 0) | ||
| 757 | return i915_semaphores; | ||
| 758 | |||
| 759 | /* Enable semaphores on SNB when IO remapping is off */ | ||
| 760 | if (INTEL_INFO(dev)->gen == 6) | ||
| 761 | return !intel_iommu_enabled; | ||
| 762 | |||
| 763 | return 1; | ||
| 764 | } | ||
| 765 | |||
| 749 | static int | 766 | static int |
| 750 | i915_gem_execbuffer_sync_rings(struct drm_i915_gem_object *obj, | 767 | i915_gem_execbuffer_sync_rings(struct drm_i915_gem_object *obj, |
| 751 | struct intel_ring_buffer *to) | 768 | struct intel_ring_buffer *to) |
| @@ -758,7 +775,7 @@ i915_gem_execbuffer_sync_rings(struct drm_i915_gem_object *obj, | |||
| 758 | return 0; | 775 | return 0; |
| 759 | 776 | ||
| 760 | /* XXX gpu semaphores are implicated in various hard hangs on SNB */ | 777 | /* XXX gpu semaphores are implicated in various hard hangs on SNB */ |
| 761 | if (INTEL_INFO(obj->base.dev)->gen < 6 || !i915_semaphores) | 778 | if (!intel_enable_semaphores(obj->base.dev)) |
| 762 | return i915_gem_object_wait_rendering(obj); | 779 | return i915_gem_object_wait_rendering(obj); |
| 763 | 780 | ||
| 764 | idx = intel_ring_sync_index(from, to); | 781 | idx = intel_ring_sync_index(from, to); |
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index b080cc82400..a26d5b0a369 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
| @@ -3303,10 +3303,10 @@ | |||
| 3303 | /* or SDVOB */ | 3303 | /* or SDVOB */ |
| 3304 | #define HDMIB 0xe1140 | 3304 | #define HDMIB 0xe1140 |
| 3305 | #define PORT_ENABLE (1 << 31) | 3305 | #define PORT_ENABLE (1 << 31) |
| 3306 | #define TRANSCODER_A (0) | 3306 | #define TRANSCODER(pipe) ((pipe) << 30) |
| 3307 | #define TRANSCODER_B (1 << 30) | 3307 | #define TRANSCODER_CPT(pipe) ((pipe) << 29) |
| 3308 | #define TRANSCODER(pipe) ((pipe) << 30) | 3308 | #define TRANSCODER_MASK (1 << 30) |
| 3309 | #define TRANSCODER_MASK (1 << 30) | 3309 | #define TRANSCODER_MASK_CPT (3 << 29) |
| 3310 | #define COLOR_FORMAT_8bpc (0) | 3310 | #define COLOR_FORMAT_8bpc (0) |
| 3311 | #define COLOR_FORMAT_12bpc (3 << 26) | 3311 | #define COLOR_FORMAT_12bpc (3 << 26) |
| 3312 | #define SDVOB_HOTPLUG_ENABLE (1 << 23) | 3312 | #define SDVOB_HOTPLUG_ENABLE (1 << 23) |
| @@ -3447,8 +3447,30 @@ | |||
| 3447 | #define EDP_LINK_TRAIN_800_1200MV_0DB_SNB_B (0x38<<22) | 3447 | #define EDP_LINK_TRAIN_800_1200MV_0DB_SNB_B (0x38<<22) |
| 3448 | #define EDP_LINK_TRAIN_VOL_EMP_MASK_SNB (0x3f<<22) | 3448 | #define EDP_LINK_TRAIN_VOL_EMP_MASK_SNB (0x3f<<22) |
| 3449 | 3449 | ||
| 3450 | /* IVB */ | ||
| 3451 | #define EDP_LINK_TRAIN_400MV_0DB_IVB (0x24 <<22) | ||
| 3452 | #define EDP_LINK_TRAIN_400MV_3_5DB_IVB (0x2a <<22) | ||
| 3453 | #define EDP_LINK_TRAIN_400MV_6DB_IVB (0x2f <<22) | ||
| 3454 | #define EDP_LINK_TRAIN_600MV_0DB_IVB (0x30 <<22) | ||
| 3455 | #define EDP_LINK_TRAIN_600MV_3_5DB_IVB (0x36 <<22) | ||
| 3456 | #define EDP_LINK_TRAIN_800MV_0DB_IVB (0x38 <<22) | ||
| 3457 | #define EDP_LINK_TRAIN_800MV_3_5DB_IVB (0x33 <<22) | ||
| 3458 | |||
| 3459 | /* legacy values */ | ||
| 3460 | #define EDP_LINK_TRAIN_500MV_0DB_IVB (0x00 <<22) | ||
| 3461 | #define EDP_LINK_TRAIN_1000MV_0DB_IVB (0x20 <<22) | ||
| 3462 | #define EDP_LINK_TRAIN_500MV_3_5DB_IVB (0x02 <<22) | ||
| 3463 | #define EDP_LINK_TRAIN_1000MV_3_5DB_IVB (0x22 <<22) | ||
| 3464 | #define EDP_LINK_TRAIN_1000MV_6DB_IVB (0x23 <<22) | ||
| 3465 | |||
| 3466 | #define EDP_LINK_TRAIN_VOL_EMP_MASK_IVB (0x3f<<22) | ||
| 3467 | |||
| 3450 | #define FORCEWAKE 0xA18C | 3468 | #define FORCEWAKE 0xA18C |
| 3451 | #define FORCEWAKE_ACK 0x130090 | 3469 | #define FORCEWAKE_ACK 0x130090 |
| 3470 | #define FORCEWAKE_MT 0xa188 /* multi-threaded */ | ||
| 3471 | #define FORCEWAKE_MT_ACK 0x130040 | ||
| 3472 | #define ECOBUS 0xa180 | ||
| 3473 | #define FORCEWAKE_MT_ENABLE (1<<5) | ||
| 3452 | 3474 | ||
| 3453 | #define GT_FIFO_FREE_ENTRIES 0x120008 | 3475 | #define GT_FIFO_FREE_ENTRIES 0x120008 |
| 3454 | #define GT_FIFO_NUM_RESERVED_ENTRIES 20 | 3476 | #define GT_FIFO_NUM_RESERVED_ENTRIES 20 |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index e77a863a383..d809b038ca8 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -38,8 +38,8 @@ | |||
| 38 | #include "i915_drv.h" | 38 | #include "i915_drv.h" |
| 39 | #include "i915_trace.h" | 39 | #include "i915_trace.h" |
| 40 | #include "drm_dp_helper.h" | 40 | #include "drm_dp_helper.h" |
| 41 | |||
| 42 | #include "drm_crtc_helper.h" | 41 | #include "drm_crtc_helper.h" |
| 42 | #include <linux/dma_remapping.h> | ||
| 43 | 43 | ||
| 44 | #define HAS_eDP (intel_pipe_has_type(crtc, INTEL_OUTPUT_EDP)) | 44 | #define HAS_eDP (intel_pipe_has_type(crtc, INTEL_OUTPUT_EDP)) |
| 45 | 45 | ||
| @@ -4670,6 +4670,7 @@ static inline bool intel_panel_use_ssc(struct drm_i915_private *dev_priv) | |||
| 4670 | /** | 4670 | /** |
| 4671 | * intel_choose_pipe_bpp_dither - figure out what color depth the pipe should send | 4671 | * intel_choose_pipe_bpp_dither - figure out what color depth the pipe should send |
| 4672 | * @crtc: CRTC structure | 4672 | * @crtc: CRTC structure |
| 4673 | * @mode: requested mode | ||
| 4673 | * | 4674 | * |
| 4674 | * A pipe may be connected to one or more outputs. Based on the depth of the | 4675 | * A pipe may be connected to one or more outputs. Based on the depth of the |
| 4675 | * attached framebuffer, choose a good color depth to use on the pipe. | 4676 | * attached framebuffer, choose a good color depth to use on the pipe. |
| @@ -4681,13 +4682,15 @@ static inline bool intel_panel_use_ssc(struct drm_i915_private *dev_priv) | |||
| 4681 | * HDMI supports only 8bpc or 12bpc, so clamp to 8bpc with dither for 10bpc | 4682 | * HDMI supports only 8bpc or 12bpc, so clamp to 8bpc with dither for 10bpc |
| 4682 | * Displays may support a restricted set as well, check EDID and clamp as | 4683 | * Displays may support a restricted set as well, check EDID and clamp as |
| 4683 | * appropriate. | 4684 | * appropriate. |
| 4685 | * DP may want to dither down to 6bpc to fit larger modes | ||
| 4684 | * | 4686 | * |
| 4685 | * RETURNS: | 4687 | * RETURNS: |
| 4686 | * Dithering requirement (i.e. false if display bpc and pipe bpc match, | 4688 | * Dithering requirement (i.e. false if display bpc and pipe bpc match, |
| 4687 | * true if they don't match). | 4689 | * true if they don't match). |
| 4688 | */ | 4690 | */ |
| 4689 | static bool intel_choose_pipe_bpp_dither(struct drm_crtc *crtc, | 4691 | static bool intel_choose_pipe_bpp_dither(struct drm_crtc *crtc, |
| 4690 | unsigned int *pipe_bpp) | 4692 | unsigned int *pipe_bpp, |
| 4693 | struct drm_display_mode *mode) | ||
| 4691 | { | 4694 | { |
| 4692 | struct drm_device *dev = crtc->dev; | 4695 | struct drm_device *dev = crtc->dev; |
| 4693 | struct drm_i915_private *dev_priv = dev->dev_private; | 4696 | struct drm_i915_private *dev_priv = dev->dev_private; |
| @@ -4758,6 +4761,11 @@ static bool intel_choose_pipe_bpp_dither(struct drm_crtc *crtc, | |||
| 4758 | } | 4761 | } |
| 4759 | } | 4762 | } |
| 4760 | 4763 | ||
| 4764 | if (mode->private_flags & INTEL_MODE_DP_FORCE_6BPC) { | ||
| 4765 | DRM_DEBUG_KMS("Dithering DP to 6bpc\n"); | ||
| 4766 | display_bpc = 6; | ||
| 4767 | } | ||
| 4768 | |||
| 4761 | /* | 4769 | /* |
| 4762 | * We could just drive the pipe at the highest bpc all the time and | 4770 | * We could just drive the pipe at the highest bpc all the time and |
| 4763 | * enable dithering as needed, but that costs bandwidth. So choose | 4771 | * enable dithering as needed, but that costs bandwidth. So choose |
| @@ -5019,6 +5027,16 @@ static int i9xx_crtc_mode_set(struct drm_crtc *crtc, | |||
| 5019 | pipeconf &= ~PIPECONF_DOUBLE_WIDE; | 5027 | pipeconf &= ~PIPECONF_DOUBLE_WIDE; |
| 5020 | } | 5028 | } |
| 5021 | 5029 | ||
| 5030 | /* default to 8bpc */ | ||
| 5031 | pipeconf &= ~(PIPECONF_BPP_MASK | PIPECONF_DITHER_EN); | ||
| 5032 | if (is_dp) { | ||
| 5033 | if (mode->private_flags & INTEL_MODE_DP_FORCE_6BPC) { | ||
| 5034 | pipeconf |= PIPECONF_BPP_6 | | ||
| 5035 | PIPECONF_DITHER_EN | | ||
| 5036 | PIPECONF_DITHER_TYPE_SP; | ||
| 5037 | } | ||
| 5038 | } | ||
| 5039 | |||
| 5022 | dpll |= DPLL_VCO_ENABLE; | 5040 | dpll |= DPLL_VCO_ENABLE; |
| 5023 | 5041 | ||
| 5024 | DRM_DEBUG_KMS("Mode for pipe %c:\n", pipe == 0 ? 'A' : 'B'); | 5042 | DRM_DEBUG_KMS("Mode for pipe %c:\n", pipe == 0 ? 'A' : 'B'); |
| @@ -5480,7 +5498,7 @@ static int ironlake_crtc_mode_set(struct drm_crtc *crtc, | |||
| 5480 | /* determine panel color depth */ | 5498 | /* determine panel color depth */ |
| 5481 | temp = I915_READ(PIPECONF(pipe)); | 5499 | temp = I915_READ(PIPECONF(pipe)); |
| 5482 | temp &= ~PIPE_BPC_MASK; | 5500 | temp &= ~PIPE_BPC_MASK; |
| 5483 | dither = intel_choose_pipe_bpp_dither(crtc, &pipe_bpp); | 5501 | dither = intel_choose_pipe_bpp_dither(crtc, &pipe_bpp, mode); |
| 5484 | switch (pipe_bpp) { | 5502 | switch (pipe_bpp) { |
| 5485 | case 18: | 5503 | case 18: |
| 5486 | temp |= PIPE_6BPC; | 5504 | temp |= PIPE_6BPC; |
| @@ -7189,11 +7207,16 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, | |||
| 7189 | work->old_fb_obj = intel_fb->obj; | 7207 | work->old_fb_obj = intel_fb->obj; |
| 7190 | INIT_WORK(&work->work, intel_unpin_work_fn); | 7208 | INIT_WORK(&work->work, intel_unpin_work_fn); |
| 7191 | 7209 | ||
| 7210 | ret = drm_vblank_get(dev, intel_crtc->pipe); | ||
| 7211 | if (ret) | ||
| 7212 | goto free_work; | ||
| 7213 | |||
| 7192 | /* We borrow the event spin lock for protecting unpin_work */ | 7214 | /* We borrow the event spin lock for protecting unpin_work */ |
| 7193 | spin_lock_irqsave(&dev->event_lock, flags); | 7215 | spin_lock_irqsave(&dev->event_lock, flags); |
| 7194 | if (intel_crtc->unpin_work) { | 7216 | if (intel_crtc->unpin_work) { |
| 7195 | spin_unlock_irqrestore(&dev->event_lock, flags); | 7217 | spin_unlock_irqrestore(&dev->event_lock, flags); |
| 7196 | kfree(work); | 7218 | kfree(work); |
| 7219 | drm_vblank_put(dev, intel_crtc->pipe); | ||
| 7197 | 7220 | ||
| 7198 | DRM_DEBUG_DRIVER("flip queue: crtc already busy\n"); | 7221 | DRM_DEBUG_DRIVER("flip queue: crtc already busy\n"); |
| 7199 | return -EBUSY; | 7222 | return -EBUSY; |
| @@ -7212,10 +7235,6 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, | |||
| 7212 | 7235 | ||
| 7213 | crtc->fb = fb; | 7236 | crtc->fb = fb; |
| 7214 | 7237 | ||
| 7215 | ret = drm_vblank_get(dev, intel_crtc->pipe); | ||
| 7216 | if (ret) | ||
| 7217 | goto cleanup_objs; | ||
| 7218 | |||
| 7219 | work->pending_flip_obj = obj; | 7238 | work->pending_flip_obj = obj; |
| 7220 | 7239 | ||
| 7221 | work->enable_stall_check = true; | 7240 | work->enable_stall_check = true; |
| @@ -7238,7 +7257,6 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, | |||
| 7238 | 7257 | ||
| 7239 | cleanup_pending: | 7258 | cleanup_pending: |
| 7240 | atomic_sub(1 << intel_crtc->plane, &work->old_fb_obj->pending_flip); | 7259 | atomic_sub(1 << intel_crtc->plane, &work->old_fb_obj->pending_flip); |
| 7241 | cleanup_objs: | ||
| 7242 | drm_gem_object_unreference(&work->old_fb_obj->base); | 7260 | drm_gem_object_unreference(&work->old_fb_obj->base); |
| 7243 | drm_gem_object_unreference(&obj->base); | 7261 | drm_gem_object_unreference(&obj->base); |
| 7244 | mutex_unlock(&dev->struct_mutex); | 7262 | mutex_unlock(&dev->struct_mutex); |
| @@ -7247,6 +7265,8 @@ cleanup_objs: | |||
| 7247 | intel_crtc->unpin_work = NULL; | 7265 | intel_crtc->unpin_work = NULL; |
| 7248 | spin_unlock_irqrestore(&dev->event_lock, flags); | 7266 | spin_unlock_irqrestore(&dev->event_lock, flags); |
| 7249 | 7267 | ||
| 7268 | drm_vblank_put(dev, intel_crtc->pipe); | ||
| 7269 | free_work: | ||
| 7250 | kfree(work); | 7270 | kfree(work); |
| 7251 | 7271 | ||
| 7252 | return ret; | 7272 | return ret; |
| @@ -7887,6 +7907,33 @@ void intel_init_emon(struct drm_device *dev) | |||
| 7887 | dev_priv->corr = (lcfuse & LCFUSE_HIV_MASK); | 7907 | dev_priv->corr = (lcfuse & LCFUSE_HIV_MASK); |
| 7888 | } | 7908 | } |
| 7889 | 7909 | ||
| 7910 | static bool intel_enable_rc6(struct drm_device *dev) | ||
| 7911 | { | ||
| 7912 | /* | ||
| 7913 | * Respect the kernel parameter if it is set | ||
| 7914 | */ | ||
| 7915 | if (i915_enable_rc6 >= 0) | ||
| 7916 | return i915_enable_rc6; | ||
| 7917 | |||
| 7918 | /* | ||
| 7919 | * Disable RC6 on Ironlake | ||
| 7920 | */ | ||
| 7921 | if (INTEL_INFO(dev)->gen == 5) | ||
| 7922 | return 0; | ||
| 7923 | |||
| 7924 | /* | ||
| 7925 | * Enable rc6 on Sandybridge if DMA remapping is disabled | ||
| 7926 | */ | ||
| 7927 | if (INTEL_INFO(dev)->gen == 6) { | ||
| 7928 | DRM_DEBUG_DRIVER("Sandybridge: intel_iommu_enabled %s -- RC6 %sabled\n", | ||
| 7929 | intel_iommu_enabled ? "true" : "false", | ||
| 7930 | !intel_iommu_enabled ? "en" : "dis"); | ||
| 7931 | return !intel_iommu_enabled; | ||
| 7932 | } | ||
| 7933 | DRM_DEBUG_DRIVER("RC6 enabled\n"); | ||
| 7934 | return 1; | ||
| 7935 | } | ||
| 7936 | |||
| 7890 | void gen6_enable_rps(struct drm_i915_private *dev_priv) | 7937 | void gen6_enable_rps(struct drm_i915_private *dev_priv) |
| 7891 | { | 7938 | { |
| 7892 | u32 rp_state_cap = I915_READ(GEN6_RP_STATE_CAP); | 7939 | u32 rp_state_cap = I915_READ(GEN6_RP_STATE_CAP); |
| @@ -7923,7 +7970,7 @@ void gen6_enable_rps(struct drm_i915_private *dev_priv) | |||
| 7923 | I915_WRITE(GEN6_RC6p_THRESHOLD, 100000); | 7970 | I915_WRITE(GEN6_RC6p_THRESHOLD, 100000); |
| 7924 | I915_WRITE(GEN6_RC6pp_THRESHOLD, 64000); /* unused */ | 7971 | I915_WRITE(GEN6_RC6pp_THRESHOLD, 64000); /* unused */ |
| 7925 | 7972 | ||
| 7926 | if (i915_enable_rc6) | 7973 | if (intel_enable_rc6(dev_priv->dev)) |
| 7927 | rc6_mask = GEN6_RC_CTL_RC6p_ENABLE | | 7974 | rc6_mask = GEN6_RC_CTL_RC6p_ENABLE | |
| 7928 | GEN6_RC_CTL_RC6_ENABLE; | 7975 | GEN6_RC_CTL_RC6_ENABLE; |
| 7929 | 7976 | ||
| @@ -8372,7 +8419,7 @@ void ironlake_enable_rc6(struct drm_device *dev) | |||
| 8372 | /* rc6 disabled by default due to repeated reports of hanging during | 8419 | /* rc6 disabled by default due to repeated reports of hanging during |
| 8373 | * boot and resume. | 8420 | * boot and resume. |
| 8374 | */ | 8421 | */ |
| 8375 | if (!i915_enable_rc6) | 8422 | if (!intel_enable_rc6(dev)) |
| 8376 | return; | 8423 | return; |
| 8377 | 8424 | ||
| 8378 | mutex_lock(&dev->struct_mutex); | 8425 | mutex_lock(&dev->struct_mutex); |
| @@ -8491,6 +8538,28 @@ static void intel_init_display(struct drm_device *dev) | |||
| 8491 | 8538 | ||
| 8492 | /* For FIFO watermark updates */ | 8539 | /* For FIFO watermark updates */ |
| 8493 | if (HAS_PCH_SPLIT(dev)) { | 8540 | if (HAS_PCH_SPLIT(dev)) { |
| 8541 | dev_priv->display.force_wake_get = __gen6_gt_force_wake_get; | ||
| 8542 | dev_priv->display.force_wake_put = __gen6_gt_force_wake_put; | ||
| 8543 | |||
| 8544 | /* IVB configs may use multi-threaded forcewake */ | ||
| 8545 | if (IS_IVYBRIDGE(dev)) { | ||
| 8546 | u32 ecobus; | ||
| 8547 | |||
| 8548 | mutex_lock(&dev->struct_mutex); | ||
| 8549 | __gen6_gt_force_wake_mt_get(dev_priv); | ||
| 8550 | ecobus = I915_READ(ECOBUS); | ||
| 8551 | __gen6_gt_force_wake_mt_put(dev_priv); | ||
| 8552 | mutex_unlock(&dev->struct_mutex); | ||
| 8553 | |||
| 8554 | if (ecobus & FORCEWAKE_MT_ENABLE) { | ||
| 8555 | DRM_DEBUG_KMS("Using MT version of forcewake\n"); | ||
| 8556 | dev_priv->display.force_wake_get = | ||
| 8557 | __gen6_gt_force_wake_mt_get; | ||
| 8558 | dev_priv->display.force_wake_put = | ||
| 8559 | __gen6_gt_force_wake_mt_put; | ||
| 8560 | } | ||
| 8561 | } | ||
| 8562 | |||
| 8494 | if (HAS_PCH_IBX(dev)) | 8563 | if (HAS_PCH_IBX(dev)) |
| 8495 | dev_priv->display.init_pch_clock_gating = ibx_init_clock_gating; | 8564 | dev_priv->display.init_pch_clock_gating = ibx_init_clock_gating; |
| 8496 | else if (HAS_PCH_CPT(dev)) | 8565 | else if (HAS_PCH_CPT(dev)) |
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 4d0358fad93..92b041b66e4 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
| @@ -208,13 +208,15 @@ intel_dp_link_clock(uint8_t link_bw) | |||
| 208 | */ | 208 | */ |
| 209 | 209 | ||
| 210 | static int | 210 | static int |
| 211 | intel_dp_link_required(struct intel_dp *intel_dp, int pixel_clock) | 211 | intel_dp_link_required(struct intel_dp *intel_dp, int pixel_clock, int check_bpp) |
| 212 | { | 212 | { |
| 213 | struct drm_crtc *crtc = intel_dp->base.base.crtc; | 213 | struct drm_crtc *crtc = intel_dp->base.base.crtc; |
| 214 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | 214 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); |
| 215 | int bpp = 24; | 215 | int bpp = 24; |
| 216 | 216 | ||
| 217 | if (intel_crtc) | 217 | if (check_bpp) |
| 218 | bpp = check_bpp; | ||
| 219 | else if (intel_crtc) | ||
| 218 | bpp = intel_crtc->bpp; | 220 | bpp = intel_crtc->bpp; |
| 219 | 221 | ||
| 220 | return (pixel_clock * bpp + 9) / 10; | 222 | return (pixel_clock * bpp + 9) / 10; |
| @@ -233,6 +235,7 @@ intel_dp_mode_valid(struct drm_connector *connector, | |||
| 233 | struct intel_dp *intel_dp = intel_attached_dp(connector); | 235 | struct intel_dp *intel_dp = intel_attached_dp(connector); |
| 234 | int max_link_clock = intel_dp_link_clock(intel_dp_max_link_bw(intel_dp)); | 236 | int max_link_clock = intel_dp_link_clock(intel_dp_max_link_bw(intel_dp)); |
| 235 | int max_lanes = intel_dp_max_lane_count(intel_dp); | 237 | int max_lanes = intel_dp_max_lane_count(intel_dp); |
| 238 | int max_rate, mode_rate; | ||
| 236 | 239 | ||
| 237 | if (is_edp(intel_dp) && intel_dp->panel_fixed_mode) { | 240 | if (is_edp(intel_dp) && intel_dp->panel_fixed_mode) { |
| 238 | if (mode->hdisplay > intel_dp->panel_fixed_mode->hdisplay) | 241 | if (mode->hdisplay > intel_dp->panel_fixed_mode->hdisplay) |
| @@ -242,9 +245,17 @@ intel_dp_mode_valid(struct drm_connector *connector, | |||
| 242 | return MODE_PANEL; | 245 | return MODE_PANEL; |
| 243 | } | 246 | } |
| 244 | 247 | ||
| 245 | if (intel_dp_link_required(intel_dp, mode->clock) | 248 | mode_rate = intel_dp_link_required(intel_dp, mode->clock, 0); |
| 246 | > intel_dp_max_data_rate(max_link_clock, max_lanes)) | 249 | max_rate = intel_dp_max_data_rate(max_link_clock, max_lanes); |
| 247 | return MODE_CLOCK_HIGH; | 250 | |
| 251 | if (mode_rate > max_rate) { | ||
| 252 | mode_rate = intel_dp_link_required(intel_dp, | ||
| 253 | mode->clock, 18); | ||
| 254 | if (mode_rate > max_rate) | ||
| 255 | return MODE_CLOCK_HIGH; | ||
| 256 | else | ||
| 257 | mode->private_flags |= INTEL_MODE_DP_FORCE_6BPC; | ||
| 258 | } | ||
| 248 | 259 | ||
| 249 | if (mode->clock < 10000) | 260 | if (mode->clock < 10000) |
| 250 | return MODE_CLOCK_LOW; | 261 | return MODE_CLOCK_LOW; |
| @@ -362,8 +373,8 @@ intel_dp_aux_ch(struct intel_dp *intel_dp, | |||
| 362 | * clock divider. | 373 | * clock divider. |
| 363 | */ | 374 | */ |
| 364 | if (is_cpu_edp(intel_dp)) { | 375 | if (is_cpu_edp(intel_dp)) { |
| 365 | if (IS_GEN6(dev)) | 376 | if (IS_GEN6(dev) || IS_GEN7(dev)) |
| 366 | aux_clock_divider = 200; /* SNB eDP input clock at 400Mhz */ | 377 | aux_clock_divider = 200; /* SNB & IVB eDP input clock at 400Mhz */ |
| 367 | else | 378 | else |
| 368 | aux_clock_divider = 225; /* eDP input clock at 450Mhz */ | 379 | aux_clock_divider = 225; /* eDP input clock at 450Mhz */ |
| 369 | } else if (HAS_PCH_SPLIT(dev)) | 380 | } else if (HAS_PCH_SPLIT(dev)) |
| @@ -672,6 +683,7 @@ intel_dp_mode_fixup(struct drm_encoder *encoder, struct drm_display_mode *mode, | |||
| 672 | int lane_count, clock; | 683 | int lane_count, clock; |
| 673 | int max_lane_count = intel_dp_max_lane_count(intel_dp); | 684 | int max_lane_count = intel_dp_max_lane_count(intel_dp); |
| 674 | int max_clock = intel_dp_max_link_bw(intel_dp) == DP_LINK_BW_2_7 ? 1 : 0; | 685 | int max_clock = intel_dp_max_link_bw(intel_dp) == DP_LINK_BW_2_7 ? 1 : 0; |
| 686 | int bpp = mode->private_flags & INTEL_MODE_DP_FORCE_6BPC ? 18 : 0; | ||
| 675 | static int bws[2] = { DP_LINK_BW_1_62, DP_LINK_BW_2_7 }; | 687 | static int bws[2] = { DP_LINK_BW_1_62, DP_LINK_BW_2_7 }; |
| 676 | 688 | ||
| 677 | if (is_edp(intel_dp) && intel_dp->panel_fixed_mode) { | 689 | if (is_edp(intel_dp) && intel_dp->panel_fixed_mode) { |
| @@ -689,7 +701,7 @@ intel_dp_mode_fixup(struct drm_encoder *encoder, struct drm_display_mode *mode, | |||
| 689 | for (clock = 0; clock <= max_clock; clock++) { | 701 | for (clock = 0; clock <= max_clock; clock++) { |
| 690 | int link_avail = intel_dp_max_data_rate(intel_dp_link_clock(bws[clock]), lane_count); | 702 | int link_avail = intel_dp_max_data_rate(intel_dp_link_clock(bws[clock]), lane_count); |
| 691 | 703 | ||
| 692 | if (intel_dp_link_required(intel_dp, mode->clock) | 704 | if (intel_dp_link_required(intel_dp, mode->clock, bpp) |
| 693 | <= link_avail) { | 705 | <= link_avail) { |
| 694 | intel_dp->link_bw = bws[clock]; | 706 | intel_dp->link_bw = bws[clock]; |
| 695 | intel_dp->lane_count = lane_count; | 707 | intel_dp->lane_count = lane_count; |
| @@ -817,10 +829,11 @@ intel_dp_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode, | |||
| 817 | } | 829 | } |
| 818 | 830 | ||
| 819 | /* | 831 | /* |
| 820 | * There are three kinds of DP registers: | 832 | * There are four kinds of DP registers: |
| 821 | * | 833 | * |
| 822 | * IBX PCH | 834 | * IBX PCH |
| 823 | * CPU | 835 | * SNB CPU |
| 836 | * IVB CPU | ||
| 824 | * CPT PCH | 837 | * CPT PCH |
| 825 | * | 838 | * |
| 826 | * IBX PCH and CPU are the same for almost everything, | 839 | * IBX PCH and CPU are the same for almost everything, |
| @@ -873,7 +886,25 @@ intel_dp_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode, | |||
| 873 | 886 | ||
| 874 | /* Split out the IBX/CPU vs CPT settings */ | 887 | /* Split out the IBX/CPU vs CPT settings */ |
| 875 | 888 | ||
| 876 | if (!HAS_PCH_CPT(dev) || is_cpu_edp(intel_dp)) { | 889 | if (is_cpu_edp(intel_dp) && IS_GEN7(dev)) { |
| 890 | if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC) | ||
| 891 | intel_dp->DP |= DP_SYNC_HS_HIGH; | ||
| 892 | if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC) | ||
| 893 | intel_dp->DP |= DP_SYNC_VS_HIGH; | ||
| 894 | intel_dp->DP |= DP_LINK_TRAIN_OFF_CPT; | ||
| 895 | |||
| 896 | if (intel_dp->link_configuration[1] & DP_LANE_COUNT_ENHANCED_FRAME_EN) | ||
| 897 | intel_dp->DP |= DP_ENHANCED_FRAMING; | ||
| 898 | |||
| 899 | intel_dp->DP |= intel_crtc->pipe << 29; | ||
| 900 | |||
| 901 | /* don't miss out required setting for eDP */ | ||
| 902 | intel_dp->DP |= DP_PLL_ENABLE; | ||
| 903 | if (adjusted_mode->clock < 200000) | ||
| 904 | intel_dp->DP |= DP_PLL_FREQ_160MHZ; | ||
| 905 | else | ||
| 906 | intel_dp->DP |= DP_PLL_FREQ_270MHZ; | ||
| 907 | } else if (!HAS_PCH_CPT(dev) || is_cpu_edp(intel_dp)) { | ||
| 877 | intel_dp->DP |= intel_dp->color_range; | 908 | intel_dp->DP |= intel_dp->color_range; |
| 878 | 909 | ||
| 879 | if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC) | 910 | if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC) |
| @@ -1375,34 +1406,59 @@ static char *link_train_names[] = { | |||
| 1375 | * These are source-specific values; current Intel hardware supports | 1406 | * These are source-specific values; current Intel hardware supports |
| 1376 | * a maximum voltage of 800mV and a maximum pre-emphasis of 6dB | 1407 | * a maximum voltage of 800mV and a maximum pre-emphasis of 6dB |
| 1377 | */ | 1408 | */ |
| 1378 | #define I830_DP_VOLTAGE_MAX DP_TRAIN_VOLTAGE_SWING_800 | ||
| 1379 | #define I830_DP_VOLTAGE_MAX_CPT DP_TRAIN_VOLTAGE_SWING_1200 | ||
| 1380 | 1409 | ||
| 1381 | static uint8_t | 1410 | static uint8_t |
| 1382 | intel_dp_pre_emphasis_max(uint8_t voltage_swing) | 1411 | intel_dp_voltage_max(struct intel_dp *intel_dp) |
| 1383 | { | 1412 | { |
| 1384 | switch (voltage_swing & DP_TRAIN_VOLTAGE_SWING_MASK) { | 1413 | struct drm_device *dev = intel_dp->base.base.dev; |
| 1385 | case DP_TRAIN_VOLTAGE_SWING_400: | 1414 | |
| 1386 | return DP_TRAIN_PRE_EMPHASIS_6; | 1415 | if (IS_GEN7(dev) && is_cpu_edp(intel_dp)) |
| 1387 | case DP_TRAIN_VOLTAGE_SWING_600: | 1416 | return DP_TRAIN_VOLTAGE_SWING_800; |
| 1388 | return DP_TRAIN_PRE_EMPHASIS_6; | 1417 | else if (HAS_PCH_CPT(dev) && !is_cpu_edp(intel_dp)) |
| 1389 | case DP_TRAIN_VOLTAGE_SWING_800: | 1418 | return DP_TRAIN_VOLTAGE_SWING_1200; |
| 1390 | return DP_TRAIN_PRE_EMPHASIS_3_5; | 1419 | else |
| 1391 | case DP_TRAIN_VOLTAGE_SWING_1200: | 1420 | return DP_TRAIN_VOLTAGE_SWING_800; |
| 1392 | default: | 1421 | } |
| 1393 | return DP_TRAIN_PRE_EMPHASIS_0; | 1422 | |
| 1423 | static uint8_t | ||
| 1424 | intel_dp_pre_emphasis_max(struct intel_dp *intel_dp, uint8_t voltage_swing) | ||
| 1425 | { | ||
| 1426 | struct drm_device *dev = intel_dp->base.base.dev; | ||
| 1427 | |||
| 1428 | if (IS_GEN7(dev) && is_cpu_edp(intel_dp)) { | ||
| 1429 | switch (voltage_swing & DP_TRAIN_VOLTAGE_SWING_MASK) { | ||
| 1430 | case DP_TRAIN_VOLTAGE_SWING_400: | ||
| 1431 | return DP_TRAIN_PRE_EMPHASIS_6; | ||
| 1432 | case DP_TRAIN_VOLTAGE_SWING_600: | ||
| 1433 | case DP_TRAIN_VOLTAGE_SWING_800: | ||
| 1434 | return DP_TRAIN_PRE_EMPHASIS_3_5; | ||
| 1435 | default: | ||
| 1436 | return DP_TRAIN_PRE_EMPHASIS_0; | ||
| 1437 | } | ||
| 1438 | } else { | ||
| 1439 | switch (voltage_swing & DP_TRAIN_VOLTAGE_SWING_MASK) { | ||
| 1440 | case DP_TRAIN_VOLTAGE_SWING_400: | ||
| 1441 | return DP_TRAIN_PRE_EMPHASIS_6; | ||
| 1442 | case DP_TRAIN_VOLTAGE_SWING_600: | ||
| 1443 | return DP_TRAIN_PRE_EMPHASIS_6; | ||
| 1444 | case DP_TRAIN_VOLTAGE_SWING_800: | ||
| 1445 | return DP_TRAIN_PRE_EMPHASIS_3_5; | ||
| 1446 | case DP_TRAIN_VOLTAGE_SWING_1200: | ||
| 1447 | default: | ||
| 1448 | return DP_TRAIN_PRE_EMPHASIS_0; | ||
| 1449 | } | ||
| 1394 | } | 1450 | } |
| 1395 | } | 1451 | } |
| 1396 | 1452 | ||
| 1397 | static void | 1453 | static void |
| 1398 | intel_get_adjust_train(struct intel_dp *intel_dp, uint8_t link_status[DP_LINK_STATUS_SIZE]) | 1454 | intel_get_adjust_train(struct intel_dp *intel_dp, uint8_t link_status[DP_LINK_STATUS_SIZE]) |
| 1399 | { | 1455 | { |
| 1400 | struct drm_device *dev = intel_dp->base.base.dev; | ||
| 1401 | uint8_t v = 0; | 1456 | uint8_t v = 0; |
| 1402 | uint8_t p = 0; | 1457 | uint8_t p = 0; |
| 1403 | int lane; | 1458 | int lane; |
| 1404 | uint8_t *adjust_request = link_status + (DP_ADJUST_REQUEST_LANE0_1 - DP_LANE0_1_STATUS); | 1459 | uint8_t *adjust_request = link_status + (DP_ADJUST_REQUEST_LANE0_1 - DP_LANE0_1_STATUS); |
| 1405 | int voltage_max; | 1460 | uint8_t voltage_max; |
| 1461 | uint8_t preemph_max; | ||
| 1406 | 1462 | ||
| 1407 | for (lane = 0; lane < intel_dp->lane_count; lane++) { | 1463 | for (lane = 0; lane < intel_dp->lane_count; lane++) { |
| 1408 | uint8_t this_v = intel_get_adjust_request_voltage(adjust_request, lane); | 1464 | uint8_t this_v = intel_get_adjust_request_voltage(adjust_request, lane); |
| @@ -1414,15 +1470,13 @@ intel_get_adjust_train(struct intel_dp *intel_dp, uint8_t link_status[DP_LINK_ST | |||
| 1414 | p = this_p; | 1470 | p = this_p; |
| 1415 | } | 1471 | } |
| 1416 | 1472 | ||
| 1417 | if (HAS_PCH_CPT(dev) && !is_cpu_edp(intel_dp)) | 1473 | voltage_max = intel_dp_voltage_max(intel_dp); |
| 1418 | voltage_max = I830_DP_VOLTAGE_MAX_CPT; | ||
| 1419 | else | ||
| 1420 | voltage_max = I830_DP_VOLTAGE_MAX; | ||
| 1421 | if (v >= voltage_max) | 1474 | if (v >= voltage_max) |
| 1422 | v = voltage_max | DP_TRAIN_MAX_SWING_REACHED; | 1475 | v = voltage_max | DP_TRAIN_MAX_SWING_REACHED; |
| 1423 | 1476 | ||
| 1424 | if (p >= intel_dp_pre_emphasis_max(v)) | 1477 | preemph_max = intel_dp_pre_emphasis_max(intel_dp, v); |
| 1425 | p = intel_dp_pre_emphasis_max(v) | DP_TRAIN_MAX_PRE_EMPHASIS_REACHED; | 1478 | if (p >= preemph_max) |
| 1479 | p = preemph_max | DP_TRAIN_MAX_PRE_EMPHASIS_REACHED; | ||
| 1426 | 1480 | ||
| 1427 | for (lane = 0; lane < 4; lane++) | 1481 | for (lane = 0; lane < 4; lane++) |
| 1428 | intel_dp->train_set[lane] = v | p; | 1482 | intel_dp->train_set[lane] = v | p; |
| @@ -1494,6 +1548,37 @@ intel_gen6_edp_signal_levels(uint8_t train_set) | |||
| 1494 | } | 1548 | } |
| 1495 | } | 1549 | } |
| 1496 | 1550 | ||
| 1551 | /* Gen7's DP voltage swing and pre-emphasis control */ | ||
| 1552 | static uint32_t | ||
| 1553 | intel_gen7_edp_signal_levels(uint8_t train_set) | ||
| 1554 | { | ||
| 1555 | int signal_levels = train_set & (DP_TRAIN_VOLTAGE_SWING_MASK | | ||
| 1556 | DP_TRAIN_PRE_EMPHASIS_MASK); | ||
| 1557 | switch (signal_levels) { | ||
| 1558 | case DP_TRAIN_VOLTAGE_SWING_400 | DP_TRAIN_PRE_EMPHASIS_0: | ||
| 1559 | return EDP_LINK_TRAIN_400MV_0DB_IVB; | ||
| 1560 | case DP_TRAIN_VOLTAGE_SWING_400 | DP_TRAIN_PRE_EMPHASIS_3_5: | ||
| 1561 | return EDP_LINK_TRAIN_400MV_3_5DB_IVB; | ||
| 1562 | case DP_TRAIN_VOLTAGE_SWING_400 | DP_TRAIN_PRE_EMPHASIS_6: | ||
| 1563 | return EDP_LINK_TRAIN_400MV_6DB_IVB; | ||
| 1564 | |||
| 1565 | case DP_TRAIN_VOLTAGE_SWING_600 | DP_TRAIN_PRE_EMPHASIS_0: | ||
| 1566 | return EDP_LINK_TRAIN_600MV_0DB_IVB; | ||
| 1567 | case DP_TRAIN_VOLTAGE_SWING_600 | DP_TRAIN_PRE_EMPHASIS_3_5: | ||
| 1568 | return EDP_LINK_TRAIN_600MV_3_5DB_IVB; | ||
| 1569 | |||
| 1570 | case DP_TRAIN_VOLTAGE_SWING_800 | DP_TRAIN_PRE_EMPHASIS_0: | ||
| 1571 | return EDP_LINK_TRAIN_800MV_0DB_IVB; | ||
| 1572 | case DP_TRAIN_VOLTAGE_SWING_800 | DP_TRAIN_PRE_EMPHASIS_3_5: | ||
| 1573 | return EDP_LINK_TRAIN_800MV_3_5DB_IVB; | ||
| 1574 | |||
| 1575 | default: | ||
| 1576 | DRM_DEBUG_KMS("Unsupported voltage swing/pre-emphasis level:" | ||
| 1577 | "0x%x\n", signal_levels); | ||
| 1578 | return EDP_LINK_TRAIN_500MV_0DB_IVB; | ||
| 1579 | } | ||
| 1580 | } | ||
| 1581 | |||
| 1497 | static uint8_t | 1582 | static uint8_t |
| 1498 | intel_get_lane_status(uint8_t link_status[DP_LINK_STATUS_SIZE], | 1583 | intel_get_lane_status(uint8_t link_status[DP_LINK_STATUS_SIZE], |
| 1499 | int lane) | 1584 | int lane) |
| @@ -1599,7 +1684,8 @@ intel_dp_start_link_train(struct intel_dp *intel_dp) | |||
| 1599 | DP_LINK_CONFIGURATION_SIZE); | 1684 | DP_LINK_CONFIGURATION_SIZE); |
| 1600 | 1685 | ||
| 1601 | DP |= DP_PORT_EN; | 1686 | DP |= DP_PORT_EN; |
| 1602 | if (HAS_PCH_CPT(dev) && !is_cpu_edp(intel_dp)) | 1687 | |
| 1688 | if (HAS_PCH_CPT(dev) && (IS_GEN7(dev) || !is_cpu_edp(intel_dp))) | ||
| 1603 | DP &= ~DP_LINK_TRAIN_MASK_CPT; | 1689 | DP &= ~DP_LINK_TRAIN_MASK_CPT; |
| 1604 | else | 1690 | else |
| 1605 | DP &= ~DP_LINK_TRAIN_MASK; | 1691 | DP &= ~DP_LINK_TRAIN_MASK; |
| @@ -1613,7 +1699,11 @@ intel_dp_start_link_train(struct intel_dp *intel_dp) | |||
| 1613 | uint8_t link_status[DP_LINK_STATUS_SIZE]; | 1699 | uint8_t link_status[DP_LINK_STATUS_SIZE]; |
| 1614 | uint32_t signal_levels; | 1700 | uint32_t signal_levels; |
| 1615 | 1701 | ||
| 1616 | if (IS_GEN6(dev) && is_cpu_edp(intel_dp)) { | 1702 | |
| 1703 | if (IS_GEN7(dev) && is_cpu_edp(intel_dp)) { | ||
| 1704 | signal_levels = intel_gen7_edp_signal_levels(intel_dp->train_set[0]); | ||
| 1705 | DP = (DP & ~EDP_LINK_TRAIN_VOL_EMP_MASK_IVB) | signal_levels; | ||
| 1706 | } else if (IS_GEN6(dev) && is_cpu_edp(intel_dp)) { | ||
| 1617 | signal_levels = intel_gen6_edp_signal_levels(intel_dp->train_set[0]); | 1707 | signal_levels = intel_gen6_edp_signal_levels(intel_dp->train_set[0]); |
| 1618 | DP = (DP & ~EDP_LINK_TRAIN_VOL_EMP_MASK_SNB) | signal_levels; | 1708 | DP = (DP & ~EDP_LINK_TRAIN_VOL_EMP_MASK_SNB) | signal_levels; |
| 1619 | } else { | 1709 | } else { |
| @@ -1622,7 +1712,7 @@ intel_dp_start_link_train(struct intel_dp *intel_dp) | |||
| 1622 | DP = (DP & ~(DP_VOLTAGE_MASK|DP_PRE_EMPHASIS_MASK)) | signal_levels; | 1712 | DP = (DP & ~(DP_VOLTAGE_MASK|DP_PRE_EMPHASIS_MASK)) | signal_levels; |
| 1623 | } | 1713 | } |
| 1624 | 1714 | ||
| 1625 | if (HAS_PCH_CPT(dev) && !is_cpu_edp(intel_dp)) | 1715 | if (HAS_PCH_CPT(dev) && (IS_GEN7(dev) || !is_cpu_edp(intel_dp))) |
| 1626 | reg = DP | DP_LINK_TRAIN_PAT_1_CPT; | 1716 | reg = DP | DP_LINK_TRAIN_PAT_1_CPT; |
| 1627 | else | 1717 | else |
| 1628 | reg = DP | DP_LINK_TRAIN_PAT_1; | 1718 | reg = DP | DP_LINK_TRAIN_PAT_1; |
| @@ -1703,7 +1793,10 @@ intel_dp_complete_link_train(struct intel_dp *intel_dp) | |||
| 1703 | break; | 1793 | break; |
| 1704 | } | 1794 | } |
| 1705 | 1795 | ||
| 1706 | if (IS_GEN6(dev) && is_cpu_edp(intel_dp)) { | 1796 | if (IS_GEN7(dev) && is_cpu_edp(intel_dp)) { |
| 1797 | signal_levels = intel_gen7_edp_signal_levels(intel_dp->train_set[0]); | ||
| 1798 | DP = (DP & ~EDP_LINK_TRAIN_VOL_EMP_MASK_IVB) | signal_levels; | ||
| 1799 | } else if (IS_GEN6(dev) && is_cpu_edp(intel_dp)) { | ||
| 1707 | signal_levels = intel_gen6_edp_signal_levels(intel_dp->train_set[0]); | 1800 | signal_levels = intel_gen6_edp_signal_levels(intel_dp->train_set[0]); |
| 1708 | DP = (DP & ~EDP_LINK_TRAIN_VOL_EMP_MASK_SNB) | signal_levels; | 1801 | DP = (DP & ~EDP_LINK_TRAIN_VOL_EMP_MASK_SNB) | signal_levels; |
| 1709 | } else { | 1802 | } else { |
| @@ -1711,7 +1804,7 @@ intel_dp_complete_link_train(struct intel_dp *intel_dp) | |||
| 1711 | DP = (DP & ~(DP_VOLTAGE_MASK|DP_PRE_EMPHASIS_MASK)) | signal_levels; | 1804 | DP = (DP & ~(DP_VOLTAGE_MASK|DP_PRE_EMPHASIS_MASK)) | signal_levels; |
| 1712 | } | 1805 | } |
| 1713 | 1806 | ||
| 1714 | if (HAS_PCH_CPT(dev) && !is_cpu_edp(intel_dp)) | 1807 | if (HAS_PCH_CPT(dev) && (IS_GEN7(dev) || !is_cpu_edp(intel_dp))) |
| 1715 | reg = DP | DP_LINK_TRAIN_PAT_2_CPT; | 1808 | reg = DP | DP_LINK_TRAIN_PAT_2_CPT; |
| 1716 | else | 1809 | else |
| 1717 | reg = DP | DP_LINK_TRAIN_PAT_2; | 1810 | reg = DP | DP_LINK_TRAIN_PAT_2; |
| @@ -1752,7 +1845,7 @@ intel_dp_complete_link_train(struct intel_dp *intel_dp) | |||
| 1752 | ++tries; | 1845 | ++tries; |
| 1753 | } | 1846 | } |
| 1754 | 1847 | ||
| 1755 | if (HAS_PCH_CPT(dev) && !is_cpu_edp(intel_dp)) | 1848 | if (HAS_PCH_CPT(dev) && (IS_GEN7(dev) || !is_cpu_edp(intel_dp))) |
| 1756 | reg = DP | DP_LINK_TRAIN_OFF_CPT; | 1849 | reg = DP | DP_LINK_TRAIN_OFF_CPT; |
| 1757 | else | 1850 | else |
| 1758 | reg = DP | DP_LINK_TRAIN_OFF; | 1851 | reg = DP | DP_LINK_TRAIN_OFF; |
| @@ -1782,7 +1875,7 @@ intel_dp_link_down(struct intel_dp *intel_dp) | |||
| 1782 | udelay(100); | 1875 | udelay(100); |
| 1783 | } | 1876 | } |
| 1784 | 1877 | ||
| 1785 | if (HAS_PCH_CPT(dev) && !is_cpu_edp(intel_dp)) { | 1878 | if (HAS_PCH_CPT(dev) && (IS_GEN7(dev) || !is_cpu_edp(intel_dp))) { |
| 1786 | DP &= ~DP_LINK_TRAIN_MASK_CPT; | 1879 | DP &= ~DP_LINK_TRAIN_MASK_CPT; |
| 1787 | I915_WRITE(intel_dp->output_reg, DP | DP_LINK_TRAIN_PAT_IDLE_CPT); | 1880 | I915_WRITE(intel_dp->output_reg, DP | DP_LINK_TRAIN_PAT_IDLE_CPT); |
| 1788 | } else { | 1881 | } else { |
| @@ -1794,7 +1887,7 @@ intel_dp_link_down(struct intel_dp *intel_dp) | |||
| 1794 | msleep(17); | 1887 | msleep(17); |
| 1795 | 1888 | ||
| 1796 | if (is_edp(intel_dp)) { | 1889 | if (is_edp(intel_dp)) { |
| 1797 | if (HAS_PCH_CPT(dev) && !is_cpu_edp(intel_dp)) | 1890 | if (HAS_PCH_CPT(dev) && (IS_GEN7(dev) || !is_cpu_edp(intel_dp))) |
| 1798 | DP |= DP_LINK_TRAIN_OFF_CPT; | 1891 | DP |= DP_LINK_TRAIN_OFF_CPT; |
| 1799 | else | 1892 | else |
| 1800 | DP |= DP_LINK_TRAIN_OFF; | 1893 | DP |= DP_LINK_TRAIN_OFF; |
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index bd9a604b73d..a1b4343814e 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h | |||
| @@ -110,6 +110,7 @@ | |||
| 110 | /* drm_display_mode->private_flags */ | 110 | /* drm_display_mode->private_flags */ |
| 111 | #define INTEL_MODE_PIXEL_MULTIPLIER_SHIFT (0x0) | 111 | #define INTEL_MODE_PIXEL_MULTIPLIER_SHIFT (0x0) |
| 112 | #define INTEL_MODE_PIXEL_MULTIPLIER_MASK (0xf << INTEL_MODE_PIXEL_MULTIPLIER_SHIFT) | 112 | #define INTEL_MODE_PIXEL_MULTIPLIER_MASK (0xf << INTEL_MODE_PIXEL_MULTIPLIER_SHIFT) |
| 113 | #define INTEL_MODE_DP_FORCE_6BPC (0x10) | ||
| 113 | 114 | ||
| 114 | static inline void | 115 | static inline void |
| 115 | intel_mode_set_pixel_multiplier(struct drm_display_mode *mode, | 116 | intel_mode_set_pixel_multiplier(struct drm_display_mode *mode, |
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c index 42f165a520d..e44191132ac 100644 --- a/drivers/gpu/drm/i915/intel_lvds.c +++ b/drivers/gpu/drm/i915/intel_lvds.c | |||
| @@ -715,6 +715,14 @@ static const struct dmi_system_id intel_no_lvds[] = { | |||
| 715 | DMI_MATCH(DMI_PRODUCT_NAME, "EB1007"), | 715 | DMI_MATCH(DMI_PRODUCT_NAME, "EB1007"), |
| 716 | }, | 716 | }, |
| 717 | }, | 717 | }, |
| 718 | { | ||
| 719 | .callback = intel_no_lvds_dmi_callback, | ||
| 720 | .ident = "Asus AT5NM10T-I", | ||
| 721 | .matches = { | ||
| 722 | DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), | ||
| 723 | DMI_MATCH(DMI_BOARD_NAME, "AT5NM10T-I"), | ||
| 724 | }, | ||
| 725 | }, | ||
| 718 | 726 | ||
| 719 | { } /* terminating entry */ | 727 | { } /* terminating entry */ |
| 720 | }; | 728 | }; |
diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c index 21f60b7d69a..04d79fd1dc9 100644 --- a/drivers/gpu/drm/i915/intel_panel.c +++ b/drivers/gpu/drm/i915/intel_panel.c | |||
| @@ -178,13 +178,10 @@ u32 intel_panel_get_max_backlight(struct drm_device *dev) | |||
| 178 | if (HAS_PCH_SPLIT(dev)) { | 178 | if (HAS_PCH_SPLIT(dev)) { |
| 179 | max >>= 16; | 179 | max >>= 16; |
| 180 | } else { | 180 | } else { |
| 181 | if (IS_PINEVIEW(dev)) { | 181 | if (INTEL_INFO(dev)->gen < 4) |
| 182 | max >>= 17; | 182 | max >>= 17; |
| 183 | } else { | 183 | else |
| 184 | max >>= 16; | 184 | max >>= 16; |
| 185 | if (INTEL_INFO(dev)->gen < 4) | ||
| 186 | max &= ~1; | ||
| 187 | } | ||
| 188 | 185 | ||
| 189 | if (is_backlight_combination_mode(dev)) | 186 | if (is_backlight_combination_mode(dev)) |
| 190 | max *= 0xff; | 187 | max *= 0xff; |
| @@ -203,13 +200,12 @@ u32 intel_panel_get_backlight(struct drm_device *dev) | |||
| 203 | val = I915_READ(BLC_PWM_CPU_CTL) & BACKLIGHT_DUTY_CYCLE_MASK; | 200 | val = I915_READ(BLC_PWM_CPU_CTL) & BACKLIGHT_DUTY_CYCLE_MASK; |
| 204 | } else { | 201 | } else { |
| 205 | val = I915_READ(BLC_PWM_CTL) & BACKLIGHT_DUTY_CYCLE_MASK; | 202 | val = I915_READ(BLC_PWM_CTL) & BACKLIGHT_DUTY_CYCLE_MASK; |
| 206 | if (IS_PINEVIEW(dev)) | 203 | if (INTEL_INFO(dev)->gen < 4) |
| 207 | val >>= 1; | 204 | val >>= 1; |
| 208 | 205 | ||
| 209 | if (is_backlight_combination_mode(dev)) { | 206 | if (is_backlight_combination_mode(dev)) { |
| 210 | u8 lbpc; | 207 | u8 lbpc; |
| 211 | 208 | ||
| 212 | val &= ~1; | ||
| 213 | pci_read_config_byte(dev->pdev, PCI_LBPC, &lbpc); | 209 | pci_read_config_byte(dev->pdev, PCI_LBPC, &lbpc); |
| 214 | val *= lbpc; | 210 | val *= lbpc; |
| 215 | } | 211 | } |
| @@ -246,11 +242,9 @@ static void intel_panel_actually_set_backlight(struct drm_device *dev, u32 level | |||
| 246 | } | 242 | } |
| 247 | 243 | ||
| 248 | tmp = I915_READ(BLC_PWM_CTL); | 244 | tmp = I915_READ(BLC_PWM_CTL); |
| 249 | if (IS_PINEVIEW(dev)) { | 245 | if (INTEL_INFO(dev)->gen < 4) |
| 250 | tmp &= ~(BACKLIGHT_DUTY_CYCLE_MASK - 1); | ||
| 251 | level <<= 1; | 246 | level <<= 1; |
| 252 | } else | 247 | tmp &= ~BACKLIGHT_DUTY_CYCLE_MASK; |
| 253 | tmp &= ~BACKLIGHT_DUTY_CYCLE_MASK; | ||
| 254 | I915_WRITE(BLC_PWM_CTL, tmp | level); | 248 | I915_WRITE(BLC_PWM_CTL, tmp | level); |
| 255 | } | 249 | } |
| 256 | 250 | ||
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index 3003fb25aef..f7b9268df26 100644 --- a/drivers/gpu/drm/i915/intel_sdvo.c +++ b/drivers/gpu/drm/i915/intel_sdvo.c | |||
| @@ -50,6 +50,7 @@ | |||
| 50 | #define IS_TMDS(c) (c->output_flag & SDVO_TMDS_MASK) | 50 | #define IS_TMDS(c) (c->output_flag & SDVO_TMDS_MASK) |
| 51 | #define IS_LVDS(c) (c->output_flag & SDVO_LVDS_MASK) | 51 | #define IS_LVDS(c) (c->output_flag & SDVO_LVDS_MASK) |
| 52 | #define IS_TV_OR_LVDS(c) (c->output_flag & (SDVO_TV_MASK | SDVO_LVDS_MASK)) | 52 | #define IS_TV_OR_LVDS(c) (c->output_flag & (SDVO_TV_MASK | SDVO_LVDS_MASK)) |
| 53 | #define IS_DIGITAL(c) (c->output_flag & (SDVO_TMDS_MASK | SDVO_LVDS_MASK)) | ||
| 53 | 54 | ||
| 54 | 55 | ||
| 55 | static const char *tv_format_names[] = { | 56 | static const char *tv_format_names[] = { |
| @@ -1086,8 +1087,12 @@ static void intel_sdvo_mode_set(struct drm_encoder *encoder, | |||
| 1086 | } | 1087 | } |
| 1087 | sdvox |= (9 << 19) | SDVO_BORDER_ENABLE; | 1088 | sdvox |= (9 << 19) | SDVO_BORDER_ENABLE; |
| 1088 | } | 1089 | } |
| 1089 | if (intel_crtc->pipe == 1) | 1090 | |
| 1090 | sdvox |= SDVO_PIPE_B_SELECT; | 1091 | if (INTEL_PCH_TYPE(dev) >= PCH_CPT) |
| 1092 | sdvox |= TRANSCODER_CPT(intel_crtc->pipe); | ||
| 1093 | else | ||
| 1094 | sdvox |= TRANSCODER(intel_crtc->pipe); | ||
| 1095 | |||
| 1091 | if (intel_sdvo->has_hdmi_audio) | 1096 | if (intel_sdvo->has_hdmi_audio) |
| 1092 | sdvox |= SDVO_AUDIO_ENABLE; | 1097 | sdvox |= SDVO_AUDIO_ENABLE; |
| 1093 | 1098 | ||
| @@ -1314,6 +1319,18 @@ intel_sdvo_tmds_sink_detect(struct drm_connector *connector) | |||
| 1314 | return status; | 1319 | return status; |
| 1315 | } | 1320 | } |
| 1316 | 1321 | ||
| 1322 | static bool | ||
| 1323 | intel_sdvo_connector_matches_edid(struct intel_sdvo_connector *sdvo, | ||
| 1324 | struct edid *edid) | ||
| 1325 | { | ||
| 1326 | bool monitor_is_digital = !!(edid->input & DRM_EDID_INPUT_DIGITAL); | ||
| 1327 | bool connector_is_digital = !!IS_DIGITAL(sdvo); | ||
| 1328 | |||
| 1329 | DRM_DEBUG_KMS("connector_is_digital? %d, monitor_is_digital? %d\n", | ||
| 1330 | connector_is_digital, monitor_is_digital); | ||
| 1331 | return connector_is_digital == monitor_is_digital; | ||
| 1332 | } | ||
| 1333 | |||
| 1317 | static enum drm_connector_status | 1334 | static enum drm_connector_status |
| 1318 | intel_sdvo_detect(struct drm_connector *connector, bool force) | 1335 | intel_sdvo_detect(struct drm_connector *connector, bool force) |
| 1319 | { | 1336 | { |
| @@ -1358,10 +1375,12 @@ intel_sdvo_detect(struct drm_connector *connector, bool force) | |||
| 1358 | if (edid == NULL) | 1375 | if (edid == NULL) |
| 1359 | edid = intel_sdvo_get_analog_edid(connector); | 1376 | edid = intel_sdvo_get_analog_edid(connector); |
| 1360 | if (edid != NULL) { | 1377 | if (edid != NULL) { |
| 1361 | if (edid->input & DRM_EDID_INPUT_DIGITAL) | 1378 | if (intel_sdvo_connector_matches_edid(intel_sdvo_connector, |
| 1362 | ret = connector_status_disconnected; | 1379 | edid)) |
| 1363 | else | ||
| 1364 | ret = connector_status_connected; | 1380 | ret = connector_status_connected; |
| 1381 | else | ||
| 1382 | ret = connector_status_disconnected; | ||
| 1383 | |||
| 1365 | connector->display_info.raw_edid = NULL; | 1384 | connector->display_info.raw_edid = NULL; |
| 1366 | kfree(edid); | 1385 | kfree(edid); |
| 1367 | } else | 1386 | } else |
| @@ -1402,11 +1421,8 @@ static void intel_sdvo_get_ddc_modes(struct drm_connector *connector) | |||
| 1402 | edid = intel_sdvo_get_analog_edid(connector); | 1421 | edid = intel_sdvo_get_analog_edid(connector); |
| 1403 | 1422 | ||
| 1404 | if (edid != NULL) { | 1423 | if (edid != NULL) { |
| 1405 | struct intel_sdvo_connector *intel_sdvo_connector = to_intel_sdvo_connector(connector); | 1424 | if (intel_sdvo_connector_matches_edid(to_intel_sdvo_connector(connector), |
| 1406 | bool monitor_is_digital = !!(edid->input & DRM_EDID_INPUT_DIGITAL); | 1425 | edid)) { |
| 1407 | bool connector_is_digital = !!IS_TMDS(intel_sdvo_connector); | ||
| 1408 | |||
| 1409 | if (connector_is_digital == monitor_is_digital) { | ||
| 1410 | drm_mode_connector_update_edid_property(connector, edid); | 1426 | drm_mode_connector_update_edid_property(connector, edid); |
| 1411 | drm_add_edid_modes(connector, edid); | 1427 | drm_add_edid_modes(connector, edid); |
| 1412 | } | 1428 | } |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h index 8cca91a93bd..dc279706ca7 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | |||
| @@ -390,6 +390,11 @@ extern int vmw_context_check(struct vmw_private *dev_priv, | |||
| 390 | struct ttm_object_file *tfile, | 390 | struct ttm_object_file *tfile, |
| 391 | int id, | 391 | int id, |
| 392 | struct vmw_resource **p_res); | 392 | struct vmw_resource **p_res); |
| 393 | extern int vmw_user_lookup_handle(struct vmw_private *dev_priv, | ||
| 394 | struct ttm_object_file *tfile, | ||
| 395 | uint32_t handle, | ||
| 396 | struct vmw_surface **out_surf, | ||
| 397 | struct vmw_dma_buffer **out_buf); | ||
| 393 | extern void vmw_surface_res_free(struct vmw_resource *res); | 398 | extern void vmw_surface_res_free(struct vmw_resource *res); |
| 394 | extern int vmw_surface_init(struct vmw_private *dev_priv, | 399 | extern int vmw_surface_init(struct vmw_private *dev_priv, |
| 395 | struct vmw_surface *srf, | 400 | struct vmw_surface *srf, |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c b/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c index 03bbc2a6f9a..a0c2f12b1e1 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c | |||
| @@ -33,6 +33,7 @@ bool vmw_fifo_have_3d(struct vmw_private *dev_priv) | |||
| 33 | { | 33 | { |
| 34 | __le32 __iomem *fifo_mem = dev_priv->mmio_virt; | 34 | __le32 __iomem *fifo_mem = dev_priv->mmio_virt; |
| 35 | uint32_t fifo_min, hwversion; | 35 | uint32_t fifo_min, hwversion; |
| 36 | const struct vmw_fifo_state *fifo = &dev_priv->fifo; | ||
| 36 | 37 | ||
| 37 | if (!(dev_priv->capabilities & SVGA_CAP_EXTENDED_FIFO)) | 38 | if (!(dev_priv->capabilities & SVGA_CAP_EXTENDED_FIFO)) |
| 38 | return false; | 39 | return false; |
| @@ -41,7 +42,12 @@ bool vmw_fifo_have_3d(struct vmw_private *dev_priv) | |||
| 41 | if (fifo_min <= SVGA_FIFO_3D_HWVERSION * sizeof(unsigned int)) | 42 | if (fifo_min <= SVGA_FIFO_3D_HWVERSION * sizeof(unsigned int)) |
| 42 | return false; | 43 | return false; |
| 43 | 44 | ||
| 44 | hwversion = ioread32(fifo_mem + SVGA_FIFO_3D_HWVERSION); | 45 | hwversion = ioread32(fifo_mem + |
| 46 | ((fifo->capabilities & | ||
| 47 | SVGA_FIFO_CAP_3D_HWVERSION_REVISED) ? | ||
| 48 | SVGA_FIFO_3D_HWVERSION_REVISED : | ||
| 49 | SVGA_FIFO_3D_HWVERSION)); | ||
| 50 | |||
| 45 | if (hwversion == 0) | 51 | if (hwversion == 0) |
| 46 | return false; | 52 | return false; |
| 47 | 53 | ||
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c index 5ff561d4e0b..66917c6c381 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c | |||
| @@ -58,8 +58,14 @@ int vmw_getparam_ioctl(struct drm_device *dev, void *data, | |||
| 58 | case DRM_VMW_PARAM_FIFO_HW_VERSION: | 58 | case DRM_VMW_PARAM_FIFO_HW_VERSION: |
| 59 | { | 59 | { |
| 60 | __le32 __iomem *fifo_mem = dev_priv->mmio_virt; | 60 | __le32 __iomem *fifo_mem = dev_priv->mmio_virt; |
| 61 | 61 | const struct vmw_fifo_state *fifo = &dev_priv->fifo; | |
| 62 | param->value = ioread32(fifo_mem + SVGA_FIFO_3D_HWVERSION); | 62 | |
| 63 | param->value = | ||
| 64 | ioread32(fifo_mem + | ||
| 65 | ((fifo->capabilities & | ||
| 66 | SVGA_FIFO_CAP_3D_HWVERSION_REVISED) ? | ||
| 67 | SVGA_FIFO_3D_HWVERSION_REVISED : | ||
| 68 | SVGA_FIFO_3D_HWVERSION)); | ||
| 63 | break; | 69 | break; |
| 64 | } | 70 | } |
| 65 | default: | 71 | default: |
| @@ -166,13 +172,7 @@ int vmw_present_ioctl(struct drm_device *dev, void *data, | |||
| 166 | ret = -EINVAL; | 172 | ret = -EINVAL; |
| 167 | goto out_no_fb; | 173 | goto out_no_fb; |
| 168 | } | 174 | } |
| 169 | |||
| 170 | vfb = vmw_framebuffer_to_vfb(obj_to_fb(obj)); | 175 | vfb = vmw_framebuffer_to_vfb(obj_to_fb(obj)); |
| 171 | if (!vfb->dmabuf) { | ||
| 172 | DRM_ERROR("Framebuffer not dmabuf backed.\n"); | ||
| 173 | ret = -EINVAL; | ||
| 174 | goto out_no_fb; | ||
| 175 | } | ||
| 176 | 176 | ||
| 177 | ret = ttm_read_lock(&vmaster->lock, true); | 177 | ret = ttm_read_lock(&vmaster->lock, true); |
| 178 | if (unlikely(ret != 0)) | 178 | if (unlikely(ret != 0)) |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c index 37d40545ed7..8aa1dbb45c6 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | |||
| @@ -31,6 +31,44 @@ | |||
| 31 | /* Might need a hrtimer here? */ | 31 | /* Might need a hrtimer here? */ |
| 32 | #define VMWGFX_PRESENT_RATE ((HZ / 60 > 0) ? HZ / 60 : 1) | 32 | #define VMWGFX_PRESENT_RATE ((HZ / 60 > 0) ? HZ / 60 : 1) |
| 33 | 33 | ||
| 34 | |||
| 35 | struct vmw_clip_rect { | ||
| 36 | int x1, x2, y1, y2; | ||
| 37 | }; | ||
| 38 | |||
| 39 | /** | ||
| 40 | * Clip @num_rects number of @rects against @clip storing the | ||
| 41 | * results in @out_rects and the number of passed rects in @out_num. | ||
| 42 | */ | ||
| 43 | void vmw_clip_cliprects(struct drm_clip_rect *rects, | ||
| 44 | int num_rects, | ||
| 45 | struct vmw_clip_rect clip, | ||
| 46 | SVGASignedRect *out_rects, | ||
| 47 | int *out_num) | ||
| 48 | { | ||
| 49 | int i, k; | ||
| 50 | |||
| 51 | for (i = 0, k = 0; i < num_rects; i++) { | ||
| 52 | int x1 = max_t(int, clip.x1, rects[i].x1); | ||
| 53 | int y1 = max_t(int, clip.y1, rects[i].y1); | ||
| 54 | int x2 = min_t(int, clip.x2, rects[i].x2); | ||
| 55 | int y2 = min_t(int, clip.y2, rects[i].y2); | ||
| 56 | |||
| 57 | if (x1 >= x2) | ||
| 58 | continue; | ||
| 59 | if (y1 >= y2) | ||
| 60 | continue; | ||
| 61 | |||
| 62 | out_rects[k].left = x1; | ||
| 63 | out_rects[k].top = y1; | ||
| 64 | out_rects[k].right = x2; | ||
| 65 | out_rects[k].bottom = y2; | ||
| 66 | k++; | ||
| 67 | } | ||
| 68 | |||
| 69 | *out_num = k; | ||
| 70 | } | ||
| 71 | |||
| 34 | void vmw_display_unit_cleanup(struct vmw_display_unit *du) | 72 | void vmw_display_unit_cleanup(struct vmw_display_unit *du) |
| 35 | { | 73 | { |
| 36 | if (du->cursor_surface) | 74 | if (du->cursor_surface) |
| @@ -82,6 +120,43 @@ int vmw_cursor_update_image(struct vmw_private *dev_priv, | |||
| 82 | return 0; | 120 | return 0; |
| 83 | } | 121 | } |
| 84 | 122 | ||
| 123 | int vmw_cursor_update_dmabuf(struct vmw_private *dev_priv, | ||
| 124 | struct vmw_dma_buffer *dmabuf, | ||
| 125 | u32 width, u32 height, | ||
| 126 | u32 hotspotX, u32 hotspotY) | ||
| 127 | { | ||
| 128 | struct ttm_bo_kmap_obj map; | ||
| 129 | unsigned long kmap_offset; | ||
| 130 | unsigned long kmap_num; | ||
| 131 | void *virtual; | ||
| 132 | bool dummy; | ||
| 133 | int ret; | ||
| 134 | |||
| 135 | kmap_offset = 0; | ||
| 136 | kmap_num = (width*height*4 + PAGE_SIZE - 1) >> PAGE_SHIFT; | ||
| 137 | |||
| 138 | ret = ttm_bo_reserve(&dmabuf->base, true, false, false, 0); | ||
| 139 | if (unlikely(ret != 0)) { | ||
| 140 | DRM_ERROR("reserve failed\n"); | ||
| 141 | return -EINVAL; | ||
| 142 | } | ||
| 143 | |||
| 144 | ret = ttm_bo_kmap(&dmabuf->base, kmap_offset, kmap_num, &map); | ||
| 145 | if (unlikely(ret != 0)) | ||
| 146 | goto err_unreserve; | ||
| 147 | |||
| 148 | virtual = ttm_kmap_obj_virtual(&map, &dummy); | ||
| 149 | ret = vmw_cursor_update_image(dev_priv, virtual, width, height, | ||
| 150 | hotspotX, hotspotY); | ||
| 151 | |||
| 152 | ttm_bo_kunmap(&map); | ||
| 153 | err_unreserve: | ||
| 154 | ttm_bo_unreserve(&dmabuf->base); | ||
| 155 | |||
| 156 | return ret; | ||
| 157 | } | ||
| 158 | |||
| 159 | |||
| 85 | void vmw_cursor_update_position(struct vmw_private *dev_priv, | 160 | void vmw_cursor_update_position(struct vmw_private *dev_priv, |
| 86 | bool show, int x, int y) | 161 | bool show, int x, int y) |
| 87 | { | 162 | { |
| @@ -110,24 +185,21 @@ int vmw_du_crtc_cursor_set(struct drm_crtc *crtc, struct drm_file *file_priv, | |||
| 110 | return -EINVAL; | 185 | return -EINVAL; |
| 111 | 186 | ||
| 112 | if (handle) { | 187 | if (handle) { |
| 113 | ret = vmw_user_surface_lookup_handle(dev_priv, tfile, | 188 | ret = vmw_user_lookup_handle(dev_priv, tfile, |
| 114 | handle, &surface); | 189 | handle, &surface, &dmabuf); |
| 115 | if (!ret) { | 190 | if (ret) { |
| 116 | if (!surface->snooper.image) { | 191 | DRM_ERROR("failed to find surface or dmabuf: %i\n", ret); |
| 117 | DRM_ERROR("surface not suitable for cursor\n"); | 192 | return -EINVAL; |
| 118 | vmw_surface_unreference(&surface); | ||
| 119 | return -EINVAL; | ||
| 120 | } | ||
| 121 | } else { | ||
| 122 | ret = vmw_user_dmabuf_lookup(tfile, | ||
| 123 | handle, &dmabuf); | ||
| 124 | if (ret) { | ||
| 125 | DRM_ERROR("failed to find surface or dmabuf: %i\n", ret); | ||
| 126 | return -EINVAL; | ||
| 127 | } | ||
| 128 | } | 193 | } |
| 129 | } | 194 | } |
| 130 | 195 | ||
| 196 | /* need to do this before taking down old image */ | ||
| 197 | if (surface && !surface->snooper.image) { | ||
| 198 | DRM_ERROR("surface not suitable for cursor\n"); | ||
| 199 | vmw_surface_unreference(&surface); | ||
| 200 | return -EINVAL; | ||
| 201 | } | ||
| 202 | |||
| 131 | /* takedown old cursor */ | 203 | /* takedown old cursor */ |
| 132 | if (du->cursor_surface) { | 204 | if (du->cursor_surface) { |
| 133 | du->cursor_surface->snooper.crtc = NULL; | 205 | du->cursor_surface->snooper.crtc = NULL; |
| @@ -146,36 +218,11 @@ int vmw_du_crtc_cursor_set(struct drm_crtc *crtc, struct drm_file *file_priv, | |||
| 146 | vmw_cursor_update_image(dev_priv, surface->snooper.image, | 218 | vmw_cursor_update_image(dev_priv, surface->snooper.image, |
| 147 | 64, 64, du->hotspot_x, du->hotspot_y); | 219 | 64, 64, du->hotspot_x, du->hotspot_y); |
| 148 | } else if (dmabuf) { | 220 | } else if (dmabuf) { |
| 149 | struct ttm_bo_kmap_obj map; | ||
| 150 | unsigned long kmap_offset; | ||
| 151 | unsigned long kmap_num; | ||
| 152 | void *virtual; | ||
| 153 | bool dummy; | ||
| 154 | |||
| 155 | /* vmw_user_surface_lookup takes one reference */ | 221 | /* vmw_user_surface_lookup takes one reference */ |
| 156 | du->cursor_dmabuf = dmabuf; | 222 | du->cursor_dmabuf = dmabuf; |
| 157 | 223 | ||
| 158 | kmap_offset = 0; | 224 | ret = vmw_cursor_update_dmabuf(dev_priv, dmabuf, width, height, |
| 159 | kmap_num = (64*64*4) >> PAGE_SHIFT; | 225 | du->hotspot_x, du->hotspot_y); |
| 160 | |||
| 161 | ret = ttm_bo_reserve(&dmabuf->base, true, false, false, 0); | ||
| 162 | if (unlikely(ret != 0)) { | ||
| 163 | DRM_ERROR("reserve failed\n"); | ||
| 164 | return -EINVAL; | ||
| 165 | } | ||
| 166 | |||
| 167 | ret = ttm_bo_kmap(&dmabuf->base, kmap_offset, kmap_num, &map); | ||
| 168 | if (unlikely(ret != 0)) | ||
| 169 | goto err_unreserve; | ||
| 170 | |||
| 171 | virtual = ttm_kmap_obj_virtual(&map, &dummy); | ||
| 172 | vmw_cursor_update_image(dev_priv, virtual, 64, 64, | ||
| 173 | du->hotspot_x, du->hotspot_y); | ||
| 174 | |||
| 175 | ttm_bo_kunmap(&map); | ||
| 176 | err_unreserve: | ||
| 177 | ttm_bo_unreserve(&dmabuf->base); | ||
| 178 | |||
| 179 | } else { | 226 | } else { |
| 180 | vmw_cursor_update_position(dev_priv, false, 0, 0); | 227 | vmw_cursor_update_position(dev_priv, false, 0, 0); |
| 181 | return 0; | 228 | return 0; |
| @@ -377,8 +424,9 @@ static int do_surface_dirty_sou(struct vmw_private *dev_priv, | |||
| 377 | struct drm_clip_rect *clips, | 424 | struct drm_clip_rect *clips, |
| 378 | unsigned num_clips, int inc) | 425 | unsigned num_clips, int inc) |
| 379 | { | 426 | { |
| 380 | struct drm_clip_rect *clips_ptr; | ||
| 381 | struct vmw_display_unit *units[VMWGFX_NUM_DISPLAY_UNITS]; | 427 | struct vmw_display_unit *units[VMWGFX_NUM_DISPLAY_UNITS]; |
| 428 | struct drm_clip_rect *clips_ptr; | ||
| 429 | struct drm_clip_rect *tmp; | ||
| 382 | struct drm_crtc *crtc; | 430 | struct drm_crtc *crtc; |
| 383 | size_t fifo_size; | 431 | size_t fifo_size; |
| 384 | int i, num_units; | 432 | int i, num_units; |
| @@ -391,7 +439,6 @@ static int do_surface_dirty_sou(struct vmw_private *dev_priv, | |||
| 391 | } *cmd; | 439 | } *cmd; |
| 392 | SVGASignedRect *blits; | 440 | SVGASignedRect *blits; |
| 393 | 441 | ||
| 394 | |||
| 395 | num_units = 0; | 442 | num_units = 0; |
| 396 | list_for_each_entry(crtc, &dev_priv->dev->mode_config.crtc_list, | 443 | list_for_each_entry(crtc, &dev_priv->dev->mode_config.crtc_list, |
| 397 | head) { | 444 | head) { |
| @@ -402,13 +449,24 @@ static int do_surface_dirty_sou(struct vmw_private *dev_priv, | |||
| 402 | 449 | ||
| 403 | BUG_ON(!clips || !num_clips); | 450 | BUG_ON(!clips || !num_clips); |
| 404 | 451 | ||
| 452 | tmp = kzalloc(sizeof(*tmp) * num_clips, GFP_KERNEL); | ||
| 453 | if (unlikely(tmp == NULL)) { | ||
| 454 | DRM_ERROR("Temporary cliprect memory alloc failed.\n"); | ||
| 455 | return -ENOMEM; | ||
| 456 | } | ||
| 457 | |||
| 405 | fifo_size = sizeof(*cmd) + sizeof(SVGASignedRect) * num_clips; | 458 | fifo_size = sizeof(*cmd) + sizeof(SVGASignedRect) * num_clips; |
| 406 | cmd = kzalloc(fifo_size, GFP_KERNEL); | 459 | cmd = kzalloc(fifo_size, GFP_KERNEL); |
| 407 | if (unlikely(cmd == NULL)) { | 460 | if (unlikely(cmd == NULL)) { |
| 408 | DRM_ERROR("Temporary fifo memory alloc failed.\n"); | 461 | DRM_ERROR("Temporary fifo memory alloc failed.\n"); |
| 409 | return -ENOMEM; | 462 | ret = -ENOMEM; |
| 463 | goto out_free_tmp; | ||
| 410 | } | 464 | } |
| 411 | 465 | ||
| 466 | /* setup blits pointer */ | ||
| 467 | blits = (SVGASignedRect *)&cmd[1]; | ||
| 468 | |||
| 469 | /* initial clip region */ | ||
| 412 | left = clips->x1; | 470 | left = clips->x1; |
| 413 | right = clips->x2; | 471 | right = clips->x2; |
| 414 | top = clips->y1; | 472 | top = clips->y1; |
| @@ -434,45 +492,60 @@ static int do_surface_dirty_sou(struct vmw_private *dev_priv, | |||
| 434 | cmd->body.srcRect.bottom = bottom; | 492 | cmd->body.srcRect.bottom = bottom; |
| 435 | 493 | ||
| 436 | clips_ptr = clips; | 494 | clips_ptr = clips; |
| 437 | blits = (SVGASignedRect *)&cmd[1]; | ||
| 438 | for (i = 0; i < num_clips; i++, clips_ptr += inc) { | 495 | for (i = 0; i < num_clips; i++, clips_ptr += inc) { |
| 439 | blits[i].left = clips_ptr->x1 - left; | 496 | tmp[i].x1 = clips_ptr->x1 - left; |
| 440 | blits[i].right = clips_ptr->x2 - left; | 497 | tmp[i].x2 = clips_ptr->x2 - left; |
| 441 | blits[i].top = clips_ptr->y1 - top; | 498 | tmp[i].y1 = clips_ptr->y1 - top; |
| 442 | blits[i].bottom = clips_ptr->y2 - top; | 499 | tmp[i].y2 = clips_ptr->y2 - top; |
| 443 | } | 500 | } |
| 444 | 501 | ||
| 445 | /* do per unit writing, reuse fifo for each */ | 502 | /* do per unit writing, reuse fifo for each */ |
| 446 | for (i = 0; i < num_units; i++) { | 503 | for (i = 0; i < num_units; i++) { |
| 447 | struct vmw_display_unit *unit = units[i]; | 504 | struct vmw_display_unit *unit = units[i]; |
| 448 | int clip_x1 = left - unit->crtc.x; | 505 | struct vmw_clip_rect clip; |
| 449 | int clip_y1 = top - unit->crtc.y; | 506 | int num; |
| 450 | int clip_x2 = right - unit->crtc.x; | 507 | |
| 451 | int clip_y2 = bottom - unit->crtc.y; | 508 | clip.x1 = left - unit->crtc.x; |
| 509 | clip.y1 = top - unit->crtc.y; | ||
| 510 | clip.x2 = right - unit->crtc.x; | ||
| 511 | clip.y2 = bottom - unit->crtc.y; | ||
| 452 | 512 | ||
| 453 | /* skip any crtcs that misses the clip region */ | 513 | /* skip any crtcs that misses the clip region */ |
| 454 | if (clip_x1 >= unit->crtc.mode.hdisplay || | 514 | if (clip.x1 >= unit->crtc.mode.hdisplay || |
| 455 | clip_y1 >= unit->crtc.mode.vdisplay || | 515 | clip.y1 >= unit->crtc.mode.vdisplay || |
| 456 | clip_x2 <= 0 || clip_y2 <= 0) | 516 | clip.x2 <= 0 || clip.y2 <= 0) |
| 457 | continue; | 517 | continue; |
| 458 | 518 | ||
| 519 | /* | ||
| 520 | * In order for the clip rects to be correctly scaled | ||
| 521 | * the src and dest rects needs to be the same size. | ||
| 522 | */ | ||
| 523 | cmd->body.destRect.left = clip.x1; | ||
| 524 | cmd->body.destRect.right = clip.x2; | ||
| 525 | cmd->body.destRect.top = clip.y1; | ||
| 526 | cmd->body.destRect.bottom = clip.y2; | ||
| 527 | |||
| 528 | /* create a clip rect of the crtc in dest coords */ | ||
| 529 | clip.x2 = unit->crtc.mode.hdisplay - clip.x1; | ||
| 530 | clip.y2 = unit->crtc.mode.vdisplay - clip.y1; | ||
| 531 | clip.x1 = 0 - clip.x1; | ||
| 532 | clip.y1 = 0 - clip.y1; | ||
| 533 | |||
| 459 | /* need to reset sid as it is changed by execbuf */ | 534 | /* need to reset sid as it is changed by execbuf */ |
| 460 | cmd->body.srcImage.sid = cpu_to_le32(framebuffer->user_handle); | 535 | cmd->body.srcImage.sid = cpu_to_le32(framebuffer->user_handle); |
| 461 | |||
| 462 | cmd->body.destScreenId = unit->unit; | 536 | cmd->body.destScreenId = unit->unit; |
| 463 | 537 | ||
| 464 | /* | 538 | /* clip and write blits to cmd stream */ |
| 465 | * The blit command is a lot more resilient then the | 539 | vmw_clip_cliprects(tmp, num_clips, clip, blits, &num); |
| 466 | * readback command when it comes to clip rects. So its | ||
| 467 | * okay to go out of bounds. | ||
| 468 | */ | ||
| 469 | 540 | ||
| 470 | cmd->body.destRect.left = clip_x1; | 541 | /* if no cliprects hit skip this */ |
| 471 | cmd->body.destRect.right = clip_x2; | 542 | if (num == 0) |
| 472 | cmd->body.destRect.top = clip_y1; | 543 | continue; |
| 473 | cmd->body.destRect.bottom = clip_y2; | ||
| 474 | 544 | ||
| 475 | 545 | ||
| 546 | /* recalculate package length */ | ||
| 547 | fifo_size = sizeof(*cmd) + sizeof(SVGASignedRect) * num; | ||
| 548 | cmd->header.size = cpu_to_le32(fifo_size - sizeof(cmd->header)); | ||
| 476 | ret = vmw_execbuf_process(file_priv, dev_priv, NULL, cmd, | 549 | ret = vmw_execbuf_process(file_priv, dev_priv, NULL, cmd, |
| 477 | fifo_size, 0, NULL); | 550 | fifo_size, 0, NULL); |
| 478 | 551 | ||
| @@ -480,7 +553,10 @@ static int do_surface_dirty_sou(struct vmw_private *dev_priv, | |||
| 480 | break; | 553 | break; |
| 481 | } | 554 | } |
| 482 | 555 | ||
| 556 | |||
| 483 | kfree(cmd); | 557 | kfree(cmd); |
| 558 | out_free_tmp: | ||
| 559 | kfree(tmp); | ||
| 484 | 560 | ||
| 485 | return ret; | 561 | return ret; |
| 486 | } | 562 | } |
| @@ -556,6 +632,10 @@ static int vmw_kms_new_framebuffer_surface(struct vmw_private *dev_priv, | |||
| 556 | * Sanity checks. | 632 | * Sanity checks. |
| 557 | */ | 633 | */ |
| 558 | 634 | ||
| 635 | /* Surface must be marked as a scanout. */ | ||
| 636 | if (unlikely(!surface->scanout)) | ||
| 637 | return -EINVAL; | ||
| 638 | |||
| 559 | if (unlikely(surface->mip_levels[0] != 1 || | 639 | if (unlikely(surface->mip_levels[0] != 1 || |
| 560 | surface->num_sizes != 1 || | 640 | surface->num_sizes != 1 || |
| 561 | surface->sizes[0].width < mode_cmd->width || | 641 | surface->sizes[0].width < mode_cmd->width || |
| @@ -782,6 +862,7 @@ static int do_dmabuf_dirty_sou(struct drm_file *file_priv, | |||
| 782 | int clip_y1 = clips_ptr->y1 - unit->crtc.y; | 862 | int clip_y1 = clips_ptr->y1 - unit->crtc.y; |
| 783 | int clip_x2 = clips_ptr->x2 - unit->crtc.x; | 863 | int clip_x2 = clips_ptr->x2 - unit->crtc.x; |
| 784 | int clip_y2 = clips_ptr->y2 - unit->crtc.y; | 864 | int clip_y2 = clips_ptr->y2 - unit->crtc.y; |
| 865 | int move_x, move_y; | ||
| 785 | 866 | ||
| 786 | /* skip any crtcs that misses the clip region */ | 867 | /* skip any crtcs that misses the clip region */ |
| 787 | if (clip_x1 >= unit->crtc.mode.hdisplay || | 868 | if (clip_x1 >= unit->crtc.mode.hdisplay || |
| @@ -789,12 +870,21 @@ static int do_dmabuf_dirty_sou(struct drm_file *file_priv, | |||
| 789 | clip_x2 <= 0 || clip_y2 <= 0) | 870 | clip_x2 <= 0 || clip_y2 <= 0) |
| 790 | continue; | 871 | continue; |
| 791 | 872 | ||
| 873 | /* clip size to crtc size */ | ||
| 874 | clip_x2 = min_t(int, clip_x2, unit->crtc.mode.hdisplay); | ||
| 875 | clip_y2 = min_t(int, clip_y2, unit->crtc.mode.vdisplay); | ||
| 876 | |||
| 877 | /* translate both src and dest to bring clip into screen */ | ||
| 878 | move_x = min_t(int, clip_x1, 0); | ||
| 879 | move_y = min_t(int, clip_y1, 0); | ||
| 880 | |||
| 881 | /* actual translate done here */ | ||
| 792 | blits[hit_num].header = SVGA_CMD_BLIT_GMRFB_TO_SCREEN; | 882 | blits[hit_num].header = SVGA_CMD_BLIT_GMRFB_TO_SCREEN; |
| 793 | blits[hit_num].body.destScreenId = unit->unit; | 883 | blits[hit_num].body.destScreenId = unit->unit; |
| 794 | blits[hit_num].body.srcOrigin.x = clips_ptr->x1; | 884 | blits[hit_num].body.srcOrigin.x = clips_ptr->x1 - move_x; |
| 795 | blits[hit_num].body.srcOrigin.y = clips_ptr->y1; | 885 | blits[hit_num].body.srcOrigin.y = clips_ptr->y1 - move_y; |
| 796 | blits[hit_num].body.destRect.left = clip_x1; | 886 | blits[hit_num].body.destRect.left = clip_x1 - move_x; |
| 797 | blits[hit_num].body.destRect.top = clip_y1; | 887 | blits[hit_num].body.destRect.top = clip_y1 - move_y; |
| 798 | blits[hit_num].body.destRect.right = clip_x2; | 888 | blits[hit_num].body.destRect.right = clip_x2; |
| 799 | blits[hit_num].body.destRect.bottom = clip_y2; | 889 | blits[hit_num].body.destRect.bottom = clip_y2; |
| 800 | hit_num++; | 890 | hit_num++; |
| @@ -1033,46 +1123,29 @@ static struct drm_framebuffer *vmw_kms_fb_create(struct drm_device *dev, | |||
| 1033 | return ERR_PTR(-ENOENT); | 1123 | return ERR_PTR(-ENOENT); |
| 1034 | } | 1124 | } |
| 1035 | 1125 | ||
| 1036 | /** | 1126 | /* returns either a dmabuf or surface */ |
| 1037 | * End conditioned code. | 1127 | ret = vmw_user_lookup_handle(dev_priv, tfile, |
| 1038 | */ | 1128 | mode_cmd->handle, |
| 1039 | 1129 | &surface, &bo); | |
| 1040 | ret = vmw_user_surface_lookup_handle(dev_priv, tfile, | ||
| 1041 | mode_cmd->handle, &surface); | ||
| 1042 | if (ret) | 1130 | if (ret) |
| 1043 | goto try_dmabuf; | 1131 | goto err_out; |
| 1044 | 1132 | ||
| 1045 | if (!surface->scanout) | 1133 | /* Create the new framebuffer depending one what we got back */ |
| 1046 | goto err_not_scanout; | 1134 | if (bo) |
| 1047 | 1135 | ret = vmw_kms_new_framebuffer_dmabuf(dev_priv, bo, &vfb, | |
| 1048 | ret = vmw_kms_new_framebuffer_surface(dev_priv, file_priv, surface, | 1136 | mode_cmd); |
| 1049 | &vfb, mode_cmd); | 1137 | else if (surface) |
| 1050 | 1138 | ret = vmw_kms_new_framebuffer_surface(dev_priv, file_priv, | |
| 1051 | /* vmw_user_surface_lookup takes one ref so does new_fb */ | 1139 | surface, &vfb, mode_cmd); |
| 1052 | vmw_surface_unreference(&surface); | 1140 | else |
| 1053 | 1141 | BUG(); | |
| 1054 | if (ret) { | ||
| 1055 | DRM_ERROR("failed to create vmw_framebuffer: %i\n", ret); | ||
| 1056 | ttm_base_object_unref(&user_obj); | ||
| 1057 | return ERR_PTR(ret); | ||
| 1058 | } else | ||
| 1059 | vfb->user_obj = user_obj; | ||
| 1060 | return &vfb->base; | ||
| 1061 | |||
| 1062 | try_dmabuf: | ||
| 1063 | DRM_INFO("%s: trying buffer\n", __func__); | ||
| 1064 | |||
| 1065 | ret = vmw_user_dmabuf_lookup(tfile, mode_cmd->handle, &bo); | ||
| 1066 | if (ret) { | ||
| 1067 | DRM_ERROR("failed to find buffer: %i\n", ret); | ||
| 1068 | return ERR_PTR(-ENOENT); | ||
| 1069 | } | ||
| 1070 | |||
| 1071 | ret = vmw_kms_new_framebuffer_dmabuf(dev_priv, bo, &vfb, | ||
| 1072 | mode_cmd); | ||
| 1073 | 1142 | ||
| 1074 | /* vmw_user_dmabuf_lookup takes one ref so does new_fb */ | 1143 | err_out: |
| 1075 | vmw_dmabuf_unreference(&bo); | 1144 | /* vmw_user_lookup_handle takes one ref so does new_fb */ |
| 1145 | if (bo) | ||
| 1146 | vmw_dmabuf_unreference(&bo); | ||
| 1147 | if (surface) | ||
| 1148 | vmw_surface_unreference(&surface); | ||
| 1076 | 1149 | ||
| 1077 | if (ret) { | 1150 | if (ret) { |
| 1078 | DRM_ERROR("failed to create vmw_framebuffer: %i\n", ret); | 1151 | DRM_ERROR("failed to create vmw_framebuffer: %i\n", ret); |
| @@ -1082,14 +1155,6 @@ try_dmabuf: | |||
| 1082 | vfb->user_obj = user_obj; | 1155 | vfb->user_obj = user_obj; |
| 1083 | 1156 | ||
| 1084 | return &vfb->base; | 1157 | return &vfb->base; |
| 1085 | |||
| 1086 | err_not_scanout: | ||
| 1087 | DRM_ERROR("surface not marked as scanout\n"); | ||
| 1088 | /* vmw_user_surface_lookup takes one ref */ | ||
| 1089 | vmw_surface_unreference(&surface); | ||
| 1090 | ttm_base_object_unref(&user_obj); | ||
| 1091 | |||
| 1092 | return ERR_PTR(-EINVAL); | ||
| 1093 | } | 1158 | } |
| 1094 | 1159 | ||
| 1095 | static struct drm_mode_config_funcs vmw_kms_funcs = { | 1160 | static struct drm_mode_config_funcs vmw_kms_funcs = { |
| @@ -1106,10 +1171,12 @@ int vmw_kms_present(struct vmw_private *dev_priv, | |||
| 1106 | uint32_t num_clips) | 1171 | uint32_t num_clips) |
| 1107 | { | 1172 | { |
| 1108 | struct vmw_display_unit *units[VMWGFX_NUM_DISPLAY_UNITS]; | 1173 | struct vmw_display_unit *units[VMWGFX_NUM_DISPLAY_UNITS]; |
| 1174 | struct drm_clip_rect *tmp; | ||
| 1109 | struct drm_crtc *crtc; | 1175 | struct drm_crtc *crtc; |
| 1110 | size_t fifo_size; | 1176 | size_t fifo_size; |
| 1111 | int i, k, num_units; | 1177 | int i, k, num_units; |
| 1112 | int ret = 0; /* silence warning */ | 1178 | int ret = 0; /* silence warning */ |
| 1179 | int left, right, top, bottom; | ||
| 1113 | 1180 | ||
| 1114 | struct { | 1181 | struct { |
| 1115 | SVGA3dCmdHeader header; | 1182 | SVGA3dCmdHeader header; |
| @@ -1127,60 +1194,95 @@ int vmw_kms_present(struct vmw_private *dev_priv, | |||
| 1127 | BUG_ON(surface == NULL); | 1194 | BUG_ON(surface == NULL); |
| 1128 | BUG_ON(!clips || !num_clips); | 1195 | BUG_ON(!clips || !num_clips); |
| 1129 | 1196 | ||
| 1197 | tmp = kzalloc(sizeof(*tmp) * num_clips, GFP_KERNEL); | ||
| 1198 | if (unlikely(tmp == NULL)) { | ||
| 1199 | DRM_ERROR("Temporary cliprect memory alloc failed.\n"); | ||
| 1200 | return -ENOMEM; | ||
| 1201 | } | ||
| 1202 | |||
| 1130 | fifo_size = sizeof(*cmd) + sizeof(SVGASignedRect) * num_clips; | 1203 | fifo_size = sizeof(*cmd) + sizeof(SVGASignedRect) * num_clips; |
| 1131 | cmd = kmalloc(fifo_size, GFP_KERNEL); | 1204 | cmd = kmalloc(fifo_size, GFP_KERNEL); |
| 1132 | if (unlikely(cmd == NULL)) { | 1205 | if (unlikely(cmd == NULL)) { |
| 1133 | DRM_ERROR("Failed to allocate temporary fifo memory.\n"); | 1206 | DRM_ERROR("Failed to allocate temporary fifo memory.\n"); |
| 1134 | return -ENOMEM; | 1207 | ret = -ENOMEM; |
| 1208 | goto out_free_tmp; | ||
| 1209 | } | ||
| 1210 | |||
| 1211 | left = clips->x; | ||
| 1212 | right = clips->x + clips->w; | ||
| 1213 | top = clips->y; | ||
| 1214 | bottom = clips->y + clips->h; | ||
| 1215 | |||
| 1216 | for (i = 1; i < num_clips; i++) { | ||
| 1217 | left = min_t(int, left, (int)clips[i].x); | ||
| 1218 | right = max_t(int, right, (int)clips[i].x + clips[i].w); | ||
| 1219 | top = min_t(int, top, (int)clips[i].y); | ||
| 1220 | bottom = max_t(int, bottom, (int)clips[i].y + clips[i].h); | ||
| 1135 | } | 1221 | } |
| 1136 | 1222 | ||
| 1137 | /* only need to do this once */ | 1223 | /* only need to do this once */ |
| 1138 | memset(cmd, 0, fifo_size); | 1224 | memset(cmd, 0, fifo_size); |
| 1139 | cmd->header.id = cpu_to_le32(SVGA_3D_CMD_BLIT_SURFACE_TO_SCREEN); | 1225 | cmd->header.id = cpu_to_le32(SVGA_3D_CMD_BLIT_SURFACE_TO_SCREEN); |
| 1140 | cmd->header.size = cpu_to_le32(fifo_size - sizeof(cmd->header)); | ||
| 1141 | |||
| 1142 | cmd->body.srcRect.left = 0; | ||
| 1143 | cmd->body.srcRect.right = surface->sizes[0].width; | ||
| 1144 | cmd->body.srcRect.top = 0; | ||
| 1145 | cmd->body.srcRect.bottom = surface->sizes[0].height; | ||
| 1146 | 1226 | ||
| 1147 | blits = (SVGASignedRect *)&cmd[1]; | 1227 | blits = (SVGASignedRect *)&cmd[1]; |
| 1228 | |||
| 1229 | cmd->body.srcRect.left = left; | ||
| 1230 | cmd->body.srcRect.right = right; | ||
| 1231 | cmd->body.srcRect.top = top; | ||
| 1232 | cmd->body.srcRect.bottom = bottom; | ||
| 1233 | |||
| 1148 | for (i = 0; i < num_clips; i++) { | 1234 | for (i = 0; i < num_clips; i++) { |
| 1149 | blits[i].left = clips[i].x; | 1235 | tmp[i].x1 = clips[i].x - left; |
| 1150 | blits[i].right = clips[i].x + clips[i].w; | 1236 | tmp[i].x2 = clips[i].x + clips[i].w - left; |
| 1151 | blits[i].top = clips[i].y; | 1237 | tmp[i].y1 = clips[i].y - top; |
| 1152 | blits[i].bottom = clips[i].y + clips[i].h; | 1238 | tmp[i].y2 = clips[i].y + clips[i].h - top; |
| 1153 | } | 1239 | } |
| 1154 | 1240 | ||
| 1155 | for (k = 0; k < num_units; k++) { | 1241 | for (k = 0; k < num_units; k++) { |
| 1156 | struct vmw_display_unit *unit = units[k]; | 1242 | struct vmw_display_unit *unit = units[k]; |
| 1157 | int clip_x1 = destX - unit->crtc.x; | 1243 | struct vmw_clip_rect clip; |
| 1158 | int clip_y1 = destY - unit->crtc.y; | 1244 | int num; |
| 1159 | int clip_x2 = clip_x1 + surface->sizes[0].width; | 1245 | |
| 1160 | int clip_y2 = clip_y1 + surface->sizes[0].height; | 1246 | clip.x1 = left + destX - unit->crtc.x; |
| 1247 | clip.y1 = top + destY - unit->crtc.y; | ||
| 1248 | clip.x2 = right + destX - unit->crtc.x; | ||
| 1249 | clip.y2 = bottom + destY - unit->crtc.y; | ||
| 1161 | 1250 | ||
| 1162 | /* skip any crtcs that misses the clip region */ | 1251 | /* skip any crtcs that misses the clip region */ |
| 1163 | if (clip_x1 >= unit->crtc.mode.hdisplay || | 1252 | if (clip.x1 >= unit->crtc.mode.hdisplay || |
| 1164 | clip_y1 >= unit->crtc.mode.vdisplay || | 1253 | clip.y1 >= unit->crtc.mode.vdisplay || |
| 1165 | clip_x2 <= 0 || clip_y2 <= 0) | 1254 | clip.x2 <= 0 || clip.y2 <= 0) |
| 1166 | continue; | 1255 | continue; |
| 1167 | 1256 | ||
| 1257 | /* | ||
| 1258 | * In order for the clip rects to be correctly scaled | ||
| 1259 | * the src and dest rects needs to be the same size. | ||
| 1260 | */ | ||
| 1261 | cmd->body.destRect.left = clip.x1; | ||
| 1262 | cmd->body.destRect.right = clip.x2; | ||
| 1263 | cmd->body.destRect.top = clip.y1; | ||
| 1264 | cmd->body.destRect.bottom = clip.y2; | ||
| 1265 | |||
| 1266 | /* create a clip rect of the crtc in dest coords */ | ||
| 1267 | clip.x2 = unit->crtc.mode.hdisplay - clip.x1; | ||
| 1268 | clip.y2 = unit->crtc.mode.vdisplay - clip.y1; | ||
| 1269 | clip.x1 = 0 - clip.x1; | ||
| 1270 | clip.y1 = 0 - clip.y1; | ||
| 1271 | |||
| 1168 | /* need to reset sid as it is changed by execbuf */ | 1272 | /* need to reset sid as it is changed by execbuf */ |
| 1169 | cmd->body.srcImage.sid = sid; | 1273 | cmd->body.srcImage.sid = sid; |
| 1170 | |||
| 1171 | cmd->body.destScreenId = unit->unit; | 1274 | cmd->body.destScreenId = unit->unit; |
| 1172 | 1275 | ||
| 1173 | /* | 1276 | /* clip and write blits to cmd stream */ |
| 1174 | * The blit command is a lot more resilient then the | 1277 | vmw_clip_cliprects(tmp, num_clips, clip, blits, &num); |
| 1175 | * readback command when it comes to clip rects. So its | ||
| 1176 | * okay to go out of bounds. | ||
| 1177 | */ | ||
| 1178 | 1278 | ||
| 1179 | cmd->body.destRect.left = clip_x1; | 1279 | /* if no cliprects hit skip this */ |
| 1180 | cmd->body.destRect.right = clip_x2; | 1280 | if (num == 0) |
| 1181 | cmd->body.destRect.top = clip_y1; | 1281 | continue; |
| 1182 | cmd->body.destRect.bottom = clip_y2; | ||
| 1183 | 1282 | ||
| 1283 | /* recalculate package length */ | ||
| 1284 | fifo_size = sizeof(*cmd) + sizeof(SVGASignedRect) * num; | ||
| 1285 | cmd->header.size = cpu_to_le32(fifo_size - sizeof(cmd->header)); | ||
| 1184 | ret = vmw_execbuf_process(file_priv, dev_priv, NULL, cmd, | 1286 | ret = vmw_execbuf_process(file_priv, dev_priv, NULL, cmd, |
| 1185 | fifo_size, 0, NULL); | 1287 | fifo_size, 0, NULL); |
| 1186 | 1288 | ||
| @@ -1189,6 +1291,8 @@ int vmw_kms_present(struct vmw_private *dev_priv, | |||
| 1189 | } | 1291 | } |
| 1190 | 1292 | ||
| 1191 | kfree(cmd); | 1293 | kfree(cmd); |
| 1294 | out_free_tmp: | ||
| 1295 | kfree(tmp); | ||
| 1192 | 1296 | ||
| 1193 | return ret; | 1297 | return ret; |
| 1194 | } | 1298 | } |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h index af8e6e5bd96..e1cb8556355 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h | |||
| @@ -62,9 +62,14 @@ struct vmw_framebuffer { | |||
| 62 | int vmw_cursor_update_image(struct vmw_private *dev_priv, | 62 | int vmw_cursor_update_image(struct vmw_private *dev_priv, |
| 63 | u32 *image, u32 width, u32 height, | 63 | u32 *image, u32 width, u32 height, |
| 64 | u32 hotspotX, u32 hotspotY); | 64 | u32 hotspotX, u32 hotspotY); |
| 65 | int vmw_cursor_update_dmabuf(struct vmw_private *dev_priv, | ||
| 66 | struct vmw_dma_buffer *dmabuf, | ||
| 67 | u32 width, u32 height, | ||
| 68 | u32 hotspotX, u32 hotspotY); | ||
| 65 | void vmw_cursor_update_position(struct vmw_private *dev_priv, | 69 | void vmw_cursor_update_position(struct vmw_private *dev_priv, |
| 66 | bool show, int x, int y); | 70 | bool show, int x, int y); |
| 67 | 71 | ||
| 72 | |||
| 68 | /** | 73 | /** |
| 69 | * Base class display unit. | 74 | * Base class display unit. |
| 70 | * | 75 | * |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c index 90c5e392849..8f8dbd43c33 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c | |||
| @@ -74,9 +74,10 @@ static int vmw_ldu_commit_list(struct vmw_private *dev_priv) | |||
| 74 | { | 74 | { |
| 75 | struct vmw_legacy_display *lds = dev_priv->ldu_priv; | 75 | struct vmw_legacy_display *lds = dev_priv->ldu_priv; |
| 76 | struct vmw_legacy_display_unit *entry; | 76 | struct vmw_legacy_display_unit *entry; |
| 77 | struct vmw_display_unit *du = NULL; | ||
| 77 | struct drm_framebuffer *fb = NULL; | 78 | struct drm_framebuffer *fb = NULL; |
| 78 | struct drm_crtc *crtc = NULL; | 79 | struct drm_crtc *crtc = NULL; |
| 79 | int i = 0; | 80 | int i = 0, ret; |
| 80 | 81 | ||
| 81 | /* If there is no display topology the host just assumes | 82 | /* If there is no display topology the host just assumes |
| 82 | * that the guest will set the same layout as the host. | 83 | * that the guest will set the same layout as the host. |
| @@ -129,6 +130,25 @@ static int vmw_ldu_commit_list(struct vmw_private *dev_priv) | |||
| 129 | 130 | ||
| 130 | lds->last_num_active = lds->num_active; | 131 | lds->last_num_active = lds->num_active; |
| 131 | 132 | ||
| 133 | |||
| 134 | /* Find the first du with a cursor. */ | ||
| 135 | list_for_each_entry(entry, &lds->active, active) { | ||
| 136 | du = &entry->base; | ||
| 137 | |||
| 138 | if (!du->cursor_dmabuf) | ||
| 139 | continue; | ||
| 140 | |||
| 141 | ret = vmw_cursor_update_dmabuf(dev_priv, | ||
| 142 | du->cursor_dmabuf, | ||
| 143 | 64, 64, | ||
| 144 | du->hotspot_x, | ||
| 145 | du->hotspot_y); | ||
| 146 | if (ret == 0) | ||
| 147 | break; | ||
| 148 | |||
| 149 | DRM_ERROR("Could not update cursor image\n"); | ||
| 150 | } | ||
| 151 | |||
| 132 | return 0; | 152 | return 0; |
| 133 | } | 153 | } |
| 134 | 154 | ||
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c index 86c5e4cceb3..1c7f09e2681 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c | |||
| @@ -1190,6 +1190,29 @@ void vmw_resource_unreserve(struct list_head *list) | |||
| 1190 | write_unlock(lock); | 1190 | write_unlock(lock); |
| 1191 | } | 1191 | } |
| 1192 | 1192 | ||
| 1193 | /** | ||
| 1194 | * Helper function that looks either a surface or dmabuf. | ||
| 1195 | * | ||
| 1196 | * The pointer this pointed at by out_surf and out_buf needs to be null. | ||
| 1197 | */ | ||
| 1198 | int vmw_user_lookup_handle(struct vmw_private *dev_priv, | ||
| 1199 | struct ttm_object_file *tfile, | ||
| 1200 | uint32_t handle, | ||
| 1201 | struct vmw_surface **out_surf, | ||
| 1202 | struct vmw_dma_buffer **out_buf) | ||
| 1203 | { | ||
| 1204 | int ret; | ||
| 1205 | |||
| 1206 | BUG_ON(*out_surf || *out_buf); | ||
| 1207 | |||
| 1208 | ret = vmw_user_surface_lookup_handle(dev_priv, tfile, handle, out_surf); | ||
| 1209 | if (!ret) | ||
| 1210 | return 0; | ||
| 1211 | |||
| 1212 | ret = vmw_user_dmabuf_lookup(tfile, handle, out_buf); | ||
| 1213 | return ret; | ||
| 1214 | } | ||
| 1215 | |||
| 1193 | 1216 | ||
| 1194 | int vmw_user_surface_lookup_handle(struct vmw_private *dev_priv, | 1217 | int vmw_user_surface_lookup_handle(struct vmw_private *dev_priv, |
| 1195 | struct ttm_object_file *tfile, | 1218 | struct ttm_object_file *tfile, |
diff --git a/drivers/hwmon/jz4740-hwmon.c b/drivers/hwmon/jz4740-hwmon.c index 7a48b1eb423..5253d23361d 100644 --- a/drivers/hwmon/jz4740-hwmon.c +++ b/drivers/hwmon/jz4740-hwmon.c | |||
| @@ -59,7 +59,7 @@ static ssize_t jz4740_hwmon_read_adcin(struct device *dev, | |||
| 59 | { | 59 | { |
| 60 | struct jz4740_hwmon *hwmon = dev_get_drvdata(dev); | 60 | struct jz4740_hwmon *hwmon = dev_get_drvdata(dev); |
| 61 | struct completion *completion = &hwmon->read_completion; | 61 | struct completion *completion = &hwmon->read_completion; |
| 62 | unsigned long t; | 62 | long t; |
| 63 | unsigned long val; | 63 | unsigned long val; |
| 64 | int ret; | 64 | int ret; |
| 65 | 65 | ||
| @@ -203,7 +203,7 @@ static int __devexit jz4740_hwmon_remove(struct platform_device *pdev) | |||
| 203 | return 0; | 203 | return 0; |
| 204 | } | 204 | } |
| 205 | 205 | ||
| 206 | struct platform_driver jz4740_hwmon_driver = { | 206 | static struct platform_driver jz4740_hwmon_driver = { |
| 207 | .probe = jz4740_hwmon_probe, | 207 | .probe = jz4740_hwmon_probe, |
| 208 | .remove = __devexit_p(jz4740_hwmon_remove), | 208 | .remove = __devexit_p(jz4740_hwmon_remove), |
| 209 | .driver = { | 209 | .driver = { |
diff --git a/drivers/i2c/busses/i2c-eg20t.c b/drivers/i2c/busses/i2c-eg20t.c index 8cebef49aea..18936ac9d51 100644 --- a/drivers/i2c/busses/i2c-eg20t.c +++ b/drivers/i2c/busses/i2c-eg20t.c | |||
| @@ -893,6 +893,13 @@ static int __devinit pch_i2c_probe(struct pci_dev *pdev, | |||
| 893 | /* Set the number of I2C channel instance */ | 893 | /* Set the number of I2C channel instance */ |
| 894 | adap_info->ch_num = id->driver_data; | 894 | adap_info->ch_num = id->driver_data; |
| 895 | 895 | ||
| 896 | ret = request_irq(pdev->irq, pch_i2c_handler, IRQF_SHARED, | ||
| 897 | KBUILD_MODNAME, adap_info); | ||
| 898 | if (ret) { | ||
| 899 | pch_pci_err(pdev, "request_irq FAILED\n"); | ||
| 900 | goto err_request_irq; | ||
| 901 | } | ||
| 902 | |||
| 896 | for (i = 0; i < adap_info->ch_num; i++) { | 903 | for (i = 0; i < adap_info->ch_num; i++) { |
| 897 | pch_adap = &adap_info->pch_data[i].pch_adapter; | 904 | pch_adap = &adap_info->pch_data[i].pch_adapter; |
| 898 | adap_info->pch_i2c_suspended = false; | 905 | adap_info->pch_i2c_suspended = false; |
| @@ -910,28 +917,23 @@ static int __devinit pch_i2c_probe(struct pci_dev *pdev, | |||
| 910 | 917 | ||
| 911 | pch_adap->dev.parent = &pdev->dev; | 918 | pch_adap->dev.parent = &pdev->dev; |
| 912 | 919 | ||
| 920 | pch_i2c_init(&adap_info->pch_data[i]); | ||
| 913 | ret = i2c_add_adapter(pch_adap); | 921 | ret = i2c_add_adapter(pch_adap); |
| 914 | if (ret) { | 922 | if (ret) { |
| 915 | pch_pci_err(pdev, "i2c_add_adapter[ch:%d] FAILED\n", i); | 923 | pch_pci_err(pdev, "i2c_add_adapter[ch:%d] FAILED\n", i); |
| 916 | goto err_i2c_add_adapter; | 924 | goto err_add_adapter; |
| 917 | } | 925 | } |
| 918 | |||
| 919 | pch_i2c_init(&adap_info->pch_data[i]); | ||
| 920 | } | ||
| 921 | ret = request_irq(pdev->irq, pch_i2c_handler, IRQF_SHARED, | ||
| 922 | KBUILD_MODNAME, adap_info); | ||
| 923 | if (ret) { | ||
| 924 | pch_pci_err(pdev, "request_irq FAILED\n"); | ||
| 925 | goto err_i2c_add_adapter; | ||
| 926 | } | 926 | } |
| 927 | 927 | ||
| 928 | pci_set_drvdata(pdev, adap_info); | 928 | pci_set_drvdata(pdev, adap_info); |
| 929 | pch_pci_dbg(pdev, "returns %d.\n", ret); | 929 | pch_pci_dbg(pdev, "returns %d.\n", ret); |
| 930 | return 0; | 930 | return 0; |
| 931 | 931 | ||
| 932 | err_i2c_add_adapter: | 932 | err_add_adapter: |
| 933 | for (j = 0; j < i; j++) | 933 | for (j = 0; j < i; j++) |
| 934 | i2c_del_adapter(&adap_info->pch_data[j].pch_adapter); | 934 | i2c_del_adapter(&adap_info->pch_data[j].pch_adapter); |
| 935 | free_irq(pdev->irq, adap_info); | ||
| 936 | err_request_irq: | ||
| 935 | pci_iounmap(pdev, base_addr); | 937 | pci_iounmap(pdev, base_addr); |
| 936 | err_pci_iomap: | 938 | err_pci_iomap: |
| 937 | pci_release_regions(pdev); | 939 | pci_release_regions(pdev); |
diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c index a43d0023446..fa23faa20f0 100644 --- a/drivers/i2c/busses/i2c-omap.c +++ b/drivers/i2c/busses/i2c-omap.c | |||
| @@ -1047,13 +1047,14 @@ omap_i2c_probe(struct platform_device *pdev) | |||
| 1047 | * size. This is to ensure that we can handle the status on int | 1047 | * size. This is to ensure that we can handle the status on int |
| 1048 | * call back latencies. | 1048 | * call back latencies. |
| 1049 | */ | 1049 | */ |
| 1050 | if (dev->rev >= OMAP_I2C_REV_ON_3530_4430) { | 1050 | |
| 1051 | dev->fifo_size = 0; | 1051 | dev->fifo_size = (dev->fifo_size / 2); |
| 1052 | |||
| 1053 | if (dev->rev >= OMAP_I2C_REV_ON_3530_4430) | ||
| 1052 | dev->b_hw = 0; /* Disable hardware fixes */ | 1054 | dev->b_hw = 0; /* Disable hardware fixes */ |
| 1053 | } else { | 1055 | else |
| 1054 | dev->fifo_size = (dev->fifo_size / 2); | ||
| 1055 | dev->b_hw = 1; /* Enable hardware fixes */ | 1056 | dev->b_hw = 1; /* Enable hardware fixes */ |
| 1056 | } | 1057 | |
| 1057 | /* calculate wakeup latency constraint for MPU */ | 1058 | /* calculate wakeup latency constraint for MPU */ |
| 1058 | if (dev->set_mpu_wkup_lat != NULL) | 1059 | if (dev->set_mpu_wkup_lat != NULL) |
| 1059 | dev->latency = (1000000 * dev->fifo_size) / | 1060 | dev->latency = (1000000 * dev->fifo_size) / |
diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c index 2754cef86a0..4c171808168 100644 --- a/drivers/i2c/busses/i2c-s3c2410.c +++ b/drivers/i2c/busses/i2c-s3c2410.c | |||
| @@ -534,6 +534,7 @@ static int s3c24xx_i2c_doxfer(struct s3c24xx_i2c *i2c, | |||
| 534 | 534 | ||
| 535 | /* first, try busy waiting briefly */ | 535 | /* first, try busy waiting briefly */ |
| 536 | do { | 536 | do { |
| 537 | cpu_relax(); | ||
| 537 | iicstat = readl(i2c->regs + S3C2410_IICSTAT); | 538 | iicstat = readl(i2c->regs + S3C2410_IICSTAT); |
| 538 | } while ((iicstat & S3C2410_IICSTAT_START) && --spins); | 539 | } while ((iicstat & S3C2410_IICSTAT_START) && --spins); |
| 539 | 540 | ||
| @@ -786,7 +787,7 @@ static void s3c24xx_i2c_dt_gpio_free(struct s3c24xx_i2c *i2c) | |||
| 786 | #else | 787 | #else |
| 787 | static int s3c24xx_i2c_parse_dt_gpio(struct s3c24xx_i2c *i2c) | 788 | static int s3c24xx_i2c_parse_dt_gpio(struct s3c24xx_i2c *i2c) |
| 788 | { | 789 | { |
| 789 | return -EINVAL; | 790 | return 0; |
| 790 | } | 791 | } |
| 791 | 792 | ||
| 792 | static void s3c24xx_i2c_dt_gpio_free(struct s3c24xx_i2c *i2c) | 793 | static void s3c24xx_i2c_dt_gpio_free(struct s3c24xx_i2c *i2c) |
diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c index 75ff821c0af..d0d4aa9f480 100644 --- a/drivers/infiniband/core/cma.c +++ b/drivers/infiniband/core/cma.c | |||
| @@ -2513,6 +2513,9 @@ static int cma_resolve_ib_udp(struct rdma_id_private *id_priv, | |||
| 2513 | 2513 | ||
| 2514 | req.private_data_len = sizeof(struct cma_hdr) + | 2514 | req.private_data_len = sizeof(struct cma_hdr) + |
| 2515 | conn_param->private_data_len; | 2515 | conn_param->private_data_len; |
| 2516 | if (req.private_data_len < conn_param->private_data_len) | ||
| 2517 | return -EINVAL; | ||
| 2518 | |||
| 2516 | req.private_data = kzalloc(req.private_data_len, GFP_ATOMIC); | 2519 | req.private_data = kzalloc(req.private_data_len, GFP_ATOMIC); |
| 2517 | if (!req.private_data) | 2520 | if (!req.private_data) |
| 2518 | return -ENOMEM; | 2521 | return -ENOMEM; |
| @@ -2562,6 +2565,9 @@ static int cma_connect_ib(struct rdma_id_private *id_priv, | |||
| 2562 | memset(&req, 0, sizeof req); | 2565 | memset(&req, 0, sizeof req); |
| 2563 | offset = cma_user_data_offset(id_priv->id.ps); | 2566 | offset = cma_user_data_offset(id_priv->id.ps); |
| 2564 | req.private_data_len = offset + conn_param->private_data_len; | 2567 | req.private_data_len = offset + conn_param->private_data_len; |
| 2568 | if (req.private_data_len < conn_param->private_data_len) | ||
| 2569 | return -EINVAL; | ||
| 2570 | |||
| 2565 | private_data = kzalloc(req.private_data_len, GFP_ATOMIC); | 2571 | private_data = kzalloc(req.private_data_len, GFP_ATOMIC); |
| 2566 | if (!private_data) | 2572 | if (!private_data) |
| 2567 | return -ENOMEM; | 2573 | return -ENOMEM; |
diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c index 77f3dbc0aaa..18836cdf1e1 100644 --- a/drivers/infiniband/hw/mlx4/main.c +++ b/drivers/infiniband/hw/mlx4/main.c | |||
| @@ -1244,7 +1244,8 @@ err_reg: | |||
| 1244 | 1244 | ||
| 1245 | err_counter: | 1245 | err_counter: |
| 1246 | for (; i; --i) | 1246 | for (; i; --i) |
| 1247 | mlx4_counter_free(ibdev->dev, ibdev->counters[i - 1]); | 1247 | if (ibdev->counters[i - 1] != -1) |
| 1248 | mlx4_counter_free(ibdev->dev, ibdev->counters[i - 1]); | ||
| 1248 | 1249 | ||
| 1249 | err_map: | 1250 | err_map: |
| 1250 | iounmap(ibdev->uar_map); | 1251 | iounmap(ibdev->uar_map); |
| @@ -1275,7 +1276,8 @@ static void mlx4_ib_remove(struct mlx4_dev *dev, void *ibdev_ptr) | |||
| 1275 | } | 1276 | } |
| 1276 | iounmap(ibdev->uar_map); | 1277 | iounmap(ibdev->uar_map); |
| 1277 | for (p = 0; p < ibdev->num_ports; ++p) | 1278 | for (p = 0; p < ibdev->num_ports; ++p) |
| 1278 | mlx4_counter_free(ibdev->dev, ibdev->counters[p]); | 1279 | if (ibdev->counters[p] != -1) |
| 1280 | mlx4_counter_free(ibdev->dev, ibdev->counters[p]); | ||
| 1279 | mlx4_foreach_port(p, dev, MLX4_PORT_TYPE_IB) | 1281 | mlx4_foreach_port(p, dev, MLX4_PORT_TYPE_IB) |
| 1280 | mlx4_CLOSE_PORT(dev, p); | 1282 | mlx4_CLOSE_PORT(dev, p); |
| 1281 | 1283 | ||
diff --git a/drivers/infiniband/hw/qib/qib_file_ops.c b/drivers/infiniband/hw/qib/qib_file_ops.c index 574600ef5b4..a7403248d83 100644 --- a/drivers/infiniband/hw/qib/qib_file_ops.c +++ b/drivers/infiniband/hw/qib/qib_file_ops.c | |||
| @@ -1285,7 +1285,7 @@ static int setup_ctxt(struct qib_pportdata *ppd, int ctxt, | |||
| 1285 | strlcpy(rcd->comm, current->comm, sizeof(rcd->comm)); | 1285 | strlcpy(rcd->comm, current->comm, sizeof(rcd->comm)); |
| 1286 | ctxt_fp(fp) = rcd; | 1286 | ctxt_fp(fp) = rcd; |
| 1287 | qib_stats.sps_ctxts++; | 1287 | qib_stats.sps_ctxts++; |
| 1288 | dd->freectxts++; | 1288 | dd->freectxts--; |
| 1289 | ret = 0; | 1289 | ret = 0; |
| 1290 | goto bail; | 1290 | goto bail; |
| 1291 | 1291 | ||
| @@ -1794,7 +1794,7 @@ static int qib_close(struct inode *in, struct file *fp) | |||
| 1794 | if (dd->pageshadow) | 1794 | if (dd->pageshadow) |
| 1795 | unlock_expected_tids(rcd); | 1795 | unlock_expected_tids(rcd); |
| 1796 | qib_stats.sps_ctxts--; | 1796 | qib_stats.sps_ctxts--; |
| 1797 | dd->freectxts--; | 1797 | dd->freectxts++; |
| 1798 | } | 1798 | } |
| 1799 | 1799 | ||
| 1800 | mutex_unlock(&qib_mutex); | 1800 | mutex_unlock(&qib_mutex); |
diff --git a/drivers/input/misc/cma3000_d0x.c b/drivers/input/misc/cma3000_d0x.c index 80793f1608e..06517e60e50 100644 --- a/drivers/input/misc/cma3000_d0x.c +++ b/drivers/input/misc/cma3000_d0x.c | |||
| @@ -115,8 +115,8 @@ static void decode_mg(struct cma3000_accl_data *data, int *datax, | |||
| 115 | static irqreturn_t cma3000_thread_irq(int irq, void *dev_id) | 115 | static irqreturn_t cma3000_thread_irq(int irq, void *dev_id) |
| 116 | { | 116 | { |
| 117 | struct cma3000_accl_data *data = dev_id; | 117 | struct cma3000_accl_data *data = dev_id; |
| 118 | int datax, datay, dataz; | 118 | int datax, datay, dataz, intr_status; |
| 119 | u8 ctrl, mode, range, intr_status; | 119 | u8 ctrl, mode, range; |
| 120 | 120 | ||
| 121 | intr_status = CMA3000_READ(data, CMA3000_INTSTATUS, "interrupt status"); | 121 | intr_status = CMA3000_READ(data, CMA3000_INTSTATUS, "interrupt status"); |
| 122 | if (intr_status < 0) | 122 | if (intr_status < 0) |
diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c index c080b828e5d..a6dcd18e9ad 100644 --- a/drivers/input/mouse/synaptics.c +++ b/drivers/input/mouse/synaptics.c | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | */ | 24 | */ |
| 25 | 25 | ||
| 26 | #include <linux/module.h> | 26 | #include <linux/module.h> |
| 27 | #include <linux/delay.h> | ||
| 27 | #include <linux/dmi.h> | 28 | #include <linux/dmi.h> |
| 28 | #include <linux/input/mt.h> | 29 | #include <linux/input/mt.h> |
| 29 | #include <linux/serio.h> | 30 | #include <linux/serio.h> |
| @@ -1220,6 +1221,16 @@ static int synaptics_reconnect(struct psmouse *psmouse) | |||
| 1220 | 1221 | ||
| 1221 | do { | 1222 | do { |
| 1222 | psmouse_reset(psmouse); | 1223 | psmouse_reset(psmouse); |
| 1224 | if (retry) { | ||
| 1225 | /* | ||
| 1226 | * On some boxes, right after resuming, the touchpad | ||
| 1227 | * needs some time to finish initializing (I assume | ||
| 1228 | * it needs time to calibrate) and start responding | ||
| 1229 | * to Synaptics-specific queries, so let's wait a | ||
| 1230 | * bit. | ||
| 1231 | */ | ||
| 1232 | ssleep(1); | ||
| 1233 | } | ||
| 1223 | error = synaptics_detect(psmouse, 0); | 1234 | error = synaptics_detect(psmouse, 0); |
| 1224 | } while (error && ++retry < 3); | 1235 | } while (error && ++retry < 3); |
| 1225 | 1236 | ||
diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c index da0d8761e77..2ee47d01a3b 100644 --- a/drivers/input/tablet/wacom_wac.c +++ b/drivers/input/tablet/wacom_wac.c | |||
| @@ -1470,6 +1470,9 @@ static const struct wacom_features wacom_features_0xE3 = | |||
| 1470 | static const struct wacom_features wacom_features_0xE6 = | 1470 | static const struct wacom_features wacom_features_0xE6 = |
| 1471 | { "Wacom ISDv4 E6", WACOM_PKGLEN_TPC2FG, 27760, 15694, 255, | 1471 | { "Wacom ISDv4 E6", WACOM_PKGLEN_TPC2FG, 27760, 15694, 255, |
| 1472 | 0, TABLETPC2FG, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; | 1472 | 0, TABLETPC2FG, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; |
| 1473 | static const struct wacom_features wacom_features_0xEC = | ||
| 1474 | { "Wacom ISDv4 EC", WACOM_PKGLEN_GRAPHIRE, 25710, 14500, 255, | ||
| 1475 | 0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; | ||
| 1473 | static const struct wacom_features wacom_features_0x47 = | 1476 | static const struct wacom_features wacom_features_0x47 = |
| 1474 | { "Wacom Intuos2 6x8", WACOM_PKGLEN_INTUOS, 20320, 16240, 1023, | 1477 | { "Wacom Intuos2 6x8", WACOM_PKGLEN_INTUOS, 20320, 16240, 1023, |
| 1475 | 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; | 1478 | 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; |
| @@ -1611,6 +1614,7 @@ const struct usb_device_id wacom_ids[] = { | |||
| 1611 | { USB_DEVICE_WACOM(0xE2) }, | 1614 | { USB_DEVICE_WACOM(0xE2) }, |
| 1612 | { USB_DEVICE_WACOM(0xE3) }, | 1615 | { USB_DEVICE_WACOM(0xE3) }, |
| 1613 | { USB_DEVICE_WACOM(0xE6) }, | 1616 | { USB_DEVICE_WACOM(0xE6) }, |
| 1617 | { USB_DEVICE_WACOM(0xEC) }, | ||
| 1614 | { USB_DEVICE_WACOM(0x47) }, | 1618 | { USB_DEVICE_WACOM(0x47) }, |
| 1615 | { USB_DEVICE_LENOVO(0x6004) }, | 1619 | { USB_DEVICE_LENOVO(0x6004) }, |
| 1616 | { } | 1620 | { } |
diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index a004c3945c6..bdc447fd476 100644 --- a/drivers/iommu/intel-iommu.c +++ b/drivers/iommu/intel-iommu.c | |||
| @@ -405,6 +405,9 @@ int dmar_disabled = 0; | |||
| 405 | int dmar_disabled = 1; | 405 | int dmar_disabled = 1; |
| 406 | #endif /*CONFIG_INTEL_IOMMU_DEFAULT_ON*/ | 406 | #endif /*CONFIG_INTEL_IOMMU_DEFAULT_ON*/ |
| 407 | 407 | ||
| 408 | int intel_iommu_enabled = 0; | ||
| 409 | EXPORT_SYMBOL_GPL(intel_iommu_enabled); | ||
| 410 | |||
| 408 | static int dmar_map_gfx = 1; | 411 | static int dmar_map_gfx = 1; |
| 409 | static int dmar_forcedac; | 412 | static int dmar_forcedac; |
| 410 | static int intel_iommu_strict; | 413 | static int intel_iommu_strict; |
| @@ -3647,6 +3650,8 @@ int __init intel_iommu_init(void) | |||
| 3647 | 3650 | ||
| 3648 | bus_register_notifier(&pci_bus_type, &device_nb); | 3651 | bus_register_notifier(&pci_bus_type, &device_nb); |
| 3649 | 3652 | ||
| 3653 | intel_iommu_enabled = 1; | ||
| 3654 | |||
| 3650 | return 0; | 3655 | return 0; |
| 3651 | } | 3656 | } |
| 3652 | 3657 | ||
diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c index b6907118283..6d03774b176 100644 --- a/drivers/md/bitmap.c +++ b/drivers/md/bitmap.c | |||
| @@ -1393,9 +1393,6 @@ void bitmap_endwrite(struct bitmap *bitmap, sector_t offset, unsigned long secto | |||
| 1393 | atomic_read(&bitmap->behind_writes), | 1393 | atomic_read(&bitmap->behind_writes), |
| 1394 | bitmap->mddev->bitmap_info.max_write_behind); | 1394 | bitmap->mddev->bitmap_info.max_write_behind); |
| 1395 | } | 1395 | } |
| 1396 | if (bitmap->mddev->degraded) | ||
| 1397 | /* Never clear bits or update events_cleared when degraded */ | ||
| 1398 | success = 0; | ||
| 1399 | 1396 | ||
| 1400 | while (sectors) { | 1397 | while (sectors) { |
| 1401 | sector_t blocks; | 1398 | sector_t blocks; |
| @@ -1409,7 +1406,7 @@ void bitmap_endwrite(struct bitmap *bitmap, sector_t offset, unsigned long secto | |||
| 1409 | return; | 1406 | return; |
| 1410 | } | 1407 | } |
| 1411 | 1408 | ||
| 1412 | if (success && | 1409 | if (success && !bitmap->mddev->degraded && |
| 1413 | bitmap->events_cleared < bitmap->mddev->events) { | 1410 | bitmap->events_cleared < bitmap->mddev->events) { |
| 1414 | bitmap->events_cleared = bitmap->mddev->events; | 1411 | bitmap->events_cleared = bitmap->mddev->events; |
| 1415 | bitmap->need_sync = 1; | 1412 | bitmap->need_sync = 1; |
diff --git a/drivers/md/linear.c b/drivers/md/linear.c index c3273efd08c..627456542fb 100644 --- a/drivers/md/linear.c +++ b/drivers/md/linear.c | |||
| @@ -230,6 +230,7 @@ static int linear_add(struct mddev *mddev, struct md_rdev *rdev) | |||
| 230 | return -EINVAL; | 230 | return -EINVAL; |
| 231 | 231 | ||
| 232 | rdev->raid_disk = rdev->saved_raid_disk; | 232 | rdev->raid_disk = rdev->saved_raid_disk; |
| 233 | rdev->saved_raid_disk = -1; | ||
| 233 | 234 | ||
| 234 | newconf = linear_conf(mddev,mddev->raid_disks+1); | 235 | newconf = linear_conf(mddev,mddev->raid_disks+1); |
| 235 | 236 | ||
diff --git a/drivers/md/md.c b/drivers/md/md.c index ee981737edf..f47f1f8ac44 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
| @@ -7360,8 +7360,7 @@ static int remove_and_add_spares(struct mddev *mddev) | |||
| 7360 | spares++; | 7360 | spares++; |
| 7361 | md_new_event(mddev); | 7361 | md_new_event(mddev); |
| 7362 | set_bit(MD_CHANGE_DEVS, &mddev->flags); | 7362 | set_bit(MD_CHANGE_DEVS, &mddev->flags); |
| 7363 | } else | 7363 | } |
| 7364 | break; | ||
| 7365 | } | 7364 | } |
| 7366 | } | 7365 | } |
| 7367 | } | 7366 | } |
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 31670f8d6b6..858fdbb7eb0 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
| @@ -3065,11 +3065,17 @@ static void analyse_stripe(struct stripe_head *sh, struct stripe_head_state *s) | |||
| 3065 | } | 3065 | } |
| 3066 | } else if (test_bit(In_sync, &rdev->flags)) | 3066 | } else if (test_bit(In_sync, &rdev->flags)) |
| 3067 | set_bit(R5_Insync, &dev->flags); | 3067 | set_bit(R5_Insync, &dev->flags); |
| 3068 | else { | 3068 | else if (sh->sector + STRIPE_SECTORS <= rdev->recovery_offset) |
| 3069 | /* in sync if before recovery_offset */ | 3069 | /* in sync if before recovery_offset */ |
| 3070 | if (sh->sector + STRIPE_SECTORS <= rdev->recovery_offset) | 3070 | set_bit(R5_Insync, &dev->flags); |
| 3071 | set_bit(R5_Insync, &dev->flags); | 3071 | else if (test_bit(R5_UPTODATE, &dev->flags) && |
| 3072 | } | 3072 | test_bit(R5_Expanded, &dev->flags)) |
| 3073 | /* If we've reshaped into here, we assume it is Insync. | ||
| 3074 | * We will shortly update recovery_offset to make | ||
| 3075 | * it official. | ||
| 3076 | */ | ||
| 3077 | set_bit(R5_Insync, &dev->flags); | ||
| 3078 | |||
| 3073 | if (rdev && test_bit(R5_WriteError, &dev->flags)) { | 3079 | if (rdev && test_bit(R5_WriteError, &dev->flags)) { |
| 3074 | clear_bit(R5_Insync, &dev->flags); | 3080 | clear_bit(R5_Insync, &dev->flags); |
| 3075 | if (!test_bit(Faulty, &rdev->flags)) { | 3081 | if (!test_bit(Faulty, &rdev->flags)) { |
diff --git a/drivers/media/common/tuners/mxl5007t.c b/drivers/media/common/tuners/mxl5007t.c index 7eb1bf75cd0..5d02221e99d 100644 --- a/drivers/media/common/tuners/mxl5007t.c +++ b/drivers/media/common/tuners/mxl5007t.c | |||
| @@ -488,9 +488,10 @@ static int mxl5007t_write_regs(struct mxl5007t_state *state, | |||
| 488 | 488 | ||
| 489 | static int mxl5007t_read_reg(struct mxl5007t_state *state, u8 reg, u8 *val) | 489 | static int mxl5007t_read_reg(struct mxl5007t_state *state, u8 reg, u8 *val) |
| 490 | { | 490 | { |
| 491 | u8 buf[2] = { 0xfb, reg }; | ||
| 491 | struct i2c_msg msg[] = { | 492 | struct i2c_msg msg[] = { |
| 492 | { .addr = state->i2c_props.addr, .flags = 0, | 493 | { .addr = state->i2c_props.addr, .flags = 0, |
| 493 | .buf = ®, .len = 1 }, | 494 | .buf = buf, .len = 2 }, |
| 494 | { .addr = state->i2c_props.addr, .flags = I2C_M_RD, | 495 | { .addr = state->i2c_props.addr, .flags = I2C_M_RD, |
| 495 | .buf = val, .len = 1 }, | 496 | .buf = val, .len = 1 }, |
| 496 | }; | 497 | }; |
diff --git a/drivers/media/common/tuners/tda18218.c b/drivers/media/common/tuners/tda18218.c index aacfe2387e2..4fc29730a12 100644 --- a/drivers/media/common/tuners/tda18218.c +++ b/drivers/media/common/tuners/tda18218.c | |||
| @@ -141,7 +141,7 @@ static int tda18218_set_params(struct dvb_frontend *fe, | |||
| 141 | switch (params->u.ofdm.bandwidth) { | 141 | switch (params->u.ofdm.bandwidth) { |
| 142 | case BANDWIDTH_6_MHZ: | 142 | case BANDWIDTH_6_MHZ: |
| 143 | LP_Fc = 0; | 143 | LP_Fc = 0; |
| 144 | LO_Frac = params->frequency + 4000000; | 144 | LO_Frac = params->frequency + 3000000; |
| 145 | break; | 145 | break; |
| 146 | case BANDWIDTH_7_MHZ: | 146 | case BANDWIDTH_7_MHZ: |
| 147 | LP_Fc = 1; | 147 | LP_Fc = 1; |
diff --git a/drivers/media/rc/ati_remote.c b/drivers/media/rc/ati_remote.c index 303f22ea04c..01bb8daf4b0 100644 --- a/drivers/media/rc/ati_remote.c +++ b/drivers/media/rc/ati_remote.c | |||
| @@ -189,7 +189,7 @@ struct ati_remote { | |||
| 189 | dma_addr_t inbuf_dma; | 189 | dma_addr_t inbuf_dma; |
| 190 | dma_addr_t outbuf_dma; | 190 | dma_addr_t outbuf_dma; |
| 191 | 191 | ||
| 192 | unsigned char old_data[2]; /* Detect duplicate events */ | 192 | unsigned char old_data; /* Detect duplicate events */ |
| 193 | unsigned long old_jiffies; | 193 | unsigned long old_jiffies; |
| 194 | unsigned long acc_jiffies; /* handle acceleration */ | 194 | unsigned long acc_jiffies; /* handle acceleration */ |
| 195 | unsigned long first_jiffies; | 195 | unsigned long first_jiffies; |
| @@ -221,35 +221,35 @@ struct ati_remote { | |||
| 221 | /* Translation table from hardware messages to input events. */ | 221 | /* Translation table from hardware messages to input events. */ |
| 222 | static const struct { | 222 | static const struct { |
| 223 | short kind; | 223 | short kind; |
| 224 | unsigned char data1, data2; | 224 | unsigned char data; |
| 225 | int type; | 225 | int type; |
| 226 | unsigned int code; | 226 | unsigned int code; |
| 227 | int value; | 227 | int value; |
| 228 | } ati_remote_tbl[] = { | 228 | } ati_remote_tbl[] = { |
| 229 | /* Directional control pad axes */ | 229 | /* Directional control pad axes */ |
| 230 | {KIND_ACCEL, 0x35, 0x70, EV_REL, REL_X, -1}, /* left */ | 230 | {KIND_ACCEL, 0x70, EV_REL, REL_X, -1}, /* left */ |
| 231 | {KIND_ACCEL, 0x36, 0x71, EV_REL, REL_X, 1}, /* right */ | 231 | {KIND_ACCEL, 0x71, EV_REL, REL_X, 1}, /* right */ |
| 232 | {KIND_ACCEL, 0x37, 0x72, EV_REL, REL_Y, -1}, /* up */ | 232 | {KIND_ACCEL, 0x72, EV_REL, REL_Y, -1}, /* up */ |
| 233 | {KIND_ACCEL, 0x38, 0x73, EV_REL, REL_Y, 1}, /* down */ | 233 | {KIND_ACCEL, 0x73, EV_REL, REL_Y, 1}, /* down */ |
| 234 | /* Directional control pad diagonals */ | 234 | /* Directional control pad diagonals */ |
| 235 | {KIND_LU, 0x39, 0x74, EV_REL, 0, 0}, /* left up */ | 235 | {KIND_LU, 0x74, EV_REL, 0, 0}, /* left up */ |
| 236 | {KIND_RU, 0x3a, 0x75, EV_REL, 0, 0}, /* right up */ | 236 | {KIND_RU, 0x75, EV_REL, 0, 0}, /* right up */ |
| 237 | {KIND_LD, 0x3c, 0x77, EV_REL, 0, 0}, /* left down */ | 237 | {KIND_LD, 0x77, EV_REL, 0, 0}, /* left down */ |
| 238 | {KIND_RD, 0x3b, 0x76, EV_REL, 0, 0}, /* right down */ | 238 | {KIND_RD, 0x76, EV_REL, 0, 0}, /* right down */ |
| 239 | 239 | ||
| 240 | /* "Mouse button" buttons */ | 240 | /* "Mouse button" buttons */ |
| 241 | {KIND_LITERAL, 0x3d, 0x78, EV_KEY, BTN_LEFT, 1}, /* left btn down */ | 241 | {KIND_LITERAL, 0x78, EV_KEY, BTN_LEFT, 1}, /* left btn down */ |
| 242 | {KIND_LITERAL, 0x3e, 0x79, EV_KEY, BTN_LEFT, 0}, /* left btn up */ | 242 | {KIND_LITERAL, 0x79, EV_KEY, BTN_LEFT, 0}, /* left btn up */ |
| 243 | {KIND_LITERAL, 0x41, 0x7c, EV_KEY, BTN_RIGHT, 1},/* right btn down */ | 243 | {KIND_LITERAL, 0x7c, EV_KEY, BTN_RIGHT, 1},/* right btn down */ |
| 244 | {KIND_LITERAL, 0x42, 0x7d, EV_KEY, BTN_RIGHT, 0},/* right btn up */ | 244 | {KIND_LITERAL, 0x7d, EV_KEY, BTN_RIGHT, 0},/* right btn up */ |
| 245 | 245 | ||
| 246 | /* Artificial "doubleclick" events are generated by the hardware. | 246 | /* Artificial "doubleclick" events are generated by the hardware. |
| 247 | * They are mapped to the "side" and "extra" mouse buttons here. */ | 247 | * They are mapped to the "side" and "extra" mouse buttons here. */ |
| 248 | {KIND_FILTERED, 0x3f, 0x7a, EV_KEY, BTN_SIDE, 1}, /* left dblclick */ | 248 | {KIND_FILTERED, 0x7a, EV_KEY, BTN_SIDE, 1}, /* left dblclick */ |
| 249 | {KIND_FILTERED, 0x43, 0x7e, EV_KEY, BTN_EXTRA, 1},/* right dblclick */ | 249 | {KIND_FILTERED, 0x7e, EV_KEY, BTN_EXTRA, 1},/* right dblclick */ |
| 250 | 250 | ||
| 251 | /* Non-mouse events are handled by rc-core */ | 251 | /* Non-mouse events are handled by rc-core */ |
| 252 | {KIND_END, 0x00, 0x00, EV_MAX + 1, 0, 0} | 252 | {KIND_END, 0x00, EV_MAX + 1, 0, 0} |
| 253 | }; | 253 | }; |
| 254 | 254 | ||
| 255 | /* Local function prototypes */ | 255 | /* Local function prototypes */ |
| @@ -397,25 +397,6 @@ static int ati_remote_sendpacket(struct ati_remote *ati_remote, u16 cmd, unsigne | |||
| 397 | } | 397 | } |
| 398 | 398 | ||
| 399 | /* | 399 | /* |
| 400 | * ati_remote_event_lookup | ||
| 401 | */ | ||
| 402 | static int ati_remote_event_lookup(int rem, unsigned char d1, unsigned char d2) | ||
| 403 | { | ||
| 404 | int i; | ||
| 405 | |||
| 406 | for (i = 0; ati_remote_tbl[i].kind != KIND_END; i++) { | ||
| 407 | /* | ||
| 408 | * Decide if the table entry matches the remote input. | ||
| 409 | */ | ||
| 410 | if (ati_remote_tbl[i].data1 == d1 && | ||
| 411 | ati_remote_tbl[i].data2 == d2) | ||
| 412 | return i; | ||
| 413 | |||
| 414 | } | ||
| 415 | return -1; | ||
| 416 | } | ||
| 417 | |||
| 418 | /* | ||
| 419 | * ati_remote_compute_accel | 400 | * ati_remote_compute_accel |
| 420 | * | 401 | * |
| 421 | * Implements acceleration curve for directional control pad | 402 | * Implements acceleration curve for directional control pad |
| @@ -463,7 +444,15 @@ static void ati_remote_input_report(struct urb *urb) | |||
| 463 | int index = -1; | 444 | int index = -1; |
| 464 | int acc; | 445 | int acc; |
| 465 | int remote_num; | 446 | int remote_num; |
| 466 | unsigned char scancode[2]; | 447 | unsigned char scancode; |
| 448 | int i; | ||
| 449 | |||
| 450 | /* | ||
| 451 | * data[0] = 0x14 | ||
| 452 | * data[1] = data[2] + data[3] + 0xd5 (a checksum byte) | ||
| 453 | * data[2] = the key code (with toggle bit in MSB with some models) | ||
| 454 | * data[3] = channel << 4 (the low 4 bits must be zero) | ||
| 455 | */ | ||
| 467 | 456 | ||
| 468 | /* Deal with strange looking inputs */ | 457 | /* Deal with strange looking inputs */ |
| 469 | if ( (urb->actual_length != 4) || (data[0] != 0x14) || | 458 | if ( (urb->actual_length != 4) || (data[0] != 0x14) || |
| @@ -472,6 +461,13 @@ static void ati_remote_input_report(struct urb *urb) | |||
| 472 | return; | 461 | return; |
| 473 | } | 462 | } |
| 474 | 463 | ||
| 464 | if (data[1] != ((data[2] + data[3] + 0xd5) & 0xff)) { | ||
| 465 | dbginfo(&ati_remote->interface->dev, | ||
| 466 | "wrong checksum in input: %02x %02x %02x %02x\n", | ||
| 467 | data[0], data[1], data[2], data[3]); | ||
| 468 | return; | ||
| 469 | } | ||
| 470 | |||
| 475 | /* Mask unwanted remote channels. */ | 471 | /* Mask unwanted remote channels. */ |
| 476 | /* note: remote_num is 0-based, channel 1 on remote == 0 here */ | 472 | /* note: remote_num is 0-based, channel 1 on remote == 0 here */ |
| 477 | remote_num = (data[3] >> 4) & 0x0f; | 473 | remote_num = (data[3] >> 4) & 0x0f; |
| @@ -482,31 +478,30 @@ static void ati_remote_input_report(struct urb *urb) | |||
| 482 | return; | 478 | return; |
| 483 | } | 479 | } |
| 484 | 480 | ||
| 485 | scancode[0] = (((data[1] - ((remote_num + 1) << 4)) & 0xf0) | (data[1] & 0x0f)); | ||
| 486 | |||
| 487 | /* | 481 | /* |
| 488 | * Some devices (e.g. SnapStream Firefly) use 8080 as toggle code, | 482 | * MSB is a toggle code, though only used by some devices |
| 489 | * so we have to clear them. The first bit is a bit tricky as the | 483 | * (e.g. SnapStream Firefly) |
| 490 | * "non-toggled" state depends on remote_num, so we xor it with the | ||
| 491 | * second bit which is only used for toggle. | ||
| 492 | */ | 484 | */ |
| 493 | scancode[0] ^= (data[2] & 0x80); | 485 | scancode = data[2] & 0x7f; |
| 494 | |||
| 495 | scancode[1] = data[2] & ~0x80; | ||
| 496 | 486 | ||
| 497 | /* Look up event code index in mouse translation table. */ | 487 | /* Look up event code index in the mouse translation table. */ |
| 498 | index = ati_remote_event_lookup(remote_num, scancode[0], scancode[1]); | 488 | for (i = 0; ati_remote_tbl[i].kind != KIND_END; i++) { |
| 489 | if (scancode == ati_remote_tbl[i].data) { | ||
| 490 | index = i; | ||
| 491 | break; | ||
| 492 | } | ||
| 493 | } | ||
| 499 | 494 | ||
| 500 | if (index >= 0) { | 495 | if (index >= 0) { |
| 501 | dbginfo(&ati_remote->interface->dev, | 496 | dbginfo(&ati_remote->interface->dev, |
| 502 | "channel 0x%02x; mouse data %02x,%02x; index %d; keycode %d\n", | 497 | "channel 0x%02x; mouse data %02x; index %d; keycode %d\n", |
| 503 | remote_num, data[1], data[2], index, ati_remote_tbl[index].code); | 498 | remote_num, data[2], index, ati_remote_tbl[index].code); |
| 504 | if (!dev) | 499 | if (!dev) |
| 505 | return; /* no mouse device */ | 500 | return; /* no mouse device */ |
| 506 | } else | 501 | } else |
| 507 | dbginfo(&ati_remote->interface->dev, | 502 | dbginfo(&ati_remote->interface->dev, |
| 508 | "channel 0x%02x; key data %02x,%02x, scancode %02x,%02x\n", | 503 | "channel 0x%02x; key data %02x, scancode %02x\n", |
| 509 | remote_num, data[1], data[2], scancode[0], scancode[1]); | 504 | remote_num, data[2], scancode); |
| 510 | 505 | ||
| 511 | 506 | ||
| 512 | if (index >= 0 && ati_remote_tbl[index].kind == KIND_LITERAL) { | 507 | if (index >= 0 && ati_remote_tbl[index].kind == KIND_LITERAL) { |
| @@ -523,8 +518,7 @@ static void ati_remote_input_report(struct urb *urb) | |||
| 523 | unsigned long now = jiffies; | 518 | unsigned long now = jiffies; |
| 524 | 519 | ||
| 525 | /* Filter duplicate events which happen "too close" together. */ | 520 | /* Filter duplicate events which happen "too close" together. */ |
| 526 | if (ati_remote->old_data[0] == data[1] && | 521 | if (ati_remote->old_data == data[2] && |
| 527 | ati_remote->old_data[1] == data[2] && | ||
| 528 | time_before(now, ati_remote->old_jiffies + | 522 | time_before(now, ati_remote->old_jiffies + |
| 529 | msecs_to_jiffies(repeat_filter))) { | 523 | msecs_to_jiffies(repeat_filter))) { |
| 530 | ati_remote->repeat_count++; | 524 | ati_remote->repeat_count++; |
| @@ -533,8 +527,7 @@ static void ati_remote_input_report(struct urb *urb) | |||
| 533 | ati_remote->first_jiffies = now; | 527 | ati_remote->first_jiffies = now; |
| 534 | } | 528 | } |
| 535 | 529 | ||
| 536 | ati_remote->old_data[0] = data[1]; | 530 | ati_remote->old_data = data[2]; |
| 537 | ati_remote->old_data[1] = data[2]; | ||
| 538 | ati_remote->old_jiffies = now; | 531 | ati_remote->old_jiffies = now; |
| 539 | 532 | ||
| 540 | /* Ensure we skip at least the 4 first duplicate events (generated | 533 | /* Ensure we skip at least the 4 first duplicate events (generated |
| @@ -549,14 +542,13 @@ static void ati_remote_input_report(struct urb *urb) | |||
| 549 | 542 | ||
| 550 | if (index < 0) { | 543 | if (index < 0) { |
| 551 | /* Not a mouse event, hand it to rc-core. */ | 544 | /* Not a mouse event, hand it to rc-core. */ |
| 552 | u32 rc_code = (scancode[0] << 8) | scancode[1]; | ||
| 553 | 545 | ||
| 554 | /* | 546 | /* |
| 555 | * We don't use the rc-core repeat handling yet as | 547 | * We don't use the rc-core repeat handling yet as |
| 556 | * it would cause ghost repeats which would be a | 548 | * it would cause ghost repeats which would be a |
| 557 | * regression for this driver. | 549 | * regression for this driver. |
| 558 | */ | 550 | */ |
| 559 | rc_keydown_notimeout(ati_remote->rdev, rc_code, | 551 | rc_keydown_notimeout(ati_remote->rdev, scancode, |
| 560 | data[2]); | 552 | data[2]); |
| 561 | rc_keyup(ati_remote->rdev); | 553 | rc_keyup(ati_remote->rdev); |
| 562 | return; | 554 | return; |
| @@ -607,8 +599,7 @@ static void ati_remote_input_report(struct urb *urb) | |||
| 607 | input_sync(dev); | 599 | input_sync(dev); |
| 608 | 600 | ||
| 609 | ati_remote->old_jiffies = jiffies; | 601 | ati_remote->old_jiffies = jiffies; |
| 610 | ati_remote->old_data[0] = data[1]; | 602 | ati_remote->old_data = data[2]; |
| 611 | ati_remote->old_data[1] = data[2]; | ||
| 612 | } | 603 | } |
| 613 | } | 604 | } |
| 614 | 605 | ||
diff --git a/drivers/media/rc/keymaps/rc-ati-x10.c b/drivers/media/rc/keymaps/rc-ati-x10.c index e1b8b2605c4..81506440ede 100644 --- a/drivers/media/rc/keymaps/rc-ati-x10.c +++ b/drivers/media/rc/keymaps/rc-ati-x10.c | |||
| @@ -27,55 +27,55 @@ | |||
| 27 | #include <media/rc-map.h> | 27 | #include <media/rc-map.h> |
| 28 | 28 | ||
| 29 | static struct rc_map_table ati_x10[] = { | 29 | static struct rc_map_table ati_x10[] = { |
| 30 | { 0xd20d, KEY_1 }, | 30 | { 0x0d, KEY_1 }, |
| 31 | { 0xd30e, KEY_2 }, | 31 | { 0x0e, KEY_2 }, |
| 32 | { 0xd40f, KEY_3 }, | 32 | { 0x0f, KEY_3 }, |
| 33 | { 0xd510, KEY_4 }, | 33 | { 0x10, KEY_4 }, |
| 34 | { 0xd611, KEY_5 }, | 34 | { 0x11, KEY_5 }, |
| 35 | { 0xd712, KEY_6 }, | 35 | { 0x12, KEY_6 }, |
| 36 | { 0xd813, KEY_7 }, | 36 | { 0x13, KEY_7 }, |
| 37 | { 0xd914, KEY_8 }, | 37 | { 0x14, KEY_8 }, |
| 38 | { 0xda15, KEY_9 }, | 38 | { 0x15, KEY_9 }, |
| 39 | { 0xdc17, KEY_0 }, | 39 | { 0x17, KEY_0 }, |
| 40 | { 0xc500, KEY_A }, | 40 | { 0x00, KEY_A }, |
| 41 | { 0xc601, KEY_B }, | 41 | { 0x01, KEY_B }, |
| 42 | { 0xde19, KEY_C }, | 42 | { 0x19, KEY_C }, |
| 43 | { 0xe01b, KEY_D }, | 43 | { 0x1b, KEY_D }, |
| 44 | { 0xe621, KEY_E }, | 44 | { 0x21, KEY_E }, |
| 45 | { 0xe823, KEY_F }, | 45 | { 0x23, KEY_F }, |
| 46 | 46 | ||
| 47 | { 0xdd18, KEY_KPENTER }, /* "check" */ | 47 | { 0x18, KEY_KPENTER }, /* "check" */ |
| 48 | { 0xdb16, KEY_MENU }, /* "menu" */ | 48 | { 0x16, KEY_MENU }, /* "menu" */ |
| 49 | { 0xc702, KEY_POWER }, /* Power */ | 49 | { 0x02, KEY_POWER }, /* Power */ |
| 50 | { 0xc803, KEY_TV }, /* TV */ | 50 | { 0x03, KEY_TV }, /* TV */ |
| 51 | { 0xc904, KEY_DVD }, /* DVD */ | 51 | { 0x04, KEY_DVD }, /* DVD */ |
| 52 | { 0xca05, KEY_WWW }, /* WEB */ | 52 | { 0x05, KEY_WWW }, /* WEB */ |
| 53 | { 0xcb06, KEY_BOOKMARKS }, /* "book" */ | 53 | { 0x06, KEY_BOOKMARKS }, /* "book" */ |
| 54 | { 0xcc07, KEY_EDIT }, /* "hand" */ | 54 | { 0x07, KEY_EDIT }, /* "hand" */ |
| 55 | { 0xe11c, KEY_COFFEE }, /* "timer" */ | 55 | { 0x1c, KEY_COFFEE }, /* "timer" */ |
| 56 | { 0xe520, KEY_FRONT }, /* "max" */ | 56 | { 0x20, KEY_FRONT }, /* "max" */ |
| 57 | { 0xe21d, KEY_LEFT }, /* left */ | 57 | { 0x1d, KEY_LEFT }, /* left */ |
| 58 | { 0xe41f, KEY_RIGHT }, /* right */ | 58 | { 0x1f, KEY_RIGHT }, /* right */ |
| 59 | { 0xe722, KEY_DOWN }, /* down */ | 59 | { 0x22, KEY_DOWN }, /* down */ |
| 60 | { 0xdf1a, KEY_UP }, /* up */ | 60 | { 0x1a, KEY_UP }, /* up */ |
| 61 | { 0xe31e, KEY_OK }, /* "OK" */ | 61 | { 0x1e, KEY_OK }, /* "OK" */ |
| 62 | { 0xce09, KEY_VOLUMEDOWN }, /* VOL + */ | 62 | { 0x09, KEY_VOLUMEDOWN }, /* VOL + */ |
| 63 | { 0xcd08, KEY_VOLUMEUP }, /* VOL - */ | 63 | { 0x08, KEY_VOLUMEUP }, /* VOL - */ |
| 64 | { 0xcf0a, KEY_MUTE }, /* MUTE */ | 64 | { 0x0a, KEY_MUTE }, /* MUTE */ |
| 65 | { 0xd00b, KEY_CHANNELUP }, /* CH + */ | 65 | { 0x0b, KEY_CHANNELUP }, /* CH + */ |
| 66 | { 0xd10c, KEY_CHANNELDOWN },/* CH - */ | 66 | { 0x0c, KEY_CHANNELDOWN },/* CH - */ |
| 67 | { 0xec27, KEY_RECORD }, /* ( o) red */ | 67 | { 0x27, KEY_RECORD }, /* ( o) red */ |
| 68 | { 0xea25, KEY_PLAY }, /* ( >) */ | 68 | { 0x25, KEY_PLAY }, /* ( >) */ |
| 69 | { 0xe924, KEY_REWIND }, /* (<<) */ | 69 | { 0x24, KEY_REWIND }, /* (<<) */ |
| 70 | { 0xeb26, KEY_FORWARD }, /* (>>) */ | 70 | { 0x26, KEY_FORWARD }, /* (>>) */ |
| 71 | { 0xed28, KEY_STOP }, /* ([]) */ | 71 | { 0x28, KEY_STOP }, /* ([]) */ |
| 72 | { 0xee29, KEY_PAUSE }, /* ('') */ | 72 | { 0x29, KEY_PAUSE }, /* ('') */ |
| 73 | { 0xf02b, KEY_PREVIOUS }, /* (<-) */ | 73 | { 0x2b, KEY_PREVIOUS }, /* (<-) */ |
| 74 | { 0xef2a, KEY_NEXT }, /* (>+) */ | 74 | { 0x2a, KEY_NEXT }, /* (>+) */ |
| 75 | { 0xf22d, KEY_INFO }, /* PLAYING */ | 75 | { 0x2d, KEY_INFO }, /* PLAYING */ |
| 76 | { 0xf32e, KEY_HOME }, /* TOP */ | 76 | { 0x2e, KEY_HOME }, /* TOP */ |
| 77 | { 0xf42f, KEY_END }, /* END */ | 77 | { 0x2f, KEY_END }, /* END */ |
| 78 | { 0xf530, KEY_SELECT }, /* SELECT */ | 78 | { 0x30, KEY_SELECT }, /* SELECT */ |
| 79 | }; | 79 | }; |
| 80 | 80 | ||
| 81 | static struct rc_map_list ati_x10_map = { | 81 | static struct rc_map_list ati_x10_map = { |
diff --git a/drivers/media/rc/keymaps/rc-medion-x10.c b/drivers/media/rc/keymaps/rc-medion-x10.c index 09e2cc01d11..479cdb89781 100644 --- a/drivers/media/rc/keymaps/rc-medion-x10.c +++ b/drivers/media/rc/keymaps/rc-medion-x10.c | |||
| @@ -25,70 +25,70 @@ | |||
| 25 | #include <media/rc-map.h> | 25 | #include <media/rc-map.h> |
| 26 | 26 | ||
| 27 | static struct rc_map_table medion_x10[] = { | 27 | static struct rc_map_table medion_x10[] = { |
| 28 | { 0xf12c, KEY_TV }, /* TV */ | 28 | { 0x2c, KEY_TV }, /* TV */ |
| 29 | { 0xf22d, KEY_VCR }, /* VCR */ | 29 | { 0x2d, KEY_VCR }, /* VCR */ |
| 30 | { 0xc904, KEY_DVD }, /* DVD */ | 30 | { 0x04, KEY_DVD }, /* DVD */ |
| 31 | { 0xcb06, KEY_AUDIO }, /* MUSIC */ | 31 | { 0x06, KEY_AUDIO }, /* MUSIC */ |
| 32 | 32 | ||
| 33 | { 0xf32e, KEY_RADIO }, /* RADIO */ | 33 | { 0x2e, KEY_RADIO }, /* RADIO */ |
| 34 | { 0xca05, KEY_DIRECTORY }, /* PHOTO */ | 34 | { 0x05, KEY_DIRECTORY }, /* PHOTO */ |
| 35 | { 0xf42f, KEY_INFO }, /* TV-PREVIEW */ | 35 | { 0x2f, KEY_INFO }, /* TV-PREVIEW */ |
| 36 | { 0xf530, KEY_LIST }, /* CHANNEL-LST */ | 36 | { 0x30, KEY_LIST }, /* CHANNEL-LST */ |
| 37 | 37 | ||
| 38 | { 0xe01b, KEY_SETUP }, /* SETUP */ | 38 | { 0x1b, KEY_SETUP }, /* SETUP */ |
| 39 | { 0xf631, KEY_VIDEO }, /* VIDEO DESKTOP */ | 39 | { 0x31, KEY_VIDEO }, /* VIDEO DESKTOP */ |
| 40 | 40 | ||
| 41 | { 0xcd08, KEY_VOLUMEDOWN }, /* VOL - */ | 41 | { 0x08, KEY_VOLUMEDOWN }, /* VOL - */ |
| 42 | { 0xce09, KEY_VOLUMEUP }, /* VOL + */ | 42 | { 0x09, KEY_VOLUMEUP }, /* VOL + */ |
| 43 | { 0xd00b, KEY_CHANNELUP }, /* CHAN + */ | 43 | { 0x0b, KEY_CHANNELUP }, /* CHAN + */ |
| 44 | { 0xd10c, KEY_CHANNELDOWN }, /* CHAN - */ | 44 | { 0x0c, KEY_CHANNELDOWN }, /* CHAN - */ |
| 45 | { 0xc500, KEY_MUTE }, /* MUTE */ | 45 | { 0x00, KEY_MUTE }, /* MUTE */ |
| 46 | 46 | ||
| 47 | { 0xf732, KEY_RED }, /* red */ | 47 | { 0x32, KEY_RED }, /* red */ |
| 48 | { 0xf833, KEY_GREEN }, /* green */ | 48 | { 0x33, KEY_GREEN }, /* green */ |
| 49 | { 0xf934, KEY_YELLOW }, /* yellow */ | 49 | { 0x34, KEY_YELLOW }, /* yellow */ |
| 50 | { 0xfa35, KEY_BLUE }, /* blue */ | 50 | { 0x35, KEY_BLUE }, /* blue */ |
| 51 | { 0xdb16, KEY_TEXT }, /* TXT */ | 51 | { 0x16, KEY_TEXT }, /* TXT */ |
| 52 | 52 | ||
| 53 | { 0xd20d, KEY_1 }, | 53 | { 0x0d, KEY_1 }, |
| 54 | { 0xd30e, KEY_2 }, | 54 | { 0x0e, KEY_2 }, |
| 55 | { 0xd40f, KEY_3 }, | 55 | { 0x0f, KEY_3 }, |
| 56 | { 0xd510, KEY_4 }, | 56 | { 0x10, KEY_4 }, |
| 57 | { 0xd611, KEY_5 }, | 57 | { 0x11, KEY_5 }, |
| 58 | { 0xd712, KEY_6 }, | 58 | { 0x12, KEY_6 }, |
| 59 | { 0xd813, KEY_7 }, | 59 | { 0x13, KEY_7 }, |
| 60 | { 0xd914, KEY_8 }, | 60 | { 0x14, KEY_8 }, |
| 61 | { 0xda15, KEY_9 }, | 61 | { 0x15, KEY_9 }, |
| 62 | { 0xdc17, KEY_0 }, | 62 | { 0x17, KEY_0 }, |
| 63 | { 0xe11c, KEY_SEARCH }, /* TV/RAD, CH SRC */ | 63 | { 0x1c, KEY_SEARCH }, /* TV/RAD, CH SRC */ |
| 64 | { 0xe520, KEY_DELETE }, /* DELETE */ | 64 | { 0x20, KEY_DELETE }, /* DELETE */ |
| 65 | 65 | ||
| 66 | { 0xfb36, KEY_KEYBOARD }, /* RENAME */ | 66 | { 0x36, KEY_KEYBOARD }, /* RENAME */ |
| 67 | { 0xdd18, KEY_SCREEN }, /* SNAPSHOT */ | 67 | { 0x18, KEY_SCREEN }, /* SNAPSHOT */ |
| 68 | 68 | ||
| 69 | { 0xdf1a, KEY_UP }, /* up */ | 69 | { 0x1a, KEY_UP }, /* up */ |
| 70 | { 0xe722, KEY_DOWN }, /* down */ | 70 | { 0x22, KEY_DOWN }, /* down */ |
| 71 | { 0xe21d, KEY_LEFT }, /* left */ | 71 | { 0x1d, KEY_LEFT }, /* left */ |
| 72 | { 0xe41f, KEY_RIGHT }, /* right */ | 72 | { 0x1f, KEY_RIGHT }, /* right */ |
| 73 | { 0xe31e, KEY_OK }, /* OK */ | 73 | { 0x1e, KEY_OK }, /* OK */ |
| 74 | 74 | ||
| 75 | { 0xfc37, KEY_SELECT }, /* ACQUIRE IMAGE */ | 75 | { 0x37, KEY_SELECT }, /* ACQUIRE IMAGE */ |
| 76 | { 0xfd38, KEY_EDIT }, /* EDIT IMAGE */ | 76 | { 0x38, KEY_EDIT }, /* EDIT IMAGE */ |
| 77 | 77 | ||
| 78 | { 0xe924, KEY_REWIND }, /* rewind (<<) */ | 78 | { 0x24, KEY_REWIND }, /* rewind (<<) */ |
| 79 | { 0xea25, KEY_PLAY }, /* play ( >) */ | 79 | { 0x25, KEY_PLAY }, /* play ( >) */ |
| 80 | { 0xeb26, KEY_FORWARD }, /* forward (>>) */ | 80 | { 0x26, KEY_FORWARD }, /* forward (>>) */ |
| 81 | { 0xec27, KEY_RECORD }, /* record ( o) */ | 81 | { 0x27, KEY_RECORD }, /* record ( o) */ |
| 82 | { 0xed28, KEY_STOP }, /* stop ([]) */ | 82 | { 0x28, KEY_STOP }, /* stop ([]) */ |
| 83 | { 0xee29, KEY_PAUSE }, /* pause ('') */ | 83 | { 0x29, KEY_PAUSE }, /* pause ('') */ |
| 84 | 84 | ||
| 85 | { 0xe621, KEY_PREVIOUS }, /* prev */ | 85 | { 0x21, KEY_PREVIOUS }, /* prev */ |
| 86 | { 0xfe39, KEY_SWITCHVIDEOMODE }, /* F SCR */ | 86 | { 0x39, KEY_SWITCHVIDEOMODE }, /* F SCR */ |
| 87 | { 0xe823, KEY_NEXT }, /* next */ | 87 | { 0x23, KEY_NEXT }, /* next */ |
| 88 | { 0xde19, KEY_MENU }, /* MENU */ | 88 | { 0x19, KEY_MENU }, /* MENU */ |
| 89 | { 0xff3a, KEY_LANGUAGE }, /* AUDIO */ | 89 | { 0x3a, KEY_LANGUAGE }, /* AUDIO */ |
| 90 | 90 | ||
| 91 | { 0xc702, KEY_POWER }, /* POWER */ | 91 | { 0x02, KEY_POWER }, /* POWER */ |
| 92 | }; | 92 | }; |
| 93 | 93 | ||
| 94 | static struct rc_map_list medion_x10_map = { | 94 | static struct rc_map_list medion_x10_map = { |
diff --git a/drivers/media/rc/keymaps/rc-snapstream-firefly.c b/drivers/media/rc/keymaps/rc-snapstream-firefly.c index ef146520931..c7f33ec719b 100644 --- a/drivers/media/rc/keymaps/rc-snapstream-firefly.c +++ b/drivers/media/rc/keymaps/rc-snapstream-firefly.c | |||
| @@ -22,63 +22,63 @@ | |||
| 22 | #include <media/rc-map.h> | 22 | #include <media/rc-map.h> |
| 23 | 23 | ||
| 24 | static struct rc_map_table snapstream_firefly[] = { | 24 | static struct rc_map_table snapstream_firefly[] = { |
| 25 | { 0xf12c, KEY_ZOOM }, /* Maximize */ | 25 | { 0x2c, KEY_ZOOM }, /* Maximize */ |
| 26 | { 0xc702, KEY_CLOSE }, | 26 | { 0x02, KEY_CLOSE }, |
| 27 | 27 | ||
| 28 | { 0xd20d, KEY_1 }, | 28 | { 0x0d, KEY_1 }, |
| 29 | { 0xd30e, KEY_2 }, | 29 | { 0x0e, KEY_2 }, |
| 30 | { 0xd40f, KEY_3 }, | 30 | { 0x0f, KEY_3 }, |
| 31 | { 0xd510, KEY_4 }, | 31 | { 0x10, KEY_4 }, |
| 32 | { 0xd611, KEY_5 }, | 32 | { 0x11, KEY_5 }, |
| 33 | { 0xd712, KEY_6 }, | 33 | { 0x12, KEY_6 }, |
| 34 | { 0xd813, KEY_7 }, | 34 | { 0x13, KEY_7 }, |
| 35 | { 0xd914, KEY_8 }, | 35 | { 0x14, KEY_8 }, |
| 36 | { 0xda15, KEY_9 }, | 36 | { 0x15, KEY_9 }, |
| 37 | { 0xdc17, KEY_0 }, | 37 | { 0x17, KEY_0 }, |
| 38 | { 0xdb16, KEY_BACK }, | 38 | { 0x16, KEY_BACK }, |
| 39 | { 0xdd18, KEY_KPENTER }, /* ent */ | 39 | { 0x18, KEY_KPENTER }, /* ent */ |
| 40 | 40 | ||
| 41 | { 0xce09, KEY_VOLUMEUP }, | 41 | { 0x09, KEY_VOLUMEUP }, |
| 42 | { 0xcd08, KEY_VOLUMEDOWN }, | 42 | { 0x08, KEY_VOLUMEDOWN }, |
| 43 | { 0xcf0a, KEY_MUTE }, | 43 | { 0x0a, KEY_MUTE }, |
| 44 | { 0xd00b, KEY_CHANNELUP }, | 44 | { 0x0b, KEY_CHANNELUP }, |
| 45 | { 0xd10c, KEY_CHANNELDOWN }, | 45 | { 0x0c, KEY_CHANNELDOWN }, |
| 46 | { 0xc500, KEY_VENDOR }, /* firefly */ | 46 | { 0x00, KEY_VENDOR }, /* firefly */ |
| 47 | 47 | ||
| 48 | { 0xf32e, KEY_INFO }, | 48 | { 0x2e, KEY_INFO }, |
| 49 | { 0xf42f, KEY_OPTION }, | 49 | { 0x2f, KEY_OPTION }, |
| 50 | 50 | ||
| 51 | { 0xe21d, KEY_LEFT }, | 51 | { 0x1d, KEY_LEFT }, |
| 52 | { 0xe41f, KEY_RIGHT }, | 52 | { 0x1f, KEY_RIGHT }, |
| 53 | { 0xe722, KEY_DOWN }, | 53 | { 0x22, KEY_DOWN }, |
| 54 | { 0xdf1a, KEY_UP }, | 54 | { 0x1a, KEY_UP }, |
| 55 | { 0xe31e, KEY_OK }, | 55 | { 0x1e, KEY_OK }, |
| 56 | 56 | ||
| 57 | { 0xe11c, KEY_MENU }, | 57 | { 0x1c, KEY_MENU }, |
| 58 | { 0xe520, KEY_EXIT }, | 58 | { 0x20, KEY_EXIT }, |
| 59 | 59 | ||
| 60 | { 0xec27, KEY_RECORD }, | 60 | { 0x27, KEY_RECORD }, |
| 61 | { 0xea25, KEY_PLAY }, | 61 | { 0x25, KEY_PLAY }, |
| 62 | { 0xed28, KEY_STOP }, | 62 | { 0x28, KEY_STOP }, |
| 63 | { 0xe924, KEY_REWIND }, | 63 | { 0x24, KEY_REWIND }, |
| 64 | { 0xeb26, KEY_FORWARD }, | 64 | { 0x26, KEY_FORWARD }, |
| 65 | { 0xee29, KEY_PAUSE }, | 65 | { 0x29, KEY_PAUSE }, |
| 66 | { 0xf02b, KEY_PREVIOUS }, | 66 | { 0x2b, KEY_PREVIOUS }, |
| 67 | { 0xef2a, KEY_NEXT }, | 67 | { 0x2a, KEY_NEXT }, |
| 68 | 68 | ||
| 69 | { 0xcb06, KEY_AUDIO }, /* Music */ | 69 | { 0x06, KEY_AUDIO }, /* Music */ |
| 70 | { 0xca05, KEY_IMAGES }, /* Photos */ | 70 | { 0x05, KEY_IMAGES }, /* Photos */ |
| 71 | { 0xc904, KEY_DVD }, | 71 | { 0x04, KEY_DVD }, |
| 72 | { 0xc803, KEY_TV }, | 72 | { 0x03, KEY_TV }, |
| 73 | { 0xcc07, KEY_VIDEO }, | 73 | { 0x07, KEY_VIDEO }, |
| 74 | 74 | ||
| 75 | { 0xc601, KEY_HELP }, | 75 | { 0x01, KEY_HELP }, |
| 76 | { 0xf22d, KEY_MODE }, /* Mouse */ | 76 | { 0x2d, KEY_MODE }, /* Mouse */ |
| 77 | 77 | ||
| 78 | { 0xde19, KEY_A }, | 78 | { 0x19, KEY_A }, |
| 79 | { 0xe01b, KEY_B }, | 79 | { 0x1b, KEY_B }, |
| 80 | { 0xe621, KEY_C }, | 80 | { 0x21, KEY_C }, |
| 81 | { 0xe823, KEY_D }, | 81 | { 0x23, KEY_D }, |
| 82 | }; | 82 | }; |
| 83 | 83 | ||
| 84 | static struct rc_map_list snapstream_firefly_map = { | 84 | static struct rc_map_list snapstream_firefly_map = { |
diff --git a/drivers/media/video/au0828/au0828-cards.c b/drivers/media/video/au0828/au0828-cards.c index 39fc923fc46..1c6015a04f9 100644 --- a/drivers/media/video/au0828/au0828-cards.c +++ b/drivers/media/video/au0828/au0828-cards.c | |||
| @@ -162,11 +162,14 @@ static void hauppauge_eeprom(struct au0828_dev *dev, u8 *eeprom_data) | |||
| 162 | switch (tv.model) { | 162 | switch (tv.model) { |
| 163 | case 72000: /* WinTV-HVR950q (Retail, IR, ATSC/QAM */ | 163 | case 72000: /* WinTV-HVR950q (Retail, IR, ATSC/QAM */ |
| 164 | case 72001: /* WinTV-HVR950q (Retail, IR, ATSC/QAM and analog video */ | 164 | case 72001: /* WinTV-HVR950q (Retail, IR, ATSC/QAM and analog video */ |
| 165 | case 72101: /* WinTV-HVR950q (Retail, IR, ATSC/QAM and analog video */ | ||
| 166 | case 72201: /* WinTV-HVR950q (OEM, IR, ATSC/QAM and analog video */ | ||
| 165 | case 72211: /* WinTV-HVR950q (OEM, IR, ATSC/QAM and analog video */ | 167 | case 72211: /* WinTV-HVR950q (OEM, IR, ATSC/QAM and analog video */ |
| 166 | case 72221: /* WinTV-HVR950q (OEM, IR, ATSC/QAM and analog video */ | 168 | case 72221: /* WinTV-HVR950q (OEM, IR, ATSC/QAM and analog video */ |
| 167 | case 72231: /* WinTV-HVR950q (OEM, IR, ATSC/QAM and analog video */ | 169 | case 72231: /* WinTV-HVR950q (OEM, IR, ATSC/QAM and analog video */ |
| 168 | case 72241: /* WinTV-HVR950q (OEM, No IR, ATSC/QAM and analog video */ | 170 | case 72241: /* WinTV-HVR950q (OEM, No IR, ATSC/QAM and analog video */ |
| 169 | case 72251: /* WinTV-HVR950q (Retail, IR, ATSC/QAM and analog video */ | 171 | case 72251: /* WinTV-HVR950q (Retail, IR, ATSC/QAM and analog video */ |
| 172 | case 72261: /* WinTV-HVR950q (OEM, IR, ATSC/QAM and analog video */ | ||
| 170 | case 72301: /* WinTV-HVR850 (Retail, IR, ATSC and analog video */ | 173 | case 72301: /* WinTV-HVR850 (Retail, IR, ATSC and analog video */ |
| 171 | case 72500: /* WinTV-HVR950q (OEM, No IR, ATSC/QAM */ | 174 | case 72500: /* WinTV-HVR950q (OEM, No IR, ATSC/QAM */ |
| 172 | break; | 175 | break; |
| @@ -324,6 +327,10 @@ struct usb_device_id au0828_usb_id_table[] = { | |||
| 324 | .driver_info = AU0828_BOARD_HAUPPAUGE_HVR950Q_MXL }, | 327 | .driver_info = AU0828_BOARD_HAUPPAUGE_HVR950Q_MXL }, |
| 325 | { USB_DEVICE(0x2040, 0x8200), | 328 | { USB_DEVICE(0x2040, 0x8200), |
| 326 | .driver_info = AU0828_BOARD_HAUPPAUGE_WOODBURY }, | 329 | .driver_info = AU0828_BOARD_HAUPPAUGE_WOODBURY }, |
| 330 | { USB_DEVICE(0x2040, 0x7260), | ||
| 331 | .driver_info = AU0828_BOARD_HAUPPAUGE_HVR950Q }, | ||
| 332 | { USB_DEVICE(0x2040, 0x7213), | ||
| 333 | .driver_info = AU0828_BOARD_HAUPPAUGE_HVR950Q }, | ||
| 327 | { }, | 334 | { }, |
| 328 | }; | 335 | }; |
| 329 | 336 | ||
diff --git a/drivers/media/video/m5mols/m5mols.h b/drivers/media/video/m5mols/m5mols.h index 89d09a8914f..82c8817bd32 100644 --- a/drivers/media/video/m5mols/m5mols.h +++ b/drivers/media/video/m5mols/m5mols.h | |||
| @@ -162,7 +162,6 @@ struct m5mols_version { | |||
| 162 | * @pad: media pad | 162 | * @pad: media pad |
| 163 | * @ffmt: current fmt according to resolution type | 163 | * @ffmt: current fmt according to resolution type |
| 164 | * @res_type: current resolution type | 164 | * @res_type: current resolution type |
| 165 | * @code: current code | ||
| 166 | * @irq_waitq: waitqueue for the capture | 165 | * @irq_waitq: waitqueue for the capture |
| 167 | * @work_irq: workqueue for the IRQ | 166 | * @work_irq: workqueue for the IRQ |
| 168 | * @flags: state variable for the interrupt handler | 167 | * @flags: state variable for the interrupt handler |
| @@ -192,7 +191,6 @@ struct m5mols_info { | |||
| 192 | struct media_pad pad; | 191 | struct media_pad pad; |
| 193 | struct v4l2_mbus_framefmt ffmt[M5MOLS_RESTYPE_MAX]; | 192 | struct v4l2_mbus_framefmt ffmt[M5MOLS_RESTYPE_MAX]; |
| 194 | int res_type; | 193 | int res_type; |
| 195 | enum v4l2_mbus_pixelcode code; | ||
| 196 | wait_queue_head_t irq_waitq; | 194 | wait_queue_head_t irq_waitq; |
| 197 | struct work_struct work_irq; | 195 | struct work_struct work_irq; |
| 198 | unsigned long flags; | 196 | unsigned long flags; |
diff --git a/drivers/media/video/m5mols/m5mols_core.c b/drivers/media/video/m5mols/m5mols_core.c index 05ab3700647..e0f09e53180 100644 --- a/drivers/media/video/m5mols/m5mols_core.c +++ b/drivers/media/video/m5mols/m5mols_core.c | |||
| @@ -334,7 +334,7 @@ int m5mols_mode(struct m5mols_info *info, u8 mode) | |||
| 334 | int ret = -EINVAL; | 334 | int ret = -EINVAL; |
| 335 | u8 reg; | 335 | u8 reg; |
| 336 | 336 | ||
| 337 | if (mode < REG_PARAMETER && mode > REG_CAPTURE) | 337 | if (mode < REG_PARAMETER || mode > REG_CAPTURE) |
| 338 | return ret; | 338 | return ret; |
| 339 | 339 | ||
| 340 | ret = m5mols_read_u8(sd, SYSTEM_SYSMODE, ®); | 340 | ret = m5mols_read_u8(sd, SYSTEM_SYSMODE, ®); |
| @@ -511,9 +511,6 @@ static int m5mols_get_fmt(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh, | |||
| 511 | struct m5mols_info *info = to_m5mols(sd); | 511 | struct m5mols_info *info = to_m5mols(sd); |
| 512 | struct v4l2_mbus_framefmt *format; | 512 | struct v4l2_mbus_framefmt *format; |
| 513 | 513 | ||
| 514 | if (fmt->pad != 0) | ||
| 515 | return -EINVAL; | ||
| 516 | |||
| 517 | format = __find_format(info, fh, fmt->which, info->res_type); | 514 | format = __find_format(info, fh, fmt->which, info->res_type); |
| 518 | if (!format) | 515 | if (!format) |
| 519 | return -EINVAL; | 516 | return -EINVAL; |
| @@ -532,9 +529,6 @@ static int m5mols_set_fmt(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh, | |||
| 532 | u32 resolution = 0; | 529 | u32 resolution = 0; |
| 533 | int ret; | 530 | int ret; |
| 534 | 531 | ||
| 535 | if (fmt->pad != 0) | ||
| 536 | return -EINVAL; | ||
| 537 | |||
| 538 | ret = __find_resolution(sd, format, &type, &resolution); | 532 | ret = __find_resolution(sd, format, &type, &resolution); |
| 539 | if (ret < 0) | 533 | if (ret < 0) |
| 540 | return ret; | 534 | return ret; |
| @@ -543,13 +537,14 @@ static int m5mols_set_fmt(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh, | |||
| 543 | if (!sfmt) | 537 | if (!sfmt) |
| 544 | return 0; | 538 | return 0; |
| 545 | 539 | ||
| 546 | *sfmt = m5mols_default_ffmt[type]; | 540 | |
| 547 | sfmt->width = format->width; | 541 | format->code = m5mols_default_ffmt[type].code; |
| 548 | sfmt->height = format->height; | 542 | format->colorspace = V4L2_COLORSPACE_JPEG; |
| 543 | format->field = V4L2_FIELD_NONE; | ||
| 549 | 544 | ||
| 550 | if (fmt->which == V4L2_SUBDEV_FORMAT_ACTIVE) { | 545 | if (fmt->which == V4L2_SUBDEV_FORMAT_ACTIVE) { |
| 546 | *sfmt = *format; | ||
| 551 | info->resolution = resolution; | 547 | info->resolution = resolution; |
| 552 | info->code = format->code; | ||
| 553 | info->res_type = type; | 548 | info->res_type = type; |
| 554 | } | 549 | } |
| 555 | 550 | ||
| @@ -626,13 +621,14 @@ static int m5mols_start_monitor(struct m5mols_info *info) | |||
| 626 | static int m5mols_s_stream(struct v4l2_subdev *sd, int enable) | 621 | static int m5mols_s_stream(struct v4l2_subdev *sd, int enable) |
| 627 | { | 622 | { |
| 628 | struct m5mols_info *info = to_m5mols(sd); | 623 | struct m5mols_info *info = to_m5mols(sd); |
| 624 | u32 code = info->ffmt[info->res_type].code; | ||
| 629 | 625 | ||
| 630 | if (enable) { | 626 | if (enable) { |
| 631 | int ret = -EINVAL; | 627 | int ret = -EINVAL; |
| 632 | 628 | ||
| 633 | if (is_code(info->code, M5MOLS_RESTYPE_MONITOR)) | 629 | if (is_code(code, M5MOLS_RESTYPE_MONITOR)) |
| 634 | ret = m5mols_start_monitor(info); | 630 | ret = m5mols_start_monitor(info); |
| 635 | if (is_code(info->code, M5MOLS_RESTYPE_CAPTURE)) | 631 | if (is_code(code, M5MOLS_RESTYPE_CAPTURE)) |
| 636 | ret = m5mols_start_capture(info); | 632 | ret = m5mols_start_capture(info); |
| 637 | 633 | ||
| 638 | return ret; | 634 | return ret; |
diff --git a/drivers/media/video/mt9m111.c b/drivers/media/video/mt9m111.c index cf2c0fb95f2..398f96ffd35 100644 --- a/drivers/media/video/mt9m111.c +++ b/drivers/media/video/mt9m111.c | |||
| @@ -955,6 +955,7 @@ static int mt9m111_probe(struct i2c_client *client, | |||
| 955 | mt9m111->rect.height = MT9M111_MAX_HEIGHT; | 955 | mt9m111->rect.height = MT9M111_MAX_HEIGHT; |
| 956 | mt9m111->fmt = &mt9m111_colour_fmts[0]; | 956 | mt9m111->fmt = &mt9m111_colour_fmts[0]; |
| 957 | mt9m111->lastpage = -1; | 957 | mt9m111->lastpage = -1; |
| 958 | mutex_init(&mt9m111->power_lock); | ||
| 958 | 959 | ||
| 959 | ret = mt9m111_video_probe(client); | 960 | ret = mt9m111_video_probe(client); |
| 960 | if (ret) { | 961 | if (ret) { |
diff --git a/drivers/media/video/mt9t112.c b/drivers/media/video/mt9t112.c index 32114a3c0ca..7b34b11daf2 100644 --- a/drivers/media/video/mt9t112.c +++ b/drivers/media/video/mt9t112.c | |||
| @@ -1083,8 +1083,10 @@ static int mt9t112_probe(struct i2c_client *client, | |||
| 1083 | v4l2_i2c_subdev_init(&priv->subdev, client, &mt9t112_subdev_ops); | 1083 | v4l2_i2c_subdev_init(&priv->subdev, client, &mt9t112_subdev_ops); |
| 1084 | 1084 | ||
| 1085 | ret = mt9t112_camera_probe(client); | 1085 | ret = mt9t112_camera_probe(client); |
| 1086 | if (ret) | 1086 | if (ret) { |
| 1087 | kfree(priv); | 1087 | kfree(priv); |
| 1088 | return ret; | ||
| 1089 | } | ||
| 1088 | 1090 | ||
| 1089 | /* Cannot fail: using the default supported pixel code */ | 1091 | /* Cannot fail: using the default supported pixel code */ |
| 1090 | mt9t112_set_params(priv, &rect, V4L2_MBUS_FMT_UYVY8_2X8); | 1092 | mt9t112_set_params(priv, &rect, V4L2_MBUS_FMT_UYVY8_2X8); |
diff --git a/drivers/media/video/omap/omap_vout.c b/drivers/media/video/omap/omap_vout.c index 9c5c19f142d..ee0d0b39cd1 100644 --- a/drivers/media/video/omap/omap_vout.c +++ b/drivers/media/video/omap/omap_vout.c | |||
| @@ -38,6 +38,7 @@ | |||
| 38 | #include <linux/irq.h> | 38 | #include <linux/irq.h> |
| 39 | #include <linux/videodev2.h> | 39 | #include <linux/videodev2.h> |
| 40 | #include <linux/dma-mapping.h> | 40 | #include <linux/dma-mapping.h> |
| 41 | #include <linux/slab.h> | ||
| 41 | 42 | ||
| 42 | #include <media/videobuf-dma-contig.h> | 43 | #include <media/videobuf-dma-contig.h> |
| 43 | #include <media/v4l2-device.h> | 44 | #include <media/v4l2-device.h> |
| @@ -2169,6 +2170,14 @@ static int __init omap_vout_probe(struct platform_device *pdev) | |||
| 2169 | vid_dev->num_displays = 0; | 2170 | vid_dev->num_displays = 0; |
| 2170 | for_each_dss_dev(dssdev) { | 2171 | for_each_dss_dev(dssdev) { |
| 2171 | omap_dss_get_device(dssdev); | 2172 | omap_dss_get_device(dssdev); |
| 2173 | |||
| 2174 | if (!dssdev->driver) { | ||
| 2175 | dev_warn(&pdev->dev, "no driver for display: %s\n", | ||
| 2176 | dssdev->name); | ||
| 2177 | omap_dss_put_device(dssdev); | ||
| 2178 | continue; | ||
| 2179 | } | ||
| 2180 | |||
| 2172 | vid_dev->displays[vid_dev->num_displays++] = dssdev; | 2181 | vid_dev->displays[vid_dev->num_displays++] = dssdev; |
| 2173 | } | 2182 | } |
| 2174 | 2183 | ||
diff --git a/drivers/media/video/omap1_camera.c b/drivers/media/video/omap1_camera.c index e87ae2f634b..6a6cf388bae 100644 --- a/drivers/media/video/omap1_camera.c +++ b/drivers/media/video/omap1_camera.c | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | #include <linux/clk.h> | 24 | #include <linux/clk.h> |
| 25 | #include <linux/dma-mapping.h> | 25 | #include <linux/dma-mapping.h> |
| 26 | #include <linux/interrupt.h> | 26 | #include <linux/interrupt.h> |
| 27 | #include <linux/module.h> | ||
| 27 | #include <linux/platform_device.h> | 28 | #include <linux/platform_device.h> |
| 28 | #include <linux/slab.h> | 29 | #include <linux/slab.h> |
| 29 | 30 | ||
diff --git a/drivers/media/video/omap24xxcam-dma.c b/drivers/media/video/omap24xxcam-dma.c index 1d54b86c936..3ea38a8def8 100644 --- a/drivers/media/video/omap24xxcam-dma.c +++ b/drivers/media/video/omap24xxcam-dma.c | |||
| @@ -506,7 +506,7 @@ int omap24xxcam_sgdma_queue(struct omap24xxcam_sgdma *sgdma, | |||
| 506 | unsigned long flags; | 506 | unsigned long flags; |
| 507 | struct sgdma_state *sg_state; | 507 | struct sgdma_state *sg_state; |
| 508 | 508 | ||
| 509 | if ((sglen < 0) || ((sglen > 0) & !sglist)) | 509 | if ((sglen < 0) || ((sglen > 0) && !sglist)) |
| 510 | return -EINVAL; | 510 | return -EINVAL; |
| 511 | 511 | ||
| 512 | spin_lock_irqsave(&sgdma->lock, flags); | 512 | spin_lock_irqsave(&sgdma->lock, flags); |
diff --git a/drivers/media/video/omap3isp/ispccdc.c b/drivers/media/video/omap3isp/ispccdc.c index b0b0fa5a357..54a4a3f22e2 100644 --- a/drivers/media/video/omap3isp/ispccdc.c +++ b/drivers/media/video/omap3isp/ispccdc.c | |||
| @@ -1408,7 +1408,7 @@ static void ccdc_hs_vs_isr(struct isp_ccdc_device *ccdc) | |||
| 1408 | { | 1408 | { |
| 1409 | struct isp_pipeline *pipe = | 1409 | struct isp_pipeline *pipe = |
| 1410 | to_isp_pipeline(&ccdc->video_out.video.entity); | 1410 | to_isp_pipeline(&ccdc->video_out.video.entity); |
| 1411 | struct video_device *vdev = &ccdc->subdev.devnode; | 1411 | struct video_device *vdev = ccdc->subdev.devnode; |
| 1412 | struct v4l2_event event; | 1412 | struct v4l2_event event; |
| 1413 | 1413 | ||
| 1414 | memset(&event, 0, sizeof(event)); | 1414 | memset(&event, 0, sizeof(event)); |
diff --git a/drivers/media/video/omap3isp/ispstat.c b/drivers/media/video/omap3isp/ispstat.c index 68d539456c5..bc0b2c7349b 100644 --- a/drivers/media/video/omap3isp/ispstat.c +++ b/drivers/media/video/omap3isp/ispstat.c | |||
| @@ -496,7 +496,7 @@ static int isp_stat_bufs_alloc(struct ispstat *stat, u32 size) | |||
| 496 | 496 | ||
| 497 | static void isp_stat_queue_event(struct ispstat *stat, int err) | 497 | static void isp_stat_queue_event(struct ispstat *stat, int err) |
| 498 | { | 498 | { |
| 499 | struct video_device *vdev = &stat->subdev.devnode; | 499 | struct video_device *vdev = stat->subdev.devnode; |
| 500 | struct v4l2_event event; | 500 | struct v4l2_event event; |
| 501 | struct omap3isp_stat_event_status *status = (void *)event.u.data; | 501 | struct omap3isp_stat_event_status *status = (void *)event.u.data; |
| 502 | 502 | ||
diff --git a/drivers/media/video/omap3isp/ispvideo.c b/drivers/media/video/omap3isp/ispvideo.c index d1000723c5a..f2290578448 100644 --- a/drivers/media/video/omap3isp/ispvideo.c +++ b/drivers/media/video/omap3isp/ispvideo.c | |||
| @@ -26,6 +26,7 @@ | |||
| 26 | #include <asm/cacheflush.h> | 26 | #include <asm/cacheflush.h> |
| 27 | #include <linux/clk.h> | 27 | #include <linux/clk.h> |
| 28 | #include <linux/mm.h> | 28 | #include <linux/mm.h> |
| 29 | #include <linux/module.h> | ||
| 29 | #include <linux/pagemap.h> | 30 | #include <linux/pagemap.h> |
| 30 | #include <linux/scatterlist.h> | 31 | #include <linux/scatterlist.h> |
| 31 | #include <linux/sched.h> | 32 | #include <linux/sched.h> |
diff --git a/drivers/media/video/ov6650.c b/drivers/media/video/ov6650.c index 9f2d26b1d4c..6806345ec2f 100644 --- a/drivers/media/video/ov6650.c +++ b/drivers/media/video/ov6650.c | |||
| @@ -540,7 +540,7 @@ static u8 to_clkrc(struct v4l2_fract *timeperframe, | |||
| 540 | static int ov6650_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf) | 540 | static int ov6650_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf) |
| 541 | { | 541 | { |
| 542 | struct i2c_client *client = v4l2_get_subdevdata(sd); | 542 | struct i2c_client *client = v4l2_get_subdevdata(sd); |
| 543 | struct soc_camera_device *icd = (struct soc_camera_device *)sd->grp_id; | 543 | struct soc_camera_device *icd = v4l2_get_subdev_hostdata(sd); |
| 544 | struct soc_camera_sense *sense = icd->sense; | 544 | struct soc_camera_sense *sense = icd->sense; |
| 545 | struct ov6650 *priv = to_ov6650(client); | 545 | struct ov6650 *priv = to_ov6650(client); |
| 546 | bool half_scale = !is_unscaled_ok(mf->width, mf->height, &priv->rect); | 546 | bool half_scale = !is_unscaled_ok(mf->width, mf->height, &priv->rect); |
diff --git a/drivers/media/video/s5p-fimc/fimc-capture.c b/drivers/media/video/s5p-fimc/fimc-capture.c index c8d91b0cd9b..2cc3b916672 100644 --- a/drivers/media/video/s5p-fimc/fimc-capture.c +++ b/drivers/media/video/s5p-fimc/fimc-capture.c | |||
| @@ -98,6 +98,10 @@ static int fimc_capture_state_cleanup(struct fimc_dev *fimc, bool suspend) | |||
| 98 | vb2_buffer_done(&buf->vb, VB2_BUF_STATE_ERROR); | 98 | vb2_buffer_done(&buf->vb, VB2_BUF_STATE_ERROR); |
| 99 | } | 99 | } |
| 100 | set_bit(ST_CAPT_SUSPENDED, &fimc->state); | 100 | set_bit(ST_CAPT_SUSPENDED, &fimc->state); |
| 101 | |||
| 102 | fimc_hw_reset(fimc); | ||
| 103 | cap->buf_index = 0; | ||
| 104 | |||
| 101 | spin_unlock_irqrestore(&fimc->slock, flags); | 105 | spin_unlock_irqrestore(&fimc->slock, flags); |
| 102 | 106 | ||
| 103 | if (streaming) | 107 | if (streaming) |
| @@ -137,7 +141,7 @@ int fimc_capture_config_update(struct fimc_ctx *ctx) | |||
| 137 | struct fimc_dev *fimc = ctx->fimc_dev; | 141 | struct fimc_dev *fimc = ctx->fimc_dev; |
| 138 | int ret; | 142 | int ret; |
| 139 | 143 | ||
| 140 | if (test_bit(ST_CAPT_APPLY_CFG, &fimc->state)) | 144 | if (!test_bit(ST_CAPT_APPLY_CFG, &fimc->state)) |
| 141 | return 0; | 145 | return 0; |
| 142 | 146 | ||
| 143 | spin_lock(&ctx->slock); | 147 | spin_lock(&ctx->slock); |
| @@ -150,7 +154,7 @@ int fimc_capture_config_update(struct fimc_ctx *ctx) | |||
| 150 | fimc_hw_set_rotation(ctx); | 154 | fimc_hw_set_rotation(ctx); |
| 151 | fimc_prepare_dma_offset(ctx, &ctx->d_frame); | 155 | fimc_prepare_dma_offset(ctx, &ctx->d_frame); |
| 152 | fimc_hw_set_out_dma(ctx); | 156 | fimc_hw_set_out_dma(ctx); |
| 153 | set_bit(ST_CAPT_APPLY_CFG, &fimc->state); | 157 | clear_bit(ST_CAPT_APPLY_CFG, &fimc->state); |
| 154 | } | 158 | } |
| 155 | spin_unlock(&ctx->slock); | 159 | spin_unlock(&ctx->slock); |
| 156 | return ret; | 160 | return ret; |
| @@ -164,7 +168,6 @@ static int start_streaming(struct vb2_queue *q, unsigned int count) | |||
| 164 | int min_bufs; | 168 | int min_bufs; |
| 165 | int ret; | 169 | int ret; |
| 166 | 170 | ||
| 167 | fimc_hw_reset(fimc); | ||
| 168 | vid_cap->frame_count = 0; | 171 | vid_cap->frame_count = 0; |
| 169 | 172 | ||
| 170 | ret = fimc_init_capture(fimc); | 173 | ret = fimc_init_capture(fimc); |
| @@ -523,7 +526,7 @@ static struct fimc_fmt *fimc_capture_try_format(struct fimc_ctx *ctx, | |||
| 523 | max_w = rotation ? pl->out_rot_en_w : pl->out_rot_dis_w; | 526 | max_w = rotation ? pl->out_rot_en_w : pl->out_rot_dis_w; |
| 524 | min_w = ctx->state & FIMC_DST_CROP ? dst->width : var->min_out_pixsize; | 527 | min_w = ctx->state & FIMC_DST_CROP ? dst->width : var->min_out_pixsize; |
| 525 | min_h = ctx->state & FIMC_DST_CROP ? dst->height : var->min_out_pixsize; | 528 | min_h = ctx->state & FIMC_DST_CROP ? dst->height : var->min_out_pixsize; |
| 526 | if (fimc->id == 1 && var->pix_hoff) | 529 | if (var->min_vsize_align == 1 && !rotation) |
| 527 | align_h = fimc_fmt_is_rgb(ffmt->color) ? 0 : 1; | 530 | align_h = fimc_fmt_is_rgb(ffmt->color) ? 0 : 1; |
| 528 | 531 | ||
| 529 | depth = fimc_get_format_depth(ffmt); | 532 | depth = fimc_get_format_depth(ffmt); |
| @@ -1239,6 +1242,7 @@ static int fimc_subdev_set_fmt(struct v4l2_subdev *sd, | |||
| 1239 | 1242 | ||
| 1240 | mutex_lock(&fimc->lock); | 1243 | mutex_lock(&fimc->lock); |
| 1241 | set_frame_bounds(ff, mf->width, mf->height); | 1244 | set_frame_bounds(ff, mf->width, mf->height); |
| 1245 | fimc->vid_cap.mf = *mf; | ||
| 1242 | ff->fmt = ffmt; | 1246 | ff->fmt = ffmt; |
| 1243 | 1247 | ||
| 1244 | /* Reset the crop rectangle if required. */ | 1248 | /* Reset the crop rectangle if required. */ |
| @@ -1375,7 +1379,7 @@ static void fimc_destroy_capture_subdev(struct fimc_dev *fimc) | |||
| 1375 | media_entity_cleanup(&sd->entity); | 1379 | media_entity_cleanup(&sd->entity); |
| 1376 | v4l2_device_unregister_subdev(sd); | 1380 | v4l2_device_unregister_subdev(sd); |
| 1377 | kfree(sd); | 1381 | kfree(sd); |
| 1378 | sd = NULL; | 1382 | fimc->vid_cap.subdev = NULL; |
| 1379 | } | 1383 | } |
| 1380 | 1384 | ||
| 1381 | /* Set default format at the sensor and host interface */ | 1385 | /* Set default format at the sensor and host interface */ |
diff --git a/drivers/media/video/s5p-fimc/fimc-core.c b/drivers/media/video/s5p-fimc/fimc-core.c index 19ca6db38b2..07c6254faee 100644 --- a/drivers/media/video/s5p-fimc/fimc-core.c +++ b/drivers/media/video/s5p-fimc/fimc-core.c | |||
| @@ -37,7 +37,7 @@ static char *fimc_clocks[MAX_FIMC_CLOCKS] = { | |||
| 37 | static struct fimc_fmt fimc_formats[] = { | 37 | static struct fimc_fmt fimc_formats[] = { |
| 38 | { | 38 | { |
| 39 | .name = "RGB565", | 39 | .name = "RGB565", |
| 40 | .fourcc = V4L2_PIX_FMT_RGB565X, | 40 | .fourcc = V4L2_PIX_FMT_RGB565, |
| 41 | .depth = { 16 }, | 41 | .depth = { 16 }, |
| 42 | .color = S5P_FIMC_RGB565, | 42 | .color = S5P_FIMC_RGB565, |
| 43 | .memplanes = 1, | 43 | .memplanes = 1, |
| @@ -1038,12 +1038,11 @@ static int fimc_try_fmt_mplane(struct fimc_ctx *ctx, struct v4l2_format *f) | |||
| 1038 | mod_x = 6; /* 64 x 32 pixels tile */ | 1038 | mod_x = 6; /* 64 x 32 pixels tile */ |
| 1039 | mod_y = 5; | 1039 | mod_y = 5; |
| 1040 | } else { | 1040 | } else { |
| 1041 | if (fimc->id == 1 && variant->pix_hoff) | 1041 | if (variant->min_vsize_align == 1) |
| 1042 | mod_y = fimc_fmt_is_rgb(fmt->color) ? 0 : 1; | 1042 | mod_y = fimc_fmt_is_rgb(fmt->color) ? 0 : 1; |
| 1043 | else | 1043 | else |
| 1044 | mod_y = mod_x; | 1044 | mod_y = ffs(variant->min_vsize_align) - 1; |
| 1045 | } | 1045 | } |
| 1046 | dbg("mod_x: %d, mod_y: %d, max_w: %d", mod_x, mod_y, max_w); | ||
| 1047 | 1046 | ||
| 1048 | v4l_bound_align_image(&pix->width, 16, max_w, mod_x, | 1047 | v4l_bound_align_image(&pix->width, 16, max_w, mod_x, |
| 1049 | &pix->height, 8, variant->pix_limit->scaler_dis_w, mod_y, 0); | 1048 | &pix->height, 8, variant->pix_limit->scaler_dis_w, mod_y, 0); |
| @@ -1226,10 +1225,10 @@ static int fimc_m2m_try_crop(struct fimc_ctx *ctx, struct v4l2_crop *cr) | |||
| 1226 | fimc->variant->min_inp_pixsize : fimc->variant->min_out_pixsize; | 1225 | fimc->variant->min_inp_pixsize : fimc->variant->min_out_pixsize; |
| 1227 | 1226 | ||
| 1228 | /* Get pixel alignment constraints. */ | 1227 | /* Get pixel alignment constraints. */ |
| 1229 | if (fimc->id == 1 && fimc->variant->pix_hoff) | 1228 | if (fimc->variant->min_vsize_align == 1) |
| 1230 | halign = fimc_fmt_is_rgb(f->fmt->color) ? 0 : 1; | 1229 | halign = fimc_fmt_is_rgb(f->fmt->color) ? 0 : 1; |
| 1231 | else | 1230 | else |
| 1232 | halign = ffs(min_size) - 1; | 1231 | halign = ffs(fimc->variant->min_vsize_align) - 1; |
| 1233 | 1232 | ||
| 1234 | for (i = 0; i < f->fmt->colplanes; i++) | 1233 | for (i = 0; i < f->fmt->colplanes; i++) |
| 1235 | depth += f->fmt->depth[i]; | 1234 | depth += f->fmt->depth[i]; |
| @@ -1615,7 +1614,6 @@ static int fimc_probe(struct platform_device *pdev) | |||
| 1615 | pdata = pdev->dev.platform_data; | 1614 | pdata = pdev->dev.platform_data; |
| 1616 | fimc->pdata = pdata; | 1615 | fimc->pdata = pdata; |
| 1617 | 1616 | ||
| 1618 | set_bit(ST_LPM, &fimc->state); | ||
| 1619 | 1617 | ||
| 1620 | init_waitqueue_head(&fimc->irq_queue); | 1618 | init_waitqueue_head(&fimc->irq_queue); |
| 1621 | spin_lock_init(&fimc->slock); | 1619 | spin_lock_init(&fimc->slock); |
| @@ -1707,8 +1705,6 @@ static int fimc_runtime_resume(struct device *dev) | |||
| 1707 | /* Enable clocks and perform basic initalization */ | 1705 | /* Enable clocks and perform basic initalization */ |
| 1708 | clk_enable(fimc->clock[CLK_GATE]); | 1706 | clk_enable(fimc->clock[CLK_GATE]); |
| 1709 | fimc_hw_reset(fimc); | 1707 | fimc_hw_reset(fimc); |
| 1710 | if (fimc->variant->out_buf_count > 4) | ||
| 1711 | fimc_hw_set_dma_seq(fimc, 0xF); | ||
| 1712 | 1708 | ||
| 1713 | /* Resume the capture or mem-to-mem device */ | 1709 | /* Resume the capture or mem-to-mem device */ |
| 1714 | if (fimc_capture_busy(fimc)) | 1710 | if (fimc_capture_busy(fimc)) |
| @@ -1750,8 +1746,6 @@ static int fimc_resume(struct device *dev) | |||
| 1750 | return 0; | 1746 | return 0; |
| 1751 | } | 1747 | } |
| 1752 | fimc_hw_reset(fimc); | 1748 | fimc_hw_reset(fimc); |
| 1753 | if (fimc->variant->out_buf_count > 4) | ||
| 1754 | fimc_hw_set_dma_seq(fimc, 0xF); | ||
| 1755 | spin_unlock_irqrestore(&fimc->slock, flags); | 1749 | spin_unlock_irqrestore(&fimc->slock, flags); |
| 1756 | 1750 | ||
| 1757 | if (fimc_capture_busy(fimc)) | 1751 | if (fimc_capture_busy(fimc)) |
| @@ -1780,7 +1774,6 @@ static int __devexit fimc_remove(struct platform_device *pdev) | |||
| 1780 | struct fimc_dev *fimc = platform_get_drvdata(pdev); | 1774 | struct fimc_dev *fimc = platform_get_drvdata(pdev); |
| 1781 | 1775 | ||
| 1782 | pm_runtime_disable(&pdev->dev); | 1776 | pm_runtime_disable(&pdev->dev); |
| 1783 | fimc_runtime_suspend(&pdev->dev); | ||
| 1784 | pm_runtime_set_suspended(&pdev->dev); | 1777 | pm_runtime_set_suspended(&pdev->dev); |
| 1785 | 1778 | ||
| 1786 | vb2_dma_contig_cleanup_ctx(fimc->alloc_ctx); | 1779 | vb2_dma_contig_cleanup_ctx(fimc->alloc_ctx); |
| @@ -1840,6 +1833,7 @@ static struct samsung_fimc_variant fimc0_variant_s5p = { | |||
| 1840 | .min_inp_pixsize = 16, | 1833 | .min_inp_pixsize = 16, |
| 1841 | .min_out_pixsize = 16, | 1834 | .min_out_pixsize = 16, |
| 1842 | .hor_offs_align = 8, | 1835 | .hor_offs_align = 8, |
| 1836 | .min_vsize_align = 16, | ||
| 1843 | .out_buf_count = 4, | 1837 | .out_buf_count = 4, |
| 1844 | .pix_limit = &s5p_pix_limit[0], | 1838 | .pix_limit = &s5p_pix_limit[0], |
| 1845 | }; | 1839 | }; |
| @@ -1849,6 +1843,7 @@ static struct samsung_fimc_variant fimc2_variant_s5p = { | |||
| 1849 | .min_inp_pixsize = 16, | 1843 | .min_inp_pixsize = 16, |
| 1850 | .min_out_pixsize = 16, | 1844 | .min_out_pixsize = 16, |
| 1851 | .hor_offs_align = 8, | 1845 | .hor_offs_align = 8, |
| 1846 | .min_vsize_align = 16, | ||
| 1852 | .out_buf_count = 4, | 1847 | .out_buf_count = 4, |
| 1853 | .pix_limit = &s5p_pix_limit[1], | 1848 | .pix_limit = &s5p_pix_limit[1], |
| 1854 | }; | 1849 | }; |
| @@ -1861,6 +1856,7 @@ static struct samsung_fimc_variant fimc0_variant_s5pv210 = { | |||
| 1861 | .min_inp_pixsize = 16, | 1856 | .min_inp_pixsize = 16, |
| 1862 | .min_out_pixsize = 16, | 1857 | .min_out_pixsize = 16, |
| 1863 | .hor_offs_align = 8, | 1858 | .hor_offs_align = 8, |
| 1859 | .min_vsize_align = 16, | ||
| 1864 | .out_buf_count = 4, | 1860 | .out_buf_count = 4, |
| 1865 | .pix_limit = &s5p_pix_limit[1], | 1861 | .pix_limit = &s5p_pix_limit[1], |
| 1866 | }; | 1862 | }; |
| @@ -1874,6 +1870,7 @@ static struct samsung_fimc_variant fimc1_variant_s5pv210 = { | |||
| 1874 | .min_inp_pixsize = 16, | 1870 | .min_inp_pixsize = 16, |
| 1875 | .min_out_pixsize = 16, | 1871 | .min_out_pixsize = 16, |
| 1876 | .hor_offs_align = 1, | 1872 | .hor_offs_align = 1, |
| 1873 | .min_vsize_align = 1, | ||
| 1877 | .out_buf_count = 4, | 1874 | .out_buf_count = 4, |
| 1878 | .pix_limit = &s5p_pix_limit[2], | 1875 | .pix_limit = &s5p_pix_limit[2], |
| 1879 | }; | 1876 | }; |
| @@ -1884,6 +1881,7 @@ static struct samsung_fimc_variant fimc2_variant_s5pv210 = { | |||
| 1884 | .min_inp_pixsize = 16, | 1881 | .min_inp_pixsize = 16, |
| 1885 | .min_out_pixsize = 16, | 1882 | .min_out_pixsize = 16, |
| 1886 | .hor_offs_align = 8, | 1883 | .hor_offs_align = 8, |
| 1884 | .min_vsize_align = 16, | ||
| 1887 | .out_buf_count = 4, | 1885 | .out_buf_count = 4, |
| 1888 | .pix_limit = &s5p_pix_limit[2], | 1886 | .pix_limit = &s5p_pix_limit[2], |
| 1889 | }; | 1887 | }; |
| @@ -1898,6 +1896,7 @@ static struct samsung_fimc_variant fimc0_variant_exynos4 = { | |||
| 1898 | .min_inp_pixsize = 16, | 1896 | .min_inp_pixsize = 16, |
| 1899 | .min_out_pixsize = 16, | 1897 | .min_out_pixsize = 16, |
| 1900 | .hor_offs_align = 2, | 1898 | .hor_offs_align = 2, |
| 1899 | .min_vsize_align = 1, | ||
| 1901 | .out_buf_count = 32, | 1900 | .out_buf_count = 32, |
| 1902 | .pix_limit = &s5p_pix_limit[1], | 1901 | .pix_limit = &s5p_pix_limit[1], |
| 1903 | }; | 1902 | }; |
| @@ -1910,6 +1909,7 @@ static struct samsung_fimc_variant fimc3_variant_exynos4 = { | |||
| 1910 | .min_inp_pixsize = 16, | 1909 | .min_inp_pixsize = 16, |
| 1911 | .min_out_pixsize = 16, | 1910 | .min_out_pixsize = 16, |
| 1912 | .hor_offs_align = 2, | 1911 | .hor_offs_align = 2, |
| 1912 | .min_vsize_align = 1, | ||
| 1913 | .out_buf_count = 32, | 1913 | .out_buf_count = 32, |
| 1914 | .pix_limit = &s5p_pix_limit[3], | 1914 | .pix_limit = &s5p_pix_limit[3], |
| 1915 | }; | 1915 | }; |
diff --git a/drivers/media/video/s5p-fimc/fimc-core.h b/drivers/media/video/s5p-fimc/fimc-core.h index a6936dad5b1..c7f01c47b20 100644 --- a/drivers/media/video/s5p-fimc/fimc-core.h +++ b/drivers/media/video/s5p-fimc/fimc-core.h | |||
| @@ -377,6 +377,7 @@ struct fimc_pix_limit { | |||
| 377 | * @min_inp_pixsize: minimum input pixel size | 377 | * @min_inp_pixsize: minimum input pixel size |
| 378 | * @min_out_pixsize: minimum output pixel size | 378 | * @min_out_pixsize: minimum output pixel size |
| 379 | * @hor_offs_align: horizontal pixel offset aligment | 379 | * @hor_offs_align: horizontal pixel offset aligment |
| 380 | * @min_vsize_align: minimum vertical pixel size alignment | ||
| 380 | * @out_buf_count: the number of buffers in output DMA sequence | 381 | * @out_buf_count: the number of buffers in output DMA sequence |
| 381 | */ | 382 | */ |
| 382 | struct samsung_fimc_variant { | 383 | struct samsung_fimc_variant { |
| @@ -390,6 +391,7 @@ struct samsung_fimc_variant { | |||
| 390 | u16 min_inp_pixsize; | 391 | u16 min_inp_pixsize; |
| 391 | u16 min_out_pixsize; | 392 | u16 min_out_pixsize; |
| 392 | u16 hor_offs_align; | 393 | u16 hor_offs_align; |
| 394 | u16 min_vsize_align; | ||
| 393 | u16 out_buf_count; | 395 | u16 out_buf_count; |
| 394 | }; | 396 | }; |
| 395 | 397 | ||
diff --git a/drivers/media/video/s5p-fimc/fimc-mdevice.c b/drivers/media/video/s5p-fimc/fimc-mdevice.c index cc337b1de91..615c862f036 100644 --- a/drivers/media/video/s5p-fimc/fimc-mdevice.c +++ b/drivers/media/video/s5p-fimc/fimc-mdevice.c | |||
| @@ -220,6 +220,7 @@ static struct v4l2_subdev *fimc_md_register_sensor(struct fimc_md *fmd, | |||
| 220 | sd = v4l2_i2c_new_subdev_board(&fmd->v4l2_dev, adapter, | 220 | sd = v4l2_i2c_new_subdev_board(&fmd->v4l2_dev, adapter, |
| 221 | s_info->pdata->board_info, NULL); | 221 | s_info->pdata->board_info, NULL); |
| 222 | if (IS_ERR_OR_NULL(sd)) { | 222 | if (IS_ERR_OR_NULL(sd)) { |
| 223 | i2c_put_adapter(adapter); | ||
| 223 | v4l2_err(&fmd->v4l2_dev, "Failed to acquire subdev\n"); | 224 | v4l2_err(&fmd->v4l2_dev, "Failed to acquire subdev\n"); |
| 224 | return NULL; | 225 | return NULL; |
| 225 | } | 226 | } |
| @@ -234,12 +235,15 @@ static struct v4l2_subdev *fimc_md_register_sensor(struct fimc_md *fmd, | |||
| 234 | static void fimc_md_unregister_sensor(struct v4l2_subdev *sd) | 235 | static void fimc_md_unregister_sensor(struct v4l2_subdev *sd) |
| 235 | { | 236 | { |
| 236 | struct i2c_client *client = v4l2_get_subdevdata(sd); | 237 | struct i2c_client *client = v4l2_get_subdevdata(sd); |
| 238 | struct i2c_adapter *adapter; | ||
| 237 | 239 | ||
| 238 | if (!client) | 240 | if (!client) |
| 239 | return; | 241 | return; |
| 240 | v4l2_device_unregister_subdev(sd); | 242 | v4l2_device_unregister_subdev(sd); |
| 243 | adapter = client->adapter; | ||
| 241 | i2c_unregister_device(client); | 244 | i2c_unregister_device(client); |
| 242 | i2c_put_adapter(client->adapter); | 245 | if (adapter) |
| 246 | i2c_put_adapter(adapter); | ||
| 243 | } | 247 | } |
| 244 | 248 | ||
| 245 | static int fimc_md_register_sensor_entities(struct fimc_md *fmd) | 249 | static int fimc_md_register_sensor_entities(struct fimc_md *fmd) |
| @@ -381,20 +385,28 @@ static void fimc_md_unregister_entities(struct fimc_md *fmd) | |||
| 381 | 385 | ||
| 382 | static int fimc_md_register_video_nodes(struct fimc_md *fmd) | 386 | static int fimc_md_register_video_nodes(struct fimc_md *fmd) |
| 383 | { | 387 | { |
| 388 | struct video_device *vdev; | ||
| 384 | int i, ret = 0; | 389 | int i, ret = 0; |
| 385 | 390 | ||
| 386 | for (i = 0; i < FIMC_MAX_DEVS && !ret; i++) { | 391 | for (i = 0; i < FIMC_MAX_DEVS && !ret; i++) { |
| 387 | if (!fmd->fimc[i]) | 392 | if (!fmd->fimc[i]) |
| 388 | continue; | 393 | continue; |
| 389 | 394 | ||
| 390 | if (fmd->fimc[i]->m2m.vfd) | 395 | vdev = fmd->fimc[i]->m2m.vfd; |
| 391 | ret = video_register_device(fmd->fimc[i]->m2m.vfd, | 396 | if (vdev) { |
| 392 | VFL_TYPE_GRABBER, -1); | 397 | ret = video_register_device(vdev, VFL_TYPE_GRABBER, -1); |
| 393 | if (ret) | 398 | if (ret) |
| 394 | break; | 399 | break; |
| 395 | if (fmd->fimc[i]->vid_cap.vfd) | 400 | v4l2_info(&fmd->v4l2_dev, "Registered %s as /dev/%s\n", |
| 396 | ret = video_register_device(fmd->fimc[i]->vid_cap.vfd, | 401 | vdev->name, video_device_node_name(vdev)); |
| 397 | VFL_TYPE_GRABBER, -1); | 402 | } |
| 403 | |||
| 404 | vdev = fmd->fimc[i]->vid_cap.vfd; | ||
| 405 | if (vdev == NULL) | ||
| 406 | continue; | ||
| 407 | ret = video_register_device(vdev, VFL_TYPE_GRABBER, -1); | ||
| 408 | v4l2_info(&fmd->v4l2_dev, "Registered %s as /dev/%s\n", | ||
| 409 | vdev->name, video_device_node_name(vdev)); | ||
| 398 | } | 410 | } |
| 399 | 411 | ||
| 400 | return ret; | 412 | return ret; |
| @@ -502,7 +514,7 @@ static int fimc_md_create_links(struct fimc_md *fmd) | |||
| 502 | if (WARN(csis == NULL, | 514 | if (WARN(csis == NULL, |
| 503 | "MIPI-CSI interface specified " | 515 | "MIPI-CSI interface specified " |
| 504 | "but s5p-csis module is not loaded!\n")) | 516 | "but s5p-csis module is not loaded!\n")) |
| 505 | continue; | 517 | return -EINVAL; |
| 506 | 518 | ||
| 507 | ret = media_entity_create_link(&sensor->entity, 0, | 519 | ret = media_entity_create_link(&sensor->entity, 0, |
| 508 | &csis->entity, CSIS_PAD_SINK, | 520 | &csis->entity, CSIS_PAD_SINK, |
| @@ -742,9 +754,6 @@ static int __devinit fimc_md_probe(struct platform_device *pdev) | |||
| 742 | struct fimc_md *fmd; | 754 | struct fimc_md *fmd; |
| 743 | int ret; | 755 | int ret; |
| 744 | 756 | ||
| 745 | if (WARN(!pdev->dev.platform_data, "Platform data not specified!\n")) | ||
| 746 | return -EINVAL; | ||
| 747 | |||
| 748 | fmd = kzalloc(sizeof(struct fimc_md), GFP_KERNEL); | 757 | fmd = kzalloc(sizeof(struct fimc_md), GFP_KERNEL); |
| 749 | if (!fmd) | 758 | if (!fmd) |
| 750 | return -ENOMEM; | 759 | return -ENOMEM; |
| @@ -782,9 +791,11 @@ static int __devinit fimc_md_probe(struct platform_device *pdev) | |||
| 782 | if (ret) | 791 | if (ret) |
| 783 | goto err3; | 792 | goto err3; |
| 784 | 793 | ||
| 785 | ret = fimc_md_register_sensor_entities(fmd); | 794 | if (pdev->dev.platform_data) { |
| 786 | if (ret) | 795 | ret = fimc_md_register_sensor_entities(fmd); |
| 787 | goto err3; | 796 | if (ret) |
| 797 | goto err3; | ||
| 798 | } | ||
| 788 | ret = fimc_md_create_links(fmd); | 799 | ret = fimc_md_create_links(fmd); |
| 789 | if (ret) | 800 | if (ret) |
| 790 | goto err3; | 801 | goto err3; |
diff --git a/drivers/media/video/s5p-fimc/fimc-reg.c b/drivers/media/video/s5p-fimc/fimc-reg.c index 20e664e3416..44f5c2d1920 100644 --- a/drivers/media/video/s5p-fimc/fimc-reg.c +++ b/drivers/media/video/s5p-fimc/fimc-reg.c | |||
| @@ -35,6 +35,9 @@ void fimc_hw_reset(struct fimc_dev *dev) | |||
| 35 | cfg = readl(dev->regs + S5P_CIGCTRL); | 35 | cfg = readl(dev->regs + S5P_CIGCTRL); |
| 36 | cfg &= ~S5P_CIGCTRL_SWRST; | 36 | cfg &= ~S5P_CIGCTRL_SWRST; |
| 37 | writel(cfg, dev->regs + S5P_CIGCTRL); | 37 | writel(cfg, dev->regs + S5P_CIGCTRL); |
| 38 | |||
| 39 | if (dev->variant->out_buf_count > 4) | ||
| 40 | fimc_hw_set_dma_seq(dev, 0xF); | ||
| 38 | } | 41 | } |
| 39 | 42 | ||
| 40 | static u32 fimc_hw_get_in_flip(struct fimc_ctx *ctx) | 43 | static u32 fimc_hw_get_in_flip(struct fimc_ctx *ctx) |
| @@ -251,7 +254,14 @@ static void fimc_hw_set_scaler(struct fimc_ctx *ctx) | |||
| 251 | struct fimc_scaler *sc = &ctx->scaler; | 254 | struct fimc_scaler *sc = &ctx->scaler; |
| 252 | struct fimc_frame *src_frame = &ctx->s_frame; | 255 | struct fimc_frame *src_frame = &ctx->s_frame; |
| 253 | struct fimc_frame *dst_frame = &ctx->d_frame; | 256 | struct fimc_frame *dst_frame = &ctx->d_frame; |
| 254 | u32 cfg = 0; | 257 | |
| 258 | u32 cfg = readl(dev->regs + S5P_CISCCTRL); | ||
| 259 | |||
| 260 | cfg &= ~(S5P_CISCCTRL_CSCR2Y_WIDE | S5P_CISCCTRL_CSCY2R_WIDE | | ||
| 261 | S5P_CISCCTRL_SCALEUP_H | S5P_CISCCTRL_SCALEUP_V | | ||
| 262 | S5P_CISCCTRL_SCALERBYPASS | S5P_CISCCTRL_ONE2ONE | | ||
| 263 | S5P_CISCCTRL_INRGB_FMT_MASK | S5P_CISCCTRL_OUTRGB_FMT_MASK | | ||
| 264 | S5P_CISCCTRL_INTERLACE | S5P_CISCCTRL_RGB_EXT); | ||
| 255 | 265 | ||
| 256 | if (!(ctx->flags & FIMC_COLOR_RANGE_NARROW)) | 266 | if (!(ctx->flags & FIMC_COLOR_RANGE_NARROW)) |
| 257 | cfg |= (S5P_CISCCTRL_CSCR2Y_WIDE | S5P_CISCCTRL_CSCY2R_WIDE); | 267 | cfg |= (S5P_CISCCTRL_CSCR2Y_WIDE | S5P_CISCCTRL_CSCY2R_WIDE); |
| @@ -308,9 +318,9 @@ void fimc_hw_set_mainscaler(struct fimc_ctx *ctx) | |||
| 308 | fimc_hw_set_scaler(ctx); | 318 | fimc_hw_set_scaler(ctx); |
| 309 | 319 | ||
| 310 | cfg = readl(dev->regs + S5P_CISCCTRL); | 320 | cfg = readl(dev->regs + S5P_CISCCTRL); |
| 321 | cfg &= ~(S5P_CISCCTRL_MHRATIO_MASK | S5P_CISCCTRL_MVRATIO_MASK); | ||
| 311 | 322 | ||
| 312 | if (variant->has_mainscaler_ext) { | 323 | if (variant->has_mainscaler_ext) { |
| 313 | cfg &= ~(S5P_CISCCTRL_MHRATIO_MASK | S5P_CISCCTRL_MVRATIO_MASK); | ||
| 314 | cfg |= S5P_CISCCTRL_MHRATIO_EXT(sc->main_hratio); | 324 | cfg |= S5P_CISCCTRL_MHRATIO_EXT(sc->main_hratio); |
| 315 | cfg |= S5P_CISCCTRL_MVRATIO_EXT(sc->main_vratio); | 325 | cfg |= S5P_CISCCTRL_MVRATIO_EXT(sc->main_vratio); |
| 316 | writel(cfg, dev->regs + S5P_CISCCTRL); | 326 | writel(cfg, dev->regs + S5P_CISCCTRL); |
| @@ -323,7 +333,6 @@ void fimc_hw_set_mainscaler(struct fimc_ctx *ctx) | |||
| 323 | cfg |= S5P_CIEXTEN_MVRATIO_EXT(sc->main_vratio); | 333 | cfg |= S5P_CIEXTEN_MVRATIO_EXT(sc->main_vratio); |
| 324 | writel(cfg, dev->regs + S5P_CIEXTEN); | 334 | writel(cfg, dev->regs + S5P_CIEXTEN); |
| 325 | } else { | 335 | } else { |
| 326 | cfg &= ~(S5P_CISCCTRL_MHRATIO_MASK | S5P_CISCCTRL_MVRATIO_MASK); | ||
| 327 | cfg |= S5P_CISCCTRL_MHRATIO(sc->main_hratio); | 336 | cfg |= S5P_CISCCTRL_MHRATIO(sc->main_hratio); |
| 328 | cfg |= S5P_CISCCTRL_MVRATIO(sc->main_vratio); | 337 | cfg |= S5P_CISCCTRL_MVRATIO(sc->main_vratio); |
| 329 | writel(cfg, dev->regs + S5P_CISCCTRL); | 338 | writel(cfg, dev->regs + S5P_CISCCTRL); |
diff --git a/drivers/media/video/s5p-mfc/s5p_mfc_enc.c b/drivers/media/video/s5p-mfc/s5p_mfc_enc.c index 1e8cdb77d4b..dff9dc79879 100644 --- a/drivers/media/video/s5p-mfc/s5p_mfc_enc.c +++ b/drivers/media/video/s5p-mfc/s5p_mfc_enc.c | |||
| @@ -61,7 +61,7 @@ static struct s5p_mfc_fmt formats[] = { | |||
| 61 | .num_planes = 1, | 61 | .num_planes = 1, |
| 62 | }, | 62 | }, |
| 63 | { | 63 | { |
| 64 | .name = "H264 Encoded Stream", | 64 | .name = "H263 Encoded Stream", |
| 65 | .fourcc = V4L2_PIX_FMT_H263, | 65 | .fourcc = V4L2_PIX_FMT_H263, |
| 66 | .codec_mode = S5P_FIMV_CODEC_H263_ENC, | 66 | .codec_mode = S5P_FIMV_CODEC_H263_ENC, |
| 67 | .type = MFC_FMT_ENC, | 67 | .type = MFC_FMT_ENC, |
diff --git a/drivers/media/video/s5p-tv/mixer_video.c b/drivers/media/video/s5p-tv/mixer_video.c index e16d3a4bc1d..b47d0c06ecf 100644 --- a/drivers/media/video/s5p-tv/mixer_video.c +++ b/drivers/media/video/s5p-tv/mixer_video.c | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | #include <media/v4l2-ioctl.h> | 16 | #include <media/v4l2-ioctl.h> |
| 17 | #include <linux/videodev2.h> | 17 | #include <linux/videodev2.h> |
| 18 | #include <linux/mm.h> | 18 | #include <linux/mm.h> |
| 19 | #include <linux/module.h> | ||
| 19 | #include <linux/version.h> | 20 | #include <linux/version.h> |
| 20 | #include <linux/timer.h> | 21 | #include <linux/timer.h> |
| 21 | #include <media/videobuf2-dma-contig.h> | 22 | #include <media/videobuf2-dma-contig.h> |
diff --git a/drivers/media/video/sh_mobile_ceu_camera.c b/drivers/media/video/sh_mobile_ceu_camera.c index f390682629c..c51decfcae1 100644 --- a/drivers/media/video/sh_mobile_ceu_camera.c +++ b/drivers/media/video/sh_mobile_ceu_camera.c | |||
| @@ -566,8 +566,10 @@ static int sh_mobile_ceu_add_device(struct soc_camera_device *icd) | |||
| 566 | ret = sh_mobile_ceu_soft_reset(pcdev); | 566 | ret = sh_mobile_ceu_soft_reset(pcdev); |
| 567 | 567 | ||
| 568 | csi2_sd = find_csi2(pcdev); | 568 | csi2_sd = find_csi2(pcdev); |
| 569 | if (csi2_sd) | 569 | if (csi2_sd) { |
| 570 | csi2_sd->grp_id = (long)icd; | 570 | csi2_sd->grp_id = soc_camera_grp_id(icd); |
| 571 | v4l2_set_subdev_hostdata(csi2_sd, icd); | ||
| 572 | } | ||
| 571 | 573 | ||
| 572 | ret = v4l2_subdev_call(csi2_sd, core, s_power, 1); | 574 | ret = v4l2_subdev_call(csi2_sd, core, s_power, 1); |
| 573 | if (ret < 0 && ret != -ENOIOCTLCMD && ret != -ENODEV) { | 575 | if (ret < 0 && ret != -ENOIOCTLCMD && ret != -ENODEV) { |
| @@ -768,7 +770,7 @@ static struct v4l2_subdev *find_bus_subdev(struct sh_mobile_ceu_dev *pcdev, | |||
| 768 | { | 770 | { |
| 769 | if (pcdev->csi2_pdev) { | 771 | if (pcdev->csi2_pdev) { |
| 770 | struct v4l2_subdev *csi2_sd = find_csi2(pcdev); | 772 | struct v4l2_subdev *csi2_sd = find_csi2(pcdev); |
| 771 | if (csi2_sd && csi2_sd->grp_id == (u32)icd) | 773 | if (csi2_sd && csi2_sd->grp_id == soc_camera_grp_id(icd)) |
| 772 | return csi2_sd; | 774 | return csi2_sd; |
| 773 | } | 775 | } |
| 774 | 776 | ||
| @@ -1089,8 +1091,9 @@ static int sh_mobile_ceu_get_formats(struct soc_camera_device *icd, unsigned int | |||
| 1089 | /* Try 2560x1920, 1280x960, 640x480, 320x240 */ | 1091 | /* Try 2560x1920, 1280x960, 640x480, 320x240 */ |
| 1090 | mf.width = 2560 >> shift; | 1092 | mf.width = 2560 >> shift; |
| 1091 | mf.height = 1920 >> shift; | 1093 | mf.height = 1920 >> shift; |
| 1092 | ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video, | 1094 | ret = v4l2_device_call_until_err(sd->v4l2_dev, |
| 1093 | s_mbus_fmt, &mf); | 1095 | soc_camera_grp_id(icd), video, |
| 1096 | s_mbus_fmt, &mf); | ||
| 1094 | if (ret < 0) | 1097 | if (ret < 0) |
| 1095 | return ret; | 1098 | return ret; |
| 1096 | shift++; | 1099 | shift++; |
| @@ -1389,7 +1392,8 @@ static int client_s_fmt(struct soc_camera_device *icd, | |||
| 1389 | bool ceu_1to1; | 1392 | bool ceu_1to1; |
| 1390 | int ret; | 1393 | int ret; |
| 1391 | 1394 | ||
| 1392 | ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video, | 1395 | ret = v4l2_device_call_until_err(sd->v4l2_dev, |
| 1396 | soc_camera_grp_id(icd), video, | ||
| 1393 | s_mbus_fmt, mf); | 1397 | s_mbus_fmt, mf); |
| 1394 | if (ret < 0) | 1398 | if (ret < 0) |
| 1395 | return ret; | 1399 | return ret; |
| @@ -1426,8 +1430,9 @@ static int client_s_fmt(struct soc_camera_device *icd, | |||
| 1426 | tmp_h = min(2 * tmp_h, max_height); | 1430 | tmp_h = min(2 * tmp_h, max_height); |
| 1427 | mf->width = tmp_w; | 1431 | mf->width = tmp_w; |
| 1428 | mf->height = tmp_h; | 1432 | mf->height = tmp_h; |
| 1429 | ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video, | 1433 | ret = v4l2_device_call_until_err(sd->v4l2_dev, |
| 1430 | s_mbus_fmt, mf); | 1434 | soc_camera_grp_id(icd), video, |
| 1435 | s_mbus_fmt, mf); | ||
| 1431 | dev_geo(dev, "Camera scaled to %ux%u\n", | 1436 | dev_geo(dev, "Camera scaled to %ux%u\n", |
| 1432 | mf->width, mf->height); | 1437 | mf->width, mf->height); |
| 1433 | if (ret < 0) { | 1438 | if (ret < 0) { |
| @@ -1580,8 +1585,9 @@ static int sh_mobile_ceu_set_crop(struct soc_camera_device *icd, | |||
| 1580 | } | 1585 | } |
| 1581 | 1586 | ||
| 1582 | if (interm_width < icd->user_width || interm_height < icd->user_height) { | 1587 | if (interm_width < icd->user_width || interm_height < icd->user_height) { |
| 1583 | ret = v4l2_device_call_until_err(sd->v4l2_dev, (int)icd, video, | 1588 | ret = v4l2_device_call_until_err(sd->v4l2_dev, |
| 1584 | s_mbus_fmt, &mf); | 1589 | soc_camera_grp_id(icd), video, |
| 1590 | s_mbus_fmt, &mf); | ||
| 1585 | if (ret < 0) | 1591 | if (ret < 0) |
| 1586 | return ret; | 1592 | return ret; |
| 1587 | 1593 | ||
| @@ -1867,7 +1873,8 @@ static int sh_mobile_ceu_try_fmt(struct soc_camera_device *icd, | |||
| 1867 | mf.code = xlate->code; | 1873 | mf.code = xlate->code; |
| 1868 | mf.colorspace = pix->colorspace; | 1874 | mf.colorspace = pix->colorspace; |
| 1869 | 1875 | ||
| 1870 | ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video, try_mbus_fmt, &mf); | 1876 | ret = v4l2_device_call_until_err(sd->v4l2_dev, soc_camera_grp_id(icd), |
| 1877 | video, try_mbus_fmt, &mf); | ||
| 1871 | if (ret < 0) | 1878 | if (ret < 0) |
| 1872 | return ret; | 1879 | return ret; |
| 1873 | 1880 | ||
| @@ -1891,8 +1898,9 @@ static int sh_mobile_ceu_try_fmt(struct soc_camera_device *icd, | |||
| 1891 | */ | 1898 | */ |
| 1892 | mf.width = 2560; | 1899 | mf.width = 2560; |
| 1893 | mf.height = 1920; | 1900 | mf.height = 1920; |
| 1894 | ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video, | 1901 | ret = v4l2_device_call_until_err(sd->v4l2_dev, |
| 1895 | try_mbus_fmt, &mf); | 1902 | soc_camera_grp_id(icd), video, |
| 1903 | try_mbus_fmt, &mf); | ||
| 1896 | if (ret < 0) { | 1904 | if (ret < 0) { |
| 1897 | /* Shouldn't actually happen... */ | 1905 | /* Shouldn't actually happen... */ |
| 1898 | dev_err(icd->parent, | 1906 | dev_err(icd->parent, |
diff --git a/drivers/media/video/sh_mobile_csi2.c b/drivers/media/video/sh_mobile_csi2.c index ea4f0473ed3..8a652b53ff7 100644 --- a/drivers/media/video/sh_mobile_csi2.c +++ b/drivers/media/video/sh_mobile_csi2.c | |||
| @@ -143,7 +143,7 @@ static int sh_csi2_s_mbus_config(struct v4l2_subdev *sd, | |||
| 143 | const struct v4l2_mbus_config *cfg) | 143 | const struct v4l2_mbus_config *cfg) |
| 144 | { | 144 | { |
| 145 | struct sh_csi2 *priv = container_of(sd, struct sh_csi2, subdev); | 145 | struct sh_csi2 *priv = container_of(sd, struct sh_csi2, subdev); |
| 146 | struct soc_camera_device *icd = (struct soc_camera_device *)sd->grp_id; | 146 | struct soc_camera_device *icd = v4l2_get_subdev_hostdata(sd); |
| 147 | struct v4l2_subdev *client_sd = soc_camera_to_subdev(icd); | 147 | struct v4l2_subdev *client_sd = soc_camera_to_subdev(icd); |
| 148 | struct v4l2_mbus_config client_cfg = {.type = V4L2_MBUS_CSI2, | 148 | struct v4l2_mbus_config client_cfg = {.type = V4L2_MBUS_CSI2, |
| 149 | .flags = priv->mipi_flags}; | 149 | .flags = priv->mipi_flags}; |
| @@ -202,7 +202,7 @@ static void sh_csi2_hwinit(struct sh_csi2 *priv) | |||
| 202 | static int sh_csi2_client_connect(struct sh_csi2 *priv) | 202 | static int sh_csi2_client_connect(struct sh_csi2 *priv) |
| 203 | { | 203 | { |
| 204 | struct sh_csi2_pdata *pdata = priv->pdev->dev.platform_data; | 204 | struct sh_csi2_pdata *pdata = priv->pdev->dev.platform_data; |
| 205 | struct soc_camera_device *icd = (struct soc_camera_device *)priv->subdev.grp_id; | 205 | struct soc_camera_device *icd = v4l2_get_subdev_hostdata(&priv->subdev); |
| 206 | struct v4l2_subdev *client_sd = soc_camera_to_subdev(icd); | 206 | struct v4l2_subdev *client_sd = soc_camera_to_subdev(icd); |
| 207 | struct device *dev = v4l2_get_subdevdata(&priv->subdev); | 207 | struct device *dev = v4l2_get_subdevdata(&priv->subdev); |
| 208 | struct v4l2_mbus_config cfg; | 208 | struct v4l2_mbus_config cfg; |
diff --git a/drivers/media/video/soc_camera.c b/drivers/media/video/soc_camera.c index b72580c3895..62e4312515c 100644 --- a/drivers/media/video/soc_camera.c +++ b/drivers/media/video/soc_camera.c | |||
| @@ -1103,7 +1103,8 @@ static int soc_camera_probe(struct soc_camera_device *icd) | |||
| 1103 | } | 1103 | } |
| 1104 | 1104 | ||
| 1105 | sd = soc_camera_to_subdev(icd); | 1105 | sd = soc_camera_to_subdev(icd); |
| 1106 | sd->grp_id = (long)icd; | 1106 | sd->grp_id = soc_camera_grp_id(icd); |
| 1107 | v4l2_set_subdev_hostdata(sd, icd); | ||
| 1107 | 1108 | ||
| 1108 | if (v4l2_ctrl_add_handler(&icd->ctrl_handler, sd->ctrl_handler)) | 1109 | if (v4l2_ctrl_add_handler(&icd->ctrl_handler, sd->ctrl_handler)) |
| 1109 | goto ectrl; | 1110 | goto ectrl; |
diff --git a/drivers/mfd/ab5500-debugfs.c b/drivers/mfd/ab5500-debugfs.c index 43c0ebb8195..b7b2d3483fd 100644 --- a/drivers/mfd/ab5500-debugfs.c +++ b/drivers/mfd/ab5500-debugfs.c | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | * Debugfs support for the AB5500 MFD driver | 4 | * Debugfs support for the AB5500 MFD driver |
| 5 | */ | 5 | */ |
| 6 | 6 | ||
| 7 | #include <linux/export.h> | 7 | #include <linux/module.h> |
| 8 | #include <linux/debugfs.h> | 8 | #include <linux/debugfs.h> |
| 9 | #include <linux/seq_file.h> | 9 | #include <linux/seq_file.h> |
| 10 | #include <linux/mfd/ab5500/ab5500.h> | 10 | #include <linux/mfd/ab5500/ab5500.h> |
diff --git a/drivers/mfd/ab8500-core.c b/drivers/mfd/ab8500-core.c index 1e9173804ed..d3d572b2317 100644 --- a/drivers/mfd/ab8500-core.c +++ b/drivers/mfd/ab8500-core.c | |||
| @@ -620,6 +620,7 @@ static struct resource __devinitdata ab8500_fg_resources[] = { | |||
| 620 | 620 | ||
| 621 | static struct resource __devinitdata ab8500_chargalg_resources[] = {}; | 621 | static struct resource __devinitdata ab8500_chargalg_resources[] = {}; |
| 622 | 622 | ||
| 623 | #ifdef CONFIG_DEBUG_FS | ||
| 623 | static struct resource __devinitdata ab8500_debug_resources[] = { | 624 | static struct resource __devinitdata ab8500_debug_resources[] = { |
| 624 | { | 625 | { |
| 625 | .name = "IRQ_FIRST", | 626 | .name = "IRQ_FIRST", |
| @@ -634,6 +635,7 @@ static struct resource __devinitdata ab8500_debug_resources[] = { | |||
| 634 | .flags = IORESOURCE_IRQ, | 635 | .flags = IORESOURCE_IRQ, |
| 635 | }, | 636 | }, |
| 636 | }; | 637 | }; |
| 638 | #endif | ||
| 637 | 639 | ||
| 638 | static struct resource __devinitdata ab8500_usb_resources[] = { | 640 | static struct resource __devinitdata ab8500_usb_resources[] = { |
| 639 | { | 641 | { |
diff --git a/drivers/mfd/adp5520.c b/drivers/mfd/adp5520.c index f1d88483112..8d816cce832 100644 --- a/drivers/mfd/adp5520.c +++ b/drivers/mfd/adp5520.c | |||
| @@ -109,7 +109,7 @@ int adp5520_set_bits(struct device *dev, int reg, uint8_t bit_mask) | |||
| 109 | 109 | ||
| 110 | ret = __adp5520_read(chip->client, reg, ®_val); | 110 | ret = __adp5520_read(chip->client, reg, ®_val); |
| 111 | 111 | ||
| 112 | if (!ret && ((reg_val & bit_mask) == 0)) { | 112 | if (!ret && ((reg_val & bit_mask) != bit_mask)) { |
| 113 | reg_val |= bit_mask; | 113 | reg_val |= bit_mask; |
| 114 | ret = __adp5520_write(chip->client, reg, reg_val); | 114 | ret = __adp5520_write(chip->client, reg, reg_val); |
| 115 | } | 115 | } |
diff --git a/drivers/mfd/da903x.c b/drivers/mfd/da903x.c index 1b79c37fd59..1924b857a0f 100644 --- a/drivers/mfd/da903x.c +++ b/drivers/mfd/da903x.c | |||
| @@ -182,7 +182,7 @@ int da903x_set_bits(struct device *dev, int reg, uint8_t bit_mask) | |||
| 182 | if (ret) | 182 | if (ret) |
| 183 | goto out; | 183 | goto out; |
| 184 | 184 | ||
| 185 | if ((reg_val & bit_mask) == 0) { | 185 | if ((reg_val & bit_mask) != bit_mask) { |
| 186 | reg_val |= bit_mask; | 186 | reg_val |= bit_mask; |
| 187 | ret = __da903x_write(chip->client, reg, reg_val); | 187 | ret = __da903x_write(chip->client, reg, reg_val); |
| 188 | } | 188 | } |
| @@ -549,6 +549,7 @@ static int __devexit da903x_remove(struct i2c_client *client) | |||
| 549 | struct da903x_chip *chip = i2c_get_clientdata(client); | 549 | struct da903x_chip *chip = i2c_get_clientdata(client); |
| 550 | 550 | ||
| 551 | da903x_remove_subdevs(chip); | 551 | da903x_remove_subdevs(chip); |
| 552 | free_irq(client->irq, chip); | ||
| 552 | kfree(chip); | 553 | kfree(chip); |
| 553 | return 0; | 554 | return 0; |
| 554 | } | 555 | } |
diff --git a/drivers/mfd/jz4740-adc.c b/drivers/mfd/jz4740-adc.c index 1e9ee533eac..ef39528088f 100644 --- a/drivers/mfd/jz4740-adc.c +++ b/drivers/mfd/jz4740-adc.c | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | */ | 16 | */ |
| 17 | 17 | ||
| 18 | #include <linux/err.h> | 18 | #include <linux/err.h> |
| 19 | #include <linux/io.h> | ||
| 19 | #include <linux/irq.h> | 20 | #include <linux/irq.h> |
| 20 | #include <linux/interrupt.h> | 21 | #include <linux/interrupt.h> |
| 21 | #include <linux/kernel.h> | 22 | #include <linux/kernel.h> |
diff --git a/drivers/mfd/tps6586x.c b/drivers/mfd/tps6586x.c index bba26d96c24..a5ddf31b60c 100644 --- a/drivers/mfd/tps6586x.c +++ b/drivers/mfd/tps6586x.c | |||
| @@ -197,7 +197,7 @@ int tps6586x_set_bits(struct device *dev, int reg, uint8_t bit_mask) | |||
| 197 | if (ret) | 197 | if (ret) |
| 198 | goto out; | 198 | goto out; |
| 199 | 199 | ||
| 200 | if ((reg_val & bit_mask) == 0) { | 200 | if ((reg_val & bit_mask) != bit_mask) { |
| 201 | reg_val |= bit_mask; | 201 | reg_val |= bit_mask; |
| 202 | ret = __tps6586x_write(to_i2c_client(dev), reg, reg_val); | 202 | ret = __tps6586x_write(to_i2c_client(dev), reg, reg_val); |
| 203 | } | 203 | } |
diff --git a/drivers/mfd/tps65910.c b/drivers/mfd/tps65910.c index 6f5b8cf2f65..c1da84bc157 100644 --- a/drivers/mfd/tps65910.c +++ b/drivers/mfd/tps65910.c | |||
| @@ -120,7 +120,7 @@ int tps65910_clear_bits(struct tps65910 *tps65910, u8 reg, u8 mask) | |||
| 120 | goto out; | 120 | goto out; |
| 121 | } | 121 | } |
| 122 | 122 | ||
| 123 | data &= mask; | 123 | data &= ~mask; |
| 124 | err = tps65910_i2c_write(tps65910, reg, 1, &data); | 124 | err = tps65910_i2c_write(tps65910, reg, 1, &data); |
| 125 | if (err) | 125 | if (err) |
| 126 | dev_err(tps65910->dev, "write to reg %x failed\n", reg); | 126 | dev_err(tps65910->dev, "write to reg %x failed\n", reg); |
diff --git a/drivers/mfd/twl-core.c b/drivers/mfd/twl-core.c index bfbd66021af..61e70cfaa77 100644 --- a/drivers/mfd/twl-core.c +++ b/drivers/mfd/twl-core.c | |||
| @@ -363,13 +363,13 @@ int twl_i2c_write(u8 mod_no, u8 *value, u8 reg, unsigned num_bytes) | |||
| 363 | pr_err("%s: invalid module number %d\n", DRIVER_NAME, mod_no); | 363 | pr_err("%s: invalid module number %d\n", DRIVER_NAME, mod_no); |
| 364 | return -EPERM; | 364 | return -EPERM; |
| 365 | } | 365 | } |
| 366 | sid = twl_map[mod_no].sid; | ||
| 367 | twl = &twl_modules[sid]; | ||
| 368 | |||
| 369 | if (unlikely(!inuse)) { | 366 | if (unlikely(!inuse)) { |
| 370 | pr_err("%s: client %d is not initialized\n", DRIVER_NAME, sid); | 367 | pr_err("%s: not initialized\n", DRIVER_NAME); |
| 371 | return -EPERM; | 368 | return -EPERM; |
| 372 | } | 369 | } |
| 370 | sid = twl_map[mod_no].sid; | ||
| 371 | twl = &twl_modules[sid]; | ||
| 372 | |||
| 373 | mutex_lock(&twl->xfer_lock); | 373 | mutex_lock(&twl->xfer_lock); |
| 374 | /* | 374 | /* |
| 375 | * [MSG1]: fill the register address data | 375 | * [MSG1]: fill the register address data |
| @@ -420,13 +420,13 @@ int twl_i2c_read(u8 mod_no, u8 *value, u8 reg, unsigned num_bytes) | |||
| 420 | pr_err("%s: invalid module number %d\n", DRIVER_NAME, mod_no); | 420 | pr_err("%s: invalid module number %d\n", DRIVER_NAME, mod_no); |
| 421 | return -EPERM; | 421 | return -EPERM; |
| 422 | } | 422 | } |
| 423 | sid = twl_map[mod_no].sid; | ||
| 424 | twl = &twl_modules[sid]; | ||
| 425 | |||
| 426 | if (unlikely(!inuse)) { | 423 | if (unlikely(!inuse)) { |
| 427 | pr_err("%s: client %d is not initialized\n", DRIVER_NAME, sid); | 424 | pr_err("%s: not initialized\n", DRIVER_NAME); |
| 428 | return -EPERM; | 425 | return -EPERM; |
| 429 | } | 426 | } |
| 427 | sid = twl_map[mod_no].sid; | ||
| 428 | twl = &twl_modules[sid]; | ||
| 429 | |||
| 430 | mutex_lock(&twl->xfer_lock); | 430 | mutex_lock(&twl->xfer_lock); |
| 431 | /* [MSG1] fill the register address data */ | 431 | /* [MSG1] fill the register address data */ |
| 432 | msg = &twl->xfer_msg[0]; | 432 | msg = &twl->xfer_msg[0]; |
diff --git a/drivers/mfd/twl4030-irq.c b/drivers/mfd/twl4030-irq.c index f062c8cc6c3..29f11e0765f 100644 --- a/drivers/mfd/twl4030-irq.c +++ b/drivers/mfd/twl4030-irq.c | |||
| @@ -432,6 +432,7 @@ struct sih_agent { | |||
| 432 | u32 edge_change; | 432 | u32 edge_change; |
| 433 | 433 | ||
| 434 | struct mutex irq_lock; | 434 | struct mutex irq_lock; |
| 435 | char *irq_name; | ||
| 435 | }; | 436 | }; |
| 436 | 437 | ||
| 437 | /*----------------------------------------------------------------------*/ | 438 | /*----------------------------------------------------------------------*/ |
| @@ -589,7 +590,7 @@ static inline int sih_read_isr(const struct sih *sih) | |||
| 589 | * Generic handler for SIH interrupts ... we "know" this is called | 590 | * Generic handler for SIH interrupts ... we "know" this is called |
| 590 | * in task context, with IRQs enabled. | 591 | * in task context, with IRQs enabled. |
| 591 | */ | 592 | */ |
| 592 | static void handle_twl4030_sih(unsigned irq, struct irq_desc *desc) | 593 | static irqreturn_t handle_twl4030_sih(int irq, void *data) |
| 593 | { | 594 | { |
| 594 | struct sih_agent *agent = irq_get_handler_data(irq); | 595 | struct sih_agent *agent = irq_get_handler_data(irq); |
| 595 | const struct sih *sih = agent->sih; | 596 | const struct sih *sih = agent->sih; |
| @@ -602,7 +603,7 @@ static void handle_twl4030_sih(unsigned irq, struct irq_desc *desc) | |||
| 602 | pr_err("twl4030: %s SIH, read ISR error %d\n", | 603 | pr_err("twl4030: %s SIH, read ISR error %d\n", |
| 603 | sih->name, isr); | 604 | sih->name, isr); |
| 604 | /* REVISIT: recover; eventually mask it all, etc */ | 605 | /* REVISIT: recover; eventually mask it all, etc */ |
| 605 | return; | 606 | return IRQ_HANDLED; |
| 606 | } | 607 | } |
| 607 | 608 | ||
| 608 | while (isr) { | 609 | while (isr) { |
| @@ -616,6 +617,7 @@ static void handle_twl4030_sih(unsigned irq, struct irq_desc *desc) | |||
| 616 | pr_err("twl4030: %s SIH, invalid ISR bit %d\n", | 617 | pr_err("twl4030: %s SIH, invalid ISR bit %d\n", |
| 617 | sih->name, irq); | 618 | sih->name, irq); |
| 618 | } | 619 | } |
| 620 | return IRQ_HANDLED; | ||
| 619 | } | 621 | } |
| 620 | 622 | ||
| 621 | static unsigned twl4030_irq_next; | 623 | static unsigned twl4030_irq_next; |
| @@ -668,18 +670,19 @@ int twl4030_sih_setup(int module) | |||
| 668 | activate_irq(irq); | 670 | activate_irq(irq); |
| 669 | } | 671 | } |
| 670 | 672 | ||
| 671 | status = irq_base; | ||
| 672 | twl4030_irq_next += i; | 673 | twl4030_irq_next += i; |
| 673 | 674 | ||
| 674 | /* replace generic PIH handler (handle_simple_irq) */ | 675 | /* replace generic PIH handler (handle_simple_irq) */ |
| 675 | irq = sih_mod + twl4030_irq_base; | 676 | irq = sih_mod + twl4030_irq_base; |
| 676 | irq_set_handler_data(irq, agent); | 677 | irq_set_handler_data(irq, agent); |
| 677 | irq_set_chained_handler(irq, handle_twl4030_sih); | 678 | agent->irq_name = kasprintf(GFP_KERNEL, "twl4030_%s", sih->name); |
| 679 | status = request_threaded_irq(irq, NULL, handle_twl4030_sih, 0, | ||
| 680 | agent->irq_name ?: sih->name, NULL); | ||
| 678 | 681 | ||
| 679 | pr_info("twl4030: %s (irq %d) chaining IRQs %d..%d\n", sih->name, | 682 | pr_info("twl4030: %s (irq %d) chaining IRQs %d..%d\n", sih->name, |
| 680 | irq, irq_base, twl4030_irq_next - 1); | 683 | irq, irq_base, twl4030_irq_next - 1); |
| 681 | 684 | ||
| 682 | return status; | 685 | return status < 0 ? status : irq_base; |
| 683 | } | 686 | } |
| 684 | 687 | ||
| 685 | /* FIXME need a call to reverse twl4030_sih_setup() ... */ | 688 | /* FIXME need a call to reverse twl4030_sih_setup() ... */ |
| @@ -733,8 +736,9 @@ int twl4030_init_irq(int irq_num, unsigned irq_base, unsigned irq_end) | |||
| 733 | } | 736 | } |
| 734 | 737 | ||
| 735 | /* install an irq handler to demultiplex the TWL4030 interrupt */ | 738 | /* install an irq handler to demultiplex the TWL4030 interrupt */ |
| 736 | status = request_threaded_irq(irq_num, NULL, handle_twl4030_pih, 0, | 739 | status = request_threaded_irq(irq_num, NULL, handle_twl4030_pih, |
| 737 | "TWL4030-PIH", NULL); | 740 | IRQF_ONESHOT, |
| 741 | "TWL4030-PIH", NULL); | ||
| 738 | if (status < 0) { | 742 | if (status < 0) { |
| 739 | pr_err("twl4030: could not claim irq%d: %d\n", irq_num, status); | 743 | pr_err("twl4030: could not claim irq%d: %d\n", irq_num, status); |
| 740 | goto fail_rqirq; | 744 | goto fail_rqirq; |
diff --git a/drivers/mfd/wm8994-core.c b/drivers/mfd/wm8994-core.c index 5d6ba132837..61894fced8e 100644 --- a/drivers/mfd/wm8994-core.c +++ b/drivers/mfd/wm8994-core.c | |||
| @@ -239,6 +239,7 @@ static int wm8994_suspend(struct device *dev) | |||
| 239 | 239 | ||
| 240 | switch (wm8994->type) { | 240 | switch (wm8994->type) { |
| 241 | case WM8958: | 241 | case WM8958: |
| 242 | case WM1811: | ||
| 242 | ret = wm8994_reg_read(wm8994, WM8958_MIC_DETECT_1); | 243 | ret = wm8994_reg_read(wm8994, WM8958_MIC_DETECT_1); |
| 243 | if (ret < 0) { | 244 | if (ret < 0) { |
| 244 | dev_err(dev, "Failed to read power status: %d\n", ret); | 245 | dev_err(dev, "Failed to read power status: %d\n", ret); |
diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index a1cb21f9530..1e0e27cbe98 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c | |||
| @@ -1606,6 +1606,14 @@ static const struct mmc_fixup blk_fixups[] = | |||
| 1606 | MMC_QUIRK_BLK_NO_CMD23), | 1606 | MMC_QUIRK_BLK_NO_CMD23), |
| 1607 | MMC_FIXUP("MMC32G", 0x11, CID_OEMID_ANY, add_quirk_mmc, | 1607 | MMC_FIXUP("MMC32G", 0x11, CID_OEMID_ANY, add_quirk_mmc, |
| 1608 | MMC_QUIRK_BLK_NO_CMD23), | 1608 | MMC_QUIRK_BLK_NO_CMD23), |
| 1609 | |||
| 1610 | /* | ||
| 1611 | * Some Micron MMC cards needs longer data read timeout than | ||
| 1612 | * indicated in CSD. | ||
| 1613 | */ | ||
| 1614 | MMC_FIXUP(CID_NAME_ANY, 0x13, 0x200, add_quirk_mmc, | ||
| 1615 | MMC_QUIRK_LONG_READ_TIME), | ||
| 1616 | |||
| 1609 | END_FIXUP | 1617 | END_FIXUP |
| 1610 | }; | 1618 | }; |
| 1611 | 1619 | ||
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index 5278ffb20e7..950b97d7412 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c | |||
| @@ -529,6 +529,18 @@ void mmc_set_data_timeout(struct mmc_data *data, const struct mmc_card *card) | |||
| 529 | data->timeout_clks = 0; | 529 | data->timeout_clks = 0; |
| 530 | } | 530 | } |
| 531 | } | 531 | } |
| 532 | |||
| 533 | /* | ||
| 534 | * Some cards require longer data read timeout than indicated in CSD. | ||
| 535 | * Address this by setting the read timeout to a "reasonably high" | ||
| 536 | * value. For the cards tested, 300ms has proven enough. If necessary, | ||
| 537 | * this value can be increased if other problematic cards require this. | ||
| 538 | */ | ||
| 539 | if (mmc_card_long_read_time(card) && data->flags & MMC_DATA_READ) { | ||
| 540 | data->timeout_ns = 300000000; | ||
| 541 | data->timeout_clks = 0; | ||
| 542 | } | ||
| 543 | |||
| 532 | /* | 544 | /* |
| 533 | * Some cards need very high timeouts if driven in SPI mode. | 545 | * Some cards need very high timeouts if driven in SPI mode. |
| 534 | * The worst observed timeout was 900ms after writing a | 546 | * The worst observed timeout was 900ms after writing a |
| @@ -1213,6 +1225,46 @@ void mmc_set_driver_type(struct mmc_host *host, unsigned int drv_type) | |||
| 1213 | mmc_host_clk_release(host); | 1225 | mmc_host_clk_release(host); |
| 1214 | } | 1226 | } |
| 1215 | 1227 | ||
| 1228 | static void mmc_poweroff_notify(struct mmc_host *host) | ||
| 1229 | { | ||
| 1230 | struct mmc_card *card; | ||
| 1231 | unsigned int timeout; | ||
| 1232 | unsigned int notify_type = EXT_CSD_NO_POWER_NOTIFICATION; | ||
| 1233 | int err = 0; | ||
| 1234 | |||
| 1235 | card = host->card; | ||
| 1236 | |||
| 1237 | /* | ||
| 1238 | * Send power notify command only if card | ||
| 1239 | * is mmc and notify state is powered ON | ||
| 1240 | */ | ||
| 1241 | if (card && mmc_card_mmc(card) && | ||
| 1242 | (card->poweroff_notify_state == MMC_POWERED_ON)) { | ||
| 1243 | |||
| 1244 | if (host->power_notify_type == MMC_HOST_PW_NOTIFY_SHORT) { | ||
| 1245 | notify_type = EXT_CSD_POWER_OFF_SHORT; | ||
| 1246 | timeout = card->ext_csd.generic_cmd6_time; | ||
| 1247 | card->poweroff_notify_state = MMC_POWEROFF_SHORT; | ||
| 1248 | } else { | ||
| 1249 | notify_type = EXT_CSD_POWER_OFF_LONG; | ||
| 1250 | timeout = card->ext_csd.power_off_longtime; | ||
| 1251 | card->poweroff_notify_state = MMC_POWEROFF_LONG; | ||
| 1252 | } | ||
| 1253 | |||
| 1254 | err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, | ||
| 1255 | EXT_CSD_POWER_OFF_NOTIFICATION, | ||
| 1256 | notify_type, timeout); | ||
| 1257 | |||
| 1258 | if (err && err != -EBADMSG) | ||
| 1259 | pr_err("Device failed to respond within %d poweroff " | ||
| 1260 | "time. Forcefully powering down the device\n", | ||
| 1261 | timeout); | ||
| 1262 | |||
| 1263 | /* Set the card state to no notification after the poweroff */ | ||
| 1264 | card->poweroff_notify_state = MMC_NO_POWER_NOTIFICATION; | ||
| 1265 | } | ||
| 1266 | } | ||
| 1267 | |||
| 1216 | /* | 1268 | /* |
| 1217 | * Apply power to the MMC stack. This is a two-stage process. | 1269 | * Apply power to the MMC stack. This is a two-stage process. |
| 1218 | * First, we enable power to the card without the clock running. | 1270 | * First, we enable power to the card without the clock running. |
| @@ -1269,42 +1321,12 @@ static void mmc_power_up(struct mmc_host *host) | |||
| 1269 | 1321 | ||
| 1270 | void mmc_power_off(struct mmc_host *host) | 1322 | void mmc_power_off(struct mmc_host *host) |
| 1271 | { | 1323 | { |
| 1272 | struct mmc_card *card; | ||
| 1273 | unsigned int notify_type; | ||
| 1274 | unsigned int timeout; | ||
| 1275 | int err; | ||
| 1276 | |||
| 1277 | mmc_host_clk_hold(host); | 1324 | mmc_host_clk_hold(host); |
| 1278 | 1325 | ||
| 1279 | card = host->card; | ||
| 1280 | host->ios.clock = 0; | 1326 | host->ios.clock = 0; |
| 1281 | host->ios.vdd = 0; | 1327 | host->ios.vdd = 0; |
| 1282 | 1328 | ||
| 1283 | if (card && mmc_card_mmc(card) && | 1329 | mmc_poweroff_notify(host); |
| 1284 | (card->poweroff_notify_state == MMC_POWERED_ON)) { | ||
| 1285 | |||
| 1286 | if (host->power_notify_type == MMC_HOST_PW_NOTIFY_SHORT) { | ||
| 1287 | notify_type = EXT_CSD_POWER_OFF_SHORT; | ||
| 1288 | timeout = card->ext_csd.generic_cmd6_time; | ||
| 1289 | card->poweroff_notify_state = MMC_POWEROFF_SHORT; | ||
| 1290 | } else { | ||
| 1291 | notify_type = EXT_CSD_POWER_OFF_LONG; | ||
| 1292 | timeout = card->ext_csd.power_off_longtime; | ||
| 1293 | card->poweroff_notify_state = MMC_POWEROFF_LONG; | ||
| 1294 | } | ||
| 1295 | |||
| 1296 | err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, | ||
| 1297 | EXT_CSD_POWER_OFF_NOTIFICATION, | ||
| 1298 | notify_type, timeout); | ||
| 1299 | |||
| 1300 | if (err && err != -EBADMSG) | ||
| 1301 | pr_err("Device failed to respond within %d poweroff " | ||
| 1302 | "time. Forcefully powering down the device\n", | ||
| 1303 | timeout); | ||
| 1304 | |||
| 1305 | /* Set the card state to no notification after the poweroff */ | ||
| 1306 | card->poweroff_notify_state = MMC_NO_POWER_NOTIFICATION; | ||
| 1307 | } | ||
| 1308 | 1330 | ||
| 1309 | /* | 1331 | /* |
| 1310 | * Reset ocr mask to be the highest possible voltage supported for | 1332 | * Reset ocr mask to be the highest possible voltage supported for |
| @@ -2196,7 +2218,7 @@ int mmc_card_sleep(struct mmc_host *host) | |||
| 2196 | 2218 | ||
| 2197 | mmc_bus_get(host); | 2219 | mmc_bus_get(host); |
| 2198 | 2220 | ||
| 2199 | if (host->bus_ops && !host->bus_dead && host->bus_ops->awake) | 2221 | if (host->bus_ops && !host->bus_dead && host->bus_ops->sleep) |
| 2200 | err = host->bus_ops->sleep(host); | 2222 | err = host->bus_ops->sleep(host); |
| 2201 | 2223 | ||
| 2202 | mmc_bus_put(host); | 2224 | mmc_bus_put(host); |
| @@ -2302,8 +2324,17 @@ int mmc_suspend_host(struct mmc_host *host) | |||
| 2302 | * pre-claim the host. | 2324 | * pre-claim the host. |
| 2303 | */ | 2325 | */ |
| 2304 | if (mmc_try_claim_host(host)) { | 2326 | if (mmc_try_claim_host(host)) { |
| 2305 | if (host->bus_ops->suspend) | 2327 | if (host->bus_ops->suspend) { |
| 2328 | /* | ||
| 2329 | * For eMMC 4.5 device send notify command | ||
| 2330 | * before sleep, because in sleep state eMMC 4.5 | ||
| 2331 | * devices respond to only RESET and AWAKE cmd | ||
| 2332 | */ | ||
| 2333 | mmc_poweroff_notify(host); | ||
| 2306 | err = host->bus_ops->suspend(host); | 2334 | err = host->bus_ops->suspend(host); |
| 2335 | } | ||
| 2336 | mmc_do_release_host(host); | ||
| 2337 | |||
| 2307 | if (err == -ENOSYS || !host->bus_ops->resume) { | 2338 | if (err == -ENOSYS || !host->bus_ops->resume) { |
| 2308 | /* | 2339 | /* |
| 2309 | * We simply "remove" the card in this case. | 2340 | * We simply "remove" the card in this case. |
| @@ -2318,7 +2349,6 @@ int mmc_suspend_host(struct mmc_host *host) | |||
| 2318 | host->pm_flags = 0; | 2349 | host->pm_flags = 0; |
| 2319 | err = 0; | 2350 | err = 0; |
| 2320 | } | 2351 | } |
| 2321 | mmc_do_release_host(host); | ||
| 2322 | } else { | 2352 | } else { |
| 2323 | err = -EBUSY; | 2353 | err = -EBUSY; |
| 2324 | } | 2354 | } |
diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c index e8a5eb38748..d31c78b72b0 100644 --- a/drivers/mmc/core/host.c +++ b/drivers/mmc/core/host.c | |||
| @@ -302,17 +302,6 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *dev) | |||
| 302 | host->max_blk_size = 512; | 302 | host->max_blk_size = 512; |
| 303 | host->max_blk_count = PAGE_CACHE_SIZE / 512; | 303 | host->max_blk_count = PAGE_CACHE_SIZE / 512; |
| 304 | 304 | ||
| 305 | /* | ||
| 306 | * Enable runtime power management by default. This flag was added due | ||
| 307 | * to runtime power management causing disruption for some users, but | ||
| 308 | * the power on/off code has been improved since then. | ||
| 309 | * | ||
| 310 | * We'll enable this flag by default as an experiment, and if no | ||
| 311 | * problems are reported, we will follow up later and remove the flag | ||
| 312 | * altogether. | ||
| 313 | */ | ||
| 314 | host->caps = MMC_CAP_POWER_OFF_CARD; | ||
| 315 | |||
| 316 | return host; | 305 | return host; |
| 317 | 306 | ||
| 318 | free: | 307 | free: |
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index dbf421a6279..d240427c124 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c | |||
| @@ -876,17 +876,21 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, | |||
| 876 | * set the notification byte in the ext_csd register of device | 876 | * set the notification byte in the ext_csd register of device |
| 877 | */ | 877 | */ |
| 878 | if ((host->caps2 & MMC_CAP2_POWEROFF_NOTIFY) && | 878 | if ((host->caps2 & MMC_CAP2_POWEROFF_NOTIFY) && |
| 879 | (card->poweroff_notify_state == MMC_NO_POWER_NOTIFICATION)) { | 879 | (card->ext_csd.rev >= 6)) { |
| 880 | err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, | 880 | err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, |
| 881 | EXT_CSD_POWER_OFF_NOTIFICATION, | 881 | EXT_CSD_POWER_OFF_NOTIFICATION, |
| 882 | EXT_CSD_POWER_ON, | 882 | EXT_CSD_POWER_ON, |
| 883 | card->ext_csd.generic_cmd6_time); | 883 | card->ext_csd.generic_cmd6_time); |
| 884 | if (err && err != -EBADMSG) | 884 | if (err && err != -EBADMSG) |
| 885 | goto free_card; | 885 | goto free_card; |
| 886 | } | ||
| 887 | 886 | ||
| 888 | if (!err) | 887 | /* |
| 889 | card->poweroff_notify_state = MMC_POWERED_ON; | 888 | * The err can be -EBADMSG or 0, |
| 889 | * so check for success and update the flag | ||
| 890 | */ | ||
| 891 | if (!err) | ||
| 892 | card->poweroff_notify_state = MMC_POWERED_ON; | ||
| 893 | } | ||
| 890 | 894 | ||
| 891 | /* | 895 | /* |
| 892 | * Activate high speed (if supported) | 896 | * Activate high speed (if supported) |
diff --git a/drivers/mmc/host/mxcmmc.c b/drivers/mmc/host/mxcmmc.c index 325ea61e12d..8e0fbe99404 100644 --- a/drivers/mmc/host/mxcmmc.c +++ b/drivers/mmc/host/mxcmmc.c | |||
| @@ -732,6 +732,7 @@ static void mxcmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) | |||
| 732 | "failed to config DMA channel. Falling back to PIO\n"); | 732 | "failed to config DMA channel. Falling back to PIO\n"); |
| 733 | dma_release_channel(host->dma); | 733 | dma_release_channel(host->dma); |
| 734 | host->do_dma = 0; | 734 | host->do_dma = 0; |
| 735 | host->dma = NULL; | ||
| 735 | } | 736 | } |
| 736 | } | 737 | } |
| 737 | 738 | ||
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c index 101cd31c822..d5fe43d53c5 100644 --- a/drivers/mmc/host/omap_hsmmc.c +++ b/drivers/mmc/host/omap_hsmmc.c | |||
| @@ -1010,6 +1010,7 @@ static void omap_hsmmc_dma_cleanup(struct omap_hsmmc_host *host, int errno) | |||
| 1010 | host->data->sg_len, | 1010 | host->data->sg_len, |
| 1011 | omap_hsmmc_get_dma_dir(host, host->data)); | 1011 | omap_hsmmc_get_dma_dir(host, host->data)); |
| 1012 | omap_free_dma(dma_ch); | 1012 | omap_free_dma(dma_ch); |
| 1013 | host->data->host_cookie = 0; | ||
| 1013 | } | 1014 | } |
| 1014 | host->data = NULL; | 1015 | host->data = NULL; |
| 1015 | } | 1016 | } |
| @@ -1575,8 +1576,10 @@ static void omap_hsmmc_post_req(struct mmc_host *mmc, struct mmc_request *mrq, | |||
| 1575 | struct mmc_data *data = mrq->data; | 1576 | struct mmc_data *data = mrq->data; |
| 1576 | 1577 | ||
| 1577 | if (host->use_dma) { | 1578 | if (host->use_dma) { |
| 1578 | dma_unmap_sg(mmc_dev(host->mmc), data->sg, data->sg_len, | 1579 | if (data->host_cookie) |
| 1579 | omap_hsmmc_get_dma_dir(host, data)); | 1580 | dma_unmap_sg(mmc_dev(host->mmc), data->sg, |
| 1581 | data->sg_len, | ||
| 1582 | omap_hsmmc_get_dma_dir(host, data)); | ||
| 1580 | data->host_cookie = 0; | 1583 | data->host_cookie = 0; |
| 1581 | } | 1584 | } |
| 1582 | } | 1585 | } |
diff --git a/drivers/mmc/host/sdhci-cns3xxx.c b/drivers/mmc/host/sdhci-cns3xxx.c index 4b920b7621c..b4257e70061 100644 --- a/drivers/mmc/host/sdhci-cns3xxx.c +++ b/drivers/mmc/host/sdhci-cns3xxx.c | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | #include <linux/delay.h> | 15 | #include <linux/delay.h> |
| 16 | #include <linux/device.h> | 16 | #include <linux/device.h> |
| 17 | #include <linux/mmc/host.h> | 17 | #include <linux/mmc/host.h> |
| 18 | #include <linux/module.h> | ||
| 18 | #include <mach/cns3xxx.h> | 19 | #include <mach/cns3xxx.h> |
| 19 | #include "sdhci-pltfm.h" | 20 | #include "sdhci-pltfm.h" |
| 20 | 21 | ||
| @@ -108,13 +109,10 @@ static struct platform_driver sdhci_cns3xxx_driver = { | |||
| 108 | .driver = { | 109 | .driver = { |
| 109 | .name = "sdhci-cns3xxx", | 110 | .name = "sdhci-cns3xxx", |
| 110 | .owner = THIS_MODULE, | 111 | .owner = THIS_MODULE, |
| 112 | .pm = SDHCI_PLTFM_PMOPS, | ||
| 111 | }, | 113 | }, |
| 112 | .probe = sdhci_cns3xxx_probe, | 114 | .probe = sdhci_cns3xxx_probe, |
| 113 | .remove = __devexit_p(sdhci_cns3xxx_remove), | 115 | .remove = __devexit_p(sdhci_cns3xxx_remove), |
| 114 | #ifdef CONFIG_PM | ||
| 115 | .suspend = sdhci_pltfm_suspend, | ||
| 116 | .resume = sdhci_pltfm_resume, | ||
| 117 | #endif | ||
| 118 | }; | 116 | }; |
| 119 | 117 | ||
| 120 | static int __init sdhci_cns3xxx_init(void) | 118 | static int __init sdhci_cns3xxx_init(void) |
diff --git a/drivers/mmc/host/sdhci-dove.c b/drivers/mmc/host/sdhci-dove.c index f2d29dca442..a81312c91f7 100644 --- a/drivers/mmc/host/sdhci-dove.c +++ b/drivers/mmc/host/sdhci-dove.c | |||
| @@ -82,13 +82,10 @@ static struct platform_driver sdhci_dove_driver = { | |||
| 82 | .driver = { | 82 | .driver = { |
| 83 | .name = "sdhci-dove", | 83 | .name = "sdhci-dove", |
| 84 | .owner = THIS_MODULE, | 84 | .owner = THIS_MODULE, |
| 85 | .pm = SDHCI_PLTFM_PMOPS, | ||
| 85 | }, | 86 | }, |
| 86 | .probe = sdhci_dove_probe, | 87 | .probe = sdhci_dove_probe, |
| 87 | .remove = __devexit_p(sdhci_dove_remove), | 88 | .remove = __devexit_p(sdhci_dove_remove), |
| 88 | #ifdef CONFIG_PM | ||
| 89 | .suspend = sdhci_pltfm_suspend, | ||
| 90 | .resume = sdhci_pltfm_resume, | ||
| 91 | #endif | ||
| 92 | }; | 89 | }; |
| 93 | 90 | ||
| 94 | static int __init sdhci_dove_init(void) | 91 | static int __init sdhci_dove_init(void) |
diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c index 4b976f00ea8..38ebc4ea259 100644 --- a/drivers/mmc/host/sdhci-esdhc-imx.c +++ b/drivers/mmc/host/sdhci-esdhc-imx.c | |||
| @@ -599,14 +599,11 @@ static struct platform_driver sdhci_esdhc_imx_driver = { | |||
| 599 | .name = "sdhci-esdhc-imx", | 599 | .name = "sdhci-esdhc-imx", |
| 600 | .owner = THIS_MODULE, | 600 | .owner = THIS_MODULE, |
| 601 | .of_match_table = imx_esdhc_dt_ids, | 601 | .of_match_table = imx_esdhc_dt_ids, |
| 602 | .pm = SDHCI_PLTFM_PMOPS, | ||
| 602 | }, | 603 | }, |
| 603 | .id_table = imx_esdhc_devtype, | 604 | .id_table = imx_esdhc_devtype, |
| 604 | .probe = sdhci_esdhc_imx_probe, | 605 | .probe = sdhci_esdhc_imx_probe, |
| 605 | .remove = __devexit_p(sdhci_esdhc_imx_remove), | 606 | .remove = __devexit_p(sdhci_esdhc_imx_remove), |
| 606 | #ifdef CONFIG_PM | ||
| 607 | .suspend = sdhci_pltfm_suspend, | ||
| 608 | .resume = sdhci_pltfm_resume, | ||
| 609 | #endif | ||
| 610 | }; | 607 | }; |
| 611 | 608 | ||
| 612 | static int __init sdhci_esdhc_imx_init(void) | 609 | static int __init sdhci_esdhc_imx_init(void) |
diff --git a/drivers/mmc/host/sdhci-of-esdhc.c b/drivers/mmc/host/sdhci-of-esdhc.c index 59e9d003e58..01e5f627e0f 100644 --- a/drivers/mmc/host/sdhci-of-esdhc.c +++ b/drivers/mmc/host/sdhci-of-esdhc.c | |||
| @@ -125,13 +125,10 @@ static struct platform_driver sdhci_esdhc_driver = { | |||
| 125 | .name = "sdhci-esdhc", | 125 | .name = "sdhci-esdhc", |
| 126 | .owner = THIS_MODULE, | 126 | .owner = THIS_MODULE, |
| 127 | .of_match_table = sdhci_esdhc_of_match, | 127 | .of_match_table = sdhci_esdhc_of_match, |
| 128 | .pm = SDHCI_PLTFM_PMOPS, | ||
| 128 | }, | 129 | }, |
| 129 | .probe = sdhci_esdhc_probe, | 130 | .probe = sdhci_esdhc_probe, |
| 130 | .remove = __devexit_p(sdhci_esdhc_remove), | 131 | .remove = __devexit_p(sdhci_esdhc_remove), |
| 131 | #ifdef CONFIG_PM | ||
| 132 | .suspend = sdhci_pltfm_suspend, | ||
| 133 | .resume = sdhci_pltfm_resume, | ||
| 134 | #endif | ||
| 135 | }; | 132 | }; |
| 136 | 133 | ||
| 137 | static int __init sdhci_esdhc_init(void) | 134 | static int __init sdhci_esdhc_init(void) |
diff --git a/drivers/mmc/host/sdhci-of-hlwd.c b/drivers/mmc/host/sdhci-of-hlwd.c index 9b0d794a4f6..3619adc7d9f 100644 --- a/drivers/mmc/host/sdhci-of-hlwd.c +++ b/drivers/mmc/host/sdhci-of-hlwd.c | |||
| @@ -87,13 +87,10 @@ static struct platform_driver sdhci_hlwd_driver = { | |||
| 87 | .name = "sdhci-hlwd", | 87 | .name = "sdhci-hlwd", |
| 88 | .owner = THIS_MODULE, | 88 | .owner = THIS_MODULE, |
| 89 | .of_match_table = sdhci_hlwd_of_match, | 89 | .of_match_table = sdhci_hlwd_of_match, |
| 90 | .pm = SDHCI_PLTFM_PMOPS, | ||
| 90 | }, | 91 | }, |
| 91 | .probe = sdhci_hlwd_probe, | 92 | .probe = sdhci_hlwd_probe, |
| 92 | .remove = __devexit_p(sdhci_hlwd_remove), | 93 | .remove = __devexit_p(sdhci_hlwd_remove), |
| 93 | #ifdef CONFIG_PM | ||
| 94 | .suspend = sdhci_pltfm_suspend, | ||
| 95 | .resume = sdhci_pltfm_resume, | ||
| 96 | #endif | ||
| 97 | }; | 94 | }; |
| 98 | 95 | ||
| 99 | static int __init sdhci_hlwd_init(void) | 96 | static int __init sdhci_hlwd_init(void) |
diff --git a/drivers/mmc/host/sdhci-pci.c b/drivers/mmc/host/sdhci-pci.c index d833d9c2f7e..6878a94626b 100644 --- a/drivers/mmc/host/sdhci-pci.c +++ b/drivers/mmc/host/sdhci-pci.c | |||
| @@ -54,8 +54,7 @@ struct sdhci_pci_fixes { | |||
| 54 | int (*probe_slot) (struct sdhci_pci_slot *); | 54 | int (*probe_slot) (struct sdhci_pci_slot *); |
| 55 | void (*remove_slot) (struct sdhci_pci_slot *, int); | 55 | void (*remove_slot) (struct sdhci_pci_slot *, int); |
| 56 | 56 | ||
| 57 | int (*suspend) (struct sdhci_pci_chip *, | 57 | int (*suspend) (struct sdhci_pci_chip *); |
| 58 | pm_message_t); | ||
| 59 | int (*resume) (struct sdhci_pci_chip *); | 58 | int (*resume) (struct sdhci_pci_chip *); |
| 60 | }; | 59 | }; |
| 61 | 60 | ||
| @@ -549,7 +548,7 @@ static void jmicron_remove_slot(struct sdhci_pci_slot *slot, int dead) | |||
| 549 | jmicron_enable_mmc(slot->host, 0); | 548 | jmicron_enable_mmc(slot->host, 0); |
| 550 | } | 549 | } |
| 551 | 550 | ||
| 552 | static int jmicron_suspend(struct sdhci_pci_chip *chip, pm_message_t state) | 551 | static int jmicron_suspend(struct sdhci_pci_chip *chip) |
| 553 | { | 552 | { |
| 554 | int i; | 553 | int i; |
| 555 | 554 | ||
| @@ -993,8 +992,9 @@ static struct sdhci_ops sdhci_pci_ops = { | |||
| 993 | 992 | ||
| 994 | #ifdef CONFIG_PM | 993 | #ifdef CONFIG_PM |
| 995 | 994 | ||
| 996 | static int sdhci_pci_suspend(struct pci_dev *pdev, pm_message_t state) | 995 | static int sdhci_pci_suspend(struct device *dev) |
| 997 | { | 996 | { |
| 997 | struct pci_dev *pdev = to_pci_dev(dev); | ||
| 998 | struct sdhci_pci_chip *chip; | 998 | struct sdhci_pci_chip *chip; |
| 999 | struct sdhci_pci_slot *slot; | 999 | struct sdhci_pci_slot *slot; |
| 1000 | mmc_pm_flag_t slot_pm_flags; | 1000 | mmc_pm_flag_t slot_pm_flags; |
| @@ -1010,7 +1010,7 @@ static int sdhci_pci_suspend(struct pci_dev *pdev, pm_message_t state) | |||
| 1010 | if (!slot) | 1010 | if (!slot) |
| 1011 | continue; | 1011 | continue; |
| 1012 | 1012 | ||
| 1013 | ret = sdhci_suspend_host(slot->host, state); | 1013 | ret = sdhci_suspend_host(slot->host); |
| 1014 | 1014 | ||
| 1015 | if (ret) { | 1015 | if (ret) { |
| 1016 | for (i--; i >= 0; i--) | 1016 | for (i--; i >= 0; i--) |
| @@ -1026,7 +1026,7 @@ static int sdhci_pci_suspend(struct pci_dev *pdev, pm_message_t state) | |||
| 1026 | } | 1026 | } |
| 1027 | 1027 | ||
| 1028 | if (chip->fixes && chip->fixes->suspend) { | 1028 | if (chip->fixes && chip->fixes->suspend) { |
| 1029 | ret = chip->fixes->suspend(chip, state); | 1029 | ret = chip->fixes->suspend(chip); |
| 1030 | if (ret) { | 1030 | if (ret) { |
| 1031 | for (i = chip->num_slots - 1; i >= 0; i--) | 1031 | for (i = chip->num_slots - 1; i >= 0; i--) |
| 1032 | sdhci_resume_host(chip->slots[i]->host); | 1032 | sdhci_resume_host(chip->slots[i]->host); |
| @@ -1042,16 +1042,17 @@ static int sdhci_pci_suspend(struct pci_dev *pdev, pm_message_t state) | |||
| 1042 | } | 1042 | } |
| 1043 | pci_set_power_state(pdev, PCI_D3hot); | 1043 | pci_set_power_state(pdev, PCI_D3hot); |
| 1044 | } else { | 1044 | } else { |
| 1045 | pci_enable_wake(pdev, pci_choose_state(pdev, state), 0); | 1045 | pci_enable_wake(pdev, PCI_D3hot, 0); |
| 1046 | pci_disable_device(pdev); | 1046 | pci_disable_device(pdev); |
| 1047 | pci_set_power_state(pdev, pci_choose_state(pdev, state)); | 1047 | pci_set_power_state(pdev, PCI_D3hot); |
| 1048 | } | 1048 | } |
| 1049 | 1049 | ||
| 1050 | return 0; | 1050 | return 0; |
| 1051 | } | 1051 | } |
| 1052 | 1052 | ||
| 1053 | static int sdhci_pci_resume(struct pci_dev *pdev) | 1053 | static int sdhci_pci_resume(struct device *dev) |
| 1054 | { | 1054 | { |
| 1055 | struct pci_dev *pdev = to_pci_dev(dev); | ||
| 1055 | struct sdhci_pci_chip *chip; | 1056 | struct sdhci_pci_chip *chip; |
| 1056 | struct sdhci_pci_slot *slot; | 1057 | struct sdhci_pci_slot *slot; |
| 1057 | int i, ret; | 1058 | int i, ret; |
| @@ -1099,7 +1100,6 @@ static int sdhci_pci_runtime_suspend(struct device *dev) | |||
| 1099 | struct pci_dev *pdev = container_of(dev, struct pci_dev, dev); | 1100 | struct pci_dev *pdev = container_of(dev, struct pci_dev, dev); |
| 1100 | struct sdhci_pci_chip *chip; | 1101 | struct sdhci_pci_chip *chip; |
| 1101 | struct sdhci_pci_slot *slot; | 1102 | struct sdhci_pci_slot *slot; |
| 1102 | pm_message_t state = { .event = PM_EVENT_SUSPEND }; | ||
| 1103 | int i, ret; | 1103 | int i, ret; |
| 1104 | 1104 | ||
| 1105 | chip = pci_get_drvdata(pdev); | 1105 | chip = pci_get_drvdata(pdev); |
| @@ -1121,7 +1121,7 @@ static int sdhci_pci_runtime_suspend(struct device *dev) | |||
| 1121 | } | 1121 | } |
| 1122 | 1122 | ||
| 1123 | if (chip->fixes && chip->fixes->suspend) { | 1123 | if (chip->fixes && chip->fixes->suspend) { |
| 1124 | ret = chip->fixes->suspend(chip, state); | 1124 | ret = chip->fixes->suspend(chip); |
| 1125 | if (ret) { | 1125 | if (ret) { |
| 1126 | for (i = chip->num_slots - 1; i >= 0; i--) | 1126 | for (i = chip->num_slots - 1; i >= 0; i--) |
| 1127 | sdhci_runtime_resume_host(chip->slots[i]->host); | 1127 | sdhci_runtime_resume_host(chip->slots[i]->host); |
| @@ -1176,6 +1176,8 @@ static int sdhci_pci_runtime_idle(struct device *dev) | |||
| 1176 | #endif | 1176 | #endif |
| 1177 | 1177 | ||
| 1178 | static const struct dev_pm_ops sdhci_pci_pm_ops = { | 1178 | static const struct dev_pm_ops sdhci_pci_pm_ops = { |
| 1179 | .suspend = sdhci_pci_suspend, | ||
| 1180 | .resume = sdhci_pci_resume, | ||
| 1179 | .runtime_suspend = sdhci_pci_runtime_suspend, | 1181 | .runtime_suspend = sdhci_pci_runtime_suspend, |
| 1180 | .runtime_resume = sdhci_pci_runtime_resume, | 1182 | .runtime_resume = sdhci_pci_runtime_resume, |
| 1181 | .runtime_idle = sdhci_pci_runtime_idle, | 1183 | .runtime_idle = sdhci_pci_runtime_idle, |
| @@ -1428,8 +1430,6 @@ static struct pci_driver sdhci_driver = { | |||
| 1428 | .id_table = pci_ids, | 1430 | .id_table = pci_ids, |
| 1429 | .probe = sdhci_pci_probe, | 1431 | .probe = sdhci_pci_probe, |
| 1430 | .remove = __devexit_p(sdhci_pci_remove), | 1432 | .remove = __devexit_p(sdhci_pci_remove), |
| 1431 | .suspend = sdhci_pci_suspend, | ||
| 1432 | .resume = sdhci_pci_resume, | ||
| 1433 | .driver = { | 1433 | .driver = { |
| 1434 | .pm = &sdhci_pci_pm_ops | 1434 | .pm = &sdhci_pci_pm_ops |
| 1435 | }, | 1435 | }, |
diff --git a/drivers/mmc/host/sdhci-pltfm.c b/drivers/mmc/host/sdhci-pltfm.c index a9e12ea0558..03970bcb349 100644 --- a/drivers/mmc/host/sdhci-pltfm.c +++ b/drivers/mmc/host/sdhci-pltfm.c | |||
| @@ -194,21 +194,25 @@ int sdhci_pltfm_unregister(struct platform_device *pdev) | |||
| 194 | EXPORT_SYMBOL_GPL(sdhci_pltfm_unregister); | 194 | EXPORT_SYMBOL_GPL(sdhci_pltfm_unregister); |
| 195 | 195 | ||
| 196 | #ifdef CONFIG_PM | 196 | #ifdef CONFIG_PM |
| 197 | int sdhci_pltfm_suspend(struct platform_device *dev, pm_message_t state) | 197 | static int sdhci_pltfm_suspend(struct device *dev) |
| 198 | { | 198 | { |
| 199 | struct sdhci_host *host = platform_get_drvdata(dev); | 199 | struct sdhci_host *host = dev_get_drvdata(dev); |
| 200 | 200 | ||
| 201 | return sdhci_suspend_host(host, state); | 201 | return sdhci_suspend_host(host); |
| 202 | } | 202 | } |
| 203 | EXPORT_SYMBOL_GPL(sdhci_pltfm_suspend); | ||
| 204 | 203 | ||
| 205 | int sdhci_pltfm_resume(struct platform_device *dev) | 204 | static int sdhci_pltfm_resume(struct device *dev) |
| 206 | { | 205 | { |
| 207 | struct sdhci_host *host = platform_get_drvdata(dev); | 206 | struct sdhci_host *host = dev_get_drvdata(dev); |
| 208 | 207 | ||
| 209 | return sdhci_resume_host(host); | 208 | return sdhci_resume_host(host); |
| 210 | } | 209 | } |
| 211 | EXPORT_SYMBOL_GPL(sdhci_pltfm_resume); | 210 | |
| 211 | const struct dev_pm_ops sdhci_pltfm_pmops = { | ||
| 212 | .suspend = sdhci_pltfm_suspend, | ||
| 213 | .resume = sdhci_pltfm_resume, | ||
| 214 | }; | ||
| 215 | EXPORT_SYMBOL_GPL(sdhci_pltfm_pmops); | ||
| 212 | #endif /* CONFIG_PM */ | 216 | #endif /* CONFIG_PM */ |
| 213 | 217 | ||
| 214 | static int __init sdhci_pltfm_drv_init(void) | 218 | static int __init sdhci_pltfm_drv_init(void) |
diff --git a/drivers/mmc/host/sdhci-pltfm.h b/drivers/mmc/host/sdhci-pltfm.h index 3a9fc3f4084..37e0e184a0b 100644 --- a/drivers/mmc/host/sdhci-pltfm.h +++ b/drivers/mmc/host/sdhci-pltfm.h | |||
| @@ -99,8 +99,10 @@ extern int sdhci_pltfm_register(struct platform_device *pdev, | |||
| 99 | extern int sdhci_pltfm_unregister(struct platform_device *pdev); | 99 | extern int sdhci_pltfm_unregister(struct platform_device *pdev); |
| 100 | 100 | ||
| 101 | #ifdef CONFIG_PM | 101 | #ifdef CONFIG_PM |
| 102 | extern int sdhci_pltfm_suspend(struct platform_device *dev, pm_message_t state); | 102 | extern const struct dev_pm_ops sdhci_pltfm_pmops; |
| 103 | extern int sdhci_pltfm_resume(struct platform_device *dev); | 103 | #define SDHCI_PLTFM_PMOPS (&sdhci_pltfm_pmops) |
| 104 | #else | ||
| 105 | #define SDHCI_PLTFM_PMOPS NULL | ||
| 104 | #endif | 106 | #endif |
| 105 | 107 | ||
| 106 | #endif /* _DRIVERS_MMC_SDHCI_PLTFM_H */ | 108 | #endif /* _DRIVERS_MMC_SDHCI_PLTFM_H */ |
diff --git a/drivers/mmc/host/sdhci-pxav2.c b/drivers/mmc/host/sdhci-pxav2.c index d4bf6d30c7b..7a039c3cb1f 100644 --- a/drivers/mmc/host/sdhci-pxav2.c +++ b/drivers/mmc/host/sdhci-pxav2.c | |||
| @@ -218,13 +218,10 @@ static struct platform_driver sdhci_pxav2_driver = { | |||
| 218 | .driver = { | 218 | .driver = { |
| 219 | .name = "sdhci-pxav2", | 219 | .name = "sdhci-pxav2", |
| 220 | .owner = THIS_MODULE, | 220 | .owner = THIS_MODULE, |
| 221 | .pm = SDHCI_PLTFM_PMOPS, | ||
| 221 | }, | 222 | }, |
| 222 | .probe = sdhci_pxav2_probe, | 223 | .probe = sdhci_pxav2_probe, |
| 223 | .remove = __devexit_p(sdhci_pxav2_remove), | 224 | .remove = __devexit_p(sdhci_pxav2_remove), |
| 224 | #ifdef CONFIG_PM | ||
| 225 | .suspend = sdhci_pltfm_suspend, | ||
| 226 | .resume = sdhci_pltfm_resume, | ||
| 227 | #endif | ||
| 228 | }; | 225 | }; |
| 229 | static int __init sdhci_pxav2_init(void) | 226 | static int __init sdhci_pxav2_init(void) |
| 230 | { | 227 | { |
diff --git a/drivers/mmc/host/sdhci-pxav3.c b/drivers/mmc/host/sdhci-pxav3.c index cff4ad3e7a5..15673a7ee6a 100644 --- a/drivers/mmc/host/sdhci-pxav3.c +++ b/drivers/mmc/host/sdhci-pxav3.c | |||
| @@ -264,13 +264,10 @@ static struct platform_driver sdhci_pxav3_driver = { | |||
| 264 | .driver = { | 264 | .driver = { |
| 265 | .name = "sdhci-pxav3", | 265 | .name = "sdhci-pxav3", |
| 266 | .owner = THIS_MODULE, | 266 | .owner = THIS_MODULE, |
| 267 | .pm = SDHCI_PLTFM_PMOPS, | ||
| 267 | }, | 268 | }, |
| 268 | .probe = sdhci_pxav3_probe, | 269 | .probe = sdhci_pxav3_probe, |
| 269 | .remove = __devexit_p(sdhci_pxav3_remove), | 270 | .remove = __devexit_p(sdhci_pxav3_remove), |
| 270 | #ifdef CONFIG_PM | ||
| 271 | .suspend = sdhci_pltfm_suspend, | ||
| 272 | .resume = sdhci_pltfm_resume, | ||
| 273 | #endif | ||
| 274 | }; | 271 | }; |
| 275 | static int __init sdhci_pxav3_init(void) | 272 | static int __init sdhci_pxav3_init(void) |
| 276 | { | 273 | { |
diff --git a/drivers/mmc/host/sdhci-s3c.c b/drivers/mmc/host/sdhci-s3c.c index 3d00e722efc..0d33ff0d67f 100644 --- a/drivers/mmc/host/sdhci-s3c.c +++ b/drivers/mmc/host/sdhci-s3c.c | |||
| @@ -622,33 +622,38 @@ static int __devexit sdhci_s3c_remove(struct platform_device *pdev) | |||
| 622 | 622 | ||
| 623 | #ifdef CONFIG_PM | 623 | #ifdef CONFIG_PM |
| 624 | 624 | ||
| 625 | static int sdhci_s3c_suspend(struct platform_device *dev, pm_message_t pm) | 625 | static int sdhci_s3c_suspend(struct device *dev) |
| 626 | { | 626 | { |
| 627 | struct sdhci_host *host = platform_get_drvdata(dev); | 627 | struct sdhci_host *host = dev_get_drvdata(dev); |
| 628 | 628 | ||
| 629 | return sdhci_suspend_host(host, pm); | 629 | return sdhci_suspend_host(host); |
| 630 | } | 630 | } |
| 631 | 631 | ||
| 632 | static int sdhci_s3c_resume(struct platform_device *dev) | 632 | static int sdhci_s3c_resume(struct device *dev) |
| 633 | { | 633 | { |
| 634 | struct sdhci_host *host = platform_get_drvdata(dev); | 634 | struct sdhci_host *host = dev_get_drvdata(dev); |
| 635 | 635 | ||
| 636 | return sdhci_resume_host(host); | 636 | return sdhci_resume_host(host); |
| 637 | } | 637 | } |
| 638 | 638 | ||
| 639 | static const struct dev_pm_ops sdhci_s3c_pmops = { | ||
| 640 | .suspend = sdhci_s3c_suspend, | ||
| 641 | .resume = sdhci_s3c_resume, | ||
| 642 | }; | ||
| 643 | |||
| 644 | #define SDHCI_S3C_PMOPS (&sdhci_s3c_pmops) | ||
| 645 | |||
| 639 | #else | 646 | #else |
| 640 | #define sdhci_s3c_suspend NULL | 647 | #define SDHCI_S3C_PMOPS NULL |
| 641 | #define sdhci_s3c_resume NULL | ||
| 642 | #endif | 648 | #endif |
| 643 | 649 | ||
| 644 | static struct platform_driver sdhci_s3c_driver = { | 650 | static struct platform_driver sdhci_s3c_driver = { |
| 645 | .probe = sdhci_s3c_probe, | 651 | .probe = sdhci_s3c_probe, |
| 646 | .remove = __devexit_p(sdhci_s3c_remove), | 652 | .remove = __devexit_p(sdhci_s3c_remove), |
| 647 | .suspend = sdhci_s3c_suspend, | ||
| 648 | .resume = sdhci_s3c_resume, | ||
| 649 | .driver = { | 653 | .driver = { |
| 650 | .owner = THIS_MODULE, | 654 | .owner = THIS_MODULE, |
| 651 | .name = "s3c-sdhci", | 655 | .name = "s3c-sdhci", |
| 656 | .pm = SDHCI_S3C_PMOPS, | ||
| 652 | }, | 657 | }, |
| 653 | }; | 658 | }; |
| 654 | 659 | ||
diff --git a/drivers/mmc/host/sdhci-tegra.c b/drivers/mmc/host/sdhci-tegra.c index 89699e861fc..e2e18d3f949 100644 --- a/drivers/mmc/host/sdhci-tegra.c +++ b/drivers/mmc/host/sdhci-tegra.c | |||
| @@ -318,13 +318,10 @@ static struct platform_driver sdhci_tegra_driver = { | |||
| 318 | .name = "sdhci-tegra", | 318 | .name = "sdhci-tegra", |
| 319 | .owner = THIS_MODULE, | 319 | .owner = THIS_MODULE, |
| 320 | .of_match_table = sdhci_tegra_dt_match, | 320 | .of_match_table = sdhci_tegra_dt_match, |
| 321 | .pm = SDHCI_PLTFM_PMOPS, | ||
| 321 | }, | 322 | }, |
| 322 | .probe = sdhci_tegra_probe, | 323 | .probe = sdhci_tegra_probe, |
| 323 | .remove = __devexit_p(sdhci_tegra_remove), | 324 | .remove = __devexit_p(sdhci_tegra_remove), |
| 324 | #ifdef CONFIG_PM | ||
| 325 | .suspend = sdhci_pltfm_suspend, | ||
| 326 | .resume = sdhci_pltfm_resume, | ||
| 327 | #endif | ||
| 328 | }; | 325 | }; |
| 329 | 326 | ||
| 330 | static int __init sdhci_tegra_init(void) | 327 | static int __init sdhci_tegra_init(void) |
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index 6d8eea32354..19ed580f2ca 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c | |||
| @@ -2327,7 +2327,7 @@ out: | |||
| 2327 | 2327 | ||
| 2328 | #ifdef CONFIG_PM | 2328 | #ifdef CONFIG_PM |
| 2329 | 2329 | ||
| 2330 | int sdhci_suspend_host(struct sdhci_host *host, pm_message_t state) | 2330 | int sdhci_suspend_host(struct sdhci_host *host) |
| 2331 | { | 2331 | { |
| 2332 | int ret; | 2332 | int ret; |
| 2333 | 2333 | ||
diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h index 0a5b65460d8..a04d4d0c6fd 100644 --- a/drivers/mmc/host/sdhci.h +++ b/drivers/mmc/host/sdhci.h | |||
| @@ -374,7 +374,7 @@ extern int sdhci_add_host(struct sdhci_host *host); | |||
| 374 | extern void sdhci_remove_host(struct sdhci_host *host, int dead); | 374 | extern void sdhci_remove_host(struct sdhci_host *host, int dead); |
| 375 | 375 | ||
| 376 | #ifdef CONFIG_PM | 376 | #ifdef CONFIG_PM |
| 377 | extern int sdhci_suspend_host(struct sdhci_host *host, pm_message_t state); | 377 | extern int sdhci_suspend_host(struct sdhci_host *host); |
| 378 | extern int sdhci_resume_host(struct sdhci_host *host); | 378 | extern int sdhci_resume_host(struct sdhci_host *host); |
| 379 | extern void sdhci_enable_irq_wakeups(struct sdhci_host *host); | 379 | extern void sdhci_enable_irq_wakeups(struct sdhci_host *host); |
| 380 | #endif | 380 | #endif |
diff --git a/drivers/mmc/host/sh_mmcif.c b/drivers/mmc/host/sh_mmcif.c index 369366c8e20..d5505f3fe2a 100644 --- a/drivers/mmc/host/sh_mmcif.c +++ b/drivers/mmc/host/sh_mmcif.c | |||
| @@ -908,7 +908,7 @@ static void sh_mmcif_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) | |||
| 908 | if (host->power) { | 908 | if (host->power) { |
| 909 | pm_runtime_put(&host->pd->dev); | 909 | pm_runtime_put(&host->pd->dev); |
| 910 | host->power = false; | 910 | host->power = false; |
| 911 | if (p->down_pwr) | 911 | if (p->down_pwr && ios->power_mode == MMC_POWER_OFF) |
| 912 | p->down_pwr(host->pd); | 912 | p->down_pwr(host->pd); |
| 913 | } | 913 | } |
| 914 | host->state = STATE_IDLE; | 914 | host->state = STATE_IDLE; |
diff --git a/drivers/mmc/host/tmio_mmc_pio.c b/drivers/mmc/host/tmio_mmc_pio.c index d85a60cda16..4208b395806 100644 --- a/drivers/mmc/host/tmio_mmc_pio.c +++ b/drivers/mmc/host/tmio_mmc_pio.c | |||
| @@ -798,7 +798,7 @@ static void tmio_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) | |||
| 798 | /* start bus clock */ | 798 | /* start bus clock */ |
| 799 | tmio_mmc_clk_start(host); | 799 | tmio_mmc_clk_start(host); |
| 800 | } else if (ios->power_mode != MMC_POWER_UP) { | 800 | } else if (ios->power_mode != MMC_POWER_UP) { |
| 801 | if (host->set_pwr) | 801 | if (host->set_pwr && ios->power_mode == MMC_POWER_OFF) |
| 802 | host->set_pwr(host->pdev, 0); | 802 | host->set_pwr(host->pdev, 0); |
| 803 | if ((pdata->flags & TMIO_MMC_HAS_COLD_CD) && | 803 | if ((pdata->flags & TMIO_MMC_HAS_COLD_CD) && |
| 804 | pdata->power) { | 804 | pdata->power) { |
diff --git a/drivers/mmc/host/vub300.c b/drivers/mmc/host/vub300.c index e8f6e65183d..2ec978bc32b 100644 --- a/drivers/mmc/host/vub300.c +++ b/drivers/mmc/host/vub300.c | |||
| @@ -259,7 +259,7 @@ static int firmware_rom_wait_states = 0x04; | |||
| 259 | static int firmware_rom_wait_states = 0x1C; | 259 | static int firmware_rom_wait_states = 0x1C; |
| 260 | #endif | 260 | #endif |
| 261 | 261 | ||
| 262 | module_param(firmware_rom_wait_states, bool, 0644); | 262 | module_param(firmware_rom_wait_states, int, 0644); |
| 263 | MODULE_PARM_DESC(firmware_rom_wait_states, | 263 | MODULE_PARM_DESC(firmware_rom_wait_states, |
| 264 | "ROM wait states byte=RRRIIEEE (Reserved Internal External)"); | 264 | "ROM wait states byte=RRRIIEEE (Reserved Internal External)"); |
| 265 | 265 | ||
diff --git a/drivers/mtd/maps/plat-ram.c b/drivers/mtd/maps/plat-ram.c index 94f55348972..45876d0e5b8 100644 --- a/drivers/mtd/maps/plat-ram.c +++ b/drivers/mtd/maps/plat-ram.c | |||
| @@ -227,10 +227,14 @@ static int platram_probe(struct platform_device *pdev) | |||
| 227 | if (!err) | 227 | if (!err) |
| 228 | dev_info(&pdev->dev, "registered mtd device\n"); | 228 | dev_info(&pdev->dev, "registered mtd device\n"); |
| 229 | 229 | ||
| 230 | /* add the whole device. */ | 230 | if (pdata->nr_partitions) { |
| 231 | err = mtd_device_register(info->mtd, NULL, 0); | 231 | /* add the whole device. */ |
| 232 | if (err) | 232 | err = mtd_device_register(info->mtd, NULL, 0); |
| 233 | dev_err(&pdev->dev, "failed to register the entire device\n"); | 233 | if (err) { |
| 234 | dev_err(&pdev->dev, | ||
| 235 | "failed to register the entire device\n"); | ||
| 236 | } | ||
| 237 | } | ||
| 234 | 238 | ||
| 235 | return err; | 239 | return err; |
| 236 | 240 | ||
diff --git a/drivers/mtd/maps/pxa2xx-flash.c b/drivers/mtd/maps/pxa2xx-flash.c index 411a17df9fc..2a25b6789af 100644 --- a/drivers/mtd/maps/pxa2xx-flash.c +++ b/drivers/mtd/maps/pxa2xx-flash.c | |||
| @@ -98,7 +98,7 @@ static int __devinit pxa2xx_flash_probe(struct platform_device *pdev) | |||
| 98 | } | 98 | } |
| 99 | info->mtd->owner = THIS_MODULE; | 99 | info->mtd->owner = THIS_MODULE; |
| 100 | 100 | ||
| 101 | mtd_device_parse_register(info->mtd, probes, 0, NULL, 0); | 101 | mtd_device_parse_register(info->mtd, probes, 0, flash->parts, flash->nr_parts); |
| 102 | 102 | ||
| 103 | platform_set_drvdata(pdev, info); | 103 | platform_set_drvdata(pdev, info); |
| 104 | return 0; | 104 | return 0; |
diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c index 071b63420f0..493ec2fcf97 100644 --- a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c +++ b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c | |||
| @@ -21,9 +21,9 @@ | |||
| 21 | #include <linux/clk.h> | 21 | #include <linux/clk.h> |
| 22 | #include <linux/slab.h> | 22 | #include <linux/slab.h> |
| 23 | #include <linux/interrupt.h> | 23 | #include <linux/interrupt.h> |
| 24 | #include <linux/module.h> | ||
| 24 | #include <linux/mtd/gpmi-nand.h> | 25 | #include <linux/mtd/gpmi-nand.h> |
| 25 | #include <linux/mtd/partitions.h> | 26 | #include <linux/mtd/partitions.h> |
| 26 | |||
| 27 | #include "gpmi-nand.h" | 27 | #include "gpmi-nand.h" |
| 28 | 28 | ||
| 29 | /* add our owner bbt descriptor */ | 29 | /* add our owner bbt descriptor */ |
diff --git a/drivers/mtd/nand/ndfc.c b/drivers/mtd/nand/ndfc.c index ee1713907b9..f8aacf48ecd 100644 --- a/drivers/mtd/nand/ndfc.c +++ b/drivers/mtd/nand/ndfc.c | |||
| @@ -188,7 +188,7 @@ static int ndfc_chip_init(struct ndfc_controller *ndfc, | |||
| 188 | if (!flash_np) | 188 | if (!flash_np) |
| 189 | return -ENODEV; | 189 | return -ENODEV; |
| 190 | 190 | ||
| 191 | ppdata->of_node = flash_np; | 191 | ppdata.of_node = flash_np; |
| 192 | ndfc->mtd.name = kasprintf(GFP_KERNEL, "%s.%s", | 192 | ndfc->mtd.name = kasprintf(GFP_KERNEL, "%s.%s", |
| 193 | dev_name(&ndfc->ofdev->dev), flash_np->name); | 193 | dev_name(&ndfc->ofdev->dev), flash_np->name); |
| 194 | if (!ndfc->mtd.name) { | 194 | if (!ndfc->mtd.name) { |
diff --git a/drivers/net/ethernet/freescale/fec.c b/drivers/net/ethernet/freescale/fec.c index 1124ce0a159..c136230d50b 100644 --- a/drivers/net/ethernet/freescale/fec.c +++ b/drivers/net/ethernet/freescale/fec.c | |||
| @@ -232,6 +232,7 @@ struct fec_enet_private { | |||
| 232 | struct platform_device *pdev; | 232 | struct platform_device *pdev; |
| 233 | 233 | ||
| 234 | int opened; | 234 | int opened; |
| 235 | int dev_id; | ||
| 235 | 236 | ||
| 236 | /* Phylib and MDIO interface */ | 237 | /* Phylib and MDIO interface */ |
| 237 | struct mii_bus *mii_bus; | 238 | struct mii_bus *mii_bus; |
| @@ -837,7 +838,7 @@ static void __inline__ fec_get_mac(struct net_device *ndev) | |||
| 837 | 838 | ||
| 838 | /* Adjust MAC if using macaddr */ | 839 | /* Adjust MAC if using macaddr */ |
| 839 | if (iap == macaddr) | 840 | if (iap == macaddr) |
| 840 | ndev->dev_addr[ETH_ALEN-1] = macaddr[ETH_ALEN-1] + fep->pdev->id; | 841 | ndev->dev_addr[ETH_ALEN-1] = macaddr[ETH_ALEN-1] + fep->dev_id; |
| 841 | } | 842 | } |
| 842 | 843 | ||
| 843 | /* ------------------------------------------------------------------------- */ | 844 | /* ------------------------------------------------------------------------- */ |
| @@ -953,7 +954,7 @@ static int fec_enet_mii_probe(struct net_device *ndev) | |||
| 953 | char mdio_bus_id[MII_BUS_ID_SIZE]; | 954 | char mdio_bus_id[MII_BUS_ID_SIZE]; |
| 954 | char phy_name[MII_BUS_ID_SIZE + 3]; | 955 | char phy_name[MII_BUS_ID_SIZE + 3]; |
| 955 | int phy_id; | 956 | int phy_id; |
| 956 | int dev_id = fep->pdev->id; | 957 | int dev_id = fep->dev_id; |
| 957 | 958 | ||
| 958 | fep->phy_dev = NULL; | 959 | fep->phy_dev = NULL; |
| 959 | 960 | ||
| @@ -1031,7 +1032,7 @@ static int fec_enet_mii_init(struct platform_device *pdev) | |||
| 1031 | * mdio interface in board design, and need to be configured by | 1032 | * mdio interface in board design, and need to be configured by |
| 1032 | * fec0 mii_bus. | 1033 | * fec0 mii_bus. |
| 1033 | */ | 1034 | */ |
| 1034 | if ((id_entry->driver_data & FEC_QUIRK_ENET_MAC) && pdev->id > 0) { | 1035 | if ((id_entry->driver_data & FEC_QUIRK_ENET_MAC) && fep->dev_id > 0) { |
| 1035 | /* fec1 uses fec0 mii_bus */ | 1036 | /* fec1 uses fec0 mii_bus */ |
| 1036 | fep->mii_bus = fec0_mii_bus; | 1037 | fep->mii_bus = fec0_mii_bus; |
| 1037 | return 0; | 1038 | return 0; |
| @@ -1063,7 +1064,7 @@ static int fec_enet_mii_init(struct platform_device *pdev) | |||
| 1063 | fep->mii_bus->read = fec_enet_mdio_read; | 1064 | fep->mii_bus->read = fec_enet_mdio_read; |
| 1064 | fep->mii_bus->write = fec_enet_mdio_write; | 1065 | fep->mii_bus->write = fec_enet_mdio_write; |
| 1065 | fep->mii_bus->reset = fec_enet_mdio_reset; | 1066 | fep->mii_bus->reset = fec_enet_mdio_reset; |
| 1066 | snprintf(fep->mii_bus->id, MII_BUS_ID_SIZE, "%x", pdev->id + 1); | 1067 | snprintf(fep->mii_bus->id, MII_BUS_ID_SIZE, "%x", fep->dev_id + 1); |
| 1067 | fep->mii_bus->priv = fep; | 1068 | fep->mii_bus->priv = fep; |
| 1068 | fep->mii_bus->parent = &pdev->dev; | 1069 | fep->mii_bus->parent = &pdev->dev; |
| 1069 | 1070 | ||
| @@ -1521,6 +1522,7 @@ fec_probe(struct platform_device *pdev) | |||
| 1521 | int i, irq, ret = 0; | 1522 | int i, irq, ret = 0; |
| 1522 | struct resource *r; | 1523 | struct resource *r; |
| 1523 | const struct of_device_id *of_id; | 1524 | const struct of_device_id *of_id; |
| 1525 | static int dev_id; | ||
| 1524 | 1526 | ||
| 1525 | of_id = of_match_device(fec_dt_ids, &pdev->dev); | 1527 | of_id = of_match_device(fec_dt_ids, &pdev->dev); |
| 1526 | if (of_id) | 1528 | if (of_id) |
| @@ -1548,6 +1550,7 @@ fec_probe(struct platform_device *pdev) | |||
| 1548 | 1550 | ||
| 1549 | fep->hwp = ioremap(r->start, resource_size(r)); | 1551 | fep->hwp = ioremap(r->start, resource_size(r)); |
| 1550 | fep->pdev = pdev; | 1552 | fep->pdev = pdev; |
| 1553 | fep->dev_id = dev_id++; | ||
| 1551 | 1554 | ||
| 1552 | if (!fep->hwp) { | 1555 | if (!fep->hwp) { |
| 1553 | ret = -ENOMEM; | 1556 | ret = -ENOMEM; |
diff --git a/drivers/net/ethernet/freescale/fsl_pq_mdio.c b/drivers/net/ethernet/freescale/fsl_pq_mdio.c index 52f4e8ad48e..4d9f84b8ab9 100644 --- a/drivers/net/ethernet/freescale/fsl_pq_mdio.c +++ b/drivers/net/ethernet/freescale/fsl_pq_mdio.c | |||
| @@ -183,28 +183,10 @@ void fsl_pq_mdio_bus_name(char *name, struct device_node *np) | |||
| 183 | } | 183 | } |
| 184 | EXPORT_SYMBOL_GPL(fsl_pq_mdio_bus_name); | 184 | EXPORT_SYMBOL_GPL(fsl_pq_mdio_bus_name); |
| 185 | 185 | ||
| 186 | /* Scan the bus in reverse, looking for an empty spot */ | ||
| 187 | static int fsl_pq_mdio_find_free(struct mii_bus *new_bus) | ||
| 188 | { | ||
| 189 | int i; | ||
| 190 | |||
| 191 | for (i = PHY_MAX_ADDR; i > 0; i--) { | ||
| 192 | u32 phy_id; | ||
| 193 | |||
| 194 | if (get_phy_id(new_bus, i, &phy_id)) | ||
| 195 | return -1; | ||
| 196 | |||
| 197 | if (phy_id == 0xffffffff) | ||
| 198 | break; | ||
| 199 | } | ||
| 200 | |||
| 201 | return i; | ||
| 202 | } | ||
| 203 | |||
| 204 | 186 | ||
| 205 | #if defined(CONFIG_GIANFAR) || defined(CONFIG_GIANFAR_MODULE) | ||
| 206 | static u32 __iomem *get_gfar_tbipa(struct fsl_pq_mdio __iomem *regs, struct device_node *np) | 187 | static u32 __iomem *get_gfar_tbipa(struct fsl_pq_mdio __iomem *regs, struct device_node *np) |
| 207 | { | 188 | { |
| 189 | #if defined(CONFIG_GIANFAR) || defined(CONFIG_GIANFAR_MODULE) | ||
| 208 | struct gfar __iomem *enet_regs; | 190 | struct gfar __iomem *enet_regs; |
| 209 | 191 | ||
| 210 | /* | 192 | /* |
| @@ -220,15 +202,15 @@ static u32 __iomem *get_gfar_tbipa(struct fsl_pq_mdio __iomem *regs, struct devi | |||
| 220 | } else if (of_device_is_compatible(np, "fsl,etsec2-mdio") || | 202 | } else if (of_device_is_compatible(np, "fsl,etsec2-mdio") || |
| 221 | of_device_is_compatible(np, "fsl,etsec2-tbi")) { | 203 | of_device_is_compatible(np, "fsl,etsec2-tbi")) { |
| 222 | return of_iomap(np, 1); | 204 | return of_iomap(np, 1); |
| 223 | } else | 205 | } |
| 224 | return NULL; | ||
| 225 | } | ||
| 226 | #endif | 206 | #endif |
| 207 | return NULL; | ||
| 208 | } | ||
| 227 | 209 | ||
| 228 | 210 | ||
| 229 | #if defined(CONFIG_UCC_GETH) || defined(CONFIG_UCC_GETH_MODULE) | ||
| 230 | static int get_ucc_id_for_range(u64 start, u64 end, u32 *ucc_id) | 211 | static int get_ucc_id_for_range(u64 start, u64 end, u32 *ucc_id) |
| 231 | { | 212 | { |
| 213 | #if defined(CONFIG_UCC_GETH) || defined(CONFIG_UCC_GETH_MODULE) | ||
| 232 | struct device_node *np = NULL; | 214 | struct device_node *np = NULL; |
| 233 | int err = 0; | 215 | int err = 0; |
| 234 | 216 | ||
| @@ -261,9 +243,10 @@ static int get_ucc_id_for_range(u64 start, u64 end, u32 *ucc_id) | |||
| 261 | return err; | 243 | return err; |
| 262 | else | 244 | else |
| 263 | return -EINVAL; | 245 | return -EINVAL; |
| 264 | } | 246 | #else |
| 247 | return -ENODEV; | ||
| 265 | #endif | 248 | #endif |
| 266 | 249 | } | |
| 267 | 250 | ||
| 268 | static int fsl_pq_mdio_probe(struct platform_device *ofdev) | 251 | static int fsl_pq_mdio_probe(struct platform_device *ofdev) |
| 269 | { | 252 | { |
| @@ -339,19 +322,13 @@ static int fsl_pq_mdio_probe(struct platform_device *ofdev) | |||
| 339 | of_device_is_compatible(np, "fsl,etsec2-mdio") || | 322 | of_device_is_compatible(np, "fsl,etsec2-mdio") || |
| 340 | of_device_is_compatible(np, "fsl,etsec2-tbi") || | 323 | of_device_is_compatible(np, "fsl,etsec2-tbi") || |
| 341 | of_device_is_compatible(np, "gianfar")) { | 324 | of_device_is_compatible(np, "gianfar")) { |
| 342 | #if defined(CONFIG_GIANFAR) || defined(CONFIG_GIANFAR_MODULE) | ||
| 343 | tbipa = get_gfar_tbipa(regs, np); | 325 | tbipa = get_gfar_tbipa(regs, np); |
| 344 | if (!tbipa) { | 326 | if (!tbipa) { |
| 345 | err = -EINVAL; | 327 | err = -EINVAL; |
| 346 | goto err_free_irqs; | 328 | goto err_free_irqs; |
| 347 | } | 329 | } |
| 348 | #else | ||
| 349 | err = -ENODEV; | ||
| 350 | goto err_free_irqs; | ||
| 351 | #endif | ||
| 352 | } else if (of_device_is_compatible(np, "fsl,ucc-mdio") || | 330 | } else if (of_device_is_compatible(np, "fsl,ucc-mdio") || |
| 353 | of_device_is_compatible(np, "ucc_geth_phy")) { | 331 | of_device_is_compatible(np, "ucc_geth_phy")) { |
| 354 | #if defined(CONFIG_UCC_GETH) || defined(CONFIG_UCC_GETH_MODULE) | ||
| 355 | u32 id; | 332 | u32 id; |
| 356 | static u32 mii_mng_master; | 333 | static u32 mii_mng_master; |
| 357 | 334 | ||
| @@ -364,10 +341,6 @@ static int fsl_pq_mdio_probe(struct platform_device *ofdev) | |||
| 364 | mii_mng_master = id; | 341 | mii_mng_master = id; |
| 365 | ucc_set_qe_mux_mii_mng(id - 1); | 342 | ucc_set_qe_mux_mii_mng(id - 1); |
| 366 | } | 343 | } |
| 367 | #else | ||
| 368 | err = -ENODEV; | ||
| 369 | goto err_free_irqs; | ||
| 370 | #endif | ||
| 371 | } else { | 344 | } else { |
| 372 | err = -ENODEV; | 345 | err = -ENODEV; |
| 373 | goto err_free_irqs; | 346 | goto err_free_irqs; |
| @@ -386,16 +359,6 @@ static int fsl_pq_mdio_probe(struct platform_device *ofdev) | |||
| 386 | } | 359 | } |
| 387 | 360 | ||
| 388 | if (tbiaddr == -1) { | 361 | if (tbiaddr == -1) { |
| 389 | out_be32(tbipa, 0); | ||
| 390 | |||
| 391 | tbiaddr = fsl_pq_mdio_find_free(new_bus); | ||
| 392 | } | ||
| 393 | |||
| 394 | /* | ||
| 395 | * We define TBIPA at 0 to be illegal, opting to fail for boards that | ||
| 396 | * have PHYs at 1-31, rather than change tbipa and rescan. | ||
| 397 | */ | ||
| 398 | if (tbiaddr == 0) { | ||
| 399 | err = -EBUSY; | 362 | err = -EBUSY; |
| 400 | 363 | ||
| 401 | goto err_free_irqs; | 364 | goto err_free_irqs; |
diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c index 67bf0781999..c8f47f17186 100644 --- a/drivers/net/ethernet/realtek/r8169.c +++ b/drivers/net/ethernet/realtek/r8169.c | |||
| @@ -477,7 +477,6 @@ enum rtl_register_content { | |||
| 477 | /* Config1 register p.24 */ | 477 | /* Config1 register p.24 */ |
| 478 | LEDS1 = (1 << 7), | 478 | LEDS1 = (1 << 7), |
| 479 | LEDS0 = (1 << 6), | 479 | LEDS0 = (1 << 6), |
| 480 | MSIEnable = (1 << 5), /* Enable Message Signaled Interrupt */ | ||
| 481 | Speed_down = (1 << 4), | 480 | Speed_down = (1 << 4), |
| 482 | MEMMAP = (1 << 3), | 481 | MEMMAP = (1 << 3), |
| 483 | IOMAP = (1 << 2), | 482 | IOMAP = (1 << 2), |
| @@ -485,6 +484,7 @@ enum rtl_register_content { | |||
| 485 | PMEnable = (1 << 0), /* Power Management Enable */ | 484 | PMEnable = (1 << 0), /* Power Management Enable */ |
| 486 | 485 | ||
| 487 | /* Config2 register p. 25 */ | 486 | /* Config2 register p. 25 */ |
| 487 | MSIEnable = (1 << 5), /* 8169 only. Reserved in the 8168. */ | ||
| 488 | PCI_Clock_66MHz = 0x01, | 488 | PCI_Clock_66MHz = 0x01, |
| 489 | PCI_Clock_33MHz = 0x00, | 489 | PCI_Clock_33MHz = 0x00, |
| 490 | 490 | ||
| @@ -3426,22 +3426,24 @@ static const struct rtl_cfg_info { | |||
| 3426 | }; | 3426 | }; |
| 3427 | 3427 | ||
| 3428 | /* Cfg9346_Unlock assumed. */ | 3428 | /* Cfg9346_Unlock assumed. */ |
| 3429 | static unsigned rtl_try_msi(struct pci_dev *pdev, void __iomem *ioaddr, | 3429 | static unsigned rtl_try_msi(struct rtl8169_private *tp, |
| 3430 | const struct rtl_cfg_info *cfg) | 3430 | const struct rtl_cfg_info *cfg) |
| 3431 | { | 3431 | { |
| 3432 | void __iomem *ioaddr = tp->mmio_addr; | ||
| 3432 | unsigned msi = 0; | 3433 | unsigned msi = 0; |
| 3433 | u8 cfg2; | 3434 | u8 cfg2; |
| 3434 | 3435 | ||
| 3435 | cfg2 = RTL_R8(Config2) & ~MSIEnable; | 3436 | cfg2 = RTL_R8(Config2) & ~MSIEnable; |
| 3436 | if (cfg->features & RTL_FEATURE_MSI) { | 3437 | if (cfg->features & RTL_FEATURE_MSI) { |
| 3437 | if (pci_enable_msi(pdev)) { | 3438 | if (pci_enable_msi(tp->pci_dev)) { |
| 3438 | dev_info(&pdev->dev, "no MSI. Back to INTx.\n"); | 3439 | netif_info(tp, hw, tp->dev, "no MSI. Back to INTx.\n"); |
| 3439 | } else { | 3440 | } else { |
| 3440 | cfg2 |= MSIEnable; | 3441 | cfg2 |= MSIEnable; |
| 3441 | msi = RTL_FEATURE_MSI; | 3442 | msi = RTL_FEATURE_MSI; |
| 3442 | } | 3443 | } |
| 3443 | } | 3444 | } |
| 3444 | RTL_W8(Config2, cfg2); | 3445 | if (tp->mac_version <= RTL_GIGA_MAC_VER_06) |
| 3446 | RTL_W8(Config2, cfg2); | ||
| 3445 | return msi; | 3447 | return msi; |
| 3446 | } | 3448 | } |
| 3447 | 3449 | ||
| @@ -4077,7 +4079,7 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 4077 | tp->features |= RTL_FEATURE_WOL; | 4079 | tp->features |= RTL_FEATURE_WOL; |
| 4078 | if ((RTL_R8(Config5) & (UWF | BWF | MWF)) != 0) | 4080 | if ((RTL_R8(Config5) & (UWF | BWF | MWF)) != 0) |
| 4079 | tp->features |= RTL_FEATURE_WOL; | 4081 | tp->features |= RTL_FEATURE_WOL; |
| 4080 | tp->features |= rtl_try_msi(pdev, ioaddr, cfg); | 4082 | tp->features |= rtl_try_msi(tp, cfg); |
| 4081 | RTL_W8(Cfg9346, Cfg9346_Lock); | 4083 | RTL_W8(Cfg9346, Cfg9346_Lock); |
| 4082 | 4084 | ||
| 4083 | if (rtl_tbi_enabled(tp)) { | 4085 | if (rtl_tbi_enabled(tp)) { |
diff --git a/drivers/net/ethernet/ti/davinci_cpdma.c b/drivers/net/ethernet/ti/davinci_cpdma.c index dca9d3369cd..c97d2f59085 100644 --- a/drivers/net/ethernet/ti/davinci_cpdma.c +++ b/drivers/net/ethernet/ti/davinci_cpdma.c | |||
| @@ -836,11 +836,13 @@ int cpdma_chan_stop(struct cpdma_chan *chan) | |||
| 836 | chan_write(chan, cp, CPDMA_TEARDOWN_VALUE); | 836 | chan_write(chan, cp, CPDMA_TEARDOWN_VALUE); |
| 837 | 837 | ||
| 838 | /* handle completed packets */ | 838 | /* handle completed packets */ |
| 839 | spin_unlock_irqrestore(&chan->lock, flags); | ||
| 839 | do { | 840 | do { |
| 840 | ret = __cpdma_chan_process(chan); | 841 | ret = __cpdma_chan_process(chan); |
| 841 | if (ret < 0) | 842 | if (ret < 0) |
| 842 | break; | 843 | break; |
| 843 | } while ((ret & CPDMA_DESC_TD_COMPLETE) == 0); | 844 | } while ((ret & CPDMA_DESC_TD_COMPLETE) == 0); |
| 845 | spin_lock_irqsave(&chan->lock, flags); | ||
| 844 | 846 | ||
| 845 | /* remaining packets haven't been tx/rx'ed, clean them up */ | 847 | /* remaining packets haven't been tx/rx'ed, clean them up */ |
| 846 | while (chan->head) { | 848 | while (chan->head) { |
diff --git a/drivers/net/ppp/pptp.c b/drivers/net/ppp/pptp.c index 89f829f5f72..f8a6853b692 100644 --- a/drivers/net/ppp/pptp.c +++ b/drivers/net/ppp/pptp.c | |||
| @@ -423,10 +423,8 @@ static int pptp_bind(struct socket *sock, struct sockaddr *uservaddr, | |||
| 423 | lock_sock(sk); | 423 | lock_sock(sk); |
| 424 | 424 | ||
| 425 | opt->src_addr = sp->sa_addr.pptp; | 425 | opt->src_addr = sp->sa_addr.pptp; |
| 426 | if (add_chan(po)) { | 426 | if (add_chan(po)) |
| 427 | release_sock(sk); | ||
| 428 | error = -EBUSY; | 427 | error = -EBUSY; |
| 429 | } | ||
| 430 | 428 | ||
| 431 | release_sock(sk); | 429 | release_sock(sk); |
| 432 | return error; | 430 | return error; |
diff --git a/drivers/net/usb/asix.c b/drivers/net/usb/asix.c index e6fed4d4cb7..e95f0e60a9b 100644 --- a/drivers/net/usb/asix.c +++ b/drivers/net/usb/asix.c | |||
| @@ -1655,6 +1655,10 @@ static const struct usb_device_id products [] = { | |||
| 1655 | // ASIX 88772a | 1655 | // ASIX 88772a |
| 1656 | USB_DEVICE(0x0db0, 0xa877), | 1656 | USB_DEVICE(0x0db0, 0xa877), |
| 1657 | .driver_info = (unsigned long) &ax88772_info, | 1657 | .driver_info = (unsigned long) &ax88772_info, |
| 1658 | }, { | ||
| 1659 | // Asus USB Ethernet Adapter | ||
| 1660 | USB_DEVICE (0x0b95, 0x7e2b), | ||
| 1661 | .driver_info = (unsigned long) &ax88772_info, | ||
| 1658 | }, | 1662 | }, |
| 1659 | { }, // END | 1663 | { }, // END |
| 1660 | }; | 1664 | }; |
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c index 93fbe6f4089..d2348a5a780 100644 --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c | |||
| @@ -286,7 +286,7 @@ static bool ath_complete_reset(struct ath_softc *sc, bool start) | |||
| 286 | ath_start_ani(common); | 286 | ath_start_ani(common); |
| 287 | } | 287 | } |
| 288 | 288 | ||
| 289 | if (ath9k_hw_ops(ah)->antdiv_comb_conf_get && sc->ant_rx != 3) { | 289 | if ((ah->caps.hw_caps & ATH9K_HW_CAP_ANT_DIV_COMB) && sc->ant_rx != 3) { |
| 290 | struct ath_hw_antcomb_conf div_ant_conf; | 290 | struct ath_hw_antcomb_conf div_ant_conf; |
| 291 | u8 lna_conf; | 291 | u8 lna_conf; |
| 292 | 292 | ||
diff --git a/drivers/net/wireless/ath/ath9k/rc.c b/drivers/net/wireless/ath/ath9k/rc.c index 888abc2be3a..528d5f3e868 100644 --- a/drivers/net/wireless/ath/ath9k/rc.c +++ b/drivers/net/wireless/ath/ath9k/rc.c | |||
| @@ -1271,7 +1271,9 @@ static void ath_rc_init(struct ath_softc *sc, | |||
| 1271 | 1271 | ||
| 1272 | ath_rc_priv->max_valid_rate = k; | 1272 | ath_rc_priv->max_valid_rate = k; |
| 1273 | ath_rc_sort_validrates(rate_table, ath_rc_priv); | 1273 | ath_rc_sort_validrates(rate_table, ath_rc_priv); |
| 1274 | ath_rc_priv->rate_max_phy = ath_rc_priv->valid_rate_index[k-4]; | 1274 | ath_rc_priv->rate_max_phy = (k > 4) ? |
| 1275 | ath_rc_priv->valid_rate_index[k-4] : | ||
| 1276 | ath_rc_priv->valid_rate_index[k-1]; | ||
| 1275 | ath_rc_priv->rate_table = rate_table; | 1277 | ath_rc_priv->rate_table = rate_table; |
| 1276 | 1278 | ||
| 1277 | ath_dbg(common, ATH_DBG_CONFIG, | 1279 | ath_dbg(common, ATH_DBG_CONFIG, |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rxon.c b/drivers/net/wireless/iwlwifi/iwl-agn-rxon.c index a7a6def40d0..5c7c17c7166 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-rxon.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-rxon.c | |||
| @@ -606,8 +606,8 @@ int iwlagn_mac_config(struct ieee80211_hw *hw, u32 changed) | |||
| 606 | if (ctx->ht.enabled) { | 606 | if (ctx->ht.enabled) { |
| 607 | /* if HT40 is used, it should not change | 607 | /* if HT40 is used, it should not change |
| 608 | * after associated except channel switch */ | 608 | * after associated except channel switch */ |
| 609 | if (iwl_is_associated_ctx(ctx) && | 609 | if (!ctx->ht.is_40mhz || |
| 610 | !ctx->ht.is_40mhz) | 610 | !iwl_is_associated_ctx(ctx)) |
| 611 | iwlagn_config_ht40(conf, ctx); | 611 | iwlagn_config_ht40(conf, ctx); |
| 612 | } else | 612 | } else |
| 613 | ctx->ht.is_40mhz = false; | 613 | ctx->ht.is_40mhz = false; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-tx.c b/drivers/net/wireless/iwlwifi/iwl-agn-tx.c index 35a6b71f358..df1540ca610 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-tx.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-tx.c | |||
| @@ -91,7 +91,10 @@ static void iwlagn_tx_cmd_build_basic(struct iwl_priv *priv, | |||
| 91 | tx_cmd->tid_tspec = qc[0] & 0xf; | 91 | tx_cmd->tid_tspec = qc[0] & 0xf; |
| 92 | tx_flags &= ~TX_CMD_FLG_SEQ_CTL_MSK; | 92 | tx_flags &= ~TX_CMD_FLG_SEQ_CTL_MSK; |
| 93 | } else { | 93 | } else { |
| 94 | tx_flags |= TX_CMD_FLG_SEQ_CTL_MSK; | 94 | if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) |
| 95 | tx_flags |= TX_CMD_FLG_SEQ_CTL_MSK; | ||
| 96 | else | ||
| 97 | tx_flags &= ~TX_CMD_FLG_SEQ_CTL_MSK; | ||
| 95 | } | 98 | } |
| 96 | 99 | ||
| 97 | iwlagn_tx_cmd_protection(priv, info, fc, &tx_flags); | 100 | iwlagn_tx_cmd_protection(priv, info, fc, &tx_flags); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index bacc06c95e7..e0e9a3dfbc0 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c | |||
| @@ -2850,6 +2850,9 @@ static int iwlagn_mac_tx_sync(struct ieee80211_hw *hw, | |||
| 2850 | int ret; | 2850 | int ret; |
| 2851 | u8 sta_id; | 2851 | u8 sta_id; |
| 2852 | 2852 | ||
| 2853 | if (ctx->ctxid != IWL_RXON_CTX_PAN) | ||
| 2854 | return 0; | ||
| 2855 | |||
| 2853 | IWL_DEBUG_MAC80211(priv, "enter\n"); | 2856 | IWL_DEBUG_MAC80211(priv, "enter\n"); |
| 2854 | mutex_lock(&priv->shrd->mutex); | 2857 | mutex_lock(&priv->shrd->mutex); |
| 2855 | 2858 | ||
| @@ -2898,6 +2901,9 @@ static void iwlagn_mac_finish_tx_sync(struct ieee80211_hw *hw, | |||
| 2898 | struct iwl_vif_priv *vif_priv = (void *)vif->drv_priv; | 2901 | struct iwl_vif_priv *vif_priv = (void *)vif->drv_priv; |
| 2899 | struct iwl_rxon_context *ctx = vif_priv->ctx; | 2902 | struct iwl_rxon_context *ctx = vif_priv->ctx; |
| 2900 | 2903 | ||
| 2904 | if (ctx->ctxid != IWL_RXON_CTX_PAN) | ||
| 2905 | return; | ||
| 2906 | |||
| 2901 | IWL_DEBUG_MAC80211(priv, "enter\n"); | 2907 | IWL_DEBUG_MAC80211(priv, "enter\n"); |
| 2902 | mutex_lock(&priv->shrd->mutex); | 2908 | mutex_lock(&priv->shrd->mutex); |
| 2903 | 2909 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c b/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c index ce918980e97..5f17ab8e76b 100644 --- a/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c +++ b/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c | |||
| @@ -1197,9 +1197,7 @@ static int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb, | |||
| 1197 | iwl_print_hex_dump(trans, IWL_DL_TX, (u8 *)tx_cmd->hdr, hdr_len); | 1197 | iwl_print_hex_dump(trans, IWL_DL_TX, (u8 *)tx_cmd->hdr, hdr_len); |
| 1198 | 1198 | ||
| 1199 | /* Set up entry for this TFD in Tx byte-count array */ | 1199 | /* Set up entry for this TFD in Tx byte-count array */ |
| 1200 | if (is_agg) | 1200 | iwl_trans_txq_update_byte_cnt_tbl(trans, txq, le16_to_cpu(tx_cmd->len)); |
| 1201 | iwl_trans_txq_update_byte_cnt_tbl(trans, txq, | ||
| 1202 | le16_to_cpu(tx_cmd->len)); | ||
| 1203 | 1201 | ||
| 1204 | dma_sync_single_for_device(bus(trans)->dev, txcmd_phys, firstlen, | 1202 | dma_sync_single_for_device(bus(trans)->dev, txcmd_phys, firstlen, |
| 1205 | DMA_BIDIRECTIONAL); | 1203 | DMA_BIDIRECTIONAL); |
diff --git a/drivers/net/wireless/mwifiex/cmdevt.c b/drivers/net/wireless/mwifiex/cmdevt.c index ac278156d39..6e0a3eaecf7 100644 --- a/drivers/net/wireless/mwifiex/cmdevt.c +++ b/drivers/net/wireless/mwifiex/cmdevt.c | |||
| @@ -939,7 +939,6 @@ mwifiex_cancel_pending_ioctl(struct mwifiex_adapter *adapter) | |||
| 939 | { | 939 | { |
| 940 | struct cmd_ctrl_node *cmd_node = NULL, *tmp_node = NULL; | 940 | struct cmd_ctrl_node *cmd_node = NULL, *tmp_node = NULL; |
| 941 | unsigned long cmd_flags; | 941 | unsigned long cmd_flags; |
| 942 | unsigned long cmd_pending_q_flags; | ||
| 943 | unsigned long scan_pending_q_flags; | 942 | unsigned long scan_pending_q_flags; |
| 944 | uint16_t cancel_scan_cmd = false; | 943 | uint16_t cancel_scan_cmd = false; |
| 945 | 944 | ||
| @@ -949,12 +948,9 @@ mwifiex_cancel_pending_ioctl(struct mwifiex_adapter *adapter) | |||
| 949 | cmd_node = adapter->curr_cmd; | 948 | cmd_node = adapter->curr_cmd; |
| 950 | cmd_node->wait_q_enabled = false; | 949 | cmd_node->wait_q_enabled = false; |
| 951 | cmd_node->cmd_flag |= CMD_F_CANCELED; | 950 | cmd_node->cmd_flag |= CMD_F_CANCELED; |
| 952 | spin_lock_irqsave(&adapter->cmd_pending_q_lock, | ||
| 953 | cmd_pending_q_flags); | ||
| 954 | list_del(&cmd_node->list); | ||
| 955 | spin_unlock_irqrestore(&adapter->cmd_pending_q_lock, | ||
| 956 | cmd_pending_q_flags); | ||
| 957 | mwifiex_insert_cmd_to_free_q(adapter, cmd_node); | 951 | mwifiex_insert_cmd_to_free_q(adapter, cmd_node); |
| 952 | mwifiex_complete_cmd(adapter, adapter->curr_cmd); | ||
| 953 | adapter->curr_cmd = NULL; | ||
| 958 | spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, cmd_flags); | 954 | spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, cmd_flags); |
| 959 | } | 955 | } |
| 960 | 956 | ||
| @@ -981,7 +977,6 @@ mwifiex_cancel_pending_ioctl(struct mwifiex_adapter *adapter) | |||
| 981 | spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, cmd_flags); | 977 | spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, cmd_flags); |
| 982 | } | 978 | } |
| 983 | adapter->cmd_wait_q.status = -1; | 979 | adapter->cmd_wait_q.status = -1; |
| 984 | mwifiex_complete_cmd(adapter, adapter->curr_cmd); | ||
| 985 | } | 980 | } |
| 986 | 981 | ||
| 987 | /* | 982 | /* |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/phy.c b/drivers/net/wireless/rtlwifi/rtl8192ce/phy.c index 592a10ac592..3b585aadabf 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192ce/phy.c +++ b/drivers/net/wireless/rtlwifi/rtl8192ce/phy.c | |||
| @@ -569,7 +569,7 @@ static bool _rtl92ce_phy_set_rf_power_state(struct ieee80211_hw *hw, | |||
| 569 | } | 569 | } |
| 570 | case ERFSLEEP:{ | 570 | case ERFSLEEP:{ |
| 571 | if (ppsc->rfpwr_state == ERFOFF) | 571 | if (ppsc->rfpwr_state == ERFOFF) |
| 572 | break; | 572 | return false; |
| 573 | for (queue_id = 0, i = 0; | 573 | for (queue_id = 0, i = 0; |
| 574 | queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) { | 574 | queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) { |
| 575 | ring = &pcipriv->dev.tx_ring[queue_id]; | 575 | ring = &pcipriv->dev.tx_ring[queue_id]; |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/phy.c b/drivers/net/wireless/rtlwifi/rtl8192cu/phy.c index 72852900df8..e49cf2244c7 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192cu/phy.c +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/phy.c | |||
| @@ -548,7 +548,7 @@ static bool _rtl92cu_phy_set_rf_power_state(struct ieee80211_hw *hw, | |||
| 548 | break; | 548 | break; |
| 549 | case ERFSLEEP: | 549 | case ERFSLEEP: |
| 550 | if (ppsc->rfpwr_state == ERFOFF) | 550 | if (ppsc->rfpwr_state == ERFOFF) |
| 551 | break; | 551 | return false; |
| 552 | for (queue_id = 0, i = 0; | 552 | for (queue_id = 0, i = 0; |
| 553 | queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) { | 553 | queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) { |
| 554 | ring = &pcipriv->dev.tx_ring[queue_id]; | 554 | ring = &pcipriv->dev.tx_ring[queue_id]; |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192de/phy.c b/drivers/net/wireless/rtlwifi/rtl8192de/phy.c index 3ac7af1c550..0883349e1c8 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192de/phy.c +++ b/drivers/net/wireless/rtlwifi/rtl8192de/phy.c | |||
| @@ -3374,7 +3374,7 @@ bool rtl92d_phy_set_rf_power_state(struct ieee80211_hw *hw, | |||
| 3374 | break; | 3374 | break; |
| 3375 | case ERFSLEEP: | 3375 | case ERFSLEEP: |
| 3376 | if (ppsc->rfpwr_state == ERFOFF) | 3376 | if (ppsc->rfpwr_state == ERFOFF) |
| 3377 | break; | 3377 | return false; |
| 3378 | 3378 | ||
| 3379 | for (queue_id = 0, i = 0; | 3379 | for (queue_id = 0, i = 0; |
| 3380 | queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) { | 3380 | queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) { |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/phy.c b/drivers/net/wireless/rtlwifi/rtl8192se/phy.c index f27171af979..f10ac1ad908 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192se/phy.c +++ b/drivers/net/wireless/rtlwifi/rtl8192se/phy.c | |||
| @@ -602,7 +602,7 @@ bool rtl92s_phy_set_rf_power_state(struct ieee80211_hw *hw, | |||
| 602 | } | 602 | } |
| 603 | case ERFSLEEP: | 603 | case ERFSLEEP: |
| 604 | if (ppsc->rfpwr_state == ERFOFF) | 604 | if (ppsc->rfpwr_state == ERFOFF) |
| 605 | break; | 605 | return false; |
| 606 | 606 | ||
| 607 | for (queue_id = 0, i = 0; | 607 | for (queue_id = 0, i = 0; |
| 608 | queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) { | 608 | queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) { |
diff --git a/drivers/oprofile/oprofile_files.c b/drivers/oprofile/oprofile_files.c index 89f63456646..84a208dbed9 100644 --- a/drivers/oprofile/oprofile_files.c +++ b/drivers/oprofile/oprofile_files.c | |||
| @@ -45,7 +45,7 @@ static ssize_t timeout_write(struct file *file, char const __user *buf, | |||
| 45 | return -EINVAL; | 45 | return -EINVAL; |
| 46 | 46 | ||
| 47 | retval = oprofilefs_ulong_from_user(&val, buf, count); | 47 | retval = oprofilefs_ulong_from_user(&val, buf, count); |
| 48 | if (retval) | 48 | if (retval <= 0) |
| 49 | return retval; | 49 | return retval; |
| 50 | 50 | ||
| 51 | retval = oprofile_set_timeout(val); | 51 | retval = oprofile_set_timeout(val); |
| @@ -84,7 +84,7 @@ static ssize_t depth_write(struct file *file, char const __user *buf, size_t cou | |||
| 84 | return -EINVAL; | 84 | return -EINVAL; |
| 85 | 85 | ||
| 86 | retval = oprofilefs_ulong_from_user(&val, buf, count); | 86 | retval = oprofilefs_ulong_from_user(&val, buf, count); |
| 87 | if (retval) | 87 | if (retval <= 0) |
| 88 | return retval; | 88 | return retval; |
| 89 | 89 | ||
| 90 | retval = oprofile_set_ulong(&oprofile_backtrace_depth, val); | 90 | retval = oprofile_set_ulong(&oprofile_backtrace_depth, val); |
| @@ -141,9 +141,10 @@ static ssize_t enable_write(struct file *file, char const __user *buf, size_t co | |||
| 141 | return -EINVAL; | 141 | return -EINVAL; |
| 142 | 142 | ||
| 143 | retval = oprofilefs_ulong_from_user(&val, buf, count); | 143 | retval = oprofilefs_ulong_from_user(&val, buf, count); |
| 144 | if (retval) | 144 | if (retval <= 0) |
| 145 | return retval; | 145 | return retval; |
| 146 | 146 | ||
| 147 | retval = 0; | ||
| 147 | if (val) | 148 | if (val) |
| 148 | retval = oprofile_start(); | 149 | retval = oprofile_start(); |
| 149 | else | 150 | else |
diff --git a/drivers/oprofile/oprofilefs.c b/drivers/oprofile/oprofilefs.c index d0de6cc2d7a..2f0aa0f700e 100644 --- a/drivers/oprofile/oprofilefs.c +++ b/drivers/oprofile/oprofilefs.c | |||
| @@ -60,6 +60,13 @@ ssize_t oprofilefs_ulong_to_user(unsigned long val, char __user *buf, size_t cou | |||
| 60 | } | 60 | } |
| 61 | 61 | ||
| 62 | 62 | ||
| 63 | /* | ||
| 64 | * Note: If oprofilefs_ulong_from_user() returns 0, then *val remains | ||
| 65 | * unchanged and might be uninitialized. This follows write syscall | ||
| 66 | * implementation when count is zero: "If count is zero ... [and if] | ||
| 67 | * no errors are detected, 0 will be returned without causing any | ||
| 68 | * other effect." (man 2 write) | ||
| 69 | */ | ||
| 63 | int oprofilefs_ulong_from_user(unsigned long *val, char const __user *buf, size_t count) | 70 | int oprofilefs_ulong_from_user(unsigned long *val, char const __user *buf, size_t count) |
| 64 | { | 71 | { |
| 65 | char tmpbuf[TMPBUFSIZE]; | 72 | char tmpbuf[TMPBUFSIZE]; |
| @@ -79,7 +86,7 @@ int oprofilefs_ulong_from_user(unsigned long *val, char const __user *buf, size_ | |||
| 79 | raw_spin_lock_irqsave(&oprofilefs_lock, flags); | 86 | raw_spin_lock_irqsave(&oprofilefs_lock, flags); |
| 80 | *val = simple_strtoul(tmpbuf, NULL, 0); | 87 | *val = simple_strtoul(tmpbuf, NULL, 0); |
| 81 | raw_spin_unlock_irqrestore(&oprofilefs_lock, flags); | 88 | raw_spin_unlock_irqrestore(&oprofilefs_lock, flags); |
| 82 | return 0; | 89 | return count; |
| 83 | } | 90 | } |
| 84 | 91 | ||
| 85 | 92 | ||
| @@ -99,7 +106,7 @@ static ssize_t ulong_write_file(struct file *file, char const __user *buf, size_ | |||
| 99 | return -EINVAL; | 106 | return -EINVAL; |
| 100 | 107 | ||
| 101 | retval = oprofilefs_ulong_from_user(&value, buf, count); | 108 | retval = oprofilefs_ulong_from_user(&value, buf, count); |
| 102 | if (retval) | 109 | if (retval <= 0) |
| 103 | return retval; | 110 | return retval; |
| 104 | 111 | ||
| 105 | retval = oprofile_set_ulong(file->private_data, value); | 112 | retval = oprofile_set_ulong(file->private_data, value); |
diff --git a/drivers/pci/ats.c b/drivers/pci/ats.c index 7ec56fb0bd7..b0dd08e6a9d 100644 --- a/drivers/pci/ats.c +++ b/drivers/pci/ats.c | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | #include <linux/export.h> | 13 | #include <linux/export.h> |
| 14 | #include <linux/pci-ats.h> | 14 | #include <linux/pci-ats.h> |
| 15 | #include <linux/pci.h> | 15 | #include <linux/pci.h> |
| 16 | #include <linux/slab.h> | ||
| 16 | 17 | ||
| 17 | #include "pci.h" | 18 | #include "pci.h" |
| 18 | 19 | ||
diff --git a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c index fce1c54a0c8..9ddf69e3bbe 100644 --- a/drivers/pci/hotplug/acpiphp_glue.c +++ b/drivers/pci/hotplug/acpiphp_glue.c | |||
| @@ -132,6 +132,18 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv) | |||
| 132 | if (!acpi_pci_check_ejectable(pbus, handle) && !is_dock_device(handle)) | 132 | if (!acpi_pci_check_ejectable(pbus, handle) && !is_dock_device(handle)) |
| 133 | return AE_OK; | 133 | return AE_OK; |
| 134 | 134 | ||
| 135 | pdev = pbus->self; | ||
| 136 | if (pdev && pci_is_pcie(pdev)) { | ||
| 137 | tmp = acpi_find_root_bridge_handle(pdev); | ||
| 138 | if (tmp) { | ||
| 139 | struct acpi_pci_root *root = acpi_pci_find_root(tmp); | ||
| 140 | |||
| 141 | if (root && (root->osc_control_set & | ||
| 142 | OSC_PCI_EXPRESS_NATIVE_HP_CONTROL)) | ||
| 143 | return AE_OK; | ||
| 144 | } | ||
| 145 | } | ||
| 146 | |||
| 135 | acpi_evaluate_integer(handle, "_ADR", NULL, &adr); | 147 | acpi_evaluate_integer(handle, "_ADR", NULL, &adr); |
| 136 | device = (adr >> 16) & 0xffff; | 148 | device = (adr >> 16) & 0xffff; |
| 137 | function = adr & 0xffff; | 149 | function = adr & 0xffff; |
| @@ -213,7 +225,6 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv) | |||
| 213 | 225 | ||
| 214 | pdev = pci_get_slot(pbus, PCI_DEVFN(device, function)); | 226 | pdev = pci_get_slot(pbus, PCI_DEVFN(device, function)); |
| 215 | if (pdev) { | 227 | if (pdev) { |
| 216 | pdev->current_state = PCI_D0; | ||
| 217 | slot->flags |= (SLOT_ENABLED | SLOT_POWEREDON); | 228 | slot->flags |= (SLOT_ENABLED | SLOT_POWEREDON); |
| 218 | pci_dev_put(pdev); | 229 | pci_dev_put(pdev); |
| 219 | } | 230 | } |
| @@ -459,17 +470,8 @@ static int add_bridge(acpi_handle handle) | |||
| 459 | { | 470 | { |
| 460 | acpi_status status; | 471 | acpi_status status; |
| 461 | unsigned long long tmp; | 472 | unsigned long long tmp; |
| 462 | struct acpi_pci_root *root; | ||
| 463 | acpi_handle dummy_handle; | 473 | acpi_handle dummy_handle; |
| 464 | 474 | ||
| 465 | /* | ||
| 466 | * We shouldn't use this bridge if PCIe native hotplug control has been | ||
| 467 | * granted by the BIOS for it. | ||
| 468 | */ | ||
| 469 | root = acpi_pci_find_root(handle); | ||
| 470 | if (root && (root->osc_control_set & OSC_PCI_EXPRESS_NATIVE_HP_CONTROL)) | ||
| 471 | return -ENODEV; | ||
| 472 | |||
| 473 | /* if the bridge doesn't have _STA, we assume it is always there */ | 475 | /* if the bridge doesn't have _STA, we assume it is always there */ |
| 474 | status = acpi_get_handle(handle, "_STA", &dummy_handle); | 476 | status = acpi_get_handle(handle, "_STA", &dummy_handle); |
| 475 | if (ACPI_SUCCESS(status)) { | 477 | if (ACPI_SUCCESS(status)) { |
| @@ -1385,19 +1387,11 @@ static void handle_hotplug_event_func(acpi_handle handle, u32 type, | |||
| 1385 | static acpi_status | 1387 | static acpi_status |
| 1386 | find_root_bridges(acpi_handle handle, u32 lvl, void *context, void **rv) | 1388 | find_root_bridges(acpi_handle handle, u32 lvl, void *context, void **rv) |
| 1387 | { | 1389 | { |
| 1388 | struct acpi_pci_root *root; | ||
| 1389 | int *count = (int *)context; | 1390 | int *count = (int *)context; |
| 1390 | 1391 | ||
| 1391 | if (!acpi_is_root_bridge(handle)) | 1392 | if (!acpi_is_root_bridge(handle)) |
| 1392 | return AE_OK; | 1393 | return AE_OK; |
| 1393 | 1394 | ||
| 1394 | root = acpi_pci_find_root(handle); | ||
| 1395 | if (!root) | ||
| 1396 | return AE_OK; | ||
| 1397 | |||
| 1398 | if (root->osc_control_set & OSC_PCI_EXPRESS_NATIVE_HP_CONTROL) | ||
| 1399 | return AE_OK; | ||
| 1400 | |||
| 1401 | (*count)++; | 1395 | (*count)++; |
| 1402 | acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY, | 1396 | acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY, |
| 1403 | handle_hotplug_event_bridge, NULL); | 1397 | handle_hotplug_event_bridge, NULL); |
diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c index b82c155d7b3..1969a3ee305 100644 --- a/drivers/pci/iov.c +++ b/drivers/pci/iov.c | |||
| @@ -283,6 +283,7 @@ static int sriov_enable(struct pci_dev *dev, int nr_virtfn) | |||
| 283 | struct resource *res; | 283 | struct resource *res; |
| 284 | struct pci_dev *pdev; | 284 | struct pci_dev *pdev; |
| 285 | struct pci_sriov *iov = dev->sriov; | 285 | struct pci_sriov *iov = dev->sriov; |
| 286 | int bars = 0; | ||
| 286 | 287 | ||
| 287 | if (!nr_virtfn) | 288 | if (!nr_virtfn) |
| 288 | return 0; | 289 | return 0; |
| @@ -307,6 +308,7 @@ static int sriov_enable(struct pci_dev *dev, int nr_virtfn) | |||
| 307 | 308 | ||
| 308 | nres = 0; | 309 | nres = 0; |
| 309 | for (i = 0; i < PCI_SRIOV_NUM_BARS; i++) { | 310 | for (i = 0; i < PCI_SRIOV_NUM_BARS; i++) { |
| 311 | bars |= (1 << (i + PCI_IOV_RESOURCES)); | ||
| 310 | res = dev->resource + PCI_IOV_RESOURCES + i; | 312 | res = dev->resource + PCI_IOV_RESOURCES + i; |
| 311 | if (res->parent) | 313 | if (res->parent) |
| 312 | nres++; | 314 | nres++; |
| @@ -324,6 +326,11 @@ static int sriov_enable(struct pci_dev *dev, int nr_virtfn) | |||
| 324 | return -ENOMEM; | 326 | return -ENOMEM; |
| 325 | } | 327 | } |
| 326 | 328 | ||
| 329 | if (pci_enable_resources(dev, bars)) { | ||
| 330 | dev_err(&dev->dev, "SR-IOV: IOV BARS not allocated\n"); | ||
| 331 | return -ENOMEM; | ||
| 332 | } | ||
| 333 | |||
| 327 | if (iov->link != dev->devfn) { | 334 | if (iov->link != dev->devfn) { |
| 328 | pdev = pci_get_slot(dev->bus, iov->link); | 335 | pdev = pci_get_slot(dev->bus, iov->link); |
| 329 | if (!pdev) | 336 | if (!pdev) |
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 6f45a73c6e9..6d4a5319148 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
| @@ -664,6 +664,9 @@ static int pci_platform_power_transition(struct pci_dev *dev, pci_power_t state) | |||
| 664 | error = platform_pci_set_power_state(dev, state); | 664 | error = platform_pci_set_power_state(dev, state); |
| 665 | if (!error) | 665 | if (!error) |
| 666 | pci_update_current_state(dev, state); | 666 | pci_update_current_state(dev, state); |
| 667 | /* Fall back to PCI_D0 if native PM is not supported */ | ||
| 668 | if (!dev->pm_cap) | ||
| 669 | dev->current_state = PCI_D0; | ||
| 667 | } else { | 670 | } else { |
| 668 | error = -ENODEV; | 671 | error = -ENODEV; |
| 669 | /* Fall back to PCI_D0 if native PM is not supported */ | 672 | /* Fall back to PCI_D0 if native PM is not supported */ |
| @@ -1126,7 +1129,11 @@ static int __pci_enable_device_flags(struct pci_dev *dev, | |||
| 1126 | if (atomic_add_return(1, &dev->enable_cnt) > 1) | 1129 | if (atomic_add_return(1, &dev->enable_cnt) > 1) |
| 1127 | return 0; /* already enabled */ | 1130 | return 0; /* already enabled */ |
| 1128 | 1131 | ||
| 1129 | for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) | 1132 | /* only skip sriov related */ |
| 1133 | for (i = 0; i <= PCI_ROM_RESOURCE; i++) | ||
| 1134 | if (dev->resource[i].flags & flags) | ||
| 1135 | bars |= (1 << i); | ||
| 1136 | for (i = PCI_BRIDGE_RESOURCES; i < DEVICE_COUNT_RESOURCE; i++) | ||
| 1130 | if (dev->resource[i].flags & flags) | 1137 | if (dev->resource[i].flags & flags) |
| 1131 | bars |= (1 << i); | 1138 | bars |= (1 << i); |
| 1132 | 1139 | ||
diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c index fa4d9f32418..3bcc7cfcaba 100644 --- a/drivers/rtc/interface.c +++ b/drivers/rtc/interface.c | |||
| @@ -73,6 +73,8 @@ int rtc_set_time(struct rtc_device *rtc, struct rtc_time *tm) | |||
| 73 | err = -EINVAL; | 73 | err = -EINVAL; |
| 74 | 74 | ||
| 75 | mutex_unlock(&rtc->ops_lock); | 75 | mutex_unlock(&rtc->ops_lock); |
| 76 | /* A timer might have just expired */ | ||
| 77 | schedule_work(&rtc->irqwork); | ||
| 76 | return err; | 78 | return err; |
| 77 | } | 79 | } |
| 78 | EXPORT_SYMBOL_GPL(rtc_set_time); | 80 | EXPORT_SYMBOL_GPL(rtc_set_time); |
| @@ -112,6 +114,8 @@ int rtc_set_mmss(struct rtc_device *rtc, unsigned long secs) | |||
| 112 | err = -EINVAL; | 114 | err = -EINVAL; |
| 113 | 115 | ||
| 114 | mutex_unlock(&rtc->ops_lock); | 116 | mutex_unlock(&rtc->ops_lock); |
| 117 | /* A timer might have just expired */ | ||
| 118 | schedule_work(&rtc->irqwork); | ||
| 115 | 119 | ||
| 116 | return err; | 120 | return err; |
| 117 | } | 121 | } |
| @@ -403,6 +407,8 @@ int rtc_initialize_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm) | |||
| 403 | timerqueue_add(&rtc->timerqueue, &rtc->aie_timer.node); | 407 | timerqueue_add(&rtc->timerqueue, &rtc->aie_timer.node); |
| 404 | } | 408 | } |
| 405 | mutex_unlock(&rtc->ops_lock); | 409 | mutex_unlock(&rtc->ops_lock); |
| 410 | /* maybe that was in the past.*/ | ||
| 411 | schedule_work(&rtc->irqwork); | ||
| 406 | return err; | 412 | return err; |
| 407 | } | 413 | } |
| 408 | EXPORT_SYMBOL_GPL(rtc_initialize_alarm); | 414 | EXPORT_SYMBOL_GPL(rtc_initialize_alarm); |
diff --git a/drivers/rtc/rtc-m41t80.c b/drivers/rtc/rtc-m41t80.c index eda128fc1d3..64aedd8cc09 100644 --- a/drivers/rtc/rtc-m41t80.c +++ b/drivers/rtc/rtc-m41t80.c | |||
| @@ -357,10 +357,19 @@ static int m41t80_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *t) | |||
| 357 | static struct rtc_class_ops m41t80_rtc_ops = { | 357 | static struct rtc_class_ops m41t80_rtc_ops = { |
| 358 | .read_time = m41t80_rtc_read_time, | 358 | .read_time = m41t80_rtc_read_time, |
| 359 | .set_time = m41t80_rtc_set_time, | 359 | .set_time = m41t80_rtc_set_time, |
| 360 | /* | ||
| 361 | * XXX - m41t80 alarm functionality is reported broken. | ||
| 362 | * until it is fixed, don't register alarm functions. | ||
| 363 | * | ||
| 360 | .read_alarm = m41t80_rtc_read_alarm, | 364 | .read_alarm = m41t80_rtc_read_alarm, |
| 361 | .set_alarm = m41t80_rtc_set_alarm, | 365 | .set_alarm = m41t80_rtc_set_alarm, |
| 366 | */ | ||
| 362 | .proc = m41t80_rtc_proc, | 367 | .proc = m41t80_rtc_proc, |
| 368 | /* | ||
| 369 | * See above comment on broken alarm | ||
| 370 | * | ||
| 363 | .alarm_irq_enable = m41t80_rtc_alarm_irq_enable, | 371 | .alarm_irq_enable = m41t80_rtc_alarm_irq_enable, |
| 372 | */ | ||
| 364 | }; | 373 | }; |
| 365 | 374 | ||
| 366 | #if defined(CONFIG_RTC_INTF_SYSFS) || defined(CONFIG_RTC_INTF_SYSFS_MODULE) | 375 | #if defined(CONFIG_RTC_INTF_SYSFS) || defined(CONFIG_RTC_INTF_SYSFS_MODULE) |
diff --git a/drivers/s390/scsi/zfcp_scsi.c b/drivers/s390/scsi/zfcp_scsi.c index 11f07f88822..b79576b64f4 100644 --- a/drivers/s390/scsi/zfcp_scsi.c +++ b/drivers/s390/scsi/zfcp_scsi.c | |||
| @@ -55,6 +55,10 @@ static void zfcp_scsi_slave_destroy(struct scsi_device *sdev) | |||
| 55 | { | 55 | { |
| 56 | struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev); | 56 | struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev); |
| 57 | 57 | ||
| 58 | /* if previous slave_alloc returned early, there is nothing to do */ | ||
| 59 | if (!zfcp_sdev->port) | ||
| 60 | return; | ||
| 61 | |||
| 58 | zfcp_erp_lun_shutdown_wait(sdev, "scssd_1"); | 62 | zfcp_erp_lun_shutdown_wait(sdev, "scssd_1"); |
| 59 | put_device(&zfcp_sdev->port->dev); | 63 | put_device(&zfcp_sdev->port->dev); |
| 60 | } | 64 | } |
diff --git a/drivers/sbus/char/bbc_i2c.c b/drivers/sbus/char/bbc_i2c.c index 5f94d22c491..54266829290 100644 --- a/drivers/sbus/char/bbc_i2c.c +++ b/drivers/sbus/char/bbc_i2c.c | |||
| @@ -233,13 +233,9 @@ int bbc_i2c_write_buf(struct bbc_i2c_client *client, | |||
| 233 | int ret = 0; | 233 | int ret = 0; |
| 234 | 234 | ||
| 235 | while (len > 0) { | 235 | while (len > 0) { |
| 236 | int err = bbc_i2c_writeb(client, *buf, off); | 236 | ret = bbc_i2c_writeb(client, *buf, off); |
| 237 | 237 | if (ret < 0) | |
| 238 | if (err < 0) { | ||
| 239 | ret = err; | ||
| 240 | break; | 238 | break; |
| 241 | } | ||
| 242 | |||
| 243 | len--; | 239 | len--; |
| 244 | buf++; | 240 | buf++; |
| 245 | off++; | 241 | off++; |
| @@ -253,11 +249,9 @@ int bbc_i2c_read_buf(struct bbc_i2c_client *client, | |||
| 253 | int ret = 0; | 249 | int ret = 0; |
| 254 | 250 | ||
| 255 | while (len > 0) { | 251 | while (len > 0) { |
| 256 | int err = bbc_i2c_readb(client, buf, off); | 252 | ret = bbc_i2c_readb(client, buf, off); |
| 257 | if (err < 0) { | 253 | if (ret < 0) |
| 258 | ret = err; | ||
| 259 | break; | 254 | break; |
| 260 | } | ||
| 261 | len--; | 255 | len--; |
| 262 | buf++; | 256 | buf++; |
| 263 | off++; | 257 | off++; |
| @@ -422,17 +416,6 @@ static struct platform_driver bbc_i2c_driver = { | |||
| 422 | .remove = __devexit_p(bbc_i2c_remove), | 416 | .remove = __devexit_p(bbc_i2c_remove), |
| 423 | }; | 417 | }; |
| 424 | 418 | ||
| 425 | static int __init bbc_i2c_init(void) | 419 | module_platform_driver(bbc_i2c_driver); |
| 426 | { | ||
| 427 | return platform_driver_register(&bbc_i2c_driver); | ||
| 428 | } | ||
| 429 | |||
| 430 | static void __exit bbc_i2c_exit(void) | ||
| 431 | { | ||
| 432 | platform_driver_unregister(&bbc_i2c_driver); | ||
| 433 | } | ||
| 434 | |||
| 435 | module_init(bbc_i2c_init); | ||
| 436 | module_exit(bbc_i2c_exit); | ||
| 437 | 420 | ||
| 438 | MODULE_LICENSE("GPL"); | 421 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/sbus/char/display7seg.c b/drivers/sbus/char/display7seg.c index 965a1fccd66..4b9939726c3 100644 --- a/drivers/sbus/char/display7seg.c +++ b/drivers/sbus/char/display7seg.c | |||
| @@ -275,15 +275,4 @@ static struct platform_driver d7s_driver = { | |||
| 275 | .remove = __devexit_p(d7s_remove), | 275 | .remove = __devexit_p(d7s_remove), |
| 276 | }; | 276 | }; |
| 277 | 277 | ||
| 278 | static int __init d7s_init(void) | 278 | module_platform_driver(d7s_driver); |
| 279 | { | ||
| 280 | return platform_driver_register(&d7s_driver); | ||
| 281 | } | ||
| 282 | |||
| 283 | static void __exit d7s_exit(void) | ||
| 284 | { | ||
| 285 | platform_driver_unregister(&d7s_driver); | ||
| 286 | } | ||
| 287 | |||
| 288 | module_init(d7s_init); | ||
| 289 | module_exit(d7s_exit); | ||
diff --git a/drivers/sbus/char/envctrl.c b/drivers/sbus/char/envctrl.c index be7b4e56154..339fd6f65ed 100644 --- a/drivers/sbus/char/envctrl.c +++ b/drivers/sbus/char/envctrl.c | |||
| @@ -1138,16 +1138,6 @@ static struct platform_driver envctrl_driver = { | |||
| 1138 | .remove = __devexit_p(envctrl_remove), | 1138 | .remove = __devexit_p(envctrl_remove), |
| 1139 | }; | 1139 | }; |
| 1140 | 1140 | ||
| 1141 | static int __init envctrl_init(void) | 1141 | module_platform_driver(envctrl_driver); |
| 1142 | { | ||
| 1143 | return platform_driver_register(&envctrl_driver); | ||
| 1144 | } | ||
| 1145 | |||
| 1146 | static void __exit envctrl_exit(void) | ||
| 1147 | { | ||
| 1148 | platform_driver_unregister(&envctrl_driver); | ||
| 1149 | } | ||
| 1150 | 1142 | ||
| 1151 | module_init(envctrl_init); | ||
| 1152 | module_exit(envctrl_exit); | ||
| 1153 | MODULE_LICENSE("GPL"); | 1143 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/sbus/char/flash.c b/drivers/sbus/char/flash.c index 73dd4e7afaa..826157f3869 100644 --- a/drivers/sbus/char/flash.c +++ b/drivers/sbus/char/flash.c | |||
| @@ -216,16 +216,6 @@ static struct platform_driver flash_driver = { | |||
| 216 | .remove = __devexit_p(flash_remove), | 216 | .remove = __devexit_p(flash_remove), |
| 217 | }; | 217 | }; |
| 218 | 218 | ||
| 219 | static int __init flash_init(void) | 219 | module_platform_driver(flash_driver); |
| 220 | { | ||
| 221 | return platform_driver_register(&flash_driver); | ||
| 222 | } | ||
| 223 | |||
| 224 | static void __exit flash_cleanup(void) | ||
| 225 | { | ||
| 226 | platform_driver_unregister(&flash_driver); | ||
| 227 | } | ||
| 228 | 220 | ||
| 229 | module_init(flash_init); | ||
| 230 | module_exit(flash_cleanup); | ||
| 231 | MODULE_LICENSE("GPL"); | 221 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/sbus/char/uctrl.c b/drivers/sbus/char/uctrl.c index ebce9639a26..0b31658ccde 100644 --- a/drivers/sbus/char/uctrl.c +++ b/drivers/sbus/char/uctrl.c | |||
| @@ -435,16 +435,6 @@ static struct platform_driver uctrl_driver = { | |||
| 435 | }; | 435 | }; |
| 436 | 436 | ||
| 437 | 437 | ||
| 438 | static int __init uctrl_init(void) | 438 | module_platform_driver(uctrl_driver); |
| 439 | { | ||
| 440 | return platform_driver_register(&uctrl_driver); | ||
| 441 | } | ||
| 442 | |||
| 443 | static void __exit uctrl_exit(void) | ||
| 444 | { | ||
| 445 | platform_driver_unregister(&uctrl_driver); | ||
| 446 | } | ||
| 447 | 439 | ||
| 448 | module_init(uctrl_init); | ||
| 449 | module_exit(uctrl_exit); | ||
| 450 | MODULE_LICENSE("GPL"); | 440 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/scsi/bnx2i/bnx2i_hwi.c b/drivers/scsi/bnx2i/bnx2i_hwi.c index dba72a4e6a1..1ad0b822556 100644 --- a/drivers/scsi/bnx2i/bnx2i_hwi.c +++ b/drivers/scsi/bnx2i/bnx2i_hwi.c | |||
| @@ -1906,18 +1906,19 @@ static int bnx2i_queue_scsi_cmd_resp(struct iscsi_session *session, | |||
| 1906 | spin_lock(&session->lock); | 1906 | spin_lock(&session->lock); |
| 1907 | task = iscsi_itt_to_task(bnx2i_conn->cls_conn->dd_data, | 1907 | task = iscsi_itt_to_task(bnx2i_conn->cls_conn->dd_data, |
| 1908 | cqe->itt & ISCSI_CMD_RESPONSE_INDEX); | 1908 | cqe->itt & ISCSI_CMD_RESPONSE_INDEX); |
| 1909 | if (!task) { | 1909 | if (!task || !task->sc) { |
| 1910 | spin_unlock(&session->lock); | 1910 | spin_unlock(&session->lock); |
| 1911 | return -EINVAL; | 1911 | return -EINVAL; |
| 1912 | } | 1912 | } |
| 1913 | sc = task->sc; | 1913 | sc = task->sc; |
| 1914 | spin_unlock(&session->lock); | ||
| 1915 | 1914 | ||
| 1916 | if (!blk_rq_cpu_valid(sc->request)) | 1915 | if (!blk_rq_cpu_valid(sc->request)) |
| 1917 | cpu = smp_processor_id(); | 1916 | cpu = smp_processor_id(); |
| 1918 | else | 1917 | else |
| 1919 | cpu = sc->request->cpu; | 1918 | cpu = sc->request->cpu; |
| 1920 | 1919 | ||
| 1920 | spin_unlock(&session->lock); | ||
| 1921 | |||
| 1921 | p = &per_cpu(bnx2i_percpu, cpu); | 1922 | p = &per_cpu(bnx2i_percpu, cpu); |
| 1922 | spin_lock(&p->p_work_lock); | 1923 | spin_lock(&p->p_work_lock); |
| 1923 | if (unlikely(!p->iothread)) { | 1924 | if (unlikely(!p->iothread)) { |
diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c index cefbe44bb84..8d67467dd9c 100644 --- a/drivers/scsi/fcoe/fcoe.c +++ b/drivers/scsi/fcoe/fcoe.c | |||
| @@ -31,6 +31,8 @@ | |||
| 31 | #include <linux/sysfs.h> | 31 | #include <linux/sysfs.h> |
| 32 | #include <linux/ctype.h> | 32 | #include <linux/ctype.h> |
| 33 | #include <linux/workqueue.h> | 33 | #include <linux/workqueue.h> |
| 34 | #include <net/dcbnl.h> | ||
| 35 | #include <net/dcbevent.h> | ||
| 34 | #include <scsi/scsi_tcq.h> | 36 | #include <scsi/scsi_tcq.h> |
| 35 | #include <scsi/scsicam.h> | 37 | #include <scsi/scsicam.h> |
| 36 | #include <scsi/scsi_transport.h> | 38 | #include <scsi/scsi_transport.h> |
| @@ -101,6 +103,8 @@ static int fcoe_ddp_done(struct fc_lport *, u16); | |||
| 101 | static int fcoe_ddp_target(struct fc_lport *, u16, struct scatterlist *, | 103 | static int fcoe_ddp_target(struct fc_lport *, u16, struct scatterlist *, |
| 102 | unsigned int); | 104 | unsigned int); |
| 103 | static int fcoe_cpu_callback(struct notifier_block *, unsigned long, void *); | 105 | static int fcoe_cpu_callback(struct notifier_block *, unsigned long, void *); |
| 106 | static int fcoe_dcb_app_notification(struct notifier_block *notifier, | ||
| 107 | ulong event, void *ptr); | ||
| 104 | 108 | ||
| 105 | static bool fcoe_match(struct net_device *netdev); | 109 | static bool fcoe_match(struct net_device *netdev); |
| 106 | static int fcoe_create(struct net_device *netdev, enum fip_state fip_mode); | 110 | static int fcoe_create(struct net_device *netdev, enum fip_state fip_mode); |
| @@ -129,6 +133,11 @@ static struct notifier_block fcoe_cpu_notifier = { | |||
| 129 | .notifier_call = fcoe_cpu_callback, | 133 | .notifier_call = fcoe_cpu_callback, |
| 130 | }; | 134 | }; |
| 131 | 135 | ||
| 136 | /* notification function for DCB events */ | ||
| 137 | static struct notifier_block dcb_notifier = { | ||
| 138 | .notifier_call = fcoe_dcb_app_notification, | ||
| 139 | }; | ||
| 140 | |||
| 132 | static struct scsi_transport_template *fcoe_nport_scsi_transport; | 141 | static struct scsi_transport_template *fcoe_nport_scsi_transport; |
| 133 | static struct scsi_transport_template *fcoe_vport_scsi_transport; | 142 | static struct scsi_transport_template *fcoe_vport_scsi_transport; |
| 134 | 143 | ||
| @@ -1522,6 +1531,8 @@ int fcoe_xmit(struct fc_lport *lport, struct fc_frame *fp) | |||
| 1522 | skb_reset_network_header(skb); | 1531 | skb_reset_network_header(skb); |
| 1523 | skb->mac_len = elen; | 1532 | skb->mac_len = elen; |
| 1524 | skb->protocol = htons(ETH_P_FCOE); | 1533 | skb->protocol = htons(ETH_P_FCOE); |
| 1534 | skb->priority = port->priority; | ||
| 1535 | |||
| 1525 | if (fcoe->netdev->priv_flags & IFF_802_1Q_VLAN && | 1536 | if (fcoe->netdev->priv_flags & IFF_802_1Q_VLAN && |
| 1526 | fcoe->realdev->features & NETIF_F_HW_VLAN_TX) { | 1537 | fcoe->realdev->features & NETIF_F_HW_VLAN_TX) { |
| 1527 | skb->vlan_tci = VLAN_TAG_PRESENT | | 1538 | skb->vlan_tci = VLAN_TAG_PRESENT | |
| @@ -1624,6 +1635,7 @@ static inline int fcoe_filter_frames(struct fc_lport *lport, | |||
| 1624 | stats->InvalidCRCCount++; | 1635 | stats->InvalidCRCCount++; |
| 1625 | if (stats->InvalidCRCCount < 5) | 1636 | if (stats->InvalidCRCCount < 5) |
| 1626 | printk(KERN_WARNING "fcoe: dropping frame with CRC error\n"); | 1637 | printk(KERN_WARNING "fcoe: dropping frame with CRC error\n"); |
| 1638 | put_cpu(); | ||
| 1627 | return -EINVAL; | 1639 | return -EINVAL; |
| 1628 | } | 1640 | } |
| 1629 | 1641 | ||
| @@ -1746,6 +1758,7 @@ int fcoe_percpu_receive_thread(void *arg) | |||
| 1746 | */ | 1758 | */ |
| 1747 | static void fcoe_dev_setup(void) | 1759 | static void fcoe_dev_setup(void) |
| 1748 | { | 1760 | { |
| 1761 | register_dcbevent_notifier(&dcb_notifier); | ||
| 1749 | register_netdevice_notifier(&fcoe_notifier); | 1762 | register_netdevice_notifier(&fcoe_notifier); |
| 1750 | } | 1763 | } |
| 1751 | 1764 | ||
| @@ -1754,9 +1767,69 @@ static void fcoe_dev_setup(void) | |||
| 1754 | */ | 1767 | */ |
| 1755 | static void fcoe_dev_cleanup(void) | 1768 | static void fcoe_dev_cleanup(void) |
| 1756 | { | 1769 | { |
| 1770 | unregister_dcbevent_notifier(&dcb_notifier); | ||
| 1757 | unregister_netdevice_notifier(&fcoe_notifier); | 1771 | unregister_netdevice_notifier(&fcoe_notifier); |
| 1758 | } | 1772 | } |
| 1759 | 1773 | ||
| 1774 | static struct fcoe_interface * | ||
| 1775 | fcoe_hostlist_lookup_realdev_port(struct net_device *netdev) | ||
| 1776 | { | ||
| 1777 | struct fcoe_interface *fcoe; | ||
| 1778 | struct net_device *real_dev; | ||
| 1779 | |||
| 1780 | list_for_each_entry(fcoe, &fcoe_hostlist, list) { | ||
| 1781 | if (fcoe->netdev->priv_flags & IFF_802_1Q_VLAN) | ||
| 1782 | real_dev = vlan_dev_real_dev(fcoe->netdev); | ||
| 1783 | else | ||
| 1784 | real_dev = fcoe->netdev; | ||
| 1785 | |||
| 1786 | if (netdev == real_dev) | ||
| 1787 | return fcoe; | ||
| 1788 | } | ||
| 1789 | return NULL; | ||
| 1790 | } | ||
| 1791 | |||
| 1792 | static int fcoe_dcb_app_notification(struct notifier_block *notifier, | ||
| 1793 | ulong event, void *ptr) | ||
| 1794 | { | ||
| 1795 | struct dcb_app_type *entry = ptr; | ||
| 1796 | struct fcoe_interface *fcoe; | ||
| 1797 | struct net_device *netdev; | ||
| 1798 | struct fcoe_port *port; | ||
| 1799 | int prio; | ||
| 1800 | |||
| 1801 | if (entry->app.selector != DCB_APP_IDTYPE_ETHTYPE) | ||
| 1802 | return NOTIFY_OK; | ||
| 1803 | |||
| 1804 | netdev = dev_get_by_index(&init_net, entry->ifindex); | ||
| 1805 | if (!netdev) | ||
| 1806 | return NOTIFY_OK; | ||
| 1807 | |||
| 1808 | fcoe = fcoe_hostlist_lookup_realdev_port(netdev); | ||
| 1809 | dev_put(netdev); | ||
| 1810 | if (!fcoe) | ||
| 1811 | return NOTIFY_OK; | ||
| 1812 | |||
| 1813 | if (entry->dcbx & DCB_CAP_DCBX_VER_CEE) | ||
| 1814 | prio = ffs(entry->app.priority) - 1; | ||
| 1815 | else | ||
| 1816 | prio = entry->app.priority; | ||
| 1817 | |||
| 1818 | if (prio < 0) | ||
| 1819 | return NOTIFY_OK; | ||
| 1820 | |||
| 1821 | if (entry->app.protocol == ETH_P_FIP || | ||
| 1822 | entry->app.protocol == ETH_P_FCOE) | ||
| 1823 | fcoe->ctlr.priority = prio; | ||
| 1824 | |||
| 1825 | if (entry->app.protocol == ETH_P_FCOE) { | ||
| 1826 | port = lport_priv(fcoe->ctlr.lp); | ||
| 1827 | port->priority = prio; | ||
| 1828 | } | ||
| 1829 | |||
| 1830 | return NOTIFY_OK; | ||
| 1831 | } | ||
| 1832 | |||
| 1760 | /** | 1833 | /** |
| 1761 | * fcoe_device_notification() - Handler for net device events | 1834 | * fcoe_device_notification() - Handler for net device events |
| 1762 | * @notifier: The context of the notification | 1835 | * @notifier: The context of the notification |
| @@ -1965,6 +2038,46 @@ static bool fcoe_match(struct net_device *netdev) | |||
| 1965 | } | 2038 | } |
| 1966 | 2039 | ||
| 1967 | /** | 2040 | /** |
| 2041 | * fcoe_dcb_create() - Initialize DCB attributes and hooks | ||
| 2042 | * @netdev: The net_device object of the L2 link that should be queried | ||
| 2043 | * @port: The fcoe_port to bind FCoE APP priority with | ||
| 2044 | * @ | ||
| 2045 | */ | ||
| 2046 | static void fcoe_dcb_create(struct fcoe_interface *fcoe) | ||
| 2047 | { | ||
| 2048 | #ifdef CONFIG_DCB | ||
| 2049 | int dcbx; | ||
| 2050 | u8 fup, up; | ||
| 2051 | struct net_device *netdev = fcoe->realdev; | ||
| 2052 | struct fcoe_port *port = lport_priv(fcoe->ctlr.lp); | ||
| 2053 | struct dcb_app app = { | ||
| 2054 | .priority = 0, | ||
| 2055 | .protocol = ETH_P_FCOE | ||
| 2056 | }; | ||
| 2057 | |||
| 2058 | /* setup DCB priority attributes. */ | ||
| 2059 | if (netdev && netdev->dcbnl_ops && netdev->dcbnl_ops->getdcbx) { | ||
| 2060 | dcbx = netdev->dcbnl_ops->getdcbx(netdev); | ||
| 2061 | |||
| 2062 | if (dcbx & DCB_CAP_DCBX_VER_IEEE) { | ||
| 2063 | app.selector = IEEE_8021QAZ_APP_SEL_ETHERTYPE; | ||
| 2064 | up = dcb_ieee_getapp_mask(netdev, &app); | ||
| 2065 | app.protocol = ETH_P_FIP; | ||
| 2066 | fup = dcb_ieee_getapp_mask(netdev, &app); | ||
| 2067 | } else { | ||
| 2068 | app.selector = DCB_APP_IDTYPE_ETHTYPE; | ||
| 2069 | up = dcb_getapp(netdev, &app); | ||
| 2070 | app.protocol = ETH_P_FIP; | ||
| 2071 | fup = dcb_getapp(netdev, &app); | ||
| 2072 | } | ||
| 2073 | |||
| 2074 | port->priority = ffs(up) ? ffs(up) - 1 : 0; | ||
| 2075 | fcoe->ctlr.priority = ffs(fup) ? ffs(fup) - 1 : port->priority; | ||
| 2076 | } | ||
| 2077 | #endif | ||
| 2078 | } | ||
| 2079 | |||
| 2080 | /** | ||
| 1968 | * fcoe_create() - Create a fcoe interface | 2081 | * fcoe_create() - Create a fcoe interface |
| 1969 | * @netdev : The net_device object the Ethernet interface to create on | 2082 | * @netdev : The net_device object the Ethernet interface to create on |
| 1970 | * @fip_mode: The FIP mode for this creation | 2083 | * @fip_mode: The FIP mode for this creation |
| @@ -2007,6 +2120,9 @@ static int fcoe_create(struct net_device *netdev, enum fip_state fip_mode) | |||
| 2007 | /* Make this the "master" N_Port */ | 2120 | /* Make this the "master" N_Port */ |
| 2008 | fcoe->ctlr.lp = lport; | 2121 | fcoe->ctlr.lp = lport; |
| 2009 | 2122 | ||
| 2123 | /* setup DCB priority attributes. */ | ||
| 2124 | fcoe_dcb_create(fcoe); | ||
| 2125 | |||
| 2010 | /* add to lports list */ | 2126 | /* add to lports list */ |
| 2011 | fcoe_hostlist_add(lport); | 2127 | fcoe_hostlist_add(lport); |
| 2012 | 2128 | ||
diff --git a/drivers/scsi/fcoe/fcoe_ctlr.c b/drivers/scsi/fcoe/fcoe_ctlr.c index c74c4b8e71e..e7522dcc296 100644 --- a/drivers/scsi/fcoe/fcoe_ctlr.c +++ b/drivers/scsi/fcoe/fcoe_ctlr.c | |||
| @@ -320,6 +320,7 @@ static void fcoe_ctlr_solicit(struct fcoe_ctlr *fip, struct fcoe_fcf *fcf) | |||
| 320 | 320 | ||
| 321 | skb_put(skb, sizeof(*sol)); | 321 | skb_put(skb, sizeof(*sol)); |
| 322 | skb->protocol = htons(ETH_P_FIP); | 322 | skb->protocol = htons(ETH_P_FIP); |
| 323 | skb->priority = fip->priority; | ||
| 323 | skb_reset_mac_header(skb); | 324 | skb_reset_mac_header(skb); |
| 324 | skb_reset_network_header(skb); | 325 | skb_reset_network_header(skb); |
| 325 | fip->send(fip, skb); | 326 | fip->send(fip, skb); |
| @@ -474,6 +475,7 @@ static void fcoe_ctlr_send_keep_alive(struct fcoe_ctlr *fip, | |||
| 474 | } | 475 | } |
| 475 | skb_put(skb, len); | 476 | skb_put(skb, len); |
| 476 | skb->protocol = htons(ETH_P_FIP); | 477 | skb->protocol = htons(ETH_P_FIP); |
| 478 | skb->priority = fip->priority; | ||
| 477 | skb_reset_mac_header(skb); | 479 | skb_reset_mac_header(skb); |
| 478 | skb_reset_network_header(skb); | 480 | skb_reset_network_header(skb); |
| 479 | fip->send(fip, skb); | 481 | fip->send(fip, skb); |
| @@ -566,6 +568,7 @@ static int fcoe_ctlr_encaps(struct fcoe_ctlr *fip, struct fc_lport *lport, | |||
| 566 | cap->fip.fip_dl_len = htons(dlen / FIP_BPW); | 568 | cap->fip.fip_dl_len = htons(dlen / FIP_BPW); |
| 567 | 569 | ||
| 568 | skb->protocol = htons(ETH_P_FIP); | 570 | skb->protocol = htons(ETH_P_FIP); |
| 571 | skb->priority = fip->priority; | ||
| 569 | skb_reset_mac_header(skb); | 572 | skb_reset_mac_header(skb); |
| 570 | skb_reset_network_header(skb); | 573 | skb_reset_network_header(skb); |
| 571 | return 0; | 574 | return 0; |
| @@ -1911,6 +1914,7 @@ static void fcoe_ctlr_vn_send(struct fcoe_ctlr *fip, | |||
| 1911 | 1914 | ||
| 1912 | skb_put(skb, len); | 1915 | skb_put(skb, len); |
| 1913 | skb->protocol = htons(ETH_P_FIP); | 1916 | skb->protocol = htons(ETH_P_FIP); |
| 1917 | skb->priority = fip->priority; | ||
| 1914 | skb_reset_mac_header(skb); | 1918 | skb_reset_mac_header(skb); |
| 1915 | skb_reset_network_header(skb); | 1919 | skb_reset_network_header(skb); |
| 1916 | 1920 | ||
diff --git a/drivers/scsi/mpt2sas/mpt2sas_scsih.c b/drivers/scsi/mpt2sas/mpt2sas_scsih.c index 4e041f6d808..d570573b796 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_scsih.c +++ b/drivers/scsi/mpt2sas/mpt2sas_scsih.c | |||
| @@ -4335,7 +4335,7 @@ _scsih_smart_predicted_fault(struct MPT2SAS_ADAPTER *ioc, u16 handle) | |||
| 4335 | /* insert into event log */ | 4335 | /* insert into event log */ |
| 4336 | sz = offsetof(Mpi2EventNotificationReply_t, EventData) + | 4336 | sz = offsetof(Mpi2EventNotificationReply_t, EventData) + |
| 4337 | sizeof(Mpi2EventDataSasDeviceStatusChange_t); | 4337 | sizeof(Mpi2EventDataSasDeviceStatusChange_t); |
| 4338 | event_reply = kzalloc(sz, GFP_KERNEL); | 4338 | event_reply = kzalloc(sz, GFP_ATOMIC); |
| 4339 | if (!event_reply) { | 4339 | if (!event_reply) { |
| 4340 | printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", | 4340 | printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", |
| 4341 | ioc->name, __FILE__, __LINE__, __func__); | 4341 | ioc->name, __FILE__, __LINE__, __func__); |
diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c index ac326c41e93..6465dae5883 100644 --- a/drivers/scsi/qla2xxx/qla_attr.c +++ b/drivers/scsi/qla2xxx/qla_attr.c | |||
| @@ -1762,12 +1762,31 @@ qla2x00_get_host_port_state(struct Scsi_Host *shost) | |||
| 1762 | scsi_qla_host_t *vha = shost_priv(shost); | 1762 | scsi_qla_host_t *vha = shost_priv(shost); |
| 1763 | struct scsi_qla_host *base_vha = pci_get_drvdata(vha->hw->pdev); | 1763 | struct scsi_qla_host *base_vha = pci_get_drvdata(vha->hw->pdev); |
| 1764 | 1764 | ||
| 1765 | if (!base_vha->flags.online) | 1765 | if (!base_vha->flags.online) { |
| 1766 | fc_host_port_state(shost) = FC_PORTSTATE_OFFLINE; | 1766 | fc_host_port_state(shost) = FC_PORTSTATE_OFFLINE; |
| 1767 | else if (atomic_read(&base_vha->loop_state) == LOOP_TIMEOUT) | 1767 | return; |
| 1768 | fc_host_port_state(shost) = FC_PORTSTATE_UNKNOWN; | 1768 | } |
| 1769 | else | 1769 | |
| 1770 | switch (atomic_read(&base_vha->loop_state)) { | ||
| 1771 | case LOOP_UPDATE: | ||
| 1772 | fc_host_port_state(shost) = FC_PORTSTATE_DIAGNOSTICS; | ||
| 1773 | break; | ||
| 1774 | case LOOP_DOWN: | ||
| 1775 | if (test_bit(LOOP_RESYNC_NEEDED, &base_vha->dpc_flags)) | ||
| 1776 | fc_host_port_state(shost) = FC_PORTSTATE_DIAGNOSTICS; | ||
| 1777 | else | ||
| 1778 | fc_host_port_state(shost) = FC_PORTSTATE_LINKDOWN; | ||
| 1779 | break; | ||
| 1780 | case LOOP_DEAD: | ||
| 1781 | fc_host_port_state(shost) = FC_PORTSTATE_LINKDOWN; | ||
| 1782 | break; | ||
| 1783 | case LOOP_READY: | ||
| 1770 | fc_host_port_state(shost) = FC_PORTSTATE_ONLINE; | 1784 | fc_host_port_state(shost) = FC_PORTSTATE_ONLINE; |
| 1785 | break; | ||
| 1786 | default: | ||
| 1787 | fc_host_port_state(shost) = FC_PORTSTATE_UNKNOWN; | ||
| 1788 | break; | ||
| 1789 | } | ||
| 1771 | } | 1790 | } |
| 1772 | 1791 | ||
| 1773 | static int | 1792 | static int |
diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c index 9df4787715c..f3cddd5800c 100644 --- a/drivers/scsi/qla2xxx/qla_dbg.c +++ b/drivers/scsi/qla2xxx/qla_dbg.c | |||
| @@ -12,17 +12,17 @@ | |||
| 12 | * | Level | Last Value Used | Holes | | 12 | * | Level | Last Value Used | Holes | |
| 13 | * ---------------------------------------------------------------------- | 13 | * ---------------------------------------------------------------------- |
| 14 | * | Module Init and Probe | 0x0116 | | | 14 | * | Module Init and Probe | 0x0116 | | |
| 15 | * | Mailbox commands | 0x1129 | | | 15 | * | Mailbox commands | 0x112b | | |
| 16 | * | Device Discovery | 0x2083 | | | 16 | * | Device Discovery | 0x2083 | | |
| 17 | * | Queue Command and IO tracing | 0x302e | 0x3008 | | 17 | * | Queue Command and IO tracing | 0x302e | 0x3008 | |
| 18 | * | DPC Thread | 0x401c | | | 18 | * | DPC Thread | 0x401c | | |
| 19 | * | Async Events | 0x5059 | | | 19 | * | Async Events | 0x5059 | | |
| 20 | * | Timer Routines | 0x600d | | | 20 | * | Timer Routines | 0x6010 | 0x600e,0x600f | |
| 21 | * | User Space Interactions | 0x709d | | | 21 | * | User Space Interactions | 0x709d | | |
| 22 | * | Task Management | 0x8041 | | | 22 | * | Task Management | 0x8041 | 0x800b | |
| 23 | * | AER/EEH | 0x900f | | | 23 | * | AER/EEH | 0x900f | | |
| 24 | * | Virtual Port | 0xa007 | | | 24 | * | Virtual Port | 0xa007 | | |
| 25 | * | ISP82XX Specific | 0xb051 | | | 25 | * | ISP82XX Specific | 0xb052 | | |
| 26 | * | MultiQ | 0xc00b | | | 26 | * | MultiQ | 0xc00b | | |
| 27 | * | Misc | 0xd00b | | | 27 | * | Misc | 0xd00b | | |
| 28 | * ---------------------------------------------------------------------- | 28 | * ---------------------------------------------------------------------- |
diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h index ce32d8135c9..c0c11afb685 100644 --- a/drivers/scsi/qla2xxx/qla_gbl.h +++ b/drivers/scsi/qla2xxx/qla_gbl.h | |||
| @@ -578,6 +578,7 @@ extern int qla82xx_check_md_needed(scsi_qla_host_t *); | |||
| 578 | extern void qla82xx_chip_reset_cleanup(scsi_qla_host_t *); | 578 | extern void qla82xx_chip_reset_cleanup(scsi_qla_host_t *); |
| 579 | extern int qla82xx_mbx_beacon_ctl(scsi_qla_host_t *, int); | 579 | extern int qla82xx_mbx_beacon_ctl(scsi_qla_host_t *, int); |
| 580 | extern char *qdev_state(uint32_t); | 580 | extern char *qdev_state(uint32_t); |
| 581 | extern void qla82xx_clear_pending_mbx(scsi_qla_host_t *); | ||
| 581 | 582 | ||
| 582 | /* BSG related functions */ | 583 | /* BSG related functions */ |
| 583 | extern int qla24xx_bsg_request(struct fc_bsg_job *); | 584 | extern int qla24xx_bsg_request(struct fc_bsg_job *); |
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index f03e915f187..54ea68cec4c 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c | |||
| @@ -1509,7 +1509,8 @@ enable_82xx_npiv: | |||
| 1509 | &ha->fw_xcb_count, NULL, NULL, | 1509 | &ha->fw_xcb_count, NULL, NULL, |
| 1510 | &ha->max_npiv_vports, NULL); | 1510 | &ha->max_npiv_vports, NULL); |
| 1511 | 1511 | ||
| 1512 | if (!fw_major_version && ql2xallocfwdump) | 1512 | if (!fw_major_version && ql2xallocfwdump |
| 1513 | && !IS_QLA82XX(ha)) | ||
| 1513 | qla2x00_alloc_fw_dump(vha); | 1514 | qla2x00_alloc_fw_dump(vha); |
| 1514 | } | 1515 | } |
| 1515 | } else { | 1516 | } else { |
diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c index dbec89622a0..a4b267e60a3 100644 --- a/drivers/scsi/qla2xxx/qla_iocb.c +++ b/drivers/scsi/qla2xxx/qla_iocb.c | |||
| @@ -120,11 +120,10 @@ qla2x00_prep_cont_type0_iocb(struct scsi_qla_host *vha) | |||
| 120 | * Returns a pointer to the continuation type 1 IOCB packet. | 120 | * Returns a pointer to the continuation type 1 IOCB packet. |
| 121 | */ | 121 | */ |
| 122 | static inline cont_a64_entry_t * | 122 | static inline cont_a64_entry_t * |
| 123 | qla2x00_prep_cont_type1_iocb(scsi_qla_host_t *vha) | 123 | qla2x00_prep_cont_type1_iocb(scsi_qla_host_t *vha, struct req_que *req) |
| 124 | { | 124 | { |
| 125 | cont_a64_entry_t *cont_pkt; | 125 | cont_a64_entry_t *cont_pkt; |
| 126 | 126 | ||
| 127 | struct req_que *req = vha->req; | ||
| 128 | /* Adjust ring index. */ | 127 | /* Adjust ring index. */ |
| 129 | req->ring_index++; | 128 | req->ring_index++; |
| 130 | if (req->ring_index == req->length) { | 129 | if (req->ring_index == req->length) { |
| @@ -292,7 +291,7 @@ void qla2x00_build_scsi_iocbs_64(srb_t *sp, cmd_entry_t *cmd_pkt, | |||
| 292 | * Five DSDs are available in the Continuation | 291 | * Five DSDs are available in the Continuation |
| 293 | * Type 1 IOCB. | 292 | * Type 1 IOCB. |
| 294 | */ | 293 | */ |
| 295 | cont_pkt = qla2x00_prep_cont_type1_iocb(vha); | 294 | cont_pkt = qla2x00_prep_cont_type1_iocb(vha, vha->req); |
| 296 | cur_dsd = (uint32_t *)cont_pkt->dseg_0_address; | 295 | cur_dsd = (uint32_t *)cont_pkt->dseg_0_address; |
| 297 | avail_dsds = 5; | 296 | avail_dsds = 5; |
| 298 | } | 297 | } |
| @@ -684,7 +683,7 @@ qla24xx_build_scsi_iocbs(srb_t *sp, struct cmd_type_7 *cmd_pkt, | |||
| 684 | * Five DSDs are available in the Continuation | 683 | * Five DSDs are available in the Continuation |
| 685 | * Type 1 IOCB. | 684 | * Type 1 IOCB. |
| 686 | */ | 685 | */ |
| 687 | cont_pkt = qla2x00_prep_cont_type1_iocb(vha); | 686 | cont_pkt = qla2x00_prep_cont_type1_iocb(vha, vha->req); |
| 688 | cur_dsd = (uint32_t *)cont_pkt->dseg_0_address; | 687 | cur_dsd = (uint32_t *)cont_pkt->dseg_0_address; |
| 689 | avail_dsds = 5; | 688 | avail_dsds = 5; |
| 690 | } | 689 | } |
| @@ -2070,7 +2069,8 @@ qla2x00_ct_iocb(srb_t *sp, ms_iocb_entry_t *ct_iocb) | |||
| 2070 | * Five DSDs are available in the Cont. | 2069 | * Five DSDs are available in the Cont. |
| 2071 | * Type 1 IOCB. | 2070 | * Type 1 IOCB. |
| 2072 | */ | 2071 | */ |
| 2073 | cont_pkt = qla2x00_prep_cont_type1_iocb(vha); | 2072 | cont_pkt = qla2x00_prep_cont_type1_iocb(vha, |
| 2073 | vha->hw->req_q_map[0]); | ||
| 2074 | cur_dsd = (uint32_t *) cont_pkt->dseg_0_address; | 2074 | cur_dsd = (uint32_t *) cont_pkt->dseg_0_address; |
| 2075 | avail_dsds = 5; | 2075 | avail_dsds = 5; |
| 2076 | cont_iocb_prsnt = 1; | 2076 | cont_iocb_prsnt = 1; |
| @@ -2096,6 +2096,7 @@ qla24xx_ct_iocb(srb_t *sp, struct ct_entry_24xx *ct_iocb) | |||
| 2096 | int index; | 2096 | int index; |
| 2097 | uint16_t tot_dsds; | 2097 | uint16_t tot_dsds; |
| 2098 | scsi_qla_host_t *vha = sp->fcport->vha; | 2098 | scsi_qla_host_t *vha = sp->fcport->vha; |
| 2099 | struct qla_hw_data *ha = vha->hw; | ||
| 2099 | struct fc_bsg_job *bsg_job = ((struct srb_ctx *)sp->ctx)->u.bsg_job; | 2100 | struct fc_bsg_job *bsg_job = ((struct srb_ctx *)sp->ctx)->u.bsg_job; |
| 2100 | int loop_iterartion = 0; | 2101 | int loop_iterartion = 0; |
| 2101 | int cont_iocb_prsnt = 0; | 2102 | int cont_iocb_prsnt = 0; |
| @@ -2141,7 +2142,8 @@ qla24xx_ct_iocb(srb_t *sp, struct ct_entry_24xx *ct_iocb) | |||
| 2141 | * Five DSDs are available in the Cont. | 2142 | * Five DSDs are available in the Cont. |
| 2142 | * Type 1 IOCB. | 2143 | * Type 1 IOCB. |
| 2143 | */ | 2144 | */ |
| 2144 | cont_pkt = qla2x00_prep_cont_type1_iocb(vha); | 2145 | cont_pkt = qla2x00_prep_cont_type1_iocb(vha, |
| 2146 | ha->req_q_map[0]); | ||
| 2145 | cur_dsd = (uint32_t *) cont_pkt->dseg_0_address; | 2147 | cur_dsd = (uint32_t *) cont_pkt->dseg_0_address; |
| 2146 | avail_dsds = 5; | 2148 | avail_dsds = 5; |
| 2147 | cont_iocb_prsnt = 1; | 2149 | cont_iocb_prsnt = 1; |
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c index 2516adf1aee..7b91b290ffd 100644 --- a/drivers/scsi/qla2xxx/qla_isr.c +++ b/drivers/scsi/qla2xxx/qla_isr.c | |||
| @@ -1741,7 +1741,7 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt) | |||
| 1741 | resid, scsi_bufflen(cp)); | 1741 | resid, scsi_bufflen(cp)); |
| 1742 | 1742 | ||
| 1743 | cp->result = DID_ERROR << 16 | lscsi_status; | 1743 | cp->result = DID_ERROR << 16 | lscsi_status; |
| 1744 | break; | 1744 | goto check_scsi_status; |
| 1745 | } | 1745 | } |
| 1746 | 1746 | ||
| 1747 | if (!lscsi_status && | 1747 | if (!lscsi_status && |
diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c index 3b3cec9f6ac..82a33533ed2 100644 --- a/drivers/scsi/qla2xxx/qla_mbx.c +++ b/drivers/scsi/qla2xxx/qla_mbx.c | |||
| @@ -79,8 +79,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) | |||
| 79 | mcp->mb[0] = MBS_LINK_DOWN_ERROR; | 79 | mcp->mb[0] = MBS_LINK_DOWN_ERROR; |
| 80 | ql_log(ql_log_warn, base_vha, 0x1004, | 80 | ql_log(ql_log_warn, base_vha, 0x1004, |
| 81 | "FW hung = %d.\n", ha->flags.isp82xx_fw_hung); | 81 | "FW hung = %d.\n", ha->flags.isp82xx_fw_hung); |
| 82 | rval = QLA_FUNCTION_FAILED; | 82 | return QLA_FUNCTION_TIMEOUT; |
| 83 | goto premature_exit; | ||
| 84 | } | 83 | } |
| 85 | 84 | ||
| 86 | /* | 85 | /* |
| @@ -163,6 +162,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) | |||
| 163 | HINT_MBX_INT_PENDING) { | 162 | HINT_MBX_INT_PENDING) { |
| 164 | spin_unlock_irqrestore(&ha->hardware_lock, | 163 | spin_unlock_irqrestore(&ha->hardware_lock, |
| 165 | flags); | 164 | flags); |
| 165 | ha->flags.mbox_busy = 0; | ||
| 166 | ql_dbg(ql_dbg_mbx, base_vha, 0x1010, | 166 | ql_dbg(ql_dbg_mbx, base_vha, 0x1010, |
| 167 | "Pending mailbox timeout, exiting.\n"); | 167 | "Pending mailbox timeout, exiting.\n"); |
| 168 | rval = QLA_FUNCTION_TIMEOUT; | 168 | rval = QLA_FUNCTION_TIMEOUT; |
| @@ -188,6 +188,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) | |||
| 188 | HINT_MBX_INT_PENDING) { | 188 | HINT_MBX_INT_PENDING) { |
| 189 | spin_unlock_irqrestore(&ha->hardware_lock, | 189 | spin_unlock_irqrestore(&ha->hardware_lock, |
| 190 | flags); | 190 | flags); |
| 191 | ha->flags.mbox_busy = 0; | ||
| 191 | ql_dbg(ql_dbg_mbx, base_vha, 0x1012, | 192 | ql_dbg(ql_dbg_mbx, base_vha, 0x1012, |
| 192 | "Pending mailbox timeout, exiting.\n"); | 193 | "Pending mailbox timeout, exiting.\n"); |
| 193 | rval = QLA_FUNCTION_TIMEOUT; | 194 | rval = QLA_FUNCTION_TIMEOUT; |
| @@ -302,7 +303,15 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) | |||
| 302 | if (!test_bit(ISP_ABORT_NEEDED, &vha->dpc_flags) && | 303 | if (!test_bit(ISP_ABORT_NEEDED, &vha->dpc_flags) && |
| 303 | !test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags) && | 304 | !test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags) && |
| 304 | !test_bit(ISP_ABORT_RETRY, &vha->dpc_flags)) { | 305 | !test_bit(ISP_ABORT_RETRY, &vha->dpc_flags)) { |
| 305 | 306 | if (IS_QLA82XX(ha)) { | |
| 307 | ql_dbg(ql_dbg_mbx, vha, 0x112a, | ||
| 308 | "disabling pause transmit on port " | ||
| 309 | "0 & 1.\n"); | ||
| 310 | qla82xx_wr_32(ha, | ||
| 311 | QLA82XX_CRB_NIU + 0x98, | ||
| 312 | CRB_NIU_XG_PAUSE_CTL_P0| | ||
| 313 | CRB_NIU_XG_PAUSE_CTL_P1); | ||
| 314 | } | ||
| 306 | ql_log(ql_log_info, base_vha, 0x101c, | 315 | ql_log(ql_log_info, base_vha, 0x101c, |
| 307 | "Mailbox cmd timeout occured. " | 316 | "Mailbox cmd timeout occured. " |
| 308 | "Scheduling ISP abort eeh_busy=0x%x.\n", | 317 | "Scheduling ISP abort eeh_busy=0x%x.\n", |
| @@ -318,7 +327,15 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) | |||
| 318 | if (!test_bit(ISP_ABORT_NEEDED, &vha->dpc_flags) && | 327 | if (!test_bit(ISP_ABORT_NEEDED, &vha->dpc_flags) && |
| 319 | !test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags) && | 328 | !test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags) && |
| 320 | !test_bit(ISP_ABORT_RETRY, &vha->dpc_flags)) { | 329 | !test_bit(ISP_ABORT_RETRY, &vha->dpc_flags)) { |
| 321 | 330 | if (IS_QLA82XX(ha)) { | |
| 331 | ql_dbg(ql_dbg_mbx, vha, 0x112b, | ||
| 332 | "disabling pause transmit on port " | ||
| 333 | "0 & 1.\n"); | ||
| 334 | qla82xx_wr_32(ha, | ||
| 335 | QLA82XX_CRB_NIU + 0x98, | ||
| 336 | CRB_NIU_XG_PAUSE_CTL_P0| | ||
| 337 | CRB_NIU_XG_PAUSE_CTL_P1); | ||
| 338 | } | ||
| 322 | ql_log(ql_log_info, base_vha, 0x101e, | 339 | ql_log(ql_log_info, base_vha, 0x101e, |
| 323 | "Mailbox cmd timeout occured. " | 340 | "Mailbox cmd timeout occured. " |
| 324 | "Scheduling ISP abort.\n"); | 341 | "Scheduling ISP abort.\n"); |
diff --git a/drivers/scsi/qla2xxx/qla_nx.c b/drivers/scsi/qla2xxx/qla_nx.c index 94bded5ddce..03554934b0a 100644 --- a/drivers/scsi/qla2xxx/qla_nx.c +++ b/drivers/scsi/qla2xxx/qla_nx.c | |||
| @@ -3817,6 +3817,20 @@ exit: | |||
| 3817 | return rval; | 3817 | return rval; |
| 3818 | } | 3818 | } |
| 3819 | 3819 | ||
| 3820 | void qla82xx_clear_pending_mbx(scsi_qla_host_t *vha) | ||
| 3821 | { | ||
| 3822 | struct qla_hw_data *ha = vha->hw; | ||
| 3823 | |||
| 3824 | if (ha->flags.mbox_busy) { | ||
| 3825 | ha->flags.mbox_int = 1; | ||
| 3826 | ha->flags.mbox_busy = 0; | ||
| 3827 | ql_log(ql_log_warn, vha, 0x6010, | ||
| 3828 | "Doing premature completion of mbx command.\n"); | ||
| 3829 | if (test_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags)) | ||
| 3830 | complete(&ha->mbx_intr_comp); | ||
| 3831 | } | ||
| 3832 | } | ||
| 3833 | |||
| 3820 | void qla82xx_watchdog(scsi_qla_host_t *vha) | 3834 | void qla82xx_watchdog(scsi_qla_host_t *vha) |
| 3821 | { | 3835 | { |
| 3822 | uint32_t dev_state, halt_status; | 3836 | uint32_t dev_state, halt_status; |
| @@ -3839,9 +3853,13 @@ void qla82xx_watchdog(scsi_qla_host_t *vha) | |||
| 3839 | qla2xxx_wake_dpc(vha); | 3853 | qla2xxx_wake_dpc(vha); |
| 3840 | } else { | 3854 | } else { |
| 3841 | if (qla82xx_check_fw_alive(vha)) { | 3855 | if (qla82xx_check_fw_alive(vha)) { |
| 3856 | ql_dbg(ql_dbg_timer, vha, 0x6011, | ||
| 3857 | "disabling pause transmit on port 0 & 1.\n"); | ||
| 3858 | qla82xx_wr_32(ha, QLA82XX_CRB_NIU + 0x98, | ||
| 3859 | CRB_NIU_XG_PAUSE_CTL_P0|CRB_NIU_XG_PAUSE_CTL_P1); | ||
| 3842 | halt_status = qla82xx_rd_32(ha, | 3860 | halt_status = qla82xx_rd_32(ha, |
| 3843 | QLA82XX_PEG_HALT_STATUS1); | 3861 | QLA82XX_PEG_HALT_STATUS1); |
| 3844 | ql_dbg(ql_dbg_timer, vha, 0x6005, | 3862 | ql_log(ql_log_info, vha, 0x6005, |
| 3845 | "dumping hw/fw registers:.\n " | 3863 | "dumping hw/fw registers:.\n " |
| 3846 | " PEG_HALT_STATUS1: 0x%x, PEG_HALT_STATUS2: 0x%x,.\n " | 3864 | " PEG_HALT_STATUS1: 0x%x, PEG_HALT_STATUS2: 0x%x,.\n " |
| 3847 | " PEG_NET_0_PC: 0x%x, PEG_NET_1_PC: 0x%x,.\n " | 3865 | " PEG_NET_0_PC: 0x%x, PEG_NET_1_PC: 0x%x,.\n " |
| @@ -3858,6 +3876,11 @@ void qla82xx_watchdog(scsi_qla_host_t *vha) | |||
| 3858 | QLA82XX_CRB_PEG_NET_3 + 0x3c), | 3876 | QLA82XX_CRB_PEG_NET_3 + 0x3c), |
| 3859 | qla82xx_rd_32(ha, | 3877 | qla82xx_rd_32(ha, |
| 3860 | QLA82XX_CRB_PEG_NET_4 + 0x3c)); | 3878 | QLA82XX_CRB_PEG_NET_4 + 0x3c)); |
| 3879 | if (LSW(MSB(halt_status)) == 0x67) | ||
| 3880 | ql_log(ql_log_warn, vha, 0xb052, | ||
| 3881 | "Firmware aborted with " | ||
| 3882 | "error code 0x00006700. Device is " | ||
| 3883 | "being reset.\n"); | ||
| 3861 | if (halt_status & HALT_STATUS_UNRECOVERABLE) { | 3884 | if (halt_status & HALT_STATUS_UNRECOVERABLE) { |
| 3862 | set_bit(ISP_UNRECOVERABLE, | 3885 | set_bit(ISP_UNRECOVERABLE, |
| 3863 | &vha->dpc_flags); | 3886 | &vha->dpc_flags); |
| @@ -3869,16 +3892,8 @@ void qla82xx_watchdog(scsi_qla_host_t *vha) | |||
| 3869 | } | 3892 | } |
| 3870 | qla2xxx_wake_dpc(vha); | 3893 | qla2xxx_wake_dpc(vha); |
| 3871 | ha->flags.isp82xx_fw_hung = 1; | 3894 | ha->flags.isp82xx_fw_hung = 1; |
| 3872 | if (ha->flags.mbox_busy) { | 3895 | ql_log(ql_log_warn, vha, 0x6007, "Firmware hung.\n"); |
| 3873 | ha->flags.mbox_int = 1; | 3896 | qla82xx_clear_pending_mbx(vha); |
| 3874 | ql_log(ql_log_warn, vha, 0x6007, | ||
| 3875 | "Due to FW hung, doing " | ||
| 3876 | "premature completion of mbx " | ||
| 3877 | "command.\n"); | ||
| 3878 | if (test_bit(MBX_INTR_WAIT, | ||
| 3879 | &ha->mbx_cmd_flags)) | ||
| 3880 | complete(&ha->mbx_intr_comp); | ||
| 3881 | } | ||
| 3882 | } | 3897 | } |
| 3883 | } | 3898 | } |
| 3884 | } | 3899 | } |
| @@ -4073,10 +4088,7 @@ qla82xx_chip_reset_cleanup(scsi_qla_host_t *vha) | |||
| 4073 | msleep(1000); | 4088 | msleep(1000); |
| 4074 | if (qla82xx_check_fw_alive(vha)) { | 4089 | if (qla82xx_check_fw_alive(vha)) { |
| 4075 | ha->flags.isp82xx_fw_hung = 1; | 4090 | ha->flags.isp82xx_fw_hung = 1; |
| 4076 | if (ha->flags.mbox_busy) { | 4091 | qla82xx_clear_pending_mbx(vha); |
| 4077 | ha->flags.mbox_int = 1; | ||
| 4078 | complete(&ha->mbx_intr_comp); | ||
| 4079 | } | ||
| 4080 | break; | 4092 | break; |
| 4081 | } | 4093 | } |
| 4082 | } | 4094 | } |
diff --git a/drivers/scsi/qla2xxx/qla_nx.h b/drivers/scsi/qla2xxx/qla_nx.h index 57820c199bc..57a226be339 100644 --- a/drivers/scsi/qla2xxx/qla_nx.h +++ b/drivers/scsi/qla2xxx/qla_nx.h | |||
| @@ -1173,4 +1173,8 @@ struct qla82xx_md_entry_queue { | |||
| 1173 | 1173 | ||
| 1174 | static const int MD_MIU_TEST_AGT_RDDATA[] = { 0x410000A8, 0x410000AC, | 1174 | static const int MD_MIU_TEST_AGT_RDDATA[] = { 0x410000A8, 0x410000AC, |
| 1175 | 0x410000B8, 0x410000BC }; | 1175 | 0x410000B8, 0x410000BC }; |
| 1176 | |||
| 1177 | #define CRB_NIU_XG_PAUSE_CTL_P0 0x1 | ||
| 1178 | #define CRB_NIU_XG_PAUSE_CTL_P1 0x8 | ||
| 1179 | |||
| 1176 | #endif | 1180 | #endif |
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index fd14c7bfc62..f9e5b85e84d 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c | |||
| @@ -201,12 +201,12 @@ MODULE_PARM_DESC(ql2xmdcapmask, | |||
| 201 | "Set the Minidump driver capture mask level. " | 201 | "Set the Minidump driver capture mask level. " |
| 202 | "Default is 0x7F - Can be set to 0x3, 0x7, 0xF, 0x1F, 0x7F."); | 202 | "Default is 0x7F - Can be set to 0x3, 0x7, 0xF, 0x1F, 0x7F."); |
| 203 | 203 | ||
| 204 | int ql2xmdenable; | 204 | int ql2xmdenable = 1; |
| 205 | module_param(ql2xmdenable, int, S_IRUGO); | 205 | module_param(ql2xmdenable, int, S_IRUGO); |
| 206 | MODULE_PARM_DESC(ql2xmdenable, | 206 | MODULE_PARM_DESC(ql2xmdenable, |
| 207 | "Enable/disable MiniDump. " | 207 | "Enable/disable MiniDump. " |
| 208 | "0 (Default) - MiniDump disabled. " | 208 | "0 - MiniDump disabled. " |
| 209 | "1 - MiniDump enabled."); | 209 | "1 (Default) - MiniDump enabled."); |
| 210 | 210 | ||
| 211 | /* | 211 | /* |
| 212 | * SCSI host template entry points | 212 | * SCSI host template entry points |
| @@ -423,6 +423,7 @@ fail2: | |||
| 423 | qla25xx_delete_queues(vha); | 423 | qla25xx_delete_queues(vha); |
| 424 | destroy_workqueue(ha->wq); | 424 | destroy_workqueue(ha->wq); |
| 425 | ha->wq = NULL; | 425 | ha->wq = NULL; |
| 426 | vha->req = ha->req_q_map[0]; | ||
| 426 | fail: | 427 | fail: |
| 427 | ha->mqenable = 0; | 428 | ha->mqenable = 0; |
| 428 | kfree(ha->req_q_map); | 429 | kfree(ha->req_q_map); |
| @@ -814,49 +815,6 @@ qla2x00_wait_for_chip_reset(scsi_qla_host_t *vha) | |||
| 814 | return return_status; | 815 | return return_status; |
| 815 | } | 816 | } |
| 816 | 817 | ||
| 817 | /* | ||
| 818 | * qla2x00_wait_for_loop_ready | ||
| 819 | * Wait for MAX_LOOP_TIMEOUT(5 min) value for loop | ||
| 820 | * to be in LOOP_READY state. | ||
| 821 | * Input: | ||
| 822 | * ha - pointer to host adapter structure | ||
| 823 | * | ||
| 824 | * Note: | ||
| 825 | * Does context switching-Release SPIN_LOCK | ||
| 826 | * (if any) before calling this routine. | ||
| 827 | * | ||
| 828 | * | ||
| 829 | * Return: | ||
| 830 | * Success (LOOP_READY) : 0 | ||
| 831 | * Failed (LOOP_NOT_READY) : 1 | ||
| 832 | */ | ||
| 833 | static inline int | ||
| 834 | qla2x00_wait_for_loop_ready(scsi_qla_host_t *vha) | ||
| 835 | { | ||
| 836 | int return_status = QLA_SUCCESS; | ||
| 837 | unsigned long loop_timeout ; | ||
| 838 | struct qla_hw_data *ha = vha->hw; | ||
| 839 | scsi_qla_host_t *base_vha = pci_get_drvdata(ha->pdev); | ||
| 840 | |||
| 841 | /* wait for 5 min at the max for loop to be ready */ | ||
| 842 | loop_timeout = jiffies + (MAX_LOOP_TIMEOUT * HZ); | ||
| 843 | |||
| 844 | while ((!atomic_read(&base_vha->loop_down_timer) && | ||
| 845 | atomic_read(&base_vha->loop_state) == LOOP_DOWN) || | ||
| 846 | atomic_read(&base_vha->loop_state) != LOOP_READY) { | ||
| 847 | if (atomic_read(&base_vha->loop_state) == LOOP_DEAD) { | ||
| 848 | return_status = QLA_FUNCTION_FAILED; | ||
| 849 | break; | ||
| 850 | } | ||
| 851 | msleep(1000); | ||
| 852 | if (time_after_eq(jiffies, loop_timeout)) { | ||
| 853 | return_status = QLA_FUNCTION_FAILED; | ||
| 854 | break; | ||
| 855 | } | ||
| 856 | } | ||
| 857 | return (return_status); | ||
| 858 | } | ||
| 859 | |||
| 860 | static void | 818 | static void |
| 861 | sp_get(struct srb *sp) | 819 | sp_get(struct srb *sp) |
| 862 | { | 820 | { |
| @@ -1035,12 +993,6 @@ __qla2xxx_eh_generic_reset(char *name, enum nexus_wait_type type, | |||
| 1035 | "Wait for hba online failed for cmd=%p.\n", cmd); | 993 | "Wait for hba online failed for cmd=%p.\n", cmd); |
| 1036 | goto eh_reset_failed; | 994 | goto eh_reset_failed; |
| 1037 | } | 995 | } |
| 1038 | err = 1; | ||
| 1039 | if (qla2x00_wait_for_loop_ready(vha) != QLA_SUCCESS) { | ||
| 1040 | ql_log(ql_log_warn, vha, 0x800b, | ||
| 1041 | "Wait for loop ready failed for cmd=%p.\n", cmd); | ||
| 1042 | goto eh_reset_failed; | ||
| 1043 | } | ||
| 1044 | err = 2; | 996 | err = 2; |
| 1045 | if (do_reset(fcport, cmd->device->lun, cmd->request->cpu + 1) | 997 | if (do_reset(fcport, cmd->device->lun, cmd->request->cpu + 1) |
| 1046 | != QLA_SUCCESS) { | 998 | != QLA_SUCCESS) { |
| @@ -1137,10 +1089,9 @@ qla2xxx_eh_bus_reset(struct scsi_cmnd *cmd) | |||
| 1137 | goto eh_bus_reset_done; | 1089 | goto eh_bus_reset_done; |
| 1138 | } | 1090 | } |
| 1139 | 1091 | ||
| 1140 | if (qla2x00_wait_for_loop_ready(vha) == QLA_SUCCESS) { | 1092 | if (qla2x00_loop_reset(vha) == QLA_SUCCESS) |
| 1141 | if (qla2x00_loop_reset(vha) == QLA_SUCCESS) | 1093 | ret = SUCCESS; |
| 1142 | ret = SUCCESS; | 1094 | |
| 1143 | } | ||
| 1144 | if (ret == FAILED) | 1095 | if (ret == FAILED) |
| 1145 | goto eh_bus_reset_done; | 1096 | goto eh_bus_reset_done; |
| 1146 | 1097 | ||
| @@ -1206,15 +1157,6 @@ qla2xxx_eh_host_reset(struct scsi_cmnd *cmd) | |||
| 1206 | if (qla2x00_wait_for_reset_ready(vha) != QLA_SUCCESS) | 1157 | if (qla2x00_wait_for_reset_ready(vha) != QLA_SUCCESS) |
| 1207 | goto eh_host_reset_lock; | 1158 | goto eh_host_reset_lock; |
| 1208 | 1159 | ||
| 1209 | /* | ||
| 1210 | * Fixme-may be dpc thread is active and processing | ||
| 1211 | * loop_resync,so wait a while for it to | ||
| 1212 | * be completed and then issue big hammer.Otherwise | ||
| 1213 | * it may cause I/O failure as big hammer marks the | ||
| 1214 | * devices as lost kicking of the port_down_timer | ||
| 1215 | * while dpc is stuck for the mailbox to complete. | ||
| 1216 | */ | ||
| 1217 | qla2x00_wait_for_loop_ready(vha); | ||
| 1218 | if (vha != base_vha) { | 1160 | if (vha != base_vha) { |
| 1219 | if (qla2x00_vp_abort_isp(vha)) | 1161 | if (qla2x00_vp_abort_isp(vha)) |
| 1220 | goto eh_host_reset_lock; | 1162 | goto eh_host_reset_lock; |
| @@ -1297,16 +1239,13 @@ qla2x00_loop_reset(scsi_qla_host_t *vha) | |||
| 1297 | atomic_set(&vha->loop_state, LOOP_DOWN); | 1239 | atomic_set(&vha->loop_state, LOOP_DOWN); |
| 1298 | atomic_set(&vha->loop_down_timer, LOOP_DOWN_TIME); | 1240 | atomic_set(&vha->loop_down_timer, LOOP_DOWN_TIME); |
| 1299 | qla2x00_mark_all_devices_lost(vha, 0); | 1241 | qla2x00_mark_all_devices_lost(vha, 0); |
| 1300 | qla2x00_wait_for_loop_ready(vha); | ||
| 1301 | } | 1242 | } |
| 1302 | 1243 | ||
| 1303 | if (ha->flags.enable_lip_reset) { | 1244 | if (ha->flags.enable_lip_reset) { |
| 1304 | ret = qla2x00_lip_reset(vha); | 1245 | ret = qla2x00_lip_reset(vha); |
| 1305 | if (ret != QLA_SUCCESS) { | 1246 | if (ret != QLA_SUCCESS) |
| 1306 | ql_dbg(ql_dbg_taskm, vha, 0x802e, | 1247 | ql_dbg(ql_dbg_taskm, vha, 0x802e, |
| 1307 | "lip_reset failed (%d).\n", ret); | 1248 | "lip_reset failed (%d).\n", ret); |
| 1308 | } else | ||
| 1309 | qla2x00_wait_for_loop_ready(vha); | ||
| 1310 | } | 1249 | } |
| 1311 | 1250 | ||
| 1312 | /* Issue marker command only when we are going to start the I/O */ | 1251 | /* Issue marker command only when we are going to start the I/O */ |
| @@ -4070,13 +4009,8 @@ qla2xxx_pci_error_detected(struct pci_dev *pdev, pci_channel_state_t state) | |||
| 4070 | /* For ISP82XX complete any pending mailbox cmd */ | 4009 | /* For ISP82XX complete any pending mailbox cmd */ |
| 4071 | if (IS_QLA82XX(ha)) { | 4010 | if (IS_QLA82XX(ha)) { |
| 4072 | ha->flags.isp82xx_fw_hung = 1; | 4011 | ha->flags.isp82xx_fw_hung = 1; |
| 4073 | if (ha->flags.mbox_busy) { | 4012 | ql_dbg(ql_dbg_aer, vha, 0x9001, "Pci channel io frozen\n"); |
| 4074 | ha->flags.mbox_int = 1; | 4013 | qla82xx_clear_pending_mbx(vha); |
| 4075 | ql_dbg(ql_dbg_aer, vha, 0x9001, | ||
| 4076 | "Due to pci channel io frozen, doing premature " | ||
| 4077 | "completion of mbx command.\n"); | ||
| 4078 | complete(&ha->mbx_intr_comp); | ||
| 4079 | } | ||
| 4080 | } | 4014 | } |
| 4081 | qla2x00_free_irqs(vha); | 4015 | qla2x00_free_irqs(vha); |
| 4082 | pci_disable_device(pdev); | 4016 | pci_disable_device(pdev); |
diff --git a/drivers/scsi/qla2xxx/qla_version.h b/drivers/scsi/qla2xxx/qla_version.h index 13b6357c1fa..23f33a6d52d 100644 --- a/drivers/scsi/qla2xxx/qla_version.h +++ b/drivers/scsi/qla2xxx/qla_version.h | |||
| @@ -7,7 +7,7 @@ | |||
| 7 | /* | 7 | /* |
| 8 | * Driver version | 8 | * Driver version |
| 9 | */ | 9 | */ |
| 10 | #define QLA2XXX_VERSION "8.03.07.07-k" | 10 | #define QLA2XXX_VERSION "8.03.07.12-k" |
| 11 | 11 | ||
| 12 | #define QLA_DRIVER_MAJOR_VER 8 | 12 | #define QLA_DRIVER_MAJOR_VER 8 |
| 13 | #define QLA_DRIVER_MINOR_VER 3 | 13 | #define QLA_DRIVER_MINOR_VER 3 |
diff --git a/drivers/scsi/qla4xxx/ql4_def.h b/drivers/scsi/qla4xxx/ql4_def.h index ace637bf254..fd5edc6e166 100644 --- a/drivers/scsi/qla4xxx/ql4_def.h +++ b/drivers/scsi/qla4xxx/ql4_def.h | |||
| @@ -147,7 +147,7 @@ | |||
| 147 | #define ISCSI_ALIAS_SIZE 32 /* ISCSI Alias name size */ | 147 | #define ISCSI_ALIAS_SIZE 32 /* ISCSI Alias name size */ |
| 148 | #define ISCSI_NAME_SIZE 0xE0 /* ISCSI Name size */ | 148 | #define ISCSI_NAME_SIZE 0xE0 /* ISCSI Name size */ |
| 149 | 149 | ||
| 150 | #define QL4_SESS_RECOVERY_TMO 30 /* iSCSI session */ | 150 | #define QL4_SESS_RECOVERY_TMO 120 /* iSCSI session */ |
| 151 | /* recovery timeout */ | 151 | /* recovery timeout */ |
| 152 | 152 | ||
| 153 | #define LSDW(x) ((u32)((u64)(x))) | 153 | #define LSDW(x) ((u32)((u64)(x))) |
| @@ -173,6 +173,8 @@ | |||
| 173 | #define ISNS_DEREG_TOV 5 | 173 | #define ISNS_DEREG_TOV 5 |
| 174 | #define HBA_ONLINE_TOV 30 | 174 | #define HBA_ONLINE_TOV 30 |
| 175 | #define DISABLE_ACB_TOV 30 | 175 | #define DISABLE_ACB_TOV 30 |
| 176 | #define IP_CONFIG_TOV 30 | ||
| 177 | #define LOGIN_TOV 12 | ||
| 176 | 178 | ||
| 177 | #define MAX_RESET_HA_RETRIES 2 | 179 | #define MAX_RESET_HA_RETRIES 2 |
| 178 | 180 | ||
| @@ -240,6 +242,45 @@ struct ddb_entry { | |||
| 240 | 242 | ||
| 241 | uint16_t fw_ddb_index; /* DDB firmware index */ | 243 | uint16_t fw_ddb_index; /* DDB firmware index */ |
| 242 | uint32_t fw_ddb_device_state; /* F/W Device State -- see ql4_fw.h */ | 244 | uint32_t fw_ddb_device_state; /* F/W Device State -- see ql4_fw.h */ |
| 245 | uint16_t ddb_type; | ||
| 246 | #define FLASH_DDB 0x01 | ||
| 247 | |||
| 248 | struct dev_db_entry fw_ddb_entry; | ||
| 249 | int (*unblock_sess)(struct iscsi_cls_session *cls_session); | ||
| 250 | int (*ddb_change)(struct scsi_qla_host *ha, uint32_t fw_ddb_index, | ||
| 251 | struct ddb_entry *ddb_entry, uint32_t state); | ||
| 252 | |||
| 253 | /* Driver Re-login */ | ||
| 254 | unsigned long flags; /* DDB Flags */ | ||
| 255 | uint16_t default_relogin_timeout; /* Max time to wait for | ||
| 256 | * relogin to complete */ | ||
| 257 | atomic_t retry_relogin_timer; /* Min Time between relogins | ||
| 258 | * (4000 only) */ | ||
| 259 | atomic_t relogin_timer; /* Max Time to wait for | ||
| 260 | * relogin to complete */ | ||
| 261 | atomic_t relogin_retry_count; /* Num of times relogin has been | ||
| 262 | * retried */ | ||
| 263 | uint32_t default_time2wait; /* Default Min time between | ||
| 264 | * relogins (+aens) */ | ||
| 265 | |||
| 266 | }; | ||
| 267 | |||
| 268 | struct qla_ddb_index { | ||
| 269 | struct list_head list; | ||
| 270 | uint16_t fw_ddb_idx; | ||
| 271 | struct dev_db_entry fw_ddb; | ||
| 272 | }; | ||
| 273 | |||
| 274 | #define DDB_IPADDR_LEN 64 | ||
| 275 | |||
| 276 | struct ql4_tuple_ddb { | ||
| 277 | int port; | ||
| 278 | int tpgt; | ||
| 279 | char ip_addr[DDB_IPADDR_LEN]; | ||
| 280 | char iscsi_name[ISCSI_NAME_SIZE]; | ||
| 281 | uint16_t options; | ||
| 282 | #define DDB_OPT_IPV6 0x0e0e | ||
| 283 | #define DDB_OPT_IPV4 0x0f0f | ||
| 243 | }; | 284 | }; |
| 244 | 285 | ||
| 245 | /* | 286 | /* |
| @@ -411,7 +452,7 @@ struct scsi_qla_host { | |||
| 411 | #define AF_FW_RECOVERY 19 /* 0x00080000 */ | 452 | #define AF_FW_RECOVERY 19 /* 0x00080000 */ |
| 412 | #define AF_EEH_BUSY 20 /* 0x00100000 */ | 453 | #define AF_EEH_BUSY 20 /* 0x00100000 */ |
| 413 | #define AF_PCI_CHANNEL_IO_PERM_FAILURE 21 /* 0x00200000 */ | 454 | #define AF_PCI_CHANNEL_IO_PERM_FAILURE 21 /* 0x00200000 */ |
| 414 | 455 | #define AF_BUILD_DDB_LIST 22 /* 0x00400000 */ | |
| 415 | unsigned long dpc_flags; | 456 | unsigned long dpc_flags; |
| 416 | 457 | ||
| 417 | #define DPC_RESET_HA 1 /* 0x00000002 */ | 458 | #define DPC_RESET_HA 1 /* 0x00000002 */ |
| @@ -604,6 +645,7 @@ struct scsi_qla_host { | |||
| 604 | uint16_t bootload_minor; | 645 | uint16_t bootload_minor; |
| 605 | uint16_t bootload_patch; | 646 | uint16_t bootload_patch; |
| 606 | uint16_t bootload_build; | 647 | uint16_t bootload_build; |
| 648 | uint16_t def_timeout; /* Default login timeout */ | ||
| 607 | 649 | ||
| 608 | uint32_t flash_state; | 650 | uint32_t flash_state; |
| 609 | #define QLFLASH_WAITING 0 | 651 | #define QLFLASH_WAITING 0 |
| @@ -623,6 +665,11 @@ struct scsi_qla_host { | |||
| 623 | uint16_t iscsi_pci_func_cnt; | 665 | uint16_t iscsi_pci_func_cnt; |
| 624 | uint8_t model_name[16]; | 666 | uint8_t model_name[16]; |
| 625 | struct completion disable_acb_comp; | 667 | struct completion disable_acb_comp; |
| 668 | struct dma_pool *fw_ddb_dma_pool; | ||
| 669 | #define DDB_DMA_BLOCK_SIZE 512 | ||
| 670 | uint16_t pri_ddb_idx; | ||
| 671 | uint16_t sec_ddb_idx; | ||
| 672 | int is_reset; | ||
| 626 | }; | 673 | }; |
| 627 | 674 | ||
| 628 | struct ql4_task_data { | 675 | struct ql4_task_data { |
| @@ -835,6 +882,10 @@ static inline int ql4xxx_reset_active(struct scsi_qla_host *ha) | |||
| 835 | /*---------------------------------------------------------------------------*/ | 882 | /*---------------------------------------------------------------------------*/ |
| 836 | 883 | ||
| 837 | /* Defines for qla4xxx_initialize_adapter() and qla4xxx_recover_adapter() */ | 884 | /* Defines for qla4xxx_initialize_adapter() and qla4xxx_recover_adapter() */ |
| 885 | |||
| 886 | #define INIT_ADAPTER 0 | ||
| 887 | #define RESET_ADAPTER 1 | ||
| 888 | |||
| 838 | #define PRESERVE_DDB_LIST 0 | 889 | #define PRESERVE_DDB_LIST 0 |
| 839 | #define REBUILD_DDB_LIST 1 | 890 | #define REBUILD_DDB_LIST 1 |
| 840 | 891 | ||
diff --git a/drivers/scsi/qla4xxx/ql4_fw.h b/drivers/scsi/qla4xxx/ql4_fw.h index cbd5a20dbbd..4ac07f88252 100644 --- a/drivers/scsi/qla4xxx/ql4_fw.h +++ b/drivers/scsi/qla4xxx/ql4_fw.h | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | #define MAX_PRST_DEV_DB_ENTRIES 64 | 12 | #define MAX_PRST_DEV_DB_ENTRIES 64 |
| 13 | #define MIN_DISC_DEV_DB_ENTRY MAX_PRST_DEV_DB_ENTRIES | 13 | #define MIN_DISC_DEV_DB_ENTRY MAX_PRST_DEV_DB_ENTRIES |
| 14 | #define MAX_DEV_DB_ENTRIES 512 | 14 | #define MAX_DEV_DB_ENTRIES 512 |
| 15 | #define MAX_DEV_DB_ENTRIES_40XX 256 | ||
| 15 | 16 | ||
| 16 | /************************************************************************* | 17 | /************************************************************************* |
| 17 | * | 18 | * |
| @@ -604,6 +605,13 @@ struct addr_ctrl_blk { | |||
| 604 | uint8_t res14[140]; /* 274-2FF */ | 605 | uint8_t res14[140]; /* 274-2FF */ |
| 605 | }; | 606 | }; |
| 606 | 607 | ||
| 608 | #define IP_ADDR_COUNT 4 /* Total 4 IP address supported in one interface | ||
| 609 | * One IPv4, one IPv6 link local and 2 IPv6 | ||
| 610 | */ | ||
| 611 | |||
| 612 | #define IP_STATE_MASK 0x0F000000 | ||
| 613 | #define IP_STATE_SHIFT 24 | ||
| 614 | |||
| 607 | struct init_fw_ctrl_blk { | 615 | struct init_fw_ctrl_blk { |
| 608 | struct addr_ctrl_blk pri; | 616 | struct addr_ctrl_blk pri; |
| 609 | /* struct addr_ctrl_blk sec;*/ | 617 | /* struct addr_ctrl_blk sec;*/ |
diff --git a/drivers/scsi/qla4xxx/ql4_glbl.h b/drivers/scsi/qla4xxx/ql4_glbl.h index 160db9d5ea2..d0dd4b33020 100644 --- a/drivers/scsi/qla4xxx/ql4_glbl.h +++ b/drivers/scsi/qla4xxx/ql4_glbl.h | |||
| @@ -13,7 +13,7 @@ struct iscsi_cls_conn; | |||
| 13 | int qla4xxx_hw_reset(struct scsi_qla_host *ha); | 13 | int qla4xxx_hw_reset(struct scsi_qla_host *ha); |
| 14 | int ql4xxx_lock_drvr_wait(struct scsi_qla_host *a); | 14 | int ql4xxx_lock_drvr_wait(struct scsi_qla_host *a); |
| 15 | int qla4xxx_send_command_to_isp(struct scsi_qla_host *ha, struct srb *srb); | 15 | int qla4xxx_send_command_to_isp(struct scsi_qla_host *ha, struct srb *srb); |
| 16 | int qla4xxx_initialize_adapter(struct scsi_qla_host *ha); | 16 | int qla4xxx_initialize_adapter(struct scsi_qla_host *ha, int is_reset); |
| 17 | int qla4xxx_soft_reset(struct scsi_qla_host *ha); | 17 | int qla4xxx_soft_reset(struct scsi_qla_host *ha); |
| 18 | irqreturn_t qla4xxx_intr_handler(int irq, void *dev_id); | 18 | irqreturn_t qla4xxx_intr_handler(int irq, void *dev_id); |
| 19 | 19 | ||
| @@ -153,10 +153,13 @@ int qla4xxx_req_ddb_entry(struct scsi_qla_host *ha, uint32_t fw_ddb_index, | |||
| 153 | uint32_t *mbx_sts); | 153 | uint32_t *mbx_sts); |
| 154 | int qla4xxx_clear_ddb_entry(struct scsi_qla_host *ha, uint32_t fw_ddb_index); | 154 | int qla4xxx_clear_ddb_entry(struct scsi_qla_host *ha, uint32_t fw_ddb_index); |
| 155 | int qla4xxx_send_passthru0(struct iscsi_task *task); | 155 | int qla4xxx_send_passthru0(struct iscsi_task *task); |
| 156 | void qla4xxx_free_ddb_index(struct scsi_qla_host *ha); | ||
| 156 | int qla4xxx_get_mgmt_data(struct scsi_qla_host *ha, uint16_t fw_ddb_index, | 157 | int qla4xxx_get_mgmt_data(struct scsi_qla_host *ha, uint16_t fw_ddb_index, |
| 157 | uint16_t stats_size, dma_addr_t stats_dma); | 158 | uint16_t stats_size, dma_addr_t stats_dma); |
| 158 | void qla4xxx_update_session_conn_param(struct scsi_qla_host *ha, | 159 | void qla4xxx_update_session_conn_param(struct scsi_qla_host *ha, |
| 159 | struct ddb_entry *ddb_entry); | 160 | struct ddb_entry *ddb_entry); |
| 161 | void qla4xxx_update_session_conn_fwddb_param(struct scsi_qla_host *ha, | ||
| 162 | struct ddb_entry *ddb_entry); | ||
| 160 | int qla4xxx_bootdb_by_index(struct scsi_qla_host *ha, | 163 | int qla4xxx_bootdb_by_index(struct scsi_qla_host *ha, |
| 161 | struct dev_db_entry *fw_ddb_entry, | 164 | struct dev_db_entry *fw_ddb_entry, |
| 162 | dma_addr_t fw_ddb_entry_dma, uint16_t ddb_index); | 165 | dma_addr_t fw_ddb_entry_dma, uint16_t ddb_index); |
| @@ -169,11 +172,22 @@ int qla4xxx_set_nvram(struct scsi_qla_host *ha, dma_addr_t nvram_dma, | |||
| 169 | int qla4xxx_restore_factory_defaults(struct scsi_qla_host *ha, | 172 | int qla4xxx_restore_factory_defaults(struct scsi_qla_host *ha, |
| 170 | uint32_t region, uint32_t field0, | 173 | uint32_t region, uint32_t field0, |
| 171 | uint32_t field1); | 174 | uint32_t field1); |
| 175 | int qla4xxx_get_ddb_index(struct scsi_qla_host *ha, uint16_t *ddb_index); | ||
| 176 | void qla4xxx_login_flash_ddb(struct iscsi_cls_session *cls_session); | ||
| 177 | int qla4xxx_unblock_ddb(struct iscsi_cls_session *cls_session); | ||
| 178 | int qla4xxx_unblock_flash_ddb(struct iscsi_cls_session *cls_session); | ||
| 179 | int qla4xxx_flash_ddb_change(struct scsi_qla_host *ha, uint32_t fw_ddb_index, | ||
| 180 | struct ddb_entry *ddb_entry, uint32_t state); | ||
| 181 | int qla4xxx_ddb_change(struct scsi_qla_host *ha, uint32_t fw_ddb_index, | ||
| 182 | struct ddb_entry *ddb_entry, uint32_t state); | ||
| 183 | void qla4xxx_build_ddb_list(struct scsi_qla_host *ha, int is_reset); | ||
| 172 | 184 | ||
| 173 | /* BSG Functions */ | 185 | /* BSG Functions */ |
| 174 | int qla4xxx_bsg_request(struct bsg_job *bsg_job); | 186 | int qla4xxx_bsg_request(struct bsg_job *bsg_job); |
| 175 | int qla4xxx_process_vendor_specific(struct bsg_job *bsg_job); | 187 | int qla4xxx_process_vendor_specific(struct bsg_job *bsg_job); |
| 176 | 188 | ||
| 189 | void qla4xxx_arm_relogin_timer(struct ddb_entry *ddb_entry); | ||
| 190 | |||
| 177 | extern int ql4xextended_error_logging; | 191 | extern int ql4xextended_error_logging; |
| 178 | extern int ql4xdontresethba; | 192 | extern int ql4xdontresethba; |
| 179 | extern int ql4xenablemsix; | 193 | extern int ql4xenablemsix; |
diff --git a/drivers/scsi/qla4xxx/ql4_init.c b/drivers/scsi/qla4xxx/ql4_init.c index 3075fbaef55..1bdfa8120ac 100644 --- a/drivers/scsi/qla4xxx/ql4_init.c +++ b/drivers/scsi/qla4xxx/ql4_init.c | |||
| @@ -773,22 +773,24 @@ int qla4xxx_start_firmware(struct scsi_qla_host *ha) | |||
| 773 | * be freed so that when login happens from user space there are free DDB | 773 | * be freed so that when login happens from user space there are free DDB |
| 774 | * indices available. | 774 | * indices available. |
| 775 | **/ | 775 | **/ |
| 776 | static void qla4xxx_free_ddb_index(struct scsi_qla_host *ha) | 776 | void qla4xxx_free_ddb_index(struct scsi_qla_host *ha) |
| 777 | { | 777 | { |
| 778 | int max_ddbs; | 778 | int max_ddbs; |
| 779 | int ret; | 779 | int ret; |
| 780 | uint32_t idx = 0, next_idx = 0; | 780 | uint32_t idx = 0, next_idx = 0; |
| 781 | uint32_t state = 0, conn_err = 0; | 781 | uint32_t state = 0, conn_err = 0; |
| 782 | 782 | ||
| 783 | max_ddbs = is_qla40XX(ha) ? MAX_PRST_DEV_DB_ENTRIES : | 783 | max_ddbs = is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX : |
| 784 | MAX_DEV_DB_ENTRIES; | 784 | MAX_DEV_DB_ENTRIES; |
| 785 | 785 | ||
| 786 | for (idx = 0; idx < max_ddbs; idx = next_idx) { | 786 | for (idx = 0; idx < max_ddbs; idx = next_idx) { |
| 787 | ret = qla4xxx_get_fwddb_entry(ha, idx, NULL, 0, NULL, | 787 | ret = qla4xxx_get_fwddb_entry(ha, idx, NULL, 0, NULL, |
| 788 | &next_idx, &state, &conn_err, | 788 | &next_idx, &state, &conn_err, |
| 789 | NULL, NULL); | 789 | NULL, NULL); |
| 790 | if (ret == QLA_ERROR) | 790 | if (ret == QLA_ERROR) { |
| 791 | next_idx++; | ||
| 791 | continue; | 792 | continue; |
| 793 | } | ||
| 792 | if (state == DDB_DS_NO_CONNECTION_ACTIVE || | 794 | if (state == DDB_DS_NO_CONNECTION_ACTIVE || |
| 793 | state == DDB_DS_SESSION_FAILED) { | 795 | state == DDB_DS_SESSION_FAILED) { |
| 794 | DEBUG2(ql4_printk(KERN_INFO, ha, | 796 | DEBUG2(ql4_printk(KERN_INFO, ha, |
| @@ -804,7 +806,6 @@ static void qla4xxx_free_ddb_index(struct scsi_qla_host *ha) | |||
| 804 | } | 806 | } |
| 805 | } | 807 | } |
| 806 | 808 | ||
| 807 | |||
| 808 | /** | 809 | /** |
| 809 | * qla4xxx_initialize_adapter - initiailizes hba | 810 | * qla4xxx_initialize_adapter - initiailizes hba |
| 810 | * @ha: Pointer to host adapter structure. | 811 | * @ha: Pointer to host adapter structure. |
| @@ -812,7 +813,7 @@ static void qla4xxx_free_ddb_index(struct scsi_qla_host *ha) | |||
| 812 | * This routine parforms all of the steps necessary to initialize the adapter. | 813 | * This routine parforms all of the steps necessary to initialize the adapter. |
| 813 | * | 814 | * |
| 814 | **/ | 815 | **/ |
| 815 | int qla4xxx_initialize_adapter(struct scsi_qla_host *ha) | 816 | int qla4xxx_initialize_adapter(struct scsi_qla_host *ha, int is_reset) |
| 816 | { | 817 | { |
| 817 | int status = QLA_ERROR; | 818 | int status = QLA_ERROR; |
| 818 | 819 | ||
| @@ -840,7 +841,8 @@ int qla4xxx_initialize_adapter(struct scsi_qla_host *ha) | |||
| 840 | if (status == QLA_ERROR) | 841 | if (status == QLA_ERROR) |
| 841 | goto exit_init_hba; | 842 | goto exit_init_hba; |
| 842 | 843 | ||
| 843 | qla4xxx_free_ddb_index(ha); | 844 | if (is_reset == RESET_ADAPTER) |
| 845 | qla4xxx_build_ddb_list(ha, is_reset); | ||
| 844 | 846 | ||
| 845 | set_bit(AF_ONLINE, &ha->flags); | 847 | set_bit(AF_ONLINE, &ha->flags); |
| 846 | exit_init_hba: | 848 | exit_init_hba: |
| @@ -855,38 +857,12 @@ exit_init_hba: | |||
| 855 | return status; | 857 | return status; |
| 856 | } | 858 | } |
| 857 | 859 | ||
| 858 | /** | 860 | int qla4xxx_ddb_change(struct scsi_qla_host *ha, uint32_t fw_ddb_index, |
| 859 | * qla4xxx_process_ddb_changed - process ddb state change | 861 | struct ddb_entry *ddb_entry, uint32_t state) |
| 860 | * @ha - Pointer to host adapter structure. | ||
| 861 | * @fw_ddb_index - Firmware's device database index | ||
| 862 | * @state - Device state | ||
| 863 | * | ||
| 864 | * This routine processes a Decive Database Changed AEN Event. | ||
| 865 | **/ | ||
| 866 | int qla4xxx_process_ddb_changed(struct scsi_qla_host *ha, uint32_t fw_ddb_index, | ||
| 867 | uint32_t state, uint32_t conn_err) | ||
| 868 | { | 862 | { |
| 869 | struct ddb_entry * ddb_entry; | ||
| 870 | uint32_t old_fw_ddb_device_state; | 863 | uint32_t old_fw_ddb_device_state; |
| 871 | int status = QLA_ERROR; | 864 | int status = QLA_ERROR; |
| 872 | 865 | ||
| 873 | /* check for out of range index */ | ||
| 874 | if (fw_ddb_index >= MAX_DDB_ENTRIES) | ||
| 875 | goto exit_ddb_event; | ||
| 876 | |||
| 877 | /* Get the corresponging ddb entry */ | ||
| 878 | ddb_entry = qla4xxx_lookup_ddb_by_fw_index(ha, fw_ddb_index); | ||
| 879 | /* Device does not currently exist in our database. */ | ||
| 880 | if (ddb_entry == NULL) { | ||
| 881 | ql4_printk(KERN_ERR, ha, "%s: No ddb_entry at FW index [%d]\n", | ||
| 882 | __func__, fw_ddb_index); | ||
| 883 | |||
| 884 | if (state == DDB_DS_NO_CONNECTION_ACTIVE) | ||
| 885 | clear_bit(fw_ddb_index, ha->ddb_idx_map); | ||
| 886 | |||
| 887 | goto exit_ddb_event; | ||
| 888 | } | ||
| 889 | |||
| 890 | old_fw_ddb_device_state = ddb_entry->fw_ddb_device_state; | 866 | old_fw_ddb_device_state = ddb_entry->fw_ddb_device_state; |
| 891 | DEBUG2(ql4_printk(KERN_INFO, ha, | 867 | DEBUG2(ql4_printk(KERN_INFO, ha, |
| 892 | "%s: DDB - old state = 0x%x, new state = 0x%x for " | 868 | "%s: DDB - old state = 0x%x, new state = 0x%x for " |
| @@ -900,9 +876,7 @@ int qla4xxx_process_ddb_changed(struct scsi_qla_host *ha, uint32_t fw_ddb_index, | |||
| 900 | switch (state) { | 876 | switch (state) { |
| 901 | case DDB_DS_SESSION_ACTIVE: | 877 | case DDB_DS_SESSION_ACTIVE: |
| 902 | case DDB_DS_DISCOVERY: | 878 | case DDB_DS_DISCOVERY: |
| 903 | iscsi_conn_start(ddb_entry->conn); | 879 | ddb_entry->unblock_sess(ddb_entry->sess); |
| 904 | iscsi_conn_login_event(ddb_entry->conn, | ||
| 905 | ISCSI_CONN_STATE_LOGGED_IN); | ||
| 906 | qla4xxx_update_session_conn_param(ha, ddb_entry); | 880 | qla4xxx_update_session_conn_param(ha, ddb_entry); |
| 907 | status = QLA_SUCCESS; | 881 | status = QLA_SUCCESS; |
| 908 | break; | 882 | break; |
| @@ -936,9 +910,7 @@ int qla4xxx_process_ddb_changed(struct scsi_qla_host *ha, uint32_t fw_ddb_index, | |||
| 936 | switch (state) { | 910 | switch (state) { |
| 937 | case DDB_DS_SESSION_ACTIVE: | 911 | case DDB_DS_SESSION_ACTIVE: |
| 938 | case DDB_DS_DISCOVERY: | 912 | case DDB_DS_DISCOVERY: |
| 939 | iscsi_conn_start(ddb_entry->conn); | 913 | ddb_entry->unblock_sess(ddb_entry->sess); |
| 940 | iscsi_conn_login_event(ddb_entry->conn, | ||
| 941 | ISCSI_CONN_STATE_LOGGED_IN); | ||
| 942 | qla4xxx_update_session_conn_param(ha, ddb_entry); | 914 | qla4xxx_update_session_conn_param(ha, ddb_entry); |
| 943 | status = QLA_SUCCESS; | 915 | status = QLA_SUCCESS; |
| 944 | break; | 916 | break; |
| @@ -954,7 +926,198 @@ int qla4xxx_process_ddb_changed(struct scsi_qla_host *ha, uint32_t fw_ddb_index, | |||
| 954 | __func__)); | 926 | __func__)); |
| 955 | break; | 927 | break; |
| 956 | } | 928 | } |
| 929 | return status; | ||
| 930 | } | ||
| 931 | |||
| 932 | void qla4xxx_arm_relogin_timer(struct ddb_entry *ddb_entry) | ||
| 933 | { | ||
| 934 | /* | ||
| 935 | * This triggers a relogin. After the relogin_timer | ||
| 936 | * expires, the relogin gets scheduled. We must wait a | ||
| 937 | * minimum amount of time since receiving an 0x8014 AEN | ||
| 938 | * with failed device_state or a logout response before | ||
| 939 | * we can issue another relogin. | ||
| 940 | * | ||
| 941 | * Firmware pads this timeout: (time2wait +1). | ||
| 942 | * Driver retry to login should be longer than F/W. | ||
| 943 | * Otherwise F/W will fail | ||
| 944 | * set_ddb() mbx cmd with 0x4005 since it still | ||
| 945 | * counting down its time2wait. | ||
| 946 | */ | ||
| 947 | atomic_set(&ddb_entry->relogin_timer, 0); | ||
| 948 | atomic_set(&ddb_entry->retry_relogin_timer, | ||
| 949 | ddb_entry->default_time2wait + 4); | ||
| 950 | |||
| 951 | } | ||
| 952 | |||
| 953 | int qla4xxx_flash_ddb_change(struct scsi_qla_host *ha, uint32_t fw_ddb_index, | ||
| 954 | struct ddb_entry *ddb_entry, uint32_t state) | ||
| 955 | { | ||
| 956 | uint32_t old_fw_ddb_device_state; | ||
| 957 | int status = QLA_ERROR; | ||
| 958 | |||
| 959 | old_fw_ddb_device_state = ddb_entry->fw_ddb_device_state; | ||
| 960 | DEBUG2(ql4_printk(KERN_INFO, ha, | ||
| 961 | "%s: DDB - old state = 0x%x, new state = 0x%x for " | ||
| 962 | "index [%d]\n", __func__, | ||
| 963 | ddb_entry->fw_ddb_device_state, state, fw_ddb_index)); | ||
| 964 | |||
| 965 | ddb_entry->fw_ddb_device_state = state; | ||
| 966 | |||
| 967 | switch (old_fw_ddb_device_state) { | ||
| 968 | case DDB_DS_LOGIN_IN_PROCESS: | ||
| 969 | case DDB_DS_NO_CONNECTION_ACTIVE: | ||
| 970 | switch (state) { | ||
| 971 | case DDB_DS_SESSION_ACTIVE: | ||
| 972 | ddb_entry->unblock_sess(ddb_entry->sess); | ||
| 973 | qla4xxx_update_session_conn_fwddb_param(ha, ddb_entry); | ||
| 974 | status = QLA_SUCCESS; | ||
| 975 | break; | ||
| 976 | case DDB_DS_SESSION_FAILED: | ||
| 977 | iscsi_block_session(ddb_entry->sess); | ||
| 978 | if (!test_bit(DF_RELOGIN, &ddb_entry->flags)) | ||
| 979 | qla4xxx_arm_relogin_timer(ddb_entry); | ||
| 980 | status = QLA_SUCCESS; | ||
| 981 | break; | ||
| 982 | } | ||
| 983 | break; | ||
| 984 | case DDB_DS_SESSION_ACTIVE: | ||
| 985 | switch (state) { | ||
| 986 | case DDB_DS_SESSION_FAILED: | ||
| 987 | iscsi_block_session(ddb_entry->sess); | ||
| 988 | if (!test_bit(DF_RELOGIN, &ddb_entry->flags)) | ||
| 989 | qla4xxx_arm_relogin_timer(ddb_entry); | ||
| 990 | status = QLA_SUCCESS; | ||
| 991 | break; | ||
| 992 | } | ||
| 993 | break; | ||
| 994 | case DDB_DS_SESSION_FAILED: | ||
| 995 | switch (state) { | ||
| 996 | case DDB_DS_SESSION_ACTIVE: | ||
| 997 | ddb_entry->unblock_sess(ddb_entry->sess); | ||
| 998 | qla4xxx_update_session_conn_fwddb_param(ha, ddb_entry); | ||
| 999 | status = QLA_SUCCESS; | ||
| 1000 | break; | ||
| 1001 | case DDB_DS_SESSION_FAILED: | ||
| 1002 | if (!test_bit(DF_RELOGIN, &ddb_entry->flags)) | ||
| 1003 | qla4xxx_arm_relogin_timer(ddb_entry); | ||
| 1004 | status = QLA_SUCCESS; | ||
| 1005 | break; | ||
| 1006 | } | ||
| 1007 | break; | ||
| 1008 | default: | ||
| 1009 | DEBUG2(ql4_printk(KERN_INFO, ha, "%s: Unknown Event\n", | ||
| 1010 | __func__)); | ||
| 1011 | break; | ||
| 1012 | } | ||
| 1013 | return status; | ||
| 1014 | } | ||
| 1015 | |||
| 1016 | /** | ||
| 1017 | * qla4xxx_process_ddb_changed - process ddb state change | ||
| 1018 | * @ha - Pointer to host adapter structure. | ||
| 1019 | * @fw_ddb_index - Firmware's device database index | ||
| 1020 | * @state - Device state | ||
| 1021 | * | ||
| 1022 | * This routine processes a Decive Database Changed AEN Event. | ||
| 1023 | **/ | ||
| 1024 | int qla4xxx_process_ddb_changed(struct scsi_qla_host *ha, | ||
| 1025 | uint32_t fw_ddb_index, | ||
| 1026 | uint32_t state, uint32_t conn_err) | ||
| 1027 | { | ||
| 1028 | struct ddb_entry *ddb_entry; | ||
| 1029 | int status = QLA_ERROR; | ||
| 1030 | |||
| 1031 | /* check for out of range index */ | ||
| 1032 | if (fw_ddb_index >= MAX_DDB_ENTRIES) | ||
| 1033 | goto exit_ddb_event; | ||
| 1034 | |||
| 1035 | /* Get the corresponging ddb entry */ | ||
| 1036 | ddb_entry = qla4xxx_lookup_ddb_by_fw_index(ha, fw_ddb_index); | ||
| 1037 | /* Device does not currently exist in our database. */ | ||
| 1038 | if (ddb_entry == NULL) { | ||
| 1039 | ql4_printk(KERN_ERR, ha, "%s: No ddb_entry at FW index [%d]\n", | ||
| 1040 | __func__, fw_ddb_index); | ||
| 1041 | |||
| 1042 | if (state == DDB_DS_NO_CONNECTION_ACTIVE) | ||
| 1043 | clear_bit(fw_ddb_index, ha->ddb_idx_map); | ||
| 1044 | |||
| 1045 | goto exit_ddb_event; | ||
| 1046 | } | ||
| 1047 | |||
| 1048 | ddb_entry->ddb_change(ha, fw_ddb_index, ddb_entry, state); | ||
| 957 | 1049 | ||
| 958 | exit_ddb_event: | 1050 | exit_ddb_event: |
| 959 | return status; | 1051 | return status; |
| 960 | } | 1052 | } |
| 1053 | |||
| 1054 | /** | ||
| 1055 | * qla4xxx_login_flash_ddb - Login to target (DDB) | ||
| 1056 | * @cls_session: Pointer to the session to login | ||
| 1057 | * | ||
| 1058 | * This routine logins to the target. | ||
| 1059 | * Issues setddb and conn open mbx | ||
| 1060 | **/ | ||
| 1061 | void qla4xxx_login_flash_ddb(struct iscsi_cls_session *cls_session) | ||
| 1062 | { | ||
| 1063 | struct iscsi_session *sess; | ||
| 1064 | struct ddb_entry *ddb_entry; | ||
| 1065 | struct scsi_qla_host *ha; | ||
| 1066 | struct dev_db_entry *fw_ddb_entry = NULL; | ||
| 1067 | dma_addr_t fw_ddb_dma; | ||
| 1068 | uint32_t mbx_sts = 0; | ||
| 1069 | int ret; | ||
| 1070 | |||
| 1071 | sess = cls_session->dd_data; | ||
| 1072 | ddb_entry = sess->dd_data; | ||
| 1073 | ha = ddb_entry->ha; | ||
| 1074 | |||
| 1075 | if (!test_bit(AF_LINK_UP, &ha->flags)) | ||
| 1076 | return; | ||
| 1077 | |||
| 1078 | if (ddb_entry->ddb_type != FLASH_DDB) { | ||
| 1079 | DEBUG2(ql4_printk(KERN_INFO, ha, | ||
| 1080 | "Skipping login to non FLASH DB")); | ||
| 1081 | goto exit_login; | ||
| 1082 | } | ||
| 1083 | |||
| 1084 | fw_ddb_entry = dma_pool_alloc(ha->fw_ddb_dma_pool, GFP_KERNEL, | ||
| 1085 | &fw_ddb_dma); | ||
| 1086 | if (fw_ddb_entry == NULL) { | ||
| 1087 | DEBUG2(ql4_printk(KERN_ERR, ha, "Out of memory\n")); | ||
| 1088 | goto exit_login; | ||
| 1089 | } | ||
| 1090 | |||
| 1091 | if (ddb_entry->fw_ddb_index == INVALID_ENTRY) { | ||
| 1092 | ret = qla4xxx_get_ddb_index(ha, &ddb_entry->fw_ddb_index); | ||
| 1093 | if (ret == QLA_ERROR) | ||
| 1094 | goto exit_login; | ||
| 1095 | |||
| 1096 | ha->fw_ddb_index_map[ddb_entry->fw_ddb_index] = ddb_entry; | ||
| 1097 | ha->tot_ddbs++; | ||
| 1098 | } | ||
| 1099 | |||
| 1100 | memcpy(fw_ddb_entry, &ddb_entry->fw_ddb_entry, | ||
| 1101 | sizeof(struct dev_db_entry)); | ||
| 1102 | ddb_entry->sess->target_id = ddb_entry->fw_ddb_index; | ||
| 1103 | |||
| 1104 | ret = qla4xxx_set_ddb_entry(ha, ddb_entry->fw_ddb_index, | ||
| 1105 | fw_ddb_dma, &mbx_sts); | ||
| 1106 | if (ret == QLA_ERROR) { | ||
| 1107 | DEBUG2(ql4_printk(KERN_ERR, ha, "Set DDB failed\n")); | ||
| 1108 | goto exit_login; | ||
| 1109 | } | ||
| 1110 | |||
| 1111 | ddb_entry->fw_ddb_device_state = DDB_DS_LOGIN_IN_PROCESS; | ||
| 1112 | ret = qla4xxx_conn_open(ha, ddb_entry->fw_ddb_index); | ||
| 1113 | if (ret == QLA_ERROR) { | ||
| 1114 | ql4_printk(KERN_ERR, ha, "%s: Login failed: %s\n", __func__, | ||
| 1115 | sess->targetname); | ||
| 1116 | goto exit_login; | ||
| 1117 | } | ||
| 1118 | |||
| 1119 | exit_login: | ||
| 1120 | if (fw_ddb_entry) | ||
| 1121 | dma_pool_free(ha->fw_ddb_dma_pool, fw_ddb_entry, fw_ddb_dma); | ||
| 1122 | } | ||
| 1123 | |||
diff --git a/drivers/scsi/qla4xxx/ql4_mbx.c b/drivers/scsi/qla4xxx/ql4_mbx.c index 4c2b8487039..c2593782fbb 100644 --- a/drivers/scsi/qla4xxx/ql4_mbx.c +++ b/drivers/scsi/qla4xxx/ql4_mbx.c | |||
| @@ -41,6 +41,16 @@ int qla4xxx_mailbox_command(struct scsi_qla_host *ha, uint8_t inCount, | |||
| 41 | return status; | 41 | return status; |
| 42 | } | 42 | } |
| 43 | 43 | ||
| 44 | if (is_qla40XX(ha)) { | ||
| 45 | if (test_bit(AF_HA_REMOVAL, &ha->flags)) { | ||
| 46 | DEBUG2(ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: " | ||
| 47 | "prematurely completing mbx cmd as " | ||
| 48 | "adapter removal detected\n", | ||
| 49 | ha->host_no, __func__)); | ||
| 50 | return status; | ||
| 51 | } | ||
| 52 | } | ||
| 53 | |||
| 44 | if (is_qla8022(ha)) { | 54 | if (is_qla8022(ha)) { |
| 45 | if (test_bit(AF_FW_RECOVERY, &ha->flags)) { | 55 | if (test_bit(AF_FW_RECOVERY, &ha->flags)) { |
| 46 | DEBUG2(ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: " | 56 | DEBUG2(ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: " |
| @@ -413,6 +423,7 @@ qla4xxx_update_local_ifcb(struct scsi_qla_host *ha, | |||
| 413 | memcpy(ha->name_string, init_fw_cb->iscsi_name, | 423 | memcpy(ha->name_string, init_fw_cb->iscsi_name, |
| 414 | min(sizeof(ha->name_string), | 424 | min(sizeof(ha->name_string), |
| 415 | sizeof(init_fw_cb->iscsi_name))); | 425 | sizeof(init_fw_cb->iscsi_name))); |
| 426 | ha->def_timeout = le16_to_cpu(init_fw_cb->def_timeout); | ||
| 416 | /*memcpy(ha->alias, init_fw_cb->Alias, | 427 | /*memcpy(ha->alias, init_fw_cb->Alias, |
| 417 | min(sizeof(ha->alias), sizeof(init_fw_cb->Alias)));*/ | 428 | min(sizeof(ha->alias), sizeof(init_fw_cb->Alias)));*/ |
| 418 | 429 | ||
diff --git a/drivers/scsi/qla4xxx/ql4_os.c b/drivers/scsi/qla4xxx/ql4_os.c index 30f31b127f3..4169c8baa11 100644 --- a/drivers/scsi/qla4xxx/ql4_os.c +++ b/drivers/scsi/qla4xxx/ql4_os.c | |||
| @@ -8,6 +8,7 @@ | |||
| 8 | #include <linux/slab.h> | 8 | #include <linux/slab.h> |
| 9 | #include <linux/blkdev.h> | 9 | #include <linux/blkdev.h> |
| 10 | #include <linux/iscsi_boot_sysfs.h> | 10 | #include <linux/iscsi_boot_sysfs.h> |
| 11 | #include <linux/inet.h> | ||
| 11 | 12 | ||
| 12 | #include <scsi/scsi_tcq.h> | 13 | #include <scsi/scsi_tcq.h> |
| 13 | #include <scsi/scsicam.h> | 14 | #include <scsi/scsicam.h> |
| @@ -31,6 +32,13 @@ static struct kmem_cache *srb_cachep; | |||
| 31 | /* | 32 | /* |
| 32 | * Module parameter information and variables | 33 | * Module parameter information and variables |
| 33 | */ | 34 | */ |
| 35 | int ql4xdisablesysfsboot = 1; | ||
| 36 | module_param(ql4xdisablesysfsboot, int, S_IRUGO | S_IWUSR); | ||
| 37 | MODULE_PARM_DESC(ql4xdisablesysfsboot, | ||
| 38 | "Set to disable exporting boot targets to sysfs\n" | ||
| 39 | " 0 - Export boot targets\n" | ||
| 40 | " 1 - Do not export boot targets (Default)"); | ||
| 41 | |||
| 34 | int ql4xdontresethba = 0; | 42 | int ql4xdontresethba = 0; |
| 35 | module_param(ql4xdontresethba, int, S_IRUGO | S_IWUSR); | 43 | module_param(ql4xdontresethba, int, S_IRUGO | S_IWUSR); |
| 36 | MODULE_PARM_DESC(ql4xdontresethba, | 44 | MODULE_PARM_DESC(ql4xdontresethba, |
| @@ -63,7 +71,7 @@ static int ql4xsess_recovery_tmo = QL4_SESS_RECOVERY_TMO; | |||
| 63 | module_param(ql4xsess_recovery_tmo, int, S_IRUGO); | 71 | module_param(ql4xsess_recovery_tmo, int, S_IRUGO); |
| 64 | MODULE_PARM_DESC(ql4xsess_recovery_tmo, | 72 | MODULE_PARM_DESC(ql4xsess_recovery_tmo, |
| 65 | "Target Session Recovery Timeout.\n" | 73 | "Target Session Recovery Timeout.\n" |
| 66 | " Default: 30 sec."); | 74 | " Default: 120 sec."); |
| 67 | 75 | ||
| 68 | static int qla4xxx_wait_for_hba_online(struct scsi_qla_host *ha); | 76 | static int qla4xxx_wait_for_hba_online(struct scsi_qla_host *ha); |
| 69 | /* | 77 | /* |
| @@ -415,7 +423,7 @@ static int qla4xxx_ep_poll(struct iscsi_endpoint *ep, int timeout_ms) | |||
| 415 | qla_ep = ep->dd_data; | 423 | qla_ep = ep->dd_data; |
| 416 | ha = to_qla_host(qla_ep->host); | 424 | ha = to_qla_host(qla_ep->host); |
| 417 | 425 | ||
| 418 | if (adapter_up(ha)) | 426 | if (adapter_up(ha) && !test_bit(AF_BUILD_DDB_LIST, &ha->flags)) |
| 419 | ret = 1; | 427 | ret = 1; |
| 420 | 428 | ||
| 421 | return ret; | 429 | return ret; |
| @@ -975,6 +983,150 @@ static int qla4xxx_conn_get_param(struct iscsi_cls_conn *cls_conn, | |||
| 975 | 983 | ||
| 976 | } | 984 | } |
| 977 | 985 | ||
| 986 | int qla4xxx_get_ddb_index(struct scsi_qla_host *ha, uint16_t *ddb_index) | ||
| 987 | { | ||
| 988 | uint32_t mbx_sts = 0; | ||
| 989 | uint16_t tmp_ddb_index; | ||
| 990 | int ret; | ||
| 991 | |||
| 992 | get_ddb_index: | ||
| 993 | tmp_ddb_index = find_first_zero_bit(ha->ddb_idx_map, MAX_DDB_ENTRIES); | ||
| 994 | |||
| 995 | if (tmp_ddb_index >= MAX_DDB_ENTRIES) { | ||
| 996 | DEBUG2(ql4_printk(KERN_INFO, ha, | ||
| 997 | "Free DDB index not available\n")); | ||
| 998 | ret = QLA_ERROR; | ||
| 999 | goto exit_get_ddb_index; | ||
| 1000 | } | ||
| 1001 | |||
| 1002 | if (test_and_set_bit(tmp_ddb_index, ha->ddb_idx_map)) | ||
| 1003 | goto get_ddb_index; | ||
| 1004 | |||
| 1005 | DEBUG2(ql4_printk(KERN_INFO, ha, | ||
| 1006 | "Found a free DDB index at %d\n", tmp_ddb_index)); | ||
| 1007 | ret = qla4xxx_req_ddb_entry(ha, tmp_ddb_index, &mbx_sts); | ||
| 1008 | if (ret == QLA_ERROR) { | ||
| 1009 | if (mbx_sts == MBOX_STS_COMMAND_ERROR) { | ||
| 1010 | ql4_printk(KERN_INFO, ha, | ||
| 1011 | "DDB index = %d not available trying next\n", | ||
| 1012 | tmp_ddb_index); | ||
| 1013 | goto get_ddb_index; | ||
| 1014 | } | ||
| 1015 | DEBUG2(ql4_printk(KERN_INFO, ha, | ||
| 1016 | "Free FW DDB not available\n")); | ||
| 1017 | } | ||
| 1018 | |||
| 1019 | *ddb_index = tmp_ddb_index; | ||
| 1020 | |||
| 1021 | exit_get_ddb_index: | ||
| 1022 | return ret; | ||
| 1023 | } | ||
| 1024 | |||
| 1025 | static int qla4xxx_match_ipaddress(struct scsi_qla_host *ha, | ||
| 1026 | struct ddb_entry *ddb_entry, | ||
| 1027 | char *existing_ipaddr, | ||
| 1028 | char *user_ipaddr) | ||
| 1029 | { | ||
| 1030 | uint8_t dst_ipaddr[IPv6_ADDR_LEN]; | ||
| 1031 | char formatted_ipaddr[DDB_IPADDR_LEN]; | ||
| 1032 | int status = QLA_SUCCESS, ret = 0; | ||
| 1033 | |||
| 1034 | if (ddb_entry->fw_ddb_entry.options & DDB_OPT_IPV6_DEVICE) { | ||
| 1035 | ret = in6_pton(user_ipaddr, strlen(user_ipaddr), dst_ipaddr, | ||
| 1036 | '\0', NULL); | ||
| 1037 | if (ret == 0) { | ||
| 1038 | status = QLA_ERROR; | ||
| 1039 | goto out_match; | ||
| 1040 | } | ||
| 1041 | ret = sprintf(formatted_ipaddr, "%pI6", dst_ipaddr); | ||
| 1042 | } else { | ||
| 1043 | ret = in4_pton(user_ipaddr, strlen(user_ipaddr), dst_ipaddr, | ||
| 1044 | '\0', NULL); | ||
| 1045 | if (ret == 0) { | ||
| 1046 | status = QLA_ERROR; | ||
| 1047 | goto out_match; | ||
| 1048 | } | ||
| 1049 | ret = sprintf(formatted_ipaddr, "%pI4", dst_ipaddr); | ||
| 1050 | } | ||
| 1051 | |||
| 1052 | if (strcmp(existing_ipaddr, formatted_ipaddr)) | ||
| 1053 | status = QLA_ERROR; | ||
| 1054 | |||
| 1055 | out_match: | ||
| 1056 | return status; | ||
| 1057 | } | ||
| 1058 | |||
| 1059 | static int qla4xxx_match_fwdb_session(struct scsi_qla_host *ha, | ||
| 1060 | struct iscsi_cls_conn *cls_conn) | ||
| 1061 | { | ||
| 1062 | int idx = 0, max_ddbs, rval; | ||
| 1063 | struct iscsi_cls_session *cls_sess = iscsi_conn_to_session(cls_conn); | ||
| 1064 | struct iscsi_session *sess, *existing_sess; | ||
| 1065 | struct iscsi_conn *conn, *existing_conn; | ||
| 1066 | struct ddb_entry *ddb_entry; | ||
| 1067 | |||
| 1068 | sess = cls_sess->dd_data; | ||
| 1069 | conn = cls_conn->dd_data; | ||
| 1070 | |||
| 1071 | if (sess->targetname == NULL || | ||
| 1072 | conn->persistent_address == NULL || | ||
| 1073 | conn->persistent_port == 0) | ||
| 1074 | return QLA_ERROR; | ||
| 1075 | |||
| 1076 | max_ddbs = is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX : | ||
| 1077 | MAX_DEV_DB_ENTRIES; | ||
| 1078 | |||
| 1079 | for (idx = 0; idx < max_ddbs; idx++) { | ||
| 1080 | ddb_entry = qla4xxx_lookup_ddb_by_fw_index(ha, idx); | ||
| 1081 | if (ddb_entry == NULL) | ||
| 1082 | continue; | ||
| 1083 | |||
| 1084 | if (ddb_entry->ddb_type != FLASH_DDB) | ||
| 1085 | continue; | ||
| 1086 | |||
| 1087 | existing_sess = ddb_entry->sess->dd_data; | ||
| 1088 | existing_conn = ddb_entry->conn->dd_data; | ||
| 1089 | |||
| 1090 | if (existing_sess->targetname == NULL || | ||
| 1091 | existing_conn->persistent_address == NULL || | ||
| 1092 | existing_conn->persistent_port == 0) | ||
| 1093 | continue; | ||
| 1094 | |||
| 1095 | DEBUG2(ql4_printk(KERN_INFO, ha, | ||
| 1096 | "IQN = %s User IQN = %s\n", | ||
| 1097 | existing_sess->targetname, | ||
| 1098 | sess->targetname)); | ||
| 1099 | |||
| 1100 | DEBUG2(ql4_printk(KERN_INFO, ha, | ||
| 1101 | "IP = %s User IP = %s\n", | ||
| 1102 | existing_conn->persistent_address, | ||
| 1103 | conn->persistent_address)); | ||
| 1104 | |||
| 1105 | DEBUG2(ql4_printk(KERN_INFO, ha, | ||
| 1106 | "Port = %d User Port = %d\n", | ||
| 1107 | existing_conn->persistent_port, | ||
| 1108 | conn->persistent_port)); | ||
| 1109 | |||
| 1110 | if (strcmp(existing_sess->targetname, sess->targetname)) | ||
| 1111 | continue; | ||
| 1112 | rval = qla4xxx_match_ipaddress(ha, ddb_entry, | ||
| 1113 | existing_conn->persistent_address, | ||
| 1114 | conn->persistent_address); | ||
| 1115 | if (rval == QLA_ERROR) | ||
| 1116 | continue; | ||
| 1117 | if (existing_conn->persistent_port != conn->persistent_port) | ||
| 1118 | continue; | ||
| 1119 | break; | ||
| 1120 | } | ||
| 1121 | |||
| 1122 | if (idx == max_ddbs) | ||
| 1123 | return QLA_ERROR; | ||
| 1124 | |||
| 1125 | DEBUG2(ql4_printk(KERN_INFO, ha, | ||
| 1126 | "Match found in fwdb sessions\n")); | ||
| 1127 | return QLA_SUCCESS; | ||
| 1128 | } | ||
| 1129 | |||
| 978 | static struct iscsi_cls_session * | 1130 | static struct iscsi_cls_session * |
| 979 | qla4xxx_session_create(struct iscsi_endpoint *ep, | 1131 | qla4xxx_session_create(struct iscsi_endpoint *ep, |
| 980 | uint16_t cmds_max, uint16_t qdepth, | 1132 | uint16_t cmds_max, uint16_t qdepth, |
| @@ -984,8 +1136,7 @@ qla4xxx_session_create(struct iscsi_endpoint *ep, | |||
| 984 | struct scsi_qla_host *ha; | 1136 | struct scsi_qla_host *ha; |
| 985 | struct qla_endpoint *qla_ep; | 1137 | struct qla_endpoint *qla_ep; |
| 986 | struct ddb_entry *ddb_entry; | 1138 | struct ddb_entry *ddb_entry; |
| 987 | uint32_t ddb_index; | 1139 | uint16_t ddb_index; |
| 988 | uint32_t mbx_sts = 0; | ||
| 989 | struct iscsi_session *sess; | 1140 | struct iscsi_session *sess; |
| 990 | struct sockaddr *dst_addr; | 1141 | struct sockaddr *dst_addr; |
| 991 | int ret; | 1142 | int ret; |
| @@ -1000,32 +1151,9 @@ qla4xxx_session_create(struct iscsi_endpoint *ep, | |||
| 1000 | dst_addr = (struct sockaddr *)&qla_ep->dst_addr; | 1151 | dst_addr = (struct sockaddr *)&qla_ep->dst_addr; |
| 1001 | ha = to_qla_host(qla_ep->host); | 1152 | ha = to_qla_host(qla_ep->host); |
| 1002 | 1153 | ||
| 1003 | get_ddb_index: | 1154 | ret = qla4xxx_get_ddb_index(ha, &ddb_index); |
| 1004 | ddb_index = find_first_zero_bit(ha->ddb_idx_map, MAX_DDB_ENTRIES); | 1155 | if (ret == QLA_ERROR) |
| 1005 | |||
| 1006 | if (ddb_index >= MAX_DDB_ENTRIES) { | ||
| 1007 | DEBUG2(ql4_printk(KERN_INFO, ha, | ||
| 1008 | "Free DDB index not available\n")); | ||
| 1009 | return NULL; | ||
| 1010 | } | ||
| 1011 | |||
| 1012 | if (test_and_set_bit(ddb_index, ha->ddb_idx_map)) | ||
| 1013 | goto get_ddb_index; | ||
| 1014 | |||
| 1015 | DEBUG2(ql4_printk(KERN_INFO, ha, | ||
| 1016 | "Found a free DDB index at %d\n", ddb_index)); | ||
| 1017 | ret = qla4xxx_req_ddb_entry(ha, ddb_index, &mbx_sts); | ||
| 1018 | if (ret == QLA_ERROR) { | ||
| 1019 | if (mbx_sts == MBOX_STS_COMMAND_ERROR) { | ||
| 1020 | ql4_printk(KERN_INFO, ha, | ||
| 1021 | "DDB index = %d not available trying next\n", | ||
| 1022 | ddb_index); | ||
| 1023 | goto get_ddb_index; | ||
| 1024 | } | ||
| 1025 | DEBUG2(ql4_printk(KERN_INFO, ha, | ||
| 1026 | "Free FW DDB not available\n")); | ||
| 1027 | return NULL; | 1156 | return NULL; |
| 1028 | } | ||
| 1029 | 1157 | ||
| 1030 | cls_sess = iscsi_session_setup(&qla4xxx_iscsi_transport, qla_ep->host, | 1158 | cls_sess = iscsi_session_setup(&qla4xxx_iscsi_transport, qla_ep->host, |
| 1031 | cmds_max, sizeof(struct ddb_entry), | 1159 | cmds_max, sizeof(struct ddb_entry), |
| @@ -1040,6 +1168,8 @@ get_ddb_index: | |||
| 1040 | ddb_entry->fw_ddb_device_state = DDB_DS_NO_CONNECTION_ACTIVE; | 1168 | ddb_entry->fw_ddb_device_state = DDB_DS_NO_CONNECTION_ACTIVE; |
| 1041 | ddb_entry->ha = ha; | 1169 | ddb_entry->ha = ha; |
| 1042 | ddb_entry->sess = cls_sess; | 1170 | ddb_entry->sess = cls_sess; |
| 1171 | ddb_entry->unblock_sess = qla4xxx_unblock_ddb; | ||
| 1172 | ddb_entry->ddb_change = qla4xxx_ddb_change; | ||
| 1043 | cls_sess->recovery_tmo = ql4xsess_recovery_tmo; | 1173 | cls_sess->recovery_tmo = ql4xsess_recovery_tmo; |
| 1044 | ha->fw_ddb_index_map[ddb_entry->fw_ddb_index] = ddb_entry; | 1174 | ha->fw_ddb_index_map[ddb_entry->fw_ddb_index] = ddb_entry; |
| 1045 | ha->tot_ddbs++; | 1175 | ha->tot_ddbs++; |
| @@ -1077,6 +1207,9 @@ qla4xxx_conn_create(struct iscsi_cls_session *cls_sess, uint32_t conn_idx) | |||
| 1077 | DEBUG2(printk(KERN_INFO "Func: %s\n", __func__)); | 1207 | DEBUG2(printk(KERN_INFO "Func: %s\n", __func__)); |
| 1078 | cls_conn = iscsi_conn_setup(cls_sess, sizeof(struct qla_conn), | 1208 | cls_conn = iscsi_conn_setup(cls_sess, sizeof(struct qla_conn), |
| 1079 | conn_idx); | 1209 | conn_idx); |
| 1210 | if (!cls_conn) | ||
| 1211 | return NULL; | ||
| 1212 | |||
| 1080 | sess = cls_sess->dd_data; | 1213 | sess = cls_sess->dd_data; |
| 1081 | ddb_entry = sess->dd_data; | 1214 | ddb_entry = sess->dd_data; |
| 1082 | ddb_entry->conn = cls_conn; | 1215 | ddb_entry->conn = cls_conn; |
| @@ -1109,7 +1242,7 @@ static int qla4xxx_conn_start(struct iscsi_cls_conn *cls_conn) | |||
| 1109 | struct iscsi_session *sess; | 1242 | struct iscsi_session *sess; |
| 1110 | struct ddb_entry *ddb_entry; | 1243 | struct ddb_entry *ddb_entry; |
| 1111 | struct scsi_qla_host *ha; | 1244 | struct scsi_qla_host *ha; |
| 1112 | struct dev_db_entry *fw_ddb_entry; | 1245 | struct dev_db_entry *fw_ddb_entry = NULL; |
| 1113 | dma_addr_t fw_ddb_entry_dma; | 1246 | dma_addr_t fw_ddb_entry_dma; |
| 1114 | uint32_t mbx_sts = 0; | 1247 | uint32_t mbx_sts = 0; |
| 1115 | int ret = 0; | 1248 | int ret = 0; |
| @@ -1120,12 +1253,25 @@ static int qla4xxx_conn_start(struct iscsi_cls_conn *cls_conn) | |||
| 1120 | ddb_entry = sess->dd_data; | 1253 | ddb_entry = sess->dd_data; |
| 1121 | ha = ddb_entry->ha; | 1254 | ha = ddb_entry->ha; |
| 1122 | 1255 | ||
| 1256 | /* Check if we have matching FW DDB, if yes then do not | ||
| 1257 | * login to this target. This could cause target to logout previous | ||
| 1258 | * connection | ||
| 1259 | */ | ||
| 1260 | ret = qla4xxx_match_fwdb_session(ha, cls_conn); | ||
| 1261 | if (ret == QLA_SUCCESS) { | ||
| 1262 | ql4_printk(KERN_INFO, ha, | ||
| 1263 | "Session already exist in FW.\n"); | ||
| 1264 | ret = -EEXIST; | ||
| 1265 | goto exit_conn_start; | ||
| 1266 | } | ||
| 1267 | |||
| 1123 | fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), | 1268 | fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), |
| 1124 | &fw_ddb_entry_dma, GFP_KERNEL); | 1269 | &fw_ddb_entry_dma, GFP_KERNEL); |
| 1125 | if (!fw_ddb_entry) { | 1270 | if (!fw_ddb_entry) { |
| 1126 | ql4_printk(KERN_ERR, ha, | 1271 | ql4_printk(KERN_ERR, ha, |
| 1127 | "%s: Unable to allocate dma buffer\n", __func__); | 1272 | "%s: Unable to allocate dma buffer\n", __func__); |
| 1128 | return -ENOMEM; | 1273 | ret = -ENOMEM; |
| 1274 | goto exit_conn_start; | ||
| 1129 | } | 1275 | } |
| 1130 | 1276 | ||
| 1131 | ret = qla4xxx_set_param_ddbentry(ha, ddb_entry, cls_conn, &mbx_sts); | 1277 | ret = qla4xxx_set_param_ddbentry(ha, ddb_entry, cls_conn, &mbx_sts); |
| @@ -1138,9 +1284,7 @@ static int qla4xxx_conn_start(struct iscsi_cls_conn *cls_conn) | |||
| 1138 | if (mbx_sts) | 1284 | if (mbx_sts) |
| 1139 | if (ddb_entry->fw_ddb_device_state == | 1285 | if (ddb_entry->fw_ddb_device_state == |
| 1140 | DDB_DS_SESSION_ACTIVE) { | 1286 | DDB_DS_SESSION_ACTIVE) { |
| 1141 | iscsi_conn_start(ddb_entry->conn); | 1287 | ddb_entry->unblock_sess(ddb_entry->sess); |
| 1142 | iscsi_conn_login_event(ddb_entry->conn, | ||
| 1143 | ISCSI_CONN_STATE_LOGGED_IN); | ||
| 1144 | goto exit_set_param; | 1288 | goto exit_set_param; |
| 1145 | } | 1289 | } |
| 1146 | 1290 | ||
| @@ -1167,8 +1311,9 @@ exit_set_param: | |||
| 1167 | ret = 0; | 1311 | ret = 0; |
| 1168 | 1312 | ||
| 1169 | exit_conn_start: | 1313 | exit_conn_start: |
| 1170 | dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), | 1314 | if (fw_ddb_entry) |
| 1171 | fw_ddb_entry, fw_ddb_entry_dma); | 1315 | dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), |
| 1316 | fw_ddb_entry, fw_ddb_entry_dma); | ||
| 1172 | return ret; | 1317 | return ret; |
| 1173 | } | 1318 | } |
| 1174 | 1319 | ||
| @@ -1344,6 +1489,101 @@ static int qla4xxx_task_xmit(struct iscsi_task *task) | |||
| 1344 | return -ENOSYS; | 1489 | return -ENOSYS; |
| 1345 | } | 1490 | } |
| 1346 | 1491 | ||
| 1492 | static void qla4xxx_copy_fwddb_param(struct scsi_qla_host *ha, | ||
| 1493 | struct dev_db_entry *fw_ddb_entry, | ||
| 1494 | struct iscsi_cls_session *cls_sess, | ||
| 1495 | struct iscsi_cls_conn *cls_conn) | ||
| 1496 | { | ||
| 1497 | int buflen = 0; | ||
| 1498 | struct iscsi_session *sess; | ||
| 1499 | struct iscsi_conn *conn; | ||
| 1500 | char ip_addr[DDB_IPADDR_LEN]; | ||
| 1501 | uint16_t options = 0; | ||
| 1502 | |||
| 1503 | sess = cls_sess->dd_data; | ||
| 1504 | conn = cls_conn->dd_data; | ||
| 1505 | |||
| 1506 | conn->max_recv_dlength = BYTE_UNITS * | ||
| 1507 | le16_to_cpu(fw_ddb_entry->iscsi_max_rcv_data_seg_len); | ||
| 1508 | |||
| 1509 | conn->max_xmit_dlength = BYTE_UNITS * | ||
| 1510 | le16_to_cpu(fw_ddb_entry->iscsi_max_snd_data_seg_len); | ||
| 1511 | |||
| 1512 | sess->initial_r2t_en = | ||
| 1513 | (BIT_10 & le16_to_cpu(fw_ddb_entry->iscsi_options)); | ||
| 1514 | |||
| 1515 | sess->max_r2t = le16_to_cpu(fw_ddb_entry->iscsi_max_outsnd_r2t); | ||
| 1516 | |||
| 1517 | sess->imm_data_en = (BIT_11 & le16_to_cpu(fw_ddb_entry->iscsi_options)); | ||
| 1518 | |||
| 1519 | sess->first_burst = BYTE_UNITS * | ||
| 1520 | le16_to_cpu(fw_ddb_entry->iscsi_first_burst_len); | ||
| 1521 | |||
| 1522 | sess->max_burst = BYTE_UNITS * | ||
| 1523 | le16_to_cpu(fw_ddb_entry->iscsi_max_burst_len); | ||
| 1524 | |||
| 1525 | sess->time2wait = le16_to_cpu(fw_ddb_entry->iscsi_def_time2wait); | ||
| 1526 | |||
| 1527 | sess->time2retain = le16_to_cpu(fw_ddb_entry->iscsi_def_time2retain); | ||
| 1528 | |||
| 1529 | conn->persistent_port = le16_to_cpu(fw_ddb_entry->port); | ||
| 1530 | |||
| 1531 | sess->tpgt = le32_to_cpu(fw_ddb_entry->tgt_portal_grp); | ||
| 1532 | |||
| 1533 | options = le16_to_cpu(fw_ddb_entry->options); | ||
| 1534 | if (options & DDB_OPT_IPV6_DEVICE) | ||
| 1535 | sprintf(ip_addr, "%pI6", fw_ddb_entry->ip_addr); | ||
| 1536 | else | ||
| 1537 | sprintf(ip_addr, "%pI4", fw_ddb_entry->ip_addr); | ||
| 1538 | |||
| 1539 | iscsi_set_param(cls_conn, ISCSI_PARAM_TARGET_NAME, | ||
| 1540 | (char *)fw_ddb_entry->iscsi_name, buflen); | ||
| 1541 | iscsi_set_param(cls_conn, ISCSI_PARAM_INITIATOR_NAME, | ||
| 1542 | (char *)ha->name_string, buflen); | ||
| 1543 | iscsi_set_param(cls_conn, ISCSI_PARAM_PERSISTENT_ADDRESS, | ||
| 1544 | (char *)ip_addr, buflen); | ||
| 1545 | } | ||
| 1546 | |||
| 1547 | void qla4xxx_update_session_conn_fwddb_param(struct scsi_qla_host *ha, | ||
| 1548 | struct ddb_entry *ddb_entry) | ||
| 1549 | { | ||
| 1550 | struct iscsi_cls_session *cls_sess; | ||
| 1551 | struct iscsi_cls_conn *cls_conn; | ||
| 1552 | uint32_t ddb_state; | ||
| 1553 | dma_addr_t fw_ddb_entry_dma; | ||
| 1554 | struct dev_db_entry *fw_ddb_entry; | ||
| 1555 | |||
| 1556 | fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), | ||
| 1557 | &fw_ddb_entry_dma, GFP_KERNEL); | ||
| 1558 | if (!fw_ddb_entry) { | ||
| 1559 | ql4_printk(KERN_ERR, ha, | ||
| 1560 | "%s: Unable to allocate dma buffer\n", __func__); | ||
| 1561 | goto exit_session_conn_fwddb_param; | ||
| 1562 | } | ||
| 1563 | |||
| 1564 | if (qla4xxx_get_fwddb_entry(ha, ddb_entry->fw_ddb_index, fw_ddb_entry, | ||
| 1565 | fw_ddb_entry_dma, NULL, NULL, &ddb_state, | ||
| 1566 | NULL, NULL, NULL) == QLA_ERROR) { | ||
| 1567 | DEBUG2(ql4_printk(KERN_ERR, ha, "scsi%ld: %s: failed " | ||
| 1568 | "get_ddb_entry for fw_ddb_index %d\n", | ||
| 1569 | ha->host_no, __func__, | ||
| 1570 | ddb_entry->fw_ddb_index)); | ||
| 1571 | goto exit_session_conn_fwddb_param; | ||
| 1572 | } | ||
| 1573 | |||
| 1574 | cls_sess = ddb_entry->sess; | ||
| 1575 | |||
| 1576 | cls_conn = ddb_entry->conn; | ||
| 1577 | |||
| 1578 | /* Update params */ | ||
| 1579 | qla4xxx_copy_fwddb_param(ha, fw_ddb_entry, cls_sess, cls_conn); | ||
| 1580 | |||
| 1581 | exit_session_conn_fwddb_param: | ||
| 1582 | if (fw_ddb_entry) | ||
| 1583 | dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), | ||
| 1584 | fw_ddb_entry, fw_ddb_entry_dma); | ||
| 1585 | } | ||
| 1586 | |||
| 1347 | void qla4xxx_update_session_conn_param(struct scsi_qla_host *ha, | 1587 | void qla4xxx_update_session_conn_param(struct scsi_qla_host *ha, |
| 1348 | struct ddb_entry *ddb_entry) | 1588 | struct ddb_entry *ddb_entry) |
| 1349 | { | 1589 | { |
| @@ -1360,7 +1600,7 @@ void qla4xxx_update_session_conn_param(struct scsi_qla_host *ha, | |||
| 1360 | if (!fw_ddb_entry) { | 1600 | if (!fw_ddb_entry) { |
| 1361 | ql4_printk(KERN_ERR, ha, | 1601 | ql4_printk(KERN_ERR, ha, |
| 1362 | "%s: Unable to allocate dma buffer\n", __func__); | 1602 | "%s: Unable to allocate dma buffer\n", __func__); |
| 1363 | return; | 1603 | goto exit_session_conn_param; |
| 1364 | } | 1604 | } |
| 1365 | 1605 | ||
| 1366 | if (qla4xxx_get_fwddb_entry(ha, ddb_entry->fw_ddb_index, fw_ddb_entry, | 1606 | if (qla4xxx_get_fwddb_entry(ha, ddb_entry->fw_ddb_index, fw_ddb_entry, |
| @@ -1370,7 +1610,7 @@ void qla4xxx_update_session_conn_param(struct scsi_qla_host *ha, | |||
| 1370 | "get_ddb_entry for fw_ddb_index %d\n", | 1610 | "get_ddb_entry for fw_ddb_index %d\n", |
| 1371 | ha->host_no, __func__, | 1611 | ha->host_no, __func__, |
| 1372 | ddb_entry->fw_ddb_index)); | 1612 | ddb_entry->fw_ddb_index)); |
| 1373 | return; | 1613 | goto exit_session_conn_param; |
| 1374 | } | 1614 | } |
| 1375 | 1615 | ||
| 1376 | cls_sess = ddb_entry->sess; | 1616 | cls_sess = ddb_entry->sess; |
| @@ -1379,6 +1619,12 @@ void qla4xxx_update_session_conn_param(struct scsi_qla_host *ha, | |||
| 1379 | cls_conn = ddb_entry->conn; | 1619 | cls_conn = ddb_entry->conn; |
| 1380 | conn = cls_conn->dd_data; | 1620 | conn = cls_conn->dd_data; |
| 1381 | 1621 | ||
| 1622 | /* Update timers after login */ | ||
| 1623 | ddb_entry->default_relogin_timeout = | ||
| 1624 | le16_to_cpu(fw_ddb_entry->def_timeout); | ||
| 1625 | ddb_entry->default_time2wait = | ||
| 1626 | le16_to_cpu(fw_ddb_entry->iscsi_def_time2wait); | ||
| 1627 | |||
| 1382 | /* Update params */ | 1628 | /* Update params */ |
| 1383 | conn->max_recv_dlength = BYTE_UNITS * | 1629 | conn->max_recv_dlength = BYTE_UNITS * |
| 1384 | le16_to_cpu(fw_ddb_entry->iscsi_max_rcv_data_seg_len); | 1630 | le16_to_cpu(fw_ddb_entry->iscsi_max_rcv_data_seg_len); |
| @@ -1407,6 +1653,11 @@ void qla4xxx_update_session_conn_param(struct scsi_qla_host *ha, | |||
| 1407 | 1653 | ||
| 1408 | memcpy(sess->initiatorname, ha->name_string, | 1654 | memcpy(sess->initiatorname, ha->name_string, |
| 1409 | min(sizeof(ha->name_string), sizeof(sess->initiatorname))); | 1655 | min(sizeof(ha->name_string), sizeof(sess->initiatorname))); |
| 1656 | |||
| 1657 | exit_session_conn_param: | ||
| 1658 | if (fw_ddb_entry) | ||
| 1659 | dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), | ||
| 1660 | fw_ddb_entry, fw_ddb_entry_dma); | ||
| 1410 | } | 1661 | } |
| 1411 | 1662 | ||
| 1412 | /* | 1663 | /* |
| @@ -1607,6 +1858,9 @@ static void qla4xxx_mem_free(struct scsi_qla_host *ha) | |||
| 1607 | vfree(ha->chap_list); | 1858 | vfree(ha->chap_list); |
| 1608 | ha->chap_list = NULL; | 1859 | ha->chap_list = NULL; |
| 1609 | 1860 | ||
| 1861 | if (ha->fw_ddb_dma_pool) | ||
| 1862 | dma_pool_destroy(ha->fw_ddb_dma_pool); | ||
| 1863 | |||
| 1610 | /* release io space registers */ | 1864 | /* release io space registers */ |
| 1611 | if (is_qla8022(ha)) { | 1865 | if (is_qla8022(ha)) { |
| 1612 | if (ha->nx_pcibase) | 1866 | if (ha->nx_pcibase) |
| @@ -1689,6 +1943,16 @@ static int qla4xxx_mem_alloc(struct scsi_qla_host *ha) | |||
| 1689 | goto mem_alloc_error_exit; | 1943 | goto mem_alloc_error_exit; |
| 1690 | } | 1944 | } |
| 1691 | 1945 | ||
| 1946 | ha->fw_ddb_dma_pool = dma_pool_create("ql4_fw_ddb", &ha->pdev->dev, | ||
| 1947 | DDB_DMA_BLOCK_SIZE, 8, 0); | ||
| 1948 | |||
| 1949 | if (ha->fw_ddb_dma_pool == NULL) { | ||
| 1950 | ql4_printk(KERN_WARNING, ha, | ||
| 1951 | "%s: fw_ddb_dma_pool allocation failed..\n", | ||
| 1952 | __func__); | ||
| 1953 | goto mem_alloc_error_exit; | ||
| 1954 | } | ||
| 1955 | |||
| 1692 | return QLA_SUCCESS; | 1956 | return QLA_SUCCESS; |
| 1693 | 1957 | ||
| 1694 | mem_alloc_error_exit: | 1958 | mem_alloc_error_exit: |
| @@ -1800,6 +2064,60 @@ void qla4_8xxx_watchdog(struct scsi_qla_host *ha) | |||
| 1800 | } | 2064 | } |
| 1801 | } | 2065 | } |
| 1802 | 2066 | ||
| 2067 | void qla4xxx_check_relogin_flash_ddb(struct iscsi_cls_session *cls_sess) | ||
| 2068 | { | ||
| 2069 | struct iscsi_session *sess; | ||
| 2070 | struct ddb_entry *ddb_entry; | ||
| 2071 | struct scsi_qla_host *ha; | ||
| 2072 | |||
| 2073 | sess = cls_sess->dd_data; | ||
| 2074 | ddb_entry = sess->dd_data; | ||
| 2075 | ha = ddb_entry->ha; | ||
| 2076 | |||
| 2077 | if (!(ddb_entry->ddb_type == FLASH_DDB)) | ||
| 2078 | return; | ||
| 2079 | |||
| 2080 | if (adapter_up(ha) && !test_bit(DF_RELOGIN, &ddb_entry->flags) && | ||
| 2081 | !iscsi_is_session_online(cls_sess)) { | ||
| 2082 | if (atomic_read(&ddb_entry->retry_relogin_timer) != | ||
| 2083 | INVALID_ENTRY) { | ||
| 2084 | if (atomic_read(&ddb_entry->retry_relogin_timer) == | ||
| 2085 | 0) { | ||
| 2086 | atomic_set(&ddb_entry->retry_relogin_timer, | ||
| 2087 | INVALID_ENTRY); | ||
| 2088 | set_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags); | ||
| 2089 | set_bit(DF_RELOGIN, &ddb_entry->flags); | ||
| 2090 | DEBUG2(ql4_printk(KERN_INFO, ha, | ||
| 2091 | "%s: index [%d] login device\n", | ||
| 2092 | __func__, ddb_entry->fw_ddb_index)); | ||
| 2093 | } else | ||
| 2094 | atomic_dec(&ddb_entry->retry_relogin_timer); | ||
| 2095 | } | ||
| 2096 | } | ||
| 2097 | |||
| 2098 | /* Wait for relogin to timeout */ | ||
| 2099 | if (atomic_read(&ddb_entry->relogin_timer) && | ||
| 2100 | (atomic_dec_and_test(&ddb_entry->relogin_timer) != 0)) { | ||
| 2101 | /* | ||
| 2102 | * If the relogin times out and the device is | ||
| 2103 | * still NOT ONLINE then try and relogin again. | ||
| 2104 | */ | ||
| 2105 | if (!iscsi_is_session_online(cls_sess)) { | ||
| 2106 | /* Reset retry relogin timer */ | ||
| 2107 | atomic_inc(&ddb_entry->relogin_retry_count); | ||
| 2108 | DEBUG2(ql4_printk(KERN_INFO, ha, | ||
| 2109 | "%s: index[%d] relogin timed out-retrying" | ||
| 2110 | " relogin (%d), retry (%d)\n", __func__, | ||
| 2111 | ddb_entry->fw_ddb_index, | ||
| 2112 | atomic_read(&ddb_entry->relogin_retry_count), | ||
| 2113 | ddb_entry->default_time2wait + 4)); | ||
| 2114 | set_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags); | ||
| 2115 | atomic_set(&ddb_entry->retry_relogin_timer, | ||
| 2116 | ddb_entry->default_time2wait + 4); | ||
| 2117 | } | ||
| 2118 | } | ||
| 2119 | } | ||
| 2120 | |||
| 1803 | /** | 2121 | /** |
| 1804 | * qla4xxx_timer - checks every second for work to do. | 2122 | * qla4xxx_timer - checks every second for work to do. |
| 1805 | * @ha: Pointer to host adapter structure. | 2123 | * @ha: Pointer to host adapter structure. |
| @@ -1809,6 +2127,8 @@ static void qla4xxx_timer(struct scsi_qla_host *ha) | |||
| 1809 | int start_dpc = 0; | 2127 | int start_dpc = 0; |
| 1810 | uint16_t w; | 2128 | uint16_t w; |
| 1811 | 2129 | ||
| 2130 | iscsi_host_for_each_session(ha->host, qla4xxx_check_relogin_flash_ddb); | ||
| 2131 | |||
| 1812 | /* If we are in the middle of AER/EEH processing | 2132 | /* If we are in the middle of AER/EEH processing |
| 1813 | * skip any processing and reschedule the timer | 2133 | * skip any processing and reschedule the timer |
| 1814 | */ | 2134 | */ |
| @@ -2078,7 +2398,12 @@ static void qla4xxx_fail_session(struct iscsi_cls_session *cls_session) | |||
| 2078 | sess = cls_session->dd_data; | 2398 | sess = cls_session->dd_data; |
| 2079 | ddb_entry = sess->dd_data; | 2399 | ddb_entry = sess->dd_data; |
| 2080 | ddb_entry->fw_ddb_device_state = DDB_DS_SESSION_FAILED; | 2400 | ddb_entry->fw_ddb_device_state = DDB_DS_SESSION_FAILED; |
| 2081 | iscsi_session_failure(cls_session->dd_data, ISCSI_ERR_CONN_FAILED); | 2401 | |
| 2402 | if (ddb_entry->ddb_type == FLASH_DDB) | ||
| 2403 | iscsi_block_session(ddb_entry->sess); | ||
| 2404 | else | ||
| 2405 | iscsi_session_failure(cls_session->dd_data, | ||
| 2406 | ISCSI_ERR_CONN_FAILED); | ||
| 2082 | } | 2407 | } |
| 2083 | 2408 | ||
| 2084 | /** | 2409 | /** |
| @@ -2163,7 +2488,7 @@ recover_ha_init_adapter: | |||
| 2163 | 2488 | ||
| 2164 | /* NOTE: AF_ONLINE flag set upon successful completion of | 2489 | /* NOTE: AF_ONLINE flag set upon successful completion of |
| 2165 | * qla4xxx_initialize_adapter */ | 2490 | * qla4xxx_initialize_adapter */ |
| 2166 | status = qla4xxx_initialize_adapter(ha); | 2491 | status = qla4xxx_initialize_adapter(ha, RESET_ADAPTER); |
| 2167 | } | 2492 | } |
| 2168 | 2493 | ||
| 2169 | /* Retry failed adapter initialization, if necessary | 2494 | /* Retry failed adapter initialization, if necessary |
| @@ -2245,17 +2570,108 @@ static void qla4xxx_relogin_devices(struct iscsi_cls_session *cls_session) | |||
| 2245 | iscsi_unblock_session(ddb_entry->sess); | 2570 | iscsi_unblock_session(ddb_entry->sess); |
| 2246 | } else { | 2571 | } else { |
| 2247 | /* Trigger relogin */ | 2572 | /* Trigger relogin */ |
| 2248 | iscsi_session_failure(cls_session->dd_data, | 2573 | if (ddb_entry->ddb_type == FLASH_DDB) { |
| 2249 | ISCSI_ERR_CONN_FAILED); | 2574 | if (!test_bit(DF_RELOGIN, &ddb_entry->flags)) |
| 2575 | qla4xxx_arm_relogin_timer(ddb_entry); | ||
| 2576 | } else | ||
| 2577 | iscsi_session_failure(cls_session->dd_data, | ||
| 2578 | ISCSI_ERR_CONN_FAILED); | ||
| 2250 | } | 2579 | } |
| 2251 | } | 2580 | } |
| 2252 | } | 2581 | } |
| 2253 | 2582 | ||
| 2583 | int qla4xxx_unblock_flash_ddb(struct iscsi_cls_session *cls_session) | ||
| 2584 | { | ||
| 2585 | struct iscsi_session *sess; | ||
| 2586 | struct ddb_entry *ddb_entry; | ||
| 2587 | struct scsi_qla_host *ha; | ||
| 2588 | |||
| 2589 | sess = cls_session->dd_data; | ||
| 2590 | ddb_entry = sess->dd_data; | ||
| 2591 | ha = ddb_entry->ha; | ||
| 2592 | ql4_printk(KERN_INFO, ha, "scsi%ld: %s: ddb[%d]" | ||
| 2593 | " unblock session\n", ha->host_no, __func__, | ||
| 2594 | ddb_entry->fw_ddb_index); | ||
| 2595 | |||
| 2596 | iscsi_unblock_session(ddb_entry->sess); | ||
| 2597 | |||
| 2598 | /* Start scan target */ | ||
| 2599 | if (test_bit(AF_ONLINE, &ha->flags)) { | ||
| 2600 | ql4_printk(KERN_INFO, ha, "scsi%ld: %s: ddb[%d]" | ||
| 2601 | " start scan\n", ha->host_no, __func__, | ||
| 2602 | ddb_entry->fw_ddb_index); | ||
| 2603 | scsi_queue_work(ha->host, &ddb_entry->sess->scan_work); | ||
| 2604 | } | ||
| 2605 | return QLA_SUCCESS; | ||
| 2606 | } | ||
| 2607 | |||
| 2608 | int qla4xxx_unblock_ddb(struct iscsi_cls_session *cls_session) | ||
| 2609 | { | ||
| 2610 | struct iscsi_session *sess; | ||
| 2611 | struct ddb_entry *ddb_entry; | ||
| 2612 | struct scsi_qla_host *ha; | ||
| 2613 | |||
| 2614 | sess = cls_session->dd_data; | ||
| 2615 | ddb_entry = sess->dd_data; | ||
| 2616 | ha = ddb_entry->ha; | ||
| 2617 | ql4_printk(KERN_INFO, ha, "scsi%ld: %s: ddb[%d]" | ||
| 2618 | " unblock user space session\n", ha->host_no, __func__, | ||
| 2619 | ddb_entry->fw_ddb_index); | ||
| 2620 | iscsi_conn_start(ddb_entry->conn); | ||
| 2621 | iscsi_conn_login_event(ddb_entry->conn, | ||
| 2622 | ISCSI_CONN_STATE_LOGGED_IN); | ||
| 2623 | |||
| 2624 | return QLA_SUCCESS; | ||
| 2625 | } | ||
| 2626 | |||
| 2254 | static void qla4xxx_relogin_all_devices(struct scsi_qla_host *ha) | 2627 | static void qla4xxx_relogin_all_devices(struct scsi_qla_host *ha) |
| 2255 | { | 2628 | { |
| 2256 | iscsi_host_for_each_session(ha->host, qla4xxx_relogin_devices); | 2629 | iscsi_host_for_each_session(ha->host, qla4xxx_relogin_devices); |
| 2257 | } | 2630 | } |
| 2258 | 2631 | ||
| 2632 | static void qla4xxx_relogin_flash_ddb(struct iscsi_cls_session *cls_sess) | ||
| 2633 | { | ||
| 2634 | uint16_t relogin_timer; | ||
| 2635 | struct iscsi_session *sess; | ||
| 2636 | struct ddb_entry *ddb_entry; | ||
| 2637 | struct scsi_qla_host *ha; | ||
| 2638 | |||
| 2639 | sess = cls_sess->dd_data; | ||
| 2640 | ddb_entry = sess->dd_data; | ||
| 2641 | ha = ddb_entry->ha; | ||
| 2642 | |||
| 2643 | relogin_timer = max(ddb_entry->default_relogin_timeout, | ||
| 2644 | (uint16_t)RELOGIN_TOV); | ||
| 2645 | atomic_set(&ddb_entry->relogin_timer, relogin_timer); | ||
| 2646 | |||
| 2647 | DEBUG2(ql4_printk(KERN_INFO, ha, | ||
| 2648 | "scsi%ld: Relogin index [%d]. TOV=%d\n", ha->host_no, | ||
| 2649 | ddb_entry->fw_ddb_index, relogin_timer)); | ||
| 2650 | |||
| 2651 | qla4xxx_login_flash_ddb(cls_sess); | ||
| 2652 | } | ||
| 2653 | |||
| 2654 | static void qla4xxx_dpc_relogin(struct iscsi_cls_session *cls_sess) | ||
| 2655 | { | ||
| 2656 | struct iscsi_session *sess; | ||
| 2657 | struct ddb_entry *ddb_entry; | ||
| 2658 | struct scsi_qla_host *ha; | ||
| 2659 | |||
| 2660 | sess = cls_sess->dd_data; | ||
| 2661 | ddb_entry = sess->dd_data; | ||
| 2662 | ha = ddb_entry->ha; | ||
| 2663 | |||
| 2664 | if (!(ddb_entry->ddb_type == FLASH_DDB)) | ||
| 2665 | return; | ||
| 2666 | |||
| 2667 | if (test_and_clear_bit(DF_RELOGIN, &ddb_entry->flags) && | ||
| 2668 | !iscsi_is_session_online(cls_sess)) { | ||
| 2669 | DEBUG2(ql4_printk(KERN_INFO, ha, | ||
| 2670 | "relogin issued\n")); | ||
| 2671 | qla4xxx_relogin_flash_ddb(cls_sess); | ||
| 2672 | } | ||
| 2673 | } | ||
| 2674 | |||
| 2259 | void qla4xxx_wake_dpc(struct scsi_qla_host *ha) | 2675 | void qla4xxx_wake_dpc(struct scsi_qla_host *ha) |
| 2260 | { | 2676 | { |
| 2261 | if (ha->dpc_thread) | 2677 | if (ha->dpc_thread) |
| @@ -2356,6 +2772,12 @@ dpc_post_reset_ha: | |||
| 2356 | if (test_and_clear_bit(DPC_GET_DHCP_IP_ADDR, &ha->dpc_flags)) | 2772 | if (test_and_clear_bit(DPC_GET_DHCP_IP_ADDR, &ha->dpc_flags)) |
| 2357 | qla4xxx_get_dhcp_ip_address(ha); | 2773 | qla4xxx_get_dhcp_ip_address(ha); |
| 2358 | 2774 | ||
| 2775 | /* ---- relogin device? --- */ | ||
| 2776 | if (adapter_up(ha) && | ||
| 2777 | test_and_clear_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags)) { | ||
| 2778 | iscsi_host_for_each_session(ha->host, qla4xxx_dpc_relogin); | ||
| 2779 | } | ||
| 2780 | |||
| 2359 | /* ---- link change? --- */ | 2781 | /* ---- link change? --- */ |
| 2360 | if (test_and_clear_bit(DPC_LINK_CHANGED, &ha->dpc_flags)) { | 2782 | if (test_and_clear_bit(DPC_LINK_CHANGED, &ha->dpc_flags)) { |
| 2361 | if (!test_bit(AF_LINK_UP, &ha->flags)) { | 2783 | if (!test_bit(AF_LINK_UP, &ha->flags)) { |
| @@ -2368,8 +2790,12 @@ dpc_post_reset_ha: | |||
| 2368 | * fatal error recovery. Therefore, the driver must | 2790 | * fatal error recovery. Therefore, the driver must |
| 2369 | * manually relogin to devices when recovering from | 2791 | * manually relogin to devices when recovering from |
| 2370 | * connection failures, logouts, expired KATO, etc. */ | 2792 | * connection failures, logouts, expired KATO, etc. */ |
| 2371 | 2793 | if (test_and_clear_bit(AF_BUILD_DDB_LIST, &ha->flags)) { | |
| 2372 | qla4xxx_relogin_all_devices(ha); | 2794 | qla4xxx_build_ddb_list(ha, ha->is_reset); |
| 2795 | iscsi_host_for_each_session(ha->host, | ||
| 2796 | qla4xxx_login_flash_ddb); | ||
| 2797 | } else | ||
| 2798 | qla4xxx_relogin_all_devices(ha); | ||
| 2373 | } | 2799 | } |
| 2374 | } | 2800 | } |
| 2375 | } | 2801 | } |
| @@ -2867,6 +3293,9 @@ static int get_fw_boot_info(struct scsi_qla_host *ha, uint16_t ddb_index[]) | |||
| 2867 | " target ID %d\n", __func__, ddb_index[0], | 3293 | " target ID %d\n", __func__, ddb_index[0], |
| 2868 | ddb_index[1])); | 3294 | ddb_index[1])); |
| 2869 | 3295 | ||
| 3296 | ha->pri_ddb_idx = ddb_index[0]; | ||
| 3297 | ha->sec_ddb_idx = ddb_index[1]; | ||
| 3298 | |||
| 2870 | exit_boot_info_free: | 3299 | exit_boot_info_free: |
| 2871 | dma_free_coherent(&ha->pdev->dev, size, buf, buf_dma); | 3300 | dma_free_coherent(&ha->pdev->dev, size, buf, buf_dma); |
| 2872 | exit_boot_info: | 3301 | exit_boot_info: |
| @@ -3034,6 +3463,9 @@ static int qla4xxx_get_boot_info(struct scsi_qla_host *ha) | |||
| 3034 | return ret; | 3463 | return ret; |
| 3035 | } | 3464 | } |
| 3036 | 3465 | ||
| 3466 | if (ql4xdisablesysfsboot) | ||
| 3467 | return QLA_SUCCESS; | ||
| 3468 | |||
| 3037 | if (ddb_index[0] == 0xffff) | 3469 | if (ddb_index[0] == 0xffff) |
| 3038 | goto sec_target; | 3470 | goto sec_target; |
| 3039 | 3471 | ||
| @@ -3066,7 +3498,15 @@ static int qla4xxx_setup_boot_info(struct scsi_qla_host *ha) | |||
| 3066 | struct iscsi_boot_kobj *boot_kobj; | 3498 | struct iscsi_boot_kobj *boot_kobj; |
| 3067 | 3499 | ||
| 3068 | if (qla4xxx_get_boot_info(ha) != QLA_SUCCESS) | 3500 | if (qla4xxx_get_boot_info(ha) != QLA_SUCCESS) |
| 3069 | return 0; | 3501 | return QLA_ERROR; |
| 3502 | |||
| 3503 | if (ql4xdisablesysfsboot) { | ||
| 3504 | ql4_printk(KERN_INFO, ha, | ||
| 3505 | "%s: syfsboot disabled - driver will trigger login" | ||
| 3506 | "and publish session for discovery .\n", __func__); | ||
| 3507 | return QLA_SUCCESS; | ||
| 3508 | } | ||
| 3509 | |||
| 3070 | 3510 | ||
| 3071 | ha->boot_kset = iscsi_boot_create_host_kset(ha->host->host_no); | 3511 | ha->boot_kset = iscsi_boot_create_host_kset(ha->host->host_no); |
| 3072 | if (!ha->boot_kset) | 3512 | if (!ha->boot_kset) |
| @@ -3108,7 +3548,7 @@ static int qla4xxx_setup_boot_info(struct scsi_qla_host *ha) | |||
| 3108 | if (!boot_kobj) | 3548 | if (!boot_kobj) |
| 3109 | goto put_host; | 3549 | goto put_host; |
| 3110 | 3550 | ||
| 3111 | return 0; | 3551 | return QLA_SUCCESS; |
| 3112 | 3552 | ||
| 3113 | put_host: | 3553 | put_host: |
| 3114 | scsi_host_put(ha->host); | 3554 | scsi_host_put(ha->host); |
| @@ -3174,9 +3614,507 @@ static void qla4xxx_create_chap_list(struct scsi_qla_host *ha) | |||
| 3174 | exit_chap_list: | 3614 | exit_chap_list: |
| 3175 | dma_free_coherent(&ha->pdev->dev, chap_size, | 3615 | dma_free_coherent(&ha->pdev->dev, chap_size, |
| 3176 | chap_flash_data, chap_dma); | 3616 | chap_flash_data, chap_dma); |
| 3177 | return; | ||
| 3178 | } | 3617 | } |
| 3179 | 3618 | ||
| 3619 | static void qla4xxx_get_param_ddb(struct ddb_entry *ddb_entry, | ||
| 3620 | struct ql4_tuple_ddb *tddb) | ||
| 3621 | { | ||
| 3622 | struct scsi_qla_host *ha; | ||
| 3623 | struct iscsi_cls_session *cls_sess; | ||
| 3624 | struct iscsi_cls_conn *cls_conn; | ||
| 3625 | struct iscsi_session *sess; | ||
| 3626 | struct iscsi_conn *conn; | ||
| 3627 | |||
| 3628 | DEBUG2(printk(KERN_INFO "Func: %s\n", __func__)); | ||
| 3629 | ha = ddb_entry->ha; | ||
| 3630 | cls_sess = ddb_entry->sess; | ||
| 3631 | sess = cls_sess->dd_data; | ||
| 3632 | cls_conn = ddb_entry->conn; | ||
| 3633 | conn = cls_conn->dd_data; | ||
| 3634 | |||
| 3635 | tddb->tpgt = sess->tpgt; | ||
| 3636 | tddb->port = conn->persistent_port; | ||
| 3637 | strncpy(tddb->iscsi_name, sess->targetname, ISCSI_NAME_SIZE); | ||
| 3638 | strncpy(tddb->ip_addr, conn->persistent_address, DDB_IPADDR_LEN); | ||
| 3639 | } | ||
| 3640 | |||
| 3641 | static void qla4xxx_convert_param_ddb(struct dev_db_entry *fw_ddb_entry, | ||
| 3642 | struct ql4_tuple_ddb *tddb) | ||
| 3643 | { | ||
| 3644 | uint16_t options = 0; | ||
| 3645 | |||
| 3646 | tddb->tpgt = le32_to_cpu(fw_ddb_entry->tgt_portal_grp); | ||
| 3647 | memcpy(&tddb->iscsi_name[0], &fw_ddb_entry->iscsi_name[0], | ||
| 3648 | min(sizeof(tddb->iscsi_name), sizeof(fw_ddb_entry->iscsi_name))); | ||
| 3649 | |||
| 3650 | options = le16_to_cpu(fw_ddb_entry->options); | ||
| 3651 | if (options & DDB_OPT_IPV6_DEVICE) | ||
| 3652 | sprintf(tddb->ip_addr, "%pI6", fw_ddb_entry->ip_addr); | ||
| 3653 | else | ||
| 3654 | sprintf(tddb->ip_addr, "%pI4", fw_ddb_entry->ip_addr); | ||
| 3655 | |||
| 3656 | tddb->port = le16_to_cpu(fw_ddb_entry->port); | ||
| 3657 | } | ||
| 3658 | |||
| 3659 | static int qla4xxx_compare_tuple_ddb(struct scsi_qla_host *ha, | ||
| 3660 | struct ql4_tuple_ddb *old_tddb, | ||
| 3661 | struct ql4_tuple_ddb *new_tddb) | ||
| 3662 | { | ||
| 3663 | if (strcmp(old_tddb->iscsi_name, new_tddb->iscsi_name)) | ||
| 3664 | return QLA_ERROR; | ||
| 3665 | |||
| 3666 | if (strcmp(old_tddb->ip_addr, new_tddb->ip_addr)) | ||
| 3667 | return QLA_ERROR; | ||
| 3668 | |||
| 3669 | if (old_tddb->port != new_tddb->port) | ||
| 3670 | return QLA_ERROR; | ||
| 3671 | |||
| 3672 | DEBUG2(ql4_printk(KERN_INFO, ha, | ||
| 3673 | "Match Found, fw[%d,%d,%s,%s], [%d,%d,%s,%s]", | ||
| 3674 | old_tddb->port, old_tddb->tpgt, old_tddb->ip_addr, | ||
| 3675 | old_tddb->iscsi_name, new_tddb->port, new_tddb->tpgt, | ||
| 3676 | new_tddb->ip_addr, new_tddb->iscsi_name)); | ||
| 3677 | |||
| 3678 | return QLA_SUCCESS; | ||
| 3679 | } | ||
| 3680 | |||
| 3681 | static int qla4xxx_is_session_exists(struct scsi_qla_host *ha, | ||
| 3682 | struct dev_db_entry *fw_ddb_entry) | ||
| 3683 | { | ||
| 3684 | struct ddb_entry *ddb_entry; | ||
| 3685 | struct ql4_tuple_ddb *fw_tddb = NULL; | ||
| 3686 | struct ql4_tuple_ddb *tmp_tddb = NULL; | ||
| 3687 | int idx; | ||
| 3688 | int ret = QLA_ERROR; | ||
| 3689 | |||
| 3690 | fw_tddb = vzalloc(sizeof(*fw_tddb)); | ||
| 3691 | if (!fw_tddb) { | ||
| 3692 | DEBUG2(ql4_printk(KERN_WARNING, ha, | ||
| 3693 | "Memory Allocation failed.\n")); | ||
| 3694 | ret = QLA_SUCCESS; | ||
| 3695 | goto exit_check; | ||
| 3696 | } | ||
| 3697 | |||
| 3698 | tmp_tddb = vzalloc(sizeof(*tmp_tddb)); | ||
| 3699 | if (!tmp_tddb) { | ||
| 3700 | DEBUG2(ql4_printk(KERN_WARNING, ha, | ||
| 3701 | "Memory Allocation failed.\n")); | ||
| 3702 | ret = QLA_SUCCESS; | ||
| 3703 | goto exit_check; | ||
| 3704 | } | ||
| 3705 | |||
| 3706 | qla4xxx_convert_param_ddb(fw_ddb_entry, fw_tddb); | ||
| 3707 | |||
| 3708 | for (idx = 0; idx < MAX_DDB_ENTRIES; idx++) { | ||
| 3709 | ddb_entry = qla4xxx_lookup_ddb_by_fw_index(ha, idx); | ||
| 3710 | if (ddb_entry == NULL) | ||
| 3711 | continue; | ||
| 3712 | |||
| 3713 | qla4xxx_get_param_ddb(ddb_entry, tmp_tddb); | ||
| 3714 | if (!qla4xxx_compare_tuple_ddb(ha, fw_tddb, tmp_tddb)) { | ||
| 3715 | ret = QLA_SUCCESS; /* found */ | ||
| 3716 | goto exit_check; | ||
| 3717 | } | ||
| 3718 | } | ||
| 3719 | |||
| 3720 | exit_check: | ||
| 3721 | if (fw_tddb) | ||
| 3722 | vfree(fw_tddb); | ||
| 3723 | if (tmp_tddb) | ||
| 3724 | vfree(tmp_tddb); | ||
| 3725 | return ret; | ||
| 3726 | } | ||
| 3727 | |||
| 3728 | static int qla4xxx_is_flash_ddb_exists(struct scsi_qla_host *ha, | ||
| 3729 | struct list_head *list_nt, | ||
| 3730 | struct dev_db_entry *fw_ddb_entry) | ||
| 3731 | { | ||
| 3732 | struct qla_ddb_index *nt_ddb_idx, *nt_ddb_idx_tmp; | ||
| 3733 | struct ql4_tuple_ddb *fw_tddb = NULL; | ||
| 3734 | struct ql4_tuple_ddb *tmp_tddb = NULL; | ||
| 3735 | int ret = QLA_ERROR; | ||
| 3736 | |||
| 3737 | fw_tddb = vzalloc(sizeof(*fw_tddb)); | ||
| 3738 | if (!fw_tddb) { | ||
| 3739 | DEBUG2(ql4_printk(KERN_WARNING, ha, | ||
| 3740 | "Memory Allocation failed.\n")); | ||
| 3741 | ret = QLA_SUCCESS; | ||
| 3742 | goto exit_check; | ||
| 3743 | } | ||
| 3744 | |||
| 3745 | tmp_tddb = vzalloc(sizeof(*tmp_tddb)); | ||
| 3746 | if (!tmp_tddb) { | ||
| 3747 | DEBUG2(ql4_printk(KERN_WARNING, ha, | ||
| 3748 | "Memory Allocation failed.\n")); | ||
| 3749 | ret = QLA_SUCCESS; | ||
| 3750 | goto exit_check; | ||
| 3751 | } | ||
| 3752 | |||
| 3753 | qla4xxx_convert_param_ddb(fw_ddb_entry, fw_tddb); | ||
| 3754 | |||
| 3755 | list_for_each_entry_safe(nt_ddb_idx, nt_ddb_idx_tmp, list_nt, list) { | ||
| 3756 | qla4xxx_convert_param_ddb(&nt_ddb_idx->fw_ddb, tmp_tddb); | ||
| 3757 | if (!qla4xxx_compare_tuple_ddb(ha, fw_tddb, tmp_tddb)) { | ||
| 3758 | ret = QLA_SUCCESS; /* found */ | ||
| 3759 | goto exit_check; | ||
| 3760 | } | ||
| 3761 | } | ||
| 3762 | |||
| 3763 | exit_check: | ||
| 3764 | if (fw_tddb) | ||
| 3765 | vfree(fw_tddb); | ||
| 3766 | if (tmp_tddb) | ||
| 3767 | vfree(tmp_tddb); | ||
| 3768 | return ret; | ||
| 3769 | } | ||
| 3770 | |||
| 3771 | static void qla4xxx_free_nt_list(struct list_head *list_nt) | ||
| 3772 | { | ||
| 3773 | struct qla_ddb_index *nt_ddb_idx, *nt_ddb_idx_tmp; | ||
| 3774 | |||
| 3775 | /* Free up the normaltargets list */ | ||
| 3776 | list_for_each_entry_safe(nt_ddb_idx, nt_ddb_idx_tmp, list_nt, list) { | ||
| 3777 | list_del_init(&nt_ddb_idx->list); | ||
| 3778 | vfree(nt_ddb_idx); | ||
| 3779 | } | ||
| 3780 | |||
| 3781 | } | ||
| 3782 | |||
| 3783 | static struct iscsi_endpoint *qla4xxx_get_ep_fwdb(struct scsi_qla_host *ha, | ||
| 3784 | struct dev_db_entry *fw_ddb_entry) | ||
| 3785 | { | ||
| 3786 | struct iscsi_endpoint *ep; | ||
| 3787 | struct sockaddr_in *addr; | ||
| 3788 | struct sockaddr_in6 *addr6; | ||
| 3789 | struct sockaddr *dst_addr; | ||
| 3790 | char *ip; | ||
| 3791 | |||
| 3792 | /* TODO: need to destroy on unload iscsi_endpoint*/ | ||
| 3793 | dst_addr = vmalloc(sizeof(*dst_addr)); | ||
| 3794 | if (!dst_addr) | ||
| 3795 | return NULL; | ||
| 3796 | |||
| 3797 | if (fw_ddb_entry->options & DDB_OPT_IPV6_DEVICE) { | ||
| 3798 | dst_addr->sa_family = AF_INET6; | ||
| 3799 | addr6 = (struct sockaddr_in6 *)dst_addr; | ||
| 3800 | ip = (char *)&addr6->sin6_addr; | ||
| 3801 | memcpy(ip, fw_ddb_entry->ip_addr, IPv6_ADDR_LEN); | ||
| 3802 | addr6->sin6_port = htons(le16_to_cpu(fw_ddb_entry->port)); | ||
| 3803 | |||
| 3804 | } else { | ||
| 3805 | dst_addr->sa_family = AF_INET; | ||
| 3806 | addr = (struct sockaddr_in *)dst_addr; | ||
| 3807 | ip = (char *)&addr->sin_addr; | ||
| 3808 | memcpy(ip, fw_ddb_entry->ip_addr, IP_ADDR_LEN); | ||
| 3809 | addr->sin_port = htons(le16_to_cpu(fw_ddb_entry->port)); | ||
| 3810 | } | ||
| 3811 | |||
| 3812 | ep = qla4xxx_ep_connect(ha->host, dst_addr, 0); | ||
| 3813 | vfree(dst_addr); | ||
| 3814 | return ep; | ||
| 3815 | } | ||
| 3816 | |||
| 3817 | static int qla4xxx_verify_boot_idx(struct scsi_qla_host *ha, uint16_t idx) | ||
| 3818 | { | ||
| 3819 | if (ql4xdisablesysfsboot) | ||
| 3820 | return QLA_SUCCESS; | ||
| 3821 | if (idx == ha->pri_ddb_idx || idx == ha->sec_ddb_idx) | ||
| 3822 | return QLA_ERROR; | ||
| 3823 | return QLA_SUCCESS; | ||
| 3824 | } | ||
| 3825 | |||
| 3826 | static void qla4xxx_setup_flash_ddb_entry(struct scsi_qla_host *ha, | ||
| 3827 | struct ddb_entry *ddb_entry) | ||
| 3828 | { | ||
| 3829 | ddb_entry->ddb_type = FLASH_DDB; | ||
| 3830 | ddb_entry->fw_ddb_index = INVALID_ENTRY; | ||
| 3831 | ddb_entry->fw_ddb_device_state = DDB_DS_NO_CONNECTION_ACTIVE; | ||
| 3832 | ddb_entry->ha = ha; | ||
| 3833 | ddb_entry->unblock_sess = qla4xxx_unblock_flash_ddb; | ||
| 3834 | ddb_entry->ddb_change = qla4xxx_flash_ddb_change; | ||
| 3835 | |||
| 3836 | atomic_set(&ddb_entry->retry_relogin_timer, INVALID_ENTRY); | ||
| 3837 | atomic_set(&ddb_entry->relogin_timer, 0); | ||
| 3838 | atomic_set(&ddb_entry->relogin_retry_count, 0); | ||
| 3839 | |||
| 3840 | ddb_entry->default_relogin_timeout = | ||
| 3841 | le16_to_cpu(ddb_entry->fw_ddb_entry.def_timeout); | ||
| 3842 | ddb_entry->default_time2wait = | ||
| 3843 | le16_to_cpu(ddb_entry->fw_ddb_entry.iscsi_def_time2wait); | ||
| 3844 | } | ||
| 3845 | |||
| 3846 | static void qla4xxx_wait_for_ip_configuration(struct scsi_qla_host *ha) | ||
| 3847 | { | ||
| 3848 | uint32_t idx = 0; | ||
| 3849 | uint32_t ip_idx[IP_ADDR_COUNT] = {0, 1, 2, 3}; /* 4 IP interfaces */ | ||
| 3850 | uint32_t sts[MBOX_REG_COUNT]; | ||
| 3851 | uint32_t ip_state; | ||
| 3852 | unsigned long wtime; | ||
| 3853 | int ret; | ||
| 3854 | |||
| 3855 | wtime = jiffies + (HZ * IP_CONFIG_TOV); | ||
| 3856 | do { | ||
| 3857 | for (idx = 0; idx < IP_ADDR_COUNT; idx++) { | ||
| 3858 | if (ip_idx[idx] == -1) | ||
| 3859 | continue; | ||
| 3860 | |||
| 3861 | ret = qla4xxx_get_ip_state(ha, 0, ip_idx[idx], sts); | ||
| 3862 | |||
| 3863 | if (ret == QLA_ERROR) { | ||
| 3864 | ip_idx[idx] = -1; | ||
| 3865 | continue; | ||
| 3866 | } | ||
| 3867 | |||
| 3868 | ip_state = (sts[1] & IP_STATE_MASK) >> IP_STATE_SHIFT; | ||
| 3869 | |||
| 3870 | DEBUG2(ql4_printk(KERN_INFO, ha, | ||
| 3871 | "Waiting for IP state for idx = %d, state = 0x%x\n", | ||
| 3872 | ip_idx[idx], ip_state)); | ||
| 3873 | if (ip_state == IP_ADDRSTATE_UNCONFIGURED || | ||
| 3874 | ip_state == IP_ADDRSTATE_INVALID || | ||
| 3875 | ip_state == IP_ADDRSTATE_PREFERRED || | ||
| 3876 | ip_state == IP_ADDRSTATE_DEPRICATED || | ||
| 3877 | ip_state == IP_ADDRSTATE_DISABLING) | ||
| 3878 | ip_idx[idx] = -1; | ||
| 3879 | |||
| 3880 | } | ||
| 3881 | |||
| 3882 | /* Break if all IP states checked */ | ||
| 3883 | if ((ip_idx[0] == -1) && | ||
| 3884 | (ip_idx[1] == -1) && | ||
| 3885 | (ip_idx[2] == -1) && | ||
| 3886 | (ip_idx[3] == -1)) | ||
| 3887 | break; | ||
| 3888 | schedule_timeout_uninterruptible(HZ); | ||
| 3889 | } while (time_after(wtime, jiffies)); | ||
| 3890 | } | ||
| 3891 | |||
| 3892 | void qla4xxx_build_ddb_list(struct scsi_qla_host *ha, int is_reset) | ||
| 3893 | { | ||
| 3894 | int max_ddbs; | ||
| 3895 | int ret; | ||
| 3896 | uint32_t idx = 0, next_idx = 0; | ||
| 3897 | uint32_t state = 0, conn_err = 0; | ||
| 3898 | uint16_t conn_id; | ||
| 3899 | struct dev_db_entry *fw_ddb_entry; | ||
| 3900 | struct ddb_entry *ddb_entry = NULL; | ||
| 3901 | dma_addr_t fw_ddb_dma; | ||
| 3902 | struct iscsi_cls_session *cls_sess; | ||
| 3903 | struct iscsi_session *sess; | ||
| 3904 | struct iscsi_cls_conn *cls_conn; | ||
| 3905 | struct iscsi_endpoint *ep; | ||
| 3906 | uint16_t cmds_max = 32, tmo = 0; | ||
| 3907 | uint32_t initial_cmdsn = 0; | ||
| 3908 | struct list_head list_st, list_nt; /* List of sendtargets */ | ||
| 3909 | struct qla_ddb_index *st_ddb_idx, *st_ddb_idx_tmp; | ||
| 3910 | int fw_idx_size; | ||
| 3911 | unsigned long wtime; | ||
| 3912 | struct qla_ddb_index *nt_ddb_idx; | ||
| 3913 | |||
| 3914 | if (!test_bit(AF_LINK_UP, &ha->flags)) { | ||
| 3915 | set_bit(AF_BUILD_DDB_LIST, &ha->flags); | ||
| 3916 | ha->is_reset = is_reset; | ||
| 3917 | return; | ||
| 3918 | } | ||
| 3919 | max_ddbs = is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX : | ||
| 3920 | MAX_DEV_DB_ENTRIES; | ||
| 3921 | |||
| 3922 | fw_ddb_entry = dma_pool_alloc(ha->fw_ddb_dma_pool, GFP_KERNEL, | ||
| 3923 | &fw_ddb_dma); | ||
| 3924 | if (fw_ddb_entry == NULL) { | ||
| 3925 | DEBUG2(ql4_printk(KERN_ERR, ha, "Out of memory\n")); | ||
| 3926 | goto exit_ddb_list; | ||
| 3927 | } | ||
| 3928 | |||
| 3929 | INIT_LIST_HEAD(&list_st); | ||
| 3930 | INIT_LIST_HEAD(&list_nt); | ||
| 3931 | fw_idx_size = sizeof(struct qla_ddb_index); | ||
| 3932 | |||
| 3933 | for (idx = 0; idx < max_ddbs; idx = next_idx) { | ||
| 3934 | ret = qla4xxx_get_fwddb_entry(ha, idx, fw_ddb_entry, | ||
| 3935 | fw_ddb_dma, NULL, | ||
| 3936 | &next_idx, &state, &conn_err, | ||
| 3937 | NULL, &conn_id); | ||
| 3938 | if (ret == QLA_ERROR) | ||
| 3939 | break; | ||
| 3940 | |||
| 3941 | if (qla4xxx_verify_boot_idx(ha, idx) != QLA_SUCCESS) | ||
| 3942 | goto continue_next_st; | ||
| 3943 | |||
| 3944 | /* Check if ST, add to the list_st */ | ||
| 3945 | if (strlen((char *) fw_ddb_entry->iscsi_name) != 0) | ||
| 3946 | goto continue_next_st; | ||
| 3947 | |||
| 3948 | st_ddb_idx = vzalloc(fw_idx_size); | ||
| 3949 | if (!st_ddb_idx) | ||
| 3950 | break; | ||
| 3951 | |||
| 3952 | st_ddb_idx->fw_ddb_idx = idx; | ||
| 3953 | |||
| 3954 | list_add_tail(&st_ddb_idx->list, &list_st); | ||
| 3955 | continue_next_st: | ||
| 3956 | if (next_idx == 0) | ||
| 3957 | break; | ||
| 3958 | } | ||
| 3959 | |||
| 3960 | /* Before issuing conn open mbox, ensure all IPs states are configured | ||
| 3961 | * Note, conn open fails if IPs are not configured | ||
| 3962 | */ | ||
| 3963 | qla4xxx_wait_for_ip_configuration(ha); | ||
| 3964 | |||
| 3965 | /* Go thru the STs and fire the sendtargets by issuing conn open mbx */ | ||
| 3966 | list_for_each_entry_safe(st_ddb_idx, st_ddb_idx_tmp, &list_st, list) { | ||
| 3967 | qla4xxx_conn_open(ha, st_ddb_idx->fw_ddb_idx); | ||
| 3968 | } | ||
| 3969 | |||
| 3970 | /* Wait to ensure all sendtargets are done for min 12 sec wait */ | ||
| 3971 | tmo = ((ha->def_timeout < LOGIN_TOV) ? LOGIN_TOV : ha->def_timeout); | ||
| 3972 | DEBUG2(ql4_printk(KERN_INFO, ha, | ||
| 3973 | "Default time to wait for build ddb %d\n", tmo)); | ||
| 3974 | |||
| 3975 | wtime = jiffies + (HZ * tmo); | ||
| 3976 | do { | ||
| 3977 | list_for_each_entry_safe(st_ddb_idx, st_ddb_idx_tmp, &list_st, | ||
| 3978 | list) { | ||
| 3979 | ret = qla4xxx_get_fwddb_entry(ha, | ||
| 3980 | st_ddb_idx->fw_ddb_idx, | ||
| 3981 | NULL, 0, NULL, &next_idx, | ||
| 3982 | &state, &conn_err, NULL, | ||
| 3983 | NULL); | ||
| 3984 | if (ret == QLA_ERROR) | ||
| 3985 | continue; | ||
| 3986 | |||
| 3987 | if (state == DDB_DS_NO_CONNECTION_ACTIVE || | ||
| 3988 | state == DDB_DS_SESSION_FAILED) { | ||
| 3989 | list_del_init(&st_ddb_idx->list); | ||
| 3990 | vfree(st_ddb_idx); | ||
| 3991 | } | ||
| 3992 | } | ||
| 3993 | schedule_timeout_uninterruptible(HZ / 10); | ||
| 3994 | } while (time_after(wtime, jiffies)); | ||
| 3995 | |||
| 3996 | /* Free up the sendtargets list */ | ||
| 3997 | list_for_each_entry_safe(st_ddb_idx, st_ddb_idx_tmp, &list_st, list) { | ||
| 3998 | list_del_init(&st_ddb_idx->list); | ||
| 3999 | vfree(st_ddb_idx); | ||
| 4000 | } | ||
| 4001 | |||
| 4002 | for (idx = 0; idx < max_ddbs; idx = next_idx) { | ||
| 4003 | ret = qla4xxx_get_fwddb_entry(ha, idx, fw_ddb_entry, | ||
| 4004 | fw_ddb_dma, NULL, | ||
| 4005 | &next_idx, &state, &conn_err, | ||
| 4006 | NULL, &conn_id); | ||
| 4007 | if (ret == QLA_ERROR) | ||
| 4008 | break; | ||
| 4009 | |||
| 4010 | if (qla4xxx_verify_boot_idx(ha, idx) != QLA_SUCCESS) | ||
| 4011 | goto continue_next_nt; | ||
| 4012 | |||
| 4013 | /* Check if NT, then add to list it */ | ||
| 4014 | if (strlen((char *) fw_ddb_entry->iscsi_name) == 0) | ||
| 4015 | goto continue_next_nt; | ||
| 4016 | |||
| 4017 | if (state == DDB_DS_NO_CONNECTION_ACTIVE || | ||
| 4018 | state == DDB_DS_SESSION_FAILED) { | ||
| 4019 | DEBUG2(ql4_printk(KERN_INFO, ha, | ||
| 4020 | "Adding DDB to session = 0x%x\n", | ||
| 4021 | idx)); | ||
| 4022 | if (is_reset == INIT_ADAPTER) { | ||
| 4023 | nt_ddb_idx = vmalloc(fw_idx_size); | ||
| 4024 | if (!nt_ddb_idx) | ||
| 4025 | break; | ||
| 4026 | |||
| 4027 | nt_ddb_idx->fw_ddb_idx = idx; | ||
| 4028 | |||
| 4029 | memcpy(&nt_ddb_idx->fw_ddb, fw_ddb_entry, | ||
| 4030 | sizeof(struct dev_db_entry)); | ||
| 4031 | |||
| 4032 | if (qla4xxx_is_flash_ddb_exists(ha, &list_nt, | ||
| 4033 | fw_ddb_entry) == QLA_SUCCESS) { | ||
| 4034 | vfree(nt_ddb_idx); | ||
| 4035 | goto continue_next_nt; | ||
| 4036 | } | ||
| 4037 | list_add_tail(&nt_ddb_idx->list, &list_nt); | ||
| 4038 | } else if (is_reset == RESET_ADAPTER) { | ||
| 4039 | if (qla4xxx_is_session_exists(ha, | ||
| 4040 | fw_ddb_entry) == QLA_SUCCESS) | ||
| 4041 | goto continue_next_nt; | ||
| 4042 | } | ||
| 4043 | |||
| 4044 | /* Create session object, with INVALID_ENTRY, | ||
| 4045 | * the targer_id would get set when we issue the login | ||
| 4046 | */ | ||
| 4047 | cls_sess = iscsi_session_setup(&qla4xxx_iscsi_transport, | ||
| 4048 | ha->host, cmds_max, | ||
| 4049 | sizeof(struct ddb_entry), | ||
| 4050 | sizeof(struct ql4_task_data), | ||
| 4051 | initial_cmdsn, INVALID_ENTRY); | ||
| 4052 | if (!cls_sess) | ||
| 4053 | goto exit_ddb_list; | ||
| 4054 | |||
| 4055 | /* | ||
| 4056 | * iscsi_session_setup increments the driver reference | ||
| 4057 | * count which wouldn't let the driver to be unloaded. | ||
| 4058 | * so calling module_put function to decrement the | ||
| 4059 | * reference count. | ||
| 4060 | **/ | ||
| 4061 | module_put(qla4xxx_iscsi_transport.owner); | ||
| 4062 | sess = cls_sess->dd_data; | ||
| 4063 | ddb_entry = sess->dd_data; | ||
| 4064 | ddb_entry->sess = cls_sess; | ||
| 4065 | |||
| 4066 | cls_sess->recovery_tmo = ql4xsess_recovery_tmo; | ||
| 4067 | memcpy(&ddb_entry->fw_ddb_entry, fw_ddb_entry, | ||
| 4068 | sizeof(struct dev_db_entry)); | ||
| 4069 | |||
| 4070 | qla4xxx_setup_flash_ddb_entry(ha, ddb_entry); | ||
| 4071 | |||
| 4072 | cls_conn = iscsi_conn_setup(cls_sess, | ||
| 4073 | sizeof(struct qla_conn), | ||
| 4074 | conn_id); | ||
| 4075 | if (!cls_conn) | ||
| 4076 | goto exit_ddb_list; | ||
| 4077 | |||
| 4078 | ddb_entry->conn = cls_conn; | ||
| 4079 | |||
| 4080 | /* Setup ep, for displaying attributes in sysfs */ | ||
| 4081 | ep = qla4xxx_get_ep_fwdb(ha, fw_ddb_entry); | ||
| 4082 | if (ep) { | ||
| 4083 | ep->conn = cls_conn; | ||
| 4084 | cls_conn->ep = ep; | ||
| 4085 | } else { | ||
| 4086 | DEBUG2(ql4_printk(KERN_ERR, ha, | ||
| 4087 | "Unable to get ep\n")); | ||
| 4088 | } | ||
| 4089 | |||
| 4090 | /* Update sess/conn params */ | ||
| 4091 | qla4xxx_copy_fwddb_param(ha, fw_ddb_entry, cls_sess, | ||
| 4092 | cls_conn); | ||
| 4093 | |||
| 4094 | if (is_reset == RESET_ADAPTER) { | ||
| 4095 | iscsi_block_session(cls_sess); | ||
| 4096 | /* Use the relogin path to discover new devices | ||
| 4097 | * by short-circuting the logic of setting | ||
| 4098 | * timer to relogin - instead set the flags | ||
| 4099 | * to initiate login right away. | ||
| 4100 | */ | ||
| 4101 | set_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags); | ||
| 4102 | set_bit(DF_RELOGIN, &ddb_entry->flags); | ||
| 4103 | } | ||
| 4104 | } | ||
| 4105 | continue_next_nt: | ||
| 4106 | if (next_idx == 0) | ||
| 4107 | break; | ||
| 4108 | } | ||
| 4109 | exit_ddb_list: | ||
| 4110 | qla4xxx_free_nt_list(&list_nt); | ||
| 4111 | if (fw_ddb_entry) | ||
| 4112 | dma_pool_free(ha->fw_ddb_dma_pool, fw_ddb_entry, fw_ddb_dma); | ||
| 4113 | |||
| 4114 | qla4xxx_free_ddb_index(ha); | ||
| 4115 | } | ||
| 4116 | |||
| 4117 | |||
| 3180 | /** | 4118 | /** |
| 3181 | * qla4xxx_probe_adapter - callback function to probe HBA | 4119 | * qla4xxx_probe_adapter - callback function to probe HBA |
| 3182 | * @pdev: pointer to pci_dev structure | 4120 | * @pdev: pointer to pci_dev structure |
| @@ -3298,7 +4236,7 @@ static int __devinit qla4xxx_probe_adapter(struct pci_dev *pdev, | |||
| 3298 | * firmware | 4236 | * firmware |
| 3299 | * NOTE: interrupts enabled upon successful completion | 4237 | * NOTE: interrupts enabled upon successful completion |
| 3300 | */ | 4238 | */ |
| 3301 | status = qla4xxx_initialize_adapter(ha); | 4239 | status = qla4xxx_initialize_adapter(ha, INIT_ADAPTER); |
| 3302 | while ((!test_bit(AF_ONLINE, &ha->flags)) && | 4240 | while ((!test_bit(AF_ONLINE, &ha->flags)) && |
| 3303 | init_retry_count++ < MAX_INIT_RETRIES) { | 4241 | init_retry_count++ < MAX_INIT_RETRIES) { |
| 3304 | 4242 | ||
| @@ -3319,7 +4257,7 @@ static int __devinit qla4xxx_probe_adapter(struct pci_dev *pdev, | |||
| 3319 | if (ha->isp_ops->reset_chip(ha) == QLA_ERROR) | 4257 | if (ha->isp_ops->reset_chip(ha) == QLA_ERROR) |
| 3320 | continue; | 4258 | continue; |
| 3321 | 4259 | ||
| 3322 | status = qla4xxx_initialize_adapter(ha); | 4260 | status = qla4xxx_initialize_adapter(ha, INIT_ADAPTER); |
| 3323 | } | 4261 | } |
| 3324 | 4262 | ||
| 3325 | if (!test_bit(AF_ONLINE, &ha->flags)) { | 4263 | if (!test_bit(AF_ONLINE, &ha->flags)) { |
| @@ -3386,12 +4324,16 @@ static int __devinit qla4xxx_probe_adapter(struct pci_dev *pdev, | |||
| 3386 | ha->host_no, ha->firmware_version[0], ha->firmware_version[1], | 4324 | ha->host_no, ha->firmware_version[0], ha->firmware_version[1], |
| 3387 | ha->patch_number, ha->build_number); | 4325 | ha->patch_number, ha->build_number); |
| 3388 | 4326 | ||
| 3389 | qla4xxx_create_chap_list(ha); | ||
| 3390 | |||
| 3391 | if (qla4xxx_setup_boot_info(ha)) | 4327 | if (qla4xxx_setup_boot_info(ha)) |
| 3392 | ql4_printk(KERN_ERR, ha, "%s:ISCSI boot info setup failed\n", | 4328 | ql4_printk(KERN_ERR, ha, "%s:ISCSI boot info setup failed\n", |
| 3393 | __func__); | 4329 | __func__); |
| 3394 | 4330 | ||
| 4331 | /* Perform the build ddb list and login to each */ | ||
| 4332 | qla4xxx_build_ddb_list(ha, INIT_ADAPTER); | ||
| 4333 | iscsi_host_for_each_session(ha->host, qla4xxx_login_flash_ddb); | ||
| 4334 | |||
| 4335 | qla4xxx_create_chap_list(ha); | ||
| 4336 | |||
| 3395 | qla4xxx_create_ifaces(ha); | 4337 | qla4xxx_create_ifaces(ha); |
| 3396 | return 0; | 4338 | return 0; |
| 3397 | 4339 | ||
| @@ -3449,6 +4391,38 @@ static void qla4xxx_prevent_other_port_reinit(struct scsi_qla_host *ha) | |||
| 3449 | } | 4391 | } |
| 3450 | } | 4392 | } |
| 3451 | 4393 | ||
| 4394 | static void qla4xxx_destroy_fw_ddb_session(struct scsi_qla_host *ha) | ||
| 4395 | { | ||
| 4396 | struct ddb_entry *ddb_entry; | ||
| 4397 | int options; | ||
| 4398 | int idx; | ||
| 4399 | |||
| 4400 | for (idx = 0; idx < MAX_DDB_ENTRIES; idx++) { | ||
| 4401 | |||
| 4402 | ddb_entry = qla4xxx_lookup_ddb_by_fw_index(ha, idx); | ||
| 4403 | if ((ddb_entry != NULL) && | ||
| 4404 | (ddb_entry->ddb_type == FLASH_DDB)) { | ||
| 4405 | |||
| 4406 | options = LOGOUT_OPTION_CLOSE_SESSION; | ||
| 4407 | if (qla4xxx_session_logout_ddb(ha, ddb_entry, options) | ||
| 4408 | == QLA_ERROR) | ||
| 4409 | ql4_printk(KERN_ERR, ha, "%s: Logout failed\n", | ||
| 4410 | __func__); | ||
| 4411 | |||
| 4412 | qla4xxx_clear_ddb_entry(ha, ddb_entry->fw_ddb_index); | ||
| 4413 | /* | ||
| 4414 | * we have decremented the reference count of the driver | ||
| 4415 | * when we setup the session to have the driver unload | ||
| 4416 | * to be seamless without actually destroying the | ||
| 4417 | * session | ||
| 4418 | **/ | ||
| 4419 | try_module_get(qla4xxx_iscsi_transport.owner); | ||
| 4420 | iscsi_destroy_endpoint(ddb_entry->conn->ep); | ||
| 4421 | qla4xxx_free_ddb(ha, ddb_entry); | ||
| 4422 | iscsi_session_teardown(ddb_entry->sess); | ||
| 4423 | } | ||
| 4424 | } | ||
| 4425 | } | ||
| 3452 | /** | 4426 | /** |
| 3453 | * qla4xxx_remove_adapter - calback function to remove adapter. | 4427 | * qla4xxx_remove_adapter - calback function to remove adapter. |
| 3454 | * @pci_dev: PCI device pointer | 4428 | * @pci_dev: PCI device pointer |
| @@ -3465,9 +4439,11 @@ static void __devexit qla4xxx_remove_adapter(struct pci_dev *pdev) | |||
| 3465 | /* destroy iface from sysfs */ | 4439 | /* destroy iface from sysfs */ |
| 3466 | qla4xxx_destroy_ifaces(ha); | 4440 | qla4xxx_destroy_ifaces(ha); |
| 3467 | 4441 | ||
| 3468 | if (ha->boot_kset) | 4442 | if ((!ql4xdisablesysfsboot) && ha->boot_kset) |
| 3469 | iscsi_boot_destroy_kset(ha->boot_kset); | 4443 | iscsi_boot_destroy_kset(ha->boot_kset); |
| 3470 | 4444 | ||
| 4445 | qla4xxx_destroy_fw_ddb_session(ha); | ||
| 4446 | |||
| 3471 | scsi_remove_host(ha->host); | 4447 | scsi_remove_host(ha->host); |
| 3472 | 4448 | ||
| 3473 | qla4xxx_free_adapter(ha); | 4449 | qla4xxx_free_adapter(ha); |
| @@ -4115,7 +5091,7 @@ static uint32_t qla4_8xxx_error_recovery(struct scsi_qla_host *ha) | |||
| 4115 | 5091 | ||
| 4116 | qla4_8xxx_idc_unlock(ha); | 5092 | qla4_8xxx_idc_unlock(ha); |
| 4117 | clear_bit(AF_FW_RECOVERY, &ha->flags); | 5093 | clear_bit(AF_FW_RECOVERY, &ha->flags); |
| 4118 | rval = qla4xxx_initialize_adapter(ha); | 5094 | rval = qla4xxx_initialize_adapter(ha, RESET_ADAPTER); |
| 4119 | qla4_8xxx_idc_lock(ha); | 5095 | qla4_8xxx_idc_lock(ha); |
| 4120 | 5096 | ||
| 4121 | if (rval != QLA_SUCCESS) { | 5097 | if (rval != QLA_SUCCESS) { |
| @@ -4151,7 +5127,7 @@ static uint32_t qla4_8xxx_error_recovery(struct scsi_qla_host *ha) | |||
| 4151 | if ((qla4_8xxx_rd_32(ha, QLA82XX_CRB_DEV_STATE) == | 5127 | if ((qla4_8xxx_rd_32(ha, QLA82XX_CRB_DEV_STATE) == |
| 4152 | QLA82XX_DEV_READY)) { | 5128 | QLA82XX_DEV_READY)) { |
| 4153 | clear_bit(AF_FW_RECOVERY, &ha->flags); | 5129 | clear_bit(AF_FW_RECOVERY, &ha->flags); |
| 4154 | rval = qla4xxx_initialize_adapter(ha); | 5130 | rval = qla4xxx_initialize_adapter(ha, RESET_ADAPTER); |
| 4155 | if (rval == QLA_SUCCESS) { | 5131 | if (rval == QLA_SUCCESS) { |
| 4156 | ret = qla4xxx_request_irqs(ha); | 5132 | ret = qla4xxx_request_irqs(ha); |
| 4157 | if (ret) { | 5133 | if (ret) { |
diff --git a/drivers/scsi/qla4xxx/ql4_version.h b/drivers/scsi/qla4xxx/ql4_version.h index c15347d3f53..5254e57968f 100644 --- a/drivers/scsi/qla4xxx/ql4_version.h +++ b/drivers/scsi/qla4xxx/ql4_version.h | |||
| @@ -5,4 +5,4 @@ | |||
| 5 | * See LICENSE.qla4xxx for copyright and licensing details. | 5 | * See LICENSE.qla4xxx for copyright and licensing details. |
| 6 | */ | 6 | */ |
| 7 | 7 | ||
| 8 | #define QLA4XXX_DRIVER_VERSION "5.02.00-k8" | 8 | #define QLA4XXX_DRIVER_VERSION "5.02.00-k9" |
diff --git a/drivers/ssb/driver_pcicore.c b/drivers/ssb/driver_pcicore.c index 84c934c0a54..520e8286db2 100644 --- a/drivers/ssb/driver_pcicore.c +++ b/drivers/ssb/driver_pcicore.c | |||
| @@ -517,10 +517,14 @@ static void ssb_pcicore_pcie_setup_workarounds(struct ssb_pcicore *pc) | |||
| 517 | 517 | ||
| 518 | static void __devinit ssb_pcicore_init_clientmode(struct ssb_pcicore *pc) | 518 | static void __devinit ssb_pcicore_init_clientmode(struct ssb_pcicore *pc) |
| 519 | { | 519 | { |
| 520 | ssb_pcicore_fix_sprom_core_index(pc); | 520 | struct ssb_device *pdev = pc->dev; |
| 521 | struct ssb_bus *bus = pdev->bus; | ||
| 522 | |||
| 523 | if (bus->bustype == SSB_BUSTYPE_PCI) | ||
| 524 | ssb_pcicore_fix_sprom_core_index(pc); | ||
| 521 | 525 | ||
| 522 | /* Disable PCI interrupts. */ | 526 | /* Disable PCI interrupts. */ |
| 523 | ssb_write32(pc->dev, SSB_INTVEC, 0); | 527 | ssb_write32(pdev, SSB_INTVEC, 0); |
| 524 | 528 | ||
| 525 | /* Additional PCIe always once-executed workarounds */ | 529 | /* Additional PCIe always once-executed workarounds */ |
| 526 | if (pc->dev->id.coreid == SSB_DEV_PCIE) { | 530 | if (pc->dev->id.coreid == SSB_DEV_PCIE) { |
diff --git a/drivers/staging/rtl8712/usb_intf.c b/drivers/staging/rtl8712/usb_intf.c index fb2e89c3056..5385da2e9cd 100644 --- a/drivers/staging/rtl8712/usb_intf.c +++ b/drivers/staging/rtl8712/usb_intf.c | |||
| @@ -89,6 +89,7 @@ static struct usb_device_id rtl871x_usb_id_tbl[] = { | |||
| 89 | {USB_DEVICE(0x0DF6, 0x0045)}, | 89 | {USB_DEVICE(0x0DF6, 0x0045)}, |
| 90 | {USB_DEVICE(0x0DF6, 0x0059)}, /* 11n mode disable */ | 90 | {USB_DEVICE(0x0DF6, 0x0059)}, /* 11n mode disable */ |
| 91 | {USB_DEVICE(0x0DF6, 0x004B)}, | 91 | {USB_DEVICE(0x0DF6, 0x004B)}, |
| 92 | {USB_DEVICE(0x0DF6, 0x005D)}, | ||
| 92 | {USB_DEVICE(0x0DF6, 0x0063)}, | 93 | {USB_DEVICE(0x0DF6, 0x0063)}, |
| 93 | /* Sweex */ | 94 | /* Sweex */ |
| 94 | {USB_DEVICE(0x177F, 0x0154)}, | 95 | {USB_DEVICE(0x177F, 0x0154)}, |
diff --git a/drivers/staging/tidspbridge/core/dsp-clock.c b/drivers/staging/tidspbridge/core/dsp-clock.c index 3d1279c424a..7eb56178fb6 100644 --- a/drivers/staging/tidspbridge/core/dsp-clock.c +++ b/drivers/staging/tidspbridge/core/dsp-clock.c | |||
| @@ -54,6 +54,7 @@ | |||
| 54 | 54 | ||
| 55 | /* Bridge GPT id (1 - 4), DM Timer id (5 - 8) */ | 55 | /* Bridge GPT id (1 - 4), DM Timer id (5 - 8) */ |
| 56 | #define DMT_ID(id) ((id) + 4) | 56 | #define DMT_ID(id) ((id) + 4) |
| 57 | #define DM_TIMER_CLOCKS 4 | ||
| 57 | 58 | ||
| 58 | /* Bridge MCBSP id (6 - 10), OMAP Mcbsp id (0 - 4) */ | 59 | /* Bridge MCBSP id (6 - 10), OMAP Mcbsp id (0 - 4) */ |
| 59 | #define MCBSP_ID(id) ((id) - 6) | 60 | #define MCBSP_ID(id) ((id) - 6) |
| @@ -114,8 +115,13 @@ static s8 get_clk_type(u8 id) | |||
| 114 | */ | 115 | */ |
| 115 | void dsp_clk_exit(void) | 116 | void dsp_clk_exit(void) |
| 116 | { | 117 | { |
| 118 | int i; | ||
| 119 | |||
| 117 | dsp_clock_disable_all(dsp_clocks); | 120 | dsp_clock_disable_all(dsp_clocks); |
| 118 | 121 | ||
| 122 | for (i = 0; i < DM_TIMER_CLOCKS; i++) | ||
| 123 | omap_dm_timer_free(timer[i]); | ||
| 124 | |||
| 119 | clk_put(iva2_clk); | 125 | clk_put(iva2_clk); |
| 120 | clk_put(ssi.sst_fck); | 126 | clk_put(ssi.sst_fck); |
| 121 | clk_put(ssi.ssr_fck); | 127 | clk_put(ssi.ssr_fck); |
| @@ -130,9 +136,13 @@ void dsp_clk_exit(void) | |||
| 130 | void dsp_clk_init(void) | 136 | void dsp_clk_init(void) |
| 131 | { | 137 | { |
| 132 | static struct platform_device dspbridge_device; | 138 | static struct platform_device dspbridge_device; |
| 139 | int i, id; | ||
| 133 | 140 | ||
| 134 | dspbridge_device.dev.bus = &platform_bus_type; | 141 | dspbridge_device.dev.bus = &platform_bus_type; |
| 135 | 142 | ||
| 143 | for (i = 0, id = 5; i < DM_TIMER_CLOCKS; i++, id++) | ||
| 144 | timer[i] = omap_dm_timer_request_specific(id); | ||
| 145 | |||
| 136 | iva2_clk = clk_get(&dspbridge_device.dev, "iva2_ck"); | 146 | iva2_clk = clk_get(&dspbridge_device.dev, "iva2_ck"); |
| 137 | if (IS_ERR(iva2_clk)) | 147 | if (IS_ERR(iva2_clk)) |
| 138 | dev_err(bridge, "failed to get iva2 clock %p\n", iva2_clk); | 148 | dev_err(bridge, "failed to get iva2 clock %p\n", iva2_clk); |
| @@ -204,8 +214,7 @@ int dsp_clk_enable(enum dsp_clk_id clk_id) | |||
| 204 | clk_enable(iva2_clk); | 214 | clk_enable(iva2_clk); |
| 205 | break; | 215 | break; |
| 206 | case GPT_CLK: | 216 | case GPT_CLK: |
| 207 | timer[clk_id - 1] = | 217 | status = omap_dm_timer_start(timer[clk_id - 1]); |
| 208 | omap_dm_timer_request_specific(DMT_ID(clk_id)); | ||
| 209 | break; | 218 | break; |
| 210 | #ifdef CONFIG_OMAP_MCBSP | 219 | #ifdef CONFIG_OMAP_MCBSP |
| 211 | case MCBSP_CLK: | 220 | case MCBSP_CLK: |
| @@ -281,7 +290,7 @@ int dsp_clk_disable(enum dsp_clk_id clk_id) | |||
| 281 | clk_disable(iva2_clk); | 290 | clk_disable(iva2_clk); |
| 282 | break; | 291 | break; |
| 283 | case GPT_CLK: | 292 | case GPT_CLK: |
| 284 | omap_dm_timer_free(timer[clk_id - 1]); | 293 | status = omap_dm_timer_stop(timer[clk_id - 1]); |
| 285 | break; | 294 | break; |
| 286 | #ifdef CONFIG_OMAP_MCBSP | 295 | #ifdef CONFIG_OMAP_MCBSP |
| 287 | case MCBSP_CLK: | 296 | case MCBSP_CLK: |
diff --git a/drivers/staging/tidspbridge/rmgr/drv_interface.c b/drivers/staging/tidspbridge/rmgr/drv_interface.c index c43c7e3421c..76cfc6edecd 100644 --- a/drivers/staging/tidspbridge/rmgr/drv_interface.c +++ b/drivers/staging/tidspbridge/rmgr/drv_interface.c | |||
| @@ -24,11 +24,7 @@ | |||
| 24 | #include <linux/types.h> | 24 | #include <linux/types.h> |
| 25 | #include <linux/platform_device.h> | 25 | #include <linux/platform_device.h> |
| 26 | #include <linux/pm.h> | 26 | #include <linux/pm.h> |
| 27 | |||
| 28 | #ifdef MODULE | ||
| 29 | #include <linux/module.h> | 27 | #include <linux/module.h> |
| 30 | #endif | ||
| 31 | |||
| 32 | #include <linux/device.h> | 28 | #include <linux/device.h> |
| 33 | #include <linux/init.h> | 29 | #include <linux/init.h> |
| 34 | #include <linux/moduleparam.h> | 30 | #include <linux/moduleparam.h> |
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index e8c564a5334..a8078d0638f 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c | |||
| @@ -1458,6 +1458,16 @@ static const struct usb_device_id acm_ids[] = { | |||
| 1458 | }, | 1458 | }, |
| 1459 | { USB_DEVICE(0x22b8, 0x6425), /* Motorola MOTOMAGX phones */ | 1459 | { USB_DEVICE(0x22b8, 0x6425), /* Motorola MOTOMAGX phones */ |
| 1460 | }, | 1460 | }, |
| 1461 | /* Motorola H24 HSPA module: */ | ||
| 1462 | { USB_DEVICE(0x22b8, 0x2d91) }, /* modem */ | ||
| 1463 | { USB_DEVICE(0x22b8, 0x2d92) }, /* modem + diagnostics */ | ||
| 1464 | { USB_DEVICE(0x22b8, 0x2d93) }, /* modem + AT port */ | ||
| 1465 | { USB_DEVICE(0x22b8, 0x2d95) }, /* modem + AT port + diagnostics */ | ||
| 1466 | { USB_DEVICE(0x22b8, 0x2d96) }, /* modem + NMEA */ | ||
| 1467 | { USB_DEVICE(0x22b8, 0x2d97) }, /* modem + diagnostics + NMEA */ | ||
| 1468 | { USB_DEVICE(0x22b8, 0x2d99) }, /* modem + AT port + NMEA */ | ||
| 1469 | { USB_DEVICE(0x22b8, 0x2d9a) }, /* modem + AT port + diagnostics + NMEA */ | ||
| 1470 | |||
| 1461 | { USB_DEVICE(0x0572, 0x1329), /* Hummingbird huc56s (Conexant) */ | 1471 | { USB_DEVICE(0x0572, 0x1329), /* Hummingbird huc56s (Conexant) */ |
| 1462 | .driver_info = NO_UNION_NORMAL, /* union descriptor misplaced on | 1472 | .driver_info = NO_UNION_NORMAL, /* union descriptor misplaced on |
| 1463 | data interface instead of | 1473 | data interface instead of |
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index 717ebc9ff94..600d8234851 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c | |||
| @@ -264,7 +264,7 @@ static int __devinit dwc3_core_init(struct dwc3 *dwc) | |||
| 264 | ret = -ENODEV; | 264 | ret = -ENODEV; |
| 265 | goto err0; | 265 | goto err0; |
| 266 | } | 266 | } |
| 267 | dwc->revision = reg & DWC3_GSNPSREV_MASK; | 267 | dwc->revision = reg; |
| 268 | 268 | ||
| 269 | dwc3_core_soft_reset(dwc); | 269 | dwc3_core_soft_reset(dwc); |
| 270 | 270 | ||
diff --git a/drivers/usb/gadget/epautoconf.c b/drivers/usb/gadget/epautoconf.c index 596a0b464e6..4dff83d2f26 100644 --- a/drivers/usb/gadget/epautoconf.c +++ b/drivers/usb/gadget/epautoconf.c | |||
| @@ -130,9 +130,6 @@ ep_matches ( | |||
| 130 | num_req_streams = ep_comp->bmAttributes & 0x1f; | 130 | num_req_streams = ep_comp->bmAttributes & 0x1f; |
| 131 | if (num_req_streams > ep->max_streams) | 131 | if (num_req_streams > ep->max_streams) |
| 132 | return 0; | 132 | return 0; |
| 133 | /* Update the ep_comp descriptor if needed */ | ||
| 134 | if (num_req_streams != ep->max_streams) | ||
| 135 | ep_comp->bmAttributes = ep->max_streams; | ||
| 136 | } | 133 | } |
| 137 | 134 | ||
| 138 | } | 135 | } |
diff --git a/drivers/usb/gadget/f_mass_storage.c b/drivers/usb/gadget/f_mass_storage.c index c39d58860fa..1a6f415c0d0 100644 --- a/drivers/usb/gadget/f_mass_storage.c +++ b/drivers/usb/gadget/f_mass_storage.c | |||
| @@ -2975,6 +2975,7 @@ static void fsg_unbind(struct usb_configuration *c, struct usb_function *f) | |||
| 2975 | fsg_common_put(common); | 2975 | fsg_common_put(common); |
| 2976 | usb_free_descriptors(fsg->function.descriptors); | 2976 | usb_free_descriptors(fsg->function.descriptors); |
| 2977 | usb_free_descriptors(fsg->function.hs_descriptors); | 2977 | usb_free_descriptors(fsg->function.hs_descriptors); |
| 2978 | usb_free_descriptors(fsg->function.ss_descriptors); | ||
| 2978 | kfree(fsg); | 2979 | kfree(fsg); |
| 2979 | } | 2980 | } |
| 2980 | 2981 | ||
diff --git a/drivers/usb/host/isp1760-if.c b/drivers/usb/host/isp1760-if.c index a7dc1e1d45f..2ac4ac2e4ef 100644 --- a/drivers/usb/host/isp1760-if.c +++ b/drivers/usb/host/isp1760-if.c | |||
| @@ -18,7 +18,7 @@ | |||
| 18 | 18 | ||
| 19 | #include "isp1760-hcd.h" | 19 | #include "isp1760-hcd.h" |
| 20 | 20 | ||
| 21 | #ifdef CONFIG_OF | 21 | #if defined(CONFIG_OF) && defined(CONFIG_OF_IRQ) |
| 22 | #include <linux/slab.h> | 22 | #include <linux/slab.h> |
| 23 | #include <linux/of.h> | 23 | #include <linux/of.h> |
| 24 | #include <linux/of_platform.h> | 24 | #include <linux/of_platform.h> |
| @@ -31,7 +31,7 @@ | |||
| 31 | #include <linux/pci.h> | 31 | #include <linux/pci.h> |
| 32 | #endif | 32 | #endif |
| 33 | 33 | ||
| 34 | #ifdef CONFIG_OF | 34 | #if defined(CONFIG_OF) && defined(CONFIG_OF_IRQ) |
| 35 | struct isp1760 { | 35 | struct isp1760 { |
| 36 | struct usb_hcd *hcd; | 36 | struct usb_hcd *hcd; |
| 37 | int rst_gpio; | 37 | int rst_gpio; |
| @@ -437,7 +437,7 @@ static int __init isp1760_init(void) | |||
| 437 | ret = platform_driver_register(&isp1760_plat_driver); | 437 | ret = platform_driver_register(&isp1760_plat_driver); |
| 438 | if (!ret) | 438 | if (!ret) |
| 439 | any_ret = 0; | 439 | any_ret = 0; |
| 440 | #ifdef CONFIG_OF | 440 | #if defined(CONFIG_OF) && defined(CONFIG_OF_IRQ) |
| 441 | ret = platform_driver_register(&isp1760_of_driver); | 441 | ret = platform_driver_register(&isp1760_of_driver); |
| 442 | if (!ret) | 442 | if (!ret) |
| 443 | any_ret = 0; | 443 | any_ret = 0; |
| @@ -457,7 +457,7 @@ module_init(isp1760_init); | |||
| 457 | static void __exit isp1760_exit(void) | 457 | static void __exit isp1760_exit(void) |
| 458 | { | 458 | { |
| 459 | platform_driver_unregister(&isp1760_plat_driver); | 459 | platform_driver_unregister(&isp1760_plat_driver); |
| 460 | #ifdef CONFIG_OF | 460 | #if defined(CONFIG_OF) && defined(CONFIG_OF_IRQ) |
| 461 | platform_driver_unregister(&isp1760_of_driver); | 461 | platform_driver_unregister(&isp1760_of_driver); |
| 462 | #endif | 462 | #endif |
| 463 | #ifdef CONFIG_PCI | 463 | #ifdef CONFIG_PCI |
diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c index 60ddba8066e..79cb0af779f 100644 --- a/drivers/usb/musb/musb_host.c +++ b/drivers/usb/musb/musb_host.c | |||
| @@ -774,6 +774,10 @@ static void musb_ep_program(struct musb *musb, u8 epnum, | |||
| 774 | if (musb->double_buffer_not_ok) | 774 | if (musb->double_buffer_not_ok) |
| 775 | musb_writew(epio, MUSB_TXMAXP, | 775 | musb_writew(epio, MUSB_TXMAXP, |
| 776 | hw_ep->max_packet_sz_tx); | 776 | hw_ep->max_packet_sz_tx); |
| 777 | else if (can_bulk_split(musb, qh->type)) | ||
| 778 | musb_writew(epio, MUSB_TXMAXP, packet_sz | ||
| 779 | | ((hw_ep->max_packet_sz_tx / | ||
| 780 | packet_sz) - 1) << 11); | ||
| 777 | else | 781 | else |
| 778 | musb_writew(epio, MUSB_TXMAXP, | 782 | musb_writew(epio, MUSB_TXMAXP, |
| 779 | qh->maxpacket | | 783 | qh->maxpacket | |
diff --git a/drivers/usb/renesas_usbhs/mod.c b/drivers/usb/renesas_usbhs/mod.c index 053f86d7000..ad96a389672 100644 --- a/drivers/usb/renesas_usbhs/mod.c +++ b/drivers/usb/renesas_usbhs/mod.c | |||
| @@ -349,7 +349,7 @@ void usbhs_irq_callback_update(struct usbhs_priv *priv, struct usbhs_mod *mod) | |||
| 349 | if (mod->irq_attch) | 349 | if (mod->irq_attch) |
| 350 | intenb1 |= ATTCHE; | 350 | intenb1 |= ATTCHE; |
| 351 | 351 | ||
| 352 | if (mod->irq_attch) | 352 | if (mod->irq_dtch) |
| 353 | intenb1 |= DTCHE; | 353 | intenb1 |= DTCHE; |
| 354 | 354 | ||
| 355 | if (mod->irq_sign) | 355 | if (mod->irq_sign) |
diff --git a/drivers/usb/renesas_usbhs/mod_host.c b/drivers/usb/renesas_usbhs/mod_host.c index bade761a1e5..7955de58995 100644 --- a/drivers/usb/renesas_usbhs/mod_host.c +++ b/drivers/usb/renesas_usbhs/mod_host.c | |||
| @@ -1267,6 +1267,7 @@ int usbhs_mod_host_probe(struct usbhs_priv *priv) | |||
| 1267 | dev_err(dev, "Failed to create hcd\n"); | 1267 | dev_err(dev, "Failed to create hcd\n"); |
| 1268 | return -ENOMEM; | 1268 | return -ENOMEM; |
| 1269 | } | 1269 | } |
| 1270 | hcd->has_tt = 1; /* for low/full speed */ | ||
| 1270 | 1271 | ||
| 1271 | pipe_info = kzalloc(sizeof(*pipe_info) * pipe_size, GFP_KERNEL); | 1272 | pipe_info = kzalloc(sizeof(*pipe_info) * pipe_size, GFP_KERNEL); |
| 1272 | if (!pipe_info) { | 1273 | if (!pipe_info) { |
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index e3426602dc8..6dd64534fad 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
| @@ -663,7 +663,12 @@ static const struct usb_device_id option_ids[] = { | |||
| 663 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x01, 0x01) }, | 663 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x01, 0x01) }, |
| 664 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x01, 0x02) }, | 664 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x01, 0x02) }, |
| 665 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x01, 0x03) }, | 665 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x01, 0x03) }, |
| 666 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x01, 0x08) }, | 666 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x01, 0x10) }, |
| 667 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x01, 0x12) }, | ||
| 668 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x01, 0x13) }, | ||
| 669 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x02, 0x01) }, /* E398 3G Modem */ | ||
| 670 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x02, 0x02) }, /* E398 3G PC UI Interface */ | ||
| 671 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x02, 0x03) }, /* E398 3G Application Interface */ | ||
| 667 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V640) }, | 672 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V640) }, |
| 668 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V620) }, | 673 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V620) }, |
| 669 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V740) }, | 674 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V740) }, |
diff --git a/drivers/xen/swiotlb-xen.c b/drivers/xen/swiotlb-xen.c index 8e964b91c44..284798aaf8b 100644 --- a/drivers/xen/swiotlb-xen.c +++ b/drivers/xen/swiotlb-xen.c | |||
| @@ -166,7 +166,7 @@ retry: | |||
| 166 | /* | 166 | /* |
| 167 | * Get IO TLB memory from any location. | 167 | * Get IO TLB memory from any location. |
| 168 | */ | 168 | */ |
| 169 | xen_io_tlb_start = alloc_bootmem(bytes); | 169 | xen_io_tlb_start = alloc_bootmem_pages(PAGE_ALIGN(bytes)); |
| 170 | if (!xen_io_tlb_start) { | 170 | if (!xen_io_tlb_start) { |
| 171 | m = "Cannot allocate Xen-SWIOTLB buffer!\n"; | 171 | m = "Cannot allocate Xen-SWIOTLB buffer!\n"; |
| 172 | goto error; | 172 | goto error; |
| @@ -179,7 +179,7 @@ retry: | |||
| 179 | bytes, | 179 | bytes, |
| 180 | xen_io_tlb_nslabs); | 180 | xen_io_tlb_nslabs); |
| 181 | if (rc) { | 181 | if (rc) { |
| 182 | free_bootmem(__pa(xen_io_tlb_start), bytes); | 182 | free_bootmem(__pa(xen_io_tlb_start), PAGE_ALIGN(bytes)); |
| 183 | m = "Failed to get contiguous memory for DMA from Xen!\n"\ | 183 | m = "Failed to get contiguous memory for DMA from Xen!\n"\ |
| 184 | "You either: don't have the permissions, do not have"\ | 184 | "You either: don't have the permissions, do not have"\ |
| 185 | " enough free memory under 4GB, or the hypervisor memory"\ | 185 | " enough free memory under 4GB, or the hypervisor memory"\ |
diff --git a/drivers/xen/xenbus/xenbus_xs.c b/drivers/xen/xenbus/xenbus_xs.c index b3b8f2f3ad1..ede860f921d 100644 --- a/drivers/xen/xenbus/xenbus_xs.c +++ b/drivers/xen/xenbus/xenbus_xs.c | |||
| @@ -621,15 +621,6 @@ static struct xenbus_watch *find_watch(const char *token) | |||
| 621 | return NULL; | 621 | return NULL; |
| 622 | } | 622 | } |
| 623 | 623 | ||
| 624 | static void xs_reset_watches(void) | ||
| 625 | { | ||
| 626 | int err; | ||
| 627 | |||
| 628 | err = xs_error(xs_single(XBT_NIL, XS_RESET_WATCHES, "", NULL)); | ||
| 629 | if (err && err != -EEXIST) | ||
| 630 | printk(KERN_WARNING "xs_reset_watches failed: %d\n", err); | ||
| 631 | } | ||
| 632 | |||
| 633 | /* Register callback to watch this node. */ | 624 | /* Register callback to watch this node. */ |
| 634 | int register_xenbus_watch(struct xenbus_watch *watch) | 625 | int register_xenbus_watch(struct xenbus_watch *watch) |
| 635 | { | 626 | { |
| @@ -906,9 +897,5 @@ int xs_init(void) | |||
| 906 | if (IS_ERR(task)) | 897 | if (IS_ERR(task)) |
| 907 | return PTR_ERR(task); | 898 | return PTR_ERR(task); |
| 908 | 899 | ||
| 909 | /* shutdown watches for kexec boot */ | ||
| 910 | if (xen_hvm_domain()) | ||
| 911 | xs_reset_watches(); | ||
| 912 | |||
| 913 | return 0; | 900 | return 0; |
| 914 | } | 901 | } |
diff --git a/firmware/README.AddingFirmware b/firmware/README.AddingFirmware index e24cd8986d8..ea78c3a17ee 100644 --- a/firmware/README.AddingFirmware +++ b/firmware/README.AddingFirmware | |||
| @@ -12,7 +12,7 @@ here. | |||
| 12 | This directory is _NOT_ for adding arbitrary new firmware images. The | 12 | This directory is _NOT_ for adding arbitrary new firmware images. The |
| 13 | place to add those is the separate linux-firmware repository: | 13 | place to add those is the separate linux-firmware repository: |
| 14 | 14 | ||
| 15 | git://git.kernel.org/pub/scm/linux/kernel/git/dwmw2/linux-firmware.git | 15 | git://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git |
| 16 | 16 | ||
| 17 | That repository contains all these firmware images which have been | 17 | That repository contains all these firmware images which have been |
| 18 | extracted from older drivers, as well various new firmware images which | 18 | extracted from older drivers, as well various new firmware images which |
| @@ -22,6 +22,7 @@ been permitted to redistribute under separate cover. | |||
| 22 | To submit firmware to that repository, please send either a git binary | 22 | To submit firmware to that repository, please send either a git binary |
| 23 | diff or preferably a git pull request to: | 23 | diff or preferably a git pull request to: |
| 24 | David Woodhouse <dwmw2@infradead.org> | 24 | David Woodhouse <dwmw2@infradead.org> |
| 25 | Ben Hutchings <ben@decadent.org.uk> | ||
| 25 | 26 | ||
| 26 | Your commit should include an update to the WHENCE file clearly | 27 | Your commit should include an update to the WHENCE file clearly |
| 27 | identifying the licence under which the firmware is available, and | 28 | identifying the licence under which the firmware is available, and |
diff --git a/fs/btrfs/async-thread.c b/fs/btrfs/async-thread.c index 7ec14097fef..0b394580d86 100644 --- a/fs/btrfs/async-thread.c +++ b/fs/btrfs/async-thread.c | |||
| @@ -64,6 +64,8 @@ struct btrfs_worker_thread { | |||
| 64 | int idle; | 64 | int idle; |
| 65 | }; | 65 | }; |
| 66 | 66 | ||
| 67 | static int __btrfs_start_workers(struct btrfs_workers *workers); | ||
| 68 | |||
| 67 | /* | 69 | /* |
| 68 | * btrfs_start_workers uses kthread_run, which can block waiting for memory | 70 | * btrfs_start_workers uses kthread_run, which can block waiting for memory |
| 69 | * for a very long time. It will actually throttle on page writeback, | 71 | * for a very long time. It will actually throttle on page writeback, |
| @@ -88,27 +90,10 @@ static void start_new_worker_func(struct btrfs_work *work) | |||
| 88 | { | 90 | { |
| 89 | struct worker_start *start; | 91 | struct worker_start *start; |
| 90 | start = container_of(work, struct worker_start, work); | 92 | start = container_of(work, struct worker_start, work); |
| 91 | btrfs_start_workers(start->queue, 1); | 93 | __btrfs_start_workers(start->queue); |
| 92 | kfree(start); | 94 | kfree(start); |
| 93 | } | 95 | } |
| 94 | 96 | ||
| 95 | static int start_new_worker(struct btrfs_workers *queue) | ||
| 96 | { | ||
| 97 | struct worker_start *start; | ||
| 98 | int ret; | ||
| 99 | |||
| 100 | start = kzalloc(sizeof(*start), GFP_NOFS); | ||
| 101 | if (!start) | ||
| 102 | return -ENOMEM; | ||
| 103 | |||
| 104 | start->work.func = start_new_worker_func; | ||
| 105 | start->queue = queue; | ||
| 106 | ret = btrfs_queue_worker(queue->atomic_worker_start, &start->work); | ||
| 107 | if (ret) | ||
| 108 | kfree(start); | ||
| 109 | return ret; | ||
| 110 | } | ||
| 111 | |||
| 112 | /* | 97 | /* |
| 113 | * helper function to move a thread onto the idle list after it | 98 | * helper function to move a thread onto the idle list after it |
| 114 | * has finished some requests. | 99 | * has finished some requests. |
| @@ -153,12 +138,20 @@ static void check_busy_worker(struct btrfs_worker_thread *worker) | |||
| 153 | static void check_pending_worker_creates(struct btrfs_worker_thread *worker) | 138 | static void check_pending_worker_creates(struct btrfs_worker_thread *worker) |
| 154 | { | 139 | { |
| 155 | struct btrfs_workers *workers = worker->workers; | 140 | struct btrfs_workers *workers = worker->workers; |
| 141 | struct worker_start *start; | ||
| 156 | unsigned long flags; | 142 | unsigned long flags; |
| 157 | 143 | ||
| 158 | rmb(); | 144 | rmb(); |
| 159 | if (!workers->atomic_start_pending) | 145 | if (!workers->atomic_start_pending) |
| 160 | return; | 146 | return; |
| 161 | 147 | ||
| 148 | start = kzalloc(sizeof(*start), GFP_NOFS); | ||
| 149 | if (!start) | ||
| 150 | return; | ||
| 151 | |||
| 152 | start->work.func = start_new_worker_func; | ||
| 153 | start->queue = workers; | ||
| 154 | |||
| 162 | spin_lock_irqsave(&workers->lock, flags); | 155 | spin_lock_irqsave(&workers->lock, flags); |
| 163 | if (!workers->atomic_start_pending) | 156 | if (!workers->atomic_start_pending) |
| 164 | goto out; | 157 | goto out; |
| @@ -170,10 +163,11 @@ static void check_pending_worker_creates(struct btrfs_worker_thread *worker) | |||
| 170 | 163 | ||
| 171 | workers->num_workers_starting += 1; | 164 | workers->num_workers_starting += 1; |
| 172 | spin_unlock_irqrestore(&workers->lock, flags); | 165 | spin_unlock_irqrestore(&workers->lock, flags); |
| 173 | start_new_worker(workers); | 166 | btrfs_queue_worker(workers->atomic_worker_start, &start->work); |
| 174 | return; | 167 | return; |
| 175 | 168 | ||
| 176 | out: | 169 | out: |
| 170 | kfree(start); | ||
| 177 | spin_unlock_irqrestore(&workers->lock, flags); | 171 | spin_unlock_irqrestore(&workers->lock, flags); |
| 178 | } | 172 | } |
| 179 | 173 | ||
| @@ -331,7 +325,7 @@ again: | |||
| 331 | run_ordered_completions(worker->workers, work); | 325 | run_ordered_completions(worker->workers, work); |
| 332 | 326 | ||
| 333 | check_pending_worker_creates(worker); | 327 | check_pending_worker_creates(worker); |
| 334 | 328 | cond_resched(); | |
| 335 | } | 329 | } |
| 336 | 330 | ||
| 337 | spin_lock_irq(&worker->lock); | 331 | spin_lock_irq(&worker->lock); |
| @@ -462,56 +456,55 @@ void btrfs_init_workers(struct btrfs_workers *workers, char *name, int max, | |||
| 462 | * starts new worker threads. This does not enforce the max worker | 456 | * starts new worker threads. This does not enforce the max worker |
| 463 | * count in case you need to temporarily go past it. | 457 | * count in case you need to temporarily go past it. |
| 464 | */ | 458 | */ |
| 465 | static int __btrfs_start_workers(struct btrfs_workers *workers, | 459 | static int __btrfs_start_workers(struct btrfs_workers *workers) |
| 466 | int num_workers) | ||
| 467 | { | 460 | { |
| 468 | struct btrfs_worker_thread *worker; | 461 | struct btrfs_worker_thread *worker; |
| 469 | int ret = 0; | 462 | int ret = 0; |
| 470 | int i; | ||
| 471 | 463 | ||
| 472 | for (i = 0; i < num_workers; i++) { | 464 | worker = kzalloc(sizeof(*worker), GFP_NOFS); |
| 473 | worker = kzalloc(sizeof(*worker), GFP_NOFS); | 465 | if (!worker) { |
| 474 | if (!worker) { | 466 | ret = -ENOMEM; |
| 475 | ret = -ENOMEM; | 467 | goto fail; |
| 476 | goto fail; | 468 | } |
| 477 | } | ||
| 478 | 469 | ||
| 479 | INIT_LIST_HEAD(&worker->pending); | 470 | INIT_LIST_HEAD(&worker->pending); |
| 480 | INIT_LIST_HEAD(&worker->prio_pending); | 471 | INIT_LIST_HEAD(&worker->prio_pending); |
| 481 | INIT_LIST_HEAD(&worker->worker_list); | 472 | INIT_LIST_HEAD(&worker->worker_list); |
| 482 | spin_lock_init(&worker->lock); | 473 | spin_lock_init(&worker->lock); |
| 483 | 474 | ||
| 484 | atomic_set(&worker->num_pending, 0); | 475 | atomic_set(&worker->num_pending, 0); |
| 485 | atomic_set(&worker->refs, 1); | 476 | atomic_set(&worker->refs, 1); |
| 486 | worker->workers = workers; | 477 | worker->workers = workers; |
| 487 | worker->task = kthread_run(worker_loop, worker, | 478 | worker->task = kthread_run(worker_loop, worker, |
| 488 | "btrfs-%s-%d", workers->name, | 479 | "btrfs-%s-%d", workers->name, |
| 489 | workers->num_workers + i); | 480 | workers->num_workers + 1); |
| 490 | if (IS_ERR(worker->task)) { | 481 | if (IS_ERR(worker->task)) { |
| 491 | ret = PTR_ERR(worker->task); | 482 | ret = PTR_ERR(worker->task); |
| 492 | kfree(worker); | 483 | kfree(worker); |
| 493 | goto fail; | 484 | goto fail; |
| 494 | } | ||
| 495 | spin_lock_irq(&workers->lock); | ||
| 496 | list_add_tail(&worker->worker_list, &workers->idle_list); | ||
| 497 | worker->idle = 1; | ||
| 498 | workers->num_workers++; | ||
| 499 | workers->num_workers_starting--; | ||
| 500 | WARN_ON(workers->num_workers_starting < 0); | ||
| 501 | spin_unlock_irq(&workers->lock); | ||
| 502 | } | 485 | } |
| 486 | spin_lock_irq(&workers->lock); | ||
| 487 | list_add_tail(&worker->worker_list, &workers->idle_list); | ||
| 488 | worker->idle = 1; | ||
| 489 | workers->num_workers++; | ||
| 490 | workers->num_workers_starting--; | ||
| 491 | WARN_ON(workers->num_workers_starting < 0); | ||
| 492 | spin_unlock_irq(&workers->lock); | ||
| 493 | |||
| 503 | return 0; | 494 | return 0; |
| 504 | fail: | 495 | fail: |
| 505 | btrfs_stop_workers(workers); | 496 | spin_lock_irq(&workers->lock); |
| 497 | workers->num_workers_starting--; | ||
| 498 | spin_unlock_irq(&workers->lock); | ||
| 506 | return ret; | 499 | return ret; |
| 507 | } | 500 | } |
| 508 | 501 | ||
| 509 | int btrfs_start_workers(struct btrfs_workers *workers, int num_workers) | 502 | int btrfs_start_workers(struct btrfs_workers *workers) |
| 510 | { | 503 | { |
| 511 | spin_lock_irq(&workers->lock); | 504 | spin_lock_irq(&workers->lock); |
| 512 | workers->num_workers_starting += num_workers; | 505 | workers->num_workers_starting++; |
| 513 | spin_unlock_irq(&workers->lock); | 506 | spin_unlock_irq(&workers->lock); |
| 514 | return __btrfs_start_workers(workers, num_workers); | 507 | return __btrfs_start_workers(workers); |
| 515 | } | 508 | } |
| 516 | 509 | ||
| 517 | /* | 510 | /* |
| @@ -568,9 +561,10 @@ static struct btrfs_worker_thread *find_worker(struct btrfs_workers *workers) | |||
| 568 | struct btrfs_worker_thread *worker; | 561 | struct btrfs_worker_thread *worker; |
| 569 | unsigned long flags; | 562 | unsigned long flags; |
| 570 | struct list_head *fallback; | 563 | struct list_head *fallback; |
| 564 | int ret; | ||
| 571 | 565 | ||
| 572 | again: | ||
| 573 | spin_lock_irqsave(&workers->lock, flags); | 566 | spin_lock_irqsave(&workers->lock, flags); |
| 567 | again: | ||
| 574 | worker = next_worker(workers); | 568 | worker = next_worker(workers); |
| 575 | 569 | ||
| 576 | if (!worker) { | 570 | if (!worker) { |
| @@ -584,7 +578,10 @@ again: | |||
| 584 | workers->num_workers_starting++; | 578 | workers->num_workers_starting++; |
| 585 | spin_unlock_irqrestore(&workers->lock, flags); | 579 | spin_unlock_irqrestore(&workers->lock, flags); |
| 586 | /* we're below the limit, start another worker */ | 580 | /* we're below the limit, start another worker */ |
| 587 | __btrfs_start_workers(workers, 1); | 581 | ret = __btrfs_start_workers(workers); |
| 582 | spin_lock_irqsave(&workers->lock, flags); | ||
| 583 | if (ret) | ||
| 584 | goto fallback; | ||
| 588 | goto again; | 585 | goto again; |
| 589 | } | 586 | } |
| 590 | } | 587 | } |
| @@ -665,7 +662,7 @@ void btrfs_set_work_high_prio(struct btrfs_work *work) | |||
| 665 | /* | 662 | /* |
| 666 | * places a struct btrfs_work into the pending queue of one of the kthreads | 663 | * places a struct btrfs_work into the pending queue of one of the kthreads |
| 667 | */ | 664 | */ |
| 668 | int btrfs_queue_worker(struct btrfs_workers *workers, struct btrfs_work *work) | 665 | void btrfs_queue_worker(struct btrfs_workers *workers, struct btrfs_work *work) |
| 669 | { | 666 | { |
| 670 | struct btrfs_worker_thread *worker; | 667 | struct btrfs_worker_thread *worker; |
| 671 | unsigned long flags; | 668 | unsigned long flags; |
| @@ -673,7 +670,7 @@ int btrfs_queue_worker(struct btrfs_workers *workers, struct btrfs_work *work) | |||
| 673 | 670 | ||
| 674 | /* don't requeue something already on a list */ | 671 | /* don't requeue something already on a list */ |
| 675 | if (test_and_set_bit(WORK_QUEUED_BIT, &work->flags)) | 672 | if (test_and_set_bit(WORK_QUEUED_BIT, &work->flags)) |
| 676 | goto out; | 673 | return; |
| 677 | 674 | ||
| 678 | worker = find_worker(workers); | 675 | worker = find_worker(workers); |
| 679 | if (workers->ordered) { | 676 | if (workers->ordered) { |
| @@ -712,7 +709,4 @@ int btrfs_queue_worker(struct btrfs_workers *workers, struct btrfs_work *work) | |||
| 712 | if (wake) | 709 | if (wake) |
| 713 | wake_up_process(worker->task); | 710 | wake_up_process(worker->task); |
| 714 | spin_unlock_irqrestore(&worker->lock, flags); | 711 | spin_unlock_irqrestore(&worker->lock, flags); |
| 715 | |||
| 716 | out: | ||
| 717 | return 0; | ||
| 718 | } | 712 | } |
diff --git a/fs/btrfs/async-thread.h b/fs/btrfs/async-thread.h index 5077746cf85..f34cc31fa3c 100644 --- a/fs/btrfs/async-thread.h +++ b/fs/btrfs/async-thread.h | |||
| @@ -109,8 +109,8 @@ struct btrfs_workers { | |||
| 109 | char *name; | 109 | char *name; |
| 110 | }; | 110 | }; |
| 111 | 111 | ||
| 112 | int btrfs_queue_worker(struct btrfs_workers *workers, struct btrfs_work *work); | 112 | void btrfs_queue_worker(struct btrfs_workers *workers, struct btrfs_work *work); |
| 113 | int btrfs_start_workers(struct btrfs_workers *workers, int num_workers); | 113 | int btrfs_start_workers(struct btrfs_workers *workers); |
| 114 | int btrfs_stop_workers(struct btrfs_workers *workers); | 114 | int btrfs_stop_workers(struct btrfs_workers *workers); |
| 115 | void btrfs_init_workers(struct btrfs_workers *workers, char *name, int max, | 115 | void btrfs_init_workers(struct btrfs_workers *workers, char *name, int max, |
| 116 | struct btrfs_workers *async_starter); | 116 | struct btrfs_workers *async_starter); |
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index 50634abef9b..67385033323 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h | |||
| @@ -2692,7 +2692,8 @@ int btrfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf); | |||
| 2692 | int btrfs_readpage(struct file *file, struct page *page); | 2692 | int btrfs_readpage(struct file *file, struct page *page); |
| 2693 | void btrfs_evict_inode(struct inode *inode); | 2693 | void btrfs_evict_inode(struct inode *inode); |
| 2694 | int btrfs_write_inode(struct inode *inode, struct writeback_control *wbc); | 2694 | int btrfs_write_inode(struct inode *inode, struct writeback_control *wbc); |
| 2695 | void btrfs_dirty_inode(struct inode *inode, int flags); | 2695 | int btrfs_dirty_inode(struct inode *inode); |
| 2696 | int btrfs_update_time(struct file *file); | ||
| 2696 | struct inode *btrfs_alloc_inode(struct super_block *sb); | 2697 | struct inode *btrfs_alloc_inode(struct super_block *sb); |
| 2697 | void btrfs_destroy_inode(struct inode *inode); | 2698 | void btrfs_destroy_inode(struct inode *inode); |
| 2698 | int btrfs_drop_inode(struct inode *inode); | 2699 | int btrfs_drop_inode(struct inode *inode); |
diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c index 5b163572e0c..9c1eccc2c50 100644 --- a/fs/btrfs/delayed-inode.c +++ b/fs/btrfs/delayed-inode.c | |||
| @@ -640,8 +640,8 @@ static int btrfs_delayed_inode_reserve_metadata( | |||
| 640 | * Now if src_rsv == delalloc_block_rsv we'll let it just steal since | 640 | * Now if src_rsv == delalloc_block_rsv we'll let it just steal since |
| 641 | * we're accounted for. | 641 | * we're accounted for. |
| 642 | */ | 642 | */ |
| 643 | if (!trans->bytes_reserved && | 643 | if (!src_rsv || (!trans->bytes_reserved && |
| 644 | src_rsv != &root->fs_info->delalloc_block_rsv) { | 644 | src_rsv != &root->fs_info->delalloc_block_rsv)) { |
| 645 | ret = btrfs_block_rsv_add_noflush(root, dst_rsv, num_bytes); | 645 | ret = btrfs_block_rsv_add_noflush(root, dst_rsv, num_bytes); |
| 646 | /* | 646 | /* |
| 647 | * Since we're under a transaction reserve_metadata_bytes could | 647 | * Since we're under a transaction reserve_metadata_bytes could |
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 632f8f3cc9d..f44b3928dc2 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
| @@ -2194,19 +2194,27 @@ struct btrfs_root *open_ctree(struct super_block *sb, | |||
| 2194 | fs_info->endio_meta_write_workers.idle_thresh = 2; | 2194 | fs_info->endio_meta_write_workers.idle_thresh = 2; |
| 2195 | fs_info->readahead_workers.idle_thresh = 2; | 2195 | fs_info->readahead_workers.idle_thresh = 2; |
| 2196 | 2196 | ||
| 2197 | btrfs_start_workers(&fs_info->workers, 1); | 2197 | /* |
| 2198 | btrfs_start_workers(&fs_info->generic_worker, 1); | 2198 | * btrfs_start_workers can really only fail because of ENOMEM so just |
| 2199 | btrfs_start_workers(&fs_info->submit_workers, 1); | 2199 | * return -ENOMEM if any of these fail. |
| 2200 | btrfs_start_workers(&fs_info->delalloc_workers, 1); | 2200 | */ |
| 2201 | btrfs_start_workers(&fs_info->fixup_workers, 1); | 2201 | ret = btrfs_start_workers(&fs_info->workers); |
| 2202 | btrfs_start_workers(&fs_info->endio_workers, 1); | 2202 | ret |= btrfs_start_workers(&fs_info->generic_worker); |
| 2203 | btrfs_start_workers(&fs_info->endio_meta_workers, 1); | 2203 | ret |= btrfs_start_workers(&fs_info->submit_workers); |
| 2204 | btrfs_start_workers(&fs_info->endio_meta_write_workers, 1); | 2204 | ret |= btrfs_start_workers(&fs_info->delalloc_workers); |
| 2205 | btrfs_start_workers(&fs_info->endio_write_workers, 1); | 2205 | ret |= btrfs_start_workers(&fs_info->fixup_workers); |
| 2206 | btrfs_start_workers(&fs_info->endio_freespace_worker, 1); | 2206 | ret |= btrfs_start_workers(&fs_info->endio_workers); |
| 2207 | btrfs_start_workers(&fs_info->delayed_workers, 1); | 2207 | ret |= btrfs_start_workers(&fs_info->endio_meta_workers); |
| 2208 | btrfs_start_workers(&fs_info->caching_workers, 1); | 2208 | ret |= btrfs_start_workers(&fs_info->endio_meta_write_workers); |
| 2209 | btrfs_start_workers(&fs_info->readahead_workers, 1); | 2209 | ret |= btrfs_start_workers(&fs_info->endio_write_workers); |
| 2210 | ret |= btrfs_start_workers(&fs_info->endio_freespace_worker); | ||
| 2211 | ret |= btrfs_start_workers(&fs_info->delayed_workers); | ||
| 2212 | ret |= btrfs_start_workers(&fs_info->caching_workers); | ||
| 2213 | ret |= btrfs_start_workers(&fs_info->readahead_workers); | ||
| 2214 | if (ret) { | ||
| 2215 | ret = -ENOMEM; | ||
| 2216 | goto fail_sb_buffer; | ||
| 2217 | } | ||
| 2210 | 2218 | ||
| 2211 | fs_info->bdi.ra_pages *= btrfs_super_num_devices(disk_super); | 2219 | fs_info->bdi.ra_pages *= btrfs_super_num_devices(disk_super); |
| 2212 | fs_info->bdi.ra_pages = max(fs_info->bdi.ra_pages, | 2220 | fs_info->bdi.ra_pages = max(fs_info->bdi.ra_pages, |
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 2ad813674d7..f5fbe576d2b 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
| @@ -2822,7 +2822,7 @@ out_free: | |||
| 2822 | btrfs_release_path(path); | 2822 | btrfs_release_path(path); |
| 2823 | out: | 2823 | out: |
| 2824 | spin_lock(&block_group->lock); | 2824 | spin_lock(&block_group->lock); |
| 2825 | if (!ret) | 2825 | if (!ret && dcs == BTRFS_DC_SETUP) |
| 2826 | block_group->cache_generation = trans->transid; | 2826 | block_group->cache_generation = trans->transid; |
| 2827 | block_group->disk_cache_state = dcs; | 2827 | block_group->disk_cache_state = dcs; |
| 2828 | spin_unlock(&block_group->lock); | 2828 | spin_unlock(&block_group->lock); |
| @@ -4204,12 +4204,17 @@ int btrfs_delalloc_reserve_metadata(struct inode *inode, u64 num_bytes) | |||
| 4204 | struct btrfs_root *root = BTRFS_I(inode)->root; | 4204 | struct btrfs_root *root = BTRFS_I(inode)->root; |
| 4205 | struct btrfs_block_rsv *block_rsv = &root->fs_info->delalloc_block_rsv; | 4205 | struct btrfs_block_rsv *block_rsv = &root->fs_info->delalloc_block_rsv; |
| 4206 | u64 to_reserve = 0; | 4206 | u64 to_reserve = 0; |
| 4207 | u64 csum_bytes; | ||
| 4207 | unsigned nr_extents = 0; | 4208 | unsigned nr_extents = 0; |
| 4209 | int extra_reserve = 0; | ||
| 4208 | int flush = 1; | 4210 | int flush = 1; |
| 4209 | int ret; | 4211 | int ret; |
| 4210 | 4212 | ||
| 4213 | /* Need to be holding the i_mutex here if we aren't free space cache */ | ||
| 4211 | if (btrfs_is_free_space_inode(root, inode)) | 4214 | if (btrfs_is_free_space_inode(root, inode)) |
| 4212 | flush = 0; | 4215 | flush = 0; |
| 4216 | else | ||
| 4217 | WARN_ON(!mutex_is_locked(&inode->i_mutex)); | ||
| 4213 | 4218 | ||
| 4214 | if (flush && btrfs_transaction_in_commit(root->fs_info)) | 4219 | if (flush && btrfs_transaction_in_commit(root->fs_info)) |
| 4215 | schedule_timeout(1); | 4220 | schedule_timeout(1); |
| @@ -4220,11 +4225,9 @@ int btrfs_delalloc_reserve_metadata(struct inode *inode, u64 num_bytes) | |||
| 4220 | BTRFS_I(inode)->outstanding_extents++; | 4225 | BTRFS_I(inode)->outstanding_extents++; |
| 4221 | 4226 | ||
| 4222 | if (BTRFS_I(inode)->outstanding_extents > | 4227 | if (BTRFS_I(inode)->outstanding_extents > |
| 4223 | BTRFS_I(inode)->reserved_extents) { | 4228 | BTRFS_I(inode)->reserved_extents) |
| 4224 | nr_extents = BTRFS_I(inode)->outstanding_extents - | 4229 | nr_extents = BTRFS_I(inode)->outstanding_extents - |
| 4225 | BTRFS_I(inode)->reserved_extents; | 4230 | BTRFS_I(inode)->reserved_extents; |
| 4226 | BTRFS_I(inode)->reserved_extents += nr_extents; | ||
| 4227 | } | ||
| 4228 | 4231 | ||
| 4229 | /* | 4232 | /* |
| 4230 | * Add an item to reserve for updating the inode when we complete the | 4233 | * Add an item to reserve for updating the inode when we complete the |
| @@ -4232,11 +4235,12 @@ int btrfs_delalloc_reserve_metadata(struct inode *inode, u64 num_bytes) | |||
| 4232 | */ | 4235 | */ |
| 4233 | if (!BTRFS_I(inode)->delalloc_meta_reserved) { | 4236 | if (!BTRFS_I(inode)->delalloc_meta_reserved) { |
| 4234 | nr_extents++; | 4237 | nr_extents++; |
| 4235 | BTRFS_I(inode)->delalloc_meta_reserved = 1; | 4238 | extra_reserve = 1; |
| 4236 | } | 4239 | } |
| 4237 | 4240 | ||
| 4238 | to_reserve = btrfs_calc_trans_metadata_size(root, nr_extents); | 4241 | to_reserve = btrfs_calc_trans_metadata_size(root, nr_extents); |
| 4239 | to_reserve += calc_csum_metadata_size(inode, num_bytes, 1); | 4242 | to_reserve += calc_csum_metadata_size(inode, num_bytes, 1); |
| 4243 | csum_bytes = BTRFS_I(inode)->csum_bytes; | ||
| 4240 | spin_unlock(&BTRFS_I(inode)->lock); | 4244 | spin_unlock(&BTRFS_I(inode)->lock); |
| 4241 | 4245 | ||
| 4242 | ret = reserve_metadata_bytes(root, block_rsv, to_reserve, flush); | 4246 | ret = reserve_metadata_bytes(root, block_rsv, to_reserve, flush); |
| @@ -4246,22 +4250,35 @@ int btrfs_delalloc_reserve_metadata(struct inode *inode, u64 num_bytes) | |||
| 4246 | 4250 | ||
| 4247 | spin_lock(&BTRFS_I(inode)->lock); | 4251 | spin_lock(&BTRFS_I(inode)->lock); |
| 4248 | dropped = drop_outstanding_extent(inode); | 4252 | dropped = drop_outstanding_extent(inode); |
| 4249 | to_free = calc_csum_metadata_size(inode, num_bytes, 0); | ||
| 4250 | spin_unlock(&BTRFS_I(inode)->lock); | ||
| 4251 | to_free += btrfs_calc_trans_metadata_size(root, dropped); | ||
| 4252 | |||
| 4253 | /* | 4253 | /* |
| 4254 | * Somebody could have come in and twiddled with the | 4254 | * If the inodes csum_bytes is the same as the original |
| 4255 | * reservation, so if we have to free more than we would have | 4255 | * csum_bytes then we know we haven't raced with any free()ers |
| 4256 | * reserved from this reservation go ahead and release those | 4256 | * so we can just reduce our inodes csum bytes and carry on. |
| 4257 | * bytes. | 4257 | * Otherwise we have to do the normal free thing to account for |
| 4258 | * the case that the free side didn't free up its reserve | ||
| 4259 | * because of this outstanding reservation. | ||
| 4258 | */ | 4260 | */ |
| 4259 | to_free -= to_reserve; | 4261 | if (BTRFS_I(inode)->csum_bytes == csum_bytes) |
| 4262 | calc_csum_metadata_size(inode, num_bytes, 0); | ||
| 4263 | else | ||
| 4264 | to_free = calc_csum_metadata_size(inode, num_bytes, 0); | ||
| 4265 | spin_unlock(&BTRFS_I(inode)->lock); | ||
| 4266 | if (dropped) | ||
| 4267 | to_free += btrfs_calc_trans_metadata_size(root, dropped); | ||
| 4268 | |||
| 4260 | if (to_free) | 4269 | if (to_free) |
| 4261 | btrfs_block_rsv_release(root, block_rsv, to_free); | 4270 | btrfs_block_rsv_release(root, block_rsv, to_free); |
| 4262 | return ret; | 4271 | return ret; |
| 4263 | } | 4272 | } |
| 4264 | 4273 | ||
| 4274 | spin_lock(&BTRFS_I(inode)->lock); | ||
| 4275 | if (extra_reserve) { | ||
| 4276 | BTRFS_I(inode)->delalloc_meta_reserved = 1; | ||
| 4277 | nr_extents--; | ||
| 4278 | } | ||
| 4279 | BTRFS_I(inode)->reserved_extents += nr_extents; | ||
| 4280 | spin_unlock(&BTRFS_I(inode)->lock); | ||
| 4281 | |||
| 4265 | block_rsv_add_bytes(block_rsv, to_reserve, 1); | 4282 | block_rsv_add_bytes(block_rsv, to_reserve, 1); |
| 4266 | 4283 | ||
| 4267 | return 0; | 4284 | return 0; |
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index dafdfa059bf..97fbe939c05 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c | |||
| @@ -1167,6 +1167,8 @@ static noinline ssize_t __btrfs_buffered_write(struct file *file, | |||
| 1167 | nrptrs = min((iov_iter_count(i) + PAGE_CACHE_SIZE - 1) / | 1167 | nrptrs = min((iov_iter_count(i) + PAGE_CACHE_SIZE - 1) / |
| 1168 | PAGE_CACHE_SIZE, PAGE_CACHE_SIZE / | 1168 | PAGE_CACHE_SIZE, PAGE_CACHE_SIZE / |
| 1169 | (sizeof(struct page *))); | 1169 | (sizeof(struct page *))); |
| 1170 | nrptrs = min(nrptrs, current->nr_dirtied_pause - current->nr_dirtied); | ||
| 1171 | nrptrs = max(nrptrs, 8); | ||
| 1170 | pages = kmalloc(nrptrs * sizeof(struct page *), GFP_KERNEL); | 1172 | pages = kmalloc(nrptrs * sizeof(struct page *), GFP_KERNEL); |
| 1171 | if (!pages) | 1173 | if (!pages) |
| 1172 | return -ENOMEM; | 1174 | return -ENOMEM; |
| @@ -1387,7 +1389,11 @@ static ssize_t btrfs_file_aio_write(struct kiocb *iocb, | |||
| 1387 | goto out; | 1389 | goto out; |
| 1388 | } | 1390 | } |
| 1389 | 1391 | ||
| 1390 | file_update_time(file); | 1392 | err = btrfs_update_time(file); |
| 1393 | if (err) { | ||
| 1394 | mutex_unlock(&inode->i_mutex); | ||
| 1395 | goto out; | ||
| 1396 | } | ||
| 1391 | BTRFS_I(inode)->sequence++; | 1397 | BTRFS_I(inode)->sequence++; |
| 1392 | 1398 | ||
| 1393 | start_pos = round_down(pos, root->sectorsize); | 1399 | start_pos = round_down(pos, root->sectorsize); |
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 2c984f7d4c2..fd1a06df5bc 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
| @@ -38,6 +38,7 @@ | |||
| 38 | #include <linux/falloc.h> | 38 | #include <linux/falloc.h> |
| 39 | #include <linux/slab.h> | 39 | #include <linux/slab.h> |
| 40 | #include <linux/ratelimit.h> | 40 | #include <linux/ratelimit.h> |
| 41 | #include <linux/mount.h> | ||
| 41 | #include "compat.h" | 42 | #include "compat.h" |
| 42 | #include "ctree.h" | 43 | #include "ctree.h" |
| 43 | #include "disk-io.h" | 44 | #include "disk-io.h" |
| @@ -2031,7 +2032,7 @@ int btrfs_orphan_add(struct btrfs_trans_handle *trans, struct inode *inode) | |||
| 2031 | /* insert an orphan item to track this unlinked/truncated file */ | 2032 | /* insert an orphan item to track this unlinked/truncated file */ |
| 2032 | if (insert >= 1) { | 2033 | if (insert >= 1) { |
| 2033 | ret = btrfs_insert_orphan_item(trans, root, btrfs_ino(inode)); | 2034 | ret = btrfs_insert_orphan_item(trans, root, btrfs_ino(inode)); |
| 2034 | BUG_ON(ret); | 2035 | BUG_ON(ret && ret != -EEXIST); |
| 2035 | } | 2036 | } |
| 2036 | 2037 | ||
| 2037 | /* insert an orphan item to track subvolume contains orphan files */ | 2038 | /* insert an orphan item to track subvolume contains orphan files */ |
| @@ -2158,6 +2159,38 @@ int btrfs_orphan_cleanup(struct btrfs_root *root) | |||
| 2158 | if (ret && ret != -ESTALE) | 2159 | if (ret && ret != -ESTALE) |
| 2159 | goto out; | 2160 | goto out; |
| 2160 | 2161 | ||
| 2162 | if (ret == -ESTALE && root == root->fs_info->tree_root) { | ||
| 2163 | struct btrfs_root *dead_root; | ||
| 2164 | struct btrfs_fs_info *fs_info = root->fs_info; | ||
| 2165 | int is_dead_root = 0; | ||
| 2166 | |||
| 2167 | /* | ||
| 2168 | * this is an orphan in the tree root. Currently these | ||
| 2169 | * could come from 2 sources: | ||
| 2170 | * a) a snapshot deletion in progress | ||
| 2171 | * b) a free space cache inode | ||
| 2172 | * We need to distinguish those two, as the snapshot | ||
| 2173 | * orphan must not get deleted. | ||
| 2174 | * find_dead_roots already ran before us, so if this | ||
| 2175 | * is a snapshot deletion, we should find the root | ||
| 2176 | * in the dead_roots list | ||
| 2177 | */ | ||
| 2178 | spin_lock(&fs_info->trans_lock); | ||
| 2179 | list_for_each_entry(dead_root, &fs_info->dead_roots, | ||
| 2180 | root_list) { | ||
| 2181 | if (dead_root->root_key.objectid == | ||
| 2182 | found_key.objectid) { | ||
| 2183 | is_dead_root = 1; | ||
| 2184 | break; | ||
| 2185 | } | ||
| 2186 | } | ||
| 2187 | spin_unlock(&fs_info->trans_lock); | ||
| 2188 | if (is_dead_root) { | ||
| 2189 | /* prevent this orphan from being found again */ | ||
| 2190 | key.offset = found_key.objectid - 1; | ||
| 2191 | continue; | ||
| 2192 | } | ||
| 2193 | } | ||
| 2161 | /* | 2194 | /* |
| 2162 | * Inode is already gone but the orphan item is still there, | 2195 | * Inode is already gone but the orphan item is still there, |
| 2163 | * kill the orphan item. | 2196 | * kill the orphan item. |
| @@ -2191,7 +2224,14 @@ int btrfs_orphan_cleanup(struct btrfs_root *root) | |||
| 2191 | continue; | 2224 | continue; |
| 2192 | } | 2225 | } |
| 2193 | nr_truncate++; | 2226 | nr_truncate++; |
| 2227 | /* | ||
| 2228 | * Need to hold the imutex for reservation purposes, not | ||
| 2229 | * a huge deal here but I have a WARN_ON in | ||
| 2230 | * btrfs_delalloc_reserve_space to catch offenders. | ||
| 2231 | */ | ||
| 2232 | mutex_lock(&inode->i_mutex); | ||
| 2194 | ret = btrfs_truncate(inode); | 2233 | ret = btrfs_truncate(inode); |
| 2234 | mutex_unlock(&inode->i_mutex); | ||
| 2195 | } else { | 2235 | } else { |
| 2196 | nr_unlink++; | 2236 | nr_unlink++; |
| 2197 | } | 2237 | } |
| @@ -3327,7 +3367,7 @@ int btrfs_cont_expand(struct inode *inode, loff_t oldsize, loff_t size) | |||
| 3327 | u64 hint_byte = 0; | 3367 | u64 hint_byte = 0; |
| 3328 | hole_size = last_byte - cur_offset; | 3368 | hole_size = last_byte - cur_offset; |
| 3329 | 3369 | ||
| 3330 | trans = btrfs_start_transaction(root, 2); | 3370 | trans = btrfs_start_transaction(root, 3); |
| 3331 | if (IS_ERR(trans)) { | 3371 | if (IS_ERR(trans)) { |
| 3332 | err = PTR_ERR(trans); | 3372 | err = PTR_ERR(trans); |
| 3333 | break; | 3373 | break; |
| @@ -3337,6 +3377,7 @@ int btrfs_cont_expand(struct inode *inode, loff_t oldsize, loff_t size) | |||
| 3337 | cur_offset + hole_size, | 3377 | cur_offset + hole_size, |
| 3338 | &hint_byte, 1); | 3378 | &hint_byte, 1); |
| 3339 | if (err) { | 3379 | if (err) { |
| 3380 | btrfs_update_inode(trans, root, inode); | ||
| 3340 | btrfs_end_transaction(trans, root); | 3381 | btrfs_end_transaction(trans, root); |
| 3341 | break; | 3382 | break; |
| 3342 | } | 3383 | } |
| @@ -3346,6 +3387,7 @@ int btrfs_cont_expand(struct inode *inode, loff_t oldsize, loff_t size) | |||
| 3346 | 0, hole_size, 0, hole_size, | 3387 | 0, hole_size, 0, hole_size, |
| 3347 | 0, 0, 0); | 3388 | 0, 0, 0); |
| 3348 | if (err) { | 3389 | if (err) { |
| 3390 | btrfs_update_inode(trans, root, inode); | ||
| 3349 | btrfs_end_transaction(trans, root); | 3391 | btrfs_end_transaction(trans, root); |
| 3350 | break; | 3392 | break; |
| 3351 | } | 3393 | } |
| @@ -3353,6 +3395,7 @@ int btrfs_cont_expand(struct inode *inode, loff_t oldsize, loff_t size) | |||
| 3353 | btrfs_drop_extent_cache(inode, hole_start, | 3395 | btrfs_drop_extent_cache(inode, hole_start, |
| 3354 | last_byte - 1, 0); | 3396 | last_byte - 1, 0); |
| 3355 | 3397 | ||
| 3398 | btrfs_update_inode(trans, root, inode); | ||
| 3356 | btrfs_end_transaction(trans, root); | 3399 | btrfs_end_transaction(trans, root); |
| 3357 | } | 3400 | } |
| 3358 | free_extent_map(em); | 3401 | free_extent_map(em); |
| @@ -3370,6 +3413,8 @@ int btrfs_cont_expand(struct inode *inode, loff_t oldsize, loff_t size) | |||
| 3370 | 3413 | ||
| 3371 | static int btrfs_setsize(struct inode *inode, loff_t newsize) | 3414 | static int btrfs_setsize(struct inode *inode, loff_t newsize) |
| 3372 | { | 3415 | { |
| 3416 | struct btrfs_root *root = BTRFS_I(inode)->root; | ||
| 3417 | struct btrfs_trans_handle *trans; | ||
| 3373 | loff_t oldsize = i_size_read(inode); | 3418 | loff_t oldsize = i_size_read(inode); |
| 3374 | int ret; | 3419 | int ret; |
| 3375 | 3420 | ||
| @@ -3377,16 +3422,19 @@ static int btrfs_setsize(struct inode *inode, loff_t newsize) | |||
| 3377 | return 0; | 3422 | return 0; |
| 3378 | 3423 | ||
| 3379 | if (newsize > oldsize) { | 3424 | if (newsize > oldsize) { |
| 3380 | i_size_write(inode, newsize); | ||
| 3381 | btrfs_ordered_update_i_size(inode, i_size_read(inode), NULL); | ||
| 3382 | truncate_pagecache(inode, oldsize, newsize); | 3425 | truncate_pagecache(inode, oldsize, newsize); |
| 3383 | ret = btrfs_cont_expand(inode, oldsize, newsize); | 3426 | ret = btrfs_cont_expand(inode, oldsize, newsize); |
| 3384 | if (ret) { | 3427 | if (ret) |
| 3385 | btrfs_setsize(inode, oldsize); | ||
| 3386 | return ret; | 3428 | return ret; |
| 3387 | } | ||
| 3388 | 3429 | ||
| 3389 | mark_inode_dirty(inode); | 3430 | trans = btrfs_start_transaction(root, 1); |
| 3431 | if (IS_ERR(trans)) | ||
| 3432 | return PTR_ERR(trans); | ||
| 3433 | |||
| 3434 | i_size_write(inode, newsize); | ||
| 3435 | btrfs_ordered_update_i_size(inode, i_size_read(inode), NULL); | ||
| 3436 | ret = btrfs_update_inode(trans, root, inode); | ||
| 3437 | btrfs_end_transaction_throttle(trans, root); | ||
| 3390 | } else { | 3438 | } else { |
| 3391 | 3439 | ||
| 3392 | /* | 3440 | /* |
| @@ -3426,9 +3474,9 @@ static int btrfs_setattr(struct dentry *dentry, struct iattr *attr) | |||
| 3426 | 3474 | ||
| 3427 | if (attr->ia_valid) { | 3475 | if (attr->ia_valid) { |
| 3428 | setattr_copy(inode, attr); | 3476 | setattr_copy(inode, attr); |
| 3429 | mark_inode_dirty(inode); | 3477 | err = btrfs_dirty_inode(inode); |
| 3430 | 3478 | ||
| 3431 | if (attr->ia_valid & ATTR_MODE) | 3479 | if (!err && attr->ia_valid & ATTR_MODE) |
| 3432 | err = btrfs_acl_chmod(inode); | 3480 | err = btrfs_acl_chmod(inode); |
| 3433 | } | 3481 | } |
| 3434 | 3482 | ||
| @@ -4204,42 +4252,80 @@ int btrfs_write_inode(struct inode *inode, struct writeback_control *wbc) | |||
| 4204 | * FIXME, needs more benchmarking...there are no reasons other than performance | 4252 | * FIXME, needs more benchmarking...there are no reasons other than performance |
| 4205 | * to keep or drop this code. | 4253 | * to keep or drop this code. |
| 4206 | */ | 4254 | */ |
| 4207 | void btrfs_dirty_inode(struct inode *inode, int flags) | 4255 | int btrfs_dirty_inode(struct inode *inode) |
| 4208 | { | 4256 | { |
| 4209 | struct btrfs_root *root = BTRFS_I(inode)->root; | 4257 | struct btrfs_root *root = BTRFS_I(inode)->root; |
| 4210 | struct btrfs_trans_handle *trans; | 4258 | struct btrfs_trans_handle *trans; |
| 4211 | int ret; | 4259 | int ret; |
| 4212 | 4260 | ||
| 4213 | if (BTRFS_I(inode)->dummy_inode) | 4261 | if (BTRFS_I(inode)->dummy_inode) |
| 4214 | return; | 4262 | return 0; |
| 4215 | 4263 | ||
| 4216 | trans = btrfs_join_transaction(root); | 4264 | trans = btrfs_join_transaction(root); |
| 4217 | BUG_ON(IS_ERR(trans)); | 4265 | if (IS_ERR(trans)) |
| 4266 | return PTR_ERR(trans); | ||
| 4218 | 4267 | ||
| 4219 | ret = btrfs_update_inode(trans, root, inode); | 4268 | ret = btrfs_update_inode(trans, root, inode); |
| 4220 | if (ret && ret == -ENOSPC) { | 4269 | if (ret && ret == -ENOSPC) { |
| 4221 | /* whoops, lets try again with the full transaction */ | 4270 | /* whoops, lets try again with the full transaction */ |
| 4222 | btrfs_end_transaction(trans, root); | 4271 | btrfs_end_transaction(trans, root); |
| 4223 | trans = btrfs_start_transaction(root, 1); | 4272 | trans = btrfs_start_transaction(root, 1); |
| 4224 | if (IS_ERR(trans)) { | 4273 | if (IS_ERR(trans)) |
| 4225 | printk_ratelimited(KERN_ERR "btrfs: fail to " | 4274 | return PTR_ERR(trans); |
| 4226 | "dirty inode %llu error %ld\n", | ||
| 4227 | (unsigned long long)btrfs_ino(inode), | ||
| 4228 | PTR_ERR(trans)); | ||
| 4229 | return; | ||
| 4230 | } | ||
| 4231 | 4275 | ||
| 4232 | ret = btrfs_update_inode(trans, root, inode); | 4276 | ret = btrfs_update_inode(trans, root, inode); |
| 4233 | if (ret) { | ||
| 4234 | printk_ratelimited(KERN_ERR "btrfs: fail to " | ||
| 4235 | "dirty inode %llu error %d\n", | ||
| 4236 | (unsigned long long)btrfs_ino(inode), | ||
| 4237 | ret); | ||
| 4238 | } | ||
| 4239 | } | 4277 | } |
| 4240 | btrfs_end_transaction(trans, root); | 4278 | btrfs_end_transaction(trans, root); |
| 4241 | if (BTRFS_I(inode)->delayed_node) | 4279 | if (BTRFS_I(inode)->delayed_node) |
| 4242 | btrfs_balance_delayed_items(root); | 4280 | btrfs_balance_delayed_items(root); |
| 4281 | |||
| 4282 | return ret; | ||
| 4283 | } | ||
| 4284 | |||
| 4285 | /* | ||
| 4286 | * This is a copy of file_update_time. We need this so we can return error on | ||
| 4287 | * ENOSPC for updating the inode in the case of file write and mmap writes. | ||
| 4288 | */ | ||
| 4289 | int btrfs_update_time(struct file *file) | ||
| 4290 | { | ||
| 4291 | struct inode *inode = file->f_path.dentry->d_inode; | ||
| 4292 | struct timespec now; | ||
| 4293 | int ret; | ||
| 4294 | enum { S_MTIME = 1, S_CTIME = 2, S_VERSION = 4 } sync_it = 0; | ||
| 4295 | |||
| 4296 | /* First try to exhaust all avenues to not sync */ | ||
| 4297 | if (IS_NOCMTIME(inode)) | ||
| 4298 | return 0; | ||
| 4299 | |||
| 4300 | now = current_fs_time(inode->i_sb); | ||
| 4301 | if (!timespec_equal(&inode->i_mtime, &now)) | ||
| 4302 | sync_it = S_MTIME; | ||
| 4303 | |||
| 4304 | if (!timespec_equal(&inode->i_ctime, &now)) | ||
| 4305 | sync_it |= S_CTIME; | ||
| 4306 | |||
| 4307 | if (IS_I_VERSION(inode)) | ||
| 4308 | sync_it |= S_VERSION; | ||
| 4309 | |||
| 4310 | if (!sync_it) | ||
| 4311 | return 0; | ||
| 4312 | |||
| 4313 | /* Finally allowed to write? Takes lock. */ | ||
| 4314 | if (mnt_want_write_file(file)) | ||
| 4315 | return 0; | ||
| 4316 | |||
| 4317 | /* Only change inode inside the lock region */ | ||
| 4318 | if (sync_it & S_VERSION) | ||
| 4319 | inode_inc_iversion(inode); | ||
| 4320 | if (sync_it & S_CTIME) | ||
| 4321 | inode->i_ctime = now; | ||
| 4322 | if (sync_it & S_MTIME) | ||
| 4323 | inode->i_mtime = now; | ||
| 4324 | ret = btrfs_dirty_inode(inode); | ||
| 4325 | if (!ret) | ||
| 4326 | mark_inode_dirty_sync(inode); | ||
| 4327 | mnt_drop_write(file->f_path.mnt); | ||
| 4328 | return ret; | ||
| 4243 | } | 4329 | } |
| 4244 | 4330 | ||
| 4245 | /* | 4331 | /* |
| @@ -4504,10 +4590,6 @@ static int btrfs_add_nondir(struct btrfs_trans_handle *trans, | |||
| 4504 | int err = btrfs_add_link(trans, dir, inode, | 4590 | int err = btrfs_add_link(trans, dir, inode, |
| 4505 | dentry->d_name.name, dentry->d_name.len, | 4591 | dentry->d_name.name, dentry->d_name.len, |
| 4506 | backref, index); | 4592 | backref, index); |
| 4507 | if (!err) { | ||
| 4508 | d_instantiate(dentry, inode); | ||
| 4509 | return 0; | ||
| 4510 | } | ||
| 4511 | if (err > 0) | 4593 | if (err > 0) |
| 4512 | err = -EEXIST; | 4594 | err = -EEXIST; |
| 4513 | return err; | 4595 | return err; |
| @@ -4555,13 +4637,21 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry, | |||
| 4555 | goto out_unlock; | 4637 | goto out_unlock; |
| 4556 | } | 4638 | } |
| 4557 | 4639 | ||
| 4640 | /* | ||
| 4641 | * If the active LSM wants to access the inode during | ||
| 4642 | * d_instantiate it needs these. Smack checks to see | ||
| 4643 | * if the filesystem supports xattrs by looking at the | ||
| 4644 | * ops vector. | ||
| 4645 | */ | ||
| 4646 | |||
| 4647 | inode->i_op = &btrfs_special_inode_operations; | ||
| 4558 | err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); | 4648 | err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); |
| 4559 | if (err) | 4649 | if (err) |
| 4560 | drop_inode = 1; | 4650 | drop_inode = 1; |
| 4561 | else { | 4651 | else { |
| 4562 | inode->i_op = &btrfs_special_inode_operations; | ||
| 4563 | init_special_inode(inode, inode->i_mode, rdev); | 4652 | init_special_inode(inode, inode->i_mode, rdev); |
| 4564 | btrfs_update_inode(trans, root, inode); | 4653 | btrfs_update_inode(trans, root, inode); |
| 4654 | d_instantiate(dentry, inode); | ||
| 4565 | } | 4655 | } |
| 4566 | out_unlock: | 4656 | out_unlock: |
| 4567 | nr = trans->blocks_used; | 4657 | nr = trans->blocks_used; |
| @@ -4613,15 +4703,23 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry, | |||
| 4613 | goto out_unlock; | 4703 | goto out_unlock; |
| 4614 | } | 4704 | } |
| 4615 | 4705 | ||
| 4706 | /* | ||
| 4707 | * If the active LSM wants to access the inode during | ||
| 4708 | * d_instantiate it needs these. Smack checks to see | ||
| 4709 | * if the filesystem supports xattrs by looking at the | ||
| 4710 | * ops vector. | ||
| 4711 | */ | ||
| 4712 | inode->i_fop = &btrfs_file_operations; | ||
| 4713 | inode->i_op = &btrfs_file_inode_operations; | ||
| 4714 | |||
| 4616 | err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); | 4715 | err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); |
| 4617 | if (err) | 4716 | if (err) |
| 4618 | drop_inode = 1; | 4717 | drop_inode = 1; |
| 4619 | else { | 4718 | else { |
| 4620 | inode->i_mapping->a_ops = &btrfs_aops; | 4719 | inode->i_mapping->a_ops = &btrfs_aops; |
| 4621 | inode->i_mapping->backing_dev_info = &root->fs_info->bdi; | 4720 | inode->i_mapping->backing_dev_info = &root->fs_info->bdi; |
| 4622 | inode->i_fop = &btrfs_file_operations; | ||
| 4623 | inode->i_op = &btrfs_file_inode_operations; | ||
| 4624 | BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops; | 4721 | BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops; |
| 4722 | d_instantiate(dentry, inode); | ||
| 4625 | } | 4723 | } |
| 4626 | out_unlock: | 4724 | out_unlock: |
| 4627 | nr = trans->blocks_used; | 4725 | nr = trans->blocks_used; |
| @@ -4679,6 +4777,7 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir, | |||
| 4679 | struct dentry *parent = dentry->d_parent; | 4777 | struct dentry *parent = dentry->d_parent; |
| 4680 | err = btrfs_update_inode(trans, root, inode); | 4778 | err = btrfs_update_inode(trans, root, inode); |
| 4681 | BUG_ON(err); | 4779 | BUG_ON(err); |
| 4780 | d_instantiate(dentry, inode); | ||
| 4682 | btrfs_log_new_name(trans, inode, NULL, parent); | 4781 | btrfs_log_new_name(trans, inode, NULL, parent); |
| 4683 | } | 4782 | } |
| 4684 | 4783 | ||
| @@ -6303,7 +6402,12 @@ int btrfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
| 6303 | u64 page_start; | 6402 | u64 page_start; |
| 6304 | u64 page_end; | 6403 | u64 page_end; |
| 6305 | 6404 | ||
| 6405 | /* Need this to keep space reservations serialized */ | ||
| 6406 | mutex_lock(&inode->i_mutex); | ||
| 6306 | ret = btrfs_delalloc_reserve_space(inode, PAGE_CACHE_SIZE); | 6407 | ret = btrfs_delalloc_reserve_space(inode, PAGE_CACHE_SIZE); |
| 6408 | mutex_unlock(&inode->i_mutex); | ||
| 6409 | if (!ret) | ||
| 6410 | ret = btrfs_update_time(vma->vm_file); | ||
| 6307 | if (ret) { | 6411 | if (ret) { |
| 6308 | if (ret == -ENOMEM) | 6412 | if (ret == -ENOMEM) |
| 6309 | ret = VM_FAULT_OOM; | 6413 | ret = VM_FAULT_OOM; |
| @@ -6515,8 +6619,9 @@ static int btrfs_truncate(struct inode *inode) | |||
| 6515 | /* Just need the 1 for updating the inode */ | 6619 | /* Just need the 1 for updating the inode */ |
| 6516 | trans = btrfs_start_transaction(root, 1); | 6620 | trans = btrfs_start_transaction(root, 1); |
| 6517 | if (IS_ERR(trans)) { | 6621 | if (IS_ERR(trans)) { |
| 6518 | err = PTR_ERR(trans); | 6622 | ret = err = PTR_ERR(trans); |
| 6519 | goto out; | 6623 | trans = NULL; |
| 6624 | break; | ||
| 6520 | } | 6625 | } |
| 6521 | } | 6626 | } |
| 6522 | 6627 | ||
| @@ -7076,14 +7181,21 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry, | |||
| 7076 | goto out_unlock; | 7181 | goto out_unlock; |
| 7077 | } | 7182 | } |
| 7078 | 7183 | ||
| 7184 | /* | ||
| 7185 | * If the active LSM wants to access the inode during | ||
| 7186 | * d_instantiate it needs these. Smack checks to see | ||
| 7187 | * if the filesystem supports xattrs by looking at the | ||
| 7188 | * ops vector. | ||
| 7189 | */ | ||
| 7190 | inode->i_fop = &btrfs_file_operations; | ||
| 7191 | inode->i_op = &btrfs_file_inode_operations; | ||
| 7192 | |||
| 7079 | err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); | 7193 | err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); |
| 7080 | if (err) | 7194 | if (err) |
| 7081 | drop_inode = 1; | 7195 | drop_inode = 1; |
| 7082 | else { | 7196 | else { |
| 7083 | inode->i_mapping->a_ops = &btrfs_aops; | 7197 | inode->i_mapping->a_ops = &btrfs_aops; |
| 7084 | inode->i_mapping->backing_dev_info = &root->fs_info->bdi; | 7198 | inode->i_mapping->backing_dev_info = &root->fs_info->bdi; |
| 7085 | inode->i_fop = &btrfs_file_operations; | ||
| 7086 | inode->i_op = &btrfs_file_inode_operations; | ||
| 7087 | BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops; | 7199 | BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops; |
| 7088 | } | 7200 | } |
| 7089 | if (drop_inode) | 7201 | if (drop_inode) |
| @@ -7132,6 +7244,8 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry, | |||
| 7132 | drop_inode = 1; | 7244 | drop_inode = 1; |
| 7133 | 7245 | ||
| 7134 | out_unlock: | 7246 | out_unlock: |
| 7247 | if (!err) | ||
| 7248 | d_instantiate(dentry, inode); | ||
| 7135 | nr = trans->blocks_used; | 7249 | nr = trans->blocks_used; |
| 7136 | btrfs_end_transaction_throttle(trans, root); | 7250 | btrfs_end_transaction_throttle(trans, root); |
| 7137 | if (drop_inode) { | 7251 | if (drop_inode) { |
| @@ -7353,6 +7467,7 @@ static const struct inode_operations btrfs_symlink_inode_operations = { | |||
| 7353 | .follow_link = page_follow_link_light, | 7467 | .follow_link = page_follow_link_light, |
| 7354 | .put_link = page_put_link, | 7468 | .put_link = page_put_link, |
| 7355 | .getattr = btrfs_getattr, | 7469 | .getattr = btrfs_getattr, |
| 7470 | .setattr = btrfs_setattr, | ||
| 7356 | .permission = btrfs_permission, | 7471 | .permission = btrfs_permission, |
| 7357 | .setxattr = btrfs_setxattr, | 7472 | .setxattr = btrfs_setxattr, |
| 7358 | .getxattr = btrfs_getxattr, | 7473 | .getxattr = btrfs_getxattr, |
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 72d461656f6..c04f02c7d5b 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c | |||
| @@ -252,11 +252,11 @@ static int btrfs_ioctl_setflags(struct file *file, void __user *arg) | |||
| 252 | trans = btrfs_join_transaction(root); | 252 | trans = btrfs_join_transaction(root); |
| 253 | BUG_ON(IS_ERR(trans)); | 253 | BUG_ON(IS_ERR(trans)); |
| 254 | 254 | ||
| 255 | btrfs_update_iflags(inode); | ||
| 256 | inode->i_ctime = CURRENT_TIME; | ||
| 255 | ret = btrfs_update_inode(trans, root, inode); | 257 | ret = btrfs_update_inode(trans, root, inode); |
| 256 | BUG_ON(ret); | 258 | BUG_ON(ret); |
| 257 | 259 | ||
| 258 | btrfs_update_iflags(inode); | ||
| 259 | inode->i_ctime = CURRENT_TIME; | ||
| 260 | btrfs_end_transaction(trans, root); | 260 | btrfs_end_transaction(trans, root); |
| 261 | 261 | ||
| 262 | mnt_drop_write(file->f_path.mnt); | 262 | mnt_drop_write(file->f_path.mnt); |
| @@ -858,8 +858,10 @@ static int cluster_pages_for_defrag(struct inode *inode, | |||
| 858 | return 0; | 858 | return 0; |
| 859 | file_end = (isize - 1) >> PAGE_CACHE_SHIFT; | 859 | file_end = (isize - 1) >> PAGE_CACHE_SHIFT; |
| 860 | 860 | ||
| 861 | mutex_lock(&inode->i_mutex); | ||
| 861 | ret = btrfs_delalloc_reserve_space(inode, | 862 | ret = btrfs_delalloc_reserve_space(inode, |
| 862 | num_pages << PAGE_CACHE_SHIFT); | 863 | num_pages << PAGE_CACHE_SHIFT); |
| 864 | mutex_unlock(&inode->i_mutex); | ||
| 863 | if (ret) | 865 | if (ret) |
| 864 | return ret; | 866 | return ret; |
| 865 | again: | 867 | again: |
diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c index dff29d5e151..cfb55434a46 100644 --- a/fs/btrfs/relocation.c +++ b/fs/btrfs/relocation.c | |||
| @@ -2947,7 +2947,9 @@ static int relocate_file_extent_cluster(struct inode *inode, | |||
| 2947 | index = (cluster->start - offset) >> PAGE_CACHE_SHIFT; | 2947 | index = (cluster->start - offset) >> PAGE_CACHE_SHIFT; |
| 2948 | last_index = (cluster->end - offset) >> PAGE_CACHE_SHIFT; | 2948 | last_index = (cluster->end - offset) >> PAGE_CACHE_SHIFT; |
| 2949 | while (index <= last_index) { | 2949 | while (index <= last_index) { |
| 2950 | mutex_lock(&inode->i_mutex); | ||
| 2950 | ret = btrfs_delalloc_reserve_metadata(inode, PAGE_CACHE_SIZE); | 2951 | ret = btrfs_delalloc_reserve_metadata(inode, PAGE_CACHE_SIZE); |
| 2952 | mutex_unlock(&inode->i_mutex); | ||
| 2951 | if (ret) | 2953 | if (ret) |
| 2952 | goto out; | 2954 | goto out; |
| 2953 | 2955 | ||
diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index c27bcb67f33..ddf2c90d3fc 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c | |||
| @@ -1535,18 +1535,22 @@ static noinline_for_stack int scrub_supers(struct scrub_dev *sdev) | |||
| 1535 | static noinline_for_stack int scrub_workers_get(struct btrfs_root *root) | 1535 | static noinline_for_stack int scrub_workers_get(struct btrfs_root *root) |
| 1536 | { | 1536 | { |
| 1537 | struct btrfs_fs_info *fs_info = root->fs_info; | 1537 | struct btrfs_fs_info *fs_info = root->fs_info; |
| 1538 | int ret = 0; | ||
| 1538 | 1539 | ||
| 1539 | mutex_lock(&fs_info->scrub_lock); | 1540 | mutex_lock(&fs_info->scrub_lock); |
| 1540 | if (fs_info->scrub_workers_refcnt == 0) { | 1541 | if (fs_info->scrub_workers_refcnt == 0) { |
| 1541 | btrfs_init_workers(&fs_info->scrub_workers, "scrub", | 1542 | btrfs_init_workers(&fs_info->scrub_workers, "scrub", |
| 1542 | fs_info->thread_pool_size, &fs_info->generic_worker); | 1543 | fs_info->thread_pool_size, &fs_info->generic_worker); |
| 1543 | fs_info->scrub_workers.idle_thresh = 4; | 1544 | fs_info->scrub_workers.idle_thresh = 4; |
| 1544 | btrfs_start_workers(&fs_info->scrub_workers, 1); | 1545 | ret = btrfs_start_workers(&fs_info->scrub_workers); |
| 1546 | if (ret) | ||
| 1547 | goto out; | ||
| 1545 | } | 1548 | } |
| 1546 | ++fs_info->scrub_workers_refcnt; | 1549 | ++fs_info->scrub_workers_refcnt; |
| 1550 | out: | ||
| 1547 | mutex_unlock(&fs_info->scrub_lock); | 1551 | mutex_unlock(&fs_info->scrub_lock); |
| 1548 | 1552 | ||
| 1549 | return 0; | 1553 | return ret; |
| 1550 | } | 1554 | } |
| 1551 | 1555 | ||
| 1552 | static noinline_for_stack void scrub_workers_put(struct btrfs_root *root) | 1556 | static noinline_for_stack void scrub_workers_put(struct btrfs_root *root) |
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index e28ad4baf48..200f63bc667 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c | |||
| @@ -41,6 +41,7 @@ | |||
| 41 | #include <linux/slab.h> | 41 | #include <linux/slab.h> |
| 42 | #include <linux/cleancache.h> | 42 | #include <linux/cleancache.h> |
| 43 | #include <linux/mnt_namespace.h> | 43 | #include <linux/mnt_namespace.h> |
| 44 | #include <linux/ratelimit.h> | ||
| 44 | #include "compat.h" | 45 | #include "compat.h" |
| 45 | #include "delayed-inode.h" | 46 | #include "delayed-inode.h" |
| 46 | #include "ctree.h" | 47 | #include "ctree.h" |
| @@ -1053,7 +1054,7 @@ static int btrfs_calc_avail_data_space(struct btrfs_root *root, u64 *free_bytes) | |||
| 1053 | u64 avail_space; | 1054 | u64 avail_space; |
| 1054 | u64 used_space; | 1055 | u64 used_space; |
| 1055 | u64 min_stripe_size; | 1056 | u64 min_stripe_size; |
| 1056 | int min_stripes = 1; | 1057 | int min_stripes = 1, num_stripes = 1; |
| 1057 | int i = 0, nr_devices; | 1058 | int i = 0, nr_devices; |
| 1058 | int ret; | 1059 | int ret; |
| 1059 | 1060 | ||
| @@ -1067,12 +1068,16 @@ static int btrfs_calc_avail_data_space(struct btrfs_root *root, u64 *free_bytes) | |||
| 1067 | 1068 | ||
| 1068 | /* calc min stripe number for data space alloction */ | 1069 | /* calc min stripe number for data space alloction */ |
| 1069 | type = btrfs_get_alloc_profile(root, 1); | 1070 | type = btrfs_get_alloc_profile(root, 1); |
| 1070 | if (type & BTRFS_BLOCK_GROUP_RAID0) | 1071 | if (type & BTRFS_BLOCK_GROUP_RAID0) { |
| 1071 | min_stripes = 2; | 1072 | min_stripes = 2; |
| 1072 | else if (type & BTRFS_BLOCK_GROUP_RAID1) | 1073 | num_stripes = nr_devices; |
| 1074 | } else if (type & BTRFS_BLOCK_GROUP_RAID1) { | ||
| 1073 | min_stripes = 2; | 1075 | min_stripes = 2; |
| 1074 | else if (type & BTRFS_BLOCK_GROUP_RAID10) | 1076 | num_stripes = 2; |
| 1077 | } else if (type & BTRFS_BLOCK_GROUP_RAID10) { | ||
| 1075 | min_stripes = 4; | 1078 | min_stripes = 4; |
| 1079 | num_stripes = 4; | ||
| 1080 | } | ||
| 1076 | 1081 | ||
| 1077 | if (type & BTRFS_BLOCK_GROUP_DUP) | 1082 | if (type & BTRFS_BLOCK_GROUP_DUP) |
| 1078 | min_stripe_size = 2 * BTRFS_STRIPE_LEN; | 1083 | min_stripe_size = 2 * BTRFS_STRIPE_LEN; |
| @@ -1141,13 +1146,16 @@ static int btrfs_calc_avail_data_space(struct btrfs_root *root, u64 *free_bytes) | |||
| 1141 | i = nr_devices - 1; | 1146 | i = nr_devices - 1; |
| 1142 | avail_space = 0; | 1147 | avail_space = 0; |
| 1143 | while (nr_devices >= min_stripes) { | 1148 | while (nr_devices >= min_stripes) { |
| 1149 | if (num_stripes > nr_devices) | ||
| 1150 | num_stripes = nr_devices; | ||
| 1151 | |||
| 1144 | if (devices_info[i].max_avail >= min_stripe_size) { | 1152 | if (devices_info[i].max_avail >= min_stripe_size) { |
| 1145 | int j; | 1153 | int j; |
| 1146 | u64 alloc_size; | 1154 | u64 alloc_size; |
| 1147 | 1155 | ||
| 1148 | avail_space += devices_info[i].max_avail * min_stripes; | 1156 | avail_space += devices_info[i].max_avail * num_stripes; |
| 1149 | alloc_size = devices_info[i].max_avail; | 1157 | alloc_size = devices_info[i].max_avail; |
| 1150 | for (j = i + 1 - min_stripes; j <= i; j++) | 1158 | for (j = i + 1 - num_stripes; j <= i; j++) |
| 1151 | devices_info[j].max_avail -= alloc_size; | 1159 | devices_info[j].max_avail -= alloc_size; |
| 1152 | } | 1160 | } |
| 1153 | i--; | 1161 | i--; |
| @@ -1264,6 +1272,16 @@ static int btrfs_unfreeze(struct super_block *sb) | |||
| 1264 | return 0; | 1272 | return 0; |
| 1265 | } | 1273 | } |
| 1266 | 1274 | ||
| 1275 | static void btrfs_fs_dirty_inode(struct inode *inode, int flags) | ||
| 1276 | { | ||
| 1277 | int ret; | ||
| 1278 | |||
| 1279 | ret = btrfs_dirty_inode(inode); | ||
| 1280 | if (ret) | ||
| 1281 | printk_ratelimited(KERN_ERR "btrfs: fail to dirty inode %Lu " | ||
| 1282 | "error %d\n", btrfs_ino(inode), ret); | ||
| 1283 | } | ||
| 1284 | |||
| 1267 | static const struct super_operations btrfs_super_ops = { | 1285 | static const struct super_operations btrfs_super_ops = { |
| 1268 | .drop_inode = btrfs_drop_inode, | 1286 | .drop_inode = btrfs_drop_inode, |
| 1269 | .evict_inode = btrfs_evict_inode, | 1287 | .evict_inode = btrfs_evict_inode, |
| @@ -1271,7 +1289,7 @@ static const struct super_operations btrfs_super_ops = { | |||
| 1271 | .sync_fs = btrfs_sync_fs, | 1289 | .sync_fs = btrfs_sync_fs, |
| 1272 | .show_options = btrfs_show_options, | 1290 | .show_options = btrfs_show_options, |
| 1273 | .write_inode = btrfs_write_inode, | 1291 | .write_inode = btrfs_write_inode, |
| 1274 | .dirty_inode = btrfs_dirty_inode, | 1292 | .dirty_inode = btrfs_fs_dirty_inode, |
| 1275 | .alloc_inode = btrfs_alloc_inode, | 1293 | .alloc_inode = btrfs_alloc_inode, |
| 1276 | .destroy_inode = btrfs_destroy_inode, | 1294 | .destroy_inode = btrfs_destroy_inode, |
| 1277 | .statfs = btrfs_statfs, | 1295 | .statfs = btrfs_statfs, |
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 0a8c8f8304b..f4b839fd3c9 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c | |||
| @@ -295,6 +295,12 @@ loop_lock: | |||
| 295 | btrfs_requeue_work(&device->work); | 295 | btrfs_requeue_work(&device->work); |
| 296 | goto done; | 296 | goto done; |
| 297 | } | 297 | } |
| 298 | /* unplug every 64 requests just for good measure */ | ||
| 299 | if (batch_run % 64 == 0) { | ||
| 300 | blk_finish_plug(&plug); | ||
| 301 | blk_start_plug(&plug); | ||
| 302 | sync_pending = 0; | ||
| 303 | } | ||
| 298 | } | 304 | } |
| 299 | 305 | ||
| 300 | cond_resched(); | 306 | cond_resched(); |
| @@ -3258,7 +3264,7 @@ static void btrfs_end_bio(struct bio *bio, int err) | |||
| 3258 | */ | 3264 | */ |
| 3259 | if (atomic_read(&bbio->error) > bbio->max_errors) { | 3265 | if (atomic_read(&bbio->error) > bbio->max_errors) { |
| 3260 | err = -EIO; | 3266 | err = -EIO; |
| 3261 | } else if (err) { | 3267 | } else { |
| 3262 | /* | 3268 | /* |
| 3263 | * this bio is actually up to date, we didn't | 3269 | * this bio is actually up to date, we didn't |
| 3264 | * go over the max number of errors | 3270 | * go over the max number of errors |
diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c index 4144caf2f9d..173b1d22e59 100644 --- a/fs/ceph/addr.c +++ b/fs/ceph/addr.c | |||
| @@ -87,7 +87,7 @@ static int ceph_set_page_dirty(struct page *page) | |||
| 87 | snapc = ceph_get_snap_context(ci->i_snap_realm->cached_context); | 87 | snapc = ceph_get_snap_context(ci->i_snap_realm->cached_context); |
| 88 | 88 | ||
| 89 | /* dirty the head */ | 89 | /* dirty the head */ |
| 90 | spin_lock(&inode->i_lock); | 90 | spin_lock(&ci->i_ceph_lock); |
| 91 | if (ci->i_head_snapc == NULL) | 91 | if (ci->i_head_snapc == NULL) |
| 92 | ci->i_head_snapc = ceph_get_snap_context(snapc); | 92 | ci->i_head_snapc = ceph_get_snap_context(snapc); |
| 93 | ++ci->i_wrbuffer_ref_head; | 93 | ++ci->i_wrbuffer_ref_head; |
| @@ -100,7 +100,7 @@ static int ceph_set_page_dirty(struct page *page) | |||
| 100 | ci->i_wrbuffer_ref-1, ci->i_wrbuffer_ref_head-1, | 100 | ci->i_wrbuffer_ref-1, ci->i_wrbuffer_ref_head-1, |
| 101 | ci->i_wrbuffer_ref, ci->i_wrbuffer_ref_head, | 101 | ci->i_wrbuffer_ref, ci->i_wrbuffer_ref_head, |
| 102 | snapc, snapc->seq, snapc->num_snaps); | 102 | snapc, snapc->seq, snapc->num_snaps); |
| 103 | spin_unlock(&inode->i_lock); | 103 | spin_unlock(&ci->i_ceph_lock); |
| 104 | 104 | ||
| 105 | /* now adjust page */ | 105 | /* now adjust page */ |
| 106 | spin_lock_irq(&mapping->tree_lock); | 106 | spin_lock_irq(&mapping->tree_lock); |
| @@ -391,7 +391,7 @@ static struct ceph_snap_context *get_oldest_context(struct inode *inode, | |||
| 391 | struct ceph_snap_context *snapc = NULL; | 391 | struct ceph_snap_context *snapc = NULL; |
| 392 | struct ceph_cap_snap *capsnap = NULL; | 392 | struct ceph_cap_snap *capsnap = NULL; |
| 393 | 393 | ||
| 394 | spin_lock(&inode->i_lock); | 394 | spin_lock(&ci->i_ceph_lock); |
| 395 | list_for_each_entry(capsnap, &ci->i_cap_snaps, ci_item) { | 395 | list_for_each_entry(capsnap, &ci->i_cap_snaps, ci_item) { |
| 396 | dout(" cap_snap %p snapc %p has %d dirty pages\n", capsnap, | 396 | dout(" cap_snap %p snapc %p has %d dirty pages\n", capsnap, |
| 397 | capsnap->context, capsnap->dirty_pages); | 397 | capsnap->context, capsnap->dirty_pages); |
| @@ -407,7 +407,7 @@ static struct ceph_snap_context *get_oldest_context(struct inode *inode, | |||
| 407 | dout(" head snapc %p has %d dirty pages\n", | 407 | dout(" head snapc %p has %d dirty pages\n", |
| 408 | snapc, ci->i_wrbuffer_ref_head); | 408 | snapc, ci->i_wrbuffer_ref_head); |
| 409 | } | 409 | } |
| 410 | spin_unlock(&inode->i_lock); | 410 | spin_unlock(&ci->i_ceph_lock); |
| 411 | return snapc; | 411 | return snapc; |
| 412 | } | 412 | } |
| 413 | 413 | ||
diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c index 0f327c6c967..8b53193e4f7 100644 --- a/fs/ceph/caps.c +++ b/fs/ceph/caps.c | |||
| @@ -309,7 +309,7 @@ void ceph_reservation_status(struct ceph_fs_client *fsc, | |||
| 309 | /* | 309 | /* |
| 310 | * Find ceph_cap for given mds, if any. | 310 | * Find ceph_cap for given mds, if any. |
| 311 | * | 311 | * |
| 312 | * Called with i_lock held. | 312 | * Called with i_ceph_lock held. |
| 313 | */ | 313 | */ |
| 314 | static struct ceph_cap *__get_cap_for_mds(struct ceph_inode_info *ci, int mds) | 314 | static struct ceph_cap *__get_cap_for_mds(struct ceph_inode_info *ci, int mds) |
| 315 | { | 315 | { |
| @@ -332,9 +332,9 @@ struct ceph_cap *ceph_get_cap_for_mds(struct ceph_inode_info *ci, int mds) | |||
| 332 | { | 332 | { |
| 333 | struct ceph_cap *cap; | 333 | struct ceph_cap *cap; |
| 334 | 334 | ||
| 335 | spin_lock(&ci->vfs_inode.i_lock); | 335 | spin_lock(&ci->i_ceph_lock); |
| 336 | cap = __get_cap_for_mds(ci, mds); | 336 | cap = __get_cap_for_mds(ci, mds); |
| 337 | spin_unlock(&ci->vfs_inode.i_lock); | 337 | spin_unlock(&ci->i_ceph_lock); |
| 338 | return cap; | 338 | return cap; |
| 339 | } | 339 | } |
| 340 | 340 | ||
| @@ -361,15 +361,16 @@ static int __ceph_get_cap_mds(struct ceph_inode_info *ci) | |||
| 361 | 361 | ||
| 362 | int ceph_get_cap_mds(struct inode *inode) | 362 | int ceph_get_cap_mds(struct inode *inode) |
| 363 | { | 363 | { |
| 364 | struct ceph_inode_info *ci = ceph_inode(inode); | ||
| 364 | int mds; | 365 | int mds; |
| 365 | spin_lock(&inode->i_lock); | 366 | spin_lock(&ci->i_ceph_lock); |
| 366 | mds = __ceph_get_cap_mds(ceph_inode(inode)); | 367 | mds = __ceph_get_cap_mds(ceph_inode(inode)); |
| 367 | spin_unlock(&inode->i_lock); | 368 | spin_unlock(&ci->i_ceph_lock); |
| 368 | return mds; | 369 | return mds; |
| 369 | } | 370 | } |
| 370 | 371 | ||
| 371 | /* | 372 | /* |
| 372 | * Called under i_lock. | 373 | * Called under i_ceph_lock. |
| 373 | */ | 374 | */ |
| 374 | static void __insert_cap_node(struct ceph_inode_info *ci, | 375 | static void __insert_cap_node(struct ceph_inode_info *ci, |
| 375 | struct ceph_cap *new) | 376 | struct ceph_cap *new) |
| @@ -415,7 +416,7 @@ static void __cap_set_timeouts(struct ceph_mds_client *mdsc, | |||
| 415 | * | 416 | * |
| 416 | * If I_FLUSH is set, leave the inode at the front of the list. | 417 | * If I_FLUSH is set, leave the inode at the front of the list. |
| 417 | * | 418 | * |
| 418 | * Caller holds i_lock | 419 | * Caller holds i_ceph_lock |
| 419 | * -> we take mdsc->cap_delay_lock | 420 | * -> we take mdsc->cap_delay_lock |
| 420 | */ | 421 | */ |
| 421 | static void __cap_delay_requeue(struct ceph_mds_client *mdsc, | 422 | static void __cap_delay_requeue(struct ceph_mds_client *mdsc, |
| @@ -457,7 +458,7 @@ static void __cap_delay_requeue_front(struct ceph_mds_client *mdsc, | |||
| 457 | /* | 458 | /* |
| 458 | * Cancel delayed work on cap. | 459 | * Cancel delayed work on cap. |
| 459 | * | 460 | * |
| 460 | * Caller must hold i_lock. | 461 | * Caller must hold i_ceph_lock. |
| 461 | */ | 462 | */ |
| 462 | static void __cap_delay_cancel(struct ceph_mds_client *mdsc, | 463 | static void __cap_delay_cancel(struct ceph_mds_client *mdsc, |
| 463 | struct ceph_inode_info *ci) | 464 | struct ceph_inode_info *ci) |
| @@ -532,14 +533,14 @@ int ceph_add_cap(struct inode *inode, | |||
| 532 | wanted |= ceph_caps_for_mode(fmode); | 533 | wanted |= ceph_caps_for_mode(fmode); |
| 533 | 534 | ||
| 534 | retry: | 535 | retry: |
| 535 | spin_lock(&inode->i_lock); | 536 | spin_lock(&ci->i_ceph_lock); |
| 536 | cap = __get_cap_for_mds(ci, mds); | 537 | cap = __get_cap_for_mds(ci, mds); |
| 537 | if (!cap) { | 538 | if (!cap) { |
| 538 | if (new_cap) { | 539 | if (new_cap) { |
| 539 | cap = new_cap; | 540 | cap = new_cap; |
| 540 | new_cap = NULL; | 541 | new_cap = NULL; |
| 541 | } else { | 542 | } else { |
| 542 | spin_unlock(&inode->i_lock); | 543 | spin_unlock(&ci->i_ceph_lock); |
| 543 | new_cap = get_cap(mdsc, caps_reservation); | 544 | new_cap = get_cap(mdsc, caps_reservation); |
| 544 | if (new_cap == NULL) | 545 | if (new_cap == NULL) |
| 545 | return -ENOMEM; | 546 | return -ENOMEM; |
| @@ -625,7 +626,7 @@ retry: | |||
| 625 | 626 | ||
| 626 | if (fmode >= 0) | 627 | if (fmode >= 0) |
| 627 | __ceph_get_fmode(ci, fmode); | 628 | __ceph_get_fmode(ci, fmode); |
| 628 | spin_unlock(&inode->i_lock); | 629 | spin_unlock(&ci->i_ceph_lock); |
| 629 | wake_up_all(&ci->i_cap_wq); | 630 | wake_up_all(&ci->i_cap_wq); |
| 630 | return 0; | 631 | return 0; |
| 631 | } | 632 | } |
| @@ -792,7 +793,7 @@ int ceph_caps_revoking(struct ceph_inode_info *ci, int mask) | |||
| 792 | struct rb_node *p; | 793 | struct rb_node *p; |
| 793 | int ret = 0; | 794 | int ret = 0; |
| 794 | 795 | ||
| 795 | spin_lock(&inode->i_lock); | 796 | spin_lock(&ci->i_ceph_lock); |
| 796 | for (p = rb_first(&ci->i_caps); p; p = rb_next(p)) { | 797 | for (p = rb_first(&ci->i_caps); p; p = rb_next(p)) { |
| 797 | cap = rb_entry(p, struct ceph_cap, ci_node); | 798 | cap = rb_entry(p, struct ceph_cap, ci_node); |
| 798 | if (__cap_is_valid(cap) && | 799 | if (__cap_is_valid(cap) && |
| @@ -801,7 +802,7 @@ int ceph_caps_revoking(struct ceph_inode_info *ci, int mask) | |||
| 801 | break; | 802 | break; |
| 802 | } | 803 | } |
| 803 | } | 804 | } |
| 804 | spin_unlock(&inode->i_lock); | 805 | spin_unlock(&ci->i_ceph_lock); |
| 805 | dout("ceph_caps_revoking %p %s = %d\n", inode, | 806 | dout("ceph_caps_revoking %p %s = %d\n", inode, |
| 806 | ceph_cap_string(mask), ret); | 807 | ceph_cap_string(mask), ret); |
| 807 | return ret; | 808 | return ret; |
| @@ -855,7 +856,7 @@ int __ceph_caps_mds_wanted(struct ceph_inode_info *ci) | |||
| 855 | } | 856 | } |
| 856 | 857 | ||
| 857 | /* | 858 | /* |
| 858 | * called under i_lock | 859 | * called under i_ceph_lock |
| 859 | */ | 860 | */ |
| 860 | static int __ceph_is_any_caps(struct ceph_inode_info *ci) | 861 | static int __ceph_is_any_caps(struct ceph_inode_info *ci) |
| 861 | { | 862 | { |
| @@ -865,7 +866,7 @@ static int __ceph_is_any_caps(struct ceph_inode_info *ci) | |||
| 865 | /* | 866 | /* |
| 866 | * Remove a cap. Take steps to deal with a racing iterate_session_caps. | 867 | * Remove a cap. Take steps to deal with a racing iterate_session_caps. |
| 867 | * | 868 | * |
| 868 | * caller should hold i_lock. | 869 | * caller should hold i_ceph_lock. |
| 869 | * caller will not hold session s_mutex if called from destroy_inode. | 870 | * caller will not hold session s_mutex if called from destroy_inode. |
| 870 | */ | 871 | */ |
| 871 | void __ceph_remove_cap(struct ceph_cap *cap) | 872 | void __ceph_remove_cap(struct ceph_cap *cap) |
| @@ -1028,7 +1029,7 @@ static void __queue_cap_release(struct ceph_mds_session *session, | |||
| 1028 | 1029 | ||
| 1029 | /* | 1030 | /* |
| 1030 | * Queue cap releases when an inode is dropped from our cache. Since | 1031 | * Queue cap releases when an inode is dropped from our cache. Since |
| 1031 | * inode is about to be destroyed, there is no need for i_lock. | 1032 | * inode is about to be destroyed, there is no need for i_ceph_lock. |
| 1032 | */ | 1033 | */ |
| 1033 | void ceph_queue_caps_release(struct inode *inode) | 1034 | void ceph_queue_caps_release(struct inode *inode) |
| 1034 | { | 1035 | { |
| @@ -1049,7 +1050,7 @@ void ceph_queue_caps_release(struct inode *inode) | |||
| 1049 | 1050 | ||
| 1050 | /* | 1051 | /* |
| 1051 | * Send a cap msg on the given inode. Update our caps state, then | 1052 | * Send a cap msg on the given inode. Update our caps state, then |
| 1052 | * drop i_lock and send the message. | 1053 | * drop i_ceph_lock and send the message. |
| 1053 | * | 1054 | * |
| 1054 | * Make note of max_size reported/requested from mds, revoked caps | 1055 | * Make note of max_size reported/requested from mds, revoked caps |
| 1055 | * that have now been implemented. | 1056 | * that have now been implemented. |
| @@ -1061,13 +1062,13 @@ void ceph_queue_caps_release(struct inode *inode) | |||
| 1061 | * Return non-zero if delayed release, or we experienced an error | 1062 | * Return non-zero if delayed release, or we experienced an error |
| 1062 | * such that the caller should requeue + retry later. | 1063 | * such that the caller should requeue + retry later. |
| 1063 | * | 1064 | * |
| 1064 | * called with i_lock, then drops it. | 1065 | * called with i_ceph_lock, then drops it. |
| 1065 | * caller should hold snap_rwsem (read), s_mutex. | 1066 | * caller should hold snap_rwsem (read), s_mutex. |
| 1066 | */ | 1067 | */ |
| 1067 | static int __send_cap(struct ceph_mds_client *mdsc, struct ceph_cap *cap, | 1068 | static int __send_cap(struct ceph_mds_client *mdsc, struct ceph_cap *cap, |
| 1068 | int op, int used, int want, int retain, int flushing, | 1069 | int op, int used, int want, int retain, int flushing, |
| 1069 | unsigned *pflush_tid) | 1070 | unsigned *pflush_tid) |
| 1070 | __releases(cap->ci->vfs_inode->i_lock) | 1071 | __releases(cap->ci->i_ceph_lock) |
| 1071 | { | 1072 | { |
| 1072 | struct ceph_inode_info *ci = cap->ci; | 1073 | struct ceph_inode_info *ci = cap->ci; |
| 1073 | struct inode *inode = &ci->vfs_inode; | 1074 | struct inode *inode = &ci->vfs_inode; |
| @@ -1170,7 +1171,7 @@ static int __send_cap(struct ceph_mds_client *mdsc, struct ceph_cap *cap, | |||
| 1170 | xattr_version = ci->i_xattrs.version; | 1171 | xattr_version = ci->i_xattrs.version; |
| 1171 | } | 1172 | } |
| 1172 | 1173 | ||
| 1173 | spin_unlock(&inode->i_lock); | 1174 | spin_unlock(&ci->i_ceph_lock); |
| 1174 | 1175 | ||
| 1175 | ret = send_cap_msg(session, ceph_vino(inode).ino, cap_id, | 1176 | ret = send_cap_msg(session, ceph_vino(inode).ino, cap_id, |
| 1176 | op, keep, want, flushing, seq, flush_tid, issue_seq, mseq, | 1177 | op, keep, want, flushing, seq, flush_tid, issue_seq, mseq, |
| @@ -1198,13 +1199,13 @@ static int __send_cap(struct ceph_mds_client *mdsc, struct ceph_cap *cap, | |||
| 1198 | * Unless @again is true, skip cap_snaps that were already sent to | 1199 | * Unless @again is true, skip cap_snaps that were already sent to |
| 1199 | * the MDS (i.e., during this session). | 1200 | * the MDS (i.e., during this session). |
| 1200 | * | 1201 | * |
| 1201 | * Called under i_lock. Takes s_mutex as needed. | 1202 | * Called under i_ceph_lock. Takes s_mutex as needed. |
| 1202 | */ | 1203 | */ |
| 1203 | void __ceph_flush_snaps(struct ceph_inode_info *ci, | 1204 | void __ceph_flush_snaps(struct ceph_inode_info *ci, |
| 1204 | struct ceph_mds_session **psession, | 1205 | struct ceph_mds_session **psession, |
| 1205 | int again) | 1206 | int again) |
| 1206 | __releases(ci->vfs_inode->i_lock) | 1207 | __releases(ci->i_ceph_lock) |
| 1207 | __acquires(ci->vfs_inode->i_lock) | 1208 | __acquires(ci->i_ceph_lock) |
| 1208 | { | 1209 | { |
| 1209 | struct inode *inode = &ci->vfs_inode; | 1210 | struct inode *inode = &ci->vfs_inode; |
| 1210 | int mds; | 1211 | int mds; |
| @@ -1261,7 +1262,7 @@ retry: | |||
| 1261 | session = NULL; | 1262 | session = NULL; |
| 1262 | } | 1263 | } |
| 1263 | if (!session) { | 1264 | if (!session) { |
| 1264 | spin_unlock(&inode->i_lock); | 1265 | spin_unlock(&ci->i_ceph_lock); |
| 1265 | mutex_lock(&mdsc->mutex); | 1266 | mutex_lock(&mdsc->mutex); |
| 1266 | session = __ceph_lookup_mds_session(mdsc, mds); | 1267 | session = __ceph_lookup_mds_session(mdsc, mds); |
| 1267 | mutex_unlock(&mdsc->mutex); | 1268 | mutex_unlock(&mdsc->mutex); |
| @@ -1275,7 +1276,7 @@ retry: | |||
| 1275 | * deletion or migration. retry, and we'll | 1276 | * deletion or migration. retry, and we'll |
| 1276 | * get a better @mds value next time. | 1277 | * get a better @mds value next time. |
| 1277 | */ | 1278 | */ |
| 1278 | spin_lock(&inode->i_lock); | 1279 | spin_lock(&ci->i_ceph_lock); |
| 1279 | goto retry; | 1280 | goto retry; |
| 1280 | } | 1281 | } |
| 1281 | 1282 | ||
| @@ -1285,7 +1286,7 @@ retry: | |||
| 1285 | list_del_init(&capsnap->flushing_item); | 1286 | list_del_init(&capsnap->flushing_item); |
| 1286 | list_add_tail(&capsnap->flushing_item, | 1287 | list_add_tail(&capsnap->flushing_item, |
| 1287 | &session->s_cap_snaps_flushing); | 1288 | &session->s_cap_snaps_flushing); |
| 1288 | spin_unlock(&inode->i_lock); | 1289 | spin_unlock(&ci->i_ceph_lock); |
| 1289 | 1290 | ||
| 1290 | dout("flush_snaps %p cap_snap %p follows %lld tid %llu\n", | 1291 | dout("flush_snaps %p cap_snap %p follows %lld tid %llu\n", |
| 1291 | inode, capsnap, capsnap->follows, capsnap->flush_tid); | 1292 | inode, capsnap, capsnap->follows, capsnap->flush_tid); |
| @@ -1302,7 +1303,7 @@ retry: | |||
| 1302 | next_follows = capsnap->follows + 1; | 1303 | next_follows = capsnap->follows + 1; |
| 1303 | ceph_put_cap_snap(capsnap); | 1304 | ceph_put_cap_snap(capsnap); |
| 1304 | 1305 | ||
| 1305 | spin_lock(&inode->i_lock); | 1306 | spin_lock(&ci->i_ceph_lock); |
| 1306 | goto retry; | 1307 | goto retry; |
| 1307 | } | 1308 | } |
| 1308 | 1309 | ||
| @@ -1322,11 +1323,9 @@ out: | |||
| 1322 | 1323 | ||
| 1323 | static void ceph_flush_snaps(struct ceph_inode_info *ci) | 1324 | static void ceph_flush_snaps(struct ceph_inode_info *ci) |
| 1324 | { | 1325 | { |
| 1325 | struct inode *inode = &ci->vfs_inode; | 1326 | spin_lock(&ci->i_ceph_lock); |
| 1326 | |||
| 1327 | spin_lock(&inode->i_lock); | ||
| 1328 | __ceph_flush_snaps(ci, NULL, 0); | 1327 | __ceph_flush_snaps(ci, NULL, 0); |
| 1329 | spin_unlock(&inode->i_lock); | 1328 | spin_unlock(&ci->i_ceph_lock); |
| 1330 | } | 1329 | } |
| 1331 | 1330 | ||
| 1332 | /* | 1331 | /* |
| @@ -1373,7 +1372,7 @@ int __ceph_mark_dirty_caps(struct ceph_inode_info *ci, int mask) | |||
| 1373 | * Add dirty inode to the flushing list. Assigned a seq number so we | 1372 | * Add dirty inode to the flushing list. Assigned a seq number so we |
| 1374 | * can wait for caps to flush without starving. | 1373 | * can wait for caps to flush without starving. |
| 1375 | * | 1374 | * |
| 1376 | * Called under i_lock. | 1375 | * Called under i_ceph_lock. |
| 1377 | */ | 1376 | */ |
| 1378 | static int __mark_caps_flushing(struct inode *inode, | 1377 | static int __mark_caps_flushing(struct inode *inode, |
| 1379 | struct ceph_mds_session *session) | 1378 | struct ceph_mds_session *session) |
| @@ -1421,9 +1420,9 @@ static int try_nonblocking_invalidate(struct inode *inode) | |||
| 1421 | struct ceph_inode_info *ci = ceph_inode(inode); | 1420 | struct ceph_inode_info *ci = ceph_inode(inode); |
| 1422 | u32 invalidating_gen = ci->i_rdcache_gen; | 1421 | u32 invalidating_gen = ci->i_rdcache_gen; |
| 1423 | 1422 | ||
| 1424 | spin_unlock(&inode->i_lock); | 1423 | spin_unlock(&ci->i_ceph_lock); |
| 1425 | invalidate_mapping_pages(&inode->i_data, 0, -1); | 1424 | invalidate_mapping_pages(&inode->i_data, 0, -1); |
| 1426 | spin_lock(&inode->i_lock); | 1425 | spin_lock(&ci->i_ceph_lock); |
| 1427 | 1426 | ||
| 1428 | if (inode->i_data.nrpages == 0 && | 1427 | if (inode->i_data.nrpages == 0 && |
| 1429 | invalidating_gen == ci->i_rdcache_gen) { | 1428 | invalidating_gen == ci->i_rdcache_gen) { |
| @@ -1470,7 +1469,7 @@ void ceph_check_caps(struct ceph_inode_info *ci, int flags, | |||
| 1470 | if (mdsc->stopping) | 1469 | if (mdsc->stopping) |
| 1471 | is_delayed = 1; | 1470 | is_delayed = 1; |
| 1472 | 1471 | ||
| 1473 | spin_lock(&inode->i_lock); | 1472 | spin_lock(&ci->i_ceph_lock); |
| 1474 | 1473 | ||
| 1475 | if (ci->i_ceph_flags & CEPH_I_FLUSH) | 1474 | if (ci->i_ceph_flags & CEPH_I_FLUSH) |
| 1476 | flags |= CHECK_CAPS_FLUSH; | 1475 | flags |= CHECK_CAPS_FLUSH; |
| @@ -1480,7 +1479,7 @@ void ceph_check_caps(struct ceph_inode_info *ci, int flags, | |||
| 1480 | __ceph_flush_snaps(ci, &session, 0); | 1479 | __ceph_flush_snaps(ci, &session, 0); |
| 1481 | goto retry_locked; | 1480 | goto retry_locked; |
| 1482 | retry: | 1481 | retry: |
| 1483 | spin_lock(&inode->i_lock); | 1482 | spin_lock(&ci->i_ceph_lock); |
| 1484 | retry_locked: | 1483 | retry_locked: |
| 1485 | file_wanted = __ceph_caps_file_wanted(ci); | 1484 | file_wanted = __ceph_caps_file_wanted(ci); |
| 1486 | used = __ceph_caps_used(ci); | 1485 | used = __ceph_caps_used(ci); |
| @@ -1634,7 +1633,7 @@ ack: | |||
| 1634 | if (mutex_trylock(&session->s_mutex) == 0) { | 1633 | if (mutex_trylock(&session->s_mutex) == 0) { |
| 1635 | dout("inverting session/ino locks on %p\n", | 1634 | dout("inverting session/ino locks on %p\n", |
| 1636 | session); | 1635 | session); |
| 1637 | spin_unlock(&inode->i_lock); | 1636 | spin_unlock(&ci->i_ceph_lock); |
| 1638 | if (took_snap_rwsem) { | 1637 | if (took_snap_rwsem) { |
| 1639 | up_read(&mdsc->snap_rwsem); | 1638 | up_read(&mdsc->snap_rwsem); |
| 1640 | took_snap_rwsem = 0; | 1639 | took_snap_rwsem = 0; |
| @@ -1648,7 +1647,7 @@ ack: | |||
| 1648 | if (down_read_trylock(&mdsc->snap_rwsem) == 0) { | 1647 | if (down_read_trylock(&mdsc->snap_rwsem) == 0) { |
| 1649 | dout("inverting snap/in locks on %p\n", | 1648 | dout("inverting snap/in locks on %p\n", |
| 1650 | inode); | 1649 | inode); |
| 1651 | spin_unlock(&inode->i_lock); | 1650 | spin_unlock(&ci->i_ceph_lock); |
| 1652 | down_read(&mdsc->snap_rwsem); | 1651 | down_read(&mdsc->snap_rwsem); |
| 1653 | took_snap_rwsem = 1; | 1652 | took_snap_rwsem = 1; |
| 1654 | goto retry; | 1653 | goto retry; |
| @@ -1664,10 +1663,10 @@ ack: | |||
| 1664 | mds = cap->mds; /* remember mds, so we don't repeat */ | 1663 | mds = cap->mds; /* remember mds, so we don't repeat */ |
| 1665 | sent++; | 1664 | sent++; |
| 1666 | 1665 | ||
| 1667 | /* __send_cap drops i_lock */ | 1666 | /* __send_cap drops i_ceph_lock */ |
| 1668 | delayed += __send_cap(mdsc, cap, CEPH_CAP_OP_UPDATE, used, want, | 1667 | delayed += __send_cap(mdsc, cap, CEPH_CAP_OP_UPDATE, used, want, |
| 1669 | retain, flushing, NULL); | 1668 | retain, flushing, NULL); |
| 1670 | goto retry; /* retake i_lock and restart our cap scan. */ | 1669 | goto retry; /* retake i_ceph_lock and restart our cap scan. */ |
| 1671 | } | 1670 | } |
| 1672 | 1671 | ||
| 1673 | /* | 1672 | /* |
| @@ -1681,7 +1680,7 @@ ack: | |||
| 1681 | else if (!is_delayed || force_requeue) | 1680 | else if (!is_delayed || force_requeue) |
| 1682 | __cap_delay_requeue(mdsc, ci); | 1681 | __cap_delay_requeue(mdsc, ci); |
| 1683 | 1682 | ||
| 1684 | spin_unlock(&inode->i_lock); | 1683 | spin_unlock(&ci->i_ceph_lock); |
| 1685 | 1684 | ||
| 1686 | if (queue_invalidate) | 1685 | if (queue_invalidate) |
| 1687 | ceph_queue_invalidate(inode); | 1686 | ceph_queue_invalidate(inode); |
| @@ -1704,7 +1703,7 @@ static int try_flush_caps(struct inode *inode, struct ceph_mds_session *session, | |||
| 1704 | int flushing = 0; | 1703 | int flushing = 0; |
| 1705 | 1704 | ||
| 1706 | retry: | 1705 | retry: |
| 1707 | spin_lock(&inode->i_lock); | 1706 | spin_lock(&ci->i_ceph_lock); |
| 1708 | if (ci->i_ceph_flags & CEPH_I_NOFLUSH) { | 1707 | if (ci->i_ceph_flags & CEPH_I_NOFLUSH) { |
| 1709 | dout("try_flush_caps skipping %p I_NOFLUSH set\n", inode); | 1708 | dout("try_flush_caps skipping %p I_NOFLUSH set\n", inode); |
| 1710 | goto out; | 1709 | goto out; |
| @@ -1716,7 +1715,7 @@ retry: | |||
| 1716 | int delayed; | 1715 | int delayed; |
| 1717 | 1716 | ||
| 1718 | if (!session) { | 1717 | if (!session) { |
| 1719 | spin_unlock(&inode->i_lock); | 1718 | spin_unlock(&ci->i_ceph_lock); |
| 1720 | session = cap->session; | 1719 | session = cap->session; |
| 1721 | mutex_lock(&session->s_mutex); | 1720 | mutex_lock(&session->s_mutex); |
| 1722 | goto retry; | 1721 | goto retry; |
| @@ -1727,18 +1726,18 @@ retry: | |||
| 1727 | 1726 | ||
| 1728 | flushing = __mark_caps_flushing(inode, session); | 1727 | flushing = __mark_caps_flushing(inode, session); |
| 1729 | 1728 | ||
| 1730 | /* __send_cap drops i_lock */ | 1729 | /* __send_cap drops i_ceph_lock */ |
| 1731 | delayed = __send_cap(mdsc, cap, CEPH_CAP_OP_FLUSH, used, want, | 1730 | delayed = __send_cap(mdsc, cap, CEPH_CAP_OP_FLUSH, used, want, |
| 1732 | cap->issued | cap->implemented, flushing, | 1731 | cap->issued | cap->implemented, flushing, |
| 1733 | flush_tid); | 1732 | flush_tid); |
| 1734 | if (!delayed) | 1733 | if (!delayed) |
| 1735 | goto out_unlocked; | 1734 | goto out_unlocked; |
| 1736 | 1735 | ||
| 1737 | spin_lock(&inode->i_lock); | 1736 | spin_lock(&ci->i_ceph_lock); |
| 1738 | __cap_delay_requeue(mdsc, ci); | 1737 | __cap_delay_requeue(mdsc, ci); |
| 1739 | } | 1738 | } |
| 1740 | out: | 1739 | out: |
| 1741 | spin_unlock(&inode->i_lock); | 1740 | spin_unlock(&ci->i_ceph_lock); |
| 1742 | out_unlocked: | 1741 | out_unlocked: |
| 1743 | if (session && unlock_session) | 1742 | if (session && unlock_session) |
| 1744 | mutex_unlock(&session->s_mutex); | 1743 | mutex_unlock(&session->s_mutex); |
| @@ -1753,7 +1752,7 @@ static int caps_are_flushed(struct inode *inode, unsigned tid) | |||
| 1753 | struct ceph_inode_info *ci = ceph_inode(inode); | 1752 | struct ceph_inode_info *ci = ceph_inode(inode); |
| 1754 | int i, ret = 1; | 1753 | int i, ret = 1; |
| 1755 | 1754 | ||
| 1756 | spin_lock(&inode->i_lock); | 1755 | spin_lock(&ci->i_ceph_lock); |
| 1757 | for (i = 0; i < CEPH_CAP_BITS; i++) | 1756 | for (i = 0; i < CEPH_CAP_BITS; i++) |
| 1758 | if ((ci->i_flushing_caps & (1 << i)) && | 1757 | if ((ci->i_flushing_caps & (1 << i)) && |
| 1759 | ci->i_cap_flush_tid[i] <= tid) { | 1758 | ci->i_cap_flush_tid[i] <= tid) { |
| @@ -1761,7 +1760,7 @@ static int caps_are_flushed(struct inode *inode, unsigned tid) | |||
| 1761 | ret = 0; | 1760 | ret = 0; |
| 1762 | break; | 1761 | break; |
| 1763 | } | 1762 | } |
| 1764 | spin_unlock(&inode->i_lock); | 1763 | spin_unlock(&ci->i_ceph_lock); |
| 1765 | return ret; | 1764 | return ret; |
| 1766 | } | 1765 | } |
| 1767 | 1766 | ||
| @@ -1868,10 +1867,10 @@ int ceph_write_inode(struct inode *inode, struct writeback_control *wbc) | |||
| 1868 | struct ceph_mds_client *mdsc = | 1867 | struct ceph_mds_client *mdsc = |
| 1869 | ceph_sb_to_client(inode->i_sb)->mdsc; | 1868 | ceph_sb_to_client(inode->i_sb)->mdsc; |
| 1870 | 1869 | ||
| 1871 | spin_lock(&inode->i_lock); | 1870 | spin_lock(&ci->i_ceph_lock); |
| 1872 | if (__ceph_caps_dirty(ci)) | 1871 | if (__ceph_caps_dirty(ci)) |
| 1873 | __cap_delay_requeue_front(mdsc, ci); | 1872 | __cap_delay_requeue_front(mdsc, ci); |
| 1874 | spin_unlock(&inode->i_lock); | 1873 | spin_unlock(&ci->i_ceph_lock); |
| 1875 | } | 1874 | } |
| 1876 | return err; | 1875 | return err; |
| 1877 | } | 1876 | } |
| @@ -1894,7 +1893,7 @@ static void kick_flushing_capsnaps(struct ceph_mds_client *mdsc, | |||
| 1894 | struct inode *inode = &ci->vfs_inode; | 1893 | struct inode *inode = &ci->vfs_inode; |
| 1895 | struct ceph_cap *cap; | 1894 | struct ceph_cap *cap; |
| 1896 | 1895 | ||
| 1897 | spin_lock(&inode->i_lock); | 1896 | spin_lock(&ci->i_ceph_lock); |
| 1898 | cap = ci->i_auth_cap; | 1897 | cap = ci->i_auth_cap; |
| 1899 | if (cap && cap->session == session) { | 1898 | if (cap && cap->session == session) { |
| 1900 | dout("kick_flushing_caps %p cap %p capsnap %p\n", inode, | 1899 | dout("kick_flushing_caps %p cap %p capsnap %p\n", inode, |
| @@ -1904,7 +1903,7 @@ static void kick_flushing_capsnaps(struct ceph_mds_client *mdsc, | |||
| 1904 | pr_err("%p auth cap %p not mds%d ???\n", inode, | 1903 | pr_err("%p auth cap %p not mds%d ???\n", inode, |
| 1905 | cap, session->s_mds); | 1904 | cap, session->s_mds); |
| 1906 | } | 1905 | } |
| 1907 | spin_unlock(&inode->i_lock); | 1906 | spin_unlock(&ci->i_ceph_lock); |
| 1908 | } | 1907 | } |
| 1909 | } | 1908 | } |
| 1910 | 1909 | ||
| @@ -1921,7 +1920,7 @@ void ceph_kick_flushing_caps(struct ceph_mds_client *mdsc, | |||
| 1921 | struct ceph_cap *cap; | 1920 | struct ceph_cap *cap; |
| 1922 | int delayed = 0; | 1921 | int delayed = 0; |
| 1923 | 1922 | ||
| 1924 | spin_lock(&inode->i_lock); | 1923 | spin_lock(&ci->i_ceph_lock); |
| 1925 | cap = ci->i_auth_cap; | 1924 | cap = ci->i_auth_cap; |
| 1926 | if (cap && cap->session == session) { | 1925 | if (cap && cap->session == session) { |
| 1927 | dout("kick_flushing_caps %p cap %p %s\n", inode, | 1926 | dout("kick_flushing_caps %p cap %p %s\n", inode, |
| @@ -1932,14 +1931,14 @@ void ceph_kick_flushing_caps(struct ceph_mds_client *mdsc, | |||
| 1932 | cap->issued | cap->implemented, | 1931 | cap->issued | cap->implemented, |
| 1933 | ci->i_flushing_caps, NULL); | 1932 | ci->i_flushing_caps, NULL); |
| 1934 | if (delayed) { | 1933 | if (delayed) { |
| 1935 | spin_lock(&inode->i_lock); | 1934 | spin_lock(&ci->i_ceph_lock); |
| 1936 | __cap_delay_requeue(mdsc, ci); | 1935 | __cap_delay_requeue(mdsc, ci); |
| 1937 | spin_unlock(&inode->i_lock); | 1936 | spin_unlock(&ci->i_ceph_lock); |
| 1938 | } | 1937 | } |
| 1939 | } else { | 1938 | } else { |
| 1940 | pr_err("%p auth cap %p not mds%d ???\n", inode, | 1939 | pr_err("%p auth cap %p not mds%d ???\n", inode, |
| 1941 | cap, session->s_mds); | 1940 | cap, session->s_mds); |
| 1942 | spin_unlock(&inode->i_lock); | 1941 | spin_unlock(&ci->i_ceph_lock); |
| 1943 | } | 1942 | } |
| 1944 | } | 1943 | } |
| 1945 | } | 1944 | } |
| @@ -1952,7 +1951,7 @@ static void kick_flushing_inode_caps(struct ceph_mds_client *mdsc, | |||
| 1952 | struct ceph_cap *cap; | 1951 | struct ceph_cap *cap; |
| 1953 | int delayed = 0; | 1952 | int delayed = 0; |
| 1954 | 1953 | ||
| 1955 | spin_lock(&inode->i_lock); | 1954 | spin_lock(&ci->i_ceph_lock); |
| 1956 | cap = ci->i_auth_cap; | 1955 | cap = ci->i_auth_cap; |
| 1957 | dout("kick_flushing_inode_caps %p flushing %s flush_seq %lld\n", inode, | 1956 | dout("kick_flushing_inode_caps %p flushing %s flush_seq %lld\n", inode, |
| 1958 | ceph_cap_string(ci->i_flushing_caps), ci->i_cap_flush_seq); | 1957 | ceph_cap_string(ci->i_flushing_caps), ci->i_cap_flush_seq); |
| @@ -1964,12 +1963,12 @@ static void kick_flushing_inode_caps(struct ceph_mds_client *mdsc, | |||
| 1964 | cap->issued | cap->implemented, | 1963 | cap->issued | cap->implemented, |
| 1965 | ci->i_flushing_caps, NULL); | 1964 | ci->i_flushing_caps, NULL); |
| 1966 | if (delayed) { | 1965 | if (delayed) { |
| 1967 | spin_lock(&inode->i_lock); | 1966 | spin_lock(&ci->i_ceph_lock); |
| 1968 | __cap_delay_requeue(mdsc, ci); | 1967 | __cap_delay_requeue(mdsc, ci); |
| 1969 | spin_unlock(&inode->i_lock); | 1968 | spin_unlock(&ci->i_ceph_lock); |
| 1970 | } | 1969 | } |
| 1971 | } else { | 1970 | } else { |
| 1972 | spin_unlock(&inode->i_lock); | 1971 | spin_unlock(&ci->i_ceph_lock); |
| 1973 | } | 1972 | } |
| 1974 | } | 1973 | } |
| 1975 | 1974 | ||
| @@ -1978,7 +1977,7 @@ static void kick_flushing_inode_caps(struct ceph_mds_client *mdsc, | |||
| 1978 | * Take references to capabilities we hold, so that we don't release | 1977 | * Take references to capabilities we hold, so that we don't release |
| 1979 | * them to the MDS prematurely. | 1978 | * them to the MDS prematurely. |
| 1980 | * | 1979 | * |
| 1981 | * Protected by i_lock. | 1980 | * Protected by i_ceph_lock. |
| 1982 | */ | 1981 | */ |
| 1983 | static void __take_cap_refs(struct ceph_inode_info *ci, int got) | 1982 | static void __take_cap_refs(struct ceph_inode_info *ci, int got) |
| 1984 | { | 1983 | { |
| @@ -2016,7 +2015,7 @@ static int try_get_cap_refs(struct ceph_inode_info *ci, int need, int want, | |||
| 2016 | 2015 | ||
| 2017 | dout("get_cap_refs %p need %s want %s\n", inode, | 2016 | dout("get_cap_refs %p need %s want %s\n", inode, |
| 2018 | ceph_cap_string(need), ceph_cap_string(want)); | 2017 | ceph_cap_string(need), ceph_cap_string(want)); |
| 2019 | spin_lock(&inode->i_lock); | 2018 | spin_lock(&ci->i_ceph_lock); |
| 2020 | 2019 | ||
| 2021 | /* make sure file is actually open */ | 2020 | /* make sure file is actually open */ |
| 2022 | file_wanted = __ceph_caps_file_wanted(ci); | 2021 | file_wanted = __ceph_caps_file_wanted(ci); |
| @@ -2077,7 +2076,7 @@ static int try_get_cap_refs(struct ceph_inode_info *ci, int need, int want, | |||
| 2077 | ceph_cap_string(have), ceph_cap_string(need)); | 2076 | ceph_cap_string(have), ceph_cap_string(need)); |
| 2078 | } | 2077 | } |
| 2079 | out: | 2078 | out: |
| 2080 | spin_unlock(&inode->i_lock); | 2079 | spin_unlock(&ci->i_ceph_lock); |
| 2081 | dout("get_cap_refs %p ret %d got %s\n", inode, | 2080 | dout("get_cap_refs %p ret %d got %s\n", inode, |
| 2082 | ret, ceph_cap_string(*got)); | 2081 | ret, ceph_cap_string(*got)); |
| 2083 | return ret; | 2082 | return ret; |
| @@ -2094,7 +2093,7 @@ static void check_max_size(struct inode *inode, loff_t endoff) | |||
| 2094 | int check = 0; | 2093 | int check = 0; |
| 2095 | 2094 | ||
| 2096 | /* do we need to explicitly request a larger max_size? */ | 2095 | /* do we need to explicitly request a larger max_size? */ |
| 2097 | spin_lock(&inode->i_lock); | 2096 | spin_lock(&ci->i_ceph_lock); |
| 2098 | if ((endoff >= ci->i_max_size || | 2097 | if ((endoff >= ci->i_max_size || |
| 2099 | endoff > (inode->i_size << 1)) && | 2098 | endoff > (inode->i_size << 1)) && |
| 2100 | endoff > ci->i_wanted_max_size) { | 2099 | endoff > ci->i_wanted_max_size) { |
| @@ -2103,7 +2102,7 @@ static void check_max_size(struct inode *inode, loff_t endoff) | |||
| 2103 | ci->i_wanted_max_size = endoff; | 2102 | ci->i_wanted_max_size = endoff; |
| 2104 | check = 1; | 2103 | check = 1; |
| 2105 | } | 2104 | } |
| 2106 | spin_unlock(&inode->i_lock); | 2105 | spin_unlock(&ci->i_ceph_lock); |
| 2107 | if (check) | 2106 | if (check) |
| 2108 | ceph_check_caps(ci, CHECK_CAPS_AUTHONLY, NULL); | 2107 | ceph_check_caps(ci, CHECK_CAPS_AUTHONLY, NULL); |
| 2109 | } | 2108 | } |
| @@ -2140,9 +2139,9 @@ retry: | |||
| 2140 | */ | 2139 | */ |
| 2141 | void ceph_get_cap_refs(struct ceph_inode_info *ci, int caps) | 2140 | void ceph_get_cap_refs(struct ceph_inode_info *ci, int caps) |
| 2142 | { | 2141 | { |
| 2143 | spin_lock(&ci->vfs_inode.i_lock); | 2142 | spin_lock(&ci->i_ceph_lock); |
| 2144 | __take_cap_refs(ci, caps); | 2143 | __take_cap_refs(ci, caps); |
| 2145 | spin_unlock(&ci->vfs_inode.i_lock); | 2144 | spin_unlock(&ci->i_ceph_lock); |
| 2146 | } | 2145 | } |
| 2147 | 2146 | ||
| 2148 | /* | 2147 | /* |
| @@ -2160,7 +2159,7 @@ void ceph_put_cap_refs(struct ceph_inode_info *ci, int had) | |||
| 2160 | int last = 0, put = 0, flushsnaps = 0, wake = 0; | 2159 | int last = 0, put = 0, flushsnaps = 0, wake = 0; |
| 2161 | struct ceph_cap_snap *capsnap; | 2160 | struct ceph_cap_snap *capsnap; |
| 2162 | 2161 | ||
| 2163 | spin_lock(&inode->i_lock); | 2162 | spin_lock(&ci->i_ceph_lock); |
| 2164 | if (had & CEPH_CAP_PIN) | 2163 | if (had & CEPH_CAP_PIN) |
| 2165 | --ci->i_pin_ref; | 2164 | --ci->i_pin_ref; |
| 2166 | if (had & CEPH_CAP_FILE_RD) | 2165 | if (had & CEPH_CAP_FILE_RD) |
| @@ -2193,7 +2192,7 @@ void ceph_put_cap_refs(struct ceph_inode_info *ci, int had) | |||
| 2193 | } | 2192 | } |
| 2194 | } | 2193 | } |
| 2195 | } | 2194 | } |
| 2196 | spin_unlock(&inode->i_lock); | 2195 | spin_unlock(&ci->i_ceph_lock); |
| 2197 | 2196 | ||
| 2198 | dout("put_cap_refs %p had %s%s%s\n", inode, ceph_cap_string(had), | 2197 | dout("put_cap_refs %p had %s%s%s\n", inode, ceph_cap_string(had), |
| 2199 | last ? " last" : "", put ? " put" : ""); | 2198 | last ? " last" : "", put ? " put" : ""); |
| @@ -2225,7 +2224,7 @@ void ceph_put_wrbuffer_cap_refs(struct ceph_inode_info *ci, int nr, | |||
| 2225 | int found = 0; | 2224 | int found = 0; |
| 2226 | struct ceph_cap_snap *capsnap = NULL; | 2225 | struct ceph_cap_snap *capsnap = NULL; |
| 2227 | 2226 | ||
| 2228 | spin_lock(&inode->i_lock); | 2227 | spin_lock(&ci->i_ceph_lock); |
| 2229 | ci->i_wrbuffer_ref -= nr; | 2228 | ci->i_wrbuffer_ref -= nr; |
| 2230 | last = !ci->i_wrbuffer_ref; | 2229 | last = !ci->i_wrbuffer_ref; |
| 2231 | 2230 | ||
| @@ -2274,7 +2273,7 @@ void ceph_put_wrbuffer_cap_refs(struct ceph_inode_info *ci, int nr, | |||
| 2274 | } | 2273 | } |
| 2275 | } | 2274 | } |
| 2276 | 2275 | ||
| 2277 | spin_unlock(&inode->i_lock); | 2276 | spin_unlock(&ci->i_ceph_lock); |
| 2278 | 2277 | ||
| 2279 | if (last) { | 2278 | if (last) { |
| 2280 | ceph_check_caps(ci, CHECK_CAPS_AUTHONLY, NULL); | 2279 | ceph_check_caps(ci, CHECK_CAPS_AUTHONLY, NULL); |
| @@ -2291,7 +2290,7 @@ void ceph_put_wrbuffer_cap_refs(struct ceph_inode_info *ci, int nr, | |||
| 2291 | * Handle a cap GRANT message from the MDS. (Note that a GRANT may | 2290 | * Handle a cap GRANT message from the MDS. (Note that a GRANT may |
| 2292 | * actually be a revocation if it specifies a smaller cap set.) | 2291 | * actually be a revocation if it specifies a smaller cap set.) |
| 2293 | * | 2292 | * |
| 2294 | * caller holds s_mutex and i_lock, we drop both. | 2293 | * caller holds s_mutex and i_ceph_lock, we drop both. |
| 2295 | * | 2294 | * |
| 2296 | * return value: | 2295 | * return value: |
| 2297 | * 0 - ok | 2296 | * 0 - ok |
| @@ -2302,7 +2301,7 @@ static void handle_cap_grant(struct inode *inode, struct ceph_mds_caps *grant, | |||
| 2302 | struct ceph_mds_session *session, | 2301 | struct ceph_mds_session *session, |
| 2303 | struct ceph_cap *cap, | 2302 | struct ceph_cap *cap, |
| 2304 | struct ceph_buffer *xattr_buf) | 2303 | struct ceph_buffer *xattr_buf) |
| 2305 | __releases(inode->i_lock) | 2304 | __releases(ci->i_ceph_lock) |
| 2306 | { | 2305 | { |
| 2307 | struct ceph_inode_info *ci = ceph_inode(inode); | 2306 | struct ceph_inode_info *ci = ceph_inode(inode); |
| 2308 | int mds = session->s_mds; | 2307 | int mds = session->s_mds; |
| @@ -2453,7 +2452,7 @@ static void handle_cap_grant(struct inode *inode, struct ceph_mds_caps *grant, | |||
| 2453 | } | 2452 | } |
| 2454 | BUG_ON(cap->issued & ~cap->implemented); | 2453 | BUG_ON(cap->issued & ~cap->implemented); |
| 2455 | 2454 | ||
| 2456 | spin_unlock(&inode->i_lock); | 2455 | spin_unlock(&ci->i_ceph_lock); |
| 2457 | if (writeback) | 2456 | if (writeback) |
| 2458 | /* | 2457 | /* |
| 2459 | * queue inode for writeback: we can't actually call | 2458 | * queue inode for writeback: we can't actually call |
| @@ -2483,7 +2482,7 @@ static void handle_cap_flush_ack(struct inode *inode, u64 flush_tid, | |||
| 2483 | struct ceph_mds_caps *m, | 2482 | struct ceph_mds_caps *m, |
| 2484 | struct ceph_mds_session *session, | 2483 | struct ceph_mds_session *session, |
| 2485 | struct ceph_cap *cap) | 2484 | struct ceph_cap *cap) |
| 2486 | __releases(inode->i_lock) | 2485 | __releases(ci->i_ceph_lock) |
| 2487 | { | 2486 | { |
| 2488 | struct ceph_inode_info *ci = ceph_inode(inode); | 2487 | struct ceph_inode_info *ci = ceph_inode(inode); |
| 2489 | struct ceph_mds_client *mdsc = ceph_sb_to_client(inode->i_sb)->mdsc; | 2488 | struct ceph_mds_client *mdsc = ceph_sb_to_client(inode->i_sb)->mdsc; |
| @@ -2539,7 +2538,7 @@ static void handle_cap_flush_ack(struct inode *inode, u64 flush_tid, | |||
| 2539 | wake_up_all(&ci->i_cap_wq); | 2538 | wake_up_all(&ci->i_cap_wq); |
| 2540 | 2539 | ||
| 2541 | out: | 2540 | out: |
| 2542 | spin_unlock(&inode->i_lock); | 2541 | spin_unlock(&ci->i_ceph_lock); |
| 2543 | if (drop) | 2542 | if (drop) |
| 2544 | iput(inode); | 2543 | iput(inode); |
| 2545 | } | 2544 | } |
| @@ -2562,7 +2561,7 @@ static void handle_cap_flushsnap_ack(struct inode *inode, u64 flush_tid, | |||
| 2562 | dout("handle_cap_flushsnap_ack inode %p ci %p mds%d follows %lld\n", | 2561 | dout("handle_cap_flushsnap_ack inode %p ci %p mds%d follows %lld\n", |
| 2563 | inode, ci, session->s_mds, follows); | 2562 | inode, ci, session->s_mds, follows); |
| 2564 | 2563 | ||
| 2565 | spin_lock(&inode->i_lock); | 2564 | spin_lock(&ci->i_ceph_lock); |
| 2566 | list_for_each_entry(capsnap, &ci->i_cap_snaps, ci_item) { | 2565 | list_for_each_entry(capsnap, &ci->i_cap_snaps, ci_item) { |
| 2567 | if (capsnap->follows == follows) { | 2566 | if (capsnap->follows == follows) { |
| 2568 | if (capsnap->flush_tid != flush_tid) { | 2567 | if (capsnap->flush_tid != flush_tid) { |
| @@ -2585,7 +2584,7 @@ static void handle_cap_flushsnap_ack(struct inode *inode, u64 flush_tid, | |||
| 2585 | capsnap, capsnap->follows); | 2584 | capsnap, capsnap->follows); |
| 2586 | } | 2585 | } |
| 2587 | } | 2586 | } |
| 2588 | spin_unlock(&inode->i_lock); | 2587 | spin_unlock(&ci->i_ceph_lock); |
| 2589 | if (drop) | 2588 | if (drop) |
| 2590 | iput(inode); | 2589 | iput(inode); |
| 2591 | } | 2590 | } |
| @@ -2598,7 +2597,7 @@ static void handle_cap_flushsnap_ack(struct inode *inode, u64 flush_tid, | |||
| 2598 | static void handle_cap_trunc(struct inode *inode, | 2597 | static void handle_cap_trunc(struct inode *inode, |
| 2599 | struct ceph_mds_caps *trunc, | 2598 | struct ceph_mds_caps *trunc, |
| 2600 | struct ceph_mds_session *session) | 2599 | struct ceph_mds_session *session) |
| 2601 | __releases(inode->i_lock) | 2600 | __releases(ci->i_ceph_lock) |
| 2602 | { | 2601 | { |
| 2603 | struct ceph_inode_info *ci = ceph_inode(inode); | 2602 | struct ceph_inode_info *ci = ceph_inode(inode); |
| 2604 | int mds = session->s_mds; | 2603 | int mds = session->s_mds; |
| @@ -2617,7 +2616,7 @@ static void handle_cap_trunc(struct inode *inode, | |||
| 2617 | inode, mds, seq, truncate_size, truncate_seq); | 2616 | inode, mds, seq, truncate_size, truncate_seq); |
| 2618 | queue_trunc = ceph_fill_file_size(inode, issued, | 2617 | queue_trunc = ceph_fill_file_size(inode, issued, |
| 2619 | truncate_seq, truncate_size, size); | 2618 | truncate_seq, truncate_size, size); |
| 2620 | spin_unlock(&inode->i_lock); | 2619 | spin_unlock(&ci->i_ceph_lock); |
| 2621 | 2620 | ||
| 2622 | if (queue_trunc) | 2621 | if (queue_trunc) |
| 2623 | ceph_queue_vmtruncate(inode); | 2622 | ceph_queue_vmtruncate(inode); |
| @@ -2646,7 +2645,7 @@ static void handle_cap_export(struct inode *inode, struct ceph_mds_caps *ex, | |||
| 2646 | dout("handle_cap_export inode %p ci %p mds%d mseq %d\n", | 2645 | dout("handle_cap_export inode %p ci %p mds%d mseq %d\n", |
| 2647 | inode, ci, mds, mseq); | 2646 | inode, ci, mds, mseq); |
| 2648 | 2647 | ||
| 2649 | spin_lock(&inode->i_lock); | 2648 | spin_lock(&ci->i_ceph_lock); |
| 2650 | 2649 | ||
| 2651 | /* make sure we haven't seen a higher mseq */ | 2650 | /* make sure we haven't seen a higher mseq */ |
| 2652 | for (p = rb_first(&ci->i_caps); p; p = rb_next(p)) { | 2651 | for (p = rb_first(&ci->i_caps); p; p = rb_next(p)) { |
| @@ -2690,7 +2689,7 @@ static void handle_cap_export(struct inode *inode, struct ceph_mds_caps *ex, | |||
| 2690 | } | 2689 | } |
| 2691 | /* else, we already released it */ | 2690 | /* else, we already released it */ |
| 2692 | 2691 | ||
| 2693 | spin_unlock(&inode->i_lock); | 2692 | spin_unlock(&ci->i_ceph_lock); |
| 2694 | } | 2693 | } |
| 2695 | 2694 | ||
| 2696 | /* | 2695 | /* |
| @@ -2745,9 +2744,9 @@ static void handle_cap_import(struct ceph_mds_client *mdsc, | |||
| 2745 | up_read(&mdsc->snap_rwsem); | 2744 | up_read(&mdsc->snap_rwsem); |
| 2746 | 2745 | ||
| 2747 | /* make sure we re-request max_size, if necessary */ | 2746 | /* make sure we re-request max_size, if necessary */ |
| 2748 | spin_lock(&inode->i_lock); | 2747 | spin_lock(&ci->i_ceph_lock); |
| 2749 | ci->i_requested_max_size = 0; | 2748 | ci->i_requested_max_size = 0; |
| 2750 | spin_unlock(&inode->i_lock); | 2749 | spin_unlock(&ci->i_ceph_lock); |
| 2751 | } | 2750 | } |
| 2752 | 2751 | ||
| 2753 | /* | 2752 | /* |
| @@ -2762,6 +2761,7 @@ void ceph_handle_caps(struct ceph_mds_session *session, | |||
| 2762 | struct ceph_mds_client *mdsc = session->s_mdsc; | 2761 | struct ceph_mds_client *mdsc = session->s_mdsc; |
| 2763 | struct super_block *sb = mdsc->fsc->sb; | 2762 | struct super_block *sb = mdsc->fsc->sb; |
| 2764 | struct inode *inode; | 2763 | struct inode *inode; |
| 2764 | struct ceph_inode_info *ci; | ||
| 2765 | struct ceph_cap *cap; | 2765 | struct ceph_cap *cap; |
| 2766 | struct ceph_mds_caps *h; | 2766 | struct ceph_mds_caps *h; |
| 2767 | int mds = session->s_mds; | 2767 | int mds = session->s_mds; |
| @@ -2815,6 +2815,7 @@ void ceph_handle_caps(struct ceph_mds_session *session, | |||
| 2815 | 2815 | ||
| 2816 | /* lookup ino */ | 2816 | /* lookup ino */ |
| 2817 | inode = ceph_find_inode(sb, vino); | 2817 | inode = ceph_find_inode(sb, vino); |
| 2818 | ci = ceph_inode(inode); | ||
| 2818 | dout(" op %s ino %llx.%llx inode %p\n", ceph_cap_op_name(op), vino.ino, | 2819 | dout(" op %s ino %llx.%llx inode %p\n", ceph_cap_op_name(op), vino.ino, |
| 2819 | vino.snap, inode); | 2820 | vino.snap, inode); |
| 2820 | if (!inode) { | 2821 | if (!inode) { |
| @@ -2844,16 +2845,16 @@ void ceph_handle_caps(struct ceph_mds_session *session, | |||
| 2844 | } | 2845 | } |
| 2845 | 2846 | ||
| 2846 | /* the rest require a cap */ | 2847 | /* the rest require a cap */ |
| 2847 | spin_lock(&inode->i_lock); | 2848 | spin_lock(&ci->i_ceph_lock); |
| 2848 | cap = __get_cap_for_mds(ceph_inode(inode), mds); | 2849 | cap = __get_cap_for_mds(ceph_inode(inode), mds); |
| 2849 | if (!cap) { | 2850 | if (!cap) { |
| 2850 | dout(" no cap on %p ino %llx.%llx from mds%d\n", | 2851 | dout(" no cap on %p ino %llx.%llx from mds%d\n", |
| 2851 | inode, ceph_ino(inode), ceph_snap(inode), mds); | 2852 | inode, ceph_ino(inode), ceph_snap(inode), mds); |
| 2852 | spin_unlock(&inode->i_lock); | 2853 | spin_unlock(&ci->i_ceph_lock); |
| 2853 | goto flush_cap_releases; | 2854 | goto flush_cap_releases; |
| 2854 | } | 2855 | } |
| 2855 | 2856 | ||
| 2856 | /* note that each of these drops i_lock for us */ | 2857 | /* note that each of these drops i_ceph_lock for us */ |
| 2857 | switch (op) { | 2858 | switch (op) { |
| 2858 | case CEPH_CAP_OP_REVOKE: | 2859 | case CEPH_CAP_OP_REVOKE: |
| 2859 | case CEPH_CAP_OP_GRANT: | 2860 | case CEPH_CAP_OP_GRANT: |
| @@ -2869,7 +2870,7 @@ void ceph_handle_caps(struct ceph_mds_session *session, | |||
| 2869 | break; | 2870 | break; |
| 2870 | 2871 | ||
| 2871 | default: | 2872 | default: |
| 2872 | spin_unlock(&inode->i_lock); | 2873 | spin_unlock(&ci->i_ceph_lock); |
| 2873 | pr_err("ceph_handle_caps: unknown cap op %d %s\n", op, | 2874 | pr_err("ceph_handle_caps: unknown cap op %d %s\n", op, |
| 2874 | ceph_cap_op_name(op)); | 2875 | ceph_cap_op_name(op)); |
| 2875 | } | 2876 | } |
| @@ -2962,13 +2963,13 @@ void ceph_put_fmode(struct ceph_inode_info *ci, int fmode) | |||
| 2962 | struct inode *inode = &ci->vfs_inode; | 2963 | struct inode *inode = &ci->vfs_inode; |
| 2963 | int last = 0; | 2964 | int last = 0; |
| 2964 | 2965 | ||
| 2965 | spin_lock(&inode->i_lock); | 2966 | spin_lock(&ci->i_ceph_lock); |
| 2966 | dout("put_fmode %p fmode %d %d -> %d\n", inode, fmode, | 2967 | dout("put_fmode %p fmode %d %d -> %d\n", inode, fmode, |
| 2967 | ci->i_nr_by_mode[fmode], ci->i_nr_by_mode[fmode]-1); | 2968 | ci->i_nr_by_mode[fmode], ci->i_nr_by_mode[fmode]-1); |
| 2968 | BUG_ON(ci->i_nr_by_mode[fmode] == 0); | 2969 | BUG_ON(ci->i_nr_by_mode[fmode] == 0); |
| 2969 | if (--ci->i_nr_by_mode[fmode] == 0) | 2970 | if (--ci->i_nr_by_mode[fmode] == 0) |
| 2970 | last++; | 2971 | last++; |
| 2971 | spin_unlock(&inode->i_lock); | 2972 | spin_unlock(&ci->i_ceph_lock); |
| 2972 | 2973 | ||
| 2973 | if (last && ci->i_vino.snap == CEPH_NOSNAP) | 2974 | if (last && ci->i_vino.snap == CEPH_NOSNAP) |
| 2974 | ceph_check_caps(ci, 0, NULL); | 2975 | ceph_check_caps(ci, 0, NULL); |
| @@ -2991,7 +2992,7 @@ int ceph_encode_inode_release(void **p, struct inode *inode, | |||
| 2991 | int used, dirty; | 2992 | int used, dirty; |
| 2992 | int ret = 0; | 2993 | int ret = 0; |
| 2993 | 2994 | ||
| 2994 | spin_lock(&inode->i_lock); | 2995 | spin_lock(&ci->i_ceph_lock); |
| 2995 | used = __ceph_caps_used(ci); | 2996 | used = __ceph_caps_used(ci); |
| 2996 | dirty = __ceph_caps_dirty(ci); | 2997 | dirty = __ceph_caps_dirty(ci); |
| 2997 | 2998 | ||
| @@ -3046,7 +3047,7 @@ int ceph_encode_inode_release(void **p, struct inode *inode, | |||
| 3046 | inode, cap, ceph_cap_string(cap->issued)); | 3047 | inode, cap, ceph_cap_string(cap->issued)); |
| 3047 | } | 3048 | } |
| 3048 | } | 3049 | } |
| 3049 | spin_unlock(&inode->i_lock); | 3050 | spin_unlock(&ci->i_ceph_lock); |
| 3050 | return ret; | 3051 | return ret; |
| 3051 | } | 3052 | } |
| 3052 | 3053 | ||
| @@ -3061,7 +3062,7 @@ int ceph_encode_dentry_release(void **p, struct dentry *dentry, | |||
| 3061 | 3062 | ||
| 3062 | /* | 3063 | /* |
| 3063 | * force an record for the directory caps if we have a dentry lease. | 3064 | * force an record for the directory caps if we have a dentry lease. |
| 3064 | * this is racy (can't take i_lock and d_lock together), but it | 3065 | * this is racy (can't take i_ceph_lock and d_lock together), but it |
| 3065 | * doesn't have to be perfect; the mds will revoke anything we don't | 3066 | * doesn't have to be perfect; the mds will revoke anything we don't |
| 3066 | * release. | 3067 | * release. |
| 3067 | */ | 3068 | */ |
diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c index bca3948e9db..3eeb9766126 100644 --- a/fs/ceph/dir.c +++ b/fs/ceph/dir.c | |||
| @@ -281,18 +281,18 @@ static int ceph_readdir(struct file *filp, void *dirent, filldir_t filldir) | |||
| 281 | } | 281 | } |
| 282 | 282 | ||
| 283 | /* can we use the dcache? */ | 283 | /* can we use the dcache? */ |
| 284 | spin_lock(&inode->i_lock); | 284 | spin_lock(&ci->i_ceph_lock); |
| 285 | if ((filp->f_pos == 2 || fi->dentry) && | 285 | if ((filp->f_pos == 2 || fi->dentry) && |
| 286 | !ceph_test_mount_opt(fsc, NOASYNCREADDIR) && | 286 | !ceph_test_mount_opt(fsc, NOASYNCREADDIR) && |
| 287 | ceph_snap(inode) != CEPH_SNAPDIR && | 287 | ceph_snap(inode) != CEPH_SNAPDIR && |
| 288 | ceph_dir_test_complete(inode) && | 288 | ceph_dir_test_complete(inode) && |
| 289 | __ceph_caps_issued_mask(ci, CEPH_CAP_FILE_SHARED, 1)) { | 289 | __ceph_caps_issued_mask(ci, CEPH_CAP_FILE_SHARED, 1)) { |
| 290 | spin_unlock(&inode->i_lock); | 290 | spin_unlock(&ci->i_ceph_lock); |
| 291 | err = __dcache_readdir(filp, dirent, filldir); | 291 | err = __dcache_readdir(filp, dirent, filldir); |
| 292 | if (err != -EAGAIN) | 292 | if (err != -EAGAIN) |
| 293 | return err; | 293 | return err; |
| 294 | } else { | 294 | } else { |
| 295 | spin_unlock(&inode->i_lock); | 295 | spin_unlock(&ci->i_ceph_lock); |
| 296 | } | 296 | } |
| 297 | if (fi->dentry) { | 297 | if (fi->dentry) { |
| 298 | err = note_last_dentry(fi, fi->dentry->d_name.name, | 298 | err = note_last_dentry(fi, fi->dentry->d_name.name, |
| @@ -428,12 +428,12 @@ more: | |||
| 428 | * were released during the whole readdir, and we should have | 428 | * were released during the whole readdir, and we should have |
| 429 | * the complete dir contents in our cache. | 429 | * the complete dir contents in our cache. |
| 430 | */ | 430 | */ |
| 431 | spin_lock(&inode->i_lock); | 431 | spin_lock(&ci->i_ceph_lock); |
| 432 | if (ci->i_release_count == fi->dir_release_count) { | 432 | if (ci->i_release_count == fi->dir_release_count) { |
| 433 | ceph_dir_set_complete(inode); | 433 | ceph_dir_set_complete(inode); |
| 434 | ci->i_max_offset = filp->f_pos; | 434 | ci->i_max_offset = filp->f_pos; |
| 435 | } | 435 | } |
| 436 | spin_unlock(&inode->i_lock); | 436 | spin_unlock(&ci->i_ceph_lock); |
| 437 | 437 | ||
| 438 | dout("readdir %p filp %p done.\n", inode, filp); | 438 | dout("readdir %p filp %p done.\n", inode, filp); |
| 439 | return 0; | 439 | return 0; |
| @@ -607,7 +607,7 @@ static struct dentry *ceph_lookup(struct inode *dir, struct dentry *dentry, | |||
| 607 | struct ceph_inode_info *ci = ceph_inode(dir); | 607 | struct ceph_inode_info *ci = ceph_inode(dir); |
| 608 | struct ceph_dentry_info *di = ceph_dentry(dentry); | 608 | struct ceph_dentry_info *di = ceph_dentry(dentry); |
| 609 | 609 | ||
| 610 | spin_lock(&dir->i_lock); | 610 | spin_lock(&ci->i_ceph_lock); |
| 611 | dout(" dir %p flags are %d\n", dir, ci->i_ceph_flags); | 611 | dout(" dir %p flags are %d\n", dir, ci->i_ceph_flags); |
| 612 | if (strncmp(dentry->d_name.name, | 612 | if (strncmp(dentry->d_name.name, |
| 613 | fsc->mount_options->snapdir_name, | 613 | fsc->mount_options->snapdir_name, |
| @@ -615,13 +615,13 @@ static struct dentry *ceph_lookup(struct inode *dir, struct dentry *dentry, | |||
| 615 | !is_root_ceph_dentry(dir, dentry) && | 615 | !is_root_ceph_dentry(dir, dentry) && |
| 616 | ceph_dir_test_complete(dir) && | 616 | ceph_dir_test_complete(dir) && |
| 617 | (__ceph_caps_issued_mask(ci, CEPH_CAP_FILE_SHARED, 1))) { | 617 | (__ceph_caps_issued_mask(ci, CEPH_CAP_FILE_SHARED, 1))) { |
| 618 | spin_unlock(&dir->i_lock); | 618 | spin_unlock(&ci->i_ceph_lock); |
| 619 | dout(" dir %p complete, -ENOENT\n", dir); | 619 | dout(" dir %p complete, -ENOENT\n", dir); |
| 620 | d_add(dentry, NULL); | 620 | d_add(dentry, NULL); |
| 621 | di->lease_shared_gen = ci->i_shared_gen; | 621 | di->lease_shared_gen = ci->i_shared_gen; |
| 622 | return NULL; | 622 | return NULL; |
| 623 | } | 623 | } |
| 624 | spin_unlock(&dir->i_lock); | 624 | spin_unlock(&ci->i_ceph_lock); |
| 625 | } | 625 | } |
| 626 | 626 | ||
| 627 | op = ceph_snap(dir) == CEPH_SNAPDIR ? | 627 | op = ceph_snap(dir) == CEPH_SNAPDIR ? |
| @@ -841,12 +841,12 @@ static int drop_caps_for_unlink(struct inode *inode) | |||
| 841 | struct ceph_inode_info *ci = ceph_inode(inode); | 841 | struct ceph_inode_info *ci = ceph_inode(inode); |
| 842 | int drop = CEPH_CAP_LINK_SHARED | CEPH_CAP_LINK_EXCL; | 842 | int drop = CEPH_CAP_LINK_SHARED | CEPH_CAP_LINK_EXCL; |
| 843 | 843 | ||
| 844 | spin_lock(&inode->i_lock); | 844 | spin_lock(&ci->i_ceph_lock); |
| 845 | if (inode->i_nlink == 1) { | 845 | if (inode->i_nlink == 1) { |
| 846 | drop |= ~(__ceph_caps_wanted(ci) | CEPH_CAP_PIN); | 846 | drop |= ~(__ceph_caps_wanted(ci) | CEPH_CAP_PIN); |
| 847 | ci->i_ceph_flags |= CEPH_I_NODELAY; | 847 | ci->i_ceph_flags |= CEPH_I_NODELAY; |
| 848 | } | 848 | } |
| 849 | spin_unlock(&inode->i_lock); | 849 | spin_unlock(&ci->i_ceph_lock); |
| 850 | return drop; | 850 | return drop; |
| 851 | } | 851 | } |
| 852 | 852 | ||
| @@ -1015,10 +1015,10 @@ static int dir_lease_is_valid(struct inode *dir, struct dentry *dentry) | |||
| 1015 | struct ceph_dentry_info *di = ceph_dentry(dentry); | 1015 | struct ceph_dentry_info *di = ceph_dentry(dentry); |
| 1016 | int valid = 0; | 1016 | int valid = 0; |
| 1017 | 1017 | ||
| 1018 | spin_lock(&dir->i_lock); | 1018 | spin_lock(&ci->i_ceph_lock); |
| 1019 | if (ci->i_shared_gen == di->lease_shared_gen) | 1019 | if (ci->i_shared_gen == di->lease_shared_gen) |
| 1020 | valid = __ceph_caps_issued_mask(ci, CEPH_CAP_FILE_SHARED, 1); | 1020 | valid = __ceph_caps_issued_mask(ci, CEPH_CAP_FILE_SHARED, 1); |
| 1021 | spin_unlock(&dir->i_lock); | 1021 | spin_unlock(&ci->i_ceph_lock); |
| 1022 | dout("dir_lease_is_valid dir %p v%u dentry %p v%u = %d\n", | 1022 | dout("dir_lease_is_valid dir %p v%u dentry %p v%u = %d\n", |
| 1023 | dir, (unsigned)ci->i_shared_gen, dentry, | 1023 | dir, (unsigned)ci->i_shared_gen, dentry, |
| 1024 | (unsigned)di->lease_shared_gen, valid); | 1024 | (unsigned)di->lease_shared_gen, valid); |
diff --git a/fs/ceph/file.c b/fs/ceph/file.c index ce549d31eeb..ed72428d9c7 100644 --- a/fs/ceph/file.c +++ b/fs/ceph/file.c | |||
| @@ -147,9 +147,9 @@ int ceph_open(struct inode *inode, struct file *file) | |||
| 147 | 147 | ||
| 148 | /* trivially open snapdir */ | 148 | /* trivially open snapdir */ |
| 149 | if (ceph_snap(inode) == CEPH_SNAPDIR) { | 149 | if (ceph_snap(inode) == CEPH_SNAPDIR) { |
| 150 | spin_lock(&inode->i_lock); | 150 | spin_lock(&ci->i_ceph_lock); |
| 151 | __ceph_get_fmode(ci, fmode); | 151 | __ceph_get_fmode(ci, fmode); |
| 152 | spin_unlock(&inode->i_lock); | 152 | spin_unlock(&ci->i_ceph_lock); |
| 153 | return ceph_init_file(inode, file, fmode); | 153 | return ceph_init_file(inode, file, fmode); |
| 154 | } | 154 | } |
| 155 | 155 | ||
| @@ -158,7 +158,7 @@ int ceph_open(struct inode *inode, struct file *file) | |||
| 158 | * write) or any MDS (for read). Update wanted set | 158 | * write) or any MDS (for read). Update wanted set |
| 159 | * asynchronously. | 159 | * asynchronously. |
| 160 | */ | 160 | */ |
| 161 | spin_lock(&inode->i_lock); | 161 | spin_lock(&ci->i_ceph_lock); |
| 162 | if (__ceph_is_any_real_caps(ci) && | 162 | if (__ceph_is_any_real_caps(ci) && |
| 163 | (((fmode & CEPH_FILE_MODE_WR) == 0) || ci->i_auth_cap)) { | 163 | (((fmode & CEPH_FILE_MODE_WR) == 0) || ci->i_auth_cap)) { |
| 164 | int mds_wanted = __ceph_caps_mds_wanted(ci); | 164 | int mds_wanted = __ceph_caps_mds_wanted(ci); |
| @@ -168,7 +168,7 @@ int ceph_open(struct inode *inode, struct file *file) | |||
| 168 | inode, fmode, ceph_cap_string(wanted), | 168 | inode, fmode, ceph_cap_string(wanted), |
| 169 | ceph_cap_string(issued)); | 169 | ceph_cap_string(issued)); |
| 170 | __ceph_get_fmode(ci, fmode); | 170 | __ceph_get_fmode(ci, fmode); |
| 171 | spin_unlock(&inode->i_lock); | 171 | spin_unlock(&ci->i_ceph_lock); |
| 172 | 172 | ||
| 173 | /* adjust wanted? */ | 173 | /* adjust wanted? */ |
| 174 | if ((issued & wanted) != wanted && | 174 | if ((issued & wanted) != wanted && |
| @@ -180,10 +180,10 @@ int ceph_open(struct inode *inode, struct file *file) | |||
| 180 | } else if (ceph_snap(inode) != CEPH_NOSNAP && | 180 | } else if (ceph_snap(inode) != CEPH_NOSNAP && |
| 181 | (ci->i_snap_caps & wanted) == wanted) { | 181 | (ci->i_snap_caps & wanted) == wanted) { |
| 182 | __ceph_get_fmode(ci, fmode); | 182 | __ceph_get_fmode(ci, fmode); |
| 183 | spin_unlock(&inode->i_lock); | 183 | spin_unlock(&ci->i_ceph_lock); |
| 184 | return ceph_init_file(inode, file, fmode); | 184 | return ceph_init_file(inode, file, fmode); |
| 185 | } | 185 | } |
| 186 | spin_unlock(&inode->i_lock); | 186 | spin_unlock(&ci->i_ceph_lock); |
| 187 | 187 | ||
| 188 | dout("open fmode %d wants %s\n", fmode, ceph_cap_string(wanted)); | 188 | dout("open fmode %d wants %s\n", fmode, ceph_cap_string(wanted)); |
| 189 | req = prepare_open_request(inode->i_sb, flags, 0); | 189 | req = prepare_open_request(inode->i_sb, flags, 0); |
| @@ -743,9 +743,9 @@ retry_snap: | |||
| 743 | */ | 743 | */ |
| 744 | int dirty; | 744 | int dirty; |
| 745 | 745 | ||
| 746 | spin_lock(&inode->i_lock); | 746 | spin_lock(&ci->i_ceph_lock); |
| 747 | dirty = __ceph_mark_dirty_caps(ci, CEPH_CAP_FILE_WR); | 747 | dirty = __ceph_mark_dirty_caps(ci, CEPH_CAP_FILE_WR); |
| 748 | spin_unlock(&inode->i_lock); | 748 | spin_unlock(&ci->i_ceph_lock); |
| 749 | ceph_put_cap_refs(ci, got); | 749 | ceph_put_cap_refs(ci, got); |
| 750 | 750 | ||
| 751 | ret = generic_file_aio_write(iocb, iov, nr_segs, pos); | 751 | ret = generic_file_aio_write(iocb, iov, nr_segs, pos); |
| @@ -764,9 +764,9 @@ retry_snap: | |||
| 764 | 764 | ||
| 765 | if (ret >= 0) { | 765 | if (ret >= 0) { |
| 766 | int dirty; | 766 | int dirty; |
| 767 | spin_lock(&inode->i_lock); | 767 | spin_lock(&ci->i_ceph_lock); |
| 768 | dirty = __ceph_mark_dirty_caps(ci, CEPH_CAP_FILE_WR); | 768 | dirty = __ceph_mark_dirty_caps(ci, CEPH_CAP_FILE_WR); |
| 769 | spin_unlock(&inode->i_lock); | 769 | spin_unlock(&ci->i_ceph_lock); |
| 770 | if (dirty) | 770 | if (dirty) |
| 771 | __mark_inode_dirty(inode, dirty); | 771 | __mark_inode_dirty(inode, dirty); |
| 772 | } | 772 | } |
| @@ -797,7 +797,8 @@ static loff_t ceph_llseek(struct file *file, loff_t offset, int origin) | |||
| 797 | 797 | ||
| 798 | mutex_lock(&inode->i_mutex); | 798 | mutex_lock(&inode->i_mutex); |
| 799 | __ceph_do_pending_vmtruncate(inode); | 799 | __ceph_do_pending_vmtruncate(inode); |
| 800 | if (origin != SEEK_CUR || origin != SEEK_SET) { | 800 | |
| 801 | if (origin == SEEK_END || origin == SEEK_DATA || origin == SEEK_HOLE) { | ||
| 801 | ret = ceph_do_getattr(inode, CEPH_STAT_CAP_SIZE); | 802 | ret = ceph_do_getattr(inode, CEPH_STAT_CAP_SIZE); |
| 802 | if (ret < 0) { | 803 | if (ret < 0) { |
| 803 | offset = ret; | 804 | offset = ret; |
diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c index 116f36502f1..87fb132fb33 100644 --- a/fs/ceph/inode.c +++ b/fs/ceph/inode.c | |||
| @@ -297,6 +297,8 @@ struct inode *ceph_alloc_inode(struct super_block *sb) | |||
| 297 | 297 | ||
| 298 | dout("alloc_inode %p\n", &ci->vfs_inode); | 298 | dout("alloc_inode %p\n", &ci->vfs_inode); |
| 299 | 299 | ||
| 300 | spin_lock_init(&ci->i_ceph_lock); | ||
| 301 | |||
| 300 | ci->i_version = 0; | 302 | ci->i_version = 0; |
| 301 | ci->i_time_warp_seq = 0; | 303 | ci->i_time_warp_seq = 0; |
| 302 | ci->i_ceph_flags = 0; | 304 | ci->i_ceph_flags = 0; |
| @@ -583,7 +585,7 @@ static int fill_inode(struct inode *inode, | |||
| 583 | iinfo->xattr_len); | 585 | iinfo->xattr_len); |
| 584 | } | 586 | } |
| 585 | 587 | ||
| 586 | spin_lock(&inode->i_lock); | 588 | spin_lock(&ci->i_ceph_lock); |
| 587 | 589 | ||
| 588 | /* | 590 | /* |
| 589 | * provided version will be odd if inode value is projected, | 591 | * provided version will be odd if inode value is projected, |
| @@ -680,7 +682,7 @@ static int fill_inode(struct inode *inode, | |||
| 680 | char *sym; | 682 | char *sym; |
| 681 | 683 | ||
| 682 | BUG_ON(symlen != inode->i_size); | 684 | BUG_ON(symlen != inode->i_size); |
| 683 | spin_unlock(&inode->i_lock); | 685 | spin_unlock(&ci->i_ceph_lock); |
| 684 | 686 | ||
| 685 | err = -ENOMEM; | 687 | err = -ENOMEM; |
| 686 | sym = kmalloc(symlen+1, GFP_NOFS); | 688 | sym = kmalloc(symlen+1, GFP_NOFS); |
| @@ -689,7 +691,7 @@ static int fill_inode(struct inode *inode, | |||
| 689 | memcpy(sym, iinfo->symlink, symlen); | 691 | memcpy(sym, iinfo->symlink, symlen); |
| 690 | sym[symlen] = 0; | 692 | sym[symlen] = 0; |
| 691 | 693 | ||
| 692 | spin_lock(&inode->i_lock); | 694 | spin_lock(&ci->i_ceph_lock); |
| 693 | if (!ci->i_symlink) | 695 | if (!ci->i_symlink) |
| 694 | ci->i_symlink = sym; | 696 | ci->i_symlink = sym; |
| 695 | else | 697 | else |
| @@ -715,7 +717,7 @@ static int fill_inode(struct inode *inode, | |||
| 715 | } | 717 | } |
| 716 | 718 | ||
| 717 | no_change: | 719 | no_change: |
| 718 | spin_unlock(&inode->i_lock); | 720 | spin_unlock(&ci->i_ceph_lock); |
| 719 | 721 | ||
| 720 | /* queue truncate if we saw i_size decrease */ | 722 | /* queue truncate if we saw i_size decrease */ |
| 721 | if (queue_trunc) | 723 | if (queue_trunc) |
| @@ -750,13 +752,13 @@ no_change: | |||
| 750 | info->cap.flags, | 752 | info->cap.flags, |
| 751 | caps_reservation); | 753 | caps_reservation); |
| 752 | } else { | 754 | } else { |
| 753 | spin_lock(&inode->i_lock); | 755 | spin_lock(&ci->i_ceph_lock); |
| 754 | dout(" %p got snap_caps %s\n", inode, | 756 | dout(" %p got snap_caps %s\n", inode, |
| 755 | ceph_cap_string(le32_to_cpu(info->cap.caps))); | 757 | ceph_cap_string(le32_to_cpu(info->cap.caps))); |
| 756 | ci->i_snap_caps |= le32_to_cpu(info->cap.caps); | 758 | ci->i_snap_caps |= le32_to_cpu(info->cap.caps); |
| 757 | if (cap_fmode >= 0) | 759 | if (cap_fmode >= 0) |
| 758 | __ceph_get_fmode(ci, cap_fmode); | 760 | __ceph_get_fmode(ci, cap_fmode); |
| 759 | spin_unlock(&inode->i_lock); | 761 | spin_unlock(&ci->i_ceph_lock); |
| 760 | } | 762 | } |
| 761 | } else if (cap_fmode >= 0) { | 763 | } else if (cap_fmode >= 0) { |
| 762 | pr_warning("mds issued no caps on %llx.%llx\n", | 764 | pr_warning("mds issued no caps on %llx.%llx\n", |
| @@ -849,19 +851,20 @@ static void ceph_set_dentry_offset(struct dentry *dn) | |||
| 849 | { | 851 | { |
| 850 | struct dentry *dir = dn->d_parent; | 852 | struct dentry *dir = dn->d_parent; |
| 851 | struct inode *inode = dir->d_inode; | 853 | struct inode *inode = dir->d_inode; |
| 854 | struct ceph_inode_info *ci = ceph_inode(inode); | ||
| 852 | struct ceph_dentry_info *di; | 855 | struct ceph_dentry_info *di; |
| 853 | 856 | ||
| 854 | BUG_ON(!inode); | 857 | BUG_ON(!inode); |
| 855 | 858 | ||
| 856 | di = ceph_dentry(dn); | 859 | di = ceph_dentry(dn); |
| 857 | 860 | ||
| 858 | spin_lock(&inode->i_lock); | 861 | spin_lock(&ci->i_ceph_lock); |
| 859 | if (!ceph_dir_test_complete(inode)) { | 862 | if (!ceph_dir_test_complete(inode)) { |
| 860 | spin_unlock(&inode->i_lock); | 863 | spin_unlock(&ci->i_ceph_lock); |
| 861 | return; | 864 | return; |
| 862 | } | 865 | } |
| 863 | di->offset = ceph_inode(inode)->i_max_offset++; | 866 | di->offset = ceph_inode(inode)->i_max_offset++; |
| 864 | spin_unlock(&inode->i_lock); | 867 | spin_unlock(&ci->i_ceph_lock); |
| 865 | 868 | ||
| 866 | spin_lock(&dir->d_lock); | 869 | spin_lock(&dir->d_lock); |
| 867 | spin_lock_nested(&dn->d_lock, DENTRY_D_LOCK_NESTED); | 870 | spin_lock_nested(&dn->d_lock, DENTRY_D_LOCK_NESTED); |
| @@ -1308,7 +1311,7 @@ int ceph_inode_set_size(struct inode *inode, loff_t size) | |||
| 1308 | struct ceph_inode_info *ci = ceph_inode(inode); | 1311 | struct ceph_inode_info *ci = ceph_inode(inode); |
| 1309 | int ret = 0; | 1312 | int ret = 0; |
| 1310 | 1313 | ||
| 1311 | spin_lock(&inode->i_lock); | 1314 | spin_lock(&ci->i_ceph_lock); |
| 1312 | dout("set_size %p %llu -> %llu\n", inode, inode->i_size, size); | 1315 | dout("set_size %p %llu -> %llu\n", inode, inode->i_size, size); |
| 1313 | inode->i_size = size; | 1316 | inode->i_size = size; |
| 1314 | inode->i_blocks = (size + (1 << 9) - 1) >> 9; | 1317 | inode->i_blocks = (size + (1 << 9) - 1) >> 9; |
| @@ -1318,7 +1321,7 @@ int ceph_inode_set_size(struct inode *inode, loff_t size) | |||
| 1318 | (ci->i_reported_size << 1) < ci->i_max_size) | 1321 | (ci->i_reported_size << 1) < ci->i_max_size) |
| 1319 | ret = 1; | 1322 | ret = 1; |
| 1320 | 1323 | ||
| 1321 | spin_unlock(&inode->i_lock); | 1324 | spin_unlock(&ci->i_ceph_lock); |
| 1322 | return ret; | 1325 | return ret; |
| 1323 | } | 1326 | } |
| 1324 | 1327 | ||
| @@ -1376,20 +1379,20 @@ static void ceph_invalidate_work(struct work_struct *work) | |||
| 1376 | u32 orig_gen; | 1379 | u32 orig_gen; |
| 1377 | int check = 0; | 1380 | int check = 0; |
| 1378 | 1381 | ||
| 1379 | spin_lock(&inode->i_lock); | 1382 | spin_lock(&ci->i_ceph_lock); |
| 1380 | dout("invalidate_pages %p gen %d revoking %d\n", inode, | 1383 | dout("invalidate_pages %p gen %d revoking %d\n", inode, |
| 1381 | ci->i_rdcache_gen, ci->i_rdcache_revoking); | 1384 | ci->i_rdcache_gen, ci->i_rdcache_revoking); |
| 1382 | if (ci->i_rdcache_revoking != ci->i_rdcache_gen) { | 1385 | if (ci->i_rdcache_revoking != ci->i_rdcache_gen) { |
| 1383 | /* nevermind! */ | 1386 | /* nevermind! */ |
| 1384 | spin_unlock(&inode->i_lock); | 1387 | spin_unlock(&ci->i_ceph_lock); |
| 1385 | goto out; | 1388 | goto out; |
| 1386 | } | 1389 | } |
| 1387 | orig_gen = ci->i_rdcache_gen; | 1390 | orig_gen = ci->i_rdcache_gen; |
| 1388 | spin_unlock(&inode->i_lock); | 1391 | spin_unlock(&ci->i_ceph_lock); |
| 1389 | 1392 | ||
| 1390 | truncate_inode_pages(&inode->i_data, 0); | 1393 | truncate_inode_pages(&inode->i_data, 0); |
| 1391 | 1394 | ||
| 1392 | spin_lock(&inode->i_lock); | 1395 | spin_lock(&ci->i_ceph_lock); |
| 1393 | if (orig_gen == ci->i_rdcache_gen && | 1396 | if (orig_gen == ci->i_rdcache_gen && |
| 1394 | orig_gen == ci->i_rdcache_revoking) { | 1397 | orig_gen == ci->i_rdcache_revoking) { |
| 1395 | dout("invalidate_pages %p gen %d successful\n", inode, | 1398 | dout("invalidate_pages %p gen %d successful\n", inode, |
| @@ -1401,7 +1404,7 @@ static void ceph_invalidate_work(struct work_struct *work) | |||
| 1401 | inode, orig_gen, ci->i_rdcache_gen, | 1404 | inode, orig_gen, ci->i_rdcache_gen, |
| 1402 | ci->i_rdcache_revoking); | 1405 | ci->i_rdcache_revoking); |
| 1403 | } | 1406 | } |
| 1404 | spin_unlock(&inode->i_lock); | 1407 | spin_unlock(&ci->i_ceph_lock); |
| 1405 | 1408 | ||
| 1406 | if (check) | 1409 | if (check) |
| 1407 | ceph_check_caps(ci, 0, NULL); | 1410 | ceph_check_caps(ci, 0, NULL); |
| @@ -1460,10 +1463,10 @@ void __ceph_do_pending_vmtruncate(struct inode *inode) | |||
| 1460 | int wrbuffer_refs, wake = 0; | 1463 | int wrbuffer_refs, wake = 0; |
| 1461 | 1464 | ||
| 1462 | retry: | 1465 | retry: |
| 1463 | spin_lock(&inode->i_lock); | 1466 | spin_lock(&ci->i_ceph_lock); |
| 1464 | if (ci->i_truncate_pending == 0) { | 1467 | if (ci->i_truncate_pending == 0) { |
| 1465 | dout("__do_pending_vmtruncate %p none pending\n", inode); | 1468 | dout("__do_pending_vmtruncate %p none pending\n", inode); |
| 1466 | spin_unlock(&inode->i_lock); | 1469 | spin_unlock(&ci->i_ceph_lock); |
| 1467 | return; | 1470 | return; |
| 1468 | } | 1471 | } |
| 1469 | 1472 | ||
| @@ -1474,7 +1477,7 @@ retry: | |||
| 1474 | if (ci->i_wrbuffer_ref_head < ci->i_wrbuffer_ref) { | 1477 | if (ci->i_wrbuffer_ref_head < ci->i_wrbuffer_ref) { |
| 1475 | dout("__do_pending_vmtruncate %p flushing snaps first\n", | 1478 | dout("__do_pending_vmtruncate %p flushing snaps first\n", |
| 1476 | inode); | 1479 | inode); |
| 1477 | spin_unlock(&inode->i_lock); | 1480 | spin_unlock(&ci->i_ceph_lock); |
| 1478 | filemap_write_and_wait_range(&inode->i_data, 0, | 1481 | filemap_write_and_wait_range(&inode->i_data, 0, |
| 1479 | inode->i_sb->s_maxbytes); | 1482 | inode->i_sb->s_maxbytes); |
| 1480 | goto retry; | 1483 | goto retry; |
| @@ -1484,15 +1487,15 @@ retry: | |||
| 1484 | wrbuffer_refs = ci->i_wrbuffer_ref; | 1487 | wrbuffer_refs = ci->i_wrbuffer_ref; |
| 1485 | dout("__do_pending_vmtruncate %p (%d) to %lld\n", inode, | 1488 | dout("__do_pending_vmtruncate %p (%d) to %lld\n", inode, |
| 1486 | ci->i_truncate_pending, to); | 1489 | ci->i_truncate_pending, to); |
| 1487 | spin_unlock(&inode->i_lock); | 1490 | spin_unlock(&ci->i_ceph_lock); |
| 1488 | 1491 | ||
| 1489 | truncate_inode_pages(inode->i_mapping, to); | 1492 | truncate_inode_pages(inode->i_mapping, to); |
| 1490 | 1493 | ||
| 1491 | spin_lock(&inode->i_lock); | 1494 | spin_lock(&ci->i_ceph_lock); |
| 1492 | ci->i_truncate_pending--; | 1495 | ci->i_truncate_pending--; |
| 1493 | if (ci->i_truncate_pending == 0) | 1496 | if (ci->i_truncate_pending == 0) |
| 1494 | wake = 1; | 1497 | wake = 1; |
| 1495 | spin_unlock(&inode->i_lock); | 1498 | spin_unlock(&ci->i_ceph_lock); |
| 1496 | 1499 | ||
| 1497 | if (wrbuffer_refs == 0) | 1500 | if (wrbuffer_refs == 0) |
| 1498 | ceph_check_caps(ci, CHECK_CAPS_AUTHONLY, NULL); | 1501 | ceph_check_caps(ci, CHECK_CAPS_AUTHONLY, NULL); |
| @@ -1547,7 +1550,7 @@ int ceph_setattr(struct dentry *dentry, struct iattr *attr) | |||
| 1547 | if (IS_ERR(req)) | 1550 | if (IS_ERR(req)) |
| 1548 | return PTR_ERR(req); | 1551 | return PTR_ERR(req); |
| 1549 | 1552 | ||
| 1550 | spin_lock(&inode->i_lock); | 1553 | spin_lock(&ci->i_ceph_lock); |
| 1551 | issued = __ceph_caps_issued(ci, NULL); | 1554 | issued = __ceph_caps_issued(ci, NULL); |
| 1552 | dout("setattr %p issued %s\n", inode, ceph_cap_string(issued)); | 1555 | dout("setattr %p issued %s\n", inode, ceph_cap_string(issued)); |
| 1553 | 1556 | ||
| @@ -1695,7 +1698,7 @@ int ceph_setattr(struct dentry *dentry, struct iattr *attr) | |||
| 1695 | } | 1698 | } |
| 1696 | 1699 | ||
| 1697 | release &= issued; | 1700 | release &= issued; |
| 1698 | spin_unlock(&inode->i_lock); | 1701 | spin_unlock(&ci->i_ceph_lock); |
| 1699 | 1702 | ||
| 1700 | if (inode_dirty_flags) | 1703 | if (inode_dirty_flags) |
| 1701 | __mark_inode_dirty(inode, inode_dirty_flags); | 1704 | __mark_inode_dirty(inode, inode_dirty_flags); |
| @@ -1717,7 +1720,7 @@ int ceph_setattr(struct dentry *dentry, struct iattr *attr) | |||
| 1717 | __ceph_do_pending_vmtruncate(inode); | 1720 | __ceph_do_pending_vmtruncate(inode); |
| 1718 | return err; | 1721 | return err; |
| 1719 | out: | 1722 | out: |
| 1720 | spin_unlock(&inode->i_lock); | 1723 | spin_unlock(&ci->i_ceph_lock); |
| 1721 | ceph_mdsc_put_request(req); | 1724 | ceph_mdsc_put_request(req); |
| 1722 | return err; | 1725 | return err; |
| 1723 | } | 1726 | } |
diff --git a/fs/ceph/ioctl.c b/fs/ceph/ioctl.c index 5a14c29cbba..790914a598d 100644 --- a/fs/ceph/ioctl.c +++ b/fs/ceph/ioctl.c | |||
| @@ -241,11 +241,11 @@ static long ceph_ioctl_lazyio(struct file *file) | |||
| 241 | struct ceph_inode_info *ci = ceph_inode(inode); | 241 | struct ceph_inode_info *ci = ceph_inode(inode); |
| 242 | 242 | ||
| 243 | if ((fi->fmode & CEPH_FILE_MODE_LAZY) == 0) { | 243 | if ((fi->fmode & CEPH_FILE_MODE_LAZY) == 0) { |
| 244 | spin_lock(&inode->i_lock); | 244 | spin_lock(&ci->i_ceph_lock); |
| 245 | ci->i_nr_by_mode[fi->fmode]--; | 245 | ci->i_nr_by_mode[fi->fmode]--; |
| 246 | fi->fmode |= CEPH_FILE_MODE_LAZY; | 246 | fi->fmode |= CEPH_FILE_MODE_LAZY; |
| 247 | ci->i_nr_by_mode[fi->fmode]++; | 247 | ci->i_nr_by_mode[fi->fmode]++; |
| 248 | spin_unlock(&inode->i_lock); | 248 | spin_unlock(&ci->i_ceph_lock); |
| 249 | dout("ioctl_layzio: file %p marked lazy\n", file); | 249 | dout("ioctl_layzio: file %p marked lazy\n", file); |
| 250 | 250 | ||
| 251 | ceph_check_caps(ci, 0, NULL); | 251 | ceph_check_caps(ci, 0, NULL); |
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c index 264ab701154..6203d805eb4 100644 --- a/fs/ceph/mds_client.c +++ b/fs/ceph/mds_client.c | |||
| @@ -732,21 +732,21 @@ static int __choose_mds(struct ceph_mds_client *mdsc, | |||
| 732 | } | 732 | } |
| 733 | } | 733 | } |
| 734 | 734 | ||
| 735 | spin_lock(&inode->i_lock); | 735 | spin_lock(&ci->i_ceph_lock); |
| 736 | cap = NULL; | 736 | cap = NULL; |
| 737 | if (mode == USE_AUTH_MDS) | 737 | if (mode == USE_AUTH_MDS) |
| 738 | cap = ci->i_auth_cap; | 738 | cap = ci->i_auth_cap; |
| 739 | if (!cap && !RB_EMPTY_ROOT(&ci->i_caps)) | 739 | if (!cap && !RB_EMPTY_ROOT(&ci->i_caps)) |
| 740 | cap = rb_entry(rb_first(&ci->i_caps), struct ceph_cap, ci_node); | 740 | cap = rb_entry(rb_first(&ci->i_caps), struct ceph_cap, ci_node); |
| 741 | if (!cap) { | 741 | if (!cap) { |
| 742 | spin_unlock(&inode->i_lock); | 742 | spin_unlock(&ci->i_ceph_lock); |
| 743 | goto random; | 743 | goto random; |
| 744 | } | 744 | } |
| 745 | mds = cap->session->s_mds; | 745 | mds = cap->session->s_mds; |
| 746 | dout("choose_mds %p %llx.%llx mds%d (%scap %p)\n", | 746 | dout("choose_mds %p %llx.%llx mds%d (%scap %p)\n", |
| 747 | inode, ceph_vinop(inode), mds, | 747 | inode, ceph_vinop(inode), mds, |
| 748 | cap == ci->i_auth_cap ? "auth " : "", cap); | 748 | cap == ci->i_auth_cap ? "auth " : "", cap); |
| 749 | spin_unlock(&inode->i_lock); | 749 | spin_unlock(&ci->i_ceph_lock); |
| 750 | return mds; | 750 | return mds; |
| 751 | 751 | ||
| 752 | random: | 752 | random: |
| @@ -951,7 +951,7 @@ static int remove_session_caps_cb(struct inode *inode, struct ceph_cap *cap, | |||
| 951 | 951 | ||
| 952 | dout("removing cap %p, ci is %p, inode is %p\n", | 952 | dout("removing cap %p, ci is %p, inode is %p\n", |
| 953 | cap, ci, &ci->vfs_inode); | 953 | cap, ci, &ci->vfs_inode); |
| 954 | spin_lock(&inode->i_lock); | 954 | spin_lock(&ci->i_ceph_lock); |
| 955 | __ceph_remove_cap(cap); | 955 | __ceph_remove_cap(cap); |
| 956 | if (!__ceph_is_any_real_caps(ci)) { | 956 | if (!__ceph_is_any_real_caps(ci)) { |
| 957 | struct ceph_mds_client *mdsc = | 957 | struct ceph_mds_client *mdsc = |
| @@ -984,7 +984,7 @@ static int remove_session_caps_cb(struct inode *inode, struct ceph_cap *cap, | |||
| 984 | } | 984 | } |
| 985 | spin_unlock(&mdsc->cap_dirty_lock); | 985 | spin_unlock(&mdsc->cap_dirty_lock); |
| 986 | } | 986 | } |
| 987 | spin_unlock(&inode->i_lock); | 987 | spin_unlock(&ci->i_ceph_lock); |
| 988 | while (drop--) | 988 | while (drop--) |
| 989 | iput(inode); | 989 | iput(inode); |
| 990 | return 0; | 990 | return 0; |
| @@ -1015,10 +1015,10 @@ static int wake_up_session_cb(struct inode *inode, struct ceph_cap *cap, | |||
| 1015 | 1015 | ||
| 1016 | wake_up_all(&ci->i_cap_wq); | 1016 | wake_up_all(&ci->i_cap_wq); |
| 1017 | if (arg) { | 1017 | if (arg) { |
| 1018 | spin_lock(&inode->i_lock); | 1018 | spin_lock(&ci->i_ceph_lock); |
| 1019 | ci->i_wanted_max_size = 0; | 1019 | ci->i_wanted_max_size = 0; |
| 1020 | ci->i_requested_max_size = 0; | 1020 | ci->i_requested_max_size = 0; |
| 1021 | spin_unlock(&inode->i_lock); | 1021 | spin_unlock(&ci->i_ceph_lock); |
| 1022 | } | 1022 | } |
| 1023 | return 0; | 1023 | return 0; |
| 1024 | } | 1024 | } |
| @@ -1151,7 +1151,7 @@ static int trim_caps_cb(struct inode *inode, struct ceph_cap *cap, void *arg) | |||
| 1151 | if (session->s_trim_caps <= 0) | 1151 | if (session->s_trim_caps <= 0) |
| 1152 | return -1; | 1152 | return -1; |
| 1153 | 1153 | ||
| 1154 | spin_lock(&inode->i_lock); | 1154 | spin_lock(&ci->i_ceph_lock); |
| 1155 | mine = cap->issued | cap->implemented; | 1155 | mine = cap->issued | cap->implemented; |
| 1156 | used = __ceph_caps_used(ci); | 1156 | used = __ceph_caps_used(ci); |
| 1157 | oissued = __ceph_caps_issued_other(ci, cap); | 1157 | oissued = __ceph_caps_issued_other(ci, cap); |
| @@ -1170,7 +1170,7 @@ static int trim_caps_cb(struct inode *inode, struct ceph_cap *cap, void *arg) | |||
| 1170 | __ceph_remove_cap(cap); | 1170 | __ceph_remove_cap(cap); |
| 1171 | } else { | 1171 | } else { |
| 1172 | /* try to drop referring dentries */ | 1172 | /* try to drop referring dentries */ |
| 1173 | spin_unlock(&inode->i_lock); | 1173 | spin_unlock(&ci->i_ceph_lock); |
| 1174 | d_prune_aliases(inode); | 1174 | d_prune_aliases(inode); |
| 1175 | dout("trim_caps_cb %p cap %p pruned, count now %d\n", | 1175 | dout("trim_caps_cb %p cap %p pruned, count now %d\n", |
| 1176 | inode, cap, atomic_read(&inode->i_count)); | 1176 | inode, cap, atomic_read(&inode->i_count)); |
| @@ -1178,7 +1178,7 @@ static int trim_caps_cb(struct inode *inode, struct ceph_cap *cap, void *arg) | |||
| 1178 | } | 1178 | } |
| 1179 | 1179 | ||
| 1180 | out: | 1180 | out: |
| 1181 | spin_unlock(&inode->i_lock); | 1181 | spin_unlock(&ci->i_ceph_lock); |
| 1182 | return 0; | 1182 | return 0; |
| 1183 | } | 1183 | } |
| 1184 | 1184 | ||
| @@ -1296,7 +1296,7 @@ static int check_cap_flush(struct ceph_mds_client *mdsc, u64 want_flush_seq) | |||
| 1296 | i_flushing_item); | 1296 | i_flushing_item); |
| 1297 | struct inode *inode = &ci->vfs_inode; | 1297 | struct inode *inode = &ci->vfs_inode; |
| 1298 | 1298 | ||
| 1299 | spin_lock(&inode->i_lock); | 1299 | spin_lock(&ci->i_ceph_lock); |
| 1300 | if (ci->i_cap_flush_seq <= want_flush_seq) { | 1300 | if (ci->i_cap_flush_seq <= want_flush_seq) { |
| 1301 | dout("check_cap_flush still flushing %p " | 1301 | dout("check_cap_flush still flushing %p " |
| 1302 | "seq %lld <= %lld to mds%d\n", inode, | 1302 | "seq %lld <= %lld to mds%d\n", inode, |
| @@ -1304,7 +1304,7 @@ static int check_cap_flush(struct ceph_mds_client *mdsc, u64 want_flush_seq) | |||
| 1304 | session->s_mds); | 1304 | session->s_mds); |
| 1305 | ret = 0; | 1305 | ret = 0; |
| 1306 | } | 1306 | } |
| 1307 | spin_unlock(&inode->i_lock); | 1307 | spin_unlock(&ci->i_ceph_lock); |
| 1308 | } | 1308 | } |
| 1309 | mutex_unlock(&session->s_mutex); | 1309 | mutex_unlock(&session->s_mutex); |
| 1310 | ceph_put_mds_session(session); | 1310 | ceph_put_mds_session(session); |
| @@ -1495,6 +1495,7 @@ retry: | |||
| 1495 | pos, temp); | 1495 | pos, temp); |
| 1496 | } else if (stop_on_nosnap && inode && | 1496 | } else if (stop_on_nosnap && inode && |
| 1497 | ceph_snap(inode) == CEPH_NOSNAP) { | 1497 | ceph_snap(inode) == CEPH_NOSNAP) { |
| 1498 | spin_unlock(&temp->d_lock); | ||
| 1498 | break; | 1499 | break; |
| 1499 | } else { | 1500 | } else { |
| 1500 | pos -= temp->d_name.len; | 1501 | pos -= temp->d_name.len; |
| @@ -2011,10 +2012,10 @@ void ceph_invalidate_dir_request(struct ceph_mds_request *req) | |||
| 2011 | struct ceph_inode_info *ci = ceph_inode(inode); | 2012 | struct ceph_inode_info *ci = ceph_inode(inode); |
| 2012 | 2013 | ||
| 2013 | dout("invalidate_dir_request %p (D_COMPLETE, lease(s))\n", inode); | 2014 | dout("invalidate_dir_request %p (D_COMPLETE, lease(s))\n", inode); |
| 2014 | spin_lock(&inode->i_lock); | 2015 | spin_lock(&ci->i_ceph_lock); |
| 2015 | ceph_dir_clear_complete(inode); | 2016 | ceph_dir_clear_complete(inode); |
| 2016 | ci->i_release_count++; | 2017 | ci->i_release_count++; |
| 2017 | spin_unlock(&inode->i_lock); | 2018 | spin_unlock(&ci->i_ceph_lock); |
| 2018 | 2019 | ||
| 2019 | if (req->r_dentry) | 2020 | if (req->r_dentry) |
| 2020 | ceph_invalidate_dentry_lease(req->r_dentry); | 2021 | ceph_invalidate_dentry_lease(req->r_dentry); |
| @@ -2422,7 +2423,7 @@ static int encode_caps_cb(struct inode *inode, struct ceph_cap *cap, | |||
| 2422 | if (err) | 2423 | if (err) |
| 2423 | goto out_free; | 2424 | goto out_free; |
| 2424 | 2425 | ||
| 2425 | spin_lock(&inode->i_lock); | 2426 | spin_lock(&ci->i_ceph_lock); |
| 2426 | cap->seq = 0; /* reset cap seq */ | 2427 | cap->seq = 0; /* reset cap seq */ |
| 2427 | cap->issue_seq = 0; /* and issue_seq */ | 2428 | cap->issue_seq = 0; /* and issue_seq */ |
| 2428 | 2429 | ||
| @@ -2445,7 +2446,7 @@ static int encode_caps_cb(struct inode *inode, struct ceph_cap *cap, | |||
| 2445 | rec.v1.pathbase = cpu_to_le64(pathbase); | 2446 | rec.v1.pathbase = cpu_to_le64(pathbase); |
| 2446 | reclen = sizeof(rec.v1); | 2447 | reclen = sizeof(rec.v1); |
| 2447 | } | 2448 | } |
| 2448 | spin_unlock(&inode->i_lock); | 2449 | spin_unlock(&ci->i_ceph_lock); |
| 2449 | 2450 | ||
| 2450 | if (recon_state->flock) { | 2451 | if (recon_state->flock) { |
| 2451 | int num_fcntl_locks, num_flock_locks; | 2452 | int num_fcntl_locks, num_flock_locks; |
diff --git a/fs/ceph/mds_client.h b/fs/ceph/mds_client.h index 4bb239921db..a50ca0e3947 100644 --- a/fs/ceph/mds_client.h +++ b/fs/ceph/mds_client.h | |||
| @@ -20,7 +20,7 @@ | |||
| 20 | * | 20 | * |
| 21 | * mdsc->snap_rwsem | 21 | * mdsc->snap_rwsem |
| 22 | * | 22 | * |
| 23 | * inode->i_lock | 23 | * ci->i_ceph_lock |
| 24 | * mdsc->snap_flush_lock | 24 | * mdsc->snap_flush_lock |
| 25 | * mdsc->cap_delay_lock | 25 | * mdsc->cap_delay_lock |
| 26 | * | 26 | * |
diff --git a/fs/ceph/snap.c b/fs/ceph/snap.c index e2643719133..a559c80f127 100644 --- a/fs/ceph/snap.c +++ b/fs/ceph/snap.c | |||
| @@ -446,7 +446,7 @@ void ceph_queue_cap_snap(struct ceph_inode_info *ci) | |||
| 446 | return; | 446 | return; |
| 447 | } | 447 | } |
| 448 | 448 | ||
| 449 | spin_lock(&inode->i_lock); | 449 | spin_lock(&ci->i_ceph_lock); |
| 450 | used = __ceph_caps_used(ci); | 450 | used = __ceph_caps_used(ci); |
| 451 | dirty = __ceph_caps_dirty(ci); | 451 | dirty = __ceph_caps_dirty(ci); |
| 452 | 452 | ||
| @@ -528,7 +528,7 @@ void ceph_queue_cap_snap(struct ceph_inode_info *ci) | |||
| 528 | kfree(capsnap); | 528 | kfree(capsnap); |
| 529 | } | 529 | } |
| 530 | 530 | ||
| 531 | spin_unlock(&inode->i_lock); | 531 | spin_unlock(&ci->i_ceph_lock); |
| 532 | } | 532 | } |
| 533 | 533 | ||
| 534 | /* | 534 | /* |
| @@ -537,7 +537,7 @@ void ceph_queue_cap_snap(struct ceph_inode_info *ci) | |||
| 537 | * | 537 | * |
| 538 | * If capsnap can now be flushed, add to snap_flush list, and return 1. | 538 | * If capsnap can now be flushed, add to snap_flush list, and return 1. |
| 539 | * | 539 | * |
| 540 | * Caller must hold i_lock. | 540 | * Caller must hold i_ceph_lock. |
| 541 | */ | 541 | */ |
| 542 | int __ceph_finish_cap_snap(struct ceph_inode_info *ci, | 542 | int __ceph_finish_cap_snap(struct ceph_inode_info *ci, |
| 543 | struct ceph_cap_snap *capsnap) | 543 | struct ceph_cap_snap *capsnap) |
| @@ -739,9 +739,9 @@ static void flush_snaps(struct ceph_mds_client *mdsc) | |||
| 739 | inode = &ci->vfs_inode; | 739 | inode = &ci->vfs_inode; |
| 740 | ihold(inode); | 740 | ihold(inode); |
| 741 | spin_unlock(&mdsc->snap_flush_lock); | 741 | spin_unlock(&mdsc->snap_flush_lock); |
| 742 | spin_lock(&inode->i_lock); | 742 | spin_lock(&ci->i_ceph_lock); |
| 743 | __ceph_flush_snaps(ci, &session, 0); | 743 | __ceph_flush_snaps(ci, &session, 0); |
| 744 | spin_unlock(&inode->i_lock); | 744 | spin_unlock(&ci->i_ceph_lock); |
| 745 | iput(inode); | 745 | iput(inode); |
| 746 | spin_lock(&mdsc->snap_flush_lock); | 746 | spin_lock(&mdsc->snap_flush_lock); |
| 747 | } | 747 | } |
| @@ -847,7 +847,7 @@ void ceph_handle_snap(struct ceph_mds_client *mdsc, | |||
| 847 | continue; | 847 | continue; |
| 848 | ci = ceph_inode(inode); | 848 | ci = ceph_inode(inode); |
| 849 | 849 | ||
| 850 | spin_lock(&inode->i_lock); | 850 | spin_lock(&ci->i_ceph_lock); |
| 851 | if (!ci->i_snap_realm) | 851 | if (!ci->i_snap_realm) |
| 852 | goto skip_inode; | 852 | goto skip_inode; |
| 853 | /* | 853 | /* |
| @@ -876,7 +876,7 @@ void ceph_handle_snap(struct ceph_mds_client *mdsc, | |||
| 876 | oldrealm = ci->i_snap_realm; | 876 | oldrealm = ci->i_snap_realm; |
| 877 | ci->i_snap_realm = realm; | 877 | ci->i_snap_realm = realm; |
| 878 | spin_unlock(&realm->inodes_with_caps_lock); | 878 | spin_unlock(&realm->inodes_with_caps_lock); |
| 879 | spin_unlock(&inode->i_lock); | 879 | spin_unlock(&ci->i_ceph_lock); |
| 880 | 880 | ||
| 881 | ceph_get_snap_realm(mdsc, realm); | 881 | ceph_get_snap_realm(mdsc, realm); |
| 882 | ceph_put_snap_realm(mdsc, oldrealm); | 882 | ceph_put_snap_realm(mdsc, oldrealm); |
| @@ -885,7 +885,7 @@ void ceph_handle_snap(struct ceph_mds_client *mdsc, | |||
| 885 | continue; | 885 | continue; |
| 886 | 886 | ||
| 887 | skip_inode: | 887 | skip_inode: |
| 888 | spin_unlock(&inode->i_lock); | 888 | spin_unlock(&ci->i_ceph_lock); |
| 889 | iput(inode); | 889 | iput(inode); |
| 890 | } | 890 | } |
| 891 | 891 | ||
diff --git a/fs/ceph/super.c b/fs/ceph/super.c index 8dc73a594a9..b48f15f101a 100644 --- a/fs/ceph/super.c +++ b/fs/ceph/super.c | |||
| @@ -383,7 +383,7 @@ static int ceph_show_options(struct seq_file *m, struct vfsmount *mnt) | |||
| 383 | if (fsopt->rsize != CEPH_RSIZE_DEFAULT) | 383 | if (fsopt->rsize != CEPH_RSIZE_DEFAULT) |
| 384 | seq_printf(m, ",rsize=%d", fsopt->rsize); | 384 | seq_printf(m, ",rsize=%d", fsopt->rsize); |
| 385 | if (fsopt->rasize != CEPH_RASIZE_DEFAULT) | 385 | if (fsopt->rasize != CEPH_RASIZE_DEFAULT) |
| 386 | seq_printf(m, ",rasize=%d", fsopt->rsize); | 386 | seq_printf(m, ",rasize=%d", fsopt->rasize); |
| 387 | if (fsopt->congestion_kb != default_congestion_kb()) | 387 | if (fsopt->congestion_kb != default_congestion_kb()) |
| 388 | seq_printf(m, ",write_congestion_kb=%d", fsopt->congestion_kb); | 388 | seq_printf(m, ",write_congestion_kb=%d", fsopt->congestion_kb); |
| 389 | if (fsopt->caps_wanted_delay_min != CEPH_CAPS_WANTED_DELAY_MIN_DEFAULT) | 389 | if (fsopt->caps_wanted_delay_min != CEPH_CAPS_WANTED_DELAY_MIN_DEFAULT) |
diff --git a/fs/ceph/super.h b/fs/ceph/super.h index 01bf189e08a..edcbf3774a5 100644 --- a/fs/ceph/super.h +++ b/fs/ceph/super.h | |||
| @@ -220,7 +220,7 @@ struct ceph_dentry_info { | |||
| 220 | * The locking for D_COMPLETE is a bit odd: | 220 | * The locking for D_COMPLETE is a bit odd: |
| 221 | * - we can clear it at almost any time (see ceph_d_prune) | 221 | * - we can clear it at almost any time (see ceph_d_prune) |
| 222 | * - it is only meaningful if: | 222 | * - it is only meaningful if: |
| 223 | * - we hold dir inode i_lock | 223 | * - we hold dir inode i_ceph_lock |
| 224 | * - we hold dir FILE_SHARED caps | 224 | * - we hold dir FILE_SHARED caps |
| 225 | * - the dentry D_COMPLETE is set | 225 | * - the dentry D_COMPLETE is set |
| 226 | */ | 226 | */ |
| @@ -250,6 +250,8 @@ struct ceph_inode_xattrs_info { | |||
| 250 | struct ceph_inode_info { | 250 | struct ceph_inode_info { |
| 251 | struct ceph_vino i_vino; /* ceph ino + snap */ | 251 | struct ceph_vino i_vino; /* ceph ino + snap */ |
| 252 | 252 | ||
| 253 | spinlock_t i_ceph_lock; | ||
| 254 | |||
| 253 | u64 i_version; | 255 | u64 i_version; |
| 254 | u32 i_time_warp_seq; | 256 | u32 i_time_warp_seq; |
| 255 | 257 | ||
| @@ -271,7 +273,7 @@ struct ceph_inode_info { | |||
| 271 | 273 | ||
| 272 | struct ceph_inode_xattrs_info i_xattrs; | 274 | struct ceph_inode_xattrs_info i_xattrs; |
| 273 | 275 | ||
| 274 | /* capabilities. protected _both_ by i_lock and cap->session's | 276 | /* capabilities. protected _both_ by i_ceph_lock and cap->session's |
| 275 | * s_mutex. */ | 277 | * s_mutex. */ |
| 276 | struct rb_root i_caps; /* cap list */ | 278 | struct rb_root i_caps; /* cap list */ |
| 277 | struct ceph_cap *i_auth_cap; /* authoritative cap, if any */ | 279 | struct ceph_cap *i_auth_cap; /* authoritative cap, if any */ |
| @@ -437,18 +439,18 @@ static inline void ceph_i_clear(struct inode *inode, unsigned mask) | |||
| 437 | { | 439 | { |
| 438 | struct ceph_inode_info *ci = ceph_inode(inode); | 440 | struct ceph_inode_info *ci = ceph_inode(inode); |
| 439 | 441 | ||
| 440 | spin_lock(&inode->i_lock); | 442 | spin_lock(&ci->i_ceph_lock); |
| 441 | ci->i_ceph_flags &= ~mask; | 443 | ci->i_ceph_flags &= ~mask; |
| 442 | spin_unlock(&inode->i_lock); | 444 | spin_unlock(&ci->i_ceph_lock); |
| 443 | } | 445 | } |
| 444 | 446 | ||
| 445 | static inline void ceph_i_set(struct inode *inode, unsigned mask) | 447 | static inline void ceph_i_set(struct inode *inode, unsigned mask) |
| 446 | { | 448 | { |
| 447 | struct ceph_inode_info *ci = ceph_inode(inode); | 449 | struct ceph_inode_info *ci = ceph_inode(inode); |
| 448 | 450 | ||
| 449 | spin_lock(&inode->i_lock); | 451 | spin_lock(&ci->i_ceph_lock); |
| 450 | ci->i_ceph_flags |= mask; | 452 | ci->i_ceph_flags |= mask; |
| 451 | spin_unlock(&inode->i_lock); | 453 | spin_unlock(&ci->i_ceph_lock); |
| 452 | } | 454 | } |
| 453 | 455 | ||
| 454 | static inline bool ceph_i_test(struct inode *inode, unsigned mask) | 456 | static inline bool ceph_i_test(struct inode *inode, unsigned mask) |
| @@ -456,9 +458,9 @@ static inline bool ceph_i_test(struct inode *inode, unsigned mask) | |||
| 456 | struct ceph_inode_info *ci = ceph_inode(inode); | 458 | struct ceph_inode_info *ci = ceph_inode(inode); |
| 457 | bool r; | 459 | bool r; |
| 458 | 460 | ||
| 459 | spin_lock(&inode->i_lock); | 461 | spin_lock(&ci->i_ceph_lock); |
| 460 | r = (ci->i_ceph_flags & mask) == mask; | 462 | r = (ci->i_ceph_flags & mask) == mask; |
| 461 | spin_unlock(&inode->i_lock); | 463 | spin_unlock(&ci->i_ceph_lock); |
| 462 | return r; | 464 | return r; |
| 463 | } | 465 | } |
| 464 | 466 | ||
| @@ -508,9 +510,9 @@ extern int __ceph_caps_issued_other(struct ceph_inode_info *ci, | |||
| 508 | static inline int ceph_caps_issued(struct ceph_inode_info *ci) | 510 | static inline int ceph_caps_issued(struct ceph_inode_info *ci) |
| 509 | { | 511 | { |
| 510 | int issued; | 512 | int issued; |
| 511 | spin_lock(&ci->vfs_inode.i_lock); | 513 | spin_lock(&ci->i_ceph_lock); |
| 512 | issued = __ceph_caps_issued(ci, NULL); | 514 | issued = __ceph_caps_issued(ci, NULL); |
| 513 | spin_unlock(&ci->vfs_inode.i_lock); | 515 | spin_unlock(&ci->i_ceph_lock); |
| 514 | return issued; | 516 | return issued; |
| 515 | } | 517 | } |
| 516 | 518 | ||
| @@ -518,9 +520,9 @@ static inline int ceph_caps_issued_mask(struct ceph_inode_info *ci, int mask, | |||
| 518 | int touch) | 520 | int touch) |
| 519 | { | 521 | { |
| 520 | int r; | 522 | int r; |
| 521 | spin_lock(&ci->vfs_inode.i_lock); | 523 | spin_lock(&ci->i_ceph_lock); |
| 522 | r = __ceph_caps_issued_mask(ci, mask, touch); | 524 | r = __ceph_caps_issued_mask(ci, mask, touch); |
| 523 | spin_unlock(&ci->vfs_inode.i_lock); | 525 | spin_unlock(&ci->i_ceph_lock); |
| 524 | return r; | 526 | return r; |
| 525 | } | 527 | } |
| 526 | 528 | ||
| @@ -743,10 +745,9 @@ extern int ceph_add_cap(struct inode *inode, | |||
| 743 | extern void __ceph_remove_cap(struct ceph_cap *cap); | 745 | extern void __ceph_remove_cap(struct ceph_cap *cap); |
| 744 | static inline void ceph_remove_cap(struct ceph_cap *cap) | 746 | static inline void ceph_remove_cap(struct ceph_cap *cap) |
| 745 | { | 747 | { |
| 746 | struct inode *inode = &cap->ci->vfs_inode; | 748 | spin_lock(&cap->ci->i_ceph_lock); |
| 747 | spin_lock(&inode->i_lock); | ||
| 748 | __ceph_remove_cap(cap); | 749 | __ceph_remove_cap(cap); |
| 749 | spin_unlock(&inode->i_lock); | 750 | spin_unlock(&cap->ci->i_ceph_lock); |
| 750 | } | 751 | } |
| 751 | extern void ceph_put_cap(struct ceph_mds_client *mdsc, | 752 | extern void ceph_put_cap(struct ceph_mds_client *mdsc, |
| 752 | struct ceph_cap *cap); | 753 | struct ceph_cap *cap); |
diff --git a/fs/ceph/xattr.c b/fs/ceph/xattr.c index 96c6739a028..a5e36e4488a 100644 --- a/fs/ceph/xattr.c +++ b/fs/ceph/xattr.c | |||
| @@ -343,8 +343,8 @@ void __ceph_destroy_xattrs(struct ceph_inode_info *ci) | |||
| 343 | } | 343 | } |
| 344 | 344 | ||
| 345 | static int __build_xattrs(struct inode *inode) | 345 | static int __build_xattrs(struct inode *inode) |
| 346 | __releases(inode->i_lock) | 346 | __releases(ci->i_ceph_lock) |
| 347 | __acquires(inode->i_lock) | 347 | __acquires(ci->i_ceph_lock) |
| 348 | { | 348 | { |
| 349 | u32 namelen; | 349 | u32 namelen; |
| 350 | u32 numattr = 0; | 350 | u32 numattr = 0; |
| @@ -372,7 +372,7 @@ start: | |||
| 372 | end = p + ci->i_xattrs.blob->vec.iov_len; | 372 | end = p + ci->i_xattrs.blob->vec.iov_len; |
| 373 | ceph_decode_32_safe(&p, end, numattr, bad); | 373 | ceph_decode_32_safe(&p, end, numattr, bad); |
| 374 | xattr_version = ci->i_xattrs.version; | 374 | xattr_version = ci->i_xattrs.version; |
| 375 | spin_unlock(&inode->i_lock); | 375 | spin_unlock(&ci->i_ceph_lock); |
| 376 | 376 | ||
| 377 | xattrs = kcalloc(numattr, sizeof(struct ceph_xattr *), | 377 | xattrs = kcalloc(numattr, sizeof(struct ceph_xattr *), |
| 378 | GFP_NOFS); | 378 | GFP_NOFS); |
| @@ -387,7 +387,7 @@ start: | |||
| 387 | goto bad_lock; | 387 | goto bad_lock; |
| 388 | } | 388 | } |
| 389 | 389 | ||
| 390 | spin_lock(&inode->i_lock); | 390 | spin_lock(&ci->i_ceph_lock); |
| 391 | if (ci->i_xattrs.version != xattr_version) { | 391 | if (ci->i_xattrs.version != xattr_version) { |
| 392 | /* lost a race, retry */ | 392 | /* lost a race, retry */ |
| 393 | for (i = 0; i < numattr; i++) | 393 | for (i = 0; i < numattr; i++) |
| @@ -418,7 +418,7 @@ start: | |||
| 418 | 418 | ||
| 419 | return err; | 419 | return err; |
| 420 | bad_lock: | 420 | bad_lock: |
| 421 | spin_lock(&inode->i_lock); | 421 | spin_lock(&ci->i_ceph_lock); |
| 422 | bad: | 422 | bad: |
| 423 | if (xattrs) { | 423 | if (xattrs) { |
| 424 | for (i = 0; i < numattr; i++) | 424 | for (i = 0; i < numattr; i++) |
| @@ -512,7 +512,7 @@ ssize_t ceph_getxattr(struct dentry *dentry, const char *name, void *value, | |||
| 512 | if (vxattrs) | 512 | if (vxattrs) |
| 513 | vxattr = ceph_match_vxattr(vxattrs, name); | 513 | vxattr = ceph_match_vxattr(vxattrs, name); |
| 514 | 514 | ||
| 515 | spin_lock(&inode->i_lock); | 515 | spin_lock(&ci->i_ceph_lock); |
| 516 | dout("getxattr %p ver=%lld index_ver=%lld\n", inode, | 516 | dout("getxattr %p ver=%lld index_ver=%lld\n", inode, |
| 517 | ci->i_xattrs.version, ci->i_xattrs.index_version); | 517 | ci->i_xattrs.version, ci->i_xattrs.index_version); |
| 518 | 518 | ||
| @@ -520,14 +520,14 @@ ssize_t ceph_getxattr(struct dentry *dentry, const char *name, void *value, | |||
| 520 | (ci->i_xattrs.index_version >= ci->i_xattrs.version)) { | 520 | (ci->i_xattrs.index_version >= ci->i_xattrs.version)) { |
| 521 | goto get_xattr; | 521 | goto get_xattr; |
| 522 | } else { | 522 | } else { |
| 523 | spin_unlock(&inode->i_lock); | 523 | spin_unlock(&ci->i_ceph_lock); |
| 524 | /* get xattrs from mds (if we don't already have them) */ | 524 | /* get xattrs from mds (if we don't already have them) */ |
| 525 | err = ceph_do_getattr(inode, CEPH_STAT_CAP_XATTR); | 525 | err = ceph_do_getattr(inode, CEPH_STAT_CAP_XATTR); |
| 526 | if (err) | 526 | if (err) |
| 527 | return err; | 527 | return err; |
| 528 | } | 528 | } |
| 529 | 529 | ||
| 530 | spin_lock(&inode->i_lock); | 530 | spin_lock(&ci->i_ceph_lock); |
| 531 | 531 | ||
| 532 | if (vxattr && vxattr->readonly) { | 532 | if (vxattr && vxattr->readonly) { |
| 533 | err = vxattr->getxattr_cb(ci, value, size); | 533 | err = vxattr->getxattr_cb(ci, value, size); |
| @@ -558,7 +558,7 @@ get_xattr: | |||
| 558 | memcpy(value, xattr->val, xattr->val_len); | 558 | memcpy(value, xattr->val, xattr->val_len); |
| 559 | 559 | ||
| 560 | out: | 560 | out: |
| 561 | spin_unlock(&inode->i_lock); | 561 | spin_unlock(&ci->i_ceph_lock); |
| 562 | return err; | 562 | return err; |
| 563 | } | 563 | } |
| 564 | 564 | ||
| @@ -573,7 +573,7 @@ ssize_t ceph_listxattr(struct dentry *dentry, char *names, size_t size) | |||
| 573 | u32 len; | 573 | u32 len; |
| 574 | int i; | 574 | int i; |
| 575 | 575 | ||
| 576 | spin_lock(&inode->i_lock); | 576 | spin_lock(&ci->i_ceph_lock); |
| 577 | dout("listxattr %p ver=%lld index_ver=%lld\n", inode, | 577 | dout("listxattr %p ver=%lld index_ver=%lld\n", inode, |
| 578 | ci->i_xattrs.version, ci->i_xattrs.index_version); | 578 | ci->i_xattrs.version, ci->i_xattrs.index_version); |
| 579 | 579 | ||
| @@ -581,13 +581,13 @@ ssize_t ceph_listxattr(struct dentry *dentry, char *names, size_t size) | |||
| 581 | (ci->i_xattrs.index_version >= ci->i_xattrs.version)) { | 581 | (ci->i_xattrs.index_version >= ci->i_xattrs.version)) { |
| 582 | goto list_xattr; | 582 | goto list_xattr; |
| 583 | } else { | 583 | } else { |
| 584 | spin_unlock(&inode->i_lock); | 584 | spin_unlock(&ci->i_ceph_lock); |
| 585 | err = ceph_do_getattr(inode, CEPH_STAT_CAP_XATTR); | 585 | err = ceph_do_getattr(inode, CEPH_STAT_CAP_XATTR); |
| 586 | if (err) | 586 | if (err) |
| 587 | return err; | 587 | return err; |
| 588 | } | 588 | } |
| 589 | 589 | ||
| 590 | spin_lock(&inode->i_lock); | 590 | spin_lock(&ci->i_ceph_lock); |
| 591 | 591 | ||
| 592 | err = __build_xattrs(inode); | 592 | err = __build_xattrs(inode); |
| 593 | if (err < 0) | 593 | if (err < 0) |
| @@ -619,7 +619,7 @@ list_xattr: | |||
| 619 | } | 619 | } |
| 620 | 620 | ||
| 621 | out: | 621 | out: |
| 622 | spin_unlock(&inode->i_lock); | 622 | spin_unlock(&ci->i_ceph_lock); |
| 623 | return err; | 623 | return err; |
| 624 | } | 624 | } |
| 625 | 625 | ||
| @@ -739,7 +739,7 @@ int ceph_setxattr(struct dentry *dentry, const char *name, | |||
| 739 | if (!xattr) | 739 | if (!xattr) |
| 740 | goto out; | 740 | goto out; |
| 741 | 741 | ||
| 742 | spin_lock(&inode->i_lock); | 742 | spin_lock(&ci->i_ceph_lock); |
| 743 | retry: | 743 | retry: |
| 744 | issued = __ceph_caps_issued(ci, NULL); | 744 | issued = __ceph_caps_issued(ci, NULL); |
| 745 | if (!(issued & CEPH_CAP_XATTR_EXCL)) | 745 | if (!(issued & CEPH_CAP_XATTR_EXCL)) |
| @@ -752,12 +752,12 @@ retry: | |||
| 752 | required_blob_size > ci->i_xattrs.prealloc_blob->alloc_len) { | 752 | required_blob_size > ci->i_xattrs.prealloc_blob->alloc_len) { |
| 753 | struct ceph_buffer *blob = NULL; | 753 | struct ceph_buffer *blob = NULL; |
| 754 | 754 | ||
| 755 | spin_unlock(&inode->i_lock); | 755 | spin_unlock(&ci->i_ceph_lock); |
| 756 | dout(" preaallocating new blob size=%d\n", required_blob_size); | 756 | dout(" preaallocating new blob size=%d\n", required_blob_size); |
| 757 | blob = ceph_buffer_new(required_blob_size, GFP_NOFS); | 757 | blob = ceph_buffer_new(required_blob_size, GFP_NOFS); |
| 758 | if (!blob) | 758 | if (!blob) |
| 759 | goto out; | 759 | goto out; |
| 760 | spin_lock(&inode->i_lock); | 760 | spin_lock(&ci->i_ceph_lock); |
| 761 | if (ci->i_xattrs.prealloc_blob) | 761 | if (ci->i_xattrs.prealloc_blob) |
| 762 | ceph_buffer_put(ci->i_xattrs.prealloc_blob); | 762 | ceph_buffer_put(ci->i_xattrs.prealloc_blob); |
| 763 | ci->i_xattrs.prealloc_blob = blob; | 763 | ci->i_xattrs.prealloc_blob = blob; |
| @@ -770,13 +770,13 @@ retry: | |||
| 770 | dirty = __ceph_mark_dirty_caps(ci, CEPH_CAP_XATTR_EXCL); | 770 | dirty = __ceph_mark_dirty_caps(ci, CEPH_CAP_XATTR_EXCL); |
| 771 | ci->i_xattrs.dirty = true; | 771 | ci->i_xattrs.dirty = true; |
| 772 | inode->i_ctime = CURRENT_TIME; | 772 | inode->i_ctime = CURRENT_TIME; |
| 773 | spin_unlock(&inode->i_lock); | 773 | spin_unlock(&ci->i_ceph_lock); |
| 774 | if (dirty) | 774 | if (dirty) |
| 775 | __mark_inode_dirty(inode, dirty); | 775 | __mark_inode_dirty(inode, dirty); |
| 776 | return err; | 776 | return err; |
| 777 | 777 | ||
| 778 | do_sync: | 778 | do_sync: |
| 779 | spin_unlock(&inode->i_lock); | 779 | spin_unlock(&ci->i_ceph_lock); |
| 780 | err = ceph_sync_setxattr(dentry, name, value, size, flags); | 780 | err = ceph_sync_setxattr(dentry, name, value, size, flags); |
| 781 | out: | 781 | out: |
| 782 | kfree(newname); | 782 | kfree(newname); |
| @@ -833,7 +833,7 @@ int ceph_removexattr(struct dentry *dentry, const char *name) | |||
| 833 | return -EOPNOTSUPP; | 833 | return -EOPNOTSUPP; |
| 834 | } | 834 | } |
| 835 | 835 | ||
| 836 | spin_lock(&inode->i_lock); | 836 | spin_lock(&ci->i_ceph_lock); |
| 837 | __build_xattrs(inode); | 837 | __build_xattrs(inode); |
| 838 | issued = __ceph_caps_issued(ci, NULL); | 838 | issued = __ceph_caps_issued(ci, NULL); |
| 839 | dout("removexattr %p issued %s\n", inode, ceph_cap_string(issued)); | 839 | dout("removexattr %p issued %s\n", inode, ceph_cap_string(issued)); |
| @@ -846,12 +846,12 @@ int ceph_removexattr(struct dentry *dentry, const char *name) | |||
| 846 | ci->i_xattrs.dirty = true; | 846 | ci->i_xattrs.dirty = true; |
| 847 | inode->i_ctime = CURRENT_TIME; | 847 | inode->i_ctime = CURRENT_TIME; |
| 848 | 848 | ||
| 849 | spin_unlock(&inode->i_lock); | 849 | spin_unlock(&ci->i_ceph_lock); |
| 850 | if (dirty) | 850 | if (dirty) |
| 851 | __mark_inode_dirty(inode, dirty); | 851 | __mark_inode_dirty(inode, dirty); |
| 852 | return err; | 852 | return err; |
| 853 | do_sync: | 853 | do_sync: |
| 854 | spin_unlock(&inode->i_lock); | 854 | spin_unlock(&ci->i_ceph_lock); |
| 855 | err = ceph_send_removexattr(dentry, name); | 855 | err = ceph_send_removexattr(dentry, name); |
| 856 | return err; | 856 | return err; |
| 857 | } | 857 | } |
diff --git a/fs/configfs/inode.c b/fs/configfs/inode.c index ca418aaf635..9d8715c45f2 100644 --- a/fs/configfs/inode.c +++ b/fs/configfs/inode.c | |||
| @@ -292,7 +292,7 @@ int __init configfs_inode_init(void) | |||
| 292 | return bdi_init(&configfs_backing_dev_info); | 292 | return bdi_init(&configfs_backing_dev_info); |
| 293 | } | 293 | } |
| 294 | 294 | ||
| 295 | void __exit configfs_inode_exit(void) | 295 | void configfs_inode_exit(void) |
| 296 | { | 296 | { |
| 297 | bdi_destroy(&configfs_backing_dev_info); | 297 | bdi_destroy(&configfs_backing_dev_info); |
| 298 | } | 298 | } |
diff --git a/fs/configfs/mount.c b/fs/configfs/mount.c index ecc62178bed..276e15cafd5 100644 --- a/fs/configfs/mount.c +++ b/fs/configfs/mount.c | |||
| @@ -143,28 +143,26 @@ static int __init configfs_init(void) | |||
| 143 | goto out; | 143 | goto out; |
| 144 | 144 | ||
| 145 | config_kobj = kobject_create_and_add("config", kernel_kobj); | 145 | config_kobj = kobject_create_and_add("config", kernel_kobj); |
| 146 | if (!config_kobj) { | 146 | if (!config_kobj) |
| 147 | kmem_cache_destroy(configfs_dir_cachep); | 147 | goto out2; |
| 148 | configfs_dir_cachep = NULL; | 148 | |
| 149 | goto out; | 149 | err = configfs_inode_init(); |
| 150 | } | 150 | if (err) |
| 151 | goto out3; | ||
| 151 | 152 | ||
| 152 | err = register_filesystem(&configfs_fs_type); | 153 | err = register_filesystem(&configfs_fs_type); |
| 153 | if (err) { | 154 | if (err) |
| 154 | printk(KERN_ERR "configfs: Unable to register filesystem!\n"); | 155 | goto out4; |
| 155 | kobject_put(config_kobj); | ||
| 156 | kmem_cache_destroy(configfs_dir_cachep); | ||
| 157 | configfs_dir_cachep = NULL; | ||
| 158 | goto out; | ||
| 159 | } | ||
| 160 | 156 | ||
| 161 | err = configfs_inode_init(); | 157 | return 0; |
| 162 | if (err) { | 158 | out4: |
| 163 | unregister_filesystem(&configfs_fs_type); | 159 | printk(KERN_ERR "configfs: Unable to register filesystem!\n"); |
| 164 | kobject_put(config_kobj); | 160 | configfs_inode_exit(); |
| 165 | kmem_cache_destroy(configfs_dir_cachep); | 161 | out3: |
| 166 | configfs_dir_cachep = NULL; | 162 | kobject_put(config_kobj); |
| 167 | } | 163 | out2: |
| 164 | kmem_cache_destroy(configfs_dir_cachep); | ||
| 165 | configfs_dir_cachep = NULL; | ||
| 168 | out: | 166 | out: |
| 169 | return err; | 167 | return err; |
| 170 | } | 168 | } |
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 61fa9e1614a..607b1557d29 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c | |||
| @@ -1095,7 +1095,7 @@ static int ext4_ext_grow_indepth(handle_t *handle, struct inode *inode, | |||
| 1095 | le32_to_cpu(EXT_FIRST_INDEX(neh)->ei_block), | 1095 | le32_to_cpu(EXT_FIRST_INDEX(neh)->ei_block), |
| 1096 | ext4_idx_pblock(EXT_FIRST_INDEX(neh))); | 1096 | ext4_idx_pblock(EXT_FIRST_INDEX(neh))); |
| 1097 | 1097 | ||
| 1098 | neh->eh_depth = cpu_to_le16(neh->eh_depth + 1); | 1098 | neh->eh_depth = cpu_to_le16(le16_to_cpu(neh->eh_depth) + 1); |
| 1099 | ext4_mark_inode_dirty(handle, inode); | 1099 | ext4_mark_inode_dirty(handle, inode); |
| 1100 | out: | 1100 | out: |
| 1101 | brelse(bh); | 1101 | brelse(bh); |
| @@ -2955,7 +2955,6 @@ static int ext4_ext_convert_to_initialized(handle_t *handle, | |||
| 2955 | /* Pre-conditions */ | 2955 | /* Pre-conditions */ |
| 2956 | BUG_ON(!ext4_ext_is_uninitialized(ex)); | 2956 | BUG_ON(!ext4_ext_is_uninitialized(ex)); |
| 2957 | BUG_ON(!in_range(map->m_lblk, ee_block, ee_len)); | 2957 | BUG_ON(!in_range(map->m_lblk, ee_block, ee_len)); |
| 2958 | BUG_ON(map->m_lblk + map->m_len > ee_block + ee_len); | ||
| 2959 | 2958 | ||
| 2960 | /* | 2959 | /* |
| 2961 | * Attempt to transfer newly initialized blocks from the currently | 2960 | * Attempt to transfer newly initialized blocks from the currently |
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 848f436df29..92655fd8965 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
| @@ -1339,8 +1339,11 @@ static int mpage_da_submit_io(struct mpage_da_data *mpd, | |||
| 1339 | clear_buffer_unwritten(bh); | 1339 | clear_buffer_unwritten(bh); |
| 1340 | } | 1340 | } |
| 1341 | 1341 | ||
| 1342 | /* skip page if block allocation undone */ | 1342 | /* |
| 1343 | if (buffer_delay(bh) || buffer_unwritten(bh)) | 1343 | * skip page if block allocation undone and |
| 1344 | * block is dirty | ||
| 1345 | */ | ||
| 1346 | if (ext4_bh_delay_or_unwritten(NULL, bh)) | ||
| 1344 | skip_page = 1; | 1347 | skip_page = 1; |
| 1345 | bh = bh->b_this_page; | 1348 | bh = bh->b_this_page; |
| 1346 | block_start += bh->b_size; | 1349 | block_start += bh->b_size; |
| @@ -2387,7 +2390,6 @@ static int ext4_da_write_begin(struct file *file, struct address_space *mapping, | |||
| 2387 | pgoff_t index; | 2390 | pgoff_t index; |
| 2388 | struct inode *inode = mapping->host; | 2391 | struct inode *inode = mapping->host; |
| 2389 | handle_t *handle; | 2392 | handle_t *handle; |
| 2390 | loff_t page_len; | ||
| 2391 | 2393 | ||
| 2392 | index = pos >> PAGE_CACHE_SHIFT; | 2394 | index = pos >> PAGE_CACHE_SHIFT; |
| 2393 | 2395 | ||
| @@ -2434,13 +2436,6 @@ retry: | |||
| 2434 | */ | 2436 | */ |
| 2435 | if (pos + len > inode->i_size) | 2437 | if (pos + len > inode->i_size) |
| 2436 | ext4_truncate_failed_write(inode); | 2438 | ext4_truncate_failed_write(inode); |
| 2437 | } else { | ||
| 2438 | page_len = pos & (PAGE_CACHE_SIZE - 1); | ||
| 2439 | if (page_len > 0) { | ||
| 2440 | ret = ext4_discard_partial_page_buffers_no_lock(handle, | ||
| 2441 | inode, page, pos - page_len, page_len, | ||
| 2442 | EXT4_DISCARD_PARTIAL_PG_ZERO_UNMAPPED); | ||
| 2443 | } | ||
| 2444 | } | 2439 | } |
| 2445 | 2440 | ||
| 2446 | if (ret == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries)) | 2441 | if (ret == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries)) |
| @@ -2483,7 +2478,6 @@ static int ext4_da_write_end(struct file *file, | |||
| 2483 | loff_t new_i_size; | 2478 | loff_t new_i_size; |
| 2484 | unsigned long start, end; | 2479 | unsigned long start, end; |
| 2485 | int write_mode = (int)(unsigned long)fsdata; | 2480 | int write_mode = (int)(unsigned long)fsdata; |
| 2486 | loff_t page_len; | ||
| 2487 | 2481 | ||
| 2488 | if (write_mode == FALL_BACK_TO_NONDELALLOC) { | 2482 | if (write_mode == FALL_BACK_TO_NONDELALLOC) { |
| 2489 | if (ext4_should_order_data(inode)) { | 2483 | if (ext4_should_order_data(inode)) { |
| @@ -2508,7 +2502,7 @@ static int ext4_da_write_end(struct file *file, | |||
| 2508 | */ | 2502 | */ |
| 2509 | 2503 | ||
| 2510 | new_i_size = pos + copied; | 2504 | new_i_size = pos + copied; |
| 2511 | if (new_i_size > EXT4_I(inode)->i_disksize) { | 2505 | if (copied && new_i_size > EXT4_I(inode)->i_disksize) { |
| 2512 | if (ext4_da_should_update_i_disksize(page, end)) { | 2506 | if (ext4_da_should_update_i_disksize(page, end)) { |
| 2513 | down_write(&EXT4_I(inode)->i_data_sem); | 2507 | down_write(&EXT4_I(inode)->i_data_sem); |
| 2514 | if (new_i_size > EXT4_I(inode)->i_disksize) { | 2508 | if (new_i_size > EXT4_I(inode)->i_disksize) { |
| @@ -2532,16 +2526,6 @@ static int ext4_da_write_end(struct file *file, | |||
| 2532 | } | 2526 | } |
| 2533 | ret2 = generic_write_end(file, mapping, pos, len, copied, | 2527 | ret2 = generic_write_end(file, mapping, pos, len, copied, |
| 2534 | page, fsdata); | 2528 | page, fsdata); |
| 2535 | |||
| 2536 | page_len = PAGE_CACHE_SIZE - | ||
| 2537 | ((pos + copied - 1) & (PAGE_CACHE_SIZE - 1)); | ||
| 2538 | |||
| 2539 | if (page_len > 0) { | ||
| 2540 | ret = ext4_discard_partial_page_buffers_no_lock(handle, | ||
| 2541 | inode, page, pos + copied - 1, page_len, | ||
| 2542 | EXT4_DISCARD_PARTIAL_PG_ZERO_UNMAPPED); | ||
| 2543 | } | ||
| 2544 | |||
| 2545 | copied = ret2; | 2529 | copied = ret2; |
| 2546 | if (ret2 < 0) | 2530 | if (ret2 < 0) |
| 2547 | ret = ret2; | 2531 | ret = ret2; |
| @@ -2781,10 +2765,11 @@ static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset, | |||
| 2781 | iocb->private, io_end->inode->i_ino, iocb, offset, | 2765 | iocb->private, io_end->inode->i_ino, iocb, offset, |
| 2782 | size); | 2766 | size); |
| 2783 | 2767 | ||
| 2768 | iocb->private = NULL; | ||
| 2769 | |||
| 2784 | /* if not aio dio with unwritten extents, just free io and return */ | 2770 | /* if not aio dio with unwritten extents, just free io and return */ |
| 2785 | if (!(io_end->flag & EXT4_IO_END_UNWRITTEN)) { | 2771 | if (!(io_end->flag & EXT4_IO_END_UNWRITTEN)) { |
| 2786 | ext4_free_io_end(io_end); | 2772 | ext4_free_io_end(io_end); |
| 2787 | iocb->private = NULL; | ||
| 2788 | out: | 2773 | out: |
| 2789 | if (is_async) | 2774 | if (is_async) |
| 2790 | aio_complete(iocb, ret, 0); | 2775 | aio_complete(iocb, ret, 0); |
| @@ -2807,7 +2792,6 @@ out: | |||
| 2807 | spin_unlock_irqrestore(&ei->i_completed_io_lock, flags); | 2792 | spin_unlock_irqrestore(&ei->i_completed_io_lock, flags); |
| 2808 | 2793 | ||
| 2809 | /* queue the work to convert unwritten extents to written */ | 2794 | /* queue the work to convert unwritten extents to written */ |
| 2810 | iocb->private = NULL; | ||
| 2811 | queue_work(wq, &io_end->work); | 2795 | queue_work(wq, &io_end->work); |
| 2812 | 2796 | ||
| 2813 | /* XXX: probably should move into the real I/O completion handler */ | 2797 | /* XXX: probably should move into the real I/O completion handler */ |
| @@ -3203,26 +3187,8 @@ int ext4_discard_partial_page_buffers_no_lock(handle_t *handle, | |||
| 3203 | 3187 | ||
| 3204 | iblock = index << (PAGE_CACHE_SHIFT - inode->i_sb->s_blocksize_bits); | 3188 | iblock = index << (PAGE_CACHE_SHIFT - inode->i_sb->s_blocksize_bits); |
| 3205 | 3189 | ||
| 3206 | if (!page_has_buffers(page)) { | 3190 | if (!page_has_buffers(page)) |
| 3207 | /* | 3191 | create_empty_buffers(page, blocksize, 0); |
| 3208 | * If the range to be discarded covers a partial block | ||
| 3209 | * we need to get the page buffers. This is because | ||
| 3210 | * partial blocks cannot be released and the page needs | ||
| 3211 | * to be updated with the contents of the block before | ||
| 3212 | * we write the zeros on top of it. | ||
| 3213 | */ | ||
| 3214 | if ((from & (blocksize - 1)) || | ||
| 3215 | ((from + length) & (blocksize - 1))) { | ||
| 3216 | create_empty_buffers(page, blocksize, 0); | ||
| 3217 | } else { | ||
| 3218 | /* | ||
| 3219 | * If there are no partial blocks, | ||
| 3220 | * there is nothing to update, | ||
| 3221 | * so we can return now | ||
| 3222 | */ | ||
| 3223 | return 0; | ||
| 3224 | } | ||
| 3225 | } | ||
| 3226 | 3192 | ||
| 3227 | /* Find the buffer that contains "offset" */ | 3193 | /* Find the buffer that contains "offset" */ |
| 3228 | bh = page_buffers(page); | 3194 | bh = page_buffers(page); |
diff --git a/fs/ext4/page-io.c b/fs/ext4/page-io.c index 7ce1d0b19c9..7e106c810c6 100644 --- a/fs/ext4/page-io.c +++ b/fs/ext4/page-io.c | |||
| @@ -385,6 +385,18 @@ int ext4_bio_write_page(struct ext4_io_submit *io, | |||
| 385 | 385 | ||
| 386 | block_end = block_start + blocksize; | 386 | block_end = block_start + blocksize; |
| 387 | if (block_start >= len) { | 387 | if (block_start >= len) { |
| 388 | /* | ||
| 389 | * Comments copied from block_write_full_page_endio: | ||
| 390 | * | ||
| 391 | * The page straddles i_size. It must be zeroed out on | ||
| 392 | * each and every writepage invocation because it may | ||
| 393 | * be mmapped. "A file is mapped in multiples of the | ||
| 394 | * page size. For a file that is not a multiple of | ||
| 395 | * the page size, the remaining memory is zeroed when | ||
| 396 | * mapped, and writes to that region are not written | ||
| 397 | * out to the file." | ||
| 398 | */ | ||
| 399 | zero_user_segment(page, block_start, block_end); | ||
| 388 | clear_buffer_dirty(bh); | 400 | clear_buffer_dirty(bh); |
| 389 | set_buffer_uptodate(bh); | 401 | set_buffer_uptodate(bh); |
| 390 | continue; | 402 | continue; |
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 3858767ec67..3e1329e2f82 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
| @@ -1155,9 +1155,9 @@ static int ext4_show_options(struct seq_file *seq, struct vfsmount *vfs) | |||
| 1155 | seq_puts(seq, ",block_validity"); | 1155 | seq_puts(seq, ",block_validity"); |
| 1156 | 1156 | ||
| 1157 | if (!test_opt(sb, INIT_INODE_TABLE)) | 1157 | if (!test_opt(sb, INIT_INODE_TABLE)) |
| 1158 | seq_puts(seq, ",noinit_inode_table"); | 1158 | seq_puts(seq, ",noinit_itable"); |
| 1159 | else if (sbi->s_li_wait_mult != EXT4_DEF_LI_WAIT_MULT) | 1159 | else if (sbi->s_li_wait_mult != EXT4_DEF_LI_WAIT_MULT) |
| 1160 | seq_printf(seq, ",init_inode_table=%u", | 1160 | seq_printf(seq, ",init_itable=%u", |
| 1161 | (unsigned) sbi->s_li_wait_mult); | 1161 | (unsigned) sbi->s_li_wait_mult); |
| 1162 | 1162 | ||
| 1163 | ext4_show_quota_options(seq, sb); | 1163 | ext4_show_quota_options(seq, sb); |
| @@ -1333,8 +1333,7 @@ enum { | |||
| 1333 | Opt_nomblk_io_submit, Opt_block_validity, Opt_noblock_validity, | 1333 | Opt_nomblk_io_submit, Opt_block_validity, Opt_noblock_validity, |
| 1334 | Opt_inode_readahead_blks, Opt_journal_ioprio, | 1334 | Opt_inode_readahead_blks, Opt_journal_ioprio, |
| 1335 | Opt_dioread_nolock, Opt_dioread_lock, | 1335 | Opt_dioread_nolock, Opt_dioread_lock, |
| 1336 | Opt_discard, Opt_nodiscard, | 1336 | Opt_discard, Opt_nodiscard, Opt_init_itable, Opt_noinit_itable, |
| 1337 | Opt_init_inode_table, Opt_noinit_inode_table, | ||
| 1338 | }; | 1337 | }; |
| 1339 | 1338 | ||
| 1340 | static const match_table_t tokens = { | 1339 | static const match_table_t tokens = { |
| @@ -1407,9 +1406,9 @@ static const match_table_t tokens = { | |||
| 1407 | {Opt_dioread_lock, "dioread_lock"}, | 1406 | {Opt_dioread_lock, "dioread_lock"}, |
| 1408 | {Opt_discard, "discard"}, | 1407 | {Opt_discard, "discard"}, |
| 1409 | {Opt_nodiscard, "nodiscard"}, | 1408 | {Opt_nodiscard, "nodiscard"}, |
| 1410 | {Opt_init_inode_table, "init_itable=%u"}, | 1409 | {Opt_init_itable, "init_itable=%u"}, |
| 1411 | {Opt_init_inode_table, "init_itable"}, | 1410 | {Opt_init_itable, "init_itable"}, |
| 1412 | {Opt_noinit_inode_table, "noinit_itable"}, | 1411 | {Opt_noinit_itable, "noinit_itable"}, |
| 1413 | {Opt_err, NULL}, | 1412 | {Opt_err, NULL}, |
| 1414 | }; | 1413 | }; |
| 1415 | 1414 | ||
| @@ -1892,7 +1891,7 @@ set_qf_format: | |||
| 1892 | case Opt_dioread_lock: | 1891 | case Opt_dioread_lock: |
| 1893 | clear_opt(sb, DIOREAD_NOLOCK); | 1892 | clear_opt(sb, DIOREAD_NOLOCK); |
| 1894 | break; | 1893 | break; |
| 1895 | case Opt_init_inode_table: | 1894 | case Opt_init_itable: |
| 1896 | set_opt(sb, INIT_INODE_TABLE); | 1895 | set_opt(sb, INIT_INODE_TABLE); |
| 1897 | if (args[0].from) { | 1896 | if (args[0].from) { |
| 1898 | if (match_int(&args[0], &option)) | 1897 | if (match_int(&args[0], &option)) |
| @@ -1903,7 +1902,7 @@ set_qf_format: | |||
| 1903 | return 0; | 1902 | return 0; |
| 1904 | sbi->s_li_wait_mult = option; | 1903 | sbi->s_li_wait_mult = option; |
| 1905 | break; | 1904 | break; |
| 1906 | case Opt_noinit_inode_table: | 1905 | case Opt_noinit_itable: |
| 1907 | clear_opt(sb, INIT_INODE_TABLE); | 1906 | clear_opt(sb, INIT_INODE_TABLE); |
| 1908 | break; | 1907 | break; |
| 1909 | default: | 1908 | default: |
diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index 73c3992b2bb..517f211a3bd 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c | |||
| @@ -47,17 +47,6 @@ struct wb_writeback_work { | |||
| 47 | struct completion *done; /* set if the caller waits */ | 47 | struct completion *done; /* set if the caller waits */ |
| 48 | }; | 48 | }; |
| 49 | 49 | ||
| 50 | const char *wb_reason_name[] = { | ||
| 51 | [WB_REASON_BACKGROUND] = "background", | ||
| 52 | [WB_REASON_TRY_TO_FREE_PAGES] = "try_to_free_pages", | ||
| 53 | [WB_REASON_SYNC] = "sync", | ||
| 54 | [WB_REASON_PERIODIC] = "periodic", | ||
| 55 | [WB_REASON_LAPTOP_TIMER] = "laptop_timer", | ||
| 56 | [WB_REASON_FREE_MORE_MEM] = "free_more_memory", | ||
| 57 | [WB_REASON_FS_FREE_SPACE] = "fs_free_space", | ||
| 58 | [WB_REASON_FORKER_THREAD] = "forker_thread" | ||
| 59 | }; | ||
| 60 | |||
| 61 | /* | 50 | /* |
| 62 | * Include the creation of the trace points after defining the | 51 | * Include the creation of the trace points after defining the |
| 63 | * wb_writeback_work structure so that the definition remains local to this | 52 | * wb_writeback_work structure so that the definition remains local to this |
| @@ -156,6 +145,7 @@ __bdi_start_writeback(struct backing_dev_info *bdi, long nr_pages, | |||
| 156 | * bdi_start_writeback - start writeback | 145 | * bdi_start_writeback - start writeback |
| 157 | * @bdi: the backing device to write from | 146 | * @bdi: the backing device to write from |
| 158 | * @nr_pages: the number of pages to write | 147 | * @nr_pages: the number of pages to write |
| 148 | * @reason: reason why some writeback work was initiated | ||
| 159 | * | 149 | * |
| 160 | * Description: | 150 | * Description: |
| 161 | * This does WB_SYNC_NONE opportunistic writeback. The IO is only | 151 | * This does WB_SYNC_NONE opportunistic writeback. The IO is only |
| @@ -1223,6 +1213,7 @@ static void wait_sb_inodes(struct super_block *sb) | |||
| 1223 | * writeback_inodes_sb_nr - writeback dirty inodes from given super_block | 1213 | * writeback_inodes_sb_nr - writeback dirty inodes from given super_block |
| 1224 | * @sb: the superblock | 1214 | * @sb: the superblock |
| 1225 | * @nr: the number of pages to write | 1215 | * @nr: the number of pages to write |
| 1216 | * @reason: reason why some writeback work initiated | ||
| 1226 | * | 1217 | * |
| 1227 | * Start writeback on some inodes on this super_block. No guarantees are made | 1218 | * Start writeback on some inodes on this super_block. No guarantees are made |
| 1228 | * on how many (if any) will be written, and this function does not wait | 1219 | * on how many (if any) will be written, and this function does not wait |
| @@ -1251,6 +1242,7 @@ EXPORT_SYMBOL(writeback_inodes_sb_nr); | |||
| 1251 | /** | 1242 | /** |
| 1252 | * writeback_inodes_sb - writeback dirty inodes from given super_block | 1243 | * writeback_inodes_sb - writeback dirty inodes from given super_block |
| 1253 | * @sb: the superblock | 1244 | * @sb: the superblock |
| 1245 | * @reason: reason why some writeback work was initiated | ||
| 1254 | * | 1246 | * |
| 1255 | * Start writeback on some inodes on this super_block. No guarantees are made | 1247 | * Start writeback on some inodes on this super_block. No guarantees are made |
| 1256 | * on how many (if any) will be written, and this function does not wait | 1248 | * on how many (if any) will be written, and this function does not wait |
| @@ -1265,6 +1257,7 @@ EXPORT_SYMBOL(writeback_inodes_sb); | |||
| 1265 | /** | 1257 | /** |
| 1266 | * writeback_inodes_sb_if_idle - start writeback if none underway | 1258 | * writeback_inodes_sb_if_idle - start writeback if none underway |
| 1267 | * @sb: the superblock | 1259 | * @sb: the superblock |
| 1260 | * @reason: reason why some writeback work was initiated | ||
| 1268 | * | 1261 | * |
| 1269 | * Invoke writeback_inodes_sb if no writeback is currently underway. | 1262 | * Invoke writeback_inodes_sb if no writeback is currently underway. |
| 1270 | * Returns 1 if writeback was started, 0 if not. | 1263 | * Returns 1 if writeback was started, 0 if not. |
| @@ -1285,6 +1278,7 @@ EXPORT_SYMBOL(writeback_inodes_sb_if_idle); | |||
| 1285 | * writeback_inodes_sb_if_idle - start writeback if none underway | 1278 | * writeback_inodes_sb_if_idle - start writeback if none underway |
| 1286 | * @sb: the superblock | 1279 | * @sb: the superblock |
| 1287 | * @nr: the number of pages to write | 1280 | * @nr: the number of pages to write |
| 1281 | * @reason: reason why some writeback work was initiated | ||
| 1288 | * | 1282 | * |
| 1289 | * Invoke writeback_inodes_sb if no writeback is currently underway. | 1283 | * Invoke writeback_inodes_sb if no writeback is currently underway. |
| 1290 | * Returns 1 if writeback was started, 0 if not. | 1284 | * Returns 1 if writeback was started, 0 if not. |
diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c index 5cb8614508c..2aaf3eaaf13 100644 --- a/fs/fuse/dev.c +++ b/fs/fuse/dev.c | |||
| @@ -1512,7 +1512,7 @@ static int fuse_retrieve(struct fuse_conn *fc, struct inode *inode, | |||
| 1512 | else if (outarg->offset + num > file_size) | 1512 | else if (outarg->offset + num > file_size) |
| 1513 | num = file_size - outarg->offset; | 1513 | num = file_size - outarg->offset; |
| 1514 | 1514 | ||
| 1515 | while (num) { | 1515 | while (num && req->num_pages < FUSE_MAX_PAGES_PER_REQ) { |
| 1516 | struct page *page; | 1516 | struct page *page; |
| 1517 | unsigned int this_num; | 1517 | unsigned int this_num; |
| 1518 | 1518 | ||
| @@ -1526,6 +1526,7 @@ static int fuse_retrieve(struct fuse_conn *fc, struct inode *inode, | |||
| 1526 | 1526 | ||
| 1527 | num -= this_num; | 1527 | num -= this_num; |
| 1528 | total_len += this_num; | 1528 | total_len += this_num; |
| 1529 | index++; | ||
| 1529 | } | 1530 | } |
| 1530 | req->misc.retrieve_in.offset = outarg->offset; | 1531 | req->misc.retrieve_in.offset = outarg->offset; |
| 1531 | req->misc.retrieve_in.size = total_len; | 1532 | req->misc.retrieve_in.size = total_len; |
diff --git a/fs/fuse/file.c b/fs/fuse/file.c index 594f07a81c2..0c84100acd4 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c | |||
| @@ -1556,7 +1556,7 @@ static loff_t fuse_file_llseek(struct file *file, loff_t offset, int origin) | |||
| 1556 | struct inode *inode = file->f_path.dentry->d_inode; | 1556 | struct inode *inode = file->f_path.dentry->d_inode; |
| 1557 | 1557 | ||
| 1558 | mutex_lock(&inode->i_mutex); | 1558 | mutex_lock(&inode->i_mutex); |
| 1559 | if (origin != SEEK_CUR || origin != SEEK_SET) { | 1559 | if (origin != SEEK_CUR && origin != SEEK_SET) { |
| 1560 | retval = fuse_update_attributes(inode, NULL, file, NULL); | 1560 | retval = fuse_update_attributes(inode, NULL, file, NULL); |
| 1561 | if (retval) | 1561 | if (retval) |
| 1562 | goto exit; | 1562 | goto exit; |
| @@ -1567,6 +1567,10 @@ static loff_t fuse_file_llseek(struct file *file, loff_t offset, int origin) | |||
| 1567 | offset += i_size_read(inode); | 1567 | offset += i_size_read(inode); |
| 1568 | break; | 1568 | break; |
| 1569 | case SEEK_CUR: | 1569 | case SEEK_CUR: |
| 1570 | if (offset == 0) { | ||
| 1571 | retval = file->f_pos; | ||
| 1572 | goto exit; | ||
| 1573 | } | ||
| 1570 | offset += file->f_pos; | 1574 | offset += file->f_pos; |
| 1571 | break; | 1575 | break; |
| 1572 | case SEEK_DATA: | 1576 | case SEEK_DATA: |
diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c index 3e6d7275647..aa83109b943 100644 --- a/fs/fuse/inode.c +++ b/fs/fuse/inode.c | |||
| @@ -1138,28 +1138,28 @@ static int __init fuse_fs_init(void) | |||
| 1138 | { | 1138 | { |
| 1139 | int err; | 1139 | int err; |
| 1140 | 1140 | ||
| 1141 | err = register_filesystem(&fuse_fs_type); | ||
| 1142 | if (err) | ||
| 1143 | goto out; | ||
| 1144 | |||
| 1145 | err = register_fuseblk(); | ||
| 1146 | if (err) | ||
| 1147 | goto out_unreg; | ||
| 1148 | |||
| 1149 | fuse_inode_cachep = kmem_cache_create("fuse_inode", | 1141 | fuse_inode_cachep = kmem_cache_create("fuse_inode", |
| 1150 | sizeof(struct fuse_inode), | 1142 | sizeof(struct fuse_inode), |
| 1151 | 0, SLAB_HWCACHE_ALIGN, | 1143 | 0, SLAB_HWCACHE_ALIGN, |
| 1152 | fuse_inode_init_once); | 1144 | fuse_inode_init_once); |
| 1153 | err = -ENOMEM; | 1145 | err = -ENOMEM; |
| 1154 | if (!fuse_inode_cachep) | 1146 | if (!fuse_inode_cachep) |
| 1155 | goto out_unreg2; | 1147 | goto out; |
| 1148 | |||
| 1149 | err = register_fuseblk(); | ||
| 1150 | if (err) | ||
| 1151 | goto out2; | ||
| 1152 | |||
| 1153 | err = register_filesystem(&fuse_fs_type); | ||
| 1154 | if (err) | ||
| 1155 | goto out3; | ||
| 1156 | 1156 | ||
| 1157 | return 0; | 1157 | return 0; |
| 1158 | 1158 | ||
| 1159 | out_unreg2: | 1159 | out3: |
| 1160 | unregister_fuseblk(); | 1160 | unregister_fuseblk(); |
| 1161 | out_unreg: | 1161 | out2: |
| 1162 | unregister_filesystem(&fuse_fs_type); | 1162 | kmem_cache_destroy(fuse_inode_cachep); |
| 1163 | out: | 1163 | out: |
| 1164 | return err; | 1164 | return err; |
| 1165 | } | 1165 | } |
diff --git a/fs/ncpfs/inode.c b/fs/ncpfs/inode.c index 5b5fa33b6b9..cbd1a61c110 100644 --- a/fs/ncpfs/inode.c +++ b/fs/ncpfs/inode.c | |||
| @@ -548,7 +548,7 @@ static int ncp_fill_super(struct super_block *sb, void *raw_data, int silent) | |||
| 548 | 548 | ||
| 549 | error = bdi_setup_and_register(&server->bdi, "ncpfs", BDI_CAP_MAP_COPY); | 549 | error = bdi_setup_and_register(&server->bdi, "ncpfs", BDI_CAP_MAP_COPY); |
| 550 | if (error) | 550 | if (error) |
| 551 | goto out_bdi; | 551 | goto out_fput; |
| 552 | 552 | ||
| 553 | server->ncp_filp = ncp_filp; | 553 | server->ncp_filp = ncp_filp; |
| 554 | server->ncp_sock = sock; | 554 | server->ncp_sock = sock; |
| @@ -559,7 +559,7 @@ static int ncp_fill_super(struct super_block *sb, void *raw_data, int silent) | |||
| 559 | error = -EBADF; | 559 | error = -EBADF; |
| 560 | server->info_filp = fget(data.info_fd); | 560 | server->info_filp = fget(data.info_fd); |
| 561 | if (!server->info_filp) | 561 | if (!server->info_filp) |
| 562 | goto out_fput; | 562 | goto out_bdi; |
| 563 | error = -ENOTSOCK; | 563 | error = -ENOTSOCK; |
| 564 | sock_inode = server->info_filp->f_path.dentry->d_inode; | 564 | sock_inode = server->info_filp->f_path.dentry->d_inode; |
| 565 | if (!S_ISSOCK(sock_inode->i_mode)) | 565 | if (!S_ISSOCK(sock_inode->i_mode)) |
| @@ -746,9 +746,9 @@ out_nls: | |||
| 746 | out_fput2: | 746 | out_fput2: |
| 747 | if (server->info_filp) | 747 | if (server->info_filp) |
| 748 | fput(server->info_filp); | 748 | fput(server->info_filp); |
| 749 | out_fput: | ||
| 750 | bdi_destroy(&server->bdi); | ||
| 751 | out_bdi: | 749 | out_bdi: |
| 750 | bdi_destroy(&server->bdi); | ||
| 751 | out_fput: | ||
| 752 | /* 23/12/1998 Marcin Dalecki <dalecki@cs.net.pl>: | 752 | /* 23/12/1998 Marcin Dalecki <dalecki@cs.net.pl>: |
| 753 | * | 753 | * |
| 754 | * The previously used put_filp(ncp_filp); was bogus, since | 754 | * The previously used put_filp(ncp_filp); was bogus, since |
diff --git a/fs/nfs/file.c b/fs/nfs/file.c index eca56d4b39c..606ef0f20ae 100644 --- a/fs/nfs/file.c +++ b/fs/nfs/file.c | |||
| @@ -147,7 +147,7 @@ static loff_t nfs_file_llseek(struct file *filp, loff_t offset, int origin) | |||
| 147 | * origin == SEEK_END || SEEK_DATA || SEEK_HOLE => we must revalidate | 147 | * origin == SEEK_END || SEEK_DATA || SEEK_HOLE => we must revalidate |
| 148 | * the cached file length | 148 | * the cached file length |
| 149 | */ | 149 | */ |
| 150 | if (origin != SEEK_SET || origin != SEEK_CUR) { | 150 | if (origin != SEEK_SET && origin != SEEK_CUR) { |
| 151 | struct inode *inode = filp->f_mapping->host; | 151 | struct inode *inode = filp->f_mapping->host; |
| 152 | 152 | ||
| 153 | int retval = nfs_revalidate_file_size(inode, filp); | 153 | int retval = nfs_revalidate_file_size(inode, filp); |
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index be2bbac1381..d9f4d78c341 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
| @@ -39,6 +39,8 @@ | |||
| 39 | #include <linux/delay.h> | 39 | #include <linux/delay.h> |
| 40 | #include <linux/errno.h> | 40 | #include <linux/errno.h> |
| 41 | #include <linux/string.h> | 41 | #include <linux/string.h> |
| 42 | #include <linux/ratelimit.h> | ||
| 43 | #include <linux/printk.h> | ||
| 42 | #include <linux/slab.h> | 44 | #include <linux/slab.h> |
| 43 | #include <linux/sunrpc/clnt.h> | 45 | #include <linux/sunrpc/clnt.h> |
| 44 | #include <linux/sunrpc/gss_api.h> | 46 | #include <linux/sunrpc/gss_api.h> |
| @@ -894,6 +896,8 @@ out: | |||
| 894 | 896 | ||
| 895 | static int can_open_delegated(struct nfs_delegation *delegation, fmode_t fmode) | 897 | static int can_open_delegated(struct nfs_delegation *delegation, fmode_t fmode) |
| 896 | { | 898 | { |
| 899 | if (delegation == NULL) | ||
| 900 | return 0; | ||
| 897 | if ((delegation->type & fmode) != fmode) | 901 | if ((delegation->type & fmode) != fmode) |
| 898 | return 0; | 902 | return 0; |
| 899 | if (test_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags)) | 903 | if (test_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags)) |
| @@ -1036,8 +1040,7 @@ static struct nfs4_state *nfs4_try_open_cached(struct nfs4_opendata *opendata) | |||
| 1036 | } | 1040 | } |
| 1037 | rcu_read_lock(); | 1041 | rcu_read_lock(); |
| 1038 | delegation = rcu_dereference(nfsi->delegation); | 1042 | delegation = rcu_dereference(nfsi->delegation); |
| 1039 | if (delegation == NULL || | 1043 | if (!can_open_delegated(delegation, fmode)) { |
| 1040 | !can_open_delegated(delegation, fmode)) { | ||
| 1041 | rcu_read_unlock(); | 1044 | rcu_read_unlock(); |
| 1042 | break; | 1045 | break; |
| 1043 | } | 1046 | } |
| @@ -1091,7 +1094,12 @@ static struct nfs4_state *nfs4_opendata_to_nfs4_state(struct nfs4_opendata *data | |||
| 1091 | if (delegation) | 1094 | if (delegation) |
| 1092 | delegation_flags = delegation->flags; | 1095 | delegation_flags = delegation->flags; |
| 1093 | rcu_read_unlock(); | 1096 | rcu_read_unlock(); |
| 1094 | if ((delegation_flags & 1UL<<NFS_DELEGATION_NEED_RECLAIM) == 0) | 1097 | if (data->o_arg.claim == NFS4_OPEN_CLAIM_DELEGATE_CUR) { |
| 1098 | pr_err_ratelimited("NFS: Broken NFSv4 server %s is " | ||
| 1099 | "returning a delegation for " | ||
| 1100 | "OPEN(CLAIM_DELEGATE_CUR)\n", | ||
| 1101 | NFS_CLIENT(inode)->cl_server); | ||
| 1102 | } else if ((delegation_flags & 1UL<<NFS_DELEGATION_NEED_RECLAIM) == 0) | ||
| 1095 | nfs_inode_set_delegation(state->inode, | 1103 | nfs_inode_set_delegation(state->inode, |
| 1096 | data->owner->so_cred, | 1104 | data->owner->so_cred, |
| 1097 | &data->o_res); | 1105 | &data->o_res); |
| @@ -1423,11 +1431,9 @@ static void nfs4_open_prepare(struct rpc_task *task, void *calldata) | |||
| 1423 | goto out_no_action; | 1431 | goto out_no_action; |
| 1424 | rcu_read_lock(); | 1432 | rcu_read_lock(); |
| 1425 | delegation = rcu_dereference(NFS_I(data->state->inode)->delegation); | 1433 | delegation = rcu_dereference(NFS_I(data->state->inode)->delegation); |
| 1426 | if (delegation != NULL && | 1434 | if (data->o_arg.claim != NFS4_OPEN_CLAIM_DELEGATE_CUR && |
| 1427 | test_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags) == 0) { | 1435 | can_open_delegated(delegation, data->o_arg.fmode)) |
| 1428 | rcu_read_unlock(); | 1436 | goto unlock_no_action; |
| 1429 | goto out_no_action; | ||
| 1430 | } | ||
| 1431 | rcu_read_unlock(); | 1437 | rcu_read_unlock(); |
| 1432 | } | 1438 | } |
| 1433 | /* Update sequence id. */ | 1439 | /* Update sequence id. */ |
| @@ -1444,6 +1450,8 @@ static void nfs4_open_prepare(struct rpc_task *task, void *calldata) | |||
| 1444 | return; | 1450 | return; |
| 1445 | rpc_call_start(task); | 1451 | rpc_call_start(task); |
| 1446 | return; | 1452 | return; |
| 1453 | unlock_no_action: | ||
| 1454 | rcu_read_unlock(); | ||
| 1447 | out_no_action: | 1455 | out_no_action: |
| 1448 | task->tk_action = NULL; | 1456 | task->tk_action = NULL; |
| 1449 | 1457 | ||
diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c index 39914be40b0..6a7107ae6b7 100644 --- a/fs/nfs/nfs4state.c +++ b/fs/nfs/nfs4state.c | |||
| @@ -1156,11 +1156,13 @@ restart: | |||
| 1156 | if (status >= 0) { | 1156 | if (status >= 0) { |
| 1157 | status = nfs4_reclaim_locks(state, ops); | 1157 | status = nfs4_reclaim_locks(state, ops); |
| 1158 | if (status >= 0) { | 1158 | if (status >= 0) { |
| 1159 | spin_lock(&state->state_lock); | ||
| 1159 | list_for_each_entry(lock, &state->lock_states, ls_locks) { | 1160 | list_for_each_entry(lock, &state->lock_states, ls_locks) { |
| 1160 | if (!(lock->ls_flags & NFS_LOCK_INITIALIZED)) | 1161 | if (!(lock->ls_flags & NFS_LOCK_INITIALIZED)) |
| 1161 | printk("%s: Lock reclaim failed!\n", | 1162 | printk("%s: Lock reclaim failed!\n", |
| 1162 | __func__); | 1163 | __func__); |
| 1163 | } | 1164 | } |
| 1165 | spin_unlock(&state->state_lock); | ||
| 1164 | nfs4_put_open_state(state); | 1166 | nfs4_put_open_state(state); |
| 1165 | goto restart; | 1167 | goto restart; |
| 1166 | } | 1168 | } |
| @@ -1224,10 +1226,12 @@ static void nfs4_clear_open_state(struct nfs4_state *state) | |||
| 1224 | clear_bit(NFS_O_RDONLY_STATE, &state->flags); | 1226 | clear_bit(NFS_O_RDONLY_STATE, &state->flags); |
| 1225 | clear_bit(NFS_O_WRONLY_STATE, &state->flags); | 1227 | clear_bit(NFS_O_WRONLY_STATE, &state->flags); |
| 1226 | clear_bit(NFS_O_RDWR_STATE, &state->flags); | 1228 | clear_bit(NFS_O_RDWR_STATE, &state->flags); |
| 1229 | spin_lock(&state->state_lock); | ||
| 1227 | list_for_each_entry(lock, &state->lock_states, ls_locks) { | 1230 | list_for_each_entry(lock, &state->lock_states, ls_locks) { |
| 1228 | lock->ls_seqid.flags = 0; | 1231 | lock->ls_seqid.flags = 0; |
| 1229 | lock->ls_flags &= ~NFS_LOCK_INITIALIZED; | 1232 | lock->ls_flags &= ~NFS_LOCK_INITIALIZED; |
| 1230 | } | 1233 | } |
| 1234 | spin_unlock(&state->state_lock); | ||
| 1231 | } | 1235 | } |
| 1232 | 1236 | ||
| 1233 | static void nfs4_reset_seqids(struct nfs_server *server, | 1237 | static void nfs4_reset_seqids(struct nfs_server *server, |
| @@ -1350,12 +1354,14 @@ static void nfs4_warn_keyexpired(const char *s) | |||
| 1350 | static int nfs4_recovery_handle_error(struct nfs_client *clp, int error) | 1354 | static int nfs4_recovery_handle_error(struct nfs_client *clp, int error) |
| 1351 | { | 1355 | { |
| 1352 | switch (error) { | 1356 | switch (error) { |
| 1357 | case 0: | ||
| 1358 | break; | ||
| 1353 | case -NFS4ERR_CB_PATH_DOWN: | 1359 | case -NFS4ERR_CB_PATH_DOWN: |
| 1354 | nfs_handle_cb_pathdown(clp); | 1360 | nfs_handle_cb_pathdown(clp); |
| 1355 | return 0; | 1361 | break; |
| 1356 | case -NFS4ERR_NO_GRACE: | 1362 | case -NFS4ERR_NO_GRACE: |
| 1357 | nfs4_state_end_reclaim_reboot(clp); | 1363 | nfs4_state_end_reclaim_reboot(clp); |
| 1358 | return 0; | 1364 | break; |
| 1359 | case -NFS4ERR_STALE_CLIENTID: | 1365 | case -NFS4ERR_STALE_CLIENTID: |
| 1360 | case -NFS4ERR_LEASE_MOVED: | 1366 | case -NFS4ERR_LEASE_MOVED: |
| 1361 | set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state); | 1367 | set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state); |
| @@ -1375,13 +1381,15 @@ static int nfs4_recovery_handle_error(struct nfs_client *clp, int error) | |||
| 1375 | case -NFS4ERR_SEQ_MISORDERED: | 1381 | case -NFS4ERR_SEQ_MISORDERED: |
| 1376 | set_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state); | 1382 | set_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state); |
| 1377 | /* Zero session reset errors */ | 1383 | /* Zero session reset errors */ |
| 1378 | return 0; | 1384 | break; |
| 1379 | case -EKEYEXPIRED: | 1385 | case -EKEYEXPIRED: |
| 1380 | /* Nothing we can do */ | 1386 | /* Nothing we can do */ |
| 1381 | nfs4_warn_keyexpired(clp->cl_hostname); | 1387 | nfs4_warn_keyexpired(clp->cl_hostname); |
| 1382 | return 0; | 1388 | break; |
| 1389 | default: | ||
| 1390 | return error; | ||
| 1383 | } | 1391 | } |
| 1384 | return error; | 1392 | return 0; |
| 1385 | } | 1393 | } |
| 1386 | 1394 | ||
| 1387 | static int nfs4_do_reclaim(struct nfs_client *clp, const struct nfs4_state_recovery_ops *ops) | 1395 | static int nfs4_do_reclaim(struct nfs_client *clp, const struct nfs4_state_recovery_ops *ops) |
| @@ -1428,7 +1436,7 @@ static int nfs4_check_lease(struct nfs_client *clp) | |||
| 1428 | struct rpc_cred *cred; | 1436 | struct rpc_cred *cred; |
| 1429 | const struct nfs4_state_maintenance_ops *ops = | 1437 | const struct nfs4_state_maintenance_ops *ops = |
| 1430 | clp->cl_mvops->state_renewal_ops; | 1438 | clp->cl_mvops->state_renewal_ops; |
| 1431 | int status = -NFS4ERR_EXPIRED; | 1439 | int status; |
| 1432 | 1440 | ||
| 1433 | /* Is the client already known to have an expired lease? */ | 1441 | /* Is the client already known to have an expired lease? */ |
| 1434 | if (test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state)) | 1442 | if (test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state)) |
| @@ -1438,6 +1446,7 @@ static int nfs4_check_lease(struct nfs_client *clp) | |||
| 1438 | spin_unlock(&clp->cl_lock); | 1446 | spin_unlock(&clp->cl_lock); |
| 1439 | if (cred == NULL) { | 1447 | if (cred == NULL) { |
| 1440 | cred = nfs4_get_setclientid_cred(clp); | 1448 | cred = nfs4_get_setclientid_cred(clp); |
| 1449 | status = -ENOKEY; | ||
| 1441 | if (cred == NULL) | 1450 | if (cred == NULL) |
| 1442 | goto out; | 1451 | goto out; |
| 1443 | } | 1452 | } |
| @@ -1525,16 +1534,16 @@ void nfs41_handle_sequence_flag_errors(struct nfs_client *clp, u32 flags) | |||
| 1525 | { | 1534 | { |
| 1526 | if (!flags) | 1535 | if (!flags) |
| 1527 | return; | 1536 | return; |
| 1528 | else if (flags & SEQ4_STATUS_RESTART_RECLAIM_NEEDED) | 1537 | if (flags & SEQ4_STATUS_RESTART_RECLAIM_NEEDED) |
| 1529 | nfs41_handle_server_reboot(clp); | 1538 | nfs41_handle_server_reboot(clp); |
| 1530 | else if (flags & (SEQ4_STATUS_EXPIRED_ALL_STATE_REVOKED | | 1539 | if (flags & (SEQ4_STATUS_EXPIRED_ALL_STATE_REVOKED | |
| 1531 | SEQ4_STATUS_EXPIRED_SOME_STATE_REVOKED | | 1540 | SEQ4_STATUS_EXPIRED_SOME_STATE_REVOKED | |
| 1532 | SEQ4_STATUS_ADMIN_STATE_REVOKED | | 1541 | SEQ4_STATUS_ADMIN_STATE_REVOKED | |
| 1533 | SEQ4_STATUS_LEASE_MOVED)) | 1542 | SEQ4_STATUS_LEASE_MOVED)) |
| 1534 | nfs41_handle_state_revoked(clp); | 1543 | nfs41_handle_state_revoked(clp); |
| 1535 | else if (flags & SEQ4_STATUS_RECALLABLE_STATE_REVOKED) | 1544 | if (flags & SEQ4_STATUS_RECALLABLE_STATE_REVOKED) |
| 1536 | nfs41_handle_recallable_state_revoked(clp); | 1545 | nfs41_handle_recallable_state_revoked(clp); |
| 1537 | else if (flags & (SEQ4_STATUS_CB_PATH_DOWN | | 1546 | if (flags & (SEQ4_STATUS_CB_PATH_DOWN | |
| 1538 | SEQ4_STATUS_BACKCHANNEL_FAULT | | 1547 | SEQ4_STATUS_BACKCHANNEL_FAULT | |
| 1539 | SEQ4_STATUS_CB_PATH_DOWN_SESSION)) | 1548 | SEQ4_STATUS_CB_PATH_DOWN_SESSION)) |
| 1540 | nfs41_handle_cb_path_down(clp); | 1549 | nfs41_handle_cb_path_down(clp); |
| @@ -1662,10 +1671,10 @@ static void nfs4_state_manager(struct nfs_client *clp) | |||
| 1662 | 1671 | ||
| 1663 | if (test_and_clear_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state)) { | 1672 | if (test_and_clear_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state)) { |
| 1664 | status = nfs4_check_lease(clp); | 1673 | status = nfs4_check_lease(clp); |
| 1674 | if (status < 0) | ||
| 1675 | goto out_error; | ||
| 1665 | if (test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state)) | 1676 | if (test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state)) |
| 1666 | continue; | 1677 | continue; |
| 1667 | if (status < 0 && status != -NFS4ERR_CB_PATH_DOWN) | ||
| 1668 | goto out_error; | ||
| 1669 | } | 1678 | } |
| 1670 | 1679 | ||
| 1671 | /* Initialize or reset the session */ | 1680 | /* Initialize or reset the session */ |
diff --git a/fs/nilfs2/ioctl.c b/fs/nilfs2/ioctl.c index 41d6743d303..ac258beeda3 100644 --- a/fs/nilfs2/ioctl.c +++ b/fs/nilfs2/ioctl.c | |||
| @@ -625,6 +625,9 @@ static int nilfs_ioctl_clean_segments(struct inode *inode, struct file *filp, | |||
| 625 | if (argv[n].v_nmembs > nsegs * nilfs->ns_blocks_per_segment) | 625 | if (argv[n].v_nmembs > nsegs * nilfs->ns_blocks_per_segment) |
| 626 | goto out_free; | 626 | goto out_free; |
| 627 | 627 | ||
| 628 | if (argv[n].v_nmembs >= UINT_MAX / argv[n].v_size) | ||
| 629 | goto out_free; | ||
| 630 | |||
| 628 | len = argv[n].v_size * argv[n].v_nmembs; | 631 | len = argv[n].v_size * argv[n].v_nmembs; |
| 629 | base = (void __user *)(unsigned long)argv[n].v_base; | 632 | base = (void __user *)(unsigned long)argv[n].v_base; |
| 630 | if (len == 0) { | 633 | if (len == 0) { |
| @@ -842,6 +845,19 @@ long nilfs_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | |||
| 842 | case FS_IOC32_GETVERSION: | 845 | case FS_IOC32_GETVERSION: |
| 843 | cmd = FS_IOC_GETVERSION; | 846 | cmd = FS_IOC_GETVERSION; |
| 844 | break; | 847 | break; |
| 848 | case NILFS_IOCTL_CHANGE_CPMODE: | ||
| 849 | case NILFS_IOCTL_DELETE_CHECKPOINT: | ||
| 850 | case NILFS_IOCTL_GET_CPINFO: | ||
| 851 | case NILFS_IOCTL_GET_CPSTAT: | ||
| 852 | case NILFS_IOCTL_GET_SUINFO: | ||
| 853 | case NILFS_IOCTL_GET_SUSTAT: | ||
| 854 | case NILFS_IOCTL_GET_VINFO: | ||
| 855 | case NILFS_IOCTL_GET_BDESCS: | ||
| 856 | case NILFS_IOCTL_CLEAN_SEGMENTS: | ||
| 857 | case NILFS_IOCTL_SYNC: | ||
| 858 | case NILFS_IOCTL_RESIZE: | ||
| 859 | case NILFS_IOCTL_SET_ALLOC_RANGE: | ||
| 860 | break; | ||
| 845 | default: | 861 | default: |
| 846 | return -ENOIOCTLCMD; | 862 | return -ENOIOCTLCMD; |
| 847 | } | 863 | } |
diff --git a/fs/proc/root.c b/fs/proc/root.c index 9a8a2b77b87..03102d97818 100644 --- a/fs/proc/root.c +++ b/fs/proc/root.c | |||
| @@ -91,20 +91,18 @@ static struct file_system_type proc_fs_type = { | |||
| 91 | 91 | ||
| 92 | void __init proc_root_init(void) | 92 | void __init proc_root_init(void) |
| 93 | { | 93 | { |
| 94 | struct vfsmount *mnt; | ||
| 95 | int err; | 94 | int err; |
| 96 | 95 | ||
| 97 | proc_init_inodecache(); | 96 | proc_init_inodecache(); |
| 98 | err = register_filesystem(&proc_fs_type); | 97 | err = register_filesystem(&proc_fs_type); |
| 99 | if (err) | 98 | if (err) |
| 100 | return; | 99 | return; |
| 101 | mnt = kern_mount_data(&proc_fs_type, &init_pid_ns); | 100 | err = pid_ns_prepare_proc(&init_pid_ns); |
| 102 | if (IS_ERR(mnt)) { | 101 | if (err) { |
| 103 | unregister_filesystem(&proc_fs_type); | 102 | unregister_filesystem(&proc_fs_type); |
| 104 | return; | 103 | return; |
| 105 | } | 104 | } |
| 106 | 105 | ||
| 107 | init_pid_ns.proc_mnt = mnt; | ||
| 108 | proc_symlink("mounts", NULL, "self/mounts"); | 106 | proc_symlink("mounts", NULL, "self/mounts"); |
| 109 | 107 | ||
| 110 | proc_net_init(); | 108 | proc_net_init(); |
| @@ -209,5 +207,5 @@ int pid_ns_prepare_proc(struct pid_namespace *ns) | |||
| 209 | 207 | ||
| 210 | void pid_ns_release_proc(struct pid_namespace *ns) | 208 | void pid_ns_release_proc(struct pid_namespace *ns) |
| 211 | { | 209 | { |
| 212 | mntput(ns->proc_mnt); | 210 | kern_unmount(ns->proc_mnt); |
| 213 | } | 211 | } |
diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c index 20403dc5d43..ae0e76bb6eb 100644 --- a/fs/ubifs/super.c +++ b/fs/ubifs/super.c | |||
| @@ -2264,19 +2264,12 @@ static int __init ubifs_init(void) | |||
| 2264 | return -EINVAL; | 2264 | return -EINVAL; |
| 2265 | } | 2265 | } |
| 2266 | 2266 | ||
| 2267 | err = register_filesystem(&ubifs_fs_type); | ||
| 2268 | if (err) { | ||
| 2269 | ubifs_err("cannot register file system, error %d", err); | ||
| 2270 | return err; | ||
| 2271 | } | ||
| 2272 | |||
| 2273 | err = -ENOMEM; | ||
| 2274 | ubifs_inode_slab = kmem_cache_create("ubifs_inode_slab", | 2267 | ubifs_inode_slab = kmem_cache_create("ubifs_inode_slab", |
| 2275 | sizeof(struct ubifs_inode), 0, | 2268 | sizeof(struct ubifs_inode), 0, |
| 2276 | SLAB_MEM_SPREAD | SLAB_RECLAIM_ACCOUNT, | 2269 | SLAB_MEM_SPREAD | SLAB_RECLAIM_ACCOUNT, |
| 2277 | &inode_slab_ctor); | 2270 | &inode_slab_ctor); |
| 2278 | if (!ubifs_inode_slab) | 2271 | if (!ubifs_inode_slab) |
| 2279 | goto out_reg; | 2272 | return -ENOMEM; |
| 2280 | 2273 | ||
| 2281 | register_shrinker(&ubifs_shrinker_info); | 2274 | register_shrinker(&ubifs_shrinker_info); |
| 2282 | 2275 | ||
| @@ -2288,15 +2281,20 @@ static int __init ubifs_init(void) | |||
| 2288 | if (err) | 2281 | if (err) |
| 2289 | goto out_compr; | 2282 | goto out_compr; |
| 2290 | 2283 | ||
| 2284 | err = register_filesystem(&ubifs_fs_type); | ||
| 2285 | if (err) { | ||
| 2286 | ubifs_err("cannot register file system, error %d", err); | ||
| 2287 | goto out_dbg; | ||
| 2288 | } | ||
| 2291 | return 0; | 2289 | return 0; |
| 2292 | 2290 | ||
| 2291 | out_dbg: | ||
| 2292 | dbg_debugfs_exit(); | ||
| 2293 | out_compr: | 2293 | out_compr: |
| 2294 | ubifs_compressors_exit(); | 2294 | ubifs_compressors_exit(); |
| 2295 | out_shrinker: | 2295 | out_shrinker: |
| 2296 | unregister_shrinker(&ubifs_shrinker_info); | 2296 | unregister_shrinker(&ubifs_shrinker_info); |
| 2297 | kmem_cache_destroy(ubifs_inode_slab); | 2297 | kmem_cache_destroy(ubifs_inode_slab); |
| 2298 | out_reg: | ||
| 2299 | unregister_filesystem(&ubifs_fs_type); | ||
| 2300 | return err; | 2298 | return err; |
| 2301 | } | 2299 | } |
| 2302 | /* late_initcall to let compressors initialize first */ | 2300 | /* late_initcall to let compressors initialize first */ |
diff --git a/include/drm/drm_pciids.h b/include/drm/drm_pciids.h index 4e4fbb820e2..14b6cd02228 100644 --- a/include/drm/drm_pciids.h +++ b/include/drm/drm_pciids.h | |||
| @@ -182,8 +182,11 @@ | |||
| 182 | {0x1002, 0x6748, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ | 182 | {0x1002, 0x6748, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ |
| 183 | {0x1002, 0x6749, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ | 183 | {0x1002, 0x6749, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ |
| 184 | {0x1002, 0x6750, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ | 184 | {0x1002, 0x6750, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ |
| 185 | {0x1002, 0x6751, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ | ||
| 185 | {0x1002, 0x6758, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ | 186 | {0x1002, 0x6758, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ |
| 186 | {0x1002, 0x6759, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ | 187 | {0x1002, 0x6759, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ |
| 188 | {0x1002, 0x675B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ | ||
| 189 | {0x1002, 0x675D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ | ||
| 187 | {0x1002, 0x675F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ | 190 | {0x1002, 0x675F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ |
| 188 | {0x1002, 0x6760, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | 191 | {0x1002, 0x6760, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ |
| 189 | {0x1002, 0x6761, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | 192 | {0x1002, 0x6761, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ |
| @@ -195,8 +198,10 @@ | |||
| 195 | {0x1002, 0x6767, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \ | 198 | {0x1002, 0x6767, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \ |
| 196 | {0x1002, 0x6768, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \ | 199 | {0x1002, 0x6768, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \ |
| 197 | {0x1002, 0x6770, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \ | 200 | {0x1002, 0x6770, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \ |
| 201 | {0x1002, 0x6772, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \ | ||
| 198 | {0x1002, 0x6778, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \ | 202 | {0x1002, 0x6778, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \ |
| 199 | {0x1002, 0x6779, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \ | 203 | {0x1002, 0x6779, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \ |
| 204 | {0x1002, 0x677B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \ | ||
| 200 | {0x1002, 0x6840, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | 205 | {0x1002, 0x6840, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ |
| 201 | {0x1002, 0x6841, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | 206 | {0x1002, 0x6841, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ |
| 202 | {0x1002, 0x6842, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | 207 | {0x1002, 0x6842, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ |
| @@ -246,6 +251,7 @@ | |||
| 246 | {0x1002, 0x68f2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CEDAR|RADEON_NEW_MEMMAP}, \ | 251 | {0x1002, 0x68f2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CEDAR|RADEON_NEW_MEMMAP}, \ |
| 247 | {0x1002, 0x68f8, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CEDAR|RADEON_NEW_MEMMAP}, \ | 252 | {0x1002, 0x68f8, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CEDAR|RADEON_NEW_MEMMAP}, \ |
| 248 | {0x1002, 0x68f9, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CEDAR|RADEON_NEW_MEMMAP}, \ | 253 | {0x1002, 0x68f9, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CEDAR|RADEON_NEW_MEMMAP}, \ |
| 254 | {0x1002, 0x68fa, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CEDAR|RADEON_NEW_MEMMAP}, \ | ||
| 249 | {0x1002, 0x68fe, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CEDAR|RADEON_NEW_MEMMAP}, \ | 255 | {0x1002, 0x68fe, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CEDAR|RADEON_NEW_MEMMAP}, \ |
| 250 | {0x1002, 0x7100, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R520|RADEON_NEW_MEMMAP}, \ | 256 | {0x1002, 0x7100, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R520|RADEON_NEW_MEMMAP}, \ |
| 251 | {0x1002, 0x7101, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R520|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | 257 | {0x1002, 0x7101, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R520|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ |
| @@ -488,6 +494,8 @@ | |||
| 488 | {0x1002, 0x9647, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP},\ | 494 | {0x1002, 0x9647, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP},\ |
| 489 | {0x1002, 0x9648, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP},\ | 495 | {0x1002, 0x9648, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP},\ |
| 490 | {0x1002, 0x964a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | 496 | {0x1002, 0x964a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ |
| 497 | {0x1002, 0x964b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | ||
| 498 | {0x1002, 0x964c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | ||
| 491 | {0x1002, 0x964e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP},\ | 499 | {0x1002, 0x964e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP},\ |
| 492 | {0x1002, 0x964f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP},\ | 500 | {0x1002, 0x964f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP},\ |
| 493 | {0x1002, 0x9710, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS880|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | 501 | {0x1002, 0x9710, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS880|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ |
| @@ -502,6 +510,8 @@ | |||
| 502 | {0x1002, 0x9805, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PALM|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | 510 | {0x1002, 0x9805, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PALM|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ |
| 503 | {0x1002, 0x9806, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PALM|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | 511 | {0x1002, 0x9806, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PALM|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ |
| 504 | {0x1002, 0x9807, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PALM|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | 512 | {0x1002, 0x9807, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PALM|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ |
| 513 | {0x1002, 0x9808, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PALM|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | ||
| 514 | {0x1002, 0x9809, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PALM|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | ||
| 505 | {0, 0, 0} | 515 | {0, 0, 0} |
| 506 | 516 | ||
| 507 | #define r128_PCI_IDS \ | 517 | #define r128_PCI_IDS \ |
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index c7a6d3b5bc7..94acd8172b5 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h | |||
| @@ -805,9 +805,6 @@ extern void blk_unprep_request(struct request *); | |||
| 805 | */ | 805 | */ |
| 806 | extern struct request_queue *blk_init_queue_node(request_fn_proc *rfn, | 806 | extern struct request_queue *blk_init_queue_node(request_fn_proc *rfn, |
| 807 | spinlock_t *lock, int node_id); | 807 | spinlock_t *lock, int node_id); |
| 808 | extern struct request_queue *blk_init_allocated_queue_node(struct request_queue *, | ||
| 809 | request_fn_proc *, | ||
| 810 | spinlock_t *, int node_id); | ||
| 811 | extern struct request_queue *blk_init_queue(request_fn_proc *, spinlock_t *); | 808 | extern struct request_queue *blk_init_queue(request_fn_proc *, spinlock_t *); |
| 812 | extern struct request_queue *blk_init_allocated_queue(struct request_queue *, | 809 | extern struct request_queue *blk_init_allocated_queue(struct request_queue *, |
| 813 | request_fn_proc *, spinlock_t *); | 810 | request_fn_proc *, spinlock_t *); |
diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h index c86c940d1de..081147da056 100644 --- a/include/linux/clocksource.h +++ b/include/linux/clocksource.h | |||
| @@ -71,7 +71,7 @@ struct timecounter { | |||
| 71 | 71 | ||
| 72 | /** | 72 | /** |
| 73 | * cyclecounter_cyc2ns - converts cycle counter cycles to nanoseconds | 73 | * cyclecounter_cyc2ns - converts cycle counter cycles to nanoseconds |
| 74 | * @tc: Pointer to cycle counter. | 74 | * @cc: Pointer to cycle counter. |
| 75 | * @cycles: Cycles | 75 | * @cycles: Cycles |
| 76 | * | 76 | * |
| 77 | * XXX - This could use some mult_lxl_ll() asm optimization. Same code | 77 | * XXX - This could use some mult_lxl_ll() asm optimization. Same code |
| @@ -114,7 +114,7 @@ extern u64 timecounter_read(struct timecounter *tc); | |||
| 114 | * time base as values returned by | 114 | * time base as values returned by |
| 115 | * timecounter_read() | 115 | * timecounter_read() |
| 116 | * @tc: Pointer to time counter. | 116 | * @tc: Pointer to time counter. |
| 117 | * @cycle: a value returned by tc->cc->read() | 117 | * @cycle_tstamp: a value returned by tc->cc->read() |
| 118 | * | 118 | * |
| 119 | * Cycle counts that are converted correctly as long as they | 119 | * Cycle counts that are converted correctly as long as they |
| 120 | * fall into the interval [-1/2 max cycle count, +1/2 max cycle count], | 120 | * fall into the interval [-1/2 max cycle count, +1/2 max cycle count], |
| @@ -156,11 +156,12 @@ extern u64 timecounter_cyc2time(struct timecounter *tc, | |||
| 156 | * @mult: cycle to nanosecond multiplier | 156 | * @mult: cycle to nanosecond multiplier |
| 157 | * @shift: cycle to nanosecond divisor (power of two) | 157 | * @shift: cycle to nanosecond divisor (power of two) |
| 158 | * @max_idle_ns: max idle time permitted by the clocksource (nsecs) | 158 | * @max_idle_ns: max idle time permitted by the clocksource (nsecs) |
| 159 | * @maxadj maximum adjustment value to mult (~11%) | 159 | * @maxadj: maximum adjustment value to mult (~11%) |
| 160 | * @flags: flags describing special properties | 160 | * @flags: flags describing special properties |
| 161 | * @archdata: arch-specific data | 161 | * @archdata: arch-specific data |
| 162 | * @suspend: suspend function for the clocksource, if necessary | 162 | * @suspend: suspend function for the clocksource, if necessary |
| 163 | * @resume: resume function for the clocksource, if necessary | 163 | * @resume: resume function for the clocksource, if necessary |
| 164 | * @cycle_last: most recent cycle counter value seen by ::read() | ||
| 164 | */ | 165 | */ |
| 165 | struct clocksource { | 166 | struct clocksource { |
| 166 | /* | 167 | /* |
| @@ -187,6 +188,7 @@ struct clocksource { | |||
| 187 | void (*suspend)(struct clocksource *cs); | 188 | void (*suspend)(struct clocksource *cs); |
| 188 | void (*resume)(struct clocksource *cs); | 189 | void (*resume)(struct clocksource *cs); |
| 189 | 190 | ||
| 191 | /* private: */ | ||
| 190 | #ifdef CONFIG_CLOCKSOURCE_WATCHDOG | 192 | #ifdef CONFIG_CLOCKSOURCE_WATCHDOG |
| 191 | /* Watchdog related data, used by the framework */ | 193 | /* Watchdog related data, used by the framework */ |
| 192 | struct list_head wd_list; | 194 | struct list_head wd_list; |
| @@ -261,6 +263,9 @@ static inline u32 clocksource_hz2mult(u32 hz, u32 shift_constant) | |||
| 261 | 263 | ||
| 262 | /** | 264 | /** |
| 263 | * clocksource_cyc2ns - converts clocksource cycles to nanoseconds | 265 | * clocksource_cyc2ns - converts clocksource cycles to nanoseconds |
| 266 | * @cycles: cycles | ||
| 267 | * @mult: cycle to nanosecond multiplier | ||
| 268 | * @shift: cycle to nanosecond divisor (power of two) | ||
| 264 | * | 269 | * |
| 265 | * Converts cycles to nanoseconds, using the given mult and shift. | 270 | * Converts cycles to nanoseconds, using the given mult and shift. |
| 266 | * | 271 | * |
diff --git a/include/linux/dma_remapping.h b/include/linux/dma_remapping.h index ef90cbd8e17..57c9a8ae4f2 100644 --- a/include/linux/dma_remapping.h +++ b/include/linux/dma_remapping.h | |||
| @@ -31,6 +31,7 @@ extern void free_dmar_iommu(struct intel_iommu *iommu); | |||
| 31 | extern int iommu_calculate_agaw(struct intel_iommu *iommu); | 31 | extern int iommu_calculate_agaw(struct intel_iommu *iommu); |
| 32 | extern int iommu_calculate_max_sagaw(struct intel_iommu *iommu); | 32 | extern int iommu_calculate_max_sagaw(struct intel_iommu *iommu); |
| 33 | extern int dmar_disabled; | 33 | extern int dmar_disabled; |
| 34 | extern int intel_iommu_enabled; | ||
| 34 | #else | 35 | #else |
| 35 | static inline int iommu_calculate_agaw(struct intel_iommu *iommu) | 36 | static inline int iommu_calculate_agaw(struct intel_iommu *iommu) |
| 36 | { | 37 | { |
| @@ -44,6 +45,7 @@ static inline void free_dmar_iommu(struct intel_iommu *iommu) | |||
| 44 | { | 45 | { |
| 45 | } | 46 | } |
| 46 | #define dmar_disabled (1) | 47 | #define dmar_disabled (1) |
| 48 | #define intel_iommu_enabled (0) | ||
| 47 | #endif | 49 | #endif |
| 48 | 50 | ||
| 49 | 51 | ||
diff --git a/include/linux/lglock.h b/include/linux/lglock.h index f549056fb20..87f402ccec5 100644 --- a/include/linux/lglock.h +++ b/include/linux/lglock.h | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <linux/spinlock.h> | 22 | #include <linux/spinlock.h> |
| 23 | #include <linux/lockdep.h> | 23 | #include <linux/lockdep.h> |
| 24 | #include <linux/percpu.h> | 24 | #include <linux/percpu.h> |
| 25 | #include <linux/cpu.h> | ||
| 25 | 26 | ||
| 26 | /* can make br locks by using local lock for read side, global lock for write */ | 27 | /* can make br locks by using local lock for read side, global lock for write */ |
| 27 | #define br_lock_init(name) name##_lock_init() | 28 | #define br_lock_init(name) name##_lock_init() |
| @@ -72,9 +73,31 @@ | |||
| 72 | 73 | ||
| 73 | #define DEFINE_LGLOCK(name) \ | 74 | #define DEFINE_LGLOCK(name) \ |
| 74 | \ | 75 | \ |
| 76 | DEFINE_SPINLOCK(name##_cpu_lock); \ | ||
| 77 | cpumask_t name##_cpus __read_mostly; \ | ||
| 75 | DEFINE_PER_CPU(arch_spinlock_t, name##_lock); \ | 78 | DEFINE_PER_CPU(arch_spinlock_t, name##_lock); \ |
| 76 | DEFINE_LGLOCK_LOCKDEP(name); \ | 79 | DEFINE_LGLOCK_LOCKDEP(name); \ |
| 77 | \ | 80 | \ |
| 81 | static int \ | ||
| 82 | name##_lg_cpu_callback(struct notifier_block *nb, \ | ||
| 83 | unsigned long action, void *hcpu) \ | ||
| 84 | { \ | ||
| 85 | switch (action & ~CPU_TASKS_FROZEN) { \ | ||
| 86 | case CPU_UP_PREPARE: \ | ||
| 87 | spin_lock(&name##_cpu_lock); \ | ||
| 88 | cpu_set((unsigned long)hcpu, name##_cpus); \ | ||
| 89 | spin_unlock(&name##_cpu_lock); \ | ||
| 90 | break; \ | ||
| 91 | case CPU_UP_CANCELED: case CPU_DEAD: \ | ||
| 92 | spin_lock(&name##_cpu_lock); \ | ||
| 93 | cpu_clear((unsigned long)hcpu, name##_cpus); \ | ||
| 94 | spin_unlock(&name##_cpu_lock); \ | ||
| 95 | } \ | ||
| 96 | return NOTIFY_OK; \ | ||
| 97 | } \ | ||
| 98 | static struct notifier_block name##_lg_cpu_notifier = { \ | ||
| 99 | .notifier_call = name##_lg_cpu_callback, \ | ||
| 100 | }; \ | ||
| 78 | void name##_lock_init(void) { \ | 101 | void name##_lock_init(void) { \ |
| 79 | int i; \ | 102 | int i; \ |
| 80 | LOCKDEP_INIT_MAP(&name##_lock_dep_map, #name, &name##_lock_key, 0); \ | 103 | LOCKDEP_INIT_MAP(&name##_lock_dep_map, #name, &name##_lock_key, 0); \ |
| @@ -83,6 +106,11 @@ | |||
| 83 | lock = &per_cpu(name##_lock, i); \ | 106 | lock = &per_cpu(name##_lock, i); \ |
| 84 | *lock = (arch_spinlock_t)__ARCH_SPIN_LOCK_UNLOCKED; \ | 107 | *lock = (arch_spinlock_t)__ARCH_SPIN_LOCK_UNLOCKED; \ |
| 85 | } \ | 108 | } \ |
| 109 | register_hotcpu_notifier(&name##_lg_cpu_notifier); \ | ||
| 110 | get_online_cpus(); \ | ||
| 111 | for_each_online_cpu(i) \ | ||
| 112 | cpu_set(i, name##_cpus); \ | ||
| 113 | put_online_cpus(); \ | ||
| 86 | } \ | 114 | } \ |
| 87 | EXPORT_SYMBOL(name##_lock_init); \ | 115 | EXPORT_SYMBOL(name##_lock_init); \ |
| 88 | \ | 116 | \ |
| @@ -124,9 +152,9 @@ | |||
| 124 | \ | 152 | \ |
| 125 | void name##_global_lock_online(void) { \ | 153 | void name##_global_lock_online(void) { \ |
| 126 | int i; \ | 154 | int i; \ |
| 127 | preempt_disable(); \ | 155 | spin_lock(&name##_cpu_lock); \ |
| 128 | rwlock_acquire(&name##_lock_dep_map, 0, 0, _RET_IP_); \ | 156 | rwlock_acquire(&name##_lock_dep_map, 0, 0, _RET_IP_); \ |
| 129 | for_each_online_cpu(i) { \ | 157 | for_each_cpu(i, &name##_cpus) { \ |
| 130 | arch_spinlock_t *lock; \ | 158 | arch_spinlock_t *lock; \ |
| 131 | lock = &per_cpu(name##_lock, i); \ | 159 | lock = &per_cpu(name##_lock, i); \ |
| 132 | arch_spin_lock(lock); \ | 160 | arch_spin_lock(lock); \ |
| @@ -137,12 +165,12 @@ | |||
| 137 | void name##_global_unlock_online(void) { \ | 165 | void name##_global_unlock_online(void) { \ |
| 138 | int i; \ | 166 | int i; \ |
| 139 | rwlock_release(&name##_lock_dep_map, 1, _RET_IP_); \ | 167 | rwlock_release(&name##_lock_dep_map, 1, _RET_IP_); \ |
| 140 | for_each_online_cpu(i) { \ | 168 | for_each_cpu(i, &name##_cpus) { \ |
| 141 | arch_spinlock_t *lock; \ | 169 | arch_spinlock_t *lock; \ |
| 142 | lock = &per_cpu(name##_lock, i); \ | 170 | lock = &per_cpu(name##_lock, i); \ |
| 143 | arch_spin_unlock(lock); \ | 171 | arch_spin_unlock(lock); \ |
| 144 | } \ | 172 | } \ |
| 145 | preempt_enable(); \ | 173 | spin_unlock(&name##_cpu_lock); \ |
| 146 | } \ | 174 | } \ |
| 147 | EXPORT_SYMBOL(name##_global_unlock_online); \ | 175 | EXPORT_SYMBOL(name##_global_unlock_online); \ |
| 148 | \ | 176 | \ |
diff --git a/include/linux/log2.h b/include/linux/log2.h index 25b808631cd..fd7ff3d91e6 100644 --- a/include/linux/log2.h +++ b/include/linux/log2.h | |||
| @@ -185,7 +185,6 @@ unsigned long __rounddown_pow_of_two(unsigned long n) | |||
| 185 | #define rounddown_pow_of_two(n) \ | 185 | #define rounddown_pow_of_two(n) \ |
| 186 | ( \ | 186 | ( \ |
| 187 | __builtin_constant_p(n) ? ( \ | 187 | __builtin_constant_p(n) ? ( \ |
| 188 | (n == 1) ? 0 : \ | ||
| 189 | (1UL << ilog2(n))) : \ | 188 | (1UL << ilog2(n))) : \ |
| 190 | __rounddown_pow_of_two(n) \ | 189 | __rounddown_pow_of_two(n) \ |
| 191 | ) | 190 | ) |
diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index 415f2db414e..c8ef9bc54d5 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h | |||
| @@ -218,6 +218,7 @@ struct mmc_card { | |||
| 218 | #define MMC_QUIRK_INAND_CMD38 (1<<6) /* iNAND devices have broken CMD38 */ | 218 | #define MMC_QUIRK_INAND_CMD38 (1<<6) /* iNAND devices have broken CMD38 */ |
| 219 | #define MMC_QUIRK_BLK_NO_CMD23 (1<<7) /* Avoid CMD23 for regular multiblock */ | 219 | #define MMC_QUIRK_BLK_NO_CMD23 (1<<7) /* Avoid CMD23 for regular multiblock */ |
| 220 | #define MMC_QUIRK_BROKEN_BYTE_MODE_512 (1<<8) /* Avoid sending 512 bytes in */ | 220 | #define MMC_QUIRK_BROKEN_BYTE_MODE_512 (1<<8) /* Avoid sending 512 bytes in */ |
| 221 | #define MMC_QUIRK_LONG_READ_TIME (1<<9) /* Data read time > CSD says */ | ||
| 221 | /* byte mode */ | 222 | /* byte mode */ |
| 222 | unsigned int poweroff_notify_state; /* eMMC4.5 notify feature */ | 223 | unsigned int poweroff_notify_state; /* eMMC4.5 notify feature */ |
| 223 | #define MMC_NO_POWER_NOTIFICATION 0 | 224 | #define MMC_NO_POWER_NOTIFICATION 0 |
| @@ -433,6 +434,11 @@ static inline int mmc_card_broken_byte_mode_512(const struct mmc_card *c) | |||
| 433 | return c->quirks & MMC_QUIRK_BROKEN_BYTE_MODE_512; | 434 | return c->quirks & MMC_QUIRK_BROKEN_BYTE_MODE_512; |
| 434 | } | 435 | } |
| 435 | 436 | ||
| 437 | static inline int mmc_card_long_read_time(const struct mmc_card *c) | ||
| 438 | { | ||
| 439 | return c->quirks & MMC_QUIRK_LONG_READ_TIME; | ||
| 440 | } | ||
| 441 | |||
| 436 | #define mmc_card_name(c) ((c)->cid.prod_name) | 442 | #define mmc_card_name(c) ((c)->cid.prod_name) |
| 437 | #define mmc_card_id(c) (dev_name(&(c)->dev)) | 443 | #define mmc_card_id(c) (dev_name(&(c)->dev)) |
| 438 | 444 | ||
diff --git a/include/media/soc_camera.h b/include/media/soc_camera.h index b1377b931eb..5fb2c3d10c0 100644 --- a/include/media/soc_camera.h +++ b/include/media/soc_camera.h | |||
| @@ -254,7 +254,7 @@ unsigned long soc_camera_apply_board_flags(struct soc_camera_link *icl, | |||
| 254 | static inline struct video_device *soc_camera_i2c_to_vdev(const struct i2c_client *client) | 254 | static inline struct video_device *soc_camera_i2c_to_vdev(const struct i2c_client *client) |
| 255 | { | 255 | { |
| 256 | struct v4l2_subdev *sd = i2c_get_clientdata(client); | 256 | struct v4l2_subdev *sd = i2c_get_clientdata(client); |
| 257 | struct soc_camera_device *icd = (struct soc_camera_device *)sd->grp_id; | 257 | struct soc_camera_device *icd = v4l2_get_subdev_hostdata(sd); |
| 258 | return icd ? icd->vdev : NULL; | 258 | return icd ? icd->vdev : NULL; |
| 259 | } | 259 | } |
| 260 | 260 | ||
| @@ -279,6 +279,11 @@ static inline struct soc_camera_device *soc_camera_from_vbq(const struct videobu | |||
| 279 | return container_of(vq, struct soc_camera_device, vb_vidq); | 279 | return container_of(vq, struct soc_camera_device, vb_vidq); |
| 280 | } | 280 | } |
| 281 | 281 | ||
| 282 | static inline u32 soc_camera_grp_id(const struct soc_camera_device *icd) | ||
| 283 | { | ||
| 284 | return (icd->iface << 8) | (icd->devnum + 1); | ||
| 285 | } | ||
| 286 | |||
| 282 | void soc_camera_lock(struct vb2_queue *vq); | 287 | void soc_camera_lock(struct vb2_queue *vq); |
| 283 | void soc_camera_unlock(struct vb2_queue *vq); | 288 | void soc_camera_unlock(struct vb2_queue *vq); |
| 284 | 289 | ||
diff --git a/include/net/dst.h b/include/net/dst.h index 6faec1a6021..75766b42660 100644 --- a/include/net/dst.h +++ b/include/net/dst.h | |||
| @@ -53,6 +53,7 @@ struct dst_entry { | |||
| 53 | #define DST_NOHASH 0x0008 | 53 | #define DST_NOHASH 0x0008 |
| 54 | #define DST_NOCACHE 0x0010 | 54 | #define DST_NOCACHE 0x0010 |
| 55 | #define DST_NOCOUNT 0x0020 | 55 | #define DST_NOCOUNT 0x0020 |
| 56 | #define DST_NOPEER 0x0040 | ||
| 56 | 57 | ||
| 57 | short error; | 58 | short error; |
| 58 | short obsolete; | 59 | short obsolete; |
diff --git a/include/net/flow.h b/include/net/flow.h index a09447749e2..57f15a7f1cd 100644 --- a/include/net/flow.h +++ b/include/net/flow.h | |||
| @@ -207,6 +207,7 @@ extern struct flow_cache_object *flow_cache_lookup( | |||
| 207 | u8 dir, flow_resolve_t resolver, void *ctx); | 207 | u8 dir, flow_resolve_t resolver, void *ctx); |
| 208 | 208 | ||
| 209 | extern void flow_cache_flush(void); | 209 | extern void flow_cache_flush(void); |
| 210 | extern void flow_cache_flush_deferred(void); | ||
| 210 | extern atomic_t flow_cache_genid; | 211 | extern atomic_t flow_cache_genid; |
| 211 | 212 | ||
| 212 | #endif | 213 | #endif |
diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h index e90e7a9935d..a15432da27c 100644 --- a/include/net/sctp/structs.h +++ b/include/net/sctp/structs.h | |||
| @@ -241,6 +241,9 @@ extern struct sctp_globals { | |||
| 241 | * bits is an indicator of when to send and window update SACK. | 241 | * bits is an indicator of when to send and window update SACK. |
| 242 | */ | 242 | */ |
| 243 | int rwnd_update_shift; | 243 | int rwnd_update_shift; |
| 244 | |||
| 245 | /* Threshold for autoclose timeout, in seconds. */ | ||
| 246 | unsigned long max_autoclose; | ||
| 244 | } sctp_globals; | 247 | } sctp_globals; |
| 245 | 248 | ||
| 246 | #define sctp_rto_initial (sctp_globals.rto_initial) | 249 | #define sctp_rto_initial (sctp_globals.rto_initial) |
| @@ -281,6 +284,7 @@ extern struct sctp_globals { | |||
| 281 | #define sctp_auth_enable (sctp_globals.auth_enable) | 284 | #define sctp_auth_enable (sctp_globals.auth_enable) |
| 282 | #define sctp_checksum_disable (sctp_globals.checksum_disable) | 285 | #define sctp_checksum_disable (sctp_globals.checksum_disable) |
| 283 | #define sctp_rwnd_upd_shift (sctp_globals.rwnd_update_shift) | 286 | #define sctp_rwnd_upd_shift (sctp_globals.rwnd_update_shift) |
| 287 | #define sctp_max_autoclose (sctp_globals.max_autoclose) | ||
| 284 | 288 | ||
| 285 | /* SCTP Socket type: UDP or TCP style. */ | 289 | /* SCTP Socket type: UDP or TCP style. */ |
| 286 | typedef enum { | 290 | typedef enum { |
diff --git a/include/net/sock.h b/include/net/sock.h index abb6e0f0c3c..32e39371fba 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
| @@ -637,12 +637,14 @@ static inline void __sk_add_backlog(struct sock *sk, struct sk_buff *skb) | |||
| 637 | 637 | ||
| 638 | /* | 638 | /* |
| 639 | * Take into account size of receive queue and backlog queue | 639 | * Take into account size of receive queue and backlog queue |
| 640 | * Do not take into account this skb truesize, | ||
| 641 | * to allow even a single big packet to come. | ||
| 640 | */ | 642 | */ |
| 641 | static inline bool sk_rcvqueues_full(const struct sock *sk, const struct sk_buff *skb) | 643 | static inline bool sk_rcvqueues_full(const struct sock *sk, const struct sk_buff *skb) |
| 642 | { | 644 | { |
| 643 | unsigned int qsize = sk->sk_backlog.len + atomic_read(&sk->sk_rmem_alloc); | 645 | unsigned int qsize = sk->sk_backlog.len + atomic_read(&sk->sk_rmem_alloc); |
| 644 | 646 | ||
| 645 | return qsize + skb->truesize > sk->sk_rcvbuf; | 647 | return qsize > sk->sk_rcvbuf; |
| 646 | } | 648 | } |
| 647 | 649 | ||
| 648 | /* The per-socket spinlock must be held here. */ | 650 | /* The per-socket spinlock must be held here. */ |
diff --git a/include/scsi/libfcoe.h b/include/scsi/libfcoe.h index d1e95c6ac77..5a35a2a2d3c 100644 --- a/include/scsi/libfcoe.h +++ b/include/scsi/libfcoe.h | |||
| @@ -147,6 +147,7 @@ struct fcoe_ctlr { | |||
| 147 | u8 map_dest; | 147 | u8 map_dest; |
| 148 | u8 spma; | 148 | u8 spma; |
| 149 | u8 probe_tries; | 149 | u8 probe_tries; |
| 150 | u8 priority; | ||
| 150 | u8 dest_addr[ETH_ALEN]; | 151 | u8 dest_addr[ETH_ALEN]; |
| 151 | u8 ctl_src_addr[ETH_ALEN]; | 152 | u8 ctl_src_addr[ETH_ALEN]; |
| 152 | 153 | ||
| @@ -301,6 +302,7 @@ struct fcoe_percpu_s { | |||
| 301 | * @lport: The associated local port | 302 | * @lport: The associated local port |
| 302 | * @fcoe_pending_queue: The pending Rx queue of skbs | 303 | * @fcoe_pending_queue: The pending Rx queue of skbs |
| 303 | * @fcoe_pending_queue_active: Indicates if the pending queue is active | 304 | * @fcoe_pending_queue_active: Indicates if the pending queue is active |
| 305 | * @priority: Packet priority (DCB) | ||
| 304 | * @max_queue_depth: Max queue depth of pending queue | 306 | * @max_queue_depth: Max queue depth of pending queue |
| 305 | * @min_queue_depth: Min queue depth of pending queue | 307 | * @min_queue_depth: Min queue depth of pending queue |
| 306 | * @timer: The queue timer | 308 | * @timer: The queue timer |
| @@ -316,6 +318,7 @@ struct fcoe_port { | |||
| 316 | struct fc_lport *lport; | 318 | struct fc_lport *lport; |
| 317 | struct sk_buff_head fcoe_pending_queue; | 319 | struct sk_buff_head fcoe_pending_queue; |
| 318 | u8 fcoe_pending_queue_active; | 320 | u8 fcoe_pending_queue_active; |
| 321 | u8 priority; | ||
| 319 | u32 max_queue_depth; | 322 | u32 max_queue_depth; |
| 320 | u32 min_queue_depth; | 323 | u32 min_queue_depth; |
| 321 | struct timer_list timer; | 324 | struct timer_list timer; |
diff --git a/include/trace/events/writeback.h b/include/trace/events/writeback.h index b99caa8b780..99d1d0decf8 100644 --- a/include/trace/events/writeback.h +++ b/include/trace/events/writeback.h | |||
| @@ -21,6 +21,16 @@ | |||
| 21 | {I_REFERENCED, "I_REFERENCED"} \ | 21 | {I_REFERENCED, "I_REFERENCED"} \ |
| 22 | ) | 22 | ) |
| 23 | 23 | ||
| 24 | #define WB_WORK_REASON \ | ||
| 25 | {WB_REASON_BACKGROUND, "background"}, \ | ||
| 26 | {WB_REASON_TRY_TO_FREE_PAGES, "try_to_free_pages"}, \ | ||
| 27 | {WB_REASON_SYNC, "sync"}, \ | ||
| 28 | {WB_REASON_PERIODIC, "periodic"}, \ | ||
| 29 | {WB_REASON_LAPTOP_TIMER, "laptop_timer"}, \ | ||
| 30 | {WB_REASON_FREE_MORE_MEM, "free_more_memory"}, \ | ||
| 31 | {WB_REASON_FS_FREE_SPACE, "fs_free_space"}, \ | ||
| 32 | {WB_REASON_FORKER_THREAD, "forker_thread"} | ||
| 33 | |||
| 24 | struct wb_writeback_work; | 34 | struct wb_writeback_work; |
| 25 | 35 | ||
| 26 | DECLARE_EVENT_CLASS(writeback_work_class, | 36 | DECLARE_EVENT_CLASS(writeback_work_class, |
| @@ -55,7 +65,7 @@ DECLARE_EVENT_CLASS(writeback_work_class, | |||
| 55 | __entry->for_kupdate, | 65 | __entry->for_kupdate, |
| 56 | __entry->range_cyclic, | 66 | __entry->range_cyclic, |
| 57 | __entry->for_background, | 67 | __entry->for_background, |
| 58 | wb_reason_name[__entry->reason] | 68 | __print_symbolic(__entry->reason, WB_WORK_REASON) |
| 59 | ) | 69 | ) |
| 60 | ); | 70 | ); |
| 61 | #define DEFINE_WRITEBACK_WORK_EVENT(name) \ | 71 | #define DEFINE_WRITEBACK_WORK_EVENT(name) \ |
| @@ -184,7 +194,8 @@ TRACE_EVENT(writeback_queue_io, | |||
| 184 | __entry->older, /* older_than_this in jiffies */ | 194 | __entry->older, /* older_than_this in jiffies */ |
| 185 | __entry->age, /* older_than_this in relative milliseconds */ | 195 | __entry->age, /* older_than_this in relative milliseconds */ |
| 186 | __entry->moved, | 196 | __entry->moved, |
| 187 | wb_reason_name[__entry->reason]) | 197 | __print_symbolic(__entry->reason, WB_WORK_REASON) |
| 198 | ) | ||
| 188 | ); | 199 | ); |
| 189 | 200 | ||
| 190 | TRACE_EVENT(global_dirty_state, | 201 | TRACE_EVENT(global_dirty_state, |
diff --git a/include/xen/interface/io/xs_wire.h b/include/xen/interface/io/xs_wire.h index f0b6890370b..f6f07aa35af 100644 --- a/include/xen/interface/io/xs_wire.h +++ b/include/xen/interface/io/xs_wire.h | |||
| @@ -29,8 +29,7 @@ enum xsd_sockmsg_type | |||
| 29 | XS_IS_DOMAIN_INTRODUCED, | 29 | XS_IS_DOMAIN_INTRODUCED, |
| 30 | XS_RESUME, | 30 | XS_RESUME, |
| 31 | XS_SET_TARGET, | 31 | XS_SET_TARGET, |
| 32 | XS_RESTRICT, | 32 | XS_RESTRICT |
| 33 | XS_RESET_WATCHES | ||
| 34 | }; | 33 | }; |
| 35 | 34 | ||
| 36 | #define XS_WRITE_NONE "NONE" | 35 | #define XS_WRITE_NONE "NONE" |
diff --git a/ipc/mqueue.c b/ipc/mqueue.c index 2e0ecfcc881..5b4293d9819 100644 --- a/ipc/mqueue.c +++ b/ipc/mqueue.c | |||
| @@ -1269,7 +1269,7 @@ void mq_clear_sbinfo(struct ipc_namespace *ns) | |||
| 1269 | 1269 | ||
| 1270 | void mq_put_mnt(struct ipc_namespace *ns) | 1270 | void mq_put_mnt(struct ipc_namespace *ns) |
| 1271 | { | 1271 | { |
| 1272 | mntput(ns->mq_mnt); | 1272 | kern_unmount(ns->mq_mnt); |
| 1273 | } | 1273 | } |
| 1274 | 1274 | ||
| 1275 | static int __init init_mqueue_fs(void) | 1275 | static int __init init_mqueue_fs(void) |
| @@ -1291,11 +1291,9 @@ static int __init init_mqueue_fs(void) | |||
| 1291 | 1291 | ||
| 1292 | spin_lock_init(&mq_lock); | 1292 | spin_lock_init(&mq_lock); |
| 1293 | 1293 | ||
| 1294 | init_ipc_ns.mq_mnt = kern_mount_data(&mqueue_fs_type, &init_ipc_ns); | 1294 | error = mq_init_ns(&init_ipc_ns); |
| 1295 | if (IS_ERR(init_ipc_ns.mq_mnt)) { | 1295 | if (error) |
| 1296 | error = PTR_ERR(init_ipc_ns.mq_mnt); | ||
| 1297 | goto out_filesystem; | 1296 | goto out_filesystem; |
| 1298 | } | ||
| 1299 | 1297 | ||
| 1300 | return 0; | 1298 | return 0; |
| 1301 | 1299 | ||
diff --git a/ipc/msgutil.c b/ipc/msgutil.c index 8b5ce5d3f3e..5652101cdac 100644 --- a/ipc/msgutil.c +++ b/ipc/msgutil.c | |||
| @@ -27,11 +27,6 @@ DEFINE_SPINLOCK(mq_lock); | |||
| 27 | */ | 27 | */ |
| 28 | struct ipc_namespace init_ipc_ns = { | 28 | struct ipc_namespace init_ipc_ns = { |
| 29 | .count = ATOMIC_INIT(1), | 29 | .count = ATOMIC_INIT(1), |
| 30 | #ifdef CONFIG_POSIX_MQUEUE | ||
| 31 | .mq_queues_max = DFLT_QUEUESMAX, | ||
| 32 | .mq_msg_max = DFLT_MSGMAX, | ||
| 33 | .mq_msgsize_max = DFLT_MSGSIZEMAX, | ||
| 34 | #endif | ||
| 35 | .user_ns = &init_user_ns, | 30 | .user_ns = &init_user_ns, |
| 36 | }; | 31 | }; |
| 37 | 32 | ||
diff --git a/kernel/cgroup.c b/kernel/cgroup.c index d9d5648f3cd..a184470cf9b 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c | |||
| @@ -2098,11 +2098,6 @@ int cgroup_attach_proc(struct cgroup *cgrp, struct task_struct *leader) | |||
| 2098 | continue; | 2098 | continue; |
| 2099 | /* get old css_set pointer */ | 2099 | /* get old css_set pointer */ |
| 2100 | task_lock(tsk); | 2100 | task_lock(tsk); |
| 2101 | if (tsk->flags & PF_EXITING) { | ||
| 2102 | /* ignore this task if it's going away */ | ||
| 2103 | task_unlock(tsk); | ||
| 2104 | continue; | ||
| 2105 | } | ||
| 2106 | oldcg = tsk->cgroups; | 2101 | oldcg = tsk->cgroups; |
| 2107 | get_css_set(oldcg); | 2102 | get_css_set(oldcg); |
| 2108 | task_unlock(tsk); | 2103 | task_unlock(tsk); |
diff --git a/kernel/cpuset.c b/kernel/cpuset.c index 9fe58c46a42..0b1712dba58 100644 --- a/kernel/cpuset.c +++ b/kernel/cpuset.c | |||
| @@ -123,6 +123,19 @@ static inline struct cpuset *task_cs(struct task_struct *task) | |||
| 123 | struct cpuset, css); | 123 | struct cpuset, css); |
| 124 | } | 124 | } |
| 125 | 125 | ||
| 126 | #ifdef CONFIG_NUMA | ||
| 127 | static inline bool task_has_mempolicy(struct task_struct *task) | ||
| 128 | { | ||
| 129 | return task->mempolicy; | ||
| 130 | } | ||
| 131 | #else | ||
| 132 | static inline bool task_has_mempolicy(struct task_struct *task) | ||
| 133 | { | ||
| 134 | return false; | ||
| 135 | } | ||
| 136 | #endif | ||
| 137 | |||
| 138 | |||
| 126 | /* bits in struct cpuset flags field */ | 139 | /* bits in struct cpuset flags field */ |
| 127 | typedef enum { | 140 | typedef enum { |
| 128 | CS_CPU_EXCLUSIVE, | 141 | CS_CPU_EXCLUSIVE, |
| @@ -949,7 +962,7 @@ static void cpuset_migrate_mm(struct mm_struct *mm, const nodemask_t *from, | |||
| 949 | static void cpuset_change_task_nodemask(struct task_struct *tsk, | 962 | static void cpuset_change_task_nodemask(struct task_struct *tsk, |
| 950 | nodemask_t *newmems) | 963 | nodemask_t *newmems) |
| 951 | { | 964 | { |
| 952 | bool masks_disjoint = !nodes_intersects(*newmems, tsk->mems_allowed); | 965 | bool need_loop; |
| 953 | 966 | ||
| 954 | repeat: | 967 | repeat: |
| 955 | /* | 968 | /* |
| @@ -962,6 +975,14 @@ repeat: | |||
| 962 | return; | 975 | return; |
| 963 | 976 | ||
| 964 | task_lock(tsk); | 977 | task_lock(tsk); |
| 978 | /* | ||
| 979 | * Determine if a loop is necessary if another thread is doing | ||
| 980 | * get_mems_allowed(). If at least one node remains unchanged and | ||
| 981 | * tsk does not have a mempolicy, then an empty nodemask will not be | ||
| 982 | * possible when mems_allowed is larger than a word. | ||
| 983 | */ | ||
| 984 | need_loop = task_has_mempolicy(tsk) || | ||
| 985 | !nodes_intersects(*newmems, tsk->mems_allowed); | ||
| 965 | nodes_or(tsk->mems_allowed, tsk->mems_allowed, *newmems); | 986 | nodes_or(tsk->mems_allowed, tsk->mems_allowed, *newmems); |
| 966 | mpol_rebind_task(tsk, newmems, MPOL_REBIND_STEP1); | 987 | mpol_rebind_task(tsk, newmems, MPOL_REBIND_STEP1); |
| 967 | 988 | ||
| @@ -981,11 +1002,9 @@ repeat: | |||
| 981 | 1002 | ||
| 982 | /* | 1003 | /* |
| 983 | * Allocation of memory is very fast, we needn't sleep when waiting | 1004 | * Allocation of memory is very fast, we needn't sleep when waiting |
| 984 | * for the read-side. No wait is necessary, however, if at least one | 1005 | * for the read-side. |
| 985 | * node remains unchanged. | ||
| 986 | */ | 1006 | */ |
| 987 | while (masks_disjoint && | 1007 | while (need_loop && ACCESS_ONCE(tsk->mems_allowed_change_disable)) { |
| 988 | ACCESS_ONCE(tsk->mems_allowed_change_disable)) { | ||
| 989 | task_unlock(tsk); | 1008 | task_unlock(tsk); |
| 990 | if (!task_curr(tsk)) | 1009 | if (!task_curr(tsk)) |
| 991 | yield(); | 1010 | yield(); |
diff --git a/kernel/events/core.c b/kernel/events/core.c index d3b9df5962c..58690af323e 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
| @@ -3558,9 +3558,13 @@ static void ring_buffer_wakeup(struct perf_event *event) | |||
| 3558 | 3558 | ||
| 3559 | rcu_read_lock(); | 3559 | rcu_read_lock(); |
| 3560 | rb = rcu_dereference(event->rb); | 3560 | rb = rcu_dereference(event->rb); |
| 3561 | list_for_each_entry_rcu(event, &rb->event_list, rb_entry) { | 3561 | if (!rb) |
| 3562 | goto unlock; | ||
| 3563 | |||
| 3564 | list_for_each_entry_rcu(event, &rb->event_list, rb_entry) | ||
| 3562 | wake_up_all(&event->waitq); | 3565 | wake_up_all(&event->waitq); |
| 3563 | } | 3566 | |
| 3567 | unlock: | ||
| 3564 | rcu_read_unlock(); | 3568 | rcu_read_unlock(); |
| 3565 | } | 3569 | } |
| 3566 | 3570 | ||
diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c index a78ed2736ba..8a39fa3e3c6 100644 --- a/kernel/sched_fair.c +++ b/kernel/sched_fair.c | |||
| @@ -2352,13 +2352,11 @@ again: | |||
| 2352 | if (!smt && (sd->flags & SD_SHARE_CPUPOWER)) | 2352 | if (!smt && (sd->flags & SD_SHARE_CPUPOWER)) |
| 2353 | continue; | 2353 | continue; |
| 2354 | 2354 | ||
| 2355 | if (!(sd->flags & SD_SHARE_PKG_RESOURCES)) { | 2355 | if (smt && !(sd->flags & SD_SHARE_CPUPOWER)) |
| 2356 | if (!smt) { | 2356 | break; |
| 2357 | smt = 1; | 2357 | |
| 2358 | goto again; | 2358 | if (!(sd->flags & SD_SHARE_PKG_RESOURCES)) |
| 2359 | } | ||
| 2360 | break; | 2359 | break; |
| 2361 | } | ||
| 2362 | 2360 | ||
| 2363 | sg = sd->groups; | 2361 | sg = sd->groups; |
| 2364 | do { | 2362 | do { |
| @@ -2378,6 +2376,10 @@ next: | |||
| 2378 | sg = sg->next; | 2376 | sg = sg->next; |
| 2379 | } while (sg != sd->groups); | 2377 | } while (sg != sd->groups); |
| 2380 | } | 2378 | } |
| 2379 | if (!smt) { | ||
| 2380 | smt = 1; | ||
| 2381 | goto again; | ||
| 2382 | } | ||
| 2381 | done: | 2383 | done: |
| 2382 | rcu_read_unlock(); | 2384 | rcu_read_unlock(); |
| 2383 | 2385 | ||
diff --git a/kernel/sysctl_binary.c b/kernel/sysctl_binary.c index 6318b511afa..a650694883a 100644 --- a/kernel/sysctl_binary.c +++ b/kernel/sysctl_binary.c | |||
| @@ -1354,7 +1354,7 @@ static ssize_t binary_sysctl(const int *name, int nlen, | |||
| 1354 | 1354 | ||
| 1355 | fput(file); | 1355 | fput(file); |
| 1356 | out_putname: | 1356 | out_putname: |
| 1357 | putname(pathname); | 1357 | __putname(pathname); |
| 1358 | out: | 1358 | out: |
| 1359 | return result; | 1359 | return result; |
| 1360 | } | 1360 | } |
diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c index da2f760e780..d3ad022136e 100644 --- a/kernel/time/clocksource.c +++ b/kernel/time/clocksource.c | |||
| @@ -647,7 +647,7 @@ static void clocksource_enqueue(struct clocksource *cs) | |||
| 647 | 647 | ||
| 648 | /** | 648 | /** |
| 649 | * __clocksource_updatefreq_scale - Used update clocksource with new freq | 649 | * __clocksource_updatefreq_scale - Used update clocksource with new freq |
| 650 | * @t: clocksource to be registered | 650 | * @cs: clocksource to be registered |
| 651 | * @scale: Scale factor multiplied against freq to get clocksource hz | 651 | * @scale: Scale factor multiplied against freq to get clocksource hz |
| 652 | * @freq: clocksource frequency (cycles per second) divided by scale | 652 | * @freq: clocksource frequency (cycles per second) divided by scale |
| 653 | * | 653 | * |
| @@ -699,7 +699,7 @@ EXPORT_SYMBOL_GPL(__clocksource_updatefreq_scale); | |||
| 699 | 699 | ||
| 700 | /** | 700 | /** |
| 701 | * __clocksource_register_scale - Used to install new clocksources | 701 | * __clocksource_register_scale - Used to install new clocksources |
| 702 | * @t: clocksource to be registered | 702 | * @cs: clocksource to be registered |
| 703 | * @scale: Scale factor multiplied against freq to get clocksource hz | 703 | * @scale: Scale factor multiplied against freq to get clocksource hz |
| 704 | * @freq: clocksource frequency (cycles per second) divided by scale | 704 | * @freq: clocksource frequency (cycles per second) divided by scale |
| 705 | * | 705 | * |
| @@ -727,7 +727,7 @@ EXPORT_SYMBOL_GPL(__clocksource_register_scale); | |||
| 727 | 727 | ||
| 728 | /** | 728 | /** |
| 729 | * clocksource_register - Used to install new clocksources | 729 | * clocksource_register - Used to install new clocksources |
| 730 | * @t: clocksource to be registered | 730 | * @cs: clocksource to be registered |
| 731 | * | 731 | * |
| 732 | * Returns -EBUSY if registration fails, zero otherwise. | 732 | * Returns -EBUSY if registration fails, zero otherwise. |
| 733 | */ | 733 | */ |
| @@ -761,6 +761,8 @@ static void __clocksource_change_rating(struct clocksource *cs, int rating) | |||
| 761 | 761 | ||
| 762 | /** | 762 | /** |
| 763 | * clocksource_change_rating - Change the rating of a registered clocksource | 763 | * clocksource_change_rating - Change the rating of a registered clocksource |
| 764 | * @cs: clocksource to be changed | ||
| 765 | * @rating: new rating | ||
| 764 | */ | 766 | */ |
| 765 | void clocksource_change_rating(struct clocksource *cs, int rating) | 767 | void clocksource_change_rating(struct clocksource *cs, int rating) |
| 766 | { | 768 | { |
| @@ -772,6 +774,7 @@ EXPORT_SYMBOL(clocksource_change_rating); | |||
| 772 | 774 | ||
| 773 | /** | 775 | /** |
| 774 | * clocksource_unregister - remove a registered clocksource | 776 | * clocksource_unregister - remove a registered clocksource |
| 777 | * @cs: clocksource to be unregistered | ||
| 775 | */ | 778 | */ |
| 776 | void clocksource_unregister(struct clocksource *cs) | 779 | void clocksource_unregister(struct clocksource *cs) |
| 777 | { | 780 | { |
| @@ -787,6 +790,7 @@ EXPORT_SYMBOL(clocksource_unregister); | |||
| 787 | /** | 790 | /** |
| 788 | * sysfs_show_current_clocksources - sysfs interface for current clocksource | 791 | * sysfs_show_current_clocksources - sysfs interface for current clocksource |
| 789 | * @dev: unused | 792 | * @dev: unused |
| 793 | * @attr: unused | ||
| 790 | * @buf: char buffer to be filled with clocksource list | 794 | * @buf: char buffer to be filled with clocksource list |
| 791 | * | 795 | * |
| 792 | * Provides sysfs interface for listing current clocksource. | 796 | * Provides sysfs interface for listing current clocksource. |
| @@ -807,6 +811,7 @@ sysfs_show_current_clocksources(struct sys_device *dev, | |||
| 807 | /** | 811 | /** |
| 808 | * sysfs_override_clocksource - interface for manually overriding clocksource | 812 | * sysfs_override_clocksource - interface for manually overriding clocksource |
| 809 | * @dev: unused | 813 | * @dev: unused |
| 814 | * @attr: unused | ||
| 810 | * @buf: name of override clocksource | 815 | * @buf: name of override clocksource |
| 811 | * @count: length of buffer | 816 | * @count: length of buffer |
| 812 | * | 817 | * |
| @@ -842,6 +847,7 @@ static ssize_t sysfs_override_clocksource(struct sys_device *dev, | |||
| 842 | /** | 847 | /** |
| 843 | * sysfs_show_available_clocksources - sysfs interface for listing clocksource | 848 | * sysfs_show_available_clocksources - sysfs interface for listing clocksource |
| 844 | * @dev: unused | 849 | * @dev: unused |
| 850 | * @attr: unused | ||
| 845 | * @buf: char buffer to be filled with clocksource list | 851 | * @buf: char buffer to be filled with clocksource list |
| 846 | * | 852 | * |
| 847 | * Provides sysfs interface for listing registered clocksources | 853 | * Provides sysfs interface for listing registered clocksources |
diff --git a/mm/filemap.c b/mm/filemap.c index c0018f2d50e..5f0a3c91fda 100644 --- a/mm/filemap.c +++ b/mm/filemap.c | |||
| @@ -1828,7 +1828,7 @@ repeat: | |||
| 1828 | page = __page_cache_alloc(gfp | __GFP_COLD); | 1828 | page = __page_cache_alloc(gfp | __GFP_COLD); |
| 1829 | if (!page) | 1829 | if (!page) |
| 1830 | return ERR_PTR(-ENOMEM); | 1830 | return ERR_PTR(-ENOMEM); |
| 1831 | err = add_to_page_cache_lru(page, mapping, index, GFP_KERNEL); | 1831 | err = add_to_page_cache_lru(page, mapping, index, gfp); |
| 1832 | if (unlikely(err)) { | 1832 | if (unlikely(err)) { |
| 1833 | page_cache_release(page); | 1833 | page_cache_release(page); |
| 1834 | if (err == -EEXIST) | 1834 | if (err == -EEXIST) |
| @@ -1925,10 +1925,7 @@ static struct page *wait_on_page_read(struct page *page) | |||
| 1925 | * @gfp: the page allocator flags to use if allocating | 1925 | * @gfp: the page allocator flags to use if allocating |
| 1926 | * | 1926 | * |
| 1927 | * This is the same as "read_mapping_page(mapping, index, NULL)", but with | 1927 | * This is the same as "read_mapping_page(mapping, index, NULL)", but with |
| 1928 | * any new page allocations done using the specified allocation flags. Note | 1928 | * any new page allocations done using the specified allocation flags. |
| 1929 | * that the Radix tree operations will still use GFP_KERNEL, so you can't | ||
| 1930 | * expect to do this atomically or anything like that - but you can pass in | ||
| 1931 | * other page requirements. | ||
| 1932 | * | 1929 | * |
| 1933 | * If the page does not get brought uptodate, return -EIO. | 1930 | * If the page does not get brought uptodate, return -EIO. |
| 1934 | */ | 1931 | */ |
| @@ -2407,7 +2404,6 @@ static ssize_t generic_perform_write(struct file *file, | |||
| 2407 | iov_iter_count(i)); | 2404 | iov_iter_count(i)); |
| 2408 | 2405 | ||
| 2409 | again: | 2406 | again: |
| 2410 | |||
| 2411 | /* | 2407 | /* |
| 2412 | * Bring in the user page that we will copy from _first_. | 2408 | * Bring in the user page that we will copy from _first_. |
| 2413 | * Otherwise there's a nasty deadlock on copying from the | 2409 | * Otherwise there's a nasty deadlock on copying from the |
| @@ -2463,7 +2459,10 @@ again: | |||
| 2463 | written += copied; | 2459 | written += copied; |
| 2464 | 2460 | ||
| 2465 | balance_dirty_pages_ratelimited(mapping); | 2461 | balance_dirty_pages_ratelimited(mapping); |
| 2466 | 2462 | if (fatal_signal_pending(current)) { | |
| 2463 | status = -EINTR; | ||
| 2464 | break; | ||
| 2465 | } | ||
| 2467 | } while (iov_iter_count(i)); | 2466 | } while (iov_iter_count(i)); |
| 2468 | 2467 | ||
| 2469 | return written ? written : status; | 2468 | return written ? written : status; |
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 6aff93c98ac..b63f5f7dfa0 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
| @@ -4907,9 +4907,9 @@ mem_cgroup_create(struct cgroup_subsys *ss, struct cgroup *cont) | |||
| 4907 | int cpu; | 4907 | int cpu; |
| 4908 | enable_swap_cgroup(); | 4908 | enable_swap_cgroup(); |
| 4909 | parent = NULL; | 4909 | parent = NULL; |
| 4910 | root_mem_cgroup = memcg; | ||
| 4911 | if (mem_cgroup_soft_limit_tree_init()) | 4910 | if (mem_cgroup_soft_limit_tree_init()) |
| 4912 | goto free_out; | 4911 | goto free_out; |
| 4912 | root_mem_cgroup = memcg; | ||
| 4913 | for_each_possible_cpu(cpu) { | 4913 | for_each_possible_cpu(cpu) { |
| 4914 | struct memcg_stock_pcp *stock = | 4914 | struct memcg_stock_pcp *stock = |
| 4915 | &per_cpu(memcg_stock, cpu); | 4915 | &per_cpu(memcg_stock, cpu); |
| @@ -4948,7 +4948,6 @@ mem_cgroup_create(struct cgroup_subsys *ss, struct cgroup *cont) | |||
| 4948 | return &memcg->css; | 4948 | return &memcg->css; |
| 4949 | free_out: | 4949 | free_out: |
| 4950 | __mem_cgroup_free(memcg); | 4950 | __mem_cgroup_free(memcg); |
| 4951 | root_mem_cgroup = NULL; | ||
| 4952 | return ERR_PTR(error); | 4951 | return ERR_PTR(error); |
| 4953 | } | 4952 | } |
| 4954 | 4953 | ||
diff --git a/mm/oom_kill.c b/mm/oom_kill.c index 76f2c5ae908..069b64e521f 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c | |||
| @@ -176,7 +176,7 @@ static bool oom_unkillable_task(struct task_struct *p, | |||
| 176 | unsigned int oom_badness(struct task_struct *p, struct mem_cgroup *mem, | 176 | unsigned int oom_badness(struct task_struct *p, struct mem_cgroup *mem, |
| 177 | const nodemask_t *nodemask, unsigned long totalpages) | 177 | const nodemask_t *nodemask, unsigned long totalpages) |
| 178 | { | 178 | { |
| 179 | int points; | 179 | long points; |
| 180 | 180 | ||
| 181 | if (oom_unkillable_task(p, mem, nodemask)) | 181 | if (oom_unkillable_task(p, mem, nodemask)) |
| 182 | return 0; | 182 | return 0; |
diff --git a/mm/page-writeback.c b/mm/page-writeback.c index 71252486bc6..50f08241f98 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c | |||
| @@ -411,8 +411,13 @@ void global_dirty_limits(unsigned long *pbackground, unsigned long *pdirty) | |||
| 411 | * | 411 | * |
| 412 | * Returns @bdi's dirty limit in pages. The term "dirty" in the context of | 412 | * Returns @bdi's dirty limit in pages. The term "dirty" in the context of |
| 413 | * dirty balancing includes all PG_dirty, PG_writeback and NFS unstable pages. | 413 | * dirty balancing includes all PG_dirty, PG_writeback and NFS unstable pages. |
| 414 | * And the "limit" in the name is not seriously taken as hard limit in | 414 | * |
| 415 | * balance_dirty_pages(). | 415 | * Note that balance_dirty_pages() will only seriously take it as a hard limit |
| 416 | * when sleeping max_pause per page is not enough to keep the dirty pages under | ||
| 417 | * control. For example, when the device is completely stalled due to some error | ||
| 418 | * conditions, or when there are 1000 dd tasks writing to a slow 10MB/s USB key. | ||
| 419 | * In the other normal situations, it acts more gently by throttling the tasks | ||
| 420 | * more (rather than completely block them) when the bdi dirty pages go high. | ||
| 416 | * | 421 | * |
| 417 | * It allocates high/low dirty limits to fast/slow devices, in order to prevent | 422 | * It allocates high/low dirty limits to fast/slow devices, in order to prevent |
| 418 | * - starving fast devices | 423 | * - starving fast devices |
| @@ -594,6 +599,13 @@ static unsigned long bdi_position_ratio(struct backing_dev_info *bdi, | |||
| 594 | */ | 599 | */ |
| 595 | if (unlikely(bdi_thresh > thresh)) | 600 | if (unlikely(bdi_thresh > thresh)) |
| 596 | bdi_thresh = thresh; | 601 | bdi_thresh = thresh; |
| 602 | /* | ||
| 603 | * It's very possible that bdi_thresh is close to 0 not because the | ||
| 604 | * device is slow, but that it has remained inactive for long time. | ||
| 605 | * Honour such devices a reasonable good (hopefully IO efficient) | ||
| 606 | * threshold, so that the occasional writes won't be blocked and active | ||
| 607 | * writes can rampup the threshold quickly. | ||
| 608 | */ | ||
| 597 | bdi_thresh = max(bdi_thresh, (limit - dirty) / 8); | 609 | bdi_thresh = max(bdi_thresh, (limit - dirty) / 8); |
| 598 | /* | 610 | /* |
| 599 | * scale global setpoint to bdi's: | 611 | * scale global setpoint to bdi's: |
| @@ -977,8 +989,7 @@ static unsigned long bdi_max_pause(struct backing_dev_info *bdi, | |||
| 977 | * | 989 | * |
| 978 | * 8 serves as the safety ratio. | 990 | * 8 serves as the safety ratio. |
| 979 | */ | 991 | */ |
| 980 | if (bdi_dirty) | 992 | t = min(t, bdi_dirty * HZ / (8 * bw + 1)); |
| 981 | t = min(t, bdi_dirty * HZ / (8 * bw + 1)); | ||
| 982 | 993 | ||
| 983 | /* | 994 | /* |
| 984 | * The pause time will be settled within range (max_pause/4, max_pause). | 995 | * The pause time will be settled within range (max_pause/4, max_pause). |
| @@ -1136,6 +1147,19 @@ pause: | |||
| 1136 | if (task_ratelimit) | 1147 | if (task_ratelimit) |
| 1137 | break; | 1148 | break; |
| 1138 | 1149 | ||
| 1150 | /* | ||
| 1151 | * In the case of an unresponding NFS server and the NFS dirty | ||
| 1152 | * pages exceeds dirty_thresh, give the other good bdi's a pipe | ||
| 1153 | * to go through, so that tasks on them still remain responsive. | ||
| 1154 | * | ||
| 1155 | * In theory 1 page is enough to keep the comsumer-producer | ||
| 1156 | * pipe going: the flusher cleans 1 page => the task dirties 1 | ||
| 1157 | * more page. However bdi_dirty has accounting errors. So use | ||
| 1158 | * the larger and more IO friendly bdi_stat_error. | ||
| 1159 | */ | ||
| 1160 | if (bdi_dirty <= bdi_stat_error(bdi)) | ||
| 1161 | break; | ||
| 1162 | |||
| 1139 | if (fatal_signal_pending(current)) | 1163 | if (fatal_signal_pending(current)) |
| 1140 | break; | 1164 | break; |
| 1141 | } | 1165 | } |
diff --git a/mm/percpu.c b/mm/percpu.c index 3bb810a7200..716eb4acf2f 100644 --- a/mm/percpu.c +++ b/mm/percpu.c | |||
| @@ -1023,9 +1023,11 @@ phys_addr_t per_cpu_ptr_to_phys(void *addr) | |||
| 1023 | if (!is_vmalloc_addr(addr)) | 1023 | if (!is_vmalloc_addr(addr)) |
| 1024 | return __pa(addr); | 1024 | return __pa(addr); |
| 1025 | else | 1025 | else |
| 1026 | return page_to_phys(vmalloc_to_page(addr)); | 1026 | return page_to_phys(vmalloc_to_page(addr)) + |
| 1027 | offset_in_page(addr); | ||
| 1027 | } else | 1028 | } else |
| 1028 | return page_to_phys(pcpu_addr_to_page(addr)); | 1029 | return page_to_phys(pcpu_addr_to_page(addr)) + |
| 1030 | offset_in_page(addr); | ||
| 1029 | } | 1031 | } |
| 1030 | 1032 | ||
| 1031 | /** | 1033 | /** |
diff --git a/mm/vmalloc.c b/mm/vmalloc.c index f87577042a8..21fdf46ad5a 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c | |||
| @@ -1315,7 +1315,7 @@ static struct vm_struct *__get_vm_area_node(unsigned long size, | |||
| 1315 | unsigned long align, unsigned long flags, unsigned long start, | 1315 | unsigned long align, unsigned long flags, unsigned long start, |
| 1316 | unsigned long end, int node, gfp_t gfp_mask, void *caller) | 1316 | unsigned long end, int node, gfp_t gfp_mask, void *caller) |
| 1317 | { | 1317 | { |
| 1318 | static struct vmap_area *va; | 1318 | struct vmap_area *va; |
| 1319 | struct vm_struct *area; | 1319 | struct vm_struct *area; |
| 1320 | 1320 | ||
| 1321 | BUG_ON(in_interrupt()); | 1321 | BUG_ON(in_interrupt()); |
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c index c7aafc7c5ed..5f09a578d49 100644 --- a/net/batman-adv/translation-table.c +++ b/net/batman-adv/translation-table.c | |||
| @@ -245,9 +245,11 @@ void tt_local_add(struct net_device *soft_iface, const uint8_t *addr, | |||
| 245 | if (tt_global_entry) { | 245 | if (tt_global_entry) { |
| 246 | /* This node is probably going to update its tt table */ | 246 | /* This node is probably going to update its tt table */ |
| 247 | tt_global_entry->orig_node->tt_poss_change = true; | 247 | tt_global_entry->orig_node->tt_poss_change = true; |
| 248 | /* The global entry has to be marked as PENDING and has to be | 248 | /* The global entry has to be marked as ROAMING and has to be |
| 249 | * kept for consistency purpose */ | 249 | * kept for consistency purpose */ |
| 250 | tt_global_entry->flags |= TT_CLIENT_PENDING; | 250 | tt_global_entry->flags |= TT_CLIENT_ROAM; |
| 251 | tt_global_entry->roam_at = jiffies; | ||
| 252 | |||
| 251 | send_roam_adv(bat_priv, tt_global_entry->addr, | 253 | send_roam_adv(bat_priv, tt_global_entry->addr, |
| 252 | tt_global_entry->orig_node); | 254 | tt_global_entry->orig_node); |
| 253 | } | 255 | } |
| @@ -694,6 +696,7 @@ void tt_global_del(struct bat_priv *bat_priv, | |||
| 694 | const char *message, bool roaming) | 696 | const char *message, bool roaming) |
| 695 | { | 697 | { |
| 696 | struct tt_global_entry *tt_global_entry = NULL; | 698 | struct tt_global_entry *tt_global_entry = NULL; |
| 699 | struct tt_local_entry *tt_local_entry = NULL; | ||
| 697 | 700 | ||
| 698 | tt_global_entry = tt_global_hash_find(bat_priv, addr); | 701 | tt_global_entry = tt_global_hash_find(bat_priv, addr); |
| 699 | if (!tt_global_entry) | 702 | if (!tt_global_entry) |
| @@ -701,15 +704,29 @@ void tt_global_del(struct bat_priv *bat_priv, | |||
| 701 | 704 | ||
| 702 | if (tt_global_entry->orig_node == orig_node) { | 705 | if (tt_global_entry->orig_node == orig_node) { |
| 703 | if (roaming) { | 706 | if (roaming) { |
| 704 | tt_global_entry->flags |= TT_CLIENT_ROAM; | 707 | /* if we are deleting a global entry due to a roam |
| 705 | tt_global_entry->roam_at = jiffies; | 708 | * event, there are two possibilities: |
| 706 | goto out; | 709 | * 1) the client roamed from node A to node B => we mark |
| 710 | * it with TT_CLIENT_ROAM, we start a timer and we | ||
| 711 | * wait for node B to claim it. In case of timeout | ||
| 712 | * the entry is purged. | ||
| 713 | * 2) the client roamed to us => we can directly delete | ||
| 714 | * the global entry, since it is useless now. */ | ||
| 715 | tt_local_entry = tt_local_hash_find(bat_priv, | ||
| 716 | tt_global_entry->addr); | ||
| 717 | if (!tt_local_entry) { | ||
| 718 | tt_global_entry->flags |= TT_CLIENT_ROAM; | ||
| 719 | tt_global_entry->roam_at = jiffies; | ||
| 720 | goto out; | ||
| 721 | } | ||
| 707 | } | 722 | } |
| 708 | _tt_global_del(bat_priv, tt_global_entry, message); | 723 | _tt_global_del(bat_priv, tt_global_entry, message); |
| 709 | } | 724 | } |
| 710 | out: | 725 | out: |
| 711 | if (tt_global_entry) | 726 | if (tt_global_entry) |
| 712 | tt_global_entry_free_ref(tt_global_entry); | 727 | tt_global_entry_free_ref(tt_global_entry); |
| 728 | if (tt_local_entry) | ||
| 729 | tt_local_entry_free_ref(tt_local_entry); | ||
| 713 | } | 730 | } |
| 714 | 731 | ||
| 715 | void tt_global_del_orig(struct bat_priv *bat_priv, | 732 | void tt_global_del_orig(struct bat_priv *bat_priv, |
diff --git a/net/bluetooth/bnep/core.c b/net/bluetooth/bnep/core.c index 91bcd3a961e..1eea8208b2c 100644 --- a/net/bluetooth/bnep/core.c +++ b/net/bluetooth/bnep/core.c | |||
| @@ -79,17 +79,12 @@ static struct bnep_session *__bnep_get_session(u8 *dst) | |||
| 79 | 79 | ||
| 80 | static void __bnep_link_session(struct bnep_session *s) | 80 | static void __bnep_link_session(struct bnep_session *s) |
| 81 | { | 81 | { |
| 82 | /* It's safe to call __module_get() here because sessions are added | ||
| 83 | by the socket layer which has to hold the reference to this module. | ||
| 84 | */ | ||
| 85 | __module_get(THIS_MODULE); | ||
| 86 | list_add(&s->list, &bnep_session_list); | 82 | list_add(&s->list, &bnep_session_list); |
| 87 | } | 83 | } |
| 88 | 84 | ||
| 89 | static void __bnep_unlink_session(struct bnep_session *s) | 85 | static void __bnep_unlink_session(struct bnep_session *s) |
| 90 | { | 86 | { |
| 91 | list_del(&s->list); | 87 | list_del(&s->list); |
| 92 | module_put(THIS_MODULE); | ||
| 93 | } | 88 | } |
| 94 | 89 | ||
| 95 | static int bnep_send(struct bnep_session *s, void *data, size_t len) | 90 | static int bnep_send(struct bnep_session *s, void *data, size_t len) |
| @@ -530,6 +525,7 @@ static int bnep_session(void *arg) | |||
| 530 | 525 | ||
| 531 | up_write(&bnep_session_sem); | 526 | up_write(&bnep_session_sem); |
| 532 | free_netdev(dev); | 527 | free_netdev(dev); |
| 528 | module_put_and_exit(0); | ||
| 533 | return 0; | 529 | return 0; |
| 534 | } | 530 | } |
| 535 | 531 | ||
| @@ -616,9 +612,11 @@ int bnep_add_connection(struct bnep_connadd_req *req, struct socket *sock) | |||
| 616 | 612 | ||
| 617 | __bnep_link_session(s); | 613 | __bnep_link_session(s); |
| 618 | 614 | ||
| 615 | __module_get(THIS_MODULE); | ||
| 619 | s->task = kthread_run(bnep_session, s, "kbnepd %s", dev->name); | 616 | s->task = kthread_run(bnep_session, s, "kbnepd %s", dev->name); |
| 620 | if (IS_ERR(s->task)) { | 617 | if (IS_ERR(s->task)) { |
| 621 | /* Session thread start failed, gotta cleanup. */ | 618 | /* Session thread start failed, gotta cleanup. */ |
| 619 | module_put(THIS_MODULE); | ||
| 622 | unregister_netdev(dev); | 620 | unregister_netdev(dev); |
| 623 | __bnep_unlink_session(s); | 621 | __bnep_unlink_session(s); |
| 624 | err = PTR_ERR(s->task); | 622 | err = PTR_ERR(s->task); |
diff --git a/net/bluetooth/cmtp/core.c b/net/bluetooth/cmtp/core.c index 7d00ddf9e9d..5a6e634f7fc 100644 --- a/net/bluetooth/cmtp/core.c +++ b/net/bluetooth/cmtp/core.c | |||
| @@ -67,14 +67,12 @@ static struct cmtp_session *__cmtp_get_session(bdaddr_t *bdaddr) | |||
| 67 | 67 | ||
| 68 | static void __cmtp_link_session(struct cmtp_session *session) | 68 | static void __cmtp_link_session(struct cmtp_session *session) |
| 69 | { | 69 | { |
| 70 | __module_get(THIS_MODULE); | ||
| 71 | list_add(&session->list, &cmtp_session_list); | 70 | list_add(&session->list, &cmtp_session_list); |
| 72 | } | 71 | } |
| 73 | 72 | ||
| 74 | static void __cmtp_unlink_session(struct cmtp_session *session) | 73 | static void __cmtp_unlink_session(struct cmtp_session *session) |
| 75 | { | 74 | { |
| 76 | list_del(&session->list); | 75 | list_del(&session->list); |
| 77 | module_put(THIS_MODULE); | ||
| 78 | } | 76 | } |
| 79 | 77 | ||
| 80 | static void __cmtp_copy_session(struct cmtp_session *session, struct cmtp_conninfo *ci) | 78 | static void __cmtp_copy_session(struct cmtp_session *session, struct cmtp_conninfo *ci) |
| @@ -327,6 +325,7 @@ static int cmtp_session(void *arg) | |||
| 327 | up_write(&cmtp_session_sem); | 325 | up_write(&cmtp_session_sem); |
| 328 | 326 | ||
| 329 | kfree(session); | 327 | kfree(session); |
| 328 | module_put_and_exit(0); | ||
| 330 | return 0; | 329 | return 0; |
| 331 | } | 330 | } |
| 332 | 331 | ||
| @@ -376,9 +375,11 @@ int cmtp_add_connection(struct cmtp_connadd_req *req, struct socket *sock) | |||
| 376 | 375 | ||
| 377 | __cmtp_link_session(session); | 376 | __cmtp_link_session(session); |
| 378 | 377 | ||
| 378 | __module_get(THIS_MODULE); | ||
| 379 | session->task = kthread_run(cmtp_session, session, "kcmtpd_ctr_%d", | 379 | session->task = kthread_run(cmtp_session, session, "kcmtpd_ctr_%d", |
| 380 | session->num); | 380 | session->num); |
| 381 | if (IS_ERR(session->task)) { | 381 | if (IS_ERR(session->task)) { |
| 382 | module_put(THIS_MODULE); | ||
| 382 | err = PTR_ERR(session->task); | 383 | err = PTR_ERR(session->task); |
| 383 | goto unlink; | 384 | goto unlink; |
| 384 | } | 385 | } |
diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c index e0af7237cd9..c1c597e3e19 100644 --- a/net/bluetooth/hci_conn.c +++ b/net/bluetooth/hci_conn.c | |||
| @@ -673,7 +673,7 @@ int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type) | |||
| 673 | goto encrypt; | 673 | goto encrypt; |
| 674 | 674 | ||
| 675 | auth: | 675 | auth: |
| 676 | if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend)) | 676 | if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend)) |
| 677 | return 0; | 677 | return 0; |
| 678 | 678 | ||
| 679 | if (!hci_conn_auth(conn, sec_level, auth_type)) | 679 | if (!hci_conn_auth(conn, sec_level, auth_type)) |
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index d7d96b6b1f0..643a41b76e2 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c | |||
| @@ -545,7 +545,7 @@ static void hci_setup(struct hci_dev *hdev) | |||
| 545 | { | 545 | { |
| 546 | hci_setup_event_mask(hdev); | 546 | hci_setup_event_mask(hdev); |
| 547 | 547 | ||
| 548 | if (hdev->lmp_ver > 1) | 548 | if (hdev->hci_ver > 1) |
| 549 | hci_send_cmd(hdev, HCI_OP_READ_LOCAL_COMMANDS, 0, NULL); | 549 | hci_send_cmd(hdev, HCI_OP_READ_LOCAL_COMMANDS, 0, NULL); |
| 550 | 550 | ||
| 551 | if (hdev->features[6] & LMP_SIMPLE_PAIR) { | 551 | if (hdev->features[6] & LMP_SIMPLE_PAIR) { |
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index 5ea94a1eecf..17b5b1cd965 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c | |||
| @@ -2152,7 +2152,7 @@ static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len, voi | |||
| 2152 | void *ptr = req->data; | 2152 | void *ptr = req->data; |
| 2153 | int type, olen; | 2153 | int type, olen; |
| 2154 | unsigned long val; | 2154 | unsigned long val; |
| 2155 | struct l2cap_conf_rfc rfc; | 2155 | struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC }; |
| 2156 | 2156 | ||
| 2157 | BT_DBG("chan %p, rsp %p, len %d, req %p", chan, rsp, len, data); | 2157 | BT_DBG("chan %p, rsp %p, len %d, req %p", chan, rsp, len, data); |
| 2158 | 2158 | ||
| @@ -2271,6 +2271,16 @@ static void l2cap_conf_rfc_get(struct l2cap_chan *chan, void *rsp, int len) | |||
| 2271 | } | 2271 | } |
| 2272 | } | 2272 | } |
| 2273 | 2273 | ||
| 2274 | /* Use sane default values in case a misbehaving remote device | ||
| 2275 | * did not send an RFC option. | ||
| 2276 | */ | ||
| 2277 | rfc.mode = chan->mode; | ||
| 2278 | rfc.retrans_timeout = cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO); | ||
| 2279 | rfc.monitor_timeout = cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO); | ||
| 2280 | rfc.max_pdu_size = cpu_to_le16(chan->imtu); | ||
| 2281 | |||
| 2282 | BT_ERR("Expected RFC option was not found, using defaults"); | ||
| 2283 | |||
| 2274 | done: | 2284 | done: |
| 2275 | switch (rfc.mode) { | 2285 | switch (rfc.mode) { |
| 2276 | case L2CAP_MODE_ERTM: | 2286 | case L2CAP_MODE_ERTM: |
diff --git a/net/bluetooth/rfcomm/core.c b/net/bluetooth/rfcomm/core.c index 4e32e18211f..2d28dfe9838 100644 --- a/net/bluetooth/rfcomm/core.c +++ b/net/bluetooth/rfcomm/core.c | |||
| @@ -1146,6 +1146,7 @@ static int rfcomm_recv_ua(struct rfcomm_session *s, u8 dlci) | |||
| 1146 | if (list_empty(&s->dlcs)) { | 1146 | if (list_empty(&s->dlcs)) { |
| 1147 | s->state = BT_DISCONN; | 1147 | s->state = BT_DISCONN; |
| 1148 | rfcomm_send_disc(s, 0); | 1148 | rfcomm_send_disc(s, 0); |
| 1149 | rfcomm_session_clear_timer(s); | ||
| 1149 | } | 1150 | } |
| 1150 | 1151 | ||
| 1151 | break; | 1152 | break; |
diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c index d6ec3720c77..fa8b8f76358 100644 --- a/net/bridge/br_netfilter.c +++ b/net/bridge/br_netfilter.c | |||
| @@ -114,12 +114,18 @@ static struct neighbour *fake_neigh_lookup(const struct dst_entry *dst, const vo | |||
| 114 | return NULL; | 114 | return NULL; |
| 115 | } | 115 | } |
| 116 | 116 | ||
| 117 | static unsigned int fake_mtu(const struct dst_entry *dst) | ||
| 118 | { | ||
| 119 | return dst->dev->mtu; | ||
| 120 | } | ||
| 121 | |||
| 117 | static struct dst_ops fake_dst_ops = { | 122 | static struct dst_ops fake_dst_ops = { |
| 118 | .family = AF_INET, | 123 | .family = AF_INET, |
| 119 | .protocol = cpu_to_be16(ETH_P_IP), | 124 | .protocol = cpu_to_be16(ETH_P_IP), |
| 120 | .update_pmtu = fake_update_pmtu, | 125 | .update_pmtu = fake_update_pmtu, |
| 121 | .cow_metrics = fake_cow_metrics, | 126 | .cow_metrics = fake_cow_metrics, |
| 122 | .neigh_lookup = fake_neigh_lookup, | 127 | .neigh_lookup = fake_neigh_lookup, |
| 128 | .mtu = fake_mtu, | ||
| 123 | }; | 129 | }; |
| 124 | 130 | ||
| 125 | /* | 131 | /* |
| @@ -141,7 +147,7 @@ void br_netfilter_rtable_init(struct net_bridge *br) | |||
| 141 | rt->dst.dev = br->dev; | 147 | rt->dst.dev = br->dev; |
| 142 | rt->dst.path = &rt->dst; | 148 | rt->dst.path = &rt->dst; |
| 143 | dst_init_metrics(&rt->dst, br_dst_default_metrics, true); | 149 | dst_init_metrics(&rt->dst, br_dst_default_metrics, true); |
| 144 | rt->dst.flags = DST_NOXFRM; | 150 | rt->dst.flags = DST_NOXFRM | DST_NOPEER; |
| 145 | rt->dst.ops = &fake_dst_ops; | 151 | rt->dst.ops = &fake_dst_ops; |
| 146 | } | 152 | } |
| 147 | 153 | ||
diff --git a/net/ceph/crush/mapper.c b/net/ceph/crush/mapper.c index 42599e31dca..3a94eae7abe 100644 --- a/net/ceph/crush/mapper.c +++ b/net/ceph/crush/mapper.c | |||
| @@ -477,7 +477,6 @@ int crush_do_rule(struct crush_map *map, | |||
| 477 | int i, j; | 477 | int i, j; |
| 478 | int numrep; | 478 | int numrep; |
| 479 | int firstn; | 479 | int firstn; |
| 480 | int rc = -1; | ||
| 481 | 480 | ||
| 482 | BUG_ON(ruleno >= map->max_rules); | 481 | BUG_ON(ruleno >= map->max_rules); |
| 483 | 482 | ||
| @@ -491,23 +490,18 @@ int crush_do_rule(struct crush_map *map, | |||
| 491 | * that this may or may not correspond to the specific types | 490 | * that this may or may not correspond to the specific types |
| 492 | * referenced by the crush rule. | 491 | * referenced by the crush rule. |
| 493 | */ | 492 | */ |
| 494 | if (force >= 0) { | 493 | if (force >= 0 && |
| 495 | if (force >= map->max_devices || | 494 | force < map->max_devices && |
| 496 | map->device_parents[force] == 0) { | 495 | map->device_parents[force] != 0 && |
| 497 | /*dprintk("CRUSH: forcefed device dne\n");*/ | 496 | !is_out(map, weight, force, x)) { |
| 498 | rc = -1; /* force fed device dne */ | 497 | while (1) { |
| 499 | goto out; | 498 | force_context[++force_pos] = force; |
| 500 | } | 499 | if (force >= 0) |
| 501 | if (!is_out(map, weight, force, x)) { | 500 | force = map->device_parents[force]; |
| 502 | while (1) { | 501 | else |
| 503 | force_context[++force_pos] = force; | 502 | force = map->bucket_parents[-1-force]; |
| 504 | if (force >= 0) | 503 | if (force == 0) |
| 505 | force = map->device_parents[force]; | 504 | break; |
| 506 | else | ||
| 507 | force = map->bucket_parents[-1-force]; | ||
| 508 | if (force == 0) | ||
| 509 | break; | ||
| 510 | } | ||
| 511 | } | 505 | } |
| 512 | } | 506 | } |
| 513 | 507 | ||
| @@ -600,10 +594,7 @@ int crush_do_rule(struct crush_map *map, | |||
| 600 | BUG_ON(1); | 594 | BUG_ON(1); |
| 601 | } | 595 | } |
| 602 | } | 596 | } |
| 603 | rc = result_len; | 597 | return result_len; |
| 604 | |||
| 605 | out: | ||
| 606 | return rc; | ||
| 607 | } | 598 | } |
| 608 | 599 | ||
| 609 | 600 | ||
diff --git a/net/core/flow.c b/net/core/flow.c index 8ae42de9c79..e318c7e9804 100644 --- a/net/core/flow.c +++ b/net/core/flow.c | |||
| @@ -358,6 +358,18 @@ void flow_cache_flush(void) | |||
| 358 | put_online_cpus(); | 358 | put_online_cpus(); |
| 359 | } | 359 | } |
| 360 | 360 | ||
| 361 | static void flow_cache_flush_task(struct work_struct *work) | ||
| 362 | { | ||
| 363 | flow_cache_flush(); | ||
| 364 | } | ||
| 365 | |||
| 366 | static DECLARE_WORK(flow_cache_flush_work, flow_cache_flush_task); | ||
| 367 | |||
| 368 | void flow_cache_flush_deferred(void) | ||
| 369 | { | ||
| 370 | schedule_work(&flow_cache_flush_work); | ||
| 371 | } | ||
| 372 | |||
| 361 | static int __cpuinit flow_cache_cpu_prepare(struct flow_cache *fc, int cpu) | 373 | static int __cpuinit flow_cache_cpu_prepare(struct flow_cache *fc, int cpu) |
| 362 | { | 374 | { |
| 363 | struct flow_cache_percpu *fcp = per_cpu_ptr(fc->percpu, cpu); | 375 | struct flow_cache_percpu *fcp = per_cpu_ptr(fc->percpu, cpu); |
diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c index c71c434a4c0..385aefe5364 100644 --- a/net/core/net-sysfs.c +++ b/net/core/net-sysfs.c | |||
| @@ -665,11 +665,14 @@ static ssize_t store_rps_dev_flow_table_cnt(struct netdev_rx_queue *queue, | |||
| 665 | if (count) { | 665 | if (count) { |
| 666 | int i; | 666 | int i; |
| 667 | 667 | ||
| 668 | if (count > 1<<30) { | 668 | if (count > INT_MAX) |
| 669 | return -EINVAL; | ||
| 670 | count = roundup_pow_of_two(count); | ||
| 671 | if (count > (ULONG_MAX - sizeof(struct rps_dev_flow_table)) | ||
| 672 | / sizeof(struct rps_dev_flow)) { | ||
| 669 | /* Enforce a limit to prevent overflow */ | 673 | /* Enforce a limit to prevent overflow */ |
| 670 | return -EINVAL; | 674 | return -EINVAL; |
| 671 | } | 675 | } |
| 672 | count = roundup_pow_of_two(count); | ||
| 673 | table = vmalloc(RPS_DEV_FLOW_TABLE_SIZE(count)); | 676 | table = vmalloc(RPS_DEV_FLOW_TABLE_SIZE(count)); |
| 674 | if (!table) | 677 | if (!table) |
| 675 | return -ENOMEM; | 678 | return -ENOMEM; |
diff --git a/net/core/sock.c b/net/core/sock.c index 4ed7b1d12f5..b23f174ab84 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
| @@ -288,11 +288,7 @@ int sock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) | |||
| 288 | unsigned long flags; | 288 | unsigned long flags; |
| 289 | struct sk_buff_head *list = &sk->sk_receive_queue; | 289 | struct sk_buff_head *list = &sk->sk_receive_queue; |
| 290 | 290 | ||
| 291 | /* Cast sk->rcvbuf to unsigned... It's pointless, but reduces | 291 | if (atomic_read(&sk->sk_rmem_alloc) >= sk->sk_rcvbuf) { |
| 292 | number of warnings when compiling with -W --ANK | ||
| 293 | */ | ||
| 294 | if (atomic_read(&sk->sk_rmem_alloc) + skb->truesize >= | ||
| 295 | (unsigned)sk->sk_rcvbuf) { | ||
| 296 | atomic_inc(&sk->sk_drops); | 292 | atomic_inc(&sk->sk_drops); |
| 297 | trace_sock_rcvqueue_full(sk, skb); | 293 | trace_sock_rcvqueue_full(sk, skb); |
| 298 | return -ENOMEM; | 294 | return -ENOMEM; |
diff --git a/net/ipv4/ipconfig.c b/net/ipv4/ipconfig.c index 0da2afc97f3..99ec116bef1 100644 --- a/net/ipv4/ipconfig.c +++ b/net/ipv4/ipconfig.c | |||
| @@ -253,6 +253,10 @@ static int __init ic_open_devs(void) | |||
| 253 | } | 253 | } |
| 254 | } | 254 | } |
| 255 | 255 | ||
| 256 | /* no point in waiting if we could not bring up at least one device */ | ||
| 257 | if (!ic_first_dev) | ||
| 258 | goto have_carrier; | ||
| 259 | |||
| 256 | /* wait for a carrier on at least one device */ | 260 | /* wait for a carrier on at least one device */ |
| 257 | start = jiffies; | 261 | start = jiffies; |
| 258 | while (jiffies - start < msecs_to_jiffies(CONF_CARRIER_TIMEOUT)) { | 262 | while (jiffies - start < msecs_to_jiffies(CONF_CARRIER_TIMEOUT)) { |
diff --git a/net/ipv4/ipip.c b/net/ipv4/ipip.c index 065effd8349..0b2e7329abd 100644 --- a/net/ipv4/ipip.c +++ b/net/ipv4/ipip.c | |||
| @@ -285,6 +285,8 @@ static struct ip_tunnel * ipip_tunnel_locate(struct net *net, | |||
| 285 | if (register_netdevice(dev) < 0) | 285 | if (register_netdevice(dev) < 0) |
| 286 | goto failed_free; | 286 | goto failed_free; |
| 287 | 287 | ||
| 288 | strcpy(nt->parms.name, dev->name); | ||
| 289 | |||
| 288 | dev_hold(dev); | 290 | dev_hold(dev); |
| 289 | ipip_tunnel_link(ipn, nt); | 291 | ipip_tunnel_link(ipn, nt); |
| 290 | return nt; | 292 | return nt; |
| @@ -759,7 +761,6 @@ static int ipip_tunnel_init(struct net_device *dev) | |||
| 759 | struct ip_tunnel *tunnel = netdev_priv(dev); | 761 | struct ip_tunnel *tunnel = netdev_priv(dev); |
| 760 | 762 | ||
| 761 | tunnel->dev = dev; | 763 | tunnel->dev = dev; |
| 762 | strcpy(tunnel->parms.name, dev->name); | ||
| 763 | 764 | ||
| 764 | memcpy(dev->dev_addr, &tunnel->parms.iph.saddr, 4); | 765 | memcpy(dev->dev_addr, &tunnel->parms.iph.saddr, 4); |
| 765 | memcpy(dev->broadcast, &tunnel->parms.iph.daddr, 4); | 766 | memcpy(dev->broadcast, &tunnel->parms.iph.daddr, 4); |
| @@ -825,6 +826,7 @@ static void ipip_destroy_tunnels(struct ipip_net *ipn, struct list_head *head) | |||
| 825 | static int __net_init ipip_init_net(struct net *net) | 826 | static int __net_init ipip_init_net(struct net *net) |
| 826 | { | 827 | { |
| 827 | struct ipip_net *ipn = net_generic(net, ipip_net_id); | 828 | struct ipip_net *ipn = net_generic(net, ipip_net_id); |
| 829 | struct ip_tunnel *t; | ||
| 828 | int err; | 830 | int err; |
| 829 | 831 | ||
| 830 | ipn->tunnels[0] = ipn->tunnels_wc; | 832 | ipn->tunnels[0] = ipn->tunnels_wc; |
| @@ -848,6 +850,9 @@ static int __net_init ipip_init_net(struct net *net) | |||
| 848 | if ((err = register_netdev(ipn->fb_tunnel_dev))) | 850 | if ((err = register_netdev(ipn->fb_tunnel_dev))) |
| 849 | goto err_reg_dev; | 851 | goto err_reg_dev; |
| 850 | 852 | ||
| 853 | t = netdev_priv(ipn->fb_tunnel_dev); | ||
| 854 | |||
| 855 | strcpy(t->parms.name, ipn->fb_tunnel_dev->name); | ||
| 851 | return 0; | 856 | return 0; |
| 852 | 857 | ||
| 853 | err_reg_dev: | 858 | err_reg_dev: |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 46af62363b8..94cdbc55ca7 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
| @@ -91,6 +91,7 @@ | |||
| 91 | #include <linux/rcupdate.h> | 91 | #include <linux/rcupdate.h> |
| 92 | #include <linux/times.h> | 92 | #include <linux/times.h> |
| 93 | #include <linux/slab.h> | 93 | #include <linux/slab.h> |
| 94 | #include <linux/prefetch.h> | ||
| 94 | #include <net/dst.h> | 95 | #include <net/dst.h> |
| 95 | #include <net/net_namespace.h> | 96 | #include <net/net_namespace.h> |
| 96 | #include <net/protocol.h> | 97 | #include <net/protocol.h> |
| @@ -120,6 +121,7 @@ | |||
| 120 | 121 | ||
| 121 | static int ip_rt_max_size; | 122 | static int ip_rt_max_size; |
| 122 | static int ip_rt_gc_timeout __read_mostly = RT_GC_TIMEOUT; | 123 | static int ip_rt_gc_timeout __read_mostly = RT_GC_TIMEOUT; |
| 124 | static int ip_rt_gc_interval __read_mostly = 60 * HZ; | ||
| 123 | static int ip_rt_gc_min_interval __read_mostly = HZ / 2; | 125 | static int ip_rt_gc_min_interval __read_mostly = HZ / 2; |
| 124 | static int ip_rt_redirect_number __read_mostly = 9; | 126 | static int ip_rt_redirect_number __read_mostly = 9; |
| 125 | static int ip_rt_redirect_load __read_mostly = HZ / 50; | 127 | static int ip_rt_redirect_load __read_mostly = HZ / 50; |
| @@ -133,6 +135,9 @@ static int ip_rt_min_advmss __read_mostly = 256; | |||
| 133 | static int rt_chain_length_max __read_mostly = 20; | 135 | static int rt_chain_length_max __read_mostly = 20; |
| 134 | static int redirect_genid; | 136 | static int redirect_genid; |
| 135 | 137 | ||
| 138 | static struct delayed_work expires_work; | ||
| 139 | static unsigned long expires_ljiffies; | ||
| 140 | |||
| 136 | /* | 141 | /* |
| 137 | * Interface to generic destination cache. | 142 | * Interface to generic destination cache. |
| 138 | */ | 143 | */ |
| @@ -830,6 +835,97 @@ static int has_noalias(const struct rtable *head, const struct rtable *rth) | |||
| 830 | return ONE; | 835 | return ONE; |
| 831 | } | 836 | } |
| 832 | 837 | ||
| 838 | static void rt_check_expire(void) | ||
| 839 | { | ||
| 840 | static unsigned int rover; | ||
| 841 | unsigned int i = rover, goal; | ||
| 842 | struct rtable *rth; | ||
| 843 | struct rtable __rcu **rthp; | ||
| 844 | unsigned long samples = 0; | ||
| 845 | unsigned long sum = 0, sum2 = 0; | ||
| 846 | unsigned long delta; | ||
| 847 | u64 mult; | ||
| 848 | |||
| 849 | delta = jiffies - expires_ljiffies; | ||
| 850 | expires_ljiffies = jiffies; | ||
| 851 | mult = ((u64)delta) << rt_hash_log; | ||
| 852 | if (ip_rt_gc_timeout > 1) | ||
| 853 | do_div(mult, ip_rt_gc_timeout); | ||
| 854 | goal = (unsigned int)mult; | ||
| 855 | if (goal > rt_hash_mask) | ||
| 856 | goal = rt_hash_mask + 1; | ||
| 857 | for (; goal > 0; goal--) { | ||
| 858 | unsigned long tmo = ip_rt_gc_timeout; | ||
| 859 | unsigned long length; | ||
| 860 | |||
| 861 | i = (i + 1) & rt_hash_mask; | ||
| 862 | rthp = &rt_hash_table[i].chain; | ||
| 863 | |||
| 864 | if (need_resched()) | ||
| 865 | cond_resched(); | ||
| 866 | |||
| 867 | samples++; | ||
| 868 | |||
| 869 | if (rcu_dereference_raw(*rthp) == NULL) | ||
| 870 | continue; | ||
| 871 | length = 0; | ||
| 872 | spin_lock_bh(rt_hash_lock_addr(i)); | ||
| 873 | while ((rth = rcu_dereference_protected(*rthp, | ||
| 874 | lockdep_is_held(rt_hash_lock_addr(i)))) != NULL) { | ||
| 875 | prefetch(rth->dst.rt_next); | ||
| 876 | if (rt_is_expired(rth)) { | ||
| 877 | *rthp = rth->dst.rt_next; | ||
| 878 | rt_free(rth); | ||
| 879 | continue; | ||
| 880 | } | ||
| 881 | if (rth->dst.expires) { | ||
| 882 | /* Entry is expired even if it is in use */ | ||
| 883 | if (time_before_eq(jiffies, rth->dst.expires)) { | ||
| 884 | nofree: | ||
| 885 | tmo >>= 1; | ||
| 886 | rthp = &rth->dst.rt_next; | ||
| 887 | /* | ||
| 888 | * We only count entries on | ||
| 889 | * a chain with equal hash inputs once | ||
| 890 | * so that entries for different QOS | ||
| 891 | * levels, and other non-hash input | ||
| 892 | * attributes don't unfairly skew | ||
| 893 | * the length computation | ||
| 894 | */ | ||
| 895 | length += has_noalias(rt_hash_table[i].chain, rth); | ||
| 896 | continue; | ||
| 897 | } | ||
| 898 | } else if (!rt_may_expire(rth, tmo, ip_rt_gc_timeout)) | ||
| 899 | goto nofree; | ||
| 900 | |||
| 901 | /* Cleanup aged off entries. */ | ||
| 902 | *rthp = rth->dst.rt_next; | ||
| 903 | rt_free(rth); | ||
| 904 | } | ||
| 905 | spin_unlock_bh(rt_hash_lock_addr(i)); | ||
| 906 | sum += length; | ||
| 907 | sum2 += length*length; | ||
| 908 | } | ||
| 909 | if (samples) { | ||
| 910 | unsigned long avg = sum / samples; | ||
| 911 | unsigned long sd = int_sqrt(sum2 / samples - avg*avg); | ||
| 912 | rt_chain_length_max = max_t(unsigned long, | ||
| 913 | ip_rt_gc_elasticity, | ||
| 914 | (avg + 4*sd) >> FRACT_BITS); | ||
| 915 | } | ||
| 916 | rover = i; | ||
| 917 | } | ||
| 918 | |||
| 919 | /* | ||
| 920 | * rt_worker_func() is run in process context. | ||
| 921 | * we call rt_check_expire() to scan part of the hash table | ||
| 922 | */ | ||
| 923 | static void rt_worker_func(struct work_struct *work) | ||
| 924 | { | ||
| 925 | rt_check_expire(); | ||
| 926 | schedule_delayed_work(&expires_work, ip_rt_gc_interval); | ||
| 927 | } | ||
| 928 | |||
| 833 | /* | 929 | /* |
| 834 | * Perturbation of rt_genid by a small quantity [1..256] | 930 | * Perturbation of rt_genid by a small quantity [1..256] |
| 835 | * Using 8 bits of shuffling ensure we can call rt_cache_invalidate() | 931 | * Using 8 bits of shuffling ensure we can call rt_cache_invalidate() |
| @@ -1271,7 +1367,7 @@ void __ip_select_ident(struct iphdr *iph, struct dst_entry *dst, int more) | |||
| 1271 | { | 1367 | { |
| 1272 | struct rtable *rt = (struct rtable *) dst; | 1368 | struct rtable *rt = (struct rtable *) dst; |
| 1273 | 1369 | ||
| 1274 | if (rt) { | 1370 | if (rt && !(rt->dst.flags & DST_NOPEER)) { |
| 1275 | if (rt->peer == NULL) | 1371 | if (rt->peer == NULL) |
| 1276 | rt_bind_peer(rt, rt->rt_dst, 1); | 1372 | rt_bind_peer(rt, rt->rt_dst, 1); |
| 1277 | 1373 | ||
| @@ -1282,7 +1378,7 @@ void __ip_select_ident(struct iphdr *iph, struct dst_entry *dst, int more) | |||
| 1282 | iph->id = htons(inet_getid(rt->peer, more)); | 1378 | iph->id = htons(inet_getid(rt->peer, more)); |
| 1283 | return; | 1379 | return; |
| 1284 | } | 1380 | } |
| 1285 | } else | 1381 | } else if (!rt) |
| 1286 | printk(KERN_DEBUG "rt_bind_peer(0) @%p\n", | 1382 | printk(KERN_DEBUG "rt_bind_peer(0) @%p\n", |
| 1287 | __builtin_return_address(0)); | 1383 | __builtin_return_address(0)); |
| 1288 | 1384 | ||
| @@ -3179,6 +3275,13 @@ static ctl_table ipv4_route_table[] = { | |||
| 3179 | .proc_handler = proc_dointvec_jiffies, | 3275 | .proc_handler = proc_dointvec_jiffies, |
| 3180 | }, | 3276 | }, |
| 3181 | { | 3277 | { |
| 3278 | .procname = "gc_interval", | ||
| 3279 | .data = &ip_rt_gc_interval, | ||
| 3280 | .maxlen = sizeof(int), | ||
| 3281 | .mode = 0644, | ||
| 3282 | .proc_handler = proc_dointvec_jiffies, | ||
| 3283 | }, | ||
| 3284 | { | ||
| 3182 | .procname = "redirect_load", | 3285 | .procname = "redirect_load", |
| 3183 | .data = &ip_rt_redirect_load, | 3286 | .data = &ip_rt_redirect_load, |
| 3184 | .maxlen = sizeof(int), | 3287 | .maxlen = sizeof(int), |
| @@ -3388,6 +3491,11 @@ int __init ip_rt_init(void) | |||
| 3388 | devinet_init(); | 3491 | devinet_init(); |
| 3389 | ip_fib_init(); | 3492 | ip_fib_init(); |
| 3390 | 3493 | ||
| 3494 | INIT_DELAYED_WORK_DEFERRABLE(&expires_work, rt_worker_func); | ||
| 3495 | expires_ljiffies = jiffies; | ||
| 3496 | schedule_delayed_work(&expires_work, | ||
| 3497 | net_random() % ip_rt_gc_interval + ip_rt_gc_interval); | ||
| 3498 | |||
| 3391 | if (ip_rt_proc_init()) | 3499 | if (ip_rt_proc_init()) |
| 3392 | printk(KERN_ERR "Unable to create route proc files\n"); | 3500 | printk(KERN_ERR "Unable to create route proc files\n"); |
| 3393 | #ifdef CONFIG_XFRM | 3501 | #ifdef CONFIG_XFRM |
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index cf88df82e2c..36806def8cf 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
| @@ -1805,7 +1805,8 @@ static struct inet6_dev *addrconf_add_dev(struct net_device *dev) | |||
| 1805 | return ERR_PTR(-EACCES); | 1805 | return ERR_PTR(-EACCES); |
| 1806 | 1806 | ||
| 1807 | /* Add default multicast route */ | 1807 | /* Add default multicast route */ |
| 1808 | addrconf_add_mroute(dev); | 1808 | if (!(dev->flags & IFF_LOOPBACK)) |
| 1809 | addrconf_add_mroute(dev); | ||
| 1809 | 1810 | ||
| 1810 | /* Add link local route */ | 1811 | /* Add link local route */ |
| 1811 | addrconf_add_lroute(dev); | 1812 | addrconf_add_lroute(dev); |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 84d0bd5cac9..ec562713db9 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
| @@ -603,7 +603,7 @@ void ipv6_select_ident(struct frag_hdr *fhdr, struct rt6_info *rt) | |||
| 603 | static atomic_t ipv6_fragmentation_id; | 603 | static atomic_t ipv6_fragmentation_id; |
| 604 | int old, new; | 604 | int old, new; |
| 605 | 605 | ||
| 606 | if (rt) { | 606 | if (rt && !(rt->dst.flags & DST_NOPEER)) { |
| 607 | struct inet_peer *peer; | 607 | struct inet_peer *peer; |
| 608 | 608 | ||
| 609 | if (!rt->rt6i_peer) | 609 | if (!rt->rt6i_peer) |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 3399dd32628..b582a0a0f1c 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
| @@ -728,7 +728,7 @@ static struct rt6_info *rt6_alloc_cow(const struct rt6_info *ort, | |||
| 728 | int attempts = !in_softirq(); | 728 | int attempts = !in_softirq(); |
| 729 | 729 | ||
| 730 | if (!(rt->rt6i_flags&RTF_GATEWAY)) { | 730 | if (!(rt->rt6i_flags&RTF_GATEWAY)) { |
| 731 | if (rt->rt6i_dst.plen != 128 && | 731 | if (ort->rt6i_dst.plen != 128 && |
| 732 | ipv6_addr_equal(&ort->rt6i_dst.addr, daddr)) | 732 | ipv6_addr_equal(&ort->rt6i_dst.addr, daddr)) |
| 733 | rt->rt6i_flags |= RTF_ANYCAST; | 733 | rt->rt6i_flags |= RTF_ANYCAST; |
| 734 | ipv6_addr_copy(&rt->rt6i_gateway, daddr); | 734 | ipv6_addr_copy(&rt->rt6i_gateway, daddr); |
diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c index a7a18602a04..96f3623618e 100644 --- a/net/ipv6/sit.c +++ b/net/ipv6/sit.c | |||
| @@ -263,6 +263,8 @@ static struct ip_tunnel *ipip6_tunnel_locate(struct net *net, | |||
| 263 | if (register_netdevice(dev) < 0) | 263 | if (register_netdevice(dev) < 0) |
| 264 | goto failed_free; | 264 | goto failed_free; |
| 265 | 265 | ||
| 266 | strcpy(nt->parms.name, dev->name); | ||
| 267 | |||
| 266 | dev_hold(dev); | 268 | dev_hold(dev); |
| 267 | 269 | ||
| 268 | ipip6_tunnel_link(sitn, nt); | 270 | ipip6_tunnel_link(sitn, nt); |
| @@ -1144,7 +1146,6 @@ static int ipip6_tunnel_init(struct net_device *dev) | |||
| 1144 | struct ip_tunnel *tunnel = netdev_priv(dev); | 1146 | struct ip_tunnel *tunnel = netdev_priv(dev); |
| 1145 | 1147 | ||
| 1146 | tunnel->dev = dev; | 1148 | tunnel->dev = dev; |
| 1147 | strcpy(tunnel->parms.name, dev->name); | ||
| 1148 | 1149 | ||
| 1149 | memcpy(dev->dev_addr, &tunnel->parms.iph.saddr, 4); | 1150 | memcpy(dev->dev_addr, &tunnel->parms.iph.saddr, 4); |
| 1150 | memcpy(dev->broadcast, &tunnel->parms.iph.daddr, 4); | 1151 | memcpy(dev->broadcast, &tunnel->parms.iph.daddr, 4); |
| @@ -1207,6 +1208,7 @@ static void __net_exit sit_destroy_tunnels(struct sit_net *sitn, struct list_hea | |||
| 1207 | static int __net_init sit_init_net(struct net *net) | 1208 | static int __net_init sit_init_net(struct net *net) |
| 1208 | { | 1209 | { |
| 1209 | struct sit_net *sitn = net_generic(net, sit_net_id); | 1210 | struct sit_net *sitn = net_generic(net, sit_net_id); |
| 1211 | struct ip_tunnel *t; | ||
| 1210 | int err; | 1212 | int err; |
| 1211 | 1213 | ||
| 1212 | sitn->tunnels[0] = sitn->tunnels_wc; | 1214 | sitn->tunnels[0] = sitn->tunnels_wc; |
| @@ -1231,6 +1233,9 @@ static int __net_init sit_init_net(struct net *net) | |||
| 1231 | if ((err = register_netdev(sitn->fb_tunnel_dev))) | 1233 | if ((err = register_netdev(sitn->fb_tunnel_dev))) |
| 1232 | goto err_reg_dev; | 1234 | goto err_reg_dev; |
| 1233 | 1235 | ||
| 1236 | t = netdev_priv(sitn->fb_tunnel_dev); | ||
| 1237 | |||
| 1238 | strcpy(t->parms.name, sitn->fb_tunnel_dev->name); | ||
| 1234 | return 0; | 1239 | return 0; |
| 1235 | 1240 | ||
| 1236 | err_reg_dev: | 1241 | err_reg_dev: |
diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c index dfd3a648a55..a18e6c3d36e 100644 --- a/net/llc/af_llc.c +++ b/net/llc/af_llc.c | |||
| @@ -833,15 +833,15 @@ static int llc_ui_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
| 833 | copied += used; | 833 | copied += used; |
| 834 | len -= used; | 834 | len -= used; |
| 835 | 835 | ||
| 836 | /* For non stream protcols we get one packet per recvmsg call */ | ||
| 837 | if (sk->sk_type != SOCK_STREAM) | ||
| 838 | goto copy_uaddr; | ||
| 839 | |||
| 836 | if (!(flags & MSG_PEEK)) { | 840 | if (!(flags & MSG_PEEK)) { |
| 837 | sk_eat_skb(sk, skb, 0); | 841 | sk_eat_skb(sk, skb, 0); |
| 838 | *seq = 0; | 842 | *seq = 0; |
| 839 | } | 843 | } |
| 840 | 844 | ||
| 841 | /* For non stream protcols we get one packet per recvmsg call */ | ||
| 842 | if (sk->sk_type != SOCK_STREAM) | ||
| 843 | goto copy_uaddr; | ||
| 844 | |||
| 845 | /* Partial read */ | 845 | /* Partial read */ |
| 846 | if (used + offset < skb->len) | 846 | if (used + offset < skb->len) |
| 847 | continue; | 847 | continue; |
| @@ -857,6 +857,12 @@ copy_uaddr: | |||
| 857 | } | 857 | } |
| 858 | if (llc_sk(sk)->cmsg_flags) | 858 | if (llc_sk(sk)->cmsg_flags) |
| 859 | llc_cmsg_rcv(msg, skb); | 859 | llc_cmsg_rcv(msg, skb); |
| 860 | |||
| 861 | if (!(flags & MSG_PEEK)) { | ||
| 862 | sk_eat_skb(sk, skb, 0); | ||
| 863 | *seq = 0; | ||
| 864 | } | ||
| 865 | |||
| 860 | goto out; | 866 | goto out; |
| 861 | } | 867 | } |
| 862 | 868 | ||
diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c index b064e4df12c..2e4b961648d 100644 --- a/net/mac80211/agg-tx.c +++ b/net/mac80211/agg-tx.c | |||
| @@ -303,6 +303,38 @@ ieee80211_wake_queue_agg(struct ieee80211_local *local, int tid) | |||
| 303 | __release(agg_queue); | 303 | __release(agg_queue); |
| 304 | } | 304 | } |
| 305 | 305 | ||
| 306 | /* | ||
| 307 | * splice packets from the STA's pending to the local pending, | ||
| 308 | * requires a call to ieee80211_agg_splice_finish later | ||
| 309 | */ | ||
| 310 | static void __acquires(agg_queue) | ||
| 311 | ieee80211_agg_splice_packets(struct ieee80211_local *local, | ||
| 312 | struct tid_ampdu_tx *tid_tx, u16 tid) | ||
| 313 | { | ||
| 314 | int queue = ieee80211_ac_from_tid(tid); | ||
| 315 | unsigned long flags; | ||
| 316 | |||
| 317 | ieee80211_stop_queue_agg(local, tid); | ||
| 318 | |||
| 319 | if (WARN(!tid_tx, "TID %d gone but expected when splicing aggregates" | ||
| 320 | " from the pending queue\n", tid)) | ||
| 321 | return; | ||
| 322 | |||
| 323 | if (!skb_queue_empty(&tid_tx->pending)) { | ||
| 324 | spin_lock_irqsave(&local->queue_stop_reason_lock, flags); | ||
| 325 | /* copy over remaining packets */ | ||
| 326 | skb_queue_splice_tail_init(&tid_tx->pending, | ||
| 327 | &local->pending[queue]); | ||
| 328 | spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); | ||
| 329 | } | ||
| 330 | } | ||
| 331 | |||
| 332 | static void __releases(agg_queue) | ||
| 333 | ieee80211_agg_splice_finish(struct ieee80211_local *local, u16 tid) | ||
| 334 | { | ||
| 335 | ieee80211_wake_queue_agg(local, tid); | ||
| 336 | } | ||
| 337 | |||
| 306 | void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid) | 338 | void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid) |
| 307 | { | 339 | { |
| 308 | struct tid_ampdu_tx *tid_tx; | 340 | struct tid_ampdu_tx *tid_tx; |
| @@ -314,19 +346,17 @@ void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid) | |||
| 314 | tid_tx = rcu_dereference_protected_tid_tx(sta, tid); | 346 | tid_tx = rcu_dereference_protected_tid_tx(sta, tid); |
| 315 | 347 | ||
| 316 | /* | 348 | /* |
| 317 | * While we're asking the driver about the aggregation, | 349 | * Start queuing up packets for this aggregation session. |
| 318 | * stop the AC queue so that we don't have to worry | 350 | * We're going to release them once the driver is OK with |
| 319 | * about frames that came in while we were doing that, | 351 | * that. |
| 320 | * which would require us to put them to the AC pending | ||
| 321 | * afterwards which just makes the code more complex. | ||
| 322 | */ | 352 | */ |
| 323 | ieee80211_stop_queue_agg(local, tid); | ||
| 324 | |||
| 325 | clear_bit(HT_AGG_STATE_WANT_START, &tid_tx->state); | 353 | clear_bit(HT_AGG_STATE_WANT_START, &tid_tx->state); |
| 326 | 354 | ||
| 327 | /* | 355 | /* |
| 328 | * make sure no packets are being processed to get | 356 | * Make sure no packets are being processed. This ensures that |
| 329 | * valid starting sequence number | 357 | * we have a valid starting sequence number and that in-flight |
| 358 | * packets have been flushed out and no packets for this TID | ||
| 359 | * will go into the driver during the ampdu_action call. | ||
| 330 | */ | 360 | */ |
| 331 | synchronize_net(); | 361 | synchronize_net(); |
| 332 | 362 | ||
| @@ -340,17 +370,15 @@ void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid) | |||
| 340 | " tid %d\n", tid); | 370 | " tid %d\n", tid); |
| 341 | #endif | 371 | #endif |
| 342 | spin_lock_bh(&sta->lock); | 372 | spin_lock_bh(&sta->lock); |
| 373 | ieee80211_agg_splice_packets(local, tid_tx, tid); | ||
| 343 | ieee80211_assign_tid_tx(sta, tid, NULL); | 374 | ieee80211_assign_tid_tx(sta, tid, NULL); |
| 375 | ieee80211_agg_splice_finish(local, tid); | ||
| 344 | spin_unlock_bh(&sta->lock); | 376 | spin_unlock_bh(&sta->lock); |
| 345 | 377 | ||
| 346 | ieee80211_wake_queue_agg(local, tid); | ||
| 347 | kfree_rcu(tid_tx, rcu_head); | 378 | kfree_rcu(tid_tx, rcu_head); |
| 348 | return; | 379 | return; |
| 349 | } | 380 | } |
| 350 | 381 | ||
| 351 | /* we can take packets again now */ | ||
| 352 | ieee80211_wake_queue_agg(local, tid); | ||
| 353 | |||
| 354 | /* activate the timer for the recipient's addBA response */ | 382 | /* activate the timer for the recipient's addBA response */ |
| 355 | mod_timer(&tid_tx->addba_resp_timer, jiffies + ADDBA_RESP_INTERVAL); | 383 | mod_timer(&tid_tx->addba_resp_timer, jiffies + ADDBA_RESP_INTERVAL); |
| 356 | #ifdef CONFIG_MAC80211_HT_DEBUG | 384 | #ifdef CONFIG_MAC80211_HT_DEBUG |
| @@ -466,38 +494,6 @@ int ieee80211_start_tx_ba_session(struct ieee80211_sta *pubsta, u16 tid, | |||
| 466 | } | 494 | } |
| 467 | EXPORT_SYMBOL(ieee80211_start_tx_ba_session); | 495 | EXPORT_SYMBOL(ieee80211_start_tx_ba_session); |
| 468 | 496 | ||
| 469 | /* | ||
| 470 | * splice packets from the STA's pending to the local pending, | ||
| 471 | * requires a call to ieee80211_agg_splice_finish later | ||
| 472 | */ | ||
| 473 | static void __acquires(agg_queue) | ||
| 474 | ieee80211_agg_splice_packets(struct ieee80211_local *local, | ||
| 475 | struct tid_ampdu_tx *tid_tx, u16 tid) | ||
| 476 | { | ||
| 477 | int queue = ieee80211_ac_from_tid(tid); | ||
| 478 | unsigned long flags; | ||
| 479 | |||
| 480 | ieee80211_stop_queue_agg(local, tid); | ||
| 481 | |||
| 482 | if (WARN(!tid_tx, "TID %d gone but expected when splicing aggregates" | ||
| 483 | " from the pending queue\n", tid)) | ||
| 484 | return; | ||
| 485 | |||
| 486 | if (!skb_queue_empty(&tid_tx->pending)) { | ||
| 487 | spin_lock_irqsave(&local->queue_stop_reason_lock, flags); | ||
| 488 | /* copy over remaining packets */ | ||
| 489 | skb_queue_splice_tail_init(&tid_tx->pending, | ||
| 490 | &local->pending[queue]); | ||
| 491 | spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); | ||
| 492 | } | ||
| 493 | } | ||
| 494 | |||
| 495 | static void __releases(agg_queue) | ||
| 496 | ieee80211_agg_splice_finish(struct ieee80211_local *local, u16 tid) | ||
| 497 | { | ||
| 498 | ieee80211_wake_queue_agg(local, tid); | ||
| 499 | } | ||
| 500 | |||
| 501 | static void ieee80211_agg_tx_operational(struct ieee80211_local *local, | 497 | static void ieee80211_agg_tx_operational(struct ieee80211_local *local, |
| 502 | struct sta_info *sta, u16 tid) | 498 | struct sta_info *sta, u16 tid) |
| 503 | { | 499 | { |
diff --git a/net/netfilter/xt_connbytes.c b/net/netfilter/xt_connbytes.c index 5b138506690..9ddf1c3bfb3 100644 --- a/net/netfilter/xt_connbytes.c +++ b/net/netfilter/xt_connbytes.c | |||
| @@ -87,10 +87,10 @@ connbytes_mt(const struct sk_buff *skb, struct xt_action_param *par) | |||
| 87 | break; | 87 | break; |
| 88 | } | 88 | } |
| 89 | 89 | ||
| 90 | if (sinfo->count.to) | 90 | if (sinfo->count.to >= sinfo->count.from) |
| 91 | return what <= sinfo->count.to && what >= sinfo->count.from; | 91 | return what <= sinfo->count.to && what >= sinfo->count.from; |
| 92 | else | 92 | else /* inverted */ |
| 93 | return what >= sinfo->count.from; | 93 | return what < sinfo->count.to || what > sinfo->count.from; |
| 94 | } | 94 | } |
| 95 | 95 | ||
| 96 | static int connbytes_mt_check(const struct xt_mtchk_param *par) | 96 | static int connbytes_mt_check(const struct xt_mtchk_param *par) |
diff --git a/net/nfc/nci/core.c b/net/nfc/nci/core.c index 3925c657876..ea66034499c 100644 --- a/net/nfc/nci/core.c +++ b/net/nfc/nci/core.c | |||
| @@ -69,7 +69,7 @@ static int __nci_request(struct nci_dev *ndev, | |||
| 69 | __u32 timeout) | 69 | __u32 timeout) |
| 70 | { | 70 | { |
| 71 | int rc = 0; | 71 | int rc = 0; |
| 72 | unsigned long completion_rc; | 72 | long completion_rc; |
| 73 | 73 | ||
| 74 | ndev->req_status = NCI_REQ_PEND; | 74 | ndev->req_status = NCI_REQ_PEND; |
| 75 | 75 | ||
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 82a6f34d39d..3891702b81d 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c | |||
| @@ -1630,8 +1630,7 @@ static int packet_rcv(struct sk_buff *skb, struct net_device *dev, | |||
| 1630 | if (snaplen > res) | 1630 | if (snaplen > res) |
| 1631 | snaplen = res; | 1631 | snaplen = res; |
| 1632 | 1632 | ||
| 1633 | if (atomic_read(&sk->sk_rmem_alloc) + skb->truesize >= | 1633 | if (atomic_read(&sk->sk_rmem_alloc) >= sk->sk_rcvbuf) |
| 1634 | (unsigned)sk->sk_rcvbuf) | ||
| 1635 | goto drop_n_acct; | 1634 | goto drop_n_acct; |
| 1636 | 1635 | ||
| 1637 | if (skb_shared(skb)) { | 1636 | if (skb_shared(skb)) { |
| @@ -1762,8 +1761,7 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, | |||
| 1762 | if (po->tp_version <= TPACKET_V2) { | 1761 | if (po->tp_version <= TPACKET_V2) { |
| 1763 | if (macoff + snaplen > po->rx_ring.frame_size) { | 1762 | if (macoff + snaplen > po->rx_ring.frame_size) { |
| 1764 | if (po->copy_thresh && | 1763 | if (po->copy_thresh && |
| 1765 | atomic_read(&sk->sk_rmem_alloc) + skb->truesize | 1764 | atomic_read(&sk->sk_rmem_alloc) < sk->sk_rcvbuf) { |
| 1766 | < (unsigned)sk->sk_rcvbuf) { | ||
| 1767 | if (skb_shared(skb)) { | 1765 | if (skb_shared(skb)) { |
| 1768 | copy_skb = skb_clone(skb, GFP_ATOMIC); | 1766 | copy_skb = skb_clone(skb, GFP_ATOMIC); |
| 1769 | } else { | 1767 | } else { |
diff --git a/net/sched/sch_gred.c b/net/sched/sch_gred.c index b9493a09a87..6cd8ddfb512 100644 --- a/net/sched/sch_gred.c +++ b/net/sched/sch_gred.c | |||
| @@ -385,7 +385,7 @@ static inline int gred_change_vq(struct Qdisc *sch, int dp, | |||
| 385 | struct gred_sched_data *q; | 385 | struct gred_sched_data *q; |
| 386 | 386 | ||
| 387 | if (table->tab[dp] == NULL) { | 387 | if (table->tab[dp] == NULL) { |
| 388 | table->tab[dp] = kzalloc(sizeof(*q), GFP_KERNEL); | 388 | table->tab[dp] = kzalloc(sizeof(*q), GFP_ATOMIC); |
| 389 | if (table->tab[dp] == NULL) | 389 | if (table->tab[dp] == NULL) |
| 390 | return -ENOMEM; | 390 | return -ENOMEM; |
| 391 | } | 391 | } |
diff --git a/net/sched/sch_mqprio.c b/net/sched/sch_mqprio.c index f88256cbacb..28de4309233 100644 --- a/net/sched/sch_mqprio.c +++ b/net/sched/sch_mqprio.c | |||
| @@ -107,7 +107,7 @@ static int mqprio_init(struct Qdisc *sch, struct nlattr *opt) | |||
| 107 | if (!netif_is_multiqueue(dev)) | 107 | if (!netif_is_multiqueue(dev)) |
| 108 | return -EOPNOTSUPP; | 108 | return -EOPNOTSUPP; |
| 109 | 109 | ||
| 110 | if (nla_len(opt) < sizeof(*qopt)) | 110 | if (!opt || nla_len(opt) < sizeof(*qopt)) |
| 111 | return -EINVAL; | 111 | return -EINVAL; |
| 112 | 112 | ||
| 113 | qopt = nla_data(opt); | 113 | qopt = nla_data(opt); |
diff --git a/net/sctp/associola.c b/net/sctp/associola.c index 152b5b3c3ff..acd2edbc073 100644 --- a/net/sctp/associola.c +++ b/net/sctp/associola.c | |||
| @@ -173,7 +173,7 @@ static struct sctp_association *sctp_association_init(struct sctp_association *a | |||
| 173 | asoc->timeouts[SCTP_EVENT_TIMEOUT_HEARTBEAT] = 0; | 173 | asoc->timeouts[SCTP_EVENT_TIMEOUT_HEARTBEAT] = 0; |
| 174 | asoc->timeouts[SCTP_EVENT_TIMEOUT_SACK] = asoc->sackdelay; | 174 | asoc->timeouts[SCTP_EVENT_TIMEOUT_SACK] = asoc->sackdelay; |
| 175 | asoc->timeouts[SCTP_EVENT_TIMEOUT_AUTOCLOSE] = | 175 | asoc->timeouts[SCTP_EVENT_TIMEOUT_AUTOCLOSE] = |
| 176 | (unsigned long)sp->autoclose * HZ; | 176 | min_t(unsigned long, sp->autoclose, sctp_max_autoclose) * HZ; |
| 177 | 177 | ||
| 178 | /* Initializes the timers */ | 178 | /* Initializes the timers */ |
| 179 | for (i = SCTP_EVENT_TIMEOUT_NONE; i < SCTP_NUM_TIMEOUT_TYPES; ++i) | 179 | for (i = SCTP_EVENT_TIMEOUT_NONE; i < SCTP_NUM_TIMEOUT_TYPES; ++i) |
diff --git a/net/sctp/output.c b/net/sctp/output.c index 08b3cead650..817174eb5f4 100644 --- a/net/sctp/output.c +++ b/net/sctp/output.c | |||
| @@ -697,13 +697,7 @@ static void sctp_packet_append_data(struct sctp_packet *packet, | |||
| 697 | /* Keep track of how many bytes are in flight to the receiver. */ | 697 | /* Keep track of how many bytes are in flight to the receiver. */ |
| 698 | asoc->outqueue.outstanding_bytes += datasize; | 698 | asoc->outqueue.outstanding_bytes += datasize; |
| 699 | 699 | ||
| 700 | /* Update our view of the receiver's rwnd. Include sk_buff overhead | 700 | /* Update our view of the receiver's rwnd. */ |
| 701 | * while updating peer.rwnd so that it reduces the chances of a | ||
| 702 | * receiver running out of receive buffer space even when receive | ||
| 703 | * window is still open. This can happen when a sender is sending | ||
| 704 | * sending small messages. | ||
| 705 | */ | ||
| 706 | datasize += sizeof(struct sk_buff); | ||
| 707 | if (datasize < rwnd) | 701 | if (datasize < rwnd) |
| 708 | rwnd -= datasize; | 702 | rwnd -= datasize; |
| 709 | else | 703 | else |
diff --git a/net/sctp/outqueue.c b/net/sctp/outqueue.c index 14c2b06028f..cfeb1d4a1ee 100644 --- a/net/sctp/outqueue.c +++ b/net/sctp/outqueue.c | |||
| @@ -411,8 +411,7 @@ void sctp_retransmit_mark(struct sctp_outq *q, | |||
| 411 | chunk->transport->flight_size -= | 411 | chunk->transport->flight_size -= |
| 412 | sctp_data_size(chunk); | 412 | sctp_data_size(chunk); |
| 413 | q->outstanding_bytes -= sctp_data_size(chunk); | 413 | q->outstanding_bytes -= sctp_data_size(chunk); |
| 414 | q->asoc->peer.rwnd += (sctp_data_size(chunk) + | 414 | q->asoc->peer.rwnd += sctp_data_size(chunk); |
| 415 | sizeof(struct sk_buff)); | ||
| 416 | } | 415 | } |
| 417 | continue; | 416 | continue; |
| 418 | } | 417 | } |
| @@ -432,8 +431,7 @@ void sctp_retransmit_mark(struct sctp_outq *q, | |||
| 432 | * (Section 7.2.4)), add the data size of those | 431 | * (Section 7.2.4)), add the data size of those |
| 433 | * chunks to the rwnd. | 432 | * chunks to the rwnd. |
| 434 | */ | 433 | */ |
| 435 | q->asoc->peer.rwnd += (sctp_data_size(chunk) + | 434 | q->asoc->peer.rwnd += sctp_data_size(chunk); |
| 436 | sizeof(struct sk_buff)); | ||
| 437 | q->outstanding_bytes -= sctp_data_size(chunk); | 435 | q->outstanding_bytes -= sctp_data_size(chunk); |
| 438 | if (chunk->transport) | 436 | if (chunk->transport) |
| 439 | transport->flight_size -= sctp_data_size(chunk); | 437 | transport->flight_size -= sctp_data_size(chunk); |
diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c index 61b9fca5a17..6f6ad868683 100644 --- a/net/sctp/protocol.c +++ b/net/sctp/protocol.c | |||
| @@ -1285,6 +1285,9 @@ SCTP_STATIC __init int sctp_init(void) | |||
| 1285 | sctp_max_instreams = SCTP_DEFAULT_INSTREAMS; | 1285 | sctp_max_instreams = SCTP_DEFAULT_INSTREAMS; |
| 1286 | sctp_max_outstreams = SCTP_DEFAULT_OUTSTREAMS; | 1286 | sctp_max_outstreams = SCTP_DEFAULT_OUTSTREAMS; |
| 1287 | 1287 | ||
| 1288 | /* Initialize maximum autoclose timeout. */ | ||
| 1289 | sctp_max_autoclose = INT_MAX / HZ; | ||
| 1290 | |||
| 1288 | /* Initialize handle used for association ids. */ | 1291 | /* Initialize handle used for association ids. */ |
| 1289 | idr_init(&sctp_assocs_id); | 1292 | idr_init(&sctp_assocs_id); |
| 1290 | 1293 | ||
diff --git a/net/sctp/socket.c b/net/sctp/socket.c index 13bf5fcdbff..54a7cd2fdd7 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c | |||
| @@ -2200,8 +2200,6 @@ static int sctp_setsockopt_autoclose(struct sock *sk, char __user *optval, | |||
| 2200 | return -EINVAL; | 2200 | return -EINVAL; |
| 2201 | if (copy_from_user(&sp->autoclose, optval, optlen)) | 2201 | if (copy_from_user(&sp->autoclose, optval, optlen)) |
| 2202 | return -EFAULT; | 2202 | return -EFAULT; |
| 2203 | /* make sure it won't exceed MAX_SCHEDULE_TIMEOUT */ | ||
| 2204 | sp->autoclose = min_t(long, sp->autoclose, MAX_SCHEDULE_TIMEOUT / HZ); | ||
| 2205 | 2203 | ||
| 2206 | return 0; | 2204 | return 0; |
| 2207 | } | 2205 | } |
diff --git a/net/sctp/sysctl.c b/net/sctp/sysctl.c index 6b3952961b8..60ffbd067ff 100644 --- a/net/sctp/sysctl.c +++ b/net/sctp/sysctl.c | |||
| @@ -53,6 +53,10 @@ static int sack_timer_min = 1; | |||
| 53 | static int sack_timer_max = 500; | 53 | static int sack_timer_max = 500; |
| 54 | static int addr_scope_max = 3; /* check sctp_scope_policy_t in include/net/sctp/constants.h for max entries */ | 54 | static int addr_scope_max = 3; /* check sctp_scope_policy_t in include/net/sctp/constants.h for max entries */ |
| 55 | static int rwnd_scale_max = 16; | 55 | static int rwnd_scale_max = 16; |
| 56 | static unsigned long max_autoclose_min = 0; | ||
| 57 | static unsigned long max_autoclose_max = | ||
| 58 | (MAX_SCHEDULE_TIMEOUT / HZ > UINT_MAX) | ||
| 59 | ? UINT_MAX : MAX_SCHEDULE_TIMEOUT / HZ; | ||
| 56 | 60 | ||
| 57 | extern long sysctl_sctp_mem[3]; | 61 | extern long sysctl_sctp_mem[3]; |
| 58 | extern int sysctl_sctp_rmem[3]; | 62 | extern int sysctl_sctp_rmem[3]; |
| @@ -258,6 +262,15 @@ static ctl_table sctp_table[] = { | |||
| 258 | .extra1 = &one, | 262 | .extra1 = &one, |
| 259 | .extra2 = &rwnd_scale_max, | 263 | .extra2 = &rwnd_scale_max, |
| 260 | }, | 264 | }, |
| 265 | { | ||
| 266 | .procname = "max_autoclose", | ||
| 267 | .data = &sctp_max_autoclose, | ||
| 268 | .maxlen = sizeof(unsigned long), | ||
| 269 | .mode = 0644, | ||
| 270 | .proc_handler = &proc_doulongvec_minmax, | ||
| 271 | .extra1 = &max_autoclose_min, | ||
| 272 | .extra2 = &max_autoclose_max, | ||
| 273 | }, | ||
| 261 | 274 | ||
| 262 | { /* sentinel */ } | 275 | { /* sentinel */ } |
| 263 | }; | 276 | }; |
diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c index d12ffa54581..00a1a2acd58 100644 --- a/net/sunrpc/sched.c +++ b/net/sunrpc/sched.c | |||
| @@ -590,6 +590,27 @@ void rpc_prepare_task(struct rpc_task *task) | |||
| 590 | task->tk_ops->rpc_call_prepare(task, task->tk_calldata); | 590 | task->tk_ops->rpc_call_prepare(task, task->tk_calldata); |
| 591 | } | 591 | } |
| 592 | 592 | ||
| 593 | static void | ||
| 594 | rpc_init_task_statistics(struct rpc_task *task) | ||
| 595 | { | ||
| 596 | /* Initialize retry counters */ | ||
| 597 | task->tk_garb_retry = 2; | ||
| 598 | task->tk_cred_retry = 2; | ||
| 599 | task->tk_rebind_retry = 2; | ||
| 600 | |||
| 601 | /* starting timestamp */ | ||
| 602 | task->tk_start = ktime_get(); | ||
| 603 | } | ||
| 604 | |||
| 605 | static void | ||
| 606 | rpc_reset_task_statistics(struct rpc_task *task) | ||
| 607 | { | ||
| 608 | task->tk_timeouts = 0; | ||
| 609 | task->tk_flags &= ~(RPC_CALL_MAJORSEEN|RPC_TASK_KILLED|RPC_TASK_SENT); | ||
| 610 | |||
| 611 | rpc_init_task_statistics(task); | ||
| 612 | } | ||
| 613 | |||
| 593 | /* | 614 | /* |
| 594 | * Helper that calls task->tk_ops->rpc_call_done if it exists | 615 | * Helper that calls task->tk_ops->rpc_call_done if it exists |
| 595 | */ | 616 | */ |
| @@ -602,6 +623,7 @@ void rpc_exit_task(struct rpc_task *task) | |||
| 602 | WARN_ON(RPC_ASSASSINATED(task)); | 623 | WARN_ON(RPC_ASSASSINATED(task)); |
| 603 | /* Always release the RPC slot and buffer memory */ | 624 | /* Always release the RPC slot and buffer memory */ |
| 604 | xprt_release(task); | 625 | xprt_release(task); |
| 626 | rpc_reset_task_statistics(task); | ||
| 605 | } | 627 | } |
| 606 | } | 628 | } |
| 607 | } | 629 | } |
| @@ -804,11 +826,6 @@ static void rpc_init_task(struct rpc_task *task, const struct rpc_task_setup *ta | |||
| 804 | task->tk_calldata = task_setup_data->callback_data; | 826 | task->tk_calldata = task_setup_data->callback_data; |
| 805 | INIT_LIST_HEAD(&task->tk_task); | 827 | INIT_LIST_HEAD(&task->tk_task); |
| 806 | 828 | ||
| 807 | /* Initialize retry counters */ | ||
| 808 | task->tk_garb_retry = 2; | ||
| 809 | task->tk_cred_retry = 2; | ||
| 810 | task->tk_rebind_retry = 2; | ||
| 811 | |||
| 812 | task->tk_priority = task_setup_data->priority - RPC_PRIORITY_LOW; | 829 | task->tk_priority = task_setup_data->priority - RPC_PRIORITY_LOW; |
| 813 | task->tk_owner = current->tgid; | 830 | task->tk_owner = current->tgid; |
| 814 | 831 | ||
| @@ -818,8 +835,7 @@ static void rpc_init_task(struct rpc_task *task, const struct rpc_task_setup *ta | |||
| 818 | if (task->tk_ops->rpc_call_prepare != NULL) | 835 | if (task->tk_ops->rpc_call_prepare != NULL) |
| 819 | task->tk_action = rpc_prepare_task; | 836 | task->tk_action = rpc_prepare_task; |
| 820 | 837 | ||
| 821 | /* starting timestamp */ | 838 | rpc_init_task_statistics(task); |
| 822 | task->tk_start = ktime_get(); | ||
| 823 | 839 | ||
| 824 | dprintk("RPC: new task initialized, procpid %u\n", | 840 | dprintk("RPC: new task initialized, procpid %u\n", |
| 825 | task_pid_nr(current)); | 841 | task_pid_nr(current)); |
diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c index f4385e45a5f..c64c0ef519b 100644 --- a/net/sunrpc/xprt.c +++ b/net/sunrpc/xprt.c | |||
| @@ -995,13 +995,11 @@ out_init_req: | |||
| 995 | 995 | ||
| 996 | static void xprt_free_slot(struct rpc_xprt *xprt, struct rpc_rqst *req) | 996 | static void xprt_free_slot(struct rpc_xprt *xprt, struct rpc_rqst *req) |
| 997 | { | 997 | { |
| 998 | if (xprt_dynamic_free_slot(xprt, req)) | ||
| 999 | return; | ||
| 1000 | |||
| 1001 | memset(req, 0, sizeof(*req)); /* mark unused */ | ||
| 1002 | |||
| 1003 | spin_lock(&xprt->reserve_lock); | 998 | spin_lock(&xprt->reserve_lock); |
| 1004 | list_add(&req->rq_list, &xprt->free); | 999 | if (!xprt_dynamic_free_slot(xprt, req)) { |
| 1000 | memset(req, 0, sizeof(*req)); /* mark unused */ | ||
| 1001 | list_add(&req->rq_list, &xprt->free); | ||
| 1002 | } | ||
| 1005 | rpc_wake_up_next(&xprt->backlog); | 1003 | rpc_wake_up_next(&xprt->backlog); |
| 1006 | spin_unlock(&xprt->reserve_lock); | 1004 | spin_unlock(&xprt->reserve_lock); |
| 1007 | } | 1005 | } |
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index 2118d644663..9049a5caeb2 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c | |||
| @@ -2276,8 +2276,6 @@ static void __xfrm_garbage_collect(struct net *net) | |||
| 2276 | { | 2276 | { |
| 2277 | struct dst_entry *head, *next; | 2277 | struct dst_entry *head, *next; |
| 2278 | 2278 | ||
| 2279 | flow_cache_flush(); | ||
| 2280 | |||
| 2281 | spin_lock_bh(&xfrm_policy_sk_bundle_lock); | 2279 | spin_lock_bh(&xfrm_policy_sk_bundle_lock); |
| 2282 | head = xfrm_policy_sk_bundles; | 2280 | head = xfrm_policy_sk_bundles; |
| 2283 | xfrm_policy_sk_bundles = NULL; | 2281 | xfrm_policy_sk_bundles = NULL; |
| @@ -2290,6 +2288,18 @@ static void __xfrm_garbage_collect(struct net *net) | |||
| 2290 | } | 2288 | } |
| 2291 | } | 2289 | } |
| 2292 | 2290 | ||
| 2291 | static void xfrm_garbage_collect(struct net *net) | ||
| 2292 | { | ||
| 2293 | flow_cache_flush(); | ||
| 2294 | __xfrm_garbage_collect(net); | ||
| 2295 | } | ||
| 2296 | |||
| 2297 | static void xfrm_garbage_collect_deferred(struct net *net) | ||
| 2298 | { | ||
| 2299 | flow_cache_flush_deferred(); | ||
| 2300 | __xfrm_garbage_collect(net); | ||
| 2301 | } | ||
| 2302 | |||
| 2293 | static void xfrm_init_pmtu(struct dst_entry *dst) | 2303 | static void xfrm_init_pmtu(struct dst_entry *dst) |
| 2294 | { | 2304 | { |
| 2295 | do { | 2305 | do { |
| @@ -2422,7 +2432,7 @@ int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo) | |||
| 2422 | if (likely(dst_ops->neigh_lookup == NULL)) | 2432 | if (likely(dst_ops->neigh_lookup == NULL)) |
| 2423 | dst_ops->neigh_lookup = xfrm_neigh_lookup; | 2433 | dst_ops->neigh_lookup = xfrm_neigh_lookup; |
| 2424 | if (likely(afinfo->garbage_collect == NULL)) | 2434 | if (likely(afinfo->garbage_collect == NULL)) |
| 2425 | afinfo->garbage_collect = __xfrm_garbage_collect; | 2435 | afinfo->garbage_collect = xfrm_garbage_collect_deferred; |
| 2426 | xfrm_policy_afinfo[afinfo->family] = afinfo; | 2436 | xfrm_policy_afinfo[afinfo->family] = afinfo; |
| 2427 | } | 2437 | } |
| 2428 | write_unlock_bh(&xfrm_policy_afinfo_lock); | 2438 | write_unlock_bh(&xfrm_policy_afinfo_lock); |
| @@ -2516,7 +2526,7 @@ static int xfrm_dev_event(struct notifier_block *this, unsigned long event, void | |||
| 2516 | 2526 | ||
| 2517 | switch (event) { | 2527 | switch (event) { |
| 2518 | case NETDEV_DOWN: | 2528 | case NETDEV_DOWN: |
| 2519 | __xfrm_garbage_collect(dev_net(dev)); | 2529 | xfrm_garbage_collect(dev_net(dev)); |
| 2520 | } | 2530 | } |
| 2521 | return NOTIFY_DONE; | 2531 | return NOTIFY_DONE; |
| 2522 | } | 2532 | } |
diff --git a/scripts/kconfig/Makefile b/scripts/kconfig/Makefile index ba573fe7c74..914833d99b0 100644 --- a/scripts/kconfig/Makefile +++ b/scripts/kconfig/Makefile | |||
| @@ -60,8 +60,8 @@ update-po-config: $(obj)/kxgettext $(obj)/gconf.glade.h | |||
| 60 | --directory=$(srctree) --directory=$(objtree) \ | 60 | --directory=$(srctree) --directory=$(objtree) \ |
| 61 | --output $(obj)/config.pot | 61 | --output $(obj)/config.pot |
| 62 | $(Q)sed -i s/CHARSET/UTF-8/ $(obj)/config.pot | 62 | $(Q)sed -i s/CHARSET/UTF-8/ $(obj)/config.pot |
| 63 | $(Q)ln -fs Kconfig.x86 arch/um/Kconfig | 63 | $(Q)(for i in `ls $(srctree)/arch/*/Kconfig \ |
| 64 | $(Q)(for i in `ls $(srctree)/arch/*/Kconfig`; \ | 64 | $(srctree)/arch/*/um/Kconfig`; \ |
| 65 | do \ | 65 | do \ |
| 66 | echo " GEN $$i"; \ | 66 | echo " GEN $$i"; \ |
| 67 | $(obj)/kxgettext $$i \ | 67 | $(obj)/kxgettext $$i \ |
| @@ -69,7 +69,6 @@ update-po-config: $(obj)/kxgettext $(obj)/gconf.glade.h | |||
| 69 | done ) | 69 | done ) |
| 70 | $(Q)msguniq --sort-by-file --to-code=UTF-8 $(obj)/config.pot \ | 70 | $(Q)msguniq --sort-by-file --to-code=UTF-8 $(obj)/config.pot \ |
| 71 | --output $(obj)/linux.pot | 71 | --output $(obj)/linux.pot |
| 72 | $(Q)rm -f $(srctree)/arch/um/Kconfig | ||
| 73 | $(Q)rm -f $(obj)/config.pot | 72 | $(Q)rm -f $(obj)/config.pot |
| 74 | 73 | ||
| 75 | PHONY += allnoconfig allyesconfig allmodconfig alldefconfig randconfig | 74 | PHONY += allnoconfig allyesconfig allmodconfig alldefconfig randconfig |
diff --git a/security/integrity/evm/evm_crypto.c b/security/integrity/evm/evm_crypto.c index 5dd5b140242..8738deff26f 100644 --- a/security/integrity/evm/evm_crypto.c +++ b/security/integrity/evm/evm_crypto.c | |||
| @@ -27,20 +27,35 @@ static int evmkey_len = MAX_KEY_SIZE; | |||
| 27 | 27 | ||
| 28 | struct crypto_shash *hmac_tfm; | 28 | struct crypto_shash *hmac_tfm; |
| 29 | 29 | ||
| 30 | static DEFINE_MUTEX(mutex); | ||
| 31 | |||
| 30 | static struct shash_desc *init_desc(void) | 32 | static struct shash_desc *init_desc(void) |
| 31 | { | 33 | { |
| 32 | int rc; | 34 | int rc; |
| 33 | struct shash_desc *desc; | 35 | struct shash_desc *desc; |
| 34 | 36 | ||
| 35 | if (hmac_tfm == NULL) { | 37 | if (hmac_tfm == NULL) { |
| 38 | mutex_lock(&mutex); | ||
| 39 | if (hmac_tfm) | ||
| 40 | goto out; | ||
| 36 | hmac_tfm = crypto_alloc_shash(evm_hmac, 0, CRYPTO_ALG_ASYNC); | 41 | hmac_tfm = crypto_alloc_shash(evm_hmac, 0, CRYPTO_ALG_ASYNC); |
| 37 | if (IS_ERR(hmac_tfm)) { | 42 | if (IS_ERR(hmac_tfm)) { |
| 38 | pr_err("Can not allocate %s (reason: %ld)\n", | 43 | pr_err("Can not allocate %s (reason: %ld)\n", |
| 39 | evm_hmac, PTR_ERR(hmac_tfm)); | 44 | evm_hmac, PTR_ERR(hmac_tfm)); |
| 40 | rc = PTR_ERR(hmac_tfm); | 45 | rc = PTR_ERR(hmac_tfm); |
| 41 | hmac_tfm = NULL; | 46 | hmac_tfm = NULL; |
| 47 | mutex_unlock(&mutex); | ||
| 48 | return ERR_PTR(rc); | ||
| 49 | } | ||
| 50 | rc = crypto_shash_setkey(hmac_tfm, evmkey, evmkey_len); | ||
| 51 | if (rc) { | ||
| 52 | crypto_free_shash(hmac_tfm); | ||
| 53 | hmac_tfm = NULL; | ||
| 54 | mutex_unlock(&mutex); | ||
| 42 | return ERR_PTR(rc); | 55 | return ERR_PTR(rc); |
| 43 | } | 56 | } |
| 57 | out: | ||
| 58 | mutex_unlock(&mutex); | ||
| 44 | } | 59 | } |
| 45 | 60 | ||
| 46 | desc = kmalloc(sizeof(*desc) + crypto_shash_descsize(hmac_tfm), | 61 | desc = kmalloc(sizeof(*desc) + crypto_shash_descsize(hmac_tfm), |
| @@ -51,11 +66,7 @@ static struct shash_desc *init_desc(void) | |||
| 51 | desc->tfm = hmac_tfm; | 66 | desc->tfm = hmac_tfm; |
| 52 | desc->flags = CRYPTO_TFM_REQ_MAY_SLEEP; | 67 | desc->flags = CRYPTO_TFM_REQ_MAY_SLEEP; |
| 53 | 68 | ||
| 54 | rc = crypto_shash_setkey(hmac_tfm, evmkey, evmkey_len); | ||
| 55 | if (rc) | ||
| 56 | goto out; | ||
| 57 | rc = crypto_shash_init(desc); | 69 | rc = crypto_shash_init(desc); |
| 58 | out: | ||
| 59 | if (rc) { | 70 | if (rc) { |
| 60 | kfree(desc); | 71 | kfree(desc); |
| 61 | return ERR_PTR(rc); | 72 | return ERR_PTR(rc); |
diff --git a/security/selinux/netport.c b/security/selinux/netport.c index 0b62bd11246..7b9eb1faf68 100644 --- a/security/selinux/netport.c +++ b/security/selinux/netport.c | |||
| @@ -123,7 +123,9 @@ static void sel_netport_insert(struct sel_netport *port) | |||
| 123 | if (sel_netport_hash[idx].size == SEL_NETPORT_HASH_BKT_LIMIT) { | 123 | if (sel_netport_hash[idx].size == SEL_NETPORT_HASH_BKT_LIMIT) { |
| 124 | struct sel_netport *tail; | 124 | struct sel_netport *tail; |
| 125 | tail = list_entry( | 125 | tail = list_entry( |
| 126 | rcu_dereference(sel_netport_hash[idx].list.prev), | 126 | rcu_dereference_protected( |
| 127 | sel_netport_hash[idx].list.prev, | ||
| 128 | lockdep_is_held(&sel_netport_lock)), | ||
| 127 | struct sel_netport, list); | 129 | struct sel_netport, list); |
| 128 | list_del_rcu(&tail->list); | 130 | list_del_rcu(&tail->list); |
| 129 | kfree_rcu(tail, rcu); | 131 | kfree_rcu(tail, rcu); |
diff --git a/sound/atmel/ac97c.c b/sound/atmel/ac97c.c index 6e5addeb236..73516f69ac7 100644 --- a/sound/atmel/ac97c.c +++ b/sound/atmel/ac97c.c | |||
| @@ -899,6 +899,10 @@ static void atmel_ac97c_reset(struct atmel_ac97c *chip) | |||
| 899 | /* AC97 v2.2 specifications says minimum 1 us. */ | 899 | /* AC97 v2.2 specifications says minimum 1 us. */ |
| 900 | udelay(2); | 900 | udelay(2); |
| 901 | gpio_set_value(chip->reset_pin, 1); | 901 | gpio_set_value(chip->reset_pin, 1); |
| 902 | } else { | ||
| 903 | ac97c_writel(chip, MR, AC97C_MR_WRST | AC97C_MR_ENA); | ||
| 904 | udelay(2); | ||
| 905 | ac97c_writel(chip, MR, AC97C_MR_ENA); | ||
| 902 | } | 906 | } |
| 903 | } | 907 | } |
| 904 | 908 | ||
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 7d98240def0..c2f79e63124 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
| @@ -2507,6 +2507,7 @@ static struct snd_pci_quirk position_fix_list[] __devinitdata = { | |||
| 2507 | SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", POS_FIX_LPIB), | 2507 | SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", POS_FIX_LPIB), |
| 2508 | SND_PCI_QUIRK(0x1043, 0x81b3, "ASUS", POS_FIX_LPIB), | 2508 | SND_PCI_QUIRK(0x1043, 0x81b3, "ASUS", POS_FIX_LPIB), |
| 2509 | SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS M2V", POS_FIX_LPIB), | 2509 | SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS M2V", POS_FIX_LPIB), |
| 2510 | SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS 1101HA", POS_FIX_LPIB), | ||
| 2510 | SND_PCI_QUIRK(0x104d, 0x9069, "Sony VPCS11V9E", POS_FIX_LPIB), | 2511 | SND_PCI_QUIRK(0x104d, 0x9069, "Sony VPCS11V9E", POS_FIX_LPIB), |
| 2511 | SND_PCI_QUIRK(0x1297, 0x3166, "Shuttle", POS_FIX_LPIB), | 2512 | SND_PCI_QUIRK(0x1297, 0x3166, "Shuttle", POS_FIX_LPIB), |
| 2512 | SND_PCI_QUIRK(0x1458, 0xa022, "ga-ma770-ud3", POS_FIX_LPIB), | 2513 | SND_PCI_QUIRK(0x1458, 0xa022, "ga-ma770-ud3", POS_FIX_LPIB), |
| @@ -2970,7 +2971,8 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = { | |||
| 2970 | /* SCH */ | 2971 | /* SCH */ |
| 2971 | { PCI_DEVICE(0x8086, 0x811b), | 2972 | { PCI_DEVICE(0x8086, 0x811b), |
| 2972 | .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP | | 2973 | .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP | |
| 2973 | AZX_DCAPS_BUFSIZE}, | 2974 | AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_LPIB }, /* Poulsbo */ |
| 2975 | /* ICH */ | ||
| 2974 | { PCI_DEVICE(0x8086, 0x2668), | 2976 | { PCI_DEVICE(0x8086, 0x2668), |
| 2975 | .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC | | 2977 | .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC | |
| 2976 | AZX_DCAPS_BUFSIZE }, /* ICH6 */ | 2978 | AZX_DCAPS_BUFSIZE }, /* ICH6 */ |
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index eeb25d529e3..616678fde48 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
| @@ -4929,6 +4929,12 @@ static int find_mute_led_gpio(struct hda_codec *codec, int default_polarity) | |||
| 4929 | set_hp_led_gpio(codec); | 4929 | set_hp_led_gpio(codec); |
| 4930 | return 1; | 4930 | return 1; |
| 4931 | } | 4931 | } |
| 4932 | /* BIOS bug: unfilled OEM string */ | ||
| 4933 | if (strstr(dev->name, "HP_Mute_LED_P_G")) { | ||
| 4934 | set_hp_led_gpio(codec); | ||
| 4935 | spec->gpio_led_polarity = 1; | ||
| 4936 | return 1; | ||
| 4937 | } | ||
| 4932 | } | 4938 | } |
| 4933 | 4939 | ||
| 4934 | /* | 4940 | /* |
diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig index 4584514d93d..fa787d45d74 100644 --- a/sound/soc/codecs/Kconfig +++ b/sound/soc/codecs/Kconfig | |||
| @@ -33,7 +33,7 @@ config SND_SOC_ALL_CODECS | |||
| 33 | select SND_SOC_CX20442 | 33 | select SND_SOC_CX20442 |
| 34 | select SND_SOC_DA7210 if I2C | 34 | select SND_SOC_DA7210 if I2C |
| 35 | select SND_SOC_DFBMCS320 | 35 | select SND_SOC_DFBMCS320 |
| 36 | select SND_SOC_JZ4740_CODEC if SOC_JZ4740 | 36 | select SND_SOC_JZ4740_CODEC |
| 37 | select SND_SOC_LM4857 if I2C | 37 | select SND_SOC_LM4857 if I2C |
| 38 | select SND_SOC_MAX98088 if I2C | 38 | select SND_SOC_MAX98088 if I2C |
| 39 | select SND_SOC_MAX98095 if I2C | 39 | select SND_SOC_MAX98095 if I2C |
diff --git a/sound/soc/codecs/jz4740.c b/sound/soc/codecs/jz4740.c index e373f8f0690..3e1f4e172bf 100644 --- a/sound/soc/codecs/jz4740.c +++ b/sound/soc/codecs/jz4740.c | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | #include <linux/module.h> | 15 | #include <linux/module.h> |
| 16 | #include <linux/platform_device.h> | 16 | #include <linux/platform_device.h> |
| 17 | #include <linux/slab.h> | 17 | #include <linux/slab.h> |
| 18 | #include <linux/io.h> | ||
| 18 | 19 | ||
| 19 | #include <linux/delay.h> | 20 | #include <linux/delay.h> |
| 20 | 21 | ||
diff --git a/sound/soc/codecs/wm8958-dsp2.c b/sound/soc/codecs/wm8958-dsp2.c index 0293763debe..5a14d5c0e0e 100644 --- a/sound/soc/codecs/wm8958-dsp2.c +++ b/sound/soc/codecs/wm8958-dsp2.c | |||
| @@ -60,6 +60,8 @@ static int wm8958_dsp2_fw(struct snd_soc_codec *codec, const char *name, | |||
| 60 | } | 60 | } |
| 61 | 61 | ||
| 62 | if (memcmp(fw->data, "WMFW", 4) != 0) { | 62 | if (memcmp(fw->data, "WMFW", 4) != 0) { |
| 63 | memcpy(&data32, fw->data, sizeof(data32)); | ||
| 64 | data32 = be32_to_cpu(data32); | ||
| 63 | dev_err(codec->dev, "%s: firmware has bad file magic %08x\n", | 65 | dev_err(codec->dev, "%s: firmware has bad file magic %08x\n", |
| 64 | name, data32); | 66 | name, data32); |
| 65 | goto err; | 67 | goto err; |
diff --git a/sound/soc/codecs/wm8996.c b/sound/soc/codecs/wm8996.c index 645c980d6b8..a33b04d1719 100644 --- a/sound/soc/codecs/wm8996.c +++ b/sound/soc/codecs/wm8996.c | |||
| @@ -1968,6 +1968,7 @@ static int wm8996_set_sysclk(struct snd_soc_dai *dai, | |||
| 1968 | break; | 1968 | break; |
| 1969 | case 24576000: | 1969 | case 24576000: |
| 1970 | ratediv = WM8996_SYSCLK_DIV; | 1970 | ratediv = WM8996_SYSCLK_DIV; |
| 1971 | wm8996->sysclk /= 2; | ||
| 1971 | case 12288000: | 1972 | case 12288000: |
| 1972 | snd_soc_update_bits(codec, WM8996_AIF_RATE, | 1973 | snd_soc_update_bits(codec, WM8996_AIF_RATE, |
| 1973 | WM8996_SYSCLK_RATE, WM8996_SYSCLK_RATE); | 1974 | WM8996_SYSCLK_RATE, WM8996_SYSCLK_RATE); |
diff --git a/sound/soc/mxs/mxs-pcm.c b/sound/soc/mxs/mxs-pcm.c index dea5aa4aa64..f39d7dd9fbc 100644 --- a/sound/soc/mxs/mxs-pcm.c +++ b/sound/soc/mxs/mxs-pcm.c | |||
| @@ -357,3 +357,6 @@ static void __exit snd_mxs_pcm_exit(void) | |||
| 357 | platform_driver_unregister(&mxs_pcm_driver); | 357 | platform_driver_unregister(&mxs_pcm_driver); |
| 358 | } | 358 | } |
| 359 | module_exit(snd_mxs_pcm_exit); | 359 | module_exit(snd_mxs_pcm_exit); |
| 360 | |||
| 361 | MODULE_LICENSE("GPL"); | ||
| 362 | MODULE_ALIAS("platform:mxs-pcm-audio"); | ||
diff --git a/sound/soc/mxs/mxs-sgtl5000.c b/sound/soc/mxs/mxs-sgtl5000.c index 7fbeaec06eb..1c57f6630a4 100644 --- a/sound/soc/mxs/mxs-sgtl5000.c +++ b/sound/soc/mxs/mxs-sgtl5000.c | |||
| @@ -171,3 +171,4 @@ module_exit(mxs_sgtl5000_exit); | |||
| 171 | MODULE_AUTHOR("Freescale Semiconductor, Inc."); | 171 | MODULE_AUTHOR("Freescale Semiconductor, Inc."); |
| 172 | MODULE_DESCRIPTION("MXS ALSA SoC Machine driver"); | 172 | MODULE_DESCRIPTION("MXS ALSA SoC Machine driver"); |
| 173 | MODULE_LICENSE("GPL"); | 173 | MODULE_LICENSE("GPL"); |
| 174 | MODULE_ALIAS("platform:mxs-sgtl5000"); | ||
diff --git a/sound/soc/pxa/hx4700.c b/sound/soc/pxa/hx4700.c index 65c124831a0..c664e33fb6d 100644 --- a/sound/soc/pxa/hx4700.c +++ b/sound/soc/pxa/hx4700.c | |||
| @@ -209,9 +209,10 @@ static int __devinit hx4700_audio_probe(struct platform_device *pdev) | |||
| 209 | snd_soc_card_hx4700.dev = &pdev->dev; | 209 | snd_soc_card_hx4700.dev = &pdev->dev; |
| 210 | ret = snd_soc_register_card(&snd_soc_card_hx4700); | 210 | ret = snd_soc_register_card(&snd_soc_card_hx4700); |
| 211 | if (ret) | 211 | if (ret) |
| 212 | return ret; | 212 | gpio_free_array(hx4700_audio_gpios, |
| 213 | ARRAY_SIZE(hx4700_audio_gpios)); | ||
| 213 | 214 | ||
| 214 | return 0; | 215 | return ret; |
| 215 | } | 216 | } |
| 216 | 217 | ||
| 217 | static int __devexit hx4700_audio_remove(struct platform_device *pdev) | 218 | static int __devexit hx4700_audio_remove(struct platform_device *pdev) |
diff --git a/sound/soc/samsung/jive_wm8750.c b/sound/soc/samsung/jive_wm8750.c index 1826acf20f7..8e523fd9189 100644 --- a/sound/soc/samsung/jive_wm8750.c +++ b/sound/soc/samsung/jive_wm8750.c | |||
| @@ -101,7 +101,6 @@ static int jive_wm8750_init(struct snd_soc_pcm_runtime *rtd) | |||
| 101 | { | 101 | { |
| 102 | struct snd_soc_codec *codec = rtd->codec; | 102 | struct snd_soc_codec *codec = rtd->codec; |
| 103 | struct snd_soc_dapm_context *dapm = &codec->dapm; | 103 | struct snd_soc_dapm_context *dapm = &codec->dapm; |
| 104 | int err; | ||
| 105 | 104 | ||
| 106 | /* These endpoints are not being used. */ | 105 | /* These endpoints are not being used. */ |
| 107 | snd_soc_dapm_nc_pin(dapm, "LINPUT2"); | 106 | snd_soc_dapm_nc_pin(dapm, "LINPUT2"); |
| @@ -131,7 +130,7 @@ static struct snd_soc_card snd_soc_machine_jive = { | |||
| 131 | .dai_link = &jive_dai, | 130 | .dai_link = &jive_dai, |
| 132 | .num_links = 1, | 131 | .num_links = 1, |
| 133 | 132 | ||
| 134 | .dapm_widgtets = wm8750_dapm_widgets, | 133 | .dapm_widgets = wm8750_dapm_widgets, |
| 135 | .num_dapm_widgets = ARRAY_SIZE(wm8750_dapm_widgets), | 134 | .num_dapm_widgets = ARRAY_SIZE(wm8750_dapm_widgets), |
| 136 | .dapm_routes = audio_map, | 135 | .dapm_routes = audio_map, |
| 137 | .num_dapm_routes = ARRAY_SIZE(audio_map), | 136 | .num_dapm_routes = ARRAY_SIZE(audio_map), |
diff --git a/sound/soc/samsung/smdk2443_wm9710.c b/sound/soc/samsung/smdk2443_wm9710.c index 3a0dbfc793f..8bd1dc5706b 100644 --- a/sound/soc/samsung/smdk2443_wm9710.c +++ b/sound/soc/samsung/smdk2443_wm9710.c | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | * | 12 | * |
| 13 | */ | 13 | */ |
| 14 | 14 | ||
| 15 | #include <linux/module.h> | ||
| 15 | #include <sound/soc.h> | 16 | #include <sound/soc.h> |
| 16 | 17 | ||
| 17 | static struct snd_soc_card smdk2443; | 18 | static struct snd_soc_card smdk2443; |
