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>
28 #include <mach/hardware.h>
29 #include <asm/sizes.h>
30 #include <asm/mach-types.h>
33 * MTD structure for TS7250 board
35 static struct mtd_info
*ts7250_mtd
= NULL
;
37 #ifdef CONFIG_MTD_PARTITIONS
38 static const char *part_probes
[] = { "cmdlinepart", NULL
};
40 #define NUM_PARTITIONS 3
43 * Define static partitions for flash device
45 static struct mtd_partition partition_info32
[] = {
62 * Define static partitions for flash device
64 static struct mtd_partition partition_info128
[] = {
83 * hardware specific access to control-lines
86 * NAND_NCE: bit 0 -> bit 2
87 * NAND_CLE: bit 1 -> bit 1
88 * NAND_ALE: bit 2 -> bit 0
90 static void ts7250_hwcontrol(struct mtd_info
*mtd
, int cmd
, unsigned int ctrl
)
92 struct nand_chip
*chip
= mtd
->priv
;
94 if (ctrl
& NAND_CTRL_CHANGE
) {
95 unsigned long addr
= TS72XX_NAND_CONTROL_VIRT_BASE
;
98 bits
= (ctrl
& NAND_NCE
) << 2;
99 bits
|= ctrl
& NAND_CLE
;
100 bits
|= (ctrl
& NAND_ALE
) >> 2;
102 __raw_writeb((__raw_readb(addr
) & ~0x7) | bits
, addr
);
105 if (cmd
!= NAND_CMD_NONE
)
106 writeb(cmd
, chip
->IO_ADDR_W
);
110 * read device ready pin
112 static int ts7250_device_ready(struct mtd_info
*mtd
)
114 return __raw_readb(TS72XX_NAND_BUSY_VIRT_BASE
) & 0x20;
118 * Main initialization routine
120 static int __init
ts7250_init(void)
122 struct nand_chip
*this;
123 const char *part_type
= 0;
124 int mtd_parts_nb
= 0;
125 struct mtd_partition
*mtd_parts
= 0;
127 if (!machine_is_ts72xx() || board_is_ts7200())
130 /* Allocate memory for MTD device structure and private data */
131 ts7250_mtd
= kmalloc(sizeof(struct mtd_info
) + sizeof(struct nand_chip
), GFP_KERNEL
);
133 printk("Unable to allocate TS7250 NAND MTD device structure.\n");
137 /* Get pointer to private data */
138 this = (struct nand_chip
*)(&ts7250_mtd
[1]);
140 /* Initialize structures */
141 memset(ts7250_mtd
, 0, sizeof(struct mtd_info
));
142 memset(this, 0, sizeof(struct nand_chip
));
144 /* Link the private data with the MTD structure */
145 ts7250_mtd
->priv
= this;
146 ts7250_mtd
->owner
= THIS_MODULE
;
148 /* insert callbacks */
149 this->IO_ADDR_R
= (void *)TS72XX_NAND_DATA_VIRT_BASE
;
150 this->IO_ADDR_W
= (void *)TS72XX_NAND_DATA_VIRT_BASE
;
151 this->cmd_ctrl
= ts7250_hwcontrol
;
152 this->dev_ready
= ts7250_device_ready
;
153 this->chip_delay
= 15;
154 this->ecc
.mode
= NAND_ECC_SOFT
;
156 printk("Searching for NAND flash...\n");
157 /* Scan to find existence of the device */
158 if (nand_scan(ts7250_mtd
, 1)) {
162 #ifdef CONFIG_MTD_PARTITIONS
163 ts7250_mtd
->name
= "ts7250-nand";
164 mtd_parts_nb
= parse_mtd_partitions(ts7250_mtd
, part_probes
, &mtd_parts
, 0);
165 if (mtd_parts_nb
> 0)
166 part_type
= "command line";
170 if (mtd_parts_nb
== 0) {
171 mtd_parts
= partition_info32
;
172 if (ts7250_mtd
->size
>= (128 * 0x100000))
173 mtd_parts
= partition_info128
;
174 mtd_parts_nb
= NUM_PARTITIONS
;
175 part_type
= "static";
178 /* Register the partitions */
179 printk(KERN_NOTICE
"Using %s partition definition\n", part_type
);
180 add_mtd_partitions(ts7250_mtd
, mtd_parts
, mtd_parts_nb
);
186 module_init(ts7250_init
);
191 static void __exit
ts7250_cleanup(void)
193 /* Unregister the device */
194 del_mtd_device(ts7250_mtd
);
196 /* Free the MTD device structure */
200 module_exit(ts7250_cleanup
);
202 MODULE_LICENSE("GPL");
203 MODULE_AUTHOR("Jesse Off <joff@embeddedARM.com>");
204 MODULE_DESCRIPTION("MTD map driver for Technologic Systems TS-7250 board");