brcm47xx: drop 3.14
[openwrt.git] / target / linux / generic / patches-3.14 / 404-mtd-add-more-helper-functions.patch
1 --- a/drivers/mtd/mtdpart.c
2 +++ b/drivers/mtd/mtdpart.c
3 @@ -434,14 +434,12 @@ static struct mtd_part *allocate_partiti
4         if (slave->offset == MTDPART_OFS_APPEND)
5                 slave->offset = cur_offset;
6         if (slave->offset == MTDPART_OFS_NXTBLK) {
7 -               slave->offset = cur_offset;
8 -               if (mtd_mod_by_eb(cur_offset, master) != 0) {
9 -                       /* Round up to next erasesize */
10 -                       slave->offset = (mtd_div_by_eb(cur_offset, master) + 1) * master->erasesize;
11 +               /* Round up to next erasesize */
12 +               slave->offset = mtd_roundup_to_eb(cur_offset, master);
13 +               if (slave->offset != cur_offset)
14                         printk(KERN_NOTICE "Moving partition %d: "
15                                "0x%012llx -> 0x%012llx\n", partno,
16                                (unsigned long long)cur_offset, (unsigned long long)slave->offset);
17 -               }
18         }
19         if (slave->offset == MTDPART_OFS_RETAIN) {
20                 slave->offset = cur_offset;
21 @@ -659,6 +657,17 @@ run_parsers_by_type(struct mtd_part *sla
22         return nr_parts;
23  }
24  
25 +static inline unsigned long
26 +mtd_pad_erasesize(struct mtd_info *mtd, int offset, int len)
27 +{
28 +       unsigned long mask = mtd->erasesize - 1;
29 +
30 +       len += offset & mask;
31 +       len = (len + mask) & ~mask;
32 +       len -= offset & mask;
33 +       return len;
34 +}
35 +
36  #ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME
37  #define SPLIT_FIRMWARE_NAME    CONFIG_MTD_SPLIT_FIRMWARE_NAME
38  #else
39 @@ -900,6 +909,24 @@ int mtd_is_partition(const struct mtd_in
40  }
41  EXPORT_SYMBOL_GPL(mtd_is_partition);
42  
43 +struct mtd_info *mtdpart_get_master(const struct mtd_info *mtd)
44 +{
45 +       if (!mtd_is_partition(mtd))
46 +               return (struct mtd_info *)mtd;
47 +
48 +       return PART(mtd)->master;
49 +}
50 +EXPORT_SYMBOL_GPL(mtdpart_get_master);
51 +
52 +uint64_t mtdpart_get_offset(const struct mtd_info *mtd)
53 +{
54 +       if (!mtd_is_partition(mtd))
55 +               return 0;
56 +
57 +       return PART(mtd)->offset;
58 +}
59 +EXPORT_SYMBOL_GPL(mtdpart_get_offset);
60 +
61  /* Returns the size of the entire flash chip */
62  uint64_t mtd_get_device_size(const struct mtd_info *mtd)
63  {
64 --- a/include/linux/mtd/partitions.h
65 +++ b/include/linux/mtd/partitions.h
66 @@ -90,6 +90,8 @@ int mtd_is_partition(const struct mtd_in
67  int mtd_add_partition(struct mtd_info *master, const char *name,
68                       long long offset, long long length);
69  int mtd_del_partition(struct mtd_info *master, int partno);
70 +struct mtd_info *mtdpart_get_master(const struct mtd_info *mtd);
71 +uint64_t mtdpart_get_offset(const struct mtd_info *mtd);
72  uint64_t mtd_get_device_size(const struct mtd_info *mtd);
73  extern void __weak arch_split_mtd_part(struct mtd_info *master,
74                                        const char *name, int offset, int size);
75 --- a/include/linux/mtd/mtd.h
76 +++ b/include/linux/mtd/mtd.h
77 @@ -331,6 +331,24 @@ static inline uint32_t mtd_mod_by_eb(uin
78         return do_div(sz, mtd->erasesize);
79  }
80  
81 +static inline uint64_t mtd_roundup_to_eb(uint64_t sz, struct mtd_info *mtd)
82 +{
83 +       if (mtd_mod_by_eb(sz, mtd) == 0)
84 +               return sz;
85 +
86 +       /* Round up to next erase block */
87 +       return (mtd_div_by_eb(sz, mtd) + 1) * mtd->erasesize;
88 +}
89 +
90 +static inline uint64_t mtd_rounddown_to_eb(uint64_t sz, struct mtd_info *mtd)
91 +{
92 +       if (mtd_mod_by_eb(sz, mtd) == 0)
93 +               return sz;
94 +
95 +       /* Round down to the start of the current erase block */
96 +       return (mtd_div_by_eb(sz, mtd)) * mtd->erasesize;
97 +}
98 +
99  static inline uint32_t mtd_div_by_ws(uint64_t sz, struct mtd_info *mtd)
100  {
101         if (mtd->writesize_shift)