Commit 5b7f3a50 authored by Artem Bityutskiy's avatar Artem Bityutskiy Committed by David Woodhouse

[MTD] fix dataflash 64-bit divisions

MTD has recently been upgraded for 64-bit support, see commit
number 69423d99 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: "__udivdi3" [drivers/mtd/devices/mtd_dataflash.ko] undefined!
ERROR: "__umoddi3" [drivers/mtd/devices/mtd_dataflash.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: default avatarArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
Cc: David Brownell <david-b@pacbell.net>
Cc: Nicolas Pitre <nico@cam.org>
Signed-off-by: default avatarDavid Woodhouse <David.Woodhouse@intel.com>
parent 03ed1078
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include <linux/device.h> #include <linux/device.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/err.h> #include <linux/err.h>
#include <linux/math64.h>
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
#include <linux/spi/flash.h> #include <linux/spi/flash.h>
...@@ -152,15 +153,20 @@ static int dataflash_erase(struct mtd_info *mtd, struct erase_info *instr) ...@@ -152,15 +153,20 @@ static int dataflash_erase(struct mtd_info *mtd, struct erase_info *instr)
struct spi_message msg; struct spi_message msg;
unsigned blocksize = priv->page_size << 3; unsigned blocksize = priv->page_size << 3;
uint8_t *command; uint8_t *command;
uint32_t rem;
DEBUG(MTD_DEBUG_LEVEL2, "%s: erase addr=0x%x len 0x%x\n", DEBUG(MTD_DEBUG_LEVEL2, "%s: erase addr=0x%llx len 0x%llx\n",
spi->dev.bus_id, spi->dev.bus_id, (long long)instr->addr,
instr->addr, instr->len); (long long)instr->len);
/* Sanity checks */ /* Sanity checks */
if ((instr->addr + instr->len) > mtd->size if (instr->addr + instr->len > mtd->size)
|| (instr->len % priv->page_size) != 0 return -EINVAL;
|| (instr->addr % priv->page_size) != 0) div_u64_rem(instr->len, priv->page_size, &rem);
if (rem)
return -EINVAL;
div_u64_rem(instr->addr, priv->page_size, &rem);
if (rem)
return -EINVAL; return -EINVAL;
spi_message_init(&msg); spi_message_init(&msg);
...@@ -178,7 +184,7 @@ static int dataflash_erase(struct mtd_info *mtd, struct erase_info *instr) ...@@ -178,7 +184,7 @@ static int dataflash_erase(struct mtd_info *mtd, struct erase_info *instr)
/* Calculate flash page address; use block erase (for speed) if /* Calculate flash page address; use block erase (for speed) if
* we're at a block boundary and need to erase the whole block. * we're at a block boundary and need to erase the whole block.
*/ */
pageaddr = instr->addr / priv->page_size; pageaddr = div_u64(instr->len, priv->page_size);
do_block = (pageaddr & 0x7) == 0 && instr->len >= blocksize; do_block = (pageaddr & 0x7) == 0 && instr->len >= blocksize;
pageaddr = pageaddr << priv->page_offset; pageaddr = pageaddr << priv->page_offset;
...@@ -667,8 +673,8 @@ add_dataflash_otp(struct spi_device *spi, char *name, ...@@ -667,8 +673,8 @@ add_dataflash_otp(struct spi_device *spi, char *name,
if (revision >= 'c') if (revision >= 'c')
otp_tag = otp_setup(device, revision); otp_tag = otp_setup(device, revision);
dev_info(&spi->dev, "%s (%d KBytes) pagesize %d bytes%s\n", dev_info(&spi->dev, "%s (%lld KBytes) pagesize %d bytes%s\n",
name, DIV_ROUND_UP(device->size, 1024), name, (long long)((device->size + 1023) >> 10),
pagesize, otp_tag); pagesize, otp_tag);
dev_set_drvdata(&spi->dev, priv); dev_set_drvdata(&spi->dev, priv);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment