Commit | Line | Data |
---|---|---|
1da177e4 | 1 | /* |
1da177e4 LT |
2 | * Flash and EPROM on Hitachi Solution Engine and similar boards. |
3 | * | |
4 | * (C) 2001 Red Hat, Inc. | |
5 | * | |
6 | * GPL'd | |
7 | */ | |
8 | ||
9 | #include <linux/module.h> | |
10 | #include <linux/types.h> | |
11 | #include <linux/kernel.h> | |
12 | #include <linux/init.h> | |
13 | #include <asm/io.h> | |
14 | #include <linux/mtd/mtd.h> | |
15 | #include <linux/mtd/map.h> | |
16 | #include <linux/mtd/partitions.h> | |
1da177e4 LT |
17 | #include <linux/errno.h> |
18 | ||
19 | static struct mtd_info *flash_mtd; | |
20 | static struct mtd_info *eprom_mtd; | |
21 | ||
1da177e4 LT |
22 | struct map_info soleng_eprom_map = { |
23 | .name = "Solution Engine EPROM", | |
24 | .size = 0x400000, | |
25 | .bankwidth = 4, | |
26 | }; | |
27 | ||
28 | struct map_info soleng_flash_map = { | |
29 | .name = "Solution Engine FLASH", | |
30 | .size = 0x400000, | |
31 | .bankwidth = 4, | |
32 | }; | |
33 | ||
0984c891 | 34 | static const char * const probes[] = { "RedBoot", "cmdlinepart", NULL }; |
1da177e4 | 35 | |
1da177e4 LT |
36 | static int __init init_soleng_maps(void) |
37 | { | |
1da177e4 LT |
38 | /* First probe at offset 0 */ |
39 | soleng_flash_map.phys = 0; | |
40 | soleng_flash_map.virt = (void __iomem *)P2SEGADDR(0); | |
41 | soleng_eprom_map.phys = 0x01000000; | |
42 | soleng_eprom_map.virt = (void __iomem *)P1SEGADDR(0x01000000); | |
43 | simple_map_init(&soleng_eprom_map); | |
44 | simple_map_init(&soleng_flash_map); | |
69f34c98 | 45 | |
1da177e4 LT |
46 | printk(KERN_NOTICE "Probing for flash chips at 0x00000000:\n"); |
47 | flash_mtd = do_map_probe("cfi_probe", &soleng_flash_map); | |
48 | if (!flash_mtd) { | |
49 | /* Not there. Try swapping */ | |
50 | printk(KERN_NOTICE "Probing for flash chips at 0x01000000:\n"); | |
51 | soleng_flash_map.phys = 0x01000000; | |
52 | soleng_flash_map.virt = P2SEGADDR(0x01000000); | |
53 | soleng_eprom_map.phys = 0; | |
54 | soleng_eprom_map.virt = P1SEGADDR(0); | |
55 | flash_mtd = do_map_probe("cfi_probe", &soleng_flash_map); | |
56 | if (!flash_mtd) { | |
57 | /* Eep. */ | |
58 | printk(KERN_NOTICE "Flash chips not detected at either possible location.\n"); | |
59 | return -ENXIO; | |
60 | } | |
61 | } | |
62 | printk(KERN_NOTICE "Solution Engine: Flash at 0x%08lx, EPROM at 0x%08lx\n", | |
63 | soleng_flash_map.phys & 0x1fffffff, | |
64 | soleng_eprom_map.phys & 0x1fffffff); | |
65 | flash_mtd->owner = THIS_MODULE; | |
66 | ||
67 | eprom_mtd = do_map_probe("map_rom", &soleng_eprom_map); | |
68 | if (eprom_mtd) { | |
69 | eprom_mtd->owner = THIS_MODULE; | |
ee0e87b1 | 70 | mtd_device_register(eprom_mtd, NULL, 0); |
1da177e4 LT |
71 | } |
72 | ||
390e9eac | 73 | mtd_device_parse_register(flash_mtd, probes, NULL, NULL, 0); |
1da177e4 LT |
74 | |
75 | return 0; | |
76 | } | |
77 | ||
78 | static void __exit cleanup_soleng_maps(void) | |
79 | { | |
80 | if (eprom_mtd) { | |
ee0e87b1 | 81 | mtd_device_unregister(eprom_mtd); |
1da177e4 LT |
82 | map_destroy(eprom_mtd); |
83 | } | |
84 | ||
7029eef8 | 85 | mtd_device_unregister(flash_mtd); |
1da177e4 LT |
86 | map_destroy(flash_mtd); |
87 | } | |
88 | ||
89 | module_init(init_soleng_maps); | |
90 | module_exit(cleanup_soleng_maps); | |
91 | ||
92 | MODULE_LICENSE("GPL"); | |
93 | MODULE_AUTHOR("David Woodhouse <dwmw2@infradead.org>"); | |
94 | MODULE_DESCRIPTION("MTD map driver for Hitachi SolutionEngine (and similar) boards"); | |
95 |