sunxi: add support for 4.1
[openwrt.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 diff --git a/drivers/mtd/nand/sunxi_nand.c b/drivers/mtd/nand/sunxi_nand.c
17 index 2f6ab39..74f2caf 100644
18 --- a/drivers/mtd/nand/sunxi_nand.c
19 +++ b/drivers/mtd/nand/sunxi_nand.c
20 @@ -1711,28 +1711,37 @@ static void sunxi_nand_part_release(struct nand_part *part)
21  struct nand_part *sunxi_ofnandpart_parse(void *priv, struct mtd_info *master,
22                                          struct device_node *pp)
23  {
24 +       struct nand_chip *chip = master->priv;
25         struct sunxi_nand_part *part;
26         int ret;
27  
28         part = kzalloc(sizeof(*part), GFP_KERNEL);
29         part->part.release = sunxi_nand_part_release;
30  
31 -       ret = sunxi_nand_ecc_init(master, &part->ecc, pp);
32 -       if (ret)
33 -               goto err;
34 +       if (of_find_property(pp, "nand-ecc-mode", NULL)) {
35 +               ret = sunxi_nand_ecc_init(master, &part->ecc, pp);
36 +               if (ret)
37 +                       goto err;
38  
39 -       ret = sunxi_nand_rnd_init(master, &part->rnd, &part->ecc, pp);
40 -       if (ret) {
41 -               sunxi_nand_ecc_cleanup(&part->ecc);
42 -               goto err;
43 +               part->part.ecc = &part->ecc;
44         }
45  
46 -       part->part.ecc = &part->ecc;
47 -       part->part.rnd = &part->rnd;
48 +       if (of_find_property(pp, "nand-rnd-mode", NULL)) {
49 +               ret = sunxi_nand_rnd_init(master, &part->rnd,
50 +                               part->part.ecc ? part->part.ecc : &chip->ecc,
51 +                               pp);
52 +               if (ret)
53 +                       goto err;
54 +
55 +               part->part.rnd = &part->rnd;
56 +       }
57  
58         return &part->part;
59  
60  err:
61 +       if (part->part.ecc)
62 +               sunxi_nand_ecc_cleanup(part->part.ecc);
63 +
64         kfree(part);
65         return ERR_PTR(ret);
66  }