imx_spi.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. /*
  2. * IMX SPI Controller
  3. *
  4. * Copyright 2016 Jean-Christophe Dubois <jcd@tribudubois.net>
  5. *
  6. * This work is licensed under the terms of the GNU GPL, version 2 or later.
  7. * See the COPYING file in the top-level directory.
  8. */
  9. #ifndef IMX_SPI_H
  10. #define IMX_SPI_H
  11. #include "hw/sysbus.h"
  12. #include "hw/ssi/ssi.h"
  13. #include "qemu/bitops.h"
  14. #include "qemu/fifo32.h"
  15. #include "qom/object.h"
  16. #define ECSPI_FIFO_SIZE 64
  17. #define ECSPI_RXDATA 0
  18. #define ECSPI_TXDATA 1
  19. #define ECSPI_CONREG 2
  20. #define ECSPI_CONFIGREG 3
  21. #define ECSPI_INTREG 4
  22. #define ECSPI_DMAREG 5
  23. #define ECSPI_STATREG 6
  24. #define ECSPI_PERIODREG 7
  25. #define ECSPI_TESTREG 8
  26. #define ECSPI_MSGDATA 16
  27. #define ECSPI_MAX 17
  28. /* ECSPI_CONREG */
  29. #define ECSPI_CONREG_EN (1 << 0)
  30. #define ECSPI_CONREG_HT (1 << 1)
  31. #define ECSPI_CONREG_XCH (1 << 2)
  32. #define ECSPI_CONREG_SMC (1 << 3)
  33. #define ECSPI_CONREG_CHANNEL_MODE_SHIFT 4
  34. #define ECSPI_CONREG_CHANNEL_MODE_LENGTH 4
  35. #define ECSPI_CONREG_DRCTL_SHIFT 16
  36. #define ECSPI_CONREG_DRCTL_LENGTH 2
  37. #define ECSPI_CONREG_CHANNEL_SELECT_SHIFT 18
  38. #define ECSPI_CONREG_CHANNEL_SELECT_LENGTH 2
  39. #define ECSPI_CONREG_BURST_LENGTH_SHIFT 20
  40. #define ECSPI_CONREG_BURST_LENGTH_LENGTH 12
  41. /* ECSPI_CONFIGREG */
  42. #define ECSPI_CONFIGREG_SS_CTL_SHIFT 8
  43. #define ECSPI_CONFIGREG_SS_CTL_LENGTH 4
  44. /* ECSPI_INTREG */
  45. #define ECSPI_INTREG_TEEN (1 << 0)
  46. #define ECSPI_INTREG_TDREN (1 << 1)
  47. #define ECSPI_INTREG_TFEN (1 << 2)
  48. #define ECSPI_INTREG_RREN (1 << 3)
  49. #define ECSPI_INTREG_RDREN (1 << 4)
  50. #define ECSPI_INTREG_RFEN (1 << 5)
  51. #define ECSPI_INTREG_ROEN (1 << 6)
  52. #define ECSPI_INTREG_TCEN (1 << 7)
  53. /* ECSPI_DMAREG */
  54. #define ECSPI_DMAREG_RXTDEN (1 << 31)
  55. #define ECSPI_DMAREG_RXDEN (1 << 23)
  56. #define ECSPI_DMAREG_TEDEN (1 << 7)
  57. #define ECSPI_DMAREG_RX_THRESHOLD_SHIFT 16
  58. #define ECSPI_DMAREG_RX_THRESHOLD_LENGTH 6
  59. /* ECSPI_STATREG */
  60. #define ECSPI_STATREG_TE (1 << 0)
  61. #define ECSPI_STATREG_TDR (1 << 1)
  62. #define ECSPI_STATREG_TF (1 << 2)
  63. #define ECSPI_STATREG_RR (1 << 3)
  64. #define ECSPI_STATREG_RDR (1 << 4)
  65. #define ECSPI_STATREG_RF (1 << 5)
  66. #define ECSPI_STATREG_RO (1 << 6)
  67. #define ECSPI_STATREG_TC (1 << 7)
  68. #define EXTRACT(value, name) extract32(value, name##_SHIFT, name##_LENGTH)
  69. /* number of chip selects supported */
  70. #define ECSPI_NUM_CS 4
  71. #define TYPE_IMX_SPI "imx.spi"
  72. OBJECT_DECLARE_SIMPLE_TYPE(IMXSPIState, IMX_SPI)
  73. struct IMXSPIState {
  74. /* <private> */
  75. SysBusDevice parent_obj;
  76. /* <public> */
  77. MemoryRegion iomem;
  78. qemu_irq irq;
  79. qemu_irq cs_lines[ECSPI_NUM_CS];
  80. SSIBus *bus;
  81. uint32_t regs[ECSPI_MAX];
  82. Fifo32 rx_fifo;
  83. Fifo32 tx_fifo;
  84. int16_t burst_length;
  85. };
  86. #endif /* IMX_SPI_H */