tsunami_flash.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:2k
- /*
- * tsunami_flash.c
- *
- * flash chip on alpha ds10...
- * $Id: tsunami_flash.c,v 1.1 2002/01/10 22:59:13 eric Exp $
- */
- #include <asm/io.h>
- #include <asm/core_tsunami.h>
- #include <linux/mtd/map.h>
- #define FLASH_ENABLE_PORT 0x00C00001
- #define FLASH_ENABLE_BYTE 0x01
- #define FLASH_DISABLE_BYTE 0x00
- #define MAX_TIG_FLASH_SIZE (12*1024*1024)
- static inline __u8 tsunami_flash_read8(struct map_info *map, unsigned long offset)
- {
- return tsunami_tig_readb(offset);
- }
- static void tsunami_flash_write8(struct map_info *map, __u8 value, unsigned long offset)
- {
- tsunami_tig_writeb(value, offset);
- }
- static void tsunami_flash_copy_from(
- struct map_info *map, void *addr, unsigned long offset, ssize_t len)
- {
- unsigned char *dest;
- dest = addr;
- while(len && (offset < MAX_TIG_FLASH_SIZE)) {
- *dest = tsunami_tig_readb(offset);
- offset++;
- dest++;
- len--;
- }
- }
- static void tsunami_flash_copy_to(
- struct map_info *map, unsigned long offset,
- const void *addr, ssize_t len)
- {
- const unsigned char *src;
- src = addr;
- while(len && (offset < MAX_TIG_FLASH_SIZE)) {
- tsunami_tig_writeb(*src, offset);
- offset++;
- src++;
- len--;
- }
- }
- /*
- * Deliberately don't provide operations wider than 8 bits. I don't
- * have then and it scares me to think how you could mess up if
- * you tried to use them. Buswidth is correctly so I'm safe.
- */
- static struct map_info tsunami_flash_map = {
- .name = "flash chip on the Tsunami TIG bus",
- .size = MAX_TIG_FLASH_SIZE,
- .buswidth = 1,
- .read8 = tsunami_flash_read8,
- .read16 = 0,
- .read32 = 0,
- .copy_from = tsunami_flash_copy_from,
- .write8 = tsunami_flash_write8,
- .write16 = 0,
- .write32 = 0,
- .copy_to = tsunami_flash_copy_to,
- .set_vpp = 0,
- .map_priv_1 = 0,
- };
- static struct mtd_info *tsunami_flash_mtd;
- static void __exit cleanup_tsunami_flash(void)
- {
- struct mtd_info *mtd;
- mtd = tsunami_flash_mtd;
- if (mtd) {
- del_mtd_device(mtd);
- map_destroy(mtd);
- }
- tsunami_flash_mtd = 0;
- }
- static int __init init_tsunami_flash(void)
- {
- static const char *rom_probe_types[] = { "cfi_probe", "jedec_probe", "map_rom", 0 };
- char **type;
- tsunami_tig_writeb(FLASH_ENABLE_BYTE, FLASH_ENABLE_PORT);
-
- tsunami_flash_mtd = 0;
- type = rom_probe_types;
- for(; !tsunami_flash_mtd && *type; type++) {
- tsunami_flash_mtd = do_map_probe(*type, &tsunami_flash_map);
- }
- if (tsunami_flash_mtd) {
- tsunami_flash_mtd->module = THIS_MODULE;
- add_mtd_device(tsunami_flash_mtd);
- return 0;
- }
- return -ENXIO;
- }
- module_init(init_tsunami_flash);
- module_exit(cleanup_tsunami_flash);