Merge master.kernel.org:/pub/scm/linux/kernel/git/davej/x86
[linux-2.6] / drivers / usb / misc / uss720.c
1 /*****************************************************************************/
2
3 /*
4  *      uss720.c  --  USS720 USB Parport Cable.
5  *
6  *      Copyright (C) 1999, 2005
7  *          Thomas Sailer (t.sailer@alumni.ethz.ch)
8  *
9  *      This program is free software; you can redistribute it and/or modify
10  *      it under the terms of the GNU General Public License as published by
11  *      the Free Software Foundation; either version 2 of the License, or
12  *      (at your option) any later version.
13  *
14  *      This program is distributed in the hope that it will be useful,
15  *      but WITHOUT ANY WARRANTY; without even the implied warranty of
16  *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  *      GNU General Public License for more details.
18  *
19  *      You should have received a copy of the GNU General Public License
20  *      along with this program; if not, write to the Free Software
21  *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22  *
23  *  Based on parport_pc.c
24  *
25  *  History:
26  *   0.1  04.08.1999  Created
27  *   0.2  07.08.1999  Some fixes mainly suggested by Tim Waugh
28  *                    Interrupt handling currently disabled because
29  *                    usb_request_irq crashes somewhere within ohci.c
30  *                    for no apparent reason (that is for me, anyway)
31  *                    ECP currently untested
32  *   0.3  10.08.1999  fixing merge errors
33  *   0.4  13.08.1999  Added Vendor/Product ID of Brad Hard's cable
34  *   0.5  20.09.1999  usb_control_msg wrapper used
35  *        Nov01.2000  usb_device_table support by Adam J. Richter
36  *        08.04.2001  Identify version on module load.  gb
37  *   0.6  02.09.2005  Fix "scheduling in interrupt" problem by making save/restore
38  *                    context asynchronous
39  *
40  */
41
42 /*****************************************************************************/
43
44 #include <linux/module.h>
45 #include <linux/socket.h>
46 #include <linux/parport.h>
47 #include <linux/init.h>
48 #include <linux/usb.h>
49 #include <linux/delay.h>
50 #include <linux/completion.h>
51 #include <linux/kref.h>
52
53 /*
54  * Version Information
55  */
56 #define DRIVER_VERSION "v0.6"
57 #define DRIVER_AUTHOR "Thomas M. Sailer, t.sailer@alumni.ethz.ch"
58 #define DRIVER_DESC "USB Parport Cable driver for Cables using the Lucent Technologies USS720 Chip"
59
60 /* --------------------------------------------------------------------- */
61
62 struct parport_uss720_private {
63         struct usb_device *usbdev;
64         struct parport *pp;
65         struct kref ref_count;
66         __u8 reg[7];  /* USB registers */
67         struct list_head asynclist;
68         spinlock_t asynclock;
69 };
70
71 struct uss720_async_request {
72         struct parport_uss720_private *priv;
73         struct kref ref_count;
74         struct list_head asynclist;
75         struct completion compl;
76         struct urb *urb;
77         struct usb_ctrlrequest dr;
78         __u8 reg[7];
79 };
80
81 /* --------------------------------------------------------------------- */
82
83 static void destroy_priv(struct kref *kref)
84 {
85         struct parport_uss720_private *priv = container_of(kref, struct parport_uss720_private, ref_count);
86
87         usb_put_dev(priv->usbdev);
88         kfree(priv);
89         dbg("destroying priv datastructure");
90 }
91
92 static void destroy_async(struct kref *kref)
93 {
94         struct uss720_async_request *rq = container_of(kref, struct uss720_async_request, ref_count);
95         struct parport_uss720_private *priv = rq->priv;
96         unsigned long flags;
97
98         if (likely(rq->urb))
99                 usb_free_urb(rq->urb);
100         spin_lock_irqsave(&priv->asynclock, flags);
101         list_del_init(&rq->asynclist);
102         spin_unlock_irqrestore(&priv->asynclock, flags);
103         kfree(rq);
104         kref_put(&priv->ref_count, destroy_priv);
105 }
106
107 /* --------------------------------------------------------------------- */
108
109 static void async_complete(struct urb *urb, struct pt_regs *ptregs)
110 {
111         struct uss720_async_request *rq;
112         struct parport *pp;
113         struct parport_uss720_private *priv;
114
115         rq = urb->context;
116         priv = rq->priv;
117         pp = priv->pp;
118         if (urb->status) {
119                 err("async_complete: urb error %d", urb->status);
120         } else if (rq->dr.bRequest == 3) {
121                 memcpy(priv->reg, rq->reg, sizeof(priv->reg));
122 #if 0
123                 dbg("async_complete regs %02x %02x %02x %02x %02x %02x %02x",
124                     (unsigned int)priv->reg[0], (unsigned int)priv->reg[1], (unsigned int)priv->reg[2],
125                     (unsigned int)priv->reg[3], (unsigned int)priv->reg[4], (unsigned int)priv->reg[5],
126                     (unsigned int)priv->reg[6]);
127 #endif
128                 /* if nAck interrupts are enabled and we have an interrupt, call the interrupt procedure */
129                 if (rq->reg[2] & rq->reg[1] & 0x10 && pp)
130                         parport_generic_irq(0, pp, NULL);
131         }
132         complete(&rq->compl);
133         kref_put(&rq->ref_count, destroy_async);
134 }
135
136 static struct uss720_async_request *submit_async_request(struct parport_uss720_private *priv,
137                                                          __u8 request, __u8 requesttype, __u16 value, __u16 index,
138                                                          gfp_t mem_flags)
139 {
140         struct usb_device *usbdev;
141         struct uss720_async_request *rq;
142         unsigned long flags;
143         int ret;
144
145         if (!priv)
146                 return NULL;
147         usbdev = priv->usbdev;
148         if (!usbdev)
149                 return NULL;
150         rq = kmalloc(sizeof(struct uss720_async_request), mem_flags);
151         if (!rq) {
152                 err("submit_async_request out of memory");
153                 return NULL;
154         }
155         kref_init(&rq->ref_count);
156         INIT_LIST_HEAD(&rq->asynclist);
157         init_completion(&rq->compl);
158         kref_get(&priv->ref_count);
159         rq->priv = priv;
160         rq->urb = usb_alloc_urb(0, mem_flags);
161         if (!rq->urb) {
162                 kref_put(&rq->ref_count, destroy_async);
163                 err("submit_async_request out of memory");
164                 return NULL;
165         }
166         rq->dr.bRequestType = requesttype;
167         rq->dr.bRequest = request;
168         rq->dr.wValue = cpu_to_le16(value);
169         rq->dr.wIndex = cpu_to_le16(index);
170         rq->dr.wLength = cpu_to_le16((request == 3) ? sizeof(rq->reg) : 0);
171         usb_fill_control_urb(rq->urb, usbdev, (requesttype & 0x80) ? usb_rcvctrlpipe(usbdev, 0) : usb_sndctrlpipe(usbdev, 0),
172                              (unsigned char *)&rq->dr,
173                              (request == 3) ? rq->reg : NULL, (request == 3) ? sizeof(rq->reg) : 0, async_complete, rq);
174         /* rq->urb->transfer_flags |= URB_ASYNC_UNLINK; */
175         spin_lock_irqsave(&priv->asynclock, flags);
176         list_add_tail(&rq->asynclist, &priv->asynclist);
177         spin_unlock_irqrestore(&priv->asynclock, flags);
178         ret = usb_submit_urb(rq->urb, mem_flags);
179         if (!ret) {
180                 kref_get(&rq->ref_count);
181                 return rq;
182         }
183         kref_put(&rq->ref_count, destroy_async);
184         err("submit_async_request submit_urb failed with %d", ret);
185         return NULL;
186 }
187
188 static unsigned int kill_all_async_requests_priv(struct parport_uss720_private *priv)
189 {
190         struct uss720_async_request *rq;
191         unsigned long flags;
192         unsigned int ret = 0;
193
194         spin_lock_irqsave(&priv->asynclock, flags);
195         list_for_each_entry(rq, &priv->asynclist, asynclist) {
196                 usb_unlink_urb(rq->urb);
197                 ret++;
198         }
199         spin_unlock_irqrestore(&priv->asynclock, flags);
200         return ret;
201 }
202
203 /* --------------------------------------------------------------------- */
204
205 static int get_1284_register(struct parport *pp, unsigned char reg, unsigned char *val, gfp_t mem_flags)
206 {
207         struct parport_uss720_private *priv;
208         struct uss720_async_request *rq;
209         static const unsigned char regindex[9] = {
210                 4, 0, 1, 5, 5, 0, 2, 3, 6
211         };
212         int ret;
213
214         if (!pp)
215                 return -EIO;
216         priv = pp->private_data;
217         rq = submit_async_request(priv, 3, 0xc0, ((unsigned int)reg) << 8, 0, mem_flags);
218         if (!rq) {
219                 err("get_1284_register(%u) failed", (unsigned int)reg);
220                 return -EIO;
221         }
222         if (!val) {
223                 kref_put(&rq->ref_count, destroy_async);
224                 return 0;
225         }
226         if (wait_for_completion_timeout(&rq->compl, HZ)) {
227                 ret = rq->urb->status;
228                 *val = priv->reg[(reg >= 9) ? 0 : regindex[reg]];
229                 if (ret)
230                         warn("get_1284_register: usb error %d", ret);
231                 kref_put(&rq->ref_count, destroy_async);
232                 return ret;
233         }
234         warn("get_1284_register timeout");
235         kill_all_async_requests_priv(priv);
236         return -EIO;
237 }
238
239 static int set_1284_register(struct parport *pp, unsigned char reg, unsigned char val, gfp_t mem_flags)
240 {
241         struct parport_uss720_private *priv;
242         struct uss720_async_request *rq;
243
244         if (!pp)
245                 return -EIO;
246         priv = pp->private_data;
247         rq = submit_async_request(priv, 4, 0x40, (((unsigned int)reg) << 8) | val, 0, mem_flags);
248         if (!rq) {
249                 err("set_1284_register(%u,%u) failed", (unsigned int)reg, (unsigned int)val);
250                 return -EIO;
251         }
252         kref_put(&rq->ref_count, destroy_async);
253         return 0;
254 }
255
256 /* --------------------------------------------------------------------- */
257
258 /* ECR modes */
259 #define ECR_SPP 00
260 #define ECR_PS2 01
261 #define ECR_PPF 02
262 #define ECR_ECP 03
263 #define ECR_EPP 04
264
265 /* Safely change the mode bits in the ECR */
266 static int change_mode(struct parport *pp, int m)
267 {
268         struct parport_uss720_private *priv = pp->private_data;
269         int mode;
270         __u8 reg;
271
272         if (get_1284_register(pp, 6, &reg, GFP_KERNEL))
273                 return -EIO;
274         /* Bits <7:5> contain the mode. */
275         mode = (priv->reg[2] >> 5) & 0x7;
276         if (mode == m)
277                 return 0;
278         /* We have to go through mode 000 or 001 */
279         if (mode > ECR_PS2 && m > ECR_PS2)
280                 if (change_mode(pp, ECR_PS2))
281                         return -EIO;
282
283         if (m <= ECR_PS2 && !(priv->reg[1] & 0x20)) {
284                 /* This mode resets the FIFO, so we may
285                  * have to wait for it to drain first. */
286                 unsigned long expire = jiffies + pp->physport->cad->timeout;
287                 switch (mode) {
288                 case ECR_PPF: /* Parallel Port FIFO mode */
289                 case ECR_ECP: /* ECP Parallel Port mode */
290                         /* Poll slowly. */
291                         for (;;) {
292                                 if (get_1284_register(pp, 6, &reg, GFP_KERNEL))
293                                         return -EIO;
294                                 if (priv->reg[2] & 0x01)
295                                         break;
296                                 if (time_after_eq (jiffies, expire))
297                                         /* The FIFO is stuck. */
298                                         return -EBUSY;
299                                 msleep_interruptible(10);
300                                 if (signal_pending (current))
301                                         break;
302                         }
303                 }
304         }
305         /* Set the mode. */
306         if (set_1284_register(pp, 6, m << 5, GFP_KERNEL))
307                 return -EIO;
308         if (get_1284_register(pp, 6, &reg, GFP_KERNEL))
309                 return -EIO;
310         return 0;
311 }
312
313 /*
314  * Clear TIMEOUT BIT in EPP MODE
315  */
316 static int clear_epp_timeout(struct parport *pp)
317 {
318         unsigned char stat;
319
320         if (get_1284_register(pp, 1, &stat, GFP_KERNEL))
321                 return 1;
322         return stat & 1;
323 }
324
325 /*
326  * Access functions.
327  */
328 #if 0
329 static int uss720_irq(int usbstatus, void *buffer, int len, void *dev_id)
330 {
331         struct parport *pp = (struct parport *)dev_id;
332         struct parport_uss720_private *priv = pp->private_data; 
333
334         if (usbstatus != 0 || len < 4 || !buffer)
335                 return 1;
336         memcpy(priv->reg, buffer, 4);
337         /* if nAck interrupts are enabled and we have an interrupt, call the interrupt procedure */
338         if (priv->reg[2] & priv->reg[1] & 0x10)
339                 parport_generic_irq(0, pp, NULL);
340         return 1;
341 }
342 #endif
343
344 static void parport_uss720_write_data(struct parport *pp, unsigned char d)
345 {
346         set_1284_register(pp, 0, d, GFP_KERNEL);
347 }
348
349 static unsigned char parport_uss720_read_data(struct parport *pp)
350 {
351         unsigned char ret;
352
353         if (get_1284_register(pp, 0, &ret, GFP_KERNEL))
354                 return 0;
355         return ret;
356 }
357
358 static void parport_uss720_write_control(struct parport *pp, unsigned char d)
359 {
360         struct parport_uss720_private *priv = pp->private_data; 
361
362         d = (d & 0xf) | (priv->reg[1] & 0xf0);
363         if (set_1284_register(pp, 2, d, GFP_KERNEL))
364                 return;
365         priv->reg[1] = d;
366 }
367
368 static unsigned char parport_uss720_read_control(struct parport *pp)
369 {
370         struct parport_uss720_private *priv = pp->private_data; 
371         return priv->reg[1] & 0xf; /* Use soft copy */
372 }
373
374 static unsigned char parport_uss720_frob_control(struct parport *pp, unsigned char mask, unsigned char val)
375 {
376         struct parport_uss720_private *priv = pp->private_data; 
377         unsigned char d;
378
379         mask &= 0x0f;
380         val &= 0x0f;
381         d = (priv->reg[1] & (~mask)) ^ val;
382         if (set_1284_register(pp, 2, d, GFP_KERNEL))
383                 return 0;
384         priv->reg[1] = d;
385         return d & 0xf;
386 }
387
388 static unsigned char parport_uss720_read_status(struct parport *pp)
389 {
390         unsigned char ret;
391
392         if (get_1284_register(pp, 1, &ret, GFP_KERNEL))
393                 return 0;
394         return ret & 0xf8;
395 }
396
397 static void parport_uss720_disable_irq(struct parport *pp)
398 {
399         struct parport_uss720_private *priv = pp->private_data; 
400         unsigned char d;
401
402         d = priv->reg[1] & ~0x10;
403         if (set_1284_register(pp, 2, d, GFP_KERNEL))
404                 return;
405         priv->reg[1] = d;
406 }
407
408 static void parport_uss720_enable_irq(struct parport *pp)
409 {
410         struct parport_uss720_private *priv = pp->private_data; 
411         unsigned char d;
412
413         d = priv->reg[1] | 0x10;
414         if (set_1284_register(pp, 2, d, GFP_KERNEL))
415                 return;
416         priv->reg[1] = d;
417 }
418
419 static void parport_uss720_data_forward (struct parport *pp)
420 {
421         struct parport_uss720_private *priv = pp->private_data; 
422         unsigned char d;
423
424         d = priv->reg[1] & ~0x20;
425         if (set_1284_register(pp, 2, d, GFP_KERNEL))
426                 return;
427         priv->reg[1] = d;
428 }
429
430 static void parport_uss720_data_reverse (struct parport *pp)
431 {
432         struct parport_uss720_private *priv = pp->private_data; 
433         unsigned char d;
434
435         d = priv->reg[1] | 0x20;
436         if (set_1284_register(pp, 2, d, GFP_KERNEL))
437                 return;
438         priv->reg[1] = d;
439 }
440
441 static void parport_uss720_init_state(struct pardevice *dev, struct parport_state *s)
442 {
443         s->u.pc.ctr = 0xc | (dev->irq_func ? 0x10 : 0x0);
444         s->u.pc.ecr = 0x24;
445 }
446
447 static void parport_uss720_save_state(struct parport *pp, struct parport_state *s)
448 {
449         struct parport_uss720_private *priv = pp->private_data; 
450
451 #if 0
452         if (get_1284_register(pp, 2, NULL, GFP_ATOMIC))
453                 return;
454 #endif
455         s->u.pc.ctr = priv->reg[1];
456         s->u.pc.ecr = priv->reg[2];
457 }
458
459 static void parport_uss720_restore_state(struct parport *pp, struct parport_state *s)
460 {
461         struct parport_uss720_private *priv = pp->private_data;
462
463         set_1284_register(pp, 2, s->u.pc.ctr, GFP_ATOMIC);
464         set_1284_register(pp, 6, s->u.pc.ecr, GFP_ATOMIC);
465         get_1284_register(pp, 2, NULL, GFP_ATOMIC);
466         priv->reg[1] = s->u.pc.ctr;
467         priv->reg[2] = s->u.pc.ecr;
468 }
469
470 static size_t parport_uss720_epp_read_data(struct parport *pp, void *buf, size_t length, int flags)
471 {
472         struct parport_uss720_private *priv = pp->private_data; 
473         size_t got = 0;
474
475         if (change_mode(pp, ECR_EPP))
476                 return 0;
477         for (; got < length; got++) {
478                 if (get_1284_register(pp, 4, (char *)buf, GFP_KERNEL))
479                         break;
480                 buf++;
481                 if (priv->reg[0] & 0x01) {
482                         clear_epp_timeout(pp);
483                         break;
484                 }
485         }
486         change_mode(pp, ECR_PS2);
487         return got;
488 }
489
490 static size_t parport_uss720_epp_write_data(struct parport *pp, const void *buf, size_t length, int flags)
491 {
492 #if 0
493         struct parport_uss720_private *priv = pp->private_data; 
494         size_t written = 0;
495
496         if (change_mode(pp, ECR_EPP))
497                 return 0;
498         for (; written < length; written++) {
499                 if (set_1284_register(pp, 4, (char *)buf, GFP_KERNEL))
500                         break;
501                 ((char*)buf)++;
502                 if (get_1284_register(pp, 1, NULL, GFP_KERNEL))
503                         break;
504                 if (priv->reg[0] & 0x01) {
505                         clear_epp_timeout(pp);
506                         break;
507                 }
508         }
509         change_mode(pp, ECR_PS2);
510         return written;
511 #else
512         struct parport_uss720_private *priv = pp->private_data;
513         struct usb_device *usbdev = priv->usbdev;
514         int rlen;
515         int i;
516
517         if (!usbdev)
518                 return 0;
519         if (change_mode(pp, ECR_EPP))
520                 return 0;
521         i = usb_bulk_msg(usbdev, usb_sndbulkpipe(usbdev, 1), (void *)buf, length, &rlen, 20000);
522         if (i)
523                 printk(KERN_ERR "uss720: sendbulk ep 1 buf %p len %Zu rlen %u\n", buf, length, rlen);
524         change_mode(pp, ECR_PS2);
525         return rlen;
526 #endif
527 }
528
529 static size_t parport_uss720_epp_read_addr(struct parport *pp, void *buf, size_t length, int flags)
530 {
531         struct parport_uss720_private *priv = pp->private_data; 
532         size_t got = 0;
533
534         if (change_mode(pp, ECR_EPP))
535                 return 0;
536         for (; got < length; got++) {
537                 if (get_1284_register(pp, 3, (char *)buf, GFP_KERNEL))
538                         break;
539                 buf++;
540                 if (priv->reg[0] & 0x01) {
541                         clear_epp_timeout(pp);
542                         break;
543                 }
544         }
545         change_mode(pp, ECR_PS2);
546         return got;
547 }
548
549 static size_t parport_uss720_epp_write_addr(struct parport *pp, const void *buf, size_t length, int flags)
550 {
551         struct parport_uss720_private *priv = pp->private_data; 
552         size_t written = 0;
553
554         if (change_mode(pp, ECR_EPP))
555                 return 0;
556         for (; written < length; written++) {
557                 if (set_1284_register(pp, 3, *(char *)buf, GFP_KERNEL))
558                         break;
559                 buf++;
560                 if (get_1284_register(pp, 1, NULL, GFP_KERNEL))
561                         break;
562                 if (priv->reg[0] & 0x01) {
563                         clear_epp_timeout(pp);
564                         break;
565                 }
566         }
567         change_mode(pp, ECR_PS2);
568         return written;
569 }
570
571 static size_t parport_uss720_ecp_write_data(struct parport *pp, const void *buffer, size_t len, int flags)
572 {
573         struct parport_uss720_private *priv = pp->private_data;
574         struct usb_device *usbdev = priv->usbdev;
575         int rlen;
576         int i;
577
578         if (!usbdev)
579                 return 0;
580         if (change_mode(pp, ECR_ECP))
581                 return 0;
582         i = usb_bulk_msg(usbdev, usb_sndbulkpipe(usbdev, 1), (void *)buffer, len, &rlen, 20000);
583         if (i)
584                 printk(KERN_ERR "uss720: sendbulk ep 1 buf %p len %Zu rlen %u\n", buffer, len, rlen);
585         change_mode(pp, ECR_PS2);
586         return rlen;
587 }
588
589 static size_t parport_uss720_ecp_read_data(struct parport *pp, void *buffer, size_t len, int flags)
590 {
591         struct parport_uss720_private *priv = pp->private_data;
592         struct usb_device *usbdev = priv->usbdev;
593         int rlen;
594         int i;
595
596         if (!usbdev)
597                 return 0;
598         if (change_mode(pp, ECR_ECP))
599                 return 0;
600         i = usb_bulk_msg(usbdev, usb_rcvbulkpipe(usbdev, 2), buffer, len, &rlen, 20000);
601         if (i)
602                 printk(KERN_ERR "uss720: recvbulk ep 2 buf %p len %Zu rlen %u\n", buffer, len, rlen);
603         change_mode(pp, ECR_PS2);
604         return rlen;
605 }
606
607 static size_t parport_uss720_ecp_write_addr(struct parport *pp, const void *buffer, size_t len, int flags)
608 {
609         size_t written = 0;
610
611         if (change_mode(pp, ECR_ECP))
612                 return 0;
613         for (; written < len; written++) {
614                 if (set_1284_register(pp, 5, *(char *)buffer, GFP_KERNEL))
615                         break;
616                 buffer++;
617         }
618         change_mode(pp, ECR_PS2);
619         return written;
620 }
621
622 static size_t parport_uss720_write_compat(struct parport *pp, const void *buffer, size_t len, int flags)
623 {
624         struct parport_uss720_private *priv = pp->private_data;
625         struct usb_device *usbdev = priv->usbdev;
626         int rlen;
627         int i;
628
629         if (!usbdev)
630                 return 0;
631         if (change_mode(pp, ECR_PPF))
632                 return 0;
633         i = usb_bulk_msg(usbdev, usb_sndbulkpipe(usbdev, 1), (void *)buffer, len, &rlen, 20000);
634         if (i)
635                 printk(KERN_ERR "uss720: sendbulk ep 1 buf %p len %Zu rlen %u\n", buffer, len, rlen);
636         change_mode(pp, ECR_PS2);
637         return rlen;
638 }
639
640 /* --------------------------------------------------------------------- */
641
642 static struct parport_operations parport_uss720_ops = 
643 {
644         .owner =                THIS_MODULE,
645         .write_data =           parport_uss720_write_data,
646         .read_data =            parport_uss720_read_data,
647
648         .write_control =        parport_uss720_write_control,
649         .read_control =         parport_uss720_read_control,
650         .frob_control =         parport_uss720_frob_control,
651
652         .read_status =          parport_uss720_read_status,
653
654         .enable_irq =           parport_uss720_enable_irq,
655         .disable_irq =          parport_uss720_disable_irq,
656
657         .data_forward =         parport_uss720_data_forward,
658         .data_reverse =         parport_uss720_data_reverse,
659
660         .init_state =           parport_uss720_init_state,
661         .save_state =           parport_uss720_save_state,
662         .restore_state =        parport_uss720_restore_state,
663
664         .epp_write_data =       parport_uss720_epp_write_data,
665         .epp_read_data =        parport_uss720_epp_read_data,
666         .epp_write_addr =       parport_uss720_epp_write_addr,
667         .epp_read_addr =        parport_uss720_epp_read_addr,
668
669         .ecp_write_data =       parport_uss720_ecp_write_data,
670         .ecp_read_data =        parport_uss720_ecp_read_data,
671         .ecp_write_addr =       parport_uss720_ecp_write_addr,
672
673         .compat_write_data =    parport_uss720_write_compat,
674         .nibble_read_data =     parport_ieee1284_read_nibble,
675         .byte_read_data =       parport_ieee1284_read_byte,
676 };
677
678 /* --------------------------------------------------------------------- */
679
680 static int uss720_probe(struct usb_interface *intf,
681                         const struct usb_device_id *id)
682 {
683         struct usb_device *usbdev = usb_get_dev(interface_to_usbdev(intf));
684         struct usb_host_interface *interface;
685         struct usb_host_endpoint *endpoint;
686         struct parport_uss720_private *priv;
687         struct parport *pp;
688         unsigned char reg;
689         int i;
690
691         dbg("probe: vendor id 0x%x, device id 0x%x\n",
692             le16_to_cpu(usbdev->descriptor.idVendor),
693             le16_to_cpu(usbdev->descriptor.idProduct));
694
695         /* our known interfaces have 3 alternate settings */
696         if (intf->num_altsetting != 3) {
697                 usb_put_dev(usbdev);
698                 return -ENODEV;
699         }
700         i = usb_set_interface(usbdev, intf->altsetting->desc.bInterfaceNumber, 2);
701         dbg("set inteface result %d", i);
702
703         interface = intf->cur_altsetting;
704
705         /*
706          * Allocate parport interface 
707          */
708         if (!(priv = kcalloc(sizeof(struct parport_uss720_private), 1, GFP_KERNEL))) {
709                 usb_put_dev(usbdev);
710                 return -ENOMEM;
711         }
712         priv->pp = NULL;
713         priv->usbdev = usbdev;
714         kref_init(&priv->ref_count);
715         spin_lock_init(&priv->asynclock);
716         INIT_LIST_HEAD(&priv->asynclist);
717         if (!(pp = parport_register_port(0, PARPORT_IRQ_NONE, PARPORT_DMA_NONE, &parport_uss720_ops))) {
718                 warn("could not register parport");
719                 goto probe_abort;
720         }
721
722         priv->pp = pp;
723         pp->private_data = priv;
724         pp->modes = PARPORT_MODE_PCSPP | PARPORT_MODE_TRISTATE | PARPORT_MODE_EPP | PARPORT_MODE_ECP | PARPORT_MODE_COMPAT;
725
726         /* set the USS720 control register to manual mode, no ECP compression, enable all ints */
727         set_1284_register(pp, 7, 0x00, GFP_KERNEL);
728         set_1284_register(pp, 6, 0x30, GFP_KERNEL);  /* PS/2 mode */
729         set_1284_register(pp, 2, 0x0c, GFP_KERNEL);
730         /* debugging */
731         get_1284_register(pp, 0, &reg, GFP_KERNEL);
732         dbg("reg: %02x %02x %02x %02x %02x %02x %02x",
733             priv->reg[0], priv->reg[1], priv->reg[2], priv->reg[3], priv->reg[4], priv->reg[5], priv->reg[6]);
734
735         endpoint = &interface->endpoint[2];
736         dbg("epaddr %d interval %d", endpoint->desc.bEndpointAddress, endpoint->desc.bInterval);
737         parport_announce_port(pp);
738
739         usb_set_intfdata(intf, pp);
740         return 0;
741
742 probe_abort:
743         kill_all_async_requests_priv(priv);
744         kref_put(&priv->ref_count, destroy_priv);
745         return -ENODEV;
746 }
747
748 static void uss720_disconnect(struct usb_interface *intf)
749 {
750         struct parport *pp = usb_get_intfdata(intf);
751         struct parport_uss720_private *priv;
752         struct usb_device *usbdev;
753
754         dbg("disconnect");
755         usb_set_intfdata(intf, NULL);
756         if (pp) {
757                 priv = pp->private_data;
758                 usbdev = priv->usbdev;
759                 priv->usbdev = NULL;
760                 priv->pp = NULL;
761                 dbg("parport_remove_port");
762                 parport_remove_port(pp);
763                 parport_put_port(pp);
764                 kill_all_async_requests_priv(priv);
765                 kref_put(&priv->ref_count, destroy_priv);
766         }
767         dbg("disconnect done");
768 }
769
770 /* table of cables that work through this driver */
771 static struct usb_device_id uss720_table [] = {
772         { USB_DEVICE(0x047e, 0x1001) },
773         { USB_DEVICE(0x0557, 0x2001) },
774         { USB_DEVICE(0x0729, 0x1284) },
775         { USB_DEVICE(0x1293, 0x0002) },
776         { }                                             /* Terminating entry */
777 };
778
779 MODULE_DEVICE_TABLE (usb, uss720_table);
780
781
782 static struct usb_driver uss720_driver = {
783         .name =         "uss720",
784         .probe =        uss720_probe,
785         .disconnect =   uss720_disconnect,
786         .id_table =     uss720_table,
787 };
788
789 /* --------------------------------------------------------------------- */
790
791 MODULE_AUTHOR(DRIVER_AUTHOR);
792 MODULE_DESCRIPTION(DRIVER_DESC);
793 MODULE_LICENSE("GPL");
794
795 static int __init uss720_init(void)
796 {
797         int retval;
798         retval = usb_register(&uss720_driver);
799         if (retval)
800                 goto out;
801
802         info(DRIVER_VERSION ":" DRIVER_DESC);
803         info("NOTE: this is a special purpose driver to allow nonstandard");
804         info("protocols (eg. bitbang) over USS720 usb to parallel cables");
805         info("If you just want to connect to a printer, use usblp instead");
806 out:
807         return retval;
808 }
809
810 static void __exit uss720_cleanup(void)
811 {
812         usb_deregister(&uss720_driver);
813 }
814
815 module_init(uss720_init);
816 module_exit(uss720_cleanup);
817
818 /* --------------------------------------------------------------------- */