Blame view

drivers/regulator/ltc3589.c 12.5 KB
b2745697b   Axel Lin   regulator: ltc358...
1
2
3
4
5
  // SPDX-License-Identifier: GPL-2.0
  //
  // Linear Technology LTC3589,LTC3589-1 regulator support
  //
  // Copyright (c) 2014 Philipp Zabel <p.zabel@pengutronix.de>, Pengutronix
3eb2c7ecb   Philipp Zabel   regulator: Add LT...
6
7
8
9
10
11
  #include <linux/i2c.h>
  #include <linux/init.h>
  #include <linux/interrupt.h>
  #include <linux/module.h>
  #include <linux/kernel.h>
  #include <linux/of.h>
45a861724   Javier Martinez Canillas   regulator: ltc358...
12
  #include <linux/of_device.h>
3eb2c7ecb   Philipp Zabel   regulator: Add LT...
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
  #include <linux/regmap.h>
  #include <linux/regulator/driver.h>
  #include <linux/regulator/of_regulator.h>
  
  #define DRIVER_NAME		"ltc3589"
  
  #define LTC3589_IRQSTAT		0x02
  #define LTC3589_SCR1		0x07
  #define LTC3589_OVEN		0x10
  #define LTC3589_SCR2		0x12
  #define LTC3589_PGSTAT		0x13
  #define LTC3589_VCCR		0x20
  #define LTC3589_CLIRQ		0x21
  #define LTC3589_B1DTV1		0x23
  #define LTC3589_B1DTV2		0x24
  #define LTC3589_VRRCR		0x25
  #define LTC3589_B2DTV1		0x26
  #define LTC3589_B2DTV2		0x27
  #define LTC3589_B3DTV1		0x29
  #define LTC3589_B3DTV2		0x2a
  #define LTC3589_L2DTV1		0x32
  #define LTC3589_L2DTV2		0x33
  
  #define LTC3589_IRQSTAT_PGOOD_TIMEOUT	BIT(3)
  #define LTC3589_IRQSTAT_UNDERVOLT_WARN	BIT(4)
  #define LTC3589_IRQSTAT_UNDERVOLT_FAULT	BIT(5)
  #define LTC3589_IRQSTAT_THERMAL_WARN	BIT(6)
  #define LTC3589_IRQSTAT_THERMAL_FAULT	BIT(7)
  
  #define LTC3589_OVEN_SW1		BIT(0)
  #define LTC3589_OVEN_SW2		BIT(1)
  #define LTC3589_OVEN_SW3		BIT(2)
  #define LTC3589_OVEN_BB_OUT		BIT(3)
  #define LTC3589_OVEN_LDO2		BIT(4)
  #define LTC3589_OVEN_LDO3		BIT(5)
  #define LTC3589_OVEN_LDO4		BIT(6)
  #define LTC3589_OVEN_SW_CTRL		BIT(7)
  
  #define LTC3589_VCCR_SW1_GO		BIT(0)
  #define LTC3589_VCCR_SW2_GO		BIT(2)
  #define LTC3589_VCCR_SW3_GO		BIT(4)
  #define LTC3589_VCCR_LDO2_GO		BIT(6)
  
  enum ltc3589_variant {
  	LTC3589,
  	LTC3589_1,
  	LTC3589_2,
  };
  
  enum ltc3589_reg {
  	LTC3589_SW1,
  	LTC3589_SW2,
  	LTC3589_SW3,
  	LTC3589_BB_OUT,
  	LTC3589_LDO1,
  	LTC3589_LDO2,
  	LTC3589_LDO3,
  	LTC3589_LDO4,
  	LTC3589_NUM_REGULATORS,
  };
