diff options
Diffstat (limited to 'meta-aspeed/recipes-kernel/linux/files/patch-2.6.28.9/0001-MTD-fix-m25p80-64-bit-divisions.patch')
-rw-r--r-- | meta-aspeed/recipes-kernel/linux/files/patch-2.6.28.9/0001-MTD-fix-m25p80-64-bit-divisions.patch | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/meta-aspeed/recipes-kernel/linux/files/patch-2.6.28.9/0001-MTD-fix-m25p80-64-bit-divisions.patch b/meta-aspeed/recipes-kernel/linux/files/patch-2.6.28.9/0001-MTD-fix-m25p80-64-bit-divisions.patch new file mode 100644 index 0000000..c7f3d4e --- /dev/null +++ b/meta-aspeed/recipes-kernel/linux/files/patch-2.6.28.9/0001-MTD-fix-m25p80-64-bit-divisions.patch @@ -0,0 +1,129 @@ +From d85316ac459f1cdd14ea1828eebeac1f1028e167 Mon Sep 17 00:00:00 2001 +From: Artem Bityutskiy <Artem.Bityutskiy@nokia.com> +Date: Thu, 18 Dec 2008 14:10:05 +0200 +Subject: [PATCH 001/130] [MTD] fix m25p80 64-bit divisions + +MTD has recently been upgraded for 64-bit support, see commit +number 69423d99fc182a81f3c5db3eb5c140acc6fc64be in the +mtd-2.6.git tree (git://git.infradead.org/mtd-2.6.git) +or see this URL: +http://git.infradead.org/mtd-2.6.git?a=commit;h=69423d99fc182a81f3c5db3eb5c140acc6fc64be + +Some variables in MTD data structures which were 32-bit +became 64-bit. Namely, the 'size' field in 'struct mtd_info' +and the 'addr'/'len' fields in 'struct erase_info'. This +means we have to use 'do_div' to divide them. + +This patch fixes the following linking error: +ERROR: "__umoddi3" [drivers/mtd/devices/m25p80.ko] undefined! + +This patch changes divisions of 64-bit variable so that they use +'do_div'. This patch also change some print placeholders to +get rid of gcc warnings. + +Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com> +Signed-off-by: David Woodhouse <David.Woodhouse@intel.com> +--- + drivers/mtd/devices/m25p80.c | 37 +++++++++++++++++++------------------ + 1 file changed, 19 insertions(+), 18 deletions(-) + +diff --git a/drivers/mtd/devices/m25p80.c b/drivers/mtd/devices/m25p80.c +index 6659b22..9be0229 100644 +--- a/drivers/mtd/devices/m25p80.c ++++ b/drivers/mtd/devices/m25p80.c +@@ -20,6 +20,7 @@ + #include <linux/device.h> + #include <linux/interrupt.h> + #include <linux/mutex.h> ++#include <linux/math64.h> + + #include <linux/mtd/mtd.h> + #include <linux/mtd/partitions.h> +@@ -169,9 +170,9 @@ static int wait_till_ready(struct m25p *flash) + */ + static int erase_chip(struct m25p *flash) + { +- DEBUG(MTD_DEBUG_LEVEL3, "%s: %s %dKiB\n", ++ DEBUG(MTD_DEBUG_LEVEL3, "%s: %s %lldKiB\n", + flash->spi->dev.bus_id, __func__, +- flash->mtd.size / 1024); ++ (long long)(flash->mtd.size >> 10)); + + /* Wait until finished previous write command. */ + if (wait_till_ready(flash)) +@@ -232,18 +233,18 @@ static int m25p80_erase(struct mtd_info *mtd, struct erase_info *instr) + { + struct m25p *flash = mtd_to_m25p(mtd); + u32 addr,len; ++ uint32_t rem; + +- DEBUG(MTD_DEBUG_LEVEL2, "%s: %s %s 0x%08x, len %d\n", ++ DEBUG(MTD_DEBUG_LEVEL2, "%s: %s %s 0x%llx, len %lld\n", + flash->spi->dev.bus_id, __func__, "at", +- (u32)instr->addr, instr->len); ++ (long long)instr->addr, (long long)instr->len); + + /* sanity checks */ + if (instr->addr + instr->len > flash->mtd.size) + return -EINVAL; +- if ((instr->addr % mtd->erasesize) != 0 +- || (instr->len % mtd->erasesize) != 0) { ++ div_u64_rem(instr->len, mtd->erasesize, &rem); ++ if (rem) + return -EINVAL; +- } + + addr = instr->addr; + len = instr->len; +@@ -677,24 +678,24 @@ static int __devinit m25p_probe(struct spi_device *spi) + flash->mtd.erasesize = info->sector_size; + } + +- dev_info(&spi->dev, "%s (%d Kbytes)\n", info->name, +- flash->mtd.size / 1024); ++ dev_info(&spi->dev, "%s (%lld Kbytes)\n", info->name, ++ (long long)flash->mtd.size >> 10); + + DEBUG(MTD_DEBUG_LEVEL2, +- "mtd .name = %s, .size = 0x%.8x (%uMiB) " ++ "mtd .name = %s, .size = 0x%llx (%lldMiB) " + ".erasesize = 0x%.8x (%uKiB) .numeraseregions = %d\n", + flash->mtd.name, +- flash->mtd.size, flash->mtd.size / (1024*1024), ++ (long long)flash->mtd.size, (long long)(flash->mtd.size >> 20), + flash->mtd.erasesize, flash->mtd.erasesize / 1024, + flash->mtd.numeraseregions); + + if (flash->mtd.numeraseregions) + for (i = 0; i < flash->mtd.numeraseregions; i++) + DEBUG(MTD_DEBUG_LEVEL2, +- "mtd.eraseregions[%d] = { .offset = 0x%.8x, " ++ "mtd.eraseregions[%d] = { .offset = 0x%llx, " + ".erasesize = 0x%.8x (%uKiB), " + ".numblocks = %d }\n", +- i, flash->mtd.eraseregions[i].offset, ++ i, (long long)flash->mtd.eraseregions[i].offset, + flash->mtd.eraseregions[i].erasesize, + flash->mtd.eraseregions[i].erasesize / 1024, + flash->mtd.eraseregions[i].numblocks); +@@ -722,12 +723,12 @@ static int __devinit m25p_probe(struct spi_device *spi) + if (nr_parts > 0) { + for (i = 0; i < nr_parts; i++) { + DEBUG(MTD_DEBUG_LEVEL2, "partitions[%d] = " +- "{.name = %s, .offset = 0x%.8x, " +- ".size = 0x%.8x (%uKiB) }\n", ++ "{.name = %s, .offset = 0x%llx, " ++ ".size = 0x%llx (%lldKiB) }\n", + i, parts[i].name, +- parts[i].offset, +- parts[i].size, +- parts[i].size / 1024); ++ (long long)parts[i].offset, ++ (long long)parts[i].size, ++ (long long)(parts[i].size >> 10)); + } + flash->partitioned = 1; + return add_mtd_partitions(&flash->mtd, parts, nr_parts); +-- +1.8.1 + |