[CIFS] Fix setattr of mode only (e.g. in some chmod cases) to Windows
[sfrench/cifs-2.6.git] / drivers / usb / serial / nokia_dku2.c
1 /*
2  *  Nokia DKU2 USB driver
3  *
4  *  Copyright (C) 2004
5  *  Author: C Kemp
6  *
7  *  This program is largely derived from work by the linux-usb group
8  *  and associated source files.  Please see the usb/serial files for
9  *  individual credits and copyrights.
10  *
11  *  This program is free software; you can redistribute it and/or modify
12  *  it under the terms of the GNU General Public License as published by
13  *  the Free Software Foundation; either version 2 of the License, or
14  *  (at your option) any later version.
15  *
16  *  20.09.2005 - Matthias Blaesing <matthias.blaesing@rwth-aachen.de>
17  *  Added short name to device structure to make driver load into kernel 2.6.13
18  *
19  *  20.09.2005 - Matthias Blaesing <matthias.blaesing@rwth-aachen.de>
20  *  Added usb_deregister to exit code - to allow remove and reinsert of module
21  */
22
23
24 #include <linux/config.h>
25 #include <linux/kernel.h>
26 #include <linux/errno.h>
27 #include <linux/init.h>
28 #include <linux/slab.h>
29 #include <linux/tty.h>
30 #include <linux/tty_driver.h>
31 #include <linux/tty_flip.h>
32 #include <linux/module.h>
33 #include <linux/usb.h>
34 #include "usb-serial.h"
35
36
37 #define NOKIA_VENDOR_ID         0x0421
38 #define NOKIA7600_PRODUCT_ID    0x0400
39 #define NOKIA6230_PRODUCT_ID    0x040f
40 #define NOKIA6170_PRODUCT_ID    0x0416
41 #define NOKIA6670_PRODUCT_ID    0x041d
42 #define NOKIA6680_PRODUCT_ID    0x041e
43 #define NOKIA6230i_PRODUCT_ID   0x0428
44
45 #define NOKIA_AT_PORT   0x82
46 #define NOKIA_FBUS_PORT 0x86
47
48 /*
49  * Version Information
50  */
51 #define DRIVER_VERSION  "v0.2"
52 #define DRIVER_AUTHOR   "C Kemp"
53 #define DRIVER_DESC     "Nokia DKU2 Driver"
54
55 static struct usb_device_id id_table [] = {
56         { USB_DEVICE(NOKIA_VENDOR_ID, NOKIA7600_PRODUCT_ID) },
57         { USB_DEVICE(NOKIA_VENDOR_ID, NOKIA6230_PRODUCT_ID) },
58         { USB_DEVICE(NOKIA_VENDOR_ID, NOKIA6170_PRODUCT_ID) },
59         { USB_DEVICE(NOKIA_VENDOR_ID, NOKIA6670_PRODUCT_ID) },
60         { USB_DEVICE(NOKIA_VENDOR_ID, NOKIA6680_PRODUCT_ID) },
61         { USB_DEVICE(NOKIA_VENDOR_ID, NOKIA6230i_PRODUCT_ID) },
62         { }                     /* Terminating entry */
63 };
64 MODULE_DEVICE_TABLE(usb, id_table);
65
66 /* The only thing which makes this device different from a generic
67  * device is that we have to set an alternative configuration to make
68  * the relevant endpoints available. In 2.6 this is really easy... */
69 static int nokia_probe(struct usb_serial *serial,
70                        const struct usb_device_id *id)
71 {
72         int retval = -ENODEV;
73
74         if (serial->interface->altsetting[0].endpoint[0].desc.bEndpointAddress == NOKIA_AT_PORT) {
75                 /* the AT port */
76                 dev_info(&serial->dev->dev, "Nokia AT Port:\n");
77                 retval = 0;
78         } else if (serial->interface->num_altsetting == 2 &&
79                    serial->interface->altsetting[1].endpoint[0].desc.bEndpointAddress == NOKIA_FBUS_PORT) {
80                 /* the FBUS port */
81                 dev_info(&serial->dev->dev, "Nokia FBUS Port:\n");
82                 usb_set_interface(serial->dev, 10, 1);
83                 retval = 0;
84         }
85
86         return retval;
87 }
88
89 static struct usb_driver nokia_driver = {
90         .owner =        THIS_MODULE,
91         .name =         "nokia_dku2",
92         .probe =        usb_serial_probe,
93         .disconnect =   usb_serial_disconnect,
94         .id_table =     id_table,
95 };
96
97 static struct usb_serial_driver nokia_serial_driver = {
98         .driver = {
99                 .owner =        THIS_MODULE,
100                 .name =         "nokia_dku2",
101         },
102         .description =          "Nokia 7600/6230(i)/6170/66x0 DKU2 driver",
103         .id_table =             id_table,
104         .num_interrupt_in =     1,
105         .num_bulk_in =          1,
106         .num_bulk_out =         1,
107         .num_ports =            1,
108         .probe =                nokia_probe,
109 };
110
111 static int __init nokia_init(void)
112 {
113         int retval;
114
115         retval = usb_serial_register(&nokia_serial_driver);
116         if (retval)
117                 return retval;
118
119         retval = usb_register(&nokia_driver);
120         if (retval) {
121                 usb_serial_deregister(&nokia_serial_driver);
122                 return retval;
123         }
124
125         info(DRIVER_VERSION " " DRIVER_AUTHOR);
126         info(DRIVER_DESC);
127
128         return retval;
129 }
130
131 static void __exit nokia_exit(void)
132 {
133         usb_deregister(&nokia_driver);
134         usb_serial_deregister(&nokia_serial_driver);
135 }
136
137 module_init(nokia_init);
138 module_exit(nokia_exit);
139
140 MODULE_AUTHOR(DRIVER_AUTHOR);
141 MODULE_DESCRIPTION(DRIVER_DESC);
142 MODULE_LICENSE("GPL");