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, ®map_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, ®ulators[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