2005-04-16 15:20:36 -07:00
/*
* drivers / mtd / nand / toto . c
*
* Copyright ( c ) 2003 Texas Instruments
*
* Derived from drivers / mtd / autcpu12 . c
*
* Copyright ( c ) 2002 Thomas Gleixner < tgxl @ linutronix . de >
*
* 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 .
*
* Overview :
* This is a device driver for the NAND flash device found on the
* TI fido board . It supports 32 MiB and 64 MiB cards
*
2005-11-07 11:15:49 +00:00
* $ Id : toto . c , v 1.5 2005 / 11 / 07 11 : 14 : 31 gleixner Exp $
2005-04-16 15:20:36 -07:00
*/
# include <linux/slab.h>
# include <linux/init.h>
# include <linux/module.h>
# include <linux/delay.h>
# include <linux/mtd/mtd.h>
# include <linux/mtd/nand.h>
# include <linux/mtd/partitions.h>
# include <asm/io.h>
# include <asm/arch/hardware.h>
# include <asm/sizes.h>
# include <asm/arch/toto.h>
# include <asm/arch-omap1510/hardware.h>
# include <asm/arch/gpio.h>
2006-05-23 23:25:53 +02:00
# define CONFIG_NAND_WORKAROUND 1
2005-04-16 15:20:36 -07:00
/*
* MTD structure for TOTO board
*/
static struct mtd_info * toto_mtd = NULL ;
static unsigned long toto_io_base = OMAP_FLASH_1_BASE ;
/*
* Define partitions for flash devices
*/
static struct mtd_partition partition_info64M [ ] = {
{ . name = " toto kernel partition 1 " ,
. offset = 0 ,
. size = 2 * SZ_1M } ,
{ . name = " toto file sys partition 2 " ,
. offset = 2 * SZ_1M ,
. size = 14 * SZ_1M } ,
{ . name = " toto user partition 3 " ,
. offset = 16 * SZ_1M ,
. size = 16 * SZ_1M } ,
{ . name = " toto devboard extra partition 4 " ,
. offset = 32 * SZ_1M ,
. size = 32 * SZ_1M } ,
} ;
static struct mtd_partition partition_info32M [ ] = {
{ . name = " toto kernel partition 1 " ,
. offset = 0 ,
. size = 2 * SZ_1M } ,
{ . name = " toto file sys partition 2 " ,
. offset = 2 * SZ_1M ,
. size = 14 * SZ_1M } ,
{ . name = " toto user partition 3 " ,
. offset = 16 * SZ_1M ,
. size = 16 * SZ_1M } ,
} ;
# define NUM_PARTITIONS32M 3
# define NUM_PARTITIONS64M 4
2006-05-23 23:25:53 +02:00
2005-11-07 11:15:49 +00:00
/*
2005-04-16 15:20:36 -07:00
* hardware specific access to control - lines
2006-05-23 23:25:53 +02:00
*
* ctrl :
* NAND_NCE : bit 0 - > bit 14 ( 0x4000 )
* NAND_CLE : bit 1 - > bit 12 ( 0x1000 )
* NAND_ALE : bit 2 - > bit 1 ( 0x0002 )
*/
static void toto_hwcontrol ( struct mtd_info * mtd , int cmd ,
unsigned int ctrl )
2005-04-16 15:20:36 -07:00
{
2006-05-23 23:25:53 +02:00
struct nand_chip * chip = mtd - > priv ;
if ( ctrl & NAND_CTRL_CHANGE ) {
unsigned long bits ;
2005-04-16 15:20:36 -07:00
2006-05-23 23:25:53 +02:00
/* hopefully enough time for tc make proceding write to clear */
udelay ( 1 ) ;
2005-04-16 15:20:36 -07:00
2006-05-23 23:25:53 +02:00
bits = ( ~ ctrl & NAND_NCE ) < < 14 ;
bits | = ( ctrl & NAND_CLE ) < < 12 ;
bits | = ( ctrl & NAND_ALE ) > > 1 ;
2005-04-16 15:20:36 -07:00
2006-05-23 23:25:53 +02:00
# warning Wild guess as gpiosetout() is nowhere defined in the kernel source - tglx
gpiosetout ( 0x5002 , bits ) ;
# ifdef CONFIG_NAND_WORKAROUND
/* "some" dev boards busted, blue wired to rts2 :( */
rts2setout ( 2 , ( ctrl & NAND_CLE ) < < 1 ) ;
# endif
/* allow time to ensure gpio state to over take memory write */
udelay ( 1 ) ;
2005-04-16 15:20:36 -07:00
}
2006-05-23 23:25:53 +02:00
if ( cmd ! = NAND_CMD_NONE )
writeb ( cmd , chip - > IO_ADDR_W ) ;
2005-04-16 15:20:36 -07:00
}
/*
* Main initialization routine
*/
2006-05-16 13:54:50 +01:00
static int __init toto_init ( void )
2005-04-16 15:20:36 -07:00
{
struct nand_chip * this ;
int err = 0 ;
/* Allocate memory for MTD device structure and private data */
2006-05-13 18:07:53 +01:00
toto_mtd = kmalloc ( sizeof ( struct mtd_info ) + sizeof ( struct nand_chip ) , GFP_KERNEL ) ;
2005-04-16 15:20:36 -07:00
if ( ! toto_mtd ) {
2006-05-13 18:07:53 +01:00
printk ( KERN_WARNING " Unable to allocate toto NAND MTD device structure. \n " ) ;
2005-04-16 15:20:36 -07:00
err = - ENOMEM ;
goto out ;
}
/* Get pointer to private data */
2006-05-13 18:07:53 +01:00
this = ( struct nand_chip * ) ( & toto_mtd [ 1 ] ) ;
2005-04-16 15:20:36 -07:00
/* Initialize structures */
2006-05-13 18:07:53 +01:00
memset ( toto_mtd , 0 , sizeof ( struct mtd_info ) ) ;
memset ( this , 0 , sizeof ( struct nand_chip ) ) ;
2005-04-16 15:20:36 -07:00
/* Link the private data with the MTD structure */
toto_mtd - > priv = this ;
2006-05-14 01:20:46 +01:00
toto_mtd - > owner = THIS_MODULE ;
2005-04-16 15:20:36 -07:00
/* Set address of NAND IO lines */
this - > IO_ADDR_R = toto_io_base ;
this - > IO_ADDR_W = toto_io_base ;
2006-05-23 23:25:53 +02:00
this - > cmd_ctrl = toto_hwcontrol ;
2005-04-16 15:20:36 -07:00
this - > dev_ready = NULL ;
/* 25 us command delay time */
2005-11-07 11:15:49 +00:00
this - > chip_delay = 30 ;
2006-05-23 12:00:46 +02:00
this - > ecc . mode = NAND_ECC_SOFT ;
2005-04-16 15:20:36 -07:00
2006-05-13 18:07:53 +01:00
/* Scan to find existance of the device */
if ( nand_scan ( toto_mtd , 1 ) ) {
2005-04-16 15:20:36 -07:00
err = - ENXIO ;
goto out_mtd ;
}
/* Register the partitions */
2006-05-13 18:07:53 +01:00
switch ( toto_mtd - > size ) {
case SZ_64M :
add_mtd_partitions ( toto_mtd , partition_info64M , NUM_PARTITIONS64M ) ;
break ;
case SZ_32M :
add_mtd_partitions ( toto_mtd , partition_info32M , NUM_PARTITIONS32M ) ;
break ;
default : {
printk ( KERN_WARNING " Unsupported Nand device \n " ) ;
2005-04-16 15:20:36 -07:00
err = - ENXIO ;
goto out_buf ;
}
}
2006-05-13 18:07:53 +01:00
gpioreserve ( NAND_MASK ) ; /* claim our gpios */
archflashwp ( 0 , 0 ) ; /* open up flash for writing */
2005-04-16 15:20:36 -07:00
goto out ;
2005-11-07 11:15:49 +00:00
2006-05-13 18:07:53 +01:00
out_mtd :
kfree ( toto_mtd ) ;
out :
2005-04-16 15:20:36 -07:00
return err ;
}
module_init ( toto_init ) ;
/*
* Clean up routine
*/
2006-05-13 18:07:53 +01:00
static void __exit toto_cleanup ( void )
2005-04-16 15:20:36 -07:00
{
/* Release resources, unregister device */
2006-05-13 18:07:53 +01:00
nand_release ( toto_mtd ) ;
2005-04-16 15:20:36 -07:00
/* Free the MTD device structure */
2006-05-13 18:07:53 +01:00
kfree ( toto_mtd ) ;
2005-04-16 15:20:36 -07:00
/* stop flash writes */
2006-05-13 18:07:53 +01:00
archflashwp ( 0 , 1 ) ;
2005-11-07 11:15:49 +00:00
2005-04-16 15:20:36 -07:00
/* release gpios to system */
2006-05-13 18:07:53 +01:00
gpiorelease ( NAND_MASK ) ;
2005-04-16 15:20:36 -07:00
}
2006-05-13 18:07:53 +01:00
2005-04-16 15:20:36 -07:00
module_exit ( toto_cleanup ) ;
MODULE_LICENSE ( " GPL " ) ;
MODULE_AUTHOR ( " Richard Woodruff <r-woodruff2@ti.com> " ) ;
MODULE_DESCRIPTION ( " Glue layer for NAND flash on toto board " ) ;