sunxi_hal_regulator.h 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. /*
  2. * Copyright (c) 2020 Allwinner Technology Co., Ltd. ALL rights reserved.
  3. */
  4. #ifndef __SUNXI_HAL_REGULATOR_H__
  5. #define __SUNXI_HAL_REGULATOR_H__
  6. #include <hal_debug.h>
  7. #include <hal_log.h>
  8. #ifdef __cplusplus
  9. extern "C" {
  10. #endif
  11. struct regulator_dev;
  12. struct regulator_ops{
  13. int (*enable) (struct regulator_dev *);
  14. int (*disable) (struct regulator_dev *);
  15. int (*set_voltage) (struct regulator_dev *, int target_uV);
  16. int (*get_voltage) (struct regulator_dev *, int *vol_uV);
  17. };
  18. struct regulator_dev{
  19. unsigned int flag;
  20. struct regulator_ops *ops;
  21. void *private;
  22. };
  23. struct regulator_linear_range {
  24. unsigned int min_uV;
  25. unsigned int min_sel;
  26. unsigned int max_sel;
  27. unsigned int uV_step;
  28. };
  29. struct regulator_desc {
  30. int min_uv;
  31. int max_uv;
  32. int step1_uv;
  33. int vol_reg;
  34. int vol_mask;
  35. int enable_reg;
  36. int enable_mask;
  37. int enable_val;
  38. int disable_val;
  39. const struct regulator_linear_range *linear_ranges;
  40. int n_linear_ranges;
  41. int *vtable;
  42. };
  43. #define AXP_DESC(min, max, step1, vreg, vmask, ereg, emask)\
  44. { \
  45. .min_uv = (min) * 1000, \
  46. .max_uv = (max) * 1000, \
  47. .step1_uv = (step1) * 1000, \
  48. .vol_reg = vreg, \
  49. .vol_mask = (vmask), \
  50. .enable_reg = ereg, \
  51. .enable_mask = (emask), \
  52. }
  53. #define AXP_DESC_FIXED(volt)\
  54. { \
  55. .min_uv = (volt) * 1000, \
  56. .max_uv = (volt) * 1000, \
  57. }
  58. #define AXP_IO(min, max, step1, vreg, vmask, ereg, emask, eval, disval)\
  59. { \
  60. .min_uv = (min) * 1000, \
  61. .max_uv = (max) * 1000, \
  62. .step1_uv = (step1) * 1000, \
  63. .vol_reg = vreg, \
  64. .vol_mask = (vmask), \
  65. .enable_reg = ereg, \
  66. .enable_mask = (emask), \
  67. .enable_val = eval, \
  68. .disable_val = disval, \
  69. }
  70. #define AXP_DESC_RANGES(_ranges, vreg, vmask, ereg, emask)\
  71. { \
  72. .vol_reg = vreg, \
  73. .vol_mask = (vmask), \
  74. .enable_reg = ereg, \
  75. .enable_mask = (emask), \
  76. .linear_ranges = (_ranges), \
  77. .n_linear_ranges = ARRAY_SIZE(_ranges), \
  78. }
  79. #define AXP_SW(ereg, emask)\
  80. { \
  81. .enable_reg = ereg, \
  82. .enable_mask = (emask), \
  83. }
  84. #define AXP_SEL(min, max, vreg, vmask, ereg, emask, table_name)\
  85. { \
  86. .min_uv = (min) * 1000, \
  87. .max_uv = (max) * 1000, \
  88. .vol_reg = vreg, \
  89. .vol_mask = (vmask), \
  90. .enable_reg = ereg, \
  91. .enable_mask = (emask), \
  92. .vtable = (int *)&table_name##_table, \
  93. }
  94. /* Initialize struct regulator_linear_range */
  95. #define REGULATOR_LINEAR_RANGE(_min_uV, _min_sel, _max_sel, _step_uV) \
  96. { \
  97. .min_uV = _min_uV, \
  98. .min_sel = _min_sel, \
  99. .max_sel = _max_sel, \
  100. .uV_step = _step_uV, \
  101. }
  102. /* for request_flag */
  103. #define TWI_PORT_SHIFT 8
  104. #define AXP_ADDR_SHIFT 12
  105. #define REGULATOR_TYPE_SHIFT 28
  106. #define REGULATOR_ID(x) ((x) & AXP_ID_MASK)
  107. #define TWI_PORT(x) (((x) & TWI_PORT_MASK) >> TWI_PORT_SHIFT)
  108. #define AXP_ADDR(x) (((x) & AXP_ADDR_MASK) >> AXP_ADDR_SHIFT)
  109. #define REGULATOR_TYPE(x) ((x) >> REGULATOR_TYPE_SHIFT)
  110. #define AXP_ID_MASK 0x000ff
  111. #define TWI_PORT_MASK 0x00f00
  112. #define AXP_ADDR_MASK 0xff000
  113. #define REGULATOR_GET(x, y) (((x) << REGULATOR_TYPE_SHIFT) | (y))
  114. enum REGULATOR_TYPE_ENUM{
  115. AXP2101_REGULATOR,
  116. PWM_REGULATOR,
  117. GPIO_REGULATOR,
  118. };
  119. /*
  120. * +---> regulator type
  121. * |
  122. * | --->Rsv
  123. * | / --->pmu addr
  124. * | / / --->twi port
  125. * | / / / --->regulator id
  126. * | / / / /
  127. * +--------------------------------------------------------+
  128. * |31 28|27 20|19 12|11 8|7 0|
  129. * +--------------------------------------------------------+
  130. */
  131. //FIXME
  132. /*
  133. typedef short s16;
  134. typedef long long int s64;
  135. typedef unsigned char u8;
  136. typedef unsigned short u16;
  137. typedef unsigned long long int u64;
  138. */
  139. static inline int hal_regulator_get_voltage(struct regulator_dev *rdev,
  140. int *vol_uV)
  141. {
  142. if(rdev && rdev->ops && rdev->ops->get_voltage)
  143. {
  144. return rdev->ops->get_voltage(rdev, vol_uV);
  145. }
  146. else
  147. {
  148. hal_soft_break();
  149. hal_log_err("fatal error.");
  150. }
  151. return 0;
  152. }
  153. static inline int hal_regulator_set_voltage(struct regulator_dev *rdev,
  154. int target_uV)
  155. {
  156. if(rdev && rdev->ops && rdev->ops->set_voltage)
  157. {
  158. return rdev->ops->set_voltage(rdev, target_uV);
  159. }
  160. else
  161. {
  162. hal_soft_break();
  163. hal_log_err("fatal error.");
  164. }
  165. return 0;
  166. }
  167. static inline int hal_regulator_enable(struct regulator_dev *rdev)
  168. {
  169. if(rdev && rdev->ops && rdev->ops->enable)
  170. {
  171. return rdev->ops->enable(rdev);
  172. }
  173. else
  174. {
  175. hal_soft_break();
  176. hal_log_err("fatal error.");
  177. }
  178. return 0;
  179. }
  180. static inline int hal_regulator_disable(struct regulator_dev *rdev)
  181. {
  182. if(rdev && rdev->ops && rdev->ops->disable)
  183. {
  184. return rdev->ops->disable(rdev);
  185. }
  186. else
  187. {
  188. hal_soft_break();
  189. hal_log_err("fatal error.");
  190. }
  191. return 0;
  192. }
  193. int hal_regulator_get(unsigned int request_flag, struct regulator_dev *rdev);
  194. /* TODO fix void type */
  195. /* TODO fix void type */
  196. enum REGULATOR_ID_ENUM {
  197. AXP2101_ID_DCDC1 = 0,
  198. AXP2101_ID_DCDC2,
  199. AXP2101_ID_DCDC3,
  200. AXP2101_ID_DCDC4,
  201. AXP2101_ID_DCDC5,
  202. AXP2101_ID_ALDO1,
  203. AXP2101_ID_ALDO2,
  204. AXP2101_ID_ALDO3,
  205. AXP2101_ID_ALDO4,
  206. AXP2101_ID_BLDO1,
  207. AXP2101_ID_BLDO2,
  208. AXP2101_ID_DLDO1,
  209. AXP2101_ID_DLDO2,
  210. AXP2101_ID_CPUSLDO,
  211. AXP2101_ID_MAX,
  212. };
  213. extern const struct regulator_desc axp2101_regulators[];
  214. int hal_axp_twi_init(struct regulator_dev *rdev);
  215. /*int hal_axp_byte_read(struct regulator_dev *rdev, u8 reg, u8 *reg_val);
  216. int hal_axp_byte_write(struct regulator_dev *rdev, u8 reg, u8 reg_val);
  217. int hal_axp_byte_update(struct regulator_dev *rdev, u8 reg, u8 val, u8 mask);
  218. */
  219. #ifdef __cplusplus
  220. }
  221. #endif
  222. #endif /* __SUNXI_HAL_REGULATOR_H__ */