warp-nand.c 2.2 KB

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