}
}
+static int twl6030_gpadc_is_conversion_ready(
+ struct twl6030_gpadc_data *gpadc, u8 status_reg)
+{
+ u8 reg = twl6030_gpadc_read(gpadc, status_reg);
+ return !(reg & TWL6030_GPADC_BUSY) && (reg & TWL6030_GPADC_EOC_SW);
+}
+
static int twl6030_gpadc_wait_conversion_ready(
struct twl6030_gpadc_data *gpadc,
unsigned int timeout_ms, u8 status_reg)
timeout = jiffies + msecs_to_jiffies(timeout_ms);
do {
- u8 reg;
-
- reg = twl6030_gpadc_read(gpadc, status_reg);
- if (!(reg & TWL6030_GPADC_BUSY) && (reg & TWL6030_GPADC_EOC_SW))
+ if (twl6030_gpadc_is_conversion_ready(gpadc, status_reg))
return 0;
+ msleep_interruptible(1);
} while (!time_after(jiffies, timeout));
- return -EAGAIN;
+ /* one more checking against scheduler-caused timeout */
+ if (twl6030_gpadc_is_conversion_ready(gpadc, status_reg))
+ return 0;
+ else
+ return -EAGAIN;
}
/* locks held by caller */
/* D1 */
d1 = (trim_regs[11] & 0x0F) << 3;
d1 |= (trim_regs[9] & 0x0E) >> 1;
- if (trim_regs[1] & 0x01)
+ if (trim_regs[9] & 0x01)
d1 = -d1;
/* D2 */
- d2 = (trim_regs[15] & 0x0F) << 2;
+ d2 = (trim_regs[15] & 0x0F) << 3;
d2 |= (trim_regs[13] & 0x0E) >> 1;
if (trim_regs[13] & 0x01)
d2 = -d2;
if (trim_regs[1] & 0x01)
temp = -temp;
- d1 = (trim_regs[1] & 0x7E) >> 1;
- if (trim_regs[12] & 0x01)
+ d1 = (trim_regs[5] & 0x7E) >> 1;
+ if (trim_regs[5] & 0x01)
d1 = -d1;
d1 += temp;
if (trim_regs[2] & 0x01)
temp = -temp;
- d2 = (trim_regs[6] & 0x7F) >> 1;
- if (trim_regs[14] & 0x01)
+ d2 = (trim_regs[6] & 0xFF) >> 1;
+ if (trim_regs[6] & 0x01)
d2 = -d2;
d2 += temp;