pinctrl-rockchip.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. /*
  2. * Copyright (c) 2006-2022, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2022-3-08 GuEe-GUI the first version
  9. */
  10. #ifndef __ROCKCHIP_PINCTRL_H__
  11. #define __ROCKCHIP_PINCTRL_H__
  12. #include <rthw.h>
  13. #include <rtdef.h>
  14. #include <rockchip.h>
  15. #include <dt-bindings/pinctrl/rockchip.h>
  16. #define ROCKCHIP_PULL_BITS_PER_PIN 2
  17. #define ROCKCHIP_PULL_PINS_PER_REG 8
  18. #define ROCKCHIP_PULL_BANK_STRIDE 16
  19. #define ROCKCHIP_DRV_BITS_PER_PIN 2
  20. #define ROCKCHIP_DRV_PINS_PER_REG 8
  21. #define ROCKCHIP_DRV_BANK_STRIDE 16
  22. #define ROCKCHIP_DRV_3BITS_PER_PIN 3
  23. enum rockchip_pin_drv_type
  24. {
  25. DRV_TYPE_IO_DEFAULT = 0,
  26. DRV_TYPE_IO_1V8_OR_3V0,
  27. DRV_TYPE_IO_1V8_ONLY,
  28. DRV_TYPE_IO_1V8_3V0_AUTO,
  29. DRV_TYPE_IO_3V3_ONLY,
  30. DRV_TYPE_MAX
  31. };
  32. enum rockchip_pin_pull_type
  33. {
  34. PULL_TYPE_IO_DEFAULT = 0,
  35. PULL_TYPE_IO_1V8_ONLY,
  36. PULL_TYPE_IO_1 = 1,
  37. PULL_TYPE_MAX
  38. };
  39. enum rockchip_pinctrl_type
  40. {
  41. RK3308,
  42. RK3528,
  43. RK3568,
  44. RK3576,
  45. RK3588,
  46. };
  47. struct rockchip_gpio_regs
  48. {
  49. rt_uint32_t port_dr; /* Data register */
  50. rt_uint32_t port_ddr; /* Data direction register */
  51. rt_uint32_t int_en; /* Interrupt enable */
  52. rt_uint32_t int_mask; /* Interrupt mask */
  53. rt_uint32_t int_type; /* Interrupt trigger type, such as high, low, edge trriger type. */
  54. rt_uint32_t int_polarity; /* Interrupt polarity enable register */
  55. rt_uint32_t int_bothedge; /* Interrupt bothedge enable register */
  56. rt_uint32_t int_status; /* Interrupt status register */
  57. rt_uint32_t int_rawstatus; /* Int_status = int_rawstatus & int_mask */
  58. rt_uint32_t debounce; /* Enable debounce for interrupt signal */
  59. rt_uint32_t dbclk_div_en; /* Enable divider for debounce clock */
  60. rt_uint32_t dbclk_div_con; /* Setting for divider of debounce clock */
  61. rt_uint32_t port_eoi; /* End of interrupt of the port */
  62. rt_uint32_t ext_port; /* Port data from external */
  63. rt_uint32_t version_id; /* Controller version register */
  64. };
  65. struct rockchip_iomux
  66. {
  67. int type;
  68. int offset;
  69. };
  70. struct rockchip_drv
  71. {
  72. enum rockchip_pin_drv_type drv_type;
  73. int offset;
  74. };
  75. struct rockchip_pin_data
  76. {
  77. struct rt_syscon *regmap_base;
  78. struct rt_syscon *regmap_pmu;
  79. rt_size_t reg_size;
  80. struct rockchip_pin_ctrl *pinctrl;
  81. };
  82. struct rockchip_pin_bank
  83. {
  84. struct rt_device_pin parent;
  85. const char *name;
  86. int irq;
  87. void *reg_base;
  88. struct rt_clk *clk;
  89. struct rt_clk *db_clk;
  90. rt_uint8_t nr_pins;
  91. rt_uint8_t bank_num;
  92. rt_uint32_t gpio_type;
  93. rt_uint32_t mask_cache;
  94. rt_uint32_t toggle_edge_mode;
  95. struct rockchip_pin_data *drvdata;
  96. const struct rockchip_gpio_regs *gpio_regs;
  97. struct rockchip_iomux iomux[4];
  98. struct rockchip_drv drv[4];
  99. enum rockchip_pin_pull_type pull_type[4];
  100. struct rt_spinlock spinlock;
  101. rt_uint32_t route_mask;
  102. rt_uint32_t recalced_mask;
  103. };
  104. #define raw_pin_to_bank(raw) rt_container_of(raw, struct rockchip_pin_bank, parent)
  105. struct rockchip_mux_recalced_data
  106. {
  107. rt_uint8_t num;
  108. rt_uint8_t pin;
  109. rt_uint32_t reg;
  110. rt_uint8_t bit;
  111. rt_uint8_t mask;
  112. };
  113. enum rockchip_mux_route_location
  114. {
  115. ROCKCHIP_ROUTE_SAME = 0,
  116. ROCKCHIP_ROUTE_PMU,
  117. ROCKCHIP_ROUTE_GRF,
  118. };
  119. struct rockchip_mux_route_data
  120. {
  121. rt_uint8_t bank_num;
  122. rt_uint8_t pin;
  123. rt_uint8_t func;
  124. enum rockchip_mux_route_location route_location;
  125. rt_uint32_t route_offset;
  126. rt_uint32_t route_val;
  127. };
  128. struct rockchip_pin_ctrl
  129. {
  130. char *label;
  131. enum rockchip_pinctrl_type type;
  132. struct rockchip_pin_bank *pin_banks;
  133. rt_uint32_t banks_nr;
  134. rt_uint32_t pins_nr;
  135. int grf_mux_offset;
  136. int pmu_mux_offset;
  137. int grf_drv_offset;
  138. int pmu_drv_offset;
  139. struct rockchip_mux_recalced_data *iomux_recalced;
  140. rt_uint32_t niomux_recalced;
  141. struct rockchip_mux_route_data *iomux_routes;
  142. rt_uint32_t niomux_routes;
  143. rt_err_t (*set_mux)(struct rockchip_pin_bank *pin_bank, int pin, int mux);
  144. rt_err_t (*set_pull)(struct rockchip_pin_bank *pin_bank, int pin, int pull);
  145. rt_err_t (*set_drive)(struct rockchip_pin_bank *pin_bank, int pin, int strength);
  146. rt_err_t (*set_schmitt)(struct rockchip_pin_bank *pin_bank, int pin, int enable);
  147. };
  148. struct rockchip_pinctrl_device
  149. {
  150. struct rt_device_pin parent;
  151. struct rockchip_pin_data drvdata;
  152. struct rockchip_pin_ctrl *pinctrl;
  153. };
  154. #endif /* __ROCKCHIP_PINCTRL_H__ */