2005-04-16 15:20:36 -07:00
/*
* tsunami_flash . c
*
* flash chip on alpha ds10 . . .
*/
# include <asm/io.h>
# include <asm/core_tsunami.h>
# include <linux/init.h>
# include <linux/mtd/map.h>
# include <linux/mtd/mtd.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 map_word tsunami_flash_read8 ( struct map_info * map , unsigned long offset )
{
map_word val ;
val . x [ 0 ] = tsunami_tig_readb ( offset ) ;
return val ;
}
static void tsunami_flash_write8 ( struct map_info * map , map_word value , unsigned long offset )
{
tsunami_tig_writeb ( value . x [ 0 ] , 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 (
2005-11-07 11:15:40 +00:00
struct map_info * map , unsigned long offset ,
2005-04-16 15:20:36 -07:00
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 ,
2006-02-01 03:04:48 -08:00
. phys = NO_XIP ,
2005-04-16 15:20:36 -07:00
. bankwidth = 1 ,
. read = tsunami_flash_read8 ,
. copy_from = tsunami_flash_copy_from ,
. write = tsunami_flash_write8 ,
. copy_to = tsunami_flash_copy_to ,
} ;
static struct mtd_info * tsunami_flash_mtd ;
static void __exit cleanup_tsunami_flash ( void )
{
struct mtd_info * mtd ;
mtd = tsunami_flash_mtd ;
if ( mtd ) {
2011-05-23 10:23:40 +01:00
mtd_device_unregister ( mtd ) ;
2005-04-16 15:20:36 -07:00
map_destroy ( mtd ) ;
}
tsunami_flash_mtd = 0 ;
}
2013-03-12 10:46:37 +02:00
static const char * const rom_probe_types [ ] = {
" cfi_probe " , " jedec_probe " , " map_rom " , NULL } ;
2005-04-16 15:20:36 -07:00
static int __init init_tsunami_flash ( void )
{
2013-03-12 10:46:37 +02:00
const char * const * type ;
2005-04-16 15:20:36 -07:00
tsunami_tig_writeb ( FLASH_ENABLE_BYTE , FLASH_ENABLE_PORT ) ;
2005-11-07 11:15:40 +00:00
2005-04-16 15:20:36 -07:00
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 - > owner = THIS_MODULE ;
2011-05-23 10:23:40 +01:00
mtd_device_register ( tsunami_flash_mtd , NULL , 0 ) ;
2005-04-16 15:20:36 -07:00
return 0 ;
}
return - ENXIO ;
}
module_init ( init_tsunami_flash ) ;
module_exit ( cleanup_tsunami_flash ) ;