2 * drivers/mtd/nand/ts7250.c
4 * Copyright (C) 2004 Technologic Systems (support@embeddedARM.com)
6 * Derived from drivers/mtd/nand/edb7312.c
7 * Copyright (C) 2004 Marius Gröger (mag@sysgo.de)
9 * Derived from drivers/mtd/nand/autcpu12.c
10 * Copyright (c) 2001 Thomas Gleixner (gleixner@autronix.de)
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License version 2 as
14 * published by the Free Software Foundation.
17 * This is a device driver for the NAND flash device found on the
18 * TS-7250 board which utilizes a Samsung 32 Mbyte part.
21 #include <linux/slab.h>
22 #include <linux/module.h>
23 #include <linux/init.h>
24 #include <linux/mtd/mtd.h>
25 #include <linux/mtd/nand.h>
26 #include <linux/mtd/partitions.h>
29 #include <mach/hardware.h>
30 #include <mach/ts72xx.h>
32 #include <asm/sizes.h>
33 #include <asm/mach-types.h>
36 * MTD structure for TS7250 board
38 static struct mtd_info
*ts7250_mtd
= NULL
;
40 #ifdef CONFIG_MTD_PARTITIONS
41 static const char *part_probes
[] = { "cmdlinepart", NULL
};
43 #define NUM_PARTITIONS 3
46 * Define static partitions for flash device
48 static struct mtd_partition partition_info32
[] = {
65 * Define static partitions for flash device
67 static struct mtd_partition partition_info128
[] = {
86 * hardware specific access to control-lines
89 * NAND_NCE: bit 0 -> bit 2
90 * NAND_CLE: bit 1 -> bit 1
91 * NAND_ALE: bit 2 -> bit 0
93 static void ts7250_hwcontrol(struct mtd_info
*mtd
, int cmd
, unsigned int ctrl
)
95 struct nand_chip
*chip
= mtd
->priv
;
97 if (ctrl
& NAND_CTRL_CHANGE
) {
98 unsigned long addr
= TS72XX_NAND_CONTROL_VIRT_BASE
;
101 bits
= (ctrl
& NAND_NCE
) << 2;
102 bits
|= ctrl
& NAND_CLE
;
103 bits
|= (ctrl
& NAND_ALE
) >> 2;
105 __raw_writeb((__raw_readb(addr
) & ~0x7) | bits
, addr
);
108 if (cmd
!= NAND_CMD_NONE
)
109 writeb(cmd
, chip
->IO_ADDR_W
);
113 * read device ready pin
115 static int ts7250_device_ready(struct mtd_info
*mtd
)
117 return __raw_readb(TS72XX_NAND_BUSY_VIRT_BASE
) & 0x20;
121 * Main initialization routine
123 static int __init
ts7250_init(void)
125 struct nand_chip
*this;
126 const char *part_type
= 0;
127 int mtd_parts_nb
= 0;
128 struct mtd_partition
*mtd_parts
= 0;
130 if (!machine_is_ts72xx() || board_is_ts7200())
133 /* Allocate memory for MTD device structure and private data */
134 ts7250_mtd
= kmalloc(sizeof(struct mtd_info
) + sizeof(struct nand_chip
), GFP_KERNEL
);
136 printk("Unable to allocate TS7250 NAND MTD device structure.\n");
140 /* Get pointer to private data */
141 this = (struct nand_chip
*)(&ts7250_mtd
[1]);
143 /* Initialize structures */
144 memset(ts7250_mtd
, 0, sizeof(struct mtd_info
));
145 memset(this, 0, sizeof(struct nand_chip
));
147 /* Link the private data with the MTD structure */
148 ts7250_mtd
->priv
= this;
149 ts7250_mtd
->owner
= THIS_MODULE
;
151 /* insert callbacks */
152 this->IO_ADDR_R
= (void *)TS72XX_NAND_DATA_VIRT_BASE
;
153 this->IO_ADDR_W
= (void *)TS72XX_NAND_DATA_VIRT_BASE
;
154 this->cmd_ctrl
= ts7250_hwcontrol
;
155 this->dev_ready
= ts7250_device_ready
;
156 this->chip_delay
= 15;
157 this->ecc
.mode
= NAND_ECC_SOFT
;
159 printk("Searching for NAND flash...\n");
160 /* Scan to find existence of the device */
161 if (nand_scan(ts7250_mtd
, 1)) {
165 #ifdef CONFIG_MTD_PARTITIONS
166 ts7250_mtd
->name
= "ts7250-nand";
167 mtd_parts_nb
= parse_mtd_partitions(ts7250_mtd
, part_probes
, &mtd_parts
, 0);
168 if (mtd_parts_nb
> 0)
169 part_type
= "command line";
173 if (mtd_parts_nb
== 0) {
174 mtd_parts
= partition_info32
;
175 if (ts7250_mtd
->size
>= (128 * 0x100000))
176 mtd_parts
= partition_info128
;
177 mtd_parts_nb
= NUM_PARTITIONS
;
178 part_type
= "static";
181 /* Register the partitions */
182 printk(KERN_NOTICE
"Using %s partition definition\n", part_type
);
183 add_mtd_partitions(ts7250_mtd
, mtd_parts
, mtd_parts_nb
);
189 module_init(ts7250_init
);
194 static void __exit
ts7250_cleanup(void)
196 /* Unregister the device */
197 del_mtd_device(ts7250_mtd
);
199 /* Free the MTD device structure */
203 module_exit(ts7250_cleanup
);
205 MODULE_LICENSE("GPL");
206 MODULE_AUTHOR("Jesse Off <joff@embeddedARM.com>");
207 MODULE_DESCRIPTION("MTD map driver for Technologic Systems TS-7250 board");