Skip to content

Commit

Permalink
Input: ads7846 - simplify support of external vREF (and ads7843)
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
David Brownell authored and Dmitry Torokhov committed Apr 2, 2008
1 parent e6cdd15 commit 7c6d0ee
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 13 deletions.
22 changes: 10 additions & 12 deletions drivers/input/touchscreen/ads7846.c
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ struct ads7846 {
#endif

u16 model;
u16 vref_mv;
u16 vref_delay_usecs;
u16 x_plate_ohms;
u16 pressure_max;
Expand Down Expand Up @@ -184,9 +185,6 @@ struct ads7846 {
* The range is GND..vREF. The ads7843 and ads7835 must use external 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 {
u8 ref_on;
Expand All @@ -213,7 +211,6 @@ static int ads7846_read12_ser(struct device *dev, unsigned command)
struct ads7846 *ts = dev_get_drvdata(dev);
struct ser_req *req = kzalloc(sizeof *req, GFP_KERNEL);
int status;
int uninitialized_var(sample);
int use_internal;

if (!req)
Expand Down Expand Up @@ -270,13 +267,13 @@ static int ads7846_read12_ser(struct device *dev, unsigned command)

if (status == 0) {
/* on-wire is a must-ignore bit, a BE12 value, then padding */
sample = be16_to_cpu(req->sample);
sample = sample >> 3;
sample &= 0x0fff;
status = be16_to_cpu(req->sample);
status = status >> 3;
status &= 0x0fff;
}

kfree(req);
return status ? status : sample;
return status;
}

#if defined(CONFIG_HWMON) || defined(CONFIG_HWMON_MODULE)
Expand Down Expand Up @@ -317,7 +314,7 @@ static inline unsigned vaux_adjust(struct ads7846 *ts, ssize_t v)
unsigned retval = v;

/* external resistors may scale vAUX into 0..vREF */
retval *= vREF_mV;
retval *= ts->vref_mv;
retval = retval >> 12;
return retval;
}
Expand Down Expand Up @@ -375,14 +372,14 @@ static int ads784x_hwmon_register(struct spi_device *spi, struct ads7846 *ts)
/* hwmon sensors need a reference voltage */
switch (ts->model) {
case 7846:
if (!vREF_mV) {
if (!ts->vref_mv) {
dev_dbg(&spi->dev, "assuming 2.5V internal vREF\n");
vREF_mV = 2500;
ts->vref_mv = 2500;
}
break;
case 7845:
case 7843:
if (!vREF_mV) {
if (!ts->vref_mv) {
dev_warn(&spi->dev,
"external vREF for ADS%d not specified\n",
ts->model);
Expand Down Expand Up @@ -875,6 +872,7 @@ static int __devinit ads7846_probe(struct spi_device *spi)

ts->spi = spi;
ts->input = input_dev;
ts->vref_mv = pdata->vref_mv;

hrtimer_init(&ts->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
ts->timer.function = ads7846_timer;
Expand Down
3 changes: 2 additions & 1 deletion include/linux/spi/ads7846.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@ enum ads7846_filter {
struct ads7846_platform_data {
u16 model; /* 7843, 7845, 7846. */
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 */

/* Settling time of the analog signals; a function of Vcc and the
Expand Down

0 comments on commit 7c6d0ee

Please sign in to comment.