3eb2c7ecb   Philipp Zabel   regulator: Add LT...
73
74
75
76
  struct ltc3589 {
  	struct regmap *regmap;
  	struct device *dev;
  	enum ltc3589_variant variant;
63c7c2962   Axel Lin   regulator: ltc358...
77
  	struct regulator_desc regulator_descs[LTC3589_NUM_REGULATORS];
3eb2c7ecb   Philipp Zabel   regulator: Add LT...
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
  	struct regulator_dev *regulators[LTC3589_NUM_REGULATORS];
  };
  
  static const int ltc3589_ldo4[] = {
  	2800000, 2500000, 1800000, 3300000,
  };
  
  static const int ltc3589_12_ldo4[] = {
  	1200000, 1800000, 2500000, 3200000,
  };
  
  static int ltc3589_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)
  {
  	struct ltc3589 *ltc3589 = rdev_get_drvdata(rdev);
  	int sel, shift;
  
  	if (unlikely(ramp_delay <= 0))
  		return -EINVAL;
  
  	/* VRRCR slew rate offsets are the same as VCCR go bit offsets */
  	shift = ffs(rdev->desc->apply_bit) - 1;
  
  	/* The slew rate can be set to 0.88, 1.75, 3.5, or 7 mV/uS */
  	for (sel = 0; sel < 4; sel++) {
  		if ((880 << sel) >= ramp_delay) {
  			return regmap_update_bits(ltc3589->regmap,
  						  LTC3589_VRRCR,
  						  0x3 << shift, sel << shift);
  		}
  	}
  	return -EINVAL;
  }
  
  static int ltc3589_set_suspend_voltage(struct regulator_dev *rdev, int uV)
  {
  	struct ltc3589 *ltc3589 = rdev_get_drvdata(rdev);
  	int sel;
  
  	sel = regulator_map_voltage_linear(rdev, uV, uV);
  	if (sel < 0)
  		return sel;
  
  	/* DTV2 register follows right after the corresponding DTV1 register */
  	return regmap_update_bits(ltc3589->regmap, rdev->desc->vsel_reg + 1,
  				  rdev->desc->vsel_mask, sel);
  }
  
  static int ltc3589_set_suspend_mode(struct regulator_dev *rdev,
  				    unsigned int mode)
  {
  	struct ltc3589 *ltc3589 = rdev_get_drvdata(rdev);
  	int mask, bit = 0;
  
  	/* VCCR reference selects are right next to the VCCR go bits */
  	mask = rdev->desc->apply_bit << 1;
  
  	if (mode == REGULATOR_MODE_STANDBY)
  		bit = mask;	/* Select DTV2 */
  
  	mask |= rdev->desc->apply_bit;
  	bit |= rdev->desc->apply_bit;
  	return regmap_update_bits(ltc3589->regmap, LTC3589_VCCR, mask, bit);
  }
3eb2c7ecb   Philipp Zabel   regulator: Add LT...
141
  /* SW1, SW2, SW3, LDO2 */
c093c3a3d   Bhumika Goyal   regulator: ltc358...
142
  static const struct regulator_ops ltc3589_linear_regulator_ops = {
3eb2c7ecb   Philipp Zabel   regulator: Add LT...
143
144
145
146
147
148
149
150
151
152
153
154
155
  	.enable = regulator_enable_regmap,
  	.disable = regulator_disable_regmap,
  	.is_enabled = regulator_is_enabled_regmap,
  	.list_voltage = regulator_list_voltage_linear,
  	.set_voltage_sel = regulator_set_voltage_sel_regmap,
  	.get_voltage_sel = regulator_get_voltage_sel_regmap,
  	.set_ramp_delay = ltc3589_set_ramp_delay,
  	.set_voltage_time_sel = regulator_set_voltage_time_sel,
  	.set_suspend_voltage = ltc3589_set_suspend_voltage,
  	.set_suspend_mode = ltc3589_set_suspend_mode,
  };
  
  /* BB_OUT, LDO3 */
c093c3a3d   Bhumika Goyal   regulator: ltc358...
156
  static const struct regulator_ops ltc3589_fixed_regulator_ops = {
3eb2c7ecb   Philipp Zabel   regulator: Add LT...
157
158
159
  	.enable = regulator_enable_regmap,
  	.disable = regulator_disable_regmap,
  	.is_enabled = regulator_is_enabled_regmap,
3eb2c7ecb   Philipp Zabel   regulator: Add LT...
160
161
162
  };
  
  /* LDO1 */
c093c3a3d   Bhumika Goyal   regulator: ltc358...
163
  static const struct regulator_ops ltc3589_fixed_standby_regulator_ops = {
3eb2c7ecb   Philipp Zabel   regulator: Add LT...
164
165
166
  };
  
  /* LDO4 */
c093c3a3d   Bhumika Goyal   regulator: ltc358...
167
  static const struct regulator_ops ltc3589_table_regulator_ops = {
3eb2c7ecb   Philipp Zabel   regulator: Add LT...
168
169
170
171
172
173
174
  	.enable = regulator_enable_regmap,
  	.disable = regulator_disable_regmap,
  	.is_enabled = regulator_is_enabled_regmap,
  	.list_voltage = regulator_list_voltage_table,
  	.set_voltage_sel = regulator_set_voltage_sel_regmap,
  	.get_voltage_sel = regulator_get_voltage_sel_regmap,
  };
