mt_spi_hal.h 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. #ifndef __MT_SPI_HAL_H__
  2. #define __MT_SPI_HAL_H__
  3. #if !defined(CONFIG_MTK_CLKMGR)
  4. #include <linux/clk.h>
  5. #endif /* !defined(CONFIG_MTK_CLKMGR) */
  6. #include <linux/wakelock.h>
  7. #include <mt_spi.h>
  8. /*******************************************************************************
  9. * define macro for spi register
  10. ********************************************************************************/
  11. #define SPI_CFG0_REG (0x0000)
  12. #define SPI_CFG1_REG (0x0004)
  13. #define SPI_TX_SRC_REG (0x0008)
  14. #define SPI_RX_DST_REG (0x000c)
  15. #define SPI_TX_DATA_REG (0x0010)
  16. #define SPI_RX_DATA_REG (0x0014)
  17. #define SPI_CMD_REG (0x0018)
  18. #define SPI_STATUS0_REG (0x001c)
  19. #define SPI_STATUS1_REG (0x0020)
  20. #define SPI_PAD_SEL_REG (0x0024)
  21. #define SPI_CFG2_REG (0x0028)
  22. #define MIPI_TX_PU_TDP1_OFFSET 4
  23. #define MIPI_TX_PU_TDP1_MASK 0x10
  24. #define MIPI_TX_PD_TDP1_OFFSET 12
  25. #define MIPI_TX_PD_TDP1_MASK 0x1000
  26. #define SPI_CFG0_SCK_HIGH_OFFSET 0
  27. #define SPI_CFG0_SCK_LOW_OFFSET 16
  28. #define SPI_CFG0_CS_HOLD_OFFSET 0
  29. #define SPI_CFG0_CS_SETUP_OFFSET 16
  30. #define SPI_CFG0_SCK_HIGH_MASK 0xffff
  31. #define SPI_CFG0_SCK_LOW_MASK 0xffff0000
  32. #define SPI_CFG0_CS_HOLD_MASK 0xffff
  33. #define SPI_CFG0_CS_SETUP_MASK 0xffff000
  34. #define SPI_CFG1_CS_IDLE_OFFSET 0
  35. #define SPI_CFG1_PACKET_LOOP_OFFSET 8
  36. #define SPI_CFG1_PACKET_LENGTH_OFFSET 16
  37. #define SPI_CFG1_GET_TICK_DLY_OFFSET 29
  38. #define SPI_CFG1_CS_IDLE_MASK 0xff
  39. #define SPI_CFG1_PACKET_LOOP_MASK 0xff00
  40. #define SPI_CFG1_PACKET_LENGTH_MASK 0x3ff0000
  41. #define SPI_CFG1_GET_TICK_DLY_MASK 0xc0000000
  42. #define SPI_CMD_ACT_OFFSET 0
  43. #define SPI_CMD_RESUME_OFFSET 1
  44. #define SPI_CMD_RST_OFFSET 2
  45. #define SPI_CMD_PAUSE_EN_OFFSET 4
  46. #define SPI_CMD_DEASSERT_OFFSET 5
  47. #define SPI_CMD_SAMPLE_SEL_OFFSET 6
  48. #define SPI_CMD_CS_POL_OFFSET 7
  49. #define SPI_CMD_CPHA_OFFSET 8
  50. #define SPI_CMD_CPOL_OFFSET 9
  51. #define SPI_CMD_RX_DMA_OFFSET 10
  52. #define SPI_CMD_TX_DMA_OFFSET 11
  53. #define SPI_CMD_TXMSBF_OFFSET 12
  54. #define SPI_CMD_RXMSBF_OFFSET 13
  55. #define SPI_CMD_RX_ENDIAN_OFFSET 14
  56. #define SPI_CMD_TX_ENDIAN_OFFSET 15
  57. #define SPI_CMD_FINISH_IE_OFFSET 16
  58. #define SPI_CMD_PAUSE_IE_OFFSET 17
  59. #define SPI_CMD_ACT_MASK 0x1
  60. #define SPI_CMD_RESUME_MASK 0x2
  61. #define SPI_CMD_RST_MASK 0x4
  62. #define SPI_CMD_PAUSE_EN_MASK 0x10
  63. #define SPI_CMD_DEASSERT_MASK 0x20
  64. #define SPI_CMD_CPHA_MASK 0x100
  65. #define SPI_CMD_CPOL_MASK 0x200
  66. #define SPI_CMD_RX_DMA_MASK 0x400
  67. #define SPI_CMD_TX_DMA_MASK 0x800
  68. #define SPI_CMD_TXMSBF_MASK 0x1000
  69. #define SPI_CMD_RXMSBF_MASK 0x2000
  70. #define SPI_CMD_RX_ENDIAN_MASK 0x4000
  71. #define SPI_CMD_TX_ENDIAN_MASK 0x8000
  72. #define SPI_CMD_FINISH_IE_MASK 0x10000
  73. #define SPI_CMD_PAUSE_IE_MASK 0x20000
  74. #define SPI_ULTRA_HIGH_EN_OFFSET 0
  75. #define SPI_ULTRA_HIGH_THRESH_OFFSET 16
  76. #define SPI_ULTRA_HIGH_EN_MASK 0x1
  77. #define SPI_ULTRA_HIGH_THRESH_MASK 0xffff0000
  78. #include <sync_write.h>
  79. #define spi_readl(port, offset) \
  80. __raw_readl((port)->regs+(offset))
  81. /*
  82. #define spi_writel(port, offset,value) \
  83. __raw_writel((value), (port)->regs+(offset))
  84. */
  85. #define spi_writel(port, offset, value) \
  86. mt_reg_sync_writel((value), (port)->regs+(offset))
  87. struct mt_spi_t {
  88. struct platform_device *pdev;
  89. void __iomem *regs;
  90. int irq;
  91. int running;
  92. struct wake_lock wk_lock;
  93. struct mt_chip_conf *config;
  94. struct spi_master *master;
  95. struct spi_transfer *cur_transfer;
  96. struct spi_transfer *next_transfer;
  97. spinlock_t lock;
  98. struct list_head queue;
  99. #if !defined(CONFIG_MTK_CLKMGR)
  100. struct clk *clk_main; /* main clock for spi bus */
  101. #endif /* !defined(CONFIG_MTK_CLKMGR) */
  102. };
  103. extern void mt_spi_enable_clk(struct mt_spi_t *ms);
  104. extern void mt_spi_disable_clk(struct mt_spi_t *ms);
  105. #endif