fp9931.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. // Copyright (C) 2025 Andreas Kemnade
  3. /* Datasheet: https://www.fitipower.com/dl/file/flXa6hIchVeu0W3K */
  4. #include <linux/cleanup.h>
  5. #include <linux/completion.h>
  6. #include <linux/gpio/consumer.h>
  7. #include <linux/i2c.h>
  8. #include <linux/module.h>
  9. #include <linux/mutex.h>
  10. #include <linux/hwmon.h>
  11. #include <linux/pm_runtime.h>
  12. #include <linux/property.h>
  13. #include <linux/regulator/consumer.h>
  14. #include <linux/regulator/driver.h>
  15. #include <linux/regulator/machine.h>
  16. #include <linux/regmap.h>
  17. #define FP9931_REG_TMST_VALUE 0
  18. #define FP9931_REG_VCOM_SETTING 1
  19. #define FP9931_REG_VPOSNEG_SETTING 2
  20. #define FP9931_REG_PWRON_DELAY 3
  21. #define FP9931_REG_CONTROL_REG1 11
  22. #define PGOOD_TIMEOUT_MSECS 200
  23. struct fp9931_data {
  24. struct device *dev;
  25. struct regmap *regmap;
  26. struct regulator *vin_reg;
  27. struct gpio_desc *pgood_gpio;
  28. struct gpio_desc *en_gpio;
  29. struct gpio_desc *en_ts_gpio;
  30. struct completion pgood_completion;
  31. int pgood_irq;
  32. };
  33. static const unsigned int VPOSNEG_table[] = {
  34. 7040000,
  35. 7040000,
  36. 7040000,
  37. 7040000,
  38. 7040000,
  39. 7040000,
  40. 7260000,
  41. 7490000,
  42. 7710000,
  43. 7930000,
  44. 8150000,
  45. 8380000,
  46. 8600000,
  47. 8820000,
  48. 9040000,
  49. 9270000,
  50. 9490000,
  51. 9710000,
  52. 9940000,
  53. 10160000,
  54. 10380000,
  55. 10600000,
  56. 10830000,
  57. 11050000,
  58. 11270000,
  59. 11490000,
  60. 11720000,
  61. 11940000,
  62. 12160000,
  63. 12380000,
  64. 12610000,
  65. 12830000,
  66. 13050000,
  67. 13280000,
  68. 13500000,
  69. 13720000,
  70. 13940000,
  71. 14170000,
  72. 14390000,
  73. 14610000,
  74. 14830000,
  75. 15060000,
  76. };
  77. static const struct hwmon_channel_info *fp9931_info[] = {
  78. HWMON_CHANNEL_INFO(chip, HWMON_C_REGISTER_TZ),
  79. HWMON_CHANNEL_INFO(temp, HWMON_T_INPUT),
  80. NULL
  81. };
  82. static int setup_timings(struct fp9931_data *data)
  83. {
  84. u32 tdly[4];
  85. u8 tdlys = 0;
  86. int i;
  87. int ret;
  88. ret = device_property_count_u32(data->dev, "fitipower,tdly-ms");
  89. if (ret == -EINVAL) /* property is optional */
  90. return 0;
  91. if (ret < 0)
  92. return ret;
  93. if (ret != ARRAY_SIZE(tdly)) {
  94. dev_err(data->dev, "invalid delay specification");
  95. return -EINVAL;
  96. }
  97. ret = device_property_read_u32_array(data->dev, "fitipower,tdly-ms",
  98. tdly, ARRAY_SIZE(tdly));
  99. if (ret)
  100. return ret;
  101. for (i = ARRAY_SIZE(tdly) - 1; i >= 0; i--) {
  102. if (tdly[i] > 4 || tdly[i] == 3)
  103. return -EINVAL;
  104. if (tdly[i] == 4) /* convert from ms */
  105. tdly[i] = 3;
  106. tdlys <<= 2;
  107. tdlys |= tdly[i];
  108. }
  109. ret = pm_runtime_resume_and_get(data->dev);
  110. if (ret < 0)
  111. return ret;
  112. ret = regmap_write(data->regmap, FP9931_REG_PWRON_DELAY, tdlys);
  113. pm_runtime_put_autosuspend(data->dev);
  114. return ret;
  115. }
  116. static int fp9931_hwmon_read(struct device *dev, enum hwmon_sensor_types type,
  117. u32 attr, int channel, long *temp)
  118. {
  119. struct fp9931_data *data = dev_get_drvdata(dev);
  120. unsigned int val;
  121. int ret;
  122. ret = pm_runtime_resume_and_get(data->dev);
  123. if (ret < 0)
  124. return ret;
  125. ret = regmap_read(data->regmap, FP9931_REG_TMST_VALUE, &val);
  126. if (!ret)
  127. *temp = (s8)val * 1000;
  128. pm_runtime_put_autosuspend(data->dev);
  129. return ret;
  130. }
  131. static umode_t fp9931_hwmon_is_visible(const void *data,
  132. enum hwmon_sensor_types type,
  133. u32 attr, int channel)
  134. {
  135. return 0444;
  136. }
  137. static const struct hwmon_ops fp9931_hwmon_ops = {
  138. .is_visible = fp9931_hwmon_is_visible,
  139. .read = fp9931_hwmon_read,
  140. };
  141. static const struct hwmon_chip_info fp9931_chip_info = {
  142. .ops = &fp9931_hwmon_ops,
  143. .info = fp9931_info,
  144. };
  145. static int fp9931_runtime_suspend(struct device *dev)
  146. {
  147. int ret = 0;
  148. struct fp9931_data *data = dev_get_drvdata(dev);
  149. if (data->en_ts_gpio)
  150. gpiod_set_value_cansleep(data->en_ts_gpio, 0);
  151. if (data->vin_reg) {
  152. ret = regulator_disable(data->vin_reg);
  153. regcache_mark_dirty(data->regmap);
  154. }
  155. return ret;
  156. }
  157. static int fp9931_runtime_resume(struct device *dev)
  158. {
  159. int ret = 0;
  160. struct fp9931_data *data = dev_get_drvdata(dev);
  161. if (data->vin_reg)
  162. ret = regulator_enable(data->vin_reg);
  163. if (ret)
  164. return ret;
  165. if (data->en_ts_gpio) {
  166. gpiod_set_value_cansleep(data->en_ts_gpio, 1);
  167. /* wait for one ADC conversion to have sane temperature */
  168. usleep_range(10000, 15000);
  169. }
  170. ret = regcache_sync(data->regmap);
  171. return ret;
  172. }
  173. static bool fp9931_volatile_reg(struct device *dev, unsigned int reg)
  174. {
  175. return reg == FP9931_REG_TMST_VALUE;
  176. }
  177. static const struct reg_default fp9931_reg_default = {
  178. .reg = FP9931_REG_VCOM_SETTING,
  179. .def = 0x80,
  180. };
  181. static const struct regmap_config regmap_config = {
  182. .reg_bits = 8,
  183. .val_bits = 8,
  184. .max_register = 12,
  185. .cache_type = REGCACHE_FLAT,
  186. .volatile_reg = fp9931_volatile_reg,
  187. .reg_defaults = &fp9931_reg_default,
  188. .num_reg_defaults = 1,
  189. };
  190. static void disable_nopm(void *d)
  191. {
  192. struct fp9931_data *data = d;
  193. fp9931_runtime_suspend(data->dev);
  194. }
  195. static int fp9931_v3p3_enable(struct regulator_dev *rdev)
  196. {
  197. struct fp9931_data *data = rdev_get_drvdata(rdev);
  198. int ret;
  199. ret = pm_runtime_resume_and_get(data->dev);
  200. if (ret < 0)
  201. return ret;
  202. ret = regulator_enable_regmap(rdev);
  203. if (ret < 0)
  204. pm_runtime_put_autosuspend(data->dev);
  205. return ret;
  206. }
  207. static int fp9931_v3p3_disable(struct regulator_dev *rdev)
  208. {
  209. struct fp9931_data *data = rdev_get_drvdata(rdev);
  210. int ret;
  211. ret = regulator_disable_regmap(rdev);
  212. pm_runtime_put_autosuspend(data->dev);
  213. return ret;
  214. }
  215. static int fp9931_v3p3_is_enabled(struct regulator_dev *rdev)
  216. {
  217. struct fp9931_data *data = rdev_get_drvdata(rdev);
  218. int ret;
  219. if (pm_runtime_status_suspended(data->dev))
  220. return 0;
  221. ret = pm_runtime_resume_and_get(data->dev);
  222. if (ret < 0)
  223. return 0;
  224. ret = regulator_is_enabled_regmap(rdev);
  225. pm_runtime_put_autosuspend(data->dev);
  226. return ret;
  227. }
  228. static const struct regulator_ops fp9931_v3p3ops = {
  229. .list_voltage = regulator_list_voltage_linear,
  230. .enable = fp9931_v3p3_enable,
  231. .disable = fp9931_v3p3_disable,
  232. .is_enabled = fp9931_v3p3_is_enabled,
  233. };
  234. static int fp9931_check_powergood(struct regulator_dev *rdev)
  235. {
  236. struct fp9931_data *data = rdev_get_drvdata(rdev);
  237. if (pm_runtime_status_suspended(data->dev))
  238. return 0;
  239. return gpiod_get_value_cansleep(data->pgood_gpio);
  240. }
  241. static int fp9931_get_voltage_sel(struct regulator_dev *rdev)
  242. {
  243. struct fp9931_data *data = rdev_get_drvdata(rdev);
  244. int ret;
  245. ret = pm_runtime_resume_and_get(data->dev);
  246. if (ret < 0)
  247. return ret;
  248. ret = regulator_get_voltage_sel_regmap(rdev);
  249. pm_runtime_put_autosuspend(data->dev);
  250. return ret;
  251. }
  252. static int fp9931_set_voltage_sel(struct regulator_dev *rdev, unsigned int selector)
  253. {
  254. struct fp9931_data *data = rdev_get_drvdata(rdev);
  255. int ret;
  256. ret = pm_runtime_resume_and_get(data->dev);
  257. if (ret < 0)
  258. return ret;
  259. ret = regulator_set_voltage_sel_regmap(rdev, selector);
  260. pm_runtime_put_autosuspend(data->dev);
  261. return ret;
  262. }
  263. static irqreturn_t pgood_handler(int irq, void *dev_id)
  264. {
  265. struct fp9931_data *data = dev_id;
  266. complete(&data->pgood_completion);
  267. return IRQ_HANDLED;
  268. }
  269. static int fp9931_set_enable(struct regulator_dev *rdev)
  270. {
  271. struct fp9931_data *data = rdev_get_drvdata(rdev);
  272. int ret;
  273. ret = pm_runtime_resume_and_get(data->dev);
  274. if (ret < 0)
  275. return ret;
  276. reinit_completion(&data->pgood_completion);
  277. gpiod_set_value_cansleep(data->en_gpio, 1);
  278. dev_dbg(data->dev, "turning on...");
  279. wait_for_completion_timeout(&data->pgood_completion,
  280. msecs_to_jiffies(PGOOD_TIMEOUT_MSECS));
  281. dev_dbg(data->dev, "turned on");
  282. if (gpiod_get_value_cansleep(data->pgood_gpio) != 1) {
  283. pm_runtime_put_autosuspend(data->dev);
  284. return -ETIMEDOUT;
  285. }
  286. return 0;
  287. }
  288. static int fp9931_clear_enable(struct regulator_dev *rdev)
  289. {
  290. struct fp9931_data *data = rdev_get_drvdata(rdev);
  291. gpiod_set_value_cansleep(data->en_gpio, 0);
  292. pm_runtime_put_autosuspend(data->dev);
  293. return 0;
  294. }
  295. static const struct regulator_ops fp9931_vcom_ops = {
  296. .list_voltage = regulator_list_voltage_linear,
  297. .map_voltage = regulator_map_voltage_linear,
  298. .enable = fp9931_set_enable,
  299. .disable = fp9931_clear_enable,
  300. .is_enabled = fp9931_check_powergood,
  301. .set_voltage_sel = fp9931_set_voltage_sel,
  302. .get_voltage_sel = fp9931_get_voltage_sel,
  303. };
  304. static const struct regulator_ops fp9931_vposneg_ops = {
  305. .list_voltage = regulator_list_voltage_table,
  306. .map_voltage = regulator_map_voltage_ascend,
  307. /* gets enabled by enabling vcom, too */
  308. .is_enabled = fp9931_check_powergood,
  309. .set_voltage_sel = fp9931_set_voltage_sel,
  310. .get_voltage_sel = fp9931_get_voltage_sel,
  311. };
  312. static const struct regulator_desc regulators[] = {
  313. {
  314. .name = "v3p3",
  315. .of_match = of_match_ptr("v3p3"),
  316. .regulators_node = of_match_ptr("regulators"),
  317. .id = 0,
  318. .ops = &fp9931_v3p3ops,
  319. .type = REGULATOR_VOLTAGE,
  320. .owner = THIS_MODULE,
  321. .enable_reg = FP9931_REG_CONTROL_REG1,
  322. .enable_mask = BIT(1),
  323. .n_voltages = 1,
  324. .min_uV = 3300000
  325. },
  326. {
  327. .name = "vposneg",
  328. .of_match = of_match_ptr("vposneg"),
  329. .regulators_node = of_match_ptr("regulators"),
  330. .id = 1,
  331. .ops = &fp9931_vposneg_ops,
  332. .type = REGULATOR_VOLTAGE,
  333. .owner = THIS_MODULE,
  334. .n_voltages = ARRAY_SIZE(VPOSNEG_table),
  335. .vsel_reg = FP9931_REG_VPOSNEG_SETTING,
  336. .vsel_mask = 0x3F,
  337. .volt_table = VPOSNEG_table,
  338. },
  339. {
  340. .name = "vcom",
  341. .of_match = of_match_ptr("vcom"),
  342. .regulators_node = of_match_ptr("regulators"),
  343. .id = 2,
  344. .ops = &fp9931_vcom_ops,
  345. .type = REGULATOR_VOLTAGE,
  346. .owner = THIS_MODULE,
  347. .n_voltages = 255,
  348. .min_uV = 0,
  349. .uV_step = 5000000 / 255,
  350. .vsel_reg = FP9931_REG_VCOM_SETTING,
  351. .vsel_mask = 0xFF
  352. },
  353. };
  354. static int fp9931_probe(struct i2c_client *client)
  355. {
  356. struct fp9931_data *data;
  357. struct regulator_config config = { };
  358. struct regulator_dev *rdev;
  359. int ret = 0;
  360. int i;
  361. data = devm_kzalloc(&client->dev, sizeof(*data), GFP_KERNEL);
  362. if (!data)
  363. return -ENOMEM;
  364. data->regmap = devm_regmap_init_i2c(client, &regmap_config);
  365. if (IS_ERR(data->regmap))
  366. return dev_err_probe(&client->dev, PTR_ERR(data->regmap),
  367. "failed to allocate regmap!\n");
  368. data->vin_reg = devm_regulator_get_optional(&client->dev, "vin");
  369. if (IS_ERR(data->vin_reg))
  370. return dev_err_probe(&client->dev, PTR_ERR(data->vin_reg),
  371. "failed to get vin regulator\n");
  372. data->pgood_gpio = devm_gpiod_get(&client->dev, "pg", GPIOD_IN);
  373. if (IS_ERR(data->pgood_gpio))
  374. return dev_err_probe(&client->dev,
  375. PTR_ERR(data->pgood_gpio),
  376. "failed to get power good gpio\n");
  377. data->pgood_irq = gpiod_to_irq(data->pgood_gpio);
  378. if (data->pgood_irq < 0)
  379. return data->pgood_irq;
  380. data->en_gpio = devm_gpiod_get(&client->dev, "enable", GPIOD_OUT_LOW);
  381. if (IS_ERR(data->en_gpio))
  382. return dev_err_probe(&client->dev, PTR_ERR(data->en_gpio),
  383. "failed to get en gpio\n");
  384. data->en_ts_gpio = devm_gpiod_get_optional(&client->dev, "en-ts", GPIOD_OUT_LOW);
  385. if (IS_ERR(data->en_ts_gpio))
  386. return dev_err_probe(&client->dev,
  387. PTR_ERR(data->en_ts_gpio),
  388. "failed to get en gpio\n");
  389. data->dev = &client->dev;
  390. i2c_set_clientdata(client, data);
  391. init_completion(&data->pgood_completion);
  392. ret = devm_request_threaded_irq(&client->dev, data->pgood_irq, NULL,
  393. pgood_handler,
  394. IRQF_TRIGGER_RISING | IRQF_ONESHOT,
  395. "PGOOD", data);
  396. if (ret)
  397. return dev_err_probe(&client->dev, ret,
  398. "failed to request irq\n");
  399. if (IS_ENABLED(CONFIG_PM)) {
  400. devm_pm_runtime_enable(&client->dev);
  401. pm_runtime_set_autosuspend_delay(&client->dev, 4000);
  402. pm_runtime_use_autosuspend(&client->dev);
  403. } else {
  404. ret = fp9931_runtime_resume(&client->dev);
  405. if (ret < 0)
  406. return ret;
  407. devm_add_action_or_reset(&client->dev, disable_nopm, data);
  408. }
  409. ret = setup_timings(data);
  410. if (ret)
  411. return dev_err_probe(&client->dev, ret, "failed to setup timings\n");
  412. config.driver_data = data;
  413. config.dev = &client->dev;
  414. config.regmap = data->regmap;
  415. for (i = 0; i < ARRAY_SIZE(regulators); i++) {
  416. rdev = devm_regulator_register(&client->dev, &regulators[i],
  417. &config);
  418. if (IS_ERR(rdev))
  419. return dev_err_probe(&client->dev, PTR_ERR(rdev),
  420. "failed to register %s regulator\n",
  421. regulators[i].name);
  422. }
  423. if (IS_REACHABLE(CONFIG_HWMON)) {
  424. struct device *hwmon_dev;
  425. hwmon_dev = devm_hwmon_device_register_with_info(&client->dev, "fp9931", data,
  426. &fp9931_chip_info, NULL);
  427. if (IS_ERR(hwmon_dev))
  428. dev_notice(&client->dev, "failed to register hwmon\n");
  429. }
  430. return 0;
  431. }
  432. static const struct dev_pm_ops fp9931_pm_ops = {
  433. SET_RUNTIME_PM_OPS(fp9931_runtime_suspend, fp9931_runtime_resume, NULL)
  434. };
  435. static const struct of_device_id fp9931_dt_ids[] = {
  436. {
  437. .compatible = "fitipower,fp9931",
  438. }, {
  439. /* sentinel */
  440. }
  441. };
  442. MODULE_DEVICE_TABLE(of, fp9931_dt_ids);
  443. static struct i2c_driver fp9931_i2c_driver = {
  444. .driver = {
  445. .name = "fp9931",
  446. .of_match_table = fp9931_dt_ids,
  447. .pm = &fp9931_pm_ops,
  448. },
  449. .probe = fp9931_probe,
  450. };
  451. module_i2c_driver(fp9931_i2c_driver);
  452. /* Module information */
  453. MODULE_DESCRIPTION("FP9931 regulator driver");
  454. MODULE_LICENSE("GPL");