Root/drivers/power/ds2781_battery.c

1/*
2 * 1-wire client/driver for the Maxim/Dallas DS2781 Stand-Alone Fuel Gauge IC
3 *
4 * Author: Renata Sayakhova <renata@oktetlabs.ru>
5 *
6 * Based on ds2780_battery drivers
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 *
12 */
13
14#include <linux/module.h>
15#include <linux/slab.h>
16#include <linux/param.h>
17#include <linux/pm.h>
18#include <linux/platform_device.h>
19#include <linux/power_supply.h>
20#include <linux/idr.h>
21
22#include "../w1/w1.h"
23#include "../w1/slaves/w1_ds2781.h"
24
25/* Current unit measurement in uA for a 1 milli-ohm sense resistor */
26#define DS2781_CURRENT_UNITS 1563
27/* Charge unit measurement in uAh for a 1 milli-ohm sense resistor */
28#define DS2781_CHARGE_UNITS 6250
29/* Number of bytes in user EEPROM space */
30#define DS2781_USER_EEPROM_SIZE (DS2781_EEPROM_BLOCK0_END - \
31                    DS2781_EEPROM_BLOCK0_START + 1)
32/* Number of bytes in parameter EEPROM space */
33#define DS2781_PARAM_EEPROM_SIZE (DS2781_EEPROM_BLOCK1_END - \
34                    DS2781_EEPROM_BLOCK1_START + 1)
35
36struct ds2781_device_info {
37    struct device *dev;
38    struct power_supply bat;
39    struct device *w1_dev;
40};
41
42enum current_types {
43    CURRENT_NOW,
44    CURRENT_AVG,
45};
46
47static const char model[] = "DS2781";
48static const char manufacturer[] = "Maxim/Dallas";
49
50static inline struct ds2781_device_info *
51to_ds2781_device_info(struct power_supply *psy)
52{
53    return container_of(psy, struct ds2781_device_info, bat);
54}
55
56static inline struct power_supply *to_power_supply(struct device *dev)
57{
58    return dev_get_drvdata(dev);
59}
60
61static inline int ds2781_battery_io(struct ds2781_device_info *dev_info,
62    char *buf, int addr, size_t count, int io)
63{
64    return w1_ds2781_io(dev_info->w1_dev, buf, addr, count, io);
65}
66
67static int w1_ds2781_read(struct ds2781_device_info *dev_info, char *buf,
68        int addr, size_t count)
69{
70    return ds2781_battery_io(dev_info, buf, addr, count, 0);
71}
72
73static inline int ds2781_read8(struct ds2781_device_info *dev_info, u8 *val,
74    int addr)
75{
76    return ds2781_battery_io(dev_info, val, addr, sizeof(u8), 0);
77}
78
79static int ds2781_read16(struct ds2781_device_info *dev_info, s16 *val,
80    int addr)
81{
82    int ret;
83    u8 raw[2];
84
85    ret = ds2781_battery_io(dev_info, raw, addr, sizeof(raw), 0);
86    if (ret < 0)
87        return ret;
88
89    *val = (raw[0] << 8) | raw[1];
90
91    return 0;
92}
93
94static inline int ds2781_read_block(struct ds2781_device_info *dev_info,
95    u8 *val, int addr, size_t count)
96{
97    return ds2781_battery_io(dev_info, val, addr, count, 0);
98}
99
100static inline int ds2781_write(struct ds2781_device_info *dev_info, u8 *val,
101    int addr, size_t count)
102{
103    return ds2781_battery_io(dev_info, val, addr, count, 1);
104}
105
106static inline int ds2781_store_eeprom(struct device *dev, int addr)
107{
108    return w1_ds2781_eeprom_cmd(dev, addr, W1_DS2781_COPY_DATA);
109}
110
111static inline int ds2781_recall_eeprom(struct device *dev, int addr)
112{
113    return w1_ds2781_eeprom_cmd(dev, addr, W1_DS2781_RECALL_DATA);
114}
115
116static int ds2781_save_eeprom(struct ds2781_device_info *dev_info, int reg)
117{
118    int ret;
119
120    ret = ds2781_store_eeprom(dev_info->w1_dev, reg);
121    if (ret < 0)
122        return ret;
123
124    ret = ds2781_recall_eeprom(dev_info->w1_dev, reg);
125    if (ret < 0)
126        return ret;
127
128    return 0;
129}
130
131/* Set sense resistor value in mhos */
132static int ds2781_set_sense_register(struct ds2781_device_info *dev_info,
133    u8 conductance)
134{
135    int ret;
136
137    ret = ds2781_write(dev_info, &conductance,
138                DS2781_RSNSP, sizeof(u8));
139    if (ret < 0)
140        return ret;
141
142    return ds2781_save_eeprom(dev_info, DS2781_RSNSP);
143}
144
145/* Get RSGAIN value from 0 to 1.999 in steps of 0.001 */
146static int ds2781_get_rsgain_register(struct ds2781_device_info *dev_info,
147    u16 *rsgain)
148{
149    return ds2781_read16(dev_info, rsgain, DS2781_RSGAIN_MSB);
150}
151
152/* Set RSGAIN value from 0 to 1.999 in steps of 0.001 */
153static int ds2781_set_rsgain_register(struct ds2781_device_info *dev_info,
154    u16 rsgain)
155{
156    int ret;
157    u8 raw[] = {rsgain >> 8, rsgain & 0xFF};
158
159    ret = ds2781_write(dev_info, raw,
160                DS2781_RSGAIN_MSB, sizeof(raw));
161    if (ret < 0)
162        return ret;
163
164    return ds2781_save_eeprom(dev_info, DS2781_RSGAIN_MSB);
165}
166
167static int ds2781_get_voltage(struct ds2781_device_info *dev_info,
168    int *voltage_uV)
169{
170    int ret;
171    char val[2];
172    int voltage_raw;
173
174    ret = w1_ds2781_read(dev_info, val, DS2781_VOLT_MSB, 2 * sizeof(u8));
175    if (ret < 0)
176        return ret;
177    /*
178     * The voltage value is located in 10 bits across the voltage MSB
179     * and LSB registers in two's compliment form
180     * Sign bit of the voltage value is in bit 7 of the voltage MSB register
181     * Bits 9 - 3 of the voltage value are in bits 6 - 0 of the
182     * voltage MSB register
183     * Bits 2 - 0 of the voltage value are in bits 7 - 5 of the
184     * voltage LSB register
185     */
186    voltage_raw = (val[0] << 3) |
187        (val[1] >> 5);
188
189    /* DS2781 reports voltage in units of 9.76mV, but the battery class
190     * reports in units of uV, so convert by multiplying by 9760. */
191    *voltage_uV = voltage_raw * 9760;
192
193    return 0;
194}
195
196static int ds2781_get_temperature(struct ds2781_device_info *dev_info,
197    int *temp)
198{
199    int ret;
200    char val[2];
201    int temp_raw;
202
203    ret = w1_ds2781_read(dev_info, val, DS2781_TEMP_MSB, 2 * sizeof(u8));
204    if (ret < 0)
205        return ret;
206    /*
207     * The temperature value is located in 10 bits across the temperature
208     * MSB and LSB registers in two's compliment form
209     * Sign bit of the temperature value is in bit 7 of the temperature
210     * MSB register
211     * Bits 9 - 3 of the temperature value are in bits 6 - 0 of the
212     * temperature MSB register
213     * Bits 2 - 0 of the temperature value are in bits 7 - 5 of the
214     * temperature LSB register
215     */
216    temp_raw = ((val[0]) << 3) |
217        (val[1] >> 5);
218    *temp = temp_raw + (temp_raw / 4);
219
220    return 0;
221}
222
223static int ds2781_get_current(struct ds2781_device_info *dev_info,
224    enum current_types type, int *current_uA)
225{
226    int ret, sense_res;
227    s16 current_raw;
228    u8 sense_res_raw, reg_msb;
229
230    /*
231     * The units of measurement for current are dependent on the value of
232     * the sense resistor.
233     */
234    ret = ds2781_read8(dev_info, &sense_res_raw, DS2781_RSNSP);
235    if (ret < 0)
236        return ret;
237
238    if (sense_res_raw == 0) {
239        dev_err(dev_info->dev, "sense resistor value is 0\n");
240        return -EINVAL;
241    }
242    sense_res = 1000 / sense_res_raw;
243
244    if (type == CURRENT_NOW)
245        reg_msb = DS2781_CURRENT_MSB;
246    else if (type == CURRENT_AVG)
247        reg_msb = DS2781_IAVG_MSB;
248    else
249        return -EINVAL;
250
251    /*
252     * The current value is located in 16 bits across the current MSB
253     * and LSB registers in two's compliment form
254     * Sign bit of the current value is in bit 7 of the current MSB register
255     * Bits 14 - 8 of the current value are in bits 6 - 0 of the current
256     * MSB register
257     * Bits 7 - 0 of the current value are in bits 7 - 0 of the current
258     * LSB register
259     */
260    ret = ds2781_read16(dev_info, &current_raw, reg_msb);
261    if (ret < 0)
262        return ret;
263
264    *current_uA = current_raw * (DS2781_CURRENT_UNITS / sense_res);
265    return 0;
266}
267
268static int ds2781_get_accumulated_current(struct ds2781_device_info *dev_info,
269    int *accumulated_current)
270{
271    int ret, sense_res;
272    s16 current_raw;
273    u8 sense_res_raw;
274
275    /*
276     * The units of measurement for accumulated current are dependent on
277     * the value of the sense resistor.
278     */
279    ret = ds2781_read8(dev_info, &sense_res_raw, DS2781_RSNSP);
280    if (ret < 0)
281        return ret;
282
283    if (sense_res_raw == 0) {
284        dev_err(dev_info->dev, "sense resistor value is 0\n");
285        return -EINVAL;
286    }
287    sense_res = 1000 / sense_res_raw;
288
289    /*
290     * The ACR value is located in 16 bits across the ACR MSB and
291     * LSB registers
292     * Bits 15 - 8 of the ACR value are in bits 7 - 0 of the ACR
293     * MSB register
294     * Bits 7 - 0 of the ACR value are in bits 7 - 0 of the ACR
295     * LSB register
296     */
297    ret = ds2781_read16(dev_info, &current_raw, DS2781_ACR_MSB);
298    if (ret < 0)
299        return ret;
300
301    *accumulated_current = current_raw * (DS2781_CHARGE_UNITS / sense_res);
302    return 0;
303}
304
305static int ds2781_get_capacity(struct ds2781_device_info *dev_info,
306    int *capacity)
307{
308    int ret;
309    u8 raw;
310
311    ret = ds2781_read8(dev_info, &raw, DS2781_RARC);
312    if (ret < 0)
313        return ret;
314
315    *capacity = raw;
316    return 0;
317}
318
319static int ds2781_get_status(struct ds2781_device_info *dev_info, int *status)
320{
321    int ret, current_uA, capacity;
322
323    ret = ds2781_get_current(dev_info, CURRENT_NOW, &current_uA);
324    if (ret < 0)
325        return ret;
326
327    ret = ds2781_get_capacity(dev_info, &capacity);
328    if (ret < 0)
329        return ret;
330
331    if (power_supply_am_i_supplied(&dev_info->bat)) {
332        if (capacity == 100)
333            *status = POWER_SUPPLY_STATUS_FULL;
334        else if (current_uA > 50000)
335            *status = POWER_SUPPLY_STATUS_CHARGING;
336        else
337            *status = POWER_SUPPLY_STATUS_NOT_CHARGING;
338    } else {
339        *status = POWER_SUPPLY_STATUS_DISCHARGING;
340    }
341    return 0;
342}
343
344static int ds2781_get_charge_now(struct ds2781_device_info *dev_info,
345    int *charge_now)
346{
347    int ret;
348    u16 charge_raw;
349
350    /*
351     * The RAAC value is located in 16 bits across the RAAC MSB and
352     * LSB registers
353     * Bits 15 - 8 of the RAAC value are in bits 7 - 0 of the RAAC
354     * MSB register
355     * Bits 7 - 0 of the RAAC value are in bits 7 - 0 of the RAAC
356     * LSB register
357     */
358    ret = ds2781_read16(dev_info, &charge_raw, DS2781_RAAC_MSB);
359    if (ret < 0)
360        return ret;
361
362    *charge_now = charge_raw * 1600;
363    return 0;
364}
365
366static int ds2781_get_control_register(struct ds2781_device_info *dev_info,
367    u8 *control_reg)
368{
369    return ds2781_read8(dev_info, control_reg, DS2781_CONTROL);
370}
371
372static int ds2781_set_control_register(struct ds2781_device_info *dev_info,
373    u8 control_reg)
374{
375    int ret;
376
377    ret = ds2781_write(dev_info, &control_reg,
378                DS2781_CONTROL, sizeof(u8));
379    if (ret < 0)
380        return ret;
381
382    return ds2781_save_eeprom(dev_info, DS2781_CONTROL);
383}
384
385static int ds2781_battery_get_property(struct power_supply *psy,
386    enum power_supply_property psp,
387    union power_supply_propval *val)
388{
389    int ret = 0;
390    struct ds2781_device_info *dev_info = to_ds2781_device_info(psy);
391
392    switch (psp) {
393    case POWER_SUPPLY_PROP_VOLTAGE_NOW:
394        ret = ds2781_get_voltage(dev_info, &val->intval);
395        break;
396
397    case POWER_SUPPLY_PROP_TEMP:
398        ret = ds2781_get_temperature(dev_info, &val->intval);
399        break;
400
401    case POWER_SUPPLY_PROP_MODEL_NAME:
402        val->strval = model;
403        break;
404
405    case POWER_SUPPLY_PROP_MANUFACTURER:
406        val->strval = manufacturer;
407        break;
408
409    case POWER_SUPPLY_PROP_CURRENT_NOW:
410        ret = ds2781_get_current(dev_info, CURRENT_NOW, &val->intval);
411        break;
412
413    case POWER_SUPPLY_PROP_CURRENT_AVG:
414        ret = ds2781_get_current(dev_info, CURRENT_AVG, &val->intval);
415        break;
416
417    case POWER_SUPPLY_PROP_STATUS:
418        ret = ds2781_get_status(dev_info, &val->intval);
419        break;
420
421    case POWER_SUPPLY_PROP_CAPACITY:
422        ret = ds2781_get_capacity(dev_info, &val->intval);
423        break;
424
425    case POWER_SUPPLY_PROP_CHARGE_COUNTER:
426        ret = ds2781_get_accumulated_current(dev_info, &val->intval);
427        break;
428
429    case POWER_SUPPLY_PROP_CHARGE_NOW:
430        ret = ds2781_get_charge_now(dev_info, &val->intval);
431        break;
432
433    default:
434        ret = -EINVAL;
435    }
436
437    return ret;
438}
439
440static enum power_supply_property ds2781_battery_props[] = {
441    POWER_SUPPLY_PROP_STATUS,
442    POWER_SUPPLY_PROP_VOLTAGE_NOW,
443    POWER_SUPPLY_PROP_TEMP,
444    POWER_SUPPLY_PROP_MODEL_NAME,
445    POWER_SUPPLY_PROP_MANUFACTURER,
446    POWER_SUPPLY_PROP_CURRENT_NOW,
447    POWER_SUPPLY_PROP_CURRENT_AVG,
448    POWER_SUPPLY_PROP_CAPACITY,
449    POWER_SUPPLY_PROP_CHARGE_COUNTER,
450    POWER_SUPPLY_PROP_CHARGE_NOW,
451};
452
453static ssize_t ds2781_get_pmod_enabled(struct device *dev,
454    struct device_attribute *attr,
455    char *buf)
456{
457    int ret;
458    u8 control_reg;
459    struct power_supply *psy = to_power_supply(dev);
460    struct ds2781_device_info *dev_info = to_ds2781_device_info(psy);
461
462    /* Get power mode */
463    ret = ds2781_get_control_register(dev_info, &control_reg);
464    if (ret < 0)
465        return ret;
466
467    return sprintf(buf, "%d\n",
468         !!(control_reg & DS2781_CONTROL_PMOD));
469}
470
471static ssize_t ds2781_set_pmod_enabled(struct device *dev,
472    struct device_attribute *attr,
473    const char *buf,
474    size_t count)
475{
476    int ret;
477    u8 control_reg, new_setting;
478    struct power_supply *psy = to_power_supply(dev);
479    struct ds2781_device_info *dev_info = to_ds2781_device_info(psy);
480
481    /* Set power mode */
482    ret = ds2781_get_control_register(dev_info, &control_reg);
483    if (ret < 0)
484        return ret;
485
486    ret = kstrtou8(buf, 0, &new_setting);
487    if (ret < 0)
488        return ret;
489
490    if ((new_setting != 0) && (new_setting != 1)) {
491        dev_err(dev_info->dev, "Invalid pmod setting (0 or 1)\n");
492        return -EINVAL;
493    }
494
495    if (new_setting)
496        control_reg |= DS2781_CONTROL_PMOD;
497    else
498        control_reg &= ~DS2781_CONTROL_PMOD;
499
500    ret = ds2781_set_control_register(dev_info, control_reg);
501    if (ret < 0)
502        return ret;
503
504    return count;
505}
506
507static ssize_t ds2781_get_sense_resistor_value(struct device *dev,
508    struct device_attribute *attr,
509    char *buf)
510{
511    int ret;
512    u8 sense_resistor;
513    struct power_supply *psy = to_power_supply(dev);
514    struct ds2781_device_info *dev_info = to_ds2781_device_info(psy);
515
516    ret = ds2781_read8(dev_info, &sense_resistor, DS2781_RSNSP);
517    if (ret < 0)
518        return ret;
519
520    ret = sprintf(buf, "%d\n", sense_resistor);
521    return ret;
522}
523
524static ssize_t ds2781_set_sense_resistor_value(struct device *dev,
525    struct device_attribute *attr,
526    const char *buf,
527    size_t count)
528{
529    int ret;
530    u8 new_setting;
531    struct power_supply *psy = to_power_supply(dev);
532    struct ds2781_device_info *dev_info = to_ds2781_device_info(psy);
533
534    ret = kstrtou8(buf, 0, &new_setting);
535    if (ret < 0)
536        return ret;
537
538    ret = ds2781_set_sense_register(dev_info, new_setting);
539    if (ret < 0)
540        return ret;
541
542    return count;
543}
544
545static ssize_t ds2781_get_rsgain_setting(struct device *dev,
546    struct device_attribute *attr,
547    char *buf)
548{
549    int ret;
550    u16 rsgain;
551    struct power_supply *psy = to_power_supply(dev);
552    struct ds2781_device_info *dev_info = to_ds2781_device_info(psy);
553
554    ret = ds2781_get_rsgain_register(dev_info, &rsgain);
555    if (ret < 0)
556        return ret;
557
558    return sprintf(buf, "%d\n", rsgain);
559}
560
561static ssize_t ds2781_set_rsgain_setting(struct device *dev,
562    struct device_attribute *attr,
563    const char *buf,
564    size_t count)
565{
566    int ret;
567    u16 new_setting;
568    struct power_supply *psy = to_power_supply(dev);
569    struct ds2781_device_info *dev_info = to_ds2781_device_info(psy);
570
571    ret = kstrtou16(buf, 0, &new_setting);
572    if (ret < 0)
573        return ret;
574
575    /* Gain can only be from 0 to 1.999 in steps of .001 */
576    if (new_setting > 1999) {
577        dev_err(dev_info->dev, "Invalid rsgain setting (0 - 1999)\n");
578        return -EINVAL;
579    }
580
581    ret = ds2781_set_rsgain_register(dev_info, new_setting);
582    if (ret < 0)
583        return ret;
584
585    return count;
586}
587
588static ssize_t ds2781_get_pio_pin(struct device *dev,
589    struct device_attribute *attr,
590    char *buf)
591{
592    int ret;
593    u8 sfr;
594    struct power_supply *psy = to_power_supply(dev);
595    struct ds2781_device_info *dev_info = to_ds2781_device_info(psy);
596
597    ret = ds2781_read8(dev_info, &sfr, DS2781_SFR);
598    if (ret < 0)
599        return ret;
600
601    ret = sprintf(buf, "%d\n", sfr & DS2781_SFR_PIOSC);
602    return ret;
603}
604
605static ssize_t ds2781_set_pio_pin(struct device *dev,
606    struct device_attribute *attr,
607    const char *buf,
608    size_t count)
609{
610    int ret;
611    u8 new_setting;
612    struct power_supply *psy = to_power_supply(dev);
613    struct ds2781_device_info *dev_info = to_ds2781_device_info(psy);
614
615    ret = kstrtou8(buf, 0, &new_setting);
616    if (ret < 0)
617        return ret;
618
619    if ((new_setting != 0) && (new_setting != 1)) {
620        dev_err(dev_info->dev, "Invalid pio_pin setting (0 or 1)\n");
621        return -EINVAL;
622    }
623
624    ret = ds2781_write(dev_info, &new_setting,
625                DS2781_SFR, sizeof(u8));
626    if (ret < 0)
627        return ret;
628
629    return count;
630}
631
632static ssize_t ds2781_read_param_eeprom_bin(struct file *filp,
633                struct kobject *kobj,
634                struct bin_attribute *bin_attr,
635                char *buf, loff_t off, size_t count)
636{
637    struct device *dev = container_of(kobj, struct device, kobj);
638    struct power_supply *psy = to_power_supply(dev);
639    struct ds2781_device_info *dev_info = to_ds2781_device_info(psy);
640
641    count = min_t(loff_t, count, DS2781_PARAM_EEPROM_SIZE - off);
642
643    return ds2781_read_block(dev_info, buf,
644                DS2781_EEPROM_BLOCK1_START + off, count);
645}
646
647static ssize_t ds2781_write_param_eeprom_bin(struct file *filp,
648                struct kobject *kobj,
649                struct bin_attribute *bin_attr,
650                char *buf, loff_t off, size_t count)
651{
652    struct device *dev = container_of(kobj, struct device, kobj);
653    struct power_supply *psy = to_power_supply(dev);
654    struct ds2781_device_info *dev_info = to_ds2781_device_info(psy);
655    int ret;
656
657    count = min_t(loff_t, count, DS2781_PARAM_EEPROM_SIZE - off);
658
659    ret = ds2781_write(dev_info, buf,
660                DS2781_EEPROM_BLOCK1_START + off, count);
661    if (ret < 0)
662        return ret;
663
664    ret = ds2781_save_eeprom(dev_info, DS2781_EEPROM_BLOCK1_START);
665    if (ret < 0)
666        return ret;
667
668    return count;
669}
670
671static struct bin_attribute ds2781_param_eeprom_bin_attr = {
672    .attr = {
673        .name = "param_eeprom",
674        .mode = S_IRUGO | S_IWUSR,
675    },
676    .size = DS2781_PARAM_EEPROM_SIZE,
677    .read = ds2781_read_param_eeprom_bin,
678    .write = ds2781_write_param_eeprom_bin,
679};
680
681static ssize_t ds2781_read_user_eeprom_bin(struct file *filp,
682                struct kobject *kobj,
683                struct bin_attribute *bin_attr,
684                char *buf, loff_t off, size_t count)
685{
686    struct device *dev = container_of(kobj, struct device, kobj);
687    struct power_supply *psy = to_power_supply(dev);
688    struct ds2781_device_info *dev_info = to_ds2781_device_info(psy);
689
690    count = min_t(loff_t, count, DS2781_USER_EEPROM_SIZE - off);
691
692    return ds2781_read_block(dev_info, buf,
693                DS2781_EEPROM_BLOCK0_START + off, count);
694
695}
696
697static ssize_t ds2781_write_user_eeprom_bin(struct file *filp,
698                struct kobject *kobj,
699                struct bin_attribute *bin_attr,
700                char *buf, loff_t off, size_t count)
701{
702    struct device *dev = container_of(kobj, struct device, kobj);
703    struct power_supply *psy = to_power_supply(dev);
704    struct ds2781_device_info *dev_info = to_ds2781_device_info(psy);
705    int ret;
706
707    count = min_t(loff_t, count, DS2781_USER_EEPROM_SIZE - off);
708
709    ret = ds2781_write(dev_info, buf,
710                DS2781_EEPROM_BLOCK0_START + off, count);
711    if (ret < 0)
712        return ret;
713
714    ret = ds2781_save_eeprom(dev_info, DS2781_EEPROM_BLOCK0_START);
715    if (ret < 0)
716        return ret;
717
718    return count;
719}
720
721static struct bin_attribute ds2781_user_eeprom_bin_attr = {
722    .attr = {
723        .name = "user_eeprom",
724        .mode = S_IRUGO | S_IWUSR,
725    },
726    .size = DS2781_USER_EEPROM_SIZE,
727    .read = ds2781_read_user_eeprom_bin,
728    .write = ds2781_write_user_eeprom_bin,
729};
730
731static DEVICE_ATTR(pmod_enabled, S_IRUGO | S_IWUSR, ds2781_get_pmod_enabled,
732    ds2781_set_pmod_enabled);
733static DEVICE_ATTR(sense_resistor_value, S_IRUGO | S_IWUSR,
734    ds2781_get_sense_resistor_value, ds2781_set_sense_resistor_value);
735static DEVICE_ATTR(rsgain_setting, S_IRUGO | S_IWUSR, ds2781_get_rsgain_setting,
736    ds2781_set_rsgain_setting);
737static DEVICE_ATTR(pio_pin, S_IRUGO | S_IWUSR, ds2781_get_pio_pin,
738    ds2781_set_pio_pin);
739
740
741static struct attribute *ds2781_attributes[] = {
742    &dev_attr_pmod_enabled.attr,
743    &dev_attr_sense_resistor_value.attr,
744    &dev_attr_rsgain_setting.attr,
745    &dev_attr_pio_pin.attr,
746    NULL
747};
748
749static const struct attribute_group ds2781_attr_group = {
750    .attrs = ds2781_attributes,
751};
752
753static int __devinit ds2781_battery_probe(struct platform_device *pdev)
754{
755    int ret = 0;
756    struct ds2781_device_info *dev_info;
757
758    dev_info = kzalloc(sizeof(*dev_info), GFP_KERNEL);
759    if (!dev_info) {
760        ret = -ENOMEM;
761        goto fail;
762    }
763
764    platform_set_drvdata(pdev, dev_info);
765
766    dev_info->dev = &pdev->dev;
767    dev_info->w1_dev = pdev->dev.parent;
768    dev_info->bat.name = dev_name(&pdev->dev);
769    dev_info->bat.type = POWER_SUPPLY_TYPE_BATTERY;
770    dev_info->bat.properties = ds2781_battery_props;
771    dev_info->bat.num_properties = ARRAY_SIZE(ds2781_battery_props);
772    dev_info->bat.get_property = ds2781_battery_get_property;
773
774    ret = power_supply_register(&pdev->dev, &dev_info->bat);
775    if (ret) {
776        dev_err(dev_info->dev, "failed to register battery\n");
777        goto fail_free_info;
778    }
779
780    ret = sysfs_create_group(&dev_info->bat.dev->kobj, &ds2781_attr_group);
781    if (ret) {
782        dev_err(dev_info->dev, "failed to create sysfs group\n");
783        goto fail_unregister;
784    }
785
786    ret = sysfs_create_bin_file(&dev_info->bat.dev->kobj,
787                    &ds2781_param_eeprom_bin_attr);
788    if (ret) {
789        dev_err(dev_info->dev,
790                "failed to create param eeprom bin file");
791        goto fail_remove_group;
792    }
793
794    ret = sysfs_create_bin_file(&dev_info->bat.dev->kobj,
795                    &ds2781_user_eeprom_bin_attr);
796    if (ret) {
797        dev_err(dev_info->dev,
798                "failed to create user eeprom bin file");
799        goto fail_remove_bin_file;
800    }
801
802    return 0;
803
804fail_remove_bin_file:
805    sysfs_remove_bin_file(&dev_info->bat.dev->kobj,
806                &ds2781_param_eeprom_bin_attr);
807fail_remove_group:
808    sysfs_remove_group(&dev_info->bat.dev->kobj, &ds2781_attr_group);
809fail_unregister:
810    power_supply_unregister(&dev_info->bat);
811fail_free_info:
812    kfree(dev_info);
813fail:
814    return ret;
815}
816
817static int __devexit ds2781_battery_remove(struct platform_device *pdev)
818{
819    struct ds2781_device_info *dev_info = platform_get_drvdata(pdev);
820
821    /* remove attributes */
822    sysfs_remove_group(&dev_info->bat.dev->kobj, &ds2781_attr_group);
823
824    power_supply_unregister(&dev_info->bat);
825
826    kfree(dev_info);
827    return 0;
828}
829
830static struct platform_driver ds2781_battery_driver = {
831    .driver = {
832        .name = "ds2781-battery",
833    },
834    .probe = ds2781_battery_probe,
835    .remove = __devexit_p(ds2781_battery_remove),
836};
837
838static int __init ds2781_battery_init(void)
839{
840    return platform_driver_register(&ds2781_battery_driver);
841}
842
843static void __exit ds2781_battery_exit(void)
844{
845    platform_driver_unregister(&ds2781_battery_driver);
846}
847
848module_init(ds2781_battery_init);
849module_exit(ds2781_battery_exit);
850
851
852MODULE_LICENSE("GPL");
853MODULE_AUTHOR("Renata Sayakhova <renata@oktetlabs.ru>");
854MODULE_DESCRIPTION("Maxim/Dallas DS2781 Stand-Alone Fuel Gauage IC driver");
855MODULE_ALIAS("platform:ds2781-battery");
856
857

Archive Download this file



interactive