Merge master.kernel.org:/pub/scm/linux/kernel/git/tglx/mtd-2.6
Este commit está contenido en:
@@ -1,5 +1,5 @@
|
||||
# drivers/mtd/maps/Kconfig
|
||||
# $Id: Kconfig,v 1.42 2005/01/05 16:59:50 dwmw2 Exp $
|
||||
# $Id: Kconfig,v 1.55 2005/07/02 01:53:24 tpoynor Exp $
|
||||
|
||||
menu "Mapping drivers for chip access"
|
||||
depends on MTD!=n
|
||||
@@ -122,16 +122,6 @@ config MTD_SBC_GXX
|
||||
More info at
|
||||
<http://www.arcomcontrols.com/products/icp/pc104/processors/SBC_GX1.htm>.
|
||||
|
||||
config MTD_ELAN_104NC
|
||||
tristate "CFI Flash device mapped on Arcom ELAN-104NC"
|
||||
depends on X86 && MTD_CFI_INTELEXT && MTD_PARTITIONS && MTD_COMPLEX_MAPPINGS
|
||||
help
|
||||
This provides a driver for the on-board flash of the Arcom Control
|
||||
System's ELAN-104NC development board. By default the flash
|
||||
is split into 3 partitions which are accessed as separate MTD
|
||||
devices. This board utilizes Intel StrataFlash. More info at
|
||||
<http://www.arcomcontrols.com/products/icp/pc104/processors/ELAN104NC.htm>.
|
||||
|
||||
config MTD_LUBBOCK
|
||||
tristate "CFI Flash device mapped on Intel Lubbock XScale eval board"
|
||||
depends on ARCH_LUBBOCK && MTD_CFI_INTELEXT && MTD_PARTITIONS
|
||||
@@ -139,6 +129,14 @@ config MTD_LUBBOCK
|
||||
This provides a driver for the on-board flash of the Intel
|
||||
'Lubbock' XScale evaluation board.
|
||||
|
||||
config MTD_MAINSTONE
|
||||
tristate "CFI Flash device mapped on Intel Mainstone XScale eval board"
|
||||
depends on MACH_MAINSTONE && MTD_CFI_INTELEXT
|
||||
select MTD_PARTITIONS
|
||||
help
|
||||
This provides a driver for the on-board flash of the Intel
|
||||
'Mainstone PXA27x evaluation board.
|
||||
|
||||
config MTD_OCTAGON
|
||||
tristate "JEDEC Flash device mapped on Octagon 5066 SBC"
|
||||
depends on X86 && MTD_JEDEC && MTD_COMPLEX_MAPPINGS
|
||||
@@ -213,74 +211,11 @@ config MTD_NETtel
|
||||
help
|
||||
Support for flash chips on NETtel/SecureEdge/SnapGear boards.
|
||||
|
||||
config MTD_PB1XXX
|
||||
tristate "Flash devices on Alchemy PB1xxx boards"
|
||||
depends on MIPS && ( MIPS_PB1000 || MIPS_PB1100 || MIPS_PB1500 )
|
||||
config MTD_ALCHEMY
|
||||
tristate ' AMD Alchemy Pb1xxx/Db1xxx/RDK MTD support'
|
||||
depends on MIPS && SOC_AU1X00
|
||||
help
|
||||
Flash memory access on Alchemy Pb1000/Pb1100/Pb1500 boards
|
||||
|
||||
config MTD_PB1XXX_BOOT
|
||||
bool "PB1x00 boot flash device"
|
||||
depends on MTD_PB1XXX && ( MIPS_PB1100 || MIPS_PB1500 )
|
||||
help
|
||||
Use the first of the two 32MiB flash banks on Pb1100/Pb1500 board.
|
||||
You can say 'Y' to both this and 'MTD_PB1XXX_USER' below, to use
|
||||
both banks.
|
||||
|
||||
config MTD_PB1XXX_USER
|
||||
bool "PB1x00 user flash device"
|
||||
depends on MTD_PB1XXX && ( MIPS_PB1100 || MIPS_PB1500 )
|
||||
default y if MTD_PB1XX_BOOT = n
|
||||
help
|
||||
Use the second of the two 32MiB flash banks on Pb1100/Pb1500 board.
|
||||
You can say 'Y' to both this and 'MTD_PB1XXX_BOOT' above, to use
|
||||
both banks.
|
||||
|
||||
config MTD_PB1550
|
||||
tristate "Flash devices on Alchemy PB1550 board"
|
||||
depends on MIPS && MIPS_PB1550
|
||||
help
|
||||
Flash memory access on Alchemy Pb1550 board
|
||||
|
||||
config MTD_PB1550_BOOT
|
||||
bool "PB1550 boot flash device"
|
||||
depends on MTD_PB1550
|
||||
help
|
||||
Use the first of the two 64MiB flash banks on Pb1550 board.
|
||||
You can say 'Y' to both this and 'MTD_PB1550_USER' below, to use
|
||||
both banks.
|
||||
|
||||
config MTD_PB1550_USER
|
||||
bool "PB1550 user flash device"
|
||||
depends on MTD_PB1550
|
||||
default y if MTD_PB1550_BOOT = n
|
||||
help
|
||||
Use the second of the two 64MiB flash banks on Pb1550 board.
|
||||
You can say 'Y' to both this and 'MTD_PB1550_BOOT' above, to use
|
||||
both banks.
|
||||
|
||||
config MTD_DB1550
|
||||
tristate "Flash devices on Alchemy DB1550 board"
|
||||
depends on MIPS && MIPS_DB1550
|
||||
help
|
||||
Flash memory access on Alchemy Db1550 board
|
||||
|
||||
config MTD_DB1550_BOOT
|
||||
bool "DB1550 boot flash device"
|
||||
depends on MTD_DB1550
|
||||
help
|
||||
Use the first of the two 64MiB flash banks on Db1550 board.
|
||||
You can say 'Y' to both this and 'MTD_DB1550_USER' below, to use
|
||||
both banks.
|
||||
|
||||
config MTD_DB1550_USER
|
||||
bool "DB1550 user flash device"
|
||||
depends on MTD_DB1550
|
||||
default y if MTD_DB1550_BOOT = n
|
||||
help
|
||||
Use the second of the two 64MiB flash banks on Db1550 board.
|
||||
You can say 'Y' to both this and 'MTD_DB1550_BOOT' above, to use
|
||||
both banks.
|
||||
Flash memory access on AMD Alchemy Pb/Db/RDK Reference Boards
|
||||
|
||||
config MTD_DILNETPC
|
||||
tristate "CFI Flash device mapped on DIL/Net PC"
|
||||
@@ -588,6 +523,15 @@ config MTD_MPC1211
|
||||
This enables access to the flash chips on the Interface MPC-1211(CTP/PCI/MPC-SH02).
|
||||
If you have such a board, say 'Y'.
|
||||
|
||||
config MTD_OMAP_NOR
|
||||
tristate "TI OMAP board mappings"
|
||||
depends on MTD_CFI && ARCH_OMAP
|
||||
help
|
||||
This enables access to the NOR flash chips on TI OMAP-based
|
||||
boards defining flash platform devices and flash platform data.
|
||||
These boards include the Innovator, H2, H3, OSK, Perseus2, and
|
||||
more. If you have such a board, say 'Y'.
|
||||
|
||||
# This needs CFI or JEDEC, depending on the cards found.
|
||||
config MTD_PCI
|
||||
tristate "PCI MTD driver"
|
||||
@@ -647,13 +591,14 @@ config MTD_DMV182
|
||||
Map driver for Dy-4 SVME/DMV-182 board.
|
||||
|
||||
config MTD_BAST
|
||||
tristate "Map driver for Simtec BAST (EB2410ITX)"
|
||||
depends on ARCH_BAST
|
||||
tristate "Map driver for Simtec BAST (EB2410ITX) or Thorcom VR1000"
|
||||
depends on ARCH_BAST || MACH_VR1000
|
||||
select MTD_PARTITIONS
|
||||
select MTD_MAP_BANK_WIDTH_16
|
||||
select MTD_JEDECPROBE
|
||||
help
|
||||
Map driver for NOR flash on the Simtec BAST (EB2410ITX).
|
||||
Map driver for NOR flash on the Simtec BAST (EB2410ITX), or the
|
||||
Thorcom VR1000
|
||||
|
||||
Note, this driver *cannot* over-ride the WP link on the
|
||||
board, or currently detect the state of the link.
|
||||
@@ -669,5 +614,15 @@ config MTD_SHARP_SL
|
||||
help
|
||||
This enables access to the flash chip on the Sharp SL Series of PDAs.
|
||||
|
||||
config MTD_PLATRAM
|
||||
tristate "Map driver for platform device RAM (mtd-ram)"
|
||||
depends on MTD
|
||||
select MTD_RAM
|
||||
help
|
||||
Map driver for RAM areas described via the platform device
|
||||
system.
|
||||
|
||||
This selection automatically selects the map_ram driver.
|
||||
|
||||
endmenu
|
||||
|
||||
|
@@ -1,7 +1,7 @@
|
||||
#
|
||||
# linux/drivers/maps/Makefile
|
||||
#
|
||||
# $Id: Makefile.common,v 1.23 2005/01/05 17:06:36 dwmw2 Exp $
|
||||
# $Id: Makefile.common,v 1.30 2005/07/02 01:53:24 tpoynor Exp $
|
||||
|
||||
ifeq ($(CONFIG_MTD_COMPLEX_MAPPINGS),y)
|
||||
obj-$(CONFIG_MTD) += map_funcs.o
|
||||
@@ -15,7 +15,6 @@ obj-$(CONFIG_MTD_CFI_FLAGADM) += cfi_flagadm.o
|
||||
obj-$(CONFIG_MTD_CSTM_MIPS_IXX) += cstm_mips_ixx.o
|
||||
obj-$(CONFIG_MTD_DC21285) += dc21285.o
|
||||
obj-$(CONFIG_MTD_DILNETPC) += dilnetpc.o
|
||||
obj-$(CONFIG_MTD_ELAN_104NC) += elan-104nc.o
|
||||
obj-$(CONFIG_MTD_EPXA10DB) += epxa10db-flash.o
|
||||
obj-$(CONFIG_MTD_IQ80310) += iq80310.o
|
||||
obj-$(CONFIG_MTD_L440GX) += l440gx.o
|
||||
@@ -23,6 +22,7 @@ obj-$(CONFIG_MTD_AMD76XROM) += amd76xrom.o
|
||||
obj-$(CONFIG_MTD_ICHXROM) += ichxrom.o
|
||||
obj-$(CONFIG_MTD_TSUNAMI) += tsunami_flash.o
|
||||
obj-$(CONFIG_MTD_LUBBOCK) += lubbock-flash.o
|
||||
obj-$(CONFIG_MTD_MAINSTONE) += mainstone-flash.o
|
||||
obj-$(CONFIG_MTD_MBX860) += mbx860.o
|
||||
obj-$(CONFIG_MTD_CEIVA) += ceiva.o
|
||||
obj-$(CONFIG_MTD_OCTAGON) += octagon-5066.o
|
||||
@@ -44,10 +44,7 @@ obj-$(CONFIG_MTD_DBOX2) += dbox2-flash.o
|
||||
obj-$(CONFIG_MTD_OCELOT) += ocelot.o
|
||||
obj-$(CONFIG_MTD_SOLUTIONENGINE)+= solutionengine.o
|
||||
obj-$(CONFIG_MTD_PCI) += pci.o
|
||||
obj-$(CONFIG_MTD_PB1XXX) += pb1xxx-flash.o
|
||||
obj-$(CONFIG_MTD_DB1X00) += db1x00-flash.o
|
||||
obj-$(CONFIG_MTD_PB1550) += pb1550-flash.o
|
||||
obj-$(CONFIG_MTD_DB1550) += db1550-flash.o
|
||||
obj-$(CONFIG_MTD_ALCHEMY) += alchemy-flash.o
|
||||
obj-$(CONFIG_MTD_LASAT) += lasat.o
|
||||
obj-$(CONFIG_MTD_AUTCPU12) += autcpu12-nvram.o
|
||||
obj-$(CONFIG_MTD_EDB7312) += edb7312.o
|
||||
@@ -71,3 +68,5 @@ obj-$(CONFIG_MTD_IXP2000) += ixp2000.o
|
||||
obj-$(CONFIG_MTD_WRSBC8260) += wr_sbc82xx_flash.o
|
||||
obj-$(CONFIG_MTD_DMV182) += dmv182.o
|
||||
obj-$(CONFIG_MTD_SHARP_SL) += sharpsl-flash.o
|
||||
obj-$(CONFIG_MTD_PLATRAM) += plat-ram.o
|
||||
obj-$(CONFIG_MTD_OMAP_NOR) += omap_nor.o
|
||||
|
192
drivers/mtd/maps/alchemy-flash.c
Archivo normal
192
drivers/mtd/maps/alchemy-flash.c
Archivo normal
@@ -0,0 +1,192 @@
|
||||
/*
|
||||
* Flash memory access on AMD Alchemy evaluation boards
|
||||
*
|
||||
* $Id: alchemy-flash.c,v 1.1 2005/02/27 21:50:21 ppopov Exp $
|
||||
*
|
||||
* (C) 2003, 2004 Pete Popov <ppopov@embeddedalley.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/map.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
|
||||
#ifdef DEBUG_RW
|
||||
#define DBG(x...) printk(x)
|
||||
#else
|
||||
#define DBG(x...)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MIPS_PB1000
|
||||
#define BOARD_MAP_NAME "Pb1000 Flash"
|
||||
#define BOARD_FLASH_SIZE 0x00800000 /* 8MB */
|
||||
#define BOARD_FLASH_WIDTH 4 /* 32-bits */
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MIPS_PB1500
|
||||
#define BOARD_MAP_NAME "Pb1500 Flash"
|
||||
#define BOARD_FLASH_SIZE 0x04000000 /* 64MB */
|
||||
#define BOARD_FLASH_WIDTH 4 /* 32-bits */
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MIPS_PB1100
|
||||
#define BOARD_MAP_NAME "Pb1100 Flash"
|
||||
#define BOARD_FLASH_SIZE 0x04000000 /* 64MB */
|
||||
#define BOARD_FLASH_WIDTH 4 /* 32-bits */
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MIPS_PB1550
|
||||
#define BOARD_MAP_NAME "Pb1550 Flash"
|
||||
#define BOARD_FLASH_SIZE 0x08000000 /* 128MB */
|
||||
#define BOARD_FLASH_WIDTH 4 /* 32-bits */
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MIPS_PB1200
|
||||
#define BOARD_MAP_NAME "Pb1200 Flash"
|
||||
#define BOARD_FLASH_SIZE 0x08000000 /* 128MB */
|
||||
#define BOARD_FLASH_WIDTH 2 /* 16-bits */
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MIPS_DB1000
|
||||
#define BOARD_MAP_NAME "Db1000 Flash"
|
||||
#define BOARD_FLASH_SIZE 0x02000000 /* 32MB */
|
||||
#define BOARD_FLASH_WIDTH 4 /* 32-bits */
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MIPS_DB1500
|
||||
#define BOARD_MAP_NAME "Db1500 Flash"
|
||||
#define BOARD_FLASH_SIZE 0x02000000 /* 32MB */
|
||||
#define BOARD_FLASH_WIDTH 4 /* 32-bits */
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MIPS_DB1100
|
||||
#define BOARD_MAP_NAME "Db1100 Flash"
|
||||
#define BOARD_FLASH_SIZE 0x02000000 /* 32MB */
|
||||
#define BOARD_FLASH_WIDTH 4 /* 32-bits */
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MIPS_DB1550
|
||||
#define BOARD_MAP_NAME "Db1550 Flash"
|
||||
#define BOARD_FLASH_SIZE 0x08000000 /* 128MB */
|
||||
#define BOARD_FLASH_WIDTH 4 /* 32-bits */
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MIPS_DB1200
|
||||
#define BOARD_MAP_NAME "Db1200 Flash"
|
||||
#define BOARD_FLASH_SIZE 0x04000000 /* 64MB */
|
||||
#define BOARD_FLASH_WIDTH 2 /* 16-bits */
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MIPS_HYDROGEN3
|
||||
#define BOARD_MAP_NAME "Hydrogen3 Flash"
|
||||
#define BOARD_FLASH_SIZE 0x02000000 /* 32MB */
|
||||
#define BOARD_FLASH_WIDTH 4 /* 32-bits */
|
||||
#define USE_LOCAL_ACCESSORS /* why? */
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MIPS_BOSPORUS
|
||||
#define BOARD_MAP_NAME "Bosporus Flash"
|
||||
#define BOARD_FLASH_SIZE 0x01000000 /* 16MB */
|
||||
#define BOARD_FLASH_WIDTH 2 /* 16-bits */
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MIPS_MIRAGE
|
||||
#define BOARD_MAP_NAME "Mirage Flash"
|
||||
#define BOARD_FLASH_SIZE 0x04000000 /* 64MB */
|
||||
#define BOARD_FLASH_WIDTH 4 /* 32-bits */
|
||||
#define USE_LOCAL_ACCESSORS /* why? */
|
||||
#endif
|
||||
|
||||
static struct map_info alchemy_map = {
|
||||
.name = BOARD_MAP_NAME,
|
||||
};
|
||||
|
||||
static struct mtd_partition alchemy_partitions[] = {
|
||||
{
|
||||
.name = "User FS",
|
||||
.size = BOARD_FLASH_SIZE - 0x00400000,
|
||||
.offset = 0x0000000
|
||||
},{
|
||||
.name = "YAMON",
|
||||
.size = 0x0100000,
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.mask_flags = MTD_WRITEABLE
|
||||
},{
|
||||
.name = "raw kernel",
|
||||
.size = (0x300000 - 0x40000), /* last 256KB is yamon env */
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
}
|
||||
};
|
||||
|
||||
#define NB_OF(x) (sizeof(x)/sizeof(x[0]))
|
||||
|
||||
static struct mtd_info *mymtd;
|
||||
|
||||
int __init alchemy_mtd_init(void)
|
||||
{
|
||||
struct mtd_partition *parts;
|
||||
int nb_parts = 0;
|
||||
unsigned long window_addr;
|
||||
unsigned long window_size;
|
||||
|
||||
/* Default flash buswidth */
|
||||
alchemy_map.bankwidth = BOARD_FLASH_WIDTH;
|
||||
|
||||
window_addr = 0x20000000 - BOARD_FLASH_SIZE;
|
||||
window_size = BOARD_FLASH_SIZE;
|
||||
#ifdef CONFIG_MIPS_MIRAGE_WHY
|
||||
/* Boot ROM flash bank only; no user bank */
|
||||
window_addr = 0x1C000000;
|
||||
window_size = 0x04000000;
|
||||
/* USERFS from 0x1C00 0000 to 0x1FC00000 */
|
||||
alchemy_partitions[0].size = 0x03C00000;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Static partition definition selection
|
||||
*/
|
||||
parts = alchemy_partitions;
|
||||
nb_parts = NB_OF(alchemy_partitions);
|
||||
alchemy_map.size = window_size;
|
||||
|
||||
/*
|
||||
* Now let's probe for the actual flash. Do it here since
|
||||
* specific machine settings might have been set above.
|
||||
*/
|
||||
printk(KERN_NOTICE BOARD_MAP_NAME ": probing %d-bit flash bus\n",
|
||||
alchemy_map.bankwidth*8);
|
||||
alchemy_map.virt = ioremap(window_addr, window_size);
|
||||
mymtd = do_map_probe("cfi_probe", &alchemy_map);
|
||||
if (!mymtd) {
|
||||
iounmap(alchemy_map.virt);
|
||||
return -ENXIO;
|
||||
}
|
||||
mymtd->owner = THIS_MODULE;
|
||||
|
||||
add_mtd_partitions(mymtd, parts, nb_parts);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit alchemy_mtd_cleanup(void)
|
||||
{
|
||||
if (mymtd) {
|
||||
del_mtd_partitions(mymtd);
|
||||
map_destroy(mymtd);
|
||||
iounmap(alchemy_map.virt);
|
||||
}
|
||||
}
|
||||
|
||||
module_init(alchemy_mtd_init);
|
||||
module_exit(alchemy_mtd_cleanup);
|
||||
|
||||
MODULE_AUTHOR("Embedded Alley Solutions, Inc");
|
||||
MODULE_DESCRIPTION(BOARD_MAP_NAME " MTD driver");
|
||||
MODULE_LICENSE("GPL");
|
@@ -2,7 +2,7 @@
|
||||
* amd76xrom.c
|
||||
*
|
||||
* Normal mappings of chips in physical memory
|
||||
* $Id: amd76xrom.c,v 1.19 2004/11/28 09:40:39 dwmw2 Exp $
|
||||
* $Id: amd76xrom.c,v 1.20 2005/03/18 14:04:35 gleixner Exp $
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
@@ -314,7 +314,7 @@ static int __init init_amd76xrom(void)
|
||||
}
|
||||
return -ENXIO;
|
||||
#if 0
|
||||
return pci_module_init(&amd76xrom_driver);
|
||||
return pci_register_driver(&amd76xrom_driver);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@@ -1,14 +1,15 @@
|
||||
/* linux/drivers/mtd/maps/bast_flash.c
|
||||
*
|
||||
* Copyright (c) 2004 Simtec Electronics
|
||||
* Ben Dooks <ben@simtec.co.uk>
|
||||
* Copyright (c) 2004-2005 Simtec Electronics
|
||||
* Ben Dooks <ben@simtec.co.uk>
|
||||
*
|
||||
* Simtec Bast (EB2410ITX) NOR MTD Mapping driver
|
||||
*
|
||||
* Changelog:
|
||||
* 20-Sep-2004 BJD Initial version
|
||||
* 17-Jan-2005 BJD Add whole device if no partitions found
|
||||
*
|
||||
* $Id: bast-flash.c,v 1.1 2004/09/21 14:29:04 bjd Exp $
|
||||
* $Id: bast-flash.c,v 1.2 2005/01/18 11:13:47 bjd Exp $
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -46,9 +47,9 @@
|
||||
#include <asm/arch/bast-cpld.h>
|
||||
|
||||
#ifdef CONFIG_MTD_BAST_MAXSIZE
|
||||
#define AREA_MAXSIZE (CONFIG_MTD_BAST_MAXSIZE * (1024*1024))
|
||||
#define AREA_MAXSIZE (CONFIG_MTD_BAST_MAXSIZE * SZ_1M)
|
||||
#else
|
||||
#define AREA_MAXSIZE (32*1024*1024)
|
||||
#define AREA_MAXSIZE (32 * SZ_1M)
|
||||
#endif
|
||||
|
||||
#define PFX "bast-flash: "
|
||||
@@ -189,6 +190,8 @@ static int bast_flash_probe(struct device *dev)
|
||||
err = add_mtd_partitions(info->mtd, info->partitions, err);
|
||||
if (err)
|
||||
printk(KERN_ERR PFX "cannot add/parse partitions\n");
|
||||
} else {
|
||||
err = add_mtd_device(info->mtd);
|
||||
}
|
||||
|
||||
if (err == 0)
|
||||
|
@@ -1,187 +0,0 @@
|
||||
/*
|
||||
* Flash memory access on Alchemy Db1550 board
|
||||
*
|
||||
* $Id: db1550-flash.c,v 1.7 2004/11/04 13:24:14 gleixner Exp $
|
||||
*
|
||||
* (C) 2004 Embedded Edge, LLC, based on db1550-flash.c:
|
||||
* (C) 2003, 2004 Pete Popov <ppopov@embeddedalley.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/map.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
|
||||
#ifdef DEBUG_RW
|
||||
#define DBG(x...) printk(x)
|
||||
#else
|
||||
#define DBG(x...)
|
||||
#endif
|
||||
|
||||
static unsigned long window_addr;
|
||||
static unsigned long window_size;
|
||||
|
||||
|
||||
static struct map_info db1550_map = {
|
||||
.name = "Db1550 flash",
|
||||
};
|
||||
|
||||
static unsigned char flash_bankwidth = 4;
|
||||
|
||||
/*
|
||||
* Support only 64MB NOR Flash parts
|
||||
*/
|
||||
|
||||
#if defined(CONFIG_MTD_DB1550_BOOT) && defined(CONFIG_MTD_DB1550_USER)
|
||||
#define DB1550_BOTH_BANKS
|
||||
#elif defined(CONFIG_MTD_DB1550_BOOT) && !defined(CONFIG_MTD_DB1550_USER)
|
||||
#define DB1550_BOOT_ONLY
|
||||
#elif !defined(CONFIG_MTD_DB1550_BOOT) && defined(CONFIG_MTD_DB1550_USER)
|
||||
#define DB1550_USER_ONLY
|
||||
#endif
|
||||
|
||||
#ifdef DB1550_BOTH_BANKS
|
||||
/* both banks will be used. Combine the first bank and the first
|
||||
* part of the second bank together into a single jffs/jffs2
|
||||
* partition.
|
||||
*/
|
||||
static struct mtd_partition db1550_partitions[] = {
|
||||
/* assume boot[2:0]:swap is '0000' or '1000', which translates to:
|
||||
* 1C00 0000 1FFF FFFF CE0 64MB Boot NOR Flash
|
||||
* 1800 0000 1BFF FFFF CE0 64MB Param NOR Flash
|
||||
*/
|
||||
{
|
||||
.name = "User FS",
|
||||
.size = (0x1FC00000 - 0x18000000),
|
||||
.offset = 0x0000000
|
||||
},{
|
||||
.name = "yamon",
|
||||
.size = 0x0100000,
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.mask_flags = MTD_WRITEABLE
|
||||
},{
|
||||
.name = "raw kernel",
|
||||
.size = (0x300000 - 0x40000), /* last 256KB is yamon env */
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
}
|
||||
};
|
||||
#elif defined(DB1550_BOOT_ONLY)
|
||||
static struct mtd_partition db1550_partitions[] = {
|
||||
/* assume boot[2:0]:swap is '0000' or '1000', which translates to:
|
||||
* 1C00 0000 1FFF FFFF CE0 64MB Boot NOR Flash
|
||||
*/
|
||||
{
|
||||
.name = "User FS",
|
||||
.size = 0x03c00000,
|
||||
.offset = 0x0000000
|
||||
},{
|
||||
.name = "yamon",
|
||||
.size = 0x0100000,
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.mask_flags = MTD_WRITEABLE
|
||||
},{
|
||||
.name = "raw kernel",
|
||||
.size = (0x300000-0x40000), /* last 256KB is yamon env */
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
}
|
||||
};
|
||||
#elif defined(DB1550_USER_ONLY)
|
||||
static struct mtd_partition db1550_partitions[] = {
|
||||
/* assume boot[2:0]:swap is '0000' or '1000', which translates to:
|
||||
* 1800 0000 1BFF FFFF CE0 64MB Param NOR Flash
|
||||
*/
|
||||
{
|
||||
.name = "User FS",
|
||||
.size = (0x4000000 - 0x200000), /* reserve 2MB for raw kernel */
|
||||
.offset = 0x0000000
|
||||
},{
|
||||
.name = "raw kernel",
|
||||
.size = MTDPART_SIZ_FULL,
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
}
|
||||
};
|
||||
#else
|
||||
#error MTD_DB1550 define combo error /* should never happen */
|
||||
#endif
|
||||
|
||||
#define NB_OF(x) (sizeof(x)/sizeof(x[0]))
|
||||
|
||||
static struct mtd_info *mymtd;
|
||||
|
||||
/*
|
||||
* Probe the flash density and setup window address and size
|
||||
* based on user CONFIG options. There are times when we don't
|
||||
* want the MTD driver to be probing the boot or user flash,
|
||||
* so having the option to enable only one bank is important.
|
||||
*/
|
||||
int setup_flash_params(void)
|
||||
{
|
||||
#if defined(DB1550_BOTH_BANKS)
|
||||
window_addr = 0x18000000;
|
||||
window_size = 0x8000000;
|
||||
#elif defined(DB1550_BOOT_ONLY)
|
||||
window_addr = 0x1C000000;
|
||||
window_size = 0x4000000;
|
||||
#else /* USER ONLY */
|
||||
window_addr = 0x18000000;
|
||||
window_size = 0x4000000;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
int __init db1550_mtd_init(void)
|
||||
{
|
||||
struct mtd_partition *parts;
|
||||
int nb_parts = 0;
|
||||
|
||||
/* Default flash bankwidth */
|
||||
db1550_map.bankwidth = flash_bankwidth;
|
||||
|
||||
if (setup_flash_params())
|
||||
return -ENXIO;
|
||||
|
||||
/*
|
||||
* Static partition definition selection
|
||||
*/
|
||||
parts = db1550_partitions;
|
||||
nb_parts = NB_OF(db1550_partitions);
|
||||
db1550_map.size = window_size;
|
||||
|
||||
/*
|
||||
* Now let's probe for the actual flash. Do it here since
|
||||
* specific machine settings might have been set above.
|
||||
*/
|
||||
printk(KERN_NOTICE "Db1550 flash: probing %d-bit flash bus\n",
|
||||
db1550_map.bankwidth*8);
|
||||
db1550_map.virt = ioremap(window_addr, window_size);
|
||||
mymtd = do_map_probe("cfi_probe", &db1550_map);
|
||||
if (!mymtd) return -ENXIO;
|
||||
mymtd->owner = THIS_MODULE;
|
||||
|
||||
add_mtd_partitions(mymtd, parts, nb_parts);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit db1550_mtd_cleanup(void)
|
||||
{
|
||||
if (mymtd) {
|
||||
del_mtd_partitions(mymtd);
|
||||
map_destroy(mymtd);
|
||||
iounmap((void *) db1550_map.virt);
|
||||
}
|
||||
}
|
||||
|
||||
module_init(db1550_mtd_init);
|
||||
module_exit(db1550_mtd_cleanup);
|
||||
|
||||
MODULE_AUTHOR("Embedded Edge, LLC");
|
||||
MODULE_DESCRIPTION("Db1550 mtd map driver");
|
||||
MODULE_LICENSE("GPL");
|
@@ -1,226 +0,0 @@
|
||||
/*
|
||||
* Flash memory access on Alchemy Db1xxx boards
|
||||
*
|
||||
* $Id: db1x00-flash.c,v 1.6 2004/11/04 13:24:14 gleixner Exp $
|
||||
*
|
||||
* (C) 2003 Pete Popov <ppopov@embeddedalley.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/map.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
|
||||
#ifdef DEBUG_RW
|
||||
#define DBG(x...) printk(x)
|
||||
#else
|
||||
#define DBG(x...)
|
||||
#endif
|
||||
|
||||
/* MTD CONFIG OPTIONS */
|
||||
#if defined(CONFIG_MTD_DB1X00_BOOT) && defined(CONFIG_MTD_DB1X00_USER)
|
||||
#define DB1X00_BOTH_BANKS
|
||||
#elif defined(CONFIG_MTD_DB1X00_BOOT) && !defined(CONFIG_MTD_DB1X00_USER)
|
||||
#define DB1X00_BOOT_ONLY
|
||||
#elif !defined(CONFIG_MTD_DB1X00_BOOT) && defined(CONFIG_MTD_DB1X00_USER)
|
||||
#define DB1X00_USER_ONLY
|
||||
#endif
|
||||
|
||||
static unsigned long window_addr;
|
||||
static unsigned long window_size;
|
||||
static unsigned long flash_size;
|
||||
|
||||
static unsigned short *bcsr = (unsigned short *)0xAE000000;
|
||||
static unsigned char flash_bankwidth = 4;
|
||||
|
||||
/*
|
||||
* The Db1x boards support different flash densities. We setup
|
||||
* the mtd_partition structures below for default of 64Mbit
|
||||
* flash densities, and override the partitions sizes, if
|
||||
* necessary, after we check the board status register.
|
||||
*/
|
||||
|
||||
#ifdef DB1X00_BOTH_BANKS
|
||||
/* both banks will be used. Combine the first bank and the first
|
||||
* part of the second bank together into a single jffs/jffs2
|
||||
* partition.
|
||||
*/
|
||||
static struct mtd_partition db1x00_partitions[] = {
|
||||
{
|
||||
.name = "User FS",
|
||||
.size = 0x1c00000,
|
||||
.offset = 0x0000000
|
||||
},{
|
||||
.name = "yamon",
|
||||
.size = 0x0100000,
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.mask_flags = MTD_WRITEABLE
|
||||
},{
|
||||
.name = "raw kernel",
|
||||
.size = (0x300000-0x40000), /* last 256KB is env */
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
}
|
||||
};
|
||||
#elif defined(DB1X00_BOOT_ONLY)
|
||||
static struct mtd_partition db1x00_partitions[] = {
|
||||
{
|
||||
.name = "User FS",
|
||||
.size = 0x00c00000,
|
||||
.offset = 0x0000000
|
||||
},{
|
||||
.name = "yamon",
|
||||
.size = 0x0100000,
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.mask_flags = MTD_WRITEABLE
|
||||
},{
|
||||
.name = "raw kernel",
|
||||
.size = (0x300000-0x40000), /* last 256KB is env */
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
}
|
||||
};
|
||||
#elif defined(DB1X00_USER_ONLY)
|
||||
static struct mtd_partition db1x00_partitions[] = {
|
||||
{
|
||||
.name = "User FS",
|
||||
.size = 0x0e00000,
|
||||
.offset = 0x0000000
|
||||
},{
|
||||
.name = "raw kernel",
|
||||
.size = MTDPART_SIZ_FULL,
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
}
|
||||
};
|
||||
#else
|
||||
#error MTD_DB1X00 define combo error /* should never happen */
|
||||
#endif
|
||||
#define NB_OF(x) (sizeof(x)/sizeof(x[0]))
|
||||
|
||||
#define NAME "Db1x00 Linux Flash"
|
||||
|
||||
static struct map_info db1xxx_mtd_map = {
|
||||
.name = NAME,
|
||||
};
|
||||
|
||||
static struct mtd_partition *parsed_parts;
|
||||
static struct mtd_info *db1xxx_mtd;
|
||||
|
||||
/*
|
||||
* Probe the flash density and setup window address and size
|
||||
* based on user CONFIG options. There are times when we don't
|
||||
* want the MTD driver to be probing the boot or user flash,
|
||||
* so having the option to enable only one bank is important.
|
||||
*/
|
||||
int setup_flash_params(void)
|
||||
{
|
||||
switch ((bcsr[2] >> 14) & 0x3) {
|
||||
case 0: /* 64Mbit devices */
|
||||
flash_size = 0x800000; /* 8MB per part */
|
||||
#if defined(DB1X00_BOTH_BANKS)
|
||||
window_addr = 0x1E000000;
|
||||
window_size = 0x2000000;
|
||||
#elif defined(DB1X00_BOOT_ONLY)
|
||||
window_addr = 0x1F000000;
|
||||
window_size = 0x1000000;
|
||||
#else /* USER ONLY */
|
||||
window_addr = 0x1E000000;
|
||||
window_size = 0x1000000;
|
||||
#endif
|
||||
break;
|
||||
case 1:
|
||||
/* 128 Mbit devices */
|
||||
flash_size = 0x1000000; /* 16MB per part */
|
||||
#if defined(DB1X00_BOTH_BANKS)
|
||||
window_addr = 0x1C000000;
|
||||
window_size = 0x4000000;
|
||||
/* USERFS from 0x1C00 0000 to 0x1FC0 0000 */
|
||||
db1x00_partitions[0].size = 0x3C00000;
|
||||
#elif defined(DB1X00_BOOT_ONLY)
|
||||
window_addr = 0x1E000000;
|
||||
window_size = 0x2000000;
|
||||
/* USERFS from 0x1E00 0000 to 0x1FC0 0000 */
|
||||
db1x00_partitions[0].size = 0x1C00000;
|
||||
#else /* USER ONLY */
|
||||
window_addr = 0x1C000000;
|
||||
window_size = 0x2000000;
|
||||
/* USERFS from 0x1C00 0000 to 0x1DE00000 */
|
||||
db1x00_partitions[0].size = 0x1DE0000;
|
||||
#endif
|
||||
break;
|
||||
case 2:
|
||||
/* 256 Mbit devices */
|
||||
flash_size = 0x4000000; /* 64MB per part */
|
||||
#if defined(DB1X00_BOTH_BANKS)
|
||||
return 1;
|
||||
#elif defined(DB1X00_BOOT_ONLY)
|
||||
/* Boot ROM flash bank only; no user bank */
|
||||
window_addr = 0x1C000000;
|
||||
window_size = 0x4000000;
|
||||
/* USERFS from 0x1C00 0000 to 0x1FC00000 */
|
||||
db1x00_partitions[0].size = 0x3C00000;
|
||||
#else /* USER ONLY */
|
||||
return 1;
|
||||
#endif
|
||||
break;
|
||||
default:
|
||||
return 1;
|
||||
}
|
||||
db1xxx_mtd_map.size = window_size;
|
||||
db1xxx_mtd_map.bankwidth = flash_bankwidth;
|
||||
db1xxx_mtd_map.phys = window_addr;
|
||||
db1xxx_mtd_map.bankwidth = flash_bankwidth;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int __init db1x00_mtd_init(void)
|
||||
{
|
||||
struct mtd_partition *parts;
|
||||
int nb_parts = 0;
|
||||
|
||||
if (setup_flash_params())
|
||||
return -ENXIO;
|
||||
|
||||
/*
|
||||
* Static partition definition selection
|
||||
*/
|
||||
parts = db1x00_partitions;
|
||||
nb_parts = NB_OF(db1x00_partitions);
|
||||
|
||||
/*
|
||||
* Now let's probe for the actual flash. Do it here since
|
||||
* specific machine settings might have been set above.
|
||||
*/
|
||||
printk(KERN_NOTICE "Db1xxx flash: probing %d-bit flash bus\n",
|
||||
db1xxx_mtd_map.bankwidth*8);
|
||||
db1xxx_mtd_map.virt = ioremap(window_addr, window_size);
|
||||
db1xxx_mtd = do_map_probe("cfi_probe", &db1xxx_mtd_map);
|
||||
if (!db1xxx_mtd) return -ENXIO;
|
||||
db1xxx_mtd->owner = THIS_MODULE;
|
||||
|
||||
add_mtd_partitions(db1xxx_mtd, parts, nb_parts);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit db1x00_mtd_cleanup(void)
|
||||
{
|
||||
if (db1xxx_mtd) {
|
||||
del_mtd_partitions(db1xxx_mtd);
|
||||
map_destroy(db1xxx_mtd);
|
||||
if (parsed_parts)
|
||||
kfree(parsed_parts);
|
||||
}
|
||||
}
|
||||
|
||||
module_init(db1x00_mtd_init);
|
||||
module_exit(db1x00_mtd_cleanup);
|
||||
|
||||
MODULE_AUTHOR("Pete Popov");
|
||||
MODULE_DESCRIPTION("Db1x00 mtd map driver");
|
||||
MODULE_LICENSE("GPL");
|
@@ -1,228 +0,0 @@
|
||||
/* elan-104nc.c -- MTD map driver for Arcom Control Systems ELAN-104NC
|
||||
|
||||
Copyright (C) 2000 Arcom Control System Ltd
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
|
||||
$Id: elan-104nc.c,v 1.25 2004/11/28 09:40:39 dwmw2 Exp $
|
||||
|
||||
The ELAN-104NC has up to 8 Mibyte of Intel StrataFlash (28F320/28F640) in x16
|
||||
mode. This drivers uses the CFI probe and Intel Extended Command Set drivers.
|
||||
|
||||
The flash is accessed as follows:
|
||||
|
||||
32 kbyte memory window at 0xb0000-0xb7fff
|
||||
|
||||
16 bit I/O port (0x22) for some sort of paging.
|
||||
|
||||
The single flash device is divided into 3 partition which appear as separate
|
||||
MTD devices.
|
||||
|
||||
Linux thinks that the I/O port is used by the PIC and hence check_region() will
|
||||
always fail. So we don't do it. I just hope it doesn't break anything.
|
||||
*/
|
||||
#include <linux/module.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/init.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
#include <linux/mtd/map.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
|
||||
#define WINDOW_START 0xb0000
|
||||
/* Number of bits in offset. */
|
||||
#define WINDOW_SHIFT 15
|
||||
#define WINDOW_LENGTH (1 << WINDOW_SHIFT)
|
||||
/* The bits for the offset into the window. */
|
||||
#define WINDOW_MASK (WINDOW_LENGTH-1)
|
||||
#define PAGE_IO 0x22
|
||||
#define PAGE_IO_SIZE 2
|
||||
|
||||
static volatile int page_in_window = -1; // Current page in window.
|
||||
static void __iomem *iomapadr;
|
||||
static DEFINE_SPINLOCK(elan_104nc_spin);
|
||||
|
||||
/* partition_info gives details on the logical partitions that the split the
|
||||
* single flash device into. If the size if zero we use up to the end of the
|
||||
* device. */
|
||||
static struct mtd_partition partition_info[]={
|
||||
{ .name = "ELAN-104NC flash boot partition",
|
||||
.offset = 0,
|
||||
.size = 640*1024 },
|
||||
{ .name = "ELAN-104NC flash partition 1",
|
||||
.offset = 640*1024,
|
||||
.size = 896*1024 },
|
||||
{ .name = "ELAN-104NC flash partition 2",
|
||||
.offset = (640+896)*1024 }
|
||||
};
|
||||
#define NUM_PARTITIONS (sizeof(partition_info)/sizeof(partition_info[0]))
|
||||
|
||||
/*
|
||||
* If no idea what is going on here. This is taken from the FlashFX stuff.
|
||||
*/
|
||||
#define ROMCS 1
|
||||
|
||||
static inline void elan_104nc_setup(void)
|
||||
{
|
||||
u16 t;
|
||||
|
||||
outw( 0x0023 + ROMCS*2, PAGE_IO );
|
||||
t=inb( PAGE_IO+1 );
|
||||
|
||||
t=(t & 0xf9) | 0x04;
|
||||
|
||||
outw( ((0x0023 + ROMCS*2) | (t << 8)), PAGE_IO );
|
||||
}
|
||||
|
||||
static inline void elan_104nc_page(struct map_info *map, unsigned long ofs)
|
||||
{
|
||||
unsigned long page = ofs >> WINDOW_SHIFT;
|
||||
|
||||
if( page!=page_in_window ) {
|
||||
int cmd1;
|
||||
int cmd2;
|
||||
|
||||
cmd1=(page & 0x700) + 0x0833 + ROMCS*0x4000;
|
||||
cmd2=((page & 0xff) << 8) + 0x0032;
|
||||
|
||||
outw( cmd1, PAGE_IO );
|
||||
outw( cmd2, PAGE_IO );
|
||||
|
||||
page_in_window = page;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static map_word elan_104nc_read16(struct map_info *map, unsigned long ofs)
|
||||
{
|
||||
map_word ret;
|
||||
spin_lock(&elan_104nc_spin);
|
||||
elan_104nc_page(map, ofs);
|
||||
ret.x[0] = readw(iomapadr + (ofs & WINDOW_MASK));
|
||||
spin_unlock(&elan_104nc_spin);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void elan_104nc_copy_from(struct map_info *map, void *to, unsigned long from, ssize_t len)
|
||||
{
|
||||
while (len) {
|
||||
unsigned long thislen = len;
|
||||
if (len > (WINDOW_LENGTH - (from & WINDOW_MASK)))
|
||||
thislen = WINDOW_LENGTH-(from & WINDOW_MASK);
|
||||
|
||||
spin_lock(&elan_104nc_spin);
|
||||
elan_104nc_page(map, from);
|
||||
memcpy_fromio(to, iomapadr + (from & WINDOW_MASK), thislen);
|
||||
spin_unlock(&elan_104nc_spin);
|
||||
to += thislen;
|
||||
from += thislen;
|
||||
len -= thislen;
|
||||
}
|
||||
}
|
||||
|
||||
static void elan_104nc_write16(struct map_info *map, map_word d, unsigned long adr)
|
||||
{
|
||||
spin_lock(&elan_104nc_spin);
|
||||
elan_104nc_page(map, adr);
|
||||
writew(d.x[0], iomapadr + (adr & WINDOW_MASK));
|
||||
spin_unlock(&elan_104nc_spin);
|
||||
}
|
||||
|
||||
static void elan_104nc_copy_to(struct map_info *map, unsigned long to, const void *from, ssize_t len)
|
||||
{
|
||||
while(len) {
|
||||
unsigned long thislen = len;
|
||||
if (len > (WINDOW_LENGTH - (to & WINDOW_MASK)))
|
||||
thislen = WINDOW_LENGTH-(to & WINDOW_MASK);
|
||||
|
||||
spin_lock(&elan_104nc_spin);
|
||||
elan_104nc_page(map, to);
|
||||
memcpy_toio(iomapadr + (to & WINDOW_MASK), from, thislen);
|
||||
spin_unlock(&elan_104nc_spin);
|
||||
to += thislen;
|
||||
from += thislen;
|
||||
len -= thislen;
|
||||
}
|
||||
}
|
||||
|
||||
static struct map_info elan_104nc_map = {
|
||||
.name = "ELAN-104NC flash",
|
||||
.phys = NO_XIP,
|
||||
.size = 8*1024*1024, /* this must be set to a maximum possible amount
|
||||
of flash so the cfi probe routines find all
|
||||
the chips */
|
||||
.bankwidth = 2,
|
||||
.read = elan_104nc_read16,
|
||||
.copy_from = elan_104nc_copy_from,
|
||||
.write = elan_104nc_write16,
|
||||
.copy_to = elan_104nc_copy_to
|
||||
};
|
||||
|
||||
/* MTD device for all of the flash. */
|
||||
static struct mtd_info *all_mtd;
|
||||
|
||||
static void cleanup_elan_104nc(void)
|
||||
{
|
||||
if( all_mtd ) {
|
||||
del_mtd_partitions( all_mtd );
|
||||
map_destroy( all_mtd );
|
||||
}
|
||||
|
||||
iounmap(iomapadr);
|
||||
}
|
||||
|
||||
static int __init init_elan_104nc(void)
|
||||
{
|
||||
/* Urg! We use I/O port 0x22 without request_region()ing it,
|
||||
because it's already allocated to the PIC. */
|
||||
|
||||
iomapadr = ioremap(WINDOW_START, WINDOW_LENGTH);
|
||||
if (!iomapadr) {
|
||||
printk( KERN_ERR"%s: failed to ioremap memory region\n",
|
||||
elan_104nc_map.name );
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
printk( KERN_INFO"%s: IO:0x%x-0x%x MEM:0x%x-0x%x\n",
|
||||
elan_104nc_map.name,
|
||||
PAGE_IO, PAGE_IO+PAGE_IO_SIZE-1,
|
||||
WINDOW_START, WINDOW_START+WINDOW_LENGTH-1 );
|
||||
|
||||
elan_104nc_setup();
|
||||
|
||||
/* Probe for chip. */
|
||||
all_mtd = do_map_probe("cfi_probe", &elan_104nc_map );
|
||||
if( !all_mtd ) {
|
||||
cleanup_elan_104nc();
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
all_mtd->owner = THIS_MODULE;
|
||||
|
||||
/* Create MTD devices for each partition. */
|
||||
add_mtd_partitions( all_mtd, partition_info, NUM_PARTITIONS );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
module_init(init_elan_104nc);
|
||||
module_exit(cleanup_elan_104nc);
|
||||
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Arcom Control Systems Ltd.");
|
||||
MODULE_DESCRIPTION("MTD map driver for Arcom Control Systems ELAN-104NC");
|
@@ -2,7 +2,7 @@
|
||||
* ichxrom.c
|
||||
*
|
||||
* Normal mappings of chips in physical memory
|
||||
* $Id: ichxrom.c,v 1.16 2004/11/28 09:40:39 dwmw2 Exp $
|
||||
* $Id: ichxrom.c,v 1.18 2005/07/07 10:26:20 dwmw2 Exp $
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
@@ -338,9 +338,9 @@ static struct pci_device_id ichxrom_pci_tbl[] __devinitdata = {
|
||||
{ 0, },
|
||||
};
|
||||
|
||||
#if 0
|
||||
MODULE_DEVICE_TABLE(pci, ichxrom_pci_tbl);
|
||||
|
||||
#if 0
|
||||
static struct pci_driver ichxrom_driver = {
|
||||
.name = MOD_NAME,
|
||||
.id_table = ichxrom_pci_tbl,
|
||||
@@ -366,7 +366,7 @@ static int __init init_ichxrom(void)
|
||||
}
|
||||
return -ENXIO;
|
||||
#if 0
|
||||
return pci_module_init(&ichxrom_driver);
|
||||
return pci_register_driver(&ichxrom_driver);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: ixp2000.c,v 1.5 2004/11/16 17:15:48 dsaxena Exp $
|
||||
* $Id: ixp2000.c,v 1.6 2005/03/18 14:07:46 gleixner Exp $
|
||||
*
|
||||
* drivers/mtd/maps/ixp2000.c
|
||||
*
|
||||
@@ -216,11 +216,6 @@ static int ixp2000_flash_probe(struct device *_dev)
|
||||
goto Error;
|
||||
}
|
||||
|
||||
/*
|
||||
* Setup read mode for FLASH
|
||||
*/
|
||||
*IXP2000_SLOWPORT_FRM = 1;
|
||||
|
||||
#if defined(__ARMEB__)
|
||||
/*
|
||||
* Enable erratum 44 workaround for NPUs with broken slowport
|
||||
|
178
drivers/mtd/maps/mainstone-flash.c
Archivo normal
178
drivers/mtd/maps/mainstone-flash.c
Archivo normal
@@ -0,0 +1,178 @@
|
||||
/*
|
||||
* $Id: $
|
||||
*
|
||||
* Map driver for the Mainstone developer platform.
|
||||
*
|
||||
* Author: Nicolas Pitre
|
||||
* Copyright: (C) 2001 MontaVista Software Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/map.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/arch/pxa-regs.h>
|
||||
#include <asm/arch/mainstone.h>
|
||||
|
||||
|
||||
#define ROM_ADDR 0x00000000
|
||||
#define FLASH_ADDR 0x04000000
|
||||
|
||||
#define WINDOW_SIZE 0x04000000
|
||||
|
||||
static void mainstone_map_inval_cache(struct map_info *map, unsigned long from,
|
||||
ssize_t len)
|
||||
{
|
||||
consistent_sync((char *)map->cached + from, len, DMA_FROM_DEVICE);
|
||||
}
|
||||
|
||||
static struct map_info mainstone_maps[2] = { {
|
||||
.size = WINDOW_SIZE,
|
||||
.phys = PXA_CS0_PHYS,
|
||||
.inval_cache = mainstone_map_inval_cache,
|
||||
}, {
|
||||
.size = WINDOW_SIZE,
|
||||
.phys = PXA_CS1_PHYS,
|
||||
.inval_cache = mainstone_map_inval_cache,
|
||||
} };
|
||||
|
||||
static struct mtd_partition mainstone_partitions[] = {
|
||||
{
|
||||
.name = "Bootloader",
|
||||
.size = 0x00040000,
|
||||
.offset = 0,
|
||||
.mask_flags = MTD_WRITEABLE /* force read-only */
|
||||
},{
|
||||
.name = "Kernel",
|
||||
.size = 0x00400000,
|
||||
.offset = 0x00040000,
|
||||
},{
|
||||
.name = "Filesystem",
|
||||
.size = MTDPART_SIZ_FULL,
|
||||
.offset = 0x00440000
|
||||
}
|
||||
};
|
||||
|
||||
static struct mtd_info *mymtds[2];
|
||||
static struct mtd_partition *parsed_parts[2];
|
||||
static int nr_parsed_parts[2];
|
||||
|
||||
static const char *probes[] = { "RedBoot", "cmdlinepart", NULL };
|
||||
|
||||
static int __init init_mainstone(void)
|
||||
{
|
||||
int SW7 = 0; /* FIXME: get from SCR (Mst doc section 3.2.1.1) */
|
||||
int ret = 0, i;
|
||||
|
||||
mainstone_maps[0].bankwidth = (BOOT_DEF & 1) ? 2 : 4;
|
||||
mainstone_maps[1].bankwidth = 4;
|
||||
|
||||
/* Compensate for SW7 which swaps the flash banks */
|
||||
mainstone_maps[SW7].name = "processor flash";
|
||||
mainstone_maps[SW7 ^ 1].name = "main board flash";
|
||||
|
||||
printk(KERN_NOTICE "Mainstone configured to boot from %s\n",
|
||||
mainstone_maps[0].name);
|
||||
|
||||
for (i = 0; i < 2; i++) {
|
||||
mainstone_maps[i].virt = ioremap(mainstone_maps[i].phys,
|
||||
WINDOW_SIZE);
|
||||
if (!mainstone_maps[i].virt) {
|
||||
printk(KERN_WARNING "Failed to ioremap %s\n",
|
||||
mainstone_maps[i].name);
|
||||
if (!ret)
|
||||
ret = -ENOMEM;
|
||||
continue;
|
||||
}
|
||||
mainstone_maps[i].cached =
|
||||
ioremap_cached(mainstone_maps[i].phys, WINDOW_SIZE);
|
||||
if (!mainstone_maps[i].cached)
|
||||
printk(KERN_WARNING "Failed to ioremap cached %s\n",
|
||||
mainstone_maps[i].name);
|
||||
simple_map_init(&mainstone_maps[i]);
|
||||
|
||||
printk(KERN_NOTICE
|
||||
"Probing %s at physical address 0x%08lx"
|
||||
" (%d-bit bankwidth)\n",
|
||||
mainstone_maps[i].name, mainstone_maps[i].phys,
|
||||
mainstone_maps[i].bankwidth * 8);
|
||||
|
||||
mymtds[i] = do_map_probe("cfi_probe", &mainstone_maps[i]);
|
||||
|
||||
if (!mymtds[i]) {
|
||||
iounmap((void *)mainstone_maps[i].virt);
|
||||
if (mainstone_maps[i].cached)
|
||||
iounmap(mainstone_maps[i].cached);
|
||||
if (!ret)
|
||||
ret = -EIO;
|
||||
continue;
|
||||
}
|
||||
mymtds[i]->owner = THIS_MODULE;
|
||||
|
||||
ret = parse_mtd_partitions(mymtds[i], probes,
|
||||
&parsed_parts[i], 0);
|
||||
|
||||
if (ret > 0)
|
||||
nr_parsed_parts[i] = ret;
|
||||
}
|
||||
|
||||
if (!mymtds[0] && !mymtds[1])
|
||||
return ret;
|
||||
|
||||
for (i = 0; i < 2; i++) {
|
||||
if (!mymtds[i]) {
|
||||
printk(KERN_WARNING "%s is absent. Skipping\n",
|
||||
mainstone_maps[i].name);
|
||||
} else if (nr_parsed_parts[i]) {
|
||||
add_mtd_partitions(mymtds[i], parsed_parts[i],
|
||||
nr_parsed_parts[i]);
|
||||
} else if (!i) {
|
||||
printk("Using static partitions on %s\n",
|
||||
mainstone_maps[i].name);
|
||||
add_mtd_partitions(mymtds[i], mainstone_partitions,
|
||||
ARRAY_SIZE(mainstone_partitions));
|
||||
} else {
|
||||
printk("Registering %s as whole device\n",
|
||||
mainstone_maps[i].name);
|
||||
add_mtd_device(mymtds[i]);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit cleanup_mainstone(void)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < 2; i++) {
|
||||
if (!mymtds[i])
|
||||
continue;
|
||||
|
||||
if (nr_parsed_parts[i] || !i)
|
||||
del_mtd_partitions(mymtds[i]);
|
||||
else
|
||||
del_mtd_device(mymtds[i]);
|
||||
|
||||
map_destroy(mymtds[i]);
|
||||
iounmap((void *)mainstone_maps[i].virt);
|
||||
if (mainstone_maps[i].cached)
|
||||
iounmap(mainstone_maps[i].cached);
|
||||
kfree(parsed_parts[i]);
|
||||
}
|
||||
}
|
||||
|
||||
module_init(init_mainstone);
|
||||
module_exit(cleanup_mainstone);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Nicolas Pitre <nico@cam.org>");
|
||||
MODULE_DESCRIPTION("MTD map driver for Intel Mainstone");
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: map_funcs.c,v 1.9 2004/07/13 22:33:15 dwmw2 Exp $
|
||||
* $Id: map_funcs.c,v 1.10 2005/06/06 23:04:36 tpoynor Exp $
|
||||
*
|
||||
* Out-of-line map I/O functions for simple maps when CONFIG_COMPLEX_MAPPINGS
|
||||
* is enabled.
|
||||
@@ -9,23 +9,24 @@
|
||||
#include <linux/module.h>
|
||||
|
||||
#include <linux/mtd/map.h>
|
||||
#include <linux/mtd/xip.h>
|
||||
|
||||
static map_word simple_map_read(struct map_info *map, unsigned long ofs)
|
||||
static map_word __xipram simple_map_read(struct map_info *map, unsigned long ofs)
|
||||
{
|
||||
return inline_map_read(map, ofs);
|
||||
}
|
||||
|
||||
static void simple_map_write(struct map_info *map, const map_word datum, unsigned long ofs)
|
||||
static void __xipram simple_map_write(struct map_info *map, const map_word datum, unsigned long ofs)
|
||||
{
|
||||
inline_map_write(map, datum, ofs);
|
||||
}
|
||||
|
||||
static void simple_map_copy_from(struct map_info *map, void *to, unsigned long from, ssize_t len)
|
||||
static void __xipram simple_map_copy_from(struct map_info *map, void *to, unsigned long from, ssize_t len)
|
||||
{
|
||||
inline_map_copy_from(map, to, from, len);
|
||||
}
|
||||
|
||||
static void simple_map_copy_to(struct map_info *map, unsigned long to, const void *from, ssize_t len)
|
||||
static void __xipram simple_map_copy_to(struct map_info *map, unsigned long to, const void *from, ssize_t len)
|
||||
{
|
||||
inline_map_copy_to(map, to, from, len);
|
||||
}
|
||||
|
179
drivers/mtd/maps/omap_nor.c
Archivo normal
179
drivers/mtd/maps/omap_nor.c
Archivo normal
@@ -0,0 +1,179 @@
|
||||
/*
|
||||
* Flash memory support for various TI OMAP boards
|
||||
*
|
||||
* Copyright (C) 2001-2002 MontaVista Software Inc.
|
||||
* Copyright (C) 2003-2004 Texas Instruments
|
||||
* Copyright (C) 2004 Nokia Corporation
|
||||
*
|
||||
* Assembled using driver code copyright the companies above
|
||||
* and written by David Brownell, Jian Zhang <jzhang@ti.com>,
|
||||
* Tony Lindgren <tony@atomide.com> and others.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
|
||||
* NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/map.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/flash.h>
|
||||
#include <asm/arch/tc.h>
|
||||
|
||||
#ifdef CONFIG_MTD_PARTITIONS
|
||||
static const char *part_probes[] = { /* "RedBoot", */ "cmdlinepart", NULL };
|
||||
#endif
|
||||
|
||||
struct omapflash_info {
|
||||
struct mtd_partition *parts;
|
||||
struct mtd_info *mtd;
|
||||
struct map_info map;
|
||||
};
|
||||
|
||||
static void omap_set_vpp(struct map_info *map, int enable)
|
||||
{
|
||||
static int count;
|
||||
|
||||
if (enable) {
|
||||
if (count++ == 0)
|
||||
OMAP_EMIFS_CONFIG_REG |= OMAP_EMIFS_CONFIG_WP;
|
||||
} else {
|
||||
if (count && (--count == 0))
|
||||
OMAP_EMIFS_CONFIG_REG &= ~OMAP_EMIFS_CONFIG_WP;
|
||||
}
|
||||
}
|
||||
|
||||
static int __devinit omapflash_probe(struct device *dev)
|
||||
{
|
||||
int err;
|
||||
struct omapflash_info *info;
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
struct flash_platform_data *pdata = pdev->dev.platform_data;
|
||||
struct resource *res = pdev->resource;
|
||||
unsigned long size = res->end - res->start + 1;
|
||||
|
||||
info = kmalloc(sizeof(struct omapflash_info), GFP_KERNEL);
|
||||
if (!info)
|
||||
return -ENOMEM;
|
||||
|
||||
memset(info, 0, sizeof(struct omapflash_info));
|
||||
|
||||
if (!request_mem_region(res->start, size, "flash")) {
|
||||
err = -EBUSY;
|
||||
goto out_free_info;
|
||||
}
|
||||
|
||||
info->map.virt = ioremap(res->start, size);
|
||||
if (!info->map.virt) {
|
||||
err = -ENOMEM;
|
||||
goto out_release_mem_region;
|
||||
}
|
||||
info->map.name = pdev->dev.bus_id;
|
||||
info->map.phys = res->start;
|
||||
info->map.size = size;
|
||||
info->map.bankwidth = pdata->width;
|
||||
info->map.set_vpp = omap_set_vpp;
|
||||
|
||||
simple_map_init(&info->map);
|
||||
info->mtd = do_map_probe(pdata->map_name, &info->map);
|
||||
if (!info->mtd) {
|
||||
err = -EIO;
|
||||
goto out_iounmap;
|
||||
}
|
||||
info->mtd->owner = THIS_MODULE;
|
||||
|
||||
#ifdef CONFIG_MTD_PARTITIONS
|
||||
err = parse_mtd_partitions(info->mtd, part_probes, &info->parts, 0);
|
||||
if (err > 0)
|
||||
add_mtd_partitions(info->mtd, info->parts, err);
|
||||
else if (err < 0 && pdata->parts)
|
||||
add_mtd_partitions(info->mtd, pdata->parts, pdata->nr_parts);
|
||||
else
|
||||
#endif
|
||||
add_mtd_device(info->mtd);
|
||||
|
||||
dev_set_drvdata(&pdev->dev, info);
|
||||
|
||||
return 0;
|
||||
|
||||
out_iounmap:
|
||||
iounmap(info->map.virt);
|
||||
out_release_mem_region:
|
||||
release_mem_region(res->start, size);
|
||||
out_free_info:
|
||||
kfree(info);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int __devexit omapflash_remove(struct device *dev)
|
||||
{
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
struct omapflash_info *info = dev_get_drvdata(&pdev->dev);
|
||||
|
||||
dev_set_drvdata(&pdev->dev, NULL);
|
||||
|
||||
if (info) {
|
||||
if (info->parts) {
|
||||
del_mtd_partitions(info->mtd);
|
||||
kfree(info->parts);
|
||||
} else
|
||||
del_mtd_device(info->mtd);
|
||||
map_destroy(info->mtd);
|
||||
release_mem_region(info->map.phys, info->map.size);
|
||||
iounmap((void __iomem *) info->map.virt);
|
||||
kfree(info);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct device_driver omapflash_driver = {
|
||||
.name = "omapflash",
|
||||
.bus = &platform_bus_type,
|
||||
.probe = omapflash_probe,
|
||||
.remove = __devexit_p(omapflash_remove),
|
||||
};
|
||||
|
||||
static int __init omapflash_init(void)
|
||||
{
|
||||
return driver_register(&omapflash_driver);
|
||||
}
|
||||
|
||||
static void __exit omapflash_exit(void)
|
||||
{
|
||||
driver_unregister(&omapflash_driver);
|
||||
}
|
||||
|
||||
module_init(omapflash_init);
|
||||
module_exit(omapflash_exit);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_DESCRIPTION("MTD NOR map driver for TI OMAP boards");
|
||||
|
@@ -1,203 +0,0 @@
|
||||
/*
|
||||
* Flash memory access on Alchemy Pb1550 board
|
||||
*
|
||||
* $Id: pb1550-flash.c,v 1.6 2004/11/04 13:24:15 gleixner Exp $
|
||||
*
|
||||
* (C) 2004 Embedded Edge, LLC, based on pb1550-flash.c:
|
||||
* (C) 2003 Pete Popov <ppopov@pacbell.net>
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/map.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/au1000.h>
|
||||
#include <asm/pb1550.h>
|
||||
|
||||
#ifdef DEBUG_RW
|
||||
#define DBG(x...) printk(x)
|
||||
#else
|
||||
#define DBG(x...)
|
||||
#endif
|
||||
|
||||
static unsigned long window_addr;
|
||||
static unsigned long window_size;
|
||||
|
||||
|
||||
static struct map_info pb1550_map = {
|
||||
.name = "Pb1550 flash",
|
||||
};
|
||||
|
||||
static unsigned char flash_bankwidth = 4;
|
||||
|
||||
/*
|
||||
* Support only 64MB NOR Flash parts
|
||||
*/
|
||||
|
||||
#ifdef PB1550_BOTH_BANKS
|
||||
/* both banks will be used. Combine the first bank and the first
|
||||
* part of the second bank together into a single jffs/jffs2
|
||||
* partition.
|
||||
*/
|
||||
static struct mtd_partition pb1550_partitions[] = {
|
||||
/* assume boot[2:0]:swap is '0000' or '1000', which translates to:
|
||||
* 1C00 0000 1FFF FFFF CE0 64MB Boot NOR Flash
|
||||
* 1800 0000 1BFF FFFF CE0 64MB Param NOR Flash
|
||||
*/
|
||||
{
|
||||
.name = "User FS",
|
||||
.size = (0x1FC00000 - 0x18000000),
|
||||
.offset = 0x0000000
|
||||
},{
|
||||
.name = "yamon",
|
||||
.size = 0x0100000,
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.mask_flags = MTD_WRITEABLE
|
||||
},{
|
||||
.name = "raw kernel",
|
||||
.size = (0x300000 - 0x40000), /* last 256KB is yamon env */
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
}
|
||||
};
|
||||
#elif defined(PB1550_BOOT_ONLY)
|
||||
static struct mtd_partition pb1550_partitions[] = {
|
||||
/* assume boot[2:0]:swap is '0000' or '1000', which translates to:
|
||||
* 1C00 0000 1FFF FFFF CE0 64MB Boot NOR Flash
|
||||
*/
|
||||
{
|
||||
.name = "User FS",
|
||||
.size = 0x03c00000,
|
||||
.offset = 0x0000000
|
||||
},{
|
||||
.name = "yamon",
|
||||
.size = 0x0100000,
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.mask_flags = MTD_WRITEABLE
|
||||
},{
|
||||
.name = "raw kernel",
|
||||
.size = (0x300000-0x40000), /* last 256KB is yamon env */
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
}
|
||||
};
|
||||
#elif defined(PB1550_USER_ONLY)
|
||||
static struct mtd_partition pb1550_partitions[] = {
|
||||
/* assume boot[2:0]:swap is '0000' or '1000', which translates to:
|
||||
* 1800 0000 1BFF FFFF CE0 64MB Param NOR Flash
|
||||
*/
|
||||
{
|
||||
.name = "User FS",
|
||||
.size = (0x4000000 - 0x200000), /* reserve 2MB for raw kernel */
|
||||
.offset = 0x0000000
|
||||
},{
|
||||
.name = "raw kernel",
|
||||
.size = MTDPART_SIZ_FULL,
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
}
|
||||
};
|
||||
#else
|
||||
#error MTD_PB1550 define combo error /* should never happen */
|
||||
#endif
|
||||
|
||||
#define NB_OF(x) (sizeof(x)/sizeof(x[0]))
|
||||
|
||||
static struct mtd_info *mymtd;
|
||||
|
||||
/*
|
||||
* Probe the flash density and setup window address and size
|
||||
* based on user CONFIG options. There are times when we don't
|
||||
* want the MTD driver to be probing the boot or user flash,
|
||||
* so having the option to enable only one bank is important.
|
||||
*/
|
||||
int setup_flash_params(void)
|
||||
{
|
||||
u16 boot_swapboot;
|
||||
boot_swapboot = (au_readl(MEM_STSTAT) & (0x7<<1)) |
|
||||
((bcsr->status >> 6) & 0x1);
|
||||
printk("Pb1550 MTD: boot:swap %d\n", boot_swapboot);
|
||||
|
||||
switch (boot_swapboot) {
|
||||
case 0: /* 512Mbit devices, both enabled */
|
||||
case 1:
|
||||
case 8:
|
||||
case 9:
|
||||
#if defined(PB1550_BOTH_BANKS)
|
||||
window_addr = 0x18000000;
|
||||
window_size = 0x8000000;
|
||||
#elif defined(PB1550_BOOT_ONLY)
|
||||
window_addr = 0x1C000000;
|
||||
window_size = 0x4000000;
|
||||
#else /* USER ONLY */
|
||||
window_addr = 0x1E000000;
|
||||
window_size = 0x4000000;
|
||||
#endif
|
||||
break;
|
||||
case 0xC:
|
||||
case 0xD:
|
||||
case 0xE:
|
||||
case 0xF:
|
||||
/* 64 MB Boot NOR Flash is disabled */
|
||||
/* and the start address is moved to 0x0C00000 */
|
||||
window_addr = 0x0C000000;
|
||||
window_size = 0x4000000;
|
||||
default:
|
||||
printk("Pb1550 MTD: unsupported boot:swap setting\n");
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int __init pb1550_mtd_init(void)
|
||||
{
|
||||
struct mtd_partition *parts;
|
||||
int nb_parts = 0;
|
||||
|
||||
/* Default flash bankwidth */
|
||||
pb1550_map.bankwidth = flash_bankwidth;
|
||||
|
||||
if (setup_flash_params())
|
||||
return -ENXIO;
|
||||
|
||||
/*
|
||||
* Static partition definition selection
|
||||
*/
|
||||
parts = pb1550_partitions;
|
||||
nb_parts = NB_OF(pb1550_partitions);
|
||||
pb1550_map.size = window_size;
|
||||
|
||||
/*
|
||||
* Now let's probe for the actual flash. Do it here since
|
||||
* specific machine settings might have been set above.
|
||||
*/
|
||||
printk(KERN_NOTICE "Pb1550 flash: probing %d-bit flash bus\n",
|
||||
pb1550_map.bankwidth*8);
|
||||
pb1550_map.virt = ioremap(window_addr, window_size);
|
||||
mymtd = do_map_probe("cfi_probe", &pb1550_map);
|
||||
if (!mymtd) return -ENXIO;
|
||||
mymtd->owner = THIS_MODULE;
|
||||
|
||||
add_mtd_partitions(mymtd, parts, nb_parts);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit pb1550_mtd_cleanup(void)
|
||||
{
|
||||
if (mymtd) {
|
||||
del_mtd_partitions(mymtd);
|
||||
map_destroy(mymtd);
|
||||
}
|
||||
}
|
||||
|
||||
module_init(pb1550_mtd_init);
|
||||
module_exit(pb1550_mtd_cleanup);
|
||||
|
||||
MODULE_AUTHOR("Embedded Edge, LLC");
|
||||
MODULE_DESCRIPTION("Pb1550 mtd map driver");
|
||||
MODULE_LICENSE("GPL");
|
@@ -1,178 +0,0 @@
|
||||
/*
|
||||
* Flash memory access on Alchemy Pb1xxx boards
|
||||
*
|
||||
* (C) 2001 Pete Popov <ppopov@mvista.com>
|
||||
*
|
||||
* $Id: pb1xxx-flash.c,v 1.14 2004/11/04 13:24:15 gleixner Exp $
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/map.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
|
||||
#ifdef DEBUG_RW
|
||||
#define DBG(x...) printk(x)
|
||||
#else
|
||||
#define DBG(x...)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MIPS_PB1000
|
||||
|
||||
#define WINDOW_ADDR 0x1F800000
|
||||
#define WINDOW_SIZE 0x800000
|
||||
|
||||
static struct mtd_partition pb1xxx_partitions[] = {
|
||||
{
|
||||
.name = "yamon env",
|
||||
.size = 0x00020000,
|
||||
.offset = 0,
|
||||
.mask_flags = MTD_WRITEABLE},
|
||||
{
|
||||
.name = "User FS",
|
||||
.size = 0x003e0000,
|
||||
.offset = 0x20000,},
|
||||
{
|
||||
.name = "boot code",
|
||||
.size = 0x100000,
|
||||
.offset = 0x400000,
|
||||
.mask_flags = MTD_WRITEABLE},
|
||||
{
|
||||
.name = "raw/kernel",
|
||||
.size = 0x300000,
|
||||
.offset = 0x500000}
|
||||
};
|
||||
|
||||
#elif defined(CONFIG_MIPS_PB1500) || defined(CONFIG_MIPS_PB1100)
|
||||
|
||||
#if defined(CONFIG_MTD_PB1500_BOOT) && defined(CONFIG_MTD_PB1500_USER)
|
||||
/* both 32MB banks will be used. Combine the first 32MB bank and the
|
||||
* first 28MB of the second bank together into a single jffs/jffs2
|
||||
* partition.
|
||||
*/
|
||||
#define WINDOW_ADDR 0x1C000000
|
||||
#define WINDOW_SIZE 0x4000000
|
||||
static struct mtd_partition pb1xxx_partitions[] = {
|
||||
{
|
||||
.name = "User FS",
|
||||
.size = 0x3c00000,
|
||||
.offset = 0x0000000
|
||||
},{
|
||||
.name = "yamon",
|
||||
.size = 0x0100000,
|
||||
.offset = 0x3c00000,
|
||||
.mask_flags = MTD_WRITEABLE
|
||||
},{
|
||||
.name = "raw kernel",
|
||||
.size = 0x02c0000,
|
||||
.offset = 0x3d00000
|
||||
}
|
||||
};
|
||||
#elif defined(CONFIG_MTD_PB1500_BOOT) && !defined(CONFIG_MTD_PB1500_USER)
|
||||
#define WINDOW_ADDR 0x1E000000
|
||||
#define WINDOW_SIZE 0x2000000
|
||||
static struct mtd_partition pb1xxx_partitions[] = {
|
||||
{
|
||||
.name = "User FS",
|
||||
.size = 0x1c00000,
|
||||
.offset = 0x0000000
|
||||
},{
|
||||
.name = "yamon",
|
||||
.size = 0x0100000,
|
||||
.offset = 0x1c00000,
|
||||
.mask_flags = MTD_WRITEABLE
|
||||
},{
|
||||
.name = "raw kernel",
|
||||
.size = 0x02c0000,
|
||||
.offset = 0x1d00000
|
||||
}
|
||||
};
|
||||
#elif !defined(CONFIG_MTD_PB1500_BOOT) && defined(CONFIG_MTD_PB1500_USER)
|
||||
#define WINDOW_ADDR 0x1C000000
|
||||
#define WINDOW_SIZE 0x2000000
|
||||
static struct mtd_partition pb1xxx_partitions[] = {
|
||||
{
|
||||
.name = "User FS",
|
||||
.size = 0x1e00000,
|
||||
.offset = 0x0000000
|
||||
},{
|
||||
.name = "raw kernel",
|
||||
.size = 0x0200000,
|
||||
.offset = 0x1e00000,
|
||||
}
|
||||
};
|
||||
#else
|
||||
#error MTD_PB1500 define combo error /* should never happen */
|
||||
#endif
|
||||
#else
|
||||
#error Unsupported board
|
||||
#endif
|
||||
|
||||
#define NAME "Pb1x00 Linux Flash"
|
||||
#define PADDR WINDOW_ADDR
|
||||
#define BUSWIDTH 4
|
||||
#define SIZE WINDOW_SIZE
|
||||
#define PARTITIONS 4
|
||||
|
||||
static struct map_info pb1xxx_mtd_map = {
|
||||
.name = NAME,
|
||||
.size = SIZE,
|
||||
.bankwidth = BUSWIDTH,
|
||||
.phys = PADDR,
|
||||
};
|
||||
|
||||
static struct mtd_info *pb1xxx_mtd;
|
||||
|
||||
int __init pb1xxx_mtd_init(void)
|
||||
{
|
||||
struct mtd_partition *parts;
|
||||
int nb_parts = 0;
|
||||
char *part_type;
|
||||
|
||||
/*
|
||||
* Static partition definition selection
|
||||
*/
|
||||
part_type = "static";
|
||||
parts = pb1xxx_partitions;
|
||||
nb_parts = ARRAY_SIZE(pb1xxx_partitions);
|
||||
|
||||
/*
|
||||
* Now let's probe for the actual flash. Do it here since
|
||||
* specific machine settings might have been set above.
|
||||
*/
|
||||
printk(KERN_NOTICE "Pb1xxx flash: probing %d-bit flash bus\n",
|
||||
BUSWIDTH*8);
|
||||
pb1xxx_mtd_map.virt = ioremap(WINDOW_ADDR, WINDOW_SIZE);
|
||||
|
||||
simple_map_init(&pb1xxx_mtd_map);
|
||||
|
||||
pb1xxx_mtd = do_map_probe("cfi_probe", &pb1xxx_mtd_map);
|
||||
if (!pb1xxx_mtd) return -ENXIO;
|
||||
pb1xxx_mtd->owner = THIS_MODULE;
|
||||
|
||||
add_mtd_partitions(pb1xxx_mtd, parts, nb_parts);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit pb1xxx_mtd_cleanup(void)
|
||||
{
|
||||
if (pb1xxx_mtd) {
|
||||
del_mtd_partitions(pb1xxx_mtd);
|
||||
map_destroy(pb1xxx_mtd);
|
||||
iounmap((void *) pb1xxx_mtd_map.virt);
|
||||
}
|
||||
}
|
||||
|
||||
module_init(pb1xxx_mtd_init);
|
||||
module_exit(pb1xxx_mtd_cleanup);
|
||||
|
||||
MODULE_AUTHOR("Pete Popov");
|
||||
MODULE_DESCRIPTION("Pb1xxx CFI map driver");
|
||||
MODULE_LICENSE("GPL");
|
@@ -7,7 +7,7 @@
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* $Id: pci.c,v 1.9 2004/11/28 09:40:40 dwmw2 Exp $
|
||||
* $Id: pci.c,v 1.10 2005/03/18 14:04:35 gleixner Exp $
|
||||
*
|
||||
* Generic PCI memory map driver. We support the following boards:
|
||||
* - Intel IQ80310 ATU.
|
||||
@@ -370,7 +370,7 @@ static struct pci_driver mtd_pci_driver = {
|
||||
|
||||
static int __init mtd_pci_maps_init(void)
|
||||
{
|
||||
return pci_module_init(&mtd_pci_driver);
|
||||
return pci_register_driver(&mtd_pci_driver);
|
||||
}
|
||||
|
||||
static void __exit mtd_pci_maps_exit(void)
|
||||
|
278
drivers/mtd/maps/plat-ram.c
Archivo normal
278
drivers/mtd/maps/plat-ram.c
Archivo normal
@@ -0,0 +1,278 @@
|
||||
/* drivers/mtd/maps/plat-ram.c
|
||||
*
|
||||
* (c) 2004-2005 Simtec Electronics
|
||||
* http://www.simtec.co.uk/products/SWLINUX/
|
||||
* Ben Dooks <ben@simtec.co.uk>
|
||||
*
|
||||
* Generic platfrom device based RAM map
|
||||
*
|
||||
* $Id: plat-ram.c,v 1.3 2005/03/19 22:41:27 gleixner Exp $
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/device.h>
|
||||
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/map.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/mtd/plat-ram.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
|
||||
/* private structure for each mtd platform ram device created */
|
||||
|
||||
struct platram_info {
|
||||
struct device *dev;
|
||||
struct mtd_info *mtd;
|
||||
struct map_info map;
|
||||
struct mtd_partition *partitions;
|
||||
struct resource *area;
|
||||
struct platdata_mtd_ram *pdata;
|
||||
};
|
||||
|
||||
/* to_platram_info()
|
||||
*
|
||||
* device private data to struct platram_info conversion
|
||||
*/
|
||||
|
||||
static inline struct platram_info *to_platram_info(struct device *dev)
|
||||
{
|
||||
return (struct platram_info *)dev_get_drvdata(dev);
|
||||
}
|
||||
|
||||
/* platram_setrw
|
||||
*
|
||||
* call the platform device's set rw/ro control
|
||||
*
|
||||
* to = 0 => read-only
|
||||
* = 1 => read-write
|
||||
*/
|
||||
|
||||
static inline void platram_setrw(struct platram_info *info, int to)
|
||||
{
|
||||
if (info->pdata == NULL)
|
||||
return;
|
||||
|
||||
if (info->pdata->set_rw != NULL)
|
||||
(info->pdata->set_rw)(info->dev, to);
|
||||
}
|
||||
|
||||
/* platram_remove
|
||||
*
|
||||
* called to remove the device from the driver's control
|
||||
*/
|
||||
|
||||
static int platram_remove(struct device *dev)
|
||||
{
|
||||
struct platram_info *info = to_platram_info(dev);
|
||||
|
||||
dev_set_drvdata(dev, NULL);
|
||||
|
||||
dev_dbg(dev, "removing device\n");
|
||||
|
||||
if (info == NULL)
|
||||
return 0;
|
||||
|
||||
if (info->mtd) {
|
||||
#ifdef CONFIG_MTD_PARTITIONS
|
||||
if (info->partitions) {
|
||||
del_mtd_partitions(info->mtd);
|
||||
kfree(info->partitions);
|
||||
}
|
||||
#endif
|
||||
del_mtd_device(info->mtd);
|
||||
map_destroy(info->mtd);
|
||||
}
|
||||
|
||||
/* ensure ram is left read-only */
|
||||
|
||||
platram_setrw(info, PLATRAM_RO);
|
||||
|
||||
/* release resources */
|
||||
|
||||
if (info->area) {
|
||||
release_resource(info->area);
|
||||
kfree(info->area);
|
||||
}
|
||||
|
||||
if (info->map.virt != NULL)
|
||||
iounmap(info->map.virt);
|
||||
|
||||
kfree(info);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* platram_probe
|
||||
*
|
||||
* called from device drive system when a device matching our
|
||||
* driver is found.
|
||||
*/
|
||||
|
||||
static int platram_probe(struct device *dev)
|
||||
{
|
||||
struct platform_device *pd = to_platform_device(dev);
|
||||
struct platdata_mtd_ram *pdata;
|
||||
struct platram_info *info;
|
||||
struct resource *res;
|
||||
int err = 0;
|
||||
|
||||
dev_dbg(dev, "probe entered\n");
|
||||
|
||||
if (dev->platform_data == NULL) {
|
||||
dev_err(dev, "no platform data supplied\n");
|
||||
err = -ENOENT;
|
||||
goto exit_error;
|
||||
}
|
||||
|
||||
pdata = dev->platform_data;
|
||||
|
||||
info = kmalloc(sizeof(*info), GFP_KERNEL);
|
||||
if (info == NULL) {
|
||||
dev_err(dev, "no memory for flash info\n");
|
||||
err = -ENOMEM;
|
||||
goto exit_error;
|
||||
}
|
||||
|
||||
memset(info, 0, sizeof(*info));
|
||||
dev_set_drvdata(dev, info);
|
||||
|
||||
info->dev = dev;
|
||||
info->pdata = pdata;
|
||||
|
||||
/* get the resource for the memory mapping */
|
||||
|
||||
res = platform_get_resource(pd, IORESOURCE_MEM, 0);
|
||||
|
||||
if (res == NULL) {
|
||||
dev_err(dev, "no memory resource specified\n");
|
||||
err = -ENOENT;
|
||||
goto exit_free;
|
||||
}
|
||||
|
||||
dev_dbg(dev, "got platform resource %p (0x%lx)\n", res, res->start);
|
||||
|
||||
/* setup map parameters */
|
||||
|
||||
info->map.phys = res->start;
|
||||
info->map.size = (res->end - res->start) + 1;
|
||||
info->map.name = pdata->mapname != NULL ? pdata->mapname : pd->name;
|
||||
info->map.bankwidth = pdata->bankwidth;
|
||||
|
||||
/* register our usage of the memory area */
|
||||
|
||||
info->area = request_mem_region(res->start, info->map.size, pd->name);
|
||||
if (info->area == NULL) {
|
||||
dev_err(dev, "failed to request memory region\n");
|
||||
err = -EIO;
|
||||
goto exit_free;
|
||||
}
|
||||
|
||||
/* remap the memory area */
|
||||
|
||||
info->map.virt = ioremap(res->start, info->map.size);
|
||||
dev_dbg(dev, "virt %p, %lu bytes\n", info->map.virt, info->map.size);
|
||||
|
||||
if (info->map.virt == NULL) {
|
||||
dev_err(dev, "failed to ioremap() region\n");
|
||||
err = -EIO;
|
||||
goto exit_free;
|
||||
}
|
||||
|
||||
simple_map_init(&info->map);
|
||||
|
||||
dev_dbg(dev, "initialised map, probing for mtd\n");
|
||||
|
||||
/* probe for the right mtd map driver */
|
||||
|
||||
info->mtd = do_map_probe("map_ram" , &info->map);
|
||||
if (info->mtd == NULL) {
|
||||
dev_err(dev, "failed to probe for map_ram\n");
|
||||
err = -ENOMEM;
|
||||
goto exit_free;
|
||||
}
|
||||
|
||||
info->mtd->owner = THIS_MODULE;
|
||||
|
||||
platram_setrw(info, PLATRAM_RW);
|
||||
|
||||
/* check to see if there are any available partitions, or wether
|
||||
* to add this device whole */
|
||||
|
||||
#ifdef CONFIG_MTD_PARTITIONS
|
||||
if (pdata->nr_partitions > 0) {
|
||||
const char **probes = { NULL };
|
||||
|
||||
if (pdata->probes)
|
||||
probes = (const char **)pdata->probes;
|
||||
|
||||
err = parse_mtd_partitions(info->mtd, probes,
|
||||
&info->partitions, 0);
|
||||
if (err > 0) {
|
||||
err = add_mtd_partitions(info->mtd, info->partitions,
|
||||
err);
|
||||
}
|
||||
}
|
||||
#endif /* CONFIG_MTD_PARTITIONS */
|
||||
|
||||
if (add_mtd_device(info->mtd)) {
|
||||
dev_err(dev, "add_mtd_device() failed\n");
|
||||
err = -ENOMEM;
|
||||
}
|
||||
|
||||
dev_info(dev, "registered mtd device\n");
|
||||
return err;
|
||||
|
||||
exit_free:
|
||||
platram_remove(dev);
|
||||
exit_error:
|
||||
return err;
|
||||
}
|
||||
|
||||
/* device driver info */
|
||||
|
||||
static struct device_driver platram_driver = {
|
||||
.name = "mtd-ram",
|
||||
.bus = &platform_bus_type,
|
||||
.probe = platram_probe,
|
||||
.remove = platram_remove,
|
||||
};
|
||||
|
||||
/* module init/exit */
|
||||
|
||||
static int __init platram_init(void)
|
||||
{
|
||||
printk("Generic platform RAM MTD, (c) 2004 Simtec Electronics\n");
|
||||
return driver_register(&platram_driver);
|
||||
}
|
||||
|
||||
static void __exit platram_exit(void)
|
||||
{
|
||||
driver_unregister(&platram_driver);
|
||||
}
|
||||
|
||||
module_init(platram_init);
|
||||
module_exit(platram_exit);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Ben Dooks <ben@simtec.co.uk>");
|
||||
MODULE_DESCRIPTION("MTD platform RAM map driver");
|
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* MTD map driver for BIOS Flash on Intel SCB2 boards
|
||||
* $Id: scb2_flash.c,v 1.11 2004/11/28 09:40:40 dwmw2 Exp $
|
||||
* $Id: scb2_flash.c,v 1.12 2005/03/18 14:04:35 gleixner Exp $
|
||||
* Copyright (C) 2002 Sun Microsystems, Inc.
|
||||
* Tim Hockin <thockin@sun.com>
|
||||
*
|
||||
@@ -238,7 +238,7 @@ static struct pci_driver scb2_flash_driver = {
|
||||
static int __init
|
||||
scb2_flash_init(void)
|
||||
{
|
||||
return pci_module_init(&scb2_flash_driver);
|
||||
return pci_register_driver(&scb2_flash_driver);
|
||||
}
|
||||
|
||||
static void __exit
|
||||
|
@@ -4,7 +4,7 @@
|
||||
* Copyright (C) 2001 Lineo Japan, Inc.
|
||||
* Copyright (C) 2002 SHARP
|
||||
*
|
||||
* $Id: sharpsl-flash.c,v 1.2 2004/11/24 20:38:06 rpurdie Exp $
|
||||
* $Id: sharpsl-flash.c,v 1.5 2005/03/21 08:42:11 rpurdie Exp $
|
||||
*
|
||||
* based on rpxlite.c,v 1.15 2001/10/02 15:05:14 dwmw2 Exp
|
||||
* Handle mapping of the flash on the RPX Lite and CLLF boards
|
||||
@@ -24,13 +24,14 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <asm/io.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/map.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#define WINDOW_ADDR 0x00000000
|
||||
#define WINDOW_SIZE 0x01000000
|
||||
#define WINDOW_SIZE 0x00800000
|
||||
#define BANK_WIDTH 2
|
||||
|
||||
static struct mtd_info *mymtd;
|
||||
@@ -44,9 +45,7 @@ struct map_info sharpsl_map = {
|
||||
|
||||
static struct mtd_partition sharpsl_partitions[1] = {
|
||||
{
|
||||
name: "Filesystem",
|
||||
size: 0x006d0000,
|
||||
offset: 0x00120000
|
||||
name: "Boot PROM Filesystem",
|
||||
}
|
||||
};
|
||||
|
||||
@@ -58,12 +57,16 @@ int __init init_sharpsl(void)
|
||||
int nb_parts = 0;
|
||||
char *part_type = "static";
|
||||
|
||||
printk(KERN_NOTICE "Sharp SL series flash device: %x at %x\n", WINDOW_SIZE, WINDOW_ADDR);
|
||||
printk(KERN_NOTICE "Sharp SL series flash device: %x at %x\n",
|
||||
WINDOW_SIZE, WINDOW_ADDR);
|
||||
sharpsl_map.virt = ioremap(WINDOW_ADDR, WINDOW_SIZE);
|
||||
if (!sharpsl_map.virt) {
|
||||
printk("Failed to ioremap\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
simple_map_init(&sharpsl_map);
|
||||
|
||||
mymtd = do_map_probe("map_rom", &sharpsl_map);
|
||||
if (!mymtd) {
|
||||
iounmap(sharpsl_map.virt);
|
||||
@@ -72,6 +75,22 @@ int __init init_sharpsl(void)
|
||||
|
||||
mymtd->owner = THIS_MODULE;
|
||||
|
||||
if (machine_is_corgi() || machine_is_shepherd() || machine_is_husky()
|
||||
|| machine_is_poodle()) {
|
||||
sharpsl_partitions[0].size=0x006d0000;
|
||||
sharpsl_partitions[0].offset=0x00120000;
|
||||
} else if (machine_is_tosa()) {
|
||||
sharpsl_partitions[0].size=0x006a0000;
|
||||
sharpsl_partitions[0].offset=0x00160000;
|
||||
} else if (machine_is_spitz()) {
|
||||
sharpsl_partitions[0].size=0x006b0000;
|
||||
sharpsl_partitions[0].offset=0x00140000;
|
||||
} else {
|
||||
map_destroy(mymtd);
|
||||
iounmap(sharpsl_map.virt);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
parts = sharpsl_partitions;
|
||||
nb_parts = NB_OF(sharpsl_partitions);
|
||||
|
||||
|
Referencia en una nueva incidencia
Block a user