cdb89712.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:7k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * Flash on Cirrus CDB89712
  3.  *
  4.  * $Id: cdb89712.c,v 1.3 2001/10/02 15:14:43 rmk Exp $
  5.  */
  6. #include <linux/module.h>
  7. #include <linux/types.h>
  8. #include <linux/kernel.h>
  9. #include <linux/ioport.h>
  10. #include <asm/io.h>
  11. #include <asm/arch/hardware.h>
  12. #include <linux/mtd/mtd.h>
  13. #include <linux/mtd/map.h>
  14. #include <linux/mtd/partitions.h>
  15. __u8 cdb89712_read8(struct map_info *map, unsigned long ofs)
  16. {
  17. return __raw_readb(map->map_priv_1 + ofs);
  18. }
  19. __u16 cdb89712_read16(struct map_info *map, unsigned long ofs)
  20. {
  21. return __raw_readw(map->map_priv_1 + ofs);
  22. }
  23. __u32 cdb89712_read32(struct map_info *map, unsigned long ofs)
  24. {
  25. return __raw_readl(map->map_priv_1 + ofs);
  26. }
  27. void cdb89712_write8(struct map_info *map, __u8 d, unsigned long adr)
  28. {
  29. __raw_writeb(d, map->map_priv_1 + adr);
  30. mb();
  31. }
  32. void cdb89712_write16(struct map_info *map, __u16 d, unsigned long adr)
  33. {
  34. __raw_writew(d, map->map_priv_1 + adr);
  35. mb();
  36. }
  37. void cdb89712_write32(struct map_info *map, __u32 d, unsigned long adr)
  38. {
  39. __raw_writel(d, map->map_priv_1 + adr);
  40. mb();
  41. }
  42. void cdb89712_copy_from(struct map_info *map, void *to, unsigned long from, ssize_t len)
  43. {
  44. // printk ("cdb89712_copy_from: 0x%x@0x%x -> 0x%xn", len, from, to);
  45. memcpy_fromio(to, map->map_priv_1 + from, len);
  46. }
  47. void cdb89712_copy_to(struct map_info *map, unsigned long to, const void *from, ssize_t len)
  48. {
  49. while(len) {
  50. __raw_writeb(*(unsigned char *) from, map->map_priv_1 + to);
  51. from++;
  52. to++;
  53. len--;
  54. }
  55. }
  56. static struct mtd_info *flash_mtd;
  57. struct map_info cdb89712_flash_map = {
  58. name: "flash",
  59. size: FLASH_SIZE,
  60. buswidth: FLASH_WIDTH,
  61. read8: cdb89712_read8,
  62. read16: cdb89712_read16,
  63. read32: cdb89712_read32,
  64. copy_from: cdb89712_copy_from,
  65. write8: cdb89712_write8,
  66. write16: cdb89712_write16,
  67. write32: cdb89712_write32,
  68. copy_to: cdb89712_copy_to
  69. };
  70. struct resource cdb89712_flash_resource = {
  71. name:   "Flash",
  72. start:  FLASH_START,
  73. end:    FLASH_START + FLASH_SIZE - 1,
  74. flags:  IORESOURCE_IO | IORESOURCE_BUSY,
  75. };
  76. static int __init init_cdb89712_flash (void)
  77. {
  78. int err;
  79. if (request_resource (&ioport_resource, &cdb89712_flash_resource)) {
  80. printk(KERN_NOTICE "Failed to reserve Cdb89712 FLASH spacen");
  81. err = -EBUSY;
  82. goto out;
  83. }
  84. cdb89712_flash_map.map_priv_1 = (unsigned long)ioremap(FLASH_START, FLASH_SIZE);
  85. if (!cdb89712_flash_map.map_priv_1) {
  86. printk(KERN_NOTICE "Failed to ioremap Cdb89712 FLASH spacen");
  87. err = -EIO;
  88. goto out_resource;
  89. }
  90. flash_mtd = do_map_probe("cfi_probe", &cdb89712_flash_map);
  91. if (!flash_mtd) {
  92. flash_mtd = do_map_probe("map_rom", &cdb89712_flash_map);
  93. if (flash_mtd)
  94. flash_mtd->erasesize = 0x10000;
  95. }
  96. if (!flash_mtd) {
  97. printk("FLASH probe failedn");
  98. err = -ENXIO;
  99. goto out_ioremap;
  100. }
  101. flash_mtd->module = THIS_MODULE;
  102. if (add_mtd_device(flash_mtd)) {
  103. printk("FLASH device addition failedn");
  104. err = -ENOMEM;
  105. goto out_probe;
  106. }
  107. return 0;
  108. out_probe:
  109. map_destroy(flash_mtd);
  110. flash_mtd = 0;
  111. out_ioremap:
  112. iounmap((void *)cdb89712_flash_map.map_priv_1);
  113. out_resource:
  114. release_resource (&cdb89712_flash_resource);
  115. out:
  116. return err;
  117. }
  118. static struct mtd_info *sram_mtd;
  119. struct map_info cdb89712_sram_map = {
  120. name: "SRAM",
  121. size: SRAM_SIZE,
  122. buswidth: SRAM_WIDTH,
  123. read8: cdb89712_read8,
  124. read16: cdb89712_read16,
  125. read32: cdb89712_read32,
  126. copy_from: cdb89712_copy_from,
  127. write8: cdb89712_write8,
  128. write16: cdb89712_write16,
  129. write32: cdb89712_write32,
  130. copy_to: cdb89712_copy_to
  131. };
  132. struct resource cdb89712_sram_resource = {
  133. name:   "SRAM",
  134. start:  SRAM_START,
  135. end:    SRAM_START + SRAM_SIZE - 1,
  136. flags:  IORESOURCE_IO | IORESOURCE_BUSY,
  137. };
  138. static int __init init_cdb89712_sram (void)
  139. {
  140. int err;
  141. if (request_resource (&ioport_resource, &cdb89712_sram_resource)) {
  142. printk(KERN_NOTICE "Failed to reserve Cdb89712 SRAM spacen");
  143. err = -EBUSY;
  144. goto out;
  145. }
  146. cdb89712_sram_map.map_priv_1 = (unsigned long)ioremap(SRAM_START, SRAM_SIZE);
  147. if (!cdb89712_sram_map.map_priv_1) {
  148. printk(KERN_NOTICE "Failed to ioremap Cdb89712 SRAM spacen");
  149. err = -EIO;
  150. goto out_resource;
  151. }
  152. sram_mtd = do_map_probe("map_ram", &cdb89712_sram_map);
  153. if (!sram_mtd) {
  154. printk("SRAM probe failedn");
  155. err = -ENXIO;
  156. goto out_ioremap;
  157. }
  158. sram_mtd->module = THIS_MODULE;
  159. sram_mtd->erasesize = 16;
  160. if (add_mtd_device(sram_mtd)) {
  161. printk("SRAM device addition failedn");
  162. err = -ENOMEM;
  163. goto out_probe;
  164. }
  165. return 0;
  166. out_probe:
  167. map_destroy(sram_mtd);
  168. sram_mtd = 0;
  169. out_ioremap:
  170. iounmap((void *)cdb89712_sram_map.map_priv_1);
  171. out_resource:
  172. release_resource (&cdb89712_sram_resource);
  173. out:
  174. return err;
  175. }
  176. static struct mtd_info *bootrom_mtd;
  177. struct map_info cdb89712_bootrom_map = {
  178. name: "BootROM",
  179. size: BOOTROM_SIZE,
  180. buswidth: BOOTROM_WIDTH,
  181. read8: cdb89712_read8,
  182. read16: cdb89712_read16,
  183. read32: cdb89712_read32,
  184. copy_from: cdb89712_copy_from,
  185. };
  186. struct resource cdb89712_bootrom_resource = {
  187. name:   "BootROM",
  188. start:  BOOTROM_START,
  189. end:    BOOTROM_START + BOOTROM_SIZE - 1,
  190. flags:  IORESOURCE_IO | IORESOURCE_BUSY,
  191. };
  192. static int __init init_cdb89712_bootrom (void)
  193. {
  194. int err;
  195. if (request_resource (&ioport_resource, &cdb89712_bootrom_resource)) {
  196. printk(KERN_NOTICE "Failed to reserve Cdb89712 BOOTROM spacen");
  197. err = -EBUSY;
  198. goto out;
  199. }
  200. cdb89712_bootrom_map.map_priv_1 = (unsigned long)ioremap(BOOTROM_START, BOOTROM_SIZE);
  201. if (!cdb89712_bootrom_map.map_priv_1) {
  202. printk(KERN_NOTICE "Failed to ioremap Cdb89712 BootROM spacen");
  203. err = -EIO;
  204. goto out_resource;
  205. }
  206. bootrom_mtd = do_map_probe("map_rom", &cdb89712_bootrom_map);
  207. if (!bootrom_mtd) {
  208. printk("BootROM probe failedn");
  209. err = -ENXIO;
  210. goto out_ioremap;
  211. }
  212. bootrom_mtd->module = THIS_MODULE;
  213. bootrom_mtd->erasesize = 0x10000;
  214. if (add_mtd_device(bootrom_mtd)) {
  215. printk("BootROM device addition failedn");
  216. err = -ENOMEM;
  217. goto out_probe;
  218. }
  219. return 0;
  220. out_probe:
  221. map_destroy(bootrom_mtd);
  222. bootrom_mtd = 0;
  223. out_ioremap:
  224. iounmap((void *)cdb89712_bootrom_map.map_priv_1);
  225. out_resource:
  226. release_resource (&cdb89712_bootrom_resource);
  227. out:
  228. return err;
  229. }
  230. static int __init init_cdb89712_maps(void)
  231. {
  232.         printk(KERN_INFO "Cirrus CDB89712 MTD mappings:n  Flash 0x%x at 0x%xn  SRAM 0x%x at 0x%xn  BootROM 0x%x at 0x%xn", 
  233.        FLASH_SIZE, FLASH_START, SRAM_SIZE, SRAM_START, BOOTROM_SIZE, BOOTROM_START);
  234. init_cdb89712_flash();
  235. init_cdb89712_sram();
  236. init_cdb89712_bootrom();
  237. return 0;
  238. }
  239. static void __exit cleanup_cdb89712_maps(void)
  240. {
  241. if (sram_mtd) {
  242. del_mtd_device(sram_mtd);
  243. map_destroy(sram_mtd);
  244. iounmap((void *)cdb89712_sram_map.map_priv_1);
  245. release_resource (&cdb89712_sram_resource);
  246. }
  247. if (flash_mtd) {
  248. del_mtd_device(flash_mtd);
  249. map_destroy(flash_mtd);
  250. iounmap((void *)cdb89712_flash_map.map_priv_1);
  251. release_resource (&cdb89712_flash_resource);
  252. }
  253. if (bootrom_mtd) {
  254. del_mtd_device(bootrom_mtd);
  255. map_destroy(bootrom_mtd);
  256. iounmap((void *)cdb89712_bootrom_map.map_priv_1);
  257. release_resource (&cdb89712_bootrom_resource);
  258. }
  259. }
  260. module_init(init_cdb89712_maps);
  261. module_exit(cleanup_cdb89712_maps);
  262. MODULE_AUTHOR("Ray L");
  263. MODULE_DESCRIPTION("ARM CDB89712 map driver");
  264. MODULE_LICENSE("GPL");