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