2009-01-08 16:46:40 -08:00
/*
* Octeon Bootbus flash setup
*
* This file is subject to the terms and conditions of the GNU General Public
* License . See the file " COPYING " in the main directory of this archive
* for more details .
*
* Copyright ( C ) 2007 , 2008 Cavium Networks
*/
# include <linux/kernel.h>
2011-07-28 18:46:31 -04:00
# include <linux/export.h>
2009-01-08 16:46:40 -08:00
# include <linux/mtd/mtd.h>
# include <linux/mtd/map.h>
# include <linux/mtd/partitions.h>
# include <asm/octeon/octeon.h>
static struct map_info flash_map ;
static struct mtd_info * mymtd ;
static const char * part_probe_types [ ] = {
" cmdlinepart " ,
# ifdef CONFIG_MTD_REDBOOT_PARTS
" RedBoot " ,
# endif
NULL
} ;
/**
* Module / driver initialization .
*
* Returns Zero on success
*/
static int __init flash_init ( void )
{
/*
* Read the bootbus region 0 setup to determine the base
* address of the flash .
*/
union cvmx_mio_boot_reg_cfgx region_cfg ;
region_cfg . u64 = cvmx_read_csr ( CVMX_MIO_BOOT_REG_CFGX ( 0 ) ) ;
if ( region_cfg . s . en ) {
/*
* The bootloader always takes the flash and sets its
* address so the entire flash fits below
* 0x1fc00000 . This way the flash aliases to
* 0x1fc00000 for booting . Software can access the
* full flash at the true address , while core boot can
* access 4 MB .
*/
/* Use this name so old part lines work */
flash_map . name = " phys_mapped_flash " ;
flash_map . phys = region_cfg . s . base < < 16 ;
flash_map . size = 0x1fc00000 - flash_map . phys ;
2012-09-05 19:19:48 +00:00
/* 8-bit bus (0 + 1) or 16-bit bus (1 + 1) */
flash_map . bankwidth = region_cfg . s . width + 1 ;
2009-01-08 16:46:40 -08:00
flash_map . virt = ioremap ( flash_map . phys , flash_map . size ) ;
pr_notice ( " Bootbus flash: Setting flash for %luMB flash at "
2009-03-30 14:49:41 +02:00
" 0x%08llx \n " , flash_map . size > > 20 , flash_map . phys ) ;
2009-01-08 16:46:40 -08:00
simple_map_init ( & flash_map ) ;
mymtd = do_map_probe ( " cfi_probe " , & flash_map ) ;
if ( mymtd ) {
mymtd - > owner = THIS_MODULE ;
2011-11-10 17:59:45 +00:00
mtd_device_parse_register ( mymtd , part_probe_types ,
mtd: do not use plain 0 as NULL
The first 3 arguments of 'mtd_device_parse_register()' are pointers,
but many callers pass '0' instead of 'NULL'. Fix this globally. Thanks
to coccinelle for making it easy to do with the following semantic patch:
@@
expression mtd, types, parser_data, parts, nr_parts;
@@
(
-mtd_device_parse_register(mtd, 0, parser_data, parts, nr_parts)
+mtd_device_parse_register(mtd, NULL, parser_data, parts, nr_parts)
|
-mtd_device_parse_register(mtd, types, 0, parts, nr_parts)
+mtd_device_parse_register(mtd, types, NULL, parts, nr_parts)
|
-mtd_device_parse_register(mtd, types, parser_data, 0, nr_parts)
+mtd_device_parse_register(mtd, types, parser_data, NULL, nr_parts)
)
Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
2012-03-09 19:24:26 +02:00
NULL , NULL , 0 ) ;
2009-01-08 16:46:40 -08:00
} else {
pr_err ( " Failed to register MTD device for flash \n " ) ;
}
}
return 0 ;
}
late_initcall ( flash_init ) ;