ebi_nor_flash.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * (C) Copyright 2008 Stefan Roese <sr@denx.de>, DENX Software Engineering
  4. */
  5. #include <common.h>
  6. #include <asm/io.h>
  7. #include "vct.h"
  8. static u32 ebi_read(u32 addr)
  9. {
  10. addr &= ~0xFC000000;
  11. reg_write(EBI_CPU_IO_ACCS(EBI_BASE), EXT_DEVICE_CHANNEL_2 | addr);
  12. ebi_wait();
  13. return reg_read(EBI_IO_ACCS_DATA(EBI_BASE));
  14. }
  15. static int ebi_write_u16(u32 addr, u32 data, int fetchIO)
  16. {
  17. u32 val = (data << 16);
  18. addr &= ~0xFC000000;
  19. ebi_wait();
  20. reg_write(EBI_IO_ACCS_DATA(EBI_BASE), val);
  21. reg_write(EBI_CPU_IO_ACCS(EBI_BASE),
  22. EXT_DEVICE_CHANNEL_2 | EBI_CPU_WRITE | addr);
  23. ebi_wait();
  24. if (fetchIO) {
  25. u32 counter = 0;
  26. while (!(reg_read(EBI_SIG_LEVEL(EBI_BASE)) & EXT_CPU_IORDY_SL)) {
  27. if (counter++ > 0xFFFFFF)
  28. return 1;
  29. }
  30. }
  31. return 0;
  32. }
  33. static u16 ebi_read_u16(u32 addr)
  34. {
  35. return ((ebi_read(addr) >> 16) & 0xFFFF);
  36. }
  37. static u8 ebi_read_u8(u32 addr)
  38. {
  39. u32 val = ebi_read(addr) >> 16;
  40. if (addr & 0x1)
  41. return val & 0xff;
  42. else
  43. return (val >> 8) & 0xff;
  44. }
  45. /*
  46. * EBI initialization for NOR FLASH access
  47. */
  48. int ebi_init_nor_flash(void)
  49. {
  50. reg_write(EBI_DEV1_CONFIG1(EBI_BASE), 0x83000);
  51. reg_write(EBI_DEV2_CONFIG1(EBI_BASE), 0x400002);
  52. reg_write(EBI_DEV2_CONFIG2(EBI_BASE), 0x50);
  53. reg_write(EBI_DEV2_TIM1_RD1(EBI_BASE), 0x409113);
  54. reg_write(EBI_DEV2_TIM1_RD2(EBI_BASE), 0xFF01000);
  55. reg_write(EBI_DEV2_TIM1_WR1(EBI_BASE), 0x04003113);
  56. reg_write(EBI_DEV2_TIM1_WR2(EBI_BASE), 0x3FC12011);
  57. reg_write(EBI_DEV2_TIM_EXT(EBI_BASE), 0xFFF00000);
  58. return 0;
  59. }
  60. /*
  61. * Accessor functions replacing the "weak" functions in
  62. * drivers/mtd/cfi_flash.c
  63. */
  64. void flash_write8(u8 value, void *addr)
  65. {
  66. ebi_write_u16((u32)addr, value, 0);
  67. }
  68. void flash_write16(u16 value, void *addr)
  69. {
  70. ebi_write_u16((u32)addr, value, 0);
  71. }
  72. u8 flash_read8(void *addr)
  73. {
  74. return ebi_read_u8((u32)addr);
  75. }
  76. u16 flash_read16(void *addr)
  77. {
  78. return ebi_read_u16((u32)addr);
  79. }
  80. u32 flash_read32(void *addr)
  81. {
  82. return ((u32)ebi_read_u16((u32)addr) << 16) |
  83. ebi_read_u16((u32)addr + 2);
  84. }
  85. void *board_flash_read_memcpy(void *dest, const void *src, size_t count)
  86. {
  87. u16 *tmp = (u16 *)dest, *s = (u16 *)src;
  88. int i;
  89. for (i = 0; i < count; i += 2)
  90. *tmp++ = flash_read16(s++);
  91. return dest;
  92. }