diff options
author | Olof Johansson <olof@lixom.net> | 2014-08-27 18:08:28 -0400 |
---|---|---|
committer | Olof Johansson <olof@lixom.net> | 2014-08-27 18:08:28 -0400 |
commit | c2e1da63e6231d929f478b0bb5b44ad0bc59f646 (patch) | |
tree | 22051f30f1465ea24f4f15bdc4ed2895d5c22ac0 | |
parent | 541555e95cc9ca321606b72dc0c670a764713669 (diff) | |
parent | 8fd46439e1f5a7f86d76a08733459b74debd9468 (diff) |
Merge tag 'omap-for-v3.17/fixes-against-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap into fixes
Merge "omap fixes against v3.17-rc2" from Tony Lindgren:
Fixes for omaps, mostly to revert NAND back to using software ECC
by default as that's what many boards expect. Also fixes for omap5
clocks, PM wake-up events, GPIO interrupt cells for dra7, and few
other minor fixes.
* tag 'omap-for-v3.17/fixes-against-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap:
ARM: dts: omap54xx-clocks: Fix the l3 and l4 clock rates
ARM: OMAP2+: hwmod: Rearm wake-up interrupts for DT when MUSB is idled
ARM: dts: Enable UART wake-up events for beagleboard
ARM: dts: Remove twl6030 clk32g "regulator"
ARM: OMAP2+: omap_device: remove warning that clk alias already exists
ARM: OMAP: fix %d confusingly prefixed with 0x in format string
ARM: dts: DRA7: fix interrupt-cells for GPIO
mtd: nand: omap: Fix 1-bit Hamming code scheme, omap_calculate_ecc()
ARM: dts: omap3430-sdp: Revert to using software ECC for NAND
ARM: OMAP2+: GPMC: Support Software ECC scheme via DT
mtd: nand: omap: Revert to using software ECC by default
-rw-r--r-- | Documentation/devicetree/bindings/mtd/gpmc-nand.txt | 2 | ||||
-rw-r--r-- | arch/arm/boot/dts/dra7.dtsi | 16 | ||||
-rw-r--r-- | arch/arm/boot/dts/omap3-beagle.dts | 1 | ||||
-rw-r--r-- | arch/arm/boot/dts/omap3430-sdp.dts | 2 | ||||
-rw-r--r-- | arch/arm/boot/dts/omap54xx-clocks.dtsi | 16 | ||||
-rw-r--r-- | arch/arm/boot/dts/twl6030.dtsi | 4 | ||||
-rw-r--r-- | arch/arm/mach-omap2/board-flash.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-omap2/gpmc-nand.c | 3 | ||||
-rw-r--r-- | arch/arm/mach-omap2/gpmc.c | 7 | ||||
-rw-r--r-- | arch/arm/mach-omap2/id.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-omap2/omap_device.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-omap2/omap_hwmod.c | 4 | ||||
-rw-r--r-- | drivers/mtd/nand/omap2.c | 16 | ||||
-rw-r--r-- | include/linux/platform_data/mtd-nand-omap2.h | 13 |
14 files changed, 58 insertions, 32 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/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/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-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 6c074f37cdd2..da1b256caccc 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/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 */ |