tps65185.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. // Copyright (C) 2025 Andreas Kemnade
  3. /* Datasheet: https://www.ti.com/lit/gpn/tps65185 */
  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 TPS65185_REG_TMST_VALUE 0
  18. #define TPS65185_REG_ENABLE 1
  19. #define TPS65185_REG_VADJ 2
  20. #define TPS65185_REG_VCOM1 3
  21. #define TPS65185_REG_VCOM2 4
  22. #define TPS65185_REG_INT_EN1 5
  23. #define TPS65185_REG_INT_EN2 6
  24. #define TPS65185_REG_INT1 7
  25. #define TPS65185_REG_INT2 8
  26. #define TPS65185_REG_TMST1 0xd
  27. #define TPS65185_REG_TMST2 0xe
  28. #define TPS65185_REG_PG 0xf
  29. #define TPS65185_REG_REVID 0x10
  30. #define TPS65185_READ_THERM BIT(7)
  31. #define TPS65185_CONV_END BIT(5)
  32. #define TPS65185_ENABLE_ACTIVE BIT(7)
  33. #define TPS65185_ENABLE_STANDBY BIT(6)
  34. #define PGOOD_TIMEOUT_MSECS 200
  35. struct tps65185_data {
  36. struct device *dev;
  37. struct regmap *regmap;
  38. struct gpio_desc *pgood_gpio;
  39. struct gpio_desc *pwrup_gpio;
  40. struct gpio_desc *vcom_ctrl_gpio;
  41. struct gpio_desc *wakeup_gpio;
  42. struct completion pgood_completion;
  43. int pgood_irq;
  44. struct completion tmst_completion;
  45. };
  46. static const struct hwmon_channel_info *tps65185_info[] = {
  47. HWMON_CHANNEL_INFO(chip, HWMON_C_REGISTER_TZ),
  48. HWMON_CHANNEL_INFO(temp, HWMON_T_INPUT),
  49. NULL
  50. };
  51. static int tps65185_hwmon_read(struct device *dev, enum hwmon_sensor_types type,
  52. u32 attr, int channel, long *temp)
  53. {
  54. struct tps65185_data *data = dev_get_drvdata(dev);
  55. unsigned int val;
  56. int ret;
  57. reinit_completion(&data->tmst_completion);
  58. /* start acquisition */
  59. regmap_update_bits(data->regmap, TPS65185_REG_TMST1,
  60. TPS65185_READ_THERM, TPS65185_READ_THERM);
  61. wait_for_completion_timeout(&data->tmst_completion,
  62. msecs_to_jiffies(PGOOD_TIMEOUT_MSECS));
  63. ret = regmap_read(data->regmap, TPS65185_REG_TMST1, &val);
  64. if (!(val & TPS65185_CONV_END))
  65. return -ETIMEDOUT;
  66. ret = regmap_read(data->regmap, TPS65185_REG_TMST_VALUE, &val);
  67. if (ret)
  68. return ret;
  69. *temp = (s8)val * 1000;
  70. return 0;
  71. }
  72. static umode_t tps65185_hwmon_is_visible(const void *data,
  73. enum hwmon_sensor_types type,
  74. u32 attr, int channel)
  75. {
  76. return 0444;
  77. }
  78. static const struct hwmon_ops tps65185_hwmon_ops = {
  79. .is_visible = tps65185_hwmon_is_visible,
  80. .read = tps65185_hwmon_read,
  81. };
  82. static const struct hwmon_chip_info tps65185_chip_info = {
  83. .ops = &tps65185_hwmon_ops,
  84. .info = tps65185_info,
  85. };
  86. static bool tps65185_volatile_reg(struct device *dev, unsigned int reg)
  87. {
  88. switch (reg) {
  89. case TPS65185_REG_TMST_VALUE:
  90. case TPS65185_REG_ENABLE:
  91. case TPS65185_REG_VCOM2:
  92. case TPS65185_REG_INT1:
  93. case TPS65185_REG_INT2:
  94. case TPS65185_REG_TMST1:
  95. return true;
  96. default:
  97. return false;
  98. }
  99. }
  100. static const struct regmap_config regmap_config = {
  101. .reg_bits = 8,
  102. .val_bits = 8,
  103. .max_register = 0x10,
  104. .cache_type = REGCACHE_MAPLE,
  105. .volatile_reg = tps65185_volatile_reg,
  106. };
  107. static const struct regulator_ops tps65185_v3p3ops = {
  108. .list_voltage = regulator_list_voltage_linear,
  109. .enable = regulator_enable_regmap,
  110. .disable = regulator_disable_regmap,
  111. .is_enabled = regulator_is_enabled_regmap,
  112. };
  113. static int tps65185_check_powergood(struct regulator_dev *rdev)
  114. {
  115. struct tps65185_data *data = rdev_get_drvdata(rdev);
  116. return gpiod_get_value_cansleep(data->pgood_gpio);
  117. }
  118. static int tps65185_vposneg_get_voltage_sel(struct regulator_dev *rdev)
  119. {
  120. int ret;
  121. ret = regulator_get_voltage_sel_regmap(rdev);
  122. if (ret < 0)
  123. return ret;
  124. /* highest value is lowest voltage */
  125. return 6 - ret;
  126. }
  127. static int tps65185_vposneg_set_voltage_sel(struct regulator_dev *rdev, unsigned int selector)
  128. {
  129. return regulator_set_voltage_sel_regmap(rdev, 6 - selector);
  130. }
  131. static irqreturn_t pgood_handler(int irq, void *dev_id)
  132. {
  133. struct tps65185_data *data = dev_id;
  134. complete(&data->pgood_completion);
  135. return IRQ_HANDLED;
  136. }
  137. static int tps65185_vposneg_enable(struct regulator_dev *rdev)
  138. {
  139. struct tps65185_data *data = rdev_get_drvdata(rdev);
  140. int ret;
  141. reinit_completion(&data->pgood_completion);
  142. if (data->pwrup_gpio)
  143. ret = gpiod_set_value_cansleep(data->pwrup_gpio, 1);
  144. else
  145. ret = regmap_update_bits(data->regmap, TPS65185_REG_ENABLE,
  146. TPS65185_ENABLE_ACTIVE,
  147. TPS65185_ENABLE_ACTIVE);
  148. if (ret)
  149. return ret;
  150. dev_dbg(data->dev, "turning on...");
  151. wait_for_completion_timeout(&data->pgood_completion,
  152. msecs_to_jiffies(PGOOD_TIMEOUT_MSECS));
  153. dev_dbg(data->dev, "turned on");
  154. if (gpiod_get_value_cansleep(data->pgood_gpio) != 1)
  155. return -ETIMEDOUT;
  156. return 0;
  157. }
  158. static int tps65185_vposneg_disable(struct regulator_dev *rdev)
  159. {
  160. struct tps65185_data *data = rdev_get_drvdata(rdev);
  161. int ret;
  162. if (data->pwrup_gpio)
  163. ret = gpiod_set_value_cansleep(data->pwrup_gpio, 0);
  164. else
  165. ret = regmap_update_bits(data->regmap, TPS65185_REG_ENABLE,
  166. TPS65185_ENABLE_STANDBY,
  167. TPS65185_ENABLE_STANDBY);
  168. return ret;
  169. }
  170. static int tps65185_vcom_set_voltage_sel(struct regulator_dev *rdev, unsigned int selector)
  171. {
  172. struct tps65185_data *data = rdev_get_drvdata(rdev);
  173. int ret;
  174. ret = regmap_update_bits(data->regmap, TPS65185_REG_VCOM2, BIT(0), selector >> 8);
  175. if (ret < 0)
  176. return ret;
  177. return regmap_write(data->regmap, TPS65185_REG_VCOM1, selector & 0xFF);
  178. }
  179. static int tps65185_vcom_get_voltage_sel(struct regulator_dev *rdev)
  180. {
  181. struct tps65185_data *data = rdev_get_drvdata(rdev);
  182. int ret;
  183. unsigned int sel, sel2;
  184. ret = regmap_read(data->regmap, TPS65185_REG_VCOM1, &sel);
  185. if (ret < 0)
  186. return ret;
  187. ret = regmap_read(data->regmap, TPS65185_REG_VCOM2, &sel2);
  188. if (ret < 0)
  189. return ret;
  190. if (sel2 & BIT(0))
  191. sel |= 0x100;
  192. return sel;
  193. }
  194. static const struct regulator_ops tps65185_vcom_ops = {
  195. .list_voltage = regulator_list_voltage_linear,
  196. .map_voltage = regulator_map_voltage_linear,
  197. .set_voltage_sel = tps65185_vcom_set_voltage_sel,
  198. .get_voltage_sel = tps65185_vcom_get_voltage_sel,
  199. };
  200. static const struct regulator_ops tps65185_vposneg_ops = {
  201. .list_voltage = regulator_list_voltage_linear,
  202. .map_voltage = regulator_map_voltage_linear,
  203. .enable = tps65185_vposneg_enable,
  204. .disable = tps65185_vposneg_disable,
  205. .is_enabled = tps65185_check_powergood,
  206. .set_voltage_sel = tps65185_vposneg_set_voltage_sel,
  207. .get_voltage_sel = tps65185_vposneg_get_voltage_sel,
  208. };
  209. static const struct regulator_desc regulators[] = {
  210. {
  211. .name = "v3p3",
  212. .of_match = of_match_ptr("v3p3"),
  213. .regulators_node = of_match_ptr("regulators"),
  214. .id = 0,
  215. .ops = &tps65185_v3p3ops,
  216. .type = REGULATOR_VOLTAGE,
  217. .owner = THIS_MODULE,
  218. .enable_reg = TPS65185_REG_ENABLE,
  219. .enable_mask = BIT(5),
  220. .n_voltages = 1,
  221. .min_uV = 3300000,
  222. },
  223. {
  224. .name = "vposneg",
  225. .of_match = of_match_ptr("vposneg"),
  226. .regulators_node = of_match_ptr("regulators"),
  227. .id = 1,
  228. .ops = &tps65185_vposneg_ops,
  229. .type = REGULATOR_VOLTAGE,
  230. .owner = THIS_MODULE,
  231. .n_voltages = 4,
  232. .vsel_reg = TPS65185_REG_VADJ,
  233. .vsel_mask = 0x7,
  234. .min_uV = 14250000,
  235. .uV_step = 250000,
  236. }
  237. };
  238. static const struct regulator_desc vcom_regulator_desc = {
  239. .name = "vcom",
  240. .of_match = of_match_ptr("vcom"),
  241. .regulators_node = of_match_ptr("regulators"),
  242. .supply_name = "vposneg",
  243. .id = 2,
  244. .ops = &tps65185_vcom_ops,
  245. .type = REGULATOR_VOLTAGE,
  246. .owner = THIS_MODULE,
  247. .n_voltages = 511,
  248. .min_uV = 0,
  249. .uV_step = 10000,
  250. };
  251. static irqreturn_t tps65185_irq_thread(int irq, void *dev_id)
  252. {
  253. struct tps65185_data *data = dev_id;
  254. unsigned int int_status_1, int_status_2;
  255. int ret;
  256. /* read both status to have irq cleared */
  257. ret = regmap_read(data->regmap, TPS65185_REG_INT1, &int_status_1);
  258. if (ret)
  259. return IRQ_NONE;
  260. ret = regmap_read(data->regmap, TPS65185_REG_INT2, &int_status_2);
  261. if (ret)
  262. return IRQ_NONE;
  263. if (int_status_2 & BIT(0))
  264. complete(&data->tmst_completion);
  265. dev_dbg(data->dev, "irq status %02x %02x\n", int_status_1, int_status_2);
  266. if (int_status_1 || int_status_2)
  267. return IRQ_HANDLED;
  268. return IRQ_NONE;
  269. }
  270. static int tps65185_probe(struct i2c_client *client)
  271. {
  272. struct tps65185_data *data;
  273. struct regulator_config config = { };
  274. struct regulator_dev *rdev;
  275. int ret = 0;
  276. int i;
  277. data = devm_kzalloc(&client->dev, sizeof(*data), GFP_KERNEL);
  278. if (!data)
  279. return -ENOMEM;
  280. data->regmap = devm_regmap_init_i2c(client, &regmap_config);
  281. if (IS_ERR(data->regmap))
  282. return dev_err_probe(&client->dev, PTR_ERR(data->regmap),
  283. "failed to allocate regmap!\n");
  284. data->pgood_gpio = devm_gpiod_get(&client->dev, "pwr-good", GPIOD_IN);
  285. if (IS_ERR(data->pgood_gpio))
  286. return dev_err_probe(&client->dev,
  287. PTR_ERR(data->pgood_gpio),
  288. "failed to get power good gpio\n");
  289. data->pgood_irq = gpiod_to_irq(data->pgood_gpio);
  290. if (data->pgood_irq < 0)
  291. return data->pgood_irq;
  292. data->pwrup_gpio = devm_gpiod_get_optional(&client->dev, "enable", GPIOD_OUT_LOW);
  293. if (IS_ERR(data->pwrup_gpio))
  294. return dev_err_probe(&client->dev, PTR_ERR(data->pwrup_gpio),
  295. "failed to get pwrup gpio\n");
  296. data->wakeup_gpio = devm_gpiod_get_optional(&client->dev, "wakeup", GPIOD_OUT_HIGH);
  297. if (IS_ERR(data->wakeup_gpio))
  298. return dev_err_probe(&client->dev,
  299. PTR_ERR(data->wakeup_gpio),
  300. "failed to get wakeup gpio\n");
  301. data->vcom_ctrl_gpio = devm_gpiod_get_optional(&client->dev, "vcom-ctrl", GPIOD_OUT_LOW);
  302. if (IS_ERR(data->vcom_ctrl_gpio))
  303. return dev_err_probe(&client->dev,
  304. PTR_ERR(data->vcom_ctrl_gpio),
  305. "failed to get vcm ctrl gpio\n");
  306. ret = devm_regulator_get_enable(&client->dev, "vin");
  307. if (ret)
  308. return dev_err_probe(&client->dev, ret,
  309. "failed to get vin regulator\n");
  310. data->dev = &client->dev;
  311. i2c_set_clientdata(client, data);
  312. init_completion(&data->pgood_completion);
  313. init_completion(&data->tmst_completion);
  314. ret = devm_request_threaded_irq(&client->dev, data->pgood_irq, NULL,
  315. pgood_handler,
  316. IRQF_TRIGGER_RISING | IRQF_ONESHOT,
  317. "PGOOD", data);
  318. if (ret)
  319. return dev_err_probe(&client->dev, ret,
  320. "failed to request power good irq\n");
  321. if (client->irq) {
  322. ret = devm_request_threaded_irq(&client->dev, client->irq,
  323. NULL, tps65185_irq_thread,
  324. IRQF_TRIGGER_LOW | IRQF_ONESHOT,
  325. "tps65185", data);
  326. if (ret)
  327. return dev_err_probe(&client->dev, ret,
  328. "failed to request irq\n");
  329. }
  330. ret = regmap_update_bits(data->regmap, TPS65185_REG_INT_EN2, BIT(0), BIT(0));
  331. if (ret)
  332. return dev_err_probe(&client->dev, ret,
  333. "failed to enable temp irq\n");
  334. config.driver_data = data;
  335. config.dev = &client->dev;
  336. config.regmap = data->regmap;
  337. for (i = 0; i < ARRAY_SIZE(regulators); i++) {
  338. rdev = devm_regulator_register(&client->dev, &regulators[i],
  339. &config);
  340. if (IS_ERR(rdev))
  341. return dev_err_probe(&client->dev, PTR_ERR(rdev),
  342. "failed to register %s regulator\n",
  343. regulators[i].name);
  344. }
  345. config.ena_gpiod = data->vcom_ctrl_gpio;
  346. rdev = devm_regulator_register(&client->dev, &vcom_regulator_desc, &config);
  347. if (IS_ERR(rdev))
  348. return dev_err_probe(&client->dev, PTR_ERR(rdev),
  349. "failed to register vcom regulator\n");
  350. if (IS_REACHABLE(CONFIG_HWMON)) {
  351. struct device *hwmon_dev;
  352. hwmon_dev = devm_hwmon_device_register_with_info(&client->dev, "tps65185", data,
  353. &tps65185_chip_info, NULL);
  354. if (IS_ERR(hwmon_dev))
  355. dev_notice(&client->dev, "failed to register hwmon\n");
  356. }
  357. return 0;
  358. }
  359. static const struct of_device_id tps65185_dt_ids[] = {
  360. {
  361. .compatible = "ti,tps65185",
  362. }, {
  363. /* sentinel */
  364. }
  365. };
  366. MODULE_DEVICE_TABLE(of, tps65185_dt_ids);
  367. static struct i2c_driver tps65185_i2c_driver = {
  368. .driver = {
  369. .name = "tps65185",
  370. .of_match_table = tps65185_dt_ids,
  371. },
  372. .probe = tps65185_probe,
  373. };
  374. module_i2c_driver(tps65185_i2c_driver);
  375. /* Module information */
  376. MODULE_DESCRIPTION("TPS65185 regulator driver");
  377. MODULE_LICENSE("GPL");