1
0
mirror of git://projects.qi-hardware.com/openwrt-xburst.git synced 2024-11-30 19:27:31 +02:00

ar71xx: make rb750_nand driver compatible with 3.7

Also add compatibility patches for the currently
supported kernels.

Signed-off-by: Gabor Juhos <juhosg@openwrt.org>

git-svn-id: svn://svn.openwrt.org/openwrt/trunk@34279 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
juhosg 2012-11-20 16:29:43 +00:00
parent c7120182ad
commit 9364d77535
4 changed files with 131 additions and 17 deletions

View File

@ -110,8 +110,7 @@ static void rb750_nand_write(const u8 *buf, unsigned len)
__raw_readl(base + AR71XX_GPIO_REG_OE); __raw_readl(base + AR71XX_GPIO_REG_OE);
} }
static int rb750_nand_read_verify(u8 *read_buf, unsigned len, static void rb750_nand_read(u8 *read_buf, unsigned len)
const u8 *verify_buf)
{ {
void __iomem *base = ath79_gpio_base; void __iomem *base = ath79_gpio_base;
unsigned i; unsigned i;
@ -131,13 +130,8 @@ static int rb750_nand_read_verify(u8 *read_buf, unsigned len,
/* deactivate RE line */ /* deactivate RE line */
__raw_writel(RB750_NAND_NRE, base + AR71XX_GPIO_REG_SET); __raw_writel(RB750_NAND_NRE, base + AR71XX_GPIO_REG_SET);
if (read_buf) read_buf[i] = data;
read_buf[i] = data;
else if (verify_buf && verify_buf[i] != data)
return -EFAULT;
} }
return 0;
} }
static void rb750_nand_select_chip(struct mtd_info *mtd, int chip) static void rb750_nand_select_chip(struct mtd_info *mtd, int chip)
@ -212,13 +206,13 @@ static void rb750_nand_cmd_ctrl(struct mtd_info *mtd, int cmd,
static u8 rb750_nand_read_byte(struct mtd_info *mtd) static u8 rb750_nand_read_byte(struct mtd_info *mtd)
{ {
u8 data = 0; u8 data = 0;
rb750_nand_read_verify(&data, 1, NULL); rb750_nand_read(&data, 1);
return data; return data;
} }
static void rb750_nand_read_buf(struct mtd_info *mtd, u8 *buf, int len) static void rb750_nand_read_buf(struct mtd_info *mtd, u8 *buf, int len)
{ {
rb750_nand_read_verify(buf, len, NULL); rb750_nand_read(buf, len);
} }
static void rb750_nand_write_buf(struct mtd_info *mtd, const u8 *buf, int len) static void rb750_nand_write_buf(struct mtd_info *mtd, const u8 *buf, int len)
@ -226,11 +220,6 @@ static void rb750_nand_write_buf(struct mtd_info *mtd, const u8 *buf, int len)
rb750_nand_write(buf, len); rb750_nand_write(buf, len);
} }
static int rb750_nand_verify_buf(struct mtd_info *mtd, const u8 *buf, int len)
{
return rb750_nand_read_verify(NULL, len, buf);
}
static void __init rb750_nand_gpio_init(struct rb750_nand_info *info) static void __init rb750_nand_gpio_init(struct rb750_nand_info *info)
{ {
void __iomem *base = ath79_gpio_base; void __iomem *base = ath79_gpio_base;
@ -285,7 +274,6 @@ static int __devinit rb750_nand_probe(struct platform_device *pdev)
info->chip.read_byte = rb750_nand_read_byte; info->chip.read_byte = rb750_nand_read_byte;
info->chip.write_buf = rb750_nand_write_buf; info->chip.write_buf = rb750_nand_write_buf;
info->chip.read_buf = rb750_nand_read_buf; info->chip.read_buf = rb750_nand_read_buf;
info->chip.verify_buf = rb750_nand_verify_buf;
info->chip.chip_delay = 25; info->chip.chip_delay = 25;
info->chip.ecc.mode = NAND_ECC_SOFT; info->chip.ecc.mode = NAND_ECC_SOFT;

View File

@ -1,7 +1,7 @@
reverted: reverted:
--- a/drivers/mtd/nand/rb750_nand.c --- a/drivers/mtd/nand/rb750_nand.c
+++ b/drivers/mtd/nand/rb750_nand.c +++ b/drivers/mtd/nand/rb750_nand.c
@@ -289,6 +289,7 @@ static int __devinit rb750_nand_probe(st @@ -277,6 +277,7 @@ static int __devinit rb750_nand_probe(st
info->chip.chip_delay = 25; info->chip.chip_delay = 25;
info->chip.ecc.mode = NAND_ECC_SOFT; info->chip.ecc.mode = NAND_ECC_SOFT;

View File

@ -0,0 +1,63 @@
--- a/drivers/mtd/nand/rb750_nand.c
+++ b/drivers/mtd/nand/rb750_nand.c
@@ -110,7 +110,8 @@ static void rb750_nand_write(const u8 *b
__raw_readl(base + AR71XX_GPIO_REG_OE);
}
-static void rb750_nand_read(u8 *read_buf, unsigned len)
+static int rb750_nand_read_verify(u8 *read_buf, unsigned len,
+ const u8 *verify_buf)
{
void __iomem *base = ath79_gpio_base;
unsigned i;
@@ -130,8 +131,13 @@ static void rb750_nand_read(u8 *read_buf
/* deactivate RE line */
__raw_writel(RB750_NAND_NRE, base + AR71XX_GPIO_REG_SET);
- read_buf[i] = data;
+ if (read_buf)
+ read_buf[i] = data;
+ else if (verify_buf && verify_buf[i] != data)
+ return -EFAULT;
}
+
+ return 0;
}
static void rb750_nand_select_chip(struct mtd_info *mtd, int chip)
@@ -206,13 +212,13 @@ static void rb750_nand_cmd_ctrl(struct m
static u8 rb750_nand_read_byte(struct mtd_info *mtd)
{
u8 data = 0;
- rb750_nand_read(&data, 1);
+ rb750_nand_read_verify(&data, 1, NULL);
return data;
}
static void rb750_nand_read_buf(struct mtd_info *mtd, u8 *buf, int len)
{
- rb750_nand_read(buf, len);
+ rb750_nand_read_verify(buf, len, NULL);
}
static void rb750_nand_write_buf(struct mtd_info *mtd, const u8 *buf, int len)
@@ -220,6 +226,11 @@ static void rb750_nand_write_buf(struct
rb750_nand_write(buf, len);
}
+static int rb750_nand_verify_buf(struct mtd_info *mtd, const u8 *buf, int len)
+{
+ return rb750_nand_read_verify(NULL, len, buf);
+}
+
static void __init rb750_nand_gpio_init(struct rb750_nand_info *info)
{
void __iomem *base = ath79_gpio_base;
@@ -274,6 +285,7 @@ static int __devinit rb750_nand_probe(st
info->chip.read_byte = rb750_nand_read_byte;
info->chip.write_buf = rb750_nand_write_buf;
info->chip.read_buf = rb750_nand_read_buf;
+ info->chip.verify_buf = rb750_nand_verify_buf;
info->chip.chip_delay = 25;
info->chip.ecc.mode = NAND_ECC_SOFT;

View File

@ -0,0 +1,63 @@
--- a/drivers/mtd/nand/rb750_nand.c
+++ b/drivers/mtd/nand/rb750_nand.c
@@ -110,7 +110,8 @@ static void rb750_nand_write(const u8 *b
__raw_readl(base + AR71XX_GPIO_REG_OE);
}
-static void rb750_nand_read(u8 *read_buf, unsigned len)
+static int rb750_nand_read_verify(u8 *read_buf, unsigned len,
+ const u8 *verify_buf)
{
void __iomem *base = ath79_gpio_base;
unsigned i;
@@ -130,8 +131,13 @@ static void rb750_nand_read(u8 *read_buf
/* deactivate RE line */
__raw_writel(RB750_NAND_NRE, base + AR71XX_GPIO_REG_SET);
- read_buf[i] = data;
+ if (read_buf)
+ read_buf[i] = data;
+ else if (verify_buf && verify_buf[i] != data)
+ return -EFAULT;
}
+
+ return 0;
}
static void rb750_nand_select_chip(struct mtd_info *mtd, int chip)
@@ -206,13 +212,13 @@ static void rb750_nand_cmd_ctrl(struct m
static u8 rb750_nand_read_byte(struct mtd_info *mtd)
{
u8 data = 0;
- rb750_nand_read(&data, 1);
+ rb750_nand_read_verify(&data, 1, NULL);
return data;
}
static void rb750_nand_read_buf(struct mtd_info *mtd, u8 *buf, int len)
{
- rb750_nand_read(buf, len);
+ rb750_nand_read_verify(buf, len, NULL);
}
static void rb750_nand_write_buf(struct mtd_info *mtd, const u8 *buf, int len)
@@ -220,6 +226,11 @@ static void rb750_nand_write_buf(struct
rb750_nand_write(buf, len);
}
+static int rb750_nand_verify_buf(struct mtd_info *mtd, const u8 *buf, int len)
+{
+ return rb750_nand_read_verify(NULL, len, buf);
+}
+
static void __init rb750_nand_gpio_init(struct rb750_nand_info *info)
{
void __iomem *base = ath79_gpio_base;
@@ -274,6 +285,7 @@ static int __devinit rb750_nand_probe(st
info->chip.read_byte = rb750_nand_read_byte;
info->chip.write_buf = rb750_nand_write_buf;
info->chip.read_buf = rb750_nand_read_buf;
+ info->chip.verify_buf = rb750_nand_verify_buf;
info->chip.chip_delay = 25;
info->chip.ecc.mode = NAND_ECC_SOFT;