bcl_pmic5.c 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2018-2021, The Linux Foundation. All rights reserved.
  4. * Copyright (c) 2021-2024, Qualcomm Innovation Center, Inc. All rights reserved.
  5. */
  6. #define pr_fmt(fmt) "%s:%s " fmt, KBUILD_MODNAME, __func__
  7. #include <linux/module.h>
  8. #include <linux/interrupt.h>
  9. #include <linux/workqueue.h>
  10. #include <linux/kernel.h>
  11. #include <linux/regmap.h>
  12. #include <linux/io.h>
  13. #include <linux/err.h>
  14. #include <linux/of.h>
  15. #include <linux/of_address.h>
  16. #include <linux/spmi.h>
  17. #include <linux/platform_device.h>
  18. #include <linux/mutex.h>
  19. #include <linux/thermal.h>
  20. #include <linux/slab.h>
  21. #include <linux/nvmem-consumer.h>
  22. #include <linux/ipc_logging.h>
  23. #include "thermal_zone_internal.h"
  24. #define BCL_DRIVER_NAME "bcl_pmic5"
  25. #define BCL_MONITOR_EN 0x46
  26. #define BCL_IRQ_STATUS 0x08
  27. #define BCL_REVISION1 0x0
  28. #define BCL_REVISION2 0x01
  29. #define BCL_PARAM_1 0x0e
  30. #define BCL_PARAM_2 0x0f
  31. #define ANA_MAJOR_OFFSET 0x03
  32. #define BCL_IBAT_HIGH 0x4B
  33. #define BCL_IBAT_TOO_HIGH 0x4C
  34. #define BCL_IBAT_TOO_HIGH_REV4 0x4D
  35. #define BCL_IBAT_READ 0x86
  36. #define BCL_IBAT_SCALING_UA 78127
  37. #define BCL_IBAT_CCM_SCALING_UA 15625
  38. #define BCL_IBAT_SCALING_REV4_UA 93753
  39. #define BCL_VBAT_READ 0x76
  40. #define BCL_VBAT_ADC_LOW 0x48
  41. #define BCL_VBAT_COMP_LOW 0x49
  42. #define BCL_VBAT_COMP_TLOW 0x4A
  43. #define BCL_VBAT_CONV_REQ 0x72
  44. #define BCL_GEN3_MAJOR_REV 4
  45. #define BCL_PARAM_HAS_ADC BIT(0)
  46. #define BCL_PARAM_HAS_IBAT_ADC BIT(2)
  47. #define BCL_IRQ_L0 0x1
  48. #define BCL_IRQ_L1 0x2
  49. #define BCL_IRQ_L2 0x4
  50. /*
  51. * 49827 = 64.879uV (one bit value) * 3 (voltage divider)
  52. * * 256 (8 bit shift for MSB)
  53. */
  54. #define BCL_VBAT_SCALING_UV 49827 /* 194.636uV * 256 */
  55. #define BCL_VBAT_NO_READING 127
  56. #define BCL_VBAT_BASE_MV 2000
  57. #define BCL_VBAT_INC_MV 25
  58. #define BCL_VBAT_MAX_MV 3600
  59. #define BCL_VBAT_THRESH_BASE 0x8CA
  60. #define BCL_IBAT_CCM_OFFSET 800
  61. #define BCL_IBAT_CCM_LSB 100
  62. #define BCL_IBAT_CCM_MAX_VAL 14
  63. #define BCL_VBAT_4G_NO_READING 0x7fff
  64. #define BCL_GEN4_MAJOR_REV 5
  65. #define BCL_VBAT_SCALING_REV5_NV 194637 /* 64.879uV (one bit) * 3 VD */
  66. #define BCL_IBAT_SCALING_REV5_NA 61037
  67. #define BCL_IBAT_THRESH_SCALING_REV5_UA 156255 /* 610.37uA * 256 */
  68. #define BCL_VBAT_TRIP_CNT 3
  69. #define BCL_GEN4_ANA_MAJOR 3
  70. #define BCL_IBAT_COTTID_SCALING 366220
  71. #define MAX_PERPH_COUNT 2
  72. #define IPC_LOGPAGES 2
  73. #define BCL_IPC(dev, msg, args...) do { \
  74. if ((dev) && (dev)->ipc_log) { \
  75. ipc_log_string((dev)->ipc_log, \
  76. "[%s]: %s: " msg, \
  77. current->comm, __func__, args); \
  78. } \
  79. } while (0)
  80. enum bcl_dev_type {
  81. BCL_IBAT_LVL0,
  82. BCL_IBAT_LVL1,
  83. BCL_VBAT_LVL0,
  84. BCL_VBAT_LVL1,
  85. BCL_VBAT_LVL2,
  86. BCL_LVL0,
  87. BCL_LVL1,
  88. BCL_LVL2,
  89. BCL_2S_IBAT_LVL0,
  90. BCL_2S_IBAT_LVL1,
  91. BCL_TYPE_MAX,
  92. };
  93. static char bcl_int_names[BCL_TYPE_MAX][25] = {
  94. "bcl-ibat-lvl0",
  95. "bcl-ibat-lvl1",
  96. "bcl-vbat-lvl0",
  97. "bcl-vbat-lvl1",
  98. "bcl-vbat-lvl2",
  99. "bcl-lvl0",
  100. "bcl-lvl1",
  101. "bcl-lvl2",
  102. "bcl-2s-ibat-lvl0",
  103. "bcl-2s-ibat-lvl1",
  104. };
  105. enum bcl_ibat_ext_range_type {
  106. BCL_IBAT_RANGE_LVL0,
  107. BCL_IBAT_RANGE_LVL1,
  108. BCL_IBAT_RANGE_LVL2,
  109. BCL_IBAT_RANGE_MAX,
  110. };
  111. static uint32_t bcl_ibat_ext_ranges[BCL_IBAT_RANGE_MAX] = {
  112. 10, /* default range factor */
  113. 20,
  114. 25
  115. };
  116. struct bcl_device;
  117. struct bcl_peripheral_data {
  118. int irq_num;
  119. int status_bit_idx;
  120. long trip_thresh;
  121. int last_val;
  122. struct mutex state_trans_lock;
  123. bool irq_enabled;
  124. enum bcl_dev_type type;
  125. struct thermal_zone_device_ops ops;
  126. struct thermal_zone_device *tz_dev;
  127. struct bcl_device *dev;
  128. };
  129. struct bcl_device {
  130. struct device *dev;
  131. struct regmap *regmap;
  132. uint16_t fg_bcl_addr;
  133. uint8_t dig_major;
  134. uint8_t dig_minor;
  135. uint8_t ana_major;
  136. uint8_t bcl_param_1;
  137. uint8_t bcl_type;
  138. void *ipc_log;
  139. bool ibat_ccm_enabled;
  140. bool ibat_use_qg_adc;
  141. bool no_bit_shift;
  142. uint32_t ibat_ext_range_factor;
  143. struct bcl_peripheral_data param[BCL_TYPE_MAX];
  144. };
  145. static struct bcl_device *bcl_devices[MAX_PERPH_COUNT];
  146. static int bcl_device_ct;
  147. static int bcl_read_multi_register(struct bcl_device *bcl_perph, int16_t reg_offset,
  148. unsigned int *data, size_t len)
  149. {
  150. int ret = 0;
  151. if (!bcl_perph) {
  152. pr_err("BCL device not initialized\n");
  153. return -EINVAL;
  154. }
  155. ret = regmap_bulk_read(bcl_perph->regmap,
  156. (bcl_perph->fg_bcl_addr + reg_offset),
  157. data, len);
  158. if (ret < 0)
  159. pr_err("Error reading reg base:0x%04x len:%ld err:%d\n",
  160. bcl_perph->fg_bcl_addr + reg_offset, len, ret);
  161. else
  162. pr_debug("Read register:0x%04x value:0x%02x len:%ld\n",
  163. bcl_perph->fg_bcl_addr + reg_offset,
  164. *data, len);
  165. return ret;
  166. }
  167. static int bcl_read_register(struct bcl_device *bcl_perph, int16_t reg_offset,
  168. unsigned int *data)
  169. {
  170. int ret = 0;
  171. if (!bcl_perph) {
  172. pr_err("BCL device not initialized\n");
  173. return -EINVAL;
  174. }
  175. ret = regmap_read(bcl_perph->regmap,
  176. (bcl_perph->fg_bcl_addr + reg_offset),
  177. data);
  178. if (ret < 0)
  179. pr_err("Error reading register 0x%04x err:%d\n",
  180. bcl_perph->fg_bcl_addr + reg_offset, ret);
  181. else
  182. pr_debug("Read register:0x%04x value:0x%02x\n",
  183. bcl_perph->fg_bcl_addr + reg_offset,
  184. *data);
  185. return ret;
  186. }
  187. static int bcl_write_register(struct bcl_device *bcl_perph,
  188. int16_t reg_offset, uint8_t data)
  189. {
  190. int ret = 0;
  191. uint8_t *write_buf = &data;
  192. uint16_t base;
  193. if (!bcl_perph) {
  194. pr_err("BCL device not initialized\n");
  195. return -EINVAL;
  196. }
  197. base = bcl_perph->fg_bcl_addr;
  198. ret = regmap_write(bcl_perph->regmap, (base + reg_offset), *write_buf);
  199. if (ret < 0) {
  200. pr_err("Error reading register:0x%04x val:0x%02x err:%d\n",
  201. base + reg_offset, data, ret);
  202. return ret;
  203. }
  204. pr_debug("wrote 0x%02x to 0x%04x\n", data, base + reg_offset);
  205. return ret;
  206. }
  207. static void convert_adc_to_vbat_thresh_val(struct bcl_device *bcl_perph, int *val)
  208. {
  209. /*
  210. * Threshold register can be bit shifted from ADC MSB.
  211. * So the scaling factor is half in those cases.
  212. */
  213. if (bcl_perph->no_bit_shift)
  214. *val = (*val * BCL_VBAT_SCALING_UV) / 1000;
  215. else
  216. *val = (*val * BCL_VBAT_SCALING_UV) / 2000;
  217. }
  218. /* Common helper to convert nano unit to milli unit */
  219. static void convert_adc_nu_to_mu_val(unsigned int *val, unsigned int scaling_factor)
  220. {
  221. *val = div_s64(*val * scaling_factor, 1000000);
  222. }
  223. static void convert_adc_to_vbat_val(int *val)
  224. {
  225. *val = (*val * BCL_VBAT_SCALING_UV) / 1000;
  226. }
  227. static void convert_ibat_to_adc_val(struct bcl_device *bcl_perph, int *val, int scaling_factor)
  228. {
  229. /*
  230. * Threshold register can be bit shifted from ADC MSB.
  231. * So the scaling factor is half in those cases.
  232. */
  233. if (bcl_perph->ibat_use_qg_adc)
  234. *val = (int)div_s64(*val * 2000 * 2, scaling_factor);
  235. else if (bcl_perph->no_bit_shift)
  236. *val = (int)div_s64(*val * 1000 * bcl_ibat_ext_ranges[BCL_IBAT_RANGE_LVL0],
  237. scaling_factor);
  238. else
  239. *val = (int)div_s64(*val * 2000 * bcl_ibat_ext_ranges[BCL_IBAT_RANGE_LVL0],
  240. scaling_factor);
  241. }
  242. static void convert_adc_to_ibat_val(struct bcl_device *bcl_perph, int *val, int scaling_factor)
  243. {
  244. /* Scaling factor will be half if ibat_use_qg_adc is true */
  245. if (bcl_perph->ibat_use_qg_adc)
  246. *val = (int)div_s64(*val * scaling_factor, 2 * 1000);
  247. else
  248. *val = (int)div_s64(*val * scaling_factor,
  249. 1000 * bcl_ibat_ext_ranges[BCL_IBAT_RANGE_LVL0]);
  250. }
  251. static int8_t convert_ibat_to_ccm_val(int ibat)
  252. {
  253. int8_t val = BCL_IBAT_CCM_MAX_VAL;
  254. val = (int8_t)((ibat - BCL_IBAT_CCM_OFFSET) / BCL_IBAT_CCM_LSB);
  255. if (val > BCL_IBAT_CCM_MAX_VAL) {
  256. pr_err(
  257. "CCM thresh:%d is invalid, use MAX supported threshold\n",
  258. ibat);
  259. val = BCL_IBAT_CCM_MAX_VAL;
  260. }
  261. return val;
  262. }
  263. static int bcl_set_ibat(struct thermal_zone_device *tz, int low, int high)
  264. {
  265. int ret = 0, ibat_ua, thresh_value;
  266. int8_t val = 0;
  267. int16_t addr;
  268. struct bcl_peripheral_data *bat_data =
  269. (struct bcl_peripheral_data *)tz->devdata;
  270. mutex_lock(&bat_data->state_trans_lock);
  271. thresh_value = high;
  272. if (bat_data->trip_thresh == thresh_value)
  273. goto set_trip_exit;
  274. if (bat_data->irq_num && bat_data->irq_enabled) {
  275. disable_irq_nosync(bat_data->irq_num);
  276. bat_data->irq_enabled = false;
  277. }
  278. if (thresh_value == INT_MAX) {
  279. bat_data->trip_thresh = thresh_value;
  280. goto set_trip_exit;
  281. }
  282. ibat_ua = thresh_value;
  283. if (bat_data->dev->ibat_ccm_enabled)
  284. convert_ibat_to_adc_val(bat_data->dev, &thresh_value,
  285. BCL_IBAT_CCM_SCALING_UA *
  286. bat_data->dev->ibat_ext_range_factor);
  287. else if (bat_data->dev->dig_major >= BCL_GEN4_MAJOR_REV &&
  288. bat_data->dev->ana_major >= BCL_GEN4_ANA_MAJOR)
  289. convert_ibat_to_adc_val(bat_data->dev, &thresh_value,
  290. BCL_IBAT_THRESH_SCALING_REV5_UA *
  291. bat_data->dev->ibat_ext_range_factor);
  292. else if (bat_data->dev->dig_major >= BCL_GEN3_MAJOR_REV)
  293. convert_ibat_to_adc_val(bat_data->dev, &thresh_value,
  294. BCL_IBAT_SCALING_REV4_UA *
  295. bat_data->dev->ibat_ext_range_factor);
  296. else
  297. convert_ibat_to_adc_val(bat_data->dev, &thresh_value,
  298. BCL_IBAT_SCALING_UA *
  299. bat_data->dev->ibat_ext_range_factor);
  300. val = (int8_t)thresh_value;
  301. switch (bat_data->type) {
  302. case BCL_IBAT_LVL0:
  303. case BCL_2S_IBAT_LVL0:
  304. addr = BCL_IBAT_HIGH;
  305. pr_debug("ibat high threshold:%d mA ADC:0x%02x\n",
  306. ibat_ua, val);
  307. break;
  308. case BCL_IBAT_LVL1:
  309. case BCL_2S_IBAT_LVL1:
  310. addr = BCL_IBAT_TOO_HIGH;
  311. if (bat_data->dev->dig_major >= BCL_GEN3_MAJOR_REV &&
  312. bat_data->dev->bcl_param_1 & BCL_PARAM_HAS_IBAT_ADC)
  313. addr = BCL_IBAT_TOO_HIGH_REV4;
  314. if (bat_data->dev->ibat_ccm_enabled)
  315. val = convert_ibat_to_ccm_val(ibat_ua);
  316. pr_debug("ibat too high threshold:%d mA ADC:0x%02x\n",
  317. ibat_ua, val);
  318. break;
  319. default:
  320. goto set_trip_exit;
  321. }
  322. ret = bcl_write_register(bat_data->dev, addr, val);
  323. if (ret)
  324. goto set_trip_exit;
  325. bat_data->trip_thresh = ibat_ua;
  326. if (bat_data->irq_num && !bat_data->irq_enabled) {
  327. enable_irq(bat_data->irq_num);
  328. bat_data->irq_enabled = true;
  329. }
  330. set_trip_exit:
  331. mutex_unlock(&bat_data->state_trans_lock);
  332. return ret;
  333. }
  334. static int bcl_read_ibat(struct thermal_zone_device *tz, int *adc_value)
  335. {
  336. int ret = 0;
  337. unsigned int val = 0;
  338. struct bcl_peripheral_data *bat_data =
  339. (struct bcl_peripheral_data *)tz->devdata;
  340. *adc_value = val;
  341. if (bat_data->dev->dig_major < BCL_GEN4_MAJOR_REV)
  342. ret = bcl_read_register(bat_data->dev, BCL_IBAT_READ, &val);
  343. else
  344. ret = bcl_read_multi_register(bat_data->dev, BCL_IBAT_READ, &val, 2);
  345. if (ret)
  346. return ret;
  347. /* IBat ADC reading is in 2's compliment form */
  348. if (bat_data->dev->dig_major < BCL_GEN4_MAJOR_REV)
  349. *adc_value = sign_extend32(val, 7);
  350. else
  351. *adc_value = sign_extend32(val, 15);
  352. if (val == 0) {
  353. /*
  354. * The sensor sometime can read a value 0 if there is
  355. * consequtive reads
  356. */
  357. *adc_value = bat_data->last_val;
  358. } else {
  359. if (bat_data->dev->ibat_ccm_enabled)
  360. convert_adc_to_ibat_val(bat_data->dev, adc_value,
  361. BCL_IBAT_CCM_SCALING_UA *
  362. bat_data->dev->ibat_ext_range_factor);
  363. else if (bat_data->dev->dig_major >= BCL_GEN4_MAJOR_REV
  364. && bat_data->dev->ana_major >= BCL_GEN4_ANA_MAJOR)
  365. convert_adc_nu_to_mu_val(adc_value,
  366. BCL_IBAT_SCALING_REV5_NA);
  367. else if (bat_data->dev->dig_major >= BCL_GEN4_MAJOR_REV)
  368. convert_adc_nu_to_mu_val(adc_value,
  369. BCL_IBAT_COTTID_SCALING);
  370. else if (bat_data->dev->dig_major >= BCL_GEN3_MAJOR_REV)
  371. convert_adc_to_ibat_val(bat_data->dev, adc_value,
  372. BCL_IBAT_SCALING_REV4_UA *
  373. bat_data->dev->ibat_ext_range_factor);
  374. else
  375. convert_adc_to_ibat_val(bat_data->dev, adc_value,
  376. BCL_IBAT_SCALING_UA *
  377. bat_data->dev->ibat_ext_range_factor);
  378. bat_data->last_val = *adc_value;
  379. }
  380. pr_debug("ibat:%d mA ADC:0x%02x\n", bat_data->last_val, val);
  381. BCL_IPC(bat_data->dev, "ibat:%d mA ADC:0x%02x\n",
  382. bat_data->last_val, val);
  383. return ret;
  384. }
  385. static int bcl_get_vbat_trip(struct thermal_zone_device *tzd,
  386. int type, int *trip)
  387. {
  388. int ret = 0;
  389. unsigned int val = 0;
  390. struct bcl_peripheral_data *bat_data =
  391. (struct bcl_peripheral_data *)tzd->devdata;
  392. int16_t addr;
  393. *trip = 0;
  394. switch (type + BCL_VBAT_LVL0) {
  395. case BCL_VBAT_LVL0:
  396. addr = BCL_VBAT_ADC_LOW;
  397. break;
  398. case BCL_VBAT_LVL1:
  399. addr = BCL_VBAT_COMP_LOW;
  400. break;
  401. case BCL_VBAT_LVL2:
  402. addr = BCL_VBAT_COMP_TLOW;
  403. break;
  404. default:
  405. return -ENODEV;
  406. }
  407. ret = bcl_read_register(bat_data->dev, addr, &val);
  408. if (ret)
  409. return ret;
  410. if (addr == BCL_VBAT_ADC_LOW) {
  411. *trip = val;
  412. convert_adc_to_vbat_thresh_val(bat_data->dev, trip);
  413. pr_debug("vbat trip: %d mV ADC:0x%02x\n", *trip, val);
  414. } else {
  415. *trip = BCL_VBAT_THRESH_BASE + val * 25;
  416. if (*trip > BCL_VBAT_MAX_MV)
  417. *trip = BCL_VBAT_MAX_MV;
  418. pr_debug("vbat-%s-low trip: %d mV ADC:0x%02x\n",
  419. (addr == BCL_VBAT_COMP_LOW) ?
  420. "too" : "critical",
  421. *trip, val);
  422. }
  423. return 0;
  424. }
  425. static int bcl_read_vbat_tz(struct thermal_zone_device *tzd, int *adc_value)
  426. {
  427. int ret = 0;
  428. unsigned int val = 0;
  429. struct bcl_peripheral_data *bat_data =
  430. (struct bcl_peripheral_data *)tzd->devdata;
  431. *adc_value = val;
  432. if (bat_data->dev->dig_major < BCL_GEN4_MAJOR_REV)
  433. ret = bcl_read_register(bat_data->dev, BCL_VBAT_READ, &val);
  434. else
  435. ret = bcl_read_multi_register(bat_data->dev, BCL_VBAT_READ,
  436. &val, 2);
  437. if (ret)
  438. return ret;
  439. *adc_value = val;
  440. if ((bat_data->dev->dig_major < BCL_GEN4_MAJOR_REV &&
  441. *adc_value == BCL_VBAT_NO_READING) ||
  442. (bat_data->dev->dig_major >= BCL_GEN4_MAJOR_REV &&
  443. *adc_value == BCL_VBAT_4G_NO_READING)) {
  444. *adc_value = bat_data->last_val;
  445. } else {
  446. if (bat_data->dev->dig_major < BCL_GEN4_MAJOR_REV)
  447. convert_adc_to_vbat_val(adc_value);
  448. else
  449. convert_adc_nu_to_mu_val(adc_value,
  450. BCL_VBAT_SCALING_REV5_NV);
  451. bat_data->last_val = *adc_value;
  452. }
  453. pr_debug("vbat:%d mv\n", bat_data->last_val);
  454. BCL_IPC(bat_data->dev, "vbat:%d mv ADC:0x%02x\n",
  455. bat_data->last_val, val);
  456. return ret;
  457. }
  458. static int bcl_read_vbat_type(struct thermal_zone_device *tzd, int trip,
  459. enum thermal_trip_type *type)
  460. {
  461. *type = THERMAL_TRIP_PASSIVE;
  462. return 0;
  463. }
  464. static struct thermal_zone_device_ops vbat_tzd_ops = {
  465. .get_temp = bcl_read_vbat_tz,
  466. .get_trip_temp = bcl_get_vbat_trip,
  467. .get_trip_type = bcl_read_vbat_type,
  468. };
  469. static struct thermal_zone_params vbat_tzp = {
  470. .governor_name = "step_wise",
  471. .no_hwmon = true,
  472. .num_tbps = 0,
  473. .tbp = NULL,
  474. .sustainable_power = 0,
  475. .k_po = 0,
  476. .k_pu = 0,
  477. .k_i = 0,
  478. .k_d = 0,
  479. .integral_cutoff = 0,
  480. .slope = 1,
  481. .offset = 0
  482. };
  483. static int bcl_get_trend(struct thermal_zone_device *tz, int trip, enum thermal_trend *trend)
  484. {
  485. struct bcl_peripheral_data *bat_data =
  486. (struct bcl_peripheral_data *)tz->devdata;
  487. mutex_lock(&bat_data->state_trans_lock);
  488. if (!bat_data->last_val)
  489. *trend = THERMAL_TREND_DROPPING;
  490. else
  491. *trend = THERMAL_TREND_RAISING;
  492. mutex_unlock(&bat_data->state_trans_lock);
  493. return 0;
  494. }
  495. static int bcl_set_lbat(struct thermal_zone_device *tz, int low, int high)
  496. {
  497. struct bcl_peripheral_data *bat_data =
  498. (struct bcl_peripheral_data *)tz->devdata;
  499. mutex_lock(&bat_data->state_trans_lock);
  500. if (high == INT_MAX &&
  501. bat_data->irq_num && bat_data->irq_enabled) {
  502. disable_irq_nosync(bat_data->irq_num);
  503. disable_irq_wake(bat_data->irq_num);
  504. bat_data->irq_enabled = false;
  505. pr_debug("lbat[%d]: disable irq:%d\n",
  506. bat_data->type,
  507. bat_data->irq_num);
  508. } else if (high != INT_MAX &&
  509. bat_data->irq_num && !bat_data->irq_enabled) {
  510. enable_irq(bat_data->irq_num);
  511. enable_irq_wake(bat_data->irq_num);
  512. bat_data->irq_enabled = true;
  513. pr_debug("lbat[%d]: enable irq:%d\n",
  514. bat_data->type,
  515. bat_data->irq_num);
  516. }
  517. mutex_unlock(&bat_data->state_trans_lock);
  518. return 0;
  519. }
  520. static int bcl_read_lbat(struct thermal_zone_device *tz, int *adc_value)
  521. {
  522. int ret = 0;
  523. int ibat = 0, vbat = 0;
  524. unsigned int val = 0;
  525. struct bcl_peripheral_data *bat_data =
  526. (struct bcl_peripheral_data *)tz->devdata;
  527. struct bcl_device *bcl_perph = bat_data->dev;
  528. *adc_value = val;
  529. ret = bcl_read_register(bcl_perph, BCL_IRQ_STATUS, &val);
  530. if (ret)
  531. goto bcl_read_exit;
  532. switch (bat_data->type) {
  533. case BCL_LVL0:
  534. *adc_value = val & BCL_IRQ_L0;
  535. break;
  536. case BCL_LVL1:
  537. *adc_value = val & BCL_IRQ_L1;
  538. break;
  539. case BCL_LVL2:
  540. *adc_value = val & BCL_IRQ_L2;
  541. break;
  542. default:
  543. pr_err("Invalid sensor type:%d\n", bat_data->type);
  544. ret = -ENODEV;
  545. goto bcl_read_exit;
  546. }
  547. bat_data->last_val = *adc_value;
  548. pr_debug("lbat:%d val:%d\n", bat_data->type,
  549. bat_data->last_val);
  550. if (bcl_perph->param[BCL_IBAT_LVL0].tz_dev)
  551. bcl_read_ibat(bcl_perph->param[BCL_IBAT_LVL0].tz_dev, &ibat);
  552. else if (bcl_perph->param[BCL_2S_IBAT_LVL0].tz_dev)
  553. bcl_read_ibat(bcl_perph->param[BCL_2S_IBAT_LVL0].tz_dev, &ibat);
  554. if (bcl_perph->param[BCL_VBAT_LVL0].tz_dev)
  555. bcl_read_vbat_tz(bcl_perph->param[BCL_VBAT_LVL0].tz_dev, &vbat);
  556. BCL_IPC(bcl_perph, "LVLbat:%d val:%d\n", bat_data->type,
  557. bat_data->last_val);
  558. bcl_read_exit:
  559. return ret;
  560. }
  561. static int panic_lvl = BCL_TYPE_MAX;
  562. module_param(panic_lvl, int, 0644);
  563. static irqreturn_t bcl_handle_irq(int irq, void *data)
  564. {
  565. struct bcl_peripheral_data *perph_data =
  566. (struct bcl_peripheral_data *)data;
  567. unsigned int irq_status = 0;
  568. int ibat = 0, vbat = 0;
  569. struct bcl_device *bcl_perph;
  570. if (!perph_data->tz_dev)
  571. return IRQ_HANDLED;
  572. bcl_perph = perph_data->dev;
  573. bcl_read_register(bcl_perph, BCL_IRQ_STATUS, &irq_status);
  574. if (bcl_perph->param[BCL_IBAT_LVL0].tz_dev)
  575. bcl_read_ibat(bcl_perph->param[BCL_IBAT_LVL0].tz_dev, &ibat);
  576. else if (bcl_perph->param[BCL_2S_IBAT_LVL0].tz_dev)
  577. bcl_read_ibat(bcl_perph->param[BCL_2S_IBAT_LVL0].tz_dev, &ibat);
  578. if (bcl_perph->param[BCL_VBAT_LVL0].tz_dev)
  579. bcl_read_vbat_tz(bcl_perph->param[BCL_VBAT_LVL0].tz_dev, &vbat);
  580. if (irq_status & perph_data->status_bit_idx) {
  581. pr_info(
  582. "Irq:%d triggered for bcl type:%s. status:%u ibat=%d vbat=%d\n",
  583. irq, bcl_int_names[perph_data->type],
  584. irq_status, ibat, vbat);
  585. /* trigger panic on given panic level */
  586. if (perph_data->type >= BCL_LVL0 && perph_data->type <= BCL_LVL2
  587. && perph_data->type == BCL_LVL0 + panic_lvl) {
  588. panic("bcl type:%s forced panic", bcl_int_names[perph_data->type]);
  589. }
  590. BCL_IPC(bcl_perph,
  591. "Irq:%d triggered for bcl type:%s. status:%u ibat=%d vbat=%d\n",
  592. irq, bcl_int_names[perph_data->type],
  593. irq_status, ibat, vbat);
  594. thermal_zone_device_update(perph_data->tz_dev,
  595. THERMAL_TRIP_VIOLATED);
  596. }
  597. return IRQ_HANDLED;
  598. }
  599. static int bcl_get_ibat_ext_range_factor(struct platform_device *pdev,
  600. uint32_t *ibat_range_factor)
  601. {
  602. int ret = 0;
  603. const char *name;
  604. struct nvmem_cell *cell;
  605. size_t len;
  606. char *buf;
  607. uint32_t ext_range_index = 0;
  608. ret = of_property_read_string(pdev->dev.of_node, "nvmem-cell-names", &name);
  609. if (ret) {
  610. *ibat_range_factor = bcl_ibat_ext_ranges[BCL_IBAT_RANGE_LVL0];
  611. pr_debug("Default ibat range factor enabled %u\n", *ibat_range_factor);
  612. return 0;
  613. }
  614. cell = nvmem_cell_get(&pdev->dev, name);
  615. if (IS_ERR(cell)) {
  616. dev_err(&pdev->dev, "failed to get nvmem cell %s\n", name);
  617. return PTR_ERR(cell);
  618. }
  619. buf = nvmem_cell_read(cell, &len);
  620. nvmem_cell_put(cell);
  621. if (IS_ERR_OR_NULL(buf)) {
  622. dev_err(&pdev->dev, "failed to read nvmem cell %s\n", name);
  623. return PTR_ERR(buf);
  624. }
  625. if (len <= 0 || len > sizeof(uint32_t)) {
  626. dev_err(&pdev->dev, "nvmem cell length out of range %d\n", len);
  627. kfree(buf);
  628. return -EINVAL;
  629. }
  630. memcpy(&ext_range_index, buf, min(len, sizeof(ext_range_index)));
  631. kfree(buf);
  632. if (ext_range_index >= BCL_IBAT_RANGE_MAX) {
  633. dev_err(&pdev->dev, "invalid BCL ibat scaling factor %d\n", ext_range_index);
  634. return -EINVAL;
  635. }
  636. *ibat_range_factor = bcl_ibat_ext_ranges[ext_range_index];
  637. pr_debug("ext_range_index %u, ibat range factor %u\n",
  638. ext_range_index, *ibat_range_factor);
  639. return 0;
  640. }
  641. static int bcl_get_devicetree_data(struct platform_device *pdev,
  642. struct bcl_device *bcl_perph)
  643. {
  644. int ret = 0;
  645. const __be32 *prop = NULL;
  646. struct device_node *dev_node = pdev->dev.of_node;
  647. prop = of_get_address(dev_node, 0, NULL, NULL);
  648. if (prop) {
  649. bcl_perph->fg_bcl_addr = be32_to_cpu(*prop);
  650. pr_debug("fg_bcl@%04x\n", bcl_perph->fg_bcl_addr);
  651. } else {
  652. dev_err(&pdev->dev, "No fg_bcl registers found\n");
  653. return -ENODEV;
  654. }
  655. bcl_perph->ibat_use_qg_adc = of_property_read_bool(dev_node,
  656. "qcom,ibat-use-qg-adc-5a");
  657. bcl_perph->no_bit_shift = of_property_read_bool(dev_node,
  658. "qcom,pmic7-threshold");
  659. bcl_perph->ibat_ccm_enabled = of_property_read_bool(dev_node,
  660. "qcom,ibat-ccm-hw-support");
  661. ret = bcl_get_ibat_ext_range_factor(pdev,
  662. &bcl_perph->ibat_ext_range_factor);
  663. return ret;
  664. }
  665. static void bcl_fetch_trip(struct platform_device *pdev, enum bcl_dev_type type,
  666. struct bcl_peripheral_data *data,
  667. irqreturn_t (*handle)(int, void *))
  668. {
  669. int ret = 0, irq_num = 0;
  670. char *int_name = bcl_int_names[type];
  671. mutex_lock(&data->state_trans_lock);
  672. data->irq_num = 0;
  673. data->irq_enabled = false;
  674. irq_num = platform_get_irq_byname(pdev, int_name);
  675. if (irq_num > 0 && handle) {
  676. ret = devm_request_threaded_irq(&pdev->dev,
  677. irq_num, NULL, handle,
  678. IRQF_TRIGGER_RISING | IRQF_ONESHOT,
  679. int_name, data);
  680. if (ret) {
  681. dev_err(&pdev->dev,
  682. "Error requesting trip irq. err:%d\n",
  683. ret);
  684. mutex_unlock(&data->state_trans_lock);
  685. return;
  686. }
  687. disable_irq_nosync(irq_num);
  688. data->irq_num = irq_num;
  689. } else if (irq_num > 0 && !handle) {
  690. disable_irq_nosync(irq_num);
  691. data->irq_num = irq_num;
  692. }
  693. mutex_unlock(&data->state_trans_lock);
  694. }
  695. static void bcl_vbat_init(struct platform_device *pdev,
  696. enum bcl_dev_type type, struct bcl_device *bcl_perph)
  697. {
  698. struct bcl_peripheral_data *vbat = &bcl_perph->param[type];
  699. unsigned int val = 0;
  700. int ret;
  701. mutex_init(&vbat->state_trans_lock);
  702. vbat->dev = bcl_perph;
  703. vbat->irq_num = 0;
  704. vbat->irq_enabled = false;
  705. vbat->tz_dev = NULL;
  706. /* If revision 4 or above && bcl support adc, then only enable vbat */
  707. if (bcl_perph->dig_major >= BCL_GEN3_MAJOR_REV) {
  708. if (!(bcl_perph->bcl_param_1 & BCL_PARAM_HAS_ADC))
  709. return;
  710. } else {
  711. ret = bcl_read_register(bcl_perph, BCL_VBAT_CONV_REQ, &val);
  712. if (ret || !val)
  713. return;
  714. }
  715. vbat->tz_dev = thermal_zone_device_register("vbat", 3, 0, vbat,
  716. &vbat_tzd_ops, &vbat_tzp, 0, 0);
  717. if (IS_ERR(vbat->tz_dev)) {
  718. pr_debug("vbat[%s] register failed. err:%ld\n",
  719. bcl_int_names[type],
  720. PTR_ERR(vbat->tz_dev));
  721. vbat->tz_dev = NULL;
  722. return;
  723. }
  724. ret = thermal_zone_device_enable(vbat->tz_dev);
  725. if (ret) {
  726. thermal_zone_device_unregister(vbat->tz_dev);
  727. vbat->tz_dev = NULL;
  728. }
  729. }
  730. static void bcl_probe_vbat(struct platform_device *pdev,
  731. struct bcl_device *bcl_perph)
  732. {
  733. bcl_vbat_init(pdev, BCL_VBAT_LVL0, bcl_perph);
  734. }
  735. static void bcl_ibat_init(struct platform_device *pdev,
  736. enum bcl_dev_type type, struct bcl_device *bcl_perph)
  737. {
  738. struct bcl_peripheral_data *ibat = &bcl_perph->param[type];
  739. mutex_init(&ibat->state_trans_lock);
  740. ibat->type = type;
  741. ibat->dev = bcl_perph;
  742. ibat->irq_num = 0;
  743. ibat->irq_enabled = false;
  744. ibat->ops.get_temp = bcl_read_ibat;
  745. ibat->ops.set_trips = bcl_set_ibat;
  746. ibat->tz_dev = devm_thermal_of_zone_register(&pdev->dev,
  747. type, ibat, &ibat->ops);
  748. if (IS_ERR(ibat->tz_dev)) {
  749. pr_debug("ibat:[%s] register failed. err:%ld\n",
  750. bcl_int_names[type],
  751. PTR_ERR(ibat->tz_dev));
  752. ibat->tz_dev = NULL;
  753. return;
  754. }
  755. thermal_zone_device_update(ibat->tz_dev, THERMAL_DEVICE_UP);
  756. }
  757. static int bcl_get_ibat_config(struct platform_device *pdev,
  758. uint32_t *ibat_config)
  759. {
  760. int ret = 0;
  761. const char *name;
  762. struct nvmem_cell *cell;
  763. size_t len;
  764. char *buf;
  765. ret = of_property_read_string(pdev->dev.of_node, "nvmem-cell-names", &name);
  766. if (ret) {
  767. *ibat_config = 0;
  768. pr_debug("Default ibat config enabled %u\n", *ibat_config);
  769. return 0;
  770. }
  771. cell = nvmem_cell_get(&pdev->dev, name);
  772. if (IS_ERR(cell)) {
  773. dev_err(&pdev->dev, "failed to get nvmem cell %s\n", name);
  774. return PTR_ERR(cell);
  775. }
  776. buf = nvmem_cell_read(cell, &len);
  777. nvmem_cell_put(cell);
  778. if (IS_ERR_OR_NULL(buf)) {
  779. dev_err(&pdev->dev, "failed to read nvmem cell %s\n", name);
  780. return PTR_ERR(buf);
  781. }
  782. if (len <= 0 || len > sizeof(uint32_t)) {
  783. dev_err(&pdev->dev, "nvmem cell length out of range %d\n", len);
  784. kfree(buf);
  785. return -EINVAL;
  786. }
  787. memcpy(ibat_config, buf, min(len, sizeof(*ibat_config)));
  788. kfree(buf);
  789. return 0;
  790. }
  791. static void bcl_probe_ibat(struct platform_device *pdev,
  792. struct bcl_device *bcl_perph)
  793. {
  794. uint32_t bcl_config = 0;
  795. bcl_get_ibat_config(pdev, &bcl_config);
  796. if (bcl_config == 1) {
  797. bcl_ibat_init(pdev, BCL_2S_IBAT_LVL0, bcl_perph);
  798. bcl_ibat_init(pdev, BCL_2S_IBAT_LVL1, bcl_perph);
  799. } else {
  800. bcl_ibat_init(pdev, BCL_IBAT_LVL0, bcl_perph);
  801. bcl_ibat_init(pdev, BCL_IBAT_LVL1, bcl_perph);
  802. }
  803. }
  804. static void bcl_lvl_init(struct platform_device *pdev,
  805. enum bcl_dev_type type, int sts_bit_idx, struct bcl_device *bcl_perph)
  806. {
  807. struct bcl_peripheral_data *lbat = &bcl_perph->param[type];
  808. mutex_init(&lbat->state_trans_lock);
  809. lbat->type = type;
  810. lbat->dev = bcl_perph;
  811. lbat->status_bit_idx = sts_bit_idx;
  812. bcl_fetch_trip(pdev, type, lbat, bcl_handle_irq);
  813. if (lbat->irq_num <= 0)
  814. return;
  815. lbat->ops.get_temp = bcl_read_lbat;
  816. lbat->ops.set_trips = bcl_set_lbat;
  817. lbat->ops.get_trend = bcl_get_trend;
  818. lbat->tz_dev = devm_thermal_of_zone_register(&pdev->dev,
  819. type, lbat, &lbat->ops);
  820. if (IS_ERR(lbat->tz_dev)) {
  821. pr_debug("lbat:[%s] register failed. err:%ld\n",
  822. bcl_int_names[type],
  823. PTR_ERR(lbat->tz_dev));
  824. lbat->tz_dev = NULL;
  825. return;
  826. }
  827. thermal_zone_device_update(lbat->tz_dev, THERMAL_DEVICE_UP);
  828. qti_update_tz_ops(lbat->tz_dev, true);
  829. }
  830. static void bcl_probe_lvls(struct platform_device *pdev,
  831. struct bcl_device *bcl_perph)
  832. {
  833. bcl_lvl_init(pdev, BCL_LVL0, BCL_IRQ_L0, bcl_perph);
  834. bcl_lvl_init(pdev, BCL_LVL1, BCL_IRQ_L1, bcl_perph);
  835. bcl_lvl_init(pdev, BCL_LVL2, BCL_IRQ_L2, bcl_perph);
  836. }
  837. static int bcl_version_init(struct bcl_device *bcl_perph)
  838. {
  839. int ret = 0;
  840. unsigned int val = 0;
  841. ret = bcl_read_register(bcl_perph, BCL_REVISION2, &val);
  842. if (ret < 0)
  843. return ret;
  844. bcl_perph->dig_major = val;
  845. ret = bcl_read_register(bcl_perph, BCL_REVISION1, &val);
  846. if (ret >= 0)
  847. bcl_perph->dig_minor = val;
  848. if (bcl_perph->dig_major >= BCL_GEN3_MAJOR_REV) {
  849. ret = bcl_read_register(bcl_perph, BCL_PARAM_1, &val);
  850. if (ret < 0)
  851. return ret;
  852. bcl_perph->bcl_param_1 = val;
  853. val = 0;
  854. bcl_read_register(bcl_perph, BCL_PARAM_2, &val);
  855. bcl_perph->bcl_type = val;
  856. } else {
  857. bcl_perph->bcl_param_1 = 0;
  858. bcl_perph->bcl_type = 0;
  859. }
  860. ret = bcl_read_register(bcl_perph, ANA_MAJOR_OFFSET, &val);
  861. if (ret < 0)
  862. return ret;
  863. bcl_perph->ana_major = val;
  864. return 0;
  865. }
  866. static void bcl_configure_bcl_peripheral(struct bcl_device *bcl_perph)
  867. {
  868. bcl_write_register(bcl_perph, BCL_MONITOR_EN, BIT(7));
  869. }
  870. static int bcl_remove(struct platform_device *pdev)
  871. {
  872. int i = 0;
  873. struct bcl_device *bcl_perph =
  874. (struct bcl_device *)dev_get_drvdata(&pdev->dev);
  875. for (; i < BCL_TYPE_MAX; i++) {
  876. if (!bcl_perph->param[i].tz_dev)
  877. continue;
  878. qti_update_tz_ops(bcl_perph->param[i].tz_dev, false);
  879. }
  880. return 0;
  881. }
  882. static int bcl_probe(struct platform_device *pdev)
  883. {
  884. struct bcl_device *bcl_perph = NULL;
  885. char bcl_name[40];
  886. int err = 0;
  887. if (bcl_device_ct >= MAX_PERPH_COUNT) {
  888. dev_err(&pdev->dev, "Max bcl peripheral supported already.\n");
  889. return -EINVAL;
  890. }
  891. bcl_devices[bcl_device_ct] = devm_kzalloc(&pdev->dev,
  892. sizeof(*bcl_devices[0]), GFP_KERNEL);
  893. if (!bcl_devices[bcl_device_ct])
  894. return -ENOMEM;
  895. bcl_perph = bcl_devices[bcl_device_ct];
  896. bcl_perph->dev = &pdev->dev;
  897. bcl_perph->regmap = dev_get_regmap(pdev->dev.parent, NULL);
  898. if (!bcl_perph->regmap) {
  899. dev_err(&pdev->dev, "Couldn't get parent's regmap\n");
  900. return -EINVAL;
  901. }
  902. bcl_device_ct++;
  903. err = bcl_get_devicetree_data(pdev, bcl_perph);
  904. if (err) {
  905. bcl_device_ct--;
  906. return err;
  907. }
  908. err = bcl_version_init(bcl_perph);
  909. if (err) {
  910. bcl_device_ct--;
  911. return err;
  912. }
  913. bcl_probe_vbat(pdev, bcl_perph);
  914. bcl_probe_ibat(pdev, bcl_perph);
  915. bcl_probe_lvls(pdev, bcl_perph);
  916. bcl_configure_bcl_peripheral(bcl_perph);
  917. dev_set_drvdata(&pdev->dev, bcl_perph);
  918. snprintf(bcl_name, sizeof(bcl_name), "bcl_0x%04x_%d",
  919. bcl_perph->fg_bcl_addr,
  920. bcl_device_ct - 1);
  921. bcl_perph->ipc_log = ipc_log_context_create(IPC_LOGPAGES,
  922. bcl_name, 0);
  923. if (!bcl_perph->ipc_log)
  924. pr_err("%s: unable to create IPC Logging for %s\n",
  925. __func__, bcl_name);
  926. return 0;
  927. }
  928. static const struct of_device_id bcl_match[] = {
  929. {
  930. .compatible = "qcom,bcl-v5",
  931. },
  932. {},
  933. };
  934. static struct platform_driver bcl_driver = {
  935. .probe = bcl_probe,
  936. .remove = bcl_remove,
  937. .driver = {
  938. .name = BCL_DRIVER_NAME,
  939. .of_match_table = bcl_match,
  940. },
  941. };
  942. module_platform_driver(bcl_driver);
  943. MODULE_LICENSE("GPL");