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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * $Id: solutionengine.c,v 1.4 2001/11/07 01:20:59 jsiegel Exp $
  3.  *
  4.  * Flash and EPROM on Hitachi Solution Engine and similar boards.
  5.  *
  6.  * (C) 2001 Red Hat, Inc.
  7.  *
  8.  * GPL'd
  9.  */
  10. #include <linux/module.h>
  11. #include <linux/types.h>
  12. #include <linux/kernel.h>
  13. #include <asm/io.h>
  14. #include <linux/mtd/mtd.h>
  15. #include <linux/mtd/map.h>
  16. #include <linux/mtd/partitions.h>
  17. #include <linux/config.h>
  18. extern int parse_redboot_partitions(struct mtd_info *master, struct mtd_partition **pparts);
  19. __u32 soleng_read32(struct map_info *map, unsigned long ofs)
  20. {
  21. return __raw_readl(map->map_priv_1 + ofs);
  22. }
  23. void soleng_write32(struct map_info *map, __u32 d, unsigned long adr)
  24. {
  25. __raw_writel(d, map->map_priv_1 + adr);
  26. mb();
  27. }
  28. void soleng_copy_from(struct map_info *map, void *to, unsigned long from, ssize_t len)
  29. {
  30. memcpy_fromio(to, map->map_priv_1 + from, len);
  31. }
  32. static struct mtd_info *flash_mtd;
  33. static struct mtd_info *eprom_mtd;
  34. static struct mtd_partition *parsed_parts;
  35. struct map_info soleng_eprom_map = {
  36. name: "Solution Engine EPROM",
  37. size: 0x400000,
  38. buswidth: 4,
  39. copy_from: soleng_copy_from,
  40. };
  41. struct map_info soleng_flash_map = {
  42. name: "Solution Engine FLASH",
  43. size: 0x400000,
  44. buswidth: 4,
  45. read32: soleng_read32,
  46. copy_from: soleng_copy_from,
  47. write32: soleng_write32,
  48. };
  49. #ifdef CONFIG_MTD_SUPERH_RESERVE
  50. static struct mtd_partition superh_se_partitions[] = {
  51. /* Reserved for boot code, read-only */
  52. {
  53. name: "flash_boot",
  54. offset: 0x00000000,
  55. size: CONFIG_MTD_SUPERH_RESERVE,
  56. mask_flags: MTD_WRITEABLE,
  57. },
  58. /* All else is writable (e.g. JFFS) */
  59. {
  60. name: "Flash FS",
  61. offset: MTDPART_OFS_NXTBLK,
  62. size: MTDPART_SIZ_FULL,
  63. }
  64. };
  65. #endif /* CONFIG_MTD_SUPERH_RESERVE */
  66. static int __init init_soleng_maps(void)
  67. {
  68. int nr_parts = 0;
  69. /* First probe at offset 0 */
  70. soleng_flash_map.map_priv_1 = P2SEGADDR(0);
  71. soleng_eprom_map.map_priv_1 = P1SEGADDR(0x01000000);
  72. printk(KERN_NOTICE "Probing for flash chips at 0x00000000:n");
  73. flash_mtd = do_map_probe("cfi_probe", &soleng_flash_map);
  74. if (!flash_mtd) {
  75. /* Not there. Try swapping */
  76. printk(KERN_NOTICE "Probing for flash chips at 0x01000000:n");
  77. soleng_flash_map.map_priv_1 = P2SEGADDR(0x01000000);
  78. soleng_eprom_map.map_priv_1 = P1SEGADDR(0);
  79. flash_mtd = do_map_probe("cfi_probe", &soleng_flash_map);
  80. if (!flash_mtd) {
  81. /* Eep. */
  82. printk(KERN_NOTICE "Flash chips not detected at either possible location.n");
  83. return -ENXIO;
  84. }
  85. }
  86. printk(KERN_NOTICE "Solution Engine: Flash at 0x%08lx, EPROM at 0x%08lxn",
  87.        soleng_flash_map.map_priv_1 & 0x1fffffff,
  88.        soleng_eprom_map.map_priv_1 & 0x1fffffff);
  89. flash_mtd->module = THIS_MODULE;
  90. eprom_mtd = do_map_probe("map_rom", &soleng_eprom_map);
  91. if (eprom_mtd) {
  92. eprom_mtd->module = THIS_MODULE;
  93. add_mtd_device(eprom_mtd);
  94. }
  95. #ifdef CONFIG_MTD_REDBOOT_PARTS
  96. nr_parts = parse_redboot_partitions(flash_mtd, &parsed_parts);
  97. if (nr_parts > 0)
  98. printk(KERN_NOTICE "Found RedBoot partition table.n");
  99. else if (nr_parts < 0)
  100. printk(KERN_NOTICE "Error looking for RedBoot partitions.n");
  101. #endif /* CONFIG_MTD_REDBOOT_PARTS */
  102. #if CONFIG_MTD_SUPERH_RESERVE
  103. if (nr_parts == 0) {
  104. printk(KERN_NOTICE "Using configured partition at 0x%08x.n",
  105.        CONFIG_MTD_SUPERH_RESERVE);
  106. parsed_parts = superh_se_partitions;
  107. nr_parts = sizeof(superh_se_partitions)/sizeof(*parsed_parts);
  108. }
  109. #endif /* CONFIG_MTD_SUPERH_RESERVE */
  110. if (nr_parts > 0)
  111. add_mtd_partitions(flash_mtd, parsed_parts, nr_parts);
  112. else
  113. add_mtd_device(flash_mtd);
  114. return 0;
  115. }
  116. static void __exit cleanup_soleng_maps(void)
  117. {
  118. if (eprom_mtd) {
  119. del_mtd_device(eprom_mtd);
  120. map_destroy(eprom_mtd);
  121. }
  122. if (parsed_parts)
  123. del_mtd_partitions(flash_mtd);
  124. else
  125. del_mtd_device(flash_mtd);
  126. map_destroy(flash_mtd);
  127. }
  128. module_init(init_soleng_maps);
  129. module_exit(cleanup_soleng_maps);
  130. MODULE_LICENSE("GPL");
  131. MODULE_AUTHOR("David Woodhouse <dwmw2@infradead.org>");
  132. MODULE_DESCRIPTION("MTD map driver for Hitachi SolutionEngine (and similar) boards");