blob: 5da80d95e43932d28cf69b820005ac40a8157995 [file] [log] [blame]
Siddartha Mohanadoss17607d22011-10-05 10:36:20 -07001/*
2 * Copyright (c) 2011, Code Aurora Forum. All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 and
6 * only version 2 as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * Qualcomm's PM8921/PM8018 ADC Arbiter driver
14 */
15#define pr_fmt(fmt) "%s: " fmt, __func__
16
17#include <linux/kernel.h>
18#include <linux/err.h>
19#include <linux/init.h>
20#include <linux/slab.h>
21#include <linux/delay.h>
22#include <linux/mutex.h>
23#include <linux/hwmon.h>
24#include <linux/module.h>
25#include <linux/debugfs.h>
26#include <linux/wakelock.h>
27#include <linux/interrupt.h>
28#include <linux/completion.h>
29#include <linux/hwmon-sysfs.h>
30#include <linux/mfd/pm8xxx/mpp.h>
31#include <linux/platform_device.h>
32#include <linux/mfd/pm8xxx/core.h>
33#include <linux/regulator/consumer.h>
34#include <linux/mfd/pm8xxx/pm8xxx-adc.h>
35
36/* User Bank register set */
37#define PM8XXX_ADC_ARB_USRP_CNTRL1 0x197
38#define PM8XXX_ADC_ARB_USRP_CNTRL1_EN_ARB BIT(0)
39#define PM8XXX_ADC_ARB_USRP_CNTRL1_RSV1 BIT(1)
40#define PM8XXX_ADC_ARB_USRP_CNTRL1_RSV2 BIT(2)
41#define PM8XXX_ADC_ARB_USRP_CNTRL1_RSV3 BIT(3)
42#define PM8XXX_ADC_ARB_USRP_CNTRL1_RSV4 BIT(4)
43#define PM8XXX_ADC_ARB_USRP_CNTRL1_RSV5 BIT(5)
44#define PM8XXX_ADC_ARB_USRP_CNTRL1_EOC BIT(6)
45#define PM8XXX_ADC_ARB_USRP_CNTRL1_REQ BIT(7)
46
47#define PM8XXX_ADC_ARB_USRP_AMUX_CNTRL 0x198
48#define PM8XXX_ADC_ARB_USRP_AMUX_CNTRL_RSV0 BIT(0)
49#define PM8XXX_ADC_ARB_USRP_AMUX_CNTRL_RSV1 BIT(1)
50#define PM8XXX_ADC_ARB_USRP_AMUX_CNTRL_PREMUX0 BIT(2)
51#define PM8XXX_ADC_ARB_USRP_AMUX_CNTRL_PREMUX1 BIT(3)
52#define PM8XXX_ADC_ARB_USRP_AMUX_CNTRL_SEL0 BIT(4)
53#define PM8XXX_ADC_ARB_USRP_AMUX_CNTRL_SEL1 BIT(5)
54#define PM8XXX_ADC_ARB_USRP_AMUX_CNTRL_SEL2 BIT(6)
55#define PM8XXX_ADC_ARB_USRP_AMUX_CNTRL_SEL3 BIT(7)
56
57#define PM8XXX_ADC_ARB_USRP_ANA_PARAM 0x199
58#define PM8XXX_ADC_ARB_USRP_DIG_PARAM 0x19A
59#define PM8XXX_ADC_ARB_USRP_DIG_PARAM_SEL_SHIFT0 BIT(0)
60#define PM8XXX_ADC_ARB_USRP_DIG_PARAM_SEL_SHIFT1 BIT(1)
61#define PM8XXX_ADC_ARB_USRP_DIG_PARAM_CLK_RATE0 BIT(2)
62#define PM8XXX_ADC_ARB_USRP_DIG_PARAM_CLK_RATE1 BIT(3)
63#define PM8XXX_ADC_ARB_USRP_DIG_PARAM_EOC BIT(4)
64#define PM8XXX_ADC_ARB_USRP_DIG_PARAM_DEC_RATE0 BIT(5)
65#define PM8XXX_ADC_ARB_USRP_DIG_PARAM_DEC_RATE1 BIT(6)
66#define PM8XXX_ADC_ARB_USRP_DIG_PARAM_EN BIT(7)
67
68#define PM8XXX_ADC_ARB_USRP_RSV 0x19B
69#define PM8XXX_ADC_ARB_USRP_RSV_RST BIT(0)
70#define PM8XXX_ADC_ARB_USRP_RSV_DTEST0 BIT(1)
71#define PM8XXX_ADC_ARB_USRP_RSV_DTEST1 BIT(2)
72#define PM8XXX_ADC_ARB_USRP_RSV_OP BIT(3)
73#define PM8XXX_ADC_ARB_USRP_RSV_IP_SEL0 BIT(4)
74#define PM8XXX_ADC_ARB_USRP_RSV_IP_SEL1 BIT(5)
75#define PM8XXX_ADC_ARB_USRP_RSV_IP_SEL2 BIT(6)
76#define PM8XXX_ADC_ARB_USRP_RSV_TRM BIT(7)
77
78#define PM8XXX_ADC_ARB_USRP_DATA0 0x19D
79#define PM8XXX_ADC_ARB_USRP_DATA1 0x19C
80
81#define PM8XXX_ADC_ARB_BTM_CNTRL1 0x17e
82#define PM8XXX_ADC_ARB_BTM_CNTRL1_EN_BTM BIT(0)
83#define PM8XXX_ADC_ARB_BTM_CNTRL1_SEL_OP_MODE BIT(1)
84#define PM8XXX_ADC_ARB_BTM_CNTRL1_MEAS_INTERVAL1 BIT(2)
85#define PM8XXX_ADC_ARB_BTM_CNTRL1_MEAS_INTERVAL2 BIT(3)
86#define PM8XXX_ADC_ARB_BTM_CNTRL1_MEAS_INTERVAL3 BIT(4)
87#define PM8XXX_ADC_ARB_BTM_CNTRL1_MEAS_INTERVAL4 BIT(5)
88#define PM8XXX_ADC_ARB_BTM_CNTRL1_EOC BIT(6)
89#define PM8XXX_ADC_ARB_BTM_CNTRL1_REQ BIT(7)
90
91#define PM8XXX_ADC_ARB_BTM_CNTRL2 0x18c
92#define PM8XXX_ADC_ARB_BTM_AMUX_CNTRL 0x17f
93#define PM8XXX_ADC_ARB_BTM_ANA_PARAM 0x180
94#define PM8XXX_ADC_ARB_BTM_DIG_PARAM 0x181
95#define PM8XXX_ADC_ARB_BTM_RSV 0x182
96#define PM8XXX_ADC_ARB_BTM_DATA1 0x183
97#define PM8XXX_ADC_ARB_BTM_DATA0 0x184
98#define PM8XXX_ADC_ARB_BTM_BAT_COOL_THR1 0x185
99#define PM8XXX_ADC_ARB_BTM_BAT_COOL_THR0 0x186
100#define PM8XXX_ADC_ARB_BTM_BAT_WARM_THR1 0x187
101#define PM8XXX_ADC_ARB_BTM_BAT_WARM_THR0 0x188
102
103#define PM8XXX_ADC_ARB_ANA_DIG 0xa0
104#define PM8XXX_ADC_BTM_RSV 0x10
105#define PM8XXX_ADC_AMUX_MPP_SEL 2
106#define PM8XXX_ADC_AMUX_SEL 4
107#define PM8XXX_ADC_RSV_IP_SEL 4
108#define PM8XXX_ADC_BTM_CHANNEL_SEL 4
109#define PM8XXX_MAX_CHANNEL_PROPERTIES 2
110#define PM8XXX_ADC_IRQ_0 0
111#define PM8XXX_ADC_IRQ_1 1
112#define PM8XXX_ADC_IRQ_2 2
113#define PM8XXX_ADC_BTM_INTERVAL_SEL_MASK 0xF
114#define PM8XXX_ADC_BTM_INTERVAL_SEL_SHIFT 2
115#define PM8XXX_ADC_BTM_DECIMATION_SEL 5
116#define PM8XXX_ADC_MUL 10
117#define PM8XXX_ADC_CONV_TIME_MIN 2000
118#define PM8XXX_ADC_CONV_TIME_MAX 2100
119#define PM8XXX_ADC_MPP_SETTLE_TIME_MIN 200
120#define PM8XXX_ADC_MPP_SETTLE_TIME_MAX 200
121#define PM8XXX_ADC_PA_THERM_VREG_UV_MIN 1800000
122#define PM8XXX_ADC_PA_THERM_VREG_UV_MAX 1800000
123#define PM8XXX_ADC_PA_THERM_VREG_UA_LOAD 100000
Siddartha Mohanadossae39c902011-11-09 17:54:31 -0800124#define PM8XXX_ADC_HWMON_NAME_LENGTH 32
Siddartha Mohanadoss17607d22011-10-05 10:36:20 -0700125
126struct pm8xxx_adc {
127 struct device *dev;
128 struct pm8xxx_adc_properties *adc_prop;
129 int adc_irq;
130 struct mutex adc_lock;
131 struct mutex mpp_adc_lock;
132 spinlock_t btm_lock;
133 uint32_t adc_num_channel;
134 uint32_t adc_num_board_channel;
135 struct completion adc_rslt_completion;
136 struct pm8xxx_adc_amux *adc_channel;
137 int btm_warm_irq;
138 int btm_cool_irq;
139 struct dentry *dent;
140 struct work_struct warm_work;
141 struct work_struct cool_work;
142 uint32_t mpp_base;
143 struct device *hwmon;
144 struct wake_lock adc_wakelock;
145 int msm_suspend_check;
146 struct pm8xxx_adc_amux_properties *conv;
147 struct pm8xxx_adc_arb_btm_param batt[0];
148 struct sensor_device_attribute sens_attr[0];
149};
150
151struct pm8xxx_adc_amux_properties {
152 uint32_t amux_channel;
153 uint32_t decimation;
154 uint32_t amux_ip_rsv;
155 uint32_t amux_mpp_channel;
156 struct pm8xxx_adc_chan_properties chan_prop[0];
157};
158
159static const struct pm8xxx_adc_scaling_ratio pm8xxx_amux_scaling_ratio[] = {
160 {1, 1},
161 {1, 3},
162 {1, 4},
163 {1, 6}
164};
165
166static struct pm8xxx_adc *pmic_adc;
167
168static struct pm8xxx_adc_scale_fn adc_scale_fn[] = {
169 [ADC_SCALE_DEFAULT] = {pm8xxx_adc_scale_default},
170 [ADC_SCALE_BATT_THERM] = {pm8xxx_adc_scale_batt_therm},
171 [ADC_SCALE_PA_THERM] = {pm8xxx_adc_scale_pa_therm},
172 [ADC_SCALE_PMIC_THERM] = {pm8xxx_adc_scale_pmic_therm},
173 [ADC_SCALE_XOTHERM] = {pm8xxx_adc_tdkntcg_therm},
174};
175
176/* On PM8921 ADC the MPP needs to first be configured
177as an analog input to the AMUX pre-mux channel before
178issuing a read request. PM8921 MPP 8 is mapped to AMUX8
179and is common between remote processor's.
180On PM8018 ADC the MPP is directly connected to the AMUX
181pre-mux. Therefore clients of the PM8018 MPP do not need
182to configure the MPP as an analog input to the pre-mux.
183Clients can directly issue request on the pre-mux AMUX
184channel to read the ADC on the MPP */
185static struct pm8xxx_mpp_config_data pm8xxx_adc_mpp_config = {
186 .type = PM8XXX_MPP_TYPE_A_INPUT,
187 /* AMUX6 is dedicated to be used for apps processor */
188 .level = PM8XXX_MPP_AIN_AMUX_CH6,
189 .control = PM8XXX_MPP_AOUT_CTRL_DISABLE,
190};
191
192/* MPP Configuration for default settings */
193static struct pm8xxx_mpp_config_data pm8xxx_adc_mpp_unconfig = {
194 .type = PM8XXX_MPP_TYPE_SINK,
195 .level = PM8XXX_MPP_AIN_AMUX_CH5,
196 .control = PM8XXX_MPP_AOUT_CTRL_DISABLE,
197};
198
199static bool pm8xxx_adc_calib_first_adc;
200static bool pm8xxx_adc_initialized, pm8xxx_adc_calib_device_init;
201
202static int32_t pm8xxx_adc_arb_cntrl(uint32_t arb_cntrl,
203 uint32_t channel)
204{
205 struct pm8xxx_adc *adc_pmic = pmic_adc;
206 int i, rc;
207 u8 data_arb_cntrl = 0;
208
209 if (arb_cntrl) {
210 if (adc_pmic->msm_suspend_check)
211 pr_err("PM8xxx ADC request made after suspend_noirq "
212 "with channel: %d\n", channel);
213 data_arb_cntrl |= PM8XXX_ADC_ARB_USRP_CNTRL1_EN_ARB;
214 wake_lock(&adc_pmic->adc_wakelock);
215 }
216
217 /* Write twice to the CNTRL register for the arbiter settings
218 to take into effect */
219 for (i = 0; i < 2; i++) {
220 rc = pm8xxx_writeb(adc_pmic->dev->parent,
221 PM8XXX_ADC_ARB_USRP_CNTRL1, data_arb_cntrl);
222 if (rc < 0) {
223 pr_err("PM8xxx arb cntrl write failed with %d\n", rc);
224 return rc;
225 }
226 }
227
228 if (arb_cntrl) {
229 data_arb_cntrl |= PM8XXX_ADC_ARB_USRP_CNTRL1_REQ;
230 rc = pm8xxx_writeb(adc_pmic->dev->parent,
231 PM8XXX_ADC_ARB_USRP_CNTRL1, data_arb_cntrl);
232 } else
233 wake_unlock(&adc_pmic->adc_wakelock);
234
235 return 0;
236}
237
238static int32_t pm8xxx_adc_patherm_power(bool on)
239{
240 static struct regulator *pa_therm;
241 struct pm8xxx_adc *adc_pmic = pmic_adc;
242 int rc = 0;
243 if (on) {
244 pa_therm = regulator_get(adc_pmic->dev,
245 "pa_therm");
246 if (IS_ERR(pa_therm)) {
247 rc = PTR_ERR(pa_therm);
248 pr_err("failed to request pa_therm vreg "
249 "with error %d\n", rc);
250 return rc;
251 }
252
253 rc = regulator_set_voltage(pa_therm,
254 PM8XXX_ADC_PA_THERM_VREG_UV_MIN,
255 PM8XXX_ADC_PA_THERM_VREG_UV_MAX);
256 if (rc < 0) {
257 pr_err("failed to set the voltage for "
258 "pa_therm with error %d\n", rc);
259 goto fail;
260 }
261
262 rc = regulator_set_optimum_mode(pa_therm,
263 PM8XXX_ADC_PA_THERM_VREG_UA_LOAD);
264 if (rc < 0) {
265 pr_err("failed to set optimum mode for "
266 "pa_therm with error %d\n", rc);
267 goto fail;
268 }
269
270 if (regulator_enable(pa_therm)) {
271 pr_err("failed to enable pa_therm vreg with "
272 "error %d\n", rc);
273 goto fail;
274 }
275 } else {
276 if (pa_therm != NULL) {
277 regulator_disable(pa_therm);
278 regulator_put(pa_therm);
279 }
280 }
281
282 return rc;
283fail:
284 regulator_put(pa_therm);
285 return rc;
286}
287
288static int32_t pm8xxx_adc_channel_power_enable(uint32_t channel,
289 bool power_cntrl)
290{
291 int rc = 0;
292
293 switch (channel)
294 case ADC_MPP_1_AMUX8:
295 pm8xxx_adc_patherm_power(power_cntrl);
296
297 return rc;
298}
299
300
301static uint32_t pm8xxx_adc_read_reg(uint32_t reg, u8 *data)
302{
303 struct pm8xxx_adc *adc_pmic = pmic_adc;
304 int rc;
305
306 rc = pm8xxx_readb(adc_pmic->dev->parent, reg, data);
307 if (rc < 0) {
308 pr_err("PM8xxx adc read reg %d failed with %d\n", reg, rc);
309 return rc;
310 }
311
312 return 0;
313}
314
315static uint32_t pm8xxx_adc_write_reg(uint32_t reg, u8 data)
316{
317 struct pm8xxx_adc *adc_pmic = pmic_adc;
318 int rc;
319
320 rc = pm8xxx_writeb(adc_pmic->dev->parent, reg, data);
321 if (rc < 0) {
322 pr_err("PM8xxx adc write reg %d failed with %d\n", reg, rc);
323 return rc;
324 }
325
326 return 0;
327}
328
329static int32_t pm8xxx_adc_configure(
330 struct pm8xxx_adc_amux_properties *chan_prop)
331{
332 struct pm8xxx_adc *adc_pmic = pmic_adc;
333 u8 data_amux_chan = 0, data_arb_rsv = 0, data_dig_param = 0;
334 int rc;
335
336 data_amux_chan |= chan_prop->amux_channel << PM8XXX_ADC_AMUX_SEL;
337
338 if (chan_prop->amux_mpp_channel)
339 data_amux_chan |= chan_prop->amux_mpp_channel <<
340 PM8XXX_ADC_AMUX_MPP_SEL;
341
342 rc = pm8xxx_adc_write_reg(PM8XXX_ADC_ARB_USRP_AMUX_CNTRL,
343 data_amux_chan);
344 if (rc < 0)
345 return rc;
346
347 data_arb_rsv &= (PM8XXX_ADC_ARB_USRP_RSV_RST |
348 PM8XXX_ADC_ARB_USRP_RSV_DTEST0 |
349 PM8XXX_ADC_ARB_USRP_RSV_DTEST1 |
350 PM8XXX_ADC_ARB_USRP_RSV_OP |
351 PM8XXX_ADC_ARB_USRP_RSV_TRM);
352 data_arb_rsv |= chan_prop->amux_ip_rsv << PM8XXX_ADC_RSV_IP_SEL;
353
354 rc = pm8xxx_adc_write_reg(PM8XXX_ADC_ARB_USRP_RSV, data_arb_rsv);
355 if (rc < 0)
356 return rc;
357
358 rc = pm8xxx_adc_read_reg(PM8XXX_ADC_ARB_USRP_DIG_PARAM,
359 &data_dig_param);
360 if (rc < 0)
361 return rc;
362
363 /* Default 2.4Mhz clock rate */
364 /* Client chooses the decimation */
365 switch (chan_prop->decimation) {
366 case ADC_DECIMATION_TYPE1:
367 data_dig_param |= PM8XXX_ADC_ARB_USRP_DIG_PARAM_DEC_RATE0;
368 break;
369 case ADC_DECIMATION_TYPE2:
370 data_dig_param |= (PM8XXX_ADC_ARB_USRP_DIG_PARAM_DEC_RATE0
371 | PM8XXX_ADC_ARB_USRP_DIG_PARAM_DEC_RATE1);
372 break;
373 default:
374 data_dig_param |= PM8XXX_ADC_ARB_USRP_DIG_PARAM_DEC_RATE0;
375 break;
376 }
377 rc = pm8xxx_adc_write_reg(PM8XXX_ADC_ARB_USRP_DIG_PARAM,
378 PM8XXX_ADC_ARB_ANA_DIG);
379 if (rc < 0)
380 return rc;
381
382 rc = pm8xxx_adc_write_reg(PM8XXX_ADC_ARB_USRP_ANA_PARAM,
383 PM8XXX_ADC_ARB_ANA_DIG);
384 if (rc < 0)
385 return rc;
386
387 if (!pm8xxx_adc_calib_first_adc)
388 enable_irq(adc_pmic->adc_irq);
389
390 rc = pm8xxx_adc_arb_cntrl(1, data_amux_chan);
391 if (rc < 0) {
392 pr_err("Configuring ADC Arbiter"
393 "enable failed with %d\n", rc);
394 return rc;
395 }
396
397 return 0;
398}
399
400static uint32_t pm8xxx_adc_read_adc_code(int32_t *data)
401{
402 struct pm8xxx_adc *adc_pmic = pmic_adc;
403 uint8_t rslt_lsb, rslt_msb;
404 int32_t rc, max_ideal_adc_code = 1 << adc_pmic->adc_prop->bitresolution;
405
406 rc = pm8xxx_readb(adc_pmic->dev->parent,
407 PM8XXX_ADC_ARB_USRP_DATA0, &rslt_lsb);
408 if (rc < 0) {
409 pr_err("PM8xxx adc result read failed with %d\n", rc);
410 return rc;
411 }
412
413 rc = pm8xxx_readb(adc_pmic->dev->parent,
414 PM8XXX_ADC_ARB_USRP_DATA1, &rslt_msb);
415 if (rc < 0) {
416 pr_err("PM8xxx adc result read failed with %d\n", rc);
417 return rc;
418 }
419
420 *data = (rslt_msb << 8) | rslt_lsb;
421
422 /* Use the midpoint to determine underflow or overflow */
423 if (*data > max_ideal_adc_code + (max_ideal_adc_code >> 1))
424 *data |= ((1 << (8 * sizeof(*data) -
425 adc_pmic->adc_prop->bitresolution)) - 1) <<
426 adc_pmic->adc_prop->bitresolution;
427
428 /* Default value for switching off the arbiter after reading
429 the ADC value. Bit 0 set to 0. */
430 rc = pm8xxx_adc_arb_cntrl(0, CHANNEL_NONE);
431 if (rc < 0) {
432 pr_err("%s: Configuring ADC Arbiter disable"
433 "failed\n", __func__);
434 return rc;
435 }
436
437 return 0;
438}
439
440static void pm8xxx_adc_btm_warm_scheduler_fn(struct work_struct *work)
441{
442 struct pm8xxx_adc *adc_pmic = container_of(work, struct pm8xxx_adc,
443 warm_work);
444 unsigned long flags = 0;
445 bool warm_status;
446
447 spin_lock_irqsave(&adc_pmic->btm_lock, flags);
448 warm_status = irq_read_line(adc_pmic->btm_warm_irq);
449 if (adc_pmic->batt->btm_warm_fn != NULL)
450 adc_pmic->batt->btm_warm_fn(warm_status);
451 spin_unlock_irqrestore(&adc_pmic->btm_lock, flags);
452}
453
454static void pm8xxx_adc_btm_cool_scheduler_fn(struct work_struct *work)
455{
456 struct pm8xxx_adc *adc_pmic = container_of(work, struct pm8xxx_adc,
457 cool_work);
458 unsigned long flags = 0;
459 bool cool_status;
460
461 spin_lock_irqsave(&adc_pmic->btm_lock, flags);
462 cool_status = irq_read_line(adc_pmic->btm_cool_irq);
463 if (adc_pmic->batt->btm_cool_fn != NULL)
464 adc_pmic->batt->btm_cool_fn(cool_status);
465 spin_unlock_irqrestore(&adc_pmic->btm_lock, flags);
466}
467
468static irqreturn_t pm8xxx_adc_isr(int irq, void *dev_id)
469{
470 struct pm8xxx_adc *adc_8xxx = dev_id;
471
472 disable_irq_nosync(adc_8xxx->adc_irq);
473
474 if (pm8xxx_adc_calib_first_adc)
475 return IRQ_HANDLED;
476 /* TODO Handle spurius interrupt condition */
477 complete(&adc_8xxx->adc_rslt_completion);
478
479 return IRQ_HANDLED;
480}
481
482static irqreturn_t pm8xxx_btm_warm_isr(int irq, void *dev_id)
483{
484 struct pm8xxx_adc *btm_8xxx = dev_id;
485
486 schedule_work(&btm_8xxx->warm_work);
487
488 return IRQ_HANDLED;
489}
490
491static irqreturn_t pm8xxx_btm_cool_isr(int irq, void *dev_id)
492{
493 struct pm8xxx_adc *btm_8xxx = dev_id;
494
495 schedule_work(&btm_8xxx->cool_work);
496
497 return IRQ_HANDLED;
498}
499
500static uint32_t pm8xxx_adc_calib_device(void)
501{
502 struct pm8xxx_adc *adc_pmic = pmic_adc;
503 struct pm8xxx_adc_amux_properties conv;
504 int rc, offset_adc, slope_adc, calib_read_1, calib_read_2;
505 u8 data_arb_usrp_cntrl1 = 0;
506
507 conv.amux_channel = CHANNEL_125V;
508 conv.decimation = ADC_DECIMATION_TYPE2;
509 conv.amux_ip_rsv = AMUX_RSV1;
510 conv.amux_mpp_channel = PREMUX_MPP_SCALE_0;
511 pm8xxx_adc_calib_first_adc = true;
512 rc = pm8xxx_adc_configure(&conv);
513 if (rc) {
514 pr_err("pm8xxx_adc configure failed with %d\n", rc);
515 goto calib_fail;
516 }
517
518 while (data_arb_usrp_cntrl1 != (PM8XXX_ADC_ARB_USRP_CNTRL1_EOC |
519 PM8XXX_ADC_ARB_USRP_CNTRL1_EN_ARB)) {
520 rc = pm8xxx_adc_read_reg(PM8XXX_ADC_ARB_USRP_CNTRL1,
521 &data_arb_usrp_cntrl1);
522 if (rc < 0)
523 return rc;
524 usleep_range(PM8XXX_ADC_CONV_TIME_MIN,
525 PM8XXX_ADC_CONV_TIME_MAX);
526 }
527 data_arb_usrp_cntrl1 = 0;
528
529 rc = pm8xxx_adc_read_adc_code(&calib_read_1);
530 if (rc) {
531 pr_err("pm8xxx_adc read adc failed with %d\n", rc);
532 pm8xxx_adc_calib_first_adc = false;
533 goto calib_fail;
534 }
535 pm8xxx_adc_calib_first_adc = false;
536
537 conv.amux_channel = CHANNEL_625MV;
538 conv.decimation = ADC_DECIMATION_TYPE2;
539 conv.amux_ip_rsv = AMUX_RSV1;
540 conv.amux_mpp_channel = PREMUX_MPP_SCALE_0;
541 pm8xxx_adc_calib_first_adc = true;
542 rc = pm8xxx_adc_configure(&conv);
543 if (rc) {
544 pr_err("pm8xxx_adc configure failed with %d\n", rc);
545 goto calib_fail;
546 }
547
548 while (data_arb_usrp_cntrl1 != (PM8XXX_ADC_ARB_USRP_CNTRL1_EOC |
549 PM8XXX_ADC_ARB_USRP_CNTRL1_EN_ARB)) {
550 rc = pm8xxx_adc_read_reg(PM8XXX_ADC_ARB_USRP_CNTRL1,
551 &data_arb_usrp_cntrl1);
552 if (rc < 0)
553 return rc;
554 usleep_range(PM8XXX_ADC_CONV_TIME_MIN,
555 PM8XXX_ADC_CONV_TIME_MAX);
556 }
557 data_arb_usrp_cntrl1 = 0;
558
559 rc = pm8xxx_adc_read_adc_code(&calib_read_2);
560 if (rc) {
561 pr_err("pm8xxx_adc read adc failed with %d\n", rc);
562 pm8xxx_adc_calib_first_adc = false;
563 goto calib_fail;
564 }
565 pm8xxx_adc_calib_first_adc = false;
566
567 slope_adc = (((calib_read_1 - calib_read_2) << PM8XXX_ADC_MUL)/
568 PM8XXX_CHANNEL_ADC_625_MV);
569 offset_adc = calib_read_2 -
570 ((slope_adc * PM8XXX_CHANNEL_ADC_625_MV) >>
571 PM8XXX_ADC_MUL);
572
573 adc_pmic->conv->chan_prop->adc_graph[ADC_CALIB_ABSOLUTE].offset
574 = offset_adc;
575 adc_pmic->conv->chan_prop->adc_graph[ADC_CALIB_ABSOLUTE].dy =
576 (calib_read_1 - calib_read_2);
577 adc_pmic->conv->chan_prop->adc_graph[ADC_CALIB_ABSOLUTE].dx
578 = PM8XXX_CHANNEL_ADC_625_MV;
579 rc = pm8xxx_adc_arb_cntrl(0, CHANNEL_NONE);
580 if (rc < 0) {
581 pr_err("%s: Configuring ADC Arbiter disable"
582 "failed\n", __func__);
583 return rc;
584 }
585 /* Ratiometric Calibration */
586 conv.amux_channel = CHANNEL_MUXOFF;
587 conv.decimation = ADC_DECIMATION_TYPE2;
588 conv.amux_ip_rsv = AMUX_RSV5;
589 conv.amux_mpp_channel = PREMUX_MPP_SCALE_0;
590 pm8xxx_adc_calib_first_adc = true;
591 rc = pm8xxx_adc_configure(&conv);
592 if (rc) {
593 pr_err("pm8xxx_adc configure failed with %d\n", rc);
594 goto calib_fail;
595 }
596
597 while (data_arb_usrp_cntrl1 != (PM8XXX_ADC_ARB_USRP_CNTRL1_EOC |
598 PM8XXX_ADC_ARB_USRP_CNTRL1_EN_ARB)) {
599 rc = pm8xxx_adc_read_reg(PM8XXX_ADC_ARB_USRP_CNTRL1,
600 &data_arb_usrp_cntrl1);
601 if (rc < 0)
602 return rc;
603 usleep_range(PM8XXX_ADC_CONV_TIME_MIN,
604 PM8XXX_ADC_CONV_TIME_MAX);
605 }
606 data_arb_usrp_cntrl1 = 0;
607
608 rc = pm8xxx_adc_read_adc_code(&calib_read_1);
609 if (rc) {
610 pr_err("pm8xxx_adc read adc failed with %d\n", rc);
611 pm8xxx_adc_calib_first_adc = false;
612 goto calib_fail;
613 }
614 pm8xxx_adc_calib_first_adc = false;
615
616 conv.amux_channel = CHANNEL_MUXOFF;
617 conv.decimation = ADC_DECIMATION_TYPE2;
618 conv.amux_ip_rsv = AMUX_RSV4;
619 conv.amux_mpp_channel = PREMUX_MPP_SCALE_0;
620 pm8xxx_adc_calib_first_adc = true;
621 rc = pm8xxx_adc_configure(&conv);
622 if (rc) {
623 pr_err("pm8xxx_adc configure failed with %d\n", rc);
624 goto calib_fail;
625 }
626
627 while (data_arb_usrp_cntrl1 != (PM8XXX_ADC_ARB_USRP_CNTRL1_EOC |
628 PM8XXX_ADC_ARB_USRP_CNTRL1_EN_ARB)) {
629 rc = pm8xxx_adc_read_reg(PM8XXX_ADC_ARB_USRP_CNTRL1,
630 &data_arb_usrp_cntrl1);
631 if (rc < 0)
632 return rc;
633 usleep_range(PM8XXX_ADC_CONV_TIME_MIN,
634 PM8XXX_ADC_CONV_TIME_MAX);
635 }
636 data_arb_usrp_cntrl1 = 0;
637
638 rc = pm8xxx_adc_read_adc_code(&calib_read_2);
639 if (rc) {
640 pr_err("pm8xxx_adc read adc failed with %d\n", rc);
641 pm8xxx_adc_calib_first_adc = false;
642 goto calib_fail;
643 }
644 pm8xxx_adc_calib_first_adc = false;
645
646 slope_adc = (((calib_read_1 - calib_read_2) << PM8XXX_ADC_MUL)/
647 adc_pmic->adc_prop->adc_vdd_reference);
648 offset_adc = calib_read_2 -
649 ((slope_adc * adc_pmic->adc_prop->adc_vdd_reference)
650 >> PM8XXX_ADC_MUL);
651
652 adc_pmic->conv->chan_prop->adc_graph[ADC_CALIB_RATIOMETRIC].offset
653 = offset_adc;
654 adc_pmic->conv->chan_prop->adc_graph[ADC_CALIB_RATIOMETRIC].dy =
655 (calib_read_1 - calib_read_2);
656 adc_pmic->conv->chan_prop->adc_graph[ADC_CALIB_RATIOMETRIC].dx =
657 adc_pmic->adc_prop->adc_vdd_reference;
Siddartha Mohanadossae39c902011-11-09 17:54:31 -0800658 adc_pmic->conv->chan_prop->adc_graph[ADC_CALIB_RATIOMETRIC].adc_vref =
659 calib_read_1;
660 adc_pmic->conv->chan_prop->adc_graph[ADC_CALIB_RATIOMETRIC].adc_gnd =
661 calib_read_2;
Siddartha Mohanadoss17607d22011-10-05 10:36:20 -0700662calib_fail:
663 rc = pm8xxx_adc_arb_cntrl(0, CHANNEL_NONE);
664 if (rc < 0) {
665 pr_err("%s: Configuring ADC Arbiter disable"
666 "failed\n", __func__);
667 }
668
669 return rc;
670}
671
672uint32_t pm8xxx_adc_read(enum pm8xxx_adc_channels channel,
673 struct pm8xxx_adc_chan_result *result)
674{
675 struct pm8xxx_adc *adc_pmic = pmic_adc;
676 int i = 0, rc = 0, rc_fail, amux_prescaling, scale_type;
677 enum pm8xxx_adc_premux_mpp_scale_type mpp_scale;
678
679 if (!pm8xxx_adc_initialized)
680 return -ENODEV;
681
682 if (!pm8xxx_adc_calib_device_init) {
683 if (pm8xxx_adc_calib_device() == 0)
684 pm8xxx_adc_calib_device_init = true;
685 }
686
687 mutex_lock(&adc_pmic->adc_lock);
688
689 for (i = 0; i < adc_pmic->adc_num_channel; i++) {
690 if (channel == adc_pmic->adc_channel[i].channel_name)
691 break;
692 }
693
694 if (i == adc_pmic->adc_num_channel) {
695 rc = -EBADF;
696 goto fail_unlock;
697 }
698
699 if (channel < PM8XXX_CHANNEL_MPP_SCALE1_IDX) {
700 mpp_scale = PREMUX_MPP_SCALE_0;
701 adc_pmic->conv->amux_channel = channel;
Siddartha Mohanadossae39c902011-11-09 17:54:31 -0800702 } else if (channel >= PM8XXX_CHANNEL_MPP_SCALE1_IDX &&
703 channel < PM8XXX_CHANNEL_MPP_SCALE3_IDX) {
Siddartha Mohanadoss17607d22011-10-05 10:36:20 -0700704 mpp_scale = PREMUX_MPP_SCALE_1;
705 adc_pmic->conv->amux_channel = channel %
706 PM8XXX_CHANNEL_MPP_SCALE1_IDX;
Siddartha Mohanadossae39c902011-11-09 17:54:31 -0800707 } else {
Siddartha Mohanadoss17607d22011-10-05 10:36:20 -0700708 mpp_scale = PREMUX_MPP_SCALE_1_DIV3;
709 adc_pmic->conv->amux_channel = channel %
710 PM8XXX_CHANNEL_MPP_SCALE3_IDX;
711 }
712
713 adc_pmic->conv->amux_mpp_channel = mpp_scale;
714 adc_pmic->conv->amux_ip_rsv = adc_pmic->adc_channel[i].adc_rsv;
715 adc_pmic->conv->decimation = adc_pmic->adc_channel[i].adc_decimation;
716 amux_prescaling = adc_pmic->adc_channel[i].chan_path_prescaling;
717
718 adc_pmic->conv->chan_prop->offset_gain_numerator =
719 pm8xxx_amux_scaling_ratio[amux_prescaling].num;
720 adc_pmic->conv->chan_prop->offset_gain_denominator =
721 pm8xxx_amux_scaling_ratio[amux_prescaling].den;
722
723 rc = pm8xxx_adc_channel_power_enable(channel, true);
724 if (rc) {
725 rc = -EINVAL;
726 goto fail_unlock;
727 }
728
729 rc = pm8xxx_adc_configure(adc_pmic->conv);
730 if (rc) {
731 rc = -EINVAL;
732 goto fail;
733 }
734
735 wait_for_completion(&adc_pmic->adc_rslt_completion);
736
737 rc = pm8xxx_adc_read_adc_code(&result->adc_code);
738 if (rc) {
739 rc = -EINVAL;
740 goto fail;
741 }
742
743 scale_type = adc_pmic->adc_channel[i].adc_scale_fn;
744 if (scale_type >= ADC_SCALE_NONE) {
745 rc = -EBADF;
746 goto fail;
747 }
748
749 adc_scale_fn[scale_type].chan(result->adc_code,
750 adc_pmic->adc_prop, adc_pmic->conv->chan_prop, result);
751
752 rc = pm8xxx_adc_channel_power_enable(channel, false);
753 if (rc) {
754 rc = -EINVAL;
755 goto fail_unlock;
756 }
757
758 mutex_unlock(&adc_pmic->adc_lock);
759
760 return 0;
761fail:
762 rc_fail = pm8xxx_adc_channel_power_enable(channel, false);
763 if (rc_fail)
764 pr_err("pm8xxx adc power disable failed\n");
765fail_unlock:
766 mutex_unlock(&adc_pmic->adc_lock);
767 pr_err("pm8xxx adc error with %d\n", rc);
768 return rc;
769}
770EXPORT_SYMBOL_GPL(pm8xxx_adc_read);
771
772uint32_t pm8xxx_adc_mpp_config_read(uint32_t mpp_num,
773 enum pm8xxx_adc_channels channel,
774 struct pm8xxx_adc_chan_result *result)
775{
776 struct pm8xxx_adc *adc_pmic = pmic_adc;
777 int rc = 0;
778
779 if (!adc_pmic->mpp_base) {
780 rc = -EINVAL;
781 pr_info("PM8xxx MPP base invalid with error %d\n", rc);
782 return rc;
783 }
784
785 if (mpp_num == PM8XXX_AMUX_MPP_8) {
786 rc = -EINVAL;
787 pr_info("PM8xxx MPP8 is already configured "
788 "to AMUX8. Use pm8xxx_adc_read() instead.\n");
789 return rc;
790 }
791
792 mutex_lock(&adc_pmic->mpp_adc_lock);
793
794 rc = pm8xxx_mpp_config(((mpp_num - 1) + adc_pmic->mpp_base),
795 &pm8xxx_adc_mpp_config);
796 if (rc < 0) {
797 pr_err("pm8xxx adc mpp config error with %d\n", rc);
798 goto fail;
799 }
800
801 usleep_range(PM8XXX_ADC_MPP_SETTLE_TIME_MIN,
802 PM8XXX_ADC_MPP_SETTLE_TIME_MAX);
803
804 rc = pm8xxx_adc_read(channel, result);
805 if (rc < 0)
806 pr_err("pm8xxx adc read error with %d\n", rc);
807
808 rc = pm8xxx_mpp_config(((mpp_num - 1) + adc_pmic->mpp_base),
809 &pm8xxx_adc_mpp_unconfig);
810 if (rc < 0)
811 pr_err("pm8xxx adc mpp config error with %d\n", rc);
812fail:
813 mutex_unlock(&adc_pmic->mpp_adc_lock);
814
815 return rc;
816}
817EXPORT_SYMBOL_GPL(pm8xxx_adc_mpp_config_read);
818
819uint32_t pm8xxx_adc_btm_configure(struct pm8xxx_adc_arb_btm_param *btm_param)
820{
821 struct pm8xxx_adc *adc_pmic = pmic_adc;
822 u8 data_btm_cool_thr0, data_btm_cool_thr1;
823 u8 data_btm_warm_thr0, data_btm_warm_thr1;
824 u8 arb_btm_cntrl1;
825 unsigned long flags = 0;
826 int rc;
827
828 if (adc_pmic == NULL) {
829 pr_err("PMIC ADC not valid\n");
830 return -EINVAL;
831 }
832
833 if ((btm_param->btm_cool_fn == NULL) &&
834 (btm_param->btm_warm_fn == NULL)) {
835 pr_err("No BTM warm/cool notification??\n");
836 return -EINVAL;
837 }
838
Siddartha Mohanadossae39c902011-11-09 17:54:31 -0800839 rc = pm8xxx_adc_batt_scaler(btm_param, adc_pmic->adc_prop,
840 adc_pmic->conv->chan_prop);
Siddartha Mohanadoss17607d22011-10-05 10:36:20 -0700841 if (rc < 0) {
842 pr_err("Failed to lookup the BTM thresholds\n");
843 return rc;
844 }
845
846 spin_lock_irqsave(&adc_pmic->btm_lock, flags);
847
848 data_btm_cool_thr0 = ((btm_param->low_thr_voltage << 24) >> 24);
849 data_btm_cool_thr1 = ((btm_param->low_thr_voltage << 16) >> 24);
850 data_btm_warm_thr0 = ((btm_param->high_thr_voltage << 24) >> 24);
851 data_btm_warm_thr1 = ((btm_param->high_thr_voltage << 16) >> 24);
852
853 if (btm_param->btm_cool_fn != NULL) {
854 rc = pm8xxx_adc_write_reg(PM8XXX_ADC_ARB_BTM_BAT_COOL_THR0,
855 data_btm_cool_thr0);
856 if (rc < 0)
857 goto write_err;
858
859 rc = pm8xxx_adc_write_reg(PM8XXX_ADC_ARB_BTM_BAT_COOL_THR1,
860 data_btm_cool_thr1);
861 if (rc < 0)
862 goto write_err;
863
864 adc_pmic->batt->btm_cool_fn = btm_param->btm_cool_fn;
865 }
866
867 if (btm_param->btm_warm_fn != NULL) {
868 rc = pm8xxx_adc_write_reg(PM8XXX_ADC_ARB_BTM_BAT_WARM_THR0,
869 data_btm_warm_thr0);
870 if (rc < 0)
871 goto write_err;
872
873 rc = pm8xxx_adc_write_reg(PM8XXX_ADC_ARB_BTM_BAT_WARM_THR1,
874 data_btm_warm_thr1);
875 if (rc < 0)
876 goto write_err;
877
878 adc_pmic->batt->btm_warm_fn = btm_param->btm_warm_fn;
879 }
880
881 rc = pm8xxx_adc_read_reg(PM8XXX_ADC_ARB_BTM_CNTRL1, &arb_btm_cntrl1);
882 if (rc < 0)
883 goto bail_out;
884
885 btm_param->interval &= PM8XXX_ADC_BTM_INTERVAL_SEL_MASK;
886 arb_btm_cntrl1 |=
887 btm_param->interval << PM8XXX_ADC_BTM_INTERVAL_SEL_SHIFT;
888
889 rc = pm8xxx_adc_write_reg(PM8XXX_ADC_ARB_BTM_CNTRL1, arb_btm_cntrl1);
890 if (rc < 0)
891 goto write_err;
892
893 spin_unlock_irqrestore(&adc_pmic->btm_lock, flags);
894
895 return rc;
896bail_out:
897write_err:
898 spin_unlock_irqrestore(&adc_pmic->btm_lock, flags);
899 pr_debug("%s: with error code %d\n", __func__, rc);
900 return rc;
901}
902EXPORT_SYMBOL_GPL(pm8xxx_adc_btm_configure);
903
904static uint32_t pm8xxx_adc_btm_read(uint32_t channel)
905{
906 struct pm8xxx_adc *adc_pmic = pmic_adc;
907 int rc, i;
908 u8 arb_btm_dig_param, arb_btm_ana_param, arb_btm_rsv;
909 u8 arb_btm_amux_cntrl, data_arb_btm_cntrl = 0;
910 unsigned long flags;
911
912 arb_btm_amux_cntrl = channel << PM8XXX_ADC_BTM_CHANNEL_SEL;
913 arb_btm_rsv = adc_pmic->adc_channel[channel].adc_rsv;
914 arb_btm_dig_param = arb_btm_ana_param = PM8XXX_ADC_ARB_ANA_DIG;
915
916 spin_lock_irqsave(&adc_pmic->btm_lock, flags);
917
918 rc = pm8xxx_adc_write_reg(PM8XXX_ADC_ARB_BTM_AMUX_CNTRL,
919 arb_btm_amux_cntrl);
920 if (rc < 0)
921 goto write_err;
922
923 arb_btm_rsv = PM8XXX_ADC_BTM_RSV;
924
925 rc = pm8xxx_adc_write_reg(PM8XXX_ADC_ARB_BTM_RSV, arb_btm_rsv);
926 if (rc < 0)
927 goto write_err;
928
929 rc = pm8xxx_adc_write_reg(PM8XXX_ADC_ARB_BTM_DIG_PARAM,
930 arb_btm_dig_param);
931 if (rc < 0)
932 goto write_err;
933
934 rc = pm8xxx_adc_write_reg(PM8XXX_ADC_ARB_BTM_ANA_PARAM,
935 arb_btm_ana_param);
936 if (rc < 0)
937 goto write_err;
938
939 data_arb_btm_cntrl |= PM8XXX_ADC_ARB_BTM_CNTRL1_EN_BTM;
940
941 for (i = 0; i < 2; i++) {
942 rc = pm8xxx_adc_write_reg(PM8XXX_ADC_ARB_BTM_CNTRL1,
943 data_arb_btm_cntrl);
944 if (rc < 0)
945 goto write_err;
946 }
947
948 data_arb_btm_cntrl |= PM8XXX_ADC_ARB_BTM_CNTRL1_REQ
949 | PM8XXX_ADC_ARB_BTM_CNTRL1_SEL_OP_MODE;
950
951 rc = pm8xxx_adc_write_reg(PM8XXX_ADC_ARB_BTM_CNTRL1,
952 data_arb_btm_cntrl);
953 if (rc < 0)
954 goto write_err;
955
956 if (pmic_adc->batt->btm_warm_fn != NULL)
957 enable_irq(adc_pmic->btm_warm_irq);
958
959 if (pmic_adc->batt->btm_cool_fn != NULL)
960 enable_irq(adc_pmic->btm_cool_irq);
961
962write_err:
963 spin_unlock_irqrestore(&adc_pmic->btm_lock, flags);
964 return rc;
965}
966
967uint32_t pm8xxx_adc_btm_start(void)
968{
969 return pm8xxx_adc_btm_read(CHANNEL_BATT_THERM);
970}
971EXPORT_SYMBOL_GPL(pm8xxx_adc_btm_start);
972
973uint32_t pm8xxx_adc_btm_end(void)
974{
975 struct pm8xxx_adc *adc_pmic = pmic_adc;
976 int i, rc;
977 u8 data_arb_btm_cntrl;
978 unsigned long flags;
979
980 disable_irq_nosync(adc_pmic->btm_warm_irq);
981 disable_irq_nosync(adc_pmic->btm_cool_irq);
982
983 spin_lock_irqsave(&adc_pmic->btm_lock, flags);
984 /* Set BTM registers to Disable mode */
985 rc = pm8xxx_adc_read_reg(PM8XXX_ADC_ARB_BTM_CNTRL1,
986 &data_arb_btm_cntrl);
987 if (rc < 0) {
988 spin_unlock_irqrestore(&adc_pmic->btm_lock, flags);
989 return rc;
990 }
991
992 data_arb_btm_cntrl |= ~PM8XXX_ADC_ARB_BTM_CNTRL1_EN_BTM;
993 /* Write twice to the CNTRL register for the arbiter settings
994 to take into effect */
995 for (i = 0; i < 2; i++) {
996 rc = pm8xxx_adc_write_reg(PM8XXX_ADC_ARB_BTM_CNTRL1,
997 data_arb_btm_cntrl);
998 if (rc < 0) {
999 spin_unlock_irqrestore(&adc_pmic->btm_lock, flags);
1000 return rc;
1001 }
1002 }
1003
1004 spin_unlock_irqrestore(&adc_pmic->btm_lock, flags);
1005
1006 return rc;
1007}
1008EXPORT_SYMBOL_GPL(pm8xxx_adc_btm_end);
1009
1010static ssize_t pm8xxx_adc_show(struct device *dev,
1011 struct device_attribute *devattr, char *buf)
1012{
1013 struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
1014 struct pm8xxx_adc *adc_pmic = pmic_adc;
1015 struct pm8xxx_adc_chan_result result;
1016 int rc = -1;
1017
1018 if (attr->index < adc_pmic->adc_num_channel)
1019 rc = pm8xxx_adc_read(attr->index, &result);
1020
1021 if (rc)
1022 return 0;
1023
Siddartha Mohanadossae39c902011-11-09 17:54:31 -08001024 return snprintf(buf, PM8XXX_ADC_HWMON_NAME_LENGTH,
1025 "Result:%lld Raw:%d\n", result.physical, result.adc_code);
Siddartha Mohanadoss17607d22011-10-05 10:36:20 -07001026}
1027
1028static int get_adc(void *data, u64 *val)
1029{
1030 struct pm8xxx_adc_chan_result result;
1031 int i = (int)data;
1032 int rc;
1033
1034 rc = pm8xxx_adc_read(i, &result);
1035 if (!rc)
1036 pr_info("ADC value raw:%x physical:%lld\n",
1037 result.adc_code, result.physical);
1038 *val = result.physical;
1039
1040 return 0;
1041}
1042DEFINE_SIMPLE_ATTRIBUTE(reg_fops, get_adc, NULL, "%llu\n");
1043
1044static int get_mpp_adc(void *data, u64 *val)
1045{
1046 struct pm8xxx_adc_chan_result result;
1047 int i = (int)data;
1048 int rc;
1049
1050 rc = pm8xxx_adc_mpp_config_read(i,
1051 ADC_MPP_1_AMUX6, &result);
1052 if (!rc)
1053 pr_info("ADC MPP value raw:%x physical:%lld\n",
1054 result.adc_code, result.physical);
1055 *val = result.physical;
1056
1057 return 0;
1058}
1059DEFINE_SIMPLE_ATTRIBUTE(reg_mpp_fops, get_mpp_adc, NULL, "%llu\n");
1060
1061#ifdef CONFIG_DEBUG_FS
1062static void create_debugfs_entries(void)
1063{
1064 int i = 0;
1065 pmic_adc->dent = debugfs_create_dir("pm8xxx_adc", NULL);
1066
1067 if (IS_ERR(pmic_adc->dent)) {
1068 pr_err("pmic adc debugfs dir not created\n");
1069 return;
1070 }
1071
1072 for (i = 0; i < pmic_adc->adc_num_board_channel; i++)
1073 debugfs_create_file(pmic_adc->adc_channel[i].name,
1074 0644, pmic_adc->dent,
1075 (void *)pmic_adc->adc_channel[i].channel_name,
1076 &reg_fops);
1077}
1078#else
1079static inline void create_debugfs_entries(void)
1080{
1081}
1082#endif
1083static struct sensor_device_attribute pm8xxx_adc_attr =
1084 SENSOR_ATTR(NULL, S_IRUGO, pm8xxx_adc_show, NULL, 0);
1085
1086static int32_t pm8xxx_adc_init_hwmon(struct platform_device *pdev)
1087{
1088 struct pm8xxx_adc *adc_pmic = pmic_adc;
1089 int rc = 0, i;
1090
1091 for (i = 0; i < pmic_adc->adc_num_board_channel; i++) {
1092 pm8xxx_adc_attr.index = adc_pmic->adc_channel[i].channel_name;
1093 pm8xxx_adc_attr.dev_attr.attr.name =
1094 adc_pmic->adc_channel[i].name;
1095 memcpy(&adc_pmic->sens_attr[i], &pm8xxx_adc_attr,
1096 sizeof(pm8xxx_adc_attr));
1097 rc = device_create_file(&pdev->dev,
1098 &adc_pmic->sens_attr[i].dev_attr);
1099 if (rc) {
1100 dev_err(&pdev->dev, "device_create_file failed for "
1101 "dev %s\n",
1102 adc_pmic->adc_channel[i].name);
1103 goto hwmon_err_sens;
1104 }
1105 }
1106
1107 return 0;
1108hwmon_err_sens:
1109 pr_info("Init HWMON failed for pm8xxx_adc with %d\n", rc);
1110 return rc;
1111}
1112
1113#ifdef CONFIG_PM
1114static int pm8xxx_adc_suspend_noirq(struct device *dev)
1115{
1116 struct pm8xxx_adc *adc_pmic = pmic_adc;
1117
1118 adc_pmic->msm_suspend_check = 1;
1119
1120 return 0;
1121}
1122
1123static int pm8xxx_adc_resume_noirq(struct device *dev)
1124{
1125 struct pm8xxx_adc *adc_pmic = pmic_adc;
1126
1127 adc_pmic->msm_suspend_check = 0;
1128
1129 return 0;
1130}
1131
1132static const struct dev_pm_ops pm8xxx_adc_dev_pm_ops = {
1133 .suspend_noirq = pm8xxx_adc_suspend_noirq,
1134 .resume_noirq = pm8xxx_adc_resume_noirq,
1135};
1136
1137#define PM8XXX_ADC_DEV_PM_OPS (&pm8xxx_adc_dev_pm_ops)
1138#else
1139#define PM8XXX_ADC_DEV_PM_OPS NULL
1140#endif
1141
1142static int __devexit pm8xxx_adc_teardown(struct platform_device *pdev)
1143{
1144 struct pm8xxx_adc *adc_pmic = pmic_adc;
1145 int i;
1146
1147 wake_lock_destroy(&adc_pmic->adc_wakelock);
1148 platform_set_drvdata(pdev, NULL);
1149 pmic_adc = NULL;
1150 for (i = 0; i < adc_pmic->adc_num_board_channel; i++)
1151 device_remove_file(adc_pmic->dev,
1152 &adc_pmic->sens_attr[i].dev_attr);
1153 pm8xxx_adc_initialized = false;
1154
1155 return 0;
1156}
1157
1158static int __devinit pm8xxx_adc_probe(struct platform_device *pdev)
1159{
1160 const struct pm8xxx_adc_platform_data *pdata = pdev->dev.platform_data;
1161 struct pm8xxx_adc *adc_pmic;
1162 struct pm8xxx_adc_amux_properties *adc_amux_prop;
1163 int rc = 0;
1164
1165 if (!pdata) {
1166 dev_err(&pdev->dev, "no platform data?\n");
1167 return -EINVAL;
1168 }
1169
1170 adc_pmic = devm_kzalloc(&pdev->dev, sizeof(struct pm8xxx_adc) +
1171 sizeof(struct pm8xxx_adc_arb_btm_param) +
1172 (sizeof(struct sensor_device_attribute) *
1173 pdata->adc_num_board_channel), GFP_KERNEL);
1174 if (!adc_pmic) {
1175 dev_err(&pdev->dev, "Unable to allocate memory\n");
1176 return -ENOMEM;
1177 }
1178
1179 adc_amux_prop = devm_kzalloc(&pdev->dev,
1180 sizeof(struct pm8xxx_adc_amux_properties) +
1181 sizeof(struct pm8xxx_adc_chan_properties)
1182 , GFP_KERNEL);
1183 if (!adc_amux_prop) {
1184 dev_err(&pdev->dev, "Unable to allocate memory\n");
1185 return -ENOMEM;
1186 }
1187
1188 adc_pmic->dev = &pdev->dev;
1189 adc_pmic->adc_prop = pdata->adc_prop;
1190 adc_pmic->conv = adc_amux_prop;
1191 init_completion(&adc_pmic->adc_rslt_completion);
1192 adc_pmic->adc_channel = pdata->adc_channel;
1193 adc_pmic->adc_num_board_channel = pdata->adc_num_board_channel;
1194 adc_pmic->adc_num_channel = ADC_MPP_2_CHANNEL_NONE;
1195 adc_pmic->mpp_base = pdata->adc_mpp_base;
1196
1197 mutex_init(&adc_pmic->adc_lock);
1198 mutex_init(&adc_pmic->mpp_adc_lock);
1199 spin_lock_init(&adc_pmic->btm_lock);
1200
1201 adc_pmic->adc_irq = platform_get_irq(pdev, PM8XXX_ADC_IRQ_0);
1202 if (adc_pmic->adc_irq < 0)
1203 return adc_pmic->adc_irq;
1204
1205 rc = devm_request_irq(&pdev->dev, adc_pmic->adc_irq,
1206 pm8xxx_adc_isr,
1207 IRQF_TRIGGER_RISING, "pm8xxx_adc_interrupt", adc_pmic);
1208 if (rc) {
1209 dev_err(&pdev->dev, "failed to request adc irq "
1210 "with error %d\n", rc);
1211 }
1212
1213 disable_irq_nosync(adc_pmic->adc_irq);
1214
1215 adc_pmic->btm_warm_irq = platform_get_irq(pdev, PM8XXX_ADC_IRQ_1);
1216 if (adc_pmic->btm_warm_irq < 0)
1217 return adc_pmic->btm_warm_irq;
1218
1219 rc = devm_request_irq(&pdev->dev, adc_pmic->btm_warm_irq,
1220 pm8xxx_btm_warm_isr,
1221 IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
1222 "pm8xxx_btm_warm_interrupt", adc_pmic);
1223 if (rc) {
1224 pr_err("btm warm irq failed %d with interrupt number %d\n",
1225 rc, adc_pmic->btm_warm_irq);
1226 dev_err(&pdev->dev, "failed to request btm irq\n");
1227 }
1228
1229 disable_irq_nosync(adc_pmic->btm_warm_irq);
1230
1231 adc_pmic->btm_cool_irq = platform_get_irq(pdev, PM8XXX_ADC_IRQ_2);
1232 if (adc_pmic->btm_cool_irq < 0)
1233 return adc_pmic->btm_cool_irq;
1234
1235 rc = devm_request_irq(&pdev->dev, adc_pmic->btm_cool_irq,
1236 pm8xxx_btm_cool_isr,
1237 IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
1238 "pm8xxx_btm_cool_interrupt", adc_pmic);
1239 if (rc) {
1240 pr_err("btm cool irq failed with return %d and number %d\n",
1241 rc, adc_pmic->btm_cool_irq);
1242 dev_err(&pdev->dev, "failed to request btm irq\n");
1243 }
1244
1245 disable_irq_nosync(adc_pmic->btm_cool_irq);
1246 platform_set_drvdata(pdev, adc_pmic);
1247 wake_lock_init(&adc_pmic->adc_wakelock, WAKE_LOCK_SUSPEND,
1248 "pm8xxx_adc_wakelock");
1249 adc_pmic->msm_suspend_check = 0;
1250 pmic_adc = adc_pmic;
1251
1252 INIT_WORK(&adc_pmic->warm_work, pm8xxx_adc_btm_warm_scheduler_fn);
1253 INIT_WORK(&adc_pmic->cool_work, pm8xxx_adc_btm_cool_scheduler_fn);
1254 create_debugfs_entries();
1255 pm8xxx_adc_calib_first_adc = false;
1256 pm8xxx_adc_calib_device_init = false;
1257 pm8xxx_adc_initialized = true;
1258
1259 rc = pm8xxx_adc_init_hwmon(pdev);
1260 if (rc) {
1261 pr_err("pm8xxx adc init hwmon failed with %d\n", rc);
1262 dev_err(&pdev->dev, "failed to initialize pm8xxx hwmon adc\n");
1263 }
1264 adc_pmic->hwmon = hwmon_device_register(adc_pmic->dev);
1265 return 0;
1266}
1267
1268static struct platform_driver pm8xxx_adc_driver = {
1269 .probe = pm8xxx_adc_probe,
1270 .remove = __devexit_p(pm8xxx_adc_teardown),
1271 .driver = {
1272 .name = PM8XXX_ADC_DEV_NAME,
1273 .owner = THIS_MODULE,
1274 .pm = PM8XXX_ADC_DEV_PM_OPS,
1275 },
1276};
1277
1278static int __init pm8xxx_adc_init(void)
1279{
1280 return platform_driver_register(&pm8xxx_adc_driver);
1281}
1282module_init(pm8xxx_adc_init);
1283
1284static void __exit pm8xxx_adc_exit(void)
1285{
1286 platform_driver_unregister(&pm8xxx_adc_driver);
1287}
1288module_exit(pm8xxx_adc_exit);
1289
1290MODULE_ALIAS("platform:" PM8XXX_ADC_DEV_NAME);
1291MODULE_DESCRIPTION("PMIC8921/8018 ADC driver");
1292MODULE_LICENSE("GPL v2");