summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhou Jingyu <b02241@freescale.com>2010-11-15 17:35:19 +0800
committerJustin Waters <justin.waters@timesys.com>2010-12-13 16:10:47 -0500
commite4179f3f9727684b63910d6c32daf4f3c53f2dfe (patch)
tree045a6ad08779f9cf97b40fde8ecf4c102ab025e6
parentdcb178792f7517485b4c3fc9d3d06b48ed4645be (diff)
ENGR00133635 mc13892, fix pmic ADC issue and lost irq issue
1) Add re-check to avoid event lost in edge irq mode 2) fix mutex problem caused by CHECK_ERROR(xxx) macro Signed-off-by: Zhou Jingyu <Jingyu.Zhou@freescale.com> (cherry picked from commit 4837fb8a06c8ffd959d20785cfaf4104689b4906)
-rw-r--r--drivers/mxc/pmic/core/pmic_common.c8
-rw-r--r--drivers/mxc/pmic/mc13892/pmic_adc.c64
2 files changed, 55 insertions, 17 deletions
diff --git a/drivers/mxc/pmic/core/pmic_common.c b/drivers/mxc/pmic/core/pmic_common.c
index c15d212da714..7e53121f12b8 100644
--- a/drivers/mxc/pmic/core/pmic_common.c
+++ b/drivers/mxc/pmic/core/pmic_common.c
@@ -63,9 +63,13 @@ static int pmic_event_thread_func(void *v)
active_events);
pr_debug("active events number %d\n", count);
+ do {
for (loop = 0; loop < count; loop++)
- pmic_event_callback(
- active_events[loop]);
+ pmic_event_callback(active_events[loop]);
+
+ count = pmic_get_active_events(active_events);
+
+ } while (count != 0);
enable_irq(irq);
}
diff --git a/drivers/mxc/pmic/mc13892/pmic_adc.c b/drivers/mxc/pmic/mc13892/pmic_adc.c
index 201494440ae1..c0f0f069b902 100644
--- a/drivers/mxc/pmic/mc13892/pmic_adc.c
+++ b/drivers/mxc/pmic/mc13892/pmic_adc.c
@@ -406,6 +406,8 @@ PMIC_STATUS mc13892_adc_convert(t_adc_param *adc_param)
unsigned int adc_0_reg = 0, adc_1_reg = 0, result_reg = 0, i = 0;
unsigned int result = 0, temp = 0;
pmic_version_t mc13892_ver;
+ int ret;
+
pr_debug("mc13892 ADC - mc13892_adc_convert ....\n");
if (suspend_flag == 1)
return -EBUSY;
@@ -432,7 +434,8 @@ PMIC_STATUS mc13892_adc_convert(t_adc_param *adc_param)
use_bis = mc13892_adc_request(adc_param->read_ts);
if (use_bis < 0) {
pr_debug("process has received a signal and got interrupted\n");
- return -EINTR;
+ ret = -EINTR;
+ goto out_up_convert_mutex;
}
/* CONFIGURE ADC REG 0 */
@@ -472,9 +475,12 @@ PMIC_STATUS mc13892_adc_convert(t_adc_param *adc_param)
adc_0_reg |= ADC_CHRGICON;
/*Change has been made here */
- CHECK_ERROR(pmic_write_reg(REG_ADC0, adc_0_reg,
- ADC_INC | ADC_BIS | ADC_CHRGRAW_D5 |
- 0xfff00ff));
+ ret = pmic_write_reg(REG_ADC0, adc_0_reg,
+ ADC_INC | ADC_BIS | ADC_CHRGRAW_D5 | 0xfff00ff);
+ if (ret != PMIC_SUCCESS) {
+ pr_debug("pmic_write_reg");
+ goto out_mc13892_adc_release;
+ }
/* CONFIGURE ADC REG 1 */
if (adc_param->read_ts == false) {
@@ -538,13 +544,18 @@ PMIC_STATUS mc13892_adc_convert(t_adc_param *adc_param)
data_ready_adc_1 = true;
pr_debug("Write Reg %i = %x\n", REG_ADC1, adc_1_reg);
INIT_COMPLETION(adcdone_it);
- CHECK_ERROR(pmic_write_reg(REG_ADC1, adc_1_reg,
+ ret = pmic_write_reg(REG_ADC1, adc_1_reg,
ADC_SGL_CH | ADC_ATO |
ADC_ADSEL | ADC_CH_0_MASK |
ADC_CH_1_MASK |
ADC_NO_ADTRIG | ADC_EN |
ADC_DELAY_MASK | ASC_ADC |
- ADC_BIS));
+ ADC_BIS);
+ if (ret != PMIC_SUCCESS) {
+ pr_debug("pmic_write_reg");
+ goto out_mc13892_adc_release;
+ }
+
pr_debug("wait adc done\n");
wait_for_completion_interruptible(&adcdone_it);
data_ready_adc_1 = false;
@@ -553,11 +564,19 @@ PMIC_STATUS mc13892_adc_convert(t_adc_param *adc_param)
adc_1_reg |= ASC_ADC;
data_ready_adc_2 = true;
INIT_COMPLETION(adcbisdone_it);
- CHECK_ERROR(pmic_write_reg(REG_ADC1, adc_1_reg,
- 0xFFFFFF));
+ ret = pmic_write_reg(REG_ADC1, adc_1_reg, 0xFFFFFF);
+ if (ret != PMIC_SUCCESS) {
+ pr_debug("pmic_write_reg");
+ goto out_mc13892_adc_release;
+ }
temp = 0x800000;
- CHECK_ERROR(pmic_write_reg(REG_ADC3, temp, 0xFFFFFF));
+ ret = pmic_write_reg(REG_ADC3, temp, 0xFFFFFF);
+ if (ret != PMIC_SUCCESS) {
+ pr_info("pmic_write_reg");
+ goto out_mc13892_adc_release;
+ }
+
pr_debug("wait adc done bis\n");
wait_for_completion_interruptible(&adcbisdone_it);
data_ready_adc_2 = false;
@@ -571,11 +590,20 @@ PMIC_STATUS mc13892_adc_convert(t_adc_param *adc_param)
else
result_reg = REG_ADC4;
- CHECK_ERROR(pmic_write_reg(REG_ADC1, 4 << ADC_CH_1_POS,
- ADC_CH_0_MASK | ADC_CH_1_MASK));
+ ret = pmic_write_reg(REG_ADC1, 4 << ADC_CH_1_POS,
+ ADC_CH_0_MASK | ADC_CH_1_MASK);
+ if (ret != PMIC_SUCCESS) {
+ pr_debug("pmic_write_reg");
+ goto out_mc13892_adc_release;
+ }
for (i = 0; i <= 3; i++) {
- CHECK_ERROR(pmic_read_reg(result_reg, &result, PMIC_ALL_BITS));
+ ret = pmic_read_reg(result_reg, &result, PMIC_ALL_BITS);
+ if (ret != PMIC_SUCCESS) {
+ pr_debug("pmic_write_reg");
+ goto out_mc13892_adc_release;
+ }
+
adc_param->value[i] = ((result & ADD1_RESULT_MASK) >> 2);
adc_param->value[i + 4] = ((result & ADD2_RESULT_MASK) >> 14);
pr_debug("value[%d] = %d, value[%d] = %d\n",
@@ -590,8 +618,11 @@ PMIC_STATUS mc13892_adc_convert(t_adc_param *adc_param)
adc_param->ts_value.y_position1 = adc_param->value[3];
adc_param->ts_value.y_position2 = adc_param->value[4];
adc_param->ts_value.contact_resistance = adc_param->value[6];
- CHECK_ERROR(pmic_write_reg(REG_ADC0, 0x0,
- ADC_TSMODE_MASK));
+ ret = pmic_write_reg(REG_ADC0, 0x0, ADC_TSMODE_MASK);
+ if (ret != PMIC_SUCCESS) {
+ pr_debug("pmic_write_reg");
+ goto out_mc13892_adc_release;
+ }
}
/*if (adc_param->read_ts) {
@@ -599,10 +630,13 @@ PMIC_STATUS mc13892_adc_convert(t_adc_param *adc_param)
adc_param->ts_value.y_position = adc_param->value[5];
adc_param->ts_value.contact_resistance = adc_param->value[6];
} */
+ ret = PMIC_SUCCESS;
+out_mc13892_adc_release:
mc13892_adc_release(use_bis);
+out_up_convert_mutex:
up(&convert_mutex);
- return PMIC_SUCCESS;
+ return ret;
}
t_reading_mode mc13892_set_read_mode(t_channel channel)