ebi_smc911x.c 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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 <netdev.h>
  7. #include <asm/io.h>
  8. #include "vct.h"
  9. /*
  10. * EBI initialization for SMC911x access
  11. */
  12. int ebi_init_smc911x(void)
  13. {
  14. reg_write(EBI_DEV1_CONFIG1(EBI_BASE), 0x00003020);
  15. reg_write(EBI_DEV1_CONFIG2(EBI_BASE), 0x0000004F);
  16. reg_write(EBI_DEV1_TIM1_RD1(EBI_BASE), 0x00501100);
  17. reg_write(EBI_DEV1_TIM1_RD2(EBI_BASE), 0x0FF02111);
  18. reg_write(EBI_DEV1_TIM_EXT(EBI_BASE), 0xFFF00000);
  19. reg_write(EBI_DEV1_EXT_ACC(EBI_BASE), 0x0FFFFFFF);
  20. reg_write(EBI_DEV1_TIM1_WR1(EBI_BASE), 0x05001100);
  21. reg_write(EBI_DEV1_TIM1_WR2(EBI_BASE), 0x3FC21110);
  22. return 0;
  23. }
  24. /*
  25. * Accessor functions replacing the "weak" functions in
  26. * drivers/net/smc911x.c
  27. */
  28. u32 smc911x_reg_read(struct eth_device *dev, u32 addr)
  29. {
  30. volatile u32 data;
  31. addr += dev->iobase;
  32. reg_write(EBI_DEV1_CONFIG2(EBI_BASE), 0x0000004F);
  33. ebi_wait();
  34. reg_write(EBI_CPU_IO_ACCS(EBI_BASE), (EXT_DEVICE_CHANNEL_1 | addr));
  35. ebi_wait();
  36. data = reg_read(EBI_IO_ACCS_DATA(EBI_BASE));
  37. return (data);
  38. }
  39. void smc911x_reg_write(struct eth_device *dev, u32 addr, u32 data)
  40. {
  41. addr += dev->iobase;
  42. reg_write(EBI_DEV1_CONFIG2(EBI_BASE), 0x0000004F);
  43. ebi_wait();
  44. reg_write(EBI_IO_ACCS_DATA(EBI_BASE), data);
  45. reg_write(EBI_CPU_IO_ACCS(EBI_BASE),
  46. EXT_DEVICE_CHANNEL_1 | EBI_CPU_WRITE | addr);
  47. ebi_wait();
  48. }
  49. void pkt_data_push(struct eth_device *dev, u32 addr, u32 data)
  50. {
  51. addr += dev->iobase;
  52. reg_write(EBI_DEV1_CONFIG2(EBI_BASE), 0x0000004A);
  53. ebi_wait();
  54. reg_write(EBI_IO_ACCS_DATA(EBI_BASE), data);
  55. reg_write(EBI_CPU_IO_ACCS(EBI_BASE),
  56. EXT_DEVICE_CHANNEL_1 | EBI_CPU_WRITE | addr);
  57. ebi_wait();
  58. return;
  59. }
  60. u32 pkt_data_pull(struct eth_device *dev, u32 addr)
  61. {
  62. volatile u32 data;
  63. addr += dev->iobase;
  64. reg_write(EBI_DEV1_CONFIG2(EBI_BASE), 0x0000004A);
  65. ebi_wait();
  66. reg_write(EBI_CPU_IO_ACCS(EBI_BASE), (EXT_DEVICE_CHANNEL_1 | addr));
  67. ebi_wait();
  68. data = reg_read(EBI_IO_ACCS_DATA(EBI_BASE));
  69. return data;
  70. }
  71. int board_eth_init(bd_t *bis)
  72. {
  73. int rc = 0;
  74. #ifdef CONFIG_SMC911X
  75. rc = smc911x_initialize(0, CONFIG_DRIVER_SMC911X_BASE);
  76. #endif
  77. return rc;
  78. }