* [PATCH 1/1] [MTD/MAPS] Blackfin Async Flash Maps: Handle the case where flash memory and ethernet mac/phy are mapped onto the same async bank
@ 2008-05-13 4:38 Bryan Wu
2008-05-13 8:07 ` Jörn Engel
0 siblings, 1 reply; 10+ messages in thread
From: Bryan Wu @ 2008-05-13 4:38 UTC (permalink / raw)
To: joern, dwmw2, will.newton
Cc: Bryan Wu, linux-mtd, linux-kernel, Mike Frysinger
From: Mike Frysinger <vapier.adi@gmail.com>
[try #3] rename bf5xx-flash to bfin-async-flash
- move all kconfig board settings into board resources
- fixup casting style according to lkml feedback
- rewrite driver so that it can handle arbitrary of
instances according to the declared platform resources
[try #2]
Remove useless SSYNC() as Will said
[try #1]
The BF533-STAMP does this for example.
All board-specific configuration goes in your board resources file.
Signed-off-by: Mike Frysinger <vapier.adi@gmail.com>
Cc: Joern Engel <joern@logfs.org>
Signed-off-by: Bryan Wu <cooloney@kernel.org>
---
drivers/mtd/maps/Kconfig | 11 ++
drivers/mtd/maps/Makefile | 1 +
drivers/mtd/maps/bfin-async-flash.c | 235 +++++++++++++++++++++++++++++++++++
3 files changed, 247 insertions(+), 0 deletions(-)
create mode 100644 drivers/mtd/maps/bfin-async-flash.c
diff --git a/drivers/mtd/maps/Kconfig b/drivers/mtd/maps/Kconfig
index 17bc87a..d4878eb 100644
--- a/drivers/mtd/maps/Kconfig
+++ b/drivers/mtd/maps/Kconfig
@@ -517,6 +517,17 @@ config MTD_PCMCIA_ANONYMOUS
If unsure, say N.
+config MTD_BFIN_ASYNC
+ tristate "Blackfin BF533-STAMP Flash Chip Support"
+ depends on BFIN533_STAMP && MTD_CFI
+ select MTD_PARTITIONS
+ default y
+ help
+ Map driver which allows for simultaneous utilization of
+ ethernet and CFI parallel flash.
+
+ If compiled as a module, it will be called bfin-async-flash.
+
config MTD_UCLINUX
tristate "Generic uClinux RAM/ROM filesystem support"
depends on MTD_PARTITIONS && !MMU
diff --git a/drivers/mtd/maps/Makefile b/drivers/mtd/maps/Makefile
index 957fb5f..4ed1672 100644
--- a/drivers/mtd/maps/Makefile
+++ b/drivers/mtd/maps/Makefile
@@ -67,3 +67,4 @@ obj-$(CONFIG_MTD_PLATRAM) += plat-ram.o
obj-$(CONFIG_MTD_OMAP_NOR) += omap_nor.o
obj-$(CONFIG_MTD_MTX1) += mtx-1_flash.o
obj-$(CONFIG_MTD_INTEL_VR_NOR) += intel_vr_nor.o
+obj-$(CONFIG_MTD_BFIN_ASYNC) += bfin-async-flash.o
diff --git a/drivers/mtd/maps/bfin-async-flash.c b/drivers/mtd/maps/bfin-async-flash.c
new file mode 100644
index 0000000..1ec5ae6
--- /dev/null
+++ b/drivers/mtd/maps/bfin-async-flash.c
@@ -0,0 +1,235 @@
+/*
+ * drivers/mtd/maps/bfin-async-flash.c
+ *
+ * Handle the case where flash memory and ethernet mac/phy are
+ * mapped onto the same async bank. The BF533-STAMP does this
+ * for example. All board-specific configuration goes in your
+ * board resources file.
+ *
+ * Copyright 2000 Nicolas Pitre <nico@cam.org>
+ * Copyright 2005-2008 Analog Devices Inc.
+ *
+ * Enter bugs at http://blackfin.uclinux.org/
+ *
+ * Licensed under the GPL-2 or later.
+ */
+
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/mtd/mtd.h>
+#include <linux/mtd/map.h>
+#include <linux/mtd/partitions.h>
+#include <linux/mtd/physmap.h>
+#include <linux/platform_device.h>
+#include <linux/types.h>
+
+#include <asm/blackfin.h>
+#include <asm/gpio.h>
+#include <asm/io.h>
+#include <asm/unaligned.h>
+
+#define pr_devinit(fmt, args...) ({ static const __devinitdata char __fmt[] = fmt; printk(__fmt, ## args); })
+
+#define DRIVER_NAME "bfin-async-flash"
+
+struct async_state {
+ struct mtd_info *mtd;
+ struct map_info map;
+ int enet_flash_pin;
+ u32 flash_ambctl0, flash_ambctl1;
+ u32 save_ambctl0, save_ambctl1;
+ unsigned long irq_flags;
+};
+
+static void switch_to_flash(struct async_state *state)
+{
+ local_irq_save(state->irq_flags);
+
+ gpio_set_value(state->enet_flash_pin, 0);
+
+ state->save_ambctl0 = bfin_read_EBIU_AMBCTL0();
+ state->save_ambctl1 = bfin_read_EBIU_AMBCTL1();
+ bfin_write_EBIU_AMBCTL0(state->flash_ambctl0);
+ bfin_write_EBIU_AMBCTL1(state->flash_ambctl1);
+ SSYNC();
+}
+
+static void switch_back(struct async_state *state)
+{
+ bfin_write_EBIU_AMBCTL0(state->save_ambctl0);
+ bfin_write_EBIU_AMBCTL1(state->save_ambctl1);
+ SSYNC();
+
+ gpio_set_value(state->enet_flash_pin, 1);
+
+ local_irq_restore(state->irq_flags);
+}
+
+static map_word bfin_read(struct map_info *map, unsigned long ofs)
+{
+ struct async_state *state = (struct async_state *)map->map_priv_1;
+ u16 word;
+ map_word test;
+
+ switch_to_flash(state);
+
+ word = readw(map->virt + ofs);
+ SSYNC();
+
+ switch_back(state);
+
+ test.x[0] = word;
+ return test;
+}
+
+static void bfin_copy_from(struct map_info *map, void *to, unsigned long from, ssize_t len)
+{
+ size_t i;
+ map_word test;
+
+ if ((unsigned long)to & 0x1) {
+ for (i = 0; i < len; i += 2) {
+ u16 *dst = (u16 *)(to + i);
+ test = bfin_read(map, from + i);
+ put_unaligned(test.x[0], dst);
+ }
+ } else {
+ for (i = 0; i < len; i += 2) {
+ u16 *dst = (u16 *)(to + i);
+ test = bfin_read(map, from + i);
+ *dst = test.x[0];
+ }
+ }
+
+ if (len & 0x1) {
+ u8 *last_to_byte = (u8 *)(to + i);
+ test = bfin_read(map, from + i);
+ *last_to_byte = (u8)test.x[0];
+ }
+}
+
+static void bfin_write(struct map_info *map, map_word d1, unsigned long ofs)
+{
+ struct async_state *state = (struct async_state *)map->map_priv_1;
+ u16 d;
+
+ d = (u16)d1.x[0];
+
+ switch_to_flash(state);
+
+ writew(d, map->virt + ofs);
+ SSYNC();
+
+ switch_back(state);
+}
+
+static void bfin_copy_to(struct map_info *map, unsigned long to, const void *from, ssize_t len)
+{
+ struct async_state *state = (struct async_state *)map->map_priv_1;
+
+ switch_to_flash(state);
+
+ memcpy(map->virt + to, from, len);
+ SSYNC();
+
+ switch_back(state);
+}
+
+#ifdef CONFIG_MTD_PARTITIONS
+static const char *part_probe_types[] = { "cmdlinepart", "RedBoot", NULL };
+#endif
+
+static int __devinit bfin_flash_probe(struct platform_device *pdev)
+{
+ int ret;
+ struct physmap_flash_data *pdata = pdev->dev.platform_data;
+ struct resource *memory = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ struct resource *flash_ambctl = platform_get_resource(pdev, IORESOURCE_MEM, 1);
+ struct async_state *state;
+
+ state = kzalloc(sizeof(*state), GFP_KERNEL);
+ if (!state)
+ return -ENOMEM;
+
+ state->map.name = DRIVER_NAME;
+ state->map.read = bfin_read;
+ state->map.copy_from = bfin_copy_from;
+ state->map.write = bfin_write;
+ state->map.copy_to = bfin_copy_to;
+ state->map.bankwidth = pdata->width;
+ state->map.size = memory->end - memory->start + 1;
+ state->map.virt = (void __iomem *)memory->start;
+ state->map.phys = memory->start;
+ state->map.map_priv_1 = (unsigned long)state;
+ state->enet_flash_pin = platform_get_irq(pdev, 0);
+ state->flash_ambctl0 = flash_ambctl->start;
+ state->flash_ambctl1 = flash_ambctl->end;
+
+ if (gpio_request(state->enet_flash_pin, DRIVER_NAME)) {
+ pr_devinit(KERN_ERR DRIVER_NAME ": Failed to request gpio %d\n", state->enet_flash_pin);
+ return -EBUSY;
+ }
+ gpio_direction_output(state->enet_flash_pin, 1);
+
+ pr_devinit(KERN_NOTICE DRIVER_NAME ": probing %d-bit flash bus\n", state->map.bankwidth * 8);
+ state->mtd = do_map_probe(memory->name, &state->map);
+ if (!state->mtd)
+ return -ENXIO;
+
+#ifdef CONFIG_MTD_PARTITIONS
+ ret = parse_mtd_partitions(state->mtd, part_probe_types, &pdata->parts, 0);
+ if (ret > 0) {
+ pr_devinit(KERN_NOTICE DRIVER_NAME ": Using commandline partition definition\n");
+ add_mtd_partitions(state->mtd, pdata->parts, ret);
+
+ } else if (pdata->nr_parts) {
+ pr_devinit(KERN_NOTICE DRIVER_NAME ": Using board partition definition\n");
+ add_mtd_partitions(state->mtd, pdata->parts, pdata->nr_parts);
+
+ } else
+#endif
+ {
+ pr_devinit(KERN_NOTICE DRIVER_NAME ": no partition info available, registering whole flash at once\n");
+ add_mtd_device(state->mtd);
+ }
+
+ platform_set_drvdata(pdev, state);
+
+ return 0;
+}
+
+static int __devexit bfin_flash_remove(struct platform_device *pdev)
+{
+ struct async_state *state = platform_get_drvdata(pdev);
+ gpio_free(state->enet_flash_pin);
+#ifdef CONFIG_MTD_PARTITIONS
+ del_mtd_partitions(state->mtd);
+#endif
+ map_destroy(state->mtd);
+ kfree(state);
+ return 0;
+}
+
+static struct platform_driver bfin_flash_driver = {
+ .probe = bfin_flash_probe,
+ .remove = __devexit_p(bfin_flash_remove),
+ .driver = {
+ .name = DRIVER_NAME,
+ },
+};
+
+static int __init bfin_flash_init(void)
+{
+ return platform_driver_register(&bfin_flash_driver);
+}
+module_init(bfin_flash_init);
+
+static void __exit bfin_flash_exit(void)
+{
+ platform_driver_unregister(&bfin_flash_driver);
+}
+module_exit(bfin_flash_exit);
+
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("MTD map driver for Blackfins with flash/ethernet on same async bank");
--
1.5.5
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH 1/1] [MTD/MAPS] Blackfin Async Flash Maps: Handle the case where flash memory and ethernet mac/phy are mapped onto the same async bank
2008-05-13 4:38 [PATCH 1/1] [MTD/MAPS] Blackfin Async Flash Maps: Handle the case where flash memory and ethernet mac/phy are mapped onto the same async bank Bryan Wu
@ 2008-05-13 8:07 ` Jörn Engel
2008-05-13 12:42 ` Mike Frysinger
2008-05-13 17:41 ` Mike Frysinger
0 siblings, 2 replies; 10+ messages in thread
From: Jörn Engel @ 2008-05-13 8:07 UTC (permalink / raw)
To: Bryan Wu; +Cc: linux-mtd, dwmw2, will.newton, Mike Frysinger, linux-kernel
On Tue, 13 May 2008 12:38:45 +0800, Bryan Wu wrote:
>
> +#define pr_devinit(fmt, args...) ({ static const __devinitdata char __fmt[] = fmt; printk(__fmt, ## args); })
Is this still needed?
> +static void bfin_copy_from(struct map_info *map, void *to, unsigned long from, ssize_t len)
> +{
> + size_t i;
> + map_word test;
> +
> + if ((unsigned long)to & 0x1) {
> + for (i = 0; i < len; i += 2) {
> + u16 *dst = (u16 *)(to + i);
> + test = bfin_read(map, from + i);
> + put_unaligned(test.x[0], dst);
> + }
> + } else {
> + for (i = 0; i < len; i += 2) {
> + u16 *dst = (u16 *)(to + i);
> + test = bfin_read(map, from + i);
> + *dst = test.x[0];
> + }
> + }
> +
> + if (len & 0x1) {
> + u8 *last_to_byte = (u8 *)(to + i);
> + test = bfin_read(map, from + i);
> + *last_to_byte = (u8)test.x[0];
> + }
> +}
The pointer casts are superfluous. Linus prefers variable declarations
up front (sorry for my bad example). The "+ i" in the last conditional
is a bit dangerous as any changes to the loop can break it. Linux code
has lots of churn and not everyone is careful enough to spot such
subtleties.
And I believe you can improve performance by killing the put_unaligned
in the loop. So if we put it all together the end result should be
something like this:
static void bfin_copy_from(struct map_info *map, void *to, unsigned long from, ssize_t len)
{
size_t i;
map_word test;
u8 *byte;
u16 *dst;
if ((unsigned long)to & 0x1) {
byte = to;
test = bfin_read(map, from);
*byte = test.x[0] >> 8;
to++;
from++;
len--;
}
for (i = 0; i < len; i += 2) {
dst = to + i;
test = bfin_read(map, from + i);
*dst = test.x[0];
}
if ((len & 0x1) {
byte = to + len - 1;
test = bfin_read(map, from + len - 1);
*byte = test.x[0] & 0xff;
}
}
What do you think?
> +static void bfin_write(struct map_info *map, map_word d1, unsigned long ofs)
> +{
> + struct async_state *state = (struct async_state *)map->map_priv_1;
> + u16 d;
> +
> + d = (u16)d1.x[0];
You didn't need the cast above. Why here?
Otherwise looks good to me.
Jörn
--
Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are,
by definition, not smart enough to debug it.
-- Brian W. Kernighan
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/1] [MTD/MAPS] Blackfin Async Flash Maps: Handle the case where flash memory and ethernet mac/phy are mapped onto the same async bank
2008-05-13 8:07 ` Jörn Engel
@ 2008-05-13 12:42 ` Mike Frysinger
2008-05-13 15:01 ` Jörn Engel
2008-05-13 17:41 ` Mike Frysinger
1 sibling, 1 reply; 10+ messages in thread
From: Mike Frysinger @ 2008-05-13 12:42 UTC (permalink / raw)
To: Jörn Engel; +Cc: linux-mtd, Bryan Wu, dwmw2, will.newton, linux-kernel
On Tue, May 13, 2008 at 4:07 AM, Jörn Engel wrote:
> On Tue, 13 May 2008 12:38:45 +0800, Bryan Wu wrote:
> >
> > +#define pr_devinit(fmt, args...) ({ static const __devinitdata char __fmt[] = fmt; printk(__fmt, ## args); })
>
> Is this still needed?
yes
> > +static void bfin_copy_from(struct map_info *map, void *to, unsigned long from, ssize_t len)
> > +{
> > + size_t i;
> > + map_word test;
> > +
> > + if ((unsigned long)to & 0x1) {
> > + for (i = 0; i < len; i += 2) {
> > + u16 *dst = (u16 *)(to + i);
> > + test = bfin_read(map, from + i);
> > + put_unaligned(test.x[0], dst);
> > + }
> > + } else {
> > + for (i = 0; i < len; i += 2) {
> > + u16 *dst = (u16 *)(to + i);
> > + test = bfin_read(map, from + i);
> > + *dst = test.x[0];
> > + }
> > + }
> > +
> > + if (len & 0x1) {
> > + u8 *last_to_byte = (u8 *)(to + i);
> > + test = bfin_read(map, from + i);
> > + *last_to_byte = (u8)test.x[0];
> > + }
> > +}
>
> The pointer casts are superfluous.
left over due to "from" being unsigned long ... forgot that "to" is a
void *. dropped
> The "+ i" in the last conditional
> is a bit dangerous as any changes to the loop can break it. Linux code
> has lots of churn and not everyone is careful enough to spot such
> subtleties.
> And I believe you can improve performance by killing the put_unaligned
> in the loop. So if we put it all together the end result should be
> something like this:
>
> static void bfin_copy_from(struct map_info *map, void *to, unsigned long from, ssize_t len)
> {
> size_t i;
> map_word test;
> u8 *byte;
> u16 *dst;
>
>
> if ((unsigned long)to & 0x1) {
> byte = to;
> test = bfin_read(map, from);
> *byte = test.x[0] >> 8;
> to++;
> from++;
> len--;
>
> }
>
> for (i = 0; i < len; i += 2) {
> dst = to + i;
>
> test = bfin_read(map, from + i);
> *dst = test.x[0];
> }
>
> if ((len & 0x1) {
> byte = to + len - 1;
> test = bfin_read(map, from + len - 1);
> *byte = test.x[0] & 0xff;
> }
> }
>
> What do you think?
seems reasonable ... i'll have to grab the board again and test it out.
> > +static void bfin_write(struct map_info *map, map_word d1, unsigned long ofs)
> > +{
> > + struct async_state *state = (struct async_state *)map->map_priv_1;
> > + u16 d;
> > +
> > + d = (u16)d1.x[0];
>
> You didn't need the cast above. Why here?
*shrug* it's always been there. i'll drop it.
thanks!
-mike
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/1] [MTD/MAPS] Blackfin Async Flash Maps: Handle the case where flash memory and ethernet mac/phy are mapped onto the same async bank
2008-05-13 12:42 ` Mike Frysinger
@ 2008-05-13 15:01 ` Jörn Engel
2008-05-13 15:15 ` Mike Frysinger
0 siblings, 1 reply; 10+ messages in thread
From: Jörn Engel @ 2008-05-13 15:01 UTC (permalink / raw)
To: Mike Frysinger; +Cc: dwmw2, Bryan Wu, linux-mtd, will.newton, linux-kernel
On Tue, 13 May 2008 08:42:08 -0400, Mike Frysinger wrote:
> On Tue, May 13, 2008 at 4:07 AM, Jörn Engel wrote:
> > On Tue, 13 May 2008 12:38:45 +0800, Bryan Wu wrote:
> > >
> > > +#define pr_devinit(fmt, args...) ({ static const __devinitdata char __fmt[] = fmt; printk(__fmt, ## args); })
> >
> > Is this still needed?
>
> yes
Can you elaborate a bit?
Jörn
--
It is better to die of hunger having lived without grief and fear,
than to live with a troubled spirit amid abundance.
-- Epictetus
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/1] [MTD/MAPS] Blackfin Async Flash Maps: Handle the case where flash memory and ethernet mac/phy are mapped onto the same async bank
2008-05-13 15:01 ` Jörn Engel
@ 2008-05-13 15:15 ` Mike Frysinger
2008-05-13 15:34 ` Jörn Engel
0 siblings, 1 reply; 10+ messages in thread
From: Mike Frysinger @ 2008-05-13 15:15 UTC (permalink / raw)
To: Jörn Engel; +Cc: dwmw2, Bryan Wu, linux-mtd, will.newton, linux-kernel
On Tue, May 13, 2008 at 11:01 AM, Jörn Engel wrote:
> On Tue, 13 May 2008 08:42:08 -0400, Mike Frysinger wrote:
> > On Tue, May 13, 2008 at 4:07 AM, Jörn Engel wrote:
> > > On Tue, 13 May 2008 12:38:45 +0800, Bryan Wu wrote:
> > > >
> > > > +#define pr_devinit(fmt, args...) ({ static const __devinitdata char __fmt[] = fmt; printk(__fmt, ## args); })
> > >
> > > Is this still needed?
> >
> > yes
>
> Can you elaborate a bit?
it's still used, therefore the definition cannot be dropped. just
look at the probe function.
-mike
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/1] [MTD/MAPS] Blackfin Async Flash Maps: Handle the case where flash memory and ethernet mac/phy are mapped onto the same async bank
2008-05-13 15:15 ` Mike Frysinger
@ 2008-05-13 15:34 ` Jörn Engel
2008-05-13 17:42 ` Mike Frysinger
0 siblings, 1 reply; 10+ messages in thread
From: Jörn Engel @ 2008-05-13 15:34 UTC (permalink / raw)
To: Mike Frysinger; +Cc: dwmw2, Bryan Wu, linux-mtd, will.newton, linux-kernel
On Tue, 13 May 2008 11:15:57 -0400, Mike Frysinger wrote:
> On Tue, May 13, 2008 at 11:01 AM, Jörn Engel wrote:
> > On Tue, 13 May 2008 08:42:08 -0400, Mike Frysinger wrote:
> > > On Tue, May 13, 2008 at 4:07 AM, Jörn Engel wrote:
> > > > On Tue, 13 May 2008 12:38:45 +0800, Bryan Wu wrote:
> > > > >
> > > > > +#define pr_devinit(fmt, args...) ({ static const __devinitdata char __fmt[] = fmt; printk(__fmt, ## args); })
> > > >
> > > > Is this still needed?
> > >
> > > yes
> >
> > Can you elaborate a bit?
>
> it's still used, therefore the definition cannot be dropped. just
> look at the probe function.
That bit is obvious. But why do you use pr_devinit() instead of
printk()? What does it gain you?
Jörn
--
Das Aufregende am Schreiben ist es, eine Ordnung zu schaffen, wo
vorher keine existiert hat.
-- Doris Lessing
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/1] [MTD/MAPS] Blackfin Async Flash Maps: Handle the case where flash memory and ethernet mac/phy are mapped onto the same async bank
2008-05-13 8:07 ` Jörn Engel
2008-05-13 12:42 ` Mike Frysinger
@ 2008-05-13 17:41 ` Mike Frysinger
1 sibling, 0 replies; 10+ messages in thread
From: Mike Frysinger @ 2008-05-13 17:41 UTC (permalink / raw)
To: Jörn Engel; +Cc: linux-mtd, Bryan Wu, dwmw2, will.newton, linux-kernel
On Tue, May 13, 2008 at 4:07 AM, Jörn Engel <joern@logfs.org> wrote:
> On Tue, 13 May 2008 12:38:45 +0800, Bryan Wu wrote:
> > +static void bfin_copy_from(struct map_info *map, void *to, unsigned long from, ssize_t len)
> > +{
> > + size_t i;
> > + map_word test;
> > +
> > + if ((unsigned long)to & 0x1) {
> > + for (i = 0; i < len; i += 2) {
> > + u16 *dst = (u16 *)(to + i);
> > + test = bfin_read(map, from + i);
> > + put_unaligned(test.x[0], dst);
> > + }
> > + } else {
> > + for (i = 0; i < len; i += 2) {
> > + u16 *dst = (u16 *)(to + i);
> > + test = bfin_read(map, from + i);
> > + *dst = test.x[0];
> > + }
> > + }
> > +
> > + if (len & 0x1) {
> > + u8 *last_to_byte = (u8 *)(to + i);
> > + test = bfin_read(map, from + i);
> > + *last_to_byte = (u8)test.x[0];
> > + }
> > +}
>
> The pointer casts are superfluous. Linus prefers variable declarations
> up front (sorry for my bad example). The "+ i" in the last conditional
> is a bit dangerous as any changes to the loop can break it. Linux code
> has lots of churn and not everyone is careful enough to spot such
> subtleties.
> And I believe you can improve performance by killing the put_unaligned
> in the loop. So if we put it all together the end result should be
> something like this:
>
>
> static void bfin_copy_from(struct map_info *map, void *to, unsigned long from, ssize_t len)
> {
> size_t i;
> map_word test;
> u8 *byte;
> u16 *dst;
>
>
> if ((unsigned long)to & 0x1) {
> byte = to;
> test = bfin_read(map, from);
> *byte = test.x[0] >> 8;
> to++;
> from++;
> len--;
>
> }
>
> for (i = 0; i < len; i += 2) {
> dst = to + i;
>
> test = bfin_read(map, from + i);
> *dst = test.x[0];
> }
>
> if ((len & 0x1) {
> byte = to + len - 1;
> test = bfin_read(map, from + len - 1);
> *byte = test.x[0] & 0xff;
> }
> }
>
> What do you think?
actually, i think it'll be simpler to just scrap the whole function:
static void bfin_copy_from(struct map_info *map, void *to, unsigned
long from, ssize_t len)
{
struct async_state *state = (struct async_state *)map->map_priv_1;
switch_to_flash(state);
memcpy(to, map->virt + from, len);
switch_back(state);
}
-mike
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/1] [MTD/MAPS] Blackfin Async Flash Maps: Handle the case where flash memory and ethernet mac/phy are mapped onto the same async bank
2008-05-13 15:34 ` Jörn Engel
@ 2008-05-13 17:42 ` Mike Frysinger
2008-05-13 19:16 ` Jörn Engel
0 siblings, 1 reply; 10+ messages in thread
From: Mike Frysinger @ 2008-05-13 17:42 UTC (permalink / raw)
To: Jörn Engel; +Cc: dwmw2, Bryan Wu, linux-mtd, will.newton, linux-kernel
On Tue, May 13, 2008 at 11:34 AM, Jörn Engel <joern@logfs.org> wrote:
> On Tue, 13 May 2008 12:38:45 +0800, Bryan Wu wrote:
> > +#define pr_devinit(fmt, args...) ({ static const __devinitdata char __fmt[] = fmt; printk(__fmt, ## args); })
>
> That bit is obvious. But why do you use pr_devinit() instead of
> printk()? What does it gain you?
why do we have __init and __devinit in the first place ?
-mike
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/1] [MTD/MAPS] Blackfin Async Flash Maps: Handle the case where flash memory and ethernet mac/phy are mapped onto the same async bank
2008-05-13 17:42 ` Mike Frysinger
@ 2008-05-13 19:16 ` Jörn Engel
2008-05-14 2:50 ` Bryan Wu
0 siblings, 1 reply; 10+ messages in thread
From: Jörn Engel @ 2008-05-13 19:16 UTC (permalink / raw)
To: Mike Frysinger; +Cc: dwmw2, Bryan Wu, linux-mtd, will.newton, linux-kernel
On Tue, 13 May 2008 13:42:04 -0400, Mike Frysinger wrote:
> On Tue, May 13, 2008 at 11:34 AM, Jörn Engel <joern@logfs.org> wrote:
> > On Tue, 13 May 2008 12:38:45 +0800, Bryan Wu wrote:
> > > +#define pr_devinit(fmt, args...) ({ static const __devinitdata char __fmt[] = fmt; printk(__fmt, ## args); })
> >
> > That bit is obvious. But why do you use pr_devinit() instead of
> > printk()? What does it gain you?
>
> why do we have __init and __devinit in the first place ?
Ah. Now I finally understand what this code does.
Might be worth moving it to include/linux/kernel.h, along with
pr_init(). And watch an avalanche of janitor patches use these new
toys. :)
Jörn
--
Joern's library part 3:
http://inst.eecs.berkeley.edu/~cs152/fa05/handouts/clark-test.pdf
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/1] [MTD/MAPS] Blackfin Async Flash Maps: Handle the case where flash memory and ethernet mac/phy are mapped onto the same async bank
2008-05-13 19:16 ` Jörn Engel
@ 2008-05-14 2:50 ` Bryan Wu
0 siblings, 0 replies; 10+ messages in thread
From: Bryan Wu @ 2008-05-14 2:50 UTC (permalink / raw)
To: Jörn Engel
Cc: dwmw2, linux-mtd, will.newton, Mike Frysinger, linux-kernel
On Wed, May 14, 2008 at 3:16 AM, Jörn Engel <joern@logfs.org> wrote:
>
> On Tue, 13 May 2008 13:42:04 -0400, Mike Frysinger wrote:
> > On Tue, May 13, 2008 at 11:34 AM, Jörn Engel <joern@logfs.org> wrote:
> > > On Tue, 13 May 2008 12:38:45 +0800, Bryan Wu wrote:
> > > > +#define pr_devinit(fmt, args...) ({ static const __devinitdata char __fmt[] = fmt; printk(__fmt, ## args); })
> > >
> > > That bit is obvious. But why do you use pr_devinit() instead of
> > > printk()? What does it gain you?
> >
> > why do we have __init and __devinit in the first place ?
>
> Ah. Now I finally understand what this code does.
>
> Might be worth moving it to include/linux/kernel.h, along with
> pr_init(). And watch an avalanche of janitor patches use these new
> toys. :)
>
Yes, I agree. Mike, could you consider providing a patch to add
pr_devinit to common code?
IMO, your weapon can be shared by others.
Thanks
-Bryan
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2008-05-14 2:50 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-05-13 4:38 [PATCH 1/1] [MTD/MAPS] Blackfin Async Flash Maps: Handle the case where flash memory and ethernet mac/phy are mapped onto the same async bank Bryan Wu
2008-05-13 8:07 ` Jörn Engel
2008-05-13 12:42 ` Mike Frysinger
2008-05-13 15:01 ` Jörn Engel
2008-05-13 15:15 ` Mike Frysinger
2008-05-13 15:34 ` Jörn Engel
2008-05-13 17:42 ` Mike Frysinger
2008-05-13 19:16 ` Jörn Engel
2008-05-14 2:50 ` Bryan Wu
2008-05-13 17:41 ` Mike Frysinger
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox