Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Input: ads7846 - add possibility to use external vref on ads7846

Just set vref_mv in your platform config to use external vref. Otherwise
the internal one is used.

Signed-off-by: Alexander Stein <alexander.stein@systec-electronic.com>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>

authored by

Alexander Stein and committed by
Dmitry Torokhov
ebcaaad9 e70bdd41

+13 -9
+11 -8
drivers/input/touchscreen/ads7846.c
··· 109 109 u16 pressure_max; 110 110 111 111 bool swap_xy; 112 + bool use_internal; 112 113 113 114 struct ads7846_packet *packet; 114 115 ··· 301 300 struct ads7846 *ts = dev_get_drvdata(dev); 302 301 struct ser_req *req; 303 302 int status; 304 - int use_internal; 305 303 306 304 req = kzalloc(sizeof *req, GFP_KERNEL); 307 305 if (!req) ··· 308 308 309 309 spi_message_init(&req->msg); 310 310 311 - /* FIXME boards with ads7846 might use external vref instead ... */ 312 - use_internal = (ts->model == 7846); 313 - 314 311 /* maybe turn on internal vREF, and let it settle */ 315 - if (use_internal) { 312 + if (ts->use_internal) { 316 313 req->ref_on = REF_ON; 317 314 req->xfer[0].tx_buf = &req->ref_on; 318 315 req->xfer[0].len = 1; ··· 321 324 /* for 1uF, settle for 800 usec; no cap, 100 usec. */ 322 325 req->xfer[1].delay_usecs = ts->vref_delay_usecs; 323 326 spi_message_add_tail(&req->xfer[1], &req->msg); 327 + 328 + /* Enable reference voltage */ 329 + command |= ADS_PD10_REF_ON; 324 330 } 331 + 332 + /* Enable ADC in every case */ 333 + command |= ADS_PD10_ADC_ON; 325 334 326 335 /* take sample */ 327 336 req->command = (u8) command; ··· 412 409 { \ 413 410 struct ads7846 *ts = dev_get_drvdata(dev); \ 414 411 ssize_t v = ads7846_read12_ser(dev, \ 415 - READ_12BIT_SER(var) | ADS_PD10_ALL_ON); \ 412 + READ_12BIT_SER(var)); \ 416 413 if (v < 0) \ 417 414 return v; \ 418 415 return sprintf(buf, "%u\n", adjust(ts, v)); \ ··· 505 502 if (!ts->vref_mv) { 506 503 dev_dbg(&spi->dev, "assuming 2.5V internal vREF\n"); 507 504 ts->vref_mv = 2500; 505 + ts->use_internal = true; 508 506 } 509 507 break; 510 508 case 7845: ··· 1337 1333 if (ts->model == 7845) 1338 1334 ads7845_read12_ser(&spi->dev, PWRDOWN); 1339 1335 else 1340 - (void) ads7846_read12_ser(&spi->dev, 1341 - READ_12BIT_SER(vaux) | ADS_PD10_ALL_ON); 1336 + (void) ads7846_read12_ser(&spi->dev, READ_12BIT_SER(vaux)); 1342 1337 1343 1338 err = sysfs_create_group(&spi->dev.kobj, &ads784x_attr_group); 1344 1339 if (err)
+2 -1
include/linux/spi/ads7846.h
··· 14 14 struct ads7846_platform_data { 15 15 u16 model; /* 7843, 7845, 7846, 7873. */ 16 16 u16 vref_delay_usecs; /* 0 for external vref; etc */ 17 - u16 vref_mv; /* external vref value, milliVolts */ 17 + u16 vref_mv; /* external vref value, milliVolts 18 + * ads7846: if 0, use internal vref */ 18 19 bool keep_vref_on; /* set to keep vref on for differential 19 20 * measurements as well */ 20 21 bool swap_xy; /* swap x and y axes */