mfd: twl4030-madc: Add support for raw value in twl4030_madc_conversion
Driver twl4030-madc has hardcoded channel types (10 - battery current, 1 - battery temperature) and also conversation data in variable twl4030_divider_ratios. These hardcoded channels are incorrect for Nokia RX-51 board (where is channel 0 - battery temperature). For Nokia RX-51 there is rx51_battery power_supply driver which reporting battery information via twl4030_madc_conversion. But this driver needs raw values (not converted via some hardcoded functions). So this patch adding new parameter "raw" to struct twl4030_madc_request which tell twl4030-madc driver to not convert values, but rather return raw. Signed-off-by: Pali Rohár <pali.rohar@gmail.com> Reviewed-by: Anton Vorontsov <anton@enomsg.org> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
This commit is contained in:
parent
d955cba86d
commit
a5055d5d68
|
@ -211,12 +211,14 @@ static int twl4030battery_current(int raw_volt)
|
||||||
* @reg_base - Base address of the first channel
|
* @reg_base - Base address of the first channel
|
||||||
* @Channels - 16 bit bitmap. If the bit is set, channel value is read
|
* @Channels - 16 bit bitmap. If the bit is set, channel value is read
|
||||||
* @buf - The channel values are stored here. if read fails error
|
* @buf - The channel values are stored here. if read fails error
|
||||||
|
* @raw - Return raw values without conversion
|
||||||
* value is stored
|
* value is stored
|
||||||
* Returns the number of successfully read channels.
|
* Returns the number of successfully read channels.
|
||||||
*/
|
*/
|
||||||
static int twl4030_madc_read_channels(struct twl4030_madc_data *madc,
|
static int twl4030_madc_read_channels(struct twl4030_madc_data *madc,
|
||||||
u8 reg_base, unsigned
|
u8 reg_base, unsigned
|
||||||
long channels, int *buf)
|
long channels, int *buf,
|
||||||
|
bool raw)
|
||||||
{
|
{
|
||||||
int count = 0, count_req = 0, i;
|
int count = 0, count_req = 0, i;
|
||||||
u8 reg;
|
u8 reg;
|
||||||
|
@ -230,6 +232,10 @@ static int twl4030_madc_read_channels(struct twl4030_madc_data *madc,
|
||||||
count_req++;
|
count_req++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (raw) {
|
||||||
|
count++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
switch (i) {
|
switch (i) {
|
||||||
case 10:
|
case 10:
|
||||||
buf[i] = twl4030battery_current(buf[i]);
|
buf[i] = twl4030battery_current(buf[i]);
|
||||||
|
@ -371,7 +377,7 @@ static irqreturn_t twl4030_madc_threaded_irq_handler(int irq, void *_madc)
|
||||||
method = &twl4030_conversion_methods[r->method];
|
method = &twl4030_conversion_methods[r->method];
|
||||||
/* Read results */
|
/* Read results */
|
||||||
len = twl4030_madc_read_channels(madc, method->rbase,
|
len = twl4030_madc_read_channels(madc, method->rbase,
|
||||||
r->channels, r->rbuf);
|
r->channels, r->rbuf, r->raw);
|
||||||
/* Return results to caller */
|
/* Return results to caller */
|
||||||
if (r->func_cb != NULL) {
|
if (r->func_cb != NULL) {
|
||||||
r->func_cb(len, r->channels, r->rbuf);
|
r->func_cb(len, r->channels, r->rbuf);
|
||||||
|
@ -397,7 +403,7 @@ err_i2c:
|
||||||
method = &twl4030_conversion_methods[r->method];
|
method = &twl4030_conversion_methods[r->method];
|
||||||
/* Read results */
|
/* Read results */
|
||||||
len = twl4030_madc_read_channels(madc, method->rbase,
|
len = twl4030_madc_read_channels(madc, method->rbase,
|
||||||
r->channels, r->rbuf);
|
r->channels, r->rbuf, r->raw);
|
||||||
/* Return results to caller */
|
/* Return results to caller */
|
||||||
if (r->func_cb != NULL) {
|
if (r->func_cb != NULL) {
|
||||||
r->func_cb(len, r->channels, r->rbuf);
|
r->func_cb(len, r->channels, r->rbuf);
|
||||||
|
@ -585,7 +591,7 @@ int twl4030_madc_conversion(struct twl4030_madc_request *req)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
ret = twl4030_madc_read_channels(twl4030_madc, method->rbase,
|
ret = twl4030_madc_read_channels(twl4030_madc, method->rbase,
|
||||||
req->channels, req->rbuf);
|
req->channels, req->rbuf, req->raw);
|
||||||
twl4030_madc->requests[req->method].active = 0;
|
twl4030_madc->requests[req->method].active = 0;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|
|
@ -39,6 +39,7 @@ struct twl4030_madc_conversion_method {
|
||||||
* @do_avgP: sample the input channel for 4 consecutive cycles
|
* @do_avgP: sample the input channel for 4 consecutive cycles
|
||||||
* @method: RT, SW1, SW2
|
* @method: RT, SW1, SW2
|
||||||
* @type: Polling or interrupt based method
|
* @type: Polling or interrupt based method
|
||||||
|
* @raw: Return raw value, do not convert it
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct twl4030_madc_request {
|
struct twl4030_madc_request {
|
||||||
|
@ -48,6 +49,7 @@ struct twl4030_madc_request {
|
||||||
u16 type;
|
u16 type;
|
||||||
bool active;
|
bool active;
|
||||||
bool result_pending;
|
bool result_pending;
|
||||||
|
bool raw;
|
||||||
int rbuf[TWL4030_MADC_MAX_CHANNELS];
|
int rbuf[TWL4030_MADC_MAX_CHANNELS];
|
||||||
void (*func_cb)(int len, int channels, int *buf);
|
void (*func_cb)(int len, int channels, int *buf);
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue