[brcm63xx] add preliminary support for 3.6 kernel
[openwrt.git] / target / linux / brcm63xx / patches-3.6 / 436-MTD-bcm63xxpart-allow-passing-a-caldata-offset.patch
1 From 8ab86c5dc38ad4de1442e50e0adbc354d9184d71 Mon Sep 17 00:00:00 2001
2 From: Jonas Gorski <jonas.gorski@gmail.com>
3 Date: Tue, 1 May 2012 14:38:41 +0200
4 Subject: [PATCH 68/79] MTD: bcm63xxpart: allow passing a caldata offset
5
6 Allow bcm63xxpart to receive a caldata offset if calibration data is
7 contained in flash.
8 ---
9  drivers/mtd/bcm63xxpart.c      |   47 ++++++++++++++++++++++++++++++++++++++--
10  include/linux/mtd/partitions.h |    2 ++
11  2 files changed, 47 insertions(+), 2 deletions(-)
12
13 --- a/drivers/mtd/bcm63xxpart.c
14 +++ b/drivers/mtd/bcm63xxpart.c
15 @@ -80,6 +80,8 @@ static int bcm63xx_parse_cfe_partitions(
16         unsigned int rootfslen, kernellen, sparelen, totallen;
17         unsigned int cfelen, nvramlen;
18         unsigned int cfe_erasesize;
19 +       unsigned int caldatalen1 = 0, caldataaddr1 = 0;
20 +       unsigned int caldatalen2 = 0, caldataaddr2 = 0;
21         int i;
22         u32 computed_crc;
23         bool rootfs_first = false;
24 @@ -94,6 +96,23 @@ static int bcm63xx_parse_cfe_partitions(
25         nvramlen = bcm63xx_nvram_get_psi_size() * 1024;
26         nvramlen = roundup(nvramlen, cfe_erasesize);
27  
28 +       if (data) {
29 +               if (data->caldata[0]) {
30 +                       caldatalen1 = cfe_erasesize;
31 +                       caldataaddr1 = rounddown(data->caldata[0],
32 +                                                cfe_erasesize);
33 +               }
34 +               if (data->caldata[1]) {
35 +                       caldatalen2 = cfe_erasesize;
36 +                       caldataaddr2 = rounddown(data->caldata[1],
37 +                                                cfe_erasesize);
38 +               }
39 +               if (caldataaddr1 == caldataaddr2) {
40 +                       caldataaddr2 = 0;
41 +                       caldatalen2 = 0;
42 +               }
43 +       }
44 +
45         /* Allocate memory for buffer */
46         buf = vmalloc(sizeof(struct bcm_tag));
47         if (!buf)
48 @@ -144,7 +163,7 @@ static int bcm63xx_parse_cfe_partitions(
49                 rootfsaddr = 0;
50                 spareaddr = cfelen;
51         }
52 -       sparelen = master->size - spareaddr - nvramlen;
53 +       sparelen = master->size - spareaddr - nvramlen - caldatalen1 - caldatalen2;
54  
55         /* Determine number of partitions */
56         if (rootfslen > 0)
57 @@ -153,6 +172,12 @@ static int bcm63xx_parse_cfe_partitions(
58         if (kernellen > 0)
59                 nrparts++;
60  
61 +       if (caldatalen1 > 0)
62 +               nrparts++;
63 +
64 +       if (caldatalen2 > 0)
65 +               nrparts++;
66 +
67         /* Ask kernel for more memory */
68         parts = kzalloc(sizeof(*parts) * nrparts + 10 * nrparts, GFP_KERNEL);
69         if (!parts) {
70 @@ -190,6 +215,23 @@ static int bcm63xx_parse_cfe_partitions(
71                 curpart++;
72         }
73  
74 +       if (caldatalen1 > 0) {
75 +               if (caldatalen2 > 0)
76 +                       parts[curpart].name = "cal_data1";
77 +               else
78 +                       parts[curpart].name = "cal_data";
79 +               parts[curpart].offset = caldataaddr1;
80 +               parts[curpart].size = caldatalen1;
81 +               curpart++;
82 +       }
83 +
84 +       if (caldatalen2 > 0) {
85 +               parts[curpart].name = "cal_data2";
86 +               parts[curpart].offset = caldataaddr2;
87 +               parts[curpart].size = caldatalen2;
88 +               curpart++;
89 +       }
90 +
91         parts[curpart].name = "nvram";
92         parts[curpart].offset = master->size - nvramlen;
93         parts[curpart].size = nvramlen;
94 @@ -198,7 +240,8 @@ static int bcm63xx_parse_cfe_partitions(
95         /* Global partition "linux" to make easy firmware upgrade */
96         parts[curpart].name = "linux";
97         parts[curpart].offset = cfelen;
98 -       parts[curpart].size = master->size - cfelen - nvramlen;
99 +       parts[curpart].size = master->size - cfelen - nvramlen
100 +                             - caldatalen1 - caldatalen2;
101  
102         for (i = 0; i < nrparts; i++)
103                 pr_info("Partition %d is %s offset %llx and length %llx\n", i,
104 --- a/include/linux/mtd/partitions.h
105 +++ b/include/linux/mtd/partitions.h
106 @@ -58,10 +58,12 @@ struct device_node;
107  /**
108   * struct mtd_part_parser_data - used to pass data to MTD partition parsers.
109   * @origin: for RedBoot, start address of MTD device
110 + * @caldata: for CFE, start address of wifi calibration data
111   * @of_node: for OF parsers, device node containing partitioning information
112   */
113  struct mtd_part_parser_data {
114         unsigned long origin;
115 +       unsigned long caldata[2];
116         struct device_node *of_node;
117  };
118