Lines Matching refs:ucb

37 static void ucb1400_ts_mode_int(struct ucb1400_ts *ucb)  in ucb1400_ts_mode_int()  argument
39 ucb1400_reg_write(ucb->ac97, UCB_TS_CR, in ucb1400_ts_mode_int()
49 static unsigned int ucb1400_ts_read_pressure(struct ucb1400_ts *ucb) in ucb1400_ts_read_pressure() argument
51 ucb1400_reg_write(ucb->ac97, UCB_TS_CR, in ucb1400_ts_read_pressure()
58 return ucb1400_adc_read(ucb->ac97, UCB_ADC_INP_TSPY, adcsync); in ucb1400_ts_read_pressure()
67 static unsigned int ucb1400_ts_read_xpos(struct ucb1400_ts *ucb) in ucb1400_ts_read_xpos() argument
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()
75 ucb1400_reg_write(ucb->ac97, UCB_TS_CR, in ucb1400_ts_read_xpos()
81 return ucb1400_adc_read(ucb->ac97, UCB_ADC_INP_TSPY, adcsync); in ucb1400_ts_read_xpos()
90 static int ucb1400_ts_read_ypos(struct ucb1400_ts *ucb) in ucb1400_ts_read_ypos() argument
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()
98 ucb1400_reg_write(ucb->ac97, UCB_TS_CR, in ucb1400_ts_read_ypos()
104 return ucb1400_adc_read(ucb->ac97, UCB_ADC_INP_TSPX, adcsync); in ucb1400_ts_read_ypos()
111 static unsigned int ucb1400_ts_read_xres(struct ucb1400_ts *ucb) in ucb1400_ts_read_xres() argument
113 ucb1400_reg_write(ucb->ac97, UCB_TS_CR, in ucb1400_ts_read_xres()
116 return ucb1400_adc_read(ucb->ac97, 0, adcsync); in ucb1400_ts_read_xres()
123 static unsigned int ucb1400_ts_read_yres(struct ucb1400_ts *ucb) in ucb1400_ts_read_yres() argument
125 ucb1400_reg_write(ucb->ac97, UCB_TS_CR, in ucb1400_ts_read_yres()
128 return ucb1400_adc_read(ucb->ac97, 0, adcsync); in ucb1400_ts_read_yres()
131 static int ucb1400_ts_pen_up(struct ucb1400_ts *ucb) in ucb1400_ts_pen_up() argument
133 unsigned short val = ucb1400_reg_read(ucb->ac97, UCB_TS_CR); in ucb1400_ts_pen_up()
138 static void ucb1400_ts_irq_enable(struct ucb1400_ts *ucb) in ucb1400_ts_irq_enable() argument
140 ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, UCB_IE_TSPX); in ucb1400_ts_irq_enable()
141 ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, 0); in ucb1400_ts_irq_enable()
142 ucb1400_reg_write(ucb->ac97, UCB_IE_FAL, UCB_IE_TSPX); in ucb1400_ts_irq_enable()
145 static void ucb1400_ts_irq_disable(struct ucb1400_ts *ucb) in ucb1400_ts_irq_disable() argument
147 ucb1400_reg_write(ucb->ac97, UCB_IE_FAL, 0); in ucb1400_ts_irq_disable()
166 static void ucb1400_clear_pending_irq(struct ucb1400_ts *ucb) in ucb1400_clear_pending_irq() argument
170 isr = ucb1400_reg_read(ucb->ac97, UCB_IE_STATUS); in ucb1400_clear_pending_irq()
171 ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, isr); in ucb1400_clear_pending_irq()
172 ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, 0); in ucb1400_clear_pending_irq()
175 ucb1400_ts_irq_disable(ucb); in ucb1400_clear_pending_irq()
177 dev_dbg(&ucb->ts_idev->dev, in ucb1400_clear_pending_irq()
190 struct ucb1400_ts *ucb = devid; in ucb1400_irq() local
194 if (unlikely(irqnr != ucb->irq)) in ucb1400_irq()
197 ucb1400_clear_pending_irq(ucb); in ucb1400_irq()
202 while (!ucb->stopped && !(penup = ucb1400_ts_pen_up(ucb))) { in ucb1400_irq()
204 ucb1400_adc_enable(ucb->ac97); in ucb1400_irq()
205 x = ucb1400_ts_read_xpos(ucb); in ucb1400_irq()
206 y = ucb1400_ts_read_ypos(ucb); in ucb1400_irq()
207 p = ucb1400_ts_read_pressure(ucb); in ucb1400_irq()
208 ucb1400_adc_disable(ucb->ac97); in ucb1400_irq()
210 ucb1400_ts_report_event(ucb->ts_idev, p, x, y); in ucb1400_irq()
212 wait_event_timeout(ucb->ts_wait, ucb->stopped, in ucb1400_irq()
216 ucb1400_ts_event_release(ucb->ts_idev); in ucb1400_irq()
218 if (!ucb->stopped) { in ucb1400_irq()
220 ucb1400_ts_mode_int(ucb); in ucb1400_irq()
221 ucb1400_ts_irq_enable(ucb); in ucb1400_irq()
227 static void ucb1400_ts_stop(struct ucb1400_ts *ucb) in ucb1400_ts_stop() argument
230 ucb->stopped = true; in ucb1400_ts_stop()
232 wake_up(&ucb->ts_wait); in ucb1400_ts_stop()
233 disable_irq(ucb->irq); in ucb1400_ts_stop()
235 ucb1400_ts_irq_disable(ucb); in ucb1400_ts_stop()
236 ucb1400_reg_write(ucb->ac97, UCB_TS_CR, 0); in ucb1400_ts_stop()
240 static void ucb1400_ts_start(struct ucb1400_ts *ucb) in ucb1400_ts_start() argument
243 ucb->stopped = false; in ucb1400_ts_start()
246 ucb1400_ts_mode_int(ucb); in ucb1400_ts_start()
247 ucb1400_ts_irq_enable(ucb); in ucb1400_ts_start()
249 enable_irq(ucb->irq); in ucb1400_ts_start()
254 struct ucb1400_ts *ucb = input_get_drvdata(idev); in ucb1400_ts_open() local
256 ucb1400_ts_start(ucb); in ucb1400_ts_open()
263 struct ucb1400_ts *ucb = input_get_drvdata(idev); in ucb1400_ts_close() local
265 ucb1400_ts_stop(ucb); in ucb1400_ts_close()
276 static int ucb1400_ts_detect_irq(struct ucb1400_ts *ucb, in ucb1400_ts_detect_irq() argument
284 ucb1400_reg_write(ucb->ac97, UCB_IE_RIS, UCB_IE_ADC); in ucb1400_ts_detect_irq()
285 ucb1400_reg_write(ucb->ac97, UCB_IE_FAL, UCB_IE_ADC); in ucb1400_ts_detect_irq()
286 ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, 0xffff); in ucb1400_ts_detect_irq()
287 ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, 0); in ucb1400_ts_detect_irq()
290 ucb1400_reg_write(ucb->ac97, UCB_ADC_CR, UCB_ADC_ENA); in ucb1400_ts_detect_irq()
291 ucb1400_reg_write(ucb->ac97, UCB_ADC_CR, UCB_ADC_ENA | UCB_ADC_START); in ucb1400_ts_detect_irq()
295 while (!(ucb1400_reg_read(ucb->ac97, UCB_ADC_DATA) & in ucb1400_ts_detect_irq()
304 ucb1400_reg_write(ucb->ac97, UCB_ADC_CR, 0); in ucb1400_ts_detect_irq()
307 ucb1400_reg_write(ucb->ac97, UCB_IE_RIS, 0); in ucb1400_ts_detect_irq()
308 ucb1400_reg_write(ucb->ac97, UCB_IE_FAL, 0); in ucb1400_ts_detect_irq()
309 ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, 0xffff); in ucb1400_ts_detect_irq()
310 ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, 0); in ucb1400_ts_detect_irq()
313 ucb->irq = probe_irq_off(mask); in ucb1400_ts_detect_irq()
314 if (ucb->irq < 0 || ucb->irq == NO_IRQ) in ucb1400_ts_detect_irq()
322 struct ucb1400_ts *ucb = dev_get_platdata(&pdev->dev); in ucb1400_ts_probe() local
326 ucb->ts_idev = input_allocate_device(); in ucb1400_ts_probe()
327 if (!ucb->ts_idev) { in ucb1400_ts_probe()
333 if (ucb->irq < 0) { in ucb1400_ts_probe()
334 error = ucb1400_ts_detect_irq(ucb, pdev); in ucb1400_ts_probe()
340 dev_dbg(&pdev->dev, "found IRQ %d\n", ucb->irq); in ucb1400_ts_probe()
342 init_waitqueue_head(&ucb->ts_wait); in ucb1400_ts_probe()
344 input_set_drvdata(ucb->ts_idev, ucb); in ucb1400_ts_probe()
346 ucb->ts_idev->dev.parent = &pdev->dev; in ucb1400_ts_probe()
347 ucb->ts_idev->name = "UCB1400 touchscreen interface"; in ucb1400_ts_probe()
348 ucb->ts_idev->id.vendor = ucb1400_reg_read(ucb->ac97, in ucb1400_ts_probe()
350 ucb->ts_idev->id.product = ucb->id; in ucb1400_ts_probe()
351 ucb->ts_idev->open = ucb1400_ts_open; in ucb1400_ts_probe()
352 ucb->ts_idev->close = ucb1400_ts_close; in ucb1400_ts_probe()
353 ucb->ts_idev->evbit[0] = BIT_MASK(EV_ABS) | BIT_MASK(EV_KEY); in ucb1400_ts_probe()
354 ucb->ts_idev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); in ucb1400_ts_probe()
361 fcsr = ucb1400_reg_read(ucb->ac97, UCB_FCSR); in ucb1400_ts_probe()
362 ucb1400_reg_write(ucb->ac97, UCB_FCSR, fcsr | UCB_FCSR_AVE); in ucb1400_ts_probe()
364 ucb1400_adc_enable(ucb->ac97); in ucb1400_ts_probe()
365 x_res = ucb1400_ts_read_xres(ucb); in ucb1400_ts_probe()
366 y_res = ucb1400_ts_read_yres(ucb); in ucb1400_ts_probe()
367 ucb1400_adc_disable(ucb->ac97); in ucb1400_ts_probe()
370 input_set_abs_params(ucb->ts_idev, ABS_X, 0, x_res, 0, 0); in ucb1400_ts_probe()
371 input_set_abs_params(ucb->ts_idev, ABS_Y, 0, y_res, 0, 0); in ucb1400_ts_probe()
372 input_set_abs_params(ucb->ts_idev, ABS_PRESSURE, 0, 0, 0, 0); in ucb1400_ts_probe()
374 ucb1400_ts_stop(ucb); in ucb1400_ts_probe()
376 error = request_threaded_irq(ucb->irq, NULL, ucb1400_irq, in ucb1400_ts_probe()
378 "UCB1400", ucb); in ucb1400_ts_probe()
381 "unable to grab irq%d: %d\n", ucb->irq, error); in ucb1400_ts_probe()
385 error = input_register_device(ucb->ts_idev); in ucb1400_ts_probe()
392 free_irq(ucb->irq, ucb); in ucb1400_ts_probe()
394 input_free_device(ucb->ts_idev); in ucb1400_ts_probe()
401 struct ucb1400_ts *ucb = dev_get_platdata(&pdev->dev); in ucb1400_ts_remove() local
403 free_irq(ucb->irq, ucb); in ucb1400_ts_remove()
404 input_unregister_device(ucb->ts_idev); in ucb1400_ts_remove()
411 struct ucb1400_ts *ucb = dev_get_platdata(dev); in ucb1400_ts_suspend() local
412 struct input_dev *idev = ucb->ts_idev; in ucb1400_ts_suspend()
417 ucb1400_ts_start(ucb); in ucb1400_ts_suspend()
425 struct ucb1400_ts *ucb = dev_get_platdata(dev); in ucb1400_ts_resume() local
426 struct input_dev *idev = ucb->ts_idev; in ucb1400_ts_resume()
431 ucb1400_ts_stop(ucb); in ucb1400_ts_resume()