126998f4b50b06ffde1d17a5c4f34fe1671a3c72
[openwrt/staging/chunkeey.git] / target / linux / sunxi / patches-4.1 / 124-mtd-nand-sunxi-fallback-to-chip-config.patch
1 From de994d9c849ca0ca020fccfa1916afcde7f313f2 Mon Sep 17 00:00:00 2001
2 From: Boris BREZILLON <boris.brezillon@free-electrons.com>
3 Date: Sun, 24 Aug 2014 10:40:44 +0200
4 Subject: [PATCH] mtd: nand: sunxi: Fallback to chip config when partition
5 config is not available
6
7 Fallback to chip config for partitions where ecc/rnd config are not
8 specified in the device tree.
9
10 Signed-off-by: Boris BREZILLON <boris.brezillon@free-electrons.com>
11 Signed-off-by: Hans de Goede <hdegoede@redhat.com>
12 ---
13 drivers/mtd/nand/sunxi_nand.c | 27 ++++++++++++++++++---------
14 1 file changed, 18 insertions(+), 9 deletions(-)
15
16 --- a/drivers/mtd/nand/sunxi_nand.c
17 +++ b/drivers/mtd/nand/sunxi_nand.c
18 @@ -1711,28 +1711,37 @@ static void sunxi_nand_part_release(stru
19 struct nand_part *sunxi_ofnandpart_parse(void *priv, struct mtd_info *master,
20 struct device_node *pp)
21 {
22 + struct nand_chip *chip = master->priv;
23 struct sunxi_nand_part *part;
24 int ret;
25
26 part = kzalloc(sizeof(*part), GFP_KERNEL);
27 part->part.release = sunxi_nand_part_release;
28
29 - ret = sunxi_nand_ecc_init(master, &part->ecc, pp);
30 - if (ret)
31 - goto err;
32 -
33 - ret = sunxi_nand_rnd_init(master, &part->rnd, &part->ecc, pp);
34 - if (ret) {
35 - sunxi_nand_ecc_cleanup(&part->ecc);
36 - goto err;
37 + if (of_find_property(pp, "nand-ecc-mode", NULL)) {
38 + ret = sunxi_nand_ecc_init(master, &part->ecc, pp);
39 + if (ret)
40 + goto err;
41 +
42 + part->part.ecc = &part->ecc;
43 }
44
45 - part->part.ecc = &part->ecc;
46 - part->part.rnd = &part->rnd;
47 + if (of_find_property(pp, "nand-rnd-mode", NULL)) {
48 + ret = sunxi_nand_rnd_init(master, &part->rnd,
49 + part->part.ecc ? part->part.ecc : &chip->ecc,
50 + pp);
51 + if (ret)
52 + goto err;
53 +
54 + part->part.rnd = &part->rnd;
55 + }
56
57 return &part->part;
58
59 err:
60 + if (part->part.ecc)
61 + sunxi_nand_ecc_cleanup(part->part.ecc);
62 +
63 kfree(part);
64 return ERR_PTR(ret);
65 }