ucb1400_ts.c (12360B)
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Philips UCB1400 touchscreen driver 4 * 5 * Author: Nicolas Pitre 6 * Created: September 25, 2006 7 * Copyright: MontaVista Software, Inc. 8 * 9 * Spliting done by: Marek Vasut <marek.vasut@gmail.com> 10 * If something doesn't work and it worked before spliting, e-mail me, 11 * dont bother Nicolas please ;-) 12 * 13 * This code is heavily based on ucb1x00-*.c copyrighted by Russell King 14 * covering the UCB1100, UCB1200 and UCB1300.. Support for the UCB1400 has 15 * been made separate from ucb1x00-core/ucb1x00-ts on Russell's request. 16 */ 17 18#include <linux/module.h> 19#include <linux/delay.h> 20#include <linux/sched.h> 21#include <linux/wait.h> 22#include <linux/input.h> 23#include <linux/device.h> 24#include <linux/interrupt.h> 25#include <linux/ucb1400.h> 26 27#define UCB1400_TS_POLL_PERIOD 10 /* ms */ 28 29static bool adcsync; 30static int ts_delay = 55; /* us */ 31static int ts_delay_pressure; /* us */ 32 33/* Switch to interrupt mode. */ 34static void ucb1400_ts_mode_int(struct ucb1400_ts *ucb) 35{ 36 ucb1400_reg_write(ucb->ac97, UCB_TS_CR, 37 UCB_TS_CR_TSMX_POW | UCB_TS_CR_TSPX_POW | 38 UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_GND | 39 UCB_TS_CR_MODE_INT); 40} 41 42/* 43 * Switch to pressure mode, and read pressure. We don't need to wait 44 * here, since both plates are being driven. 45 */ 46static unsigned int ucb1400_ts_read_pressure(struct ucb1400_ts *ucb) 47{ 48 ucb1400_reg_write(ucb->ac97, UCB_TS_CR, 49 UCB_TS_CR_TSMX_POW | UCB_TS_CR_TSPX_POW | 50 UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_GND | 51 UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); 52 53 udelay(ts_delay_pressure); 54 55 return ucb1400_adc_read(ucb->ac97, UCB_ADC_INP_TSPY, adcsync); 56} 57 58/* 59 * Switch to X position mode and measure Y plate. We switch the plate 60 * configuration in pressure mode, then switch to position mode. This 61 * gives a faster response time. Even so, we need to wait about 55us 62 * for things to stabilise. 63 */ 64static unsigned int ucb1400_ts_read_xpos(struct ucb1400_ts *ucb) 65{ 66 ucb1400_reg_write(ucb->ac97, UCB_TS_CR, 67 UCB_TS_CR_TSMX_GND | UCB_TS_CR_TSPX_POW | 68 UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); 69 ucb1400_reg_write(ucb->ac97, UCB_TS_CR, 70 UCB_TS_CR_TSMX_GND | UCB_TS_CR_TSPX_POW | 71 UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); 72 ucb1400_reg_write(ucb->ac97, UCB_TS_CR, 73 UCB_TS_CR_TSMX_GND | UCB_TS_CR_TSPX_POW | 74 UCB_TS_CR_MODE_POS | UCB_TS_CR_BIAS_ENA); 75 76 udelay(ts_delay); 77 78 return ucb1400_adc_read(ucb->ac97, UCB_ADC_INP_TSPY, adcsync); 79} 80 81/* 82 * Switch to Y position mode and measure X plate. We switch the plate 83 * configuration in pressure mode, then switch to position mode. This 84 * gives a faster response time. Even so, we need to wait about 55us 85 * for things to stabilise. 86 */ 87static int ucb1400_ts_read_ypos(struct ucb1400_ts *ucb) 88{ 89 ucb1400_reg_write(ucb->ac97, UCB_TS_CR, 90 UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_POW | 91 UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); 92 ucb1400_reg_write(ucb->ac97, UCB_TS_CR, 93 UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_POW | 94 UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); 95 ucb1400_reg_write(ucb->ac97, UCB_TS_CR, 96 UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_POW | 97 UCB_TS_CR_MODE_POS | UCB_TS_CR_BIAS_ENA); 98 99 udelay(ts_delay); 100 101 return ucb1400_adc_read(ucb->ac97, UCB_ADC_INP_TSPX, adcsync); 102} 103 104/* 105 * Switch to X plate resistance mode. Set MX to ground, PX to 106 * supply. Measure current. 107 */ 108static unsigned int ucb1400_ts_read_xres(struct ucb1400_ts *ucb) 109{ 110 ucb1400_reg_write(ucb->ac97, UCB_TS_CR, 111 UCB_TS_CR_TSMX_GND | UCB_TS_CR_TSPX_POW | 112 UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); 113 return ucb1400_adc_read(ucb->ac97, 0, adcsync); 114} 115 116/* 117 * Switch to Y plate resistance mode. Set MY to ground, PY to 118 * supply. Measure current. 119 */ 120static unsigned int ucb1400_ts_read_yres(struct ucb1400_ts *ucb) 121{ 122 ucb1400_reg_write(ucb->ac97, UCB_TS_CR, 123 UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_POW | 124 UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); 125 return ucb1400_adc_read(ucb->ac97, 0, adcsync); 126} 127 128static int ucb1400_ts_pen_up(struct ucb1400_ts *ucb) 129{ 130 unsigned short val = ucb1400_reg_read(ucb->ac97, UCB_TS_CR); 131 132 return val & (UCB_TS_CR_TSPX_LOW | UCB_TS_CR_TSMX_LOW); 133} 134 135static void ucb1400_ts_irq_enable(struct ucb1400_ts *ucb) 136{ 137 ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, UCB_IE_TSPX); 138 ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, 0); 139 ucb1400_reg_write(ucb->ac97, UCB_IE_FAL, UCB_IE_TSPX); 140} 141 142static void ucb1400_ts_irq_disable(struct ucb1400_ts *ucb) 143{ 144 ucb1400_reg_write(ucb->ac97, UCB_IE_FAL, 0); 145} 146 147static void ucb1400_ts_report_event(struct input_dev *idev, u16 pressure, u16 x, u16 y) 148{ 149 input_report_abs(idev, ABS_X, x); 150 input_report_abs(idev, ABS_Y, y); 151 input_report_abs(idev, ABS_PRESSURE, pressure); 152 input_report_key(idev, BTN_TOUCH, 1); 153 input_sync(idev); 154} 155 156static void ucb1400_ts_event_release(struct input_dev *idev) 157{ 158 input_report_abs(idev, ABS_PRESSURE, 0); 159 input_report_key(idev, BTN_TOUCH, 0); 160 input_sync(idev); 161} 162 163static void ucb1400_clear_pending_irq(struct ucb1400_ts *ucb) 164{ 165 unsigned int isr; 166 167 isr = ucb1400_reg_read(ucb->ac97, UCB_IE_STATUS); 168 ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, isr); 169 ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, 0); 170 171 if (isr & UCB_IE_TSPX) 172 ucb1400_ts_irq_disable(ucb); 173 else 174 dev_dbg(&ucb->ts_idev->dev, 175 "ucb1400: unexpected IE_STATUS = %#x\n", isr); 176} 177 178/* 179 * A restriction with interrupts exists when using the ucb1400, as 180 * the codec read/write routines may sleep while waiting for codec 181 * access completion and uses semaphores for access control to the 182 * AC97 bus. Therefore the driver is forced to use threaded interrupt 183 * handler. 184 */ 185static irqreturn_t ucb1400_irq(int irqnr, void *devid) 186{ 187 struct ucb1400_ts *ucb = devid; 188 unsigned int x, y, p; 189 190 if (unlikely(irqnr != ucb->irq)) 191 return IRQ_NONE; 192 193 ucb1400_clear_pending_irq(ucb); 194 195 /* Start with a small delay before checking pendown state */ 196 msleep(UCB1400_TS_POLL_PERIOD); 197 198 while (!ucb->stopped && !ucb1400_ts_pen_up(ucb)) { 199 ucb1400_adc_enable(ucb->ac97); 200 x = ucb1400_ts_read_xpos(ucb); 201 y = ucb1400_ts_read_ypos(ucb); 202 p = ucb1400_ts_read_pressure(ucb); 203 ucb1400_adc_disable(ucb->ac97); 204 205 ucb1400_ts_report_event(ucb->ts_idev, p, x, y); 206 207 wait_event_timeout(ucb->ts_wait, ucb->stopped, 208 msecs_to_jiffies(UCB1400_TS_POLL_PERIOD)); 209 } 210 211 ucb1400_ts_event_release(ucb->ts_idev); 212 213 if (!ucb->stopped) { 214 /* Switch back to interrupt mode. */ 215 ucb1400_ts_mode_int(ucb); 216 ucb1400_ts_irq_enable(ucb); 217 } 218 219 return IRQ_HANDLED; 220} 221 222static void ucb1400_ts_stop(struct ucb1400_ts *ucb) 223{ 224 /* Signal IRQ thread to stop polling and disable the handler. */ 225 ucb->stopped = true; 226 mb(); 227 wake_up(&ucb->ts_wait); 228 disable_irq(ucb->irq); 229 230 ucb1400_ts_irq_disable(ucb); 231 ucb1400_reg_write(ucb->ac97, UCB_TS_CR, 0); 232} 233 234/* Must be called with ts->lock held */ 235static void ucb1400_ts_start(struct ucb1400_ts *ucb) 236{ 237 /* Tell IRQ thread that it may poll the device. */ 238 ucb->stopped = false; 239 mb(); 240 241 ucb1400_ts_mode_int(ucb); 242 ucb1400_ts_irq_enable(ucb); 243 244 enable_irq(ucb->irq); 245} 246 247static int ucb1400_ts_open(struct input_dev *idev) 248{ 249 struct ucb1400_ts *ucb = input_get_drvdata(idev); 250 251 ucb1400_ts_start(ucb); 252 253 return 0; 254} 255 256static void ucb1400_ts_close(struct input_dev *idev) 257{ 258 struct ucb1400_ts *ucb = input_get_drvdata(idev); 259 260 ucb1400_ts_stop(ucb); 261} 262 263#ifndef NO_IRQ 264#define NO_IRQ 0 265#endif 266 267/* 268 * Try to probe our interrupt, rather than relying on lots of 269 * hard-coded machine dependencies. 270 */ 271static int ucb1400_ts_detect_irq(struct ucb1400_ts *ucb, 272 struct platform_device *pdev) 273{ 274 unsigned long mask, timeout; 275 276 mask = probe_irq_on(); 277 278 /* Enable the ADC interrupt. */ 279 ucb1400_reg_write(ucb->ac97, UCB_IE_RIS, UCB_IE_ADC); 280 ucb1400_reg_write(ucb->ac97, UCB_IE_FAL, UCB_IE_ADC); 281 ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, 0xffff); 282 ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, 0); 283 284 /* Cause an ADC interrupt. */ 285 ucb1400_reg_write(ucb->ac97, UCB_ADC_CR, UCB_ADC_ENA); 286 ucb1400_reg_write(ucb->ac97, UCB_ADC_CR, UCB_ADC_ENA | UCB_ADC_START); 287 288 /* Wait for the conversion to complete. */ 289 timeout = jiffies + HZ/2; 290 while (!(ucb1400_reg_read(ucb->ac97, UCB_ADC_DATA) & 291 UCB_ADC_DAT_VALID)) { 292 cpu_relax(); 293 if (time_after(jiffies, timeout)) { 294 dev_err(&pdev->dev, "timed out in IRQ probe\n"); 295 probe_irq_off(mask); 296 return -ENODEV; 297 } 298 } 299 ucb1400_reg_write(ucb->ac97, UCB_ADC_CR, 0); 300 301 /* Disable and clear interrupt. */ 302 ucb1400_reg_write(ucb->ac97, UCB_IE_RIS, 0); 303 ucb1400_reg_write(ucb->ac97, UCB_IE_FAL, 0); 304 ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, 0xffff); 305 ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, 0); 306 307 /* Read triggered interrupt. */ 308 ucb->irq = probe_irq_off(mask); 309 if (ucb->irq < 0 || ucb->irq == NO_IRQ) 310 return -ENODEV; 311 312 return 0; 313} 314 315static int ucb1400_ts_probe(struct platform_device *pdev) 316{ 317 struct ucb1400_ts *ucb = dev_get_platdata(&pdev->dev); 318 int error, x_res, y_res; 319 u16 fcsr; 320 321 ucb->ts_idev = input_allocate_device(); 322 if (!ucb->ts_idev) { 323 error = -ENOMEM; 324 goto err; 325 } 326 327 /* Only in case the IRQ line wasn't supplied, try detecting it */ 328 if (ucb->irq < 0) { 329 error = ucb1400_ts_detect_irq(ucb, pdev); 330 if (error) { 331 dev_err(&pdev->dev, "IRQ probe failed\n"); 332 goto err_free_devs; 333 } 334 } 335 dev_dbg(&pdev->dev, "found IRQ %d\n", ucb->irq); 336 337 init_waitqueue_head(&ucb->ts_wait); 338 339 input_set_drvdata(ucb->ts_idev, ucb); 340 341 ucb->ts_idev->dev.parent = &pdev->dev; 342 ucb->ts_idev->name = "UCB1400 touchscreen interface"; 343 ucb->ts_idev->id.vendor = ucb1400_reg_read(ucb->ac97, 344 AC97_VENDOR_ID1); 345 ucb->ts_idev->id.product = ucb->id; 346 ucb->ts_idev->open = ucb1400_ts_open; 347 ucb->ts_idev->close = ucb1400_ts_close; 348 ucb->ts_idev->evbit[0] = BIT_MASK(EV_ABS) | BIT_MASK(EV_KEY); 349 ucb->ts_idev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); 350 351 /* 352 * Enable ADC filter to prevent horrible jitter on Colibri. 353 * This also further reduces jitter on boards where ADCSYNC 354 * pin is connected. 355 */ 356 fcsr = ucb1400_reg_read(ucb->ac97, UCB_FCSR); 357 ucb1400_reg_write(ucb->ac97, UCB_FCSR, fcsr | UCB_FCSR_AVE); 358 359 ucb1400_adc_enable(ucb->ac97); 360 x_res = ucb1400_ts_read_xres(ucb); 361 y_res = ucb1400_ts_read_yres(ucb); 362 ucb1400_adc_disable(ucb->ac97); 363 dev_dbg(&pdev->dev, "x/y = %d/%d\n", x_res, y_res); 364 365 input_set_abs_params(ucb->ts_idev, ABS_X, 0, x_res, 0, 0); 366 input_set_abs_params(ucb->ts_idev, ABS_Y, 0, y_res, 0, 0); 367 input_set_abs_params(ucb->ts_idev, ABS_PRESSURE, 0, 0, 0, 0); 368 369 ucb1400_ts_stop(ucb); 370 371 error = request_threaded_irq(ucb->irq, NULL, ucb1400_irq, 372 IRQF_TRIGGER_RISING | IRQF_ONESHOT, 373 "UCB1400", ucb); 374 if (error) { 375 dev_err(&pdev->dev, 376 "unable to grab irq%d: %d\n", ucb->irq, error); 377 goto err_free_devs; 378 } 379 380 error = input_register_device(ucb->ts_idev); 381 if (error) 382 goto err_free_irq; 383 384 return 0; 385 386err_free_irq: 387 free_irq(ucb->irq, ucb); 388err_free_devs: 389 input_free_device(ucb->ts_idev); 390err: 391 return error; 392} 393 394static int ucb1400_ts_remove(struct platform_device *pdev) 395{ 396 struct ucb1400_ts *ucb = dev_get_platdata(&pdev->dev); 397 398 free_irq(ucb->irq, ucb); 399 input_unregister_device(ucb->ts_idev); 400 401 return 0; 402} 403 404static int __maybe_unused ucb1400_ts_suspend(struct device *dev) 405{ 406 struct ucb1400_ts *ucb = dev_get_platdata(dev); 407 struct input_dev *idev = ucb->ts_idev; 408 409 mutex_lock(&idev->mutex); 410 411 if (input_device_enabled(idev)) 412 ucb1400_ts_stop(ucb); 413 414 mutex_unlock(&idev->mutex); 415 return 0; 416} 417 418static int __maybe_unused ucb1400_ts_resume(struct device *dev) 419{ 420 struct ucb1400_ts *ucb = dev_get_platdata(dev); 421 struct input_dev *idev = ucb->ts_idev; 422 423 mutex_lock(&idev->mutex); 424 425 if (input_device_enabled(idev)) 426 ucb1400_ts_start(ucb); 427 428 mutex_unlock(&idev->mutex); 429 return 0; 430} 431 432static SIMPLE_DEV_PM_OPS(ucb1400_ts_pm_ops, 433 ucb1400_ts_suspend, ucb1400_ts_resume); 434 435static struct platform_driver ucb1400_ts_driver = { 436 .probe = ucb1400_ts_probe, 437 .remove = ucb1400_ts_remove, 438 .driver = { 439 .name = "ucb1400_ts", 440 .pm = &ucb1400_ts_pm_ops, 441 }, 442}; 443module_platform_driver(ucb1400_ts_driver); 444 445module_param(adcsync, bool, 0444); 446MODULE_PARM_DESC(adcsync, "Synchronize touch readings with ADCSYNC pin."); 447 448module_param(ts_delay, int, 0444); 449MODULE_PARM_DESC(ts_delay, "Delay between panel setup and" 450 " position read. Default = 55us."); 451 452module_param(ts_delay_pressure, int, 0444); 453MODULE_PARM_DESC(ts_delay_pressure, 454 "delay between panel setup and pressure read." 455 " Default = 0us."); 456 457MODULE_DESCRIPTION("Philips UCB1400 touchscreen driver"); 458MODULE_LICENSE("GPL");