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