Lines Matching +full:px +full:- +full:supply

1 // SPDX-License-Identifier: GPL-2.0-only
10 * If something doesn't work and it worked before spliting, e-mail me,
11 * dont bother Nicolas please ;-)
13 * This code is heavily based on ucb1x00-*.c copyrighted by Russell King
15 * been made separate from ucb1x00-core/ucb1x00-ts on Russell's request.
36 ucb1400_reg_write(ucb->ac97, UCB_TS_CR, in ucb1400_ts_mode_int()
48 ucb1400_reg_write(ucb->ac97, UCB_TS_CR, in ucb1400_ts_read_pressure()
55 return ucb1400_adc_read(ucb->ac97, UCB_ADC_INP_TSPY, adcsync); in ucb1400_ts_read_pressure()
66 ucb1400_reg_write(ucb->ac97, UCB_TS_CR, in ucb1400_ts_read_xpos()
69 ucb1400_reg_write(ucb->ac97, UCB_TS_CR, in ucb1400_ts_read_xpos()
72 ucb1400_reg_write(ucb->ac97, UCB_TS_CR, in ucb1400_ts_read_xpos()
78 return ucb1400_adc_read(ucb->ac97, UCB_ADC_INP_TSPY, adcsync); in ucb1400_ts_read_xpos()
89 ucb1400_reg_write(ucb->ac97, UCB_TS_CR, in ucb1400_ts_read_ypos()
92 ucb1400_reg_write(ucb->ac97, UCB_TS_CR, in ucb1400_ts_read_ypos()
95 ucb1400_reg_write(ucb->ac97, UCB_TS_CR, in ucb1400_ts_read_ypos()
101 return ucb1400_adc_read(ucb->ac97, UCB_ADC_INP_TSPX, adcsync); in ucb1400_ts_read_ypos()
105 * Switch to X plate resistance mode. Set MX to ground, PX to
106 * supply. Measure current.
110 ucb1400_reg_write(ucb->ac97, UCB_TS_CR, in ucb1400_ts_read_xres()
113 return ucb1400_adc_read(ucb->ac97, 0, adcsync); in ucb1400_ts_read_xres()
118 * supply. Measure current.
122 ucb1400_reg_write(ucb->ac97, UCB_TS_CR, in ucb1400_ts_read_yres()
125 return ucb1400_adc_read(ucb->ac97, 0, adcsync); in ucb1400_ts_read_yres()
130 unsigned short val = ucb1400_reg_read(ucb->ac97, UCB_TS_CR); in ucb1400_ts_pen_up()
137 ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, UCB_IE_TSPX); in ucb1400_ts_irq_enable()
138 ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, 0); in ucb1400_ts_irq_enable()
139 ucb1400_reg_write(ucb->ac97, UCB_IE_FAL, UCB_IE_TSPX); in ucb1400_ts_irq_enable()
144 ucb1400_reg_write(ucb->ac97, UCB_IE_FAL, 0); in ucb1400_ts_irq_disable()
167 isr = ucb1400_reg_read(ucb->ac97, UCB_IE_STATUS); in ucb1400_clear_pending_irq()
168 ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, isr); in ucb1400_clear_pending_irq()
169 ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, 0); in ucb1400_clear_pending_irq()
174 dev_dbg(&ucb->ts_idev->dev, in ucb1400_clear_pending_irq()
190 if (unlikely(irqnr != ucb->irq)) in ucb1400_irq()
198 while (!ucb->stopped && !ucb1400_ts_pen_up(ucb)) { in ucb1400_irq()
199 ucb1400_adc_enable(ucb->ac97); in ucb1400_irq()
203 ucb1400_adc_disable(ucb->ac97); in ucb1400_irq()
205 ucb1400_ts_report_event(ucb->ts_idev, p, x, y); in ucb1400_irq()
207 wait_event_timeout(ucb->ts_wait, ucb->stopped, in ucb1400_irq()
211 ucb1400_ts_event_release(ucb->ts_idev); in ucb1400_irq()
213 if (!ucb->stopped) { in ucb1400_irq()
225 ucb->stopped = true; in ucb1400_ts_stop()
227 wake_up(&ucb->ts_wait); in ucb1400_ts_stop()
228 disable_irq(ucb->irq); in ucb1400_ts_stop()
231 ucb1400_reg_write(ucb->ac97, UCB_TS_CR, 0); in ucb1400_ts_stop()
234 /* Must be called with ts->lock held */
238 ucb->stopped = false; in ucb1400_ts_start()
244 enable_irq(ucb->irq); in ucb1400_ts_start()
269 * hard-coded machine dependencies.
279 ucb1400_reg_write(ucb->ac97, UCB_IE_RIS, UCB_IE_ADC); in ucb1400_ts_detect_irq()
280 ucb1400_reg_write(ucb->ac97, UCB_IE_FAL, UCB_IE_ADC); in ucb1400_ts_detect_irq()
281 ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, 0xffff); in ucb1400_ts_detect_irq()
282 ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, 0); in ucb1400_ts_detect_irq()
285 ucb1400_reg_write(ucb->ac97, UCB_ADC_CR, UCB_ADC_ENA); in ucb1400_ts_detect_irq()
286 ucb1400_reg_write(ucb->ac97, UCB_ADC_CR, UCB_ADC_ENA | UCB_ADC_START); in ucb1400_ts_detect_irq()
290 while (!(ucb1400_reg_read(ucb->ac97, UCB_ADC_DATA) & in ucb1400_ts_detect_irq()
294 dev_err(&pdev->dev, "timed out in IRQ probe\n"); in ucb1400_ts_detect_irq()
296 return -ENODEV; in ucb1400_ts_detect_irq()
299 ucb1400_reg_write(ucb->ac97, UCB_ADC_CR, 0); in ucb1400_ts_detect_irq()
302 ucb1400_reg_write(ucb->ac97, UCB_IE_RIS, 0); in ucb1400_ts_detect_irq()
303 ucb1400_reg_write(ucb->ac97, UCB_IE_FAL, 0); in ucb1400_ts_detect_irq()
304 ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, 0xffff); in ucb1400_ts_detect_irq()
305 ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, 0); in ucb1400_ts_detect_irq()
308 ucb->irq = probe_irq_off(mask); in ucb1400_ts_detect_irq()
309 if (ucb->irq < 0 || ucb->irq == NO_IRQ) in ucb1400_ts_detect_irq()
310 return -ENODEV; in ucb1400_ts_detect_irq()
317 struct ucb1400_ts *ucb = dev_get_platdata(&pdev->dev); in ucb1400_ts_probe()
321 ucb->ts_idev = input_allocate_device(); in ucb1400_ts_probe()
322 if (!ucb->ts_idev) { in ucb1400_ts_probe()
323 error = -ENOMEM; in ucb1400_ts_probe()
328 if (ucb->irq < 0) { in ucb1400_ts_probe()
331 dev_err(&pdev->dev, "IRQ probe failed\n"); in ucb1400_ts_probe()
335 dev_dbg(&pdev->dev, "found IRQ %d\n", ucb->irq); in ucb1400_ts_probe()
337 init_waitqueue_head(&ucb->ts_wait); in ucb1400_ts_probe()
339 input_set_drvdata(ucb->ts_idev, ucb); in ucb1400_ts_probe()
341 ucb->ts_idev->dev.parent = &pdev->dev; in ucb1400_ts_probe()
342 ucb->ts_idev->name = "UCB1400 touchscreen interface"; in ucb1400_ts_probe()
343 ucb->ts_idev->id.vendor = ucb1400_reg_read(ucb->ac97, in ucb1400_ts_probe()
345 ucb->ts_idev->id.product = ucb->id; in ucb1400_ts_probe()
346 ucb->ts_idev->open = ucb1400_ts_open; in ucb1400_ts_probe()
347 ucb->ts_idev->close = ucb1400_ts_close; in ucb1400_ts_probe()
348 ucb->ts_idev->evbit[0] = BIT_MASK(EV_ABS) | BIT_MASK(EV_KEY); in ucb1400_ts_probe()
349 ucb->ts_idev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); in ucb1400_ts_probe()
356 fcsr = ucb1400_reg_read(ucb->ac97, UCB_FCSR); in ucb1400_ts_probe()
357 ucb1400_reg_write(ucb->ac97, UCB_FCSR, fcsr | UCB_FCSR_AVE); in ucb1400_ts_probe()
359 ucb1400_adc_enable(ucb->ac97); in ucb1400_ts_probe()
362 ucb1400_adc_disable(ucb->ac97); in ucb1400_ts_probe()
363 dev_dbg(&pdev->dev, "x/y = %d/%d\n", x_res, y_res); in ucb1400_ts_probe()
365 input_set_abs_params(ucb->ts_idev, ABS_X, 0, x_res, 0, 0); in ucb1400_ts_probe()
366 input_set_abs_params(ucb->ts_idev, ABS_Y, 0, y_res, 0, 0); in ucb1400_ts_probe()
367 input_set_abs_params(ucb->ts_idev, ABS_PRESSURE, 0, 0, 0, 0); in ucb1400_ts_probe()
371 error = request_threaded_irq(ucb->irq, NULL, ucb1400_irq, in ucb1400_ts_probe()
375 dev_err(&pdev->dev, in ucb1400_ts_probe()
376 "unable to grab irq%d: %d\n", ucb->irq, error); in ucb1400_ts_probe()
380 error = input_register_device(ucb->ts_idev); in ucb1400_ts_probe()
387 free_irq(ucb->irq, ucb); in ucb1400_ts_probe()
389 input_free_device(ucb->ts_idev); in ucb1400_ts_probe()
396 struct ucb1400_ts *ucb = dev_get_platdata(&pdev->dev); in ucb1400_ts_remove()
398 free_irq(ucb->irq, ucb); in ucb1400_ts_remove()
399 input_unregister_device(ucb->ts_idev); in ucb1400_ts_remove()
407 struct input_dev *idev = ucb->ts_idev; in ucb1400_ts_suspend()
409 mutex_lock(&idev->mutex); in ucb1400_ts_suspend()
414 mutex_unlock(&idev->mutex); in ucb1400_ts_suspend()
421 struct input_dev *idev = ucb->ts_idev; in ucb1400_ts_resume()
423 mutex_lock(&idev->mutex); in ucb1400_ts_resume()
428 mutex_unlock(&idev->mutex); in ucb1400_ts_resume()