diff options
344 files changed, 2929 insertions, 1587 deletions
diff --git a/Documentation/devicetree/bindings/net/socfpga-dwmac.txt b/Documentation/devicetree/bindings/net/socfpga-dwmac.txt index 636f0ac4e223..2a60cd3e8d5d 100644 --- a/Documentation/devicetree/bindings/net/socfpga-dwmac.txt +++ b/Documentation/devicetree/bindings/net/socfpga-dwmac.txt | |||
@@ -23,5 +23,5 @@ gmac0: ethernet@ff700000 { | |||
23 | interrupt-names = "macirq"; | 23 | interrupt-names = "macirq"; |
24 | mac-address = [00 00 00 00 00 00];/* Filled in by U-Boot */ | 24 | mac-address = [00 00 00 00 00 00];/* Filled in by U-Boot */ |
25 | clocks = <&emac_0_clk>; | 25 | clocks = <&emac_0_clk>; |
26 | clocks-names = "stmmaceth"; | 26 | clock-names = "stmmaceth"; |
27 | }; | 27 | }; |
diff --git a/Documentation/devicetree/bindings/net/stmmac.txt b/Documentation/devicetree/bindings/net/stmmac.txt index 80c1fb8bfbb8..a2acd2b26baf 100644 --- a/Documentation/devicetree/bindings/net/stmmac.txt +++ b/Documentation/devicetree/bindings/net/stmmac.txt | |||
@@ -33,7 +33,7 @@ Optional properties: | |||
33 | - max-frame-size: See ethernet.txt file in the same directory | 33 | - max-frame-size: See ethernet.txt file in the same directory |
34 | - clocks: If present, the first clock should be the GMAC main clock, | 34 | - clocks: If present, the first clock should be the GMAC main clock, |
35 | further clocks may be specified in derived bindings. | 35 | further clocks may be specified in derived bindings. |
36 | - clocks-names: One name for each entry in the clocks property, the | 36 | - clock-names: One name for each entry in the clocks property, the |
37 | first one should be "stmmaceth". | 37 | first one should be "stmmaceth". |
38 | 38 | ||
39 | Examples: | 39 | Examples: |
diff --git a/Documentation/devicetree/bindings/pinctrl/pinctrl-st.txt b/Documentation/devicetree/bindings/pinctrl/pinctrl-st.txt index 4bd5be0e5e7d..26bcb18f4e60 100644 --- a/Documentation/devicetree/bindings/pinctrl/pinctrl-st.txt +++ b/Documentation/devicetree/bindings/pinctrl/pinctrl-st.txt | |||
@@ -83,7 +83,7 @@ Example: | |||
83 | reg = <0xfe61f080 0x4>; | 83 | reg = <0xfe61f080 0x4>; |
84 | reg-names = "irqmux"; | 84 | reg-names = "irqmux"; |
85 | interrupts = <GIC_SPI 180 IRQ_TYPE_LEVEL_HIGH>; | 85 | interrupts = <GIC_SPI 180 IRQ_TYPE_LEVEL_HIGH>; |
86 | interrupts-names = "irqmux"; | 86 | interrupt-names = "irqmux"; |
87 | ranges = <0 0xfe610000 0x5000>; | 87 | ranges = <0 0xfe610000 0x5000>; |
88 | 88 | ||
89 | PIO0: gpio@fe610000 { | 89 | PIO0: gpio@fe610000 { |
@@ -165,7 +165,7 @@ sdhci0:sdhci@fe810000{ | |||
165 | interrupt-parent = <&PIO3>; | 165 | interrupt-parent = <&PIO3>; |
166 | #interrupt-cells = <2>; | 166 | #interrupt-cells = <2>; |
167 | interrupts = <3 IRQ_TYPE_LEVEL_HIGH>; /* Interrupt line via PIO3-3 */ | 167 | interrupts = <3 IRQ_TYPE_LEVEL_HIGH>; /* Interrupt line via PIO3-3 */ |
168 | interrupts-names = "card-detect"; | 168 | interrupt-names = "card-detect"; |
169 | pinctrl-names = "default"; | 169 | pinctrl-names = "default"; |
170 | pinctrl-0 = <&pinctrl_mmc>; | 170 | pinctrl-0 = <&pinctrl_mmc>; |
171 | }; | 171 | }; |
diff --git a/Documentation/devicetree/bindings/sound/davinci-mcasp-audio.txt b/Documentation/devicetree/bindings/sound/davinci-mcasp-audio.txt index 569b26c4a81e..60ca07996458 100644 --- a/Documentation/devicetree/bindings/sound/davinci-mcasp-audio.txt +++ b/Documentation/devicetree/bindings/sound/davinci-mcasp-audio.txt | |||
@@ -47,7 +47,7 @@ mcasp0: mcasp0@1d00000 { | |||
47 | reg = <0x100000 0x3000>; | 47 | reg = <0x100000 0x3000>; |
48 | reg-names "mpu"; | 48 | reg-names "mpu"; |
49 | interrupts = <82>, <83>; | 49 | interrupts = <82>, <83>; |
50 | interrupts-names = "tx", "rx"; | 50 | interrupt-names = "tx", "rx"; |
51 | op-mode = <0>; /* MCASP_IIS_MODE */ | 51 | op-mode = <0>; /* MCASP_IIS_MODE */ |
52 | tdm-slots = <2>; | 52 | tdm-slots = <2>; |
53 | serial-dir = < | 53 | serial-dir = < |
diff --git a/Documentation/devicetree/bindings/sound/tlv320aic31xx.txt b/Documentation/devicetree/bindings/sound/tlv320aic31xx.txt index 74c66dee3e14..eff12be5e789 100644 --- a/Documentation/devicetree/bindings/sound/tlv320aic31xx.txt +++ b/Documentation/devicetree/bindings/sound/tlv320aic31xx.txt | |||
@@ -13,6 +13,9 @@ Required properties: | |||
13 | "ti,tlv320aic3111" - TLV320AIC3111 (stereo speaker amp, MiniDSP) | 13 | "ti,tlv320aic3111" - TLV320AIC3111 (stereo speaker amp, MiniDSP) |
14 | 14 | ||
15 | - reg - <int> - I2C slave address | 15 | - reg - <int> - I2C slave address |
16 | - HPVDD-supply, SPRVDD-supply, SPLVDD-supply, AVDD-supply, IOVDD-supply, | ||
17 | DVDD-supply : power supplies for the device as covered in | ||
18 | Documentation/devicetree/bindings/regulator/regulator.txt | ||
16 | 19 | ||
17 | 20 | ||
18 | Optional properties: | 21 | Optional properties: |
@@ -24,9 +27,6 @@ Optional properties: | |||
24 | 3 or MICBIAS_AVDD - MICBIAS output is connected to AVDD | 27 | 3 or MICBIAS_AVDD - MICBIAS output is connected to AVDD |
25 | If this node is not mentioned or if the value is unknown, then | 28 | If this node is not mentioned or if the value is unknown, then |
26 | micbias is set to 2.0V. | 29 | micbias is set to 2.0V. |
27 | - HPVDD-supply, SPRVDD-supply, SPLVDD-supply, AVDD-supply, IOVDD-supply, | ||
28 | DVDD-supply : power supplies for the device as covered in | ||
29 | Documentation/devicetree/bindings/regulator/regulator.txt | ||
30 | 30 | ||
31 | CODEC output pins: | 31 | CODEC output pins: |
32 | * HPL | 32 | * HPL |
diff --git a/MAINTAINERS b/MAINTAINERS index e67ea2442041..6bef70b614c9 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -3485,6 +3485,12 @@ S: Maintained | |||
3485 | F: drivers/extcon/ | 3485 | F: drivers/extcon/ |
3486 | F: Documentation/extcon/ | 3486 | F: Documentation/extcon/ |
3487 | 3487 | ||
3488 | EXYNOS DP DRIVER | ||
3489 | M: Jingoo Han <jg1.han@samsung.com> | ||
3490 | L: dri-devel@lists.freedesktop.org | ||
3491 | S: Maintained | ||
3492 | F: drivers/gpu/drm/exynos/exynos_dp* | ||
3493 | |||
3488 | EXYNOS MIPI DISPLAY DRIVERS | 3494 | EXYNOS MIPI DISPLAY DRIVERS |
3489 | M: Inki Dae <inki.dae@samsung.com> | 3495 | M: Inki Dae <inki.dae@samsung.com> |
3490 | M: Donghwa Lee <dh09.lee@samsung.com> | 3496 | M: Donghwa Lee <dh09.lee@samsung.com> |
@@ -5108,14 +5114,19 @@ F: drivers/s390/kvm/ | |||
5108 | 5114 | ||
5109 | KERNEL VIRTUAL MACHINE (KVM) FOR ARM | 5115 | KERNEL VIRTUAL MACHINE (KVM) FOR ARM |
5110 | M: Christoffer Dall <christoffer.dall@linaro.org> | 5116 | M: Christoffer Dall <christoffer.dall@linaro.org> |
5117 | M: Marc Zyngier <marc.zyngier@arm.com> | ||
5118 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | ||
5111 | L: kvmarm@lists.cs.columbia.edu | 5119 | L: kvmarm@lists.cs.columbia.edu |
5112 | W: http://systems.cs.columbia.edu/projects/kvm-arm | 5120 | W: http://systems.cs.columbia.edu/projects/kvm-arm |
5113 | S: Supported | 5121 | S: Supported |
5114 | F: arch/arm/include/uapi/asm/kvm* | 5122 | F: arch/arm/include/uapi/asm/kvm* |
5115 | F: arch/arm/include/asm/kvm* | 5123 | F: arch/arm/include/asm/kvm* |
5116 | F: arch/arm/kvm/ | 5124 | F: arch/arm/kvm/ |
5125 | F: virt/kvm/arm/ | ||
5126 | F: include/kvm/arm_* | ||
5117 | 5127 | ||
5118 | KERNEL VIRTUAL MACHINE FOR ARM64 (KVM/arm64) | 5128 | KERNEL VIRTUAL MACHINE FOR ARM64 (KVM/arm64) |
5129 | M: Christoffer Dall <christoffer.dall@linaro.org> | ||
5119 | M: Marc Zyngier <marc.zyngier@arm.com> | 5130 | M: Marc Zyngier <marc.zyngier@arm.com> |
5120 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 5131 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
5121 | L: kvmarm@lists.cs.columbia.edu | 5132 | L: kvmarm@lists.cs.columbia.edu |
@@ -1,7 +1,7 @@ | |||
1 | VERSION = 3 | 1 | VERSION = 3 |
2 | PATCHLEVEL = 15 | 2 | PATCHLEVEL = 15 |
3 | SUBLEVEL = 0 | 3 | SUBLEVEL = 0 |
4 | EXTRAVERSION = -rc2 | 4 | EXTRAVERSION = -rc3 |
5 | NAME = Shuffling Zombie Juror | 5 | NAME = Shuffling Zombie Juror |
6 | 6 | ||
7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
diff --git a/arch/arc/kernel/entry.S b/arch/arc/kernel/entry.S index 819dd5f7eb05..29b82adbf0b4 100644 --- a/arch/arc/kernel/entry.S +++ b/arch/arc/kernel/entry.S | |||
@@ -614,11 +614,13 @@ resume_user_mode_begin: | |||
614 | 614 | ||
615 | resume_kernel_mode: | 615 | resume_kernel_mode: |
616 | 616 | ||
617 | #ifdef CONFIG_PREEMPT | 617 | ; Disable Interrupts from this point on |
618 | 618 | ; CONFIG_PREEMPT: This is a must for preempt_schedule_irq() | |
619 | ; This is a must for preempt_schedule_irq() | 619 | ; !CONFIG_PREEMPT: To ensure restore_regs is intr safe |
620 | IRQ_DISABLE r9 | 620 | IRQ_DISABLE r9 |
621 | 621 | ||
622 | #ifdef CONFIG_PREEMPT | ||
623 | |||
622 | ; Can't preempt if preemption disabled | 624 | ; Can't preempt if preemption disabled |
623 | GET_CURR_THR_INFO_FROM_SP r10 | 625 | GET_CURR_THR_INFO_FROM_SP r10 |
624 | ld r8, [r10, THREAD_INFO_PREEMPT_COUNT] | 626 | ld r8, [r10, THREAD_INFO_PREEMPT_COUNT] |
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index ab438cb5af55..db3c5414223e 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -30,9 +30,9 @@ config ARM | |||
30 | select HAVE_ARCH_SECCOMP_FILTER if (AEABI && !OABI_COMPAT) | 30 | select HAVE_ARCH_SECCOMP_FILTER if (AEABI && !OABI_COMPAT) |
31 | select HAVE_ARCH_TRACEHOOK | 31 | select HAVE_ARCH_TRACEHOOK |
32 | select HAVE_BPF_JIT | 32 | select HAVE_BPF_JIT |
33 | select HAVE_CC_STACKPROTECTOR | ||
33 | select HAVE_CONTEXT_TRACKING | 34 | select HAVE_CONTEXT_TRACKING |
34 | select HAVE_C_RECORDMCOUNT | 35 | select HAVE_C_RECORDMCOUNT |
35 | select HAVE_CC_STACKPROTECTOR | ||
36 | select HAVE_DEBUG_KMEMLEAK | 36 | select HAVE_DEBUG_KMEMLEAK |
37 | select HAVE_DMA_API_DEBUG | 37 | select HAVE_DMA_API_DEBUG |
38 | select HAVE_DMA_ATTRS | 38 | select HAVE_DMA_ATTRS |
@@ -311,6 +311,7 @@ config ARCH_MULTIPLATFORM | |||
311 | select ARM_HAS_SG_CHAIN | 311 | select ARM_HAS_SG_CHAIN |
312 | select ARM_PATCH_PHYS_VIRT | 312 | select ARM_PATCH_PHYS_VIRT |
313 | select AUTO_ZRELADDR | 313 | select AUTO_ZRELADDR |
314 | select CLKSRC_OF | ||
314 | select COMMON_CLK | 315 | select COMMON_CLK |
315 | select GENERIC_CLOCKEVENTS | 316 | select GENERIC_CLOCKEVENTS |
316 | select MULTI_IRQ_HANDLER | 317 | select MULTI_IRQ_HANDLER |
@@ -422,8 +423,8 @@ config ARCH_EFM32 | |||
422 | bool "Energy Micro efm32" | 423 | bool "Energy Micro efm32" |
423 | depends on !MMU | 424 | depends on !MMU |
424 | select ARCH_REQUIRE_GPIOLIB | 425 | select ARCH_REQUIRE_GPIOLIB |
425 | select AUTO_ZRELADDR | ||
426 | select ARM_NVIC | 426 | select ARM_NVIC |
427 | select AUTO_ZRELADDR | ||
427 | select CLKSRC_OF | 428 | select CLKSRC_OF |
428 | select COMMON_CLK | 429 | select COMMON_CLK |
429 | select CPU_V7M | 430 | select CPU_V7M |
@@ -511,8 +512,8 @@ config ARCH_IXP4XX | |||
511 | bool "IXP4xx-based" | 512 | bool "IXP4xx-based" |
512 | depends on MMU | 513 | depends on MMU |
513 | select ARCH_HAS_DMA_SET_COHERENT_MASK | 514 | select ARCH_HAS_DMA_SET_COHERENT_MASK |
514 | select ARCH_SUPPORTS_BIG_ENDIAN | ||
515 | select ARCH_REQUIRE_GPIOLIB | 515 | select ARCH_REQUIRE_GPIOLIB |
516 | select ARCH_SUPPORTS_BIG_ENDIAN | ||
516 | select CLKSRC_MMIO | 517 | select CLKSRC_MMIO |
517 | select CPU_XSCALE | 518 | select CPU_XSCALE |
518 | select DMABOUNCE if PCI | 519 | select DMABOUNCE if PCI |
@@ -1110,9 +1111,9 @@ config ARM_NR_BANKS | |||
1110 | default 8 | 1111 | default 8 |
1111 | 1112 | ||
1112 | config IWMMXT | 1113 | config IWMMXT |
1113 | bool "Enable iWMMXt support" if !CPU_PJ4 | 1114 | bool "Enable iWMMXt support" |
1114 | depends on CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_PJ4 | 1115 | depends on CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_PJ4 || CPU_PJ4B |
1115 | default y if PXA27x || PXA3xx || ARCH_MMP || CPU_PJ4 | 1116 | default y if PXA27x || PXA3xx || ARCH_MMP || CPU_PJ4 || CPU_PJ4B |
1116 | help | 1117 | help |
1117 | Enable support for iWMMXt context switching at run time if | 1118 | Enable support for iWMMXt context switching at run time if |
1118 | running on a CPU that supports it. | 1119 | running on a CPU that supports it. |
@@ -1575,8 +1576,8 @@ config BIG_LITTLE | |||
1575 | config BL_SWITCHER | 1576 | config BL_SWITCHER |
1576 | bool "big.LITTLE switcher support" | 1577 | bool "big.LITTLE switcher support" |
1577 | depends on BIG_LITTLE && MCPM && HOTPLUG_CPU | 1578 | depends on BIG_LITTLE && MCPM && HOTPLUG_CPU |
1578 | select CPU_PM | ||
1579 | select ARM_CPU_SUSPEND | 1579 | select ARM_CPU_SUSPEND |
1580 | select CPU_PM | ||
1580 | help | 1581 | help |
1581 | The big.LITTLE "switcher" provides the core functionality to | 1582 | The big.LITTLE "switcher" provides the core functionality to |
1582 | transparently handle transition between a cluster of A15's | 1583 | transparently handle transition between a cluster of A15's |
@@ -1920,9 +1921,9 @@ config XEN | |||
1920 | depends on CPU_V7 && !CPU_V6 | 1921 | depends on CPU_V7 && !CPU_V6 |
1921 | depends on !GENERIC_ATOMIC64 | 1922 | depends on !GENERIC_ATOMIC64 |
1922 | depends on MMU | 1923 | depends on MMU |
1924 | select ARCH_DMA_ADDR_T_64BIT | ||
1923 | select ARM_PSCI | 1925 | select ARM_PSCI |
1924 | select SWIOTLB_XEN | 1926 | select SWIOTLB_XEN |
1925 | select ARCH_DMA_ADDR_T_64BIT | ||
1926 | help | 1927 | help |
1927 | Say Y if you want to run Linux in a Virtual Machine on Xen on ARM. | 1928 | Say Y if you want to run Linux in a Virtual Machine on Xen on ARM. |
1928 | 1929 | ||
diff --git a/arch/arm/Kconfig.debug b/arch/arm/Kconfig.debug index 4a2fc0bf6fc9..eab8ecbe69c1 100644 --- a/arch/arm/Kconfig.debug +++ b/arch/arm/Kconfig.debug | |||
@@ -1030,9 +1030,9 @@ config DEBUG_UART_PHYS | |||
1030 | default 0x40100000 if DEBUG_PXA_UART1 | 1030 | default 0x40100000 if DEBUG_PXA_UART1 |
1031 | default 0x42000000 if ARCH_GEMINI | 1031 | default 0x42000000 if ARCH_GEMINI |
1032 | default 0x7c0003f8 if FOOTBRIDGE | 1032 | default 0x7c0003f8 if FOOTBRIDGE |
1033 | default 0x80230000 if DEBUG_PICOXCELL_UART | ||
1034 | default 0x80070000 if DEBUG_IMX23_UART | 1033 | default 0x80070000 if DEBUG_IMX23_UART |
1035 | default 0x80074000 if DEBUG_IMX28_UART | 1034 | default 0x80074000 if DEBUG_IMX28_UART |
1035 | default 0x80230000 if DEBUG_PICOXCELL_UART | ||
1036 | default 0x808c0000 if ARCH_EP93XX | 1036 | default 0x808c0000 if ARCH_EP93XX |
1037 | default 0x90020000 if DEBUG_NSPIRE_CLASSIC_UART || DEBUG_NSPIRE_CX_UART | 1037 | default 0x90020000 if DEBUG_NSPIRE_CLASSIC_UART || DEBUG_NSPIRE_CX_UART |
1038 | default 0xb0090000 if DEBUG_VEXPRESS_UART0_CRX | 1038 | default 0xb0090000 if DEBUG_VEXPRESS_UART0_CRX |
@@ -1096,22 +1096,22 @@ config DEBUG_UART_VIRT | |||
1096 | default 0xfeb26000 if DEBUG_RK3X_UART1 | 1096 | default 0xfeb26000 if DEBUG_RK3X_UART1 |
1097 | default 0xfeb30c00 if DEBUG_KEYSTONE_UART0 | 1097 | default 0xfeb30c00 if DEBUG_KEYSTONE_UART0 |
1098 | default 0xfeb31000 if DEBUG_KEYSTONE_UART1 | 1098 | default 0xfeb31000 if DEBUG_KEYSTONE_UART1 |
1099 | default 0xfec12000 if DEBUG_MVEBU_UART || DEBUG_MVEBU_UART_ALTERNATE | ||
1100 | default 0xfed60000 if DEBUG_RK29_UART0 | ||
1101 | default 0xfed64000 if DEBUG_RK29_UART1 || DEBUG_RK3X_UART2 | ||
1102 | default 0xfed68000 if DEBUG_RK29_UART2 || DEBUG_RK3X_UART3 | ||
1103 | default 0xfec02000 if DEBUG_SOCFPGA_UART | 1099 | default 0xfec02000 if DEBUG_SOCFPGA_UART |
1100 | default 0xfec12000 if DEBUG_MVEBU_UART || DEBUG_MVEBU_UART_ALTERNATE | ||
1104 | default 0xfec20000 if DEBUG_DAVINCI_DMx_UART0 | 1101 | default 0xfec20000 if DEBUG_DAVINCI_DMx_UART0 |
1105 | default 0xfed0c000 if DEBUG_DAVINCI_DA8XX_UART1 | 1102 | default 0xfed0c000 if DEBUG_DAVINCI_DA8XX_UART1 |
1106 | default 0xfed0d000 if DEBUG_DAVINCI_DA8XX_UART2 | 1103 | default 0xfed0d000 if DEBUG_DAVINCI_DA8XX_UART2 |
1107 | default 0xfed12000 if ARCH_KIRKWOOD | 1104 | default 0xfed12000 if ARCH_KIRKWOOD |
1105 | default 0xfed60000 if DEBUG_RK29_UART0 | ||
1106 | default 0xfed64000 if DEBUG_RK29_UART1 || DEBUG_RK3X_UART2 | ||
1107 | default 0xfed68000 if DEBUG_RK29_UART2 || DEBUG_RK3X_UART3 | ||
1108 | default 0xfedc0000 if ARCH_EP93XX | 1108 | default 0xfedc0000 if ARCH_EP93XX |
1109 | default 0xfee003f8 if FOOTBRIDGE | 1109 | default 0xfee003f8 if FOOTBRIDGE |
1110 | default 0xfee20000 if DEBUG_NSPIRE_CLASSIC_UART || DEBUG_NSPIRE_CX_UART | 1110 | default 0xfee20000 if DEBUG_NSPIRE_CLASSIC_UART || DEBUG_NSPIRE_CX_UART |
1111 | default 0xfef36000 if DEBUG_HIGHBANK_UART | ||
1112 | default 0xfee82340 if ARCH_IOP13XX | 1111 | default 0xfee82340 if ARCH_IOP13XX |
1113 | default 0xfef00000 if ARCH_IXP4XX && !CPU_BIG_ENDIAN | 1112 | default 0xfef00000 if ARCH_IXP4XX && !CPU_BIG_ENDIAN |
1114 | default 0xfef00003 if ARCH_IXP4XX && CPU_BIG_ENDIAN | 1113 | default 0xfef00003 if ARCH_IXP4XX && CPU_BIG_ENDIAN |
1114 | default 0xfef36000 if DEBUG_HIGHBANK_UART | ||
1115 | default 0xfefff700 if ARCH_IOP33X | 1115 | default 0xfefff700 if ARCH_IOP33X |
1116 | default 0xff003000 if DEBUG_U300_UART | 1116 | default 0xff003000 if DEBUG_U300_UART |
1117 | default DEBUG_UART_PHYS if !MMU | 1117 | default DEBUG_UART_PHYS if !MMU |
diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile index 35c146f31e46..377b7c364033 100644 --- a/arch/arm/boot/dts/Makefile +++ b/arch/arm/boot/dts/Makefile | |||
@@ -51,10 +51,9 @@ dtb-$(CONFIG_ARCH_AT91) += sama5d36ek.dtb | |||
51 | 51 | ||
52 | dtb-$(CONFIG_ARCH_ATLAS6) += atlas6-evb.dtb | 52 | dtb-$(CONFIG_ARCH_ATLAS6) += atlas6-evb.dtb |
53 | dtb-$(CONFIG_ARCH_BCM2835) += bcm2835-rpi-b.dtb | 53 | dtb-$(CONFIG_ARCH_BCM2835) += bcm2835-rpi-b.dtb |
54 | dtb-$(CONFIG_ARCH_BCM_5301X) += bcm4708-netgear-r6250.dtb | ||
54 | dtb-$(CONFIG_ARCH_BCM_MOBILE) += bcm28155-ap.dtb \ | 55 | dtb-$(CONFIG_ARCH_BCM_MOBILE) += bcm28155-ap.dtb \ |
55 | bcm21664-garnet.dtb | 56 | bcm21664-garnet.dtb |
56 | dtb-$(CONFIG_ARCH_BCM2835) += bcm2835-rpi-b.dtb | ||
57 | dtb-$(CONFIG_ARCH_BCM_5301X) += bcm4708-netgear-r6250.dtb | ||
58 | dtb-$(CONFIG_ARCH_BERLIN) += \ | 57 | dtb-$(CONFIG_ARCH_BERLIN) += \ |
59 | berlin2-sony-nsz-gs7.dtb \ | 58 | berlin2-sony-nsz-gs7.dtb \ |
60 | berlin2cd-google-chromecast.dtb | 59 | berlin2cd-google-chromecast.dtb |
@@ -246,6 +245,7 @@ dtb-$(CONFIG_ARCH_OMAP2PLUS) += omap2420-h4.dtb \ | |||
246 | omap3-sbc-t3730.dtb \ | 245 | omap3-sbc-t3730.dtb \ |
247 | omap3-devkit8000.dtb \ | 246 | omap3-devkit8000.dtb \ |
248 | omap3-beagle-xm.dtb \ | 247 | omap3-beagle-xm.dtb \ |
248 | omap3-beagle-xm-ab.dtb \ | ||
249 | omap3-evm.dtb \ | 249 | omap3-evm.dtb \ |
250 | omap3-evm-37xx.dtb \ | 250 | omap3-evm-37xx.dtb \ |
251 | omap3-ldp.dtb \ | 251 | omap3-ldp.dtb \ |
@@ -294,13 +294,6 @@ dtb-$(CONFIG_ARCH_PRIMA2) += prima2-evb.dtb | |||
294 | dtb-$(CONFIG_ARCH_QCOM) += qcom-msm8660-surf.dtb \ | 294 | dtb-$(CONFIG_ARCH_QCOM) += qcom-msm8660-surf.dtb \ |
295 | qcom-msm8960-cdp.dtb \ | 295 | qcom-msm8960-cdp.dtb \ |
296 | qcom-apq8074-dragonboard.dtb | 296 | qcom-apq8074-dragonboard.dtb |
297 | dtb-$(CONFIG_ARCH_U8500) += ste-snowball.dtb \ | ||
298 | ste-hrefprev60-stuib.dtb \ | ||
299 | ste-hrefprev60-tvk.dtb \ | ||
300 | ste-hrefv60plus-stuib.dtb \ | ||
301 | ste-hrefv60plus-tvk.dtb \ | ||
302 | ste-ccu8540.dtb \ | ||
303 | ste-ccu9540.dtb | ||
304 | dtb-$(CONFIG_ARCH_S3C24XX) += s3c2416-smdk2416.dtb | 297 | dtb-$(CONFIG_ARCH_S3C24XX) += s3c2416-smdk2416.dtb |
305 | dtb-$(CONFIG_ARCH_S3C64XX) += s3c6410-mini6410.dtb \ | 298 | dtb-$(CONFIG_ARCH_S3C64XX) += s3c6410-mini6410.dtb \ |
306 | s3c6410-smdk6410.dtb | 299 | s3c6410-smdk6410.dtb |
@@ -369,9 +362,16 @@ dtb-$(CONFIG_ARCH_TEGRA) += tegra20-harmony.dtb \ | |||
369 | tegra30-cardhu-a04.dtb \ | 362 | tegra30-cardhu-a04.dtb \ |
370 | tegra114-dalmore.dtb \ | 363 | tegra114-dalmore.dtb \ |
371 | tegra124-venice2.dtb | 364 | tegra124-venice2.dtb |
365 | dtb-$(CONFIG_ARCH_U300) += ste-u300.dtb | ||
366 | dtb-$(CONFIG_ARCH_U8500) += ste-snowball.dtb \ | ||
367 | ste-hrefprev60-stuib.dtb \ | ||
368 | ste-hrefprev60-tvk.dtb \ | ||
369 | ste-hrefv60plus-stuib.dtb \ | ||
370 | ste-hrefv60plus-tvk.dtb \ | ||
371 | ste-ccu8540.dtb \ | ||
372 | ste-ccu9540.dtb | ||
372 | dtb-$(CONFIG_ARCH_VERSATILE) += versatile-ab.dtb \ | 373 | dtb-$(CONFIG_ARCH_VERSATILE) += versatile-ab.dtb \ |
373 | versatile-pb.dtb | 374 | versatile-pb.dtb |
374 | dtb-$(CONFIG_ARCH_U300) += ste-u300.dtb | ||
375 | dtb-$(CONFIG_ARCH_VEXPRESS) += vexpress-v2p-ca5s.dtb \ | 375 | dtb-$(CONFIG_ARCH_VEXPRESS) += vexpress-v2p-ca5s.dtb \ |
376 | vexpress-v2p-ca9.dtb \ | 376 | vexpress-v2p-ca9.dtb \ |
377 | vexpress-v2p-ca15-tc1.dtb \ | 377 | vexpress-v2p-ca15-tc1.dtb \ |
diff --git a/arch/arm/boot/dts/am335x-bone-common.dtsi b/arch/arm/boot/dts/am335x-bone-common.dtsi index e3f27ec31718..2e7d932887b5 100644 --- a/arch/arm/boot/dts/am335x-bone-common.dtsi +++ b/arch/arm/boot/dts/am335x-bone-common.dtsi | |||
@@ -183,7 +183,7 @@ | |||
183 | &usb { | 183 | &usb { |
184 | status = "okay"; | 184 | status = "okay"; |
185 | 185 | ||
186 | control@44e10000 { | 186 | control@44e10620 { |
187 | status = "okay"; | 187 | status = "okay"; |
188 | }; | 188 | }; |
189 | 189 | ||
@@ -204,7 +204,7 @@ | |||
204 | dr_mode = "host"; | 204 | dr_mode = "host"; |
205 | }; | 205 | }; |
206 | 206 | ||
207 | dma-controller@07402000 { | 207 | dma-controller@47402000 { |
208 | status = "okay"; | 208 | status = "okay"; |
209 | }; | 209 | }; |
210 | }; | 210 | }; |
diff --git a/arch/arm/boot/dts/am335x-evm.dts b/arch/arm/boot/dts/am335x-evm.dts index 28ae040e7c3d..6028217ace0f 100644 --- a/arch/arm/boot/dts/am335x-evm.dts +++ b/arch/arm/boot/dts/am335x-evm.dts | |||
@@ -301,8 +301,8 @@ | |||
301 | 301 | ||
302 | am335x_evm_audio_pins: am335x_evm_audio_pins { | 302 | am335x_evm_audio_pins: am335x_evm_audio_pins { |
303 | pinctrl-single,pins = < | 303 | pinctrl-single,pins = < |
304 | 0x10c (PIN_INPUT_PULLDOWN | MUX_MODE4) /* mii1_rx_dv.mcasp1_aclkx */ | 304 | 0x10c (PIN_INPUT_PULLDOWN | MUX_MODE4) /* mii1_crs.mcasp1_aclkx */ |
305 | 0x110 (PIN_INPUT_PULLDOWN | MUX_MODE4) /* mii1_txd3.mcasp1_fsx */ | 305 | 0x110 (PIN_INPUT_PULLDOWN | MUX_MODE4) /* mii1_rxerr.mcasp1_fsx */ |
306 | 0x108 (PIN_OUTPUT_PULLDOWN | MUX_MODE4) /* mii1_col.mcasp1_axr2 */ | 306 | 0x108 (PIN_OUTPUT_PULLDOWN | MUX_MODE4) /* mii1_col.mcasp1_axr2 */ |
307 | 0x144 (PIN_INPUT_PULLDOWN | MUX_MODE4) /* rmii1_ref_clk.mcasp1_axr3 */ | 307 | 0x144 (PIN_INPUT_PULLDOWN | MUX_MODE4) /* rmii1_ref_clk.mcasp1_axr3 */ |
308 | >; | 308 | >; |
@@ -331,7 +331,7 @@ | |||
331 | &usb { | 331 | &usb { |
332 | status = "okay"; | 332 | status = "okay"; |
333 | 333 | ||
334 | control@44e10000 { | 334 | control@44e10620 { |
335 | status = "okay"; | 335 | status = "okay"; |
336 | }; | 336 | }; |
337 | 337 | ||
@@ -352,7 +352,7 @@ | |||
352 | dr_mode = "host"; | 352 | dr_mode = "host"; |
353 | }; | 353 | }; |
354 | 354 | ||
355 | dma-controller@07402000 { | 355 | dma-controller@47402000 { |
356 | status = "okay"; | 356 | status = "okay"; |
357 | }; | 357 | }; |
358 | }; | 358 | }; |
diff --git a/arch/arm/boot/dts/am335x-evmsk.dts b/arch/arm/boot/dts/am335x-evmsk.dts index ec08f6f677c3..ab238850a7b2 100644 --- a/arch/arm/boot/dts/am335x-evmsk.dts +++ b/arch/arm/boot/dts/am335x-evmsk.dts | |||
@@ -364,7 +364,7 @@ | |||
364 | &usb { | 364 | &usb { |
365 | status = "okay"; | 365 | status = "okay"; |
366 | 366 | ||
367 | control@44e10000 { | 367 | control@44e10620 { |
368 | status = "okay"; | 368 | status = "okay"; |
369 | }; | 369 | }; |
370 | 370 | ||
@@ -385,7 +385,7 @@ | |||
385 | dr_mode = "host"; | 385 | dr_mode = "host"; |
386 | }; | 386 | }; |
387 | 387 | ||
388 | dma-controller@07402000 { | 388 | dma-controller@47402000 { |
389 | status = "okay"; | 389 | status = "okay"; |
390 | }; | 390 | }; |
391 | }; | 391 | }; |
diff --git a/arch/arm/boot/dts/am335x-igep0033.dtsi b/arch/arm/boot/dts/am335x-igep0033.dtsi index 7063311a58d9..9f22c189f636 100644 --- a/arch/arm/boot/dts/am335x-igep0033.dtsi +++ b/arch/arm/boot/dts/am335x-igep0033.dtsi | |||
@@ -118,7 +118,6 @@ | |||
118 | reg = <0 0 0>; /* CS0, offset 0 */ | 118 | reg = <0 0 0>; /* CS0, offset 0 */ |
119 | nand-bus-width = <8>; | 119 | nand-bus-width = <8>; |
120 | ti,nand-ecc-opt = "bch8"; | 120 | ti,nand-ecc-opt = "bch8"; |
121 | gpmc,device-nand = "true"; | ||
122 | gpmc,device-width = <1>; | 121 | gpmc,device-width = <1>; |
123 | gpmc,sync-clk-ps = <0>; | 122 | gpmc,sync-clk-ps = <0>; |
124 | gpmc,cs-on-ns = <0>; | 123 | gpmc,cs-on-ns = <0>; |
@@ -202,7 +201,7 @@ | |||
202 | &usb { | 201 | &usb { |
203 | status = "okay"; | 202 | status = "okay"; |
204 | 203 | ||
205 | control@44e10000 { | 204 | control@44e10620 { |
206 | status = "okay"; | 205 | status = "okay"; |
207 | }; | 206 | }; |
208 | 207 | ||
@@ -223,7 +222,7 @@ | |||
223 | dr_mode = "host"; | 222 | dr_mode = "host"; |
224 | }; | 223 | }; |
225 | 224 | ||
226 | dma-controller@07402000 { | 225 | dma-controller@47402000 { |
227 | status = "okay"; | 226 | status = "okay"; |
228 | }; | 227 | }; |
229 | }; | 228 | }; |
diff --git a/arch/arm/boot/dts/am33xx.dtsi b/arch/arm/boot/dts/am33xx.dtsi index 9770e35f2536..cb6811e5ae5a 100644 --- a/arch/arm/boot/dts/am33xx.dtsi +++ b/arch/arm/boot/dts/am33xx.dtsi | |||
@@ -72,7 +72,7 @@ | |||
72 | }; | 72 | }; |
73 | 73 | ||
74 | /* | 74 | /* |
75 | * The soc node represents the soc top level view. It is uses for IPs | 75 | * The soc node represents the soc top level view. It is used for IPs |
76 | * that are not memory mapped in the MPU view or for the MPU itself. | 76 | * that are not memory mapped in the MPU view or for the MPU itself. |
77 | */ | 77 | */ |
78 | soc { | 78 | soc { |
@@ -94,8 +94,8 @@ | |||
94 | 94 | ||
95 | /* | 95 | /* |
96 | * XXX: Use a flat representation of the AM33XX interconnect. | 96 | * XXX: Use a flat representation of the AM33XX interconnect. |
97 | * The real AM33XX interconnect network is quite complex.Since | 97 | * The real AM33XX interconnect network is quite complex. Since |
98 | * that will not bring real advantage to represent that in DT | 98 | * it will not bring real advantage to represent that in DT |
99 | * for the moment, just use a fake OCP bus entry to represent | 99 | * for the moment, just use a fake OCP bus entry to represent |
100 | * the whole bus hierarchy. | 100 | * the whole bus hierarchy. |
101 | */ | 101 | */ |
@@ -802,7 +802,7 @@ | |||
802 | <0x46000000 0x400000>; | 802 | <0x46000000 0x400000>; |
803 | reg-names = "mpu", "dat"; | 803 | reg-names = "mpu", "dat"; |
804 | interrupts = <80>, <81>; | 804 | interrupts = <80>, <81>; |
805 | interrupts-names = "tx", "rx"; | 805 | interrupt-names = "tx", "rx"; |
806 | status = "disabled"; | 806 | status = "disabled"; |
807 | dmas = <&edma 8>, | 807 | dmas = <&edma 8>, |
808 | <&edma 9>; | 808 | <&edma 9>; |
@@ -816,7 +816,7 @@ | |||
816 | <0x46400000 0x400000>; | 816 | <0x46400000 0x400000>; |
817 | reg-names = "mpu", "dat"; | 817 | reg-names = "mpu", "dat"; |
818 | interrupts = <82>, <83>; | 818 | interrupts = <82>, <83>; |
819 | interrupts-names = "tx", "rx"; | 819 | interrupt-names = "tx", "rx"; |
820 | status = "disabled"; | 820 | status = "disabled"; |
821 | dmas = <&edma 10>, | 821 | dmas = <&edma 10>, |
822 | <&edma 11>; | 822 | <&edma 11>; |
diff --git a/arch/arm/boot/dts/am4372.dtsi b/arch/arm/boot/dts/am4372.dtsi index 36d523a26831..d1f8707ff1df 100644 --- a/arch/arm/boot/dts/am4372.dtsi +++ b/arch/arm/boot/dts/am4372.dtsi | |||
@@ -691,7 +691,7 @@ | |||
691 | <0x46000000 0x400000>; | 691 | <0x46000000 0x400000>; |
692 | reg-names = "mpu", "dat"; | 692 | reg-names = "mpu", "dat"; |
693 | interrupts = <80>, <81>; | 693 | interrupts = <80>, <81>; |
694 | interrupts-names = "tx", "rx"; | 694 | interrupt-names = "tx", "rx"; |
695 | status = "disabled"; | 695 | status = "disabled"; |
696 | dmas = <&edma 8>, | 696 | dmas = <&edma 8>, |
697 | <&edma 9>; | 697 | <&edma 9>; |
@@ -705,7 +705,7 @@ | |||
705 | <0x46400000 0x400000>; | 705 | <0x46400000 0x400000>; |
706 | reg-names = "mpu", "dat"; | 706 | reg-names = "mpu", "dat"; |
707 | interrupts = <82>, <83>; | 707 | interrupts = <82>, <83>; |
708 | interrupts-names = "tx", "rx"; | 708 | interrupt-names = "tx", "rx"; |
709 | status = "disabled"; | 709 | status = "disabled"; |
710 | dmas = <&edma 10>, | 710 | dmas = <&edma 10>, |
711 | <&edma 11>; | 711 | <&edma 11>; |
diff --git a/arch/arm/boot/dts/armada-370-xp.dtsi b/arch/arm/boot/dts/armada-370-xp.dtsi index bbb40f62037d..bb77970c0b12 100644 --- a/arch/arm/boot/dts/armada-370-xp.dtsi +++ b/arch/arm/boot/dts/armada-370-xp.dtsi | |||
@@ -230,6 +230,7 @@ | |||
230 | #size-cells = <0>; | 230 | #size-cells = <0>; |
231 | compatible = "marvell,orion-mdio"; | 231 | compatible = "marvell,orion-mdio"; |
232 | reg = <0x72004 0x4>; | 232 | reg = <0x72004 0x4>; |
233 | clocks = <&gateclk 4>; | ||
233 | }; | 234 | }; |
234 | 235 | ||
235 | eth1: ethernet@74000 { | 236 | eth1: ethernet@74000 { |
diff --git a/arch/arm/boot/dts/armada-38x.dtsi b/arch/arm/boot/dts/armada-38x.dtsi index a064f59da02d..ca8813bb99ba 100644 --- a/arch/arm/boot/dts/armada-38x.dtsi +++ b/arch/arm/boot/dts/armada-38x.dtsi | |||
@@ -336,6 +336,7 @@ | |||
336 | #size-cells = <0>; | 336 | #size-cells = <0>; |
337 | compatible = "marvell,orion-mdio"; | 337 | compatible = "marvell,orion-mdio"; |
338 | reg = <0x72004 0x4>; | 338 | reg = <0x72004 0x4>; |
339 | clocks = <&gateclk 4>; | ||
339 | }; | 340 | }; |
340 | 341 | ||
341 | coredivclk: clock@e4250 { | 342 | coredivclk: clock@e4250 { |
diff --git a/arch/arm/boot/dts/dra7.dtsi b/arch/arm/boot/dts/dra7.dtsi index 1c0f8e1893ae..149b55099935 100644 --- a/arch/arm/boot/dts/dra7.dtsi +++ b/arch/arm/boot/dts/dra7.dtsi | |||
@@ -80,7 +80,7 @@ | |||
80 | }; | 80 | }; |
81 | 81 | ||
82 | /* | 82 | /* |
83 | * The soc node represents the soc top level view. It is uses for IPs | 83 | * The soc node represents the soc top level view. It is used for IPs |
84 | * that are not memory mapped in the MPU view or for the MPU itself. | 84 | * that are not memory mapped in the MPU view or for the MPU itself. |
85 | */ | 85 | */ |
86 | soc { | 86 | soc { |
@@ -94,7 +94,7 @@ | |||
94 | /* | 94 | /* |
95 | * XXX: Use a flat representation of the SOC interconnect. | 95 | * XXX: Use a flat representation of the SOC interconnect. |
96 | * The real OMAP interconnect network is quite complex. | 96 | * The real OMAP interconnect network is quite complex. |
97 | * Since that will not bring real advantage to represent that in DT for | 97 | * Since it will not bring real advantage to represent that in DT for |
98 | * the moment, just use a fake OCP bus entry to represent the whole bus | 98 | * the moment, just use a fake OCP bus entry to represent the whole bus |
99 | * hierarchy. | 99 | * hierarchy. |
100 | */ | 100 | */ |
diff --git a/arch/arm/boot/dts/dra7xx-clocks.dtsi b/arch/arm/boot/dts/dra7xx-clocks.dtsi index e96da9a898ad..cfb8fc753f50 100644 --- a/arch/arm/boot/dts/dra7xx-clocks.dtsi +++ b/arch/arm/boot/dts/dra7xx-clocks.dtsi | |||
@@ -1640,7 +1640,7 @@ | |||
1640 | #clock-cells = <0>; | 1640 | #clock-cells = <0>; |
1641 | compatible = "ti,mux-clock"; | 1641 | compatible = "ti,mux-clock"; |
1642 | clocks = <&abe_24m_fclk>, <&abe_sys_clk_div>, <&func_24m_clk>, <&atlclkin3_ck>, <&atl_clkin2_ck>, <&atl_clkin1_ck>, <&atl_clkin0_ck>, <&sys_clkin2>, <&ref_clkin0_ck>, <&ref_clkin1_ck>, <&ref_clkin2_ck>, <&ref_clkin3_ck>, <&mlb_clk>, <&mlbp_clk>; | 1642 | clocks = <&abe_24m_fclk>, <&abe_sys_clk_div>, <&func_24m_clk>, <&atlclkin3_ck>, <&atl_clkin2_ck>, <&atl_clkin1_ck>, <&atl_clkin0_ck>, <&sys_clkin2>, <&ref_clkin0_ck>, <&ref_clkin1_ck>, <&ref_clkin2_ck>, <&ref_clkin3_ck>, <&mlb_clk>, <&mlbp_clk>; |
1643 | ti,bit-shift = <28>; | 1643 | ti,bit-shift = <24>; |
1644 | reg = <0x1860>; | 1644 | reg = <0x1860>; |
1645 | }; | 1645 | }; |
1646 | 1646 | ||
diff --git a/arch/arm/boot/dts/imx25.dtsi b/arch/arm/boot/dts/imx25.dtsi index 32f760e24898..ea323f09dc78 100644 --- a/arch/arm/boot/dts/imx25.dtsi +++ b/arch/arm/boot/dts/imx25.dtsi | |||
@@ -56,6 +56,7 @@ | |||
56 | 56 | ||
57 | osc { | 57 | osc { |
58 | compatible = "fsl,imx-osc", "fixed-clock"; | 58 | compatible = "fsl,imx-osc", "fixed-clock"; |
59 | #clock-cells = <0>; | ||
59 | clock-frequency = <24000000>; | 60 | clock-frequency = <24000000>; |
60 | }; | 61 | }; |
61 | }; | 62 | }; |
diff --git a/arch/arm/boot/dts/imx27-apf27.dts b/arch/arm/boot/dts/imx27-apf27.dts index 09f57b39e3ef..73aae4f5e539 100644 --- a/arch/arm/boot/dts/imx27-apf27.dts +++ b/arch/arm/boot/dts/imx27-apf27.dts | |||
@@ -29,6 +29,7 @@ | |||
29 | 29 | ||
30 | osc26m { | 30 | osc26m { |
31 | compatible = "fsl,imx-osc26m", "fixed-clock"; | 31 | compatible = "fsl,imx-osc26m", "fixed-clock"; |
32 | #clock-cells = <0>; | ||
32 | clock-frequency = <0>; | 33 | clock-frequency = <0>; |
33 | }; | 34 | }; |
34 | }; | 35 | }; |
diff --git a/arch/arm/boot/dts/imx27.dtsi b/arch/arm/boot/dts/imx27.dtsi index 6279e0b4f768..137e010eab35 100644 --- a/arch/arm/boot/dts/imx27.dtsi +++ b/arch/arm/boot/dts/imx27.dtsi | |||
@@ -48,6 +48,7 @@ | |||
48 | 48 | ||
49 | osc26m { | 49 | osc26m { |
50 | compatible = "fsl,imx-osc26m", "fixed-clock"; | 50 | compatible = "fsl,imx-osc26m", "fixed-clock"; |
51 | #clock-cells = <0>; | ||
51 | clock-frequency = <26000000>; | 52 | clock-frequency = <26000000>; |
52 | }; | 53 | }; |
53 | }; | 54 | }; |
diff --git a/arch/arm/boot/dts/imx50.dtsi b/arch/arm/boot/dts/imx50.dtsi index 0c75fe3deb35..9c89d1ca97c2 100644 --- a/arch/arm/boot/dts/imx50.dtsi +++ b/arch/arm/boot/dts/imx50.dtsi | |||
@@ -53,21 +53,25 @@ | |||
53 | 53 | ||
54 | ckil { | 54 | ckil { |
55 | compatible = "fsl,imx-ckil", "fixed-clock"; | 55 | compatible = "fsl,imx-ckil", "fixed-clock"; |
56 | #clock-cells = <0>; | ||
56 | clock-frequency = <32768>; | 57 | clock-frequency = <32768>; |
57 | }; | 58 | }; |
58 | 59 | ||
59 | ckih1 { | 60 | ckih1 { |
60 | compatible = "fsl,imx-ckih1", "fixed-clock"; | 61 | compatible = "fsl,imx-ckih1", "fixed-clock"; |
62 | #clock-cells = <0>; | ||
61 | clock-frequency = <22579200>; | 63 | clock-frequency = <22579200>; |
62 | }; | 64 | }; |
63 | 65 | ||
64 | ckih2 { | 66 | ckih2 { |
65 | compatible = "fsl,imx-ckih2", "fixed-clock"; | 67 | compatible = "fsl,imx-ckih2", "fixed-clock"; |
68 | #clock-cells = <0>; | ||
66 | clock-frequency = <0>; | 69 | clock-frequency = <0>; |
67 | }; | 70 | }; |
68 | 71 | ||
69 | osc { | 72 | osc { |
70 | compatible = "fsl,imx-osc", "fixed-clock"; | 73 | compatible = "fsl,imx-osc", "fixed-clock"; |
74 | #clock-cells = <0>; | ||
71 | clock-frequency = <24000000>; | 75 | clock-frequency = <24000000>; |
72 | }; | 76 | }; |
73 | }; | 77 | }; |
diff --git a/arch/arm/boot/dts/imx51.dtsi b/arch/arm/boot/dts/imx51.dtsi index 5f8216d08f6b..150bb4e2f744 100644 --- a/arch/arm/boot/dts/imx51.dtsi +++ b/arch/arm/boot/dts/imx51.dtsi | |||
@@ -50,21 +50,25 @@ | |||
50 | 50 | ||
51 | ckil { | 51 | ckil { |
52 | compatible = "fsl,imx-ckil", "fixed-clock"; | 52 | compatible = "fsl,imx-ckil", "fixed-clock"; |
53 | #clock-cells = <0>; | ||
53 | clock-frequency = <32768>; | 54 | clock-frequency = <32768>; |
54 | }; | 55 | }; |
55 | 56 | ||
56 | ckih1 { | 57 | ckih1 { |
57 | compatible = "fsl,imx-ckih1", "fixed-clock"; | 58 | compatible = "fsl,imx-ckih1", "fixed-clock"; |
59 | #clock-cells = <0>; | ||
58 | clock-frequency = <0>; | 60 | clock-frequency = <0>; |
59 | }; | 61 | }; |
60 | 62 | ||
61 | ckih2 { | 63 | ckih2 { |
62 | compatible = "fsl,imx-ckih2", "fixed-clock"; | 64 | compatible = "fsl,imx-ckih2", "fixed-clock"; |
65 | #clock-cells = <0>; | ||
63 | clock-frequency = <0>; | 66 | clock-frequency = <0>; |
64 | }; | 67 | }; |
65 | 68 | ||
66 | osc { | 69 | osc { |
67 | compatible = "fsl,imx-osc", "fixed-clock"; | 70 | compatible = "fsl,imx-osc", "fixed-clock"; |
71 | #clock-cells = <0>; | ||
68 | clock-frequency = <24000000>; | 72 | clock-frequency = <24000000>; |
69 | }; | 73 | }; |
70 | }; | 74 | }; |
diff --git a/arch/arm/boot/dts/imx53-m53evk.dts b/arch/arm/boot/dts/imx53-m53evk.dts index f6d3ac3e5587..d5d146a8b149 100644 --- a/arch/arm/boot/dts/imx53-m53evk.dts +++ b/arch/arm/boot/dts/imx53-m53evk.dts | |||
@@ -17,7 +17,8 @@ | |||
17 | compatible = "denx,imx53-m53evk", "fsl,imx53"; | 17 | compatible = "denx,imx53-m53evk", "fsl,imx53"; |
18 | 18 | ||
19 | memory { | 19 | memory { |
20 | reg = <0x70000000 0x20000000>; | 20 | reg = <0x70000000 0x20000000>, |
21 | <0xb0000000 0x20000000>; | ||
21 | }; | 22 | }; |
22 | 23 | ||
23 | soc { | 24 | soc { |
@@ -193,17 +194,17 @@ | |||
193 | irq-trigger = <0x1>; | 194 | irq-trigger = <0x1>; |
194 | 195 | ||
195 | stmpe_touchscreen { | 196 | stmpe_touchscreen { |
196 | compatible = "stmpe,ts"; | 197 | compatible = "st,stmpe-ts"; |
197 | reg = <0>; | 198 | reg = <0>; |
198 | ts,sample-time = <4>; | 199 | st,sample-time = <4>; |
199 | ts,mod-12b = <1>; | 200 | st,mod-12b = <1>; |
200 | ts,ref-sel = <0>; | 201 | st,ref-sel = <0>; |
201 | ts,adc-freq = <1>; | 202 | st,adc-freq = <1>; |
202 | ts,ave-ctrl = <3>; | 203 | st,ave-ctrl = <3>; |
203 | ts,touch-det-delay = <3>; | 204 | st,touch-det-delay = <3>; |
204 | ts,settling = <4>; | 205 | st,settling = <4>; |
205 | ts,fraction-z = <7>; | 206 | st,fraction-z = <7>; |
206 | ts,i-drive = <1>; | 207 | st,i-drive = <1>; |
207 | }; | 208 | }; |
208 | }; | 209 | }; |
209 | 210 | ||
diff --git a/arch/arm/boot/dts/imx53-qsb-common.dtsi b/arch/arm/boot/dts/imx53-qsb-common.dtsi index 3f825a6813da..ede04fa4161f 100644 --- a/arch/arm/boot/dts/imx53-qsb-common.dtsi +++ b/arch/arm/boot/dts/imx53-qsb-common.dtsi | |||
@@ -14,7 +14,8 @@ | |||
14 | 14 | ||
15 | / { | 15 | / { |
16 | memory { | 16 | memory { |
17 | reg = <0x70000000 0x40000000>; | 17 | reg = <0x70000000 0x20000000>, |
18 | <0xb0000000 0x20000000>; | ||
18 | }; | 19 | }; |
19 | 20 | ||
20 | display0: display@di0 { | 21 | display0: display@di0 { |
diff --git a/arch/arm/boot/dts/imx53-tx53-x03x.dts b/arch/arm/boot/dts/imx53-tx53-x03x.dts index 0217dde3b36b..3b73e81dc3f0 100644 --- a/arch/arm/boot/dts/imx53-tx53-x03x.dts +++ b/arch/arm/boot/dts/imx53-tx53-x03x.dts | |||
@@ -25,12 +25,17 @@ | |||
25 | soc { | 25 | soc { |
26 | display: display@di0 { | 26 | display: display@di0 { |
27 | compatible = "fsl,imx-parallel-display"; | 27 | compatible = "fsl,imx-parallel-display"; |
28 | crtcs = <&ipu 0>; | ||
29 | interface-pix-fmt = "rgb24"; | 28 | interface-pix-fmt = "rgb24"; |
30 | pinctrl-names = "default"; | 29 | pinctrl-names = "default"; |
31 | pinctrl-0 = <&pinctrl_rgb24_vga1>; | 30 | pinctrl-0 = <&pinctrl_rgb24_vga1>; |
32 | status = "okay"; | 31 | status = "okay"; |
33 | 32 | ||
33 | port { | ||
34 | display0_in: endpoint { | ||
35 | remote-endpoint = <&ipu_di0_disp0>; | ||
36 | }; | ||
37 | }; | ||
38 | |||
34 | display-timings { | 39 | display-timings { |
35 | VGA { | 40 | VGA { |
36 | clock-frequency = <25200000>; | 41 | clock-frequency = <25200000>; |
@@ -293,6 +298,10 @@ | |||
293 | }; | 298 | }; |
294 | }; | 299 | }; |
295 | 300 | ||
301 | &ipu_di0_disp0 { | ||
302 | remote-endpoint = <&display0_in>; | ||
303 | }; | ||
304 | |||
296 | &kpp { | 305 | &kpp { |
297 | pinctrl-names = "default"; | 306 | pinctrl-names = "default"; |
298 | pinctrl-0 = <&pinctrl_kpp>; | 307 | pinctrl-0 = <&pinctrl_kpp>; |
diff --git a/arch/arm/boot/dts/imx53.dtsi b/arch/arm/boot/dts/imx53.dtsi index b57ab57740f6..9c2bff2252d0 100644 --- a/arch/arm/boot/dts/imx53.dtsi +++ b/arch/arm/boot/dts/imx53.dtsi | |||
@@ -70,21 +70,25 @@ | |||
70 | 70 | ||
71 | ckil { | 71 | ckil { |
72 | compatible = "fsl,imx-ckil", "fixed-clock"; | 72 | compatible = "fsl,imx-ckil", "fixed-clock"; |
73 | #clock-cells = <0>; | ||
73 | clock-frequency = <32768>; | 74 | clock-frequency = <32768>; |
74 | }; | 75 | }; |
75 | 76 | ||
76 | ckih1 { | 77 | ckih1 { |
77 | compatible = "fsl,imx-ckih1", "fixed-clock"; | 78 | compatible = "fsl,imx-ckih1", "fixed-clock"; |
79 | #clock-cells = <0>; | ||
78 | clock-frequency = <22579200>; | 80 | clock-frequency = <22579200>; |
79 | }; | 81 | }; |
80 | 82 | ||
81 | ckih2 { | 83 | ckih2 { |
82 | compatible = "fsl,imx-ckih2", "fixed-clock"; | 84 | compatible = "fsl,imx-ckih2", "fixed-clock"; |
85 | #clock-cells = <0>; | ||
83 | clock-frequency = <0>; | 86 | clock-frequency = <0>; |
84 | }; | 87 | }; |
85 | 88 | ||
86 | osc { | 89 | osc { |
87 | compatible = "fsl,imx-osc", "fixed-clock"; | 90 | compatible = "fsl,imx-osc", "fixed-clock"; |
91 | #clock-cells = <0>; | ||
88 | clock-frequency = <24000000>; | 92 | clock-frequency = <24000000>; |
89 | }; | 93 | }; |
90 | }; | 94 | }; |
@@ -430,7 +434,7 @@ | |||
430 | 434 | ||
431 | port { | 435 | port { |
432 | lvds1_in: endpoint { | 436 | lvds1_in: endpoint { |
433 | remote-endpoint = <&ipu_di0_lvds0>; | 437 | remote-endpoint = <&ipu_di1_lvds1>; |
434 | }; | 438 | }; |
435 | }; | 439 | }; |
436 | }; | 440 | }; |
diff --git a/arch/arm/boot/dts/imx6q-dmo-edmqmx6.dts b/arch/arm/boot/dts/imx6q-dmo-edmqmx6.dts index a63bbb3d46bb..e4ae38fd0269 100644 --- a/arch/arm/boot/dts/imx6q-dmo-edmqmx6.dts +++ b/arch/arm/boot/dts/imx6q-dmo-edmqmx6.dts | |||
@@ -19,7 +19,10 @@ | |||
19 | compatible = "dmo,imx6q-edmqmx6", "fsl,imx6q"; | 19 | compatible = "dmo,imx6q-edmqmx6", "fsl,imx6q"; |
20 | 20 | ||
21 | aliases { | 21 | aliases { |
22 | gpio7 = &stmpe_gpio; | 22 | gpio7 = &stmpe_gpio1; |
23 | gpio8 = &stmpe_gpio2; | ||
24 | stmpe-i2c0 = &stmpe1; | ||
25 | stmpe-i2c1 = &stmpe2; | ||
23 | }; | 26 | }; |
24 | 27 | ||
25 | memory { | 28 | memory { |
@@ -40,13 +43,15 @@ | |||
40 | regulator-always-on; | 43 | regulator-always-on; |
41 | }; | 44 | }; |
42 | 45 | ||
43 | reg_usb_otg_vbus: regulator@1 { | 46 | reg_usb_otg_switch: regulator@1 { |
44 | compatible = "regulator-fixed"; | 47 | compatible = "regulator-fixed"; |
45 | reg = <1>; | 48 | reg = <1>; |
46 | regulator-name = "usb_otg_vbus"; | 49 | regulator-name = "usb_otg_switch"; |
47 | regulator-min-microvolt = <5000000>; | 50 | regulator-min-microvolt = <5000000>; |
48 | regulator-max-microvolt = <5000000>; | 51 | regulator-max-microvolt = <5000000>; |
49 | gpio = <&gpio7 12 0>; | 52 | gpio = <&gpio7 12 0>; |
53 | regulator-boot-on; | ||
54 | regulator-always-on; | ||
50 | }; | 55 | }; |
51 | 56 | ||
52 | reg_usb_host1: regulator@2 { | 57 | reg_usb_host1: regulator@2 { |
@@ -65,23 +70,23 @@ | |||
65 | 70 | ||
66 | led-blue { | 71 | led-blue { |
67 | label = "blue"; | 72 | label = "blue"; |
68 | gpios = <&stmpe_gpio 8 GPIO_ACTIVE_HIGH>; | 73 | gpios = <&stmpe_gpio1 8 GPIO_ACTIVE_HIGH>; |
69 | linux,default-trigger = "heartbeat"; | 74 | linux,default-trigger = "heartbeat"; |
70 | }; | 75 | }; |
71 | 76 | ||
72 | led-green { | 77 | led-green { |
73 | label = "green"; | 78 | label = "green"; |
74 | gpios = <&stmpe_gpio 9 GPIO_ACTIVE_HIGH>; | 79 | gpios = <&stmpe_gpio1 9 GPIO_ACTIVE_HIGH>; |
75 | }; | 80 | }; |
76 | 81 | ||
77 | led-pink { | 82 | led-pink { |
78 | label = "pink"; | 83 | label = "pink"; |
79 | gpios = <&stmpe_gpio 10 GPIO_ACTIVE_HIGH>; | 84 | gpios = <&stmpe_gpio1 10 GPIO_ACTIVE_HIGH>; |
80 | }; | 85 | }; |
81 | 86 | ||
82 | led-red { | 87 | led-red { |
83 | label = "red"; | 88 | label = "red"; |
84 | gpios = <&stmpe_gpio 11 GPIO_ACTIVE_HIGH>; | 89 | gpios = <&stmpe_gpio1 11 GPIO_ACTIVE_HIGH>; |
85 | }; | 90 | }; |
86 | }; | 91 | }; |
87 | }; | 92 | }; |
@@ -99,7 +104,8 @@ | |||
99 | clock-frequency = <100000>; | 104 | clock-frequency = <100000>; |
100 | pinctrl-names = "default"; | 105 | pinctrl-names = "default"; |
101 | pinctrl-0 = <&pinctrl_i2c2 | 106 | pinctrl-0 = <&pinctrl_i2c2 |
102 | &pinctrl_stmpe>; | 107 | &pinctrl_stmpe1 |
108 | &pinctrl_stmpe2>; | ||
103 | status = "okay"; | 109 | status = "okay"; |
104 | 110 | ||
105 | pmic: pfuze100@08 { | 111 | pmic: pfuze100@08 { |
@@ -205,13 +211,25 @@ | |||
205 | }; | 211 | }; |
206 | }; | 212 | }; |
207 | 213 | ||
208 | stmpe: stmpe1601@40 { | 214 | stmpe1: stmpe1601@40 { |
209 | compatible = "st,stmpe1601"; | 215 | compatible = "st,stmpe1601"; |
210 | reg = <0x40>; | 216 | reg = <0x40>; |
211 | interrupts = <30 0>; | 217 | interrupts = <30 0>; |
212 | interrupt-parent = <&gpio3>; | 218 | interrupt-parent = <&gpio3>; |
213 | 219 | ||
214 | stmpe_gpio: stmpe_gpio { | 220 | stmpe_gpio1: stmpe_gpio { |
221 | #gpio-cells = <2>; | ||
222 | compatible = "st,stmpe-gpio"; | ||
223 | }; | ||
224 | }; | ||
225 | |||
226 | stmpe2: stmpe1601@44 { | ||
227 | compatible = "st,stmpe1601"; | ||
228 | reg = <0x44>; | ||
229 | interrupts = <2 0>; | ||
230 | interrupt-parent = <&gpio5>; | ||
231 | |||
232 | stmpe_gpio2: stmpe_gpio { | ||
215 | #gpio-cells = <2>; | 233 | #gpio-cells = <2>; |
216 | compatible = "st,stmpe-gpio"; | 234 | compatible = "st,stmpe-gpio"; |
217 | }; | 235 | }; |
@@ -273,10 +291,14 @@ | |||
273 | >; | 291 | >; |
274 | }; | 292 | }; |
275 | 293 | ||
276 | pinctrl_stmpe: stmpegrp { | 294 | pinctrl_stmpe1: stmpe1grp { |
277 | fsl,pins = <MX6QDL_PAD_EIM_D30__GPIO3_IO30 0x80000000>; | 295 | fsl,pins = <MX6QDL_PAD_EIM_D30__GPIO3_IO30 0x80000000>; |
278 | }; | 296 | }; |
279 | 297 | ||
298 | pinctrl_stmpe2: stmpe2grp { | ||
299 | fsl,pins = <MX6QDL_PAD_EIM_A25__GPIO5_IO02 0x80000000>; | ||
300 | }; | ||
301 | |||
280 | pinctrl_uart1: uart1grp { | 302 | pinctrl_uart1: uart1grp { |
281 | fsl,pins = < | 303 | fsl,pins = < |
282 | MX6QDL_PAD_SD3_DAT7__UART1_TX_DATA 0x1b0b1 | 304 | MX6QDL_PAD_SD3_DAT7__UART1_TX_DATA 0x1b0b1 |
@@ -293,7 +315,7 @@ | |||
293 | 315 | ||
294 | pinctrl_usbotg: usbotggrp { | 316 | pinctrl_usbotg: usbotggrp { |
295 | fsl,pins = < | 317 | fsl,pins = < |
296 | MX6QDL_PAD_GPIO_1__USB_OTG_ID 0x17059 | 318 | MX6QDL_PAD_ENET_RX_ER__USB_OTG_ID 0x17059 |
297 | >; | 319 | >; |
298 | }; | 320 | }; |
299 | 321 | ||
@@ -344,11 +366,11 @@ | |||
344 | &usbh1 { | 366 | &usbh1 { |
345 | vbus-supply = <®_usb_host1>; | 367 | vbus-supply = <®_usb_host1>; |
346 | disable-over-current; | 368 | disable-over-current; |
369 | dr_mode = "host"; | ||
347 | status = "okay"; | 370 | status = "okay"; |
348 | }; | 371 | }; |
349 | 372 | ||
350 | &usbotg { | 373 | &usbotg { |
351 | vbus-supply = <®_usb_otg_vbus>; | ||
352 | pinctrl-names = "default"; | 374 | pinctrl-names = "default"; |
353 | pinctrl-0 = <&pinctrl_usbotg>; | 375 | pinctrl-0 = <&pinctrl_usbotg>; |
354 | disable-over-current; | 376 | disable-over-current; |
diff --git a/arch/arm/boot/dts/imx6q-gw5400-a.dts b/arch/arm/boot/dts/imx6q-gw5400-a.dts index 902f98310481..e51bb3f0fd56 100644 --- a/arch/arm/boot/dts/imx6q-gw5400-a.dts +++ b/arch/arm/boot/dts/imx6q-gw5400-a.dts | |||
@@ -487,9 +487,6 @@ | |||
487 | 487 | ||
488 | &ldb { | 488 | &ldb { |
489 | status = "okay"; | 489 | status = "okay"; |
490 | lvds-channel@0 { | ||
491 | crtcs = <&ipu1 0>, <&ipu1 1>, <&ipu2 0>, <&ipu2 1>; | ||
492 | }; | ||
493 | }; | 490 | }; |
494 | 491 | ||
495 | &pcie { | 492 | &pcie { |
diff --git a/arch/arm/boot/dts/imx6qdl-gw52xx.dtsi b/arch/arm/boot/dts/imx6qdl-gw52xx.dtsi index 8e99c9a9bc76..035d3a85c318 100644 --- a/arch/arm/boot/dts/imx6qdl-gw52xx.dtsi +++ b/arch/arm/boot/dts/imx6qdl-gw52xx.dtsi | |||
@@ -436,9 +436,6 @@ | |||
436 | 436 | ||
437 | &ldb { | 437 | &ldb { |
438 | status = "okay"; | 438 | status = "okay"; |
439 | lvds-channel@0 { | ||
440 | crtcs = <&ipu1 0>, <&ipu1 1>; | ||
441 | }; | ||
442 | }; | 439 | }; |
443 | 440 | ||
444 | &pcie { | 441 | &pcie { |
diff --git a/arch/arm/boot/dts/imx6qdl-microsom-ar8035.dtsi b/arch/arm/boot/dts/imx6qdl-microsom-ar8035.dtsi index a3cb2fff8f61..d16066608e21 100644 --- a/arch/arm/boot/dts/imx6qdl-microsom-ar8035.dtsi +++ b/arch/arm/boot/dts/imx6qdl-microsom-ar8035.dtsi | |||
@@ -26,25 +26,25 @@ | |||
26 | /* GPIO16 -> AR8035 25MHz */ | 26 | /* GPIO16 -> AR8035 25MHz */ |
27 | MX6QDL_PAD_GPIO_16__ENET_REF_CLK 0xc0000000 | 27 | MX6QDL_PAD_GPIO_16__ENET_REF_CLK 0xc0000000 |
28 | MX6QDL_PAD_RGMII_TXC__RGMII_TXC 0x80000000 | 28 | MX6QDL_PAD_RGMII_TXC__RGMII_TXC 0x80000000 |
29 | MX6QDL_PAD_RGMII_TD0__RGMII_TD0 0x1b0b0 | 29 | MX6QDL_PAD_RGMII_TD0__RGMII_TD0 0x1b030 |
30 | MX6QDL_PAD_RGMII_TD1__RGMII_TD1 0x1b0b0 | 30 | MX6QDL_PAD_RGMII_TD1__RGMII_TD1 0x1b030 |
31 | MX6QDL_PAD_RGMII_TD2__RGMII_TD2 0x1b0b0 | 31 | MX6QDL_PAD_RGMII_TD2__RGMII_TD2 0x1b030 |
32 | MX6QDL_PAD_RGMII_TD3__RGMII_TD3 0x1b0b0 | 32 | MX6QDL_PAD_RGMII_TD3__RGMII_TD3 0x1b030 |
33 | MX6QDL_PAD_RGMII_TX_CTL__RGMII_TX_CTL 0x1b0b0 | 33 | MX6QDL_PAD_RGMII_TX_CTL__RGMII_TX_CTL 0x1b030 |
34 | /* AR8035 CLK_25M --> ENET_REF_CLK (V22) */ | 34 | /* AR8035 CLK_25M --> ENET_REF_CLK (V22) */ |
35 | MX6QDL_PAD_ENET_REF_CLK__ENET_TX_CLK 0x0a0b1 | 35 | MX6QDL_PAD_ENET_REF_CLK__ENET_TX_CLK 0x0a0b1 |
36 | /* AR8035 pin strapping: IO voltage: pull up */ | 36 | /* AR8035 pin strapping: IO voltage: pull up */ |
37 | MX6QDL_PAD_RGMII_RXC__RGMII_RXC 0x1b0b0 | 37 | MX6QDL_PAD_RGMII_RXC__RGMII_RXC 0x1b030 |
38 | /* AR8035 pin strapping: PHYADDR#0: pull down */ | 38 | /* AR8035 pin strapping: PHYADDR#0: pull down */ |
39 | MX6QDL_PAD_RGMII_RD0__RGMII_RD0 0x130b0 | 39 | MX6QDL_PAD_RGMII_RD0__RGMII_RD0 0x13030 |
40 | /* AR8035 pin strapping: PHYADDR#1: pull down */ | 40 | /* AR8035 pin strapping: PHYADDR#1: pull down */ |
41 | MX6QDL_PAD_RGMII_RD1__RGMII_RD1 0x130b0 | 41 | MX6QDL_PAD_RGMII_RD1__RGMII_RD1 0x13030 |
42 | /* AR8035 pin strapping: MODE#1: pull up */ | 42 | /* AR8035 pin strapping: MODE#1: pull up */ |
43 | MX6QDL_PAD_RGMII_RD2__RGMII_RD2 0x1b0b0 | 43 | MX6QDL_PAD_RGMII_RD2__RGMII_RD2 0x1b030 |
44 | /* AR8035 pin strapping: MODE#3: pull up */ | 44 | /* AR8035 pin strapping: MODE#3: pull up */ |
45 | MX6QDL_PAD_RGMII_RD3__RGMII_RD3 0x1b0b0 | 45 | MX6QDL_PAD_RGMII_RD3__RGMII_RD3 0x1b030 |
46 | /* AR8035 pin strapping: MODE#0: pull down */ | 46 | /* AR8035 pin strapping: MODE#0: pull down */ |
47 | MX6QDL_PAD_RGMII_RX_CTL__RGMII_RX_CTL 0x130b0 | 47 | MX6QDL_PAD_RGMII_RX_CTL__RGMII_RX_CTL 0x13030 |
48 | 48 | ||
49 | /* | 49 | /* |
50 | * As the RMII pins are also connected to RGMII | 50 | * As the RMII pins are also connected to RGMII |
diff --git a/arch/arm/boot/dts/imx6qdl.dtsi b/arch/arm/boot/dts/imx6qdl.dtsi index 55cb926fa3f7..eca0971d4db1 100644 --- a/arch/arm/boot/dts/imx6qdl.dtsi +++ b/arch/arm/boot/dts/imx6qdl.dtsi | |||
@@ -10,6 +10,8 @@ | |||
10 | * http://www.gnu.org/copyleft/gpl.html | 10 | * http://www.gnu.org/copyleft/gpl.html |
11 | */ | 11 | */ |
12 | 12 | ||
13 | #include <dt-bindings/interrupt-controller/arm-gic.h> | ||
14 | |||
13 | #include "skeleton.dtsi" | 15 | #include "skeleton.dtsi" |
14 | 16 | ||
15 | / { | 17 | / { |
@@ -46,8 +48,6 @@ | |||
46 | intc: interrupt-controller@00a01000 { | 48 | intc: interrupt-controller@00a01000 { |
47 | compatible = "arm,cortex-a9-gic"; | 49 | compatible = "arm,cortex-a9-gic"; |
48 | #interrupt-cells = <3>; | 50 | #interrupt-cells = <3>; |
49 | #address-cells = <1>; | ||
50 | #size-cells = <1>; | ||
51 | interrupt-controller; | 51 | interrupt-controller; |
52 | reg = <0x00a01000 0x1000>, | 52 | reg = <0x00a01000 0x1000>, |
53 | <0x00a00100 0x100>; | 53 | <0x00a00100 0x100>; |
@@ -59,16 +59,19 @@ | |||
59 | 59 | ||
60 | ckil { | 60 | ckil { |
61 | compatible = "fsl,imx-ckil", "fixed-clock"; | 61 | compatible = "fsl,imx-ckil", "fixed-clock"; |
62 | #clock-cells = <0>; | ||
62 | clock-frequency = <32768>; | 63 | clock-frequency = <32768>; |
63 | }; | 64 | }; |
64 | 65 | ||
65 | ckih1 { | 66 | ckih1 { |
66 | compatible = "fsl,imx-ckih1", "fixed-clock"; | 67 | compatible = "fsl,imx-ckih1", "fixed-clock"; |
68 | #clock-cells = <0>; | ||
67 | clock-frequency = <0>; | 69 | clock-frequency = <0>; |
68 | }; | 70 | }; |
69 | 71 | ||
70 | osc { | 72 | osc { |
71 | compatible = "fsl,imx-osc", "fixed-clock"; | 73 | compatible = "fsl,imx-osc", "fixed-clock"; |
74 | #clock-cells = <0>; | ||
72 | clock-frequency = <24000000>; | 75 | clock-frequency = <24000000>; |
73 | }; | 76 | }; |
74 | }; | 77 | }; |
@@ -138,6 +141,12 @@ | |||
138 | 0x82000000 0 0x01000000 0x01000000 0 0x00f00000>; /* non-prefetchable memory */ | 141 | 0x82000000 0 0x01000000 0x01000000 0 0x00f00000>; /* non-prefetchable memory */ |
139 | num-lanes = <1>; | 142 | num-lanes = <1>; |
140 | interrupts = <0 123 IRQ_TYPE_LEVEL_HIGH>; | 143 | interrupts = <0 123 IRQ_TYPE_LEVEL_HIGH>; |
144 | #interrupt-cells = <1>; | ||
145 | interrupt-map-mask = <0 0 0 0x7>; | ||
146 | interrupt-map = <0 0 0 1 &intc GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>, | ||
147 | <0 0 0 2 &intc GIC_SPI 122 IRQ_TYPE_LEVEL_HIGH>, | ||
148 | <0 0 0 3 &intc GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>, | ||
149 | <0 0 0 4 &intc GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>; | ||
141 | clocks = <&clks 189>, <&clks 187>, <&clks 206>, <&clks 144>; | 150 | clocks = <&clks 189>, <&clks 187>, <&clks 206>, <&clks 144>; |
142 | clock-names = "pcie_ref_125m", "sata_ref_100m", "lvds_gate", "pcie_axi"; | 151 | clock-names = "pcie_ref_125m", "sata_ref_100m", "lvds_gate", "pcie_axi"; |
143 | status = "disabled"; | 152 | status = "disabled"; |
diff --git a/arch/arm/boot/dts/imx6sl-evk.dts b/arch/arm/boot/dts/imx6sl-evk.dts index 864d8dfb51ca..a8d9a93fab85 100644 --- a/arch/arm/boot/dts/imx6sl-evk.dts +++ b/arch/arm/boot/dts/imx6sl-evk.dts | |||
@@ -282,6 +282,7 @@ | |||
282 | MX6SL_PAD_ECSPI1_MISO__ECSPI1_MISO 0x100b1 | 282 | MX6SL_PAD_ECSPI1_MISO__ECSPI1_MISO 0x100b1 |
283 | MX6SL_PAD_ECSPI1_MOSI__ECSPI1_MOSI 0x100b1 | 283 | MX6SL_PAD_ECSPI1_MOSI__ECSPI1_MOSI 0x100b1 |
284 | MX6SL_PAD_ECSPI1_SCLK__ECSPI1_SCLK 0x100b1 | 284 | MX6SL_PAD_ECSPI1_SCLK__ECSPI1_SCLK 0x100b1 |
285 | MX6SL_PAD_ECSPI1_SS0__GPIO4_IO11 0x80000000 | ||
285 | >; | 286 | >; |
286 | }; | 287 | }; |
287 | 288 | ||
diff --git a/arch/arm/boot/dts/imx6sl.dtsi b/arch/arm/boot/dts/imx6sl.dtsi index 3cb4941afeef..d26b099260a3 100644 --- a/arch/arm/boot/dts/imx6sl.dtsi +++ b/arch/arm/boot/dts/imx6sl.dtsi | |||
@@ -68,8 +68,6 @@ | |||
68 | intc: interrupt-controller@00a01000 { | 68 | intc: interrupt-controller@00a01000 { |
69 | compatible = "arm,cortex-a9-gic"; | 69 | compatible = "arm,cortex-a9-gic"; |
70 | #interrupt-cells = <3>; | 70 | #interrupt-cells = <3>; |
71 | #address-cells = <1>; | ||
72 | #size-cells = <1>; | ||
73 | interrupt-controller; | 71 | interrupt-controller; |
74 | reg = <0x00a01000 0x1000>, | 72 | reg = <0x00a01000 0x1000>, |
75 | <0x00a00100 0x100>; | 73 | <0x00a00100 0x100>; |
@@ -81,11 +79,13 @@ | |||
81 | 79 | ||
82 | ckil { | 80 | ckil { |
83 | compatible = "fixed-clock"; | 81 | compatible = "fixed-clock"; |
82 | #clock-cells = <0>; | ||
84 | clock-frequency = <32768>; | 83 | clock-frequency = <32768>; |
85 | }; | 84 | }; |
86 | 85 | ||
87 | osc { | 86 | osc { |
88 | compatible = "fixed-clock"; | 87 | compatible = "fixed-clock"; |
88 | #clock-cells = <0>; | ||
89 | clock-frequency = <24000000>; | 89 | clock-frequency = <24000000>; |
90 | }; | 90 | }; |
91 | }; | 91 | }; |
diff --git a/arch/arm/boot/dts/kirkwood-b3.dts b/arch/arm/boot/dts/kirkwood-b3.dts index 40791053106b..6becedebaa4e 100644 --- a/arch/arm/boot/dts/kirkwood-b3.dts +++ b/arch/arm/boot/dts/kirkwood-b3.dts | |||
@@ -75,7 +75,7 @@ | |||
75 | m25p16@0 { | 75 | m25p16@0 { |
76 | #address-cells = <1>; | 76 | #address-cells = <1>; |
77 | #size-cells = <1>; | 77 | #size-cells = <1>; |
78 | compatible = "m25p16"; | 78 | compatible = "st,m25p16"; |
79 | reg = <0>; | 79 | reg = <0>; |
80 | spi-max-frequency = <40000000>; | 80 | spi-max-frequency = <40000000>; |
81 | mode = <0>; | 81 | mode = <0>; |
diff --git a/arch/arm/boot/dts/kirkwood-cloudbox.dts b/arch/arm/boot/dts/kirkwood-cloudbox.dts index 0e06fd3cee4d..3b62aeeaa3a2 100644 --- a/arch/arm/boot/dts/kirkwood-cloudbox.dts +++ b/arch/arm/boot/dts/kirkwood-cloudbox.dts | |||
@@ -46,7 +46,7 @@ | |||
46 | flash@0 { | 46 | flash@0 { |
47 | #address-cells = <1>; | 47 | #address-cells = <1>; |
48 | #size-cells = <1>; | 48 | #size-cells = <1>; |
49 | compatible = "mx25l4005a"; | 49 | compatible = "mxicy,mx25l4005a"; |
50 | reg = <0>; | 50 | reg = <0>; |
51 | spi-max-frequency = <20000000>; | 51 | spi-max-frequency = <20000000>; |
52 | mode = <0>; | 52 | mode = <0>; |
diff --git a/arch/arm/boot/dts/kirkwood-dreamplug.dts b/arch/arm/boot/dts/kirkwood-dreamplug.dts index ef3463e0ae19..28b3ee369778 100644 --- a/arch/arm/boot/dts/kirkwood-dreamplug.dts +++ b/arch/arm/boot/dts/kirkwood-dreamplug.dts | |||
@@ -43,7 +43,7 @@ | |||
43 | m25p40@0 { | 43 | m25p40@0 { |
44 | #address-cells = <1>; | 44 | #address-cells = <1>; |
45 | #size-cells = <1>; | 45 | #size-cells = <1>; |
46 | compatible = "mx25l1606e"; | 46 | compatible = "mxicy,mx25l1606e"; |
47 | reg = <0>; | 47 | reg = <0>; |
48 | spi-max-frequency = <50000000>; | 48 | spi-max-frequency = <50000000>; |
49 | mode = <0>; | 49 | mode = <0>; |
diff --git a/arch/arm/boot/dts/kirkwood-laplug.dts b/arch/arm/boot/dts/kirkwood-laplug.dts index c9e82eff9bf2..6761ffa2c4ab 100644 --- a/arch/arm/boot/dts/kirkwood-laplug.dts +++ b/arch/arm/boot/dts/kirkwood-laplug.dts | |||
@@ -48,7 +48,7 @@ | |||
48 | status = "okay"; | 48 | status = "okay"; |
49 | 49 | ||
50 | eeprom@50 { | 50 | eeprom@50 { |
51 | compatible = "at,24c04"; | 51 | compatible = "atmel,24c04"; |
52 | pagesize = <16>; | 52 | pagesize = <16>; |
53 | reg = <0x50>; | 53 | reg = <0x50>; |
54 | }; | 54 | }; |
diff --git a/arch/arm/boot/dts/kirkwood-mv88f6281gtw-ge.dts b/arch/arm/boot/dts/kirkwood-mv88f6281gtw-ge.dts index 2cb0dc529165..32c6fb4a1162 100644 --- a/arch/arm/boot/dts/kirkwood-mv88f6281gtw-ge.dts +++ b/arch/arm/boot/dts/kirkwood-mv88f6281gtw-ge.dts | |||
@@ -56,7 +56,7 @@ | |||
56 | flash@0 { | 56 | flash@0 { |
57 | #address-cells = <1>; | 57 | #address-cells = <1>; |
58 | #size-cells = <1>; | 58 | #size-cells = <1>; |
59 | compatible = "mx25l12805d"; | 59 | compatible = "mxicy,mx25l12805d"; |
60 | reg = <0>; | 60 | reg = <0>; |
61 | spi-max-frequency = <50000000>; | 61 | spi-max-frequency = <50000000>; |
62 | mode = <0>; | 62 | mode = <0>; |
diff --git a/arch/arm/boot/dts/kirkwood-ns2-common.dtsi b/arch/arm/boot/dts/kirkwood-ns2-common.dtsi index 743152f31a81..e6e5ec4fe6b9 100644 --- a/arch/arm/boot/dts/kirkwood-ns2-common.dtsi +++ b/arch/arm/boot/dts/kirkwood-ns2-common.dtsi | |||
@@ -32,7 +32,7 @@ | |||
32 | flash@0 { | 32 | flash@0 { |
33 | #address-cells = <1>; | 33 | #address-cells = <1>; |
34 | #size-cells = <1>; | 34 | #size-cells = <1>; |
35 | compatible = "mx25l4005a"; | 35 | compatible = "mxicy,mx25l4005a"; |
36 | reg = <0>; | 36 | reg = <0>; |
37 | spi-max-frequency = <20000000>; | 37 | spi-max-frequency = <20000000>; |
38 | mode = <0>; | 38 | mode = <0>; |
@@ -50,7 +50,7 @@ | |||
50 | status = "okay"; | 50 | status = "okay"; |
51 | 51 | ||
52 | eeprom@50 { | 52 | eeprom@50 { |
53 | compatible = "at,24c04"; | 53 | compatible = "atmel,24c04"; |
54 | pagesize = <16>; | 54 | pagesize = <16>; |
55 | reg = <0x50>; | 55 | reg = <0x50>; |
56 | }; | 56 | }; |
diff --git a/arch/arm/boot/dts/kirkwood-nsa310.dts b/arch/arm/boot/dts/kirkwood-nsa310.dts index 03fa24cf3344..0a07af9d8e58 100644 --- a/arch/arm/boot/dts/kirkwood-nsa310.dts +++ b/arch/arm/boot/dts/kirkwood-nsa310.dts | |||
@@ -104,7 +104,7 @@ | |||
104 | status = "okay"; | 104 | status = "okay"; |
105 | 105 | ||
106 | adt7476: adt7476a@2e { | 106 | adt7476: adt7476a@2e { |
107 | compatible = "adt7476"; | 107 | compatible = "adi,adt7476"; |
108 | reg = <0x2e>; | 108 | reg = <0x2e>; |
109 | }; | 109 | }; |
110 | }; | 110 | }; |
diff --git a/arch/arm/boot/dts/kirkwood-nsa310a.dts b/arch/arm/boot/dts/kirkwood-nsa310a.dts index a5e779452867..27ca6a79c48a 100644 --- a/arch/arm/boot/dts/kirkwood-nsa310a.dts +++ b/arch/arm/boot/dts/kirkwood-nsa310a.dts | |||
@@ -94,7 +94,7 @@ | |||
94 | status = "okay"; | 94 | status = "okay"; |
95 | 95 | ||
96 | lm85: lm85@2e { | 96 | lm85: lm85@2e { |
97 | compatible = "lm85"; | 97 | compatible = "national,lm85"; |
98 | reg = <0x2e>; | 98 | reg = <0x2e>; |
99 | }; | 99 | }; |
100 | }; | 100 | }; |
diff --git a/arch/arm/boot/dts/kirkwood-openblocks_a6.dts b/arch/arm/boot/dts/kirkwood-openblocks_a6.dts index b88da9392c32..0650beafc1de 100644 --- a/arch/arm/boot/dts/kirkwood-openblocks_a6.dts +++ b/arch/arm/boot/dts/kirkwood-openblocks_a6.dts | |||
@@ -40,7 +40,7 @@ | |||
40 | pinctrl-names = "default"; | 40 | pinctrl-names = "default"; |
41 | 41 | ||
42 | s35390a: s35390a@30 { | 42 | s35390a: s35390a@30 { |
43 | compatible = "s35390a"; | 43 | compatible = "sii,s35390a"; |
44 | reg = <0x30>; | 44 | reg = <0x30>; |
45 | }; | 45 | }; |
46 | }; | 46 | }; |
diff --git a/arch/arm/boot/dts/kirkwood-openblocks_a7.dts b/arch/arm/boot/dts/kirkwood-openblocks_a7.dts index b2f7cae06839..38520a287514 100644 --- a/arch/arm/boot/dts/kirkwood-openblocks_a7.dts +++ b/arch/arm/boot/dts/kirkwood-openblocks_a7.dts | |||
@@ -52,7 +52,7 @@ | |||
52 | pinctrl-names = "default"; | 52 | pinctrl-names = "default"; |
53 | 53 | ||
54 | s24c02: s24c02@50 { | 54 | s24c02: s24c02@50 { |
55 | compatible = "24c02"; | 55 | compatible = "atmel,24c02"; |
56 | reg = <0x50>; | 56 | reg = <0x50>; |
57 | }; | 57 | }; |
58 | }; | 58 | }; |
diff --git a/arch/arm/boot/dts/omap3-beagle-xm-ab.dts b/arch/arm/boot/dts/omap3-beagle-xm-ab.dts new file mode 100644 index 000000000000..7ac3bcf59d59 --- /dev/null +++ b/arch/arm/boot/dts/omap3-beagle-xm-ab.dts | |||
@@ -0,0 +1,16 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/ | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License version 2 as | ||
6 | * published by the Free Software Foundation. | ||
7 | */ | ||
8 | |||
9 | #include "omap3-beagle-xm.dts" | ||
10 | |||
11 | / { | ||
12 | /* HS USB Port 2 Power enable was inverted with the xM C */ | ||
13 | hsusb2_power: hsusb2_power_reg { | ||
14 | enable-active-high; | ||
15 | }; | ||
16 | }; | ||
diff --git a/arch/arm/boot/dts/omap3-devkit8000.dts b/arch/arm/boot/dts/omap3-devkit8000.dts index bf5a515a3247..da402f0fdab4 100644 --- a/arch/arm/boot/dts/omap3-devkit8000.dts +++ b/arch/arm/boot/dts/omap3-devkit8000.dts | |||
@@ -112,7 +112,6 @@ | |||
112 | reg = <0 0 0>; /* CS0, offset 0 */ | 112 | reg = <0 0 0>; /* CS0, offset 0 */ |
113 | nand-bus-width = <16>; | 113 | nand-bus-width = <16>; |
114 | 114 | ||
115 | gpmc,device-nand; | ||
116 | gpmc,sync-clk-ps = <0>; | 115 | gpmc,sync-clk-ps = <0>; |
117 | gpmc,cs-on-ns = <0>; | 116 | gpmc,cs-on-ns = <0>; |
118 | gpmc,cs-rd-off-ns = <44>; | 117 | gpmc,cs-rd-off-ns = <44>; |
diff --git a/arch/arm/boot/dts/omap3-lilly-a83x.dtsi b/arch/arm/boot/dts/omap3-lilly-a83x.dtsi index 6369d9f43ca2..cc1dce6978f5 100644 --- a/arch/arm/boot/dts/omap3-lilly-a83x.dtsi +++ b/arch/arm/boot/dts/omap3-lilly-a83x.dtsi | |||
@@ -368,7 +368,6 @@ | |||
368 | /* no elm on omap3 */ | 368 | /* no elm on omap3 */ |
369 | 369 | ||
370 | gpmc,mux-add-data = <0>; | 370 | gpmc,mux-add-data = <0>; |
371 | gpmc,device-nand; | ||
372 | gpmc,device-width = <2>; | 371 | gpmc,device-width = <2>; |
373 | gpmc,wait-pin = <0>; | 372 | gpmc,wait-pin = <0>; |
374 | gpmc,wait-monitoring-ns = <0>; | 373 | gpmc,wait-monitoring-ns = <0>; |
diff --git a/arch/arm/boot/dts/omap3.dtsi b/arch/arm/boot/dts/omap3.dtsi index 5e5790f631eb..acb9019dc437 100644 --- a/arch/arm/boot/dts/omap3.dtsi +++ b/arch/arm/boot/dts/omap3.dtsi | |||
@@ -74,7 +74,7 @@ | |||
74 | /* | 74 | /* |
75 | * XXX: Use a flat representation of the OMAP3 interconnect. | 75 | * XXX: Use a flat representation of the OMAP3 interconnect. |
76 | * The real OMAP interconnect network is quite complex. | 76 | * The real OMAP interconnect network is quite complex. |
77 | * Since that will not bring real advantage to represent that in DT for | 77 | * Since it will not bring real advantage to represent that in DT for |
78 | * the moment, just use a fake OCP bus entry to represent the whole bus | 78 | * the moment, just use a fake OCP bus entry to represent the whole bus |
79 | * hierarchy. | 79 | * hierarchy. |
80 | */ | 80 | */ |
diff --git a/arch/arm/boot/dts/omap4.dtsi b/arch/arm/boot/dts/omap4.dtsi index 27fcac874742..649b5cd38b40 100644 --- a/arch/arm/boot/dts/omap4.dtsi +++ b/arch/arm/boot/dts/omap4.dtsi | |||
@@ -72,7 +72,7 @@ | |||
72 | }; | 72 | }; |
73 | 73 | ||
74 | /* | 74 | /* |
75 | * The soc node represents the soc top level view. It is uses for IPs | 75 | * The soc node represents the soc top level view. It is used for IPs |
76 | * that are not memory mapped in the MPU view or for the MPU itself. | 76 | * that are not memory mapped in the MPU view or for the MPU itself. |
77 | */ | 77 | */ |
78 | soc { | 78 | soc { |
@@ -96,7 +96,7 @@ | |||
96 | /* | 96 | /* |
97 | * XXX: Use a flat representation of the OMAP4 interconnect. | 97 | * XXX: Use a flat representation of the OMAP4 interconnect. |
98 | * The real OMAP interconnect network is quite complex. | 98 | * The real OMAP interconnect network is quite complex. |
99 | * Since that will not bring real advantage to represent that in DT for | 99 | * Since it will not bring real advantage to represent that in DT for |
100 | * the moment, just use a fake OCP bus entry to represent the whole bus | 100 | * the moment, just use a fake OCP bus entry to represent the whole bus |
101 | * hierarchy. | 101 | * hierarchy. |
102 | */ | 102 | */ |
diff --git a/arch/arm/boot/dts/omap5.dtsi b/arch/arm/boot/dts/omap5.dtsi index 6f3de22fb266..f8c9855ce587 100644 --- a/arch/arm/boot/dts/omap5.dtsi +++ b/arch/arm/boot/dts/omap5.dtsi | |||
@@ -93,7 +93,7 @@ | |||
93 | }; | 93 | }; |
94 | 94 | ||
95 | /* | 95 | /* |
96 | * The soc node represents the soc top level view. It is uses for IPs | 96 | * The soc node represents the soc top level view. It is used for IPs |
97 | * that are not memory mapped in the MPU view or for the MPU itself. | 97 | * that are not memory mapped in the MPU view or for the MPU itself. |
98 | */ | 98 | */ |
99 | soc { | 99 | soc { |
@@ -107,7 +107,7 @@ | |||
107 | /* | 107 | /* |
108 | * XXX: Use a flat representation of the OMAP3 interconnect. | 108 | * XXX: Use a flat representation of the OMAP3 interconnect. |
109 | * The real OMAP interconnect network is quite complex. | 109 | * The real OMAP interconnect network is quite complex. |
110 | * Since that will not bring real advantage to represent that in DT for | 110 | * Since it will not bring real advantage to represent that in DT for |
111 | * the moment, just use a fake OCP bus entry to represent the whole bus | 111 | * the moment, just use a fake OCP bus entry to represent the whole bus |
112 | * hierarchy. | 112 | * hierarchy. |
113 | */ | 113 | */ |
@@ -813,6 +813,12 @@ | |||
813 | <0x4a084c00 0x40>; | 813 | <0x4a084c00 0x40>; |
814 | reg-names = "phy_rx", "phy_tx", "pll_ctrl"; | 814 | reg-names = "phy_rx", "phy_tx", "pll_ctrl"; |
815 | ctrl-module = <&omap_control_usb3phy>; | 815 | ctrl-module = <&omap_control_usb3phy>; |
816 | clocks = <&usb_phy_cm_clk32k>, | ||
817 | <&sys_clkin>, | ||
818 | <&usb_otg_ss_refclk960m>; | ||
819 | clock-names = "wkupclk", | ||
820 | "sysclk", | ||
821 | "refclk"; | ||
816 | #phy-cells = <0>; | 822 | #phy-cells = <0>; |
817 | }; | 823 | }; |
818 | }; | 824 | }; |
diff --git a/arch/arm/boot/dts/r8a7740.dtsi b/arch/arm/boot/dts/r8a7740.dtsi index 8280884bfa59..2551e9438d35 100644 --- a/arch/arm/boot/dts/r8a7740.dtsi +++ b/arch/arm/boot/dts/r8a7740.dtsi | |||
@@ -28,7 +28,6 @@ | |||
28 | gic: interrupt-controller@c2800000 { | 28 | gic: interrupt-controller@c2800000 { |
29 | compatible = "arm,cortex-a9-gic"; | 29 | compatible = "arm,cortex-a9-gic"; |
30 | #interrupt-cells = <3>; | 30 | #interrupt-cells = <3>; |
31 | #address-cells = <1>; | ||
32 | interrupt-controller; | 31 | interrupt-controller; |
33 | reg = <0xc2800000 0x1000>, | 32 | reg = <0xc2800000 0x1000>, |
34 | <0xc2000000 0x1000>; | 33 | <0xc2000000 0x1000>; |
diff --git a/arch/arm/boot/dts/r8a7790-lager.dts b/arch/arm/boot/dts/r8a7790-lager.dts index 6e99eb2df076..d01048ab3e77 100644 --- a/arch/arm/boot/dts/r8a7790-lager.dts +++ b/arch/arm/boot/dts/r8a7790-lager.dts | |||
@@ -141,12 +141,12 @@ | |||
141 | }; | 141 | }; |
142 | 142 | ||
143 | sdhi0_pins: sd0 { | 143 | sdhi0_pins: sd0 { |
144 | renesas,gpios = "sdhi0_data4", "sdhi0_ctrl"; | 144 | renesas,groups = "sdhi0_data4", "sdhi0_ctrl"; |
145 | renesas,function = "sdhi0"; | 145 | renesas,function = "sdhi0"; |
146 | }; | 146 | }; |
147 | 147 | ||
148 | sdhi2_pins: sd2 { | 148 | sdhi2_pins: sd2 { |
149 | renesas,gpios = "sdhi2_data4", "sdhi2_ctrl"; | 149 | renesas,groups = "sdhi2_data4", "sdhi2_ctrl"; |
150 | renesas,function = "sdhi2"; | 150 | renesas,function = "sdhi2"; |
151 | }; | 151 | }; |
152 | 152 | ||
diff --git a/arch/arm/boot/dts/r8a7791-koelsch.dts b/arch/arm/boot/dts/r8a7791-koelsch.dts index bdd73e6657b2..de1b6977c69a 100644 --- a/arch/arm/boot/dts/r8a7791-koelsch.dts +++ b/arch/arm/boot/dts/r8a7791-koelsch.dts | |||
@@ -230,17 +230,17 @@ | |||
230 | }; | 230 | }; |
231 | 231 | ||
232 | sdhi0_pins: sd0 { | 232 | sdhi0_pins: sd0 { |
233 | renesas,gpios = "sdhi0_data4", "sdhi0_ctrl"; | 233 | renesas,groups = "sdhi0_data4", "sdhi0_ctrl"; |
234 | renesas,function = "sdhi0"; | 234 | renesas,function = "sdhi0"; |
235 | }; | 235 | }; |
236 | 236 | ||
237 | sdhi1_pins: sd1 { | 237 | sdhi1_pins: sd1 { |
238 | renesas,gpios = "sdhi1_data4", "sdhi1_ctrl"; | 238 | renesas,groups = "sdhi1_data4", "sdhi1_ctrl"; |
239 | renesas,function = "sdhi1"; | 239 | renesas,function = "sdhi1"; |
240 | }; | 240 | }; |
241 | 241 | ||
242 | sdhi2_pins: sd2 { | 242 | sdhi2_pins: sd2 { |
243 | renesas,gpios = "sdhi2_data4", "sdhi2_ctrl"; | 243 | renesas,groups = "sdhi2_data4", "sdhi2_ctrl"; |
244 | renesas,function = "sdhi2"; | 244 | renesas,function = "sdhi2"; |
245 | }; | 245 | }; |
246 | 246 | ||
diff --git a/arch/arm/boot/dts/rk3188.dtsi b/arch/arm/boot/dts/rk3188.dtsi index bb36596ea205..ed9a70af3e3f 100644 --- a/arch/arm/boot/dts/rk3188.dtsi +++ b/arch/arm/boot/dts/rk3188.dtsi | |||
@@ -149,7 +149,7 @@ | |||
149 | 149 | ||
150 | uart0 { | 150 | uart0 { |
151 | uart0_xfer: uart0-xfer { | 151 | uart0_xfer: uart0-xfer { |
152 | rockchip,pins = <RK_GPIO1 0 RK_FUNC_1 &pcfg_pull_none>, | 152 | rockchip,pins = <RK_GPIO1 0 RK_FUNC_1 &pcfg_pull_up>, |
153 | <RK_GPIO1 1 RK_FUNC_1 &pcfg_pull_none>; | 153 | <RK_GPIO1 1 RK_FUNC_1 &pcfg_pull_none>; |
154 | }; | 154 | }; |
155 | 155 | ||
@@ -164,7 +164,7 @@ | |||
164 | 164 | ||
165 | uart1 { | 165 | uart1 { |
166 | uart1_xfer: uart1-xfer { | 166 | uart1_xfer: uart1-xfer { |
167 | rockchip,pins = <RK_GPIO1 4 RK_FUNC_1 &pcfg_pull_none>, | 167 | rockchip,pins = <RK_GPIO1 4 RK_FUNC_1 &pcfg_pull_up>, |
168 | <RK_GPIO1 5 RK_FUNC_1 &pcfg_pull_none>; | 168 | <RK_GPIO1 5 RK_FUNC_1 &pcfg_pull_none>; |
169 | }; | 169 | }; |
170 | 170 | ||
@@ -179,7 +179,7 @@ | |||
179 | 179 | ||
180 | uart2 { | 180 | uart2 { |
181 | uart2_xfer: uart2-xfer { | 181 | uart2_xfer: uart2-xfer { |
182 | rockchip,pins = <RK_GPIO1 8 RK_FUNC_1 &pcfg_pull_none>, | 182 | rockchip,pins = <RK_GPIO1 8 RK_FUNC_1 &pcfg_pull_up>, |
183 | <RK_GPIO1 9 RK_FUNC_1 &pcfg_pull_none>; | 183 | <RK_GPIO1 9 RK_FUNC_1 &pcfg_pull_none>; |
184 | }; | 184 | }; |
185 | /* no rts / cts for uart2 */ | 185 | /* no rts / cts for uart2 */ |
@@ -187,7 +187,7 @@ | |||
187 | 187 | ||
188 | uart3 { | 188 | uart3 { |
189 | uart3_xfer: uart3-xfer { | 189 | uart3_xfer: uart3-xfer { |
190 | rockchip,pins = <RK_GPIO1 10 RK_FUNC_1 &pcfg_pull_none>, | 190 | rockchip,pins = <RK_GPIO1 10 RK_FUNC_1 &pcfg_pull_up>, |
191 | <RK_GPIO1 11 RK_FUNC_1 &pcfg_pull_none>; | 191 | <RK_GPIO1 11 RK_FUNC_1 &pcfg_pull_none>; |
192 | }; | 192 | }; |
193 | 193 | ||
diff --git a/arch/arm/boot/dts/sh73a0.dtsi b/arch/arm/boot/dts/sh73a0.dtsi index b7bd3b9a6753..5ecf552e1c00 100644 --- a/arch/arm/boot/dts/sh73a0.dtsi +++ b/arch/arm/boot/dts/sh73a0.dtsi | |||
@@ -34,7 +34,6 @@ | |||
34 | gic: interrupt-controller@f0001000 { | 34 | gic: interrupt-controller@f0001000 { |
35 | compatible = "arm,cortex-a9-gic"; | 35 | compatible = "arm,cortex-a9-gic"; |
36 | #interrupt-cells = <3>; | 36 | #interrupt-cells = <3>; |
37 | #address-cells = <1>; | ||
38 | interrupt-controller; | 37 | interrupt-controller; |
39 | reg = <0xf0001000 0x1000>, | 38 | reg = <0xf0001000 0x1000>, |
40 | <0xf0000100 0x100>; | 39 | <0xf0000100 0x100>; |
diff --git a/arch/arm/boot/dts/stih415-pinctrl.dtsi b/arch/arm/boot/dts/stih415-pinctrl.dtsi index f09fb10a3791..81df870e5ee6 100644 --- a/arch/arm/boot/dts/stih415-pinctrl.dtsi +++ b/arch/arm/boot/dts/stih415-pinctrl.dtsi | |||
@@ -49,7 +49,7 @@ | |||
49 | reg = <0xfe61f080 0x4>; | 49 | reg = <0xfe61f080 0x4>; |
50 | reg-names = "irqmux"; | 50 | reg-names = "irqmux"; |
51 | interrupts = <GIC_SPI 180 IRQ_TYPE_LEVEL_HIGH>; | 51 | interrupts = <GIC_SPI 180 IRQ_TYPE_LEVEL_HIGH>; |
52 | interrupts-names = "irqmux"; | 52 | interrupt-names = "irqmux"; |
53 | ranges = <0 0xfe610000 0x5000>; | 53 | ranges = <0 0xfe610000 0x5000>; |
54 | 54 | ||
55 | PIO0: gpio@fe610000 { | 55 | PIO0: gpio@fe610000 { |
@@ -187,7 +187,7 @@ | |||
187 | reg = <0xfee0f080 0x4>; | 187 | reg = <0xfee0f080 0x4>; |
188 | reg-names = "irqmux"; | 188 | reg-names = "irqmux"; |
189 | interrupts = <GIC_SPI 181 IRQ_TYPE_LEVEL_HIGH>; | 189 | interrupts = <GIC_SPI 181 IRQ_TYPE_LEVEL_HIGH>; |
190 | interrupts-names = "irqmux"; | 190 | interrupt-names = "irqmux"; |
191 | ranges = <0 0xfee00000 0x8000>; | 191 | ranges = <0 0xfee00000 0x8000>; |
192 | 192 | ||
193 | PIO5: gpio@fee00000 { | 193 | PIO5: gpio@fee00000 { |
@@ -282,7 +282,7 @@ | |||
282 | reg = <0xfe82f080 0x4>; | 282 | reg = <0xfe82f080 0x4>; |
283 | reg-names = "irqmux"; | 283 | reg-names = "irqmux"; |
284 | interrupts = <GIC_SPI 182 IRQ_TYPE_LEVEL_HIGH>; | 284 | interrupts = <GIC_SPI 182 IRQ_TYPE_LEVEL_HIGH>; |
285 | interrupts-names = "irqmux"; | 285 | interrupt-names = "irqmux"; |
286 | ranges = <0 0xfe820000 0x8000>; | 286 | ranges = <0 0xfe820000 0x8000>; |
287 | 287 | ||
288 | PIO13: gpio@fe820000 { | 288 | PIO13: gpio@fe820000 { |
@@ -423,7 +423,7 @@ | |||
423 | reg = <0xfd6bf080 0x4>; | 423 | reg = <0xfd6bf080 0x4>; |
424 | reg-names = "irqmux"; | 424 | reg-names = "irqmux"; |
425 | interrupts = <GIC_SPI 113 IRQ_TYPE_LEVEL_HIGH>; | 425 | interrupts = <GIC_SPI 113 IRQ_TYPE_LEVEL_HIGH>; |
426 | interrupts-names = "irqmux"; | 426 | interrupt-names = "irqmux"; |
427 | ranges = <0 0xfd6b0000 0x3000>; | 427 | ranges = <0 0xfd6b0000 0x3000>; |
428 | 428 | ||
429 | PIO100: gpio@fd6b0000 { | 429 | PIO100: gpio@fd6b0000 { |
@@ -460,7 +460,7 @@ | |||
460 | reg = <0xfd33f080 0x4>; | 460 | reg = <0xfd33f080 0x4>; |
461 | reg-names = "irqmux"; | 461 | reg-names = "irqmux"; |
462 | interrupts = <GIC_SPI 114 IRQ_TYPE_LEVEL_HIGH>; | 462 | interrupts = <GIC_SPI 114 IRQ_TYPE_LEVEL_HIGH>; |
463 | interrupts-names = "irqmux"; | 463 | interrupt-names = "irqmux"; |
464 | ranges = <0 0xfd330000 0x5000>; | 464 | ranges = <0 0xfd330000 0x5000>; |
465 | 465 | ||
466 | PIO103: gpio@fd330000 { | 466 | PIO103: gpio@fd330000 { |
diff --git a/arch/arm/boot/dts/stih416-pinctrl.dtsi b/arch/arm/boot/dts/stih416-pinctrl.dtsi index aeea304086eb..250d5ecc951e 100644 --- a/arch/arm/boot/dts/stih416-pinctrl.dtsi +++ b/arch/arm/boot/dts/stih416-pinctrl.dtsi | |||
@@ -53,7 +53,7 @@ | |||
53 | reg = <0xfe61f080 0x4>; | 53 | reg = <0xfe61f080 0x4>; |
54 | reg-names = "irqmux"; | 54 | reg-names = "irqmux"; |
55 | interrupts = <GIC_SPI 182 IRQ_TYPE_LEVEL_HIGH>; | 55 | interrupts = <GIC_SPI 182 IRQ_TYPE_LEVEL_HIGH>; |
56 | interrupts-names = "irqmux"; | 56 | interrupt-names = "irqmux"; |
57 | ranges = <0 0xfe610000 0x6000>; | 57 | ranges = <0 0xfe610000 0x6000>; |
58 | 58 | ||
59 | PIO0: gpio@fe610000 { | 59 | PIO0: gpio@fe610000 { |
@@ -201,7 +201,7 @@ | |||
201 | reg = <0xfee0f080 0x4>; | 201 | reg = <0xfee0f080 0x4>; |
202 | reg-names = "irqmux"; | 202 | reg-names = "irqmux"; |
203 | interrupts = <GIC_SPI 183 IRQ_TYPE_LEVEL_HIGH>; | 203 | interrupts = <GIC_SPI 183 IRQ_TYPE_LEVEL_HIGH>; |
204 | interrupts-names = "irqmux"; | 204 | interrupt-names = "irqmux"; |
205 | ranges = <0 0xfee00000 0x10000>; | 205 | ranges = <0 0xfee00000 0x10000>; |
206 | 206 | ||
207 | PIO5: gpio@fee00000 { | 207 | PIO5: gpio@fee00000 { |
@@ -333,7 +333,7 @@ | |||
333 | reg = <0xfe82f080 0x4>; | 333 | reg = <0xfe82f080 0x4>; |
334 | reg-names = "irqmux"; | 334 | reg-names = "irqmux"; |
335 | interrupts = <GIC_SPI 184 IRQ_TYPE_LEVEL_HIGH>; | 335 | interrupts = <GIC_SPI 184 IRQ_TYPE_LEVEL_HIGH>; |
336 | interrupts-names = "irqmux"; | 336 | interrupt-names = "irqmux"; |
337 | ranges = <0 0xfe820000 0x6000>; | 337 | ranges = <0 0xfe820000 0x6000>; |
338 | 338 | ||
339 | PIO13: gpio@fe820000 { | 339 | PIO13: gpio@fe820000 { |
@@ -461,7 +461,7 @@ | |||
461 | reg = <0xfd6bf080 0x4>; | 461 | reg = <0xfd6bf080 0x4>; |
462 | reg-names = "irqmux"; | 462 | reg-names = "irqmux"; |
463 | interrupts = <GIC_SPI 113 IRQ_TYPE_LEVEL_HIGH>; | 463 | interrupts = <GIC_SPI 113 IRQ_TYPE_LEVEL_HIGH>; |
464 | interrupts-names = "irqmux"; | 464 | interrupt-names = "irqmux"; |
465 | ranges = <0 0xfd6b0000 0x3000>; | 465 | ranges = <0 0xfd6b0000 0x3000>; |
466 | 466 | ||
467 | PIO100: gpio@fd6b0000 { | 467 | PIO100: gpio@fd6b0000 { |
@@ -498,7 +498,7 @@ | |||
498 | reg = <0xfd33f080 0x4>; | 498 | reg = <0xfd33f080 0x4>; |
499 | reg-names = "irqmux"; | 499 | reg-names = "irqmux"; |
500 | interrupts = <GIC_SPI 114 IRQ_TYPE_LEVEL_HIGH>; | 500 | interrupts = <GIC_SPI 114 IRQ_TYPE_LEVEL_HIGH>; |
501 | interrupts-names = "irqmux"; | 501 | interrupt-names = "irqmux"; |
502 | ranges = <0 0xfd330000 0x5000>; | 502 | ranges = <0 0xfd330000 0x5000>; |
503 | 503 | ||
504 | PIO103: gpio@fd330000 { | 504 | PIO103: gpio@fd330000 { |
diff --git a/arch/arm/boot/dts/tegra124.dtsi b/arch/arm/boot/dts/tegra124.dtsi index cf45a1a39483..6d540a025148 100644 --- a/arch/arm/boot/dts/tegra124.dtsi +++ b/arch/arm/boot/dts/tegra124.dtsi | |||
@@ -233,19 +233,6 @@ | |||
233 | status = "disabled"; | 233 | status = "disabled"; |
234 | }; | 234 | }; |
235 | 235 | ||
236 | serial@0,70006400 { | ||
237 | compatible = "nvidia,tegra124-uart", "nvidia,tegra20-uart"; | ||
238 | reg = <0x0 0x70006400 0x0 0x40>; | ||
239 | reg-shift = <2>; | ||
240 | interrupts = <GIC_SPI 91 IRQ_TYPE_LEVEL_HIGH>; | ||
241 | clocks = <&tegra_car TEGRA124_CLK_UARTE>; | ||
242 | resets = <&tegra_car 66>; | ||
243 | reset-names = "serial"; | ||
244 | dmas = <&apbdma 20>, <&apbdma 20>; | ||
245 | dma-names = "rx", "tx"; | ||
246 | status = "disabled"; | ||
247 | }; | ||
248 | |||
249 | pwm@0,7000a000 { | 236 | pwm@0,7000a000 { |
250 | compatible = "nvidia,tegra124-pwm", "nvidia,tegra20-pwm"; | 237 | compatible = "nvidia,tegra124-pwm", "nvidia,tegra20-pwm"; |
251 | reg = <0x0 0x7000a000 0x0 0x100>; | 238 | reg = <0x0 0x7000a000 0x0 0x100>; |
diff --git a/arch/arm/boot/dts/vf610-twr.dts b/arch/arm/boot/dts/vf610-twr.dts index 7dd1d6ede525..ded361075aab 100644 --- a/arch/arm/boot/dts/vf610-twr.dts +++ b/arch/arm/boot/dts/vf610-twr.dts | |||
@@ -25,11 +25,13 @@ | |||
25 | clocks { | 25 | clocks { |
26 | audio_ext { | 26 | audio_ext { |
27 | compatible = "fixed-clock"; | 27 | compatible = "fixed-clock"; |
28 | #clock-cells = <0>; | ||
28 | clock-frequency = <24576000>; | 29 | clock-frequency = <24576000>; |
29 | }; | 30 | }; |
30 | 31 | ||
31 | enet_ext { | 32 | enet_ext { |
32 | compatible = "fixed-clock"; | 33 | compatible = "fixed-clock"; |
34 | #clock-cells = <0>; | ||
33 | clock-frequency = <50000000>; | 35 | clock-frequency = <50000000>; |
34 | }; | 36 | }; |
35 | }; | 37 | }; |
diff --git a/arch/arm/boot/dts/vf610.dtsi b/arch/arm/boot/dts/vf610.dtsi index 804873367669..b8ce0aa7b157 100644 --- a/arch/arm/boot/dts/vf610.dtsi +++ b/arch/arm/boot/dts/vf610.dtsi | |||
@@ -45,11 +45,13 @@ | |||
45 | 45 | ||
46 | sxosc { | 46 | sxosc { |
47 | compatible = "fixed-clock"; | 47 | compatible = "fixed-clock"; |
48 | #clock-cells = <0>; | ||
48 | clock-frequency = <32768>; | 49 | clock-frequency = <32768>; |
49 | }; | 50 | }; |
50 | 51 | ||
51 | fxosc { | 52 | fxosc { |
52 | compatible = "fixed-clock"; | 53 | compatible = "fixed-clock"; |
54 | #clock-cells = <0>; | ||
53 | clock-frequency = <24000000>; | 55 | clock-frequency = <24000000>; |
54 | }; | 56 | }; |
55 | }; | 57 | }; |
@@ -72,8 +74,6 @@ | |||
72 | intc: interrupt-controller@40002000 { | 74 | intc: interrupt-controller@40002000 { |
73 | compatible = "arm,cortex-a9-gic"; | 75 | compatible = "arm,cortex-a9-gic"; |
74 | #interrupt-cells = <3>; | 76 | #interrupt-cells = <3>; |
75 | #address-cells = <1>; | ||
76 | #size-cells = <1>; | ||
77 | interrupt-controller; | 77 | interrupt-controller; |
78 | reg = <0x40003000 0x1000>, | 78 | reg = <0x40003000 0x1000>, |
79 | <0x40002100 0x100>; | 79 | <0x40002100 0x100>; |
diff --git a/arch/arm/boot/dts/zynq-7000.dtsi b/arch/arm/boot/dts/zynq-7000.dtsi index 511180769af5..c1176abc34d9 100644 --- a/arch/arm/boot/dts/zynq-7000.dtsi +++ b/arch/arm/boot/dts/zynq-7000.dtsi | |||
@@ -24,6 +24,7 @@ | |||
24 | device_type = "cpu"; | 24 | device_type = "cpu"; |
25 | reg = <0>; | 25 | reg = <0>; |
26 | clocks = <&clkc 3>; | 26 | clocks = <&clkc 3>; |
27 | clock-latency = <1000>; | ||
27 | operating-points = < | 28 | operating-points = < |
28 | /* kHz uV */ | 29 | /* kHz uV */ |
29 | 666667 1000000 | 30 | 666667 1000000 |
@@ -54,6 +55,28 @@ | |||
54 | interrupt-parent = <&intc>; | 55 | interrupt-parent = <&intc>; |
55 | ranges; | 56 | ranges; |
56 | 57 | ||
58 | i2c0: zynq-i2c@e0004000 { | ||
59 | compatible = "cdns,i2c-r1p10"; | ||
60 | status = "disabled"; | ||
61 | clocks = <&clkc 38>; | ||
62 | interrupt-parent = <&intc>; | ||
63 | interrupts = <0 25 4>; | ||
64 | reg = <0xe0004000 0x1000>; | ||
65 | #address-cells = <1>; | ||
66 | #size-cells = <0>; | ||
67 | }; | ||
68 | |||
69 | i2c1: zynq-i2c@e0005000 { | ||
70 | compatible = "cdns,i2c-r1p10"; | ||
71 | status = "disabled"; | ||
72 | clocks = <&clkc 39>; | ||
73 | interrupt-parent = <&intc>; | ||
74 | interrupts = <0 48 4>; | ||
75 | reg = <0xe0005000 0x1000>; | ||
76 | #address-cells = <1>; | ||
77 | #size-cells = <0>; | ||
78 | }; | ||
79 | |||
57 | intc: interrupt-controller@f8f01000 { | 80 | intc: interrupt-controller@f8f01000 { |
58 | compatible = "arm,cortex-a9-gic"; | 81 | compatible = "arm,cortex-a9-gic"; |
59 | #interrupt-cells = <3>; | 82 | #interrupt-cells = <3>; |
diff --git a/arch/arm/boot/dts/zynq-zc702.dts b/arch/arm/boot/dts/zynq-zc702.dts index c913f77a21eb..5e09cee33d42 100644 --- a/arch/arm/boot/dts/zynq-zc702.dts +++ b/arch/arm/boot/dts/zynq-zc702.dts | |||
@@ -34,6 +34,82 @@ | |||
34 | phy-mode = "rgmii"; | 34 | phy-mode = "rgmii"; |
35 | }; | 35 | }; |
36 | 36 | ||
37 | &i2c0 { | ||
38 | status = "okay"; | ||
39 | clock-frequency = <400000>; | ||
40 | |||
41 | i2cswitch@74 { | ||
42 | compatible = "nxp,pca9548"; | ||
43 | #address-cells = <1>; | ||
44 | #size-cells = <0>; | ||
45 | reg = <0x74>; | ||
46 | |||
47 | i2c@0 { | ||
48 | #address-cells = <1>; | ||
49 | #size-cells = <0>; | ||
50 | reg = <0>; | ||
51 | si570: clock-generator@5d { | ||
52 | #clock-cells = <0>; | ||
53 | compatible = "silabs,si570"; | ||
54 | temperature-stability = <50>; | ||
55 | reg = <0x5d>; | ||
56 | factory-fout = <156250000>; | ||
57 | clock-frequency = <148500000>; | ||
58 | }; | ||
59 | }; | ||
60 | |||
61 | i2c@2 { | ||
62 | #address-cells = <1>; | ||
63 | #size-cells = <0>; | ||
64 | reg = <2>; | ||
65 | eeprom@54 { | ||
66 | compatible = "at,24c08"; | ||
67 | reg = <0x54>; | ||
68 | }; | ||
69 | }; | ||
70 | |||
71 | i2c@3 { | ||
72 | #address-cells = <1>; | ||
73 | #size-cells = <0>; | ||
74 | reg = <3>; | ||
75 | gpio@21 { | ||
76 | compatible = "ti,tca6416"; | ||
77 | reg = <0x21>; | ||
78 | gpio-controller; | ||
79 | #gpio-cells = <2>; | ||
80 | }; | ||
81 | }; | ||
82 | |||
83 | i2c@4 { | ||
84 | #address-cells = <1>; | ||
85 | #size-cells = <0>; | ||
86 | reg = <4>; | ||
87 | rtc@51 { | ||
88 | compatible = "nxp,pcf8563"; | ||
89 | reg = <0x51>; | ||
90 | }; | ||
91 | }; | ||
92 | |||
93 | i2c@7 { | ||
94 | #address-cells = <1>; | ||
95 | #size-cells = <0>; | ||
96 | reg = <7>; | ||
97 | hwmon@52 { | ||
98 | compatible = "ti,ucd9248"; | ||
99 | reg = <52>; | ||
100 | }; | ||
101 | hwmon@53 { | ||
102 | compatible = "ti,ucd9248"; | ||
103 | reg = <53>; | ||
104 | }; | ||
105 | hwmon@54 { | ||
106 | compatible = "ti,ucd9248"; | ||
107 | reg = <54>; | ||
108 | }; | ||
109 | }; | ||
110 | }; | ||
111 | }; | ||
112 | |||
37 | &sdhci0 { | 113 | &sdhci0 { |
38 | status = "okay"; | 114 | status = "okay"; |
39 | }; | 115 | }; |
diff --git a/arch/arm/boot/dts/zynq-zc706.dts b/arch/arm/boot/dts/zynq-zc706.dts index 88f62c50382e..4cc9913078cd 100644 --- a/arch/arm/boot/dts/zynq-zc706.dts +++ b/arch/arm/boot/dts/zynq-zc706.dts | |||
@@ -35,6 +35,74 @@ | |||
35 | phy-mode = "rgmii"; | 35 | phy-mode = "rgmii"; |
36 | }; | 36 | }; |
37 | 37 | ||
38 | &i2c0 { | ||
39 | status = "okay"; | ||
40 | clock-frequency = <400000>; | ||
41 | |||
42 | i2cswitch@74 { | ||
43 | compatible = "nxp,pca9548"; | ||
44 | #address-cells = <1>; | ||
45 | #size-cells = <0>; | ||
46 | reg = <0x74>; | ||
47 | |||
48 | i2c@0 { | ||
49 | #address-cells = <1>; | ||
50 | #size-cells = <0>; | ||
51 | reg = <0>; | ||
52 | si570: clock-generator@5d { | ||
53 | #clock-cells = <0>; | ||
54 | compatible = "silabs,si570"; | ||
55 | temperature-stability = <50>; | ||
56 | reg = <0x5d>; | ||
57 | factory-fout = <156250000>; | ||
58 | clock-frequency = <148500000>; | ||
59 | }; | ||
60 | }; | ||
61 | |||
62 | i2c@2 { | ||
63 | #address-cells = <1>; | ||
64 | #size-cells = <0>; | ||
65 | reg = <2>; | ||
66 | eeprom@54 { | ||
67 | compatible = "at,24c08"; | ||
68 | reg = <0x54>; | ||
69 | }; | ||
70 | }; | ||
71 | |||
72 | i2c@3 { | ||
73 | #address-cells = <1>; | ||
74 | #size-cells = <0>; | ||
75 | reg = <3>; | ||
76 | gpio@21 { | ||
77 | compatible = "ti,tca6416"; | ||
78 | reg = <0x21>; | ||
79 | gpio-controller; | ||
80 | #gpio-cells = <2>; | ||
81 | }; | ||
82 | }; | ||
83 | |||
84 | i2c@4 { | ||
85 | #address-cells = <1>; | ||
86 | #size-cells = <0>; | ||
87 | reg = <4>; | ||
88 | rtc@51 { | ||
89 | compatible = "nxp,pcf8563"; | ||
90 | reg = <0x51>; | ||
91 | }; | ||
92 | }; | ||
93 | |||
94 | i2c@7 { | ||
95 | #address-cells = <1>; | ||
96 | #size-cells = <0>; | ||
97 | reg = <7>; | ||
98 | ucd90120@65 { | ||
99 | compatible = "ti,ucd90120"; | ||
100 | reg = <0x65>; | ||
101 | }; | ||
102 | }; | ||
103 | }; | ||
104 | }; | ||
105 | |||
38 | &sdhci0 { | 106 | &sdhci0 { |
39 | status = "okay"; | 107 | status = "okay"; |
40 | }; | 108 | }; |
diff --git a/arch/arm/common/bL_switcher.c b/arch/arm/common/bL_switcher.c index 5774b6ea7ad5..f01c0ee0c87e 100644 --- a/arch/arm/common/bL_switcher.c +++ b/arch/arm/common/bL_switcher.c | |||
@@ -797,10 +797,8 @@ static int __init bL_switcher_init(void) | |||
797 | { | 797 | { |
798 | int ret; | 798 | int ret; |
799 | 799 | ||
800 | if (MAX_NR_CLUSTERS != 2) { | 800 | if (!mcpm_is_available()) |
801 | pr_err("%s: only dual cluster systems are supported\n", __func__); | 801 | return -ENODEV; |
802 | return -EINVAL; | ||
803 | } | ||
804 | 802 | ||
805 | cpu_notifier(bL_switcher_hotplug_callback, 0); | 803 | cpu_notifier(bL_switcher_hotplug_callback, 0); |
806 | 804 | ||
diff --git a/arch/arm/common/mcpm_entry.c b/arch/arm/common/mcpm_entry.c index 1e361abc29eb..86fd60fefbc9 100644 --- a/arch/arm/common/mcpm_entry.c +++ b/arch/arm/common/mcpm_entry.c | |||
@@ -48,6 +48,11 @@ int __init mcpm_platform_register(const struct mcpm_platform_ops *ops) | |||
48 | return 0; | 48 | return 0; |
49 | } | 49 | } |
50 | 50 | ||
51 | bool mcpm_is_available(void) | ||
52 | { | ||
53 | return (platform_ops) ? true : false; | ||
54 | } | ||
55 | |||
51 | int mcpm_cpu_power_up(unsigned int cpu, unsigned int cluster) | 56 | int mcpm_cpu_power_up(unsigned int cpu, unsigned int cluster) |
52 | { | 57 | { |
53 | if (!platform_ops) | 58 | if (!platform_ops) |
diff --git a/arch/arm/configs/omap2plus_defconfig b/arch/arm/configs/omap2plus_defconfig index a9667957b757..a4e8d017f25b 100644 --- a/arch/arm/configs/omap2plus_defconfig +++ b/arch/arm/configs/omap2plus_defconfig | |||
@@ -226,7 +226,7 @@ CONFIG_USB_DWC3=m | |||
226 | CONFIG_USB_TEST=y | 226 | CONFIG_USB_TEST=y |
227 | CONFIG_NOP_USB_XCEIV=y | 227 | CONFIG_NOP_USB_XCEIV=y |
228 | CONFIG_OMAP_USB2=y | 228 | CONFIG_OMAP_USB2=y |
229 | CONFIG_OMAP_USB3=y | 229 | CONFIG_TI_PIPE3=y |
230 | CONFIG_AM335X_PHY_USB=y | 230 | CONFIG_AM335X_PHY_USB=y |
231 | CONFIG_USB_GADGET=y | 231 | CONFIG_USB_GADGET=y |
232 | CONFIG_USB_GADGET_DEBUG=y | 232 | CONFIG_USB_GADGET_DEBUG=y |
diff --git a/arch/arm/configs/u300_defconfig b/arch/arm/configs/u300_defconfig index fd81a1b99cce..aaa95ab606a8 100644 --- a/arch/arm/configs/u300_defconfig +++ b/arch/arm/configs/u300_defconfig | |||
@@ -11,6 +11,7 @@ CONFIG_MODULES=y | |||
11 | CONFIG_MODULE_UNLOAD=y | 11 | CONFIG_MODULE_UNLOAD=y |
12 | # CONFIG_LBDAF is not set | 12 | # CONFIG_LBDAF is not set |
13 | # CONFIG_BLK_DEV_BSG is not set | 13 | # CONFIG_BLK_DEV_BSG is not set |
14 | CONFIG_PARTITION_ADVANCED=y | ||
14 | # CONFIG_IOSCHED_CFQ is not set | 15 | # CONFIG_IOSCHED_CFQ is not set |
15 | # CONFIG_ARCH_MULTI_V7 is not set | 16 | # CONFIG_ARCH_MULTI_V7 is not set |
16 | CONFIG_ARCH_U300=y | 17 | CONFIG_ARCH_U300=y |
@@ -21,7 +22,6 @@ CONFIG_ZBOOT_ROM_TEXT=0x0 | |||
21 | CONFIG_ZBOOT_ROM_BSS=0x0 | 22 | CONFIG_ZBOOT_ROM_BSS=0x0 |
22 | CONFIG_CMDLINE="root=/dev/ram0 rw rootfstype=rootfs console=ttyAMA0,115200n8 lpj=515072" | 23 | CONFIG_CMDLINE="root=/dev/ram0 rw rootfstype=rootfs console=ttyAMA0,115200n8 lpj=515072" |
23 | CONFIG_CPU_IDLE=y | 24 | CONFIG_CPU_IDLE=y |
24 | CONFIG_FPE_NWFPE=y | ||
25 | # CONFIG_SUSPEND is not set | 25 | # CONFIG_SUSPEND is not set |
26 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | 26 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" |
27 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set | 27 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set |
@@ -64,8 +64,8 @@ CONFIG_TMPFS=y | |||
64 | CONFIG_NLS_CODEPAGE_437=y | 64 | CONFIG_NLS_CODEPAGE_437=y |
65 | CONFIG_NLS_ISO8859_1=y | 65 | CONFIG_NLS_ISO8859_1=y |
66 | CONFIG_PRINTK_TIME=y | 66 | CONFIG_PRINTK_TIME=y |
67 | CONFIG_DEBUG_INFO=y | ||
67 | CONFIG_DEBUG_FS=y | 68 | CONFIG_DEBUG_FS=y |
68 | # CONFIG_SCHED_DEBUG is not set | 69 | # CONFIG_SCHED_DEBUG is not set |
69 | CONFIG_TIMER_STATS=y | 70 | CONFIG_TIMER_STATS=y |
70 | # CONFIG_DEBUG_PREEMPT is not set | 71 | # CONFIG_DEBUG_PREEMPT is not set |
71 | CONFIG_DEBUG_INFO=y | ||
diff --git a/arch/arm/configs/u8500_defconfig b/arch/arm/configs/u8500_defconfig index 65f77885c167..d219d6a43238 100644 --- a/arch/arm/configs/u8500_defconfig +++ b/arch/arm/configs/u8500_defconfig | |||
@@ -1,16 +1,16 @@ | |||
1 | # CONFIG_SWAP is not set | 1 | # CONFIG_SWAP is not set |
2 | CONFIG_SYSVIPC=y | 2 | CONFIG_SYSVIPC=y |
3 | CONFIG_NO_HZ=y | 3 | CONFIG_NO_HZ_IDLE=y |
4 | CONFIG_HIGH_RES_TIMERS=y | 4 | CONFIG_HIGH_RES_TIMERS=y |
5 | CONFIG_BLK_DEV_INITRD=y | 5 | CONFIG_BLK_DEV_INITRD=y |
6 | CONFIG_KALLSYMS_ALL=y | 6 | CONFIG_KALLSYMS_ALL=y |
7 | CONFIG_MODULES=y | 7 | CONFIG_MODULES=y |
8 | CONFIG_MODULE_UNLOAD=y | 8 | CONFIG_MODULE_UNLOAD=y |
9 | # CONFIG_BLK_DEV_BSG is not set | 9 | # CONFIG_BLK_DEV_BSG is not set |
10 | CONFIG_PARTITION_ADVANCED=y | ||
10 | CONFIG_ARCH_U8500=y | 11 | CONFIG_ARCH_U8500=y |
11 | CONFIG_MACH_HREFV60=y | 12 | CONFIG_MACH_HREFV60=y |
12 | CONFIG_MACH_SNOWBALL=y | 13 | CONFIG_MACH_SNOWBALL=y |
13 | CONFIG_MACH_UX500_DT=y | ||
14 | CONFIG_SMP=y | 14 | CONFIG_SMP=y |
15 | CONFIG_NR_CPUS=2 | 15 | CONFIG_NR_CPUS=2 |
16 | CONFIG_PREEMPT=y | 16 | CONFIG_PREEMPT=y |
@@ -34,16 +34,22 @@ CONFIG_IP_PNP=y | |||
34 | CONFIG_IP_PNP_DHCP=y | 34 | CONFIG_IP_PNP_DHCP=y |
35 | CONFIG_NETFILTER=y | 35 | CONFIG_NETFILTER=y |
36 | CONFIG_PHONET=y | 36 | CONFIG_PHONET=y |
37 | # CONFIG_WIRELESS is not set | 37 | CONFIG_CFG80211=y |
38 | CONFIG_CFG80211_DEBUGFS=y | ||
39 | CONFIG_MAC80211=y | ||
40 | CONFIG_MAC80211_LEDS=y | ||
38 | CONFIG_CAIF=y | 41 | CONFIG_CAIF=y |
39 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | 42 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" |
43 | CONFIG_DEVTMPFS=y | ||
44 | CONFIG_DEVTMPFS_MOUNT=y | ||
40 | CONFIG_BLK_DEV_RAM=y | 45 | CONFIG_BLK_DEV_RAM=y |
41 | CONFIG_BLK_DEV_RAM_SIZE=65536 | 46 | CONFIG_BLK_DEV_RAM_SIZE=65536 |
42 | CONFIG_SENSORS_BH1780=y | 47 | CONFIG_SENSORS_BH1780=y |
43 | CONFIG_NETDEVICES=y | 48 | CONFIG_NETDEVICES=y |
44 | CONFIG_SMSC911X=y | 49 | CONFIG_SMSC911X=y |
45 | CONFIG_SMSC_PHY=y | 50 | CONFIG_SMSC_PHY=y |
46 | # CONFIG_WLAN is not set | 51 | CONFIG_CW1200=y |
52 | CONFIG_CW1200_WLAN_SDIO=y | ||
47 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set | 53 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set |
48 | CONFIG_INPUT_EVDEV=y | 54 | CONFIG_INPUT_EVDEV=y |
49 | # CONFIG_KEYBOARD_ATKBD is not set | 55 | # CONFIG_KEYBOARD_ATKBD is not set |
@@ -85,15 +91,12 @@ CONFIG_AB8500_USB=y | |||
85 | CONFIG_USB_GADGET=y | 91 | CONFIG_USB_GADGET=y |
86 | CONFIG_USB_ETH=m | 92 | CONFIG_USB_ETH=m |
87 | CONFIG_MMC=y | 93 | CONFIG_MMC=y |
88 | CONFIG_MMC_UNSAFE_RESUME=y | ||
89 | # CONFIG_MMC_BLOCK_BOUNCE is not set | ||
90 | CONFIG_MMC_ARMMMCI=y | 94 | CONFIG_MMC_ARMMMCI=y |
91 | CONFIG_NEW_LEDS=y | 95 | CONFIG_NEW_LEDS=y |
92 | CONFIG_LEDS_CLASS=y | 96 | CONFIG_LEDS_CLASS=y |
93 | CONFIG_LEDS_LM3530=y | 97 | CONFIG_LEDS_LM3530=y |
94 | CONFIG_LEDS_GPIO=y | 98 | CONFIG_LEDS_GPIO=y |
95 | CONFIG_LEDS_LP5521=y | 99 | CONFIG_LEDS_LP5521=y |
96 | CONFIG_LEDS_TRIGGERS=y | ||
97 | CONFIG_LEDS_TRIGGER_HEARTBEAT=y | 100 | CONFIG_LEDS_TRIGGER_HEARTBEAT=y |
98 | CONFIG_RTC_CLASS=y | 101 | CONFIG_RTC_CLASS=y |
99 | CONFIG_RTC_DRV_AB8500=y | 102 | CONFIG_RTC_DRV_AB8500=y |
@@ -103,6 +106,11 @@ CONFIG_STE_DMA40=y | |||
103 | CONFIG_STAGING=y | 106 | CONFIG_STAGING=y |
104 | CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI4=y | 107 | CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI4=y |
105 | CONFIG_HSEM_U8500=y | 108 | CONFIG_HSEM_U8500=y |
109 | CONFIG_IIO=y | ||
110 | CONFIG_IIO_ST_ACCEL_3AXIS=y | ||
111 | CONFIG_IIO_ST_GYRO_3AXIS=y | ||
112 | CONFIG_IIO_ST_MAGN_3AXIS=y | ||
113 | CONFIG_IIO_ST_PRESS=y | ||
106 | CONFIG_EXT2_FS=y | 114 | CONFIG_EXT2_FS=y |
107 | CONFIG_EXT2_FS_XATTR=y | 115 | CONFIG_EXT2_FS_XATTR=y |
108 | CONFIG_EXT2_FS_POSIX_ACL=y | 116 | CONFIG_EXT2_FS_POSIX_ACL=y |
@@ -110,8 +118,6 @@ CONFIG_EXT2_FS_SECURITY=y | |||
110 | CONFIG_EXT3_FS=y | 118 | CONFIG_EXT3_FS=y |
111 | CONFIG_EXT4_FS=y | 119 | CONFIG_EXT4_FS=y |
112 | CONFIG_VFAT_FS=y | 120 | CONFIG_VFAT_FS=y |
113 | CONFIG_DEVTMPFS=y | ||
114 | CONFIG_DEVTMPFS_MOUNT=y | ||
115 | CONFIG_TMPFS=y | 121 | CONFIG_TMPFS=y |
116 | CONFIG_TMPFS_POSIX_ACL=y | 122 | CONFIG_TMPFS_POSIX_ACL=y |
117 | # CONFIG_MISC_FILESYSTEMS is not set | 123 | # CONFIG_MISC_FILESYSTEMS is not set |
diff --git a/arch/arm/include/asm/cputype.h b/arch/arm/include/asm/cputype.h index c651e3b26ec7..4764344367d4 100644 --- a/arch/arm/include/asm/cputype.h +++ b/arch/arm/include/asm/cputype.h | |||
@@ -222,22 +222,22 @@ static inline int cpu_is_xsc3(void) | |||
222 | #endif | 222 | #endif |
223 | 223 | ||
224 | /* | 224 | /* |
225 | * Marvell's PJ4 core is based on V7 version. It has some modification | 225 | * Marvell's PJ4 and PJ4B cores are based on V7 version, |
226 | * for coprocessor setting. For this reason, we need a way to distinguish | 226 | * but require a specical sequence for enabling coprocessors. |
227 | * it. | 227 | * For this reason, we need a way to distinguish them. |
228 | */ | 228 | */ |
229 | #ifndef CONFIG_CPU_PJ4 | 229 | #if defined(CONFIG_CPU_PJ4) || defined(CONFIG_CPU_PJ4B) |
230 | #define cpu_is_pj4() 0 | ||
231 | #else | ||
232 | static inline int cpu_is_pj4(void) | 230 | static inline int cpu_is_pj4(void) |
233 | { | 231 | { |
234 | unsigned int id; | 232 | unsigned int id; |
235 | 233 | ||
236 | id = read_cpuid_id(); | 234 | id = read_cpuid_id(); |
237 | if ((id & 0xfffffff0) == 0x562f5840) | 235 | if ((id & 0xff0fff00) == 0x560f5800) |
238 | return 1; | 236 | return 1; |
239 | 237 | ||
240 | return 0; | 238 | return 0; |
241 | } | 239 | } |
240 | #else | ||
241 | #define cpu_is_pj4() 0 | ||
242 | #endif | 242 | #endif |
243 | #endif | 243 | #endif |
diff --git a/arch/arm/include/asm/div64.h b/arch/arm/include/asm/div64.h index 191ada6e4d2d..662c7bd06108 100644 --- a/arch/arm/include/asm/div64.h +++ b/arch/arm/include/asm/div64.h | |||
@@ -156,7 +156,7 @@ | |||
156 | /* Select the best insn combination to perform the */ \ | 156 | /* Select the best insn combination to perform the */ \ |
157 | /* actual __m * __n / (__p << 64) operation. */ \ | 157 | /* actual __m * __n / (__p << 64) operation. */ \ |
158 | if (!__c) { \ | 158 | if (!__c) { \ |
159 | asm ( "umull %Q0, %R0, %1, %Q2\n\t" \ | 159 | asm ( "umull %Q0, %R0, %Q1, %Q2\n\t" \ |
160 | "mov %Q0, #0" \ | 160 | "mov %Q0, #0" \ |
161 | : "=&r" (__res) \ | 161 | : "=&r" (__res) \ |
162 | : "r" (__m), "r" (__n) \ | 162 | : "r" (__m), "r" (__n) \ |
diff --git a/arch/arm/include/asm/mcpm.h b/arch/arm/include/asm/mcpm.h index 608516ebabfe..a5ff410dcdb6 100644 --- a/arch/arm/include/asm/mcpm.h +++ b/arch/arm/include/asm/mcpm.h | |||
@@ -54,6 +54,13 @@ void mcpm_set_early_poke(unsigned cpu, unsigned cluster, | |||
54 | */ | 54 | */ |
55 | 55 | ||
56 | /** | 56 | /** |
57 | * mcpm_is_available - returns whether MCPM is initialized and available | ||
58 | * | ||
59 | * This returns true or false accordingly. | ||
60 | */ | ||
61 | bool mcpm_is_available(void); | ||
62 | |||
63 | /** | ||
57 | * mcpm_cpu_power_up - make given CPU in given cluster runable | 64 | * mcpm_cpu_power_up - make given CPU in given cluster runable |
58 | * | 65 | * |
59 | * @cpu: CPU number within given cluster | 66 | * @cpu: CPU number within given cluster |
diff --git a/arch/arm/include/asm/tlb.h b/arch/arm/include/asm/tlb.h index 0baf7f0d9394..f1a0dace3efe 100644 --- a/arch/arm/include/asm/tlb.h +++ b/arch/arm/include/asm/tlb.h | |||
@@ -98,15 +98,25 @@ static inline void __tlb_alloc_page(struct mmu_gather *tlb) | |||
98 | } | 98 | } |
99 | } | 99 | } |
100 | 100 | ||
101 | static inline void tlb_flush_mmu(struct mmu_gather *tlb) | 101 | static inline void tlb_flush_mmu_tlbonly(struct mmu_gather *tlb) |
102 | { | 102 | { |
103 | tlb_flush(tlb); | 103 | tlb_flush(tlb); |
104 | } | ||
105 | |||
106 | static inline void tlb_flush_mmu_free(struct mmu_gather *tlb) | ||
107 | { | ||
104 | free_pages_and_swap_cache(tlb->pages, tlb->nr); | 108 | free_pages_and_swap_cache(tlb->pages, tlb->nr); |
105 | tlb->nr = 0; | 109 | tlb->nr = 0; |
106 | if (tlb->pages == tlb->local) | 110 | if (tlb->pages == tlb->local) |
107 | __tlb_alloc_page(tlb); | 111 | __tlb_alloc_page(tlb); |
108 | } | 112 | } |
109 | 113 | ||
114 | static inline void tlb_flush_mmu(struct mmu_gather *tlb) | ||
115 | { | ||
116 | tlb_flush_mmu_tlbonly(tlb); | ||
117 | tlb_flush_mmu_free(tlb); | ||
118 | } | ||
119 | |||
110 | static inline void | 120 | static inline void |
111 | tlb_gather_mmu(struct mmu_gather *tlb, struct mm_struct *mm, unsigned long start, unsigned long end) | 121 | tlb_gather_mmu(struct mmu_gather *tlb, struct mm_struct *mm, unsigned long start, unsigned long end) |
112 | { | 122 | { |
diff --git a/arch/arm/include/uapi/asm/unistd.h b/arch/arm/include/uapi/asm/unistd.h index fb5584d0cc05..ba94446c72d9 100644 --- a/arch/arm/include/uapi/asm/unistd.h +++ b/arch/arm/include/uapi/asm/unistd.h | |||
@@ -408,6 +408,7 @@ | |||
408 | #define __NR_finit_module (__NR_SYSCALL_BASE+379) | 408 | #define __NR_finit_module (__NR_SYSCALL_BASE+379) |
409 | #define __NR_sched_setattr (__NR_SYSCALL_BASE+380) | 409 | #define __NR_sched_setattr (__NR_SYSCALL_BASE+380) |
410 | #define __NR_sched_getattr (__NR_SYSCALL_BASE+381) | 410 | #define __NR_sched_getattr (__NR_SYSCALL_BASE+381) |
411 | #define __NR_renameat2 (__NR_SYSCALL_BASE+382) | ||
411 | 412 | ||
412 | /* | 413 | /* |
413 | * This may need to be greater than __NR_last_syscall+1 in order to | 414 | * This may need to be greater than __NR_last_syscall+1 in order to |
diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile index a766bcbaf8ad..040619c32d68 100644 --- a/arch/arm/kernel/Makefile +++ b/arch/arm/kernel/Makefile | |||
@@ -79,6 +79,7 @@ obj-$(CONFIG_CPU_XSCALE) += xscale-cp0.o | |||
79 | obj-$(CONFIG_CPU_XSC3) += xscale-cp0.o | 79 | obj-$(CONFIG_CPU_XSC3) += xscale-cp0.o |
80 | obj-$(CONFIG_CPU_MOHAWK) += xscale-cp0.o | 80 | obj-$(CONFIG_CPU_MOHAWK) += xscale-cp0.o |
81 | obj-$(CONFIG_CPU_PJ4) += pj4-cp0.o | 81 | obj-$(CONFIG_CPU_PJ4) += pj4-cp0.o |
82 | obj-$(CONFIG_CPU_PJ4B) += pj4-cp0.o | ||
82 | obj-$(CONFIG_IWMMXT) += iwmmxt.o | 83 | obj-$(CONFIG_IWMMXT) += iwmmxt.o |
83 | obj-$(CONFIG_PERF_EVENTS) += perf_regs.o | 84 | obj-$(CONFIG_PERF_EVENTS) += perf_regs.o |
84 | obj-$(CONFIG_HW_PERF_EVENTS) += perf_event.o perf_event_cpu.o | 85 | obj-$(CONFIG_HW_PERF_EVENTS) += perf_event.o perf_event_cpu.o |
diff --git a/arch/arm/kernel/calls.S b/arch/arm/kernel/calls.S index 166e945de832..8f51bdcdacbb 100644 --- a/arch/arm/kernel/calls.S +++ b/arch/arm/kernel/calls.S | |||
@@ -391,6 +391,7 @@ | |||
391 | CALL(sys_finit_module) | 391 | CALL(sys_finit_module) |
392 | /* 380 */ CALL(sys_sched_setattr) | 392 | /* 380 */ CALL(sys_sched_setattr) |
393 | CALL(sys_sched_getattr) | 393 | CALL(sys_sched_getattr) |
394 | CALL(sys_renameat2) | ||
394 | #ifndef syscalls_counted | 395 | #ifndef syscalls_counted |
395 | .equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls | 396 | .equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls |
396 | #define syscalls_counted | 397 | #define syscalls_counted |
diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S index f8c08839edf3..591d6e4a6492 100644 --- a/arch/arm/kernel/head.S +++ b/arch/arm/kernel/head.S | |||
@@ -587,7 +587,7 @@ __fixup_pv_table: | |||
587 | add r6, r6, r3 @ adjust __pv_phys_pfn_offset address | 587 | add r6, r6, r3 @ adjust __pv_phys_pfn_offset address |
588 | add r7, r7, r3 @ adjust __pv_offset address | 588 | add r7, r7, r3 @ adjust __pv_offset address |
589 | mov r0, r8, lsr #12 @ convert to PFN | 589 | mov r0, r8, lsr #12 @ convert to PFN |
590 | str r0, [r6, #LOW_OFFSET] @ save computed PHYS_OFFSET to __pv_phys_pfn_offset | 590 | str r0, [r6] @ save computed PHYS_OFFSET to __pv_phys_pfn_offset |
591 | strcc ip, [r7, #HIGH_OFFSET] @ save to __pv_offset high bits | 591 | strcc ip, [r7, #HIGH_OFFSET] @ save to __pv_offset high bits |
592 | mov r6, r3, lsr #24 @ constant for add/sub instructions | 592 | mov r6, r3, lsr #24 @ constant for add/sub instructions |
593 | teq r3, r6, lsl #24 @ must be 16MiB aligned | 593 | teq r3, r6, lsl #24 @ must be 16MiB aligned |
diff --git a/arch/arm/kernel/iwmmxt.S b/arch/arm/kernel/iwmmxt.S index a08783823b32..2452dd1bef53 100644 --- a/arch/arm/kernel/iwmmxt.S +++ b/arch/arm/kernel/iwmmxt.S | |||
@@ -19,12 +19,16 @@ | |||
19 | #include <asm/thread_info.h> | 19 | #include <asm/thread_info.h> |
20 | #include <asm/asm-offsets.h> | 20 | #include <asm/asm-offsets.h> |
21 | 21 | ||
22 | #if defined(CONFIG_CPU_PJ4) | 22 | #if defined(CONFIG_CPU_PJ4) || defined(CONFIG_CPU_PJ4B) |
23 | #define PJ4(code...) code | 23 | #define PJ4(code...) code |
24 | #define XSC(code...) | 24 | #define XSC(code...) |
25 | #else | 25 | #elif defined(CONFIG_CPU_MOHAWK) || \ |
26 | defined(CONFIG_CPU_XSC3) || \ | ||
27 | defined(CONFIG_CPU_XSCALE) | ||
26 | #define PJ4(code...) | 28 | #define PJ4(code...) |
27 | #define XSC(code...) code | 29 | #define XSC(code...) code |
30 | #else | ||
31 | #error "Unsupported iWMMXt architecture" | ||
28 | #endif | 32 | #endif |
29 | 33 | ||
30 | #define MMX_WR0 (0x00) | 34 | #define MMX_WR0 (0x00) |
diff --git a/arch/arm/kernel/machine_kexec.c b/arch/arm/kernel/machine_kexec.c index f0d180d8b29f..8cf0996aa1a8 100644 --- a/arch/arm/kernel/machine_kexec.c +++ b/arch/arm/kernel/machine_kexec.c | |||
@@ -184,3 +184,10 @@ void machine_kexec(struct kimage *image) | |||
184 | 184 | ||
185 | soft_restart(reboot_entry_phys); | 185 | soft_restart(reboot_entry_phys); |
186 | } | 186 | } |
187 | |||
188 | void arch_crash_save_vmcoreinfo(void) | ||
189 | { | ||
190 | #ifdef CONFIG_ARM_LPAE | ||
191 | VMCOREINFO_CONFIG(ARM_LPAE); | ||
192 | #endif | ||
193 | } | ||
diff --git a/arch/arm/kernel/pj4-cp0.c b/arch/arm/kernel/pj4-cp0.c index fc7208636284..8153e36b2491 100644 --- a/arch/arm/kernel/pj4-cp0.c +++ b/arch/arm/kernel/pj4-cp0.c | |||
@@ -45,7 +45,7 @@ static int iwmmxt_do(struct notifier_block *self, unsigned long cmd, void *t) | |||
45 | return NOTIFY_DONE; | 45 | return NOTIFY_DONE; |
46 | } | 46 | } |
47 | 47 | ||
48 | static struct notifier_block iwmmxt_notifier_block = { | 48 | static struct notifier_block __maybe_unused iwmmxt_notifier_block = { |
49 | .notifier_call = iwmmxt_do, | 49 | .notifier_call = iwmmxt_do, |
50 | }; | 50 | }; |
51 | 51 | ||
@@ -72,6 +72,33 @@ static void __init pj4_cp_access_write(u32 value) | |||
72 | : "=r" (temp) : "r" (value)); | 72 | : "=r" (temp) : "r" (value)); |
73 | } | 73 | } |
74 | 74 | ||
75 | static int __init pj4_get_iwmmxt_version(void) | ||
76 | { | ||
77 | u32 cp_access, wcid; | ||
78 | |||
79 | cp_access = pj4_cp_access_read(); | ||
80 | pj4_cp_access_write(cp_access | 0xf); | ||
81 | |||
82 | /* check if coprocessor 0 and 1 are available */ | ||
83 | if ((pj4_cp_access_read() & 0xf) != 0xf) { | ||
84 | pj4_cp_access_write(cp_access); | ||
85 | return -ENODEV; | ||
86 | } | ||
87 | |||
88 | /* read iWMMXt coprocessor id register p1, c0 */ | ||
89 | __asm__ __volatile__ ("mrc p1, 0, %0, c0, c0, 0\n" : "=r" (wcid)); | ||
90 | |||
91 | pj4_cp_access_write(cp_access); | ||
92 | |||
93 | /* iWMMXt v1 */ | ||
94 | if ((wcid & 0xffffff00) == 0x56051000) | ||
95 | return 1; | ||
96 | /* iWMMXt v2 */ | ||
97 | if ((wcid & 0xffffff00) == 0x56052000) | ||
98 | return 2; | ||
99 | |||
100 | return -EINVAL; | ||
101 | } | ||
75 | 102 | ||
76 | /* | 103 | /* |
77 | * Disable CP0/CP1 on boot, and let call_fpe() and the iWMMXt lazy | 104 | * Disable CP0/CP1 on boot, and let call_fpe() and the iWMMXt lazy |
@@ -79,17 +106,26 @@ static void __init pj4_cp_access_write(u32 value) | |||
79 | */ | 106 | */ |
80 | static int __init pj4_cp0_init(void) | 107 | static int __init pj4_cp0_init(void) |
81 | { | 108 | { |
82 | u32 cp_access; | 109 | u32 __maybe_unused cp_access; |
110 | int vers; | ||
83 | 111 | ||
84 | if (!cpu_is_pj4()) | 112 | if (!cpu_is_pj4()) |
85 | return 0; | 113 | return 0; |
86 | 114 | ||
115 | vers = pj4_get_iwmmxt_version(); | ||
116 | if (vers < 0) | ||
117 | return 0; | ||
118 | |||
119 | #ifndef CONFIG_IWMMXT | ||
120 | pr_info("PJ4 iWMMXt coprocessor detected, but kernel support is missing.\n"); | ||
121 | #else | ||
87 | cp_access = pj4_cp_access_read() & ~0xf; | 122 | cp_access = pj4_cp_access_read() & ~0xf; |
88 | pj4_cp_access_write(cp_access); | 123 | pj4_cp_access_write(cp_access); |
89 | 124 | ||
90 | printk(KERN_INFO "PJ4 iWMMXt coprocessor enabled.\n"); | 125 | pr_info("PJ4 iWMMXt v%d coprocessor enabled.\n", vers); |
91 | elf_hwcap |= HWCAP_IWMMXT; | 126 | elf_hwcap |= HWCAP_IWMMXT; |
92 | thread_register_notifier(&iwmmxt_notifier_block); | 127 | thread_register_notifier(&iwmmxt_notifier_block); |
128 | #endif | ||
93 | 129 | ||
94 | return 0; | 130 | return 0; |
95 | } | 131 | } |
diff --git a/arch/arm/kernel/sys_oabi-compat.c b/arch/arm/kernel/sys_oabi-compat.c index 702bd329d9d0..e90a3148f385 100644 --- a/arch/arm/kernel/sys_oabi-compat.c +++ b/arch/arm/kernel/sys_oabi-compat.c | |||
@@ -203,9 +203,9 @@ asmlinkage long sys_oabi_fcntl64(unsigned int fd, unsigned int cmd, | |||
203 | int ret; | 203 | int ret; |
204 | 204 | ||
205 | switch (cmd) { | 205 | switch (cmd) { |
206 | case F_GETLKP: | 206 | case F_OFD_GETLK: |
207 | case F_SETLKP: | 207 | case F_OFD_SETLK: |
208 | case F_SETLKPW: | 208 | case F_OFD_SETLKW: |
209 | case F_GETLK64: | 209 | case F_GETLK64: |
210 | case F_SETLK64: | 210 | case F_SETLK64: |
211 | case F_SETLKW64: | 211 | case F_SETLKW64: |
diff --git a/arch/arm/kvm/Kconfig b/arch/arm/kvm/Kconfig index 466bd299b1a8..4be5bb150bdd 100644 --- a/arch/arm/kvm/Kconfig +++ b/arch/arm/kvm/Kconfig | |||
@@ -23,7 +23,7 @@ config KVM | |||
23 | select HAVE_KVM_CPU_RELAX_INTERCEPT | 23 | select HAVE_KVM_CPU_RELAX_INTERCEPT |
24 | select KVM_MMIO | 24 | select KVM_MMIO |
25 | select KVM_ARM_HOST | 25 | select KVM_ARM_HOST |
26 | depends on ARM_VIRT_EXT && ARM_LPAE | 26 | depends on ARM_VIRT_EXT && ARM_LPAE && !CPU_BIG_ENDIAN |
27 | ---help--- | 27 | ---help--- |
28 | Support hosting virtualized guest machines. You will also | 28 | Support hosting virtualized guest machines. You will also |
29 | need to select one or more of the processor modules below. | 29 | need to select one or more of the processor modules below. |
diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c index 80bb1e6c2c29..16f804938b8f 100644 --- a/arch/arm/kvm/mmu.c +++ b/arch/arm/kvm/mmu.c | |||
@@ -42,6 +42,8 @@ static unsigned long hyp_idmap_start; | |||
42 | static unsigned long hyp_idmap_end; | 42 | static unsigned long hyp_idmap_end; |
43 | static phys_addr_t hyp_idmap_vector; | 43 | static phys_addr_t hyp_idmap_vector; |
44 | 44 | ||
45 | #define pgd_order get_order(PTRS_PER_PGD * sizeof(pgd_t)) | ||
46 | |||
45 | #define kvm_pmd_huge(_x) (pmd_huge(_x) || pmd_trans_huge(_x)) | 47 | #define kvm_pmd_huge(_x) (pmd_huge(_x) || pmd_trans_huge(_x)) |
46 | 48 | ||
47 | static void kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa) | 49 | static void kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa) |
@@ -293,14 +295,14 @@ void free_boot_hyp_pgd(void) | |||
293 | if (boot_hyp_pgd) { | 295 | if (boot_hyp_pgd) { |
294 | unmap_range(NULL, boot_hyp_pgd, hyp_idmap_start, PAGE_SIZE); | 296 | unmap_range(NULL, boot_hyp_pgd, hyp_idmap_start, PAGE_SIZE); |
295 | unmap_range(NULL, boot_hyp_pgd, TRAMPOLINE_VA, PAGE_SIZE); | 297 | unmap_range(NULL, boot_hyp_pgd, TRAMPOLINE_VA, PAGE_SIZE); |
296 | kfree(boot_hyp_pgd); | 298 | free_pages((unsigned long)boot_hyp_pgd, pgd_order); |
297 | boot_hyp_pgd = NULL; | 299 | boot_hyp_pgd = NULL; |
298 | } | 300 | } |
299 | 301 | ||
300 | if (hyp_pgd) | 302 | if (hyp_pgd) |
301 | unmap_range(NULL, hyp_pgd, TRAMPOLINE_VA, PAGE_SIZE); | 303 | unmap_range(NULL, hyp_pgd, TRAMPOLINE_VA, PAGE_SIZE); |
302 | 304 | ||
303 | kfree(init_bounce_page); | 305 | free_page((unsigned long)init_bounce_page); |
304 | init_bounce_page = NULL; | 306 | init_bounce_page = NULL; |
305 | 307 | ||
306 | mutex_unlock(&kvm_hyp_pgd_mutex); | 308 | mutex_unlock(&kvm_hyp_pgd_mutex); |
@@ -330,7 +332,7 @@ void free_hyp_pgds(void) | |||
330 | for (addr = VMALLOC_START; is_vmalloc_addr((void*)addr); addr += PGDIR_SIZE) | 332 | for (addr = VMALLOC_START; is_vmalloc_addr((void*)addr); addr += PGDIR_SIZE) |
331 | unmap_range(NULL, hyp_pgd, KERN_TO_HYP(addr), PGDIR_SIZE); | 333 | unmap_range(NULL, hyp_pgd, KERN_TO_HYP(addr), PGDIR_SIZE); |
332 | 334 | ||
333 | kfree(hyp_pgd); | 335 | free_pages((unsigned long)hyp_pgd, pgd_order); |
334 | hyp_pgd = NULL; | 336 | hyp_pgd = NULL; |
335 | } | 337 | } |
336 | 338 | ||
@@ -1024,7 +1026,7 @@ int kvm_mmu_init(void) | |||
1024 | size_t len = __hyp_idmap_text_end - __hyp_idmap_text_start; | 1026 | size_t len = __hyp_idmap_text_end - __hyp_idmap_text_start; |
1025 | phys_addr_t phys_base; | 1027 | phys_addr_t phys_base; |
1026 | 1028 | ||
1027 | init_bounce_page = kmalloc(PAGE_SIZE, GFP_KERNEL); | 1029 | init_bounce_page = (void *)__get_free_page(GFP_KERNEL); |
1028 | if (!init_bounce_page) { | 1030 | if (!init_bounce_page) { |
1029 | kvm_err("Couldn't allocate HYP init bounce page\n"); | 1031 | kvm_err("Couldn't allocate HYP init bounce page\n"); |
1030 | err = -ENOMEM; | 1032 | err = -ENOMEM; |
@@ -1050,8 +1052,9 @@ int kvm_mmu_init(void) | |||
1050 | (unsigned long)phys_base); | 1052 | (unsigned long)phys_base); |
1051 | } | 1053 | } |
1052 | 1054 | ||
1053 | hyp_pgd = kzalloc(PTRS_PER_PGD * sizeof(pgd_t), GFP_KERNEL); | 1055 | hyp_pgd = (pgd_t *)__get_free_pages(GFP_KERNEL | __GFP_ZERO, pgd_order); |
1054 | boot_hyp_pgd = kzalloc(PTRS_PER_PGD * sizeof(pgd_t), GFP_KERNEL); | 1056 | boot_hyp_pgd = (pgd_t *)__get_free_pages(GFP_KERNEL | __GFP_ZERO, pgd_order); |
1057 | |||
1055 | if (!hyp_pgd || !boot_hyp_pgd) { | 1058 | if (!hyp_pgd || !boot_hyp_pgd) { |
1056 | kvm_err("Hyp mode PGD not allocated\n"); | 1059 | kvm_err("Hyp mode PGD not allocated\n"); |
1057 | err = -ENOMEM; | 1060 | err = -ENOMEM; |
diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c index 8b1b0a870025..a0282928e9c1 100644 --- a/arch/arm/mach-at91/at91sam9260_devices.c +++ b/arch/arm/mach-at91/at91sam9260_devices.c | |||
@@ -1296,7 +1296,7 @@ static struct resource adc_resources[] = { | |||
1296 | }; | 1296 | }; |
1297 | 1297 | ||
1298 | static struct platform_device at91_adc_device = { | 1298 | static struct platform_device at91_adc_device = { |
1299 | .name = "at91_adc", | 1299 | .name = "at91sam9260-adc", |
1300 | .id = -1, | 1300 | .id = -1, |
1301 | .dev = { | 1301 | .dev = { |
1302 | .platform_data = &adc_data, | 1302 | .platform_data = &adc_data, |
diff --git a/arch/arm/mach-at91/at91sam9g45_devices.c b/arch/arm/mach-at91/at91sam9g45_devices.c index 77b04c2edd78..dab362c06487 100644 --- a/arch/arm/mach-at91/at91sam9g45_devices.c +++ b/arch/arm/mach-at91/at91sam9g45_devices.c | |||
@@ -1204,7 +1204,7 @@ static struct resource adc_resources[] = { | |||
1204 | }; | 1204 | }; |
1205 | 1205 | ||
1206 | static struct platform_device at91_adc_device = { | 1206 | static struct platform_device at91_adc_device = { |
1207 | .name = "at91_adc", | 1207 | .name = "at91sam9g45-adc", |
1208 | .id = -1, | 1208 | .id = -1, |
1209 | .dev = { | 1209 | .dev = { |
1210 | .platform_data = &adc_data, | 1210 | .platform_data = &adc_data, |
diff --git a/arch/arm/mach-imx/clk-imx6q.c b/arch/arm/mach-imx/clk-imx6q.c index b0e7f9d2c245..2b4d6acfa34a 100644 --- a/arch/arm/mach-imx/clk-imx6q.c +++ b/arch/arm/mach-imx/clk-imx6q.c | |||
@@ -208,8 +208,8 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node) | |||
208 | * the "output_enable" bit as a gate, even though it's really just | 208 | * the "output_enable" bit as a gate, even though it's really just |
209 | * enabling clock output. | 209 | * enabling clock output. |
210 | */ | 210 | */ |
211 | clk[lvds1_gate] = imx_clk_gate("lvds1_gate", "dummy", base + 0x160, 10); | 211 | clk[lvds1_gate] = imx_clk_gate("lvds1_gate", "lvds1_sel", base + 0x160, 10); |
212 | clk[lvds2_gate] = imx_clk_gate("lvds2_gate", "dummy", base + 0x160, 11); | 212 | clk[lvds2_gate] = imx_clk_gate("lvds2_gate", "lvds2_sel", base + 0x160, 11); |
213 | 213 | ||
214 | /* name parent_name reg idx */ | 214 | /* name parent_name reg idx */ |
215 | clk[pll2_pfd0_352m] = imx_clk_pfd("pll2_pfd0_352m", "pll2_bus", base + 0x100, 0); | 215 | clk[pll2_pfd0_352m] = imx_clk_pfd("pll2_pfd0_352m", "pll2_bus", base + 0x100, 0); |
@@ -258,14 +258,14 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node) | |||
258 | clk[ipu2_sel] = imx_clk_mux("ipu2_sel", base + 0x3c, 14, 2, ipu_sels, ARRAY_SIZE(ipu_sels)); | 258 | clk[ipu2_sel] = imx_clk_mux("ipu2_sel", base + 0x3c, 14, 2, ipu_sels, ARRAY_SIZE(ipu_sels)); |
259 | clk[ldb_di0_sel] = imx_clk_mux_flags("ldb_di0_sel", base + 0x2c, 9, 3, ldb_di_sels, ARRAY_SIZE(ldb_di_sels), CLK_SET_RATE_PARENT); | 259 | clk[ldb_di0_sel] = imx_clk_mux_flags("ldb_di0_sel", base + 0x2c, 9, 3, ldb_di_sels, ARRAY_SIZE(ldb_di_sels), CLK_SET_RATE_PARENT); |
260 | clk[ldb_di1_sel] = imx_clk_mux_flags("ldb_di1_sel", base + 0x2c, 12, 3, ldb_di_sels, ARRAY_SIZE(ldb_di_sels), CLK_SET_RATE_PARENT); | 260 | clk[ldb_di1_sel] = imx_clk_mux_flags("ldb_di1_sel", base + 0x2c, 12, 3, ldb_di_sels, ARRAY_SIZE(ldb_di_sels), CLK_SET_RATE_PARENT); |
261 | clk[ipu1_di0_pre_sel] = imx_clk_mux("ipu1_di0_pre_sel", base + 0x34, 6, 3, ipu_di_pre_sels, ARRAY_SIZE(ipu_di_pre_sels)); | 261 | clk[ipu1_di0_pre_sel] = imx_clk_mux_flags("ipu1_di0_pre_sel", base + 0x34, 6, 3, ipu_di_pre_sels, ARRAY_SIZE(ipu_di_pre_sels), CLK_SET_RATE_PARENT); |
262 | clk[ipu1_di1_pre_sel] = imx_clk_mux("ipu1_di1_pre_sel", base + 0x34, 15, 3, ipu_di_pre_sels, ARRAY_SIZE(ipu_di_pre_sels)); | 262 | clk[ipu1_di1_pre_sel] = imx_clk_mux_flags("ipu1_di1_pre_sel", base + 0x34, 15, 3, ipu_di_pre_sels, ARRAY_SIZE(ipu_di_pre_sels), CLK_SET_RATE_PARENT); |
263 | clk[ipu2_di0_pre_sel] = imx_clk_mux("ipu2_di0_pre_sel", base + 0x38, 6, 3, ipu_di_pre_sels, ARRAY_SIZE(ipu_di_pre_sels)); | 263 | clk[ipu2_di0_pre_sel] = imx_clk_mux_flags("ipu2_di0_pre_sel", base + 0x38, 6, 3, ipu_di_pre_sels, ARRAY_SIZE(ipu_di_pre_sels), CLK_SET_RATE_PARENT); |
264 | clk[ipu2_di1_pre_sel] = imx_clk_mux("ipu2_di1_pre_sel", base + 0x38, 15, 3, ipu_di_pre_sels, ARRAY_SIZE(ipu_di_pre_sels)); | 264 | clk[ipu2_di1_pre_sel] = imx_clk_mux_flags("ipu2_di1_pre_sel", base + 0x38, 15, 3, ipu_di_pre_sels, ARRAY_SIZE(ipu_di_pre_sels), CLK_SET_RATE_PARENT); |
265 | clk[ipu1_di0_sel] = imx_clk_mux("ipu1_di0_sel", base + 0x34, 0, 3, ipu1_di0_sels, ARRAY_SIZE(ipu1_di0_sels)); | 265 | clk[ipu1_di0_sel] = imx_clk_mux_flags("ipu1_di0_sel", base + 0x34, 0, 3, ipu1_di0_sels, ARRAY_SIZE(ipu1_di0_sels), CLK_SET_RATE_PARENT); |
266 | clk[ipu1_di1_sel] = imx_clk_mux("ipu1_di1_sel", base + 0x34, 9, 3, ipu1_di1_sels, ARRAY_SIZE(ipu1_di1_sels)); | 266 | clk[ipu1_di1_sel] = imx_clk_mux_flags("ipu1_di1_sel", base + 0x34, 9, 3, ipu1_di1_sels, ARRAY_SIZE(ipu1_di1_sels), CLK_SET_RATE_PARENT); |
267 | clk[ipu2_di0_sel] = imx_clk_mux("ipu2_di0_sel", base + 0x38, 0, 3, ipu2_di0_sels, ARRAY_SIZE(ipu2_di0_sels)); | 267 | clk[ipu2_di0_sel] = imx_clk_mux_flags("ipu2_di0_sel", base + 0x38, 0, 3, ipu2_di0_sels, ARRAY_SIZE(ipu2_di0_sels), CLK_SET_RATE_PARENT); |
268 | clk[ipu2_di1_sel] = imx_clk_mux("ipu2_di1_sel", base + 0x38, 9, 3, ipu2_di1_sels, ARRAY_SIZE(ipu2_di1_sels)); | 268 | clk[ipu2_di1_sel] = imx_clk_mux_flags("ipu2_di1_sel", base + 0x38, 9, 3, ipu2_di1_sels, ARRAY_SIZE(ipu2_di1_sels), CLK_SET_RATE_PARENT); |
269 | clk[hsi_tx_sel] = imx_clk_mux("hsi_tx_sel", base + 0x30, 28, 1, hsi_tx_sels, ARRAY_SIZE(hsi_tx_sels)); | 269 | clk[hsi_tx_sel] = imx_clk_mux("hsi_tx_sel", base + 0x30, 28, 1, hsi_tx_sels, ARRAY_SIZE(hsi_tx_sels)); |
270 | clk[pcie_axi_sel] = imx_clk_mux("pcie_axi_sel", base + 0x18, 10, 1, pcie_axi_sels, ARRAY_SIZE(pcie_axi_sels)); | 270 | clk[pcie_axi_sel] = imx_clk_mux("pcie_axi_sel", base + 0x18, 10, 1, pcie_axi_sels, ARRAY_SIZE(pcie_axi_sels)); |
271 | clk[ssi1_sel] = imx_clk_fixup_mux("ssi1_sel", base + 0x1c, 10, 2, ssi_sels, ARRAY_SIZE(ssi_sels), imx_cscmr1_fixup); | 271 | clk[ssi1_sel] = imx_clk_fixup_mux("ssi1_sel", base + 0x1c, 10, 2, ssi_sels, ARRAY_SIZE(ssi_sels), imx_cscmr1_fixup); |
@@ -445,6 +445,15 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node) | |||
445 | clk_set_parent(clk[ldb_di1_sel], clk[pll5_video_div]); | 445 | clk_set_parent(clk[ldb_di1_sel], clk[pll5_video_div]); |
446 | } | 446 | } |
447 | 447 | ||
448 | clk_set_parent(clk[ipu1_di0_pre_sel], clk[pll5_video_div]); | ||
449 | clk_set_parent(clk[ipu1_di1_pre_sel], clk[pll5_video_div]); | ||
450 | clk_set_parent(clk[ipu2_di0_pre_sel], clk[pll5_video_div]); | ||
451 | clk_set_parent(clk[ipu2_di1_pre_sel], clk[pll5_video_div]); | ||
452 | clk_set_parent(clk[ipu1_di0_sel], clk[ipu1_di0_pre]); | ||
453 | clk_set_parent(clk[ipu1_di1_sel], clk[ipu1_di1_pre]); | ||
454 | clk_set_parent(clk[ipu2_di0_sel], clk[ipu2_di0_pre]); | ||
455 | clk_set_parent(clk[ipu2_di1_sel], clk[ipu2_di1_pre]); | ||
456 | |||
448 | /* | 457 | /* |
449 | * The gpmi needs 100MHz frequency in the EDO/Sync mode, | 458 | * The gpmi needs 100MHz frequency in the EDO/Sync mode, |
450 | * We can not get the 100MHz from the pll2_pfd0_352m. | 459 | * We can not get the 100MHz from the pll2_pfd0_352m. |
diff --git a/arch/arm/mach-omap2/board-rx51-video.c b/arch/arm/mach-omap2/board-rx51-video.c index 43a90c8d6837..9cfebc5c7455 100644 --- a/arch/arm/mach-omap2/board-rx51-video.c +++ b/arch/arm/mach-omap2/board-rx51-video.c | |||
@@ -48,7 +48,7 @@ static struct omap_dss_board_info rx51_dss_board_info = { | |||
48 | 48 | ||
49 | static int __init rx51_video_init(void) | 49 | static int __init rx51_video_init(void) |
50 | { | 50 | { |
51 | if (!machine_is_nokia_rx51() && !of_machine_is_compatible("nokia,omap3-n900")) | 51 | if (!machine_is_nokia_rx51()) |
52 | return 0; | 52 | return 0; |
53 | 53 | ||
54 | if (omap_mux_init_gpio(RX51_LCD_RESET_GPIO, OMAP_PIN_OUTPUT)) { | 54 | if (omap_mux_init_gpio(RX51_LCD_RESET_GPIO, OMAP_PIN_OUTPUT)) { |
diff --git a/arch/arm/mach-omap2/clkt_dpll.c b/arch/arm/mach-omap2/clkt_dpll.c index 2649ce445845..332af927f4d3 100644 --- a/arch/arm/mach-omap2/clkt_dpll.c +++ b/arch/arm/mach-omap2/clkt_dpll.c | |||
@@ -209,7 +209,7 @@ u8 omap2_init_dpll_parent(struct clk_hw *hw) | |||
209 | if (v == OMAP3XXX_EN_DPLL_LPBYPASS || | 209 | if (v == OMAP3XXX_EN_DPLL_LPBYPASS || |
210 | v == OMAP3XXX_EN_DPLL_FRBYPASS) | 210 | v == OMAP3XXX_EN_DPLL_FRBYPASS) |
211 | return 1; | 211 | return 1; |
212 | } else if (soc_is_am33xx() || cpu_is_omap44xx()) { | 212 | } else if (soc_is_am33xx() || cpu_is_omap44xx() || soc_is_am43xx()) { |
213 | if (v == OMAP4XXX_EN_DPLL_LPBYPASS || | 213 | if (v == OMAP4XXX_EN_DPLL_LPBYPASS || |
214 | v == OMAP4XXX_EN_DPLL_FRBYPASS || | 214 | v == OMAP4XXX_EN_DPLL_FRBYPASS || |
215 | v == OMAP4XXX_EN_DPLL_MNBYPASS) | 215 | v == OMAP4XXX_EN_DPLL_MNBYPASS) |
@@ -255,7 +255,7 @@ unsigned long omap2_get_dpll_rate(struct clk_hw_omap *clk) | |||
255 | if (v == OMAP3XXX_EN_DPLL_LPBYPASS || | 255 | if (v == OMAP3XXX_EN_DPLL_LPBYPASS || |
256 | v == OMAP3XXX_EN_DPLL_FRBYPASS) | 256 | v == OMAP3XXX_EN_DPLL_FRBYPASS) |
257 | return __clk_get_rate(dd->clk_bypass); | 257 | return __clk_get_rate(dd->clk_bypass); |
258 | } else if (soc_is_am33xx() || cpu_is_omap44xx()) { | 258 | } else if (soc_is_am33xx() || cpu_is_omap44xx() || soc_is_am43xx()) { |
259 | if (v == OMAP4XXX_EN_DPLL_LPBYPASS || | 259 | if (v == OMAP4XXX_EN_DPLL_LPBYPASS || |
260 | v == OMAP4XXX_EN_DPLL_FRBYPASS || | 260 | v == OMAP4XXX_EN_DPLL_FRBYPASS || |
261 | v == OMAP4XXX_EN_DPLL_MNBYPASS) | 261 | v == OMAP4XXX_EN_DPLL_MNBYPASS) |
diff --git a/arch/arm/mach-omap2/gpmc.c b/arch/arm/mach-omap2/gpmc.c index ab43755364f5..9fe8c949305c 100644 --- a/arch/arm/mach-omap2/gpmc.c +++ b/arch/arm/mach-omap2/gpmc.c | |||
@@ -501,7 +501,7 @@ static int gpmc_cs_delete_mem(int cs) | |||
501 | int r; | 501 | int r; |
502 | 502 | ||
503 | spin_lock(&gpmc_mem_lock); | 503 | spin_lock(&gpmc_mem_lock); |
504 | r = release_resource(&gpmc_cs_mem[cs]); | 504 | r = release_resource(res); |
505 | res->start = 0; | 505 | res->start = 0; |
506 | res->end = 0; | 506 | res->end = 0; |
507 | spin_unlock(&gpmc_mem_lock); | 507 | spin_unlock(&gpmc_mem_lock); |
@@ -527,6 +527,14 @@ static int gpmc_cs_remap(int cs, u32 base) | |||
527 | pr_err("%s: requested chip-select is disabled\n", __func__); | 527 | pr_err("%s: requested chip-select is disabled\n", __func__); |
528 | return -ENODEV; | 528 | return -ENODEV; |
529 | } | 529 | } |
530 | |||
531 | /* | ||
532 | * Make sure we ignore any device offsets from the GPMC partition | ||
533 | * allocated for the chip select and that the new base confirms | ||
534 | * to the GPMC 16MB minimum granularity. | ||
535 | */ | ||
536 | base &= ~(SZ_16M - 1); | ||
537 | |||
530 | gpmc_cs_get_memconf(cs, &old_base, &size); | 538 | gpmc_cs_get_memconf(cs, &old_base, &size); |
531 | if (base == old_base) | 539 | if (base == old_base) |
532 | return 0; | 540 | return 0; |
@@ -586,6 +594,8 @@ EXPORT_SYMBOL(gpmc_cs_request); | |||
586 | 594 | ||
587 | void gpmc_cs_free(int cs) | 595 | void gpmc_cs_free(int cs) |
588 | { | 596 | { |
597 | struct resource *res = &gpmc_cs_mem[cs]; | ||
598 | |||
589 | spin_lock(&gpmc_mem_lock); | 599 | spin_lock(&gpmc_mem_lock); |
590 | if (cs >= gpmc_cs_num || cs < 0 || !gpmc_cs_reserved(cs)) { | 600 | if (cs >= gpmc_cs_num || cs < 0 || !gpmc_cs_reserved(cs)) { |
591 | printk(KERN_ERR "Trying to free non-reserved GPMC CS%d\n", cs); | 601 | printk(KERN_ERR "Trying to free non-reserved GPMC CS%d\n", cs); |
@@ -594,7 +604,8 @@ void gpmc_cs_free(int cs) | |||
594 | return; | 604 | return; |
595 | } | 605 | } |
596 | gpmc_cs_disable_mem(cs); | 606 | gpmc_cs_disable_mem(cs); |
597 | release_resource(&gpmc_cs_mem[cs]); | 607 | if (res->flags) |
608 | release_resource(res); | ||
598 | gpmc_cs_set_reserved(cs, 0); | 609 | gpmc_cs_set_reserved(cs, 0); |
599 | spin_unlock(&gpmc_mem_lock); | 610 | spin_unlock(&gpmc_mem_lock); |
600 | } | 611 | } |
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index 1f33f5db10d5..66c60fe1104c 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c | |||
@@ -2546,11 +2546,12 @@ static int __init _init(struct omap_hwmod *oh, void *data) | |||
2546 | return -EINVAL; | 2546 | return -EINVAL; |
2547 | } | 2547 | } |
2548 | 2548 | ||
2549 | if (np) | 2549 | if (np) { |
2550 | if (of_find_property(np, "ti,no-reset-on-init", NULL)) | 2550 | if (of_find_property(np, "ti,no-reset-on-init", NULL)) |
2551 | oh->flags |= HWMOD_INIT_NO_RESET; | 2551 | oh->flags |= HWMOD_INIT_NO_RESET; |
2552 | if (of_find_property(np, "ti,no-idle-on-init", NULL)) | 2552 | if (of_find_property(np, "ti,no-idle-on-init", NULL)) |
2553 | oh->flags |= HWMOD_INIT_NO_IDLE; | 2553 | oh->flags |= HWMOD_INIT_NO_IDLE; |
2554 | } | ||
2554 | 2555 | ||
2555 | oh->_state = _HWMOD_STATE_INITIALIZED; | 2556 | oh->_state = _HWMOD_STATE_INITIALIZED; |
2556 | 2557 | ||
diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c index a123ff0070bd..71ac7d5f3385 100644 --- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | |||
@@ -1964,7 +1964,7 @@ static struct omap_hwmod_irq_info omap3xxx_usb_host_hs_irqs[] = { | |||
1964 | static struct omap_hwmod omap3xxx_usb_host_hs_hwmod = { | 1964 | static struct omap_hwmod omap3xxx_usb_host_hs_hwmod = { |
1965 | .name = "usb_host_hs", | 1965 | .name = "usb_host_hs", |
1966 | .class = &omap3xxx_usb_host_hs_hwmod_class, | 1966 | .class = &omap3xxx_usb_host_hs_hwmod_class, |
1967 | .clkdm_name = "l3_init_clkdm", | 1967 | .clkdm_name = "usbhost_clkdm", |
1968 | .mpu_irqs = omap3xxx_usb_host_hs_irqs, | 1968 | .mpu_irqs = omap3xxx_usb_host_hs_irqs, |
1969 | .main_clk = "usbhost_48m_fck", | 1969 | .main_clk = "usbhost_48m_fck", |
1970 | .prcm = { | 1970 | .prcm = { |
@@ -2047,7 +2047,7 @@ static struct omap_hwmod_irq_info omap3xxx_usb_tll_hs_irqs[] = { | |||
2047 | static struct omap_hwmod omap3xxx_usb_tll_hs_hwmod = { | 2047 | static struct omap_hwmod omap3xxx_usb_tll_hs_hwmod = { |
2048 | .name = "usb_tll_hs", | 2048 | .name = "usb_tll_hs", |
2049 | .class = &omap3xxx_usb_tll_hs_hwmod_class, | 2049 | .class = &omap3xxx_usb_tll_hs_hwmod_class, |
2050 | .clkdm_name = "l3_init_clkdm", | 2050 | .clkdm_name = "core_l4_clkdm", |
2051 | .mpu_irqs = omap3xxx_usb_tll_hs_irqs, | 2051 | .mpu_irqs = omap3xxx_usb_tll_hs_irqs, |
2052 | .main_clk = "usbtll_fck", | 2052 | .main_clk = "usbtll_fck", |
2053 | .prcm = { | 2053 | .prcm = { |
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index 1f3770a8a728..87099bb6de69 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c | |||
@@ -330,10 +330,6 @@ void omap_sram_idle(void) | |||
330 | omap3_sram_restore_context(); | 330 | omap3_sram_restore_context(); |
331 | omap2_sms_restore_context(); | 331 | omap2_sms_restore_context(); |
332 | } | 332 | } |
333 | if (core_next_state == PWRDM_POWER_OFF) | ||
334 | omap2_prm_clear_mod_reg_bits(OMAP3430_AUTO_OFF_MASK, | ||
335 | OMAP3430_GR_MOD, | ||
336 | OMAP3_PRM_VOLTCTRL_OFFSET); | ||
337 | } | 333 | } |
338 | omap3_intc_resume_idle(); | 334 | omap3_intc_resume_idle(); |
339 | 335 | ||
diff --git a/arch/arm/mach-pxa/include/mach/hx4700.h b/arch/arm/mach-pxa/include/mach/hx4700.h index 8bc02913517c..0e1bb46264f9 100644 --- a/arch/arm/mach-pxa/include/mach/hx4700.h +++ b/arch/arm/mach-pxa/include/mach/hx4700.h | |||
@@ -14,6 +14,7 @@ | |||
14 | 14 | ||
15 | #include <linux/gpio.h> | 15 | #include <linux/gpio.h> |
16 | #include <linux/mfd/asic3.h> | 16 | #include <linux/mfd/asic3.h> |
17 | #include "irqs.h" /* PXA_NR_BUILTIN_GPIO */ | ||
17 | 18 | ||
18 | #define HX4700_ASIC3_GPIO_BASE PXA_NR_BUILTIN_GPIO | 19 | #define HX4700_ASIC3_GPIO_BASE PXA_NR_BUILTIN_GPIO |
19 | #define HX4700_EGPIO_BASE (HX4700_ASIC3_GPIO_BASE + ASIC3_NUM_GPIOS) | 20 | #define HX4700_EGPIO_BASE (HX4700_ASIC3_GPIO_BASE + ASIC3_NUM_GPIOS) |
diff --git a/arch/arm/mach-rockchip/platsmp.c b/arch/arm/mach-rockchip/platsmp.c index dbfa5a26cfff..072842f6491b 100644 --- a/arch/arm/mach-rockchip/platsmp.c +++ b/arch/arm/mach-rockchip/platsmp.c | |||
@@ -152,7 +152,7 @@ static void __init rockchip_smp_prepare_cpus(unsigned int max_cpus) | |||
152 | 152 | ||
153 | node = of_find_compatible_node(NULL, NULL, "rockchip,rk3066-pmu"); | 153 | node = of_find_compatible_node(NULL, NULL, "rockchip,rk3066-pmu"); |
154 | if (!node) { | 154 | if (!node) { |
155 | pr_err("%s: could not find sram dt node\n", __func__); | 155 | pr_err("%s: could not find pmu dt node\n", __func__); |
156 | return; | 156 | return; |
157 | } | 157 | } |
158 | 158 | ||
diff --git a/arch/arm/mach-shmobile/board-armadillo800eva.c b/arch/arm/mach-shmobile/board-armadillo800eva.c index 2858f380beae..486063db2a2f 100644 --- a/arch/arm/mach-shmobile/board-armadillo800eva.c +++ b/arch/arm/mach-shmobile/board-armadillo800eva.c | |||
@@ -992,6 +992,7 @@ static struct asoc_simple_card_info fsi_wm8978_info = { | |||
992 | .platform = "sh_fsi2", | 992 | .platform = "sh_fsi2", |
993 | .daifmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBM_CFM, | 993 | .daifmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBM_CFM, |
994 | .cpu_dai = { | 994 | .cpu_dai = { |
995 | .fmt = SND_SOC_DAIFMT_IB_NF, | ||
995 | .name = "fsia-dai", | 996 | .name = "fsia-dai", |
996 | }, | 997 | }, |
997 | .codec_dai = { | 998 | .codec_dai = { |
diff --git a/arch/arm/mach-shmobile/board-lager.c b/arch/arm/mach-shmobile/board-lager.c index f0104bfe544e..18c7e0311aa6 100644 --- a/arch/arm/mach-shmobile/board-lager.c +++ b/arch/arm/mach-shmobile/board-lager.c | |||
@@ -588,14 +588,12 @@ static struct asoc_simple_card_info rsnd_card_info = { | |||
588 | .card = "SSI01-AK4643", | 588 | .card = "SSI01-AK4643", |
589 | .codec = "ak4642-codec.2-0012", | 589 | .codec = "ak4642-codec.2-0012", |
590 | .platform = "rcar_sound", | 590 | .platform = "rcar_sound", |
591 | .daifmt = SND_SOC_DAIFMT_LEFT_J, | 591 | .daifmt = SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_CBM_CFM, |
592 | .cpu_dai = { | 592 | .cpu_dai = { |
593 | .name = "rcar_sound", | 593 | .name = "rcar_sound", |
594 | .fmt = SND_SOC_DAIFMT_CBS_CFS, | ||
595 | }, | 594 | }, |
596 | .codec_dai = { | 595 | .codec_dai = { |
597 | .name = "ak4642-hifi", | 596 | .name = "ak4642-hifi", |
598 | .fmt = SND_SOC_DAIFMT_CBM_CFM, | ||
599 | .sysclk = 11289600, | 597 | .sysclk = 11289600, |
600 | }, | 598 | }, |
601 | }; | 599 | }; |
diff --git a/arch/arm/mach-shmobile/clock-r8a7778.c b/arch/arm/mach-shmobile/clock-r8a7778.c index 2009a9bc6356..9989b1b06ffd 100644 --- a/arch/arm/mach-shmobile/clock-r8a7778.c +++ b/arch/arm/mach-shmobile/clock-r8a7778.c | |||
@@ -170,7 +170,7 @@ static struct clk mstp_clks[MSTP_NR] = { | |||
170 | [MSTP010] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 10, 0), /* SSI2 */ | 170 | [MSTP010] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 10, 0), /* SSI2 */ |
171 | [MSTP009] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 9, 0), /* SSI3 */ | 171 | [MSTP009] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 9, 0), /* SSI3 */ |
172 | [MSTP008] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 8, 0), /* SRU */ | 172 | [MSTP008] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 8, 0), /* SRU */ |
173 | [MSTP007] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 7, 0), /* HSPI */ | 173 | [MSTP007] = SH_CLK_MSTP32(&s_clk, MSTPCR0, 7, 0), /* HSPI */ |
174 | }; | 174 | }; |
175 | 175 | ||
176 | static struct clk_lookup lookups[] = { | 176 | static struct clk_lookup lookups[] = { |
diff --git a/arch/arm/mach-spear/time.c b/arch/arm/mach-spear/time.c index 64790353951f..26fda4ed4d51 100644 --- a/arch/arm/mach-spear/time.c +++ b/arch/arm/mach-spear/time.c | |||
@@ -71,7 +71,7 @@ static void clockevent_set_mode(enum clock_event_mode mode, | |||
71 | static int clockevent_next_event(unsigned long evt, | 71 | static int clockevent_next_event(unsigned long evt, |
72 | struct clock_event_device *clk_event_dev); | 72 | struct clock_event_device *clk_event_dev); |
73 | 73 | ||
74 | static void spear_clocksource_init(void) | 74 | static void __init spear_clocksource_init(void) |
75 | { | 75 | { |
76 | u32 tick_rate; | 76 | u32 tick_rate; |
77 | u16 val; | 77 | u16 val; |
diff --git a/arch/arm/mach-tegra/Kconfig b/arch/arm/mach-tegra/Kconfig index 92d660f9610f..55b305d51669 100644 --- a/arch/arm/mach-tegra/Kconfig +++ b/arch/arm/mach-tegra/Kconfig | |||
@@ -70,7 +70,4 @@ config TEGRA_AHB | |||
70 | which controls AHB bus master arbitration and some | 70 | which controls AHB bus master arbitration and some |
71 | performance parameters(priority, prefech size). | 71 | performance parameters(priority, prefech size). |
72 | 72 | ||
73 | config TEGRA_EMC_SCALING_ENABLE | ||
74 | bool "Enable scaling the memory frequency" | ||
75 | |||
76 | endmenu | 73 | endmenu |
diff --git a/arch/arm/mach-vexpress/dcscb.c b/arch/arm/mach-vexpress/dcscb.c index 788495d35cf9..30b993399ed7 100644 --- a/arch/arm/mach-vexpress/dcscb.c +++ b/arch/arm/mach-vexpress/dcscb.c | |||
@@ -51,12 +51,14 @@ static int dcscb_allcpus_mask[2]; | |||
51 | static int dcscb_power_up(unsigned int cpu, unsigned int cluster) | 51 | static int dcscb_power_up(unsigned int cpu, unsigned int cluster) |
52 | { | 52 | { |
53 | unsigned int rst_hold, cpumask = (1 << cpu); | 53 | unsigned int rst_hold, cpumask = (1 << cpu); |
54 | unsigned int all_mask = dcscb_allcpus_mask[cluster]; | 54 | unsigned int all_mask; |
55 | 55 | ||
56 | pr_debug("%s: cpu %u cluster %u\n", __func__, cpu, cluster); | 56 | pr_debug("%s: cpu %u cluster %u\n", __func__, cpu, cluster); |
57 | if (cpu >= 4 || cluster >= 2) | 57 | if (cpu >= 4 || cluster >= 2) |
58 | return -EINVAL; | 58 | return -EINVAL; |
59 | 59 | ||
60 | all_mask = dcscb_allcpus_mask[cluster]; | ||
61 | |||
60 | /* | 62 | /* |
61 | * Since this is called with IRQs enabled, and no arch_spin_lock_irq | 63 | * Since this is called with IRQs enabled, and no arch_spin_lock_irq |
62 | * variant exists, we need to disable IRQs manually here. | 64 | * variant exists, we need to disable IRQs manually here. |
@@ -101,11 +103,12 @@ static void dcscb_power_down(void) | |||
101 | cpu = MPIDR_AFFINITY_LEVEL(mpidr, 0); | 103 | cpu = MPIDR_AFFINITY_LEVEL(mpidr, 0); |
102 | cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1); | 104 | cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1); |
103 | cpumask = (1 << cpu); | 105 | cpumask = (1 << cpu); |
104 | all_mask = dcscb_allcpus_mask[cluster]; | ||
105 | 106 | ||
106 | pr_debug("%s: cpu %u cluster %u\n", __func__, cpu, cluster); | 107 | pr_debug("%s: cpu %u cluster %u\n", __func__, cpu, cluster); |
107 | BUG_ON(cpu >= 4 || cluster >= 2); | 108 | BUG_ON(cpu >= 4 || cluster >= 2); |
108 | 109 | ||
110 | all_mask = dcscb_allcpus_mask[cluster]; | ||
111 | |||
109 | __mcpm_cpu_going_down(cpu, cluster); | 112 | __mcpm_cpu_going_down(cpu, cluster); |
110 | 113 | ||
111 | arch_spin_lock(&dcscb_lock); | 114 | arch_spin_lock(&dcscb_lock); |
diff --git a/arch/arm/mach-vexpress/spc.c b/arch/arm/mach-vexpress/spc.c index c26ef5b92ca7..2c2754e79cb3 100644 --- a/arch/arm/mach-vexpress/spc.c +++ b/arch/arm/mach-vexpress/spc.c | |||
@@ -392,7 +392,7 @@ static irqreturn_t ve_spc_irq_handler(int irq, void *data) | |||
392 | * +--------------------------+ | 392 | * +--------------------------+ |
393 | * | 31 20 | 19 0 | | 393 | * | 31 20 | 19 0 | |
394 | * +--------------------------+ | 394 | * +--------------------------+ |
395 | * | u_volt | freq(kHz) | | 395 | * | m_volt | freq(kHz) | |
396 | * +--------------------------+ | 396 | * +--------------------------+ |
397 | */ | 397 | */ |
398 | #define MULT_FACTOR 20 | 398 | #define MULT_FACTOR 20 |
@@ -414,7 +414,7 @@ static int ve_spc_populate_opps(uint32_t cluster) | |||
414 | ret = ve_spc_read_sys_cfg(SYSCFG_SCC, off, &data); | 414 | ret = ve_spc_read_sys_cfg(SYSCFG_SCC, off, &data); |
415 | if (!ret) { | 415 | if (!ret) { |
416 | opps->freq = (data & FREQ_MASK) * MULT_FACTOR; | 416 | opps->freq = (data & FREQ_MASK) * MULT_FACTOR; |
417 | opps->u_volt = data >> VOLT_SHIFT; | 417 | opps->u_volt = (data >> VOLT_SHIFT) * 1000; |
418 | } else { | 418 | } else { |
419 | break; | 419 | break; |
420 | } | 420 | } |
diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig index f5ad9ee70426..5bf7c3c3b301 100644 --- a/arch/arm/mm/Kconfig +++ b/arch/arm/mm/Kconfig | |||
@@ -420,29 +420,29 @@ config CPU_32v3 | |||
420 | bool | 420 | bool |
421 | select CPU_USE_DOMAINS if MMU | 421 | select CPU_USE_DOMAINS if MMU |
422 | select NEEDS_SYSCALL_FOR_CMPXCHG if SMP | 422 | select NEEDS_SYSCALL_FOR_CMPXCHG if SMP |
423 | select TLS_REG_EMUL if SMP || !MMU | ||
424 | select NEED_KUSER_HELPERS | 423 | select NEED_KUSER_HELPERS |
424 | select TLS_REG_EMUL if SMP || !MMU | ||
425 | 425 | ||
426 | config CPU_32v4 | 426 | config CPU_32v4 |
427 | bool | 427 | bool |
428 | select CPU_USE_DOMAINS if MMU | 428 | select CPU_USE_DOMAINS if MMU |
429 | select NEEDS_SYSCALL_FOR_CMPXCHG if SMP | 429 | select NEEDS_SYSCALL_FOR_CMPXCHG if SMP |
430 | select TLS_REG_EMUL if SMP || !MMU | ||
431 | select NEED_KUSER_HELPERS | 430 | select NEED_KUSER_HELPERS |
431 | select TLS_REG_EMUL if SMP || !MMU | ||
432 | 432 | ||
433 | config CPU_32v4T | 433 | config CPU_32v4T |
434 | bool | 434 | bool |
435 | select CPU_USE_DOMAINS if MMU | 435 | select CPU_USE_DOMAINS if MMU |
436 | select NEEDS_SYSCALL_FOR_CMPXCHG if SMP | 436 | select NEEDS_SYSCALL_FOR_CMPXCHG if SMP |
437 | select TLS_REG_EMUL if SMP || !MMU | ||
438 | select NEED_KUSER_HELPERS | 437 | select NEED_KUSER_HELPERS |
438 | select TLS_REG_EMUL if SMP || !MMU | ||
439 | 439 | ||
440 | config CPU_32v5 | 440 | config CPU_32v5 |
441 | bool | 441 | bool |
442 | select CPU_USE_DOMAINS if MMU | 442 | select CPU_USE_DOMAINS if MMU |
443 | select NEEDS_SYSCALL_FOR_CMPXCHG if SMP | 443 | select NEEDS_SYSCALL_FOR_CMPXCHG if SMP |
444 | select TLS_REG_EMUL if SMP || !MMU | ||
445 | select NEED_KUSER_HELPERS | 444 | select NEED_KUSER_HELPERS |
445 | select TLS_REG_EMUL if SMP || !MMU | ||
446 | 446 | ||
447 | config CPU_32v6 | 447 | config CPU_32v6 |
448 | bool | 448 | bool |
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index f62aa0677e5c..6b00be1f971e 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c | |||
@@ -1963,8 +1963,8 @@ arm_iommu_create_mapping(struct bus_type *bus, dma_addr_t base, size_t size) | |||
1963 | mapping->nr_bitmaps = 1; | 1963 | mapping->nr_bitmaps = 1; |
1964 | mapping->extensions = extensions; | 1964 | mapping->extensions = extensions; |
1965 | mapping->base = base; | 1965 | mapping->base = base; |
1966 | mapping->size = bitmap_size << PAGE_SHIFT; | ||
1967 | mapping->bits = BITS_PER_BYTE * bitmap_size; | 1966 | mapping->bits = BITS_PER_BYTE * bitmap_size; |
1967 | mapping->size = mapping->bits << PAGE_SHIFT; | ||
1968 | 1968 | ||
1969 | spin_lock_init(&mapping->lock); | 1969 | spin_lock_init(&mapping->lock); |
1970 | 1970 | ||
diff --git a/arch/arm/vfp/vfpdouble.c b/arch/arm/vfp/vfpdouble.c index 6cac43bd1d86..423f56dd4028 100644 --- a/arch/arm/vfp/vfpdouble.c +++ b/arch/arm/vfp/vfpdouble.c | |||
@@ -866,6 +866,8 @@ vfp_double_multiply_accumulate(int dd, int dn, int dm, u32 fpscr, u32 negate, ch | |||
866 | vdp.sign = vfp_sign_negate(vdp.sign); | 866 | vdp.sign = vfp_sign_negate(vdp.sign); |
867 | 867 | ||
868 | vfp_double_unpack(&vdn, vfp_get_double(dd)); | 868 | vfp_double_unpack(&vdn, vfp_get_double(dd)); |
869 | if (vdn.exponent == 0 && vdn.significand) | ||
870 | vfp_double_normalise_denormal(&vdn); | ||
869 | if (negate & NEG_SUBTRACT) | 871 | if (negate & NEG_SUBTRACT) |
870 | vdn.sign = vfp_sign_negate(vdn.sign); | 872 | vdn.sign = vfp_sign_negate(vdn.sign); |
871 | 873 | ||
diff --git a/arch/arm/vfp/vfpsingle.c b/arch/arm/vfp/vfpsingle.c index b252631b406b..4f96c1617aae 100644 --- a/arch/arm/vfp/vfpsingle.c +++ b/arch/arm/vfp/vfpsingle.c | |||
@@ -915,6 +915,8 @@ vfp_single_multiply_accumulate(int sd, int sn, s32 m, u32 fpscr, u32 negate, cha | |||
915 | v = vfp_get_float(sd); | 915 | v = vfp_get_float(sd); |
916 | pr_debug("VFP: s%u = %08x\n", sd, v); | 916 | pr_debug("VFP: s%u = %08x\n", sd, v); |
917 | vfp_single_unpack(&vsn, v); | 917 | vfp_single_unpack(&vsn, v); |
918 | if (vsn.exponent == 0 && vsn.significand) | ||
919 | vfp_single_normalise_denormal(&vsn); | ||
918 | if (negate & NEG_SUBTRACT) | 920 | if (negate & NEG_SUBTRACT) |
919 | vsn.sign = vfp_sign_negate(vsn.sign); | 921 | vsn.sign = vfp_sign_negate(vsn.sign); |
920 | 922 | ||
diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index e6e4d3749a6e..e759af5d7098 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig | |||
@@ -323,8 +323,6 @@ menu "CPU Power Management" | |||
323 | 323 | ||
324 | source "drivers/cpuidle/Kconfig" | 324 | source "drivers/cpuidle/Kconfig" |
325 | 325 | ||
326 | source "kernel/power/Kconfig" | ||
327 | |||
328 | source "drivers/cpufreq/Kconfig" | 326 | source "drivers/cpufreq/Kconfig" |
329 | 327 | ||
330 | endmenu | 328 | endmenu |
diff --git a/arch/arm64/include/asm/mmu.h b/arch/arm64/include/asm/mmu.h index f600d400c07d..aff0292c8f4d 100644 --- a/arch/arm64/include/asm/mmu.h +++ b/arch/arm64/include/asm/mmu.h | |||
@@ -22,6 +22,9 @@ typedef struct { | |||
22 | void *vdso; | 22 | void *vdso; |
23 | } mm_context_t; | 23 | } mm_context_t; |
24 | 24 | ||
25 | #define INIT_MM_CONTEXT(name) \ | ||
26 | .context.id_lock = __RAW_SPIN_LOCK_UNLOCKED(name.context.id_lock), | ||
27 | |||
25 | #define ASID(mm) ((mm)->context.id & 0xffff) | 28 | #define ASID(mm) ((mm)->context.id & 0xffff) |
26 | 29 | ||
27 | extern void paging_init(void); | 30 | extern void paging_init(void); |
diff --git a/arch/arm64/include/asm/tlb.h b/arch/arm64/include/asm/tlb.h index 72cadf52ca80..80e2c08900d6 100644 --- a/arch/arm64/include/asm/tlb.h +++ b/arch/arm64/include/asm/tlb.h | |||
@@ -19,6 +19,7 @@ | |||
19 | #ifndef __ASM_TLB_H | 19 | #ifndef __ASM_TLB_H |
20 | #define __ASM_TLB_H | 20 | #define __ASM_TLB_H |
21 | 21 | ||
22 | #define __tlb_remove_pmd_tlb_entry __tlb_remove_pmd_tlb_entry | ||
22 | 23 | ||
23 | #include <asm-generic/tlb.h> | 24 | #include <asm-generic/tlb.h> |
24 | 25 | ||
@@ -99,5 +100,10 @@ static inline void __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmdp, | |||
99 | } | 100 | } |
100 | #endif | 101 | #endif |
101 | 102 | ||
103 | static inline void __tlb_remove_pmd_tlb_entry(struct mmu_gather *tlb, pmd_t *pmdp, | ||
104 | unsigned long address) | ||
105 | { | ||
106 | tlb_add_flush(tlb, address); | ||
107 | } | ||
102 | 108 | ||
103 | #endif | 109 | #endif |
diff --git a/arch/arm64/include/asm/unistd32.h b/arch/arm64/include/asm/unistd32.h index bb8eb8a78e67..c8d8fc17bd5a 100644 --- a/arch/arm64/include/asm/unistd32.h +++ b/arch/arm64/include/asm/unistd32.h | |||
@@ -403,8 +403,9 @@ __SYSCALL(378, sys_kcmp) | |||
403 | __SYSCALL(379, sys_finit_module) | 403 | __SYSCALL(379, sys_finit_module) |
404 | __SYSCALL(380, sys_sched_setattr) | 404 | __SYSCALL(380, sys_sched_setattr) |
405 | __SYSCALL(381, sys_sched_getattr) | 405 | __SYSCALL(381, sys_sched_getattr) |
406 | __SYSCALL(382, sys_renameat2) | ||
406 | 407 | ||
407 | #define __NR_compat_syscalls 379 | 408 | #define __NR_compat_syscalls 383 |
408 | 409 | ||
409 | /* | 410 | /* |
410 | * Compat syscall numbers used by the AArch64 kernel. | 411 | * Compat syscall numbers used by the AArch64 kernel. |
diff --git a/arch/arm64/kernel/debug-monitors.c b/arch/arm64/kernel/debug-monitors.c index ed3955a95747..a7fb874b595e 100644 --- a/arch/arm64/kernel/debug-monitors.c +++ b/arch/arm64/kernel/debug-monitors.c | |||
@@ -318,9 +318,6 @@ static int brk_handler(unsigned long addr, unsigned int esr, | |||
318 | if (call_break_hook(regs, esr) == DBG_HOOK_HANDLED) | 318 | if (call_break_hook(regs, esr) == DBG_HOOK_HANDLED) |
319 | return 0; | 319 | return 0; |
320 | 320 | ||
321 | pr_warn("unexpected brk exception at %lx, esr=0x%x\n", | ||
322 | (long)instruction_pointer(regs), esr); | ||
323 | |||
324 | if (!user_mode(regs)) | 321 | if (!user_mode(regs)) |
325 | return -EFAULT; | 322 | return -EFAULT; |
326 | 323 | ||
diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c index 720853f70b6b..93e7df8968fe 100644 --- a/arch/arm64/kernel/setup.c +++ b/arch/arm64/kernel/setup.c | |||
@@ -393,7 +393,6 @@ void __init setup_arch(char **cmdline_p) | |||
393 | 393 | ||
394 | static int __init arm64_device_init(void) | 394 | static int __init arm64_device_init(void) |
395 | { | 395 | { |
396 | of_clk_init(NULL); | ||
397 | of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); | 396 | of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); |
398 | return 0; | 397 | return 0; |
399 | } | 398 | } |
diff --git a/arch/arm64/kernel/time.c b/arch/arm64/kernel/time.c index 29c39d5d77e3..6815987b50f8 100644 --- a/arch/arm64/kernel/time.c +++ b/arch/arm64/kernel/time.c | |||
@@ -33,6 +33,7 @@ | |||
33 | #include <linux/irq.h> | 33 | #include <linux/irq.h> |
34 | #include <linux/delay.h> | 34 | #include <linux/delay.h> |
35 | #include <linux/clocksource.h> | 35 | #include <linux/clocksource.h> |
36 | #include <linux/clk-provider.h> | ||
36 | 37 | ||
37 | #include <clocksource/arm_arch_timer.h> | 38 | #include <clocksource/arm_arch_timer.h> |
38 | 39 | ||
@@ -65,6 +66,7 @@ void __init time_init(void) | |||
65 | { | 66 | { |
66 | u32 arch_timer_rate; | 67 | u32 arch_timer_rate; |
67 | 68 | ||
69 | of_clk_init(NULL); | ||
68 | clocksource_of_init(); | 70 | clocksource_of_init(); |
69 | 71 | ||
70 | arch_timer_rate = arch_timer_get_rate(); | 72 | arch_timer_rate = arch_timer_get_rate(); |
diff --git a/arch/hexagon/include/asm/barrier.h b/arch/hexagon/include/asm/barrier.h deleted file mode 100644 index 4e863daea25b..000000000000 --- a/arch/hexagon/include/asm/barrier.h +++ /dev/null | |||
@@ -1,37 +0,0 @@ | |||
1 | /* | ||
2 | * Memory barrier definitions for the Hexagon architecture | ||
3 | * | ||
4 | * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 and | ||
8 | * only version 2 as published by the Free Software Foundation. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program; if not, write to the Free Software | ||
17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA | ||
18 | * 02110-1301, USA. | ||
19 | */ | ||
20 | |||
21 | #ifndef _ASM_BARRIER_H | ||
22 | #define _ASM_BARRIER_H | ||
23 | |||
24 | #define rmb() barrier() | ||
25 | #define read_barrier_depends() barrier() | ||
26 | #define wmb() barrier() | ||
27 | #define mb() barrier() | ||
28 | #define smp_rmb() barrier() | ||
29 | #define smp_read_barrier_depends() barrier() | ||
30 | #define smp_wmb() barrier() | ||
31 | #define smp_mb() barrier() | ||
32 | |||
33 | /* Set a value and use a memory barrier. Used by the scheduler somewhere. */ | ||
34 | #define set_mb(var, value) \ | ||
35 | do { var = value; mb(); } while (0) | ||
36 | |||
37 | #endif /* _ASM_BARRIER_H */ | ||
diff --git a/arch/ia64/include/asm/tlb.h b/arch/ia64/include/asm/tlb.h index bc5efc7c3f3f..39d64e0df1de 100644 --- a/arch/ia64/include/asm/tlb.h +++ b/arch/ia64/include/asm/tlb.h | |||
@@ -91,18 +91,9 @@ extern struct ia64_tr_entry *ia64_idtrs[NR_CPUS]; | |||
91 | #define RR_RID_MASK 0x00000000ffffff00L | 91 | #define RR_RID_MASK 0x00000000ffffff00L |
92 | #define RR_TO_RID(val) ((val >> 8) & 0xffffff) | 92 | #define RR_TO_RID(val) ((val >> 8) & 0xffffff) |
93 | 93 | ||
94 | /* | ||
95 | * Flush the TLB for address range START to END and, if not in fast mode, release the | ||
96 | * freed pages that where gathered up to this point. | ||
97 | */ | ||
98 | static inline void | 94 | static inline void |
99 | ia64_tlb_flush_mmu (struct mmu_gather *tlb, unsigned long start, unsigned long end) | 95 | ia64_tlb_flush_mmu_tlbonly(struct mmu_gather *tlb, unsigned long start, unsigned long end) |
100 | { | 96 | { |
101 | unsigned long i; | ||
102 | unsigned int nr; | ||
103 | |||
104 | if (!tlb->need_flush) | ||
105 | return; | ||
106 | tlb->need_flush = 0; | 97 | tlb->need_flush = 0; |
107 | 98 | ||
108 | if (tlb->fullmm) { | 99 | if (tlb->fullmm) { |
@@ -135,6 +126,14 @@ ia64_tlb_flush_mmu (struct mmu_gather *tlb, unsigned long start, unsigned long e | |||
135 | flush_tlb_range(&vma, ia64_thash(start), ia64_thash(end)); | 126 | flush_tlb_range(&vma, ia64_thash(start), ia64_thash(end)); |
136 | } | 127 | } |
137 | 128 | ||
129 | } | ||
130 | |||
131 | static inline void | ||
132 | ia64_tlb_flush_mmu_free(struct mmu_gather *tlb) | ||
133 | { | ||
134 | unsigned long i; | ||
135 | unsigned int nr; | ||
136 | |||
138 | /* lastly, release the freed pages */ | 137 | /* lastly, release the freed pages */ |
139 | nr = tlb->nr; | 138 | nr = tlb->nr; |
140 | 139 | ||
@@ -144,6 +143,19 @@ ia64_tlb_flush_mmu (struct mmu_gather *tlb, unsigned long start, unsigned long e | |||
144 | free_page_and_swap_cache(tlb->pages[i]); | 143 | free_page_and_swap_cache(tlb->pages[i]); |
145 | } | 144 | } |
146 | 145 | ||
146 | /* | ||
147 | * Flush the TLB for address range START to END and, if not in fast mode, release the | ||
148 | * freed pages that where gathered up to this point. | ||
149 | */ | ||
150 | static inline void | ||
151 | ia64_tlb_flush_mmu (struct mmu_gather *tlb, unsigned long start, unsigned long end) | ||
152 | { | ||
153 | if (!tlb->need_flush) | ||
154 | return; | ||
155 | ia64_tlb_flush_mmu_tlbonly(tlb, start, end); | ||
156 | ia64_tlb_flush_mmu_free(tlb); | ||
157 | } | ||
158 | |||
147 | static inline void __tlb_alloc_page(struct mmu_gather *tlb) | 159 | static inline void __tlb_alloc_page(struct mmu_gather *tlb) |
148 | { | 160 | { |
149 | unsigned long addr = __get_free_pages(GFP_NOWAIT | __GFP_NOWARN, 0); | 161 | unsigned long addr = __get_free_pages(GFP_NOWAIT | __GFP_NOWARN, 0); |
@@ -206,6 +218,16 @@ static inline int __tlb_remove_page(struct mmu_gather *tlb, struct page *page) | |||
206 | return tlb->max - tlb->nr; | 218 | return tlb->max - tlb->nr; |
207 | } | 219 | } |
208 | 220 | ||
221 | static inline void tlb_flush_mmu_tlbonly(struct mmu_gather *tlb) | ||
222 | { | ||
223 | ia64_tlb_flush_mmu_tlbonly(tlb, tlb->start_addr, tlb->end_addr); | ||
224 | } | ||
225 | |||
226 | static inline void tlb_flush_mmu_free(struct mmu_gather *tlb) | ||
227 | { | ||
228 | ia64_tlb_flush_mmu_free(tlb); | ||
229 | } | ||
230 | |||
209 | static inline void tlb_flush_mmu(struct mmu_gather *tlb) | 231 | static inline void tlb_flush_mmu(struct mmu_gather *tlb) |
210 | { | 232 | { |
211 | ia64_tlb_flush_mmu(tlb, tlb->start_addr, tlb->end_addr); | 233 | ia64_tlb_flush_mmu(tlb, tlb->start_addr, tlb->end_addr); |
diff --git a/arch/mips/cavium-octeon/octeon-irq.c b/arch/mips/cavium-octeon/octeon-irq.c index c2bb4f896ce7..3aa5b46b2d40 100644 --- a/arch/mips/cavium-octeon/octeon-irq.c +++ b/arch/mips/cavium-octeon/octeon-irq.c | |||
@@ -635,7 +635,7 @@ static void octeon_irq_cpu_offline_ciu(struct irq_data *data) | |||
635 | cpumask_clear(&new_affinity); | 635 | cpumask_clear(&new_affinity); |
636 | cpumask_set_cpu(cpumask_first(cpu_online_mask), &new_affinity); | 636 | cpumask_set_cpu(cpumask_first(cpu_online_mask), &new_affinity); |
637 | } | 637 | } |
638 | __irq_set_affinity_locked(data, &new_affinity); | 638 | irq_set_affinity_locked(data, &new_affinity, false); |
639 | } | 639 | } |
640 | 640 | ||
641 | static int octeon_irq_ciu_set_affinity(struct irq_data *data, | 641 | static int octeon_irq_ciu_set_affinity(struct irq_data *data, |
diff --git a/arch/parisc/include/uapi/asm/Kbuild b/arch/parisc/include/uapi/asm/Kbuild index a580642555b6..348356c99514 100644 --- a/arch/parisc/include/uapi/asm/Kbuild +++ b/arch/parisc/include/uapi/asm/Kbuild | |||
@@ -1,6 +1,8 @@ | |||
1 | # UAPI Header export list | 1 | # UAPI Header export list |
2 | include include/uapi/asm-generic/Kbuild.asm | 2 | include include/uapi/asm-generic/Kbuild.asm |
3 | 3 | ||
4 | generic-y += resource.h | ||
5 | |||
4 | header-y += bitsperlong.h | 6 | header-y += bitsperlong.h |
5 | header-y += byteorder.h | 7 | header-y += byteorder.h |
6 | header-y += errno.h | 8 | header-y += errno.h |
@@ -13,7 +15,6 @@ header-y += msgbuf.h | |||
13 | header-y += pdc.h | 15 | header-y += pdc.h |
14 | header-y += posix_types.h | 16 | header-y += posix_types.h |
15 | header-y += ptrace.h | 17 | header-y += ptrace.h |
16 | header-y += resource.h | ||
17 | header-y += sembuf.h | 18 | header-y += sembuf.h |
18 | header-y += setup.h | 19 | header-y += setup.h |
19 | header-y += shmbuf.h | 20 | header-y += shmbuf.h |
diff --git a/arch/parisc/include/uapi/asm/resource.h b/arch/parisc/include/uapi/asm/resource.h deleted file mode 100644 index 8b06343b62ed..000000000000 --- a/arch/parisc/include/uapi/asm/resource.h +++ /dev/null | |||
@@ -1,7 +0,0 @@ | |||
1 | #ifndef _ASM_PARISC_RESOURCE_H | ||
2 | #define _ASM_PARISC_RESOURCE_H | ||
3 | |||
4 | #define _STK_LIM_MAX 10 * _STK_LIM | ||
5 | #include <asm-generic/resource.h> | ||
6 | |||
7 | #endif | ||
diff --git a/arch/powerpc/boot/main.c b/arch/powerpc/boot/main.c index a28f02165e97..d367a0aece2a 100644 --- a/arch/powerpc/boot/main.c +++ b/arch/powerpc/boot/main.c | |||
@@ -139,18 +139,18 @@ static struct addr_range prep_initrd(struct addr_range vmlinux, void *chosen, | |||
139 | * edit the command line passed to vmlinux (by setting /chosen/bootargs). | 139 | * edit the command line passed to vmlinux (by setting /chosen/bootargs). |
140 | * The buffer is put in it's own section so that tools may locate it easier. | 140 | * The buffer is put in it's own section so that tools may locate it easier. |
141 | */ | 141 | */ |
142 | static char cmdline[COMMAND_LINE_SIZE] | 142 | static char cmdline[BOOT_COMMAND_LINE_SIZE] |
143 | __attribute__((__section__("__builtin_cmdline"))); | 143 | __attribute__((__section__("__builtin_cmdline"))); |
144 | 144 | ||
145 | static void prep_cmdline(void *chosen) | 145 | static void prep_cmdline(void *chosen) |
146 | { | 146 | { |
147 | if (cmdline[0] == '\0') | 147 | if (cmdline[0] == '\0') |
148 | getprop(chosen, "bootargs", cmdline, COMMAND_LINE_SIZE-1); | 148 | getprop(chosen, "bootargs", cmdline, BOOT_COMMAND_LINE_SIZE-1); |
149 | 149 | ||
150 | printf("\n\rLinux/PowerPC load: %s", cmdline); | 150 | printf("\n\rLinux/PowerPC load: %s", cmdline); |
151 | /* If possible, edit the command line */ | 151 | /* If possible, edit the command line */ |
152 | if (console_ops.edit_cmdline) | 152 | if (console_ops.edit_cmdline) |
153 | console_ops.edit_cmdline(cmdline, COMMAND_LINE_SIZE); | 153 | console_ops.edit_cmdline(cmdline, BOOT_COMMAND_LINE_SIZE); |
154 | printf("\n\r"); | 154 | printf("\n\r"); |
155 | 155 | ||
156 | /* Put the command line back into the devtree for the kernel */ | 156 | /* Put the command line back into the devtree for the kernel */ |
@@ -174,7 +174,7 @@ void start(void) | |||
174 | * built-in command line wasn't set by an external tool */ | 174 | * built-in command line wasn't set by an external tool */ |
175 | if ((loader_info.cmdline_len > 0) && (cmdline[0] == '\0')) | 175 | if ((loader_info.cmdline_len > 0) && (cmdline[0] == '\0')) |
176 | memmove(cmdline, loader_info.cmdline, | 176 | memmove(cmdline, loader_info.cmdline, |
177 | min(loader_info.cmdline_len, COMMAND_LINE_SIZE-1)); | 177 | min(loader_info.cmdline_len, BOOT_COMMAND_LINE_SIZE-1)); |
178 | 178 | ||
179 | if (console_ops.open && (console_ops.open() < 0)) | 179 | if (console_ops.open && (console_ops.open() < 0)) |
180 | exit(); | 180 | exit(); |
diff --git a/arch/powerpc/boot/ops.h b/arch/powerpc/boot/ops.h index b3218ce451bb..8aad3c55aeda 100644 --- a/arch/powerpc/boot/ops.h +++ b/arch/powerpc/boot/ops.h | |||
@@ -15,7 +15,7 @@ | |||
15 | #include "types.h" | 15 | #include "types.h" |
16 | #include "string.h" | 16 | #include "string.h" |
17 | 17 | ||
18 | #define COMMAND_LINE_SIZE 512 | 18 | #define BOOT_COMMAND_LINE_SIZE 2048 |
19 | #define MAX_PATH_LEN 256 | 19 | #define MAX_PATH_LEN 256 |
20 | #define MAX_PROP_LEN 256 /* What should this be? */ | 20 | #define MAX_PROP_LEN 256 /* What should this be? */ |
21 | 21 | ||
diff --git a/arch/powerpc/boot/ps3.c b/arch/powerpc/boot/ps3.c index 9954d98871d0..4ec2d86d3c50 100644 --- a/arch/powerpc/boot/ps3.c +++ b/arch/powerpc/boot/ps3.c | |||
@@ -47,13 +47,13 @@ BSS_STACK(4096); | |||
47 | * The buffer is put in it's own section so that tools may locate it easier. | 47 | * The buffer is put in it's own section so that tools may locate it easier. |
48 | */ | 48 | */ |
49 | 49 | ||
50 | static char cmdline[COMMAND_LINE_SIZE] | 50 | static char cmdline[BOOT_COMMAND_LINE_SIZE] |
51 | __attribute__((__section__("__builtin_cmdline"))); | 51 | __attribute__((__section__("__builtin_cmdline"))); |
52 | 52 | ||
53 | static void prep_cmdline(void *chosen) | 53 | static void prep_cmdline(void *chosen) |
54 | { | 54 | { |
55 | if (cmdline[0] == '\0') | 55 | if (cmdline[0] == '\0') |
56 | getprop(chosen, "bootargs", cmdline, COMMAND_LINE_SIZE-1); | 56 | getprop(chosen, "bootargs", cmdline, BOOT_COMMAND_LINE_SIZE-1); |
57 | else | 57 | else |
58 | setprop_str(chosen, "bootargs", cmdline); | 58 | setprop_str(chosen, "bootargs", cmdline); |
59 | 59 | ||
diff --git a/arch/powerpc/include/asm/opal.h b/arch/powerpc/include/asm/opal.h index a2efdaa020b0..66ad7a74116f 100644 --- a/arch/powerpc/include/asm/opal.h +++ b/arch/powerpc/include/asm/opal.h | |||
@@ -41,14 +41,14 @@ struct opal_takeover_args { | |||
41 | * size except the last one in the list to be as well. | 41 | * size except the last one in the list to be as well. |
42 | */ | 42 | */ |
43 | struct opal_sg_entry { | 43 | struct opal_sg_entry { |
44 | void *data; | 44 | __be64 data; |
45 | long length; | 45 | __be64 length; |
46 | }; | 46 | }; |
47 | 47 | ||
48 | /* sg list */ | 48 | /* SG list */ |
49 | struct opal_sg_list { | 49 | struct opal_sg_list { |
50 | unsigned long num_entries; | 50 | __be64 length; |
51 | struct opal_sg_list *next; | 51 | __be64 next; |
52 | struct opal_sg_entry entry[]; | 52 | struct opal_sg_entry entry[]; |
53 | }; | 53 | }; |
54 | 54 | ||
@@ -858,8 +858,8 @@ int64_t opal_lpc_write(uint32_t chip_id, enum OpalLPCAddressType addr_type, | |||
858 | int64_t opal_lpc_read(uint32_t chip_id, enum OpalLPCAddressType addr_type, | 858 | int64_t opal_lpc_read(uint32_t chip_id, enum OpalLPCAddressType addr_type, |
859 | uint32_t addr, __be32 *data, uint32_t sz); | 859 | uint32_t addr, __be32 *data, uint32_t sz); |
860 | 860 | ||
861 | int64_t opal_read_elog(uint64_t buffer, size_t size, uint64_t log_id); | 861 | int64_t opal_read_elog(uint64_t buffer, uint64_t size, uint64_t log_id); |
862 | int64_t opal_get_elog_size(uint64_t *log_id, size_t *size, uint64_t *elog_type); | 862 | int64_t opal_get_elog_size(__be64 *log_id, __be64 *size, __be64 *elog_type); |
863 | int64_t opal_write_elog(uint64_t buffer, uint64_t size, uint64_t offset); | 863 | int64_t opal_write_elog(uint64_t buffer, uint64_t size, uint64_t offset); |
864 | int64_t opal_send_ack_elog(uint64_t log_id); | 864 | int64_t opal_send_ack_elog(uint64_t log_id); |
865 | void opal_resend_pending_logs(void); | 865 | void opal_resend_pending_logs(void); |
@@ -868,23 +868,24 @@ int64_t opal_validate_flash(uint64_t buffer, uint32_t *size, uint32_t *result); | |||
868 | int64_t opal_manage_flash(uint8_t op); | 868 | int64_t opal_manage_flash(uint8_t op); |
869 | int64_t opal_update_flash(uint64_t blk_list); | 869 | int64_t opal_update_flash(uint64_t blk_list); |
870 | int64_t opal_dump_init(uint8_t dump_type); | 870 | int64_t opal_dump_init(uint8_t dump_type); |
871 | int64_t opal_dump_info(uint32_t *dump_id, uint32_t *dump_size); | 871 | int64_t opal_dump_info(__be32 *dump_id, __be32 *dump_size); |
872 | int64_t opal_dump_info2(uint32_t *dump_id, uint32_t *dump_size, uint32_t *dump_type); | 872 | int64_t opal_dump_info2(__be32 *dump_id, __be32 *dump_size, __be32 *dump_type); |
873 | int64_t opal_dump_read(uint32_t dump_id, uint64_t buffer); | 873 | int64_t opal_dump_read(uint32_t dump_id, uint64_t buffer); |
874 | int64_t opal_dump_ack(uint32_t dump_id); | 874 | int64_t opal_dump_ack(uint32_t dump_id); |
875 | int64_t opal_dump_resend_notification(void); | 875 | int64_t opal_dump_resend_notification(void); |
876 | 876 | ||
877 | int64_t opal_get_msg(uint64_t buffer, size_t size); | 877 | int64_t opal_get_msg(uint64_t buffer, uint64_t size); |
878 | int64_t opal_check_completion(uint64_t buffer, size_t size, uint64_t token); | 878 | int64_t opal_check_completion(uint64_t buffer, uint64_t size, uint64_t token); |
879 | int64_t opal_sync_host_reboot(void); | 879 | int64_t opal_sync_host_reboot(void); |
880 | int64_t opal_get_param(uint64_t token, uint32_t param_id, uint64_t buffer, | 880 | int64_t opal_get_param(uint64_t token, uint32_t param_id, uint64_t buffer, |
881 | size_t length); | 881 | uint64_t length); |
882 | int64_t opal_set_param(uint64_t token, uint32_t param_id, uint64_t buffer, | 882 | int64_t opal_set_param(uint64_t token, uint32_t param_id, uint64_t buffer, |
883 | size_t length); | 883 | uint64_t length); |
884 | int64_t opal_sensor_read(uint32_t sensor_hndl, int token, __be32 *sensor_data); | 884 | int64_t opal_sensor_read(uint32_t sensor_hndl, int token, __be32 *sensor_data); |
885 | 885 | ||
886 | /* Internal functions */ | 886 | /* Internal functions */ |
887 | extern int early_init_dt_scan_opal(unsigned long node, const char *uname, int depth, void *data); | 887 | extern int early_init_dt_scan_opal(unsigned long node, const char *uname, |
888 | int depth, void *data); | ||
888 | extern int early_init_dt_scan_recoverable_ranges(unsigned long node, | 889 | extern int early_init_dt_scan_recoverable_ranges(unsigned long node, |
889 | const char *uname, int depth, void *data); | 890 | const char *uname, int depth, void *data); |
890 | 891 | ||
@@ -893,10 +894,6 @@ extern int opal_put_chars(uint32_t vtermno, const char *buf, int total_len); | |||
893 | 894 | ||
894 | extern void hvc_opal_init_early(void); | 895 | extern void hvc_opal_init_early(void); |
895 | 896 | ||
896 | /* Internal functions */ | ||
897 | extern int early_init_dt_scan_opal(unsigned long node, const char *uname, | ||
898 | int depth, void *data); | ||
899 | |||
900 | extern int opal_notifier_register(struct notifier_block *nb); | 897 | extern int opal_notifier_register(struct notifier_block *nb); |
901 | extern int opal_notifier_unregister(struct notifier_block *nb); | 898 | extern int opal_notifier_unregister(struct notifier_block *nb); |
902 | 899 | ||
@@ -906,9 +903,6 @@ extern void opal_notifier_enable(void); | |||
906 | extern void opal_notifier_disable(void); | 903 | extern void opal_notifier_disable(void); |
907 | extern void opal_notifier_update_evt(uint64_t evt_mask, uint64_t evt_val); | 904 | extern void opal_notifier_update_evt(uint64_t evt_mask, uint64_t evt_val); |
908 | 905 | ||
909 | extern int opal_get_chars(uint32_t vtermno, char *buf, int count); | ||
910 | extern int opal_put_chars(uint32_t vtermno, const char *buf, int total_len); | ||
911 | |||
912 | extern int __opal_async_get_token(void); | 906 | extern int __opal_async_get_token(void); |
913 | extern int opal_async_get_token_interruptible(void); | 907 | extern int opal_async_get_token_interruptible(void); |
914 | extern int __opal_async_release_token(int token); | 908 | extern int __opal_async_release_token(int token); |
@@ -916,8 +910,6 @@ extern int opal_async_release_token(int token); | |||
916 | extern int opal_async_wait_response(uint64_t token, struct opal_msg *msg); | 910 | extern int opal_async_wait_response(uint64_t token, struct opal_msg *msg); |
917 | extern int opal_get_sensor_data(u32 sensor_hndl, u32 *sensor_data); | 911 | extern int opal_get_sensor_data(u32 sensor_hndl, u32 *sensor_data); |
918 | 912 | ||
919 | extern void hvc_opal_init_early(void); | ||
920 | |||
921 | struct rtc_time; | 913 | struct rtc_time; |
922 | extern int opal_set_rtc_time(struct rtc_time *tm); | 914 | extern int opal_set_rtc_time(struct rtc_time *tm); |
923 | extern void opal_get_rtc_time(struct rtc_time *tm); | 915 | extern void opal_get_rtc_time(struct rtc_time *tm); |
@@ -937,6 +929,10 @@ extern int opal_resync_timebase(void); | |||
937 | 929 | ||
938 | extern void opal_lpc_init(void); | 930 | extern void opal_lpc_init(void); |
939 | 931 | ||
932 | struct opal_sg_list *opal_vmalloc_to_sg_list(void *vmalloc_addr, | ||
933 | unsigned long vmalloc_size); | ||
934 | void opal_free_sg_list(struct opal_sg_list *sg); | ||
935 | |||
940 | #endif /* __ASSEMBLY__ */ | 936 | #endif /* __ASSEMBLY__ */ |
941 | 937 | ||
942 | #endif /* __OPAL_H */ | 938 | #endif /* __OPAL_H */ |
diff --git a/arch/powerpc/include/uapi/asm/setup.h b/arch/powerpc/include/uapi/asm/setup.h index 552df83f1a49..ae3fb68cb28e 100644 --- a/arch/powerpc/include/uapi/asm/setup.h +++ b/arch/powerpc/include/uapi/asm/setup.h | |||
@@ -1 +1,6 @@ | |||
1 | #include <asm-generic/setup.h> | 1 | #ifndef _UAPI_ASM_POWERPC_SETUP_H |
2 | #define _UAPI_ASM_POWERPC_SETUP_H | ||
3 | |||
4 | #define COMMAND_LINE_SIZE 2048 | ||
5 | |||
6 | #endif /* _UAPI_ASM_POWERPC_SETUP_H */ | ||
diff --git a/arch/powerpc/kernel/ppc_ksyms.c b/arch/powerpc/kernel/ppc_ksyms.c index 3bd77edd7610..450850a49dce 100644 --- a/arch/powerpc/kernel/ppc_ksyms.c +++ b/arch/powerpc/kernel/ppc_ksyms.c | |||
@@ -120,6 +120,7 @@ EXPORT_SYMBOL(giveup_spe); | |||
120 | EXPORT_SYMBOL(flush_instruction_cache); | 120 | EXPORT_SYMBOL(flush_instruction_cache); |
121 | #endif | 121 | #endif |
122 | EXPORT_SYMBOL(flush_dcache_range); | 122 | EXPORT_SYMBOL(flush_dcache_range); |
123 | EXPORT_SYMBOL(flush_icache_range); | ||
123 | 124 | ||
124 | #ifdef CONFIG_SMP | 125 | #ifdef CONFIG_SMP |
125 | #ifdef CONFIG_PPC32 | 126 | #ifdef CONFIG_PPC32 |
diff --git a/arch/powerpc/kernel/rtas_flash.c b/arch/powerpc/kernel/rtas_flash.c index 2f3cdb01506d..658e89d2025b 100644 --- a/arch/powerpc/kernel/rtas_flash.c +++ b/arch/powerpc/kernel/rtas_flash.c | |||
@@ -705,7 +705,7 @@ static int __init rtas_flash_init(void) | |||
705 | if (rtas_token("ibm,update-flash-64-and-reboot") == | 705 | if (rtas_token("ibm,update-flash-64-and-reboot") == |
706 | RTAS_UNKNOWN_SERVICE) { | 706 | RTAS_UNKNOWN_SERVICE) { |
707 | pr_info("rtas_flash: no firmware flash support\n"); | 707 | pr_info("rtas_flash: no firmware flash support\n"); |
708 | return 1; | 708 | return -EINVAL; |
709 | } | 709 | } |
710 | 710 | ||
711 | rtas_validate_flash_data.buf = kzalloc(VALIDATE_BUF_SIZE, GFP_KERNEL); | 711 | rtas_validate_flash_data.buf = kzalloc(VALIDATE_BUF_SIZE, GFP_KERNEL); |
diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S index ffbb871c2bd8..b031f932c0cc 100644 --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S | |||
@@ -242,6 +242,12 @@ kvm_novcpu_exit: | |||
242 | */ | 242 | */ |
243 | .globl kvm_start_guest | 243 | .globl kvm_start_guest |
244 | kvm_start_guest: | 244 | kvm_start_guest: |
245 | |||
246 | /* Set runlatch bit the minute you wake up from nap */ | ||
247 | mfspr r1, SPRN_CTRLF | ||
248 | ori r1, r1, 1 | ||
249 | mtspr SPRN_CTRLT, r1 | ||
250 | |||
245 | ld r2,PACATOC(r13) | 251 | ld r2,PACATOC(r13) |
246 | 252 | ||
247 | li r0,KVM_HWTHREAD_IN_KVM | 253 | li r0,KVM_HWTHREAD_IN_KVM |
@@ -309,6 +315,11 @@ kvm_no_guest: | |||
309 | li r0, KVM_HWTHREAD_IN_NAP | 315 | li r0, KVM_HWTHREAD_IN_NAP |
310 | stb r0, HSTATE_HWTHREAD_STATE(r13) | 316 | stb r0, HSTATE_HWTHREAD_STATE(r13) |
311 | kvm_do_nap: | 317 | kvm_do_nap: |
318 | /* Clear the runlatch bit before napping */ | ||
319 | mfspr r2, SPRN_CTRLF | ||
320 | clrrdi r2, r2, 1 | ||
321 | mtspr SPRN_CTRLT, r2 | ||
322 | |||
312 | li r3, LPCR_PECE0 | 323 | li r3, LPCR_PECE0 |
313 | mfspr r4, SPRN_LPCR | 324 | mfspr r4, SPRN_LPCR |
314 | rlwimi r4, r3, 0, LPCR_PECE0 | LPCR_PECE1 | 325 | rlwimi r4, r3, 0, LPCR_PECE0 | LPCR_PECE1 |
@@ -1999,8 +2010,13 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_206) | |||
1999 | 2010 | ||
2000 | /* | 2011 | /* |
2001 | * Take a nap until a decrementer or external or doobell interrupt | 2012 | * Take a nap until a decrementer or external or doobell interrupt |
2002 | * occurs, with PECE1, PECE0 and PECEDP set in LPCR | 2013 | * occurs, with PECE1, PECE0 and PECEDP set in LPCR. Also clear the |
2014 | * runlatch bit before napping. | ||
2003 | */ | 2015 | */ |
2016 | mfspr r2, SPRN_CTRLF | ||
2017 | clrrdi r2, r2, 1 | ||
2018 | mtspr SPRN_CTRLT, r2 | ||
2019 | |||
2004 | li r0,1 | 2020 | li r0,1 |
2005 | stb r0,HSTATE_HWTHREAD_REQ(r13) | 2021 | stb r0,HSTATE_HWTHREAD_REQ(r13) |
2006 | mfspr r5,SPRN_LPCR | 2022 | mfspr r5,SPRN_LPCR |
diff --git a/arch/powerpc/mm/hash_native_64.c b/arch/powerpc/mm/hash_native_64.c index 3ea26c25590b..cf1d325eae8b 100644 --- a/arch/powerpc/mm/hash_native_64.c +++ b/arch/powerpc/mm/hash_native_64.c | |||
@@ -82,17 +82,14 @@ static inline void __tlbie(unsigned long vpn, int psize, int apsize, int ssize) | |||
82 | va &= ~((1ul << mmu_psize_defs[apsize].shift) - 1); | 82 | va &= ~((1ul << mmu_psize_defs[apsize].shift) - 1); |
83 | va |= penc << 12; | 83 | va |= penc << 12; |
84 | va |= ssize << 8; | 84 | va |= ssize << 8; |
85 | /* Add AVAL part */ | 85 | /* |
86 | if (psize != apsize) { | 86 | * AVAL bits: |
87 | /* | 87 | * We don't need all the bits, but rest of the bits |
88 | * MPSS, 64K base page size and 16MB parge page size | 88 | * must be ignored by the processor. |
89 | * We don't need all the bits, but rest of the bits | 89 | * vpn cover upto 65 bits of va. (0...65) and we need |
90 | * must be ignored by the processor. | 90 | * 58..64 bits of va. |
91 | * vpn cover upto 65 bits of va. (0...65) and we need | 91 | */ |
92 | * 58..64 bits of va. | 92 | va |= (vpn & 0xfe); /* AVAL */ |
93 | */ | ||
94 | va |= (vpn & 0xfe); | ||
95 | } | ||
96 | va |= 1; /* L */ | 93 | va |= 1; /* L */ |
97 | asm volatile(ASM_FTR_IFCLR("tlbie %0,1", PPC_TLBIE(%1,%0), %2) | 94 | asm volatile(ASM_FTR_IFCLR("tlbie %0,1", PPC_TLBIE(%1,%0), %2) |
98 | : : "r" (va), "r"(0), "i" (CPU_FTR_ARCH_206) | 95 | : : "r" (va), "r"(0), "i" (CPU_FTR_ARCH_206) |
@@ -133,17 +130,14 @@ static inline void __tlbiel(unsigned long vpn, int psize, int apsize, int ssize) | |||
133 | va &= ~((1ul << mmu_psize_defs[apsize].shift) - 1); | 130 | va &= ~((1ul << mmu_psize_defs[apsize].shift) - 1); |
134 | va |= penc << 12; | 131 | va |= penc << 12; |
135 | va |= ssize << 8; | 132 | va |= ssize << 8; |
136 | /* Add AVAL part */ | 133 | /* |
137 | if (psize != apsize) { | 134 | * AVAL bits: |
138 | /* | 135 | * We don't need all the bits, but rest of the bits |
139 | * MPSS, 64K base page size and 16MB parge page size | 136 | * must be ignored by the processor. |
140 | * We don't need all the bits, but rest of the bits | 137 | * vpn cover upto 65 bits of va. (0...65) and we need |
141 | * must be ignored by the processor. | 138 | * 58..64 bits of va. |
142 | * vpn cover upto 65 bits of va. (0...65) and we need | 139 | */ |
143 | * 58..64 bits of va. | 140 | va |= (vpn & 0xfe); |
144 | */ | ||
145 | va |= (vpn & 0xfe); | ||
146 | } | ||
147 | va |= 1; /* L */ | 141 | va |= 1; /* L */ |
148 | asm volatile(".long 0x7c000224 | (%0 << 11) | (1 << 21)" | 142 | asm volatile(".long 0x7c000224 | (%0 << 11) | (1 << 21)" |
149 | : : "r"(va) : "memory"); | 143 | : : "r"(va) : "memory"); |
diff --git a/arch/powerpc/perf/hv-24x7.c b/arch/powerpc/perf/hv-24x7.c index 297c91051413..e0766b82e165 100644 --- a/arch/powerpc/perf/hv-24x7.c +++ b/arch/powerpc/perf/hv-24x7.c | |||
@@ -155,16 +155,28 @@ static ssize_t read_offset_data(void *dest, size_t dest_len, | |||
155 | return copy_len; | 155 | return copy_len; |
156 | } | 156 | } |
157 | 157 | ||
158 | static unsigned long h_get_24x7_catalog_page(char page[static 4096], | 158 | static unsigned long h_get_24x7_catalog_page_(unsigned long phys_4096, |
159 | u32 version, u32 index) | 159 | unsigned long version, |
160 | unsigned long index) | ||
160 | { | 161 | { |
161 | WARN_ON(!IS_ALIGNED((unsigned long)page, 4096)); | 162 | pr_devel("h_get_24x7_catalog_page(0x%lx, %lu, %lu)", |
163 | phys_4096, | ||
164 | version, | ||
165 | index); | ||
166 | WARN_ON(!IS_ALIGNED(phys_4096, 4096)); | ||
162 | return plpar_hcall_norets(H_GET_24X7_CATALOG_PAGE, | 167 | return plpar_hcall_norets(H_GET_24X7_CATALOG_PAGE, |
163 | virt_to_phys(page), | 168 | phys_4096, |
164 | version, | 169 | version, |
165 | index); | 170 | index); |
166 | } | 171 | } |
167 | 172 | ||
173 | static unsigned long h_get_24x7_catalog_page(char page[], | ||
174 | u64 version, u32 index) | ||
175 | { | ||
176 | return h_get_24x7_catalog_page_(virt_to_phys(page), | ||
177 | version, index); | ||
178 | } | ||
179 | |||
168 | static ssize_t catalog_read(struct file *filp, struct kobject *kobj, | 180 | static ssize_t catalog_read(struct file *filp, struct kobject *kobj, |
169 | struct bin_attribute *bin_attr, char *buf, | 181 | struct bin_attribute *bin_attr, char *buf, |
170 | loff_t offset, size_t count) | 182 | loff_t offset, size_t count) |
@@ -173,7 +185,7 @@ static ssize_t catalog_read(struct file *filp, struct kobject *kobj, | |||
173 | ssize_t ret = 0; | 185 | ssize_t ret = 0; |
174 | size_t catalog_len = 0, catalog_page_len = 0, page_count = 0; | 186 | size_t catalog_len = 0, catalog_page_len = 0, page_count = 0; |
175 | loff_t page_offset = 0; | 187 | loff_t page_offset = 0; |
176 | uint32_t catalog_version_num = 0; | 188 | uint64_t catalog_version_num = 0; |
177 | void *page = kmem_cache_alloc(hv_page_cache, GFP_USER); | 189 | void *page = kmem_cache_alloc(hv_page_cache, GFP_USER); |
178 | struct hv_24x7_catalog_page_0 *page_0 = page; | 190 | struct hv_24x7_catalog_page_0 *page_0 = page; |
179 | if (!page) | 191 | if (!page) |
@@ -185,7 +197,7 @@ static ssize_t catalog_read(struct file *filp, struct kobject *kobj, | |||
185 | goto e_free; | 197 | goto e_free; |
186 | } | 198 | } |
187 | 199 | ||
188 | catalog_version_num = be32_to_cpu(page_0->version); | 200 | catalog_version_num = be64_to_cpu(page_0->version); |
189 | catalog_page_len = be32_to_cpu(page_0->length); | 201 | catalog_page_len = be32_to_cpu(page_0->length); |
190 | catalog_len = catalog_page_len * 4096; | 202 | catalog_len = catalog_page_len * 4096; |
191 | 203 | ||
@@ -208,8 +220,9 @@ static ssize_t catalog_read(struct file *filp, struct kobject *kobj, | |||
208 | page, 4096, page_offset * 4096); | 220 | page, 4096, page_offset * 4096); |
209 | e_free: | 221 | e_free: |
210 | if (hret) | 222 | if (hret) |
211 | pr_err("h_get_24x7_catalog_page(ver=%d, page=%lld) failed: rc=%ld\n", | 223 | pr_err("h_get_24x7_catalog_page(ver=%lld, page=%lld) failed:" |
212 | catalog_version_num, page_offset, hret); | 224 | " rc=%ld\n", |
225 | catalog_version_num, page_offset, hret); | ||
213 | kfree(page); | 226 | kfree(page); |
214 | 227 | ||
215 | pr_devel("catalog_read: offset=%lld(%lld) count=%zu(%zu) catalog_len=%zu(%zu) => %zd\n", | 228 | pr_devel("catalog_read: offset=%lld(%lld) count=%zu(%zu) catalog_len=%zu(%zu) => %zd\n", |
@@ -243,7 +256,7 @@ e_free: \ | |||
243 | static DEVICE_ATTR_RO(_name) | 256 | static DEVICE_ATTR_RO(_name) |
244 | 257 | ||
245 | PAGE_0_ATTR(catalog_version, "%lld\n", | 258 | PAGE_0_ATTR(catalog_version, "%lld\n", |
246 | (unsigned long long)be32_to_cpu(page_0->version)); | 259 | (unsigned long long)be64_to_cpu(page_0->version)); |
247 | PAGE_0_ATTR(catalog_len, "%lld\n", | 260 | PAGE_0_ATTR(catalog_len, "%lld\n", |
248 | (unsigned long long)be32_to_cpu(page_0->length) * 4096); | 261 | (unsigned long long)be32_to_cpu(page_0->length) * 4096); |
249 | static BIN_ATTR_RO(catalog, 0/* real length varies */); | 262 | static BIN_ATTR_RO(catalog, 0/* real length varies */); |
@@ -485,13 +498,13 @@ static int hv_24x7_init(void) | |||
485 | struct hv_perf_caps caps; | 498 | struct hv_perf_caps caps; |
486 | 499 | ||
487 | if (!firmware_has_feature(FW_FEATURE_LPAR)) { | 500 | if (!firmware_has_feature(FW_FEATURE_LPAR)) { |
488 | pr_info("not a virtualized system, not enabling\n"); | 501 | pr_debug("not a virtualized system, not enabling\n"); |
489 | return -ENODEV; | 502 | return -ENODEV; |
490 | } | 503 | } |
491 | 504 | ||
492 | hret = hv_perf_caps_get(&caps); | 505 | hret = hv_perf_caps_get(&caps); |
493 | if (hret) { | 506 | if (hret) { |
494 | pr_info("could not obtain capabilities, error 0x%80lx, not enabling\n", | 507 | pr_debug("could not obtain capabilities, not enabling, rc=%ld\n", |
495 | hret); | 508 | hret); |
496 | return -ENODEV; | 509 | return -ENODEV; |
497 | } | 510 | } |
diff --git a/arch/powerpc/perf/hv-gpci.c b/arch/powerpc/perf/hv-gpci.c index 278ba7b9c2b5..c9d399a2df82 100644 --- a/arch/powerpc/perf/hv-gpci.c +++ b/arch/powerpc/perf/hv-gpci.c | |||
@@ -78,7 +78,7 @@ static ssize_t kernel_version_show(struct device *dev, | |||
78 | return sprintf(page, "0x%x\n", COUNTER_INFO_VERSION_CURRENT); | 78 | return sprintf(page, "0x%x\n", COUNTER_INFO_VERSION_CURRENT); |
79 | } | 79 | } |
80 | 80 | ||
81 | DEVICE_ATTR_RO(kernel_version); | 81 | static DEVICE_ATTR_RO(kernel_version); |
82 | HV_CAPS_ATTR(version, "0x%x\n"); | 82 | HV_CAPS_ATTR(version, "0x%x\n"); |
83 | HV_CAPS_ATTR(ga, "%d\n"); | 83 | HV_CAPS_ATTR(ga, "%d\n"); |
84 | HV_CAPS_ATTR(expanded, "%d\n"); | 84 | HV_CAPS_ATTR(expanded, "%d\n"); |
@@ -273,13 +273,13 @@ static int hv_gpci_init(void) | |||
273 | struct hv_perf_caps caps; | 273 | struct hv_perf_caps caps; |
274 | 274 | ||
275 | if (!firmware_has_feature(FW_FEATURE_LPAR)) { | 275 | if (!firmware_has_feature(FW_FEATURE_LPAR)) { |
276 | pr_info("not a virtualized system, not enabling\n"); | 276 | pr_debug("not a virtualized system, not enabling\n"); |
277 | return -ENODEV; | 277 | return -ENODEV; |
278 | } | 278 | } |
279 | 279 | ||
280 | hret = hv_perf_caps_get(&caps); | 280 | hret = hv_perf_caps_get(&caps); |
281 | if (hret) { | 281 | if (hret) { |
282 | pr_info("could not obtain capabilities, error 0x%80lx, not enabling\n", | 282 | pr_debug("could not obtain capabilities, not enabling, rc=%ld\n", |
283 | hret); | 283 | hret); |
284 | return -ENODEV; | 284 | return -ENODEV; |
285 | } | 285 | } |
diff --git a/arch/powerpc/platforms/powernv/opal-dump.c b/arch/powerpc/platforms/powernv/opal-dump.c index b9827b0d87e4..788a1977b9a5 100644 --- a/arch/powerpc/platforms/powernv/opal-dump.c +++ b/arch/powerpc/platforms/powernv/opal-dump.c | |||
@@ -209,89 +209,20 @@ static struct kobj_type dump_ktype = { | |||
209 | .default_attrs = dump_default_attrs, | 209 | .default_attrs = dump_default_attrs, |
210 | }; | 210 | }; |
211 | 211 | ||
212 | static void free_dump_sg_list(struct opal_sg_list *list) | 212 | static int64_t dump_read_info(uint32_t *dump_id, uint32_t *dump_size, uint32_t *dump_type) |
213 | { | ||
214 | struct opal_sg_list *sg1; | ||
215 | while (list) { | ||
216 | sg1 = list->next; | ||
217 | kfree(list); | ||
218 | list = sg1; | ||
219 | } | ||
220 | list = NULL; | ||
221 | } | ||
222 | |||
223 | static struct opal_sg_list *dump_data_to_sglist(struct dump_obj *dump) | ||
224 | { | ||
225 | struct opal_sg_list *sg1, *list = NULL; | ||
226 | void *addr; | ||
227 | int64_t size; | ||
228 | |||
229 | addr = dump->buffer; | ||
230 | size = dump->size; | ||
231 | |||
232 | sg1 = kzalloc(PAGE_SIZE, GFP_KERNEL); | ||
233 | if (!sg1) | ||
234 | goto nomem; | ||
235 | |||
236 | list = sg1; | ||
237 | sg1->num_entries = 0; | ||
238 | while (size > 0) { | ||
239 | /* Translate virtual address to physical address */ | ||
240 | sg1->entry[sg1->num_entries].data = | ||
241 | (void *)(vmalloc_to_pfn(addr) << PAGE_SHIFT); | ||
242 | |||
243 | if (size > PAGE_SIZE) | ||
244 | sg1->entry[sg1->num_entries].length = PAGE_SIZE; | ||
245 | else | ||
246 | sg1->entry[sg1->num_entries].length = size; | ||
247 | |||
248 | sg1->num_entries++; | ||
249 | if (sg1->num_entries >= SG_ENTRIES_PER_NODE) { | ||
250 | sg1->next = kzalloc(PAGE_SIZE, GFP_KERNEL); | ||
251 | if (!sg1->next) | ||
252 | goto nomem; | ||
253 | |||
254 | sg1 = sg1->next; | ||
255 | sg1->num_entries = 0; | ||
256 | } | ||
257 | addr += PAGE_SIZE; | ||
258 | size -= PAGE_SIZE; | ||
259 | } | ||
260 | return list; | ||
261 | |||
262 | nomem: | ||
263 | pr_err("%s : Failed to allocate memory\n", __func__); | ||
264 | free_dump_sg_list(list); | ||
265 | return NULL; | ||
266 | } | ||
267 | |||
268 | static void sglist_to_phy_addr(struct opal_sg_list *list) | ||
269 | { | ||
270 | struct opal_sg_list *sg, *next; | ||
271 | |||
272 | for (sg = list; sg; sg = next) { | ||
273 | next = sg->next; | ||
274 | /* Don't translate NULL pointer for last entry */ | ||
275 | if (sg->next) | ||
276 | sg->next = (struct opal_sg_list *)__pa(sg->next); | ||
277 | else | ||
278 | sg->next = NULL; | ||
279 | |||
280 | /* Convert num_entries to length */ | ||
281 | sg->num_entries = | ||
282 | sg->num_entries * sizeof(struct opal_sg_entry) + 16; | ||
283 | } | ||
284 | } | ||
285 | |||
286 | static int64_t dump_read_info(uint32_t *id, uint32_t *size, uint32_t *type) | ||
287 | { | 213 | { |
214 | __be32 id, size, type; | ||
288 | int rc; | 215 | int rc; |
289 | *type = 0xffffffff; | ||
290 | 216 | ||
291 | rc = opal_dump_info2(id, size, type); | 217 | type = cpu_to_be32(0xffffffff); |
292 | 218 | ||
219 | rc = opal_dump_info2(&id, &size, &type); | ||
293 | if (rc == OPAL_PARAMETER) | 220 | if (rc == OPAL_PARAMETER) |
294 | rc = opal_dump_info(id, size); | 221 | rc = opal_dump_info(&id, &size); |
222 | |||
223 | *dump_id = be32_to_cpu(id); | ||
224 | *dump_size = be32_to_cpu(size); | ||
225 | *dump_type = be32_to_cpu(type); | ||
295 | 226 | ||
296 | if (rc) | 227 | if (rc) |
297 | pr_warn("%s: Failed to get dump info (%d)\n", | 228 | pr_warn("%s: Failed to get dump info (%d)\n", |
@@ -314,15 +245,12 @@ static int64_t dump_read_data(struct dump_obj *dump) | |||
314 | } | 245 | } |
315 | 246 | ||
316 | /* Generate SG list */ | 247 | /* Generate SG list */ |
317 | list = dump_data_to_sglist(dump); | 248 | list = opal_vmalloc_to_sg_list(dump->buffer, dump->size); |
318 | if (!list) { | 249 | if (!list) { |
319 | rc = -ENOMEM; | 250 | rc = -ENOMEM; |
320 | goto out; | 251 | goto out; |
321 | } | 252 | } |
322 | 253 | ||
323 | /* Translate sg list addr to real address */ | ||
324 | sglist_to_phy_addr(list); | ||
325 | |||
326 | /* First entry address */ | 254 | /* First entry address */ |
327 | addr = __pa(list); | 255 | addr = __pa(list); |
328 | 256 | ||
@@ -341,7 +269,7 @@ static int64_t dump_read_data(struct dump_obj *dump) | |||
341 | __func__, dump->id); | 269 | __func__, dump->id); |
342 | 270 | ||
343 | /* Free SG list */ | 271 | /* Free SG list */ |
344 | free_dump_sg_list(list); | 272 | opal_free_sg_list(list); |
345 | 273 | ||
346 | out: | 274 | out: |
347 | return rc; | 275 | return rc; |
diff --git a/arch/powerpc/platforms/powernv/opal-elog.c b/arch/powerpc/platforms/powernv/opal-elog.c index ef7bc2a97862..10268c41d830 100644 --- a/arch/powerpc/platforms/powernv/opal-elog.c +++ b/arch/powerpc/platforms/powernv/opal-elog.c | |||
@@ -238,18 +238,25 @@ static struct elog_obj *create_elog_obj(uint64_t id, size_t size, uint64_t type) | |||
238 | 238 | ||
239 | static void elog_work_fn(struct work_struct *work) | 239 | static void elog_work_fn(struct work_struct *work) |
240 | { | 240 | { |
241 | size_t elog_size; | 241 | __be64 size; |
242 | __be64 id; | ||
243 | __be64 type; | ||
244 | uint64_t elog_size; | ||
242 | uint64_t log_id; | 245 | uint64_t log_id; |
243 | uint64_t elog_type; | 246 | uint64_t elog_type; |
244 | int rc; | 247 | int rc; |
245 | char name[2+16+1]; | 248 | char name[2+16+1]; |
246 | 249 | ||
247 | rc = opal_get_elog_size(&log_id, &elog_size, &elog_type); | 250 | rc = opal_get_elog_size(&id, &size, &type); |
248 | if (rc != OPAL_SUCCESS) { | 251 | if (rc != OPAL_SUCCESS) { |
249 | pr_err("ELOG: Opal log read failed\n"); | 252 | pr_err("ELOG: Opal log read failed\n"); |
250 | return; | 253 | return; |
251 | } | 254 | } |
252 | 255 | ||
256 | elog_size = be64_to_cpu(size); | ||
257 | log_id = be64_to_cpu(id); | ||
258 | elog_type = be64_to_cpu(type); | ||
259 | |||
253 | BUG_ON(elog_size > OPAL_MAX_ERRLOG_SIZE); | 260 | BUG_ON(elog_size > OPAL_MAX_ERRLOG_SIZE); |
254 | 261 | ||
255 | if (elog_size >= OPAL_MAX_ERRLOG_SIZE) | 262 | if (elog_size >= OPAL_MAX_ERRLOG_SIZE) |
diff --git a/arch/powerpc/platforms/powernv/opal-flash.c b/arch/powerpc/platforms/powernv/opal-flash.c index 714ef972406b..dc487ff04704 100644 --- a/arch/powerpc/platforms/powernv/opal-flash.c +++ b/arch/powerpc/platforms/powernv/opal-flash.c | |||
@@ -79,9 +79,6 @@ | |||
79 | /* XXX: Assume candidate image size is <= 1GB */ | 79 | /* XXX: Assume candidate image size is <= 1GB */ |
80 | #define MAX_IMAGE_SIZE 0x40000000 | 80 | #define MAX_IMAGE_SIZE 0x40000000 |
81 | 81 | ||
82 | /* Flash sg list version */ | ||
83 | #define SG_LIST_VERSION (1UL) | ||
84 | |||
85 | /* Image status */ | 82 | /* Image status */ |
86 | enum { | 83 | enum { |
87 | IMAGE_INVALID, | 84 | IMAGE_INVALID, |
@@ -131,11 +128,15 @@ static DEFINE_MUTEX(image_data_mutex); | |||
131 | */ | 128 | */ |
132 | static inline void opal_flash_validate(void) | 129 | static inline void opal_flash_validate(void) |
133 | { | 130 | { |
134 | struct validate_flash_t *args_buf = &validate_flash_data; | 131 | long ret; |
132 | void *buf = validate_flash_data.buf; | ||
133 | __be32 size, result; | ||
135 | 134 | ||
136 | args_buf->status = opal_validate_flash(__pa(args_buf->buf), | 135 | ret = opal_validate_flash(__pa(buf), &size, &result); |
137 | &(args_buf->buf_size), | 136 | |
138 | &(args_buf->result)); | 137 | validate_flash_data.status = ret; |
138 | validate_flash_data.buf_size = be32_to_cpu(size); | ||
139 | validate_flash_data.result = be32_to_cpu(result); | ||
139 | } | 140 | } |
140 | 141 | ||
141 | /* | 142 | /* |
@@ -268,93 +269,11 @@ static ssize_t manage_store(struct kobject *kobj, | |||
268 | } | 269 | } |
269 | 270 | ||
270 | /* | 271 | /* |
271 | * Free sg list | ||
272 | */ | ||
273 | static void free_sg_list(struct opal_sg_list *list) | ||
274 | { | ||
275 | struct opal_sg_list *sg1; | ||
276 | while (list) { | ||
277 | sg1 = list->next; | ||
278 | kfree(list); | ||
279 | list = sg1; | ||
280 | } | ||
281 | list = NULL; | ||
282 | } | ||
283 | |||
284 | /* | ||
285 | * Build candidate image scatter gather list | ||
286 | * | ||
287 | * list format: | ||
288 | * ----------------------------------- | ||
289 | * | VER (8) | Entry length in bytes | | ||
290 | * ----------------------------------- | ||
291 | * | Pointer to next entry | | ||
292 | * ----------------------------------- | ||
293 | * | Address of memory area 1 | | ||
294 | * ----------------------------------- | ||
295 | * | Length of memory area 1 | | ||
296 | * ----------------------------------- | ||
297 | * | ......... | | ||
298 | * ----------------------------------- | ||
299 | * | ......... | | ||
300 | * ----------------------------------- | ||
301 | * | Address of memory area N | | ||
302 | * ----------------------------------- | ||
303 | * | Length of memory area N | | ||
304 | * ----------------------------------- | ||
305 | */ | ||
306 | static struct opal_sg_list *image_data_to_sglist(void) | ||
307 | { | ||
308 | struct opal_sg_list *sg1, *list = NULL; | ||
309 | void *addr; | ||
310 | int size; | ||
311 | |||
312 | addr = image_data.data; | ||
313 | size = image_data.size; | ||
314 | |||
315 | sg1 = kzalloc(PAGE_SIZE, GFP_KERNEL); | ||
316 | if (!sg1) | ||
317 | return NULL; | ||
318 | |||
319 | list = sg1; | ||
320 | sg1->num_entries = 0; | ||
321 | while (size > 0) { | ||
322 | /* Translate virtual address to physical address */ | ||
323 | sg1->entry[sg1->num_entries].data = | ||
324 | (void *)(vmalloc_to_pfn(addr) << PAGE_SHIFT); | ||
325 | |||
326 | if (size > PAGE_SIZE) | ||
327 | sg1->entry[sg1->num_entries].length = PAGE_SIZE; | ||
328 | else | ||
329 | sg1->entry[sg1->num_entries].length = size; | ||
330 | |||
331 | sg1->num_entries++; | ||
332 | if (sg1->num_entries >= SG_ENTRIES_PER_NODE) { | ||
333 | sg1->next = kzalloc(PAGE_SIZE, GFP_KERNEL); | ||
334 | if (!sg1->next) { | ||
335 | pr_err("%s : Failed to allocate memory\n", | ||
336 | __func__); | ||
337 | goto nomem; | ||
338 | } | ||
339 | |||
340 | sg1 = sg1->next; | ||
341 | sg1->num_entries = 0; | ||
342 | } | ||
343 | addr += PAGE_SIZE; | ||
344 | size -= PAGE_SIZE; | ||
345 | } | ||
346 | return list; | ||
347 | nomem: | ||
348 | free_sg_list(list); | ||
349 | return NULL; | ||
350 | } | ||
351 | |||
352 | /* | ||
353 | * OPAL update flash | 272 | * OPAL update flash |
354 | */ | 273 | */ |
355 | static int opal_flash_update(int op) | 274 | static int opal_flash_update(int op) |
356 | { | 275 | { |
357 | struct opal_sg_list *sg, *list, *next; | 276 | struct opal_sg_list *list; |
358 | unsigned long addr; | 277 | unsigned long addr; |
359 | int64_t rc = OPAL_PARAMETER; | 278 | int64_t rc = OPAL_PARAMETER; |
360 | 279 | ||
@@ -364,30 +283,13 @@ static int opal_flash_update(int op) | |||
364 | goto flash; | 283 | goto flash; |
365 | } | 284 | } |
366 | 285 | ||
367 | list = image_data_to_sglist(); | 286 | list = opal_vmalloc_to_sg_list(image_data.data, image_data.size); |
368 | if (!list) | 287 | if (!list) |
369 | goto invalid_img; | 288 | goto invalid_img; |
370 | 289 | ||
371 | /* First entry address */ | 290 | /* First entry address */ |
372 | addr = __pa(list); | 291 | addr = __pa(list); |
373 | 292 | ||
374 | /* Translate sg list address to absolute */ | ||
375 | for (sg = list; sg; sg = next) { | ||
376 | next = sg->next; | ||
377 | /* Don't translate NULL pointer for last entry */ | ||
378 | if (sg->next) | ||
379 | sg->next = (struct opal_sg_list *)__pa(sg->next); | ||
380 | else | ||
381 | sg->next = NULL; | ||
382 | |||
383 | /* | ||
384 | * Convert num_entries to version/length format | ||
385 | * to satisfy OPAL. | ||
386 | */ | ||
387 | sg->num_entries = (SG_LIST_VERSION << 56) | | ||
388 | (sg->num_entries * sizeof(struct opal_sg_entry) + 16); | ||
389 | } | ||
390 | |||
391 | pr_alert("FLASH: Image is %u bytes\n", image_data.size); | 293 | pr_alert("FLASH: Image is %u bytes\n", image_data.size); |
392 | pr_alert("FLASH: Image update requested\n"); | 294 | pr_alert("FLASH: Image update requested\n"); |
393 | pr_alert("FLASH: Image will be updated during system reboot\n"); | 295 | pr_alert("FLASH: Image will be updated during system reboot\n"); |
diff --git a/arch/powerpc/platforms/powernv/opal-sysparam.c b/arch/powerpc/platforms/powernv/opal-sysparam.c index 6b614726baf2..d202f9bc3683 100644 --- a/arch/powerpc/platforms/powernv/opal-sysparam.c +++ b/arch/powerpc/platforms/powernv/opal-sysparam.c | |||
@@ -39,10 +39,11 @@ struct param_attr { | |||
39 | struct kobj_attribute kobj_attr; | 39 | struct kobj_attribute kobj_attr; |
40 | }; | 40 | }; |
41 | 41 | ||
42 | static int opal_get_sys_param(u32 param_id, u32 length, void *buffer) | 42 | static ssize_t opal_get_sys_param(u32 param_id, u32 length, void *buffer) |
43 | { | 43 | { |
44 | struct opal_msg msg; | 44 | struct opal_msg msg; |
45 | int ret, token; | 45 | ssize_t ret; |
46 | int token; | ||
46 | 47 | ||
47 | token = opal_async_get_token_interruptible(); | 48 | token = opal_async_get_token_interruptible(); |
48 | if (token < 0) { | 49 | if (token < 0) { |
@@ -59,7 +60,7 @@ static int opal_get_sys_param(u32 param_id, u32 length, void *buffer) | |||
59 | 60 | ||
60 | ret = opal_async_wait_response(token, &msg); | 61 | ret = opal_async_wait_response(token, &msg); |
61 | if (ret) { | 62 | if (ret) { |
62 | pr_err("%s: Failed to wait for the async response, %d\n", | 63 | pr_err("%s: Failed to wait for the async response, %zd\n", |
63 | __func__, ret); | 64 | __func__, ret); |
64 | goto out_token; | 65 | goto out_token; |
65 | } | 66 | } |
@@ -111,7 +112,7 @@ static ssize_t sys_param_show(struct kobject *kobj, | |||
111 | { | 112 | { |
112 | struct param_attr *attr = container_of(kobj_attr, struct param_attr, | 113 | struct param_attr *attr = container_of(kobj_attr, struct param_attr, |
113 | kobj_attr); | 114 | kobj_attr); |
114 | int ret; | 115 | ssize_t ret; |
115 | 116 | ||
116 | mutex_lock(&opal_sysparam_mutex); | 117 | mutex_lock(&opal_sysparam_mutex); |
117 | ret = opal_get_sys_param(attr->param_id, attr->param_size, | 118 | ret = opal_get_sys_param(attr->param_id, attr->param_size, |
@@ -121,9 +122,10 @@ static ssize_t sys_param_show(struct kobject *kobj, | |||
121 | 122 | ||
122 | memcpy(buf, param_data_buf, attr->param_size); | 123 | memcpy(buf, param_data_buf, attr->param_size); |
123 | 124 | ||
125 | ret = attr->param_size; | ||
124 | out: | 126 | out: |
125 | mutex_unlock(&opal_sysparam_mutex); | 127 | mutex_unlock(&opal_sysparam_mutex); |
126 | return ret ? ret : attr->param_size; | 128 | return ret; |
127 | } | 129 | } |
128 | 130 | ||
129 | static ssize_t sys_param_store(struct kobject *kobj, | 131 | static ssize_t sys_param_store(struct kobject *kobj, |
@@ -131,14 +133,20 @@ static ssize_t sys_param_store(struct kobject *kobj, | |||
131 | { | 133 | { |
132 | struct param_attr *attr = container_of(kobj_attr, struct param_attr, | 134 | struct param_attr *attr = container_of(kobj_attr, struct param_attr, |
133 | kobj_attr); | 135 | kobj_attr); |
134 | int ret; | 136 | ssize_t ret; |
137 | |||
138 | /* MAX_PARAM_DATA_LEN is sizeof(param_data_buf) */ | ||
139 | if (count > MAX_PARAM_DATA_LEN) | ||
140 | count = MAX_PARAM_DATA_LEN; | ||
135 | 141 | ||
136 | mutex_lock(&opal_sysparam_mutex); | 142 | mutex_lock(&opal_sysparam_mutex); |
137 | memcpy(param_data_buf, buf, count); | 143 | memcpy(param_data_buf, buf, count); |
138 | ret = opal_set_sys_param(attr->param_id, attr->param_size, | 144 | ret = opal_set_sys_param(attr->param_id, attr->param_size, |
139 | param_data_buf); | 145 | param_data_buf); |
140 | mutex_unlock(&opal_sysparam_mutex); | 146 | mutex_unlock(&opal_sysparam_mutex); |
141 | return ret ? ret : count; | 147 | if (!ret) |
148 | ret = count; | ||
149 | return ret; | ||
142 | } | 150 | } |
143 | 151 | ||
144 | void __init opal_sys_param_init(void) | 152 | void __init opal_sys_param_init(void) |
@@ -214,13 +222,13 @@ void __init opal_sys_param_init(void) | |||
214 | } | 222 | } |
215 | 223 | ||
216 | if (of_property_read_u32_array(sysparam, "param-len", size, count)) { | 224 | if (of_property_read_u32_array(sysparam, "param-len", size, count)) { |
217 | pr_err("SYSPARAM: Missing propery param-len in the DT\n"); | 225 | pr_err("SYSPARAM: Missing property param-len in the DT\n"); |
218 | goto out_free_perm; | 226 | goto out_free_perm; |
219 | } | 227 | } |
220 | 228 | ||
221 | 229 | ||
222 | if (of_property_read_u8_array(sysparam, "param-perm", perm, count)) { | 230 | if (of_property_read_u8_array(sysparam, "param-perm", perm, count)) { |
223 | pr_err("SYSPARAM: Missing propery param-perm in the DT\n"); | 231 | pr_err("SYSPARAM: Missing property param-perm in the DT\n"); |
224 | goto out_free_perm; | 232 | goto out_free_perm; |
225 | } | 233 | } |
226 | 234 | ||
@@ -233,6 +241,12 @@ void __init opal_sys_param_init(void) | |||
233 | 241 | ||
234 | /* For each of the parameters, populate the parameter attributes */ | 242 | /* For each of the parameters, populate the parameter attributes */ |
235 | for (i = 0; i < count; i++) { | 243 | for (i = 0; i < count; i++) { |
244 | if (size[i] > MAX_PARAM_DATA_LEN) { | ||
245 | pr_warn("SYSPARAM: Not creating parameter %d as size " | ||
246 | "exceeds buffer length\n", i); | ||
247 | continue; | ||
248 | } | ||
249 | |||
236 | sysfs_attr_init(&attr[i].kobj_attr.attr); | 250 | sysfs_attr_init(&attr[i].kobj_attr.attr); |
237 | attr[i].param_id = id[i]; | 251 | attr[i].param_id = id[i]; |
238 | attr[i].param_size = size[i]; | 252 | attr[i].param_size = size[i]; |
diff --git a/arch/powerpc/platforms/powernv/opal.c b/arch/powerpc/platforms/powernv/opal.c index 49d2f00019e5..360ad80c754c 100644 --- a/arch/powerpc/platforms/powernv/opal.c +++ b/arch/powerpc/platforms/powernv/opal.c | |||
@@ -242,14 +242,14 @@ void opal_notifier_update_evt(uint64_t evt_mask, | |||
242 | void opal_notifier_enable(void) | 242 | void opal_notifier_enable(void) |
243 | { | 243 | { |
244 | int64_t rc; | 244 | int64_t rc; |
245 | uint64_t evt = 0; | 245 | __be64 evt = 0; |
246 | 246 | ||
247 | atomic_set(&opal_notifier_hold, 0); | 247 | atomic_set(&opal_notifier_hold, 0); |
248 | 248 | ||
249 | /* Process pending events */ | 249 | /* Process pending events */ |
250 | rc = opal_poll_events(&evt); | 250 | rc = opal_poll_events(&evt); |
251 | if (rc == OPAL_SUCCESS && evt) | 251 | if (rc == OPAL_SUCCESS && evt) |
252 | opal_do_notifier(evt); | 252 | opal_do_notifier(be64_to_cpu(evt)); |
253 | } | 253 | } |
254 | 254 | ||
255 | void opal_notifier_disable(void) | 255 | void opal_notifier_disable(void) |
@@ -529,7 +529,7 @@ static irqreturn_t opal_interrupt(int irq, void *data) | |||
529 | 529 | ||
530 | opal_handle_interrupt(virq_to_hw(irq), &events); | 530 | opal_handle_interrupt(virq_to_hw(irq), &events); |
531 | 531 | ||
532 | opal_do_notifier(events); | 532 | opal_do_notifier(be64_to_cpu(events)); |
533 | 533 | ||
534 | return IRQ_HANDLED; | 534 | return IRQ_HANDLED; |
535 | } | 535 | } |
@@ -638,3 +638,66 @@ void opal_shutdown(void) | |||
638 | 638 | ||
639 | /* Export this so that test modules can use it */ | 639 | /* Export this so that test modules can use it */ |
640 | EXPORT_SYMBOL_GPL(opal_invalid_call); | 640 | EXPORT_SYMBOL_GPL(opal_invalid_call); |
641 | |||
642 | /* Convert a region of vmalloc memory to an opal sg list */ | ||
643 | struct opal_sg_list *opal_vmalloc_to_sg_list(void *vmalloc_addr, | ||
644 | unsigned long vmalloc_size) | ||
645 | { | ||
646 | struct opal_sg_list *sg, *first = NULL; | ||
647 | unsigned long i = 0; | ||
648 | |||
649 | sg = kzalloc(PAGE_SIZE, GFP_KERNEL); | ||
650 | if (!sg) | ||
651 | goto nomem; | ||
652 | |||
653 | first = sg; | ||
654 | |||
655 | while (vmalloc_size > 0) { | ||
656 | uint64_t data = vmalloc_to_pfn(vmalloc_addr) << PAGE_SHIFT; | ||
657 | uint64_t length = min(vmalloc_size, PAGE_SIZE); | ||
658 | |||
659 | sg->entry[i].data = cpu_to_be64(data); | ||
660 | sg->entry[i].length = cpu_to_be64(length); | ||
661 | i++; | ||
662 | |||
663 | if (i >= SG_ENTRIES_PER_NODE) { | ||
664 | struct opal_sg_list *next; | ||
665 | |||
666 | next = kzalloc(PAGE_SIZE, GFP_KERNEL); | ||
667 | if (!next) | ||
668 | goto nomem; | ||
669 | |||
670 | sg->length = cpu_to_be64( | ||
671 | i * sizeof(struct opal_sg_entry) + 16); | ||
672 | i = 0; | ||
673 | sg->next = cpu_to_be64(__pa(next)); | ||
674 | sg = next; | ||
675 | } | ||
676 | |||
677 | vmalloc_addr += length; | ||
678 | vmalloc_size -= length; | ||
679 | } | ||
680 | |||
681 | sg->length = cpu_to_be64(i * sizeof(struct opal_sg_entry) + 16); | ||
682 | |||
683 | return first; | ||
684 | |||
685 | nomem: | ||
686 | pr_err("%s : Failed to allocate memory\n", __func__); | ||
687 | opal_free_sg_list(first); | ||
688 | return NULL; | ||
689 | } | ||
690 | |||
691 | void opal_free_sg_list(struct opal_sg_list *sg) | ||
692 | { | ||
693 | while (sg) { | ||
694 | uint64_t next = be64_to_cpu(sg->next); | ||
695 | |||
696 | kfree(sg); | ||
697 | |||
698 | if (next) | ||
699 | sg = __va(next); | ||
700 | else | ||
701 | sg = NULL; | ||
702 | } | ||
703 | } | ||
diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c index 3b2b4fb3585b..98824aa99173 100644 --- a/arch/powerpc/platforms/powernv/pci-ioda.c +++ b/arch/powerpc/platforms/powernv/pci-ioda.c | |||
@@ -343,7 +343,6 @@ static void pnv_ioda_setup_same_PE(struct pci_bus *bus, struct pnv_ioda_pe *pe) | |||
343 | pci_name(dev)); | 343 | pci_name(dev)); |
344 | continue; | 344 | continue; |
345 | } | 345 | } |
346 | pci_dev_get(dev); | ||
347 | pdn->pcidev = dev; | 346 | pdn->pcidev = dev; |
348 | pdn->pe_number = pe->pe_number; | 347 | pdn->pe_number = pe->pe_number; |
349 | pe->dma_weight += pnv_ioda_dma_weight(dev); | 348 | pe->dma_weight += pnv_ioda_dma_weight(dev); |
@@ -462,7 +461,7 @@ static void pnv_pci_ioda_dma_dev_setup(struct pnv_phb *phb, struct pci_dev *pdev | |||
462 | 461 | ||
463 | pe = &phb->ioda.pe_array[pdn->pe_number]; | 462 | pe = &phb->ioda.pe_array[pdn->pe_number]; |
464 | WARN_ON(get_dma_ops(&pdev->dev) != &dma_iommu_ops); | 463 | WARN_ON(get_dma_ops(&pdev->dev) != &dma_iommu_ops); |
465 | set_iommu_table_base_and_group(&pdev->dev, &pe->tce32_table); | 464 | set_iommu_table_base(&pdev->dev, &pe->tce32_table); |
466 | } | 465 | } |
467 | 466 | ||
468 | static int pnv_pci_ioda_dma_set_mask(struct pnv_phb *phb, | 467 | static int pnv_pci_ioda_dma_set_mask(struct pnv_phb *phb, |
diff --git a/arch/powerpc/platforms/powernv/setup.c b/arch/powerpc/platforms/powernv/setup.c index 61cf8fa9c61b..8723d32632f5 100644 --- a/arch/powerpc/platforms/powernv/setup.c +++ b/arch/powerpc/platforms/powernv/setup.c | |||
@@ -162,18 +162,62 @@ static void pnv_shutdown(void) | |||
162 | } | 162 | } |
163 | 163 | ||
164 | #ifdef CONFIG_KEXEC | 164 | #ifdef CONFIG_KEXEC |
165 | static void pnv_kexec_wait_secondaries_down(void) | ||
166 | { | ||
167 | int my_cpu, i, notified = -1; | ||
168 | |||
169 | my_cpu = get_cpu(); | ||
170 | |||
171 | for_each_online_cpu(i) { | ||
172 | uint8_t status; | ||
173 | int64_t rc; | ||
174 | |||
175 | if (i == my_cpu) | ||
176 | continue; | ||
177 | |||
178 | for (;;) { | ||
179 | rc = opal_query_cpu_status(get_hard_smp_processor_id(i), | ||
180 | &status); | ||
181 | if (rc != OPAL_SUCCESS || status != OPAL_THREAD_STARTED) | ||
182 | break; | ||
183 | barrier(); | ||
184 | if (i != notified) { | ||
185 | printk(KERN_INFO "kexec: waiting for cpu %d " | ||
186 | "(physical %d) to enter OPAL\n", | ||
187 | i, paca[i].hw_cpu_id); | ||
188 | notified = i; | ||
189 | } | ||
190 | } | ||
191 | } | ||
192 | } | ||
193 | |||
165 | static void pnv_kexec_cpu_down(int crash_shutdown, int secondary) | 194 | static void pnv_kexec_cpu_down(int crash_shutdown, int secondary) |
166 | { | 195 | { |
167 | xics_kexec_teardown_cpu(secondary); | 196 | xics_kexec_teardown_cpu(secondary); |
168 | 197 | ||
169 | /* Return secondary CPUs to firmware on OPAL v3 */ | 198 | /* On OPAL v3, we return all CPUs to firmware */ |
170 | if (firmware_has_feature(FW_FEATURE_OPALv3) && secondary) { | 199 | |
200 | if (!firmware_has_feature(FW_FEATURE_OPALv3)) | ||
201 | return; | ||
202 | |||
203 | if (secondary) { | ||
204 | /* Return secondary CPUs to firmware on OPAL v3 */ | ||
171 | mb(); | 205 | mb(); |
172 | get_paca()->kexec_state = KEXEC_STATE_REAL_MODE; | 206 | get_paca()->kexec_state = KEXEC_STATE_REAL_MODE; |
173 | mb(); | 207 | mb(); |
174 | 208 | ||
175 | /* Return the CPU to OPAL */ | 209 | /* Return the CPU to OPAL */ |
176 | opal_return_cpu(); | 210 | opal_return_cpu(); |
211 | } else if (crash_shutdown) { | ||
212 | /* | ||
213 | * On crash, we don't wait for secondaries to go | ||
214 | * down as they might be unreachable or hung, so | ||
215 | * instead we just wait a bit and move on. | ||
216 | */ | ||
217 | mdelay(1); | ||
218 | } else { | ||
219 | /* Primary waits for the secondaries to have reached OPAL */ | ||
220 | pnv_kexec_wait_secondaries_down(); | ||
177 | } | 221 | } |
178 | } | 222 | } |
179 | #endif /* CONFIG_KEXEC */ | 223 | #endif /* CONFIG_KEXEC */ |
diff --git a/arch/powerpc/platforms/powernv/smp.c b/arch/powerpc/platforms/powernv/smp.c index 908672bdcea6..bf5fcd452168 100644 --- a/arch/powerpc/platforms/powernv/smp.c +++ b/arch/powerpc/platforms/powernv/smp.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <asm/cputhreads.h> | 30 | #include <asm/cputhreads.h> |
31 | #include <asm/xics.h> | 31 | #include <asm/xics.h> |
32 | #include <asm/opal.h> | 32 | #include <asm/opal.h> |
33 | #include <asm/runlatch.h> | ||
33 | 34 | ||
34 | #include "powernv.h" | 35 | #include "powernv.h" |
35 | 36 | ||
@@ -156,7 +157,9 @@ static void pnv_smp_cpu_kill_self(void) | |||
156 | */ | 157 | */ |
157 | mtspr(SPRN_LPCR, mfspr(SPRN_LPCR) & ~(u64)LPCR_PECE1); | 158 | mtspr(SPRN_LPCR, mfspr(SPRN_LPCR) & ~(u64)LPCR_PECE1); |
158 | while (!generic_check_cpu_restart(cpu)) { | 159 | while (!generic_check_cpu_restart(cpu)) { |
160 | ppc64_runlatch_off(); | ||
159 | power7_nap(); | 161 | power7_nap(); |
162 | ppc64_runlatch_on(); | ||
160 | if (!generic_check_cpu_restart(cpu)) { | 163 | if (!generic_check_cpu_restart(cpu)) { |
161 | DBG("CPU%d Unexpected exit while offline !\n", cpu); | 164 | DBG("CPU%d Unexpected exit while offline !\n", cpu); |
162 | /* We may be getting an IPI, so we re-enable | 165 | /* We may be getting an IPI, so we re-enable |
diff --git a/arch/powerpc/platforms/pseries/hotplug-cpu.c b/arch/powerpc/platforms/pseries/hotplug-cpu.c index 9b8e05078a63..20d62975856f 100644 --- a/arch/powerpc/platforms/pseries/hotplug-cpu.c +++ b/arch/powerpc/platforms/pseries/hotplug-cpu.c | |||
@@ -88,13 +88,14 @@ void set_default_offline_state(int cpu) | |||
88 | 88 | ||
89 | static void rtas_stop_self(void) | 89 | static void rtas_stop_self(void) |
90 | { | 90 | { |
91 | struct rtas_args args = { | 91 | static struct rtas_args args = { |
92 | .token = cpu_to_be32(rtas_stop_self_token), | ||
93 | .nargs = 0, | 92 | .nargs = 0, |
94 | .nret = 1, | 93 | .nret = 1, |
95 | .rets = &args.args[0], | 94 | .rets = &args.args[0], |
96 | }; | 95 | }; |
97 | 96 | ||
97 | args.token = cpu_to_be32(rtas_stop_self_token); | ||
98 | |||
98 | local_irq_disable(); | 99 | local_irq_disable(); |
99 | 100 | ||
100 | BUG_ON(rtas_stop_self_token == RTAS_UNKNOWN_SERVICE); | 101 | BUG_ON(rtas_stop_self_token == RTAS_UNKNOWN_SERVICE); |
diff --git a/arch/powerpc/platforms/pseries/hotplug-memory.c b/arch/powerpc/platforms/pseries/hotplug-memory.c index 573b488fc48b..7f75c94af822 100644 --- a/arch/powerpc/platforms/pseries/hotplug-memory.c +++ b/arch/powerpc/platforms/pseries/hotplug-memory.c | |||
@@ -100,10 +100,10 @@ static int pseries_remove_memblock(unsigned long base, unsigned int memblock_siz | |||
100 | 100 | ||
101 | start_pfn = base >> PAGE_SHIFT; | 101 | start_pfn = base >> PAGE_SHIFT; |
102 | 102 | ||
103 | if (!pfn_valid(start_pfn)) { | 103 | lock_device_hotplug(); |
104 | memblock_remove(base, memblock_size); | 104 | |
105 | return 0; | 105 | if (!pfn_valid(start_pfn)) |
106 | } | 106 | goto out; |
107 | 107 | ||
108 | block_sz = memory_block_size_bytes(); | 108 | block_sz = memory_block_size_bytes(); |
109 | sections_per_block = block_sz / MIN_MEMORY_BLOCK_SIZE; | 109 | sections_per_block = block_sz / MIN_MEMORY_BLOCK_SIZE; |
@@ -114,8 +114,10 @@ static int pseries_remove_memblock(unsigned long base, unsigned int memblock_siz | |||
114 | base += MIN_MEMORY_BLOCK_SIZE; | 114 | base += MIN_MEMORY_BLOCK_SIZE; |
115 | } | 115 | } |
116 | 116 | ||
117 | out: | ||
117 | /* Update memory regions for memory remove */ | 118 | /* Update memory regions for memory remove */ |
118 | memblock_remove(base, memblock_size); | 119 | memblock_remove(base, memblock_size); |
120 | unlock_device_hotplug(); | ||
119 | return 0; | 121 | return 0; |
120 | } | 122 | } |
121 | 123 | ||
diff --git a/arch/powerpc/sysdev/ppc4xx_pci.c b/arch/powerpc/sysdev/ppc4xx_pci.c index 64603a10b863..4914fd3f41ec 100644 --- a/arch/powerpc/sysdev/ppc4xx_pci.c +++ b/arch/powerpc/sysdev/ppc4xx_pci.c | |||
@@ -1058,7 +1058,7 @@ static int __init apm821xx_pciex_core_init(struct device_node *np) | |||
1058 | return 1; | 1058 | return 1; |
1059 | } | 1059 | } |
1060 | 1060 | ||
1061 | static int apm821xx_pciex_init_port_hw(struct ppc4xx_pciex_port *port) | 1061 | static int __init apm821xx_pciex_init_port_hw(struct ppc4xx_pciex_port *port) |
1062 | { | 1062 | { |
1063 | u32 val; | 1063 | u32 val; |
1064 | 1064 | ||
diff --git a/arch/s390/include/asm/ccwgroup.h b/arch/s390/include/asm/ccwgroup.h index 6e670f88d125..ebc2913f9ee0 100644 --- a/arch/s390/include/asm/ccwgroup.h +++ b/arch/s390/include/asm/ccwgroup.h | |||
@@ -22,8 +22,8 @@ struct ccwgroup_device { | |||
22 | /* public: */ | 22 | /* public: */ |
23 | unsigned int count; | 23 | unsigned int count; |
24 | struct device dev; | 24 | struct device dev; |
25 | struct ccw_device *cdev[0]; | ||
26 | struct work_struct ungroup_work; | 25 | struct work_struct ungroup_work; |
26 | struct ccw_device *cdev[0]; | ||
27 | }; | 27 | }; |
28 | 28 | ||
29 | /** | 29 | /** |
diff --git a/arch/s390/include/asm/tlb.h b/arch/s390/include/asm/tlb.h index c544b6f05d95..a25f09fbaf36 100644 --- a/arch/s390/include/asm/tlb.h +++ b/arch/s390/include/asm/tlb.h | |||
@@ -59,12 +59,23 @@ static inline void tlb_gather_mmu(struct mmu_gather *tlb, | |||
59 | tlb->batch = NULL; | 59 | tlb->batch = NULL; |
60 | } | 60 | } |
61 | 61 | ||
62 | static inline void tlb_flush_mmu(struct mmu_gather *tlb) | 62 | static inline void tlb_flush_mmu_tlbonly(struct mmu_gather *tlb) |
63 | { | 63 | { |
64 | __tlb_flush_mm_lazy(tlb->mm); | 64 | __tlb_flush_mm_lazy(tlb->mm); |
65 | } | ||
66 | |||
67 | static inline void tlb_flush_mmu_free(struct mmu_gather *tlb) | ||
68 | { | ||
65 | tlb_table_flush(tlb); | 69 | tlb_table_flush(tlb); |
66 | } | 70 | } |
67 | 71 | ||
72 | |||
73 | static inline void tlb_flush_mmu(struct mmu_gather *tlb) | ||
74 | { | ||
75 | tlb_flush_mmu_tlbonly(tlb); | ||
76 | tlb_flush_mmu_free(tlb); | ||
77 | } | ||
78 | |||
68 | static inline void tlb_finish_mmu(struct mmu_gather *tlb, | 79 | static inline void tlb_finish_mmu(struct mmu_gather *tlb, |
69 | unsigned long start, unsigned long end) | 80 | unsigned long start, unsigned long end) |
70 | { | 81 | { |
diff --git a/arch/s390/net/bpf_jit_comp.c b/arch/s390/net/bpf_jit_comp.c index 9c36dc398f90..452d3ebd9d0f 100644 --- a/arch/s390/net/bpf_jit_comp.c +++ b/arch/s390/net/bpf_jit_comp.c | |||
@@ -276,7 +276,6 @@ static void bpf_jit_noleaks(struct bpf_jit *jit, struct sock_filter *filter) | |||
276 | case BPF_S_LD_W_IND: | 276 | case BPF_S_LD_W_IND: |
277 | case BPF_S_LD_H_IND: | 277 | case BPF_S_LD_H_IND: |
278 | case BPF_S_LD_B_IND: | 278 | case BPF_S_LD_B_IND: |
279 | case BPF_S_LDX_B_MSH: | ||
280 | case BPF_S_LD_IMM: | 279 | case BPF_S_LD_IMM: |
281 | case BPF_S_LD_MEM: | 280 | case BPF_S_LD_MEM: |
282 | case BPF_S_MISC_TXA: | 281 | case BPF_S_MISC_TXA: |
diff --git a/arch/sh/include/asm/tlb.h b/arch/sh/include/asm/tlb.h index 362192ed12fe..62f80d2a9df9 100644 --- a/arch/sh/include/asm/tlb.h +++ b/arch/sh/include/asm/tlb.h | |||
@@ -86,6 +86,14 @@ tlb_end_vma(struct mmu_gather *tlb, struct vm_area_struct *vma) | |||
86 | } | 86 | } |
87 | } | 87 | } |
88 | 88 | ||
89 | static inline void tlb_flush_mmu_tlbonly(struct mmu_gather *tlb) | ||
90 | { | ||
91 | } | ||
92 | |||
93 | static inline void tlb_flush_mmu_free(struct mmu_gather *tlb) | ||
94 | { | ||
95 | } | ||
96 | |||
89 | static inline void tlb_flush_mmu(struct mmu_gather *tlb) | 97 | static inline void tlb_flush_mmu(struct mmu_gather *tlb) |
90 | { | 98 | { |
91 | } | 99 | } |
diff --git a/arch/um/include/asm/tlb.h b/arch/um/include/asm/tlb.h index 29b0301c18aa..16eb63fac57d 100644 --- a/arch/um/include/asm/tlb.h +++ b/arch/um/include/asm/tlb.h | |||
@@ -59,13 +59,25 @@ extern void flush_tlb_mm_range(struct mm_struct *mm, unsigned long start, | |||
59 | unsigned long end); | 59 | unsigned long end); |
60 | 60 | ||
61 | static inline void | 61 | static inline void |
62 | tlb_flush_mmu_tlbonly(struct mmu_gather *tlb) | ||
63 | { | ||
64 | flush_tlb_mm_range(tlb->mm, tlb->start, tlb->end); | ||
65 | } | ||
66 | |||
67 | static inline void | ||
68 | tlb_flush_mmu_free(struct mmu_gather *tlb) | ||
69 | { | ||
70 | init_tlb_gather(tlb); | ||
71 | } | ||
72 | |||
73 | static inline void | ||
62 | tlb_flush_mmu(struct mmu_gather *tlb) | 74 | tlb_flush_mmu(struct mmu_gather *tlb) |
63 | { | 75 | { |
64 | if (!tlb->need_flush) | 76 | if (!tlb->need_flush) |
65 | return; | 77 | return; |
66 | 78 | ||
67 | flush_tlb_mm_range(tlb->mm, tlb->start, tlb->end); | 79 | tlb_flush_mmu_tlbonly(tlb); |
68 | init_tlb_gather(tlb); | 80 | tlb_flush_mmu_free(tlb); |
69 | } | 81 | } |
70 | 82 | ||
71 | /* tlb_finish_mmu | 83 | /* tlb_finish_mmu |
diff --git a/arch/x86/kernel/cpu/perf_event_intel_rapl.c b/arch/x86/kernel/cpu/perf_event_intel_rapl.c index 7c87424d4140..619f7699487a 100644 --- a/arch/x86/kernel/cpu/perf_event_intel_rapl.c +++ b/arch/x86/kernel/cpu/perf_event_intel_rapl.c | |||
@@ -543,7 +543,8 @@ static int rapl_cpu_prepare(int cpu) | |||
543 | if (phys_id < 0) | 543 | if (phys_id < 0) |
544 | return -1; | 544 | return -1; |
545 | 545 | ||
546 | if (!rdmsrl_safe(MSR_RAPL_POWER_UNIT, &msr_rapl_power_unit_bits)) | 546 | /* protect rdmsrl() to handle virtualization */ |
547 | if (rdmsrl_safe(MSR_RAPL_POWER_UNIT, &msr_rapl_power_unit_bits)) | ||
547 | return -1; | 548 | return -1; |
548 | 549 | ||
549 | pmu = kzalloc_node(sizeof(*pmu), GFP_KERNEL, cpu_to_node(cpu)); | 550 | pmu = kzalloc_node(sizeof(*pmu), GFP_KERNEL, cpu_to_node(cpu)); |
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index 1f68c5831924..33e8c028842f 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c | |||
@@ -503,7 +503,7 @@ static inline struct vcpu_vmx *to_vmx(struct kvm_vcpu *vcpu) | |||
503 | [number##_HIGH] = VMCS12_OFFSET(name)+4 | 503 | [number##_HIGH] = VMCS12_OFFSET(name)+4 |
504 | 504 | ||
505 | 505 | ||
506 | static const unsigned long shadow_read_only_fields[] = { | 506 | static unsigned long shadow_read_only_fields[] = { |
507 | /* | 507 | /* |
508 | * We do NOT shadow fields that are modified when L0 | 508 | * We do NOT shadow fields that are modified when L0 |
509 | * traps and emulates any vmx instruction (e.g. VMPTRLD, | 509 | * traps and emulates any vmx instruction (e.g. VMPTRLD, |
@@ -526,10 +526,10 @@ static const unsigned long shadow_read_only_fields[] = { | |||
526 | GUEST_LINEAR_ADDRESS, | 526 | GUEST_LINEAR_ADDRESS, |
527 | GUEST_PHYSICAL_ADDRESS | 527 | GUEST_PHYSICAL_ADDRESS |
528 | }; | 528 | }; |
529 | static const int max_shadow_read_only_fields = | 529 | static int max_shadow_read_only_fields = |
530 | ARRAY_SIZE(shadow_read_only_fields); | 530 | ARRAY_SIZE(shadow_read_only_fields); |
531 | 531 | ||
532 | static const unsigned long shadow_read_write_fields[] = { | 532 | static unsigned long shadow_read_write_fields[] = { |
533 | GUEST_RIP, | 533 | GUEST_RIP, |
534 | GUEST_RSP, | 534 | GUEST_RSP, |
535 | GUEST_CR0, | 535 | GUEST_CR0, |
@@ -558,7 +558,7 @@ static const unsigned long shadow_read_write_fields[] = { | |||
558 | HOST_FS_SELECTOR, | 558 | HOST_FS_SELECTOR, |
559 | HOST_GS_SELECTOR | 559 | HOST_GS_SELECTOR |
560 | }; | 560 | }; |
561 | static const int max_shadow_read_write_fields = | 561 | static int max_shadow_read_write_fields = |
562 | ARRAY_SIZE(shadow_read_write_fields); | 562 | ARRAY_SIZE(shadow_read_write_fields); |
563 | 563 | ||
564 | static const unsigned short vmcs_field_to_offset_table[] = { | 564 | static const unsigned short vmcs_field_to_offset_table[] = { |
@@ -3009,6 +3009,41 @@ static void free_kvm_area(void) | |||
3009 | } | 3009 | } |
3010 | } | 3010 | } |
3011 | 3011 | ||
3012 | static void init_vmcs_shadow_fields(void) | ||
3013 | { | ||
3014 | int i, j; | ||
3015 | |||
3016 | /* No checks for read only fields yet */ | ||
3017 | |||
3018 | for (i = j = 0; i < max_shadow_read_write_fields; i++) { | ||
3019 | switch (shadow_read_write_fields[i]) { | ||
3020 | case GUEST_BNDCFGS: | ||
3021 | if (!vmx_mpx_supported()) | ||
3022 | continue; | ||
3023 | break; | ||
3024 | default: | ||
3025 | break; | ||
3026 | } | ||
3027 | |||
3028 | if (j < i) | ||
3029 | shadow_read_write_fields[j] = | ||
3030 | shadow_read_write_fields[i]; | ||
3031 | j++; | ||
3032 | } | ||
3033 | max_shadow_read_write_fields = j; | ||
3034 | |||
3035 | /* shadowed fields guest access without vmexit */ | ||
3036 | for (i = 0; i < max_shadow_read_write_fields; i++) { | ||
3037 | clear_bit(shadow_read_write_fields[i], | ||
3038 | vmx_vmwrite_bitmap); | ||
3039 | clear_bit(shadow_read_write_fields[i], | ||
3040 | vmx_vmread_bitmap); | ||
3041 | } | ||
3042 | for (i = 0; i < max_shadow_read_only_fields; i++) | ||
3043 | clear_bit(shadow_read_only_fields[i], | ||
3044 | vmx_vmread_bitmap); | ||
3045 | } | ||
3046 | |||
3012 | static __init int alloc_kvm_area(void) | 3047 | static __init int alloc_kvm_area(void) |
3013 | { | 3048 | { |
3014 | int cpu; | 3049 | int cpu; |
@@ -3039,6 +3074,8 @@ static __init int hardware_setup(void) | |||
3039 | enable_vpid = 0; | 3074 | enable_vpid = 0; |
3040 | if (!cpu_has_vmx_shadow_vmcs()) | 3075 | if (!cpu_has_vmx_shadow_vmcs()) |
3041 | enable_shadow_vmcs = 0; | 3076 | enable_shadow_vmcs = 0; |
3077 | if (enable_shadow_vmcs) | ||
3078 | init_vmcs_shadow_fields(); | ||
3042 | 3079 | ||
3043 | if (!cpu_has_vmx_ept() || | 3080 | if (!cpu_has_vmx_ept() || |
3044 | !cpu_has_vmx_ept_4levels()) { | 3081 | !cpu_has_vmx_ept_4levels()) { |
@@ -8803,14 +8840,6 @@ static int __init vmx_init(void) | |||
8803 | 8840 | ||
8804 | memset(vmx_vmread_bitmap, 0xff, PAGE_SIZE); | 8841 | memset(vmx_vmread_bitmap, 0xff, PAGE_SIZE); |
8805 | memset(vmx_vmwrite_bitmap, 0xff, PAGE_SIZE); | 8842 | memset(vmx_vmwrite_bitmap, 0xff, PAGE_SIZE); |
8806 | /* shadowed read/write fields */ | ||
8807 | for (i = 0; i < max_shadow_read_write_fields; i++) { | ||
8808 | clear_bit(shadow_read_write_fields[i], vmx_vmwrite_bitmap); | ||
8809 | clear_bit(shadow_read_write_fields[i], vmx_vmread_bitmap); | ||
8810 | } | ||
8811 | /* shadowed read only fields */ | ||
8812 | for (i = 0; i < max_shadow_read_only_fields; i++) | ||
8813 | clear_bit(shadow_read_only_fields[i], vmx_vmread_bitmap); | ||
8814 | 8843 | ||
8815 | /* | 8844 | /* |
8816 | * Allow direct access to the PC debug port (it is often used for I/O | 8845 | * Allow direct access to the PC debug port (it is often used for I/O |
diff --git a/arch/x86/vdso/vdso-layout.lds.S b/arch/x86/vdso/vdso-layout.lds.S index 2e263f367b13..9df017ab2285 100644 --- a/arch/x86/vdso/vdso-layout.lds.S +++ b/arch/x86/vdso/vdso-layout.lds.S | |||
@@ -9,12 +9,9 @@ SECTIONS | |||
9 | #ifdef BUILD_VDSO32 | 9 | #ifdef BUILD_VDSO32 |
10 | #include <asm/vdso32.h> | 10 | #include <asm/vdso32.h> |
11 | 11 | ||
12 | .hpet_sect : { | 12 | hpet_page = . - VDSO_OFFSET(VDSO_HPET_PAGE); |
13 | hpet_page = . - VDSO_OFFSET(VDSO_HPET_PAGE); | ||
14 | } :text :hpet_sect | ||
15 | 13 | ||
16 | .vvar_sect : { | 14 | vvar = . - VDSO_OFFSET(VDSO_VVAR_PAGE); |
17 | vvar = . - VDSO_OFFSET(VDSO_VVAR_PAGE); | ||
18 | 15 | ||
19 | /* Place all vvars at the offsets in asm/vvar.h. */ | 16 | /* Place all vvars at the offsets in asm/vvar.h. */ |
20 | #define EMIT_VVAR(name, offset) vvar_ ## name = vvar + offset; | 17 | #define EMIT_VVAR(name, offset) vvar_ ## name = vvar + offset; |
@@ -22,7 +19,6 @@ SECTIONS | |||
22 | #include <asm/vvar.h> | 19 | #include <asm/vvar.h> |
23 | #undef __VVAR_KERNEL_LDS | 20 | #undef __VVAR_KERNEL_LDS |
24 | #undef EMIT_VVAR | 21 | #undef EMIT_VVAR |
25 | } :text :vvar_sect | ||
26 | #endif | 22 | #endif |
27 | . = SIZEOF_HEADERS; | 23 | . = SIZEOF_HEADERS; |
28 | 24 | ||
@@ -61,7 +57,12 @@ SECTIONS | |||
61 | */ | 57 | */ |
62 | . = ALIGN(0x100); | 58 | . = ALIGN(0x100); |
63 | 59 | ||
64 | .text : { *(.text*) } :text =0x90909090 | 60 | .text : { *(.text*) } :text =0x90909090, |
61 | |||
62 | /* | ||
63 | * The comma above works around a bug in gold: | ||
64 | * https://sourceware.org/bugzilla/show_bug.cgi?id=16804 | ||
65 | */ | ||
65 | 66 | ||
66 | /DISCARD/ : { | 67 | /DISCARD/ : { |
67 | *(.discard) | 68 | *(.discard) |
@@ -84,8 +85,4 @@ PHDRS | |||
84 | dynamic PT_DYNAMIC FLAGS(4); /* PF_R */ | 85 | dynamic PT_DYNAMIC FLAGS(4); /* PF_R */ |
85 | note PT_NOTE FLAGS(4); /* PF_R */ | 86 | note PT_NOTE FLAGS(4); /* PF_R */ |
86 | eh_frame_hdr PT_GNU_EH_FRAME; | 87 | eh_frame_hdr PT_GNU_EH_FRAME; |
87 | #ifdef BUILD_VDSO32 | ||
88 | vvar_sect PT_NULL FLAGS(4); /* PF_R */ | ||
89 | hpet_sect PT_NULL FLAGS(4); /* PF_R */ | ||
90 | #endif | ||
91 | } | 88 | } |
diff --git a/drivers/acpi/acpica/exfield.c b/drivers/acpi/acpica/exfield.c index 68d97441432c..12878e1982f7 100644 --- a/drivers/acpi/acpica/exfield.c +++ b/drivers/acpi/acpica/exfield.c | |||
@@ -45,10 +45,71 @@ | |||
45 | #include "accommon.h" | 45 | #include "accommon.h" |
46 | #include "acdispat.h" | 46 | #include "acdispat.h" |
47 | #include "acinterp.h" | 47 | #include "acinterp.h" |
48 | #include "amlcode.h" | ||
48 | 49 | ||
49 | #define _COMPONENT ACPI_EXECUTER | 50 | #define _COMPONENT ACPI_EXECUTER |
50 | ACPI_MODULE_NAME("exfield") | 51 | ACPI_MODULE_NAME("exfield") |
51 | 52 | ||
53 | /* Local prototypes */ | ||
54 | static u32 | ||
55 | acpi_ex_get_serial_access_length(u32 accessor_type, u32 access_length); | ||
56 | |||
57 | /******************************************************************************* | ||
58 | * | ||
59 | * FUNCTION: acpi_get_serial_access_bytes | ||
60 | * | ||
61 | * PARAMETERS: accessor_type - The type of the protocol indicated by region | ||
62 | * field access attributes | ||
63 | * access_length - The access length of the region field | ||
64 | * | ||
65 | * RETURN: Decoded access length | ||
66 | * | ||
67 | * DESCRIPTION: This routine returns the length of the generic_serial_bus | ||
68 | * protocol bytes | ||
69 | * | ||
70 | ******************************************************************************/ | ||
71 | |||
72 | static u32 | ||
73 | acpi_ex_get_serial_access_length(u32 accessor_type, u32 access_length) | ||
74 | { | ||
75 | u32 length; | ||
76 | |||
77 | switch (accessor_type) { | ||
78 | case AML_FIELD_ATTRIB_QUICK: | ||
79 | |||
80 | length = 0; | ||
81 | break; | ||
82 | |||
83 | case AML_FIELD_ATTRIB_SEND_RCV: | ||
84 | case AML_FIELD_ATTRIB_BYTE: | ||
85 | |||
86 | length = 1; | ||
87 | break; | ||
88 | |||
89 | case AML_FIELD_ATTRIB_WORD: | ||
90 | case AML_FIELD_ATTRIB_WORD_CALL: | ||
91 | |||
92 | length = 2; | ||
93 | break; | ||
94 | |||
95 | case AML_FIELD_ATTRIB_MULTIBYTE: | ||
96 | case AML_FIELD_ATTRIB_RAW_BYTES: | ||
97 | case AML_FIELD_ATTRIB_RAW_PROCESS: | ||
98 | |||
99 | length = access_length; | ||
100 | break; | ||
101 | |||
102 | case AML_FIELD_ATTRIB_BLOCK: | ||
103 | case AML_FIELD_ATTRIB_BLOCK_CALL: | ||
104 | default: | ||
105 | |||
106 | length = ACPI_GSBUS_BUFFER_SIZE; | ||
107 | break; | ||
108 | } | ||
109 | |||
110 | return (length); | ||
111 | } | ||
112 | |||
52 | /******************************************************************************* | 113 | /******************************************************************************* |
53 | * | 114 | * |
54 | * FUNCTION: acpi_ex_read_data_from_field | 115 | * FUNCTION: acpi_ex_read_data_from_field |
@@ -63,8 +124,9 @@ ACPI_MODULE_NAME("exfield") | |||
63 | * Buffer, depending on the size of the field. | 124 | * Buffer, depending on the size of the field. |
64 | * | 125 | * |
65 | ******************************************************************************/ | 126 | ******************************************************************************/ |
127 | |||
66 | acpi_status | 128 | acpi_status |
67 | acpi_ex_read_data_from_field(struct acpi_walk_state *walk_state, | 129 | acpi_ex_read_data_from_field(struct acpi_walk_state * walk_state, |
68 | union acpi_operand_object *obj_desc, | 130 | union acpi_operand_object *obj_desc, |
69 | union acpi_operand_object **ret_buffer_desc) | 131 | union acpi_operand_object **ret_buffer_desc) |
70 | { | 132 | { |
@@ -73,6 +135,7 @@ acpi_ex_read_data_from_field(struct acpi_walk_state *walk_state, | |||
73 | acpi_size length; | 135 | acpi_size length; |
74 | void *buffer; | 136 | void *buffer; |
75 | u32 function; | 137 | u32 function; |
138 | u16 accessor_type; | ||
76 | 139 | ||
77 | ACPI_FUNCTION_TRACE_PTR(ex_read_data_from_field, obj_desc); | 140 | ACPI_FUNCTION_TRACE_PTR(ex_read_data_from_field, obj_desc); |
78 | 141 | ||
@@ -116,9 +179,22 @@ acpi_ex_read_data_from_field(struct acpi_walk_state *walk_state, | |||
116 | ACPI_READ | (obj_desc->field.attribute << 16); | 179 | ACPI_READ | (obj_desc->field.attribute << 16); |
117 | } else if (obj_desc->field.region_obj->region.space_id == | 180 | } else if (obj_desc->field.region_obj->region.space_id == |
118 | ACPI_ADR_SPACE_GSBUS) { | 181 | ACPI_ADR_SPACE_GSBUS) { |
119 | length = ACPI_GSBUS_BUFFER_SIZE; | 182 | accessor_type = obj_desc->field.attribute; |
120 | function = | 183 | length = acpi_ex_get_serial_access_length(accessor_type, |
121 | ACPI_READ | (obj_desc->field.attribute << 16); | 184 | obj_desc-> |
185 | field. | ||
186 | access_length); | ||
187 | |||
188 | /* | ||
189 | * Add additional 2 bytes for modeled generic_serial_bus data buffer: | ||
190 | * typedef struct { | ||
191 | * BYTEStatus; // Byte 0 of the data buffer | ||
192 | * BYTELength; // Byte 1 of the data buffer | ||
193 | * BYTE[x-1]Data; // Bytes 2-x of the arbitrary length data buffer, | ||
194 | * } | ||
195 | */ | ||
196 | length += 2; | ||
197 | function = ACPI_READ | (accessor_type << 16); | ||
122 | } else { /* IPMI */ | 198 | } else { /* IPMI */ |
123 | 199 | ||
124 | length = ACPI_IPMI_BUFFER_SIZE; | 200 | length = ACPI_IPMI_BUFFER_SIZE; |
@@ -231,6 +307,7 @@ acpi_ex_write_data_to_field(union acpi_operand_object *source_desc, | |||
231 | void *buffer; | 307 | void *buffer; |
232 | union acpi_operand_object *buffer_desc; | 308 | union acpi_operand_object *buffer_desc; |
233 | u32 function; | 309 | u32 function; |
310 | u16 accessor_type; | ||
234 | 311 | ||
235 | ACPI_FUNCTION_TRACE_PTR(ex_write_data_to_field, obj_desc); | 312 | ACPI_FUNCTION_TRACE_PTR(ex_write_data_to_field, obj_desc); |
236 | 313 | ||
@@ -284,9 +361,22 @@ acpi_ex_write_data_to_field(union acpi_operand_object *source_desc, | |||
284 | ACPI_WRITE | (obj_desc->field.attribute << 16); | 361 | ACPI_WRITE | (obj_desc->field.attribute << 16); |
285 | } else if (obj_desc->field.region_obj->region.space_id == | 362 | } else if (obj_desc->field.region_obj->region.space_id == |
286 | ACPI_ADR_SPACE_GSBUS) { | 363 | ACPI_ADR_SPACE_GSBUS) { |
287 | length = ACPI_GSBUS_BUFFER_SIZE; | 364 | accessor_type = obj_desc->field.attribute; |
288 | function = | 365 | length = acpi_ex_get_serial_access_length(accessor_type, |
289 | ACPI_WRITE | (obj_desc->field.attribute << 16); | 366 | obj_desc-> |
367 | field. | ||
368 | access_length); | ||
369 | |||
370 | /* | ||
371 | * Add additional 2 bytes for modeled generic_serial_bus data buffer: | ||
372 | * typedef struct { | ||
373 | * BYTEStatus; // Byte 0 of the data buffer | ||
374 | * BYTELength; // Byte 1 of the data buffer | ||
375 | * BYTE[x-1]Data; // Bytes 2-x of the arbitrary length data buffer, | ||
376 | * } | ||
377 | */ | ||
378 | length += 2; | ||
379 | function = ACPI_WRITE | (accessor_type << 16); | ||
290 | } else { /* IPMI */ | 380 | } else { /* IPMI */ |
291 | 381 | ||
292 | length = ACPI_IPMI_BUFFER_SIZE; | 382 | length = ACPI_IPMI_BUFFER_SIZE; |
diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c index e7e5844c87d0..cf925c4f36b7 100644 --- a/drivers/acpi/bus.c +++ b/drivers/acpi/bus.c | |||
@@ -380,9 +380,8 @@ static void acpi_bus_notify(acpi_handle handle, u32 type, void *data) | |||
380 | break; | 380 | break; |
381 | 381 | ||
382 | default: | 382 | default: |
383 | acpi_handle_warn(handle, "Unsupported event type 0x%x\n", type); | 383 | acpi_handle_debug(handle, "Unknown event type 0x%x\n", type); |
384 | ost_code = ACPI_OST_SC_UNRECOGNIZED_NOTIFY; | 384 | break; |
385 | goto err; | ||
386 | } | 385 | } |
387 | 386 | ||
388 | adev = acpi_bus_get_acpi_device(handle); | 387 | adev = acpi_bus_get_acpi_device(handle); |
diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig index 20e03a7eb8b4..c2706047337f 100644 --- a/drivers/ata/Kconfig +++ b/drivers/ata/Kconfig | |||
@@ -116,7 +116,7 @@ config AHCI_ST | |||
116 | 116 | ||
117 | config AHCI_IMX | 117 | config AHCI_IMX |
118 | tristate "Freescale i.MX AHCI SATA support" | 118 | tristate "Freescale i.MX AHCI SATA support" |
119 | depends on MFD_SYSCON | 119 | depends on MFD_SYSCON && (ARCH_MXC || COMPILE_TEST) |
120 | help | 120 | help |
121 | This option enables support for the Freescale i.MX SoC's | 121 | This option enables support for the Freescale i.MX SoC's |
122 | onboard AHCI SATA. | 122 | onboard AHCI SATA. |
@@ -134,8 +134,7 @@ config AHCI_SUNXI | |||
134 | 134 | ||
135 | config AHCI_XGENE | 135 | config AHCI_XGENE |
136 | tristate "APM X-Gene 6.0Gbps AHCI SATA host controller support" | 136 | tristate "APM X-Gene 6.0Gbps AHCI SATA host controller support" |
137 | depends on ARM64 || COMPILE_TEST | 137 | depends on PHY_XGENE |
138 | select PHY_XGENE | ||
139 | help | 138 | help |
140 | This option enables support for APM X-Gene SoC SATA host controller. | 139 | This option enables support for APM X-Gene SoC SATA host controller. |
141 | 140 | ||
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index 5a0bf8ed649b..71e15b73513d 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
@@ -1164,9 +1164,9 @@ static inline void ahci_gtf_filter_workaround(struct ata_host *host) | |||
1164 | #endif | 1164 | #endif |
1165 | 1165 | ||
1166 | static int ahci_init_interrupts(struct pci_dev *pdev, unsigned int n_ports, | 1166 | static int ahci_init_interrupts(struct pci_dev *pdev, unsigned int n_ports, |
1167 | struct ahci_host_priv *hpriv) | 1167 | struct ahci_host_priv *hpriv) |
1168 | { | 1168 | { |
1169 | int nvec; | 1169 | int rc, nvec; |
1170 | 1170 | ||
1171 | if (hpriv->flags & AHCI_HFLAG_NO_MSI) | 1171 | if (hpriv->flags & AHCI_HFLAG_NO_MSI) |
1172 | goto intx; | 1172 | goto intx; |
@@ -1183,12 +1183,19 @@ static int ahci_init_interrupts(struct pci_dev *pdev, unsigned int n_ports, | |||
1183 | if (nvec < n_ports) | 1183 | if (nvec < n_ports) |
1184 | goto single_msi; | 1184 | goto single_msi; |
1185 | 1185 | ||
1186 | nvec = pci_enable_msi_range(pdev, nvec, nvec); | 1186 | rc = pci_enable_msi_exact(pdev, nvec); |
1187 | if (nvec == -ENOSPC) | 1187 | if (rc == -ENOSPC) |
1188 | goto single_msi; | 1188 | goto single_msi; |
1189 | else if (nvec < 0) | 1189 | else if (rc < 0) |
1190 | goto intx; | 1190 | goto intx; |
1191 | 1191 | ||
1192 | /* fallback to single MSI mode if the controller enforced MRSM mode */ | ||
1193 | if (readl(hpriv->mmio + HOST_CTL) & HOST_MRSM) { | ||
1194 | pci_disable_msi(pdev); | ||
1195 | printk(KERN_INFO "ahci: MRSM is on, fallback to single MSI\n"); | ||
1196 | goto single_msi; | ||
1197 | } | ||
1198 | |||
1192 | return nvec; | 1199 | return nvec; |
1193 | 1200 | ||
1194 | single_msi: | 1201 | single_msi: |
@@ -1232,18 +1239,18 @@ int ahci_host_activate(struct ata_host *host, int irq, unsigned int n_msis) | |||
1232 | return rc; | 1239 | return rc; |
1233 | 1240 | ||
1234 | for (i = 0; i < host->n_ports; i++) { | 1241 | for (i = 0; i < host->n_ports; i++) { |
1235 | const char* desc; | ||
1236 | struct ahci_port_priv *pp = host->ports[i]->private_data; | 1242 | struct ahci_port_priv *pp = host->ports[i]->private_data; |
1237 | 1243 | ||
1238 | /* pp is NULL for dummy ports */ | 1244 | /* Do not receive interrupts sent by dummy ports */ |
1239 | if (pp) | 1245 | if (!pp) { |
1240 | desc = pp->irq_desc; | 1246 | disable_irq(irq + i); |
1241 | else | 1247 | continue; |
1242 | desc = dev_driver_string(host->dev); | 1248 | } |
1243 | 1249 | ||
1244 | rc = devm_request_threaded_irq(host->dev, | 1250 | rc = devm_request_threaded_irq(host->dev, irq + i, |
1245 | irq + i, ahci_hw_interrupt, ahci_thread_fn, IRQF_SHARED, | 1251 | ahci_hw_interrupt, |
1246 | desc, host->ports[i]); | 1252 | ahci_thread_fn, IRQF_SHARED, |
1253 | pp->irq_desc, host->ports[i]); | ||
1247 | if (rc) | 1254 | if (rc) |
1248 | goto out_free_irqs; | 1255 | goto out_free_irqs; |
1249 | } | 1256 | } |
diff --git a/drivers/ata/ahci.h b/drivers/ata/ahci.h index 51af275b3388..b5eb886da226 100644 --- a/drivers/ata/ahci.h +++ b/drivers/ata/ahci.h | |||
@@ -94,6 +94,7 @@ enum { | |||
94 | /* HOST_CTL bits */ | 94 | /* HOST_CTL bits */ |
95 | HOST_RESET = (1 << 0), /* reset controller; self-clear */ | 95 | HOST_RESET = (1 << 0), /* reset controller; self-clear */ |
96 | HOST_IRQ_EN = (1 << 1), /* global IRQ enable */ | 96 | HOST_IRQ_EN = (1 << 1), /* global IRQ enable */ |
97 | HOST_MRSM = (1 << 2), /* MSI Revert to Single Message */ | ||
97 | HOST_AHCI_EN = (1 << 31), /* AHCI enabled */ | 98 | HOST_AHCI_EN = (1 << 31), /* AHCI enabled */ |
98 | 99 | ||
99 | /* HOST_CAP bits */ | 100 | /* HOST_CAP bits */ |
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index c19734d96d7e..943cc8b83e59 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
@@ -4224,8 +4224,10 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { | |||
4224 | { "PIONEER DVD-RW DVR-216D", NULL, ATA_HORKAGE_NOSETXFER }, | 4224 | { "PIONEER DVD-RW DVR-216D", NULL, ATA_HORKAGE_NOSETXFER }, |
4225 | 4225 | ||
4226 | /* devices that don't properly handle queued TRIM commands */ | 4226 | /* devices that don't properly handle queued TRIM commands */ |
4227 | { "Micron_M500*", NULL, ATA_HORKAGE_NO_NCQ_TRIM, }, | 4227 | { "Micron_M500*", "MU0[1-4]*", ATA_HORKAGE_NO_NCQ_TRIM, }, |
4228 | { "Crucial_CT???M500SSD*", NULL, ATA_HORKAGE_NO_NCQ_TRIM, }, | 4228 | { "Crucial_CT???M500SSD*", "MU0[1-4]*", ATA_HORKAGE_NO_NCQ_TRIM, }, |
4229 | { "Micron_M550*", NULL, ATA_HORKAGE_NO_NCQ_TRIM, }, | ||
4230 | { "Crucial_CT???M550SSD*", NULL, ATA_HORKAGE_NO_NCQ_TRIM, }, | ||
4229 | 4231 | ||
4230 | /* | 4232 | /* |
4231 | * Some WD SATA-I drives spin up and down erratically when the link | 4233 | * Some WD SATA-I drives spin up and down erratically when the link |
@@ -4792,21 +4794,26 @@ void swap_buf_le16(u16 *buf, unsigned int buf_words) | |||
4792 | static struct ata_queued_cmd *ata_qc_new(struct ata_port *ap) | 4794 | static struct ata_queued_cmd *ata_qc_new(struct ata_port *ap) |
4793 | { | 4795 | { |
4794 | struct ata_queued_cmd *qc = NULL; | 4796 | struct ata_queued_cmd *qc = NULL; |
4795 | unsigned int i; | 4797 | unsigned int i, tag; |
4796 | 4798 | ||
4797 | /* no command while frozen */ | 4799 | /* no command while frozen */ |
4798 | if (unlikely(ap->pflags & ATA_PFLAG_FROZEN)) | 4800 | if (unlikely(ap->pflags & ATA_PFLAG_FROZEN)) |
4799 | return NULL; | 4801 | return NULL; |
4800 | 4802 | ||
4801 | /* the last tag is reserved for internal command. */ | 4803 | for (i = 0; i < ATA_MAX_QUEUE; i++) { |
4802 | for (i = 0; i < ATA_MAX_QUEUE - 1; i++) | 4804 | tag = (i + ap->last_tag + 1) % ATA_MAX_QUEUE; |
4803 | if (!test_and_set_bit(i, &ap->qc_allocated)) { | 4805 | |
4804 | qc = __ata_qc_from_tag(ap, i); | 4806 | /* the last tag is reserved for internal command. */ |
4807 | if (tag == ATA_TAG_INTERNAL) | ||
4808 | continue; | ||
4809 | |||
4810 | if (!test_and_set_bit(tag, &ap->qc_allocated)) { | ||
4811 | qc = __ata_qc_from_tag(ap, tag); | ||
4812 | qc->tag = tag; | ||
4813 | ap->last_tag = tag; | ||
4805 | break; | 4814 | break; |
4806 | } | 4815 | } |
4807 | 4816 | } | |
4808 | if (qc) | ||
4809 | qc->tag = i; | ||
4810 | 4817 | ||
4811 | return qc; | 4818 | return qc; |
4812 | } | 4819 | } |
diff --git a/drivers/ata/pata_arasan_cf.c b/drivers/ata/pata_arasan_cf.c index 6fac524c2f50..4edb1a81f63f 100644 --- a/drivers/ata/pata_arasan_cf.c +++ b/drivers/ata/pata_arasan_cf.c | |||
@@ -898,9 +898,12 @@ static int arasan_cf_probe(struct platform_device *pdev) | |||
898 | 898 | ||
899 | cf_card_detect(acdev, 0); | 899 | cf_card_detect(acdev, 0); |
900 | 900 | ||
901 | return ata_host_activate(host, acdev->irq, irq_handler, 0, | 901 | ret = ata_host_activate(host, acdev->irq, irq_handler, 0, |
902 | &arasan_cf_sht); | 902 | &arasan_cf_sht); |
903 | if (!ret) | ||
904 | return 0; | ||
903 | 905 | ||
906 | cf_exit(acdev); | ||
904 | free_clk: | 907 | free_clk: |
905 | clk_put(acdev->clk); | 908 | clk_put(acdev->clk); |
906 | return ret; | 909 | return ret; |
diff --git a/drivers/ata/pata_at91.c b/drivers/ata/pata_at91.c index e9c87274a781..8a66f23af4c4 100644 --- a/drivers/ata/pata_at91.c +++ b/drivers/ata/pata_at91.c | |||
@@ -407,12 +407,13 @@ static int pata_at91_probe(struct platform_device *pdev) | |||
407 | 407 | ||
408 | host->private_data = info; | 408 | host->private_data = info; |
409 | 409 | ||
410 | return ata_host_activate(host, gpio_is_valid(irq) ? gpio_to_irq(irq) : 0, | 410 | ret = ata_host_activate(host, gpio_is_valid(irq) ? gpio_to_irq(irq) : 0, |
411 | gpio_is_valid(irq) ? ata_sff_interrupt : NULL, | 411 | gpio_is_valid(irq) ? ata_sff_interrupt : NULL, |
412 | irq_flags, &pata_at91_sht); | 412 | irq_flags, &pata_at91_sht); |
413 | if (ret) | ||
414 | goto err_put; | ||
413 | 415 | ||
414 | if (!ret) | 416 | return 0; |
415 | return 0; | ||
416 | 417 | ||
417 | err_put: | 418 | err_put: |
418 | clk_put(info->mck); | 419 | clk_put(info->mck); |
diff --git a/drivers/ata/pata_samsung_cf.c b/drivers/ata/pata_samsung_cf.c index a79566d05666..0610e78c8a2a 100644 --- a/drivers/ata/pata_samsung_cf.c +++ b/drivers/ata/pata_samsung_cf.c | |||
@@ -594,9 +594,13 @@ static int __init pata_s3c_probe(struct platform_device *pdev) | |||
594 | 594 | ||
595 | platform_set_drvdata(pdev, host); | 595 | platform_set_drvdata(pdev, host); |
596 | 596 | ||
597 | return ata_host_activate(host, info->irq, | 597 | ret = ata_host_activate(host, info->irq, |
598 | info->irq ? pata_s3c_irq : NULL, | 598 | info->irq ? pata_s3c_irq : NULL, |
599 | 0, &pata_s3c_sht); | 599 | 0, &pata_s3c_sht); |
600 | if (ret) | ||
601 | goto stop_clk; | ||
602 | |||
603 | return 0; | ||
600 | 604 | ||
601 | stop_clk: | 605 | stop_clk: |
602 | clk_disable(info->clk); | 606 | clk_disable(info->clk); |
diff --git a/drivers/base/platform.c b/drivers/base/platform.c index e714709704e4..5b47210889e0 100644 --- a/drivers/base/platform.c +++ b/drivers/base/platform.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/string.h> | 13 | #include <linux/string.h> |
14 | #include <linux/platform_device.h> | 14 | #include <linux/platform_device.h> |
15 | #include <linux/of_device.h> | 15 | #include <linux/of_device.h> |
16 | #include <linux/of_irq.h> | ||
16 | #include <linux/module.h> | 17 | #include <linux/module.h> |
17 | #include <linux/init.h> | 18 | #include <linux/init.h> |
18 | #include <linux/dma-mapping.h> | 19 | #include <linux/dma-mapping.h> |
@@ -87,7 +88,11 @@ int platform_get_irq(struct platform_device *dev, unsigned int num) | |||
87 | return -ENXIO; | 88 | return -ENXIO; |
88 | return dev->archdata.irqs[num]; | 89 | return dev->archdata.irqs[num]; |
89 | #else | 90 | #else |
90 | struct resource *r = platform_get_resource(dev, IORESOURCE_IRQ, num); | 91 | struct resource *r; |
92 | if (IS_ENABLED(CONFIG_OF_IRQ) && dev->dev.of_node) | ||
93 | return of_irq_get(dev->dev.of_node, num); | ||
94 | |||
95 | r = platform_get_resource(dev, IORESOURCE_IRQ, num); | ||
91 | 96 | ||
92 | return r ? r->start : -ENXIO; | 97 | return r ? r->start : -ENXIO; |
93 | #endif | 98 | #endif |
diff --git a/drivers/clk/tegra/clk-tegra124.c b/drivers/clk/tegra/clk-tegra124.c index 166e02f16c8a..cc37c342c4cb 100644 --- a/drivers/clk/tegra/clk-tegra124.c +++ b/drivers/clk/tegra/clk-tegra124.c | |||
@@ -764,7 +764,6 @@ static struct tegra_clk tegra124_clks[tegra_clk_max] __initdata = { | |||
764 | [tegra_clk_sdmmc2_8] = { .dt_id = TEGRA124_CLK_SDMMC2, .present = true }, | 764 | [tegra_clk_sdmmc2_8] = { .dt_id = TEGRA124_CLK_SDMMC2, .present = true }, |
765 | [tegra_clk_i2s1] = { .dt_id = TEGRA124_CLK_I2S1, .present = true }, | 765 | [tegra_clk_i2s1] = { .dt_id = TEGRA124_CLK_I2S1, .present = true }, |
766 | [tegra_clk_i2c1] = { .dt_id = TEGRA124_CLK_I2C1, .present = true }, | 766 | [tegra_clk_i2c1] = { .dt_id = TEGRA124_CLK_I2C1, .present = true }, |
767 | [tegra_clk_ndflash] = { .dt_id = TEGRA124_CLK_NDFLASH, .present = true }, | ||
768 | [tegra_clk_sdmmc1_8] = { .dt_id = TEGRA124_CLK_SDMMC1, .present = true }, | 767 | [tegra_clk_sdmmc1_8] = { .dt_id = TEGRA124_CLK_SDMMC1, .present = true }, |
769 | [tegra_clk_sdmmc4_8] = { .dt_id = TEGRA124_CLK_SDMMC4, .present = true }, | 768 | [tegra_clk_sdmmc4_8] = { .dt_id = TEGRA124_CLK_SDMMC4, .present = true }, |
770 | [tegra_clk_pwm] = { .dt_id = TEGRA124_CLK_PWM, .present = true }, | 769 | [tegra_clk_pwm] = { .dt_id = TEGRA124_CLK_PWM, .present = true }, |
@@ -809,7 +808,6 @@ static struct tegra_clk tegra124_clks[tegra_clk_max] __initdata = { | |||
809 | [tegra_clk_trace] = { .dt_id = TEGRA124_CLK_TRACE, .present = true }, | 808 | [tegra_clk_trace] = { .dt_id = TEGRA124_CLK_TRACE, .present = true }, |
810 | [tegra_clk_soc_therm] = { .dt_id = TEGRA124_CLK_SOC_THERM, .present = true }, | 809 | [tegra_clk_soc_therm] = { .dt_id = TEGRA124_CLK_SOC_THERM, .present = true }, |
811 | [tegra_clk_dtv] = { .dt_id = TEGRA124_CLK_DTV, .present = true }, | 810 | [tegra_clk_dtv] = { .dt_id = TEGRA124_CLK_DTV, .present = true }, |
812 | [tegra_clk_ndspeed] = { .dt_id = TEGRA124_CLK_NDSPEED, .present = true }, | ||
813 | [tegra_clk_i2cslow] = { .dt_id = TEGRA124_CLK_I2CSLOW, .present = true }, | 811 | [tegra_clk_i2cslow] = { .dt_id = TEGRA124_CLK_I2CSLOW, .present = true }, |
814 | [tegra_clk_dsib] = { .dt_id = TEGRA124_CLK_DSIB, .present = true }, | 812 | [tegra_clk_dsib] = { .dt_id = TEGRA124_CLK_DSIB, .present = true }, |
815 | [tegra_clk_tsec] = { .dt_id = TEGRA124_CLK_TSEC, .present = true }, | 813 | [tegra_clk_tsec] = { .dt_id = TEGRA124_CLK_TSEC, .present = true }, |
@@ -952,7 +950,6 @@ static struct tegra_clk tegra124_clks[tegra_clk_max] __initdata = { | |||
952 | [tegra_clk_clk_out_3_mux] = { .dt_id = TEGRA124_CLK_CLK_OUT_3_MUX, .present = true }, | 950 | [tegra_clk_clk_out_3_mux] = { .dt_id = TEGRA124_CLK_CLK_OUT_3_MUX, .present = true }, |
953 | [tegra_clk_dsia_mux] = { .dt_id = TEGRA124_CLK_DSIA_MUX, .present = true }, | 951 | [tegra_clk_dsia_mux] = { .dt_id = TEGRA124_CLK_DSIA_MUX, .present = true }, |
954 | [tegra_clk_dsib_mux] = { .dt_id = TEGRA124_CLK_DSIB_MUX, .present = true }, | 952 | [tegra_clk_dsib_mux] = { .dt_id = TEGRA124_CLK_DSIB_MUX, .present = true }, |
955 | [tegra_clk_uarte] = { .dt_id = TEGRA124_CLK_UARTE, .present = true }, | ||
956 | }; | 953 | }; |
957 | 954 | ||
958 | static struct tegra_devclk devclks[] __initdata = { | 955 | static struct tegra_devclk devclks[] __initdata = { |
diff --git a/drivers/clk/versatile/clk-vexpress-osc.c b/drivers/clk/versatile/clk-vexpress-osc.c index 2dc8b41a339d..a535c7bf8574 100644 --- a/drivers/clk/versatile/clk-vexpress-osc.c +++ b/drivers/clk/versatile/clk-vexpress-osc.c | |||
@@ -102,7 +102,7 @@ void __init vexpress_osc_of_setup(struct device_node *node) | |||
102 | 102 | ||
103 | osc = kzalloc(sizeof(*osc), GFP_KERNEL); | 103 | osc = kzalloc(sizeof(*osc), GFP_KERNEL); |
104 | if (!osc) | 104 | if (!osc) |
105 | goto error; | 105 | return; |
106 | 106 | ||
107 | osc->func = vexpress_config_func_get_by_node(node); | 107 | osc->func = vexpress_config_func_get_by_node(node); |
108 | if (!osc->func) { | 108 | if (!osc->func) { |
diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c index a6ee6d7cd63f..acf5a329d538 100644 --- a/drivers/clocksource/exynos_mct.c +++ b/drivers/clocksource/exynos_mct.c | |||
@@ -416,8 +416,6 @@ static int exynos4_local_timer_setup(struct clock_event_device *evt) | |||
416 | evt->set_mode = exynos4_tick_set_mode; | 416 | evt->set_mode = exynos4_tick_set_mode; |
417 | evt->features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT; | 417 | evt->features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT; |
418 | evt->rating = 450; | 418 | evt->rating = 450; |
419 | clockevents_config_and_register(evt, clk_rate / (TICK_BASE_CNT + 1), | ||
420 | 0xf, 0x7fffffff); | ||
421 | 419 | ||
422 | exynos4_mct_write(TICK_BASE_CNT, mevt->base + MCT_L_TCNTB_OFFSET); | 420 | exynos4_mct_write(TICK_BASE_CNT, mevt->base + MCT_L_TCNTB_OFFSET); |
423 | 421 | ||
@@ -430,9 +428,12 @@ static int exynos4_local_timer_setup(struct clock_event_device *evt) | |||
430 | evt->irq); | 428 | evt->irq); |
431 | return -EIO; | 429 | return -EIO; |
432 | } | 430 | } |
431 | irq_force_affinity(mct_irqs[MCT_L0_IRQ + cpu], cpumask_of(cpu)); | ||
433 | } else { | 432 | } else { |
434 | enable_percpu_irq(mct_irqs[MCT_L0_IRQ], 0); | 433 | enable_percpu_irq(mct_irqs[MCT_L0_IRQ], 0); |
435 | } | 434 | } |
435 | clockevents_config_and_register(evt, clk_rate / (TICK_BASE_CNT + 1), | ||
436 | 0xf, 0x7fffffff); | ||
436 | 437 | ||
437 | return 0; | 438 | return 0; |
438 | } | 439 | } |
@@ -450,7 +451,6 @@ static int exynos4_mct_cpu_notify(struct notifier_block *self, | |||
450 | unsigned long action, void *hcpu) | 451 | unsigned long action, void *hcpu) |
451 | { | 452 | { |
452 | struct mct_clock_event_device *mevt; | 453 | struct mct_clock_event_device *mevt; |
453 | unsigned int cpu; | ||
454 | 454 | ||
455 | /* | 455 | /* |
456 | * Grab cpu pointer in each case to avoid spurious | 456 | * Grab cpu pointer in each case to avoid spurious |
@@ -461,12 +461,6 @@ static int exynos4_mct_cpu_notify(struct notifier_block *self, | |||
461 | mevt = this_cpu_ptr(&percpu_mct_tick); | 461 | mevt = this_cpu_ptr(&percpu_mct_tick); |
462 | exynos4_local_timer_setup(&mevt->evt); | 462 | exynos4_local_timer_setup(&mevt->evt); |
463 | break; | 463 | break; |
464 | case CPU_ONLINE: | ||
465 | cpu = (unsigned long)hcpu; | ||
466 | if (mct_int_type == MCT_INT_SPI) | ||
467 | irq_set_affinity(mct_irqs[MCT_L0_IRQ + cpu], | ||
468 | cpumask_of(cpu)); | ||
469 | break; | ||
470 | case CPU_DYING: | 464 | case CPU_DYING: |
471 | mevt = this_cpu_ptr(&percpu_mct_tick); | 465 | mevt = this_cpu_ptr(&percpu_mct_tick); |
472 | exynos4_local_timer_stop(&mevt->evt); | 466 | exynos4_local_timer_stop(&mevt->evt); |
diff --git a/drivers/cpufreq/Kconfig.arm b/drivers/cpufreq/Kconfig.arm index 0e9cce82844b..580503513f0f 100644 --- a/drivers/cpufreq/Kconfig.arm +++ b/drivers/cpufreq/Kconfig.arm | |||
@@ -92,11 +92,7 @@ config ARM_EXYNOS_CPU_FREQ_BOOST_SW | |||
92 | 92 | ||
93 | config ARM_HIGHBANK_CPUFREQ | 93 | config ARM_HIGHBANK_CPUFREQ |
94 | tristate "Calxeda Highbank-based" | 94 | tristate "Calxeda Highbank-based" |
95 | depends on ARCH_HIGHBANK | 95 | depends on ARCH_HIGHBANK && GENERIC_CPUFREQ_CPU0 && REGULATOR |
96 | select GENERIC_CPUFREQ_CPU0 | ||
97 | select PM_OPP | ||
98 | select REGULATOR | ||
99 | |||
100 | default m | 96 | default m |
101 | help | 97 | help |
102 | This adds the CPUFreq driver for Calxeda Highbank SoC | 98 | This adds the CPUFreq driver for Calxeda Highbank SoC |
diff --git a/drivers/cpufreq/powernv-cpufreq.c b/drivers/cpufreq/powernv-cpufreq.c index 9edccc63245d..af4968813e76 100644 --- a/drivers/cpufreq/powernv-cpufreq.c +++ b/drivers/cpufreq/powernv-cpufreq.c | |||
@@ -29,6 +29,7 @@ | |||
29 | 29 | ||
30 | #include <asm/cputhreads.h> | 30 | #include <asm/cputhreads.h> |
31 | #include <asm/reg.h> | 31 | #include <asm/reg.h> |
32 | #include <asm/smp.h> /* Required for cpu_sibling_mask() in UP configs */ | ||
32 | 33 | ||
33 | #define POWERNV_MAX_PSTATES 256 | 34 | #define POWERNV_MAX_PSTATES 256 |
34 | 35 | ||
diff --git a/drivers/cpufreq/ppc-corenet-cpufreq.c b/drivers/cpufreq/ppc-corenet-cpufreq.c index b7e677be1df0..a1ca3dd04a8e 100644 --- a/drivers/cpufreq/ppc-corenet-cpufreq.c +++ b/drivers/cpufreq/ppc-corenet-cpufreq.c | |||
@@ -206,7 +206,7 @@ static int corenet_cpufreq_cpu_init(struct cpufreq_policy *policy) | |||
206 | per_cpu(cpu_data, i) = data; | 206 | per_cpu(cpu_data, i) = data; |
207 | 207 | ||
208 | policy->cpuinfo.transition_latency = | 208 | policy->cpuinfo.transition_latency = |
209 | (12 * NSEC_PER_SEC) / fsl_get_sys_freq(); | 209 | (12ULL * NSEC_PER_SEC) / fsl_get_sys_freq(); |
210 | of_node_put(np); | 210 | of_node_put(np); |
211 | 211 | ||
212 | return 0; | 212 | return 0; |
diff --git a/drivers/cpufreq/unicore2-cpufreq.c b/drivers/cpufreq/unicore2-cpufreq.c index 8d045afa7fb4..6f9dfa80563a 100644 --- a/drivers/cpufreq/unicore2-cpufreq.c +++ b/drivers/cpufreq/unicore2-cpufreq.c | |||
@@ -60,9 +60,7 @@ static int __init ucv2_cpu_init(struct cpufreq_policy *policy) | |||
60 | policy->max = policy->cpuinfo.max_freq = 1000000; | 60 | policy->max = policy->cpuinfo.max_freq = 1000000; |
61 | policy->cpuinfo.transition_latency = CPUFREQ_ETERNAL; | 61 | policy->cpuinfo.transition_latency = CPUFREQ_ETERNAL; |
62 | policy->clk = clk_get(NULL, "MAIN_CLK"); | 62 | policy->clk = clk_get(NULL, "MAIN_CLK"); |
63 | if (IS_ERR(policy->clk)) | 63 | return PTR_ERR_OR_ZERO(policy->clk); |
64 | return PTR_ERR(policy->clk); | ||
65 | return 0; | ||
66 | } | 64 | } |
67 | 65 | ||
68 | static struct cpufreq_driver ucv2_driver = { | 66 | static struct cpufreq_driver ucv2_driver = { |
diff --git a/drivers/gpio/gpiolib-acpi.c b/drivers/gpio/gpiolib-acpi.c index bf0f8b476696..401add28933f 100644 --- a/drivers/gpio/gpiolib-acpi.c +++ b/drivers/gpio/gpiolib-acpi.c | |||
@@ -233,7 +233,7 @@ static void acpi_gpiochip_request_interrupts(struct acpi_gpio_chip *acpi_gpio) | |||
233 | { | 233 | { |
234 | struct gpio_chip *chip = acpi_gpio->chip; | 234 | struct gpio_chip *chip = acpi_gpio->chip; |
235 | 235 | ||
236 | if (!chip->dev || !chip->to_irq) | 236 | if (!chip->to_irq) |
237 | return; | 237 | return; |
238 | 238 | ||
239 | INIT_LIST_HEAD(&acpi_gpio->events); | 239 | INIT_LIST_HEAD(&acpi_gpio->events); |
@@ -253,7 +253,7 @@ static void acpi_gpiochip_free_interrupts(struct acpi_gpio_chip *acpi_gpio) | |||
253 | struct acpi_gpio_event *event, *ep; | 253 | struct acpi_gpio_event *event, *ep; |
254 | struct gpio_chip *chip = acpi_gpio->chip; | 254 | struct gpio_chip *chip = acpi_gpio->chip; |
255 | 255 | ||
256 | if (!chip->dev || !chip->to_irq) | 256 | if (!chip->to_irq) |
257 | return; | 257 | return; |
258 | 258 | ||
259 | list_for_each_entry_safe_reverse(event, ep, &acpi_gpio->events, node) { | 259 | list_for_each_entry_safe_reverse(event, ep, &acpi_gpio->events, node) { |
@@ -451,7 +451,7 @@ acpi_gpio_adr_space_handler(u32 function, acpi_physical_address address, | |||
451 | if (function == ACPI_WRITE) | 451 | if (function == ACPI_WRITE) |
452 | gpiod_set_raw_value(desc, !!((1 << i) & *value)); | 452 | gpiod_set_raw_value(desc, !!((1 << i) & *value)); |
453 | else | 453 | else |
454 | *value |= gpiod_get_raw_value(desc) << i; | 454 | *value |= (u64)gpiod_get_raw_value(desc) << i; |
455 | } | 455 | } |
456 | 456 | ||
457 | out: | 457 | out: |
@@ -501,6 +501,9 @@ void acpi_gpiochip_add(struct gpio_chip *chip) | |||
501 | acpi_handle handle; | 501 | acpi_handle handle; |
502 | acpi_status status; | 502 | acpi_status status; |
503 | 503 | ||
504 | if (!chip || !chip->dev) | ||
505 | return; | ||
506 | |||
504 | handle = ACPI_HANDLE(chip->dev); | 507 | handle = ACPI_HANDLE(chip->dev); |
505 | if (!handle) | 508 | if (!handle) |
506 | return; | 509 | return; |
@@ -531,6 +534,9 @@ void acpi_gpiochip_remove(struct gpio_chip *chip) | |||
531 | acpi_handle handle; | 534 | acpi_handle handle; |
532 | acpi_status status; | 535 | acpi_status status; |
533 | 536 | ||
537 | if (!chip || !chip->dev) | ||
538 | return; | ||
539 | |||
534 | handle = ACPI_HANDLE(chip->dev); | 540 | handle = ACPI_HANDLE(chip->dev); |
535 | if (!handle) | 541 | if (!handle) |
536 | return; | 542 | return; |
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 761013f8b82f..f48817d97480 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c | |||
@@ -1387,8 +1387,8 @@ static int gpiochip_irq_map(struct irq_domain *d, unsigned int irq, | |||
1387 | { | 1387 | { |
1388 | struct gpio_chip *chip = d->host_data; | 1388 | struct gpio_chip *chip = d->host_data; |
1389 | 1389 | ||
1390 | irq_set_chip_and_handler(irq, chip->irqchip, chip->irq_handler); | ||
1391 | irq_set_chip_data(irq, chip); | 1390 | irq_set_chip_data(irq, chip); |
1391 | irq_set_chip_and_handler(irq, chip->irqchip, chip->irq_handler); | ||
1392 | #ifdef CONFIG_ARM | 1392 | #ifdef CONFIG_ARM |
1393 | set_irq_flags(irq, IRQF_VALID); | 1393 | set_irq_flags(irq, IRQF_VALID); |
1394 | #else | 1394 | #else |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.c b/drivers/gpu/drm/exynos/exynos_drm_crtc.c index e930d4fe29c7..1ef5ab9c9d51 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_crtc.c +++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.c | |||
@@ -145,6 +145,7 @@ exynos_drm_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *mode, | |||
145 | 145 | ||
146 | plane->crtc = crtc; | 146 | plane->crtc = crtc; |
147 | plane->fb = crtc->primary->fb; | 147 | plane->fb = crtc->primary->fb; |
148 | drm_framebuffer_reference(plane->fb); | ||
148 | 149 | ||
149 | return 0; | 150 | return 0; |
150 | } | 151 | } |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c b/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c index c786cd4f457b..2a3ad24276f8 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c +++ b/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c | |||
@@ -263,7 +263,7 @@ struct drm_gem_object *exynos_dmabuf_prime_import(struct drm_device *drm_dev, | |||
263 | buffer->sgt = sgt; | 263 | buffer->sgt = sgt; |
264 | exynos_gem_obj->base.import_attach = attach; | 264 | exynos_gem_obj->base.import_attach = attach; |
265 | 265 | ||
266 | DRM_DEBUG_PRIME("dma_addr = 0x%x, size = 0x%lx\n", buffer->dma_addr, | 266 | DRM_DEBUG_PRIME("dma_addr = %pad, size = 0x%lx\n", &buffer->dma_addr, |
267 | buffer->size); | 267 | buffer->size); |
268 | 268 | ||
269 | return &exynos_gem_obj->base; | 269 | return &exynos_gem_obj->base; |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_dsi.c b/drivers/gpu/drm/exynos/exynos_drm_dsi.c index eb73e3bf2a0c..4ac438187568 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_dsi.c +++ b/drivers/gpu/drm/exynos/exynos_drm_dsi.c | |||
@@ -1426,9 +1426,9 @@ static int exynos_dsi_probe(struct platform_device *pdev) | |||
1426 | 1426 | ||
1427 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 1427 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
1428 | dsi->reg_base = devm_ioremap_resource(&pdev->dev, res); | 1428 | dsi->reg_base = devm_ioremap_resource(&pdev->dev, res); |
1429 | if (!dsi->reg_base) { | 1429 | if (IS_ERR(dsi->reg_base)) { |
1430 | dev_err(&pdev->dev, "failed to remap io region\n"); | 1430 | dev_err(&pdev->dev, "failed to remap io region\n"); |
1431 | return -EADDRNOTAVAIL; | 1431 | return PTR_ERR(dsi->reg_base); |
1432 | } | 1432 | } |
1433 | 1433 | ||
1434 | dsi->phy = devm_phy_get(&pdev->dev, "dsim"); | 1434 | dsi->phy = devm_phy_get(&pdev->dev, "dsim"); |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c index 7afead9c3f30..852f2dadaebd 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c | |||
@@ -220,7 +220,7 @@ static void vidi_win_commit(struct exynos_drm_manager *mgr, int zpos) | |||
220 | 220 | ||
221 | win_data->enabled = true; | 221 | win_data->enabled = true; |
222 | 222 | ||
223 | DRM_DEBUG_KMS("dma_addr = 0x%x\n", win_data->dma_addr); | 223 | DRM_DEBUG_KMS("dma_addr = %pad\n", &win_data->dma_addr); |
224 | 224 | ||
225 | if (ctx->vblank_on) | 225 | if (ctx->vblank_on) |
226 | schedule_work(&ctx->work); | 226 | schedule_work(&ctx->work); |
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c index ab5e93c30aa2..62a5c3627b90 100644 --- a/drivers/gpu/drm/i915/i915_gem_gtt.c +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c | |||
@@ -50,7 +50,7 @@ bool intel_enable_ppgtt(struct drm_device *dev, bool full) | |||
50 | 50 | ||
51 | /* Full ppgtt disabled by default for now due to issues. */ | 51 | /* Full ppgtt disabled by default for now due to issues. */ |
52 | if (full) | 52 | if (full) |
53 | return false; /* HAS_PPGTT(dev) */ | 53 | return HAS_PPGTT(dev) && (i915.enable_ppgtt == 2); |
54 | else | 54 | else |
55 | return HAS_ALIASING_PPGTT(dev); | 55 | return HAS_ALIASING_PPGTT(dev); |
56 | } | 56 | } |
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 7753249b3a95..f98ba4e6e70b 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
@@ -1362,10 +1362,20 @@ static inline void intel_hpd_irq_handler(struct drm_device *dev, | |||
1362 | spin_lock(&dev_priv->irq_lock); | 1362 | spin_lock(&dev_priv->irq_lock); |
1363 | for (i = 1; i < HPD_NUM_PINS; i++) { | 1363 | for (i = 1; i < HPD_NUM_PINS; i++) { |
1364 | 1364 | ||
1365 | WARN_ONCE(hpd[i] & hotplug_trigger && | 1365 | if (hpd[i] & hotplug_trigger && |
1366 | dev_priv->hpd_stats[i].hpd_mark == HPD_DISABLED, | 1366 | dev_priv->hpd_stats[i].hpd_mark == HPD_DISABLED) { |
1367 | "Received HPD interrupt (0x%08x) on pin %d (0x%08x) although disabled\n", | 1367 | /* |
1368 | hotplug_trigger, i, hpd[i]); | 1368 | * On GMCH platforms the interrupt mask bits only |
1369 | * prevent irq generation, not the setting of the | ||
1370 | * hotplug bits itself. So only WARN about unexpected | ||
1371 | * interrupts on saner platforms. | ||
1372 | */ | ||
1373 | WARN_ONCE(INTEL_INFO(dev)->gen >= 5 && !IS_VALLEYVIEW(dev), | ||
1374 | "Received HPD interrupt (0x%08x) on pin %d (0x%08x) although disabled\n", | ||
1375 | hotplug_trigger, i, hpd[i]); | ||
1376 | |||
1377 | continue; | ||
1378 | } | ||
1369 | 1379 | ||
1370 | if (!(hpd[i] & hotplug_trigger) || | 1380 | if (!(hpd[i] & hotplug_trigger) || |
1371 | dev_priv->hpd_stats[i].hpd_mark != HPD_ENABLED) | 1381 | dev_priv->hpd_stats[i].hpd_mark != HPD_ENABLED) |
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 9f5b18d9d885..c77af69c2d8f 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
@@ -827,6 +827,7 @@ enum punit_power_well { | |||
827 | # define MI_FLUSH_ENABLE (1 << 12) | 827 | # define MI_FLUSH_ENABLE (1 << 12) |
828 | # define ASYNC_FLIP_PERF_DISABLE (1 << 14) | 828 | # define ASYNC_FLIP_PERF_DISABLE (1 << 14) |
829 | # define MODE_IDLE (1 << 9) | 829 | # define MODE_IDLE (1 << 9) |
830 | # define STOP_RING (1 << 8) | ||
830 | 831 | ||
831 | #define GEN6_GT_MODE 0x20d0 | 832 | #define GEN6_GT_MODE 0x20d0 |
832 | #define GEN7_GT_MODE 0x7008 | 833 | #define GEN7_GT_MODE 0x7008 |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index dae976f51d83..69bcc42a0e44 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -9654,11 +9654,22 @@ intel_pipe_config_compare(struct drm_device *dev, | |||
9654 | PIPE_CONF_CHECK_I(pipe_src_w); | 9654 | PIPE_CONF_CHECK_I(pipe_src_w); |
9655 | PIPE_CONF_CHECK_I(pipe_src_h); | 9655 | PIPE_CONF_CHECK_I(pipe_src_h); |
9656 | 9656 | ||
9657 | PIPE_CONF_CHECK_I(gmch_pfit.control); | 9657 | /* |
9658 | /* pfit ratios are autocomputed by the hw on gen4+ */ | 9658 | * FIXME: BIOS likes to set up a cloned config with lvds+external |
9659 | if (INTEL_INFO(dev)->gen < 4) | 9659 | * screen. Since we don't yet re-compute the pipe config when moving |
9660 | PIPE_CONF_CHECK_I(gmch_pfit.pgm_ratios); | 9660 | * just the lvds port away to another pipe the sw tracking won't match. |
9661 | PIPE_CONF_CHECK_I(gmch_pfit.lvds_border_bits); | 9661 | * |
9662 | * Proper atomic modesets with recomputed global state will fix this. | ||
9663 | * Until then just don't check gmch state for inherited modes. | ||
9664 | */ | ||
9665 | if (!PIPE_CONF_QUIRK(PIPE_CONFIG_QUIRK_INHERITED_MODE)) { | ||
9666 | PIPE_CONF_CHECK_I(gmch_pfit.control); | ||
9667 | /* pfit ratios are autocomputed by the hw on gen4+ */ | ||
9668 | if (INTEL_INFO(dev)->gen < 4) | ||
9669 | PIPE_CONF_CHECK_I(gmch_pfit.pgm_ratios); | ||
9670 | PIPE_CONF_CHECK_I(gmch_pfit.lvds_border_bits); | ||
9671 | } | ||
9672 | |||
9662 | PIPE_CONF_CHECK_I(pch_pfit.enabled); | 9673 | PIPE_CONF_CHECK_I(pch_pfit.enabled); |
9663 | if (current_config->pch_pfit.enabled) { | 9674 | if (current_config->pch_pfit.enabled) { |
9664 | PIPE_CONF_CHECK_I(pch_pfit.pos); | 9675 | PIPE_CONF_CHECK_I(pch_pfit.pos); |
@@ -11616,6 +11627,8 @@ static void intel_modeset_readout_hw_state(struct drm_device *dev) | |||
11616 | base.head) { | 11627 | base.head) { |
11617 | memset(&crtc->config, 0, sizeof(crtc->config)); | 11628 | memset(&crtc->config, 0, sizeof(crtc->config)); |
11618 | 11629 | ||
11630 | crtc->config.quirks |= PIPE_CONFIG_QUIRK_INHERITED_MODE; | ||
11631 | |||
11619 | crtc->active = dev_priv->display.get_pipe_config(crtc, | 11632 | crtc->active = dev_priv->display.get_pipe_config(crtc, |
11620 | &crtc->config); | 11633 | &crtc->config); |
11621 | 11634 | ||
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index d2a55884ad52..dfa85289f28f 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
@@ -3619,7 +3619,8 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp, | |||
3619 | { | 3619 | { |
3620 | struct drm_connector *connector = &intel_connector->base; | 3620 | struct drm_connector *connector = &intel_connector->base; |
3621 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); | 3621 | struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); |
3622 | struct drm_device *dev = intel_dig_port->base.base.dev; | 3622 | struct intel_encoder *intel_encoder = &intel_dig_port->base; |
3623 | struct drm_device *dev = intel_encoder->base.dev; | ||
3623 | struct drm_i915_private *dev_priv = dev->dev_private; | 3624 | struct drm_i915_private *dev_priv = dev->dev_private; |
3624 | struct drm_display_mode *fixed_mode = NULL; | 3625 | struct drm_display_mode *fixed_mode = NULL; |
3625 | bool has_dpcd; | 3626 | bool has_dpcd; |
@@ -3629,6 +3630,14 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp, | |||
3629 | if (!is_edp(intel_dp)) | 3630 | if (!is_edp(intel_dp)) |
3630 | return true; | 3631 | return true; |
3631 | 3632 | ||
3633 | /* The VDD bit needs a power domain reference, so if the bit is already | ||
3634 | * enabled when we boot, grab this reference. */ | ||
3635 | if (edp_have_panel_vdd(intel_dp)) { | ||
3636 | enum intel_display_power_domain power_domain; | ||
3637 | power_domain = intel_display_port_power_domain(intel_encoder); | ||
3638 | intel_display_power_get(dev_priv, power_domain); | ||
3639 | } | ||
3640 | |||
3632 | /* Cache DPCD and EDID for edp. */ | 3641 | /* Cache DPCD and EDID for edp. */ |
3633 | intel_edp_panel_vdd_on(intel_dp); | 3642 | intel_edp_panel_vdd_on(intel_dp); |
3634 | has_dpcd = intel_dp_get_dpcd(intel_dp); | 3643 | has_dpcd = intel_dp_get_dpcd(intel_dp); |
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index 0542de982260..328b1a70264b 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h | |||
@@ -236,7 +236,8 @@ struct intel_crtc_config { | |||
236 | * tracked with quirk flags so that fastboot and state checker can act | 236 | * tracked with quirk flags so that fastboot and state checker can act |
237 | * accordingly. | 237 | * accordingly. |
238 | */ | 238 | */ |
239 | #define PIPE_CONFIG_QUIRK_MODE_SYNC_FLAGS (1<<0) /* unreliable sync mode.flags */ | 239 | #define PIPE_CONFIG_QUIRK_MODE_SYNC_FLAGS (1<<0) /* unreliable sync mode.flags */ |
240 | #define PIPE_CONFIG_QUIRK_INHERITED_MODE (1<<1) /* mode inherited from firmware */ | ||
240 | unsigned long quirks; | 241 | unsigned long quirks; |
241 | 242 | ||
242 | /* User requested mode, only valid as a starting point to | 243 | /* User requested mode, only valid as a starting point to |
diff --git a/drivers/gpu/drm/i915/intel_fbdev.c b/drivers/gpu/drm/i915/intel_fbdev.c index b4d44e62f0c7..fce4a0d93c0b 100644 --- a/drivers/gpu/drm/i915/intel_fbdev.c +++ b/drivers/gpu/drm/i915/intel_fbdev.c | |||
@@ -132,6 +132,16 @@ static int intelfb_create(struct drm_fb_helper *helper, | |||
132 | 132 | ||
133 | mutex_lock(&dev->struct_mutex); | 133 | mutex_lock(&dev->struct_mutex); |
134 | 134 | ||
135 | if (intel_fb && | ||
136 | (sizes->fb_width > intel_fb->base.width || | ||
137 | sizes->fb_height > intel_fb->base.height)) { | ||
138 | DRM_DEBUG_KMS("BIOS fb too small (%dx%d), we require (%dx%d)," | ||
139 | " releasing it\n", | ||
140 | intel_fb->base.width, intel_fb->base.height, | ||
141 | sizes->fb_width, sizes->fb_height); | ||
142 | drm_framebuffer_unreference(&intel_fb->base); | ||
143 | intel_fb = ifbdev->fb = NULL; | ||
144 | } | ||
135 | if (!intel_fb || WARN_ON(!intel_fb->obj)) { | 145 | if (!intel_fb || WARN_ON(!intel_fb->obj)) { |
136 | DRM_DEBUG_KMS("no BIOS fb, allocating a new one\n"); | 146 | DRM_DEBUG_KMS("no BIOS fb, allocating a new one\n"); |
137 | ret = intelfb_alloc(helper, sizes); | 147 | ret = intelfb_alloc(helper, sizes); |
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c index b0413e190625..157267aa3561 100644 --- a/drivers/gpu/drm/i915/intel_hdmi.c +++ b/drivers/gpu/drm/i915/intel_hdmi.c | |||
@@ -821,11 +821,11 @@ static void intel_disable_hdmi(struct intel_encoder *encoder) | |||
821 | } | 821 | } |
822 | } | 822 | } |
823 | 823 | ||
824 | static int hdmi_portclock_limit(struct intel_hdmi *hdmi) | 824 | static int hdmi_portclock_limit(struct intel_hdmi *hdmi, bool respect_dvi_limit) |
825 | { | 825 | { |
826 | struct drm_device *dev = intel_hdmi_to_dev(hdmi); | 826 | struct drm_device *dev = intel_hdmi_to_dev(hdmi); |
827 | 827 | ||
828 | if (!hdmi->has_hdmi_sink || IS_G4X(dev)) | 828 | if ((respect_dvi_limit && !hdmi->has_hdmi_sink) || IS_G4X(dev)) |
829 | return 165000; | 829 | return 165000; |
830 | else if (IS_HASWELL(dev) || INTEL_INFO(dev)->gen >= 8) | 830 | else if (IS_HASWELL(dev) || INTEL_INFO(dev)->gen >= 8) |
831 | return 300000; | 831 | return 300000; |
@@ -837,7 +837,8 @@ static enum drm_mode_status | |||
837 | intel_hdmi_mode_valid(struct drm_connector *connector, | 837 | intel_hdmi_mode_valid(struct drm_connector *connector, |
838 | struct drm_display_mode *mode) | 838 | struct drm_display_mode *mode) |
839 | { | 839 | { |
840 | if (mode->clock > hdmi_portclock_limit(intel_attached_hdmi(connector))) | 840 | if (mode->clock > hdmi_portclock_limit(intel_attached_hdmi(connector), |
841 | true)) | ||
841 | return MODE_CLOCK_HIGH; | 842 | return MODE_CLOCK_HIGH; |
842 | if (mode->clock < 20000) | 843 | if (mode->clock < 20000) |
843 | return MODE_CLOCK_LOW; | 844 | return MODE_CLOCK_LOW; |
@@ -879,7 +880,7 @@ bool intel_hdmi_compute_config(struct intel_encoder *encoder, | |||
879 | struct drm_device *dev = encoder->base.dev; | 880 | struct drm_device *dev = encoder->base.dev; |
880 | struct drm_display_mode *adjusted_mode = &pipe_config->adjusted_mode; | 881 | struct drm_display_mode *adjusted_mode = &pipe_config->adjusted_mode; |
881 | int clock_12bpc = pipe_config->adjusted_mode.crtc_clock * 3 / 2; | 882 | int clock_12bpc = pipe_config->adjusted_mode.crtc_clock * 3 / 2; |
882 | int portclock_limit = hdmi_portclock_limit(intel_hdmi); | 883 | int portclock_limit = hdmi_portclock_limit(intel_hdmi, false); |
883 | int desired_bpp; | 884 | int desired_bpp; |
884 | 885 | ||
885 | if (intel_hdmi->color_range_auto) { | 886 | if (intel_hdmi->color_range_auto) { |
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index 6bc68bdcf433..79fb4cc2137c 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c | |||
@@ -437,32 +437,41 @@ static void ring_setup_phys_status_page(struct intel_ring_buffer *ring) | |||
437 | I915_WRITE(HWS_PGA, addr); | 437 | I915_WRITE(HWS_PGA, addr); |
438 | } | 438 | } |
439 | 439 | ||
440 | static int init_ring_common(struct intel_ring_buffer *ring) | 440 | static bool stop_ring(struct intel_ring_buffer *ring) |
441 | { | 441 | { |
442 | struct drm_device *dev = ring->dev; | 442 | struct drm_i915_private *dev_priv = to_i915(ring->dev); |
443 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
444 | struct drm_i915_gem_object *obj = ring->obj; | ||
445 | int ret = 0; | ||
446 | u32 head; | ||
447 | 443 | ||
448 | gen6_gt_force_wake_get(dev_priv, FORCEWAKE_ALL); | 444 | if (!IS_GEN2(ring->dev)) { |
445 | I915_WRITE_MODE(ring, _MASKED_BIT_ENABLE(STOP_RING)); | ||
446 | if (wait_for_atomic((I915_READ_MODE(ring) & MODE_IDLE) != 0, 1000)) { | ||
447 | DRM_ERROR("%s :timed out trying to stop ring\n", ring->name); | ||
448 | return false; | ||
449 | } | ||
450 | } | ||
449 | 451 | ||
450 | /* Stop the ring if it's running. */ | ||
451 | I915_WRITE_CTL(ring, 0); | 452 | I915_WRITE_CTL(ring, 0); |
452 | I915_WRITE_HEAD(ring, 0); | 453 | I915_WRITE_HEAD(ring, 0); |
453 | ring->write_tail(ring, 0); | 454 | ring->write_tail(ring, 0); |
454 | if (wait_for_atomic((I915_READ_MODE(ring) & MODE_IDLE) != 0, 1000)) | ||
455 | DRM_ERROR("%s :timed out trying to stop ring\n", ring->name); | ||
456 | 455 | ||
457 | if (I915_NEED_GFX_HWS(dev)) | 456 | if (!IS_GEN2(ring->dev)) { |
458 | intel_ring_setup_status_page(ring); | 457 | (void)I915_READ_CTL(ring); |
459 | else | 458 | I915_WRITE_MODE(ring, _MASKED_BIT_DISABLE(STOP_RING)); |
460 | ring_setup_phys_status_page(ring); | 459 | } |
461 | 460 | ||
462 | head = I915_READ_HEAD(ring) & HEAD_ADDR; | 461 | return (I915_READ_HEAD(ring) & HEAD_ADDR) == 0; |
462 | } | ||
463 | 463 | ||
464 | /* G45 ring initialization fails to reset head to zero */ | 464 | static int init_ring_common(struct intel_ring_buffer *ring) |
465 | if (head != 0) { | 465 | { |
466 | struct drm_device *dev = ring->dev; | ||
467 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
468 | struct drm_i915_gem_object *obj = ring->obj; | ||
469 | int ret = 0; | ||
470 | |||
471 | gen6_gt_force_wake_get(dev_priv, FORCEWAKE_ALL); | ||
472 | |||
473 | if (!stop_ring(ring)) { | ||
474 | /* G45 ring initialization often fails to reset head to zero */ | ||
466 | DRM_DEBUG_KMS("%s head not reset to zero " | 475 | DRM_DEBUG_KMS("%s head not reset to zero " |
467 | "ctl %08x head %08x tail %08x start %08x\n", | 476 | "ctl %08x head %08x tail %08x start %08x\n", |
468 | ring->name, | 477 | ring->name, |
@@ -471,9 +480,7 @@ static int init_ring_common(struct intel_ring_buffer *ring) | |||
471 | I915_READ_TAIL(ring), | 480 | I915_READ_TAIL(ring), |
472 | I915_READ_START(ring)); | 481 | I915_READ_START(ring)); |
473 | 482 | ||
474 | I915_WRITE_HEAD(ring, 0); | 483 | if (!stop_ring(ring)) { |
475 | |||
476 | if (I915_READ_HEAD(ring) & HEAD_ADDR) { | ||
477 | DRM_ERROR("failed to set %s head to zero " | 484 | DRM_ERROR("failed to set %s head to zero " |
478 | "ctl %08x head %08x tail %08x start %08x\n", | 485 | "ctl %08x head %08x tail %08x start %08x\n", |
479 | ring->name, | 486 | ring->name, |
@@ -481,9 +488,16 @@ static int init_ring_common(struct intel_ring_buffer *ring) | |||
481 | I915_READ_HEAD(ring), | 488 | I915_READ_HEAD(ring), |
482 | I915_READ_TAIL(ring), | 489 | I915_READ_TAIL(ring), |
483 | I915_READ_START(ring)); | 490 | I915_READ_START(ring)); |
491 | ret = -EIO; | ||
492 | goto out; | ||
484 | } | 493 | } |
485 | } | 494 | } |
486 | 495 | ||
496 | if (I915_NEED_GFX_HWS(dev)) | ||
497 | intel_ring_setup_status_page(ring); | ||
498 | else | ||
499 | ring_setup_phys_status_page(ring); | ||
500 | |||
487 | /* Initialize the ring. This must happen _after_ we've cleared the ring | 501 | /* Initialize the ring. This must happen _after_ we've cleared the ring |
488 | * registers with the above sequence (the readback of the HEAD registers | 502 | * registers with the above sequence (the readback of the HEAD registers |
489 | * also enforces ordering), otherwise the hw might lose the new ring | 503 | * also enforces ordering), otherwise the hw might lose the new ring |
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h index 270a6a973438..2b91c4b4d34b 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.h +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h | |||
@@ -34,6 +34,7 @@ struct intel_hw_status_page { | |||
34 | #define I915_WRITE_IMR(ring, val) I915_WRITE(RING_IMR((ring)->mmio_base), val) | 34 | #define I915_WRITE_IMR(ring, val) I915_WRITE(RING_IMR((ring)->mmio_base), val) |
35 | 35 | ||
36 | #define I915_READ_MODE(ring) I915_READ(RING_MI_MODE((ring)->mmio_base)) | 36 | #define I915_READ_MODE(ring) I915_READ(RING_MI_MODE((ring)->mmio_base)) |
37 | #define I915_WRITE_MODE(ring, val) I915_WRITE(RING_MI_MODE((ring)->mmio_base), val) | ||
37 | 38 | ||
38 | enum intel_ring_hangcheck_action { | 39 | enum intel_ring_hangcheck_action { |
39 | HANGCHECK_IDLE = 0, | 40 | HANGCHECK_IDLE = 0, |
diff --git a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c index 3e6c0f3ed592..ef9957dbac94 100644 --- a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c +++ b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c | |||
@@ -510,9 +510,8 @@ static void update_cursor(struct drm_crtc *crtc) | |||
510 | MDP4_DMA_CURSOR_BLEND_CONFIG_CURSOR_EN); | 510 | MDP4_DMA_CURSOR_BLEND_CONFIG_CURSOR_EN); |
511 | } else { | 511 | } else { |
512 | /* disable cursor: */ | 512 | /* disable cursor: */ |
513 | mdp4_write(mdp4_kms, REG_MDP4_DMA_CURSOR_BASE(dma), 0); | 513 | mdp4_write(mdp4_kms, REG_MDP4_DMA_CURSOR_BASE(dma), |
514 | mdp4_write(mdp4_kms, REG_MDP4_DMA_CURSOR_BLEND_CONFIG(dma), | 514 | mdp4_kms->blank_cursor_iova); |
515 | MDP4_DMA_CURSOR_BLEND_CONFIG_FORMAT(CURSOR_ARGB)); | ||
516 | } | 515 | } |
517 | 516 | ||
518 | /* and drop the iova ref + obj rev when done scanning out: */ | 517 | /* and drop the iova ref + obj rev when done scanning out: */ |
@@ -574,11 +573,9 @@ static int mdp4_crtc_cursor_set(struct drm_crtc *crtc, | |||
574 | 573 | ||
575 | if (old_bo) { | 574 | if (old_bo) { |
576 | /* drop our previous reference: */ | 575 | /* drop our previous reference: */ |
577 | msm_gem_put_iova(old_bo, mdp4_kms->id); | 576 | drm_flip_work_queue(&mdp4_crtc->unref_cursor_work, old_bo); |
578 | drm_gem_object_unreference_unlocked(old_bo); | ||
579 | } | 577 | } |
580 | 578 | ||
581 | crtc_flush(crtc); | ||
582 | request_pending(crtc, PENDING_CURSOR); | 579 | request_pending(crtc, PENDING_CURSOR); |
583 | 580 | ||
584 | return 0; | 581 | return 0; |
diff --git a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_irq.c b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_irq.c index c740ccd1cc67..8edd531cb621 100644 --- a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_irq.c +++ b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_irq.c | |||
@@ -70,12 +70,12 @@ irqreturn_t mdp4_irq(struct msm_kms *kms) | |||
70 | 70 | ||
71 | VERB("status=%08x", status); | 71 | VERB("status=%08x", status); |
72 | 72 | ||
73 | mdp_dispatch_irqs(mdp_kms, status); | ||
74 | |||
73 | for (id = 0; id < priv->num_crtcs; id++) | 75 | for (id = 0; id < priv->num_crtcs; id++) |
74 | if (status & mdp4_crtc_vblank(priv->crtcs[id])) | 76 | if (status & mdp4_crtc_vblank(priv->crtcs[id])) |
75 | drm_handle_vblank(dev, id); | 77 | drm_handle_vblank(dev, id); |
76 | 78 | ||
77 | mdp_dispatch_irqs(mdp_kms, status); | ||
78 | |||
79 | return IRQ_HANDLED; | 79 | return IRQ_HANDLED; |
80 | } | 80 | } |
81 | 81 | ||
diff --git a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c index 272e707c9487..0bb4faa17523 100644 --- a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c +++ b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c | |||
@@ -144,6 +144,10 @@ static void mdp4_preclose(struct msm_kms *kms, struct drm_file *file) | |||
144 | static void mdp4_destroy(struct msm_kms *kms) | 144 | static void mdp4_destroy(struct msm_kms *kms) |
145 | { | 145 | { |
146 | struct mdp4_kms *mdp4_kms = to_mdp4_kms(to_mdp_kms(kms)); | 146 | struct mdp4_kms *mdp4_kms = to_mdp4_kms(to_mdp_kms(kms)); |
147 | if (mdp4_kms->blank_cursor_iova) | ||
148 | msm_gem_put_iova(mdp4_kms->blank_cursor_bo, mdp4_kms->id); | ||
149 | if (mdp4_kms->blank_cursor_bo) | ||
150 | drm_gem_object_unreference(mdp4_kms->blank_cursor_bo); | ||
147 | kfree(mdp4_kms); | 151 | kfree(mdp4_kms); |
148 | } | 152 | } |
149 | 153 | ||
@@ -372,6 +376,23 @@ struct msm_kms *mdp4_kms_init(struct drm_device *dev) | |||
372 | goto fail; | 376 | goto fail; |
373 | } | 377 | } |
374 | 378 | ||
379 | mutex_lock(&dev->struct_mutex); | ||
380 | mdp4_kms->blank_cursor_bo = msm_gem_new(dev, SZ_16K, MSM_BO_WC); | ||
381 | mutex_unlock(&dev->struct_mutex); | ||
382 | if (IS_ERR(mdp4_kms->blank_cursor_bo)) { | ||
383 | ret = PTR_ERR(mdp4_kms->blank_cursor_bo); | ||
384 | dev_err(dev->dev, "could not allocate blank-cursor bo: %d\n", ret); | ||
385 | mdp4_kms->blank_cursor_bo = NULL; | ||
386 | goto fail; | ||
387 | } | ||
388 | |||
389 | ret = msm_gem_get_iova(mdp4_kms->blank_cursor_bo, mdp4_kms->id, | ||
390 | &mdp4_kms->blank_cursor_iova); | ||
391 | if (ret) { | ||
392 | dev_err(dev->dev, "could not pin blank-cursor bo: %d\n", ret); | ||
393 | goto fail; | ||
394 | } | ||
395 | |||
375 | return kms; | 396 | return kms; |
376 | 397 | ||
377 | fail: | 398 | fail: |
diff --git a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.h b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.h index 66a4d31aec80..715520c54cde 100644 --- a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.h +++ b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.h | |||
@@ -44,6 +44,10 @@ struct mdp4_kms { | |||
44 | struct clk *lut_clk; | 44 | struct clk *lut_clk; |
45 | 45 | ||
46 | struct mdp_irq error_handler; | 46 | struct mdp_irq error_handler; |
47 | |||
48 | /* empty/blank cursor bo to use when cursor is "disabled" */ | ||
49 | struct drm_gem_object *blank_cursor_bo; | ||
50 | uint32_t blank_cursor_iova; | ||
47 | }; | 51 | }; |
48 | #define to_mdp4_kms(x) container_of(x, struct mdp4_kms, base) | 52 | #define to_mdp4_kms(x) container_of(x, struct mdp4_kms, base) |
49 | 53 | ||
diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_irq.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_irq.c index 353d494a497f..f2b985bc2adf 100644 --- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_irq.c +++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_irq.c | |||
@@ -71,11 +71,11 @@ static void mdp5_irq_mdp(struct mdp_kms *mdp_kms) | |||
71 | 71 | ||
72 | VERB("status=%08x", status); | 72 | VERB("status=%08x", status); |
73 | 73 | ||
74 | mdp_dispatch_irqs(mdp_kms, status); | ||
75 | |||
74 | for (id = 0; id < priv->num_crtcs; id++) | 76 | for (id = 0; id < priv->num_crtcs; id++) |
75 | if (status & mdp5_crtc_vblank(priv->crtcs[id])) | 77 | if (status & mdp5_crtc_vblank(priv->crtcs[id])) |
76 | drm_handle_vblank(dev, id); | 78 | drm_handle_vblank(dev, id); |
77 | |||
78 | mdp_dispatch_irqs(mdp_kms, status); | ||
79 | } | 79 | } |
80 | 80 | ||
81 | irqreturn_t mdp5_irq(struct msm_kms *kms) | 81 | irqreturn_t mdp5_irq(struct msm_kms *kms) |
diff --git a/drivers/gpu/drm/msm/msm_fbdev.c b/drivers/gpu/drm/msm/msm_fbdev.c index 6c6d7d4c9b4e..a752ab83b810 100644 --- a/drivers/gpu/drm/msm/msm_fbdev.c +++ b/drivers/gpu/drm/msm/msm_fbdev.c | |||
@@ -62,11 +62,8 @@ static int msm_fbdev_create(struct drm_fb_helper *helper, | |||
62 | dma_addr_t paddr; | 62 | dma_addr_t paddr; |
63 | int ret, size; | 63 | int ret, size; |
64 | 64 | ||
65 | /* only doing ARGB32 since this is what is needed to alpha-blend | ||
66 | * with video overlays: | ||
67 | */ | ||
68 | sizes->surface_bpp = 32; | 65 | sizes->surface_bpp = 32; |
69 | sizes->surface_depth = 32; | 66 | sizes->surface_depth = 24; |
70 | 67 | ||
71 | DBG("create fbdev: %dx%d@%d (%dx%d)", sizes->surface_width, | 68 | DBG("create fbdev: %dx%d@%d (%dx%d)", sizes->surface_width, |
72 | sizes->surface_height, sizes->surface_bpp, | 69 | sizes->surface_height, sizes->surface_bpp, |
diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c index 3da8264d3039..bb8026daebc9 100644 --- a/drivers/gpu/drm/msm/msm_gem.c +++ b/drivers/gpu/drm/msm/msm_gem.c | |||
@@ -118,8 +118,10 @@ static void put_pages(struct drm_gem_object *obj) | |||
118 | 118 | ||
119 | if (iommu_present(&platform_bus_type)) | 119 | if (iommu_present(&platform_bus_type)) |
120 | drm_gem_put_pages(obj, msm_obj->pages, true, false); | 120 | drm_gem_put_pages(obj, msm_obj->pages, true, false); |
121 | else | 121 | else { |
122 | drm_mm_remove_node(msm_obj->vram_node); | 122 | drm_mm_remove_node(msm_obj->vram_node); |
123 | drm_free_large(msm_obj->pages); | ||
124 | } | ||
123 | 125 | ||
124 | msm_obj->pages = NULL; | 126 | msm_obj->pages = NULL; |
125 | } | 127 | } |
diff --git a/drivers/gpu/drm/radeon/atombios_dp.c b/drivers/gpu/drm/radeon/atombios_dp.c index 15936524f226..bc0119fb6c12 100644 --- a/drivers/gpu/drm/radeon/atombios_dp.c +++ b/drivers/gpu/drm/radeon/atombios_dp.c | |||
@@ -209,6 +209,7 @@ void radeon_dp_aux_init(struct radeon_connector *radeon_connector) | |||
209 | { | 209 | { |
210 | int ret; | 210 | int ret; |
211 | 211 | ||
212 | radeon_connector->ddc_bus->rec.hpd = radeon_connector->hpd.hpd; | ||
212 | radeon_connector->ddc_bus->aux.dev = radeon_connector->base.kdev; | 213 | radeon_connector->ddc_bus->aux.dev = radeon_connector->base.kdev; |
213 | radeon_connector->ddc_bus->aux.transfer = radeon_dp_aux_transfer; | 214 | radeon_connector->ddc_bus->aux.transfer = radeon_dp_aux_transfer; |
214 | ret = drm_dp_aux_register_i2c_bus(&radeon_connector->ddc_bus->aux); | 215 | ret = drm_dp_aux_register_i2c_bus(&radeon_connector->ddc_bus->aux); |
diff --git a/drivers/gpu/drm/radeon/cik_sdma.c b/drivers/gpu/drm/radeon/cik_sdma.c index 89b4afa5041c..f7e46cf682af 100644 --- a/drivers/gpu/drm/radeon/cik_sdma.c +++ b/drivers/gpu/drm/radeon/cik_sdma.c | |||
@@ -597,7 +597,7 @@ int cik_sdma_ring_test(struct radeon_device *rdev, | |||
597 | tmp = 0xCAFEDEAD; | 597 | tmp = 0xCAFEDEAD; |
598 | writel(tmp, ptr); | 598 | writel(tmp, ptr); |
599 | 599 | ||
600 | r = radeon_ring_lock(rdev, ring, 4); | 600 | r = radeon_ring_lock(rdev, ring, 5); |
601 | if (r) { | 601 | if (r) { |
602 | DRM_ERROR("radeon: dma failed to lock ring %d (%d).\n", ring->idx, r); | 602 | DRM_ERROR("radeon: dma failed to lock ring %d (%d).\n", ring->idx, r); |
603 | return r; | 603 | return r; |
diff --git a/drivers/gpu/drm/radeon/r600_dpm.c b/drivers/gpu/drm/radeon/r600_dpm.c index cbf7e3269f84..9c61b74ef441 100644 --- a/drivers/gpu/drm/radeon/r600_dpm.c +++ b/drivers/gpu/drm/radeon/r600_dpm.c | |||
@@ -158,16 +158,18 @@ u32 r600_dpm_get_vblank_time(struct radeon_device *rdev) | |||
158 | u32 line_time_us, vblank_lines; | 158 | u32 line_time_us, vblank_lines; |
159 | u32 vblank_time_us = 0xffffffff; /* if the displays are off, vblank time is max */ | 159 | u32 vblank_time_us = 0xffffffff; /* if the displays are off, vblank time is max */ |
160 | 160 | ||
161 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { | 161 | if (rdev->num_crtc && rdev->mode_info.mode_config_initialized) { |
162 | radeon_crtc = to_radeon_crtc(crtc); | 162 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { |
163 | if (crtc->enabled && radeon_crtc->enabled && radeon_crtc->hw_mode.clock) { | 163 | radeon_crtc = to_radeon_crtc(crtc); |
164 | line_time_us = (radeon_crtc->hw_mode.crtc_htotal * 1000) / | 164 | if (crtc->enabled && radeon_crtc->enabled && radeon_crtc->hw_mode.clock) { |
165 | radeon_crtc->hw_mode.clock; | 165 | line_time_us = (radeon_crtc->hw_mode.crtc_htotal * 1000) / |
166 | vblank_lines = radeon_crtc->hw_mode.crtc_vblank_end - | 166 | radeon_crtc->hw_mode.clock; |
167 | radeon_crtc->hw_mode.crtc_vdisplay + | 167 | vblank_lines = radeon_crtc->hw_mode.crtc_vblank_end - |
168 | (radeon_crtc->v_border * 2); | 168 | radeon_crtc->hw_mode.crtc_vdisplay + |
169 | vblank_time_us = vblank_lines * line_time_us; | 169 | (radeon_crtc->v_border * 2); |
170 | break; | 170 | vblank_time_us = vblank_lines * line_time_us; |
171 | break; | ||
172 | } | ||
171 | } | 173 | } |
172 | } | 174 | } |
173 | 175 | ||
@@ -181,14 +183,15 @@ u32 r600_dpm_get_vrefresh(struct radeon_device *rdev) | |||
181 | struct radeon_crtc *radeon_crtc; | 183 | struct radeon_crtc *radeon_crtc; |
182 | u32 vrefresh = 0; | 184 | u32 vrefresh = 0; |
183 | 185 | ||
184 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { | 186 | if (rdev->num_crtc && rdev->mode_info.mode_config_initialized) { |
185 | radeon_crtc = to_radeon_crtc(crtc); | 187 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { |
186 | if (crtc->enabled && radeon_crtc->enabled && radeon_crtc->hw_mode.clock) { | 188 | radeon_crtc = to_radeon_crtc(crtc); |
187 | vrefresh = radeon_crtc->hw_mode.vrefresh; | 189 | if (crtc->enabled && radeon_crtc->enabled && radeon_crtc->hw_mode.clock) { |
188 | break; | 190 | vrefresh = radeon_crtc->hw_mode.vrefresh; |
191 | break; | ||
192 | } | ||
189 | } | 193 | } |
190 | } | 194 | } |
191 | |||
192 | return vrefresh; | 195 | return vrefresh; |
193 | } | 196 | } |
194 | 197 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_atpx_handler.c b/drivers/gpu/drm/radeon/radeon_atpx_handler.c index dedea72f48c4..a9fb0d016d38 100644 --- a/drivers/gpu/drm/radeon/radeon_atpx_handler.c +++ b/drivers/gpu/drm/radeon/radeon_atpx_handler.c | |||
@@ -528,6 +528,13 @@ static bool radeon_atpx_detect(void) | |||
528 | has_atpx |= (radeon_atpx_pci_probe_handle(pdev) == true); | 528 | has_atpx |= (radeon_atpx_pci_probe_handle(pdev) == true); |
529 | } | 529 | } |
530 | 530 | ||
531 | /* some newer PX laptops mark the dGPU as a non-VGA display device */ | ||
532 | while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_OTHER << 8, pdev)) != NULL) { | ||
533 | vga_count++; | ||
534 | |||
535 | has_atpx |= (radeon_atpx_pci_probe_handle(pdev) == true); | ||
536 | } | ||
537 | |||
531 | if (has_atpx && vga_count == 2) { | 538 | if (has_atpx && vga_count == 2) { |
532 | acpi_get_name(radeon_atpx_priv.atpx.handle, ACPI_FULL_PATHNAME, &buffer); | 539 | acpi_get_name(radeon_atpx_priv.atpx.handle, ACPI_FULL_PATHNAME, &buffer); |
533 | printk(KERN_INFO "VGA switcheroo: detected switching method %s handle\n", | 540 | printk(KERN_INFO "VGA switcheroo: detected switching method %s handle\n", |
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c index 2f7cbb901fb1..8d99d5ee8014 100644 --- a/drivers/gpu/drm/radeon/radeon_display.c +++ b/drivers/gpu/drm/radeon/radeon_display.c | |||
@@ -840,6 +840,38 @@ static void avivo_reduce_ratio(unsigned *nom, unsigned *den, | |||
840 | } | 840 | } |
841 | 841 | ||
842 | /** | 842 | /** |
843 | * avivo_get_fb_ref_div - feedback and ref divider calculation | ||
844 | * | ||
845 | * @nom: nominator | ||
846 | * @den: denominator | ||
847 | * @post_div: post divider | ||
848 | * @fb_div_max: feedback divider maximum | ||
849 | * @ref_div_max: reference divider maximum | ||
850 | * @fb_div: resulting feedback divider | ||
851 | * @ref_div: resulting reference divider | ||
852 | * | ||
853 | * Calculate feedback and reference divider for a given post divider. Makes | ||
854 | * sure we stay within the limits. | ||
855 | */ | ||
856 | static void avivo_get_fb_ref_div(unsigned nom, unsigned den, unsigned post_div, | ||
857 | unsigned fb_div_max, unsigned ref_div_max, | ||
858 | unsigned *fb_div, unsigned *ref_div) | ||
859 | { | ||
860 | /* limit reference * post divider to a maximum */ | ||
861 | ref_div_max = min(210 / post_div, ref_div_max); | ||
862 | |||
863 | /* get matching reference and feedback divider */ | ||
864 | *ref_div = min(max(DIV_ROUND_CLOSEST(den, post_div), 1u), ref_div_max); | ||
865 | *fb_div = DIV_ROUND_CLOSEST(nom * *ref_div * post_div, den); | ||
866 | |||
867 | /* limit fb divider to its maximum */ | ||
868 | if (*fb_div > fb_div_max) { | ||
869 | *ref_div = DIV_ROUND_CLOSEST(*ref_div * fb_div_max, *fb_div); | ||
870 | *fb_div = fb_div_max; | ||
871 | } | ||
872 | } | ||
873 | |||
874 | /** | ||
843 | * radeon_compute_pll_avivo - compute PLL paramaters | 875 | * radeon_compute_pll_avivo - compute PLL paramaters |
844 | * | 876 | * |
845 | * @pll: information about the PLL | 877 | * @pll: information about the PLL |
@@ -860,6 +892,9 @@ void radeon_compute_pll_avivo(struct radeon_pll *pll, | |||
860 | u32 *ref_div_p, | 892 | u32 *ref_div_p, |
861 | u32 *post_div_p) | 893 | u32 *post_div_p) |
862 | { | 894 | { |
895 | unsigned target_clock = pll->flags & RADEON_PLL_USE_FRAC_FB_DIV ? | ||
896 | freq : freq / 10; | ||
897 | |||
863 | unsigned fb_div_min, fb_div_max, fb_div; | 898 | unsigned fb_div_min, fb_div_max, fb_div; |
864 | unsigned post_div_min, post_div_max, post_div; | 899 | unsigned post_div_min, post_div_max, post_div; |
865 | unsigned ref_div_min, ref_div_max, ref_div; | 900 | unsigned ref_div_min, ref_div_max, ref_div; |
@@ -880,14 +915,18 @@ void radeon_compute_pll_avivo(struct radeon_pll *pll, | |||
880 | ref_div_min = pll->reference_div; | 915 | ref_div_min = pll->reference_div; |
881 | else | 916 | else |
882 | ref_div_min = pll->min_ref_div; | 917 | ref_div_min = pll->min_ref_div; |
883 | ref_div_max = pll->max_ref_div; | 918 | |
919 | if (pll->flags & RADEON_PLL_USE_FRAC_FB_DIV && | ||
920 | pll->flags & RADEON_PLL_USE_REF_DIV) | ||
921 | ref_div_max = pll->reference_div; | ||
922 | else | ||
923 | ref_div_max = pll->max_ref_div; | ||
884 | 924 | ||
885 | /* determine allowed post divider range */ | 925 | /* determine allowed post divider range */ |
886 | if (pll->flags & RADEON_PLL_USE_POST_DIV) { | 926 | if (pll->flags & RADEON_PLL_USE_POST_DIV) { |
887 | post_div_min = pll->post_div; | 927 | post_div_min = pll->post_div; |
888 | post_div_max = pll->post_div; | 928 | post_div_max = pll->post_div; |
889 | } else { | 929 | } else { |
890 | unsigned target_clock = freq / 10; | ||
891 | unsigned vco_min, vco_max; | 930 | unsigned vco_min, vco_max; |
892 | 931 | ||
893 | if (pll->flags & RADEON_PLL_IS_LCD) { | 932 | if (pll->flags & RADEON_PLL_IS_LCD) { |
@@ -898,6 +937,11 @@ void radeon_compute_pll_avivo(struct radeon_pll *pll, | |||
898 | vco_max = pll->pll_out_max; | 937 | vco_max = pll->pll_out_max; |
899 | } | 938 | } |
900 | 939 | ||
940 | if (pll->flags & RADEON_PLL_USE_FRAC_FB_DIV) { | ||
941 | vco_min *= 10; | ||
942 | vco_max *= 10; | ||
943 | } | ||
944 | |||
901 | post_div_min = vco_min / target_clock; | 945 | post_div_min = vco_min / target_clock; |
902 | if ((target_clock * post_div_min) < vco_min) | 946 | if ((target_clock * post_div_min) < vco_min) |
903 | ++post_div_min; | 947 | ++post_div_min; |
@@ -912,7 +956,7 @@ void radeon_compute_pll_avivo(struct radeon_pll *pll, | |||
912 | } | 956 | } |
913 | 957 | ||
914 | /* represent the searched ratio as fractional number */ | 958 | /* represent the searched ratio as fractional number */ |
915 | nom = pll->flags & RADEON_PLL_USE_FRAC_FB_DIV ? freq : freq / 10; | 959 | nom = target_clock; |
916 | den = pll->reference_freq; | 960 | den = pll->reference_freq; |
917 | 961 | ||
918 | /* reduce the numbers to a simpler ratio */ | 962 | /* reduce the numbers to a simpler ratio */ |
@@ -926,7 +970,12 @@ void radeon_compute_pll_avivo(struct radeon_pll *pll, | |||
926 | diff_best = ~0; | 970 | diff_best = ~0; |
927 | 971 | ||
928 | for (post_div = post_div_min; post_div <= post_div_max; ++post_div) { | 972 | for (post_div = post_div_min; post_div <= post_div_max; ++post_div) { |
929 | unsigned diff = abs(den - den / post_div * post_div); | 973 | unsigned diff; |
974 | avivo_get_fb_ref_div(nom, den, post_div, fb_div_max, | ||
975 | ref_div_max, &fb_div, &ref_div); | ||
976 | diff = abs(target_clock - (pll->reference_freq * fb_div) / | ||
977 | (ref_div * post_div)); | ||
978 | |||
930 | if (diff < diff_best || (diff == diff_best && | 979 | if (diff < diff_best || (diff == diff_best && |
931 | !(pll->flags & RADEON_PLL_PREFER_MINM_OVER_MAXP))) { | 980 | !(pll->flags & RADEON_PLL_PREFER_MINM_OVER_MAXP))) { |
932 | 981 | ||
@@ -936,28 +985,9 @@ void radeon_compute_pll_avivo(struct radeon_pll *pll, | |||
936 | } | 985 | } |
937 | post_div = post_div_best; | 986 | post_div = post_div_best; |
938 | 987 | ||
939 | /* limit reference * post divider to a maximum */ | 988 | /* get the feedback and reference divider for the optimal value */ |
940 | ref_div_max = min(210 / post_div, ref_div_max); | 989 | avivo_get_fb_ref_div(nom, den, post_div, fb_div_max, ref_div_max, |
941 | 990 | &fb_div, &ref_div); | |
942 | /* get matching reference and feedback divider */ | ||
943 | ref_div = max(DIV_ROUND_CLOSEST(den, post_div), 1u); | ||
944 | fb_div = DIV_ROUND_CLOSEST(nom * ref_div * post_div, den); | ||
945 | |||
946 | /* we're almost done, but reference and feedback | ||
947 | divider might be to large now */ | ||
948 | |||
949 | nom = fb_div; | ||
950 | den = ref_div; | ||
951 | |||
952 | if (fb_div > fb_div_max) { | ||
953 | ref_div = DIV_ROUND_CLOSEST(den * fb_div_max, nom); | ||
954 | fb_div = fb_div_max; | ||
955 | } | ||
956 | |||
957 | if (ref_div > ref_div_max) { | ||
958 | ref_div = ref_div_max; | ||
959 | fb_div = DIV_ROUND_CLOSEST(nom * ref_div_max, den); | ||
960 | } | ||
961 | 991 | ||
962 | /* reduce the numbers to a simpler ratio once more */ | 992 | /* reduce the numbers to a simpler ratio once more */ |
963 | /* this also makes sure that the reference divider is large enough */ | 993 | /* this also makes sure that the reference divider is large enough */ |
@@ -979,7 +1009,7 @@ void radeon_compute_pll_avivo(struct radeon_pll *pll, | |||
979 | *post_div_p = post_div; | 1009 | *post_div_p = post_div; |
980 | 1010 | ||
981 | DRM_DEBUG_KMS("%d - %d, pll dividers - fb: %d.%d ref: %d, post %d\n", | 1011 | DRM_DEBUG_KMS("%d - %d, pll dividers - fb: %d.%d ref: %d, post %d\n", |
982 | freq, *dot_clock_p, *fb_div_p, *frac_fb_div_p, | 1012 | freq, *dot_clock_p * 10, *fb_div_p, *frac_fb_div_p, |
983 | ref_div, post_div); | 1013 | ref_div, post_div); |
984 | } | 1014 | } |
985 | 1015 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c index fb3d13f693dd..0cc47f12d995 100644 --- a/drivers/gpu/drm/radeon/radeon_kms.c +++ b/drivers/gpu/drm/radeon/radeon_kms.c | |||
@@ -107,11 +107,9 @@ int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags) | |||
107 | flags |= RADEON_IS_PCI; | 107 | flags |= RADEON_IS_PCI; |
108 | } | 108 | } |
109 | 109 | ||
110 | if (radeon_runtime_pm == 1) | 110 | if ((radeon_runtime_pm != 0) && |
111 | flags |= RADEON_IS_PX; | 111 | radeon_has_atpx() && |
112 | else if ((radeon_runtime_pm == -1) && | 112 | ((flags & RADEON_IS_IGP) == 0)) |
113 | radeon_has_atpx() && | ||
114 | ((flags & RADEON_IS_IGP) == 0)) | ||
115 | flags |= RADEON_IS_PX; | 113 | flags |= RADEON_IS_PX; |
116 | 114 | ||
117 | /* radeon_device_init should report only fatal error | 115 | /* radeon_device_init should report only fatal error |
diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c index ee738a524639..6fac8efe8340 100644 --- a/drivers/gpu/drm/radeon/radeon_pm.c +++ b/drivers/gpu/drm/radeon/radeon_pm.c | |||
@@ -603,7 +603,6 @@ static const struct attribute_group *hwmon_groups[] = { | |||
603 | static int radeon_hwmon_init(struct radeon_device *rdev) | 603 | static int radeon_hwmon_init(struct radeon_device *rdev) |
604 | { | 604 | { |
605 | int err = 0; | 605 | int err = 0; |
606 | struct device *hwmon_dev; | ||
607 | 606 | ||
608 | switch (rdev->pm.int_thermal_type) { | 607 | switch (rdev->pm.int_thermal_type) { |
609 | case THERMAL_TYPE_RV6XX: | 608 | case THERMAL_TYPE_RV6XX: |
@@ -616,11 +615,11 @@ static int radeon_hwmon_init(struct radeon_device *rdev) | |||
616 | case THERMAL_TYPE_KV: | 615 | case THERMAL_TYPE_KV: |
617 | if (rdev->asic->pm.get_temperature == NULL) | 616 | if (rdev->asic->pm.get_temperature == NULL) |
618 | return err; | 617 | return err; |
619 | hwmon_dev = hwmon_device_register_with_groups(rdev->dev, | 618 | rdev->pm.int_hwmon_dev = hwmon_device_register_with_groups(rdev->dev, |
620 | "radeon", rdev, | 619 | "radeon", rdev, |
621 | hwmon_groups); | 620 | hwmon_groups); |
622 | if (IS_ERR(hwmon_dev)) { | 621 | if (IS_ERR(rdev->pm.int_hwmon_dev)) { |
623 | err = PTR_ERR(hwmon_dev); | 622 | err = PTR_ERR(rdev->pm.int_hwmon_dev); |
624 | dev_err(rdev->dev, | 623 | dev_err(rdev->dev, |
625 | "Unable to register hwmon device: %d\n", err); | 624 | "Unable to register hwmon device: %d\n", err); |
626 | } | 625 | } |
@@ -632,6 +631,12 @@ static int radeon_hwmon_init(struct radeon_device *rdev) | |||
632 | return err; | 631 | return err; |
633 | } | 632 | } |
634 | 633 | ||
634 | static void radeon_hwmon_fini(struct radeon_device *rdev) | ||
635 | { | ||
636 | if (rdev->pm.int_hwmon_dev) | ||
637 | hwmon_device_unregister(rdev->pm.int_hwmon_dev); | ||
638 | } | ||
639 | |||
635 | static void radeon_dpm_thermal_work_handler(struct work_struct *work) | 640 | static void radeon_dpm_thermal_work_handler(struct work_struct *work) |
636 | { | 641 | { |
637 | struct radeon_device *rdev = | 642 | struct radeon_device *rdev = |
@@ -1257,6 +1262,7 @@ int radeon_pm_init(struct radeon_device *rdev) | |||
1257 | case CHIP_RV670: | 1262 | case CHIP_RV670: |
1258 | case CHIP_RS780: | 1263 | case CHIP_RS780: |
1259 | case CHIP_RS880: | 1264 | case CHIP_RS880: |
1265 | case CHIP_RV770: | ||
1260 | case CHIP_BARTS: | 1266 | case CHIP_BARTS: |
1261 | case CHIP_TURKS: | 1267 | case CHIP_TURKS: |
1262 | case CHIP_CAICOS: | 1268 | case CHIP_CAICOS: |
@@ -1273,7 +1279,6 @@ int radeon_pm_init(struct radeon_device *rdev) | |||
1273 | else | 1279 | else |
1274 | rdev->pm.pm_method = PM_METHOD_PROFILE; | 1280 | rdev->pm.pm_method = PM_METHOD_PROFILE; |
1275 | break; | 1281 | break; |
1276 | case CHIP_RV770: | ||
1277 | case CHIP_RV730: | 1282 | case CHIP_RV730: |
1278 | case CHIP_RV710: | 1283 | case CHIP_RV710: |
1279 | case CHIP_RV740: | 1284 | case CHIP_RV740: |
@@ -1353,6 +1358,8 @@ static void radeon_pm_fini_old(struct radeon_device *rdev) | |||
1353 | device_remove_file(rdev->dev, &dev_attr_power_method); | 1358 | device_remove_file(rdev->dev, &dev_attr_power_method); |
1354 | } | 1359 | } |
1355 | 1360 | ||
1361 | radeon_hwmon_fini(rdev); | ||
1362 | |||
1356 | if (rdev->pm.power_state) | 1363 | if (rdev->pm.power_state) |
1357 | kfree(rdev->pm.power_state); | 1364 | kfree(rdev->pm.power_state); |
1358 | } | 1365 | } |
@@ -1372,6 +1379,8 @@ static void radeon_pm_fini_dpm(struct radeon_device *rdev) | |||
1372 | } | 1379 | } |
1373 | radeon_dpm_fini(rdev); | 1380 | radeon_dpm_fini(rdev); |
1374 | 1381 | ||
1382 | radeon_hwmon_fini(rdev); | ||
1383 | |||
1375 | if (rdev->pm.power_state) | 1384 | if (rdev->pm.power_state) |
1376 | kfree(rdev->pm.power_state); | 1385 | kfree(rdev->pm.power_state); |
1377 | } | 1386 | } |
@@ -1397,12 +1406,14 @@ static void radeon_pm_compute_clocks_old(struct radeon_device *rdev) | |||
1397 | 1406 | ||
1398 | rdev->pm.active_crtcs = 0; | 1407 | rdev->pm.active_crtcs = 0; |
1399 | rdev->pm.active_crtc_count = 0; | 1408 | rdev->pm.active_crtc_count = 0; |
1400 | list_for_each_entry(crtc, | 1409 | if (rdev->num_crtc && rdev->mode_info.mode_config_initialized) { |
1401 | &ddev->mode_config.crtc_list, head) { | 1410 | list_for_each_entry(crtc, |
1402 | radeon_crtc = to_radeon_crtc(crtc); | 1411 | &ddev->mode_config.crtc_list, head) { |
1403 | if (radeon_crtc->enabled) { | 1412 | radeon_crtc = to_radeon_crtc(crtc); |
1404 | rdev->pm.active_crtcs |= (1 << radeon_crtc->crtc_id); | 1413 | if (radeon_crtc->enabled) { |
1405 | rdev->pm.active_crtc_count++; | 1414 | rdev->pm.active_crtcs |= (1 << radeon_crtc->crtc_id); |
1415 | rdev->pm.active_crtc_count++; | ||
1416 | } | ||
1406 | } | 1417 | } |
1407 | } | 1418 | } |
1408 | 1419 | ||
@@ -1469,12 +1480,14 @@ static void radeon_pm_compute_clocks_dpm(struct radeon_device *rdev) | |||
1469 | /* update active crtc counts */ | 1480 | /* update active crtc counts */ |
1470 | rdev->pm.dpm.new_active_crtcs = 0; | 1481 | rdev->pm.dpm.new_active_crtcs = 0; |
1471 | rdev->pm.dpm.new_active_crtc_count = 0; | 1482 | rdev->pm.dpm.new_active_crtc_count = 0; |
1472 | list_for_each_entry(crtc, | 1483 | if (rdev->num_crtc && rdev->mode_info.mode_config_initialized) { |
1473 | &ddev->mode_config.crtc_list, head) { | 1484 | list_for_each_entry(crtc, |
1474 | radeon_crtc = to_radeon_crtc(crtc); | 1485 | &ddev->mode_config.crtc_list, head) { |
1475 | if (crtc->enabled) { | 1486 | radeon_crtc = to_radeon_crtc(crtc); |
1476 | rdev->pm.dpm.new_active_crtcs |= (1 << radeon_crtc->crtc_id); | 1487 | if (crtc->enabled) { |
1477 | rdev->pm.dpm.new_active_crtc_count++; | 1488 | rdev->pm.dpm.new_active_crtcs |= (1 << radeon_crtc->crtc_id); |
1489 | rdev->pm.dpm.new_active_crtc_count++; | ||
1490 | } | ||
1478 | } | 1491 | } |
1479 | } | 1492 | } |
1480 | 1493 | ||
diff --git a/drivers/gpu/drm/tegra/dc.c b/drivers/gpu/drm/tegra/dc.c index 36c717af6cf9..edb871d7d395 100644 --- a/drivers/gpu/drm/tegra/dc.c +++ b/drivers/gpu/drm/tegra/dc.c | |||
@@ -312,7 +312,7 @@ static void tegra_crtc_disable(struct drm_crtc *crtc) | |||
312 | struct drm_device *drm = crtc->dev; | 312 | struct drm_device *drm = crtc->dev; |
313 | struct drm_plane *plane; | 313 | struct drm_plane *plane; |
314 | 314 | ||
315 | list_for_each_entry(plane, &drm->mode_config.plane_list, head) { | 315 | drm_for_each_legacy_plane(plane, &drm->mode_config.plane_list) { |
316 | if (plane->crtc == crtc) { | 316 | if (plane->crtc == crtc) { |
317 | tegra_plane_disable(plane); | 317 | tegra_plane_disable(plane); |
318 | plane->crtc = NULL; | 318 | plane->crtc = NULL; |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c index 931490b9cfed..87df0b3674fd 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c | |||
@@ -1214,14 +1214,36 @@ static int vmw_cmd_dma(struct vmw_private *dev_priv, | |||
1214 | SVGA3dCmdSurfaceDMA dma; | 1214 | SVGA3dCmdSurfaceDMA dma; |
1215 | } *cmd; | 1215 | } *cmd; |
1216 | int ret; | 1216 | int ret; |
1217 | SVGA3dCmdSurfaceDMASuffix *suffix; | ||
1218 | uint32_t bo_size; | ||
1217 | 1219 | ||
1218 | cmd = container_of(header, struct vmw_dma_cmd, header); | 1220 | cmd = container_of(header, struct vmw_dma_cmd, header); |
1221 | suffix = (SVGA3dCmdSurfaceDMASuffix *)((unsigned long) &cmd->dma + | ||
1222 | header->size - sizeof(*suffix)); | ||
1223 | |||
1224 | /* Make sure device and verifier stays in sync. */ | ||
1225 | if (unlikely(suffix->suffixSize != sizeof(*suffix))) { | ||
1226 | DRM_ERROR("Invalid DMA suffix size.\n"); | ||
1227 | return -EINVAL; | ||
1228 | } | ||
1229 | |||
1219 | ret = vmw_translate_guest_ptr(dev_priv, sw_context, | 1230 | ret = vmw_translate_guest_ptr(dev_priv, sw_context, |
1220 | &cmd->dma.guest.ptr, | 1231 | &cmd->dma.guest.ptr, |
1221 | &vmw_bo); | 1232 | &vmw_bo); |
1222 | if (unlikely(ret != 0)) | 1233 | if (unlikely(ret != 0)) |
1223 | return ret; | 1234 | return ret; |
1224 | 1235 | ||
1236 | /* Make sure DMA doesn't cross BO boundaries. */ | ||
1237 | bo_size = vmw_bo->base.num_pages * PAGE_SIZE; | ||
1238 | if (unlikely(cmd->dma.guest.ptr.offset > bo_size)) { | ||
1239 | DRM_ERROR("Invalid DMA offset.\n"); | ||
1240 | return -EINVAL; | ||
1241 | } | ||
1242 | |||
1243 | bo_size -= cmd->dma.guest.ptr.offset; | ||
1244 | if (unlikely(suffix->maximumOffset > bo_size)) | ||
1245 | suffix->maximumOffset = bo_size; | ||
1246 | |||
1225 | ret = vmw_cmd_res_check(dev_priv, sw_context, vmw_res_surface, | 1247 | ret = vmw_cmd_res_check(dev_priv, sw_context, vmw_res_surface, |
1226 | user_surface_converter, &cmd->dma.host.sid, | 1248 | user_surface_converter, &cmd->dma.host.sid, |
1227 | NULL); | 1249 | NULL); |
diff --git a/drivers/hwmon/coretemp.c b/drivers/hwmon/coretemp.c index 6d02e3b06375..d76f0b70c6e0 100644 --- a/drivers/hwmon/coretemp.c +++ b/drivers/hwmon/coretemp.c | |||
@@ -365,12 +365,12 @@ static int get_tjmax(struct cpuinfo_x86 *c, u32 id, struct device *dev) | |||
365 | if (cpu_has_tjmax(c)) | 365 | if (cpu_has_tjmax(c)) |
366 | dev_warn(dev, "Unable to read TjMax from CPU %u\n", id); | 366 | dev_warn(dev, "Unable to read TjMax from CPU %u\n", id); |
367 | } else { | 367 | } else { |
368 | val = (eax >> 16) & 0x7f; | 368 | val = (eax >> 16) & 0xff; |
369 | /* | 369 | /* |
370 | * If the TjMax is not plausible, an assumption | 370 | * If the TjMax is not plausible, an assumption |
371 | * will be used | 371 | * will be used |
372 | */ | 372 | */ |
373 | if (val >= 85) { | 373 | if (val) { |
374 | dev_dbg(dev, "TjMax is %d degrees C\n", val); | 374 | dev_dbg(dev, "TjMax is %d degrees C\n", val); |
375 | return val * 1000; | 375 | return val * 1000; |
376 | } | 376 | } |
diff --git a/drivers/hwmon/ltc2945.c b/drivers/hwmon/ltc2945.c index c104cc32989d..c9cddf5f056b 100644 --- a/drivers/hwmon/ltc2945.c +++ b/drivers/hwmon/ltc2945.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * Driver for Linear Technology LTC2945 I2C Power Monitor | 2 | * Driver for Linear Technology LTC2945 I2C Power Monitor |
3 | * | 3 | * |
4 | * Copyright (c) 2014 Guenter Roeck | 4 | * Copyright (c) 2014 Guenter Roeck |
@@ -314,8 +314,8 @@ static ssize_t ltc2945_reset_history(struct device *dev, | |||
314 | reg = LTC2945_MAX_ADIN_H; | 314 | reg = LTC2945_MAX_ADIN_H; |
315 | break; | 315 | break; |
316 | default: | 316 | default: |
317 | BUG(); | 317 | WARN_ONCE(1, "Bad register: 0x%x\n", reg); |
318 | break; | 318 | return -EINVAL; |
319 | } | 319 | } |
320 | /* Reset maximum */ | 320 | /* Reset maximum */ |
321 | ret = regmap_bulk_write(regmap, reg, buf_max, num_regs); | 321 | ret = regmap_bulk_write(regmap, reg, buf_max, num_regs); |
diff --git a/drivers/hwmon/vexpress.c b/drivers/hwmon/vexpress.c index d867e6bb2be1..8242b75d96c8 100644 --- a/drivers/hwmon/vexpress.c +++ b/drivers/hwmon/vexpress.c | |||
@@ -27,15 +27,15 @@ | |||
27 | struct vexpress_hwmon_data { | 27 | struct vexpress_hwmon_data { |
28 | struct device *hwmon_dev; | 28 | struct device *hwmon_dev; |
29 | struct vexpress_config_func *func; | 29 | struct vexpress_config_func *func; |
30 | const char *name; | ||
30 | }; | 31 | }; |
31 | 32 | ||
32 | static ssize_t vexpress_hwmon_name_show(struct device *dev, | 33 | static ssize_t vexpress_hwmon_name_show(struct device *dev, |
33 | struct device_attribute *dev_attr, char *buffer) | 34 | struct device_attribute *dev_attr, char *buffer) |
34 | { | 35 | { |
35 | const char *compatible = of_get_property(dev->of_node, "compatible", | 36 | struct vexpress_hwmon_data *data = dev_get_drvdata(dev); |
36 | NULL); | ||
37 | 37 | ||
38 | return sprintf(buffer, "%s\n", compatible); | 38 | return sprintf(buffer, "%s\n", data->name); |
39 | } | 39 | } |
40 | 40 | ||
41 | static ssize_t vexpress_hwmon_label_show(struct device *dev, | 41 | static ssize_t vexpress_hwmon_label_show(struct device *dev, |
@@ -43,9 +43,6 @@ static ssize_t vexpress_hwmon_label_show(struct device *dev, | |||
43 | { | 43 | { |
44 | const char *label = of_get_property(dev->of_node, "label", NULL); | 44 | const char *label = of_get_property(dev->of_node, "label", NULL); |
45 | 45 | ||
46 | if (!label) | ||
47 | return -ENOENT; | ||
48 | |||
49 | return snprintf(buffer, PAGE_SIZE, "%s\n", label); | 46 | return snprintf(buffer, PAGE_SIZE, "%s\n", label); |
50 | } | 47 | } |
51 | 48 | ||
@@ -84,6 +81,20 @@ static ssize_t vexpress_hwmon_u64_show(struct device *dev, | |||
84 | to_sensor_dev_attr(dev_attr)->index)); | 81 | to_sensor_dev_attr(dev_attr)->index)); |
85 | } | 82 | } |
86 | 83 | ||
84 | static umode_t vexpress_hwmon_attr_is_visible(struct kobject *kobj, | ||
85 | struct attribute *attr, int index) | ||
86 | { | ||
87 | struct device *dev = kobj_to_dev(kobj); | ||
88 | struct device_attribute *dev_attr = container_of(attr, | ||
89 | struct device_attribute, attr); | ||
90 | |||
91 | if (dev_attr->show == vexpress_hwmon_label_show && | ||
92 | !of_get_property(dev->of_node, "label", NULL)) | ||
93 | return 0; | ||
94 | |||
95 | return attr->mode; | ||
96 | } | ||
97 | |||
87 | static DEVICE_ATTR(name, S_IRUGO, vexpress_hwmon_name_show, NULL); | 98 | static DEVICE_ATTR(name, S_IRUGO, vexpress_hwmon_name_show, NULL); |
88 | 99 | ||
89 | #define VEXPRESS_HWMON_ATTRS(_name, _label_attr, _input_attr) \ | 100 | #define VEXPRESS_HWMON_ATTRS(_name, _label_attr, _input_attr) \ |
@@ -94,14 +105,27 @@ struct attribute *vexpress_hwmon_attrs_##_name[] = { \ | |||
94 | NULL \ | 105 | NULL \ |
95 | } | 106 | } |
96 | 107 | ||
108 | struct vexpress_hwmon_type { | ||
109 | const char *name; | ||
110 | const struct attribute_group **attr_groups; | ||
111 | }; | ||
112 | |||
97 | #if !defined(CONFIG_REGULATOR_VEXPRESS) | 113 | #if !defined(CONFIG_REGULATOR_VEXPRESS) |
98 | static DEVICE_ATTR(in1_label, S_IRUGO, vexpress_hwmon_label_show, NULL); | 114 | static DEVICE_ATTR(in1_label, S_IRUGO, vexpress_hwmon_label_show, NULL); |
99 | static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO, vexpress_hwmon_u32_show, | 115 | static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO, vexpress_hwmon_u32_show, |
100 | NULL, 1000); | 116 | NULL, 1000); |
101 | static VEXPRESS_HWMON_ATTRS(volt, in1_label, in1_input); | 117 | static VEXPRESS_HWMON_ATTRS(volt, in1_label, in1_input); |
102 | static struct attribute_group vexpress_hwmon_group_volt = { | 118 | static struct attribute_group vexpress_hwmon_group_volt = { |
119 | .is_visible = vexpress_hwmon_attr_is_visible, | ||
103 | .attrs = vexpress_hwmon_attrs_volt, | 120 | .attrs = vexpress_hwmon_attrs_volt, |
104 | }; | 121 | }; |
122 | static struct vexpress_hwmon_type vexpress_hwmon_volt = { | ||
123 | .name = "vexpress_volt", | ||
124 | .attr_groups = (const struct attribute_group *[]) { | ||
125 | &vexpress_hwmon_group_volt, | ||
126 | NULL, | ||
127 | }, | ||
128 | }; | ||
105 | #endif | 129 | #endif |
106 | 130 | ||
107 | static DEVICE_ATTR(curr1_label, S_IRUGO, vexpress_hwmon_label_show, NULL); | 131 | static DEVICE_ATTR(curr1_label, S_IRUGO, vexpress_hwmon_label_show, NULL); |
@@ -109,52 +133,84 @@ static SENSOR_DEVICE_ATTR(curr1_input, S_IRUGO, vexpress_hwmon_u32_show, | |||
109 | NULL, 1000); | 133 | NULL, 1000); |
110 | static VEXPRESS_HWMON_ATTRS(amp, curr1_label, curr1_input); | 134 | static VEXPRESS_HWMON_ATTRS(amp, curr1_label, curr1_input); |
111 | static struct attribute_group vexpress_hwmon_group_amp = { | 135 | static struct attribute_group vexpress_hwmon_group_amp = { |
136 | .is_visible = vexpress_hwmon_attr_is_visible, | ||
112 | .attrs = vexpress_hwmon_attrs_amp, | 137 | .attrs = vexpress_hwmon_attrs_amp, |
113 | }; | 138 | }; |
139 | static struct vexpress_hwmon_type vexpress_hwmon_amp = { | ||
140 | .name = "vexpress_amp", | ||
141 | .attr_groups = (const struct attribute_group *[]) { | ||
142 | &vexpress_hwmon_group_amp, | ||
143 | NULL | ||
144 | }, | ||
145 | }; | ||
114 | 146 | ||
115 | static DEVICE_ATTR(temp1_label, S_IRUGO, vexpress_hwmon_label_show, NULL); | 147 | static DEVICE_ATTR(temp1_label, S_IRUGO, vexpress_hwmon_label_show, NULL); |
116 | static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, vexpress_hwmon_u32_show, | 148 | static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, vexpress_hwmon_u32_show, |
117 | NULL, 1000); | 149 | NULL, 1000); |
118 | static VEXPRESS_HWMON_ATTRS(temp, temp1_label, temp1_input); | 150 | static VEXPRESS_HWMON_ATTRS(temp, temp1_label, temp1_input); |
119 | static struct attribute_group vexpress_hwmon_group_temp = { | 151 | static struct attribute_group vexpress_hwmon_group_temp = { |
152 | .is_visible = vexpress_hwmon_attr_is_visible, | ||
120 | .attrs = vexpress_hwmon_attrs_temp, | 153 | .attrs = vexpress_hwmon_attrs_temp, |
121 | }; | 154 | }; |
155 | static struct vexpress_hwmon_type vexpress_hwmon_temp = { | ||
156 | .name = "vexpress_temp", | ||
157 | .attr_groups = (const struct attribute_group *[]) { | ||
158 | &vexpress_hwmon_group_temp, | ||
159 | NULL | ||
160 | }, | ||
161 | }; | ||
122 | 162 | ||
123 | static DEVICE_ATTR(power1_label, S_IRUGO, vexpress_hwmon_label_show, NULL); | 163 | static DEVICE_ATTR(power1_label, S_IRUGO, vexpress_hwmon_label_show, NULL); |
124 | static SENSOR_DEVICE_ATTR(power1_input, S_IRUGO, vexpress_hwmon_u32_show, | 164 | static SENSOR_DEVICE_ATTR(power1_input, S_IRUGO, vexpress_hwmon_u32_show, |
125 | NULL, 1); | 165 | NULL, 1); |
126 | static VEXPRESS_HWMON_ATTRS(power, power1_label, power1_input); | 166 | static VEXPRESS_HWMON_ATTRS(power, power1_label, power1_input); |
127 | static struct attribute_group vexpress_hwmon_group_power = { | 167 | static struct attribute_group vexpress_hwmon_group_power = { |
168 | .is_visible = vexpress_hwmon_attr_is_visible, | ||
128 | .attrs = vexpress_hwmon_attrs_power, | 169 | .attrs = vexpress_hwmon_attrs_power, |
129 | }; | 170 | }; |
171 | static struct vexpress_hwmon_type vexpress_hwmon_power = { | ||
172 | .name = "vexpress_power", | ||
173 | .attr_groups = (const struct attribute_group *[]) { | ||
174 | &vexpress_hwmon_group_power, | ||
175 | NULL | ||
176 | }, | ||
177 | }; | ||
130 | 178 | ||
131 | static DEVICE_ATTR(energy1_label, S_IRUGO, vexpress_hwmon_label_show, NULL); | 179 | static DEVICE_ATTR(energy1_label, S_IRUGO, vexpress_hwmon_label_show, NULL); |
132 | static SENSOR_DEVICE_ATTR(energy1_input, S_IRUGO, vexpress_hwmon_u64_show, | 180 | static SENSOR_DEVICE_ATTR(energy1_input, S_IRUGO, vexpress_hwmon_u64_show, |
133 | NULL, 1); | 181 | NULL, 1); |
134 | static VEXPRESS_HWMON_ATTRS(energy, energy1_label, energy1_input); | 182 | static VEXPRESS_HWMON_ATTRS(energy, energy1_label, energy1_input); |
135 | static struct attribute_group vexpress_hwmon_group_energy = { | 183 | static struct attribute_group vexpress_hwmon_group_energy = { |
184 | .is_visible = vexpress_hwmon_attr_is_visible, | ||
136 | .attrs = vexpress_hwmon_attrs_energy, | 185 | .attrs = vexpress_hwmon_attrs_energy, |
137 | }; | 186 | }; |
187 | static struct vexpress_hwmon_type vexpress_hwmon_energy = { | ||
188 | .name = "vexpress_energy", | ||
189 | .attr_groups = (const struct attribute_group *[]) { | ||
190 | &vexpress_hwmon_group_energy, | ||
191 | NULL | ||
192 | }, | ||
193 | }; | ||
138 | 194 | ||
139 | static struct of_device_id vexpress_hwmon_of_match[] = { | 195 | static struct of_device_id vexpress_hwmon_of_match[] = { |
140 | #if !defined(CONFIG_REGULATOR_VEXPRESS) | 196 | #if !defined(CONFIG_REGULATOR_VEXPRESS) |
141 | { | 197 | { |
142 | .compatible = "arm,vexpress-volt", | 198 | .compatible = "arm,vexpress-volt", |
143 | .data = &vexpress_hwmon_group_volt, | 199 | .data = &vexpress_hwmon_volt, |
144 | }, | 200 | }, |
145 | #endif | 201 | #endif |
146 | { | 202 | { |
147 | .compatible = "arm,vexpress-amp", | 203 | .compatible = "arm,vexpress-amp", |
148 | .data = &vexpress_hwmon_group_amp, | 204 | .data = &vexpress_hwmon_amp, |
149 | }, { | 205 | }, { |
150 | .compatible = "arm,vexpress-temp", | 206 | .compatible = "arm,vexpress-temp", |
151 | .data = &vexpress_hwmon_group_temp, | 207 | .data = &vexpress_hwmon_temp, |
152 | }, { | 208 | }, { |
153 | .compatible = "arm,vexpress-power", | 209 | .compatible = "arm,vexpress-power", |
154 | .data = &vexpress_hwmon_group_power, | 210 | .data = &vexpress_hwmon_power, |
155 | }, { | 211 | }, { |
156 | .compatible = "arm,vexpress-energy", | 212 | .compatible = "arm,vexpress-energy", |
157 | .data = &vexpress_hwmon_group_energy, | 213 | .data = &vexpress_hwmon_energy, |
158 | }, | 214 | }, |
159 | {} | 215 | {} |
160 | }; | 216 | }; |
@@ -165,6 +221,7 @@ static int vexpress_hwmon_probe(struct platform_device *pdev) | |||
165 | int err; | 221 | int err; |
166 | const struct of_device_id *match; | 222 | const struct of_device_id *match; |
167 | struct vexpress_hwmon_data *data; | 223 | struct vexpress_hwmon_data *data; |
224 | const struct vexpress_hwmon_type *type; | ||
168 | 225 | ||
169 | data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); | 226 | data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); |
170 | if (!data) | 227 | if (!data) |
@@ -174,12 +231,14 @@ static int vexpress_hwmon_probe(struct platform_device *pdev) | |||
174 | match = of_match_device(vexpress_hwmon_of_match, &pdev->dev); | 231 | match = of_match_device(vexpress_hwmon_of_match, &pdev->dev); |
175 | if (!match) | 232 | if (!match) |
176 | return -ENODEV; | 233 | return -ENODEV; |
234 | type = match->data; | ||
235 | data->name = type->name; | ||
177 | 236 | ||
178 | data->func = vexpress_config_func_get_by_dev(&pdev->dev); | 237 | data->func = vexpress_config_func_get_by_dev(&pdev->dev); |
179 | if (!data->func) | 238 | if (!data->func) |
180 | return -ENODEV; | 239 | return -ENODEV; |
181 | 240 | ||
182 | err = sysfs_create_group(&pdev->dev.kobj, match->data); | 241 | err = sysfs_create_groups(&pdev->dev.kobj, type->attr_groups); |
183 | if (err) | 242 | if (err) |
184 | goto error; | 243 | goto error; |
185 | 244 | ||
diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c index a43220c2e3d9..4d140bbbe100 100644 --- a/drivers/idle/intel_idle.c +++ b/drivers/idle/intel_idle.c | |||
@@ -750,9 +750,10 @@ void intel_idle_state_table_update(void) | |||
750 | if (package_num + 1 > num_sockets) { | 750 | if (package_num + 1 > num_sockets) { |
751 | num_sockets = package_num + 1; | 751 | num_sockets = package_num + 1; |
752 | 752 | ||
753 | if (num_sockets > 4) | 753 | if (num_sockets > 4) { |
754 | cpuidle_state_table = ivt_cstates_8s; | 754 | cpuidle_state_table = ivt_cstates_8s; |
755 | return; | 755 | return; |
756 | } | ||
756 | } | 757 | } |
757 | } | 758 | } |
758 | 759 | ||
diff --git a/drivers/iio/adc/at91_adc.c b/drivers/iio/adc/at91_adc.c index 5b1aa027c034..89777ed9abd8 100644 --- a/drivers/iio/adc/at91_adc.c +++ b/drivers/iio/adc/at91_adc.c | |||
@@ -765,14 +765,17 @@ static int at91_adc_probe_pdata(struct at91_adc_state *st, | |||
765 | if (!pdata) | 765 | if (!pdata) |
766 | return -EINVAL; | 766 | return -EINVAL; |
767 | 767 | ||
768 | st->caps = (struct at91_adc_caps *) | ||
769 | platform_get_device_id(pdev)->driver_data; | ||
770 | |||
768 | st->use_external = pdata->use_external_triggers; | 771 | st->use_external = pdata->use_external_triggers; |
769 | st->vref_mv = pdata->vref; | 772 | st->vref_mv = pdata->vref; |
770 | st->channels_mask = pdata->channels_used; | 773 | st->channels_mask = pdata->channels_used; |
771 | st->num_channels = pdata->num_channels; | 774 | st->num_channels = st->caps->num_channels; |
772 | st->startup_time = pdata->startup_time; | 775 | st->startup_time = pdata->startup_time; |
773 | st->trigger_number = pdata->trigger_number; | 776 | st->trigger_number = pdata->trigger_number; |
774 | st->trigger_list = pdata->trigger_list; | 777 | st->trigger_list = pdata->trigger_list; |
775 | st->registers = pdata->registers; | 778 | st->registers = &st->caps->registers; |
776 | 779 | ||
777 | return 0; | 780 | return 0; |
778 | } | 781 | } |
@@ -1004,8 +1007,11 @@ static int at91_adc_probe(struct platform_device *pdev) | |||
1004 | * the best converted final value between two channels selection | 1007 | * the best converted final value between two channels selection |
1005 | * The formula thus is : Sample and Hold Time = (shtim + 1) / ADCClock | 1008 | * The formula thus is : Sample and Hold Time = (shtim + 1) / ADCClock |
1006 | */ | 1009 | */ |
1007 | shtim = round_up((st->sample_hold_time * adc_clk_khz / | 1010 | if (st->sample_hold_time > 0) |
1008 | 1000) - 1, 1); | 1011 | shtim = round_up((st->sample_hold_time * adc_clk_khz / 1000) |
1012 | - 1, 1); | ||
1013 | else | ||
1014 | shtim = 0; | ||
1009 | 1015 | ||
1010 | reg = AT91_ADC_PRESCAL_(prsc) & st->registers->mr_prescal_mask; | 1016 | reg = AT91_ADC_PRESCAL_(prsc) & st->registers->mr_prescal_mask; |
1011 | reg |= AT91_ADC_STARTUP_(ticks) & st->registers->mr_startup_mask; | 1017 | reg |= AT91_ADC_STARTUP_(ticks) & st->registers->mr_startup_mask; |
@@ -1101,7 +1107,6 @@ static int at91_adc_remove(struct platform_device *pdev) | |||
1101 | return 0; | 1107 | return 0; |
1102 | } | 1108 | } |
1103 | 1109 | ||
1104 | #ifdef CONFIG_OF | ||
1105 | static struct at91_adc_caps at91sam9260_caps = { | 1110 | static struct at91_adc_caps at91sam9260_caps = { |
1106 | .calc_startup_ticks = calc_startup_ticks_9260, | 1111 | .calc_startup_ticks = calc_startup_ticks_9260, |
1107 | .num_channels = 4, | 1112 | .num_channels = 4, |
@@ -1154,11 +1159,27 @@ static const struct of_device_id at91_adc_dt_ids[] = { | |||
1154 | {}, | 1159 | {}, |
1155 | }; | 1160 | }; |
1156 | MODULE_DEVICE_TABLE(of, at91_adc_dt_ids); | 1161 | MODULE_DEVICE_TABLE(of, at91_adc_dt_ids); |
1157 | #endif | 1162 | |
1163 | static const struct platform_device_id at91_adc_ids[] = { | ||
1164 | { | ||
1165 | .name = "at91sam9260-adc", | ||
1166 | .driver_data = (unsigned long)&at91sam9260_caps, | ||
1167 | }, { | ||
1168 | .name = "at91sam9g45-adc", | ||
1169 | .driver_data = (unsigned long)&at91sam9g45_caps, | ||
1170 | }, { | ||
1171 | .name = "at91sam9x5-adc", | ||
1172 | .driver_data = (unsigned long)&at91sam9x5_caps, | ||
1173 | }, { | ||
1174 | /* terminator */ | ||
1175 | } | ||
1176 | }; | ||
1177 | MODULE_DEVICE_TABLE(platform, at91_adc_ids); | ||
1158 | 1178 | ||
1159 | static struct platform_driver at91_adc_driver = { | 1179 | static struct platform_driver at91_adc_driver = { |
1160 | .probe = at91_adc_probe, | 1180 | .probe = at91_adc_probe, |
1161 | .remove = at91_adc_remove, | 1181 | .remove = at91_adc_remove, |
1182 | .id_table = at91_adc_ids, | ||
1162 | .driver = { | 1183 | .driver = { |
1163 | .name = DRIVER_NAME, | 1184 | .name = DRIVER_NAME, |
1164 | .of_match_table = of_match_ptr(at91_adc_dt_ids), | 1185 | .of_match_table = of_match_ptr(at91_adc_dt_ids), |
diff --git a/drivers/iio/industrialio-buffer.c b/drivers/iio/industrialio-buffer.c index e108f2a9d827..e472cff6eeae 100644 --- a/drivers/iio/industrialio-buffer.c +++ b/drivers/iio/industrialio-buffer.c | |||
@@ -165,7 +165,8 @@ static ssize_t iio_scan_el_show(struct device *dev, | |||
165 | int ret; | 165 | int ret; |
166 | struct iio_dev *indio_dev = dev_to_iio_dev(dev); | 166 | struct iio_dev *indio_dev = dev_to_iio_dev(dev); |
167 | 167 | ||
168 | ret = test_bit(to_iio_dev_attr(attr)->address, | 168 | /* Ensure ret is 0 or 1. */ |
169 | ret = !!test_bit(to_iio_dev_attr(attr)->address, | ||
169 | indio_dev->buffer->scan_mask); | 170 | indio_dev->buffer->scan_mask); |
170 | 171 | ||
171 | return sprintf(buf, "%d\n", ret); | 172 | return sprintf(buf, "%d\n", ret); |
@@ -862,7 +863,8 @@ int iio_scan_mask_query(struct iio_dev *indio_dev, | |||
862 | if (!buffer->scan_mask) | 863 | if (!buffer->scan_mask) |
863 | return 0; | 864 | return 0; |
864 | 865 | ||
865 | return test_bit(bit, buffer->scan_mask); | 866 | /* Ensure return value is 0 or 1. */ |
867 | return !!test_bit(bit, buffer->scan_mask); | ||
866 | }; | 868 | }; |
867 | EXPORT_SYMBOL_GPL(iio_scan_mask_query); | 869 | EXPORT_SYMBOL_GPL(iio_scan_mask_query); |
868 | 870 | ||
diff --git a/drivers/iio/light/cm32181.c b/drivers/iio/light/cm32181.c index 47a6dbac2d0c..d976e6ce60db 100644 --- a/drivers/iio/light/cm32181.c +++ b/drivers/iio/light/cm32181.c | |||
@@ -221,6 +221,7 @@ static int cm32181_read_raw(struct iio_dev *indio_dev, | |||
221 | *val = cm32181->calibscale; | 221 | *val = cm32181->calibscale; |
222 | return IIO_VAL_INT; | 222 | return IIO_VAL_INT; |
223 | case IIO_CHAN_INFO_INT_TIME: | 223 | case IIO_CHAN_INFO_INT_TIME: |
224 | *val = 0; | ||
224 | ret = cm32181_read_als_it(cm32181, val2); | 225 | ret = cm32181_read_als_it(cm32181, val2); |
225 | return ret; | 226 | return ret; |
226 | } | 227 | } |
diff --git a/drivers/iio/light/cm36651.c b/drivers/iio/light/cm36651.c index a45e07492db3..39fc67e82138 100644 --- a/drivers/iio/light/cm36651.c +++ b/drivers/iio/light/cm36651.c | |||
@@ -652,7 +652,19 @@ static int cm36651_probe(struct i2c_client *client, | |||
652 | cm36651->client = client; | 652 | cm36651->client = client; |
653 | cm36651->ps_client = i2c_new_dummy(client->adapter, | 653 | cm36651->ps_client = i2c_new_dummy(client->adapter, |
654 | CM36651_I2C_ADDR_PS); | 654 | CM36651_I2C_ADDR_PS); |
655 | if (!cm36651->ps_client) { | ||
656 | dev_err(&client->dev, "%s: new i2c device failed\n", __func__); | ||
657 | ret = -ENODEV; | ||
658 | goto error_disable_reg; | ||
659 | } | ||
660 | |||
655 | cm36651->ara_client = i2c_new_dummy(client->adapter, CM36651_ARA); | 661 | cm36651->ara_client = i2c_new_dummy(client->adapter, CM36651_ARA); |
662 | if (!cm36651->ara_client) { | ||
663 | dev_err(&client->dev, "%s: new i2c device failed\n", __func__); | ||
664 | ret = -ENODEV; | ||
665 | goto error_i2c_unregister_ps; | ||
666 | } | ||
667 | |||
656 | mutex_init(&cm36651->lock); | 668 | mutex_init(&cm36651->lock); |
657 | indio_dev->dev.parent = &client->dev; | 669 | indio_dev->dev.parent = &client->dev; |
658 | indio_dev->channels = cm36651_channels; | 670 | indio_dev->channels = cm36651_channels; |
@@ -664,7 +676,7 @@ static int cm36651_probe(struct i2c_client *client, | |||
664 | ret = cm36651_setup_reg(cm36651); | 676 | ret = cm36651_setup_reg(cm36651); |
665 | if (ret) { | 677 | if (ret) { |
666 | dev_err(&client->dev, "%s: register setup failed\n", __func__); | 678 | dev_err(&client->dev, "%s: register setup failed\n", __func__); |
667 | goto error_disable_reg; | 679 | goto error_i2c_unregister_ara; |
668 | } | 680 | } |
669 | 681 | ||
670 | ret = request_threaded_irq(client->irq, NULL, cm36651_irq_handler, | 682 | ret = request_threaded_irq(client->irq, NULL, cm36651_irq_handler, |
@@ -672,7 +684,7 @@ static int cm36651_probe(struct i2c_client *client, | |||
672 | "cm36651", indio_dev); | 684 | "cm36651", indio_dev); |
673 | if (ret) { | 685 | if (ret) { |
674 | dev_err(&client->dev, "%s: request irq failed\n", __func__); | 686 | dev_err(&client->dev, "%s: request irq failed\n", __func__); |
675 | goto error_disable_reg; | 687 | goto error_i2c_unregister_ara; |
676 | } | 688 | } |
677 | 689 | ||
678 | ret = iio_device_register(indio_dev); | 690 | ret = iio_device_register(indio_dev); |
@@ -685,6 +697,10 @@ static int cm36651_probe(struct i2c_client *client, | |||
685 | 697 | ||
686 | error_free_irq: | 698 | error_free_irq: |
687 | free_irq(client->irq, indio_dev); | 699 | free_irq(client->irq, indio_dev); |
700 | error_i2c_unregister_ara: | ||
701 | i2c_unregister_device(cm36651->ara_client); | ||
702 | error_i2c_unregister_ps: | ||
703 | i2c_unregister_device(cm36651->ps_client); | ||
688 | error_disable_reg: | 704 | error_disable_reg: |
689 | regulator_disable(cm36651->vled_reg); | 705 | regulator_disable(cm36651->vled_reg); |
690 | return ret; | 706 | return ret; |
@@ -698,6 +714,8 @@ static int cm36651_remove(struct i2c_client *client) | |||
698 | iio_device_unregister(indio_dev); | 714 | iio_device_unregister(indio_dev); |
699 | regulator_disable(cm36651->vled_reg); | 715 | regulator_disable(cm36651->vled_reg); |
700 | free_irq(client->irq, indio_dev); | 716 | free_irq(client->irq, indio_dev); |
717 | i2c_unregister_device(cm36651->ps_client); | ||
718 | i2c_unregister_device(cm36651->ara_client); | ||
701 | 719 | ||
702 | return 0; | 720 | return 0; |
703 | } | 721 | } |
diff --git a/drivers/infiniband/hw/cxgb4/Kconfig b/drivers/infiniband/hw/cxgb4/Kconfig index d4e8983fba53..23f38cf2c5cd 100644 --- a/drivers/infiniband/hw/cxgb4/Kconfig +++ b/drivers/infiniband/hw/cxgb4/Kconfig | |||
@@ -1,10 +1,10 @@ | |||
1 | config INFINIBAND_CXGB4 | 1 | config INFINIBAND_CXGB4 |
2 | tristate "Chelsio T4 RDMA Driver" | 2 | tristate "Chelsio T4/T5 RDMA Driver" |
3 | depends on CHELSIO_T4 && INET && (IPV6 || IPV6=n) | 3 | depends on CHELSIO_T4 && INET && (IPV6 || IPV6=n) |
4 | select GENERIC_ALLOCATOR | 4 | select GENERIC_ALLOCATOR |
5 | ---help--- | 5 | ---help--- |
6 | This is an iWARP/RDMA driver for the Chelsio T4 1GbE and | 6 | This is an iWARP/RDMA driver for the Chelsio T4 and T5 |
7 | 10GbE adapters. | 7 | 1GbE, 10GbE adapters and T5 40GbE adapter. |
8 | 8 | ||
9 | For general information about Chelsio and our products, visit | 9 | For general information about Chelsio and our products, visit |
10 | our website at <http://www.chelsio.com>. | 10 | our website at <http://www.chelsio.com>. |
diff --git a/drivers/infiniband/hw/cxgb4/cm.c b/drivers/infiniband/hw/cxgb4/cm.c index 185452abf32c..1f863a96a480 100644 --- a/drivers/infiniband/hw/cxgb4/cm.c +++ b/drivers/infiniband/hw/cxgb4/cm.c | |||
@@ -587,6 +587,10 @@ static int send_connect(struct c4iw_ep *ep) | |||
587 | opt2 |= SACK_EN(1); | 587 | opt2 |= SACK_EN(1); |
588 | if (wscale && enable_tcp_window_scaling) | 588 | if (wscale && enable_tcp_window_scaling) |
589 | opt2 |= WND_SCALE_EN(1); | 589 | opt2 |= WND_SCALE_EN(1); |
590 | if (is_t5(ep->com.dev->rdev.lldi.adapter_type)) { | ||
591 | opt2 |= T5_OPT_2_VALID; | ||
592 | opt2 |= V_CONG_CNTRL(CONG_ALG_TAHOE); | ||
593 | } | ||
590 | t4_set_arp_err_handler(skb, NULL, act_open_req_arp_failure); | 594 | t4_set_arp_err_handler(skb, NULL, act_open_req_arp_failure); |
591 | 595 | ||
592 | if (is_t4(ep->com.dev->rdev.lldi.adapter_type)) { | 596 | if (is_t4(ep->com.dev->rdev.lldi.adapter_type)) { |
@@ -996,7 +1000,7 @@ static void close_complete_upcall(struct c4iw_ep *ep, int status) | |||
996 | static int abort_connection(struct c4iw_ep *ep, struct sk_buff *skb, gfp_t gfp) | 1000 | static int abort_connection(struct c4iw_ep *ep, struct sk_buff *skb, gfp_t gfp) |
997 | { | 1001 | { |
998 | PDBG("%s ep %p tid %u\n", __func__, ep, ep->hwtid); | 1002 | PDBG("%s ep %p tid %u\n", __func__, ep, ep->hwtid); |
999 | state_set(&ep->com, ABORTING); | 1003 | __state_set(&ep->com, ABORTING); |
1000 | set_bit(ABORT_CONN, &ep->com.history); | 1004 | set_bit(ABORT_CONN, &ep->com.history); |
1001 | return send_abort(ep, skb, gfp); | 1005 | return send_abort(ep, skb, gfp); |
1002 | } | 1006 | } |
@@ -1154,7 +1158,7 @@ static int update_rx_credits(struct c4iw_ep *ep, u32 credits) | |||
1154 | return credits; | 1158 | return credits; |
1155 | } | 1159 | } |
1156 | 1160 | ||
1157 | static void process_mpa_reply(struct c4iw_ep *ep, struct sk_buff *skb) | 1161 | static int process_mpa_reply(struct c4iw_ep *ep, struct sk_buff *skb) |
1158 | { | 1162 | { |
1159 | struct mpa_message *mpa; | 1163 | struct mpa_message *mpa; |
1160 | struct mpa_v2_conn_params *mpa_v2_params; | 1164 | struct mpa_v2_conn_params *mpa_v2_params; |
@@ -1164,6 +1168,7 @@ static void process_mpa_reply(struct c4iw_ep *ep, struct sk_buff *skb) | |||
1164 | struct c4iw_qp_attributes attrs; | 1168 | struct c4iw_qp_attributes attrs; |
1165 | enum c4iw_qp_attr_mask mask; | 1169 | enum c4iw_qp_attr_mask mask; |
1166 | int err; | 1170 | int err; |
1171 | int disconnect = 0; | ||
1167 | 1172 | ||
1168 | PDBG("%s ep %p tid %u\n", __func__, ep, ep->hwtid); | 1173 | PDBG("%s ep %p tid %u\n", __func__, ep, ep->hwtid); |
1169 | 1174 | ||
@@ -1173,7 +1178,7 @@ static void process_mpa_reply(struct c4iw_ep *ep, struct sk_buff *skb) | |||
1173 | * will abort the connection. | 1178 | * will abort the connection. |
1174 | */ | 1179 | */ |
1175 | if (stop_ep_timer(ep)) | 1180 | if (stop_ep_timer(ep)) |
1176 | return; | 1181 | return 0; |
1177 | 1182 | ||
1178 | /* | 1183 | /* |
1179 | * If we get more than the supported amount of private data | 1184 | * If we get more than the supported amount of private data |
@@ -1195,7 +1200,7 @@ static void process_mpa_reply(struct c4iw_ep *ep, struct sk_buff *skb) | |||
1195 | * if we don't even have the mpa message, then bail. | 1200 | * if we don't even have the mpa message, then bail. |
1196 | */ | 1201 | */ |
1197 | if (ep->mpa_pkt_len < sizeof(*mpa)) | 1202 | if (ep->mpa_pkt_len < sizeof(*mpa)) |
1198 | return; | 1203 | return 0; |
1199 | mpa = (struct mpa_message *) ep->mpa_pkt; | 1204 | mpa = (struct mpa_message *) ep->mpa_pkt; |
1200 | 1205 | ||
1201 | /* Validate MPA header. */ | 1206 | /* Validate MPA header. */ |
@@ -1235,7 +1240,7 @@ static void process_mpa_reply(struct c4iw_ep *ep, struct sk_buff *skb) | |||
1235 | * We'll continue process when more data arrives. | 1240 | * We'll continue process when more data arrives. |
1236 | */ | 1241 | */ |
1237 | if (ep->mpa_pkt_len < (sizeof(*mpa) + plen)) | 1242 | if (ep->mpa_pkt_len < (sizeof(*mpa) + plen)) |
1238 | return; | 1243 | return 0; |
1239 | 1244 | ||
1240 | if (mpa->flags & MPA_REJECT) { | 1245 | if (mpa->flags & MPA_REJECT) { |
1241 | err = -ECONNREFUSED; | 1246 | err = -ECONNREFUSED; |
@@ -1337,9 +1342,11 @@ static void process_mpa_reply(struct c4iw_ep *ep, struct sk_buff *skb) | |||
1337 | attrs.layer_etype = LAYER_MPA | DDP_LLP; | 1342 | attrs.layer_etype = LAYER_MPA | DDP_LLP; |
1338 | attrs.ecode = MPA_NOMATCH_RTR; | 1343 | attrs.ecode = MPA_NOMATCH_RTR; |
1339 | attrs.next_state = C4IW_QP_STATE_TERMINATE; | 1344 | attrs.next_state = C4IW_QP_STATE_TERMINATE; |
1345 | attrs.send_term = 1; | ||
1340 | err = c4iw_modify_qp(ep->com.qp->rhp, ep->com.qp, | 1346 | err = c4iw_modify_qp(ep->com.qp->rhp, ep->com.qp, |
1341 | C4IW_QP_ATTR_NEXT_STATE, &attrs, 0); | 1347 | C4IW_QP_ATTR_NEXT_STATE, &attrs, 1); |
1342 | err = -ENOMEM; | 1348 | err = -ENOMEM; |
1349 | disconnect = 1; | ||
1343 | goto out; | 1350 | goto out; |
1344 | } | 1351 | } |
1345 | 1352 | ||
@@ -1355,9 +1362,11 @@ static void process_mpa_reply(struct c4iw_ep *ep, struct sk_buff *skb) | |||
1355 | attrs.layer_etype = LAYER_MPA | DDP_LLP; | 1362 | attrs.layer_etype = LAYER_MPA | DDP_LLP; |
1356 | attrs.ecode = MPA_INSUFF_IRD; | 1363 | attrs.ecode = MPA_INSUFF_IRD; |
1357 | attrs.next_state = C4IW_QP_STATE_TERMINATE; | 1364 | attrs.next_state = C4IW_QP_STATE_TERMINATE; |
1365 | attrs.send_term = 1; | ||
1358 | err = c4iw_modify_qp(ep->com.qp->rhp, ep->com.qp, | 1366 | err = c4iw_modify_qp(ep->com.qp->rhp, ep->com.qp, |
1359 | C4IW_QP_ATTR_NEXT_STATE, &attrs, 0); | 1367 | C4IW_QP_ATTR_NEXT_STATE, &attrs, 1); |
1360 | err = -ENOMEM; | 1368 | err = -ENOMEM; |
1369 | disconnect = 1; | ||
1361 | goto out; | 1370 | goto out; |
1362 | } | 1371 | } |
1363 | goto out; | 1372 | goto out; |
@@ -1366,7 +1375,7 @@ err: | |||
1366 | send_abort(ep, skb, GFP_KERNEL); | 1375 | send_abort(ep, skb, GFP_KERNEL); |
1367 | out: | 1376 | out: |
1368 | connect_reply_upcall(ep, err); | 1377 | connect_reply_upcall(ep, err); |
1369 | return; | 1378 | return disconnect; |
1370 | } | 1379 | } |
1371 | 1380 | ||
1372 | static void process_mpa_request(struct c4iw_ep *ep, struct sk_buff *skb) | 1381 | static void process_mpa_request(struct c4iw_ep *ep, struct sk_buff *skb) |
@@ -1524,6 +1533,7 @@ static int rx_data(struct c4iw_dev *dev, struct sk_buff *skb) | |||
1524 | unsigned int tid = GET_TID(hdr); | 1533 | unsigned int tid = GET_TID(hdr); |
1525 | struct tid_info *t = dev->rdev.lldi.tids; | 1534 | struct tid_info *t = dev->rdev.lldi.tids; |
1526 | __u8 status = hdr->status; | 1535 | __u8 status = hdr->status; |
1536 | int disconnect = 0; | ||
1527 | 1537 | ||
1528 | ep = lookup_tid(t, tid); | 1538 | ep = lookup_tid(t, tid); |
1529 | if (!ep) | 1539 | if (!ep) |
@@ -1539,7 +1549,7 @@ static int rx_data(struct c4iw_dev *dev, struct sk_buff *skb) | |||
1539 | switch (ep->com.state) { | 1549 | switch (ep->com.state) { |
1540 | case MPA_REQ_SENT: | 1550 | case MPA_REQ_SENT: |
1541 | ep->rcv_seq += dlen; | 1551 | ep->rcv_seq += dlen; |
1542 | process_mpa_reply(ep, skb); | 1552 | disconnect = process_mpa_reply(ep, skb); |
1543 | break; | 1553 | break; |
1544 | case MPA_REQ_WAIT: | 1554 | case MPA_REQ_WAIT: |
1545 | ep->rcv_seq += dlen; | 1555 | ep->rcv_seq += dlen; |
@@ -1555,13 +1565,16 @@ static int rx_data(struct c4iw_dev *dev, struct sk_buff *skb) | |||
1555 | ep->com.state, ep->hwtid, status); | 1565 | ep->com.state, ep->hwtid, status); |
1556 | attrs.next_state = C4IW_QP_STATE_TERMINATE; | 1566 | attrs.next_state = C4IW_QP_STATE_TERMINATE; |
1557 | c4iw_modify_qp(ep->com.qp->rhp, ep->com.qp, | 1567 | c4iw_modify_qp(ep->com.qp->rhp, ep->com.qp, |
1558 | C4IW_QP_ATTR_NEXT_STATE, &attrs, 0); | 1568 | C4IW_QP_ATTR_NEXT_STATE, &attrs, 1); |
1569 | disconnect = 1; | ||
1559 | break; | 1570 | break; |
1560 | } | 1571 | } |
1561 | default: | 1572 | default: |
1562 | break; | 1573 | break; |
1563 | } | 1574 | } |
1564 | mutex_unlock(&ep->com.mutex); | 1575 | mutex_unlock(&ep->com.mutex); |
1576 | if (disconnect) | ||
1577 | c4iw_ep_disconnect(ep, 0, GFP_KERNEL); | ||
1565 | return 0; | 1578 | return 0; |
1566 | } | 1579 | } |
1567 | 1580 | ||
@@ -2009,6 +2022,10 @@ static void accept_cr(struct c4iw_ep *ep, struct sk_buff *skb, | |||
2009 | if (tcph->ece && tcph->cwr) | 2022 | if (tcph->ece && tcph->cwr) |
2010 | opt2 |= CCTRL_ECN(1); | 2023 | opt2 |= CCTRL_ECN(1); |
2011 | } | 2024 | } |
2025 | if (is_t5(ep->com.dev->rdev.lldi.adapter_type)) { | ||
2026 | opt2 |= T5_OPT_2_VALID; | ||
2027 | opt2 |= V_CONG_CNTRL(CONG_ALG_TAHOE); | ||
2028 | } | ||
2012 | 2029 | ||
2013 | rpl = cplhdr(skb); | 2030 | rpl = cplhdr(skb); |
2014 | INIT_TP_WR(rpl, ep->hwtid); | 2031 | INIT_TP_WR(rpl, ep->hwtid); |
@@ -3482,9 +3499,9 @@ static void process_timeout(struct c4iw_ep *ep) | |||
3482 | __func__, ep, ep->hwtid, ep->com.state); | 3499 | __func__, ep, ep->hwtid, ep->com.state); |
3483 | abort = 0; | 3500 | abort = 0; |
3484 | } | 3501 | } |
3485 | mutex_unlock(&ep->com.mutex); | ||
3486 | if (abort) | 3502 | if (abort) |
3487 | abort_connection(ep, NULL, GFP_KERNEL); | 3503 | abort_connection(ep, NULL, GFP_KERNEL); |
3504 | mutex_unlock(&ep->com.mutex); | ||
3488 | c4iw_put_ep(&ep->com); | 3505 | c4iw_put_ep(&ep->com); |
3489 | } | 3506 | } |
3490 | 3507 | ||
diff --git a/drivers/infiniband/hw/cxgb4/iw_cxgb4.h b/drivers/infiniband/hw/cxgb4/iw_cxgb4.h index 7b8c5806a09d..7474b490760a 100644 --- a/drivers/infiniband/hw/cxgb4/iw_cxgb4.h +++ b/drivers/infiniband/hw/cxgb4/iw_cxgb4.h | |||
@@ -435,6 +435,7 @@ struct c4iw_qp_attributes { | |||
435 | u8 ecode; | 435 | u8 ecode; |
436 | u16 sq_db_inc; | 436 | u16 sq_db_inc; |
437 | u16 rq_db_inc; | 437 | u16 rq_db_inc; |
438 | u8 send_term; | ||
438 | }; | 439 | }; |
439 | 440 | ||
440 | struct c4iw_qp { | 441 | struct c4iw_qp { |
diff --git a/drivers/infiniband/hw/cxgb4/qp.c b/drivers/infiniband/hw/cxgb4/qp.c index 7b5114cb486f..086f62f5dc9e 100644 --- a/drivers/infiniband/hw/cxgb4/qp.c +++ b/drivers/infiniband/hw/cxgb4/qp.c | |||
@@ -1388,11 +1388,12 @@ int c4iw_modify_qp(struct c4iw_dev *rhp, struct c4iw_qp *qhp, | |||
1388 | qhp->attr.layer_etype = attrs->layer_etype; | 1388 | qhp->attr.layer_etype = attrs->layer_etype; |
1389 | qhp->attr.ecode = attrs->ecode; | 1389 | qhp->attr.ecode = attrs->ecode; |
1390 | ep = qhp->ep; | 1390 | ep = qhp->ep; |
1391 | disconnect = 1; | 1391 | if (!internal) { |
1392 | c4iw_get_ep(&qhp->ep->com); | 1392 | c4iw_get_ep(&qhp->ep->com); |
1393 | if (!internal) | ||
1394 | terminate = 1; | 1393 | terminate = 1; |
1395 | else { | 1394 | disconnect = 1; |
1395 | } else { | ||
1396 | terminate = qhp->attr.send_term; | ||
1396 | ret = rdma_fini(rhp, qhp, ep); | 1397 | ret = rdma_fini(rhp, qhp, ep); |
1397 | if (ret) | 1398 | if (ret) |
1398 | goto err; | 1399 | goto err; |
@@ -1776,11 +1777,15 @@ int c4iw_ib_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, | |||
1776 | /* | 1777 | /* |
1777 | * Use SQ_PSN and RQ_PSN to pass in IDX_INC values for | 1778 | * Use SQ_PSN and RQ_PSN to pass in IDX_INC values for |
1778 | * ringing the queue db when we're in DB_FULL mode. | 1779 | * ringing the queue db when we're in DB_FULL mode. |
1780 | * Only allow this on T4 devices. | ||
1779 | */ | 1781 | */ |
1780 | attrs.sq_db_inc = attr->sq_psn; | 1782 | attrs.sq_db_inc = attr->sq_psn; |
1781 | attrs.rq_db_inc = attr->rq_psn; | 1783 | attrs.rq_db_inc = attr->rq_psn; |
1782 | mask |= (attr_mask & IB_QP_SQ_PSN) ? C4IW_QP_ATTR_SQ_DB : 0; | 1784 | mask |= (attr_mask & IB_QP_SQ_PSN) ? C4IW_QP_ATTR_SQ_DB : 0; |
1783 | mask |= (attr_mask & IB_QP_RQ_PSN) ? C4IW_QP_ATTR_RQ_DB : 0; | 1785 | mask |= (attr_mask & IB_QP_RQ_PSN) ? C4IW_QP_ATTR_RQ_DB : 0; |
1786 | if (is_t5(to_c4iw_qp(ibqp)->rhp->rdev.lldi.adapter_type) && | ||
1787 | (mask & (C4IW_QP_ATTR_SQ_DB|C4IW_QP_ATTR_RQ_DB))) | ||
1788 | return -EINVAL; | ||
1784 | 1789 | ||
1785 | return c4iw_modify_qp(rhp, qhp, mask, &attrs, 0); | 1790 | return c4iw_modify_qp(rhp, qhp, mask, &attrs, 0); |
1786 | } | 1791 | } |
diff --git a/drivers/infiniband/hw/cxgb4/t4fw_ri_api.h b/drivers/infiniband/hw/cxgb4/t4fw_ri_api.h index dc193c292671..6121ca08fe58 100644 --- a/drivers/infiniband/hw/cxgb4/t4fw_ri_api.h +++ b/drivers/infiniband/hw/cxgb4/t4fw_ri_api.h | |||
@@ -836,4 +836,18 @@ struct ulptx_idata { | |||
836 | #define V_RX_DACK_CHANGE(x) ((x) << S_RX_DACK_CHANGE) | 836 | #define V_RX_DACK_CHANGE(x) ((x) << S_RX_DACK_CHANGE) |
837 | #define F_RX_DACK_CHANGE V_RX_DACK_CHANGE(1U) | 837 | #define F_RX_DACK_CHANGE V_RX_DACK_CHANGE(1U) |
838 | 838 | ||
839 | enum { /* TCP congestion control algorithms */ | ||
840 | CONG_ALG_RENO, | ||
841 | CONG_ALG_TAHOE, | ||
842 | CONG_ALG_NEWRENO, | ||
843 | CONG_ALG_HIGHSPEED | ||
844 | }; | ||
845 | |||
846 | #define S_CONG_CNTRL 14 | ||
847 | #define M_CONG_CNTRL 0x3 | ||
848 | #define V_CONG_CNTRL(x) ((x) << S_CONG_CNTRL) | ||
849 | #define G_CONG_CNTRL(x) (((x) >> S_CONG_CNTRL) & M_CONG_CNTRL) | ||
850 | |||
851 | #define T5_OPT_2_VALID (1 << 31) | ||
852 | |||
839 | #endif /* _T4FW_RI_API_H_ */ | 853 | #endif /* _T4FW_RI_API_H_ */ |
diff --git a/drivers/input/misc/da9055_onkey.c b/drivers/input/misc/da9055_onkey.c index 4b11ede34950..4765799fef74 100644 --- a/drivers/input/misc/da9055_onkey.c +++ b/drivers/input/misc/da9055_onkey.c | |||
@@ -109,7 +109,6 @@ static int da9055_onkey_probe(struct platform_device *pdev) | |||
109 | 109 | ||
110 | INIT_DELAYED_WORK(&onkey->work, da9055_onkey_work); | 110 | INIT_DELAYED_WORK(&onkey->work, da9055_onkey_work); |
111 | 111 | ||
112 | irq = regmap_irq_get_virq(da9055->irq_data, irq); | ||
113 | err = request_threaded_irq(irq, NULL, da9055_onkey_irq, | 112 | err = request_threaded_irq(irq, NULL, da9055_onkey_irq, |
114 | IRQF_TRIGGER_HIGH | IRQF_ONESHOT, | 113 | IRQF_TRIGGER_HIGH | IRQF_ONESHOT, |
115 | "ONKEY", onkey); | 114 | "ONKEY", onkey); |
diff --git a/drivers/input/misc/soc_button_array.c b/drivers/input/misc/soc_button_array.c index 08ead2aaede5..20c80f543d5e 100644 --- a/drivers/input/misc/soc_button_array.c +++ b/drivers/input/misc/soc_button_array.c | |||
@@ -169,6 +169,7 @@ static int soc_button_pnp_probe(struct pnp_dev *pdev, | |||
169 | soc_button_remove(pdev); | 169 | soc_button_remove(pdev); |
170 | return error; | 170 | return error; |
171 | } | 171 | } |
172 | continue; | ||
172 | } | 173 | } |
173 | 174 | ||
174 | priv->children[i] = pd; | 175 | priv->children[i] = pd; |
diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c index ef1cf52f8bb9..088d3541c7d3 100644 --- a/drivers/input/mouse/elantech.c +++ b/drivers/input/mouse/elantech.c | |||
@@ -1353,6 +1353,7 @@ static int elantech_set_properties(struct elantech_data *etd) | |||
1353 | case 6: | 1353 | case 6: |
1354 | case 7: | 1354 | case 7: |
1355 | case 8: | 1355 | case 8: |
1356 | case 9: | ||
1356 | etd->hw_version = 4; | 1357 | etd->hw_version = 4; |
1357 | break; | 1358 | break; |
1358 | default: | 1359 | default: |
diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c index d8d49d10f9bb..ef9f4913450d 100644 --- a/drivers/input/mouse/synaptics.c +++ b/drivers/input/mouse/synaptics.c | |||
@@ -117,6 +117,44 @@ void synaptics_reset(struct psmouse *psmouse) | |||
117 | } | 117 | } |
118 | 118 | ||
119 | #ifdef CONFIG_MOUSE_PS2_SYNAPTICS | 119 | #ifdef CONFIG_MOUSE_PS2_SYNAPTICS |
120 | /* This list has been kindly provided by Synaptics. */ | ||
121 | static const char * const topbuttonpad_pnp_ids[] = { | ||
122 | "LEN0017", | ||
123 | "LEN0018", | ||
124 | "LEN0019", | ||
125 | "LEN0023", | ||
126 | "LEN002A", | ||
127 | "LEN002B", | ||
128 | "LEN002C", | ||
129 | "LEN002D", | ||
130 | "LEN002E", | ||
131 | "LEN0033", /* Helix */ | ||
132 | "LEN0034", /* T431s, T540, X1 Carbon 2nd */ | ||
133 | "LEN0035", /* X240 */ | ||
134 | "LEN0036", /* T440 */ | ||
135 | "LEN0037", | ||
136 | "LEN0038", | ||
137 | "LEN0041", | ||
138 | "LEN0042", /* Yoga */ | ||
139 | "LEN0045", | ||
140 | "LEN0046", | ||
141 | "LEN0047", | ||
142 | "LEN0048", | ||
143 | "LEN0049", | ||
144 | "LEN2000", | ||
145 | "LEN2001", | ||
146 | "LEN2002", | ||
147 | "LEN2003", | ||
148 | "LEN2004", /* L440 */ | ||
149 | "LEN2005", | ||
150 | "LEN2006", | ||
151 | "LEN2007", | ||
152 | "LEN2008", | ||
153 | "LEN2009", | ||
154 | "LEN200A", | ||
155 | "LEN200B", | ||
156 | NULL | ||
157 | }; | ||
120 | 158 | ||
121 | /***************************************************************************** | 159 | /***************************************************************************** |
122 | * Synaptics communications functions | 160 | * Synaptics communications functions |
@@ -1255,8 +1293,10 @@ static void set_abs_position_params(struct input_dev *dev, | |||
1255 | input_abs_set_res(dev, y_code, priv->y_res); | 1293 | input_abs_set_res(dev, y_code, priv->y_res); |
1256 | } | 1294 | } |
1257 | 1295 | ||
1258 | static void set_input_params(struct input_dev *dev, struct synaptics_data *priv) | 1296 | static void set_input_params(struct psmouse *psmouse, |
1297 | struct synaptics_data *priv) | ||
1259 | { | 1298 | { |
1299 | struct input_dev *dev = psmouse->dev; | ||
1260 | int i; | 1300 | int i; |
1261 | 1301 | ||
1262 | /* Things that apply to both modes */ | 1302 | /* Things that apply to both modes */ |
@@ -1325,6 +1365,17 @@ static void set_input_params(struct input_dev *dev, struct synaptics_data *priv) | |||
1325 | 1365 | ||
1326 | if (SYN_CAP_CLICKPAD(priv->ext_cap_0c)) { | 1366 | if (SYN_CAP_CLICKPAD(priv->ext_cap_0c)) { |
1327 | __set_bit(INPUT_PROP_BUTTONPAD, dev->propbit); | 1367 | __set_bit(INPUT_PROP_BUTTONPAD, dev->propbit); |
1368 | /* See if this buttonpad has a top button area */ | ||
1369 | if (!strncmp(psmouse->ps2dev.serio->firmware_id, "PNP:", 4)) { | ||
1370 | for (i = 0; topbuttonpad_pnp_ids[i]; i++) { | ||
1371 | if (strstr(psmouse->ps2dev.serio->firmware_id, | ||
1372 | topbuttonpad_pnp_ids[i])) { | ||
1373 | __set_bit(INPUT_PROP_TOPBUTTONPAD, | ||
1374 | dev->propbit); | ||
1375 | break; | ||
1376 | } | ||
1377 | } | ||
1378 | } | ||
1328 | /* Clickpads report only left button */ | 1379 | /* Clickpads report only left button */ |
1329 | __clear_bit(BTN_RIGHT, dev->keybit); | 1380 | __clear_bit(BTN_RIGHT, dev->keybit); |
1330 | __clear_bit(BTN_MIDDLE, dev->keybit); | 1381 | __clear_bit(BTN_MIDDLE, dev->keybit); |
@@ -1515,6 +1566,14 @@ static const struct dmi_system_id min_max_dmi_table[] __initconst = { | |||
1515 | .driver_data = (int []){1232, 5710, 1156, 4696}, | 1566 | .driver_data = (int []){1232, 5710, 1156, 4696}, |
1516 | }, | 1567 | }, |
1517 | { | 1568 | { |
1569 | /* Lenovo ThinkPad T431s */ | ||
1570 | .matches = { | ||
1571 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
1572 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T431"), | ||
1573 | }, | ||
1574 | .driver_data = (int []){1024, 5112, 2024, 4832}, | ||
1575 | }, | ||
1576 | { | ||
1518 | /* Lenovo ThinkPad T440s */ | 1577 | /* Lenovo ThinkPad T440s */ |
1519 | .matches = { | 1578 | .matches = { |
1520 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | 1579 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
@@ -1523,6 +1582,14 @@ static const struct dmi_system_id min_max_dmi_table[] __initconst = { | |||
1523 | .driver_data = (int []){1024, 5112, 2024, 4832}, | 1582 | .driver_data = (int []){1024, 5112, 2024, 4832}, |
1524 | }, | 1583 | }, |
1525 | { | 1584 | { |
1585 | /* Lenovo ThinkPad L440 */ | ||
1586 | .matches = { | ||
1587 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
1588 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad L440"), | ||
1589 | }, | ||
1590 | .driver_data = (int []){1024, 5112, 2024, 4832}, | ||
1591 | }, | ||
1592 | { | ||
1526 | /* Lenovo ThinkPad T540p */ | 1593 | /* Lenovo ThinkPad T540p */ |
1527 | .matches = { | 1594 | .matches = { |
1528 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | 1595 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
@@ -1530,6 +1597,32 @@ static const struct dmi_system_id min_max_dmi_table[] __initconst = { | |||
1530 | }, | 1597 | }, |
1531 | .driver_data = (int []){1024, 5056, 2058, 4832}, | 1598 | .driver_data = (int []){1024, 5056, 2058, 4832}, |
1532 | }, | 1599 | }, |
1600 | { | ||
1601 | /* Lenovo ThinkPad L540 */ | ||
1602 | .matches = { | ||
1603 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
1604 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad L540"), | ||
1605 | }, | ||
1606 | .driver_data = (int []){1024, 5112, 2024, 4832}, | ||
1607 | }, | ||
1608 | { | ||
1609 | /* Lenovo Yoga S1 */ | ||
1610 | .matches = { | ||
1611 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
1612 | DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, | ||
1613 | "ThinkPad S1 Yoga"), | ||
1614 | }, | ||
1615 | .driver_data = (int []){1232, 5710, 1156, 4696}, | ||
1616 | }, | ||
1617 | { | ||
1618 | /* Lenovo ThinkPad X1 Carbon Haswell (3rd generation) */ | ||
1619 | .matches = { | ||
1620 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
1621 | DMI_MATCH(DMI_PRODUCT_VERSION, | ||
1622 | "ThinkPad X1 Carbon 2nd"), | ||
1623 | }, | ||
1624 | .driver_data = (int []){1024, 5112, 2024, 4832}, | ||
1625 | }, | ||
1533 | #endif | 1626 | #endif |
1534 | { } | 1627 | { } |
1535 | }; | 1628 | }; |
@@ -1593,7 +1686,7 @@ static int __synaptics_init(struct psmouse *psmouse, bool absolute_mode) | |||
1593 | priv->capabilities, priv->ext_cap, priv->ext_cap_0c, | 1686 | priv->capabilities, priv->ext_cap, priv->ext_cap_0c, |
1594 | priv->board_id, priv->firmware_id); | 1687 | priv->board_id, priv->firmware_id); |
1595 | 1688 | ||
1596 | set_input_params(psmouse->dev, priv); | 1689 | set_input_params(psmouse, priv); |
1597 | 1690 | ||
1598 | /* | 1691 | /* |
1599 | * Encode touchpad model so that it can be used to set | 1692 | * Encode touchpad model so that it can be used to set |
diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h index 0ec9abbe31fe..381b20d4c561 100644 --- a/drivers/input/serio/i8042-x86ia64io.h +++ b/drivers/input/serio/i8042-x86ia64io.h | |||
@@ -702,6 +702,17 @@ static int i8042_pnp_aux_irq; | |||
702 | static char i8042_pnp_kbd_name[32]; | 702 | static char i8042_pnp_kbd_name[32]; |
703 | static char i8042_pnp_aux_name[32]; | 703 | static char i8042_pnp_aux_name[32]; |
704 | 704 | ||
705 | static void i8042_pnp_id_to_string(struct pnp_id *id, char *dst, int dst_size) | ||
706 | { | ||
707 | strlcpy(dst, "PNP:", dst_size); | ||
708 | |||
709 | while (id) { | ||
710 | strlcat(dst, " ", dst_size); | ||
711 | strlcat(dst, id->id, dst_size); | ||
712 | id = id->next; | ||
713 | } | ||
714 | } | ||
715 | |||
705 | static int i8042_pnp_kbd_probe(struct pnp_dev *dev, const struct pnp_device_id *did) | 716 | static int i8042_pnp_kbd_probe(struct pnp_dev *dev, const struct pnp_device_id *did) |
706 | { | 717 | { |
707 | if (pnp_port_valid(dev, 0) && pnp_port_len(dev, 0) == 1) | 718 | if (pnp_port_valid(dev, 0) && pnp_port_len(dev, 0) == 1) |
@@ -718,6 +729,8 @@ static int i8042_pnp_kbd_probe(struct pnp_dev *dev, const struct pnp_device_id * | |||
718 | strlcat(i8042_pnp_kbd_name, ":", sizeof(i8042_pnp_kbd_name)); | 729 | strlcat(i8042_pnp_kbd_name, ":", sizeof(i8042_pnp_kbd_name)); |
719 | strlcat(i8042_pnp_kbd_name, pnp_dev_name(dev), sizeof(i8042_pnp_kbd_name)); | 730 | strlcat(i8042_pnp_kbd_name, pnp_dev_name(dev), sizeof(i8042_pnp_kbd_name)); |
720 | } | 731 | } |
732 | i8042_pnp_id_to_string(dev->id, i8042_kbd_firmware_id, | ||
733 | sizeof(i8042_kbd_firmware_id)); | ||
721 | 734 | ||
722 | /* Keyboard ports are always supposed to be wakeup-enabled */ | 735 | /* Keyboard ports are always supposed to be wakeup-enabled */ |
723 | device_set_wakeup_enable(&dev->dev, true); | 736 | device_set_wakeup_enable(&dev->dev, true); |
@@ -742,6 +755,8 @@ static int i8042_pnp_aux_probe(struct pnp_dev *dev, const struct pnp_device_id * | |||
742 | strlcat(i8042_pnp_aux_name, ":", sizeof(i8042_pnp_aux_name)); | 755 | strlcat(i8042_pnp_aux_name, ":", sizeof(i8042_pnp_aux_name)); |
743 | strlcat(i8042_pnp_aux_name, pnp_dev_name(dev), sizeof(i8042_pnp_aux_name)); | 756 | strlcat(i8042_pnp_aux_name, pnp_dev_name(dev), sizeof(i8042_pnp_aux_name)); |
744 | } | 757 | } |
758 | i8042_pnp_id_to_string(dev->id, i8042_aux_firmware_id, | ||
759 | sizeof(i8042_aux_firmware_id)); | ||
745 | 760 | ||
746 | i8042_pnp_aux_devices++; | 761 | i8042_pnp_aux_devices++; |
747 | return 0; | 762 | return 0; |
diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c index 020053fa5aaa..3807c3e971cc 100644 --- a/drivers/input/serio/i8042.c +++ b/drivers/input/serio/i8042.c | |||
@@ -87,6 +87,8 @@ MODULE_PARM_DESC(debug, "Turn i8042 debugging mode on and off"); | |||
87 | #endif | 87 | #endif |
88 | 88 | ||
89 | static bool i8042_bypass_aux_irq_test; | 89 | static bool i8042_bypass_aux_irq_test; |
90 | static char i8042_kbd_firmware_id[128]; | ||
91 | static char i8042_aux_firmware_id[128]; | ||
90 | 92 | ||
91 | #include "i8042.h" | 93 | #include "i8042.h" |
92 | 94 | ||
@@ -1218,6 +1220,8 @@ static int __init i8042_create_kbd_port(void) | |||
1218 | serio->dev.parent = &i8042_platform_device->dev; | 1220 | serio->dev.parent = &i8042_platform_device->dev; |
1219 | strlcpy(serio->name, "i8042 KBD port", sizeof(serio->name)); | 1221 | strlcpy(serio->name, "i8042 KBD port", sizeof(serio->name)); |
1220 | strlcpy(serio->phys, I8042_KBD_PHYS_DESC, sizeof(serio->phys)); | 1222 | strlcpy(serio->phys, I8042_KBD_PHYS_DESC, sizeof(serio->phys)); |
1223 | strlcpy(serio->firmware_id, i8042_kbd_firmware_id, | ||
1224 | sizeof(serio->firmware_id)); | ||
1221 | 1225 | ||
1222 | port->serio = serio; | 1226 | port->serio = serio; |
1223 | port->irq = I8042_KBD_IRQ; | 1227 | port->irq = I8042_KBD_IRQ; |
@@ -1244,6 +1248,8 @@ static int __init i8042_create_aux_port(int idx) | |||
1244 | if (idx < 0) { | 1248 | if (idx < 0) { |
1245 | strlcpy(serio->name, "i8042 AUX port", sizeof(serio->name)); | 1249 | strlcpy(serio->name, "i8042 AUX port", sizeof(serio->name)); |
1246 | strlcpy(serio->phys, I8042_AUX_PHYS_DESC, sizeof(serio->phys)); | 1250 | strlcpy(serio->phys, I8042_AUX_PHYS_DESC, sizeof(serio->phys)); |
1251 | strlcpy(serio->firmware_id, i8042_aux_firmware_id, | ||
1252 | sizeof(serio->firmware_id)); | ||
1247 | serio->close = i8042_port_close; | 1253 | serio->close = i8042_port_close; |
1248 | } else { | 1254 | } else { |
1249 | snprintf(serio->name, sizeof(serio->name), "i8042 AUX%d port", idx); | 1255 | snprintf(serio->name, sizeof(serio->name), "i8042 AUX%d port", idx); |
diff --git a/drivers/input/serio/serio.c b/drivers/input/serio/serio.c index 8f4c4ab04bc2..b29134de983b 100644 --- a/drivers/input/serio/serio.c +++ b/drivers/input/serio/serio.c | |||
@@ -451,6 +451,13 @@ static ssize_t serio_set_bind_mode(struct device *dev, struct device_attribute * | |||
451 | return retval; | 451 | return retval; |
452 | } | 452 | } |
453 | 453 | ||
454 | static ssize_t firmware_id_show(struct device *dev, struct device_attribute *attr, char *buf) | ||
455 | { | ||
456 | struct serio *serio = to_serio_port(dev); | ||
457 | |||
458 | return sprintf(buf, "%s\n", serio->firmware_id); | ||
459 | } | ||
460 | |||
454 | static DEVICE_ATTR_RO(type); | 461 | static DEVICE_ATTR_RO(type); |
455 | static DEVICE_ATTR_RO(proto); | 462 | static DEVICE_ATTR_RO(proto); |
456 | static DEVICE_ATTR_RO(id); | 463 | static DEVICE_ATTR_RO(id); |
@@ -473,12 +480,14 @@ static DEVICE_ATTR_RO(modalias); | |||
473 | static DEVICE_ATTR_WO(drvctl); | 480 | static DEVICE_ATTR_WO(drvctl); |
474 | static DEVICE_ATTR(description, S_IRUGO, serio_show_description, NULL); | 481 | static DEVICE_ATTR(description, S_IRUGO, serio_show_description, NULL); |
475 | static DEVICE_ATTR(bind_mode, S_IWUSR | S_IRUGO, serio_show_bind_mode, serio_set_bind_mode); | 482 | static DEVICE_ATTR(bind_mode, S_IWUSR | S_IRUGO, serio_show_bind_mode, serio_set_bind_mode); |
483 | static DEVICE_ATTR_RO(firmware_id); | ||
476 | 484 | ||
477 | static struct attribute *serio_device_attrs[] = { | 485 | static struct attribute *serio_device_attrs[] = { |
478 | &dev_attr_modalias.attr, | 486 | &dev_attr_modalias.attr, |
479 | &dev_attr_description.attr, | 487 | &dev_attr_description.attr, |
480 | &dev_attr_drvctl.attr, | 488 | &dev_attr_drvctl.attr, |
481 | &dev_attr_bind_mode.attr, | 489 | &dev_attr_bind_mode.attr, |
490 | &dev_attr_firmware_id.attr, | ||
482 | NULL | 491 | NULL |
483 | }; | 492 | }; |
484 | 493 | ||
@@ -921,9 +930,14 @@ static int serio_uevent(struct device *dev, struct kobj_uevent_env *env) | |||
921 | SERIO_ADD_UEVENT_VAR("SERIO_PROTO=%02x", serio->id.proto); | 930 | SERIO_ADD_UEVENT_VAR("SERIO_PROTO=%02x", serio->id.proto); |
922 | SERIO_ADD_UEVENT_VAR("SERIO_ID=%02x", serio->id.id); | 931 | SERIO_ADD_UEVENT_VAR("SERIO_ID=%02x", serio->id.id); |
923 | SERIO_ADD_UEVENT_VAR("SERIO_EXTRA=%02x", serio->id.extra); | 932 | SERIO_ADD_UEVENT_VAR("SERIO_EXTRA=%02x", serio->id.extra); |
933 | |||
924 | SERIO_ADD_UEVENT_VAR("MODALIAS=serio:ty%02Xpr%02Xid%02Xex%02X", | 934 | SERIO_ADD_UEVENT_VAR("MODALIAS=serio:ty%02Xpr%02Xid%02Xex%02X", |
925 | serio->id.type, serio->id.proto, serio->id.id, serio->id.extra); | 935 | serio->id.type, serio->id.proto, serio->id.id, serio->id.extra); |
926 | 936 | ||
937 | if (serio->firmware_id[0]) | ||
938 | SERIO_ADD_UEVENT_VAR("SERIO_FIRMWARE_ID=%s", | ||
939 | serio->firmware_id); | ||
940 | |||
927 | return 0; | 941 | return 0; |
928 | } | 942 | } |
929 | #undef SERIO_ADD_UEVENT_VAR | 943 | #undef SERIO_ADD_UEVENT_VAR |
diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c index b16ebef5b911..611fc3905d00 100644 --- a/drivers/input/tablet/wacom_sys.c +++ b/drivers/input/tablet/wacom_sys.c | |||
@@ -22,23 +22,18 @@ | |||
22 | #define HID_USAGE_PAGE_DIGITIZER 0x0d | 22 | #define HID_USAGE_PAGE_DIGITIZER 0x0d |
23 | #define HID_USAGE_PAGE_DESKTOP 0x01 | 23 | #define HID_USAGE_PAGE_DESKTOP 0x01 |
24 | #define HID_USAGE 0x09 | 24 | #define HID_USAGE 0x09 |
25 | #define HID_USAGE_X 0x30 | 25 | #define HID_USAGE_X ((HID_USAGE_PAGE_DESKTOP << 16) | 0x30) |
26 | #define HID_USAGE_Y 0x31 | 26 | #define HID_USAGE_Y ((HID_USAGE_PAGE_DESKTOP << 16) | 0x31) |
27 | #define HID_USAGE_X_TILT 0x3d | 27 | #define HID_USAGE_PRESSURE ((HID_USAGE_PAGE_DIGITIZER << 16) | 0x30) |
28 | #define HID_USAGE_Y_TILT 0x3e | 28 | #define HID_USAGE_X_TILT ((HID_USAGE_PAGE_DIGITIZER << 16) | 0x3d) |
29 | #define HID_USAGE_FINGER 0x22 | 29 | #define HID_USAGE_Y_TILT ((HID_USAGE_PAGE_DIGITIZER << 16) | 0x3e) |
30 | #define HID_USAGE_STYLUS 0x20 | 30 | #define HID_USAGE_FINGER ((HID_USAGE_PAGE_DIGITIZER << 16) | 0x22) |
31 | #define HID_USAGE_CONTACTMAX 0x55 | 31 | #define HID_USAGE_STYLUS ((HID_USAGE_PAGE_DIGITIZER << 16) | 0x20) |
32 | #define HID_USAGE_CONTACTMAX ((HID_USAGE_PAGE_DIGITIZER << 16) | 0x55) | ||
32 | #define HID_COLLECTION 0xa1 | 33 | #define HID_COLLECTION 0xa1 |
33 | #define HID_COLLECTION_LOGICAL 0x02 | 34 | #define HID_COLLECTION_LOGICAL 0x02 |
34 | #define HID_COLLECTION_END 0xc0 | 35 | #define HID_COLLECTION_END 0xc0 |
35 | 36 | ||
36 | enum { | ||
37 | WCM_UNDEFINED = 0, | ||
38 | WCM_DESKTOP, | ||
39 | WCM_DIGITIZER, | ||
40 | }; | ||
41 | |||
42 | struct hid_descriptor { | 37 | struct hid_descriptor { |
43 | struct usb_descriptor_header header; | 38 | struct usb_descriptor_header header; |
44 | __le16 bcdHID; | 39 | __le16 bcdHID; |
@@ -305,7 +300,7 @@ static int wacom_parse_hid(struct usb_interface *intf, | |||
305 | char limit = 0; | 300 | char limit = 0; |
306 | /* result has to be defined as int for some devices */ | 301 | /* result has to be defined as int for some devices */ |
307 | int result = 0, touch_max = 0; | 302 | int result = 0, touch_max = 0; |
308 | int i = 0, usage = WCM_UNDEFINED, finger = 0, pen = 0; | 303 | int i = 0, page = 0, finger = 0, pen = 0; |
309 | unsigned char *report; | 304 | unsigned char *report; |
310 | 305 | ||
311 | report = kzalloc(hid_desc->wDescriptorLength, GFP_KERNEL); | 306 | report = kzalloc(hid_desc->wDescriptorLength, GFP_KERNEL); |
@@ -332,134 +327,121 @@ static int wacom_parse_hid(struct usb_interface *intf, | |||
332 | 327 | ||
333 | switch (report[i]) { | 328 | switch (report[i]) { |
334 | case HID_USAGE_PAGE: | 329 | case HID_USAGE_PAGE: |
335 | switch (report[i + 1]) { | 330 | page = report[i + 1]; |
336 | case HID_USAGE_PAGE_DIGITIZER: | 331 | i++; |
337 | usage = WCM_DIGITIZER; | ||
338 | i++; | ||
339 | break; | ||
340 | |||
341 | case HID_USAGE_PAGE_DESKTOP: | ||
342 | usage = WCM_DESKTOP; | ||
343 | i++; | ||
344 | break; | ||
345 | } | ||
346 | break; | 332 | break; |
347 | 333 | ||
348 | case HID_USAGE: | 334 | case HID_USAGE: |
349 | switch (report[i + 1]) { | 335 | switch (page << 16 | report[i + 1]) { |
350 | case HID_USAGE_X: | 336 | case HID_USAGE_X: |
351 | if (usage == WCM_DESKTOP) { | 337 | if (finger) { |
352 | if (finger) { | 338 | features->device_type = BTN_TOOL_FINGER; |
353 | features->device_type = BTN_TOOL_FINGER; | 339 | /* touch device at least supports one touch point */ |
354 | /* touch device at least supports one touch point */ | 340 | touch_max = 1; |
355 | touch_max = 1; | 341 | switch (features->type) { |
356 | switch (features->type) { | 342 | case TABLETPC2FG: |
357 | case TABLETPC2FG: | 343 | features->pktlen = WACOM_PKGLEN_TPC2FG; |
358 | features->pktlen = WACOM_PKGLEN_TPC2FG; | 344 | break; |
359 | break; | 345 | |
360 | 346 | case MTSCREEN: | |
361 | case MTSCREEN: | 347 | case WACOM_24HDT: |
362 | case WACOM_24HDT: | 348 | features->pktlen = WACOM_PKGLEN_MTOUCH; |
363 | features->pktlen = WACOM_PKGLEN_MTOUCH; | 349 | break; |
364 | break; | 350 | |
365 | 351 | case MTTPC: | |
366 | case MTTPC: | 352 | features->pktlen = WACOM_PKGLEN_MTTPC; |
367 | features->pktlen = WACOM_PKGLEN_MTTPC; | 353 | break; |
368 | break; | 354 | |
369 | 355 | case BAMBOO_PT: | |
370 | case BAMBOO_PT: | 356 | features->pktlen = WACOM_PKGLEN_BBTOUCH; |
371 | features->pktlen = WACOM_PKGLEN_BBTOUCH; | 357 | break; |
372 | break; | 358 | |
373 | 359 | default: | |
374 | default: | 360 | features->pktlen = WACOM_PKGLEN_GRAPHIRE; |
375 | features->pktlen = WACOM_PKGLEN_GRAPHIRE; | 361 | break; |
376 | break; | 362 | } |
377 | } | 363 | |
378 | 364 | switch (features->type) { | |
379 | switch (features->type) { | 365 | case BAMBOO_PT: |
380 | case BAMBOO_PT: | 366 | features->x_phy = |
381 | features->x_phy = | 367 | get_unaligned_le16(&report[i + 5]); |
382 | get_unaligned_le16(&report[i + 5]); | 368 | features->x_max = |
383 | features->x_max = | 369 | get_unaligned_le16(&report[i + 8]); |
384 | get_unaligned_le16(&report[i + 8]); | 370 | i += 15; |
385 | i += 15; | 371 | break; |
386 | break; | 372 | |
387 | 373 | case WACOM_24HDT: | |
388 | case WACOM_24HDT: | ||
389 | features->x_max = | ||
390 | get_unaligned_le16(&report[i + 3]); | ||
391 | features->x_phy = | ||
392 | get_unaligned_le16(&report[i + 8]); | ||
393 | features->unit = report[i - 1]; | ||
394 | features->unitExpo = report[i - 3]; | ||
395 | i += 12; | ||
396 | break; | ||
397 | |||
398 | default: | ||
399 | features->x_max = | ||
400 | get_unaligned_le16(&report[i + 3]); | ||
401 | features->x_phy = | ||
402 | get_unaligned_le16(&report[i + 6]); | ||
403 | features->unit = report[i + 9]; | ||
404 | features->unitExpo = report[i + 11]; | ||
405 | i += 12; | ||
406 | break; | ||
407 | } | ||
408 | } else if (pen) { | ||
409 | /* penabled only accepts exact bytes of data */ | ||
410 | if (features->type >= TABLETPC) | ||
411 | features->pktlen = WACOM_PKGLEN_GRAPHIRE; | ||
412 | features->device_type = BTN_TOOL_PEN; | ||
413 | features->x_max = | 374 | features->x_max = |
414 | get_unaligned_le16(&report[i + 3]); | 375 | get_unaligned_le16(&report[i + 3]); |
415 | i += 4; | 376 | features->x_phy = |
377 | get_unaligned_le16(&report[i + 8]); | ||
378 | features->unit = report[i - 1]; | ||
379 | features->unitExpo = report[i - 3]; | ||
380 | i += 12; | ||
381 | break; | ||
382 | |||
383 | default: | ||
384 | features->x_max = | ||
385 | get_unaligned_le16(&report[i + 3]); | ||
386 | features->x_phy = | ||
387 | get_unaligned_le16(&report[i + 6]); | ||
388 | features->unit = report[i + 9]; | ||
389 | features->unitExpo = report[i + 11]; | ||
390 | i += 12; | ||
391 | break; | ||
416 | } | 392 | } |
393 | } else if (pen) { | ||
394 | /* penabled only accepts exact bytes of data */ | ||
395 | if (features->type >= TABLETPC) | ||
396 | features->pktlen = WACOM_PKGLEN_GRAPHIRE; | ||
397 | features->device_type = BTN_TOOL_PEN; | ||
398 | features->x_max = | ||
399 | get_unaligned_le16(&report[i + 3]); | ||
400 | i += 4; | ||
417 | } | 401 | } |
418 | break; | 402 | break; |
419 | 403 | ||
420 | case HID_USAGE_Y: | 404 | case HID_USAGE_Y: |
421 | if (usage == WCM_DESKTOP) { | 405 | if (finger) { |
422 | if (finger) { | 406 | switch (features->type) { |
423 | switch (features->type) { | 407 | case TABLETPC2FG: |
424 | case TABLETPC2FG: | 408 | case MTSCREEN: |
425 | case MTSCREEN: | 409 | case MTTPC: |
426 | case MTTPC: | 410 | features->y_max = |
427 | features->y_max = | 411 | get_unaligned_le16(&report[i + 3]); |
428 | get_unaligned_le16(&report[i + 3]); | 412 | features->y_phy = |
429 | features->y_phy = | 413 | get_unaligned_le16(&report[i + 6]); |
430 | get_unaligned_le16(&report[i + 6]); | 414 | i += 7; |
431 | i += 7; | 415 | break; |
432 | break; | 416 | |
433 | 417 | case WACOM_24HDT: | |
434 | case WACOM_24HDT: | 418 | features->y_max = |
435 | features->y_max = | 419 | get_unaligned_le16(&report[i + 3]); |
436 | get_unaligned_le16(&report[i + 3]); | 420 | features->y_phy = |
437 | features->y_phy = | 421 | get_unaligned_le16(&report[i - 2]); |
438 | get_unaligned_le16(&report[i - 2]); | 422 | i += 7; |
439 | i += 7; | 423 | break; |
440 | break; | 424 | |
441 | 425 | case BAMBOO_PT: | |
442 | case BAMBOO_PT: | 426 | features->y_phy = |
443 | features->y_phy = | 427 | get_unaligned_le16(&report[i + 3]); |
444 | get_unaligned_le16(&report[i + 3]); | 428 | features->y_max = |
445 | features->y_max = | 429 | get_unaligned_le16(&report[i + 6]); |
446 | get_unaligned_le16(&report[i + 6]); | 430 | i += 12; |
447 | i += 12; | 431 | break; |
448 | break; | 432 | |
449 | 433 | default: | |
450 | default: | ||
451 | features->y_max = | ||
452 | features->x_max; | ||
453 | features->y_phy = | ||
454 | get_unaligned_le16(&report[i + 3]); | ||
455 | i += 4; | ||
456 | break; | ||
457 | } | ||
458 | } else if (pen) { | ||
459 | features->y_max = | 434 | features->y_max = |
435 | features->x_max; | ||
436 | features->y_phy = | ||
460 | get_unaligned_le16(&report[i + 3]); | 437 | get_unaligned_le16(&report[i + 3]); |
461 | i += 4; | 438 | i += 4; |
439 | break; | ||
462 | } | 440 | } |
441 | } else if (pen) { | ||
442 | features->y_max = | ||
443 | get_unaligned_le16(&report[i + 3]); | ||
444 | i += 4; | ||
463 | } | 445 | } |
464 | break; | 446 | break; |
465 | 447 | ||
@@ -484,12 +466,20 @@ static int wacom_parse_hid(struct usb_interface *intf, | |||
484 | wacom_retrieve_report_data(intf, features); | 466 | wacom_retrieve_report_data(intf, features); |
485 | i++; | 467 | i++; |
486 | break; | 468 | break; |
469 | |||
470 | case HID_USAGE_PRESSURE: | ||
471 | if (pen) { | ||
472 | features->pressure_max = | ||
473 | get_unaligned_le16(&report[i + 3]); | ||
474 | i += 4; | ||
475 | } | ||
476 | break; | ||
487 | } | 477 | } |
488 | break; | 478 | break; |
489 | 479 | ||
490 | case HID_COLLECTION_END: | 480 | case HID_COLLECTION_END: |
491 | /* reset UsagePage and Finger */ | 481 | /* reset UsagePage and Finger */ |
492 | finger = usage = 0; | 482 | finger = page = 0; |
493 | break; | 483 | break; |
494 | 484 | ||
495 | case HID_COLLECTION: | 485 | case HID_COLLECTION: |
diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c index 05f371df6c40..4822c57a3756 100644 --- a/drivers/input/tablet/wacom_wac.c +++ b/drivers/input/tablet/wacom_wac.c | |||
@@ -178,10 +178,9 @@ static int wacom_ptu_irq(struct wacom_wac *wacom) | |||
178 | 178 | ||
179 | static int wacom_dtu_irq(struct wacom_wac *wacom) | 179 | static int wacom_dtu_irq(struct wacom_wac *wacom) |
180 | { | 180 | { |
181 | struct wacom_features *features = &wacom->features; | 181 | unsigned char *data = wacom->data; |
182 | char *data = wacom->data; | ||
183 | struct input_dev *input = wacom->input; | 182 | struct input_dev *input = wacom->input; |
184 | int prox = data[1] & 0x20, pressure; | 183 | int prox = data[1] & 0x20; |
185 | 184 | ||
186 | dev_dbg(input->dev.parent, | 185 | dev_dbg(input->dev.parent, |
187 | "%s: received report #%d", __func__, data[0]); | 186 | "%s: received report #%d", __func__, data[0]); |
@@ -198,10 +197,7 @@ static int wacom_dtu_irq(struct wacom_wac *wacom) | |||
198 | input_report_key(input, BTN_STYLUS2, data[1] & 0x10); | 197 | input_report_key(input, BTN_STYLUS2, data[1] & 0x10); |
199 | input_report_abs(input, ABS_X, le16_to_cpup((__le16 *)&data[2])); | 198 | input_report_abs(input, ABS_X, le16_to_cpup((__le16 *)&data[2])); |
200 | input_report_abs(input, ABS_Y, le16_to_cpup((__le16 *)&data[4])); | 199 | input_report_abs(input, ABS_Y, le16_to_cpup((__le16 *)&data[4])); |
201 | pressure = ((data[7] & 0x01) << 8) | data[6]; | 200 | input_report_abs(input, ABS_PRESSURE, ((data[7] & 0x01) << 8) | data[6]); |
202 | if (pressure < 0) | ||
203 | pressure = features->pressure_max + pressure + 1; | ||
204 | input_report_abs(input, ABS_PRESSURE, pressure); | ||
205 | input_report_key(input, BTN_TOUCH, data[1] & 0x05); | 201 | input_report_key(input, BTN_TOUCH, data[1] & 0x05); |
206 | if (!prox) /* out-prox */ | 202 | if (!prox) /* out-prox */ |
207 | wacom->id[0] = 0; | 203 | wacom->id[0] = 0; |
@@ -906,7 +902,7 @@ static int int_dist(int x1, int y1, int x2, int y2) | |||
906 | static int wacom_24hdt_irq(struct wacom_wac *wacom) | 902 | static int wacom_24hdt_irq(struct wacom_wac *wacom) |
907 | { | 903 | { |
908 | struct input_dev *input = wacom->input; | 904 | struct input_dev *input = wacom->input; |
909 | char *data = wacom->data; | 905 | unsigned char *data = wacom->data; |
910 | int i; | 906 | int i; |
911 | int current_num_contacts = data[61]; | 907 | int current_num_contacts = data[61]; |
912 | int contacts_to_send = 0; | 908 | int contacts_to_send = 0; |
@@ -959,7 +955,7 @@ static int wacom_24hdt_irq(struct wacom_wac *wacom) | |||
959 | static int wacom_mt_touch(struct wacom_wac *wacom) | 955 | static int wacom_mt_touch(struct wacom_wac *wacom) |
960 | { | 956 | { |
961 | struct input_dev *input = wacom->input; | 957 | struct input_dev *input = wacom->input; |
962 | char *data = wacom->data; | 958 | unsigned char *data = wacom->data; |
963 | int i; | 959 | int i; |
964 | int current_num_contacts = data[2]; | 960 | int current_num_contacts = data[2]; |
965 | int contacts_to_send = 0; | 961 | int contacts_to_send = 0; |
@@ -1038,7 +1034,7 @@ static int wacom_tpc_mt_touch(struct wacom_wac *wacom) | |||
1038 | 1034 | ||
1039 | static int wacom_tpc_single_touch(struct wacom_wac *wacom, size_t len) | 1035 | static int wacom_tpc_single_touch(struct wacom_wac *wacom, size_t len) |
1040 | { | 1036 | { |
1041 | char *data = wacom->data; | 1037 | unsigned char *data = wacom->data; |
1042 | struct input_dev *input = wacom->input; | 1038 | struct input_dev *input = wacom->input; |
1043 | bool prox; | 1039 | bool prox; |
1044 | int x = 0, y = 0; | 1040 | int x = 0, y = 0; |
@@ -1074,10 +1070,8 @@ static int wacom_tpc_single_touch(struct wacom_wac *wacom, size_t len) | |||
1074 | 1070 | ||
1075 | static int wacom_tpc_pen(struct wacom_wac *wacom) | 1071 | static int wacom_tpc_pen(struct wacom_wac *wacom) |
1076 | { | 1072 | { |
1077 | struct wacom_features *features = &wacom->features; | 1073 | unsigned char *data = wacom->data; |
1078 | char *data = wacom->data; | ||
1079 | struct input_dev *input = wacom->input; | 1074 | struct input_dev *input = wacom->input; |
1080 | int pressure; | ||
1081 | bool prox = data[1] & 0x20; | 1075 | bool prox = data[1] & 0x20; |
1082 | 1076 | ||
1083 | if (!wacom->shared->stylus_in_proximity) /* first in prox */ | 1077 | if (!wacom->shared->stylus_in_proximity) /* first in prox */ |
@@ -1093,10 +1087,7 @@ static int wacom_tpc_pen(struct wacom_wac *wacom) | |||
1093 | input_report_key(input, BTN_STYLUS2, data[1] & 0x10); | 1087 | input_report_key(input, BTN_STYLUS2, data[1] & 0x10); |
1094 | input_report_abs(input, ABS_X, le16_to_cpup((__le16 *)&data[2])); | 1088 | input_report_abs(input, ABS_X, le16_to_cpup((__le16 *)&data[2])); |
1095 | input_report_abs(input, ABS_Y, le16_to_cpup((__le16 *)&data[4])); | 1089 | input_report_abs(input, ABS_Y, le16_to_cpup((__le16 *)&data[4])); |
1096 | pressure = ((data[7] & 0x01) << 8) | data[6]; | 1090 | input_report_abs(input, ABS_PRESSURE, ((data[7] & 0x03) << 8) | data[6]); |
1097 | if (pressure < 0) | ||
1098 | pressure = features->pressure_max + pressure + 1; | ||
1099 | input_report_abs(input, ABS_PRESSURE, pressure); | ||
1100 | input_report_key(input, BTN_TOUCH, data[1] & 0x05); | 1091 | input_report_key(input, BTN_TOUCH, data[1] & 0x05); |
1101 | input_report_key(input, wacom->tool[0], prox); | 1092 | input_report_key(input, wacom->tool[0], prox); |
1102 | return 1; | 1093 | return 1; |
@@ -1107,7 +1098,7 @@ static int wacom_tpc_pen(struct wacom_wac *wacom) | |||
1107 | 1098 | ||
1108 | static int wacom_tpc_irq(struct wacom_wac *wacom, size_t len) | 1099 | static int wacom_tpc_irq(struct wacom_wac *wacom, size_t len) |
1109 | { | 1100 | { |
1110 | char *data = wacom->data; | 1101 | unsigned char *data = wacom->data; |
1111 | 1102 | ||
1112 | dev_dbg(wacom->input->dev.parent, | 1103 | dev_dbg(wacom->input->dev.parent, |
1113 | "%s: received report #%d\n", __func__, data[0]); | 1104 | "%s: received report #%d\n", __func__, data[0]); |
@@ -1838,7 +1829,7 @@ int wacom_setup_input_capabilities(struct input_dev *input_dev, | |||
1838 | case DTU: | 1829 | case DTU: |
1839 | if (features->type == DTUS) { | 1830 | if (features->type == DTUS) { |
1840 | input_set_capability(input_dev, EV_MSC, MSC_SERIAL); | 1831 | input_set_capability(input_dev, EV_MSC, MSC_SERIAL); |
1841 | for (i = 0; i < 3; i++) | 1832 | for (i = 0; i < 4; i++) |
1842 | __set_bit(BTN_0 + i, input_dev->keybit); | 1833 | __set_bit(BTN_0 + i, input_dev->keybit); |
1843 | } | 1834 | } |
1844 | __set_bit(BTN_TOOL_PEN, input_dev->keybit); | 1835 | __set_bit(BTN_TOOL_PEN, input_dev->keybit); |
diff --git a/drivers/input/touchscreen/ads7846.c b/drivers/input/touchscreen/ads7846.c index 45a06e495ed2..7f8aa981500d 100644 --- a/drivers/input/touchscreen/ads7846.c +++ b/drivers/input/touchscreen/ads7846.c | |||
@@ -425,7 +425,7 @@ static int ads7845_read12_ser(struct device *dev, unsigned command) | |||
425 | name ## _show(struct device *dev, struct device_attribute *attr, char *buf) \ | 425 | name ## _show(struct device *dev, struct device_attribute *attr, char *buf) \ |
426 | { \ | 426 | { \ |
427 | struct ads7846 *ts = dev_get_drvdata(dev); \ | 427 | struct ads7846 *ts = dev_get_drvdata(dev); \ |
428 | ssize_t v = ads7846_read12_ser(dev, \ | 428 | ssize_t v = ads7846_read12_ser(&ts->spi->dev, \ |
429 | READ_12BIT_SER(var)); \ | 429 | READ_12BIT_SER(var)); \ |
430 | if (v < 0) \ | 430 | if (v < 0) \ |
431 | return v; \ | 431 | return v; \ |
diff --git a/drivers/irqchip/irq-gic.c b/drivers/irqchip/irq-gic.c index 4300b6606f5e..57d165e026f4 100644 --- a/drivers/irqchip/irq-gic.c +++ b/drivers/irqchip/irq-gic.c | |||
@@ -246,10 +246,14 @@ static int gic_set_affinity(struct irq_data *d, const struct cpumask *mask_val, | |||
246 | bool force) | 246 | bool force) |
247 | { | 247 | { |
248 | void __iomem *reg = gic_dist_base(d) + GIC_DIST_TARGET + (gic_irq(d) & ~3); | 248 | void __iomem *reg = gic_dist_base(d) + GIC_DIST_TARGET + (gic_irq(d) & ~3); |
249 | unsigned int shift = (gic_irq(d) % 4) * 8; | 249 | unsigned int cpu, shift = (gic_irq(d) % 4) * 8; |
250 | unsigned int cpu = cpumask_any_and(mask_val, cpu_online_mask); | ||
251 | u32 val, mask, bit; | 250 | u32 val, mask, bit; |
252 | 251 | ||
252 | if (!force) | ||
253 | cpu = cpumask_any_and(mask_val, cpu_online_mask); | ||
254 | else | ||
255 | cpu = cpumask_first(mask_val); | ||
256 | |||
253 | if (cpu >= NR_GIC_CPU_IF || cpu >= nr_cpu_ids) | 257 | if (cpu >= NR_GIC_CPU_IF || cpu >= nr_cpu_ids) |
254 | return -EINVAL; | 258 | return -EINVAL; |
255 | 259 | ||
diff --git a/drivers/of/irq.c b/drivers/of/irq.c index 9bcf2cf19357..5aeb89411350 100644 --- a/drivers/of/irq.c +++ b/drivers/of/irq.c | |||
@@ -364,7 +364,7 @@ int of_irq_to_resource(struct device_node *dev, int index, struct resource *r) | |||
364 | 364 | ||
365 | memset(r, 0, sizeof(*r)); | 365 | memset(r, 0, sizeof(*r)); |
366 | /* | 366 | /* |
367 | * Get optional "interrupts-names" property to add a name | 367 | * Get optional "interrupt-names" property to add a name |
368 | * to the resource. | 368 | * to the resource. |
369 | */ | 369 | */ |
370 | of_property_read_string_index(dev, "interrupt-names", index, | 370 | of_property_read_string_index(dev, "interrupt-names", index, |
@@ -380,6 +380,32 @@ int of_irq_to_resource(struct device_node *dev, int index, struct resource *r) | |||
380 | EXPORT_SYMBOL_GPL(of_irq_to_resource); | 380 | EXPORT_SYMBOL_GPL(of_irq_to_resource); |
381 | 381 | ||
382 | /** | 382 | /** |
383 | * of_irq_get - Decode a node's IRQ and return it as a Linux irq number | ||
384 | * @dev: pointer to device tree node | ||
385 | * @index: zero-based index of the irq | ||
386 | * | ||
387 | * Returns Linux irq number on success, or -EPROBE_DEFER if the irq domain | ||
388 | * is not yet created. | ||
389 | * | ||
390 | */ | ||
391 | int of_irq_get(struct device_node *dev, int index) | ||
392 | { | ||
393 | int rc; | ||
394 | struct of_phandle_args oirq; | ||
395 | struct irq_domain *domain; | ||
396 | |||
397 | rc = of_irq_parse_one(dev, index, &oirq); | ||
398 | if (rc) | ||
399 | return rc; | ||
400 | |||
401 | domain = irq_find_host(oirq.np); | ||
402 | if (!domain) | ||
403 | return -EPROBE_DEFER; | ||
404 | |||
405 | return irq_create_of_mapping(&oirq); | ||
406 | } | ||
407 | |||
408 | /** | ||
383 | * of_irq_count - Count the number of IRQs a node uses | 409 | * of_irq_count - Count the number of IRQs a node uses |
384 | * @dev: pointer to device tree node | 410 | * @dev: pointer to device tree node |
385 | */ | 411 | */ |
diff --git a/drivers/of/platform.c b/drivers/of/platform.c index 404d1daebefa..bd47fbc53dc9 100644 --- a/drivers/of/platform.c +++ b/drivers/of/platform.c | |||
@@ -168,7 +168,9 @@ struct platform_device *of_device_alloc(struct device_node *np, | |||
168 | rc = of_address_to_resource(np, i, res); | 168 | rc = of_address_to_resource(np, i, res); |
169 | WARN_ON(rc); | 169 | WARN_ON(rc); |
170 | } | 170 | } |
171 | WARN_ON(of_irq_to_resource_table(np, res, num_irq) != num_irq); | 171 | if (of_irq_to_resource_table(np, res, num_irq) != num_irq) |
172 | pr_debug("not all legacy IRQ resources mapped for %s\n", | ||
173 | np->name); | ||
172 | } | 174 | } |
173 | 175 | ||
174 | dev->dev.of_node = of_node_get(np); | 176 | dev->dev.of_node = of_node_get(np); |
diff --git a/drivers/of/selftest.c b/drivers/of/selftest.c index ae4450070503..fe70b86bcffb 100644 --- a/drivers/of/selftest.c +++ b/drivers/of/selftest.c | |||
@@ -10,6 +10,7 @@ | |||
10 | #include <linux/module.h> | 10 | #include <linux/module.h> |
11 | #include <linux/of.h> | 11 | #include <linux/of.h> |
12 | #include <linux/of_irq.h> | 12 | #include <linux/of_irq.h> |
13 | #include <linux/of_platform.h> | ||
13 | #include <linux/list.h> | 14 | #include <linux/list.h> |
14 | #include <linux/mutex.h> | 15 | #include <linux/mutex.h> |
15 | #include <linux/slab.h> | 16 | #include <linux/slab.h> |
@@ -427,6 +428,36 @@ static void __init of_selftest_match_node(void) | |||
427 | } | 428 | } |
428 | } | 429 | } |
429 | 430 | ||
431 | static void __init of_selftest_platform_populate(void) | ||
432 | { | ||
433 | int irq; | ||
434 | struct device_node *np; | ||
435 | struct platform_device *pdev; | ||
436 | |||
437 | np = of_find_node_by_path("/testcase-data"); | ||
438 | of_platform_populate(np, of_default_bus_match_table, NULL, NULL); | ||
439 | |||
440 | /* Test that a missing irq domain returns -EPROBE_DEFER */ | ||
441 | np = of_find_node_by_path("/testcase-data/testcase-device1"); | ||
442 | pdev = of_find_device_by_node(np); | ||
443 | if (!pdev) | ||
444 | selftest(0, "device 1 creation failed\n"); | ||
445 | irq = platform_get_irq(pdev, 0); | ||
446 | if (irq != -EPROBE_DEFER) | ||
447 | selftest(0, "device deferred probe failed - %d\n", irq); | ||
448 | |||
449 | /* Test that a parsing failure does not return -EPROBE_DEFER */ | ||
450 | np = of_find_node_by_path("/testcase-data/testcase-device2"); | ||
451 | pdev = of_find_device_by_node(np); | ||
452 | if (!pdev) | ||
453 | selftest(0, "device 2 creation failed\n"); | ||
454 | irq = platform_get_irq(pdev, 0); | ||
455 | if (irq >= 0 || irq == -EPROBE_DEFER) | ||
456 | selftest(0, "device parsing error failed - %d\n", irq); | ||
457 | |||
458 | selftest(1, "passed"); | ||
459 | } | ||
460 | |||
430 | static int __init of_selftest(void) | 461 | static int __init of_selftest(void) |
431 | { | 462 | { |
432 | struct device_node *np; | 463 | struct device_node *np; |
@@ -445,6 +476,7 @@ static int __init of_selftest(void) | |||
445 | of_selftest_parse_interrupts(); | 476 | of_selftest_parse_interrupts(); |
446 | of_selftest_parse_interrupts_extended(); | 477 | of_selftest_parse_interrupts_extended(); |
447 | of_selftest_match_node(); | 478 | of_selftest_match_node(); |
479 | of_selftest_platform_populate(); | ||
448 | pr_info("end of selftest - %i passed, %i failed\n", | 480 | pr_info("end of selftest - %i passed, %i failed\n", |
449 | selftest_results.passed, selftest_results.failed); | 481 | selftest_results.passed, selftest_results.failed); |
450 | return 0; | 482 | return 0; |
diff --git a/drivers/of/testcase-data/tests-interrupts.dtsi b/drivers/of/testcase-data/tests-interrupts.dtsi index c843720bd3e5..da4695f60351 100644 --- a/drivers/of/testcase-data/tests-interrupts.dtsi +++ b/drivers/of/testcase-data/tests-interrupts.dtsi | |||
@@ -54,5 +54,18 @@ | |||
54 | <&test_intmap1 1 2>; | 54 | <&test_intmap1 1 2>; |
55 | }; | 55 | }; |
56 | }; | 56 | }; |
57 | |||
58 | testcase-device1 { | ||
59 | compatible = "testcase-device"; | ||
60 | interrupt-parent = <&test_intc0>; | ||
61 | interrupts = <1>; | ||
62 | }; | ||
63 | |||
64 | testcase-device2 { | ||
65 | compatible = "testcase-device"; | ||
66 | interrupt-parent = <&test_intc2>; | ||
67 | interrupts = <1>; /* invalid specifier - too short */ | ||
68 | }; | ||
57 | }; | 69 | }; |
70 | |||
58 | }; | 71 | }; |
diff --git a/drivers/phy/Kconfig b/drivers/phy/Kconfig index 3bb05f17b9b4..4906c27fa3bd 100644 --- a/drivers/phy/Kconfig +++ b/drivers/phy/Kconfig | |||
@@ -33,6 +33,7 @@ config PHY_MVEBU_SATA | |||
33 | 33 | ||
34 | config OMAP_CONTROL_PHY | 34 | config OMAP_CONTROL_PHY |
35 | tristate "OMAP CONTROL PHY Driver" | 35 | tristate "OMAP CONTROL PHY Driver" |
36 | depends on ARCH_OMAP2PLUS || COMPILE_TEST | ||
36 | help | 37 | help |
37 | Enable this to add support for the PHY part present in the control | 38 | Enable this to add support for the PHY part present in the control |
38 | module. This driver has API to power on the USB2 PHY and to write to | 39 | module. This driver has API to power on the USB2 PHY and to write to |
diff --git a/drivers/phy/Makefile b/drivers/phy/Makefile index 2faf78edc864..7728518572a4 100644 --- a/drivers/phy/Makefile +++ b/drivers/phy/Makefile | |||
@@ -13,8 +13,9 @@ obj-$(CONFIG_TI_PIPE3) += phy-ti-pipe3.o | |||
13 | obj-$(CONFIG_TWL4030_USB) += phy-twl4030-usb.o | 13 | obj-$(CONFIG_TWL4030_USB) += phy-twl4030-usb.o |
14 | obj-$(CONFIG_PHY_EXYNOS5250_SATA) += phy-exynos5250-sata.o | 14 | obj-$(CONFIG_PHY_EXYNOS5250_SATA) += phy-exynos5250-sata.o |
15 | obj-$(CONFIG_PHY_SUN4I_USB) += phy-sun4i-usb.o | 15 | obj-$(CONFIG_PHY_SUN4I_USB) += phy-sun4i-usb.o |
16 | obj-$(CONFIG_PHY_SAMSUNG_USB2) += phy-samsung-usb2.o | 16 | obj-$(CONFIG_PHY_SAMSUNG_USB2) += phy-exynos-usb2.o |
17 | obj-$(CONFIG_PHY_EXYNOS4210_USB2) += phy-exynos4210-usb2.o | 17 | phy-exynos-usb2-y += phy-samsung-usb2.o |
18 | obj-$(CONFIG_PHY_EXYNOS4X12_USB2) += phy-exynos4x12-usb2.o | 18 | phy-exynos-usb2-$(CONFIG_PHY_EXYNOS4210_USB2) += phy-exynos4210-usb2.o |
19 | obj-$(CONFIG_PHY_EXYNOS5250_USB2) += phy-exynos5250-usb2.o | 19 | phy-exynos-usb2-$(CONFIG_PHY_EXYNOS4X12_USB2) += phy-exynos4x12-usb2.o |
20 | phy-exynos-usb2-$(CONFIG_PHY_EXYNOS5250_USB2) += phy-exynos5250-usb2.o | ||
20 | obj-$(CONFIG_PHY_XGENE) += phy-xgene.o | 21 | obj-$(CONFIG_PHY_XGENE) += phy-xgene.o |
diff --git a/drivers/phy/phy-core.c b/drivers/phy/phy-core.c index 623b71c54b3e..c64a2f3b2d62 100644 --- a/drivers/phy/phy-core.c +++ b/drivers/phy/phy-core.c | |||
@@ -64,6 +64,9 @@ static struct phy *phy_lookup(struct device *device, const char *port) | |||
64 | class_dev_iter_init(&iter, phy_class, NULL, NULL); | 64 | class_dev_iter_init(&iter, phy_class, NULL, NULL); |
65 | while ((dev = class_dev_iter_next(&iter))) { | 65 | while ((dev = class_dev_iter_next(&iter))) { |
66 | phy = to_phy(dev); | 66 | phy = to_phy(dev); |
67 | |||
68 | if (!phy->init_data) | ||
69 | continue; | ||
67 | count = phy->init_data->num_consumers; | 70 | count = phy->init_data->num_consumers; |
68 | consumers = phy->init_data->consumers; | 71 | consumers = phy->init_data->consumers; |
69 | while (count--) { | 72 | while (count--) { |
diff --git a/drivers/pinctrl/pinctrl-as3722.c b/drivers/pinctrl/pinctrl-as3722.c index 92ed4b2e3c07..c862f9c0e9ce 100644 --- a/drivers/pinctrl/pinctrl-as3722.c +++ b/drivers/pinctrl/pinctrl-as3722.c | |||
@@ -64,7 +64,6 @@ struct as3722_pin_function { | |||
64 | }; | 64 | }; |
65 | 65 | ||
66 | struct as3722_gpio_pin_control { | 66 | struct as3722_gpio_pin_control { |
67 | bool enable_gpio_invert; | ||
68 | unsigned mode_prop; | 67 | unsigned mode_prop; |
69 | int io_function; | 68 | int io_function; |
70 | }; | 69 | }; |
@@ -320,10 +319,8 @@ static int as3722_pinctrl_gpio_set_direction(struct pinctrl_dev *pctldev, | |||
320 | return mode; | 319 | return mode; |
321 | } | 320 | } |
322 | 321 | ||
323 | if (as_pci->gpio_control[offset].enable_gpio_invert) | 322 | return as3722_update_bits(as3722, AS3722_GPIOn_CONTROL_REG(offset), |
324 | mode |= AS3722_GPIO_INV; | 323 | AS3722_GPIO_MODE_MASK, mode); |
325 | |||
326 | return as3722_write(as3722, AS3722_GPIOn_CONTROL_REG(offset), mode); | ||
327 | } | 324 | } |
328 | 325 | ||
329 | static const struct pinmux_ops as3722_pinmux_ops = { | 326 | static const struct pinmux_ops as3722_pinmux_ops = { |
@@ -496,10 +493,18 @@ static void as3722_gpio_set(struct gpio_chip *chip, unsigned offset, | |||
496 | { | 493 | { |
497 | struct as3722_pctrl_info *as_pci = to_as_pci(chip); | 494 | struct as3722_pctrl_info *as_pci = to_as_pci(chip); |
498 | struct as3722 *as3722 = as_pci->as3722; | 495 | struct as3722 *as3722 = as_pci->as3722; |
499 | int en_invert = as_pci->gpio_control[offset].enable_gpio_invert; | 496 | int en_invert; |
500 | u32 val; | 497 | u32 val; |
501 | int ret; | 498 | int ret; |
502 | 499 | ||
500 | ret = as3722_read(as3722, AS3722_GPIOn_CONTROL_REG(offset), &val); | ||
501 | if (ret < 0) { | ||
502 | dev_err(as_pci->dev, | ||
503 | "GPIO_CONTROL%d_REG read failed: %d\n", offset, ret); | ||
504 | return; | ||
505 | } | ||
506 | en_invert = !!(val & AS3722_GPIO_INV); | ||
507 | |||
503 | if (value) | 508 | if (value) |
504 | val = (en_invert) ? 0 : AS3722_GPIOn_SIGNAL(offset); | 509 | val = (en_invert) ? 0 : AS3722_GPIOn_SIGNAL(offset); |
505 | else | 510 | else |
diff --git a/drivers/pinctrl/pinctrl-single.c b/drivers/pinctrl/pinctrl-single.c index 81075f2a1d3f..2960557bfed9 100644 --- a/drivers/pinctrl/pinctrl-single.c +++ b/drivers/pinctrl/pinctrl-single.c | |||
@@ -810,6 +810,7 @@ static const struct pinconf_ops pcs_pinconf_ops = { | |||
810 | static int pcs_add_pin(struct pcs_device *pcs, unsigned offset, | 810 | static int pcs_add_pin(struct pcs_device *pcs, unsigned offset, |
811 | unsigned pin_pos) | 811 | unsigned pin_pos) |
812 | { | 812 | { |
813 | struct pcs_soc_data *pcs_soc = &pcs->socdata; | ||
813 | struct pinctrl_pin_desc *pin; | 814 | struct pinctrl_pin_desc *pin; |
814 | struct pcs_name *pn; | 815 | struct pcs_name *pn; |
815 | int i; | 816 | int i; |
@@ -821,6 +822,18 @@ static int pcs_add_pin(struct pcs_device *pcs, unsigned offset, | |||
821 | return -ENOMEM; | 822 | return -ENOMEM; |
822 | } | 823 | } |
823 | 824 | ||
825 | if (pcs_soc->irq_enable_mask) { | ||
826 | unsigned val; | ||
827 | |||
828 | val = pcs->read(pcs->base + offset); | ||
829 | if (val & pcs_soc->irq_enable_mask) { | ||
830 | dev_dbg(pcs->dev, "irq enabled at boot for pin at %lx (%x), clearing\n", | ||
831 | (unsigned long)pcs->res->start + offset, val); | ||
832 | val &= ~pcs_soc->irq_enable_mask; | ||
833 | pcs->write(val, pcs->base + offset); | ||
834 | } | ||
835 | } | ||
836 | |||
824 | pin = &pcs->pins.pa[i]; | 837 | pin = &pcs->pins.pa[i]; |
825 | pn = &pcs->names[i]; | 838 | pn = &pcs->names[i]; |
826 | sprintf(pn->name, "%lx.%d", | 839 | sprintf(pn->name, "%lx.%d", |
diff --git a/drivers/pinctrl/pinctrl-tb10x.c b/drivers/pinctrl/pinctrl-tb10x.c index c5e0f6973a3b..26ca6855f478 100644 --- a/drivers/pinctrl/pinctrl-tb10x.c +++ b/drivers/pinctrl/pinctrl-tb10x.c | |||
@@ -629,9 +629,8 @@ static int tb10x_gpio_request_enable(struct pinctrl_dev *pctl, | |||
629 | */ | 629 | */ |
630 | for (i = 0; i < state->pinfuncgrpcnt; i++) { | 630 | for (i = 0; i < state->pinfuncgrpcnt; i++) { |
631 | const struct tb10x_pinfuncgrp *pfg = &state->pingroups[i]; | 631 | const struct tb10x_pinfuncgrp *pfg = &state->pingroups[i]; |
632 | unsigned int port = pfg->port; | ||
633 | unsigned int mode = pfg->mode; | 632 | unsigned int mode = pfg->mode; |
634 | int j; | 633 | int j, port = pfg->port; |
635 | 634 | ||
636 | /* | 635 | /* |
637 | * Skip pin groups which are always mapped and don't need | 636 | * Skip pin groups which are always mapped and don't need |
diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7790.c b/drivers/pinctrl/sh-pfc/pfc-r8a7790.c index 48093719167a..f5cd3f961808 100644 --- a/drivers/pinctrl/sh-pfc/pfc-r8a7790.c +++ b/drivers/pinctrl/sh-pfc/pfc-r8a7790.c | |||
@@ -4794,8 +4794,7 @@ static const struct pinmux_cfg_reg pinmux_config_regs[] = { | |||
4794 | FN_MSIOF0_SCK_B, 0, | 4794 | FN_MSIOF0_SCK_B, 0, |
4795 | /* IP5_23_21 [3] */ | 4795 | /* IP5_23_21 [3] */ |
4796 | FN_WE1_N, FN_IERX, FN_CAN1_RX, FN_VI1_G4, | 4796 | FN_WE1_N, FN_IERX, FN_CAN1_RX, FN_VI1_G4, |
4797 | FN_VI1_G4_B, FN_VI2_R6, FN_SCIFA0_CTS_N_B, | 4797 | FN_VI1_G4_B, FN_VI2_R6, FN_SCIFA0_CTS_N_B, FN_IERX_C, |
4798 | FN_IERX_C, 0, | ||
4799 | /* IP5_20_18 [3] */ | 4798 | /* IP5_20_18 [3] */ |
4800 | FN_WE0_N, FN_IECLK, FN_CAN_CLK, | 4799 | FN_WE0_N, FN_IECLK, FN_CAN_CLK, |
4801 | FN_VI2_VSYNC_N, FN_SCIFA0_TXD_B, FN_VI2_VSYNC_N_B, 0, 0, | 4800 | FN_VI2_VSYNC_N, FN_SCIFA0_TXD_B, FN_VI2_VSYNC_N_B, 0, 0, |
diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7791.c b/drivers/pinctrl/sh-pfc/pfc-r8a7791.c index 5186d70c49d4..7868bf3a0f91 100644 --- a/drivers/pinctrl/sh-pfc/pfc-r8a7791.c +++ b/drivers/pinctrl/sh-pfc/pfc-r8a7791.c | |||
@@ -5288,7 +5288,7 @@ static const struct pinmux_cfg_reg pinmux_config_regs[] = { | |||
5288 | /* SEL_SCIF3 [2] */ | 5288 | /* SEL_SCIF3 [2] */ |
5289 | FN_SEL_SCIF3_0, FN_SEL_SCIF3_1, FN_SEL_SCIF3_2, FN_SEL_SCIF3_3, | 5289 | FN_SEL_SCIF3_0, FN_SEL_SCIF3_1, FN_SEL_SCIF3_2, FN_SEL_SCIF3_3, |
5290 | /* SEL_IEB [2] */ | 5290 | /* SEL_IEB [2] */ |
5291 | FN_SEL_IEB_0, FN_SEL_IEB_1, FN_SEL_IEB_2, | 5291 | FN_SEL_IEB_0, FN_SEL_IEB_1, FN_SEL_IEB_2, 0, |
5292 | /* SEL_MMC [1] */ | 5292 | /* SEL_MMC [1] */ |
5293 | FN_SEL_MMC_0, FN_SEL_MMC_1, | 5293 | FN_SEL_MMC_0, FN_SEL_MMC_1, |
5294 | /* SEL_SCIF5 [1] */ | 5294 | /* SEL_SCIF5 [1] */ |
diff --git a/drivers/pnp/quirks.c b/drivers/pnp/quirks.c index 258fef272ea7..3736bc408adb 100644 --- a/drivers/pnp/quirks.c +++ b/drivers/pnp/quirks.c | |||
@@ -15,6 +15,7 @@ | |||
15 | 15 | ||
16 | #include <linux/types.h> | 16 | #include <linux/types.h> |
17 | #include <linux/kernel.h> | 17 | #include <linux/kernel.h> |
18 | #include <linux/pci.h> | ||
18 | #include <linux/string.h> | 19 | #include <linux/string.h> |
19 | #include <linux/slab.h> | 20 | #include <linux/slab.h> |
20 | #include <linux/pnp.h> | 21 | #include <linux/pnp.h> |
@@ -334,6 +335,81 @@ static void quirk_amd_mmconfig_area(struct pnp_dev *dev) | |||
334 | } | 335 | } |
335 | #endif | 336 | #endif |
336 | 337 | ||
338 | #ifdef CONFIG_X86 | ||
339 | /* Device IDs of parts that have 32KB MCH space */ | ||
340 | static const unsigned int mch_quirk_devices[] = { | ||
341 | 0x0154, /* Ivy Bridge */ | ||
342 | 0x0c00, /* Haswell */ | ||
343 | }; | ||
344 | |||
345 | static struct pci_dev *get_intel_host(void) | ||
346 | { | ||
347 | int i; | ||
348 | struct pci_dev *host; | ||
349 | |||
350 | for (i = 0; i < ARRAY_SIZE(mch_quirk_devices); i++) { | ||
351 | host = pci_get_device(PCI_VENDOR_ID_INTEL, mch_quirk_devices[i], | ||
352 | NULL); | ||
353 | if (host) | ||
354 | return host; | ||
355 | } | ||
356 | return NULL; | ||
357 | } | ||
358 | |||
359 | static void quirk_intel_mch(struct pnp_dev *dev) | ||
360 | { | ||
361 | struct pci_dev *host; | ||
362 | u32 addr_lo, addr_hi; | ||
363 | struct pci_bus_region region; | ||
364 | struct resource mch; | ||
365 | struct pnp_resource *pnp_res; | ||
366 | struct resource *res; | ||
367 | |||
368 | host = get_intel_host(); | ||
369 | if (!host) | ||
370 | return; | ||
371 | |||
372 | /* | ||
373 | * MCHBAR is not an architected PCI BAR, so MCH space is usually | ||
374 | * reported as a PNP0C02 resource. The MCH space was originally | ||
375 | * 16KB, but is 32KB in newer parts. Some BIOSes still report a | ||
376 | * PNP0C02 resource that is only 16KB, which means the rest of the | ||
377 | * MCH space is consumed but unreported. | ||
378 | */ | ||
379 | |||
380 | /* | ||
381 | * Read MCHBAR for Host Member Mapped Register Range Base | ||
382 | * https://www-ssl.intel.com/content/www/us/en/processors/core/4th-gen-core-family-desktop-vol-2-datasheet | ||
383 | * Sec 3.1.12. | ||
384 | */ | ||
385 | pci_read_config_dword(host, 0x48, &addr_lo); | ||
386 | region.start = addr_lo & ~0x7fff; | ||
387 | pci_read_config_dword(host, 0x4c, &addr_hi); | ||
388 | region.start |= (u64) addr_hi << 32; | ||
389 | region.end = region.start + 32*1024 - 1; | ||
390 | |||
391 | memset(&mch, 0, sizeof(mch)); | ||
392 | mch.flags = IORESOURCE_MEM; | ||
393 | pcibios_bus_to_resource(host->bus, &mch, ®ion); | ||
394 | |||
395 | list_for_each_entry(pnp_res, &dev->resources, list) { | ||
396 | res = &pnp_res->res; | ||
397 | if (res->end < mch.start || res->start > mch.end) | ||
398 | continue; /* no overlap */ | ||
399 | if (res->start == mch.start && res->end == mch.end) | ||
400 | continue; /* exact match */ | ||
401 | |||
402 | dev_info(&dev->dev, FW_BUG "PNP resource %pR covers only part of %s Intel MCH; extending to %pR\n", | ||
403 | res, pci_name(host), &mch); | ||
404 | res->start = mch.start; | ||
405 | res->end = mch.end; | ||
406 | break; | ||
407 | } | ||
408 | |||
409 | pci_dev_put(host); | ||
410 | } | ||
411 | #endif | ||
412 | |||
337 | /* | 413 | /* |
338 | * PnP Quirks | 414 | * PnP Quirks |
339 | * Cards or devices that need some tweaking due to incomplete resource info | 415 | * Cards or devices that need some tweaking due to incomplete resource info |
@@ -364,6 +440,9 @@ static struct pnp_fixup pnp_fixups[] = { | |||
364 | #ifdef CONFIG_AMD_NB | 440 | #ifdef CONFIG_AMD_NB |
365 | {"PNP0c01", quirk_amd_mmconfig_area}, | 441 | {"PNP0c01", quirk_amd_mmconfig_area}, |
366 | #endif | 442 | #endif |
443 | #ifdef CONFIG_X86 | ||
444 | {"PNP0c02", quirk_intel_mch}, | ||
445 | #endif | ||
367 | {""} | 446 | {""} |
368 | }; | 447 | }; |
369 | 448 | ||
diff --git a/drivers/power/reset/vexpress-poweroff.c b/drivers/power/reset/vexpress-poweroff.c index 476aa495c110..b95cf71ed695 100644 --- a/drivers/power/reset/vexpress-poweroff.c +++ b/drivers/power/reset/vexpress-poweroff.c | |||
@@ -11,7 +11,7 @@ | |||
11 | * Copyright (C) 2012 ARM Limited | 11 | * Copyright (C) 2012 ARM Limited |
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include <linux/jiffies.h> | 14 | #include <linux/delay.h> |
15 | #include <linux/of.h> | 15 | #include <linux/of.h> |
16 | #include <linux/of_device.h> | 16 | #include <linux/of_device.h> |
17 | #include <linux/platform_device.h> | 17 | #include <linux/platform_device.h> |
@@ -23,17 +23,12 @@ | |||
23 | static void vexpress_reset_do(struct device *dev, const char *what) | 23 | static void vexpress_reset_do(struct device *dev, const char *what) |
24 | { | 24 | { |
25 | int err = -ENOENT; | 25 | int err = -ENOENT; |
26 | struct vexpress_config_func *func = | 26 | struct vexpress_config_func *func = dev_get_drvdata(dev); |
27 | vexpress_config_func_get_by_dev(dev); | ||
28 | 27 | ||
29 | if (func) { | 28 | if (func) { |
30 | unsigned long timeout; | ||
31 | |||
32 | err = vexpress_config_write(func, 0, 0); | 29 | err = vexpress_config_write(func, 0, 0); |
33 | 30 | if (!err) | |
34 | timeout = jiffies + HZ; | 31 | mdelay(1000); |
35 | while (time_before(jiffies, timeout)) | ||
36 | cpu_relax(); | ||
37 | } | 32 | } |
38 | 33 | ||
39 | dev_emerg(dev, "Unable to %s (%d)\n", what, err); | 34 | dev_emerg(dev, "Unable to %s (%d)\n", what, err); |
@@ -96,12 +91,18 @@ static int vexpress_reset_probe(struct platform_device *pdev) | |||
96 | enum vexpress_reset_func func; | 91 | enum vexpress_reset_func func; |
97 | const struct of_device_id *match = | 92 | const struct of_device_id *match = |
98 | of_match_device(vexpress_reset_of_match, &pdev->dev); | 93 | of_match_device(vexpress_reset_of_match, &pdev->dev); |
94 | struct vexpress_config_func *config_func; | ||
99 | 95 | ||
100 | if (match) | 96 | if (match) |
101 | func = (enum vexpress_reset_func)match->data; | 97 | func = (enum vexpress_reset_func)match->data; |
102 | else | 98 | else |
103 | func = pdev->id_entry->driver_data; | 99 | func = pdev->id_entry->driver_data; |
104 | 100 | ||
101 | config_func = vexpress_config_func_get_by_dev(&pdev->dev); | ||
102 | if (!config_func) | ||
103 | return -EINVAL; | ||
104 | dev_set_drvdata(&pdev->dev, config_func); | ||
105 | |||
105 | switch (func) { | 106 | switch (func) { |
106 | case FUNC_SHUTDOWN: | 107 | case FUNC_SHUTDOWN: |
107 | vexpress_power_off_device = &pdev->dev; | 108 | vexpress_power_off_device = &pdev->dev; |
diff --git a/drivers/regulator/pbias-regulator.c b/drivers/regulator/pbias-regulator.c index ded3b3574209..6d38be3d970c 100644 --- a/drivers/regulator/pbias-regulator.c +++ b/drivers/regulator/pbias-regulator.c | |||
@@ -38,66 +38,24 @@ struct pbias_reg_info { | |||
38 | struct pbias_regulator_data { | 38 | struct pbias_regulator_data { |
39 | struct regulator_desc desc; | 39 | struct regulator_desc desc; |
40 | void __iomem *pbias_addr; | 40 | void __iomem *pbias_addr; |
41 | unsigned int pbias_reg; | ||
42 | struct regulator_dev *dev; | 41 | struct regulator_dev *dev; |
43 | struct regmap *syscon; | 42 | struct regmap *syscon; |
44 | const struct pbias_reg_info *info; | 43 | const struct pbias_reg_info *info; |
45 | int voltage; | 44 | int voltage; |
46 | }; | 45 | }; |
47 | 46 | ||
48 | static int pbias_regulator_set_voltage(struct regulator_dev *dev, | 47 | static const unsigned int pbias_volt_table[] = { |
49 | int min_uV, int max_uV, unsigned *selector) | 48 | 1800000, |
50 | { | 49 | 3000000 |
51 | struct pbias_regulator_data *data = rdev_get_drvdata(dev); | 50 | }; |
52 | const struct pbias_reg_info *info = data->info; | ||
53 | int ret, vmode; | ||
54 | |||
55 | if (min_uV <= 1800000) | ||
56 | vmode = 0; | ||
57 | else if (min_uV > 1800000) | ||
58 | vmode = info->vmode; | ||
59 | |||
60 | ret = regmap_update_bits(data->syscon, data->pbias_reg, | ||
61 | info->vmode, vmode); | ||
62 | |||
63 | return ret; | ||
64 | } | ||
65 | |||
66 | static int pbias_regulator_get_voltage(struct regulator_dev *rdev) | ||
67 | { | ||
68 | struct pbias_regulator_data *data = rdev_get_drvdata(rdev); | ||
69 | const struct pbias_reg_info *info = data->info; | ||
70 | int value, voltage; | ||
71 | |||
72 | regmap_read(data->syscon, data->pbias_reg, &value); | ||
73 | value &= info->vmode; | ||
74 | |||
75 | voltage = value ? 3000000 : 1800000; | ||
76 | |||
77 | return voltage; | ||
78 | } | ||
79 | 51 | ||
80 | static int pbias_regulator_enable(struct regulator_dev *rdev) | 52 | static int pbias_regulator_enable(struct regulator_dev *rdev) |
81 | { | 53 | { |
82 | struct pbias_regulator_data *data = rdev_get_drvdata(rdev); | 54 | struct pbias_regulator_data *data = rdev_get_drvdata(rdev); |
83 | const struct pbias_reg_info *info = data->info; | 55 | const struct pbias_reg_info *info = data->info; |
84 | int ret; | ||
85 | |||
86 | ret = regmap_update_bits(data->syscon, data->pbias_reg, | ||
87 | info->enable_mask, info->enable); | ||
88 | |||
89 | return ret; | ||
90 | } | ||
91 | |||
92 | static int pbias_regulator_disable(struct regulator_dev *rdev) | ||
93 | { | ||
94 | struct pbias_regulator_data *data = rdev_get_drvdata(rdev); | ||
95 | const struct pbias_reg_info *info = data->info; | ||
96 | int ret; | ||
97 | 56 | ||
98 | ret = regmap_update_bits(data->syscon, data->pbias_reg, | 57 | return regmap_update_bits(data->syscon, rdev->desc->enable_reg, |
99 | info->enable_mask, 0); | 58 | info->enable_mask, info->enable); |
100 | return ret; | ||
101 | } | 59 | } |
102 | 60 | ||
103 | static int pbias_regulator_is_enable(struct regulator_dev *rdev) | 61 | static int pbias_regulator_is_enable(struct regulator_dev *rdev) |
@@ -106,17 +64,18 @@ static int pbias_regulator_is_enable(struct regulator_dev *rdev) | |||
106 | const struct pbias_reg_info *info = data->info; | 64 | const struct pbias_reg_info *info = data->info; |
107 | int value; | 65 | int value; |
108 | 66 | ||
109 | regmap_read(data->syscon, data->pbias_reg, &value); | 67 | regmap_read(data->syscon, rdev->desc->enable_reg, &value); |
110 | 68 | ||
111 | return (value & info->enable_mask) == info->enable_mask; | 69 | return (value & info->enable_mask) == info->enable; |
112 | } | 70 | } |
113 | 71 | ||
114 | static struct regulator_ops pbias_regulator_voltage_ops = { | 72 | static struct regulator_ops pbias_regulator_voltage_ops = { |
115 | .set_voltage = pbias_regulator_set_voltage, | 73 | .list_voltage = regulator_list_voltage_table, |
116 | .get_voltage = pbias_regulator_get_voltage, | 74 | .get_voltage_sel = regulator_get_voltage_sel_regmap, |
117 | .enable = pbias_regulator_enable, | 75 | .set_voltage_sel = regulator_set_voltage_sel_regmap, |
118 | .disable = pbias_regulator_disable, | 76 | .enable = pbias_regulator_enable, |
119 | .is_enabled = pbias_regulator_is_enable, | 77 | .disable = regulator_disable_regmap, |
78 | .is_enabled = pbias_regulator_is_enable, | ||
120 | }; | 79 | }; |
121 | 80 | ||
122 | static const struct pbias_reg_info pbias_mmc_omap2430 = { | 81 | static const struct pbias_reg_info pbias_mmc_omap2430 = { |
@@ -192,6 +151,7 @@ static int pbias_regulator_probe(struct platform_device *pdev) | |||
192 | if (IS_ERR(syscon)) | 151 | if (IS_ERR(syscon)) |
193 | return PTR_ERR(syscon); | 152 | return PTR_ERR(syscon); |
194 | 153 | ||
154 | cfg.regmap = syscon; | ||
195 | cfg.dev = &pdev->dev; | 155 | cfg.dev = &pdev->dev; |
196 | 156 | ||
197 | for (idx = 0; idx < PBIAS_NUM_REGS && data_idx < count; idx++) { | 157 | for (idx = 0; idx < PBIAS_NUM_REGS && data_idx < count; idx++) { |
@@ -207,15 +167,19 @@ static int pbias_regulator_probe(struct platform_device *pdev) | |||
207 | if (!res) | 167 | if (!res) |
208 | return -EINVAL; | 168 | return -EINVAL; |
209 | 169 | ||
210 | drvdata[data_idx].pbias_reg = res->start; | ||
211 | drvdata[data_idx].syscon = syscon; | 170 | drvdata[data_idx].syscon = syscon; |
212 | drvdata[data_idx].info = info; | 171 | drvdata[data_idx].info = info; |
213 | drvdata[data_idx].desc.name = info->name; | 172 | drvdata[data_idx].desc.name = info->name; |
214 | drvdata[data_idx].desc.owner = THIS_MODULE; | 173 | drvdata[data_idx].desc.owner = THIS_MODULE; |
215 | drvdata[data_idx].desc.type = REGULATOR_VOLTAGE; | 174 | drvdata[data_idx].desc.type = REGULATOR_VOLTAGE; |
216 | drvdata[data_idx].desc.ops = &pbias_regulator_voltage_ops; | 175 | drvdata[data_idx].desc.ops = &pbias_regulator_voltage_ops; |
176 | drvdata[data_idx].desc.volt_table = pbias_volt_table; | ||
217 | drvdata[data_idx].desc.n_voltages = 2; | 177 | drvdata[data_idx].desc.n_voltages = 2; |
218 | drvdata[data_idx].desc.enable_time = info->enable_time; | 178 | drvdata[data_idx].desc.enable_time = info->enable_time; |
179 | drvdata[data_idx].desc.vsel_reg = res->start; | ||
180 | drvdata[data_idx].desc.vsel_mask = info->vmode; | ||
181 | drvdata[data_idx].desc.enable_reg = res->start; | ||
182 | drvdata[data_idx].desc.enable_mask = info->enable_mask; | ||
219 | 183 | ||
220 | cfg.init_data = pbias_matches[idx].init_data; | 184 | cfg.init_data = pbias_matches[idx].init_data; |
221 | cfg.driver_data = &drvdata[data_idx]; | 185 | cfg.driver_data = &drvdata[data_idx]; |
diff --git a/drivers/s390/cio/chsc.c b/drivers/s390/cio/chsc.c index 9f0ea6cb6922..e3bf885f4a6c 100644 --- a/drivers/s390/cio/chsc.c +++ b/drivers/s390/cio/chsc.c | |||
@@ -541,18 +541,27 @@ static void chsc_process_sei_nt0(struct chsc_sei_nt0_area *sei_area) | |||
541 | 541 | ||
542 | static void chsc_process_event_information(struct chsc_sei *sei, u64 ntsm) | 542 | static void chsc_process_event_information(struct chsc_sei *sei, u64 ntsm) |
543 | { | 543 | { |
544 | do { | 544 | static int ntsm_unsupported; |
545 | |||
546 | while (true) { | ||
545 | memset(sei, 0, sizeof(*sei)); | 547 | memset(sei, 0, sizeof(*sei)); |
546 | sei->request.length = 0x0010; | 548 | sei->request.length = 0x0010; |
547 | sei->request.code = 0x000e; | 549 | sei->request.code = 0x000e; |
548 | sei->ntsm = ntsm; | 550 | if (!ntsm_unsupported) |
551 | sei->ntsm = ntsm; | ||
549 | 552 | ||
550 | if (chsc(sei)) | 553 | if (chsc(sei)) |
551 | break; | 554 | break; |
552 | 555 | ||
553 | if (sei->response.code != 0x0001) { | 556 | if (sei->response.code != 0x0001) { |
554 | CIO_CRW_EVENT(2, "chsc: sei failed (rc=%04x)\n", | 557 | CIO_CRW_EVENT(2, "chsc: sei failed (rc=%04x, ntsm=%llx)\n", |
555 | sei->response.code); | 558 | sei->response.code, sei->ntsm); |
559 | |||
560 | if (sei->response.code == 3 && sei->ntsm) { | ||
561 | /* Fallback for old firmware. */ | ||
562 | ntsm_unsupported = 1; | ||
563 | continue; | ||
564 | } | ||
556 | break; | 565 | break; |
557 | } | 566 | } |
558 | 567 | ||
@@ -568,7 +577,10 @@ static void chsc_process_event_information(struct chsc_sei *sei, u64 ntsm) | |||
568 | CIO_CRW_EVENT(2, "chsc: unhandled nt: %d\n", sei->nt); | 577 | CIO_CRW_EVENT(2, "chsc: unhandled nt: %d\n", sei->nt); |
569 | break; | 578 | break; |
570 | } | 579 | } |
571 | } while (sei->u.nt0_area.flags & 0x80); | 580 | |
581 | if (!(sei->u.nt0_area.flags & 0x80)) | ||
582 | break; | ||
583 | } | ||
572 | } | 584 | } |
573 | 585 | ||
574 | /* | 586 | /* |
diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c index 8cf4a0c69baf..9a6e4a2cd072 100644 --- a/drivers/scsi/hpsa.c +++ b/drivers/scsi/hpsa.c | |||
@@ -7463,6 +7463,10 @@ static void hpsa_put_ctlr_into_performant_mode(struct ctlr_info *h) | |||
7463 | if (hpsa_simple_mode) | 7463 | if (hpsa_simple_mode) |
7464 | return; | 7464 | return; |
7465 | 7465 | ||
7466 | trans_support = readl(&(h->cfgtable->TransportSupport)); | ||
7467 | if (!(trans_support & PERFORMANT_MODE)) | ||
7468 | return; | ||
7469 | |||
7466 | /* Check for I/O accelerator mode support */ | 7470 | /* Check for I/O accelerator mode support */ |
7467 | if (trans_support & CFGTBL_Trans_io_accel1) { | 7471 | if (trans_support & CFGTBL_Trans_io_accel1) { |
7468 | transMethod |= CFGTBL_Trans_io_accel1 | | 7472 | transMethod |= CFGTBL_Trans_io_accel1 | |
@@ -7479,10 +7483,6 @@ static void hpsa_put_ctlr_into_performant_mode(struct ctlr_info *h) | |||
7479 | } | 7483 | } |
7480 | 7484 | ||
7481 | /* TODO, check that this next line h->nreply_queues is correct */ | 7485 | /* TODO, check that this next line h->nreply_queues is correct */ |
7482 | trans_support = readl(&(h->cfgtable->TransportSupport)); | ||
7483 | if (!(trans_support & PERFORMANT_MODE)) | ||
7484 | return; | ||
7485 | |||
7486 | h->nreply_queues = h->msix_vector > 0 ? h->msix_vector : 1; | 7486 | h->nreply_queues = h->msix_vector > 0 ? h->msix_vector : 1; |
7487 | hpsa_get_max_perf_mode_cmds(h); | 7487 | hpsa_get_max_perf_mode_cmds(h); |
7488 | /* Performant mode ring buffer and supporting data structures */ | 7488 | /* Performant mode ring buffer and supporting data structures */ |
diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c index 771c16bfdbac..f17aa7aa7879 100644 --- a/drivers/scsi/scsi_error.c +++ b/drivers/scsi/scsi_error.c | |||
@@ -189,6 +189,7 @@ scsi_abort_command(struct scsi_cmnd *scmd) | |||
189 | /* | 189 | /* |
190 | * Retry after abort failed, escalate to next level. | 190 | * Retry after abort failed, escalate to next level. |
191 | */ | 191 | */ |
192 | scmd->eh_eflags &= ~SCSI_EH_ABORT_SCHEDULED; | ||
192 | SCSI_LOG_ERROR_RECOVERY(3, | 193 | SCSI_LOG_ERROR_RECOVERY(3, |
193 | scmd_printk(KERN_INFO, scmd, | 194 | scmd_printk(KERN_INFO, scmd, |
194 | "scmd %p previous abort failed\n", scmd)); | 195 | "scmd %p previous abort failed\n", scmd)); |
@@ -920,10 +921,12 @@ void scsi_eh_prep_cmnd(struct scsi_cmnd *scmd, struct scsi_eh_save *ses, | |||
920 | ses->prot_op = scmd->prot_op; | 921 | ses->prot_op = scmd->prot_op; |
921 | 922 | ||
922 | scmd->prot_op = SCSI_PROT_NORMAL; | 923 | scmd->prot_op = SCSI_PROT_NORMAL; |
924 | scmd->eh_eflags = 0; | ||
923 | scmd->cmnd = ses->eh_cmnd; | 925 | scmd->cmnd = ses->eh_cmnd; |
924 | memset(scmd->cmnd, 0, BLK_MAX_CDB); | 926 | memset(scmd->cmnd, 0, BLK_MAX_CDB); |
925 | memset(&scmd->sdb, 0, sizeof(scmd->sdb)); | 927 | memset(&scmd->sdb, 0, sizeof(scmd->sdb)); |
926 | scmd->request->next_rq = NULL; | 928 | scmd->request->next_rq = NULL; |
929 | scmd->result = 0; | ||
927 | 930 | ||
928 | if (sense_bytes) { | 931 | if (sense_bytes) { |
929 | scmd->sdb.length = min_t(unsigned, SCSI_SENSE_BUFFERSIZE, | 932 | scmd->sdb.length = min_t(unsigned, SCSI_SENSE_BUFFERSIZE, |
@@ -1157,6 +1160,15 @@ int scsi_eh_get_sense(struct list_head *work_q, | |||
1157 | __func__)); | 1160 | __func__)); |
1158 | break; | 1161 | break; |
1159 | } | 1162 | } |
1163 | if (status_byte(scmd->result) != CHECK_CONDITION) | ||
1164 | /* | ||
1165 | * don't request sense if there's no check condition | ||
1166 | * status because the error we're processing isn't one | ||
1167 | * that has a sense code (and some devices get | ||
1168 | * confused by sense requests out of the blue) | ||
1169 | */ | ||
1170 | continue; | ||
1171 | |||
1160 | SCSI_LOG_ERROR_RECOVERY(2, scmd_printk(KERN_INFO, scmd, | 1172 | SCSI_LOG_ERROR_RECOVERY(2, scmd_printk(KERN_INFO, scmd, |
1161 | "%s: requesting sense\n", | 1173 | "%s: requesting sense\n", |
1162 | current->comm)); | 1174 | current->comm)); |
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 65a123d9c676..9db097a28a74 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c | |||
@@ -137,6 +137,7 @@ static void __scsi_queue_insert(struct scsi_cmnd *cmd, int reason, int unbusy) | |||
137 | * lock such that the kblockd_schedule_work() call happens | 137 | * lock such that the kblockd_schedule_work() call happens |
138 | * before blk_cleanup_queue() finishes. | 138 | * before blk_cleanup_queue() finishes. |
139 | */ | 139 | */ |
140 | cmd->result = 0; | ||
140 | spin_lock_irqsave(q->queue_lock, flags); | 141 | spin_lock_irqsave(q->queue_lock, flags); |
141 | blk_requeue_request(q, cmd->request); | 142 | blk_requeue_request(q, cmd->request); |
142 | kblockd_schedule_work(q, &device->requeue_work); | 143 | kblockd_schedule_work(q, &device->requeue_work); |
@@ -1044,6 +1045,7 @@ static int scsi_init_sgtable(struct request *req, struct scsi_data_buffer *sdb, | |||
1044 | */ | 1045 | */ |
1045 | int scsi_init_io(struct scsi_cmnd *cmd, gfp_t gfp_mask) | 1046 | int scsi_init_io(struct scsi_cmnd *cmd, gfp_t gfp_mask) |
1046 | { | 1047 | { |
1048 | struct scsi_device *sdev = cmd->device; | ||
1047 | struct request *rq = cmd->request; | 1049 | struct request *rq = cmd->request; |
1048 | 1050 | ||
1049 | int error = scsi_init_sgtable(rq, &cmd->sdb, gfp_mask); | 1051 | int error = scsi_init_sgtable(rq, &cmd->sdb, gfp_mask); |
@@ -1091,7 +1093,7 @@ err_exit: | |||
1091 | scsi_release_buffers(cmd); | 1093 | scsi_release_buffers(cmd); |
1092 | cmd->request->special = NULL; | 1094 | cmd->request->special = NULL; |
1093 | scsi_put_command(cmd); | 1095 | scsi_put_command(cmd); |
1094 | put_device(&cmd->device->sdev_gendev); | 1096 | put_device(&sdev->sdev_gendev); |
1095 | return error; | 1097 | return error; |
1096 | } | 1098 | } |
1097 | EXPORT_SYMBOL(scsi_init_io); | 1099 | EXPORT_SYMBOL(scsi_init_io); |
@@ -1273,7 +1275,7 @@ int scsi_prep_return(struct request_queue *q, struct request *req, int ret) | |||
1273 | struct scsi_cmnd *cmd = req->special; | 1275 | struct scsi_cmnd *cmd = req->special; |
1274 | scsi_release_buffers(cmd); | 1276 | scsi_release_buffers(cmd); |
1275 | scsi_put_command(cmd); | 1277 | scsi_put_command(cmd); |
1276 | put_device(&cmd->device->sdev_gendev); | 1278 | put_device(&sdev->sdev_gendev); |
1277 | req->special = NULL; | 1279 | req->special = NULL; |
1278 | } | 1280 | } |
1279 | break; | 1281 | break; |
diff --git a/drivers/spi/spi-atmel.c b/drivers/spi/spi-atmel.c index 8005f9869481..079e6b1b0cdb 100644 --- a/drivers/spi/spi-atmel.c +++ b/drivers/spi/spi-atmel.c | |||
@@ -1115,8 +1115,11 @@ static int atmel_spi_one_transfer(struct spi_master *master, | |||
1115 | atmel_spi_next_xfer_pio(master, xfer); | 1115 | atmel_spi_next_xfer_pio(master, xfer); |
1116 | } | 1116 | } |
1117 | 1117 | ||
1118 | /* interrupts are disabled, so free the lock for schedule */ | ||
1119 | atmel_spi_unlock(as); | ||
1118 | ret = wait_for_completion_timeout(&as->xfer_completion, | 1120 | ret = wait_for_completion_timeout(&as->xfer_completion, |
1119 | SPI_DMA_TIMEOUT); | 1121 | SPI_DMA_TIMEOUT); |
1122 | atmel_spi_lock(as); | ||
1120 | if (WARN_ON(ret == 0)) { | 1123 | if (WARN_ON(ret == 0)) { |
1121 | dev_err(&spi->dev, | 1124 | dev_err(&spi->dev, |
1122 | "spi trasfer timeout, err %d\n", ret); | 1125 | "spi trasfer timeout, err %d\n", ret); |
diff --git a/drivers/spi/spi-bfin5xx.c b/drivers/spi/spi-bfin5xx.c index 55e57c3eb9bd..ebf720b88a2a 100644 --- a/drivers/spi/spi-bfin5xx.c +++ b/drivers/spi/spi-bfin5xx.c | |||
@@ -12,6 +12,7 @@ | |||
12 | #include <linux/module.h> | 12 | #include <linux/module.h> |
13 | #include <linux/delay.h> | 13 | #include <linux/delay.h> |
14 | #include <linux/device.h> | 14 | #include <linux/device.h> |
15 | #include <linux/gpio.h> | ||
15 | #include <linux/slab.h> | 16 | #include <linux/slab.h> |
16 | #include <linux/io.h> | 17 | #include <linux/io.h> |
17 | #include <linux/ioport.h> | 18 | #include <linux/ioport.h> |
diff --git a/drivers/spi/spi-sh-hspi.c b/drivers/spi/spi-sh-hspi.c index 9009456bdf4d..c8e795ef2e13 100644 --- a/drivers/spi/spi-sh-hspi.c +++ b/drivers/spi/spi-sh-hspi.c | |||
@@ -244,9 +244,9 @@ static int hspi_probe(struct platform_device *pdev) | |||
244 | return -ENOMEM; | 244 | return -ENOMEM; |
245 | } | 245 | } |
246 | 246 | ||
247 | clk = clk_get(NULL, "shyway_clk"); | 247 | clk = clk_get(&pdev->dev, NULL); |
248 | if (IS_ERR(clk)) { | 248 | if (IS_ERR(clk)) { |
249 | dev_err(&pdev->dev, "shyway_clk is required\n"); | 249 | dev_err(&pdev->dev, "couldn't get clock\n"); |
250 | ret = -EINVAL; | 250 | ret = -EINVAL; |
251 | goto error0; | 251 | goto error0; |
252 | } | 252 | } |
diff --git a/drivers/spi/spi-sirf.c b/drivers/spi/spi-sirf.c index 1a77ad52812f..67d8909dcf39 100644 --- a/drivers/spi/spi-sirf.c +++ b/drivers/spi/spi-sirf.c | |||
@@ -287,8 +287,8 @@ static irqreturn_t spi_sirfsoc_irq(int irq, void *dev_id) | |||
287 | sspi->left_rx_word) | 287 | sspi->left_rx_word) |
288 | sspi->rx_word(sspi); | 288 | sspi->rx_word(sspi); |
289 | 289 | ||
290 | if (spi_stat & (SIRFSOC_SPI_FIFO_EMPTY | 290 | if (spi_stat & (SIRFSOC_SPI_TXFIFO_EMPTY | |
291 | | SIRFSOC_SPI_TXFIFO_THD_REACH)) | 291 | SIRFSOC_SPI_TXFIFO_THD_REACH)) |
292 | while (!((readl(sspi->base + SIRFSOC_SPI_TXFIFO_STATUS) | 292 | while (!((readl(sspi->base + SIRFSOC_SPI_TXFIFO_STATUS) |
293 | & SIRFSOC_SPI_FIFO_FULL)) && | 293 | & SIRFSOC_SPI_FIFO_FULL)) && |
294 | sspi->left_tx_word) | 294 | sspi->left_tx_word) |
@@ -470,7 +470,16 @@ static void spi_sirfsoc_chipselect(struct spi_device *spi, int value) | |||
470 | writel(regval, sspi->base + SIRFSOC_SPI_CTRL); | 470 | writel(regval, sspi->base + SIRFSOC_SPI_CTRL); |
471 | } else { | 471 | } else { |
472 | int gpio = sspi->chipselect[spi->chip_select]; | 472 | int gpio = sspi->chipselect[spi->chip_select]; |
473 | gpio_direction_output(gpio, spi->mode & SPI_CS_HIGH ? 0 : 1); | 473 | switch (value) { |
474 | case BITBANG_CS_ACTIVE: | ||
475 | gpio_direction_output(gpio, | ||
476 | spi->mode & SPI_CS_HIGH ? 1 : 0); | ||
477 | break; | ||
478 | case BITBANG_CS_INACTIVE: | ||
479 | gpio_direction_output(gpio, | ||
480 | spi->mode & SPI_CS_HIGH ? 0 : 1); | ||
481 | break; | ||
482 | } | ||
474 | } | 483 | } |
475 | } | 484 | } |
476 | 485 | ||
@@ -559,6 +568,11 @@ spi_sirfsoc_setup_transfer(struct spi_device *spi, struct spi_transfer *t) | |||
559 | regval &= ~SIRFSOC_SPI_CMD_MODE; | 568 | regval &= ~SIRFSOC_SPI_CMD_MODE; |
560 | sspi->tx_by_cmd = false; | 569 | sspi->tx_by_cmd = false; |
561 | } | 570 | } |
571 | /* | ||
572 | * set spi controller in RISC chipselect mode, we are controlling CS by | ||
573 | * software BITBANG_CS_ACTIVE and BITBANG_CS_INACTIVE. | ||
574 | */ | ||
575 | regval |= SIRFSOC_SPI_CS_IO_MODE; | ||
562 | writel(regval, sspi->base + SIRFSOC_SPI_CTRL); | 576 | writel(regval, sspi->base + SIRFSOC_SPI_CTRL); |
563 | 577 | ||
564 | if (IS_DMA_VALID(t)) { | 578 | if (IS_DMA_VALID(t)) { |
diff --git a/drivers/staging/comedi/drivers/usbdux.c b/drivers/staging/comedi/drivers/usbdux.c index 71db683098d6..b59af0303581 100644 --- a/drivers/staging/comedi/drivers/usbdux.c +++ b/drivers/staging/comedi/drivers/usbdux.c | |||
@@ -493,7 +493,7 @@ static void usbduxsub_ao_isoc_irq(struct urb *urb) | |||
493 | /* pointer to the DA */ | 493 | /* pointer to the DA */ |
494 | *datap++ = val & 0xff; | 494 | *datap++ = val & 0xff; |
495 | *datap++ = (val >> 8) & 0xff; | 495 | *datap++ = (val >> 8) & 0xff; |
496 | *datap++ = chan; | 496 | *datap++ = chan << 6; |
497 | devpriv->ao_readback[chan] = val; | 497 | devpriv->ao_readback[chan] = val; |
498 | 498 | ||
499 | s->async->events |= COMEDI_CB_BLOCK; | 499 | s->async->events |= COMEDI_CB_BLOCK; |
@@ -1040,11 +1040,8 @@ static int usbdux_ao_cmd(struct comedi_device *dev, struct comedi_subdevice *s) | |||
1040 | /* set current channel of the running acquisition to zero */ | 1040 | /* set current channel of the running acquisition to zero */ |
1041 | s->async->cur_chan = 0; | 1041 | s->async->cur_chan = 0; |
1042 | 1042 | ||
1043 | for (i = 0; i < cmd->chanlist_len; ++i) { | 1043 | for (i = 0; i < cmd->chanlist_len; ++i) |
1044 | unsigned int chan = CR_CHAN(cmd->chanlist[i]); | 1044 | devpriv->ao_chanlist[i] = CR_CHAN(cmd->chanlist[i]); |
1045 | |||
1046 | devpriv->ao_chanlist[i] = chan << 6; | ||
1047 | } | ||
1048 | 1045 | ||
1049 | /* we count in steps of 1ms (125us) */ | 1046 | /* we count in steps of 1ms (125us) */ |
1050 | /* 125us mode not used yet */ | 1047 | /* 125us mode not used yet */ |
diff --git a/drivers/staging/iio/adc/mxs-lradc.c b/drivers/staging/iio/adc/mxs-lradc.c index 11fb95201545..dae8d1a9038e 100644 --- a/drivers/staging/iio/adc/mxs-lradc.c +++ b/drivers/staging/iio/adc/mxs-lradc.c | |||
@@ -1526,7 +1526,7 @@ static int mxs_lradc_probe(struct platform_device *pdev) | |||
1526 | struct resource *iores; | 1526 | struct resource *iores; |
1527 | int ret = 0, touch_ret; | 1527 | int ret = 0, touch_ret; |
1528 | int i, s; | 1528 | int i, s; |
1529 | unsigned int scale_uv; | 1529 | uint64_t scale_uv; |
1530 | 1530 | ||
1531 | /* Allocate the IIO device. */ | 1531 | /* Allocate the IIO device. */ |
1532 | iio = devm_iio_device_alloc(dev, sizeof(*lradc)); | 1532 | iio = devm_iio_device_alloc(dev, sizeof(*lradc)); |
diff --git a/drivers/staging/iio/resolver/ad2s1200.c b/drivers/staging/iio/resolver/ad2s1200.c index 36eedd8a0ea9..e2b482045158 100644 --- a/drivers/staging/iio/resolver/ad2s1200.c +++ b/drivers/staging/iio/resolver/ad2s1200.c | |||
@@ -70,6 +70,7 @@ static int ad2s1200_read_raw(struct iio_dev *indio_dev, | |||
70 | vel = (((s16)(st->rx[0])) << 4) | ((st->rx[1] & 0xF0) >> 4); | 70 | vel = (((s16)(st->rx[0])) << 4) | ((st->rx[1] & 0xF0) >> 4); |
71 | vel = (vel << 4) >> 4; | 71 | vel = (vel << 4) >> 4; |
72 | *val = vel; | 72 | *val = vel; |
73 | break; | ||
73 | default: | 74 | default: |
74 | mutex_unlock(&st->lock); | 75 | mutex_unlock(&st->lock); |
75 | return -EINVAL; | 76 | return -EINVAL; |
diff --git a/drivers/tty/serial/8250/8250_core.c b/drivers/tty/serial/8250/8250_core.c index 81f909c2101f..0e1bf8858431 100644 --- a/drivers/tty/serial/8250/8250_core.c +++ b/drivers/tty/serial/8250/8250_core.c | |||
@@ -1520,7 +1520,7 @@ int serial8250_handle_irq(struct uart_port *port, unsigned int iir) | |||
1520 | status = serial8250_rx_chars(up, status); | 1520 | status = serial8250_rx_chars(up, status); |
1521 | } | 1521 | } |
1522 | serial8250_modem_status(up); | 1522 | serial8250_modem_status(up); |
1523 | if (status & UART_LSR_THRE) | 1523 | if (!up->dma && (status & UART_LSR_THRE)) |
1524 | serial8250_tx_chars(up); | 1524 | serial8250_tx_chars(up); |
1525 | 1525 | ||
1526 | spin_unlock_irqrestore(&port->lock, flags); | 1526 | spin_unlock_irqrestore(&port->lock, flags); |
diff --git a/drivers/tty/serial/8250/8250_dma.c b/drivers/tty/serial/8250/8250_dma.c index 7046769608d4..ab9096dc3849 100644 --- a/drivers/tty/serial/8250/8250_dma.c +++ b/drivers/tty/serial/8250/8250_dma.c | |||
@@ -20,12 +20,15 @@ static void __dma_tx_complete(void *param) | |||
20 | struct uart_8250_port *p = param; | 20 | struct uart_8250_port *p = param; |
21 | struct uart_8250_dma *dma = p->dma; | 21 | struct uart_8250_dma *dma = p->dma; |
22 | struct circ_buf *xmit = &p->port.state->xmit; | 22 | struct circ_buf *xmit = &p->port.state->xmit; |
23 | 23 | unsigned long flags; | |
24 | dma->tx_running = 0; | ||
25 | 24 | ||
26 | dma_sync_single_for_cpu(dma->txchan->device->dev, dma->tx_addr, | 25 | dma_sync_single_for_cpu(dma->txchan->device->dev, dma->tx_addr, |
27 | UART_XMIT_SIZE, DMA_TO_DEVICE); | 26 | UART_XMIT_SIZE, DMA_TO_DEVICE); |
28 | 27 | ||
28 | spin_lock_irqsave(&p->port.lock, flags); | ||
29 | |||
30 | dma->tx_running = 0; | ||
31 | |||
29 | xmit->tail += dma->tx_size; | 32 | xmit->tail += dma->tx_size; |
30 | xmit->tail &= UART_XMIT_SIZE - 1; | 33 | xmit->tail &= UART_XMIT_SIZE - 1; |
31 | p->port.icount.tx += dma->tx_size; | 34 | p->port.icount.tx += dma->tx_size; |
@@ -35,6 +38,8 @@ static void __dma_tx_complete(void *param) | |||
35 | 38 | ||
36 | if (!uart_circ_empty(xmit) && !uart_tx_stopped(&p->port)) | 39 | if (!uart_circ_empty(xmit) && !uart_tx_stopped(&p->port)) |
37 | serial8250_tx_dma(p); | 40 | serial8250_tx_dma(p); |
41 | |||
42 | spin_unlock_irqrestore(&p->port.lock, flags); | ||
38 | } | 43 | } |
39 | 44 | ||
40 | static void __dma_rx_complete(void *param) | 45 | static void __dma_rx_complete(void *param) |
diff --git a/drivers/tty/serial/samsung.c b/drivers/tty/serial/samsung.c index 23f459600738..1f5505e7f90d 100644 --- a/drivers/tty/serial/samsung.c +++ b/drivers/tty/serial/samsung.c | |||
@@ -1446,8 +1446,8 @@ static int s3c24xx_serial_get_poll_char(struct uart_port *port) | |||
1446 | static void s3c24xx_serial_put_poll_char(struct uart_port *port, | 1446 | static void s3c24xx_serial_put_poll_char(struct uart_port *port, |
1447 | unsigned char c) | 1447 | unsigned char c) |
1448 | { | 1448 | { |
1449 | unsigned int ufcon = rd_regl(cons_uart, S3C2410_UFCON); | 1449 | unsigned int ufcon = rd_regl(port, S3C2410_UFCON); |
1450 | unsigned int ucon = rd_regl(cons_uart, S3C2410_UCON); | 1450 | unsigned int ucon = rd_regl(port, S3C2410_UCON); |
1451 | 1451 | ||
1452 | /* not possible to xmit on unconfigured port */ | 1452 | /* not possible to xmit on unconfigured port */ |
1453 | if (!s3c24xx_port_configured(ucon)) | 1453 | if (!s3c24xx_port_configured(ucon)) |
@@ -1455,7 +1455,7 @@ static void s3c24xx_serial_put_poll_char(struct uart_port *port, | |||
1455 | 1455 | ||
1456 | while (!s3c24xx_serial_console_txrdy(port, ufcon)) | 1456 | while (!s3c24xx_serial_console_txrdy(port, ufcon)) |
1457 | cpu_relax(); | 1457 | cpu_relax(); |
1458 | wr_regb(cons_uart, S3C2410_UTXH, c); | 1458 | wr_regb(port, S3C2410_UTXH, c); |
1459 | } | 1459 | } |
1460 | 1460 | ||
1461 | #endif /* CONFIG_CONSOLE_POLL */ | 1461 | #endif /* CONFIG_CONSOLE_POLL */ |
@@ -1463,22 +1463,23 @@ static void s3c24xx_serial_put_poll_char(struct uart_port *port, | |||
1463 | static void | 1463 | static void |
1464 | s3c24xx_serial_console_putchar(struct uart_port *port, int ch) | 1464 | s3c24xx_serial_console_putchar(struct uart_port *port, int ch) |
1465 | { | 1465 | { |
1466 | unsigned int ufcon = rd_regl(cons_uart, S3C2410_UFCON); | 1466 | unsigned int ufcon = rd_regl(port, S3C2410_UFCON); |
1467 | unsigned int ucon = rd_regl(cons_uart, S3C2410_UCON); | ||
1468 | |||
1469 | /* not possible to xmit on unconfigured port */ | ||
1470 | if (!s3c24xx_port_configured(ucon)) | ||
1471 | return; | ||
1472 | 1467 | ||
1473 | while (!s3c24xx_serial_console_txrdy(port, ufcon)) | 1468 | while (!s3c24xx_serial_console_txrdy(port, ufcon)) |
1474 | barrier(); | 1469 | cpu_relax(); |
1475 | wr_regb(cons_uart, S3C2410_UTXH, ch); | 1470 | wr_regb(port, S3C2410_UTXH, ch); |
1476 | } | 1471 | } |
1477 | 1472 | ||
1478 | static void | 1473 | static void |
1479 | s3c24xx_serial_console_write(struct console *co, const char *s, | 1474 | s3c24xx_serial_console_write(struct console *co, const char *s, |
1480 | unsigned int count) | 1475 | unsigned int count) |
1481 | { | 1476 | { |
1477 | unsigned int ucon = rd_regl(cons_uart, S3C2410_UCON); | ||
1478 | |||
1479 | /* not possible to xmit on unconfigured port */ | ||
1480 | if (!s3c24xx_port_configured(ucon)) | ||
1481 | return; | ||
1482 | |||
1482 | uart_console_write(cons_uart, s, count, s3c24xx_serial_console_putchar); | 1483 | uart_console_write(cons_uart, s, count, s3c24xx_serial_console_putchar); |
1483 | } | 1484 | } |
1484 | 1485 | ||
diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c index f26834d262b3..b68550d95a40 100644 --- a/drivers/tty/serial/serial_core.c +++ b/drivers/tty/serial/serial_core.c | |||
@@ -137,6 +137,11 @@ static int uart_port_startup(struct tty_struct *tty, struct uart_state *state, | |||
137 | return 1; | 137 | return 1; |
138 | 138 | ||
139 | /* | 139 | /* |
140 | * Make sure the device is in D0 state. | ||
141 | */ | ||
142 | uart_change_pm(state, UART_PM_STATE_ON); | ||
143 | |||
144 | /* | ||
140 | * Initialise and allocate the transmit and temporary | 145 | * Initialise and allocate the transmit and temporary |
141 | * buffer. | 146 | * buffer. |
142 | */ | 147 | */ |
@@ -825,25 +830,29 @@ static int uart_set_info(struct tty_struct *tty, struct tty_port *port, | |||
825 | * If we fail to request resources for the | 830 | * If we fail to request resources for the |
826 | * new port, try to restore the old settings. | 831 | * new port, try to restore the old settings. |
827 | */ | 832 | */ |
828 | if (retval && old_type != PORT_UNKNOWN) { | 833 | if (retval) { |
829 | uport->iobase = old_iobase; | 834 | uport->iobase = old_iobase; |
830 | uport->type = old_type; | 835 | uport->type = old_type; |
831 | uport->hub6 = old_hub6; | 836 | uport->hub6 = old_hub6; |
832 | uport->iotype = old_iotype; | 837 | uport->iotype = old_iotype; |
833 | uport->regshift = old_shift; | 838 | uport->regshift = old_shift; |
834 | uport->mapbase = old_mapbase; | 839 | uport->mapbase = old_mapbase; |
835 | retval = uport->ops->request_port(uport); | ||
836 | /* | ||
837 | * If we failed to restore the old settings, | ||
838 | * we fail like this. | ||
839 | */ | ||
840 | if (retval) | ||
841 | uport->type = PORT_UNKNOWN; | ||
842 | 840 | ||
843 | /* | 841 | if (old_type != PORT_UNKNOWN) { |
844 | * We failed anyway. | 842 | retval = uport->ops->request_port(uport); |
845 | */ | 843 | /* |
846 | retval = -EBUSY; | 844 | * If we failed to restore the old settings, |
845 | * we fail like this. | ||
846 | */ | ||
847 | if (retval) | ||
848 | uport->type = PORT_UNKNOWN; | ||
849 | |||
850 | /* | ||
851 | * We failed anyway. | ||
852 | */ | ||
853 | retval = -EBUSY; | ||
854 | } | ||
855 | |||
847 | /* Added to return the correct error -Ram Gupta */ | 856 | /* Added to return the correct error -Ram Gupta */ |
848 | goto exit; | 857 | goto exit; |
849 | } | 858 | } |
@@ -1571,12 +1580,6 @@ static int uart_open(struct tty_struct *tty, struct file *filp) | |||
1571 | } | 1580 | } |
1572 | 1581 | ||
1573 | /* | 1582 | /* |
1574 | * Make sure the device is in D0 state. | ||
1575 | */ | ||
1576 | if (port->count == 1) | ||
1577 | uart_change_pm(state, UART_PM_STATE_ON); | ||
1578 | |||
1579 | /* | ||
1580 | * Start up the serial port. | 1583 | * Start up the serial port. |
1581 | */ | 1584 | */ |
1582 | retval = uart_startup(tty, state, 0); | 1585 | retval = uart_startup(tty, state, 0); |
diff --git a/drivers/tty/tty_buffer.c b/drivers/tty/tty_buffer.c index 8ebd9f88a6f6..f1d30f6945af 100644 --- a/drivers/tty/tty_buffer.c +++ b/drivers/tty/tty_buffer.c | |||
@@ -255,11 +255,16 @@ static int __tty_buffer_request_room(struct tty_port *port, size_t size, | |||
255 | if (change || left < size) { | 255 | if (change || left < size) { |
256 | /* This is the slow path - looking for new buffers to use */ | 256 | /* This is the slow path - looking for new buffers to use */ |
257 | if ((n = tty_buffer_alloc(port, size)) != NULL) { | 257 | if ((n = tty_buffer_alloc(port, size)) != NULL) { |
258 | unsigned long iflags; | ||
259 | |||
258 | n->flags = flags; | 260 | n->flags = flags; |
259 | buf->tail = n; | 261 | buf->tail = n; |
262 | |||
263 | spin_lock_irqsave(&buf->flush_lock, iflags); | ||
260 | b->commit = b->used; | 264 | b->commit = b->used; |
261 | smp_mb(); | ||
262 | b->next = n; | 265 | b->next = n; |
266 | spin_unlock_irqrestore(&buf->flush_lock, iflags); | ||
267 | |||
263 | } else if (change) | 268 | } else if (change) |
264 | size = 0; | 269 | size = 0; |
265 | else | 270 | else |
@@ -443,6 +448,7 @@ static void flush_to_ldisc(struct work_struct *work) | |||
443 | mutex_lock(&buf->lock); | 448 | mutex_lock(&buf->lock); |
444 | 449 | ||
445 | while (1) { | 450 | while (1) { |
451 | unsigned long flags; | ||
446 | struct tty_buffer *head = buf->head; | 452 | struct tty_buffer *head = buf->head; |
447 | int count; | 453 | int count; |
448 | 454 | ||
@@ -450,14 +456,19 @@ static void flush_to_ldisc(struct work_struct *work) | |||
450 | if (atomic_read(&buf->priority)) | 456 | if (atomic_read(&buf->priority)) |
451 | break; | 457 | break; |
452 | 458 | ||
459 | spin_lock_irqsave(&buf->flush_lock, flags); | ||
453 | count = head->commit - head->read; | 460 | count = head->commit - head->read; |
454 | if (!count) { | 461 | if (!count) { |
455 | if (head->next == NULL) | 462 | if (head->next == NULL) { |
463 | spin_unlock_irqrestore(&buf->flush_lock, flags); | ||
456 | break; | 464 | break; |
465 | } | ||
457 | buf->head = head->next; | 466 | buf->head = head->next; |
467 | spin_unlock_irqrestore(&buf->flush_lock, flags); | ||
458 | tty_buffer_free(port, head); | 468 | tty_buffer_free(port, head); |
459 | continue; | 469 | continue; |
460 | } | 470 | } |
471 | spin_unlock_irqrestore(&buf->flush_lock, flags); | ||
461 | 472 | ||
462 | count = receive_buf(tty, head, count); | 473 | count = receive_buf(tty, head, count); |
463 | if (!count) | 474 | if (!count) |
@@ -512,6 +523,7 @@ void tty_buffer_init(struct tty_port *port) | |||
512 | struct tty_bufhead *buf = &port->buf; | 523 | struct tty_bufhead *buf = &port->buf; |
513 | 524 | ||
514 | mutex_init(&buf->lock); | 525 | mutex_init(&buf->lock); |
526 | spin_lock_init(&buf->flush_lock); | ||
515 | tty_buffer_reset(&buf->sentinel, 0); | 527 | tty_buffer_reset(&buf->sentinel, 0); |
516 | buf->head = &buf->sentinel; | 528 | buf->head = &buf->sentinel; |
517 | buf->tail = &buf->sentinel; | 529 | buf->tail = &buf->sentinel; |
diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c index ca6831c5b763..1cd5d0ba587c 100644 --- a/drivers/usb/chipidea/core.c +++ b/drivers/usb/chipidea/core.c | |||
@@ -277,6 +277,39 @@ static void hw_phymode_configure(struct ci_hdrc *ci) | |||
277 | } | 277 | } |
278 | 278 | ||
279 | /** | 279 | /** |
280 | * ci_usb_phy_init: initialize phy according to different phy type | ||
281 | * @ci: the controller | ||
282 | * | ||
283 | * This function returns an error code if usb_phy_init has failed | ||
284 | */ | ||
285 | static int ci_usb_phy_init(struct ci_hdrc *ci) | ||
286 | { | ||
287 | int ret; | ||
288 | |||
289 | switch (ci->platdata->phy_mode) { | ||
290 | case USBPHY_INTERFACE_MODE_UTMI: | ||
291 | case USBPHY_INTERFACE_MODE_UTMIW: | ||
292 | case USBPHY_INTERFACE_MODE_HSIC: | ||
293 | ret = usb_phy_init(ci->transceiver); | ||
294 | if (ret) | ||
295 | return ret; | ||
296 | hw_phymode_configure(ci); | ||
297 | break; | ||
298 | case USBPHY_INTERFACE_MODE_ULPI: | ||
299 | case USBPHY_INTERFACE_MODE_SERIAL: | ||
300 | hw_phymode_configure(ci); | ||
301 | ret = usb_phy_init(ci->transceiver); | ||
302 | if (ret) | ||
303 | return ret; | ||
304 | break; | ||
305 | default: | ||
306 | ret = usb_phy_init(ci->transceiver); | ||
307 | } | ||
308 | |||
309 | return ret; | ||
310 | } | ||
311 | |||
312 | /** | ||
280 | * hw_device_reset: resets chip (execute without interruption) | 313 | * hw_device_reset: resets chip (execute without interruption) |
281 | * @ci: the controller | 314 | * @ci: the controller |
282 | * | 315 | * |
@@ -543,8 +576,6 @@ static int ci_hdrc_probe(struct platform_device *pdev) | |||
543 | return -ENODEV; | 576 | return -ENODEV; |
544 | } | 577 | } |
545 | 578 | ||
546 | hw_phymode_configure(ci); | ||
547 | |||
548 | if (ci->platdata->phy) | 579 | if (ci->platdata->phy) |
549 | ci->transceiver = ci->platdata->phy; | 580 | ci->transceiver = ci->platdata->phy; |
550 | else | 581 | else |
@@ -564,7 +595,7 @@ static int ci_hdrc_probe(struct platform_device *pdev) | |||
564 | return -EPROBE_DEFER; | 595 | return -EPROBE_DEFER; |
565 | } | 596 | } |
566 | 597 | ||
567 | ret = usb_phy_init(ci->transceiver); | 598 | ret = ci_usb_phy_init(ci); |
568 | if (ret) { | 599 | if (ret) { |
569 | dev_err(dev, "unable to init phy: %d\n", ret); | 600 | dev_err(dev, "unable to init phy: %d\n", ret); |
570 | return ret; | 601 | return ret; |
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index d001417e8e37..10aaaae9af25 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c | |||
@@ -821,6 +821,7 @@ static void dwc3_complete(struct device *dev) | |||
821 | 821 | ||
822 | spin_lock_irqsave(&dwc->lock, flags); | 822 | spin_lock_irqsave(&dwc->lock, flags); |
823 | 823 | ||
824 | dwc3_event_buffers_setup(dwc); | ||
824 | switch (dwc->dr_mode) { | 825 | switch (dwc->dr_mode) { |
825 | case USB_DR_MODE_PERIPHERAL: | 826 | case USB_DR_MODE_PERIPHERAL: |
826 | case USB_DR_MODE_OTG: | 827 | case USB_DR_MODE_OTG: |
@@ -828,7 +829,6 @@ static void dwc3_complete(struct device *dev) | |||
828 | /* FALLTHROUGH */ | 829 | /* FALLTHROUGH */ |
829 | case USB_DR_MODE_HOST: | 830 | case USB_DR_MODE_HOST: |
830 | default: | 831 | default: |
831 | dwc3_event_buffers_setup(dwc); | ||
832 | break; | 832 | break; |
833 | } | 833 | } |
834 | 834 | ||
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index a740eac74d56..70715eeededd 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c | |||
@@ -187,15 +187,12 @@ int dwc3_gadget_resize_tx_fifos(struct dwc3 *dwc) | |||
187 | * improve this algorithm so that we better use the internal | 187 | * improve this algorithm so that we better use the internal |
188 | * FIFO space | 188 | * FIFO space |
189 | */ | 189 | */ |
190 | for (num = 0; num < DWC3_ENDPOINTS_NUM; num++) { | 190 | for (num = 0; num < dwc->num_in_eps; num++) { |
191 | struct dwc3_ep *dep = dwc->eps[num]; | 191 | /* bit0 indicates direction; 1 means IN ep */ |
192 | int fifo_number = dep->number >> 1; | 192 | struct dwc3_ep *dep = dwc->eps[(num << 1) | 1]; |
193 | int mult = 1; | 193 | int mult = 1; |
194 | int tmp; | 194 | int tmp; |
195 | 195 | ||
196 | if (!(dep->number & 1)) | ||
197 | continue; | ||
198 | |||
199 | if (!(dep->flags & DWC3_EP_ENABLED)) | 196 | if (!(dep->flags & DWC3_EP_ENABLED)) |
200 | continue; | 197 | continue; |
201 | 198 | ||
@@ -224,8 +221,7 @@ int dwc3_gadget_resize_tx_fifos(struct dwc3 *dwc) | |||
224 | dev_vdbg(dwc->dev, "%s: Fifo Addr %04x Size %d\n", | 221 | dev_vdbg(dwc->dev, "%s: Fifo Addr %04x Size %d\n", |
225 | dep->name, last_fifo_depth, fifo_size & 0xffff); | 222 | dep->name, last_fifo_depth, fifo_size & 0xffff); |
226 | 223 | ||
227 | dwc3_writel(dwc->regs, DWC3_GTXFIFOSIZ(fifo_number), | 224 | dwc3_writel(dwc->regs, DWC3_GTXFIFOSIZ(num), fifo_size); |
228 | fifo_size); | ||
229 | 225 | ||
230 | last_fifo_depth += (fifo_size & 0xffff); | 226 | last_fifo_depth += (fifo_size & 0xffff); |
231 | } | 227 | } |
diff --git a/drivers/usb/gadget/f_fs.c b/drivers/usb/gadget/f_fs.c index 2e164dca08e8..1e12b3ee56fd 100644 --- a/drivers/usb/gadget/f_fs.c +++ b/drivers/usb/gadget/f_fs.c | |||
@@ -745,6 +745,12 @@ static ssize_t ffs_epfile_io(struct file *file, struct ffs_io_data *io_data) | |||
745 | */ | 745 | */ |
746 | struct usb_gadget *gadget = epfile->ffs->gadget; | 746 | struct usb_gadget *gadget = epfile->ffs->gadget; |
747 | 747 | ||
748 | spin_lock_irq(&epfile->ffs->eps_lock); | ||
749 | /* In the meantime, endpoint got disabled or changed. */ | ||
750 | if (epfile->ep != ep) { | ||
751 | spin_unlock_irq(&epfile->ffs->eps_lock); | ||
752 | return -ESHUTDOWN; | ||
753 | } | ||
748 | /* | 754 | /* |
749 | * Controller may require buffer size to be aligned to | 755 | * Controller may require buffer size to be aligned to |
750 | * maxpacketsize of an out endpoint. | 756 | * maxpacketsize of an out endpoint. |
@@ -752,6 +758,7 @@ static ssize_t ffs_epfile_io(struct file *file, struct ffs_io_data *io_data) | |||
752 | data_len = io_data->read ? | 758 | data_len = io_data->read ? |
753 | usb_ep_align_maybe(gadget, ep->ep, io_data->len) : | 759 | usb_ep_align_maybe(gadget, ep->ep, io_data->len) : |
754 | io_data->len; | 760 | io_data->len; |
761 | spin_unlock_irq(&epfile->ffs->eps_lock); | ||
755 | 762 | ||
756 | data = kmalloc(data_len, GFP_KERNEL); | 763 | data = kmalloc(data_len, GFP_KERNEL); |
757 | if (unlikely(!data)) | 764 | if (unlikely(!data)) |
diff --git a/drivers/usb/gadget/f_rndis.c b/drivers/usb/gadget/f_rndis.c index c11761ce5113..9a4f49dc6ac4 100644 --- a/drivers/usb/gadget/f_rndis.c +++ b/drivers/usb/gadget/f_rndis.c | |||
@@ -377,7 +377,7 @@ static struct sk_buff *rndis_add_header(struct gether *port, | |||
377 | if (skb2) | 377 | if (skb2) |
378 | rndis_add_hdr(skb2); | 378 | rndis_add_hdr(skb2); |
379 | 379 | ||
380 | dev_kfree_skb_any(skb); | 380 | dev_kfree_skb(skb); |
381 | return skb2; | 381 | return skb2; |
382 | } | 382 | } |
383 | 383 | ||
diff --git a/drivers/usb/gadget/fsl_udc_core.c b/drivers/usb/gadget/fsl_udc_core.c index 15960af0f67e..a2f26cdb56fe 100644 --- a/drivers/usb/gadget/fsl_udc_core.c +++ b/drivers/usb/gadget/fsl_udc_core.c | |||
@@ -1219,6 +1219,10 @@ static int fsl_pullup(struct usb_gadget *gadget, int is_on) | |||
1219 | struct fsl_udc *udc; | 1219 | struct fsl_udc *udc; |
1220 | 1220 | ||
1221 | udc = container_of(gadget, struct fsl_udc, gadget); | 1221 | udc = container_of(gadget, struct fsl_udc, gadget); |
1222 | |||
1223 | if (!udc->vbus_active) | ||
1224 | return -EOPNOTSUPP; | ||
1225 | |||
1222 | udc->softconnect = (is_on != 0); | 1226 | udc->softconnect = (is_on != 0); |
1223 | if (can_pullup(udc)) | 1227 | if (can_pullup(udc)) |
1224 | fsl_writel((fsl_readl(&dr_regs->usbcmd) | USB_CMD_RUN_STOP), | 1228 | fsl_writel((fsl_readl(&dr_regs->usbcmd) | USB_CMD_RUN_STOP), |
@@ -2532,8 +2536,8 @@ static int __exit fsl_udc_remove(struct platform_device *pdev) | |||
2532 | if (!udc_controller) | 2536 | if (!udc_controller) |
2533 | return -ENODEV; | 2537 | return -ENODEV; |
2534 | 2538 | ||
2535 | usb_del_gadget_udc(&udc_controller->gadget); | ||
2536 | udc_controller->done = &done; | 2539 | udc_controller->done = &done; |
2540 | usb_del_gadget_udc(&udc_controller->gadget); | ||
2537 | 2541 | ||
2538 | fsl_udc_clk_release(); | 2542 | fsl_udc_clk_release(); |
2539 | 2543 | ||
diff --git a/drivers/usb/gadget/inode.c b/drivers/usb/gadget/inode.c index b5be6f0308c2..a925d0cbcd41 100644 --- a/drivers/usb/gadget/inode.c +++ b/drivers/usb/gadget/inode.c | |||
@@ -2043,6 +2043,7 @@ gadgetfs_fill_super (struct super_block *sb, void *opts, int silent) | |||
2043 | return -ESRCH; | 2043 | return -ESRCH; |
2044 | 2044 | ||
2045 | /* fake probe to determine $CHIP */ | 2045 | /* fake probe to determine $CHIP */ |
2046 | CHIP = NULL; | ||
2046 | usb_gadget_probe_driver(&probe_driver); | 2047 | usb_gadget_probe_driver(&probe_driver); |
2047 | if (!CHIP) | 2048 | if (!CHIP) |
2048 | return -ENODEV; | 2049 | return -ENODEV; |
diff --git a/drivers/usb/gadget/rndis.c b/drivers/usb/gadget/rndis.c index d822d822efb3..7ed452d90f4d 100644 --- a/drivers/usb/gadget/rndis.c +++ b/drivers/usb/gadget/rndis.c | |||
@@ -35,6 +35,7 @@ | |||
35 | #include <asm/byteorder.h> | 35 | #include <asm/byteorder.h> |
36 | #include <asm/unaligned.h> | 36 | #include <asm/unaligned.h> |
37 | 37 | ||
38 | #include "u_rndis.h" | ||
38 | 39 | ||
39 | #undef VERBOSE_DEBUG | 40 | #undef VERBOSE_DEBUG |
40 | 41 | ||
diff --git a/drivers/usb/gadget/u_ether.c b/drivers/usb/gadget/u_ether.c index 50d09c289137..b7d4f82872b7 100644 --- a/drivers/usb/gadget/u_ether.c +++ b/drivers/usb/gadget/u_ether.c | |||
@@ -48,8 +48,6 @@ | |||
48 | 48 | ||
49 | #define UETH__VERSION "29-May-2008" | 49 | #define UETH__VERSION "29-May-2008" |
50 | 50 | ||
51 | #define GETHER_NAPI_WEIGHT 32 | ||
52 | |||
53 | struct eth_dev { | 51 | struct eth_dev { |
54 | /* lock is held while accessing port_usb | 52 | /* lock is held while accessing port_usb |
55 | */ | 53 | */ |
@@ -74,7 +72,6 @@ struct eth_dev { | |||
74 | struct sk_buff_head *list); | 72 | struct sk_buff_head *list); |
75 | 73 | ||
76 | struct work_struct work; | 74 | struct work_struct work; |
77 | struct napi_struct rx_napi; | ||
78 | 75 | ||
79 | unsigned long todo; | 76 | unsigned long todo; |
80 | #define WORK_RX_MEMORY 0 | 77 | #define WORK_RX_MEMORY 0 |
@@ -256,16 +253,18 @@ enomem: | |||
256 | DBG(dev, "rx submit --> %d\n", retval); | 253 | DBG(dev, "rx submit --> %d\n", retval); |
257 | if (skb) | 254 | if (skb) |
258 | dev_kfree_skb_any(skb); | 255 | dev_kfree_skb_any(skb); |
256 | spin_lock_irqsave(&dev->req_lock, flags); | ||
257 | list_add(&req->list, &dev->rx_reqs); | ||
258 | spin_unlock_irqrestore(&dev->req_lock, flags); | ||
259 | } | 259 | } |
260 | return retval; | 260 | return retval; |
261 | } | 261 | } |
262 | 262 | ||
263 | static void rx_complete(struct usb_ep *ep, struct usb_request *req) | 263 | static void rx_complete(struct usb_ep *ep, struct usb_request *req) |
264 | { | 264 | { |
265 | struct sk_buff *skb = req->context; | 265 | struct sk_buff *skb = req->context, *skb2; |
266 | struct eth_dev *dev = ep->driver_data; | 266 | struct eth_dev *dev = ep->driver_data; |
267 | int status = req->status; | 267 | int status = req->status; |
268 | bool rx_queue = 0; | ||
269 | 268 | ||
270 | switch (status) { | 269 | switch (status) { |
271 | 270 | ||
@@ -289,8 +288,30 @@ static void rx_complete(struct usb_ep *ep, struct usb_request *req) | |||
289 | } else { | 288 | } else { |
290 | skb_queue_tail(&dev->rx_frames, skb); | 289 | skb_queue_tail(&dev->rx_frames, skb); |
291 | } | 290 | } |
292 | if (!status) | 291 | skb = NULL; |
293 | rx_queue = 1; | 292 | |
293 | skb2 = skb_dequeue(&dev->rx_frames); | ||
294 | while (skb2) { | ||
295 | if (status < 0 | ||
296 | || ETH_HLEN > skb2->len | ||
297 | || skb2->len > VLAN_ETH_FRAME_LEN) { | ||
298 | dev->net->stats.rx_errors++; | ||
299 | dev->net->stats.rx_length_errors++; | ||
300 | DBG(dev, "rx length %d\n", skb2->len); | ||
301 | dev_kfree_skb_any(skb2); | ||
302 | goto next_frame; | ||
303 | } | ||
304 | skb2->protocol = eth_type_trans(skb2, dev->net); | ||
305 | dev->net->stats.rx_packets++; | ||
306 | dev->net->stats.rx_bytes += skb2->len; | ||
307 | |||
308 | /* no buffer copies needed, unless hardware can't | ||
309 | * use skb buffers. | ||
310 | */ | ||
311 | status = netif_rx(skb2); | ||
312 | next_frame: | ||
313 | skb2 = skb_dequeue(&dev->rx_frames); | ||
314 | } | ||
294 | break; | 315 | break; |
295 | 316 | ||
296 | /* software-driven interface shutdown */ | 317 | /* software-driven interface shutdown */ |
@@ -313,20 +334,22 @@ quiesce: | |||
313 | /* FALLTHROUGH */ | 334 | /* FALLTHROUGH */ |
314 | 335 | ||
315 | default: | 336 | default: |
316 | rx_queue = 1; | ||
317 | dev_kfree_skb_any(skb); | ||
318 | dev->net->stats.rx_errors++; | 337 | dev->net->stats.rx_errors++; |
319 | DBG(dev, "rx status %d\n", status); | 338 | DBG(dev, "rx status %d\n", status); |
320 | break; | 339 | break; |
321 | } | 340 | } |
322 | 341 | ||
342 | if (skb) | ||
343 | dev_kfree_skb_any(skb); | ||
344 | if (!netif_running(dev->net)) { | ||
323 | clean: | 345 | clean: |
324 | spin_lock(&dev->req_lock); | 346 | spin_lock(&dev->req_lock); |
325 | list_add(&req->list, &dev->rx_reqs); | 347 | list_add(&req->list, &dev->rx_reqs); |
326 | spin_unlock(&dev->req_lock); | 348 | spin_unlock(&dev->req_lock); |
327 | 349 | req = NULL; | |
328 | if (rx_queue && likely(napi_schedule_prep(&dev->rx_napi))) | 350 | } |
329 | __napi_schedule(&dev->rx_napi); | 351 | if (req) |
352 | rx_submit(dev, req, GFP_ATOMIC); | ||
330 | } | 353 | } |
331 | 354 | ||
332 | static int prealloc(struct list_head *list, struct usb_ep *ep, unsigned n) | 355 | static int prealloc(struct list_head *list, struct usb_ep *ep, unsigned n) |
@@ -391,24 +414,16 @@ static void rx_fill(struct eth_dev *dev, gfp_t gfp_flags) | |||
391 | { | 414 | { |
392 | struct usb_request *req; | 415 | struct usb_request *req; |
393 | unsigned long flags; | 416 | unsigned long flags; |
394 | int rx_counts = 0; | ||
395 | 417 | ||
396 | /* fill unused rxq slots with some skb */ | 418 | /* fill unused rxq slots with some skb */ |
397 | spin_lock_irqsave(&dev->req_lock, flags); | 419 | spin_lock_irqsave(&dev->req_lock, flags); |
398 | while (!list_empty(&dev->rx_reqs)) { | 420 | while (!list_empty(&dev->rx_reqs)) { |
399 | |||
400 | if (++rx_counts > qlen(dev->gadget, dev->qmult)) | ||
401 | break; | ||
402 | |||
403 | req = container_of(dev->rx_reqs.next, | 421 | req = container_of(dev->rx_reqs.next, |
404 | struct usb_request, list); | 422 | struct usb_request, list); |
405 | list_del_init(&req->list); | 423 | list_del_init(&req->list); |
406 | spin_unlock_irqrestore(&dev->req_lock, flags); | 424 | spin_unlock_irqrestore(&dev->req_lock, flags); |
407 | 425 | ||
408 | if (rx_submit(dev, req, gfp_flags) < 0) { | 426 | if (rx_submit(dev, req, gfp_flags) < 0) { |
409 | spin_lock_irqsave(&dev->req_lock, flags); | ||
410 | list_add(&req->list, &dev->rx_reqs); | ||
411 | spin_unlock_irqrestore(&dev->req_lock, flags); | ||
412 | defer_kevent(dev, WORK_RX_MEMORY); | 427 | defer_kevent(dev, WORK_RX_MEMORY); |
413 | return; | 428 | return; |
414 | } | 429 | } |
@@ -418,41 +433,6 @@ static void rx_fill(struct eth_dev *dev, gfp_t gfp_flags) | |||
418 | spin_unlock_irqrestore(&dev->req_lock, flags); | 433 | spin_unlock_irqrestore(&dev->req_lock, flags); |
419 | } | 434 | } |
420 | 435 | ||
421 | static int gether_poll(struct napi_struct *napi, int budget) | ||
422 | { | ||
423 | struct eth_dev *dev = container_of(napi, struct eth_dev, rx_napi); | ||
424 | struct sk_buff *skb; | ||
425 | unsigned int work_done = 0; | ||
426 | int status = 0; | ||
427 | |||
428 | while ((skb = skb_dequeue(&dev->rx_frames))) { | ||
429 | if (status < 0 | ||
430 | || ETH_HLEN > skb->len | ||
431 | || skb->len > VLAN_ETH_FRAME_LEN) { | ||
432 | dev->net->stats.rx_errors++; | ||
433 | dev->net->stats.rx_length_errors++; | ||
434 | DBG(dev, "rx length %d\n", skb->len); | ||
435 | dev_kfree_skb_any(skb); | ||
436 | continue; | ||
437 | } | ||
438 | skb->protocol = eth_type_trans(skb, dev->net); | ||
439 | dev->net->stats.rx_packets++; | ||
440 | dev->net->stats.rx_bytes += skb->len; | ||
441 | |||
442 | status = netif_rx_ni(skb); | ||
443 | } | ||
444 | |||
445 | if (netif_running(dev->net)) { | ||
446 | rx_fill(dev, GFP_KERNEL); | ||
447 | work_done++; | ||
448 | } | ||
449 | |||
450 | if (work_done < budget) | ||
451 | napi_complete(&dev->rx_napi); | ||
452 | |||
453 | return work_done; | ||
454 | } | ||
455 | |||
456 | static void eth_work(struct work_struct *work) | 436 | static void eth_work(struct work_struct *work) |
457 | { | 437 | { |
458 | struct eth_dev *dev = container_of(work, struct eth_dev, work); | 438 | struct eth_dev *dev = container_of(work, struct eth_dev, work); |
@@ -645,7 +625,6 @@ static void eth_start(struct eth_dev *dev, gfp_t gfp_flags) | |||
645 | /* and open the tx floodgates */ | 625 | /* and open the tx floodgates */ |
646 | atomic_set(&dev->tx_qlen, 0); | 626 | atomic_set(&dev->tx_qlen, 0); |
647 | netif_wake_queue(dev->net); | 627 | netif_wake_queue(dev->net); |
648 | napi_enable(&dev->rx_napi); | ||
649 | } | 628 | } |
650 | 629 | ||
651 | static int eth_open(struct net_device *net) | 630 | static int eth_open(struct net_device *net) |
@@ -672,7 +651,6 @@ static int eth_stop(struct net_device *net) | |||
672 | unsigned long flags; | 651 | unsigned long flags; |
673 | 652 | ||
674 | VDBG(dev, "%s\n", __func__); | 653 | VDBG(dev, "%s\n", __func__); |
675 | napi_disable(&dev->rx_napi); | ||
676 | netif_stop_queue(net); | 654 | netif_stop_queue(net); |
677 | 655 | ||
678 | DBG(dev, "stop stats: rx/tx %ld/%ld, errs %ld/%ld\n", | 656 | DBG(dev, "stop stats: rx/tx %ld/%ld, errs %ld/%ld\n", |
@@ -790,7 +768,6 @@ struct eth_dev *gether_setup_name(struct usb_gadget *g, | |||
790 | return ERR_PTR(-ENOMEM); | 768 | return ERR_PTR(-ENOMEM); |
791 | 769 | ||
792 | dev = netdev_priv(net); | 770 | dev = netdev_priv(net); |
793 | netif_napi_add(net, &dev->rx_napi, gether_poll, GETHER_NAPI_WEIGHT); | ||
794 | spin_lock_init(&dev->lock); | 771 | spin_lock_init(&dev->lock); |
795 | spin_lock_init(&dev->req_lock); | 772 | spin_lock_init(&dev->req_lock); |
796 | INIT_WORK(&dev->work, eth_work); | 773 | INIT_WORK(&dev->work, eth_work); |
@@ -853,7 +830,6 @@ struct net_device *gether_setup_name_default(const char *netname) | |||
853 | return ERR_PTR(-ENOMEM); | 830 | return ERR_PTR(-ENOMEM); |
854 | 831 | ||
855 | dev = netdev_priv(net); | 832 | dev = netdev_priv(net); |
856 | netif_napi_add(net, &dev->rx_napi, gether_poll, GETHER_NAPI_WEIGHT); | ||
857 | spin_lock_init(&dev->lock); | 833 | spin_lock_init(&dev->lock); |
858 | spin_lock_init(&dev->req_lock); | 834 | spin_lock_init(&dev->req_lock); |
859 | INIT_WORK(&dev->work, eth_work); | 835 | INIT_WORK(&dev->work, eth_work); |
@@ -1137,7 +1113,6 @@ void gether_disconnect(struct gether *link) | |||
1137 | { | 1113 | { |
1138 | struct eth_dev *dev = link->ioport; | 1114 | struct eth_dev *dev = link->ioport; |
1139 | struct usb_request *req; | 1115 | struct usb_request *req; |
1140 | struct sk_buff *skb; | ||
1141 | 1116 | ||
1142 | WARN_ON(!dev); | 1117 | WARN_ON(!dev); |
1143 | if (!dev) | 1118 | if (!dev) |
@@ -1164,12 +1139,6 @@ void gether_disconnect(struct gether *link) | |||
1164 | spin_lock(&dev->req_lock); | 1139 | spin_lock(&dev->req_lock); |
1165 | } | 1140 | } |
1166 | spin_unlock(&dev->req_lock); | 1141 | spin_unlock(&dev->req_lock); |
1167 | |||
1168 | spin_lock(&dev->rx_frames.lock); | ||
1169 | while ((skb = __skb_dequeue(&dev->rx_frames))) | ||
1170 | dev_kfree_skb_any(skb); | ||
1171 | spin_unlock(&dev->rx_frames.lock); | ||
1172 | |||
1173 | link->in_ep->driver_data = NULL; | 1142 | link->in_ep->driver_data = NULL; |
1174 | link->in_ep->desc = NULL; | 1143 | link->in_ep->desc = NULL; |
1175 | 1144 | ||
diff --git a/drivers/usb/gadget/zero.c b/drivers/usb/gadget/zero.c index 9f170c53e3d9..134f354ede62 100644 --- a/drivers/usb/gadget/zero.c +++ b/drivers/usb/gadget/zero.c | |||
@@ -300,7 +300,7 @@ static int __init zero_bind(struct usb_composite_dev *cdev) | |||
300 | ss_opts->isoc_interval = gzero_options.isoc_interval; | 300 | ss_opts->isoc_interval = gzero_options.isoc_interval; |
301 | ss_opts->isoc_maxpacket = gzero_options.isoc_maxpacket; | 301 | ss_opts->isoc_maxpacket = gzero_options.isoc_maxpacket; |
302 | ss_opts->isoc_mult = gzero_options.isoc_mult; | 302 | ss_opts->isoc_mult = gzero_options.isoc_mult; |
303 | ss_opts->isoc_maxburst = gzero_options.isoc_maxpacket; | 303 | ss_opts->isoc_maxburst = gzero_options.isoc_maxburst; |
304 | ss_opts->bulk_buflen = gzero_options.bulk_buflen; | 304 | ss_opts->bulk_buflen = gzero_options.bulk_buflen; |
305 | 305 | ||
306 | func_ss = usb_get_function(func_inst_ss); | 306 | func_ss = usb_get_function(func_inst_ss); |
diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c index 47390e369cd4..35d447780707 100644 --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c | |||
@@ -134,6 +134,8 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) | |||
134 | */ | 134 | */ |
135 | if (pdev->subsystem_vendor == PCI_VENDOR_ID_HP) | 135 | if (pdev->subsystem_vendor == PCI_VENDOR_ID_HP) |
136 | xhci->quirks |= XHCI_SPURIOUS_WAKEUP; | 136 | xhci->quirks |= XHCI_SPURIOUS_WAKEUP; |
137 | |||
138 | xhci->quirks |= XHCI_SPURIOUS_REBOOT; | ||
137 | } | 139 | } |
138 | if (pdev->vendor == PCI_VENDOR_ID_ETRON && | 140 | if (pdev->vendor == PCI_VENDOR_ID_ETRON && |
139 | pdev->device == PCI_DEVICE_ID_ASROCK_P67) { | 141 | pdev->device == PCI_DEVICE_ID_ASROCK_P67) { |
@@ -143,9 +145,7 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) | |||
143 | xhci->quirks |= XHCI_TRUST_TX_LENGTH; | 145 | xhci->quirks |= XHCI_TRUST_TX_LENGTH; |
144 | } | 146 | } |
145 | if (pdev->vendor == PCI_VENDOR_ID_RENESAS && | 147 | if (pdev->vendor == PCI_VENDOR_ID_RENESAS && |
146 | pdev->device == 0x0015 && | 148 | pdev->device == 0x0015) |
147 | pdev->subsystem_vendor == PCI_VENDOR_ID_SAMSUNG && | ||
148 | pdev->subsystem_device == 0xc0cd) | ||
149 | xhci->quirks |= XHCI_RESET_ON_RESUME; | 149 | xhci->quirks |= XHCI_RESET_ON_RESUME; |
150 | if (pdev->vendor == PCI_VENDOR_ID_VIA) | 150 | if (pdev->vendor == PCI_VENDOR_ID_VIA) |
151 | xhci->quirks |= XHCI_RESET_ON_RESUME; | 151 | xhci->quirks |= XHCI_RESET_ON_RESUME; |
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index 5f926bea5ab1..7a0e3c720c00 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c | |||
@@ -550,6 +550,7 @@ void xhci_find_new_dequeue_state(struct xhci_hcd *xhci, | |||
550 | struct xhci_ring *ep_ring; | 550 | struct xhci_ring *ep_ring; |
551 | struct xhci_generic_trb *trb; | 551 | struct xhci_generic_trb *trb; |
552 | dma_addr_t addr; | 552 | dma_addr_t addr; |
553 | u64 hw_dequeue; | ||
553 | 554 | ||
554 | ep_ring = xhci_triad_to_transfer_ring(xhci, slot_id, | 555 | ep_ring = xhci_triad_to_transfer_ring(xhci, slot_id, |
555 | ep_index, stream_id); | 556 | ep_index, stream_id); |
@@ -559,16 +560,6 @@ void xhci_find_new_dequeue_state(struct xhci_hcd *xhci, | |||
559 | stream_id); | 560 | stream_id); |
560 | return; | 561 | return; |
561 | } | 562 | } |
562 | state->new_cycle_state = 0; | ||
563 | xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, | ||
564 | "Finding segment containing stopped TRB."); | ||
565 | state->new_deq_seg = find_trb_seg(cur_td->start_seg, | ||
566 | dev->eps[ep_index].stopped_trb, | ||
567 | &state->new_cycle_state); | ||
568 | if (!state->new_deq_seg) { | ||
569 | WARN_ON(1); | ||
570 | return; | ||
571 | } | ||
572 | 563 | ||
573 | /* Dig out the cycle state saved by the xHC during the stop ep cmd */ | 564 | /* Dig out the cycle state saved by the xHC during the stop ep cmd */ |
574 | xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, | 565 | xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, |
@@ -577,46 +568,57 @@ void xhci_find_new_dequeue_state(struct xhci_hcd *xhci, | |||
577 | if (ep->ep_state & EP_HAS_STREAMS) { | 568 | if (ep->ep_state & EP_HAS_STREAMS) { |
578 | struct xhci_stream_ctx *ctx = | 569 | struct xhci_stream_ctx *ctx = |
579 | &ep->stream_info->stream_ctx_array[stream_id]; | 570 | &ep->stream_info->stream_ctx_array[stream_id]; |
580 | state->new_cycle_state = 0x1 & le64_to_cpu(ctx->stream_ring); | 571 | hw_dequeue = le64_to_cpu(ctx->stream_ring); |
581 | } else { | 572 | } else { |
582 | struct xhci_ep_ctx *ep_ctx | 573 | struct xhci_ep_ctx *ep_ctx |
583 | = xhci_get_ep_ctx(xhci, dev->out_ctx, ep_index); | 574 | = xhci_get_ep_ctx(xhci, dev->out_ctx, ep_index); |
584 | state->new_cycle_state = 0x1 & le64_to_cpu(ep_ctx->deq); | 575 | hw_dequeue = le64_to_cpu(ep_ctx->deq); |
585 | } | 576 | } |
586 | 577 | ||
578 | /* Find virtual address and segment of hardware dequeue pointer */ | ||
579 | state->new_deq_seg = ep_ring->deq_seg; | ||
580 | state->new_deq_ptr = ep_ring->dequeue; | ||
581 | while (xhci_trb_virt_to_dma(state->new_deq_seg, state->new_deq_ptr) | ||
582 | != (dma_addr_t)(hw_dequeue & ~0xf)) { | ||
583 | next_trb(xhci, ep_ring, &state->new_deq_seg, | ||
584 | &state->new_deq_ptr); | ||
585 | if (state->new_deq_ptr == ep_ring->dequeue) { | ||
586 | WARN_ON(1); | ||
587 | return; | ||
588 | } | ||
589 | } | ||
590 | /* | ||
591 | * Find cycle state for last_trb, starting at old cycle state of | ||
592 | * hw_dequeue. If there is only one segment ring, find_trb_seg() will | ||
593 | * return immediately and cannot toggle the cycle state if this search | ||
594 | * wraps around, so add one more toggle manually in that case. | ||
595 | */ | ||
596 | state->new_cycle_state = hw_dequeue & 0x1; | ||
597 | if (ep_ring->first_seg == ep_ring->first_seg->next && | ||
598 | cur_td->last_trb < state->new_deq_ptr) | ||
599 | state->new_cycle_state ^= 0x1; | ||
600 | |||
587 | state->new_deq_ptr = cur_td->last_trb; | 601 | state->new_deq_ptr = cur_td->last_trb; |
588 | xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, | 602 | xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, |
589 | "Finding segment containing last TRB in TD."); | 603 | "Finding segment containing last TRB in TD."); |
590 | state->new_deq_seg = find_trb_seg(state->new_deq_seg, | 604 | state->new_deq_seg = find_trb_seg(state->new_deq_seg, |
591 | state->new_deq_ptr, | 605 | state->new_deq_ptr, &state->new_cycle_state); |
592 | &state->new_cycle_state); | ||
593 | if (!state->new_deq_seg) { | 606 | if (!state->new_deq_seg) { |
594 | WARN_ON(1); | 607 | WARN_ON(1); |
595 | return; | 608 | return; |
596 | } | 609 | } |
597 | 610 | ||
611 | /* Increment to find next TRB after last_trb. Cycle if appropriate. */ | ||
598 | trb = &state->new_deq_ptr->generic; | 612 | trb = &state->new_deq_ptr->generic; |
599 | if (TRB_TYPE_LINK_LE32(trb->field[3]) && | 613 | if (TRB_TYPE_LINK_LE32(trb->field[3]) && |
600 | (trb->field[3] & cpu_to_le32(LINK_TOGGLE))) | 614 | (trb->field[3] & cpu_to_le32(LINK_TOGGLE))) |
601 | state->new_cycle_state ^= 0x1; | 615 | state->new_cycle_state ^= 0x1; |
602 | next_trb(xhci, ep_ring, &state->new_deq_seg, &state->new_deq_ptr); | 616 | next_trb(xhci, ep_ring, &state->new_deq_seg, &state->new_deq_ptr); |
603 | 617 | ||
604 | /* | 618 | /* Don't update the ring cycle state for the producer (us). */ |
605 | * If there is only one segment in a ring, find_trb_seg()'s while loop | ||
606 | * will not run, and it will return before it has a chance to see if it | ||
607 | * needs to toggle the cycle bit. It can't tell if the stalled transfer | ||
608 | * ended just before the link TRB on a one-segment ring, or if the TD | ||
609 | * wrapped around the top of the ring, because it doesn't have the TD in | ||
610 | * question. Look for the one-segment case where stalled TRB's address | ||
611 | * is greater than the new dequeue pointer address. | ||
612 | */ | ||
613 | if (ep_ring->first_seg == ep_ring->first_seg->next && | ||
614 | state->new_deq_ptr < dev->eps[ep_index].stopped_trb) | ||
615 | state->new_cycle_state ^= 0x1; | ||
616 | xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, | 619 | xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, |
617 | "Cycle state = 0x%x", state->new_cycle_state); | 620 | "Cycle state = 0x%x", state->new_cycle_state); |
618 | 621 | ||
619 | /* Don't update the ring cycle state for the producer (us). */ | ||
620 | xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, | 622 | xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, |
621 | "New dequeue segment = %p (virtual)", | 623 | "New dequeue segment = %p (virtual)", |
622 | state->new_deq_seg); | 624 | state->new_deq_seg); |
@@ -799,7 +801,6 @@ static void xhci_handle_cmd_stop_ep(struct xhci_hcd *xhci, int slot_id, | |||
799 | if (list_empty(&ep->cancelled_td_list)) { | 801 | if (list_empty(&ep->cancelled_td_list)) { |
800 | xhci_stop_watchdog_timer_in_irq(xhci, ep); | 802 | xhci_stop_watchdog_timer_in_irq(xhci, ep); |
801 | ep->stopped_td = NULL; | 803 | ep->stopped_td = NULL; |
802 | ep->stopped_trb = NULL; | ||
803 | ring_doorbell_for_active_rings(xhci, slot_id, ep_index); | 804 | ring_doorbell_for_active_rings(xhci, slot_id, ep_index); |
804 | return; | 805 | return; |
805 | } | 806 | } |
@@ -867,11 +868,9 @@ remove_finished_td: | |||
867 | ring_doorbell_for_active_rings(xhci, slot_id, ep_index); | 868 | ring_doorbell_for_active_rings(xhci, slot_id, ep_index); |
868 | } | 869 | } |
869 | 870 | ||
870 | /* Clear stopped_td and stopped_trb if endpoint is not halted */ | 871 | /* Clear stopped_td if endpoint is not halted */ |
871 | if (!(ep->ep_state & EP_HALTED)) { | 872 | if (!(ep->ep_state & EP_HALTED)) |
872 | ep->stopped_td = NULL; | 873 | ep->stopped_td = NULL; |
873 | ep->stopped_trb = NULL; | ||
874 | } | ||
875 | 874 | ||
876 | /* | 875 | /* |
877 | * Drop the lock and complete the URBs in the cancelled TD list. | 876 | * Drop the lock and complete the URBs in the cancelled TD list. |
@@ -1941,14 +1940,12 @@ static void xhci_cleanup_halted_endpoint(struct xhci_hcd *xhci, | |||
1941 | struct xhci_virt_ep *ep = &xhci->devs[slot_id]->eps[ep_index]; | 1940 | struct xhci_virt_ep *ep = &xhci->devs[slot_id]->eps[ep_index]; |
1942 | ep->ep_state |= EP_HALTED; | 1941 | ep->ep_state |= EP_HALTED; |
1943 | ep->stopped_td = td; | 1942 | ep->stopped_td = td; |
1944 | ep->stopped_trb = event_trb; | ||
1945 | ep->stopped_stream = stream_id; | 1943 | ep->stopped_stream = stream_id; |
1946 | 1944 | ||
1947 | xhci_queue_reset_ep(xhci, slot_id, ep_index); | 1945 | xhci_queue_reset_ep(xhci, slot_id, ep_index); |
1948 | xhci_cleanup_stalled_ring(xhci, td->urb->dev, ep_index); | 1946 | xhci_cleanup_stalled_ring(xhci, td->urb->dev, ep_index); |
1949 | 1947 | ||
1950 | ep->stopped_td = NULL; | 1948 | ep->stopped_td = NULL; |
1951 | ep->stopped_trb = NULL; | ||
1952 | ep->stopped_stream = 0; | 1949 | ep->stopped_stream = 0; |
1953 | 1950 | ||
1954 | xhci_ring_cmd_db(xhci); | 1951 | xhci_ring_cmd_db(xhci); |
@@ -2030,7 +2027,6 @@ static int finish_td(struct xhci_hcd *xhci, struct xhci_td *td, | |||
2030 | * the ring dequeue pointer or take this TD off any lists yet. | 2027 | * the ring dequeue pointer or take this TD off any lists yet. |
2031 | */ | 2028 | */ |
2032 | ep->stopped_td = td; | 2029 | ep->stopped_td = td; |
2033 | ep->stopped_trb = event_trb; | ||
2034 | return 0; | 2030 | return 0; |
2035 | } else { | 2031 | } else { |
2036 | if (trb_comp_code == COMP_STALL) { | 2032 | if (trb_comp_code == COMP_STALL) { |
@@ -2042,7 +2038,6 @@ static int finish_td(struct xhci_hcd *xhci, struct xhci_td *td, | |||
2042 | * USB class driver clear the stall later. | 2038 | * USB class driver clear the stall later. |
2043 | */ | 2039 | */ |
2044 | ep->stopped_td = td; | 2040 | ep->stopped_td = td; |
2045 | ep->stopped_trb = event_trb; | ||
2046 | ep->stopped_stream = ep_ring->stream_id; | 2041 | ep->stopped_stream = ep_ring->stream_id; |
2047 | } else if (xhci_requires_manual_halt_cleanup(xhci, | 2042 | } else if (xhci_requires_manual_halt_cleanup(xhci, |
2048 | ep_ctx, trb_comp_code)) { | 2043 | ep_ctx, trb_comp_code)) { |
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index 8fe4e124ddd4..300836972faa 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c | |||
@@ -408,16 +408,16 @@ static int xhci_try_enable_msi(struct usb_hcd *hcd) | |||
408 | 408 | ||
409 | #else | 409 | #else |
410 | 410 | ||
411 | static int xhci_try_enable_msi(struct usb_hcd *hcd) | 411 | static inline int xhci_try_enable_msi(struct usb_hcd *hcd) |
412 | { | 412 | { |
413 | return 0; | 413 | return 0; |
414 | } | 414 | } |
415 | 415 | ||
416 | static void xhci_cleanup_msix(struct xhci_hcd *xhci) | 416 | static inline void xhci_cleanup_msix(struct xhci_hcd *xhci) |
417 | { | 417 | { |
418 | } | 418 | } |
419 | 419 | ||
420 | static void xhci_msix_sync_irqs(struct xhci_hcd *xhci) | 420 | static inline void xhci_msix_sync_irqs(struct xhci_hcd *xhci) |
421 | { | 421 | { |
422 | } | 422 | } |
423 | 423 | ||
@@ -2954,7 +2954,6 @@ void xhci_endpoint_reset(struct usb_hcd *hcd, | |||
2954 | xhci_ring_cmd_db(xhci); | 2954 | xhci_ring_cmd_db(xhci); |
2955 | } | 2955 | } |
2956 | virt_ep->stopped_td = NULL; | 2956 | virt_ep->stopped_td = NULL; |
2957 | virt_ep->stopped_trb = NULL; | ||
2958 | virt_ep->stopped_stream = 0; | 2957 | virt_ep->stopped_stream = 0; |
2959 | spin_unlock_irqrestore(&xhci->lock, flags); | 2958 | spin_unlock_irqrestore(&xhci->lock, flags); |
2960 | 2959 | ||
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h index d280e9213d08..4746816aed3e 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h | |||
@@ -865,8 +865,6 @@ struct xhci_virt_ep { | |||
865 | #define EP_GETTING_NO_STREAMS (1 << 5) | 865 | #define EP_GETTING_NO_STREAMS (1 << 5) |
866 | /* ---- Related to URB cancellation ---- */ | 866 | /* ---- Related to URB cancellation ---- */ |
867 | struct list_head cancelled_td_list; | 867 | struct list_head cancelled_td_list; |
868 | /* The TRB that was last reported in a stopped endpoint ring */ | ||
869 | union xhci_trb *stopped_trb; | ||
870 | struct xhci_td *stopped_td; | 868 | struct xhci_td *stopped_td; |
871 | unsigned int stopped_stream; | 869 | unsigned int stopped_stream; |
872 | /* Watchdog timer for stop endpoint command to cancel URBs */ | 870 | /* Watchdog timer for stop endpoint command to cancel URBs */ |
diff --git a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c index 3372ded5def7..e2fd263585de 100644 --- a/drivers/usb/musb/musb_dsps.c +++ b/drivers/usb/musb/musb_dsps.c | |||
@@ -470,8 +470,9 @@ static int dsps_musb_exit(struct musb *musb) | |||
470 | struct dsps_glue *glue = dev_get_drvdata(dev->parent); | 470 | struct dsps_glue *glue = dev_get_drvdata(dev->parent); |
471 | 471 | ||
472 | del_timer_sync(&glue->timer); | 472 | del_timer_sync(&glue->timer); |
473 | |||
474 | usb_phy_shutdown(musb->xceiv); | 473 | usb_phy_shutdown(musb->xceiv); |
474 | debugfs_remove_recursive(glue->dbgfs_root); | ||
475 | |||
475 | return 0; | 476 | return 0; |
476 | } | 477 | } |
477 | 478 | ||
@@ -708,8 +709,6 @@ static int dsps_remove(struct platform_device *pdev) | |||
708 | pm_runtime_put(&pdev->dev); | 709 | pm_runtime_put(&pdev->dev); |
709 | pm_runtime_disable(&pdev->dev); | 710 | pm_runtime_disable(&pdev->dev); |
710 | 711 | ||
711 | debugfs_remove_recursive(glue->dbgfs_root); | ||
712 | |||
713 | return 0; | 712 | return 0; |
714 | } | 713 | } |
715 | 714 | ||
diff --git a/drivers/usb/musb/omap2430.c b/drivers/usb/musb/omap2430.c index d341c149a2f9..d369bf1f3936 100644 --- a/drivers/usb/musb/omap2430.c +++ b/drivers/usb/musb/omap2430.c | |||
@@ -316,7 +316,13 @@ static void omap_musb_mailbox_work(struct work_struct *mailbox_work) | |||
316 | { | 316 | { |
317 | struct omap2430_glue *glue = container_of(mailbox_work, | 317 | struct omap2430_glue *glue = container_of(mailbox_work, |
318 | struct omap2430_glue, omap_musb_mailbox_work); | 318 | struct omap2430_glue, omap_musb_mailbox_work); |
319 | struct musb *musb = glue_to_musb(glue); | ||
320 | struct device *dev = musb->controller; | ||
321 | |||
322 | pm_runtime_get_sync(dev); | ||
319 | omap_musb_set_mailbox(glue); | 323 | omap_musb_set_mailbox(glue); |
324 | pm_runtime_mark_last_busy(dev); | ||
325 | pm_runtime_put_autosuspend(dev); | ||
320 | } | 326 | } |
321 | 327 | ||
322 | static irqreturn_t omap2430_musb_interrupt(int irq, void *__hci) | 328 | static irqreturn_t omap2430_musb_interrupt(int irq, void *__hci) |
@@ -416,6 +422,7 @@ static int omap2430_musb_init(struct musb *musb) | |||
416 | omap_musb_set_mailbox(glue); | 422 | omap_musb_set_mailbox(glue); |
417 | 423 | ||
418 | phy_init(musb->phy); | 424 | phy_init(musb->phy); |
425 | phy_power_on(musb->phy); | ||
419 | 426 | ||
420 | pm_runtime_put_noidle(musb->controller); | 427 | pm_runtime_put_noidle(musb->controller); |
421 | return 0; | 428 | return 0; |
@@ -478,6 +485,7 @@ static int omap2430_musb_exit(struct musb *musb) | |||
478 | del_timer_sync(&musb_idle_timer); | 485 | del_timer_sync(&musb_idle_timer); |
479 | 486 | ||
480 | omap2430_low_level_exit(musb); | 487 | omap2430_low_level_exit(musb); |
488 | phy_power_off(musb->phy); | ||
481 | phy_exit(musb->phy); | 489 | phy_exit(musb->phy); |
482 | 490 | ||
483 | return 0; | 491 | return 0; |
diff --git a/drivers/usb/phy/phy-am335x-control.c b/drivers/usb/phy/phy-am335x-control.c index d75196ad5f2f..35b6083b7999 100644 --- a/drivers/usb/phy/phy-am335x-control.c +++ b/drivers/usb/phy/phy-am335x-control.c | |||
@@ -3,6 +3,7 @@ | |||
3 | #include <linux/err.h> | 3 | #include <linux/err.h> |
4 | #include <linux/of.h> | 4 | #include <linux/of.h> |
5 | #include <linux/io.h> | 5 | #include <linux/io.h> |
6 | #include <linux/delay.h> | ||
6 | #include "am35x-phy-control.h" | 7 | #include "am35x-phy-control.h" |
7 | 8 | ||
8 | struct am335x_control_usb { | 9 | struct am335x_control_usb { |
@@ -86,6 +87,14 @@ static void am335x_phy_power(struct phy_control *phy_ctrl, u32 id, bool on) | |||
86 | } | 87 | } |
87 | 88 | ||
88 | writel(val, usb_ctrl->phy_reg + reg); | 89 | writel(val, usb_ctrl->phy_reg + reg); |
90 | |||
91 | /* | ||
92 | * Give the PHY ~1ms to complete the power up operation. | ||
93 | * Tests have shown unstable behaviour if other USB PHY related | ||
94 | * registers are written too shortly after such a transition. | ||
95 | */ | ||
96 | if (on) | ||
97 | mdelay(1); | ||
89 | } | 98 | } |
90 | 99 | ||
91 | static const struct phy_control ctrl_am335x = { | 100 | static const struct phy_control ctrl_am335x = { |
diff --git a/drivers/usb/phy/phy.c b/drivers/usb/phy/phy.c index 8afa813d690b..36b6bce33b20 100644 --- a/drivers/usb/phy/phy.c +++ b/drivers/usb/phy/phy.c | |||
@@ -132,6 +132,9 @@ struct usb_phy *usb_get_phy(enum usb_phy_type type) | |||
132 | if (IS_ERR(phy) || !try_module_get(phy->dev->driver->owner)) { | 132 | if (IS_ERR(phy) || !try_module_get(phy->dev->driver->owner)) { |
133 | pr_debug("PHY: unable to find transceiver of type %s\n", | 133 | pr_debug("PHY: unable to find transceiver of type %s\n", |
134 | usb_phy_type_string(type)); | 134 | usb_phy_type_string(type)); |
135 | if (!IS_ERR(phy)) | ||
136 | phy = ERR_PTR(-ENODEV); | ||
137 | |||
135 | goto err0; | 138 | goto err0; |
136 | } | 139 | } |
137 | 140 | ||
diff --git a/drivers/usb/serial/io_ti.c b/drivers/usb/serial/io_ti.c index a2db5be9c305..df90dae53eb9 100644 --- a/drivers/usb/serial/io_ti.c +++ b/drivers/usb/serial/io_ti.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <linux/spinlock.h> | 28 | #include <linux/spinlock.h> |
29 | #include <linux/mutex.h> | 29 | #include <linux/mutex.h> |
30 | #include <linux/serial.h> | 30 | #include <linux/serial.h> |
31 | #include <linux/swab.h> | ||
31 | #include <linux/kfifo.h> | 32 | #include <linux/kfifo.h> |
32 | #include <linux/ioctl.h> | 33 | #include <linux/ioctl.h> |
33 | #include <linux/firmware.h> | 34 | #include <linux/firmware.h> |
@@ -280,7 +281,7 @@ static int read_download_mem(struct usb_device *dev, int start_address, | |||
280 | { | 281 | { |
281 | int status = 0; | 282 | int status = 0; |
282 | __u8 read_length; | 283 | __u8 read_length; |
283 | __be16 be_start_address; | 284 | u16 be_start_address; |
284 | 285 | ||
285 | dev_dbg(&dev->dev, "%s - @ %x for %d\n", __func__, start_address, length); | 286 | dev_dbg(&dev->dev, "%s - @ %x for %d\n", __func__, start_address, length); |
286 | 287 | ||
@@ -296,10 +297,14 @@ static int read_download_mem(struct usb_device *dev, int start_address, | |||
296 | if (read_length > 1) { | 297 | if (read_length > 1) { |
297 | dev_dbg(&dev->dev, "%s - @ %x for %d\n", __func__, start_address, read_length); | 298 | dev_dbg(&dev->dev, "%s - @ %x for %d\n", __func__, start_address, read_length); |
298 | } | 299 | } |
299 | be_start_address = cpu_to_be16(start_address); | 300 | /* |
301 | * NOTE: Must use swab as wIndex is sent in little-endian | ||
302 | * byte order regardless of host byte order. | ||
303 | */ | ||
304 | be_start_address = swab16((u16)start_address); | ||
300 | status = ti_vread_sync(dev, UMPC_MEMORY_READ, | 305 | status = ti_vread_sync(dev, UMPC_MEMORY_READ, |
301 | (__u16)address_type, | 306 | (__u16)address_type, |
302 | (__force __u16)be_start_address, | 307 | be_start_address, |
303 | buffer, read_length); | 308 | buffer, read_length); |
304 | 309 | ||
305 | if (status) { | 310 | if (status) { |
@@ -394,7 +399,7 @@ static int write_i2c_mem(struct edgeport_serial *serial, | |||
394 | struct device *dev = &serial->serial->dev->dev; | 399 | struct device *dev = &serial->serial->dev->dev; |
395 | int status = 0; | 400 | int status = 0; |
396 | int write_length; | 401 | int write_length; |
397 | __be16 be_start_address; | 402 | u16 be_start_address; |
398 | 403 | ||
399 | /* We can only send a maximum of 1 aligned byte page at a time */ | 404 | /* We can only send a maximum of 1 aligned byte page at a time */ |
400 | 405 | ||
@@ -409,11 +414,16 @@ static int write_i2c_mem(struct edgeport_serial *serial, | |||
409 | __func__, start_address, write_length); | 414 | __func__, start_address, write_length); |
410 | usb_serial_debug_data(dev, __func__, write_length, buffer); | 415 | usb_serial_debug_data(dev, __func__, write_length, buffer); |
411 | 416 | ||
412 | /* Write first page */ | 417 | /* |
413 | be_start_address = cpu_to_be16(start_address); | 418 | * Write first page. |
419 | * | ||
420 | * NOTE: Must use swab as wIndex is sent in little-endian byte order | ||
421 | * regardless of host byte order. | ||
422 | */ | ||
423 | be_start_address = swab16((u16)start_address); | ||
414 | status = ti_vsend_sync(serial->serial->dev, | 424 | status = ti_vsend_sync(serial->serial->dev, |
415 | UMPC_MEMORY_WRITE, (__u16)address_type, | 425 | UMPC_MEMORY_WRITE, (__u16)address_type, |
416 | (__force __u16)be_start_address, | 426 | be_start_address, |
417 | buffer, write_length); | 427 | buffer, write_length); |
418 | if (status) { | 428 | if (status) { |
419 | dev_dbg(dev, "%s - ERROR %d\n", __func__, status); | 429 | dev_dbg(dev, "%s - ERROR %d\n", __func__, status); |
@@ -436,11 +446,16 @@ static int write_i2c_mem(struct edgeport_serial *serial, | |||
436 | __func__, start_address, write_length); | 446 | __func__, start_address, write_length); |
437 | usb_serial_debug_data(dev, __func__, write_length, buffer); | 447 | usb_serial_debug_data(dev, __func__, write_length, buffer); |
438 | 448 | ||
439 | /* Write next page */ | 449 | /* |
440 | be_start_address = cpu_to_be16(start_address); | 450 | * Write next page. |
451 | * | ||
452 | * NOTE: Must use swab as wIndex is sent in little-endian byte | ||
453 | * order regardless of host byte order. | ||
454 | */ | ||
455 | be_start_address = swab16((u16)start_address); | ||
441 | status = ti_vsend_sync(serial->serial->dev, UMPC_MEMORY_WRITE, | 456 | status = ti_vsend_sync(serial->serial->dev, UMPC_MEMORY_WRITE, |
442 | (__u16)address_type, | 457 | (__u16)address_type, |
443 | (__force __u16)be_start_address, | 458 | be_start_address, |
444 | buffer, write_length); | 459 | buffer, write_length); |
445 | if (status) { | 460 | if (status) { |
446 | dev_err(dev, "%s - ERROR %d\n", __func__, status); | 461 | dev_err(dev, "%s - ERROR %d\n", __func__, status); |
@@ -585,8 +600,8 @@ static int get_descriptor_addr(struct edgeport_serial *serial, | |||
585 | if (rom_desc->Type == desc_type) | 600 | if (rom_desc->Type == desc_type) |
586 | return start_address; | 601 | return start_address; |
587 | 602 | ||
588 | start_address = start_address + sizeof(struct ti_i2c_desc) | 603 | start_address = start_address + sizeof(struct ti_i2c_desc) + |
589 | + rom_desc->Size; | 604 | le16_to_cpu(rom_desc->Size); |
590 | 605 | ||
591 | } while ((start_address < TI_MAX_I2C_SIZE) && rom_desc->Type); | 606 | } while ((start_address < TI_MAX_I2C_SIZE) && rom_desc->Type); |
592 | 607 | ||
@@ -599,7 +614,7 @@ static int valid_csum(struct ti_i2c_desc *rom_desc, __u8 *buffer) | |||
599 | __u16 i; | 614 | __u16 i; |
600 | __u8 cs = 0; | 615 | __u8 cs = 0; |
601 | 616 | ||
602 | for (i = 0; i < rom_desc->Size; i++) | 617 | for (i = 0; i < le16_to_cpu(rom_desc->Size); i++) |
603 | cs = (__u8)(cs + buffer[i]); | 618 | cs = (__u8)(cs + buffer[i]); |
604 | 619 | ||
605 | if (cs != rom_desc->CheckSum) { | 620 | if (cs != rom_desc->CheckSum) { |
@@ -650,7 +665,7 @@ static int check_i2c_image(struct edgeport_serial *serial) | |||
650 | break; | 665 | break; |
651 | 666 | ||
652 | if ((start_address + sizeof(struct ti_i2c_desc) + | 667 | if ((start_address + sizeof(struct ti_i2c_desc) + |
653 | rom_desc->Size) > TI_MAX_I2C_SIZE) { | 668 | le16_to_cpu(rom_desc->Size)) > TI_MAX_I2C_SIZE) { |
654 | status = -ENODEV; | 669 | status = -ENODEV; |
655 | dev_dbg(dev, "%s - structure too big, erroring out.\n", __func__); | 670 | dev_dbg(dev, "%s - structure too big, erroring out.\n", __func__); |
656 | break; | 671 | break; |
@@ -665,7 +680,8 @@ static int check_i2c_image(struct edgeport_serial *serial) | |||
665 | /* Read the descriptor data */ | 680 | /* Read the descriptor data */ |
666 | status = read_rom(serial, start_address + | 681 | status = read_rom(serial, start_address + |
667 | sizeof(struct ti_i2c_desc), | 682 | sizeof(struct ti_i2c_desc), |
668 | rom_desc->Size, buffer); | 683 | le16_to_cpu(rom_desc->Size), |
684 | buffer); | ||
669 | if (status) | 685 | if (status) |
670 | break; | 686 | break; |
671 | 687 | ||
@@ -674,7 +690,7 @@ static int check_i2c_image(struct edgeport_serial *serial) | |||
674 | break; | 690 | break; |
675 | } | 691 | } |
676 | start_address = start_address + sizeof(struct ti_i2c_desc) + | 692 | start_address = start_address + sizeof(struct ti_i2c_desc) + |
677 | rom_desc->Size; | 693 | le16_to_cpu(rom_desc->Size); |
678 | 694 | ||
679 | } while ((rom_desc->Type != I2C_DESC_TYPE_ION) && | 695 | } while ((rom_desc->Type != I2C_DESC_TYPE_ION) && |
680 | (start_address < TI_MAX_I2C_SIZE)); | 696 | (start_address < TI_MAX_I2C_SIZE)); |
@@ -712,7 +728,7 @@ static int get_manuf_info(struct edgeport_serial *serial, __u8 *buffer) | |||
712 | 728 | ||
713 | /* Read the descriptor data */ | 729 | /* Read the descriptor data */ |
714 | status = read_rom(serial, start_address+sizeof(struct ti_i2c_desc), | 730 | status = read_rom(serial, start_address+sizeof(struct ti_i2c_desc), |
715 | rom_desc->Size, buffer); | 731 | le16_to_cpu(rom_desc->Size), buffer); |
716 | if (status) | 732 | if (status) |
717 | goto exit; | 733 | goto exit; |
718 | 734 | ||
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 367c7f08b27c..f213ee978516 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
@@ -234,8 +234,31 @@ static void option_instat_callback(struct urb *urb); | |||
234 | #define QUALCOMM_VENDOR_ID 0x05C6 | 234 | #define QUALCOMM_VENDOR_ID 0x05C6 |
235 | 235 | ||
236 | #define CMOTECH_VENDOR_ID 0x16d8 | 236 | #define CMOTECH_VENDOR_ID 0x16d8 |
237 | #define CMOTECH_PRODUCT_6008 0x6008 | 237 | #define CMOTECH_PRODUCT_6001 0x6001 |
238 | #define CMOTECH_PRODUCT_6280 0x6280 | 238 | #define CMOTECH_PRODUCT_CMU_300 0x6002 |
239 | #define CMOTECH_PRODUCT_6003 0x6003 | ||
240 | #define CMOTECH_PRODUCT_6004 0x6004 | ||
241 | #define CMOTECH_PRODUCT_6005 0x6005 | ||
242 | #define CMOTECH_PRODUCT_CGU_628A 0x6006 | ||
243 | #define CMOTECH_PRODUCT_CHE_628S 0x6007 | ||
244 | #define CMOTECH_PRODUCT_CMU_301 0x6008 | ||
245 | #define CMOTECH_PRODUCT_CHU_628 0x6280 | ||
246 | #define CMOTECH_PRODUCT_CHU_628S 0x6281 | ||
247 | #define CMOTECH_PRODUCT_CDU_680 0x6803 | ||
248 | #define CMOTECH_PRODUCT_CDU_685A 0x6804 | ||
249 | #define CMOTECH_PRODUCT_CHU_720S 0x7001 | ||
250 | #define CMOTECH_PRODUCT_7002 0x7002 | ||
251 | #define CMOTECH_PRODUCT_CHU_629K 0x7003 | ||
252 | #define CMOTECH_PRODUCT_7004 0x7004 | ||
253 | #define CMOTECH_PRODUCT_7005 0x7005 | ||
254 | #define CMOTECH_PRODUCT_CGU_629 0x7006 | ||
255 | #define CMOTECH_PRODUCT_CHU_629S 0x700a | ||
256 | #define CMOTECH_PRODUCT_CHU_720I 0x7211 | ||
257 | #define CMOTECH_PRODUCT_7212 0x7212 | ||
258 | #define CMOTECH_PRODUCT_7213 0x7213 | ||
259 | #define CMOTECH_PRODUCT_7251 0x7251 | ||
260 | #define CMOTECH_PRODUCT_7252 0x7252 | ||
261 | #define CMOTECH_PRODUCT_7253 0x7253 | ||
239 | 262 | ||
240 | #define TELIT_VENDOR_ID 0x1bc7 | 263 | #define TELIT_VENDOR_ID 0x1bc7 |
241 | #define TELIT_PRODUCT_UC864E 0x1003 | 264 | #define TELIT_PRODUCT_UC864E 0x1003 |
@@ -287,6 +310,7 @@ static void option_instat_callback(struct urb *urb); | |||
287 | #define ALCATEL_PRODUCT_X060S_X200 0x0000 | 310 | #define ALCATEL_PRODUCT_X060S_X200 0x0000 |
288 | #define ALCATEL_PRODUCT_X220_X500D 0x0017 | 311 | #define ALCATEL_PRODUCT_X220_X500D 0x0017 |
289 | #define ALCATEL_PRODUCT_L100V 0x011e | 312 | #define ALCATEL_PRODUCT_L100V 0x011e |
313 | #define ALCATEL_PRODUCT_L800MA 0x0203 | ||
290 | 314 | ||
291 | #define PIRELLI_VENDOR_ID 0x1266 | 315 | #define PIRELLI_VENDOR_ID 0x1266 |
292 | #define PIRELLI_PRODUCT_C100_1 0x1002 | 316 | #define PIRELLI_PRODUCT_C100_1 0x1002 |
@@ -349,6 +373,7 @@ static void option_instat_callback(struct urb *urb); | |||
349 | #define OLIVETTI_PRODUCT_OLICARD100 0xc000 | 373 | #define OLIVETTI_PRODUCT_OLICARD100 0xc000 |
350 | #define OLIVETTI_PRODUCT_OLICARD145 0xc003 | 374 | #define OLIVETTI_PRODUCT_OLICARD145 0xc003 |
351 | #define OLIVETTI_PRODUCT_OLICARD200 0xc005 | 375 | #define OLIVETTI_PRODUCT_OLICARD200 0xc005 |
376 | #define OLIVETTI_PRODUCT_OLICARD500 0xc00b | ||
352 | 377 | ||
353 | /* Celot products */ | 378 | /* Celot products */ |
354 | #define CELOT_VENDOR_ID 0x211f | 379 | #define CELOT_VENDOR_ID 0x211f |
@@ -502,6 +527,10 @@ static const struct option_blacklist_info huawei_cdc12_blacklist = { | |||
502 | .reserved = BIT(1) | BIT(2), | 527 | .reserved = BIT(1) | BIT(2), |
503 | }; | 528 | }; |
504 | 529 | ||
530 | static const struct option_blacklist_info net_intf0_blacklist = { | ||
531 | .reserved = BIT(0), | ||
532 | }; | ||
533 | |||
505 | static const struct option_blacklist_info net_intf1_blacklist = { | 534 | static const struct option_blacklist_info net_intf1_blacklist = { |
506 | .reserved = BIT(1), | 535 | .reserved = BIT(1), |
507 | }; | 536 | }; |
@@ -1035,8 +1064,47 @@ static const struct usb_device_id option_ids[] = { | |||
1035 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ | 1064 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ |
1036 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x0023)}, /* ONYX 3G device */ | 1065 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x0023)}, /* ONYX 3G device */ |
1037 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000)}, /* SIMCom SIM5218 */ | 1066 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000)}, /* SIMCom SIM5218 */ |
1038 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6280) }, /* BP3-USB & BP3-EXT HSDPA */ | 1067 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6001) }, |
1039 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6008) }, | 1068 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CMU_300) }, |
1069 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6003), | ||
1070 | .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, | ||
1071 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6004) }, | ||
1072 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6005) }, | ||
1073 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CGU_628A) }, | ||
1074 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CHE_628S), | ||
1075 | .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, | ||
1076 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CMU_301), | ||
1077 | .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, | ||
1078 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CHU_628), | ||
1079 | .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, | ||
1080 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CHU_628S) }, | ||
1081 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CDU_680) }, | ||
1082 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CDU_685A) }, | ||
1083 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CHU_720S), | ||
1084 | .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, | ||
1085 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_7002), | ||
1086 | .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, | ||
1087 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CHU_629K), | ||
1088 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | ||
1089 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_7004), | ||
1090 | .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, | ||
1091 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_7005) }, | ||
1092 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CGU_629), | ||
1093 | .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, | ||
1094 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CHU_629S), | ||
1095 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | ||
1096 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CHU_720I), | ||
1097 | .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, | ||
1098 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_7212), | ||
1099 | .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, | ||
1100 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_7213), | ||
1101 | .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, | ||
1102 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_7251), | ||
1103 | .driver_info = (kernel_ulong_t)&net_intf1_blacklist }, | ||
1104 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_7252), | ||
1105 | .driver_info = (kernel_ulong_t)&net_intf1_blacklist }, | ||
1106 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_7253), | ||
1107 | .driver_info = (kernel_ulong_t)&net_intf1_blacklist }, | ||
1040 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) }, | 1108 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) }, |
1041 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864G) }, | 1109 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864G) }, |
1042 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_CC864_DUAL) }, | 1110 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_CC864_DUAL) }, |
@@ -1500,6 +1568,8 @@ static const struct usb_device_id option_ids[] = { | |||
1500 | .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, | 1568 | .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, |
1501 | { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_L100V), | 1569 | { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_L100V), |
1502 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | 1570 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
1571 | { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_L800MA), | ||
1572 | .driver_info = (kernel_ulong_t)&net_intf2_blacklist }, | ||
1503 | { USB_DEVICE(AIRPLUS_VENDOR_ID, AIRPLUS_PRODUCT_MCD650) }, | 1573 | { USB_DEVICE(AIRPLUS_VENDOR_ID, AIRPLUS_PRODUCT_MCD650) }, |
1504 | { USB_DEVICE(TLAYTECH_VENDOR_ID, TLAYTECH_PRODUCT_TEU800) }, | 1574 | { USB_DEVICE(TLAYTECH_VENDOR_ID, TLAYTECH_PRODUCT_TEU800) }, |
1505 | { USB_DEVICE(LONGCHEER_VENDOR_ID, FOUR_G_SYSTEMS_PRODUCT_W14), | 1575 | { USB_DEVICE(LONGCHEER_VENDOR_ID, FOUR_G_SYSTEMS_PRODUCT_W14), |
@@ -1545,6 +1615,9 @@ static const struct usb_device_id option_ids[] = { | |||
1545 | { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD200), | 1615 | { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD200), |
1546 | .driver_info = (kernel_ulong_t)&net_intf6_blacklist | 1616 | .driver_info = (kernel_ulong_t)&net_intf6_blacklist |
1547 | }, | 1617 | }, |
1618 | { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD500), | ||
1619 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist | ||
1620 | }, | ||
1548 | { USB_DEVICE(CELOT_VENDOR_ID, CELOT_PRODUCT_CT680M) }, /* CT-650 CDMA 450 1xEVDO modem */ | 1621 | { USB_DEVICE(CELOT_VENDOR_ID, CELOT_PRODUCT_CT680M) }, /* CT-650 CDMA 450 1xEVDO modem */ |
1549 | { USB_DEVICE_AND_INTERFACE_INFO(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_GT_B3730, USB_CLASS_CDC_DATA, 0x00, 0x00) }, /* Samsung GT-B3730 LTE USB modem.*/ | 1622 | { USB_DEVICE_AND_INTERFACE_INFO(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_GT_B3730, USB_CLASS_CDC_DATA, 0x00, 0x00) }, /* Samsung GT-B3730 LTE USB modem.*/ |
1550 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CEM600) }, | 1623 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CEM600) }, |
diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c index 968a40201e5f..7ed681a714a5 100644 --- a/drivers/usb/serial/qcserial.c +++ b/drivers/usb/serial/qcserial.c | |||
@@ -136,9 +136,18 @@ static const struct usb_device_id id_table[] = { | |||
136 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68a2, 0)}, /* Sierra Wireless MC7710 Device Management */ | 136 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68a2, 0)}, /* Sierra Wireless MC7710 Device Management */ |
137 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68a2, 2)}, /* Sierra Wireless MC7710 NMEA */ | 137 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68a2, 2)}, /* Sierra Wireless MC7710 NMEA */ |
138 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68a2, 3)}, /* Sierra Wireless MC7710 Modem */ | 138 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68a2, 3)}, /* Sierra Wireless MC7710 Modem */ |
139 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68c0, 0)}, /* Sierra Wireless MC73xx Device Management */ | ||
140 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68c0, 2)}, /* Sierra Wireless MC73xx NMEA */ | ||
141 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68c0, 3)}, /* Sierra Wireless MC73xx Modem */ | ||
139 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901c, 0)}, /* Sierra Wireless EM7700 Device Management */ | 142 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901c, 0)}, /* Sierra Wireless EM7700 Device Management */ |
140 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901c, 2)}, /* Sierra Wireless EM7700 NMEA */ | 143 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901c, 2)}, /* Sierra Wireless EM7700 NMEA */ |
141 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901c, 3)}, /* Sierra Wireless EM7700 Modem */ | 144 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901c, 3)}, /* Sierra Wireless EM7700 Modem */ |
145 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901f, 0)}, /* Sierra Wireless EM7355 Device Management */ | ||
146 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901f, 2)}, /* Sierra Wireless EM7355 NMEA */ | ||
147 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901f, 3)}, /* Sierra Wireless EM7355 Modem */ | ||
148 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9041, 0)}, /* Sierra Wireless MC7305/MC7355 Device Management */ | ||
149 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9041, 2)}, /* Sierra Wireless MC7305/MC7355 NMEA */ | ||
150 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9041, 3)}, /* Sierra Wireless MC7305/MC7355 Modem */ | ||
142 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9051, 0)}, /* Netgear AirCard 340U Device Management */ | 151 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9051, 0)}, /* Netgear AirCard 340U Device Management */ |
143 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9051, 2)}, /* Netgear AirCard 340U NMEA */ | 152 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9051, 2)}, /* Netgear AirCard 340U NMEA */ |
144 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9051, 3)}, /* Netgear AirCard 340U Modem */ | 153 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9051, 3)}, /* Netgear AirCard 340U Modem */ |
diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c index 81fc0dfcfdcf..6d40d56378d7 100644 --- a/drivers/usb/serial/usb-serial.c +++ b/drivers/usb/serial/usb-serial.c | |||
@@ -1347,10 +1347,12 @@ static int usb_serial_register(struct usb_serial_driver *driver) | |||
1347 | static void usb_serial_deregister(struct usb_serial_driver *device) | 1347 | static void usb_serial_deregister(struct usb_serial_driver *device) |
1348 | { | 1348 | { |
1349 | pr_info("USB Serial deregistering driver %s\n", device->description); | 1349 | pr_info("USB Serial deregistering driver %s\n", device->description); |
1350 | |||
1350 | mutex_lock(&table_lock); | 1351 | mutex_lock(&table_lock); |
1351 | list_del(&device->driver_list); | 1352 | list_del(&device->driver_list); |
1352 | usb_serial_bus_deregister(device); | ||
1353 | mutex_unlock(&table_lock); | 1353 | mutex_unlock(&table_lock); |
1354 | |||
1355 | usb_serial_bus_deregister(device); | ||
1354 | } | 1356 | } |
1355 | 1357 | ||
1356 | /** | 1358 | /** |
diff --git a/drivers/usb/wusbcore/mmc.c b/drivers/usb/wusbcore/mmc.c index 44741267c917..3f485df96226 100644 --- a/drivers/usb/wusbcore/mmc.c +++ b/drivers/usb/wusbcore/mmc.c | |||
@@ -301,7 +301,7 @@ int wusbhc_chid_set(struct wusbhc *wusbhc, const struct wusb_ckhdid *chid) | |||
301 | 301 | ||
302 | if (chid) | 302 | if (chid) |
303 | result = uwb_radio_start(&wusbhc->pal); | 303 | result = uwb_radio_start(&wusbhc->pal); |
304 | else | 304 | else if (wusbhc->uwb_rc) |
305 | uwb_radio_stop(&wusbhc->pal); | 305 | uwb_radio_stop(&wusbhc->pal); |
306 | 306 | ||
307 | return result; | 307 | return result; |
diff --git a/drivers/usb/wusbcore/wa-xfer.c b/drivers/usb/wusbcore/wa-xfer.c index c8e2a47d62a7..3e2e4ed20157 100644 --- a/drivers/usb/wusbcore/wa-xfer.c +++ b/drivers/usb/wusbcore/wa-xfer.c | |||
@@ -2390,10 +2390,10 @@ error_complete: | |||
2390 | done) { | 2390 | done) { |
2391 | 2391 | ||
2392 | dev_info(dev, "Control EP stall. Queue delayed work.\n"); | 2392 | dev_info(dev, "Control EP stall. Queue delayed work.\n"); |
2393 | spin_lock_irq(&wa->xfer_list_lock); | 2393 | spin_lock(&wa->xfer_list_lock); |
2394 | /* move xfer from xfer_list to xfer_errored_list. */ | 2394 | /* move xfer from xfer_list to xfer_errored_list. */ |
2395 | list_move_tail(&xfer->list_node, &wa->xfer_errored_list); | 2395 | list_move_tail(&xfer->list_node, &wa->xfer_errored_list); |
2396 | spin_unlock_irq(&wa->xfer_list_lock); | 2396 | spin_unlock(&wa->xfer_list_lock); |
2397 | spin_unlock_irqrestore(&xfer->lock, flags); | 2397 | spin_unlock_irqrestore(&xfer->lock, flags); |
2398 | queue_work(wusbd, &wa->xfer_error_work); | 2398 | queue_work(wusbd, &wa->xfer_error_work); |
2399 | } else { | 2399 | } else { |
diff --git a/drivers/uwb/drp.c b/drivers/uwb/drp.c index 1a2fd9795367..468c89fb6a16 100644 --- a/drivers/uwb/drp.c +++ b/drivers/uwb/drp.c | |||
@@ -59,6 +59,7 @@ static void uwb_rc_set_drp_cmd_done(struct uwb_rc *rc, void *arg, | |||
59 | struct uwb_rceb *reply, ssize_t reply_size) | 59 | struct uwb_rceb *reply, ssize_t reply_size) |
60 | { | 60 | { |
61 | struct uwb_rc_evt_set_drp_ie *r = (struct uwb_rc_evt_set_drp_ie *)reply; | 61 | struct uwb_rc_evt_set_drp_ie *r = (struct uwb_rc_evt_set_drp_ie *)reply; |
62 | unsigned long flags; | ||
62 | 63 | ||
63 | if (r != NULL) { | 64 | if (r != NULL) { |
64 | if (r->bResultCode != UWB_RC_RES_SUCCESS) | 65 | if (r->bResultCode != UWB_RC_RES_SUCCESS) |
@@ -67,14 +68,14 @@ static void uwb_rc_set_drp_cmd_done(struct uwb_rc *rc, void *arg, | |||
67 | } else | 68 | } else |
68 | dev_err(&rc->uwb_dev.dev, "SET-DRP-IE: timeout\n"); | 69 | dev_err(&rc->uwb_dev.dev, "SET-DRP-IE: timeout\n"); |
69 | 70 | ||
70 | spin_lock_irq(&rc->rsvs_lock); | 71 | spin_lock_irqsave(&rc->rsvs_lock, flags); |
71 | if (rc->set_drp_ie_pending > 1) { | 72 | if (rc->set_drp_ie_pending > 1) { |
72 | rc->set_drp_ie_pending = 0; | 73 | rc->set_drp_ie_pending = 0; |
73 | uwb_rsv_queue_update(rc); | 74 | uwb_rsv_queue_update(rc); |
74 | } else { | 75 | } else { |
75 | rc->set_drp_ie_pending = 0; | 76 | rc->set_drp_ie_pending = 0; |
76 | } | 77 | } |
77 | spin_unlock_irq(&rc->rsvs_lock); | 78 | spin_unlock_irqrestore(&rc->rsvs_lock, flags); |
78 | } | 79 | } |
79 | 80 | ||
80 | /** | 81 | /** |
@@ -112,6 +112,11 @@ struct kioctx { | |||
112 | 112 | ||
113 | struct work_struct free_work; | 113 | struct work_struct free_work; |
114 | 114 | ||
115 | /* | ||
116 | * signals when all in-flight requests are done | ||
117 | */ | ||
118 | struct completion *requests_done; | ||
119 | |||
115 | struct { | 120 | struct { |
116 | /* | 121 | /* |
117 | * This counts the number of available slots in the ringbuffer, | 122 | * This counts the number of available slots in the ringbuffer, |
@@ -508,6 +513,10 @@ static void free_ioctx_reqs(struct percpu_ref *ref) | |||
508 | { | 513 | { |
509 | struct kioctx *ctx = container_of(ref, struct kioctx, reqs); | 514 | struct kioctx *ctx = container_of(ref, struct kioctx, reqs); |
510 | 515 | ||
516 | /* At this point we know that there are no any in-flight requests */ | ||
517 | if (ctx->requests_done) | ||
518 | complete(ctx->requests_done); | ||
519 | |||
511 | INIT_WORK(&ctx->free_work, free_ioctx); | 520 | INIT_WORK(&ctx->free_work, free_ioctx); |
512 | schedule_work(&ctx->free_work); | 521 | schedule_work(&ctx->free_work); |
513 | } | 522 | } |
@@ -718,7 +727,8 @@ err: | |||
718 | * when the processes owning a context have all exited to encourage | 727 | * when the processes owning a context have all exited to encourage |
719 | * the rapid destruction of the kioctx. | 728 | * the rapid destruction of the kioctx. |
720 | */ | 729 | */ |
721 | static void kill_ioctx(struct mm_struct *mm, struct kioctx *ctx) | 730 | static void kill_ioctx(struct mm_struct *mm, struct kioctx *ctx, |
731 | struct completion *requests_done) | ||
722 | { | 732 | { |
723 | if (!atomic_xchg(&ctx->dead, 1)) { | 733 | if (!atomic_xchg(&ctx->dead, 1)) { |
724 | struct kioctx_table *table; | 734 | struct kioctx_table *table; |
@@ -747,7 +757,11 @@ static void kill_ioctx(struct mm_struct *mm, struct kioctx *ctx) | |||
747 | if (ctx->mmap_size) | 757 | if (ctx->mmap_size) |
748 | vm_munmap(ctx->mmap_base, ctx->mmap_size); | 758 | vm_munmap(ctx->mmap_base, ctx->mmap_size); |
749 | 759 | ||
760 | ctx->requests_done = requests_done; | ||
750 | percpu_ref_kill(&ctx->users); | 761 | percpu_ref_kill(&ctx->users); |
762 | } else { | ||
763 | if (requests_done) | ||
764 | complete(requests_done); | ||
751 | } | 765 | } |
752 | } | 766 | } |
753 | 767 | ||
@@ -809,7 +823,7 @@ void exit_aio(struct mm_struct *mm) | |||
809 | */ | 823 | */ |
810 | ctx->mmap_size = 0; | 824 | ctx->mmap_size = 0; |
811 | 825 | ||
812 | kill_ioctx(mm, ctx); | 826 | kill_ioctx(mm, ctx, NULL); |
813 | } | 827 | } |
814 | } | 828 | } |
815 | 829 | ||
@@ -1185,7 +1199,7 @@ SYSCALL_DEFINE2(io_setup, unsigned, nr_events, aio_context_t __user *, ctxp) | |||
1185 | if (!IS_ERR(ioctx)) { | 1199 | if (!IS_ERR(ioctx)) { |
1186 | ret = put_user(ioctx->user_id, ctxp); | 1200 | ret = put_user(ioctx->user_id, ctxp); |
1187 | if (ret) | 1201 | if (ret) |
1188 | kill_ioctx(current->mm, ioctx); | 1202 | kill_ioctx(current->mm, ioctx, NULL); |
1189 | percpu_ref_put(&ioctx->users); | 1203 | percpu_ref_put(&ioctx->users); |
1190 | } | 1204 | } |
1191 | 1205 | ||
@@ -1203,8 +1217,22 @@ SYSCALL_DEFINE1(io_destroy, aio_context_t, ctx) | |||
1203 | { | 1217 | { |
1204 | struct kioctx *ioctx = lookup_ioctx(ctx); | 1218 | struct kioctx *ioctx = lookup_ioctx(ctx); |
1205 | if (likely(NULL != ioctx)) { | 1219 | if (likely(NULL != ioctx)) { |
1206 | kill_ioctx(current->mm, ioctx); | 1220 | struct completion requests_done = |
1221 | COMPLETION_INITIALIZER_ONSTACK(requests_done); | ||
1222 | |||
1223 | /* Pass requests_done to kill_ioctx() where it can be set | ||
1224 | * in a thread-safe way. If we try to set it here then we have | ||
1225 | * a race condition if two io_destroy() called simultaneously. | ||
1226 | */ | ||
1227 | kill_ioctx(current->mm, ioctx, &requests_done); | ||
1207 | percpu_ref_put(&ioctx->users); | 1228 | percpu_ref_put(&ioctx->users); |
1229 | |||
1230 | /* Wait until all IO for the context are done. Otherwise kernel | ||
1231 | * keep using user-space buffers even if user thinks the context | ||
1232 | * is destroyed. | ||
1233 | */ | ||
1234 | wait_for_completion(&requests_done); | ||
1235 | |||
1208 | return 0; | 1236 | return 0; |
1209 | } | 1237 | } |
1210 | pr_debug("EINVAL: io_destroy: invalid context id\n"); | 1238 | pr_debug("EINVAL: io_destroy: invalid context id\n"); |
@@ -1299,10 +1327,8 @@ rw_common: | |||
1299 | &iovec, compat) | 1327 | &iovec, compat) |
1300 | : aio_setup_single_vector(req, rw, buf, &nr_segs, | 1328 | : aio_setup_single_vector(req, rw, buf, &nr_segs, |
1301 | iovec); | 1329 | iovec); |
1302 | if (ret) | 1330 | if (!ret) |
1303 | return ret; | 1331 | ret = rw_verify_area(rw, file, &req->ki_pos, req->ki_nbytes); |
1304 | |||
1305 | ret = rw_verify_area(rw, file, &req->ki_pos, req->ki_nbytes); | ||
1306 | if (ret < 0) { | 1332 | if (ret < 0) { |
1307 | if (iovec != &inline_vec) | 1333 | if (iovec != &inline_vec) |
1308 | kfree(iovec); | 1334 | kfree(iovec); |
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index 4c48df572bd6..ba6b88528dc7 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h | |||
@@ -2058,6 +2058,20 @@ struct btrfs_ioctl_defrag_range_args { | |||
2058 | #define btrfs_raw_test_opt(o, opt) ((o) & BTRFS_MOUNT_##opt) | 2058 | #define btrfs_raw_test_opt(o, opt) ((o) & BTRFS_MOUNT_##opt) |
2059 | #define btrfs_test_opt(root, opt) ((root)->fs_info->mount_opt & \ | 2059 | #define btrfs_test_opt(root, opt) ((root)->fs_info->mount_opt & \ |
2060 | BTRFS_MOUNT_##opt) | 2060 | BTRFS_MOUNT_##opt) |
2061 | #define btrfs_set_and_info(root, opt, fmt, args...) \ | ||
2062 | { \ | ||
2063 | if (!btrfs_test_opt(root, opt)) \ | ||
2064 | btrfs_info(root->fs_info, fmt, ##args); \ | ||
2065 | btrfs_set_opt(root->fs_info->mount_opt, opt); \ | ||
2066 | } | ||
2067 | |||
2068 | #define btrfs_clear_and_info(root, opt, fmt, args...) \ | ||
2069 | { \ | ||
2070 | if (btrfs_test_opt(root, opt)) \ | ||
2071 | btrfs_info(root->fs_info, fmt, ##args); \ | ||
2072 | btrfs_clear_opt(root->fs_info->mount_opt, opt); \ | ||
2073 | } | ||
2074 | |||
2061 | /* | 2075 | /* |
2062 | * Inode flags | 2076 | * Inode flags |
2063 | */ | 2077 | */ |
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 029d46c2e170..983314932af3 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
@@ -2861,7 +2861,7 @@ retry_root_backup: | |||
2861 | printk(KERN_ERR "BTRFS: failed to read log tree\n"); | 2861 | printk(KERN_ERR "BTRFS: failed to read log tree\n"); |
2862 | free_extent_buffer(log_tree_root->node); | 2862 | free_extent_buffer(log_tree_root->node); |
2863 | kfree(log_tree_root); | 2863 | kfree(log_tree_root); |
2864 | goto fail_trans_kthread; | 2864 | goto fail_qgroup; |
2865 | } | 2865 | } |
2866 | /* returns with log_tree_root freed on success */ | 2866 | /* returns with log_tree_root freed on success */ |
2867 | ret = btrfs_recover_log_trees(log_tree_root); | 2867 | ret = btrfs_recover_log_trees(log_tree_root); |
@@ -2870,24 +2870,24 @@ retry_root_backup: | |||
2870 | "Failed to recover log tree"); | 2870 | "Failed to recover log tree"); |
2871 | free_extent_buffer(log_tree_root->node); | 2871 | free_extent_buffer(log_tree_root->node); |
2872 | kfree(log_tree_root); | 2872 | kfree(log_tree_root); |
2873 | goto fail_trans_kthread; | 2873 | goto fail_qgroup; |
2874 | } | 2874 | } |
2875 | 2875 | ||
2876 | if (sb->s_flags & MS_RDONLY) { | 2876 | if (sb->s_flags & MS_RDONLY) { |
2877 | ret = btrfs_commit_super(tree_root); | 2877 | ret = btrfs_commit_super(tree_root); |
2878 | if (ret) | 2878 | if (ret) |
2879 | goto fail_trans_kthread; | 2879 | goto fail_qgroup; |
2880 | } | 2880 | } |
2881 | } | 2881 | } |
2882 | 2882 | ||
2883 | ret = btrfs_find_orphan_roots(tree_root); | 2883 | ret = btrfs_find_orphan_roots(tree_root); |
2884 | if (ret) | 2884 | if (ret) |
2885 | goto fail_trans_kthread; | 2885 | goto fail_qgroup; |
2886 | 2886 | ||
2887 | if (!(sb->s_flags & MS_RDONLY)) { | 2887 | if (!(sb->s_flags & MS_RDONLY)) { |
2888 | ret = btrfs_cleanup_fs_roots(fs_info); | 2888 | ret = btrfs_cleanup_fs_roots(fs_info); |
2889 | if (ret) | 2889 | if (ret) |
2890 | goto fail_trans_kthread; | 2890 | goto fail_qgroup; |
2891 | 2891 | ||
2892 | ret = btrfs_recover_relocation(tree_root); | 2892 | ret = btrfs_recover_relocation(tree_root); |
2893 | if (ret < 0) { | 2893 | if (ret < 0) { |
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 1306487c82cf..5590af92094b 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
@@ -1542,6 +1542,7 @@ again: | |||
1542 | ret = 0; | 1542 | ret = 0; |
1543 | } | 1543 | } |
1544 | if (ret) { | 1544 | if (ret) { |
1545 | key.objectid = bytenr; | ||
1545 | key.type = BTRFS_EXTENT_ITEM_KEY; | 1546 | key.type = BTRFS_EXTENT_ITEM_KEY; |
1546 | key.offset = num_bytes; | 1547 | key.offset = num_bytes; |
1547 | btrfs_release_path(path); | 1548 | btrfs_release_path(path); |
@@ -3542,11 +3543,13 @@ static u64 btrfs_reduce_alloc_profile(struct btrfs_root *root, u64 flags) | |||
3542 | return extended_to_chunk(flags | tmp); | 3543 | return extended_to_chunk(flags | tmp); |
3543 | } | 3544 | } |
3544 | 3545 | ||
3545 | static u64 get_alloc_profile(struct btrfs_root *root, u64 flags) | 3546 | static u64 get_alloc_profile(struct btrfs_root *root, u64 orig_flags) |
3546 | { | 3547 | { |
3547 | unsigned seq; | 3548 | unsigned seq; |
3549 | u64 flags; | ||
3548 | 3550 | ||
3549 | do { | 3551 | do { |
3552 | flags = orig_flags; | ||
3550 | seq = read_seqbegin(&root->fs_info->profiles_lock); | 3553 | seq = read_seqbegin(&root->fs_info->profiles_lock); |
3551 | 3554 | ||
3552 | if (flags & BTRFS_BLOCK_GROUP_DATA) | 3555 | if (flags & BTRFS_BLOCK_GROUP_DATA) |
@@ -5719,6 +5722,7 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans, | |||
5719 | 5722 | ||
5720 | if (ret > 0 && skinny_metadata) { | 5723 | if (ret > 0 && skinny_metadata) { |
5721 | skinny_metadata = false; | 5724 | skinny_metadata = false; |
5725 | key.objectid = bytenr; | ||
5722 | key.type = BTRFS_EXTENT_ITEM_KEY; | 5726 | key.type = BTRFS_EXTENT_ITEM_KEY; |
5723 | key.offset = num_bytes; | 5727 | key.offset = num_bytes; |
5724 | btrfs_release_path(path); | 5728 | btrfs_release_path(path); |
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index eb742c07e7a4..ae6af072b635 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c | |||
@@ -800,7 +800,7 @@ next_slot: | |||
800 | if (start > key.offset && end < extent_end) { | 800 | if (start > key.offset && end < extent_end) { |
801 | BUG_ON(del_nr > 0); | 801 | BUG_ON(del_nr > 0); |
802 | if (extent_type == BTRFS_FILE_EXTENT_INLINE) { | 802 | if (extent_type == BTRFS_FILE_EXTENT_INLINE) { |
803 | ret = -EINVAL; | 803 | ret = -EOPNOTSUPP; |
804 | break; | 804 | break; |
805 | } | 805 | } |
806 | 806 | ||
@@ -846,7 +846,7 @@ next_slot: | |||
846 | */ | 846 | */ |
847 | if (start <= key.offset && end < extent_end) { | 847 | if (start <= key.offset && end < extent_end) { |
848 | if (extent_type == BTRFS_FILE_EXTENT_INLINE) { | 848 | if (extent_type == BTRFS_FILE_EXTENT_INLINE) { |
849 | ret = -EINVAL; | 849 | ret = -EOPNOTSUPP; |
850 | break; | 850 | break; |
851 | } | 851 | } |
852 | 852 | ||
@@ -872,7 +872,7 @@ next_slot: | |||
872 | if (start > key.offset && end >= extent_end) { | 872 | if (start > key.offset && end >= extent_end) { |
873 | BUG_ON(del_nr > 0); | 873 | BUG_ON(del_nr > 0); |
874 | if (extent_type == BTRFS_FILE_EXTENT_INLINE) { | 874 | if (extent_type == BTRFS_FILE_EXTENT_INLINE) { |
875 | ret = -EINVAL; | 875 | ret = -EOPNOTSUPP; |
876 | break; | 876 | break; |
877 | } | 877 | } |
878 | 878 | ||
@@ -1777,7 +1777,7 @@ static ssize_t btrfs_file_aio_write(struct kiocb *iocb, | |||
1777 | start_pos = round_down(pos, root->sectorsize); | 1777 | start_pos = round_down(pos, root->sectorsize); |
1778 | if (start_pos > i_size_read(inode)) { | 1778 | if (start_pos > i_size_read(inode)) { |
1779 | /* Expand hole size to cover write data, preventing empty gap */ | 1779 | /* Expand hole size to cover write data, preventing empty gap */ |
1780 | end_pos = round_up(pos + iov->iov_len, root->sectorsize); | 1780 | end_pos = round_up(pos + count, root->sectorsize); |
1781 | err = btrfs_cont_expand(inode, i_size_read(inode), end_pos); | 1781 | err = btrfs_cont_expand(inode, i_size_read(inode), end_pos); |
1782 | if (err) { | 1782 | if (err) { |
1783 | mutex_unlock(&inode->i_mutex); | 1783 | mutex_unlock(&inode->i_mutex); |
diff --git a/fs/btrfs/inode-map.c b/fs/btrfs/inode-map.c index cc8ca193d830..86935f5ae291 100644 --- a/fs/btrfs/inode-map.c +++ b/fs/btrfs/inode-map.c | |||
@@ -176,7 +176,11 @@ static void start_caching(struct btrfs_root *root) | |||
176 | 176 | ||
177 | tsk = kthread_run(caching_kthread, root, "btrfs-ino-cache-%llu\n", | 177 | tsk = kthread_run(caching_kthread, root, "btrfs-ino-cache-%llu\n", |
178 | root->root_key.objectid); | 178 | root->root_key.objectid); |
179 | BUG_ON(IS_ERR(tsk)); /* -ENOMEM */ | 179 | if (IS_ERR(tsk)) { |
180 | btrfs_warn(root->fs_info, "failed to start inode caching task"); | ||
181 | btrfs_clear_and_info(root, CHANGE_INODE_CACHE, | ||
182 | "disabling inode map caching"); | ||
183 | } | ||
180 | } | 184 | } |
181 | 185 | ||
182 | int btrfs_find_free_ino(struct btrfs_root *root, u64 *objectid) | 186 | int btrfs_find_free_ino(struct btrfs_root *root, u64 *objectid) |
@@ -205,24 +209,14 @@ again: | |||
205 | 209 | ||
206 | void btrfs_return_ino(struct btrfs_root *root, u64 objectid) | 210 | void btrfs_return_ino(struct btrfs_root *root, u64 objectid) |
207 | { | 211 | { |
208 | struct btrfs_free_space_ctl *ctl = root->free_ino_ctl; | ||
209 | struct btrfs_free_space_ctl *pinned = root->free_ino_pinned; | 212 | struct btrfs_free_space_ctl *pinned = root->free_ino_pinned; |
210 | 213 | ||
211 | if (!btrfs_test_opt(root, INODE_MAP_CACHE)) | 214 | if (!btrfs_test_opt(root, INODE_MAP_CACHE)) |
212 | return; | 215 | return; |
213 | |||
214 | again: | 216 | again: |
215 | if (root->cached == BTRFS_CACHE_FINISHED) { | 217 | if (root->cached == BTRFS_CACHE_FINISHED) { |
216 | __btrfs_add_free_space(ctl, objectid, 1); | 218 | __btrfs_add_free_space(pinned, objectid, 1); |
217 | } else { | 219 | } else { |
218 | /* | ||
219 | * If we are in the process of caching free ino chunks, | ||
220 | * to avoid adding the same inode number to the free_ino | ||
221 | * tree twice due to cross transaction, we'll leave it | ||
222 | * in the pinned tree until a transaction is committed | ||
223 | * or the caching work is done. | ||
224 | */ | ||
225 | |||
226 | down_write(&root->fs_info->commit_root_sem); | 220 | down_write(&root->fs_info->commit_root_sem); |
227 | spin_lock(&root->cache_lock); | 221 | spin_lock(&root->cache_lock); |
228 | if (root->cached == BTRFS_CACHE_FINISHED) { | 222 | if (root->cached == BTRFS_CACHE_FINISHED) { |
@@ -234,11 +228,7 @@ again: | |||
234 | 228 | ||
235 | start_caching(root); | 229 | start_caching(root); |
236 | 230 | ||
237 | if (objectid <= root->cache_progress || | 231 | __btrfs_add_free_space(pinned, objectid, 1); |
238 | objectid >= root->highest_objectid) | ||
239 | __btrfs_add_free_space(ctl, objectid, 1); | ||
240 | else | ||
241 | __btrfs_add_free_space(pinned, objectid, 1); | ||
242 | 232 | ||
243 | up_write(&root->fs_info->commit_root_sem); | 233 | up_write(&root->fs_info->commit_root_sem); |
244 | } | 234 | } |
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index e79ff6b90cb7..2ad7de94efef 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c | |||
@@ -3066,7 +3066,7 @@ process_slot: | |||
3066 | new_key.offset + datal, | 3066 | new_key.offset + datal, |
3067 | 1); | 3067 | 1); |
3068 | if (ret) { | 3068 | if (ret) { |
3069 | if (ret != -EINVAL) | 3069 | if (ret != -EOPNOTSUPP) |
3070 | btrfs_abort_transaction(trans, | 3070 | btrfs_abort_transaction(trans, |
3071 | root, ret); | 3071 | root, ret); |
3072 | btrfs_end_transaction(trans, root); | 3072 | btrfs_end_transaction(trans, root); |
@@ -3141,7 +3141,7 @@ process_slot: | |||
3141 | new_key.offset + datal, | 3141 | new_key.offset + datal, |
3142 | 1); | 3142 | 1); |
3143 | if (ret) { | 3143 | if (ret) { |
3144 | if (ret != -EINVAL) | 3144 | if (ret != -EOPNOTSUPP) |
3145 | btrfs_abort_transaction(trans, | 3145 | btrfs_abort_transaction(trans, |
3146 | root, ret); | 3146 | root, ret); |
3147 | btrfs_end_transaction(trans, root); | 3147 | btrfs_end_transaction(trans, root); |
diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c index 1ac3ca98c429..eb6537a08c1b 100644 --- a/fs/btrfs/send.c +++ b/fs/btrfs/send.c | |||
@@ -349,6 +349,11 @@ static int fs_path_ensure_buf(struct fs_path *p, int len) | |||
349 | if (p->buf_len >= len) | 349 | if (p->buf_len >= len) |
350 | return 0; | 350 | return 0; |
351 | 351 | ||
352 | if (len > PATH_MAX) { | ||
353 | WARN_ON(1); | ||
354 | return -ENOMEM; | ||
355 | } | ||
356 | |||
352 | path_len = p->end - p->start; | 357 | path_len = p->end - p->start; |
353 | old_buf_len = p->buf_len; | 358 | old_buf_len = p->buf_len; |
354 | 359 | ||
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 5011aadacab8..9601d25a4607 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c | |||
@@ -385,20 +385,6 @@ static match_table_t tokens = { | |||
385 | {Opt_err, NULL}, | 385 | {Opt_err, NULL}, |
386 | }; | 386 | }; |
387 | 387 | ||
388 | #define btrfs_set_and_info(root, opt, fmt, args...) \ | ||
389 | { \ | ||
390 | if (!btrfs_test_opt(root, opt)) \ | ||
391 | btrfs_info(root->fs_info, fmt, ##args); \ | ||
392 | btrfs_set_opt(root->fs_info->mount_opt, opt); \ | ||
393 | } | ||
394 | |||
395 | #define btrfs_clear_and_info(root, opt, fmt, args...) \ | ||
396 | { \ | ||
397 | if (btrfs_test_opt(root, opt)) \ | ||
398 | btrfs_info(root->fs_info, fmt, ##args); \ | ||
399 | btrfs_clear_opt(root->fs_info->mount_opt, opt); \ | ||
400 | } | ||
401 | |||
402 | /* | 388 | /* |
403 | * Regular mount options parser. Everything that is needed only when | 389 | * Regular mount options parser. Everything that is needed only when |
404 | * reading in a new superblock is parsed here. | 390 | * reading in a new superblock is parsed here. |
@@ -1186,7 +1172,6 @@ static struct dentry *mount_subvol(const char *subvol_name, int flags, | |||
1186 | return ERR_PTR(-ENOMEM); | 1172 | return ERR_PTR(-ENOMEM); |
1187 | mnt = vfs_kern_mount(&btrfs_fs_type, flags, device_name, | 1173 | mnt = vfs_kern_mount(&btrfs_fs_type, flags, device_name, |
1188 | newargs); | 1174 | newargs); |
1189 | kfree(newargs); | ||
1190 | 1175 | ||
1191 | if (PTR_RET(mnt) == -EBUSY) { | 1176 | if (PTR_RET(mnt) == -EBUSY) { |
1192 | if (flags & MS_RDONLY) { | 1177 | if (flags & MS_RDONLY) { |
@@ -1196,17 +1181,22 @@ static struct dentry *mount_subvol(const char *subvol_name, int flags, | |||
1196 | int r; | 1181 | int r; |
1197 | mnt = vfs_kern_mount(&btrfs_fs_type, flags | MS_RDONLY, device_name, | 1182 | mnt = vfs_kern_mount(&btrfs_fs_type, flags | MS_RDONLY, device_name, |
1198 | newargs); | 1183 | newargs); |
1199 | if (IS_ERR(mnt)) | 1184 | if (IS_ERR(mnt)) { |
1185 | kfree(newargs); | ||
1200 | return ERR_CAST(mnt); | 1186 | return ERR_CAST(mnt); |
1187 | } | ||
1201 | 1188 | ||
1202 | r = btrfs_remount(mnt->mnt_sb, &flags, NULL); | 1189 | r = btrfs_remount(mnt->mnt_sb, &flags, NULL); |
1203 | if (r < 0) { | 1190 | if (r < 0) { |
1204 | /* FIXME: release vfsmount mnt ??*/ | 1191 | /* FIXME: release vfsmount mnt ??*/ |
1192 | kfree(newargs); | ||
1205 | return ERR_PTR(r); | 1193 | return ERR_PTR(r); |
1206 | } | 1194 | } |
1207 | } | 1195 | } |
1208 | } | 1196 | } |
1209 | 1197 | ||
1198 | kfree(newargs); | ||
1199 | |||
1210 | if (IS_ERR(mnt)) | 1200 | if (IS_ERR(mnt)) |
1211 | return ERR_CAST(mnt); | 1201 | return ERR_CAST(mnt); |
1212 | 1202 | ||
diff --git a/fs/compat.c b/fs/compat.c index ca926ad0430c..66d3d3c6b4b2 100644 --- a/fs/compat.c +++ b/fs/compat.c | |||
@@ -457,9 +457,9 @@ COMPAT_SYSCALL_DEFINE3(fcntl64, unsigned int, fd, unsigned int, cmd, | |||
457 | case F_GETLK64: | 457 | case F_GETLK64: |
458 | case F_SETLK64: | 458 | case F_SETLK64: |
459 | case F_SETLKW64: | 459 | case F_SETLKW64: |
460 | case F_GETLKP: | 460 | case F_OFD_GETLK: |
461 | case F_SETLKP: | 461 | case F_OFD_SETLK: |
462 | case F_SETLKPW: | 462 | case F_OFD_SETLKW: |
463 | ret = get_compat_flock64(&f, compat_ptr(arg)); | 463 | ret = get_compat_flock64(&f, compat_ptr(arg)); |
464 | if (ret != 0) | 464 | if (ret != 0) |
465 | break; | 465 | break; |
@@ -468,7 +468,7 @@ COMPAT_SYSCALL_DEFINE3(fcntl64, unsigned int, fd, unsigned int, cmd, | |||
468 | conv_cmd = convert_fcntl_cmd(cmd); | 468 | conv_cmd = convert_fcntl_cmd(cmd); |
469 | ret = sys_fcntl(fd, conv_cmd, (unsigned long)&f); | 469 | ret = sys_fcntl(fd, conv_cmd, (unsigned long)&f); |
470 | set_fs(old_fs); | 470 | set_fs(old_fs); |
471 | if ((conv_cmd == F_GETLK || conv_cmd == F_GETLKP) && ret == 0) { | 471 | if ((conv_cmd == F_GETLK || conv_cmd == F_OFD_GETLK) && ret == 0) { |
472 | /* need to return lock information - see above for commentary */ | 472 | /* need to return lock information - see above for commentary */ |
473 | if (f.l_start > COMPAT_LOFF_T_MAX) | 473 | if (f.l_start > COMPAT_LOFF_T_MAX) |
474 | ret = -EOVERFLOW; | 474 | ret = -EOVERFLOW; |
@@ -493,9 +493,9 @@ COMPAT_SYSCALL_DEFINE3(fcntl, unsigned int, fd, unsigned int, cmd, | |||
493 | case F_GETLK64: | 493 | case F_GETLK64: |
494 | case F_SETLK64: | 494 | case F_SETLK64: |
495 | case F_SETLKW64: | 495 | case F_SETLKW64: |
496 | case F_GETLKP: | 496 | case F_OFD_GETLK: |
497 | case F_SETLKP: | 497 | case F_OFD_SETLK: |
498 | case F_SETLKPW: | 498 | case F_OFD_SETLKW: |
499 | return -EINVAL; | 499 | return -EINVAL; |
500 | } | 500 | } |
501 | return compat_sys_fcntl64(fd, cmd, arg); | 501 | return compat_sys_fcntl64(fd, cmd, arg); |
diff --git a/fs/fcntl.c b/fs/fcntl.c index 9ead1596399a..72c82f69b01b 100644 --- a/fs/fcntl.c +++ b/fs/fcntl.c | |||
@@ -274,15 +274,15 @@ static long do_fcntl(int fd, unsigned int cmd, unsigned long arg, | |||
274 | break; | 274 | break; |
275 | #if BITS_PER_LONG != 32 | 275 | #if BITS_PER_LONG != 32 |
276 | /* 32-bit arches must use fcntl64() */ | 276 | /* 32-bit arches must use fcntl64() */ |
277 | case F_GETLKP: | 277 | case F_OFD_GETLK: |
278 | #endif | 278 | #endif |
279 | case F_GETLK: | 279 | case F_GETLK: |
280 | err = fcntl_getlk(filp, cmd, (struct flock __user *) arg); | 280 | err = fcntl_getlk(filp, cmd, (struct flock __user *) arg); |
281 | break; | 281 | break; |
282 | #if BITS_PER_LONG != 32 | 282 | #if BITS_PER_LONG != 32 |
283 | /* 32-bit arches must use fcntl64() */ | 283 | /* 32-bit arches must use fcntl64() */ |
284 | case F_SETLKP: | 284 | case F_OFD_SETLK: |
285 | case F_SETLKPW: | 285 | case F_OFD_SETLKW: |
286 | #endif | 286 | #endif |
287 | /* Fallthrough */ | 287 | /* Fallthrough */ |
288 | case F_SETLK: | 288 | case F_SETLK: |
@@ -399,13 +399,13 @@ SYSCALL_DEFINE3(fcntl64, unsigned int, fd, unsigned int, cmd, | |||
399 | 399 | ||
400 | switch (cmd) { | 400 | switch (cmd) { |
401 | case F_GETLK64: | 401 | case F_GETLK64: |
402 | case F_GETLKP: | 402 | case F_OFD_GETLK: |
403 | err = fcntl_getlk64(f.file, cmd, (struct flock64 __user *) arg); | 403 | err = fcntl_getlk64(f.file, cmd, (struct flock64 __user *) arg); |
404 | break; | 404 | break; |
405 | case F_SETLK64: | 405 | case F_SETLK64: |
406 | case F_SETLKW64: | 406 | case F_SETLKW64: |
407 | case F_SETLKP: | 407 | case F_OFD_SETLK: |
408 | case F_SETLKPW: | 408 | case F_OFD_SETLKW: |
409 | err = fcntl_setlk64(fd, f.file, cmd, | 409 | err = fcntl_setlk64(fd, f.file, cmd, |
410 | (struct flock64 __user *) arg); | 410 | (struct flock64 __user *) arg); |
411 | break; | 411 | break; |
diff --git a/fs/kernfs/dir.c b/fs/kernfs/dir.c index 78f3403300af..ac127cd008bf 100644 --- a/fs/kernfs/dir.c +++ b/fs/kernfs/dir.c | |||
@@ -232,9 +232,6 @@ static int kernfs_link_sibling(struct kernfs_node *kn) | |||
232 | struct rb_node **node = &kn->parent->dir.children.rb_node; | 232 | struct rb_node **node = &kn->parent->dir.children.rb_node; |
233 | struct rb_node *parent = NULL; | 233 | struct rb_node *parent = NULL; |
234 | 234 | ||
235 | if (kernfs_type(kn) == KERNFS_DIR) | ||
236 | kn->parent->dir.subdirs++; | ||
237 | |||
238 | while (*node) { | 235 | while (*node) { |
239 | struct kernfs_node *pos; | 236 | struct kernfs_node *pos; |
240 | int result; | 237 | int result; |
@@ -249,9 +246,15 @@ static int kernfs_link_sibling(struct kernfs_node *kn) | |||
249 | else | 246 | else |
250 | return -EEXIST; | 247 | return -EEXIST; |
251 | } | 248 | } |
249 | |||
252 | /* add new node and rebalance the tree */ | 250 | /* add new node and rebalance the tree */ |
253 | rb_link_node(&kn->rb, parent, node); | 251 | rb_link_node(&kn->rb, parent, node); |
254 | rb_insert_color(&kn->rb, &kn->parent->dir.children); | 252 | rb_insert_color(&kn->rb, &kn->parent->dir.children); |
253 | |||
254 | /* successfully added, account subdir number */ | ||
255 | if (kernfs_type(kn) == KERNFS_DIR) | ||
256 | kn->parent->dir.subdirs++; | ||
257 | |||
255 | return 0; | 258 | return 0; |
256 | } | 259 | } |
257 | 260 | ||
diff --git a/fs/kernfs/file.c b/fs/kernfs/file.c index 8034706a7af8..e01ea4a14a01 100644 --- a/fs/kernfs/file.c +++ b/fs/kernfs/file.c | |||
@@ -484,6 +484,8 @@ static int kernfs_fop_mmap(struct file *file, struct vm_area_struct *vma) | |||
484 | 484 | ||
485 | ops = kernfs_ops(of->kn); | 485 | ops = kernfs_ops(of->kn); |
486 | rc = ops->mmap(of, vma); | 486 | rc = ops->mmap(of, vma); |
487 | if (rc) | ||
488 | goto out_put; | ||
487 | 489 | ||
488 | /* | 490 | /* |
489 | * PowerPC's pci_mmap of legacy_mem uses shmem_zero_setup() | 491 | * PowerPC's pci_mmap of legacy_mem uses shmem_zero_setup() |
diff --git a/fs/locks.c b/fs/locks.c index 13fc7a6d380a..e663aeac579e 100644 --- a/fs/locks.c +++ b/fs/locks.c | |||
@@ -135,7 +135,7 @@ | |||
135 | #define IS_POSIX(fl) (fl->fl_flags & FL_POSIX) | 135 | #define IS_POSIX(fl) (fl->fl_flags & FL_POSIX) |
136 | #define IS_FLOCK(fl) (fl->fl_flags & FL_FLOCK) | 136 | #define IS_FLOCK(fl) (fl->fl_flags & FL_FLOCK) |
137 | #define IS_LEASE(fl) (fl->fl_flags & (FL_LEASE|FL_DELEG)) | 137 | #define IS_LEASE(fl) (fl->fl_flags & (FL_LEASE|FL_DELEG)) |
138 | #define IS_FILE_PVT(fl) (fl->fl_flags & FL_FILE_PVT) | 138 | #define IS_OFDLCK(fl) (fl->fl_flags & FL_OFDLCK) |
139 | 139 | ||
140 | static bool lease_breaking(struct file_lock *fl) | 140 | static bool lease_breaking(struct file_lock *fl) |
141 | { | 141 | { |
@@ -564,7 +564,7 @@ static void __locks_insert_block(struct file_lock *blocker, | |||
564 | BUG_ON(!list_empty(&waiter->fl_block)); | 564 | BUG_ON(!list_empty(&waiter->fl_block)); |
565 | waiter->fl_next = blocker; | 565 | waiter->fl_next = blocker; |
566 | list_add_tail(&waiter->fl_block, &blocker->fl_block); | 566 | list_add_tail(&waiter->fl_block, &blocker->fl_block); |
567 | if (IS_POSIX(blocker) && !IS_FILE_PVT(blocker)) | 567 | if (IS_POSIX(blocker) && !IS_OFDLCK(blocker)) |
568 | locks_insert_global_blocked(waiter); | 568 | locks_insert_global_blocked(waiter); |
569 | } | 569 | } |
570 | 570 | ||
@@ -759,12 +759,12 @@ EXPORT_SYMBOL(posix_test_lock); | |||
759 | * of tasks (such as posix threads) sharing the same open file table. | 759 | * of tasks (such as posix threads) sharing the same open file table. |
760 | * To handle those cases, we just bail out after a few iterations. | 760 | * To handle those cases, we just bail out after a few iterations. |
761 | * | 761 | * |
762 | * For FL_FILE_PVT locks, the owner is the filp, not the files_struct. | 762 | * For FL_OFDLCK locks, the owner is the filp, not the files_struct. |
763 | * Because the owner is not even nominally tied to a thread of | 763 | * Because the owner is not even nominally tied to a thread of |
764 | * execution, the deadlock detection below can't reasonably work well. Just | 764 | * execution, the deadlock detection below can't reasonably work well. Just |
765 | * skip it for those. | 765 | * skip it for those. |
766 | * | 766 | * |
767 | * In principle, we could do a more limited deadlock detection on FL_FILE_PVT | 767 | * In principle, we could do a more limited deadlock detection on FL_OFDLCK |
768 | * locks that just checks for the case where two tasks are attempting to | 768 | * locks that just checks for the case where two tasks are attempting to |
769 | * upgrade from read to write locks on the same inode. | 769 | * upgrade from read to write locks on the same inode. |
770 | */ | 770 | */ |
@@ -791,9 +791,9 @@ static int posix_locks_deadlock(struct file_lock *caller_fl, | |||
791 | 791 | ||
792 | /* | 792 | /* |
793 | * This deadlock detector can't reasonably detect deadlocks with | 793 | * This deadlock detector can't reasonably detect deadlocks with |
794 | * FL_FILE_PVT locks, since they aren't owned by a process, per-se. | 794 | * FL_OFDLCK locks, since they aren't owned by a process, per-se. |
795 | */ | 795 | */ |
796 | if (IS_FILE_PVT(caller_fl)) | 796 | if (IS_OFDLCK(caller_fl)) |
797 | return 0; | 797 | return 0; |
798 | 798 | ||
799 | while ((block_fl = what_owner_is_waiting_for(block_fl))) { | 799 | while ((block_fl = what_owner_is_waiting_for(block_fl))) { |
@@ -1391,11 +1391,10 @@ int __break_lease(struct inode *inode, unsigned int mode, unsigned int type) | |||
1391 | 1391 | ||
1392 | restart: | 1392 | restart: |
1393 | break_time = flock->fl_break_time; | 1393 | break_time = flock->fl_break_time; |
1394 | if (break_time != 0) { | 1394 | if (break_time != 0) |
1395 | break_time -= jiffies; | 1395 | break_time -= jiffies; |
1396 | if (break_time == 0) | 1396 | if (break_time == 0) |
1397 | break_time++; | 1397 | break_time++; |
1398 | } | ||
1399 | locks_insert_block(flock, new_fl); | 1398 | locks_insert_block(flock, new_fl); |
1400 | spin_unlock(&inode->i_lock); | 1399 | spin_unlock(&inode->i_lock); |
1401 | error = wait_event_interruptible_timeout(new_fl->fl_wait, | 1400 | error = wait_event_interruptible_timeout(new_fl->fl_wait, |
@@ -1891,7 +1890,7 @@ EXPORT_SYMBOL_GPL(vfs_test_lock); | |||
1891 | 1890 | ||
1892 | static int posix_lock_to_flock(struct flock *flock, struct file_lock *fl) | 1891 | static int posix_lock_to_flock(struct flock *flock, struct file_lock *fl) |
1893 | { | 1892 | { |
1894 | flock->l_pid = IS_FILE_PVT(fl) ? -1 : fl->fl_pid; | 1893 | flock->l_pid = IS_OFDLCK(fl) ? -1 : fl->fl_pid; |
1895 | #if BITS_PER_LONG == 32 | 1894 | #if BITS_PER_LONG == 32 |
1896 | /* | 1895 | /* |
1897 | * Make sure we can represent the posix lock via | 1896 | * Make sure we can represent the posix lock via |
@@ -1913,7 +1912,7 @@ static int posix_lock_to_flock(struct flock *flock, struct file_lock *fl) | |||
1913 | #if BITS_PER_LONG == 32 | 1912 | #if BITS_PER_LONG == 32 |
1914 | static void posix_lock_to_flock64(struct flock64 *flock, struct file_lock *fl) | 1913 | static void posix_lock_to_flock64(struct flock64 *flock, struct file_lock *fl) |
1915 | { | 1914 | { |
1916 | flock->l_pid = IS_FILE_PVT(fl) ? -1 : fl->fl_pid; | 1915 | flock->l_pid = IS_OFDLCK(fl) ? -1 : fl->fl_pid; |
1917 | flock->l_start = fl->fl_start; | 1916 | flock->l_start = fl->fl_start; |
1918 | flock->l_len = fl->fl_end == OFFSET_MAX ? 0 : | 1917 | flock->l_len = fl->fl_end == OFFSET_MAX ? 0 : |
1919 | fl->fl_end - fl->fl_start + 1; | 1918 | fl->fl_end - fl->fl_start + 1; |
@@ -1942,13 +1941,13 @@ int fcntl_getlk(struct file *filp, unsigned int cmd, struct flock __user *l) | |||
1942 | if (error) | 1941 | if (error) |
1943 | goto out; | 1942 | goto out; |
1944 | 1943 | ||
1945 | if (cmd == F_GETLKP) { | 1944 | if (cmd == F_OFD_GETLK) { |
1946 | error = -EINVAL; | 1945 | error = -EINVAL; |
1947 | if (flock.l_pid != 0) | 1946 | if (flock.l_pid != 0) |
1948 | goto out; | 1947 | goto out; |
1949 | 1948 | ||
1950 | cmd = F_GETLK; | 1949 | cmd = F_GETLK; |
1951 | file_lock.fl_flags |= FL_FILE_PVT; | 1950 | file_lock.fl_flags |= FL_OFDLCK; |
1952 | file_lock.fl_owner = (fl_owner_t)filp; | 1951 | file_lock.fl_owner = (fl_owner_t)filp; |
1953 | } | 1952 | } |
1954 | 1953 | ||
@@ -2074,25 +2073,25 @@ again: | |||
2074 | 2073 | ||
2075 | /* | 2074 | /* |
2076 | * If the cmd is requesting file-private locks, then set the | 2075 | * If the cmd is requesting file-private locks, then set the |
2077 | * FL_FILE_PVT flag and override the owner. | 2076 | * FL_OFDLCK flag and override the owner. |
2078 | */ | 2077 | */ |
2079 | switch (cmd) { | 2078 | switch (cmd) { |
2080 | case F_SETLKP: | 2079 | case F_OFD_SETLK: |
2081 | error = -EINVAL; | 2080 | error = -EINVAL; |
2082 | if (flock.l_pid != 0) | 2081 | if (flock.l_pid != 0) |
2083 | goto out; | 2082 | goto out; |
2084 | 2083 | ||
2085 | cmd = F_SETLK; | 2084 | cmd = F_SETLK; |
2086 | file_lock->fl_flags |= FL_FILE_PVT; | 2085 | file_lock->fl_flags |= FL_OFDLCK; |
2087 | file_lock->fl_owner = (fl_owner_t)filp; | 2086 | file_lock->fl_owner = (fl_owner_t)filp; |
2088 | break; | 2087 | break; |
2089 | case F_SETLKPW: | 2088 | case F_OFD_SETLKW: |
2090 | error = -EINVAL; | 2089 | error = -EINVAL; |
2091 | if (flock.l_pid != 0) | 2090 | if (flock.l_pid != 0) |
2092 | goto out; | 2091 | goto out; |
2093 | 2092 | ||
2094 | cmd = F_SETLKW; | 2093 | cmd = F_SETLKW; |
2095 | file_lock->fl_flags |= FL_FILE_PVT; | 2094 | file_lock->fl_flags |= FL_OFDLCK; |
2096 | file_lock->fl_owner = (fl_owner_t)filp; | 2095 | file_lock->fl_owner = (fl_owner_t)filp; |
2097 | /* Fallthrough */ | 2096 | /* Fallthrough */ |
2098 | case F_SETLKW: | 2097 | case F_SETLKW: |
@@ -2144,13 +2143,13 @@ int fcntl_getlk64(struct file *filp, unsigned int cmd, struct flock64 __user *l) | |||
2144 | if (error) | 2143 | if (error) |
2145 | goto out; | 2144 | goto out; |
2146 | 2145 | ||
2147 | if (cmd == F_GETLKP) { | 2146 | if (cmd == F_OFD_GETLK) { |
2148 | error = -EINVAL; | 2147 | error = -EINVAL; |
2149 | if (flock.l_pid != 0) | 2148 | if (flock.l_pid != 0) |
2150 | goto out; | 2149 | goto out; |
2151 | 2150 | ||
2152 | cmd = F_GETLK64; | 2151 | cmd = F_GETLK64; |
2153 | file_lock.fl_flags |= FL_FILE_PVT; | 2152 | file_lock.fl_flags |= FL_OFDLCK; |
2154 | file_lock.fl_owner = (fl_owner_t)filp; | 2153 | file_lock.fl_owner = (fl_owner_t)filp; |
2155 | } | 2154 | } |
2156 | 2155 | ||
@@ -2209,25 +2208,25 @@ again: | |||
2209 | 2208 | ||
2210 | /* | 2209 | /* |
2211 | * If the cmd is requesting file-private locks, then set the | 2210 | * If the cmd is requesting file-private locks, then set the |
2212 | * FL_FILE_PVT flag and override the owner. | 2211 | * FL_OFDLCK flag and override the owner. |
2213 | */ | 2212 | */ |
2214 | switch (cmd) { | 2213 | switch (cmd) { |
2215 | case F_SETLKP: | 2214 | case F_OFD_SETLK: |
2216 | error = -EINVAL; | 2215 | error = -EINVAL; |
2217 | if (flock.l_pid != 0) | 2216 | if (flock.l_pid != 0) |
2218 | goto out; | 2217 | goto out; |
2219 | 2218 | ||
2220 | cmd = F_SETLK64; | 2219 | cmd = F_SETLK64; |
2221 | file_lock->fl_flags |= FL_FILE_PVT; | 2220 | file_lock->fl_flags |= FL_OFDLCK; |
2222 | file_lock->fl_owner = (fl_owner_t)filp; | 2221 | file_lock->fl_owner = (fl_owner_t)filp; |
2223 | break; | 2222 | break; |
2224 | case F_SETLKPW: | 2223 | case F_OFD_SETLKW: |
2225 | error = -EINVAL; | 2224 | error = -EINVAL; |
2226 | if (flock.l_pid != 0) | 2225 | if (flock.l_pid != 0) |
2227 | goto out; | 2226 | goto out; |
2228 | 2227 | ||
2229 | cmd = F_SETLKW64; | 2228 | cmd = F_SETLKW64; |
2230 | file_lock->fl_flags |= FL_FILE_PVT; | 2229 | file_lock->fl_flags |= FL_OFDLCK; |
2231 | file_lock->fl_owner = (fl_owner_t)filp; | 2230 | file_lock->fl_owner = (fl_owner_t)filp; |
2232 | /* Fallthrough */ | 2231 | /* Fallthrough */ |
2233 | case F_SETLKW64: | 2232 | case F_SETLKW64: |
@@ -2413,8 +2412,8 @@ static void lock_get_status(struct seq_file *f, struct file_lock *fl, | |||
2413 | if (IS_POSIX(fl)) { | 2412 | if (IS_POSIX(fl)) { |
2414 | if (fl->fl_flags & FL_ACCESS) | 2413 | if (fl->fl_flags & FL_ACCESS) |
2415 | seq_printf(f, "ACCESS"); | 2414 | seq_printf(f, "ACCESS"); |
2416 | else if (IS_FILE_PVT(fl)) | 2415 | else if (IS_OFDLCK(fl)) |
2417 | seq_printf(f, "FLPVT "); | 2416 | seq_printf(f, "OFDLCK"); |
2418 | else | 2417 | else |
2419 | seq_printf(f, "POSIX "); | 2418 | seq_printf(f, "POSIX "); |
2420 | 2419 | ||
diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c index 39c8ef875f91..2c73cae9899d 100644 --- a/fs/nfsd/nfs4callback.c +++ b/fs/nfsd/nfs4callback.c | |||
@@ -654,9 +654,11 @@ static struct rpc_clnt *create_backchannel_client(struct rpc_create_args *args) | |||
654 | 654 | ||
655 | static int setup_callback_client(struct nfs4_client *clp, struct nfs4_cb_conn *conn, struct nfsd4_session *ses) | 655 | static int setup_callback_client(struct nfs4_client *clp, struct nfs4_cb_conn *conn, struct nfsd4_session *ses) |
656 | { | 656 | { |
657 | int maxtime = max_cb_time(clp->net); | ||
657 | struct rpc_timeout timeparms = { | 658 | struct rpc_timeout timeparms = { |
658 | .to_initval = max_cb_time(clp->net), | 659 | .to_initval = maxtime, |
659 | .to_retries = 0, | 660 | .to_retries = 0, |
661 | .to_maxval = maxtime, | ||
660 | }; | 662 | }; |
661 | struct rpc_create_args args = { | 663 | struct rpc_create_args args = { |
662 | .net = clp->net, | 664 | .net = clp->net, |
diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c index 2723c1badd01..18881f34737a 100644 --- a/fs/nfsd/nfs4xdr.c +++ b/fs/nfsd/nfs4xdr.c | |||
@@ -3627,14 +3627,6 @@ nfsd4_encode_operation(struct nfsd4_compoundres *resp, struct nfsd4_op *op) | |||
3627 | /* nfsd4_check_resp_size guarantees enough room for error status */ | 3627 | /* nfsd4_check_resp_size guarantees enough room for error status */ |
3628 | if (!op->status) | 3628 | if (!op->status) |
3629 | op->status = nfsd4_check_resp_size(resp, 0); | 3629 | op->status = nfsd4_check_resp_size(resp, 0); |
3630 | if (op->status == nfserr_resource && nfsd4_has_session(&resp->cstate)) { | ||
3631 | struct nfsd4_slot *slot = resp->cstate.slot; | ||
3632 | |||
3633 | if (slot->sl_flags & NFSD4_SLOT_CACHETHIS) | ||
3634 | op->status = nfserr_rep_too_big_to_cache; | ||
3635 | else | ||
3636 | op->status = nfserr_rep_too_big; | ||
3637 | } | ||
3638 | if (so) { | 3630 | if (so) { |
3639 | so->so_replay.rp_status = op->status; | 3631 | so->so_replay.rp_status = op->status; |
3640 | so->so_replay.rp_buflen = (char *)resp->p - (char *)(statp+1); | 3632 | so->so_replay.rp_buflen = (char *)resp->p - (char *)(statp+1); |
diff --git a/include/asm-generic/word-at-a-time.h b/include/asm-generic/word-at-a-time.h index d3909effd725..94f9ea8abcae 100644 --- a/include/asm-generic/word-at-a-time.h +++ b/include/asm-generic/word-at-a-time.h | |||
@@ -50,11 +50,7 @@ static inline bool has_zero(unsigned long val, unsigned long *data, const struct | |||
50 | } | 50 | } |
51 | 51 | ||
52 | #ifndef zero_bytemask | 52 | #ifndef zero_bytemask |
53 | #ifdef CONFIG_64BIT | 53 | #define zero_bytemask(mask) (~1ul << __fls(mask)) |
54 | #define zero_bytemask(mask) (~0ul << fls64(mask)) | 54 | #endif |
55 | #else | ||
56 | #define zero_bytemask(mask) (~0ul << fls(mask)) | ||
57 | #endif /* CONFIG_64BIT */ | ||
58 | #endif /* zero_bytemask */ | ||
59 | 55 | ||
60 | #endif /* _ASM_WORD_AT_A_TIME_H */ | 56 | #endif /* _ASM_WORD_AT_A_TIME_H */ |
diff --git a/include/dt-bindings/clock/tegra124-car.h b/include/dt-bindings/clock/tegra124-car.h index 8c1603b10665..433528ab5161 100644 --- a/include/dt-bindings/clock/tegra124-car.h +++ b/include/dt-bindings/clock/tegra124-car.h | |||
@@ -29,7 +29,7 @@ | |||
29 | /* 10 (register bit affects spdif_in and spdif_out) */ | 29 | /* 10 (register bit affects spdif_in and spdif_out) */ |
30 | #define TEGRA124_CLK_I2S1 11 | 30 | #define TEGRA124_CLK_I2S1 11 |
31 | #define TEGRA124_CLK_I2C1 12 | 31 | #define TEGRA124_CLK_I2C1 12 |
32 | #define TEGRA124_CLK_NDFLASH 13 | 32 | /* 13 */ |
33 | #define TEGRA124_CLK_SDMMC1 14 | 33 | #define TEGRA124_CLK_SDMMC1 14 |
34 | #define TEGRA124_CLK_SDMMC4 15 | 34 | #define TEGRA124_CLK_SDMMC4 15 |
35 | /* 16 */ | 35 | /* 16 */ |
@@ -83,7 +83,7 @@ | |||
83 | 83 | ||
84 | /* 64 */ | 84 | /* 64 */ |
85 | #define TEGRA124_CLK_UARTD 65 | 85 | #define TEGRA124_CLK_UARTD 65 |
86 | #define TEGRA124_CLK_UARTE 66 | 86 | /* 66 */ |
87 | #define TEGRA124_CLK_I2C3 67 | 87 | #define TEGRA124_CLK_I2C3 67 |
88 | #define TEGRA124_CLK_SBC4 68 | 88 | #define TEGRA124_CLK_SBC4 68 |
89 | #define TEGRA124_CLK_SDMMC3 69 | 89 | #define TEGRA124_CLK_SDMMC3 69 |
@@ -97,7 +97,7 @@ | |||
97 | #define TEGRA124_CLK_TRACE 77 | 97 | #define TEGRA124_CLK_TRACE 77 |
98 | #define TEGRA124_CLK_SOC_THERM 78 | 98 | #define TEGRA124_CLK_SOC_THERM 78 |
99 | #define TEGRA124_CLK_DTV 79 | 99 | #define TEGRA124_CLK_DTV 79 |
100 | #define TEGRA124_CLK_NDSPEED 80 | 100 | /* 80 */ |
101 | #define TEGRA124_CLK_I2CSLOW 81 | 101 | #define TEGRA124_CLK_I2CSLOW 81 |
102 | #define TEGRA124_CLK_DSIB 82 | 102 | #define TEGRA124_CLK_DSIB 82 |
103 | #define TEGRA124_CLK_TSEC 83 | 103 | #define TEGRA124_CLK_TSEC 83 |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 7a9c5bca2b76..878031227c57 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -815,7 +815,7 @@ static inline struct file *get_file(struct file *f) | |||
815 | #define FL_SLEEP 128 /* A blocking lock */ | 815 | #define FL_SLEEP 128 /* A blocking lock */ |
816 | #define FL_DOWNGRADE_PENDING 256 /* Lease is being downgraded */ | 816 | #define FL_DOWNGRADE_PENDING 256 /* Lease is being downgraded */ |
817 | #define FL_UNLOCK_PENDING 512 /* Lease is being broken */ | 817 | #define FL_UNLOCK_PENDING 512 /* Lease is being broken */ |
818 | #define FL_FILE_PVT 1024 /* lock is private to the file */ | 818 | #define FL_OFDLCK 1024 /* lock is "owned" by struct file */ |
819 | 819 | ||
820 | /* | 820 | /* |
821 | * Special return value from posix_lock_file() and vfs_lock_file() for | 821 | * Special return value from posix_lock_file() and vfs_lock_file() for |
diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index 9212b017bc72..ae9504b4b67d 100644 --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h | |||
@@ -535,6 +535,7 @@ static inline int ftrace_modify_call(struct dyn_ftrace *rec, unsigned long old_a | |||
535 | extern int ftrace_arch_read_dyn_info(char *buf, int size); | 535 | extern int ftrace_arch_read_dyn_info(char *buf, int size); |
536 | 536 | ||
537 | extern int skip_trace(unsigned long ip); | 537 | extern int skip_trace(unsigned long ip); |
538 | extern void ftrace_module_init(struct module *mod); | ||
538 | 539 | ||
539 | extern void ftrace_disable_daemon(void); | 540 | extern void ftrace_disable_daemon(void); |
540 | extern void ftrace_enable_daemon(void); | 541 | extern void ftrace_enable_daemon(void); |
@@ -544,6 +545,7 @@ static inline int ftrace_force_update(void) { return 0; } | |||
544 | static inline void ftrace_disable_daemon(void) { } | 545 | static inline void ftrace_disable_daemon(void) { } |
545 | static inline void ftrace_enable_daemon(void) { } | 546 | static inline void ftrace_enable_daemon(void) { } |
546 | static inline void ftrace_release_mod(struct module *mod) {} | 547 | static inline void ftrace_release_mod(struct module *mod) {} |
548 | static inline void ftrace_module_init(struct module *mod) {} | ||
547 | static inline __init int register_ftrace_command(struct ftrace_func_command *cmd) | 549 | static inline __init int register_ftrace_command(struct ftrace_func_command *cmd) |
548 | { | 550 | { |
549 | return -EINVAL; | 551 | return -EINVAL; |
diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h index c7bfac1c4a7b..8834a7e5b944 100644 --- a/include/linux/interrupt.h +++ b/include/linux/interrupt.h | |||
@@ -203,7 +203,40 @@ static inline int check_wakeup_irqs(void) { return 0; } | |||
203 | 203 | ||
204 | extern cpumask_var_t irq_default_affinity; | 204 | extern cpumask_var_t irq_default_affinity; |
205 | 205 | ||
206 | extern int irq_set_affinity(unsigned int irq, const struct cpumask *cpumask); | 206 | /* Internal implementation. Use the helpers below */ |
207 | extern int __irq_set_affinity(unsigned int irq, const struct cpumask *cpumask, | ||
208 | bool force); | ||
209 | |||
210 | /** | ||
211 | * irq_set_affinity - Set the irq affinity of a given irq | ||
212 | * @irq: Interrupt to set affinity | ||
213 | * @mask: cpumask | ||
214 | * | ||
215 | * Fails if cpumask does not contain an online CPU | ||
216 | */ | ||
217 | static inline int | ||
218 | irq_set_affinity(unsigned int irq, const struct cpumask *cpumask) | ||
219 | { | ||
220 | return __irq_set_affinity(irq, cpumask, false); | ||
221 | } | ||
222 | |||
223 | /** | ||
224 | * irq_force_affinity - Force the irq affinity of a given irq | ||
225 | * @irq: Interrupt to set affinity | ||
226 | * @mask: cpumask | ||
227 | * | ||
228 | * Same as irq_set_affinity, but without checking the mask against | ||
229 | * online cpus. | ||
230 | * | ||
231 | * Solely for low level cpu hotplug code, where we need to make per | ||
232 | * cpu interrupts affine before the cpu becomes online. | ||
233 | */ | ||
234 | static inline int | ||
235 | irq_force_affinity(unsigned int irq, const struct cpumask *cpumask) | ||
236 | { | ||
237 | return __irq_set_affinity(irq, cpumask, true); | ||
238 | } | ||
239 | |||
207 | extern int irq_can_set_affinity(unsigned int irq); | 240 | extern int irq_can_set_affinity(unsigned int irq); |
208 | extern int irq_select_affinity(unsigned int irq); | 241 | extern int irq_select_affinity(unsigned int irq); |
209 | 242 | ||
diff --git a/include/linux/irq.h b/include/linux/irq.h index d278838908cb..10a0b1ac4ea0 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h | |||
@@ -394,7 +394,8 @@ extern void remove_percpu_irq(unsigned int irq, struct irqaction *act); | |||
394 | 394 | ||
395 | extern void irq_cpu_online(void); | 395 | extern void irq_cpu_online(void); |
396 | extern void irq_cpu_offline(void); | 396 | extern void irq_cpu_offline(void); |
397 | extern int __irq_set_affinity_locked(struct irq_data *data, const struct cpumask *cpumask); | 397 | extern int irq_set_affinity_locked(struct irq_data *data, |
398 | const struct cpumask *cpumask, bool force); | ||
398 | 399 | ||
399 | #if defined(CONFIG_SMP) && defined(CONFIG_GENERIC_PENDING_IRQ) | 400 | #if defined(CONFIG_SMP) && defined(CONFIG_GENERIC_PENDING_IRQ) |
400 | void irq_move_irq(struct irq_data *data); | 401 | void irq_move_irq(struct irq_data *data); |
diff --git a/include/linux/libata.h b/include/linux/libata.h index 1de36be64df4..5ab4e3a76721 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
@@ -822,6 +822,7 @@ struct ata_port { | |||
822 | unsigned long qc_allocated; | 822 | unsigned long qc_allocated; |
823 | unsigned int qc_active; | 823 | unsigned int qc_active; |
824 | int nr_active_links; /* #links with active qcs */ | 824 | int nr_active_links; /* #links with active qcs */ |
825 | unsigned int last_tag; /* track next tag hw expects */ | ||
825 | 826 | ||
826 | struct ata_link link; /* host default link */ | 827 | struct ata_link link; /* host default link */ |
827 | struct ata_link *slave_link; /* see ata_slave_link_init() */ | 828 | struct ata_link *slave_link; /* see ata_slave_link_init() */ |
diff --git a/include/linux/of_irq.h b/include/linux/of_irq.h index 3f23b4472c31..6404253d810d 100644 --- a/include/linux/of_irq.h +++ b/include/linux/of_irq.h | |||
@@ -44,11 +44,16 @@ extern void of_irq_init(const struct of_device_id *matches); | |||
44 | 44 | ||
45 | #ifdef CONFIG_OF_IRQ | 45 | #ifdef CONFIG_OF_IRQ |
46 | extern int of_irq_count(struct device_node *dev); | 46 | extern int of_irq_count(struct device_node *dev); |
47 | extern int of_irq_get(struct device_node *dev, int index); | ||
47 | #else | 48 | #else |
48 | static inline int of_irq_count(struct device_node *dev) | 49 | static inline int of_irq_count(struct device_node *dev) |
49 | { | 50 | { |
50 | return 0; | 51 | return 0; |
51 | } | 52 | } |
53 | static inline int of_irq_get(struct device_node *dev, int index) | ||
54 | { | ||
55 | return 0; | ||
56 | } | ||
52 | #endif | 57 | #endif |
53 | 58 | ||
54 | #if defined(CONFIG_OF) | 59 | #if defined(CONFIG_OF) |
diff --git a/include/linux/phy/phy.h b/include/linux/phy/phy.h index e2f5ca96cddc..2760744cb2a7 100644 --- a/include/linux/phy/phy.h +++ b/include/linux/phy/phy.h | |||
@@ -174,21 +174,29 @@ void devm_of_phy_provider_unregister(struct device *dev, | |||
174 | #else | 174 | #else |
175 | static inline int phy_pm_runtime_get(struct phy *phy) | 175 | static inline int phy_pm_runtime_get(struct phy *phy) |
176 | { | 176 | { |
177 | if (!phy) | ||
178 | return 0; | ||
177 | return -ENOSYS; | 179 | return -ENOSYS; |
178 | } | 180 | } |
179 | 181 | ||
180 | static inline int phy_pm_runtime_get_sync(struct phy *phy) | 182 | static inline int phy_pm_runtime_get_sync(struct phy *phy) |
181 | { | 183 | { |
184 | if (!phy) | ||
185 | return 0; | ||
182 | return -ENOSYS; | 186 | return -ENOSYS; |
183 | } | 187 | } |
184 | 188 | ||
185 | static inline int phy_pm_runtime_put(struct phy *phy) | 189 | static inline int phy_pm_runtime_put(struct phy *phy) |
186 | { | 190 | { |
191 | if (!phy) | ||
192 | return 0; | ||
187 | return -ENOSYS; | 193 | return -ENOSYS; |
188 | } | 194 | } |
189 | 195 | ||
190 | static inline int phy_pm_runtime_put_sync(struct phy *phy) | 196 | static inline int phy_pm_runtime_put_sync(struct phy *phy) |
191 | { | 197 | { |
198 | if (!phy) | ||
199 | return 0; | ||
192 | return -ENOSYS; | 200 | return -ENOSYS; |
193 | } | 201 | } |
194 | 202 | ||
@@ -204,21 +212,29 @@ static inline void phy_pm_runtime_forbid(struct phy *phy) | |||
204 | 212 | ||
205 | static inline int phy_init(struct phy *phy) | 213 | static inline int phy_init(struct phy *phy) |
206 | { | 214 | { |
215 | if (!phy) | ||
216 | return 0; | ||
207 | return -ENOSYS; | 217 | return -ENOSYS; |
208 | } | 218 | } |
209 | 219 | ||
210 | static inline int phy_exit(struct phy *phy) | 220 | static inline int phy_exit(struct phy *phy) |
211 | { | 221 | { |
222 | if (!phy) | ||
223 | return 0; | ||
212 | return -ENOSYS; | 224 | return -ENOSYS; |
213 | } | 225 | } |
214 | 226 | ||
215 | static inline int phy_power_on(struct phy *phy) | 227 | static inline int phy_power_on(struct phy *phy) |
216 | { | 228 | { |
229 | if (!phy) | ||
230 | return 0; | ||
217 | return -ENOSYS; | 231 | return -ENOSYS; |
218 | } | 232 | } |
219 | 233 | ||
220 | static inline int phy_power_off(struct phy *phy) | 234 | static inline int phy_power_off(struct phy *phy) |
221 | { | 235 | { |
236 | if (!phy) | ||
237 | return 0; | ||
222 | return -ENOSYS; | 238 | return -ENOSYS; |
223 | } | 239 | } |
224 | 240 | ||
diff --git a/include/linux/regulator/consumer.h b/include/linux/regulator/consumer.h index e530681bea70..1a4a8c157b31 100644 --- a/include/linux/regulator/consumer.h +++ b/include/linux/regulator/consumer.h | |||
@@ -258,14 +258,14 @@ regulator_get_exclusive(struct device *dev, const char *id) | |||
258 | static inline struct regulator *__must_check | 258 | static inline struct regulator *__must_check |
259 | regulator_get_optional(struct device *dev, const char *id) | 259 | regulator_get_optional(struct device *dev, const char *id) |
260 | { | 260 | { |
261 | return NULL; | 261 | return ERR_PTR(-ENODEV); |
262 | } | 262 | } |
263 | 263 | ||
264 | 264 | ||
265 | static inline struct regulator *__must_check | 265 | static inline struct regulator *__must_check |
266 | devm_regulator_get_optional(struct device *dev, const char *id) | 266 | devm_regulator_get_optional(struct device *dev, const char *id) |
267 | { | 267 | { |
268 | return NULL; | 268 | return ERR_PTR(-ENODEV); |
269 | } | 269 | } |
270 | 270 | ||
271 | static inline void regulator_put(struct regulator *regulator) | 271 | static inline void regulator_put(struct regulator *regulator) |
diff --git a/include/linux/serio.h b/include/linux/serio.h index 36aac733840a..9f779c7a2da4 100644 --- a/include/linux/serio.h +++ b/include/linux/serio.h | |||
@@ -23,6 +23,7 @@ struct serio { | |||
23 | 23 | ||
24 | char name[32]; | 24 | char name[32]; |
25 | char phys[32]; | 25 | char phys[32]; |
26 | char firmware_id[128]; | ||
26 | 27 | ||
27 | bool manual_bind; | 28 | bool manual_bind; |
28 | 29 | ||
diff --git a/include/linux/tty.h b/include/linux/tty.h index 1c3316a47d7e..036cccd80d9f 100644 --- a/include/linux/tty.h +++ b/include/linux/tty.h | |||
@@ -61,6 +61,7 @@ struct tty_bufhead { | |||
61 | struct tty_buffer *head; /* Queue head */ | 61 | struct tty_buffer *head; /* Queue head */ |
62 | struct work_struct work; | 62 | struct work_struct work; |
63 | struct mutex lock; | 63 | struct mutex lock; |
64 | spinlock_t flush_lock; | ||
64 | atomic_t priority; | 65 | atomic_t priority; |
65 | struct tty_buffer sentinel; | 66 | struct tty_buffer sentinel; |
66 | struct llist_head free; /* Free queue head */ | 67 | struct llist_head free; /* Free queue head */ |
diff --git a/include/trace/events/module.h b/include/trace/events/module.h index 11fd51b413de..ed0b2c599a64 100644 --- a/include/trace/events/module.h +++ b/include/trace/events/module.h | |||
@@ -25,7 +25,7 @@ struct module; | |||
25 | { (1UL << TAINT_OOT_MODULE), "O" }, \ | 25 | { (1UL << TAINT_OOT_MODULE), "O" }, \ |
26 | { (1UL << TAINT_FORCED_MODULE), "F" }, \ | 26 | { (1UL << TAINT_FORCED_MODULE), "F" }, \ |
27 | { (1UL << TAINT_CRAP), "C" }, \ | 27 | { (1UL << TAINT_CRAP), "C" }, \ |
28 | { (1UL << TAINT_UNSIGNED_MODULE), "X" }) | 28 | { (1UL << TAINT_UNSIGNED_MODULE), "E" }) |
29 | 29 | ||
30 | TRACE_EVENT(module_load, | 30 | TRACE_EVENT(module_load, |
31 | 31 | ||
diff --git a/include/uapi/asm-generic/fcntl.h b/include/uapi/asm-generic/fcntl.h index a9b13f8b3595..7543b3e51331 100644 --- a/include/uapi/asm-generic/fcntl.h +++ b/include/uapi/asm-generic/fcntl.h | |||
@@ -133,20 +133,20 @@ | |||
133 | #endif | 133 | #endif |
134 | 134 | ||
135 | /* | 135 | /* |
136 | * fd "private" POSIX locks. | 136 | * Open File Description Locks |
137 | * | 137 | * |
138 | * Usually POSIX locks held by a process are released on *any* close and are | 138 | * Usually record locks held by a process are released on *any* close and are |
139 | * not inherited across a fork(). | 139 | * not inherited across a fork(). |
140 | * | 140 | * |
141 | * These cmd values will set locks that conflict with normal POSIX locks, but | 141 | * These cmd values will set locks that conflict with process-associated |
142 | * are "owned" by the opened file, not the process. This means that they are | 142 | * record locks, but are "owned" by the open file description, not the |
143 | * inherited across fork() like BSD (flock) locks, and they are only released | 143 | * process. This means that they are inherited across fork() like BSD (flock) |
144 | * automatically when the last reference to the the open file against which | 144 | * locks, and they are only released automatically when the last reference to |
145 | * they were acquired is put. | 145 | * the the open file against which they were acquired is put. |
146 | */ | 146 | */ |
147 | #define F_GETLKP 36 | 147 | #define F_OFD_GETLK 36 |
148 | #define F_SETLKP 37 | 148 | #define F_OFD_SETLK 37 |
149 | #define F_SETLKPW 38 | 149 | #define F_OFD_SETLKW 38 |
150 | 150 | ||
151 | #define F_OWNER_TID 0 | 151 | #define F_OWNER_TID 0 |
152 | #define F_OWNER_PID 1 | 152 | #define F_OWNER_PID 1 |
diff --git a/include/uapi/linux/input.h b/include/uapi/linux/input.h index bd24470d24a2..f4849525519c 100644 --- a/include/uapi/linux/input.h +++ b/include/uapi/linux/input.h | |||
@@ -164,6 +164,7 @@ struct input_keymap_entry { | |||
164 | #define INPUT_PROP_DIRECT 0x01 /* direct input devices */ | 164 | #define INPUT_PROP_DIRECT 0x01 /* direct input devices */ |
165 | #define INPUT_PROP_BUTTONPAD 0x02 /* has button(s) under pad */ | 165 | #define INPUT_PROP_BUTTONPAD 0x02 /* has button(s) under pad */ |
166 | #define INPUT_PROP_SEMI_MT 0x03 /* touch rectangle only */ | 166 | #define INPUT_PROP_SEMI_MT 0x03 /* touch rectangle only */ |
167 | #define INPUT_PROP_TOPBUTTONPAD 0x04 /* softbuttons at top of pad */ | ||
167 | 168 | ||
168 | #define INPUT_PROP_MAX 0x1f | 169 | #define INPUT_PROP_MAX 0x1f |
169 | #define INPUT_PROP_CNT (INPUT_PROP_MAX + 1) | 170 | #define INPUT_PROP_CNT (INPUT_PROP_MAX + 1) |
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 2486a4c1a710..d34131ca372b 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c | |||
@@ -180,7 +180,7 @@ int irq_do_set_affinity(struct irq_data *data, const struct cpumask *mask, | |||
180 | struct irq_chip *chip = irq_data_get_irq_chip(data); | 180 | struct irq_chip *chip = irq_data_get_irq_chip(data); |
181 | int ret; | 181 | int ret; |
182 | 182 | ||
183 | ret = chip->irq_set_affinity(data, mask, false); | 183 | ret = chip->irq_set_affinity(data, mask, force); |
184 | switch (ret) { | 184 | switch (ret) { |
185 | case IRQ_SET_MASK_OK: | 185 | case IRQ_SET_MASK_OK: |
186 | cpumask_copy(data->affinity, mask); | 186 | cpumask_copy(data->affinity, mask); |
@@ -192,7 +192,8 @@ int irq_do_set_affinity(struct irq_data *data, const struct cpumask *mask, | |||
192 | return ret; | 192 | return ret; |
193 | } | 193 | } |
194 | 194 | ||
195 | int __irq_set_affinity_locked(struct irq_data *data, const struct cpumask *mask) | 195 | int irq_set_affinity_locked(struct irq_data *data, const struct cpumask *mask, |
196 | bool force) | ||
196 | { | 197 | { |
197 | struct irq_chip *chip = irq_data_get_irq_chip(data); | 198 | struct irq_chip *chip = irq_data_get_irq_chip(data); |
198 | struct irq_desc *desc = irq_data_to_desc(data); | 199 | struct irq_desc *desc = irq_data_to_desc(data); |
@@ -202,7 +203,7 @@ int __irq_set_affinity_locked(struct irq_data *data, const struct cpumask *mask) | |||
202 | return -EINVAL; | 203 | return -EINVAL; |
203 | 204 | ||
204 | if (irq_can_move_pcntxt(data)) { | 205 | if (irq_can_move_pcntxt(data)) { |
205 | ret = irq_do_set_affinity(data, mask, false); | 206 | ret = irq_do_set_affinity(data, mask, force); |
206 | } else { | 207 | } else { |
207 | irqd_set_move_pending(data); | 208 | irqd_set_move_pending(data); |
208 | irq_copy_pending(desc, mask); | 209 | irq_copy_pending(desc, mask); |
@@ -217,13 +218,7 @@ int __irq_set_affinity_locked(struct irq_data *data, const struct cpumask *mask) | |||
217 | return ret; | 218 | return ret; |
218 | } | 219 | } |
219 | 220 | ||
220 | /** | 221 | int __irq_set_affinity(unsigned int irq, const struct cpumask *mask, bool force) |
221 | * irq_set_affinity - Set the irq affinity of a given irq | ||
222 | * @irq: Interrupt to set affinity | ||
223 | * @mask: cpumask | ||
224 | * | ||
225 | */ | ||
226 | int irq_set_affinity(unsigned int irq, const struct cpumask *mask) | ||
227 | { | 222 | { |
228 | struct irq_desc *desc = irq_to_desc(irq); | 223 | struct irq_desc *desc = irq_to_desc(irq); |
229 | unsigned long flags; | 224 | unsigned long flags; |
@@ -233,7 +228,7 @@ int irq_set_affinity(unsigned int irq, const struct cpumask *mask) | |||
233 | return -EINVAL; | 228 | return -EINVAL; |
234 | 229 | ||
235 | raw_spin_lock_irqsave(&desc->lock, flags); | 230 | raw_spin_lock_irqsave(&desc->lock, flags); |
236 | ret = __irq_set_affinity_locked(irq_desc_get_irq_data(desc), mask); | 231 | ret = irq_set_affinity_locked(irq_desc_get_irq_data(desc), mask, force); |
237 | raw_spin_unlock_irqrestore(&desc->lock, flags); | 232 | raw_spin_unlock_irqrestore(&desc->lock, flags); |
238 | return ret; | 233 | return ret; |
239 | } | 234 | } |
diff --git a/kernel/module.c b/kernel/module.c index 11869408f79b..079c4615607d 100644 --- a/kernel/module.c +++ b/kernel/module.c | |||
@@ -815,9 +815,6 @@ SYSCALL_DEFINE2(delete_module, const char __user *, name_user, | |||
815 | return -EFAULT; | 815 | return -EFAULT; |
816 | name[MODULE_NAME_LEN-1] = '\0'; | 816 | name[MODULE_NAME_LEN-1] = '\0'; |
817 | 817 | ||
818 | if (!(flags & O_NONBLOCK)) | ||
819 | pr_warn("waiting module removal not supported: please upgrade\n"); | ||
820 | |||
821 | if (mutex_lock_interruptible(&module_mutex) != 0) | 818 | if (mutex_lock_interruptible(&module_mutex) != 0) |
822 | return -EINTR; | 819 | return -EINTR; |
823 | 820 | ||
@@ -3271,6 +3268,9 @@ static int load_module(struct load_info *info, const char __user *uargs, | |||
3271 | 3268 | ||
3272 | dynamic_debug_setup(info->debug, info->num_debug); | 3269 | dynamic_debug_setup(info->debug, info->num_debug); |
3273 | 3270 | ||
3271 | /* Ftrace init must be called in the MODULE_STATE_UNFORMED state */ | ||
3272 | ftrace_module_init(mod); | ||
3273 | |||
3274 | /* Finally it's fully formed, ready to start executing. */ | 3274 | /* Finally it's fully formed, ready to start executing. */ |
3275 | err = complete_formation(mod, info); | 3275 | err = complete_formation(mod, info); |
3276 | if (err) | 3276 | if (err) |
diff --git a/kernel/power/suspend.c b/kernel/power/suspend.c index c3ad9cafe930..8233cd4047d7 100644 --- a/kernel/power/suspend.c +++ b/kernel/power/suspend.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
15 | #include <linux/console.h> | 15 | #include <linux/console.h> |
16 | #include <linux/cpu.h> | 16 | #include <linux/cpu.h> |
17 | #include <linux/cpuidle.h> | ||
17 | #include <linux/syscalls.h> | 18 | #include <linux/syscalls.h> |
18 | #include <linux/gfp.h> | 19 | #include <linux/gfp.h> |
19 | #include <linux/io.h> | 20 | #include <linux/io.h> |
@@ -53,7 +54,9 @@ static void freeze_begin(void) | |||
53 | 54 | ||
54 | static void freeze_enter(void) | 55 | static void freeze_enter(void) |
55 | { | 56 | { |
57 | cpuidle_resume(); | ||
56 | wait_event(suspend_freeze_wait_head, suspend_freeze_wake); | 58 | wait_event(suspend_freeze_wait_head, suspend_freeze_wake); |
59 | cpuidle_pause(); | ||
57 | } | 60 | } |
58 | 61 | ||
59 | void freeze_wake(void) | 62 | void freeze_wake(void) |
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 1fd4b9479210..4a54a25afa2f 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c | |||
@@ -4330,16 +4330,11 @@ static void ftrace_init_module(struct module *mod, | |||
4330 | ftrace_process_locs(mod, start, end); | 4330 | ftrace_process_locs(mod, start, end); |
4331 | } | 4331 | } |
4332 | 4332 | ||
4333 | static int ftrace_module_notify_enter(struct notifier_block *self, | 4333 | void ftrace_module_init(struct module *mod) |
4334 | unsigned long val, void *data) | ||
4335 | { | 4334 | { |
4336 | struct module *mod = data; | 4335 | ftrace_init_module(mod, mod->ftrace_callsites, |
4337 | 4336 | mod->ftrace_callsites + | |
4338 | if (val == MODULE_STATE_COMING) | 4337 | mod->num_ftrace_callsites); |
4339 | ftrace_init_module(mod, mod->ftrace_callsites, | ||
4340 | mod->ftrace_callsites + | ||
4341 | mod->num_ftrace_callsites); | ||
4342 | return 0; | ||
4343 | } | 4338 | } |
4344 | 4339 | ||
4345 | static int ftrace_module_notify_exit(struct notifier_block *self, | 4340 | static int ftrace_module_notify_exit(struct notifier_block *self, |
@@ -4353,11 +4348,6 @@ static int ftrace_module_notify_exit(struct notifier_block *self, | |||
4353 | return 0; | 4348 | return 0; |
4354 | } | 4349 | } |
4355 | #else | 4350 | #else |
4356 | static int ftrace_module_notify_enter(struct notifier_block *self, | ||
4357 | unsigned long val, void *data) | ||
4358 | { | ||
4359 | return 0; | ||
4360 | } | ||
4361 | static int ftrace_module_notify_exit(struct notifier_block *self, | 4351 | static int ftrace_module_notify_exit(struct notifier_block *self, |
4362 | unsigned long val, void *data) | 4352 | unsigned long val, void *data) |
4363 | { | 4353 | { |
@@ -4365,11 +4355,6 @@ static int ftrace_module_notify_exit(struct notifier_block *self, | |||
4365 | } | 4355 | } |
4366 | #endif /* CONFIG_MODULES */ | 4356 | #endif /* CONFIG_MODULES */ |
4367 | 4357 | ||
4368 | struct notifier_block ftrace_module_enter_nb = { | ||
4369 | .notifier_call = ftrace_module_notify_enter, | ||
4370 | .priority = INT_MAX, /* Run before anything that can use kprobes */ | ||
4371 | }; | ||
4372 | |||
4373 | struct notifier_block ftrace_module_exit_nb = { | 4358 | struct notifier_block ftrace_module_exit_nb = { |
4374 | .notifier_call = ftrace_module_notify_exit, | 4359 | .notifier_call = ftrace_module_notify_exit, |
4375 | .priority = INT_MIN, /* Run after anything that can remove kprobes */ | 4360 | .priority = INT_MIN, /* Run after anything that can remove kprobes */ |
@@ -4403,10 +4388,6 @@ void __init ftrace_init(void) | |||
4403 | __start_mcount_loc, | 4388 | __start_mcount_loc, |
4404 | __stop_mcount_loc); | 4389 | __stop_mcount_loc); |
4405 | 4390 | ||
4406 | ret = register_module_notifier(&ftrace_module_enter_nb); | ||
4407 | if (ret) | ||
4408 | pr_warning("Failed to register trace ftrace module enter notifier\n"); | ||
4409 | |||
4410 | ret = register_module_notifier(&ftrace_module_exit_nb); | 4391 | ret = register_module_notifier(&ftrace_module_exit_nb); |
4411 | if (ret) | 4392 | if (ret) |
4412 | pr_warning("Failed to register trace ftrace module exit notifier\n"); | 4393 | pr_warning("Failed to register trace ftrace module exit notifier\n"); |
diff --git a/mm/memory.c b/mm/memory.c index d0f0bef3be48..037b812a9531 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
@@ -232,17 +232,18 @@ void tlb_gather_mmu(struct mmu_gather *tlb, struct mm_struct *mm, unsigned long | |||
232 | #endif | 232 | #endif |
233 | } | 233 | } |
234 | 234 | ||
235 | void tlb_flush_mmu(struct mmu_gather *tlb) | 235 | static void tlb_flush_mmu_tlbonly(struct mmu_gather *tlb) |
236 | { | 236 | { |
237 | struct mmu_gather_batch *batch; | ||
238 | |||
239 | if (!tlb->need_flush) | ||
240 | return; | ||
241 | tlb->need_flush = 0; | 237 | tlb->need_flush = 0; |
242 | tlb_flush(tlb); | 238 | tlb_flush(tlb); |
243 | #ifdef CONFIG_HAVE_RCU_TABLE_FREE | 239 | #ifdef CONFIG_HAVE_RCU_TABLE_FREE |
244 | tlb_table_flush(tlb); | 240 | tlb_table_flush(tlb); |
245 | #endif | 241 | #endif |
242 | } | ||
243 | |||
244 | static void tlb_flush_mmu_free(struct mmu_gather *tlb) | ||
245 | { | ||
246 | struct mmu_gather_batch *batch; | ||
246 | 247 | ||
247 | for (batch = &tlb->local; batch; batch = batch->next) { | 248 | for (batch = &tlb->local; batch; batch = batch->next) { |
248 | free_pages_and_swap_cache(batch->pages, batch->nr); | 249 | free_pages_and_swap_cache(batch->pages, batch->nr); |
@@ -251,6 +252,14 @@ void tlb_flush_mmu(struct mmu_gather *tlb) | |||
251 | tlb->active = &tlb->local; | 252 | tlb->active = &tlb->local; |
252 | } | 253 | } |
253 | 254 | ||
255 | void tlb_flush_mmu(struct mmu_gather *tlb) | ||
256 | { | ||
257 | if (!tlb->need_flush) | ||
258 | return; | ||
259 | tlb_flush_mmu_tlbonly(tlb); | ||
260 | tlb_flush_mmu_free(tlb); | ||
261 | } | ||
262 | |||
254 | /* tlb_finish_mmu | 263 | /* tlb_finish_mmu |
255 | * Called at the end of the shootdown operation to free up any resources | 264 | * Called at the end of the shootdown operation to free up any resources |
256 | * that were required. | 265 | * that were required. |
@@ -1127,8 +1136,10 @@ again: | |||
1127 | if (PageAnon(page)) | 1136 | if (PageAnon(page)) |
1128 | rss[MM_ANONPAGES]--; | 1137 | rss[MM_ANONPAGES]--; |
1129 | else { | 1138 | else { |
1130 | if (pte_dirty(ptent)) | 1139 | if (pte_dirty(ptent)) { |
1140 | force_flush = 1; | ||
1131 | set_page_dirty(page); | 1141 | set_page_dirty(page); |
1142 | } | ||
1132 | if (pte_young(ptent) && | 1143 | if (pte_young(ptent) && |
1133 | likely(!(vma->vm_flags & VM_SEQ_READ))) | 1144 | likely(!(vma->vm_flags & VM_SEQ_READ))) |
1134 | mark_page_accessed(page); | 1145 | mark_page_accessed(page); |
@@ -1137,9 +1148,10 @@ again: | |||
1137 | page_remove_rmap(page); | 1148 | page_remove_rmap(page); |
1138 | if (unlikely(page_mapcount(page) < 0)) | 1149 | if (unlikely(page_mapcount(page) < 0)) |
1139 | print_bad_pte(vma, addr, ptent, page); | 1150 | print_bad_pte(vma, addr, ptent, page); |
1140 | force_flush = !__tlb_remove_page(tlb, page); | 1151 | if (unlikely(!__tlb_remove_page(tlb, page))) { |
1141 | if (force_flush) | 1152 | force_flush = 1; |
1142 | break; | 1153 | break; |
1154 | } | ||
1143 | continue; | 1155 | continue; |
1144 | } | 1156 | } |
1145 | /* | 1157 | /* |
@@ -1174,18 +1186,11 @@ again: | |||
1174 | 1186 | ||
1175 | add_mm_rss_vec(mm, rss); | 1187 | add_mm_rss_vec(mm, rss); |
1176 | arch_leave_lazy_mmu_mode(); | 1188 | arch_leave_lazy_mmu_mode(); |
1177 | pte_unmap_unlock(start_pte, ptl); | ||
1178 | 1189 | ||
1179 | /* | 1190 | /* Do the actual TLB flush before dropping ptl */ |
1180 | * mmu_gather ran out of room to batch pages, we break out of | ||
1181 | * the PTE lock to avoid doing the potential expensive TLB invalidate | ||
1182 | * and page-free while holding it. | ||
1183 | */ | ||
1184 | if (force_flush) { | 1191 | if (force_flush) { |
1185 | unsigned long old_end; | 1192 | unsigned long old_end; |
1186 | 1193 | ||
1187 | force_flush = 0; | ||
1188 | |||
1189 | /* | 1194 | /* |
1190 | * Flush the TLB just for the previous segment, | 1195 | * Flush the TLB just for the previous segment, |
1191 | * then update the range to be the remaining | 1196 | * then update the range to be the remaining |
@@ -1193,11 +1198,21 @@ again: | |||
1193 | */ | 1198 | */ |
1194 | old_end = tlb->end; | 1199 | old_end = tlb->end; |
1195 | tlb->end = addr; | 1200 | tlb->end = addr; |
1196 | 1201 | tlb_flush_mmu_tlbonly(tlb); | |
1197 | tlb_flush_mmu(tlb); | ||
1198 | |||
1199 | tlb->start = addr; | 1202 | tlb->start = addr; |
1200 | tlb->end = old_end; | 1203 | tlb->end = old_end; |
1204 | } | ||
1205 | pte_unmap_unlock(start_pte, ptl); | ||
1206 | |||
1207 | /* | ||
1208 | * If we forced a TLB flush (either due to running out of | ||
1209 | * batch buffers or because we needed to flush dirty TLB | ||
1210 | * entries before releasing the ptl), free the batched | ||
1211 | * memory too. Restart if we didn't do everything. | ||
1212 | */ | ||
1213 | if (force_flush) { | ||
1214 | force_flush = 0; | ||
1215 | tlb_flush_mmu_free(tlb); | ||
1201 | 1216 | ||
1202 | if (addr != end) | 1217 | if (addr != end) |
1203 | goto again; | 1218 | goto again; |
@@ -1955,12 +1970,17 @@ int fixup_user_fault(struct task_struct *tsk, struct mm_struct *mm, | |||
1955 | unsigned long address, unsigned int fault_flags) | 1970 | unsigned long address, unsigned int fault_flags) |
1956 | { | 1971 | { |
1957 | struct vm_area_struct *vma; | 1972 | struct vm_area_struct *vma; |
1973 | vm_flags_t vm_flags; | ||
1958 | int ret; | 1974 | int ret; |
1959 | 1975 | ||
1960 | vma = find_extend_vma(mm, address); | 1976 | vma = find_extend_vma(mm, address); |
1961 | if (!vma || address < vma->vm_start) | 1977 | if (!vma || address < vma->vm_start) |
1962 | return -EFAULT; | 1978 | return -EFAULT; |
1963 | 1979 | ||
1980 | vm_flags = (fault_flags & FAULT_FLAG_WRITE) ? VM_WRITE : VM_READ; | ||
1981 | if (!(vm_flags & vma->vm_flags)) | ||
1982 | return -EFAULT; | ||
1983 | |||
1964 | ret = handle_mm_fault(mm, vma, address, fault_flags); | 1984 | ret = handle_mm_fault(mm, vma, address, fault_flags); |
1965 | if (ret & VM_FAULT_ERROR) { | 1985 | if (ret & VM_FAULT_ERROR) { |
1966 | if (ret & VM_FAULT_OOM) | 1986 | if (ret & VM_FAULT_OOM) |
diff --git a/mm/vmacache.c b/mm/vmacache.c index d4224b397c0e..1037a3bab505 100644 --- a/mm/vmacache.c +++ b/mm/vmacache.c | |||
@@ -81,10 +81,12 @@ struct vm_area_struct *vmacache_find(struct mm_struct *mm, unsigned long addr) | |||
81 | for (i = 0; i < VMACACHE_SIZE; i++) { | 81 | for (i = 0; i < VMACACHE_SIZE; i++) { |
82 | struct vm_area_struct *vma = current->vmacache[i]; | 82 | struct vm_area_struct *vma = current->vmacache[i]; |
83 | 83 | ||
84 | if (vma && vma->vm_start <= addr && vma->vm_end > addr) { | 84 | if (!vma) |
85 | BUG_ON(vma->vm_mm != mm); | 85 | continue; |
86 | if (WARN_ON_ONCE(vma->vm_mm != mm)) | ||
87 | break; | ||
88 | if (vma->vm_start <= addr && vma->vm_end > addr) | ||
86 | return vma; | 89 | return vma; |
87 | } | ||
88 | } | 90 | } |
89 | 91 | ||
90 | return NULL; | 92 | return NULL; |
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index b4beb77967b1..2c7341dbc5d6 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c | |||
@@ -3317,9 +3317,9 @@ static int selinux_file_fcntl(struct file *file, unsigned int cmd, | |||
3317 | case F_GETLK: | 3317 | case F_GETLK: |
3318 | case F_SETLK: | 3318 | case F_SETLK: |
3319 | case F_SETLKW: | 3319 | case F_SETLKW: |
3320 | case F_GETLKP: | 3320 | case F_OFD_GETLK: |
3321 | case F_SETLKP: | 3321 | case F_OFD_SETLK: |
3322 | case F_SETLKPW: | 3322 | case F_OFD_SETLKW: |
3323 | #if BITS_PER_LONG == 32 | 3323 | #if BITS_PER_LONG == 32 |
3324 | case F_GETLK64: | 3324 | case F_GETLK64: |
3325 | case F_SETLK64: | 3325 | case F_SETLK64: |
diff --git a/sound/pci/hda/hda_controller.c b/sound/pci/hda/hda_controller.c index 248b90abb882..480bbddbd801 100644 --- a/sound/pci/hda/hda_controller.c +++ b/sound/pci/hda/hda_controller.c | |||
@@ -1059,24 +1059,26 @@ static void azx_init_cmd_io(struct azx *chip) | |||
1059 | 1059 | ||
1060 | /* reset the corb hw read pointer */ | 1060 | /* reset the corb hw read pointer */ |
1061 | azx_writew(chip, CORBRP, ICH6_CORBRP_RST); | 1061 | azx_writew(chip, CORBRP, ICH6_CORBRP_RST); |
1062 | for (timeout = 1000; timeout > 0; timeout--) { | 1062 | if (!(chip->driver_caps & AZX_DCAPS_CORBRP_SELF_CLEAR)) { |
1063 | if ((azx_readw(chip, CORBRP) & ICH6_CORBRP_RST) == ICH6_CORBRP_RST) | 1063 | for (timeout = 1000; timeout > 0; timeout--) { |
1064 | break; | 1064 | if ((azx_readw(chip, CORBRP) & ICH6_CORBRP_RST) == ICH6_CORBRP_RST) |
1065 | udelay(1); | 1065 | break; |
1066 | } | 1066 | udelay(1); |
1067 | if (timeout <= 0) | 1067 | } |
1068 | dev_err(chip->card->dev, "CORB reset timeout#1, CORBRP = %d\n", | 1068 | if (timeout <= 0) |
1069 | azx_readw(chip, CORBRP)); | 1069 | dev_err(chip->card->dev, "CORB reset timeout#1, CORBRP = %d\n", |
1070 | azx_readw(chip, CORBRP)); | ||
1070 | 1071 | ||
1071 | azx_writew(chip, CORBRP, 0); | 1072 | azx_writew(chip, CORBRP, 0); |
1072 | for (timeout = 1000; timeout > 0; timeout--) { | 1073 | for (timeout = 1000; timeout > 0; timeout--) { |
1073 | if (azx_readw(chip, CORBRP) == 0) | 1074 | if (azx_readw(chip, CORBRP) == 0) |
1074 | break; | 1075 | break; |
1075 | udelay(1); | 1076 | udelay(1); |
1077 | } | ||
1078 | if (timeout <= 0) | ||
1079 | dev_err(chip->card->dev, "CORB reset timeout#2, CORBRP = %d\n", | ||
1080 | azx_readw(chip, CORBRP)); | ||
1076 | } | 1081 | } |
1077 | if (timeout <= 0) | ||
1078 | dev_err(chip->card->dev, "CORB reset timeout#2, CORBRP = %d\n", | ||
1079 | azx_readw(chip, CORBRP)); | ||
1080 | 1082 | ||
1081 | /* enable corb dma */ | 1083 | /* enable corb dma */ |
1082 | azx_writeb(chip, CORBCTL, ICH6_CORBCTL_RUN); | 1084 | azx_writeb(chip, CORBCTL, ICH6_CORBCTL_RUN); |
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index d6bca62ef387..b540ad71eb0d 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
@@ -249,7 +249,8 @@ enum { | |||
249 | /* quirks for Nvidia */ | 249 | /* quirks for Nvidia */ |
250 | #define AZX_DCAPS_PRESET_NVIDIA \ | 250 | #define AZX_DCAPS_PRESET_NVIDIA \ |
251 | (AZX_DCAPS_NVIDIA_SNOOP | AZX_DCAPS_RIRB_DELAY | AZX_DCAPS_NO_MSI |\ | 251 | (AZX_DCAPS_NVIDIA_SNOOP | AZX_DCAPS_RIRB_DELAY | AZX_DCAPS_NO_MSI |\ |
252 | AZX_DCAPS_ALIGN_BUFSIZE | AZX_DCAPS_NO_64BIT) | 252 | AZX_DCAPS_ALIGN_BUFSIZE | AZX_DCAPS_NO_64BIT |\ |
253 | AZX_DCAPS_CORBRP_SELF_CLEAR) | ||
253 | 254 | ||
254 | #define AZX_DCAPS_PRESET_CTHDA \ | 255 | #define AZX_DCAPS_PRESET_CTHDA \ |
255 | (AZX_DCAPS_NO_MSI | AZX_DCAPS_POSFIX_LPIB | AZX_DCAPS_4K_BDLE_BOUNDARY) | 256 | (AZX_DCAPS_NO_MSI | AZX_DCAPS_POSFIX_LPIB | AZX_DCAPS_4K_BDLE_BOUNDARY) |
diff --git a/sound/pci/hda/hda_priv.h b/sound/pci/hda/hda_priv.h index ba38b819f984..4a7cb01fa912 100644 --- a/sound/pci/hda/hda_priv.h +++ b/sound/pci/hda/hda_priv.h | |||
@@ -189,6 +189,7 @@ enum { SDI0, SDI1, SDI2, SDI3, SDO0, SDO1, SDO2, SDO3 }; | |||
189 | #define AZX_DCAPS_COUNT_LPIB_DELAY (1 << 25) /* Take LPIB as delay */ | 189 | #define AZX_DCAPS_COUNT_LPIB_DELAY (1 << 25) /* Take LPIB as delay */ |
190 | #define AZX_DCAPS_PM_RUNTIME (1 << 26) /* runtime PM support */ | 190 | #define AZX_DCAPS_PM_RUNTIME (1 << 26) /* runtime PM support */ |
191 | #define AZX_DCAPS_I915_POWERWELL (1 << 27) /* HSW i915 powerwell support */ | 191 | #define AZX_DCAPS_I915_POWERWELL (1 << 27) /* HSW i915 powerwell support */ |
192 | #define AZX_DCAPS_CORBRP_SELF_CLEAR (1 << 28) /* CORBRP clears itself after reset */ | ||
192 | 193 | ||
193 | /* position fix mode */ | 194 | /* position fix mode */ |
194 | enum { | 195 | enum { |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index c643dfc0a826..c1952c910339 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -4621,6 +4621,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | |||
4621 | SND_PCI_QUIRK(0x1028, 0x0667, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | 4621 | SND_PCI_QUIRK(0x1028, 0x0667, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
4622 | SND_PCI_QUIRK(0x1028, 0x0668, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE), | 4622 | SND_PCI_QUIRK(0x1028, 0x0668, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE), |
4623 | SND_PCI_QUIRK(0x1028, 0x0669, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE), | 4623 | SND_PCI_QUIRK(0x1028, 0x0669, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE), |
4624 | SND_PCI_QUIRK(0x1028, 0x0674, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE), | ||
4624 | SND_PCI_QUIRK(0x1028, 0x067f, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE), | 4625 | SND_PCI_QUIRK(0x1028, 0x067f, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE), |
4625 | SND_PCI_QUIRK(0x1028, 0x15cc, "Dell X5 Precision", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE), | 4626 | SND_PCI_QUIRK(0x1028, 0x15cc, "Dell X5 Precision", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE), |
4626 | SND_PCI_QUIRK(0x1028, 0x15cd, "Dell X5 Precision", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE), | 4627 | SND_PCI_QUIRK(0x1028, 0x15cd, "Dell X5 Precision", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE), |
diff --git a/sound/soc/codecs/alc5623.c b/sound/soc/codecs/alc5623.c index f500905e9373..2acf82f4a08a 100644 --- a/sound/soc/codecs/alc5623.c +++ b/sound/soc/codecs/alc5623.c | |||
@@ -1018,13 +1018,13 @@ static int alc5623_i2c_probe(struct i2c_client *client, | |||
1018 | dev_err(&client->dev, "failed to read vendor ID1: %d\n", ret); | 1018 | dev_err(&client->dev, "failed to read vendor ID1: %d\n", ret); |
1019 | return ret; | 1019 | return ret; |
1020 | } | 1020 | } |
1021 | vid1 = ((vid1 & 0xff) << 8) | (vid1 >> 8); | ||
1022 | 1021 | ||
1023 | ret = regmap_read(alc5623->regmap, ALC5623_VENDOR_ID2, &vid2); | 1022 | ret = regmap_read(alc5623->regmap, ALC5623_VENDOR_ID2, &vid2); |
1024 | if (ret < 0) { | 1023 | if (ret < 0) { |
1025 | dev_err(&client->dev, "failed to read vendor ID2: %d\n", ret); | 1024 | dev_err(&client->dev, "failed to read vendor ID2: %d\n", ret); |
1026 | return ret; | 1025 | return ret; |
1027 | } | 1026 | } |
1027 | vid2 >>= 8; | ||
1028 | 1028 | ||
1029 | if ((vid1 != 0x10ec) || (vid2 != id->driver_data)) { | 1029 | if ((vid1 != 0x10ec) || (vid2 != id->driver_data)) { |
1030 | dev_err(&client->dev, "unknown or wrong codec\n"); | 1030 | dev_err(&client->dev, "unknown or wrong codec\n"); |
diff --git a/sound/soc/codecs/cs42l52.c b/sound/soc/codecs/cs42l52.c index 460d35547a68..2213a037c893 100644 --- a/sound/soc/codecs/cs42l52.c +++ b/sound/soc/codecs/cs42l52.c | |||
@@ -1229,8 +1229,10 @@ static int cs42l52_i2c_probe(struct i2c_client *i2c_client, | |||
1229 | } | 1229 | } |
1230 | 1230 | ||
1231 | if (cs42l52->pdata.reset_gpio) { | 1231 | if (cs42l52->pdata.reset_gpio) { |
1232 | ret = gpio_request_one(cs42l52->pdata.reset_gpio, | 1232 | ret = devm_gpio_request_one(&i2c_client->dev, |
1233 | GPIOF_OUT_INIT_HIGH, "CS42L52 /RST"); | 1233 | cs42l52->pdata.reset_gpio, |
1234 | GPIOF_OUT_INIT_HIGH, | ||
1235 | "CS42L52 /RST"); | ||
1234 | if (ret < 0) { | 1236 | if (ret < 0) { |
1235 | dev_err(&i2c_client->dev, "Failed to request /RST %d: %d\n", | 1237 | dev_err(&i2c_client->dev, "Failed to request /RST %d: %d\n", |
1236 | cs42l52->pdata.reset_gpio, ret); | 1238 | cs42l52->pdata.reset_gpio, ret); |
diff --git a/sound/soc/codecs/cs42l73.c b/sound/soc/codecs/cs42l73.c index 0ee60a19a263..ae3717992d56 100644 --- a/sound/soc/codecs/cs42l73.c +++ b/sound/soc/codecs/cs42l73.c | |||
@@ -1443,8 +1443,10 @@ static int cs42l73_i2c_probe(struct i2c_client *i2c_client, | |||
1443 | i2c_set_clientdata(i2c_client, cs42l73); | 1443 | i2c_set_clientdata(i2c_client, cs42l73); |
1444 | 1444 | ||
1445 | if (cs42l73->pdata.reset_gpio) { | 1445 | if (cs42l73->pdata.reset_gpio) { |
1446 | ret = gpio_request_one(cs42l73->pdata.reset_gpio, | 1446 | ret = devm_gpio_request_one(&i2c_client->dev, |
1447 | GPIOF_OUT_INIT_HIGH, "CS42L73 /RST"); | 1447 | cs42l73->pdata.reset_gpio, |
1448 | GPIOF_OUT_INIT_HIGH, | ||
1449 | "CS42L73 /RST"); | ||
1448 | if (ret < 0) { | 1450 | if (ret < 0) { |
1449 | dev_err(&i2c_client->dev, "Failed to request /RST %d: %d\n", | 1451 | dev_err(&i2c_client->dev, "Failed to request /RST %d: %d\n", |
1450 | cs42l73->pdata.reset_gpio, ret); | 1452 | cs42l73->pdata.reset_gpio, ret); |
diff --git a/sound/soc/codecs/tlv320aic3x.c b/sound/soc/codecs/tlv320aic3x.c index b1835103e9b4..d7349bc89ad3 100644 --- a/sound/soc/codecs/tlv320aic3x.c +++ b/sound/soc/codecs/tlv320aic3x.c | |||
@@ -1399,7 +1399,6 @@ static int aic3x_probe(struct snd_soc_codec *codec) | |||
1399 | } | 1399 | } |
1400 | 1400 | ||
1401 | aic3x_add_widgets(codec); | 1401 | aic3x_add_widgets(codec); |
1402 | list_add(&aic3x->list, &reset_list); | ||
1403 | 1402 | ||
1404 | return 0; | 1403 | return 0; |
1405 | 1404 | ||
@@ -1569,7 +1568,13 @@ static int aic3x_i2c_probe(struct i2c_client *i2c, | |||
1569 | 1568 | ||
1570 | ret = snd_soc_register_codec(&i2c->dev, | 1569 | ret = snd_soc_register_codec(&i2c->dev, |
1571 | &soc_codec_dev_aic3x, &aic3x_dai, 1); | 1570 | &soc_codec_dev_aic3x, &aic3x_dai, 1); |
1572 | return ret; | 1571 | |
1572 | if (ret != 0) | ||
1573 | goto err_gpio; | ||
1574 | |||
1575 | list_add(&aic3x->list, &reset_list); | ||
1576 | |||
1577 | return 0; | ||
1573 | 1578 | ||
1574 | err_gpio: | 1579 | err_gpio: |
1575 | if (gpio_is_valid(aic3x->gpio_reset) && | 1580 | if (gpio_is_valid(aic3x->gpio_reset) && |
diff --git a/sound/soc/fsl/fsl_spdif.h b/sound/soc/fsl/fsl_spdif.h index b1266790d117..605a10b2112b 100644 --- a/sound/soc/fsl/fsl_spdif.h +++ b/sound/soc/fsl/fsl_spdif.h | |||
@@ -144,8 +144,8 @@ enum spdif_gainsel { | |||
144 | 144 | ||
145 | /* SPDIF Clock register */ | 145 | /* SPDIF Clock register */ |
146 | #define STC_SYSCLK_DIV_OFFSET 11 | 146 | #define STC_SYSCLK_DIV_OFFSET 11 |
147 | #define STC_SYSCLK_DIV_MASK (0x1ff << STC_TXCLK_SRC_OFFSET) | 147 | #define STC_SYSCLK_DIV_MASK (0x1ff << STC_SYSCLK_DIV_OFFSET) |
148 | #define STC_SYSCLK_DIV(x) ((((x) - 1) << STC_TXCLK_DIV_OFFSET) & STC_SYSCLK_DIV_MASK) | 148 | #define STC_SYSCLK_DIV(x) ((((x) - 1) << STC_SYSCLK_DIV_OFFSET) & STC_SYSCLK_DIV_MASK) |
149 | #define STC_TXCLK_SRC_OFFSET 8 | 149 | #define STC_TXCLK_SRC_OFFSET 8 |
150 | #define STC_TXCLK_SRC_MASK (0x7 << STC_TXCLK_SRC_OFFSET) | 150 | #define STC_TXCLK_SRC_MASK (0x7 << STC_TXCLK_SRC_OFFSET) |
151 | #define STC_TXCLK_SRC_SET(x) ((x << STC_TXCLK_SRC_OFFSET) & STC_TXCLK_SRC_MASK) | 151 | #define STC_TXCLK_SRC_SET(x) ((x << STC_TXCLK_SRC_OFFSET) & STC_TXCLK_SRC_MASK) |
diff --git a/sound/soc/intel/sst-dsp-priv.h b/sound/soc/intel/sst-dsp-priv.h index fe8e81aad646..30ca14a6a835 100644 --- a/sound/soc/intel/sst-dsp-priv.h +++ b/sound/soc/intel/sst-dsp-priv.h | |||
@@ -136,7 +136,7 @@ struct sst_module_data { | |||
136 | enum sst_data_type data_type; /* type of module data */ | 136 | enum sst_data_type data_type; /* type of module data */ |
137 | 137 | ||
138 | u32 size; /* size in bytes */ | 138 | u32 size; /* size in bytes */ |
139 | u32 offset; /* offset in FW file */ | 139 | int32_t offset; /* offset in FW file */ |
140 | u32 data_offset; /* offset in ADSP memory space */ | 140 | u32 data_offset; /* offset in ADSP memory space */ |
141 | void *data; /* module data */ | 141 | void *data; /* module data */ |
142 | }; | 142 | }; |
diff --git a/sound/soc/intel/sst-haswell-ipc.c b/sound/soc/intel/sst-haswell-ipc.c index f46bb4ddde6f..50e4246d4b57 100644 --- a/sound/soc/intel/sst-haswell-ipc.c +++ b/sound/soc/intel/sst-haswell-ipc.c | |||
@@ -617,7 +617,7 @@ static void hsw_notification_work(struct work_struct *work) | |||
617 | case IPC_POSITION_CHANGED: | 617 | case IPC_POSITION_CHANGED: |
618 | trace_ipc_notification("DSP stream position changed for", | 618 | trace_ipc_notification("DSP stream position changed for", |
619 | stream->reply.stream_hw_id); | 619 | stream->reply.stream_hw_id); |
620 | sst_dsp_inbox_read(hsw->dsp, pos, sizeof(pos)); | 620 | sst_dsp_inbox_read(hsw->dsp, pos, sizeof(*pos)); |
621 | 621 | ||
622 | if (stream->notify_position) | 622 | if (stream->notify_position) |
623 | stream->notify_position(stream, stream->pdata); | 623 | stream->notify_position(stream, stream->pdata); |
@@ -991,7 +991,8 @@ int sst_hsw_stream_get_volume(struct sst_hsw *hsw, struct sst_hsw_stream *stream | |||
991 | return -EINVAL; | 991 | return -EINVAL; |
992 | 992 | ||
993 | sst_dsp_read(hsw->dsp, volume, | 993 | sst_dsp_read(hsw->dsp, volume, |
994 | stream->reply.volume_register_address[channel], sizeof(volume)); | 994 | stream->reply.volume_register_address[channel], |
995 | sizeof(*volume)); | ||
995 | 996 | ||
996 | return 0; | 997 | return 0; |
997 | } | 998 | } |
@@ -1609,7 +1610,7 @@ int sst_hsw_dx_set_state(struct sst_hsw *hsw, | |||
1609 | trace_ipc_request("PM enter Dx state", state); | 1610 | trace_ipc_request("PM enter Dx state", state); |
1610 | 1611 | ||
1611 | ret = ipc_tx_message_wait(hsw, header, &state_, sizeof(state_), | 1612 | ret = ipc_tx_message_wait(hsw, header, &state_, sizeof(state_), |
1612 | dx, sizeof(dx)); | 1613 | dx, sizeof(*dx)); |
1613 | if (ret < 0) { | 1614 | if (ret < 0) { |
1614 | dev_err(hsw->dev, "ipc: error set dx state %d failed\n", state); | 1615 | dev_err(hsw->dev, "ipc: error set dx state %d failed\n", state); |
1615 | return ret; | 1616 | return ret; |
diff --git a/sound/soc/jz4740/Makefile b/sound/soc/jz4740/Makefile index be873c1b0c20..d32c540555c4 100644 --- a/sound/soc/jz4740/Makefile +++ b/sound/soc/jz4740/Makefile | |||
@@ -1,10 +1,8 @@ | |||
1 | # | 1 | # |
2 | # Jz4740 Platform Support | 2 | # Jz4740 Platform Support |
3 | # | 3 | # |
4 | snd-soc-jz4740-objs := jz4740-pcm.o | ||
5 | snd-soc-jz4740-i2s-objs := jz4740-i2s.o | 4 | snd-soc-jz4740-i2s-objs := jz4740-i2s.o |
6 | 5 | ||
7 | obj-$(CONFIG_SND_JZ4740_SOC) += snd-soc-jz4740.o | ||
8 | obj-$(CONFIG_SND_JZ4740_SOC_I2S) += snd-soc-jz4740-i2s.o | 6 | obj-$(CONFIG_SND_JZ4740_SOC_I2S) += snd-soc-jz4740-i2s.o |
9 | 7 | ||
10 | # Jz4740 Machine Support | 8 | # Jz4740 Machine Support |
diff --git a/sound/soc/sh/rcar/src.c b/sound/soc/sh/rcar/src.c index 6232b7d307aa..4d0720ed5a90 100644 --- a/sound/soc/sh/rcar/src.c +++ b/sound/soc/sh/rcar/src.c | |||
@@ -258,7 +258,7 @@ static int rsnd_src_init(struct rsnd_mod *mod, | |||
258 | { | 258 | { |
259 | struct rsnd_src *src = rsnd_mod_to_src(mod); | 259 | struct rsnd_src *src = rsnd_mod_to_src(mod); |
260 | 260 | ||
261 | clk_enable(src->clk); | 261 | clk_prepare_enable(src->clk); |
262 | 262 | ||
263 | return 0; | 263 | return 0; |
264 | } | 264 | } |
@@ -269,7 +269,7 @@ static int rsnd_src_quit(struct rsnd_mod *mod, | |||
269 | { | 269 | { |
270 | struct rsnd_src *src = rsnd_mod_to_src(mod); | 270 | struct rsnd_src *src = rsnd_mod_to_src(mod); |
271 | 271 | ||
272 | clk_disable(src->clk); | 272 | clk_disable_unprepare(src->clk); |
273 | 273 | ||
274 | return 0; | 274 | return 0; |
275 | } | 275 | } |
diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c index 4b7e20603dd7..1d8387c25bd8 100644 --- a/sound/soc/sh/rcar/ssi.c +++ b/sound/soc/sh/rcar/ssi.c | |||
@@ -171,7 +171,7 @@ static void rsnd_ssi_hw_start(struct rsnd_ssi *ssi, | |||
171 | u32 cr; | 171 | u32 cr; |
172 | 172 | ||
173 | if (0 == ssi->usrcnt) { | 173 | if (0 == ssi->usrcnt) { |
174 | clk_enable(ssi->clk); | 174 | clk_prepare_enable(ssi->clk); |
175 | 175 | ||
176 | if (rsnd_dai_is_clk_master(rdai)) { | 176 | if (rsnd_dai_is_clk_master(rdai)) { |
177 | if (rsnd_ssi_clk_from_parent(ssi)) | 177 | if (rsnd_ssi_clk_from_parent(ssi)) |
@@ -230,7 +230,7 @@ static void rsnd_ssi_hw_stop(struct rsnd_ssi *ssi, | |||
230 | rsnd_ssi_master_clk_stop(ssi); | 230 | rsnd_ssi_master_clk_stop(ssi); |
231 | } | 231 | } |
232 | 232 | ||
233 | clk_disable(ssi->clk); | 233 | clk_disable_unprepare(ssi->clk); |
234 | } | 234 | } |
235 | 235 | ||
236 | dev_dbg(dev, "ssi%d hw stopped\n", rsnd_mod_id(&ssi->mod)); | 236 | dev_dbg(dev, "ssi%d hw stopped\n", rsnd_mod_id(&ssi->mod)); |
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c index c8a780d0d057..7769b0a2bc5a 100644 --- a/sound/soc/soc-dapm.c +++ b/sound/soc/soc-dapm.c | |||
@@ -254,7 +254,6 @@ static int dapm_kcontrol_data_alloc(struct snd_soc_dapm_widget *widget, | |||
254 | static void dapm_kcontrol_free(struct snd_kcontrol *kctl) | 254 | static void dapm_kcontrol_free(struct snd_kcontrol *kctl) |
255 | { | 255 | { |
256 | struct dapm_kcontrol_data *data = snd_kcontrol_chip(kctl); | 256 | struct dapm_kcontrol_data *data = snd_kcontrol_chip(kctl); |
257 | kfree(data->widget); | ||
258 | kfree(data->wlist); | 257 | kfree(data->wlist); |
259 | kfree(data); | 258 | kfree(data); |
260 | } | 259 | } |
diff --git a/tools/lib/api/fs/debugfs.c b/tools/lib/api/fs/debugfs.c index 7c4347962353..a74fba6d7743 100644 --- a/tools/lib/api/fs/debugfs.c +++ b/tools/lib/api/fs/debugfs.c | |||
@@ -12,8 +12,8 @@ | |||
12 | char debugfs_mountpoint[PATH_MAX + 1] = "/sys/kernel/debug"; | 12 | char debugfs_mountpoint[PATH_MAX + 1] = "/sys/kernel/debug"; |
13 | 13 | ||
14 | static const char * const debugfs_known_mountpoints[] = { | 14 | static const char * const debugfs_known_mountpoints[] = { |
15 | "/sys/kernel/debug/", | 15 | "/sys/kernel/debug", |
16 | "/debug/", | 16 | "/debug", |
17 | 0, | 17 | 0, |
18 | }; | 18 | }; |
19 | 19 | ||
diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c index baec7d887da4..b83184f2d484 100644 --- a/tools/lib/traceevent/event-parse.c +++ b/tools/lib/traceevent/event-parse.c | |||
@@ -4344,6 +4344,7 @@ static void pretty_print(struct trace_seq *s, void *data, int size, struct event | |||
4344 | format, len_arg, arg); | 4344 | format, len_arg, arg); |
4345 | trace_seq_terminate(&p); | 4345 | trace_seq_terminate(&p); |
4346 | trace_seq_puts(s, p.buffer); | 4346 | trace_seq_puts(s, p.buffer); |
4347 | trace_seq_destroy(&p); | ||
4347 | arg = arg->next; | 4348 | arg = arg->next; |
4348 | break; | 4349 | break; |
4349 | default: | 4350 | default: |
diff --git a/tools/lib/traceevent/event-parse.h b/tools/lib/traceevent/event-parse.h index 791c539374c7..feab94281634 100644 --- a/tools/lib/traceevent/event-parse.h +++ b/tools/lib/traceevent/event-parse.h | |||
@@ -876,8 +876,8 @@ struct event_filter { | |||
876 | struct event_filter *pevent_filter_alloc(struct pevent *pevent); | 876 | struct event_filter *pevent_filter_alloc(struct pevent *pevent); |
877 | 877 | ||
878 | /* for backward compatibility */ | 878 | /* for backward compatibility */ |
879 | #define FILTER_NONE PEVENT_ERRNO__FILTER_NOT_FOUND | 879 | #define FILTER_NONE PEVENT_ERRNO__NO_FILTER |
880 | #define FILTER_NOEXIST PEVENT_ERRNO__NO_FILTER | 880 | #define FILTER_NOEXIST PEVENT_ERRNO__FILTER_NOT_FOUND |
881 | #define FILTER_MISS PEVENT_ERRNO__FILTER_MISS | 881 | #define FILTER_MISS PEVENT_ERRNO__FILTER_MISS |
882 | #define FILTER_MATCH PEVENT_ERRNO__FILTER_MATCH | 882 | #define FILTER_MATCH PEVENT_ERRNO__FILTER_MATCH |
883 | 883 | ||
diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf index e96923310d57..895edd32930c 100644 --- a/tools/perf/Makefile.perf +++ b/tools/perf/Makefile.perf | |||
@@ -589,7 +589,7 @@ $(GTK_OBJS): $(OUTPUT)%.o: %.c $(LIB_H) | |||
589 | $(QUIET_CC)$(CC) -o $@ -c -fPIC $(CFLAGS) $(GTK_CFLAGS) $< | 589 | $(QUIET_CC)$(CC) -o $@ -c -fPIC $(CFLAGS) $(GTK_CFLAGS) $< |
590 | 590 | ||
591 | $(OUTPUT)libperf-gtk.so: $(GTK_OBJS) $(PERFLIBS) | 591 | $(OUTPUT)libperf-gtk.so: $(GTK_OBJS) $(PERFLIBS) |
592 | $(QUIET_LINK)$(CC) -o $@ -shared $(ALL_LDFLAGS) $(filter %.o,$^) $(GTK_LIBS) | 592 | $(QUIET_LINK)$(CC) -o $@ -shared $(LDFLAGS) $(filter %.o,$^) $(GTK_LIBS) |
593 | 593 | ||
594 | $(OUTPUT)builtin-help.o: builtin-help.c $(OUTPUT)common-cmds.h $(OUTPUT)PERF-CFLAGS | 594 | $(OUTPUT)builtin-help.o: builtin-help.c $(OUTPUT)common-cmds.h $(OUTPUT)PERF-CFLAGS |
595 | $(QUIET_CC)$(CC) -o $@ -c $(CFLAGS) \ | 595 | $(QUIET_CC)$(CC) -o $@ -c $(CFLAGS) \ |
diff --git a/tools/perf/arch/x86/tests/dwarf-unwind.c b/tools/perf/arch/x86/tests/dwarf-unwind.c index b602ad93ce63..83bc2385e6d3 100644 --- a/tools/perf/arch/x86/tests/dwarf-unwind.c +++ b/tools/perf/arch/x86/tests/dwarf-unwind.c | |||
@@ -23,9 +23,10 @@ static int sample_ustack(struct perf_sample *sample, | |||
23 | 23 | ||
24 | sp = (unsigned long) regs[PERF_REG_X86_SP]; | 24 | sp = (unsigned long) regs[PERF_REG_X86_SP]; |
25 | 25 | ||
26 | map = map_groups__find(&thread->mg, MAP__FUNCTION, (u64) sp); | 26 | map = map_groups__find(&thread->mg, MAP__VARIABLE, (u64) sp); |
27 | if (!map) { | 27 | if (!map) { |
28 | pr_debug("failed to get stack map\n"); | 28 | pr_debug("failed to get stack map\n"); |
29 | free(buf); | ||
29 | return -1; | 30 | return -1; |
30 | } | 31 | } |
31 | 32 | ||
diff --git a/tools/perf/arch/x86/tests/regs_load.S b/tools/perf/arch/x86/tests/regs_load.S index 99167bf644ea..60875d5c556c 100644 --- a/tools/perf/arch/x86/tests/regs_load.S +++ b/tools/perf/arch/x86/tests/regs_load.S | |||
@@ -1,4 +1,3 @@ | |||
1 | |||
2 | #include <linux/linkage.h> | 1 | #include <linux/linkage.h> |
3 | 2 | ||
4 | #define AX 0 | 3 | #define AX 0 |
@@ -90,3 +89,10 @@ ENTRY(perf_regs_load) | |||
90 | ret | 89 | ret |
91 | ENDPROC(perf_regs_load) | 90 | ENDPROC(perf_regs_load) |
92 | #endif | 91 | #endif |
92 | |||
93 | /* | ||
94 | * We need to provide note.GNU-stack section, saying that we want | ||
95 | * NOT executable stack. Otherwise the final linking will assume that | ||
96 | * the ELF stack should not be restricted at all and set it RWX. | ||
97 | */ | ||
98 | .section .note.GNU-stack,"",@progbits | ||
diff --git a/tools/perf/config/Makefile b/tools/perf/config/Makefile index ee21fa95ebcf..802cf544202b 100644 --- a/tools/perf/config/Makefile +++ b/tools/perf/config/Makefile | |||
@@ -34,6 +34,14 @@ ifeq ($(ARCH),arm) | |||
34 | LIBUNWIND_LIBS = -lunwind -lunwind-arm | 34 | LIBUNWIND_LIBS = -lunwind -lunwind-arm |
35 | endif | 35 | endif |
36 | 36 | ||
37 | # So far there's only x86 libdw unwind support merged in perf. | ||
38 | # Disable it on all other architectures in case libdw unwind | ||
39 | # support is detected in system. Add supported architectures | ||
40 | # to the check. | ||
41 | ifneq ($(ARCH),x86) | ||
42 | NO_LIBDW_DWARF_UNWIND := 1 | ||
43 | endif | ||
44 | |||
37 | ifeq ($(LIBUNWIND_LIBS),) | 45 | ifeq ($(LIBUNWIND_LIBS),) |
38 | NO_LIBUNWIND := 1 | 46 | NO_LIBUNWIND := 1 |
39 | else | 47 | else |
@@ -109,6 +117,10 @@ CFLAGS += -Wall | |||
109 | CFLAGS += -Wextra | 117 | CFLAGS += -Wextra |
110 | CFLAGS += -std=gnu99 | 118 | CFLAGS += -std=gnu99 |
111 | 119 | ||
120 | # Enforce a non-executable stack, as we may regress (again) in the future by | ||
121 | # adding assembler files missing the .GNU-stack linker note. | ||
122 | LDFLAGS += -Wl,-z,noexecstack | ||
123 | |||
112 | EXTLIBS = -lelf -lpthread -lrt -lm -ldl | 124 | EXTLIBS = -lelf -lpthread -lrt -lm -ldl |
113 | 125 | ||
114 | ifneq ($(OUTPUT),) | 126 | ifneq ($(OUTPUT),) |
@@ -186,7 +198,10 @@ VF_FEATURE_TESTS = \ | |||
186 | stackprotector-all \ | 198 | stackprotector-all \ |
187 | timerfd \ | 199 | timerfd \ |
188 | libunwind-debug-frame \ | 200 | libunwind-debug-frame \ |
189 | bionic | 201 | bionic \ |
202 | liberty \ | ||
203 | liberty-z \ | ||
204 | cplus-demangle | ||
190 | 205 | ||
191 | # Set FEATURE_CHECK_(C|LD)FLAGS-all for all CORE_FEATURE_TESTS features. | 206 | # Set FEATURE_CHECK_(C|LD)FLAGS-all for all CORE_FEATURE_TESTS features. |
192 | # If in the future we need per-feature checks/flags for features not | 207 | # If in the future we need per-feature checks/flags for features not |
@@ -504,7 +519,21 @@ else | |||
504 | endif | 519 | endif |
505 | 520 | ||
506 | ifeq ($(feature-libbfd), 1) | 521 | ifeq ($(feature-libbfd), 1) |
507 | EXTLIBS += -lbfd -lz -liberty | 522 | EXTLIBS += -lbfd |
523 | |||
524 | # call all detections now so we get correct | ||
525 | # status in VF output | ||
526 | $(call feature_check,liberty) | ||
527 | $(call feature_check,liberty-z) | ||
528 | $(call feature_check,cplus-demangle) | ||
529 | |||
530 | ifeq ($(feature-liberty), 1) | ||
531 | EXTLIBS += -liberty | ||
532 | else | ||
533 | ifeq ($(feature-liberty-z), 1) | ||
534 | EXTLIBS += -liberty -lz | ||
535 | endif | ||
536 | endif | ||
508 | endif | 537 | endif |
509 | 538 | ||
510 | ifdef NO_DEMANGLE | 539 | ifdef NO_DEMANGLE |
@@ -515,15 +544,10 @@ else | |||
515 | CFLAGS += -DHAVE_CPLUS_DEMANGLE_SUPPORT | 544 | CFLAGS += -DHAVE_CPLUS_DEMANGLE_SUPPORT |
516 | else | 545 | else |
517 | ifneq ($(feature-libbfd), 1) | 546 | ifneq ($(feature-libbfd), 1) |
518 | $(call feature_check,liberty) | 547 | ifneq ($(feature-liberty), 1) |
519 | ifeq ($(feature-liberty), 1) | 548 | ifneq ($(feature-liberty-z), 1) |
520 | EXTLIBS += -lbfd -liberty | 549 | # we dont have neither HAVE_CPLUS_DEMANGLE_SUPPORT |
521 | else | 550 | # or any of 'bfd iberty z' trinity |
522 | $(call feature_check,liberty-z) | ||
523 | ifeq ($(feature-liberty-z), 1) | ||
524 | EXTLIBS += -lbfd -liberty -lz | ||
525 | else | ||
526 | $(call feature_check,cplus-demangle) | ||
527 | ifeq ($(feature-cplus-demangle), 1) | 551 | ifeq ($(feature-cplus-demangle), 1) |
528 | EXTLIBS += -liberty | 552 | EXTLIBS += -liberty |
529 | CFLAGS += -DHAVE_CPLUS_DEMANGLE_SUPPORT | 553 | CFLAGS += -DHAVE_CPLUS_DEMANGLE_SUPPORT |
diff --git a/tools/perf/tests/make b/tools/perf/tests/make index 5daeae1cb4c0..2f92d6e7ee00 100644 --- a/tools/perf/tests/make +++ b/tools/perf/tests/make | |||
@@ -46,6 +46,7 @@ make_install_man := install-man | |||
46 | make_install_html := install-html | 46 | make_install_html := install-html |
47 | make_install_info := install-info | 47 | make_install_info := install-info |
48 | make_install_pdf := install-pdf | 48 | make_install_pdf := install-pdf |
49 | make_static := LDFLAGS=-static | ||
49 | 50 | ||
50 | # all the NO_* variable combined | 51 | # all the NO_* variable combined |
51 | make_minimal := NO_LIBPERL=1 NO_LIBPYTHON=1 NO_NEWT=1 NO_GTK2=1 | 52 | make_minimal := NO_LIBPERL=1 NO_LIBPYTHON=1 NO_NEWT=1 NO_GTK2=1 |
@@ -87,6 +88,7 @@ run += make_install_bin | |||
87 | # run += make_install_info | 88 | # run += make_install_info |
88 | # run += make_install_pdf | 89 | # run += make_install_pdf |
89 | run += make_minimal | 90 | run += make_minimal |
91 | run += make_static | ||
90 | 92 | ||
91 | ifneq ($(call has,ctags),) | 93 | ifneq ($(call has,ctags),) |
92 | run += make_tags | 94 | run += make_tags |
diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c index a53cd0b8c151..27c2a5efe450 100644 --- a/tools/perf/util/machine.c +++ b/tools/perf/util/machine.c | |||
@@ -717,7 +717,7 @@ static char *get_kernel_version(const char *root_dir) | |||
717 | } | 717 | } |
718 | 718 | ||
719 | static int map_groups__set_modules_path_dir(struct map_groups *mg, | 719 | static int map_groups__set_modules_path_dir(struct map_groups *mg, |
720 | const char *dir_name) | 720 | const char *dir_name, int depth) |
721 | { | 721 | { |
722 | struct dirent *dent; | 722 | struct dirent *dent; |
723 | DIR *dir = opendir(dir_name); | 723 | DIR *dir = opendir(dir_name); |
@@ -742,7 +742,15 @@ static int map_groups__set_modules_path_dir(struct map_groups *mg, | |||
742 | !strcmp(dent->d_name, "..")) | 742 | !strcmp(dent->d_name, "..")) |
743 | continue; | 743 | continue; |
744 | 744 | ||
745 | ret = map_groups__set_modules_path_dir(mg, path); | 745 | /* Do not follow top-level source and build symlinks */ |
746 | if (depth == 0) { | ||
747 | if (!strcmp(dent->d_name, "source") || | ||
748 | !strcmp(dent->d_name, "build")) | ||
749 | continue; | ||
750 | } | ||
751 | |||
752 | ret = map_groups__set_modules_path_dir(mg, path, | ||
753 | depth + 1); | ||
746 | if (ret < 0) | 754 | if (ret < 0) |
747 | goto out; | 755 | goto out; |
748 | } else { | 756 | } else { |
@@ -786,11 +794,11 @@ static int machine__set_modules_path(struct machine *machine) | |||
786 | if (!version) | 794 | if (!version) |
787 | return -1; | 795 | return -1; |
788 | 796 | ||
789 | snprintf(modules_path, sizeof(modules_path), "%s/lib/modules/%s/kernel", | 797 | snprintf(modules_path, sizeof(modules_path), "%s/lib/modules/%s", |
790 | machine->root_dir, version); | 798 | machine->root_dir, version); |
791 | free(version); | 799 | free(version); |
792 | 800 | ||
793 | return map_groups__set_modules_path_dir(&machine->kmaps, modules_path); | 801 | return map_groups__set_modules_path_dir(&machine->kmaps, modules_path, 0); |
794 | } | 802 | } |
795 | 803 | ||
796 | static int machine__create_module(void *arg, const char *name, u64 start) | 804 | static int machine__create_module(void *arg, const char *name, u64 start) |
diff --git a/tools/power/acpi/Makefile b/tools/power/acpi/Makefile index d9186a2fdf06..c2c0f20067a5 100644 --- a/tools/power/acpi/Makefile +++ b/tools/power/acpi/Makefile | |||
@@ -89,15 +89,6 @@ else | |||
89 | STRIPCMD = $(STRIP) -s --remove-section=.note --remove-section=.comment | 89 | STRIPCMD = $(STRIP) -s --remove-section=.note --remove-section=.comment |
90 | endif | 90 | endif |
91 | 91 | ||
92 | # if DEBUG is enabled, then we do not strip or optimize | ||
93 | ifeq ($(strip $(DEBUG)),true) | ||
94 | CFLAGS += -O1 -g -DDEBUG | ||
95 | STRIPCMD = /bin/true -Since_we_are_debugging | ||
96 | else | ||
97 | CFLAGS += $(OPTIMIZATION) -fomit-frame-pointer | ||
98 | STRIPCMD = $(STRIP) -s --remove-section=.note --remove-section=.comment | ||
99 | endif | ||
100 | |||
101 | # --- ACPIDUMP BEGIN --- | 92 | # --- ACPIDUMP BEGIN --- |
102 | 93 | ||
103 | vpath %.c \ | 94 | vpath %.c \ |
@@ -128,7 +119,7 @@ clean: | |||
128 | -rm -f $(OUTPUT)acpidump | 119 | -rm -f $(OUTPUT)acpidump |
129 | 120 | ||
130 | install-tools: | 121 | install-tools: |
131 | $(INSTALL) -d $(DESTDIR)${bindir} | 122 | $(INSTALL) -d $(DESTDIR)${sbindir} |
132 | $(INSTALL_PROGRAM) $(OUTPUT)acpidump $(DESTDIR)${sbindir} | 123 | $(INSTALL_PROGRAM) $(OUTPUT)acpidump $(DESTDIR)${sbindir} |
133 | 124 | ||
134 | install-man: | 125 | install-man: |
diff --git a/virt/kvm/arm/vgic.c b/virt/kvm/arm/vgic.c index 47b29834a6b6..56ff9bebb577 100644 --- a/virt/kvm/arm/vgic.c +++ b/virt/kvm/arm/vgic.c | |||
@@ -548,11 +548,10 @@ static bool handle_mmio_cfg_reg(struct kvm_vcpu *vcpu, | |||
548 | u32 val; | 548 | u32 val; |
549 | u32 *reg; | 549 | u32 *reg; |
550 | 550 | ||
551 | offset >>= 1; | ||
552 | reg = vgic_bitmap_get_reg(&vcpu->kvm->arch.vgic.irq_cfg, | 551 | reg = vgic_bitmap_get_reg(&vcpu->kvm->arch.vgic.irq_cfg, |
553 | vcpu->vcpu_id, offset); | 552 | vcpu->vcpu_id, offset >> 1); |
554 | 553 | ||
555 | if (offset & 2) | 554 | if (offset & 4) |
556 | val = *reg >> 16; | 555 | val = *reg >> 16; |
557 | else | 556 | else |
558 | val = *reg & 0xffff; | 557 | val = *reg & 0xffff; |
@@ -561,13 +560,13 @@ static bool handle_mmio_cfg_reg(struct kvm_vcpu *vcpu, | |||
561 | vgic_reg_access(mmio, &val, offset, | 560 | vgic_reg_access(mmio, &val, offset, |
562 | ACCESS_READ_VALUE | ACCESS_WRITE_VALUE); | 561 | ACCESS_READ_VALUE | ACCESS_WRITE_VALUE); |
563 | if (mmio->is_write) { | 562 | if (mmio->is_write) { |
564 | if (offset < 4) { | 563 | if (offset < 8) { |
565 | *reg = ~0U; /* Force PPIs/SGIs to 1 */ | 564 | *reg = ~0U; /* Force PPIs/SGIs to 1 */ |
566 | return false; | 565 | return false; |
567 | } | 566 | } |
568 | 567 | ||
569 | val = vgic_cfg_compress(val); | 568 | val = vgic_cfg_compress(val); |
570 | if (offset & 2) { | 569 | if (offset & 4) { |
571 | *reg &= 0xffff; | 570 | *reg &= 0xffff; |
572 | *reg |= val << 16; | 571 | *reg |= val << 16; |
573 | } else { | 572 | } else { |
@@ -916,6 +915,7 @@ static void vgic_dispatch_sgi(struct kvm_vcpu *vcpu, u32 reg) | |||
916 | case 0: | 915 | case 0: |
917 | if (!target_cpus) | 916 | if (!target_cpus) |
918 | return; | 917 | return; |
918 | break; | ||
919 | 919 | ||
920 | case 1: | 920 | case 1: |
921 | target_cpus = ((1 << nrcpus) - 1) & ~(1 << vcpu_id) & 0xff; | 921 | target_cpus = ((1 << nrcpus) - 1) & ~(1 << vcpu_id) & 0xff; |
@@ -1667,10 +1667,11 @@ static int vgic_ioaddr_assign(struct kvm *kvm, phys_addr_t *ioaddr, | |||
1667 | if (addr + size < addr) | 1667 | if (addr + size < addr) |
1668 | return -EINVAL; | 1668 | return -EINVAL; |
1669 | 1669 | ||
1670 | *ioaddr = addr; | ||
1670 | ret = vgic_ioaddr_overlap(kvm); | 1671 | ret = vgic_ioaddr_overlap(kvm); |
1671 | if (ret) | 1672 | if (ret) |
1672 | return ret; | 1673 | *ioaddr = VGIC_ADDR_UNDEF; |
1673 | *ioaddr = addr; | 1674 | |
1674 | return ret; | 1675 | return ret; |
1675 | } | 1676 | } |
1676 | 1677 | ||
diff --git a/virt/kvm/assigned-dev.c b/virt/kvm/assigned-dev.c index 8db43701016f..bf06577fea51 100644 --- a/virt/kvm/assigned-dev.c +++ b/virt/kvm/assigned-dev.c | |||
@@ -395,7 +395,8 @@ static int assigned_device_enable_host_msix(struct kvm *kvm, | |||
395 | if (dev->entries_nr == 0) | 395 | if (dev->entries_nr == 0) |
396 | return r; | 396 | return r; |
397 | 397 | ||
398 | r = pci_enable_msix(dev->dev, dev->host_msix_entries, dev->entries_nr); | 398 | r = pci_enable_msix_exact(dev->dev, |
399 | dev->host_msix_entries, dev->entries_nr); | ||
399 | if (r) | 400 | if (r) |
400 | return r; | 401 | return r; |
401 | 402 | ||
diff --git a/virt/kvm/async_pf.c b/virt/kvm/async_pf.c index 10df100c4514..06e6401d6ef4 100644 --- a/virt/kvm/async_pf.c +++ b/virt/kvm/async_pf.c | |||
@@ -101,7 +101,7 @@ static void async_pf_execute(struct work_struct *work) | |||
101 | if (waitqueue_active(&vcpu->wq)) | 101 | if (waitqueue_active(&vcpu->wq)) |
102 | wake_up_interruptible(&vcpu->wq); | 102 | wake_up_interruptible(&vcpu->wq); |
103 | 103 | ||
104 | mmdrop(mm); | 104 | mmput(mm); |
105 | kvm_put_kvm(vcpu->kvm); | 105 | kvm_put_kvm(vcpu->kvm); |
106 | } | 106 | } |
107 | 107 | ||
@@ -118,7 +118,7 @@ void kvm_clear_async_pf_completion_queue(struct kvm_vcpu *vcpu) | |||
118 | flush_work(&work->work); | 118 | flush_work(&work->work); |
119 | #else | 119 | #else |
120 | if (cancel_work_sync(&work->work)) { | 120 | if (cancel_work_sync(&work->work)) { |
121 | mmdrop(work->mm); | 121 | mmput(work->mm); |
122 | kvm_put_kvm(vcpu->kvm); /* == work->vcpu->kvm */ | 122 | kvm_put_kvm(vcpu->kvm); /* == work->vcpu->kvm */ |
123 | kmem_cache_free(async_pf_cache, work); | 123 | kmem_cache_free(async_pf_cache, work); |
124 | } | 124 | } |
@@ -183,7 +183,7 @@ int kvm_setup_async_pf(struct kvm_vcpu *vcpu, gva_t gva, unsigned long hva, | |||
183 | work->addr = hva; | 183 | work->addr = hva; |
184 | work->arch = *arch; | 184 | work->arch = *arch; |
185 | work->mm = current->mm; | 185 | work->mm = current->mm; |
186 | atomic_inc(&work->mm->mm_count); | 186 | atomic_inc(&work->mm->mm_users); |
187 | kvm_get_kvm(work->vcpu->kvm); | 187 | kvm_get_kvm(work->vcpu->kvm); |
188 | 188 | ||
189 | /* this can't really happen otherwise gfn_to_pfn_async | 189 | /* this can't really happen otherwise gfn_to_pfn_async |
@@ -201,7 +201,7 @@ int kvm_setup_async_pf(struct kvm_vcpu *vcpu, gva_t gva, unsigned long hva, | |||
201 | return 1; | 201 | return 1; |
202 | retry_sync: | 202 | retry_sync: |
203 | kvm_put_kvm(work->vcpu->kvm); | 203 | kvm_put_kvm(work->vcpu->kvm); |
204 | mmdrop(work->mm); | 204 | mmput(work->mm); |
205 | kmem_cache_free(async_pf_cache, work); | 205 | kmem_cache_free(async_pf_cache, work); |
206 | return 0; | 206 | return 0; |
207 | } | 207 | } |