schgm-flash.c 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2018 The Linux Foundation. All rights reserved.
  4. * Copyright (c) 2022-2023, Qualcomm Innovation Center, Inc. All rights reserved.
  5. */
  6. #define pr_fmt(fmt) "SCHG-FLASH: %s: " fmt, __func__
  7. #include <linux/device.h>
  8. #include <linux/delay.h>
  9. #include <linux/module.h>
  10. #include <linux/regmap.h>
  11. #include <linux/power_supply.h>
  12. #include <linux/interrupt.h>
  13. #include <linux/of.h>
  14. #include <linux/of_irq.h>
  15. #include <linux/printk.h>
  16. #include <linux/pmic-voter.h>
  17. #include "smb5-lib.h"
  18. #include "schgm-flash.h"
  19. #define IS_BETWEEN(left, right, value) \
  20. (((left) >= (right) && (left) >= (value) \
  21. && (value) >= (right)) \
  22. || ((left) <= (right) && (left) <= (value) \
  23. && (value) <= (right)))
  24. irqreturn_t smb5_schgm_flash_default_irq_handler(int irq, void *data)
  25. {
  26. struct smb_irq_data *irq_data = data;
  27. pr_debug("IRQ: %s\n", irq_data->name);
  28. return IRQ_HANDLED;
  29. }
  30. irqreturn_t smb5_schgm_flash_ilim2_irq_handler(int irq, void *data)
  31. {
  32. struct smb_irq_data *irq_data = data;
  33. struct smb_charger *chg = irq_data->parent_data;
  34. int rc;
  35. rc = smblib_write(chg, SCHGM_FLASH_S2_LATCH_RESET_CMD_REG,
  36. FLASH_S2_LATCH_RESET_BIT);
  37. if (rc < 0)
  38. pr_err("Couldn't reset S2_LATCH reset rc=%d\n", rc);
  39. return IRQ_HANDLED;
  40. }
  41. irqreturn_t smb5_schgm_flash_state_change_irq_handler(int irq, void *data)
  42. {
  43. struct smb_irq_data *irq_data = data;
  44. struct smb_charger *chg = irq_data->parent_data;
  45. int rc;
  46. u8 reg;
  47. rc = smblib_read(chg, SCHGM_FLASH_STATUS_3_REG, &reg);
  48. if (rc < 0)
  49. pr_err("Couldn't read flash status_3 rc=%d\n", rc);
  50. else
  51. pr_debug("Flash status changed state=[%x]\n",
  52. (reg && FLASH_STATE_MASK));
  53. return IRQ_HANDLED;
  54. }
  55. #define FIXED_MODE 0
  56. #define ADAPTIVE_MODE 1
  57. static void schgm_flash_parse_dt(struct smb_charger *chg)
  58. {
  59. struct device_node *node = chg->dev->of_node;
  60. u32 val;
  61. int rc;
  62. chg->flash_derating_soc = -EINVAL;
  63. rc = of_property_read_u32(node, "qcom,flash-derating-soc", &val);
  64. if (!rc) {
  65. if (IS_BETWEEN(0, 100, val))
  66. chg->flash_derating_soc = (val * 255) / 100;
  67. }
  68. chg->flash_disable_soc = -EINVAL;
  69. rc = of_property_read_u32(node, "qcom,flash-disable-soc", &val);
  70. if (!rc) {
  71. if (IS_BETWEEN(0, 100, val))
  72. chg->flash_disable_soc = (val * 255) / 100;
  73. }
  74. chg->headroom_mode = -EINVAL;
  75. rc = of_property_read_u32(node, "qcom,headroom-mode", &val);
  76. if (!rc) {
  77. if (IS_BETWEEN(FIXED_MODE, ADAPTIVE_MODE, val))
  78. chg->headroom_mode = val;
  79. }
  80. }
  81. bool is_flash_active(struct smb_charger *chg)
  82. {
  83. return chg->flash_active ? true : false;
  84. }
  85. int schgm_flash_get_vreg_ok(struct smb_charger *chg, int *val)
  86. {
  87. int rc, vreg_state;
  88. u8 stat = 0;
  89. if (!chg->flash_init_done)
  90. return -EPERM;
  91. rc = smblib_read(chg, SCHGM_FLASH_STATUS_2_REG, &stat);
  92. if (rc < 0) {
  93. pr_err("Couldn't read FLASH STATUS_2 rc=%d\n", rc);
  94. return rc;
  95. }
  96. vreg_state = !!(stat & VREG_OK_BIT);
  97. /* If VREG_OK is not set check for flash error */
  98. if (!vreg_state) {
  99. rc = smblib_read(chg, SCHGM_FLASH_STATUS_3_REG, &stat);
  100. if (rc < 0) {
  101. pr_err("Couldn't read FLASH_STATUS_3 rc=%d\n", rc);
  102. return rc;
  103. }
  104. if ((stat & FLASH_STATE_MASK) == FLASH_ERROR_VAL) {
  105. vreg_state = -EFAULT;
  106. rc = smblib_read(chg, SCHGM_FLASH_STATUS_5_REG,
  107. &stat);
  108. if (rc < 0) {
  109. pr_err("Couldn't read FLASH_STATUS_5 rc=%d\n",
  110. rc);
  111. return rc;
  112. }
  113. pr_debug("Flash error: status=%x\n", stat);
  114. }
  115. }
  116. /*
  117. * val can be one of the following:
  118. * 1 - VREG_OK is set.
  119. * 0 - VREG_OK is 0 but no Flash error.
  120. * -EFAULT - Flash Error is set.
  121. */
  122. *val = vreg_state;
  123. return 0;
  124. }
  125. void schgm_flash_torch_priority(struct smb_charger *chg, enum torch_mode mode)
  126. {
  127. int rc;
  128. u8 reg;
  129. /*
  130. * If torch is configured in default BOOST mode, skip any update in the
  131. * mode configuration.
  132. */
  133. if (chg->headroom_mode == FIXED_MODE)
  134. return;
  135. if ((mode != TORCH_BOOST_MODE) && (mode != TORCH_BUCK_MODE))
  136. return;
  137. reg = mode;
  138. rc = smblib_masked_write(chg, SCHGM_TORCH_PRIORITY_CONTROL_REG,
  139. TORCH_PRIORITY_CONTROL_BIT, reg);
  140. if (rc < 0)
  141. pr_err("Couldn't configure Torch priority control rc=%d\n",
  142. rc);
  143. pr_debug("Torch priority changed to: %d\n", mode);
  144. }
  145. int schgm_flash_init(struct smb_charger *chg)
  146. {
  147. int rc;
  148. u8 reg;
  149. schgm_flash_parse_dt(chg);
  150. if (chg->flash_derating_soc != -EINVAL) {
  151. rc = smblib_write(chg, SCHGM_SOC_BASED_FLASH_DERATE_TH_CFG_REG,
  152. chg->flash_derating_soc);
  153. if (rc < 0) {
  154. pr_err("Couldn't configure SOC for flash derating rc=%d\n",
  155. rc);
  156. return rc;
  157. }
  158. }
  159. if (chg->flash_disable_soc != -EINVAL) {
  160. rc = smblib_write(chg, SCHGM_SOC_BASED_FLASH_DISABLE_TH_CFG_REG,
  161. chg->flash_disable_soc);
  162. if (rc < 0) {
  163. pr_err("Couldn't configure SOC for flash disable rc=%d\n",
  164. rc);
  165. return rc;
  166. }
  167. }
  168. if (chg->headroom_mode != -EINVAL) {
  169. /*
  170. * configure headroom management policy for
  171. * flash and torch mode.
  172. */
  173. reg = (chg->headroom_mode == FIXED_MODE)
  174. ? FORCE_FLASH_BOOST_5V_BIT : 0;
  175. rc = smblib_write(chg, SCHGM_FORCE_BOOST_CONTROL, reg);
  176. if (rc < 0) {
  177. pr_err("Couldn't write force boost control reg rc=%d\n",
  178. rc);
  179. return rc;
  180. }
  181. reg = (chg->headroom_mode == FIXED_MODE)
  182. ? TORCH_PRIORITY_CONTROL_BIT : 0;
  183. rc = smblib_write(chg, SCHGM_TORCH_PRIORITY_CONTROL_REG, reg);
  184. if (rc < 0) {
  185. pr_err("Couldn't force 5V boost in torch mode rc=%d\n",
  186. rc);
  187. return rc;
  188. }
  189. }
  190. if ((chg->flash_derating_soc != -EINVAL)
  191. || (chg->flash_disable_soc != -EINVAL)) {
  192. /* Check if SOC based derating/disable is enabled */
  193. rc = smblib_read(chg, SCHGM_FLASH_CONTROL_REG, &reg);
  194. if (rc < 0) {
  195. pr_err("Couldn't read flash control reg rc=%d\n", rc);
  196. return rc;
  197. }
  198. if (!(reg & SOC_LOW_FOR_FLASH_EN_BIT))
  199. pr_warn("Soc based flash derating not enabled\n");
  200. }
  201. chg->flash_init_done = true;
  202. return 0;
  203. }