ce62ba3af   Axel Lin   regulator: ltc358...
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
  static inline unsigned int ltc3589_scale(unsigned int uV, u32 r1, u32 r2)
  {
  	uint64_t tmp;
  
  	if (uV == 0)
  		return 0;
  
  	tmp = (uint64_t)uV * r1;
  	do_div(tmp, r2);
  	return uV + (unsigned int)tmp;
  }
  
  static int ltc3589_of_parse_cb(struct device_node *np,
  			       const struct regulator_desc *desc,
  			       struct regulator_config *config)
  {
  	struct ltc3589 *ltc3589 = config->driver_data;
63c7c2962   Axel Lin   regulator: ltc358...
192
  	struct regulator_desc *rdesc = &ltc3589->regulator_descs[desc->id];
ce62ba3af   Axel Lin   regulator: ltc358...
193
194
195
196
197
198
  	u32 r[2];
  	int ret;
  
  	/* Parse feedback voltage dividers. LDO3 and LDO4 don't have them */
  	if (desc->id >= LTC3589_LDO3)
  		return 0;
3eb2c7ecb   Philipp Zabel   regulator: Add LT...
199

ce62ba3af   Axel Lin   regulator: ltc358...
200
201
202
203
204
205
206
207
208
209
  	ret = of_property_read_u32_array(np, "lltc,fb-voltage-divider", r, 2);
  	if (ret) {
  		dev_err(ltc3589->dev, "Failed to parse voltage divider: %d
  ",
  			ret);
  		return ret;
  	}
  
  	if (!r[0] || !r[1])
  		return 0;
63c7c2962   Axel Lin   regulator: ltc358...
210
211
212
  	rdesc->min_uV = ltc3589_scale(desc->min_uV, r[0], r[1]);
  	rdesc->uV_step = ltc3589_scale(desc->uV_step, r[0], r[1]);
  	rdesc->fixed_uV = ltc3589_scale(desc->fixed_uV, r[0], r[1]);
ce62ba3af   Axel Lin   regulator: ltc358...
213
214
215
216
217
  
  	return 0;
  }
  
  #define LTC3589_REG(_name, _of_name, _ops, en_bit, dtv1_reg, dtv_mask, go_bit)\
3eb2c7ecb   Philipp Zabel   regulator: Add LT...
218
  	[LTC3589_ ## _name] = {						\
63c7c2962   Axel Lin   regulator: ltc358...
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
  		.name = #_name,						\
  		.of_match = of_match_ptr(#_of_name),			\
  		.regulators_node = of_match_ptr("regulators"),		\
  		.of_parse_cb = ltc3589_of_parse_cb,			\
  		.n_voltages = (dtv_mask) + 1,				\
  		.min_uV = (go_bit) ? 362500 : 0,			\
  		.uV_step = (go_bit) ? 12500 : 0,			\
  		.ramp_delay = (go_bit) ? 1750 : 0,			\
  		.fixed_uV = (dtv_mask) ? 0 : 800000,			\
  		.ops = &ltc3589_ ## _ops ## _regulator_ops,		\
  		.type = REGULATOR_VOLTAGE,				\
  		.id = LTC3589_ ## _name,				\
  		.owner = THIS_MODULE,					\
  		.vsel_reg = (dtv1_reg),					\
  		.vsel_mask = (dtv_mask),				\
  		.apply_reg = (go_bit) ? LTC3589_VCCR : 0,		\
  		.apply_bit = (go_bit),					\
  		.enable_reg = (en_bit) ? LTC3589_OVEN : 0,		\
  		.enable_mask = (en_bit),				\
3eb2c7ecb   Philipp Zabel   regulator: Add LT...
238
  	}
ce62ba3af   Axel Lin   regulator: ltc358...
239
240
  #define LTC3589_LINEAR_REG(_name, _of_name, _dtv1)			\
  	LTC3589_REG(_name, _of_name, linear, LTC3589_OVEN_ ## _name,	\
3eb2c7ecb   Philipp Zabel   regulator: Add LT...
241
242
  		    LTC3589_ ## _dtv1, 0x1f,				\
  		    LTC3589_VCCR_ ## _name ## _GO)
ce62ba3af   Axel Lin   regulator: ltc358...
243
244
  #define LTC3589_FIXED_REG(_name, _of_name)				\
  	LTC3589_REG(_name, _of_name, fixed, LTC3589_OVEN_ ## _name, 0, 0, 0)
3eb2c7ecb   Philipp Zabel   regulator: Add LT...
245

63c7c2962   Axel Lin   regulator: ltc358...
246
  static const struct regulator_desc ltc3589_regulators[] = {
ce62ba3af   Axel Lin   regulator: ltc358...
247
248
249
250
251
252
253
254
255
  	LTC3589_LINEAR_REG(SW1, sw1, B1DTV1),
  	LTC3589_LINEAR_REG(SW2, sw2, B2DTV1),
  	LTC3589_LINEAR_REG(SW3, sw3, B3DTV1),
  	LTC3589_FIXED_REG(BB_OUT, bb-out),
  	LTC3589_REG(LDO1, ldo1, fixed_standby, 0, 0, 0, 0),
  	LTC3589_LINEAR_REG(LDO2, ldo2, L2DTV1),
  	LTC3589_FIXED_REG(LDO3, ldo3),
  	LTC3589_REG(LDO4, ldo4, table, LTC3589_OVEN_LDO4, LTC3589_L2DTV2,
  		    0x60, 0),
3eb2c7ecb   Philipp Zabel   regulator: Add LT...
256
  };
3eb2c7ecb   Philipp Zabel   regulator: Add LT...
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
  static bool ltc3589_writeable_reg(struct device *dev, unsigned int reg)
  {
  	switch (reg) {
  	case LTC3589_IRQSTAT:
  	case LTC3589_SCR1:
  	case LTC3589_OVEN:
  	case LTC3589_SCR2:
  	case LTC3589_VCCR:
  	case LTC3589_CLIRQ:
  	case LTC3589_B1DTV1:
  	case LTC3589_B1DTV2:
  	case LTC3589_VRRCR:
  	case LTC3589_B2DTV1:
  	case LTC3589_B2DTV2:
  	case LTC3589_B3DTV1:
  	case LTC3589_B3DTV2:
  	case LTC3589_L2DTV1:
  	case LTC3589_L2DTV2:
  		return true;
  	}
  	return false;
  }
  
  static bool ltc3589_readable_reg(struct device *dev, unsigned int reg)
  {
  	switch (reg) {
  	case LTC3589_IRQSTAT:
  	case LTC3589_SCR1:
  	case LTC3589_OVEN:
  	case LTC3589_SCR2:
  	case LTC3589_PGSTAT:
  	case LTC3589_VCCR:
  	case LTC3589_B1DTV1:
  	case LTC3589_B1DTV2:
  	case LTC3589_VRRCR:
  	case LTC3589_B2DTV1:
  	case LTC3589_B2DTV2:
  	case LTC3589_B3DTV1:
  	case LTC3589_B3DTV2:
  	case LTC3589_L2DTV1:
  	case LTC3589_L2DTV2:
  		return true;
  	}
  	return false;
  }
  
  static bool ltc3589_volatile_reg(struct device *dev, unsigned int reg)
  {
  	switch (reg) {
  	case LTC3589_IRQSTAT:
  	case LTC3589_PGSTAT:
c5bb725ac   Steffen Trumtrar   regulator: ltc358...
308
  	case LTC3589_VCCR:
3eb2c7ecb   Philipp Zabel   regulator: Add LT...
309
310
311
312
  		return true;
  	}
  	return false;
  }
ec8677267   Axel Lin   regulator: ltc358...
313
  static const struct reg_default ltc3589_reg_defaults[] = {
3eb2c7ecb   Philipp Zabel   regulator: Add LT...
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
  	{ LTC3589_SCR1,   0x00 },
  	{ LTC3589_OVEN,   0x00 },
  	{ LTC3589_SCR2,   0x00 },
  	{ LTC3589_VCCR,   0x00 },
  	{ LTC3589_B1DTV1, 0x19 },
  	{ LTC3589_B1DTV2, 0x19 },
  	{ LTC3589_VRRCR,  0xff },
  	{ LTC3589_B2DTV1, 0x19 },
  	{ LTC3589_B2DTV2, 0x19 },
  	{ LTC3589_B3DTV1, 0x19 },
  	{ LTC3589_B3DTV2, 0x19 },
  	{ LTC3589_L2DTV1, 0x19 },
  	{ LTC3589_L2DTV2, 0x19 },
  };
  
  static const struct regmap_config ltc3589_regmap_config = {
  	.reg_bits = 8,
  	.val_bits = 8,
  	.writeable_reg = ltc3589_writeable_reg,
  	.readable_reg = ltc3589_readable_reg,
  	.volatile_reg = ltc3589_volatile_reg,
  	.max_register = LTC3589_L2DTV2,
  	.reg_defaults = ltc3589_reg_defaults,
  	.num_reg_defaults = ARRAY_SIZE(ltc3589_reg_defaults),
1c96a2f67   David Frey   regmap: split up ...
338
339
  	.use_single_read = true,
  	.use_single_write = true,
3eb2c7ecb   Philipp Zabel   regulator: Add LT...
340
341
  	.cache_type = REGCACHE_RBTREE,
  };
3eb2c7ecb   Philipp Zabel   regulator: Add LT...
342
343
344
345
346
347
348
349
350
  static irqreturn_t ltc3589_isr(int irq, void *dev_id)
  {
  	struct ltc3589 *ltc3589 = dev_id;
  	unsigned int i, irqstat, event;
  
  	regmap_read(ltc3589->regmap, LTC3589_IRQSTAT, &irqstat);
  
  	if (irqstat & LTC3589_IRQSTAT_THERMAL_WARN) {
  		event = REGULATOR_EVENT_OVER_TEMP;
e9c142b0d   Michał Mirosław   regulator: remove...
351
  		for (i = 0; i < LTC3589_NUM_REGULATORS; i++)
3eb2c7ecb   Philipp Zabel   regulator: Add LT...
352
353
354
355
356
357
  			regulator_notifier_call_chain(ltc3589->regulators[i],
  						      event, NULL);
  	}
  
  	if (irqstat & LTC3589_IRQSTAT_UNDERVOLT_WARN) {
  		event = REGULATOR_EVENT_UNDER_VOLTAGE;
e9c142b0d   Michał Mirosław   regulator: remove...
358
  		for (i = 0; i < LTC3589_NUM_REGULATORS; i++)
3eb2c7ecb   Philipp Zabel   regulator: Add LT...
359
360
361
362
363
364
365
366
367
  			regulator_notifier_call_chain(ltc3589->regulators[i],
  						      event, NULL);
  	}
  
  	/* Clear warning condition */
  	regmap_write(ltc3589->regmap, LTC3589_CLIRQ, 0);
  
  	return IRQ_HANDLED;
  }
3eb2c7ecb   Philipp Zabel   regulator: Add LT...
368
369
370
371
  static int ltc3589_probe(struct i2c_client *client,
  			 const struct i2c_device_id *id)
  {
  	struct device *dev = &client->dev;
63c7c2962   Axel Lin   regulator: ltc358...
372
  	struct regulator_desc *descs;
3eb2c7ecb   Philipp Zabel   regulator: Add LT...
373
374
375
376
377
378
379
380
  	struct ltc3589 *ltc3589;
  	int i, ret;
  
  	ltc3589 = devm_kzalloc(dev, sizeof(*ltc3589), GFP_KERNEL);
  	if (!ltc3589)
  		return -ENOMEM;
  
  	i2c_set_clientdata(client, ltc3589);
45a861724   Javier Martinez Canillas   regulator: ltc358...
381
382
383
384
385
  	if (client->dev.of_node)
  		ltc3589->variant = (enum ltc3589_variant)
  			of_device_get_match_data(&client->dev);
  	else
  		ltc3589->variant = id->driver_data;
3eb2c7ecb   Philipp Zabel   regulator: Add LT...
386
387
388
389
390
  	ltc3589->dev = dev;
  
  	descs = ltc3589->regulator_descs;
  	memcpy(descs, ltc3589_regulators, sizeof(ltc3589_regulators));
  	if (ltc3589->variant == LTC3589) {
63c7c2962   Axel Lin   regulator: ltc358...
391
392
  		descs[LTC3589_LDO3].fixed_uV = 1800000;
  		descs[LTC3589_LDO4].volt_table = ltc3589_ldo4;
3eb2c7ecb   Philipp Zabel   regulator: Add LT...
393
  	} else {
63c7c2962   Axel Lin   regulator: ltc358...
394
395
  		descs[LTC3589_LDO3].fixed_uV = 2800000;
  		descs[LTC3589_LDO4].volt_table = ltc3589_12_ldo4;
3eb2c7ecb   Philipp Zabel   regulator: Add LT...
396
397
398
399
400
401
402
403
404
  	}
  
  	ltc3589->regmap = devm_regmap_init_i2c(client, &ltc3589_regmap_config);
  	if (IS_ERR(ltc3589->regmap)) {
  		ret = PTR_ERR(ltc3589->regmap);
  		dev_err(dev, "failed to initialize regmap: %d
  ", ret);
  		return ret;
  	}
3eb2c7ecb   Philipp Zabel   regulator: Add LT...
405
  	for (i = 0; i < LTC3589_NUM_REGULATORS; i++) {
63c7c2962   Axel Lin   regulator: ltc358...
406
  		struct regulator_desc *desc = &ltc3589->regulator_descs[i];
3eb2c7ecb   Philipp Zabel   regulator: Add LT...
407
  		struct regulator_config config = { };
3eb2c7ecb   Philipp Zabel   regulator: Add LT...
408
  		config.dev = dev;
3eb2c7ecb   Philipp Zabel   regulator: Add LT...
409
  		config.driver_data = ltc3589;
3eb2c7ecb   Philipp Zabel   regulator: Add LT...
410
411
412
413
414
415
416
417
418
419
420
  
  		ltc3589->regulators[i] = devm_regulator_register(dev, desc,
  								 &config);
  		if (IS_ERR(ltc3589->regulators[i])) {
  			ret = PTR_ERR(ltc3589->regulators[i]);
  			dev_err(dev, "failed to register regulator %s: %d
  ",
  				desc->name, ret);
  			return ret;
  		}
  	}
d4930cf0a   Bernhard Walle   regulator: ltc358...
421
422
423
424
425
426
427
428
429
430
  	if (client->irq) {
  		ret = devm_request_threaded_irq(dev, client->irq, NULL,
  						ltc3589_isr,
  						IRQF_TRIGGER_LOW | IRQF_ONESHOT,
  						client->name, ltc3589);
  		if (ret) {
  			dev_err(dev, "Failed to request IRQ: %d
  ", ret);
  			return ret;
  		}
3eb2c7ecb   Philipp Zabel   regulator: Add LT...
431
432
433
434
  	}
  
  	return 0;
  }
6d284bb11   Arvind Yadav   regulator: ltc358...
435
  static const struct i2c_device_id ltc3589_i2c_id[] = {
3eb2c7ecb   Philipp Zabel   regulator: Add LT...
436
437
438
439
440
441
  	{ "ltc3589",   LTC3589   },
  	{ "ltc3589-1", LTC3589_1 },
  	{ "ltc3589-2", LTC3589_2 },
  	{ }
  };
  MODULE_DEVICE_TABLE(i2c, ltc3589_i2c_id);
8ece31564   Jisheng Zhang   regulator: ltc358...
442
  static const struct of_device_id __maybe_unused ltc3589_of_match[] = {
45a861724   Javier Martinez Canillas   regulator: ltc358...
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
  	{
  		.compatible = "lltc,ltc3589",
  		.data = (void *)LTC3589,
  	},
  	{
  		.compatible = "lltc,ltc3589-1",
  		.data = (void *)LTC3589_1,
  	},
  	{
  		.compatible = "lltc,ltc3589-2",
  		.data = (void *)LTC3589_2,
  	},
  	{ },
  };
  MODULE_DEVICE_TABLE(of, ltc3589_of_match);
3eb2c7ecb   Philipp Zabel   regulator: Add LT...
458
459
460
  static struct i2c_driver ltc3589_driver = {
  	.driver = {
  		.name = DRIVER_NAME,
45a861724   Javier Martinez Canillas   regulator: ltc358...
461
  		.of_match_table = of_match_ptr(ltc3589_of_match),
3eb2c7ecb   Philipp Zabel   regulator: Add LT...
462
463
464
465
466
467
468
469
470
  	},
  	.probe = ltc3589_probe,
  	.id_table = ltc3589_i2c_id,
  };
  module_i2c_driver(ltc3589_driver);
  
  MODULE_AUTHOR("Philipp Zabel <p.zabel@pengutronix.de>");
  MODULE_DESCRIPTION("Regulator driver for Linear Technology LTC3589(-1,2)");
  MODULE_LICENSE("GPL v2");