pinctrl-rockchip.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  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. RK3568,
  43. RK3588,
  44. };
  45. struct rockchip_gpio_regs
  46. {
  47. rt_uint32_t port_dr; /* Data register */
  48. rt_uint32_t port_ddr; /* Data direction register */
  49. rt_uint32_t int_en; /* Interrupt enable */
  50. rt_uint32_t int_mask; /* Interrupt mask */
  51. rt_uint32_t int_type; /* Interrupt trigger type, such as high, low, edge trriger type. */
  52. rt_uint32_t int_polarity; /* Interrupt polarity enable register */
  53. rt_uint32_t int_bothedge; /* Interrupt bothedge enable register */
  54. rt_uint32_t int_status; /* Interrupt status register */
  55. rt_uint32_t int_rawstatus; /* Int_status = int_rawstatus & int_mask */
  56. rt_uint32_t debounce; /* Enable debounce for interrupt signal */
  57. rt_uint32_t dbclk_div_en; /* Enable divider for debounce clock */
  58. rt_uint32_t dbclk_div_con; /* Setting for divider of debounce clock */
  59. rt_uint32_t port_eoi; /* End of interrupt of the port */
  60. rt_uint32_t ext_port; /* Port data from external */
  61. rt_uint32_t version_id; /* Controller version register */
  62. };
  63. struct rockchip_iomux
  64. {
  65. int type;
  66. int offset;
  67. };
  68. struct rockchip_drv
  69. {
  70. enum rockchip_pin_drv_type drv_type;
  71. int offset;
  72. };
  73. struct rockchip_pin_data
  74. {
  75. struct rt_syscon *regmap_base;
  76. struct rt_syscon *regmap_pmu;
  77. rt_size_t reg_size;
  78. struct rockchip_pin_ctrl *pinctrl;
  79. };
  80. struct rockchip_pin_bank
  81. {
  82. struct rt_device_pin parent;
  83. const char *name;
  84. int irq;
  85. void *reg_base;
  86. struct rt_clk *clk;
  87. struct rt_clk *db_clk;
  88. rt_uint8_t nr_pins;
  89. rt_uint8_t bank_num;
  90. rt_uint32_t gpio_type;
  91. rt_uint32_t mask_cache;
  92. rt_uint32_t toggle_edge_mode;
  93. struct rockchip_pin_data *drvdata;
  94. const struct rockchip_gpio_regs *gpio_regs;
  95. struct rockchip_iomux iomux[4];
  96. struct rockchip_drv drv[4];
  97. enum rockchip_pin_pull_type pull_type[4];
  98. struct rt_spinlock spinlock;
  99. rt_uint32_t route_mask;
  100. rt_uint32_t recalced_mask;
  101. };
  102. #define raw_pin_to_bank(raw) rt_container_of(raw, struct rockchip_pin_bank, parent)
  103. struct rockchip_mux_recalced_data
  104. {
  105. rt_uint8_t num;
  106. rt_uint8_t pin;
  107. rt_uint32_t reg;
  108. rt_uint8_t bit;
  109. rt_uint8_t mask;
  110. };
  111. enum rockchip_mux_route_location
  112. {
  113. ROCKCHIP_ROUTE_SAME = 0,
  114. ROCKCHIP_ROUTE_PMU,
  115. ROCKCHIP_ROUTE_GRF,
  116. };
  117. struct rockchip_mux_route_data
  118. {
  119. rt_uint8_t bank_num;
  120. rt_uint8_t pin;
  121. rt_uint8_t func;
  122. enum rockchip_mux_route_location route_location;
  123. rt_uint32_t route_offset;
  124. rt_uint32_t route_val;
  125. };
  126. struct rockchip_pin_ctrl
  127. {
  128. char *label;
  129. enum rockchip_pinctrl_type type;
  130. struct rockchip_pin_bank *pin_banks;
  131. rt_uint32_t banks_nr;
  132. rt_uint32_t pins_nr;
  133. int grf_mux_offset;
  134. int pmu_mux_offset;
  135. int grf_drv_offset;
  136. int pmu_drv_offset;
  137. struct rockchip_mux_recalced_data *iomux_recalced;
  138. rt_uint32_t niomux_recalced;
  139. struct rockchip_mux_route_data *iomux_routes;
  140. rt_uint32_t niomux_routes;
  141. rt_err_t (*set_mux)(struct rockchip_pin_bank *pin_bank, int pin, int mux);
  142. rt_err_t (*set_pull)(struct rockchip_pin_bank *pin_bank, int pin, int pull);
  143. rt_err_t (*set_drive)(struct rockchip_pin_bank *pin_bank, int pin, int strength);
  144. rt_err_t (*set_schmitt)(struct rockchip_pin_bank *pin_bank, int pin, int enable);
  145. };
  146. struct rockchip_pinctrl_device
  147. {
  148. struct rt_device_pin parent;
  149. struct rockchip_pin_data drvdata;
  150. struct rockchip_pin_ctrl *pinctrl;
  151. };
  152. #endif /* __ROCKCHIP_PINCTRL_H__ */