2 * Flash memory support for various TI OMAP boards
4 * Copyright (C) 2001-2002 MontaVista Software Inc.
5 * Copyright (C) 2003-2004 Texas Instruments
6 * Copyright (C) 2004 Nokia Corporation
8 * Assembled using driver code copyright the companies above
9 * and written by David Brownell, Jian Zhang <jzhang@ti.com>,
10 * Tony Lindgren <tony@atomide.com> and others.
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the
14 * Free Software Foundation; either version 2 of the License, or (at your
15 * option) any later version.
17 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
18 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
20 * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
24 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 * You should have received a copy of the GNU General Public License along
29 * with this program; if not, write to the Free Software Foundation, Inc.,
30 * 675 Mass Ave, Cambridge, MA 02139, USA.
33 #include <linux/platform_device.h>
34 #include <linux/module.h>
35 #include <linux/types.h>
36 #include <linux/kernel.h>
37 #include <linux/init.h>
38 #include <linux/ioport.h>
39 #include <linux/slab.h>
41 #include <linux/mtd/mtd.h>
42 #include <linux/mtd/map.h>
43 #include <linux/mtd/partitions.h>
46 #include <asm/hardware.h>
47 #include <asm/mach/flash.h>
48 #include <asm/arch/tc.h>
50 #ifdef CONFIG_MTD_PARTITIONS
51 static const char *part_probes
[] = { /* "RedBoot", */ "cmdlinepart", NULL
};
54 struct omapflash_info
{
55 struct mtd_partition
*parts
;
60 static void omap_set_vpp(struct map_info
*map
, int enable
)
66 OMAP_EMIFS_CONFIG_REG
|= OMAP_EMIFS_CONFIG_WP
;
68 if (count
&& (--count
== 0))
69 OMAP_EMIFS_CONFIG_REG
&= ~OMAP_EMIFS_CONFIG_WP
;
73 static int __devinit
omapflash_probe(struct platform_device
*pdev
)
76 struct omapflash_info
*info
;
77 struct flash_platform_data
*pdata
= pdev
->dev
.platform_data
;
78 struct resource
*res
= pdev
->resource
;
79 unsigned long size
= res
->end
- res
->start
+ 1;
81 info
= kzalloc(sizeof(struct omapflash_info
), GFP_KERNEL
);
85 if (!request_mem_region(res
->start
, size
, "flash")) {
90 info
->map
.virt
= ioremap(res
->start
, size
);
91 if (!info
->map
.virt
) {
93 goto out_release_mem_region
;
95 info
->map
.name
= pdev
->dev
.bus_id
;
96 info
->map
.phys
= res
->start
;
97 info
->map
.size
= size
;
98 info
->map
.bankwidth
= pdata
->width
;
99 info
->map
.set_vpp
= omap_set_vpp
;
101 simple_map_init(&info
->map
);
102 info
->mtd
= do_map_probe(pdata
->map_name
, &info
->map
);
107 info
->mtd
->owner
= THIS_MODULE
;
109 #ifdef CONFIG_MTD_PARTITIONS
110 err
= parse_mtd_partitions(info
->mtd
, part_probes
, &info
->parts
, 0);
112 add_mtd_partitions(info
->mtd
, info
->parts
, err
);
113 else if (err
< 0 && pdata
->parts
)
114 add_mtd_partitions(info
->mtd
, pdata
->parts
, pdata
->nr_parts
);
117 add_mtd_device(info
->mtd
);
119 platform_set_drvdata(pdev
, info
);
124 iounmap(info
->map
.virt
);
125 out_release_mem_region
:
126 release_mem_region(res
->start
, size
);
133 static int __devexit
omapflash_remove(struct platform_device
*pdev
)
135 struct omapflash_info
*info
= platform_get_drvdata(pdev
);
137 platform_set_drvdata(pdev
, NULL
);
141 del_mtd_partitions(info
->mtd
);
144 del_mtd_device(info
->mtd
);
145 map_destroy(info
->mtd
);
146 release_mem_region(info
->map
.phys
, info
->map
.size
);
147 iounmap((void __iomem
*) info
->map
.virt
);
154 static struct platform_driver omapflash_driver
= {
155 .probe
= omapflash_probe
,
156 .remove
= __devexit_p(omapflash_remove
),
162 static int __init
omapflash_init(void)
164 return platform_driver_register(&omapflash_driver
);
167 static void __exit
omapflash_exit(void)
169 platform_driver_unregister(&omapflash_driver
);
172 module_init(omapflash_init
);
173 module_exit(omapflash_exit
);
175 MODULE_LICENSE("GPL");
176 MODULE_DESCRIPTION("MTD NOR map driver for TI OMAP boards");