2005-04-16 15:20:36 -07:00
/*
2005-11-07 11:15:40 +00:00
* $ Id : ebony . c , v 1.16 2005 / 11 / 07 11 : 14 : 26 gleixner Exp $
*
2005-04-16 15:20:36 -07:00
* Mapping for Ebony user flash
*
* Matt Porter < mporter @ kernel . crashing . org >
*
* Copyright 2002 - 2004 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 as published by the
* Free Software Foundation ; either version 2 of the License , or ( at your
* option ) any later version .
*/
# include <linux/module.h>
# include <linux/types.h>
# include <linux/kernel.h>
# include <linux/init.h>
# include <linux/mtd/mtd.h>
# include <linux/mtd/map.h>
# include <linux/mtd/partitions.h>
# include <asm/io.h>
# include <asm/ibm44x.h>
# include <platforms/4xx/ebony.h>
static struct mtd_info * flash ;
static struct map_info ebony_small_map = {
. name = " Ebony small flash " ,
. size = EBONY_SMALL_FLASH_SIZE ,
. bankwidth = 1 ,
} ;
static struct map_info ebony_large_map = {
. name = " Ebony large flash " ,
. size = EBONY_LARGE_FLASH_SIZE ,
. bankwidth = 1 ,
} ;
static struct mtd_partition ebony_small_partitions [ ] = {
{
. name = " OpenBIOS " ,
. offset = 0x0 ,
. size = 0x80000 ,
}
} ;
static struct mtd_partition ebony_large_partitions [ ] = {
{
. name = " fs " ,
. offset = 0 ,
. size = 0x380000 ,
} ,
{
. name = " firmware " ,
. offset = 0x380000 ,
. size = 0x80000 ,
}
} ;
int __init init_ebony ( void )
{
u8 fpga0_reg ;
u8 __iomem * fpga0_adr ;
unsigned long long small_flash_base , large_flash_base ;
fpga0_adr = ioremap64 ( EBONY_FPGA_ADDR , 16 ) ;
if ( ! fpga0_adr )
return - ENOMEM ;
fpga0_reg = readb ( fpga0_adr ) ;
iounmap ( fpga0_adr ) ;
if ( EBONY_BOOT_SMALL_FLASH ( fpga0_reg ) & &
! EBONY_FLASH_SEL ( fpga0_reg ) )
small_flash_base = EBONY_SMALL_FLASH_HIGH2 ;
else if ( EBONY_BOOT_SMALL_FLASH ( fpga0_reg ) & &
EBONY_FLASH_SEL ( fpga0_reg ) )
small_flash_base = EBONY_SMALL_FLASH_HIGH1 ;
else if ( ! EBONY_BOOT_SMALL_FLASH ( fpga0_reg ) & &
! EBONY_FLASH_SEL ( fpga0_reg ) )
small_flash_base = EBONY_SMALL_FLASH_LOW2 ;
else
small_flash_base = EBONY_SMALL_FLASH_LOW1 ;
2005-11-07 11:15:40 +00:00
2005-04-16 15:20:36 -07:00
if ( EBONY_BOOT_SMALL_FLASH ( fpga0_reg ) & &
! EBONY_ONBRD_FLASH_EN ( fpga0_reg ) )
large_flash_base = EBONY_LARGE_FLASH_LOW ;
else
large_flash_base = EBONY_LARGE_FLASH_HIGH ;
ebony_small_map . phys = small_flash_base ;
ebony_small_map . virt = ioremap64 ( small_flash_base ,
ebony_small_map . size ) ;
if ( ! ebony_small_map . virt ) {
printk ( " Failed to ioremap flash \n " ) ;
return - EIO ;
}
simple_map_init ( & ebony_small_map ) ;
flash = do_map_probe ( " jedec_probe " , & ebony_small_map ) ;
if ( flash ) {
flash - > owner = THIS_MODULE ;
add_mtd_partitions ( flash , ebony_small_partitions ,
ARRAY_SIZE ( ebony_small_partitions ) ) ;
} else {
printk ( " map probe failed for flash \n " ) ;
return - ENXIO ;
}
ebony_large_map . phys = large_flash_base ;
ebony_large_map . virt = ioremap64 ( large_flash_base ,
ebony_large_map . size ) ;
if ( ! ebony_large_map . virt ) {
printk ( " Failed to ioremap flash \n " ) ;
return - EIO ;
}
simple_map_init ( & ebony_large_map ) ;
flash = do_map_probe ( " jedec_probe " , & ebony_large_map ) ;
if ( flash ) {
flash - > owner = THIS_MODULE ;
add_mtd_partitions ( flash , ebony_large_partitions ,
ARRAY_SIZE ( ebony_large_partitions ) ) ;
} else {
printk ( " map probe failed for flash \n " ) ;
return - ENXIO ;
}
return 0 ;
}
static void __exit cleanup_ebony ( void )
{
if ( flash ) {
del_mtd_partitions ( flash ) ;
map_destroy ( flash ) ;
}
if ( ebony_small_map . virt ) {
iounmap ( ebony_small_map . virt ) ;
ebony_small_map . virt = NULL ;
}
if ( ebony_large_map . virt ) {
iounmap ( ebony_large_map . virt ) ;
ebony_large_map . virt = NULL ;
}
}
module_init ( init_ebony ) ;
module_exit ( cleanup_ebony ) ;
MODULE_LICENSE ( " GPL " ) ;
MODULE_AUTHOR ( " Matt Porter <mporter@kernel.crashing.org> " ) ;
MODULE_DESCRIPTION ( " MTD map and partitions for IBM 440GP Ebony boards " ) ;