diff options
199 files changed, 1905 insertions, 1252 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index ab438cb5af55..9916e4d206a3 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 |
| @@ -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..07f283c20eb1 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 | */ |
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/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/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/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/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/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/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/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/um/include/shared/os.h b/arch/um/include/shared/os.h index 75298d3358e7..08eec0b691b0 100644 --- a/arch/um/include/shared/os.h +++ b/arch/um/include/shared/os.h | |||
| @@ -136,6 +136,7 @@ extern int os_ioctl_generic(int fd, unsigned int cmd, unsigned long arg); | |||
| 136 | extern int os_get_ifname(int fd, char *namebuf); | 136 | extern int os_get_ifname(int fd, char *namebuf); |
| 137 | extern int os_set_slip(int fd); | 137 | extern int os_set_slip(int fd); |
| 138 | extern int os_mode_fd(int fd, int mode); | 138 | extern int os_mode_fd(int fd, int mode); |
| 139 | extern int os_fsync_file(int fd); | ||
| 139 | 140 | ||
| 140 | extern int os_seek_file(int fd, unsigned long long offset); | 141 | extern int os_seek_file(int fd, unsigned long long offset); |
| 141 | extern int os_open_file(const char *file, struct openflags flags, int mode); | 142 | extern int os_open_file(const char *file, struct openflags flags, int mode); |
diff --git a/arch/um/kernel/physmem.c b/arch/um/kernel/physmem.c index f116db15d402..30fdd5d0067b 100644 --- a/arch/um/kernel/physmem.c +++ b/arch/um/kernel/physmem.c | |||
| @@ -103,6 +103,7 @@ void __init setup_physmem(unsigned long start, unsigned long reserve_end, | |||
| 103 | */ | 103 | */ |
| 104 | os_seek_file(physmem_fd, __pa(&__syscall_stub_start)); | 104 | os_seek_file(physmem_fd, __pa(&__syscall_stub_start)); |
| 105 | os_write_file(physmem_fd, &__syscall_stub_start, PAGE_SIZE); | 105 | os_write_file(physmem_fd, &__syscall_stub_start, PAGE_SIZE); |
| 106 | os_fsync_file(physmem_fd); | ||
| 106 | 107 | ||
| 107 | bootmap_size = init_bootmem(pfn, pfn + delta); | 108 | bootmap_size = init_bootmem(pfn, pfn + delta); |
| 108 | free_bootmem(__pa(reserve_end) + bootmap_size, | 109 | free_bootmem(__pa(reserve_end) + bootmap_size, |
diff --git a/arch/um/os-Linux/file.c b/arch/um/os-Linux/file.c index 07a750197bb0..08d90fba952c 100644 --- a/arch/um/os-Linux/file.c +++ b/arch/um/os-Linux/file.c | |||
| @@ -237,6 +237,12 @@ void os_close_file(int fd) | |||
| 237 | { | 237 | { |
| 238 | close(fd); | 238 | close(fd); |
| 239 | } | 239 | } |
| 240 | int os_fsync_file(int fd) | ||
| 241 | { | ||
| 242 | if (fsync(fd) < 0) | ||
| 243 | return -errno; | ||
| 244 | return 0; | ||
| 245 | } | ||
| 240 | 246 | ||
| 241 | int os_seek_file(int fd, unsigned long long offset) | 247 | int os_seek_file(int fd, unsigned long long offset) |
| 242 | { | 248 | { |
diff --git a/arch/um/os-Linux/main.c b/arch/um/os-Linux/main.c index e1704ff600ff..df9191acd926 100644 --- a/arch/um/os-Linux/main.c +++ b/arch/um/os-Linux/main.c | |||
| @@ -151,6 +151,7 @@ int __init main(int argc, char **argv, char **envp) | |||
| 151 | #endif | 151 | #endif |
| 152 | 152 | ||
| 153 | do_uml_initcalls(); | 153 | do_uml_initcalls(); |
| 154 | change_sig(SIGPIPE, 0); | ||
| 154 | ret = linux_main(argc, argv); | 155 | ret = linux_main(argc, argv); |
| 155 | 156 | ||
| 156 | /* | 157 | /* |
diff --git a/arch/um/os-Linux/mem.c b/arch/um/os-Linux/mem.c index 3c4af77e51a2..897e9ad0c108 100644 --- a/arch/um/os-Linux/mem.c +++ b/arch/um/os-Linux/mem.c | |||
| @@ -12,337 +12,117 @@ | |||
| 12 | #include <string.h> | 12 | #include <string.h> |
| 13 | #include <sys/stat.h> | 13 | #include <sys/stat.h> |
| 14 | #include <sys/mman.h> | 14 | #include <sys/mman.h> |
| 15 | #include <sys/param.h> | 15 | #include <sys/vfs.h> |
| 16 | #include <linux/magic.h> | ||
| 16 | #include <init.h> | 17 | #include <init.h> |
| 17 | #include <os.h> | 18 | #include <os.h> |
| 18 | 19 | ||
| 19 | /* Modified by which_tmpdir, which is called during early boot */ | 20 | /* Set by make_tempfile() during early boot. */ |
| 20 | static char *default_tmpdir = "/tmp"; | ||
| 21 | |||
| 22 | /* | ||
| 23 | * Modified when creating the physical memory file and when checking | ||
| 24 | * the tmp filesystem for usability, both happening during early boot. | ||
| 25 | */ | ||
| 26 | static char *tempdir = NULL; | 21 | static char *tempdir = NULL; |
| 27 | 22 | ||
| 28 | static void __init find_tempdir(void) | 23 | /* Check if dir is on tmpfs. Return 0 if yes, -1 if no or error. */ |
| 24 | static int __init check_tmpfs(const char *dir) | ||
| 29 | { | 25 | { |
| 30 | const char *dirs[] = { "TMP", "TEMP", "TMPDIR", NULL }; | 26 | struct statfs st; |
| 31 | int i; | ||
| 32 | char *dir = NULL; | ||
| 33 | |||
| 34 | if (tempdir != NULL) | ||
| 35 | /* We've already been called */ | ||
| 36 | return; | ||
| 37 | for (i = 0; dirs[i]; i++) { | ||
| 38 | dir = getenv(dirs[i]); | ||
| 39 | if ((dir != NULL) && (*dir != '\0')) | ||
| 40 | break; | ||
| 41 | } | ||
| 42 | if ((dir == NULL) || (*dir == '\0')) | ||
| 43 | dir = default_tmpdir; | ||
| 44 | 27 | ||
| 45 | tempdir = malloc(strlen(dir) + 2); | 28 | printf("Checking if %s is on tmpfs...", dir); |
| 46 | if (tempdir == NULL) { | 29 | if (statfs(dir, &st) < 0) { |
| 47 | fprintf(stderr, "Failed to malloc tempdir, " | 30 | printf("%s\n", strerror(errno)); |
| 48 | "errno = %d\n", errno); | 31 | } else if (st.f_type != TMPFS_MAGIC) { |
| 49 | return; | 32 | printf("no\n"); |
| 50 | } | 33 | } else { |
| 51 | strcpy(tempdir, dir); | 34 | printf("OK\n"); |
| 52 | strcat(tempdir, "/"); | 35 | return 0; |
| 53 | } | ||
| 54 | |||
| 55 | /* | ||
| 56 | * Remove bytes from the front of the buffer and refill it so that if there's a | ||
| 57 | * partial string that we care about, it will be completed, and we can recognize | ||
| 58 | * it. | ||
| 59 | */ | ||
| 60 | static int pop(int fd, char *buf, size_t size, size_t npop) | ||
| 61 | { | ||
| 62 | ssize_t n; | ||
| 63 | size_t len = strlen(&buf[npop]); | ||
| 64 | |||
| 65 | memmove(buf, &buf[npop], len + 1); | ||
| 66 | n = read(fd, &buf[len], size - len - 1); | ||
| 67 | if (n < 0) | ||
| 68 | return -errno; | ||
| 69 | |||
| 70 | buf[len + n] = '\0'; | ||
| 71 | return 1; | ||
| 72 | } | ||
| 73 | |||
| 74 | /* | ||
| 75 | * This will return 1, with the first character in buf being the | ||
| 76 | * character following the next instance of c in the file. This will | ||
| 77 | * read the file as needed. If there's an error, -errno is returned; | ||
| 78 | * if the end of the file is reached, 0 is returned. | ||
| 79 | */ | ||
| 80 | static int next(int fd, char *buf, size_t size, char c) | ||
| 81 | { | ||
| 82 | ssize_t n; | ||
| 83 | char *ptr; | ||
| 84 | |||
| 85 | while ((ptr = strchr(buf, c)) == NULL) { | ||
| 86 | n = read(fd, buf, size - 1); | ||
| 87 | if (n == 0) | ||
| 88 | return 0; | ||
| 89 | else if (n < 0) | ||
| 90 | return -errno; | ||
| 91 | |||
| 92 | buf[n] = '\0'; | ||
| 93 | } | 36 | } |
| 94 | 37 | return -1; | |
| 95 | return pop(fd, buf, size, ptr - buf + 1); | ||
| 96 | } | 38 | } |
| 97 | 39 | ||
| 98 | /* | 40 | /* |
| 99 | * Decode an octal-escaped and space-terminated path of the form used by | 41 | * Choose the tempdir to use. We want something on tmpfs so that our memory is |
| 100 | * /proc/mounts. May be used to decode a path in-place. "out" must be at least | 42 | * not subject to the host's vm.dirty_ratio. If a tempdir is specified in the |
| 101 | * as large as the input. The output is always null-terminated. "len" gets the | 43 | * environment, we use that even if it's not on tmpfs, but we warn the user. |
| 102 | * length of the output, excluding the trailing null. Returns 0 if a full path | 44 | * Otherwise, we try common tmpfs locations, and if no tmpfs directory is found |
| 103 | * was successfully decoded, otherwise an error. | 45 | * then we fall back to /tmp. |
| 104 | */ | 46 | */ |
| 105 | static int decode_path(const char *in, char *out, size_t *len) | 47 | static char * __init choose_tempdir(void) |
| 106 | { | 48 | { |
| 107 | char *first = out; | 49 | static const char * const vars[] = { |
| 108 | int c; | 50 | "TMPDIR", |
| 51 | "TMP", | ||
| 52 | "TEMP", | ||
| 53 | NULL | ||
| 54 | }; | ||
| 55 | static const char fallback_dir[] = "/tmp"; | ||
| 56 | static const char * const tmpfs_dirs[] = { | ||
| 57 | "/dev/shm", | ||
| 58 | fallback_dir, | ||
| 59 | NULL | ||
| 60 | }; | ||
| 109 | int i; | 61 | int i; |
| 110 | int ret = -EINVAL; | 62 | const char *dir; |
| 111 | while (1) { | 63 | |
| 112 | switch (*in) { | 64 | printf("Checking environment variables for a tempdir..."); |
| 113 | case '\0': | 65 | for (i = 0; vars[i]; i++) { |
| 114 | goto out; | 66 | dir = getenv(vars[i]); |
| 115 | 67 | if ((dir != NULL) && (*dir != '\0')) { | |
| 116 | case ' ': | 68 | printf("%s\n", dir); |
| 117 | ret = 0; | 69 | if (check_tmpfs(dir) >= 0) |
| 118 | goto out; | 70 | goto done; |
| 119 | 71 | else | |
| 120 | case '\\': | 72 | goto warn; |
| 121 | in++; | ||
| 122 | c = 0; | ||
| 123 | for (i = 0; i < 3; i++) { | ||
| 124 | if (*in < '0' || *in > '7') | ||
| 125 | goto out; | ||
| 126 | c = (c << 3) | (*in++ - '0'); | ||
| 127 | } | ||
| 128 | *(unsigned char *)out++ = (unsigned char) c; | ||
| 129 | break; | ||
| 130 | |||
| 131 | default: | ||
| 132 | *out++ = *in++; | ||
| 133 | break; | ||
| 134 | } | 73 | } |
| 135 | } | 74 | } |
| 75 | printf("none found\n"); | ||
| 136 | 76 | ||
| 137 | out: | 77 | for (i = 0; tmpfs_dirs[i]; i++) { |
| 138 | *out = '\0'; | 78 | dir = tmpfs_dirs[i]; |
| 139 | *len = out - first; | 79 | if (check_tmpfs(dir) >= 0) |
| 140 | return ret; | 80 | goto done; |
| 141 | } | ||
| 142 | |||
| 143 | /* | ||
| 144 | * Computes the length of s when encoded with three-digit octal escape sequences | ||
| 145 | * for the characters in chars. | ||
| 146 | */ | ||
| 147 | static size_t octal_encoded_length(const char *s, const char *chars) | ||
| 148 | { | ||
| 149 | size_t len = strlen(s); | ||
| 150 | while ((s = strpbrk(s, chars)) != NULL) { | ||
| 151 | len += 3; | ||
| 152 | s++; | ||
| 153 | } | ||
| 154 | |||
| 155 | return len; | ||
| 156 | } | ||
| 157 | |||
| 158 | enum { | ||
| 159 | OUTCOME_NOTHING_MOUNTED, | ||
| 160 | OUTCOME_TMPFS_MOUNT, | ||
| 161 | OUTCOME_NON_TMPFS_MOUNT, | ||
| 162 | }; | ||
| 163 | |||
| 164 | /* Read a line of /proc/mounts data looking for a tmpfs mount at "path". */ | ||
| 165 | static int read_mount(int fd, char *buf, size_t bufsize, const char *path, | ||
| 166 | int *outcome) | ||
| 167 | { | ||
| 168 | int found; | ||
| 169 | int match; | ||
| 170 | char *space; | ||
| 171 | size_t len; | ||
| 172 | |||
| 173 | enum { | ||
| 174 | MATCH_NONE, | ||
| 175 | MATCH_EXACT, | ||
| 176 | MATCH_PARENT, | ||
| 177 | }; | ||
| 178 | |||
| 179 | found = next(fd, buf, bufsize, ' '); | ||
| 180 | if (found != 1) | ||
| 181 | return found; | ||
| 182 | |||
| 183 | /* | ||
| 184 | * If there's no following space in the buffer, then this path is | ||
| 185 | * truncated, so it can't be the one we're looking for. | ||
| 186 | */ | ||
| 187 | space = strchr(buf, ' '); | ||
| 188 | if (space) { | ||
| 189 | match = MATCH_NONE; | ||
| 190 | if (!decode_path(buf, buf, &len)) { | ||
| 191 | if (!strcmp(buf, path)) | ||
| 192 | match = MATCH_EXACT; | ||
| 193 | else if (!strncmp(buf, path, len) | ||
| 194 | && (path[len] == '/' || !strcmp(buf, "/"))) | ||
| 195 | match = MATCH_PARENT; | ||
| 196 | } | ||
| 197 | |||
| 198 | found = pop(fd, buf, bufsize, space - buf + 1); | ||
| 199 | if (found != 1) | ||
| 200 | return found; | ||
| 201 | |||
| 202 | switch (match) { | ||
| 203 | case MATCH_EXACT: | ||
| 204 | if (!strncmp(buf, "tmpfs", strlen("tmpfs"))) | ||
| 205 | *outcome = OUTCOME_TMPFS_MOUNT; | ||
| 206 | else | ||
| 207 | *outcome = OUTCOME_NON_TMPFS_MOUNT; | ||
| 208 | break; | ||
| 209 | |||
| 210 | case MATCH_PARENT: | ||
| 211 | /* This mount obscures any previous ones. */ | ||
| 212 | *outcome = OUTCOME_NOTHING_MOUNTED; | ||
| 213 | break; | ||
| 214 | } | ||
| 215 | } | 81 | } |
| 216 | 82 | ||
| 217 | return next(fd, buf, bufsize, '\n'); | 83 | dir = fallback_dir; |
| 84 | warn: | ||
| 85 | printf("Warning: tempdir %s is not on tmpfs\n", dir); | ||
| 86 | done: | ||
| 87 | /* Make a copy since getenv results may not remain valid forever. */ | ||
| 88 | return strdup(dir); | ||
| 218 | } | 89 | } |
| 219 | 90 | ||
| 220 | /* which_tmpdir is called only during early boot */ | ||
| 221 | static int checked_tmpdir = 0; | ||
| 222 | |||
| 223 | /* | 91 | /* |
| 224 | * Look for a tmpfs mounted at /dev/shm. I couldn't find a cleaner | 92 | * Create an unlinked tempfile in a suitable tempdir. template must be the |
| 225 | * way to do this than to parse /proc/mounts. statfs will return the | 93 | * basename part of the template with a leading '/'. |
| 226 | * same filesystem magic number and fs id for both /dev and /dev/shm | ||
| 227 | * when they are both tmpfs, so you can't tell if they are different | ||
| 228 | * filesystems. Also, there seems to be no other way of finding the | ||
| 229 | * mount point of a filesystem from within it. | ||
| 230 | * | ||
| 231 | * If a /dev/shm tmpfs entry is found, then we switch to using it. | ||
| 232 | * Otherwise, we stay with the default /tmp. | ||
| 233 | */ | 94 | */ |
| 234 | static void which_tmpdir(void) | 95 | static int __init make_tempfile(const char *template) |
| 235 | { | 96 | { |
| 97 | char *tempname; | ||
| 236 | int fd; | 98 | int fd; |
| 237 | int found; | ||
| 238 | int outcome; | ||
| 239 | char *path; | ||
| 240 | char *buf; | ||
| 241 | size_t bufsize; | ||
| 242 | 99 | ||
| 243 | if (checked_tmpdir) | 100 | if (tempdir == NULL) { |
| 244 | return; | 101 | tempdir = choose_tempdir(); |
| 245 | 102 | if (tempdir == NULL) { | |
| 246 | checked_tmpdir = 1; | 103 | fprintf(stderr, "Failed to choose tempdir: %s\n", |
| 247 | 104 | strerror(errno)); | |
| 248 | printf("Checking for tmpfs mount on /dev/shm..."); | 105 | return -1; |
| 249 | |||
| 250 | path = realpath("/dev/shm", NULL); | ||
| 251 | if (!path) { | ||
| 252 | printf("failed to check real path, errno = %d\n", errno); | ||
| 253 | return; | ||
| 254 | } | ||
| 255 | printf("%s...", path); | ||
| 256 | |||
| 257 | /* | ||
| 258 | * The buffer needs to be able to fit the full octal-escaped path, a | ||
| 259 | * space, and a trailing null in order to successfully decode it. | ||
| 260 | */ | ||
| 261 | bufsize = octal_encoded_length(path, " \t\n\\") + 2; | ||
| 262 | |||
| 263 | if (bufsize < 128) | ||
| 264 | bufsize = 128; | ||
| 265 | |||
| 266 | buf = malloc(bufsize); | ||
| 267 | if (!buf) { | ||
| 268 | printf("malloc failed, errno = %d\n", errno); | ||
| 269 | goto out; | ||
| 270 | } | ||
| 271 | buf[0] = '\0'; | ||
| 272 | |||
| 273 | fd = open("/proc/mounts", O_RDONLY); | ||
| 274 | if (fd < 0) { | ||
| 275 | printf("failed to open /proc/mounts, errno = %d\n", errno); | ||
| 276 | goto out1; | ||
| 277 | } | ||
| 278 | |||
| 279 | outcome = OUTCOME_NOTHING_MOUNTED; | ||
| 280 | while (1) { | ||
| 281 | found = read_mount(fd, buf, bufsize, path, &outcome); | ||
| 282 | if (found != 1) | ||
| 283 | break; | ||
| 284 | } | ||
| 285 | |||
| 286 | if (found < 0) { | ||
| 287 | printf("read returned errno %d\n", -found); | ||
| 288 | } else { | ||
| 289 | switch (outcome) { | ||
| 290 | case OUTCOME_TMPFS_MOUNT: | ||
| 291 | printf("OK\n"); | ||
| 292 | default_tmpdir = "/dev/shm"; | ||
| 293 | break; | ||
| 294 | |||
| 295 | case OUTCOME_NON_TMPFS_MOUNT: | ||
| 296 | printf("not tmpfs\n"); | ||
| 297 | break; | ||
| 298 | |||
| 299 | default: | ||
| 300 | printf("nothing mounted on /dev/shm\n"); | ||
| 301 | break; | ||
| 302 | } | 106 | } |
| 303 | } | 107 | } |
| 304 | 108 | ||
| 305 | close(fd); | 109 | tempname = malloc(strlen(tempdir) + strlen(template) + 1); |
| 306 | out1: | ||
| 307 | free(buf); | ||
| 308 | out: | ||
| 309 | free(path); | ||
| 310 | } | ||
| 311 | |||
| 312 | static int __init make_tempfile(const char *template, char **out_tempname, | ||
| 313 | int do_unlink) | ||
| 314 | { | ||
| 315 | char *tempname; | ||
| 316 | int fd; | ||
| 317 | |||
| 318 | which_tmpdir(); | ||
| 319 | tempname = malloc(MAXPATHLEN); | ||
| 320 | if (tempname == NULL) | 110 | if (tempname == NULL) |
| 321 | return -1; | 111 | return -1; |
| 322 | 112 | ||
| 323 | find_tempdir(); | 113 | strcpy(tempname, tempdir); |
| 324 | if ((tempdir == NULL) || (strlen(tempdir) >= MAXPATHLEN)) | 114 | strcat(tempname, template); |
| 325 | goto out; | ||
| 326 | |||
| 327 | if (template[0] != '/') | ||
| 328 | strcpy(tempname, tempdir); | ||
| 329 | else | ||
| 330 | tempname[0] = '\0'; | ||
| 331 | strncat(tempname, template, MAXPATHLEN-1-strlen(tempname)); | ||
| 332 | fd = mkstemp(tempname); | 115 | fd = mkstemp(tempname); |
| 333 | if (fd < 0) { | 116 | if (fd < 0) { |
| 334 | fprintf(stderr, "open - cannot create %s: %s\n", tempname, | 117 | fprintf(stderr, "open - cannot create %s: %s\n", tempname, |
| 335 | strerror(errno)); | 118 | strerror(errno)); |
| 336 | goto out; | 119 | goto out; |
| 337 | } | 120 | } |
| 338 | if (do_unlink && (unlink(tempname) < 0)) { | 121 | if (unlink(tempname) < 0) { |
| 339 | perror("unlink"); | 122 | perror("unlink"); |
| 340 | goto close; | 123 | goto close; |
| 341 | } | 124 | } |
| 342 | if (out_tempname) { | 125 | free(tempname); |
| 343 | *out_tempname = tempname; | ||
| 344 | } else | ||
| 345 | free(tempname); | ||
| 346 | return fd; | 126 | return fd; |
| 347 | close: | 127 | close: |
| 348 | close(fd); | 128 | close(fd); |
| @@ -351,14 +131,14 @@ out: | |||
| 351 | return -1; | 131 | return -1; |
| 352 | } | 132 | } |
| 353 | 133 | ||
| 354 | #define TEMPNAME_TEMPLATE "vm_file-XXXXXX" | 134 | #define TEMPNAME_TEMPLATE "/vm_file-XXXXXX" |
| 355 | 135 | ||
| 356 | static int __init create_tmp_file(unsigned long long len) | 136 | static int __init create_tmp_file(unsigned long long len) |
| 357 | { | 137 | { |
| 358 | int fd, err; | 138 | int fd, err; |
| 359 | char zero; | 139 | char zero; |
| 360 | 140 | ||
| 361 | fd = make_tempfile(TEMPNAME_TEMPLATE, NULL, 1); | 141 | fd = make_tempfile(TEMPNAME_TEMPLATE); |
| 362 | if (fd < 0) | 142 | if (fd < 0) |
| 363 | exit(1); | 143 | exit(1); |
| 364 | 144 | ||
| @@ -402,7 +182,6 @@ int __init create_mem_file(unsigned long long len) | |||
| 402 | return fd; | 182 | return fd; |
| 403 | } | 183 | } |
| 404 | 184 | ||
| 405 | |||
| 406 | void __init check_tmpexec(void) | 185 | void __init check_tmpexec(void) |
| 407 | { | 186 | { |
| 408 | void *addr; | 187 | void *addr; |
| @@ -410,14 +189,13 @@ void __init check_tmpexec(void) | |||
| 410 | 189 | ||
| 411 | addr = mmap(NULL, UM_KERN_PAGE_SIZE, | 190 | addr = mmap(NULL, UM_KERN_PAGE_SIZE, |
| 412 | PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE, fd, 0); | 191 | PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE, fd, 0); |
| 413 | printf("Checking PROT_EXEC mmap in %s...",tempdir); | 192 | printf("Checking PROT_EXEC mmap in %s...", tempdir); |
| 414 | fflush(stdout); | ||
| 415 | if (addr == MAP_FAILED) { | 193 | if (addr == MAP_FAILED) { |
| 416 | err = errno; | 194 | err = errno; |
| 417 | perror("failed"); | 195 | printf("%s\n", strerror(err)); |
| 418 | close(fd); | 196 | close(fd); |
| 419 | if (err == EPERM) | 197 | if (err == EPERM) |
| 420 | printf("%s must be not mounted noexec\n",tempdir); | 198 | printf("%s must be not mounted noexec\n", tempdir); |
| 421 | exit(1); | 199 | exit(1); |
| 422 | } | 200 | } |
| 423 | printf("OK\n"); | 201 | printf("OK\n"); |
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/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/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/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/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/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/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/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/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/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 | /** |
diff --git a/fs/ceph/file.c b/fs/ceph/file.c index 39da1c2efa50..88a6df4cbe6d 100644 --- a/fs/ceph/file.c +++ b/fs/ceph/file.c | |||
| @@ -1221,9 +1221,6 @@ static long ceph_fallocate(struct file *file, int mode, | |||
| 1221 | if (!S_ISREG(inode->i_mode)) | 1221 | if (!S_ISREG(inode->i_mode)) |
| 1222 | return -EOPNOTSUPP; | 1222 | return -EOPNOTSUPP; |
| 1223 | 1223 | ||
| 1224 | if (IS_SWAPFILE(inode)) | ||
| 1225 | return -ETXTBSY; | ||
| 1226 | |||
| 1227 | mutex_lock(&inode->i_mutex); | 1224 | mutex_lock(&inode->i_mutex); |
| 1228 | 1225 | ||
| 1229 | if (ceph_snap(inode) != CEPH_NOSNAP) { | 1226 | if (ceph_snap(inode) != CEPH_NOSNAP) { |
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/ext4/balloc.c b/fs/ext4/balloc.c index 6ea7b1436bbc..5c56785007e0 100644 --- a/fs/ext4/balloc.c +++ b/fs/ext4/balloc.c | |||
| @@ -667,7 +667,7 @@ ext4_fsblk_t ext4_count_free_clusters(struct super_block *sb) | |||
| 667 | continue; | 667 | continue; |
| 668 | 668 | ||
| 669 | x = ext4_count_free(bitmap_bh->b_data, | 669 | x = ext4_count_free(bitmap_bh->b_data, |
| 670 | EXT4_BLOCKS_PER_GROUP(sb) / 8); | 670 | EXT4_CLUSTERS_PER_GROUP(sb) / 8); |
| 671 | printk(KERN_DEBUG "group %u: stored = %d, counted = %u\n", | 671 | printk(KERN_DEBUG "group %u: stored = %d, counted = %u\n", |
| 672 | i, ext4_free_group_clusters(sb, gdp), x); | 672 | i, ext4_free_group_clusters(sb, gdp), x); |
| 673 | bitmap_count += x; | 673 | bitmap_count += x; |
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index f1c65dc7cc0a..66946aa62127 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h | |||
| @@ -2466,23 +2466,6 @@ static inline void ext4_update_i_disksize(struct inode *inode, loff_t newsize) | |||
| 2466 | up_write(&EXT4_I(inode)->i_data_sem); | 2466 | up_write(&EXT4_I(inode)->i_data_sem); |
| 2467 | } | 2467 | } |
| 2468 | 2468 | ||
| 2469 | /* | ||
| 2470 | * Update i_disksize after writeback has been started. Races with truncate | ||
| 2471 | * are avoided by checking i_size under i_data_sem. | ||
| 2472 | */ | ||
| 2473 | static inline void ext4_wb_update_i_disksize(struct inode *inode, loff_t newsize) | ||
| 2474 | { | ||
| 2475 | loff_t i_size; | ||
| 2476 | |||
| 2477 | down_write(&EXT4_I(inode)->i_data_sem); | ||
| 2478 | i_size = i_size_read(inode); | ||
| 2479 | if (newsize > i_size) | ||
| 2480 | newsize = i_size; | ||
| 2481 | if (newsize > EXT4_I(inode)->i_disksize) | ||
| 2482 | EXT4_I(inode)->i_disksize = newsize; | ||
| 2483 | up_write(&EXT4_I(inode)->i_data_sem); | ||
| 2484 | } | ||
| 2485 | |||
| 2486 | struct ext4_group_info { | 2469 | struct ext4_group_info { |
| 2487 | unsigned long bb_state; | 2470 | unsigned long bb_state; |
| 2488 | struct rb_root bb_free_root; | 2471 | struct rb_root bb_free_root; |
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 82df3ce9874a..01b0c208f625 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c | |||
| @@ -3313,6 +3313,11 @@ static int ext4_split_extent(handle_t *handle, | |||
| 3313 | return PTR_ERR(path); | 3313 | return PTR_ERR(path); |
| 3314 | depth = ext_depth(inode); | 3314 | depth = ext_depth(inode); |
| 3315 | ex = path[depth].p_ext; | 3315 | ex = path[depth].p_ext; |
| 3316 | if (!ex) { | ||
| 3317 | EXT4_ERROR_INODE(inode, "unexpected hole at %lu", | ||
| 3318 | (unsigned long) map->m_lblk); | ||
| 3319 | return -EIO; | ||
| 3320 | } | ||
| 3316 | uninitialized = ext4_ext_is_uninitialized(ex); | 3321 | uninitialized = ext4_ext_is_uninitialized(ex); |
| 3317 | split_flag1 = 0; | 3322 | split_flag1 = 0; |
| 3318 | 3323 | ||
| @@ -3694,6 +3699,12 @@ static int ext4_convert_initialized_extents(handle_t *handle, | |||
| 3694 | } | 3699 | } |
| 3695 | depth = ext_depth(inode); | 3700 | depth = ext_depth(inode); |
| 3696 | ex = path[depth].p_ext; | 3701 | ex = path[depth].p_ext; |
| 3702 | if (!ex) { | ||
| 3703 | EXT4_ERROR_INODE(inode, "unexpected hole at %lu", | ||
| 3704 | (unsigned long) map->m_lblk); | ||
| 3705 | err = -EIO; | ||
| 3706 | goto out; | ||
| 3707 | } | ||
| 3697 | } | 3708 | } |
| 3698 | 3709 | ||
| 3699 | err = ext4_ext_get_access(handle, inode, path + depth); | 3710 | err = ext4_ext_get_access(handle, inode, path + depth); |
| @@ -4730,6 +4741,9 @@ static long ext4_zero_range(struct file *file, loff_t offset, | |||
| 4730 | 4741 | ||
| 4731 | trace_ext4_zero_range(inode, offset, len, mode); | 4742 | trace_ext4_zero_range(inode, offset, len, mode); |
| 4732 | 4743 | ||
| 4744 | if (!S_ISREG(inode->i_mode)) | ||
| 4745 | return -EINVAL; | ||
| 4746 | |||
| 4733 | /* | 4747 | /* |
| 4734 | * Write out all dirty pages to avoid race conditions | 4748 | * Write out all dirty pages to avoid race conditions |
| 4735 | * Then release them. | 4749 | * Then release them. |
| @@ -4878,9 +4892,6 @@ long ext4_fallocate(struct file *file, int mode, loff_t offset, loff_t len) | |||
| 4878 | if (mode & FALLOC_FL_PUNCH_HOLE) | 4892 | if (mode & FALLOC_FL_PUNCH_HOLE) |
| 4879 | return ext4_punch_hole(inode, offset, len); | 4893 | return ext4_punch_hole(inode, offset, len); |
| 4880 | 4894 | ||
| 4881 | if (mode & FALLOC_FL_COLLAPSE_RANGE) | ||
| 4882 | return ext4_collapse_range(inode, offset, len); | ||
| 4883 | |||
| 4884 | ret = ext4_convert_inline_data(inode); | 4895 | ret = ext4_convert_inline_data(inode); |
| 4885 | if (ret) | 4896 | if (ret) |
| 4886 | return ret; | 4897 | return ret; |
| @@ -4892,6 +4903,9 @@ long ext4_fallocate(struct file *file, int mode, loff_t offset, loff_t len) | |||
| 4892 | if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) | 4903 | if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) |
| 4893 | return -EOPNOTSUPP; | 4904 | return -EOPNOTSUPP; |
| 4894 | 4905 | ||
| 4906 | if (mode & FALLOC_FL_COLLAPSE_RANGE) | ||
| 4907 | return ext4_collapse_range(inode, offset, len); | ||
| 4908 | |||
| 4895 | if (mode & FALLOC_FL_ZERO_RANGE) | 4909 | if (mode & FALLOC_FL_ZERO_RANGE) |
| 4896 | return ext4_zero_range(file, offset, len, mode); | 4910 | return ext4_zero_range(file, offset, len, mode); |
| 4897 | 4911 | ||
| @@ -5229,18 +5243,19 @@ ext4_ext_shift_path_extents(struct ext4_ext_path *path, ext4_lblk_t shift, | |||
| 5229 | if (ex_start == EXT_FIRST_EXTENT(path[depth].p_hdr)) | 5243 | if (ex_start == EXT_FIRST_EXTENT(path[depth].p_hdr)) |
| 5230 | update = 1; | 5244 | update = 1; |
| 5231 | 5245 | ||
| 5232 | *start = ex_last->ee_block + | 5246 | *start = le32_to_cpu(ex_last->ee_block) + |
| 5233 | ext4_ext_get_actual_len(ex_last); | 5247 | ext4_ext_get_actual_len(ex_last); |
| 5234 | 5248 | ||
| 5235 | while (ex_start <= ex_last) { | 5249 | while (ex_start <= ex_last) { |
| 5236 | ex_start->ee_block -= shift; | 5250 | le32_add_cpu(&ex_start->ee_block, -shift); |
| 5237 | if (ex_start > | 5251 | /* Try to merge to the left. */ |
| 5238 | EXT_FIRST_EXTENT(path[depth].p_hdr)) { | 5252 | if ((ex_start > |
| 5239 | if (ext4_ext_try_to_merge_right(inode, | 5253 | EXT_FIRST_EXTENT(path[depth].p_hdr)) && |
| 5240 | path, ex_start - 1)) | 5254 | ext4_ext_try_to_merge_right(inode, |
| 5241 | ex_last--; | 5255 | path, ex_start - 1)) |
| 5242 | } | 5256 | ex_last--; |
| 5243 | ex_start++; | 5257 | else |
| 5258 | ex_start++; | ||
| 5244 | } | 5259 | } |
| 5245 | err = ext4_ext_dirty(handle, inode, path + depth); | 5260 | err = ext4_ext_dirty(handle, inode, path + depth); |
| 5246 | if (err) | 5261 | if (err) |
| @@ -5255,7 +5270,7 @@ ext4_ext_shift_path_extents(struct ext4_ext_path *path, ext4_lblk_t shift, | |||
| 5255 | if (err) | 5270 | if (err) |
| 5256 | goto out; | 5271 | goto out; |
| 5257 | 5272 | ||
| 5258 | path[depth].p_idx->ei_block -= shift; | 5273 | le32_add_cpu(&path[depth].p_idx->ei_block, -shift); |
| 5259 | err = ext4_ext_dirty(handle, inode, path + depth); | 5274 | err = ext4_ext_dirty(handle, inode, path + depth); |
| 5260 | if (err) | 5275 | if (err) |
| 5261 | goto out; | 5276 | goto out; |
| @@ -5300,7 +5315,8 @@ ext4_ext_shift_extents(struct inode *inode, handle_t *handle, | |||
| 5300 | return ret; | 5315 | return ret; |
| 5301 | } | 5316 | } |
| 5302 | 5317 | ||
| 5303 | stop_block = extent->ee_block + ext4_ext_get_actual_len(extent); | 5318 | stop_block = le32_to_cpu(extent->ee_block) + |
| 5319 | ext4_ext_get_actual_len(extent); | ||
| 5304 | ext4_ext_drop_refs(path); | 5320 | ext4_ext_drop_refs(path); |
| 5305 | kfree(path); | 5321 | kfree(path); |
| 5306 | 5322 | ||
| @@ -5313,10 +5329,18 @@ ext4_ext_shift_extents(struct inode *inode, handle_t *handle, | |||
| 5313 | * enough to accomodate the shift. | 5329 | * enough to accomodate the shift. |
| 5314 | */ | 5330 | */ |
| 5315 | path = ext4_ext_find_extent(inode, start - 1, NULL, 0); | 5331 | path = ext4_ext_find_extent(inode, start - 1, NULL, 0); |
| 5332 | if (IS_ERR(path)) | ||
| 5333 | return PTR_ERR(path); | ||
| 5316 | depth = path->p_depth; | 5334 | depth = path->p_depth; |
| 5317 | extent = path[depth].p_ext; | 5335 | extent = path[depth].p_ext; |
| 5318 | ex_start = extent->ee_block; | 5336 | if (extent) { |
| 5319 | ex_end = extent->ee_block + ext4_ext_get_actual_len(extent); | 5337 | ex_start = le32_to_cpu(extent->ee_block); |
| 5338 | ex_end = le32_to_cpu(extent->ee_block) + | ||
| 5339 | ext4_ext_get_actual_len(extent); | ||
| 5340 | } else { | ||
| 5341 | ex_start = 0; | ||
| 5342 | ex_end = 0; | ||
| 5343 | } | ||
| 5320 | ext4_ext_drop_refs(path); | 5344 | ext4_ext_drop_refs(path); |
| 5321 | kfree(path); | 5345 | kfree(path); |
| 5322 | 5346 | ||
| @@ -5331,7 +5355,13 @@ ext4_ext_shift_extents(struct inode *inode, handle_t *handle, | |||
| 5331 | return PTR_ERR(path); | 5355 | return PTR_ERR(path); |
| 5332 | depth = path->p_depth; | 5356 | depth = path->p_depth; |
| 5333 | extent = path[depth].p_ext; | 5357 | extent = path[depth].p_ext; |
| 5334 | current_block = extent->ee_block; | 5358 | if (!extent) { |
| 5359 | EXT4_ERROR_INODE(inode, "unexpected hole at %lu", | ||
| 5360 | (unsigned long) start); | ||
| 5361 | return -EIO; | ||
| 5362 | } | ||
| 5363 | |||
| 5364 | current_block = le32_to_cpu(extent->ee_block); | ||
| 5335 | if (start > current_block) { | 5365 | if (start > current_block) { |
| 5336 | /* Hole, move to the next extent */ | 5366 | /* Hole, move to the next extent */ |
| 5337 | ret = mext_next_extent(inode, path, &extent); | 5367 | ret = mext_next_extent(inode, path, &extent); |
| @@ -5365,17 +5395,18 @@ int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len) | |||
| 5365 | ext4_lblk_t punch_start, punch_stop; | 5395 | ext4_lblk_t punch_start, punch_stop; |
| 5366 | handle_t *handle; | 5396 | handle_t *handle; |
| 5367 | unsigned int credits; | 5397 | unsigned int credits; |
| 5368 | loff_t new_size; | 5398 | loff_t new_size, ioffset; |
| 5369 | int ret; | 5399 | int ret; |
| 5370 | 5400 | ||
| 5371 | BUG_ON(offset + len > i_size_read(inode)); | ||
| 5372 | |||
| 5373 | /* Collapse range works only on fs block size aligned offsets. */ | 5401 | /* Collapse range works only on fs block size aligned offsets. */ |
| 5374 | if (offset & (EXT4_BLOCK_SIZE(sb) - 1) || | 5402 | if (offset & (EXT4_BLOCK_SIZE(sb) - 1) || |
| 5375 | len & (EXT4_BLOCK_SIZE(sb) - 1)) | 5403 | len & (EXT4_BLOCK_SIZE(sb) - 1)) |
| 5376 | return -EINVAL; | 5404 | return -EINVAL; |
| 5377 | 5405 | ||
| 5378 | if (!S_ISREG(inode->i_mode)) | 5406 | if (!S_ISREG(inode->i_mode)) |
| 5407 | return -EINVAL; | ||
| 5408 | |||
| 5409 | if (EXT4_SB(inode->i_sb)->s_cluster_ratio > 1) | ||
| 5379 | return -EOPNOTSUPP; | 5410 | return -EOPNOTSUPP; |
| 5380 | 5411 | ||
| 5381 | trace_ext4_collapse_range(inode, offset, len); | 5412 | trace_ext4_collapse_range(inode, offset, len); |
| @@ -5383,22 +5414,34 @@ int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len) | |||
| 5383 | punch_start = offset >> EXT4_BLOCK_SIZE_BITS(sb); | 5414 | punch_start = offset >> EXT4_BLOCK_SIZE_BITS(sb); |
| 5384 | punch_stop = (offset + len) >> EXT4_BLOCK_SIZE_BITS(sb); | 5415 | punch_stop = (offset + len) >> EXT4_BLOCK_SIZE_BITS(sb); |
| 5385 | 5416 | ||
| 5417 | /* Call ext4_force_commit to flush all data in case of data=journal. */ | ||
| 5418 | if (ext4_should_journal_data(inode)) { | ||
| 5419 | ret = ext4_force_commit(inode->i_sb); | ||
| 5420 | if (ret) | ||
| 5421 | return ret; | ||
| 5422 | } | ||
| 5423 | |||
| 5424 | /* | ||
| 5425 | * Need to round down offset to be aligned with page size boundary | ||
| 5426 | * for page size > block size. | ||
| 5427 | */ | ||
| 5428 | ioffset = round_down(offset, PAGE_SIZE); | ||
| 5429 | |||
| 5386 | /* Write out all dirty pages */ | 5430 | /* Write out all dirty pages */ |
| 5387 | ret = filemap_write_and_wait_range(inode->i_mapping, offset, -1); | 5431 | ret = filemap_write_and_wait_range(inode->i_mapping, ioffset, |
| 5432 | LLONG_MAX); | ||
| 5388 | if (ret) | 5433 | if (ret) |
| 5389 | return ret; | 5434 | return ret; |
| 5390 | 5435 | ||
| 5391 | /* Take mutex lock */ | 5436 | /* Take mutex lock */ |
| 5392 | mutex_lock(&inode->i_mutex); | 5437 | mutex_lock(&inode->i_mutex); |
| 5393 | 5438 | ||
| 5394 | /* It's not possible punch hole on append only file */ | 5439 | /* |
| 5395 | if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) { | 5440 | * There is no need to overlap collapse range with EOF, in which case |
| 5396 | ret = -EPERM; | 5441 | * it is effectively a truncate operation |
| 5397 | goto out_mutex; | 5442 | */ |
| 5398 | } | 5443 | if (offset + len >= i_size_read(inode)) { |
| 5399 | 5444 | ret = -EINVAL; | |
| 5400 | if (IS_SWAPFILE(inode)) { | ||
| 5401 | ret = -ETXTBSY; | ||
| 5402 | goto out_mutex; | 5445 | goto out_mutex; |
| 5403 | } | 5446 | } |
| 5404 | 5447 | ||
| @@ -5408,7 +5451,7 @@ int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len) | |||
| 5408 | goto out_mutex; | 5451 | goto out_mutex; |
| 5409 | } | 5452 | } |
| 5410 | 5453 | ||
| 5411 | truncate_pagecache_range(inode, offset, -1); | 5454 | truncate_pagecache(inode, ioffset); |
| 5412 | 5455 | ||
| 5413 | /* Wait for existing dio to complete */ | 5456 | /* Wait for existing dio to complete */ |
| 5414 | ext4_inode_block_unlocked_dio(inode); | 5457 | ext4_inode_block_unlocked_dio(inode); |
| @@ -5425,7 +5468,7 @@ int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len) | |||
| 5425 | ext4_discard_preallocations(inode); | 5468 | ext4_discard_preallocations(inode); |
| 5426 | 5469 | ||
| 5427 | ret = ext4_es_remove_extent(inode, punch_start, | 5470 | ret = ext4_es_remove_extent(inode, punch_start, |
| 5428 | EXT_MAX_BLOCKS - punch_start - 1); | 5471 | EXT_MAX_BLOCKS - punch_start); |
| 5429 | if (ret) { | 5472 | if (ret) { |
| 5430 | up_write(&EXT4_I(inode)->i_data_sem); | 5473 | up_write(&EXT4_I(inode)->i_data_sem); |
| 5431 | goto out_stop; | 5474 | goto out_stop; |
| @@ -5436,6 +5479,7 @@ int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len) | |||
| 5436 | up_write(&EXT4_I(inode)->i_data_sem); | 5479 | up_write(&EXT4_I(inode)->i_data_sem); |
| 5437 | goto out_stop; | 5480 | goto out_stop; |
| 5438 | } | 5481 | } |
| 5482 | ext4_discard_preallocations(inode); | ||
| 5439 | 5483 | ||
| 5440 | ret = ext4_ext_shift_extents(inode, handle, punch_stop, | 5484 | ret = ext4_ext_shift_extents(inode, handle, punch_stop, |
| 5441 | punch_stop - punch_start); | 5485 | punch_stop - punch_start); |
| @@ -5445,10 +5489,9 @@ int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len) | |||
| 5445 | } | 5489 | } |
| 5446 | 5490 | ||
| 5447 | new_size = i_size_read(inode) - len; | 5491 | new_size = i_size_read(inode) - len; |
| 5448 | truncate_setsize(inode, new_size); | 5492 | i_size_write(inode, new_size); |
| 5449 | EXT4_I(inode)->i_disksize = new_size; | 5493 | EXT4_I(inode)->i_disksize = new_size; |
| 5450 | 5494 | ||
| 5451 | ext4_discard_preallocations(inode); | ||
| 5452 | up_write(&EXT4_I(inode)->i_data_sem); | 5495 | up_write(&EXT4_I(inode)->i_data_sem); |
| 5453 | if (IS_SYNC(inode)) | 5496 | if (IS_SYNC(inode)) |
| 5454 | ext4_handle_sync(handle); | 5497 | ext4_handle_sync(handle); |
diff --git a/fs/ext4/extents_status.c b/fs/ext4/extents_status.c index 0a014a7194b2..0ebc21204b51 100644 --- a/fs/ext4/extents_status.c +++ b/fs/ext4/extents_status.c | |||
| @@ -810,7 +810,7 @@ retry: | |||
| 810 | 810 | ||
| 811 | newes.es_lblk = end + 1; | 811 | newes.es_lblk = end + 1; |
| 812 | newes.es_len = len2; | 812 | newes.es_len = len2; |
| 813 | block = 0x7FDEADBEEF; | 813 | block = 0x7FDEADBEEFULL; |
| 814 | if (ext4_es_is_written(&orig_es) || | 814 | if (ext4_es_is_written(&orig_es) || |
| 815 | ext4_es_is_unwritten(&orig_es)) | 815 | ext4_es_is_unwritten(&orig_es)) |
| 816 | block = ext4_es_pblock(&orig_es) + | 816 | block = ext4_es_pblock(&orig_es) + |
diff --git a/fs/ext4/file.c b/fs/ext4/file.c index ca7502d89fde..063fc1538355 100644 --- a/fs/ext4/file.c +++ b/fs/ext4/file.c | |||
| @@ -82,7 +82,7 @@ ext4_unaligned_aio(struct inode *inode, const struct iovec *iov, | |||
| 82 | size_t count = iov_length(iov, nr_segs); | 82 | size_t count = iov_length(iov, nr_segs); |
| 83 | loff_t final_size = pos + count; | 83 | loff_t final_size = pos + count; |
| 84 | 84 | ||
| 85 | if (pos >= inode->i_size) | 85 | if (pos >= i_size_read(inode)) |
| 86 | return 0; | 86 | return 0; |
| 87 | 87 | ||
| 88 | if ((pos & blockmask) || (final_size & blockmask)) | 88 | if ((pos & blockmask) || (final_size & blockmask)) |
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 5b0d2c7d5408..d7b7462a0e13 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
| @@ -522,6 +522,10 @@ int ext4_map_blocks(handle_t *handle, struct inode *inode, | |||
| 522 | if (unlikely(map->m_len > INT_MAX)) | 522 | if (unlikely(map->m_len > INT_MAX)) |
| 523 | map->m_len = INT_MAX; | 523 | map->m_len = INT_MAX; |
| 524 | 524 | ||
| 525 | /* We can handle the block number less than EXT_MAX_BLOCKS */ | ||
| 526 | if (unlikely(map->m_lblk >= EXT_MAX_BLOCKS)) | ||
| 527 | return -EIO; | ||
| 528 | |||
| 525 | /* Lookup extent status tree firstly */ | 529 | /* Lookup extent status tree firstly */ |
| 526 | if (ext4_es_lookup_extent(inode, map->m_lblk, &es)) { | 530 | if (ext4_es_lookup_extent(inode, map->m_lblk, &es)) { |
| 527 | ext4_es_lru_add(inode); | 531 | ext4_es_lru_add(inode); |
| @@ -2243,13 +2247,23 @@ static int mpage_map_and_submit_extent(handle_t *handle, | |||
| 2243 | return err; | 2247 | return err; |
| 2244 | } while (map->m_len); | 2248 | } while (map->m_len); |
| 2245 | 2249 | ||
| 2246 | /* Update on-disk size after IO is submitted */ | 2250 | /* |
| 2251 | * Update on-disk size after IO is submitted. Races with | ||
| 2252 | * truncate are avoided by checking i_size under i_data_sem. | ||
| 2253 | */ | ||
| 2247 | disksize = ((loff_t)mpd->first_page) << PAGE_CACHE_SHIFT; | 2254 | disksize = ((loff_t)mpd->first_page) << PAGE_CACHE_SHIFT; |
| 2248 | if (disksize > EXT4_I(inode)->i_disksize) { | 2255 | if (disksize > EXT4_I(inode)->i_disksize) { |
| 2249 | int err2; | 2256 | int err2; |
| 2250 | 2257 | loff_t i_size; | |
| 2251 | ext4_wb_update_i_disksize(inode, disksize); | 2258 | |
| 2259 | down_write(&EXT4_I(inode)->i_data_sem); | ||
| 2260 | i_size = i_size_read(inode); | ||
| 2261 | if (disksize > i_size) | ||
| 2262 | disksize = i_size; | ||
| 2263 | if (disksize > EXT4_I(inode)->i_disksize) | ||
| 2264 | EXT4_I(inode)->i_disksize = disksize; | ||
| 2252 | err2 = ext4_mark_inode_dirty(handle, inode); | 2265 | err2 = ext4_mark_inode_dirty(handle, inode); |
| 2266 | up_write(&EXT4_I(inode)->i_data_sem); | ||
| 2253 | if (err2) | 2267 | if (err2) |
| 2254 | ext4_error(inode->i_sb, | 2268 | ext4_error(inode->i_sb, |
| 2255 | "Failed to mark inode %lu dirty", | 2269 | "Failed to mark inode %lu dirty", |
| @@ -3527,15 +3541,6 @@ int ext4_punch_hole(struct inode *inode, loff_t offset, loff_t length) | |||
| 3527 | } | 3541 | } |
| 3528 | 3542 | ||
| 3529 | mutex_lock(&inode->i_mutex); | 3543 | mutex_lock(&inode->i_mutex); |
| 3530 | /* It's not possible punch hole on append only file */ | ||
| 3531 | if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) { | ||
| 3532 | ret = -EPERM; | ||
| 3533 | goto out_mutex; | ||
| 3534 | } | ||
| 3535 | if (IS_SWAPFILE(inode)) { | ||
| 3536 | ret = -ETXTBSY; | ||
| 3537 | goto out_mutex; | ||
| 3538 | } | ||
| 3539 | 3544 | ||
| 3540 | /* No need to punch hole beyond i_size */ | 3545 | /* No need to punch hole beyond i_size */ |
| 3541 | if (offset >= inode->i_size) | 3546 | if (offset >= inode->i_size) |
| @@ -3616,7 +3621,6 @@ int ext4_punch_hole(struct inode *inode, loff_t offset, loff_t length) | |||
| 3616 | ret = ext4_free_hole_blocks(handle, inode, first_block, | 3621 | ret = ext4_free_hole_blocks(handle, inode, first_block, |
| 3617 | stop_block); | 3622 | stop_block); |
| 3618 | 3623 | ||
| 3619 | ext4_discard_preallocations(inode); | ||
| 3620 | up_write(&EXT4_I(inode)->i_data_sem); | 3624 | up_write(&EXT4_I(inode)->i_data_sem); |
| 3621 | if (IS_SYNC(inode)) | 3625 | if (IS_SYNC(inode)) |
| 3622 | ext4_handle_sync(handle); | 3626 | ext4_handle_sync(handle); |
| @@ -4423,21 +4427,20 @@ out_brelse: | |||
| 4423 | * | 4427 | * |
| 4424 | * We are called from a few places: | 4428 | * We are called from a few places: |
| 4425 | * | 4429 | * |
| 4426 | * - Within generic_file_write() for O_SYNC files. | 4430 | * - Within generic_file_aio_write() -> generic_write_sync() for O_SYNC files. |
| 4427 | * Here, there will be no transaction running. We wait for any running | 4431 | * Here, there will be no transaction running. We wait for any running |
| 4428 | * transaction to commit. | 4432 | * transaction to commit. |
| 4429 | * | 4433 | * |
| 4430 | * - Within sys_sync(), kupdate and such. | 4434 | * - Within flush work (sys_sync(), kupdate and such). |
| 4431 | * We wait on commit, if tol to. | 4435 | * We wait on commit, if told to. |
| 4432 | * | 4436 | * |
| 4433 | * - Within prune_icache() (PF_MEMALLOC == true) | 4437 | * - Within iput_final() -> write_inode_now() |
| 4434 | * Here we simply return. We can't afford to block kswapd on the | 4438 | * We wait on commit, if told to. |
| 4435 | * journal commit. | ||
| 4436 | * | 4439 | * |
| 4437 | * In all cases it is actually safe for us to return without doing anything, | 4440 | * In all cases it is actually safe for us to return without doing anything, |
| 4438 | * because the inode has been copied into a raw inode buffer in | 4441 | * because the inode has been copied into a raw inode buffer in |
| 4439 | * ext4_mark_inode_dirty(). This is a correctness thing for O_SYNC and for | 4442 | * ext4_mark_inode_dirty(). This is a correctness thing for WB_SYNC_ALL |
| 4440 | * knfsd. | 4443 | * writeback. |
| 4441 | * | 4444 | * |
| 4442 | * Note that we are absolutely dependent upon all inode dirtiers doing the | 4445 | * Note that we are absolutely dependent upon all inode dirtiers doing the |
| 4443 | * right thing: they *must* call mark_inode_dirty() after dirtying info in | 4446 | * right thing: they *must* call mark_inode_dirty() after dirtying info in |
| @@ -4449,15 +4452,15 @@ out_brelse: | |||
| 4449 | * stuff(); | 4452 | * stuff(); |
| 4450 | * inode->i_size = expr; | 4453 | * inode->i_size = expr; |
| 4451 | * | 4454 | * |
| 4452 | * is in error because a kswapd-driven write_inode() could occur while | 4455 | * is in error because write_inode() could occur while `stuff()' is running, |
| 4453 | * `stuff()' is running, and the new i_size will be lost. Plus the inode | 4456 | * and the new i_size will be lost. Plus the inode will no longer be on the |
| 4454 | * will no longer be on the superblock's dirty inode list. | 4457 | * superblock's dirty inode list. |
| 4455 | */ | 4458 | */ |
| 4456 | int ext4_write_inode(struct inode *inode, struct writeback_control *wbc) | 4459 | int ext4_write_inode(struct inode *inode, struct writeback_control *wbc) |
| 4457 | { | 4460 | { |
| 4458 | int err; | 4461 | int err; |
| 4459 | 4462 | ||
| 4460 | if (current->flags & PF_MEMALLOC) | 4463 | if (WARN_ON_ONCE(current->flags & PF_MEMALLOC)) |
| 4461 | return 0; | 4464 | return 0; |
| 4462 | 4465 | ||
| 4463 | if (EXT4_SB(inode->i_sb)->s_journal) { | 4466 | if (EXT4_SB(inode->i_sb)->s_journal) { |
diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index a888cac76e9c..c8238a26818c 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c | |||
| @@ -989,7 +989,7 @@ static int ext4_mb_get_buddy_page_lock(struct super_block *sb, | |||
| 989 | poff = block % blocks_per_page; | 989 | poff = block % blocks_per_page; |
| 990 | page = find_or_create_page(inode->i_mapping, pnum, GFP_NOFS); | 990 | page = find_or_create_page(inode->i_mapping, pnum, GFP_NOFS); |
| 991 | if (!page) | 991 | if (!page) |
| 992 | return -EIO; | 992 | return -ENOMEM; |
| 993 | BUG_ON(page->mapping != inode->i_mapping); | 993 | BUG_ON(page->mapping != inode->i_mapping); |
| 994 | e4b->bd_bitmap_page = page; | 994 | e4b->bd_bitmap_page = page; |
| 995 | e4b->bd_bitmap = page_address(page) + (poff * sb->s_blocksize); | 995 | e4b->bd_bitmap = page_address(page) + (poff * sb->s_blocksize); |
| @@ -1003,7 +1003,7 @@ static int ext4_mb_get_buddy_page_lock(struct super_block *sb, | |||
| 1003 | pnum = block / blocks_per_page; | 1003 | pnum = block / blocks_per_page; |
| 1004 | page = find_or_create_page(inode->i_mapping, pnum, GFP_NOFS); | 1004 | page = find_or_create_page(inode->i_mapping, pnum, GFP_NOFS); |
| 1005 | if (!page) | 1005 | if (!page) |
| 1006 | return -EIO; | 1006 | return -ENOMEM; |
| 1007 | BUG_ON(page->mapping != inode->i_mapping); | 1007 | BUG_ON(page->mapping != inode->i_mapping); |
| 1008 | e4b->bd_buddy_page = page; | 1008 | e4b->bd_buddy_page = page; |
| 1009 | return 0; | 1009 | return 0; |
| @@ -1168,7 +1168,11 @@ ext4_mb_load_buddy(struct super_block *sb, ext4_group_t group, | |||
| 1168 | unlock_page(page); | 1168 | unlock_page(page); |
| 1169 | } | 1169 | } |
| 1170 | } | 1170 | } |
| 1171 | if (page == NULL || !PageUptodate(page)) { | 1171 | if (page == NULL) { |
| 1172 | ret = -ENOMEM; | ||
| 1173 | goto err; | ||
| 1174 | } | ||
| 1175 | if (!PageUptodate(page)) { | ||
| 1172 | ret = -EIO; | 1176 | ret = -EIO; |
| 1173 | goto err; | 1177 | goto err; |
| 1174 | } | 1178 | } |
| @@ -1197,7 +1201,11 @@ ext4_mb_load_buddy(struct super_block *sb, ext4_group_t group, | |||
| 1197 | unlock_page(page); | 1201 | unlock_page(page); |
| 1198 | } | 1202 | } |
| 1199 | } | 1203 | } |
| 1200 | if (page == NULL || !PageUptodate(page)) { | 1204 | if (page == NULL) { |
| 1205 | ret = -ENOMEM; | ||
| 1206 | goto err; | ||
| 1207 | } | ||
| 1208 | if (!PageUptodate(page)) { | ||
| 1201 | ret = -EIO; | 1209 | ret = -EIO; |
| 1202 | goto err; | 1210 | goto err; |
| 1203 | } | 1211 | } |
| @@ -5008,6 +5016,8 @@ error_return: | |||
| 5008 | */ | 5016 | */ |
| 5009 | static int ext4_trim_extent(struct super_block *sb, int start, int count, | 5017 | static int ext4_trim_extent(struct super_block *sb, int start, int count, |
| 5010 | ext4_group_t group, struct ext4_buddy *e4b) | 5018 | ext4_group_t group, struct ext4_buddy *e4b) |
| 5019 | __releases(bitlock) | ||
| 5020 | __acquires(bitlock) | ||
| 5011 | { | 5021 | { |
| 5012 | struct ext4_free_extent ex; | 5022 | struct ext4_free_extent ex; |
| 5013 | int ret = 0; | 5023 | int ret = 0; |
diff --git a/fs/ext4/page-io.c b/fs/ext4/page-io.c index ab95508e3d40..c18d95b50540 100644 --- a/fs/ext4/page-io.c +++ b/fs/ext4/page-io.c | |||
| @@ -308,13 +308,14 @@ static void ext4_end_bio(struct bio *bio, int error) | |||
| 308 | if (error) { | 308 | if (error) { |
| 309 | struct inode *inode = io_end->inode; | 309 | struct inode *inode = io_end->inode; |
| 310 | 310 | ||
| 311 | ext4_warning(inode->i_sb, "I/O error writing to inode %lu " | 311 | ext4_warning(inode->i_sb, "I/O error %d writing to inode %lu " |
| 312 | "(offset %llu size %ld starting block %llu)", | 312 | "(offset %llu size %ld starting block %llu)", |
| 313 | inode->i_ino, | 313 | error, inode->i_ino, |
| 314 | (unsigned long long) io_end->offset, | 314 | (unsigned long long) io_end->offset, |
| 315 | (long) io_end->size, | 315 | (long) io_end->size, |
| 316 | (unsigned long long) | 316 | (unsigned long long) |
| 317 | bi_sector >> (inode->i_blkbits - 9)); | 317 | bi_sector >> (inode->i_blkbits - 9)); |
| 318 | mapping_set_error(inode->i_mapping, error); | ||
| 318 | } | 319 | } |
| 319 | 320 | ||
| 320 | if (io_end->flag & EXT4_IO_END_UNWRITTEN) { | 321 | if (io_end->flag & EXT4_IO_END_UNWRITTEN) { |
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index f3c667091618..6f9e6fadac04 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
| @@ -3869,19 +3869,38 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
| 3869 | goto failed_mount2; | 3869 | goto failed_mount2; |
| 3870 | } | 3870 | } |
| 3871 | } | 3871 | } |
| 3872 | |||
| 3873 | /* | ||
| 3874 | * set up enough so that it can read an inode, | ||
| 3875 | * and create new inode for buddy allocator | ||
| 3876 | */ | ||
| 3877 | sbi->s_gdb_count = db_count; | ||
| 3878 | if (!test_opt(sb, NOLOAD) && | ||
| 3879 | EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_HAS_JOURNAL)) | ||
| 3880 | sb->s_op = &ext4_sops; | ||
| 3881 | else | ||
| 3882 | sb->s_op = &ext4_nojournal_sops; | ||
| 3883 | |||
| 3884 | ext4_ext_init(sb); | ||
| 3885 | err = ext4_mb_init(sb); | ||
| 3886 | if (err) { | ||
| 3887 | ext4_msg(sb, KERN_ERR, "failed to initialize mballoc (%d)", | ||
| 3888 | err); | ||
| 3889 | goto failed_mount2; | ||
| 3890 | } | ||
| 3891 | |||
| 3872 | if (!ext4_check_descriptors(sb, &first_not_zeroed)) { | 3892 | if (!ext4_check_descriptors(sb, &first_not_zeroed)) { |
| 3873 | ext4_msg(sb, KERN_ERR, "group descriptors corrupted!"); | 3893 | ext4_msg(sb, KERN_ERR, "group descriptors corrupted!"); |
| 3874 | goto failed_mount2; | 3894 | goto failed_mount2a; |
| 3875 | } | 3895 | } |
| 3876 | if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_FLEX_BG)) | 3896 | if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_FLEX_BG)) |
| 3877 | if (!ext4_fill_flex_info(sb)) { | 3897 | if (!ext4_fill_flex_info(sb)) { |
| 3878 | ext4_msg(sb, KERN_ERR, | 3898 | ext4_msg(sb, KERN_ERR, |
| 3879 | "unable to initialize " | 3899 | "unable to initialize " |
| 3880 | "flex_bg meta info!"); | 3900 | "flex_bg meta info!"); |
| 3881 | goto failed_mount2; | 3901 | goto failed_mount2a; |
| 3882 | } | 3902 | } |
| 3883 | 3903 | ||
| 3884 | sbi->s_gdb_count = db_count; | ||
| 3885 | get_random_bytes(&sbi->s_next_generation, sizeof(u32)); | 3904 | get_random_bytes(&sbi->s_next_generation, sizeof(u32)); |
| 3886 | spin_lock_init(&sbi->s_next_gen_lock); | 3905 | spin_lock_init(&sbi->s_next_gen_lock); |
| 3887 | 3906 | ||
| @@ -3916,14 +3935,6 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
| 3916 | sbi->s_stripe = ext4_get_stripe_size(sbi); | 3935 | sbi->s_stripe = ext4_get_stripe_size(sbi); |
| 3917 | sbi->s_extent_max_zeroout_kb = 32; | 3936 | sbi->s_extent_max_zeroout_kb = 32; |
| 3918 | 3937 | ||
| 3919 | /* | ||
| 3920 | * set up enough so that it can read an inode | ||
| 3921 | */ | ||
| 3922 | if (!test_opt(sb, NOLOAD) && | ||
| 3923 | EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_HAS_JOURNAL)) | ||
| 3924 | sb->s_op = &ext4_sops; | ||
| 3925 | else | ||
| 3926 | sb->s_op = &ext4_nojournal_sops; | ||
| 3927 | sb->s_export_op = &ext4_export_ops; | 3938 | sb->s_export_op = &ext4_export_ops; |
| 3928 | sb->s_xattr = ext4_xattr_handlers; | 3939 | sb->s_xattr = ext4_xattr_handlers; |
| 3929 | #ifdef CONFIG_QUOTA | 3940 | #ifdef CONFIG_QUOTA |
| @@ -4113,21 +4124,13 @@ no_journal: | |||
| 4113 | if (err) { | 4124 | if (err) { |
| 4114 | ext4_msg(sb, KERN_ERR, "failed to reserve %llu clusters for " | 4125 | ext4_msg(sb, KERN_ERR, "failed to reserve %llu clusters for " |
| 4115 | "reserved pool", ext4_calculate_resv_clusters(sb)); | 4126 | "reserved pool", ext4_calculate_resv_clusters(sb)); |
| 4116 | goto failed_mount4a; | 4127 | goto failed_mount5; |
| 4117 | } | 4128 | } |
| 4118 | 4129 | ||
| 4119 | err = ext4_setup_system_zone(sb); | 4130 | err = ext4_setup_system_zone(sb); |
| 4120 | if (err) { | 4131 | if (err) { |
| 4121 | ext4_msg(sb, KERN_ERR, "failed to initialize system " | 4132 | ext4_msg(sb, KERN_ERR, "failed to initialize system " |
| 4122 | "zone (%d)", err); | 4133 | "zone (%d)", err); |
| 4123 | goto failed_mount4a; | ||
| 4124 | } | ||
| 4125 | |||
| 4126 | ext4_ext_init(sb); | ||
| 4127 | err = ext4_mb_init(sb); | ||
| 4128 | if (err) { | ||
| 4129 | ext4_msg(sb, KERN_ERR, "failed to initialize mballoc (%d)", | ||
| 4130 | err); | ||
| 4131 | goto failed_mount5; | 4134 | goto failed_mount5; |
| 4132 | } | 4135 | } |
| 4133 | 4136 | ||
| @@ -4204,11 +4207,8 @@ failed_mount8: | |||
| 4204 | failed_mount7: | 4207 | failed_mount7: |
| 4205 | ext4_unregister_li_request(sb); | 4208 | ext4_unregister_li_request(sb); |
| 4206 | failed_mount6: | 4209 | failed_mount6: |
| 4207 | ext4_mb_release(sb); | ||
| 4208 | failed_mount5: | ||
| 4209 | ext4_ext_release(sb); | ||
| 4210 | ext4_release_system_zone(sb); | 4210 | ext4_release_system_zone(sb); |
| 4211 | failed_mount4a: | 4211 | failed_mount5: |
| 4212 | dput(sb->s_root); | 4212 | dput(sb->s_root); |
| 4213 | sb->s_root = NULL; | 4213 | sb->s_root = NULL; |
| 4214 | failed_mount4: | 4214 | failed_mount4: |
| @@ -4232,11 +4232,14 @@ failed_mount3: | |||
| 4232 | percpu_counter_destroy(&sbi->s_extent_cache_cnt); | 4232 | percpu_counter_destroy(&sbi->s_extent_cache_cnt); |
| 4233 | if (sbi->s_mmp_tsk) | 4233 | if (sbi->s_mmp_tsk) |
| 4234 | kthread_stop(sbi->s_mmp_tsk); | 4234 | kthread_stop(sbi->s_mmp_tsk); |
| 4235 | failed_mount2a: | ||
| 4236 | ext4_mb_release(sb); | ||
| 4235 | failed_mount2: | 4237 | failed_mount2: |
| 4236 | for (i = 0; i < db_count; i++) | 4238 | for (i = 0; i < db_count; i++) |
| 4237 | brelse(sbi->s_group_desc[i]); | 4239 | brelse(sbi->s_group_desc[i]); |
| 4238 | ext4_kvfree(sbi->s_group_desc); | 4240 | ext4_kvfree(sbi->s_group_desc); |
| 4239 | failed_mount: | 4241 | failed_mount: |
| 4242 | ext4_ext_release(sb); | ||
| 4240 | if (sbi->s_chksum_driver) | 4243 | if (sbi->s_chksum_driver) |
| 4241 | crypto_free_shash(sbi->s_chksum_driver); | 4244 | crypto_free_shash(sbi->s_chksum_driver); |
| 4242 | if (sbi->s_proc) { | 4245 | if (sbi->s_proc) { |
diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c index 1f5cf5880718..4eec399ec807 100644 --- a/fs/ext4/xattr.c +++ b/fs/ext4/xattr.c | |||
| @@ -520,8 +520,8 @@ static void ext4_xattr_update_super_block(handle_t *handle, | |||
| 520 | } | 520 | } |
| 521 | 521 | ||
| 522 | /* | 522 | /* |
| 523 | * Release the xattr block BH: If the reference count is > 1, decrement | 523 | * Release the xattr block BH: If the reference count is > 1, decrement it; |
| 524 | * it; otherwise free the block. | 524 | * otherwise free the block. |
| 525 | */ | 525 | */ |
| 526 | static void | 526 | static void |
| 527 | ext4_xattr_release_block(handle_t *handle, struct inode *inode, | 527 | ext4_xattr_release_block(handle_t *handle, struct inode *inode, |
| @@ -542,16 +542,31 @@ ext4_xattr_release_block(handle_t *handle, struct inode *inode, | |||
| 542 | if (ce) | 542 | if (ce) |
| 543 | mb_cache_entry_free(ce); | 543 | mb_cache_entry_free(ce); |
| 544 | get_bh(bh); | 544 | get_bh(bh); |
| 545 | unlock_buffer(bh); | ||
| 545 | ext4_free_blocks(handle, inode, bh, 0, 1, | 546 | ext4_free_blocks(handle, inode, bh, 0, 1, |
| 546 | EXT4_FREE_BLOCKS_METADATA | | 547 | EXT4_FREE_BLOCKS_METADATA | |
| 547 | EXT4_FREE_BLOCKS_FORGET); | 548 | EXT4_FREE_BLOCKS_FORGET); |
| 548 | unlock_buffer(bh); | ||
| 549 | } else { | 549 | } else { |
| 550 | le32_add_cpu(&BHDR(bh)->h_refcount, -1); | 550 | le32_add_cpu(&BHDR(bh)->h_refcount, -1); |
| 551 | if (ce) | 551 | if (ce) |
| 552 | mb_cache_entry_release(ce); | 552 | mb_cache_entry_release(ce); |
| 553 | /* | ||
| 554 | * Beware of this ugliness: Releasing of xattr block references | ||
| 555 | * from different inodes can race and so we have to protect | ||
| 556 | * from a race where someone else frees the block (and releases | ||
| 557 | * its journal_head) before we are done dirtying the buffer. In | ||
| 558 | * nojournal mode this race is harmless and we actually cannot | ||
| 559 | * call ext4_handle_dirty_xattr_block() with locked buffer as | ||
| 560 | * that function can call sync_dirty_buffer() so for that case | ||
| 561 | * we handle the dirtying after unlocking the buffer. | ||
| 562 | */ | ||
| 563 | if (ext4_handle_valid(handle)) | ||
| 564 | error = ext4_handle_dirty_xattr_block(handle, inode, | ||
| 565 | bh); | ||
| 553 | unlock_buffer(bh); | 566 | unlock_buffer(bh); |
| 554 | error = ext4_handle_dirty_xattr_block(handle, inode, bh); | 567 | if (!ext4_handle_valid(handle)) |
| 568 | error = ext4_handle_dirty_xattr_block(handle, inode, | ||
| 569 | bh); | ||
| 555 | if (IS_SYNC(inode)) | 570 | if (IS_SYNC(inode)) |
| 556 | ext4_handle_sync(handle); | 571 | ext4_handle_sync(handle); |
| 557 | dquot_free_block(inode, EXT4_C2B(EXT4_SB(inode->i_sb), 1)); | 572 | dquot_free_block(inode, EXT4_C2B(EXT4_SB(inode->i_sb), 1)); |
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/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); |
| @@ -254,17 +254,22 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len) | |||
| 254 | return -EBADF; | 254 | return -EBADF; |
| 255 | 255 | ||
| 256 | /* | 256 | /* |
| 257 | * It's not possible to punch hole or perform collapse range | 257 | * We can only allow pure fallocate on append only files |
| 258 | * on append only file | ||
| 259 | */ | 258 | */ |
| 260 | if (mode & (FALLOC_FL_PUNCH_HOLE | FALLOC_FL_COLLAPSE_RANGE) | 259 | if ((mode & ~FALLOC_FL_KEEP_SIZE) && IS_APPEND(inode)) |
| 261 | && IS_APPEND(inode)) | ||
| 262 | return -EPERM; | 260 | return -EPERM; |
| 263 | 261 | ||
| 264 | if (IS_IMMUTABLE(inode)) | 262 | if (IS_IMMUTABLE(inode)) |
| 265 | return -EPERM; | 263 | return -EPERM; |
| 266 | 264 | ||
| 267 | /* | 265 | /* |
| 266 | * We can not allow to do any fallocate operation on an active | ||
| 267 | * swapfile | ||
| 268 | */ | ||
| 269 | if (IS_SWAPFILE(inode)) | ||
| 270 | ret = -ETXTBSY; | ||
| 271 | |||
| 272 | /* | ||
| 268 | * Revalidate the write permissions, in case security policy has | 273 | * Revalidate the write permissions, in case security policy has |
| 269 | * changed since the files were opened. | 274 | * changed since the files were opened. |
| 270 | */ | 275 | */ |
| @@ -286,14 +291,6 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len) | |||
| 286 | if (((offset + len) > inode->i_sb->s_maxbytes) || ((offset + len) < 0)) | 291 | if (((offset + len) > inode->i_sb->s_maxbytes) || ((offset + len) < 0)) |
| 287 | return -EFBIG; | 292 | return -EFBIG; |
| 288 | 293 | ||
| 289 | /* | ||
| 290 | * There is no need to overlap collapse range with EOF, in which case | ||
| 291 | * it is effectively a truncate operation | ||
| 292 | */ | ||
| 293 | if ((mode & FALLOC_FL_COLLAPSE_RANGE) && | ||
| 294 | (offset + len >= i_size_read(inode))) | ||
| 295 | return -EINVAL; | ||
| 296 | |||
| 297 | if (!file->f_op->fallocate) | 294 | if (!file->f_op->fallocate) |
| 298 | return -EOPNOTSUPP; | 295 | return -EOPNOTSUPP; |
| 299 | 296 | ||
diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 82afdcb33183..951a2321ee01 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c | |||
| @@ -841,7 +841,15 @@ xfs_file_fallocate( | |||
| 841 | goto out_unlock; | 841 | goto out_unlock; |
| 842 | } | 842 | } |
| 843 | 843 | ||
| 844 | ASSERT(offset + len < i_size_read(inode)); | 844 | /* |
| 845 | * There is no need to overlap collapse range with EOF, | ||
| 846 | * in which case it is effectively a truncate operation | ||
| 847 | */ | ||
| 848 | if (offset + len >= i_size_read(inode)) { | ||
| 849 | error = -EINVAL; | ||
| 850 | goto out_unlock; | ||
| 851 | } | ||
| 852 | |||
| 845 | new_size = i_size_read(inode) - len; | 853 | new_size = i_size_read(inode) - len; |
| 846 | 854 | ||
| 847 | error = xfs_collapse_file_space(ip, offset, len); | 855 | error = xfs_collapse_file_space(ip, offset, len); |
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/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/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/trace/events/ext4.h b/include/trace/events/ext4.h index 010ea89eeb0e..6a1a0245474f 100644 --- a/include/trace/events/ext4.h +++ b/include/trace/events/ext4.h | |||
| @@ -16,15 +16,6 @@ struct mpage_da_data; | |||
| 16 | struct ext4_map_blocks; | 16 | struct ext4_map_blocks; |
| 17 | struct extent_status; | 17 | struct extent_status; |
| 18 | 18 | ||
| 19 | /* shim until we merge in the xfs_collapse_range branch */ | ||
| 20 | #ifndef FALLOC_FL_COLLAPSE_RANGE | ||
| 21 | #define FALLOC_FL_COLLAPSE_RANGE 0x08 | ||
| 22 | #endif | ||
| 23 | |||
| 24 | #ifndef FALLOC_FL_ZERO_RANGE | ||
| 25 | #define FALLOC_FL_ZERO_RANGE 0x10 | ||
| 26 | #endif | ||
| 27 | |||
| 28 | #define EXT4_I(inode) (container_of(inode, struct ext4_inode_info, vfs_inode)) | 19 | #define EXT4_I(inode) (container_of(inode, struct ext4_inode_info, vfs_inode)) |
| 29 | 20 | ||
| 30 | #define show_mballoc_flags(flags) __print_flags(flags, "|", \ | 21 | #define show_mballoc_flags(flags) __print_flags(flags, "|", \ |
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/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/mm/memory.c b/mm/memory.c index d0f0bef3be48..93e332d5ed77 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
| @@ -1955,12 +1955,17 @@ int fixup_user_fault(struct task_struct *tsk, struct mm_struct *mm, | |||
| 1955 | unsigned long address, unsigned int fault_flags) | 1955 | unsigned long address, unsigned int fault_flags) |
| 1956 | { | 1956 | { |
| 1957 | struct vm_area_struct *vma; | 1957 | struct vm_area_struct *vma; |
| 1958 | vm_flags_t vm_flags; | ||
| 1958 | int ret; | 1959 | int ret; |
| 1959 | 1960 | ||
| 1960 | vma = find_extend_vma(mm, address); | 1961 | vma = find_extend_vma(mm, address); |
| 1961 | if (!vma || address < vma->vm_start) | 1962 | if (!vma || address < vma->vm_start) |
| 1962 | return -EFAULT; | 1963 | return -EFAULT; |
| 1963 | 1964 | ||
| 1965 | vm_flags = (fault_flags & FAULT_FLAG_WRITE) ? VM_WRITE : VM_READ; | ||
| 1966 | if (!(vm_flags & vma->vm_flags)) | ||
| 1967 | return -EFAULT; | ||
| 1968 | |||
| 1964 | ret = handle_mm_fault(mm, vma, address, fault_flags); | 1969 | ret = handle_mm_fault(mm, vma, address, fault_flags); |
| 1965 | if (ret & VM_FAULT_ERROR) { | 1970 | if (ret & VM_FAULT_ERROR) { |
| 1966 | if (ret & VM_FAULT_OOM) | 1971 | if (ret & VM_FAULT_OOM) |
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/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: |
