warp-nand.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. /*
  2. * PIKA Warp(tm) NAND flash specific routines
  3. *
  4. * Copyright (c) 2008 PIKA Technologies
  5. * Sean MacLennan <smaclennan@pikatech.com>
  6. */
  7. #include <linux/platform_device.h>
  8. #include <linux/mtd/mtd.h>
  9. #include <linux/mtd/map.h>
  10. #include <linux/mtd/partitions.h>
  11. #include <linux/mtd/nand.h>
  12. #include <linux/mtd/ndfc.h>
  13. #include <asm/machdep.h>
  14. #ifdef CONFIG_MTD_NAND_NDFC
  15. #define CS_NAND_0 1 /* use chip select 1 for NAND device 0 */
  16. #define WARP_NAND_FLASH_REG_ADDR 0xD0000000UL
  17. #define WARP_NAND_FLASH_REG_SIZE 0x2000
  18. static struct resource warp_ndfc = {
  19. .start = WARP_NAND_FLASH_REG_ADDR,
  20. .end = WARP_NAND_FLASH_REG_ADDR + WARP_NAND_FLASH_REG_SIZE,
  21. .flags = IORESOURCE_MEM,
  22. };
  23. static struct mtd_partition nand_parts[] = {
  24. {
  25. .name = "kernel",
  26. .offset = 0,
  27. .size = 0x0200000
  28. },
  29. {
  30. .name = "root",
  31. .offset = 0x0200000,
  32. .size = 0x3400000
  33. },
  34. {
  35. .name = "user",
  36. .offset = 0x3600000,
  37. .size = 0x0A00000
  38. },
  39. };
  40. struct ndfc_controller_settings warp_ndfc_settings = {
  41. .ccr_settings = (NDFC_CCR_BS(CS_NAND_0) | NDFC_CCR_ARAC1),
  42. .ndfc_erpn = 0,
  43. };
  44. static struct ndfc_chip_settings warp_chip0_settings = {
  45. .bank_settings = 0x80002222,
  46. };
  47. struct platform_nand_ctrl warp_nand_ctrl = {
  48. .priv = &warp_ndfc_settings,
  49. };
  50. static struct platform_device warp_ndfc_device = {
  51. .name = "ndfc-nand",
  52. .id = 0,
  53. .dev = {
  54. .platform_data = &warp_nand_ctrl,
  55. },
  56. .num_resources = 1,
  57. .resource = &warp_ndfc,
  58. };
  59. static struct nand_ecclayout nand_oob_16 = {
  60. .eccbytes = 3,
  61. .eccpos = { 0, 1, 2, 3, 6, 7 },
  62. .oobfree = { {.offset = 8, .length = 16} }
  63. };
  64. static struct platform_nand_chip warp_nand_chip0 = {
  65. .nr_chips = 1,
  66. .chip_offset = CS_NAND_0,
  67. .nr_partitions = ARRAY_SIZE(nand_parts),
  68. .partitions = nand_parts,
  69. .chip_delay = 50,
  70. .ecclayout = &nand_oob_16,
  71. .priv = &warp_chip0_settings,
  72. };
  73. static struct platform_device warp_nand_device = {
  74. .name = "ndfc-chip",
  75. .id = 0,
  76. .num_resources = 1,
  77. .resource = &warp_ndfc,
  78. .dev = {
  79. .platform_data = &warp_nand_chip0,
  80. .parent = &warp_ndfc_device.dev,
  81. }
  82. };
  83. static int warp_setup_nand_flash(void)
  84. {
  85. platform_device_register(&warp_ndfc_device);
  86. platform_device_register(&warp_nand_device);
  87. return 0;
  88. }
  89. machine_device_initcall(warp, warp_setup_nand_flash);
  90. #endif