power: max17042: add rbat mapping
[linux-2.6.git] / include / linux / power / max17042_battery.h
1 /*
2  * Fuel gauge driver for Maxim 17042 / 8966 / 8997
3  *  Note that Maxim 8966 and 8997 are mfd and this is its subdevice.
4  *
5  * Copyright (C) 2011 Samsung Electronics
6  * Copyright (C) 2013, NVIDIA CORPORATION.  All rights reserved.
7  * MyungJoo Ham <myungjoo.ham@samsung.com>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22  */
23
24 #ifndef __MAX17042_BATTERY_H_
25 #define __MAX17042_BATTERY_H_
26
27 #include <linux/edp.h>
28
29 #define MAX17042_STATUS_BattAbsent      (1 << 3)
30 #define MAX17042_BATTERY_FULL   (100)
31 #define MAX17042_DEFAULT_SNS_RESISTOR   (10000)
32
33 #define MAX17042_CHARACTERIZATION_DATA_SIZE 48
34
35 #define MAX_TEMP 700
36 #define MIN_TEMP -200
37
38 enum max17042_register {
39         MAX17042_STATUS         = 0x00,
40         MAX17042_VALRT_Th       = 0x01,
41         MAX17042_TALRT_Th       = 0x02,
42         MAX17042_SALRT_Th       = 0x03,
43         MAX17042_AtRate         = 0x04,
44         MAX17042_RepCap         = 0x05,
45         MAX17042_RepSOC         = 0x06,
46         MAX17042_Age            = 0x07,
47         MAX17042_TEMP           = 0x08,
48         MAX17042_VCELL          = 0x09,
49         MAX17042_Current        = 0x0A,
50         MAX17042_AvgCurrent     = 0x0B,
51
52         MAX17042_SOC            = 0x0D,
53         MAX17042_AvSOC          = 0x0E,
54         MAX17042_RemCap         = 0x0F,
55         MAX17042_FullCAP        = 0x10,
56         MAX17042_TTE            = 0x11,
57         MAX17042_V_empty        = 0x12,
58
59         MAX17042_RSLOW          = 0x14,
60
61         MAX17042_AvgTA          = 0x16,
62         MAX17042_Cycles         = 0x17,
63         MAX17042_DesignCap      = 0x18,
64         MAX17042_AvgVCELL       = 0x19,
65         MAX17042_MinMaxTemp     = 0x1A,
66         MAX17042_MinMaxVolt     = 0x1B,
67         MAX17042_MinMaxCurr     = 0x1C,
68         MAX17042_CONFIG         = 0x1D,
69         MAX17042_ICHGTerm       = 0x1E,
70         MAX17042_AvCap          = 0x1F,
71         MAX17042_ManName        = 0x20,
72         MAX17042_DevName        = 0x21,
73
74         MAX17042_FullCAPNom     = 0x23,
75         MAX17042_TempNom        = 0x24,
76         MAX17042_TempLim        = 0x25,
77         MAX17042_TempHot        = 0x26,
78         MAX17042_AIN            = 0x27,
79         MAX17042_LearnCFG       = 0x28,
80         MAX17042_FilterCFG      = 0x29,
81         MAX17042_RelaxCFG       = 0x2A,
82         MAX17042_MiscCFG        = 0x2B,
83         MAX17042_TGAIN          = 0x2C,
84         MAx17042_TOFF           = 0x2D,
85         MAX17042_CGAIN          = 0x2E,
86         MAX17042_COFF           = 0x2F,
87
88         MAX17042_MaskSOC        = 0x32,
89         MAX17042_SOC_empty      = 0x33,
90         MAX17042_T_empty        = 0x34,
91
92         MAX17042_FullCAP0       = 0x35,
93         MAX17042_LAvg_empty     = 0x36,
94         MAX17042_FCTC           = 0x37,
95         MAX17042_RCOMP0         = 0x38,
96         MAX17042_TempCo         = 0x39,
97         MAX17042_EmptyTempCo    = 0x3A,
98         MAX17042_K_empty0       = 0x3B,
99         MAX17042_TaskPeriod     = 0x3C,
100         MAX17042_FSTAT          = 0x3D,
101
102         MAX17042_SHDNTIMER      = 0x3F,
103
104         MAX17042_dQacc          = 0x45,
105         MAX17042_dPacc          = 0x46,
106
107         MAX17042_VFSOC0         = 0x48,
108
109         MAX17042_QH             = 0x4D,
110         MAX17042_QL             = 0x4E,
111
112         MAX17042_VFSOC0Enable   = 0x60,
113         MAX17042_MLOCKReg1      = 0x62,
114         MAX17042_MLOCKReg2      = 0x63,
115
116         MAX17042_MODELChrTbl    = 0x80,
117
118         MAX17042_OCV            = 0xEE,
119
120         MAX17042_OCVInternal    = 0xFB,
121
122         MAX17042_VFSOC          = 0xFF,
123 };
124
125 /* Registers specific to max17047/50 */
126 enum max17047_register {
127         MAX17047_QRTbl00        = 0x12,
128         MAX17047_FullSOCThr     = 0x13,
129         MAX17047_QRTbl10        = 0x22,
130         MAX17047_QRTbl20        = 0x32,
131         MAX17047_V_empty        = 0x3A,
132         MAX17047_QRTbl30        = 0x42,
133 };
134
135 enum max170xx_chip_type {MAX17042, MAX17047};
136
137 /*
138  * used for setting a register to a desired value
139  * addr : address for a register
140  * data : setting value for the register
141  */
142 struct max17042_reg_data {
143         u8 addr;
144         u16 data;
145 };
146
147 struct max17042_config_data {
148         /* External current sense resistor value in milli-ohms */
149         u32     cur_sense_val;
150
151         /* A/D measurement */
152         u16     tgain;          /* 0x2C */
153         u16     toff;           /* 0x2D */
154         u16     cgain;          /* 0x2E */
155         u16     coff;           /* 0x2F */
156
157         /* Alert / Status */
158         u16     valrt_thresh;   /* 0x01 */
159         u16     talrt_thresh;   /* 0x02 */
160         u16     soc_alrt_thresh;        /* 0x03 */
161         u16     config;         /* 0x01D */
162         u16     shdntimer;      /* 0x03F */
163
164         /* App data */
165         u16     full_soc_thresh;        /* 0x13 */
166         u16     design_cap;     /* 0x18 */
167         u16     ichgt_term;     /* 0x1E */
168
169         /* MG3 config */
170         u16     at_rate;        /* 0x04 */
171         u16     learn_cfg;      /* 0x28 */
172         u16     filter_cfg;     /* 0x29 */
173         u16     relax_cfg;      /* 0x2A */
174         u16     misc_cfg;       /* 0x2B */
175         u16     masksoc;        /* 0x32 */
176
177         /* MG3 save and restore */
178         u16     fullcap;        /* 0x10 */
179         u16     fullcapnom;     /* 0x23 */
180         u16     socempty;       /* 0x33 */
181         u16     lavg_empty;     /* 0x36 */
182         u16     dqacc;          /* 0x45 */
183         u16     dpacc;          /* 0x46 */
184         u16     qrtbl00;        /* 0x12 */
185         u16     qrtbl10;        /* 0x22 */
186         u16     qrtbl20;        /* 0x32 */
187         u16     qrtbl30;        /* 0x42 */
188
189         /* Cell technology from power_supply.h */
190         u16     cell_technology;
191
192         /* Cell Data */
193         u16     vempty;         /* 0x12 */
194         u16     temp_nom;       /* 0x24 */
195         u16     temp_lim;       /* 0x25 */
196         u16     fctc;           /* 0x37 */
197         u16     rcomp0;         /* 0x38 */
198         u16     tcompc0;        /* 0x39 */
199         u16     empty_tempco;   /* 0x3A */
200         u16     kempty0;        /* 0x3B */
201         u16     cell_char_tbl[MAX17042_CHARACTERIZATION_DATA_SIZE];
202 } __packed;
203
204 struct max17042_rbat_map {
205         unsigned int capacity;
206         unsigned int rbat;
207 };
208
209 struct max17042_platform_data {
210         struct max17042_reg_data *init_data;
211         struct max17042_config_data *config_data;
212         int num_init_data; /* Number of enties in init_data array */
213         bool enable_current_sense;
214         bool enable_por_init; /* Use POR init from Maxim appnote */
215
216         /*
217          * R_sns in micro-ohms.
218          * default 10000 (if r_sns = 0) as it is the recommended value by
219          * the datasheet although it can be changed by board designers.
220          */
221         unsigned int r_sns;
222
223         struct max17042_rbat_map *rbat_map;
224         struct edp_client *edp_client;
225 };
226
227 #ifdef CONFIG_BATTERY_MAX17042
228 extern int maxim_get_temp(void);
229 extern void max17042_update_status(int status);
230 #else
231 static inline int maxim_get_temp(void) { return -ENODEV; }
232 static inline void max17042_update_status(int status) {}
233 #endif
234 #endif /* __MAX17042_BATTERY_H_ */