Lines Matching refs:wm
88 int wm97xx_reg_read(struct wm97xx *wm, u16 reg) in wm97xx_reg_read() argument
90 if (wm->ac97) in wm97xx_reg_read()
91 return wm->ac97->bus->ops->read(wm->ac97, reg); in wm97xx_reg_read()
97 void wm97xx_reg_write(struct wm97xx *wm, u16 reg, u16 val) in wm97xx_reg_write() argument
101 wm->dig[(reg - AC97_WM9713_DIG1) >> 1] = val; in wm97xx_reg_write()
105 wm->gpio[(reg - AC97_GPIO_CFG) >> 1] = val; in wm97xx_reg_write()
109 wm->misc = val; in wm97xx_reg_write()
111 if (wm->ac97) in wm97xx_reg_write()
112 wm->ac97->bus->ops->write(wm->ac97, reg, val); in wm97xx_reg_write()
124 int wm97xx_read_aux_adc(struct wm97xx *wm, u16 adcsel) in wm97xx_read_aux_adc() argument
132 mutex_lock(&wm->codec_mutex); in wm97xx_read_aux_adc()
137 if (wm->id == WM9713_ID2 && in wm97xx_read_aux_adc()
138 (power = wm97xx_reg_read(wm, AC97_EXTENDED_MID)) & 0x8000) { in wm97xx_read_aux_adc()
140 wm97xx_reg_write(wm, AC97_EXTENDED_MID, power & 0x7fff); in wm97xx_read_aux_adc()
144 wm->codec->aux_prepare(wm); in wm97xx_read_aux_adc()
147 wm->pen_probably_down = 1; in wm97xx_read_aux_adc()
150 rc = wm->codec->poll_sample(wm, adcsel, &auxval); in wm97xx_read_aux_adc()
153 wm97xx_reg_write(wm, AC97_EXTENDED_MID, power | 0x8000); in wm97xx_read_aux_adc()
155 wm->codec->dig_restore(wm); in wm97xx_read_aux_adc()
157 wm->pen_probably_down = 0; in wm97xx_read_aux_adc()
160 dev_err(wm->dev, in wm97xx_read_aux_adc()
163 wm->codec->dig_enable(wm, false); in wm97xx_read_aux_adc()
166 mutex_unlock(&wm->codec_mutex); in wm97xx_read_aux_adc()
179 enum wm97xx_gpio_status wm97xx_get_gpio(struct wm97xx *wm, u32 gpio) in wm97xx_get_gpio() argument
184 mutex_lock(&wm->codec_mutex); in wm97xx_get_gpio()
185 status = wm97xx_reg_read(wm, AC97_GPIO_STATUS); in wm97xx_get_gpio()
192 mutex_unlock(&wm->codec_mutex); in wm97xx_get_gpio()
206 void wm97xx_set_gpio(struct wm97xx *wm, u32 gpio, in wm97xx_set_gpio() argument
211 mutex_lock(&wm->codec_mutex); in wm97xx_set_gpio()
212 reg = wm97xx_reg_read(wm, AC97_GPIO_STATUS); in wm97xx_set_gpio()
219 if (wm->id == WM9712_ID2 && wm->variant != WM97xx_WM1613) in wm97xx_set_gpio()
220 wm97xx_reg_write(wm, AC97_GPIO_STATUS, reg << 1); in wm97xx_set_gpio()
222 wm97xx_reg_write(wm, AC97_GPIO_STATUS, reg); in wm97xx_set_gpio()
223 mutex_unlock(&wm->codec_mutex); in wm97xx_set_gpio()
231 void wm97xx_config_gpio(struct wm97xx *wm, u32 gpio, enum wm97xx_gpio_dir dir, in wm97xx_config_gpio() argument
237 mutex_lock(&wm->codec_mutex); in wm97xx_config_gpio()
238 reg = wm97xx_reg_read(wm, AC97_GPIO_POLARITY); in wm97xx_config_gpio()
245 wm97xx_reg_write(wm, AC97_GPIO_POLARITY, reg); in wm97xx_config_gpio()
246 reg = wm97xx_reg_read(wm, AC97_GPIO_STICKY); in wm97xx_config_gpio()
253 wm97xx_reg_write(wm, AC97_GPIO_STICKY, reg); in wm97xx_config_gpio()
254 reg = wm97xx_reg_read(wm, AC97_GPIO_WAKEUP); in wm97xx_config_gpio()
261 wm97xx_reg_write(wm, AC97_GPIO_WAKEUP, reg); in wm97xx_config_gpio()
262 reg = wm97xx_reg_read(wm, AC97_GPIO_CFG); in wm97xx_config_gpio()
269 wm97xx_reg_write(wm, AC97_GPIO_CFG, reg); in wm97xx_config_gpio()
270 mutex_unlock(&wm->codec_mutex); in wm97xx_config_gpio()
284 void wm97xx_set_suspend_mode(struct wm97xx *wm, u16 mode) in wm97xx_set_suspend_mode() argument
286 wm->suspend_mode = mode; in wm97xx_set_suspend_mode()
287 device_init_wakeup(&wm->input_dev->dev, mode != 0); in wm97xx_set_suspend_mode()
296 struct wm97xx *wm = container_of(work, struct wm97xx, pen_event_work); in wm97xx_pen_irq_worker() local
297 int pen_was_down = wm->pen_is_down; in wm97xx_pen_irq_worker()
300 if (wm->id == WM9705_ID2) { in wm97xx_pen_irq_worker()
301 if (wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD) & in wm97xx_pen_irq_worker()
303 wm->pen_is_down = 1; in wm97xx_pen_irq_worker()
305 wm->pen_is_down = 0; in wm97xx_pen_irq_worker()
308 mutex_lock(&wm->codec_mutex); in wm97xx_pen_irq_worker()
309 status = wm97xx_reg_read(wm, AC97_GPIO_STATUS); in wm97xx_pen_irq_worker()
310 pol = wm97xx_reg_read(wm, AC97_GPIO_POLARITY); in wm97xx_pen_irq_worker()
313 wm->pen_is_down = 1; in wm97xx_pen_irq_worker()
314 wm97xx_reg_write(wm, AC97_GPIO_POLARITY, pol & in wm97xx_pen_irq_worker()
317 wm->pen_is_down = 0; in wm97xx_pen_irq_worker()
318 wm97xx_reg_write(wm, AC97_GPIO_POLARITY, pol | in wm97xx_pen_irq_worker()
322 if (wm->id == WM9712_ID2 && wm->variant != WM97xx_WM1613) in wm97xx_pen_irq_worker()
323 wm97xx_reg_write(wm, AC97_GPIO_STATUS, (status & in wm97xx_pen_irq_worker()
326 wm97xx_reg_write(wm, AC97_GPIO_STATUS, status & in wm97xx_pen_irq_worker()
328 mutex_unlock(&wm->codec_mutex); in wm97xx_pen_irq_worker()
336 if (!wm->mach_ops->acc_enabled || wm->mach_ops->acc_pen_down) { in wm97xx_pen_irq_worker()
337 if (wm->pen_is_down && !pen_was_down) { in wm97xx_pen_irq_worker()
339 queue_delayed_work(wm->ts_workq, &wm->ts_reader, 1); in wm97xx_pen_irq_worker()
343 if (!wm->pen_is_down && pen_was_down) in wm97xx_pen_irq_worker()
344 wm->pen_is_down = 1; in wm97xx_pen_irq_worker()
347 if (!wm->pen_is_down && wm->mach_ops->acc_enabled) in wm97xx_pen_irq_worker()
348 wm->mach_ops->acc_pen_up(wm); in wm97xx_pen_irq_worker()
350 wm->mach_ops->irq_enable(wm, 1); in wm97xx_pen_irq_worker()
364 struct wm97xx *wm = dev_id; in wm97xx_pen_interrupt() local
366 if (!work_pending(&wm->pen_event_work)) { in wm97xx_pen_interrupt()
367 wm->mach_ops->irq_enable(wm, 0); in wm97xx_pen_interrupt()
368 queue_work(wm->ts_workq, &wm->pen_event_work); in wm97xx_pen_interrupt()
377 static int wm97xx_init_pen_irq(struct wm97xx *wm) in wm97xx_init_pen_irq() argument
383 BUG_ON(!wm->mach_ops->irq_enable); in wm97xx_init_pen_irq()
385 if (request_irq(wm->pen_irq, wm97xx_pen_interrupt, IRQF_SHARED, in wm97xx_init_pen_irq()
386 "wm97xx-pen", wm)) { in wm97xx_init_pen_irq()
387 dev_err(wm->dev, in wm97xx_init_pen_irq()
389 wm->pen_irq = 0; in wm97xx_init_pen_irq()
394 if (wm->id != WM9705_ID2) { in wm97xx_init_pen_irq()
395 BUG_ON(!wm->mach_ops->irq_gpio); in wm97xx_init_pen_irq()
396 reg = wm97xx_reg_read(wm, AC97_MISC_AFE); in wm97xx_init_pen_irq()
397 wm97xx_reg_write(wm, AC97_MISC_AFE, in wm97xx_init_pen_irq()
398 reg & ~(wm->mach_ops->irq_gpio)); in wm97xx_init_pen_irq()
399 reg = wm97xx_reg_read(wm, 0x5a); in wm97xx_init_pen_irq()
400 wm97xx_reg_write(wm, 0x5a, reg & ~0x0001); in wm97xx_init_pen_irq()
406 static int wm97xx_read_samples(struct wm97xx *wm) in wm97xx_read_samples() argument
411 mutex_lock(&wm->codec_mutex); in wm97xx_read_samples()
413 if (wm->mach_ops && wm->mach_ops->acc_enabled) in wm97xx_read_samples()
414 rc = wm->mach_ops->acc_pen_down(wm); in wm97xx_read_samples()
416 rc = wm->codec->poll_touch(wm, &data); in wm97xx_read_samples()
419 if (wm->pen_is_down) { in wm97xx_read_samples()
420 wm->pen_is_down = 0; in wm97xx_read_samples()
421 dev_dbg(wm->dev, "pen up\n"); in wm97xx_read_samples()
422 input_report_abs(wm->input_dev, ABS_PRESSURE, 0); in wm97xx_read_samples()
423 input_report_key(wm->input_dev, BTN_TOUCH, 0); in wm97xx_read_samples()
424 input_sync(wm->input_dev); in wm97xx_read_samples()
436 if (wm->ts_reader_interval < HZ / 10) in wm97xx_read_samples()
437 wm->ts_reader_interval++; in wm97xx_read_samples()
441 dev_dbg(wm->dev, in wm97xx_read_samples()
450 dev_dbg(wm->dev, "Measurement out of range, dropping it\n"); in wm97xx_read_samples()
455 input_report_abs(wm->input_dev, ABS_X, data.x & 0xfff); in wm97xx_read_samples()
456 input_report_abs(wm->input_dev, ABS_Y, data.y & 0xfff); in wm97xx_read_samples()
457 input_report_abs(wm->input_dev, ABS_PRESSURE, data.p & 0xfff); in wm97xx_read_samples()
458 input_report_key(wm->input_dev, BTN_TOUCH, 1); in wm97xx_read_samples()
459 input_sync(wm->input_dev); in wm97xx_read_samples()
460 wm->pen_is_down = 1; in wm97xx_read_samples()
461 wm->ts_reader_interval = wm->ts_reader_min_interval; in wm97xx_read_samples()
463 dev_dbg(wm->dev, "pen down\n"); in wm97xx_read_samples()
464 wm->pen_is_down = 1; in wm97xx_read_samples()
465 wm->ts_reader_interval = wm->ts_reader_min_interval; in wm97xx_read_samples()
469 mutex_unlock(&wm->codec_mutex); in wm97xx_read_samples()
479 struct wm97xx *wm = container_of(work, struct wm97xx, ts_reader.work); in wm97xx_ts_reader() local
481 BUG_ON(!wm->codec); in wm97xx_ts_reader()
484 rc = wm97xx_read_samples(wm); in wm97xx_ts_reader()
487 if (wm->pen_is_down || !wm->pen_irq) in wm97xx_ts_reader()
488 queue_delayed_work(wm->ts_workq, &wm->ts_reader, in wm97xx_ts_reader()
489 wm->ts_reader_interval); in wm97xx_ts_reader()
501 struct wm97xx *wm = input_get_drvdata(idev); in wm97xx_ts_input_open() local
503 wm->ts_workq = create_singlethread_workqueue("kwm97xx"); in wm97xx_ts_input_open()
504 if (wm->ts_workq == NULL) { in wm97xx_ts_input_open()
505 dev_err(wm->dev, in wm97xx_ts_input_open()
511 if (wm->mach_ops && wm->mach_ops->acc_enabled) in wm97xx_ts_input_open()
512 wm->codec->acc_enable(wm, 1); in wm97xx_ts_input_open()
513 wm->codec->dig_enable(wm, 1); in wm97xx_ts_input_open()
515 INIT_DELAYED_WORK(&wm->ts_reader, wm97xx_ts_reader); in wm97xx_ts_input_open()
516 INIT_WORK(&wm->pen_event_work, wm97xx_pen_irq_worker); in wm97xx_ts_input_open()
518 wm->ts_reader_min_interval = HZ >= 100 ? HZ / 100 : 1; in wm97xx_ts_input_open()
519 if (wm->ts_reader_min_interval < 1) in wm97xx_ts_input_open()
520 wm->ts_reader_min_interval = 1; in wm97xx_ts_input_open()
521 wm->ts_reader_interval = wm->ts_reader_min_interval; in wm97xx_ts_input_open()
523 wm->pen_is_down = 0; in wm97xx_ts_input_open()
524 if (wm->pen_irq) in wm97xx_ts_input_open()
525 wm97xx_init_pen_irq(wm); in wm97xx_ts_input_open()
527 dev_err(wm->dev, "No IRQ specified\n"); in wm97xx_ts_input_open()
532 if (wm->pen_irq == 0) in wm97xx_ts_input_open()
533 queue_delayed_work(wm->ts_workq, &wm->ts_reader, in wm97xx_ts_input_open()
534 wm->ts_reader_interval); in wm97xx_ts_input_open()
550 struct wm97xx *wm = input_get_drvdata(idev); in wm97xx_ts_input_close() local
553 if (wm->pen_irq) { in wm97xx_ts_input_close()
555 if (wm->id != WM9705_ID2) { in wm97xx_ts_input_close()
556 BUG_ON(!wm->mach_ops->irq_gpio); in wm97xx_ts_input_close()
557 reg = wm97xx_reg_read(wm, AC97_MISC_AFE); in wm97xx_ts_input_close()
558 wm97xx_reg_write(wm, AC97_MISC_AFE, in wm97xx_ts_input_close()
559 reg | wm->mach_ops->irq_gpio); in wm97xx_ts_input_close()
562 free_irq(wm->pen_irq, wm); in wm97xx_ts_input_close()
565 wm->pen_is_down = 0; in wm97xx_ts_input_close()
568 if (cancel_work_sync(&wm->pen_event_work)) in wm97xx_ts_input_close()
569 wm->mach_ops->irq_enable(wm, 1); in wm97xx_ts_input_close()
574 cancel_delayed_work_sync(&wm->ts_reader); in wm97xx_ts_input_close()
576 destroy_workqueue(wm->ts_workq); in wm97xx_ts_input_close()
579 wm->codec->dig_enable(wm, 0); in wm97xx_ts_input_close()
580 if (wm->mach_ops && wm->mach_ops->acc_enabled) in wm97xx_ts_input_close()
581 wm->codec->acc_enable(wm, 0); in wm97xx_ts_input_close()
586 struct wm97xx *wm; in wm97xx_probe() local
590 wm = kzalloc(sizeof(struct wm97xx), GFP_KERNEL); in wm97xx_probe()
591 if (!wm) in wm97xx_probe()
593 mutex_init(&wm->codec_mutex); in wm97xx_probe()
595 wm->dev = dev; in wm97xx_probe()
596 dev_set_drvdata(dev, wm); in wm97xx_probe()
597 wm->ac97 = to_ac97_t(dev); in wm97xx_probe()
600 id = wm97xx_reg_read(wm, AC97_VENDOR_ID1); in wm97xx_probe()
607 wm->id = wm97xx_reg_read(wm, AC97_VENDOR_ID2); in wm97xx_probe()
609 wm->variant = WM97xx_GENERIC; in wm97xx_probe()
611 dev_info(wm->dev, "detected a wm97%02x codec\n", wm->id & 0xff); in wm97xx_probe()
613 switch (wm->id & 0xff) { in wm97xx_probe()
616 wm->codec = &wm9705_codec; in wm97xx_probe()
621 wm->codec = &wm9712_codec; in wm97xx_probe()
626 wm->codec = &wm9713_codec; in wm97xx_probe()
630 dev_err(wm->dev, "Support for wm97%02x not compiled in.\n", in wm97xx_probe()
631 wm->id & 0xff); in wm97xx_probe()
637 wm->codec->phy_init(wm); in wm97xx_probe()
640 wm->gpio[0] = wm97xx_reg_read(wm, AC97_GPIO_CFG); in wm97xx_probe()
641 wm->gpio[1] = wm97xx_reg_read(wm, AC97_GPIO_POLARITY); in wm97xx_probe()
642 wm->gpio[2] = wm97xx_reg_read(wm, AC97_GPIO_STICKY); in wm97xx_probe()
643 wm->gpio[3] = wm97xx_reg_read(wm, AC97_GPIO_WAKEUP); in wm97xx_probe()
644 wm->gpio[4] = wm97xx_reg_read(wm, AC97_GPIO_STATUS); in wm97xx_probe()
645 wm->gpio[5] = wm97xx_reg_read(wm, AC97_MISC_AFE); in wm97xx_probe()
647 wm->input_dev = input_allocate_device(); in wm97xx_probe()
648 if (wm->input_dev == NULL) { in wm97xx_probe()
654 wm->input_dev->name = "wm97xx touchscreen"; in wm97xx_probe()
655 wm->input_dev->phys = "wm97xx"; in wm97xx_probe()
656 wm->input_dev->open = wm97xx_ts_input_open; in wm97xx_probe()
657 wm->input_dev->close = wm97xx_ts_input_close; in wm97xx_probe()
659 __set_bit(EV_ABS, wm->input_dev->evbit); in wm97xx_probe()
660 __set_bit(EV_KEY, wm->input_dev->evbit); in wm97xx_probe()
661 __set_bit(BTN_TOUCH, wm->input_dev->keybit); in wm97xx_probe()
663 input_set_abs_params(wm->input_dev, ABS_X, abs_x[0], abs_x[1], in wm97xx_probe()
665 input_set_abs_params(wm->input_dev, ABS_Y, abs_y[0], abs_y[1], in wm97xx_probe()
667 input_set_abs_params(wm->input_dev, ABS_PRESSURE, abs_p[0], abs_p[1], in wm97xx_probe()
670 input_set_drvdata(wm->input_dev, wm); in wm97xx_probe()
671 wm->input_dev->dev.parent = dev; in wm97xx_probe()
673 ret = input_register_device(wm->input_dev); in wm97xx_probe()
678 wm->battery_dev = platform_device_alloc("wm97xx-battery", -1); in wm97xx_probe()
679 if (!wm->battery_dev) { in wm97xx_probe()
683 platform_set_drvdata(wm->battery_dev, wm); in wm97xx_probe()
684 wm->battery_dev->dev.parent = dev; in wm97xx_probe()
685 wm->battery_dev->dev.platform_data = pdata; in wm97xx_probe()
686 ret = platform_device_add(wm->battery_dev); in wm97xx_probe()
692 wm->touch_dev = platform_device_alloc("wm97xx-touch", -1); in wm97xx_probe()
693 if (!wm->touch_dev) { in wm97xx_probe()
697 platform_set_drvdata(wm->touch_dev, wm); in wm97xx_probe()
698 wm->touch_dev->dev.parent = dev; in wm97xx_probe()
699 wm->touch_dev->dev.platform_data = pdata; in wm97xx_probe()
700 ret = platform_device_add(wm->touch_dev); in wm97xx_probe()
707 platform_device_put(wm->touch_dev); in wm97xx_probe()
709 platform_device_del(wm->battery_dev); in wm97xx_probe()
711 platform_device_put(wm->battery_dev); in wm97xx_probe()
713 input_unregister_device(wm->input_dev); in wm97xx_probe()
714 wm->input_dev = NULL; in wm97xx_probe()
716 input_free_device(wm->input_dev); in wm97xx_probe()
718 kfree(wm); in wm97xx_probe()
725 struct wm97xx *wm = dev_get_drvdata(dev); in wm97xx_remove() local
727 platform_device_unregister(wm->battery_dev); in wm97xx_remove()
728 platform_device_unregister(wm->touch_dev); in wm97xx_remove()
729 input_unregister_device(wm->input_dev); in wm97xx_remove()
730 kfree(wm); in wm97xx_remove()
737 struct wm97xx *wm = dev_get_drvdata(dev); in wm97xx_suspend() local
741 if (device_may_wakeup(&wm->input_dev->dev)) in wm97xx_suspend()
742 suspend_mode = wm->suspend_mode; in wm97xx_suspend()
746 if (wm->input_dev->users) in wm97xx_suspend()
747 cancel_delayed_work_sync(&wm->ts_reader); in wm97xx_suspend()
750 reg = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER2); in wm97xx_suspend()
752 if (wm->input_dev->users) in wm97xx_suspend()
754 wm->ac97->bus->ops->write(wm->ac97, AC97_WM97XX_DIGITISER2, reg); in wm97xx_suspend()
758 if (wm->id == WM9713_ID2 && in wm97xx_suspend()
759 (!wm->input_dev->users || !suspend_mode)) { in wm97xx_suspend()
760 reg = wm97xx_reg_read(wm, AC97_EXTENDED_MID) | 0x8000; in wm97xx_suspend()
761 wm97xx_reg_write(wm, AC97_EXTENDED_MID, reg); in wm97xx_suspend()
769 struct wm97xx *wm = dev_get_drvdata(dev); in wm97xx_resume() local
772 if (wm->id == WM9713_ID2) { in wm97xx_resume()
773 wm97xx_reg_write(wm, AC97_WM9713_DIG1, wm->dig[0]); in wm97xx_resume()
774 wm97xx_reg_write(wm, 0x5a, wm->misc); in wm97xx_resume()
775 if (wm->input_dev->users) { in wm97xx_resume()
777 reg = wm97xx_reg_read(wm, AC97_EXTENDED_MID) & 0x7fff; in wm97xx_resume()
778 wm97xx_reg_write(wm, AC97_EXTENDED_MID, reg); in wm97xx_resume()
782 wm97xx_reg_write(wm, AC97_WM9713_DIG2, wm->dig[1]); in wm97xx_resume()
783 wm97xx_reg_write(wm, AC97_WM9713_DIG3, wm->dig[2]); in wm97xx_resume()
785 wm97xx_reg_write(wm, AC97_GPIO_CFG, wm->gpio[0]); in wm97xx_resume()
786 wm97xx_reg_write(wm, AC97_GPIO_POLARITY, wm->gpio[1]); in wm97xx_resume()
787 wm97xx_reg_write(wm, AC97_GPIO_STICKY, wm->gpio[2]); in wm97xx_resume()
788 wm97xx_reg_write(wm, AC97_GPIO_WAKEUP, wm->gpio[3]); in wm97xx_resume()
789 wm97xx_reg_write(wm, AC97_GPIO_STATUS, wm->gpio[4]); in wm97xx_resume()
790 wm97xx_reg_write(wm, AC97_MISC_AFE, wm->gpio[5]); in wm97xx_resume()
792 if (wm->input_dev->users && !wm->pen_irq) { in wm97xx_resume()
793 wm->ts_reader_interval = wm->ts_reader_min_interval; in wm97xx_resume()
794 queue_delayed_work(wm->ts_workq, &wm->ts_reader, in wm97xx_resume()
795 wm->ts_reader_interval); in wm97xx_resume()
806 int wm97xx_register_mach_ops(struct wm97xx *wm, in wm97xx_register_mach_ops() argument
809 mutex_lock(&wm->codec_mutex); in wm97xx_register_mach_ops()
810 if (wm->mach_ops) { in wm97xx_register_mach_ops()
811 mutex_unlock(&wm->codec_mutex); in wm97xx_register_mach_ops()
814 wm->mach_ops = mach_ops; in wm97xx_register_mach_ops()
815 mutex_unlock(&wm->codec_mutex); in wm97xx_register_mach_ops()
821 void wm97xx_unregister_mach_ops(struct wm97xx *wm) in wm97xx_unregister_mach_ops() argument
823 mutex_lock(&wm->codec_mutex); in wm97xx_unregister_mach_ops()
824 wm->mach_ops = NULL; in wm97xx_unregister_mach_ops()
825 mutex_unlock(&wm->codec_mutex); in wm97xx_unregister_mach_ops()