提交 a5055d5d 编写于 作者: P Pali Rohár 提交者: Samuel Ortiz

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: NPali Rohár <pali.rohar@gmail.com>
Reviewed-by: NAnton Vorontsov <anton@enomsg.org>
Signed-off-by: NSamuel Ortiz <sameo@linux.intel.com>
上级 d955cba8
...@@ -211,12 +211,14 @@ static int twl4030battery_current(int raw_volt) ...@@ -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, ...@@ -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) ...@@ -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 @@ static irqreturn_t twl4030_madc_threaded_irq_handler(int irq, void *_madc) ...@@ -397,7 +403,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);
...@@ -585,7 +591,7 @@ int twl4030_madc_conversion(struct twl4030_madc_request *req) ...@@ -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 { ...@@ -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 { ...@@ -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);
}; };
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册