2 * Voltage and current regulation for AD5398 and AD5821
4 * Copyright 2010 Analog Devices Inc.
6 * Enter bugs at http://blackfin.uclinux.org/
8 * Licensed under the GPL-2 or later.
11 #include <linux/module.h>
12 #include <linux/err.h>
13 #include <linux/i2c.h>
14 #include <linux/slab.h>
15 #include <linux/platform_device.h>
16 #include <linux/regulator/driver.h>
17 #include <linux/regulator/machine.h>
19 #define AD5398_CURRENT_EN_MASK 0x8000
21 struct ad5398_chip_info
{
22 struct i2c_client
*client
;
25 unsigned int current_level
;
26 unsigned int current_mask
;
27 unsigned int current_offset
;
28 struct regulator_dev
*rdev
;
31 static int ad5398_calc_current(struct ad5398_chip_info
*chip
,
34 unsigned range_uA
= chip
->max_uA
- chip
->min_uA
;
36 return chip
->min_uA
+ (selector
* range_uA
/ chip
->current_level
);
39 static int ad5398_read_reg(struct i2c_client
*client
, unsigned short *data
)
44 ret
= i2c_master_recv(client
, (char *)&val
, 2);
46 dev_err(&client
->dev
, "I2C read error\n");
49 *data
= be16_to_cpu(val
);
54 static int ad5398_write_reg(struct i2c_client
*client
, const unsigned short data
)
59 val
= cpu_to_be16(data
);
60 ret
= i2c_master_send(client
, (char *)&val
, 2);
62 dev_err(&client
->dev
, "I2C write error\n");
63 return ret
< 0 ? ret
: -EIO
;
69 static int ad5398_get_current_limit(struct regulator_dev
*rdev
)
71 struct ad5398_chip_info
*chip
= rdev_get_drvdata(rdev
);
72 struct i2c_client
*client
= chip
->client
;
76 ret
= ad5398_read_reg(client
, &data
);
80 ret
= (data
& chip
->current_mask
) >> chip
->current_offset
;
82 return ad5398_calc_current(chip
, ret
);
85 static int ad5398_set_current_limit(struct regulator_dev
*rdev
, int min_uA
, int max_uA
)
87 struct ad5398_chip_info
*chip
= rdev_get_drvdata(rdev
);
88 struct i2c_client
*client
= chip
->client
;
89 unsigned range_uA
= chip
->max_uA
- chip
->min_uA
;
94 if (min_uA
< chip
->min_uA
)
95 min_uA
= chip
->min_uA
;
96 if (max_uA
> chip
->max_uA
)
97 max_uA
= chip
->max_uA
;
99 if (min_uA
> chip
->max_uA
|| max_uA
< chip
->min_uA
)
102 selector
= DIV_ROUND_UP((min_uA
- chip
->min_uA
) * chip
->current_level
,
104 if (ad5398_calc_current(chip
, selector
) > max_uA
)
107 dev_dbg(&client
->dev
, "changing current %duA\n",
108 ad5398_calc_current(chip
, selector
));
110 /* read chip enable bit */
111 ret
= ad5398_read_reg(client
, &data
);
115 /* prepare register data */
116 selector
= (selector
<< chip
->current_offset
) & chip
->current_mask
;
117 data
= (unsigned short)selector
| (data
& AD5398_CURRENT_EN_MASK
);
119 /* write the new current value back as well as enable bit */
120 ret
= ad5398_write_reg(client
, data
);
125 static int ad5398_is_enabled(struct regulator_dev
*rdev
)
127 struct ad5398_chip_info
*chip
= rdev_get_drvdata(rdev
);
128 struct i2c_client
*client
= chip
->client
;
132 ret
= ad5398_read_reg(client
, &data
);
136 if (data
& AD5398_CURRENT_EN_MASK
)
142 static int ad5398_enable(struct regulator_dev
*rdev
)
144 struct ad5398_chip_info
*chip
= rdev_get_drvdata(rdev
);
145 struct i2c_client
*client
= chip
->client
;
149 ret
= ad5398_read_reg(client
, &data
);
153 if (data
& AD5398_CURRENT_EN_MASK
)
156 data
|= AD5398_CURRENT_EN_MASK
;
158 ret
= ad5398_write_reg(client
, data
);
163 static int ad5398_disable(struct regulator_dev
*rdev
)
165 struct ad5398_chip_info
*chip
= rdev_get_drvdata(rdev
);
166 struct i2c_client
*client
= chip
->client
;
170 ret
= ad5398_read_reg(client
, &data
);
174 if (!(data
& AD5398_CURRENT_EN_MASK
))
177 data
&= ~AD5398_CURRENT_EN_MASK
;
179 ret
= ad5398_write_reg(client
, data
);
184 static struct regulator_ops ad5398_ops
= {
185 .get_current_limit
= ad5398_get_current_limit
,
186 .set_current_limit
= ad5398_set_current_limit
,
187 .enable
= ad5398_enable
,
188 .disable
= ad5398_disable
,
189 .is_enabled
= ad5398_is_enabled
,
192 static const struct regulator_desc ad5398_reg
= {
196 .type
= REGULATOR_CURRENT
,
197 .owner
= THIS_MODULE
,
200 struct ad5398_current_data_format
{
207 static const struct ad5398_current_data_format df_10_4_120
= {10, 4, 0, 120000};
209 static const struct i2c_device_id ad5398_id
[] = {
210 { "ad5398", (kernel_ulong_t
)&df_10_4_120
},
211 { "ad5821", (kernel_ulong_t
)&df_10_4_120
},
214 MODULE_DEVICE_TABLE(i2c
, ad5398_id
);
216 static int ad5398_probe(struct i2c_client
*client
,
217 const struct i2c_device_id
*id
)
219 struct regulator_init_data
*init_data
= dev_get_platdata(&client
->dev
);
220 struct regulator_config config
= { };
221 struct ad5398_chip_info
*chip
;
222 const struct ad5398_current_data_format
*df
=
223 (struct ad5398_current_data_format
*)id
->driver_data
;
228 chip
= devm_kzalloc(&client
->dev
, sizeof(*chip
), GFP_KERNEL
);
232 config
.dev
= &client
->dev
;
233 config
.init_data
= init_data
;
234 config
.driver_data
= chip
;
236 chip
->client
= client
;
238 chip
->min_uA
= df
->min_uA
;
239 chip
->max_uA
= df
->max_uA
;
240 chip
->current_level
= 1 << df
->current_bits
;
241 chip
->current_offset
= df
->current_offset
;
242 chip
->current_mask
= (chip
->current_level
- 1) << chip
->current_offset
;
244 chip
->rdev
= devm_regulator_register(&client
->dev
, &ad5398_reg
,
246 if (IS_ERR(chip
->rdev
)) {
247 dev_err(&client
->dev
, "failed to register %s %s\n",
248 id
->name
, ad5398_reg
.name
);
249 return PTR_ERR(chip
->rdev
);
252 i2c_set_clientdata(client
, chip
);
253 dev_dbg(&client
->dev
, "%s regulator driver is registered.\n", id
->name
);
257 static struct i2c_driver ad5398_driver
= {
258 .probe
= ad5398_probe
,
262 .id_table
= ad5398_id
,
265 static int __init
ad5398_init(void)
267 return i2c_add_driver(&ad5398_driver
);
269 subsys_initcall(ad5398_init
);
271 static void __exit
ad5398_exit(void)
273 i2c_del_driver(&ad5398_driver
);
275 module_exit(ad5398_exit
);
277 MODULE_DESCRIPTION("AD5398 and AD5821 current regulator driver");
278 MODULE_AUTHOR("Sonic Zhang");
279 MODULE_LICENSE("GPL");