diff options
356 files changed, 3242 insertions, 2673 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index 9a648eb8e213..75a9a5fc230a 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -269,7 +269,6 @@ S: Orphan | |||
| 269 | F: drivers/platform/x86/wmi.c | 269 | F: drivers/platform/x86/wmi.c |
| 270 | 270 | ||
| 271 | AD1889 ALSA SOUND DRIVER | 271 | AD1889 ALSA SOUND DRIVER |
| 272 | M: Kyle McMartin <kyle@mcmartin.ca> | ||
| 273 | M: Thibaut Varene <T-Bone@parisc-linux.org> | 272 | M: Thibaut Varene <T-Bone@parisc-linux.org> |
| 274 | W: http://wiki.parisc-linux.org/AD1889 | 273 | W: http://wiki.parisc-linux.org/AD1889 |
| 275 | L: linux-parisc@vger.kernel.org | 274 | L: linux-parisc@vger.kernel.org |
| @@ -3047,7 +3046,6 @@ F: drivers/hwspinlock/hwspinlock_* | |||
| 3047 | F: include/linux/hwspinlock.h | 3046 | F: include/linux/hwspinlock.h |
| 3048 | 3047 | ||
| 3049 | HARMONY SOUND DRIVER | 3048 | HARMONY SOUND DRIVER |
| 3050 | M: Kyle McMartin <kyle@mcmartin.ca> | ||
| 3051 | L: linux-parisc@vger.kernel.org | 3049 | L: linux-parisc@vger.kernel.org |
| 3052 | S: Maintained | 3050 | S: Maintained |
| 3053 | F: sound/parisc/harmony.* | 3051 | F: sound/parisc/harmony.* |
| @@ -5000,9 +4998,8 @@ F: Documentation/blockdev/paride.txt | |||
| 5000 | F: drivers/block/paride/ | 4998 | F: drivers/block/paride/ |
| 5001 | 4999 | ||
| 5002 | PARISC ARCHITECTURE | 5000 | PARISC ARCHITECTURE |
| 5003 | M: Kyle McMartin <kyle@mcmartin.ca> | ||
| 5004 | M: Helge Deller <deller@gmx.de> | ||
| 5005 | M: "James E.J. Bottomley" <jejb@parisc-linux.org> | 5001 | M: "James E.J. Bottomley" <jejb@parisc-linux.org> |
| 5002 | M: Helge Deller <deller@gmx.de> | ||
| 5006 | L: linux-parisc@vger.kernel.org | 5003 | L: linux-parisc@vger.kernel.org |
| 5007 | W: http://www.parisc-linux.org/ | 5004 | W: http://www.parisc-linux.org/ |
| 5008 | Q: http://patchwork.kernel.org/project/linux-parisc/list/ | 5005 | Q: http://patchwork.kernel.org/project/linux-parisc/list/ |
| @@ -5861,7 +5858,7 @@ S: Maintained | |||
| 5861 | F: drivers/mmc/host/sdhci-spear.c | 5858 | F: drivers/mmc/host/sdhci-spear.c |
| 5862 | 5859 | ||
| 5863 | SECURITY SUBSYSTEM | 5860 | SECURITY SUBSYSTEM |
| 5864 | M: James Morris <jmorris@namei.org> | 5861 | M: James Morris <james.l.morris@oracle.com> |
| 5865 | L: linux-security-module@vger.kernel.org (suggested Cc:) | 5862 | L: linux-security-module@vger.kernel.org (suggested Cc:) |
| 5866 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security.git | 5863 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security.git |
| 5867 | W: http://security.wiki.kernel.org/ | 5864 | W: http://security.wiki.kernel.org/ |
| @@ -5874,7 +5871,7 @@ S: Supported | |||
| 5874 | 5871 | ||
| 5875 | SELINUX SECURITY MODULE | 5872 | SELINUX SECURITY MODULE |
| 5876 | M: Stephen Smalley <sds@tycho.nsa.gov> | 5873 | M: Stephen Smalley <sds@tycho.nsa.gov> |
| 5877 | M: James Morris <jmorris@namei.org> | 5874 | M: James Morris <james.l.morris@oracle.com> |
| 5878 | M: Eric Paris <eparis@parisplace.org> | 5875 | M: Eric Paris <eparis@parisplace.org> |
| 5879 | L: selinux@tycho.nsa.gov (subscribers-only, general discussion) | 5876 | L: selinux@tycho.nsa.gov (subscribers-only, general discussion) |
| 5880 | W: http://selinuxproject.org | 5877 | W: http://selinuxproject.org |
| @@ -1,7 +1,7 @@ | |||
| 1 | VERSION = 3 | 1 | VERSION = 3 |
| 2 | PATCHLEVEL = 3 | 2 | PATCHLEVEL = 3 |
| 3 | SUBLEVEL = 0 | 3 | SUBLEVEL = 0 |
| 4 | EXTRAVERSION = -rc3 | 4 | EXTRAVERSION = -rc4 |
| 5 | NAME = Saber-toothed Squirrel | 5 | NAME = Saber-toothed Squirrel |
| 6 | 6 | ||
| 7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
diff --git a/arch/arm/boot/dts/exynos4210.dtsi b/arch/arm/boot/dts/exynos4210.dtsi index 63d7578856c1..a1dd2ee83753 100644 --- a/arch/arm/boot/dts/exynos4210.dtsi +++ b/arch/arm/boot/dts/exynos4210.dtsi | |||
| @@ -29,6 +29,7 @@ | |||
| 29 | compatible = "arm,cortex-a9-gic"; | 29 | compatible = "arm,cortex-a9-gic"; |
| 30 | #interrupt-cells = <3>; | 30 | #interrupt-cells = <3>; |
| 31 | interrupt-controller; | 31 | interrupt-controller; |
| 32 | cpu-offset = <0x8000>; | ||
| 32 | reg = <0x10490000 0x1000>, <0x10480000 0x100>; | 33 | reg = <0x10490000 0x1000>, <0x10480000 0x100>; |
| 33 | }; | 34 | }; |
| 34 | 35 | ||
diff --git a/arch/arm/boot/dts/tegra-paz00.dts b/arch/arm/boot/dts/tegra-paz00.dts index 1a1d7023b69b..825d2957da0b 100644 --- a/arch/arm/boot/dts/tegra-paz00.dts +++ b/arch/arm/boot/dts/tegra-paz00.dts | |||
| @@ -46,11 +46,11 @@ | |||
| 46 | }; | 46 | }; |
| 47 | 47 | ||
| 48 | serial@70006200 { | 48 | serial@70006200 { |
| 49 | status = "disable"; | 49 | clock-frequency = <216000000>; |
| 50 | }; | 50 | }; |
| 51 | 51 | ||
| 52 | serial@70006300 { | 52 | serial@70006300 { |
| 53 | clock-frequency = <216000000>; | 53 | status = "disable"; |
| 54 | }; | 54 | }; |
| 55 | 55 | ||
| 56 | serial@70006400 { | 56 | serial@70006400 { |
| @@ -60,7 +60,7 @@ | |||
| 60 | sdhci@c8000000 { | 60 | sdhci@c8000000 { |
| 61 | cd-gpios = <&gpio 173 0>; /* gpio PV5 */ | 61 | cd-gpios = <&gpio 173 0>; /* gpio PV5 */ |
| 62 | wp-gpios = <&gpio 57 0>; /* gpio PH1 */ | 62 | wp-gpios = <&gpio 57 0>; /* gpio PH1 */ |
| 63 | power-gpios = <&gpio 155 0>; /* gpio PT3 */ | 63 | power-gpios = <&gpio 169 0>; /* gpio PV1 */ |
| 64 | }; | 64 | }; |
| 65 | 65 | ||
| 66 | sdhci@c8000200 { | 66 | sdhci@c8000200 { |
diff --git a/arch/arm/common/it8152.c b/arch/arm/common/it8152.c index d1bcd7b13ebc..fb1f1cfce60c 100644 --- a/arch/arm/common/it8152.c +++ b/arch/arm/common/it8152.c | |||
| @@ -320,13 +320,6 @@ err0: | |||
| 320 | return -EBUSY; | 320 | return -EBUSY; |
| 321 | } | 321 | } |
| 322 | 322 | ||
| 323 | /* | ||
| 324 | * If we set up a device for bus mastering, we need to check the latency | ||
| 325 | * timer as we don't have even crappy BIOSes to set it properly. | ||
| 326 | * The implementation is from arch/i386/pci/i386.c | ||
| 327 | */ | ||
| 328 | unsigned int pcibios_max_latency = 255; | ||
| 329 | |||
| 330 | /* ITE bridge requires setting latency timer to avoid early bus access | 323 | /* ITE bridge requires setting latency timer to avoid early bus access |
| 331 | termination by PCI bus master devices | 324 | termination by PCI bus master devices |
| 332 | */ | 325 | */ |
diff --git a/arch/arm/common/pl330.c b/arch/arm/common/pl330.c index d8e44a43047c..ff3ad2244824 100644 --- a/arch/arm/common/pl330.c +++ b/arch/arm/common/pl330.c | |||
| @@ -1502,12 +1502,13 @@ int pl330_chan_ctrl(void *ch_id, enum pl330_chan_op op) | |||
| 1502 | struct pl330_thread *thrd = ch_id; | 1502 | struct pl330_thread *thrd = ch_id; |
| 1503 | struct pl330_dmac *pl330; | 1503 | struct pl330_dmac *pl330; |
| 1504 | unsigned long flags; | 1504 | unsigned long flags; |
| 1505 | int ret = 0, active = thrd->req_running; | 1505 | int ret = 0, active; |
| 1506 | 1506 | ||
| 1507 | if (!thrd || thrd->free || thrd->dmac->state == DYING) | 1507 | if (!thrd || thrd->free || thrd->dmac->state == DYING) |
| 1508 | return -EINVAL; | 1508 | return -EINVAL; |
| 1509 | 1509 | ||
| 1510 | pl330 = thrd->dmac; | 1510 | pl330 = thrd->dmac; |
| 1511 | active = thrd->req_running; | ||
| 1511 | 1512 | ||
| 1512 | spin_lock_irqsave(&pl330->lock, flags); | 1513 | spin_lock_irqsave(&pl330->lock, flags); |
| 1513 | 1514 | ||
diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h index 62f8095d46de..23371b17b23e 100644 --- a/arch/arm/include/asm/assembler.h +++ b/arch/arm/include/asm/assembler.h | |||
| @@ -137,6 +137,11 @@ | |||
| 137 | disable_irq | 137 | disable_irq |
| 138 | .endm | 138 | .endm |
| 139 | 139 | ||
| 140 | .macro save_and_disable_irqs_notrace, oldcpsr | ||
| 141 | mrs \oldcpsr, cpsr | ||
| 142 | disable_irq_notrace | ||
| 143 | .endm | ||
| 144 | |||
| 140 | /* | 145 | /* |
| 141 | * Restore interrupt state previously stored in a register. We don't | 146 | * Restore interrupt state previously stored in a register. We don't |
| 142 | * guarantee that this will preserve the flags. | 147 | * guarantee that this will preserve the flags. |
diff --git a/arch/arm/include/asm/hardware/pl330.h b/arch/arm/include/asm/hardware/pl330.h index 575fa8186ca0..c1821385abfa 100644 --- a/arch/arm/include/asm/hardware/pl330.h +++ b/arch/arm/include/asm/hardware/pl330.h | |||
| @@ -41,7 +41,7 @@ enum pl330_dstcachectrl { | |||
| 41 | DCCTRL1, /* Bufferable only */ | 41 | DCCTRL1, /* Bufferable only */ |
| 42 | DCCTRL2, /* Cacheable, but do not allocate */ | 42 | DCCTRL2, /* Cacheable, but do not allocate */ |
| 43 | DCCTRL3, /* Cacheable and bufferable, but do not allocate */ | 43 | DCCTRL3, /* Cacheable and bufferable, but do not allocate */ |
| 44 | DINVALID1 = 8, | 44 | DINVALID1, /* AWCACHE = 0x1000 */ |
| 45 | DINVALID2, | 45 | DINVALID2, |
| 46 | DCCTRL6, /* Cacheable write-through, allocate on writes only */ | 46 | DCCTRL6, /* Cacheable write-through, allocate on writes only */ |
| 47 | DCCTRL7, /* Cacheable write-back, allocate on writes only */ | 47 | DCCTRL7, /* Cacheable write-back, allocate on writes only */ |
diff --git a/arch/arm/include/asm/processor.h b/arch/arm/include/asm/processor.h index ce280b8d613c..cb8d638924fd 100644 --- a/arch/arm/include/asm/processor.h +++ b/arch/arm/include/asm/processor.h | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <asm/hw_breakpoint.h> | 22 | #include <asm/hw_breakpoint.h> |
| 23 | #include <asm/ptrace.h> | 23 | #include <asm/ptrace.h> |
| 24 | #include <asm/types.h> | 24 | #include <asm/types.h> |
| 25 | #include <asm/system.h> | ||
| 25 | 26 | ||
| 26 | #ifdef __KERNEL__ | 27 | #ifdef __KERNEL__ |
| 27 | #define STACK_TOP ((current->personality & ADDR_LIMIT_32BIT) ? \ | 28 | #define STACK_TOP ((current->personality & ADDR_LIMIT_32BIT) ? \ |
diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c index e33870ff0ac0..ede6443c34d9 100644 --- a/arch/arm/kernel/ptrace.c +++ b/arch/arm/kernel/ptrace.c | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | #include <linux/perf_event.h> | 23 | #include <linux/perf_event.h> |
| 24 | #include <linux/hw_breakpoint.h> | 24 | #include <linux/hw_breakpoint.h> |
| 25 | #include <linux/regset.h> | 25 | #include <linux/regset.h> |
| 26 | #include <linux/audit.h> | ||
| 26 | 27 | ||
| 27 | #include <asm/pgtable.h> | 28 | #include <asm/pgtable.h> |
| 28 | #include <asm/system.h> | 29 | #include <asm/system.h> |
| @@ -904,6 +905,12 @@ long arch_ptrace(struct task_struct *child, long request, | |||
| 904 | return ret; | 905 | return ret; |
| 905 | } | 906 | } |
| 906 | 907 | ||
| 908 | #ifdef __ARMEB__ | ||
| 909 | #define AUDIT_ARCH_NR AUDIT_ARCH_ARMEB | ||
| 910 | #else | ||
| 911 | #define AUDIT_ARCH_NR AUDIT_ARCH_ARM | ||
| 912 | #endif | ||
| 913 | |||
| 907 | asmlinkage int syscall_trace(int why, struct pt_regs *regs, int scno) | 914 | asmlinkage int syscall_trace(int why, struct pt_regs *regs, int scno) |
| 908 | { | 915 | { |
| 909 | unsigned long ip; | 916 | unsigned long ip; |
| @@ -918,7 +925,7 @@ asmlinkage int syscall_trace(int why, struct pt_regs *regs, int scno) | |||
| 918 | if (!ip) | 925 | if (!ip) |
| 919 | audit_syscall_exit(regs); | 926 | audit_syscall_exit(regs); |
| 920 | else | 927 | else |
| 921 | audit_syscall_entry(AUDIT_ARCH_ARMEB, scno, regs->ARM_r0, | 928 | audit_syscall_entry(AUDIT_ARCH_NR, scno, regs->ARM_r0, |
| 922 | regs->ARM_r1, regs->ARM_r2, regs->ARM_r3); | 929 | regs->ARM_r1, regs->ARM_r2, regs->ARM_r3); |
| 923 | 930 | ||
| 924 | if (!test_thread_flag(TIF_SYSCALL_TRACE)) | 931 | if (!test_thread_flag(TIF_SYSCALL_TRACE)) |
diff --git a/arch/arm/kernel/smp_twd.c b/arch/arm/kernel/smp_twd.c index 4285daa077b0..7a79b24597b2 100644 --- a/arch/arm/kernel/smp_twd.c +++ b/arch/arm/kernel/smp_twd.c | |||
| @@ -129,7 +129,7 @@ static struct notifier_block twd_cpufreq_nb = { | |||
| 129 | 129 | ||
| 130 | static int twd_cpufreq_init(void) | 130 | static int twd_cpufreq_init(void) |
| 131 | { | 131 | { |
| 132 | if (!IS_ERR(twd_clk)) | 132 | if (twd_evt && *__this_cpu_ptr(twd_evt) && !IS_ERR(twd_clk)) |
| 133 | return cpufreq_register_notifier(&twd_cpufreq_nb, | 133 | return cpufreq_register_notifier(&twd_cpufreq_nb, |
| 134 | CPUFREQ_TRANSITION_NOTIFIER); | 134 | CPUFREQ_TRANSITION_NOTIFIER); |
| 135 | 135 | ||
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index 99a572702509..f84dfe67724f 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c | |||
| @@ -266,6 +266,7 @@ void die(const char *str, struct pt_regs *regs, int err) | |||
| 266 | { | 266 | { |
| 267 | struct thread_info *thread = current_thread_info(); | 267 | struct thread_info *thread = current_thread_info(); |
| 268 | int ret; | 268 | int ret; |
| 269 | enum bug_trap_type bug_type = BUG_TRAP_TYPE_NONE; | ||
| 269 | 270 | ||
| 270 | oops_enter(); | 271 | oops_enter(); |
| 271 | 272 | ||
| @@ -273,7 +274,9 @@ void die(const char *str, struct pt_regs *regs, int err) | |||
| 273 | console_verbose(); | 274 | console_verbose(); |
| 274 | bust_spinlocks(1); | 275 | bust_spinlocks(1); |
| 275 | if (!user_mode(regs)) | 276 | if (!user_mode(regs)) |
| 276 | report_bug(regs->ARM_pc, regs); | 277 | bug_type = report_bug(regs->ARM_pc, regs); |
| 278 | if (bug_type != BUG_TRAP_TYPE_NONE) | ||
| 279 | str = "Oops - BUG"; | ||
| 277 | ret = __die(str, err, thread, regs); | 280 | ret = __die(str, err, thread, regs); |
| 278 | 281 | ||
| 279 | if (regs && kexec_should_crash(thread->task)) | 282 | if (regs && kexec_should_crash(thread->task)) |
diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S index 1e19691e0406..43a31fb06318 100644 --- a/arch/arm/kernel/vmlinux.lds.S +++ b/arch/arm/kernel/vmlinux.lds.S | |||
| @@ -10,6 +10,7 @@ | |||
| 10 | #include <asm/page.h> | 10 | #include <asm/page.h> |
| 11 | 11 | ||
| 12 | #define PROC_INFO \ | 12 | #define PROC_INFO \ |
| 13 | . = ALIGN(4); \ | ||
| 13 | VMLINUX_SYMBOL(__proc_info_begin) = .; \ | 14 | VMLINUX_SYMBOL(__proc_info_begin) = .; \ |
| 14 | *(.proc.info.init) \ | 15 | *(.proc.info.init) \ |
| 15 | VMLINUX_SYMBOL(__proc_info_end) = .; | 16 | VMLINUX_SYMBOL(__proc_info_end) = .; |
diff --git a/arch/arm/mach-at91/at91rm9200_devices.c b/arch/arm/mach-at91/at91rm9200_devices.c index 18bacec2b094..97676bdae998 100644 --- a/arch/arm/mach-at91/at91rm9200_devices.c +++ b/arch/arm/mach-at91/at91rm9200_devices.c | |||
| @@ -83,7 +83,7 @@ void __init at91_add_device_usbh(struct at91_usbh_data *data) {} | |||
| 83 | * USB Device (Gadget) | 83 | * USB Device (Gadget) |
| 84 | * -------------------------------------------------------------------- */ | 84 | * -------------------------------------------------------------------- */ |
| 85 | 85 | ||
| 86 | #ifdef CONFIG_USB_AT91 | 86 | #if defined(CONFIG_USB_AT91) || defined(CONFIG_USB_AT91_MODULE) |
| 87 | static struct at91_udc_data udc_data; | 87 | static struct at91_udc_data udc_data; |
| 88 | 88 | ||
| 89 | static struct resource udc_resources[] = { | 89 | static struct resource udc_resources[] = { |
diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c index 642ccb6d26b2..5a24f0b4554d 100644 --- a/arch/arm/mach-at91/at91sam9260_devices.c +++ b/arch/arm/mach-at91/at91sam9260_devices.c | |||
| @@ -84,7 +84,7 @@ void __init at91_add_device_usbh(struct at91_usbh_data *data) {} | |||
| 84 | * USB Device (Gadget) | 84 | * USB Device (Gadget) |
| 85 | * -------------------------------------------------------------------- */ | 85 | * -------------------------------------------------------------------- */ |
| 86 | 86 | ||
| 87 | #ifdef CONFIG_USB_AT91 | 87 | #if defined(CONFIG_USB_AT91) || defined(CONFIG_USB_AT91_MODULE) |
| 88 | static struct at91_udc_data udc_data; | 88 | static struct at91_udc_data udc_data; |
| 89 | 89 | ||
| 90 | static struct resource udc_resources[] = { | 90 | static struct resource udc_resources[] = { |
| @@ -1215,8 +1215,7 @@ void __init at91_add_device_serial(void) {} | |||
| 1215 | * CF/IDE | 1215 | * CF/IDE |
| 1216 | * -------------------------------------------------------------------- */ | 1216 | * -------------------------------------------------------------------- */ |
| 1217 | 1217 | ||
| 1218 | #if defined(CONFIG_BLK_DEV_IDE_AT91) || defined(CONFIG_BLK_DEV_IDE_AT91_MODULE) || \ | 1218 | #if defined(CONFIG_PATA_AT91) || defined(CONFIG_PATA_AT91_MODULE) || \ |
| 1219 | defined(CONFIG_PATA_AT91) || defined(CONFIG_PATA_AT91_MODULE) || \ | ||
| 1220 | defined(CONFIG_AT91_CF) || defined(CONFIG_AT91_CF_MODULE) | 1219 | defined(CONFIG_AT91_CF) || defined(CONFIG_AT91_CF_MODULE) |
| 1221 | 1220 | ||
| 1222 | static struct at91_cf_data cf0_data; | 1221 | static struct at91_cf_data cf0_data; |
| @@ -1313,10 +1312,8 @@ void __init at91_add_device_cf(struct at91_cf_data *data) | |||
| 1313 | if (data->flags & AT91_CF_TRUE_IDE) | 1312 | if (data->flags & AT91_CF_TRUE_IDE) |
| 1314 | #if defined(CONFIG_PATA_AT91) || defined(CONFIG_PATA_AT91_MODULE) | 1313 | #if defined(CONFIG_PATA_AT91) || defined(CONFIG_PATA_AT91_MODULE) |
| 1315 | pdev->name = "pata_at91"; | 1314 | pdev->name = "pata_at91"; |
| 1316 | #elif defined(CONFIG_BLK_DEV_IDE_AT91) || defined(CONFIG_BLK_DEV_IDE_AT91_MODULE) | ||
| 1317 | pdev->name = "at91_ide"; | ||
| 1318 | #else | 1315 | #else |
| 1319 | #warning "board requires AT91_CF_TRUE_IDE: enable either at91_ide or pata_at91" | 1316 | #warning "board requires AT91_CF_TRUE_IDE: enable pata_at91" |
| 1320 | #endif | 1317 | #endif |
| 1321 | else | 1318 | else |
| 1322 | pdev->name = "at91_cf"; | 1319 | pdev->name = "at91_cf"; |
diff --git a/arch/arm/mach-at91/at91sam9261_devices.c b/arch/arm/mach-at91/at91sam9261_devices.c index fc59cbdb0e3c..1e28bed8f425 100644 --- a/arch/arm/mach-at91/at91sam9261_devices.c +++ b/arch/arm/mach-at91/at91sam9261_devices.c | |||
| @@ -87,7 +87,7 @@ void __init at91_add_device_usbh(struct at91_usbh_data *data) {} | |||
| 87 | * USB Device (Gadget) | 87 | * USB Device (Gadget) |
| 88 | * -------------------------------------------------------------------- */ | 88 | * -------------------------------------------------------------------- */ |
| 89 | 89 | ||
| 90 | #ifdef CONFIG_USB_AT91 | 90 | #if defined(CONFIG_USB_AT91) || defined(CONFIG_USB_AT91_MODULE) |
| 91 | static struct at91_udc_data udc_data; | 91 | static struct at91_udc_data udc_data; |
| 92 | 92 | ||
| 93 | static struct resource udc_resources[] = { | 93 | static struct resource udc_resources[] = { |
diff --git a/arch/arm/mach-at91/at91sam9263_devices.c b/arch/arm/mach-at91/at91sam9263_devices.c index 7b46b2787022..366a7765635b 100644 --- a/arch/arm/mach-at91/at91sam9263_devices.c +++ b/arch/arm/mach-at91/at91sam9263_devices.c | |||
| @@ -92,7 +92,7 @@ void __init at91_add_device_usbh(struct at91_usbh_data *data) {} | |||
| 92 | * USB Device (Gadget) | 92 | * USB Device (Gadget) |
| 93 | * -------------------------------------------------------------------- */ | 93 | * -------------------------------------------------------------------- */ |
| 94 | 94 | ||
| 95 | #ifdef CONFIG_USB_AT91 | 95 | #if defined(CONFIG_USB_AT91) || defined(CONFIG_USB_AT91_MODULE) |
| 96 | static struct at91_udc_data udc_data; | 96 | static struct at91_udc_data udc_data; |
| 97 | 97 | ||
| 98 | static struct resource udc_resources[] = { | 98 | static struct resource udc_resources[] = { |
| @@ -355,8 +355,8 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {} | |||
| 355 | * Compact Flash (PCMCIA or IDE) | 355 | * Compact Flash (PCMCIA or IDE) |
| 356 | * -------------------------------------------------------------------- */ | 356 | * -------------------------------------------------------------------- */ |
| 357 | 357 | ||
| 358 | #if defined(CONFIG_AT91_CF) || defined(CONFIG_AT91_CF_MODULE) || \ | 358 | #if defined(CONFIG_PATA_AT91) || defined(CONFIG_PATA_AT91_MODULE) || \ |
| 359 | defined(CONFIG_BLK_DEV_IDE_AT91) || defined(CONFIG_BLK_DEV_IDE_AT91_MODULE) | 359 | defined(CONFIG_AT91_CF) || defined(CONFIG_AT91_CF_MODULE) |
| 360 | 360 | ||
| 361 | static struct at91_cf_data cf0_data; | 361 | static struct at91_cf_data cf0_data; |
| 362 | 362 | ||
| @@ -450,7 +450,7 @@ void __init at91_add_device_cf(struct at91_cf_data *data) | |||
| 450 | at91_set_A_periph(AT91_PIN_PD9, 0); /* CFCE2 */ | 450 | at91_set_A_periph(AT91_PIN_PD9, 0); /* CFCE2 */ |
| 451 | at91_set_A_periph(AT91_PIN_PD14, 0); /* CFNRW */ | 451 | at91_set_A_periph(AT91_PIN_PD14, 0); /* CFNRW */ |
| 452 | 452 | ||
| 453 | pdev->name = (data->flags & AT91_CF_TRUE_IDE) ? "at91_ide" : "at91_cf"; | 453 | pdev->name = (data->flags & AT91_CF_TRUE_IDE) ? "pata_at91" : "at91_cf"; |
| 454 | platform_device_register(pdev); | 454 | platform_device_register(pdev); |
| 455 | } | 455 | } |
| 456 | #else | 456 | #else |
diff --git a/arch/arm/mach-at91/include/mach/at91sam9_smc.h b/arch/arm/mach-at91/include/mach/at91sam9_smc.h index eb18a70fa647..175e1fdd9fe8 100644 --- a/arch/arm/mach-at91/include/mach/at91sam9_smc.h +++ b/arch/arm/mach-at91/include/mach/at91sam9_smc.h | |||
| @@ -18,6 +18,35 @@ | |||
| 18 | 18 | ||
| 19 | #include <mach/cpu.h> | 19 | #include <mach/cpu.h> |
| 20 | 20 | ||
| 21 | #ifndef __ASSEMBLY__ | ||
| 22 | struct sam9_smc_config { | ||
| 23 | /* Setup register */ | ||
| 24 | u8 ncs_read_setup; | ||
| 25 | u8 nrd_setup; | ||
| 26 | u8 ncs_write_setup; | ||
| 27 | u8 nwe_setup; | ||
| 28 | |||
| 29 | /* Pulse register */ | ||
| 30 | u8 ncs_read_pulse; | ||
| 31 | u8 nrd_pulse; | ||
| 32 | u8 ncs_write_pulse; | ||
| 33 | u8 nwe_pulse; | ||
| 34 | |||
| 35 | /* Cycle register */ | ||
| 36 | u16 read_cycle; | ||
| 37 | u16 write_cycle; | ||
| 38 | |||
| 39 | /* Mode register */ | ||
| 40 | u32 mode; | ||
| 41 | u8 tdf_cycles:4; | ||
| 42 | }; | ||
| 43 | |||
| 44 | extern void sam9_smc_configure(int id, int cs, struct sam9_smc_config *config); | ||
| 45 | extern void sam9_smc_read(int id, int cs, struct sam9_smc_config *config); | ||
| 46 | extern void sam9_smc_read_mode(int id, int cs, struct sam9_smc_config *config); | ||
| 47 | extern void sam9_smc_write_mode(int id, int cs, struct sam9_smc_config *config); | ||
| 48 | #endif | ||
| 49 | |||
| 21 | #define AT91_SMC_SETUP 0x00 /* Setup Register for CS n */ | 50 | #define AT91_SMC_SETUP 0x00 /* Setup Register for CS n */ |
| 22 | #define AT91_SMC_NWESETUP (0x3f << 0) /* NWE Setup Length */ | 51 | #define AT91_SMC_NWESETUP (0x3f << 0) /* NWE Setup Length */ |
| 23 | #define AT91_SMC_NWESETUP_(x) ((x) << 0) | 52 | #define AT91_SMC_NWESETUP_(x) ((x) << 0) |
diff --git a/arch/arm/mach-at91/sam9_smc.c b/arch/arm/mach-at91/sam9_smc.c index 8294783b679d..99a0a1d2b7dc 100644 --- a/arch/arm/mach-at91/sam9_smc.c +++ b/arch/arm/mach-at91/sam9_smc.c | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | * linux/arch/arm/mach-at91/sam9_smc.c | 2 | * linux/arch/arm/mach-at91/sam9_smc.c |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2008 Andrew Victor | 4 | * Copyright (C) 2008 Andrew Victor |
| 5 | * Copyright (C) 2011 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> | ||
| 5 | * | 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 |
| @@ -22,7 +23,22 @@ | |||
| 22 | 23 | ||
| 23 | static void __iomem *smc_base_addr[2]; | 24 | static void __iomem *smc_base_addr[2]; |
| 24 | 25 | ||
| 25 | static void __init sam9_smc_cs_configure(void __iomem *base, struct sam9_smc_config* config) | 26 | static void sam9_smc_cs_write_mode(void __iomem *base, |
| 27 | struct sam9_smc_config *config) | ||
| 28 | { | ||
| 29 | __raw_writel(config->mode | ||
| 30 | | AT91_SMC_TDF_(config->tdf_cycles), | ||
| 31 | base + AT91_SMC_MODE); | ||
| 32 | } | ||
| 33 | |||
| 34 | void sam9_smc_write_mode(int id, int cs, | ||
| 35 | struct sam9_smc_config *config) | ||
| 36 | { | ||
| 37 | sam9_smc_cs_write_mode(AT91_SMC_CS(id, cs), config); | ||
| 38 | } | ||
| 39 | |||
| 40 | static void sam9_smc_cs_configure(void __iomem *base, | ||
| 41 | struct sam9_smc_config *config) | ||
| 26 | { | 42 | { |
| 27 | 43 | ||
| 28 | /* Setup register */ | 44 | /* Setup register */ |
| @@ -45,16 +61,66 @@ static void __init sam9_smc_cs_configure(void __iomem *base, struct sam9_smc_con | |||
| 45 | base + AT91_SMC_CYCLE); | 61 | base + AT91_SMC_CYCLE); |
| 46 | 62 | ||
| 47 | /* Mode register */ | 63 | /* Mode register */ |
| 48 | __raw_writel(config->mode | 64 | sam9_smc_cs_write_mode(base, config); |
| 49 | | AT91_SMC_TDF_(config->tdf_cycles), | ||
| 50 | base + AT91_SMC_MODE); | ||
| 51 | } | 65 | } |
| 52 | 66 | ||
| 53 | void __init sam9_smc_configure(int id, int cs, struct sam9_smc_config* config) | 67 | void sam9_smc_configure(int id, int cs, |
| 68 | struct sam9_smc_config *config) | ||
| 54 | { | 69 | { |
| 55 | sam9_smc_cs_configure(AT91_SMC_CS(id, cs), config); | 70 | sam9_smc_cs_configure(AT91_SMC_CS(id, cs), config); |
| 56 | } | 71 | } |
| 57 | 72 | ||
| 73 | static void sam9_smc_cs_read_mode(void __iomem *base, | ||
| 74 | struct sam9_smc_config *config) | ||
| 75 | { | ||
| 76 | u32 val = __raw_readl(base + AT91_SMC_MODE); | ||
| 77 | |||
| 78 | config->mode = (val & ~AT91_SMC_NWECYCLE); | ||
| 79 | config->tdf_cycles = (val & AT91_SMC_NWECYCLE) >> 16 ; | ||
| 80 | } | ||
| 81 | |||
| 82 | void sam9_smc_read_mode(int id, int cs, | ||
| 83 | struct sam9_smc_config *config) | ||
| 84 | { | ||
| 85 | sam9_smc_cs_read_mode(AT91_SMC_CS(id, cs), config); | ||
| 86 | } | ||
| 87 | |||
| 88 | static void sam9_smc_cs_read(void __iomem *base, | ||
| 89 | struct sam9_smc_config *config) | ||
| 90 | { | ||
| 91 | u32 val; | ||
| 92 | |||
| 93 | /* Setup register */ | ||
| 94 | val = __raw_readl(base + AT91_SMC_SETUP); | ||
| 95 | |||
| 96 | config->nwe_setup = val & AT91_SMC_NWESETUP; | ||
| 97 | config->ncs_write_setup = (val & AT91_SMC_NCS_WRSETUP) >> 8; | ||
| 98 | config->nrd_setup = (val & AT91_SMC_NRDSETUP) >> 16; | ||
| 99 | config->ncs_read_setup = (val & AT91_SMC_NCS_RDSETUP) >> 24; | ||
| 100 | |||
| 101 | /* Pulse register */ | ||
| 102 | val = __raw_readl(base + AT91_SMC_PULSE); | ||
| 103 | |||
| 104 | config->nwe_setup = val & AT91_SMC_NWEPULSE; | ||
| 105 | config->ncs_write_pulse = (val & AT91_SMC_NCS_WRPULSE) >> 8; | ||
| 106 | config->nrd_pulse = (val & AT91_SMC_NRDPULSE) >> 16; | ||
| 107 | config->ncs_read_pulse = (val & AT91_SMC_NCS_RDPULSE) >> 24; | ||
| 108 | |||
| 109 | /* Cycle register */ | ||
| 110 | val = __raw_readl(base + AT91_SMC_CYCLE); | ||
| 111 | |||
| 112 | config->write_cycle = val & AT91_SMC_NWECYCLE; | ||
| 113 | config->read_cycle = (val & AT91_SMC_NRDCYCLE) >> 16; | ||
| 114 | |||
| 115 | /* Mode register */ | ||
| 116 | sam9_smc_cs_read_mode(base, config); | ||
| 117 | } | ||
| 118 | |||
| 119 | void sam9_smc_read(int id, int cs, struct sam9_smc_config *config) | ||
| 120 | { | ||
| 121 | sam9_smc_cs_read(AT91_SMC_CS(id, cs), config); | ||
| 122 | } | ||
| 123 | |||
| 58 | void __init at91sam9_ioremap_smc(int id, u32 addr) | 124 | void __init at91sam9_ioremap_smc(int id, u32 addr) |
| 59 | { | 125 | { |
| 60 | if (id > 1) { | 126 | if (id > 1) { |
diff --git a/arch/arm/mach-at91/sam9_smc.h b/arch/arm/mach-at91/sam9_smc.h index 039c5ce17aec..3e52dcd4a59f 100644 --- a/arch/arm/mach-at91/sam9_smc.h +++ b/arch/arm/mach-at91/sam9_smc.h | |||
| @@ -8,27 +8,4 @@ | |||
| 8 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
| 9 | */ | 9 | */ |
| 10 | 10 | ||
| 11 | struct sam9_smc_config { | ||
| 12 | /* Setup register */ | ||
| 13 | u8 ncs_read_setup; | ||
| 14 | u8 nrd_setup; | ||
| 15 | u8 ncs_write_setup; | ||
| 16 | u8 nwe_setup; | ||
| 17 | |||
| 18 | /* Pulse register */ | ||
| 19 | u8 ncs_read_pulse; | ||
| 20 | u8 nrd_pulse; | ||
| 21 | u8 ncs_write_pulse; | ||
| 22 | u8 nwe_pulse; | ||
| 23 | |||
| 24 | /* Cycle register */ | ||
| 25 | u16 read_cycle; | ||
| 26 | u16 write_cycle; | ||
| 27 | |||
| 28 | /* Mode register */ | ||
| 29 | u32 mode; | ||
| 30 | u8 tdf_cycles:4; | ||
| 31 | }; | ||
| 32 | |||
| 33 | extern void __init sam9_smc_configure(int id, int cs, struct sam9_smc_config* config); | ||
| 34 | extern void __init at91sam9_ioremap_smc(int id, u32 addr); | 11 | extern void __init at91sam9_ioremap_smc(int id, u32 addr); |
diff --git a/arch/arm/mach-dove/common.c b/arch/arm/mach-dove/common.c index dd1429ae6405..bda7aca04ca0 100644 --- a/arch/arm/mach-dove/common.c +++ b/arch/arm/mach-dove/common.c | |||
| @@ -28,6 +28,7 @@ | |||
| 28 | #include <asm/mach/arch.h> | 28 | #include <asm/mach/arch.h> |
| 29 | #include <linux/irq.h> | 29 | #include <linux/irq.h> |
| 30 | #include <plat/time.h> | 30 | #include <plat/time.h> |
| 31 | #include <plat/ehci-orion.h> | ||
| 31 | #include <plat/common.h> | 32 | #include <plat/common.h> |
| 32 | #include <plat/addr-map.h> | 33 | #include <plat/addr-map.h> |
| 33 | #include "common.h" | 34 | #include "common.h" |
| @@ -71,7 +72,7 @@ void __init dove_map_io(void) | |||
| 71 | ****************************************************************************/ | 72 | ****************************************************************************/ |
| 72 | void __init dove_ehci0_init(void) | 73 | void __init dove_ehci0_init(void) |
| 73 | { | 74 | { |
| 74 | orion_ehci_init(DOVE_USB0_PHYS_BASE, IRQ_DOVE_USB0); | 75 | orion_ehci_init(DOVE_USB0_PHYS_BASE, IRQ_DOVE_USB0, EHCI_PHY_NA); |
| 75 | } | 76 | } |
| 76 | 77 | ||
| 77 | /***************************************************************************** | 78 | /***************************************************************************** |
diff --git a/arch/arm/mach-ep93xx/vision_ep9307.c b/arch/arm/mach-ep93xx/vision_ep9307.c index 03dd4012043e..d5fb44f16d31 100644 --- a/arch/arm/mach-ep93xx/vision_ep9307.c +++ b/arch/arm/mach-ep93xx/vision_ep9307.c | |||
| @@ -32,6 +32,7 @@ | |||
| 32 | #include <mach/hardware.h> | 32 | #include <mach/hardware.h> |
| 33 | #include <mach/fb.h> | 33 | #include <mach/fb.h> |
| 34 | #include <mach/ep93xx_spi.h> | 34 | #include <mach/ep93xx_spi.h> |
| 35 | #include <mach/gpio-ep93xx.h> | ||
| 35 | 36 | ||
| 36 | #include <asm/mach-types.h> | 37 | #include <asm/mach-types.h> |
| 37 | #include <asm/mach/map.h> | 38 | #include <asm/mach/map.h> |
| @@ -153,7 +154,6 @@ static struct i2c_board_info vision_i2c_info[] __initdata = { | |||
| 153 | }, { | 154 | }, { |
| 154 | I2C_BOARD_INFO("pca9539", 0x74), | 155 | I2C_BOARD_INFO("pca9539", 0x74), |
| 155 | .platform_data = &pca953x_74_gpio_data, | 156 | .platform_data = &pca953x_74_gpio_data, |
| 156 | .irq = gpio_to_irq(EP93XX_GPIO_LINE_F(7)), | ||
| 157 | }, { | 157 | }, { |
| 158 | I2C_BOARD_INFO("pca9539", 0x75), | 158 | I2C_BOARD_INFO("pca9539", 0x75), |
| 159 | .platform_data = &pca953x_75_gpio_data, | 159 | .platform_data = &pca953x_75_gpio_data, |
| @@ -348,6 +348,8 @@ static void __init vision_init_machine(void) | |||
| 348 | "pca9539:74")) | 348 | "pca9539:74")) |
| 349 | pr_warn("cannot request interrupt gpio for pca9539:74\n"); | 349 | pr_warn("cannot request interrupt gpio for pca9539:74\n"); |
| 350 | 350 | ||
| 351 | vision_i2c_info[1].irq = gpio_to_irq(EP93XX_GPIO_LINE_F(7)); | ||
| 352 | |||
| 351 | ep93xx_register_i2c(&vision_i2c_gpio_data, vision_i2c_info, | 353 | ep93xx_register_i2c(&vision_i2c_gpio_data, vision_i2c_info, |
| 352 | ARRAY_SIZE(vision_i2c_info)); | 354 | ARRAY_SIZE(vision_i2c_info)); |
| 353 | ep93xx_register_spi(&vision_spi_master, vision_spi_board_info, | 355 | ep93xx_register_spi(&vision_spi_master, vision_spi_board_info, |
diff --git a/arch/arm/mach-exynos/clock-exynos4210.c b/arch/arm/mach-exynos/clock-exynos4210.c index a5823a7f249e..13312ccb2d93 100644 --- a/arch/arm/mach-exynos/clock-exynos4210.c +++ b/arch/arm/mach-exynos/clock-exynos4210.c | |||
| @@ -32,6 +32,7 @@ | |||
| 32 | 32 | ||
| 33 | #include "common.h" | 33 | #include "common.h" |
| 34 | 34 | ||
| 35 | #ifdef CONFIG_PM_SLEEP | ||
| 35 | static struct sleep_save exynos4210_clock_save[] = { | 36 | static struct sleep_save exynos4210_clock_save[] = { |
| 36 | SAVE_ITEM(S5P_CLKSRC_IMAGE), | 37 | SAVE_ITEM(S5P_CLKSRC_IMAGE), |
| 37 | SAVE_ITEM(S5P_CLKSRC_LCD1), | 38 | SAVE_ITEM(S5P_CLKSRC_LCD1), |
| @@ -42,6 +43,7 @@ static struct sleep_save exynos4210_clock_save[] = { | |||
| 42 | SAVE_ITEM(S5P_CLKGATE_IP_LCD1), | 43 | SAVE_ITEM(S5P_CLKGATE_IP_LCD1), |
| 43 | SAVE_ITEM(S5P_CLKGATE_IP_PERIR_4210), | 44 | SAVE_ITEM(S5P_CLKGATE_IP_PERIR_4210), |
| 44 | }; | 45 | }; |
| 46 | #endif | ||
| 45 | 47 | ||
| 46 | static struct clksrc_clk *sysclks[] = { | 48 | static struct clksrc_clk *sysclks[] = { |
| 47 | /* nothing here yet */ | 49 | /* nothing here yet */ |
diff --git a/arch/arm/mach-exynos/clock-exynos4212.c b/arch/arm/mach-exynos/clock-exynos4212.c index 26a668b0d101..48af28566fa1 100644 --- a/arch/arm/mach-exynos/clock-exynos4212.c +++ b/arch/arm/mach-exynos/clock-exynos4212.c | |||
| @@ -32,12 +32,14 @@ | |||
| 32 | 32 | ||
| 33 | #include "common.h" | 33 | #include "common.h" |
| 34 | 34 | ||
| 35 | #ifdef CONFIG_PM_SLEEP | ||
| 35 | static struct sleep_save exynos4212_clock_save[] = { | 36 | static struct sleep_save exynos4212_clock_save[] = { |
| 36 | SAVE_ITEM(S5P_CLKSRC_IMAGE), | 37 | SAVE_ITEM(S5P_CLKSRC_IMAGE), |
| 37 | SAVE_ITEM(S5P_CLKDIV_IMAGE), | 38 | SAVE_ITEM(S5P_CLKDIV_IMAGE), |
| 38 | SAVE_ITEM(S5P_CLKGATE_IP_IMAGE_4212), | 39 | SAVE_ITEM(S5P_CLKGATE_IP_IMAGE_4212), |
| 39 | SAVE_ITEM(S5P_CLKGATE_IP_PERIR_4212), | 40 | SAVE_ITEM(S5P_CLKGATE_IP_PERIR_4212), |
| 40 | }; | 41 | }; |
| 42 | #endif | ||
| 41 | 43 | ||
| 42 | static struct clk *clk_src_mpll_user_list[] = { | 44 | static struct clk *clk_src_mpll_user_list[] = { |
| 43 | [0] = &clk_fin_mpll, | 45 | [0] = &clk_fin_mpll, |
diff --git a/arch/arm/mach-exynos/clock.c b/arch/arm/mach-exynos/clock.c index 5a8c42e90005..187287aa57ab 100644 --- a/arch/arm/mach-exynos/clock.c +++ b/arch/arm/mach-exynos/clock.c | |||
| @@ -30,6 +30,7 @@ | |||
| 30 | 30 | ||
| 31 | #include "common.h" | 31 | #include "common.h" |
| 32 | 32 | ||
| 33 | #ifdef CONFIG_PM_SLEEP | ||
| 33 | static struct sleep_save exynos4_clock_save[] = { | 34 | static struct sleep_save exynos4_clock_save[] = { |
| 34 | SAVE_ITEM(S5P_CLKDIV_LEFTBUS), | 35 | SAVE_ITEM(S5P_CLKDIV_LEFTBUS), |
| 35 | SAVE_ITEM(S5P_CLKGATE_IP_LEFTBUS), | 36 | SAVE_ITEM(S5P_CLKGATE_IP_LEFTBUS), |
| @@ -93,6 +94,7 @@ static struct sleep_save exynos4_clock_save[] = { | |||
| 93 | SAVE_ITEM(S5P_CLKGATE_SCLKCPU), | 94 | SAVE_ITEM(S5P_CLKGATE_SCLKCPU), |
| 94 | SAVE_ITEM(S5P_CLKGATE_IP_CPU), | 95 | SAVE_ITEM(S5P_CLKGATE_IP_CPU), |
| 95 | }; | 96 | }; |
| 97 | #endif | ||
| 96 | 98 | ||
| 97 | struct clk clk_sclk_hdmi27m = { | 99 | struct clk clk_sclk_hdmi27m = { |
| 98 | .name = "sclk_hdmi27m", | 100 | .name = "sclk_hdmi27m", |
diff --git a/arch/arm/mach-exynos/mach-exynos4-dt.c b/arch/arm/mach-exynos/mach-exynos4-dt.c index 85fa02767d67..e6b02fdf1b09 100644 --- a/arch/arm/mach-exynos/mach-exynos4-dt.c +++ b/arch/arm/mach-exynos/mach-exynos4-dt.c | |||
| @@ -15,11 +15,13 @@ | |||
| 15 | #include <linux/serial_core.h> | 15 | #include <linux/serial_core.h> |
| 16 | 16 | ||
| 17 | #include <asm/mach/arch.h> | 17 | #include <asm/mach/arch.h> |
| 18 | #include <asm/hardware/gic.h> | ||
| 18 | #include <mach/map.h> | 19 | #include <mach/map.h> |
| 19 | 20 | ||
| 20 | #include <plat/cpu.h> | 21 | #include <plat/cpu.h> |
| 21 | #include <plat/regs-serial.h> | 22 | #include <plat/regs-serial.h> |
| 22 | #include <plat/exynos4.h> | 23 | |
| 24 | #include "common.h" | ||
| 23 | 25 | ||
| 24 | /* | 26 | /* |
| 25 | * The following lookup table is used to override device names when devices | 27 | * The following lookup table is used to override device names when devices |
| @@ -60,7 +62,7 @@ static const struct of_dev_auxdata exynos4210_auxdata_lookup[] __initconst = { | |||
| 60 | 62 | ||
| 61 | static void __init exynos4210_dt_map_io(void) | 63 | static void __init exynos4210_dt_map_io(void) |
| 62 | { | 64 | { |
| 63 | s5p_init_io(NULL, 0, S5P_VA_CHIPID); | 65 | exynos_init_io(NULL, 0); |
| 64 | s3c24xx_init_clocks(24000000); | 66 | s3c24xx_init_clocks(24000000); |
| 65 | } | 67 | } |
| 66 | 68 | ||
| @@ -79,7 +81,9 @@ DT_MACHINE_START(EXYNOS4210_DT, "Samsung Exynos4 (Flattened Device Tree)") | |||
| 79 | /* Maintainer: Thomas Abraham <thomas.abraham@linaro.org> */ | 81 | /* Maintainer: Thomas Abraham <thomas.abraham@linaro.org> */ |
| 80 | .init_irq = exynos4_init_irq, | 82 | .init_irq = exynos4_init_irq, |
| 81 | .map_io = exynos4210_dt_map_io, | 83 | .map_io = exynos4210_dt_map_io, |
| 84 | .handle_irq = gic_handle_irq, | ||
| 82 | .init_machine = exynos4210_dt_machine_init, | 85 | .init_machine = exynos4210_dt_machine_init, |
| 83 | .timer = &exynos4_timer, | 86 | .timer = &exynos4_timer, |
| 84 | .dt_compat = exynos4210_dt_compat, | 87 | .dt_compat = exynos4210_dt_compat, |
| 88 | .restart = exynos4_restart, | ||
| 85 | MACHINE_END | 89 | MACHINE_END |
diff --git a/arch/arm/mach-exynos/mach-nuri.c b/arch/arm/mach-exynos/mach-nuri.c index b895ec031105..435261f83f46 100644 --- a/arch/arm/mach-exynos/mach-nuri.c +++ b/arch/arm/mach-exynos/mach-nuri.c | |||
| @@ -220,14 +220,14 @@ static struct s3c_fb_pd_win nuri_fb_win0 = { | |||
| 220 | .lower_margin = 1, | 220 | .lower_margin = 1, |
| 221 | .hsync_len = 48, | 221 | .hsync_len = 48, |
| 222 | .vsync_len = 3, | 222 | .vsync_len = 3, |
| 223 | .xres = 1280, | 223 | .xres = 1024, |
| 224 | .yres = 800, | 224 | .yres = 600, |
| 225 | .refresh = 60, | 225 | .refresh = 60, |
| 226 | }, | 226 | }, |
| 227 | .max_bpp = 24, | 227 | .max_bpp = 24, |
| 228 | .default_bpp = 16, | 228 | .default_bpp = 16, |
| 229 | .virtual_x = 1280, | 229 | .virtual_x = 1024, |
| 230 | .virtual_y = 800, | 230 | .virtual_y = 2 * 600, |
| 231 | }; | 231 | }; |
| 232 | 232 | ||
| 233 | static struct s3c_fb_platdata nuri_fb_pdata __initdata = { | 233 | static struct s3c_fb_platdata nuri_fb_pdata __initdata = { |
diff --git a/arch/arm/mach-exynos/mach-universal_c210.c b/arch/arm/mach-exynos/mach-universal_c210.c index 37ac93e8d6d9..0fc65ffde8ff 100644 --- a/arch/arm/mach-exynos/mach-universal_c210.c +++ b/arch/arm/mach-exynos/mach-universal_c210.c | |||
| @@ -910,7 +910,7 @@ static struct s5p_fimc_isp_info universal_camera_sensors[] = { | |||
| 910 | .bus_type = FIMC_MIPI_CSI2, | 910 | .bus_type = FIMC_MIPI_CSI2, |
| 911 | .board_info = &m5mols_board_info, | 911 | .board_info = &m5mols_board_info, |
| 912 | .i2c_bus_num = 0, | 912 | .i2c_bus_num = 0, |
| 913 | .clk_frequency = 21600000UL, | 913 | .clk_frequency = 24000000UL, |
| 914 | .csi_data_align = 32, | 914 | .csi_data_align = 32, |
| 915 | }, | 915 | }, |
| 916 | }; | 916 | }; |
diff --git a/arch/arm/mach-exynos/pm.c b/arch/arm/mach-exynos/pm.c index a4f61a43c7ba..e19013051772 100644 --- a/arch/arm/mach-exynos/pm.c +++ b/arch/arm/mach-exynos/pm.c | |||
| @@ -206,7 +206,7 @@ static void exynos4_pm_prepare(void) | |||
| 206 | 206 | ||
| 207 | } | 207 | } |
| 208 | 208 | ||
| 209 | static int exynos4_pm_add(struct device *dev) | 209 | static int exynos4_pm_add(struct device *dev, struct subsys_interface *sif) |
| 210 | { | 210 | { |
| 211 | pm_cpu_prep = exynos4_pm_prepare; | 211 | pm_cpu_prep = exynos4_pm_prepare; |
| 212 | pm_cpu_sleep = exynos4_cpu_suspend; | 212 | pm_cpu_sleep = exynos4_cpu_suspend; |
| @@ -384,7 +384,9 @@ static void exynos4_pm_resume(void) | |||
| 384 | 384 | ||
| 385 | exynos4_restore_pll(); | 385 | exynos4_restore_pll(); |
| 386 | 386 | ||
| 387 | #ifdef CONFIG_SMP | ||
| 387 | scu_enable(S5P_VA_SCU); | 388 | scu_enable(S5P_VA_SCU); |
| 389 | #endif | ||
| 388 | 390 | ||
| 389 | #ifdef CONFIG_CACHE_L2X0 | 391 | #ifdef CONFIG_CACHE_L2X0 |
| 390 | s3c_pm_do_restore_core(exynos4_l2cc_save, ARRAY_SIZE(exynos4_l2cc_save)); | 392 | s3c_pm_do_restore_core(exynos4_l2cc_save, ARRAY_SIZE(exynos4_l2cc_save)); |
diff --git a/arch/arm/mach-kirkwood/common.c b/arch/arm/mach-kirkwood/common.c index cc15426787b1..77d4852e19f2 100644 --- a/arch/arm/mach-kirkwood/common.c +++ b/arch/arm/mach-kirkwood/common.c | |||
| @@ -27,6 +27,7 @@ | |||
| 27 | #include <plat/cache-feroceon-l2.h> | 27 | #include <plat/cache-feroceon-l2.h> |
| 28 | #include <plat/mvsdio.h> | 28 | #include <plat/mvsdio.h> |
| 29 | #include <plat/orion_nand.h> | 29 | #include <plat/orion_nand.h> |
| 30 | #include <plat/ehci-orion.h> | ||
| 30 | #include <plat/common.h> | 31 | #include <plat/common.h> |
| 31 | #include <plat/time.h> | 32 | #include <plat/time.h> |
| 32 | #include <plat/addr-map.h> | 33 | #include <plat/addr-map.h> |
| @@ -73,7 +74,7 @@ unsigned int kirkwood_clk_ctrl = CGC_DUNIT | CGC_RESERVED; | |||
| 73 | void __init kirkwood_ehci_init(void) | 74 | void __init kirkwood_ehci_init(void) |
| 74 | { | 75 | { |
| 75 | kirkwood_clk_ctrl |= CGC_USB0; | 76 | kirkwood_clk_ctrl |= CGC_USB0; |
| 76 | orion_ehci_init(USB_PHYS_BASE, IRQ_KIRKWOOD_USB); | 77 | orion_ehci_init(USB_PHYS_BASE, IRQ_KIRKWOOD_USB, EHCI_PHY_NA); |
| 77 | } | 78 | } |
| 78 | 79 | ||
| 79 | 80 | ||
diff --git a/arch/arm/mach-kirkwood/mpp.h b/arch/arm/mach-kirkwood/mpp.h index e8fda45c0736..d5a0d1da2e0e 100644 --- a/arch/arm/mach-kirkwood/mpp.h +++ b/arch/arm/mach-kirkwood/mpp.h | |||
| @@ -31,314 +31,314 @@ | |||
| 31 | #define MPP_F6282_MASK MPP( 0, 0x0, 0, 0, 0, 0, 0, 0, 1 ) | 31 | #define MPP_F6282_MASK MPP( 0, 0x0, 0, 0, 0, 0, 0, 0, 1 ) |
| 32 | 32 | ||
| 33 | #define MPP0_GPIO MPP( 0, 0x0, 1, 1, 1, 1, 1, 1, 1 ) | 33 | #define MPP0_GPIO MPP( 0, 0x0, 1, 1, 1, 1, 1, 1, 1 ) |
| 34 | #define MPP0_NF_IO2 MPP( 0, 0x1, 1, 1, 1, 1, 1, 1, 1 ) | 34 | #define MPP0_NF_IO2 MPP( 0, 0x1, 0, 0, 1, 1, 1, 1, 1 ) |
| 35 | #define MPP0_SPI_SCn MPP( 0, 0x2, 0, 1, 1, 1, 1, 1, 1 ) | 35 | #define MPP0_SPI_SCn MPP( 0, 0x2, 0, 0, 1, 1, 1, 1, 1 ) |
| 36 | 36 | ||
| 37 | #define MPP1_GPO MPP( 1, 0x0, 0, 1, 1, 1, 1, 1, 1 ) | 37 | #define MPP1_GPO MPP( 1, 0x0, 0, 1, 1, 1, 1, 1, 1 ) |
| 38 | #define MPP1_NF_IO3 MPP( 1, 0x1, 1, 1, 1, 1, 1, 1, 1 ) | 38 | #define MPP1_NF_IO3 MPP( 1, 0x1, 0, 0, 1, 1, 1, 1, 1 ) |
| 39 | #define MPP1_SPI_MOSI MPP( 1, 0x2, 0, 1, 1, 1, 1, 1, 1 ) | 39 | #define MPP1_SPI_MOSI MPP( 1, 0x2, 0, 0, 1, 1, 1, 1, 1 ) |
| 40 | 40 | ||
| 41 | #define MPP2_GPO MPP( 2, 0x0, 0, 1, 1, 1, 1, 1, 1 ) | 41 | #define MPP2_GPO MPP( 2, 0x0, 0, 1, 1, 1, 1, 1, 1 ) |
| 42 | #define MPP2_NF_IO4 MPP( 2, 0x1, 1, 1, 1, 1, 1, 1, 1 ) | 42 | #define MPP2_NF_IO4 MPP( 2, 0x1, 0, 0, 1, 1, 1, 1, 1 ) |
| 43 | #define MPP2_SPI_SCK MPP( 2, 0x2, 0, 1, 1, 1, 1, 1, 1 ) | 43 | #define MPP2_SPI_SCK MPP( 2, 0x2, 0, 0, 1, 1, 1, 1, 1 ) |
| 44 | 44 | ||
| 45 | #define MPP3_GPO MPP( 3, 0x0, 0, 1, 1, 1, 1, 1, 1 ) | 45 | #define MPP3_GPO MPP( 3, 0x0, 0, 1, 1, 1, 1, 1, 1 ) |
| 46 | #define MPP3_NF_IO5 MPP( 3, 0x1, 1, 1, 1, 1, 1, 1, 1 ) | 46 | #define MPP3_NF_IO5 MPP( 3, 0x1, 0, 0, 1, 1, 1, 1, 1 ) |
| 47 | #define MPP3_SPI_MISO MPP( 3, 0x2, 1, 0, 1, 1, 1, 1, 1 ) | 47 | #define MPP3_SPI_MISO MPP( 3, 0x2, 0, 0, 1, 1, 1, 1, 1 ) |
| 48 | 48 | ||
| 49 | #define MPP4_GPIO MPP( 4, 0x0, 1, 1, 1, 1, 1, 1, 1 ) | 49 | #define MPP4_GPIO MPP( 4, 0x0, 1, 1, 1, 1, 1, 1, 1 ) |
| 50 | #define MPP4_NF_IO6 MPP( 4, 0x1, 1, 1, 1, 1, 1, 1, 1 ) | 50 | #define MPP4_NF_IO6 MPP( 4, 0x1, 0, 0, 1, 1, 1, 1, 1 ) |
| 51 | #define MPP4_UART0_RXD MPP( 4, 0x2, 1, 0, 1, 1, 1, 1, 1 ) | 51 | #define MPP4_UART0_RXD MPP( 4, 0x2, 0, 0, 1, 1, 1, 1, 1 ) |
| 52 | #define MPP4_SATA1_ACTn MPP( 4, 0x5, 0, 1, 0, 0, 1, 1, 1 ) | 52 | #define MPP4_SATA1_ACTn MPP( 4, 0x5, 0, 0, 0, 0, 1, 1, 1 ) |
| 53 | #define MPP4_LCD_VGA_HSYNC MPP( 4, 0xb, 0, 0, 0, 0, 0, 0, 1 ) | 53 | #define MPP4_LCD_VGA_HSYNC MPP( 4, 0xb, 0, 0, 0, 0, 0, 0, 1 ) |
| 54 | #define MPP4_PTP_CLK MPP( 4, 0xd, 1, 0, 1, 1, 1, 1, 0 ) | 54 | #define MPP4_PTP_CLK MPP( 4, 0xd, 0, 0, 1, 1, 1, 1, 0 ) |
| 55 | 55 | ||
| 56 | #define MPP5_GPO MPP( 5, 0x0, 0, 1, 1, 1, 1, 1, 1 ) | 56 | #define MPP5_GPO MPP( 5, 0x0, 0, 1, 1, 1, 1, 1, 1 ) |
| 57 | #define MPP5_NF_IO7 MPP( 5, 0x1, 1, 1, 1, 1, 1, 1, 1 ) | 57 | #define MPP5_NF_IO7 MPP( 5, 0x1, 0, 0, 1, 1, 1, 1, 1 ) |
| 58 | #define MPP5_UART0_TXD MPP( 5, 0x2, 0, 1, 1, 1, 1, 1, 1 ) | 58 | #define MPP5_UART0_TXD MPP( 5, 0x2, 0, 0, 1, 1, 1, 1, 1 ) |
| 59 | #define MPP5_PTP_TRIG_GEN MPP( 5, 0x4, 0, 1, 1, 1, 1, 1, 0 ) | 59 | #define MPP5_PTP_TRIG_GEN MPP( 5, 0x4, 0, 0, 1, 1, 1, 1, 0 ) |
| 60 | #define MPP5_SATA0_ACTn MPP( 5, 0x5, 0, 1, 0, 1, 1, 1, 1 ) | 60 | #define MPP5_SATA0_ACTn MPP( 5, 0x5, 0, 0, 0, 1, 1, 1, 1 ) |
| 61 | #define MPP5_LCD_VGA_VSYNC MPP( 5, 0xb, 0, 0, 0, 0, 0, 0, 1 ) | 61 | #define MPP5_LCD_VGA_VSYNC MPP( 5, 0xb, 0, 0, 0, 0, 0, 0, 1 ) |
| 62 | 62 | ||
| 63 | #define MPP6_SYSRST_OUTn MPP( 6, 0x1, 0, 1, 1, 1, 1, 1, 1 ) | 63 | #define MPP6_SYSRST_OUTn MPP( 6, 0x1, 0, 0, 1, 1, 1, 1, 1 ) |
| 64 | #define MPP6_SPI_MOSI MPP( 6, 0x2, 0, 1, 1, 1, 1, 1, 1 ) | 64 | #define MPP6_SPI_MOSI MPP( 6, 0x2, 0, 0, 1, 1, 1, 1, 1 ) |
| 65 | #define MPP6_PTP_TRIG_GEN MPP( 6, 0x3, 0, 1, 1, 1, 1, 1, 0 ) | 65 | #define MPP6_PTP_TRIG_GEN MPP( 6, 0x3, 0, 0, 1, 1, 1, 1, 0 ) |
| 66 | 66 | ||
| 67 | #define MPP7_GPO MPP( 7, 0x0, 0, 1, 1, 1, 1, 1, 1 ) | 67 | #define MPP7_GPO MPP( 7, 0x0, 0, 1, 1, 1, 1, 1, 1 ) |
| 68 | #define MPP7_PEX_RST_OUTn MPP( 7, 0x1, 0, 1, 1, 1, 1, 1, 0 ) | 68 | #define MPP7_PEX_RST_OUTn MPP( 7, 0x1, 0, 0, 1, 1, 1, 1, 0 ) |
| 69 | #define MPP7_SPI_SCn MPP( 7, 0x2, 0, 1, 1, 1, 1, 1, 1 ) | 69 | #define MPP7_SPI_SCn MPP( 7, 0x2, 0, 0, 1, 1, 1, 1, 1 ) |
| 70 | #define MPP7_PTP_TRIG_GEN MPP( 7, 0x3, 0, 1, 1, 1, 1, 1, 0 ) | 70 | #define MPP7_PTP_TRIG_GEN MPP( 7, 0x3, 0, 0, 1, 1, 1, 1, 0 ) |
| 71 | #define MPP7_LCD_PWM MPP( 7, 0xb, 0, 1, 0, 0, 0, 0, 1 ) | 71 | #define MPP7_LCD_PWM MPP( 7, 0xb, 0, 0, 0, 0, 0, 0, 1 ) |
| 72 | 72 | ||
| 73 | #define MPP8_GPIO MPP( 8, 0x0, 1, 1, 1, 1, 1, 1, 1 ) | 73 | #define MPP8_GPIO MPP( 8, 0x0, 1, 1, 1, 1, 1, 1, 1 ) |
| 74 | #define MPP8_TW0_SDA MPP( 8, 0x1, 1, 1, 1, 1, 1, 1, 1 ) | 74 | #define MPP8_TW0_SDA MPP( 8, 0x1, 0, 0, 1, 1, 1, 1, 1 ) |
| 75 | #define MPP8_UART0_RTS MPP( 8, 0x2, 0, 1, 1, 1, 1, 1, 1 ) | 75 | #define MPP8_UART0_RTS MPP( 8, 0x2, 0, 0, 1, 1, 1, 1, 1 ) |
| 76 | #define MPP8_UART1_RTS MPP( 8, 0x3, 0, 1, 1, 1, 1, 1, 1 ) | 76 | #define MPP8_UART1_RTS MPP( 8, 0x3, 0, 0, 1, 1, 1, 1, 1 ) |
| 77 | #define MPP8_MII0_RXERR MPP( 8, 0x4, 1, 0, 0, 1, 1, 1, 1 ) | 77 | #define MPP8_MII0_RXERR MPP( 8, 0x4, 0, 0, 0, 1, 1, 1, 1 ) |
| 78 | #define MPP8_SATA1_PRESENTn MPP( 8, 0x5, 0, 1, 0, 0, 1, 1, 1 ) | 78 | #define MPP8_SATA1_PRESENTn MPP( 8, 0x5, 0, 0, 0, 0, 1, 1, 1 ) |
| 79 | #define MPP8_PTP_CLK MPP( 8, 0xc, 1, 0, 1, 1, 1, 1, 0 ) | 79 | #define MPP8_PTP_CLK MPP( 8, 0xc, 0, 0, 1, 1, 1, 1, 0 ) |
| 80 | #define MPP8_MII0_COL MPP( 8, 0xd, 1, 0, 1, 1, 1, 1, 1 ) | 80 | #define MPP8_MII0_COL MPP( 8, 0xd, 0, 0, 1, 1, 1, 1, 1 ) |
| 81 | 81 | ||
| 82 | #define MPP9_GPIO MPP( 9, 0x0, 1, 1, 1, 1, 1, 1, 1 ) | 82 | #define MPP9_GPIO MPP( 9, 0x0, 1, 1, 1, 1, 1, 1, 1 ) |
| 83 | #define MPP9_TW0_SCK MPP( 9, 0x1, 1, 1, 1, 1, 1, 1, 1 ) | 83 | #define MPP9_TW0_SCK MPP( 9, 0x1, 0, 0, 1, 1, 1, 1, 1 ) |
| 84 | #define MPP9_UART0_CTS MPP( 9, 0x2, 1, 0, 1, 1, 1, 1, 1 ) | 84 | #define MPP9_UART0_CTS MPP( 9, 0x2, 0, 0, 1, 1, 1, 1, 1 ) |
| 85 | #define MPP9_UART1_CTS MPP( 9, 0x3, 1, 0, 1, 1, 1, 1, 1 ) | 85 | #define MPP9_UART1_CTS MPP( 9, 0x3, 0, 0, 1, 1, 1, 1, 1 ) |
| 86 | #define MPP9_SATA0_PRESENTn MPP( 9, 0x5, 0, 1, 0, 1, 1, 1, 1 ) | 86 | #define MPP9_SATA0_PRESENTn MPP( 9, 0x5, 0, 0, 0, 1, 1, 1, 1 ) |
| 87 | #define MPP9_PTP_EVENT_REQ MPP( 9, 0xc, 1, 0, 1, 1, 1, 1, 0 ) | 87 | #define MPP9_PTP_EVENT_REQ MPP( 9, 0xc, 0, 0, 1, 1, 1, 1, 0 ) |
| 88 | #define MPP9_MII0_CRS MPP( 9, 0xd, 1, 0, 1, 1, 1, 1, 1 ) | 88 | #define MPP9_MII0_CRS MPP( 9, 0xd, 0, 0, 1, 1, 1, 1, 1 ) |
| 89 | 89 | ||
| 90 | #define MPP10_GPO MPP( 10, 0x0, 0, 1, 1, 1, 1, 1, 1 ) | 90 | #define MPP10_GPO MPP( 10, 0x0, 0, 1, 1, 1, 1, 1, 1 ) |
| 91 | #define MPP10_SPI_SCK MPP( 10, 0x2, 0, 1, 1, 1, 1, 1, 1 ) | 91 | #define MPP10_SPI_SCK MPP( 10, 0x2, 0, 0, 1, 1, 1, 1, 1 ) |
| 92 | #define MPP10_UART0_TXD MPP( 10, 0X3, 0, 1, 1, 1, 1, 1, 1 ) | 92 | #define MPP10_UART0_TXD MPP( 10, 0X3, 0, 0, 1, 1, 1, 1, 1 ) |
| 93 | #define MPP10_SATA1_ACTn MPP( 10, 0x5, 0, 1, 0, 0, 1, 1, 1 ) | 93 | #define MPP10_SATA1_ACTn MPP( 10, 0x5, 0, 0, 0, 0, 1, 1, 1 ) |
| 94 | #define MPP10_PTP_TRIG_GEN MPP( 10, 0xc, 0, 1, 1, 1, 1, 1, 0 ) | 94 | #define MPP10_PTP_TRIG_GEN MPP( 10, 0xc, 0, 0, 1, 1, 1, 1, 0 ) |
| 95 | 95 | ||
| 96 | #define MPP11_GPIO MPP( 11, 0x0, 1, 1, 1, 1, 1, 1, 1 ) | 96 | #define MPP11_GPIO MPP( 11, 0x0, 1, 1, 1, 1, 1, 1, 1 ) |
| 97 | #define MPP11_SPI_MISO MPP( 11, 0x2, 1, 0, 1, 1, 1, 1, 1 ) | 97 | #define MPP11_SPI_MISO MPP( 11, 0x2, 0, 0, 1, 1, 1, 1, 1 ) |
| 98 | #define MPP11_UART0_RXD MPP( 11, 0x3, 1, 0, 1, 1, 1, 1, 1 ) | 98 | #define MPP11_UART0_RXD MPP( 11, 0x3, 0, 0, 1, 1, 1, 1, 1 ) |
| 99 | #define MPP11_PTP_EVENT_REQ MPP( 11, 0x4, 1, 0, 1, 1, 1, 1, 0 ) | 99 | #define MPP11_PTP_EVENT_REQ MPP( 11, 0x4, 0, 0, 1, 1, 1, 1, 0 ) |
| 100 | #define MPP11_PTP_TRIG_GEN MPP( 11, 0xc, 0, 1, 1, 1, 1, 1, 0 ) | 100 | #define MPP11_PTP_TRIG_GEN MPP( 11, 0xc, 0, 0, 1, 1, 1, 1, 0 ) |
| 101 | #define MPP11_PTP_CLK MPP( 11, 0xd, 1, 0, 1, 1, 1, 1, 0 ) | 101 | #define MPP11_PTP_CLK MPP( 11, 0xd, 0, 0, 1, 1, 1, 1, 0 ) |
| 102 | #define MPP11_SATA0_ACTn MPP( 11, 0x5, 0, 1, 0, 1, 1, 1, 1 ) | 102 | #define MPP11_SATA0_ACTn MPP( 11, 0x5, 0, 0, 0, 1, 1, 1, 1 ) |
| 103 | 103 | ||
| 104 | #define MPP12_GPO MPP( 12, 0x0, 0, 1, 1, 1, 1, 1, 1 ) | 104 | #define MPP12_GPO MPP( 12, 0x0, 0, 1, 1, 1, 1, 1, 1 ) |
| 105 | #define MPP12_GPIO MPP( 12, 0x0, 1, 1, 0, 0, 0, 1, 0 ) | 105 | #define MPP12_GPIO MPP( 12, 0x0, 1, 1, 0, 0, 0, 1, 0 ) |
| 106 | #define MPP12_SD_CLK MPP( 12, 0x1, 0, 1, 1, 1, 1, 1, 1 ) | 106 | #define MPP12_SD_CLK MPP( 12, 0x1, 0, 0, 1, 1, 1, 1, 1 ) |
| 107 | #define MPP12_AU_SPDIF0 MPP( 12, 0xa, 0, 1, 0, 0, 0, 0, 1 ) | 107 | #define MPP12_AU_SPDIF0 MPP( 12, 0xa, 0, 0, 0, 0, 0, 0, 1 ) |
| 108 | #define MPP12_SPI_MOSI MPP( 12, 0xb, 0, 1, 0, 0, 0, 0, 1 ) | 108 | #define MPP12_SPI_MOSI MPP( 12, 0xb, 0, 0, 0, 0, 0, 0, 1 ) |
| 109 | #define MPP12_TW1_SDA MPP( 12, 0xd, 1, 0, 0, 0, 0, 0, 1 ) | 109 | #define MPP12_TW1_SDA MPP( 12, 0xd, 0, 0, 0, 0, 0, 0, 1 ) |
| 110 | 110 | ||
| 111 | #define MPP13_GPIO MPP( 13, 0x0, 1, 1, 1, 1, 1, 1, 1 ) | 111 | #define MPP13_GPIO MPP( 13, 0x0, 1, 1, 1, 1, 1, 1, 1 ) |
| 112 | #define MPP13_SD_CMD MPP( 13, 0x1, 1, 1, 1, 1, 1, 1, 1 ) | 112 | #define MPP13_SD_CMD MPP( 13, 0x1, 0, 0, 1, 1, 1, 1, 1 ) |
| 113 | #define MPP13_UART1_TXD MPP( 13, 0x3, 0, 1, 1, 1, 1, 1, 1 ) | 113 | #define MPP13_UART1_TXD MPP( 13, 0x3, 0, 0, 1, 1, 1, 1, 1 ) |
| 114 | #define MPP13_AU_SPDIFRMCLK MPP( 13, 0xa, 0, 1, 0, 0, 0, 0, 1 ) | 114 | #define MPP13_AU_SPDIFRMCLK MPP( 13, 0xa, 0, 0, 0, 0, 0, 0, 1 ) |
| 115 | #define MPP13_LCDPWM MPP( 13, 0xb, 0, 1, 0, 0, 0, 0, 1 ) | 115 | #define MPP13_LCDPWM MPP( 13, 0xb, 0, 0, 0, 0, 0, 0, 1 ) |
| 116 | 116 | ||
| 117 | #define MPP14_GPIO MPP( 14, 0x0, 1, 1, 1, 1, 1, 1, 1 ) | 117 | #define MPP14_GPIO MPP( 14, 0x0, 1, 1, 1, 1, 1, 1, 1 ) |
| 118 | #define MPP14_SD_D0 MPP( 14, 0x1, 1, 1, 1, 1, 1, 1, 1 ) | 118 | #define MPP14_SD_D0 MPP( 14, 0x1, 0, 0, 1, 1, 1, 1, 1 ) |
| 119 | #define MPP14_UART1_RXD MPP( 14, 0x3, 1, 0, 1, 1, 1, 1, 1 ) | 119 | #define MPP14_UART1_RXD MPP( 14, 0x3, 0, 0, 1, 1, 1, 1, 1 ) |
| 120 | #define MPP14_SATA1_PRESENTn MPP( 14, 0x4, 0, 1, 0, 0, 1, 1, 1 ) | 120 | #define MPP14_SATA1_PRESENTn MPP( 14, 0x4, 0, 0, 0, 0, 1, 1, 1 ) |
| 121 | #define MPP14_AU_SPDIFI MPP( 14, 0xa, 1, 0, 0, 0, 0, 0, 1 ) | 121 | #define MPP14_AU_SPDIFI MPP( 14, 0xa, 0, 0, 0, 0, 0, 0, 1 ) |
| 122 | #define MPP14_AU_I2SDI MPP( 14, 0xb, 1, 0, 0, 0, 0, 0, 1 ) | 122 | #define MPP14_AU_I2SDI MPP( 14, 0xb, 0, 0, 0, 0, 0, 0, 1 ) |
| 123 | #define MPP14_MII0_COL MPP( 14, 0xd, 1, 0, 1, 1, 1, 1, 1 ) | 123 | #define MPP14_MII0_COL MPP( 14, 0xd, 0, 0, 1, 1, 1, 1, 1 ) |
| 124 | 124 | ||
| 125 | #define MPP15_GPIO MPP( 15, 0x0, 1, 1, 1, 1, 1, 1, 1 ) | 125 | #define MPP15_GPIO MPP( 15, 0x0, 1, 1, 1, 1, 1, 1, 1 ) |
| 126 | #define MPP15_SD_D1 MPP( 15, 0x1, 1, 1, 1, 1, 1, 1, 1 ) | 126 | #define MPP15_SD_D1 MPP( 15, 0x1, 0, 0, 1, 1, 1, 1, 1 ) |
| 127 | #define MPP15_UART0_RTS MPP( 15, 0x2, 0, 1, 1, 1, 1, 1, 1 ) | 127 | #define MPP15_UART0_RTS MPP( 15, 0x2, 0, 0, 1, 1, 1, 1, 1 ) |
| 128 | #define MPP15_UART1_TXD MPP( 15, 0x3, 0, 1, 1, 1, 1, 1, 1 ) | 128 | #define MPP15_UART1_TXD MPP( 15, 0x3, 0, 0, 1, 1, 1, 1, 1 ) |
| 129 | #define MPP15_SATA0_ACTn MPP( 15, 0x4, 0, 1, 0, 1, 1, 1, 1 ) | 129 | #define MPP15_SATA0_ACTn MPP( 15, 0x4, 0, 0, 0, 1, 1, 1, 1 ) |
| 130 | #define MPP15_SPI_CSn MPP( 15, 0xb, 0, 1, 0, 0, 0, 0, 1 ) | 130 | #define MPP15_SPI_CSn MPP( 15, 0xb, 0, 0, 0, 0, 0, 0, 1 ) |
| 131 | 131 | ||
| 132 | #define MPP16_GPIO MPP( 16, 0x0, 1, 1, 1, 1, 1, 1, 1 ) | 132 | #define MPP16_GPIO MPP( 16, 0x0, 1, 1, 1, 1, 1, 1, 1 ) |
| 133 | #define MPP16_SD_D2 MPP( 16, 0x1, 1, 1, 1, 1, 1, 1, 1 ) | 133 | #define MPP16_SD_D2 MPP( 16, 0x1, 0, 0, 1, 1, 1, 1, 1 ) |
| 134 | #define MPP16_UART0_CTS MPP( 16, 0x2, 1, 0, 1, 1, 1, 1, 1 ) | 134 | #define MPP16_UART0_CTS MPP( 16, 0x2, 0, 0, 1, 1, 1, 1, 1 ) |
| 135 | #define MPP16_UART1_RXD MPP( 16, 0x3, 1, 0, 1, 1, 1, 1, 1 ) | 135 | #define MPP16_UART1_RXD MPP( 16, 0x3, 0, 0, 1, 1, 1, 1, 1 ) |
| 136 | #define MPP16_SATA1_ACTn MPP( 16, 0x4, 0, 1, 0, 0, 1, 1, 1 ) | 136 | #define MPP16_SATA1_ACTn MPP( 16, 0x4, 0, 0, 0, 0, 1, 1, 1 ) |
| 137 | #define MPP16_LCD_EXT_REF_CLK MPP( 16, 0xb, 1, 0, 0, 0, 0, 0, 1 ) | 137 | #define MPP16_LCD_EXT_REF_CLK MPP( 16, 0xb, 0, 0, 0, 0, 0, 0, 1 ) |
| 138 | #define MPP16_MII0_CRS MPP( 16, 0xd, 1, 0, 1, 1, 1, 1, 1 ) | 138 | #define MPP16_MII0_CRS MPP( 16, 0xd, 0, 0, 1, 1, 1, 1, 1 ) |
| 139 | 139 | ||
| 140 | #define MPP17_GPIO MPP( 17, 0x0, 1, 1, 1, 1, 1, 1, 1 ) | 140 | #define MPP17_GPIO MPP( 17, 0x0, 1, 1, 1, 1, 1, 1, 1 ) |
| 141 | #define MPP17_SD_D3 MPP( 17, 0x1, 1, 1, 1, 1, 1, 1, 1 ) | 141 | #define MPP17_SD_D3 MPP( 17, 0x1, 0, 0, 1, 1, 1, 1, 1 ) |
| 142 | #define MPP17_SATA0_PRESENTn MPP( 17, 0x4, 0, 1, 0, 1, 1, 1, 1 ) | 142 | #define MPP17_SATA0_PRESENTn MPP( 17, 0x4, 0, 0, 0, 1, 1, 1, 1 ) |
| 143 | #define MPP17_SATA1_ACTn MPP( 17, 0xa, 0, 1, 0, 0, 0, 0, 1 ) | 143 | #define MPP17_SATA1_ACTn MPP( 17, 0xa, 0, 0, 0, 0, 0, 0, 1 ) |
| 144 | #define MPP17_TW1_SCK MPP( 17, 0xd, 1, 1, 0, 0, 0, 0, 1 ) | 144 | #define MPP17_TW1_SCK MPP( 17, 0xd, 0, 0, 0, 0, 0, 0, 1 ) |
| 145 | 145 | ||
| 146 | #define MPP18_GPO MPP( 18, 0x0, 0, 1, 1, 1, 1, 1, 1 ) | 146 | #define MPP18_GPO MPP( 18, 0x0, 0, 1, 1, 1, 1, 1, 1 ) |
| 147 | #define MPP18_NF_IO0 MPP( 18, 0x1, 1, 1, 1, 1, 1, 1, 1 ) | 147 | #define MPP18_NF_IO0 MPP( 18, 0x1, 0, 0, 1, 1, 1, 1, 1 ) |
| 148 | #define MPP18_PEX0_CLKREQ MPP( 18, 0x2, 0, 1, 0, 0, 0, 0, 1 ) | 148 | #define MPP18_PEX0_CLKREQ MPP( 18, 0x2, 0, 0, 0, 0, 0, 0, 1 ) |
| 149 | 149 | ||
| 150 | #define MPP19_GPO MPP( 19, 0x0, 0, 1, 1, 1, 1, 1, 1 ) | 150 | #define MPP19_GPO MPP( 19, 0x0, 0, 1, 1, 1, 1, 1, 1 ) |
| 151 | #define MPP19_NF_IO1 MPP( 19, 0x1, 1, 1, 1, 1, 1, 1, 1 ) | 151 | #define MPP19_NF_IO1 MPP( 19, 0x1, 0, 0, 1, 1, 1, 1, 1 ) |
| 152 | 152 | ||
| 153 | #define MPP20_GPIO MPP( 20, 0x0, 1, 1, 0, 1, 1, 1, 1 ) | 153 | #define MPP20_GPIO MPP( 20, 0x0, 1, 1, 0, 1, 1, 1, 1 ) |
| 154 | #define MPP20_TSMP0 MPP( 20, 0x1, 1, 1, 0, 0, 1, 1, 1 ) | 154 | #define MPP20_TSMP0 MPP( 20, 0x1, 0, 0, 0, 0, 1, 1, 1 ) |
| 155 | #define MPP20_TDM_CH0_TX_QL MPP( 20, 0x2, 0, 1, 0, 0, 1, 1, 1 ) | 155 | #define MPP20_TDM_CH0_TX_QL MPP( 20, 0x2, 0, 0, 0, 0, 1, 1, 1 ) |
| 156 | #define MPP20_GE1_TXD0 MPP( 20, 0x3, 0, 0, 0, 1, 1, 1, 1 ) | 156 | #define MPP20_GE1_TXD0 MPP( 20, 0x3, 0, 0, 0, 1, 1, 1, 1 ) |
| 157 | #define MPP20_AU_SPDIFI MPP( 20, 0x4, 1, 0, 0, 0, 1, 1, 1 ) | 157 | #define MPP20_AU_SPDIFI MPP( 20, 0x4, 0, 0, 0, 0, 1, 1, 1 ) |
| 158 | #define MPP20_SATA1_ACTn MPP( 20, 0x5, 0, 1, 0, 0, 1, 1, 1 ) | 158 | #define MPP20_SATA1_ACTn MPP( 20, 0x5, 0, 0, 0, 0, 1, 1, 1 ) |
| 159 | #define MPP20_LCD_D0 MPP( 20, 0xb, 0, 0, 0, 0, 0, 0, 1 ) | 159 | #define MPP20_LCD_D0 MPP( 20, 0xb, 0, 0, 0, 0, 0, 0, 1 ) |
| 160 | 160 | ||
| 161 | #define MPP21_GPIO MPP( 21, 0x0, 1, 1, 0, 1, 1, 1, 1 ) | 161 | #define MPP21_GPIO MPP( 21, 0x0, 1, 1, 0, 1, 1, 1, 1 ) |
| 162 | #define MPP21_TSMP1 MPP( 21, 0x1, 1, 1, 0, 0, 1, 1, 1 ) | 162 | #define MPP21_TSMP1 MPP( 21, 0x1, 0, 0, 0, 0, 1, 1, 1 ) |
| 163 | #define MPP21_TDM_CH0_RX_QL MPP( 21, 0x2, 0, 1, 0, 0, 1, 1, 1 ) | 163 | #define MPP21_TDM_CH0_RX_QL MPP( 21, 0x2, 0, 0, 0, 0, 1, 1, 1 ) |
| 164 | #define MPP21_GE1_TXD1 MPP( 21, 0x3, 0, 0, 0, 1, 1, 1, 1 ) | 164 | #define MPP21_GE1_TXD1 MPP( 21, 0x3, 0, 0, 0, 1, 1, 1, 1 ) |
| 165 | #define MPP21_AU_SPDIFO MPP( 21, 0x4, 0, 1, 0, 0, 1, 1, 1 ) | 165 | #define MPP21_AU_SPDIFO MPP( 21, 0x4, 0, 0, 0, 0, 1, 1, 1 ) |
| 166 | #define MPP21_SATA0_ACTn MPP( 21, 0x5, 0, 1, 0, 1, 1, 1, 1 ) | 166 | #define MPP21_SATA0_ACTn MPP( 21, 0x5, 0, 0, 0, 1, 1, 1, 1 ) |
| 167 | #define MPP21_LCD_D1 MPP( 21, 0xb, 0, 0, 0, 0, 0, 0, 1 ) | 167 | #define MPP21_LCD_D1 MPP( 21, 0xb, 0, 0, 0, 0, 0, 0, 1 ) |
| 168 | 168 | ||
| 169 | #define MPP22_GPIO MPP( 22, 0x0, 1, 1, 0, 1, 1, 1, 1 ) | 169 | #define MPP22_GPIO MPP( 22, 0x0, 1, 1, 0, 1, 1, 1, 1 ) |
| 170 | #define MPP22_TSMP2 MPP( 22, 0x1, 1, 1, 0, 0, 1, 1, 1 ) | 170 | #define MPP22_TSMP2 MPP( 22, 0x1, 0, 0, 0, 0, 1, 1, 1 ) |
| 171 | #define MPP22_TDM_CH2_TX_QL MPP( 22, 0x2, 0, 1, 0, 0, 1, 1, 1 ) | 171 | #define MPP22_TDM_CH2_TX_QL MPP( 22, 0x2, 0, 0, 0, 0, 1, 1, 1 ) |
| 172 | #define MPP22_GE1_TXD2 MPP( 22, 0x3, 0, 0, 0, 1, 1, 1, 1 ) | 172 | #define MPP22_GE1_TXD2 MPP( 22, 0x3, 0, 0, 0, 1, 1, 1, 1 ) |
| 173 | #define MPP22_AU_SPDIFRMKCLK MPP( 22, 0x4, 0, 1, 0, 0, 1, 1, 1 ) | 173 | #define MPP22_AU_SPDIFRMKCLK MPP( 22, 0x4, 0, 0, 0, 0, 1, 1, 1 ) |
| 174 | #define MPP22_SATA1_PRESENTn MPP( 22, 0x5, 0, 1, 0, 0, 1, 1, 1 ) | 174 | #define MPP22_SATA1_PRESENTn MPP( 22, 0x5, 0, 0, 0, 0, 1, 1, 1 ) |
| 175 | #define MPP22_LCD_D2 MPP( 22, 0xb, 0, 0, 0, 0, 0, 0, 1 ) | 175 | #define MPP22_LCD_D2 MPP( 22, 0xb, 0, 0, 0, 0, 0, 0, 1 ) |
| 176 | 176 | ||
| 177 | #define MPP23_GPIO MPP( 23, 0x0, 1, 1, 0, 1, 1, 1, 1 ) | 177 | #define MPP23_GPIO MPP( 23, 0x0, 1, 1, 0, 1, 1, 1, 1 ) |
| 178 | #define MPP23_TSMP3 MPP( 23, 0x1, 1, 1, 0, 0, 1, 1, 1 ) | 178 | #define MPP23_TSMP3 MPP( 23, 0x1, 0, 0, 0, 0, 1, 1, 1 ) |
| 179 | #define MPP23_TDM_CH2_RX_QL MPP( 23, 0x2, 1, 0, 0, 0, 1, 1, 1 ) | 179 | #define MPP23_TDM_CH2_RX_QL MPP( 23, 0x2, 0, 0, 0, 0, 1, 1, 1 ) |
| 180 | #define MPP23_GE1_TXD3 MPP( 23, 0x3, 0, 0, 0, 1, 1, 1, 1 ) | 180 | #define MPP23_GE1_TXD3 MPP( 23, 0x3, 0, 0, 0, 1, 1, 1, 1 ) |
| 181 | #define MPP23_AU_I2SBCLK MPP( 23, 0x4, 0, 1, 0, 0, 1, 1, 1 ) | 181 | #define MPP23_AU_I2SBCLK MPP( 23, 0x4, 0, 0, 0, 0, 1, 1, 1 ) |
| 182 | #define MPP23_SATA0_PRESENTn MPP( 23, 0x5, 0, 1, 0, 1, 1, 1, 1 ) | 182 | #define MPP23_SATA0_PRESENTn MPP( 23, 0x5, 0, 0, 0, 1, 1, 1, 1 ) |
| 183 | #define MPP23_LCD_D3 MPP( 23, 0xb, 0, 0, 0, 0, 0, 0, 1 ) | 183 | #define MPP23_LCD_D3 MPP( 23, 0xb, 0, 0, 0, 0, 0, 0, 1 ) |
| 184 | 184 | ||
| 185 | #define MPP24_GPIO MPP( 24, 0x0, 1, 1, 0, 1, 1, 1, 1 ) | 185 | #define MPP24_GPIO MPP( 24, 0x0, 1, 1, 0, 1, 1, 1, 1 ) |
| 186 | #define MPP24_TSMP4 MPP( 24, 0x1, 1, 1, 0, 0, 1, 1, 1 ) | 186 | #define MPP24_TSMP4 MPP( 24, 0x1, 0, 0, 0, 0, 1, 1, 1 ) |
| 187 | #define MPP24_TDM_SPI_CS0 MPP( 24, 0x2, 0, 1, 0, 0, 1, 1, 1 ) | 187 | #define MPP24_TDM_SPI_CS0 MPP( 24, 0x2, 0, 0, 0, 0, 1, 1, 1 ) |
| 188 | #define MPP24_GE1_RXD0 MPP( 24, 0x3, 0, 0, 0, 1, 1, 1, 1 ) | 188 | #define MPP24_GE1_RXD0 MPP( 24, 0x3, 0, 0, 0, 1, 1, 1, 1 ) |
| 189 | #define MPP24_AU_I2SDO MPP( 24, 0x4, 0, 1, 0, 0, 1, 1, 1 ) | 189 | #define MPP24_AU_I2SDO MPP( 24, 0x4, 0, 0, 0, 0, 1, 1, 1 ) |
| 190 | #define MPP24_LCD_D4 MPP( 24, 0xb, 0, 0, 0, 0, 0, 0, 1 ) | 190 | #define MPP24_LCD_D4 MPP( 24, 0xb, 0, 0, 0, 0, 0, 0, 1 ) |
| 191 | 191 | ||
| 192 | #define MPP25_GPIO MPP( 25, 0x0, 1, 1, 0, 1, 1, 1, 1 ) | 192 | #define MPP25_GPIO MPP( 25, 0x0, 1, 1, 0, 1, 1, 1, 1 ) |
| 193 | #define MPP25_TSMP5 MPP( 25, 0x1, 1, 1, 0, 0, 1, 1, 1 ) | 193 | #define MPP25_TSMP5 MPP( 25, 0x1, 0, 0, 0, 0, 1, 1, 1 ) |
| 194 | #define MPP25_TDM_SPI_SCK MPP( 25, 0x2, 0, 1, 0, 0, 1, 1, 1 ) | 194 | #define MPP25_TDM_SPI_SCK MPP( 25, 0x2, 0, 0, 0, 0, 1, 1, 1 ) |
| 195 | #define MPP25_GE1_RXD1 MPP( 25, 0x3, 0, 0, 0, 1, 1, 1, 1 ) | 195 | #define MPP25_GE1_RXD1 MPP( 25, 0x3, 0, 0, 0, 1, 1, 1, 1 ) |
| 196 | #define MPP25_AU_I2SLRCLK MPP( 25, 0x4, 0, 1, 0, 0, 1, 1, 1 ) | 196 | #define MPP25_AU_I2SLRCLK MPP( 25, 0x4, 0, 0, 0, 0, 1, 1, 1 ) |
| 197 | #define MPP25_LCD_D5 MPP( 25, 0xb, 0, 0, 0, 0, 0, 0, 1 ) | 197 | #define MPP25_LCD_D5 MPP( 25, 0xb, 0, 0, 0, 0, 0, 0, 1 ) |
| 198 | 198 | ||
| 199 | #define MPP26_GPIO MPP( 26, 0x0, 1, 1, 0, 1, 1, 1, 1 ) | 199 | #define MPP26_GPIO MPP( 26, 0x0, 1, 1, 0, 1, 1, 1, 1 ) |
| 200 | #define MPP26_TSMP6 MPP( 26, 0x1, 1, 1, 0, 0, 1, 1, 1 ) | 200 | #define MPP26_TSMP6 MPP( 26, 0x1, 0, 0, 0, 0, 1, 1, 1 ) |
| 201 | #define MPP26_TDM_SPI_MISO MPP( 26, 0x2, 1, 0, 0, 0, 1, 1, 1 ) | 201 | #define MPP26_TDM_SPI_MISO MPP( 26, 0x2, 0, 0, 0, 0, 1, 1, 1 ) |
| 202 | #define MPP26_GE1_RXD2 MPP( 26, 0x3, 0, 0, 0, 1, 1, 1, 1 ) | 202 | #define MPP26_GE1_RXD2 MPP( 26, 0x3, 0, 0, 0, 1, 1, 1, 1 ) |
| 203 | #define MPP26_AU_I2SMCLK MPP( 26, 0x4, 0, 1, 0, 0, 1, 1, 1 ) | 203 | #define MPP26_AU_I2SMCLK MPP( 26, 0x4, 0, 0, 0, 0, 1, 1, 1 ) |
| 204 | #define MPP26_LCD_D6 MPP( 26, 0xb, 0, 0, 0, 0, 0, 0, 1 ) | 204 | #define MPP26_LCD_D6 MPP( 26, 0xb, 0, 0, 0, 0, 0, 0, 1 ) |
| 205 | 205 | ||
| 206 | #define MPP27_GPIO MPP( 27, 0x0, 1, 1, 0, 1, 1, 1, 1 ) | 206 | #define MPP27_GPIO MPP( 27, 0x0, 1, 1, 0, 1, 1, 1, 1 ) |
| 207 | #define MPP27_TSMP7 MPP( 27, 0x1, 1, 1, 0, 0, 1, 1, 1 ) | 207 | #define MPP27_TSMP7 MPP( 27, 0x1, 0, 0, 0, 0, 1, 1, 1 ) |
| 208 | #define MPP27_TDM_SPI_MOSI MPP( 27, 0x2, 0, 1, 0, 0, 1, 1, 1 ) | 208 | #define MPP27_TDM_SPI_MOSI MPP( 27, 0x2, 0, 0, 0, 0, 1, 1, 1 ) |
| 209 | #define MPP27_GE1_RXD3 MPP( 27, 0x3, 0, 0, 0, 1, 1, 1, 1 ) | 209 | #define MPP27_GE1_RXD3 MPP( 27, 0x3, 0, 0, 0, 1, 1, 1, 1 ) |
| 210 | #define MPP27_AU_I2SDI MPP( 27, 0x4, 1, 0, 0, 0, 1, 1, 1 ) | 210 | #define MPP27_AU_I2SDI MPP( 27, 0x4, 0, 0, 0, 0, 1, 1, 1 ) |
| 211 | #define MPP27_LCD_D7 MPP( 27, 0xb, 0, 0, 0, 0, 0, 0, 1 ) | 211 | #define MPP27_LCD_D7 MPP( 27, 0xb, 0, 0, 0, 0, 0, 0, 1 ) |
| 212 | 212 | ||
| 213 | #define MPP28_GPIO MPP( 28, 0x0, 1, 1, 0, 1, 1, 1, 1 ) | 213 | #define MPP28_GPIO MPP( 28, 0x0, 1, 1, 0, 1, 1, 1, 1 ) |
| 214 | #define MPP28_TSMP8 MPP( 28, 0x1, 1, 1, 0, 0, 1, 1, 1 ) | 214 | #define MPP28_TSMP8 MPP( 28, 0x1, 0, 0, 0, 0, 1, 1, 1 ) |
| 215 | #define MPP28_TDM_CODEC_INTn MPP( 28, 0x2, 0, 0, 0, 0, 1, 1, 1 ) | 215 | #define MPP28_TDM_CODEC_INTn MPP( 28, 0x2, 0, 0, 0, 0, 1, 1, 1 ) |
| 216 | #define MPP28_GE1_COL MPP( 28, 0x3, 0, 0, 0, 1, 1, 1, 1 ) | 216 | #define MPP28_GE1_COL MPP( 28, 0x3, 0, 0, 0, 1, 1, 1, 1 ) |
| 217 | #define MPP28_AU_EXTCLK MPP( 28, 0x4, 1, 0, 0, 0, 1, 1, 1 ) | 217 | #define MPP28_AU_EXTCLK MPP( 28, 0x4, 0, 0, 0, 0, 1, 1, 1 ) |
| 218 | #define MPP28_LCD_D8 MPP( 28, 0xb, 0, 0, 0, 0, 0, 0, 1 ) | 218 | #define MPP28_LCD_D8 MPP( 28, 0xb, 0, 0, 0, 0, 0, 0, 1 ) |
| 219 | 219 | ||
| 220 | #define MPP29_GPIO MPP( 29, 0x0, 1, 1, 0, 1, 1, 1, 1 ) | 220 | #define MPP29_GPIO MPP( 29, 0x0, 1, 1, 0, 1, 1, 1, 1 ) |
| 221 | #define MPP29_TSMP9 MPP( 29, 0x1, 1, 1, 0, 0, 1, 1, 1 ) | 221 | #define MPP29_TSMP9 MPP( 29, 0x1, 0, 0, 0, 0, 1, 1, 1 ) |
| 222 | #define MPP29_TDM_CODEC_RSTn MPP( 29, 0x2, 0, 0, 0, 0, 1, 1, 1 ) | 222 | #define MPP29_TDM_CODEC_RSTn MPP( 29, 0x2, 0, 0, 0, 0, 1, 1, 1 ) |
| 223 | #define MPP29_GE1_TCLK MPP( 29, 0x3, 0, 0, 0, 1, 1, 1, 1 ) | 223 | #define MPP29_GE1_TCLK MPP( 29, 0x3, 0, 0, 0, 1, 1, 1, 1 ) |
| 224 | #define MPP29_LCD_D9 MPP( 29, 0xb, 0, 0, 0, 0, 0, 0, 1 ) | 224 | #define MPP29_LCD_D9 MPP( 29, 0xb, 0, 0, 0, 0, 0, 0, 1 ) |
| 225 | 225 | ||
| 226 | #define MPP30_GPIO MPP( 30, 0x0, 1, 1, 0, 1, 1, 1, 1 ) | 226 | #define MPP30_GPIO MPP( 30, 0x0, 1, 1, 0, 1, 1, 1, 1 ) |
| 227 | #define MPP30_TSMP10 MPP( 30, 0x1, 1, 1, 0, 0, 1, 1, 1 ) | 227 | #define MPP30_TSMP10 MPP( 30, 0x1, 0, 0, 0, 0, 1, 1, 1 ) |
| 228 | #define MPP30_TDM_PCLK MPP( 30, 0x2, 1, 1, 0, 0, 1, 1, 1 ) | 228 | #define MPP30_TDM_PCLK MPP( 30, 0x2, 0, 0, 0, 0, 1, 1, 1 ) |
| 229 | #define MPP30_GE1_RXCTL MPP( 30, 0x3, 0, 0, 0, 1, 1, 1, 1 ) | 229 | #define MPP30_GE1_RXCTL MPP( 30, 0x3, 0, 0, 0, 1, 1, 1, 1 ) |
| 230 | #define MPP30_LCD_D10 MPP( 30, 0xb, 0, 0, 0, 0, 0, 0, 1 ) | 230 | #define MPP30_LCD_D10 MPP( 30, 0xb, 0, 0, 0, 0, 0, 0, 1 ) |
| 231 | 231 | ||
| 232 | #define MPP31_GPIO MPP( 31, 0x0, 1, 1, 0, 1, 1, 1, 1 ) | 232 | #define MPP31_GPIO MPP( 31, 0x0, 1, 1, 0, 1, 1, 1, 1 ) |
| 233 | #define MPP31_TSMP11 MPP( 31, 0x1, 1, 1, 0, 0, 1, 1, 1 ) | 233 | #define MPP31_TSMP11 MPP( 31, 0x1, 0, 0, 0, 0, 1, 1, 1 ) |
| 234 | #define MPP31_TDM_FS MPP( 31, 0x2, 1, 1, 0, 0, 1, 1, 1 ) | 234 | #define MPP31_TDM_FS MPP( 31, 0x2, 0, 0, 0, 0, 1, 1, 1 ) |
| 235 | #define MPP31_GE1_RXCLK MPP( 31, 0x3, 0, 0, 0, 1, 1, 1, 1 ) | 235 | #define MPP31_GE1_RXCLK MPP( 31, 0x3, 0, 0, 0, 1, 1, 1, 1 ) |
| 236 | #define MPP31_LCD_D11 MPP( 31, 0xb, 0, 0, 0, 0, 0, 0, 1 ) | 236 | #define MPP31_LCD_D11 MPP( 31, 0xb, 0, 0, 0, 0, 0, 0, 1 ) |
| 237 | 237 | ||
| 238 | #define MPP32_GPIO MPP( 32, 0x0, 1, 1, 0, 1, 1, 1, 1 ) | 238 | #define MPP32_GPIO MPP( 32, 0x0, 1, 1, 0, 1, 1, 1, 1 ) |
| 239 | #define MPP32_TSMP12 MPP( 32, 0x1, 1, 1, 0, 0, 1, 1, 1 ) | 239 | #define MPP32_TSMP12 MPP( 32, 0x1, 0, 0, 0, 0, 1, 1, 1 ) |
| 240 | #define MPP32_TDM_DRX MPP( 32, 0x2, 1, 0, 0, 0, 1, 1, 1 ) | 240 | #define MPP32_TDM_DRX MPP( 32, 0x2, 0, 0, 0, 0, 1, 1, 1 ) |
| 241 | #define MPP32_GE1_TCLKOUT MPP( 32, 0x3, 0, 0, 0, 1, 1, 1, 1 ) | 241 | #define MPP32_GE1_TCLKOUT MPP( 32, 0x3, 0, 0, 0, 1, 1, 1, 1 ) |
| 242 | #define MPP32_LCD_D12 MPP( 32, 0xb, 0, 0, 0, 0, 0, 0, 1 ) | 242 | #define MPP32_LCD_D12 MPP( 32, 0xb, 0, 0, 0, 0, 0, 0, 1 ) |
| 243 | 243 | ||
| 244 | #define MPP33_GPO MPP( 33, 0x0, 0, 1, 0, 1, 1, 1, 1 ) | 244 | #define MPP33_GPO MPP( 33, 0x0, 0, 1, 0, 1, 1, 1, 1 ) |
| 245 | #define MPP33_TDM_DTX MPP( 33, 0x2, 0, 1, 0, 0, 1, 1, 1 ) | 245 | #define MPP33_TDM_DTX MPP( 33, 0x2, 0, 0, 0, 0, 1, 1, 1 ) |
| 246 | #define MPP33_GE1_TXCTL MPP( 33, 0x3, 0, 0, 0, 1, 1, 1, 1 ) | 246 | #define MPP33_GE1_TXCTL MPP( 33, 0x3, 0, 0, 0, 1, 1, 1, 1 ) |
| 247 | #define MPP33_LCD_D13 MPP( 33, 0xb, 0, 0, 0, 0, 0, 0, 1 ) | 247 | #define MPP33_LCD_D13 MPP( 33, 0xb, 0, 0, 0, 0, 0, 0, 1 ) |
| 248 | 248 | ||
| 249 | #define MPP34_GPIO MPP( 34, 0x0, 1, 1, 0, 1, 1, 1, 1 ) | 249 | #define MPP34_GPIO MPP( 34, 0x0, 1, 1, 0, 1, 1, 1, 1 ) |
| 250 | #define MPP34_TDM_SPI_CS1 MPP( 34, 0x2, 0, 1, 0, 0, 1, 1, 1 ) | 250 | #define MPP34_TDM_SPI_CS1 MPP( 34, 0x2, 0, 0, 0, 0, 1, 1, 1 ) |
| 251 | #define MPP34_GE1_TXEN MPP( 34, 0x3, 0, 0, 0, 1, 1, 1, 1 ) | 251 | #define MPP34_GE1_TXEN MPP( 34, 0x3, 0, 0, 0, 1, 1, 1, 1 ) |
| 252 | #define MPP34_SATA1_ACTn MPP( 34, 0x5, 0, 1, 0, 0, 0, 1, 1 ) | 252 | #define MPP34_SATA1_ACTn MPP( 34, 0x5, 0, 0, 0, 0, 0, 1, 1 ) |
| 253 | #define MPP34_LCD_D14 MPP( 34, 0xb, 0, 0, 0, 0, 0, 0, 1 ) | 253 | #define MPP34_LCD_D14 MPP( 34, 0xb, 0, 0, 0, 0, 0, 0, 1 ) |
| 254 | 254 | ||
| 255 | #define MPP35_GPIO MPP( 35, 0x0, 1, 1, 1, 1, 1, 1, 1 ) | 255 | #define MPP35_GPIO MPP( 35, 0x0, 1, 1, 1, 1, 1, 1, 1 ) |
| 256 | #define MPP35_TDM_CH0_TX_QL MPP( 35, 0x2, 0, 1, 0, 0, 1, 1, 1 ) | 256 | #define MPP35_TDM_CH0_TX_QL MPP( 35, 0x2, 0, 0, 0, 0, 1, 1, 1 ) |
| 257 | #define MPP35_GE1_RXERR MPP( 35, 0x3, 0, 0, 0, 1, 1, 1, 1 ) | 257 | #define MPP35_GE1_RXERR MPP( 35, 0x3, 0, 0, 0, 1, 1, 1, 1 ) |
| 258 | #define MPP35_SATA0_ACTn MPP( 35, 0x5, 0, 1, 0, 1, 1, 1, 1 ) | 258 | #define MPP35_SATA0_ACTn MPP( 35, 0x5, 0, 0, 0, 1, 1, 1, 1 ) |
| 259 | #define MPP35_LCD_D15 MPP( 22, 0xb, 0, 0, 0, 0, 0, 0, 1 ) | 259 | #define MPP35_LCD_D15 MPP( 22, 0xb, 0, 0, 0, 0, 0, 0, 1 ) |
| 260 | #define MPP35_MII0_RXERR MPP( 35, 0xc, 1, 0, 1, 1, 1, 1, 1 ) | 260 | #define MPP35_MII0_RXERR MPP( 35, 0xc, 0, 0, 1, 1, 1, 1, 1 ) |
| 261 | 261 | ||
| 262 | #define MPP36_GPIO MPP( 36, 0x0, 1, 1, 1, 0, 0, 1, 1 ) | 262 | #define MPP36_GPIO MPP( 36, 0x0, 1, 1, 1, 0, 0, 1, 1 ) |
| 263 | #define MPP36_TSMP0 MPP( 36, 0x1, 1, 1, 0, 0, 0, 1, 1 ) | 263 | #define MPP36_TSMP0 MPP( 36, 0x1, 0, 0, 0, 0, 0, 1, 1 ) |
| 264 | #define MPP36_TDM_SPI_CS1 MPP( 36, 0x2, 0, 1, 0, 0, 0, 1, 1 ) | 264 | #define MPP36_TDM_SPI_CS1 MPP( 36, 0x2, 0, 0, 0, 0, 0, 1, 1 ) |
| 265 | #define MPP36_AU_SPDIFI MPP( 36, 0x4, 1, 0, 1, 0, 0, 1, 1 ) | 265 | #define MPP36_AU_SPDIFI MPP( 36, 0x4, 0, 0, 1, 0, 0, 1, 1 ) |
| 266 | #define MPP36_TW1_SDA MPP( 36, 0xb, 1, 1, 0, 0, 0, 0, 1 ) | 266 | #define MPP36_TW1_SDA MPP( 36, 0xb, 0, 0, 0, 0, 0, 0, 1 ) |
| 267 | 267 | ||
| 268 | #define MPP37_GPIO MPP( 37, 0x0, 1, 1, 1, 0, 0, 1, 1 ) | 268 | #define MPP37_GPIO MPP( 37, 0x0, 1, 1, 1, 0, 0, 1, 1 ) |
| 269 | #define MPP37_TSMP1 MPP( 37, 0x1, 1, 1, 0, 0, 0, 1, 1 ) | 269 | #define MPP37_TSMP1 MPP( 37, 0x1, 0, 0, 0, 0, 0, 1, 1 ) |
| 270 | #define MPP37_TDM_CH2_TX_QL MPP( 37, 0x2, 0, 1, 0, 0, 0, 1, 1 ) | 270 | #define MPP37_TDM_CH2_TX_QL MPP( 37, 0x2, 0, 0, 0, 0, 0, 1, 1 ) |
| 271 | #define MPP37_AU_SPDIFO MPP( 37, 0x4, 0, 1, 1, 0, 0, 1, 1 ) | 271 | #define MPP37_AU_SPDIFO MPP( 37, 0x4, 0, 0, 1, 0, 0, 1, 1 ) |
| 272 | #define MPP37_TW1_SCK MPP( 37, 0xb, 1, 1, 0, 0, 0, 0, 1 ) | 272 | #define MPP37_TW1_SCK MPP( 37, 0xb, 0, 0, 0, 0, 0, 0, 1 ) |
| 273 | 273 | ||
| 274 | #define MPP38_GPIO MPP( 38, 0x0, 1, 1, 1, 0, 0, 1, 1 ) | 274 | #define MPP38_GPIO MPP( 38, 0x0, 1, 1, 1, 0, 0, 1, 1 ) |
| 275 | #define MPP38_TSMP2 MPP( 38, 0x1, 1, 1, 0, 0, 0, 1, 1 ) | 275 | #define MPP38_TSMP2 MPP( 38, 0x1, 0, 0, 0, 0, 0, 1, 1 ) |
| 276 | #define MPP38_TDM_CH2_RX_QL MPP( 38, 0x2, 0, 1, 0, 0, 0, 1, 1 ) | 276 | #define MPP38_TDM_CH2_RX_QL MPP( 38, 0x2, 0, 0, 0, 0, 0, 1, 1 ) |
| 277 | #define MPP38_AU_SPDIFRMLCLK MPP( 38, 0x4, 0, 1, 1, 0, 0, 1, 1 ) | 277 | #define MPP38_AU_SPDIFRMLCLK MPP( 38, 0x4, 0, 0, 1, 0, 0, 1, 1 ) |
| 278 | #define MPP38_LCD_D18 MPP( 38, 0xb, 0, 0, 0, 0, 0, 0, 1 ) | 278 | #define MPP38_LCD_D18 MPP( 38, 0xb, 0, 0, 0, 0, 0, 0, 1 ) |
| 279 | 279 | ||
| 280 | #define MPP39_GPIO MPP( 39, 0x0, 1, 1, 1, 0, 0, 1, 1 ) | 280 | #define MPP39_GPIO MPP( 39, 0x0, 1, 1, 1, 0, 0, 1, 1 ) |
| 281 | #define MPP39_TSMP3 MPP( 39, 0x1, 1, 1, 0, 0, 0, 1, 1 ) | 281 | #define MPP39_TSMP3 MPP( 39, 0x1, 0, 0, 0, 0, 0, 1, 1 ) |
| 282 | #define MPP39_TDM_SPI_CS0 MPP( 39, 0x2, 0, 1, 0, 0, 0, 1, 1 ) | 282 | #define MPP39_TDM_SPI_CS0 MPP( 39, 0x2, 0, 0, 0, 0, 0, 1, 1 ) |
| 283 | #define MPP39_AU_I2SBCLK MPP( 39, 0x4, 0, 1, 1, 0, 0, 1, 1 ) | 283 | #define MPP39_AU_I2SBCLK MPP( 39, 0x4, 0, 0, 1, 0, 0, 1, 1 ) |
| 284 | #define MPP39_LCD_D19 MPP( 39, 0xb, 0, 0, 0, 0, 0, 0, 1 ) | 284 | #define MPP39_LCD_D19 MPP( 39, 0xb, 0, 0, 0, 0, 0, 0, 1 ) |
| 285 | 285 | ||
| 286 | #define MPP40_GPIO MPP( 40, 0x0, 1, 1, 1, 0, 0, 1, 1 ) | 286 | #define MPP40_GPIO MPP( 40, 0x0, 1, 1, 1, 0, 0, 1, 1 ) |
| 287 | #define MPP40_TSMP4 MPP( 40, 0x1, 1, 1, 0, 0, 0, 1, 1 ) | 287 | #define MPP40_TSMP4 MPP( 40, 0x1, 0, 0, 0, 0, 0, 1, 1 ) |
| 288 | #define MPP40_TDM_SPI_SCK MPP( 40, 0x2, 0, 1, 0, 0, 0, 1, 1 ) | 288 | #define MPP40_TDM_SPI_SCK MPP( 40, 0x2, 0, 0, 0, 0, 0, 1, 1 ) |
| 289 | #define MPP40_AU_I2SDO MPP( 40, 0x4, 0, 1, 1, 0, 0, 1, 1 ) | 289 | #define MPP40_AU_I2SDO MPP( 40, 0x4, 0, 0, 1, 0, 0, 1, 1 ) |
| 290 | #define MPP40_LCD_D20 MPP( 40, 0xb, 0, 0, 0, 0, 0, 0, 1 ) | 290 | #define MPP40_LCD_D20 MPP( 40, 0xb, 0, 0, 0, 0, 0, 0, 1 ) |
| 291 | 291 | ||
| 292 | #define MPP41_GPIO MPP( 41, 0x0, 1, 1, 1, 0, 0, 1, 1 ) | 292 | #define MPP41_GPIO MPP( 41, 0x0, 1, 1, 1, 0, 0, 1, 1 ) |
| 293 | #define MPP41_TSMP5 MPP( 41, 0x1, 1, 1, 0, 0, 0, 1, 1 ) | 293 | #define MPP41_TSMP5 MPP( 41, 0x1, 0, 0, 0, 0, 0, 1, 1 ) |
| 294 | #define MPP41_TDM_SPI_MISO MPP( 41, 0x2, 1, 0, 0, 0, 0, 1, 1 ) | 294 | #define MPP41_TDM_SPI_MISO MPP( 41, 0x2, 0, 0, 0, 0, 0, 1, 1 ) |
| 295 | #define MPP41_AU_I2SLRCLK MPP( 41, 0x4, 0, 1, 1, 0, 0, 1, 1 ) | 295 | #define MPP41_AU_I2SLRCLK MPP( 41, 0x4, 0, 0, 1, 0, 0, 1, 1 ) |
| 296 | #define MPP41_LCD_D21 MPP( 41, 0xb, 0, 0, 0, 0, 0, 0, 1 ) | 296 | #define MPP41_LCD_D21 MPP( 41, 0xb, 0, 0, 0, 0, 0, 0, 1 ) |
| 297 | 297 | ||
| 298 | #define MPP42_GPIO MPP( 42, 0x0, 1, 1, 1, 0, 0, 1, 1 ) | 298 | #define MPP42_GPIO MPP( 42, 0x0, 1, 1, 1, 0, 0, 1, 1 ) |
| 299 | #define MPP42_TSMP6 MPP( 42, 0x1, 1, 1, 0, 0, 0, 1, 1 ) | 299 | #define MPP42_TSMP6 MPP( 42, 0x1, 0, 0, 0, 0, 0, 1, 1 ) |
| 300 | #define MPP42_TDM_SPI_MOSI MPP( 42, 0x2, 0, 1, 0, 0, 0, 1, 1 ) | 300 | #define MPP42_TDM_SPI_MOSI MPP( 42, 0x2, 0, 0, 0, 0, 0, 1, 1 ) |
| 301 | #define MPP42_AU_I2SMCLK MPP( 42, 0x4, 0, 1, 1, 0, 0, 1, 1 ) | 301 | #define MPP42_AU_I2SMCLK MPP( 42, 0x4, 0, 0, 1, 0, 0, 1, 1 ) |
| 302 | #define MPP42_LCD_D22 MPP( 42, 0xb, 0, 0, 0, 0, 0, 0, 1 ) | 302 | #define MPP42_LCD_D22 MPP( 42, 0xb, 0, 0, 0, 0, 0, 0, 1 ) |
| 303 | 303 | ||
| 304 | #define MPP43_GPIO MPP( 43, 0x0, 1, 1, 1, 0, 0, 1, 1 ) | 304 | #define MPP43_GPIO MPP( 43, 0x0, 1, 1, 1, 0, 0, 1, 1 ) |
| 305 | #define MPP43_TSMP7 MPP( 43, 0x1, 1, 1, 0, 0, 0, 1, 1 ) | 305 | #define MPP43_TSMP7 MPP( 43, 0x1, 0, 0, 0, 0, 0, 1, 1 ) |
| 306 | #define MPP43_TDM_CODEC_INTn MPP( 43, 0x2, 0, 0, 0, 0, 0, 1, 1 ) | 306 | #define MPP43_TDM_CODEC_INTn MPP( 43, 0x2, 0, 0, 0, 0, 0, 1, 1 ) |
| 307 | #define MPP43_AU_I2SDI MPP( 43, 0x4, 1, 0, 1, 0, 0, 1, 1 ) | 307 | #define MPP43_AU_I2SDI MPP( 43, 0x4, 0, 0, 1, 0, 0, 1, 1 ) |
| 308 | #define MPP43_LCD_D23 MPP( 22, 0xb, 0, 0, 0, 0, 0, 0, 1 ) | 308 | #define MPP43_LCD_D23 MPP( 22, 0xb, 0, 0, 0, 0, 0, 0, 1 ) |
| 309 | 309 | ||
| 310 | #define MPP44_GPIO MPP( 44, 0x0, 1, 1, 1, 0, 0, 1, 1 ) | 310 | #define MPP44_GPIO MPP( 44, 0x0, 1, 1, 1, 0, 0, 1, 1 ) |
| 311 | #define MPP44_TSMP8 MPP( 44, 0x1, 1, 1, 0, 0, 0, 1, 1 ) | 311 | #define MPP44_TSMP8 MPP( 44, 0x1, 0, 0, 0, 0, 0, 1, 1 ) |
| 312 | #define MPP44_TDM_CODEC_RSTn MPP( 44, 0x2, 0, 0, 0, 0, 0, 1, 1 ) | 312 | #define MPP44_TDM_CODEC_RSTn MPP( 44, 0x2, 0, 0, 0, 0, 0, 1, 1 ) |
| 313 | #define MPP44_AU_EXTCLK MPP( 44, 0x4, 1, 0, 1, 0, 0, 1, 1 ) | 313 | #define MPP44_AU_EXTCLK MPP( 44, 0x4, 0, 0, 1, 0, 0, 1, 1 ) |
| 314 | #define MPP44_LCD_CLK MPP( 44, 0xb, 0, 0, 0, 0, 0, 0, 1 ) | 314 | #define MPP44_LCD_CLK MPP( 44, 0xb, 0, 0, 0, 0, 0, 0, 1 ) |
| 315 | 315 | ||
| 316 | #define MPP45_GPIO MPP( 45, 0x0, 1, 1, 0, 0, 0, 1, 1 ) | 316 | #define MPP45_GPIO MPP( 45, 0x0, 1, 1, 0, 0, 0, 1, 1 ) |
| 317 | #define MPP45_TSMP9 MPP( 45, 0x1, 1, 1, 0, 0, 0, 1, 1 ) | 317 | #define MPP45_TSMP9 MPP( 45, 0x1, 0, 0, 0, 0, 0, 1, 1 ) |
| 318 | #define MPP45_TDM_PCLK MPP( 45, 0x2, 1, 1, 0, 0, 0, 1, 1 ) | 318 | #define MPP45_TDM_PCLK MPP( 45, 0x2, 0, 0, 0, 0, 0, 1, 1 ) |
| 319 | #define MPP245_LCD_E MPP( 45, 0xb, 0, 0, 0, 0, 0, 0, 1 ) | 319 | #define MPP245_LCD_E MPP( 45, 0xb, 0, 0, 0, 0, 0, 0, 1 ) |
| 320 | 320 | ||
| 321 | #define MPP46_GPIO MPP( 46, 0x0, 1, 1, 0, 0, 0, 1, 1 ) | 321 | #define MPP46_GPIO MPP( 46, 0x0, 1, 1, 0, 0, 0, 1, 1 ) |
| 322 | #define MPP46_TSMP10 MPP( 46, 0x1, 1, 1, 0, 0, 0, 1, 1 ) | 322 | #define MPP46_TSMP10 MPP( 46, 0x1, 0, 0, 0, 0, 0, 1, 1 ) |
| 323 | #define MPP46_TDM_FS MPP( 46, 0x2, 1, 1, 0, 0, 0, 1, 1 ) | 323 | #define MPP46_TDM_FS MPP( 46, 0x2, 0, 0, 0, 0, 0, 1, 1 ) |
| 324 | #define MPP46_LCD_HSYNC MPP( 46, 0xb, 0, 0, 0, 0, 0, 0, 1 ) | 324 | #define MPP46_LCD_HSYNC MPP( 46, 0xb, 0, 0, 0, 0, 0, 0, 1 ) |
| 325 | 325 | ||
| 326 | #define MPP47_GPIO MPP( 47, 0x0, 1, 1, 0, 0, 0, 1, 1 ) | 326 | #define MPP47_GPIO MPP( 47, 0x0, 1, 1, 0, 0, 0, 1, 1 ) |
| 327 | #define MPP47_TSMP11 MPP( 47, 0x1, 1, 1, 0, 0, 0, 1, 1 ) | 327 | #define MPP47_TSMP11 MPP( 47, 0x1, 0, 0, 0, 0, 0, 1, 1 ) |
| 328 | #define MPP47_TDM_DRX MPP( 47, 0x2, 1, 0, 0, 0, 0, 1, 1 ) | 328 | #define MPP47_TDM_DRX MPP( 47, 0x2, 0, 0, 0, 0, 0, 1, 1 ) |
| 329 | #define MPP47_LCD_VSYNC MPP( 47, 0xb, 0, 0, 0, 0, 0, 0, 1 ) | 329 | #define MPP47_LCD_VSYNC MPP( 47, 0xb, 0, 0, 0, 0, 0, 0, 1 ) |
| 330 | 330 | ||
| 331 | #define MPP48_GPIO MPP( 48, 0x0, 1, 1, 0, 0, 0, 1, 1 ) | 331 | #define MPP48_GPIO MPP( 48, 0x0, 1, 1, 0, 0, 0, 1, 1 ) |
| 332 | #define MPP48_TSMP12 MPP( 48, 0x1, 1, 1, 0, 0, 0, 1, 1 ) | 332 | #define MPP48_TSMP12 MPP( 48, 0x1, 0, 0, 0, 0, 0, 1, 1 ) |
| 333 | #define MPP48_TDM_DTX MPP( 48, 0x2, 0, 1, 0, 0, 0, 1, 1 ) | 333 | #define MPP48_TDM_DTX MPP( 48, 0x2, 0, 0, 0, 0, 0, 1, 1 ) |
| 334 | #define MPP48_LCD_D16 MPP( 22, 0xb, 0, 0, 0, 0, 0, 0, 1 ) | 334 | #define MPP48_LCD_D16 MPP( 22, 0xb, 0, 0, 0, 0, 0, 0, 1 ) |
| 335 | 335 | ||
| 336 | #define MPP49_GPIO MPP( 49, 0x0, 1, 1, 0, 0, 0, 1, 0 ) | 336 | #define MPP49_GPIO MPP( 49, 0x0, 1, 1, 0, 0, 0, 1, 0 ) |
| 337 | #define MPP49_GPO MPP( 49, 0x0, 0, 1, 0, 0, 0, 0, 1 ) | 337 | #define MPP49_GPO MPP( 49, 0x0, 0, 1, 0, 0, 0, 0, 1 ) |
| 338 | #define MPP49_TSMP9 MPP( 49, 0x1, 1, 1, 0, 0, 0, 1, 0 ) | 338 | #define MPP49_TSMP9 MPP( 49, 0x1, 0, 0, 0, 0, 0, 1, 0 ) |
| 339 | #define MPP49_TDM_CH0_RX_QL MPP( 49, 0x2, 0, 1, 0, 0, 0, 1, 1 ) | 339 | #define MPP49_TDM_CH0_RX_QL MPP( 49, 0x2, 0, 0, 0, 0, 0, 1, 1 ) |
| 340 | #define MPP49_PTP_CLK MPP( 49, 0x5, 1, 0, 0, 0, 0, 1, 0 ) | 340 | #define MPP49_PTP_CLK MPP( 49, 0x5, 0, 0, 0, 0, 0, 1, 0 ) |
| 341 | #define MPP49_PEX0_CLKREQ MPP( 49, 0xa, 0, 1, 0, 0, 0, 0, 1 ) | 341 | #define MPP49_PEX0_CLKREQ MPP( 49, 0xa, 0, 0, 0, 0, 0, 0, 1 ) |
| 342 | #define MPP49_LCD_D17 MPP( 49, 0xb, 0, 0, 0, 0, 0, 0, 1 ) | 342 | #define MPP49_LCD_D17 MPP( 49, 0xb, 0, 0, 0, 0, 0, 0, 1 ) |
| 343 | 343 | ||
| 344 | #define MPP_MAX 49 | 344 | #define MPP_MAX 49 |
diff --git a/arch/arm/mach-mv78xx0/common.c b/arch/arm/mach-mv78xx0/common.c index 0cdd41004ad0..a5dcf766a3f9 100644 --- a/arch/arm/mach-mv78xx0/common.c +++ b/arch/arm/mach-mv78xx0/common.c | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | #include <mach/mv78xx0.h> | 19 | #include <mach/mv78xx0.h> |
| 20 | #include <mach/bridge-regs.h> | 20 | #include <mach/bridge-regs.h> |
| 21 | #include <plat/cache-feroceon-l2.h> | 21 | #include <plat/cache-feroceon-l2.h> |
| 22 | #include <plat/ehci-orion.h> | ||
| 22 | #include <plat/orion_nand.h> | 23 | #include <plat/orion_nand.h> |
| 23 | #include <plat/time.h> | 24 | #include <plat/time.h> |
| 24 | #include <plat/common.h> | 25 | #include <plat/common.h> |
| @@ -169,7 +170,7 @@ void __init mv78xx0_map_io(void) | |||
| 169 | ****************************************************************************/ | 170 | ****************************************************************************/ |
| 170 | void __init mv78xx0_ehci0_init(void) | 171 | void __init mv78xx0_ehci0_init(void) |
| 171 | { | 172 | { |
| 172 | orion_ehci_init(USB0_PHYS_BASE, IRQ_MV78XX0_USB_0); | 173 | orion_ehci_init(USB0_PHYS_BASE, IRQ_MV78XX0_USB_0, EHCI_PHY_NA); |
| 173 | } | 174 | } |
| 174 | 175 | ||
| 175 | 176 | ||
diff --git a/arch/arm/mach-mv78xx0/mpp.h b/arch/arm/mach-mv78xx0/mpp.h index b61b50927123..3752302ae2ee 100644 --- a/arch/arm/mach-mv78xx0/mpp.h +++ b/arch/arm/mach-mv78xx0/mpp.h | |||
| @@ -24,296 +24,296 @@ | |||
| 24 | #define MPP_78100_A0_MASK MPP(0, 0x0, 0, 0, 1) | 24 | #define MPP_78100_A0_MASK MPP(0, 0x0, 0, 0, 1) |
| 25 | 25 | ||
| 26 | #define MPP0_GPIO MPP(0, 0x0, 1, 1, 1) | 26 | #define MPP0_GPIO MPP(0, 0x0, 1, 1, 1) |
| 27 | #define MPP0_GE0_COL MPP(0, 0x1, 1, 0, 1) | 27 | #define MPP0_GE0_COL MPP(0, 0x1, 0, 0, 1) |
| 28 | #define MPP0_GE1_TXCLK MPP(0, 0x2, 0, 1, 1) | 28 | #define MPP0_GE1_TXCLK MPP(0, 0x2, 0, 0, 1) |
| 29 | #define MPP0_UNUSED MPP(0, 0x3, 0, 0, 1) | 29 | #define MPP0_UNUSED MPP(0, 0x3, 0, 0, 1) |
| 30 | 30 | ||
| 31 | #define MPP1_GPIO MPP(1, 0x0, 1, 1, 1) | 31 | #define MPP1_GPIO MPP(1, 0x0, 1, 1, 1) |
| 32 | #define MPP1_GE0_RXERR MPP(1, 0x1, 1, 0, 1) | 32 | #define MPP1_GE0_RXERR MPP(1, 0x1, 0, 0, 1) |
| 33 | #define MPP1_GE1_TXCTL MPP(1, 0x2, 0, 1, 1) | 33 | #define MPP1_GE1_TXCTL MPP(1, 0x2, 0, 0, 1) |
| 34 | #define MPP1_UNUSED MPP(1, 0x3, 0, 0, 1) | 34 | #define MPP1_UNUSED MPP(1, 0x3, 0, 0, 1) |
| 35 | 35 | ||
| 36 | #define MPP2_GPIO MPP(2, 0x0, 1, 1, 1) | 36 | #define MPP2_GPIO MPP(2, 0x0, 1, 1, 1) |
| 37 | #define MPP2_GE0_CRS MPP(2, 0x1, 1, 0, 1) | 37 | #define MPP2_GE0_CRS MPP(2, 0x1, 0, 0, 1) |
| 38 | #define MPP2_GE1_RXCTL MPP(2, 0x2, 1, 0, 1) | 38 | #define MPP2_GE1_RXCTL MPP(2, 0x2, 0, 0, 1) |
| 39 | #define MPP2_UNUSED MPP(2, 0x3, 0, 0, 1) | 39 | #define MPP2_UNUSED MPP(2, 0x3, 0, 0, 1) |
| 40 | 40 | ||
| 41 | #define MPP3_GPIO MPP(3, 0x0, 1, 1, 1) | 41 | #define MPP3_GPIO MPP(3, 0x0, 1, 1, 1) |
| 42 | #define MPP3_GE0_TXERR MPP(3, 0x1, 0, 1, 1) | 42 | #define MPP3_GE0_TXERR MPP(3, 0x1, 0, 0, 1) |
| 43 | #define MPP3_GE1_RXCLK MPP(3, 0x2, 1, 0, 1) | 43 | #define MPP3_GE1_RXCLK MPP(3, 0x2, 0, 0, 1) |
| 44 | #define MPP3_UNUSED MPP(3, 0x3, 0, 0, 1) | 44 | #define MPP3_UNUSED MPP(3, 0x3, 0, 0, 1) |
| 45 | 45 | ||
| 46 | #define MPP4_GPIO MPP(4, 0x0, 1, 1, 1) | 46 | #define MPP4_GPIO MPP(4, 0x0, 1, 1, 1) |
| 47 | #define MPP4_GE0_TXD4 MPP(4, 0x1, 0, 1, 1) | 47 | #define MPP4_GE0_TXD4 MPP(4, 0x1, 0, 0, 1) |
| 48 | #define MPP4_GE1_TXD0 MPP(4, 0x2, 0, 1, 1) | 48 | #define MPP4_GE1_TXD0 MPP(4, 0x2, 0, 0, 1) |
| 49 | #define MPP4_UNUSED MPP(4, 0x3, 0, 0, 1) | 49 | #define MPP4_UNUSED MPP(4, 0x3, 0, 0, 1) |
| 50 | 50 | ||
| 51 | #define MPP5_GPIO MPP(5, 0x0, 1, 1, 1) | 51 | #define MPP5_GPIO MPP(5, 0x0, 1, 1, 1) |
| 52 | #define MPP5_GE0_TXD5 MPP(5, 0x1, 0, 1, 1) | 52 | #define MPP5_GE0_TXD5 MPP(5, 0x1, 0, 0, 1) |
| 53 | #define MPP5_GE1_TXD1 MPP(5, 0x2, 0, 1, 1) | 53 | #define MPP5_GE1_TXD1 MPP(5, 0x2, 0, 0, 1) |
| 54 | #define MPP5_UNUSED MPP(5, 0x3, 0, 0, 1) | 54 | #define MPP5_UNUSED MPP(5, 0x3, 0, 0, 1) |
| 55 | 55 | ||
| 56 | #define MPP6_GPIO MPP(6, 0x0, 1, 1, 1) | 56 | #define MPP6_GPIO MPP(6, 0x0, 1, 1, 1) |
| 57 | #define MPP6_GE0_TXD6 MPP(6, 0x1, 0, 1, 1) | 57 | #define MPP6_GE0_TXD6 MPP(6, 0x1, 0, 0, 1) |
| 58 | #define MPP6_GE1_TXD2 MPP(6, 0x2, 0, 1, 1) | 58 | #define MPP6_GE1_TXD2 MPP(6, 0x2, 0, 0, 1) |
| 59 | #define MPP6_UNUSED MPP(6, 0x3, 0, 0, 1) | 59 | #define MPP6_UNUSED MPP(6, 0x3, 0, 0, 1) |
| 60 | 60 | ||
| 61 | #define MPP7_GPIO MPP(7, 0x0, 1, 1, 1) | 61 | #define MPP7_GPIO MPP(7, 0x0, 1, 1, 1) |
| 62 | #define MPP7_GE0_TXD7 MPP(7, 0x1, 0, 1, 1) | 62 | #define MPP7_GE0_TXD7 MPP(7, 0x1, 0, 0, 1) |
| 63 | #define MPP7_GE1_TXD3 MPP(7, 0x2, 0, 1, 1) | 63 | #define MPP7_GE1_TXD3 MPP(7, 0x2, 0, 0, 1) |
| 64 | #define MPP7_UNUSED MPP(7, 0x3, 0, 0, 1) | 64 | #define MPP7_UNUSED MPP(7, 0x3, 0, 0, 1) |
| 65 | 65 | ||
| 66 | #define MPP8_GPIO MPP(8, 0x0, 1, 1, 1) | 66 | #define MPP8_GPIO MPP(8, 0x0, 1, 1, 1) |
| 67 | #define MPP8_GE0_RXD4 MPP(8, 0x1, 1, 0, 1) | 67 | #define MPP8_GE0_RXD4 MPP(8, 0x1, 0, 0, 1) |
| 68 | #define MPP8_GE1_RXD0 MPP(8, 0x2, 1, 0, 1) | 68 | #define MPP8_GE1_RXD0 MPP(8, 0x2, 0, 0, 1) |
| 69 | #define MPP8_UNUSED MPP(8, 0x3, 0, 0, 1) | 69 | #define MPP8_UNUSED MPP(8, 0x3, 0, 0, 1) |
| 70 | 70 | ||
| 71 | #define MPP9_GPIO MPP(9, 0x0, 1, 1, 1) | 71 | #define MPP9_GPIO MPP(9, 0x0, 1, 1, 1) |
| 72 | #define MPP9_GE0_RXD5 MPP(9, 0x1, 1, 0, 1) | 72 | #define MPP9_GE0_RXD5 MPP(9, 0x1, 0, 0, 1) |
| 73 | #define MPP9_GE1_RXD1 MPP(9, 0x2, 1, 0, 1) | 73 | #define MPP9_GE1_RXD1 MPP(9, 0x2, 0, 0, 1) |
| 74 | #define MPP9_UNUSED MPP(9, 0x3, 0, 0, 1) | 74 | #define MPP9_UNUSED MPP(9, 0x3, 0, 0, 1) |
| 75 | 75 | ||
| 76 | #define MPP10_GPIO MPP(10, 0x0, 1, 1, 1) | 76 | #define MPP10_GPIO MPP(10, 0x0, 1, 1, 1) |
| 77 | #define MPP10_GE0_RXD6 MPP(10, 0x1, 1, 0, 1) | 77 | #define MPP10_GE0_RXD6 MPP(10, 0x1, 0, 0, 1) |
| 78 | #define MPP10_GE1_RXD2 MPP(10, 0x2, 1, 0, 1) | 78 | #define MPP10_GE1_RXD2 MPP(10, 0x2, 0, 0, 1) |
| 79 | #define MPP10_UNUSED MPP(10, 0x3, 0, 0, 1) | 79 | #define MPP10_UNUSED MPP(10, 0x3, 0, 0, 1) |
| 80 | 80 | ||
| 81 | #define MPP11_GPIO MPP(11, 0x0, 1, 1, 1) | 81 | #define MPP11_GPIO MPP(11, 0x0, 1, 1, 1) |
| 82 | #define MPP11_GE0_RXD7 MPP(11, 0x1, 1, 0, 1) | 82 | #define MPP11_GE0_RXD7 MPP(11, 0x1, 0, 0, 1) |
| 83 | #define MPP11_GE1_RXD3 MPP(11, 0x2, 1, 0, 1) | 83 | #define MPP11_GE1_RXD3 MPP(11, 0x2, 0, 0, 1) |
| 84 | #define MPP11_UNUSED MPP(11, 0x3, 0, 0, 1) | 84 | #define MPP11_UNUSED MPP(11, 0x3, 0, 0, 1) |
| 85 | 85 | ||
| 86 | #define MPP12_GPIO MPP(12, 0x0, 1, 1, 1) | 86 | #define MPP12_GPIO MPP(12, 0x0, 1, 1, 1) |
| 87 | #define MPP12_M_BB MPP(12, 0x3, 1, 0, 1) | 87 | #define MPP12_M_BB MPP(12, 0x3, 0, 0, 1) |
| 88 | #define MPP12_UA0_CTSn MPP(12, 0x4, 1, 0, 1) | 88 | #define MPP12_UA0_CTSn MPP(12, 0x4, 0, 0, 1) |
| 89 | #define MPP12_NAND_FLASH_REn0 MPP(12, 0x5, 0, 1, 1) | 89 | #define MPP12_NAND_FLASH_REn0 MPP(12, 0x5, 0, 0, 1) |
| 90 | #define MPP12_TDM0_SCSn MPP(12, 0X6, 0, 1, 1) | 90 | #define MPP12_TDM0_SCSn MPP(12, 0X6, 0, 0, 1) |
| 91 | #define MPP12_UNUSED MPP(12, 0x1, 0, 0, 1) | 91 | #define MPP12_UNUSED MPP(12, 0x1, 0, 0, 1) |
| 92 | 92 | ||
| 93 | #define MPP13_GPIO MPP(13, 0x0, 1, 1, 1) | 93 | #define MPP13_GPIO MPP(13, 0x0, 1, 1, 1) |
| 94 | #define MPP13_SYSRST_OUTn MPP(13, 0x3, 0, 1, 1) | 94 | #define MPP13_SYSRST_OUTn MPP(13, 0x3, 0, 0, 1) |
| 95 | #define MPP13_UA0_RTSn MPP(13, 0x4, 0, 1, 1) | 95 | #define MPP13_UA0_RTSn MPP(13, 0x4, 0, 0, 1) |
| 96 | #define MPP13_NAN_FLASH_WEn0 MPP(13, 0x5, 0, 1, 1) | 96 | #define MPP13_NAN_FLASH_WEn0 MPP(13, 0x5, 0, 0, 1) |
| 97 | #define MPP13_TDM_SCLK MPP(13, 0x6, 0, 1, 1) | 97 | #define MPP13_TDM_SCLK MPP(13, 0x6, 0, 0, 1) |
| 98 | #define MPP13_UNUSED MPP(13, 0x1, 0, 0, 1) | 98 | #define MPP13_UNUSED MPP(13, 0x1, 0, 0, 1) |
| 99 | 99 | ||
| 100 | #define MPP14_GPIO MPP(14, 0x0, 1, 1, 1) | 100 | #define MPP14_GPIO MPP(14, 0x0, 1, 1, 1) |
| 101 | #define MPP14_SATA1_ACTn MPP(14, 0x3, 0, 1, 1) | 101 | #define MPP14_SATA1_ACTn MPP(14, 0x3, 0, 0, 1) |
| 102 | #define MPP14_UA1_CTSn MPP(14, 0x4, 1, 0, 1) | 102 | #define MPP14_UA1_CTSn MPP(14, 0x4, 0, 0, 1) |
| 103 | #define MPP14_NAND_FLASH_REn1 MPP(14, 0x5, 0, 1, 1) | 103 | #define MPP14_NAND_FLASH_REn1 MPP(14, 0x5, 0, 0, 1) |
| 104 | #define MPP14_TDM_SMOSI MPP(14, 0x6, 0, 1, 1) | 104 | #define MPP14_TDM_SMOSI MPP(14, 0x6, 0, 0, 1) |
| 105 | #define MPP14_UNUSED MPP(14, 0x1, 0, 0, 1) | 105 | #define MPP14_UNUSED MPP(14, 0x1, 0, 0, 1) |
| 106 | 106 | ||
| 107 | #define MPP15_GPIO MPP(15, 0x0, 1, 1, 1) | 107 | #define MPP15_GPIO MPP(15, 0x0, 1, 1, 1) |
| 108 | #define MPP15_SATA0_ACTn MPP(15, 0x3, 0, 1, 1) | 108 | #define MPP15_SATA0_ACTn MPP(15, 0x3, 0, 0, 1) |
| 109 | #define MPP15_UA1_RTSn MPP(15, 0x4, 0, 1, 1) | 109 | #define MPP15_UA1_RTSn MPP(15, 0x4, 0, 0, 1) |
| 110 | #define MPP15_NAND_FLASH_WEn1 MPP(15, 0x5, 0, 1, 1) | 110 | #define MPP15_NAND_FLASH_WEn1 MPP(15, 0x5, 0, 0, 1) |
| 111 | #define MPP15_TDM_SMISO MPP(15, 0x6, 1, 0, 1) | 111 | #define MPP15_TDM_SMISO MPP(15, 0x6, 0, 0, 1) |
| 112 | #define MPP15_UNUSED MPP(15, 0x1, 0, 0, 1) | 112 | #define MPP15_UNUSED MPP(15, 0x1, 0, 0, 1) |
| 113 | 113 | ||
| 114 | #define MPP16_GPIO MPP(16, 0x0, 1, 1, 1) | 114 | #define MPP16_GPIO MPP(16, 0x0, 1, 1, 1) |
| 115 | #define MPP16_SATA1_PRESENTn MPP(16, 0x3, 0, 1, 1) | 115 | #define MPP16_SATA1_PRESENTn MPP(16, 0x3, 0, 0, 1) |
| 116 | #define MPP16_UA2_TXD MPP(16, 0x4, 0, 1, 1) | 116 | #define MPP16_UA2_TXD MPP(16, 0x4, 0, 0, 1) |
| 117 | #define MPP16_NAND_FLASH_REn3 MPP(16, 0x5, 0, 1, 1) | 117 | #define MPP16_NAND_FLASH_REn3 MPP(16, 0x5, 0, 0, 1) |
| 118 | #define MPP16_TDM_INTn MPP(16, 0x6, 1, 0, 1) | 118 | #define MPP16_TDM_INTn MPP(16, 0x6, 0, 0, 1) |
| 119 | #define MPP16_UNUSED MPP(16, 0x1, 0, 0, 1) | 119 | #define MPP16_UNUSED MPP(16, 0x1, 0, 0, 1) |
| 120 | 120 | ||
| 121 | 121 | ||
| 122 | #define MPP17_GPIO MPP(17, 0x0, 1, 1, 1) | 122 | #define MPP17_GPIO MPP(17, 0x0, 1, 1, 1) |
| 123 | #define MPP17_SATA0_PRESENTn MPP(17, 0x3, 0, 1, 1) | 123 | #define MPP17_SATA0_PRESENTn MPP(17, 0x3, 0, 0, 1) |
| 124 | #define MPP17_UA2_RXD MPP(17, 0x4, 1, 0, 1) | 124 | #define MPP17_UA2_RXD MPP(17, 0x4, 0, 0, 1) |
| 125 | #define MPP17_NAND_FLASH_WEn3 MPP(17, 0x5, 0, 1, 1) | 125 | #define MPP17_NAND_FLASH_WEn3 MPP(17, 0x5, 0, 0, 1) |
| 126 | #define MPP17_TDM_RSTn MPP(17, 0x6, 0, 1, 1) | 126 | #define MPP17_TDM_RSTn MPP(17, 0x6, 0, 0, 1) |
| 127 | #define MPP17_UNUSED MPP(17, 0x1, 0, 0, 1) | 127 | #define MPP17_UNUSED MPP(17, 0x1, 0, 0, 1) |
| 128 | 128 | ||
| 129 | 129 | ||
| 130 | #define MPP18_GPIO MPP(18, 0x0, 1, 1, 1) | 130 | #define MPP18_GPIO MPP(18, 0x0, 1, 1, 1) |
| 131 | #define MPP18_UA0_CTSn MPP(18, 0x4, 1, 0, 1) | 131 | #define MPP18_UA0_CTSn MPP(18, 0x4, 0, 0, 1) |
| 132 | #define MPP18_BOOT_FLASH_REn MPP(18, 0x5, 0, 1, 1) | 132 | #define MPP18_BOOT_FLASH_REn MPP(18, 0x5, 0, 0, 1) |
| 133 | #define MPP18_UNUSED MPP(18, 0x1, 0, 0, 1) | 133 | #define MPP18_UNUSED MPP(18, 0x1, 0, 0, 1) |
| 134 | 134 | ||
| 135 | 135 | ||
| 136 | 136 | ||
| 137 | #define MPP19_GPIO MPP(19, 0x0, 1, 1, 1) | 137 | #define MPP19_GPIO MPP(19, 0x0, 1, 1, 1) |
| 138 | #define MPP19_UA0_CTSn MPP(19, 0x4, 0, 1, 1) | 138 | #define MPP19_UA0_CTSn MPP(19, 0x4, 0, 0, 1) |
| 139 | #define MPP19_BOOT_FLASH_WEn MPP(19, 0x5, 0, 1, 1) | 139 | #define MPP19_BOOT_FLASH_WEn MPP(19, 0x5, 0, 0, 1) |
| 140 | #define MPP19_UNUSED MPP(19, 0x1, 0, 0, 1) | 140 | #define MPP19_UNUSED MPP(19, 0x1, 0, 0, 1) |
| 141 | 141 | ||
| 142 | 142 | ||
| 143 | #define MPP20_GPIO MPP(20, 0x0, 1, 1, 1) | 143 | #define MPP20_GPIO MPP(20, 0x0, 1, 1, 1) |
| 144 | #define MPP20_UA1_CTSs MPP(20, 0x4, 1, 0, 1) | 144 | #define MPP20_UA1_CTSs MPP(20, 0x4, 0, 0, 1) |
| 145 | #define MPP20_TDM_PCLK MPP(20, 0x6, 1, 1, 0) | 145 | #define MPP20_TDM_PCLK MPP(20, 0x6, 0, 0, 0) |
| 146 | #define MPP20_UNUSED MPP(20, 0x1, 0, 0, 1) | 146 | #define MPP20_UNUSED MPP(20, 0x1, 0, 0, 1) |
| 147 | 147 | ||
| 148 | 148 | ||
| 149 | 149 | ||
| 150 | #define MPP21_GPIO MPP(21, 0x0, 1, 1, 1) | 150 | #define MPP21_GPIO MPP(21, 0x0, 1, 1, 1) |
| 151 | #define MPP21_UA1_CTSs MPP(21, 0x4, 0, 1, 1) | 151 | #define MPP21_UA1_CTSs MPP(21, 0x4, 0, 0, 1) |
| 152 | #define MPP21_TDM_FSYNC MPP(21, 0x6, 1, 1, 0) | 152 | #define MPP21_TDM_FSYNC MPP(21, 0x6, 0, 0, 0) |
| 153 | #define MPP21_UNUSED MPP(21, 0x1, 0, 0, 1) | 153 | #define MPP21_UNUSED MPP(21, 0x1, 0, 0, 1) |
| 154 | 154 | ||
| 155 | 155 | ||
| 156 | 156 | ||
| 157 | #define MPP22_GPIO MPP(22, 0x0, 1, 1, 1) | 157 | #define MPP22_GPIO MPP(22, 0x0, 1, 1, 1) |
| 158 | #define MPP22_UA3_TDX MPP(22, 0x4, 0, 1, 1) | 158 | #define MPP22_UA3_TDX MPP(22, 0x4, 0, 0, 1) |
| 159 | #define MPP22_NAND_FLASH_REn2 MPP(22, 0x5, 0, 1, 1) | 159 | #define MPP22_NAND_FLASH_REn2 MPP(22, 0x5, 0, 0, 1) |
| 160 | #define MPP22_TDM_DRX MPP(22, 0x6, 1, 0, 1) | 160 | #define MPP22_TDM_DRX MPP(22, 0x6, 0, 0, 1) |
| 161 | #define MPP22_UNUSED MPP(22, 0x1, 0, 0, 1) | 161 | #define MPP22_UNUSED MPP(22, 0x1, 0, 0, 1) |
| 162 | 162 | ||
| 163 | 163 | ||
| 164 | 164 | ||
| 165 | #define MPP23_GPIO MPP(23, 0x0, 1, 1, 1) | 165 | #define MPP23_GPIO MPP(23, 0x0, 1, 1, 1) |
| 166 | #define MPP23_UA3_RDX MPP(23, 0x4, 1, 0, 1) | 166 | #define MPP23_UA3_RDX MPP(23, 0x4, 0, 0, 1) |
| 167 | #define MPP23_NAND_FLASH_WEn2 MPP(23, 0x5, 0, 1, 1) | 167 | #define MPP23_NAND_FLASH_WEn2 MPP(23, 0x5, 0, 0, 1) |
| 168 | #define MPP23_TDM_DTX MPP(23, 0x6, 0, 1, 1) | 168 | #define MPP23_TDM_DTX MPP(23, 0x6, 0, 0, 1) |
| 169 | #define MPP23_UNUSED MPP(23, 0x1, 0, 0, 1) | 169 | #define MPP23_UNUSED MPP(23, 0x1, 0, 0, 1) |
| 170 | 170 | ||
| 171 | 171 | ||
| 172 | #define MPP24_GPIO MPP(24, 0x0, 1, 1, 1) | 172 | #define MPP24_GPIO MPP(24, 0x0, 1, 1, 1) |
| 173 | #define MPP24_UA2_TXD MPP(24, 0x4, 0, 1, 1) | 173 | #define MPP24_UA2_TXD MPP(24, 0x4, 0, 0, 1) |
| 174 | #define MPP24_TDM_INTn MPP(24, 0x6, 1, 0, 1) | 174 | #define MPP24_TDM_INTn MPP(24, 0x6, 0, 0, 1) |
| 175 | #define MPP24_UNUSED MPP(24, 0x1, 0, 0, 1) | 175 | #define MPP24_UNUSED MPP(24, 0x1, 0, 0, 1) |
| 176 | 176 | ||
| 177 | 177 | ||
| 178 | #define MPP25_GPIO MPP(25, 0x0, 1, 1, 1) | 178 | #define MPP25_GPIO MPP(25, 0x0, 1, 1, 1) |
| 179 | #define MPP25_UA2_RXD MPP(25, 0x4, 1, 0, 1) | 179 | #define MPP25_UA2_RXD MPP(25, 0x4, 0, 0, 1) |
| 180 | #define MPP25_TDM_RSTn MPP(25, 0x6, 0, 1, 1) | 180 | #define MPP25_TDM_RSTn MPP(25, 0x6, 0, 0, 1) |
| 181 | #define MPP25_UNUSED MPP(25, 0x1, 0, 0, 1) | 181 | #define MPP25_UNUSED MPP(25, 0x1, 0, 0, 1) |
| 182 | 182 | ||
| 183 | 183 | ||
| 184 | #define MPP26_GPIO MPP(26, 0x0, 1, 1, 1) | 184 | #define MPP26_GPIO MPP(26, 0x0, 1, 1, 1) |
| 185 | #define MPP26_UA2_CTSn MPP(26, 0x4, 1, 0, 1) | 185 | #define MPP26_UA2_CTSn MPP(26, 0x4, 0, 0, 1) |
| 186 | #define MPP26_TDM_PCLK MPP(26, 0x6, 1, 1, 1) | 186 | #define MPP26_TDM_PCLK MPP(26, 0x6, 0, 0, 1) |
| 187 | #define MPP26_UNUSED MPP(26, 0x1, 0, 0, 1) | 187 | #define MPP26_UNUSED MPP(26, 0x1, 0, 0, 1) |
| 188 | 188 | ||
| 189 | 189 | ||
| 190 | #define MPP27_GPIO MPP(27, 0x0, 1, 1, 1) | 190 | #define MPP27_GPIO MPP(27, 0x0, 1, 1, 1) |
| 191 | #define MPP27_UA2_RTSn MPP(27, 0x4, 0, 1, 1) | 191 | #define MPP27_UA2_RTSn MPP(27, 0x4, 0, 0, 1) |
| 192 | #define MPP27_TDM_FSYNC MPP(27, 0x6, 1, 1, 1) | 192 | #define MPP27_TDM_FSYNC MPP(27, 0x6, 0, 0, 1) |
| 193 | #define MPP27_UNUSED MPP(27, 0x1, 0, 0, 1) | 193 | #define MPP27_UNUSED MPP(27, 0x1, 0, 0, 1) |
| 194 | 194 | ||
| 195 | 195 | ||
| 196 | #define MPP28_GPIO MPP(28, 0x0, 1, 1, 1) | 196 | #define MPP28_GPIO MPP(28, 0x0, 1, 1, 1) |
| 197 | #define MPP28_UA3_TXD MPP(28, 0x4, 0, 1, 1) | 197 | #define MPP28_UA3_TXD MPP(28, 0x4, 0, 0, 1) |
| 198 | #define MPP28_TDM_DRX MPP(28, 0x6, 1, 0, 1) | 198 | #define MPP28_TDM_DRX MPP(28, 0x6, 0, 0, 1) |
| 199 | #define MPP28_UNUSED MPP(28, 0x1, 0, 0, 1) | 199 | #define MPP28_UNUSED MPP(28, 0x1, 0, 0, 1) |
| 200 | 200 | ||
| 201 | #define MPP29_GPIO MPP(29, 0x0, 1, 1, 1) | 201 | #define MPP29_GPIO MPP(29, 0x0, 1, 1, 1) |
| 202 | #define MPP29_UA3_RXD MPP(29, 0x4, 1, 0, 1) | 202 | #define MPP29_UA3_RXD MPP(29, 0x4, 0, 0, 1) |
| 203 | #define MPP29_SYSRST_OUTn MPP(29, 0x5, 0, 1, 1) | 203 | #define MPP29_SYSRST_OUTn MPP(29, 0x5, 0, 0, 1) |
| 204 | #define MPP29_TDM_DTX MPP(29, 0x6, 0, 1, 1) | 204 | #define MPP29_TDM_DTX MPP(29, 0x6, 0, 0, 1) |
| 205 | #define MPP29_UNUSED MPP(29, 0x1, 0, 0, 1) | 205 | #define MPP29_UNUSED MPP(29, 0x1, 0, 0, 1) |
| 206 | 206 | ||
| 207 | #define MPP30_GPIO MPP(30, 0x0, 1, 1, 1) | 207 | #define MPP30_GPIO MPP(30, 0x0, 1, 1, 1) |
| 208 | #define MPP30_UA3_CTSn MPP(30, 0x4, 1, 0, 1) | 208 | #define MPP30_UA3_CTSn MPP(30, 0x4, 0, 0, 1) |
| 209 | #define MPP30_UNUSED MPP(30, 0x1, 0, 0, 1) | 209 | #define MPP30_UNUSED MPP(30, 0x1, 0, 0, 1) |
| 210 | 210 | ||
| 211 | #define MPP31_GPIO MPP(31, 0x0, 1, 1, 1) | 211 | #define MPP31_GPIO MPP(31, 0x0, 1, 1, 1) |
| 212 | #define MPP31_UA3_RTSn MPP(31, 0x4, 0, 1, 1) | 212 | #define MPP31_UA3_RTSn MPP(31, 0x4, 0, 0, 1) |
| 213 | #define MPP31_TDM1_SCSn MPP(31, 0x6, 0, 1, 1) | 213 | #define MPP31_TDM1_SCSn MPP(31, 0x6, 0, 0, 1) |
| 214 | #define MPP31_UNUSED MPP(31, 0x1, 0, 0, 1) | 214 | #define MPP31_UNUSED MPP(31, 0x1, 0, 0, 1) |
| 215 | 215 | ||
| 216 | 216 | ||
| 217 | #define MPP32_GPIO MPP(32, 0x1, 1, 1, 1) | 217 | #define MPP32_GPIO MPP(32, 0x1, 1, 1, 1) |
| 218 | #define MPP32_UA3_TDX MPP(32, 0x4, 0, 1, 1) | 218 | #define MPP32_UA3_TDX MPP(32, 0x4, 0, 0, 1) |
| 219 | #define MPP32_SYSRST_OUTn MPP(32, 0x5, 0, 1, 1) | 219 | #define MPP32_SYSRST_OUTn MPP(32, 0x5, 0, 0, 1) |
| 220 | #define MPP32_TDM0_RXQ MPP(32, 0x6, 0, 1, 1) | 220 | #define MPP32_TDM0_RXQ MPP(32, 0x6, 0, 0, 1) |
| 221 | #define MPP32_UNUSED MPP(32, 0x3, 0, 0, 1) | 221 | #define MPP32_UNUSED MPP(32, 0x3, 0, 0, 1) |
| 222 | 222 | ||
| 223 | 223 | ||
| 224 | #define MPP33_GPIO MPP(33, 0x1, 1, 1, 1) | 224 | #define MPP33_GPIO MPP(33, 0x1, 1, 1, 1) |
| 225 | #define MPP33_UA3_RDX MPP(33, 0x4, 1, 0, 1) | 225 | #define MPP33_UA3_RDX MPP(33, 0x4, 0, 0, 1) |
| 226 | #define MPP33_TDM0_TXQ MPP(33, 0x6, 0, 1, 1) | 226 | #define MPP33_TDM0_TXQ MPP(33, 0x6, 0, 0, 1) |
| 227 | #define MPP33_UNUSED MPP(33, 0x3, 0, 0, 1) | 227 | #define MPP33_UNUSED MPP(33, 0x3, 0, 0, 1) |
| 228 | 228 | ||
| 229 | 229 | ||
| 230 | 230 | ||
| 231 | #define MPP34_GPIO MPP(34, 0x1, 1, 1, 1) | 231 | #define MPP34_GPIO MPP(34, 0x1, 1, 1, 1) |
| 232 | #define MPP34_UA2_TDX MPP(34, 0x4, 0, 1, 1) | 232 | #define MPP34_UA2_TDX MPP(34, 0x4, 0, 0, 1) |
| 233 | #define MPP34_TDM1_RXQ MPP(34, 0x6, 0, 1, 1) | 233 | #define MPP34_TDM1_RXQ MPP(34, 0x6, 0, 0, 1) |
| 234 | #define MPP34_UNUSED MPP(34, 0x3, 0, 0, 1) | 234 | #define MPP34_UNUSED MPP(34, 0x3, 0, 0, 1) |
| 235 | 235 | ||
| 236 | 236 | ||
| 237 | 237 | ||
| 238 | #define MPP35_GPIO MPP(35, 0x1, 1, 1, 1) | 238 | #define MPP35_GPIO MPP(35, 0x1, 1, 1, 1) |
| 239 | #define MPP35_UA2_RDX MPP(35, 0x4, 1, 0, 1) | 239 | #define MPP35_UA2_RDX MPP(35, 0x4, 0, 0, 1) |
| 240 | #define MPP35_TDM1_TXQ MPP(35, 0x6, 0, 1, 1) | 240 | #define MPP35_TDM1_TXQ MPP(35, 0x6, 0, 0, 1) |
| 241 | #define MPP35_UNUSED MPP(35, 0x3, 0, 0, 1) | 241 | #define MPP35_UNUSED MPP(35, 0x3, 0, 0, 1) |
| 242 | 242 | ||
| 243 | #define MPP36_GPIO MPP(36, 0x1, 1, 1, 1) | 243 | #define MPP36_GPIO MPP(36, 0x1, 1, 1, 1) |
| 244 | #define MPP36_UA0_CTSn MPP(36, 0x2, 1, 0, 1) | 244 | #define MPP36_UA0_CTSn MPP(36, 0x2, 0, 0, 1) |
| 245 | #define MPP36_UA2_TDX MPP(36, 0x4, 0, 1, 1) | 245 | #define MPP36_UA2_TDX MPP(36, 0x4, 0, 0, 1) |
| 246 | #define MPP36_TDM0_SCSn MPP(36, 0x6, 0, 1, 1) | 246 | #define MPP36_TDM0_SCSn MPP(36, 0x6, 0, 0, 1) |
| 247 | #define MPP36_UNUSED MPP(36, 0x3, 0, 0, 1) | 247 | #define MPP36_UNUSED MPP(36, 0x3, 0, 0, 1) |
| 248 | 248 | ||
| 249 | 249 | ||
| 250 | #define MPP37_GPIO MPP(37, 0x1, 1, 1, 1) | 250 | #define MPP37_GPIO MPP(37, 0x1, 1, 1, 1) |
| 251 | #define MPP37_UA0_RTSn MPP(37, 0x2, 0, 1, 1) | 251 | #define MPP37_UA0_RTSn MPP(37, 0x2, 0, 0, 1) |
| 252 | #define MPP37_UA2_RXD MPP(37, 0x4, 1, 0, 1) | 252 | #define MPP37_UA2_RXD MPP(37, 0x4, 0, 0, 1) |
| 253 | #define MPP37_SYSRST_OUTn MPP(37, 0x5, 0, 1, 1) | 253 | #define MPP37_SYSRST_OUTn MPP(37, 0x5, 0, 0, 1) |
| 254 | #define MPP37_TDM_SCLK MPP(37, 0x6, 0, 1, 1) | 254 | #define MPP37_TDM_SCLK MPP(37, 0x6, 0, 0, 1) |
| 255 | #define MPP37_UNUSED MPP(37, 0x3, 0, 0, 1) | 255 | #define MPP37_UNUSED MPP(37, 0x3, 0, 0, 1) |
| 256 | 256 | ||
| 257 | 257 | ||
| 258 | 258 | ||
| 259 | 259 | ||
| 260 | #define MPP38_GPIO MPP(38, 0x1, 1, 1, 1) | 260 | #define MPP38_GPIO MPP(38, 0x1, 1, 1, 1) |
| 261 | #define MPP38_UA1_CTSn MPP(38, 0x2, 1, 0, 1) | 261 | #define MPP38_UA1_CTSn MPP(38, 0x2, 0, 0, 1) |
| 262 | #define MPP38_UA3_TXD MPP(38, 0x4, 0, 1, 1) | 262 | #define MPP38_UA3_TXD MPP(38, 0x4, 0, 0, 1) |
| 263 | #define MPP38_SYSRST_OUTn MPP(38, 0x5, 0, 1, 1) | 263 | #define MPP38_SYSRST_OUTn MPP(38, 0x5, 0, 0, 1) |
| 264 | #define MPP38_TDM_SMOSI MPP(38, 0x6, 0, 1, 1) | 264 | #define MPP38_TDM_SMOSI MPP(38, 0x6, 0, 0, 1) |
| 265 | #define MPP38_UNUSED MPP(38, 0x3, 0, 0, 1) | 265 | #define MPP38_UNUSED MPP(38, 0x3, 0, 0, 1) |
| 266 | 266 | ||
| 267 | 267 | ||
| 268 | 268 | ||
| 269 | 269 | ||
| 270 | #define MPP39_GPIO MPP(39, 0x1, 1, 1, 1) | 270 | #define MPP39_GPIO MPP(39, 0x1, 1, 1, 1) |
| 271 | #define MPP39_UA1_RTSn MPP(39, 0x2, 0, 1, 1) | 271 | #define MPP39_UA1_RTSn MPP(39, 0x2, 0, 0, 1) |
| 272 | #define MPP39_UA3_RXD MPP(39, 0x4, 1, 0, 1) | 272 | #define MPP39_UA3_RXD MPP(39, 0x4, 0, 0, 1) |
| 273 | #define MPP39_SYSRST_OUTn MPP(39, 0x5, 0, 1, 1) | 273 | #define MPP39_SYSRST_OUTn MPP(39, 0x5, 0, 0, 1) |
| 274 | #define MPP39_TDM_SMISO MPP(39, 0x6, 1, 0, 1) | 274 | #define MPP39_TDM_SMISO MPP(39, 0x6, 0, 0, 1) |
| 275 | #define MPP39_UNUSED MPP(39, 0x3, 0, 0, 1) | 275 | #define MPP39_UNUSED MPP(39, 0x3, 0, 0, 1) |
| 276 | 276 | ||
| 277 | 277 | ||
| 278 | 278 | ||
| 279 | #define MPP40_GPIO MPP(40, 0x1, 1, 1, 1) | 279 | #define MPP40_GPIO MPP(40, 0x1, 1, 1, 1) |
| 280 | #define MPP40_TDM_INTn MPP(40, 0x6, 1, 0, 1) | 280 | #define MPP40_TDM_INTn MPP(40, 0x6, 0, 0, 1) |
| 281 | #define MPP40_UNUSED MPP(40, 0x0, 0, 0, 1) | 281 | #define MPP40_UNUSED MPP(40, 0x0, 0, 0, 1) |
| 282 | 282 | ||
| 283 | 283 | ||
| 284 | 284 | ||
| 285 | #define MPP41_GPIO MPP(41, 0x1, 1, 1, 1) | 285 | #define MPP41_GPIO MPP(41, 0x1, 1, 1, 1) |
| 286 | #define MPP41_TDM_RSTn MPP(41, 0x6, 0, 1, 1) | 286 | #define MPP41_TDM_RSTn MPP(41, 0x6, 0, 0, 1) |
| 287 | #define MPP41_UNUSED MPP(41, 0x0, 0, 0, 1) | 287 | #define MPP41_UNUSED MPP(41, 0x0, 0, 0, 1) |
| 288 | 288 | ||
| 289 | 289 | ||
| 290 | 290 | ||
| 291 | #define MPP42_GPIO MPP(42, 0x1, 1, 1, 1) | 291 | #define MPP42_GPIO MPP(42, 0x1, 1, 1, 1) |
| 292 | #define MPP42_TDM_PCLK MPP(42, 0x6, 1, 1, 1) | 292 | #define MPP42_TDM_PCLK MPP(42, 0x6, 0, 0, 1) |
| 293 | #define MPP42_UNUSED MPP(42, 0x0, 0, 0, 1) | 293 | #define MPP42_UNUSED MPP(42, 0x0, 0, 0, 1) |
| 294 | 294 | ||
| 295 | 295 | ||
| 296 | 296 | ||
| 297 | #define MPP43_GPIO MPP(43, 0x1, 1, 1, 1) | 297 | #define MPP43_GPIO MPP(43, 0x1, 1, 1, 1) |
| 298 | #define MPP43_TDM_FSYNC MPP(43, 0x6, 1, 1, 1) | 298 | #define MPP43_TDM_FSYNC MPP(43, 0x6, 0, 0, 1) |
| 299 | #define MPP43_UNUSED MPP(43, 0x0, 0, 0, 1) | 299 | #define MPP43_UNUSED MPP(43, 0x0, 0, 0, 1) |
| 300 | 300 | ||
| 301 | 301 | ||
| 302 | 302 | ||
| 303 | #define MPP44_GPIO MPP(44, 0x1, 1, 1, 1) | 303 | #define MPP44_GPIO MPP(44, 0x1, 1, 1, 1) |
| 304 | #define MPP44_TDM_DRX MPP(44, 0x6, 1, 0, 1) | 304 | #define MPP44_TDM_DRX MPP(44, 0x6, 0, 0, 1) |
| 305 | #define MPP44_UNUSED MPP(44, 0x0, 0, 0, 1) | 305 | #define MPP44_UNUSED MPP(44, 0x0, 0, 0, 1) |
| 306 | 306 | ||
| 307 | 307 | ||
| 308 | 308 | ||
| 309 | #define MPP45_GPIO MPP(45, 0x1, 1, 1, 1) | 309 | #define MPP45_GPIO MPP(45, 0x1, 1, 1, 1) |
| 310 | #define MPP45_SATA0_ACTn MPP(45, 0x3, 0, 1, 1) | 310 | #define MPP45_SATA0_ACTn MPP(45, 0x3, 0, 0, 1) |
| 311 | #define MPP45_TDM_DRX MPP(45, 0x6, 0, 1, 1) | 311 | #define MPP45_TDM_DRX MPP(45, 0x6, 0, 0, 1) |
| 312 | #define MPP45_UNUSED MPP(45, 0x0, 0, 0, 1) | 312 | #define MPP45_UNUSED MPP(45, 0x0, 0, 0, 1) |
| 313 | 313 | ||
| 314 | 314 | ||
| 315 | #define MPP46_GPIO MPP(46, 0x1, 1, 1, 1) | 315 | #define MPP46_GPIO MPP(46, 0x1, 1, 1, 1) |
| 316 | #define MPP46_TDM_SCSn MPP(46, 0x6, 0, 1, 1) | 316 | #define MPP46_TDM_SCSn MPP(46, 0x6, 0, 0, 1) |
| 317 | #define MPP46_UNUSED MPP(46, 0x0, 0, 0, 1) | 317 | #define MPP46_UNUSED MPP(46, 0x0, 0, 0, 1) |
| 318 | 318 | ||
| 319 | 319 | ||
| @@ -323,14 +323,14 @@ | |||
| 323 | 323 | ||
| 324 | 324 | ||
| 325 | #define MPP48_GPIO MPP(48, 0x1, 1, 1, 1) | 325 | #define MPP48_GPIO MPP(48, 0x1, 1, 1, 1) |
| 326 | #define MPP48_SATA1_ACTn MPP(48, 0x3, 0, 1, 1) | 326 | #define MPP48_SATA1_ACTn MPP(48, 0x3, 0, 0, 1) |
| 327 | #define MPP48_UNUSED MPP(48, 0x2, 0, 0, 1) | 327 | #define MPP48_UNUSED MPP(48, 0x2, 0, 0, 1) |
| 328 | 328 | ||
| 329 | 329 | ||
| 330 | 330 | ||
| 331 | #define MPP49_GPIO MPP(49, 0x1, 1, 1, 1) | 331 | #define MPP49_GPIO MPP(49, 0x1, 1, 1, 1) |
| 332 | #define MPP49_SATA0_ACTn MPP(49, 0x3, 0, 1, 1) | 332 | #define MPP49_SATA0_ACTn MPP(49, 0x3, 0, 0, 1) |
| 333 | #define MPP49_M_BB MPP(49, 0x4, 1, 0, 1) | 333 | #define MPP49_M_BB MPP(49, 0x4, 0, 0, 1) |
| 334 | #define MPP49_UNUSED MPP(49, 0x2, 0, 0, 1) | 334 | #define MPP49_UNUSED MPP(49, 0x2, 0, 0, 1) |
| 335 | 335 | ||
| 336 | 336 | ||
diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile index fc9b238cbc19..bd76394ccaf8 100644 --- a/arch/arm/mach-omap2/Makefile +++ b/arch/arm/mach-omap2/Makefile | |||
| @@ -11,9 +11,9 @@ hwmod-common = omap_hwmod.o \ | |||
| 11 | omap_hwmod_common_data.o | 11 | omap_hwmod_common_data.o |
| 12 | clock-common = clock.o clock_common_data.o \ | 12 | clock-common = clock.o clock_common_data.o \ |
| 13 | clkt_dpll.o clkt_clksel.o | 13 | clkt_dpll.o clkt_clksel.o |
| 14 | secure-common = omap-smc.o omap-secure.o | 14 | secure-common = omap-smc.o omap-secure.o |
| 15 | 15 | ||
| 16 | obj-$(CONFIG_ARCH_OMAP2) += $(omap-2-3-common) $(hwmod-common) $(secure-common) | 16 | obj-$(CONFIG_ARCH_OMAP2) += $(omap-2-3-common) $(hwmod-common) |
| 17 | obj-$(CONFIG_ARCH_OMAP3) += $(omap-2-3-common) $(hwmod-common) $(secure-common) | 17 | obj-$(CONFIG_ARCH_OMAP3) += $(omap-2-3-common) $(hwmod-common) $(secure-common) |
| 18 | obj-$(CONFIG_ARCH_OMAP4) += prm44xx.o $(hwmod-common) $(secure-common) | 18 | obj-$(CONFIG_ARCH_OMAP4) += prm44xx.o $(hwmod-common) $(secure-common) |
| 19 | 19 | ||
diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c index 21fc87648660..4e9071589bfb 100644 --- a/arch/arm/mach-omap2/board-4430sdp.c +++ b/arch/arm/mach-omap2/board-4430sdp.c | |||
| @@ -814,7 +814,7 @@ static struct omap_dss_board_info sdp4430_dss_data = { | |||
| 814 | .default_device = &sdp4430_lcd_device, | 814 | .default_device = &sdp4430_lcd_device, |
| 815 | }; | 815 | }; |
| 816 | 816 | ||
| 817 | static void omap_4430sdp_display_init(void) | 817 | static void __init omap_4430sdp_display_init(void) |
| 818 | { | 818 | { |
| 819 | int r; | 819 | int r; |
| 820 | 820 | ||
| @@ -851,7 +851,7 @@ static struct omap_board_mux board_mux[] __initdata = { | |||
| 851 | #define board_mux NULL | 851 | #define board_mux NULL |
| 852 | #endif | 852 | #endif |
| 853 | 853 | ||
| 854 | static void omap4_sdp4430_wifi_mux_init(void) | 854 | static void __init omap4_sdp4430_wifi_mux_init(void) |
| 855 | { | 855 | { |
| 856 | omap_mux_init_gpio(GPIO_WIFI_IRQ, OMAP_PIN_INPUT | | 856 | omap_mux_init_gpio(GPIO_WIFI_IRQ, OMAP_PIN_INPUT | |
| 857 | OMAP_PIN_OFF_WAKEUPENABLE); | 857 | OMAP_PIN_OFF_WAKEUPENABLE); |
| @@ -878,12 +878,17 @@ static struct wl12xx_platform_data omap4_sdp4430_wlan_data __initdata = { | |||
| 878 | .board_tcxo_clock = WL12XX_TCXOCLOCK_26, | 878 | .board_tcxo_clock = WL12XX_TCXOCLOCK_26, |
| 879 | }; | 879 | }; |
| 880 | 880 | ||
| 881 | static void omap4_sdp4430_wifi_init(void) | 881 | static void __init omap4_sdp4430_wifi_init(void) |
| 882 | { | 882 | { |
| 883 | int ret; | ||
| 884 | |||
| 883 | omap4_sdp4430_wifi_mux_init(); | 885 | omap4_sdp4430_wifi_mux_init(); |
| 884 | if (wl12xx_set_platform_data(&omap4_sdp4430_wlan_data)) | 886 | ret = wl12xx_set_platform_data(&omap4_sdp4430_wlan_data); |
| 885 | pr_err("Error setting wl12xx data\n"); | 887 | if (ret) |
| 886 | platform_device_register(&omap_vwlan_device); | 888 | pr_err("Error setting wl12xx data: %d\n", ret); |
| 889 | ret = platform_device_register(&omap_vwlan_device); | ||
| 890 | if (ret) | ||
| 891 | pr_err("Error registering wl12xx device: %d\n", ret); | ||
| 887 | } | 892 | } |
| 888 | 893 | ||
| 889 | static void __init omap_4430sdp_init(void) | 894 | static void __init omap_4430sdp_init(void) |
diff --git a/arch/arm/mach-omap2/board-cm-t35.c b/arch/arm/mach-omap2/board-cm-t35.c index e921e3be24a4..d73316ed4207 100644 --- a/arch/arm/mach-omap2/board-cm-t35.c +++ b/arch/arm/mach-omap2/board-cm-t35.c | |||
| @@ -437,7 +437,7 @@ static struct usbhs_omap_board_data usbhs_bdata __initdata = { | |||
| 437 | .reset_gpio_port[2] = -EINVAL | 437 | .reset_gpio_port[2] = -EINVAL |
| 438 | }; | 438 | }; |
| 439 | 439 | ||
| 440 | static void cm_t35_init_usbh(void) | 440 | static void __init cm_t35_init_usbh(void) |
| 441 | { | 441 | { |
| 442 | int err; | 442 | int err; |
| 443 | 443 | ||
diff --git a/arch/arm/mach-omap2/board-generic.c b/arch/arm/mach-omap2/board-generic.c index d58756060483..ad497620539b 100644 --- a/arch/arm/mach-omap2/board-generic.c +++ b/arch/arm/mach-omap2/board-generic.c | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | #include <linux/i2c/twl.h> | 17 | #include <linux/i2c/twl.h> |
| 18 | 18 | ||
| 19 | #include <mach/hardware.h> | 19 | #include <mach/hardware.h> |
| 20 | #include <asm/hardware/gic.h> | ||
| 20 | #include <asm/mach/arch.h> | 21 | #include <asm/mach/arch.h> |
| 21 | 22 | ||
| 22 | #include <plat/board.h> | 23 | #include <plat/board.h> |
| @@ -102,6 +103,7 @@ DT_MACHINE_START(OMAP242X_DT, "Generic OMAP2420 (Flattened Device Tree)") | |||
| 102 | .map_io = omap242x_map_io, | 103 | .map_io = omap242x_map_io, |
| 103 | .init_early = omap2420_init_early, | 104 | .init_early = omap2420_init_early, |
| 104 | .init_irq = omap2_init_irq, | 105 | .init_irq = omap2_init_irq, |
| 106 | .handle_irq = omap2_intc_handle_irq, | ||
| 105 | .init_machine = omap_generic_init, | 107 | .init_machine = omap_generic_init, |
| 106 | .timer = &omap2_timer, | 108 | .timer = &omap2_timer, |
| 107 | .dt_compat = omap242x_boards_compat, | 109 | .dt_compat = omap242x_boards_compat, |
| @@ -141,6 +143,7 @@ DT_MACHINE_START(OMAP3_DT, "Generic OMAP3 (Flattened Device Tree)") | |||
| 141 | .map_io = omap3_map_io, | 143 | .map_io = omap3_map_io, |
| 142 | .init_early = omap3430_init_early, | 144 | .init_early = omap3430_init_early, |
| 143 | .init_irq = omap3_init_irq, | 145 | .init_irq = omap3_init_irq, |
| 146 | .handle_irq = omap3_intc_handle_irq, | ||
| 144 | .init_machine = omap3_init, | 147 | .init_machine = omap3_init, |
| 145 | .timer = &omap3_timer, | 148 | .timer = &omap3_timer, |
| 146 | .dt_compat = omap3_boards_compat, | 149 | .dt_compat = omap3_boards_compat, |
| @@ -160,6 +163,7 @@ DT_MACHINE_START(OMAP4_DT, "Generic OMAP4 (Flattened Device Tree)") | |||
| 160 | .map_io = omap4_map_io, | 163 | .map_io = omap4_map_io, |
| 161 | .init_early = omap4430_init_early, | 164 | .init_early = omap4430_init_early, |
| 162 | .init_irq = gic_init_irq, | 165 | .init_irq = gic_init_irq, |
| 166 | .handle_irq = gic_handle_irq, | ||
| 163 | .init_machine = omap4_init, | 167 | .init_machine = omap4_init, |
| 164 | .timer = &omap4_timer, | 168 | .timer = &omap4_timer, |
| 165 | .dt_compat = omap4_boards_compat, | 169 | .dt_compat = omap4_boards_compat, |
diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c index 003fe34c9343..c775bead1497 100644 --- a/arch/arm/mach-omap2/board-omap3evm.c +++ b/arch/arm/mach-omap2/board-omap3evm.c | |||
| @@ -617,6 +617,21 @@ static struct gpio omap3_evm_ehci_gpios[] __initdata = { | |||
| 617 | { OMAP3_EVM_EHCI_SELECT, GPIOF_OUT_INIT_LOW, "select EHCI port" }, | 617 | { OMAP3_EVM_EHCI_SELECT, GPIOF_OUT_INIT_LOW, "select EHCI port" }, |
| 618 | }; | 618 | }; |
| 619 | 619 | ||
| 620 | static void __init omap3_evm_wl12xx_init(void) | ||
| 621 | { | ||
| 622 | #ifdef CONFIG_WL12XX_PLATFORM_DATA | ||
| 623 | int ret; | ||
| 624 | |||
| 625 | /* WL12xx WLAN Init */ | ||
| 626 | ret = wl12xx_set_platform_data(&omap3evm_wlan_data); | ||
| 627 | if (ret) | ||
| 628 | pr_err("error setting wl12xx data: %d\n", ret); | ||
| 629 | ret = platform_device_register(&omap3evm_wlan_regulator); | ||
| 630 | if (ret) | ||
| 631 | pr_err("error registering wl12xx device: %d\n", ret); | ||
| 632 | #endif | ||
| 633 | } | ||
| 634 | |||
| 620 | static void __init omap3_evm_init(void) | 635 | static void __init omap3_evm_init(void) |
| 621 | { | 636 | { |
| 622 | omap3_evm_get_revision(); | 637 | omap3_evm_get_revision(); |
| @@ -665,13 +680,7 @@ static void __init omap3_evm_init(void) | |||
| 665 | omap_ads7846_init(1, OMAP3_EVM_TS_GPIO, 310, NULL); | 680 | omap_ads7846_init(1, OMAP3_EVM_TS_GPIO, 310, NULL); |
| 666 | omap3evm_init_smsc911x(); | 681 | omap3evm_init_smsc911x(); |
| 667 | omap3_evm_display_init(); | 682 | omap3_evm_display_init(); |
| 668 | 683 | omap3_evm_wl12xx_init(); | |
| 669 | #ifdef CONFIG_WL12XX_PLATFORM_DATA | ||
| 670 | /* WL12xx WLAN Init */ | ||
| 671 | if (wl12xx_set_platform_data(&omap3evm_wlan_data)) | ||
| 672 | pr_err("error setting wl12xx data\n"); | ||
| 673 | platform_device_register(&omap3evm_wlan_regulator); | ||
| 674 | #endif | ||
| 675 | } | 684 | } |
| 676 | 685 | ||
| 677 | MACHINE_START(OMAP3EVM, "OMAP3 EVM") | 686 | MACHINE_START(OMAP3EVM, "OMAP3 EVM") |
diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c index b7779c206a90..28fc271f7031 100644 --- a/arch/arm/mach-omap2/board-omap4panda.c +++ b/arch/arm/mach-omap2/board-omap4panda.c | |||
| @@ -488,13 +488,15 @@ void omap4_panda_display_init(void) | |||
| 488 | static void __init omap4_panda_init(void) | 488 | static void __init omap4_panda_init(void) |
| 489 | { | 489 | { |
| 490 | int package = OMAP_PACKAGE_CBS; | 490 | int package = OMAP_PACKAGE_CBS; |
| 491 | int ret; | ||
| 491 | 492 | ||
| 492 | if (omap_rev() == OMAP4430_REV_ES1_0) | 493 | if (omap_rev() == OMAP4430_REV_ES1_0) |
| 493 | package = OMAP_PACKAGE_CBL; | 494 | package = OMAP_PACKAGE_CBL; |
| 494 | omap4_mux_init(board_mux, NULL, package); | 495 | omap4_mux_init(board_mux, NULL, package); |
| 495 | 496 | ||
| 496 | if (wl12xx_set_platform_data(&omap_panda_wlan_data)) | 497 | ret = wl12xx_set_platform_data(&omap_panda_wlan_data); |
| 497 | pr_err("error setting wl12xx data\n"); | 498 | if (ret) |
| 499 | pr_err("error setting wl12xx data: %d\n", ret); | ||
| 498 | 500 | ||
| 499 | omap4_panda_i2c_init(); | 501 | omap4_panda_i2c_init(); |
| 500 | platform_add_devices(panda_devices, ARRAY_SIZE(panda_devices)); | 502 | platform_add_devices(panda_devices, ARRAY_SIZE(panda_devices)); |
diff --git a/arch/arm/mach-omap2/board-zoom-peripherals.c b/arch/arm/mach-omap2/board-zoom-peripherals.c index 8d7ce11cfeaf..c126461836ac 100644 --- a/arch/arm/mach-omap2/board-zoom-peripherals.c +++ b/arch/arm/mach-omap2/board-zoom-peripherals.c | |||
| @@ -296,8 +296,10 @@ static void enable_board_wakeup_source(void) | |||
| 296 | 296 | ||
| 297 | void __init zoom_peripherals_init(void) | 297 | void __init zoom_peripherals_init(void) |
| 298 | { | 298 | { |
| 299 | if (wl12xx_set_platform_data(&omap_zoom_wlan_data)) | 299 | int ret = wl12xx_set_platform_data(&omap_zoom_wlan_data); |
| 300 | pr_err("error setting wl12xx data\n"); | 300 | |
| 301 | if (ret) | ||
| 302 | pr_err("error setting wl12xx data: %d\n", ret); | ||
| 301 | 303 | ||
| 302 | omap_i2c_init(); | 304 | omap_i2c_init(); |
| 303 | platform_device_register(&omap_vwlan_device); | 305 | platform_device_register(&omap_vwlan_device); |
diff --git a/arch/arm/mach-omap2/hsmmc.c b/arch/arm/mach-omap2/hsmmc.c index ad0adb5a1e0e..b40c28895298 100644 --- a/arch/arm/mach-omap2/hsmmc.c +++ b/arch/arm/mach-omap2/hsmmc.c | |||
| @@ -293,8 +293,8 @@ static inline void omap_hsmmc_mux(struct omap_mmc_platform_data *mmc_controller, | |||
| 293 | } | 293 | } |
| 294 | } | 294 | } |
| 295 | 295 | ||
| 296 | static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c, | 296 | static int omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c, |
| 297 | struct omap_mmc_platform_data *mmc) | 297 | struct omap_mmc_platform_data *mmc) |
| 298 | { | 298 | { |
| 299 | char *hc_name; | 299 | char *hc_name; |
| 300 | 300 | ||
| @@ -430,7 +430,7 @@ static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c, | |||
| 430 | 430 | ||
| 431 | #define MAX_OMAP_MMC_HWMOD_NAME_LEN 16 | 431 | #define MAX_OMAP_MMC_HWMOD_NAME_LEN 16 |
| 432 | 432 | ||
| 433 | void __init omap_init_hsmmc(struct omap2_hsmmc_info *hsmmcinfo, int ctrl_nr) | 433 | void omap_init_hsmmc(struct omap2_hsmmc_info *hsmmcinfo, int ctrl_nr) |
| 434 | { | 434 | { |
| 435 | struct omap_hwmod *oh; | 435 | struct omap_hwmod *oh; |
| 436 | struct platform_device *pdev; | 436 | struct platform_device *pdev; |
| @@ -487,7 +487,7 @@ done: | |||
| 487 | kfree(mmc_data); | 487 | kfree(mmc_data); |
| 488 | } | 488 | } |
| 489 | 489 | ||
| 490 | void __init omap2_hsmmc_init(struct omap2_hsmmc_info *controllers) | 490 | void omap2_hsmmc_init(struct omap2_hsmmc_info *controllers) |
| 491 | { | 491 | { |
| 492 | u32 reg; | 492 | u32 reg; |
| 493 | 493 | ||
diff --git a/arch/arm/mach-omap2/mux.c b/arch/arm/mach-omap2/mux.c index e1cc75d1a57a..fb8bc9fa43b1 100644 --- a/arch/arm/mach-omap2/mux.c +++ b/arch/arm/mach-omap2/mux.c | |||
| @@ -100,8 +100,8 @@ void omap_mux_write_array(struct omap_mux_partition *partition, | |||
| 100 | 100 | ||
| 101 | static char *omap_mux_options; | 101 | static char *omap_mux_options; |
| 102 | 102 | ||
| 103 | static int __init _omap_mux_init_gpio(struct omap_mux_partition *partition, | 103 | static int _omap_mux_init_gpio(struct omap_mux_partition *partition, |
| 104 | int gpio, int val) | 104 | int gpio, int val) |
| 105 | { | 105 | { |
| 106 | struct omap_mux_entry *e; | 106 | struct omap_mux_entry *e; |
| 107 | struct omap_mux *gpio_mux = NULL; | 107 | struct omap_mux *gpio_mux = NULL; |
| @@ -145,7 +145,7 @@ static int __init _omap_mux_init_gpio(struct omap_mux_partition *partition, | |||
| 145 | return 0; | 145 | return 0; |
| 146 | } | 146 | } |
| 147 | 147 | ||
| 148 | int __init omap_mux_init_gpio(int gpio, int val) | 148 | int omap_mux_init_gpio(int gpio, int val) |
| 149 | { | 149 | { |
| 150 | struct omap_mux_partition *partition; | 150 | struct omap_mux_partition *partition; |
| 151 | int ret; | 151 | int ret; |
| @@ -159,9 +159,9 @@ int __init omap_mux_init_gpio(int gpio, int val) | |||
| 159 | return -ENODEV; | 159 | return -ENODEV; |
| 160 | } | 160 | } |
| 161 | 161 | ||
| 162 | static int __init _omap_mux_get_by_name(struct omap_mux_partition *partition, | 162 | static int _omap_mux_get_by_name(struct omap_mux_partition *partition, |
| 163 | const char *muxname, | 163 | const char *muxname, |
| 164 | struct omap_mux **found_mux) | 164 | struct omap_mux **found_mux) |
| 165 | { | 165 | { |
| 166 | struct omap_mux *mux = NULL; | 166 | struct omap_mux *mux = NULL; |
| 167 | struct omap_mux_entry *e; | 167 | struct omap_mux_entry *e; |
| @@ -240,7 +240,7 @@ omap_mux_get_by_name(const char *muxname, | |||
| 240 | return -ENODEV; | 240 | return -ENODEV; |
| 241 | } | 241 | } |
| 242 | 242 | ||
| 243 | int __init omap_mux_init_signal(const char *muxname, int val) | 243 | int omap_mux_init_signal(const char *muxname, int val) |
| 244 | { | 244 | { |
| 245 | struct omap_mux_partition *partition = NULL; | 245 | struct omap_mux_partition *partition = NULL; |
| 246 | struct omap_mux *mux = NULL; | 246 | struct omap_mux *mux = NULL; |
| @@ -1094,8 +1094,8 @@ static void omap_mux_init_package(struct omap_mux *superset, | |||
| 1094 | omap_mux_package_init_balls(package_balls, superset); | 1094 | omap_mux_package_init_balls(package_balls, superset); |
| 1095 | } | 1095 | } |
| 1096 | 1096 | ||
| 1097 | static void omap_mux_init_signals(struct omap_mux_partition *partition, | 1097 | static void __init omap_mux_init_signals(struct omap_mux_partition *partition, |
| 1098 | struct omap_board_mux *board_mux) | 1098 | struct omap_board_mux *board_mux) |
| 1099 | { | 1099 | { |
| 1100 | omap_mux_set_cmdline_signals(); | 1100 | omap_mux_set_cmdline_signals(); |
| 1101 | omap_mux_write_array(partition, board_mux); | 1101 | omap_mux_write_array(partition, board_mux); |
| @@ -1109,8 +1109,8 @@ static void omap_mux_init_package(struct omap_mux *superset, | |||
| 1109 | { | 1109 | { |
| 1110 | } | 1110 | } |
| 1111 | 1111 | ||
| 1112 | static void omap_mux_init_signals(struct omap_mux_partition *partition, | 1112 | static void __init omap_mux_init_signals(struct omap_mux_partition *partition, |
| 1113 | struct omap_board_mux *board_mux) | 1113 | struct omap_board_mux *board_mux) |
| 1114 | { | 1114 | { |
| 1115 | } | 1115 | } |
| 1116 | 1116 | ||
diff --git a/arch/arm/mach-omap2/omap-headsmp.S b/arch/arm/mach-omap2/omap-headsmp.S index b13ef7ef5ef4..503ac777a2ba 100644 --- a/arch/arm/mach-omap2/omap-headsmp.S +++ b/arch/arm/mach-omap2/omap-headsmp.S | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | #include <linux/linkage.h> | 18 | #include <linux/linkage.h> |
| 19 | #include <linux/init.h> | 19 | #include <linux/init.h> |
| 20 | 20 | ||
| 21 | __CPUINIT | ||
| 21 | /* | 22 | /* |
| 22 | * OMAP4 specific entry point for secondary CPU to jump from ROM | 23 | * OMAP4 specific entry point for secondary CPU to jump from ROM |
| 23 | * code. This routine also provides a holding flag into which | 24 | * code. This routine also provides a holding flag into which |
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index 5192cabb40ed..eba6cd3816f5 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c | |||
| @@ -1517,8 +1517,8 @@ static int _enable(struct omap_hwmod *oh) | |||
| 1517 | if (oh->_state != _HWMOD_STATE_INITIALIZED && | 1517 | if (oh->_state != _HWMOD_STATE_INITIALIZED && |
| 1518 | oh->_state != _HWMOD_STATE_IDLE && | 1518 | oh->_state != _HWMOD_STATE_IDLE && |
| 1519 | oh->_state != _HWMOD_STATE_DISABLED) { | 1519 | oh->_state != _HWMOD_STATE_DISABLED) { |
| 1520 | WARN(1, "omap_hwmod: %s: enabled state can only be entered " | 1520 | WARN(1, "omap_hwmod: %s: enabled state can only be entered from initialized, idle, or disabled state\n", |
| 1521 | "from initialized, idle, or disabled state\n", oh->name); | 1521 | oh->name); |
| 1522 | return -EINVAL; | 1522 | return -EINVAL; |
| 1523 | } | 1523 | } |
| 1524 | 1524 | ||
| @@ -1600,8 +1600,8 @@ static int _idle(struct omap_hwmod *oh) | |||
| 1600 | pr_debug("omap_hwmod: %s: idling\n", oh->name); | 1600 | pr_debug("omap_hwmod: %s: idling\n", oh->name); |
| 1601 | 1601 | ||
| 1602 | if (oh->_state != _HWMOD_STATE_ENABLED) { | 1602 | if (oh->_state != _HWMOD_STATE_ENABLED) { |
| 1603 | WARN(1, "omap_hwmod: %s: idle state can only be entered from " | 1603 | WARN(1, "omap_hwmod: %s: idle state can only be entered from enabled state\n", |
| 1604 | "enabled state\n", oh->name); | 1604 | oh->name); |
| 1605 | return -EINVAL; | 1605 | return -EINVAL; |
| 1606 | } | 1606 | } |
| 1607 | 1607 | ||
| @@ -1682,8 +1682,8 @@ static int _shutdown(struct omap_hwmod *oh) | |||
| 1682 | 1682 | ||
| 1683 | if (oh->_state != _HWMOD_STATE_IDLE && | 1683 | if (oh->_state != _HWMOD_STATE_IDLE && |
| 1684 | oh->_state != _HWMOD_STATE_ENABLED) { | 1684 | oh->_state != _HWMOD_STATE_ENABLED) { |
| 1685 | WARN(1, "omap_hwmod: %s: disabled state can only be entered " | 1685 | WARN(1, "omap_hwmod: %s: disabled state can only be entered from idle, or enabled state\n", |
| 1686 | "from idle, or enabled state\n", oh->name); | 1686 | oh->name); |
| 1687 | return -EINVAL; | 1687 | return -EINVAL; |
| 1688 | } | 1688 | } |
| 1689 | 1689 | ||
| @@ -2240,8 +2240,8 @@ void omap_hwmod_ocp_barrier(struct omap_hwmod *oh) | |||
| 2240 | BUG_ON(!oh); | 2240 | BUG_ON(!oh); |
| 2241 | 2241 | ||
| 2242 | if (!oh->class->sysc || !oh->class->sysc->sysc_flags) { | 2242 | if (!oh->class->sysc || !oh->class->sysc->sysc_flags) { |
| 2243 | WARN(1, "omap_device: %s: OCP barrier impossible due to " | 2243 | WARN(1, "omap_device: %s: OCP barrier impossible due to device configuration\n", |
| 2244 | "device configuration\n", oh->name); | 2244 | oh->name); |
| 2245 | return; | 2245 | return; |
| 2246 | } | 2246 | } |
| 2247 | 2247 | ||
diff --git a/arch/arm/mach-omap2/pm24xx.c b/arch/arm/mach-omap2/pm24xx.c index b8822f8b2891..23de98d03841 100644 --- a/arch/arm/mach-omap2/pm24xx.c +++ b/arch/arm/mach-omap2/pm24xx.c | |||
| @@ -82,13 +82,7 @@ static int omap2_fclks_active(void) | |||
| 82 | f1 = omap2_cm_read_mod_reg(CORE_MOD, CM_FCLKEN1); | 82 | f1 = omap2_cm_read_mod_reg(CORE_MOD, CM_FCLKEN1); |
| 83 | f2 = omap2_cm_read_mod_reg(CORE_MOD, OMAP24XX_CM_FCLKEN2); | 83 | f2 = omap2_cm_read_mod_reg(CORE_MOD, OMAP24XX_CM_FCLKEN2); |
| 84 | 84 | ||
| 85 | /* Ignore UART clocks. These are handled by UART core (serial.c) */ | 85 | return (f1 | f2) ? 1 : 0; |
| 86 | f1 &= ~(OMAP24XX_EN_UART1_MASK | OMAP24XX_EN_UART2_MASK); | ||
| 87 | f2 &= ~OMAP24XX_EN_UART3_MASK; | ||
| 88 | |||
| 89 | if (f1 | f2) | ||
| 90 | return 1; | ||
| 91 | return 0; | ||
| 92 | } | 86 | } |
| 93 | 87 | ||
| 94 | static void omap2_enter_full_retention(void) | 88 | static void omap2_enter_full_retention(void) |
diff --git a/arch/arm/mach-omap2/prm44xx.c b/arch/arm/mach-omap2/prm44xx.c index 33dd655e6aab..a1d6154dc120 100644 --- a/arch/arm/mach-omap2/prm44xx.c +++ b/arch/arm/mach-omap2/prm44xx.c | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | 19 | ||
| 20 | #include "common.h" | 20 | #include "common.h" |
| 21 | #include <plat/cpu.h> | 21 | #include <plat/cpu.h> |
| 22 | #include <plat/irqs.h> | ||
| 22 | #include <plat/prcm.h> | 23 | #include <plat/prcm.h> |
| 23 | 24 | ||
| 24 | #include "vp.h" | 25 | #include "vp.h" |
diff --git a/arch/arm/mach-omap2/vc.c b/arch/arm/mach-omap2/vc.c index 031d116fbf10..175b7d86d86a 100644 --- a/arch/arm/mach-omap2/vc.c +++ b/arch/arm/mach-omap2/vc.c | |||
| @@ -247,7 +247,7 @@ static void __init omap4_vc_init_channel(struct voltagedomain *voltdm) | |||
| 247 | * omap_vc_i2c_init - initialize I2C interface to PMIC | 247 | * omap_vc_i2c_init - initialize I2C interface to PMIC |
| 248 | * @voltdm: voltage domain containing VC data | 248 | * @voltdm: voltage domain containing VC data |
| 249 | * | 249 | * |
| 250 | * Use PMIC supplied seetings for I2C high-speed mode and | 250 | * Use PMIC supplied settings for I2C high-speed mode and |
| 251 | * master code (if set) and program the VC I2C configuration | 251 | * master code (if set) and program the VC I2C configuration |
| 252 | * register. | 252 | * register. |
| 253 | * | 253 | * |
| @@ -265,8 +265,8 @@ static void __init omap_vc_i2c_init(struct voltagedomain *voltdm) | |||
| 265 | 265 | ||
| 266 | if (initialized) { | 266 | if (initialized) { |
| 267 | if (voltdm->pmic->i2c_high_speed != i2c_high_speed) | 267 | if (voltdm->pmic->i2c_high_speed != i2c_high_speed) |
| 268 | pr_warn("%s: I2C config for all channels must match.", | 268 | pr_warn("%s: I2C config for vdd_%s does not match other channels (%u).", |
| 269 | __func__); | 269 | __func__, voltdm->name, i2c_high_speed); |
| 270 | return; | 270 | return; |
| 271 | } | 271 | } |
| 272 | 272 | ||
| @@ -292,9 +292,7 @@ void __init omap_vc_init_channel(struct voltagedomain *voltdm) | |||
| 292 | u32 val; | 292 | u32 val; |
| 293 | 293 | ||
| 294 | if (!voltdm->pmic || !voltdm->pmic->uv_to_vsel) { | 294 | if (!voltdm->pmic || !voltdm->pmic->uv_to_vsel) { |
| 295 | pr_err("%s: PMIC info requried to configure vc for" | 295 | pr_err("%s: No PMIC info for vdd_%s\n", __func__, voltdm->name); |
| 296 | "vdd_%s not populated.Hence cannot initialize vc\n", | ||
| 297 | __func__, voltdm->name); | ||
| 298 | return; | 296 | return; |
| 299 | } | 297 | } |
| 300 | 298 | ||
diff --git a/arch/arm/mach-omap2/voltagedomains3xxx_data.c b/arch/arm/mach-omap2/voltagedomains3xxx_data.c index c005e2f5e383..57db2038b23c 100644 --- a/arch/arm/mach-omap2/voltagedomains3xxx_data.c +++ b/arch/arm/mach-omap2/voltagedomains3xxx_data.c | |||
| @@ -108,6 +108,7 @@ void __init omap3xxx_voltagedomains_init(void) | |||
| 108 | * XXX Will depend on the process, validation, and binning | 108 | * XXX Will depend on the process, validation, and binning |
| 109 | * for the currently-running IC | 109 | * for the currently-running IC |
| 110 | */ | 110 | */ |
| 111 | #ifdef CONFIG_PM_OPP | ||
| 111 | if (cpu_is_omap3630()) { | 112 | if (cpu_is_omap3630()) { |
| 112 | omap3_voltdm_mpu.volt_data = omap36xx_vddmpu_volt_data; | 113 | omap3_voltdm_mpu.volt_data = omap36xx_vddmpu_volt_data; |
| 113 | omap3_voltdm_core.volt_data = omap36xx_vddcore_volt_data; | 114 | omap3_voltdm_core.volt_data = omap36xx_vddcore_volt_data; |
| @@ -115,6 +116,7 @@ void __init omap3xxx_voltagedomains_init(void) | |||
| 115 | omap3_voltdm_mpu.volt_data = omap34xx_vddmpu_volt_data; | 116 | omap3_voltdm_mpu.volt_data = omap34xx_vddmpu_volt_data; |
| 116 | omap3_voltdm_core.volt_data = omap34xx_vddcore_volt_data; | 117 | omap3_voltdm_core.volt_data = omap34xx_vddcore_volt_data; |
| 117 | } | 118 | } |
| 119 | #endif | ||
| 118 | 120 | ||
| 119 | if (cpu_is_omap3517() || cpu_is_omap3505()) | 121 | if (cpu_is_omap3517() || cpu_is_omap3505()) |
| 120 | voltdms = voltagedomains_am35xx; | 122 | voltdms = voltagedomains_am35xx; |
diff --git a/arch/arm/mach-omap2/voltagedomains44xx_data.c b/arch/arm/mach-omap2/voltagedomains44xx_data.c index 4e11d022595d..c3115f6853d4 100644 --- a/arch/arm/mach-omap2/voltagedomains44xx_data.c +++ b/arch/arm/mach-omap2/voltagedomains44xx_data.c | |||
| @@ -100,9 +100,11 @@ void __init omap44xx_voltagedomains_init(void) | |||
| 100 | * XXX Will depend on the process, validation, and binning | 100 | * XXX Will depend on the process, validation, and binning |
| 101 | * for the currently-running IC | 101 | * for the currently-running IC |
| 102 | */ | 102 | */ |
| 103 | #ifdef CONFIG_PM_OPP | ||
| 103 | omap4_voltdm_mpu.volt_data = omap44xx_vdd_mpu_volt_data; | 104 | omap4_voltdm_mpu.volt_data = omap44xx_vdd_mpu_volt_data; |
| 104 | omap4_voltdm_iva.volt_data = omap44xx_vdd_iva_volt_data; | 105 | omap4_voltdm_iva.volt_data = omap44xx_vdd_iva_volt_data; |
| 105 | omap4_voltdm_core.volt_data = omap44xx_vdd_core_volt_data; | 106 | omap4_voltdm_core.volt_data = omap44xx_vdd_core_volt_data; |
| 107 | #endif | ||
| 106 | 108 | ||
| 107 | for (i = 0; voltdm = voltagedomains_omap4[i], voltdm; i++) | 109 | for (i = 0; voltdm = voltagedomains_omap4[i], voltdm; i++) |
| 108 | voltdm->sys_clk.name = sys_clk_name; | 110 | voltdm->sys_clk.name = sys_clk_name; |
diff --git a/arch/arm/mach-omap2/vp.c b/arch/arm/mach-omap2/vp.c index 807391d84a9d..0df88820978d 100644 --- a/arch/arm/mach-omap2/vp.c +++ b/arch/arm/mach-omap2/vp.c | |||
| @@ -41,6 +41,11 @@ void __init omap_vp_init(struct voltagedomain *voltdm) | |||
| 41 | u32 val, sys_clk_rate, timeout, waittime; | 41 | u32 val, sys_clk_rate, timeout, waittime; |
| 42 | u32 vddmin, vddmax, vstepmin, vstepmax; | 42 | u32 vddmin, vddmax, vstepmin, vstepmax; |
| 43 | 43 | ||
| 44 | if (!voltdm->pmic || !voltdm->pmic->uv_to_vsel) { | ||
| 45 | pr_err("%s: No PMIC info for vdd_%s\n", __func__, voltdm->name); | ||
| 46 | return; | ||
| 47 | } | ||
| 48 | |||
| 44 | if (!voltdm->read || !voltdm->write) { | 49 | if (!voltdm->read || !voltdm->write) { |
| 45 | pr_err("%s: No read/write API for accessing vdd_%s regs\n", | 50 | pr_err("%s: No read/write API for accessing vdd_%s regs\n", |
| 46 | __func__, voltdm->name); | 51 | __func__, voltdm->name); |
diff --git a/arch/arm/mach-orion5x/common.c b/arch/arm/mach-orion5x/common.c index 0e28bae20bd4..5dad38ec00ea 100644 --- a/arch/arm/mach-orion5x/common.c +++ b/arch/arm/mach-orion5x/common.c | |||
| @@ -29,6 +29,7 @@ | |||
| 29 | #include <mach/hardware.h> | 29 | #include <mach/hardware.h> |
| 30 | #include <mach/orion5x.h> | 30 | #include <mach/orion5x.h> |
| 31 | #include <plat/orion_nand.h> | 31 | #include <plat/orion_nand.h> |
| 32 | #include <plat/ehci-orion.h> | ||
| 32 | #include <plat/time.h> | 33 | #include <plat/time.h> |
| 33 | #include <plat/common.h> | 34 | #include <plat/common.h> |
| 34 | #include <plat/addr-map.h> | 35 | #include <plat/addr-map.h> |
| @@ -72,7 +73,8 @@ void __init orion5x_map_io(void) | |||
| 72 | ****************************************************************************/ | 73 | ****************************************************************************/ |
| 73 | void __init orion5x_ehci0_init(void) | 74 | void __init orion5x_ehci0_init(void) |
| 74 | { | 75 | { |
| 75 | orion_ehci_init(ORION5X_USB0_PHYS_BASE, IRQ_ORION5X_USB0_CTRL); | 76 | orion_ehci_init(ORION5X_USB0_PHYS_BASE, IRQ_ORION5X_USB0_CTRL, |
| 77 | EHCI_PHY_ORION); | ||
| 76 | } | 78 | } |
| 77 | 79 | ||
| 78 | 80 | ||
diff --git a/arch/arm/mach-s3c2410/cpu-freq.c b/arch/arm/mach-s3c2410/cpu-freq.c index 7dc6c46b5e2b..5404535da1a5 100644 --- a/arch/arm/mach-s3c2410/cpu-freq.c +++ b/arch/arm/mach-s3c2410/cpu-freq.c | |||
| @@ -115,7 +115,8 @@ static struct s3c_cpufreq_info s3c2410_cpufreq_info = { | |||
| 115 | .debug_io_show = s3c_cpufreq_debugfs_call(s3c2410_iotiming_debugfs), | 115 | .debug_io_show = s3c_cpufreq_debugfs_call(s3c2410_iotiming_debugfs), |
| 116 | }; | 116 | }; |
| 117 | 117 | ||
| 118 | static int s3c2410_cpufreq_add(struct device *dev) | 118 | static int s3c2410_cpufreq_add(struct device *dev, |
| 119 | struct subsys_interface *sif) | ||
| 119 | { | 120 | { |
| 120 | return s3c_cpufreq_register(&s3c2410_cpufreq_info); | 121 | return s3c_cpufreq_register(&s3c2410_cpufreq_info); |
| 121 | } | 122 | } |
| @@ -133,7 +134,8 @@ static int __init s3c2410_cpufreq_init(void) | |||
| 133 | 134 | ||
| 134 | arch_initcall(s3c2410_cpufreq_init); | 135 | arch_initcall(s3c2410_cpufreq_init); |
| 135 | 136 | ||
| 136 | static int s3c2410a_cpufreq_add(struct device *dev) | 137 | static int s3c2410a_cpufreq_add(struct device *dev, |
| 138 | struct subsys_interface *sif) | ||
| 137 | { | 139 | { |
| 138 | /* alter the maximum freq settings for S3C2410A. If a board knows | 140 | /* alter the maximum freq settings for S3C2410A. If a board knows |
| 139 | * it only has a maximum of 200, then it should register its own | 141 | * it only has a maximum of 200, then it should register its own |
| @@ -144,7 +146,7 @@ static int s3c2410a_cpufreq_add(struct device *dev) | |||
| 144 | s3c2410_cpufreq_info.max.pclk = 66500000; | 146 | s3c2410_cpufreq_info.max.pclk = 66500000; |
| 145 | s3c2410_cpufreq_info.name = "s3c2410a"; | 147 | s3c2410_cpufreq_info.name = "s3c2410a"; |
| 146 | 148 | ||
| 147 | return s3c2410_cpufreq_add(dev); | 149 | return s3c2410_cpufreq_add(dev, sif); |
| 148 | } | 150 | } |
| 149 | 151 | ||
| 150 | static struct subsys_interface s3c2410a_cpufreq_interface = { | 152 | static struct subsys_interface s3c2410a_cpufreq_interface = { |
diff --git a/arch/arm/mach-s3c2410/dma.c b/arch/arm/mach-s3c2410/dma.c index 2afd00014a77..4803338cf56e 100644 --- a/arch/arm/mach-s3c2410/dma.c +++ b/arch/arm/mach-s3c2410/dma.c | |||
| @@ -132,7 +132,8 @@ static struct s3c24xx_dma_order __initdata s3c2410_dma_order = { | |||
| 132 | }, | 132 | }, |
| 133 | }; | 133 | }; |
| 134 | 134 | ||
| 135 | static int __init s3c2410_dma_add(struct device *dev) | 135 | static int __init s3c2410_dma_add(struct device *dev, |
| 136 | struct subsys_interface *sif) | ||
| 136 | { | 137 | { |
| 137 | s3c2410_dma_init(); | 138 | s3c2410_dma_init(); |
| 138 | s3c24xx_dma_order_set(&s3c2410_dma_order); | 139 | s3c24xx_dma_order_set(&s3c2410_dma_order); |
| @@ -148,7 +149,7 @@ static struct subsys_interface s3c2410_dma_interface = { | |||
| 148 | 149 | ||
| 149 | static int __init s3c2410_dma_drvinit(void) | 150 | static int __init s3c2410_dma_drvinit(void) |
| 150 | { | 151 | { |
| 151 | return subsys_interface_register(&s3c2410_interface); | 152 | return subsys_interface_register(&s3c2410_dma_interface); |
| 152 | } | 153 | } |
| 153 | 154 | ||
| 154 | arch_initcall(s3c2410_dma_drvinit); | 155 | arch_initcall(s3c2410_dma_drvinit); |
diff --git a/arch/arm/mach-s3c2410/pll.c b/arch/arm/mach-s3c2410/pll.c index c07438bfc99f..e0b3b347da82 100644 --- a/arch/arm/mach-s3c2410/pll.c +++ b/arch/arm/mach-s3c2410/pll.c | |||
| @@ -66,7 +66,7 @@ static struct cpufreq_frequency_table pll_vals_12MHz[] = { | |||
| 66 | { .frequency = 270000000, .index = PLLVAL(127, 1, 1), }, | 66 | { .frequency = 270000000, .index = PLLVAL(127, 1, 1), }, |
| 67 | }; | 67 | }; |
| 68 | 68 | ||
| 69 | static int s3c2410_plls_add(struct device *dev) | 69 | static int s3c2410_plls_add(struct device *dev, struct subsys_interface *sif) |
| 70 | { | 70 | { |
| 71 | return s3c_plltab_register(pll_vals_12MHz, ARRAY_SIZE(pll_vals_12MHz)); | 71 | return s3c_plltab_register(pll_vals_12MHz, ARRAY_SIZE(pll_vals_12MHz)); |
| 72 | } | 72 | } |
diff --git a/arch/arm/mach-s3c2410/pm.c b/arch/arm/mach-s3c2410/pm.c index fda5385deff6..03f706dd6009 100644 --- a/arch/arm/mach-s3c2410/pm.c +++ b/arch/arm/mach-s3c2410/pm.c | |||
| @@ -111,7 +111,7 @@ struct syscore_ops s3c2410_pm_syscore_ops = { | |||
| 111 | .resume = s3c2410_pm_resume, | 111 | .resume = s3c2410_pm_resume, |
| 112 | }; | 112 | }; |
| 113 | 113 | ||
| 114 | static int s3c2410_pm_add(struct device *dev) | 114 | static int s3c2410_pm_add(struct device *dev, struct subsys_interface *sif) |
| 115 | { | 115 | { |
| 116 | pm_cpu_prep = s3c2410_pm_prepare; | 116 | pm_cpu_prep = s3c2410_pm_prepare; |
| 117 | pm_cpu_sleep = s3c2410_cpu_suspend; | 117 | pm_cpu_sleep = s3c2410_cpu_suspend; |
diff --git a/arch/arm/mach-s3c2412/cpu-freq.c b/arch/arm/mach-s3c2412/cpu-freq.c index d8664b7652ce..125be7d5fa60 100644 --- a/arch/arm/mach-s3c2412/cpu-freq.c +++ b/arch/arm/mach-s3c2412/cpu-freq.c | |||
| @@ -194,7 +194,8 @@ static struct s3c_cpufreq_info s3c2412_cpufreq_info = { | |||
| 194 | .debug_io_show = s3c_cpufreq_debugfs_call(s3c2412_iotiming_debugfs), | 194 | .debug_io_show = s3c_cpufreq_debugfs_call(s3c2412_iotiming_debugfs), |
| 195 | }; | 195 | }; |
| 196 | 196 | ||
| 197 | static int s3c2412_cpufreq_add(struct device *dev) | 197 | static int s3c2412_cpufreq_add(struct device *dev, |
| 198 | struct subsys_interface *sif) | ||
| 198 | { | 199 | { |
| 199 | unsigned long fclk_rate; | 200 | unsigned long fclk_rate; |
| 200 | 201 | ||
diff --git a/arch/arm/mach-s3c2412/dma.c b/arch/arm/mach-s3c2412/dma.c index 142acd3b5e15..38472ac920ff 100644 --- a/arch/arm/mach-s3c2412/dma.c +++ b/arch/arm/mach-s3c2412/dma.c | |||
| @@ -159,7 +159,8 @@ static struct s3c24xx_dma_selection __initdata s3c2412_dma_sel = { | |||
| 159 | .map_size = ARRAY_SIZE(s3c2412_dma_mappings), | 159 | .map_size = ARRAY_SIZE(s3c2412_dma_mappings), |
| 160 | }; | 160 | }; |
| 161 | 161 | ||
| 162 | static int __init s3c2412_dma_add(struct device *dev) | 162 | static int __init s3c2412_dma_add(struct device *dev, |
| 163 | struct subsys_interface *sif) | ||
| 163 | { | 164 | { |
| 164 | s3c2410_dma_init(); | 165 | s3c2410_dma_init(); |
| 165 | return s3c24xx_dma_init_map(&s3c2412_dma_sel); | 166 | return s3c24xx_dma_init_map(&s3c2412_dma_sel); |
diff --git a/arch/arm/mach-s3c2412/irq.c b/arch/arm/mach-s3c2412/irq.c index a8a46c1644f4..e65619ddbccc 100644 --- a/arch/arm/mach-s3c2412/irq.c +++ b/arch/arm/mach-s3c2412/irq.c | |||
| @@ -170,7 +170,7 @@ static int s3c2412_irq_rtc_wake(struct irq_data *data, unsigned int state) | |||
| 170 | 170 | ||
| 171 | static struct irq_chip s3c2412_irq_rtc_chip; | 171 | static struct irq_chip s3c2412_irq_rtc_chip; |
| 172 | 172 | ||
| 173 | static int s3c2412_irq_add(struct device *dev) | 173 | static int s3c2412_irq_add(struct device *dev, struct subsys_interface *sif) |
| 174 | { | 174 | { |
| 175 | unsigned int irqno; | 175 | unsigned int irqno; |
| 176 | 176 | ||
diff --git a/arch/arm/mach-s3c2412/pm.c b/arch/arm/mach-s3c2412/pm.c index d1adfa65f66d..d04588506ec4 100644 --- a/arch/arm/mach-s3c2412/pm.c +++ b/arch/arm/mach-s3c2412/pm.c | |||
| @@ -56,7 +56,7 @@ static void s3c2412_pm_prepare(void) | |||
| 56 | { | 56 | { |
| 57 | } | 57 | } |
| 58 | 58 | ||
| 59 | static int s3c2412_pm_add(struct device *dev) | 59 | static int s3c2412_pm_add(struct device *dev, struct subsys_interface *sif) |
| 60 | { | 60 | { |
| 61 | pm_cpu_prep = s3c2412_pm_prepare; | 61 | pm_cpu_prep = s3c2412_pm_prepare; |
| 62 | pm_cpu_sleep = s3c2412_cpu_suspend; | 62 | pm_cpu_sleep = s3c2412_cpu_suspend; |
diff --git a/arch/arm/mach-s3c2416/irq.c b/arch/arm/mach-s3c2416/irq.c index 36df761061de..fd49f35e448e 100644 --- a/arch/arm/mach-s3c2416/irq.c +++ b/arch/arm/mach-s3c2416/irq.c | |||
| @@ -213,7 +213,8 @@ static int __init s3c2416_add_sub(unsigned int base, | |||
| 213 | return 0; | 213 | return 0; |
| 214 | } | 214 | } |
| 215 | 215 | ||
| 216 | static int __init s3c2416_irq_add(struct device *dev) | 216 | static int __init s3c2416_irq_add(struct device *dev, |
| 217 | struct subsys_interface *sif) | ||
| 217 | { | 218 | { |
| 218 | printk(KERN_INFO "S3C2416: IRQ Support\n"); | 219 | printk(KERN_INFO "S3C2416: IRQ Support\n"); |
| 219 | 220 | ||
diff --git a/arch/arm/mach-s3c2416/pm.c b/arch/arm/mach-s3c2416/pm.c index 3bdb15a0d419..1bd4817b8eb8 100644 --- a/arch/arm/mach-s3c2416/pm.c +++ b/arch/arm/mach-s3c2416/pm.c | |||
| @@ -48,7 +48,7 @@ static void s3c2416_pm_prepare(void) | |||
| 48 | __raw_writel(virt_to_phys(s3c_cpu_resume), S3C2412_INFORM1); | 48 | __raw_writel(virt_to_phys(s3c_cpu_resume), S3C2412_INFORM1); |
| 49 | } | 49 | } |
| 50 | 50 | ||
| 51 | static int s3c2416_pm_add(struct device *dev) | 51 | static int s3c2416_pm_add(struct device *dev, struct subsys_interface *sif) |
| 52 | { | 52 | { |
| 53 | pm_cpu_prep = s3c2416_pm_prepare; | 53 | pm_cpu_prep = s3c2416_pm_prepare; |
| 54 | pm_cpu_sleep = s3c2416_cpu_suspend; | 54 | pm_cpu_sleep = s3c2416_cpu_suspend; |
diff --git a/arch/arm/mach-s3c2440/clock.c b/arch/arm/mach-s3c2440/clock.c index bedbc87a3426..414364eb426c 100644 --- a/arch/arm/mach-s3c2440/clock.c +++ b/arch/arm/mach-s3c2440/clock.c | |||
| @@ -149,7 +149,7 @@ static struct clk_lookup s3c2440_clk_lookup[] = { | |||
| 149 | CLKDEV_INIT(NULL, "clk_uart_baud3", &s3c2440_clk_fclk_n), | 149 | CLKDEV_INIT(NULL, "clk_uart_baud3", &s3c2440_clk_fclk_n), |
| 150 | }; | 150 | }; |
| 151 | 151 | ||
| 152 | static int s3c2440_clk_add(struct device *dev) | 152 | static int s3c2440_clk_add(struct device *dev, struct subsys_interface *sif) |
| 153 | { | 153 | { |
| 154 | struct clk *clock_upll; | 154 | struct clk *clock_upll; |
| 155 | struct clk *clock_h; | 155 | struct clk *clock_h; |
diff --git a/arch/arm/mach-s3c2440/dma.c b/arch/arm/mach-s3c2440/dma.c index 15b1ddf8f626..5f0a0c8ef84f 100644 --- a/arch/arm/mach-s3c2440/dma.c +++ b/arch/arm/mach-s3c2440/dma.c | |||
| @@ -174,7 +174,8 @@ static struct s3c24xx_dma_order __initdata s3c2440_dma_order = { | |||
| 174 | }, | 174 | }, |
| 175 | }; | 175 | }; |
| 176 | 176 | ||
| 177 | static int __init s3c2440_dma_add(struct device *dev) | 177 | static int __init s3c2440_dma_add(struct device *dev, |
| 178 | struct subsys_interface *sif) | ||
| 178 | { | 179 | { |
| 179 | s3c2410_dma_init(); | 180 | s3c2410_dma_init(); |
| 180 | s3c24xx_dma_order_set(&s3c2440_dma_order); | 181 | s3c24xx_dma_order_set(&s3c2440_dma_order); |
diff --git a/arch/arm/mach-s3c2440/irq.c b/arch/arm/mach-s3c2440/irq.c index 4fee9bc6bcb5..4a18cde439cc 100644 --- a/arch/arm/mach-s3c2440/irq.c +++ b/arch/arm/mach-s3c2440/irq.c | |||
| @@ -92,7 +92,7 @@ static struct irq_chip s3c_irq_wdtac97 = { | |||
| 92 | .irq_ack = s3c_irq_wdtac97_ack, | 92 | .irq_ack = s3c_irq_wdtac97_ack, |
| 93 | }; | 93 | }; |
| 94 | 94 | ||
| 95 | static int s3c2440_irq_add(struct device *dev) | 95 | static int s3c2440_irq_add(struct device *dev, struct subsys_interface *sif) |
| 96 | { | 96 | { |
| 97 | unsigned int irqno; | 97 | unsigned int irqno; |
| 98 | 98 | ||
diff --git a/arch/arm/mach-s3c2440/s3c2440-cpufreq.c b/arch/arm/mach-s3c2440/s3c2440-cpufreq.c index cf7596694efe..61776764d9f4 100644 --- a/arch/arm/mach-s3c2440/s3c2440-cpufreq.c +++ b/arch/arm/mach-s3c2440/s3c2440-cpufreq.c | |||
| @@ -270,7 +270,8 @@ struct s3c_cpufreq_info s3c2440_cpufreq_info = { | |||
| 270 | .debug_io_show = s3c_cpufreq_debugfs_call(s3c2410_iotiming_debugfs), | 270 | .debug_io_show = s3c_cpufreq_debugfs_call(s3c2410_iotiming_debugfs), |
| 271 | }; | 271 | }; |
| 272 | 272 | ||
| 273 | static int s3c2440_cpufreq_add(struct device *dev) | 273 | static int s3c2440_cpufreq_add(struct device *dev, |
| 274 | struct subsys_interface *sif) | ||
| 274 | { | 275 | { |
| 275 | xtal = s3c_cpufreq_clk_get(NULL, "xtal"); | 276 | xtal = s3c_cpufreq_clk_get(NULL, "xtal"); |
| 276 | hclk = s3c_cpufreq_clk_get(NULL, "hclk"); | 277 | hclk = s3c_cpufreq_clk_get(NULL, "hclk"); |
diff --git a/arch/arm/mach-s3c2440/s3c2440-pll-12000000.c b/arch/arm/mach-s3c2440/s3c2440-pll-12000000.c index b5368ae8d7fe..551fb433be87 100644 --- a/arch/arm/mach-s3c2440/s3c2440-pll-12000000.c +++ b/arch/arm/mach-s3c2440/s3c2440-pll-12000000.c | |||
| @@ -51,7 +51,7 @@ static struct cpufreq_frequency_table s3c2440_plls_12[] __initdata = { | |||
| 51 | { .frequency = 400000000, .index = PLLVAL(0x5c, 1, 1), }, /* FVco 800.000000 */ | 51 | { .frequency = 400000000, .index = PLLVAL(0x5c, 1, 1), }, /* FVco 800.000000 */ |
| 52 | }; | 52 | }; |
| 53 | 53 | ||
| 54 | static int s3c2440_plls12_add(struct device *dev) | 54 | static int s3c2440_plls12_add(struct device *dev, struct subsys_interface *sif) |
| 55 | { | 55 | { |
| 56 | struct clk *xtal_clk; | 56 | struct clk *xtal_clk; |
| 57 | unsigned long xtal; | 57 | unsigned long xtal; |
diff --git a/arch/arm/mach-s3c2440/s3c2440-pll-16934400.c b/arch/arm/mach-s3c2440/s3c2440-pll-16934400.c index 42f2b5cd2399..3f15bcf64290 100644 --- a/arch/arm/mach-s3c2440/s3c2440-pll-16934400.c +++ b/arch/arm/mach-s3c2440/s3c2440-pll-16934400.c | |||
| @@ -79,7 +79,8 @@ static struct cpufreq_frequency_table s3c2440_plls_169344[] __initdata = { | |||
| 79 | { .frequency = 402192000, .index = PLLVAL(87, 2, 1), }, /* FVco 804.384000 */ | 79 | { .frequency = 402192000, .index = PLLVAL(87, 2, 1), }, /* FVco 804.384000 */ |
| 80 | }; | 80 | }; |
| 81 | 81 | ||
| 82 | static int s3c2440_plls169344_add(struct device *dev) | 82 | static int s3c2440_plls169344_add(struct device *dev, |
| 83 | struct subsys_interface *sif) | ||
| 83 | { | 84 | { |
| 84 | struct clk *xtal_clk; | 85 | struct clk *xtal_clk; |
| 85 | unsigned long xtal; | 86 | unsigned long xtal; |
diff --git a/arch/arm/mach-s3c2440/s3c2442.c b/arch/arm/mach-s3c2440/s3c2442.c index 8004e0497bf4..22cb7c94a8c8 100644 --- a/arch/arm/mach-s3c2440/s3c2442.c +++ b/arch/arm/mach-s3c2440/s3c2442.c | |||
| @@ -122,7 +122,7 @@ static struct clk s3c2442_clk_cam_upll = { | |||
| 122 | }, | 122 | }, |
| 123 | }; | 123 | }; |
| 124 | 124 | ||
| 125 | static int s3c2442_clk_add(struct device *dev) | 125 | static int s3c2442_clk_add(struct device *dev, struct subsys_interface *sif) |
| 126 | { | 126 | { |
| 127 | struct clk *clock_upll; | 127 | struct clk *clock_upll; |
| 128 | struct clk *clock_h; | 128 | struct clk *clock_h; |
diff --git a/arch/arm/mach-s3c2440/s3c244x-clock.c b/arch/arm/mach-s3c2440/s3c244x-clock.c index b3fdbdda3d5f..6d9b688c442b 100644 --- a/arch/arm/mach-s3c2440/s3c244x-clock.c +++ b/arch/arm/mach-s3c2440/s3c244x-clock.c | |||
| @@ -72,7 +72,7 @@ static struct clk clk_arm = { | |||
| 72 | }, | 72 | }, |
| 73 | }; | 73 | }; |
| 74 | 74 | ||
| 75 | static int s3c244x_clk_add(struct device *dev) | 75 | static int s3c244x_clk_add(struct device *dev, struct subsys_interface *sif) |
| 76 | { | 76 | { |
| 77 | unsigned long camdivn = __raw_readl(S3C2440_CAMDIVN); | 77 | unsigned long camdivn = __raw_readl(S3C2440_CAMDIVN); |
| 78 | unsigned long clkdivn; | 78 | unsigned long clkdivn; |
diff --git a/arch/arm/mach-s3c2440/s3c244x-irq.c b/arch/arm/mach-s3c2440/s3c244x-irq.c index 74d3dcf46a48..5fe8e58d3afd 100644 --- a/arch/arm/mach-s3c2440/s3c244x-irq.c +++ b/arch/arm/mach-s3c2440/s3c244x-irq.c | |||
| @@ -91,7 +91,7 @@ static struct irq_chip s3c_irq_cam = { | |||
| 91 | .irq_ack = s3c_irq_cam_ack, | 91 | .irq_ack = s3c_irq_cam_ack, |
| 92 | }; | 92 | }; |
| 93 | 93 | ||
| 94 | static int s3c244x_irq_add(struct device *dev) | 94 | static int s3c244x_irq_add(struct device *dev, struct subsys_interface *sif) |
| 95 | { | 95 | { |
| 96 | unsigned int irqno; | 96 | unsigned int irqno; |
| 97 | 97 | ||
diff --git a/arch/arm/mach-s3c2443/dma.c b/arch/arm/mach-s3c2443/dma.c index de6b4a23c9ed..14224517e621 100644 --- a/arch/arm/mach-s3c2443/dma.c +++ b/arch/arm/mach-s3c2443/dma.c | |||
| @@ -135,7 +135,8 @@ static struct s3c24xx_dma_selection __initdata s3c2443_dma_sel = { | |||
| 135 | .map_size = ARRAY_SIZE(s3c2443_dma_mappings), | 135 | .map_size = ARRAY_SIZE(s3c2443_dma_mappings), |
| 136 | }; | 136 | }; |
| 137 | 137 | ||
| 138 | static int __init s3c2443_dma_add(struct device *dev) | 138 | static int __init s3c2443_dma_add(struct device *dev, |
| 139 | struct subsys_interface *sif) | ||
| 139 | { | 140 | { |
| 140 | s3c24xx_dma_init(6, IRQ_S3C2443_DMA0, 0x100); | 141 | s3c24xx_dma_init(6, IRQ_S3C2443_DMA0, 0x100); |
| 141 | return s3c24xx_dma_init_map(&s3c2443_dma_sel); | 142 | return s3c24xx_dma_init_map(&s3c2443_dma_sel); |
diff --git a/arch/arm/mach-s3c2443/irq.c b/arch/arm/mach-s3c2443/irq.c index 35e4ff24fb43..ac2829f56d12 100644 --- a/arch/arm/mach-s3c2443/irq.c +++ b/arch/arm/mach-s3c2443/irq.c | |||
| @@ -241,7 +241,8 @@ static int __init s3c2443_add_sub(unsigned int base, | |||
| 241 | return 0; | 241 | return 0; |
| 242 | } | 242 | } |
| 243 | 243 | ||
| 244 | static int __init s3c2443_irq_add(struct device *dev) | 244 | static int __init s3c2443_irq_add(struct device *dev, |
| 245 | struct subsys_interface *sif) | ||
| 245 | { | 246 | { |
| 246 | printk("S3C2443: IRQ Support\n"); | 247 | printk("S3C2443: IRQ Support\n"); |
| 247 | 248 | ||
diff --git a/arch/arm/mach-s3c64xx/clock.c b/arch/arm/mach-s3c64xx/clock.c index 31bb27dc4aeb..aebbcc291b4e 100644 --- a/arch/arm/mach-s3c64xx/clock.c +++ b/arch/arm/mach-s3c64xx/clock.c | |||
| @@ -138,6 +138,11 @@ static struct clk init_clocks_off[] = { | |||
| 138 | .ctrlbit = S3C_CLKCON_PCLK_TSADC, | 138 | .ctrlbit = S3C_CLKCON_PCLK_TSADC, |
| 139 | }, { | 139 | }, { |
| 140 | .name = "i2c", | 140 | .name = "i2c", |
| 141 | #ifdef CONFIG_S3C_DEV_I2C1 | ||
| 142 | .devname = "s3c2440-i2c.0", | ||
| 143 | #else | ||
| 144 | .devname = "s3c2440-i2c", | ||
| 145 | #endif | ||
| 141 | .parent = &clk_p, | 146 | .parent = &clk_p, |
| 142 | .enable = s3c64xx_pclk_ctrl, | 147 | .enable = s3c64xx_pclk_ctrl, |
| 143 | .ctrlbit = S3C_CLKCON_PCLK_IIC, | 148 | .ctrlbit = S3C_CLKCON_PCLK_IIC, |
diff --git a/arch/arm/mach-s3c64xx/common.c b/arch/arm/mach-s3c64xx/common.c index 4a7394d4bd9e..bee7dcd4df7c 100644 --- a/arch/arm/mach-s3c64xx/common.c +++ b/arch/arm/mach-s3c64xx/common.c | |||
| @@ -49,7 +49,7 @@ | |||
| 49 | 49 | ||
| 50 | /* uart registration process */ | 50 | /* uart registration process */ |
| 51 | 51 | ||
| 52 | void __init s3c64xx_init_uarts(struct s3c2410_uartcfg *cfg, int no) | 52 | static void __init s3c64xx_init_uarts(struct s3c2410_uartcfg *cfg, int no) |
| 53 | { | 53 | { |
| 54 | s3c24xx_init_uartdevs("s3c6400-uart", s3c64xx_uart_resources, cfg, no); | 54 | s3c24xx_init_uartdevs("s3c6400-uart", s3c64xx_uart_resources, cfg, no); |
| 55 | } | 55 | } |
diff --git a/arch/arm/mach-s5p64x0/pm.c b/arch/arm/mach-s5p64x0/pm.c index 23f9b22439c9..9cba18bfe47b 100644 --- a/arch/arm/mach-s5p64x0/pm.c +++ b/arch/arm/mach-s5p64x0/pm.c | |||
| @@ -160,7 +160,7 @@ static void s5p64x0_pm_prepare(void) | |||
| 160 | 160 | ||
| 161 | } | 161 | } |
| 162 | 162 | ||
| 163 | static int s5p64x0_pm_add(struct device *dev) | 163 | static int s5p64x0_pm_add(struct device *dev, struct subsys_interface *sif) |
| 164 | { | 164 | { |
| 165 | pm_cpu_prep = s5p64x0_pm_prepare; | 165 | pm_cpu_prep = s5p64x0_pm_prepare; |
| 166 | pm_cpu_sleep = s5p64x0_cpu_suspend; | 166 | pm_cpu_sleep = s5p64x0_cpu_suspend; |
diff --git a/arch/arm/mach-s5pv210/clock.c b/arch/arm/mach-s5pv210/clock.c index c78dfddd77fd..b9ec0c35379f 100644 --- a/arch/arm/mach-s5pv210/clock.c +++ b/arch/arm/mach-s5pv210/clock.c | |||
| @@ -175,7 +175,7 @@ static int s5pv210_clk_mask1_ctrl(struct clk *clk, int enable) | |||
| 175 | return s5p_gatectrl(S5P_CLK_SRC_MASK1, clk, enable); | 175 | return s5p_gatectrl(S5P_CLK_SRC_MASK1, clk, enable); |
| 176 | } | 176 | } |
| 177 | 177 | ||
| 178 | static int exynos4_clk_hdmiphy_ctrl(struct clk *clk, int enable) | 178 | static int s5pv210_clk_hdmiphy_ctrl(struct clk *clk, int enable) |
| 179 | { | 179 | { |
| 180 | return s5p_gatectrl(S5P_HDMI_PHY_CONTROL, clk, enable); | 180 | return s5p_gatectrl(S5P_HDMI_PHY_CONTROL, clk, enable); |
| 181 | } | 181 | } |
| @@ -372,7 +372,7 @@ static struct clk init_clocks_off[] = { | |||
| 372 | }, { | 372 | }, { |
| 373 | .name = "hdmiphy", | 373 | .name = "hdmiphy", |
| 374 | .devname = "s5pv210-hdmi", | 374 | .devname = "s5pv210-hdmi", |
| 375 | .enable = exynos4_clk_hdmiphy_ctrl, | 375 | .enable = s5pv210_clk_hdmiphy_ctrl, |
| 376 | .ctrlbit = (1 << 0), | 376 | .ctrlbit = (1 << 0), |
| 377 | }, { | 377 | }, { |
| 378 | .name = "dacphy", | 378 | .name = "dacphy", |
diff --git a/arch/arm/mach-s5pv210/pm.c b/arch/arm/mach-s5pv210/pm.c index 677c71c41e50..736bfb103cbc 100644 --- a/arch/arm/mach-s5pv210/pm.c +++ b/arch/arm/mach-s5pv210/pm.c | |||
| @@ -133,7 +133,7 @@ static void s5pv210_pm_prepare(void) | |||
| 133 | s3c_pm_do_save(s5pv210_core_save, ARRAY_SIZE(s5pv210_core_save)); | 133 | s3c_pm_do_save(s5pv210_core_save, ARRAY_SIZE(s5pv210_core_save)); |
| 134 | } | 134 | } |
| 135 | 135 | ||
| 136 | static int s5pv210_pm_add(struct device *dev) | 136 | static int s5pv210_pm_add(struct device *dev, struct subsys_interface *sif) |
| 137 | { | 137 | { |
| 138 | pm_cpu_prep = s5pv210_pm_prepare; | 138 | pm_cpu_prep = s5pv210_pm_prepare; |
| 139 | pm_cpu_sleep = s5pv210_cpu_suspend; | 139 | pm_cpu_sleep = s5pv210_cpu_suspend; |
diff --git a/arch/arm/mach-shmobile/board-ag5evm.c b/arch/arm/mach-shmobile/board-ag5evm.c index eff8a96c75ee..068b754bc348 100644 --- a/arch/arm/mach-shmobile/board-ag5evm.c +++ b/arch/arm/mach-shmobile/board-ag5evm.c | |||
| @@ -30,6 +30,7 @@ | |||
| 30 | #include <linux/serial_sci.h> | 30 | #include <linux/serial_sci.h> |
| 31 | #include <linux/smsc911x.h> | 31 | #include <linux/smsc911x.h> |
| 32 | #include <linux/gpio.h> | 32 | #include <linux/gpio.h> |
| 33 | #include <linux/videodev2.h> | ||
| 33 | #include <linux/input.h> | 34 | #include <linux/input.h> |
| 34 | #include <linux/input/sh_keysc.h> | 35 | #include <linux/input/sh_keysc.h> |
| 35 | #include <linux/mmc/host.h> | 36 | #include <linux/mmc/host.h> |
| @@ -37,7 +38,6 @@ | |||
| 37 | #include <linux/mmc/sh_mobile_sdhi.h> | 38 | #include <linux/mmc/sh_mobile_sdhi.h> |
| 38 | #include <linux/mfd/tmio.h> | 39 | #include <linux/mfd/tmio.h> |
| 39 | #include <linux/sh_clk.h> | 40 | #include <linux/sh_clk.h> |
| 40 | #include <linux/dma-mapping.h> | ||
| 41 | #include <video/sh_mobile_lcdc.h> | 41 | #include <video/sh_mobile_lcdc.h> |
| 42 | #include <video/sh_mipi_dsi.h> | 42 | #include <video/sh_mipi_dsi.h> |
| 43 | #include <sound/sh_fsi.h> | 43 | #include <sound/sh_fsi.h> |
| @@ -159,19 +159,12 @@ static struct resource sh_mmcif_resources[] = { | |||
| 159 | }, | 159 | }, |
| 160 | }; | 160 | }; |
| 161 | 161 | ||
| 162 | static struct sh_mmcif_dma sh_mmcif_dma = { | ||
| 163 | .chan_priv_rx = { | ||
| 164 | .slave_id = SHDMA_SLAVE_MMCIF_RX, | ||
| 165 | }, | ||
| 166 | .chan_priv_tx = { | ||
| 167 | .slave_id = SHDMA_SLAVE_MMCIF_TX, | ||
| 168 | }, | ||
| 169 | }; | ||
| 170 | static struct sh_mmcif_plat_data sh_mmcif_platdata = { | 162 | static struct sh_mmcif_plat_data sh_mmcif_platdata = { |
| 171 | .sup_pclk = 0, | 163 | .sup_pclk = 0, |
| 172 | .ocr = MMC_VDD_165_195, | 164 | .ocr = MMC_VDD_165_195, |
| 173 | .caps = MMC_CAP_8_BIT_DATA | MMC_CAP_NONREMOVABLE, | 165 | .caps = MMC_CAP_8_BIT_DATA | MMC_CAP_NONREMOVABLE, |
| 174 | .dma = &sh_mmcif_dma, | 166 | .slave_id_tx = SHDMA_SLAVE_MMCIF_TX, |
| 167 | .slave_id_rx = SHDMA_SLAVE_MMCIF_RX, | ||
| 175 | }; | 168 | }; |
| 176 | 169 | ||
| 177 | static struct platform_device mmc_device = { | 170 | static struct platform_device mmc_device = { |
| @@ -321,12 +314,11 @@ static struct resource mipidsi0_resources[] = { | |||
| 321 | }, | 314 | }, |
| 322 | }; | 315 | }; |
| 323 | 316 | ||
| 324 | #define DSI0PHYCR 0xe615006c | ||
| 325 | static int sh_mipi_set_dot_clock(struct platform_device *pdev, | 317 | static int sh_mipi_set_dot_clock(struct platform_device *pdev, |
| 326 | void __iomem *base, | 318 | void __iomem *base, |
| 327 | int enable) | 319 | int enable) |
| 328 | { | 320 | { |
| 329 | struct clk *pck; | 321 | struct clk *pck, *phy; |
| 330 | int ret; | 322 | int ret; |
| 331 | 323 | ||
| 332 | pck = clk_get(&pdev->dev, "dsip_clk"); | 324 | pck = clk_get(&pdev->dev, "dsip_clk"); |
| @@ -335,18 +327,27 @@ static int sh_mipi_set_dot_clock(struct platform_device *pdev, | |||
| 335 | goto sh_mipi_set_dot_clock_pck_err; | 327 | goto sh_mipi_set_dot_clock_pck_err; |
| 336 | } | 328 | } |
| 337 | 329 | ||
| 330 | phy = clk_get(&pdev->dev, "dsiphy_clk"); | ||
| 331 | if (IS_ERR(phy)) { | ||
| 332 | ret = PTR_ERR(phy); | ||
| 333 | goto sh_mipi_set_dot_clock_phy_err; | ||
| 334 | } | ||
| 335 | |||
| 338 | if (enable) { | 336 | if (enable) { |
| 339 | clk_set_rate(pck, clk_round_rate(pck, 24000000)); | 337 | clk_set_rate(pck, clk_round_rate(pck, 24000000)); |
| 340 | __raw_writel(0x2a809010, DSI0PHYCR); | 338 | clk_set_rate(phy, clk_round_rate(pck, 510000000)); |
| 341 | clk_enable(pck); | 339 | clk_enable(pck); |
| 340 | clk_enable(phy); | ||
| 342 | } else { | 341 | } else { |
| 343 | clk_disable(pck); | 342 | clk_disable(pck); |
| 343 | clk_disable(phy); | ||
| 344 | } | 344 | } |
| 345 | 345 | ||
| 346 | ret = 0; | 346 | ret = 0; |
| 347 | 347 | ||
| 348 | clk_put(phy); | ||
| 349 | sh_mipi_set_dot_clock_phy_err: | ||
| 348 | clk_put(pck); | 350 | clk_put(pck); |
| 349 | |||
| 350 | sh_mipi_set_dot_clock_pck_err: | 351 | sh_mipi_set_dot_clock_pck_err: |
| 351 | return ret; | 352 | return ret; |
| 352 | } | 353 | } |
diff --git a/arch/arm/mach-shmobile/board-ap4evb.c b/arch/arm/mach-shmobile/board-ap4evb.c index aab0a349f759..eeb4d9664584 100644 --- a/arch/arm/mach-shmobile/board-ap4evb.c +++ b/arch/arm/mach-shmobile/board-ap4evb.c | |||
| @@ -295,15 +295,6 @@ static struct resource sh_mmcif_resources[] = { | |||
| 295 | }, | 295 | }, |
| 296 | }; | 296 | }; |
| 297 | 297 | ||
| 298 | static struct sh_mmcif_dma sh_mmcif_dma = { | ||
| 299 | .chan_priv_rx = { | ||
| 300 | .slave_id = SHDMA_SLAVE_MMCIF_RX, | ||
| 301 | }, | ||
| 302 | .chan_priv_tx = { | ||
| 303 | .slave_id = SHDMA_SLAVE_MMCIF_TX, | ||
| 304 | }, | ||
| 305 | }; | ||
| 306 | |||
| 307 | static struct sh_mmcif_plat_data sh_mmcif_plat = { | 298 | static struct sh_mmcif_plat_data sh_mmcif_plat = { |
| 308 | .sup_pclk = 0, | 299 | .sup_pclk = 0, |
| 309 | .ocr = MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34, | 300 | .ocr = MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34, |
| @@ -311,7 +302,8 @@ static struct sh_mmcif_plat_data sh_mmcif_plat = { | |||
| 311 | MMC_CAP_8_BIT_DATA | | 302 | MMC_CAP_8_BIT_DATA | |
| 312 | MMC_CAP_NEEDS_POLL, | 303 | MMC_CAP_NEEDS_POLL, |
| 313 | .get_cd = slot_cn7_get_cd, | 304 | .get_cd = slot_cn7_get_cd, |
| 314 | .dma = &sh_mmcif_dma, | 305 | .slave_id_tx = SHDMA_SLAVE_MMCIF_TX, |
| 306 | .slave_id_rx = SHDMA_SLAVE_MMCIF_RX, | ||
| 315 | }; | 307 | }; |
| 316 | 308 | ||
| 317 | static struct platform_device sh_mmcif_device = { | 309 | static struct platform_device sh_mmcif_device = { |
diff --git a/arch/arm/mach-shmobile/board-kota2.c b/arch/arm/mach-shmobile/board-kota2.c index 857ceeec1bb0..c8e7ca23fc06 100644 --- a/arch/arm/mach-shmobile/board-kota2.c +++ b/arch/arm/mach-shmobile/board-kota2.c | |||
| @@ -143,11 +143,10 @@ static struct gpio_keys_button gpio_buttons[] = { | |||
| 143 | static struct gpio_keys_platform_data gpio_key_info = { | 143 | static struct gpio_keys_platform_data gpio_key_info = { |
| 144 | .buttons = gpio_buttons, | 144 | .buttons = gpio_buttons, |
| 145 | .nbuttons = ARRAY_SIZE(gpio_buttons), | 145 | .nbuttons = ARRAY_SIZE(gpio_buttons), |
| 146 | .poll_interval = 250, /* polled for now */ | ||
| 147 | }; | 146 | }; |
| 148 | 147 | ||
| 149 | static struct platform_device gpio_keys_device = { | 148 | static struct platform_device gpio_keys_device = { |
| 150 | .name = "gpio-keys-polled", /* polled for now */ | 149 | .name = "gpio-keys", |
| 151 | .id = -1, | 150 | .id = -1, |
| 152 | .dev = { | 151 | .dev = { |
| 153 | .platform_data = &gpio_key_info, | 152 | .platform_data = &gpio_key_info, |
diff --git a/arch/arm/mach-shmobile/board-mackerel.c b/arch/arm/mach-shmobile/board-mackerel.c index 9b42fbd10f8e..a2813247b455 100644 --- a/arch/arm/mach-shmobile/board-mackerel.c +++ b/arch/arm/mach-shmobile/board-mackerel.c | |||
| @@ -43,7 +43,6 @@ | |||
| 43 | #include <linux/smsc911x.h> | 43 | #include <linux/smsc911x.h> |
| 44 | #include <linux/sh_intc.h> | 44 | #include <linux/sh_intc.h> |
| 45 | #include <linux/tca6416_keypad.h> | 45 | #include <linux/tca6416_keypad.h> |
| 46 | #include <linux/usb/r8a66597.h> | ||
| 47 | #include <linux/usb/renesas_usbhs.h> | 46 | #include <linux/usb/renesas_usbhs.h> |
| 48 | #include <linux/dma-mapping.h> | 47 | #include <linux/dma-mapping.h> |
| 49 | 48 | ||
| @@ -145,11 +144,6 @@ | |||
| 145 | * 1-2 short | VBUS 5V | Host | 144 | * 1-2 short | VBUS 5V | Host |
| 146 | * open | external VBUS | Function | 145 | * open | external VBUS | Function |
| 147 | * | 146 | * |
| 148 | * *1 | ||
| 149 | * CN31 is used as | ||
| 150 | * CONFIG_USB_R8A66597_HCD Host | ||
| 151 | * CONFIG_USB_RENESAS_USBHS Function | ||
| 152 | * | ||
| 153 | * CAUTION | 147 | * CAUTION |
| 154 | * | 148 | * |
| 155 | * renesas_usbhs driver can use external interrupt mode | 149 | * renesas_usbhs driver can use external interrupt mode |
| @@ -161,15 +155,6 @@ | |||
| 161 | * mackerel can not use external interrupt (IRQ7-PORT167) mode on "USB0", | 155 | * mackerel can not use external interrupt (IRQ7-PORT167) mode on "USB0", |
| 162 | * because Touchscreen is using IRQ7-PORT40. | 156 | * because Touchscreen is using IRQ7-PORT40. |
| 163 | * It is impossible to use IRQ7 demux on this board. | 157 | * It is impossible to use IRQ7 demux on this board. |
| 164 | * | ||
| 165 | * We can use external interrupt mode USB-Function on "USB1". | ||
| 166 | * USB1 can become Host by r8a66597, and become Function by renesas_usbhs. | ||
| 167 | * But don't select both drivers in same time. | ||
| 168 | * These uses same IRQ number for request_irq(), and aren't supporting | ||
| 169 | * IRQF_SHARED / IORESOURCE_IRQ_SHAREABLE. | ||
| 170 | * | ||
| 171 | * Actually these are old/new version of USB driver. | ||
| 172 | * This mean its register will be broken if it supports shared IRQ, | ||
| 173 | */ | 158 | */ |
| 174 | 159 | ||
| 175 | /* | 160 | /* |
| @@ -208,6 +193,16 @@ | |||
| 208 | */ | 193 | */ |
| 209 | 194 | ||
| 210 | /* | 195 | /* |
| 196 | * FSI - AK4642 | ||
| 197 | * | ||
| 198 | * it needs amixer settings for playing | ||
| 199 | * | ||
| 200 | * amixer set "Headphone" on | ||
| 201 | * amixer set "HPOUTL Mixer DACH" on | ||
| 202 | * amixer set "HPOUTR Mixer DACH" on | ||
| 203 | */ | ||
| 204 | |||
| 205 | /* | ||
| 211 | * FIXME !! | 206 | * FIXME !! |
| 212 | * | 207 | * |
| 213 | * gpio_no_direction | 208 | * gpio_no_direction |
| @@ -676,51 +671,16 @@ static struct platform_device usbhs0_device = { | |||
| 676 | * Use J30 to select between Host and Function. This setting | 671 | * Use J30 to select between Host and Function. This setting |
| 677 | * can however not be detected by software. Hotplug of USBHS1 | 672 | * can however not be detected by software. Hotplug of USBHS1 |
| 678 | * is provided via IRQ8. | 673 | * is provided via IRQ8. |
| 674 | * | ||
| 675 | * Current USB1 works as "USB Host". | ||
| 676 | * - set J30 "short" | ||
| 677 | * | ||
| 678 | * If you want to use it as "USB gadget", | ||
| 679 | * - J30 "open" | ||
| 680 | * - modify usbhs1_get_id() USBHS_HOST -> USBHS_GADGET | ||
| 681 | * - add .get_vbus = usbhs_get_vbus in usbhs1_private | ||
| 679 | */ | 682 | */ |
| 680 | #define IRQ8 evt2irq(0x0300) | 683 | #define IRQ8 evt2irq(0x0300) |
| 681 | |||
| 682 | /* USBHS1 USB Host support via r8a66597_hcd */ | ||
| 683 | static void usb1_host_port_power(int port, int power) | ||
| 684 | { | ||
| 685 | if (!power) /* only power-on is supported for now */ | ||
| 686 | return; | ||
| 687 | |||
| 688 | /* set VBOUT/PWEN and EXTLP1 in DVSTCTR */ | ||
| 689 | __raw_writew(__raw_readw(0xE68B0008) | 0x600, 0xE68B0008); | ||
| 690 | } | ||
| 691 | |||
| 692 | static struct r8a66597_platdata usb1_host_data = { | ||
| 693 | .on_chip = 1, | ||
| 694 | .port_power = usb1_host_port_power, | ||
| 695 | }; | ||
| 696 | |||
| 697 | static struct resource usb1_host_resources[] = { | ||
| 698 | [0] = { | ||
| 699 | .name = "USBHS1", | ||
| 700 | .start = 0xe68b0000, | ||
| 701 | .end = 0xe68b00e6 - 1, | ||
| 702 | .flags = IORESOURCE_MEM, | ||
| 703 | }, | ||
| 704 | [1] = { | ||
| 705 | .start = evt2irq(0x1ce0) /* USB1_USB1I0 */, | ||
| 706 | .flags = IORESOURCE_IRQ, | ||
| 707 | }, | ||
| 708 | }; | ||
| 709 | |||
| 710 | static struct platform_device usb1_host_device = { | ||
| 711 | .name = "r8a66597_hcd", | ||
| 712 | .id = 1, | ||
| 713 | .dev = { | ||
| 714 | .dma_mask = NULL, /* not use dma */ | ||
| 715 | .coherent_dma_mask = 0xffffffff, | ||
| 716 | .platform_data = &usb1_host_data, | ||
| 717 | }, | ||
| 718 | .num_resources = ARRAY_SIZE(usb1_host_resources), | ||
| 719 | .resource = usb1_host_resources, | ||
| 720 | }; | ||
| 721 | |||
| 722 | /* USBHS1 USB Function support via renesas_usbhs */ | ||
| 723 | |||
| 724 | #define USB_PHY_MODE (1 << 4) | 684 | #define USB_PHY_MODE (1 << 4) |
| 725 | #define USB_PHY_INT_EN ((1 << 3) | (1 << 2)) | 685 | #define USB_PHY_INT_EN ((1 << 3) | (1 << 2)) |
| 726 | #define USB_PHY_ON (1 << 1) | 686 | #define USB_PHY_ON (1 << 1) |
| @@ -776,7 +736,7 @@ static void usbhs1_hardware_exit(struct platform_device *pdev) | |||
| 776 | 736 | ||
| 777 | static int usbhs1_get_id(struct platform_device *pdev) | 737 | static int usbhs1_get_id(struct platform_device *pdev) |
| 778 | { | 738 | { |
| 779 | return USBHS_GADGET; | 739 | return USBHS_HOST; |
| 780 | } | 740 | } |
| 781 | 741 | ||
| 782 | static u32 usbhs1_pipe_cfg[] = { | 742 | static u32 usbhs1_pipe_cfg[] = { |
| @@ -807,7 +767,6 @@ static struct usbhs_private usbhs1_private = { | |||
| 807 | .hardware_exit = usbhs1_hardware_exit, | 767 | .hardware_exit = usbhs1_hardware_exit, |
| 808 | .get_id = usbhs1_get_id, | 768 | .get_id = usbhs1_get_id, |
| 809 | .phy_reset = usbhs_phy_reset, | 769 | .phy_reset = usbhs_phy_reset, |
| 810 | .get_vbus = usbhs_get_vbus, | ||
| 811 | }, | 770 | }, |
| 812 | .driver_param = { | 771 | .driver_param = { |
| 813 | .buswait_bwait = 4, | 772 | .buswait_bwait = 4, |
| @@ -1184,15 +1143,6 @@ static struct resource sh_mmcif_resources[] = { | |||
| 1184 | }, | 1143 | }, |
| 1185 | }; | 1144 | }; |
| 1186 | 1145 | ||
| 1187 | static struct sh_mmcif_dma sh_mmcif_dma = { | ||
| 1188 | .chan_priv_rx = { | ||
| 1189 | .slave_id = SHDMA_SLAVE_MMCIF_RX, | ||
| 1190 | }, | ||
| 1191 | .chan_priv_tx = { | ||
| 1192 | .slave_id = SHDMA_SLAVE_MMCIF_TX, | ||
| 1193 | }, | ||
| 1194 | }; | ||
| 1195 | |||
| 1196 | static struct sh_mmcif_plat_data sh_mmcif_plat = { | 1146 | static struct sh_mmcif_plat_data sh_mmcif_plat = { |
| 1197 | .sup_pclk = 0, | 1147 | .sup_pclk = 0, |
| 1198 | .ocr = MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34, | 1148 | .ocr = MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34, |
| @@ -1200,7 +1150,8 @@ static struct sh_mmcif_plat_data sh_mmcif_plat = { | |||
| 1200 | MMC_CAP_8_BIT_DATA | | 1150 | MMC_CAP_8_BIT_DATA | |
| 1201 | MMC_CAP_NEEDS_POLL, | 1151 | MMC_CAP_NEEDS_POLL, |
| 1202 | .get_cd = slot_cn7_get_cd, | 1152 | .get_cd = slot_cn7_get_cd, |
| 1203 | .dma = &sh_mmcif_dma, | 1153 | .slave_id_tx = SHDMA_SLAVE_MMCIF_TX, |
| 1154 | .slave_id_rx = SHDMA_SLAVE_MMCIF_RX, | ||
| 1204 | }; | 1155 | }; |
| 1205 | 1156 | ||
| 1206 | static struct platform_device sh_mmcif_device = { | 1157 | static struct platform_device sh_mmcif_device = { |
| @@ -1311,7 +1262,6 @@ static struct platform_device *mackerel_devices[] __initdata = { | |||
| 1311 | &nor_flash_device, | 1262 | &nor_flash_device, |
| 1312 | &smc911x_device, | 1263 | &smc911x_device, |
| 1313 | &lcdc_device, | 1264 | &lcdc_device, |
| 1314 | &usb1_host_device, | ||
| 1315 | &usbhs1_device, | 1265 | &usbhs1_device, |
| 1316 | &usbhs0_device, | 1266 | &usbhs0_device, |
| 1317 | &leds_device, | 1267 | &leds_device, |
| @@ -1473,9 +1423,6 @@ static void __init mackerel_init(void) | |||
| 1473 | gpio_pull_down(GPIO_PORT167CR); /* VBUS0_1 pull down */ | 1423 | gpio_pull_down(GPIO_PORT167CR); /* VBUS0_1 pull down */ |
| 1474 | gpio_request(GPIO_FN_IDIN_1_113, NULL); | 1424 | gpio_request(GPIO_FN_IDIN_1_113, NULL); |
| 1475 | 1425 | ||
| 1476 | /* USB phy tweak to make the r8a66597_hcd host driver work */ | ||
| 1477 | __raw_writew(0x8a0a, 0xe6058130); /* USBCR4 */ | ||
| 1478 | |||
| 1479 | /* enable FSI2 port A (ak4643) */ | 1426 | /* enable FSI2 port A (ak4643) */ |
| 1480 | gpio_request(GPIO_FN_FSIAIBT, NULL); | 1427 | gpio_request(GPIO_FN_FSIAIBT, NULL); |
| 1481 | gpio_request(GPIO_FN_FSIAILR, NULL); | 1428 | gpio_request(GPIO_FN_FSIAILR, NULL); |
diff --git a/arch/arm/mach-shmobile/clock-sh73a0.c b/arch/arm/mach-shmobile/clock-sh73a0.c index afbead6a6e17..7727cca6136c 100644 --- a/arch/arm/mach-shmobile/clock-sh73a0.c +++ b/arch/arm/mach-shmobile/clock-sh73a0.c | |||
| @@ -365,6 +365,114 @@ static struct clk div6_clks[DIV6_NR] = { | |||
| 365 | dsi_parent, ARRAY_SIZE(dsi_parent), 12, 3), | 365 | dsi_parent, ARRAY_SIZE(dsi_parent), 12, 3), |
| 366 | }; | 366 | }; |
| 367 | 367 | ||
| 368 | /* DSI DIV */ | ||
| 369 | static unsigned long dsiphy_recalc(struct clk *clk) | ||
| 370 | { | ||
| 371 | u32 value; | ||
| 372 | |||
| 373 | value = __raw_readl(clk->mapping->base); | ||
| 374 | |||
| 375 | /* FIXME */ | ||
| 376 | if (!(value & 0x000B8000)) | ||
| 377 | return clk->parent->rate; | ||
| 378 | |||
| 379 | value &= 0x3f; | ||
| 380 | value += 1; | ||
| 381 | |||
| 382 | if ((value < 12) || | ||
| 383 | (value > 33)) { | ||
| 384 | pr_err("DSIPHY has wrong value (%d)", value); | ||
| 385 | return 0; | ||
| 386 | } | ||
| 387 | |||
| 388 | return clk->parent->rate / value; | ||
| 389 | } | ||
| 390 | |||
| 391 | static long dsiphy_round_rate(struct clk *clk, unsigned long rate) | ||
| 392 | { | ||
| 393 | return clk_rate_mult_range_round(clk, 12, 33, rate); | ||
| 394 | } | ||
| 395 | |||
| 396 | static void dsiphy_disable(struct clk *clk) | ||
| 397 | { | ||
| 398 | u32 value; | ||
| 399 | |||
| 400 | value = __raw_readl(clk->mapping->base); | ||
| 401 | value &= ~0x000B8000; | ||
| 402 | |||
| 403 | __raw_writel(value , clk->mapping->base); | ||
| 404 | } | ||
| 405 | |||
| 406 | static int dsiphy_enable(struct clk *clk) | ||
| 407 | { | ||
| 408 | u32 value; | ||
| 409 | int multi; | ||
| 410 | |||
| 411 | value = __raw_readl(clk->mapping->base); | ||
| 412 | multi = (value & 0x3f) + 1; | ||
| 413 | |||
| 414 | if ((multi < 12) || (multi > 33)) | ||
| 415 | return -EIO; | ||
| 416 | |||
| 417 | __raw_writel(value | 0x000B8000, clk->mapping->base); | ||
| 418 | |||
| 419 | return 0; | ||
| 420 | } | ||
| 421 | |||
| 422 | static int dsiphy_set_rate(struct clk *clk, unsigned long rate) | ||
| 423 | { | ||
| 424 | u32 value; | ||
| 425 | int idx; | ||
| 426 | |||
| 427 | idx = rate / clk->parent->rate; | ||
| 428 | if ((idx < 12) || (idx > 33)) | ||
| 429 | return -EINVAL; | ||
| 430 | |||
| 431 | idx += -1; | ||
| 432 | |||
| 433 | value = __raw_readl(clk->mapping->base); | ||
| 434 | value = (value & ~0x3f) + idx; | ||
| 435 | |||
| 436 | __raw_writel(value, clk->mapping->base); | ||
| 437 | |||
| 438 | return 0; | ||
| 439 | } | ||
| 440 | |||
| 441 | static struct clk_ops dsiphy_clk_ops = { | ||
| 442 | .recalc = dsiphy_recalc, | ||
| 443 | .round_rate = dsiphy_round_rate, | ||
| 444 | .set_rate = dsiphy_set_rate, | ||
| 445 | .enable = dsiphy_enable, | ||
| 446 | .disable = dsiphy_disable, | ||
| 447 | }; | ||
| 448 | |||
| 449 | static struct clk_mapping dsi0phy_clk_mapping = { | ||
| 450 | .phys = DSI0PHYCR, | ||
| 451 | .len = 4, | ||
| 452 | }; | ||
| 453 | |||
| 454 | static struct clk_mapping dsi1phy_clk_mapping = { | ||
| 455 | .phys = DSI1PHYCR, | ||
| 456 | .len = 4, | ||
| 457 | }; | ||
| 458 | |||
| 459 | static struct clk dsi0phy_clk = { | ||
| 460 | .ops = &dsiphy_clk_ops, | ||
| 461 | .parent = &div6_clks[DIV6_DSI0P], /* late install */ | ||
| 462 | .mapping = &dsi0phy_clk_mapping, | ||
| 463 | }; | ||
| 464 | |||
| 465 | static struct clk dsi1phy_clk = { | ||
| 466 | .ops = &dsiphy_clk_ops, | ||
| 467 | .parent = &div6_clks[DIV6_DSI1P], /* late install */ | ||
| 468 | .mapping = &dsi1phy_clk_mapping, | ||
| 469 | }; | ||
| 470 | |||
| 471 | static struct clk *late_main_clks[] = { | ||
| 472 | &dsi0phy_clk, | ||
| 473 | &dsi1phy_clk, | ||
| 474 | }; | ||
| 475 | |||
| 368 | enum { MSTP001, | 476 | enum { MSTP001, |
| 369 | MSTP129, MSTP128, MSTP127, MSTP126, MSTP125, MSTP118, MSTP116, MSTP100, | 477 | MSTP129, MSTP128, MSTP127, MSTP126, MSTP125, MSTP118, MSTP116, MSTP100, |
| 370 | MSTP219, | 478 | MSTP219, |
| @@ -429,6 +537,8 @@ static struct clk_lookup lookups[] = { | |||
| 429 | CLKDEV_ICK_ID("dsit_clk", "sh-mipi-dsi.1", &div6_clks[DIV6_DSIT]), | 537 | CLKDEV_ICK_ID("dsit_clk", "sh-mipi-dsi.1", &div6_clks[DIV6_DSIT]), |
| 430 | CLKDEV_ICK_ID("dsip_clk", "sh-mipi-dsi.0", &div6_clks[DIV6_DSI0P]), | 538 | CLKDEV_ICK_ID("dsip_clk", "sh-mipi-dsi.0", &div6_clks[DIV6_DSI0P]), |
| 431 | CLKDEV_ICK_ID("dsip_clk", "sh-mipi-dsi.1", &div6_clks[DIV6_DSI1P]), | 539 | CLKDEV_ICK_ID("dsip_clk", "sh-mipi-dsi.1", &div6_clks[DIV6_DSI1P]), |
| 540 | CLKDEV_ICK_ID("dsiphy_clk", "sh-mipi-dsi.0", &dsi0phy_clk), | ||
| 541 | CLKDEV_ICK_ID("dsiphy_clk", "sh-mipi-dsi.1", &dsi1phy_clk), | ||
| 432 | 542 | ||
| 433 | /* MSTP32 clocks */ | 543 | /* MSTP32 clocks */ |
| 434 | CLKDEV_DEV_ID("i2c-sh_mobile.2", &mstp_clks[MSTP001]), /* I2C2 */ | 544 | CLKDEV_DEV_ID("i2c-sh_mobile.2", &mstp_clks[MSTP001]), /* I2C2 */ |
| @@ -504,6 +614,9 @@ void __init sh73a0_clock_init(void) | |||
| 504 | if (!ret) | 614 | if (!ret) |
| 505 | ret = sh_clk_mstp32_register(mstp_clks, MSTP_NR); | 615 | ret = sh_clk_mstp32_register(mstp_clks, MSTP_NR); |
| 506 | 616 | ||
| 617 | for (k = 0; !ret && (k < ARRAY_SIZE(late_main_clks)); k++) | ||
| 618 | ret = clk_register(late_main_clks[k]); | ||
| 619 | |||
| 507 | clkdev_add_table(lookups, ARRAY_SIZE(lookups)); | 620 | clkdev_add_table(lookups, ARRAY_SIZE(lookups)); |
| 508 | 621 | ||
| 509 | if (!ret) | 622 | if (!ret) |
diff --git a/arch/arm/mach-shmobile/include/mach/sh73a0.h b/arch/arm/mach-shmobile/include/mach/sh73a0.h index 881d515a9686..cad57578ceed 100644 --- a/arch/arm/mach-shmobile/include/mach/sh73a0.h +++ b/arch/arm/mach-shmobile/include/mach/sh73a0.h | |||
| @@ -515,8 +515,8 @@ enum { | |||
| 515 | SHDMA_SLAVE_MMCIF_RX, | 515 | SHDMA_SLAVE_MMCIF_RX, |
| 516 | }; | 516 | }; |
| 517 | 517 | ||
| 518 | /* PINT interrupts are located at Linux IRQ 768 and up */ | 518 | /* PINT interrupts are located at Linux IRQ 800 and up */ |
| 519 | #define SH73A0_PINT0_IRQ(irq) ((irq) + 768) | 519 | #define SH73A0_PINT0_IRQ(irq) ((irq) + 800) |
| 520 | #define SH73A0_PINT1_IRQ(irq) ((irq) + 800) | 520 | #define SH73A0_PINT1_IRQ(irq) ((irq) + 832) |
| 521 | 521 | ||
| 522 | #endif /* __ASM_SH73A0_H__ */ | 522 | #endif /* __ASM_SH73A0_H__ */ |
diff --git a/arch/arm/mach-shmobile/intc-sh73a0.c b/arch/arm/mach-shmobile/intc-sh73a0.c index 1eda6b0b69e3..9857595eaa79 100644 --- a/arch/arm/mach-shmobile/intc-sh73a0.c +++ b/arch/arm/mach-shmobile/intc-sh73a0.c | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | #include <linux/kernel.h> | 19 | #include <linux/kernel.h> |
| 20 | #include <linux/init.h> | 20 | #include <linux/init.h> |
| 21 | #include <linux/interrupt.h> | 21 | #include <linux/interrupt.h> |
| 22 | #include <linux/module.h> | ||
| 22 | #include <linux/irq.h> | 23 | #include <linux/irq.h> |
| 23 | #include <linux/io.h> | 24 | #include <linux/io.h> |
| 24 | #include <linux/sh_intc.h> | 25 | #include <linux/sh_intc.h> |
| @@ -445,6 +446,7 @@ void __init sh73a0_init_irq(void) | |||
| 445 | setup_irq(gic_spi(1 + k), &sh73a0_irq_pin_cascade[k]); | 446 | setup_irq(gic_spi(1 + k), &sh73a0_irq_pin_cascade[k]); |
| 446 | 447 | ||
| 447 | n = intcs_evt2irq(to_intc_vect(gic_spi(1 + k))); | 448 | n = intcs_evt2irq(to_intc_vect(gic_spi(1 + k))); |
| 449 | WARN_ON(irq_alloc_desc_at(n, numa_node_id()) != n); | ||
| 448 | irq_set_chip_and_handler_name(n, &intca_gic_irq_chip, | 450 | irq_set_chip_and_handler_name(n, &intca_gic_irq_chip, |
| 449 | handle_level_irq, "level"); | 451 | handle_level_irq, "level"); |
| 450 | set_irq_flags(n, IRQF_VALID); /* yuck */ | 452 | set_irq_flags(n, IRQF_VALID); /* yuck */ |
diff --git a/arch/arm/mach-shmobile/pfc-r8a7779.c b/arch/arm/mach-shmobile/pfc-r8a7779.c index 963532f2b2c4..d14c9b048077 100644 --- a/arch/arm/mach-shmobile/pfc-r8a7779.c +++ b/arch/arm/mach-shmobile/pfc-r8a7779.c | |||
| @@ -2120,7 +2120,7 @@ static struct pinmux_cfg_reg pinmux_config_regs[] = { | |||
| 2120 | FN_AUDATA3, 0, 0, 0 } | 2120 | FN_AUDATA3, 0, 0, 0 } |
| 2121 | }, | 2121 | }, |
| 2122 | { PINMUX_CFG_REG_VAR("IPSR4", 0xfffc0030, 32, | 2122 | { PINMUX_CFG_REG_VAR("IPSR4", 0xfffc0030, 32, |
| 2123 | 3, 1, 1, 1, 1, 1, 1, 3, 3, 1, | 2123 | 3, 1, 1, 1, 1, 1, 1, 3, 3, |
| 2124 | 1, 1, 1, 1, 1, 1, 3, 3, 3, 2) { | 2124 | 1, 1, 1, 1, 1, 1, 3, 3, 3, 2) { |
| 2125 | /* IP4_31_29 [3] */ | 2125 | /* IP4_31_29 [3] */ |
| 2126 | FN_DU1_DB0, FN_VI2_DATA4_VI2_B4, FN_SCL2_B, FN_SD3_DAT0, | 2126 | FN_DU1_DB0, FN_VI2_DATA4_VI2_B4, FN_SCL2_B, FN_SD3_DAT0, |
diff --git a/arch/arm/mach-shmobile/pfc-sh7372.c b/arch/arm/mach-shmobile/pfc-sh7372.c index 1bd6585a6acf..336093f9210a 100644 --- a/arch/arm/mach-shmobile/pfc-sh7372.c +++ b/arch/arm/mach-shmobile/pfc-sh7372.c | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | #include <linux/init.h> | 23 | #include <linux/init.h> |
| 24 | #include <linux/kernel.h> | 24 | #include <linux/kernel.h> |
| 25 | #include <linux/gpio.h> | 25 | #include <linux/gpio.h> |
| 26 | #include <mach/irqs.h> | ||
| 26 | #include <mach/sh7372.h> | 27 | #include <mach/sh7372.h> |
| 27 | 28 | ||
| 28 | #define CPU_ALL_PORT(fn, pfx, sfx) \ | 29 | #define CPU_ALL_PORT(fn, pfx, sfx) \ |
| @@ -1594,6 +1595,43 @@ static struct pinmux_data_reg pinmux_data_regs[] = { | |||
| 1594 | { }, | 1595 | { }, |
| 1595 | }; | 1596 | }; |
| 1596 | 1597 | ||
| 1598 | #define EXT_IRQ16L(n) evt2irq(0x200 + ((n) << 5)) | ||
| 1599 | #define EXT_IRQ16H(n) evt2irq(0x3200 + (((n) - 16) << 5)) | ||
| 1600 | static struct pinmux_irq pinmux_irqs[] = { | ||
| 1601 | PINMUX_IRQ(EXT_IRQ16L(0), PORT6_FN0, PORT162_FN0), | ||
| 1602 | PINMUX_IRQ(EXT_IRQ16L(1), PORT12_FN0), | ||
| 1603 | PINMUX_IRQ(EXT_IRQ16L(2), PORT4_FN0, PORT5_FN0), | ||
| 1604 | PINMUX_IRQ(EXT_IRQ16L(3), PORT8_FN0, PORT16_FN0), | ||
| 1605 | PINMUX_IRQ(EXT_IRQ16L(4), PORT17_FN0, PORT163_FN0), | ||
| 1606 | PINMUX_IRQ(EXT_IRQ16L(5), PORT18_FN0), | ||
| 1607 | PINMUX_IRQ(EXT_IRQ16L(6), PORT39_FN0, PORT164_FN0), | ||
| 1608 | PINMUX_IRQ(EXT_IRQ16L(7), PORT40_FN0, PORT167_FN0), | ||
| 1609 | PINMUX_IRQ(EXT_IRQ16L(8), PORT41_FN0, PORT168_FN0), | ||
| 1610 | PINMUX_IRQ(EXT_IRQ16L(9), PORT42_FN0, PORT169_FN0), | ||
| 1611 | PINMUX_IRQ(EXT_IRQ16L(10), PORT65_FN0), | ||
| 1612 | PINMUX_IRQ(EXT_IRQ16L(11), PORT67_FN0), | ||
| 1613 | PINMUX_IRQ(EXT_IRQ16L(12), PORT80_FN0, PORT137_FN0), | ||
| 1614 | PINMUX_IRQ(EXT_IRQ16L(13), PORT81_FN0, PORT145_FN0), | ||
| 1615 | PINMUX_IRQ(EXT_IRQ16L(14), PORT82_FN0, PORT146_FN0), | ||
| 1616 | PINMUX_IRQ(EXT_IRQ16L(15), PORT83_FN0, PORT147_FN0), | ||
| 1617 | PINMUX_IRQ(EXT_IRQ16H(16), PORT84_FN0, PORT170_FN0), | ||
| 1618 | PINMUX_IRQ(EXT_IRQ16H(17), PORT85_FN0), | ||
| 1619 | PINMUX_IRQ(EXT_IRQ16H(18), PORT86_FN0), | ||
| 1620 | PINMUX_IRQ(EXT_IRQ16H(19), PORT87_FN0), | ||
| 1621 | PINMUX_IRQ(EXT_IRQ16H(20), PORT92_FN0), | ||
| 1622 | PINMUX_IRQ(EXT_IRQ16H(21), PORT93_FN0), | ||
| 1623 | PINMUX_IRQ(EXT_IRQ16H(22), PORT94_FN0), | ||
| 1624 | PINMUX_IRQ(EXT_IRQ16H(23), PORT95_FN0), | ||
| 1625 | PINMUX_IRQ(EXT_IRQ16H(24), PORT112_FN0), | ||
| 1626 | PINMUX_IRQ(EXT_IRQ16H(25), PORT119_FN0), | ||
| 1627 | PINMUX_IRQ(EXT_IRQ16H(26), PORT121_FN0, PORT172_FN0), | ||
| 1628 | PINMUX_IRQ(EXT_IRQ16H(27), PORT122_FN0, PORT180_FN0), | ||
| 1629 | PINMUX_IRQ(EXT_IRQ16H(28), PORT123_FN0, PORT181_FN0), | ||
| 1630 | PINMUX_IRQ(EXT_IRQ16H(29), PORT129_FN0, PORT182_FN0), | ||
| 1631 | PINMUX_IRQ(EXT_IRQ16H(30), PORT130_FN0, PORT183_FN0), | ||
| 1632 | PINMUX_IRQ(EXT_IRQ16H(31), PORT138_FN0, PORT184_FN0), | ||
| 1633 | }; | ||
| 1634 | |||
| 1597 | static struct pinmux_info sh7372_pinmux_info = { | 1635 | static struct pinmux_info sh7372_pinmux_info = { |
| 1598 | .name = "sh7372_pfc", | 1636 | .name = "sh7372_pfc", |
| 1599 | .reserved_id = PINMUX_RESERVED, | 1637 | .reserved_id = PINMUX_RESERVED, |
| @@ -1614,6 +1652,9 @@ static struct pinmux_info sh7372_pinmux_info = { | |||
| 1614 | 1652 | ||
| 1615 | .gpio_data = pinmux_data, | 1653 | .gpio_data = pinmux_data, |
| 1616 | .gpio_data_size = ARRAY_SIZE(pinmux_data), | 1654 | .gpio_data_size = ARRAY_SIZE(pinmux_data), |
| 1655 | |||
| 1656 | .gpio_irq = pinmux_irqs, | ||
| 1657 | .gpio_irq_size = ARRAY_SIZE(pinmux_irqs), | ||
| 1617 | }; | 1658 | }; |
| 1618 | 1659 | ||
| 1619 | void sh7372_pinmux_init(void) | 1660 | void sh7372_pinmux_init(void) |
diff --git a/arch/arm/mach-shmobile/smp-sh73a0.c b/arch/arm/mach-shmobile/smp-sh73a0.c index 0d159d64a345..2d0d4212be41 100644 --- a/arch/arm/mach-shmobile/smp-sh73a0.c +++ b/arch/arm/mach-shmobile/smp-sh73a0.c | |||
| @@ -80,7 +80,7 @@ int __cpuinit sh73a0_boot_secondary(unsigned int cpu) | |||
| 80 | /* enable cache coherency */ | 80 | /* enable cache coherency */ |
| 81 | modify_scu_cpu_psr(0, 3 << (cpu * 8)); | 81 | modify_scu_cpu_psr(0, 3 << (cpu * 8)); |
| 82 | 82 | ||
| 83 | if (((__raw_readw(__io(PSTR)) >> (4 * cpu)) & 3) == 3) | 83 | if (((__raw_readl(__io(PSTR)) >> (4 * cpu)) & 3) == 3) |
| 84 | __raw_writel(1 << cpu, __io(WUPCR)); /* wake up */ | 84 | __raw_writel(1 << cpu, __io(WUPCR)); /* wake up */ |
| 85 | else | 85 | else |
| 86 | __raw_writel(1 << cpu, __io(SRESCR)); /* reset */ | 86 | __raw_writel(1 << cpu, __io(SRESCR)); /* reset */ |
diff --git a/arch/arm/mach-tegra/board-paz00.c b/arch/arm/mach-tegra/board-paz00.c index fcf4f377b1dc..330afdfa2475 100644 --- a/arch/arm/mach-tegra/board-paz00.c +++ b/arch/arm/mach-tegra/board-paz00.c | |||
| @@ -60,9 +60,9 @@ static struct plat_serial8250_port debug_uart_platform_data[] = { | |||
| 60 | .uartclk = 216000000, | 60 | .uartclk = 216000000, |
| 61 | }, { | 61 | }, { |
| 62 | /* serial port on mini-pcie */ | 62 | /* serial port on mini-pcie */ |
| 63 | .membase = IO_ADDRESS(TEGRA_UARTD_BASE), | 63 | .membase = IO_ADDRESS(TEGRA_UARTC_BASE), |
| 64 | .mapbase = TEGRA_UARTD_BASE, | 64 | .mapbase = TEGRA_UARTC_BASE, |
| 65 | .irq = INT_UARTD, | 65 | .irq = INT_UARTC, |
| 66 | .flags = UPF_BOOT_AUTOCONF | UPF_FIXED_TYPE, | 66 | .flags = UPF_BOOT_AUTOCONF | UPF_FIXED_TYPE, |
| 67 | .type = PORT_TEGRA, | 67 | .type = PORT_TEGRA, |
| 68 | .iotype = UPIO_MEM, | 68 | .iotype = UPIO_MEM, |
| @@ -174,7 +174,7 @@ static void __init tegra_paz00_fixup(struct tag *tags, char **cmdline, | |||
| 174 | static __initdata struct tegra_clk_init_table paz00_clk_init_table[] = { | 174 | static __initdata struct tegra_clk_init_table paz00_clk_init_table[] = { |
| 175 | /* name parent rate enabled */ | 175 | /* name parent rate enabled */ |
| 176 | { "uarta", "pll_p", 216000000, true }, | 176 | { "uarta", "pll_p", 216000000, true }, |
| 177 | { "uartd", "pll_p", 216000000, true }, | 177 | { "uartc", "pll_p", 216000000, true }, |
| 178 | 178 | ||
| 179 | { "pll_p_out4", "pll_p", 24000000, true }, | 179 | { "pll_p_out4", "pll_p", 24000000, true }, |
| 180 | { "usbd", "clk_m", 12000000, false }, | 180 | { "usbd", "clk_m", 12000000, false }, |
diff --git a/arch/arm/mach-tegra/board-paz00.h b/arch/arm/mach-tegra/board-paz00.h index ffa83f580db6..3c9f8da37ea3 100644 --- a/arch/arm/mach-tegra/board-paz00.h +++ b/arch/arm/mach-tegra/board-paz00.h | |||
| @@ -22,7 +22,7 @@ | |||
| 22 | /* SDCARD */ | 22 | /* SDCARD */ |
| 23 | #define TEGRA_GPIO_SD1_CD TEGRA_GPIO_PV5 | 23 | #define TEGRA_GPIO_SD1_CD TEGRA_GPIO_PV5 |
| 24 | #define TEGRA_GPIO_SD1_WP TEGRA_GPIO_PH1 | 24 | #define TEGRA_GPIO_SD1_WP TEGRA_GPIO_PH1 |
| 25 | #define TEGRA_GPIO_SD1_POWER TEGRA_GPIO_PT3 | 25 | #define TEGRA_GPIO_SD1_POWER TEGRA_GPIO_PV1 |
| 26 | 26 | ||
| 27 | /* ULPI */ | 27 | /* ULPI */ |
| 28 | #define TEGRA_ULPI_RST TEGRA_GPIO_PV0 | 28 | #define TEGRA_ULPI_RST TEGRA_GPIO_PV0 |
diff --git a/arch/arm/mach-tegra/include/mach/dma.h b/arch/arm/mach-tegra/include/mach/dma.h index d0132e8031a1..3c9339058bec 100644 --- a/arch/arm/mach-tegra/include/mach/dma.h +++ b/arch/arm/mach-tegra/include/mach/dma.h | |||
| @@ -23,11 +23,6 @@ | |||
| 23 | 23 | ||
| 24 | #include <linux/list.h> | 24 | #include <linux/list.h> |
| 25 | 25 | ||
| 26 | #if defined(CONFIG_TEGRA_SYSTEM_DMA) | ||
| 27 | |||
| 28 | struct tegra_dma_req; | ||
| 29 | struct tegra_dma_channel; | ||
| 30 | |||
| 31 | #define TEGRA_DMA_REQ_SEL_CNTR 0 | 26 | #define TEGRA_DMA_REQ_SEL_CNTR 0 |
| 32 | #define TEGRA_DMA_REQ_SEL_I2S_2 1 | 27 | #define TEGRA_DMA_REQ_SEL_I2S_2 1 |
| 33 | #define TEGRA_DMA_REQ_SEL_I2S_1 2 | 28 | #define TEGRA_DMA_REQ_SEL_I2S_1 2 |
| @@ -56,6 +51,11 @@ struct tegra_dma_channel; | |||
| 56 | #define TEGRA_DMA_REQ_SEL_OWR 25 | 51 | #define TEGRA_DMA_REQ_SEL_OWR 25 |
| 57 | #define TEGRA_DMA_REQ_SEL_INVALID 31 | 52 | #define TEGRA_DMA_REQ_SEL_INVALID 31 |
| 58 | 53 | ||
| 54 | #if defined(CONFIG_TEGRA_SYSTEM_DMA) | ||
| 55 | |||
| 56 | struct tegra_dma_req; | ||
| 57 | struct tegra_dma_channel; | ||
| 58 | |||
| 59 | enum tegra_dma_mode { | 59 | enum tegra_dma_mode { |
| 60 | TEGRA_DMA_SHARED = 1, | 60 | TEGRA_DMA_SHARED = 1, |
| 61 | TEGRA_DMA_MODE_CONTINOUS = 2, | 61 | TEGRA_DMA_MODE_CONTINOUS = 2, |
diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig index 1a3ca2488164..7edef9121632 100644 --- a/arch/arm/mm/Kconfig +++ b/arch/arm/mm/Kconfig | |||
| @@ -631,7 +631,8 @@ comment "Processor Features" | |||
| 631 | 631 | ||
| 632 | config ARM_LPAE | 632 | config ARM_LPAE |
| 633 | bool "Support for the Large Physical Address Extension" | 633 | bool "Support for the Large Physical Address Extension" |
| 634 | depends on MMU && CPU_V7 | 634 | depends on MMU && CPU_32v7 && !CPU_32v6 && !CPU_32v5 && \ |
| 635 | !CPU_32v4 && !CPU_32v3 | ||
| 635 | help | 636 | help |
| 636 | Say Y if you have an ARMv7 processor supporting the LPAE page | 637 | Say Y if you have an ARMv7 processor supporting the LPAE page |
| 637 | table format and you would like to access memory beyond the | 638 | table format and you would like to access memory beyond the |
diff --git a/arch/arm/mm/cache-v7.S b/arch/arm/mm/cache-v7.S index 07c4bc8ea0a4..a655d3da386d 100644 --- a/arch/arm/mm/cache-v7.S +++ b/arch/arm/mm/cache-v7.S | |||
| @@ -54,9 +54,15 @@ loop1: | |||
| 54 | and r1, r1, #7 @ mask of the bits for current cache only | 54 | and r1, r1, #7 @ mask of the bits for current cache only |
| 55 | cmp r1, #2 @ see what cache we have at this level | 55 | cmp r1, #2 @ see what cache we have at this level |
| 56 | blt skip @ skip if no cache, or just i-cache | 56 | blt skip @ skip if no cache, or just i-cache |
| 57 | #ifdef CONFIG_PREEMPT | ||
| 58 | save_and_disable_irqs_notrace r9 @ make cssr&csidr read atomic | ||
| 59 | #endif | ||
| 57 | mcr p15, 2, r10, c0, c0, 0 @ select current cache level in cssr | 60 | mcr p15, 2, r10, c0, c0, 0 @ select current cache level in cssr |
| 58 | isb @ isb to sych the new cssr&csidr | 61 | isb @ isb to sych the new cssr&csidr |
| 59 | mrc p15, 1, r1, c0, c0, 0 @ read the new csidr | 62 | mrc p15, 1, r1, c0, c0, 0 @ read the new csidr |
| 63 | #ifdef CONFIG_PREEMPT | ||
| 64 | restore_irqs_notrace r9 | ||
| 65 | #endif | ||
| 60 | and r2, r1, #7 @ extract the length of the cache lines | 66 | and r2, r1, #7 @ extract the length of the cache lines |
| 61 | add r2, r2, #4 @ add 4 (line length offset) | 67 | add r2, r2, #4 @ add 4 (line length offset) |
| 62 | ldr r4, =0x3ff | 68 | ldr r4, =0x3ff |
diff --git a/arch/arm/plat-omap/include/plat/omap-secure.h b/arch/arm/plat-omap/include/plat/omap-secure.h index 64f9d1c7f1bb..3047ff923a63 100644 --- a/arch/arm/plat-omap/include/plat/omap-secure.h +++ b/arch/arm/plat-omap/include/plat/omap-secure.h | |||
| @@ -3,7 +3,7 @@ | |||
| 3 | 3 | ||
| 4 | #include <linux/types.h> | 4 | #include <linux/types.h> |
| 5 | 5 | ||
| 6 | #ifdef CONFIG_ARCH_OMAP2PLUS | 6 | #if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP4) |
| 7 | extern int omap_secure_ram_reserve_memblock(void); | 7 | extern int omap_secure_ram_reserve_memblock(void); |
| 8 | #else | 8 | #else |
| 9 | static inline void omap_secure_ram_reserve_memblock(void) | 9 | static inline void omap_secure_ram_reserve_memblock(void) |
diff --git a/arch/arm/plat-orion/common.c b/arch/arm/plat-orion/common.c index e5a2fde29b19..089899a7db72 100644 --- a/arch/arm/plat-orion/common.c +++ b/arch/arm/plat-orion/common.c | |||
| @@ -789,10 +789,7 @@ void __init orion_xor1_init(unsigned long mapbase_low, | |||
| 789 | /***************************************************************************** | 789 | /***************************************************************************** |
| 790 | * EHCI | 790 | * EHCI |
| 791 | ****************************************************************************/ | 791 | ****************************************************************************/ |
| 792 | static struct orion_ehci_data orion_ehci_data = { | 792 | static struct orion_ehci_data orion_ehci_data; |
| 793 | .phy_version = EHCI_PHY_NA, | ||
| 794 | }; | ||
| 795 | |||
| 796 | static u64 ehci_dmamask = DMA_BIT_MASK(32); | 793 | static u64 ehci_dmamask = DMA_BIT_MASK(32); |
| 797 | 794 | ||
| 798 | 795 | ||
| @@ -812,8 +809,10 @@ static struct platform_device orion_ehci = { | |||
| 812 | }; | 809 | }; |
| 813 | 810 | ||
| 814 | void __init orion_ehci_init(unsigned long mapbase, | 811 | void __init orion_ehci_init(unsigned long mapbase, |
| 815 | unsigned long irq) | 812 | unsigned long irq, |
| 813 | enum orion_ehci_phy_ver phy_version) | ||
| 816 | { | 814 | { |
| 815 | orion_ehci_data.phy_version = phy_version; | ||
| 817 | fill_resources(&orion_ehci, orion_ehci_resources, mapbase, SZ_4K - 1, | 816 | fill_resources(&orion_ehci, orion_ehci_resources, mapbase, SZ_4K - 1, |
| 818 | irq); | 817 | irq); |
| 819 | 818 | ||
diff --git a/arch/arm/plat-orion/include/plat/common.h b/arch/arm/plat-orion/include/plat/common.h index 0fe08d77e835..a7fa005a5a0e 100644 --- a/arch/arm/plat-orion/include/plat/common.h +++ b/arch/arm/plat-orion/include/plat/common.h | |||
| @@ -89,7 +89,8 @@ void __init orion_xor1_init(unsigned long mapbase_low, | |||
| 89 | unsigned long irq_1); | 89 | unsigned long irq_1); |
| 90 | 90 | ||
| 91 | void __init orion_ehci_init(unsigned long mapbase, | 91 | void __init orion_ehci_init(unsigned long mapbase, |
| 92 | unsigned long irq); | 92 | unsigned long irq, |
| 93 | enum orion_ehci_phy_ver phy_version); | ||
| 93 | 94 | ||
| 94 | void __init orion_ehci_1_init(unsigned long mapbase, | 95 | void __init orion_ehci_1_init(unsigned long mapbase, |
| 95 | unsigned long irq); | 96 | unsigned long irq); |
diff --git a/arch/arm/plat-orion/mpp.c b/arch/arm/plat-orion/mpp.c index 91553432711d..3b1e17bd3d17 100644 --- a/arch/arm/plat-orion/mpp.c +++ b/arch/arm/plat-orion/mpp.c | |||
| @@ -64,8 +64,7 @@ void __init orion_mpp_conf(unsigned int *mpp_list, unsigned int variant_mask, | |||
| 64 | gpio_mode |= GPIO_INPUT_OK; | 64 | gpio_mode |= GPIO_INPUT_OK; |
| 65 | if (*mpp_list & MPP_OUTPUT_MASK) | 65 | if (*mpp_list & MPP_OUTPUT_MASK) |
| 66 | gpio_mode |= GPIO_OUTPUT_OK; | 66 | gpio_mode |= GPIO_OUTPUT_OK; |
| 67 | if (sel != 0) | 67 | |
| 68 | gpio_mode = 0; | ||
| 69 | orion_gpio_set_valid(num, gpio_mode); | 68 | orion_gpio_set_valid(num, gpio_mode); |
| 70 | } | 69 | } |
| 71 | 70 | ||
diff --git a/arch/arm/plat-samsung/devs.c b/arch/arm/plat-samsung/devs.c index 32a6e394db24..f10768e988d4 100644 --- a/arch/arm/plat-samsung/devs.c +++ b/arch/arm/plat-samsung/devs.c | |||
| @@ -468,8 +468,10 @@ void __init s3c_i2c0_set_platdata(struct s3c2410_platform_i2c *pd) | |||
| 468 | { | 468 | { |
| 469 | struct s3c2410_platform_i2c *npd; | 469 | struct s3c2410_platform_i2c *npd; |
| 470 | 470 | ||
| 471 | if (!pd) | 471 | if (!pd) { |
| 472 | pd = &default_i2c_data; | 472 | pd = &default_i2c_data; |
| 473 | pd->bus_num = 0; | ||
| 474 | } | ||
| 473 | 475 | ||
| 474 | npd = s3c_set_platdata(pd, sizeof(struct s3c2410_platform_i2c), | 476 | npd = s3c_set_platdata(pd, sizeof(struct s3c2410_platform_i2c), |
| 475 | &s3c_device_i2c0); | 477 | &s3c_device_i2c0); |
diff --git a/arch/c6x/boot/Makefile b/arch/c6x/boot/Makefile index ecca820e6041..6891257d514c 100644 --- a/arch/c6x/boot/Makefile +++ b/arch/c6x/boot/Makefile | |||
| @@ -13,7 +13,7 @@ obj-y += linked_dtb.o | |||
| 13 | endif | 13 | endif |
| 14 | 14 | ||
| 15 | $(obj)/%.dtb: $(src)/dts/%.dts FORCE | 15 | $(obj)/%.dtb: $(src)/dts/%.dts FORCE |
| 16 | $(call cmd,dtc) | 16 | $(call if_changed_dep,dtc) |
| 17 | 17 | ||
| 18 | quiet_cmd_cp = CP $< $@$2 | 18 | quiet_cmd_cp = CP $< $@$2 |
| 19 | cmd_cp = cat $< >$@$2 || (rm -f $@ && echo false) | 19 | cmd_cp = cat $< >$@$2 || (rm -f $@ && echo false) |
diff --git a/arch/m68k/include/asm/mcf_pgtable.h b/arch/m68k/include/asm/mcf_pgtable.h index 756bde4fb4f8..3c793682e5d9 100644 --- a/arch/m68k/include/asm/mcf_pgtable.h +++ b/arch/m68k/include/asm/mcf_pgtable.h | |||
| @@ -78,7 +78,8 @@ | |||
| 78 | | CF_PAGE_READABLE \ | 78 | | CF_PAGE_READABLE \ |
| 79 | | CF_PAGE_WRITABLE \ | 79 | | CF_PAGE_WRITABLE \ |
| 80 | | CF_PAGE_EXEC \ | 80 | | CF_PAGE_EXEC \ |
| 81 | | CF_PAGE_SYSTEM) | 81 | | CF_PAGE_SYSTEM \ |
| 82 | | CF_PAGE_SHARED) | ||
| 82 | 83 | ||
| 83 | #define PAGE_COPY __pgprot(CF_PAGE_VALID \ | 84 | #define PAGE_COPY __pgprot(CF_PAGE_VALID \ |
| 84 | | CF_PAGE_ACCESSED \ | 85 | | CF_PAGE_ACCESSED \ |
diff --git a/arch/m68k/mm/mcfmmu.c b/arch/m68k/mm/mcfmmu.c index babd5a97cdcb..875b800ef0dd 100644 --- a/arch/m68k/mm/mcfmmu.c +++ b/arch/m68k/mm/mcfmmu.c | |||
| @@ -87,7 +87,7 @@ void __init paging_init(void) | |||
| 87 | 87 | ||
| 88 | int cf_tlb_miss(struct pt_regs *regs, int write, int dtlb, int extension_word) | 88 | int cf_tlb_miss(struct pt_regs *regs, int write, int dtlb, int extension_word) |
| 89 | { | 89 | { |
| 90 | unsigned long flags, mmuar; | 90 | unsigned long flags, mmuar, mmutr; |
| 91 | struct mm_struct *mm; | 91 | struct mm_struct *mm; |
| 92 | pgd_t *pgd; | 92 | pgd_t *pgd; |
| 93 | pmd_t *pmd; | 93 | pmd_t *pmd; |
| @@ -137,9 +137,10 @@ int cf_tlb_miss(struct pt_regs *regs, int write, int dtlb, int extension_word) | |||
| 137 | if (!pte_dirty(*pte) && !KMAPAREA(mmuar)) | 137 | if (!pte_dirty(*pte) && !KMAPAREA(mmuar)) |
| 138 | set_pte(pte, pte_wrprotect(*pte)); | 138 | set_pte(pte, pte_wrprotect(*pte)); |
| 139 | 139 | ||
| 140 | mmu_write(MMUTR, (mmuar & PAGE_MASK) | (asid << MMUTR_IDN) | | 140 | mmutr = (mmuar & PAGE_MASK) | (asid << MMUTR_IDN) | MMUTR_V; |
| 141 | (((int)(pte->pte) & (int)CF_PAGE_MMUTR_MASK) | 141 | if ((mmuar < TASK_UNMAPPED_BASE) || (mmuar >= TASK_SIZE)) |
| 142 | >> CF_PAGE_MMUTR_SHIFT) | MMUTR_V); | 142 | mmutr |= (pte->pte & CF_PAGE_MMUTR_MASK) >> CF_PAGE_MMUTR_SHIFT; |
| 143 | mmu_write(MMUTR, mmutr); | ||
| 143 | 144 | ||
| 144 | mmu_write(MMUDR, (pte_val(*pte) & PAGE_MASK) | | 145 | mmu_write(MMUDR, (pte_val(*pte) & PAGE_MASK) | |
| 145 | ((pte->pte) & CF_PAGE_MMUDR_MASK) | MMUDR_SZ_8KB | MMUDR_X); | 146 | ((pte->pte) & CF_PAGE_MMUDR_MASK) | MMUDR_SZ_8KB | MMUDR_X); |
diff --git a/arch/m68k/platform/coldfire/entry.S b/arch/m68k/platform/coldfire/entry.S index 863889fc31c9..281e38c2b6c7 100644 --- a/arch/m68k/platform/coldfire/entry.S +++ b/arch/m68k/platform/coldfire/entry.S | |||
| @@ -136,7 +136,7 @@ Luser_return: | |||
| 136 | movel %sp,%d1 /* get thread_info pointer */ | 136 | movel %sp,%d1 /* get thread_info pointer */ |
| 137 | andl #-THREAD_SIZE,%d1 /* at base of kernel stack */ | 137 | andl #-THREAD_SIZE,%d1 /* at base of kernel stack */ |
| 138 | movel %d1,%a0 | 138 | movel %d1,%a0 |
| 139 | movel %a0@(TINFO_FLAGS),%d1 /* get thread_info->flags */ | 139 | moveb %a0@(TINFO_FLAGS+3),%d1 /* thread_info->flags (low 8 bits) */ |
| 140 | jne Lwork_to_do /* still work to do */ | 140 | jne Lwork_to_do /* still work to do */ |
| 141 | 141 | ||
| 142 | Lreturn: | 142 | Lreturn: |
| @@ -148,8 +148,6 @@ Lwork_to_do: | |||
| 148 | btst #TIF_NEED_RESCHED,%d1 | 148 | btst #TIF_NEED_RESCHED,%d1 |
| 149 | jne reschedule | 149 | jne reschedule |
| 150 | 150 | ||
| 151 | /* GERG: do we need something here for TRACEing?? */ | ||
| 152 | |||
| 153 | Lsignal_return: | 151 | Lsignal_return: |
| 154 | subql #4,%sp /* dummy return address */ | 152 | subql #4,%sp /* dummy return address */ |
| 155 | SAVE_SWITCH_STACK | 153 | SAVE_SWITCH_STACK |
diff --git a/arch/powerpc/configs/ppc64_defconfig b/arch/powerpc/configs/ppc64_defconfig index 2156e077859b..1acf65026773 100644 --- a/arch/powerpc/configs/ppc64_defconfig +++ b/arch/powerpc/configs/ppc64_defconfig | |||
| @@ -24,10 +24,6 @@ CONFIG_PPC_SPLPAR=y | |||
| 24 | CONFIG_SCANLOG=m | 24 | CONFIG_SCANLOG=m |
| 25 | CONFIG_PPC_SMLPAR=y | 25 | CONFIG_PPC_SMLPAR=y |
| 26 | CONFIG_DTL=y | 26 | CONFIG_DTL=y |
| 27 | CONFIG_PPC_ISERIES=y | ||
| 28 | CONFIG_VIODASD=y | ||
| 29 | CONFIG_VIOCD=m | ||
| 30 | CONFIG_VIOTAPE=m | ||
| 31 | CONFIG_PPC_MAPLE=y | 27 | CONFIG_PPC_MAPLE=y |
| 32 | CONFIG_PPC_PASEMI=y | 28 | CONFIG_PPC_PASEMI=y |
| 33 | CONFIG_PPC_PASEMI_IOMMU=y | 29 | CONFIG_PPC_PASEMI_IOMMU=y |
| @@ -259,7 +255,6 @@ CONFIG_PASEMI_MAC=y | |||
| 259 | CONFIG_MLX4_EN=m | 255 | CONFIG_MLX4_EN=m |
| 260 | CONFIG_QLGE=m | 256 | CONFIG_QLGE=m |
| 261 | CONFIG_BE2NET=m | 257 | CONFIG_BE2NET=m |
| 262 | CONFIG_ISERIES_VETH=m | ||
| 263 | CONFIG_PPP=m | 258 | CONFIG_PPP=m |
| 264 | CONFIG_PPP_ASYNC=m | 259 | CONFIG_PPP_ASYNC=m |
| 265 | CONFIG_PPP_SYNC_TTY=m | 260 | CONFIG_PPP_SYNC_TTY=m |
diff --git a/arch/powerpc/include/asm/ppc-pci.h b/arch/powerpc/include/asm/ppc-pci.h index 43268f15004e..6d422979ebaf 100644 --- a/arch/powerpc/include/asm/ppc-pci.h +++ b/arch/powerpc/include/asm/ppc-pci.h | |||
| @@ -142,6 +142,11 @@ static inline const char *eeh_pci_name(struct pci_dev *pdev) | |||
| 142 | return pdev ? pci_name(pdev) : "<null>"; | 142 | return pdev ? pci_name(pdev) : "<null>"; |
| 143 | } | 143 | } |
| 144 | 144 | ||
| 145 | static inline const char *eeh_driver_name(struct pci_dev *pdev) | ||
| 146 | { | ||
| 147 | return (pdev && pdev->driver) ? pdev->driver->name : "<null>"; | ||
| 148 | } | ||
| 149 | |||
| 145 | #endif /* CONFIG_EEH */ | 150 | #endif /* CONFIG_EEH */ |
| 146 | 151 | ||
| 147 | #else /* CONFIG_PCI */ | 152 | #else /* CONFIG_PCI */ |
diff --git a/arch/powerpc/include/asm/ptrace.h b/arch/powerpc/include/asm/ptrace.h index 78a205162fd7..84cc7840cd18 100644 --- a/arch/powerpc/include/asm/ptrace.h +++ b/arch/powerpc/include/asm/ptrace.h | |||
| @@ -83,8 +83,18 @@ struct pt_regs { | |||
| 83 | 83 | ||
| 84 | #ifndef __ASSEMBLY__ | 84 | #ifndef __ASSEMBLY__ |
| 85 | 85 | ||
| 86 | #define instruction_pointer(regs) ((regs)->nip) | 86 | #define GET_IP(regs) ((regs)->nip) |
| 87 | #define user_stack_pointer(regs) ((regs)->gpr[1]) | 87 | #define GET_USP(regs) ((regs)->gpr[1]) |
| 88 | #define GET_FP(regs) (0) | ||
| 89 | #define SET_FP(regs, val) | ||
| 90 | |||
| 91 | #ifdef CONFIG_SMP | ||
| 92 | extern unsigned long profile_pc(struct pt_regs *regs); | ||
| 93 | #define profile_pc profile_pc | ||
| 94 | #endif | ||
| 95 | |||
| 96 | #include <asm-generic/ptrace.h> | ||
| 97 | |||
| 88 | #define kernel_stack_pointer(regs) ((regs)->gpr[1]) | 98 | #define kernel_stack_pointer(regs) ((regs)->gpr[1]) |
| 89 | static inline int is_syscall_success(struct pt_regs *regs) | 99 | static inline int is_syscall_success(struct pt_regs *regs) |
| 90 | { | 100 | { |
| @@ -99,12 +109,6 @@ static inline long regs_return_value(struct pt_regs *regs) | |||
| 99 | return -regs->gpr[3]; | 109 | return -regs->gpr[3]; |
| 100 | } | 110 | } |
| 101 | 111 | ||
| 102 | #ifdef CONFIG_SMP | ||
| 103 | extern unsigned long profile_pc(struct pt_regs *regs); | ||
| 104 | #else | ||
| 105 | #define profile_pc(regs) instruction_pointer(regs) | ||
| 106 | #endif | ||
| 107 | |||
| 108 | #ifdef __powerpc64__ | 112 | #ifdef __powerpc64__ |
| 109 | #define user_mode(regs) ((((regs)->msr) >> MSR_PR_LG) & 0x1) | 113 | #define user_mode(regs) ((((regs)->msr) >> MSR_PR_LG) & 0x1) |
| 110 | #else | 114 | #else |
diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S index 4f80cf1ce77b..3e57a00b8cba 100644 --- a/arch/powerpc/kernel/entry_32.S +++ b/arch/powerpc/kernel/entry_32.S | |||
| @@ -1213,7 +1213,7 @@ do_user_signal: /* r10 contains MSR_KERNEL here */ | |||
| 1213 | stw r3,_TRAP(r1) | 1213 | stw r3,_TRAP(r1) |
| 1214 | 2: addi r3,r1,STACK_FRAME_OVERHEAD | 1214 | 2: addi r3,r1,STACK_FRAME_OVERHEAD |
| 1215 | mr r4,r9 | 1215 | mr r4,r9 |
| 1216 | bl do_signal | 1216 | bl do_notify_resume |
| 1217 | REST_NVGPRS(r1) | 1217 | REST_NVGPRS(r1) |
| 1218 | b recheck | 1218 | b recheck |
| 1219 | 1219 | ||
diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S index d834425186ae..866462cbe2d8 100644 --- a/arch/powerpc/kernel/entry_64.S +++ b/arch/powerpc/kernel/entry_64.S | |||
| @@ -751,12 +751,16 @@ user_work: | |||
| 751 | 751 | ||
| 752 | andi. r0,r4,_TIF_NEED_RESCHED | 752 | andi. r0,r4,_TIF_NEED_RESCHED |
| 753 | beq 1f | 753 | beq 1f |
| 754 | li r5,1 | ||
| 755 | TRACE_AND_RESTORE_IRQ(r5); | ||
| 754 | bl .schedule | 756 | bl .schedule |
| 755 | b .ret_from_except_lite | 757 | b .ret_from_except_lite |
| 756 | 758 | ||
| 757 | 1: bl .save_nvgprs | 759 | 1: bl .save_nvgprs |
| 760 | li r5,1 | ||
| 761 | TRACE_AND_RESTORE_IRQ(r5); | ||
| 758 | addi r3,r1,STACK_FRAME_OVERHEAD | 762 | addi r3,r1,STACK_FRAME_OVERHEAD |
| 759 | bl .do_signal | 763 | bl .do_notify_resume |
| 760 | b .ret_from_except | 764 | b .ret_from_except |
| 761 | 765 | ||
| 762 | unrecov_restore: | 766 | unrecov_restore: |
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S index d4be7bb3dbdf..15c5a4f6de01 100644 --- a/arch/powerpc/kernel/exceptions-64s.S +++ b/arch/powerpc/kernel/exceptions-64s.S | |||
| @@ -774,8 +774,8 @@ alignment_common: | |||
| 774 | program_check_common: | 774 | program_check_common: |
| 775 | EXCEPTION_PROLOG_COMMON(0x700, PACA_EXGEN) | 775 | EXCEPTION_PROLOG_COMMON(0x700, PACA_EXGEN) |
| 776 | bl .save_nvgprs | 776 | bl .save_nvgprs |
| 777 | DISABLE_INTS | ||
| 777 | addi r3,r1,STACK_FRAME_OVERHEAD | 778 | addi r3,r1,STACK_FRAME_OVERHEAD |
| 778 | ENABLE_INTS | ||
| 779 | bl .program_check_exception | 779 | bl .program_check_exception |
| 780 | b .ret_from_except | 780 | b .ret_from_except |
| 781 | 781 | ||
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index 701d4aceb4f4..01e2877e8e04 100644 --- a/arch/powerpc/kernel/irq.c +++ b/arch/powerpc/kernel/irq.c | |||
| @@ -118,10 +118,14 @@ static inline notrace void set_soft_enabled(unsigned long enable) | |||
| 118 | static inline notrace void decrementer_check_overflow(void) | 118 | static inline notrace void decrementer_check_overflow(void) |
| 119 | { | 119 | { |
| 120 | u64 now = get_tb_or_rtc(); | 120 | u64 now = get_tb_or_rtc(); |
| 121 | u64 *next_tb = &__get_cpu_var(decrementers_next_tb); | 121 | u64 *next_tb; |
| 122 | |||
| 123 | preempt_disable(); | ||
| 124 | next_tb = &__get_cpu_var(decrementers_next_tb); | ||
| 122 | 125 | ||
| 123 | if (now >= *next_tb) | 126 | if (now >= *next_tb) |
| 124 | set_dec(1); | 127 | set_dec(1); |
| 128 | preempt_enable(); | ||
| 125 | } | 129 | } |
| 126 | 130 | ||
| 127 | notrace void arch_local_irq_restore(unsigned long en) | 131 | notrace void arch_local_irq_restore(unsigned long en) |
diff --git a/arch/powerpc/kernel/perf_event.c b/arch/powerpc/kernel/perf_event.c index 10a140f82cb8..64483fde95c6 100644 --- a/arch/powerpc/kernel/perf_event.c +++ b/arch/powerpc/kernel/perf_event.c | |||
| @@ -865,6 +865,7 @@ static void power_pmu_start(struct perf_event *event, int ef_flags) | |||
| 865 | { | 865 | { |
| 866 | unsigned long flags; | 866 | unsigned long flags; |
| 867 | s64 left; | 867 | s64 left; |
| 868 | unsigned long val; | ||
| 868 | 869 | ||
| 869 | if (!event->hw.idx || !event->hw.sample_period) | 870 | if (!event->hw.idx || !event->hw.sample_period) |
| 870 | return; | 871 | return; |
| @@ -880,7 +881,12 @@ static void power_pmu_start(struct perf_event *event, int ef_flags) | |||
| 880 | 881 | ||
| 881 | event->hw.state = 0; | 882 | event->hw.state = 0; |
| 882 | left = local64_read(&event->hw.period_left); | 883 | left = local64_read(&event->hw.period_left); |
| 883 | write_pmc(event->hw.idx, left); | 884 | |
| 885 | val = 0; | ||
| 886 | if (left < 0x80000000L) | ||
| 887 | val = 0x80000000L - left; | ||
| 888 | |||
| 889 | write_pmc(event->hw.idx, val); | ||
| 884 | 890 | ||
| 885 | perf_event_update_userpage(event); | 891 | perf_event_update_userpage(event); |
| 886 | perf_pmu_enable(event->pmu); | 892 | perf_pmu_enable(event->pmu); |
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c index ebe5766781aa..d817ab018486 100644 --- a/arch/powerpc/kernel/process.c +++ b/arch/powerpc/kernel/process.c | |||
| @@ -566,12 +566,12 @@ static void show_instructions(struct pt_regs *regs) | |||
| 566 | */ | 566 | */ |
| 567 | if (!__kernel_text_address(pc) || | 567 | if (!__kernel_text_address(pc) || |
| 568 | __get_user(instr, (unsigned int __user *)pc)) { | 568 | __get_user(instr, (unsigned int __user *)pc)) { |
| 569 | printk("XXXXXXXX "); | 569 | printk(KERN_CONT "XXXXXXXX "); |
| 570 | } else { | 570 | } else { |
| 571 | if (regs->nip == pc) | 571 | if (regs->nip == pc) |
| 572 | printk("<%08x> ", instr); | 572 | printk(KERN_CONT "<%08x> ", instr); |
| 573 | else | 573 | else |
| 574 | printk("%08x ", instr); | 574 | printk(KERN_CONT "%08x ", instr); |
| 575 | } | 575 | } |
| 576 | 576 | ||
| 577 | pc += sizeof(int); | 577 | pc += sizeof(int); |
diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c index 517b1d8f455b..9f843cdfee9e 100644 --- a/arch/powerpc/kernel/rtas.c +++ b/arch/powerpc/kernel/rtas.c | |||
| @@ -716,7 +716,6 @@ static int __rtas_suspend_last_cpu(struct rtas_suspend_me_data *data, int wake_w | |||
| 716 | int cpu; | 716 | int cpu; |
| 717 | 717 | ||
| 718 | slb_set_size(SLB_MIN_SIZE); | 718 | slb_set_size(SLB_MIN_SIZE); |
| 719 | stop_topology_update(); | ||
| 720 | printk(KERN_DEBUG "calling ibm,suspend-me on cpu %i\n", smp_processor_id()); | 719 | printk(KERN_DEBUG "calling ibm,suspend-me on cpu %i\n", smp_processor_id()); |
| 721 | 720 | ||
| 722 | while (rc == H_MULTI_THREADS_ACTIVE && !atomic_read(&data->done) && | 721 | while (rc == H_MULTI_THREADS_ACTIVE && !atomic_read(&data->done) && |
| @@ -732,7 +731,6 @@ static int __rtas_suspend_last_cpu(struct rtas_suspend_me_data *data, int wake_w | |||
| 732 | rc = atomic_read(&data->error); | 731 | rc = atomic_read(&data->error); |
| 733 | 732 | ||
| 734 | atomic_set(&data->error, rc); | 733 | atomic_set(&data->error, rc); |
| 735 | start_topology_update(); | ||
| 736 | pSeries_coalesce_init(); | 734 | pSeries_coalesce_init(); |
| 737 | 735 | ||
| 738 | if (wake_when_done) { | 736 | if (wake_when_done) { |
| @@ -846,6 +844,7 @@ int rtas_ibm_suspend_me(struct rtas_args *args) | |||
| 846 | atomic_set(&data.error, 0); | 844 | atomic_set(&data.error, 0); |
| 847 | data.token = rtas_token("ibm,suspend-me"); | 845 | data.token = rtas_token("ibm,suspend-me"); |
| 848 | data.complete = &done; | 846 | data.complete = &done; |
| 847 | stop_topology_update(); | ||
| 849 | 848 | ||
| 850 | /* Call function on all CPUs. One of us will make the | 849 | /* Call function on all CPUs. One of us will make the |
| 851 | * rtas call | 850 | * rtas call |
| @@ -858,6 +857,8 @@ int rtas_ibm_suspend_me(struct rtas_args *args) | |||
| 858 | if (atomic_read(&data.error) != 0) | 857 | if (atomic_read(&data.error) != 0) |
| 859 | printk(KERN_ERR "Error doing global join\n"); | 858 | printk(KERN_ERR "Error doing global join\n"); |
| 860 | 859 | ||
| 860 | start_topology_update(); | ||
| 861 | |||
| 861 | return atomic_read(&data.error); | 862 | return atomic_read(&data.error); |
| 862 | } | 863 | } |
| 863 | #else /* CONFIG_PPC_PSERIES */ | 864 | #else /* CONFIG_PPC_PSERIES */ |
diff --git a/arch/powerpc/kernel/signal.c b/arch/powerpc/kernel/signal.c index 2300426e531a..ac6e437b1021 100644 --- a/arch/powerpc/kernel/signal.c +++ b/arch/powerpc/kernel/signal.c | |||
| @@ -11,6 +11,7 @@ | |||
| 11 | 11 | ||
| 12 | #include <linux/tracehook.h> | 12 | #include <linux/tracehook.h> |
| 13 | #include <linux/signal.h> | 13 | #include <linux/signal.h> |
| 14 | #include <linux/key.h> | ||
| 14 | #include <asm/hw_breakpoint.h> | 15 | #include <asm/hw_breakpoint.h> |
| 15 | #include <asm/uaccess.h> | 16 | #include <asm/uaccess.h> |
| 16 | #include <asm/unistd.h> | 17 | #include <asm/unistd.h> |
| @@ -113,8 +114,9 @@ static void check_syscall_restart(struct pt_regs *regs, struct k_sigaction *ka, | |||
| 113 | } | 114 | } |
| 114 | } | 115 | } |
| 115 | 116 | ||
| 116 | static int do_signal_pending(sigset_t *oldset, struct pt_regs *regs) | 117 | static int do_signal(struct pt_regs *regs) |
| 117 | { | 118 | { |
| 119 | sigset_t *oldset; | ||
| 118 | siginfo_t info; | 120 | siginfo_t info; |
| 119 | int signr; | 121 | int signr; |
| 120 | struct k_sigaction ka; | 122 | struct k_sigaction ka; |
| @@ -123,7 +125,7 @@ static int do_signal_pending(sigset_t *oldset, struct pt_regs *regs) | |||
| 123 | 125 | ||
| 124 | if (current_thread_info()->local_flags & _TLF_RESTORE_SIGMASK) | 126 | if (current_thread_info()->local_flags & _TLF_RESTORE_SIGMASK) |
| 125 | oldset = ¤t->saved_sigmask; | 127 | oldset = ¤t->saved_sigmask; |
| 126 | else if (!oldset) | 128 | else |
| 127 | oldset = ¤t->blocked; | 129 | oldset = ¤t->blocked; |
| 128 | 130 | ||
| 129 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | 131 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); |
| @@ -191,14 +193,16 @@ static int do_signal_pending(sigset_t *oldset, struct pt_regs *regs) | |||
| 191 | return ret; | 193 | return ret; |
| 192 | } | 194 | } |
| 193 | 195 | ||
| 194 | void do_signal(struct pt_regs *regs, unsigned long thread_info_flags) | 196 | void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags) |
| 195 | { | 197 | { |
| 196 | if (thread_info_flags & _TIF_SIGPENDING) | 198 | if (thread_info_flags & _TIF_SIGPENDING) |
| 197 | do_signal_pending(NULL, regs); | 199 | do_signal(regs); |
| 198 | 200 | ||
| 199 | if (thread_info_flags & _TIF_NOTIFY_RESUME) { | 201 | if (thread_info_flags & _TIF_NOTIFY_RESUME) { |
| 200 | clear_thread_flag(TIF_NOTIFY_RESUME); | 202 | clear_thread_flag(TIF_NOTIFY_RESUME); |
| 201 | tracehook_notify_resume(regs); | 203 | tracehook_notify_resume(regs); |
| 204 | if (current->replacement_session_keyring) | ||
| 205 | key_replace_session_keyring(); | ||
| 202 | } | 206 | } |
| 203 | } | 207 | } |
| 204 | 208 | ||
diff --git a/arch/powerpc/kernel/signal.h b/arch/powerpc/kernel/signal.h index 6c0ddfc0603e..8dde973aaaf5 100644 --- a/arch/powerpc/kernel/signal.h +++ b/arch/powerpc/kernel/signal.h | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | 12 | ||
| 13 | #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) | 13 | #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) |
| 14 | 14 | ||
| 15 | extern void do_signal(struct pt_regs *regs, unsigned long thread_info_flags); | 15 | extern void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags); |
| 16 | 16 | ||
| 17 | extern void __user * get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, | 17 | extern void __user * get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, |
| 18 | size_t frame_size, int is_32); | 18 | size_t frame_size, int is_32); |
diff --git a/arch/powerpc/platforms/powernv/pci.c b/arch/powerpc/platforms/powernv/pci.c index a70bc1e385eb..f92b9ef7340e 100644 --- a/arch/powerpc/platforms/powernv/pci.c +++ b/arch/powerpc/platforms/powernv/pci.c | |||
| @@ -52,32 +52,38 @@ static int pnv_msi_check_device(struct pci_dev* pdev, int nvec, int type) | |||
| 52 | 52 | ||
| 53 | static unsigned int pnv_get_one_msi(struct pnv_phb *phb) | 53 | static unsigned int pnv_get_one_msi(struct pnv_phb *phb) |
| 54 | { | 54 | { |
| 55 | unsigned int id; | 55 | unsigned long flags; |
| 56 | unsigned int id, rc; | ||
| 57 | |||
| 58 | spin_lock_irqsave(&phb->lock, flags); | ||
| 56 | 59 | ||
| 57 | spin_lock(&phb->lock); | ||
| 58 | id = find_next_zero_bit(phb->msi_map, phb->msi_count, phb->msi_next); | 60 | id = find_next_zero_bit(phb->msi_map, phb->msi_count, phb->msi_next); |
| 59 | if (id >= phb->msi_count && phb->msi_next) | 61 | if (id >= phb->msi_count && phb->msi_next) |
| 60 | id = find_next_zero_bit(phb->msi_map, phb->msi_count, 0); | 62 | id = find_next_zero_bit(phb->msi_map, phb->msi_count, 0); |
| 61 | if (id >= phb->msi_count) { | 63 | if (id >= phb->msi_count) { |
| 62 | spin_unlock(&phb->lock); | 64 | rc = 0; |
| 63 | return 0; | 65 | goto out; |
| 64 | } | 66 | } |
| 65 | __set_bit(id, phb->msi_map); | 67 | __set_bit(id, phb->msi_map); |
| 66 | spin_unlock(&phb->lock); | 68 | rc = id + phb->msi_base; |
| 67 | return id + phb->msi_base; | 69 | out: |
| 70 | spin_unlock_irqrestore(&phb->lock, flags); | ||
| 71 | return rc; | ||
| 68 | } | 72 | } |
| 69 | 73 | ||
| 70 | static void pnv_put_msi(struct pnv_phb *phb, unsigned int hwirq) | 74 | static void pnv_put_msi(struct pnv_phb *phb, unsigned int hwirq) |
| 71 | { | 75 | { |
| 76 | unsigned long flags; | ||
| 72 | unsigned int id; | 77 | unsigned int id; |
| 73 | 78 | ||
| 74 | if (WARN_ON(hwirq < phb->msi_base || | 79 | if (WARN_ON(hwirq < phb->msi_base || |
| 75 | hwirq >= (phb->msi_base + phb->msi_count))) | 80 | hwirq >= (phb->msi_base + phb->msi_count))) |
| 76 | return; | 81 | return; |
| 77 | id = hwirq - phb->msi_base; | 82 | id = hwirq - phb->msi_base; |
| 78 | spin_lock(&phb->lock); | 83 | |
| 84 | spin_lock_irqsave(&phb->lock, flags); | ||
| 79 | __clear_bit(id, phb->msi_map); | 85 | __clear_bit(id, phb->msi_map); |
| 80 | spin_unlock(&phb->lock); | 86 | spin_unlock_irqrestore(&phb->lock, flags); |
| 81 | } | 87 | } |
| 82 | 88 | ||
| 83 | static int pnv_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type) | 89 | static int pnv_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type) |
diff --git a/arch/powerpc/platforms/pseries/eeh.c b/arch/powerpc/platforms/pseries/eeh.c index 565869022e3d..c0b40af4ce4f 100644 --- a/arch/powerpc/platforms/pseries/eeh.c +++ b/arch/powerpc/platforms/pseries/eeh.c | |||
| @@ -551,9 +551,9 @@ int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev) | |||
| 551 | printk (KERN_ERR "EEH: %d reads ignored for recovering device at " | 551 | printk (KERN_ERR "EEH: %d reads ignored for recovering device at " |
| 552 | "location=%s driver=%s pci addr=%s\n", | 552 | "location=%s driver=%s pci addr=%s\n", |
| 553 | pdn->eeh_check_count, location, | 553 | pdn->eeh_check_count, location, |
| 554 | dev->driver->name, eeh_pci_name(dev)); | 554 | eeh_driver_name(dev), eeh_pci_name(dev)); |
| 555 | printk (KERN_ERR "EEH: Might be infinite loop in %s driver\n", | 555 | printk (KERN_ERR "EEH: Might be infinite loop in %s driver\n", |
| 556 | dev->driver->name); | 556 | eeh_driver_name(dev)); |
| 557 | dump_stack(); | 557 | dump_stack(); |
| 558 | } | 558 | } |
| 559 | goto dn_unlock; | 559 | goto dn_unlock; |
diff --git a/arch/powerpc/platforms/pseries/suspend.c b/arch/powerpc/platforms/pseries/suspend.c index b84a8b2238dd..47226e04126d 100644 --- a/arch/powerpc/platforms/pseries/suspend.c +++ b/arch/powerpc/platforms/pseries/suspend.c | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | #include <asm/machdep.h> | 24 | #include <asm/machdep.h> |
| 25 | #include <asm/mmu.h> | 25 | #include <asm/mmu.h> |
| 26 | #include <asm/rtas.h> | 26 | #include <asm/rtas.h> |
| 27 | #include <asm/topology.h> | ||
| 27 | 28 | ||
| 28 | static u64 stream_id; | 29 | static u64 stream_id; |
| 29 | static struct device suspend_dev; | 30 | static struct device suspend_dev; |
| @@ -138,8 +139,11 @@ static ssize_t store_hibernate(struct device *dev, | |||
| 138 | ssleep(1); | 139 | ssleep(1); |
| 139 | } while (rc == -EAGAIN); | 140 | } while (rc == -EAGAIN); |
| 140 | 141 | ||
| 141 | if (!rc) | 142 | if (!rc) { |
| 143 | stop_topology_update(); | ||
| 142 | rc = pm_suspend(PM_SUSPEND_MEM); | 144 | rc = pm_suspend(PM_SUSPEND_MEM); |
| 145 | start_topology_update(); | ||
| 146 | } | ||
| 143 | 147 | ||
| 144 | stream_id = 0; | 148 | stream_id = 0; |
| 145 | 149 | ||
diff --git a/arch/powerpc/platforms/wsp/ics.c b/arch/powerpc/platforms/wsp/ics.c index 576874392543..97fe82ee8633 100644 --- a/arch/powerpc/platforms/wsp/ics.c +++ b/arch/powerpc/platforms/wsp/ics.c | |||
| @@ -346,7 +346,7 @@ static int wsp_chip_set_affinity(struct irq_data *d, | |||
| 346 | * For the moment only implement delivery to all cpus or one cpu. | 346 | * For the moment only implement delivery to all cpus or one cpu. |
| 347 | * Get current irq_server for the given irq | 347 | * Get current irq_server for the given irq |
| 348 | */ | 348 | */ |
| 349 | ret = cache_hwirq_map(ics, d->irq, cpumask); | 349 | ret = cache_hwirq_map(ics, hw_irq, cpumask); |
| 350 | if (ret == -1) { | 350 | if (ret == -1) { |
| 351 | char cpulist[128]; | 351 | char cpulist[128]; |
| 352 | cpumask_scnprintf(cpulist, sizeof(cpulist), cpumask); | 352 | cpumask_scnprintf(cpulist, sizeof(cpulist), cpumask); |
diff --git a/arch/powerpc/platforms/wsp/smp.c b/arch/powerpc/platforms/wsp/smp.c index 71bd105f3863..0ba103ae83a5 100644 --- a/arch/powerpc/platforms/wsp/smp.c +++ b/arch/powerpc/platforms/wsp/smp.c | |||
| @@ -71,7 +71,7 @@ int __devinit smp_a2_kick_cpu(int nr) | |||
| 71 | 71 | ||
| 72 | static int __init smp_a2_probe(void) | 72 | static int __init smp_a2_probe(void) |
| 73 | { | 73 | { |
| 74 | return cpus_weight(cpu_possible_map); | 74 | return num_possible_cpus(); |
| 75 | } | 75 | } |
| 76 | 76 | ||
| 77 | static struct smp_ops_t a2_smp_ops = { | 77 | static struct smp_ops_t a2_smp_ops = { |
diff --git a/arch/powerpc/platforms/wsp/wsp_pci.c b/arch/powerpc/platforms/wsp/wsp_pci.c index e0262cd0e2d3..d24b3acf858e 100644 --- a/arch/powerpc/platforms/wsp/wsp_pci.c +++ b/arch/powerpc/platforms/wsp/wsp_pci.c | |||
| @@ -468,15 +468,15 @@ static void __init wsp_pcie_configure_hw(struct pci_controller *hose) | |||
| 468 | #define DUMP_REG(x) \ | 468 | #define DUMP_REG(x) \ |
| 469 | pr_debug("%-30s : 0x%016llx\n", #x, in_be64(hose->cfg_data + x)) | 469 | pr_debug("%-30s : 0x%016llx\n", #x, in_be64(hose->cfg_data + x)) |
| 470 | 470 | ||
| 471 | #ifdef CONFIG_WSP_DD1_WORKAROUND_BAD_PCIE_CLASS | 471 | /* |
| 472 | /* WSP DD1 has a bogus class code by default in the PCI-E | 472 | * Some WSP variants has a bogus class code by default in the PCI-E |
| 473 | * root complex's built-in P2P bridge */ | 473 | * root complex's built-in P2P bridge |
| 474 | */ | ||
| 474 | val = in_be64(hose->cfg_data + PCIE_REG_SYS_CFG1); | 475 | val = in_be64(hose->cfg_data + PCIE_REG_SYS_CFG1); |
| 475 | pr_debug("PCI-E SYS_CFG1 : 0x%llx\n", val); | 476 | pr_debug("PCI-E SYS_CFG1 : 0x%llx\n", val); |
| 476 | out_be64(hose->cfg_data + PCIE_REG_SYS_CFG1, | 477 | out_be64(hose->cfg_data + PCIE_REG_SYS_CFG1, |
| 477 | (val & ~PCIE_REG_SYS_CFG1_CLASS_CODE) | (PCI_CLASS_BRIDGE_PCI << 8)); | 478 | (val & ~PCIE_REG_SYS_CFG1_CLASS_CODE) | (PCI_CLASS_BRIDGE_PCI << 8)); |
| 478 | pr_debug("PCI-E SYS_CFG1 : 0x%llx\n", in_be64(hose->cfg_data + PCIE_REG_SYS_CFG1)); | 479 | pr_debug("PCI-E SYS_CFG1 : 0x%llx\n", in_be64(hose->cfg_data + PCIE_REG_SYS_CFG1)); |
| 479 | #endif /* CONFIG_WSP_DD1_WORKAROUND_BAD_PCIE_CLASS */ | ||
| 480 | 480 | ||
| 481 | #ifdef CONFIG_WSP_DD1_WORKAROUND_DD1_TCE_BUGS | 481 | #ifdef CONFIG_WSP_DD1_WORKAROUND_DD1_TCE_BUGS |
| 482 | /* XXX Disable TCE caching, it doesn't work on DD1 */ | 482 | /* XXX Disable TCE caching, it doesn't work on DD1 */ |
diff --git a/arch/powerpc/sysdev/fsl_pci.c b/arch/powerpc/sysdev/fsl_pci.c index 30eb17ecad49..6073288fed29 100644 --- a/arch/powerpc/sysdev/fsl_pci.c +++ b/arch/powerpc/sysdev/fsl_pci.c | |||
| @@ -385,26 +385,36 @@ static void __init setup_pci_cmd(struct pci_controller *hose) | |||
| 385 | void fsl_pcibios_fixup_bus(struct pci_bus *bus) | 385 | void fsl_pcibios_fixup_bus(struct pci_bus *bus) |
| 386 | { | 386 | { |
| 387 | struct pci_controller *hose = pci_bus_to_host(bus); | 387 | struct pci_controller *hose = pci_bus_to_host(bus); |
| 388 | int i; | 388 | int i, is_pcie = 0, no_link; |
| 389 | 389 | ||
| 390 | if ((bus->parent == hose->bus) && | 390 | /* The root complex bridge comes up with bogus resources, |
| 391 | ((fsl_pcie_bus_fixup && | 391 | * we copy the PHB ones in. |
| 392 | early_find_capability(hose, 0, 0, PCI_CAP_ID_EXP)) || | 392 | * |
| 393 | (hose->indirect_type & PPC_INDIRECT_TYPE_NO_PCIE_LINK))) | 393 | * With the current generic PCI code, the PHB bus no longer |
| 394 | { | 394 | * has bus->resource[0..4] set, so things are a bit more |
| 395 | for (i = 0; i < 4; ++i) { | 395 | * tricky. |
| 396 | */ | ||
| 397 | |||
| 398 | if (fsl_pcie_bus_fixup) | ||
| 399 | is_pcie = early_find_capability(hose, 0, 0, PCI_CAP_ID_EXP); | ||
| 400 | no_link = !!(hose->indirect_type & PPC_INDIRECT_TYPE_NO_PCIE_LINK); | ||
| 401 | |||
| 402 | if (bus->parent == hose->bus && (is_pcie || no_link)) { | ||
| 403 | for (i = 0; i < PCI_BRIDGE_RESOURCE_NUM; ++i) { | ||
| 396 | struct resource *res = bus->resource[i]; | 404 | struct resource *res = bus->resource[i]; |
| 397 | struct resource *par = bus->parent->resource[i]; | 405 | struct resource *par; |
| 398 | if (res) { | 406 | |
| 399 | res->start = 0; | 407 | if (!res) |
| 400 | res->end = 0; | 408 | continue; |
| 401 | res->flags = 0; | 409 | if (i == 0) |
| 402 | } | 410 | par = &hose->io_resource; |
| 403 | if (res && par) { | 411 | else if (i < 4) |
| 404 | res->start = par->start; | 412 | par = &hose->mem_resources[i-1]; |
| 405 | res->end = par->end; | 413 | else par = NULL; |
| 406 | res->flags = par->flags; | 414 | |
| 407 | } | 415 | res->start = par ? par->start : 0; |
| 416 | res->end = par ? par->end : 0; | ||
| 417 | res->flags = par ? par->flags : 0; | ||
| 408 | } | 418 | } |
| 409 | } | 419 | } |
| 410 | } | 420 | } |
diff --git a/arch/s390/kernel/compat_wrapper.S b/arch/s390/kernel/compat_wrapper.S index 18c51df9fe06..ff605a39cf43 100644 --- a/arch/s390/kernel/compat_wrapper.S +++ b/arch/s390/kernel/compat_wrapper.S | |||
| @@ -662,7 +662,7 @@ ENTRY(sys32_getresuid16_wrapper) | |||
| 662 | ENTRY(sys32_poll_wrapper) | 662 | ENTRY(sys32_poll_wrapper) |
| 663 | llgtr %r2,%r2 # struct pollfd * | 663 | llgtr %r2,%r2 # struct pollfd * |
| 664 | llgfr %r3,%r3 # unsigned int | 664 | llgfr %r3,%r3 # unsigned int |
| 665 | lgfr %r4,%r4 # long | 665 | lgfr %r4,%r4 # int |
| 666 | jg sys_poll # branch to system call | 666 | jg sys_poll # branch to system call |
| 667 | 667 | ||
| 668 | ENTRY(sys32_setresgid16_wrapper) | 668 | ENTRY(sys32_setresgid16_wrapper) |
diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c index 3201ae447990..4261aa799774 100644 --- a/arch/s390/kernel/process.c +++ b/arch/s390/kernel/process.c | |||
| @@ -76,7 +76,6 @@ static void default_idle(void) | |||
| 76 | if (test_thread_flag(TIF_MCCK_PENDING)) { | 76 | if (test_thread_flag(TIF_MCCK_PENDING)) { |
| 77 | local_mcck_enable(); | 77 | local_mcck_enable(); |
| 78 | local_irq_enable(); | 78 | local_irq_enable(); |
| 79 | s390_handle_mcck(); | ||
| 80 | return; | 79 | return; |
| 81 | } | 80 | } |
| 82 | trace_hardirqs_on(); | 81 | trace_hardirqs_on(); |
| @@ -93,10 +92,12 @@ void cpu_idle(void) | |||
| 93 | for (;;) { | 92 | for (;;) { |
| 94 | tick_nohz_idle_enter(); | 93 | tick_nohz_idle_enter(); |
| 95 | rcu_idle_enter(); | 94 | rcu_idle_enter(); |
| 96 | while (!need_resched()) | 95 | while (!need_resched() && !test_thread_flag(TIF_MCCK_PENDING)) |
| 97 | default_idle(); | 96 | default_idle(); |
| 98 | rcu_idle_exit(); | 97 | rcu_idle_exit(); |
| 99 | tick_nohz_idle_exit(); | 98 | tick_nohz_idle_exit(); |
| 99 | if (test_thread_flag(TIF_MCCK_PENDING)) | ||
| 100 | s390_handle_mcck(); | ||
| 100 | preempt_enable_no_resched(); | 101 | preempt_enable_no_resched(); |
| 101 | schedule(); | 102 | schedule(); |
| 102 | preempt_disable(); | 103 | preempt_disable(); |
diff --git a/arch/s390/kernel/time.c b/arch/s390/kernel/time.c index fa02f443f5f6..14da278febbf 100644 --- a/arch/s390/kernel/time.c +++ b/arch/s390/kernel/time.c | |||
| @@ -113,11 +113,14 @@ static void fixup_clock_comparator(unsigned long long delta) | |||
| 113 | static int s390_next_ktime(ktime_t expires, | 113 | static int s390_next_ktime(ktime_t expires, |
| 114 | struct clock_event_device *evt) | 114 | struct clock_event_device *evt) |
| 115 | { | 115 | { |
| 116 | struct timespec ts; | ||
| 116 | u64 nsecs; | 117 | u64 nsecs; |
| 117 | 118 | ||
| 118 | nsecs = ktime_to_ns(ktime_sub(expires, ktime_get_monotonic_offset())); | 119 | ts.tv_sec = ts.tv_nsec = 0; |
| 120 | monotonic_to_bootbased(&ts); | ||
| 121 | nsecs = ktime_to_ns(ktime_add(timespec_to_ktime(ts), expires)); | ||
| 119 | do_div(nsecs, 125); | 122 | do_div(nsecs, 125); |
| 120 | S390_lowcore.clock_comparator = TOD_UNIX_EPOCH + (nsecs << 9); | 123 | S390_lowcore.clock_comparator = sched_clock_base_cc + (nsecs << 9); |
| 121 | set_clock_comparator(S390_lowcore.clock_comparator); | 124 | set_clock_comparator(S390_lowcore.clock_comparator); |
| 122 | return 0; | 125 | return 0; |
| 123 | } | 126 | } |
diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c index 9a4d02f64f16..51b0738e13d1 100644 --- a/arch/s390/mm/pgtable.c +++ b/arch/s390/mm/pgtable.c | |||
| @@ -574,7 +574,7 @@ static inline void page_table_free_pgste(unsigned long *table) | |||
| 574 | page = pfn_to_page(__pa(table) >> PAGE_SHIFT); | 574 | page = pfn_to_page(__pa(table) >> PAGE_SHIFT); |
| 575 | mp = (struct gmap_pgtable *) page->index; | 575 | mp = (struct gmap_pgtable *) page->index; |
| 576 | BUG_ON(!list_empty(&mp->mapper)); | 576 | BUG_ON(!list_empty(&mp->mapper)); |
| 577 | pgtable_page_ctor(page); | 577 | pgtable_page_dtor(page); |
| 578 | atomic_set(&page->_mapcount, -1); | 578 | atomic_set(&page->_mapcount, -1); |
| 579 | kfree(mp); | 579 | kfree(mp); |
| 580 | __free_page(page); | 580 | __free_page(page); |
diff --git a/arch/sh/boards/board-sh7757lcr.c b/arch/sh/boards/board-sh7757lcr.c index 0838154dd216..24b1ee410daa 100644 --- a/arch/sh/boards/board-sh7757lcr.c +++ b/arch/sh/boards/board-sh7757lcr.c | |||
| @@ -169,6 +169,11 @@ static struct resource sh_eth_giga1_resources[] = { | |||
| 169 | .end = 0xfee00fff, | 169 | .end = 0xfee00fff, |
| 170 | .flags = IORESOURCE_MEM, | 170 | .flags = IORESOURCE_MEM, |
| 171 | }, { | 171 | }, { |
| 172 | /* TSU */ | ||
| 173 | .start = 0xfee01800, | ||
| 174 | .end = 0xfee01fff, | ||
| 175 | .flags = IORESOURCE_MEM, | ||
| 176 | }, { | ||
| 172 | .start = 316, | 177 | .start = 316, |
| 173 | .end = 316, | 178 | .end = 316, |
| 174 | .flags = IORESOURCE_IRQ, | 179 | .flags = IORESOURCE_IRQ, |
| @@ -210,20 +215,13 @@ static struct resource sh_mmcif_resources[] = { | |||
| 210 | }, | 215 | }, |
| 211 | }; | 216 | }; |
| 212 | 217 | ||
| 213 | static struct sh_mmcif_dma sh7757lcr_mmcif_dma = { | ||
| 214 | .chan_priv_tx = { | ||
| 215 | .slave_id = SHDMA_SLAVE_MMCIF_TX, | ||
| 216 | }, | ||
| 217 | .chan_priv_rx = { | ||
| 218 | .slave_id = SHDMA_SLAVE_MMCIF_RX, | ||
| 219 | } | ||
| 220 | }; | ||
| 221 | |||
| 222 | static struct sh_mmcif_plat_data sh_mmcif_plat = { | 218 | static struct sh_mmcif_plat_data sh_mmcif_plat = { |
| 223 | .dma = &sh7757lcr_mmcif_dma, | ||
| 224 | .sup_pclk = 0x0f, | 219 | .sup_pclk = 0x0f, |
| 225 | .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA, | 220 | .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA | |
| 221 | MMC_CAP_NONREMOVABLE, | ||
| 226 | .ocr = MMC_VDD_32_33 | MMC_VDD_33_34, | 222 | .ocr = MMC_VDD_32_33 | MMC_VDD_33_34, |
| 223 | .slave_id_tx = SHDMA_SLAVE_MMCIF_TX, | ||
| 224 | .slave_id_rx = SHDMA_SLAVE_MMCIF_RX, | ||
| 227 | }; | 225 | }; |
| 228 | 226 | ||
| 229 | static struct platform_device sh_mmcif_device = { | 227 | static struct platform_device sh_mmcif_device = { |
diff --git a/arch/sh/boards/mach-ap325rxa/setup.c b/arch/sh/boards/mach-ap325rxa/setup.c index 6418e95c2b6b..ebd0f818a25f 100644 --- a/arch/sh/boards/mach-ap325rxa/setup.c +++ b/arch/sh/boards/mach-ap325rxa/setup.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <linux/i2c.h> | 22 | #include <linux/i2c.h> |
| 23 | #include <linux/smsc911x.h> | 23 | #include <linux/smsc911x.h> |
| 24 | #include <linux/gpio.h> | 24 | #include <linux/gpio.h> |
| 25 | #include <linux/videodev2.h> | ||
| 25 | #include <media/ov772x.h> | 26 | #include <media/ov772x.h> |
| 26 | #include <media/soc_camera.h> | 27 | #include <media/soc_camera.h> |
| 27 | #include <media/soc_camera_platform.h> | 28 | #include <media/soc_camera_platform.h> |
diff --git a/arch/sh/boards/mach-ecovec24/setup.c b/arch/sh/boards/mach-ecovec24/setup.c index 033ef2ba621f..cde7c0085ced 100644 --- a/arch/sh/boards/mach-ecovec24/setup.c +++ b/arch/sh/boards/mach-ecovec24/setup.c | |||
| @@ -29,9 +29,11 @@ | |||
| 29 | #include <linux/input.h> | 29 | #include <linux/input.h> |
| 30 | #include <linux/input/sh_keysc.h> | 30 | #include <linux/input/sh_keysc.h> |
| 31 | #include <linux/sh_eth.h> | 31 | #include <linux/sh_eth.h> |
| 32 | #include <linux/videodev2.h> | ||
| 32 | #include <video/sh_mobile_lcdc.h> | 33 | #include <video/sh_mobile_lcdc.h> |
| 33 | #include <sound/sh_fsi.h> | 34 | #include <sound/sh_fsi.h> |
| 34 | #include <media/sh_mobile_ceu.h> | 35 | #include <media/sh_mobile_ceu.h> |
| 36 | #include <media/soc_camera.h> | ||
| 35 | #include <media/tw9910.h> | 37 | #include <media/tw9910.h> |
| 36 | #include <media/mt9t112.h> | 38 | #include <media/mt9t112.h> |
| 37 | #include <asm/heartbeat.h> | 39 | #include <asm/heartbeat.h> |
diff --git a/arch/sh/boards/mach-kfr2r09/setup.c b/arch/sh/boards/mach-kfr2r09/setup.c index 2a18b06abdaf..5b382e1afaea 100644 --- a/arch/sh/boards/mach-kfr2r09/setup.c +++ b/arch/sh/boards/mach-kfr2r09/setup.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <linux/input/sh_keysc.h> | 22 | #include <linux/input/sh_keysc.h> |
| 23 | #include <linux/i2c.h> | 23 | #include <linux/i2c.h> |
| 24 | #include <linux/usb/r8a66597.h> | 24 | #include <linux/usb/r8a66597.h> |
| 25 | #include <linux/videodev2.h> | ||
| 25 | #include <media/rj54n1cb0c.h> | 26 | #include <media/rj54n1cb0c.h> |
| 26 | #include <media/soc_camera.h> | 27 | #include <media/soc_camera.h> |
| 27 | #include <media/sh_mobile_ceu.h> | 28 | #include <media/sh_mobile_ceu.h> |
diff --git a/arch/sh/boards/mach-migor/setup.c b/arch/sh/boards/mach-migor/setup.c index 68c3d6f42896..d37ba2720527 100644 --- a/arch/sh/boards/mach-migor/setup.c +++ b/arch/sh/boards/mach-migor/setup.c | |||
| @@ -21,9 +21,11 @@ | |||
| 21 | #include <linux/delay.h> | 21 | #include <linux/delay.h> |
| 22 | #include <linux/clk.h> | 22 | #include <linux/clk.h> |
| 23 | #include <linux/gpio.h> | 23 | #include <linux/gpio.h> |
| 24 | #include <linux/videodev2.h> | ||
| 24 | #include <video/sh_mobile_lcdc.h> | 25 | #include <video/sh_mobile_lcdc.h> |
| 25 | #include <media/sh_mobile_ceu.h> | 26 | #include <media/sh_mobile_ceu.h> |
| 26 | #include <media/ov772x.h> | 27 | #include <media/ov772x.h> |
| 28 | #include <media/soc_camera.h> | ||
| 27 | #include <media/tw9910.h> | 29 | #include <media/tw9910.h> |
| 28 | #include <asm/clock.h> | 30 | #include <asm/clock.h> |
| 29 | #include <asm/machvec.h> | 31 | #include <asm/machvec.h> |
diff --git a/arch/sh/boards/mach-se/7724/setup.c b/arch/sh/boards/mach-se/7724/setup.c index 036fe1adaef1..2b07fc016950 100644 --- a/arch/sh/boards/mach-se/7724/setup.c +++ b/arch/sh/boards/mach-se/7724/setup.c | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | #include <linux/input/sh_keysc.h> | 24 | #include <linux/input/sh_keysc.h> |
| 25 | #include <linux/usb/r8a66597.h> | 25 | #include <linux/usb/r8a66597.h> |
| 26 | #include <linux/sh_eth.h> | 26 | #include <linux/sh_eth.h> |
| 27 | #include <linux/videodev2.h> | ||
| 27 | #include <video/sh_mobile_lcdc.h> | 28 | #include <video/sh_mobile_lcdc.h> |
| 28 | #include <media/sh_mobile_ceu.h> | 29 | #include <media/sh_mobile_ceu.h> |
| 29 | #include <sound/sh_fsi.h> | 30 | #include <sound/sh_fsi.h> |
diff --git a/arch/sh/drivers/pci/pci-sh7780.c b/arch/sh/drivers/pci/pci-sh7780.c index fa7b978cc727..fb8f14990743 100644 --- a/arch/sh/drivers/pci/pci-sh7780.c +++ b/arch/sh/drivers/pci/pci-sh7780.c | |||
| @@ -74,7 +74,7 @@ struct pci_errors { | |||
| 74 | { SH4_PCIINT_MLCK, "master lock error" }, | 74 | { SH4_PCIINT_MLCK, "master lock error" }, |
| 75 | { SH4_PCIINT_TABT, "target-target abort" }, | 75 | { SH4_PCIINT_TABT, "target-target abort" }, |
| 76 | { SH4_PCIINT_TRET, "target retry time out" }, | 76 | { SH4_PCIINT_TRET, "target retry time out" }, |
| 77 | { SH4_PCIINT_MFDE, "master function disable erorr" }, | 77 | { SH4_PCIINT_MFDE, "master function disable error" }, |
| 78 | { SH4_PCIINT_PRTY, "address parity error" }, | 78 | { SH4_PCIINT_PRTY, "address parity error" }, |
| 79 | { SH4_PCIINT_SERR, "SERR" }, | 79 | { SH4_PCIINT_SERR, "SERR" }, |
| 80 | { SH4_PCIINT_TWDP, "data parity error for target write" }, | 80 | { SH4_PCIINT_TWDP, "data parity error for target write" }, |
diff --git a/arch/sh/include/asm/device.h b/arch/sh/include/asm/device.h index a1c9c0daec10..071bcb4d4bfd 100644 --- a/arch/sh/include/asm/device.h +++ b/arch/sh/include/asm/device.h | |||
| @@ -3,9 +3,10 @@ | |||
| 3 | * | 3 | * |
| 4 | * This file is released under the GPLv2 | 4 | * This file is released under the GPLv2 |
| 5 | */ | 5 | */ |
| 6 | #ifndef __ASM_SH_DEVICE_H | ||
| 7 | #define __ASM_SH_DEVICE_H | ||
| 6 | 8 | ||
| 7 | struct dev_archdata { | 9 | #include <asm-generic/device.h> |
| 8 | }; | ||
| 9 | 10 | ||
| 10 | struct platform_device; | 11 | struct platform_device; |
| 11 | /* allocate contiguous memory chunk and fill in struct resource */ | 12 | /* allocate contiguous memory chunk and fill in struct resource */ |
| @@ -14,5 +15,4 @@ int platform_resource_setup_memory(struct platform_device *pdev, | |||
| 14 | 15 | ||
| 15 | void plat_early_device_setup(void); | 16 | void plat_early_device_setup(void); |
| 16 | 17 | ||
| 17 | struct pdev_archdata { | 18 | #endif /* __ASM_SH_DEVICE_H */ |
| 18 | }; | ||
diff --git a/arch/sh/kernel/cpu/sh4a/clock-sh7724.c b/arch/sh/kernel/cpu/sh4a/clock-sh7724.c index b3c039a5064a..70bd96646f42 100644 --- a/arch/sh/kernel/cpu/sh4a/clock-sh7724.c +++ b/arch/sh/kernel/cpu/sh4a/clock-sh7724.c | |||
| @@ -343,7 +343,7 @@ static struct clk_lookup lookups[] = { | |||
| 343 | CLKDEV_DEV_ID("sh_mobile_ceu.1", &mstp_clks[HWBLK_CEU1]), | 343 | CLKDEV_DEV_ID("sh_mobile_ceu.1", &mstp_clks[HWBLK_CEU1]), |
| 344 | CLKDEV_CON_ID("beu1", &mstp_clks[HWBLK_BEU1]), | 344 | CLKDEV_CON_ID("beu1", &mstp_clks[HWBLK_BEU1]), |
| 345 | CLKDEV_CON_ID("2ddmac0", &mstp_clks[HWBLK_2DDMAC]), | 345 | CLKDEV_CON_ID("2ddmac0", &mstp_clks[HWBLK_2DDMAC]), |
| 346 | CLKDEV_CON_ID("spu0", &mstp_clks[HWBLK_SPU]), | 346 | CLKDEV_DEV_ID("sh_fsi.0", &mstp_clks[HWBLK_SPU]), |
| 347 | CLKDEV_CON_ID("jpu0", &mstp_clks[HWBLK_JPU]), | 347 | CLKDEV_CON_ID("jpu0", &mstp_clks[HWBLK_JPU]), |
| 348 | CLKDEV_DEV_ID("sh-vou.0", &mstp_clks[HWBLK_VOU]), | 348 | CLKDEV_DEV_ID("sh-vou.0", &mstp_clks[HWBLK_VOU]), |
| 349 | CLKDEV_CON_ID("beu0", &mstp_clks[HWBLK_BEU0]), | 349 | CLKDEV_CON_ID("beu0", &mstp_clks[HWBLK_BEU0]), |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7757.c b/arch/sh/kernel/cpu/sh4a/setup-sh7757.c index a7b2da6b3a1a..2875e8be4f72 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7757.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7757.c | |||
| @@ -133,7 +133,7 @@ static struct resource spi0_resources[] = { | |||
| 133 | [0] = { | 133 | [0] = { |
| 134 | .start = 0xfe002000, | 134 | .start = 0xfe002000, |
| 135 | .end = 0xfe0020ff, | 135 | .end = 0xfe0020ff, |
| 136 | .flags = IORESOURCE_MEM, | 136 | .flags = IORESOURCE_MEM | IORESOURCE_MEM_32BIT, |
| 137 | }, | 137 | }, |
| 138 | [1] = { | 138 | [1] = { |
| 139 | .start = 86, | 139 | .start = 86, |
| @@ -661,6 +661,25 @@ static struct platform_device spi0_device = { | |||
| 661 | .resource = spi0_resources, | 661 | .resource = spi0_resources, |
| 662 | }; | 662 | }; |
| 663 | 663 | ||
| 664 | static struct resource spi1_resources[] = { | ||
| 665 | { | ||
| 666 | .start = 0xffd8ee70, | ||
| 667 | .end = 0xffd8eeff, | ||
| 668 | .flags = IORESOURCE_MEM | IORESOURCE_MEM_8BIT, | ||
| 669 | }, | ||
| 670 | { | ||
| 671 | .start = 54, | ||
| 672 | .flags = IORESOURCE_IRQ, | ||
| 673 | }, | ||
| 674 | }; | ||
| 675 | |||
| 676 | static struct platform_device spi1_device = { | ||
| 677 | .name = "sh_spi", | ||
| 678 | .id = 1, | ||
| 679 | .num_resources = ARRAY_SIZE(spi1_resources), | ||
| 680 | .resource = spi1_resources, | ||
| 681 | }; | ||
| 682 | |||
| 664 | static struct resource usb_ehci_resources[] = { | 683 | static struct resource usb_ehci_resources[] = { |
| 665 | [0] = { | 684 | [0] = { |
| 666 | .start = 0xfe4f1000, | 685 | .start = 0xfe4f1000, |
| @@ -720,6 +739,7 @@ static struct platform_device *sh7757_devices[] __initdata = { | |||
| 720 | &dma2_device, | 739 | &dma2_device, |
| 721 | &dma3_device, | 740 | &dma3_device, |
| 722 | &spi0_device, | 741 | &spi0_device, |
| 742 | &spi1_device, | ||
| 723 | &usb_ehci_device, | 743 | &usb_ehci_device, |
| 724 | &usb_ohci_device, | 744 | &usb_ohci_device, |
| 725 | }; | 745 | }; |
diff --git a/arch/sh/kernel/smp.c b/arch/sh/kernel/smp.c index 3147a9a6fb8b..f624174bf239 100644 --- a/arch/sh/kernel/smp.c +++ b/arch/sh/kernel/smp.c | |||
| @@ -63,7 +63,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus) | |||
| 63 | mp_ops->prepare_cpus(max_cpus); | 63 | mp_ops->prepare_cpus(max_cpus); |
| 64 | 64 | ||
| 65 | #ifndef CONFIG_HOTPLUG_CPU | 65 | #ifndef CONFIG_HOTPLUG_CPU |
| 66 | init_cpu_present(&cpu_possible_map); | 66 | init_cpu_present(cpu_possible_mask); |
| 67 | #endif | 67 | #endif |
| 68 | } | 68 | } |
| 69 | 69 | ||
diff --git a/arch/sh/kernel/topology.c b/arch/sh/kernel/topology.c index 4649a6ff0cfe..772caffba22f 100644 --- a/arch/sh/kernel/topology.c +++ b/arch/sh/kernel/topology.c | |||
| @@ -27,7 +27,7 @@ static cpumask_t cpu_coregroup_map(unsigned int cpu) | |||
| 27 | * Presently all SH-X3 SMP cores are multi-cores, so just keep it | 27 | * Presently all SH-X3 SMP cores are multi-cores, so just keep it |
| 28 | * simple until we have a method for determining topology.. | 28 | * simple until we have a method for determining topology.. |
| 29 | */ | 29 | */ |
| 30 | return cpu_possible_map; | 30 | return *cpu_possible_mask; |
| 31 | } | 31 | } |
| 32 | 32 | ||
| 33 | const struct cpumask *cpu_coregroup_mask(unsigned int cpu) | 33 | const struct cpumask *cpu_coregroup_mask(unsigned int cpu) |
diff --git a/arch/sh/mm/cache-sh2a.c b/arch/sh/mm/cache-sh2a.c index ae08cbbfa569..949e2d3138a0 100644 --- a/arch/sh/mm/cache-sh2a.c +++ b/arch/sh/mm/cache-sh2a.c | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | #define MAX_OCACHE_PAGES 32 | 23 | #define MAX_OCACHE_PAGES 32 |
| 24 | #define MAX_ICACHE_PAGES 32 | 24 | #define MAX_ICACHE_PAGES 32 |
| 25 | 25 | ||
| 26 | #ifdef CONFIG_CACHE_WRITEBACK | ||
| 26 | static void sh2a_flush_oc_line(unsigned long v, int way) | 27 | static void sh2a_flush_oc_line(unsigned long v, int way) |
| 27 | { | 28 | { |
| 28 | unsigned long addr = (v & 0x000007f0) | (way << 11); | 29 | unsigned long addr = (v & 0x000007f0) | (way << 11); |
| @@ -34,6 +35,7 @@ static void sh2a_flush_oc_line(unsigned long v, int way) | |||
| 34 | __raw_writel(data, CACHE_OC_ADDRESS_ARRAY | addr); | 35 | __raw_writel(data, CACHE_OC_ADDRESS_ARRAY | addr); |
| 35 | } | 36 | } |
| 36 | } | 37 | } |
| 38 | #endif | ||
| 37 | 39 | ||
| 38 | static void sh2a_invalidate_line(unsigned long cache_addr, unsigned long v) | 40 | static void sh2a_invalidate_line(unsigned long cache_addr, unsigned long v) |
| 39 | { | 41 | { |
diff --git a/arch/x86/include/asm/i387.h b/arch/x86/include/asm/i387.h index 6919e936345b..247904945d3f 100644 --- a/arch/x86/include/asm/i387.h +++ b/arch/x86/include/asm/i387.h | |||
| @@ -29,10 +29,11 @@ extern unsigned int sig_xstate_size; | |||
| 29 | extern void fpu_init(void); | 29 | extern void fpu_init(void); |
| 30 | extern void mxcsr_feature_mask_init(void); | 30 | extern void mxcsr_feature_mask_init(void); |
| 31 | extern int init_fpu(struct task_struct *child); | 31 | extern int init_fpu(struct task_struct *child); |
| 32 | extern asmlinkage void math_state_restore(void); | 32 | extern void math_state_restore(void); |
| 33 | extern void __math_state_restore(void); | ||
| 34 | extern int dump_fpu(struct pt_regs *, struct user_i387_struct *); | 33 | extern int dump_fpu(struct pt_regs *, struct user_i387_struct *); |
| 35 | 34 | ||
| 35 | DECLARE_PER_CPU(struct task_struct *, fpu_owner_task); | ||
| 36 | |||
| 36 | extern user_regset_active_fn fpregs_active, xfpregs_active; | 37 | extern user_regset_active_fn fpregs_active, xfpregs_active; |
| 37 | extern user_regset_get_fn fpregs_get, xfpregs_get, fpregs_soft_get, | 38 | extern user_regset_get_fn fpregs_get, xfpregs_get, fpregs_soft_get, |
| 38 | xstateregs_get; | 39 | xstateregs_get; |
| @@ -212,19 +213,11 @@ static inline void fpu_fxsave(struct fpu *fpu) | |||
| 212 | 213 | ||
| 213 | #endif /* CONFIG_X86_64 */ | 214 | #endif /* CONFIG_X86_64 */ |
| 214 | 215 | ||
| 215 | /* We need a safe address that is cheap to find and that is already | ||
| 216 | in L1 during context switch. The best choices are unfortunately | ||
| 217 | different for UP and SMP */ | ||
| 218 | #ifdef CONFIG_SMP | ||
| 219 | #define safe_address (__per_cpu_offset[0]) | ||
| 220 | #else | ||
| 221 | #define safe_address (__get_cpu_var(kernel_cpustat).cpustat[CPUTIME_USER]) | ||
| 222 | #endif | ||
| 223 | |||
| 224 | /* | 216 | /* |
| 225 | * These must be called with preempt disabled | 217 | * These must be called with preempt disabled. Returns |
| 218 | * 'true' if the FPU state is still intact. | ||
| 226 | */ | 219 | */ |
| 227 | static inline void fpu_save_init(struct fpu *fpu) | 220 | static inline int fpu_save_init(struct fpu *fpu) |
| 228 | { | 221 | { |
| 229 | if (use_xsave()) { | 222 | if (use_xsave()) { |
| 230 | fpu_xsave(fpu); | 223 | fpu_xsave(fpu); |
| @@ -233,33 +226,33 @@ static inline void fpu_save_init(struct fpu *fpu) | |||
| 233 | * xsave header may indicate the init state of the FP. | 226 | * xsave header may indicate the init state of the FP. |
| 234 | */ | 227 | */ |
| 235 | if (!(fpu->state->xsave.xsave_hdr.xstate_bv & XSTATE_FP)) | 228 | if (!(fpu->state->xsave.xsave_hdr.xstate_bv & XSTATE_FP)) |
| 236 | return; | 229 | return 1; |
| 237 | } else if (use_fxsr()) { | 230 | } else if (use_fxsr()) { |
| 238 | fpu_fxsave(fpu); | 231 | fpu_fxsave(fpu); |
| 239 | } else { | 232 | } else { |
| 240 | asm volatile("fnsave %[fx]; fwait" | 233 | asm volatile("fnsave %[fx]; fwait" |
| 241 | : [fx] "=m" (fpu->state->fsave)); | 234 | : [fx] "=m" (fpu->state->fsave)); |
| 242 | return; | 235 | return 0; |
| 243 | } | 236 | } |
| 244 | 237 | ||
| 245 | if (unlikely(fpu->state->fxsave.swd & X87_FSW_ES)) | 238 | /* |
| 239 | * If exceptions are pending, we need to clear them so | ||
| 240 | * that we don't randomly get exceptions later. | ||
| 241 | * | ||
| 242 | * FIXME! Is this perhaps only true for the old-style | ||
| 243 | * irq13 case? Maybe we could leave the x87 state | ||
| 244 | * intact otherwise? | ||
| 245 | */ | ||
| 246 | if (unlikely(fpu->state->fxsave.swd & X87_FSW_ES)) { | ||
| 246 | asm volatile("fnclex"); | 247 | asm volatile("fnclex"); |
| 247 | 248 | return 0; | |
| 248 | /* AMD K7/K8 CPUs don't save/restore FDP/FIP/FOP unless an exception | 249 | } |
| 249 | is pending. Clear the x87 state here by setting it to fixed | 250 | return 1; |
| 250 | values. safe_address is a random variable that should be in L1 */ | ||
| 251 | alternative_input( | ||
| 252 | ASM_NOP8 ASM_NOP2, | ||
| 253 | "emms\n\t" /* clear stack tags */ | ||
| 254 | "fildl %P[addr]", /* set F?P to defined value */ | ||
| 255 | X86_FEATURE_FXSAVE_LEAK, | ||
| 256 | [addr] "m" (safe_address)); | ||
| 257 | } | 251 | } |
| 258 | 252 | ||
| 259 | static inline void __save_init_fpu(struct task_struct *tsk) | 253 | static inline int __save_init_fpu(struct task_struct *tsk) |
| 260 | { | 254 | { |
| 261 | fpu_save_init(&tsk->thread.fpu); | 255 | return fpu_save_init(&tsk->thread.fpu); |
| 262 | task_thread_info(tsk)->status &= ~TS_USEDFPU; | ||
| 263 | } | 256 | } |
| 264 | 257 | ||
| 265 | static inline int fpu_fxrstor_checking(struct fpu *fpu) | 258 | static inline int fpu_fxrstor_checking(struct fpu *fpu) |
| @@ -277,44 +270,212 @@ static inline int fpu_restore_checking(struct fpu *fpu) | |||
| 277 | 270 | ||
| 278 | static inline int restore_fpu_checking(struct task_struct *tsk) | 271 | static inline int restore_fpu_checking(struct task_struct *tsk) |
| 279 | { | 272 | { |
| 273 | /* AMD K7/K8 CPUs don't save/restore FDP/FIP/FOP unless an exception | ||
| 274 | is pending. Clear the x87 state here by setting it to fixed | ||
| 275 | values. "m" is a random variable that should be in L1 */ | ||
| 276 | alternative_input( | ||
| 277 | ASM_NOP8 ASM_NOP2, | ||
| 278 | "emms\n\t" /* clear stack tags */ | ||
| 279 | "fildl %P[addr]", /* set F?P to defined value */ | ||
| 280 | X86_FEATURE_FXSAVE_LEAK, | ||
| 281 | [addr] "m" (tsk->thread.fpu.has_fpu)); | ||
| 282 | |||
| 280 | return fpu_restore_checking(&tsk->thread.fpu); | 283 | return fpu_restore_checking(&tsk->thread.fpu); |
| 281 | } | 284 | } |
| 282 | 285 | ||
| 283 | /* | 286 | /* |
| 284 | * Signal frame handlers... | 287 | * Software FPU state helpers. Careful: these need to |
| 288 | * be preemption protection *and* they need to be | ||
| 289 | * properly paired with the CR0.TS changes! | ||
| 285 | */ | 290 | */ |
| 286 | extern int save_i387_xstate(void __user *buf); | 291 | static inline int __thread_has_fpu(struct task_struct *tsk) |
| 287 | extern int restore_i387_xstate(void __user *buf); | 292 | { |
| 293 | return tsk->thread.fpu.has_fpu; | ||
| 294 | } | ||
| 288 | 295 | ||
| 289 | static inline void __unlazy_fpu(struct task_struct *tsk) | 296 | /* Must be paired with an 'stts' after! */ |
| 297 | static inline void __thread_clear_has_fpu(struct task_struct *tsk) | ||
| 290 | { | 298 | { |
| 291 | if (task_thread_info(tsk)->status & TS_USEDFPU) { | 299 | tsk->thread.fpu.has_fpu = 0; |
| 292 | __save_init_fpu(tsk); | 300 | percpu_write(fpu_owner_task, NULL); |
| 293 | stts(); | 301 | } |
| 294 | } else | 302 | |
| 295 | tsk->fpu_counter = 0; | 303 | /* Must be paired with a 'clts' before! */ |
| 304 | static inline void __thread_set_has_fpu(struct task_struct *tsk) | ||
| 305 | { | ||
| 306 | tsk->thread.fpu.has_fpu = 1; | ||
| 307 | percpu_write(fpu_owner_task, tsk); | ||
| 308 | } | ||
| 309 | |||
| 310 | /* | ||
| 311 | * Encapsulate the CR0.TS handling together with the | ||
| 312 | * software flag. | ||
| 313 | * | ||
| 314 | * These generally need preemption protection to work, | ||
| 315 | * do try to avoid using these on their own. | ||
| 316 | */ | ||
| 317 | static inline void __thread_fpu_end(struct task_struct *tsk) | ||
| 318 | { | ||
| 319 | __thread_clear_has_fpu(tsk); | ||
| 320 | stts(); | ||
| 321 | } | ||
| 322 | |||
| 323 | static inline void __thread_fpu_begin(struct task_struct *tsk) | ||
| 324 | { | ||
| 325 | clts(); | ||
| 326 | __thread_set_has_fpu(tsk); | ||
| 327 | } | ||
| 328 | |||
| 329 | /* | ||
| 330 | * FPU state switching for scheduling. | ||
| 331 | * | ||
| 332 | * This is a two-stage process: | ||
| 333 | * | ||
| 334 | * - switch_fpu_prepare() saves the old state and | ||
| 335 | * sets the new state of the CR0.TS bit. This is | ||
| 336 | * done within the context of the old process. | ||
| 337 | * | ||
| 338 | * - switch_fpu_finish() restores the new state as | ||
| 339 | * necessary. | ||
| 340 | */ | ||
| 341 | typedef struct { int preload; } fpu_switch_t; | ||
| 342 | |||
| 343 | /* | ||
| 344 | * FIXME! We could do a totally lazy restore, but we need to | ||
| 345 | * add a per-cpu "this was the task that last touched the FPU | ||
| 346 | * on this CPU" variable, and the task needs to have a "I last | ||
| 347 | * touched the FPU on this CPU" and check them. | ||
| 348 | * | ||
| 349 | * We don't do that yet, so "fpu_lazy_restore()" always returns | ||
| 350 | * false, but some day.. | ||
| 351 | */ | ||
| 352 | static inline int fpu_lazy_restore(struct task_struct *new, unsigned int cpu) | ||
| 353 | { | ||
| 354 | return new == percpu_read_stable(fpu_owner_task) && | ||
| 355 | cpu == new->thread.fpu.last_cpu; | ||
| 356 | } | ||
| 357 | |||
| 358 | static inline fpu_switch_t switch_fpu_prepare(struct task_struct *old, struct task_struct *new, int cpu) | ||
| 359 | { | ||
| 360 | fpu_switch_t fpu; | ||
| 361 | |||
| 362 | fpu.preload = tsk_used_math(new) && new->fpu_counter > 5; | ||
| 363 | if (__thread_has_fpu(old)) { | ||
| 364 | if (!__save_init_fpu(old)) | ||
| 365 | cpu = ~0; | ||
| 366 | old->thread.fpu.last_cpu = cpu; | ||
| 367 | old->thread.fpu.has_fpu = 0; /* But leave fpu_owner_task! */ | ||
| 368 | |||
| 369 | /* Don't change CR0.TS if we just switch! */ | ||
| 370 | if (fpu.preload) { | ||
| 371 | new->fpu_counter++; | ||
| 372 | __thread_set_has_fpu(new); | ||
| 373 | prefetch(new->thread.fpu.state); | ||
| 374 | } else | ||
| 375 | stts(); | ||
| 376 | } else { | ||
| 377 | old->fpu_counter = 0; | ||
| 378 | old->thread.fpu.last_cpu = ~0; | ||
| 379 | if (fpu.preload) { | ||
| 380 | new->fpu_counter++; | ||
| 381 | if (fpu_lazy_restore(new, cpu)) | ||
| 382 | fpu.preload = 0; | ||
| 383 | else | ||
| 384 | prefetch(new->thread.fpu.state); | ||
| 385 | __thread_fpu_begin(new); | ||
| 386 | } | ||
| 387 | } | ||
| 388 | return fpu; | ||
| 389 | } | ||
| 390 | |||
| 391 | /* | ||
| 392 | * By the time this gets called, we've already cleared CR0.TS and | ||
| 393 | * given the process the FPU if we are going to preload the FPU | ||
| 394 | * state - all we need to do is to conditionally restore the register | ||
| 395 | * state itself. | ||
| 396 | */ | ||
| 397 | static inline void switch_fpu_finish(struct task_struct *new, fpu_switch_t fpu) | ||
| 398 | { | ||
| 399 | if (fpu.preload) { | ||
| 400 | if (unlikely(restore_fpu_checking(new))) | ||
| 401 | __thread_fpu_end(new); | ||
| 402 | } | ||
| 296 | } | 403 | } |
| 297 | 404 | ||
| 405 | /* | ||
| 406 | * Signal frame handlers... | ||
| 407 | */ | ||
| 408 | extern int save_i387_xstate(void __user *buf); | ||
| 409 | extern int restore_i387_xstate(void __user *buf); | ||
| 410 | |||
| 298 | static inline void __clear_fpu(struct task_struct *tsk) | 411 | static inline void __clear_fpu(struct task_struct *tsk) |
| 299 | { | 412 | { |
| 300 | if (task_thread_info(tsk)->status & TS_USEDFPU) { | 413 | if (__thread_has_fpu(tsk)) { |
| 301 | /* Ignore delayed exceptions from user space */ | 414 | /* Ignore delayed exceptions from user space */ |
| 302 | asm volatile("1: fwait\n" | 415 | asm volatile("1: fwait\n" |
| 303 | "2:\n" | 416 | "2:\n" |
| 304 | _ASM_EXTABLE(1b, 2b)); | 417 | _ASM_EXTABLE(1b, 2b)); |
| 305 | task_thread_info(tsk)->status &= ~TS_USEDFPU; | 418 | __thread_fpu_end(tsk); |
| 306 | stts(); | ||
| 307 | } | 419 | } |
| 308 | } | 420 | } |
| 309 | 421 | ||
| 422 | /* | ||
| 423 | * Were we in an interrupt that interrupted kernel mode? | ||
| 424 | * | ||
| 425 | * We can do a kernel_fpu_begin/end() pair *ONLY* if that | ||
| 426 | * pair does nothing at all: the thread must not have fpu (so | ||
| 427 | * that we don't try to save the FPU state), and TS must | ||
| 428 | * be set (so that the clts/stts pair does nothing that is | ||
| 429 | * visible in the interrupted kernel thread). | ||
| 430 | */ | ||
| 431 | static inline bool interrupted_kernel_fpu_idle(void) | ||
| 432 | { | ||
| 433 | return !__thread_has_fpu(current) && | ||
| 434 | (read_cr0() & X86_CR0_TS); | ||
| 435 | } | ||
| 436 | |||
| 437 | /* | ||
| 438 | * Were we in user mode (or vm86 mode) when we were | ||
| 439 | * interrupted? | ||
| 440 | * | ||
| 441 | * Doing kernel_fpu_begin/end() is ok if we are running | ||
| 442 | * in an interrupt context from user mode - we'll just | ||
| 443 | * save the FPU state as required. | ||
| 444 | */ | ||
| 445 | static inline bool interrupted_user_mode(void) | ||
| 446 | { | ||
| 447 | struct pt_regs *regs = get_irq_regs(); | ||
| 448 | return regs && user_mode_vm(regs); | ||
| 449 | } | ||
| 450 | |||
| 451 | /* | ||
| 452 | * Can we use the FPU in kernel mode with the | ||
| 453 | * whole "kernel_fpu_begin/end()" sequence? | ||
| 454 | * | ||
| 455 | * It's always ok in process context (ie "not interrupt") | ||
| 456 | * but it is sometimes ok even from an irq. | ||
| 457 | */ | ||
| 458 | static inline bool irq_fpu_usable(void) | ||
| 459 | { | ||
| 460 | return !in_interrupt() || | ||
| 461 | interrupted_user_mode() || | ||
| 462 | interrupted_kernel_fpu_idle(); | ||
| 463 | } | ||
| 464 | |||
| 310 | static inline void kernel_fpu_begin(void) | 465 | static inline void kernel_fpu_begin(void) |
| 311 | { | 466 | { |
| 312 | struct thread_info *me = current_thread_info(); | 467 | struct task_struct *me = current; |
| 468 | |||
| 469 | WARN_ON_ONCE(!irq_fpu_usable()); | ||
| 313 | preempt_disable(); | 470 | preempt_disable(); |
| 314 | if (me->status & TS_USEDFPU) | 471 | if (__thread_has_fpu(me)) { |
| 315 | __save_init_fpu(me->task); | 472 | __save_init_fpu(me); |
| 316 | else | 473 | __thread_clear_has_fpu(me); |
| 474 | /* We do 'stts()' in kernel_fpu_end() */ | ||
| 475 | } else { | ||
| 476 | percpu_write(fpu_owner_task, NULL); | ||
| 317 | clts(); | 477 | clts(); |
| 478 | } | ||
| 318 | } | 479 | } |
| 319 | 480 | ||
| 320 | static inline void kernel_fpu_end(void) | 481 | static inline void kernel_fpu_end(void) |
| @@ -323,14 +484,6 @@ static inline void kernel_fpu_end(void) | |||
| 323 | preempt_enable(); | 484 | preempt_enable(); |
| 324 | } | 485 | } |
| 325 | 486 | ||
| 326 | static inline bool irq_fpu_usable(void) | ||
| 327 | { | ||
| 328 | struct pt_regs *regs; | ||
| 329 | |||
| 330 | return !in_interrupt() || !(regs = get_irq_regs()) || \ | ||
| 331 | user_mode(regs) || (read_cr0() & X86_CR0_TS); | ||
| 332 | } | ||
| 333 | |||
| 334 | /* | 487 | /* |
| 335 | * Some instructions like VIA's padlock instructions generate a spurious | 488 | * Some instructions like VIA's padlock instructions generate a spurious |
| 336 | * DNA fault but don't modify SSE registers. And these instructions | 489 | * DNA fault but don't modify SSE registers. And these instructions |
| @@ -363,20 +516,64 @@ static inline void irq_ts_restore(int TS_state) | |||
| 363 | } | 516 | } |
| 364 | 517 | ||
| 365 | /* | 518 | /* |
| 519 | * The question "does this thread have fpu access?" | ||
| 520 | * is slightly racy, since preemption could come in | ||
| 521 | * and revoke it immediately after the test. | ||
| 522 | * | ||
| 523 | * However, even in that very unlikely scenario, | ||
| 524 | * we can just assume we have FPU access - typically | ||
| 525 | * to save the FP state - we'll just take a #NM | ||
| 526 | * fault and get the FPU access back. | ||
| 527 | * | ||
| 528 | * The actual user_fpu_begin/end() functions | ||
| 529 | * need to be preemption-safe, though. | ||
| 530 | * | ||
| 531 | * NOTE! user_fpu_end() must be used only after you | ||
| 532 | * have saved the FP state, and user_fpu_begin() must | ||
| 533 | * be used only immediately before restoring it. | ||
| 534 | * These functions do not do any save/restore on | ||
| 535 | * their own. | ||
| 536 | */ | ||
| 537 | static inline int user_has_fpu(void) | ||
| 538 | { | ||
| 539 | return __thread_has_fpu(current); | ||
| 540 | } | ||
| 541 | |||
| 542 | static inline void user_fpu_end(void) | ||
| 543 | { | ||
| 544 | preempt_disable(); | ||
| 545 | __thread_fpu_end(current); | ||
| 546 | preempt_enable(); | ||
| 547 | } | ||
| 548 | |||
| 549 | static inline void user_fpu_begin(void) | ||
| 550 | { | ||
| 551 | preempt_disable(); | ||
| 552 | if (!user_has_fpu()) | ||
| 553 | __thread_fpu_begin(current); | ||
| 554 | preempt_enable(); | ||
| 555 | } | ||
| 556 | |||
| 557 | /* | ||
| 366 | * These disable preemption on their own and are safe | 558 | * These disable preemption on their own and are safe |
| 367 | */ | 559 | */ |
| 368 | static inline void save_init_fpu(struct task_struct *tsk) | 560 | static inline void save_init_fpu(struct task_struct *tsk) |
| 369 | { | 561 | { |
| 562 | WARN_ON_ONCE(!__thread_has_fpu(tsk)); | ||
| 370 | preempt_disable(); | 563 | preempt_disable(); |
| 371 | __save_init_fpu(tsk); | 564 | __save_init_fpu(tsk); |
| 372 | stts(); | 565 | __thread_fpu_end(tsk); |
| 373 | preempt_enable(); | 566 | preempt_enable(); |
| 374 | } | 567 | } |
| 375 | 568 | ||
| 376 | static inline void unlazy_fpu(struct task_struct *tsk) | 569 | static inline void unlazy_fpu(struct task_struct *tsk) |
| 377 | { | 570 | { |
| 378 | preempt_disable(); | 571 | preempt_disable(); |
| 379 | __unlazy_fpu(tsk); | 572 | if (__thread_has_fpu(tsk)) { |
| 573 | __save_init_fpu(tsk); | ||
| 574 | __thread_fpu_end(tsk); | ||
| 575 | } else | ||
| 576 | tsk->fpu_counter = 0; | ||
| 380 | preempt_enable(); | 577 | preempt_enable(); |
| 381 | } | 578 | } |
| 382 | 579 | ||
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h index aa9088c26931..58545c97d071 100644 --- a/arch/x86/include/asm/processor.h +++ b/arch/x86/include/asm/processor.h | |||
| @@ -374,6 +374,8 @@ union thread_xstate { | |||
| 374 | }; | 374 | }; |
| 375 | 375 | ||
| 376 | struct fpu { | 376 | struct fpu { |
| 377 | unsigned int last_cpu; | ||
| 378 | unsigned int has_fpu; | ||
| 377 | union thread_xstate *state; | 379 | union thread_xstate *state; |
| 378 | }; | 380 | }; |
| 379 | 381 | ||
diff --git a/arch/x86/include/asm/thread_info.h b/arch/x86/include/asm/thread_info.h index bc817cd8b443..cfd8144d5527 100644 --- a/arch/x86/include/asm/thread_info.h +++ b/arch/x86/include/asm/thread_info.h | |||
| @@ -247,8 +247,6 @@ static inline struct thread_info *current_thread_info(void) | |||
| 247 | * ever touches our thread-synchronous status, so we don't | 247 | * ever touches our thread-synchronous status, so we don't |
| 248 | * have to worry about atomic accesses. | 248 | * have to worry about atomic accesses. |
| 249 | */ | 249 | */ |
| 250 | #define TS_USEDFPU 0x0001 /* FPU was used by this task | ||
| 251 | this quantum (SMP) */ | ||
| 252 | #define TS_COMPAT 0x0002 /* 32bit syscall active (64BIT)*/ | 250 | #define TS_COMPAT 0x0002 /* 32bit syscall active (64BIT)*/ |
| 253 | #define TS_POLLING 0x0004 /* idle task polling need_resched, | 251 | #define TS_POLLING 0x0004 /* idle task polling need_resched, |
| 254 | skip sending interrupt */ | 252 | skip sending interrupt */ |
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index d43cad74f166..c0f7d68d318f 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c | |||
| @@ -1044,6 +1044,9 @@ DEFINE_PER_CPU(char *, irq_stack_ptr) = | |||
| 1044 | 1044 | ||
| 1045 | DEFINE_PER_CPU(unsigned int, irq_count) = -1; | 1045 | DEFINE_PER_CPU(unsigned int, irq_count) = -1; |
| 1046 | 1046 | ||
| 1047 | DEFINE_PER_CPU(struct task_struct *, fpu_owner_task); | ||
| 1048 | EXPORT_PER_CPU_SYMBOL(fpu_owner_task); | ||
| 1049 | |||
| 1047 | /* | 1050 | /* |
| 1048 | * Special IST stacks which the CPU switches to when it calls | 1051 | * Special IST stacks which the CPU switches to when it calls |
| 1049 | * an IST-marked descriptor entry. Up to 7 stacks (hardware | 1052 | * an IST-marked descriptor entry. Up to 7 stacks (hardware |
| @@ -1111,6 +1114,8 @@ void debug_stack_reset(void) | |||
| 1111 | 1114 | ||
| 1112 | DEFINE_PER_CPU(struct task_struct *, current_task) = &init_task; | 1115 | DEFINE_PER_CPU(struct task_struct *, current_task) = &init_task; |
| 1113 | EXPORT_PER_CPU_SYMBOL(current_task); | 1116 | EXPORT_PER_CPU_SYMBOL(current_task); |
| 1117 | DEFINE_PER_CPU(struct task_struct *, fpu_owner_task); | ||
| 1118 | EXPORT_PER_CPU_SYMBOL(fpu_owner_task); | ||
| 1114 | 1119 | ||
| 1115 | #ifdef CONFIG_CC_STACKPROTECTOR | 1120 | #ifdef CONFIG_CC_STACKPROTECTOR |
| 1116 | DEFINE_PER_CPU_ALIGNED(struct stack_canary, stack_canary); | 1121 | DEFINE_PER_CPU_ALIGNED(struct stack_canary, stack_canary); |
diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c index 485204f58cda..c08d1ff12b7c 100644 --- a/arch/x86/kernel/process_32.c +++ b/arch/x86/kernel/process_32.c | |||
| @@ -214,6 +214,7 @@ int copy_thread(unsigned long clone_flags, unsigned long sp, | |||
| 214 | 214 | ||
| 215 | task_user_gs(p) = get_user_gs(regs); | 215 | task_user_gs(p) = get_user_gs(regs); |
| 216 | 216 | ||
| 217 | p->fpu_counter = 0; | ||
| 217 | p->thread.io_bitmap_ptr = NULL; | 218 | p->thread.io_bitmap_ptr = NULL; |
| 218 | tsk = current; | 219 | tsk = current; |
| 219 | err = -ENOMEM; | 220 | err = -ENOMEM; |
| @@ -299,22 +300,11 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) | |||
| 299 | *next = &next_p->thread; | 300 | *next = &next_p->thread; |
| 300 | int cpu = smp_processor_id(); | 301 | int cpu = smp_processor_id(); |
| 301 | struct tss_struct *tss = &per_cpu(init_tss, cpu); | 302 | struct tss_struct *tss = &per_cpu(init_tss, cpu); |
| 302 | bool preload_fpu; | 303 | fpu_switch_t fpu; |
| 303 | 304 | ||
| 304 | /* never put a printk in __switch_to... printk() calls wake_up*() indirectly */ | 305 | /* never put a printk in __switch_to... printk() calls wake_up*() indirectly */ |
| 305 | 306 | ||
| 306 | /* | 307 | fpu = switch_fpu_prepare(prev_p, next_p, cpu); |
| 307 | * If the task has used fpu the last 5 timeslices, just do a full | ||
| 308 | * restore of the math state immediately to avoid the trap; the | ||
| 309 | * chances of needing FPU soon are obviously high now | ||
| 310 | */ | ||
| 311 | preload_fpu = tsk_used_math(next_p) && next_p->fpu_counter > 5; | ||
| 312 | |||
| 313 | __unlazy_fpu(prev_p); | ||
| 314 | |||
| 315 | /* we're going to use this soon, after a few expensive things */ | ||
| 316 | if (preload_fpu) | ||
| 317 | prefetch(next->fpu.state); | ||
| 318 | 308 | ||
| 319 | /* | 309 | /* |
| 320 | * Reload esp0. | 310 | * Reload esp0. |
| @@ -354,11 +344,6 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) | |||
| 354 | task_thread_info(next_p)->flags & _TIF_WORK_CTXSW_NEXT)) | 344 | task_thread_info(next_p)->flags & _TIF_WORK_CTXSW_NEXT)) |
| 355 | __switch_to_xtra(prev_p, next_p, tss); | 345 | __switch_to_xtra(prev_p, next_p, tss); |
| 356 | 346 | ||
| 357 | /* If we're going to preload the fpu context, make sure clts | ||
| 358 | is run while we're batching the cpu state updates. */ | ||
| 359 | if (preload_fpu) | ||
| 360 | clts(); | ||
| 361 | |||
| 362 | /* | 347 | /* |
| 363 | * Leave lazy mode, flushing any hypercalls made here. | 348 | * Leave lazy mode, flushing any hypercalls made here. |
| 364 | * This must be done before restoring TLS segments so | 349 | * This must be done before restoring TLS segments so |
| @@ -368,15 +353,14 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) | |||
| 368 | */ | 353 | */ |
| 369 | arch_end_context_switch(next_p); | 354 | arch_end_context_switch(next_p); |
| 370 | 355 | ||
| 371 | if (preload_fpu) | ||
| 372 | __math_state_restore(); | ||
| 373 | |||
| 374 | /* | 356 | /* |
| 375 | * Restore %gs if needed (which is common) | 357 | * Restore %gs if needed (which is common) |
| 376 | */ | 358 | */ |
| 377 | if (prev->gs | next->gs) | 359 | if (prev->gs | next->gs) |
| 378 | lazy_load_gs(next->gs); | 360 | lazy_load_gs(next->gs); |
| 379 | 361 | ||
| 362 | switch_fpu_finish(next_p, fpu); | ||
| 363 | |||
| 380 | percpu_write(current_task, next_p); | 364 | percpu_write(current_task, next_p); |
| 381 | 365 | ||
| 382 | return prev_p; | 366 | return prev_p; |
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c index 9b9fe4a85c87..cfa5c90c01db 100644 --- a/arch/x86/kernel/process_64.c +++ b/arch/x86/kernel/process_64.c | |||
| @@ -286,6 +286,7 @@ int copy_thread(unsigned long clone_flags, unsigned long sp, | |||
| 286 | 286 | ||
| 287 | set_tsk_thread_flag(p, TIF_FORK); | 287 | set_tsk_thread_flag(p, TIF_FORK); |
| 288 | 288 | ||
| 289 | p->fpu_counter = 0; | ||
| 289 | p->thread.io_bitmap_ptr = NULL; | 290 | p->thread.io_bitmap_ptr = NULL; |
| 290 | 291 | ||
| 291 | savesegment(gs, p->thread.gsindex); | 292 | savesegment(gs, p->thread.gsindex); |
| @@ -386,18 +387,9 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) | |||
| 386 | int cpu = smp_processor_id(); | 387 | int cpu = smp_processor_id(); |
| 387 | struct tss_struct *tss = &per_cpu(init_tss, cpu); | 388 | struct tss_struct *tss = &per_cpu(init_tss, cpu); |
| 388 | unsigned fsindex, gsindex; | 389 | unsigned fsindex, gsindex; |
| 389 | bool preload_fpu; | 390 | fpu_switch_t fpu; |
| 390 | 391 | ||
| 391 | /* | 392 | fpu = switch_fpu_prepare(prev_p, next_p, cpu); |
| 392 | * If the task has used fpu the last 5 timeslices, just do a full | ||
| 393 | * restore of the math state immediately to avoid the trap; the | ||
| 394 | * chances of needing FPU soon are obviously high now | ||
| 395 | */ | ||
| 396 | preload_fpu = tsk_used_math(next_p) && next_p->fpu_counter > 5; | ||
| 397 | |||
| 398 | /* we're going to use this soon, after a few expensive things */ | ||
| 399 | if (preload_fpu) | ||
| 400 | prefetch(next->fpu.state); | ||
| 401 | 393 | ||
| 402 | /* | 394 | /* |
| 403 | * Reload esp0, LDT and the page table pointer: | 395 | * Reload esp0, LDT and the page table pointer: |
| @@ -427,13 +419,6 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) | |||
| 427 | 419 | ||
| 428 | load_TLS(next, cpu); | 420 | load_TLS(next, cpu); |
| 429 | 421 | ||
| 430 | /* Must be after DS reload */ | ||
| 431 | __unlazy_fpu(prev_p); | ||
| 432 | |||
| 433 | /* Make sure cpu is ready for new context */ | ||
| 434 | if (preload_fpu) | ||
| 435 | clts(); | ||
| 436 | |||
| 437 | /* | 422 | /* |
| 438 | * Leave lazy mode, flushing any hypercalls made here. | 423 | * Leave lazy mode, flushing any hypercalls made here. |
| 439 | * This must be done before restoring TLS segments so | 424 | * This must be done before restoring TLS segments so |
| @@ -474,6 +459,8 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) | |||
| 474 | wrmsrl(MSR_KERNEL_GS_BASE, next->gs); | 459 | wrmsrl(MSR_KERNEL_GS_BASE, next->gs); |
| 475 | prev->gsindex = gsindex; | 460 | prev->gsindex = gsindex; |
| 476 | 461 | ||
| 462 | switch_fpu_finish(next_p, fpu); | ||
| 463 | |||
| 477 | /* | 464 | /* |
| 478 | * Switch the PDA and FPU contexts. | 465 | * Switch the PDA and FPU contexts. |
| 479 | */ | 466 | */ |
| @@ -492,13 +479,6 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) | |||
| 492 | task_thread_info(prev_p)->flags & _TIF_WORK_CTXSW_PREV)) | 479 | task_thread_info(prev_p)->flags & _TIF_WORK_CTXSW_PREV)) |
| 493 | __switch_to_xtra(prev_p, next_p, tss); | 480 | __switch_to_xtra(prev_p, next_p, tss); |
| 494 | 481 | ||
| 495 | /* | ||
| 496 | * Preload the FPU context, now that we've determined that the | ||
| 497 | * task is likely to be using it. | ||
| 498 | */ | ||
| 499 | if (preload_fpu) | ||
| 500 | __math_state_restore(); | ||
| 501 | |||
| 502 | return prev_p; | 482 | return prev_p; |
| 503 | } | 483 | } |
| 504 | 484 | ||
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index 482ec3af2067..4bbe04d96744 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c | |||
| @@ -571,41 +571,18 @@ asmlinkage void __attribute__((weak)) smp_threshold_interrupt(void) | |||
| 571 | } | 571 | } |
| 572 | 572 | ||
| 573 | /* | 573 | /* |
| 574 | * __math_state_restore assumes that cr0.TS is already clear and the | ||
| 575 | * fpu state is all ready for use. Used during context switch. | ||
| 576 | */ | ||
| 577 | void __math_state_restore(void) | ||
| 578 | { | ||
| 579 | struct thread_info *thread = current_thread_info(); | ||
| 580 | struct task_struct *tsk = thread->task; | ||
| 581 | |||
| 582 | /* | ||
| 583 | * Paranoid restore. send a SIGSEGV if we fail to restore the state. | ||
| 584 | */ | ||
| 585 | if (unlikely(restore_fpu_checking(tsk))) { | ||
| 586 | stts(); | ||
| 587 | force_sig(SIGSEGV, tsk); | ||
| 588 | return; | ||
| 589 | } | ||
| 590 | |||
| 591 | thread->status |= TS_USEDFPU; /* So we fnsave on switch_to() */ | ||
| 592 | tsk->fpu_counter++; | ||
| 593 | } | ||
| 594 | |||
| 595 | /* | ||
| 596 | * 'math_state_restore()' saves the current math information in the | 574 | * 'math_state_restore()' saves the current math information in the |
| 597 | * old math state array, and gets the new ones from the current task | 575 | * old math state array, and gets the new ones from the current task |
| 598 | * | 576 | * |
| 599 | * Careful.. There are problems with IBM-designed IRQ13 behaviour. | 577 | * Careful.. There are problems with IBM-designed IRQ13 behaviour. |
| 600 | * Don't touch unless you *really* know how it works. | 578 | * Don't touch unless you *really* know how it works. |
| 601 | * | 579 | * |
| 602 | * Must be called with kernel preemption disabled (in this case, | 580 | * Must be called with kernel preemption disabled (eg with local |
| 603 | * local interrupts are disabled at the call-site in entry.S). | 581 | * local interrupts as in the case of do_device_not_available). |
| 604 | */ | 582 | */ |
| 605 | asmlinkage void math_state_restore(void) | 583 | void math_state_restore(void) |
| 606 | { | 584 | { |
| 607 | struct thread_info *thread = current_thread_info(); | 585 | struct task_struct *tsk = current; |
| 608 | struct task_struct *tsk = thread->task; | ||
| 609 | 586 | ||
| 610 | if (!tsk_used_math(tsk)) { | 587 | if (!tsk_used_math(tsk)) { |
| 611 | local_irq_enable(); | 588 | local_irq_enable(); |
| @@ -622,9 +599,17 @@ asmlinkage void math_state_restore(void) | |||
| 622 | local_irq_disable(); | 599 | local_irq_disable(); |
| 623 | } | 600 | } |
| 624 | 601 | ||
| 625 | clts(); /* Allow maths ops (or we recurse) */ | 602 | __thread_fpu_begin(tsk); |
| 603 | /* | ||
| 604 | * Paranoid restore. send a SIGSEGV if we fail to restore the state. | ||
| 605 | */ | ||
| 606 | if (unlikely(restore_fpu_checking(tsk))) { | ||
| 607 | __thread_fpu_end(tsk); | ||
| 608 | force_sig(SIGSEGV, tsk); | ||
| 609 | return; | ||
| 610 | } | ||
| 626 | 611 | ||
| 627 | __math_state_restore(); | 612 | tsk->fpu_counter++; |
| 628 | } | 613 | } |
| 629 | EXPORT_SYMBOL_GPL(math_state_restore); | 614 | EXPORT_SYMBOL_GPL(math_state_restore); |
| 630 | 615 | ||
diff --git a/arch/x86/kernel/xsave.c b/arch/x86/kernel/xsave.c index a3911343976b..711091114119 100644 --- a/arch/x86/kernel/xsave.c +++ b/arch/x86/kernel/xsave.c | |||
| @@ -47,7 +47,7 @@ void __sanitize_i387_state(struct task_struct *tsk) | |||
| 47 | if (!fx) | 47 | if (!fx) |
| 48 | return; | 48 | return; |
| 49 | 49 | ||
| 50 | BUG_ON(task_thread_info(tsk)->status & TS_USEDFPU); | 50 | BUG_ON(__thread_has_fpu(tsk)); |
| 51 | 51 | ||
| 52 | xstate_bv = tsk->thread.fpu.state->xsave.xsave_hdr.xstate_bv; | 52 | xstate_bv = tsk->thread.fpu.state->xsave.xsave_hdr.xstate_bv; |
| 53 | 53 | ||
| @@ -168,7 +168,7 @@ int save_i387_xstate(void __user *buf) | |||
| 168 | if (!used_math()) | 168 | if (!used_math()) |
| 169 | return 0; | 169 | return 0; |
| 170 | 170 | ||
| 171 | if (task_thread_info(tsk)->status & TS_USEDFPU) { | 171 | if (user_has_fpu()) { |
| 172 | if (use_xsave()) | 172 | if (use_xsave()) |
| 173 | err = xsave_user(buf); | 173 | err = xsave_user(buf); |
| 174 | else | 174 | else |
| @@ -176,8 +176,7 @@ int save_i387_xstate(void __user *buf) | |||
| 176 | 176 | ||
| 177 | if (err) | 177 | if (err) |
| 178 | return err; | 178 | return err; |
| 179 | task_thread_info(tsk)->status &= ~TS_USEDFPU; | 179 | user_fpu_end(); |
| 180 | stts(); | ||
| 181 | } else { | 180 | } else { |
| 182 | sanitize_i387_state(tsk); | 181 | sanitize_i387_state(tsk); |
| 183 | if (__copy_to_user(buf, &tsk->thread.fpu.state->fxsave, | 182 | if (__copy_to_user(buf, &tsk->thread.fpu.state->fxsave, |
| @@ -292,10 +291,7 @@ int restore_i387_xstate(void __user *buf) | |||
| 292 | return err; | 291 | return err; |
| 293 | } | 292 | } |
| 294 | 293 | ||
| 295 | if (!(task_thread_info(current)->status & TS_USEDFPU)) { | 294 | user_fpu_begin(); |
| 296 | clts(); | ||
| 297 | task_thread_info(current)->status |= TS_USEDFPU; | ||
| 298 | } | ||
| 299 | if (use_xsave()) | 295 | if (use_xsave()) |
| 300 | err = restore_user_xstate(buf); | 296 | err = restore_user_xstate(buf); |
| 301 | else | 297 | else |
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index d29216c462b3..3b4c8d8ad906 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c | |||
| @@ -1457,7 +1457,7 @@ static void __vmx_load_host_state(struct vcpu_vmx *vmx) | |||
| 1457 | #ifdef CONFIG_X86_64 | 1457 | #ifdef CONFIG_X86_64 |
| 1458 | wrmsrl(MSR_KERNEL_GS_BASE, vmx->msr_host_kernel_gs_base); | 1458 | wrmsrl(MSR_KERNEL_GS_BASE, vmx->msr_host_kernel_gs_base); |
| 1459 | #endif | 1459 | #endif |
| 1460 | if (current_thread_info()->status & TS_USEDFPU) | 1460 | if (__thread_has_fpu(current)) |
| 1461 | clts(); | 1461 | clts(); |
| 1462 | load_gdt(&__get_cpu_var(host_gdt)); | 1462 | load_gdt(&__get_cpu_var(host_gdt)); |
| 1463 | } | 1463 | } |
diff --git a/arch/x86/pci/xen.c b/arch/x86/pci/xen.c index 492ade8c978e..d99346ea8fdb 100644 --- a/arch/x86/pci/xen.c +++ b/arch/x86/pci/xen.c | |||
| @@ -374,7 +374,7 @@ int __init pci_xen_init(void) | |||
| 374 | 374 | ||
| 375 | int __init pci_xen_hvm_init(void) | 375 | int __init pci_xen_hvm_init(void) |
| 376 | { | 376 | { |
| 377 | if (!xen_feature(XENFEAT_hvm_pirqs)) | 377 | if (!xen_have_vector_callback || !xen_feature(XENFEAT_hvm_pirqs)) |
| 378 | return 0; | 378 | return 0; |
| 379 | 379 | ||
| 380 | #ifdef CONFIG_ACPI | 380 | #ifdef CONFIG_ACPI |
diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c index 041d4fe9dfe4..501d4e0244ba 100644 --- a/arch/x86/xen/smp.c +++ b/arch/x86/xen/smp.c | |||
| @@ -409,6 +409,13 @@ static void __cpuinit xen_play_dead(void) /* used only with HOTPLUG_CPU */ | |||
| 409 | play_dead_common(); | 409 | play_dead_common(); |
| 410 | HYPERVISOR_vcpu_op(VCPUOP_down, smp_processor_id(), NULL); | 410 | HYPERVISOR_vcpu_op(VCPUOP_down, smp_processor_id(), NULL); |
| 411 | cpu_bringup(); | 411 | cpu_bringup(); |
| 412 | /* | ||
| 413 | * Balance out the preempt calls - as we are running in cpu_idle | ||
| 414 | * loop which has been called at bootup from cpu_bringup_and_idle. | ||
| 415 | * The cpucpu_bringup_and_idle called cpu_bringup which made a | ||
| 416 | * preempt_disable() So this preempt_enable will balance it out. | ||
| 417 | */ | ||
| 418 | preempt_enable(); | ||
| 412 | } | 419 | } |
| 413 | 420 | ||
| 414 | #else /* !CONFIG_HOTPLUG_CPU */ | 421 | #else /* !CONFIG_HOTPLUG_CPU */ |
diff --git a/crypto/sha512_generic.c b/crypto/sha512_generic.c index 88f160b77b1f..107f6f7be5e1 100644 --- a/crypto/sha512_generic.c +++ b/crypto/sha512_generic.c | |||
| @@ -31,11 +31,6 @@ static inline u64 Maj(u64 x, u64 y, u64 z) | |||
| 31 | return (x & y) | (z & (x | y)); | 31 | return (x & y) | (z & (x | y)); |
| 32 | } | 32 | } |
| 33 | 33 | ||
| 34 | static inline u64 RORu64(u64 x, u64 y) | ||
| 35 | { | ||
| 36 | return (x >> y) | (x << (64 - y)); | ||
| 37 | } | ||
| 38 | |||
| 39 | static const u64 sha512_K[80] = { | 34 | static const u64 sha512_K[80] = { |
| 40 | 0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL, 0xb5c0fbcfec4d3b2fULL, | 35 | 0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL, 0xb5c0fbcfec4d3b2fULL, |
| 41 | 0xe9b5dba58189dbbcULL, 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL, | 36 | 0xe9b5dba58189dbbcULL, 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL, |
| @@ -66,10 +61,10 @@ static const u64 sha512_K[80] = { | |||
| 66 | 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL, | 61 | 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL, |
| 67 | }; | 62 | }; |
| 68 | 63 | ||
| 69 | #define e0(x) (RORu64(x,28) ^ RORu64(x,34) ^ RORu64(x,39)) | 64 | #define e0(x) (ror64(x,28) ^ ror64(x,34) ^ ror64(x,39)) |
| 70 | #define e1(x) (RORu64(x,14) ^ RORu64(x,18) ^ RORu64(x,41)) | 65 | #define e1(x) (ror64(x,14) ^ ror64(x,18) ^ ror64(x,41)) |
| 71 | #define s0(x) (RORu64(x, 1) ^ RORu64(x, 8) ^ (x >> 7)) | 66 | #define s0(x) (ror64(x, 1) ^ ror64(x, 8) ^ (x >> 7)) |
| 72 | #define s1(x) (RORu64(x,19) ^ RORu64(x,61) ^ (x >> 6)) | 67 | #define s1(x) (ror64(x,19) ^ ror64(x,61) ^ (x >> 6)) |
| 73 | 68 | ||
| 74 | static inline void LOAD_OP(int I, u64 *W, const u8 *input) | 69 | static inline void LOAD_OP(int I, u64 *W, const u8 *input) |
| 75 | { | 70 | { |
| @@ -78,7 +73,7 @@ static inline void LOAD_OP(int I, u64 *W, const u8 *input) | |||
| 78 | 73 | ||
| 79 | static inline void BLEND_OP(int I, u64 *W) | 74 | static inline void BLEND_OP(int I, u64 *W) |
| 80 | { | 75 | { |
| 81 | W[I % 16] += s1(W[(I-2) % 16]) + W[(I-7) % 16] + s0(W[(I-15) % 16]); | 76 | W[I & 15] += s1(W[(I-2) & 15]) + W[(I-7) & 15] + s0(W[(I-15) & 15]); |
| 82 | } | 77 | } |
| 83 | 78 | ||
| 84 | static void | 79 | static void |
| @@ -89,46 +84,42 @@ sha512_transform(u64 *state, const u8 *input) | |||
| 89 | int i; | 84 | int i; |
| 90 | u64 W[16]; | 85 | u64 W[16]; |
| 91 | 86 | ||
| 92 | /* load the input */ | ||
| 93 | for (i = 0; i < 16; i++) | ||
| 94 | LOAD_OP(i, W, input); | ||
| 95 | |||
| 96 | /* load the state into our registers */ | 87 | /* load the state into our registers */ |
| 97 | a=state[0]; b=state[1]; c=state[2]; d=state[3]; | 88 | a=state[0]; b=state[1]; c=state[2]; d=state[3]; |
| 98 | e=state[4]; f=state[5]; g=state[6]; h=state[7]; | 89 | e=state[4]; f=state[5]; g=state[6]; h=state[7]; |
| 99 | 90 | ||
| 100 | #define SHA512_0_15(i, a, b, c, d, e, f, g, h) \ | 91 | /* now iterate */ |
| 101 | t1 = h + e1(e) + Ch(e, f, g) + sha512_K[i] + W[i]; \ | 92 | for (i=0; i<80; i+=8) { |
| 102 | t2 = e0(a) + Maj(a, b, c); \ | 93 | if (!(i & 8)) { |
| 103 | d += t1; \ | 94 | int j; |
| 104 | h = t1 + t2 | 95 | |
| 105 | 96 | if (i < 16) { | |
| 106 | #define SHA512_16_79(i, a, b, c, d, e, f, g, h) \ | 97 | /* load the input */ |
| 107 | BLEND_OP(i, W); \ | 98 | for (j = 0; j < 16; j++) |
| 108 | t1 = h + e1(e) + Ch(e, f, g) + sha512_K[i] + W[(i)%16]; \ | 99 | LOAD_OP(i + j, W, input); |
| 109 | t2 = e0(a) + Maj(a, b, c); \ | 100 | } else { |
| 110 | d += t1; \ | 101 | for (j = 0; j < 16; j++) { |
| 111 | h = t1 + t2 | 102 | BLEND_OP(i + j, W); |
| 112 | 103 | } | |
| 113 | for (i = 0; i < 16; i += 8) { | 104 | } |
| 114 | SHA512_0_15(i, a, b, c, d, e, f, g, h); | 105 | } |
| 115 | SHA512_0_15(i + 1, h, a, b, c, d, e, f, g); | 106 | |
| 116 | SHA512_0_15(i + 2, g, h, a, b, c, d, e, f); | 107 | t1 = h + e1(e) + Ch(e,f,g) + sha512_K[i ] + W[(i & 15)]; |
| 117 | SHA512_0_15(i + 3, f, g, h, a, b, c, d, e); | 108 | t2 = e0(a) + Maj(a,b,c); d+=t1; h=t1+t2; |
| 118 | SHA512_0_15(i + 4, e, f, g, h, a, b, c, d); | 109 | t1 = g + e1(d) + Ch(d,e,f) + sha512_K[i+1] + W[(i & 15) + 1]; |
| 119 | SHA512_0_15(i + 5, d, e, f, g, h, a, b, c); | 110 | t2 = e0(h) + Maj(h,a,b); c+=t1; g=t1+t2; |
| 120 | SHA512_0_15(i + 6, c, d, e, f, g, h, a, b); | 111 | t1 = f + e1(c) + Ch(c,d,e) + sha512_K[i+2] + W[(i & 15) + 2]; |
| 121 | SHA512_0_15(i + 7, b, c, d, e, f, g, h, a); | 112 | t2 = e0(g) + Maj(g,h,a); b+=t1; f=t1+t2; |
| 122 | } | 113 | t1 = e + e1(b) + Ch(b,c,d) + sha512_K[i+3] + W[(i & 15) + 3]; |
| 123 | for (i = 16; i < 80; i += 8) { | 114 | t2 = e0(f) + Maj(f,g,h); a+=t1; e=t1+t2; |
| 124 | SHA512_16_79(i, a, b, c, d, e, f, g, h); | 115 | t1 = d + e1(a) + Ch(a,b,c) + sha512_K[i+4] + W[(i & 15) + 4]; |
| 125 | SHA512_16_79(i + 1, h, a, b, c, d, e, f, g); | 116 | t2 = e0(e) + Maj(e,f,g); h+=t1; d=t1+t2; |
| 126 | SHA512_16_79(i + 2, g, h, a, b, c, d, e, f); | 117 | t1 = c + e1(h) + Ch(h,a,b) + sha512_K[i+5] + W[(i & 15) + 5]; |
| 127 | SHA512_16_79(i + 3, f, g, h, a, b, c, d, e); | 118 | t2 = e0(d) + Maj(d,e,f); g+=t1; c=t1+t2; |
| 128 | SHA512_16_79(i + 4, e, f, g, h, a, b, c, d); | 119 | t1 = b + e1(g) + Ch(g,h,a) + sha512_K[i+6] + W[(i & 15) + 6]; |
| 129 | SHA512_16_79(i + 5, d, e, f, g, h, a, b, c); | 120 | t2 = e0(c) + Maj(c,d,e); f+=t1; b=t1+t2; |
| 130 | SHA512_16_79(i + 6, c, d, e, f, g, h, a, b); | 121 | t1 = a + e1(f) + Ch(f,g,h) + sha512_K[i+7] + W[(i & 15) + 7]; |
| 131 | SHA512_16_79(i + 7, b, c, d, e, f, g, h, a); | 122 | t2 = e0(b) + Maj(b,c,d); e+=t1; a=t1+t2; |
| 132 | } | 123 | } |
| 133 | 124 | ||
| 134 | state[0] += a; state[1] += b; state[2] += c; state[3] += d; | 125 | state[0] += a; state[1] += b; state[2] += c; state[3] += d; |
diff --git a/drivers/ata/pata_at91.c b/drivers/ata/pata_at91.c index a7d91a72ee35..53d3770a0b1b 100644 --- a/drivers/ata/pata_at91.c +++ b/drivers/ata/pata_at91.c | |||
| @@ -207,11 +207,11 @@ static void set_smc_timing(struct device *dev, struct ata_device *adev, | |||
| 207 | { | 207 | { |
| 208 | int ret = 0; | 208 | int ret = 0; |
| 209 | int use_iordy; | 209 | int use_iordy; |
| 210 | struct sam9_smc_config smc; | ||
| 210 | unsigned int t6z; /* data tristate time in ns */ | 211 | unsigned int t6z; /* data tristate time in ns */ |
| 211 | unsigned int cycle; /* SMC Cycle width in MCK ticks */ | 212 | unsigned int cycle; /* SMC Cycle width in MCK ticks */ |
| 212 | unsigned int setup; /* SMC Setup width in MCK ticks */ | 213 | unsigned int setup; /* SMC Setup width in MCK ticks */ |
| 213 | unsigned int pulse; /* CFIOR and CFIOW pulse width in MCK ticks */ | 214 | unsigned int pulse; /* CFIOR and CFIOW pulse width in MCK ticks */ |
| 214 | unsigned int cs_setup = 0;/* CS4 or CS5 setup width in MCK ticks */ | ||
| 215 | unsigned int cs_pulse; /* CS4 or CS5 pulse width in MCK ticks*/ | 215 | unsigned int cs_pulse; /* CS4 or CS5 pulse width in MCK ticks*/ |
| 216 | unsigned int tdf_cycles; /* SMC TDF MCK ticks */ | 216 | unsigned int tdf_cycles; /* SMC TDF MCK ticks */ |
| 217 | unsigned long mck_hz; /* MCK frequency in Hz */ | 217 | unsigned long mck_hz; /* MCK frequency in Hz */ |
| @@ -244,26 +244,20 @@ static void set_smc_timing(struct device *dev, struct ata_device *adev, | |||
| 244 | } | 244 | } |
| 245 | 245 | ||
| 246 | dev_dbg(dev, "Use IORDY=%u, TDF Cycles=%u\n", use_iordy, tdf_cycles); | 246 | dev_dbg(dev, "Use IORDY=%u, TDF Cycles=%u\n", use_iordy, tdf_cycles); |
| 247 | info->mode |= AT91_SMC_TDF_(tdf_cycles); | 247 | |
| 248 | 248 | /* SMC Setup Register */ | |
| 249 | /* write SMC Setup Register */ | 249 | smc.nwe_setup = smc.nrd_setup = setup; |
| 250 | at91_sys_write(AT91_SMC_SETUP(info->cs), | 250 | smc.ncs_write_setup = smc.ncs_read_setup = 0; |
| 251 | AT91_SMC_NWESETUP_(setup) | | 251 | /* SMC Pulse Register */ |
| 252 | AT91_SMC_NRDSETUP_(setup) | | 252 | smc.nwe_pulse = smc.nrd_pulse = pulse; |
| 253 | AT91_SMC_NCS_WRSETUP_(cs_setup) | | 253 | smc.ncs_write_pulse = smc.ncs_read_pulse = cs_pulse; |
| 254 | AT91_SMC_NCS_RDSETUP_(cs_setup)); | 254 | /* SMC Cycle Register */ |
| 255 | /* write SMC Pulse Register */ | 255 | smc.write_cycle = smc.read_cycle = cycle; |
| 256 | at91_sys_write(AT91_SMC_PULSE(info->cs), | 256 | /* SMC Mode Register*/ |
| 257 | AT91_SMC_NWEPULSE_(pulse) | | 257 | smc.tdf_cycles = tdf_cycles; |
| 258 | AT91_SMC_NRDPULSE_(pulse) | | 258 | smc.mode = info->mode; |
| 259 | AT91_SMC_NCS_WRPULSE_(cs_pulse) | | 259 | |
| 260 | AT91_SMC_NCS_RDPULSE_(cs_pulse)); | 260 | sam9_smc_configure(0, info->cs, &smc); |
| 261 | /* write SMC Cycle Register */ | ||
| 262 | at91_sys_write(AT91_SMC_CYCLE(info->cs), | ||
| 263 | AT91_SMC_NWECYCLE_(cycle) | | ||
| 264 | AT91_SMC_NRDCYCLE_(cycle)); | ||
| 265 | /* write SMC Mode Register*/ | ||
| 266 | at91_sys_write(AT91_SMC_MODE(info->cs), info->mode); | ||
| 267 | } | 261 | } |
| 268 | 262 | ||
| 269 | static void pata_at91_set_piomode(struct ata_port *ap, struct ata_device *adev) | 263 | static void pata_at91_set_piomode(struct ata_port *ap, struct ata_device *adev) |
| @@ -288,20 +282,20 @@ static unsigned int pata_at91_data_xfer_noirq(struct ata_device *dev, | |||
| 288 | struct at91_ide_info *info = dev->link->ap->host->private_data; | 282 | struct at91_ide_info *info = dev->link->ap->host->private_data; |
| 289 | unsigned int consumed; | 283 | unsigned int consumed; |
| 290 | unsigned long flags; | 284 | unsigned long flags; |
| 291 | unsigned int mode; | 285 | struct sam9_smc_config smc; |
| 292 | 286 | ||
| 293 | local_irq_save(flags); | 287 | local_irq_save(flags); |
| 294 | mode = at91_sys_read(AT91_SMC_MODE(info->cs)); | 288 | sam9_smc_read_mode(0, info->cs, &smc); |
| 295 | 289 | ||
| 296 | /* set 16bit mode before writing data */ | 290 | /* set 16bit mode before writing data */ |
| 297 | at91_sys_write(AT91_SMC_MODE(info->cs), | 291 | smc.mode = (smc.mode & ~AT91_SMC_DBW) | AT91_SMC_DBW_16; |
| 298 | (mode & ~AT91_SMC_DBW) | AT91_SMC_DBW_16); | 292 | sam9_smc_write_mode(0, info->cs, &smc); |
| 299 | 293 | ||
| 300 | consumed = ata_sff_data_xfer(dev, buf, buflen, rw); | 294 | consumed = ata_sff_data_xfer(dev, buf, buflen, rw); |
| 301 | 295 | ||
| 302 | /* restore 8bit mode after data is written */ | 296 | /* restore 8bit mode after data is written */ |
| 303 | at91_sys_write(AT91_SMC_MODE(info->cs), | 297 | smc.mode = (smc.mode & ~AT91_SMC_DBW) | AT91_SMC_DBW_8; |
| 304 | (mode & ~AT91_SMC_DBW) | AT91_SMC_DBW_8); | 298 | sam9_smc_write_mode(0, info->cs, &smc); |
| 305 | 299 | ||
| 306 | local_irq_restore(flags); | 300 | local_irq_restore(flags); |
| 307 | return consumed; | 301 | return consumed; |
diff --git a/drivers/base/regmap/regcache.c b/drivers/base/regmap/regcache.c index 1ead66186b7c..d1daa5e9fadf 100644 --- a/drivers/base/regmap/regcache.c +++ b/drivers/base/regmap/regcache.c | |||
| @@ -53,7 +53,7 @@ static int regcache_hw_init(struct regmap *map) | |||
| 53 | for (count = 0, i = 0; i < map->num_reg_defaults_raw; i++) { | 53 | for (count = 0, i = 0; i < map->num_reg_defaults_raw; i++) { |
| 54 | val = regcache_get_val(map->reg_defaults_raw, | 54 | val = regcache_get_val(map->reg_defaults_raw, |
| 55 | i, map->cache_word_size); | 55 | i, map->cache_word_size); |
| 56 | if (!val) | 56 | if (regmap_volatile(map, i)) |
| 57 | continue; | 57 | continue; |
| 58 | count++; | 58 | count++; |
| 59 | } | 59 | } |
| @@ -70,7 +70,7 @@ static int regcache_hw_init(struct regmap *map) | |||
| 70 | for (i = 0, j = 0; i < map->num_reg_defaults_raw; i++) { | 70 | for (i = 0, j = 0; i < map->num_reg_defaults_raw; i++) { |
| 71 | val = regcache_get_val(map->reg_defaults_raw, | 71 | val = regcache_get_val(map->reg_defaults_raw, |
| 72 | i, map->cache_word_size); | 72 | i, map->cache_word_size); |
| 73 | if (!val) | 73 | if (regmap_volatile(map, i)) |
| 74 | continue; | 74 | continue; |
| 75 | map->reg_defaults[j].reg = i; | 75 | map->reg_defaults[j].reg = i; |
| 76 | map->reg_defaults[j].def = val; | 76 | map->reg_defaults[j].def = val; |
diff --git a/drivers/block/nvme.c b/drivers/block/nvme.c index c1dc4d86c221..1f3c1a7d132a 100644 --- a/drivers/block/nvme.c +++ b/drivers/block/nvme.c | |||
| @@ -41,6 +41,8 @@ | |||
| 41 | #include <linux/types.h> | 41 | #include <linux/types.h> |
| 42 | #include <linux/version.h> | 42 | #include <linux/version.h> |
| 43 | 43 | ||
| 44 | #include <asm-generic/io-64-nonatomic-lo-hi.h> | ||
| 45 | |||
| 44 | #define NVME_Q_DEPTH 1024 | 46 | #define NVME_Q_DEPTH 1024 |
| 45 | #define SQ_SIZE(depth) (depth * sizeof(struct nvme_command)) | 47 | #define SQ_SIZE(depth) (depth * sizeof(struct nvme_command)) |
| 46 | #define CQ_SIZE(depth) (depth * sizeof(struct nvme_completion)) | 48 | #define CQ_SIZE(depth) (depth * sizeof(struct nvme_completion)) |
diff --git a/drivers/cpuidle/Kconfig b/drivers/cpuidle/Kconfig index 7dbc4a83c45c..78a666d1e5f5 100644 --- a/drivers/cpuidle/Kconfig +++ b/drivers/cpuidle/Kconfig | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | 1 | ||
| 2 | config CPU_IDLE | 2 | config CPU_IDLE |
| 3 | bool "CPU idle PM support" | 3 | bool "CPU idle PM support" |
| 4 | default ACPI | 4 | default y if ACPI || PPC_PSERIES |
| 5 | help | 5 | help |
| 6 | CPU idle is a generic framework for supporting software-controlled | 6 | CPU idle is a generic framework for supporting software-controlled |
| 7 | idle processor power management. It includes modular cross-platform | 7 | idle processor power management. It includes modular cross-platform |
diff --git a/drivers/edac/i3200_edac.c b/drivers/edac/i3200_edac.c index aa08497a075a..73f55e2008c2 100644 --- a/drivers/edac/i3200_edac.c +++ b/drivers/edac/i3200_edac.c | |||
| @@ -15,6 +15,8 @@ | |||
| 15 | #include <linux/io.h> | 15 | #include <linux/io.h> |
| 16 | #include "edac_core.h" | 16 | #include "edac_core.h" |
| 17 | 17 | ||
| 18 | #include <asm-generic/io-64-nonatomic-lo-hi.h> | ||
| 19 | |||
| 18 | #define I3200_REVISION "1.1" | 20 | #define I3200_REVISION "1.1" |
| 19 | 21 | ||
| 20 | #define EDAC_MOD_STR "i3200_edac" | 22 | #define EDAC_MOD_STR "i3200_edac" |
| @@ -101,19 +103,6 @@ struct i3200_priv { | |||
| 101 | 103 | ||
| 102 | static int nr_channels; | 104 | static int nr_channels; |
| 103 | 105 | ||
| 104 | #ifndef readq | ||
| 105 | static inline __u64 readq(const volatile void __iomem *addr) | ||
| 106 | { | ||
| 107 | const volatile u32 __iomem *p = addr; | ||
| 108 | u32 low, high; | ||
| 109 | |||
| 110 | low = readl(p); | ||
| 111 | high = readl(p + 1); | ||
| 112 | |||
| 113 | return low + ((u64)high << 32); | ||
| 114 | } | ||
| 115 | #endif | ||
| 116 | |||
| 117 | static int how_many_channels(struct pci_dev *pdev) | 106 | static int how_many_channels(struct pci_dev *pdev) |
| 118 | { | 107 | { |
| 119 | unsigned char capid0_8b; /* 8th byte of CAPID0 */ | 108 | unsigned char capid0_8b; /* 8th byte of CAPID0 */ |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_core.c b/drivers/gpu/drm/exynos/exynos_drm_core.c index 661a03571d0c..d08a55896d50 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_core.c +++ b/drivers/gpu/drm/exynos/exynos_drm_core.c | |||
| @@ -193,6 +193,9 @@ int exynos_drm_subdrv_register(struct exynos_drm_subdrv *subdrv) | |||
| 193 | return err; | 193 | return err; |
| 194 | } | 194 | } |
| 195 | 195 | ||
| 196 | /* setup possible_clones. */ | ||
| 197 | exynos_drm_encoder_setup(drm_dev); | ||
| 198 | |||
| 196 | /* | 199 | /* |
| 197 | * if any specific driver such as fimd or hdmi driver called | 200 | * if any specific driver such as fimd or hdmi driver called |
| 198 | * exynos_drm_subdrv_register() later than drm_load(), | 201 | * exynos_drm_subdrv_register() later than drm_load(), |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.c b/drivers/gpu/drm/exynos/exynos_drm_crtc.c index e3861ac49295..de818831a511 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_crtc.c +++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.c | |||
| @@ -307,9 +307,6 @@ static int exynos_drm_crtc_page_flip(struct drm_crtc *crtc, | |||
| 307 | */ | 307 | */ |
| 308 | event->pipe = exynos_crtc->pipe; | 308 | event->pipe = exynos_crtc->pipe; |
| 309 | 309 | ||
| 310 | list_add_tail(&event->base.link, | ||
| 311 | &dev_priv->pageflip_event_list); | ||
| 312 | |||
| 313 | ret = drm_vblank_get(dev, exynos_crtc->pipe); | 310 | ret = drm_vblank_get(dev, exynos_crtc->pipe); |
| 314 | if (ret) { | 311 | if (ret) { |
| 315 | DRM_DEBUG("failed to acquire vblank counter\n"); | 312 | DRM_DEBUG("failed to acquire vblank counter\n"); |
| @@ -318,6 +315,9 @@ static int exynos_drm_crtc_page_flip(struct drm_crtc *crtc, | |||
| 318 | goto out; | 315 | goto out; |
| 319 | } | 316 | } |
| 320 | 317 | ||
| 318 | list_add_tail(&event->base.link, | ||
| 319 | &dev_priv->pageflip_event_list); | ||
| 320 | |||
| 321 | crtc->fb = fb; | 321 | crtc->fb = fb; |
| 322 | ret = exynos_drm_crtc_update(crtc); | 322 | ret = exynos_drm_crtc_update(crtc); |
| 323 | if (ret) { | 323 | if (ret) { |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c index 35889ca255e9..58820ebd3558 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_drv.c +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c | |||
| @@ -33,6 +33,7 @@ | |||
| 33 | 33 | ||
| 34 | #include "exynos_drm_drv.h" | 34 | #include "exynos_drm_drv.h" |
| 35 | #include "exynos_drm_crtc.h" | 35 | #include "exynos_drm_crtc.h" |
| 36 | #include "exynos_drm_encoder.h" | ||
| 36 | #include "exynos_drm_fbdev.h" | 37 | #include "exynos_drm_fbdev.h" |
| 37 | #include "exynos_drm_fb.h" | 38 | #include "exynos_drm_fb.h" |
| 38 | #include "exynos_drm_gem.h" | 39 | #include "exynos_drm_gem.h" |
| @@ -99,6 +100,9 @@ static int exynos_drm_load(struct drm_device *dev, unsigned long flags) | |||
| 99 | if (ret) | 100 | if (ret) |
| 100 | goto err_vblank; | 101 | goto err_vblank; |
| 101 | 102 | ||
| 103 | /* setup possible_clones. */ | ||
| 104 | exynos_drm_encoder_setup(dev); | ||
| 105 | |||
| 102 | /* | 106 | /* |
| 103 | * create and configure fb helper and also exynos specific | 107 | * create and configure fb helper and also exynos specific |
| 104 | * fbdev object. | 108 | * fbdev object. |
| @@ -141,16 +145,21 @@ static int exynos_drm_unload(struct drm_device *dev) | |||
| 141 | } | 145 | } |
| 142 | 146 | ||
| 143 | static void exynos_drm_preclose(struct drm_device *dev, | 147 | static void exynos_drm_preclose(struct drm_device *dev, |
| 144 | struct drm_file *file_priv) | 148 | struct drm_file *file) |
| 145 | { | 149 | { |
| 146 | struct exynos_drm_private *dev_priv = dev->dev_private; | 150 | DRM_DEBUG_DRIVER("%s\n", __FILE__); |
| 147 | 151 | ||
| 148 | /* | 152 | } |
| 149 | * drm framework frees all events at release time, | 153 | |
| 150 | * so private event list should be cleared. | 154 | static void exynos_drm_postclose(struct drm_device *dev, struct drm_file *file) |
| 151 | */ | 155 | { |
| 152 | if (!list_empty(&dev_priv->pageflip_event_list)) | 156 | DRM_DEBUG_DRIVER("%s\n", __FILE__); |
| 153 | INIT_LIST_HEAD(&dev_priv->pageflip_event_list); | 157 | |
| 158 | if (!file->driver_priv) | ||
| 159 | return; | ||
| 160 | |||
| 161 | kfree(file->driver_priv); | ||
| 162 | file->driver_priv = NULL; | ||
| 154 | } | 163 | } |
| 155 | 164 | ||
| 156 | static void exynos_drm_lastclose(struct drm_device *dev) | 165 | static void exynos_drm_lastclose(struct drm_device *dev) |
| @@ -195,6 +204,7 @@ static struct drm_driver exynos_drm_driver = { | |||
| 195 | .unload = exynos_drm_unload, | 204 | .unload = exynos_drm_unload, |
| 196 | .preclose = exynos_drm_preclose, | 205 | .preclose = exynos_drm_preclose, |
| 197 | .lastclose = exynos_drm_lastclose, | 206 | .lastclose = exynos_drm_lastclose, |
| 207 | .postclose = exynos_drm_postclose, | ||
| 198 | .get_vblank_counter = drm_vblank_count, | 208 | .get_vblank_counter = drm_vblank_count, |
| 199 | .enable_vblank = exynos_drm_crtc_enable_vblank, | 209 | .enable_vblank = exynos_drm_crtc_enable_vblank, |
| 200 | .disable_vblank = exynos_drm_crtc_disable_vblank, | 210 | .disable_vblank = exynos_drm_crtc_disable_vblank, |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_encoder.c b/drivers/gpu/drm/exynos/exynos_drm_encoder.c index 86b93dde219a..ef4754f1519b 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_encoder.c +++ b/drivers/gpu/drm/exynos/exynos_drm_encoder.c | |||
| @@ -195,6 +195,40 @@ static struct drm_encoder_funcs exynos_encoder_funcs = { | |||
| 195 | .destroy = exynos_drm_encoder_destroy, | 195 | .destroy = exynos_drm_encoder_destroy, |
| 196 | }; | 196 | }; |
| 197 | 197 | ||
| 198 | static unsigned int exynos_drm_encoder_clones(struct drm_encoder *encoder) | ||
| 199 | { | ||
| 200 | struct drm_encoder *clone; | ||
| 201 | struct drm_device *dev = encoder->dev; | ||
| 202 | struct exynos_drm_encoder *exynos_encoder = to_exynos_encoder(encoder); | ||
| 203 | struct exynos_drm_display_ops *display_ops = | ||
| 204 | exynos_encoder->manager->display_ops; | ||
| 205 | unsigned int clone_mask = 0; | ||
| 206 | int cnt = 0; | ||
| 207 | |||
| 208 | list_for_each_entry(clone, &dev->mode_config.encoder_list, head) { | ||
| 209 | switch (display_ops->type) { | ||
| 210 | case EXYNOS_DISPLAY_TYPE_LCD: | ||
| 211 | case EXYNOS_DISPLAY_TYPE_HDMI: | ||
| 212 | clone_mask |= (1 << (cnt++)); | ||
| 213 | break; | ||
| 214 | default: | ||
| 215 | continue; | ||
| 216 | } | ||
| 217 | } | ||
| 218 | |||
| 219 | return clone_mask; | ||
| 220 | } | ||
| 221 | |||
| 222 | void exynos_drm_encoder_setup(struct drm_device *dev) | ||
| 223 | { | ||
| 224 | struct drm_encoder *encoder; | ||
| 225 | |||
| 226 | DRM_DEBUG_KMS("%s\n", __FILE__); | ||
| 227 | |||
| 228 | list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) | ||
| 229 | encoder->possible_clones = exynos_drm_encoder_clones(encoder); | ||
| 230 | } | ||
| 231 | |||
| 198 | struct drm_encoder * | 232 | struct drm_encoder * |
| 199 | exynos_drm_encoder_create(struct drm_device *dev, | 233 | exynos_drm_encoder_create(struct drm_device *dev, |
| 200 | struct exynos_drm_manager *manager, | 234 | struct exynos_drm_manager *manager, |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_encoder.h b/drivers/gpu/drm/exynos/exynos_drm_encoder.h index 97b087a51cb6..eb7d2316847e 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_encoder.h +++ b/drivers/gpu/drm/exynos/exynos_drm_encoder.h | |||
| @@ -30,6 +30,7 @@ | |||
| 30 | 30 | ||
| 31 | struct exynos_drm_manager; | 31 | struct exynos_drm_manager; |
| 32 | 32 | ||
| 33 | void exynos_drm_encoder_setup(struct drm_device *dev); | ||
| 33 | struct drm_encoder *exynos_drm_encoder_create(struct drm_device *dev, | 34 | struct drm_encoder *exynos_drm_encoder_create(struct drm_device *dev, |
| 34 | struct exynos_drm_manager *mgr, | 35 | struct exynos_drm_manager *mgr, |
| 35 | unsigned int possible_crtcs); | 36 | unsigned int possible_crtcs); |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c index d7ae29d2f3d6..3508700e529b 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c | |||
| @@ -195,66 +195,6 @@ out: | |||
| 195 | return ret; | 195 | return ret; |
| 196 | } | 196 | } |
| 197 | 197 | ||
| 198 | static bool | ||
| 199 | exynos_drm_fbdev_is_samefb(struct drm_framebuffer *fb, | ||
| 200 | struct drm_fb_helper_surface_size *sizes) | ||
| 201 | { | ||
| 202 | if (fb->width != sizes->surface_width) | ||
| 203 | return false; | ||
| 204 | if (fb->height != sizes->surface_height) | ||
| 205 | return false; | ||
| 206 | if (fb->bits_per_pixel != sizes->surface_bpp) | ||
| 207 | return false; | ||
| 208 | if (fb->depth != sizes->surface_depth) | ||
| 209 | return false; | ||
| 210 | |||
| 211 | return true; | ||
| 212 | } | ||
| 213 | |||
| 214 | static int exynos_drm_fbdev_recreate(struct drm_fb_helper *helper, | ||
| 215 | struct drm_fb_helper_surface_size *sizes) | ||
| 216 | { | ||
| 217 | struct drm_device *dev = helper->dev; | ||
| 218 | struct exynos_drm_fbdev *exynos_fbdev = to_exynos_fbdev(helper); | ||
| 219 | struct exynos_drm_gem_obj *exynos_gem_obj; | ||
| 220 | struct drm_framebuffer *fb = helper->fb; | ||
| 221 | struct drm_mode_fb_cmd2 mode_cmd = { 0 }; | ||
| 222 | unsigned long size; | ||
| 223 | |||
| 224 | DRM_DEBUG_KMS("%s\n", __FILE__); | ||
| 225 | |||
| 226 | if (exynos_drm_fbdev_is_samefb(fb, sizes)) | ||
| 227 | return 0; | ||
| 228 | |||
| 229 | mode_cmd.width = sizes->surface_width; | ||
| 230 | mode_cmd.height = sizes->surface_height; | ||
| 231 | mode_cmd.pitches[0] = sizes->surface_width * (sizes->surface_bpp >> 3); | ||
| 232 | mode_cmd.pixel_format = drm_mode_legacy_fb_format(sizes->surface_bpp, | ||
| 233 | sizes->surface_depth); | ||
| 234 | |||
| 235 | if (exynos_fbdev->exynos_gem_obj) | ||
| 236 | exynos_drm_gem_destroy(exynos_fbdev->exynos_gem_obj); | ||
| 237 | |||
| 238 | if (fb->funcs->destroy) | ||
| 239 | fb->funcs->destroy(fb); | ||
| 240 | |||
| 241 | size = mode_cmd.pitches[0] * mode_cmd.height; | ||
| 242 | exynos_gem_obj = exynos_drm_gem_create(dev, size); | ||
| 243 | if (IS_ERR(exynos_gem_obj)) | ||
| 244 | return PTR_ERR(exynos_gem_obj); | ||
| 245 | |||
| 246 | exynos_fbdev->exynos_gem_obj = exynos_gem_obj; | ||
| 247 | |||
| 248 | helper->fb = exynos_drm_framebuffer_init(dev, &mode_cmd, | ||
| 249 | &exynos_gem_obj->base); | ||
| 250 | if (IS_ERR_OR_NULL(helper->fb)) { | ||
| 251 | DRM_ERROR("failed to create drm framebuffer.\n"); | ||
| 252 | return PTR_ERR(helper->fb); | ||
| 253 | } | ||
| 254 | |||
| 255 | return exynos_drm_fbdev_update(helper, helper->fb); | ||
| 256 | } | ||
| 257 | |||
| 258 | static int exynos_drm_fbdev_probe(struct drm_fb_helper *helper, | 198 | static int exynos_drm_fbdev_probe(struct drm_fb_helper *helper, |
| 259 | struct drm_fb_helper_surface_size *sizes) | 199 | struct drm_fb_helper_surface_size *sizes) |
| 260 | { | 200 | { |
| @@ -262,6 +202,10 @@ static int exynos_drm_fbdev_probe(struct drm_fb_helper *helper, | |||
| 262 | 202 | ||
| 263 | DRM_DEBUG_KMS("%s\n", __FILE__); | 203 | DRM_DEBUG_KMS("%s\n", __FILE__); |
| 264 | 204 | ||
| 205 | /* | ||
| 206 | * with !helper->fb, it means that this funcion is called first time | ||
| 207 | * and after that, the helper->fb would be used as clone mode. | ||
| 208 | */ | ||
| 265 | if (!helper->fb) { | 209 | if (!helper->fb) { |
| 266 | ret = exynos_drm_fbdev_create(helper, sizes); | 210 | ret = exynos_drm_fbdev_create(helper, sizes); |
| 267 | if (ret < 0) { | 211 | if (ret < 0) { |
| @@ -274,12 +218,6 @@ static int exynos_drm_fbdev_probe(struct drm_fb_helper *helper, | |||
| 274 | * because register_framebuffer() should be called. | 218 | * because register_framebuffer() should be called. |
| 275 | */ | 219 | */ |
| 276 | ret = 1; | 220 | ret = 1; |
| 277 | } else { | ||
| 278 | ret = exynos_drm_fbdev_recreate(helper, sizes); | ||
| 279 | if (ret < 0) { | ||
| 280 | DRM_ERROR("failed to reconfigure fbdev\n"); | ||
| 281 | return ret; | ||
| 282 | } | ||
| 283 | } | 221 | } |
| 284 | 222 | ||
| 285 | return ret; | 223 | return ret; |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c index b6a737d196ae..0dbb32bb18a3 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c | |||
| @@ -604,7 +604,12 @@ static void fimd_finish_pageflip(struct drm_device *drm_dev, int crtc) | |||
| 604 | } | 604 | } |
| 605 | 605 | ||
| 606 | if (is_checked) { | 606 | if (is_checked) { |
| 607 | drm_vblank_put(drm_dev, crtc); | 607 | /* |
| 608 | * call drm_vblank_put only in case that drm_vblank_get was | ||
| 609 | * called. | ||
| 610 | */ | ||
| 611 | if (atomic_read(&drm_dev->vblank_refcount[crtc]) > 0) | ||
| 612 | drm_vblank_put(drm_dev, crtc); | ||
| 608 | 613 | ||
| 609 | /* | 614 | /* |
| 610 | * don't off vblank if vblank_disable_allowed is 1, | 615 | * don't off vblank if vblank_disable_allowed is 1, |
diff --git a/drivers/gpu/drm/exynos/exynos_mixer.c b/drivers/gpu/drm/exynos/exynos_mixer.c index ac24cff39775..93846e810e38 100644 --- a/drivers/gpu/drm/exynos/exynos_mixer.c +++ b/drivers/gpu/drm/exynos/exynos_mixer.c | |||
| @@ -712,7 +712,12 @@ static void mixer_finish_pageflip(struct drm_device *drm_dev, int crtc) | |||
| 712 | } | 712 | } |
| 713 | 713 | ||
| 714 | if (is_checked) | 714 | if (is_checked) |
| 715 | drm_vblank_put(drm_dev, crtc); | 715 | /* |
| 716 | * call drm_vblank_put only in case that drm_vblank_get was | ||
| 717 | * called. | ||
| 718 | */ | ||
| 719 | if (atomic_read(&drm_dev->vblank_refcount[crtc]) > 0) | ||
| 720 | drm_vblank_put(drm_dev, crtc); | ||
| 716 | 721 | ||
| 717 | spin_unlock_irqrestore(&drm_dev->event_lock, flags); | 722 | spin_unlock_irqrestore(&drm_dev->event_lock, flags); |
| 718 | } | 723 | } |
| @@ -779,15 +784,15 @@ static void mixer_win_reset(struct mixer_context *ctx) | |||
| 779 | mixer_reg_writemask(res, MXR_STATUS, MXR_STATUS_16_BURST, | 784 | mixer_reg_writemask(res, MXR_STATUS, MXR_STATUS_16_BURST, |
| 780 | MXR_STATUS_BURST_MASK); | 785 | MXR_STATUS_BURST_MASK); |
| 781 | 786 | ||
| 782 | /* setting default layer priority: layer1 > video > layer0 | 787 | /* setting default layer priority: layer1 > layer0 > video |
| 783 | * because typical usage scenario would be | 788 | * because typical usage scenario would be |
| 789 | * layer1 - OSD | ||
| 784 | * layer0 - framebuffer | 790 | * layer0 - framebuffer |
| 785 | * video - video overlay | 791 | * video - video overlay |
| 786 | * layer1 - OSD | ||
| 787 | */ | 792 | */ |
| 788 | val = MXR_LAYER_CFG_GRP0_VAL(1); | 793 | val = MXR_LAYER_CFG_GRP1_VAL(3); |
| 789 | val |= MXR_LAYER_CFG_VP_VAL(2); | 794 | val |= MXR_LAYER_CFG_GRP0_VAL(2); |
| 790 | val |= MXR_LAYER_CFG_GRP1_VAL(3); | 795 | val |= MXR_LAYER_CFG_VP_VAL(1); |
| 791 | mixer_reg_write(res, MXR_LAYER_CFG, val); | 796 | mixer_reg_write(res, MXR_LAYER_CFG, val); |
| 792 | 797 | ||
| 793 | /* setting background color */ | 798 | /* setting background color */ |
| @@ -1044,7 +1049,7 @@ static int mixer_remove(struct platform_device *pdev) | |||
| 1044 | platform_get_drvdata(pdev); | 1049 | platform_get_drvdata(pdev); |
| 1045 | struct mixer_context *ctx = (struct mixer_context *)drm_hdmi_ctx->ctx; | 1050 | struct mixer_context *ctx = (struct mixer_context *)drm_hdmi_ctx->ctx; |
| 1046 | 1051 | ||
| 1047 | dev_info(dev, "remove sucessful\n"); | 1052 | dev_info(dev, "remove successful\n"); |
| 1048 | 1053 | ||
| 1049 | mixer_resource_poweroff(ctx); | 1054 | mixer_resource_poweroff(ctx); |
| 1050 | mixer_resources_cleanup(ctx); | 1055 | mixer_resources_cleanup(ctx); |
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index c3afb783cb9d..03c53fcf8653 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
| @@ -3028,6 +3028,20 @@ | |||
| 3028 | #define DISP_TILE_SURFACE_SWIZZLING (1<<13) | 3028 | #define DISP_TILE_SURFACE_SWIZZLING (1<<13) |
| 3029 | #define DISP_FBC_WM_DIS (1<<15) | 3029 | #define DISP_FBC_WM_DIS (1<<15) |
| 3030 | 3030 | ||
| 3031 | /* GEN7 chicken */ | ||
| 3032 | #define GEN7_COMMON_SLICE_CHICKEN1 0x7010 | ||
| 3033 | # define GEN7_CSC1_RHWO_OPT_DISABLE_IN_RCC ((1<<10) | (1<<26)) | ||
| 3034 | |||
| 3035 | #define GEN7_L3CNTLREG1 0xB01C | ||
| 3036 | #define GEN7_WA_FOR_GEN7_L3_CONTROL 0x3C4FFF8C | ||
| 3037 | |||
| 3038 | #define GEN7_L3_CHICKEN_MODE_REGISTER 0xB030 | ||
| 3039 | #define GEN7_WA_L3_CHICKEN_MODE 0x20000000 | ||
| 3040 | |||
| 3041 | /* WaCatErrorRejectionIssue */ | ||
| 3042 | #define GEN7_SQ_CHICKEN_MBCUNIT_CONFIG 0x9030 | ||
| 3043 | #define GEN7_SQ_CHICKEN_MBCUNIT_SQINTMOB (1<<11) | ||
| 3044 | |||
| 3031 | /* PCH */ | 3045 | /* PCH */ |
| 3032 | 3046 | ||
| 3033 | /* south display engine interrupt */ | 3047 | /* south display engine interrupt */ |
| @@ -3618,6 +3632,7 @@ | |||
| 3618 | #define GT_FIFO_NUM_RESERVED_ENTRIES 20 | 3632 | #define GT_FIFO_NUM_RESERVED_ENTRIES 20 |
| 3619 | 3633 | ||
| 3620 | #define GEN6_UCGCTL2 0x9404 | 3634 | #define GEN6_UCGCTL2 0x9404 |
| 3635 | # define GEN6_RCZUNIT_CLOCK_GATE_DISABLE (1 << 13) | ||
| 3621 | # define GEN6_RCPBUNIT_CLOCK_GATE_DISABLE (1 << 12) | 3636 | # define GEN6_RCPBUNIT_CLOCK_GATE_DISABLE (1 << 12) |
| 3622 | # define GEN6_RCCUNIT_CLOCK_GATE_DISABLE (1 << 11) | 3637 | # define GEN6_RCCUNIT_CLOCK_GATE_DISABLE (1 << 11) |
| 3623 | 3638 | ||
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 00fbff5ddd81..f425b23e3803 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -8184,8 +8184,8 @@ void gen6_enable_rps(struct drm_i915_private *dev_priv) | |||
| 8184 | I915_WRITE(GEN6_RC6pp_THRESHOLD, 64000); /* unused */ | 8184 | I915_WRITE(GEN6_RC6pp_THRESHOLD, 64000); /* unused */ |
| 8185 | 8185 | ||
| 8186 | if (intel_enable_rc6(dev_priv->dev)) | 8186 | if (intel_enable_rc6(dev_priv->dev)) |
| 8187 | rc6_mask = GEN6_RC_CTL_RC6p_ENABLE | | 8187 | rc6_mask = GEN6_RC_CTL_RC6_ENABLE | |
| 8188 | GEN6_RC_CTL_RC6_ENABLE; | 8188 | (IS_GEN7(dev_priv->dev)) ? GEN6_RC_CTL_RC6p_ENABLE : 0; |
| 8189 | 8189 | ||
| 8190 | I915_WRITE(GEN6_RC_CONTROL, | 8190 | I915_WRITE(GEN6_RC_CONTROL, |
| 8191 | rc6_mask | | 8191 | rc6_mask | |
| @@ -8463,12 +8463,32 @@ static void ivybridge_init_clock_gating(struct drm_device *dev) | |||
| 8463 | I915_WRITE(WM2_LP_ILK, 0); | 8463 | I915_WRITE(WM2_LP_ILK, 0); |
| 8464 | I915_WRITE(WM1_LP_ILK, 0); | 8464 | I915_WRITE(WM1_LP_ILK, 0); |
| 8465 | 8465 | ||
| 8466 | /* According to the spec, bit 13 (RCZUNIT) must be set on IVB. | ||
| 8467 | * This implements the WaDisableRCZUnitClockGating workaround. | ||
| 8468 | */ | ||
| 8469 | I915_WRITE(GEN6_UCGCTL2, GEN6_RCZUNIT_CLOCK_GATE_DISABLE); | ||
| 8470 | |||
| 8466 | I915_WRITE(ILK_DSPCLK_GATE, IVB_VRHUNIT_CLK_GATE); | 8471 | I915_WRITE(ILK_DSPCLK_GATE, IVB_VRHUNIT_CLK_GATE); |
| 8467 | 8472 | ||
| 8468 | I915_WRITE(IVB_CHICKEN3, | 8473 | I915_WRITE(IVB_CHICKEN3, |
| 8469 | CHICKEN3_DGMG_REQ_OUT_FIX_DISABLE | | 8474 | CHICKEN3_DGMG_REQ_OUT_FIX_DISABLE | |
| 8470 | CHICKEN3_DGMG_DONE_FIX_DISABLE); | 8475 | CHICKEN3_DGMG_DONE_FIX_DISABLE); |
| 8471 | 8476 | ||
| 8477 | /* Apply the WaDisableRHWOOptimizationForRenderHang workaround. */ | ||
| 8478 | I915_WRITE(GEN7_COMMON_SLICE_CHICKEN1, | ||
| 8479 | GEN7_CSC1_RHWO_OPT_DISABLE_IN_RCC); | ||
| 8480 | |||
| 8481 | /* WaApplyL3ControlAndL3ChickenMode requires those two on Ivy Bridge */ | ||
| 8482 | I915_WRITE(GEN7_L3CNTLREG1, | ||
| 8483 | GEN7_WA_FOR_GEN7_L3_CONTROL); | ||
| 8484 | I915_WRITE(GEN7_L3_CHICKEN_MODE_REGISTER, | ||
| 8485 | GEN7_WA_L3_CHICKEN_MODE); | ||
| 8486 | |||
| 8487 | /* This is required by WaCatErrorRejectionIssue */ | ||
| 8488 | I915_WRITE(GEN7_SQ_CHICKEN_MBCUNIT_CONFIG, | ||
| 8489 | I915_READ(GEN7_SQ_CHICKEN_MBCUNIT_CONFIG) | | ||
| 8490 | GEN7_SQ_CHICKEN_MBCUNIT_SQINTMOB); | ||
| 8491 | |||
| 8472 | for_each_pipe(pipe) { | 8492 | for_each_pipe(pipe) { |
| 8473 | I915_WRITE(DSPCNTR(pipe), | 8493 | I915_WRITE(DSPCNTR(pipe), |
| 8474 | I915_READ(DSPCNTR(pipe)) | | 8494 | I915_READ(DSPCNTR(pipe)) | |
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 9be353b894cc..f58254a3fb01 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
| @@ -3223,6 +3223,7 @@ int evergreen_resume(struct radeon_device *rdev) | |||
| 3223 | r = evergreen_startup(rdev); | 3223 | r = evergreen_startup(rdev); |
| 3224 | if (r) { | 3224 | if (r) { |
| 3225 | DRM_ERROR("evergreen startup failed on resume\n"); | 3225 | DRM_ERROR("evergreen startup failed on resume\n"); |
| 3226 | rdev->accel_working = false; | ||
| 3226 | return r; | 3227 | return r; |
| 3227 | } | 3228 | } |
| 3228 | 3229 | ||
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c index db09065e68fd..2509c505acb8 100644 --- a/drivers/gpu/drm/radeon/ni.c +++ b/drivers/gpu/drm/radeon/ni.c | |||
| @@ -1547,6 +1547,7 @@ int cayman_resume(struct radeon_device *rdev) | |||
| 1547 | r = cayman_startup(rdev); | 1547 | r = cayman_startup(rdev); |
| 1548 | if (r) { | 1548 | if (r) { |
| 1549 | DRM_ERROR("cayman startup failed on resume\n"); | 1549 | DRM_ERROR("cayman startup failed on resume\n"); |
| 1550 | rdev->accel_working = false; | ||
| 1550 | return r; | 1551 | return r; |
| 1551 | } | 1552 | } |
| 1552 | return r; | 1553 | return r; |
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index bfd36ab643a6..333cde9d4e7b 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c | |||
| @@ -789,9 +789,7 @@ int r100_irq_process(struct radeon_device *rdev) | |||
| 789 | WREG32(RADEON_AIC_CNTL, msi_rearm | RS400_MSI_REARM); | 789 | WREG32(RADEON_AIC_CNTL, msi_rearm | RS400_MSI_REARM); |
| 790 | break; | 790 | break; |
| 791 | default: | 791 | default: |
| 792 | msi_rearm = RREG32(RADEON_MSI_REARM_EN) & ~RV370_MSI_REARM_EN; | 792 | WREG32(RADEON_MSI_REARM_EN, RV370_MSI_REARM_EN); |
| 793 | WREG32(RADEON_MSI_REARM_EN, msi_rearm); | ||
| 794 | WREG32(RADEON_MSI_REARM_EN, msi_rearm | RV370_MSI_REARM_EN); | ||
| 795 | break; | 793 | break; |
| 796 | } | 794 | } |
| 797 | } | 795 | } |
| @@ -3930,6 +3928,8 @@ static int r100_startup(struct radeon_device *rdev) | |||
| 3930 | 3928 | ||
| 3931 | int r100_resume(struct radeon_device *rdev) | 3929 | int r100_resume(struct radeon_device *rdev) |
| 3932 | { | 3930 | { |
| 3931 | int r; | ||
| 3932 | |||
| 3933 | /* Make sur GART are not working */ | 3933 | /* Make sur GART are not working */ |
| 3934 | if (rdev->flags & RADEON_IS_PCI) | 3934 | if (rdev->flags & RADEON_IS_PCI) |
| 3935 | r100_pci_gart_disable(rdev); | 3935 | r100_pci_gart_disable(rdev); |
| @@ -3949,7 +3949,11 @@ int r100_resume(struct radeon_device *rdev) | |||
| 3949 | radeon_surface_init(rdev); | 3949 | radeon_surface_init(rdev); |
| 3950 | 3950 | ||
| 3951 | rdev->accel_working = true; | 3951 | rdev->accel_working = true; |
| 3952 | return r100_startup(rdev); | 3952 | r = r100_startup(rdev); |
| 3953 | if (r) { | ||
| 3954 | rdev->accel_working = false; | ||
| 3955 | } | ||
| 3956 | return r; | ||
| 3953 | } | 3957 | } |
| 3954 | 3958 | ||
| 3955 | int r100_suspend(struct radeon_device *rdev) | 3959 | int r100_suspend(struct radeon_device *rdev) |
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c index 3fc0d29a5f39..6829638cca40 100644 --- a/drivers/gpu/drm/radeon/r300.c +++ b/drivers/gpu/drm/radeon/r300.c | |||
| @@ -1431,6 +1431,8 @@ static int r300_startup(struct radeon_device *rdev) | |||
| 1431 | 1431 | ||
| 1432 | int r300_resume(struct radeon_device *rdev) | 1432 | int r300_resume(struct radeon_device *rdev) |
| 1433 | { | 1433 | { |
| 1434 | int r; | ||
| 1435 | |||
| 1434 | /* Make sur GART are not working */ | 1436 | /* Make sur GART are not working */ |
| 1435 | if (rdev->flags & RADEON_IS_PCIE) | 1437 | if (rdev->flags & RADEON_IS_PCIE) |
| 1436 | rv370_pcie_gart_disable(rdev); | 1438 | rv370_pcie_gart_disable(rdev); |
| @@ -1452,7 +1454,11 @@ int r300_resume(struct radeon_device *rdev) | |||
| 1452 | radeon_surface_init(rdev); | 1454 | radeon_surface_init(rdev); |
| 1453 | 1455 | ||
| 1454 | rdev->accel_working = true; | 1456 | rdev->accel_working = true; |
| 1455 | return r300_startup(rdev); | 1457 | r = r300_startup(rdev); |
| 1458 | if (r) { | ||
| 1459 | rdev->accel_working = false; | ||
| 1460 | } | ||
| 1461 | return r; | ||
| 1456 | } | 1462 | } |
| 1457 | 1463 | ||
| 1458 | int r300_suspend(struct radeon_device *rdev) | 1464 | int r300_suspend(struct radeon_device *rdev) |
diff --git a/drivers/gpu/drm/radeon/r420.c b/drivers/gpu/drm/radeon/r420.c index 666e28fe509c..b14323053bad 100644 --- a/drivers/gpu/drm/radeon/r420.c +++ b/drivers/gpu/drm/radeon/r420.c | |||
| @@ -291,6 +291,8 @@ static int r420_startup(struct radeon_device *rdev) | |||
| 291 | 291 | ||
| 292 | int r420_resume(struct radeon_device *rdev) | 292 | int r420_resume(struct radeon_device *rdev) |
| 293 | { | 293 | { |
| 294 | int r; | ||
| 295 | |||
| 294 | /* Make sur GART are not working */ | 296 | /* Make sur GART are not working */ |
| 295 | if (rdev->flags & RADEON_IS_PCIE) | 297 | if (rdev->flags & RADEON_IS_PCIE) |
| 296 | rv370_pcie_gart_disable(rdev); | 298 | rv370_pcie_gart_disable(rdev); |
| @@ -316,7 +318,11 @@ int r420_resume(struct radeon_device *rdev) | |||
| 316 | radeon_surface_init(rdev); | 318 | radeon_surface_init(rdev); |
| 317 | 319 | ||
| 318 | rdev->accel_working = true; | 320 | rdev->accel_working = true; |
| 319 | return r420_startup(rdev); | 321 | r = r420_startup(rdev); |
| 322 | if (r) { | ||
| 323 | rdev->accel_working = false; | ||
| 324 | } | ||
| 325 | return r; | ||
| 320 | } | 326 | } |
| 321 | 327 | ||
| 322 | int r420_suspend(struct radeon_device *rdev) | 328 | int r420_suspend(struct radeon_device *rdev) |
diff --git a/drivers/gpu/drm/radeon/r520.c b/drivers/gpu/drm/radeon/r520.c index 4ae1615e752f..25084e824dbc 100644 --- a/drivers/gpu/drm/radeon/r520.c +++ b/drivers/gpu/drm/radeon/r520.c | |||
| @@ -218,6 +218,8 @@ static int r520_startup(struct radeon_device *rdev) | |||
| 218 | 218 | ||
| 219 | int r520_resume(struct radeon_device *rdev) | 219 | int r520_resume(struct radeon_device *rdev) |
| 220 | { | 220 | { |
| 221 | int r; | ||
| 222 | |||
| 221 | /* Make sur GART are not working */ | 223 | /* Make sur GART are not working */ |
| 222 | if (rdev->flags & RADEON_IS_PCIE) | 224 | if (rdev->flags & RADEON_IS_PCIE) |
| 223 | rv370_pcie_gart_disable(rdev); | 225 | rv370_pcie_gart_disable(rdev); |
| @@ -237,7 +239,11 @@ int r520_resume(struct radeon_device *rdev) | |||
| 237 | radeon_surface_init(rdev); | 239 | radeon_surface_init(rdev); |
| 238 | 240 | ||
| 239 | rdev->accel_working = true; | 241 | rdev->accel_working = true; |
| 240 | return r520_startup(rdev); | 242 | r = r520_startup(rdev); |
| 243 | if (r) { | ||
| 244 | rdev->accel_working = false; | ||
| 245 | } | ||
| 246 | return r; | ||
| 241 | } | 247 | } |
| 242 | 248 | ||
| 243 | int r520_init(struct radeon_device *rdev) | 249 | int r520_init(struct radeon_device *rdev) |
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index 4f08e5e6ee9d..fbcd84803b60 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
| @@ -2529,6 +2529,7 @@ int r600_resume(struct radeon_device *rdev) | |||
| 2529 | r = r600_startup(rdev); | 2529 | r = r600_startup(rdev); |
| 2530 | if (r) { | 2530 | if (r) { |
| 2531 | DRM_ERROR("r600 startup failed on resume\n"); | 2531 | DRM_ERROR("r600 startup failed on resume\n"); |
| 2532 | rdev->accel_working = false; | ||
| 2532 | return r; | 2533 | return r; |
| 2533 | } | 2534 | } |
| 2534 | 2535 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c index 5082d17d14dc..1f53ae74ada1 100644 --- a/drivers/gpu/drm/radeon/radeon_atombios.c +++ b/drivers/gpu/drm/radeon/radeon_atombios.c | |||
| @@ -2931,6 +2931,20 @@ radeon_atombios_connected_scratch_regs(struct drm_connector *connector, | |||
| 2931 | bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP5; | 2931 | bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP5; |
| 2932 | } | 2932 | } |
| 2933 | } | 2933 | } |
| 2934 | if ((radeon_encoder->devices & ATOM_DEVICE_DFP6_SUPPORT) && | ||
| 2935 | (radeon_connector->devices & ATOM_DEVICE_DFP6_SUPPORT)) { | ||
| 2936 | if (connected) { | ||
| 2937 | DRM_DEBUG_KMS("DFP6 connected\n"); | ||
| 2938 | bios_0_scratch |= ATOM_S0_DFP6; | ||
| 2939 | bios_3_scratch |= ATOM_S3_DFP6_ACTIVE; | ||
| 2940 | bios_6_scratch |= ATOM_S6_ACC_REQ_DFP6; | ||
| 2941 | } else { | ||
| 2942 | DRM_DEBUG_KMS("DFP6 disconnected\n"); | ||
| 2943 | bios_0_scratch &= ~ATOM_S0_DFP6; | ||
| 2944 | bios_3_scratch &= ~ATOM_S3_DFP6_ACTIVE; | ||
| 2945 | bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP6; | ||
| 2946 | } | ||
| 2947 | } | ||
| 2934 | 2948 | ||
| 2935 | if (rdev->family >= CHIP_R600) { | 2949 | if (rdev->family >= CHIP_R600) { |
| 2936 | WREG32(R600_BIOS_0_SCRATCH, bios_0_scratch); | 2950 | WREG32(R600_BIOS_0_SCRATCH, bios_0_scratch); |
| @@ -2951,6 +2965,9 @@ radeon_atombios_encoder_crtc_scratch_regs(struct drm_encoder *encoder, int crtc) | |||
| 2951 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 2965 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
| 2952 | uint32_t bios_3_scratch; | 2966 | uint32_t bios_3_scratch; |
| 2953 | 2967 | ||
| 2968 | if (ASIC_IS_DCE4(rdev)) | ||
| 2969 | return; | ||
| 2970 | |||
| 2954 | if (rdev->family >= CHIP_R600) | 2971 | if (rdev->family >= CHIP_R600) |
| 2955 | bios_3_scratch = RREG32(R600_BIOS_3_SCRATCH); | 2972 | bios_3_scratch = RREG32(R600_BIOS_3_SCRATCH); |
| 2956 | else | 2973 | else |
| @@ -3003,6 +3020,9 @@ radeon_atombios_encoder_dpms_scratch_regs(struct drm_encoder *encoder, bool on) | |||
| 3003 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 3020 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
| 3004 | uint32_t bios_2_scratch; | 3021 | uint32_t bios_2_scratch; |
| 3005 | 3022 | ||
| 3023 | if (ASIC_IS_DCE4(rdev)) | ||
| 3024 | return; | ||
| 3025 | |||
| 3006 | if (rdev->family >= CHIP_R600) | 3026 | if (rdev->family >= CHIP_R600) |
| 3007 | bios_2_scratch = RREG32(R600_BIOS_2_SCRATCH); | 3027 | bios_2_scratch = RREG32(R600_BIOS_2_SCRATCH); |
| 3008 | else | 3028 | else |
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c index 435a3d970ab8..e64bec488ed8 100644 --- a/drivers/gpu/drm/radeon/radeon_cs.c +++ b/drivers/gpu/drm/radeon/radeon_cs.c | |||
| @@ -453,6 +453,10 @@ int radeon_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) | |||
| 453 | int r; | 453 | int r; |
| 454 | 454 | ||
| 455 | radeon_mutex_lock(&rdev->cs_mutex); | 455 | radeon_mutex_lock(&rdev->cs_mutex); |
| 456 | if (!rdev->accel_working) { | ||
| 457 | radeon_mutex_unlock(&rdev->cs_mutex); | ||
| 458 | return -EBUSY; | ||
| 459 | } | ||
| 456 | /* initialize parser */ | 460 | /* initialize parser */ |
| 457 | memset(&parser, 0, sizeof(struct radeon_cs_parser)); | 461 | memset(&parser, 0, sizeof(struct radeon_cs_parser)); |
| 458 | parser.filp = filp; | 462 | parser.filp = filp; |
diff --git a/drivers/gpu/drm/radeon/radeon_fence.c b/drivers/gpu/drm/radeon/radeon_fence.c index 64ea3dd9e6ff..4bd36a354fbe 100644 --- a/drivers/gpu/drm/radeon/radeon_fence.c +++ b/drivers/gpu/drm/radeon/radeon_fence.c | |||
| @@ -364,8 +364,10 @@ int radeon_fence_count_emitted(struct radeon_device *rdev, int ring) | |||
| 364 | int not_processed = 0; | 364 | int not_processed = 0; |
| 365 | 365 | ||
| 366 | read_lock_irqsave(&rdev->fence_lock, irq_flags); | 366 | read_lock_irqsave(&rdev->fence_lock, irq_flags); |
| 367 | if (!rdev->fence_drv[ring].initialized) | 367 | if (!rdev->fence_drv[ring].initialized) { |
| 368 | read_unlock_irqrestore(&rdev->fence_lock, irq_flags); | ||
| 368 | return 0; | 369 | return 0; |
| 370 | } | ||
| 369 | 371 | ||
| 370 | if (!list_empty(&rdev->fence_drv[ring].emitted)) { | 372 | if (!list_empty(&rdev->fence_drv[ring].emitted)) { |
| 371 | struct list_head *ptr; | 373 | struct list_head *ptr; |
diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c index 30a4c5014c8b..92c9ea4751fb 100644 --- a/drivers/gpu/drm/radeon/radeon_ring.c +++ b/drivers/gpu/drm/radeon/radeon_ring.c | |||
| @@ -500,8 +500,11 @@ static char radeon_debugfs_ib_names[RADEON_IB_POOL_SIZE][32]; | |||
| 500 | int radeon_debugfs_ring_init(struct radeon_device *rdev) | 500 | int radeon_debugfs_ring_init(struct radeon_device *rdev) |
| 501 | { | 501 | { |
| 502 | #if defined(CONFIG_DEBUG_FS) | 502 | #if defined(CONFIG_DEBUG_FS) |
| 503 | return radeon_debugfs_add_files(rdev, radeon_debugfs_ring_info_list, | 503 | if (rdev->family >= CHIP_CAYMAN) |
| 504 | ARRAY_SIZE(radeon_debugfs_ring_info_list)); | 504 | return radeon_debugfs_add_files(rdev, radeon_debugfs_ring_info_list, |
| 505 | ARRAY_SIZE(radeon_debugfs_ring_info_list)); | ||
| 506 | else | ||
| 507 | return radeon_debugfs_add_files(rdev, radeon_debugfs_ring_info_list, 1); | ||
| 505 | #else | 508 | #else |
| 506 | return 0; | 509 | return 0; |
| 507 | #endif | 510 | #endif |
diff --git a/drivers/gpu/drm/radeon/rs400.c b/drivers/gpu/drm/radeon/rs400.c index b0ce84a20a68..866a05be75f2 100644 --- a/drivers/gpu/drm/radeon/rs400.c +++ b/drivers/gpu/drm/radeon/rs400.c | |||
| @@ -442,6 +442,8 @@ static int rs400_startup(struct radeon_device *rdev) | |||
| 442 | 442 | ||
| 443 | int rs400_resume(struct radeon_device *rdev) | 443 | int rs400_resume(struct radeon_device *rdev) |
| 444 | { | 444 | { |
| 445 | int r; | ||
| 446 | |||
| 445 | /* Make sur GART are not working */ | 447 | /* Make sur GART are not working */ |
| 446 | rs400_gart_disable(rdev); | 448 | rs400_gart_disable(rdev); |
| 447 | /* Resume clock before doing reset */ | 449 | /* Resume clock before doing reset */ |
| @@ -462,7 +464,11 @@ int rs400_resume(struct radeon_device *rdev) | |||
| 462 | radeon_surface_init(rdev); | 464 | radeon_surface_init(rdev); |
| 463 | 465 | ||
| 464 | rdev->accel_working = true; | 466 | rdev->accel_working = true; |
| 465 | return rs400_startup(rdev); | 467 | r = rs400_startup(rdev); |
| 468 | if (r) { | ||
| 469 | rdev->accel_working = false; | ||
| 470 | } | ||
| 471 | return r; | ||
| 466 | } | 472 | } |
| 467 | 473 | ||
| 468 | int rs400_suspend(struct radeon_device *rdev) | 474 | int rs400_suspend(struct radeon_device *rdev) |
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c index ec46eb45e34c..4fc700684dcd 100644 --- a/drivers/gpu/drm/radeon/rs600.c +++ b/drivers/gpu/drm/radeon/rs600.c | |||
| @@ -684,9 +684,7 @@ int rs600_irq_process(struct radeon_device *rdev) | |||
| 684 | WREG32(RADEON_BUS_CNTL, msi_rearm | RS600_MSI_REARM); | 684 | WREG32(RADEON_BUS_CNTL, msi_rearm | RS600_MSI_REARM); |
| 685 | break; | 685 | break; |
| 686 | default: | 686 | default: |
| 687 | msi_rearm = RREG32(RADEON_MSI_REARM_EN) & ~RV370_MSI_REARM_EN; | 687 | WREG32(RADEON_MSI_REARM_EN, RV370_MSI_REARM_EN); |
| 688 | WREG32(RADEON_MSI_REARM_EN, msi_rearm); | ||
| 689 | WREG32(RADEON_MSI_REARM_EN, msi_rearm | RV370_MSI_REARM_EN); | ||
| 690 | break; | 688 | break; |
| 691 | } | 689 | } |
| 692 | } | 690 | } |
| @@ -878,6 +876,8 @@ static int rs600_startup(struct radeon_device *rdev) | |||
| 878 | 876 | ||
| 879 | int rs600_resume(struct radeon_device *rdev) | 877 | int rs600_resume(struct radeon_device *rdev) |
| 880 | { | 878 | { |
| 879 | int r; | ||
| 880 | |||
| 881 | /* Make sur GART are not working */ | 881 | /* Make sur GART are not working */ |
| 882 | rs600_gart_disable(rdev); | 882 | rs600_gart_disable(rdev); |
| 883 | /* Resume clock before doing reset */ | 883 | /* Resume clock before doing reset */ |
| @@ -896,7 +896,11 @@ int rs600_resume(struct radeon_device *rdev) | |||
| 896 | radeon_surface_init(rdev); | 896 | radeon_surface_init(rdev); |
| 897 | 897 | ||
| 898 | rdev->accel_working = true; | 898 | rdev->accel_working = true; |
| 899 | return rs600_startup(rdev); | 899 | r = rs600_startup(rdev); |
| 900 | if (r) { | ||
| 901 | rdev->accel_working = false; | ||
| 902 | } | ||
| 903 | return r; | ||
| 900 | } | 904 | } |
| 901 | 905 | ||
| 902 | int rs600_suspend(struct radeon_device *rdev) | 906 | int rs600_suspend(struct radeon_device *rdev) |
diff --git a/drivers/gpu/drm/radeon/rs690.c b/drivers/gpu/drm/radeon/rs690.c index 4f24a0fa8c82..f68dff2fadcb 100644 --- a/drivers/gpu/drm/radeon/rs690.c +++ b/drivers/gpu/drm/radeon/rs690.c | |||
| @@ -659,6 +659,8 @@ static int rs690_startup(struct radeon_device *rdev) | |||
| 659 | 659 | ||
| 660 | int rs690_resume(struct radeon_device *rdev) | 660 | int rs690_resume(struct radeon_device *rdev) |
| 661 | { | 661 | { |
| 662 | int r; | ||
| 663 | |||
| 662 | /* Make sur GART are not working */ | 664 | /* Make sur GART are not working */ |
| 663 | rs400_gart_disable(rdev); | 665 | rs400_gart_disable(rdev); |
| 664 | /* Resume clock before doing reset */ | 666 | /* Resume clock before doing reset */ |
| @@ -677,7 +679,11 @@ int rs690_resume(struct radeon_device *rdev) | |||
| 677 | radeon_surface_init(rdev); | 679 | radeon_surface_init(rdev); |
| 678 | 680 | ||
| 679 | rdev->accel_working = true; | 681 | rdev->accel_working = true; |
| 680 | return rs690_startup(rdev); | 682 | r = rs690_startup(rdev); |
| 683 | if (r) { | ||
| 684 | rdev->accel_working = false; | ||
| 685 | } | ||
| 686 | return r; | ||
| 681 | } | 687 | } |
| 682 | 688 | ||
| 683 | int rs690_suspend(struct radeon_device *rdev) | 689 | int rs690_suspend(struct radeon_device *rdev) |
diff --git a/drivers/gpu/drm/radeon/rv515.c b/drivers/gpu/drm/radeon/rv515.c index 880637fd1946..959bf4483bea 100644 --- a/drivers/gpu/drm/radeon/rv515.c +++ b/drivers/gpu/drm/radeon/rv515.c | |||
| @@ -424,6 +424,8 @@ static int rv515_startup(struct radeon_device *rdev) | |||
| 424 | 424 | ||
| 425 | int rv515_resume(struct radeon_device *rdev) | 425 | int rv515_resume(struct radeon_device *rdev) |
| 426 | { | 426 | { |
| 427 | int r; | ||
| 428 | |||
| 427 | /* Make sur GART are not working */ | 429 | /* Make sur GART are not working */ |
| 428 | if (rdev->flags & RADEON_IS_PCIE) | 430 | if (rdev->flags & RADEON_IS_PCIE) |
| 429 | rv370_pcie_gart_disable(rdev); | 431 | rv370_pcie_gart_disable(rdev); |
| @@ -443,7 +445,11 @@ int rv515_resume(struct radeon_device *rdev) | |||
| 443 | radeon_surface_init(rdev); | 445 | radeon_surface_init(rdev); |
| 444 | 446 | ||
| 445 | rdev->accel_working = true; | 447 | rdev->accel_working = true; |
| 446 | return rv515_startup(rdev); | 448 | r = rv515_startup(rdev); |
| 449 | if (r) { | ||
| 450 | rdev->accel_working = false; | ||
| 451 | } | ||
| 452 | return r; | ||
| 447 | } | 453 | } |
| 448 | 454 | ||
| 449 | int rv515_suspend(struct radeon_device *rdev) | 455 | int rv515_suspend(struct radeon_device *rdev) |
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c index a1668b659ddd..c049c0c51841 100644 --- a/drivers/gpu/drm/radeon/rv770.c +++ b/drivers/gpu/drm/radeon/rv770.c | |||
| @@ -1139,6 +1139,7 @@ int rv770_resume(struct radeon_device *rdev) | |||
| 1139 | r = rv770_startup(rdev); | 1139 | r = rv770_startup(rdev); |
| 1140 | if (r) { | 1140 | if (r) { |
| 1141 | DRM_ERROR("r600 startup failed on resume\n"); | 1141 | DRM_ERROR("r600 startup failed on resume\n"); |
| 1142 | rdev->accel_working = false; | ||
| 1142 | return r; | 1143 | return r; |
| 1143 | } | 1144 | } |
| 1144 | 1145 | ||
diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c index 6381604696d3..0ab4a9548745 100644 --- a/drivers/i2c/busses/i2c-tegra.c +++ b/drivers/i2c/busses/i2c-tegra.c | |||
| @@ -755,7 +755,7 @@ MODULE_DEVICE_TABLE(of, tegra_i2c_of_match); | |||
| 755 | 755 | ||
| 756 | static struct platform_driver tegra_i2c_driver = { | 756 | static struct platform_driver tegra_i2c_driver = { |
| 757 | .probe = tegra_i2c_probe, | 757 | .probe = tegra_i2c_probe, |
| 758 | .remove = tegra_i2c_remove, | 758 | .remove = __devexit_p(tegra_i2c_remove), |
| 759 | #ifdef CONFIG_PM | 759 | #ifdef CONFIG_PM |
| 760 | .suspend = tegra_i2c_suspend, | 760 | .suspend = tegra_i2c_suspend, |
| 761 | .resume = tegra_i2c_resume, | 761 | .resume = tegra_i2c_resume, |
diff --git a/drivers/ide/Makefile b/drivers/ide/Makefile index 7f879b2397b0..af8d016c37ea 100644 --- a/drivers/ide/Makefile +++ b/drivers/ide/Makefile | |||
| @@ -116,4 +116,3 @@ obj-$(CONFIG_BLK_DEV_IDE_AU1XXX) += au1xxx-ide.o | |||
| 116 | 116 | ||
| 117 | obj-$(CONFIG_BLK_DEV_IDE_TX4938) += tx4938ide.o | 117 | obj-$(CONFIG_BLK_DEV_IDE_TX4938) += tx4938ide.o |
| 118 | obj-$(CONFIG_BLK_DEV_IDE_TX4939) += tx4939ide.o | 118 | obj-$(CONFIG_BLK_DEV_IDE_TX4939) += tx4939ide.o |
| 119 | obj-$(CONFIG_BLK_DEV_IDE_AT91) += at91_ide.o | ||
diff --git a/drivers/ide/at91_ide.c b/drivers/ide/at91_ide.c deleted file mode 100644 index 41d415529479..000000000000 --- a/drivers/ide/at91_ide.c +++ /dev/null | |||
| @@ -1,366 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * IDE host driver for AT91 (SAM9, CAP9, AT572D940HF) Static Memory Controller | ||
| 3 | * with Compact Flash True IDE logic | ||
| 4 | * | ||
| 5 | * Copyright (c) 2008, 2009 Kelvatek Ltd. | ||
| 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 as published by | ||
| 9 | * the Free Software Foundation; either version 2 of the License, or | ||
| 10 | * (at your option) any later version. | ||
| 11 | * | ||
| 12 | * This program is distributed in the hope that it will be useful, | ||
| 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 15 | * GNU General Public License for more details. | ||
| 16 | * | ||
| 17 | * You should have received a copy of the GNU General Public License | ||
| 18 | * along with this program; if not, write to the Free Software | ||
| 19 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 20 | * | ||
| 21 | */ | ||
| 22 | |||
| 23 | #include <linux/kernel.h> | ||
| 24 | #include <linux/module.h> | ||
| 25 | #include <linux/clk.h> | ||
| 26 | #include <linux/err.h> | ||
| 27 | #include <linux/ide.h> | ||
| 28 | #include <linux/platform_device.h> | ||
| 29 | |||
| 30 | #include <mach/board.h> | ||
| 31 | #include <asm/gpio.h> | ||
| 32 | #include <mach/at91sam9_smc.h> | ||
| 33 | |||
| 34 | #define DRV_NAME "at91_ide" | ||
| 35 | |||
| 36 | #define perr(fmt, args...) pr_err(DRV_NAME ": " fmt, ##args) | ||
| 37 | #define pdbg(fmt, args...) pr_debug("%s " fmt, __func__, ##args) | ||
| 38 | |||
| 39 | /* | ||
| 40 | * Access to IDE device is possible through EBI Static Memory Controller | ||
| 41 | * with Compact Flash logic. For details see EBI and SMC datasheet sections | ||
| 42 | * of any microcontroller from AT91SAM9 family. | ||
| 43 | * | ||
| 44 | * Within SMC chip select address space, lines A[23:21] distinguish Compact | ||
| 45 | * Flash modes (I/O, common memory, attribute memory, True IDE). IDE modes are: | ||
| 46 | * 0x00c0000 - True IDE | ||
| 47 | * 0x00e0000 - Alternate True IDE (Alt Status Register) | ||
| 48 | * | ||
| 49 | * On True IDE mode Task File and Data Register are mapped at the same address. | ||
| 50 | * To distinguish access between these two different bus data width is used: | ||
| 51 | * 8Bit for Task File, 16Bit for Data I/O. | ||
| 52 | * | ||
| 53 | * After initialization we do 8/16 bit flipping (changes in SMC MODE register) | ||
| 54 | * only inside IDE callback routines which are serialized by IDE layer, | ||
| 55 | * so no additional locking needed. | ||
| 56 | */ | ||
| 57 | |||
| 58 | #define TASK_FILE 0x00c00000 | ||
| 59 | #define ALT_MODE 0x00e00000 | ||
| 60 | #define REGS_SIZE 8 | ||
| 61 | |||
| 62 | #define enter_16bit(cs, mode) do { \ | ||
| 63 | mode = at91_sys_read(AT91_SMC_MODE(cs)); \ | ||
| 64 | at91_sys_write(AT91_SMC_MODE(cs), mode | AT91_SMC_DBW_16); \ | ||
| 65 | } while (0) | ||
| 66 | |||
| 67 | #define leave_16bit(cs, mode) at91_sys_write(AT91_SMC_MODE(cs), mode); | ||
| 68 | |||
| 69 | static void set_smc_timings(const u8 chipselect, const u16 cycle, | ||
| 70 | const u16 setup, const u16 pulse, | ||
| 71 | const u16 data_float, int use_iordy) | ||
| 72 | { | ||
| 73 | unsigned long mode = AT91_SMC_READMODE | AT91_SMC_WRITEMODE | | ||
| 74 | AT91_SMC_BAT_SELECT; | ||
| 75 | |||
| 76 | /* disable or enable waiting for IORDY signal */ | ||
| 77 | if (use_iordy) | ||
| 78 | mode |= AT91_SMC_EXNWMODE_READY; | ||
| 79 | |||
| 80 | /* add data float cycles if needed */ | ||
| 81 | if (data_float) | ||
| 82 | mode |= AT91_SMC_TDF_(data_float); | ||
| 83 | |||
| 84 | at91_sys_write(AT91_SMC_MODE(chipselect), mode); | ||
| 85 | |||
| 86 | /* setup timings in SMC */ | ||
| 87 | at91_sys_write(AT91_SMC_SETUP(chipselect), AT91_SMC_NWESETUP_(setup) | | ||
| 88 | AT91_SMC_NCS_WRSETUP_(0) | | ||
| 89 | AT91_SMC_NRDSETUP_(setup) | | ||
| 90 | AT91_SMC_NCS_RDSETUP_(0)); | ||
| 91 | at91_sys_write(AT91_SMC_PULSE(chipselect), AT91_SMC_NWEPULSE_(pulse) | | ||
| 92 | AT91_SMC_NCS_WRPULSE_(cycle) | | ||
| 93 | AT91_SMC_NRDPULSE_(pulse) | | ||
| 94 | AT91_SMC_NCS_RDPULSE_(cycle)); | ||
| 95 | at91_sys_write(AT91_SMC_CYCLE(chipselect), AT91_SMC_NWECYCLE_(cycle) | | ||
| 96 | AT91_SMC_NRDCYCLE_(cycle)); | ||
| 97 | } | ||
| 98 | |||
| 99 | static unsigned int calc_mck_cycles(unsigned int ns, unsigned int mck_hz) | ||
| 100 | { | ||
| 101 | u64 tmp = ns; | ||
| 102 | |||
| 103 | tmp *= mck_hz; | ||
| 104 | tmp += 1000*1000*1000 - 1; /* round up */ | ||
| 105 | do_div(tmp, 1000*1000*1000); | ||
| 106 | return (unsigned int) tmp; | ||
| 107 | } | ||
| 108 | |||
| 109 | static void apply_timings(const u8 chipselect, const u8 pio, | ||
| 110 | const struct ide_timing *timing, int use_iordy) | ||
| 111 | { | ||
| 112 | unsigned int t0, t1, t2, t6z; | ||
| 113 | unsigned int cycle, setup, pulse, data_float; | ||
| 114 | unsigned int mck_hz; | ||
| 115 | struct clk *mck; | ||
| 116 | |||
| 117 | /* see table 22 of Compact Flash standard 4.1 for the meaning, | ||
| 118 | * we do not stretch active (t2) time, so setup (t1) + hold time (th) | ||
| 119 | * assure at least minimal recovery (t2i) time */ | ||
| 120 | t0 = timing->cyc8b; | ||
| 121 | t1 = timing->setup; | ||
| 122 | t2 = timing->act8b; | ||
| 123 | t6z = (pio < 5) ? 30 : 20; | ||
| 124 | |||
| 125 | pdbg("t0=%u t1=%u t2=%u t6z=%u\n", t0, t1, t2, t6z); | ||
| 126 | |||
| 127 | mck = clk_get(NULL, "mck"); | ||
| 128 | BUG_ON(IS_ERR(mck)); | ||
| 129 | mck_hz = clk_get_rate(mck); | ||
| 130 | pdbg("mck_hz=%u\n", mck_hz); | ||
| 131 | |||
| 132 | cycle = calc_mck_cycles(t0, mck_hz); | ||
| 133 | setup = calc_mck_cycles(t1, mck_hz); | ||
| 134 | pulse = calc_mck_cycles(t2, mck_hz); | ||
| 135 | data_float = calc_mck_cycles(t6z, mck_hz); | ||
| 136 | |||
| 137 | pdbg("cycle=%u setup=%u pulse=%u data_float=%u\n", | ||
| 138 | cycle, setup, pulse, data_float); | ||
| 139 | |||
| 140 | set_smc_timings(chipselect, cycle, setup, pulse, data_float, use_iordy); | ||
| 141 | } | ||
| 142 | |||
| 143 | static void at91_ide_input_data(ide_drive_t *drive, struct ide_cmd *cmd, | ||
| 144 | void *buf, unsigned int len) | ||
| 145 | { | ||
| 146 | ide_hwif_t *hwif = drive->hwif; | ||
| 147 | struct ide_io_ports *io_ports = &hwif->io_ports; | ||
| 148 | u8 chipselect = hwif->select_data; | ||
| 149 | unsigned long mode; | ||
| 150 | |||
| 151 | pdbg("cs %u buf %p len %d\n", chipselect, buf, len); | ||
| 152 | |||
| 153 | len++; | ||
| 154 | |||
| 155 | enter_16bit(chipselect, mode); | ||
| 156 | readsw((void __iomem *)io_ports->data_addr, buf, len / 2); | ||
| 157 | leave_16bit(chipselect, mode); | ||
| 158 | } | ||
| 159 | |||
| 160 | static void at91_ide_output_data(ide_drive_t *drive, struct ide_cmd *cmd, | ||
| 161 | void *buf, unsigned int len) | ||
| 162 | { | ||
| 163 | ide_hwif_t *hwif = drive->hwif; | ||
| 164 | struct ide_io_ports *io_ports = &hwif->io_ports; | ||
| 165 | u8 chipselect = hwif->select_data; | ||
| 166 | unsigned long mode; | ||
| 167 | |||
| 168 | pdbg("cs %u buf %p len %d\n", chipselect, buf, len); | ||
| 169 | |||
| 170 | enter_16bit(chipselect, mode); | ||
| 171 | writesw((void __iomem *)io_ports->data_addr, buf, len / 2); | ||
| 172 | leave_16bit(chipselect, mode); | ||
| 173 | } | ||
| 174 | |||
| 175 | static void at91_ide_set_pio_mode(ide_hwif_t *hwif, ide_drive_t *drive) | ||
| 176 | { | ||
| 177 | struct ide_timing *timing; | ||
| 178 | u8 chipselect = hwif->select_data; | ||
| 179 | int use_iordy = 0; | ||
| 180 | const u8 pio = drive->pio_mode - XFER_PIO_0; | ||
| 181 | |||
| 182 | pdbg("chipselect %u pio %u\n", chipselect, pio); | ||
| 183 | |||
| 184 | timing = ide_timing_find_mode(XFER_PIO_0 + pio); | ||
| 185 | BUG_ON(!timing); | ||
| 186 | |||
| 187 | if (ide_pio_need_iordy(drive, pio)) | ||
| 188 | use_iordy = 1; | ||
| 189 | |||
| 190 | apply_timings(chipselect, pio, timing, use_iordy); | ||
| 191 | } | ||
| 192 | |||
| 193 | static const struct ide_tp_ops at91_ide_tp_ops = { | ||
| 194 | .exec_command = ide_exec_command, | ||
| 195 | .read_status = ide_read_status, | ||
| 196 | .read_altstatus = ide_read_altstatus, | ||
| 197 | .write_devctl = ide_write_devctl, | ||
| 198 | |||
| 199 | .dev_select = ide_dev_select, | ||
| 200 | .tf_load = ide_tf_load, | ||
| 201 | .tf_read = ide_tf_read, | ||
| 202 | |||
| 203 | .input_data = at91_ide_input_data, | ||
| 204 | .output_data = at91_ide_output_data, | ||
| 205 | }; | ||
| 206 | |||
| 207 | static const struct ide_port_ops at91_ide_port_ops = { | ||
| 208 | .set_pio_mode = at91_ide_set_pio_mode, | ||
| 209 | }; | ||
| 210 | |||
| 211 | static const struct ide_port_info at91_ide_port_info __initdata = { | ||
| 212 | .port_ops = &at91_ide_port_ops, | ||
| 213 | .tp_ops = &at91_ide_tp_ops, | ||
| 214 | .host_flags = IDE_HFLAG_MMIO | IDE_HFLAG_NO_DMA | IDE_HFLAG_SINGLE | | ||
| 215 | IDE_HFLAG_NO_IO_32BIT | IDE_HFLAG_UNMASK_IRQS, | ||
| 216 | .pio_mask = ATA_PIO6, | ||
| 217 | .chipset = ide_generic, | ||
| 218 | }; | ||
| 219 | |||
| 220 | /* | ||
| 221 | * If interrupt is delivered through GPIO, IRQ are triggered on falling | ||
| 222 | * and rising edge of signal. Whereas IDE device request interrupt on high | ||
| 223 | * level (rising edge in our case). This mean we have fake interrupts, so | ||
| 224 | * we need to check interrupt pin and exit instantly from ISR when line | ||
| 225 | * is on low level. | ||
| 226 | */ | ||
| 227 | |||
| 228 | irqreturn_t at91_irq_handler(int irq, void *dev_id) | ||
| 229 | { | ||
| 230 | int ntries = 8; | ||
| 231 | int pin_val1, pin_val2; | ||
| 232 | |||
| 233 | /* additional deglitch, line can be noisy in badly designed PCB */ | ||
| 234 | do { | ||
| 235 | pin_val1 = at91_get_gpio_value(irq); | ||
| 236 | pin_val2 = at91_get_gpio_value(irq); | ||
| 237 | } while (pin_val1 != pin_val2 && --ntries > 0); | ||
| 238 | |||
| 239 | if (pin_val1 == 0 || ntries <= 0) | ||
| 240 | return IRQ_HANDLED; | ||
| 241 | |||
| 242 | return ide_intr(irq, dev_id); | ||
| 243 | } | ||
| 244 | |||
| 245 | static int __init at91_ide_probe(struct platform_device *pdev) | ||
| 246 | { | ||
| 247 | int ret; | ||
| 248 | struct ide_hw hw, *hws[] = { &hw }; | ||
| 249 | struct ide_host *host; | ||
| 250 | struct resource *res; | ||
| 251 | unsigned long tf_base = 0, ctl_base = 0; | ||
| 252 | struct at91_cf_data *board = pdev->dev.platform_data; | ||
| 253 | |||
| 254 | if (!board) | ||
| 255 | return -ENODEV; | ||
| 256 | |||
| 257 | if (board->det_pin && at91_get_gpio_value(board->det_pin) != 0) { | ||
| 258 | perr("no device detected\n"); | ||
| 259 | return -ENODEV; | ||
| 260 | } | ||
| 261 | |||
| 262 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
| 263 | if (!res) { | ||
| 264 | perr("can't get memory resource\n"); | ||
| 265 | return -ENODEV; | ||
| 266 | } | ||
| 267 | |||
| 268 | if (!devm_request_mem_region(&pdev->dev, res->start + TASK_FILE, | ||
| 269 | REGS_SIZE, "ide") || | ||
| 270 | !devm_request_mem_region(&pdev->dev, res->start + ALT_MODE, | ||
| 271 | REGS_SIZE, "alt")) { | ||
| 272 | perr("memory resources in use\n"); | ||
| 273 | return -EBUSY; | ||
| 274 | } | ||
| 275 | |||
| 276 | pdbg("chipselect %u irq %u res %08lx\n", board->chipselect, | ||
| 277 | board->irq_pin, (unsigned long) res->start); | ||
| 278 | |||
| 279 | tf_base = (unsigned long) devm_ioremap(&pdev->dev, res->start + TASK_FILE, | ||
| 280 | REGS_SIZE); | ||
| 281 | ctl_base = (unsigned long) devm_ioremap(&pdev->dev, res->start + ALT_MODE, | ||
| 282 | REGS_SIZE); | ||
| 283 | if (!tf_base || !ctl_base) { | ||
| 284 | perr("can't map memory regions\n"); | ||
| 285 | return -EBUSY; | ||
| 286 | } | ||
| 287 | |||
| 288 | memset(&hw, 0, sizeof(hw)); | ||
| 289 | |||
| 290 | if (board->flags & AT91_IDE_SWAP_A0_A2) { | ||
| 291 | /* workaround for stupid hardware bug */ | ||
| 292 | hw.io_ports.data_addr = tf_base + 0; | ||
| 293 | hw.io_ports.error_addr = tf_base + 4; | ||
| 294 | hw.io_ports.nsect_addr = tf_base + 2; | ||
| 295 | hw.io_ports.lbal_addr = tf_base + 6; | ||
| 296 | hw.io_ports.lbam_addr = tf_base + 1; | ||
| 297 | hw.io_ports.lbah_addr = tf_base + 5; | ||
| 298 | hw.io_ports.device_addr = tf_base + 3; | ||
| 299 | hw.io_ports.command_addr = tf_base + 7; | ||
| 300 | hw.io_ports.ctl_addr = ctl_base + 3; | ||
| 301 | } else | ||
| 302 | ide_std_init_ports(&hw, tf_base, ctl_base + 6); | ||
| 303 | |||
| 304 | hw.irq = board->irq_pin; | ||
| 305 | hw.dev = &pdev->dev; | ||
| 306 | |||
| 307 | host = ide_host_alloc(&at91_ide_port_info, hws, 1); | ||
| 308 | if (!host) { | ||
| 309 | perr("failed to allocate ide host\n"); | ||
| 310 | return -ENOMEM; | ||
| 311 | } | ||
| 312 | |||
| 313 | /* setup Static Memory Controller - PIO 0 as default */ | ||
| 314 | apply_timings(board->chipselect, 0, ide_timing_find_mode(XFER_PIO_0), 0); | ||
| 315 | |||
| 316 | /* with GPIO interrupt we have to do quirks in handler */ | ||
| 317 | if (gpio_is_valid(board->irq_pin)) | ||
| 318 | host->irq_handler = at91_irq_handler; | ||
| 319 | |||
| 320 | host->ports[0]->select_data = board->chipselect; | ||
| 321 | |||
| 322 | ret = ide_host_register(host, &at91_ide_port_info, hws); | ||
| 323 | if (ret) { | ||
| 324 | perr("failed to register ide host\n"); | ||
| 325 | goto err_free_host; | ||
| 326 | } | ||
| 327 | platform_set_drvdata(pdev, host); | ||
| 328 | return 0; | ||
| 329 | |||
| 330 | err_free_host: | ||
| 331 | ide_host_free(host); | ||
| 332 | return ret; | ||
| 333 | } | ||
| 334 | |||
| 335 | static int __exit at91_ide_remove(struct platform_device *pdev) | ||
| 336 | { | ||
| 337 | struct ide_host *host = platform_get_drvdata(pdev); | ||
| 338 | |||
| 339 | ide_host_remove(host); | ||
| 340 | return 0; | ||
| 341 | } | ||
| 342 | |||
| 343 | static struct platform_driver at91_ide_driver = { | ||
| 344 | .driver = { | ||
| 345 | .name = DRV_NAME, | ||
| 346 | .owner = THIS_MODULE, | ||
| 347 | }, | ||
| 348 | .remove = __exit_p(at91_ide_remove), | ||
| 349 | }; | ||
| 350 | |||
| 351 | static int __init at91_ide_init(void) | ||
| 352 | { | ||
| 353 | return platform_driver_probe(&at91_ide_driver, at91_ide_probe); | ||
| 354 | } | ||
| 355 | |||
| 356 | static void __exit at91_ide_exit(void) | ||
| 357 | { | ||
| 358 | platform_driver_unregister(&at91_ide_driver); | ||
| 359 | } | ||
| 360 | |||
| 361 | module_init(at91_ide_init); | ||
| 362 | module_exit(at91_ide_exit); | ||
| 363 | |||
| 364 | MODULE_LICENSE("GPL"); | ||
| 365 | MODULE_AUTHOR("Stanislaw Gruszka <stf_xl@wp.pl>"); | ||
| 366 | |||
diff --git a/drivers/macintosh/adb.c b/drivers/macintosh/adb.c index 75049e765191..b026896206ca 100644 --- a/drivers/macintosh/adb.c +++ b/drivers/macintosh/adb.c | |||
| @@ -710,7 +710,7 @@ static ssize_t adb_read(struct file *file, char __user *buf, | |||
| 710 | req = NULL; | 710 | req = NULL; |
| 711 | spin_lock_irqsave(&state->lock, flags); | 711 | spin_lock_irqsave(&state->lock, flags); |
| 712 | add_wait_queue(&state->wait_queue, &wait); | 712 | add_wait_queue(&state->wait_queue, &wait); |
| 713 | current->state = TASK_INTERRUPTIBLE; | 713 | set_current_state(TASK_INTERRUPTIBLE); |
| 714 | 714 | ||
| 715 | for (;;) { | 715 | for (;;) { |
| 716 | req = state->completed; | 716 | req = state->completed; |
| @@ -734,7 +734,7 @@ static ssize_t adb_read(struct file *file, char __user *buf, | |||
| 734 | spin_lock_irqsave(&state->lock, flags); | 734 | spin_lock_irqsave(&state->lock, flags); |
| 735 | } | 735 | } |
| 736 | 736 | ||
| 737 | current->state = TASK_RUNNING; | 737 | set_current_state(TASK_RUNNING); |
| 738 | remove_wait_queue(&state->wait_queue, &wait); | 738 | remove_wait_queue(&state->wait_queue, &wait); |
| 739 | spin_unlock_irqrestore(&state->lock, flags); | 739 | spin_unlock_irqrestore(&state->lock, flags); |
| 740 | 740 | ||
diff --git a/drivers/media/radio/wl128x/Kconfig b/drivers/media/radio/wl128x/Kconfig index 86b28579f0c7..ea1e6545df36 100644 --- a/drivers/media/radio/wl128x/Kconfig +++ b/drivers/media/radio/wl128x/Kconfig | |||
| @@ -4,8 +4,8 @@ | |||
| 4 | menu "Texas Instruments WL128x FM driver (ST based)" | 4 | menu "Texas Instruments WL128x FM driver (ST based)" |
| 5 | config RADIO_WL128X | 5 | config RADIO_WL128X |
| 6 | tristate "Texas Instruments WL128x FM Radio" | 6 | tristate "Texas Instruments WL128x FM Radio" |
| 7 | depends on VIDEO_V4L2 && RFKILL | 7 | depends on VIDEO_V4L2 && RFKILL && GPIOLIB |
| 8 | select TI_ST if NET && GPIOLIB | 8 | select TI_ST if NET |
| 9 | help | 9 | help |
| 10 | Choose Y here if you have this FM radio chip. | 10 | Choose Y here if you have this FM radio chip. |
| 11 | 11 | ||
diff --git a/drivers/media/rc/imon.c b/drivers/media/rc/imon.c index 3aeb29a7ce11..7f26fdf2e54e 100644 --- a/drivers/media/rc/imon.c +++ b/drivers/media/rc/imon.c | |||
| @@ -47,7 +47,7 @@ | |||
| 47 | #define MOD_AUTHOR "Jarod Wilson <jarod@wilsonet.com>" | 47 | #define MOD_AUTHOR "Jarod Wilson <jarod@wilsonet.com>" |
| 48 | #define MOD_DESC "Driver for SoundGraph iMON MultiMedia IR/Display" | 48 | #define MOD_DESC "Driver for SoundGraph iMON MultiMedia IR/Display" |
| 49 | #define MOD_NAME "imon" | 49 | #define MOD_NAME "imon" |
| 50 | #define MOD_VERSION "0.9.3" | 50 | #define MOD_VERSION "0.9.4" |
| 51 | 51 | ||
| 52 | #define DISPLAY_MINOR_BASE 144 | 52 | #define DISPLAY_MINOR_BASE 144 |
| 53 | #define DEVICE_NAME "lcd%d" | 53 | #define DEVICE_NAME "lcd%d" |
| @@ -1658,9 +1658,17 @@ static void usb_rx_callback_intf0(struct urb *urb) | |||
| 1658 | return; | 1658 | return; |
| 1659 | 1659 | ||
| 1660 | ictx = (struct imon_context *)urb->context; | 1660 | ictx = (struct imon_context *)urb->context; |
| 1661 | if (!ictx || !ictx->dev_present_intf0) | 1661 | if (!ictx) |
| 1662 | return; | 1662 | return; |
| 1663 | 1663 | ||
| 1664 | /* | ||
| 1665 | * if we get a callback before we're done configuring the hardware, we | ||
| 1666 | * can't yet process the data, as there's nowhere to send it, but we | ||
| 1667 | * still need to submit a new rx URB to avoid wedging the hardware | ||
| 1668 | */ | ||
| 1669 | if (!ictx->dev_present_intf0) | ||
| 1670 | goto out; | ||
| 1671 | |||
| 1664 | switch (urb->status) { | 1672 | switch (urb->status) { |
| 1665 | case -ENOENT: /* usbcore unlink successful! */ | 1673 | case -ENOENT: /* usbcore unlink successful! */ |
| 1666 | return; | 1674 | return; |
| @@ -1678,6 +1686,7 @@ static void usb_rx_callback_intf0(struct urb *urb) | |||
| 1678 | break; | 1686 | break; |
| 1679 | } | 1687 | } |
| 1680 | 1688 | ||
| 1689 | out: | ||
| 1681 | usb_submit_urb(ictx->rx_urb_intf0, GFP_ATOMIC); | 1690 | usb_submit_urb(ictx->rx_urb_intf0, GFP_ATOMIC); |
| 1682 | } | 1691 | } |
| 1683 | 1692 | ||
| @@ -1690,9 +1699,17 @@ static void usb_rx_callback_intf1(struct urb *urb) | |||
| 1690 | return; | 1699 | return; |
| 1691 | 1700 | ||
| 1692 | ictx = (struct imon_context *)urb->context; | 1701 | ictx = (struct imon_context *)urb->context; |
| 1693 | if (!ictx || !ictx->dev_present_intf1) | 1702 | if (!ictx) |
| 1694 | return; | 1703 | return; |
| 1695 | 1704 | ||
| 1705 | /* | ||
| 1706 | * if we get a callback before we're done configuring the hardware, we | ||
| 1707 | * can't yet process the data, as there's nowhere to send it, but we | ||
| 1708 | * still need to submit a new rx URB to avoid wedging the hardware | ||
| 1709 | */ | ||
| 1710 | if (!ictx->dev_present_intf1) | ||
| 1711 | goto out; | ||
| 1712 | |||
| 1696 | switch (urb->status) { | 1713 | switch (urb->status) { |
| 1697 | case -ENOENT: /* usbcore unlink successful! */ | 1714 | case -ENOENT: /* usbcore unlink successful! */ |
| 1698 | return; | 1715 | return; |
| @@ -1710,6 +1727,7 @@ static void usb_rx_callback_intf1(struct urb *urb) | |||
| 1710 | break; | 1727 | break; |
| 1711 | } | 1728 | } |
| 1712 | 1729 | ||
| 1730 | out: | ||
| 1713 | usb_submit_urb(ictx->rx_urb_intf1, GFP_ATOMIC); | 1731 | usb_submit_urb(ictx->rx_urb_intf1, GFP_ATOMIC); |
| 1714 | } | 1732 | } |
| 1715 | 1733 | ||
| @@ -2242,7 +2260,7 @@ find_endpoint_failed: | |||
| 2242 | mutex_unlock(&ictx->lock); | 2260 | mutex_unlock(&ictx->lock); |
| 2243 | usb_free_urb(rx_urb); | 2261 | usb_free_urb(rx_urb); |
| 2244 | rx_urb_alloc_failed: | 2262 | rx_urb_alloc_failed: |
| 2245 | dev_err(ictx->dev, "unable to initialize intf0, err %d\n", ret); | 2263 | dev_err(ictx->dev, "unable to initialize intf1, err %d\n", ret); |
| 2246 | 2264 | ||
| 2247 | return NULL; | 2265 | return NULL; |
| 2248 | } | 2266 | } |
diff --git a/drivers/media/video/hdpvr/hdpvr-core.c b/drivers/media/video/hdpvr/hdpvr-core.c index e5eb56a5b618..6510110f53d0 100644 --- a/drivers/media/video/hdpvr/hdpvr-core.c +++ b/drivers/media/video/hdpvr/hdpvr-core.c | |||
| @@ -154,10 +154,20 @@ static int device_authorization(struct hdpvr_device *dev) | |||
| 154 | } | 154 | } |
| 155 | #endif | 155 | #endif |
| 156 | 156 | ||
| 157 | dev->fw_ver = dev->usbc_buf[1]; | ||
| 158 | |||
| 157 | v4l2_info(&dev->v4l2_dev, "firmware version 0x%x dated %s\n", | 159 | v4l2_info(&dev->v4l2_dev, "firmware version 0x%x dated %s\n", |
| 158 | dev->usbc_buf[1], &dev->usbc_buf[2]); | 160 | dev->fw_ver, &dev->usbc_buf[2]); |
| 161 | |||
| 162 | if (dev->fw_ver > 0x15) { | ||
| 163 | dev->options.brightness = 0x80; | ||
| 164 | dev->options.contrast = 0x40; | ||
| 165 | dev->options.hue = 0xf; | ||
| 166 | dev->options.saturation = 0x40; | ||
| 167 | dev->options.sharpness = 0x80; | ||
| 168 | } | ||
| 159 | 169 | ||
| 160 | switch (dev->usbc_buf[1]) { | 170 | switch (dev->fw_ver) { |
| 161 | case HDPVR_FIRMWARE_VERSION: | 171 | case HDPVR_FIRMWARE_VERSION: |
| 162 | dev->flags &= ~HDPVR_FLAG_AC3_CAP; | 172 | dev->flags &= ~HDPVR_FLAG_AC3_CAP; |
| 163 | break; | 173 | break; |
| @@ -169,7 +179,7 @@ static int device_authorization(struct hdpvr_device *dev) | |||
| 169 | default: | 179 | default: |
| 170 | v4l2_info(&dev->v4l2_dev, "untested firmware, the driver might" | 180 | v4l2_info(&dev->v4l2_dev, "untested firmware, the driver might" |
| 171 | " not work.\n"); | 181 | " not work.\n"); |
| 172 | if (dev->usbc_buf[1] >= HDPVR_FIRMWARE_VERSION_AC3) | 182 | if (dev->fw_ver >= HDPVR_FIRMWARE_VERSION_AC3) |
| 173 | dev->flags |= HDPVR_FLAG_AC3_CAP; | 183 | dev->flags |= HDPVR_FLAG_AC3_CAP; |
| 174 | else | 184 | else |
| 175 | dev->flags &= ~HDPVR_FLAG_AC3_CAP; | 185 | dev->flags &= ~HDPVR_FLAG_AC3_CAP; |
| @@ -270,6 +280,8 @@ static const struct hdpvr_options hdpvr_default_options = { | |||
| 270 | .bitrate_mode = HDPVR_CONSTANT, | 280 | .bitrate_mode = HDPVR_CONSTANT, |
| 271 | .gop_mode = HDPVR_SIMPLE_IDR_GOP, | 281 | .gop_mode = HDPVR_SIMPLE_IDR_GOP, |
| 272 | .audio_codec = V4L2_MPEG_AUDIO_ENCODING_AAC, | 282 | .audio_codec = V4L2_MPEG_AUDIO_ENCODING_AAC, |
| 283 | /* original picture controls for firmware version <= 0x15 */ | ||
| 284 | /* updated in device_authorization() for newer firmware */ | ||
| 273 | .brightness = 0x86, | 285 | .brightness = 0x86, |
| 274 | .contrast = 0x80, | 286 | .contrast = 0x80, |
| 275 | .hue = 0x80, | 287 | .hue = 0x80, |
diff --git a/drivers/media/video/hdpvr/hdpvr-video.c b/drivers/media/video/hdpvr/hdpvr-video.c index 087f7c08cb85..11ffe9cc1780 100644 --- a/drivers/media/video/hdpvr/hdpvr-video.c +++ b/drivers/media/video/hdpvr/hdpvr-video.c | |||
| @@ -283,12 +283,13 @@ static int hdpvr_start_streaming(struct hdpvr_device *dev) | |||
| 283 | 283 | ||
| 284 | hdpvr_config_call(dev, CTRL_START_STREAMING_VALUE, 0x00); | 284 | hdpvr_config_call(dev, CTRL_START_STREAMING_VALUE, 0x00); |
| 285 | 285 | ||
| 286 | dev->status = STATUS_STREAMING; | ||
| 287 | |||
| 286 | INIT_WORK(&dev->worker, hdpvr_transmit_buffers); | 288 | INIT_WORK(&dev->worker, hdpvr_transmit_buffers); |
| 287 | queue_work(dev->workqueue, &dev->worker); | 289 | queue_work(dev->workqueue, &dev->worker); |
| 288 | 290 | ||
| 289 | v4l2_dbg(MSG_BUFFER, hdpvr_debug, &dev->v4l2_dev, | 291 | v4l2_dbg(MSG_BUFFER, hdpvr_debug, &dev->v4l2_dev, |
| 290 | "streaming started\n"); | 292 | "streaming started\n"); |
| 291 | dev->status = STATUS_STREAMING; | ||
| 292 | 293 | ||
| 293 | return 0; | 294 | return 0; |
| 294 | } | 295 | } |
| @@ -722,21 +723,39 @@ static const s32 supported_v4l2_ctrls[] = { | |||
| 722 | }; | 723 | }; |
| 723 | 724 | ||
| 724 | static int fill_queryctrl(struct hdpvr_options *opt, struct v4l2_queryctrl *qc, | 725 | static int fill_queryctrl(struct hdpvr_options *opt, struct v4l2_queryctrl *qc, |
| 725 | int ac3) | 726 | int ac3, int fw_ver) |
| 726 | { | 727 | { |
| 727 | int err; | 728 | int err; |
| 728 | 729 | ||
| 730 | if (fw_ver > 0x15) { | ||
| 731 | switch (qc->id) { | ||
| 732 | case V4L2_CID_BRIGHTNESS: | ||
| 733 | return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x80); | ||
| 734 | case V4L2_CID_CONTRAST: | ||
| 735 | return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x40); | ||
| 736 | case V4L2_CID_SATURATION: | ||
| 737 | return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x40); | ||
| 738 | case V4L2_CID_HUE: | ||
| 739 | return v4l2_ctrl_query_fill(qc, 0x0, 0x1e, 1, 0xf); | ||
| 740 | case V4L2_CID_SHARPNESS: | ||
| 741 | return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x80); | ||
| 742 | } | ||
| 743 | } else { | ||
| 744 | switch (qc->id) { | ||
| 745 | case V4L2_CID_BRIGHTNESS: | ||
| 746 | return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x86); | ||
| 747 | case V4L2_CID_CONTRAST: | ||
| 748 | return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x80); | ||
| 749 | case V4L2_CID_SATURATION: | ||
| 750 | return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x80); | ||
| 751 | case V4L2_CID_HUE: | ||
| 752 | return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x80); | ||
| 753 | case V4L2_CID_SHARPNESS: | ||
| 754 | return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x80); | ||
| 755 | } | ||
| 756 | } | ||
| 757 | |||
| 729 | switch (qc->id) { | 758 | switch (qc->id) { |
| 730 | case V4L2_CID_BRIGHTNESS: | ||
| 731 | return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x86); | ||
| 732 | case V4L2_CID_CONTRAST: | ||
| 733 | return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x80); | ||
| 734 | case V4L2_CID_SATURATION: | ||
| 735 | return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x80); | ||
| 736 | case V4L2_CID_HUE: | ||
| 737 | return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x80); | ||
| 738 | case V4L2_CID_SHARPNESS: | ||
| 739 | return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x80); | ||
| 740 | case V4L2_CID_MPEG_AUDIO_ENCODING: | 759 | case V4L2_CID_MPEG_AUDIO_ENCODING: |
| 741 | return v4l2_ctrl_query_fill( | 760 | return v4l2_ctrl_query_fill( |
| 742 | qc, V4L2_MPEG_AUDIO_ENCODING_AAC, | 761 | qc, V4L2_MPEG_AUDIO_ENCODING_AAC, |
| @@ -794,7 +813,8 @@ static int vidioc_queryctrl(struct file *file, void *private_data, | |||
| 794 | 813 | ||
| 795 | if (qc->id == supported_v4l2_ctrls[i]) | 814 | if (qc->id == supported_v4l2_ctrls[i]) |
| 796 | return fill_queryctrl(&dev->options, qc, | 815 | return fill_queryctrl(&dev->options, qc, |
| 797 | dev->flags & HDPVR_FLAG_AC3_CAP); | 816 | dev->flags & HDPVR_FLAG_AC3_CAP, |
| 817 | dev->fw_ver); | ||
| 798 | 818 | ||
| 799 | if (qc->id < supported_v4l2_ctrls[i]) | 819 | if (qc->id < supported_v4l2_ctrls[i]) |
| 800 | break; | 820 | break; |
diff --git a/drivers/media/video/hdpvr/hdpvr.h b/drivers/media/video/hdpvr/hdpvr.h index d6439db1d18b..fea3c6926997 100644 --- a/drivers/media/video/hdpvr/hdpvr.h +++ b/drivers/media/video/hdpvr/hdpvr.h | |||
| @@ -113,6 +113,7 @@ struct hdpvr_device { | |||
| 113 | /* usb control transfer buffer and lock */ | 113 | /* usb control transfer buffer and lock */ |
| 114 | struct mutex usbc_mutex; | 114 | struct mutex usbc_mutex; |
| 115 | u8 *usbc_buf; | 115 | u8 *usbc_buf; |
| 116 | u8 fw_ver; | ||
| 116 | }; | 117 | }; |
| 117 | 118 | ||
| 118 | static inline struct hdpvr_device *to_hdpvr_dev(struct v4l2_device *v4l2_dev) | 119 | static inline struct hdpvr_device *to_hdpvr_dev(struct v4l2_device *v4l2_dev) |
diff --git a/drivers/media/video/omap3isp/ispccdc.c b/drivers/media/video/omap3isp/ispccdc.c index a74a79701d34..eaabc27f0fa2 100644 --- a/drivers/media/video/omap3isp/ispccdc.c +++ b/drivers/media/video/omap3isp/ispccdc.c | |||
| @@ -1407,7 +1407,7 @@ static int __ccdc_handle_stopping(struct isp_ccdc_device *ccdc, u32 event) | |||
| 1407 | static void ccdc_hs_vs_isr(struct isp_ccdc_device *ccdc) | 1407 | static void ccdc_hs_vs_isr(struct isp_ccdc_device *ccdc) |
| 1408 | { | 1408 | { |
| 1409 | struct isp_pipeline *pipe = to_isp_pipeline(&ccdc->subdev.entity); | 1409 | struct isp_pipeline *pipe = to_isp_pipeline(&ccdc->subdev.entity); |
| 1410 | struct video_device *vdev = &ccdc->subdev.devnode; | 1410 | struct video_device *vdev = ccdc->subdev.devnode; |
| 1411 | struct v4l2_event event; | 1411 | struct v4l2_event event; |
| 1412 | 1412 | ||
| 1413 | memset(&event, 0, sizeof(event)); | 1413 | memset(&event, 0, sizeof(event)); |
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig index cd13e9f2f5e6..f147395bac9a 100644 --- a/drivers/mfd/Kconfig +++ b/drivers/mfd/Kconfig | |||
| @@ -200,7 +200,7 @@ config MENELAUS | |||
| 200 | 200 | ||
| 201 | config TWL4030_CORE | 201 | config TWL4030_CORE |
| 202 | bool "Texas Instruments TWL4030/TWL5030/TWL6030/TPS659x0 Support" | 202 | bool "Texas Instruments TWL4030/TWL5030/TWL6030/TPS659x0 Support" |
| 203 | depends on I2C=y && GENERIC_HARDIRQS && IRQ_DOMAIN | 203 | depends on I2C=y && GENERIC_HARDIRQS |
| 204 | help | 204 | help |
| 205 | Say yes here if you have TWL4030 / TWL6030 family chip on your board. | 205 | Say yes here if you have TWL4030 / TWL6030 family chip on your board. |
| 206 | This core driver provides register access and IRQ handling | 206 | This core driver provides register access and IRQ handling |
diff --git a/drivers/mfd/twl-core.c b/drivers/mfd/twl-core.c index e04e04ddc15e..8ce3959c6919 100644 --- a/drivers/mfd/twl-core.c +++ b/drivers/mfd/twl-core.c | |||
| @@ -263,7 +263,9 @@ struct twl_client { | |||
| 263 | 263 | ||
| 264 | static struct twl_client twl_modules[TWL_NUM_SLAVES]; | 264 | static struct twl_client twl_modules[TWL_NUM_SLAVES]; |
| 265 | 265 | ||
| 266 | #ifdef CONFIG_IRQ_DOMAIN | ||
| 266 | static struct irq_domain domain; | 267 | static struct irq_domain domain; |
| 268 | #endif | ||
| 267 | 269 | ||
| 268 | /* mapping the module id to slave id and base address */ | 270 | /* mapping the module id to slave id and base address */ |
| 269 | struct twl_mapping { | 271 | struct twl_mapping { |
| @@ -1226,13 +1228,13 @@ twl_probe(struct i2c_client *client, const struct i2c_device_id *id) | |||
| 1226 | pdata->irq_base = status; | 1228 | pdata->irq_base = status; |
| 1227 | pdata->irq_end = pdata->irq_base + nr_irqs; | 1229 | pdata->irq_end = pdata->irq_base + nr_irqs; |
| 1228 | 1230 | ||
| 1231 | #ifdef CONFIG_IRQ_DOMAIN | ||
| 1229 | domain.irq_base = pdata->irq_base; | 1232 | domain.irq_base = pdata->irq_base; |
| 1230 | domain.nr_irq = nr_irqs; | 1233 | domain.nr_irq = nr_irqs; |
| 1231 | #ifdef CONFIG_OF_IRQ | ||
| 1232 | domain.of_node = of_node_get(node); | 1234 | domain.of_node = of_node_get(node); |
| 1233 | domain.ops = &irq_domain_simple_ops; | 1235 | domain.ops = &irq_domain_simple_ops; |
| 1234 | #endif | ||
| 1235 | irq_domain_add(&domain); | 1236 | irq_domain_add(&domain); |
| 1237 | #endif | ||
| 1236 | 1238 | ||
| 1237 | if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C) == 0) { | 1239 | if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C) == 0) { |
| 1238 | dev_dbg(&client->dev, "can't talk I2C?\n"); | 1240 | dev_dbg(&client->dev, "can't talk I2C?\n"); |
diff --git a/drivers/mfd/twl4030-power.c b/drivers/mfd/twl4030-power.c index d905f5171153..79ca33dfacca 100644 --- a/drivers/mfd/twl4030-power.c +++ b/drivers/mfd/twl4030-power.c | |||
| @@ -124,7 +124,7 @@ static u8 res_config_addrs[] = { | |||
| 124 | [RES_MAIN_REF] = 0x94, | 124 | [RES_MAIN_REF] = 0x94, |
| 125 | }; | 125 | }; |
| 126 | 126 | ||
| 127 | static int __init twl4030_write_script_byte(u8 address, u8 byte) | 127 | static int __devinit twl4030_write_script_byte(u8 address, u8 byte) |
| 128 | { | 128 | { |
| 129 | int err; | 129 | int err; |
| 130 | 130 | ||
| @@ -138,7 +138,7 @@ out: | |||
| 138 | return err; | 138 | return err; |
| 139 | } | 139 | } |
| 140 | 140 | ||
| 141 | static int __init twl4030_write_script_ins(u8 address, u16 pmb_message, | 141 | static int __devinit twl4030_write_script_ins(u8 address, u16 pmb_message, |
| 142 | u8 delay, u8 next) | 142 | u8 delay, u8 next) |
| 143 | { | 143 | { |
| 144 | int err; | 144 | int err; |
| @@ -158,7 +158,7 @@ out: | |||
| 158 | return err; | 158 | return err; |
| 159 | } | 159 | } |
| 160 | 160 | ||
| 161 | static int __init twl4030_write_script(u8 address, struct twl4030_ins *script, | 161 | static int __devinit twl4030_write_script(u8 address, struct twl4030_ins *script, |
| 162 | int len) | 162 | int len) |
| 163 | { | 163 | { |
| 164 | int err; | 164 | int err; |
| @@ -183,7 +183,7 @@ static int __init twl4030_write_script(u8 address, struct twl4030_ins *script, | |||
| 183 | return err; | 183 | return err; |
| 184 | } | 184 | } |
| 185 | 185 | ||
| 186 | static int __init twl4030_config_wakeup3_sequence(u8 address) | 186 | static int __devinit twl4030_config_wakeup3_sequence(u8 address) |
| 187 | { | 187 | { |
| 188 | int err; | 188 | int err; |
| 189 | u8 data; | 189 | u8 data; |
| @@ -208,7 +208,7 @@ out: | |||
| 208 | return err; | 208 | return err; |
| 209 | } | 209 | } |
| 210 | 210 | ||
| 211 | static int __init twl4030_config_wakeup12_sequence(u8 address) | 211 | static int __devinit twl4030_config_wakeup12_sequence(u8 address) |
| 212 | { | 212 | { |
| 213 | int err = 0; | 213 | int err = 0; |
| 214 | u8 data; | 214 | u8 data; |
| @@ -262,7 +262,7 @@ out: | |||
| 262 | return err; | 262 | return err; |
| 263 | } | 263 | } |
| 264 | 264 | ||
| 265 | static int __init twl4030_config_sleep_sequence(u8 address) | 265 | static int __devinit twl4030_config_sleep_sequence(u8 address) |
| 266 | { | 266 | { |
| 267 | int err; | 267 | int err; |
| 268 | 268 | ||
| @@ -276,7 +276,7 @@ static int __init twl4030_config_sleep_sequence(u8 address) | |||
| 276 | return err; | 276 | return err; |
| 277 | } | 277 | } |
| 278 | 278 | ||
| 279 | static int __init twl4030_config_warmreset_sequence(u8 address) | 279 | static int __devinit twl4030_config_warmreset_sequence(u8 address) |
| 280 | { | 280 | { |
| 281 | int err; | 281 | int err; |
| 282 | u8 rd_data; | 282 | u8 rd_data; |
| @@ -324,7 +324,7 @@ out: | |||
| 324 | return err; | 324 | return err; |
| 325 | } | 325 | } |
| 326 | 326 | ||
| 327 | static int __init twl4030_configure_resource(struct twl4030_resconfig *rconfig) | 327 | static int __devinit twl4030_configure_resource(struct twl4030_resconfig *rconfig) |
| 328 | { | 328 | { |
| 329 | int rconfig_addr; | 329 | int rconfig_addr; |
| 330 | int err; | 330 | int err; |
| @@ -416,7 +416,7 @@ static int __init twl4030_configure_resource(struct twl4030_resconfig *rconfig) | |||
| 416 | return 0; | 416 | return 0; |
| 417 | } | 417 | } |
| 418 | 418 | ||
| 419 | static int __init load_twl4030_script(struct twl4030_script *tscript, | 419 | static int __devinit load_twl4030_script(struct twl4030_script *tscript, |
| 420 | u8 address) | 420 | u8 address) |
| 421 | { | 421 | { |
| 422 | int err; | 422 | int err; |
| @@ -527,7 +527,7 @@ void twl4030_power_off(void) | |||
| 527 | pr_err("TWL4030 Unable to power off\n"); | 527 | pr_err("TWL4030 Unable to power off\n"); |
| 528 | } | 528 | } |
| 529 | 529 | ||
| 530 | void __init twl4030_power_init(struct twl4030_power_data *twl4030_scripts) | 530 | void __devinit twl4030_power_init(struct twl4030_power_data *twl4030_scripts) |
| 531 | { | 531 | { |
| 532 | int err = 0; | 532 | int err = 0; |
| 533 | int i; | 533 | int i; |
diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index 0cad48a284a8..c6a383d0244d 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c | |||
| @@ -1694,6 +1694,7 @@ static int mmc_add_disk(struct mmc_blk_data *md) | |||
| 1694 | 1694 | ||
| 1695 | md->power_ro_lock.show = power_ro_lock_show; | 1695 | md->power_ro_lock.show = power_ro_lock_show; |
| 1696 | md->power_ro_lock.store = power_ro_lock_store; | 1696 | md->power_ro_lock.store = power_ro_lock_store; |
| 1697 | sysfs_attr_init(&md->power_ro_lock.attr); | ||
| 1697 | md->power_ro_lock.attr.mode = mode; | 1698 | md->power_ro_lock.attr.mode = mode; |
| 1698 | md->power_ro_lock.attr.name = | 1699 | md->power_ro_lock.attr.name = |
| 1699 | "ro_lock_until_next_power_on"; | 1700 | "ro_lock_until_next_power_on"; |
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index f545a3e6eb80..690255c7d4dc 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c | |||
| @@ -290,8 +290,11 @@ static void mmc_wait_for_req_done(struct mmc_host *host, | |||
| 290 | static void mmc_pre_req(struct mmc_host *host, struct mmc_request *mrq, | 290 | static void mmc_pre_req(struct mmc_host *host, struct mmc_request *mrq, |
| 291 | bool is_first_req) | 291 | bool is_first_req) |
| 292 | { | 292 | { |
| 293 | if (host->ops->pre_req) | 293 | if (host->ops->pre_req) { |
| 294 | mmc_host_clk_hold(host); | ||
| 294 | host->ops->pre_req(host, mrq, is_first_req); | 295 | host->ops->pre_req(host, mrq, is_first_req); |
| 296 | mmc_host_clk_release(host); | ||
| 297 | } | ||
| 295 | } | 298 | } |
| 296 | 299 | ||
| 297 | /** | 300 | /** |
| @@ -306,8 +309,11 @@ static void mmc_pre_req(struct mmc_host *host, struct mmc_request *mrq, | |||
| 306 | static void mmc_post_req(struct mmc_host *host, struct mmc_request *mrq, | 309 | static void mmc_post_req(struct mmc_host *host, struct mmc_request *mrq, |
| 307 | int err) | 310 | int err) |
| 308 | { | 311 | { |
| 309 | if (host->ops->post_req) | 312 | if (host->ops->post_req) { |
| 313 | mmc_host_clk_hold(host); | ||
| 310 | host->ops->post_req(host, mrq, err); | 314 | host->ops->post_req(host, mrq, err); |
| 315 | mmc_host_clk_release(host); | ||
| 316 | } | ||
| 311 | } | 317 | } |
| 312 | 318 | ||
| 313 | /** | 319 | /** |
| @@ -620,7 +626,9 @@ int mmc_host_enable(struct mmc_host *host) | |||
| 620 | int err; | 626 | int err; |
| 621 | 627 | ||
| 622 | host->en_dis_recurs = 1; | 628 | host->en_dis_recurs = 1; |
| 629 | mmc_host_clk_hold(host); | ||
| 623 | err = host->ops->enable(host); | 630 | err = host->ops->enable(host); |
| 631 | mmc_host_clk_release(host); | ||
| 624 | host->en_dis_recurs = 0; | 632 | host->en_dis_recurs = 0; |
| 625 | 633 | ||
| 626 | if (err) { | 634 | if (err) { |
| @@ -640,7 +648,9 @@ static int mmc_host_do_disable(struct mmc_host *host, int lazy) | |||
| 640 | int err; | 648 | int err; |
| 641 | 649 | ||
| 642 | host->en_dis_recurs = 1; | 650 | host->en_dis_recurs = 1; |
| 651 | mmc_host_clk_hold(host); | ||
| 643 | err = host->ops->disable(host, lazy); | 652 | err = host->ops->disable(host, lazy); |
| 653 | mmc_host_clk_release(host); | ||
| 644 | host->en_dis_recurs = 0; | 654 | host->en_dis_recurs = 0; |
| 645 | 655 | ||
| 646 | if (err < 0) { | 656 | if (err < 0) { |
| @@ -1121,6 +1131,10 @@ int mmc_regulator_set_ocr(struct mmc_host *mmc, | |||
| 1121 | * might not allow this operation | 1131 | * might not allow this operation |
| 1122 | */ | 1132 | */ |
| 1123 | voltage = regulator_get_voltage(supply); | 1133 | voltage = regulator_get_voltage(supply); |
| 1134 | |||
| 1135 | if (mmc->caps2 & MMC_CAP2_BROKEN_VOLTAGE) | ||
| 1136 | min_uV = max_uV = voltage; | ||
| 1137 | |||
| 1124 | if (voltage < 0) | 1138 | if (voltage < 0) |
| 1125 | result = voltage; | 1139 | result = voltage; |
| 1126 | else if (voltage < min_uV || voltage > max_uV) | 1140 | else if (voltage < min_uV || voltage > max_uV) |
| @@ -1203,8 +1217,11 @@ int mmc_set_signal_voltage(struct mmc_host *host, int signal_voltage, bool cmd11 | |||
| 1203 | 1217 | ||
| 1204 | host->ios.signal_voltage = signal_voltage; | 1218 | host->ios.signal_voltage = signal_voltage; |
| 1205 | 1219 | ||
| 1206 | if (host->ops->start_signal_voltage_switch) | 1220 | if (host->ops->start_signal_voltage_switch) { |
| 1221 | mmc_host_clk_hold(host); | ||
| 1207 | err = host->ops->start_signal_voltage_switch(host, &host->ios); | 1222 | err = host->ops->start_signal_voltage_switch(host, &host->ios); |
| 1223 | mmc_host_clk_release(host); | ||
| 1224 | } | ||
| 1208 | 1225 | ||
| 1209 | return err; | 1226 | return err; |
| 1210 | } | 1227 | } |
| @@ -1239,6 +1256,7 @@ static void mmc_poweroff_notify(struct mmc_host *host) | |||
| 1239 | int err = 0; | 1256 | int err = 0; |
| 1240 | 1257 | ||
| 1241 | card = host->card; | 1258 | card = host->card; |
| 1259 | mmc_claim_host(host); | ||
| 1242 | 1260 | ||
| 1243 | /* | 1261 | /* |
| 1244 | * Send power notify command only if card | 1262 | * Send power notify command only if card |
| @@ -1269,6 +1287,7 @@ static void mmc_poweroff_notify(struct mmc_host *host) | |||
| 1269 | /* Set the card state to no notification after the poweroff */ | 1287 | /* Set the card state to no notification after the poweroff */ |
| 1270 | card->poweroff_notify_state = MMC_NO_POWER_NOTIFICATION; | 1288 | card->poweroff_notify_state = MMC_NO_POWER_NOTIFICATION; |
| 1271 | } | 1289 | } |
| 1290 | mmc_release_host(host); | ||
| 1272 | } | 1291 | } |
| 1273 | 1292 | ||
| 1274 | /* | 1293 | /* |
| @@ -1327,12 +1346,28 @@ static void mmc_power_up(struct mmc_host *host) | |||
| 1327 | 1346 | ||
| 1328 | void mmc_power_off(struct mmc_host *host) | 1347 | void mmc_power_off(struct mmc_host *host) |
| 1329 | { | 1348 | { |
| 1349 | int err = 0; | ||
| 1330 | mmc_host_clk_hold(host); | 1350 | mmc_host_clk_hold(host); |
| 1331 | 1351 | ||
| 1332 | host->ios.clock = 0; | 1352 | host->ios.clock = 0; |
| 1333 | host->ios.vdd = 0; | 1353 | host->ios.vdd = 0; |
| 1334 | 1354 | ||
| 1335 | mmc_poweroff_notify(host); | 1355 | /* |
| 1356 | * For eMMC 4.5 device send AWAKE command before | ||
| 1357 | * POWER_OFF_NOTIFY command, because in sleep state | ||
| 1358 | * eMMC 4.5 devices respond to only RESET and AWAKE cmd | ||
| 1359 | */ | ||
| 1360 | if (host->card && mmc_card_is_sleep(host->card) && | ||
| 1361 | host->bus_ops->resume) { | ||
| 1362 | err = host->bus_ops->resume(host); | ||
| 1363 | |||
| 1364 | if (!err) | ||
| 1365 | mmc_poweroff_notify(host); | ||
| 1366 | else | ||
| 1367 | pr_warning("%s: error %d during resume " | ||
| 1368 | "(continue with poweroff sequence)\n", | ||
| 1369 | mmc_hostname(host), err); | ||
| 1370 | } | ||
| 1336 | 1371 | ||
| 1337 | /* | 1372 | /* |
| 1338 | * Reset ocr mask to be the highest possible voltage supported for | 1373 | * Reset ocr mask to be the highest possible voltage supported for |
| @@ -2386,12 +2421,6 @@ int mmc_suspend_host(struct mmc_host *host) | |||
| 2386 | */ | 2421 | */ |
| 2387 | if (mmc_try_claim_host(host)) { | 2422 | if (mmc_try_claim_host(host)) { |
| 2388 | if (host->bus_ops->suspend) { | 2423 | if (host->bus_ops->suspend) { |
| 2389 | /* | ||
| 2390 | * For eMMC 4.5 device send notify command | ||
| 2391 | * before sleep, because in sleep state eMMC 4.5 | ||
| 2392 | * devices respond to only RESET and AWAKE cmd | ||
| 2393 | */ | ||
| 2394 | mmc_poweroff_notify(host); | ||
| 2395 | err = host->bus_ops->suspend(host); | 2424 | err = host->bus_ops->suspend(host); |
| 2396 | } | 2425 | } |
| 2397 | mmc_do_release_host(host); | 2426 | mmc_do_release_host(host); |
diff --git a/drivers/mmc/core/host.h b/drivers/mmc/core/host.h index fb8a5cd2e4a1..08a7852ade44 100644 --- a/drivers/mmc/core/host.h +++ b/drivers/mmc/core/host.h | |||
| @@ -14,27 +14,6 @@ | |||
| 14 | 14 | ||
| 15 | int mmc_register_host_class(void); | 15 | int mmc_register_host_class(void); |
| 16 | void mmc_unregister_host_class(void); | 16 | void mmc_unregister_host_class(void); |
| 17 | |||
| 18 | #ifdef CONFIG_MMC_CLKGATE | ||
| 19 | void mmc_host_clk_hold(struct mmc_host *host); | ||
| 20 | void mmc_host_clk_release(struct mmc_host *host); | ||
| 21 | unsigned int mmc_host_clk_rate(struct mmc_host *host); | ||
| 22 | |||
| 23 | #else | ||
| 24 | static inline void mmc_host_clk_hold(struct mmc_host *host) | ||
| 25 | { | ||
| 26 | } | ||
| 27 | |||
| 28 | static inline void mmc_host_clk_release(struct mmc_host *host) | ||
| 29 | { | ||
| 30 | } | ||
| 31 | |||
| 32 | static inline unsigned int mmc_host_clk_rate(struct mmc_host *host) | ||
| 33 | { | ||
| 34 | return host->ios.clock; | ||
| 35 | } | ||
| 36 | #endif | ||
| 37 | |||
| 38 | void mmc_host_deeper_disable(struct work_struct *work); | 17 | void mmc_host_deeper_disable(struct work_struct *work); |
| 39 | 18 | ||
| 40 | #endif | 19 | #endif |
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index 59b9ba52e66a..a48066344fa8 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c | |||
| @@ -376,7 +376,7 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd) | |||
| 376 | } | 376 | } |
| 377 | 377 | ||
| 378 | card->ext_csd.raw_hc_erase_gap_size = | 378 | card->ext_csd.raw_hc_erase_gap_size = |
| 379 | ext_csd[EXT_CSD_PARTITION_ATTRIBUTE]; | 379 | ext_csd[EXT_CSD_HC_WP_GRP_SIZE]; |
| 380 | card->ext_csd.raw_sec_trim_mult = | 380 | card->ext_csd.raw_sec_trim_mult = |
| 381 | ext_csd[EXT_CSD_SEC_TRIM_MULT]; | 381 | ext_csd[EXT_CSD_SEC_TRIM_MULT]; |
| 382 | card->ext_csd.raw_sec_erase_mult = | 382 | card->ext_csd.raw_sec_erase_mult = |
| @@ -551,7 +551,7 @@ static int mmc_compare_ext_csds(struct mmc_card *card, unsigned bus_width) | |||
| 551 | goto out; | 551 | goto out; |
| 552 | 552 | ||
| 553 | /* only compare read only fields */ | 553 | /* only compare read only fields */ |
| 554 | err = (!(card->ext_csd.raw_partition_support == | 554 | err = !((card->ext_csd.raw_partition_support == |
| 555 | bw_ext_csd[EXT_CSD_PARTITION_SUPPORT]) && | 555 | bw_ext_csd[EXT_CSD_PARTITION_SUPPORT]) && |
| 556 | (card->ext_csd.raw_erased_mem_count == | 556 | (card->ext_csd.raw_erased_mem_count == |
| 557 | bw_ext_csd[EXT_CSD_ERASED_MEM_CONT]) && | 557 | bw_ext_csd[EXT_CSD_ERASED_MEM_CONT]) && |
| @@ -1006,7 +1006,8 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, | |||
| 1006 | err = mmc_select_hs200(card); | 1006 | err = mmc_select_hs200(card); |
| 1007 | else if (host->caps & MMC_CAP_MMC_HIGHSPEED) | 1007 | else if (host->caps & MMC_CAP_MMC_HIGHSPEED) |
| 1008 | err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, | 1008 | err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, |
| 1009 | EXT_CSD_HS_TIMING, 1, 0); | 1009 | EXT_CSD_HS_TIMING, 1, |
| 1010 | card->ext_csd.generic_cmd6_time); | ||
| 1010 | 1011 | ||
| 1011 | if (err && err != -EBADMSG) | 1012 | if (err && err != -EBADMSG) |
| 1012 | goto free_card; | 1013 | goto free_card; |
| @@ -1116,7 +1117,7 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, | |||
| 1116 | * Activate wide bus and DDR (if supported). | 1117 | * Activate wide bus and DDR (if supported). |
| 1117 | */ | 1118 | */ |
| 1118 | if (!mmc_card_hs200(card) && | 1119 | if (!mmc_card_hs200(card) && |
| 1119 | (card->csd.mmca_vsn >= CSD_SPEC_VER_3) && | 1120 | (card->csd.mmca_vsn >= CSD_SPEC_VER_4) && |
| 1120 | (host->caps & (MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA))) { | 1121 | (host->caps & (MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA))) { |
| 1121 | static unsigned ext_csd_bits[][2] = { | 1122 | static unsigned ext_csd_bits[][2] = { |
| 1122 | { EXT_CSD_BUS_WIDTH_8, EXT_CSD_DDR_BUS_WIDTH_8 }, | 1123 | { EXT_CSD_BUS_WIDTH_8, EXT_CSD_DDR_BUS_WIDTH_8 }, |
| @@ -1315,11 +1316,13 @@ static int mmc_suspend(struct mmc_host *host) | |||
| 1315 | BUG_ON(!host->card); | 1316 | BUG_ON(!host->card); |
| 1316 | 1317 | ||
| 1317 | mmc_claim_host(host); | 1318 | mmc_claim_host(host); |
| 1318 | if (mmc_card_can_sleep(host)) | 1319 | if (mmc_card_can_sleep(host)) { |
| 1319 | err = mmc_card_sleep(host); | 1320 | err = mmc_card_sleep(host); |
| 1320 | else if (!mmc_host_is_spi(host)) | 1321 | if (!err) |
| 1322 | mmc_card_set_sleep(host->card); | ||
| 1323 | } else if (!mmc_host_is_spi(host)) | ||
| 1321 | mmc_deselect_cards(host); | 1324 | mmc_deselect_cards(host); |
| 1322 | host->card->state &= ~MMC_STATE_HIGHSPEED; | 1325 | host->card->state &= ~(MMC_STATE_HIGHSPEED | MMC_STATE_HIGHSPEED_200); |
| 1323 | mmc_release_host(host); | 1326 | mmc_release_host(host); |
| 1324 | 1327 | ||
| 1325 | return err; | 1328 | return err; |
| @@ -1339,7 +1342,11 @@ static int mmc_resume(struct mmc_host *host) | |||
| 1339 | BUG_ON(!host->card); | 1342 | BUG_ON(!host->card); |
| 1340 | 1343 | ||
| 1341 | mmc_claim_host(host); | 1344 | mmc_claim_host(host); |
| 1342 | err = mmc_init_card(host, host->ocr, host->card); | 1345 | if (mmc_card_is_sleep(host->card)) { |
| 1346 | err = mmc_card_awake(host); | ||
| 1347 | mmc_card_clr_sleep(host->card); | ||
| 1348 | } else | ||
| 1349 | err = mmc_init_card(host, host->ocr, host->card); | ||
| 1343 | mmc_release_host(host); | 1350 | mmc_release_host(host); |
| 1344 | 1351 | ||
| 1345 | return err; | 1352 | return err; |
| @@ -1349,7 +1356,8 @@ static int mmc_power_restore(struct mmc_host *host) | |||
| 1349 | { | 1356 | { |
| 1350 | int ret; | 1357 | int ret; |
| 1351 | 1358 | ||
| 1352 | host->card->state &= ~MMC_STATE_HIGHSPEED; | 1359 | host->card->state &= ~(MMC_STATE_HIGHSPEED | MMC_STATE_HIGHSPEED_200); |
| 1360 | mmc_card_clr_sleep(host->card); | ||
| 1353 | mmc_claim_host(host); | 1361 | mmc_claim_host(host); |
| 1354 | ret = mmc_init_card(host, host->ocr, host->card); | 1362 | ret = mmc_init_card(host, host->ocr, host->card); |
| 1355 | mmc_release_host(host); | 1363 | mmc_release_host(host); |
diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c index c63ad03c29c7..5017f9354ce2 100644 --- a/drivers/mmc/core/sd.c +++ b/drivers/mmc/core/sd.c | |||
| @@ -451,9 +451,11 @@ static int sd_select_driver_type(struct mmc_card *card, u8 *status) | |||
| 451 | * information and let the hardware specific code | 451 | * information and let the hardware specific code |
| 452 | * return what is possible given the options | 452 | * return what is possible given the options |
| 453 | */ | 453 | */ |
| 454 | mmc_host_clk_hold(card->host); | ||
| 454 | drive_strength = card->host->ops->select_drive_strength( | 455 | drive_strength = card->host->ops->select_drive_strength( |
| 455 | card->sw_caps.uhs_max_dtr, | 456 | card->sw_caps.uhs_max_dtr, |
| 456 | host_drv_type, card_drv_type); | 457 | host_drv_type, card_drv_type); |
| 458 | mmc_host_clk_release(card->host); | ||
| 457 | 459 | ||
| 458 | err = mmc_sd_switch(card, 1, 2, drive_strength, status); | 460 | err = mmc_sd_switch(card, 1, 2, drive_strength, status); |
| 459 | if (err) | 461 | if (err) |
| @@ -660,9 +662,12 @@ static int mmc_sd_init_uhs_card(struct mmc_card *card) | |||
| 660 | goto out; | 662 | goto out; |
| 661 | 663 | ||
| 662 | /* SPI mode doesn't define CMD19 */ | 664 | /* SPI mode doesn't define CMD19 */ |
| 663 | if (!mmc_host_is_spi(card->host) && card->host->ops->execute_tuning) | 665 | if (!mmc_host_is_spi(card->host) && card->host->ops->execute_tuning) { |
| 666 | mmc_host_clk_hold(card->host); | ||
| 664 | err = card->host->ops->execute_tuning(card->host, | 667 | err = card->host->ops->execute_tuning(card->host, |
| 665 | MMC_SEND_TUNING_BLOCK); | 668 | MMC_SEND_TUNING_BLOCK); |
| 669 | mmc_host_clk_release(card->host); | ||
| 670 | } | ||
| 666 | 671 | ||
| 667 | out: | 672 | out: |
| 668 | kfree(status); | 673 | kfree(status); |
| @@ -850,8 +855,11 @@ int mmc_sd_setup_card(struct mmc_host *host, struct mmc_card *card, | |||
| 850 | if (!reinit) { | 855 | if (!reinit) { |
| 851 | int ro = -1; | 856 | int ro = -1; |
| 852 | 857 | ||
| 853 | if (host->ops->get_ro) | 858 | if (host->ops->get_ro) { |
| 859 | mmc_host_clk_hold(card->host); | ||
| 854 | ro = host->ops->get_ro(host); | 860 | ro = host->ops->get_ro(host); |
| 861 | mmc_host_clk_release(card->host); | ||
| 862 | } | ||
| 855 | 863 | ||
| 856 | if (ro < 0) { | 864 | if (ro < 0) { |
| 857 | pr_warning("%s: host does not " | 865 | pr_warning("%s: host does not " |
| @@ -967,8 +975,11 @@ static int mmc_sd_init_card(struct mmc_host *host, u32 ocr, | |||
| 967 | * Since initialization is now complete, enable preset | 975 | * Since initialization is now complete, enable preset |
| 968 | * value registers for UHS-I cards. | 976 | * value registers for UHS-I cards. |
| 969 | */ | 977 | */ |
| 970 | if (host->ops->enable_preset_value) | 978 | if (host->ops->enable_preset_value) { |
| 979 | mmc_host_clk_hold(card->host); | ||
| 971 | host->ops->enable_preset_value(host, true); | 980 | host->ops->enable_preset_value(host, true); |
| 981 | mmc_host_clk_release(card->host); | ||
| 982 | } | ||
| 972 | } else { | 983 | } else { |
| 973 | /* | 984 | /* |
| 974 | * Attempt to change to high-speed (if supported) | 985 | * Attempt to change to high-speed (if supported) |
| @@ -1151,8 +1162,11 @@ int mmc_attach_sd(struct mmc_host *host) | |||
| 1151 | return err; | 1162 | return err; |
| 1152 | 1163 | ||
| 1153 | /* Disable preset value enable if already set since last time */ | 1164 | /* Disable preset value enable if already set since last time */ |
| 1154 | if (host->ops->enable_preset_value) | 1165 | if (host->ops->enable_preset_value) { |
| 1166 | mmc_host_clk_hold(host); | ||
| 1155 | host->ops->enable_preset_value(host, false); | 1167 | host->ops->enable_preset_value(host, false); |
| 1168 | mmc_host_clk_release(host); | ||
| 1169 | } | ||
| 1156 | 1170 | ||
| 1157 | err = mmc_send_app_op_cond(host, 0, &ocr); | 1171 | err = mmc_send_app_op_cond(host, 0, &ocr); |
| 1158 | if (err) | 1172 | if (err) |
diff --git a/drivers/mmc/core/sdio.c b/drivers/mmc/core/sdio.c index bd7bacc950dc..12cde6ee17f5 100644 --- a/drivers/mmc/core/sdio.c +++ b/drivers/mmc/core/sdio.c | |||
| @@ -98,10 +98,11 @@ fail: | |||
| 98 | return ret; | 98 | return ret; |
| 99 | } | 99 | } |
| 100 | 100 | ||
| 101 | static int sdio_read_cccr(struct mmc_card *card) | 101 | static int sdio_read_cccr(struct mmc_card *card, u32 ocr) |
| 102 | { | 102 | { |
| 103 | int ret; | 103 | int ret; |
| 104 | int cccr_vsn; | 104 | int cccr_vsn; |
| 105 | int uhs = ocr & R4_18V_PRESENT; | ||
| 105 | unsigned char data; | 106 | unsigned char data; |
| 106 | unsigned char speed; | 107 | unsigned char speed; |
| 107 | 108 | ||
| @@ -149,7 +150,7 @@ static int sdio_read_cccr(struct mmc_card *card) | |||
| 149 | card->scr.sda_spec3 = 0; | 150 | card->scr.sda_spec3 = 0; |
| 150 | card->sw_caps.sd3_bus_mode = 0; | 151 | card->sw_caps.sd3_bus_mode = 0; |
| 151 | card->sw_caps.sd3_drv_type = 0; | 152 | card->sw_caps.sd3_drv_type = 0; |
| 152 | if (cccr_vsn >= SDIO_CCCR_REV_3_00) { | 153 | if (cccr_vsn >= SDIO_CCCR_REV_3_00 && uhs) { |
| 153 | card->scr.sda_spec3 = 1; | 154 | card->scr.sda_spec3 = 1; |
| 154 | ret = mmc_io_rw_direct(card, 0, 0, | 155 | ret = mmc_io_rw_direct(card, 0, 0, |
| 155 | SDIO_CCCR_UHS, 0, &data); | 156 | SDIO_CCCR_UHS, 0, &data); |
| @@ -712,7 +713,7 @@ static int mmc_sdio_init_card(struct mmc_host *host, u32 ocr, | |||
| 712 | /* | 713 | /* |
| 713 | * Read the common registers. | 714 | * Read the common registers. |
| 714 | */ | 715 | */ |
| 715 | err = sdio_read_cccr(card); | 716 | err = sdio_read_cccr(card, ocr); |
| 716 | if (err) | 717 | if (err) |
| 717 | goto remove; | 718 | goto remove; |
| 718 | 719 | ||
diff --git a/drivers/mmc/core/sdio_irq.c b/drivers/mmc/core/sdio_irq.c index 68f81b9ee0fb..f573e7f9f740 100644 --- a/drivers/mmc/core/sdio_irq.c +++ b/drivers/mmc/core/sdio_irq.c | |||
| @@ -146,15 +146,21 @@ static int sdio_irq_thread(void *_host) | |||
| 146 | } | 146 | } |
| 147 | 147 | ||
| 148 | set_current_state(TASK_INTERRUPTIBLE); | 148 | set_current_state(TASK_INTERRUPTIBLE); |
| 149 | if (host->caps & MMC_CAP_SDIO_IRQ) | 149 | if (host->caps & MMC_CAP_SDIO_IRQ) { |
| 150 | mmc_host_clk_hold(host); | ||
| 150 | host->ops->enable_sdio_irq(host, 1); | 151 | host->ops->enable_sdio_irq(host, 1); |
| 152 | mmc_host_clk_release(host); | ||
| 153 | } | ||
| 151 | if (!kthread_should_stop()) | 154 | if (!kthread_should_stop()) |
| 152 | schedule_timeout(period); | 155 | schedule_timeout(period); |
| 153 | set_current_state(TASK_RUNNING); | 156 | set_current_state(TASK_RUNNING); |
| 154 | } while (!kthread_should_stop()); | 157 | } while (!kthread_should_stop()); |
| 155 | 158 | ||
| 156 | if (host->caps & MMC_CAP_SDIO_IRQ) | 159 | if (host->caps & MMC_CAP_SDIO_IRQ) { |
| 160 | mmc_host_clk_hold(host); | ||
| 157 | host->ops->enable_sdio_irq(host, 0); | 161 | host->ops->enable_sdio_irq(host, 0); |
| 162 | mmc_host_clk_release(host); | ||
| 163 | } | ||
| 158 | 164 | ||
| 159 | pr_debug("%s: IRQ thread exiting with code %d\n", | 165 | pr_debug("%s: IRQ thread exiting with code %d\n", |
| 160 | mmc_hostname(host), ret); | 166 | mmc_hostname(host), ret); |
diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c index fcfe1eb5acc8..6985cdb0bb26 100644 --- a/drivers/mmc/host/atmel-mci.c +++ b/drivers/mmc/host/atmel-mci.c | |||
| @@ -969,11 +969,14 @@ static void atmci_start_request(struct atmel_mci *host, | |||
| 969 | host->data_status = 0; | 969 | host->data_status = 0; |
| 970 | 970 | ||
| 971 | if (host->need_reset) { | 971 | if (host->need_reset) { |
| 972 | iflags = atmci_readl(host, ATMCI_IMR); | ||
| 973 | iflags &= (ATMCI_SDIOIRQA | ATMCI_SDIOIRQB); | ||
| 972 | atmci_writel(host, ATMCI_CR, ATMCI_CR_SWRST); | 974 | atmci_writel(host, ATMCI_CR, ATMCI_CR_SWRST); |
| 973 | atmci_writel(host, ATMCI_CR, ATMCI_CR_MCIEN); | 975 | atmci_writel(host, ATMCI_CR, ATMCI_CR_MCIEN); |
| 974 | atmci_writel(host, ATMCI_MR, host->mode_reg); | 976 | atmci_writel(host, ATMCI_MR, host->mode_reg); |
| 975 | if (host->caps.has_cfg_reg) | 977 | if (host->caps.has_cfg_reg) |
| 976 | atmci_writel(host, ATMCI_CFG, host->cfg_reg); | 978 | atmci_writel(host, ATMCI_CFG, host->cfg_reg); |
| 979 | atmci_writel(host, ATMCI_IER, iflags); | ||
| 977 | host->need_reset = false; | 980 | host->need_reset = false; |
| 978 | } | 981 | } |
| 979 | atmci_writel(host, ATMCI_SDCR, slot->sdc_reg); | 982 | atmci_writel(host, ATMCI_SDCR, slot->sdc_reg); |
diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c index 0e342793ff14..8bec1c36b159 100644 --- a/drivers/mmc/host/dw_mmc.c +++ b/drivers/mmc/host/dw_mmc.c | |||
| @@ -22,7 +22,6 @@ | |||
| 22 | #include <linux/ioport.h> | 22 | #include <linux/ioport.h> |
| 23 | #include <linux/module.h> | 23 | #include <linux/module.h> |
| 24 | #include <linux/platform_device.h> | 24 | #include <linux/platform_device.h> |
| 25 | #include <linux/scatterlist.h> | ||
| 26 | #include <linux/seq_file.h> | 25 | #include <linux/seq_file.h> |
| 27 | #include <linux/slab.h> | 26 | #include <linux/slab.h> |
| 28 | #include <linux/stat.h> | 27 | #include <linux/stat.h> |
| @@ -502,8 +501,14 @@ static void dw_mci_submit_data(struct dw_mci *host, struct mmc_data *data) | |||
| 502 | host->dir_status = DW_MCI_SEND_STATUS; | 501 | host->dir_status = DW_MCI_SEND_STATUS; |
| 503 | 502 | ||
| 504 | if (dw_mci_submit_data_dma(host, data)) { | 503 | if (dw_mci_submit_data_dma(host, data)) { |
| 504 | int flags = SG_MITER_ATOMIC; | ||
| 505 | if (host->data->flags & MMC_DATA_READ) | ||
| 506 | flags |= SG_MITER_TO_SG; | ||
| 507 | else | ||
| 508 | flags |= SG_MITER_FROM_SG; | ||
| 509 | |||
| 510 | sg_miter_start(&host->sg_miter, data->sg, data->sg_len, flags); | ||
| 505 | host->sg = data->sg; | 511 | host->sg = data->sg; |
| 506 | host->pio_offset = 0; | ||
| 507 | host->part_buf_start = 0; | 512 | host->part_buf_start = 0; |
| 508 | host->part_buf_count = 0; | 513 | host->part_buf_count = 0; |
| 509 | 514 | ||
| @@ -972,6 +977,7 @@ static void dw_mci_tasklet_func(unsigned long priv) | |||
| 972 | * generates a block interrupt, hence setting | 977 | * generates a block interrupt, hence setting |
| 973 | * the scatter-gather pointer to NULL. | 978 | * the scatter-gather pointer to NULL. |
| 974 | */ | 979 | */ |
| 980 | sg_miter_stop(&host->sg_miter); | ||
| 975 | host->sg = NULL; | 981 | host->sg = NULL; |
| 976 | ctrl = mci_readl(host, CTRL); | 982 | ctrl = mci_readl(host, CTRL); |
| 977 | ctrl |= SDMMC_CTRL_FIFO_RESET; | 983 | ctrl |= SDMMC_CTRL_FIFO_RESET; |
| @@ -1311,54 +1317,44 @@ static void dw_mci_pull_data(struct dw_mci *host, void *buf, int cnt) | |||
| 1311 | 1317 | ||
| 1312 | static void dw_mci_read_data_pio(struct dw_mci *host) | 1318 | static void dw_mci_read_data_pio(struct dw_mci *host) |
| 1313 | { | 1319 | { |
| 1314 | struct scatterlist *sg = host->sg; | 1320 | struct sg_mapping_iter *sg_miter = &host->sg_miter; |
| 1315 | void *buf = sg_virt(sg); | 1321 | void *buf; |
| 1316 | unsigned int offset = host->pio_offset; | 1322 | unsigned int offset; |
| 1317 | struct mmc_data *data = host->data; | 1323 | struct mmc_data *data = host->data; |
| 1318 | int shift = host->data_shift; | 1324 | int shift = host->data_shift; |
| 1319 | u32 status; | 1325 | u32 status; |
| 1320 | unsigned int nbytes = 0, len; | 1326 | unsigned int nbytes = 0, len; |
| 1327 | unsigned int remain, fcnt; | ||
| 1321 | 1328 | ||
| 1322 | do { | 1329 | do { |
| 1323 | len = host->part_buf_count + | 1330 | if (!sg_miter_next(sg_miter)) |
| 1324 | (SDMMC_GET_FCNT(mci_readl(host, STATUS)) << shift); | 1331 | goto done; |
| 1325 | if (offset + len <= sg->length) { | 1332 | |
| 1333 | host->sg = sg_miter->__sg; | ||
| 1334 | buf = sg_miter->addr; | ||
| 1335 | remain = sg_miter->length; | ||
| 1336 | offset = 0; | ||
| 1337 | |||
| 1338 | do { | ||
| 1339 | fcnt = (SDMMC_GET_FCNT(mci_readl(host, STATUS)) | ||
| 1340 | << shift) + host->part_buf_count; | ||
| 1341 | len = min(remain, fcnt); | ||
| 1342 | if (!len) | ||
| 1343 | break; | ||
| 1326 | dw_mci_pull_data(host, (void *)(buf + offset), len); | 1344 | dw_mci_pull_data(host, (void *)(buf + offset), len); |
| 1327 | |||
| 1328 | offset += len; | 1345 | offset += len; |
| 1329 | nbytes += len; | 1346 | nbytes += len; |
| 1330 | 1347 | remain -= len; | |
| 1331 | if (offset == sg->length) { | 1348 | } while (remain); |
| 1332 | flush_dcache_page(sg_page(sg)); | 1349 | sg_miter->consumed = offset; |
| 1333 | host->sg = sg = sg_next(sg); | ||
| 1334 | if (!sg) | ||
| 1335 | goto done; | ||
| 1336 | |||
| 1337 | offset = 0; | ||
| 1338 | buf = sg_virt(sg); | ||
| 1339 | } | ||
| 1340 | } else { | ||
| 1341 | unsigned int remaining = sg->length - offset; | ||
| 1342 | dw_mci_pull_data(host, (void *)(buf + offset), | ||
| 1343 | remaining); | ||
| 1344 | nbytes += remaining; | ||
| 1345 | |||
| 1346 | flush_dcache_page(sg_page(sg)); | ||
| 1347 | host->sg = sg = sg_next(sg); | ||
| 1348 | if (!sg) | ||
| 1349 | goto done; | ||
| 1350 | |||
| 1351 | offset = len - remaining; | ||
| 1352 | buf = sg_virt(sg); | ||
| 1353 | dw_mci_pull_data(host, buf, offset); | ||
| 1354 | nbytes += offset; | ||
| 1355 | } | ||
| 1356 | 1350 | ||
| 1357 | status = mci_readl(host, MINTSTS); | 1351 | status = mci_readl(host, MINTSTS); |
| 1358 | mci_writel(host, RINTSTS, SDMMC_INT_RXDR); | 1352 | mci_writel(host, RINTSTS, SDMMC_INT_RXDR); |
| 1359 | if (status & DW_MCI_DATA_ERROR_FLAGS) { | 1353 | if (status & DW_MCI_DATA_ERROR_FLAGS) { |
| 1360 | host->data_status = status; | 1354 | host->data_status = status; |
| 1361 | data->bytes_xfered += nbytes; | 1355 | data->bytes_xfered += nbytes; |
| 1356 | sg_miter_stop(sg_miter); | ||
| 1357 | host->sg = NULL; | ||
| 1362 | smp_wmb(); | 1358 | smp_wmb(); |
| 1363 | 1359 | ||
| 1364 | set_bit(EVENT_DATA_ERROR, &host->pending_events); | 1360 | set_bit(EVENT_DATA_ERROR, &host->pending_events); |
| @@ -1367,65 +1363,66 @@ static void dw_mci_read_data_pio(struct dw_mci *host) | |||
| 1367 | return; | 1363 | return; |
| 1368 | } | 1364 | } |
| 1369 | } while (status & SDMMC_INT_RXDR); /*if the RXDR is ready read again*/ | 1365 | } while (status & SDMMC_INT_RXDR); /*if the RXDR is ready read again*/ |
| 1370 | host->pio_offset = offset; | ||
| 1371 | data->bytes_xfered += nbytes; | 1366 | data->bytes_xfered += nbytes; |
| 1367 | |||
| 1368 | if (!remain) { | ||
| 1369 | if (!sg_miter_next(sg_miter)) | ||
| 1370 | goto done; | ||
| 1371 | sg_miter->consumed = 0; | ||
| 1372 | } | ||
| 1373 | sg_miter_stop(sg_miter); | ||
| 1372 | return; | 1374 | return; |
| 1373 | 1375 | ||
| 1374 | done: | 1376 | done: |
| 1375 | data->bytes_xfered += nbytes; | 1377 | data->bytes_xfered += nbytes; |
| 1378 | sg_miter_stop(sg_miter); | ||
| 1379 | host->sg = NULL; | ||
| 1376 | smp_wmb(); | 1380 | smp_wmb(); |
| 1377 | set_bit(EVENT_XFER_COMPLETE, &host->pending_events); | 1381 | set_bit(EVENT_XFER_COMPLETE, &host->pending_events); |
| 1378 | } | 1382 | } |
| 1379 | 1383 | ||
| 1380 | static void dw_mci_write_data_pio(struct dw_mci *host) | 1384 | static void dw_mci_write_data_pio(struct dw_mci *host) |
| 1381 | { | 1385 | { |
| 1382 | struct scatterlist *sg = host->sg; | 1386 | struct sg_mapping_iter *sg_miter = &host->sg_miter; |
| 1383 | void *buf = sg_virt(sg); | 1387 | void *buf; |
| 1384 | unsigned int offset = host->pio_offset; | 1388 | unsigned int offset; |
| 1385 | struct mmc_data *data = host->data; | 1389 | struct mmc_data *data = host->data; |
| 1386 | int shift = host->data_shift; | 1390 | int shift = host->data_shift; |
| 1387 | u32 status; | 1391 | u32 status; |
| 1388 | unsigned int nbytes = 0, len; | 1392 | unsigned int nbytes = 0, len; |
| 1393 | unsigned int fifo_depth = host->fifo_depth; | ||
| 1394 | unsigned int remain, fcnt; | ||
| 1389 | 1395 | ||
| 1390 | do { | 1396 | do { |
| 1391 | len = ((host->fifo_depth - | 1397 | if (!sg_miter_next(sg_miter)) |
| 1392 | SDMMC_GET_FCNT(mci_readl(host, STATUS))) << shift) | 1398 | goto done; |
| 1393 | - host->part_buf_count; | 1399 | |
| 1394 | if (offset + len <= sg->length) { | 1400 | host->sg = sg_miter->__sg; |
| 1401 | buf = sg_miter->addr; | ||
| 1402 | remain = sg_miter->length; | ||
| 1403 | offset = 0; | ||
| 1404 | |||
| 1405 | do { | ||
| 1406 | fcnt = ((fifo_depth - | ||
| 1407 | SDMMC_GET_FCNT(mci_readl(host, STATUS))) | ||
| 1408 | << shift) - host->part_buf_count; | ||
| 1409 | len = min(remain, fcnt); | ||
| 1410 | if (!len) | ||
| 1411 | break; | ||
| 1395 | host->push_data(host, (void *)(buf + offset), len); | 1412 | host->push_data(host, (void *)(buf + offset), len); |
| 1396 | |||
| 1397 | offset += len; | 1413 | offset += len; |
| 1398 | nbytes += len; | 1414 | nbytes += len; |
| 1399 | if (offset == sg->length) { | 1415 | remain -= len; |
| 1400 | host->sg = sg = sg_next(sg); | 1416 | } while (remain); |
| 1401 | if (!sg) | 1417 | sg_miter->consumed = offset; |
| 1402 | goto done; | ||
| 1403 | |||
| 1404 | offset = 0; | ||
| 1405 | buf = sg_virt(sg); | ||
| 1406 | } | ||
| 1407 | } else { | ||
| 1408 | unsigned int remaining = sg->length - offset; | ||
| 1409 | |||
| 1410 | host->push_data(host, (void *)(buf + offset), | ||
| 1411 | remaining); | ||
| 1412 | nbytes += remaining; | ||
| 1413 | |||
| 1414 | host->sg = sg = sg_next(sg); | ||
| 1415 | if (!sg) | ||
| 1416 | goto done; | ||
| 1417 | |||
| 1418 | offset = len - remaining; | ||
| 1419 | buf = sg_virt(sg); | ||
| 1420 | host->push_data(host, (void *)buf, offset); | ||
| 1421 | nbytes += offset; | ||
| 1422 | } | ||
| 1423 | 1418 | ||
| 1424 | status = mci_readl(host, MINTSTS); | 1419 | status = mci_readl(host, MINTSTS); |
| 1425 | mci_writel(host, RINTSTS, SDMMC_INT_TXDR); | 1420 | mci_writel(host, RINTSTS, SDMMC_INT_TXDR); |
| 1426 | if (status & DW_MCI_DATA_ERROR_FLAGS) { | 1421 | if (status & DW_MCI_DATA_ERROR_FLAGS) { |
| 1427 | host->data_status = status; | 1422 | host->data_status = status; |
| 1428 | data->bytes_xfered += nbytes; | 1423 | data->bytes_xfered += nbytes; |
| 1424 | sg_miter_stop(sg_miter); | ||
| 1425 | host->sg = NULL; | ||
| 1429 | 1426 | ||
| 1430 | smp_wmb(); | 1427 | smp_wmb(); |
| 1431 | 1428 | ||
| @@ -1435,12 +1432,20 @@ static void dw_mci_write_data_pio(struct dw_mci *host) | |||
| 1435 | return; | 1432 | return; |
| 1436 | } | 1433 | } |
| 1437 | } while (status & SDMMC_INT_TXDR); /* if TXDR write again */ | 1434 | } while (status & SDMMC_INT_TXDR); /* if TXDR write again */ |
| 1438 | host->pio_offset = offset; | ||
| 1439 | data->bytes_xfered += nbytes; | 1435 | data->bytes_xfered += nbytes; |
| 1436 | |||
| 1437 | if (!remain) { | ||
| 1438 | if (!sg_miter_next(sg_miter)) | ||
| 1439 | goto done; | ||
| 1440 | sg_miter->consumed = 0; | ||
| 1441 | } | ||
| 1442 | sg_miter_stop(sg_miter); | ||
| 1440 | return; | 1443 | return; |
| 1441 | 1444 | ||
| 1442 | done: | 1445 | done: |
| 1443 | data->bytes_xfered += nbytes; | 1446 | data->bytes_xfered += nbytes; |
| 1447 | sg_miter_stop(sg_miter); | ||
| 1448 | host->sg = NULL; | ||
| 1444 | smp_wmb(); | 1449 | smp_wmb(); |
| 1445 | set_bit(EVENT_XFER_COMPLETE, &host->pending_events); | 1450 | set_bit(EVENT_XFER_COMPLETE, &host->pending_events); |
| 1446 | } | 1451 | } |
| @@ -1643,6 +1648,7 @@ static void dw_mci_work_routine_card(struct work_struct *work) | |||
| 1643 | * block interrupt, hence setting the | 1648 | * block interrupt, hence setting the |
| 1644 | * scatter-gather pointer to NULL. | 1649 | * scatter-gather pointer to NULL. |
| 1645 | */ | 1650 | */ |
| 1651 | sg_miter_stop(&host->sg_miter); | ||
| 1646 | host->sg = NULL; | 1652 | host->sg = NULL; |
| 1647 | 1653 | ||
| 1648 | ctrl = mci_readl(host, CTRL); | 1654 | ctrl = mci_readl(host, CTRL); |
diff --git a/drivers/mmc/host/of_mmc_spi.c b/drivers/mmc/host/of_mmc_spi.c index ab66f2454dc4..1534b582c419 100644 --- a/drivers/mmc/host/of_mmc_spi.c +++ b/drivers/mmc/host/of_mmc_spi.c | |||
| @@ -113,8 +113,8 @@ struct mmc_spi_platform_data *mmc_spi_get_pdata(struct spi_device *spi) | |||
| 113 | const int j = i * 2; | 113 | const int j = i * 2; |
| 114 | u32 mask; | 114 | u32 mask; |
| 115 | 115 | ||
| 116 | mask = mmc_vddrange_to_ocrmask(voltage_ranges[j], | 116 | mask = mmc_vddrange_to_ocrmask(be32_to_cpu(voltage_ranges[j]), |
| 117 | voltage_ranges[j + 1]); | 117 | be32_to_cpu(voltage_ranges[j + 1])); |
| 118 | if (!mask) { | 118 | if (!mask) { |
| 119 | ret = -EINVAL; | 119 | ret = -EINVAL; |
| 120 | dev_err(dev, "OF: voltage-range #%d is invalid\n", i); | 120 | dev_err(dev, "OF: voltage-range #%d is invalid\n", i); |
diff --git a/drivers/mmc/host/sdhci-of-esdhc.c b/drivers/mmc/host/sdhci-of-esdhc.c index ff4adc018041..5d876ff86f37 100644 --- a/drivers/mmc/host/sdhci-of-esdhc.c +++ b/drivers/mmc/host/sdhci-of-esdhc.c | |||
| @@ -38,6 +38,23 @@ static u8 esdhc_readb(struct sdhci_host *host, int reg) | |||
| 38 | int base = reg & ~0x3; | 38 | int base = reg & ~0x3; |
| 39 | int shift = (reg & 0x3) * 8; | 39 | int shift = (reg & 0x3) * 8; |
| 40 | u8 ret = (in_be32(host->ioaddr + base) >> shift) & 0xff; | 40 | u8 ret = (in_be32(host->ioaddr + base) >> shift) & 0xff; |
| 41 | |||
| 42 | /* | ||
| 43 | * "DMA select" locates at offset 0x28 in SD specification, but on | ||
| 44 | * P5020 or P3041, it locates at 0x29. | ||
| 45 | */ | ||
| 46 | if (reg == SDHCI_HOST_CONTROL) { | ||
| 47 | u32 dma_bits; | ||
| 48 | |||
| 49 | dma_bits = in_be32(host->ioaddr + reg); | ||
| 50 | /* DMA select is 22,23 bits in Protocol Control Register */ | ||
| 51 | dma_bits = (dma_bits >> 5) & SDHCI_CTRL_DMA_MASK; | ||
| 52 | |||
| 53 | /* fixup the result */ | ||
| 54 | ret &= ~SDHCI_CTRL_DMA_MASK; | ||
| 55 | ret |= dma_bits; | ||
| 56 | } | ||
| 57 | |||
| 41 | return ret; | 58 | return ret; |
| 42 | } | 59 | } |
| 43 | 60 | ||
| @@ -56,6 +73,21 @@ static void esdhc_writew(struct sdhci_host *host, u16 val, int reg) | |||
| 56 | 73 | ||
| 57 | static void esdhc_writeb(struct sdhci_host *host, u8 val, int reg) | 74 | static void esdhc_writeb(struct sdhci_host *host, u8 val, int reg) |
| 58 | { | 75 | { |
| 76 | /* | ||
| 77 | * "DMA select" location is offset 0x28 in SD specification, but on | ||
| 78 | * P5020 or P3041, it's located at 0x29. | ||
| 79 | */ | ||
| 80 | if (reg == SDHCI_HOST_CONTROL) { | ||
| 81 | u32 dma_bits; | ||
| 82 | |||
| 83 | /* DMA select is 22,23 bits in Protocol Control Register */ | ||
| 84 | dma_bits = (val & SDHCI_CTRL_DMA_MASK) << 5; | ||
| 85 | clrsetbits_be32(host->ioaddr + reg , SDHCI_CTRL_DMA_MASK << 5, | ||
| 86 | dma_bits); | ||
| 87 | val &= ~SDHCI_CTRL_DMA_MASK; | ||
| 88 | val |= in_be32(host->ioaddr + reg) & SDHCI_CTRL_DMA_MASK; | ||
| 89 | } | ||
| 90 | |||
| 59 | /* Prevent SDHCI core from writing reserved bits (e.g. HISPD). */ | 91 | /* Prevent SDHCI core from writing reserved bits (e.g. HISPD). */ |
| 60 | if (reg == SDHCI_HOST_CONTROL) | 92 | if (reg == SDHCI_HOST_CONTROL) |
| 61 | val &= ~ESDHC_HOST_CONTROL_RES; | 93 | val &= ~ESDHC_HOST_CONTROL_RES; |
diff --git a/drivers/mmc/host/sdhci-pci.c b/drivers/mmc/host/sdhci-pci.c index 7165e6a09274..6ebdc4010e7c 100644 --- a/drivers/mmc/host/sdhci-pci.c +++ b/drivers/mmc/host/sdhci-pci.c | |||
| @@ -250,7 +250,7 @@ static int mfd_emmc_probe_slot(struct sdhci_pci_slot *slot) | |||
| 250 | 250 | ||
| 251 | static int mfd_sdio_probe_slot(struct sdhci_pci_slot *slot) | 251 | static int mfd_sdio_probe_slot(struct sdhci_pci_slot *slot) |
| 252 | { | 252 | { |
| 253 | slot->host->mmc->caps |= MMC_CAP_POWER_OFF_CARD; | 253 | slot->host->mmc->caps |= MMC_CAP_POWER_OFF_CARD | MMC_CAP_NONREMOVABLE; |
| 254 | return 0; | 254 | return 0; |
| 255 | } | 255 | } |
| 256 | 256 | ||
diff --git a/drivers/mmc/host/sdhci-pltfm.c b/drivers/mmc/host/sdhci-pltfm.c index 03970bcb3495..c5c2a48bdd94 100644 --- a/drivers/mmc/host/sdhci-pltfm.c +++ b/drivers/mmc/host/sdhci-pltfm.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * sdhci-pltfm.c Support for SDHCI platform devices | 2 | * sdhci-pltfm.c Support for SDHCI platform devices |
| 3 | * Copyright (c) 2009 Intel Corporation | 3 | * Copyright (c) 2009 Intel Corporation |
| 4 | * | 4 | * |
| 5 | * Copyright (c) 2007 Freescale Semiconductor, Inc. | 5 | * Copyright (c) 2007, 2011 Freescale Semiconductor, Inc. |
| 6 | * Copyright (c) 2009 MontaVista Software, Inc. | 6 | * Copyright (c) 2009 MontaVista Software, Inc. |
| 7 | * | 7 | * |
| 8 | * Authors: Xiaobo Xie <X.Xie@freescale.com> | 8 | * Authors: Xiaobo Xie <X.Xie@freescale.com> |
| @@ -71,6 +71,14 @@ void sdhci_get_of_property(struct platform_device *pdev) | |||
| 71 | if (sdhci_of_wp_inverted(np)) | 71 | if (sdhci_of_wp_inverted(np)) |
| 72 | host->quirks |= SDHCI_QUIRK_INVERTED_WRITE_PROTECT; | 72 | host->quirks |= SDHCI_QUIRK_INVERTED_WRITE_PROTECT; |
| 73 | 73 | ||
| 74 | if (of_device_is_compatible(np, "fsl,p2020-rev1-esdhc")) | ||
| 75 | host->quirks |= SDHCI_QUIRK_BROKEN_DMA; | ||
| 76 | |||
| 77 | if (of_device_is_compatible(np, "fsl,p2020-esdhc") || | ||
| 78 | of_device_is_compatible(np, "fsl,p1010-esdhc") || | ||
| 79 | of_device_is_compatible(np, "fsl,mpc8536-esdhc")) | ||
| 80 | host->quirks |= SDHCI_QUIRK_BROKEN_TIMEOUT_VAL; | ||
| 81 | |||
| 74 | clk = of_get_property(np, "clock-frequency", &size); | 82 | clk = of_get_property(np, "clock-frequency", &size); |
| 75 | if (clk && size == sizeof(*clk) && *clk) | 83 | if (clk && size == sizeof(*clk) && *clk) |
| 76 | pltfm_host->clock = be32_to_cpup(clk); | 84 | pltfm_host->clock = be32_to_cpup(clk); |
diff --git a/drivers/mmc/host/sh_mmcif.c b/drivers/mmc/host/sh_mmcif.c index f5d8b53be333..352d4797865b 100644 --- a/drivers/mmc/host/sh_mmcif.c +++ b/drivers/mmc/host/sh_mmcif.c | |||
| @@ -1327,7 +1327,7 @@ static int __devinit sh_mmcif_probe(struct platform_device *pdev) | |||
| 1327 | if (ret < 0) | 1327 | if (ret < 0) |
| 1328 | goto clean_up2; | 1328 | goto clean_up2; |
| 1329 | 1329 | ||
| 1330 | mmc_add_host(mmc); | 1330 | INIT_DELAYED_WORK(&host->timeout_work, mmcif_timeout_work); |
| 1331 | 1331 | ||
| 1332 | sh_mmcif_writel(host->addr, MMCIF_CE_INT_MASK, MASK_ALL); | 1332 | sh_mmcif_writel(host->addr, MMCIF_CE_INT_MASK, MASK_ALL); |
| 1333 | 1333 | ||
| @@ -1338,22 +1338,24 @@ static int __devinit sh_mmcif_probe(struct platform_device *pdev) | |||
| 1338 | } | 1338 | } |
| 1339 | ret = request_threaded_irq(irq[1], sh_mmcif_intr, sh_mmcif_irqt, 0, "sh_mmc:int", host); | 1339 | ret = request_threaded_irq(irq[1], sh_mmcif_intr, sh_mmcif_irqt, 0, "sh_mmc:int", host); |
| 1340 | if (ret) { | 1340 | if (ret) { |
| 1341 | free_irq(irq[0], host); | ||
| 1342 | dev_err(&pdev->dev, "request_irq error (sh_mmc:int)\n"); | 1341 | dev_err(&pdev->dev, "request_irq error (sh_mmc:int)\n"); |
| 1343 | goto clean_up3; | 1342 | goto clean_up4; |
| 1344 | } | 1343 | } |
| 1345 | 1344 | ||
| 1346 | INIT_DELAYED_WORK(&host->timeout_work, mmcif_timeout_work); | 1345 | ret = mmc_add_host(mmc); |
| 1347 | 1346 | if (ret < 0) | |
| 1348 | mmc_detect_change(host->mmc, 0); | 1347 | goto clean_up5; |
| 1349 | 1348 | ||
| 1350 | dev_info(&pdev->dev, "driver version %s\n", DRIVER_VERSION); | 1349 | dev_info(&pdev->dev, "driver version %s\n", DRIVER_VERSION); |
| 1351 | dev_dbg(&pdev->dev, "chip ver H'%04x\n", | 1350 | dev_dbg(&pdev->dev, "chip ver H'%04x\n", |
| 1352 | sh_mmcif_readl(host->addr, MMCIF_CE_VERSION) & 0x0000ffff); | 1351 | sh_mmcif_readl(host->addr, MMCIF_CE_VERSION) & 0x0000ffff); |
| 1353 | return ret; | 1352 | return ret; |
| 1354 | 1353 | ||
| 1354 | clean_up5: | ||
| 1355 | free_irq(irq[1], host); | ||
| 1356 | clean_up4: | ||
| 1357 | free_irq(irq[0], host); | ||
| 1355 | clean_up3: | 1358 | clean_up3: |
| 1356 | mmc_remove_host(mmc); | ||
| 1357 | pm_runtime_suspend(&pdev->dev); | 1359 | pm_runtime_suspend(&pdev->dev); |
| 1358 | clean_up2: | 1360 | clean_up2: |
| 1359 | pm_runtime_disable(&pdev->dev); | 1361 | pm_runtime_disable(&pdev->dev); |
diff --git a/drivers/mmc/host/tmio_mmc.h b/drivers/mmc/host/tmio_mmc.h index a95e6d901726..f96c536d130a 100644 --- a/drivers/mmc/host/tmio_mmc.h +++ b/drivers/mmc/host/tmio_mmc.h | |||
| @@ -20,8 +20,8 @@ | |||
| 20 | #include <linux/mmc/tmio.h> | 20 | #include <linux/mmc/tmio.h> |
| 21 | #include <linux/mutex.h> | 21 | #include <linux/mutex.h> |
| 22 | #include <linux/pagemap.h> | 22 | #include <linux/pagemap.h> |
| 23 | #include <linux/spinlock.h> | ||
| 24 | #include <linux/scatterlist.h> | 23 | #include <linux/scatterlist.h> |
| 24 | #include <linux/spinlock.h> | ||
| 25 | 25 | ||
| 26 | /* Definitions for values the CTRL_SDIO_STATUS register can take. */ | 26 | /* Definitions for values the CTRL_SDIO_STATUS register can take. */ |
| 27 | #define TMIO_SDIO_STAT_IOIRQ 0x0001 | 27 | #define TMIO_SDIO_STAT_IOIRQ 0x0001 |
| @@ -120,6 +120,7 @@ void tmio_mmc_start_dma(struct tmio_mmc_host *host, struct mmc_data *data); | |||
| 120 | void tmio_mmc_enable_dma(struct tmio_mmc_host *host, bool enable); | 120 | void tmio_mmc_enable_dma(struct tmio_mmc_host *host, bool enable); |
| 121 | void tmio_mmc_request_dma(struct tmio_mmc_host *host, struct tmio_mmc_data *pdata); | 121 | void tmio_mmc_request_dma(struct tmio_mmc_host *host, struct tmio_mmc_data *pdata); |
| 122 | void tmio_mmc_release_dma(struct tmio_mmc_host *host); | 122 | void tmio_mmc_release_dma(struct tmio_mmc_host *host); |
| 123 | void tmio_mmc_abort_dma(struct tmio_mmc_host *host); | ||
| 123 | #else | 124 | #else |
| 124 | static inline void tmio_mmc_start_dma(struct tmio_mmc_host *host, | 125 | static inline void tmio_mmc_start_dma(struct tmio_mmc_host *host, |
| 125 | struct mmc_data *data) | 126 | struct mmc_data *data) |
| @@ -140,6 +141,10 @@ static inline void tmio_mmc_request_dma(struct tmio_mmc_host *host, | |||
| 140 | static inline void tmio_mmc_release_dma(struct tmio_mmc_host *host) | 141 | static inline void tmio_mmc_release_dma(struct tmio_mmc_host *host) |
| 141 | { | 142 | { |
| 142 | } | 143 | } |
| 144 | |||
| 145 | static inline void tmio_mmc_abort_dma(struct tmio_mmc_host *host) | ||
| 146 | { | ||
| 147 | } | ||
| 143 | #endif | 148 | #endif |
| 144 | 149 | ||
| 145 | #ifdef CONFIG_PM | 150 | #ifdef CONFIG_PM |
diff --git a/drivers/mmc/host/tmio_mmc_dma.c b/drivers/mmc/host/tmio_mmc_dma.c index 7a6e6cc8f8b8..8253ec12003e 100644 --- a/drivers/mmc/host/tmio_mmc_dma.c +++ b/drivers/mmc/host/tmio_mmc_dma.c | |||
| @@ -34,6 +34,18 @@ void tmio_mmc_enable_dma(struct tmio_mmc_host *host, bool enable) | |||
| 34 | #endif | 34 | #endif |
| 35 | } | 35 | } |
| 36 | 36 | ||
| 37 | void tmio_mmc_abort_dma(struct tmio_mmc_host *host) | ||
| 38 | { | ||
| 39 | tmio_mmc_enable_dma(host, false); | ||
| 40 | |||
| 41 | if (host->chan_rx) | ||
| 42 | dmaengine_terminate_all(host->chan_rx); | ||
| 43 | if (host->chan_tx) | ||
| 44 | dmaengine_terminate_all(host->chan_tx); | ||
| 45 | |||
| 46 | tmio_mmc_enable_dma(host, true); | ||
| 47 | } | ||
| 48 | |||
| 37 | static void tmio_mmc_start_dma_rx(struct tmio_mmc_host *host) | 49 | static void tmio_mmc_start_dma_rx(struct tmio_mmc_host *host) |
| 38 | { | 50 | { |
| 39 | struct scatterlist *sg = host->sg_ptr, *sg_tmp; | 51 | struct scatterlist *sg = host->sg_ptr, *sg_tmp; |
diff --git a/drivers/mmc/host/tmio_mmc_pio.c b/drivers/mmc/host/tmio_mmc_pio.c index abad01b37cfb..5f9ad74fbf80 100644 --- a/drivers/mmc/host/tmio_mmc_pio.c +++ b/drivers/mmc/host/tmio_mmc_pio.c | |||
| @@ -41,8 +41,8 @@ | |||
| 41 | #include <linux/platform_device.h> | 41 | #include <linux/platform_device.h> |
| 42 | #include <linux/pm_runtime.h> | 42 | #include <linux/pm_runtime.h> |
| 43 | #include <linux/scatterlist.h> | 43 | #include <linux/scatterlist.h> |
| 44 | #include <linux/workqueue.h> | ||
| 45 | #include <linux/spinlock.h> | 44 | #include <linux/spinlock.h> |
| 45 | #include <linux/workqueue.h> | ||
| 46 | 46 | ||
| 47 | #include "tmio_mmc.h" | 47 | #include "tmio_mmc.h" |
| 48 | 48 | ||
| @@ -246,6 +246,7 @@ static void tmio_mmc_reset_work(struct work_struct *work) | |||
| 246 | /* Ready for new calls */ | 246 | /* Ready for new calls */ |
| 247 | host->mrq = NULL; | 247 | host->mrq = NULL; |
| 248 | 248 | ||
| 249 | tmio_mmc_abort_dma(host); | ||
| 249 | mmc_request_done(host->mmc, mrq); | 250 | mmc_request_done(host->mmc, mrq); |
| 250 | } | 251 | } |
| 251 | 252 | ||
| @@ -272,6 +273,9 @@ static void tmio_mmc_finish_request(struct tmio_mmc_host *host) | |||
| 272 | host->mrq = NULL; | 273 | host->mrq = NULL; |
| 273 | spin_unlock_irqrestore(&host->lock, flags); | 274 | spin_unlock_irqrestore(&host->lock, flags); |
| 274 | 275 | ||
| 276 | if (mrq->cmd->error || (mrq->data && mrq->data->error)) | ||
| 277 | tmio_mmc_abort_dma(host); | ||
| 278 | |||
| 275 | mmc_request_done(host->mmc, mrq); | 279 | mmc_request_done(host->mmc, mrq); |
| 276 | } | 280 | } |
| 277 | 281 | ||
diff --git a/drivers/net/ethernet/3com/3c59x.c b/drivers/net/ethernet/3com/3c59x.c index 8153a3e0a1a4..f9b74c0a8492 100644 --- a/drivers/net/ethernet/3com/3c59x.c +++ b/drivers/net/ethernet/3com/3c59x.c | |||
| @@ -1842,7 +1842,7 @@ vortex_timer(unsigned long data) | |||
| 1842 | ok = 1; | 1842 | ok = 1; |
| 1843 | } | 1843 | } |
| 1844 | 1844 | ||
| 1845 | if (!netif_carrier_ok(dev)) | 1845 | if (dev->flags & IFF_SLAVE || !netif_carrier_ok(dev)) |
| 1846 | next_tick = 5*HZ; | 1846 | next_tick = 5*HZ; |
| 1847 | 1847 | ||
| 1848 | if (vp->medialock) | 1848 | if (vp->medialock) |
diff --git a/drivers/net/ethernet/broadcom/bcm63xx_enet.c b/drivers/net/ethernet/broadcom/bcm63xx_enet.c index 986019b2c849..c7ca7ec065ee 100644 --- a/drivers/net/ethernet/broadcom/bcm63xx_enet.c +++ b/drivers/net/ethernet/broadcom/bcm63xx_enet.c | |||
| @@ -797,7 +797,7 @@ static int bcm_enet_open(struct net_device *dev) | |||
| 797 | if (priv->has_phy) { | 797 | if (priv->has_phy) { |
| 798 | /* connect to PHY */ | 798 | /* connect to PHY */ |
| 799 | snprintf(phy_id, sizeof(phy_id), PHY_ID_FMT, | 799 | snprintf(phy_id, sizeof(phy_id), PHY_ID_FMT, |
| 800 | priv->mac_id ? "1" : "0", priv->phy_id); | 800 | priv->mii_bus->id, priv->phy_id); |
| 801 | 801 | ||
| 802 | phydev = phy_connect(dev, phy_id, bcm_enet_adjust_phy_link, 0, | 802 | phydev = phy_connect(dev, phy_id, bcm_enet_adjust_phy_link, 0, |
| 803 | PHY_INTERFACE_MODE_MII); | 803 | PHY_INTERFACE_MODE_MII); |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c index 1e3f978ee6da..254521319150 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | |||
| @@ -117,10 +117,6 @@ static int dropless_fc; | |||
| 117 | module_param(dropless_fc, int, 0); | 117 | module_param(dropless_fc, int, 0); |
| 118 | MODULE_PARM_DESC(dropless_fc, " Pause on exhausted host ring"); | 118 | MODULE_PARM_DESC(dropless_fc, " Pause on exhausted host ring"); |
| 119 | 119 | ||
| 120 | static int poll; | ||
| 121 | module_param(poll, int, 0); | ||
| 122 | MODULE_PARM_DESC(poll, " Use polling (for debug)"); | ||
| 123 | |||
| 124 | static int mrrs = -1; | 120 | static int mrrs = -1; |
| 125 | module_param(mrrs, int, 0); | 121 | module_param(mrrs, int, 0); |
| 126 | MODULE_PARM_DESC(mrrs, " Force Max Read Req Size (0..3) (for debug)"); | 122 | MODULE_PARM_DESC(mrrs, " Force Max Read Req Size (0..3) (for debug)"); |
| @@ -4834,20 +4830,11 @@ void bnx2x_drv_pulse(struct bnx2x *bp) | |||
| 4834 | 4830 | ||
| 4835 | static void bnx2x_timer(unsigned long data) | 4831 | static void bnx2x_timer(unsigned long data) |
| 4836 | { | 4832 | { |
| 4837 | u8 cos; | ||
| 4838 | struct bnx2x *bp = (struct bnx2x *) data; | 4833 | struct bnx2x *bp = (struct bnx2x *) data; |
| 4839 | 4834 | ||
| 4840 | if (!netif_running(bp->dev)) | 4835 | if (!netif_running(bp->dev)) |
| 4841 | return; | 4836 | return; |
| 4842 | 4837 | ||
| 4843 | if (poll) { | ||
| 4844 | struct bnx2x_fastpath *fp = &bp->fp[0]; | ||
| 4845 | |||
| 4846 | for_each_cos_in_tx_queue(fp, cos) | ||
| 4847 | bnx2x_tx_int(bp, &fp->txdata[cos]); | ||
| 4848 | bnx2x_rx_int(fp, 1000); | ||
| 4849 | } | ||
| 4850 | |||
| 4851 | if (!BP_NOMCP(bp)) { | 4838 | if (!BP_NOMCP(bp)) { |
| 4852 | int mb_idx = BP_FW_MB_IDX(bp); | 4839 | int mb_idx = BP_FW_MB_IDX(bp); |
| 4853 | u32 drv_pulse; | 4840 | u32 drv_pulse; |
| @@ -10063,7 +10050,6 @@ static void __devinit bnx2x_set_modes_bitmap(struct bnx2x *bp) | |||
| 10063 | static int __devinit bnx2x_init_bp(struct bnx2x *bp) | 10050 | static int __devinit bnx2x_init_bp(struct bnx2x *bp) |
| 10064 | { | 10051 | { |
| 10065 | int func; | 10052 | int func; |
| 10066 | int timer_interval; | ||
| 10067 | int rc; | 10053 | int rc; |
| 10068 | 10054 | ||
| 10069 | mutex_init(&bp->port.phy_mutex); | 10055 | mutex_init(&bp->port.phy_mutex); |
| @@ -10139,8 +10125,7 @@ static int __devinit bnx2x_init_bp(struct bnx2x *bp) | |||
| 10139 | bp->tx_ticks = (50 / BNX2X_BTR) * BNX2X_BTR; | 10125 | bp->tx_ticks = (50 / BNX2X_BTR) * BNX2X_BTR; |
| 10140 | bp->rx_ticks = (25 / BNX2X_BTR) * BNX2X_BTR; | 10126 | bp->rx_ticks = (25 / BNX2X_BTR) * BNX2X_BTR; |
| 10141 | 10127 | ||
| 10142 | timer_interval = (CHIP_REV_IS_SLOW(bp) ? 5*HZ : HZ); | 10128 | bp->current_interval = CHIP_REV_IS_SLOW(bp) ? 5*HZ : HZ; |
| 10143 | bp->current_interval = (poll ? poll : timer_interval); | ||
| 10144 | 10129 | ||
| 10145 | init_timer(&bp->timer); | 10130 | init_timer(&bp->timer); |
| 10146 | bp->timer.expires = jiffies + bp->current_interval; | 10131 | bp->timer.expires = jiffies + bp->current_interval; |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.c index bc0121ac291e..1adef266fcd5 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.c | |||
| @@ -1081,17 +1081,17 @@ static int bnx2x_storm_stats_update(struct bnx2x *bp) | |||
| 1081 | estats->rx_stat_ifhcinbadoctets_lo); | 1081 | estats->rx_stat_ifhcinbadoctets_lo); |
| 1082 | 1082 | ||
| 1083 | ADD_64(fstats->total_bytes_received_hi, | 1083 | ADD_64(fstats->total_bytes_received_hi, |
| 1084 | tfunc->rcv_error_bytes.hi, | 1084 | le32_to_cpu(tfunc->rcv_error_bytes.hi), |
| 1085 | fstats->total_bytes_received_lo, | 1085 | fstats->total_bytes_received_lo, |
| 1086 | tfunc->rcv_error_bytes.lo); | 1086 | le32_to_cpu(tfunc->rcv_error_bytes.lo)); |
| 1087 | 1087 | ||
| 1088 | memcpy(estats, &(fstats->total_bytes_received_hi), | 1088 | memcpy(estats, &(fstats->total_bytes_received_hi), |
| 1089 | sizeof(struct host_func_stats) - 2*sizeof(u32)); | 1089 | sizeof(struct host_func_stats) - 2*sizeof(u32)); |
| 1090 | 1090 | ||
| 1091 | ADD_64(estats->error_bytes_received_hi, | 1091 | ADD_64(estats->error_bytes_received_hi, |
| 1092 | tfunc->rcv_error_bytes.hi, | 1092 | le32_to_cpu(tfunc->rcv_error_bytes.hi), |
| 1093 | estats->error_bytes_received_lo, | 1093 | estats->error_bytes_received_lo, |
| 1094 | tfunc->rcv_error_bytes.lo); | 1094 | le32_to_cpu(tfunc->rcv_error_bytes.lo)); |
| 1095 | 1095 | ||
| 1096 | ADD_64(estats->etherstatsoverrsizepkts_hi, | 1096 | ADD_64(estats->etherstatsoverrsizepkts_hi, |
| 1097 | estats->rx_stat_dot3statsframestoolong_hi, | 1097 | estats->rx_stat_dot3statsframestoolong_hi, |
diff --git a/drivers/net/ethernet/freescale/fec.c b/drivers/net/ethernet/freescale/fec.c index 1c7aad8fa19c..e92ef1bd732a 100644 --- a/drivers/net/ethernet/freescale/fec.c +++ b/drivers/net/ethernet/freescale/fec.c | |||
| @@ -986,7 +986,7 @@ static int fec_enet_mii_probe(struct net_device *ndev) | |||
| 986 | printk(KERN_INFO | 986 | printk(KERN_INFO |
| 987 | "%s: no PHY, assuming direct connection to switch\n", | 987 | "%s: no PHY, assuming direct connection to switch\n", |
| 988 | ndev->name); | 988 | ndev->name); |
| 989 | strncpy(mdio_bus_id, "0", MII_BUS_ID_SIZE); | 989 | strncpy(mdio_bus_id, "fixed-0", MII_BUS_ID_SIZE); |
| 990 | phy_id = 0; | 990 | phy_id = 0; |
| 991 | } | 991 | } |
| 992 | 992 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx4/eq.c b/drivers/net/ethernet/mellanox/mlx4/eq.c index 55d7bd4e210a..8fa41f3082cf 100644 --- a/drivers/net/ethernet/mellanox/mlx4/eq.c +++ b/drivers/net/ethernet/mellanox/mlx4/eq.c | |||
| @@ -815,8 +815,9 @@ int mlx4_init_eq_table(struct mlx4_dev *dev) | |||
| 815 | int err; | 815 | int err; |
| 816 | int i; | 816 | int i; |
| 817 | 817 | ||
| 818 | priv->eq_table.uar_map = kcalloc(sizeof *priv->eq_table.uar_map, | 818 | priv->eq_table.uar_map = kcalloc(mlx4_num_eq_uar(dev), |
| 819 | mlx4_num_eq_uar(dev), GFP_KERNEL); | 819 | sizeof *priv->eq_table.uar_map, |
| 820 | GFP_KERNEL); | ||
| 820 | if (!priv->eq_table.uar_map) { | 821 | if (!priv->eq_table.uar_map) { |
| 821 | err = -ENOMEM; | 822 | err = -ENOMEM; |
| 822 | goto err_out_free; | 823 | goto err_out_free; |
diff --git a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c index dcd819bfb2f0..bfdb7af19e49 100644 --- a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c +++ b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c | |||
| @@ -73,6 +73,7 @@ struct res_gid { | |||
| 73 | struct list_head list; | 73 | struct list_head list; |
| 74 | u8 gid[16]; | 74 | u8 gid[16]; |
| 75 | enum mlx4_protocol prot; | 75 | enum mlx4_protocol prot; |
| 76 | enum mlx4_steer_type steer; | ||
| 76 | }; | 77 | }; |
| 77 | 78 | ||
| 78 | enum res_qp_states { | 79 | enum res_qp_states { |
| @@ -374,6 +375,7 @@ static struct res_common *alloc_qp_tr(int id) | |||
| 374 | 375 | ||
| 375 | ret->com.res_id = id; | 376 | ret->com.res_id = id; |
| 376 | ret->com.state = RES_QP_RESERVED; | 377 | ret->com.state = RES_QP_RESERVED; |
| 378 | ret->local_qpn = id; | ||
| 377 | INIT_LIST_HEAD(&ret->mcg_list); | 379 | INIT_LIST_HEAD(&ret->mcg_list); |
| 378 | spin_lock_init(&ret->mcg_spl); | 380 | spin_lock_init(&ret->mcg_spl); |
| 379 | 381 | ||
| @@ -2479,7 +2481,8 @@ static struct res_gid *find_gid(struct mlx4_dev *dev, int slave, | |||
| 2479 | } | 2481 | } |
| 2480 | 2482 | ||
| 2481 | static int add_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp, | 2483 | static int add_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp, |
| 2482 | u8 *gid, enum mlx4_protocol prot) | 2484 | u8 *gid, enum mlx4_protocol prot, |
| 2485 | enum mlx4_steer_type steer) | ||
| 2483 | { | 2486 | { |
| 2484 | struct res_gid *res; | 2487 | struct res_gid *res; |
| 2485 | int err; | 2488 | int err; |
| @@ -2495,6 +2498,7 @@ static int add_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp, | |||
| 2495 | } else { | 2498 | } else { |
| 2496 | memcpy(res->gid, gid, 16); | 2499 | memcpy(res->gid, gid, 16); |
| 2497 | res->prot = prot; | 2500 | res->prot = prot; |
| 2501 | res->steer = steer; | ||
| 2498 | list_add_tail(&res->list, &rqp->mcg_list); | 2502 | list_add_tail(&res->list, &rqp->mcg_list); |
| 2499 | err = 0; | 2503 | err = 0; |
| 2500 | } | 2504 | } |
| @@ -2504,14 +2508,15 @@ static int add_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp, | |||
| 2504 | } | 2508 | } |
| 2505 | 2509 | ||
| 2506 | static int rem_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp, | 2510 | static int rem_mcg_res(struct mlx4_dev *dev, int slave, struct res_qp *rqp, |
| 2507 | u8 *gid, enum mlx4_protocol prot) | 2511 | u8 *gid, enum mlx4_protocol prot, |
| 2512 | enum mlx4_steer_type steer) | ||
| 2508 | { | 2513 | { |
| 2509 | struct res_gid *res; | 2514 | struct res_gid *res; |
| 2510 | int err; | 2515 | int err; |
| 2511 | 2516 | ||
| 2512 | spin_lock_irq(&rqp->mcg_spl); | 2517 | spin_lock_irq(&rqp->mcg_spl); |
| 2513 | res = find_gid(dev, slave, rqp, gid); | 2518 | res = find_gid(dev, slave, rqp, gid); |
| 2514 | if (!res || res->prot != prot) | 2519 | if (!res || res->prot != prot || res->steer != steer) |
| 2515 | err = -EINVAL; | 2520 | err = -EINVAL; |
| 2516 | else { | 2521 | else { |
| 2517 | list_del(&res->list); | 2522 | list_del(&res->list); |
| @@ -2538,7 +2543,7 @@ int mlx4_QP_ATTACH_wrapper(struct mlx4_dev *dev, int slave, | |||
| 2538 | int attach = vhcr->op_modifier; | 2543 | int attach = vhcr->op_modifier; |
| 2539 | int block_loopback = vhcr->in_modifier >> 31; | 2544 | int block_loopback = vhcr->in_modifier >> 31; |
| 2540 | u8 steer_type_mask = 2; | 2545 | u8 steer_type_mask = 2; |
| 2541 | enum mlx4_steer_type type = gid[7] & steer_type_mask; | 2546 | enum mlx4_steer_type type = (gid[7] & steer_type_mask) >> 1; |
| 2542 | 2547 | ||
| 2543 | qpn = vhcr->in_modifier & 0xffffff; | 2548 | qpn = vhcr->in_modifier & 0xffffff; |
| 2544 | err = get_res(dev, slave, qpn, RES_QP, &rqp); | 2549 | err = get_res(dev, slave, qpn, RES_QP, &rqp); |
| @@ -2547,7 +2552,7 @@ int mlx4_QP_ATTACH_wrapper(struct mlx4_dev *dev, int slave, | |||
| 2547 | 2552 | ||
| 2548 | qp.qpn = qpn; | 2553 | qp.qpn = qpn; |
| 2549 | if (attach) { | 2554 | if (attach) { |
| 2550 | err = add_mcg_res(dev, slave, rqp, gid, prot); | 2555 | err = add_mcg_res(dev, slave, rqp, gid, prot, type); |
| 2551 | if (err) | 2556 | if (err) |
| 2552 | goto ex_put; | 2557 | goto ex_put; |
| 2553 | 2558 | ||
| @@ -2556,7 +2561,7 @@ int mlx4_QP_ATTACH_wrapper(struct mlx4_dev *dev, int slave, | |||
| 2556 | if (err) | 2561 | if (err) |
| 2557 | goto ex_rem; | 2562 | goto ex_rem; |
| 2558 | } else { | 2563 | } else { |
| 2559 | err = rem_mcg_res(dev, slave, rqp, gid, prot); | 2564 | err = rem_mcg_res(dev, slave, rqp, gid, prot, type); |
| 2560 | if (err) | 2565 | if (err) |
| 2561 | goto ex_put; | 2566 | goto ex_put; |
| 2562 | err = mlx4_qp_detach_common(dev, &qp, gid, prot, type); | 2567 | err = mlx4_qp_detach_common(dev, &qp, gid, prot, type); |
| @@ -2567,7 +2572,7 @@ int mlx4_QP_ATTACH_wrapper(struct mlx4_dev *dev, int slave, | |||
| 2567 | 2572 | ||
| 2568 | ex_rem: | 2573 | ex_rem: |
| 2569 | /* ignore error return below, already in error */ | 2574 | /* ignore error return below, already in error */ |
| 2570 | err1 = rem_mcg_res(dev, slave, rqp, gid, prot); | 2575 | err1 = rem_mcg_res(dev, slave, rqp, gid, prot, type); |
| 2571 | ex_put: | 2576 | ex_put: |
| 2572 | put_res(dev, slave, qpn, RES_QP); | 2577 | put_res(dev, slave, qpn, RES_QP); |
| 2573 | 2578 | ||
| @@ -2606,7 +2611,7 @@ static void detach_qp(struct mlx4_dev *dev, int slave, struct res_qp *rqp) | |||
| 2606 | list_for_each_entry_safe(rgid, tmp, &rqp->mcg_list, list) { | 2611 | list_for_each_entry_safe(rgid, tmp, &rqp->mcg_list, list) { |
| 2607 | qp.qpn = rqp->local_qpn; | 2612 | qp.qpn = rqp->local_qpn; |
| 2608 | err = mlx4_qp_detach_common(dev, &qp, rgid->gid, rgid->prot, | 2613 | err = mlx4_qp_detach_common(dev, &qp, rgid->gid, rgid->prot, |
| 2609 | MLX4_MC_STEER); | 2614 | rgid->steer); |
| 2610 | list_del(&rgid->list); | 2615 | list_del(&rgid->list); |
| 2611 | kfree(rgid); | 2616 | kfree(rgid); |
| 2612 | } | 2617 | } |
diff --git a/drivers/net/ethernet/micrel/ks8851.c b/drivers/net/ethernet/micrel/ks8851.c index 6b35e7da9a9c..0c3e4005224d 100644 --- a/drivers/net/ethernet/micrel/ks8851.c +++ b/drivers/net/ethernet/micrel/ks8851.c | |||
| @@ -583,7 +583,7 @@ static void ks8851_rx_pkts(struct ks8851_net *ks) | |||
| 583 | ks8851_dbg_dumpkkt(ks, rxpkt); | 583 | ks8851_dbg_dumpkkt(ks, rxpkt); |
| 584 | 584 | ||
| 585 | skb->protocol = eth_type_trans(skb, ks->netdev); | 585 | skb->protocol = eth_type_trans(skb, ks->netdev); |
| 586 | netif_rx(skb); | 586 | netif_rx_ni(skb); |
| 587 | 587 | ||
| 588 | ks->netdev->stats.rx_packets++; | 588 | ks->netdev->stats.rx_packets++; |
| 589 | ks->netdev->stats.rx_bytes += rxlen; | 589 | ks->netdev->stats.rx_bytes += rxlen; |
diff --git a/drivers/net/ethernet/micrel/ks8851_mll.c b/drivers/net/ethernet/micrel/ks8851_mll.c index e58e78e5c930..231176fcd2ba 100644 --- a/drivers/net/ethernet/micrel/ks8851_mll.c +++ b/drivers/net/ethernet/micrel/ks8851_mll.c | |||
| @@ -394,7 +394,6 @@ union ks_tx_hdr { | |||
| 394 | * @msg_enable : The message flags controlling driver output (see ethtool). | 394 | * @msg_enable : The message flags controlling driver output (see ethtool). |
| 395 | * @frame_cnt : number of frames received. | 395 | * @frame_cnt : number of frames received. |
| 396 | * @bus_width : i/o bus width. | 396 | * @bus_width : i/o bus width. |
| 397 | * @irq : irq number assigned to this device. | ||
| 398 | * @rc_rxqcr : Cached copy of KS_RXQCR. | 397 | * @rc_rxqcr : Cached copy of KS_RXQCR. |
| 399 | * @rc_txcr : Cached copy of KS_TXCR. | 398 | * @rc_txcr : Cached copy of KS_TXCR. |
| 400 | * @rc_ier : Cached copy of KS_IER. | 399 | * @rc_ier : Cached copy of KS_IER. |
| @@ -441,7 +440,6 @@ struct ks_net { | |||
| 441 | u32 msg_enable; | 440 | u32 msg_enable; |
| 442 | u32 frame_cnt; | 441 | u32 frame_cnt; |
| 443 | int bus_width; | 442 | int bus_width; |
| 444 | int irq; | ||
| 445 | 443 | ||
| 446 | u16 rc_rxqcr; | 444 | u16 rc_rxqcr; |
| 447 | u16 rc_txcr; | 445 | u16 rc_txcr; |
| @@ -907,10 +905,10 @@ static int ks_net_open(struct net_device *netdev) | |||
| 907 | netif_dbg(ks, ifup, ks->netdev, "%s - entry\n", __func__); | 905 | netif_dbg(ks, ifup, ks->netdev, "%s - entry\n", __func__); |
| 908 | 906 | ||
| 909 | /* reset the HW */ | 907 | /* reset the HW */ |
| 910 | err = request_irq(ks->irq, ks_irq, KS_INT_FLAGS, DRV_NAME, netdev); | 908 | err = request_irq(netdev->irq, ks_irq, KS_INT_FLAGS, DRV_NAME, netdev); |
| 911 | 909 | ||
| 912 | if (err) { | 910 | if (err) { |
| 913 | pr_err("Failed to request IRQ: %d: %d\n", ks->irq, err); | 911 | pr_err("Failed to request IRQ: %d: %d\n", netdev->irq, err); |
| 914 | return err; | 912 | return err; |
| 915 | } | 913 | } |
| 916 | 914 | ||
| @@ -955,7 +953,7 @@ static int ks_net_stop(struct net_device *netdev) | |||
| 955 | 953 | ||
| 956 | /* set powermode to soft power down to save power */ | 954 | /* set powermode to soft power down to save power */ |
| 957 | ks_set_powermode(ks, PMECR_PM_SOFTDOWN); | 955 | ks_set_powermode(ks, PMECR_PM_SOFTDOWN); |
| 958 | free_irq(ks->irq, netdev); | 956 | free_irq(netdev->irq, netdev); |
| 959 | mutex_unlock(&ks->lock); | 957 | mutex_unlock(&ks->lock); |
| 960 | return 0; | 958 | return 0; |
| 961 | } | 959 | } |
| @@ -1545,10 +1543,10 @@ static int __devinit ks8851_probe(struct platform_device *pdev) | |||
| 1545 | if (!ks->hw_addr_cmd) | 1543 | if (!ks->hw_addr_cmd) |
| 1546 | goto err_ioremap1; | 1544 | goto err_ioremap1; |
| 1547 | 1545 | ||
| 1548 | ks->irq = platform_get_irq(pdev, 0); | 1546 | netdev->irq = platform_get_irq(pdev, 0); |
| 1549 | 1547 | ||
| 1550 | if (ks->irq < 0) { | 1548 | if (netdev->irq < 0) { |
| 1551 | err = ks->irq; | 1549 | err = netdev->irq; |
| 1552 | goto err_get_irq; | 1550 | goto err_get_irq; |
| 1553 | } | 1551 | } |
| 1554 | 1552 | ||
diff --git a/drivers/net/ethernet/octeon/octeon_mgmt.c b/drivers/net/ethernet/octeon/octeon_mgmt.c index 212f43b308a3..cd827ff4a021 100644 --- a/drivers/net/ethernet/octeon/octeon_mgmt.c +++ b/drivers/net/ethernet/octeon/octeon_mgmt.c | |||
| @@ -670,7 +670,7 @@ static void octeon_mgmt_adjust_link(struct net_device *netdev) | |||
| 670 | static int octeon_mgmt_init_phy(struct net_device *netdev) | 670 | static int octeon_mgmt_init_phy(struct net_device *netdev) |
| 671 | { | 671 | { |
| 672 | struct octeon_mgmt *p = netdev_priv(netdev); | 672 | struct octeon_mgmt *p = netdev_priv(netdev); |
| 673 | char phy_id[20]; | 673 | char phy_id[MII_BUS_ID_SIZE + 3]; |
| 674 | 674 | ||
| 675 | if (octeon_is_simulation()) { | 675 | if (octeon_is_simulation()) { |
| 676 | /* No PHYs in the simulator. */ | 676 | /* No PHYs in the simulator. */ |
| @@ -678,7 +678,7 @@ static int octeon_mgmt_init_phy(struct net_device *netdev) | |||
| 678 | return 0; | 678 | return 0; |
| 679 | } | 679 | } |
| 680 | 680 | ||
| 681 | snprintf(phy_id, sizeof(phy_id), PHY_ID_FMT, "0", p->port); | 681 | snprintf(phy_id, sizeof(phy_id), PHY_ID_FMT, "mdio-octeon-0", p->port); |
| 682 | 682 | ||
| 683 | p->phydev = phy_connect(netdev, phy_id, octeon_mgmt_adjust_link, 0, | 683 | p->phydev = phy_connect(netdev, phy_id, octeon_mgmt_adjust_link, 0, |
| 684 | PHY_INTERFACE_MODE_MII); | 684 | PHY_INTERFACE_MODE_MII); |
diff --git a/drivers/net/ethernet/stmicro/stmmac/common.h b/drivers/net/ethernet/stmicro/stmmac/common.h index d0b814ef0675..0319d640f728 100644 --- a/drivers/net/ethernet/stmicro/stmmac/common.h +++ b/drivers/net/ethernet/stmicro/stmmac/common.h | |||
| @@ -67,6 +67,7 @@ struct stmmac_extra_stats { | |||
| 67 | unsigned long ipc_csum_error; | 67 | unsigned long ipc_csum_error; |
| 68 | unsigned long rx_collision; | 68 | unsigned long rx_collision; |
| 69 | unsigned long rx_crc; | 69 | unsigned long rx_crc; |
| 70 | unsigned long dribbling_bit; | ||
| 70 | unsigned long rx_length; | 71 | unsigned long rx_length; |
| 71 | unsigned long rx_mii; | 72 | unsigned long rx_mii; |
| 72 | unsigned long rx_multicast; | 73 | unsigned long rx_multicast; |
diff --git a/drivers/net/ethernet/stmicro/stmmac/enh_desc.c b/drivers/net/ethernet/stmicro/stmmac/enh_desc.c index d87976364ec5..ad1b627f8ec2 100644 --- a/drivers/net/ethernet/stmicro/stmmac/enh_desc.c +++ b/drivers/net/ethernet/stmicro/stmmac/enh_desc.c | |||
| @@ -201,7 +201,7 @@ static int enh_desc_get_rx_status(void *data, struct stmmac_extra_stats *x, | |||
| 201 | 201 | ||
| 202 | if (unlikely(p->des01.erx.dribbling)) { | 202 | if (unlikely(p->des01.erx.dribbling)) { |
| 203 | CHIP_DBG(KERN_ERR "GMAC RX: dribbling error\n"); | 203 | CHIP_DBG(KERN_ERR "GMAC RX: dribbling error\n"); |
| 204 | ret = discard_frame; | 204 | x->dribbling_bit++; |
| 205 | } | 205 | } |
| 206 | if (unlikely(p->des01.erx.sa_filter_fail)) { | 206 | if (unlikely(p->des01.erx.sa_filter_fail)) { |
| 207 | CHIP_DBG(KERN_ERR "GMAC RX : Source Address filter fail\n"); | 207 | CHIP_DBG(KERN_ERR "GMAC RX : Source Address filter fail\n"); |
diff --git a/drivers/net/ethernet/stmicro/stmmac/norm_desc.c b/drivers/net/ethernet/stmicro/stmmac/norm_desc.c index fda5d2b31d3a..25953bb45a73 100644 --- a/drivers/net/ethernet/stmicro/stmmac/norm_desc.c +++ b/drivers/net/ethernet/stmicro/stmmac/norm_desc.c | |||
| @@ -104,7 +104,7 @@ static int ndesc_get_rx_status(void *data, struct stmmac_extra_stats *x, | |||
| 104 | ret = discard_frame; | 104 | ret = discard_frame; |
| 105 | } | 105 | } |
| 106 | if (unlikely(p->des01.rx.dribbling)) | 106 | if (unlikely(p->des01.rx.dribbling)) |
| 107 | ret = discard_frame; | 107 | x->dribbling_bit++; |
| 108 | 108 | ||
| 109 | if (unlikely(p->des01.rx.length_error)) { | 109 | if (unlikely(p->des01.rx.length_error)) { |
| 110 | x->rx_length++; | 110 | x->rx_length++; |
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac.h b/drivers/net/ethernet/stmicro/stmmac/stmmac.h index 120740020e2c..b4b095fdcf29 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac.h +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac.h | |||
| @@ -21,7 +21,7 @@ | |||
| 21 | *******************************************************************************/ | 21 | *******************************************************************************/ |
| 22 | 22 | ||
| 23 | #define STMMAC_RESOURCE_NAME "stmmaceth" | 23 | #define STMMAC_RESOURCE_NAME "stmmaceth" |
| 24 | #define DRV_MODULE_VERSION "Dec_2011" | 24 | #define DRV_MODULE_VERSION "Feb_2012" |
| 25 | #include <linux/stmmac.h> | 25 | #include <linux/stmmac.h> |
| 26 | #include <linux/phy.h> | 26 | #include <linux/phy.h> |
| 27 | #include "common.h" | 27 | #include "common.h" |
| @@ -97,4 +97,5 @@ int stmmac_resume(struct net_device *ndev); | |||
| 97 | int stmmac_suspend(struct net_device *ndev); | 97 | int stmmac_suspend(struct net_device *ndev); |
| 98 | int stmmac_dvr_remove(struct net_device *ndev); | 98 | int stmmac_dvr_remove(struct net_device *ndev); |
| 99 | struct stmmac_priv *stmmac_dvr_probe(struct device *device, | 99 | struct stmmac_priv *stmmac_dvr_probe(struct device *device, |
| 100 | struct plat_stmmacenet_data *plat_dat); | 100 | struct plat_stmmacenet_data *plat_dat, |
| 101 | void __iomem *addr); | ||
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c index 9573303a706b..f98e1511660f 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c | |||
| @@ -47,23 +47,25 @@ struct stmmac_stats { | |||
| 47 | offsetof(struct stmmac_priv, xstats.m)} | 47 | offsetof(struct stmmac_priv, xstats.m)} |
| 48 | 48 | ||
| 49 | static const struct stmmac_stats stmmac_gstrings_stats[] = { | 49 | static const struct stmmac_stats stmmac_gstrings_stats[] = { |
| 50 | /* Transmit errors */ | ||
| 50 | STMMAC_STAT(tx_underflow), | 51 | STMMAC_STAT(tx_underflow), |
| 51 | STMMAC_STAT(tx_carrier), | 52 | STMMAC_STAT(tx_carrier), |
| 52 | STMMAC_STAT(tx_losscarrier), | 53 | STMMAC_STAT(tx_losscarrier), |
| 53 | STMMAC_STAT(vlan_tag), | 54 | STMMAC_STAT(vlan_tag), |
| 54 | STMMAC_STAT(tx_deferred), | 55 | STMMAC_STAT(tx_deferred), |
| 55 | STMMAC_STAT(tx_vlan), | 56 | STMMAC_STAT(tx_vlan), |
| 56 | STMMAC_STAT(rx_vlan), | ||
| 57 | STMMAC_STAT(tx_jabber), | 57 | STMMAC_STAT(tx_jabber), |
| 58 | STMMAC_STAT(tx_frame_flushed), | 58 | STMMAC_STAT(tx_frame_flushed), |
| 59 | STMMAC_STAT(tx_payload_error), | 59 | STMMAC_STAT(tx_payload_error), |
| 60 | STMMAC_STAT(tx_ip_header_error), | 60 | STMMAC_STAT(tx_ip_header_error), |
| 61 | /* Receive errors */ | ||
| 61 | STMMAC_STAT(rx_desc), | 62 | STMMAC_STAT(rx_desc), |
| 62 | STMMAC_STAT(sa_filter_fail), | 63 | STMMAC_STAT(sa_filter_fail), |
| 63 | STMMAC_STAT(overflow_error), | 64 | STMMAC_STAT(overflow_error), |
| 64 | STMMAC_STAT(ipc_csum_error), | 65 | STMMAC_STAT(ipc_csum_error), |
| 65 | STMMAC_STAT(rx_collision), | 66 | STMMAC_STAT(rx_collision), |
| 66 | STMMAC_STAT(rx_crc), | 67 | STMMAC_STAT(rx_crc), |
| 68 | STMMAC_STAT(dribbling_bit), | ||
| 67 | STMMAC_STAT(rx_length), | 69 | STMMAC_STAT(rx_length), |
| 68 | STMMAC_STAT(rx_mii), | 70 | STMMAC_STAT(rx_mii), |
| 69 | STMMAC_STAT(rx_multicast), | 71 | STMMAC_STAT(rx_multicast), |
| @@ -73,6 +75,8 @@ static const struct stmmac_stats stmmac_gstrings_stats[] = { | |||
| 73 | STMMAC_STAT(sa_rx_filter_fail), | 75 | STMMAC_STAT(sa_rx_filter_fail), |
| 74 | STMMAC_STAT(rx_missed_cntr), | 76 | STMMAC_STAT(rx_missed_cntr), |
| 75 | STMMAC_STAT(rx_overflow_cntr), | 77 | STMMAC_STAT(rx_overflow_cntr), |
| 78 | STMMAC_STAT(rx_vlan), | ||
| 79 | /* Tx/Rx IRQ errors */ | ||
| 76 | STMMAC_STAT(tx_undeflow_irq), | 80 | STMMAC_STAT(tx_undeflow_irq), |
| 77 | STMMAC_STAT(tx_process_stopped_irq), | 81 | STMMAC_STAT(tx_process_stopped_irq), |
| 78 | STMMAC_STAT(tx_jabber_irq), | 82 | STMMAC_STAT(tx_jabber_irq), |
| @@ -82,6 +86,7 @@ static const struct stmmac_stats stmmac_gstrings_stats[] = { | |||
| 82 | STMMAC_STAT(rx_watchdog_irq), | 86 | STMMAC_STAT(rx_watchdog_irq), |
| 83 | STMMAC_STAT(tx_early_irq), | 87 | STMMAC_STAT(tx_early_irq), |
| 84 | STMMAC_STAT(fatal_bus_error_irq), | 88 | STMMAC_STAT(fatal_bus_error_irq), |
| 89 | /* Extra info */ | ||
| 85 | STMMAC_STAT(threshold), | 90 | STMMAC_STAT(threshold), |
| 86 | STMMAC_STAT(tx_pkt_n), | 91 | STMMAC_STAT(tx_pkt_n), |
| 87 | STMMAC_STAT(rx_pkt_n), | 92 | STMMAC_STAT(rx_pkt_n), |
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index 96fa2da30763..6ee593a55a64 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | |||
| @@ -241,7 +241,7 @@ static void stmmac_adjust_link(struct net_device *dev) | |||
| 241 | case 1000: | 241 | case 1000: |
| 242 | if (likely(priv->plat->has_gmac)) | 242 | if (likely(priv->plat->has_gmac)) |
| 243 | ctrl &= ~priv->hw->link.port; | 243 | ctrl &= ~priv->hw->link.port; |
| 244 | stmmac_hw_fix_mac_speed(priv); | 244 | stmmac_hw_fix_mac_speed(priv); |
| 245 | break; | 245 | break; |
| 246 | case 100: | 246 | case 100: |
| 247 | case 10: | 247 | case 10: |
| @@ -785,7 +785,7 @@ static u32 stmmac_get_synopsys_id(struct stmmac_priv *priv) | |||
| 785 | u32 uid = ((hwid & 0x0000ff00) >> 8); | 785 | u32 uid = ((hwid & 0x0000ff00) >> 8); |
| 786 | u32 synid = (hwid & 0x000000ff); | 786 | u32 synid = (hwid & 0x000000ff); |
| 787 | 787 | ||
| 788 | pr_info("STMMAC - user ID: 0x%x, Synopsys ID: 0x%x\n", | 788 | pr_info("stmmac - user ID: 0x%x, Synopsys ID: 0x%x\n", |
| 789 | uid, synid); | 789 | uid, synid); |
| 790 | 790 | ||
| 791 | return synid; | 791 | return synid; |
| @@ -869,38 +869,6 @@ static int stmmac_get_hw_features(struct stmmac_priv *priv) | |||
| 869 | return hw_cap; | 869 | return hw_cap; |
| 870 | } | 870 | } |
| 871 | 871 | ||
| 872 | /** | ||
| 873 | * stmmac_mac_device_setup | ||
| 874 | * @dev : device pointer | ||
| 875 | * Description: this is to attach the GMAC or MAC 10/100 | ||
| 876 | * main core structures that will be completed during the | ||
| 877 | * open step. | ||
| 878 | */ | ||
| 879 | static int stmmac_mac_device_setup(struct net_device *dev) | ||
| 880 | { | ||
| 881 | struct stmmac_priv *priv = netdev_priv(dev); | ||
| 882 | |||
| 883 | struct mac_device_info *device; | ||
| 884 | |||
| 885 | if (priv->plat->has_gmac) | ||
| 886 | device = dwmac1000_setup(priv->ioaddr); | ||
| 887 | else | ||
| 888 | device = dwmac100_setup(priv->ioaddr); | ||
| 889 | |||
| 890 | if (!device) | ||
| 891 | return -ENOMEM; | ||
| 892 | |||
| 893 | priv->hw = device; | ||
| 894 | priv->hw->ring = &ring_mode_ops; | ||
| 895 | |||
| 896 | if (device_can_wakeup(priv->device)) { | ||
| 897 | priv->wolopts = WAKE_MAGIC; /* Magic Frame as default */ | ||
| 898 | enable_irq_wake(priv->wol_irq); | ||
| 899 | } | ||
| 900 | |||
| 901 | return 0; | ||
| 902 | } | ||
| 903 | |||
| 904 | static void stmmac_check_ether_addr(struct stmmac_priv *priv) | 872 | static void stmmac_check_ether_addr(struct stmmac_priv *priv) |
| 905 | { | 873 | { |
| 906 | /* verify if the MAC address is valid, in case of failures it | 874 | /* verify if the MAC address is valid, in case of failures it |
| @@ -930,20 +898,8 @@ static int stmmac_open(struct net_device *dev) | |||
| 930 | struct stmmac_priv *priv = netdev_priv(dev); | 898 | struct stmmac_priv *priv = netdev_priv(dev); |
| 931 | int ret; | 899 | int ret; |
| 932 | 900 | ||
| 933 | /* MAC HW device setup */ | ||
| 934 | ret = stmmac_mac_device_setup(dev); | ||
| 935 | if (ret < 0) | ||
| 936 | return ret; | ||
| 937 | |||
| 938 | stmmac_check_ether_addr(priv); | 901 | stmmac_check_ether_addr(priv); |
| 939 | 902 | ||
| 940 | stmmac_verify_args(); | ||
| 941 | |||
| 942 | /* Override with kernel parameters if supplied XXX CRS XXX | ||
| 943 | * this needs to have multiple instances */ | ||
| 944 | if ((phyaddr >= 0) && (phyaddr <= 31)) | ||
| 945 | priv->plat->phy_addr = phyaddr; | ||
| 946 | |||
| 947 | /* MDIO bus Registration */ | 903 | /* MDIO bus Registration */ |
| 948 | ret = stmmac_mdio_register(dev); | 904 | ret = stmmac_mdio_register(dev); |
| 949 | if (ret < 0) { | 905 | if (ret < 0) { |
| @@ -976,44 +932,6 @@ static int stmmac_open(struct net_device *dev) | |||
| 976 | goto open_error; | 932 | goto open_error; |
| 977 | } | 933 | } |
| 978 | 934 | ||
| 979 | stmmac_get_synopsys_id(priv); | ||
| 980 | |||
| 981 | priv->hw_cap_support = stmmac_get_hw_features(priv); | ||
| 982 | |||
| 983 | if (priv->hw_cap_support) { | ||
| 984 | pr_info(" Support DMA HW capability register"); | ||
| 985 | |||
| 986 | /* We can override some gmac/dma configuration fields: e.g. | ||
| 987 | * enh_desc, tx_coe (e.g. that are passed through the | ||
| 988 | * platform) with the values from the HW capability | ||
| 989 | * register (if supported). | ||
| 990 | */ | ||
| 991 | priv->plat->enh_desc = priv->dma_cap.enh_desc; | ||
| 992 | priv->plat->tx_coe = priv->dma_cap.tx_coe; | ||
| 993 | priv->plat->pmt = priv->dma_cap.pmt_remote_wake_up; | ||
| 994 | |||
| 995 | /* By default disable wol on magic frame if not supported */ | ||
| 996 | if (!priv->dma_cap.pmt_magic_frame) | ||
| 997 | priv->wolopts &= ~WAKE_MAGIC; | ||
| 998 | |||
| 999 | } else | ||
| 1000 | pr_info(" No HW DMA feature register supported"); | ||
| 1001 | |||
| 1002 | /* Select the enhnaced/normal descriptor structures */ | ||
| 1003 | stmmac_selec_desc_mode(priv); | ||
| 1004 | |||
| 1005 | /* PMT module is not integrated in all the MAC devices. */ | ||
| 1006 | if (priv->plat->pmt) { | ||
| 1007 | pr_info(" Remote wake-up capable\n"); | ||
| 1008 | device_set_wakeup_capable(priv->device, 1); | ||
| 1009 | } | ||
| 1010 | |||
| 1011 | priv->rx_coe = priv->hw->mac->rx_coe(priv->ioaddr); | ||
| 1012 | if (priv->rx_coe) | ||
| 1013 | pr_info(" Checksum Offload Engine supported\n"); | ||
| 1014 | if (priv->plat->tx_coe) | ||
| 1015 | pr_info(" Checksum insertion supported\n"); | ||
| 1016 | |||
| 1017 | /* Create and initialize the TX/RX descriptors chains. */ | 935 | /* Create and initialize the TX/RX descriptors chains. */ |
| 1018 | priv->dma_tx_size = STMMAC_ALIGN(dma_txsize); | 936 | priv->dma_tx_size = STMMAC_ALIGN(dma_txsize); |
| 1019 | priv->dma_rx_size = STMMAC_ALIGN(dma_rxsize); | 937 | priv->dma_rx_size = STMMAC_ALIGN(dma_rxsize); |
| @@ -1030,14 +948,14 @@ static int stmmac_open(struct net_device *dev) | |||
| 1030 | 948 | ||
| 1031 | /* Copy the MAC addr into the HW */ | 949 | /* Copy the MAC addr into the HW */ |
| 1032 | priv->hw->mac->set_umac_addr(priv->ioaddr, dev->dev_addr, 0); | 950 | priv->hw->mac->set_umac_addr(priv->ioaddr, dev->dev_addr, 0); |
| 951 | |||
| 1033 | /* If required, perform hw setup of the bus. */ | 952 | /* If required, perform hw setup of the bus. */ |
| 1034 | if (priv->plat->bus_setup) | 953 | if (priv->plat->bus_setup) |
| 1035 | priv->plat->bus_setup(priv->ioaddr); | 954 | priv->plat->bus_setup(priv->ioaddr); |
| 955 | |||
| 1036 | /* Initialize the MAC Core */ | 956 | /* Initialize the MAC Core */ |
| 1037 | priv->hw->mac->core_init(priv->ioaddr); | 957 | priv->hw->mac->core_init(priv->ioaddr); |
| 1038 | 958 | ||
| 1039 | netdev_update_features(dev); | ||
| 1040 | |||
| 1041 | /* Request the IRQ lines */ | 959 | /* Request the IRQ lines */ |
| 1042 | ret = request_irq(dev->irq, stmmac_interrupt, | 960 | ret = request_irq(dev->irq, stmmac_interrupt, |
| 1043 | IRQF_SHARED, dev->name, dev); | 961 | IRQF_SHARED, dev->name, dev); |
| @@ -1047,6 +965,17 @@ static int stmmac_open(struct net_device *dev) | |||
| 1047 | goto open_error; | 965 | goto open_error; |
| 1048 | } | 966 | } |
| 1049 | 967 | ||
| 968 | /* Request the Wake IRQ in case of another line is used for WoL */ | ||
| 969 | if (priv->wol_irq != dev->irq) { | ||
| 970 | ret = request_irq(priv->wol_irq, stmmac_interrupt, | ||
| 971 | IRQF_SHARED, dev->name, dev); | ||
| 972 | if (unlikely(ret < 0)) { | ||
| 973 | pr_err("%s: ERROR: allocating the ext WoL IRQ %d " | ||
| 974 | "(error: %d)\n", __func__, priv->wol_irq, ret); | ||
| 975 | goto open_error_wolirq; | ||
| 976 | } | ||
| 977 | } | ||
| 978 | |||
| 1050 | /* Enable the MAC Rx/Tx */ | 979 | /* Enable the MAC Rx/Tx */ |
| 1051 | stmmac_set_mac(priv->ioaddr, true); | 980 | stmmac_set_mac(priv->ioaddr, true); |
| 1052 | 981 | ||
| @@ -1062,7 +991,7 @@ static int stmmac_open(struct net_device *dev) | |||
| 1062 | #ifdef CONFIG_STMMAC_DEBUG_FS | 991 | #ifdef CONFIG_STMMAC_DEBUG_FS |
| 1063 | ret = stmmac_init_fs(dev); | 992 | ret = stmmac_init_fs(dev); |
| 1064 | if (ret < 0) | 993 | if (ret < 0) |
| 1065 | pr_warning("\tFailed debugFS registration"); | 994 | pr_warning("%s: failed debugFS registration\n", __func__); |
| 1066 | #endif | 995 | #endif |
| 1067 | /* Start the ball rolling... */ | 996 | /* Start the ball rolling... */ |
| 1068 | DBG(probe, DEBUG, "%s: DMA RX/TX processes started...\n", dev->name); | 997 | DBG(probe, DEBUG, "%s: DMA RX/TX processes started...\n", dev->name); |
| @@ -1072,6 +1001,7 @@ static int stmmac_open(struct net_device *dev) | |||
| 1072 | #ifdef CONFIG_STMMAC_TIMER | 1001 | #ifdef CONFIG_STMMAC_TIMER |
| 1073 | priv->tm->timer_start(tmrate); | 1002 | priv->tm->timer_start(tmrate); |
| 1074 | #endif | 1003 | #endif |
| 1004 | |||
| 1075 | /* Dump DMA/MAC registers */ | 1005 | /* Dump DMA/MAC registers */ |
| 1076 | if (netif_msg_hw(priv)) { | 1006 | if (netif_msg_hw(priv)) { |
| 1077 | priv->hw->mac->dump_regs(priv->ioaddr); | 1007 | priv->hw->mac->dump_regs(priv->ioaddr); |
| @@ -1087,6 +1017,9 @@ static int stmmac_open(struct net_device *dev) | |||
| 1087 | 1017 | ||
| 1088 | return 0; | 1018 | return 0; |
| 1089 | 1019 | ||
| 1020 | open_error_wolirq: | ||
| 1021 | free_irq(dev->irq, dev); | ||
| 1022 | |||
| 1090 | open_error: | 1023 | open_error: |
| 1091 | #ifdef CONFIG_STMMAC_TIMER | 1024 | #ifdef CONFIG_STMMAC_TIMER |
| 1092 | kfree(priv->tm); | 1025 | kfree(priv->tm); |
| @@ -1127,6 +1060,8 @@ static int stmmac_release(struct net_device *dev) | |||
| 1127 | 1060 | ||
| 1128 | /* Free the IRQ lines */ | 1061 | /* Free the IRQ lines */ |
| 1129 | free_irq(dev->irq, dev); | 1062 | free_irq(dev->irq, dev); |
| 1063 | if (priv->wol_irq != dev->irq) | ||
| 1064 | free_irq(priv->wol_irq, dev); | ||
| 1130 | 1065 | ||
| 1131 | /* Stop TX/RX DMA and clear the descriptors */ | 1066 | /* Stop TX/RX DMA and clear the descriptors */ |
| 1132 | priv->hw->dma->stop_tx(priv->ioaddr); | 1067 | priv->hw->dma->stop_tx(priv->ioaddr); |
| @@ -1789,13 +1724,77 @@ static const struct net_device_ops stmmac_netdev_ops = { | |||
| 1789 | }; | 1724 | }; |
| 1790 | 1725 | ||
| 1791 | /** | 1726 | /** |
| 1727 | * stmmac_hw_init - Init the MAC device | ||
| 1728 | * @priv : pointer to the private device structure. | ||
| 1729 | * Description: this function detects which MAC device | ||
| 1730 | * (GMAC/MAC10-100) has to attached, checks the HW capability | ||
| 1731 | * (if supported) and sets the driver's features (for example | ||
| 1732 | * to use the ring or chaine mode or support the normal/enh | ||
| 1733 | * descriptor structure). | ||
| 1734 | */ | ||
| 1735 | static int stmmac_hw_init(struct stmmac_priv *priv) | ||
| 1736 | { | ||
| 1737 | int ret = 0; | ||
| 1738 | struct mac_device_info *mac; | ||
| 1739 | |||
| 1740 | /* Identify the MAC HW device */ | ||
| 1741 | if (priv->plat->has_gmac) | ||
| 1742 | mac = dwmac1000_setup(priv->ioaddr); | ||
| 1743 | else | ||
| 1744 | mac = dwmac100_setup(priv->ioaddr); | ||
| 1745 | if (!mac) | ||
| 1746 | return -ENOMEM; | ||
| 1747 | |||
| 1748 | priv->hw = mac; | ||
| 1749 | |||
| 1750 | /* To use the chained or ring mode */ | ||
| 1751 | priv->hw->ring = &ring_mode_ops; | ||
| 1752 | |||
| 1753 | /* Get and dump the chip ID */ | ||
| 1754 | stmmac_get_synopsys_id(priv); | ||
| 1755 | |||
| 1756 | /* Get the HW capability (new GMAC newer than 3.50a) */ | ||
| 1757 | priv->hw_cap_support = stmmac_get_hw_features(priv); | ||
| 1758 | if (priv->hw_cap_support) { | ||
| 1759 | pr_info(" DMA HW capability register supported"); | ||
| 1760 | |||
| 1761 | /* We can override some gmac/dma configuration fields: e.g. | ||
| 1762 | * enh_desc, tx_coe (e.g. that are passed through the | ||
| 1763 | * platform) with the values from the HW capability | ||
| 1764 | * register (if supported). | ||
| 1765 | */ | ||
| 1766 | priv->plat->enh_desc = priv->dma_cap.enh_desc; | ||
| 1767 | priv->plat->tx_coe = priv->dma_cap.tx_coe; | ||
| 1768 | priv->plat->pmt = priv->dma_cap.pmt_remote_wake_up; | ||
| 1769 | } else | ||
| 1770 | pr_info(" No HW DMA feature register supported"); | ||
| 1771 | |||
| 1772 | /* Select the enhnaced/normal descriptor structures */ | ||
| 1773 | stmmac_selec_desc_mode(priv); | ||
| 1774 | |||
| 1775 | priv->rx_coe = priv->hw->mac->rx_coe(priv->ioaddr); | ||
| 1776 | if (priv->rx_coe) | ||
| 1777 | pr_info(" RX Checksum Offload Engine supported\n"); | ||
| 1778 | if (priv->plat->tx_coe) | ||
| 1779 | pr_info(" TX Checksum insertion supported\n"); | ||
| 1780 | |||
| 1781 | if (priv->plat->pmt) { | ||
| 1782 | pr_info(" Wake-Up On Lan supported\n"); | ||
| 1783 | device_set_wakeup_capable(priv->device, 1); | ||
| 1784 | } | ||
| 1785 | |||
| 1786 | return ret; | ||
| 1787 | } | ||
| 1788 | |||
| 1789 | /** | ||
| 1792 | * stmmac_dvr_probe | 1790 | * stmmac_dvr_probe |
| 1793 | * @device: device pointer | 1791 | * @device: device pointer |
| 1794 | * Description: this is the main probe function used to | 1792 | * Description: this is the main probe function used to |
| 1795 | * call the alloc_etherdev, allocate the priv structure. | 1793 | * call the alloc_etherdev, allocate the priv structure. |
| 1796 | */ | 1794 | */ |
| 1797 | struct stmmac_priv *stmmac_dvr_probe(struct device *device, | 1795 | struct stmmac_priv *stmmac_dvr_probe(struct device *device, |
| 1798 | struct plat_stmmacenet_data *plat_dat) | 1796 | struct plat_stmmacenet_data *plat_dat, |
| 1797 | void __iomem *addr) | ||
| 1799 | { | 1798 | { |
| 1800 | int ret = 0; | 1799 | int ret = 0; |
| 1801 | struct net_device *ndev = NULL; | 1800 | struct net_device *ndev = NULL; |
| @@ -1815,10 +1814,27 @@ struct stmmac_priv *stmmac_dvr_probe(struct device *device, | |||
| 1815 | 1814 | ||
| 1816 | ether_setup(ndev); | 1815 | ether_setup(ndev); |
| 1817 | 1816 | ||
| 1818 | ndev->netdev_ops = &stmmac_netdev_ops; | ||
| 1819 | stmmac_set_ethtool_ops(ndev); | 1817 | stmmac_set_ethtool_ops(ndev); |
| 1818 | priv->pause = pause; | ||
| 1819 | priv->plat = plat_dat; | ||
| 1820 | priv->ioaddr = addr; | ||
| 1821 | priv->dev->base_addr = (unsigned long)addr; | ||
| 1822 | |||
| 1823 | /* Verify driver arguments */ | ||
| 1824 | stmmac_verify_args(); | ||
| 1825 | |||
| 1826 | /* Override with kernel parameters if supplied XXX CRS XXX | ||
| 1827 | * this needs to have multiple instances */ | ||
| 1828 | if ((phyaddr >= 0) && (phyaddr <= 31)) | ||
| 1829 | priv->plat->phy_addr = phyaddr; | ||
| 1830 | |||
| 1831 | /* Init MAC and get the capabilities */ | ||
| 1832 | stmmac_hw_init(priv); | ||
| 1833 | |||
| 1834 | ndev->netdev_ops = &stmmac_netdev_ops; | ||
| 1820 | 1835 | ||
| 1821 | ndev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM; | 1836 | ndev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | |
| 1837 | NETIF_F_RXCSUM; | ||
| 1822 | ndev->features |= ndev->hw_features | NETIF_F_HIGHDMA; | 1838 | ndev->features |= ndev->hw_features | NETIF_F_HIGHDMA; |
| 1823 | ndev->watchdog_timeo = msecs_to_jiffies(watchdog); | 1839 | ndev->watchdog_timeo = msecs_to_jiffies(watchdog); |
| 1824 | #ifdef STMMAC_VLAN_TAG_USED | 1840 | #ifdef STMMAC_VLAN_TAG_USED |
| @@ -1830,8 +1846,6 @@ struct stmmac_priv *stmmac_dvr_probe(struct device *device, | |||
| 1830 | if (flow_ctrl) | 1846 | if (flow_ctrl) |
| 1831 | priv->flow_ctrl = FLOW_AUTO; /* RX/TX pause on */ | 1847 | priv->flow_ctrl = FLOW_AUTO; /* RX/TX pause on */ |
| 1832 | 1848 | ||
| 1833 | priv->pause = pause; | ||
| 1834 | priv->plat = plat_dat; | ||
| 1835 | netif_napi_add(ndev, &priv->napi, stmmac_poll, 64); | 1849 | netif_napi_add(ndev, &priv->napi, stmmac_poll, 64); |
| 1836 | 1850 | ||
| 1837 | spin_lock_init(&priv->lock); | 1851 | spin_lock_init(&priv->lock); |
| @@ -1839,15 +1853,10 @@ struct stmmac_priv *stmmac_dvr_probe(struct device *device, | |||
| 1839 | 1853 | ||
| 1840 | ret = register_netdev(ndev); | 1854 | ret = register_netdev(ndev); |
| 1841 | if (ret) { | 1855 | if (ret) { |
| 1842 | pr_err("%s: ERROR %i registering the device\n", | 1856 | pr_err("%s: ERROR %i registering the device\n", __func__, ret); |
| 1843 | __func__, ret); | ||
| 1844 | goto error; | 1857 | goto error; |
| 1845 | } | 1858 | } |
| 1846 | 1859 | ||
| 1847 | DBG(probe, DEBUG, "%s: Scatter/Gather: %s - HW checksums: %s\n", | ||
| 1848 | ndev->name, (ndev->features & NETIF_F_SG) ? "on" : "off", | ||
| 1849 | (ndev->features & NETIF_F_IP_CSUM) ? "on" : "off"); | ||
| 1850 | |||
| 1851 | return priv; | 1860 | return priv; |
| 1852 | 1861 | ||
| 1853 | error: | 1862 | error: |
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c index c796de9eed72..50ad5b80cfaf 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c | |||
| @@ -96,13 +96,11 @@ static int __devinit stmmac_pci_probe(struct pci_dev *pdev, | |||
| 96 | 96 | ||
| 97 | stmmac_default_data(); | 97 | stmmac_default_data(); |
| 98 | 98 | ||
| 99 | priv = stmmac_dvr_probe(&(pdev->dev), &plat_dat); | 99 | priv = stmmac_dvr_probe(&(pdev->dev), &plat_dat, addr); |
| 100 | if (!priv) { | 100 | if (!priv) { |
| 101 | pr_err("%s: main drivr probe failed", __func__); | 101 | pr_err("%s: main driver probe failed", __func__); |
| 102 | goto err_out; | 102 | goto err_out; |
| 103 | } | 103 | } |
| 104 | priv->ioaddr = addr; | ||
| 105 | priv->dev->base_addr = (unsigned long)addr; | ||
| 106 | priv->dev->irq = pdev->irq; | 104 | priv->dev->irq = pdev->irq; |
| 107 | priv->wol_irq = pdev->irq; | 105 | priv->wol_irq = pdev->irq; |
| 108 | 106 | ||
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c index 1ac83243649a..3aad9810237c 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c | |||
| @@ -59,16 +59,20 @@ static int stmmac_pltfr_probe(struct platform_device *pdev) | |||
| 59 | goto out_release_region; | 59 | goto out_release_region; |
| 60 | } | 60 | } |
| 61 | plat_dat = pdev->dev.platform_data; | 61 | plat_dat = pdev->dev.platform_data; |
| 62 | priv = stmmac_dvr_probe(&(pdev->dev), plat_dat); | 62 | |
| 63 | /* Custom initialisation (if needed)*/ | ||
| 64 | if (plat_dat->init) { | ||
| 65 | ret = plat_dat->init(pdev); | ||
| 66 | if (unlikely(ret)) | ||
| 67 | goto out_unmap; | ||
| 68 | } | ||
| 69 | |||
| 70 | priv = stmmac_dvr_probe(&(pdev->dev), plat_dat, addr); | ||
| 63 | if (!priv) { | 71 | if (!priv) { |
| 64 | pr_err("%s: main drivr probe failed", __func__); | 72 | pr_err("%s: main driver probe failed", __func__); |
| 65 | goto out_unmap; | 73 | goto out_unmap; |
| 66 | } | 74 | } |
| 67 | 75 | ||
| 68 | priv->ioaddr = addr; | ||
| 69 | /* Set the I/O base addr */ | ||
| 70 | priv->dev->base_addr = (unsigned long)addr; | ||
| 71 | |||
| 72 | /* Get the MAC information */ | 76 | /* Get the MAC information */ |
| 73 | priv->dev->irq = platform_get_irq_byname(pdev, "macirq"); | 77 | priv->dev->irq = platform_get_irq_byname(pdev, "macirq"); |
| 74 | if (priv->dev->irq == -ENXIO) { | 78 | if (priv->dev->irq == -ENXIO) { |
| @@ -92,13 +96,6 @@ static int stmmac_pltfr_probe(struct platform_device *pdev) | |||
| 92 | 96 | ||
| 93 | platform_set_drvdata(pdev, priv->dev); | 97 | platform_set_drvdata(pdev, priv->dev); |
| 94 | 98 | ||
| 95 | /* Custom initialisation */ | ||
| 96 | if (priv->plat->init) { | ||
| 97 | ret = priv->plat->init(pdev); | ||
| 98 | if (unlikely(ret)) | ||
| 99 | goto out_unmap; | ||
| 100 | } | ||
| 101 | |||
| 102 | pr_debug("STMMAC platform driver registration completed"); | 99 | pr_debug("STMMAC platform driver registration completed"); |
| 103 | 100 | ||
| 104 | return 0; | 101 | return 0; |
diff --git a/drivers/net/ethernet/ti/cpmac.c b/drivers/net/ethernet/ti/cpmac.c index 4d9a28ffd3c3..cbc8df78d84b 100644 --- a/drivers/net/ethernet/ti/cpmac.c +++ b/drivers/net/ethernet/ti/cpmac.c | |||
| @@ -1122,7 +1122,7 @@ static int __devinit cpmac_probe(struct platform_device *pdev) | |||
| 1122 | pdata = pdev->dev.platform_data; | 1122 | pdata = pdev->dev.platform_data; |
| 1123 | 1123 | ||
| 1124 | if (external_switch || dumb_switch) { | 1124 | if (external_switch || dumb_switch) { |
| 1125 | strncpy(mdio_bus_id, "0", MII_BUS_ID_SIZE); /* fixed phys bus */ | 1125 | strncpy(mdio_bus_id, "fixed-0", MII_BUS_ID_SIZE); /* fixed phys bus */ |
| 1126 | phy_id = pdev->id; | 1126 | phy_id = pdev->id; |
| 1127 | } else { | 1127 | } else { |
| 1128 | for (phy_id = 0; phy_id < PHY_MAX_ADDR; phy_id++) { | 1128 | for (phy_id = 0; phy_id < PHY_MAX_ADDR; phy_id++) { |
| @@ -1138,7 +1138,7 @@ static int __devinit cpmac_probe(struct platform_device *pdev) | |||
| 1138 | if (phy_id == PHY_MAX_ADDR) { | 1138 | if (phy_id == PHY_MAX_ADDR) { |
| 1139 | dev_err(&pdev->dev, "no PHY present, falling back " | 1139 | dev_err(&pdev->dev, "no PHY present, falling back " |
| 1140 | "to switch on MDIO bus 0\n"); | 1140 | "to switch on MDIO bus 0\n"); |
| 1141 | strncpy(mdio_bus_id, "0", MII_BUS_ID_SIZE); /* fixed phys bus */ | 1141 | strncpy(mdio_bus_id, "fixed-0", MII_BUS_ID_SIZE); /* fixed phys bus */ |
| 1142 | phy_id = pdev->id; | 1142 | phy_id = pdev->id; |
| 1143 | } | 1143 | } |
| 1144 | 1144 | ||
diff --git a/drivers/net/ethernet/xscale/ixp4xx_eth.c b/drivers/net/ethernet/xscale/ixp4xx_eth.c index 72a854f05bb8..41a8b5a9849e 100644 --- a/drivers/net/ethernet/xscale/ixp4xx_eth.c +++ b/drivers/net/ethernet/xscale/ixp4xx_eth.c | |||
| @@ -1416,7 +1416,8 @@ static int __devinit eth_init_one(struct platform_device *pdev) | |||
| 1416 | __raw_writel(DEFAULT_CORE_CNTRL, &port->regs->core_control); | 1416 | __raw_writel(DEFAULT_CORE_CNTRL, &port->regs->core_control); |
| 1417 | udelay(50); | 1417 | udelay(50); |
| 1418 | 1418 | ||
| 1419 | snprintf(phy_id, MII_BUS_ID_SIZE + 3, PHY_ID_FMT, "0", plat->phy); | 1419 | snprintf(phy_id, MII_BUS_ID_SIZE + 3, PHY_ID_FMT, |
| 1420 | mdio_bus->id, plat->phy); | ||
| 1420 | port->phydev = phy_connect(dev, phy_id, &ixp4xx_adjust_link, 0, | 1421 | port->phydev = phy_connect(dev, phy_id, &ixp4xx_adjust_link, 0, |
| 1421 | PHY_INTERFACE_MODE_MII); | 1422 | PHY_INTERFACE_MODE_MII); |
| 1422 | if (IS_ERR(port->phydev)) { | 1423 | if (IS_ERR(port->phydev)) { |
diff --git a/drivers/net/usb/ipheth.c b/drivers/net/usb/ipheth.c index e84662db51cc..dd78c4cbd459 100644 --- a/drivers/net/usb/ipheth.c +++ b/drivers/net/usb/ipheth.c | |||
| @@ -60,6 +60,7 @@ | |||
| 60 | #define USB_PRODUCT_IPHONE_3GS 0x1294 | 60 | #define USB_PRODUCT_IPHONE_3GS 0x1294 |
| 61 | #define USB_PRODUCT_IPHONE_4 0x1297 | 61 | #define USB_PRODUCT_IPHONE_4 0x1297 |
| 62 | #define USB_PRODUCT_IPHONE_4_VZW 0x129c | 62 | #define USB_PRODUCT_IPHONE_4_VZW 0x129c |
| 63 | #define USB_PRODUCT_IPHONE_4S 0x12a0 | ||
| 63 | 64 | ||
| 64 | #define IPHETH_USBINTF_CLASS 255 | 65 | #define IPHETH_USBINTF_CLASS 255 |
| 65 | #define IPHETH_USBINTF_SUBCLASS 253 | 66 | #define IPHETH_USBINTF_SUBCLASS 253 |
| @@ -103,6 +104,10 @@ static struct usb_device_id ipheth_table[] = { | |||
| 103 | USB_VENDOR_APPLE, USB_PRODUCT_IPHONE_4_VZW, | 104 | USB_VENDOR_APPLE, USB_PRODUCT_IPHONE_4_VZW, |
| 104 | IPHETH_USBINTF_CLASS, IPHETH_USBINTF_SUBCLASS, | 105 | IPHETH_USBINTF_CLASS, IPHETH_USBINTF_SUBCLASS, |
| 105 | IPHETH_USBINTF_PROTO) }, | 106 | IPHETH_USBINTF_PROTO) }, |
| 107 | { USB_DEVICE_AND_INTERFACE_INFO( | ||
| 108 | USB_VENDOR_APPLE, USB_PRODUCT_IPHONE_4S, | ||
| 109 | IPHETH_USBINTF_CLASS, IPHETH_USBINTF_SUBCLASS, | ||
| 110 | IPHETH_USBINTF_PROTO) }, | ||
| 106 | { } | 111 | { } |
| 107 | }; | 112 | }; |
| 108 | MODULE_DEVICE_TABLE(usb, ipheth_table); | 113 | MODULE_DEVICE_TABLE(usb, ipheth_table); |
diff --git a/drivers/net/veth.c b/drivers/net/veth.c index 49f4667e1fa3..4a3402898f2a 100644 --- a/drivers/net/veth.c +++ b/drivers/net/veth.c | |||
| @@ -422,7 +422,9 @@ static void veth_dellink(struct net_device *dev, struct list_head *head) | |||
| 422 | unregister_netdevice_queue(peer, head); | 422 | unregister_netdevice_queue(peer, head); |
| 423 | } | 423 | } |
| 424 | 424 | ||
| 425 | static const struct nla_policy veth_policy[VETH_INFO_MAX + 1]; | 425 | static const struct nla_policy veth_policy[VETH_INFO_MAX + 1] = { |
| 426 | [VETH_INFO_PEER] = { .len = sizeof(struct ifinfomsg) }, | ||
| 427 | }; | ||
| 426 | 428 | ||
| 427 | static struct rtnl_link_ops veth_link_ops = { | 429 | static struct rtnl_link_ops veth_link_ops = { |
| 428 | .kind = DRV_NAME, | 430 | .kind = DRV_NAME, |
diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c index 39e0907a3c4e..9245d882c06a 100644 --- a/drivers/net/wireless/rtlwifi/pci.c +++ b/drivers/net/wireless/rtlwifi/pci.c | |||
| @@ -1501,7 +1501,7 @@ static int rtl_pci_init(struct ieee80211_hw *hw, struct pci_dev *pdev) | |||
| 1501 | return err; | 1501 | return err; |
| 1502 | } | 1502 | } |
| 1503 | 1503 | ||
| 1504 | return 1; | 1504 | return 0; |
| 1505 | } | 1505 | } |
| 1506 | 1506 | ||
| 1507 | static int rtl_pci_start(struct ieee80211_hw *hw) | 1507 | static int rtl_pci_start(struct ieee80211_hw *hw) |
| @@ -1870,7 +1870,7 @@ int __devinit rtl_pci_probe(struct pci_dev *pdev, | |||
| 1870 | } | 1870 | } |
| 1871 | 1871 | ||
| 1872 | /* Init PCI sw */ | 1872 | /* Init PCI sw */ |
| 1873 | err = !rtl_pci_init(hw, pdev); | 1873 | err = rtl_pci_init(hw, pdev); |
| 1874 | if (err) { | 1874 | if (err) { |
| 1875 | RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, | 1875 | RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, |
| 1876 | ("Failed to init PCI.\n")); | 1876 | ("Failed to init PCI.\n")); |
diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c index 0321fa3b4226..0dab5ecf61bb 100644 --- a/drivers/pci/iov.c +++ b/drivers/pci/iov.c | |||
| @@ -347,8 +347,6 @@ static int sriov_enable(struct pci_dev *dev, int nr_virtfn) | |||
| 347 | return rc; | 347 | return rc; |
| 348 | } | 348 | } |
| 349 | 349 | ||
| 350 | pci_write_config_dword(dev, iov->pos + PCI_SRIOV_SYS_PGSIZE, iov->pgsz); | ||
| 351 | |||
| 352 | iov->ctrl |= PCI_SRIOV_CTRL_VFE | PCI_SRIOV_CTRL_MSE; | 350 | iov->ctrl |= PCI_SRIOV_CTRL_VFE | PCI_SRIOV_CTRL_MSE; |
| 353 | pci_cfg_access_lock(dev); | 351 | pci_cfg_access_lock(dev); |
| 354 | pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, iov->ctrl); | 352 | pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, iov->ctrl); |
| @@ -466,6 +464,7 @@ found: | |||
| 466 | return -EIO; | 464 | return -EIO; |
| 467 | 465 | ||
| 468 | pgsz &= ~(pgsz - 1); | 466 | pgsz &= ~(pgsz - 1); |
| 467 | pci_write_config_dword(dev, pos + PCI_SRIOV_SYS_PGSIZE, pgsz); | ||
| 469 | 468 | ||
| 470 | nres = 0; | 469 | nres = 0; |
| 471 | for (i = 0; i < PCI_SRIOV_NUM_BARS; i++) { | 470 | for (i = 0; i < PCI_SRIOV_NUM_BARS; i++) { |
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 7cc9e2f0f47c..71eac9cd724d 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c | |||
| @@ -651,6 +651,11 @@ int __devinit pci_scan_bridge(struct pci_bus *bus, struct pci_dev *dev, int max, | |||
| 651 | dev_dbg(&dev->dev, "scanning [bus %02x-%02x] behind bridge, pass %d\n", | 651 | dev_dbg(&dev->dev, "scanning [bus %02x-%02x] behind bridge, pass %d\n", |
| 652 | secondary, subordinate, pass); | 652 | secondary, subordinate, pass); |
| 653 | 653 | ||
| 654 | if (!primary && (primary != bus->number) && secondary && subordinate) { | ||
| 655 | dev_warn(&dev->dev, "Primary bus is hard wired to 0\n"); | ||
| 656 | primary = bus->number; | ||
| 657 | } | ||
| 658 | |||
| 654 | /* Check if setup is sensible at all */ | 659 | /* Check if setup is sensible at all */ |
| 655 | if (!pass && | 660 | if (!pass && |
| 656 | (primary != bus->number || secondary <= bus->number)) { | 661 | (primary != bus->number || secondary <= bus->number)) { |
diff --git a/drivers/pci/remove.c b/drivers/pci/remove.c index 6def3624c688..ef8b18c48f26 100644 --- a/drivers/pci/remove.c +++ b/drivers/pci/remove.c | |||
| @@ -77,6 +77,7 @@ void pci_remove_bus(struct pci_bus *pci_bus) | |||
| 77 | } | 77 | } |
| 78 | EXPORT_SYMBOL(pci_remove_bus); | 78 | EXPORT_SYMBOL(pci_remove_bus); |
| 79 | 79 | ||
| 80 | static void __pci_remove_behind_bridge(struct pci_dev *dev); | ||
| 80 | /** | 81 | /** |
| 81 | * pci_remove_bus_device - remove a PCI device and any children | 82 | * pci_remove_bus_device - remove a PCI device and any children |
| 82 | * @dev: the device to remove | 83 | * @dev: the device to remove |
| @@ -94,7 +95,7 @@ static void __pci_remove_bus_device(struct pci_dev *dev) | |||
| 94 | if (dev->subordinate) { | 95 | if (dev->subordinate) { |
| 95 | struct pci_bus *b = dev->subordinate; | 96 | struct pci_bus *b = dev->subordinate; |
| 96 | 97 | ||
| 97 | pci_remove_behind_bridge(dev); | 98 | __pci_remove_behind_bridge(dev); |
| 98 | pci_remove_bus(b); | 99 | pci_remove_bus(b); |
| 99 | dev->subordinate = NULL; | 100 | dev->subordinate = NULL; |
| 100 | } | 101 | } |
| @@ -107,6 +108,24 @@ void pci_remove_bus_device(struct pci_dev *dev) | |||
| 107 | __pci_remove_bus_device(dev); | 108 | __pci_remove_bus_device(dev); |
| 108 | } | 109 | } |
| 109 | 110 | ||
| 111 | static void __pci_remove_behind_bridge(struct pci_dev *dev) | ||
| 112 | { | ||
| 113 | struct list_head *l, *n; | ||
| 114 | |||
| 115 | if (dev->subordinate) | ||
| 116 | list_for_each_safe(l, n, &dev->subordinate->devices) | ||
| 117 | __pci_remove_bus_device(pci_dev_b(l)); | ||
| 118 | } | ||
| 119 | |||
| 120 | static void pci_stop_behind_bridge(struct pci_dev *dev) | ||
| 121 | { | ||
| 122 | struct list_head *l, *n; | ||
| 123 | |||
| 124 | if (dev->subordinate) | ||
| 125 | list_for_each_safe(l, n, &dev->subordinate->devices) | ||
| 126 | pci_stop_bus_device(pci_dev_b(l)); | ||
| 127 | } | ||
| 128 | |||
| 110 | /** | 129 | /** |
| 111 | * pci_remove_behind_bridge - remove all devices behind a PCI bridge | 130 | * pci_remove_behind_bridge - remove all devices behind a PCI bridge |
| 112 | * @dev: PCI bridge device | 131 | * @dev: PCI bridge device |
| @@ -117,11 +136,8 @@ void pci_remove_bus_device(struct pci_dev *dev) | |||
| 117 | */ | 136 | */ |
| 118 | void pci_remove_behind_bridge(struct pci_dev *dev) | 137 | void pci_remove_behind_bridge(struct pci_dev *dev) |
| 119 | { | 138 | { |
| 120 | struct list_head *l, *n; | 139 | pci_stop_behind_bridge(dev); |
| 121 | 140 | __pci_remove_behind_bridge(dev); | |
| 122 | if (dev->subordinate) | ||
| 123 | list_for_each_safe(l, n, &dev->subordinate->devices) | ||
| 124 | __pci_remove_bus_device(pci_dev_b(l)); | ||
| 125 | } | 141 | } |
| 126 | 142 | ||
| 127 | static void pci_stop_bus_devices(struct pci_bus *bus) | 143 | static void pci_stop_bus_devices(struct pci_bus *bus) |
diff --git a/drivers/pci/xen-pcifront.c b/drivers/pci/xen-pcifront.c index 7cf3d2fcf56a..1620088a0e7e 100644 --- a/drivers/pci/xen-pcifront.c +++ b/drivers/pci/xen-pcifront.c | |||
| @@ -189,7 +189,7 @@ static int pcifront_bus_read(struct pci_bus *bus, unsigned int devfn, | |||
| 189 | 189 | ||
| 190 | if (verbose_request) | 190 | if (verbose_request) |
| 191 | dev_info(&pdev->xdev->dev, | 191 | dev_info(&pdev->xdev->dev, |
| 192 | "read dev=%04x:%02x:%02x.%01x - offset %x size %d\n", | 192 | "read dev=%04x:%02x:%02x.%d - offset %x size %d\n", |
| 193 | pci_domain_nr(bus), bus->number, PCI_SLOT(devfn), | 193 | pci_domain_nr(bus), bus->number, PCI_SLOT(devfn), |
| 194 | PCI_FUNC(devfn), where, size); | 194 | PCI_FUNC(devfn), where, size); |
| 195 | 195 | ||
| @@ -228,7 +228,7 @@ static int pcifront_bus_write(struct pci_bus *bus, unsigned int devfn, | |||
| 228 | 228 | ||
| 229 | if (verbose_request) | 229 | if (verbose_request) |
| 230 | dev_info(&pdev->xdev->dev, | 230 | dev_info(&pdev->xdev->dev, |
| 231 | "write dev=%04x:%02x:%02x.%01x - " | 231 | "write dev=%04x:%02x:%02x.%d - " |
| 232 | "offset %x size %d val %x\n", | 232 | "offset %x size %d val %x\n", |
| 233 | pci_domain_nr(bus), bus->number, | 233 | pci_domain_nr(bus), bus->number, |
| 234 | PCI_SLOT(devfn), PCI_FUNC(devfn), where, size, val); | 234 | PCI_SLOT(devfn), PCI_FUNC(devfn), where, size, val); |
| @@ -432,7 +432,7 @@ static int __devinit pcifront_scan_bus(struct pcifront_device *pdev, | |||
| 432 | d = pci_scan_single_device(b, devfn); | 432 | d = pci_scan_single_device(b, devfn); |
| 433 | if (d) | 433 | if (d) |
| 434 | dev_info(&pdev->xdev->dev, "New device on " | 434 | dev_info(&pdev->xdev->dev, "New device on " |
| 435 | "%04x:%02x:%02x.%02x found.\n", domain, bus, | 435 | "%04x:%02x:%02x.%d found.\n", domain, bus, |
| 436 | PCI_SLOT(devfn), PCI_FUNC(devfn)); | 436 | PCI_SLOT(devfn), PCI_FUNC(devfn)); |
| 437 | } | 437 | } |
| 438 | 438 | ||
| @@ -1041,7 +1041,7 @@ static int pcifront_detach_devices(struct pcifront_device *pdev) | |||
| 1041 | pci_dev = pci_get_slot(pci_bus, PCI_DEVFN(slot, func)); | 1041 | pci_dev = pci_get_slot(pci_bus, PCI_DEVFN(slot, func)); |
| 1042 | if (!pci_dev) { | 1042 | if (!pci_dev) { |
| 1043 | dev_dbg(&pdev->xdev->dev, | 1043 | dev_dbg(&pdev->xdev->dev, |
| 1044 | "Cannot get PCI device %04x:%02x:%02x.%02x\n", | 1044 | "Cannot get PCI device %04x:%02x:%02x.%d\n", |
| 1045 | domain, bus, slot, func); | 1045 | domain, bus, slot, func); |
| 1046 | continue; | 1046 | continue; |
| 1047 | } | 1047 | } |
| @@ -1049,7 +1049,7 @@ static int pcifront_detach_devices(struct pcifront_device *pdev) | |||
| 1049 | pci_dev_put(pci_dev); | 1049 | pci_dev_put(pci_dev); |
| 1050 | 1050 | ||
| 1051 | dev_dbg(&pdev->xdev->dev, | 1051 | dev_dbg(&pdev->xdev->dev, |
| 1052 | "PCI device %04x:%02x:%02x.%02x removed.\n", | 1052 | "PCI device %04x:%02x:%02x.%d removed.\n", |
| 1053 | domain, bus, slot, func); | 1053 | domain, bus, slot, func); |
| 1054 | } | 1054 | } |
| 1055 | 1055 | ||
diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c index 8fe15cf15ac8..894cd5e103da 100644 --- a/drivers/pinctrl/core.c +++ b/drivers/pinctrl/core.c | |||
| @@ -189,7 +189,7 @@ static int pinctrl_register_one_pin(struct pinctrl_dev *pctldev, | |||
| 189 | pindesc->pctldev = pctldev; | 189 | pindesc->pctldev = pctldev; |
| 190 | 190 | ||
| 191 | /* Copy basic pin info */ | 191 | /* Copy basic pin info */ |
| 192 | if (pindesc->name) { | 192 | if (name) { |
| 193 | pindesc->name = name; | 193 | pindesc->name = name; |
| 194 | } else { | 194 | } else { |
| 195 | pindesc->name = kasprintf(GFP_KERNEL, "PIN%u", number); | 195 | pindesc->name = kasprintf(GFP_KERNEL, "PIN%u", number); |
diff --git a/drivers/platform/x86/ibm_rtl.c b/drivers/platform/x86/ibm_rtl.c index 42a7d603c870..7481146a5b47 100644 --- a/drivers/platform/x86/ibm_rtl.c +++ b/drivers/platform/x86/ibm_rtl.c | |||
| @@ -33,6 +33,8 @@ | |||
| 33 | #include <linux/mutex.h> | 33 | #include <linux/mutex.h> |
| 34 | #include <asm/bios_ebda.h> | 34 | #include <asm/bios_ebda.h> |
| 35 | 35 | ||
| 36 | #include <asm-generic/io-64-nonatomic-lo-hi.h> | ||
| 37 | |||
| 36 | static bool force; | 38 | static bool force; |
| 37 | module_param(force, bool, 0); | 39 | module_param(force, bool, 0); |
| 38 | MODULE_PARM_DESC(force, "Force driver load, ignore DMI data"); | 40 | MODULE_PARM_DESC(force, "Force driver load, ignore DMI data"); |
| @@ -83,19 +85,6 @@ static void __iomem *rtl_cmd_addr; | |||
| 83 | static u8 rtl_cmd_type; | 85 | static u8 rtl_cmd_type; |
| 84 | static u8 rtl_cmd_width; | 86 | static u8 rtl_cmd_width; |
| 85 | 87 | ||
| 86 | #ifndef readq | ||
| 87 | static inline __u64 readq(const volatile void __iomem *addr) | ||
| 88 | { | ||
| 89 | const volatile u32 __iomem *p = addr; | ||
| 90 | u32 low, high; | ||
| 91 | |||
| 92 | low = readl(p); | ||
| 93 | high = readl(p + 1); | ||
| 94 | |||
| 95 | return low + ((u64)high << 32); | ||
| 96 | } | ||
| 97 | #endif | ||
| 98 | |||
| 99 | static void __iomem *rtl_port_map(phys_addr_t addr, unsigned long len) | 88 | static void __iomem *rtl_port_map(phys_addr_t addr, unsigned long len) |
| 100 | { | 89 | { |
| 101 | if (rtl_cmd_type == RTL_ADDR_TYPE_MMIO) | 90 | if (rtl_cmd_type == RTL_ADDR_TYPE_MMIO) |
diff --git a/drivers/platform/x86/intel_ips.c b/drivers/platform/x86/intel_ips.c index 809a3ae943c6..88a98cff5a44 100644 --- a/drivers/platform/x86/intel_ips.c +++ b/drivers/platform/x86/intel_ips.c | |||
| @@ -77,6 +77,8 @@ | |||
| 77 | #include <asm/processor.h> | 77 | #include <asm/processor.h> |
| 78 | #include "intel_ips.h" | 78 | #include "intel_ips.h" |
| 79 | 79 | ||
| 80 | #include <asm-generic/io-64-nonatomic-lo-hi.h> | ||
| 81 | |||
| 80 | #define PCI_DEVICE_ID_INTEL_THERMAL_SENSOR 0x3b32 | 82 | #define PCI_DEVICE_ID_INTEL_THERMAL_SENSOR 0x3b32 |
| 81 | 83 | ||
| 82 | /* | 84 | /* |
| @@ -344,19 +346,6 @@ struct ips_driver { | |||
| 344 | static bool | 346 | static bool |
| 345 | ips_gpu_turbo_enabled(struct ips_driver *ips); | 347 | ips_gpu_turbo_enabled(struct ips_driver *ips); |
| 346 | 348 | ||
| 347 | #ifndef readq | ||
| 348 | static inline __u64 readq(const volatile void __iomem *addr) | ||
| 349 | { | ||
| 350 | const volatile u32 __iomem *p = addr; | ||
| 351 | u32 low, high; | ||
| 352 | |||
| 353 | low = readl(p); | ||
| 354 | high = readl(p + 1); | ||
| 355 | |||
| 356 | return low + ((u64)high << 32); | ||
| 357 | } | ||
| 358 | #endif | ||
| 359 | |||
| 360 | /** | 349 | /** |
| 361 | * ips_cpu_busy - is CPU busy? | 350 | * ips_cpu_busy - is CPU busy? |
| 362 | * @ips: IPS driver struct | 351 | * @ips: IPS driver struct |
diff --git a/drivers/power/bq27x00_battery.c b/drivers/power/bq27x00_battery.c index 98bf5676318d..1ed6ea0bad6e 100644 --- a/drivers/power/bq27x00_battery.c +++ b/drivers/power/bq27x00_battery.c | |||
| @@ -62,11 +62,10 @@ | |||
| 62 | 62 | ||
| 63 | #define BQ27500_REG_SOC 0x2C | 63 | #define BQ27500_REG_SOC 0x2C |
| 64 | #define BQ27500_REG_DCAP 0x3C /* Design capacity */ | 64 | #define BQ27500_REG_DCAP 0x3C /* Design capacity */ |
| 65 | #define BQ27500_FLAG_DSG BIT(0) /* Discharging */ | 65 | #define BQ27500_FLAG_DSC BIT(0) |
| 66 | #define BQ27500_FLAG_SOCF BIT(1) /* State-of-Charge threshold final */ | 66 | #define BQ27500_FLAG_SOCF BIT(1) /* State-of-Charge threshold final */ |
| 67 | #define BQ27500_FLAG_SOC1 BIT(2) /* State-of-Charge threshold 1 */ | 67 | #define BQ27500_FLAG_SOC1 BIT(2) /* State-of-Charge threshold 1 */ |
| 68 | #define BQ27500_FLAG_CHG BIT(8) /* Charging */ | 68 | #define BQ27500_FLAG_FC BIT(9) |
| 69 | #define BQ27500_FLAG_FC BIT(9) /* Fully charged */ | ||
| 70 | 69 | ||
| 71 | #define BQ27000_RS 20 /* Resistor sense */ | 70 | #define BQ27000_RS 20 /* Resistor sense */ |
| 72 | 71 | ||
| @@ -312,7 +311,7 @@ static void bq27x00_update(struct bq27x00_device_info *di) | |||
| 312 | struct bq27x00_reg_cache cache = {0, }; | 311 | struct bq27x00_reg_cache cache = {0, }; |
| 313 | bool is_bq27500 = di->chip == BQ27500; | 312 | bool is_bq27500 = di->chip == BQ27500; |
| 314 | 313 | ||
| 315 | cache.flags = bq27x00_read(di, BQ27x00_REG_FLAGS, is_bq27500); | 314 | cache.flags = bq27x00_read(di, BQ27x00_REG_FLAGS, !is_bq27500); |
| 316 | if (cache.flags >= 0) { | 315 | if (cache.flags >= 0) { |
| 317 | if (!is_bq27500 && (cache.flags & BQ27000_FLAG_CI)) { | 316 | if (!is_bq27500 && (cache.flags & BQ27000_FLAG_CI)) { |
| 318 | dev_info(di->dev, "battery is not calibrated! ignoring capacity values\n"); | 317 | dev_info(di->dev, "battery is not calibrated! ignoring capacity values\n"); |
| @@ -401,14 +400,10 @@ static int bq27x00_battery_status(struct bq27x00_device_info *di, | |||
| 401 | if (di->chip == BQ27500) { | 400 | if (di->chip == BQ27500) { |
| 402 | if (di->cache.flags & BQ27500_FLAG_FC) | 401 | if (di->cache.flags & BQ27500_FLAG_FC) |
| 403 | status = POWER_SUPPLY_STATUS_FULL; | 402 | status = POWER_SUPPLY_STATUS_FULL; |
| 404 | else if (di->cache.flags & BQ27500_FLAG_DSG) | 403 | else if (di->cache.flags & BQ27500_FLAG_DSC) |
| 405 | status = POWER_SUPPLY_STATUS_DISCHARGING; | 404 | status = POWER_SUPPLY_STATUS_DISCHARGING; |
| 406 | else if (di->cache.flags & BQ27500_FLAG_CHG) | ||
| 407 | status = POWER_SUPPLY_STATUS_CHARGING; | ||
| 408 | else if (power_supply_am_i_supplied(&di->bat)) | ||
| 409 | status = POWER_SUPPLY_STATUS_NOT_CHARGING; | ||
| 410 | else | 405 | else |
| 411 | status = POWER_SUPPLY_STATUS_UNKNOWN; | 406 | status = POWER_SUPPLY_STATUS_CHARGING; |
| 412 | } else { | 407 | } else { |
| 413 | if (di->cache.flags & BQ27000_FLAG_FC) | 408 | if (di->cache.flags & BQ27000_FLAG_FC) |
| 414 | status = POWER_SUPPLY_STATUS_FULL; | 409 | status = POWER_SUPPLY_STATUS_FULL; |
diff --git a/drivers/power/charger-manager.c b/drivers/power/charger-manager.c index 0378d019efae..88fd9710bda2 100644 --- a/drivers/power/charger-manager.c +++ b/drivers/power/charger-manager.c | |||
| @@ -974,10 +974,11 @@ static int __devexit charger_manager_remove(struct platform_device *pdev) | |||
| 974 | return 0; | 974 | return 0; |
| 975 | } | 975 | } |
| 976 | 976 | ||
| 977 | const struct platform_device_id charger_manager_id[] = { | 977 | static const struct platform_device_id charger_manager_id[] = { |
| 978 | { "charger-manager", 0 }, | 978 | { "charger-manager", 0 }, |
| 979 | { }, | 979 | { }, |
| 980 | }; | 980 | }; |
| 981 | MODULE_DEVICE_TABLE(platform, charger_manager_id); | ||
| 981 | 982 | ||
| 982 | static int cm_suspend_prepare(struct device *dev) | 983 | static int cm_suspend_prepare(struct device *dev) |
| 983 | { | 984 | { |
| @@ -1069,4 +1070,3 @@ module_exit(charger_manager_cleanup); | |||
| 1069 | MODULE_AUTHOR("MyungJoo Ham <myungjoo.ham@samsung.com>"); | 1070 | MODULE_AUTHOR("MyungJoo Ham <myungjoo.ham@samsung.com>"); |
| 1070 | MODULE_DESCRIPTION("Charger Manager"); | 1071 | MODULE_DESCRIPTION("Charger Manager"); |
| 1071 | MODULE_LICENSE("GPL"); | 1072 | MODULE_LICENSE("GPL"); |
| 1072 | MODULE_ALIAS("charger-manager"); | ||
diff --git a/drivers/power/lp8727_charger.c b/drivers/power/lp8727_charger.c index b15b575c070c..c53dd1292f81 100644 --- a/drivers/power/lp8727_charger.c +++ b/drivers/power/lp8727_charger.c | |||
| @@ -464,6 +464,7 @@ static int __devexit lp8727_remove(struct i2c_client *cl) | |||
| 464 | 464 | ||
| 465 | static const struct i2c_device_id lp8727_ids[] = { | 465 | static const struct i2c_device_id lp8727_ids[] = { |
| 466 | {"lp8727", 0}, | 466 | {"lp8727", 0}, |
| 467 | { } | ||
| 467 | }; | 468 | }; |
| 468 | 469 | ||
| 469 | static struct i2c_driver lp8727_driver = { | 470 | static struct i2c_driver lp8727_driver = { |
diff --git a/drivers/regulator/max8649.c b/drivers/regulator/max8649.c index b06a2399587c..d0e1180ad961 100644 --- a/drivers/regulator/max8649.c +++ b/drivers/regulator/max8649.c | |||
| @@ -150,7 +150,7 @@ static int max8649_enable_time(struct regulator_dev *rdev) | |||
| 150 | if (ret != 0) | 150 | if (ret != 0) |
| 151 | return ret; | 151 | return ret; |
| 152 | val &= MAX8649_VOL_MASK; | 152 | val &= MAX8649_VOL_MASK; |
| 153 | voltage = max8649_list_voltage(rdev, (unsigned char)ret); /* uV */ | 153 | voltage = max8649_list_voltage(rdev, (unsigned char)val); /* uV */ |
| 154 | 154 | ||
| 155 | /* get rate */ | 155 | /* get rate */ |
| 156 | ret = regmap_read(info->regmap, MAX8649_RAMP, &val); | 156 | ret = regmap_read(info->regmap, MAX8649_RAMP, &val); |
diff --git a/drivers/regulator/mc13xxx-regulator-core.c b/drivers/regulator/mc13xxx-regulator-core.c index 80ecafef1bc3..62dcd0a432bb 100644 --- a/drivers/regulator/mc13xxx-regulator-core.c +++ b/drivers/regulator/mc13xxx-regulator-core.c | |||
| @@ -254,6 +254,7 @@ int __devinit mc13xxx_get_num_regulators_dt(struct platform_device *pdev) | |||
| 254 | 254 | ||
| 255 | return num; | 255 | return num; |
| 256 | } | 256 | } |
| 257 | EXPORT_SYMBOL_GPL(mc13xxx_get_num_regulators_dt); | ||
| 257 | 258 | ||
| 258 | struct mc13xxx_regulator_init_data * __devinit mc13xxx_parse_regulators_dt( | 259 | struct mc13xxx_regulator_init_data * __devinit mc13xxx_parse_regulators_dt( |
| 259 | struct platform_device *pdev, struct mc13xxx_regulator *regulators, | 260 | struct platform_device *pdev, struct mc13xxx_regulator *regulators, |
| @@ -291,6 +292,7 @@ struct mc13xxx_regulator_init_data * __devinit mc13xxx_parse_regulators_dt( | |||
| 291 | 292 | ||
| 292 | return data; | 293 | return data; |
| 293 | } | 294 | } |
| 295 | EXPORT_SYMBOL_GPL(mc13xxx_parse_regulators_dt); | ||
| 294 | #endif | 296 | #endif |
| 295 | 297 | ||
| 296 | MODULE_LICENSE("GPL v2"); | 298 | MODULE_LICENSE("GPL v2"); |
diff --git a/drivers/rtc/rtc-at91sam9.c b/drivers/rtc/rtc-at91sam9.c index a3ad957507dc..ee3c122c0599 100644 --- a/drivers/rtc/rtc-at91sam9.c +++ b/drivers/rtc/rtc-at91sam9.c | |||
| @@ -307,8 +307,12 @@ static int __init at91_rtc_probe(struct platform_device *pdev) | |||
| 307 | device_init_wakeup(&pdev->dev, 1); | 307 | device_init_wakeup(&pdev->dev, 1); |
| 308 | 308 | ||
| 309 | platform_set_drvdata(pdev, rtc); | 309 | platform_set_drvdata(pdev, rtc); |
| 310 | rtc->rtt = (void __force __iomem *) (AT91_VA_BASE_SYS - AT91_BASE_SYS); | 310 | rtc->rtt = ioremap(r->start, resource_size(r)); |
| 311 | rtc->rtt += r->start; | 311 | if (!rtc->rtt) { |
| 312 | dev_err(&pdev->dev, "failed to map registers, aborting.\n"); | ||
| 313 | ret = -ENOMEM; | ||
| 314 | goto fail; | ||
| 315 | } | ||
| 312 | 316 | ||
| 313 | mr = rtt_readl(rtc, MR); | 317 | mr = rtt_readl(rtc, MR); |
| 314 | 318 | ||
| @@ -326,7 +330,7 @@ static int __init at91_rtc_probe(struct platform_device *pdev) | |||
| 326 | &at91_rtc_ops, THIS_MODULE); | 330 | &at91_rtc_ops, THIS_MODULE); |
| 327 | if (IS_ERR(rtc->rtcdev)) { | 331 | if (IS_ERR(rtc->rtcdev)) { |
| 328 | ret = PTR_ERR(rtc->rtcdev); | 332 | ret = PTR_ERR(rtc->rtcdev); |
| 329 | goto fail; | 333 | goto fail_register; |
| 330 | } | 334 | } |
| 331 | 335 | ||
| 332 | /* register irq handler after we know what name we'll use */ | 336 | /* register irq handler after we know what name we'll use */ |
| @@ -351,6 +355,8 @@ static int __init at91_rtc_probe(struct platform_device *pdev) | |||
| 351 | 355 | ||
| 352 | return 0; | 356 | return 0; |
| 353 | 357 | ||
| 358 | fail_register: | ||
| 359 | iounmap(rtc->rtt); | ||
| 354 | fail: | 360 | fail: |
| 355 | platform_set_drvdata(pdev, NULL); | 361 | platform_set_drvdata(pdev, NULL); |
| 356 | kfree(rtc); | 362 | kfree(rtc); |
| @@ -371,6 +377,7 @@ static int __exit at91_rtc_remove(struct platform_device *pdev) | |||
| 371 | 377 | ||
| 372 | rtc_device_unregister(rtc->rtcdev); | 378 | rtc_device_unregister(rtc->rtcdev); |
| 373 | 379 | ||
| 380 | iounmap(rtc->rtt); | ||
| 374 | platform_set_drvdata(pdev, NULL); | 381 | platform_set_drvdata(pdev, NULL); |
| 375 | kfree(rtc); | 382 | kfree(rtc); |
| 376 | return 0; | 383 | return 0; |
diff --git a/drivers/s390/char/con3215.c b/drivers/s390/char/con3215.c index 934458ad55e5..e71a50d4b221 100644 --- a/drivers/s390/char/con3215.c +++ b/drivers/s390/char/con3215.c | |||
| @@ -87,6 +87,7 @@ struct raw3215_info { | |||
| 87 | struct tty_struct *tty; /* pointer to tty structure if present */ | 87 | struct tty_struct *tty; /* pointer to tty structure if present */ |
| 88 | struct raw3215_req *queued_read; /* pointer to queued read requests */ | 88 | struct raw3215_req *queued_read; /* pointer to queued read requests */ |
| 89 | struct raw3215_req *queued_write;/* pointer to queued write requests */ | 89 | struct raw3215_req *queued_write;/* pointer to queued write requests */ |
| 90 | struct tasklet_struct tlet; /* tasklet to invoke tty_wakeup */ | ||
| 90 | wait_queue_head_t empty_wait; /* wait queue for flushing */ | 91 | wait_queue_head_t empty_wait; /* wait queue for flushing */ |
| 91 | struct timer_list timer; /* timer for delayed output */ | 92 | struct timer_list timer; /* timer for delayed output */ |
| 92 | int line_pos; /* position on the line (for tabs) */ | 93 | int line_pos; /* position on the line (for tabs) */ |
| @@ -334,19 +335,23 @@ static inline void raw3215_try_io(struct raw3215_info *raw) | |||
| 334 | } | 335 | } |
| 335 | 336 | ||
| 336 | /* | 337 | /* |
| 338 | * Call tty_wakeup from tasklet context | ||
| 339 | */ | ||
| 340 | static void raw3215_wakeup(unsigned long data) | ||
| 341 | { | ||
| 342 | struct raw3215_info *raw = (struct raw3215_info *) data; | ||
| 343 | tty_wakeup(raw->tty); | ||
| 344 | } | ||
| 345 | |||
| 346 | /* | ||
| 337 | * Try to start the next IO and wake up processes waiting on the tty. | 347 | * Try to start the next IO and wake up processes waiting on the tty. |
| 338 | */ | 348 | */ |
| 339 | static void raw3215_next_io(struct raw3215_info *raw) | 349 | static void raw3215_next_io(struct raw3215_info *raw) |
| 340 | { | 350 | { |
| 341 | struct tty_struct *tty; | ||
| 342 | |||
| 343 | raw3215_mk_write_req(raw); | 351 | raw3215_mk_write_req(raw); |
| 344 | raw3215_try_io(raw); | 352 | raw3215_try_io(raw); |
| 345 | tty = raw->tty; | 353 | if (raw->tty && RAW3215_BUFFER_SIZE - raw->count >= RAW3215_MIN_SPACE) |
| 346 | if (tty != NULL && | 354 | tasklet_schedule(&raw->tlet); |
| 347 | RAW3215_BUFFER_SIZE - raw->count >= RAW3215_MIN_SPACE) { | ||
| 348 | tty_wakeup(tty); | ||
| 349 | } | ||
| 350 | } | 355 | } |
| 351 | 356 | ||
| 352 | /* | 357 | /* |
| @@ -682,6 +687,7 @@ static int raw3215_probe (struct ccw_device *cdev) | |||
| 682 | return -ENOMEM; | 687 | return -ENOMEM; |
| 683 | } | 688 | } |
| 684 | init_waitqueue_head(&raw->empty_wait); | 689 | init_waitqueue_head(&raw->empty_wait); |
| 690 | tasklet_init(&raw->tlet, raw3215_wakeup, (unsigned long) raw); | ||
| 685 | 691 | ||
| 686 | dev_set_drvdata(&cdev->dev, raw); | 692 | dev_set_drvdata(&cdev->dev, raw); |
| 687 | cdev->handler = raw3215_irq; | 693 | cdev->handler = raw3215_irq; |
| @@ -901,6 +907,7 @@ static int __init con3215_init(void) | |||
| 901 | 907 | ||
| 902 | raw->flags |= RAW3215_FIXED; | 908 | raw->flags |= RAW3215_FIXED; |
| 903 | init_waitqueue_head(&raw->empty_wait); | 909 | init_waitqueue_head(&raw->empty_wait); |
| 910 | tasklet_init(&raw->tlet, raw3215_wakeup, (unsigned long) raw); | ||
| 904 | 911 | ||
| 905 | /* Request the console irq */ | 912 | /* Request the console irq */ |
| 906 | if (raw3215_startup(raw) != 0) { | 913 | if (raw3215_startup(raw) != 0) { |
| @@ -966,6 +973,7 @@ static void tty3215_close(struct tty_struct *tty, struct file * filp) | |||
| 966 | tty->closing = 1; | 973 | tty->closing = 1; |
| 967 | /* Shutdown the terminal */ | 974 | /* Shutdown the terminal */ |
| 968 | raw3215_shutdown(raw); | 975 | raw3215_shutdown(raw); |
| 976 | tasklet_kill(&raw->tlet); | ||
| 969 | tty->closing = 0; | 977 | tty->closing = 0; |
| 970 | raw->tty = NULL; | 978 | raw->tty = NULL; |
| 971 | } | 979 | } |
diff --git a/drivers/scsi/qla4xxx/ql4_nx.c b/drivers/scsi/qla4xxx/ql4_nx.c index 78f1111158d7..65253dfbe962 100644 --- a/drivers/scsi/qla4xxx/ql4_nx.c +++ b/drivers/scsi/qla4xxx/ql4_nx.c | |||
| @@ -10,6 +10,8 @@ | |||
| 10 | #include "ql4_def.h" | 10 | #include "ql4_def.h" |
| 11 | #include "ql4_glbl.h" | 11 | #include "ql4_glbl.h" |
| 12 | 12 | ||
| 13 | #include <asm-generic/io-64-nonatomic-lo-hi.h> | ||
| 14 | |||
| 13 | #define MASK(n) DMA_BIT_MASK(n) | 15 | #define MASK(n) DMA_BIT_MASK(n) |
| 14 | #define MN_WIN(addr) (((addr & 0x1fc0000) >> 1) | ((addr >> 25) & 0x3ff)) | 16 | #define MN_WIN(addr) (((addr & 0x1fc0000) >> 1) | ((addr >> 25) & 0x3ff)) |
| 15 | #define OCM_WIN(addr) (((addr & 0x1ff0000) >> 1) | ((addr >> 25) & 0x3ff)) | 17 | #define OCM_WIN(addr) (((addr & 0x1ff0000) >> 1) | ((addr >> 25) & 0x3ff)) |
| @@ -655,27 +657,6 @@ static int qla4_8xxx_pci_is_same_window(struct scsi_qla_host *ha, | |||
| 655 | return 0; | 657 | return 0; |
| 656 | } | 658 | } |
| 657 | 659 | ||
| 658 | #ifndef readq | ||
| 659 | static inline __u64 readq(const volatile void __iomem *addr) | ||
| 660 | { | ||
| 661 | const volatile u32 __iomem *p = addr; | ||
| 662 | u32 low, high; | ||
| 663 | |||
| 664 | low = readl(p); | ||
| 665 | high = readl(p + 1); | ||
| 666 | |||
| 667 | return low + ((u64)high << 32); | ||
| 668 | } | ||
| 669 | #endif | ||
| 670 | |||
| 671 | #ifndef writeq | ||
| 672 | static inline void writeq(__u64 val, volatile void __iomem *addr) | ||
| 673 | { | ||
| 674 | writel(val, addr); | ||
| 675 | writel(val >> 32, addr+4); | ||
| 676 | } | ||
| 677 | #endif | ||
| 678 | |||
| 679 | static int qla4_8xxx_pci_mem_read_direct(struct scsi_qla_host *ha, | 660 | static int qla4_8xxx_pci_mem_read_direct(struct scsi_qla_host *ha, |
| 680 | u64 off, void *data, int size) | 661 | u64 off, void *data, int size) |
| 681 | { | 662 | { |
diff --git a/drivers/sh/clk/cpg.c b/drivers/sh/clk/cpg.c index 45fee368b092..92d314a73f69 100644 --- a/drivers/sh/clk/cpg.c +++ b/drivers/sh/clk/cpg.c | |||
| @@ -190,7 +190,7 @@ static int __init sh_clk_init_parent(struct clk *clk) | |||
| 190 | return -EINVAL; | 190 | return -EINVAL; |
| 191 | } | 191 | } |
| 192 | 192 | ||
| 193 | clk->parent = clk->parent_table[val]; | 193 | clk_reparent(clk, clk->parent_table[val]); |
| 194 | if (!clk->parent) { | 194 | if (!clk->parent) { |
| 195 | pr_err("sh_clk_init_parent: unable to set parent"); | 195 | pr_err("sh_clk_init_parent: unable to set parent"); |
| 196 | return -EINVAL; | 196 | return -EINVAL; |
diff --git a/drivers/usb/core/hcd-pci.c b/drivers/usb/core/hcd-pci.c index d136b8f4c8a7..81e2c0d9c17d 100644 --- a/drivers/usb/core/hcd-pci.c +++ b/drivers/usb/core/hcd-pci.c | |||
| @@ -187,7 +187,10 @@ int usb_hcd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) | |||
| 187 | return -ENODEV; | 187 | return -ENODEV; |
| 188 | dev->current_state = PCI_D0; | 188 | dev->current_state = PCI_D0; |
| 189 | 189 | ||
| 190 | if (!dev->irq) { | 190 | /* The xHCI driver supports MSI and MSI-X, |
| 191 | * so don't fail if the BIOS doesn't provide a legacy IRQ. | ||
| 192 | */ | ||
| 193 | if (!dev->irq && (driver->flags & HCD_MASK) != HCD_USB3) { | ||
| 191 | dev_err(&dev->dev, | 194 | dev_err(&dev->dev, |
| 192 | "Found HC with no IRQ. Check BIOS/PCI %s setup!\n", | 195 | "Found HC with no IRQ. Check BIOS/PCI %s setup!\n", |
| 193 | pci_name(dev)); | 196 | pci_name(dev)); |
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index eb19cba34ac9..e1282328fc27 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c | |||
| @@ -2447,8 +2447,10 @@ int usb_add_hcd(struct usb_hcd *hcd, | |||
| 2447 | && device_can_wakeup(&hcd->self.root_hub->dev)) | 2447 | && device_can_wakeup(&hcd->self.root_hub->dev)) |
| 2448 | dev_dbg(hcd->self.controller, "supports USB remote wakeup\n"); | 2448 | dev_dbg(hcd->self.controller, "supports USB remote wakeup\n"); |
| 2449 | 2449 | ||
| 2450 | /* enable irqs just before we start the controller */ | 2450 | /* enable irqs just before we start the controller, |
| 2451 | if (usb_hcd_is_primary_hcd(hcd)) { | 2451 | * if the BIOS provides legacy PCI irqs. |
| 2452 | */ | ||
| 2453 | if (usb_hcd_is_primary_hcd(hcd) && irqnum) { | ||
| 2452 | retval = usb_hcd_request_irqs(hcd, irqnum, irqflags); | 2454 | retval = usb_hcd_request_irqs(hcd, irqnum, irqflags); |
| 2453 | if (retval) | 2455 | if (retval) |
| 2454 | goto err_request_irq; | 2456 | goto err_request_irq; |
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index a0613d8f9be7..265c2f675d04 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
| @@ -705,10 +705,26 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type) | |||
| 705 | if (type == HUB_INIT3) | 705 | if (type == HUB_INIT3) |
| 706 | goto init3; | 706 | goto init3; |
| 707 | 707 | ||
| 708 | /* After a resume, port power should still be on. | 708 | /* The superspeed hub except for root hub has to use Hub Depth |
| 709 | * value as an offset into the route string to locate the bits | ||
| 710 | * it uses to determine the downstream port number. So hub driver | ||
| 711 | * should send a set hub depth request to superspeed hub after | ||
| 712 | * the superspeed hub is set configuration in initialization or | ||
| 713 | * reset procedure. | ||
| 714 | * | ||
| 715 | * After a resume, port power should still be on. | ||
| 709 | * For any other type of activation, turn it on. | 716 | * For any other type of activation, turn it on. |
| 710 | */ | 717 | */ |
| 711 | if (type != HUB_RESUME) { | 718 | if (type != HUB_RESUME) { |
| 719 | if (hdev->parent && hub_is_superspeed(hdev)) { | ||
| 720 | ret = usb_control_msg(hdev, usb_sndctrlpipe(hdev, 0), | ||
| 721 | HUB_SET_DEPTH, USB_RT_HUB, | ||
| 722 | hdev->level - 1, 0, NULL, 0, | ||
| 723 | USB_CTRL_SET_TIMEOUT); | ||
| 724 | if (ret < 0) | ||
| 725 | dev_err(hub->intfdev, | ||
| 726 | "set hub depth failed\n"); | ||
| 727 | } | ||
| 712 | 728 | ||
| 713 | /* Speed up system boot by using a delayed_work for the | 729 | /* Speed up system boot by using a delayed_work for the |
| 714 | * hub's initial power-up delays. This is pretty awkward | 730 | * hub's initial power-up delays. This is pretty awkward |
| @@ -987,18 +1003,6 @@ static int hub_configure(struct usb_hub *hub, | |||
| 987 | goto fail; | 1003 | goto fail; |
| 988 | } | 1004 | } |
| 989 | 1005 | ||
| 990 | if (hub_is_superspeed(hdev) && (hdev->parent != NULL)) { | ||
| 991 | ret = usb_control_msg(hdev, usb_sndctrlpipe(hdev, 0), | ||
| 992 | HUB_SET_DEPTH, USB_RT_HUB, | ||
| 993 | hdev->level - 1, 0, NULL, 0, | ||
| 994 | USB_CTRL_SET_TIMEOUT); | ||
| 995 | |||
| 996 | if (ret < 0) { | ||
| 997 | message = "can't set hub depth"; | ||
| 998 | goto fail; | ||
| 999 | } | ||
| 1000 | } | ||
| 1001 | |||
| 1002 | /* Request the entire hub descriptor. | 1006 | /* Request the entire hub descriptor. |
| 1003 | * hub->descriptor can handle USB_MAXCHILDREN ports, | 1007 | * hub->descriptor can handle USB_MAXCHILDREN ports, |
| 1004 | * but the hub can/will return fewer bytes here. | 1008 | * but the hub can/will return fewer bytes here. |
diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c index ac53a662a6a3..7732d69e49e0 100644 --- a/drivers/usb/host/pci-quirks.c +++ b/drivers/usb/host/pci-quirks.c | |||
| @@ -872,7 +872,17 @@ static void __devinit quirk_usb_early_handoff(struct pci_dev *pdev) | |||
| 872 | */ | 872 | */ |
| 873 | if (pdev->vendor == 0x184e) /* vendor Netlogic */ | 873 | if (pdev->vendor == 0x184e) /* vendor Netlogic */ |
| 874 | return; | 874 | return; |
| 875 | if (pdev->class != PCI_CLASS_SERIAL_USB_UHCI && | ||
| 876 | pdev->class != PCI_CLASS_SERIAL_USB_OHCI && | ||
| 877 | pdev->class != PCI_CLASS_SERIAL_USB_EHCI && | ||
| 878 | pdev->class != PCI_CLASS_SERIAL_USB_XHCI) | ||
| 879 | return; | ||
| 875 | 880 | ||
| 881 | if (pci_enable_device(pdev) < 0) { | ||
| 882 | dev_warn(&pdev->dev, "Can't enable PCI device, " | ||
| 883 | "BIOS handoff failed.\n"); | ||
| 884 | return; | ||
| 885 | } | ||
| 876 | if (pdev->class == PCI_CLASS_SERIAL_USB_UHCI) | 886 | if (pdev->class == PCI_CLASS_SERIAL_USB_UHCI) |
| 877 | quirk_usb_handoff_uhci(pdev); | 887 | quirk_usb_handoff_uhci(pdev); |
| 878 | else if (pdev->class == PCI_CLASS_SERIAL_USB_OHCI) | 888 | else if (pdev->class == PCI_CLASS_SERIAL_USB_OHCI) |
| @@ -881,5 +891,6 @@ static void __devinit quirk_usb_early_handoff(struct pci_dev *pdev) | |||
| 881 | quirk_usb_disable_ehci(pdev); | 891 | quirk_usb_disable_ehci(pdev); |
| 882 | else if (pdev->class == PCI_CLASS_SERIAL_USB_XHCI) | 892 | else if (pdev->class == PCI_CLASS_SERIAL_USB_XHCI) |
| 883 | quirk_usb_handoff_xhci(pdev); | 893 | quirk_usb_handoff_xhci(pdev); |
| 894 | pci_disable_device(pdev); | ||
| 884 | } | 895 | } |
| 885 | DECLARE_PCI_FIXUP_FINAL(PCI_ANY_ID, PCI_ANY_ID, quirk_usb_early_handoff); | 896 | DECLARE_PCI_FIXUP_FINAL(PCI_ANY_ID, PCI_ANY_ID, quirk_usb_early_handoff); |
diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c index 35e257f79c7b..557b6f32db86 100644 --- a/drivers/usb/host/xhci-hub.c +++ b/drivers/usb/host/xhci-hub.c | |||
| @@ -93,7 +93,7 @@ static void xhci_usb2_hub_descriptor(struct usb_hcd *hcd, struct xhci_hcd *xhci, | |||
| 93 | */ | 93 | */ |
| 94 | memset(port_removable, 0, sizeof(port_removable)); | 94 | memset(port_removable, 0, sizeof(port_removable)); |
| 95 | for (i = 0; i < ports; i++) { | 95 | for (i = 0; i < ports; i++) { |
| 96 | portsc = xhci_readl(xhci, xhci->usb3_ports[i]); | 96 | portsc = xhci_readl(xhci, xhci->usb2_ports[i]); |
| 97 | /* If a device is removable, PORTSC reports a 0, same as in the | 97 | /* If a device is removable, PORTSC reports a 0, same as in the |
| 98 | * hub descriptor DeviceRemovable bits. | 98 | * hub descriptor DeviceRemovable bits. |
| 99 | */ | 99 | */ |
diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c index 36cbe2226a44..383fc857491c 100644 --- a/drivers/usb/host/xhci-mem.c +++ b/drivers/usb/host/xhci-mem.c | |||
| @@ -1126,26 +1126,42 @@ static unsigned int xhci_parse_exponent_interval(struct usb_device *udev, | |||
| 1126 | } | 1126 | } |
| 1127 | 1127 | ||
| 1128 | /* | 1128 | /* |
| 1129 | * Convert bInterval expressed in frames (in 1-255 range) to exponent of | 1129 | * Convert bInterval expressed in microframes (in 1-255 range) to exponent of |
| 1130 | * microframes, rounded down to nearest power of 2. | 1130 | * microframes, rounded down to nearest power of 2. |
| 1131 | */ | 1131 | */ |
| 1132 | static unsigned int xhci_parse_frame_interval(struct usb_device *udev, | 1132 | static unsigned int xhci_microframes_to_exponent(struct usb_device *udev, |
| 1133 | struct usb_host_endpoint *ep) | 1133 | struct usb_host_endpoint *ep, unsigned int desc_interval, |
| 1134 | unsigned int min_exponent, unsigned int max_exponent) | ||
| 1134 | { | 1135 | { |
| 1135 | unsigned int interval; | 1136 | unsigned int interval; |
| 1136 | 1137 | ||
| 1137 | interval = fls(8 * ep->desc.bInterval) - 1; | 1138 | interval = fls(desc_interval) - 1; |
| 1138 | interval = clamp_val(interval, 3, 10); | 1139 | interval = clamp_val(interval, min_exponent, max_exponent); |
| 1139 | if ((1 << interval) != 8 * ep->desc.bInterval) | 1140 | if ((1 << interval) != desc_interval) |
| 1140 | dev_warn(&udev->dev, | 1141 | dev_warn(&udev->dev, |
| 1141 | "ep %#x - rounding interval to %d microframes, ep desc says %d microframes\n", | 1142 | "ep %#x - rounding interval to %d microframes, ep desc says %d microframes\n", |
| 1142 | ep->desc.bEndpointAddress, | 1143 | ep->desc.bEndpointAddress, |
| 1143 | 1 << interval, | 1144 | 1 << interval, |
| 1144 | 8 * ep->desc.bInterval); | 1145 | desc_interval); |
| 1145 | 1146 | ||
| 1146 | return interval; | 1147 | return interval; |
| 1147 | } | 1148 | } |
| 1148 | 1149 | ||
| 1150 | static unsigned int xhci_parse_microframe_interval(struct usb_device *udev, | ||
| 1151 | struct usb_host_endpoint *ep) | ||
| 1152 | { | ||
| 1153 | return xhci_microframes_to_exponent(udev, ep, | ||
| 1154 | ep->desc.bInterval, 0, 15); | ||
| 1155 | } | ||
| 1156 | |||
| 1157 | |||
| 1158 | static unsigned int xhci_parse_frame_interval(struct usb_device *udev, | ||
| 1159 | struct usb_host_endpoint *ep) | ||
| 1160 | { | ||
| 1161 | return xhci_microframes_to_exponent(udev, ep, | ||
| 1162 | ep->desc.bInterval * 8, 3, 10); | ||
| 1163 | } | ||
| 1164 | |||
| 1149 | /* Return the polling or NAK interval. | 1165 | /* Return the polling or NAK interval. |
| 1150 | * | 1166 | * |
| 1151 | * The polling interval is expressed in "microframes". If xHCI's Interval field | 1167 | * The polling interval is expressed in "microframes". If xHCI's Interval field |
| @@ -1164,7 +1180,7 @@ static unsigned int xhci_get_endpoint_interval(struct usb_device *udev, | |||
| 1164 | /* Max NAK rate */ | 1180 | /* Max NAK rate */ |
| 1165 | if (usb_endpoint_xfer_control(&ep->desc) || | 1181 | if (usb_endpoint_xfer_control(&ep->desc) || |
| 1166 | usb_endpoint_xfer_bulk(&ep->desc)) { | 1182 | usb_endpoint_xfer_bulk(&ep->desc)) { |
| 1167 | interval = ep->desc.bInterval; | 1183 | interval = xhci_parse_microframe_interval(udev, ep); |
| 1168 | break; | 1184 | break; |
| 1169 | } | 1185 | } |
| 1170 | /* Fall through - SS and HS isoc/int have same decoding */ | 1186 | /* Fall through - SS and HS isoc/int have same decoding */ |
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index 6bbe3c3a7111..c939f5fdef9e 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c | |||
| @@ -352,6 +352,11 @@ static int xhci_try_enable_msi(struct usb_hcd *hcd) | |||
| 352 | /* hcd->irq is -1, we have MSI */ | 352 | /* hcd->irq is -1, we have MSI */ |
| 353 | return 0; | 353 | return 0; |
| 354 | 354 | ||
| 355 | if (!pdev->irq) { | ||
| 356 | xhci_err(xhci, "No msi-x/msi found and no IRQ in BIOS\n"); | ||
| 357 | return -EINVAL; | ||
| 358 | } | ||
| 359 | |||
| 355 | /* fall back to legacy interrupt*/ | 360 | /* fall back to legacy interrupt*/ |
| 356 | ret = request_irq(pdev->irq, &usb_hcd_irq, IRQF_SHARED, | 361 | ret = request_irq(pdev->irq, &usb_hcd_irq, IRQF_SHARED, |
| 357 | hcd->irq_descr, hcd); | 362 | hcd->irq_descr, hcd); |
diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c index 8dbf51a43c45..08a5575724cd 100644 --- a/drivers/usb/serial/cp210x.c +++ b/drivers/usb/serial/cp210x.c | |||
| @@ -136,6 +136,8 @@ static const struct usb_device_id id_table[] = { | |||
| 136 | { USB_DEVICE(0x16DC, 0x0011) }, /* W-IE-NE-R Plein & Baus GmbH RCM Remote Control for MARATON Power Supply */ | 136 | { USB_DEVICE(0x16DC, 0x0011) }, /* W-IE-NE-R Plein & Baus GmbH RCM Remote Control for MARATON Power Supply */ |
| 137 | { USB_DEVICE(0x16DC, 0x0012) }, /* W-IE-NE-R Plein & Baus GmbH MPOD Multi Channel Power Supply */ | 137 | { USB_DEVICE(0x16DC, 0x0012) }, /* W-IE-NE-R Plein & Baus GmbH MPOD Multi Channel Power Supply */ |
| 138 | { USB_DEVICE(0x16DC, 0x0015) }, /* W-IE-NE-R Plein & Baus GmbH CML Control, Monitoring and Data Logger */ | 138 | { USB_DEVICE(0x16DC, 0x0015) }, /* W-IE-NE-R Plein & Baus GmbH CML Control, Monitoring and Data Logger */ |
| 139 | { USB_DEVICE(0x17A8, 0x0001) }, /* Kamstrup Optical Eye/3-wire */ | ||
| 140 | { USB_DEVICE(0x17A8, 0x0005) }, /* Kamstrup M-Bus Master MultiPort 250D */ | ||
| 139 | { USB_DEVICE(0x17F4, 0xAAAA) }, /* Wavesense Jazz blood glucose meter */ | 141 | { USB_DEVICE(0x17F4, 0xAAAA) }, /* Wavesense Jazz blood glucose meter */ |
| 140 | { USB_DEVICE(0x1843, 0x0200) }, /* Vaisala USB Instrument Cable */ | 142 | { USB_DEVICE(0x1843, 0x0200) }, /* Vaisala USB Instrument Cable */ |
| 141 | { USB_DEVICE(0x18EF, 0xE00F) }, /* ELV USB-I2C-Interface */ | 143 | { USB_DEVICE(0x18EF, 0xE00F) }, /* ELV USB-I2C-Interface */ |
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 39ed1f46cec0..b54afceb9611 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
| @@ -788,7 +788,6 @@ static const struct usb_device_id option_ids[] = { | |||
| 788 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0012, 0xff, 0xff, 0xff), | 788 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0012, 0xff, 0xff, 0xff), |
| 789 | .driver_info = (kernel_ulong_t)&net_intf1_blacklist }, | 789 | .driver_info = (kernel_ulong_t)&net_intf1_blacklist }, |
| 790 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0013, 0xff, 0xff, 0xff) }, | 790 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0013, 0xff, 0xff, 0xff) }, |
| 791 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0014, 0xff, 0xff, 0xff) }, | ||
| 792 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF628, 0xff, 0xff, 0xff) }, | 791 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF628, 0xff, 0xff, 0xff) }, |
| 793 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0016, 0xff, 0xff, 0xff) }, | 792 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0016, 0xff, 0xff, 0xff) }, |
| 794 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0017, 0xff, 0xff, 0xff), | 793 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0017, 0xff, 0xff, 0xff), |
| @@ -803,7 +802,6 @@ static const struct usb_device_id option_ids[] = { | |||
| 803 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0024, 0xff, 0xff, 0xff) }, | 802 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0024, 0xff, 0xff, 0xff) }, |
| 804 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0025, 0xff, 0xff, 0xff), | 803 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0025, 0xff, 0xff, 0xff), |
| 805 | .driver_info = (kernel_ulong_t)&net_intf1_blacklist }, | 804 | .driver_info = (kernel_ulong_t)&net_intf1_blacklist }, |
| 806 | /* { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0026, 0xff, 0xff, 0xff) }, */ | ||
| 807 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0028, 0xff, 0xff, 0xff) }, | 805 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0028, 0xff, 0xff, 0xff) }, |
| 808 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0029, 0xff, 0xff, 0xff) }, | 806 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0029, 0xff, 0xff, 0xff) }, |
| 809 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0030, 0xff, 0xff, 0xff) }, | 807 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0030, 0xff, 0xff, 0xff) }, |
| @@ -828,7 +826,6 @@ static const struct usb_device_id option_ids[] = { | |||
| 828 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0051, 0xff, 0xff, 0xff) }, | 826 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0051, 0xff, 0xff, 0xff) }, |
| 829 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0052, 0xff, 0xff, 0xff), | 827 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0052, 0xff, 0xff, 0xff), |
| 830 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | 828 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
| 831 | /* { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0053, 0xff, 0xff, 0xff) }, */ | ||
| 832 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0054, 0xff, 0xff, 0xff) }, | 829 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0054, 0xff, 0xff, 0xff) }, |
| 833 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0055, 0xff, 0xff, 0xff), | 830 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0055, 0xff, 0xff, 0xff), |
| 834 | .driver_info = (kernel_ulong_t)&net_intf1_blacklist }, | 831 | .driver_info = (kernel_ulong_t)&net_intf1_blacklist }, |
| @@ -836,7 +833,6 @@ static const struct usb_device_id option_ids[] = { | |||
| 836 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0057, 0xff, 0xff, 0xff) }, | 833 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0057, 0xff, 0xff, 0xff) }, |
| 837 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0058, 0xff, 0xff, 0xff), | 834 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0058, 0xff, 0xff, 0xff), |
| 838 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | 835 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
| 839 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0059, 0xff, 0xff, 0xff) }, | ||
| 840 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0061, 0xff, 0xff, 0xff) }, | 836 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0061, 0xff, 0xff, 0xff) }, |
| 841 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0062, 0xff, 0xff, 0xff) }, | 837 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0062, 0xff, 0xff, 0xff) }, |
| 842 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0063, 0xff, 0xff, 0xff), | 838 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0063, 0xff, 0xff, 0xff), |
| @@ -846,7 +842,6 @@ static const struct usb_device_id option_ids[] = { | |||
| 846 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0066, 0xff, 0xff, 0xff) }, | 842 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0066, 0xff, 0xff, 0xff) }, |
| 847 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0067, 0xff, 0xff, 0xff) }, | 843 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0067, 0xff, 0xff, 0xff) }, |
| 848 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0069, 0xff, 0xff, 0xff) }, | 844 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0069, 0xff, 0xff, 0xff) }, |
| 849 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0070, 0xff, 0xff, 0xff) }, | ||
| 850 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0076, 0xff, 0xff, 0xff) }, | 845 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0076, 0xff, 0xff, 0xff) }, |
| 851 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0077, 0xff, 0xff, 0xff) }, | 846 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0077, 0xff, 0xff, 0xff) }, |
| 852 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0078, 0xff, 0xff, 0xff) }, | 847 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0078, 0xff, 0xff, 0xff) }, |
| @@ -865,8 +860,6 @@ static const struct usb_device_id option_ids[] = { | |||
| 865 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0095, 0xff, 0xff, 0xff) }, | 860 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0095, 0xff, 0xff, 0xff) }, |
| 866 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0096, 0xff, 0xff, 0xff) }, | 861 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0096, 0xff, 0xff, 0xff) }, |
| 867 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0097, 0xff, 0xff, 0xff) }, | 862 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0097, 0xff, 0xff, 0xff) }, |
| 868 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0098, 0xff, 0xff, 0xff) }, | ||
| 869 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0099, 0xff, 0xff, 0xff) }, | ||
| 870 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0104, 0xff, 0xff, 0xff), | 863 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0104, 0xff, 0xff, 0xff), |
| 871 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | 864 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
| 872 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0105, 0xff, 0xff, 0xff) }, | 865 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0105, 0xff, 0xff, 0xff) }, |
| @@ -887,28 +880,18 @@ static const struct usb_device_id option_ids[] = { | |||
| 887 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0143, 0xff, 0xff, 0xff) }, | 880 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0143, 0xff, 0xff, 0xff) }, |
| 888 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0144, 0xff, 0xff, 0xff) }, | 881 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0144, 0xff, 0xff, 0xff) }, |
| 889 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0145, 0xff, 0xff, 0xff) }, | 882 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0145, 0xff, 0xff, 0xff) }, |
| 890 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0146, 0xff, 0xff, 0xff) }, | ||
| 891 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0147, 0xff, 0xff, 0xff) }, | ||
| 892 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0148, 0xff, 0xff, 0xff) }, | 883 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0148, 0xff, 0xff, 0xff) }, |
| 893 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0149, 0xff, 0xff, 0xff) }, | ||
| 894 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0150, 0xff, 0xff, 0xff) }, | ||
| 895 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0151, 0xff, 0xff, 0xff) }, | 884 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0151, 0xff, 0xff, 0xff) }, |
| 896 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0152, 0xff, 0xff, 0xff) }, | ||
| 897 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0153, 0xff, 0xff, 0xff) }, | 885 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0153, 0xff, 0xff, 0xff) }, |
| 898 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0155, 0xff, 0xff, 0xff) }, | 886 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0155, 0xff, 0xff, 0xff) }, |
| 899 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0156, 0xff, 0xff, 0xff) }, | 887 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0156, 0xff, 0xff, 0xff) }, |
| 900 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0157, 0xff, 0xff, 0xff) }, | 888 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0157, 0xff, 0xff, 0xff) }, |
| 901 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0158, 0xff, 0xff, 0xff) }, | 889 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0158, 0xff, 0xff, 0xff) }, |
| 902 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0159, 0xff, 0xff, 0xff) }, | 890 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0159, 0xff, 0xff, 0xff) }, |
| 903 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0160, 0xff, 0xff, 0xff) }, | ||
| 904 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0161, 0xff, 0xff, 0xff) }, | 891 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0161, 0xff, 0xff, 0xff) }, |
| 905 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0162, 0xff, 0xff, 0xff) }, | 892 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0162, 0xff, 0xff, 0xff) }, |
| 906 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0164, 0xff, 0xff, 0xff) }, | 893 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0164, 0xff, 0xff, 0xff) }, |
| 907 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0165, 0xff, 0xff, 0xff) }, | 894 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0165, 0xff, 0xff, 0xff) }, |
| 908 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0168, 0xff, 0xff, 0xff) }, | ||
| 909 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0170, 0xff, 0xff, 0xff) }, | ||
| 910 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0176, 0xff, 0xff, 0xff) }, | ||
| 911 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0178, 0xff, 0xff, 0xff) }, | ||
| 912 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1008, 0xff, 0xff, 0xff) }, | 895 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1008, 0xff, 0xff, 0xff) }, |
| 913 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1010, 0xff, 0xff, 0xff) }, | 896 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1010, 0xff, 0xff, 0xff) }, |
| 914 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1012, 0xff, 0xff, 0xff) }, | 897 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1012, 0xff, 0xff, 0xff) }, |
| @@ -1083,127 +1066,27 @@ static const struct usb_device_id option_ids[] = { | |||
| 1083 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1298, 0xff, 0xff, 0xff) }, | 1066 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1298, 0xff, 0xff, 0xff) }, |
| 1084 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1299, 0xff, 0xff, 0xff) }, | 1067 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1299, 0xff, 0xff, 0xff) }, |
| 1085 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1300, 0xff, 0xff, 0xff) }, | 1068 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1300, 0xff, 0xff, 0xff) }, |
| 1086 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1401, 0xff, 0xff, 0xff) }, | 1069 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x2002, 0xff, |
| 1087 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1402, 0xff, 0xff, 0xff) }, | 1070 | 0xff, 0xff), .driver_info = (kernel_ulong_t)&zte_k3765_z_blacklist }, |
| 1088 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1403, 0xff, 0xff, 0xff) }, | 1071 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x2003, 0xff, 0xff, 0xff) }, |
| 1089 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1404, 0xff, 0xff, 0xff) }, | 1072 | |
| 1090 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1405, 0xff, 0xff, 0xff) }, | ||
| 1091 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1406, 0xff, 0xff, 0xff) }, | ||
| 1092 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1407, 0xff, 0xff, 0xff) }, | ||
| 1093 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1408, 0xff, 0xff, 0xff) }, | ||
| 1094 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1409, 0xff, 0xff, 0xff) }, | ||
| 1095 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1410, 0xff, 0xff, 0xff) }, | ||
| 1096 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1411, 0xff, 0xff, 0xff) }, | ||
| 1097 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1412, 0xff, 0xff, 0xff) }, | ||
| 1098 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1413, 0xff, 0xff, 0xff) }, | ||
| 1099 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1414, 0xff, 0xff, 0xff) }, | ||
| 1100 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1415, 0xff, 0xff, 0xff) }, | ||
| 1101 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1416, 0xff, 0xff, 0xff) }, | ||
| 1102 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1417, 0xff, 0xff, 0xff) }, | ||
| 1103 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1418, 0xff, 0xff, 0xff) }, | ||
| 1104 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1419, 0xff, 0xff, 0xff) }, | ||
| 1105 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1420, 0xff, 0xff, 0xff) }, | ||
| 1106 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1421, 0xff, 0xff, 0xff) }, | ||
| 1107 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1422, 0xff, 0xff, 0xff) }, | ||
| 1108 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1423, 0xff, 0xff, 0xff) }, | ||
| 1109 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1424, 0xff, 0xff, 0xff) }, | ||
| 1110 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1425, 0xff, 0xff, 0xff) }, | ||
| 1111 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1426, 0xff, 0xff, 0xff) }, | ||
| 1112 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1427, 0xff, 0xff, 0xff) }, | ||
| 1113 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1428, 0xff, 0xff, 0xff) }, | ||
| 1114 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1429, 0xff, 0xff, 0xff) }, | ||
| 1115 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1430, 0xff, 0xff, 0xff) }, | ||
| 1116 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1431, 0xff, 0xff, 0xff) }, | ||
| 1117 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1432, 0xff, 0xff, 0xff) }, | ||
| 1118 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1433, 0xff, 0xff, 0xff) }, | ||
| 1119 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1434, 0xff, 0xff, 0xff) }, | ||
| 1120 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1435, 0xff, 0xff, 0xff) }, | ||
| 1121 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1436, 0xff, 0xff, 0xff) }, | ||
| 1122 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1437, 0xff, 0xff, 0xff) }, | ||
| 1123 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1438, 0xff, 0xff, 0xff) }, | ||
| 1124 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1439, 0xff, 0xff, 0xff) }, | ||
| 1125 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1440, 0xff, 0xff, 0xff) }, | ||
| 1126 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1441, 0xff, 0xff, 0xff) }, | ||
| 1127 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1442, 0xff, 0xff, 0xff) }, | ||
| 1128 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1443, 0xff, 0xff, 0xff) }, | ||
| 1129 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1444, 0xff, 0xff, 0xff) }, | ||
| 1130 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1445, 0xff, 0xff, 0xff) }, | ||
| 1131 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1446, 0xff, 0xff, 0xff) }, | ||
| 1132 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1447, 0xff, 0xff, 0xff) }, | ||
| 1133 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1448, 0xff, 0xff, 0xff) }, | ||
| 1134 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1449, 0xff, 0xff, 0xff) }, | ||
| 1135 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1450, 0xff, 0xff, 0xff) }, | ||
| 1136 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1451, 0xff, 0xff, 0xff) }, | ||
| 1137 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1452, 0xff, 0xff, 0xff) }, | ||
| 1138 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1453, 0xff, 0xff, 0xff) }, | ||
| 1139 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1454, 0xff, 0xff, 0xff) }, | ||
| 1140 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1455, 0xff, 0xff, 0xff) }, | ||
| 1141 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1456, 0xff, 0xff, 0xff) }, | ||
| 1142 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1457, 0xff, 0xff, 0xff) }, | ||
| 1143 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1458, 0xff, 0xff, 0xff) }, | ||
| 1144 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1459, 0xff, 0xff, 0xff) }, | ||
| 1145 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1460, 0xff, 0xff, 0xff) }, | ||
| 1146 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1461, 0xff, 0xff, 0xff) }, | ||
| 1147 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1462, 0xff, 0xff, 0xff) }, | ||
| 1148 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1463, 0xff, 0xff, 0xff) }, | ||
| 1149 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1464, 0xff, 0xff, 0xff) }, | ||
| 1150 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1465, 0xff, 0xff, 0xff) }, | ||
| 1151 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1466, 0xff, 0xff, 0xff) }, | ||
| 1152 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1467, 0xff, 0xff, 0xff) }, | ||
| 1153 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1468, 0xff, 0xff, 0xff) }, | ||
| 1154 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1469, 0xff, 0xff, 0xff) }, | ||
| 1155 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1470, 0xff, 0xff, 0xff) }, | ||
| 1156 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1471, 0xff, 0xff, 0xff) }, | ||
| 1157 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1472, 0xff, 0xff, 0xff) }, | ||
| 1158 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1473, 0xff, 0xff, 0xff) }, | ||
| 1159 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1474, 0xff, 0xff, 0xff) }, | ||
| 1160 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1475, 0xff, 0xff, 0xff) }, | ||
| 1161 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1476, 0xff, 0xff, 0xff) }, | ||
| 1162 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1477, 0xff, 0xff, 0xff) }, | ||
| 1163 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1478, 0xff, 0xff, 0xff) }, | ||
| 1164 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1479, 0xff, 0xff, 0xff) }, | ||
| 1165 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1480, 0xff, 0xff, 0xff) }, | ||
| 1166 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1481, 0xff, 0xff, 0xff) }, | ||
| 1167 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1482, 0xff, 0xff, 0xff) }, | ||
| 1168 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1483, 0xff, 0xff, 0xff) }, | ||
| 1169 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1484, 0xff, 0xff, 0xff) }, | ||
| 1170 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1485, 0xff, 0xff, 0xff) }, | ||
| 1171 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1486, 0xff, 0xff, 0xff) }, | ||
| 1172 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1487, 0xff, 0xff, 0xff) }, | ||
| 1173 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1488, 0xff, 0xff, 0xff) }, | ||
| 1174 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1489, 0xff, 0xff, 0xff) }, | ||
| 1175 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1490, 0xff, 0xff, 0xff) }, | ||
| 1176 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1491, 0xff, 0xff, 0xff) }, | ||
| 1177 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1492, 0xff, 0xff, 0xff) }, | ||
| 1178 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1493, 0xff, 0xff, 0xff) }, | ||
| 1179 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1494, 0xff, 0xff, 0xff) }, | ||
| 1180 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1495, 0xff, 0xff, 0xff) }, | ||
| 1181 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1496, 0xff, 0xff, 0xff) }, | ||
| 1182 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1497, 0xff, 0xff, 0xff) }, | ||
| 1183 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1498, 0xff, 0xff, 0xff) }, | ||
| 1184 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1499, 0xff, 0xff, 0xff) }, | ||
| 1185 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1500, 0xff, 0xff, 0xff) }, | ||
| 1186 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1501, 0xff, 0xff, 0xff) }, | ||
| 1187 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1502, 0xff, 0xff, 0xff) }, | ||
| 1188 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1503, 0xff, 0xff, 0xff) }, | ||
| 1189 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1504, 0xff, 0xff, 0xff) }, | ||
| 1190 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1505, 0xff, 0xff, 0xff) }, | ||
| 1191 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1506, 0xff, 0xff, 0xff) }, | ||
| 1192 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1507, 0xff, 0xff, 0xff) }, | ||
| 1193 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1508, 0xff, 0xff, 0xff) }, | ||
| 1194 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1509, 0xff, 0xff, 0xff) }, | ||
| 1195 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1510, 0xff, 0xff, 0xff) }, | ||
| 1196 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0014, 0xff, 0xff, 0xff) }, /* ZTE CDMA products */ | 1073 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0014, 0xff, 0xff, 0xff) }, /* ZTE CDMA products */ |
| 1197 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0027, 0xff, 0xff, 0xff) }, | 1074 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0027, 0xff, 0xff, 0xff) }, |
| 1198 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0059, 0xff, 0xff, 0xff) }, | 1075 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0059, 0xff, 0xff, 0xff) }, |
| 1199 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0060, 0xff, 0xff, 0xff) }, | 1076 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0060, 0xff, 0xff, 0xff) }, |
| 1200 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0070, 0xff, 0xff, 0xff) }, | 1077 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0070, 0xff, 0xff, 0xff) }, |
| 1201 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0073, 0xff, 0xff, 0xff) }, | 1078 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0073, 0xff, 0xff, 0xff) }, |
| 1079 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0094, 0xff, 0xff, 0xff) }, | ||
| 1202 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0130, 0xff, 0xff, 0xff) }, | 1080 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0130, 0xff, 0xff, 0xff) }, |
| 1081 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0133, 0xff, 0xff, 0xff) }, | ||
| 1203 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0141, 0xff, 0xff, 0xff) }, | 1082 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0141, 0xff, 0xff, 0xff) }, |
| 1204 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x2002, 0xff, | 1083 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0147, 0xff, 0xff, 0xff) }, |
| 1205 | 0xff, 0xff), .driver_info = (kernel_ulong_t)&zte_k3765_z_blacklist }, | 1084 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0152, 0xff, 0xff, 0xff) }, |
| 1206 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x2003, 0xff, 0xff, 0xff) }, | 1085 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0168, 0xff, 0xff, 0xff) }, |
| 1086 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0170, 0xff, 0xff, 0xff) }, | ||
| 1087 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0176, 0xff, 0xff, 0xff) }, | ||
| 1088 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0178, 0xff, 0xff, 0xff) }, | ||
| 1089 | |||
| 1207 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH, 0xff, 0xff, 0xff) }, | 1090 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH, 0xff, 0xff, 0xff) }, |
| 1208 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC8710, 0xff, 0xff, 0xff) }, | 1091 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC8710, 0xff, 0xff, 0xff) }, |
| 1209 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC2726, 0xff, 0xff, 0xff) }, | 1092 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC2726, 0xff, 0xff, 0xff) }, |
diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c index 8468eb769a29..75b838eff178 100644 --- a/drivers/usb/serial/ti_usb_3410_5052.c +++ b/drivers/usb/serial/ti_usb_3410_5052.c | |||
| @@ -165,7 +165,7 @@ static unsigned int product_5052_count; | |||
| 165 | /* the array dimension is the number of default entries plus */ | 165 | /* the array dimension is the number of default entries plus */ |
| 166 | /* TI_EXTRA_VID_PID_COUNT user defined entries plus 1 terminating */ | 166 | /* TI_EXTRA_VID_PID_COUNT user defined entries plus 1 terminating */ |
| 167 | /* null entry */ | 167 | /* null entry */ |
| 168 | static struct usb_device_id ti_id_table_3410[13+TI_EXTRA_VID_PID_COUNT+1] = { | 168 | static struct usb_device_id ti_id_table_3410[14+TI_EXTRA_VID_PID_COUNT+1] = { |
| 169 | { USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_ID) }, | 169 | { USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_ID) }, |
| 170 | { USB_DEVICE(TI_VENDOR_ID, TI_3410_EZ430_ID) }, | 170 | { USB_DEVICE(TI_VENDOR_ID, TI_3410_EZ430_ID) }, |
| 171 | { USB_DEVICE(MTS_VENDOR_ID, MTS_GSM_NO_FW_PRODUCT_ID) }, | 171 | { USB_DEVICE(MTS_VENDOR_ID, MTS_GSM_NO_FW_PRODUCT_ID) }, |
| @@ -179,6 +179,7 @@ static struct usb_device_id ti_id_table_3410[13+TI_EXTRA_VID_PID_COUNT+1] = { | |||
| 179 | { USB_DEVICE(IBM_VENDOR_ID, IBM_4543_PRODUCT_ID) }, | 179 | { USB_DEVICE(IBM_VENDOR_ID, IBM_4543_PRODUCT_ID) }, |
| 180 | { USB_DEVICE(IBM_VENDOR_ID, IBM_454B_PRODUCT_ID) }, | 180 | { USB_DEVICE(IBM_VENDOR_ID, IBM_454B_PRODUCT_ID) }, |
| 181 | { USB_DEVICE(IBM_VENDOR_ID, IBM_454C_PRODUCT_ID) }, | 181 | { USB_DEVICE(IBM_VENDOR_ID, IBM_454C_PRODUCT_ID) }, |
| 182 | { USB_DEVICE(ABBOTT_VENDOR_ID, ABBOTT_PRODUCT_ID) }, | ||
| 182 | }; | 183 | }; |
| 183 | 184 | ||
| 184 | static struct usb_device_id ti_id_table_5052[5+TI_EXTRA_VID_PID_COUNT+1] = { | 185 | static struct usb_device_id ti_id_table_5052[5+TI_EXTRA_VID_PID_COUNT+1] = { |
| @@ -188,7 +189,7 @@ static struct usb_device_id ti_id_table_5052[5+TI_EXTRA_VID_PID_COUNT+1] = { | |||
| 188 | { USB_DEVICE(TI_VENDOR_ID, TI_5052_FIRMWARE_PRODUCT_ID) }, | 189 | { USB_DEVICE(TI_VENDOR_ID, TI_5052_FIRMWARE_PRODUCT_ID) }, |
| 189 | }; | 190 | }; |
| 190 | 191 | ||
| 191 | static struct usb_device_id ti_id_table_combined[17+2*TI_EXTRA_VID_PID_COUNT+1] = { | 192 | static struct usb_device_id ti_id_table_combined[18+2*TI_EXTRA_VID_PID_COUNT+1] = { |
| 192 | { USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_ID) }, | 193 | { USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_ID) }, |
| 193 | { USB_DEVICE(TI_VENDOR_ID, TI_3410_EZ430_ID) }, | 194 | { USB_DEVICE(TI_VENDOR_ID, TI_3410_EZ430_ID) }, |
| 194 | { USB_DEVICE(MTS_VENDOR_ID, MTS_GSM_NO_FW_PRODUCT_ID) }, | 195 | { USB_DEVICE(MTS_VENDOR_ID, MTS_GSM_NO_FW_PRODUCT_ID) }, |
| @@ -206,6 +207,7 @@ static struct usb_device_id ti_id_table_combined[17+2*TI_EXTRA_VID_PID_COUNT+1] | |||
| 206 | { USB_DEVICE(IBM_VENDOR_ID, IBM_4543_PRODUCT_ID) }, | 207 | { USB_DEVICE(IBM_VENDOR_ID, IBM_4543_PRODUCT_ID) }, |
| 207 | { USB_DEVICE(IBM_VENDOR_ID, IBM_454B_PRODUCT_ID) }, | 208 | { USB_DEVICE(IBM_VENDOR_ID, IBM_454B_PRODUCT_ID) }, |
| 208 | { USB_DEVICE(IBM_VENDOR_ID, IBM_454C_PRODUCT_ID) }, | 209 | { USB_DEVICE(IBM_VENDOR_ID, IBM_454C_PRODUCT_ID) }, |
| 210 | { USB_DEVICE(ABBOTT_VENDOR_ID, ABBOTT_PRODUCT_ID) }, | ||
| 209 | { } | 211 | { } |
| 210 | }; | 212 | }; |
| 211 | 213 | ||
diff --git a/drivers/usb/serial/ti_usb_3410_5052.h b/drivers/usb/serial/ti_usb_3410_5052.h index 2aac1953993b..f140f1b9d5c0 100644 --- a/drivers/usb/serial/ti_usb_3410_5052.h +++ b/drivers/usb/serial/ti_usb_3410_5052.h | |||
| @@ -49,6 +49,10 @@ | |||
| 49 | #define MTS_MT9234ZBA_PRODUCT_ID 0xF115 | 49 | #define MTS_MT9234ZBA_PRODUCT_ID 0xF115 |
| 50 | #define MTS_MT9234ZBAOLD_PRODUCT_ID 0x0319 | 50 | #define MTS_MT9234ZBAOLD_PRODUCT_ID 0x0319 |
| 51 | 51 | ||
| 52 | /* Abbott Diabetics vendor and product ids */ | ||
| 53 | #define ABBOTT_VENDOR_ID 0x1a61 | ||
| 54 | #define ABBOTT_PRODUCT_ID 0x3410 | ||
| 55 | |||
| 52 | /* Commands */ | 56 | /* Commands */ |
| 53 | #define TI_GET_VERSION 0x01 | 57 | #define TI_GET_VERSION 0x01 |
| 54 | #define TI_GET_PORT_STATUS 0x02 | 58 | #define TI_GET_PORT_STATUS 0x02 |
diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c index 3dd7da9fd504..db51ba16dc07 100644 --- a/drivers/usb/storage/usb.c +++ b/drivers/usb/storage/usb.c | |||
| @@ -788,15 +788,19 @@ static void quiesce_and_remove_host(struct us_data *us) | |||
| 788 | struct Scsi_Host *host = us_to_host(us); | 788 | struct Scsi_Host *host = us_to_host(us); |
| 789 | 789 | ||
| 790 | /* If the device is really gone, cut short reset delays */ | 790 | /* If the device is really gone, cut short reset delays */ |
| 791 | if (us->pusb_dev->state == USB_STATE_NOTATTACHED) | 791 | if (us->pusb_dev->state == USB_STATE_NOTATTACHED) { |
| 792 | set_bit(US_FLIDX_DISCONNECTING, &us->dflags); | 792 | set_bit(US_FLIDX_DISCONNECTING, &us->dflags); |
| 793 | wake_up(&us->delay_wait); | ||
| 794 | } | ||
| 793 | 795 | ||
| 794 | /* Prevent SCSI-scanning (if it hasn't started yet) | 796 | /* Prevent SCSI scanning (if it hasn't started yet) |
| 795 | * and wait for the SCSI-scanning thread to stop. | 797 | * or wait for the SCSI-scanning routine to stop. |
| 796 | */ | 798 | */ |
| 797 | set_bit(US_FLIDX_DONT_SCAN, &us->dflags); | 799 | cancel_delayed_work_sync(&us->scan_dwork); |
| 798 | wake_up(&us->delay_wait); | 800 | |
| 799 | wait_for_completion(&us->scanning_done); | 801 | /* Balance autopm calls if scanning was cancelled */ |
| 802 | if (test_bit(US_FLIDX_SCAN_PENDING, &us->dflags)) | ||
| 803 | usb_autopm_put_interface_no_suspend(us->pusb_intf); | ||
| 800 | 804 | ||
| 801 | /* Removing the host will perform an orderly shutdown: caches | 805 | /* Removing the host will perform an orderly shutdown: caches |
| 802 | * synchronized, disks spun down, etc. | 806 | * synchronized, disks spun down, etc. |
| @@ -823,53 +827,28 @@ static void release_everything(struct us_data *us) | |||
| 823 | scsi_host_put(us_to_host(us)); | 827 | scsi_host_put(us_to_host(us)); |
| 824 | } | 828 | } |
| 825 | 829 | ||
| 826 | /* Thread to carry out delayed SCSI-device scanning */ | 830 | /* Delayed-work routine to carry out SCSI-device scanning */ |
| 827 | static int usb_stor_scan_thread(void * __us) | 831 | static void usb_stor_scan_dwork(struct work_struct *work) |
| 828 | { | 832 | { |
| 829 | struct us_data *us = (struct us_data *)__us; | 833 | struct us_data *us = container_of(work, struct us_data, |
| 834 | scan_dwork.work); | ||
| 830 | struct device *dev = &us->pusb_intf->dev; | 835 | struct device *dev = &us->pusb_intf->dev; |
| 831 | 836 | ||
| 832 | dev_dbg(dev, "device found\n"); | 837 | dev_dbg(dev, "starting scan\n"); |
| 833 | |||
| 834 | set_freezable(); | ||
| 835 | 838 | ||
| 836 | /* | 839 | /* For bulk-only devices, determine the max LUN value */ |
| 837 | * Wait for the timeout to expire or for a disconnect | 840 | if (us->protocol == USB_PR_BULK && !(us->fflags & US_FL_SINGLE_LUN)) { |
| 838 | * | 841 | mutex_lock(&us->dev_mutex); |
| 839 | * We can't freeze in this thread or we risk causing khubd to | 842 | us->max_lun = usb_stor_Bulk_max_lun(us); |
| 840 | * fail to freeze, but we can't be non-freezable either. Nor can | 843 | mutex_unlock(&us->dev_mutex); |
| 841 | * khubd freeze while waiting for scanning to complete as it may | ||
| 842 | * hold the device lock, causing a hang when suspending devices. | ||
| 843 | * So instead of using wait_event_freezable(), explicitly test | ||
| 844 | * for (DONT_SCAN || freezing) in interruptible wait and proceed | ||
| 845 | * if any of DONT_SCAN, freezing or timeout has happened. | ||
| 846 | */ | ||
| 847 | if (delay_use > 0) { | ||
| 848 | dev_dbg(dev, "waiting for device to settle " | ||
| 849 | "before scanning\n"); | ||
| 850 | wait_event_interruptible_timeout(us->delay_wait, | ||
| 851 | test_bit(US_FLIDX_DONT_SCAN, &us->dflags) || | ||
| 852 | freezing(current), delay_use * HZ); | ||
| 853 | } | 844 | } |
| 845 | scsi_scan_host(us_to_host(us)); | ||
| 846 | dev_dbg(dev, "scan complete\n"); | ||
| 854 | 847 | ||
| 855 | /* If the device is still connected, perform the scanning */ | 848 | /* Should we unbind if no devices were detected? */ |
| 856 | if (!test_bit(US_FLIDX_DONT_SCAN, &us->dflags)) { | ||
| 857 | |||
| 858 | /* For bulk-only devices, determine the max LUN value */ | ||
| 859 | if (us->protocol == USB_PR_BULK && | ||
| 860 | !(us->fflags & US_FL_SINGLE_LUN)) { | ||
| 861 | mutex_lock(&us->dev_mutex); | ||
| 862 | us->max_lun = usb_stor_Bulk_max_lun(us); | ||
| 863 | mutex_unlock(&us->dev_mutex); | ||
| 864 | } | ||
| 865 | scsi_scan_host(us_to_host(us)); | ||
| 866 | dev_dbg(dev, "scan complete\n"); | ||
| 867 | |||
| 868 | /* Should we unbind if no devices were detected? */ | ||
| 869 | } | ||
| 870 | 849 | ||
| 871 | usb_autopm_put_interface(us->pusb_intf); | 850 | usb_autopm_put_interface(us->pusb_intf); |
| 872 | complete_and_exit(&us->scanning_done, 0); | 851 | clear_bit(US_FLIDX_SCAN_PENDING, &us->dflags); |
| 873 | } | 852 | } |
| 874 | 853 | ||
| 875 | static unsigned int usb_stor_sg_tablesize(struct usb_interface *intf) | 854 | static unsigned int usb_stor_sg_tablesize(struct usb_interface *intf) |
| @@ -916,7 +895,7 @@ int usb_stor_probe1(struct us_data **pus, | |||
| 916 | init_completion(&us->cmnd_ready); | 895 | init_completion(&us->cmnd_ready); |
| 917 | init_completion(&(us->notify)); | 896 | init_completion(&(us->notify)); |
| 918 | init_waitqueue_head(&us->delay_wait); | 897 | init_waitqueue_head(&us->delay_wait); |
| 919 | init_completion(&us->scanning_done); | 898 | INIT_DELAYED_WORK(&us->scan_dwork, usb_stor_scan_dwork); |
| 920 | 899 | ||
| 921 | /* Associate the us_data structure with the USB device */ | 900 | /* Associate the us_data structure with the USB device */ |
| 922 | result = associate_dev(us, intf); | 901 | result = associate_dev(us, intf); |
| @@ -947,7 +926,6 @@ EXPORT_SYMBOL_GPL(usb_stor_probe1); | |||
| 947 | /* Second part of general USB mass-storage probing */ | 926 | /* Second part of general USB mass-storage probing */ |
| 948 | int usb_stor_probe2(struct us_data *us) | 927 | int usb_stor_probe2(struct us_data *us) |
| 949 | { | 928 | { |
| 950 | struct task_struct *th; | ||
| 951 | int result; | 929 | int result; |
| 952 | struct device *dev = &us->pusb_intf->dev; | 930 | struct device *dev = &us->pusb_intf->dev; |
| 953 | 931 | ||
| @@ -988,20 +966,14 @@ int usb_stor_probe2(struct us_data *us) | |||
| 988 | goto BadDevice; | 966 | goto BadDevice; |
| 989 | } | 967 | } |
| 990 | 968 | ||
| 991 | /* Start up the thread for delayed SCSI-device scanning */ | 969 | /* Submit the delayed_work for SCSI-device scanning */ |
| 992 | th = kthread_create(usb_stor_scan_thread, us, "usb-stor-scan"); | ||
| 993 | if (IS_ERR(th)) { | ||
| 994 | dev_warn(dev, | ||
| 995 | "Unable to start the device-scanning thread\n"); | ||
| 996 | complete(&us->scanning_done); | ||
| 997 | quiesce_and_remove_host(us); | ||
| 998 | result = PTR_ERR(th); | ||
| 999 | goto BadDevice; | ||
| 1000 | } | ||
| 1001 | |||
| 1002 | usb_autopm_get_interface_no_resume(us->pusb_intf); | 970 | usb_autopm_get_interface_no_resume(us->pusb_intf); |
| 1003 | wake_up_process(th); | 971 | set_bit(US_FLIDX_SCAN_PENDING, &us->dflags); |
| 1004 | 972 | ||
| 973 | if (delay_use > 0) | ||
| 974 | dev_dbg(dev, "waiting for device to settle before scanning\n"); | ||
| 975 | queue_delayed_work(system_freezable_wq, &us->scan_dwork, | ||
| 976 | delay_use * HZ); | ||
| 1005 | return 0; | 977 | return 0; |
| 1006 | 978 | ||
| 1007 | /* We come here if there are any problems */ | 979 | /* We come here if there are any problems */ |
diff --git a/drivers/usb/storage/usb.h b/drivers/usb/storage/usb.h index 7b0f2113632e..75f70f04f37b 100644 --- a/drivers/usb/storage/usb.h +++ b/drivers/usb/storage/usb.h | |||
| @@ -47,6 +47,7 @@ | |||
| 47 | #include <linux/blkdev.h> | 47 | #include <linux/blkdev.h> |
| 48 | #include <linux/completion.h> | 48 | #include <linux/completion.h> |
| 49 | #include <linux/mutex.h> | 49 | #include <linux/mutex.h> |
| 50 | #include <linux/workqueue.h> | ||
| 50 | #include <scsi/scsi_host.h> | 51 | #include <scsi/scsi_host.h> |
| 51 | 52 | ||
| 52 | struct us_data; | 53 | struct us_data; |
| @@ -72,7 +73,7 @@ struct us_unusual_dev { | |||
| 72 | #define US_FLIDX_DISCONNECTING 3 /* disconnect in progress */ | 73 | #define US_FLIDX_DISCONNECTING 3 /* disconnect in progress */ |
| 73 | #define US_FLIDX_RESETTING 4 /* device reset in progress */ | 74 | #define US_FLIDX_RESETTING 4 /* device reset in progress */ |
| 74 | #define US_FLIDX_TIMED_OUT 5 /* SCSI midlayer timed out */ | 75 | #define US_FLIDX_TIMED_OUT 5 /* SCSI midlayer timed out */ |
| 75 | #define US_FLIDX_DONT_SCAN 6 /* don't scan (disconnect) */ | 76 | #define US_FLIDX_SCAN_PENDING 6 /* scanning not yet done */ |
| 76 | #define US_FLIDX_REDO_READ10 7 /* redo READ(10) command */ | 77 | #define US_FLIDX_REDO_READ10 7 /* redo READ(10) command */ |
| 77 | #define US_FLIDX_READ10_WORKED 8 /* previous READ(10) succeeded */ | 78 | #define US_FLIDX_READ10_WORKED 8 /* previous READ(10) succeeded */ |
| 78 | 79 | ||
| @@ -147,8 +148,8 @@ struct us_data { | |||
| 147 | /* mutual exclusion and synchronization structures */ | 148 | /* mutual exclusion and synchronization structures */ |
| 148 | struct completion cmnd_ready; /* to sleep thread on */ | 149 | struct completion cmnd_ready; /* to sleep thread on */ |
| 149 | struct completion notify; /* thread begin/end */ | 150 | struct completion notify; /* thread begin/end */ |
| 150 | wait_queue_head_t delay_wait; /* wait during scan, reset */ | 151 | wait_queue_head_t delay_wait; /* wait during reset */ |
| 151 | struct completion scanning_done; /* wait for scan thread */ | 152 | struct delayed_work scan_dwork; /* for async scanning */ |
| 152 | 153 | ||
| 153 | /* subdriver information */ | 154 | /* subdriver information */ |
| 154 | void *extra; /* Any extra data */ | 155 | void *extra; /* Any extra data */ |
diff --git a/drivers/video/omap2/dss/dpi.c b/drivers/video/omap2/dss/dpi.c index 395d658a94fc..faaf305fda27 100644 --- a/drivers/video/omap2/dss/dpi.c +++ b/drivers/video/omap2/dss/dpi.c | |||
| @@ -180,6 +180,11 @@ int omapdss_dpi_display_enable(struct omap_dss_device *dssdev) | |||
| 180 | { | 180 | { |
| 181 | int r; | 181 | int r; |
| 182 | 182 | ||
| 183 | if (cpu_is_omap34xx() && !dpi.vdds_dsi_reg) { | ||
| 184 | DSSERR("no VDSS_DSI regulator\n"); | ||
| 185 | return -ENODEV; | ||
| 186 | } | ||
| 187 | |||
| 183 | if (dssdev->manager == NULL) { | 188 | if (dssdev->manager == NULL) { |
| 184 | DSSERR("failed to enable display: no manager\n"); | 189 | DSSERR("failed to enable display: no manager\n"); |
| 185 | return -ENODEV; | 190 | return -ENODEV; |
diff --git a/drivers/video/pvr2fb.c b/drivers/video/pvr2fb.c index f9975100d56d..3a3fdc62c75b 100644 --- a/drivers/video/pvr2fb.c +++ b/drivers/video/pvr2fb.c | |||
| @@ -1061,7 +1061,7 @@ static struct pvr2_board { | |||
| 1061 | int (*init)(void); | 1061 | int (*init)(void); |
| 1062 | void (*exit)(void); | 1062 | void (*exit)(void); |
| 1063 | char name[16]; | 1063 | char name[16]; |
| 1064 | } board_driver[] = { | 1064 | } board_driver[] __refdata = { |
| 1065 | #ifdef CONFIG_SH_DREAMCAST | 1065 | #ifdef CONFIG_SH_DREAMCAST |
| 1066 | { pvr2fb_dc_init, pvr2fb_dc_exit, "Sega DC PVR2" }, | 1066 | { pvr2fb_dc_init, pvr2fb_dc_exit, "Sega DC PVR2" }, |
| 1067 | #endif | 1067 | #endif |
diff --git a/drivers/xen/cpu_hotplug.c b/drivers/xen/cpu_hotplug.c index 14e2d995e958..4dcfced107f5 100644 --- a/drivers/xen/cpu_hotplug.c +++ b/drivers/xen/cpu_hotplug.c | |||
| @@ -30,7 +30,8 @@ static int vcpu_online(unsigned int cpu) | |||
| 30 | sprintf(dir, "cpu/%u", cpu); | 30 | sprintf(dir, "cpu/%u", cpu); |
| 31 | err = xenbus_scanf(XBT_NIL, dir, "availability", "%s", state); | 31 | err = xenbus_scanf(XBT_NIL, dir, "availability", "%s", state); |
| 32 | if (err != 1) { | 32 | if (err != 1) { |
| 33 | printk(KERN_ERR "XENBUS: Unable to read cpu state\n"); | 33 | if (!xen_initial_domain()) |
| 34 | printk(KERN_ERR "XENBUS: Unable to read cpu state\n"); | ||
| 34 | return err; | 35 | return err; |
| 35 | } | 36 | } |
| 36 | 37 | ||
diff --git a/drivers/xen/xen-pciback/pci_stub.c b/drivers/xen/xen-pciback/pci_stub.c index 7944a17f5cbf..19834d1c7c36 100644 --- a/drivers/xen/xen-pciback/pci_stub.c +++ b/drivers/xen/xen-pciback/pci_stub.c | |||
| @@ -884,7 +884,7 @@ static inline int str_to_quirk(const char *buf, int *domain, int *bus, int | |||
| 884 | int err; | 884 | int err; |
| 885 | 885 | ||
| 886 | err = | 886 | err = |
| 887 | sscanf(buf, " %04x:%02x:%02x.%1x-%08x:%1x:%08x", domain, bus, slot, | 887 | sscanf(buf, " %04x:%02x:%02x.%d-%08x:%1x:%08x", domain, bus, slot, |
| 888 | func, reg, size, mask); | 888 | func, reg, size, mask); |
| 889 | if (err == 7) | 889 | if (err == 7) |
| 890 | return 0; | 890 | return 0; |
| @@ -904,7 +904,7 @@ static int pcistub_device_id_add(int domain, int bus, int slot, int func) | |||
| 904 | pci_dev_id->bus = bus; | 904 | pci_dev_id->bus = bus; |
| 905 | pci_dev_id->devfn = PCI_DEVFN(slot, func); | 905 | pci_dev_id->devfn = PCI_DEVFN(slot, func); |
| 906 | 906 | ||
| 907 | pr_debug(DRV_NAME ": wants to seize %04x:%02x:%02x.%01x\n", | 907 | pr_debug(DRV_NAME ": wants to seize %04x:%02x:%02x.%d\n", |
| 908 | domain, bus, slot, func); | 908 | domain, bus, slot, func); |
| 909 | 909 | ||
| 910 | spin_lock_irqsave(&device_ids_lock, flags); | 910 | spin_lock_irqsave(&device_ids_lock, flags); |
| @@ -934,7 +934,7 @@ static int pcistub_device_id_remove(int domain, int bus, int slot, int func) | |||
| 934 | 934 | ||
| 935 | err = 0; | 935 | err = 0; |
| 936 | 936 | ||
| 937 | pr_debug(DRV_NAME ": removed %04x:%02x:%02x.%01x from " | 937 | pr_debug(DRV_NAME ": removed %04x:%02x:%02x.%d from " |
| 938 | "seize list\n", domain, bus, slot, func); | 938 | "seize list\n", domain, bus, slot, func); |
| 939 | } | 939 | } |
| 940 | } | 940 | } |
| @@ -1029,7 +1029,7 @@ static ssize_t pcistub_slot_show(struct device_driver *drv, char *buf) | |||
| 1029 | break; | 1029 | break; |
| 1030 | 1030 | ||
| 1031 | count += scnprintf(buf + count, PAGE_SIZE - count, | 1031 | count += scnprintf(buf + count, PAGE_SIZE - count, |
| 1032 | "%04x:%02x:%02x.%01x\n", | 1032 | "%04x:%02x:%02x.%d\n", |
| 1033 | pci_dev_id->domain, pci_dev_id->bus, | 1033 | pci_dev_id->domain, pci_dev_id->bus, |
| 1034 | PCI_SLOT(pci_dev_id->devfn), | 1034 | PCI_SLOT(pci_dev_id->devfn), |
| 1035 | PCI_FUNC(pci_dev_id->devfn)); | 1035 | PCI_FUNC(pci_dev_id->devfn)); |
diff --git a/drivers/xen/xen-pciback/xenbus.c b/drivers/xen/xen-pciback/xenbus.c index d5dcf8d5d3d9..64b11f99eacc 100644 --- a/drivers/xen/xen-pciback/xenbus.c +++ b/drivers/xen/xen-pciback/xenbus.c | |||
| @@ -206,6 +206,7 @@ static int xen_pcibk_publish_pci_dev(struct xen_pcibk_device *pdev, | |||
| 206 | goto out; | 206 | goto out; |
| 207 | } | 207 | } |
| 208 | 208 | ||
| 209 | /* Note: The PV protocol uses %02x, don't change it */ | ||
| 209 | err = xenbus_printf(XBT_NIL, pdev->xdev->nodename, str, | 210 | err = xenbus_printf(XBT_NIL, pdev->xdev->nodename, str, |
| 210 | "%04x:%02x:%02x.%02x", domain, bus, | 211 | "%04x:%02x:%02x.%02x", domain, bus, |
| 211 | PCI_SLOT(devfn), PCI_FUNC(devfn)); | 212 | PCI_SLOT(devfn), PCI_FUNC(devfn)); |
| @@ -229,7 +230,7 @@ static int xen_pcibk_export_device(struct xen_pcibk_device *pdev, | |||
| 229 | err = -EINVAL; | 230 | err = -EINVAL; |
| 230 | xenbus_dev_fatal(pdev->xdev, err, | 231 | xenbus_dev_fatal(pdev->xdev, err, |
| 231 | "Couldn't locate PCI device " | 232 | "Couldn't locate PCI device " |
| 232 | "(%04x:%02x:%02x.%01x)! " | 233 | "(%04x:%02x:%02x.%d)! " |
| 233 | "perhaps already in-use?", | 234 | "perhaps already in-use?", |
| 234 | domain, bus, slot, func); | 235 | domain, bus, slot, func); |
| 235 | goto out; | 236 | goto out; |
| @@ -274,7 +275,7 @@ static int xen_pcibk_remove_device(struct xen_pcibk_device *pdev, | |||
| 274 | if (!dev) { | 275 | if (!dev) { |
| 275 | err = -EINVAL; | 276 | err = -EINVAL; |
| 276 | dev_dbg(&pdev->xdev->dev, "Couldn't locate PCI device " | 277 | dev_dbg(&pdev->xdev->dev, "Couldn't locate PCI device " |
| 277 | "(%04x:%02x:%02x.%01x)! not owned by this domain\n", | 278 | "(%04x:%02x:%02x.%d)! not owned by this domain\n", |
| 278 | domain, bus, slot, func); | 279 | domain, bus, slot, func); |
| 279 | goto out; | 280 | goto out; |
| 280 | } | 281 | } |
diff --git a/drivers/xen/xenbus/xenbus_dev_frontend.c b/drivers/xen/xenbus/xenbus_dev_frontend.c index 527dc2a3b89f..89f76252a16f 100644 --- a/drivers/xen/xenbus/xenbus_dev_frontend.c +++ b/drivers/xen/xenbus/xenbus_dev_frontend.c | |||
| @@ -369,6 +369,10 @@ static int xenbus_write_watch(unsigned msg_type, struct xenbus_file_priv *u) | |||
| 369 | goto out; | 369 | goto out; |
| 370 | } | 370 | } |
| 371 | token++; | 371 | token++; |
| 372 | if (memchr(token, 0, u->u.msg.len - (token - path)) == NULL) { | ||
| 373 | rc = -EILSEQ; | ||
| 374 | goto out; | ||
| 375 | } | ||
| 372 | 376 | ||
| 373 | if (msg_type == XS_WATCH) { | 377 | if (msg_type == XS_WATCH) { |
| 374 | watch = alloc_watch_adapter(path, token); | 378 | watch = alloc_watch_adapter(path, token); |
diff --git a/fs/autofs4/expire.c b/fs/autofs4/expire.c index 450f529a4eae..1feb68ecef95 100644 --- a/fs/autofs4/expire.c +++ b/fs/autofs4/expire.c | |||
| @@ -124,6 +124,7 @@ start: | |||
| 124 | /* Negative dentry - try next */ | 124 | /* Negative dentry - try next */ |
| 125 | if (!simple_positive(q)) { | 125 | if (!simple_positive(q)) { |
| 126 | spin_unlock(&p->d_lock); | 126 | spin_unlock(&p->d_lock); |
| 127 | lock_set_subclass(&q->d_lock.dep_map, 0, _RET_IP_); | ||
| 127 | p = q; | 128 | p = q; |
| 128 | goto again; | 129 | goto again; |
| 129 | } | 130 | } |
| @@ -186,6 +187,7 @@ again: | |||
| 186 | /* Negative dentry - try next */ | 187 | /* Negative dentry - try next */ |
| 187 | if (!simple_positive(ret)) { | 188 | if (!simple_positive(ret)) { |
| 188 | spin_unlock(&p->d_lock); | 189 | spin_unlock(&p->d_lock); |
| 190 | lock_set_subclass(&ret->d_lock.dep_map, 0, _RET_IP_); | ||
| 189 | p = ret; | 191 | p = ret; |
| 190 | goto again; | 192 | goto again; |
| 191 | } | 193 | } |
diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c index 633c701a287d..98f6bf10bbd4 100644 --- a/fs/btrfs/backref.c +++ b/fs/btrfs/backref.c | |||
| @@ -892,6 +892,8 @@ static char *iref_to_path(struct btrfs_root *fs_root, struct btrfs_path *path, | |||
| 892 | if (eb != eb_in) | 892 | if (eb != eb_in) |
| 893 | free_extent_buffer(eb); | 893 | free_extent_buffer(eb); |
| 894 | ret = inode_ref_info(parent, 0, fs_root, path, &found_key); | 894 | ret = inode_ref_info(parent, 0, fs_root, path, &found_key); |
| 895 | if (ret > 0) | ||
| 896 | ret = -ENOENT; | ||
| 895 | if (ret) | 897 | if (ret) |
| 896 | break; | 898 | break; |
| 897 | next_inum = found_key.offset; | 899 | next_inum = found_key.offset; |
diff --git a/fs/btrfs/check-integrity.c b/fs/btrfs/check-integrity.c index b669a7d8e499..d986824bb2b4 100644 --- a/fs/btrfs/check-integrity.c +++ b/fs/btrfs/check-integrity.c | |||
| @@ -644,7 +644,7 @@ static struct btrfsic_dev_state *btrfsic_dev_state_hashtable_lookup( | |||
| 644 | static int btrfsic_process_superblock(struct btrfsic_state *state, | 644 | static int btrfsic_process_superblock(struct btrfsic_state *state, |
| 645 | struct btrfs_fs_devices *fs_devices) | 645 | struct btrfs_fs_devices *fs_devices) |
| 646 | { | 646 | { |
| 647 | int ret; | 647 | int ret = 0; |
| 648 | struct btrfs_super_block *selected_super; | 648 | struct btrfs_super_block *selected_super; |
| 649 | struct list_head *dev_head = &fs_devices->devices; | 649 | struct list_head *dev_head = &fs_devices->devices; |
| 650 | struct btrfs_device *device; | 650 | struct btrfs_device *device; |
diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c index 14f1c5a0b2d2..d02c27cd14c7 100644 --- a/fs/btrfs/compression.c +++ b/fs/btrfs/compression.c | |||
| @@ -588,6 +588,8 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, | |||
| 588 | page_offset(bio->bi_io_vec->bv_page), | 588 | page_offset(bio->bi_io_vec->bv_page), |
| 589 | PAGE_CACHE_SIZE); | 589 | PAGE_CACHE_SIZE); |
| 590 | read_unlock(&em_tree->lock); | 590 | read_unlock(&em_tree->lock); |
| 591 | if (!em) | ||
| 592 | return -EIO; | ||
| 591 | 593 | ||
| 592 | compressed_len = em->block_len; | 594 | compressed_len = em->block_len; |
| 593 | cb = kmalloc(compressed_bio_size(root, compressed_len), GFP_NOFS); | 595 | cb = kmalloc(compressed_bio_size(root, compressed_len), GFP_NOFS); |
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index 27ebe61d3ccc..80b6486fd5e6 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h | |||
| @@ -886,7 +886,7 @@ struct btrfs_block_rsv { | |||
| 886 | u64 reserved; | 886 | u64 reserved; |
| 887 | struct btrfs_space_info *space_info; | 887 | struct btrfs_space_info *space_info; |
| 888 | spinlock_t lock; | 888 | spinlock_t lock; |
| 889 | unsigned int full:1; | 889 | unsigned int full; |
| 890 | }; | 890 | }; |
| 891 | 891 | ||
| 892 | /* | 892 | /* |
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 811d9f918b1c..534266fe505f 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
| @@ -2260,6 +2260,12 @@ int open_ctree(struct super_block *sb, | |||
| 2260 | goto fail_sb_buffer; | 2260 | goto fail_sb_buffer; |
| 2261 | } | 2261 | } |
| 2262 | 2262 | ||
| 2263 | if (sectorsize < PAGE_SIZE) { | ||
| 2264 | printk(KERN_WARNING "btrfs: Incompatible sector size " | ||
| 2265 | "found on %s\n", sb->s_id); | ||
| 2266 | goto fail_sb_buffer; | ||
| 2267 | } | ||
| 2268 | |||
| 2263 | mutex_lock(&fs_info->chunk_mutex); | 2269 | mutex_lock(&fs_info->chunk_mutex); |
| 2264 | ret = btrfs_read_sys_array(tree_root); | 2270 | ret = btrfs_read_sys_array(tree_root); |
| 2265 | mutex_unlock(&fs_info->chunk_mutex); | 2271 | mutex_unlock(&fs_info->chunk_mutex); |
| @@ -2301,6 +2307,12 @@ int open_ctree(struct super_block *sb, | |||
| 2301 | 2307 | ||
| 2302 | btrfs_close_extra_devices(fs_devices); | 2308 | btrfs_close_extra_devices(fs_devices); |
| 2303 | 2309 | ||
| 2310 | if (!fs_devices->latest_bdev) { | ||
| 2311 | printk(KERN_CRIT "btrfs: failed to read devices on %s\n", | ||
| 2312 | sb->s_id); | ||
| 2313 | goto fail_tree_roots; | ||
| 2314 | } | ||
| 2315 | |||
| 2304 | retry_root_backup: | 2316 | retry_root_backup: |
| 2305 | blocksize = btrfs_level_size(tree_root, | 2317 | blocksize = btrfs_level_size(tree_root, |
| 2306 | btrfs_super_root_level(disk_super)); | 2318 | btrfs_super_root_level(disk_super)); |
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 283af7a676a3..37e0a800d34e 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
| @@ -3312,7 +3312,8 @@ commit_trans: | |||
| 3312 | } | 3312 | } |
| 3313 | data_sinfo->bytes_may_use += bytes; | 3313 | data_sinfo->bytes_may_use += bytes; |
| 3314 | trace_btrfs_space_reservation(root->fs_info, "space_info", | 3314 | trace_btrfs_space_reservation(root->fs_info, "space_info", |
| 3315 | (u64)data_sinfo, bytes, 1); | 3315 | (u64)(unsigned long)data_sinfo, |
| 3316 | bytes, 1); | ||
| 3316 | spin_unlock(&data_sinfo->lock); | 3317 | spin_unlock(&data_sinfo->lock); |
| 3317 | 3318 | ||
| 3318 | return 0; | 3319 | return 0; |
| @@ -3333,7 +3334,8 @@ void btrfs_free_reserved_data_space(struct inode *inode, u64 bytes) | |||
| 3333 | spin_lock(&data_sinfo->lock); | 3334 | spin_lock(&data_sinfo->lock); |
| 3334 | data_sinfo->bytes_may_use -= bytes; | 3335 | data_sinfo->bytes_may_use -= bytes; |
| 3335 | trace_btrfs_space_reservation(root->fs_info, "space_info", | 3336 | trace_btrfs_space_reservation(root->fs_info, "space_info", |
| 3336 | (u64)data_sinfo, bytes, 0); | 3337 | (u64)(unsigned long)data_sinfo, |
| 3338 | bytes, 0); | ||
| 3337 | spin_unlock(&data_sinfo->lock); | 3339 | spin_unlock(&data_sinfo->lock); |
| 3338 | } | 3340 | } |
| 3339 | 3341 | ||
| @@ -3611,12 +3613,15 @@ static int may_commit_transaction(struct btrfs_root *root, | |||
| 3611 | if (space_info != delayed_rsv->space_info) | 3613 | if (space_info != delayed_rsv->space_info) |
| 3612 | return -ENOSPC; | 3614 | return -ENOSPC; |
| 3613 | 3615 | ||
| 3616 | spin_lock(&space_info->lock); | ||
| 3614 | spin_lock(&delayed_rsv->lock); | 3617 | spin_lock(&delayed_rsv->lock); |
| 3615 | if (delayed_rsv->size < bytes) { | 3618 | if (space_info->bytes_pinned + delayed_rsv->size < bytes) { |
| 3616 | spin_unlock(&delayed_rsv->lock); | 3619 | spin_unlock(&delayed_rsv->lock); |
| 3620 | spin_unlock(&space_info->lock); | ||
| 3617 | return -ENOSPC; | 3621 | return -ENOSPC; |
| 3618 | } | 3622 | } |
| 3619 | spin_unlock(&delayed_rsv->lock); | 3623 | spin_unlock(&delayed_rsv->lock); |
| 3624 | spin_unlock(&space_info->lock); | ||
| 3620 | 3625 | ||
| 3621 | commit: | 3626 | commit: |
| 3622 | trans = btrfs_join_transaction(root); | 3627 | trans = btrfs_join_transaction(root); |
| @@ -3695,9 +3700,9 @@ again: | |||
| 3695 | if (used + orig_bytes <= space_info->total_bytes) { | 3700 | if (used + orig_bytes <= space_info->total_bytes) { |
| 3696 | space_info->bytes_may_use += orig_bytes; | 3701 | space_info->bytes_may_use += orig_bytes; |
| 3697 | trace_btrfs_space_reservation(root->fs_info, | 3702 | trace_btrfs_space_reservation(root->fs_info, |
| 3698 | "space_info", | 3703 | "space_info", |
| 3699 | (u64)space_info, | 3704 | (u64)(unsigned long)space_info, |
| 3700 | orig_bytes, 1); | 3705 | orig_bytes, 1); |
| 3701 | ret = 0; | 3706 | ret = 0; |
| 3702 | } else { | 3707 | } else { |
| 3703 | /* | 3708 | /* |
| @@ -3766,9 +3771,9 @@ again: | |||
| 3766 | if (used + num_bytes < space_info->total_bytes + avail) { | 3771 | if (used + num_bytes < space_info->total_bytes + avail) { |
| 3767 | space_info->bytes_may_use += orig_bytes; | 3772 | space_info->bytes_may_use += orig_bytes; |
| 3768 | trace_btrfs_space_reservation(root->fs_info, | 3773 | trace_btrfs_space_reservation(root->fs_info, |
| 3769 | "space_info", | 3774 | "space_info", |
| 3770 | (u64)space_info, | 3775 | (u64)(unsigned long)space_info, |
| 3771 | orig_bytes, 1); | 3776 | orig_bytes, 1); |
| 3772 | ret = 0; | 3777 | ret = 0; |
| 3773 | } else { | 3778 | } else { |
| 3774 | wait_ordered = true; | 3779 | wait_ordered = true; |
| @@ -3913,8 +3918,8 @@ static void block_rsv_release_bytes(struct btrfs_fs_info *fs_info, | |||
| 3913 | spin_lock(&space_info->lock); | 3918 | spin_lock(&space_info->lock); |
| 3914 | space_info->bytes_may_use -= num_bytes; | 3919 | space_info->bytes_may_use -= num_bytes; |
| 3915 | trace_btrfs_space_reservation(fs_info, "space_info", | 3920 | trace_btrfs_space_reservation(fs_info, "space_info", |
| 3916 | (u64)space_info, | 3921 | (u64)(unsigned long)space_info, |
| 3917 | num_bytes, 0); | 3922 | num_bytes, 0); |
| 3918 | space_info->reservation_progress++; | 3923 | space_info->reservation_progress++; |
| 3919 | spin_unlock(&space_info->lock); | 3924 | spin_unlock(&space_info->lock); |
| 3920 | } | 3925 | } |
| @@ -4105,7 +4110,7 @@ static u64 calc_global_metadata_size(struct btrfs_fs_info *fs_info) | |||
| 4105 | num_bytes += div64_u64(data_used + meta_used, 50); | 4110 | num_bytes += div64_u64(data_used + meta_used, 50); |
| 4106 | 4111 | ||
| 4107 | if (num_bytes * 3 > meta_used) | 4112 | if (num_bytes * 3 > meta_used) |
| 4108 | num_bytes = div64_u64(meta_used, 3); | 4113 | num_bytes = div64_u64(meta_used, 3) * 2; |
| 4109 | 4114 | ||
| 4110 | return ALIGN(num_bytes, fs_info->extent_root->leafsize << 10); | 4115 | return ALIGN(num_bytes, fs_info->extent_root->leafsize << 10); |
| 4111 | } | 4116 | } |
| @@ -4132,14 +4137,14 @@ static void update_global_block_rsv(struct btrfs_fs_info *fs_info) | |||
| 4132 | block_rsv->reserved += num_bytes; | 4137 | block_rsv->reserved += num_bytes; |
| 4133 | sinfo->bytes_may_use += num_bytes; | 4138 | sinfo->bytes_may_use += num_bytes; |
| 4134 | trace_btrfs_space_reservation(fs_info, "space_info", | 4139 | trace_btrfs_space_reservation(fs_info, "space_info", |
| 4135 | (u64)sinfo, num_bytes, 1); | 4140 | (u64)(unsigned long)sinfo, num_bytes, 1); |
| 4136 | } | 4141 | } |
| 4137 | 4142 | ||
| 4138 | if (block_rsv->reserved >= block_rsv->size) { | 4143 | if (block_rsv->reserved >= block_rsv->size) { |
| 4139 | num_bytes = block_rsv->reserved - block_rsv->size; | 4144 | num_bytes = block_rsv->reserved - block_rsv->size; |
| 4140 | sinfo->bytes_may_use -= num_bytes; | 4145 | sinfo->bytes_may_use -= num_bytes; |
| 4141 | trace_btrfs_space_reservation(fs_info, "space_info", | 4146 | trace_btrfs_space_reservation(fs_info, "space_info", |
| 4142 | (u64)sinfo, num_bytes, 0); | 4147 | (u64)(unsigned long)sinfo, num_bytes, 0); |
| 4143 | sinfo->reservation_progress++; | 4148 | sinfo->reservation_progress++; |
| 4144 | block_rsv->reserved = block_rsv->size; | 4149 | block_rsv->reserved = block_rsv->size; |
| 4145 | block_rsv->full = 1; | 4150 | block_rsv->full = 1; |
| @@ -4192,7 +4197,8 @@ void btrfs_trans_release_metadata(struct btrfs_trans_handle *trans, | |||
| 4192 | if (!trans->bytes_reserved) | 4197 | if (!trans->bytes_reserved) |
| 4193 | return; | 4198 | return; |
| 4194 | 4199 | ||
| 4195 | trace_btrfs_space_reservation(root->fs_info, "transaction", (u64)trans, | 4200 | trace_btrfs_space_reservation(root->fs_info, "transaction", |
| 4201 | (u64)(unsigned long)trans, | ||
| 4196 | trans->bytes_reserved, 0); | 4202 | trans->bytes_reserved, 0); |
| 4197 | btrfs_block_rsv_release(root, trans->block_rsv, trans->bytes_reserved); | 4203 | btrfs_block_rsv_release(root, trans->block_rsv, trans->bytes_reserved); |
| 4198 | trans->bytes_reserved = 0; | 4204 | trans->bytes_reserved = 0; |
| @@ -4710,9 +4716,9 @@ static int btrfs_update_reserved_bytes(struct btrfs_block_group_cache *cache, | |||
| 4710 | space_info->bytes_reserved += num_bytes; | 4716 | space_info->bytes_reserved += num_bytes; |
| 4711 | if (reserve == RESERVE_ALLOC) { | 4717 | if (reserve == RESERVE_ALLOC) { |
| 4712 | trace_btrfs_space_reservation(cache->fs_info, | 4718 | trace_btrfs_space_reservation(cache->fs_info, |
| 4713 | "space_info", | 4719 | "space_info", |
| 4714 | (u64)space_info, | 4720 | (u64)(unsigned long)space_info, |
| 4715 | num_bytes, 0); | 4721 | num_bytes, 0); |
| 4716 | space_info->bytes_may_use -= num_bytes; | 4722 | space_info->bytes_may_use -= num_bytes; |
| 4717 | } | 4723 | } |
| 4718 | } | 4724 | } |
| @@ -7886,9 +7892,16 @@ int btrfs_trim_fs(struct btrfs_root *root, struct fstrim_range *range) | |||
| 7886 | u64 start; | 7892 | u64 start; |
| 7887 | u64 end; | 7893 | u64 end; |
| 7888 | u64 trimmed = 0; | 7894 | u64 trimmed = 0; |
| 7895 | u64 total_bytes = btrfs_super_total_bytes(fs_info->super_copy); | ||
| 7889 | int ret = 0; | 7896 | int ret = 0; |
| 7890 | 7897 | ||
| 7891 | cache = btrfs_lookup_block_group(fs_info, range->start); | 7898 | /* |
| 7899 | * try to trim all FS space, our block group may start from non-zero. | ||
| 7900 | */ | ||
| 7901 | if (range->len == total_bytes) | ||
| 7902 | cache = btrfs_lookup_first_block_group(fs_info, range->start); | ||
| 7903 | else | ||
| 7904 | cache = btrfs_lookup_block_group(fs_info, range->start); | ||
| 7892 | 7905 | ||
| 7893 | while (cache) { | 7906 | while (cache) { |
| 7894 | if (cache->key.objectid >= (range->start + range->len)) { | 7907 | if (cache->key.objectid >= (range->start + range->len)) { |
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index fcf77e1ded40..a55fbe6252de 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c | |||
| @@ -513,6 +513,15 @@ hit_next: | |||
| 513 | WARN_ON(state->end < start); | 513 | WARN_ON(state->end < start); |
| 514 | last_end = state->end; | 514 | last_end = state->end; |
| 515 | 515 | ||
| 516 | if (state->end < end && !need_resched()) | ||
| 517 | next_node = rb_next(&state->rb_node); | ||
| 518 | else | ||
| 519 | next_node = NULL; | ||
| 520 | |||
| 521 | /* the state doesn't have the wanted bits, go ahead */ | ||
| 522 | if (!(state->state & bits)) | ||
| 523 | goto next; | ||
| 524 | |||
| 516 | /* | 525 | /* |
| 517 | * | ---- desired range ---- | | 526 | * | ---- desired range ---- | |
| 518 | * | state | or | 527 | * | state | or |
| @@ -565,20 +574,15 @@ hit_next: | |||
| 565 | goto out; | 574 | goto out; |
| 566 | } | 575 | } |
| 567 | 576 | ||
| 568 | if (state->end < end && prealloc && !need_resched()) | ||
| 569 | next_node = rb_next(&state->rb_node); | ||
| 570 | else | ||
| 571 | next_node = NULL; | ||
| 572 | |||
| 573 | set |= clear_state_bit(tree, state, &bits, wake); | 577 | set |= clear_state_bit(tree, state, &bits, wake); |
| 578 | next: | ||
| 574 | if (last_end == (u64)-1) | 579 | if (last_end == (u64)-1) |
| 575 | goto out; | 580 | goto out; |
| 576 | start = last_end + 1; | 581 | start = last_end + 1; |
| 577 | if (start <= end && next_node) { | 582 | if (start <= end && next_node) { |
| 578 | state = rb_entry(next_node, struct extent_state, | 583 | state = rb_entry(next_node, struct extent_state, |
| 579 | rb_node); | 584 | rb_node); |
| 580 | if (state->start == start) | 585 | goto hit_next; |
| 581 | goto hit_next; | ||
| 582 | } | 586 | } |
| 583 | goto search_again; | 587 | goto search_again; |
| 584 | 588 | ||
| @@ -961,8 +965,6 @@ hit_next: | |||
| 961 | 965 | ||
| 962 | set_state_bits(tree, state, &bits); | 966 | set_state_bits(tree, state, &bits); |
| 963 | clear_state_bit(tree, state, &clear_bits, 0); | 967 | clear_state_bit(tree, state, &clear_bits, 0); |
| 964 | |||
| 965 | merge_state(tree, state); | ||
| 966 | if (last_end == (u64)-1) | 968 | if (last_end == (u64)-1) |
| 967 | goto out; | 969 | goto out; |
| 968 | 970 | ||
| @@ -1007,7 +1009,6 @@ hit_next: | |||
| 1007 | if (state->end <= end) { | 1009 | if (state->end <= end) { |
| 1008 | set_state_bits(tree, state, &bits); | 1010 | set_state_bits(tree, state, &bits); |
| 1009 | clear_state_bit(tree, state, &clear_bits, 0); | 1011 | clear_state_bit(tree, state, &clear_bits, 0); |
| 1010 | merge_state(tree, state); | ||
| 1011 | if (last_end == (u64)-1) | 1012 | if (last_end == (u64)-1) |
| 1012 | goto out; | 1013 | goto out; |
| 1013 | start = last_end + 1; | 1014 | start = last_end + 1; |
| @@ -1068,8 +1069,6 @@ hit_next: | |||
| 1068 | 1069 | ||
| 1069 | set_state_bits(tree, prealloc, &bits); | 1070 | set_state_bits(tree, prealloc, &bits); |
| 1070 | clear_state_bit(tree, prealloc, &clear_bits, 0); | 1071 | clear_state_bit(tree, prealloc, &clear_bits, 0); |
| 1071 | |||
| 1072 | merge_state(tree, prealloc); | ||
| 1073 | prealloc = NULL; | 1072 | prealloc = NULL; |
| 1074 | goto out; | 1073 | goto out; |
| 1075 | } | 1074 | } |
| @@ -2154,13 +2153,46 @@ static int bio_readpage_error(struct bio *failed_bio, struct page *page, | |||
| 2154 | "this_mirror=%d, num_copies=%d, in_validation=%d\n", read_mode, | 2153 | "this_mirror=%d, num_copies=%d, in_validation=%d\n", read_mode, |
| 2155 | failrec->this_mirror, num_copies, failrec->in_validation); | 2154 | failrec->this_mirror, num_copies, failrec->in_validation); |
| 2156 | 2155 | ||
| 2157 | tree->ops->submit_bio_hook(inode, read_mode, bio, failrec->this_mirror, | 2156 | ret = tree->ops->submit_bio_hook(inode, read_mode, bio, |
| 2158 | failrec->bio_flags, 0); | 2157 | failrec->this_mirror, |
| 2159 | return 0; | 2158 | failrec->bio_flags, 0); |
| 2159 | return ret; | ||
| 2160 | } | 2160 | } |
| 2161 | 2161 | ||
| 2162 | /* lots and lots of room for performance fixes in the end_bio funcs */ | 2162 | /* lots and lots of room for performance fixes in the end_bio funcs */ |
| 2163 | 2163 | ||
| 2164 | int end_extent_writepage(struct page *page, int err, u64 start, u64 end) | ||
| 2165 | { | ||
| 2166 | int uptodate = (err == 0); | ||
| 2167 | struct extent_io_tree *tree; | ||
| 2168 | int ret; | ||
| 2169 | |||
| 2170 | tree = &BTRFS_I(page->mapping->host)->io_tree; | ||
| 2171 | |||
| 2172 | if (tree->ops && tree->ops->writepage_end_io_hook) { | ||
| 2173 | ret = tree->ops->writepage_end_io_hook(page, start, | ||
| 2174 | end, NULL, uptodate); | ||
| 2175 | if (ret) | ||
| 2176 | uptodate = 0; | ||
| 2177 | } | ||
| 2178 | |||
| 2179 | if (!uptodate && tree->ops && | ||
| 2180 | tree->ops->writepage_io_failed_hook) { | ||
| 2181 | ret = tree->ops->writepage_io_failed_hook(NULL, page, | ||
| 2182 | start, end, NULL); | ||
| 2183 | /* Writeback already completed */ | ||
| 2184 | if (ret == 0) | ||
| 2185 | return 1; | ||
| 2186 | } | ||
| 2187 | |||
| 2188 | if (!uptodate) { | ||
| 2189 | clear_extent_uptodate(tree, start, end, NULL, GFP_NOFS); | ||
| 2190 | ClearPageUptodate(page); | ||
| 2191 | SetPageError(page); | ||
| 2192 | } | ||
| 2193 | return 0; | ||
| 2194 | } | ||
| 2195 | |||
| 2164 | /* | 2196 | /* |
| 2165 | * after a writepage IO is done, we need to: | 2197 | * after a writepage IO is done, we need to: |
| 2166 | * clear the uptodate bits on error | 2198 | * clear the uptodate bits on error |
| @@ -2172,13 +2204,11 @@ static int bio_readpage_error(struct bio *failed_bio, struct page *page, | |||
| 2172 | */ | 2204 | */ |
| 2173 | static void end_bio_extent_writepage(struct bio *bio, int err) | 2205 | static void end_bio_extent_writepage(struct bio *bio, int err) |
| 2174 | { | 2206 | { |
| 2175 | int uptodate = err == 0; | ||
| 2176 | struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1; | 2207 | struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1; |
| 2177 | struct extent_io_tree *tree; | 2208 | struct extent_io_tree *tree; |
| 2178 | u64 start; | 2209 | u64 start; |
| 2179 | u64 end; | 2210 | u64 end; |
| 2180 | int whole_page; | 2211 | int whole_page; |
| 2181 | int ret; | ||
| 2182 | 2212 | ||
| 2183 | do { | 2213 | do { |
| 2184 | struct page *page = bvec->bv_page; | 2214 | struct page *page = bvec->bv_page; |
| @@ -2195,28 +2225,9 @@ static void end_bio_extent_writepage(struct bio *bio, int err) | |||
| 2195 | 2225 | ||
| 2196 | if (--bvec >= bio->bi_io_vec) | 2226 | if (--bvec >= bio->bi_io_vec) |
| 2197 | prefetchw(&bvec->bv_page->flags); | 2227 | prefetchw(&bvec->bv_page->flags); |
| 2198 | if (tree->ops && tree->ops->writepage_end_io_hook) { | ||
| 2199 | ret = tree->ops->writepage_end_io_hook(page, start, | ||
| 2200 | end, NULL, uptodate); | ||
| 2201 | if (ret) | ||
| 2202 | uptodate = 0; | ||
| 2203 | } | ||
| 2204 | |||
| 2205 | if (!uptodate && tree->ops && | ||
| 2206 | tree->ops->writepage_io_failed_hook) { | ||
| 2207 | ret = tree->ops->writepage_io_failed_hook(bio, page, | ||
| 2208 | start, end, NULL); | ||
| 2209 | if (ret == 0) { | ||
| 2210 | uptodate = (err == 0); | ||
| 2211 | continue; | ||
| 2212 | } | ||
| 2213 | } | ||
| 2214 | 2228 | ||
| 2215 | if (!uptodate) { | 2229 | if (end_extent_writepage(page, err, start, end)) |
| 2216 | clear_extent_uptodate(tree, start, end, NULL, GFP_NOFS); | 2230 | continue; |
| 2217 | ClearPageUptodate(page); | ||
| 2218 | SetPageError(page); | ||
| 2219 | } | ||
| 2220 | 2231 | ||
| 2221 | if (whole_page) | 2232 | if (whole_page) |
| 2222 | end_page_writeback(page); | 2233 | end_page_writeback(page); |
| @@ -2779,9 +2790,12 @@ static int __extent_writepage(struct page *page, struct writeback_control *wbc, | |||
| 2779 | delalloc_start = delalloc_end + 1; | 2790 | delalloc_start = delalloc_end + 1; |
| 2780 | continue; | 2791 | continue; |
| 2781 | } | 2792 | } |
| 2782 | tree->ops->fill_delalloc(inode, page, delalloc_start, | 2793 | ret = tree->ops->fill_delalloc(inode, page, |
| 2783 | delalloc_end, &page_started, | 2794 | delalloc_start, |
| 2784 | &nr_written); | 2795 | delalloc_end, |
| 2796 | &page_started, | ||
| 2797 | &nr_written); | ||
| 2798 | BUG_ON(ret); | ||
| 2785 | /* | 2799 | /* |
| 2786 | * delalloc_end is already one less than the total | 2800 | * delalloc_end is already one less than the total |
| 2787 | * length, so we don't subtract one from | 2801 | * length, so we don't subtract one from |
| @@ -2818,8 +2832,12 @@ static int __extent_writepage(struct page *page, struct writeback_control *wbc, | |||
| 2818 | if (tree->ops && tree->ops->writepage_start_hook) { | 2832 | if (tree->ops && tree->ops->writepage_start_hook) { |
| 2819 | ret = tree->ops->writepage_start_hook(page, start, | 2833 | ret = tree->ops->writepage_start_hook(page, start, |
| 2820 | page_end); | 2834 | page_end); |
| 2821 | if (ret == -EAGAIN) { | 2835 | if (ret) { |
| 2822 | redirty_page_for_writepage(wbc, page); | 2836 | /* Fixup worker will requeue */ |
| 2837 | if (ret == -EBUSY) | ||
| 2838 | wbc->pages_skipped++; | ||
| 2839 | else | ||
| 2840 | redirty_page_for_writepage(wbc, page); | ||
| 2823 | update_nr_written(page, wbc, nr_written); | 2841 | update_nr_written(page, wbc, nr_written); |
| 2824 | unlock_page(page); | 2842 | unlock_page(page); |
| 2825 | ret = 0; | 2843 | ret = 0; |
| @@ -3289,7 +3307,7 @@ int try_release_extent_mapping(struct extent_map_tree *map, | |||
| 3289 | len = end - start + 1; | 3307 | len = end - start + 1; |
| 3290 | write_lock(&map->lock); | 3308 | write_lock(&map->lock); |
| 3291 | em = lookup_extent_mapping(map, start, len); | 3309 | em = lookup_extent_mapping(map, start, len); |
| 3292 | if (IS_ERR_OR_NULL(em)) { | 3310 | if (!em) { |
| 3293 | write_unlock(&map->lock); | 3311 | write_unlock(&map->lock); |
| 3294 | break; | 3312 | break; |
| 3295 | } | 3313 | } |
| @@ -3853,10 +3871,9 @@ int clear_extent_buffer_uptodate(struct extent_io_tree *tree, | |||
| 3853 | num_pages = num_extent_pages(eb->start, eb->len); | 3871 | num_pages = num_extent_pages(eb->start, eb->len); |
| 3854 | clear_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags); | 3872 | clear_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags); |
| 3855 | 3873 | ||
| 3856 | if (eb_straddles_pages(eb)) { | 3874 | clear_extent_uptodate(tree, eb->start, eb->start + eb->len - 1, |
| 3857 | clear_extent_uptodate(tree, eb->start, eb->start + eb->len - 1, | 3875 | cached_state, GFP_NOFS); |
| 3858 | cached_state, GFP_NOFS); | 3876 | |
| 3859 | } | ||
| 3860 | for (i = 0; i < num_pages; i++) { | 3877 | for (i = 0; i < num_pages; i++) { |
| 3861 | page = extent_buffer_page(eb, i); | 3878 | page = extent_buffer_page(eb, i); |
| 3862 | if (page) | 3879 | if (page) |
diff --git a/fs/btrfs/extent_io.h b/fs/btrfs/extent_io.h index bc6a042cb6fc..cecc3518c121 100644 --- a/fs/btrfs/extent_io.h +++ b/fs/btrfs/extent_io.h | |||
| @@ -319,4 +319,5 @@ struct btrfs_mapping_tree; | |||
| 319 | int repair_io_failure(struct btrfs_mapping_tree *map_tree, u64 start, | 319 | int repair_io_failure(struct btrfs_mapping_tree *map_tree, u64 start, |
| 320 | u64 length, u64 logical, struct page *page, | 320 | u64 length, u64 logical, struct page *page, |
| 321 | int mirror_num); | 321 | int mirror_num); |
| 322 | int end_extent_writepage(struct page *page, int err, u64 start, u64 end); | ||
| 322 | #endif | 323 | #endif |
diff --git a/fs/btrfs/extent_map.h b/fs/btrfs/extent_map.h index 33a7890b1f40..1195f09761fe 100644 --- a/fs/btrfs/extent_map.h +++ b/fs/btrfs/extent_map.h | |||
| @@ -26,8 +26,8 @@ struct extent_map { | |||
| 26 | unsigned long flags; | 26 | unsigned long flags; |
| 27 | struct block_device *bdev; | 27 | struct block_device *bdev; |
| 28 | atomic_t refs; | 28 | atomic_t refs; |
| 29 | unsigned int in_tree:1; | 29 | unsigned int in_tree; |
| 30 | unsigned int compress_type:4; | 30 | unsigned int compress_type; |
| 31 | }; | 31 | }; |
| 32 | 32 | ||
| 33 | struct extent_map_tree { | 33 | struct extent_map_tree { |
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index 859ba2dd8890..e8d06b6b9194 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c | |||
| @@ -1605,6 +1605,14 @@ static long btrfs_fallocate(struct file *file, int mode, | |||
| 1605 | return -EOPNOTSUPP; | 1605 | return -EOPNOTSUPP; |
| 1606 | 1606 | ||
| 1607 | /* | 1607 | /* |
| 1608 | * Make sure we have enough space before we do the | ||
| 1609 | * allocation. | ||
| 1610 | */ | ||
| 1611 | ret = btrfs_check_data_free_space(inode, len); | ||
| 1612 | if (ret) | ||
| 1613 | return ret; | ||
| 1614 | |||
| 1615 | /* | ||
| 1608 | * wait for ordered IO before we have any locks. We'll loop again | 1616 | * wait for ordered IO before we have any locks. We'll loop again |
| 1609 | * below with the locks held. | 1617 | * below with the locks held. |
| 1610 | */ | 1618 | */ |
| @@ -1667,27 +1675,12 @@ static long btrfs_fallocate(struct file *file, int mode, | |||
| 1667 | if (em->block_start == EXTENT_MAP_HOLE || | 1675 | if (em->block_start == EXTENT_MAP_HOLE || |
| 1668 | (cur_offset >= inode->i_size && | 1676 | (cur_offset >= inode->i_size && |
| 1669 | !test_bit(EXTENT_FLAG_PREALLOC, &em->flags))) { | 1677 | !test_bit(EXTENT_FLAG_PREALLOC, &em->flags))) { |
| 1670 | |||
| 1671 | /* | ||
| 1672 | * Make sure we have enough space before we do the | ||
| 1673 | * allocation. | ||
| 1674 | */ | ||
| 1675 | ret = btrfs_check_data_free_space(inode, last_byte - | ||
| 1676 | cur_offset); | ||
| 1677 | if (ret) { | ||
| 1678 | free_extent_map(em); | ||
| 1679 | break; | ||
| 1680 | } | ||
| 1681 | |||
| 1682 | ret = btrfs_prealloc_file_range(inode, mode, cur_offset, | 1678 | ret = btrfs_prealloc_file_range(inode, mode, cur_offset, |
| 1683 | last_byte - cur_offset, | 1679 | last_byte - cur_offset, |
| 1684 | 1 << inode->i_blkbits, | 1680 | 1 << inode->i_blkbits, |
| 1685 | offset + len, | 1681 | offset + len, |
| 1686 | &alloc_hint); | 1682 | &alloc_hint); |
| 1687 | 1683 | ||
| 1688 | /* Let go of our reservation. */ | ||
| 1689 | btrfs_free_reserved_data_space(inode, last_byte - | ||
| 1690 | cur_offset); | ||
| 1691 | if (ret < 0) { | 1684 | if (ret < 0) { |
| 1692 | free_extent_map(em); | 1685 | free_extent_map(em); |
| 1693 | break; | 1686 | break; |
| @@ -1715,6 +1708,8 @@ static long btrfs_fallocate(struct file *file, int mode, | |||
| 1715 | &cached_state, GFP_NOFS); | 1708 | &cached_state, GFP_NOFS); |
| 1716 | out: | 1709 | out: |
| 1717 | mutex_unlock(&inode->i_mutex); | 1710 | mutex_unlock(&inode->i_mutex); |
| 1711 | /* Let go of our reservation. */ | ||
| 1712 | btrfs_free_reserved_data_space(inode, len); | ||
| 1718 | return ret; | 1713 | return ret; |
| 1719 | } | 1714 | } |
| 1720 | 1715 | ||
| @@ -1761,7 +1756,7 @@ static int find_desired_extent(struct inode *inode, loff_t *offset, int origin) | |||
| 1761 | start - root->sectorsize, | 1756 | start - root->sectorsize, |
| 1762 | root->sectorsize, 0); | 1757 | root->sectorsize, 0); |
| 1763 | if (IS_ERR(em)) { | 1758 | if (IS_ERR(em)) { |
| 1764 | ret = -ENXIO; | 1759 | ret = PTR_ERR(em); |
| 1765 | goto out; | 1760 | goto out; |
| 1766 | } | 1761 | } |
| 1767 | last_end = em->start + em->len; | 1762 | last_end = em->start + em->len; |
| @@ -1773,7 +1768,7 @@ static int find_desired_extent(struct inode *inode, loff_t *offset, int origin) | |||
| 1773 | while (1) { | 1768 | while (1) { |
| 1774 | em = btrfs_get_extent_fiemap(inode, NULL, 0, start, len, 0); | 1769 | em = btrfs_get_extent_fiemap(inode, NULL, 0, start, len, 0); |
| 1775 | if (IS_ERR(em)) { | 1770 | if (IS_ERR(em)) { |
| 1776 | ret = -ENXIO; | 1771 | ret = PTR_ERR(em); |
| 1777 | break; | 1772 | break; |
| 1778 | } | 1773 | } |
| 1779 | 1774 | ||
diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c index c2f20594c9f7..710ea380c7ed 100644 --- a/fs/btrfs/free-space-cache.c +++ b/fs/btrfs/free-space-cache.c | |||
| @@ -777,6 +777,7 @@ int load_free_space_cache(struct btrfs_fs_info *fs_info, | |||
| 777 | spin_lock(&block_group->lock); | 777 | spin_lock(&block_group->lock); |
| 778 | if (block_group->disk_cache_state != BTRFS_DC_WRITTEN) { | 778 | if (block_group->disk_cache_state != BTRFS_DC_WRITTEN) { |
| 779 | spin_unlock(&block_group->lock); | 779 | spin_unlock(&block_group->lock); |
| 780 | btrfs_free_path(path); | ||
| 780 | goto out; | 781 | goto out; |
| 781 | } | 782 | } |
| 782 | spin_unlock(&block_group->lock); | 783 | spin_unlock(&block_group->lock); |
diff --git a/fs/btrfs/inode-map.c b/fs/btrfs/inode-map.c index 213ffa86ce1b..ee15d88b33d2 100644 --- a/fs/btrfs/inode-map.c +++ b/fs/btrfs/inode-map.c | |||
| @@ -438,7 +438,8 @@ int btrfs_save_ino_cache(struct btrfs_root *root, | |||
| 438 | trans->bytes_reserved); | 438 | trans->bytes_reserved); |
| 439 | if (ret) | 439 | if (ret) |
| 440 | goto out; | 440 | goto out; |
| 441 | trace_btrfs_space_reservation(root->fs_info, "ino_cache", (u64)trans, | 441 | trace_btrfs_space_reservation(root->fs_info, "ino_cache", |
| 442 | (u64)(unsigned long)trans, | ||
| 442 | trans->bytes_reserved, 1); | 443 | trans->bytes_reserved, 1); |
| 443 | again: | 444 | again: |
| 444 | inode = lookup_free_ino_inode(root, path); | 445 | inode = lookup_free_ino_inode(root, path); |
| @@ -500,7 +501,8 @@ again: | |||
| 500 | out_put: | 501 | out_put: |
| 501 | iput(inode); | 502 | iput(inode); |
| 502 | out_release: | 503 | out_release: |
| 503 | trace_btrfs_space_reservation(root->fs_info, "ino_cache", (u64)trans, | 504 | trace_btrfs_space_reservation(root->fs_info, "ino_cache", |
| 505 | (u64)(unsigned long)trans, | ||
| 504 | trans->bytes_reserved, 0); | 506 | trans->bytes_reserved, 0); |
| 505 | btrfs_block_rsv_release(root, trans->block_rsv, trans->bytes_reserved); | 507 | btrfs_block_rsv_release(root, trans->block_rsv, trans->bytes_reserved); |
| 506 | out: | 508 | out: |
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 32214fe0f7e3..892b34785ccc 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
| @@ -1555,6 +1555,7 @@ static void btrfs_writepage_fixup_worker(struct btrfs_work *work) | |||
| 1555 | struct inode *inode; | 1555 | struct inode *inode; |
| 1556 | u64 page_start; | 1556 | u64 page_start; |
| 1557 | u64 page_end; | 1557 | u64 page_end; |
| 1558 | int ret; | ||
| 1558 | 1559 | ||
| 1559 | fixup = container_of(work, struct btrfs_writepage_fixup, work); | 1560 | fixup = container_of(work, struct btrfs_writepage_fixup, work); |
| 1560 | page = fixup->page; | 1561 | page = fixup->page; |
| @@ -1582,12 +1583,21 @@ again: | |||
| 1582 | page_end, &cached_state, GFP_NOFS); | 1583 | page_end, &cached_state, GFP_NOFS); |
| 1583 | unlock_page(page); | 1584 | unlock_page(page); |
| 1584 | btrfs_start_ordered_extent(inode, ordered, 1); | 1585 | btrfs_start_ordered_extent(inode, ordered, 1); |
| 1586 | btrfs_put_ordered_extent(ordered); | ||
| 1585 | goto again; | 1587 | goto again; |
| 1586 | } | 1588 | } |
| 1587 | 1589 | ||
| 1588 | BUG(); | 1590 | ret = btrfs_delalloc_reserve_space(inode, PAGE_CACHE_SIZE); |
| 1591 | if (ret) { | ||
| 1592 | mapping_set_error(page->mapping, ret); | ||
| 1593 | end_extent_writepage(page, ret, page_start, page_end); | ||
| 1594 | ClearPageChecked(page); | ||
| 1595 | goto out; | ||
| 1596 | } | ||
| 1597 | |||
| 1589 | btrfs_set_extent_delalloc(inode, page_start, page_end, &cached_state); | 1598 | btrfs_set_extent_delalloc(inode, page_start, page_end, &cached_state); |
| 1590 | ClearPageChecked(page); | 1599 | ClearPageChecked(page); |
| 1600 | set_page_dirty(page); | ||
| 1591 | out: | 1601 | out: |
| 1592 | unlock_extent_cached(&BTRFS_I(inode)->io_tree, page_start, page_end, | 1602 | unlock_extent_cached(&BTRFS_I(inode)->io_tree, page_start, page_end, |
| 1593 | &cached_state, GFP_NOFS); | 1603 | &cached_state, GFP_NOFS); |
| @@ -1630,7 +1640,7 @@ static int btrfs_writepage_start_hook(struct page *page, u64 start, u64 end) | |||
| 1630 | fixup->work.func = btrfs_writepage_fixup_worker; | 1640 | fixup->work.func = btrfs_writepage_fixup_worker; |
| 1631 | fixup->page = page; | 1641 | fixup->page = page; |
| 1632 | btrfs_queue_worker(&root->fs_info->fixup_workers, &fixup->work); | 1642 | btrfs_queue_worker(&root->fs_info->fixup_workers, &fixup->work); |
| 1633 | return -EAGAIN; | 1643 | return -EBUSY; |
| 1634 | } | 1644 | } |
| 1635 | 1645 | ||
| 1636 | static int insert_reserved_file_extent(struct btrfs_trans_handle *trans, | 1646 | static int insert_reserved_file_extent(struct btrfs_trans_handle *trans, |
| @@ -4575,7 +4585,8 @@ int btrfs_add_link(struct btrfs_trans_handle *trans, | |||
| 4575 | ret = btrfs_insert_dir_item(trans, root, name, name_len, | 4585 | ret = btrfs_insert_dir_item(trans, root, name, name_len, |
| 4576 | parent_inode, &key, | 4586 | parent_inode, &key, |
| 4577 | btrfs_inode_type(inode), index); | 4587 | btrfs_inode_type(inode), index); |
| 4578 | BUG_ON(ret); | 4588 | if (ret) |
| 4589 | goto fail_dir_item; | ||
| 4579 | 4590 | ||
| 4580 | btrfs_i_size_write(parent_inode, parent_inode->i_size + | 4591 | btrfs_i_size_write(parent_inode, parent_inode->i_size + |
| 4581 | name_len * 2); | 4592 | name_len * 2); |
| @@ -4583,6 +4594,23 @@ int btrfs_add_link(struct btrfs_trans_handle *trans, | |||
| 4583 | ret = btrfs_update_inode(trans, root, parent_inode); | 4594 | ret = btrfs_update_inode(trans, root, parent_inode); |
| 4584 | } | 4595 | } |
| 4585 | return ret; | 4596 | return ret; |
| 4597 | |||
| 4598 | fail_dir_item: | ||
| 4599 | if (unlikely(ino == BTRFS_FIRST_FREE_OBJECTID)) { | ||
| 4600 | u64 local_index; | ||
| 4601 | int err; | ||
| 4602 | err = btrfs_del_root_ref(trans, root->fs_info->tree_root, | ||
| 4603 | key.objectid, root->root_key.objectid, | ||
| 4604 | parent_ino, &local_index, name, name_len); | ||
| 4605 | |||
| 4606 | } else if (add_backref) { | ||
| 4607 | u64 local_index; | ||
| 4608 | int err; | ||
| 4609 | |||
| 4610 | err = btrfs_del_inode_ref(trans, root, name, name_len, | ||
| 4611 | ino, parent_ino, &local_index); | ||
| 4612 | } | ||
| 4613 | return ret; | ||
| 4586 | } | 4614 | } |
| 4587 | 4615 | ||
| 4588 | static int btrfs_add_nondir(struct btrfs_trans_handle *trans, | 4616 | static int btrfs_add_nondir(struct btrfs_trans_handle *trans, |
| @@ -6696,8 +6724,10 @@ int btrfs_create_subvol_root(struct btrfs_trans_handle *trans, | |||
| 6696 | int err; | 6724 | int err; |
| 6697 | u64 index = 0; | 6725 | u64 index = 0; |
| 6698 | 6726 | ||
| 6699 | inode = btrfs_new_inode(trans, new_root, NULL, "..", 2, new_dirid, | 6727 | inode = btrfs_new_inode(trans, new_root, NULL, "..", 2, |
| 6700 | new_dirid, S_IFDIR | 0700, &index); | 6728 | new_dirid, new_dirid, |
| 6729 | S_IFDIR | (~current_umask() & S_IRWXUGO), | ||
| 6730 | &index); | ||
| 6701 | if (IS_ERR(inode)) | 6731 | if (IS_ERR(inode)) |
| 6702 | return PTR_ERR(inode); | 6732 | return PTR_ERR(inode); |
| 6703 | inode->i_op = &btrfs_dir_inode_operations; | 6733 | inode->i_op = &btrfs_dir_inode_operations; |
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 03bb62a9ee24..d8b54715c2de 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c | |||
| @@ -861,6 +861,7 @@ static int cluster_pages_for_defrag(struct inode *inode, | |||
| 861 | int i_done; | 861 | int i_done; |
| 862 | struct btrfs_ordered_extent *ordered; | 862 | struct btrfs_ordered_extent *ordered; |
| 863 | struct extent_state *cached_state = NULL; | 863 | struct extent_state *cached_state = NULL; |
| 864 | struct extent_io_tree *tree; | ||
| 864 | gfp_t mask = btrfs_alloc_write_mask(inode->i_mapping); | 865 | gfp_t mask = btrfs_alloc_write_mask(inode->i_mapping); |
| 865 | 866 | ||
| 866 | if (isize == 0) | 867 | if (isize == 0) |
| @@ -871,18 +872,34 @@ static int cluster_pages_for_defrag(struct inode *inode, | |||
| 871 | num_pages << PAGE_CACHE_SHIFT); | 872 | num_pages << PAGE_CACHE_SHIFT); |
| 872 | if (ret) | 873 | if (ret) |
| 873 | return ret; | 874 | return ret; |
| 874 | again: | ||
| 875 | ret = 0; | ||
| 876 | i_done = 0; | 875 | i_done = 0; |
| 876 | tree = &BTRFS_I(inode)->io_tree; | ||
| 877 | 877 | ||
| 878 | /* step one, lock all the pages */ | 878 | /* step one, lock all the pages */ |
| 879 | for (i = 0; i < num_pages; i++) { | 879 | for (i = 0; i < num_pages; i++) { |
| 880 | struct page *page; | 880 | struct page *page; |
| 881 | again: | ||
| 881 | page = find_or_create_page(inode->i_mapping, | 882 | page = find_or_create_page(inode->i_mapping, |
| 882 | start_index + i, mask); | 883 | start_index + i, mask); |
| 883 | if (!page) | 884 | if (!page) |
| 884 | break; | 885 | break; |
| 885 | 886 | ||
| 887 | page_start = page_offset(page); | ||
| 888 | page_end = page_start + PAGE_CACHE_SIZE - 1; | ||
| 889 | while (1) { | ||
| 890 | lock_extent(tree, page_start, page_end, GFP_NOFS); | ||
| 891 | ordered = btrfs_lookup_ordered_extent(inode, | ||
| 892 | page_start); | ||
| 893 | unlock_extent(tree, page_start, page_end, GFP_NOFS); | ||
| 894 | if (!ordered) | ||
| 895 | break; | ||
| 896 | |||
| 897 | unlock_page(page); | ||
| 898 | btrfs_start_ordered_extent(inode, ordered, 1); | ||
| 899 | btrfs_put_ordered_extent(ordered); | ||
| 900 | lock_page(page); | ||
| 901 | } | ||
| 902 | |||
| 886 | if (!PageUptodate(page)) { | 903 | if (!PageUptodate(page)) { |
| 887 | btrfs_readpage(NULL, page); | 904 | btrfs_readpage(NULL, page); |
| 888 | lock_page(page); | 905 | lock_page(page); |
| @@ -893,15 +910,22 @@ again: | |||
| 893 | break; | 910 | break; |
| 894 | } | 911 | } |
| 895 | } | 912 | } |
| 913 | |||
| 896 | isize = i_size_read(inode); | 914 | isize = i_size_read(inode); |
| 897 | file_end = (isize - 1) >> PAGE_CACHE_SHIFT; | 915 | file_end = (isize - 1) >> PAGE_CACHE_SHIFT; |
| 898 | if (!isize || page->index > file_end || | 916 | if (!isize || page->index > file_end) { |
| 899 | page->mapping != inode->i_mapping) { | ||
| 900 | /* whoops, we blew past eof, skip this page */ | 917 | /* whoops, we blew past eof, skip this page */ |
| 901 | unlock_page(page); | 918 | unlock_page(page); |
| 902 | page_cache_release(page); | 919 | page_cache_release(page); |
| 903 | break; | 920 | break; |
| 904 | } | 921 | } |
| 922 | |||
| 923 | if (page->mapping != inode->i_mapping) { | ||
| 924 | unlock_page(page); | ||
| 925 | page_cache_release(page); | ||
| 926 | goto again; | ||
| 927 | } | ||
| 928 | |||
| 905 | pages[i] = page; | 929 | pages[i] = page; |
| 906 | i_done++; | 930 | i_done++; |
| 907 | } | 931 | } |
| @@ -924,25 +948,6 @@ again: | |||
| 924 | lock_extent_bits(&BTRFS_I(inode)->io_tree, | 948 | lock_extent_bits(&BTRFS_I(inode)->io_tree, |
| 925 | page_start, page_end - 1, 0, &cached_state, | 949 | page_start, page_end - 1, 0, &cached_state, |
| 926 | GFP_NOFS); | 950 | GFP_NOFS); |
| 927 | ordered = btrfs_lookup_first_ordered_extent(inode, page_end - 1); | ||
| 928 | if (ordered && | ||
| 929 | ordered->file_offset + ordered->len > page_start && | ||
| 930 | ordered->file_offset < page_end) { | ||
| 931 | btrfs_put_ordered_extent(ordered); | ||
| 932 | unlock_extent_cached(&BTRFS_I(inode)->io_tree, | ||
| 933 | page_start, page_end - 1, | ||
| 934 | &cached_state, GFP_NOFS); | ||
| 935 | for (i = 0; i < i_done; i++) { | ||
| 936 | unlock_page(pages[i]); | ||
| 937 | page_cache_release(pages[i]); | ||
| 938 | } | ||
| 939 | btrfs_wait_ordered_range(inode, page_start, | ||
| 940 | page_end - page_start); | ||
| 941 | goto again; | ||
| 942 | } | ||
| 943 | if (ordered) | ||
| 944 | btrfs_put_ordered_extent(ordered); | ||
| 945 | |||
| 946 | clear_extent_bit(&BTRFS_I(inode)->io_tree, page_start, | 951 | clear_extent_bit(&BTRFS_I(inode)->io_tree, page_start, |
| 947 | page_end - 1, EXTENT_DIRTY | EXTENT_DELALLOC | | 952 | page_end - 1, EXTENT_DIRTY | EXTENT_DELALLOC | |
| 948 | EXTENT_DO_ACCOUNTING, 0, 0, &cached_state, | 953 | EXTENT_DO_ACCOUNTING, 0, 0, &cached_state, |
| @@ -1327,6 +1332,12 @@ static noinline int btrfs_ioctl_snap_create_transid(struct file *file, | |||
| 1327 | goto out; | 1332 | goto out; |
| 1328 | } | 1333 | } |
| 1329 | 1334 | ||
| 1335 | if (name[0] == '.' && | ||
| 1336 | (namelen == 1 || (name[1] == '.' && namelen == 2))) { | ||
| 1337 | ret = -EEXIST; | ||
| 1338 | goto out; | ||
| 1339 | } | ||
| 1340 | |||
| 1330 | if (subvol) { | 1341 | if (subvol) { |
| 1331 | ret = btrfs_mksubvol(&file->f_path, name, namelen, | 1342 | ret = btrfs_mksubvol(&file->f_path, name, namelen, |
| 1332 | NULL, transid, readonly); | 1343 | NULL, transid, readonly); |
diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index 9770cc5bfb76..abc0fbffa510 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c | |||
| @@ -1367,7 +1367,8 @@ out: | |||
| 1367 | } | 1367 | } |
| 1368 | 1368 | ||
| 1369 | static noinline_for_stack int scrub_chunk(struct scrub_dev *sdev, | 1369 | static noinline_for_stack int scrub_chunk(struct scrub_dev *sdev, |
| 1370 | u64 chunk_tree, u64 chunk_objectid, u64 chunk_offset, u64 length) | 1370 | u64 chunk_tree, u64 chunk_objectid, u64 chunk_offset, u64 length, |
| 1371 | u64 dev_offset) | ||
| 1371 | { | 1372 | { |
| 1372 | struct btrfs_mapping_tree *map_tree = | 1373 | struct btrfs_mapping_tree *map_tree = |
| 1373 | &sdev->dev->dev_root->fs_info->mapping_tree; | 1374 | &sdev->dev->dev_root->fs_info->mapping_tree; |
| @@ -1391,7 +1392,8 @@ static noinline_for_stack int scrub_chunk(struct scrub_dev *sdev, | |||
| 1391 | goto out; | 1392 | goto out; |
| 1392 | 1393 | ||
| 1393 | for (i = 0; i < map->num_stripes; ++i) { | 1394 | for (i = 0; i < map->num_stripes; ++i) { |
| 1394 | if (map->stripes[i].dev == sdev->dev) { | 1395 | if (map->stripes[i].dev == sdev->dev && |
| 1396 | map->stripes[i].physical == dev_offset) { | ||
| 1395 | ret = scrub_stripe(sdev, map, i, chunk_offset, length); | 1397 | ret = scrub_stripe(sdev, map, i, chunk_offset, length); |
| 1396 | if (ret) | 1398 | if (ret) |
| 1397 | goto out; | 1399 | goto out; |
| @@ -1487,7 +1489,7 @@ int scrub_enumerate_chunks(struct scrub_dev *sdev, u64 start, u64 end) | |||
| 1487 | break; | 1489 | break; |
| 1488 | } | 1490 | } |
| 1489 | ret = scrub_chunk(sdev, chunk_tree, chunk_objectid, | 1491 | ret = scrub_chunk(sdev, chunk_tree, chunk_objectid, |
| 1490 | chunk_offset, length); | 1492 | chunk_offset, length, found_key.offset); |
| 1491 | btrfs_put_block_group(cache); | 1493 | btrfs_put_block_group(cache); |
| 1492 | if (ret) | 1494 | if (ret) |
| 1493 | break; | 1495 | break; |
diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index 287a6728b1ad..04b77e3ceb7a 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c | |||
| @@ -327,7 +327,8 @@ again: | |||
| 327 | 327 | ||
| 328 | if (num_bytes) { | 328 | if (num_bytes) { |
| 329 | trace_btrfs_space_reservation(root->fs_info, "transaction", | 329 | trace_btrfs_space_reservation(root->fs_info, "transaction", |
| 330 | (u64)h, num_bytes, 1); | 330 | (u64)(unsigned long)h, |
| 331 | num_bytes, 1); | ||
| 331 | h->block_rsv = &root->fs_info->trans_block_rsv; | 332 | h->block_rsv = &root->fs_info->trans_block_rsv; |
| 332 | h->bytes_reserved = num_bytes; | 333 | h->bytes_reserved = num_bytes; |
| 333 | } | 334 | } |
| @@ -915,7 +916,11 @@ static noinline int create_pending_snapshot(struct btrfs_trans_handle *trans, | |||
| 915 | dentry->d_name.name, dentry->d_name.len, | 916 | dentry->d_name.name, dentry->d_name.len, |
| 916 | parent_inode, &key, | 917 | parent_inode, &key, |
| 917 | BTRFS_FT_DIR, index); | 918 | BTRFS_FT_DIR, index); |
| 918 | BUG_ON(ret); | 919 | if (ret) { |
| 920 | pending->error = -EEXIST; | ||
| 921 | dput(parent); | ||
| 922 | goto fail; | ||
| 923 | } | ||
| 919 | 924 | ||
| 920 | btrfs_i_size_write(parent_inode, parent_inode->i_size + | 925 | btrfs_i_size_write(parent_inode, parent_inode->i_size + |
| 921 | dentry->d_name.len * 2); | 926 | dentry->d_name.len * 2); |
| @@ -993,12 +998,9 @@ static noinline int create_pending_snapshots(struct btrfs_trans_handle *trans, | |||
| 993 | { | 998 | { |
| 994 | struct btrfs_pending_snapshot *pending; | 999 | struct btrfs_pending_snapshot *pending; |
| 995 | struct list_head *head = &trans->transaction->pending_snapshots; | 1000 | struct list_head *head = &trans->transaction->pending_snapshots; |
| 996 | int ret; | ||
| 997 | 1001 | ||
| 998 | list_for_each_entry(pending, head, list) { | 1002 | list_for_each_entry(pending, head, list) |
| 999 | ret = create_pending_snapshot(trans, fs_info, pending); | 1003 | create_pending_snapshot(trans, fs_info, pending); |
| 1000 | BUG_ON(ret); | ||
| 1001 | } | ||
| 1002 | return 0; | 1004 | return 0; |
| 1003 | } | 1005 | } |
| 1004 | 1006 | ||
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 0b4e2af7954d..ef41f285a475 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c | |||
| @@ -459,12 +459,23 @@ int btrfs_close_extra_devices(struct btrfs_fs_devices *fs_devices) | |||
| 459 | { | 459 | { |
| 460 | struct btrfs_device *device, *next; | 460 | struct btrfs_device *device, *next; |
| 461 | 461 | ||
| 462 | struct block_device *latest_bdev = NULL; | ||
| 463 | u64 latest_devid = 0; | ||
| 464 | u64 latest_transid = 0; | ||
| 465 | |||
| 462 | mutex_lock(&uuid_mutex); | 466 | mutex_lock(&uuid_mutex); |
| 463 | again: | 467 | again: |
| 464 | /* This is the initialized path, it is safe to release the devices. */ | 468 | /* This is the initialized path, it is safe to release the devices. */ |
| 465 | list_for_each_entry_safe(device, next, &fs_devices->devices, dev_list) { | 469 | list_for_each_entry_safe(device, next, &fs_devices->devices, dev_list) { |
| 466 | if (device->in_fs_metadata) | 470 | if (device->in_fs_metadata) { |
| 471 | if (!latest_transid || | ||
| 472 | device->generation > latest_transid) { | ||
| 473 | latest_devid = device->devid; | ||
| 474 | latest_transid = device->generation; | ||
| 475 | latest_bdev = device->bdev; | ||
| 476 | } | ||
| 467 | continue; | 477 | continue; |
| 478 | } | ||
| 468 | 479 | ||
| 469 | if (device->bdev) { | 480 | if (device->bdev) { |
| 470 | blkdev_put(device->bdev, device->mode); | 481 | blkdev_put(device->bdev, device->mode); |
| @@ -487,6 +498,10 @@ again: | |||
| 487 | goto again; | 498 | goto again; |
| 488 | } | 499 | } |
| 489 | 500 | ||
| 501 | fs_devices->latest_bdev = latest_bdev; | ||
| 502 | fs_devices->latest_devid = latest_devid; | ||
| 503 | fs_devices->latest_trans = latest_transid; | ||
| 504 | |||
| 490 | mutex_unlock(&uuid_mutex); | 505 | mutex_unlock(&uuid_mutex); |
| 491 | return 0; | 506 | return 0; |
| 492 | } | 507 | } |
| @@ -1953,7 +1968,7 @@ static int btrfs_relocate_chunk(struct btrfs_root *root, | |||
| 1953 | em = lookup_extent_mapping(em_tree, chunk_offset, 1); | 1968 | em = lookup_extent_mapping(em_tree, chunk_offset, 1); |
| 1954 | read_unlock(&em_tree->lock); | 1969 | read_unlock(&em_tree->lock); |
| 1955 | 1970 | ||
| 1956 | BUG_ON(em->start > chunk_offset || | 1971 | BUG_ON(!em || em->start > chunk_offset || |
| 1957 | em->start + em->len < chunk_offset); | 1972 | em->start + em->len < chunk_offset); |
| 1958 | map = (struct map_lookup *)em->bdev; | 1973 | map = (struct map_lookup *)em->bdev; |
| 1959 | 1974 | ||
| @@ -4356,6 +4371,20 @@ int btrfs_read_sys_array(struct btrfs_root *root) | |||
| 4356 | return -ENOMEM; | 4371 | return -ENOMEM; |
| 4357 | btrfs_set_buffer_uptodate(sb); | 4372 | btrfs_set_buffer_uptodate(sb); |
| 4358 | btrfs_set_buffer_lockdep_class(root->root_key.objectid, sb, 0); | 4373 | btrfs_set_buffer_lockdep_class(root->root_key.objectid, sb, 0); |
| 4374 | /* | ||
| 4375 | * The sb extent buffer is artifical and just used to read the system array. | ||
| 4376 | * btrfs_set_buffer_uptodate() call does not properly mark all it's | ||
| 4377 | * pages up-to-date when the page is larger: extent does not cover the | ||
| 4378 | * whole page and consequently check_page_uptodate does not find all | ||
| 4379 | * the page's extents up-to-date (the hole beyond sb), | ||
| 4380 | * write_extent_buffer then triggers a WARN_ON. | ||
| 4381 | * | ||
| 4382 | * Regular short extents go through mark_extent_buffer_dirty/writeback cycle, | ||
| 4383 | * but sb spans only this function. Add an explicit SetPageUptodate call | ||
| 4384 | * to silence the warning eg. on PowerPC 64. | ||
| 4385 | */ | ||
| 4386 | if (PAGE_CACHE_SIZE > BTRFS_SUPER_INFO_SIZE) | ||
| 4387 | SetPageUptodate(sb->first_page); | ||
| 4359 | 4388 | ||
| 4360 | write_extent_buffer(sb, super_copy, 0, BTRFS_SUPER_INFO_SIZE); | 4389 | write_extent_buffer(sb, super_copy, 0, BTRFS_SUPER_INFO_SIZE); |
| 4361 | array_size = btrfs_super_sys_array_size(super_copy); | 4390 | array_size = btrfs_super_sys_array_size(super_copy); |
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index 9c288653e6d6..602f77c304c9 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c | |||
| @@ -773,10 +773,11 @@ standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid) | |||
| 773 | cifs_dump_mem("Bad SMB: ", buf, | 773 | cifs_dump_mem("Bad SMB: ", buf, |
| 774 | min_t(unsigned int, server->total_read, 48)); | 774 | min_t(unsigned int, server->total_read, 48)); |
| 775 | 775 | ||
| 776 | if (mid) | 776 | if (!mid) |
| 777 | handle_mid(mid, server, smb_buffer, length); | 777 | return length; |
| 778 | 778 | ||
| 779 | return length; | 779 | handle_mid(mid, server, smb_buffer, length); |
| 780 | return 0; | ||
| 780 | } | 781 | } |
| 781 | 782 | ||
| 782 | static int | 783 | static int |
| @@ -2125,7 +2126,7 @@ cifs_set_cifscreds(struct smb_vol *vol, struct cifs_ses *ses) | |||
| 2125 | down_read(&key->sem); | 2126 | down_read(&key->sem); |
| 2126 | upayload = key->payload.data; | 2127 | upayload = key->payload.data; |
| 2127 | if (IS_ERR_OR_NULL(upayload)) { | 2128 | if (IS_ERR_OR_NULL(upayload)) { |
| 2128 | rc = PTR_ERR(key); | 2129 | rc = upayload ? PTR_ERR(upayload) : -EINVAL; |
| 2129 | goto out_key_put; | 2130 | goto out_key_put; |
| 2130 | } | 2131 | } |
| 2131 | 2132 | ||
diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c index df8fecb5b993..63a196b97d50 100644 --- a/fs/cifs/dir.c +++ b/fs/cifs/dir.c | |||
| @@ -492,7 +492,7 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry, | |||
| 492 | { | 492 | { |
| 493 | int xid; | 493 | int xid; |
| 494 | int rc = 0; /* to get around spurious gcc warning, set to zero here */ | 494 | int rc = 0; /* to get around spurious gcc warning, set to zero here */ |
| 495 | __u32 oplock = 0; | 495 | __u32 oplock = enable_oplocks ? REQ_OPLOCK : 0; |
| 496 | __u16 fileHandle = 0; | 496 | __u16 fileHandle = 0; |
| 497 | bool posix_open = false; | 497 | bool posix_open = false; |
| 498 | struct cifs_sb_info *cifs_sb; | 498 | struct cifs_sb_info *cifs_sb; |
diff --git a/fs/compat.c b/fs/compat.c index fa9d721ecfee..07880bae28a9 100644 --- a/fs/compat.c +++ b/fs/compat.c | |||
| @@ -131,41 +131,35 @@ asmlinkage long compat_sys_utimes(const char __user *filename, struct compat_tim | |||
| 131 | 131 | ||
| 132 | static int cp_compat_stat(struct kstat *stat, struct compat_stat __user *ubuf) | 132 | static int cp_compat_stat(struct kstat *stat, struct compat_stat __user *ubuf) |
| 133 | { | 133 | { |
| 134 | compat_ino_t ino = stat->ino; | 134 | struct compat_stat tmp; |
| 135 | typeof(ubuf->st_uid) uid = 0; | ||
| 136 | typeof(ubuf->st_gid) gid = 0; | ||
| 137 | int err; | ||
| 138 | 135 | ||
| 139 | SET_UID(uid, stat->uid); | 136 | if (!old_valid_dev(stat->dev) || !old_valid_dev(stat->rdev)) |
| 140 | SET_GID(gid, stat->gid); | 137 | return -EOVERFLOW; |
| 141 | 138 | ||
| 142 | if ((u64) stat->size > MAX_NON_LFS || | 139 | memset(&tmp, 0, sizeof(tmp)); |
| 143 | !old_valid_dev(stat->dev) || | 140 | tmp.st_dev = old_encode_dev(stat->dev); |
| 144 | !old_valid_dev(stat->rdev)) | 141 | tmp.st_ino = stat->ino; |
| 142 | if (sizeof(tmp.st_ino) < sizeof(stat->ino) && tmp.st_ino != stat->ino) | ||
| 145 | return -EOVERFLOW; | 143 | return -EOVERFLOW; |
| 146 | if (sizeof(ino) < sizeof(stat->ino) && ino != stat->ino) | 144 | tmp.st_mode = stat->mode; |
| 145 | tmp.st_nlink = stat->nlink; | ||
| 146 | if (tmp.st_nlink != stat->nlink) | ||
| 147 | return -EOVERFLOW; | 147 | return -EOVERFLOW; |
| 148 | 148 | SET_UID(tmp.st_uid, stat->uid); | |
| 149 | if (clear_user(ubuf, sizeof(*ubuf))) | 149 | SET_GID(tmp.st_gid, stat->gid); |
| 150 | return -EFAULT; | 150 | tmp.st_rdev = old_encode_dev(stat->rdev); |
| 151 | 151 | if ((u64) stat->size > MAX_NON_LFS) | |
| 152 | err = __put_user(old_encode_dev(stat->dev), &ubuf->st_dev); | 152 | return -EOVERFLOW; |
| 153 | err |= __put_user(ino, &ubuf->st_ino); | 153 | tmp.st_size = stat->size; |
| 154 | err |= __put_user(stat->mode, &ubuf->st_mode); | 154 | tmp.st_atime = stat->atime.tv_sec; |
| 155 | err |= __put_user(stat->nlink, &ubuf->st_nlink); | 155 | tmp.st_atime_nsec = stat->atime.tv_nsec; |
| 156 | err |= __put_user(uid, &ubuf->st_uid); | 156 | tmp.st_mtime = stat->mtime.tv_sec; |
| 157 | err |= __put_user(gid, &ubuf->st_gid); | 157 | tmp.st_mtime_nsec = stat->mtime.tv_nsec; |
| 158 | err |= __put_user(old_encode_dev(stat->rdev), &ubuf->st_rdev); | 158 | tmp.st_ctime = stat->ctime.tv_sec; |
| 159 | err |= __put_user(stat->size, &ubuf->st_size); | 159 | tmp.st_ctime_nsec = stat->ctime.tv_nsec; |
| 160 | err |= __put_user(stat->atime.tv_sec, &ubuf->st_atime); | 160 | tmp.st_blocks = stat->blocks; |
| 161 | err |= __put_user(stat->atime.tv_nsec, &ubuf->st_atime_nsec); | 161 | tmp.st_blksize = stat->blksize; |
| 162 | err |= __put_user(stat->mtime.tv_sec, &ubuf->st_mtime); | 162 | return copy_to_user(ubuf, &tmp, sizeof(tmp)) ? -EFAULT : 0; |
| 163 | err |= __put_user(stat->mtime.tv_nsec, &ubuf->st_mtime_nsec); | ||
| 164 | err |= __put_user(stat->ctime.tv_sec, &ubuf->st_ctime); | ||
| 165 | err |= __put_user(stat->ctime.tv_nsec, &ubuf->st_ctime_nsec); | ||
| 166 | err |= __put_user(stat->blksize, &ubuf->st_blksize); | ||
| 167 | err |= __put_user(stat->blocks, &ubuf->st_blocks); | ||
| 168 | return err; | ||
| 169 | } | 163 | } |
| 170 | 164 | ||
| 171 | asmlinkage long compat_sys_newstat(const char __user * filename, | 165 | asmlinkage long compat_sys_newstat(const char __user * filename, |
diff --git a/fs/dcache.c b/fs/dcache.c index 16a53cc2cc02..fe19ac13f75f 100644 --- a/fs/dcache.c +++ b/fs/dcache.c | |||
| @@ -2968,7 +2968,7 @@ __setup("dhash_entries=", set_dhash_entries); | |||
| 2968 | 2968 | ||
| 2969 | static void __init dcache_init_early(void) | 2969 | static void __init dcache_init_early(void) |
| 2970 | { | 2970 | { |
| 2971 | int loop; | 2971 | unsigned int loop; |
| 2972 | 2972 | ||
| 2973 | /* If hashes are distributed across NUMA nodes, defer | 2973 | /* If hashes are distributed across NUMA nodes, defer |
| 2974 | * hash allocation until vmalloc space is available. | 2974 | * hash allocation until vmalloc space is available. |
| @@ -2986,13 +2986,13 @@ static void __init dcache_init_early(void) | |||
| 2986 | &d_hash_mask, | 2986 | &d_hash_mask, |
| 2987 | 0); | 2987 | 0); |
| 2988 | 2988 | ||
| 2989 | for (loop = 0; loop < (1 << d_hash_shift); loop++) | 2989 | for (loop = 0; loop < (1U << d_hash_shift); loop++) |
| 2990 | INIT_HLIST_BL_HEAD(dentry_hashtable + loop); | 2990 | INIT_HLIST_BL_HEAD(dentry_hashtable + loop); |
| 2991 | } | 2991 | } |
| 2992 | 2992 | ||
| 2993 | static void __init dcache_init(void) | 2993 | static void __init dcache_init(void) |
| 2994 | { | 2994 | { |
| 2995 | int loop; | 2995 | unsigned int loop; |
| 2996 | 2996 | ||
| 2997 | /* | 2997 | /* |
| 2998 | * A constructor could be added for stable state like the lists, | 2998 | * A constructor could be added for stable state like the lists, |
| @@ -3016,7 +3016,7 @@ static void __init dcache_init(void) | |||
| 3016 | &d_hash_mask, | 3016 | &d_hash_mask, |
| 3017 | 0); | 3017 | 0); |
| 3018 | 3018 | ||
| 3019 | for (loop = 0; loop < (1 << d_hash_shift); loop++) | 3019 | for (loop = 0; loop < (1U << d_hash_shift); loop++) |
| 3020 | INIT_HLIST_BL_HEAD(dentry_hashtable + loop); | 3020 | INIT_HLIST_BL_HEAD(dentry_hashtable + loop); |
| 3021 | } | 3021 | } |
| 3022 | 3022 | ||
diff --git a/fs/direct-io.c b/fs/direct-io.c index 4a588dbd11bf..f4aadd15b613 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c | |||
| @@ -173,7 +173,7 @@ void inode_dio_wait(struct inode *inode) | |||
| 173 | if (atomic_read(&inode->i_dio_count)) | 173 | if (atomic_read(&inode->i_dio_count)) |
| 174 | __inode_dio_wait(inode); | 174 | __inode_dio_wait(inode); |
| 175 | } | 175 | } |
| 176 | EXPORT_SYMBOL_GPL(inode_dio_wait); | 176 | EXPORT_SYMBOL(inode_dio_wait); |
| 177 | 177 | ||
| 178 | /* | 178 | /* |
| 179 | * inode_dio_done - signal finish of a direct I/O requests | 179 | * inode_dio_done - signal finish of a direct I/O requests |
| @@ -187,7 +187,7 @@ void inode_dio_done(struct inode *inode) | |||
| 187 | if (atomic_dec_and_test(&inode->i_dio_count)) | 187 | if (atomic_dec_and_test(&inode->i_dio_count)) |
| 188 | wake_up_bit(&inode->i_state, __I_DIO_WAKEUP); | 188 | wake_up_bit(&inode->i_state, __I_DIO_WAKEUP); |
| 189 | } | 189 | } |
| 190 | EXPORT_SYMBOL_GPL(inode_dio_done); | 190 | EXPORT_SYMBOL(inode_dio_done); |
| 191 | 191 | ||
| 192 | /* | 192 | /* |
| 193 | * How many pages are in the queue? | 193 | * How many pages are in the queue? |
diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c index 63ab24510649..ea9931281557 100644 --- a/fs/ecryptfs/crypto.c +++ b/fs/ecryptfs/crypto.c | |||
| @@ -1990,6 +1990,17 @@ out: | |||
| 1990 | return; | 1990 | return; |
| 1991 | } | 1991 | } |
| 1992 | 1992 | ||
| 1993 | static size_t ecryptfs_max_decoded_size(size_t encoded_size) | ||
| 1994 | { | ||
| 1995 | /* Not exact; conservatively long. Every block of 4 | ||
| 1996 | * encoded characters decodes into a block of 3 | ||
| 1997 | * decoded characters. This segment of code provides | ||
| 1998 | * the caller with the maximum amount of allocated | ||
| 1999 | * space that @dst will need to point to in a | ||
| 2000 | * subsequent call. */ | ||
| 2001 | return ((encoded_size + 1) * 3) / 4; | ||
| 2002 | } | ||
| 2003 | |||
| 1993 | /** | 2004 | /** |
| 1994 | * ecryptfs_decode_from_filename | 2005 | * ecryptfs_decode_from_filename |
| 1995 | * @dst: If NULL, this function only sets @dst_size and returns. If | 2006 | * @dst: If NULL, this function only sets @dst_size and returns. If |
| @@ -2008,13 +2019,7 @@ ecryptfs_decode_from_filename(unsigned char *dst, size_t *dst_size, | |||
| 2008 | size_t dst_byte_offset = 0; | 2019 | size_t dst_byte_offset = 0; |
| 2009 | 2020 | ||
| 2010 | if (dst == NULL) { | 2021 | if (dst == NULL) { |
| 2011 | /* Not exact; conservatively long. Every block of 4 | 2022 | (*dst_size) = ecryptfs_max_decoded_size(src_size); |
| 2012 | * encoded characters decodes into a block of 3 | ||
| 2013 | * decoded characters. This segment of code provides | ||
| 2014 | * the caller with the maximum amount of allocated | ||
| 2015 | * space that @dst will need to point to in a | ||
| 2016 | * subsequent call. */ | ||
| 2017 | (*dst_size) = (((src_size + 1) * 3) / 4); | ||
| 2018 | goto out; | 2023 | goto out; |
| 2019 | } | 2024 | } |
| 2020 | while (src_byte_offset < src_size) { | 2025 | while (src_byte_offset < src_size) { |
| @@ -2239,3 +2244,52 @@ out_free: | |||
| 2239 | out: | 2244 | out: |
| 2240 | return rc; | 2245 | return rc; |
| 2241 | } | 2246 | } |
| 2247 | |||
| 2248 | #define ENC_NAME_MAX_BLOCKLEN_8_OR_16 143 | ||
| 2249 | |||
| 2250 | int ecryptfs_set_f_namelen(long *namelen, long lower_namelen, | ||
| 2251 | struct ecryptfs_mount_crypt_stat *mount_crypt_stat) | ||
| 2252 | { | ||
| 2253 | struct blkcipher_desc desc; | ||
| 2254 | struct mutex *tfm_mutex; | ||
| 2255 | size_t cipher_blocksize; | ||
| 2256 | int rc; | ||
| 2257 | |||
| 2258 | if (!(mount_crypt_stat->flags & ECRYPTFS_GLOBAL_ENCRYPT_FILENAMES)) { | ||
| 2259 | (*namelen) = lower_namelen; | ||
| 2260 | return 0; | ||
| 2261 | } | ||
| 2262 | |||
| 2263 | rc = ecryptfs_get_tfm_and_mutex_for_cipher_name(&desc.tfm, &tfm_mutex, | ||
| 2264 | mount_crypt_stat->global_default_fn_cipher_name); | ||
| 2265 | if (unlikely(rc)) { | ||
| 2266 | (*namelen) = 0; | ||
| 2267 | return rc; | ||
| 2268 | } | ||
| 2269 | |||
| 2270 | mutex_lock(tfm_mutex); | ||
| 2271 | cipher_blocksize = crypto_blkcipher_blocksize(desc.tfm); | ||
| 2272 | mutex_unlock(tfm_mutex); | ||
| 2273 | |||
| 2274 | /* Return an exact amount for the common cases */ | ||
| 2275 | if (lower_namelen == NAME_MAX | ||
| 2276 | && (cipher_blocksize == 8 || cipher_blocksize == 16)) { | ||
| 2277 | (*namelen) = ENC_NAME_MAX_BLOCKLEN_8_OR_16; | ||
| 2278 | return 0; | ||
| 2279 | } | ||
| 2280 | |||
| 2281 | /* Return a safe estimate for the uncommon cases */ | ||
| 2282 | (*namelen) = lower_namelen; | ||
| 2283 | (*namelen) -= ECRYPTFS_FNEK_ENCRYPTED_FILENAME_PREFIX_SIZE; | ||
| 2284 | /* Since this is the max decoded size, subtract 1 "decoded block" len */ | ||
| 2285 | (*namelen) = ecryptfs_max_decoded_size(*namelen) - 3; | ||
| 2286 | (*namelen) -= ECRYPTFS_TAG_70_MAX_METADATA_SIZE; | ||
| 2287 | (*namelen) -= ECRYPTFS_FILENAME_MIN_RANDOM_PREPEND_BYTES; | ||
| 2288 | /* Worst case is that the filename is padded nearly a full block size */ | ||
| 2289 | (*namelen) -= cipher_blocksize - 1; | ||
| 2290 | |||
| 2291 | if ((*namelen) < 0) | ||
| 2292 | (*namelen) = 0; | ||
| 2293 | |||
| 2294 | return 0; | ||
| 2295 | } | ||
diff --git a/fs/ecryptfs/ecryptfs_kernel.h b/fs/ecryptfs/ecryptfs_kernel.h index a2362df58ae8..867b64c5d84f 100644 --- a/fs/ecryptfs/ecryptfs_kernel.h +++ b/fs/ecryptfs/ecryptfs_kernel.h | |||
| @@ -162,6 +162,10 @@ ecryptfs_get_key_payload_data(struct key *key) | |||
| 162 | #define ECRYPTFS_NON_NULL 0x42 /* A reasonable substitute for NULL */ | 162 | #define ECRYPTFS_NON_NULL 0x42 /* A reasonable substitute for NULL */ |
| 163 | #define MD5_DIGEST_SIZE 16 | 163 | #define MD5_DIGEST_SIZE 16 |
| 164 | #define ECRYPTFS_TAG_70_DIGEST_SIZE MD5_DIGEST_SIZE | 164 | #define ECRYPTFS_TAG_70_DIGEST_SIZE MD5_DIGEST_SIZE |
| 165 | #define ECRYPTFS_TAG_70_MIN_METADATA_SIZE (1 + ECRYPTFS_MIN_PKT_LEN_SIZE \ | ||
| 166 | + ECRYPTFS_SIG_SIZE + 1 + 1) | ||
| 167 | #define ECRYPTFS_TAG_70_MAX_METADATA_SIZE (1 + ECRYPTFS_MAX_PKT_LEN_SIZE \ | ||
| 168 | + ECRYPTFS_SIG_SIZE + 1 + 1) | ||
| 165 | #define ECRYPTFS_FEK_ENCRYPTED_FILENAME_PREFIX "ECRYPTFS_FEK_ENCRYPTED." | 169 | #define ECRYPTFS_FEK_ENCRYPTED_FILENAME_PREFIX "ECRYPTFS_FEK_ENCRYPTED." |
| 166 | #define ECRYPTFS_FEK_ENCRYPTED_FILENAME_PREFIX_SIZE 23 | 170 | #define ECRYPTFS_FEK_ENCRYPTED_FILENAME_PREFIX_SIZE 23 |
| 167 | #define ECRYPTFS_FNEK_ENCRYPTED_FILENAME_PREFIX "ECRYPTFS_FNEK_ENCRYPTED." | 171 | #define ECRYPTFS_FNEK_ENCRYPTED_FILENAME_PREFIX "ECRYPTFS_FNEK_ENCRYPTED." |
| @@ -701,6 +705,8 @@ ecryptfs_parse_tag_70_packet(char **filename, size_t *filename_size, | |||
| 701 | size_t *packet_size, | 705 | size_t *packet_size, |
| 702 | struct ecryptfs_mount_crypt_stat *mount_crypt_stat, | 706 | struct ecryptfs_mount_crypt_stat *mount_crypt_stat, |
| 703 | char *data, size_t max_packet_size); | 707 | char *data, size_t max_packet_size); |
| 708 | int ecryptfs_set_f_namelen(long *namelen, long lower_namelen, | ||
| 709 | struct ecryptfs_mount_crypt_stat *mount_crypt_stat); | ||
| 704 | int ecryptfs_derive_iv(char *iv, struct ecryptfs_crypt_stat *crypt_stat, | 710 | int ecryptfs_derive_iv(char *iv, struct ecryptfs_crypt_stat *crypt_stat, |
| 705 | loff_t offset); | 711 | loff_t offset); |
| 706 | 712 | ||
diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c index 19892d7d2ed1..ab35b113003b 100644 --- a/fs/ecryptfs/inode.c +++ b/fs/ecryptfs/inode.c | |||
| @@ -1085,6 +1085,8 @@ ecryptfs_setxattr(struct dentry *dentry, const char *name, const void *value, | |||
| 1085 | } | 1085 | } |
| 1086 | 1086 | ||
| 1087 | rc = vfs_setxattr(lower_dentry, name, value, size, flags); | 1087 | rc = vfs_setxattr(lower_dentry, name, value, size, flags); |
| 1088 | if (!rc) | ||
| 1089 | fsstack_copy_attr_all(dentry->d_inode, lower_dentry->d_inode); | ||
| 1088 | out: | 1090 | out: |
| 1089 | return rc; | 1091 | return rc; |
| 1090 | } | 1092 | } |
diff --git a/fs/ecryptfs/keystore.c b/fs/ecryptfs/keystore.c index 8e3b943e330f..2333203a120b 100644 --- a/fs/ecryptfs/keystore.c +++ b/fs/ecryptfs/keystore.c | |||
| @@ -679,10 +679,7 @@ ecryptfs_write_tag_70_packet(char *dest, size_t *remaining_bytes, | |||
| 679 | * Octets N3-N4: Block-aligned encrypted filename | 679 | * Octets N3-N4: Block-aligned encrypted filename |
| 680 | * - Consists of a minimum number of random characters, a \0 | 680 | * - Consists of a minimum number of random characters, a \0 |
| 681 | * separator, and then the filename */ | 681 | * separator, and then the filename */ |
| 682 | s->max_packet_size = (1 /* Tag 70 identifier */ | 682 | s->max_packet_size = (ECRYPTFS_TAG_70_MAX_METADATA_SIZE |
| 683 | + 3 /* Max Tag 70 packet size */ | ||
| 684 | + ECRYPTFS_SIG_SIZE /* FNEK sig */ | ||
| 685 | + 1 /* Cipher identifier */ | ||
| 686 | + s->block_aligned_filename_size); | 683 | + s->block_aligned_filename_size); |
| 687 | if (dest == NULL) { | 684 | if (dest == NULL) { |
| 688 | (*packet_size) = s->max_packet_size; | 685 | (*packet_size) = s->max_packet_size; |
| @@ -934,10 +931,10 @@ ecryptfs_parse_tag_70_packet(char **filename, size_t *filename_size, | |||
| 934 | goto out; | 931 | goto out; |
| 935 | } | 932 | } |
| 936 | s->desc.flags = CRYPTO_TFM_REQ_MAY_SLEEP; | 933 | s->desc.flags = CRYPTO_TFM_REQ_MAY_SLEEP; |
| 937 | if (max_packet_size < (1 + 1 + ECRYPTFS_SIG_SIZE + 1 + 1)) { | 934 | if (max_packet_size < ECRYPTFS_TAG_70_MIN_METADATA_SIZE) { |
| 938 | printk(KERN_WARNING "%s: max_packet_size is [%zd]; it must be " | 935 | printk(KERN_WARNING "%s: max_packet_size is [%zd]; it must be " |
| 939 | "at least [%d]\n", __func__, max_packet_size, | 936 | "at least [%d]\n", __func__, max_packet_size, |
| 940 | (1 + 1 + ECRYPTFS_SIG_SIZE + 1 + 1)); | 937 | ECRYPTFS_TAG_70_MIN_METADATA_SIZE); |
| 941 | rc = -EINVAL; | 938 | rc = -EINVAL; |
| 942 | goto out; | 939 | goto out; |
| 943 | } | 940 | } |
diff --git a/fs/ecryptfs/mmap.c b/fs/ecryptfs/mmap.c index 10ec695ccd68..a46b3a8fee1e 100644 --- a/fs/ecryptfs/mmap.c +++ b/fs/ecryptfs/mmap.c | |||
| @@ -150,7 +150,7 @@ ecryptfs_copy_up_encrypted_with_header(struct page *page, | |||
| 150 | /* This is a header extent */ | 150 | /* This is a header extent */ |
| 151 | char *page_virt; | 151 | char *page_virt; |
| 152 | 152 | ||
| 153 | page_virt = kmap_atomic(page, KM_USER0); | 153 | page_virt = kmap_atomic(page); |
| 154 | memset(page_virt, 0, PAGE_CACHE_SIZE); | 154 | memset(page_virt, 0, PAGE_CACHE_SIZE); |
| 155 | /* TODO: Support more than one header extent */ | 155 | /* TODO: Support more than one header extent */ |
| 156 | if (view_extent_num == 0) { | 156 | if (view_extent_num == 0) { |
| @@ -163,7 +163,7 @@ ecryptfs_copy_up_encrypted_with_header(struct page *page, | |||
| 163 | crypt_stat, | 163 | crypt_stat, |
| 164 | &written); | 164 | &written); |
| 165 | } | 165 | } |
| 166 | kunmap_atomic(page_virt, KM_USER0); | 166 | kunmap_atomic(page_virt); |
| 167 | flush_dcache_page(page); | 167 | flush_dcache_page(page); |
| 168 | if (rc) { | 168 | if (rc) { |
| 169 | printk(KERN_ERR "%s: Error reading xattr " | 169 | printk(KERN_ERR "%s: Error reading xattr " |
diff --git a/fs/ecryptfs/read_write.c b/fs/ecryptfs/read_write.c index 5c0106f75775..b2a34a192f4f 100644 --- a/fs/ecryptfs/read_write.c +++ b/fs/ecryptfs/read_write.c | |||
| @@ -156,7 +156,7 @@ int ecryptfs_write(struct inode *ecryptfs_inode, char *data, loff_t offset, | |||
| 156 | ecryptfs_page_idx, rc); | 156 | ecryptfs_page_idx, rc); |
| 157 | goto out; | 157 | goto out; |
| 158 | } | 158 | } |
| 159 | ecryptfs_page_virt = kmap_atomic(ecryptfs_page, KM_USER0); | 159 | ecryptfs_page_virt = kmap_atomic(ecryptfs_page); |
| 160 | 160 | ||
| 161 | /* | 161 | /* |
| 162 | * pos: where we're now writing, offset: where the request was | 162 | * pos: where we're now writing, offset: where the request was |
| @@ -179,7 +179,7 @@ int ecryptfs_write(struct inode *ecryptfs_inode, char *data, loff_t offset, | |||
| 179 | (data + data_offset), num_bytes); | 179 | (data + data_offset), num_bytes); |
| 180 | data_offset += num_bytes; | 180 | data_offset += num_bytes; |
| 181 | } | 181 | } |
| 182 | kunmap_atomic(ecryptfs_page_virt, KM_USER0); | 182 | kunmap_atomic(ecryptfs_page_virt); |
| 183 | flush_dcache_page(ecryptfs_page); | 183 | flush_dcache_page(ecryptfs_page); |
| 184 | SetPageUptodate(ecryptfs_page); | 184 | SetPageUptodate(ecryptfs_page); |
| 185 | unlock_page(ecryptfs_page); | 185 | unlock_page(ecryptfs_page); |
diff --git a/fs/ecryptfs/super.c b/fs/ecryptfs/super.c index 9df7fd6e0c39..cf152823bbf4 100644 --- a/fs/ecryptfs/super.c +++ b/fs/ecryptfs/super.c | |||
| @@ -30,6 +30,8 @@ | |||
| 30 | #include <linux/seq_file.h> | 30 | #include <linux/seq_file.h> |
| 31 | #include <linux/file.h> | 31 | #include <linux/file.h> |
| 32 | #include <linux/crypto.h> | 32 | #include <linux/crypto.h> |
| 33 | #include <linux/statfs.h> | ||
| 34 | #include <linux/magic.h> | ||
| 33 | #include "ecryptfs_kernel.h" | 35 | #include "ecryptfs_kernel.h" |
| 34 | 36 | ||
| 35 | struct kmem_cache *ecryptfs_inode_info_cache; | 37 | struct kmem_cache *ecryptfs_inode_info_cache; |
| @@ -102,10 +104,20 @@ static void ecryptfs_destroy_inode(struct inode *inode) | |||
| 102 | static int ecryptfs_statfs(struct dentry *dentry, struct kstatfs *buf) | 104 | static int ecryptfs_statfs(struct dentry *dentry, struct kstatfs *buf) |
| 103 | { | 105 | { |
| 104 | struct dentry *lower_dentry = ecryptfs_dentry_to_lower(dentry); | 106 | struct dentry *lower_dentry = ecryptfs_dentry_to_lower(dentry); |
| 107 | int rc; | ||
| 105 | 108 | ||
| 106 | if (!lower_dentry->d_sb->s_op->statfs) | 109 | if (!lower_dentry->d_sb->s_op->statfs) |
| 107 | return -ENOSYS; | 110 | return -ENOSYS; |
| 108 | return lower_dentry->d_sb->s_op->statfs(lower_dentry, buf); | 111 | |
| 112 | rc = lower_dentry->d_sb->s_op->statfs(lower_dentry, buf); | ||
| 113 | if (rc) | ||
| 114 | return rc; | ||
| 115 | |||
| 116 | buf->f_type = ECRYPTFS_SUPER_MAGIC; | ||
| 117 | rc = ecryptfs_set_f_namelen(&buf->f_namelen, buf->f_namelen, | ||
| 118 | &ecryptfs_superblock_to_private(dentry->d_sb)->mount_crypt_stat); | ||
| 119 | |||
| 120 | return rc; | ||
| 109 | } | 121 | } |
| 110 | 122 | ||
| 111 | /** | 123 | /** |
diff --git a/fs/eventpoll.c b/fs/eventpoll.c index aabdfc38cf24..ea54cdef04dd 100644 --- a/fs/eventpoll.c +++ b/fs/eventpoll.c | |||
| @@ -320,6 +320,11 @@ static inline int ep_is_linked(struct list_head *p) | |||
| 320 | return !list_empty(p); | 320 | return !list_empty(p); |
| 321 | } | 321 | } |
| 322 | 322 | ||
| 323 | static inline struct eppoll_entry *ep_pwq_from_wait(wait_queue_t *p) | ||
| 324 | { | ||
| 325 | return container_of(p, struct eppoll_entry, wait); | ||
| 326 | } | ||
| 327 | |||
| 323 | /* Get the "struct epitem" from a wait queue pointer */ | 328 | /* Get the "struct epitem" from a wait queue pointer */ |
| 324 | static inline struct epitem *ep_item_from_wait(wait_queue_t *p) | 329 | static inline struct epitem *ep_item_from_wait(wait_queue_t *p) |
| 325 | { | 330 | { |
| @@ -467,6 +472,18 @@ static void ep_poll_safewake(wait_queue_head_t *wq) | |||
| 467 | put_cpu(); | 472 | put_cpu(); |
| 468 | } | 473 | } |
| 469 | 474 | ||
| 475 | static void ep_remove_wait_queue(struct eppoll_entry *pwq) | ||
| 476 | { | ||
| 477 | wait_queue_head_t *whead; | ||
| 478 | |||
| 479 | rcu_read_lock(); | ||
| 480 | /* If it is cleared by POLLFREE, it should be rcu-safe */ | ||
| 481 | whead = rcu_dereference(pwq->whead); | ||
| 482 | if (whead) | ||
| 483 | remove_wait_queue(whead, &pwq->wait); | ||
| 484 | rcu_read_unlock(); | ||
| 485 | } | ||
| 486 | |||
| 470 | /* | 487 | /* |
| 471 | * This function unregisters poll callbacks from the associated file | 488 | * This function unregisters poll callbacks from the associated file |
| 472 | * descriptor. Must be called with "mtx" held (or "epmutex" if called from | 489 | * descriptor. Must be called with "mtx" held (or "epmutex" if called from |
| @@ -481,7 +498,7 @@ static void ep_unregister_pollwait(struct eventpoll *ep, struct epitem *epi) | |||
| 481 | pwq = list_first_entry(lsthead, struct eppoll_entry, llink); | 498 | pwq = list_first_entry(lsthead, struct eppoll_entry, llink); |
| 482 | 499 | ||
| 483 | list_del(&pwq->llink); | 500 | list_del(&pwq->llink); |
| 484 | remove_wait_queue(pwq->whead, &pwq->wait); | 501 | ep_remove_wait_queue(pwq); |
| 485 | kmem_cache_free(pwq_cache, pwq); | 502 | kmem_cache_free(pwq_cache, pwq); |
| 486 | } | 503 | } |
| 487 | } | 504 | } |
| @@ -842,6 +859,17 @@ static int ep_poll_callback(wait_queue_t *wait, unsigned mode, int sync, void *k | |||
| 842 | struct epitem *epi = ep_item_from_wait(wait); | 859 | struct epitem *epi = ep_item_from_wait(wait); |
| 843 | struct eventpoll *ep = epi->ep; | 860 | struct eventpoll *ep = epi->ep; |
| 844 | 861 | ||
| 862 | if ((unsigned long)key & POLLFREE) { | ||
| 863 | ep_pwq_from_wait(wait)->whead = NULL; | ||
| 864 | /* | ||
| 865 | * whead = NULL above can race with ep_remove_wait_queue() | ||
| 866 | * which can do another remove_wait_queue() after us, so we | ||
| 867 | * can't use __remove_wait_queue(). whead->lock is held by | ||
| 868 | * the caller. | ||
| 869 | */ | ||
| 870 | list_del_init(&wait->task_list); | ||
| 871 | } | ||
| 872 | |||
| 845 | spin_lock_irqsave(&ep->lock, flags); | 873 | spin_lock_irqsave(&ep->lock, flags); |
| 846 | 874 | ||
| 847 | /* | 875 | /* |
diff --git a/fs/inode.c b/fs/inode.c index fb10d86ffad7..d3ebdbe723d0 100644 --- a/fs/inode.c +++ b/fs/inode.c | |||
| @@ -1651,7 +1651,7 @@ __setup("ihash_entries=", set_ihash_entries); | |||
| 1651 | */ | 1651 | */ |
| 1652 | void __init inode_init_early(void) | 1652 | void __init inode_init_early(void) |
| 1653 | { | 1653 | { |
| 1654 | int loop; | 1654 | unsigned int loop; |
| 1655 | 1655 | ||
| 1656 | /* If hashes are distributed across NUMA nodes, defer | 1656 | /* If hashes are distributed across NUMA nodes, defer |
| 1657 | * hash allocation until vmalloc space is available. | 1657 | * hash allocation until vmalloc space is available. |
| @@ -1669,13 +1669,13 @@ void __init inode_init_early(void) | |||
| 1669 | &i_hash_mask, | 1669 | &i_hash_mask, |
| 1670 | 0); | 1670 | 0); |
| 1671 | 1671 | ||
| 1672 | for (loop = 0; loop < (1 << i_hash_shift); loop++) | 1672 | for (loop = 0; loop < (1U << i_hash_shift); loop++) |
| 1673 | INIT_HLIST_HEAD(&inode_hashtable[loop]); | 1673 | INIT_HLIST_HEAD(&inode_hashtable[loop]); |
| 1674 | } | 1674 | } |
| 1675 | 1675 | ||
| 1676 | void __init inode_init(void) | 1676 | void __init inode_init(void) |
| 1677 | { | 1677 | { |
| 1678 | int loop; | 1678 | unsigned int loop; |
| 1679 | 1679 | ||
| 1680 | /* inode slab cache */ | 1680 | /* inode slab cache */ |
| 1681 | inode_cachep = kmem_cache_create("inode_cache", | 1681 | inode_cachep = kmem_cache_create("inode_cache", |
| @@ -1699,7 +1699,7 @@ void __init inode_init(void) | |||
| 1699 | &i_hash_mask, | 1699 | &i_hash_mask, |
| 1700 | 0); | 1700 | 0); |
| 1701 | 1701 | ||
| 1702 | for (loop = 0; loop < (1 << i_hash_shift); loop++) | 1702 | for (loop = 0; loop < (1U << i_hash_shift); loop++) |
| 1703 | INIT_HLIST_HEAD(&inode_hashtable[loop]); | 1703 | INIT_HLIST_HEAD(&inode_hashtable[loop]); |
| 1704 | } | 1704 | } |
| 1705 | 1705 | ||
diff --git a/fs/namei.c b/fs/namei.c index 208c6aa4a989..a780ea515c47 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
| @@ -1095,8 +1095,10 @@ static struct dentry *d_inode_lookup(struct dentry *parent, struct dentry *dentr | |||
| 1095 | struct dentry *old; | 1095 | struct dentry *old; |
| 1096 | 1096 | ||
| 1097 | /* Don't create child dentry for a dead directory. */ | 1097 | /* Don't create child dentry for a dead directory. */ |
| 1098 | if (unlikely(IS_DEADDIR(inode))) | 1098 | if (unlikely(IS_DEADDIR(inode))) { |
| 1099 | dput(dentry); | ||
| 1099 | return ERR_PTR(-ENOENT); | 1100 | return ERR_PTR(-ENOENT); |
| 1101 | } | ||
| 1100 | 1102 | ||
| 1101 | old = inode->i_op->lookup(inode, dentry, nd); | 1103 | old = inode->i_op->lookup(inode, dentry, nd); |
| 1102 | if (unlikely(old)) { | 1104 | if (unlikely(old)) { |
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index f0c849c98fe4..ec9f6ef6c5dd 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
| @@ -3575,8 +3575,8 @@ static ssize_t __nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t bu | |||
| 3575 | } | 3575 | } |
| 3576 | if (npages > 1) { | 3576 | if (npages > 1) { |
| 3577 | /* for decoding across pages */ | 3577 | /* for decoding across pages */ |
| 3578 | args.acl_scratch = alloc_page(GFP_KERNEL); | 3578 | res.acl_scratch = alloc_page(GFP_KERNEL); |
| 3579 | if (!args.acl_scratch) | 3579 | if (!res.acl_scratch) |
| 3580 | goto out_free; | 3580 | goto out_free; |
| 3581 | } | 3581 | } |
| 3582 | args.acl_len = npages * PAGE_SIZE; | 3582 | args.acl_len = npages * PAGE_SIZE; |
| @@ -3612,8 +3612,8 @@ out_free: | |||
| 3612 | for (i = 0; i < npages; i++) | 3612 | for (i = 0; i < npages; i++) |
| 3613 | if (pages[i]) | 3613 | if (pages[i]) |
| 3614 | __free_page(pages[i]); | 3614 | __free_page(pages[i]); |
| 3615 | if (args.acl_scratch) | 3615 | if (res.acl_scratch) |
| 3616 | __free_page(args.acl_scratch); | 3616 | __free_page(res.acl_scratch); |
| 3617 | return ret; | 3617 | return ret; |
| 3618 | } | 3618 | } |
| 3619 | 3619 | ||
| @@ -4883,8 +4883,10 @@ int nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred) | |||
| 4883 | clp->cl_rpcclient->cl_auth->au_flavor); | 4883 | clp->cl_rpcclient->cl_auth->au_flavor); |
| 4884 | 4884 | ||
| 4885 | res.server_scope = kzalloc(sizeof(struct server_scope), GFP_KERNEL); | 4885 | res.server_scope = kzalloc(sizeof(struct server_scope), GFP_KERNEL); |
| 4886 | if (unlikely(!res.server_scope)) | 4886 | if (unlikely(!res.server_scope)) { |
| 4887 | return -ENOMEM; | 4887 | status = -ENOMEM; |
| 4888 | goto out; | ||
| 4889 | } | ||
| 4888 | 4890 | ||
| 4889 | status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT); | 4891 | status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT); |
| 4890 | if (!status) | 4892 | if (!status) |
| @@ -4901,12 +4903,13 @@ int nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred) | |||
| 4901 | clp->server_scope = NULL; | 4903 | clp->server_scope = NULL; |
| 4902 | } | 4904 | } |
| 4903 | 4905 | ||
| 4904 | if (!clp->server_scope) | 4906 | if (!clp->server_scope) { |
| 4905 | clp->server_scope = res.server_scope; | 4907 | clp->server_scope = res.server_scope; |
| 4906 | else | 4908 | goto out; |
| 4907 | kfree(res.server_scope); | 4909 | } |
| 4908 | } | 4910 | } |
| 4909 | 4911 | kfree(res.server_scope); | |
| 4912 | out: | ||
| 4910 | dprintk("<-- %s status= %d\n", __func__, status); | 4913 | dprintk("<-- %s status= %d\n", __func__, status); |
| 4911 | return status; | 4914 | return status; |
| 4912 | } | 4915 | } |
| @@ -5008,37 +5011,53 @@ int nfs4_proc_get_lease_time(struct nfs_client *clp, struct nfs_fsinfo *fsinfo) | |||
| 5008 | return status; | 5011 | return status; |
| 5009 | } | 5012 | } |
| 5010 | 5013 | ||
| 5014 | static struct nfs4_slot *nfs4_alloc_slots(u32 max_slots, gfp_t gfp_flags) | ||
| 5015 | { | ||
| 5016 | return kcalloc(max_slots, sizeof(struct nfs4_slot), gfp_flags); | ||
| 5017 | } | ||
| 5018 | |||
| 5019 | static void nfs4_add_and_init_slots(struct nfs4_slot_table *tbl, | ||
| 5020 | struct nfs4_slot *new, | ||
| 5021 | u32 max_slots, | ||
| 5022 | u32 ivalue) | ||
| 5023 | { | ||
| 5024 | struct nfs4_slot *old = NULL; | ||
| 5025 | u32 i; | ||
| 5026 | |||
| 5027 | spin_lock(&tbl->slot_tbl_lock); | ||
| 5028 | if (new) { | ||
| 5029 | old = tbl->slots; | ||
| 5030 | tbl->slots = new; | ||
| 5031 | tbl->max_slots = max_slots; | ||
| 5032 | } | ||
| 5033 | tbl->highest_used_slotid = -1; /* no slot is currently used */ | ||
| 5034 | for (i = 0; i < tbl->max_slots; i++) | ||
| 5035 | tbl->slots[i].seq_nr = ivalue; | ||
| 5036 | spin_unlock(&tbl->slot_tbl_lock); | ||
| 5037 | kfree(old); | ||
| 5038 | } | ||
| 5039 | |||
| 5011 | /* | 5040 | /* |
| 5012 | * Reset a slot table | 5041 | * (re)Initialise a slot table |
| 5013 | */ | 5042 | */ |
| 5014 | static int nfs4_reset_slot_table(struct nfs4_slot_table *tbl, u32 max_reqs, | 5043 | static int nfs4_realloc_slot_table(struct nfs4_slot_table *tbl, u32 max_reqs, |
| 5015 | int ivalue) | 5044 | u32 ivalue) |
| 5016 | { | 5045 | { |
| 5017 | struct nfs4_slot *new = NULL; | 5046 | struct nfs4_slot *new = NULL; |
| 5018 | int i; | 5047 | int ret = -ENOMEM; |
| 5019 | int ret = 0; | ||
| 5020 | 5048 | ||
| 5021 | dprintk("--> %s: max_reqs=%u, tbl->max_slots %d\n", __func__, | 5049 | dprintk("--> %s: max_reqs=%u, tbl->max_slots %d\n", __func__, |
| 5022 | max_reqs, tbl->max_slots); | 5050 | max_reqs, tbl->max_slots); |
| 5023 | 5051 | ||
| 5024 | /* Does the newly negotiated max_reqs match the existing slot table? */ | 5052 | /* Does the newly negotiated max_reqs match the existing slot table? */ |
| 5025 | if (max_reqs != tbl->max_slots) { | 5053 | if (max_reqs != tbl->max_slots) { |
| 5026 | ret = -ENOMEM; | 5054 | new = nfs4_alloc_slots(max_reqs, GFP_NOFS); |
| 5027 | new = kmalloc(max_reqs * sizeof(struct nfs4_slot), | ||
| 5028 | GFP_NOFS); | ||
| 5029 | if (!new) | 5055 | if (!new) |
| 5030 | goto out; | 5056 | goto out; |
| 5031 | ret = 0; | ||
| 5032 | kfree(tbl->slots); | ||
| 5033 | } | 5057 | } |
| 5034 | spin_lock(&tbl->slot_tbl_lock); | 5058 | ret = 0; |
| 5035 | if (new) { | 5059 | |
| 5036 | tbl->slots = new; | 5060 | nfs4_add_and_init_slots(tbl, new, max_reqs, ivalue); |
| 5037 | tbl->max_slots = max_reqs; | ||
| 5038 | } | ||
| 5039 | for (i = 0; i < tbl->max_slots; ++i) | ||
| 5040 | tbl->slots[i].seq_nr = ivalue; | ||
| 5041 | spin_unlock(&tbl->slot_tbl_lock); | ||
| 5042 | dprintk("%s: tbl=%p slots=%p max_slots=%d\n", __func__, | 5061 | dprintk("%s: tbl=%p slots=%p max_slots=%d\n", __func__, |
| 5043 | tbl, tbl->slots, tbl->max_slots); | 5062 | tbl, tbl->slots, tbl->max_slots); |
| 5044 | out: | 5063 | out: |
| @@ -5061,36 +5080,6 @@ static void nfs4_destroy_slot_tables(struct nfs4_session *session) | |||
| 5061 | } | 5080 | } |
| 5062 | 5081 | ||
| 5063 | /* | 5082 | /* |
| 5064 | * Initialize slot table | ||
| 5065 | */ | ||
| 5066 | static int nfs4_init_slot_table(struct nfs4_slot_table *tbl, | ||
| 5067 | int max_slots, int ivalue) | ||
| 5068 | { | ||
| 5069 | struct nfs4_slot *slot; | ||
| 5070 | int ret = -ENOMEM; | ||
| 5071 | |||
| 5072 | BUG_ON(max_slots > NFS4_MAX_SLOT_TABLE); | ||
| 5073 | |||
| 5074 | dprintk("--> %s: max_reqs=%u\n", __func__, max_slots); | ||
| 5075 | |||
| 5076 | slot = kcalloc(max_slots, sizeof(struct nfs4_slot), GFP_NOFS); | ||
| 5077 | if (!slot) | ||
| 5078 | goto out; | ||
| 5079 | ret = 0; | ||
| 5080 | |||
| 5081 | spin_lock(&tbl->slot_tbl_lock); | ||
| 5082 | tbl->max_slots = max_slots; | ||
| 5083 | tbl->slots = slot; | ||
| 5084 | tbl->highest_used_slotid = -1; /* no slot is currently used */ | ||
| 5085 | spin_unlock(&tbl->slot_tbl_lock); | ||
| 5086 | dprintk("%s: tbl=%p slots=%p max_slots=%d\n", __func__, | ||
| 5087 | tbl, tbl->slots, tbl->max_slots); | ||
| 5088 | out: | ||
| 5089 | dprintk("<-- %s: return %d\n", __func__, ret); | ||
| 5090 | return ret; | ||
| 5091 | } | ||
| 5092 | |||
| 5093 | /* | ||
| 5094 | * Initialize or reset the forechannel and backchannel tables | 5083 | * Initialize or reset the forechannel and backchannel tables |
| 5095 | */ | 5084 | */ |
| 5096 | static int nfs4_setup_session_slot_tables(struct nfs4_session *ses) | 5085 | static int nfs4_setup_session_slot_tables(struct nfs4_session *ses) |
| @@ -5101,25 +5090,16 @@ static int nfs4_setup_session_slot_tables(struct nfs4_session *ses) | |||
| 5101 | dprintk("--> %s\n", __func__); | 5090 | dprintk("--> %s\n", __func__); |
| 5102 | /* Fore channel */ | 5091 | /* Fore channel */ |
| 5103 | tbl = &ses->fc_slot_table; | 5092 | tbl = &ses->fc_slot_table; |
| 5104 | if (tbl->slots == NULL) { | 5093 | status = nfs4_realloc_slot_table(tbl, ses->fc_attrs.max_reqs, 1); |
| 5105 | status = nfs4_init_slot_table(tbl, ses->fc_attrs.max_reqs, 1); | 5094 | if (status) /* -ENOMEM */ |
| 5106 | if (status) /* -ENOMEM */ | 5095 | return status; |
| 5107 | return status; | ||
| 5108 | } else { | ||
| 5109 | status = nfs4_reset_slot_table(tbl, ses->fc_attrs.max_reqs, 1); | ||
| 5110 | if (status) | ||
| 5111 | return status; | ||
| 5112 | } | ||
| 5113 | /* Back channel */ | 5096 | /* Back channel */ |
| 5114 | tbl = &ses->bc_slot_table; | 5097 | tbl = &ses->bc_slot_table; |
| 5115 | if (tbl->slots == NULL) { | 5098 | status = nfs4_realloc_slot_table(tbl, ses->bc_attrs.max_reqs, 0); |
| 5116 | status = nfs4_init_slot_table(tbl, ses->bc_attrs.max_reqs, 0); | 5099 | if (status && tbl->slots == NULL) |
| 5117 | if (status) | 5100 | /* Fore and back channel share a connection so get |
| 5118 | /* Fore and back channel share a connection so get | 5101 | * both slot tables or neither */ |
| 5119 | * both slot tables or neither */ | 5102 | nfs4_destroy_slot_tables(ses); |
| 5120 | nfs4_destroy_slot_tables(ses); | ||
| 5121 | } else | ||
| 5122 | status = nfs4_reset_slot_table(tbl, ses->bc_attrs.max_reqs, 0); | ||
| 5123 | return status; | 5103 | return status; |
| 5124 | } | 5104 | } |
| 5125 | 5105 | ||
diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c index a53f33b4ac3a..45392032e7bd 100644 --- a/fs/nfs/nfs4state.c +++ b/fs/nfs/nfs4state.c | |||
| @@ -1132,6 +1132,8 @@ void nfs4_schedule_stateid_recovery(const struct nfs_server *server, struct nfs4 | |||
| 1132 | { | 1132 | { |
| 1133 | struct nfs_client *clp = server->nfs_client; | 1133 | struct nfs_client *clp = server->nfs_client; |
| 1134 | 1134 | ||
| 1135 | if (test_and_clear_bit(NFS_DELEGATED_STATE, &state->flags)) | ||
| 1136 | nfs_async_inode_return_delegation(state->inode, &state->stateid); | ||
| 1135 | nfs4_state_mark_reclaim_nograce(clp, state); | 1137 | nfs4_state_mark_reclaim_nograce(clp, state); |
| 1136 | nfs4_schedule_state_manager(clp); | 1138 | nfs4_schedule_state_manager(clp); |
| 1137 | } | 1139 | } |
diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c index 95e92e438407..33bd8d0f745d 100644 --- a/fs/nfs/nfs4xdr.c +++ b/fs/nfs/nfs4xdr.c | |||
| @@ -2522,7 +2522,6 @@ static void nfs4_xdr_enc_getacl(struct rpc_rqst *req, struct xdr_stream *xdr, | |||
| 2522 | 2522 | ||
| 2523 | xdr_inline_pages(&req->rq_rcv_buf, replen << 2, | 2523 | xdr_inline_pages(&req->rq_rcv_buf, replen << 2, |
| 2524 | args->acl_pages, args->acl_pgbase, args->acl_len); | 2524 | args->acl_pages, args->acl_pgbase, args->acl_len); |
| 2525 | xdr_set_scratch_buffer(xdr, page_address(args->acl_scratch), PAGE_SIZE); | ||
| 2526 | 2525 | ||
| 2527 | encode_nops(&hdr); | 2526 | encode_nops(&hdr); |
| 2528 | } | 2527 | } |
| @@ -6032,6 +6031,10 @@ nfs4_xdr_dec_getacl(struct rpc_rqst *rqstp, struct xdr_stream *xdr, | |||
| 6032 | struct compound_hdr hdr; | 6031 | struct compound_hdr hdr; |
| 6033 | int status; | 6032 | int status; |
| 6034 | 6033 | ||
| 6034 | if (res->acl_scratch != NULL) { | ||
| 6035 | void *p = page_address(res->acl_scratch); | ||
| 6036 | xdr_set_scratch_buffer(xdr, p, PAGE_SIZE); | ||
| 6037 | } | ||
| 6035 | status = decode_compound_hdr(xdr, &hdr); | 6038 | status = decode_compound_hdr(xdr, &hdr); |
| 6036 | if (status) | 6039 | if (status) |
| 6037 | goto out; | 6040 | goto out; |
diff --git a/fs/ocfs2/namei.c b/fs/ocfs2/namei.c index be244692550d..a9856e3eaaf0 100644 --- a/fs/ocfs2/namei.c +++ b/fs/ocfs2/namei.c | |||
| @@ -1053,7 +1053,7 @@ static int ocfs2_rename(struct inode *old_dir, | |||
| 1053 | handle_t *handle = NULL; | 1053 | handle_t *handle = NULL; |
| 1054 | struct buffer_head *old_dir_bh = NULL; | 1054 | struct buffer_head *old_dir_bh = NULL; |
| 1055 | struct buffer_head *new_dir_bh = NULL; | 1055 | struct buffer_head *new_dir_bh = NULL; |
| 1056 | nlink_t old_dir_nlink = old_dir->i_nlink; | 1056 | u32 old_dir_nlink = old_dir->i_nlink; |
| 1057 | struct ocfs2_dinode *old_di; | 1057 | struct ocfs2_dinode *old_di; |
| 1058 | struct ocfs2_dir_lookup_result old_inode_dot_dot_res = { NULL, }; | 1058 | struct ocfs2_dir_lookup_result old_inode_dot_dot_res = { NULL, }; |
| 1059 | struct ocfs2_dir_lookup_result target_lookup_res = { NULL, }; | 1059 | struct ocfs2_dir_lookup_result target_lookup_res = { NULL, }; |
diff --git a/fs/quota/quota.c b/fs/quota/quota.c index 7898cd688a00..fc2c4388d126 100644 --- a/fs/quota/quota.c +++ b/fs/quota/quota.c | |||
| @@ -292,11 +292,26 @@ static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id, | |||
| 292 | } | 292 | } |
| 293 | } | 293 | } |
| 294 | 294 | ||
| 295 | /* Return 1 if 'cmd' will block on frozen filesystem */ | ||
| 296 | static int quotactl_cmd_write(int cmd) | ||
| 297 | { | ||
| 298 | switch (cmd) { | ||
| 299 | case Q_GETFMT: | ||
| 300 | case Q_GETINFO: | ||
| 301 | case Q_SYNC: | ||
| 302 | case Q_XGETQSTAT: | ||
| 303 | case Q_XGETQUOTA: | ||
| 304 | case Q_XQUOTASYNC: | ||
| 305 | return 0; | ||
| 306 | } | ||
| 307 | return 1; | ||
| 308 | } | ||
| 309 | |||
| 295 | /* | 310 | /* |
| 296 | * look up a superblock on which quota ops will be performed | 311 | * look up a superblock on which quota ops will be performed |
| 297 | * - use the name of a block device to find the superblock thereon | 312 | * - use the name of a block device to find the superblock thereon |
| 298 | */ | 313 | */ |
| 299 | static struct super_block *quotactl_block(const char __user *special) | 314 | static struct super_block *quotactl_block(const char __user *special, int cmd) |
| 300 | { | 315 | { |
| 301 | #ifdef CONFIG_BLOCK | 316 | #ifdef CONFIG_BLOCK |
| 302 | struct block_device *bdev; | 317 | struct block_device *bdev; |
| @@ -309,7 +324,10 @@ static struct super_block *quotactl_block(const char __user *special) | |||
| 309 | putname(tmp); | 324 | putname(tmp); |
| 310 | if (IS_ERR(bdev)) | 325 | if (IS_ERR(bdev)) |
| 311 | return ERR_CAST(bdev); | 326 | return ERR_CAST(bdev); |
| 312 | sb = get_super(bdev); | 327 | if (quotactl_cmd_write(cmd)) |
| 328 | sb = get_super_thawed(bdev); | ||
| 329 | else | ||
| 330 | sb = get_super(bdev); | ||
| 313 | bdput(bdev); | 331 | bdput(bdev); |
| 314 | if (!sb) | 332 | if (!sb) |
| 315 | return ERR_PTR(-ENODEV); | 333 | return ERR_PTR(-ENODEV); |
| @@ -361,7 +379,7 @@ SYSCALL_DEFINE4(quotactl, unsigned int, cmd, const char __user *, special, | |||
| 361 | pathp = &path; | 379 | pathp = &path; |
| 362 | } | 380 | } |
| 363 | 381 | ||
| 364 | sb = quotactl_block(special); | 382 | sb = quotactl_block(special, cmds); |
| 365 | if (IS_ERR(sb)) { | 383 | if (IS_ERR(sb)) { |
| 366 | ret = PTR_ERR(sb); | 384 | ret = PTR_ERR(sb); |
| 367 | goto out; | 385 | goto out; |
diff --git a/fs/select.c b/fs/select.c index d33418fdc858..e782258d0de3 100644 --- a/fs/select.c +++ b/fs/select.c | |||
| @@ -912,7 +912,7 @@ static long do_restart_poll(struct restart_block *restart_block) | |||
| 912 | } | 912 | } |
| 913 | 913 | ||
| 914 | SYSCALL_DEFINE3(poll, struct pollfd __user *, ufds, unsigned int, nfds, | 914 | SYSCALL_DEFINE3(poll, struct pollfd __user *, ufds, unsigned int, nfds, |
| 915 | long, timeout_msecs) | 915 | int, timeout_msecs) |
| 916 | { | 916 | { |
| 917 | struct timespec end_time, *to = NULL; | 917 | struct timespec end_time, *to = NULL; |
| 918 | int ret; | 918 | int ret; |
diff --git a/fs/signalfd.c b/fs/signalfd.c index 492465b451dd..7ae2a574cb25 100644 --- a/fs/signalfd.c +++ b/fs/signalfd.c | |||
| @@ -30,6 +30,21 @@ | |||
| 30 | #include <linux/signalfd.h> | 30 | #include <linux/signalfd.h> |
| 31 | #include <linux/syscalls.h> | 31 | #include <linux/syscalls.h> |
| 32 | 32 | ||
| 33 | void signalfd_cleanup(struct sighand_struct *sighand) | ||
| 34 | { | ||
| 35 | wait_queue_head_t *wqh = &sighand->signalfd_wqh; | ||
| 36 | /* | ||
| 37 | * The lockless check can race with remove_wait_queue() in progress, | ||
| 38 | * but in this case its caller should run under rcu_read_lock() and | ||
| 39 | * sighand_cachep is SLAB_DESTROY_BY_RCU, we can safely return. | ||
| 40 | */ | ||
| 41 | if (likely(!waitqueue_active(wqh))) | ||
| 42 | return; | ||
| 43 | |||
| 44 | /* wait_queue_t->func(POLLFREE) should do remove_wait_queue() */ | ||
| 45 | wake_up_poll(wqh, POLLHUP | POLLFREE); | ||
| 46 | } | ||
| 47 | |||
| 33 | struct signalfd_ctx { | 48 | struct signalfd_ctx { |
| 34 | sigset_t sigmask; | 49 | sigset_t sigmask; |
| 35 | }; | 50 | }; |
diff --git a/fs/super.c b/fs/super.c index 6015c02296b7..6277ec6cb60a 100644 --- a/fs/super.c +++ b/fs/super.c | |||
| @@ -634,6 +634,28 @@ rescan: | |||
| 634 | EXPORT_SYMBOL(get_super); | 634 | EXPORT_SYMBOL(get_super); |
| 635 | 635 | ||
| 636 | /** | 636 | /** |
| 637 | * get_super_thawed - get thawed superblock of a device | ||
| 638 | * @bdev: device to get the superblock for | ||
| 639 | * | ||
| 640 | * Scans the superblock list and finds the superblock of the file system | ||
| 641 | * mounted on the device. The superblock is returned once it is thawed | ||
| 642 | * (or immediately if it was not frozen). %NULL is returned if no match | ||
| 643 | * is found. | ||
| 644 | */ | ||
| 645 | struct super_block *get_super_thawed(struct block_device *bdev) | ||
| 646 | { | ||
| 647 | while (1) { | ||
| 648 | struct super_block *s = get_super(bdev); | ||
| 649 | if (!s || s->s_frozen == SB_UNFROZEN) | ||
| 650 | return s; | ||
| 651 | up_read(&s->s_umount); | ||
| 652 | vfs_check_frozen(s, SB_FREEZE_WRITE); | ||
| 653 | put_super(s); | ||
| 654 | } | ||
| 655 | } | ||
| 656 | EXPORT_SYMBOL(get_super_thawed); | ||
| 657 | |||
| 658 | /** | ||
| 637 | * get_active_super - get an active reference to the superblock of a device | 659 | * get_active_super - get an active reference to the superblock of a device |
| 638 | * @bdev: device to get the superblock for | 660 | * @bdev: device to get the superblock for |
| 639 | * | 661 | * |
diff --git a/fs/xfs/kmem.h b/fs/xfs/kmem.h index 292eff198030..ab7c53fe346e 100644 --- a/fs/xfs/kmem.h +++ b/fs/xfs/kmem.h | |||
| @@ -110,10 +110,4 @@ kmem_zone_destroy(kmem_zone_t *zone) | |||
| 110 | extern void *kmem_zone_alloc(kmem_zone_t *, unsigned int __nocast); | 110 | extern void *kmem_zone_alloc(kmem_zone_t *, unsigned int __nocast); |
| 111 | extern void *kmem_zone_zalloc(kmem_zone_t *, unsigned int __nocast); | 111 | extern void *kmem_zone_zalloc(kmem_zone_t *, unsigned int __nocast); |
| 112 | 112 | ||
| 113 | static inline int | ||
| 114 | kmem_shake_allow(gfp_t gfp_mask) | ||
| 115 | { | ||
| 116 | return ((gfp_mask & __GFP_WAIT) && (gfp_mask & __GFP_FS)); | ||
| 117 | } | ||
| 118 | |||
| 119 | #endif /* __XFS_SUPPORT_KMEM_H__ */ | 113 | #endif /* __XFS_SUPPORT_KMEM_H__ */ |
diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c index b4ff40b5f918..53db20ee3e77 100644 --- a/fs/xfs/xfs_dquot.c +++ b/fs/xfs/xfs_dquot.c | |||
| @@ -63,82 +63,6 @@ int xfs_dqerror_mod = 33; | |||
| 63 | static struct lock_class_key xfs_dquot_other_class; | 63 | static struct lock_class_key xfs_dquot_other_class; |
| 64 | 64 | ||
| 65 | /* | 65 | /* |
| 66 | * Allocate and initialize a dquot. We don't always allocate fresh memory; | ||
| 67 | * we try to reclaim a free dquot if the number of incore dquots are above | ||
| 68 | * a threshold. | ||
| 69 | * The only field inside the core that gets initialized at this point | ||
| 70 | * is the d_id field. The idea is to fill in the entire q_core | ||
| 71 | * when we read in the on disk dquot. | ||
| 72 | */ | ||
| 73 | STATIC xfs_dquot_t * | ||
| 74 | xfs_qm_dqinit( | ||
| 75 | xfs_mount_t *mp, | ||
| 76 | xfs_dqid_t id, | ||
| 77 | uint type) | ||
| 78 | { | ||
| 79 | xfs_dquot_t *dqp; | ||
| 80 | boolean_t brandnewdquot; | ||
| 81 | |||
| 82 | brandnewdquot = xfs_qm_dqalloc_incore(&dqp); | ||
| 83 | dqp->dq_flags = type; | ||
| 84 | dqp->q_core.d_id = cpu_to_be32(id); | ||
| 85 | dqp->q_mount = mp; | ||
| 86 | |||
| 87 | /* | ||
| 88 | * No need to re-initialize these if this is a reclaimed dquot. | ||
| 89 | */ | ||
| 90 | if (brandnewdquot) { | ||
| 91 | INIT_LIST_HEAD(&dqp->q_freelist); | ||
| 92 | mutex_init(&dqp->q_qlock); | ||
| 93 | init_waitqueue_head(&dqp->q_pinwait); | ||
| 94 | |||
| 95 | /* | ||
| 96 | * Because we want to use a counting completion, complete | ||
| 97 | * the flush completion once to allow a single access to | ||
| 98 | * the flush completion without blocking. | ||
| 99 | */ | ||
| 100 | init_completion(&dqp->q_flush); | ||
| 101 | complete(&dqp->q_flush); | ||
| 102 | |||
| 103 | trace_xfs_dqinit(dqp); | ||
| 104 | } else { | ||
| 105 | /* | ||
| 106 | * Only the q_core portion was zeroed in dqreclaim_one(). | ||
| 107 | * So, we need to reset others. | ||
| 108 | */ | ||
| 109 | dqp->q_nrefs = 0; | ||
| 110 | dqp->q_blkno = 0; | ||
| 111 | INIT_LIST_HEAD(&dqp->q_mplist); | ||
| 112 | INIT_LIST_HEAD(&dqp->q_hashlist); | ||
| 113 | dqp->q_bufoffset = 0; | ||
| 114 | dqp->q_fileoffset = 0; | ||
| 115 | dqp->q_transp = NULL; | ||
| 116 | dqp->q_gdquot = NULL; | ||
| 117 | dqp->q_res_bcount = 0; | ||
| 118 | dqp->q_res_icount = 0; | ||
| 119 | dqp->q_res_rtbcount = 0; | ||
| 120 | atomic_set(&dqp->q_pincount, 0); | ||
| 121 | dqp->q_hash = NULL; | ||
| 122 | ASSERT(list_empty(&dqp->q_freelist)); | ||
| 123 | |||
| 124 | trace_xfs_dqreuse(dqp); | ||
| 125 | } | ||
| 126 | |||
| 127 | /* | ||
| 128 | * In either case we need to make sure group quotas have a different | ||
| 129 | * lock class than user quotas, to make sure lockdep knows we can | ||
| 130 | * locks of one of each at the same time. | ||
| 131 | */ | ||
| 132 | if (!(type & XFS_DQ_USER)) | ||
| 133 | lockdep_set_class(&dqp->q_qlock, &xfs_dquot_other_class); | ||
| 134 | |||
| 135 | /* | ||
| 136 | * log item gets initialized later | ||
| 137 | */ | ||
| 138 | return (dqp); | ||
| 139 | } | ||
| 140 | |||
| 141 | /* | ||
| 142 | * This is called to free all the memory associated with a dquot | 66 | * This is called to free all the memory associated with a dquot |
| 143 | */ | 67 | */ |
| 144 | void | 68 | void |
| @@ -215,10 +139,10 @@ xfs_qm_adjust_dqtimers( | |||
| 215 | 139 | ||
| 216 | if (!d->d_btimer) { | 140 | if (!d->d_btimer) { |
| 217 | if ((d->d_blk_softlimit && | 141 | if ((d->d_blk_softlimit && |
| 218 | (be64_to_cpu(d->d_bcount) >= | 142 | (be64_to_cpu(d->d_bcount) > |
| 219 | be64_to_cpu(d->d_blk_softlimit))) || | 143 | be64_to_cpu(d->d_blk_softlimit))) || |
| 220 | (d->d_blk_hardlimit && | 144 | (d->d_blk_hardlimit && |
| 221 | (be64_to_cpu(d->d_bcount) >= | 145 | (be64_to_cpu(d->d_bcount) > |
| 222 | be64_to_cpu(d->d_blk_hardlimit)))) { | 146 | be64_to_cpu(d->d_blk_hardlimit)))) { |
| 223 | d->d_btimer = cpu_to_be32(get_seconds() + | 147 | d->d_btimer = cpu_to_be32(get_seconds() + |
| 224 | mp->m_quotainfo->qi_btimelimit); | 148 | mp->m_quotainfo->qi_btimelimit); |
| @@ -227,10 +151,10 @@ xfs_qm_adjust_dqtimers( | |||
| 227 | } | 151 | } |
| 228 | } else { | 152 | } else { |
| 229 | if ((!d->d_blk_softlimit || | 153 | if ((!d->d_blk_softlimit || |
| 230 | (be64_to_cpu(d->d_bcount) < | 154 | (be64_to_cpu(d->d_bcount) <= |
| 231 | be64_to_cpu(d->d_blk_softlimit))) && | 155 | be64_to_cpu(d->d_blk_softlimit))) && |
| 232 | (!d->d_blk_hardlimit || | 156 | (!d->d_blk_hardlimit || |
| 233 | (be64_to_cpu(d->d_bcount) < | 157 | (be64_to_cpu(d->d_bcount) <= |
| 234 | be64_to_cpu(d->d_blk_hardlimit)))) { | 158 | be64_to_cpu(d->d_blk_hardlimit)))) { |
| 235 | d->d_btimer = 0; | 159 | d->d_btimer = 0; |
| 236 | } | 160 | } |
| @@ -238,10 +162,10 @@ xfs_qm_adjust_dqtimers( | |||
| 238 | 162 | ||
| 239 | if (!d->d_itimer) { | 163 | if (!d->d_itimer) { |
| 240 | if ((d->d_ino_softlimit && | 164 | if ((d->d_ino_softlimit && |
| 241 | (be64_to_cpu(d->d_icount) >= | 165 | (be64_to_cpu(d->d_icount) > |
| 242 | be64_to_cpu(d->d_ino_softlimit))) || | 166 | be64_to_cpu(d->d_ino_softlimit))) || |
| 243 | (d->d_ino_hardlimit && | 167 | (d->d_ino_hardlimit && |
| 244 | (be64_to_cpu(d->d_icount) >= | 168 | (be64_to_cpu(d->d_icount) > |
| 245 | be64_to_cpu(d->d_ino_hardlimit)))) { | 169 | be64_to_cpu(d->d_ino_hardlimit)))) { |
| 246 | d->d_itimer = cpu_to_be32(get_seconds() + | 170 | d->d_itimer = cpu_to_be32(get_seconds() + |
| 247 | mp->m_quotainfo->qi_itimelimit); | 171 | mp->m_quotainfo->qi_itimelimit); |
| @@ -250,10 +174,10 @@ xfs_qm_adjust_dqtimers( | |||
| 250 | } | 174 | } |
| 251 | } else { | 175 | } else { |
| 252 | if ((!d->d_ino_softlimit || | 176 | if ((!d->d_ino_softlimit || |
| 253 | (be64_to_cpu(d->d_icount) < | 177 | (be64_to_cpu(d->d_icount) <= |
| 254 | be64_to_cpu(d->d_ino_softlimit))) && | 178 | be64_to_cpu(d->d_ino_softlimit))) && |
| 255 | (!d->d_ino_hardlimit || | 179 | (!d->d_ino_hardlimit || |
| 256 | (be64_to_cpu(d->d_icount) < | 180 | (be64_to_cpu(d->d_icount) <= |
| 257 | be64_to_cpu(d->d_ino_hardlimit)))) { | 181 | be64_to_cpu(d->d_ino_hardlimit)))) { |
| 258 | d->d_itimer = 0; | 182 | d->d_itimer = 0; |
| 259 | } | 183 | } |
| @@ -261,10 +185,10 @@ xfs_qm_adjust_dqtimers( | |||
| 261 | 185 | ||
| 262 | if (!d->d_rtbtimer) { | 186 | if (!d->d_rtbtimer) { |
| 263 | if ((d->d_rtb_softlimit && | 187 | if ((d->d_rtb_softlimit && |
| 264 | (be64_to_cpu(d->d_rtbcount) >= | 188 | (be64_to_cpu(d->d_rtbcount) > |
| 265 | be64_to_cpu(d->d_rtb_softlimit))) || | 189 | be64_to_cpu(d->d_rtb_softlimit))) || |
| 266 | (d->d_rtb_hardlimit && | 190 | (d->d_rtb_hardlimit && |
| 267 | (be64_to_cpu(d->d_rtbcount) >= | 191 | (be64_to_cpu(d->d_rtbcount) > |
| 268 | be64_to_cpu(d->d_rtb_hardlimit)))) { | 192 | be64_to_cpu(d->d_rtb_hardlimit)))) { |
| 269 | d->d_rtbtimer = cpu_to_be32(get_seconds() + | 193 | d->d_rtbtimer = cpu_to_be32(get_seconds() + |
| 270 | mp->m_quotainfo->qi_rtbtimelimit); | 194 | mp->m_quotainfo->qi_rtbtimelimit); |
| @@ -273,10 +197,10 @@ xfs_qm_adjust_dqtimers( | |||
| 273 | } | 197 | } |
| 274 | } else { | 198 | } else { |
| 275 | if ((!d->d_rtb_softlimit || | 199 | if ((!d->d_rtb_softlimit || |
| 276 | (be64_to_cpu(d->d_rtbcount) < | 200 | (be64_to_cpu(d->d_rtbcount) <= |
| 277 | be64_to_cpu(d->d_rtb_softlimit))) && | 201 | be64_to_cpu(d->d_rtb_softlimit))) && |
| 278 | (!d->d_rtb_hardlimit || | 202 | (!d->d_rtb_hardlimit || |
| 279 | (be64_to_cpu(d->d_rtbcount) < | 203 | (be64_to_cpu(d->d_rtbcount) <= |
| 280 | be64_to_cpu(d->d_rtb_hardlimit)))) { | 204 | be64_to_cpu(d->d_rtb_hardlimit)))) { |
| 281 | d->d_rtbtimer = 0; | 205 | d->d_rtbtimer = 0; |
| 282 | } | 206 | } |
| @@ -567,7 +491,32 @@ xfs_qm_dqread( | |||
| 567 | int error; | 491 | int error; |
| 568 | int cancelflags = 0; | 492 | int cancelflags = 0; |
| 569 | 493 | ||
| 570 | dqp = xfs_qm_dqinit(mp, id, type); | 494 | |
| 495 | dqp = kmem_zone_zalloc(xfs_Gqm->qm_dqzone, KM_SLEEP); | ||
| 496 | |||
| 497 | dqp->dq_flags = type; | ||
| 498 | dqp->q_core.d_id = cpu_to_be32(id); | ||
| 499 | dqp->q_mount = mp; | ||
| 500 | INIT_LIST_HEAD(&dqp->q_freelist); | ||
| 501 | mutex_init(&dqp->q_qlock); | ||
| 502 | init_waitqueue_head(&dqp->q_pinwait); | ||
| 503 | |||
| 504 | /* | ||
| 505 | * Because we want to use a counting completion, complete | ||
| 506 | * the flush completion once to allow a single access to | ||
| 507 | * the flush completion without blocking. | ||
| 508 | */ | ||
| 509 | init_completion(&dqp->q_flush); | ||
| 510 | complete(&dqp->q_flush); | ||
| 511 | |||
| 512 | /* | ||
| 513 | * Make sure group quotas have a different lock class than user | ||
| 514 | * quotas. | ||
| 515 | */ | ||
| 516 | if (!(type & XFS_DQ_USER)) | ||
| 517 | lockdep_set_class(&dqp->q_qlock, &xfs_dquot_other_class); | ||
| 518 | |||
| 519 | atomic_inc(&xfs_Gqm->qm_totaldquots); | ||
| 571 | 520 | ||
| 572 | trace_xfs_dqread(dqp); | 521 | trace_xfs_dqread(dqp); |
| 573 | 522 | ||
diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 541a508adea1..0ed9ee77937c 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c | |||
| @@ -1489,7 +1489,7 @@ xlog_recover_add_to_cont_trans( | |||
| 1489 | old_ptr = item->ri_buf[item->ri_cnt-1].i_addr; | 1489 | old_ptr = item->ri_buf[item->ri_cnt-1].i_addr; |
| 1490 | old_len = item->ri_buf[item->ri_cnt-1].i_len; | 1490 | old_len = item->ri_buf[item->ri_cnt-1].i_len; |
| 1491 | 1491 | ||
| 1492 | ptr = kmem_realloc(old_ptr, len+old_len, old_len, 0u); | 1492 | ptr = kmem_realloc(old_ptr, len+old_len, old_len, KM_SLEEP); |
| 1493 | memcpy(&ptr[old_len], dp, len); /* d, s, l */ | 1493 | memcpy(&ptr[old_len], dp, len); /* d, s, l */ |
| 1494 | item->ri_buf[item->ri_cnt-1].i_len += len; | 1494 | item->ri_buf[item->ri_cnt-1].i_len += len; |
| 1495 | item->ri_buf[item->ri_cnt-1].i_addr = ptr; | 1495 | item->ri_buf[item->ri_cnt-1].i_addr = ptr; |
| @@ -1981,7 +1981,7 @@ xfs_qm_dqcheck( | |||
| 1981 | 1981 | ||
| 1982 | if (!errs && ddq->d_id) { | 1982 | if (!errs && ddq->d_id) { |
| 1983 | if (ddq->d_blk_softlimit && | 1983 | if (ddq->d_blk_softlimit && |
| 1984 | be64_to_cpu(ddq->d_bcount) >= | 1984 | be64_to_cpu(ddq->d_bcount) > |
| 1985 | be64_to_cpu(ddq->d_blk_softlimit)) { | 1985 | be64_to_cpu(ddq->d_blk_softlimit)) { |
| 1986 | if (!ddq->d_btimer) { | 1986 | if (!ddq->d_btimer) { |
| 1987 | if (flags & XFS_QMOPT_DOWARN) | 1987 | if (flags & XFS_QMOPT_DOWARN) |
| @@ -1992,7 +1992,7 @@ xfs_qm_dqcheck( | |||
| 1992 | } | 1992 | } |
| 1993 | } | 1993 | } |
| 1994 | if (ddq->d_ino_softlimit && | 1994 | if (ddq->d_ino_softlimit && |
| 1995 | be64_to_cpu(ddq->d_icount) >= | 1995 | be64_to_cpu(ddq->d_icount) > |
| 1996 | be64_to_cpu(ddq->d_ino_softlimit)) { | 1996 | be64_to_cpu(ddq->d_ino_softlimit)) { |
| 1997 | if (!ddq->d_itimer) { | 1997 | if (!ddq->d_itimer) { |
| 1998 | if (flags & XFS_QMOPT_DOWARN) | 1998 | if (flags & XFS_QMOPT_DOWARN) |
| @@ -2003,7 +2003,7 @@ xfs_qm_dqcheck( | |||
| 2003 | } | 2003 | } |
| 2004 | } | 2004 | } |
| 2005 | if (ddq->d_rtb_softlimit && | 2005 | if (ddq->d_rtb_softlimit && |
| 2006 | be64_to_cpu(ddq->d_rtbcount) >= | 2006 | be64_to_cpu(ddq->d_rtbcount) > |
| 2007 | be64_to_cpu(ddq->d_rtb_softlimit)) { | 2007 | be64_to_cpu(ddq->d_rtb_softlimit)) { |
| 2008 | if (!ddq->d_rtbtimer) { | 2008 | if (!ddq->d_rtbtimer) { |
| 2009 | if (flags & XFS_QMOPT_DOWARN) | 2009 | if (flags & XFS_QMOPT_DOWARN) |
diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c index 671f37eae1c7..c436def733bf 100644 --- a/fs/xfs/xfs_qm.c +++ b/fs/xfs/xfs_qm.c | |||
| @@ -50,7 +50,6 @@ | |||
| 50 | */ | 50 | */ |
| 51 | struct mutex xfs_Gqm_lock; | 51 | struct mutex xfs_Gqm_lock; |
| 52 | struct xfs_qm *xfs_Gqm; | 52 | struct xfs_qm *xfs_Gqm; |
| 53 | uint ndquot; | ||
| 54 | 53 | ||
| 55 | kmem_zone_t *qm_dqzone; | 54 | kmem_zone_t *qm_dqzone; |
| 56 | kmem_zone_t *qm_dqtrxzone; | 55 | kmem_zone_t *qm_dqtrxzone; |
| @@ -93,7 +92,6 @@ xfs_Gqm_init(void) | |||
| 93 | goto out_free_udqhash; | 92 | goto out_free_udqhash; |
| 94 | 93 | ||
| 95 | hsize /= sizeof(xfs_dqhash_t); | 94 | hsize /= sizeof(xfs_dqhash_t); |
| 96 | ndquot = hsize << 8; | ||
| 97 | 95 | ||
| 98 | xqm = kmem_zalloc(sizeof(xfs_qm_t), KM_SLEEP); | 96 | xqm = kmem_zalloc(sizeof(xfs_qm_t), KM_SLEEP); |
| 99 | xqm->qm_dqhashmask = hsize - 1; | 97 | xqm->qm_dqhashmask = hsize - 1; |
| @@ -137,7 +135,6 @@ xfs_Gqm_init(void) | |||
| 137 | xqm->qm_dqtrxzone = qm_dqtrxzone; | 135 | xqm->qm_dqtrxzone = qm_dqtrxzone; |
| 138 | 136 | ||
| 139 | atomic_set(&xqm->qm_totaldquots, 0); | 137 | atomic_set(&xqm->qm_totaldquots, 0); |
| 140 | xqm->qm_dqfree_ratio = XFS_QM_DQFREE_RATIO; | ||
| 141 | xqm->qm_nrefs = 0; | 138 | xqm->qm_nrefs = 0; |
| 142 | return xqm; | 139 | return xqm; |
| 143 | 140 | ||
| @@ -1600,216 +1597,150 @@ xfs_qm_init_quotainos( | |||
| 1600 | return 0; | 1597 | return 0; |
| 1601 | } | 1598 | } |
| 1602 | 1599 | ||
| 1600 | STATIC void | ||
| 1601 | xfs_qm_dqfree_one( | ||
| 1602 | struct xfs_dquot *dqp) | ||
| 1603 | { | ||
| 1604 | struct xfs_mount *mp = dqp->q_mount; | ||
| 1605 | struct xfs_quotainfo *qi = mp->m_quotainfo; | ||
| 1603 | 1606 | ||
| 1607 | mutex_lock(&dqp->q_hash->qh_lock); | ||
| 1608 | list_del_init(&dqp->q_hashlist); | ||
| 1609 | dqp->q_hash->qh_version++; | ||
| 1610 | mutex_unlock(&dqp->q_hash->qh_lock); | ||
| 1604 | 1611 | ||
| 1605 | /* | 1612 | mutex_lock(&qi->qi_dqlist_lock); |
| 1606 | * Pop the least recently used dquot off the freelist and recycle it. | 1613 | list_del_init(&dqp->q_mplist); |
| 1607 | */ | 1614 | qi->qi_dquots--; |
| 1608 | STATIC struct xfs_dquot * | 1615 | qi->qi_dqreclaims++; |
| 1609 | xfs_qm_dqreclaim_one(void) | 1616 | mutex_unlock(&qi->qi_dqlist_lock); |
| 1617 | |||
| 1618 | xfs_qm_dqdestroy(dqp); | ||
| 1619 | } | ||
| 1620 | |||
| 1621 | STATIC void | ||
| 1622 | xfs_qm_dqreclaim_one( | ||
| 1623 | struct xfs_dquot *dqp, | ||
| 1624 | struct list_head *dispose_list) | ||
| 1610 | { | 1625 | { |
| 1611 | struct xfs_dquot *dqp; | 1626 | struct xfs_mount *mp = dqp->q_mount; |
| 1612 | int restarts = 0; | 1627 | int error; |
| 1613 | 1628 | ||
| 1614 | mutex_lock(&xfs_Gqm->qm_dqfrlist_lock); | 1629 | if (!xfs_dqlock_nowait(dqp)) |
| 1615 | restart: | 1630 | goto out_busy; |
| 1616 | list_for_each_entry(dqp, &xfs_Gqm->qm_dqfrlist, q_freelist) { | ||
| 1617 | struct xfs_mount *mp = dqp->q_mount; | ||
| 1618 | 1631 | ||
| 1619 | if (!xfs_dqlock_nowait(dqp)) | 1632 | /* |
| 1620 | continue; | 1633 | * This dquot has acquired a reference in the meantime remove it from |
| 1634 | * the freelist and try again. | ||
| 1635 | */ | ||
| 1636 | if (dqp->q_nrefs) { | ||
| 1637 | xfs_dqunlock(dqp); | ||
| 1621 | 1638 | ||
| 1622 | /* | 1639 | trace_xfs_dqreclaim_want(dqp); |
| 1623 | * This dquot has already been grabbed by dqlookup. | 1640 | XQM_STATS_INC(xqmstats.xs_qm_dqwants); |
| 1624 | * Remove it from the freelist and try again. | ||
| 1625 | */ | ||
| 1626 | if (dqp->q_nrefs) { | ||
| 1627 | trace_xfs_dqreclaim_want(dqp); | ||
| 1628 | XQM_STATS_INC(xqmstats.xs_qm_dqwants); | ||
| 1629 | |||
| 1630 | list_del_init(&dqp->q_freelist); | ||
| 1631 | xfs_Gqm->qm_dqfrlist_cnt--; | ||
| 1632 | restarts++; | ||
| 1633 | goto dqunlock; | ||
| 1634 | } | ||
| 1635 | 1641 | ||
| 1636 | ASSERT(dqp->q_hash); | 1642 | list_del_init(&dqp->q_freelist); |
| 1637 | ASSERT(!list_empty(&dqp->q_mplist)); | 1643 | xfs_Gqm->qm_dqfrlist_cnt--; |
| 1644 | return; | ||
| 1645 | } | ||
| 1638 | 1646 | ||
| 1639 | /* | 1647 | ASSERT(dqp->q_hash); |
| 1640 | * Try to grab the flush lock. If this dquot is in the process | 1648 | ASSERT(!list_empty(&dqp->q_mplist)); |
| 1641 | * of getting flushed to disk, we don't want to reclaim it. | ||
| 1642 | */ | ||
| 1643 | if (!xfs_dqflock_nowait(dqp)) | ||
| 1644 | goto dqunlock; | ||
| 1645 | 1649 | ||
| 1646 | /* | 1650 | /* |
| 1647 | * We have the flush lock so we know that this is not in the | 1651 | * Try to grab the flush lock. If this dquot is in the process of |
| 1648 | * process of being flushed. So, if this is dirty, flush it | 1652 | * getting flushed to disk, we don't want to reclaim it. |
| 1649 | * DELWRI so that we don't get a freelist infested with | 1653 | */ |
| 1650 | * dirty dquots. | 1654 | if (!xfs_dqflock_nowait(dqp)) |
| 1651 | */ | 1655 | goto out_busy; |
| 1652 | if (XFS_DQ_IS_DIRTY(dqp)) { | ||
| 1653 | int error; | ||
| 1654 | 1656 | ||
| 1655 | trace_xfs_dqreclaim_dirty(dqp); | 1657 | /* |
| 1658 | * We have the flush lock so we know that this is not in the | ||
| 1659 | * process of being flushed. So, if this is dirty, flush it | ||
| 1660 | * DELWRI so that we don't get a freelist infested with | ||
| 1661 | * dirty dquots. | ||
| 1662 | */ | ||
| 1663 | if (XFS_DQ_IS_DIRTY(dqp)) { | ||
| 1664 | trace_xfs_dqreclaim_dirty(dqp); | ||
| 1656 | 1665 | ||
| 1657 | /* | 1666 | /* |
| 1658 | * We flush it delayed write, so don't bother | 1667 | * We flush it delayed write, so don't bother releasing the |
| 1659 | * releasing the freelist lock. | 1668 | * freelist lock. |
| 1660 | */ | 1669 | */ |
| 1661 | error = xfs_qm_dqflush(dqp, SYNC_TRYLOCK); | 1670 | error = xfs_qm_dqflush(dqp, 0); |
| 1662 | if (error) { | 1671 | if (error) { |
| 1663 | xfs_warn(mp, "%s: dquot %p flush failed", | 1672 | xfs_warn(mp, "%s: dquot %p flush failed", |
| 1664 | __func__, dqp); | 1673 | __func__, dqp); |
| 1665 | } | ||
| 1666 | goto dqunlock; | ||
| 1667 | } | 1674 | } |
| 1668 | xfs_dqfunlock(dqp); | ||
| 1669 | 1675 | ||
| 1670 | /* | 1676 | /* |
| 1671 | * Prevent lookup now that we are going to reclaim the dquot. | 1677 | * Give the dquot another try on the freelist, as the |
| 1672 | * Once XFS_DQ_FREEING is set lookup won't touch the dquot, | 1678 | * flushing will take some time. |
| 1673 | * thus we can drop the lock now. | ||
| 1674 | */ | 1679 | */ |
| 1675 | dqp->dq_flags |= XFS_DQ_FREEING; | 1680 | goto out_busy; |
| 1676 | xfs_dqunlock(dqp); | 1681 | } |
| 1677 | 1682 | xfs_dqfunlock(dqp); | |
| 1678 | mutex_lock(&dqp->q_hash->qh_lock); | ||
| 1679 | list_del_init(&dqp->q_hashlist); | ||
| 1680 | dqp->q_hash->qh_version++; | ||
| 1681 | mutex_unlock(&dqp->q_hash->qh_lock); | ||
| 1682 | |||
| 1683 | mutex_lock(&mp->m_quotainfo->qi_dqlist_lock); | ||
| 1684 | list_del_init(&dqp->q_mplist); | ||
| 1685 | mp->m_quotainfo->qi_dquots--; | ||
| 1686 | mp->m_quotainfo->qi_dqreclaims++; | ||
| 1687 | mutex_unlock(&mp->m_quotainfo->qi_dqlist_lock); | ||
| 1688 | 1683 | ||
| 1689 | ASSERT(dqp->q_nrefs == 0); | 1684 | /* |
| 1690 | list_del_init(&dqp->q_freelist); | 1685 | * Prevent lookups now that we are past the point of no return. |
| 1691 | xfs_Gqm->qm_dqfrlist_cnt--; | 1686 | */ |
| 1687 | dqp->dq_flags |= XFS_DQ_FREEING; | ||
| 1688 | xfs_dqunlock(dqp); | ||
| 1692 | 1689 | ||
| 1693 | mutex_unlock(&xfs_Gqm->qm_dqfrlist_lock); | 1690 | ASSERT(dqp->q_nrefs == 0); |
| 1694 | return dqp; | 1691 | list_move_tail(&dqp->q_freelist, dispose_list); |
| 1695 | dqunlock: | 1692 | xfs_Gqm->qm_dqfrlist_cnt--; |
| 1696 | xfs_dqunlock(dqp); | ||
| 1697 | if (restarts >= XFS_QM_RECLAIM_MAX_RESTARTS) | ||
| 1698 | break; | ||
| 1699 | goto restart; | ||
| 1700 | } | ||
| 1701 | 1693 | ||
| 1702 | mutex_unlock(&xfs_Gqm->qm_dqfrlist_lock); | 1694 | trace_xfs_dqreclaim_done(dqp); |
| 1703 | return NULL; | 1695 | XQM_STATS_INC(xqmstats.xs_qm_dqreclaims); |
| 1704 | } | 1696 | return; |
| 1705 | 1697 | ||
| 1706 | /* | 1698 | out_busy: |
| 1707 | * Traverse the freelist of dquots and attempt to reclaim a maximum of | 1699 | xfs_dqunlock(dqp); |
| 1708 | * 'howmany' dquots. This operation races with dqlookup(), and attempts to | ||
| 1709 | * favor the lookup function ... | ||
| 1710 | */ | ||
| 1711 | STATIC int | ||
| 1712 | xfs_qm_shake_freelist( | ||
| 1713 | int howmany) | ||
| 1714 | { | ||
| 1715 | int nreclaimed = 0; | ||
| 1716 | xfs_dquot_t *dqp; | ||
| 1717 | 1700 | ||
| 1718 | if (howmany <= 0) | 1701 | /* |
| 1719 | return 0; | 1702 | * Move the dquot to the tail of the list so that we don't spin on it. |
| 1703 | */ | ||
| 1704 | list_move_tail(&dqp->q_freelist, &xfs_Gqm->qm_dqfrlist); | ||
| 1720 | 1705 | ||
| 1721 | while (nreclaimed < howmany) { | 1706 | trace_xfs_dqreclaim_busy(dqp); |
| 1722 | dqp = xfs_qm_dqreclaim_one(); | 1707 | XQM_STATS_INC(xqmstats.xs_qm_dqreclaim_misses); |
| 1723 | if (!dqp) | ||
| 1724 | return nreclaimed; | ||
| 1725 | xfs_qm_dqdestroy(dqp); | ||
| 1726 | nreclaimed++; | ||
| 1727 | } | ||
| 1728 | return nreclaimed; | ||
| 1729 | } | 1708 | } |
| 1730 | 1709 | ||
| 1731 | /* | ||
| 1732 | * The kmem_shake interface is invoked when memory is running low. | ||
| 1733 | */ | ||
| 1734 | /* ARGSUSED */ | ||
| 1735 | STATIC int | 1710 | STATIC int |
| 1736 | xfs_qm_shake( | 1711 | xfs_qm_shake( |
| 1737 | struct shrinker *shrink, | 1712 | struct shrinker *shrink, |
| 1738 | struct shrink_control *sc) | 1713 | struct shrink_control *sc) |
| 1739 | { | 1714 | { |
| 1740 | int ndqused, nfree, n; | 1715 | int nr_to_scan = sc->nr_to_scan; |
| 1741 | gfp_t gfp_mask = sc->gfp_mask; | 1716 | LIST_HEAD (dispose_list); |
| 1742 | 1717 | struct xfs_dquot *dqp; | |
| 1743 | if (!kmem_shake_allow(gfp_mask)) | ||
| 1744 | return 0; | ||
| 1745 | if (!xfs_Gqm) | ||
| 1746 | return 0; | ||
| 1747 | |||
| 1748 | nfree = xfs_Gqm->qm_dqfrlist_cnt; /* free dquots */ | ||
| 1749 | /* incore dquots in all f/s's */ | ||
| 1750 | ndqused = atomic_read(&xfs_Gqm->qm_totaldquots) - nfree; | ||
| 1751 | |||
| 1752 | ASSERT(ndqused >= 0); | ||
| 1753 | 1718 | ||
| 1754 | if (nfree <= ndqused && nfree < ndquot) | 1719 | if ((sc->gfp_mask & (__GFP_FS|__GFP_WAIT)) != (__GFP_FS|__GFP_WAIT)) |
| 1755 | return 0; | 1720 | return 0; |
| 1721 | if (!nr_to_scan) | ||
| 1722 | goto out; | ||
| 1756 | 1723 | ||
| 1757 | ndqused *= xfs_Gqm->qm_dqfree_ratio; /* target # of free dquots */ | 1724 | mutex_lock(&xfs_Gqm->qm_dqfrlist_lock); |
| 1758 | n = nfree - ndqused - ndquot; /* # over target */ | 1725 | while (!list_empty(&xfs_Gqm->qm_dqfrlist)) { |
| 1759 | 1726 | if (nr_to_scan-- <= 0) | |
| 1760 | return xfs_qm_shake_freelist(MAX(nfree, n)); | 1727 | break; |
| 1761 | } | 1728 | dqp = list_first_entry(&xfs_Gqm->qm_dqfrlist, struct xfs_dquot, |
| 1762 | 1729 | q_freelist); | |
| 1763 | 1730 | xfs_qm_dqreclaim_one(dqp, &dispose_list); | |
| 1764 | /*------------------------------------------------------------------*/ | ||
| 1765 | |||
| 1766 | /* | ||
| 1767 | * Return a new incore dquot. Depending on the number of | ||
| 1768 | * dquots in the system, we either allocate a new one on the kernel heap, | ||
| 1769 | * or reclaim a free one. | ||
| 1770 | * Return value is B_TRUE if we allocated a new dquot, B_FALSE if we managed | ||
| 1771 | * to reclaim an existing one from the freelist. | ||
| 1772 | */ | ||
| 1773 | boolean_t | ||
| 1774 | xfs_qm_dqalloc_incore( | ||
| 1775 | xfs_dquot_t **O_dqpp) | ||
| 1776 | { | ||
| 1777 | xfs_dquot_t *dqp; | ||
| 1778 | |||
| 1779 | /* | ||
| 1780 | * Check against high water mark to see if we want to pop | ||
| 1781 | * a nincompoop dquot off the freelist. | ||
| 1782 | */ | ||
| 1783 | if (atomic_read(&xfs_Gqm->qm_totaldquots) >= ndquot) { | ||
| 1784 | /* | ||
| 1785 | * Try to recycle a dquot from the freelist. | ||
| 1786 | */ | ||
| 1787 | if ((dqp = xfs_qm_dqreclaim_one())) { | ||
| 1788 | XQM_STATS_INC(xqmstats.xs_qm_dqreclaims); | ||
| 1789 | /* | ||
| 1790 | * Just zero the core here. The rest will get | ||
| 1791 | * reinitialized by caller. XXX we shouldn't even | ||
| 1792 | * do this zero ... | ||
| 1793 | */ | ||
| 1794 | memset(&dqp->q_core, 0, sizeof(dqp->q_core)); | ||
| 1795 | *O_dqpp = dqp; | ||
| 1796 | return B_FALSE; | ||
| 1797 | } | ||
| 1798 | XQM_STATS_INC(xqmstats.xs_qm_dqreclaim_misses); | ||
| 1799 | } | 1731 | } |
| 1732 | mutex_unlock(&xfs_Gqm->qm_dqfrlist_lock); | ||
| 1800 | 1733 | ||
| 1801 | /* | 1734 | while (!list_empty(&dispose_list)) { |
| 1802 | * Allocate a brand new dquot on the kernel heap and return it | 1735 | dqp = list_first_entry(&dispose_list, struct xfs_dquot, |
| 1803 | * to the caller to initialize. | 1736 | q_freelist); |
| 1804 | */ | 1737 | list_del_init(&dqp->q_freelist); |
| 1805 | ASSERT(xfs_Gqm->qm_dqzone != NULL); | 1738 | xfs_qm_dqfree_one(dqp); |
| 1806 | *O_dqpp = kmem_zone_zalloc(xfs_Gqm->qm_dqzone, KM_SLEEP); | 1739 | } |
| 1807 | atomic_inc(&xfs_Gqm->qm_totaldquots); | 1740 | out: |
| 1808 | 1741 | return (xfs_Gqm->qm_dqfrlist_cnt / 100) * sysctl_vfs_cache_pressure; | |
| 1809 | return B_TRUE; | ||
| 1810 | } | 1742 | } |
| 1811 | 1743 | ||
| 1812 | |||
| 1813 | /* | 1744 | /* |
| 1814 | * Start a transaction and write the incore superblock changes to | 1745 | * Start a transaction and write the incore superblock changes to |
| 1815 | * disk. flags parameter indicates which fields have changed. | 1746 | * disk. flags parameter indicates which fields have changed. |
diff --git a/fs/xfs/xfs_qm.h b/fs/xfs/xfs_qm.h index 9b4f3adefbc5..9a9b997e1a0a 100644 --- a/fs/xfs/xfs_qm.h +++ b/fs/xfs/xfs_qm.h | |||
| @@ -26,24 +26,12 @@ | |||
| 26 | struct xfs_qm; | 26 | struct xfs_qm; |
| 27 | struct xfs_inode; | 27 | struct xfs_inode; |
| 28 | 28 | ||
| 29 | extern uint ndquot; | ||
| 30 | extern struct mutex xfs_Gqm_lock; | 29 | extern struct mutex xfs_Gqm_lock; |
| 31 | extern struct xfs_qm *xfs_Gqm; | 30 | extern struct xfs_qm *xfs_Gqm; |
| 32 | extern kmem_zone_t *qm_dqzone; | 31 | extern kmem_zone_t *qm_dqzone; |
| 33 | extern kmem_zone_t *qm_dqtrxzone; | 32 | extern kmem_zone_t *qm_dqtrxzone; |
| 34 | 33 | ||
| 35 | /* | 34 | /* |
| 36 | * Ditto, for xfs_qm_dqreclaim_one. | ||
| 37 | */ | ||
| 38 | #define XFS_QM_RECLAIM_MAX_RESTARTS 4 | ||
| 39 | |||
| 40 | /* | ||
| 41 | * Ideal ratio of free to in use dquots. Quota manager makes an attempt | ||
| 42 | * to keep this balance. | ||
| 43 | */ | ||
| 44 | #define XFS_QM_DQFREE_RATIO 2 | ||
| 45 | |||
| 46 | /* | ||
| 47 | * Dquot hashtable constants/threshold values. | 35 | * Dquot hashtable constants/threshold values. |
| 48 | */ | 36 | */ |
| 49 | #define XFS_QM_HASHSIZE_LOW (PAGE_SIZE / sizeof(xfs_dqhash_t)) | 37 | #define XFS_QM_HASHSIZE_LOW (PAGE_SIZE / sizeof(xfs_dqhash_t)) |
| @@ -74,7 +62,6 @@ typedef struct xfs_qm { | |||
| 74 | int qm_dqfrlist_cnt; | 62 | int qm_dqfrlist_cnt; |
| 75 | atomic_t qm_totaldquots; /* total incore dquots */ | 63 | atomic_t qm_totaldquots; /* total incore dquots */ |
| 76 | uint qm_nrefs; /* file systems with quota on */ | 64 | uint qm_nrefs; /* file systems with quota on */ |
| 77 | int qm_dqfree_ratio;/* ratio of free to inuse dquots */ | ||
| 78 | kmem_zone_t *qm_dqzone; /* dquot mem-alloc zone */ | 65 | kmem_zone_t *qm_dqzone; /* dquot mem-alloc zone */ |
| 79 | kmem_zone_t *qm_dqtrxzone; /* t_dqinfo of transactions */ | 66 | kmem_zone_t *qm_dqtrxzone; /* t_dqinfo of transactions */ |
| 80 | } xfs_qm_t; | 67 | } xfs_qm_t; |
| @@ -143,7 +130,6 @@ extern int xfs_qm_quotacheck(xfs_mount_t *); | |||
| 143 | extern int xfs_qm_write_sb_changes(xfs_mount_t *, __int64_t); | 130 | extern int xfs_qm_write_sb_changes(xfs_mount_t *, __int64_t); |
| 144 | 131 | ||
| 145 | /* dquot stuff */ | 132 | /* dquot stuff */ |
| 146 | extern boolean_t xfs_qm_dqalloc_incore(xfs_dquot_t **); | ||
| 147 | extern int xfs_qm_dqpurge_all(xfs_mount_t *, uint); | 133 | extern int xfs_qm_dqpurge_all(xfs_mount_t *, uint); |
| 148 | extern void xfs_qm_dqrele_all_inodes(xfs_mount_t *, uint); | 134 | extern void xfs_qm_dqrele_all_inodes(xfs_mount_t *, uint); |
| 149 | 135 | ||
diff --git a/fs/xfs/xfs_qm_stats.c b/fs/xfs/xfs_qm_stats.c index 8671a0b32644..5729ba570877 100644 --- a/fs/xfs/xfs_qm_stats.c +++ b/fs/xfs/xfs_qm_stats.c | |||
| @@ -42,9 +42,9 @@ static int xqm_proc_show(struct seq_file *m, void *v) | |||
| 42 | { | 42 | { |
| 43 | /* maximum; incore; ratio free to inuse; freelist */ | 43 | /* maximum; incore; ratio free to inuse; freelist */ |
| 44 | seq_printf(m, "%d\t%d\t%d\t%u\n", | 44 | seq_printf(m, "%d\t%d\t%d\t%u\n", |
| 45 | ndquot, | 45 | 0, |
| 46 | xfs_Gqm? atomic_read(&xfs_Gqm->qm_totaldquots) : 0, | 46 | xfs_Gqm? atomic_read(&xfs_Gqm->qm_totaldquots) : 0, |
| 47 | xfs_Gqm? xfs_Gqm->qm_dqfree_ratio : 0, | 47 | 0, |
| 48 | xfs_Gqm? xfs_Gqm->qm_dqfrlist_cnt : 0); | 48 | xfs_Gqm? xfs_Gqm->qm_dqfrlist_cnt : 0); |
| 49 | return 0; | 49 | return 0; |
| 50 | } | 50 | } |
diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c index eafbcff81f3a..711a86e39ff0 100644 --- a/fs/xfs/xfs_qm_syscalls.c +++ b/fs/xfs/xfs_qm_syscalls.c | |||
| @@ -813,11 +813,11 @@ xfs_qm_export_dquot( | |||
| 813 | (XFS_IS_OQUOTA_ENFORCED(mp) && | 813 | (XFS_IS_OQUOTA_ENFORCED(mp) && |
| 814 | (dst->d_flags & (FS_PROJ_QUOTA | FS_GROUP_QUOTA)))) && | 814 | (dst->d_flags & (FS_PROJ_QUOTA | FS_GROUP_QUOTA)))) && |
| 815 | dst->d_id != 0) { | 815 | dst->d_id != 0) { |
| 816 | if (((int) dst->d_bcount >= (int) dst->d_blk_softlimit) && | 816 | if (((int) dst->d_bcount > (int) dst->d_blk_softlimit) && |
| 817 | (dst->d_blk_softlimit > 0)) { | 817 | (dst->d_blk_softlimit > 0)) { |
| 818 | ASSERT(dst->d_btimer != 0); | 818 | ASSERT(dst->d_btimer != 0); |
| 819 | } | 819 | } |
| 820 | if (((int) dst->d_icount >= (int) dst->d_ino_softlimit) && | 820 | if (((int) dst->d_icount > (int) dst->d_ino_softlimit) && |
| 821 | (dst->d_ino_softlimit > 0)) { | 821 | (dst->d_ino_softlimit > 0)) { |
| 822 | ASSERT(dst->d_itimer != 0); | 822 | ASSERT(dst->d_itimer != 0); |
| 823 | } | 823 | } |
diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 6b6df5802e95..bb134a819930 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h | |||
| @@ -733,11 +733,10 @@ DEFINE_EVENT(xfs_dquot_class, name, \ | |||
| 733 | DEFINE_DQUOT_EVENT(xfs_dqadjust); | 733 | DEFINE_DQUOT_EVENT(xfs_dqadjust); |
| 734 | DEFINE_DQUOT_EVENT(xfs_dqreclaim_want); | 734 | DEFINE_DQUOT_EVENT(xfs_dqreclaim_want); |
| 735 | DEFINE_DQUOT_EVENT(xfs_dqreclaim_dirty); | 735 | DEFINE_DQUOT_EVENT(xfs_dqreclaim_dirty); |
| 736 | DEFINE_DQUOT_EVENT(xfs_dqreclaim_unlink); | 736 | DEFINE_DQUOT_EVENT(xfs_dqreclaim_busy); |
| 737 | DEFINE_DQUOT_EVENT(xfs_dqreclaim_done); | ||
| 737 | DEFINE_DQUOT_EVENT(xfs_dqattach_found); | 738 | DEFINE_DQUOT_EVENT(xfs_dqattach_found); |
| 738 | DEFINE_DQUOT_EVENT(xfs_dqattach_get); | 739 | DEFINE_DQUOT_EVENT(xfs_dqattach_get); |
| 739 | DEFINE_DQUOT_EVENT(xfs_dqinit); | ||
| 740 | DEFINE_DQUOT_EVENT(xfs_dqreuse); | ||
| 741 | DEFINE_DQUOT_EVENT(xfs_dqalloc); | 740 | DEFINE_DQUOT_EVENT(xfs_dqalloc); |
| 742 | DEFINE_DQUOT_EVENT(xfs_dqtobp_read); | 741 | DEFINE_DQUOT_EVENT(xfs_dqtobp_read); |
| 743 | DEFINE_DQUOT_EVENT(xfs_dqread); | 742 | DEFINE_DQUOT_EVENT(xfs_dqread); |
diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 329b06aba1c2..7adcdf15ae0c 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c | |||
| @@ -1151,8 +1151,8 @@ xfs_trans_add_item( | |||
| 1151 | { | 1151 | { |
| 1152 | struct xfs_log_item_desc *lidp; | 1152 | struct xfs_log_item_desc *lidp; |
| 1153 | 1153 | ||
| 1154 | ASSERT(lip->li_mountp = tp->t_mountp); | 1154 | ASSERT(lip->li_mountp == tp->t_mountp); |
| 1155 | ASSERT(lip->li_ailp = tp->t_mountp->m_ail); | 1155 | ASSERT(lip->li_ailp == tp->t_mountp->m_ail); |
| 1156 | 1156 | ||
| 1157 | lidp = kmem_zone_zalloc(xfs_log_item_desc_zone, KM_SLEEP | KM_NOFS); | 1157 | lidp = kmem_zone_zalloc(xfs_log_item_desc_zone, KM_SLEEP | KM_NOFS); |
| 1158 | 1158 | ||
diff --git a/fs/xfs/xfs_trans_dquot.c b/fs/xfs/xfs_trans_dquot.c index 4d00ee67792d..c4ba366d24e6 100644 --- a/fs/xfs/xfs_trans_dquot.c +++ b/fs/xfs/xfs_trans_dquot.c | |||
| @@ -649,12 +649,12 @@ xfs_trans_dqresv( | |||
| 649 | * nblks. | 649 | * nblks. |
| 650 | */ | 650 | */ |
| 651 | if (hardlimit > 0ULL && | 651 | if (hardlimit > 0ULL && |
| 652 | hardlimit <= nblks + *resbcountp) { | 652 | hardlimit < nblks + *resbcountp) { |
| 653 | xfs_quota_warn(mp, dqp, QUOTA_NL_BHARDWARN); | 653 | xfs_quota_warn(mp, dqp, QUOTA_NL_BHARDWARN); |
| 654 | goto error_return; | 654 | goto error_return; |
| 655 | } | 655 | } |
| 656 | if (softlimit > 0ULL && | 656 | if (softlimit > 0ULL && |
| 657 | softlimit <= nblks + *resbcountp) { | 657 | softlimit < nblks + *resbcountp) { |
| 658 | if ((timer != 0 && get_seconds() > timer) || | 658 | if ((timer != 0 && get_seconds() > timer) || |
| 659 | (warns != 0 && warns >= warnlimit)) { | 659 | (warns != 0 && warns >= warnlimit)) { |
| 660 | xfs_quota_warn(mp, dqp, | 660 | xfs_quota_warn(mp, dqp, |
| @@ -677,11 +677,13 @@ xfs_trans_dqresv( | |||
| 677 | if (!softlimit) | 677 | if (!softlimit) |
| 678 | softlimit = q->qi_isoftlimit; | 678 | softlimit = q->qi_isoftlimit; |
| 679 | 679 | ||
| 680 | if (hardlimit > 0ULL && count >= hardlimit) { | 680 | if (hardlimit > 0ULL && |
| 681 | hardlimit < ninos + count) { | ||
| 681 | xfs_quota_warn(mp, dqp, QUOTA_NL_IHARDWARN); | 682 | xfs_quota_warn(mp, dqp, QUOTA_NL_IHARDWARN); |
| 682 | goto error_return; | 683 | goto error_return; |
| 683 | } | 684 | } |
| 684 | if (softlimit > 0ULL && count >= softlimit) { | 685 | if (softlimit > 0ULL && |
| 686 | softlimit < ninos + count) { | ||
| 685 | if ((timer != 0 && get_seconds() > timer) || | 687 | if ((timer != 0 && get_seconds() > timer) || |
| 686 | (warns != 0 && warns >= warnlimit)) { | 688 | (warns != 0 && warns >= warnlimit)) { |
| 687 | xfs_quota_warn(mp, dqp, | 689 | xfs_quota_warn(mp, dqp, |
diff --git a/include/asm-generic/io-64-nonatomic-hi-lo.h b/include/asm-generic/io-64-nonatomic-hi-lo.h new file mode 100644 index 000000000000..a6806a94250d --- /dev/null +++ b/include/asm-generic/io-64-nonatomic-hi-lo.h | |||
| @@ -0,0 +1,28 @@ | |||
| 1 | #ifndef _ASM_IO_64_NONATOMIC_HI_LO_H_ | ||
| 2 | #define _ASM_IO_64_NONATOMIC_HI_LO_H_ | ||
| 3 | |||
| 4 | #include <linux/io.h> | ||
| 5 | #include <asm-generic/int-ll64.h> | ||
| 6 | |||
| 7 | #ifndef readq | ||
| 8 | static inline __u64 readq(const volatile void __iomem *addr) | ||
| 9 | { | ||
| 10 | const volatile u32 __iomem *p = addr; | ||
| 11 | u32 low, high; | ||
| 12 | |||
| 13 | high = readl(p + 1); | ||
| 14 | low = readl(p); | ||
| 15 | |||
| 16 | return low + ((u64)high << 32); | ||
| 17 | } | ||
| 18 | #endif | ||
| 19 | |||
| 20 | #ifndef writeq | ||
| 21 | static inline void writeq(__u64 val, volatile void __iomem *addr) | ||
| 22 | { | ||
| 23 | writel(val >> 32, addr + 4); | ||
| 24 | writel(val, addr); | ||
| 25 | } | ||
| 26 | #endif | ||
| 27 | |||
| 28 | #endif /* _ASM_IO_64_NONATOMIC_HI_LO_H_ */ | ||
diff --git a/include/asm-generic/io-64-nonatomic-lo-hi.h b/include/asm-generic/io-64-nonatomic-lo-hi.h new file mode 100644 index 000000000000..ca546b1ff8b5 --- /dev/null +++ b/include/asm-generic/io-64-nonatomic-lo-hi.h | |||
| @@ -0,0 +1,28 @@ | |||
| 1 | #ifndef _ASM_IO_64_NONATOMIC_LO_HI_H_ | ||
| 2 | #define _ASM_IO_64_NONATOMIC_LO_HI_H_ | ||
| 3 | |||
| 4 | #include <linux/io.h> | ||
| 5 | #include <asm-generic/int-ll64.h> | ||
| 6 | |||
| 7 | #ifndef readq | ||
| 8 | static inline __u64 readq(const volatile void __iomem *addr) | ||
| 9 | { | ||
| 10 | const volatile u32 __iomem *p = addr; | ||
| 11 | u32 low, high; | ||
| 12 | |||
| 13 | low = readl(p); | ||
| 14 | high = readl(p + 1); | ||
| 15 | |||
| 16 | return low + ((u64)high << 32); | ||
| 17 | } | ||
| 18 | #endif | ||
| 19 | |||
| 20 | #ifndef writeq | ||
| 21 | static inline void writeq(__u64 val, volatile void __iomem *addr) | ||
| 22 | { | ||
| 23 | writel(val, addr); | ||
| 24 | writel(val >> 32, addr + 4); | ||
| 25 | } | ||
| 26 | #endif | ||
| 27 | |||
| 28 | #endif /* _ASM_IO_64_NONATOMIC_LO_HI_H_ */ | ||
diff --git a/include/asm-generic/poll.h b/include/asm-generic/poll.h index 44bce836d350..9ce7f44aebd2 100644 --- a/include/asm-generic/poll.h +++ b/include/asm-generic/poll.h | |||
| @@ -28,6 +28,8 @@ | |||
| 28 | #define POLLRDHUP 0x2000 | 28 | #define POLLRDHUP 0x2000 |
| 29 | #endif | 29 | #endif |
| 30 | 30 | ||
| 31 | #define POLLFREE 0x4000 /* currently only for epoll */ | ||
| 32 | |||
| 31 | struct pollfd { | 33 | struct pollfd { |
| 32 | int fd; | 34 | int fd; |
| 33 | short events; | 35 | short events; |
diff --git a/include/linux/bitops.h b/include/linux/bitops.h index 3c1063acb2ab..94300fe46cce 100644 --- a/include/linux/bitops.h +++ b/include/linux/bitops.h | |||
| @@ -56,6 +56,26 @@ static inline unsigned long hweight_long(unsigned long w) | |||
| 56 | } | 56 | } |
| 57 | 57 | ||
| 58 | /** | 58 | /** |
| 59 | * rol64 - rotate a 64-bit value left | ||
| 60 | * @word: value to rotate | ||
| 61 | * @shift: bits to roll | ||
| 62 | */ | ||
| 63 | static inline __u64 rol64(__u64 word, unsigned int shift) | ||
| 64 | { | ||
| 65 | return (word << shift) | (word >> (64 - shift)); | ||
| 66 | } | ||
| 67 | |||
| 68 | /** | ||
| 69 | * ror64 - rotate a 64-bit value right | ||
| 70 | * @word: value to rotate | ||
| 71 | * @shift: bits to roll | ||
| 72 | */ | ||
| 73 | static inline __u64 ror64(__u64 word, unsigned int shift) | ||
| 74 | { | ||
| 75 | return (word >> shift) | (word << (64 - shift)); | ||
| 76 | } | ||
| 77 | |||
| 78 | /** | ||
| 59 | * rol32 - rotate a 32-bit value left | 79 | * rol32 - rotate a 32-bit value left |
| 60 | * @word: value to rotate | 80 | * @word: value to rotate |
| 61 | * @shift: bits to roll | 81 | * @shift: bits to roll |
diff --git a/include/linux/digsig.h b/include/linux/digsig.h index b01558b15814..6f85a070bb45 100644 --- a/include/linux/digsig.h +++ b/include/linux/digsig.h | |||
| @@ -30,7 +30,7 @@ enum digest_algo { | |||
| 30 | 30 | ||
| 31 | struct pubkey_hdr { | 31 | struct pubkey_hdr { |
| 32 | uint8_t version; /* key format version */ | 32 | uint8_t version; /* key format version */ |
| 33 | time_t timestamp; /* key made, always 0 for now */ | 33 | uint32_t timestamp; /* key made, always 0 for now */ |
| 34 | uint8_t algo; | 34 | uint8_t algo; |
| 35 | uint8_t nmpi; | 35 | uint8_t nmpi; |
| 36 | char mpi[0]; | 36 | char mpi[0]; |
| @@ -38,7 +38,7 @@ struct pubkey_hdr { | |||
| 38 | 38 | ||
| 39 | struct signature_hdr { | 39 | struct signature_hdr { |
| 40 | uint8_t version; /* signature format version */ | 40 | uint8_t version; /* signature format version */ |
| 41 | time_t timestamp; /* signature made */ | 41 | uint32_t timestamp; /* signature made */ |
| 42 | uint8_t algo; | 42 | uint8_t algo; |
| 43 | uint8_t hash; | 43 | uint8_t hash; |
| 44 | uint8_t keyid[8]; | 44 | uint8_t keyid[8]; |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 386da09f229d..69cd5bb640f5 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
| @@ -2496,6 +2496,7 @@ extern void get_filesystem(struct file_system_type *fs); | |||
| 2496 | extern void put_filesystem(struct file_system_type *fs); | 2496 | extern void put_filesystem(struct file_system_type *fs); |
| 2497 | extern struct file_system_type *get_fs_type(const char *name); | 2497 | extern struct file_system_type *get_fs_type(const char *name); |
| 2498 | extern struct super_block *get_super(struct block_device *); | 2498 | extern struct super_block *get_super(struct block_device *); |
| 2499 | extern struct super_block *get_super_thawed(struct block_device *); | ||
| 2499 | extern struct super_block *get_active_super(struct block_device *bdev); | 2500 | extern struct super_block *get_active_super(struct block_device *bdev); |
| 2500 | extern void drop_super(struct super_block *sb); | 2501 | extern void drop_super(struct super_block *sb); |
| 2501 | extern void iterate_supers(void (*)(struct super_block *, void *), void *); | 2502 | extern void iterate_supers(void (*)(struct super_block *, void *), void *); |
diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index 9f22ba572de0..19a41d1737af 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h | |||
| @@ -217,6 +217,7 @@ struct mmc_card { | |||
| 217 | #define MMC_CARD_SDXC (1<<6) /* card is SDXC */ | 217 | #define MMC_CARD_SDXC (1<<6) /* card is SDXC */ |
| 218 | #define MMC_CARD_REMOVED (1<<7) /* card has been removed */ | 218 | #define MMC_CARD_REMOVED (1<<7) /* card has been removed */ |
| 219 | #define MMC_STATE_HIGHSPEED_200 (1<<8) /* card is in HS200 mode */ | 219 | #define MMC_STATE_HIGHSPEED_200 (1<<8) /* card is in HS200 mode */ |
| 220 | #define MMC_STATE_SLEEP (1<<9) /* card is in sleep state */ | ||
| 220 | unsigned int quirks; /* card quirks */ | 221 | unsigned int quirks; /* card quirks */ |
| 221 | #define MMC_QUIRK_LENIENT_FN0 (1<<0) /* allow SDIO FN0 writes outside of the VS CCCR range */ | 222 | #define MMC_QUIRK_LENIENT_FN0 (1<<0) /* allow SDIO FN0 writes outside of the VS CCCR range */ |
| 222 | #define MMC_QUIRK_BLKSZ_FOR_BYTE_MODE (1<<1) /* use func->cur_blksize */ | 223 | #define MMC_QUIRK_BLKSZ_FOR_BYTE_MODE (1<<1) /* use func->cur_blksize */ |
| @@ -382,6 +383,7 @@ static inline void __maybe_unused remove_quirk(struct mmc_card *card, int data) | |||
| 382 | #define mmc_sd_card_uhs(c) ((c)->state & MMC_STATE_ULTRAHIGHSPEED) | 383 | #define mmc_sd_card_uhs(c) ((c)->state & MMC_STATE_ULTRAHIGHSPEED) |
| 383 | #define mmc_card_ext_capacity(c) ((c)->state & MMC_CARD_SDXC) | 384 | #define mmc_card_ext_capacity(c) ((c)->state & MMC_CARD_SDXC) |
| 384 | #define mmc_card_removed(c) ((c) && ((c)->state & MMC_CARD_REMOVED)) | 385 | #define mmc_card_removed(c) ((c) && ((c)->state & MMC_CARD_REMOVED)) |
| 386 | #define mmc_card_is_sleep(c) ((c)->state & MMC_STATE_SLEEP) | ||
| 385 | 387 | ||
| 386 | #define mmc_card_set_present(c) ((c)->state |= MMC_STATE_PRESENT) | 388 | #define mmc_card_set_present(c) ((c)->state |= MMC_STATE_PRESENT) |
| 387 | #define mmc_card_set_readonly(c) ((c)->state |= MMC_STATE_READONLY) | 389 | #define mmc_card_set_readonly(c) ((c)->state |= MMC_STATE_READONLY) |
| @@ -393,7 +395,9 @@ static inline void __maybe_unused remove_quirk(struct mmc_card *card, int data) | |||
| 393 | #define mmc_sd_card_set_uhs(c) ((c)->state |= MMC_STATE_ULTRAHIGHSPEED) | 395 | #define mmc_sd_card_set_uhs(c) ((c)->state |= MMC_STATE_ULTRAHIGHSPEED) |
| 394 | #define mmc_card_set_ext_capacity(c) ((c)->state |= MMC_CARD_SDXC) | 396 | #define mmc_card_set_ext_capacity(c) ((c)->state |= MMC_CARD_SDXC) |
| 395 | #define mmc_card_set_removed(c) ((c)->state |= MMC_CARD_REMOVED) | 397 | #define mmc_card_set_removed(c) ((c)->state |= MMC_CARD_REMOVED) |
| 398 | #define mmc_card_set_sleep(c) ((c)->state |= MMC_STATE_SLEEP) | ||
| 396 | 399 | ||
| 400 | #define mmc_card_clr_sleep(c) ((c)->state &= ~MMC_STATE_SLEEP) | ||
| 397 | /* | 401 | /* |
| 398 | * Quirk add/remove for MMC products. | 402 | * Quirk add/remove for MMC products. |
| 399 | */ | 403 | */ |
diff --git a/include/linux/mmc/dw_mmc.h b/include/linux/mmc/dw_mmc.h index e8779c6d1759..aae5d1f1bb39 100644 --- a/include/linux/mmc/dw_mmc.h +++ b/include/linux/mmc/dw_mmc.h | |||
| @@ -14,6 +14,8 @@ | |||
| 14 | #ifndef LINUX_MMC_DW_MMC_H | 14 | #ifndef LINUX_MMC_DW_MMC_H |
| 15 | #define LINUX_MMC_DW_MMC_H | 15 | #define LINUX_MMC_DW_MMC_H |
| 16 | 16 | ||
| 17 | #include <linux/scatterlist.h> | ||
| 18 | |||
| 17 | #define MAX_MCI_SLOTS 2 | 19 | #define MAX_MCI_SLOTS 2 |
| 18 | 20 | ||
| 19 | enum dw_mci_state { | 21 | enum dw_mci_state { |
| @@ -40,7 +42,7 @@ struct mmc_data; | |||
| 40 | * @lock: Spinlock protecting the queue and associated data. | 42 | * @lock: Spinlock protecting the queue and associated data. |
| 41 | * @regs: Pointer to MMIO registers. | 43 | * @regs: Pointer to MMIO registers. |
| 42 | * @sg: Scatterlist entry currently being processed by PIO code, if any. | 44 | * @sg: Scatterlist entry currently being processed by PIO code, if any. |
| 43 | * @pio_offset: Offset into the current scatterlist entry. | 45 | * @sg_miter: PIO mapping scatterlist iterator. |
| 44 | * @cur_slot: The slot which is currently using the controller. | 46 | * @cur_slot: The slot which is currently using the controller. |
| 45 | * @mrq: The request currently being processed on @cur_slot, | 47 | * @mrq: The request currently being processed on @cur_slot, |
| 46 | * or NULL if the controller is idle. | 48 | * or NULL if the controller is idle. |
| @@ -115,7 +117,7 @@ struct dw_mci { | |||
| 115 | void __iomem *regs; | 117 | void __iomem *regs; |
| 116 | 118 | ||
| 117 | struct scatterlist *sg; | 119 | struct scatterlist *sg; |
| 118 | unsigned int pio_offset; | 120 | struct sg_mapping_iter sg_miter; |
| 119 | 121 | ||
| 120 | struct dw_mci_slot *cur_slot; | 122 | struct dw_mci_slot *cur_slot; |
| 121 | struct mmc_request *mrq; | 123 | struct mmc_request *mrq; |
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index 0beba1e5e1ed..ee2b0363c040 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h | |||
| @@ -257,6 +257,7 @@ struct mmc_host { | |||
| 257 | #define MMC_CAP2_HS200_1_2V_SDR (1 << 6) /* can support */ | 257 | #define MMC_CAP2_HS200_1_2V_SDR (1 << 6) /* can support */ |
| 258 | #define MMC_CAP2_HS200 (MMC_CAP2_HS200_1_8V_SDR | \ | 258 | #define MMC_CAP2_HS200 (MMC_CAP2_HS200_1_8V_SDR | \ |
| 259 | MMC_CAP2_HS200_1_2V_SDR) | 259 | MMC_CAP2_HS200_1_2V_SDR) |
| 260 | #define MMC_CAP2_BROKEN_VOLTAGE (1 << 7) /* Use the broken voltage */ | ||
| 260 | 261 | ||
| 261 | mmc_pm_flag_t pm_caps; /* supported pm features */ | 262 | mmc_pm_flag_t pm_caps; /* supported pm features */ |
| 262 | unsigned int power_notify_type; | 263 | unsigned int power_notify_type; |
| @@ -444,4 +445,23 @@ static inline int mmc_boot_partition_access(struct mmc_host *host) | |||
| 444 | return !(host->caps2 & MMC_CAP2_BOOTPART_NOACC); | 445 | return !(host->caps2 & MMC_CAP2_BOOTPART_NOACC); |
| 445 | } | 446 | } |
| 446 | 447 | ||
| 448 | #ifdef CONFIG_MMC_CLKGATE | ||
| 449 | void mmc_host_clk_hold(struct mmc_host *host); | ||
| 450 | void mmc_host_clk_release(struct mmc_host *host); | ||
| 451 | unsigned int mmc_host_clk_rate(struct mmc_host *host); | ||
| 452 | |||
| 453 | #else | ||
| 454 | static inline void mmc_host_clk_hold(struct mmc_host *host) | ||
| 455 | { | ||
| 456 | } | ||
| 457 | |||
| 458 | static inline void mmc_host_clk_release(struct mmc_host *host) | ||
| 459 | { | ||
| 460 | } | ||
| 461 | |||
| 462 | static inline unsigned int mmc_host_clk_rate(struct mmc_host *host) | ||
| 463 | { | ||
| 464 | return host->ios.clock; | ||
| 465 | } | ||
| 466 | #endif | ||
| 447 | #endif /* LINUX_MMC_HOST_H */ | 467 | #endif /* LINUX_MMC_HOST_H */ |
diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h index a764cef06b73..d6ba9a12591e 100644 --- a/include/linux/nfs_xdr.h +++ b/include/linux/nfs_xdr.h | |||
| @@ -614,7 +614,6 @@ struct nfs_getaclargs { | |||
| 614 | size_t acl_len; | 614 | size_t acl_len; |
| 615 | unsigned int acl_pgbase; | 615 | unsigned int acl_pgbase; |
| 616 | struct page ** acl_pages; | 616 | struct page ** acl_pages; |
| 617 | struct page * acl_scratch; | ||
| 618 | struct nfs4_sequence_args seq_args; | 617 | struct nfs4_sequence_args seq_args; |
| 619 | }; | 618 | }; |
| 620 | 619 | ||
| @@ -624,6 +623,7 @@ struct nfs_getaclres { | |||
| 624 | size_t acl_len; | 623 | size_t acl_len; |
| 625 | size_t acl_data_offset; | 624 | size_t acl_data_offset; |
| 626 | int acl_flags; | 625 | int acl_flags; |
| 626 | struct page * acl_scratch; | ||
| 627 | struct nfs4_sequence_res seq_res; | 627 | struct nfs4_sequence_res seq_res; |
| 628 | }; | 628 | }; |
| 629 | 629 | ||
diff --git a/include/linux/signalfd.h b/include/linux/signalfd.h index 3ff4961da9b5..247399b2979a 100644 --- a/include/linux/signalfd.h +++ b/include/linux/signalfd.h | |||
| @@ -61,13 +61,16 @@ static inline void signalfd_notify(struct task_struct *tsk, int sig) | |||
| 61 | wake_up(&tsk->sighand->signalfd_wqh); | 61 | wake_up(&tsk->sighand->signalfd_wqh); |
| 62 | } | 62 | } |
| 63 | 63 | ||
| 64 | extern void signalfd_cleanup(struct sighand_struct *sighand); | ||
| 65 | |||
| 64 | #else /* CONFIG_SIGNALFD */ | 66 | #else /* CONFIG_SIGNALFD */ |
| 65 | 67 | ||
| 66 | static inline void signalfd_notify(struct task_struct *tsk, int sig) { } | 68 | static inline void signalfd_notify(struct task_struct *tsk, int sig) { } |
| 67 | 69 | ||
| 70 | static inline void signalfd_cleanup(struct sighand_struct *sighand) { } | ||
| 71 | |||
| 68 | #endif /* CONFIG_SIGNALFD */ | 72 | #endif /* CONFIG_SIGNALFD */ |
| 69 | 73 | ||
| 70 | #endif /* __KERNEL__ */ | 74 | #endif /* __KERNEL__ */ |
| 71 | 75 | ||
| 72 | #endif /* _LINUX_SIGNALFD_H */ | 76 | #endif /* _LINUX_SIGNALFD_H */ |
| 73 | |||
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index 515669fa3c1d..8ec1153ff57b 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h | |||
| @@ -624,7 +624,7 @@ asmlinkage long sys_socketpair(int, int, int, int __user *); | |||
| 624 | asmlinkage long sys_socketcall(int call, unsigned long __user *args); | 624 | asmlinkage long sys_socketcall(int call, unsigned long __user *args); |
| 625 | asmlinkage long sys_listen(int, int); | 625 | asmlinkage long sys_listen(int, int); |
| 626 | asmlinkage long sys_poll(struct pollfd __user *ufds, unsigned int nfds, | 626 | asmlinkage long sys_poll(struct pollfd __user *ufds, unsigned int nfds, |
| 627 | long timeout); | 627 | int timeout); |
| 628 | asmlinkage long sys_select(int n, fd_set __user *inp, fd_set __user *outp, | 628 | asmlinkage long sys_select(int n, fd_set __user *inp, fd_set __user *outp, |
| 629 | fd_set __user *exp, struct timeval __user *tvp); | 629 | fd_set __user *exp, struct timeval __user *tvp); |
| 630 | asmlinkage long sys_old_select(struct sel_arg_struct __user *arg); | 630 | asmlinkage long sys_old_select(struct sel_arg_struct __user *arg); |
diff --git a/include/linux/usb/ch11.h b/include/linux/usb/ch11.h index 31fdb4c6ee3d..0b83acd3360a 100644 --- a/include/linux/usb/ch11.h +++ b/include/linux/usb/ch11.h | |||
| @@ -61,12 +61,6 @@ | |||
| 61 | #define USB_PORT_FEAT_TEST 21 | 61 | #define USB_PORT_FEAT_TEST 21 |
| 62 | #define USB_PORT_FEAT_INDICATOR 22 | 62 | #define USB_PORT_FEAT_INDICATOR 22 |
| 63 | #define USB_PORT_FEAT_C_PORT_L1 23 | 63 | #define USB_PORT_FEAT_C_PORT_L1 23 |
| 64 | #define USB_PORT_FEAT_C_PORT_LINK_STATE 25 | ||
| 65 | #define USB_PORT_FEAT_C_PORT_CONFIG_ERROR 26 | ||
| 66 | #define USB_PORT_FEAT_PORT_REMOTE_WAKE_MASK 27 | ||
| 67 | #define USB_PORT_FEAT_BH_PORT_RESET 28 | ||
| 68 | #define USB_PORT_FEAT_C_BH_PORT_RESET 29 | ||
| 69 | #define USB_PORT_FEAT_FORCE_LINKPM_ACCEPT 30 | ||
| 70 | 64 | ||
| 71 | /* | 65 | /* |
| 72 | * Port feature selectors added by USB 3.0 spec. | 66 | * Port feature selectors added by USB 3.0 spec. |
| @@ -75,8 +69,8 @@ | |||
| 75 | #define USB_PORT_FEAT_LINK_STATE 5 | 69 | #define USB_PORT_FEAT_LINK_STATE 5 |
| 76 | #define USB_PORT_FEAT_U1_TIMEOUT 23 | 70 | #define USB_PORT_FEAT_U1_TIMEOUT 23 |
| 77 | #define USB_PORT_FEAT_U2_TIMEOUT 24 | 71 | #define USB_PORT_FEAT_U2_TIMEOUT 24 |
| 78 | #define USB_PORT_FEAT_C_LINK_STATE 25 | 72 | #define USB_PORT_FEAT_C_PORT_LINK_STATE 25 |
| 79 | #define USB_PORT_FEAT_C_CONFIG_ERR 26 | 73 | #define USB_PORT_FEAT_C_PORT_CONFIG_ERROR 26 |
| 80 | #define USB_PORT_FEAT_REMOTE_WAKE_MASK 27 | 74 | #define USB_PORT_FEAT_REMOTE_WAKE_MASK 27 |
| 81 | #define USB_PORT_FEAT_BH_PORT_RESET 28 | 75 | #define USB_PORT_FEAT_BH_PORT_RESET 28 |
| 82 | #define USB_PORT_FEAT_C_BH_PORT_RESET 29 | 76 | #define USB_PORT_FEAT_C_BH_PORT_RESET 29 |
diff --git a/kernel/fork.c b/kernel/fork.c index b77fd559c78e..e2cd3e2a5ae8 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
| @@ -66,6 +66,7 @@ | |||
| 66 | #include <linux/user-return-notifier.h> | 66 | #include <linux/user-return-notifier.h> |
| 67 | #include <linux/oom.h> | 67 | #include <linux/oom.h> |
| 68 | #include <linux/khugepaged.h> | 68 | #include <linux/khugepaged.h> |
| 69 | #include <linux/signalfd.h> | ||
| 69 | 70 | ||
| 70 | #include <asm/pgtable.h> | 71 | #include <asm/pgtable.h> |
| 71 | #include <asm/pgalloc.h> | 72 | #include <asm/pgalloc.h> |
| @@ -935,8 +936,10 @@ static int copy_sighand(unsigned long clone_flags, struct task_struct *tsk) | |||
| 935 | 936 | ||
| 936 | void __cleanup_sighand(struct sighand_struct *sighand) | 937 | void __cleanup_sighand(struct sighand_struct *sighand) |
| 937 | { | 938 | { |
| 938 | if (atomic_dec_and_test(&sighand->count)) | 939 | if (atomic_dec_and_test(&sighand->count)) { |
| 940 | signalfd_cleanup(sighand); | ||
| 939 | kmem_cache_free(sighand_cachep, sighand); | 941 | kmem_cache_free(sighand_cachep, sighand); |
| 942 | } | ||
| 940 | } | 943 | } |
| 941 | 944 | ||
| 942 | 945 | ||
diff --git a/kernel/params.c b/kernel/params.c index 32ee04308285..4bc965d8a1fe 100644 --- a/kernel/params.c +++ b/kernel/params.c | |||
| @@ -97,7 +97,8 @@ static int parse_one(char *param, | |||
| 97 | for (i = 0; i < num_params; i++) { | 97 | for (i = 0; i < num_params; i++) { |
| 98 | if (parameq(param, params[i].name)) { | 98 | if (parameq(param, params[i].name)) { |
| 99 | /* No one handled NULL, so do it here. */ | 99 | /* No one handled NULL, so do it here. */ |
| 100 | if (!val && params[i].ops->set != param_set_bool) | 100 | if (!val && params[i].ops->set != param_set_bool |
| 101 | && params[i].ops->set != param_set_bint) | ||
| 101 | return -EINVAL; | 102 | return -EINVAL; |
| 102 | pr_debug("They are equal! Calling %p\n", | 103 | pr_debug("They are equal! Calling %p\n", |
| 103 | params[i].ops->set); | 104 | params[i].ops->set); |
diff --git a/kernel/pid.c b/kernel/pid.c index ce8e00deaccb..9f08dfabaf13 100644 --- a/kernel/pid.c +++ b/kernel/pid.c | |||
| @@ -543,12 +543,12 @@ struct pid *find_ge_pid(int nr, struct pid_namespace *ns) | |||
| 543 | */ | 543 | */ |
| 544 | void __init pidhash_init(void) | 544 | void __init pidhash_init(void) |
| 545 | { | 545 | { |
| 546 | int i, pidhash_size; | 546 | unsigned int i, pidhash_size; |
| 547 | 547 | ||
| 548 | pid_hash = alloc_large_system_hash("PID", sizeof(*pid_hash), 0, 18, | 548 | pid_hash = alloc_large_system_hash("PID", sizeof(*pid_hash), 0, 18, |
| 549 | HASH_EARLY | HASH_SMALL, | 549 | HASH_EARLY | HASH_SMALL, |
| 550 | &pidhash_shift, NULL, 4096); | 550 | &pidhash_shift, NULL, 4096); |
| 551 | pidhash_size = 1 << pidhash_shift; | 551 | pidhash_size = 1U << pidhash_shift; |
| 552 | 552 | ||
| 553 | for (i = 0; i < pidhash_size; i++) | 553 | for (i = 0; i < pidhash_size; i++) |
| 554 | INIT_HLIST_HEAD(&pid_hash[i]); | 554 | INIT_HLIST_HEAD(&pid_hash[i]); |
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 6728a7ae6f2d..228d6461c12a 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
| @@ -4414,6 +4414,9 @@ static void mem_cgroup_usage_unregister_event(struct cgroup *cgrp, | |||
| 4414 | */ | 4414 | */ |
| 4415 | BUG_ON(!thresholds); | 4415 | BUG_ON(!thresholds); |
| 4416 | 4416 | ||
| 4417 | if (!thresholds->primary) | ||
| 4418 | goto unlock; | ||
| 4419 | |||
| 4417 | usage = mem_cgroup_usage(memcg, type == _MEMSWAP); | 4420 | usage = mem_cgroup_usage(memcg, type == _MEMSWAP); |
| 4418 | 4421 | ||
| 4419 | /* Check if a threshold crossed before removing */ | 4422 | /* Check if a threshold crossed before removing */ |
| @@ -4462,7 +4465,7 @@ swap_buffers: | |||
| 4462 | 4465 | ||
| 4463 | /* To be sure that nobody uses thresholds */ | 4466 | /* To be sure that nobody uses thresholds */ |
| 4464 | synchronize_rcu(); | 4467 | synchronize_rcu(); |
| 4465 | 4468 | unlock: | |
| 4466 | mutex_unlock(&memcg->thresholds_lock); | 4469 | mutex_unlock(&memcg->thresholds_lock); |
| 4467 | } | 4470 | } |
| 4468 | 4471 | ||
diff --git a/mm/nommu.c b/mm/nommu.c index b982290fd962..f59e170fceb4 100644 --- a/mm/nommu.c +++ b/mm/nommu.c | |||
| @@ -696,9 +696,11 @@ static void add_vma_to_mm(struct mm_struct *mm, struct vm_area_struct *vma) | |||
| 696 | if (vma->vm_file) { | 696 | if (vma->vm_file) { |
| 697 | mapping = vma->vm_file->f_mapping; | 697 | mapping = vma->vm_file->f_mapping; |
| 698 | 698 | ||
| 699 | mutex_lock(&mapping->i_mmap_mutex); | ||
| 699 | flush_dcache_mmap_lock(mapping); | 700 | flush_dcache_mmap_lock(mapping); |
| 700 | vma_prio_tree_insert(vma, &mapping->i_mmap); | 701 | vma_prio_tree_insert(vma, &mapping->i_mmap); |
| 701 | flush_dcache_mmap_unlock(mapping); | 702 | flush_dcache_mmap_unlock(mapping); |
| 703 | mutex_unlock(&mapping->i_mmap_mutex); | ||
| 702 | } | 704 | } |
| 703 | 705 | ||
| 704 | /* add the VMA to the tree */ | 706 | /* add the VMA to the tree */ |
| @@ -760,9 +762,11 @@ static void delete_vma_from_mm(struct vm_area_struct *vma) | |||
| 760 | if (vma->vm_file) { | 762 | if (vma->vm_file) { |
| 761 | mapping = vma->vm_file->f_mapping; | 763 | mapping = vma->vm_file->f_mapping; |
| 762 | 764 | ||
| 765 | mutex_lock(&mapping->i_mmap_mutex); | ||
| 763 | flush_dcache_mmap_lock(mapping); | 766 | flush_dcache_mmap_lock(mapping); |
| 764 | vma_prio_tree_remove(vma, &mapping->i_mmap); | 767 | vma_prio_tree_remove(vma, &mapping->i_mmap); |
| 765 | flush_dcache_mmap_unlock(mapping); | 768 | flush_dcache_mmap_unlock(mapping); |
| 769 | mutex_unlock(&mapping->i_mmap_mutex); | ||
| 766 | } | 770 | } |
| 767 | 771 | ||
| 768 | /* remove from the MM's tree and list */ | 772 | /* remove from the MM's tree and list */ |
| @@ -775,8 +779,6 @@ static void delete_vma_from_mm(struct vm_area_struct *vma) | |||
| 775 | 779 | ||
| 776 | if (vma->vm_next) | 780 | if (vma->vm_next) |
| 777 | vma->vm_next->vm_prev = vma->vm_prev; | 781 | vma->vm_next->vm_prev = vma->vm_prev; |
| 778 | |||
| 779 | vma->vm_mm = NULL; | ||
| 780 | } | 782 | } |
| 781 | 783 | ||
| 782 | /* | 784 | /* |
| @@ -2052,6 +2054,7 @@ int nommu_shrink_inode_mappings(struct inode *inode, size_t size, | |||
| 2052 | high = (size + PAGE_SIZE - 1) >> PAGE_SHIFT; | 2054 | high = (size + PAGE_SIZE - 1) >> PAGE_SHIFT; |
| 2053 | 2055 | ||
| 2054 | down_write(&nommu_region_sem); | 2056 | down_write(&nommu_region_sem); |
| 2057 | mutex_lock(&inode->i_mapping->i_mmap_mutex); | ||
| 2055 | 2058 | ||
| 2056 | /* search for VMAs that fall within the dead zone */ | 2059 | /* search for VMAs that fall within the dead zone */ |
| 2057 | vma_prio_tree_foreach(vma, &iter, &inode->i_mapping->i_mmap, | 2060 | vma_prio_tree_foreach(vma, &iter, &inode->i_mapping->i_mmap, |
| @@ -2059,6 +2062,7 @@ int nommu_shrink_inode_mappings(struct inode *inode, size_t size, | |||
| 2059 | /* found one - only interested if it's shared out of the page | 2062 | /* found one - only interested if it's shared out of the page |
| 2060 | * cache */ | 2063 | * cache */ |
| 2061 | if (vma->vm_flags & VM_SHARED) { | 2064 | if (vma->vm_flags & VM_SHARED) { |
| 2065 | mutex_unlock(&inode->i_mapping->i_mmap_mutex); | ||
| 2062 | up_write(&nommu_region_sem); | 2066 | up_write(&nommu_region_sem); |
| 2063 | return -ETXTBSY; /* not quite true, but near enough */ | 2067 | return -ETXTBSY; /* not quite true, but near enough */ |
| 2064 | } | 2068 | } |
| @@ -2086,6 +2090,7 @@ int nommu_shrink_inode_mappings(struct inode *inode, size_t size, | |||
| 2086 | } | 2090 | } |
| 2087 | } | 2091 | } |
| 2088 | 2092 | ||
| 2093 | mutex_unlock(&inode->i_mapping->i_mmap_mutex); | ||
| 2089 | up_write(&nommu_region_sem); | 2094 | up_write(&nommu_region_sem); |
| 2090 | return 0; | 2095 | return 0; |
| 2091 | } | 2096 | } |
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index d2186ecb36f7..a13ded1938f0 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
| @@ -5236,6 +5236,7 @@ void *__init alloc_large_system_hash(const char *tablename, | |||
| 5236 | max = ((unsigned long long)nr_all_pages << PAGE_SHIFT) >> 4; | 5236 | max = ((unsigned long long)nr_all_pages << PAGE_SHIFT) >> 4; |
| 5237 | do_div(max, bucketsize); | 5237 | do_div(max, bucketsize); |
| 5238 | } | 5238 | } |
| 5239 | max = min(max, 0x80000000ULL); | ||
| 5239 | 5240 | ||
| 5240 | if (numentries > max) | 5241 | if (numentries > max) |
| 5241 | numentries = max; | 5242 | numentries = max; |
diff --git a/net/core/netpoll.c b/net/core/netpoll.c index 556b08298669..ddefc513b44a 100644 --- a/net/core/netpoll.c +++ b/net/core/netpoll.c | |||
| @@ -194,7 +194,7 @@ static void netpoll_poll_dev(struct net_device *dev) | |||
| 194 | 194 | ||
| 195 | poll_napi(dev); | 195 | poll_napi(dev); |
| 196 | 196 | ||
| 197 | if (dev->priv_flags & IFF_SLAVE) { | 197 | if (dev->flags & IFF_SLAVE) { |
| 198 | if (dev->npinfo) { | 198 | if (dev->npinfo) { |
| 199 | struct net_device *bond_dev = dev->master; | 199 | struct net_device *bond_dev = dev->master; |
| 200 | struct sk_buff *skb; | 200 | struct sk_buff *skb; |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 37755ccc0e96..22ef5f9fd2ff 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
| @@ -3240,7 +3240,8 @@ void __init tcp_init(void) | |||
| 3240 | { | 3240 | { |
| 3241 | struct sk_buff *skb = NULL; | 3241 | struct sk_buff *skb = NULL; |
| 3242 | unsigned long limit; | 3242 | unsigned long limit; |
| 3243 | int i, max_share, cnt; | 3243 | int max_share, cnt; |
| 3244 | unsigned int i; | ||
| 3244 | unsigned long jiffy = jiffies; | 3245 | unsigned long jiffy = jiffies; |
| 3245 | 3246 | ||
| 3246 | BUILD_BUG_ON(sizeof(struct tcp_skb_cb) > sizeof(skb->cb)); | 3247 | BUILD_BUG_ON(sizeof(struct tcp_skb_cb) > sizeof(skb->cb)); |
| @@ -3283,7 +3284,7 @@ void __init tcp_init(void) | |||
| 3283 | &tcp_hashinfo.bhash_size, | 3284 | &tcp_hashinfo.bhash_size, |
| 3284 | NULL, | 3285 | NULL, |
| 3285 | 64 * 1024); | 3286 | 64 * 1024); |
| 3286 | tcp_hashinfo.bhash_size = 1 << tcp_hashinfo.bhash_size; | 3287 | tcp_hashinfo.bhash_size = 1U << tcp_hashinfo.bhash_size; |
| 3287 | for (i = 0; i < tcp_hashinfo.bhash_size; i++) { | 3288 | for (i = 0; i < tcp_hashinfo.bhash_size; i++) { |
| 3288 | spin_lock_init(&tcp_hashinfo.bhash[i].lock); | 3289 | spin_lock_init(&tcp_hashinfo.bhash[i].lock); |
| 3289 | INIT_HLIST_HEAD(&tcp_hashinfo.bhash[i].chain); | 3290 | INIT_HLIST_HEAD(&tcp_hashinfo.bhash[i].chain); |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 976034f82320..53c8ce4046b2 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
| @@ -1307,25 +1307,26 @@ static int tcp_match_skb_to_sack(struct sock *sk, struct sk_buff *skb, | |||
| 1307 | return in_sack; | 1307 | return in_sack; |
| 1308 | } | 1308 | } |
| 1309 | 1309 | ||
| 1310 | static u8 tcp_sacktag_one(const struct sk_buff *skb, struct sock *sk, | 1310 | /* Mark the given newly-SACKed range as such, adjusting counters and hints. */ |
| 1311 | struct tcp_sacktag_state *state, | 1311 | static u8 tcp_sacktag_one(struct sock *sk, |
| 1312 | struct tcp_sacktag_state *state, u8 sacked, | ||
| 1313 | u32 start_seq, u32 end_seq, | ||
| 1312 | int dup_sack, int pcount) | 1314 | int dup_sack, int pcount) |
| 1313 | { | 1315 | { |
| 1314 | struct tcp_sock *tp = tcp_sk(sk); | 1316 | struct tcp_sock *tp = tcp_sk(sk); |
| 1315 | u8 sacked = TCP_SKB_CB(skb)->sacked; | ||
| 1316 | int fack_count = state->fack_count; | 1317 | int fack_count = state->fack_count; |
| 1317 | 1318 | ||
| 1318 | /* Account D-SACK for retransmitted packet. */ | 1319 | /* Account D-SACK for retransmitted packet. */ |
| 1319 | if (dup_sack && (sacked & TCPCB_RETRANS)) { | 1320 | if (dup_sack && (sacked & TCPCB_RETRANS)) { |
| 1320 | if (tp->undo_marker && tp->undo_retrans && | 1321 | if (tp->undo_marker && tp->undo_retrans && |
| 1321 | after(TCP_SKB_CB(skb)->end_seq, tp->undo_marker)) | 1322 | after(end_seq, tp->undo_marker)) |
| 1322 | tp->undo_retrans--; | 1323 | tp->undo_retrans--; |
| 1323 | if (sacked & TCPCB_SACKED_ACKED) | 1324 | if (sacked & TCPCB_SACKED_ACKED) |
| 1324 | state->reord = min(fack_count, state->reord); | 1325 | state->reord = min(fack_count, state->reord); |
| 1325 | } | 1326 | } |
| 1326 | 1327 | ||
| 1327 | /* Nothing to do; acked frame is about to be dropped (was ACKed). */ | 1328 | /* Nothing to do; acked frame is about to be dropped (was ACKed). */ |
| 1328 | if (!after(TCP_SKB_CB(skb)->end_seq, tp->snd_una)) | 1329 | if (!after(end_seq, tp->snd_una)) |
| 1329 | return sacked; | 1330 | return sacked; |
| 1330 | 1331 | ||
| 1331 | if (!(sacked & TCPCB_SACKED_ACKED)) { | 1332 | if (!(sacked & TCPCB_SACKED_ACKED)) { |
| @@ -1344,13 +1345,13 @@ static u8 tcp_sacktag_one(const struct sk_buff *skb, struct sock *sk, | |||
| 1344 | /* New sack for not retransmitted frame, | 1345 | /* New sack for not retransmitted frame, |
| 1345 | * which was in hole. It is reordering. | 1346 | * which was in hole. It is reordering. |
| 1346 | */ | 1347 | */ |
| 1347 | if (before(TCP_SKB_CB(skb)->seq, | 1348 | if (before(start_seq, |
| 1348 | tcp_highest_sack_seq(tp))) | 1349 | tcp_highest_sack_seq(tp))) |
| 1349 | state->reord = min(fack_count, | 1350 | state->reord = min(fack_count, |
| 1350 | state->reord); | 1351 | state->reord); |
| 1351 | 1352 | ||
| 1352 | /* SACK enhanced F-RTO (RFC4138; Appendix B) */ | 1353 | /* SACK enhanced F-RTO (RFC4138; Appendix B) */ |
| 1353 | if (!after(TCP_SKB_CB(skb)->end_seq, tp->frto_highmark)) | 1354 | if (!after(end_seq, tp->frto_highmark)) |
| 1354 | state->flag |= FLAG_ONLY_ORIG_SACKED; | 1355 | state->flag |= FLAG_ONLY_ORIG_SACKED; |
| 1355 | } | 1356 | } |
| 1356 | 1357 | ||
| @@ -1368,8 +1369,7 @@ static u8 tcp_sacktag_one(const struct sk_buff *skb, struct sock *sk, | |||
| 1368 | 1369 | ||
| 1369 | /* Lost marker hint past SACKed? Tweak RFC3517 cnt */ | 1370 | /* Lost marker hint past SACKed? Tweak RFC3517 cnt */ |
| 1370 | if (!tcp_is_fack(tp) && (tp->lost_skb_hint != NULL) && | 1371 | if (!tcp_is_fack(tp) && (tp->lost_skb_hint != NULL) && |
| 1371 | before(TCP_SKB_CB(skb)->seq, | 1372 | before(start_seq, TCP_SKB_CB(tp->lost_skb_hint)->seq)) |
| 1372 | TCP_SKB_CB(tp->lost_skb_hint)->seq)) | ||
| 1373 | tp->lost_cnt_hint += pcount; | 1373 | tp->lost_cnt_hint += pcount; |
| 1374 | 1374 | ||
| 1375 | if (fack_count > tp->fackets_out) | 1375 | if (fack_count > tp->fackets_out) |
| @@ -1388,6 +1388,9 @@ static u8 tcp_sacktag_one(const struct sk_buff *skb, struct sock *sk, | |||
| 1388 | return sacked; | 1388 | return sacked; |
| 1389 | } | 1389 | } |
| 1390 | 1390 | ||
| 1391 | /* Shift newly-SACKed bytes from this skb to the immediately previous | ||
| 1392 | * already-SACKed sk_buff. Mark the newly-SACKed bytes as such. | ||
| 1393 | */ | ||
| 1391 | static int tcp_shifted_skb(struct sock *sk, struct sk_buff *skb, | 1394 | static int tcp_shifted_skb(struct sock *sk, struct sk_buff *skb, |
| 1392 | struct tcp_sacktag_state *state, | 1395 | struct tcp_sacktag_state *state, |
| 1393 | unsigned int pcount, int shifted, int mss, | 1396 | unsigned int pcount, int shifted, int mss, |
| @@ -1395,10 +1398,13 @@ static int tcp_shifted_skb(struct sock *sk, struct sk_buff *skb, | |||
| 1395 | { | 1398 | { |
| 1396 | struct tcp_sock *tp = tcp_sk(sk); | 1399 | struct tcp_sock *tp = tcp_sk(sk); |
| 1397 | struct sk_buff *prev = tcp_write_queue_prev(sk, skb); | 1400 | struct sk_buff *prev = tcp_write_queue_prev(sk, skb); |
| 1401 | u32 start_seq = TCP_SKB_CB(skb)->seq; /* start of newly-SACKed */ | ||
| 1402 | u32 end_seq = start_seq + shifted; /* end of newly-SACKed */ | ||
| 1398 | 1403 | ||
| 1399 | BUG_ON(!pcount); | 1404 | BUG_ON(!pcount); |
| 1400 | 1405 | ||
| 1401 | if (skb == tp->lost_skb_hint) | 1406 | /* Adjust hint for FACK. Non-FACK is handled in tcp_sacktag_one(). */ |
| 1407 | if (tcp_is_fack(tp) && (skb == tp->lost_skb_hint)) | ||
| 1402 | tp->lost_cnt_hint += pcount; | 1408 | tp->lost_cnt_hint += pcount; |
| 1403 | 1409 | ||
| 1404 | TCP_SKB_CB(prev)->end_seq += shifted; | 1410 | TCP_SKB_CB(prev)->end_seq += shifted; |
| @@ -1424,8 +1430,11 @@ static int tcp_shifted_skb(struct sock *sk, struct sk_buff *skb, | |||
| 1424 | skb_shinfo(skb)->gso_type = 0; | 1430 | skb_shinfo(skb)->gso_type = 0; |
| 1425 | } | 1431 | } |
| 1426 | 1432 | ||
| 1427 | /* We discard results */ | 1433 | /* Adjust counters and hints for the newly sacked sequence range but |
| 1428 | tcp_sacktag_one(skb, sk, state, dup_sack, pcount); | 1434 | * discard the return value since prev is already marked. |
| 1435 | */ | ||
| 1436 | tcp_sacktag_one(sk, state, TCP_SKB_CB(skb)->sacked, | ||
| 1437 | start_seq, end_seq, dup_sack, pcount); | ||
| 1429 | 1438 | ||
| 1430 | /* Difference in this won't matter, both ACKed by the same cumul. ACK */ | 1439 | /* Difference in this won't matter, both ACKed by the same cumul. ACK */ |
| 1431 | TCP_SKB_CB(prev)->sacked |= (TCP_SKB_CB(skb)->sacked & TCPCB_EVER_RETRANS); | 1440 | TCP_SKB_CB(prev)->sacked |= (TCP_SKB_CB(skb)->sacked & TCPCB_EVER_RETRANS); |
| @@ -1664,10 +1673,14 @@ static struct sk_buff *tcp_sacktag_walk(struct sk_buff *skb, struct sock *sk, | |||
| 1664 | break; | 1673 | break; |
| 1665 | 1674 | ||
| 1666 | if (in_sack) { | 1675 | if (in_sack) { |
| 1667 | TCP_SKB_CB(skb)->sacked = tcp_sacktag_one(skb, sk, | 1676 | TCP_SKB_CB(skb)->sacked = |
| 1668 | state, | 1677 | tcp_sacktag_one(sk, |
| 1669 | dup_sack, | 1678 | state, |
| 1670 | tcp_skb_pcount(skb)); | 1679 | TCP_SKB_CB(skb)->sacked, |
| 1680 | TCP_SKB_CB(skb)->seq, | ||
| 1681 | TCP_SKB_CB(skb)->end_seq, | ||
| 1682 | dup_sack, | ||
| 1683 | tcp_skb_pcount(skb)); | ||
| 1671 | 1684 | ||
| 1672 | if (!before(TCP_SKB_CB(skb)->seq, | 1685 | if (!before(TCP_SKB_CB(skb)->seq, |
| 1673 | tcp_highest_sack_seq(tp))) | 1686 | tcp_highest_sack_seq(tp))) |
diff --git a/net/mac80211/main.c b/net/mac80211/main.c index 0a0d94ad9b08..b142bd4c2390 100644 --- a/net/mac80211/main.c +++ b/net/mac80211/main.c | |||
| @@ -910,6 +910,8 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) | |||
| 910 | wiphy_debug(local->hw.wiphy, "Failed to initialize wep: %d\n", | 910 | wiphy_debug(local->hw.wiphy, "Failed to initialize wep: %d\n", |
| 911 | result); | 911 | result); |
| 912 | 912 | ||
| 913 | ieee80211_led_init(local); | ||
| 914 | |||
| 913 | rtnl_lock(); | 915 | rtnl_lock(); |
| 914 | 916 | ||
| 915 | result = ieee80211_init_rate_ctrl_alg(local, | 917 | result = ieee80211_init_rate_ctrl_alg(local, |
| @@ -931,8 +933,6 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) | |||
| 931 | 933 | ||
| 932 | rtnl_unlock(); | 934 | rtnl_unlock(); |
| 933 | 935 | ||
| 934 | ieee80211_led_init(local); | ||
| 935 | |||
| 936 | local->network_latency_notifier.notifier_call = | 936 | local->network_latency_notifier.notifier_call = |
| 937 | ieee80211_max_network_latency; | 937 | ieee80211_max_network_latency; |
| 938 | result = pm_qos_add_notifier(PM_QOS_NETWORK_LATENCY, | 938 | result = pm_qos_add_notifier(PM_QOS_NETWORK_LATENCY, |
diff --git a/net/rxrpc/ar-key.c b/net/rxrpc/ar-key.c index 4cba13e46ffd..ae3a035f5390 100644 --- a/net/rxrpc/ar-key.c +++ b/net/rxrpc/ar-key.c | |||
| @@ -232,7 +232,7 @@ static int rxrpc_krb5_decode_principal(struct krb5_principal *princ, | |||
| 232 | if (toklen <= (n_parts + 1) * 4) | 232 | if (toklen <= (n_parts + 1) * 4) |
| 233 | return -EINVAL; | 233 | return -EINVAL; |
| 234 | 234 | ||
| 235 | princ->name_parts = kcalloc(sizeof(char *), n_parts, GFP_KERNEL); | 235 | princ->name_parts = kcalloc(n_parts, sizeof(char *), GFP_KERNEL); |
| 236 | if (!princ->name_parts) | 236 | if (!princ->name_parts) |
| 237 | return -ENOMEM; | 237 | return -ENOMEM; |
| 238 | 238 | ||
| @@ -355,7 +355,7 @@ static int rxrpc_krb5_decode_tagged_array(struct krb5_tagged_data **_td, | |||
| 355 | 355 | ||
| 356 | _debug("n_elem %d", n_elem); | 356 | _debug("n_elem %d", n_elem); |
| 357 | 357 | ||
| 358 | td = kcalloc(sizeof(struct krb5_tagged_data), n_elem, | 358 | td = kcalloc(n_elem, sizeof(struct krb5_tagged_data), |
| 359 | GFP_KERNEL); | 359 | GFP_KERNEL); |
| 360 | if (!td) | 360 | if (!td) |
| 361 | return -ENOMEM; | 361 | return -ENOMEM; |
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c index e8c969577768..d0de2a2c3a2d 100644 --- a/scripts/mod/file2alias.c +++ b/scripts/mod/file2alias.c | |||
| @@ -932,7 +932,7 @@ static int do_isapnp_entry(const char *filename, | |||
| 932 | (id->function >> 12) & 0x0f, (id->function >> 8) & 0x0f); | 932 | (id->function >> 12) & 0x0f, (id->function >> 8) & 0x0f); |
| 933 | return 1; | 933 | return 1; |
| 934 | } | 934 | } |
| 935 | ADD_TO_DEVTABLE("isa", struct isapnp_device_id, do_isapnp_entry); | 935 | ADD_TO_DEVTABLE("isapnp", struct isapnp_device_id, do_isapnp_entry); |
| 936 | 936 | ||
| 937 | /* | 937 | /* |
| 938 | * Append a match expression for a single masked hex digit. | 938 | * Append a match expression for a single masked hex digit. |
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index 2bd594e6d1b4..9adb667dd31a 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c | |||
| @@ -1494,6 +1494,13 @@ static int addend_386_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r) | |||
| 1494 | return 0; | 1494 | return 0; |
| 1495 | } | 1495 | } |
| 1496 | 1496 | ||
| 1497 | #ifndef R_ARM_CALL | ||
| 1498 | #define R_ARM_CALL 28 | ||
| 1499 | #endif | ||
| 1500 | #ifndef R_ARM_JUMP24 | ||
| 1501 | #define R_ARM_JUMP24 29 | ||
| 1502 | #endif | ||
| 1503 | |||
| 1497 | static int addend_arm_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r) | 1504 | static int addend_arm_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r) |
| 1498 | { | 1505 | { |
| 1499 | unsigned int r_typ = ELF_R_TYPE(r->r_info); | 1506 | unsigned int r_typ = ELF_R_TYPE(r->r_info); |
| @@ -1505,6 +1512,8 @@ static int addend_arm_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r) | |||
| 1505 | (elf->symtab_start + ELF_R_SYM(r->r_info)); | 1512 | (elf->symtab_start + ELF_R_SYM(r->r_info)); |
| 1506 | break; | 1513 | break; |
| 1507 | case R_ARM_PC24: | 1514 | case R_ARM_PC24: |
| 1515 | case R_ARM_CALL: | ||
| 1516 | case R_ARM_JUMP24: | ||
| 1508 | /* From ARM ABI: ((S + A) | T) - P */ | 1517 | /* From ARM ABI: ((S + A) | T) - P */ |
| 1509 | r->r_addend = (int)(long)(elf->hdr + | 1518 | r->r_addend = (int)(long)(elf->hdr + |
| 1510 | sechdr->sh_offset + | 1519 | sechdr->sh_offset + |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 9350f3c3bdf8..3647baa9bfed 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -80,6 +80,8 @@ enum { | |||
| 80 | ALC_AUTOMUTE_MIXER, /* mute/unmute mixer widget AMP */ | 80 | ALC_AUTOMUTE_MIXER, /* mute/unmute mixer widget AMP */ |
| 81 | }; | 81 | }; |
| 82 | 82 | ||
| 83 | #define MAX_VOL_NIDS 0x40 | ||
| 84 | |||
| 83 | struct alc_spec { | 85 | struct alc_spec { |
| 84 | /* codec parameterization */ | 86 | /* codec parameterization */ |
| 85 | const struct snd_kcontrol_new *mixers[5]; /* mixer arrays */ | 87 | const struct snd_kcontrol_new *mixers[5]; /* mixer arrays */ |
| @@ -118,8 +120,8 @@ struct alc_spec { | |||
| 118 | const hda_nid_t *capsrc_nids; | 120 | const hda_nid_t *capsrc_nids; |
| 119 | hda_nid_t dig_in_nid; /* digital-in NID; optional */ | 121 | hda_nid_t dig_in_nid; /* digital-in NID; optional */ |
| 120 | hda_nid_t mixer_nid; /* analog-mixer NID */ | 122 | hda_nid_t mixer_nid; /* analog-mixer NID */ |
| 121 | DECLARE_BITMAP(vol_ctls, 0x20 << 1); | 123 | DECLARE_BITMAP(vol_ctls, MAX_VOL_NIDS << 1); |
| 122 | DECLARE_BITMAP(sw_ctls, 0x20 << 1); | 124 | DECLARE_BITMAP(sw_ctls, MAX_VOL_NIDS << 1); |
| 123 | 125 | ||
| 124 | /* capture setup for dynamic dual-adc switch */ | 126 | /* capture setup for dynamic dual-adc switch */ |
| 125 | hda_nid_t cur_adc; | 127 | hda_nid_t cur_adc; |
| @@ -3149,7 +3151,10 @@ static int alc_auto_fill_dac_nids(struct hda_codec *codec) | |||
| 3149 | static inline unsigned int get_ctl_pos(unsigned int data) | 3151 | static inline unsigned int get_ctl_pos(unsigned int data) |
| 3150 | { | 3152 | { |
| 3151 | hda_nid_t nid = get_amp_nid_(data); | 3153 | hda_nid_t nid = get_amp_nid_(data); |
| 3152 | unsigned int dir = get_amp_direction_(data); | 3154 | unsigned int dir; |
| 3155 | if (snd_BUG_ON(nid >= MAX_VOL_NIDS)) | ||
| 3156 | return 0; | ||
| 3157 | dir = get_amp_direction_(data); | ||
| 3153 | return (nid << 1) | dir; | 3158 | return (nid << 1) | dir; |
| 3154 | } | 3159 | } |
| 3155 | 3160 | ||
| @@ -4374,6 +4379,7 @@ enum { | |||
| 4374 | ALC882_FIXUP_ACER_ASPIRE_8930G, | 4379 | ALC882_FIXUP_ACER_ASPIRE_8930G, |
| 4375 | ALC882_FIXUP_ASPIRE_8930G_VERBS, | 4380 | ALC882_FIXUP_ASPIRE_8930G_VERBS, |
| 4376 | ALC885_FIXUP_MACPRO_GPIO, | 4381 | ALC885_FIXUP_MACPRO_GPIO, |
| 4382 | ALC889_FIXUP_DAC_ROUTE, | ||
| 4377 | }; | 4383 | }; |
| 4378 | 4384 | ||
| 4379 | static void alc889_fixup_coef(struct hda_codec *codec, | 4385 | static void alc889_fixup_coef(struct hda_codec *codec, |
| @@ -4427,6 +4433,31 @@ static void alc885_fixup_macpro_gpio(struct hda_codec *codec, | |||
| 4427 | alc882_gpio_mute(codec, 1, 0); | 4433 | alc882_gpio_mute(codec, 1, 0); |
| 4428 | } | 4434 | } |
| 4429 | 4435 | ||
| 4436 | /* Fix the connection of some pins for ALC889: | ||
| 4437 | * At least, Acer Aspire 5935 shows the connections to DAC3/4 don't | ||
| 4438 | * work correctly (bko#42740) | ||
| 4439 | */ | ||
| 4440 | static void alc889_fixup_dac_route(struct hda_codec *codec, | ||
| 4441 | const struct alc_fixup *fix, int action) | ||
| 4442 | { | ||
| 4443 | if (action == ALC_FIXUP_ACT_PRE_PROBE) { | ||
| 4444 | /* fake the connections during parsing the tree */ | ||
| 4445 | hda_nid_t conn1[2] = { 0x0c, 0x0d }; | ||
| 4446 | hda_nid_t conn2[2] = { 0x0e, 0x0f }; | ||
| 4447 | snd_hda_override_conn_list(codec, 0x14, 2, conn1); | ||
| 4448 | snd_hda_override_conn_list(codec, 0x15, 2, conn1); | ||
| 4449 | snd_hda_override_conn_list(codec, 0x18, 2, conn2); | ||
| 4450 | snd_hda_override_conn_list(codec, 0x1a, 2, conn2); | ||
| 4451 | } else if (action == ALC_FIXUP_ACT_PROBE) { | ||
| 4452 | /* restore the connections */ | ||
| 4453 | hda_nid_t conn[5] = { 0x0c, 0x0d, 0x0e, 0x0f, 0x26 }; | ||
| 4454 | snd_hda_override_conn_list(codec, 0x14, 5, conn); | ||
| 4455 | snd_hda_override_conn_list(codec, 0x15, 5, conn); | ||
| 4456 | snd_hda_override_conn_list(codec, 0x18, 5, conn); | ||
| 4457 | snd_hda_override_conn_list(codec, 0x1a, 5, conn); | ||
| 4458 | } | ||
| 4459 | } | ||
| 4460 | |||
| 4430 | static const struct alc_fixup alc882_fixups[] = { | 4461 | static const struct alc_fixup alc882_fixups[] = { |
| 4431 | [ALC882_FIXUP_ABIT_AW9D_MAX] = { | 4462 | [ALC882_FIXUP_ABIT_AW9D_MAX] = { |
| 4432 | .type = ALC_FIXUP_PINS, | 4463 | .type = ALC_FIXUP_PINS, |
| @@ -4574,6 +4605,10 @@ static const struct alc_fixup alc882_fixups[] = { | |||
| 4574 | .type = ALC_FIXUP_FUNC, | 4605 | .type = ALC_FIXUP_FUNC, |
| 4575 | .v.func = alc885_fixup_macpro_gpio, | 4606 | .v.func = alc885_fixup_macpro_gpio, |
| 4576 | }, | 4607 | }, |
| 4608 | [ALC889_FIXUP_DAC_ROUTE] = { | ||
| 4609 | .type = ALC_FIXUP_FUNC, | ||
| 4610 | .v.func = alc889_fixup_dac_route, | ||
| 4611 | }, | ||
| 4577 | }; | 4612 | }; |
| 4578 | 4613 | ||
| 4579 | static const struct snd_pci_quirk alc882_fixup_tbl[] = { | 4614 | static const struct snd_pci_quirk alc882_fixup_tbl[] = { |
| @@ -4598,6 +4633,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = { | |||
| 4598 | SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G", | 4633 | SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G", |
| 4599 | ALC882_FIXUP_ACER_ASPIRE_4930G), | 4634 | ALC882_FIXUP_ACER_ASPIRE_4930G), |
| 4600 | SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210), | 4635 | SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210), |
| 4636 | SND_PCI_QUIRK(0x1025, 0x0259, "Acer Aspire 5935", ALC889_FIXUP_DAC_ROUTE), | ||
| 4601 | SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", ALC882_FIXUP_ACER_ASPIRE_7736), | 4637 | SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", ALC882_FIXUP_ACER_ASPIRE_7736), |
| 4602 | SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_FIXUP_EAPD), | 4638 | SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_FIXUP_EAPD), |
| 4603 | SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", ALC882_FIXUP_ASUS_W90V), | 4639 | SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", ALC882_FIXUP_ASUS_W90V), |
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 948f0be2f4f3..6345df131a00 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
| @@ -5078,9 +5078,9 @@ static int stac92xx_update_led_status(struct hda_codec *codec) | |||
| 5078 | spec->gpio_dir, spec->gpio_data); | 5078 | spec->gpio_dir, spec->gpio_data); |
| 5079 | } else { | 5079 | } else { |
| 5080 | notmtd_lvl = spec->gpio_led_polarity ? | 5080 | notmtd_lvl = spec->gpio_led_polarity ? |
| 5081 | AC_PINCTL_VREF_HIZ : AC_PINCTL_VREF_GRD; | 5081 | AC_PINCTL_VREF_50 : AC_PINCTL_VREF_GRD; |
| 5082 | muted_lvl = spec->gpio_led_polarity ? | 5082 | muted_lvl = spec->gpio_led_polarity ? |
| 5083 | AC_PINCTL_VREF_GRD : AC_PINCTL_VREF_HIZ; | 5083 | AC_PINCTL_VREF_GRD : AC_PINCTL_VREF_50; |
| 5084 | spec->vref_led = muted ? muted_lvl : notmtd_lvl; | 5084 | spec->vref_led = muted ? muted_lvl : notmtd_lvl; |
| 5085 | stac_vrefout_set(codec, spec->vref_mute_led_nid, | 5085 | stac_vrefout_set(codec, spec->vref_mute_led_nid, |
| 5086 | spec->vref_led); | 5086 | spec->vref_led); |
diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c index 284e311040fe..dff9a00ee8fb 100644 --- a/sound/pci/hda/patch_via.c +++ b/sound/pci/hda/patch_via.c | |||
| @@ -666,6 +666,9 @@ static void via_auto_init_analog_input(struct hda_codec *codec) | |||
| 666 | /* init input-src */ | 666 | /* init input-src */ |
| 667 | for (i = 0; i < spec->num_adc_nids; i++) { | 667 | for (i = 0; i < spec->num_adc_nids; i++) { |
| 668 | int adc_idx = spec->inputs[spec->cur_mux[i]].adc_idx; | 668 | int adc_idx = spec->inputs[spec->cur_mux[i]].adc_idx; |
| 669 | /* secondary ADCs must have the unique MUX */ | ||
| 670 | if (i > 0 && !spec->mux_nids[i]) | ||
| 671 | break; | ||
| 669 | if (spec->mux_nids[adc_idx]) { | 672 | if (spec->mux_nids[adc_idx]) { |
| 670 | int mux_idx = spec->inputs[spec->cur_mux[i]].mux_idx; | 673 | int mux_idx = spec->inputs[spec->cur_mux[i]].mux_idx; |
| 671 | snd_hda_codec_write(codec, spec->mux_nids[adc_idx], 0, | 674 | snd_hda_codec_write(codec, spec->mux_nids[adc_idx], 0, |
diff --git a/sound/pci/intel8x0.c b/sound/pci/intel8x0.c index 9f3b01bb72c8..e0a4263baa20 100644 --- a/sound/pci/intel8x0.c +++ b/sound/pci/intel8x0.c | |||
| @@ -2102,6 +2102,12 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = { | |||
| 2102 | }, | 2102 | }, |
| 2103 | { | 2103 | { |
| 2104 | .subvendor = 0x161f, | 2104 | .subvendor = 0x161f, |
| 2105 | .subdevice = 0x202f, | ||
| 2106 | .name = "Gateway M520", | ||
| 2107 | .type = AC97_TUNE_INV_EAPD | ||
| 2108 | }, | ||
| 2109 | { | ||
| 2110 | .subvendor = 0x161f, | ||
| 2105 | .subdevice = 0x203a, | 2111 | .subdevice = 0x203a, |
| 2106 | .name = "Gateway 4525GZ", /* AD1981B */ | 2112 | .name = "Gateway 4525GZ", /* AD1981B */ |
| 2107 | .type = AC97_TUNE_INV_EAPD | 2113 | .type = AC97_TUNE_INV_EAPD |
diff --git a/sound/soc/codecs/ak4642.c b/sound/soc/codecs/ak4642.c index 5ef70b5d27e4..278c0a0575f5 100644 --- a/sound/soc/codecs/ak4642.c +++ b/sound/soc/codecs/ak4642.c | |||
| @@ -146,13 +146,10 @@ static const struct snd_kcontrol_new ak4642_snd_controls[] = { | |||
| 146 | 146 | ||
| 147 | SOC_DOUBLE_R_TLV("Digital Playback Volume", L_DVC, R_DVC, | 147 | SOC_DOUBLE_R_TLV("Digital Playback Volume", L_DVC, R_DVC, |
| 148 | 0, 0xFF, 1, out_tlv), | 148 | 0, 0xFF, 1, out_tlv), |
| 149 | |||
| 150 | SOC_SINGLE("Headphone Switch", PW_MGMT2, 6, 1, 0), | ||
| 151 | }; | 149 | }; |
| 152 | 150 | ||
| 153 | static const struct snd_kcontrol_new ak4642_hpout_mixer_controls[] = { | 151 | static const struct snd_kcontrol_new ak4642_headphone_control = |
| 154 | SOC_DAPM_SINGLE("DACH", MD_CTL4, 0, 1, 0), | 152 | SOC_DAPM_SINGLE("Switch", PW_MGMT2, 6, 1, 0); |
| 155 | }; | ||
| 156 | 153 | ||
| 157 | static const struct snd_kcontrol_new ak4642_lout_mixer_controls[] = { | 154 | static const struct snd_kcontrol_new ak4642_lout_mixer_controls[] = { |
| 158 | SOC_DAPM_SINGLE("DACL", SG_SL1, 4, 1, 0), | 155 | SOC_DAPM_SINGLE("DACL", SG_SL1, 4, 1, 0), |
| @@ -165,13 +162,12 @@ static const struct snd_soc_dapm_widget ak4642_dapm_widgets[] = { | |||
| 165 | SND_SOC_DAPM_OUTPUT("HPOUTR"), | 162 | SND_SOC_DAPM_OUTPUT("HPOUTR"), |
| 166 | SND_SOC_DAPM_OUTPUT("LINEOUT"), | 163 | SND_SOC_DAPM_OUTPUT("LINEOUT"), |
| 167 | 164 | ||
| 168 | SND_SOC_DAPM_MIXER("HPOUTL Mixer", PW_MGMT2, 5, 0, | 165 | SND_SOC_DAPM_PGA("HPL Out", PW_MGMT2, 5, 0, NULL, 0), |
| 169 | &ak4642_hpout_mixer_controls[0], | 166 | SND_SOC_DAPM_PGA("HPR Out", PW_MGMT2, 4, 0, NULL, 0), |
| 170 | ARRAY_SIZE(ak4642_hpout_mixer_controls)), | 167 | SND_SOC_DAPM_SWITCH("Headphone Enable", SND_SOC_NOPM, 0, 0, |
| 168 | &ak4642_headphone_control), | ||
| 171 | 169 | ||
| 172 | SND_SOC_DAPM_MIXER("HPOUTR Mixer", PW_MGMT2, 4, 0, | 170 | SND_SOC_DAPM_PGA("DACH", MD_CTL4, 0, 0, NULL, 0), |
| 173 | &ak4642_hpout_mixer_controls[0], | ||
| 174 | ARRAY_SIZE(ak4642_hpout_mixer_controls)), | ||
| 175 | 171 | ||
| 176 | SND_SOC_DAPM_MIXER("LINEOUT Mixer", PW_MGMT1, 3, 0, | 172 | SND_SOC_DAPM_MIXER("LINEOUT Mixer", PW_MGMT1, 3, 0, |
| 177 | &ak4642_lout_mixer_controls[0], | 173 | &ak4642_lout_mixer_controls[0], |
| @@ -184,12 +180,17 @@ static const struct snd_soc_dapm_widget ak4642_dapm_widgets[] = { | |||
| 184 | static const struct snd_soc_dapm_route ak4642_intercon[] = { | 180 | static const struct snd_soc_dapm_route ak4642_intercon[] = { |
| 185 | 181 | ||
| 186 | /* Outputs */ | 182 | /* Outputs */ |
| 187 | {"HPOUTL", NULL, "HPOUTL Mixer"}, | 183 | {"HPOUTL", NULL, "HPL Out"}, |
| 188 | {"HPOUTR", NULL, "HPOUTR Mixer"}, | 184 | {"HPOUTR", NULL, "HPR Out"}, |
| 189 | {"LINEOUT", NULL, "LINEOUT Mixer"}, | 185 | {"LINEOUT", NULL, "LINEOUT Mixer"}, |
| 190 | 186 | ||
| 191 | {"HPOUTL Mixer", "DACH", "DAC"}, | 187 | {"HPL Out", NULL, "Headphone Enable"}, |
| 192 | {"HPOUTR Mixer", "DACH", "DAC"}, | 188 | {"HPR Out", NULL, "Headphone Enable"}, |
| 189 | |||
| 190 | {"Headphone Enable", "Switch", "DACH"}, | ||
| 191 | |||
| 192 | {"DACH", NULL, "DAC"}, | ||
| 193 | |||
| 193 | {"LINEOUT Mixer", "DACL", "DAC"}, | 194 | {"LINEOUT Mixer", "DACL", "DAC"}, |
| 194 | }; | 195 | }; |
| 195 | 196 | ||
diff --git a/sound/soc/codecs/wm8962.c b/sound/soc/codecs/wm8962.c index 29c4b02c4790..0ac228b7dc04 100644 --- a/sound/soc/codecs/wm8962.c +++ b/sound/soc/codecs/wm8962.c | |||
| @@ -2564,7 +2564,7 @@ static int dsp2_event(struct snd_soc_dapm_widget *w, | |||
| 2564 | return 0; | 2564 | return 0; |
| 2565 | } | 2565 | } |
| 2566 | 2566 | ||
| 2567 | static const char *st_text[] = { "None", "Right", "Left" }; | 2567 | static const char *st_text[] = { "None", "Left", "Right" }; |
| 2568 | 2568 | ||
| 2569 | static const struct soc_enum str_enum = | 2569 | static const struct soc_enum str_enum = |
| 2570 | SOC_ENUM_SINGLE(WM8962_DAC_DSP_MIXING_1, 2, 3, st_text); | 2570 | SOC_ENUM_SINGLE(WM8962_DAC_DSP_MIXING_1, 2, 3, st_text); |
diff --git a/sound/soc/sh/fsi.c b/sound/soc/sh/fsi.c index db6c89a28bda..ea4a82d01160 100644 --- a/sound/soc/sh/fsi.c +++ b/sound/soc/sh/fsi.c | |||
| @@ -1152,12 +1152,8 @@ static snd_pcm_uframes_t fsi_pointer(struct snd_pcm_substream *substream) | |||
| 1152 | { | 1152 | { |
| 1153 | struct fsi_priv *fsi = fsi_get_priv(substream); | 1153 | struct fsi_priv *fsi = fsi_get_priv(substream); |
| 1154 | struct fsi_stream *io = fsi_get_stream(fsi, fsi_is_play(substream)); | 1154 | struct fsi_stream *io = fsi_get_stream(fsi, fsi_is_play(substream)); |
| 1155 | int samples_pos = io->buff_sample_pos - 1; | ||
| 1156 | 1155 | ||
| 1157 | if (samples_pos < 0) | 1156 | return fsi_sample2frame(fsi, io->buff_sample_pos); |
| 1158 | samples_pos = 0; | ||
| 1159 | |||
| 1160 | return fsi_sample2frame(fsi, samples_pos); | ||
| 1161 | } | 1157 | } |
| 1162 | 1158 | ||
| 1163 | static struct snd_pcm_ops fsi_pcm_ops = { | 1159 | static struct snd_pcm_ops fsi_pcm_ops = { |
diff --git a/sound/usb/caiaq/audio.c b/sound/usb/caiaq/audio.c index 2cf87f5afed4..fde9a7a29cb6 100644 --- a/sound/usb/caiaq/audio.c +++ b/sound/usb/caiaq/audio.c | |||
| @@ -311,8 +311,10 @@ snd_usb_caiaq_pcm_pointer(struct snd_pcm_substream *sub) | |||
| 311 | 311 | ||
| 312 | spin_lock(&dev->spinlock); | 312 | spin_lock(&dev->spinlock); |
| 313 | 313 | ||
| 314 | if (dev->input_panic || dev->output_panic) | 314 | if (dev->input_panic || dev->output_panic) { |
| 315 | ptr = SNDRV_PCM_POS_XRUN; | 315 | ptr = SNDRV_PCM_POS_XRUN; |
| 316 | goto unlock; | ||
| 317 | } | ||
| 316 | 318 | ||
| 317 | if (sub->stream == SNDRV_PCM_STREAM_PLAYBACK) | 319 | if (sub->stream == SNDRV_PCM_STREAM_PLAYBACK) |
| 318 | ptr = bytes_to_frames(sub->runtime, | 320 | ptr = bytes_to_frames(sub->runtime, |
| @@ -321,6 +323,7 @@ snd_usb_caiaq_pcm_pointer(struct snd_pcm_substream *sub) | |||
| 321 | ptr = bytes_to_frames(sub->runtime, | 323 | ptr = bytes_to_frames(sub->runtime, |
| 322 | dev->audio_in_buf_pos[index]); | 324 | dev->audio_in_buf_pos[index]); |
| 323 | 325 | ||
| 326 | unlock: | ||
| 324 | spin_unlock(&dev->spinlock); | 327 | spin_unlock(&dev->spinlock); |
| 325 | return ptr; | 328 | return ptr; |
| 326 | } | 329 | } |
diff --git a/sound/usb/card.h b/sound/usb/card.h index a39edcc32a93..da5fa1ac4eda 100644 --- a/sound/usb/card.h +++ b/sound/usb/card.h | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | #ifndef __USBAUDIO_CARD_H | 1 | #ifndef __USBAUDIO_CARD_H |
| 2 | #define __USBAUDIO_CARD_H | 2 | #define __USBAUDIO_CARD_H |
| 3 | 3 | ||
| 4 | #define MAX_NR_RATES 1024 | ||
| 4 | #define MAX_PACKS 20 | 5 | #define MAX_PACKS 20 |
| 5 | #define MAX_PACKS_HS (MAX_PACKS * 8) /* in high speed mode */ | 6 | #define MAX_PACKS_HS (MAX_PACKS * 8) /* in high speed mode */ |
| 6 | #define MAX_URBS 8 | 7 | #define MAX_URBS 8 |
diff --git a/sound/usb/format.c b/sound/usb/format.c index e09aba19375c..ddfef57c4c9f 100644 --- a/sound/usb/format.c +++ b/sound/usb/format.c | |||
| @@ -209,8 +209,6 @@ static int parse_audio_format_rates_v1(struct snd_usb_audio *chip, struct audiof | |||
| 209 | return 0; | 209 | return 0; |
| 210 | } | 210 | } |
| 211 | 211 | ||
| 212 | #define MAX_UAC2_NR_RATES 1024 | ||
| 213 | |||
| 214 | /* | 212 | /* |
| 215 | * Helper function to walk the array of sample rate triplets reported by | 213 | * Helper function to walk the array of sample rate triplets reported by |
| 216 | * the device. The problem is that we need to parse whole array first to | 214 | * the device. The problem is that we need to parse whole array first to |
| @@ -255,7 +253,7 @@ static int parse_uac2_sample_rate_range(struct audioformat *fp, int nr_triplets, | |||
| 255 | fp->rates |= snd_pcm_rate_to_rate_bit(rate); | 253 | fp->rates |= snd_pcm_rate_to_rate_bit(rate); |
| 256 | 254 | ||
| 257 | nr_rates++; | 255 | nr_rates++; |
| 258 | if (nr_rates >= MAX_UAC2_NR_RATES) { | 256 | if (nr_rates >= MAX_NR_RATES) { |
| 259 | snd_printk(KERN_ERR "invalid uac2 rates\n"); | 257 | snd_printk(KERN_ERR "invalid uac2 rates\n"); |
| 260 | break; | 258 | break; |
| 261 | } | 259 | } |
diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c index a3ddac0deffd..27817266867a 100644 --- a/sound/usb/quirks.c +++ b/sound/usb/quirks.c | |||
| @@ -132,10 +132,14 @@ static int create_fixed_stream_quirk(struct snd_usb_audio *chip, | |||
| 132 | unsigned *rate_table = NULL; | 132 | unsigned *rate_table = NULL; |
| 133 | 133 | ||
| 134 | fp = kmemdup(quirk->data, sizeof(*fp), GFP_KERNEL); | 134 | fp = kmemdup(quirk->data, sizeof(*fp), GFP_KERNEL); |
| 135 | if (! fp) { | 135 | if (!fp) { |
| 136 | snd_printk(KERN_ERR "cannot memdup\n"); | 136 | snd_printk(KERN_ERR "cannot memdup\n"); |
| 137 | return -ENOMEM; | 137 | return -ENOMEM; |
| 138 | } | 138 | } |
| 139 | if (fp->nr_rates > MAX_NR_RATES) { | ||
| 140 | kfree(fp); | ||
| 141 | return -EINVAL; | ||
| 142 | } | ||
| 139 | if (fp->nr_rates > 0) { | 143 | if (fp->nr_rates > 0) { |
| 140 | rate_table = kmemdup(fp->rate_table, | 144 | rate_table = kmemdup(fp->rate_table, |
| 141 | sizeof(int) * fp->nr_rates, GFP_KERNEL); | 145 | sizeof(int) * fp->nr_rates, GFP_KERNEL); |
