xref: /openbmc/linux/drivers/usb/misc/uss720.c (revision 64c70b1c)
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)
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);
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);
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 = kzalloc(sizeof(struct parport_uss720_private), 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 /* --------------------------------------------------------------------- */
819