diff options
26 files changed, 93 insertions, 459 deletions
diff --git a/Documentation/devicetree/bindings/mtd/gpmc-nand.txt b/Documentation/devicetree/bindings/mtd/gpmc-nand.txt index 65f4f7c43136..ee654e95d8ad 100644 --- a/Documentation/devicetree/bindings/mtd/gpmc-nand.txt +++ b/Documentation/devicetree/bindings/mtd/gpmc-nand.txt | |||
| @@ -22,7 +22,7 @@ Optional properties: | |||
| 22 | width of 8 is assumed. | 22 | width of 8 is assumed. |
| 23 | 23 | ||
| 24 | - ti,nand-ecc-opt: A string setting the ECC layout to use. One of: | 24 | - ti,nand-ecc-opt: A string setting the ECC layout to use. One of: |
| 25 | "sw" <deprecated> use "ham1" instead | 25 | "sw" 1-bit Hamming ecc code via software |
| 26 | "hw" <deprecated> use "ham1" instead | 26 | "hw" <deprecated> use "ham1" instead |
| 27 | "hw-romcode" <deprecated> use "ham1" instead | 27 | "hw-romcode" <deprecated> use "ham1" instead |
| 28 | "ham1" 1-bit Hamming ecc code | 28 | "ham1" 1-bit Hamming ecc code |
diff --git a/MAINTAINERS b/MAINTAINERS index 1ff06dee651d..93e9f730f406 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -1279,8 +1279,13 @@ M: Heiko Stuebner <heiko@sntech.de> | |||
| 1279 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 1279 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
| 1280 | L: linux-rockchip@lists.infradead.org | 1280 | L: linux-rockchip@lists.infradead.org |
| 1281 | S: Maintained | 1281 | S: Maintained |
| 1282 | F: arch/arm/boot/dts/rk3* | ||
| 1282 | F: arch/arm/mach-rockchip/ | 1283 | F: arch/arm/mach-rockchip/ |
| 1284 | F: drivers/clk/rockchip/ | ||
| 1285 | F: drivers/i2c/busses/i2c-rk3x.c | ||
| 1283 | F: drivers/*/*rockchip* | 1286 | F: drivers/*/*rockchip* |
| 1287 | F: drivers/*/*/*rockchip* | ||
| 1288 | F: sound/soc/rockchip/ | ||
| 1284 | 1289 | ||
| 1285 | ARM/SAMSUNG ARM ARCHITECTURES | 1290 | ARM/SAMSUNG ARM ARCHITECTURES |
| 1286 | M: Ben Dooks <ben-linux@fluff.org> | 1291 | M: Ben Dooks <ben-linux@fluff.org> |
diff --git a/arch/arm/boot/dts/dra7.dtsi b/arch/arm/boot/dts/dra7.dtsi index 97f603c4483d..d678152db4cb 100644 --- a/arch/arm/boot/dts/dra7.dtsi +++ b/arch/arm/boot/dts/dra7.dtsi | |||
| @@ -245,7 +245,7 @@ | |||
| 245 | gpio-controller; | 245 | gpio-controller; |
| 246 | #gpio-cells = <2>; | 246 | #gpio-cells = <2>; |
| 247 | interrupt-controller; | 247 | interrupt-controller; |
| 248 | #interrupt-cells = <1>; | 248 | #interrupt-cells = <2>; |
| 249 | }; | 249 | }; |
| 250 | 250 | ||
| 251 | gpio2: gpio@48055000 { | 251 | gpio2: gpio@48055000 { |
| @@ -256,7 +256,7 @@ | |||
| 256 | gpio-controller; | 256 | gpio-controller; |
| 257 | #gpio-cells = <2>; | 257 | #gpio-cells = <2>; |
| 258 | interrupt-controller; | 258 | interrupt-controller; |
| 259 | #interrupt-cells = <1>; | 259 | #interrupt-cells = <2>; |
| 260 | }; | 260 | }; |
| 261 | 261 | ||
| 262 | gpio3: gpio@48057000 { | 262 | gpio3: gpio@48057000 { |
| @@ -267,7 +267,7 @@ | |||
| 267 | gpio-controller; | 267 | gpio-controller; |
| 268 | #gpio-cells = <2>; | 268 | #gpio-cells = <2>; |
| 269 | interrupt-controller; | 269 | interrupt-controller; |
| 270 | #interrupt-cells = <1>; | 270 | #interrupt-cells = <2>; |
| 271 | }; | 271 | }; |
| 272 | 272 | ||
| 273 | gpio4: gpio@48059000 { | 273 | gpio4: gpio@48059000 { |
| @@ -278,7 +278,7 @@ | |||
| 278 | gpio-controller; | 278 | gpio-controller; |
| 279 | #gpio-cells = <2>; | 279 | #gpio-cells = <2>; |
| 280 | interrupt-controller; | 280 | interrupt-controller; |
| 281 | #interrupt-cells = <1>; | 281 | #interrupt-cells = <2>; |
| 282 | }; | 282 | }; |
| 283 | 283 | ||
| 284 | gpio5: gpio@4805b000 { | 284 | gpio5: gpio@4805b000 { |
| @@ -289,7 +289,7 @@ | |||
| 289 | gpio-controller; | 289 | gpio-controller; |
| 290 | #gpio-cells = <2>; | 290 | #gpio-cells = <2>; |
| 291 | interrupt-controller; | 291 | interrupt-controller; |
| 292 | #interrupt-cells = <1>; | 292 | #interrupt-cells = <2>; |
| 293 | }; | 293 | }; |
| 294 | 294 | ||
| 295 | gpio6: gpio@4805d000 { | 295 | gpio6: gpio@4805d000 { |
| @@ -300,7 +300,7 @@ | |||
| 300 | gpio-controller; | 300 | gpio-controller; |
| 301 | #gpio-cells = <2>; | 301 | #gpio-cells = <2>; |
| 302 | interrupt-controller; | 302 | interrupt-controller; |
| 303 | #interrupt-cells = <1>; | 303 | #interrupt-cells = <2>; |
| 304 | }; | 304 | }; |
| 305 | 305 | ||
| 306 | gpio7: gpio@48051000 { | 306 | gpio7: gpio@48051000 { |
| @@ -311,7 +311,7 @@ | |||
| 311 | gpio-controller; | 311 | gpio-controller; |
| 312 | #gpio-cells = <2>; | 312 | #gpio-cells = <2>; |
| 313 | interrupt-controller; | 313 | interrupt-controller; |
| 314 | #interrupt-cells = <1>; | 314 | #interrupt-cells = <2>; |
| 315 | }; | 315 | }; |
| 316 | 316 | ||
| 317 | gpio8: gpio@48053000 { | 317 | gpio8: gpio@48053000 { |
| @@ -322,7 +322,7 @@ | |||
| 322 | gpio-controller; | 322 | gpio-controller; |
| 323 | #gpio-cells = <2>; | 323 | #gpio-cells = <2>; |
| 324 | interrupt-controller; | 324 | interrupt-controller; |
| 325 | #interrupt-cells = <1>; | 325 | #interrupt-cells = <2>; |
| 326 | }; | 326 | }; |
| 327 | 327 | ||
| 328 | uart1: serial@4806a000 { | 328 | uart1: serial@4806a000 { |
diff --git a/arch/arm/boot/dts/imx53-qsrb.dts b/arch/arm/boot/dts/imx53-qsrb.dts index f1bbf9a32991..82d623d05915 100644 --- a/arch/arm/boot/dts/imx53-qsrb.dts +++ b/arch/arm/boot/dts/imx53-qsrb.dts | |||
| @@ -28,6 +28,12 @@ | |||
| 28 | MX53_PAD_CSI0_DAT9__I2C1_SCL 0x400001ec | 28 | MX53_PAD_CSI0_DAT9__I2C1_SCL 0x400001ec |
| 29 | >; | 29 | >; |
| 30 | }; | 30 | }; |
| 31 | |||
| 32 | pinctrl_pmic: pmicgrp { | ||
| 33 | fsl,pins = < | ||
| 34 | MX53_PAD_CSI0_DAT5__GPIO5_23 0x1e4 /* IRQ */ | ||
| 35 | >; | ||
| 36 | }; | ||
| 31 | }; | 37 | }; |
| 32 | }; | 38 | }; |
| 33 | 39 | ||
| @@ -38,6 +44,8 @@ | |||
| 38 | 44 | ||
| 39 | pmic: mc34708@8 { | 45 | pmic: mc34708@8 { |
| 40 | compatible = "fsl,mc34708"; | 46 | compatible = "fsl,mc34708"; |
| 47 | pinctrl-names = "default"; | ||
| 48 | pinctrl-0 = <&pinctrl_pmic>; | ||
| 41 | reg = <0x08>; | 49 | reg = <0x08>; |
| 42 | interrupt-parent = <&gpio5>; | 50 | interrupt-parent = <&gpio5>; |
| 43 | interrupts = <23 0x8>; | 51 | interrupts = <23 0x8>; |
diff --git a/arch/arm/boot/dts/imx6dl-hummingboard.dts b/arch/arm/boot/dts/imx6dl-hummingboard.dts index c8e51dd41b8f..71598546087f 100644 --- a/arch/arm/boot/dts/imx6dl-hummingboard.dts +++ b/arch/arm/boot/dts/imx6dl-hummingboard.dts | |||
| @@ -58,7 +58,7 @@ | |||
| 58 | 58 | ||
| 59 | sound-spdif { | 59 | sound-spdif { |
| 60 | compatible = "fsl,imx-audio-spdif"; | 60 | compatible = "fsl,imx-audio-spdif"; |
| 61 | model = "imx-spdif"; | 61 | model = "On-board SPDIF"; |
| 62 | /* IMX6 doesn't implement this yet */ | 62 | /* IMX6 doesn't implement this yet */ |
| 63 | spdif-controller = <&spdif>; | 63 | spdif-controller = <&spdif>; |
| 64 | spdif-out; | 64 | spdif-out; |
| @@ -181,11 +181,13 @@ | |||
| 181 | }; | 181 | }; |
| 182 | 182 | ||
| 183 | &usbh1 { | 183 | &usbh1 { |
| 184 | disable-over-current; | ||
| 184 | vbus-supply = <®_usbh1_vbus>; | 185 | vbus-supply = <®_usbh1_vbus>; |
| 185 | status = "okay"; | 186 | status = "okay"; |
| 186 | }; | 187 | }; |
| 187 | 188 | ||
| 188 | &usbotg { | 189 | &usbotg { |
| 190 | disable-over-current; | ||
| 189 | pinctrl-names = "default"; | 191 | pinctrl-names = "default"; |
| 190 | pinctrl-0 = <&pinctrl_hummingboard_usbotg_id>; | 192 | pinctrl-0 = <&pinctrl_hummingboard_usbotg_id>; |
| 191 | vbus-supply = <®_usbotg_vbus>; | 193 | vbus-supply = <®_usbotg_vbus>; |
diff --git a/arch/arm/boot/dts/imx6qdl-cubox-i.dtsi b/arch/arm/boot/dts/imx6qdl-cubox-i.dtsi index e8e781656b3f..6a524ca011e7 100644 --- a/arch/arm/boot/dts/imx6qdl-cubox-i.dtsi +++ b/arch/arm/boot/dts/imx6qdl-cubox-i.dtsi | |||
| @@ -61,7 +61,7 @@ | |||
| 61 | 61 | ||
| 62 | sound-spdif { | 62 | sound-spdif { |
| 63 | compatible = "fsl,imx-audio-spdif"; | 63 | compatible = "fsl,imx-audio-spdif"; |
| 64 | model = "imx-spdif"; | 64 | model = "Integrated SPDIF"; |
| 65 | /* IMX6 doesn't implement this yet */ | 65 | /* IMX6 doesn't implement this yet */ |
| 66 | spdif-controller = <&spdif>; | 66 | spdif-controller = <&spdif>; |
| 67 | spdif-out; | 67 | spdif-out; |
| @@ -130,16 +130,23 @@ | |||
| 130 | fsl,pins = <MX6QDL_PAD_GPIO_17__SPDIF_OUT 0x13091>; | 130 | fsl,pins = <MX6QDL_PAD_GPIO_17__SPDIF_OUT 0x13091>; |
| 131 | }; | 131 | }; |
| 132 | 132 | ||
| 133 | pinctrl_cubox_i_usbh1: cubox-i-usbh1 { | ||
| 134 | fsl,pins = <MX6QDL_PAD_GPIO_3__USB_H1_OC 0x1b0b0>; | ||
| 135 | }; | ||
| 136 | |||
| 133 | pinctrl_cubox_i_usbh1_vbus: cubox-i-usbh1-vbus { | 137 | pinctrl_cubox_i_usbh1_vbus: cubox-i-usbh1-vbus { |
| 134 | fsl,pins = <MX6QDL_PAD_GPIO_0__GPIO1_IO00 0x4001b0b0>; | 138 | fsl,pins = <MX6QDL_PAD_GPIO_0__GPIO1_IO00 0x4001b0b0>; |
| 135 | }; | 139 | }; |
| 136 | 140 | ||
| 137 | pinctrl_cubox_i_usbotg_id: cubox-i-usbotg-id { | 141 | pinctrl_cubox_i_usbotg: cubox-i-usbotg { |
| 138 | /* | 142 | /* |
| 139 | * The Cubox-i pulls this low, but as it's pointless | 143 | * The Cubox-i pulls ID low, but as it's pointless |
| 140 | * leaving it as a pull-up, even if it is just 10uA. | 144 | * leaving it as a pull-up, even if it is just 10uA. |
| 141 | */ | 145 | */ |
| 142 | fsl,pins = <MX6QDL_PAD_GPIO_1__USB_OTG_ID 0x13059>; | 146 | fsl,pins = < |
| 147 | MX6QDL_PAD_GPIO_1__USB_OTG_ID 0x13059 | ||
| 148 | MX6QDL_PAD_KEY_COL4__USB_OTG_OC 0x1b0b0 | ||
| 149 | >; | ||
| 143 | }; | 150 | }; |
| 144 | 151 | ||
| 145 | pinctrl_cubox_i_usbotg_vbus: cubox-i-usbotg-vbus { | 152 | pinctrl_cubox_i_usbotg_vbus: cubox-i-usbotg-vbus { |
| @@ -173,13 +180,15 @@ | |||
| 173 | }; | 180 | }; |
| 174 | 181 | ||
| 175 | &usbh1 { | 182 | &usbh1 { |
| 183 | pinctrl-names = "default"; | ||
| 184 | pinctrl-0 = <&pinctrl_cubox_i_usbh1>; | ||
| 176 | vbus-supply = <®_usbh1_vbus>; | 185 | vbus-supply = <®_usbh1_vbus>; |
| 177 | status = "okay"; | 186 | status = "okay"; |
| 178 | }; | 187 | }; |
| 179 | 188 | ||
| 180 | &usbotg { | 189 | &usbotg { |
| 181 | pinctrl-names = "default"; | 190 | pinctrl-names = "default"; |
| 182 | pinctrl-0 = <&pinctrl_cubox_i_usbotg_id>; | 191 | pinctrl-0 = <&pinctrl_cubox_i_usbotg>; |
| 183 | vbus-supply = <®_usbotg_vbus>; | 192 | vbus-supply = <®_usbotg_vbus>; |
| 184 | status = "okay"; | 193 | status = "okay"; |
| 185 | }; | 194 | }; |
diff --git a/arch/arm/boot/dts/imx6qdl-microsom-ar8035.dtsi b/arch/arm/boot/dts/imx6qdl-microsom-ar8035.dtsi index d16066608e21..db9f45b2c573 100644 --- a/arch/arm/boot/dts/imx6qdl-microsom-ar8035.dtsi +++ b/arch/arm/boot/dts/imx6qdl-microsom-ar8035.dtsi | |||
| @@ -17,7 +17,7 @@ | |||
| 17 | enet { | 17 | enet { |
| 18 | pinctrl_microsom_enet_ar8035: microsom-enet-ar8035 { | 18 | pinctrl_microsom_enet_ar8035: microsom-enet-ar8035 { |
| 19 | fsl,pins = < | 19 | fsl,pins = < |
| 20 | MX6QDL_PAD_ENET_MDIO__ENET_MDIO 0x1b0b0 | 20 | MX6QDL_PAD_ENET_MDIO__ENET_MDIO 0x1b8b0 |
| 21 | MX6QDL_PAD_ENET_MDC__ENET_MDC 0x1b0b0 | 21 | MX6QDL_PAD_ENET_MDC__ENET_MDC 0x1b0b0 |
| 22 | /* AR8035 reset */ | 22 | /* AR8035 reset */ |
| 23 | MX6QDL_PAD_KEY_ROW4__GPIO4_IO15 0x130b0 | 23 | MX6QDL_PAD_KEY_ROW4__GPIO4_IO15 0x130b0 |
diff --git a/arch/arm/boot/dts/omap3-beagle.dts b/arch/arm/boot/dts/omap3-beagle.dts index 3c3e6da1deac..a9aae88b74f5 100644 --- a/arch/arm/boot/dts/omap3-beagle.dts +++ b/arch/arm/boot/dts/omap3-beagle.dts | |||
| @@ -292,6 +292,7 @@ | |||
| 292 | &uart3 { | 292 | &uart3 { |
| 293 | pinctrl-names = "default"; | 293 | pinctrl-names = "default"; |
| 294 | pinctrl-0 = <&uart3_pins>; | 294 | pinctrl-0 = <&uart3_pins>; |
| 295 | interrupts-extended = <&intc 74 &omap3_pmx_core OMAP3_UART3_RX>; | ||
| 295 | }; | 296 | }; |
| 296 | 297 | ||
| 297 | &gpio1 { | 298 | &gpio1 { |
diff --git a/arch/arm/boot/dts/omap3430-sdp.dts b/arch/arm/boot/dts/omap3430-sdp.dts index 02f69f4a8fd3..9bad94efe1c8 100644 --- a/arch/arm/boot/dts/omap3430-sdp.dts +++ b/arch/arm/boot/dts/omap3430-sdp.dts | |||
| @@ -107,7 +107,7 @@ | |||
| 107 | #address-cells = <1>; | 107 | #address-cells = <1>; |
| 108 | #size-cells = <1>; | 108 | #size-cells = <1>; |
| 109 | reg = <1 0 0x08000000>; | 109 | reg = <1 0 0x08000000>; |
| 110 | ti,nand-ecc-opt = "ham1"; | 110 | ti,nand-ecc-opt = "sw"; |
| 111 | nand-bus-width = <8>; | 111 | nand-bus-width = <8>; |
| 112 | gpmc,cs-on-ns = <0>; | 112 | gpmc,cs-on-ns = <0>; |
| 113 | gpmc,cs-rd-off-ns = <36>; | 113 | gpmc,cs-rd-off-ns = <36>; |
diff --git a/arch/arm/boot/dts/omap54xx-clocks.dtsi b/arch/arm/boot/dts/omap54xx-clocks.dtsi index e67a23b5d788..58c27466f012 100644 --- a/arch/arm/boot/dts/omap54xx-clocks.dtsi +++ b/arch/arm/boot/dts/omap54xx-clocks.dtsi | |||
| @@ -367,10 +367,12 @@ | |||
| 367 | 367 | ||
| 368 | l3_iclk_div: l3_iclk_div { | 368 | l3_iclk_div: l3_iclk_div { |
| 369 | #clock-cells = <0>; | 369 | #clock-cells = <0>; |
| 370 | compatible = "fixed-factor-clock"; | 370 | compatible = "ti,divider-clock"; |
| 371 | ti,max-div = <2>; | ||
| 372 | ti,bit-shift = <4>; | ||
| 373 | reg = <0x100>; | ||
| 371 | clocks = <&dpll_core_h12x2_ck>; | 374 | clocks = <&dpll_core_h12x2_ck>; |
| 372 | clock-mult = <1>; | 375 | ti,index-power-of-two; |
| 373 | clock-div = <1>; | ||
| 374 | }; | 376 | }; |
| 375 | 377 | ||
| 376 | gpu_l3_iclk: gpu_l3_iclk { | 378 | gpu_l3_iclk: gpu_l3_iclk { |
| @@ -383,10 +385,12 @@ | |||
| 383 | 385 | ||
| 384 | l4_root_clk_div: l4_root_clk_div { | 386 | l4_root_clk_div: l4_root_clk_div { |
| 385 | #clock-cells = <0>; | 387 | #clock-cells = <0>; |
| 386 | compatible = "fixed-factor-clock"; | 388 | compatible = "ti,divider-clock"; |
| 389 | ti,max-div = <2>; | ||
| 390 | ti,bit-shift = <8>; | ||
| 391 | reg = <0x100>; | ||
| 387 | clocks = <&l3_iclk_div>; | 392 | clocks = <&l3_iclk_div>; |
| 388 | clock-mult = <1>; | 393 | ti,index-power-of-two; |
| 389 | clock-div = <1>; | ||
| 390 | }; | 394 | }; |
| 391 | 395 | ||
| 392 | slimbus1_slimbus_clk: slimbus1_slimbus_clk { | 396 | slimbus1_slimbus_clk: slimbus1_slimbus_clk { |
diff --git a/arch/arm/boot/dts/twl6030.dtsi b/arch/arm/boot/dts/twl6030.dtsi index 2e3bd3172b23..55eb35f068fb 100644 --- a/arch/arm/boot/dts/twl6030.dtsi +++ b/arch/arm/boot/dts/twl6030.dtsi | |||
| @@ -83,10 +83,6 @@ | |||
| 83 | regulator-always-on; | 83 | regulator-always-on; |
| 84 | }; | 84 | }; |
| 85 | 85 | ||
| 86 | clk32kg: regulator-clk32kg { | ||
| 87 | compatible = "ti,twl6030-clk32kg"; | ||
| 88 | }; | ||
| 89 | |||
| 90 | twl_usb_comparator: usb-comparator { | 86 | twl_usb_comparator: usb-comparator { |
| 91 | compatible = "ti,twl6030-usb"; | 87 | compatible = "ti,twl6030-usb"; |
| 92 | interrupts = <4>, <10>; | 88 | interrupts = <4>, <10>; |
diff --git a/arch/arm/mach-bcm/Makefile b/arch/arm/mach-bcm/Makefile index 67c492aabf4d..b19a39652545 100644 --- a/arch/arm/mach-bcm/Makefile +++ b/arch/arm/mach-bcm/Makefile | |||
| @@ -36,5 +36,4 @@ obj-$(CONFIG_ARCH_BCM_5301X) += bcm_5301x.o | |||
| 36 | 36 | ||
| 37 | ifeq ($(CONFIG_ARCH_BRCMSTB),y) | 37 | ifeq ($(CONFIG_ARCH_BRCMSTB),y) |
| 38 | obj-y += brcmstb.o | 38 | obj-y += brcmstb.o |
| 39 | obj-$(CONFIG_SMP) += headsmp-brcmstb.o platsmp-brcmstb.o | ||
| 40 | endif | 39 | endif |
diff --git a/arch/arm/mach-bcm/brcmstb.h b/arch/arm/mach-bcm/brcmstb.h deleted file mode 100644 index ec0c3d112b36..000000000000 --- a/arch/arm/mach-bcm/brcmstb.h +++ /dev/null | |||
| @@ -1,19 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2013-2014 Broadcom Corporation | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or | ||
| 5 | * modify it under the terms of the GNU General Public License as | ||
| 6 | * published by the Free Software Foundation version 2. | ||
| 7 | * | ||
| 8 | * This program is distributed "as is" WITHOUT ANY WARRANTY of any | ||
| 9 | * kind, whether express or implied; without even the implied warranty | ||
| 10 | * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 11 | * GNU General Public License for more details. | ||
| 12 | */ | ||
| 13 | |||
| 14 | #ifndef __BRCMSTB_H__ | ||
| 15 | #define __BRCMSTB_H__ | ||
| 16 | |||
| 17 | void brcmstb_secondary_startup(void); | ||
| 18 | |||
| 19 | #endif /* __BRCMSTB_H__ */ | ||
diff --git a/arch/arm/mach-bcm/headsmp-brcmstb.S b/arch/arm/mach-bcm/headsmp-brcmstb.S deleted file mode 100644 index 199c1ea58248..000000000000 --- a/arch/arm/mach-bcm/headsmp-brcmstb.S +++ /dev/null | |||
| @@ -1,33 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * SMP boot code for secondary CPUs | ||
| 3 | * Based on arch/arm/mach-tegra/headsmp.S | ||
| 4 | * | ||
| 5 | * Copyright (C) 2010 NVIDIA, Inc. | ||
| 6 | * Copyright (C) 2013-2014 Broadcom Corporation | ||
| 7 | * | ||
| 8 | * This program is free software; you can redistribute it and/or | ||
| 9 | * modify it under the terms of the GNU General Public License as | ||
| 10 | * published by the Free Software Foundation version 2. | ||
| 11 | * | ||
| 12 | * This program is distributed "as is" WITHOUT ANY WARRANTY of any | ||
| 13 | * kind, whether express or implied; without even the implied warranty | ||
| 14 | * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 15 | * GNU General Public License for more details. | ||
| 16 | */ | ||
| 17 | |||
| 18 | #include <asm/assembler.h> | ||
| 19 | #include <linux/linkage.h> | ||
| 20 | #include <linux/init.h> | ||
| 21 | |||
| 22 | .section ".text.head", "ax" | ||
| 23 | |||
| 24 | ENTRY(brcmstb_secondary_startup) | ||
| 25 | /* | ||
| 26 | * Ensure CPU is in a sane state by disabling all IRQs and switching | ||
| 27 | * into SVC mode. | ||
| 28 | */ | ||
| 29 | setmode PSR_I_BIT | PSR_F_BIT | SVC_MODE, r0 | ||
| 30 | |||
| 31 | bl v7_invalidate_l1 | ||
| 32 | b secondary_startup | ||
| 33 | ENDPROC(brcmstb_secondary_startup) | ||
diff --git a/arch/arm/mach-bcm/platsmp-brcmstb.c b/arch/arm/mach-bcm/platsmp-brcmstb.c deleted file mode 100644 index af780e9c23a6..000000000000 --- a/arch/arm/mach-bcm/platsmp-brcmstb.c +++ /dev/null | |||
| @@ -1,363 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Broadcom STB CPU SMP and hotplug support for ARM | ||
| 3 | * | ||
| 4 | * Copyright (C) 2013-2014 Broadcom Corporation | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or | ||
| 7 | * modify it under the terms of the GNU General Public License as | ||
| 8 | * published by the Free Software Foundation version 2. | ||
| 9 | * | ||
| 10 | * This program is distributed "as is" WITHOUT ANY WARRANTY of any | ||
| 11 | * kind, whether express or implied; without even the implied warranty | ||
| 12 | * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 13 | * GNU General Public License for more details. | ||
| 14 | */ | ||
| 15 | |||
| 16 | #include <linux/delay.h> | ||
| 17 | #include <linux/errno.h> | ||
| 18 | #include <linux/init.h> | ||
| 19 | #include <linux/io.h> | ||
| 20 | #include <linux/of_address.h> | ||
| 21 | #include <linux/of_platform.h> | ||
| 22 | #include <linux/printk.h> | ||
| 23 | #include <linux/regmap.h> | ||
| 24 | #include <linux/smp.h> | ||
| 25 | #include <linux/mfd/syscon.h> | ||
| 26 | #include <linux/spinlock.h> | ||
| 27 | |||
| 28 | #include <asm/cacheflush.h> | ||
| 29 | #include <asm/cp15.h> | ||
| 30 | #include <asm/mach-types.h> | ||
| 31 | #include <asm/smp_plat.h> | ||
| 32 | |||
| 33 | #include "brcmstb.h" | ||
| 34 | |||
| 35 | enum { | ||
| 36 | ZONE_MAN_CLKEN_MASK = BIT(0), | ||
| 37 | ZONE_MAN_RESET_CNTL_MASK = BIT(1), | ||
| 38 | ZONE_MAN_MEM_PWR_MASK = BIT(4), | ||
| 39 | ZONE_RESERVED_1_MASK = BIT(5), | ||
| 40 | ZONE_MAN_ISO_CNTL_MASK = BIT(6), | ||
| 41 | ZONE_MANUAL_CONTROL_MASK = BIT(7), | ||
| 42 | ZONE_PWR_DN_REQ_MASK = BIT(9), | ||
| 43 | ZONE_PWR_UP_REQ_MASK = BIT(10), | ||
| 44 | ZONE_BLK_RST_ASSERT_MASK = BIT(12), | ||
| 45 | ZONE_PWR_OFF_STATE_MASK = BIT(25), | ||
| 46 | ZONE_PWR_ON_STATE_MASK = BIT(26), | ||
| 47 | ZONE_DPG_PWR_STATE_MASK = BIT(28), | ||
| 48 | ZONE_MEM_PWR_STATE_MASK = BIT(29), | ||
| 49 | ZONE_RESET_STATE_MASK = BIT(31), | ||
| 50 | CPU0_PWR_ZONE_CTRL_REG = 1, | ||
| 51 | CPU_RESET_CONFIG_REG = 2, | ||
| 52 | }; | ||
| 53 | |||
| 54 | static void __iomem *cpubiuctrl_block; | ||
| 55 | static void __iomem *hif_cont_block; | ||
| 56 | static u32 cpu0_pwr_zone_ctrl_reg; | ||
| 57 | static u32 cpu_rst_cfg_reg; | ||
| 58 | static u32 hif_cont_reg; | ||
| 59 | |||
| 60 | #ifdef CONFIG_HOTPLUG_CPU | ||
| 61 | static DEFINE_PER_CPU_ALIGNED(int, per_cpu_sw_state); | ||
| 62 | |||
| 63 | static int per_cpu_sw_state_rd(u32 cpu) | ||
| 64 | { | ||
| 65 | sync_cache_r(SHIFT_PERCPU_PTR(&per_cpu_sw_state, per_cpu_offset(cpu))); | ||
| 66 | return per_cpu(per_cpu_sw_state, cpu); | ||
| 67 | } | ||
| 68 | |||
| 69 | static void per_cpu_sw_state_wr(u32 cpu, int val) | ||
| 70 | { | ||
| 71 | per_cpu(per_cpu_sw_state, cpu) = val; | ||
| 72 | dmb(); | ||
| 73 | sync_cache_w(SHIFT_PERCPU_PTR(&per_cpu_sw_state, per_cpu_offset(cpu))); | ||
| 74 | dsb_sev(); | ||
| 75 | } | ||
| 76 | #else | ||
| 77 | static inline void per_cpu_sw_state_wr(u32 cpu, int val) { } | ||
| 78 | #endif | ||
| 79 | |||
| 80 | static void __iomem *pwr_ctrl_get_base(u32 cpu) | ||
| 81 | { | ||
| 82 | void __iomem *base = cpubiuctrl_block + cpu0_pwr_zone_ctrl_reg; | ||
| 83 | base += (cpu_logical_map(cpu) * 4); | ||
| 84 | return base; | ||
| 85 | } | ||
| 86 | |||
| 87 | static u32 pwr_ctrl_rd(u32 cpu) | ||
| 88 | { | ||
| 89 | void __iomem *base = pwr_ctrl_get_base(cpu); | ||
| 90 | return readl_relaxed(base); | ||
| 91 | } | ||
| 92 | |||
| 93 | static void pwr_ctrl_wr(u32 cpu, u32 val) | ||
| 94 | { | ||
| 95 | void __iomem *base = pwr_ctrl_get_base(cpu); | ||
| 96 | writel(val, base); | ||
| 97 | } | ||
| 98 | |||
| 99 | static void cpu_rst_cfg_set(u32 cpu, int set) | ||
| 100 | { | ||
| 101 | u32 val; | ||
| 102 | val = readl_relaxed(cpubiuctrl_block + cpu_rst_cfg_reg); | ||
| 103 | if (set) | ||
| 104 | val |= BIT(cpu_logical_map(cpu)); | ||
| 105 | else | ||
| 106 | val &= ~BIT(cpu_logical_map(cpu)); | ||
| 107 | writel_relaxed(val, cpubiuctrl_block + cpu_rst_cfg_reg); | ||
| 108 | } | ||
| 109 | |||
| 110 | static void cpu_set_boot_addr(u32 cpu, unsigned long boot_addr) | ||
| 111 | { | ||
| 112 | const int reg_ofs = cpu_logical_map(cpu) * 8; | ||
| 113 | writel_relaxed(0, hif_cont_block + hif_cont_reg + reg_ofs); | ||
| 114 | writel_relaxed(boot_addr, hif_cont_block + hif_cont_reg + 4 + reg_ofs); | ||
| 115 | } | ||
| 116 | |||
| 117 | static void brcmstb_cpu_boot(u32 cpu) | ||
| 118 | { | ||
| 119 | pr_info("SMP: Booting CPU%d...\n", cpu); | ||
| 120 | |||
| 121 | /* | ||
| 122 | * set the reset vector to point to the secondary_startup | ||
| 123 | * routine | ||
| 124 | */ | ||
| 125 | cpu_set_boot_addr(cpu, virt_to_phys(brcmstb_secondary_startup)); | ||
| 126 | |||
| 127 | /* unhalt the cpu */ | ||
| 128 | cpu_rst_cfg_set(cpu, 0); | ||
| 129 | } | ||
| 130 | |||
| 131 | static void brcmstb_cpu_power_on(u32 cpu) | ||
| 132 | { | ||
| 133 | /* | ||
| 134 | * The secondary cores power was cut, so we must go through | ||
| 135 | * power-on initialization. | ||
| 136 | */ | ||
| 137 | u32 tmp; | ||
| 138 | |||
| 139 | pr_info("SMP: Powering up CPU%d...\n", cpu); | ||
| 140 | |||
| 141 | /* Request zone power up */ | ||
| 142 | pwr_ctrl_wr(cpu, ZONE_PWR_UP_REQ_MASK); | ||
| 143 | |||
| 144 | /* Wait for the power up FSM to complete */ | ||
| 145 | do { | ||
| 146 | tmp = pwr_ctrl_rd(cpu); | ||
| 147 | } while (!(tmp & ZONE_PWR_ON_STATE_MASK)); | ||
| 148 | |||
| 149 | per_cpu_sw_state_wr(cpu, 1); | ||
| 150 | } | ||
| 151 | |||
| 152 | static int brcmstb_cpu_get_power_state(u32 cpu) | ||
| 153 | { | ||
| 154 | int tmp = pwr_ctrl_rd(cpu); | ||
| 155 | return (tmp & ZONE_RESET_STATE_MASK) ? 0 : 1; | ||
| 156 | } | ||
| 157 | |||
| 158 | #ifdef CONFIG_HOTPLUG_CPU | ||
| 159 | |||
| 160 | static void brcmstb_cpu_die(u32 cpu) | ||
| 161 | { | ||
| 162 | v7_exit_coherency_flush(all); | ||
| 163 | |||
| 164 | /* Prevent all interrupts from reaching this CPU. */ | ||
| 165 | arch_local_irq_disable(); | ||
| 166 | |||
| 167 | /* | ||
| 168 | * Final full barrier to ensure everything before this instruction has | ||
| 169 | * quiesced. | ||
| 170 | */ | ||
| 171 | isb(); | ||
| 172 | dsb(); | ||
| 173 | |||
| 174 | per_cpu_sw_state_wr(cpu, 0); | ||
| 175 | |||
| 176 | /* Sit and wait to die */ | ||
| 177 | wfi(); | ||
| 178 | |||
| 179 | /* We should never get here... */ | ||
| 180 | panic("Spurious interrupt on CPU %d received!\n", cpu); | ||
| 181 | } | ||
| 182 | |||
| 183 | static int brcmstb_cpu_kill(u32 cpu) | ||
| 184 | { | ||
| 185 | u32 tmp; | ||
| 186 | |||
| 187 | pr_info("SMP: Powering down CPU%d...\n", cpu); | ||
| 188 | |||
| 189 | while (per_cpu_sw_state_rd(cpu)) | ||
| 190 | ; | ||
| 191 | |||
| 192 | /* Program zone reset */ | ||
| 193 | pwr_ctrl_wr(cpu, ZONE_RESET_STATE_MASK | ZONE_BLK_RST_ASSERT_MASK | | ||
| 194 | ZONE_PWR_DN_REQ_MASK); | ||
| 195 | |||
| 196 | /* Verify zone reset */ | ||
| 197 | tmp = pwr_ctrl_rd(cpu); | ||
| 198 | if (!(tmp & ZONE_RESET_STATE_MASK)) | ||
| 199 | pr_err("%s: Zone reset bit for CPU %d not asserted!\n", | ||
| 200 | __func__, cpu); | ||
| 201 | |||
| 202 | /* Wait for power down */ | ||
| 203 | do { | ||
| 204 | tmp = pwr_ctrl_rd(cpu); | ||
| 205 | } while (!(tmp & ZONE_PWR_OFF_STATE_MASK)); | ||
| 206 | |||
| 207 | /* Settle-time from Broadcom-internal DVT reference code */ | ||
| 208 | udelay(7); | ||
| 209 | |||
| 210 | /* Assert reset on the CPU */ | ||
| 211 | cpu_rst_cfg_set(cpu, 1); | ||
| 212 | |||
| 213 | return 1; | ||
| 214 | } | ||
| 215 | |||
| 216 | #endif /* CONFIG_HOTPLUG_CPU */ | ||
| 217 | |||
| 218 | static int __init setup_hifcpubiuctrl_regs(struct device_node *np) | ||
| 219 | { | ||
| 220 | int rc = 0; | ||
| 221 | char *name; | ||
| 222 | struct device_node *syscon_np = NULL; | ||
| 223 | |||
| 224 | name = "syscon-cpu"; | ||
| 225 | |||
| 226 | syscon_np = of_parse_phandle(np, name, 0); | ||
| 227 | if (!syscon_np) { | ||
| 228 | pr_err("can't find phandle %s\n", name); | ||
| 229 | rc = -EINVAL; | ||
| 230 | goto cleanup; | ||
| 231 | } | ||
| 232 | |||
| 233 | cpubiuctrl_block = of_iomap(syscon_np, 0); | ||
| 234 | if (!cpubiuctrl_block) { | ||
| 235 | pr_err("iomap failed for cpubiuctrl_block\n"); | ||
| 236 | rc = -EINVAL; | ||
| 237 | goto cleanup; | ||
| 238 | } | ||
| 239 | |||
| 240 | rc = of_property_read_u32_index(np, name, CPU0_PWR_ZONE_CTRL_REG, | ||
| 241 | &cpu0_pwr_zone_ctrl_reg); | ||
| 242 | if (rc) { | ||
| 243 | pr_err("failed to read 1st entry from %s property (%d)\n", name, | ||
| 244 | rc); | ||
| 245 | rc = -EINVAL; | ||
| 246 | goto cleanup; | ||
| 247 | } | ||
| 248 | |||
| 249 | rc = of_property_read_u32_index(np, name, CPU_RESET_CONFIG_REG, | ||
| 250 | &cpu_rst_cfg_reg); | ||
| 251 | if (rc) { | ||
| 252 | pr_err("failed to read 2nd entry from %s property (%d)\n", name, | ||
| 253 | rc); | ||
| 254 | rc = -EINVAL; | ||
| 255 | goto cleanup; | ||
| 256 | } | ||
| 257 | |||
| 258 | cleanup: | ||
| 259 | if (syscon_np) | ||
| 260 | of_node_put(syscon_np); | ||
| 261 | |||
| 262 | return rc; | ||
| 263 | } | ||
| 264 | |||
| 265 | static int __init setup_hifcont_regs(struct device_node *np) | ||
| 266 | { | ||
| 267 | int rc = 0; | ||
| 268 | char *name; | ||
| 269 | struct device_node *syscon_np = NULL; | ||
| 270 | |||
| 271 | name = "syscon-cont"; | ||
| 272 | |||
| 273 | syscon_np = of_parse_phandle(np, name, 0); | ||
| 274 | if (!syscon_np) { | ||
| 275 | pr_err("can't find phandle %s\n", name); | ||
| 276 | rc = -EINVAL; | ||
| 277 | goto cleanup; | ||
| 278 | } | ||
| 279 | |||
| 280 | hif_cont_block = of_iomap(syscon_np, 0); | ||
| 281 | if (!hif_cont_block) { | ||
| 282 | pr_err("iomap failed for hif_cont_block\n"); | ||
| 283 | rc = -EINVAL; | ||
| 284 | goto cleanup; | ||
| 285 | } | ||
| 286 | |||
| 287 | /* offset is at top of hif_cont_block */ | ||
| 288 | hif_cont_reg = 0; | ||
| 289 | |||
| 290 | cleanup: | ||
| 291 | if (syscon_np) | ||
| 292 | of_node_put(syscon_np); | ||
| 293 | |||
| 294 | return rc; | ||
| 295 | } | ||
| 296 | |||
| 297 | static void __init brcmstb_cpu_ctrl_setup(unsigned int max_cpus) | ||
| 298 | { | ||
| 299 | int rc; | ||
| 300 | struct device_node *np; | ||
| 301 | char *name; | ||
| 302 | |||
| 303 | name = "brcm,brcmstb-smpboot"; | ||
| 304 | np = of_find_compatible_node(NULL, NULL, name); | ||
| 305 | if (!np) { | ||
| 306 | pr_err("can't find compatible node %s\n", name); | ||
| 307 | return; | ||
| 308 | } | ||
| 309 | |||
| 310 | rc = setup_hifcpubiuctrl_regs(np); | ||
| 311 | if (rc) | ||
| 312 | return; | ||
| 313 | |||
| 314 | rc = setup_hifcont_regs(np); | ||
| 315 | if (rc) | ||
| 316 | return; | ||
| 317 | } | ||
| 318 | |||
| 319 | static DEFINE_SPINLOCK(boot_lock); | ||
| 320 | |||
| 321 | static void brcmstb_secondary_init(unsigned int cpu) | ||
| 322 | { | ||
| 323 | /* | ||
| 324 | * Synchronise with the boot thread. | ||
| 325 | */ | ||
| 326 | spin_lock(&boot_lock); | ||
| 327 | spin_unlock(&boot_lock); | ||
| 328 | } | ||
| 329 | |||
| 330 | static int brcmstb_boot_secondary(unsigned int cpu, struct task_struct *idle) | ||
| 331 | { | ||
| 332 | /* | ||
| 333 | * set synchronisation state between this boot processor | ||
| 334 | * and the secondary one | ||
| 335 | */ | ||
| 336 | spin_lock(&boot_lock); | ||
| 337 | |||
| 338 | /* Bring up power to the core if necessary */ | ||
| 339 | if (brcmstb_cpu_get_power_state(cpu) == 0) | ||
| 340 | brcmstb_cpu_power_on(cpu); | ||
| 341 | |||
| 342 | brcmstb_cpu_boot(cpu); | ||
| 343 | |||
| 344 | /* | ||
| 345 | * now the secondary core is starting up let it run its | ||
| 346 | * calibrations, then wait for it to finish | ||
| 347 | */ | ||
| 348 | spin_unlock(&boot_lock); | ||
| 349 | |||
| 350 | return 0; | ||
| 351 | } | ||
| 352 | |||
| 353 | static struct smp_operations brcmstb_smp_ops __initdata = { | ||
| 354 | .smp_prepare_cpus = brcmstb_cpu_ctrl_setup, | ||
| 355 | .smp_secondary_init = brcmstb_secondary_init, | ||
| 356 | .smp_boot_secondary = brcmstb_boot_secondary, | ||
| 357 | #ifdef CONFIG_HOTPLUG_CPU | ||
| 358 | .cpu_kill = brcmstb_cpu_kill, | ||
| 359 | .cpu_die = brcmstb_cpu_die, | ||
| 360 | #endif | ||
| 361 | }; | ||
| 362 | |||
| 363 | CPU_METHOD_OF_DECLARE(brcmstb_smp, "brcm,brahma-b15", &brcmstb_smp_ops); | ||
diff --git a/arch/arm/mach-omap2/board-flash.c b/arch/arm/mach-omap2/board-flash.c index e87f2a83d6bf..2d245c2e641c 100644 --- a/arch/arm/mach-omap2/board-flash.c +++ b/arch/arm/mach-omap2/board-flash.c | |||
| @@ -142,7 +142,7 @@ __init board_nand_init(struct mtd_partition *nand_parts, u8 nr_parts, u8 cs, | |||
| 142 | board_nand_data.nr_parts = nr_parts; | 142 | board_nand_data.nr_parts = nr_parts; |
| 143 | board_nand_data.devsize = nand_type; | 143 | board_nand_data.devsize = nand_type; |
| 144 | 144 | ||
| 145 | board_nand_data.ecc_opt = OMAP_ECC_HAM1_CODE_HW; | 145 | board_nand_data.ecc_opt = OMAP_ECC_HAM1_CODE_SW; |
| 146 | gpmc_nand_init(&board_nand_data, gpmc_t); | 146 | gpmc_nand_init(&board_nand_data, gpmc_t); |
| 147 | } | 147 | } |
| 148 | #endif /* CONFIG_MTD_NAND_OMAP2 || CONFIG_MTD_NAND_OMAP2_MODULE */ | 148 | #endif /* CONFIG_MTD_NAND_OMAP2 || CONFIG_MTD_NAND_OMAP2_MODULE */ |
diff --git a/arch/arm/mach-omap2/gpmc-nand.c b/arch/arm/mach-omap2/gpmc-nand.c index 8897ad7035fd..cb7764314f17 100644 --- a/arch/arm/mach-omap2/gpmc-nand.c +++ b/arch/arm/mach-omap2/gpmc-nand.c | |||
| @@ -49,7 +49,8 @@ static bool gpmc_hwecc_bch_capable(enum omap_ecc ecc_opt) | |||
| 49 | return 0; | 49 | return 0; |
| 50 | 50 | ||
| 51 | /* legacy platforms support only HAM1 (1-bit Hamming) ECC scheme */ | 51 | /* legacy platforms support only HAM1 (1-bit Hamming) ECC scheme */ |
| 52 | if (ecc_opt == OMAP_ECC_HAM1_CODE_HW) | 52 | if (ecc_opt == OMAP_ECC_HAM1_CODE_HW || |
| 53 | ecc_opt == OMAP_ECC_HAM1_CODE_SW) | ||
| 53 | return 1; | 54 | return 1; |
| 54 | else | 55 | else |
| 55 | return 0; | 56 | return 0; |
diff --git a/arch/arm/mach-omap2/gpmc.c b/arch/arm/mach-omap2/gpmc.c index 8bc13380f0a0..9f42d5437fcc 100644 --- a/arch/arm/mach-omap2/gpmc.c +++ b/arch/arm/mach-omap2/gpmc.c | |||
| @@ -1403,8 +1403,11 @@ static int gpmc_probe_nand_child(struct platform_device *pdev, | |||
| 1403 | pr_err("%s: ti,nand-ecc-opt not found\n", __func__); | 1403 | pr_err("%s: ti,nand-ecc-opt not found\n", __func__); |
| 1404 | return -ENODEV; | 1404 | return -ENODEV; |
| 1405 | } | 1405 | } |
| 1406 | if (!strcmp(s, "ham1") || !strcmp(s, "sw") || | 1406 | |
| 1407 | !strcmp(s, "hw") || !strcmp(s, "hw-romcode")) | 1407 | if (!strcmp(s, "sw")) |
| 1408 | gpmc_nand_data->ecc_opt = OMAP_ECC_HAM1_CODE_SW; | ||
| 1409 | else if (!strcmp(s, "ham1") || | ||
| 1410 | !strcmp(s, "hw") || !strcmp(s, "hw-romcode")) | ||
| 1408 | gpmc_nand_data->ecc_opt = | 1411 | gpmc_nand_data->ecc_opt = |
| 1409 | OMAP_ECC_HAM1_CODE_HW; | 1412 | OMAP_ECC_HAM1_CODE_HW; |
| 1410 | else if (!strcmp(s, "bch4")) | 1413 | else if (!strcmp(s, "bch4")) |
diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c index d42022f2a71e..53841dea80ea 100644 --- a/arch/arm/mach-omap2/id.c +++ b/arch/arm/mach-omap2/id.c | |||
| @@ -663,7 +663,7 @@ void __init dra7xxx_check_revision(void) | |||
| 663 | 663 | ||
| 664 | default: | 664 | default: |
| 665 | /* Unknown default to latest silicon rev as default*/ | 665 | /* Unknown default to latest silicon rev as default*/ |
| 666 | pr_warn("%s: unknown idcode=0x%08x (hawkeye=0x%08x,rev=0x%d)\n", | 666 | pr_warn("%s: unknown idcode=0x%08x (hawkeye=0x%08x,rev=0x%x)\n", |
| 667 | __func__, idcode, hawkeye, rev); | 667 | __func__, idcode, hawkeye, rev); |
| 668 | omap_revision = DRA752_REV_ES1_1; | 668 | omap_revision = DRA752_REV_ES1_1; |
| 669 | } | 669 | } |
diff --git a/arch/arm/mach-omap2/omap_device.c b/arch/arm/mach-omap2/omap_device.c index 01ef59def44b..d22c30d3ccfa 100644 --- a/arch/arm/mach-omap2/omap_device.c +++ b/arch/arm/mach-omap2/omap_device.c | |||
| @@ -56,7 +56,7 @@ static void _add_clkdev(struct omap_device *od, const char *clk_alias, | |||
| 56 | 56 | ||
| 57 | r = clk_get_sys(dev_name(&od->pdev->dev), clk_alias); | 57 | r = clk_get_sys(dev_name(&od->pdev->dev), clk_alias); |
| 58 | if (!IS_ERR(r)) { | 58 | if (!IS_ERR(r)) { |
| 59 | dev_warn(&od->pdev->dev, | 59 | dev_dbg(&od->pdev->dev, |
| 60 | "alias %s already exists\n", clk_alias); | 60 | "alias %s already exists\n", clk_alias); |
| 61 | clk_put(r); | 61 | clk_put(r); |
| 62 | return; | 62 | return; |
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index bc2466cc33b9..8fd87a3055bf 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c | |||
| @@ -2185,6 +2185,8 @@ static int _enable(struct omap_hwmod *oh) | |||
| 2185 | oh->mux->pads_dynamic))) { | 2185 | oh->mux->pads_dynamic))) { |
| 2186 | omap_hwmod_mux(oh->mux, _HWMOD_STATE_ENABLED); | 2186 | omap_hwmod_mux(oh->mux, _HWMOD_STATE_ENABLED); |
| 2187 | _reconfigure_io_chain(); | 2187 | _reconfigure_io_chain(); |
| 2188 | } else if (oh->flags & HWMOD_FORCE_MSTANDBY) { | ||
| 2189 | _reconfigure_io_chain(); | ||
| 2188 | } | 2190 | } |
| 2189 | 2191 | ||
| 2190 | _add_initiator_dep(oh, mpu_oh); | 2192 | _add_initiator_dep(oh, mpu_oh); |
| @@ -2291,6 +2293,8 @@ static int _idle(struct omap_hwmod *oh) | |||
| 2291 | if (oh->mux && oh->mux->pads_dynamic) { | 2293 | if (oh->mux && oh->mux->pads_dynamic) { |
| 2292 | omap_hwmod_mux(oh->mux, _HWMOD_STATE_IDLE); | 2294 | omap_hwmod_mux(oh->mux, _HWMOD_STATE_IDLE); |
| 2293 | _reconfigure_io_chain(); | 2295 | _reconfigure_io_chain(); |
| 2296 | } else if (oh->flags & HWMOD_FORCE_MSTANDBY) { | ||
| 2297 | _reconfigure_io_chain(); | ||
| 2294 | } | 2298 | } |
| 2295 | 2299 | ||
| 2296 | oh->_state = _HWMOD_STATE_IDLE; | 2300 | oh->_state = _HWMOD_STATE_IDLE; |
diff --git a/arch/arm/mach-shmobile/clock-r8a7790.c b/arch/arm/mach-shmobile/clock-r8a7790.c index 17435c1aa2fe..126ddafad526 100644 --- a/arch/arm/mach-shmobile/clock-r8a7790.c +++ b/arch/arm/mach-shmobile/clock-r8a7790.c | |||
| @@ -183,8 +183,8 @@ enum { | |||
| 183 | 183 | ||
| 184 | static struct clk div4_clks[DIV4_NR] = { | 184 | static struct clk div4_clks[DIV4_NR] = { |
| 185 | [DIV4_SDH] = SH_CLK_DIV4(&pll1_clk, SDCKCR, 8, 0x0dff, CLK_ENABLE_ON_INIT), | 185 | [DIV4_SDH] = SH_CLK_DIV4(&pll1_clk, SDCKCR, 8, 0x0dff, CLK_ENABLE_ON_INIT), |
| 186 | [DIV4_SD0] = SH_CLK_DIV4(&pll1_clk, SDCKCR, 4, 0x1de0, CLK_ENABLE_ON_INIT), | 186 | [DIV4_SD0] = SH_CLK_DIV4(&pll1_clk, SDCKCR, 4, 0x1df0, CLK_ENABLE_ON_INIT), |
| 187 | [DIV4_SD1] = SH_CLK_DIV4(&pll1_clk, SDCKCR, 0, 0x1de0, CLK_ENABLE_ON_INIT), | 187 | [DIV4_SD1] = SH_CLK_DIV4(&pll1_clk, SDCKCR, 0, 0x1df0, CLK_ENABLE_ON_INIT), |
| 188 | }; | 188 | }; |
| 189 | 189 | ||
| 190 | /* DIV6 clocks */ | 190 | /* DIV6 clocks */ |
diff --git a/arch/arm/mach-shmobile/clock-r8a7791.c b/arch/arm/mach-shmobile/clock-r8a7791.c index 10e193d707f5..453b23129cfa 100644 --- a/arch/arm/mach-shmobile/clock-r8a7791.c +++ b/arch/arm/mach-shmobile/clock-r8a7791.c | |||
| @@ -152,7 +152,7 @@ enum { | |||
| 152 | 152 | ||
| 153 | static struct clk div4_clks[DIV4_NR] = { | 153 | static struct clk div4_clks[DIV4_NR] = { |
| 154 | [DIV4_SDH] = SH_CLK_DIV4(&pll1_clk, SDCKCR, 8, 0x0dff, CLK_ENABLE_ON_INIT), | 154 | [DIV4_SDH] = SH_CLK_DIV4(&pll1_clk, SDCKCR, 8, 0x0dff, CLK_ENABLE_ON_INIT), |
| 155 | [DIV4_SD0] = SH_CLK_DIV4(&pll1_clk, SDCKCR, 4, 0x1de0, CLK_ENABLE_ON_INIT), | 155 | [DIV4_SD0] = SH_CLK_DIV4(&pll1_clk, SDCKCR, 4, 0x1df0, CLK_ENABLE_ON_INIT), |
| 156 | }; | 156 | }; |
| 157 | 157 | ||
| 158 | /* DIV6 clocks */ | 158 | /* DIV6 clocks */ |
diff --git a/arch/arm/mach-shmobile/clock-sh73a0.c b/arch/arm/mach-shmobile/clock-sh73a0.c index d8c4048b9e33..02a6f45a0b9e 100644 --- a/arch/arm/mach-shmobile/clock-sh73a0.c +++ b/arch/arm/mach-shmobile/clock-sh73a0.c | |||
| @@ -644,7 +644,7 @@ static struct clk_lookup lookups[] = { | |||
| 644 | CLKDEV_DEV_ID("sh-sci.5", &mstp_clks[MSTP207]), /* SCIFA5 */ | 644 | CLKDEV_DEV_ID("sh-sci.5", &mstp_clks[MSTP207]), /* SCIFA5 */ |
| 645 | CLKDEV_DEV_ID("e6cb0000.serial", &mstp_clks[MSTP207]), /* SCIFA5 */ | 645 | CLKDEV_DEV_ID("e6cb0000.serial", &mstp_clks[MSTP207]), /* SCIFA5 */ |
| 646 | CLKDEV_DEV_ID("sh-sci.8", &mstp_clks[MSTP206]), /* SCIFB */ | 646 | CLKDEV_DEV_ID("sh-sci.8", &mstp_clks[MSTP206]), /* SCIFB */ |
| 647 | CLKDEV_DEV_ID("0xe6c3000.serial", &mstp_clks[MSTP206]), /* SCIFB */ | 647 | CLKDEV_DEV_ID("e6c3000.serial", &mstp_clks[MSTP206]), /* SCIFB */ |
| 648 | CLKDEV_DEV_ID("sh-sci.0", &mstp_clks[MSTP204]), /* SCIFA0 */ | 648 | CLKDEV_DEV_ID("sh-sci.0", &mstp_clks[MSTP204]), /* SCIFA0 */ |
| 649 | CLKDEV_DEV_ID("e6c40000.serial", &mstp_clks[MSTP204]), /* SCIFA0 */ | 649 | CLKDEV_DEV_ID("e6c40000.serial", &mstp_clks[MSTP204]), /* SCIFA0 */ |
| 650 | CLKDEV_DEV_ID("sh-sci.1", &mstp_clks[MSTP203]), /* SCIFA1 */ | 650 | CLKDEV_DEV_ID("sh-sci.1", &mstp_clks[MSTP203]), /* SCIFA1 */ |
diff --git a/drivers/mtd/nand/omap2.c b/drivers/mtd/nand/omap2.c index f0ed92e210a1..5967b385141b 100644 --- a/drivers/mtd/nand/omap2.c +++ b/drivers/mtd/nand/omap2.c | |||
| @@ -931,7 +931,7 @@ static int omap_calculate_ecc(struct mtd_info *mtd, const u_char *dat, | |||
| 931 | u32 val; | 931 | u32 val; |
| 932 | 932 | ||
| 933 | val = readl(info->reg.gpmc_ecc_config); | 933 | val = readl(info->reg.gpmc_ecc_config); |
| 934 | if (((val >> ECC_CONFIG_CS_SHIFT) & ~CS_MASK) != info->gpmc_cs) | 934 | if (((val >> ECC_CONFIG_CS_SHIFT) & CS_MASK) != info->gpmc_cs) |
| 935 | return -EINVAL; | 935 | return -EINVAL; |
| 936 | 936 | ||
| 937 | /* read ecc result */ | 937 | /* read ecc result */ |
| @@ -1794,9 +1794,12 @@ static int omap_nand_probe(struct platform_device *pdev) | |||
| 1794 | } | 1794 | } |
| 1795 | 1795 | ||
| 1796 | /* populate MTD interface based on ECC scheme */ | 1796 | /* populate MTD interface based on ECC scheme */ |
| 1797 | nand_chip->ecc.layout = &omap_oobinfo; | ||
| 1798 | ecclayout = &omap_oobinfo; | 1797 | ecclayout = &omap_oobinfo; |
| 1799 | switch (info->ecc_opt) { | 1798 | switch (info->ecc_opt) { |
| 1799 | case OMAP_ECC_HAM1_CODE_SW: | ||
| 1800 | nand_chip->ecc.mode = NAND_ECC_SOFT; | ||
| 1801 | break; | ||
| 1802 | |||
| 1800 | case OMAP_ECC_HAM1_CODE_HW: | 1803 | case OMAP_ECC_HAM1_CODE_HW: |
| 1801 | pr_info("nand: using OMAP_ECC_HAM1_CODE_HW\n"); | 1804 | pr_info("nand: using OMAP_ECC_HAM1_CODE_HW\n"); |
| 1802 | nand_chip->ecc.mode = NAND_ECC_HW; | 1805 | nand_chip->ecc.mode = NAND_ECC_HW; |
| @@ -1848,7 +1851,7 @@ static int omap_nand_probe(struct platform_device *pdev) | |||
| 1848 | nand_chip->ecc.priv = nand_bch_init(mtd, | 1851 | nand_chip->ecc.priv = nand_bch_init(mtd, |
| 1849 | nand_chip->ecc.size, | 1852 | nand_chip->ecc.size, |
| 1850 | nand_chip->ecc.bytes, | 1853 | nand_chip->ecc.bytes, |
| 1851 | &nand_chip->ecc.layout); | 1854 | &ecclayout); |
| 1852 | if (!nand_chip->ecc.priv) { | 1855 | if (!nand_chip->ecc.priv) { |
| 1853 | pr_err("nand: error: unable to use s/w BCH library\n"); | 1856 | pr_err("nand: error: unable to use s/w BCH library\n"); |
| 1854 | err = -EINVAL; | 1857 | err = -EINVAL; |
| @@ -1923,7 +1926,7 @@ static int omap_nand_probe(struct platform_device *pdev) | |||
| 1923 | nand_chip->ecc.priv = nand_bch_init(mtd, | 1926 | nand_chip->ecc.priv = nand_bch_init(mtd, |
| 1924 | nand_chip->ecc.size, | 1927 | nand_chip->ecc.size, |
| 1925 | nand_chip->ecc.bytes, | 1928 | nand_chip->ecc.bytes, |
| 1926 | &nand_chip->ecc.layout); | 1929 | &ecclayout); |
| 1927 | if (!nand_chip->ecc.priv) { | 1930 | if (!nand_chip->ecc.priv) { |
| 1928 | pr_err("nand: error: unable to use s/w BCH library\n"); | 1931 | pr_err("nand: error: unable to use s/w BCH library\n"); |
| 1929 | err = -EINVAL; | 1932 | err = -EINVAL; |
| @@ -2012,6 +2015,9 @@ static int omap_nand_probe(struct platform_device *pdev) | |||
| 2012 | goto return_error; | 2015 | goto return_error; |
| 2013 | } | 2016 | } |
| 2014 | 2017 | ||
| 2018 | if (info->ecc_opt == OMAP_ECC_HAM1_CODE_SW) | ||
| 2019 | goto scan_tail; | ||
| 2020 | |||
| 2015 | /* all OOB bytes from oobfree->offset till end off OOB are free */ | 2021 | /* all OOB bytes from oobfree->offset till end off OOB are free */ |
| 2016 | ecclayout->oobfree->length = mtd->oobsize - ecclayout->oobfree->offset; | 2022 | ecclayout->oobfree->length = mtd->oobsize - ecclayout->oobfree->offset; |
| 2017 | /* check if NAND device's OOB is enough to store ECC signatures */ | 2023 | /* check if NAND device's OOB is enough to store ECC signatures */ |
| @@ -2021,7 +2027,9 @@ static int omap_nand_probe(struct platform_device *pdev) | |||
| 2021 | err = -EINVAL; | 2027 | err = -EINVAL; |
| 2022 | goto return_error; | 2028 | goto return_error; |
| 2023 | } | 2029 | } |
| 2030 | nand_chip->ecc.layout = ecclayout; | ||
| 2024 | 2031 | ||
| 2032 | scan_tail: | ||
| 2025 | /* second phase scan */ | 2033 | /* second phase scan */ |
| 2026 | if (nand_scan_tail(mtd)) { | 2034 | if (nand_scan_tail(mtd)) { |
| 2027 | err = -ENXIO; | 2035 | err = -ENXIO; |
diff --git a/include/linux/platform_data/mtd-nand-omap2.h b/include/linux/platform_data/mtd-nand-omap2.h index 660c029d694f..16ec262dfcc8 100644 --- a/include/linux/platform_data/mtd-nand-omap2.h +++ b/include/linux/platform_data/mtd-nand-omap2.h | |||
| @@ -21,8 +21,17 @@ enum nand_io { | |||
| 21 | }; | 21 | }; |
| 22 | 22 | ||
| 23 | enum omap_ecc { | 23 | enum omap_ecc { |
| 24 | /* 1-bit ECC calculation by GPMC, Error detection by Software */ | 24 | /* |
| 25 | OMAP_ECC_HAM1_CODE_HW = 0, | 25 | * 1-bit ECC: calculation and correction by SW |
| 26 | * ECC stored at end of spare area | ||
| 27 | */ | ||
| 28 | OMAP_ECC_HAM1_CODE_SW = 0, | ||
| 29 | |||
| 30 | /* | ||
| 31 | * 1-bit ECC: calculation by GPMC, Error detection by Software | ||
| 32 | * ECC layout compatible with ROM code layout | ||
| 33 | */ | ||
| 34 | OMAP_ECC_HAM1_CODE_HW, | ||
| 26 | /* 4-bit ECC calculation by GPMC, Error detection by Software */ | 35 | /* 4-bit ECC calculation by GPMC, Error detection by Software */ |
| 27 | OMAP_ECC_BCH4_CODE_HW_DETECTION_SW, | 36 | OMAP_ECC_BCH4_CODE_HW_DETECTION_SW, |
| 28 | /* 4-bit ECC calculation by GPMC, Error detection by ELM */ | 37 | /* 4-bit ECC calculation by GPMC, Error detection by ELM */ |
