6856535e29
The "linux,part-probe" dts parsing is a pretty neat generic feature. It has been posted to kernel.org and could easily be reused by all targets. This change moves the patch to the 3.18 and 4.1 generic folders, and makes the feature available to all platforms who may want to use it. Signed-off-by: Mathieu Olivari <mathieu@codeaurora.org> Acked-by: Hauke Mehrtens <hauke@hauke-m.de> SVN-Revision: 46654
102 lines
3.1 KiB
Diff
102 lines
3.1 KiB
Diff
--- a/drivers/mtd/mtdpart.c
|
|
+++ b/drivers/mtd/mtdpart.c
|
|
@@ -446,14 +446,12 @@ static struct mtd_part *allocate_partiti
|
|
if (slave->offset == MTDPART_OFS_APPEND)
|
|
slave->offset = cur_offset;
|
|
if (slave->offset == MTDPART_OFS_NXTBLK) {
|
|
- slave->offset = cur_offset;
|
|
- if (mtd_mod_by_eb(cur_offset, master) != 0) {
|
|
- /* Round up to next erasesize */
|
|
- slave->offset = (mtd_div_by_eb(cur_offset, master) + 1) * master->erasesize;
|
|
+ /* Round up to next erasesize */
|
|
+ slave->offset = mtd_roundup_to_eb(cur_offset, master);
|
|
+ if (slave->offset != cur_offset)
|
|
printk(KERN_NOTICE "Moving partition %d: "
|
|
"0x%012llx -> 0x%012llx\n", partno,
|
|
(unsigned long long)cur_offset, (unsigned long long)slave->offset);
|
|
- }
|
|
}
|
|
if (slave->offset == MTDPART_OFS_RETAIN) {
|
|
slave->offset = cur_offset;
|
|
@@ -673,6 +671,17 @@ run_parsers_by_type(struct mtd_part *sla
|
|
return nr_parts;
|
|
}
|
|
|
|
+static inline unsigned long
|
|
+mtd_pad_erasesize(struct mtd_info *mtd, int offset, int len)
|
|
+{
|
|
+ unsigned long mask = mtd->erasesize - 1;
|
|
+
|
|
+ len += offset & mask;
|
|
+ len = (len + mask) & ~mask;
|
|
+ len -= offset & mask;
|
|
+ return len;
|
|
+}
|
|
+
|
|
#ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME
|
|
#define SPLIT_FIRMWARE_NAME CONFIG_MTD_SPLIT_FIRMWARE_NAME
|
|
#else
|
|
@@ -956,6 +965,24 @@ int mtd_is_partition(const struct mtd_in
|
|
}
|
|
EXPORT_SYMBOL_GPL(mtd_is_partition);
|
|
|
|
+struct mtd_info *mtdpart_get_master(const struct mtd_info *mtd)
|
|
+{
|
|
+ if (!mtd_is_partition(mtd))
|
|
+ return (struct mtd_info *)mtd;
|
|
+
|
|
+ return PART(mtd)->master;
|
|
+}
|
|
+EXPORT_SYMBOL_GPL(mtdpart_get_master);
|
|
+
|
|
+uint64_t mtdpart_get_offset(const struct mtd_info *mtd)
|
|
+{
|
|
+ if (!mtd_is_partition(mtd))
|
|
+ return 0;
|
|
+
|
|
+ return PART(mtd)->offset;
|
|
+}
|
|
+EXPORT_SYMBOL_GPL(mtdpart_get_offset);
|
|
+
|
|
/* Returns the size of the entire flash chip */
|
|
uint64_t mtd_get_device_size(const struct mtd_info *mtd)
|
|
{
|
|
--- a/include/linux/mtd/partitions.h
|
|
+++ b/include/linux/mtd/partitions.h
|
|
@@ -90,6 +90,8 @@ int mtd_is_partition(const struct mtd_in
|
|
int mtd_add_partition(struct mtd_info *master, const char *name,
|
|
long long offset, long long length);
|
|
int mtd_del_partition(struct mtd_info *master, int partno);
|
|
+struct mtd_info *mtdpart_get_master(const struct mtd_info *mtd);
|
|
+uint64_t mtdpart_get_offset(const struct mtd_info *mtd);
|
|
uint64_t mtd_get_device_size(const struct mtd_info *mtd);
|
|
extern void __weak arch_split_mtd_part(struct mtd_info *master,
|
|
const char *name, int offset, int size);
|
|
--- a/include/linux/mtd/mtd.h
|
|
+++ b/include/linux/mtd/mtd.h
|
|
@@ -333,6 +333,24 @@ static inline uint32_t mtd_mod_by_eb(uin
|
|
return do_div(sz, mtd->erasesize);
|
|
}
|
|
|
|
+static inline uint64_t mtd_roundup_to_eb(uint64_t sz, struct mtd_info *mtd)
|
|
+{
|
|
+ if (mtd_mod_by_eb(sz, mtd) == 0)
|
|
+ return sz;
|
|
+
|
|
+ /* Round up to next erase block */
|
|
+ return (mtd_div_by_eb(sz, mtd) + 1) * mtd->erasesize;
|
|
+}
|
|
+
|
|
+static inline uint64_t mtd_rounddown_to_eb(uint64_t sz, struct mtd_info *mtd)
|
|
+{
|
|
+ if (mtd_mod_by_eb(sz, mtd) == 0)
|
|
+ return sz;
|
|
+
|
|
+ /* Round down to the start of the current erase block */
|
|
+ return (mtd_div_by_eb(sz, mtd)) * mtd->erasesize;
|
|
+}
|
|
+
|
|
static inline uint32_t mtd_div_by_ws(uint64_t sz, struct mtd_info *mtd)
|
|
{
|
|
if (mtd->writesize_shift)
|