Lines Matching refs:dev
297 static void report_key(struct cm109_dev *dev, int key) in report_key() argument
299 struct input_dev *idev = dev->idev; in report_key()
301 if (dev->key_code >= 0) { in report_key()
303 input_report_key(idev, dev->key_code, 0); in report_key()
306 dev->key_code = key; in report_key()
319 static void cm109_submit_buzz_toggle(struct cm109_dev *dev) in cm109_submit_buzz_toggle() argument
323 if (dev->buzzer_state) in cm109_submit_buzz_toggle()
324 dev->ctl_data->byte[HID_OR0] |= BUZZER_ON; in cm109_submit_buzz_toggle()
326 dev->ctl_data->byte[HID_OR0] &= ~BUZZER_ON; in cm109_submit_buzz_toggle()
328 error = usb_submit_urb(dev->urb_ctl, GFP_ATOMIC); in cm109_submit_buzz_toggle()
330 dev_err(&dev->intf->dev, in cm109_submit_buzz_toggle()
340 struct cm109_dev *dev = urb->context; in cm109_urb_irq_callback() local
344 dev_dbg(&dev->intf->dev, "### URB IRQ: [0x%02x 0x%02x 0x%02x 0x%02x] keybit=0x%02x\n", in cm109_urb_irq_callback()
345 dev->irq_data->byte[0], in cm109_urb_irq_callback()
346 dev->irq_data->byte[1], in cm109_urb_irq_callback()
347 dev->irq_data->byte[2], in cm109_urb_irq_callback()
348 dev->irq_data->byte[3], in cm109_urb_irq_callback()
349 dev->keybit); in cm109_urb_irq_callback()
354 dev_err_ratelimited(&dev->intf->dev, "%s: urb status %d\n", in cm109_urb_irq_callback()
360 if (dev->irq_data->byte[HID_IR0] & 0x0f) { in cm109_urb_irq_callback()
361 const int code = (dev->irq_data->byte[HID_IR0] & 0x0f); in cm109_urb_irq_callback()
362 report_key(dev, dev->keymap[0xff + code]); in cm109_urb_irq_callback()
366 if (dev->keybit == 0xf) { in cm109_urb_irq_callback()
369 if ((dev->gpi & 0xf0) == (dev->irq_data->byte[HID_IR1] & 0xf0)) in cm109_urb_irq_callback()
372 dev->gpi = dev->irq_data->byte[HID_IR1] & 0xf0; in cm109_urb_irq_callback()
373 dev->keybit = 0x1; in cm109_urb_irq_callback()
375 report_key(dev, dev->keymap[dev->irq_data->byte[HID_IR1]]); in cm109_urb_irq_callback()
377 dev->keybit <<= 1; in cm109_urb_irq_callback()
378 if (dev->keybit > 0x8) in cm109_urb_irq_callback()
379 dev->keybit = 0xf; in cm109_urb_irq_callback()
384 spin_lock(&dev->ctl_submit_lock); in cm109_urb_irq_callback()
386 dev->irq_urb_pending = 0; in cm109_urb_irq_callback()
388 if (likely(!dev->shutdown)) { in cm109_urb_irq_callback()
390 if (dev->buzzer_state) in cm109_urb_irq_callback()
391 dev->ctl_data->byte[HID_OR0] |= BUZZER_ON; in cm109_urb_irq_callback()
393 dev->ctl_data->byte[HID_OR0] &= ~BUZZER_ON; in cm109_urb_irq_callback()
395 dev->ctl_data->byte[HID_OR1] = dev->keybit; in cm109_urb_irq_callback()
396 dev->ctl_data->byte[HID_OR2] = dev->keybit; in cm109_urb_irq_callback()
398 dev->buzzer_pending = 0; in cm109_urb_irq_callback()
399 dev->ctl_urb_pending = 1; in cm109_urb_irq_callback()
401 error = usb_submit_urb(dev->urb_ctl, GFP_ATOMIC); in cm109_urb_irq_callback()
403 dev_err(&dev->intf->dev, in cm109_urb_irq_callback()
408 spin_unlock(&dev->ctl_submit_lock); in cm109_urb_irq_callback()
413 struct cm109_dev *dev = urb->context; in cm109_urb_ctl_callback() local
417 dev_dbg(&dev->intf->dev, "### URB CTL: [0x%02x 0x%02x 0x%02x 0x%02x]\n", in cm109_urb_ctl_callback()
418 dev->ctl_data->byte[0], in cm109_urb_ctl_callback()
419 dev->ctl_data->byte[1], in cm109_urb_ctl_callback()
420 dev->ctl_data->byte[2], in cm109_urb_ctl_callback()
421 dev->ctl_data->byte[3]); in cm109_urb_ctl_callback()
426 dev_err_ratelimited(&dev->intf->dev, "%s: urb status %d\n", in cm109_urb_ctl_callback()
430 spin_lock(&dev->ctl_submit_lock); in cm109_urb_ctl_callback()
432 dev->ctl_urb_pending = 0; in cm109_urb_ctl_callback()
434 if (likely(!dev->shutdown)) { in cm109_urb_ctl_callback()
436 if (dev->buzzer_pending || status) { in cm109_urb_ctl_callback()
437 dev->buzzer_pending = 0; in cm109_urb_ctl_callback()
438 dev->ctl_urb_pending = 1; in cm109_urb_ctl_callback()
439 cm109_submit_buzz_toggle(dev); in cm109_urb_ctl_callback()
440 } else if (likely(!dev->irq_urb_pending)) { in cm109_urb_ctl_callback()
442 dev->irq_urb_pending = 1; in cm109_urb_ctl_callback()
443 error = usb_submit_urb(dev->urb_irq, GFP_ATOMIC); in cm109_urb_ctl_callback()
445 dev_err(&dev->intf->dev, in cm109_urb_ctl_callback()
451 spin_unlock(&dev->ctl_submit_lock); in cm109_urb_ctl_callback()
454 static void cm109_toggle_buzzer_async(struct cm109_dev *dev) in cm109_toggle_buzzer_async() argument
458 spin_lock_irqsave(&dev->ctl_submit_lock, flags); in cm109_toggle_buzzer_async()
460 if (dev->ctl_urb_pending) { in cm109_toggle_buzzer_async()
462 dev->buzzer_pending = 1; in cm109_toggle_buzzer_async()
464 dev->ctl_urb_pending = 1; in cm109_toggle_buzzer_async()
465 cm109_submit_buzz_toggle(dev); in cm109_toggle_buzzer_async()
468 spin_unlock_irqrestore(&dev->ctl_submit_lock, flags); in cm109_toggle_buzzer_async()
471 static void cm109_toggle_buzzer_sync(struct cm109_dev *dev, int on) in cm109_toggle_buzzer_sync() argument
476 dev->ctl_data->byte[HID_OR0] |= BUZZER_ON; in cm109_toggle_buzzer_sync()
478 dev->ctl_data->byte[HID_OR0] &= ~BUZZER_ON; in cm109_toggle_buzzer_sync()
480 error = usb_control_msg(dev->udev, in cm109_toggle_buzzer_sync()
481 usb_sndctrlpipe(dev->udev, 0), in cm109_toggle_buzzer_sync()
482 dev->ctl_req->bRequest, in cm109_toggle_buzzer_sync()
483 dev->ctl_req->bRequestType, in cm109_toggle_buzzer_sync()
484 le16_to_cpu(dev->ctl_req->wValue), in cm109_toggle_buzzer_sync()
485 le16_to_cpu(dev->ctl_req->wIndex), in cm109_toggle_buzzer_sync()
486 dev->ctl_data, in cm109_toggle_buzzer_sync()
489 dev_err(&dev->intf->dev, "%s: usb_control_msg() failed %d\n", in cm109_toggle_buzzer_sync()
493 static void cm109_stop_traffic(struct cm109_dev *dev) in cm109_stop_traffic() argument
495 dev->shutdown = 1; in cm109_stop_traffic()
501 usb_kill_urb(dev->urb_ctl); in cm109_stop_traffic()
502 usb_kill_urb(dev->urb_irq); in cm109_stop_traffic()
504 cm109_toggle_buzzer_sync(dev, 0); in cm109_stop_traffic()
506 dev->shutdown = 0; in cm109_stop_traffic()
510 static void cm109_restore_state(struct cm109_dev *dev) in cm109_restore_state() argument
512 if (dev->open) { in cm109_restore_state()
517 cm109_toggle_buzzer_async(dev); in cm109_restore_state()
527 struct cm109_dev *dev = input_get_drvdata(idev); in cm109_input_open() local
530 error = usb_autopm_get_interface(dev->intf); in cm109_input_open()
532 dev_err(&idev->dev, "%s - cannot autoresume, result %d\n", in cm109_input_open()
537 mutex_lock(&dev->pm_mutex); in cm109_input_open()
539 dev->buzzer_state = 0; in cm109_input_open()
540 dev->key_code = -1; /* no keys pressed */ in cm109_input_open()
541 dev->keybit = 0xf; in cm109_input_open()
544 dev->ctl_data->byte[HID_OR0] = HID_OR_GPO_BUZ_SPDIF; in cm109_input_open()
545 dev->ctl_data->byte[HID_OR1] = dev->keybit; in cm109_input_open()
546 dev->ctl_data->byte[HID_OR2] = dev->keybit; in cm109_input_open()
547 dev->ctl_data->byte[HID_OR3] = 0x00; in cm109_input_open()
549 error = usb_submit_urb(dev->urb_ctl, GFP_KERNEL); in cm109_input_open()
551 dev_err(&dev->intf->dev, "%s: usb_submit_urb (urb_ctl) failed %d\n", in cm109_input_open()
554 dev->open = 1; in cm109_input_open()
556 mutex_unlock(&dev->pm_mutex); in cm109_input_open()
559 usb_autopm_put_interface(dev->intf); in cm109_input_open()
566 struct cm109_dev *dev = input_get_drvdata(idev); in cm109_input_close() local
568 mutex_lock(&dev->pm_mutex); in cm109_input_close()
575 cm109_stop_traffic(dev); in cm109_input_close()
576 dev->open = 0; in cm109_input_close()
578 mutex_unlock(&dev->pm_mutex); in cm109_input_close()
580 usb_autopm_put_interface(dev->intf); in cm109_input_close()
586 struct cm109_dev *dev = input_get_drvdata(idev); in cm109_input_ev() local
588 dev_dbg(&dev->intf->dev, in cm109_input_ev()
597 dev->buzzer_state = !!value; in cm109_input_ev()
598 if (!dev->resetting) in cm109_input_ev()
599 cm109_toggle_buzzer_async(dev); in cm109_input_ev()
641 static void cm109_usb_cleanup(struct cm109_dev *dev) in cm109_usb_cleanup() argument
643 kfree(dev->ctl_req); in cm109_usb_cleanup()
644 if (dev->ctl_data) in cm109_usb_cleanup()
645 usb_free_coherent(dev->udev, USB_PKT_LEN, in cm109_usb_cleanup()
646 dev->ctl_data, dev->ctl_dma); in cm109_usb_cleanup()
647 if (dev->irq_data) in cm109_usb_cleanup()
648 usb_free_coherent(dev->udev, USB_PKT_LEN, in cm109_usb_cleanup()
649 dev->irq_data, dev->irq_dma); in cm109_usb_cleanup()
651 usb_free_urb(dev->urb_irq); /* parameter validation in core/urb */ in cm109_usb_cleanup()
652 usb_free_urb(dev->urb_ctl); /* parameter validation in core/urb */ in cm109_usb_cleanup()
653 kfree(dev); in cm109_usb_cleanup()
658 struct cm109_dev *dev = usb_get_intfdata(interface); in cm109_usb_disconnect() local
661 input_unregister_device(dev->idev); in cm109_usb_disconnect()
662 cm109_usb_cleanup(dev); in cm109_usb_disconnect()
672 struct cm109_dev *dev; in cm109_usb_probe() local
683 dev = kzalloc(sizeof(*dev), GFP_KERNEL); in cm109_usb_probe()
684 if (!dev) in cm109_usb_probe()
687 spin_lock_init(&dev->ctl_submit_lock); in cm109_usb_probe()
688 mutex_init(&dev->pm_mutex); in cm109_usb_probe()
690 dev->udev = udev; in cm109_usb_probe()
691 dev->intf = intf; in cm109_usb_probe()
693 dev->idev = input_dev = input_allocate_device(); in cm109_usb_probe()
698 dev->irq_data = usb_alloc_coherent(udev, USB_PKT_LEN, in cm109_usb_probe()
699 GFP_KERNEL, &dev->irq_dma); in cm109_usb_probe()
700 if (!dev->irq_data) in cm109_usb_probe()
703 dev->ctl_data = usb_alloc_coherent(udev, USB_PKT_LEN, in cm109_usb_probe()
704 GFP_KERNEL, &dev->ctl_dma); in cm109_usb_probe()
705 if (!dev->ctl_data) in cm109_usb_probe()
708 dev->ctl_req = kmalloc(sizeof(*(dev->ctl_req)), GFP_KERNEL); in cm109_usb_probe()
709 if (!dev->ctl_req) in cm109_usb_probe()
713 dev->urb_irq = usb_alloc_urb(0, GFP_KERNEL); in cm109_usb_probe()
714 if (!dev->urb_irq) in cm109_usb_probe()
717 dev->urb_ctl = usb_alloc_urb(0, GFP_KERNEL); in cm109_usb_probe()
718 if (!dev->urb_ctl) in cm109_usb_probe()
725 dev_err(&intf->dev, "invalid payload size %d, expected %d\n", in cm109_usb_probe()
729 usb_fill_int_urb(dev->urb_irq, udev, pipe, dev->irq_data, in cm109_usb_probe()
731 cm109_urb_irq_callback, dev, endpoint->bInterval); in cm109_usb_probe()
732 dev->urb_irq->transfer_dma = dev->irq_dma; in cm109_usb_probe()
733 dev->urb_irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; in cm109_usb_probe()
734 dev->urb_irq->dev = udev; in cm109_usb_probe()
737 dev->ctl_req->bRequestType = USB_TYPE_CLASS | USB_RECIP_INTERFACE | in cm109_usb_probe()
739 dev->ctl_req->bRequest = USB_REQ_SET_CONFIGURATION; in cm109_usb_probe()
740 dev->ctl_req->wValue = cpu_to_le16(0x200); in cm109_usb_probe()
741 dev->ctl_req->wIndex = cpu_to_le16(interface->desc.bInterfaceNumber); in cm109_usb_probe()
742 dev->ctl_req->wLength = cpu_to_le16(USB_PKT_LEN); in cm109_usb_probe()
744 usb_fill_control_urb(dev->urb_ctl, udev, usb_sndctrlpipe(udev, 0), in cm109_usb_probe()
745 (void *)dev->ctl_req, dev->ctl_data, USB_PKT_LEN, in cm109_usb_probe()
746 cm109_urb_ctl_callback, dev); in cm109_usb_probe()
747 dev->urb_ctl->transfer_dma = dev->ctl_dma; in cm109_usb_probe()
748 dev->urb_ctl->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; in cm109_usb_probe()
749 dev->urb_ctl->dev = udev; in cm109_usb_probe()
752 usb_make_path(udev, dev->phys, sizeof(dev->phys)); in cm109_usb_probe()
753 strlcat(dev->phys, "/input0", sizeof(dev->phys)); in cm109_usb_probe()
757 input_dev->phys = dev->phys; in cm109_usb_probe()
759 input_dev->dev.parent = &intf->dev; in cm109_usb_probe()
761 input_set_drvdata(input_dev, dev); in cm109_usb_probe()
766 input_dev->keycode = dev->keymap; in cm109_usb_probe()
768 input_dev->keycodemax = ARRAY_SIZE(dev->keymap); in cm109_usb_probe()
776 dev->keymap[i] = k; in cm109_usb_probe()
781 error = input_register_device(dev->idev); in cm109_usb_probe()
785 usb_set_intfdata(intf, dev); in cm109_usb_probe()
791 cm109_usb_cleanup(dev); in cm109_usb_probe()
797 struct cm109_dev *dev = usb_get_intfdata(intf); in cm109_usb_suspend() local
799 dev_info(&intf->dev, "cm109: usb_suspend (event=%d)\n", message.event); in cm109_usb_suspend()
801 mutex_lock(&dev->pm_mutex); in cm109_usb_suspend()
802 cm109_stop_traffic(dev); in cm109_usb_suspend()
803 mutex_unlock(&dev->pm_mutex); in cm109_usb_suspend()
810 struct cm109_dev *dev = usb_get_intfdata(intf); in cm109_usb_resume() local
812 dev_info(&intf->dev, "cm109: usb_resume\n"); in cm109_usb_resume()
814 mutex_lock(&dev->pm_mutex); in cm109_usb_resume()
815 cm109_restore_state(dev); in cm109_usb_resume()
816 mutex_unlock(&dev->pm_mutex); in cm109_usb_resume()
823 struct cm109_dev *dev = usb_get_intfdata(intf); in cm109_usb_pre_reset() local
825 mutex_lock(&dev->pm_mutex); in cm109_usb_pre_reset()
831 dev->resetting = 1; in cm109_usb_pre_reset()
834 cm109_stop_traffic(dev); in cm109_usb_pre_reset()
841 struct cm109_dev *dev = usb_get_intfdata(intf); in cm109_usb_post_reset() local
843 dev->resetting = 0; in cm109_usb_post_reset()
846 cm109_restore_state(dev); in cm109_usb_post_reset()
848 mutex_unlock(&dev->pm_mutex); in cm109_usb_post_reset()