Input: ads7846 - simplify support of external vREF (and ads7843)
This updates the ads7846 driver to handle external vREF (required on boards using ads7843 chips) without module parameters, and also removes a needless variable with its associated bogus gcc warning. Signed-off-by: David Brownell <dbrownell@users.sourceforge.net> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
This commit is contained in:
parent
e6cdd15629
commit
7c6d0ee14c
|
@ -87,6 +87,7 @@ struct ads7846 {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
u16 model;
|
u16 model;
|
||||||
|
u16 vref_mv;
|
||||||
u16 vref_delay_usecs;
|
u16 vref_delay_usecs;
|
||||||
u16 x_plate_ohms;
|
u16 x_plate_ohms;
|
||||||
u16 pressure_max;
|
u16 pressure_max;
|
||||||
|
@ -184,9 +185,6 @@ struct ads7846 {
|
||||||
* The range is GND..vREF. The ads7843 and ads7835 must use external vREF;
|
* The range is GND..vREF. The ads7843 and ads7835 must use external vREF;
|
||||||
* ads7846 lets that pin be unconnected, to use internal vREF.
|
* ads7846 lets that pin be unconnected, to use internal vREF.
|
||||||
*/
|
*/
|
||||||
static unsigned vREF_mV;
|
|
||||||
module_param(vREF_mV, uint, 0);
|
|
||||||
MODULE_PARM_DESC(vREF_mV, "external vREF voltage, in milliVolts");
|
|
||||||
|
|
||||||
struct ser_req {
|
struct ser_req {
|
||||||
u8 ref_on;
|
u8 ref_on;
|
||||||
|
@ -213,7 +211,6 @@ static int ads7846_read12_ser(struct device *dev, unsigned command)
|
||||||
struct ads7846 *ts = dev_get_drvdata(dev);
|
struct ads7846 *ts = dev_get_drvdata(dev);
|
||||||
struct ser_req *req = kzalloc(sizeof *req, GFP_KERNEL);
|
struct ser_req *req = kzalloc(sizeof *req, GFP_KERNEL);
|
||||||
int status;
|
int status;
|
||||||
int uninitialized_var(sample);
|
|
||||||
int use_internal;
|
int use_internal;
|
||||||
|
|
||||||
if (!req)
|
if (!req)
|
||||||
|
@ -270,13 +267,13 @@ static int ads7846_read12_ser(struct device *dev, unsigned command)
|
||||||
|
|
||||||
if (status == 0) {
|
if (status == 0) {
|
||||||
/* on-wire is a must-ignore bit, a BE12 value, then padding */
|
/* on-wire is a must-ignore bit, a BE12 value, then padding */
|
||||||
sample = be16_to_cpu(req->sample);
|
status = be16_to_cpu(req->sample);
|
||||||
sample = sample >> 3;
|
status = status >> 3;
|
||||||
sample &= 0x0fff;
|
status &= 0x0fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
kfree(req);
|
kfree(req);
|
||||||
return status ? status : sample;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(CONFIG_HWMON) || defined(CONFIG_HWMON_MODULE)
|
#if defined(CONFIG_HWMON) || defined(CONFIG_HWMON_MODULE)
|
||||||
|
@ -317,7 +314,7 @@ static inline unsigned vaux_adjust(struct ads7846 *ts, ssize_t v)
|
||||||
unsigned retval = v;
|
unsigned retval = v;
|
||||||
|
|
||||||
/* external resistors may scale vAUX into 0..vREF */
|
/* external resistors may scale vAUX into 0..vREF */
|
||||||
retval *= vREF_mV;
|
retval *= ts->vref_mv;
|
||||||
retval = retval >> 12;
|
retval = retval >> 12;
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
@ -375,14 +372,14 @@ static int ads784x_hwmon_register(struct spi_device *spi, struct ads7846 *ts)
|
||||||
/* hwmon sensors need a reference voltage */
|
/* hwmon sensors need a reference voltage */
|
||||||
switch (ts->model) {
|
switch (ts->model) {
|
||||||
case 7846:
|
case 7846:
|
||||||
if (!vREF_mV) {
|
if (!ts->vref_mv) {
|
||||||
dev_dbg(&spi->dev, "assuming 2.5V internal vREF\n");
|
dev_dbg(&spi->dev, "assuming 2.5V internal vREF\n");
|
||||||
vREF_mV = 2500;
|
ts->vref_mv = 2500;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 7845:
|
case 7845:
|
||||||
case 7843:
|
case 7843:
|
||||||
if (!vREF_mV) {
|
if (!ts->vref_mv) {
|
||||||
dev_warn(&spi->dev,
|
dev_warn(&spi->dev,
|
||||||
"external vREF for ADS%d not specified\n",
|
"external vREF for ADS%d not specified\n",
|
||||||
ts->model);
|
ts->model);
|
||||||
|
@ -875,6 +872,7 @@ static int __devinit ads7846_probe(struct spi_device *spi)
|
||||||
|
|
||||||
ts->spi = spi;
|
ts->spi = spi;
|
||||||
ts->input = input_dev;
|
ts->input = input_dev;
|
||||||
|
ts->vref_mv = pdata->vref_mv;
|
||||||
|
|
||||||
hrtimer_init(&ts->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
|
hrtimer_init(&ts->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
|
||||||
ts->timer.function = ads7846_timer;
|
ts->timer.function = ads7846_timer;
|
||||||
|
|
|
@ -14,7 +14,8 @@ enum ads7846_filter {
|
||||||
struct ads7846_platform_data {
|
struct ads7846_platform_data {
|
||||||
u16 model; /* 7843, 7845, 7846. */
|
u16 model; /* 7843, 7845, 7846. */
|
||||||
u16 vref_delay_usecs; /* 0 for external vref; etc */
|
u16 vref_delay_usecs; /* 0 for external vref; etc */
|
||||||
int keep_vref_on:1; /* set to keep vref on for differential
|
u16 vref_mv; /* external vref value, milliVolts */
|
||||||
|
bool keep_vref_on; /* set to keep vref on for differential
|
||||||
* measurements as well */
|
* measurements as well */
|
||||||
|
|
||||||
/* Settling time of the analog signals; a function of Vcc and the
|
/* Settling time of the analog signals; a function of Vcc and the
|
||||||
|
|
Loading…
Reference in a new issue