Merge tag 'v4.4-rc1'
[firefly-linux-kernel-4.4.55.git] / drivers / usb / serial / usiserial.c
1 /*
2  * USI WCDMA Modem driver
3  *
4  * Copyright (C) 2011 John Tseng
5  *
6  *  This program is free software; you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License version 2 as
8  *  published by the Free Software Foundation.
9  *
10  */
11
12 #include <linux/kernel.h>
13 #include <linux/init.h>
14 #include <linux/tty.h>
15 #include <linux/module.h>
16 #include <linux/usb.h>
17 #include <linux/usb/serial.h>
18
19 static int usi_probe(struct usb_interface *interface,
20                          const struct usb_device_id *id);
21
22 static struct usb_device_id id_table [] = {
23         { USB_DEVICE(0x0e8d, 0x00a1) }, /* USI WCDMA modem 3COM */
24         { USB_DEVICE(0x0e8d, 0x00a2) }, /* USI WCDMA modem 2COM */
25         { },
26 };
27 MODULE_DEVICE_TABLE(usb, id_table);
28
29 static struct usb_driver usi_driver = {
30         .name =         "usi-modem",
31         .probe =        usi_probe,
32         .disconnect =   usb_serial_disconnect,
33         .id_table =     id_table,
34         .suspend =      usb_serial_suspend,
35         .resume =       usb_serial_resume,
36         .no_dynamic_id =        1,
37 };
38
39 static struct usb_serial_driver usi_device = {
40         .driver = {
41                 .owner =        THIS_MODULE,
42                 .name =         "usi-modem",
43         },
44         .usb_driver =           &usi_driver,
45         .id_table =             id_table,
46         .num_ports =            1,
47 };
48
49 static int usi_probe(struct usb_interface *interface,
50                                const struct usb_device_id *id)
51 {
52         int if_num;
53
54         if_num = interface->altsetting->desc.bInterfaceNumber;
55
56         if (if_num == 2)
57                 return usb_serial_probe(interface, id);
58
59         return -ENODEV;
60 }
61
62 static int __init usi_init(void)
63 {
64         int retval;
65
66         retval = usb_serial_register(&usi_device);
67         if (retval)
68                 return retval;
69         retval = usb_register(&usi_driver);
70         if (retval)
71                 usb_serial_deregister(&usi_device);
72         return retval;
73 }
74
75 static void __exit usi_exit(void)
76 {
77         usb_deregister(&usi_driver);
78         usb_serial_deregister(&usi_device);
79 }
80
81 module_init(usi_init);
82 module_exit(usi_exit);
83 MODULE_LICENSE("GPL");