1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23#include <linux/kernel.h>
24#include <linux/errno.h>
25#include <linux/slab.h>
26#include <linux/tty.h>
27#include <linux/tty_driver.h>
28#include <linux/tty_flip.h>
29#include <linux/module.h>
30#include <linux/spinlock.h>
31#include <linux/serial.h>
32#include <linux/serial_reg.h>
33#include <linux/usb.h>
34#include <linux/usb/serial.h>
35#include <linux/uaccess.h>
36#include <linux/parport.h>
37
38#define DRIVER_AUTHOR "Aspire Communications pvt Ltd."
39#define DRIVER_DESC "Moschip USB Serial Driver"
40
41
42#define MOS_WDR_TIMEOUT 5000
43
44#define MOS_MAX_PORT 0x02
45#define MOS_WRITE 0x0E
46#define MOS_READ 0x0D
47
48
49#define SERIAL_IIR_RLS 0x06
50#define SERIAL_IIR_RDA 0x04
51#define SERIAL_IIR_CTI 0x0c
52#define SERIAL_IIR_THR 0x02
53#define SERIAL_IIR_MS 0x00
54
55#define NUM_URBS 16
56#define URB_TRANSFER_BUFFER_SIZE 32
57
58
59struct moschip_port {
60 __u8 shadowLCR;
61 __u8 shadowMCR;
62 __u8 shadowMSR;
63 char open;
64 struct usb_serial_port *port;
65 struct urb *write_urb_pool[NUM_URBS];
66};
67
68static struct usb_serial_driver moschip7720_2port_driver;
69
70#define USB_VENDOR_ID_MOSCHIP 0x9710
71#define MOSCHIP_DEVICE_ID_7720 0x7720
72#define MOSCHIP_DEVICE_ID_7715 0x7715
73
74static const struct usb_device_id id_table[] = {
75 { USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7720) },
76 { USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7715) },
77 { }
78};
79MODULE_DEVICE_TABLE(usb, id_table);
80
81#ifdef CONFIG_USB_SERIAL_MOS7715_PARPORT
82
83
84#define DCR_INIT_VAL 0x0c
85#define ECR_INIT_VAL 0x00
86
87struct urbtracker {
88 struct mos7715_parport *mos_parport;
89 struct list_head urblist_entry;
90 struct kref ref_count;
91 struct urb *urb;
92 struct usb_ctrlrequest *setup;
93};
94
95enum mos7715_pp_modes {
96 SPP = 0<<5,
97 PS2 = 1<<5,
98 PPF = 2<<5,
99};
100
101struct mos7715_parport {
102 struct parport *pp;
103 struct kref ref_count;
104 struct list_head deferred_urbs;
105 struct list_head active_urbs;
106 spinlock_t listlock;
107 bool msg_pending;
108 struct completion syncmsg_compl;
109 struct tasklet_struct urb_tasklet;
110 struct usb_serial *serial;
111 __u8 shadowECR;
112 __u8 shadowDCR;
113 atomic_t shadowDSR;
114};
115
116
117static DEFINE_SPINLOCK(release_lock);
118
119#endif
120
121static const unsigned int dummy;
122
123enum mos_regs {
124 MOS7720_THR,
125 MOS7720_RHR,
126 MOS7720_IER,
127 MOS7720_FCR,
128 MOS7720_ISR,
129 MOS7720_LCR,
130 MOS7720_MCR,
131 MOS7720_LSR,
132 MOS7720_MSR,
133 MOS7720_SPR,
134 MOS7720_DLL,
135 MOS7720_DLM,
136 MOS7720_DPR,
137 MOS7720_DSR,
138 MOS7720_DCR,
139 MOS7720_ECR,
140 MOS7720_SP1_REG,
141 MOS7720_SP2_REG,
142 MOS7720_PP_REG,
143 MOS7720_SP_CONTROL_REG,
144};
145
146
147
148
149
150static inline __u16 get_reg_index(enum mos_regs reg)
151{
152 static const __u16 mos7715_index_lookup_table[] = {
153 0x00,
154 0x00,
155 0x01,
156 0x02,
157 0x02,
158 0x03,
159 0x04,
160 0x05,
161 0x06,
162 0x07,
163 0x00,
164 0x01,
165 0x00,
166 0x01,
167 0x02,
168 0x0a,
169 0x01,
170 0x02,
171 0x04,
172 0x08,
173 };
174 return mos7715_index_lookup_table[reg];
175}
176
177
178
179
180
181static inline __u16 get_reg_value(enum mos_regs reg,
182 unsigned int serial_portnum)
183{
184 if (reg >= MOS7720_SP1_REG)
185 return 0x0000;
186
187 else if (reg >= MOS7720_DPR)
188 return 0x0100;
189
190 else
191 return (serial_portnum + 2) << 8;
192}
193
194
195
196
197
198
199static int write_mos_reg(struct usb_serial *serial, unsigned int serial_portnum,
200 enum mos_regs reg, __u8 data)
201{
202 struct usb_device *usbdev = serial->dev;
203 unsigned int pipe = usb_sndctrlpipe(usbdev, 0);
204 __u8 request = (__u8)0x0e;
205 __u8 requesttype = (__u8)0x40;
206 __u16 index = get_reg_index(reg);
207 __u16 value = get_reg_value(reg, serial_portnum) + data;
208 int status = usb_control_msg(usbdev, pipe, request, requesttype, value,
209 index, NULL, 0, MOS_WDR_TIMEOUT);
210 if (status < 0)
211 dev_err(&usbdev->dev,
212 "mos7720: usb_control_msg() failed: %d\n", status);
213 return status;
214}
215
216
217
218
219
220
221static int read_mos_reg(struct usb_serial *serial, unsigned int serial_portnum,
222 enum mos_regs reg, __u8 *data)
223{
224 struct usb_device *usbdev = serial->dev;
225 unsigned int pipe = usb_rcvctrlpipe(usbdev, 0);
226 __u8 request = (__u8)0x0d;
227 __u8 requesttype = (__u8)0xc0;
228 __u16 index = get_reg_index(reg);
229 __u16 value = get_reg_value(reg, serial_portnum);
230 u8 *buf;
231 int status;
232
233 buf = kmalloc(1, GFP_KERNEL);
234 if (!buf)
235 return -ENOMEM;
236
237 status = usb_control_msg(usbdev, pipe, request, requesttype, value,
238 index, buf, 1, MOS_WDR_TIMEOUT);
239 if (status == 1)
240 *data = *buf;
241 else if (status < 0)
242 dev_err(&usbdev->dev,
243 "mos7720: usb_control_msg() failed: %d\n", status);
244 kfree(buf);
245
246 return status;
247}
248
249#ifdef CONFIG_USB_SERIAL_MOS7715_PARPORT
250
251static inline int mos7715_change_mode(struct mos7715_parport *mos_parport,
252 enum mos7715_pp_modes mode)
253{
254 mos_parport->shadowECR = mode;
255 write_mos_reg(mos_parport->serial, dummy, MOS7720_ECR,
256 mos_parport->shadowECR);
257 return 0;
258}
259
260static void destroy_mos_parport(struct kref *kref)
261{
262 struct mos7715_parport *mos_parport =
263 container_of(kref, struct mos7715_parport, ref_count);
264
265 kfree(mos_parport);
266}
267
268static void destroy_urbtracker(struct kref *kref)
269{
270 struct urbtracker *urbtrack =
271 container_of(kref, struct urbtracker, ref_count);
272 struct mos7715_parport *mos_parport = urbtrack->mos_parport;
273
274 usb_free_urb(urbtrack->urb);
275 kfree(urbtrack->setup);
276 kfree(urbtrack);
277 kref_put(&mos_parport->ref_count, destroy_mos_parport);
278}
279
280
281
282
283
284
285static void send_deferred_urbs(unsigned long _mos_parport)
286{
287 int ret_val;
288 unsigned long flags;
289 struct mos7715_parport *mos_parport = (void *)_mos_parport;
290 struct urbtracker *urbtrack, *tmp;
291 struct list_head *cursor, *next;
292 struct device *dev;
293
294
295 if (unlikely(mos_parport->serial == NULL))
296 return;
297
298 dev = &mos_parport->serial->dev->dev;
299
300
301 if (!mutex_trylock(&mos_parport->serial->disc_mutex)) {
302 dev_dbg(dev, "%s: rescheduling tasklet\n", __func__);
303 tasklet_schedule(&mos_parport->urb_tasklet);
304 return;
305 }
306
307
308 if (unlikely(mos_parport->serial->disconnected)) {
309 mutex_unlock(&mos_parport->serial->disc_mutex);
310 return;
311 }
312
313 spin_lock_irqsave(&mos_parport->listlock, flags);
314 if (list_empty(&mos_parport->deferred_urbs)) {
315 spin_unlock_irqrestore(&mos_parport->listlock, flags);
316 mutex_unlock(&mos_parport->serial->disc_mutex);
317 dev_dbg(dev, "%s: deferred_urbs list empty\n", __func__);
318 return;
319 }
320
321
322 list_for_each_safe(cursor, next, &mos_parport->deferred_urbs)
323 list_move_tail(cursor, &mos_parport->active_urbs);
324 list_for_each_entry_safe(urbtrack, tmp, &mos_parport->active_urbs,
325 urblist_entry) {
326 ret_val = usb_submit_urb(urbtrack->urb, GFP_ATOMIC);
327 dev_dbg(dev, "%s: urb submitted\n", __func__);
328 if (ret_val) {
329 dev_err(dev, "usb_submit_urb() failed: %d\n", ret_val);
330 list_del(&urbtrack->urblist_entry);
331 kref_put(&urbtrack->ref_count, destroy_urbtracker);
332 }
333 }
334 spin_unlock_irqrestore(&mos_parport->listlock, flags);
335 mutex_unlock(&mos_parport->serial->disc_mutex);
336}
337
338
339static void async_complete(struct urb *urb)
340{
341 struct urbtracker *urbtrack = urb->context;
342 int status = urb->status;
343
344 if (unlikely(status))
345 dev_dbg(&urb->dev->dev, "%s - nonzero urb status received: %d\n", __func__, status);
346
347
348 spin_lock(&urbtrack->mos_parport->listlock);
349 list_del(&urbtrack->urblist_entry);
350 spin_unlock(&urbtrack->mos_parport->listlock);
351 kref_put(&urbtrack->ref_count, destroy_urbtracker);
352}
353
354static int write_parport_reg_nonblock(struct mos7715_parport *mos_parport,
355 enum mos_regs reg, __u8 data)
356{
357 struct urbtracker *urbtrack;
358 int ret_val;
359 unsigned long flags;
360 struct usb_serial *serial = mos_parport->serial;
361 struct usb_device *usbdev = serial->dev;
362
363
364 urbtrack = kmalloc(sizeof(struct urbtracker), GFP_ATOMIC);
365 if (!urbtrack)
366 return -ENOMEM;
367
368 kref_get(&mos_parport->ref_count);
369 urbtrack->mos_parport = mos_parport;
370 urbtrack->urb = usb_alloc_urb(0, GFP_ATOMIC);
371 if (!urbtrack->urb) {
372 kfree(urbtrack);
373 return -ENOMEM;
374 }
375 urbtrack->setup = kmalloc(sizeof(*urbtrack->setup), GFP_ATOMIC);
376 if (!urbtrack->setup) {
377 usb_free_urb(urbtrack->urb);
378 kfree(urbtrack);
379 return -ENOMEM;
380 }
381 urbtrack->setup->bRequestType = (__u8)0x40;
382 urbtrack->setup->bRequest = (__u8)0x0e;
383 urbtrack->setup->wValue = cpu_to_le16(get_reg_value(reg, dummy));
384 urbtrack->setup->wIndex = cpu_to_le16(get_reg_index(reg));
385 urbtrack->setup->wLength = 0;
386 usb_fill_control_urb(urbtrack->urb, usbdev,
387 usb_sndctrlpipe(usbdev, 0),
388 (unsigned char *)urbtrack->setup,
389 NULL, 0, async_complete, urbtrack);
390 kref_init(&urbtrack->ref_count);
391 INIT_LIST_HEAD(&urbtrack->urblist_entry);
392
393
394
395
396
397 if (!mutex_trylock(&serial->disc_mutex)) {
398 spin_lock_irqsave(&mos_parport->listlock, flags);
399 list_add_tail(&urbtrack->urblist_entry,
400 &mos_parport->deferred_urbs);
401 spin_unlock_irqrestore(&mos_parport->listlock, flags);
402 tasklet_schedule(&mos_parport->urb_tasklet);
403 dev_dbg(&usbdev->dev, "tasklet scheduled\n");
404 return 0;
405 }
406
407
408 if (serial->disconnected) {
409 kref_put(&urbtrack->ref_count, destroy_urbtracker);
410 mutex_unlock(&serial->disc_mutex);
411 return -ENODEV;
412 }
413
414
415 spin_lock_irqsave(&mos_parport->listlock, flags);
416 list_add_tail(&urbtrack->urblist_entry, &mos_parport->active_urbs);
417 spin_unlock_irqrestore(&mos_parport->listlock, flags);
418 ret_val = usb_submit_urb(urbtrack->urb, GFP_ATOMIC);
419 mutex_unlock(&serial->disc_mutex);
420 if (ret_val) {
421 dev_err(&usbdev->dev,
422 "%s: submit_urb() failed: %d\n", __func__, ret_val);
423 spin_lock_irqsave(&mos_parport->listlock, flags);
424 list_del(&urbtrack->urblist_entry);
425 spin_unlock_irqrestore(&mos_parport->listlock, flags);
426 kref_put(&urbtrack->ref_count, destroy_urbtracker);
427 return ret_val;
428 }
429 return 0;
430}
431
432
433
434
435
436
437
438
439
440
441
442
443
444static int parport_prologue(struct parport *pp)
445{
446 struct mos7715_parport *mos_parport;
447
448 spin_lock(&release_lock);
449 mos_parport = pp->private_data;
450 if (unlikely(mos_parport == NULL)) {
451
452 spin_unlock(&release_lock);
453 return -1;
454 }
455 mos_parport->msg_pending = true;
456 reinit_completion(&mos_parport->syncmsg_compl);
457 spin_unlock(&release_lock);
458
459 mutex_lock(&mos_parport->serial->disc_mutex);
460 if (mos_parport->serial->disconnected) {
461
462 mutex_unlock(&mos_parport->serial->disc_mutex);
463 mos_parport->msg_pending = false;
464 complete(&mos_parport->syncmsg_compl);
465 return -1;
466 }
467
468 return 0;
469}
470
471
472
473
474
475static inline void parport_epilogue(struct parport *pp)
476{
477 struct mos7715_parport *mos_parport = pp->private_data;
478 mutex_unlock(&mos_parport->serial->disc_mutex);
479 mos_parport->msg_pending = false;
480 complete(&mos_parport->syncmsg_compl);
481}
482
483static void parport_mos7715_write_data(struct parport *pp, unsigned char d)
484{
485 struct mos7715_parport *mos_parport = pp->private_data;
486
487 if (parport_prologue(pp) < 0)
488 return;
489 mos7715_change_mode(mos_parport, SPP);
490 write_mos_reg(mos_parport->serial, dummy, MOS7720_DPR, (__u8)d);
491 parport_epilogue(pp);
492}
493
494static unsigned char parport_mos7715_read_data(struct parport *pp)
495{
496 struct mos7715_parport *mos_parport = pp->private_data;
497 unsigned char d;
498
499 if (parport_prologue(pp) < 0)
500 return 0;
501 read_mos_reg(mos_parport->serial, dummy, MOS7720_DPR, &d);
502 parport_epilogue(pp);
503 return d;
504}
505
506static void parport_mos7715_write_control(struct parport *pp, unsigned char d)
507{
508 struct mos7715_parport *mos_parport = pp->private_data;
509 __u8 data;
510
511 if (parport_prologue(pp) < 0)
512 return;
513 data = ((__u8)d & 0x0f) | (mos_parport->shadowDCR & 0xf0);
514 write_mos_reg(mos_parport->serial, dummy, MOS7720_DCR, data);
515 mos_parport->shadowDCR = data;
516 parport_epilogue(pp);
517}
518
519static unsigned char parport_mos7715_read_control(struct parport *pp)
520{
521 struct mos7715_parport *mos_parport = pp->private_data;
522 __u8 dcr;
523
524 spin_lock(&release_lock);
525 mos_parport = pp->private_data;
526 if (unlikely(mos_parport == NULL)) {
527 spin_unlock(&release_lock);
528 return 0;
529 }
530 dcr = mos_parport->shadowDCR & 0x0f;
531 spin_unlock(&release_lock);
532 return dcr;
533}
534
535static unsigned char parport_mos7715_frob_control(struct parport *pp,
536 unsigned char mask,
537 unsigned char val)
538{
539 struct mos7715_parport *mos_parport = pp->private_data;
540 __u8 dcr;
541
542 mask &= 0x0f;
543 val &= 0x0f;
544 if (parport_prologue(pp) < 0)
545 return 0;
546 mos_parport->shadowDCR = (mos_parport->shadowDCR & (~mask)) ^ val;
547 write_mos_reg(mos_parport->serial, dummy, MOS7720_DCR,
548 mos_parport->shadowDCR);
549 dcr = mos_parport->shadowDCR & 0x0f;
550 parport_epilogue(pp);
551 return dcr;
552}
553
554static unsigned char parport_mos7715_read_status(struct parport *pp)
555{
556 unsigned char status;
557 struct mos7715_parport *mos_parport = pp->private_data;
558
559 spin_lock(&release_lock);
560 mos_parport = pp->private_data;
561 if (unlikely(mos_parport == NULL)) {
562 spin_unlock(&release_lock);
563 return 0;
564 }
565 status = atomic_read(&mos_parport->shadowDSR) & 0xf8;
566 spin_unlock(&release_lock);
567 return status;
568}
569
570static void parport_mos7715_enable_irq(struct parport *pp)
571{
572}
573
574static void parport_mos7715_disable_irq(struct parport *pp)
575{
576}
577
578static void parport_mos7715_data_forward(struct parport *pp)
579{
580 struct mos7715_parport *mos_parport = pp->private_data;
581
582 if (parport_prologue(pp) < 0)
583 return;
584 mos7715_change_mode(mos_parport, PS2);
585 mos_parport->shadowDCR &= ~0x20;
586 write_mos_reg(mos_parport->serial, dummy, MOS7720_DCR,
587 mos_parport->shadowDCR);
588 parport_epilogue(pp);
589}
590
591static void parport_mos7715_data_reverse(struct parport *pp)
592{
593 struct mos7715_parport *mos_parport = pp->private_data;
594
595 if (parport_prologue(pp) < 0)
596 return;
597 mos7715_change_mode(mos_parport, PS2);
598 mos_parport->shadowDCR |= 0x20;
599 write_mos_reg(mos_parport->serial, dummy, MOS7720_DCR,
600 mos_parport->shadowDCR);
601 parport_epilogue(pp);
602}
603
604static void parport_mos7715_init_state(struct pardevice *dev,
605 struct parport_state *s)
606{
607 s->u.pc.ctr = DCR_INIT_VAL;
608 s->u.pc.ecr = ECR_INIT_VAL;
609}
610
611
612static void parport_mos7715_save_state(struct parport *pp,
613 struct parport_state *s)
614{
615 struct mos7715_parport *mos_parport;
616
617 spin_lock(&release_lock);
618 mos_parport = pp->private_data;
619 if (unlikely(mos_parport == NULL)) {
620 spin_unlock(&release_lock);
621 return;
622 }
623 s->u.pc.ctr = mos_parport->shadowDCR;
624 s->u.pc.ecr = mos_parport->shadowECR;
625 spin_unlock(&release_lock);
626}
627
628
629static void parport_mos7715_restore_state(struct parport *pp,
630 struct parport_state *s)
631{
632 struct mos7715_parport *mos_parport;
633
634 spin_lock(&release_lock);
635 mos_parport = pp->private_data;
636 if (unlikely(mos_parport == NULL)) {
637 spin_unlock(&release_lock);
638 return;
639 }
640 write_parport_reg_nonblock(mos_parport, MOS7720_DCR,
641 mos_parport->shadowDCR);
642 write_parport_reg_nonblock(mos_parport, MOS7720_ECR,
643 mos_parport->shadowECR);
644 spin_unlock(&release_lock);
645}
646
647static size_t parport_mos7715_write_compat(struct parport *pp,
648 const void *buffer,
649 size_t len, int flags)
650{
651 int retval;
652 struct mos7715_parport *mos_parport = pp->private_data;
653 int actual_len;
654
655 if (parport_prologue(pp) < 0)
656 return 0;
657 mos7715_change_mode(mos_parport, PPF);
658 retval = usb_bulk_msg(mos_parport->serial->dev,
659 usb_sndbulkpipe(mos_parport->serial->dev, 2),
660 (void *)buffer, len, &actual_len,
661 MOS_WDR_TIMEOUT);
662 parport_epilogue(pp);
663 if (retval) {
664 dev_err(&mos_parport->serial->dev->dev,
665 "mos7720: usb_bulk_msg() failed: %d\n", retval);
666 return 0;
667 }
668 return actual_len;
669}
670
671static struct parport_operations parport_mos7715_ops = {
672 .owner = THIS_MODULE,
673 .write_data = parport_mos7715_write_data,
674 .read_data = parport_mos7715_read_data,
675
676 .write_control = parport_mos7715_write_control,
677 .read_control = parport_mos7715_read_control,
678 .frob_control = parport_mos7715_frob_control,
679
680 .read_status = parport_mos7715_read_status,
681
682 .enable_irq = parport_mos7715_enable_irq,
683 .disable_irq = parport_mos7715_disable_irq,
684
685 .data_forward = parport_mos7715_data_forward,
686 .data_reverse = parport_mos7715_data_reverse,
687
688 .init_state = parport_mos7715_init_state,
689 .save_state = parport_mos7715_save_state,
690 .restore_state = parport_mos7715_restore_state,
691
692 .compat_write_data = parport_mos7715_write_compat,
693
694 .nibble_read_data = parport_ieee1284_read_nibble,
695 .byte_read_data = parport_ieee1284_read_byte,
696};
697
698
699
700
701
702static int mos7715_parport_init(struct usb_serial *serial)
703{
704 struct mos7715_parport *mos_parport;
705
706
707 mos_parport = kzalloc(sizeof(struct mos7715_parport), GFP_KERNEL);
708 if (!mos_parport)
709 return -ENOMEM;
710
711 mos_parport->msg_pending = false;
712 kref_init(&mos_parport->ref_count);
713 spin_lock_init(&mos_parport->listlock);
714 INIT_LIST_HEAD(&mos_parport->active_urbs);
715 INIT_LIST_HEAD(&mos_parport->deferred_urbs);
716 usb_set_serial_data(serial, mos_parport);
717 mos_parport->serial = serial;
718 tasklet_init(&mos_parport->urb_tasklet, send_deferred_urbs,
719 (unsigned long) mos_parport);
720 init_completion(&mos_parport->syncmsg_compl);
721
722
723 write_mos_reg(mos_parport->serial, dummy, MOS7720_PP_REG, (__u8)0x80);
724 write_mos_reg(mos_parport->serial, dummy, MOS7720_PP_REG, (__u8)0x00);
725
726
727 mos_parport->shadowDCR = DCR_INIT_VAL;
728 write_mos_reg(mos_parport->serial, dummy, MOS7720_DCR,
729 mos_parport->shadowDCR);
730 mos_parport->shadowECR = ECR_INIT_VAL;
731 write_mos_reg(mos_parport->serial, dummy, MOS7720_ECR,
732 mos_parport->shadowECR);
733
734
735 mos_parport->pp = parport_register_port(0, PARPORT_IRQ_NONE,
736 PARPORT_DMA_NONE,
737 &parport_mos7715_ops);
738 if (mos_parport->pp == NULL) {
739 dev_err(&serial->interface->dev,
740 "Could not register parport\n");
741 kref_put(&mos_parport->ref_count, destroy_mos_parport);
742 return -EIO;
743 }
744 mos_parport->pp->private_data = mos_parport;
745 mos_parport->pp->modes = PARPORT_MODE_COMPAT | PARPORT_MODE_PCSPP;
746 mos_parport->pp->dev = &serial->interface->dev;
747 parport_announce_port(mos_parport->pp);
748
749 return 0;
750}
751#endif
752
753
754
755
756
757
758static void mos7720_interrupt_callback(struct urb *urb)
759{
760 int result;
761 int length;
762 int status = urb->status;
763 struct device *dev = &urb->dev->dev;
764 __u8 *data;
765 __u8 sp1;
766 __u8 sp2;
767
768 switch (status) {
769 case 0:
770
771 break;
772 case -ECONNRESET:
773 case -ENOENT:
774 case -ESHUTDOWN:
775
776 dev_dbg(dev, "%s - urb shutting down with status: %d\n", __func__, status);
777 return;
778 default:
779 dev_dbg(dev, "%s - nonzero urb status received: %d\n", __func__, status);
780 goto exit;
781 }
782
783 length = urb->actual_length;
784 data = urb->transfer_buffer;
785
786
787
788
789
790
791
792
793
794
795 if (unlikely(length != 4)) {
796 dev_dbg(dev, "Wrong data !!!\n");
797 return;
798 }
799
800 sp1 = data[3];
801 sp2 = data[2];
802
803 if ((sp1 | sp2) & 0x01) {
804
805 dev_dbg(dev, "No Interrupt !!!\n");
806 } else {
807 switch (sp1 & 0x0f) {
808 case SERIAL_IIR_RLS:
809 dev_dbg(dev, "Serial Port 1: Receiver status error or address bit detected in 9-bit mode\n");
810 break;
811 case SERIAL_IIR_CTI:
812 dev_dbg(dev, "Serial Port 1: Receiver time out\n");
813 break;
814 case SERIAL_IIR_MS:
815
816 break;
817 }
818
819 switch (sp2 & 0x0f) {
820 case SERIAL_IIR_RLS:
821 dev_dbg(dev, "Serial Port 2: Receiver status error or address bit detected in 9-bit mode\n");
822 break;
823 case SERIAL_IIR_CTI:
824 dev_dbg(dev, "Serial Port 2: Receiver time out\n");
825 break;
826 case SERIAL_IIR_MS:
827
828 break;
829 }
830 }
831
832exit:
833 result = usb_submit_urb(urb, GFP_ATOMIC);
834 if (result)
835 dev_err(dev, "%s - Error %d submitting control urb\n", __func__, result);
836}
837
838
839
840
841
842
843static void mos7715_interrupt_callback(struct urb *urb)
844{
845 int result;
846 int length;
847 int status = urb->status;
848 struct device *dev = &urb->dev->dev;
849 __u8 *data;
850 __u8 iir;
851
852 switch (status) {
853 case 0:
854
855 break;
856 case -ECONNRESET:
857 case -ENOENT:
858 case -ESHUTDOWN:
859 case -ENODEV:
860
861 dev_dbg(dev, "%s - urb shutting down with status: %d\n", __func__, status);
862 return;
863 default:
864 dev_dbg(dev, "%s - nonzero urb status received: %d\n", __func__, status);
865 goto exit;
866 }
867
868 length = urb->actual_length;
869 data = urb->transfer_buffer;
870
871
872
873
874
875
876
877 if (unlikely(length != 4)) {
878 dev_dbg(dev, "Wrong data !!!\n");
879 return;
880 }
881
882 iir = data[0];
883 if (!(iir & 0x01)) {
884 switch (iir & 0x0f) {
885 case SERIAL_IIR_RLS:
886 dev_dbg(dev, "Serial Port: Receiver status error or address bit detected in 9-bit mode\n");
887 break;
888 case SERIAL_IIR_CTI:
889 dev_dbg(dev, "Serial Port: Receiver time out\n");
890 break;
891 case SERIAL_IIR_MS:
892
893 break;
894 }
895 }
896
897#ifdef CONFIG_USB_SERIAL_MOS7715_PARPORT
898 {
899 struct usb_serial_port *port = urb->context;
900 struct mos7715_parport *mos_parport = port->serial->private;
901 if (unlikely(mos_parport == NULL))
902 return;
903 atomic_set(&mos_parport->shadowDSR, data[2]);
904 }
905#endif
906
907exit:
908 result = usb_submit_urb(urb, GFP_ATOMIC);
909 if (result)
910 dev_err(dev, "%s - Error %d submitting control urb\n", __func__, result);
911}
912
913
914
915
916
917
918static void mos7720_bulk_in_callback(struct urb *urb)
919{
920 int retval;
921 unsigned char *data ;
922 struct usb_serial_port *port;
923 int status = urb->status;
924
925 if (status) {
926 dev_dbg(&urb->dev->dev, "nonzero read bulk status received: %d\n", status);
927 return;
928 }
929
930 port = urb->context;
931
932 dev_dbg(&port->dev, "Entering...%s\n", __func__);
933
934 data = urb->transfer_buffer;
935
936 if (urb->actual_length) {
937 tty_insert_flip_string(&port->port, data, urb->actual_length);
938 tty_flip_buffer_push(&port->port);
939 }
940
941 if (port->read_urb->status != -EINPROGRESS) {
942 retval = usb_submit_urb(port->read_urb, GFP_ATOMIC);
943 if (retval)
944 dev_dbg(&port->dev, "usb_submit_urb(read bulk) failed, retval = %d\n", retval);
945 }
946}
947
948
949
950
951
952
953static void mos7720_bulk_out_data_callback(struct urb *urb)
954{
955 struct moschip_port *mos7720_port;
956 int status = urb->status;
957
958 if (status) {
959 dev_dbg(&urb->dev->dev, "nonzero write bulk status received:%d\n", status);
960 return;
961 }
962
963 mos7720_port = urb->context;
964 if (!mos7720_port) {
965 dev_dbg(&urb->dev->dev, "NULL mos7720_port pointer\n");
966 return ;
967 }
968
969 if (mos7720_port->open)
970 tty_port_tty_wakeup(&mos7720_port->port->port);
971}
972
973
974
975
976
977
978
979static int mos77xx_probe(struct usb_serial *serial,
980 const struct usb_device_id *id)
981{
982 if (id->idProduct == MOSCHIP_DEVICE_ID_7715)
983 moschip7720_2port_driver.read_int_callback =
984 mos7715_interrupt_callback;
985 else
986 moschip7720_2port_driver.read_int_callback =
987 mos7720_interrupt_callback;
988
989 return 0;
990}
991
992static int mos77xx_calc_num_ports(struct usb_serial *serial)
993{
994 u16 product = le16_to_cpu(serial->dev->descriptor.idProduct);
995 if (product == MOSCHIP_DEVICE_ID_7715)
996 return 1;
997
998 return 2;
999}
1000
1001static int mos7720_open(struct tty_struct *tty, struct usb_serial_port *port)
1002{
1003 struct usb_serial *serial;
1004 struct urb *urb;
1005 struct moschip_port *mos7720_port;
1006 int response;
1007 int port_number;
1008 __u8 data;
1009 int allocated_urbs = 0;
1010 int j;
1011
1012 serial = port->serial;
1013
1014 mos7720_port = usb_get_serial_port_data(port);
1015 if (mos7720_port == NULL)
1016 return -ENODEV;
1017
1018 usb_clear_halt(serial->dev, port->write_urb->pipe);
1019 usb_clear_halt(serial->dev, port->read_urb->pipe);
1020
1021
1022 for (j = 0; j < NUM_URBS; ++j) {
1023 urb = usb_alloc_urb(0, GFP_KERNEL);
1024 mos7720_port->write_urb_pool[j] = urb;
1025 if (!urb)
1026 continue;
1027
1028 urb->transfer_buffer = kmalloc(URB_TRANSFER_BUFFER_SIZE,
1029 GFP_KERNEL);
1030 if (!urb->transfer_buffer) {
1031 usb_free_urb(mos7720_port->write_urb_pool[j]);
1032 mos7720_port->write_urb_pool[j] = NULL;
1033 continue;
1034 }
1035 allocated_urbs++;
1036 }
1037
1038 if (!allocated_urbs)
1039 return -ENOMEM;
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055 port_number = port->port_number;
1056 read_mos_reg(serial, port_number, MOS7720_LSR, &data);
1057
1058 dev_dbg(&port->dev, "SS::%p LSR:%x\n", mos7720_port, data);
1059
1060 write_mos_reg(serial, dummy, MOS7720_SP1_REG, 0x02);
1061 write_mos_reg(serial, dummy, MOS7720_SP2_REG, 0x02);
1062
1063 write_mos_reg(serial, port_number, MOS7720_IER, 0x00);
1064 write_mos_reg(serial, port_number, MOS7720_FCR, 0x00);
1065
1066 write_mos_reg(serial, port_number, MOS7720_FCR, 0xcf);
1067 mos7720_port->shadowLCR = 0x03;
1068 write_mos_reg(serial, port_number, MOS7720_LCR,
1069 mos7720_port->shadowLCR);
1070 mos7720_port->shadowMCR = 0x0b;
1071 write_mos_reg(serial, port_number, MOS7720_MCR,
1072 mos7720_port->shadowMCR);
1073
1074 write_mos_reg(serial, port_number, MOS7720_SP_CONTROL_REG, 0x00);
1075 read_mos_reg(serial, dummy, MOS7720_SP_CONTROL_REG, &data);
1076 data = data | (port->port_number + 1);
1077 write_mos_reg(serial, dummy, MOS7720_SP_CONTROL_REG, data);
1078 mos7720_port->shadowLCR = 0x83;
1079 write_mos_reg(serial, port_number, MOS7720_LCR,
1080 mos7720_port->shadowLCR);
1081 write_mos_reg(serial, port_number, MOS7720_THR, 0x0c);
1082 write_mos_reg(serial, port_number, MOS7720_IER, 0x00);
1083 mos7720_port->shadowLCR = 0x03;
1084 write_mos_reg(serial, port_number, MOS7720_LCR,
1085 mos7720_port->shadowLCR);
1086 write_mos_reg(serial, port_number, MOS7720_IER, 0x0c);
1087
1088 response = usb_submit_urb(port->read_urb, GFP_KERNEL);
1089 if (response)
1090 dev_err(&port->dev, "%s - Error %d submitting read urb\n",
1091 __func__, response);
1092
1093
1094 mos7720_port->shadowMCR = UART_MCR_OUT2;
1095
1096
1097 mos7720_port->open = 1;
1098
1099 return 0;
1100}
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111static int mos7720_chars_in_buffer(struct tty_struct *tty)
1112{
1113 struct usb_serial_port *port = tty->driver_data;
1114 int i;
1115 int chars = 0;
1116 struct moschip_port *mos7720_port;
1117
1118 mos7720_port = usb_get_serial_port_data(port);
1119 if (mos7720_port == NULL)
1120 return 0;
1121
1122 for (i = 0; i < NUM_URBS; ++i) {
1123 if (mos7720_port->write_urb_pool[i] &&
1124 mos7720_port->write_urb_pool[i]->status == -EINPROGRESS)
1125 chars += URB_TRANSFER_BUFFER_SIZE;
1126 }
1127 dev_dbg(&port->dev, "%s - returns %d\n", __func__, chars);
1128 return chars;
1129}
1130
1131static void mos7720_close(struct usb_serial_port *port)
1132{
1133 struct usb_serial *serial;
1134 struct moschip_port *mos7720_port;
1135 int j;
1136
1137 serial = port->serial;
1138
1139 mos7720_port = usb_get_serial_port_data(port);
1140 if (mos7720_port == NULL)
1141 return;
1142
1143 for (j = 0; j < NUM_URBS; ++j)
1144 usb_kill_urb(mos7720_port->write_urb_pool[j]);
1145
1146
1147 for (j = 0; j < NUM_URBS; ++j) {
1148 if (mos7720_port->write_urb_pool[j]) {
1149 kfree(mos7720_port->write_urb_pool[j]->transfer_buffer);
1150 usb_free_urb(mos7720_port->write_urb_pool[j]);
1151 }
1152 }
1153
1154
1155
1156 usb_kill_urb(port->write_urb);
1157 usb_kill_urb(port->read_urb);
1158
1159 write_mos_reg(serial, port->port_number, MOS7720_MCR, 0x00);
1160 write_mos_reg(serial, port->port_number, MOS7720_IER, 0x00);
1161
1162 mos7720_port->open = 0;
1163}
1164
1165static void mos7720_break(struct tty_struct *tty, int break_state)
1166{
1167 struct usb_serial_port *port = tty->driver_data;
1168 unsigned char data;
1169 struct usb_serial *serial;
1170 struct moschip_port *mos7720_port;
1171
1172 serial = port->serial;
1173
1174 mos7720_port = usb_get_serial_port_data(port);
1175 if (mos7720_port == NULL)
1176 return;
1177
1178 if (break_state == -1)
1179 data = mos7720_port->shadowLCR | UART_LCR_SBC;
1180 else
1181 data = mos7720_port->shadowLCR & ~UART_LCR_SBC;
1182
1183 mos7720_port->shadowLCR = data;
1184 write_mos_reg(serial, port->port_number, MOS7720_LCR,
1185 mos7720_port->shadowLCR);
1186}
1187
1188
1189
1190
1191
1192
1193
1194
1195static int mos7720_write_room(struct tty_struct *tty)
1196{
1197 struct usb_serial_port *port = tty->driver_data;
1198 struct moschip_port *mos7720_port;
1199 int room = 0;
1200 int i;
1201
1202 mos7720_port = usb_get_serial_port_data(port);
1203 if (mos7720_port == NULL)
1204 return -ENODEV;
1205
1206
1207 for (i = 0; i < NUM_URBS; ++i) {
1208 if (mos7720_port->write_urb_pool[i] &&
1209 mos7720_port->write_urb_pool[i]->status != -EINPROGRESS)
1210 room += URB_TRANSFER_BUFFER_SIZE;
1211 }
1212
1213 dev_dbg(&port->dev, "%s - returns %d\n", __func__, room);
1214 return room;
1215}
1216
1217static int mos7720_write(struct tty_struct *tty, struct usb_serial_port *port,
1218 const unsigned char *data, int count)
1219{
1220 int status;
1221 int i;
1222 int bytes_sent = 0;
1223 int transfer_size;
1224
1225 struct moschip_port *mos7720_port;
1226 struct usb_serial *serial;
1227 struct urb *urb;
1228 const unsigned char *current_position = data;
1229
1230 serial = port->serial;
1231
1232 mos7720_port = usb_get_serial_port_data(port);
1233 if (mos7720_port == NULL)
1234 return -ENODEV;
1235
1236
1237 urb = NULL;
1238
1239 for (i = 0; i < NUM_URBS; ++i) {
1240 if (mos7720_port->write_urb_pool[i] &&
1241 mos7720_port->write_urb_pool[i]->status != -EINPROGRESS) {
1242 urb = mos7720_port->write_urb_pool[i];
1243 dev_dbg(&port->dev, "URB:%d\n", i);
1244 break;
1245 }
1246 }
1247
1248 if (urb == NULL) {
1249 dev_dbg(&port->dev, "%s - no more free urbs\n", __func__);
1250 goto exit;
1251 }
1252
1253 if (urb->transfer_buffer == NULL) {
1254 urb->transfer_buffer = kmalloc(URB_TRANSFER_BUFFER_SIZE,
1255 GFP_ATOMIC);
1256 if (!urb->transfer_buffer)
1257 goto exit;
1258 }
1259 transfer_size = min(count, URB_TRANSFER_BUFFER_SIZE);
1260
1261 memcpy(urb->transfer_buffer, current_position, transfer_size);
1262 usb_serial_debug_data(&port->dev, __func__, transfer_size,
1263 urb->transfer_buffer);
1264
1265
1266 usb_fill_bulk_urb(urb, serial->dev,
1267 usb_sndbulkpipe(serial->dev,
1268 port->bulk_out_endpointAddress),
1269 urb->transfer_buffer, transfer_size,
1270 mos7720_bulk_out_data_callback, mos7720_port);
1271
1272
1273 status = usb_submit_urb(urb, GFP_ATOMIC);
1274 if (status) {
1275 dev_err_console(port, "%s - usb_submit_urb(write bulk) failed "
1276 "with status = %d\n", __func__, status);
1277 bytes_sent = status;
1278 goto exit;
1279 }
1280 bytes_sent = transfer_size;
1281
1282exit:
1283 return bytes_sent;
1284}
1285
1286static void mos7720_throttle(struct tty_struct *tty)
1287{
1288 struct usb_serial_port *port = tty->driver_data;
1289 struct moschip_port *mos7720_port;
1290 int status;
1291
1292 mos7720_port = usb_get_serial_port_data(port);
1293
1294 if (mos7720_port == NULL)
1295 return;
1296
1297 if (!mos7720_port->open) {
1298 dev_dbg(&port->dev, "%s - port not opened\n", __func__);
1299 return;
1300 }
1301
1302
1303 if (I_IXOFF(tty)) {
1304 unsigned char stop_char = STOP_CHAR(tty);
1305 status = mos7720_write(tty, port, &stop_char, 1);
1306 if (status <= 0)
1307 return;
1308 }
1309
1310
1311 if (C_CRTSCTS(tty)) {
1312 mos7720_port->shadowMCR &= ~UART_MCR_RTS;
1313 write_mos_reg(port->serial, port->port_number, MOS7720_MCR,
1314 mos7720_port->shadowMCR);
1315 }
1316}
1317
1318static void mos7720_unthrottle(struct tty_struct *tty)
1319{
1320 struct usb_serial_port *port = tty->driver_data;
1321 struct moschip_port *mos7720_port = usb_get_serial_port_data(port);
1322 int status;
1323
1324 if (mos7720_port == NULL)
1325 return;
1326
1327 if (!mos7720_port->open) {
1328 dev_dbg(&port->dev, "%s - port not opened\n", __func__);
1329 return;
1330 }
1331
1332
1333 if (I_IXOFF(tty)) {
1334 unsigned char start_char = START_CHAR(tty);
1335 status = mos7720_write(tty, port, &start_char, 1);
1336 if (status <= 0)
1337 return;
1338 }
1339
1340
1341 if (C_CRTSCTS(tty)) {
1342 mos7720_port->shadowMCR |= UART_MCR_RTS;
1343 write_mos_reg(port->serial, port->port_number, MOS7720_MCR,
1344 mos7720_port->shadowMCR);
1345 }
1346}
1347
1348
1349static int set_higher_rates(struct moschip_port *mos7720_port,
1350 unsigned int baud)
1351{
1352 struct usb_serial_port *port;
1353 struct usb_serial *serial;
1354 int port_number;
1355 enum mos_regs sp_reg;
1356 if (mos7720_port == NULL)
1357 return -EINVAL;
1358
1359 port = mos7720_port->port;
1360 serial = port->serial;
1361
1362
1363
1364
1365 dev_dbg(&port->dev, "Sending Setting Commands ..........\n");
1366 port_number = port->port_number;
1367
1368 write_mos_reg(serial, port_number, MOS7720_IER, 0x00);
1369 write_mos_reg(serial, port_number, MOS7720_FCR, 0x00);
1370 write_mos_reg(serial, port_number, MOS7720_FCR, 0xcf);
1371 mos7720_port->shadowMCR = 0x0b;
1372 write_mos_reg(serial, port_number, MOS7720_MCR,
1373 mos7720_port->shadowMCR);
1374 write_mos_reg(serial, dummy, MOS7720_SP_CONTROL_REG, 0x00);
1375
1376
1377
1378
1379
1380 if (port_number == 0)
1381 sp_reg = MOS7720_SP1_REG;
1382 else
1383 sp_reg = MOS7720_SP2_REG;
1384 write_mos_reg(serial, dummy, sp_reg, baud * 0x10);
1385 write_mos_reg(serial, dummy, MOS7720_SP_CONTROL_REG, 0x03);
1386 mos7720_port->shadowMCR = 0x2b;
1387 write_mos_reg(serial, port_number, MOS7720_MCR,
1388 mos7720_port->shadowMCR);
1389
1390
1391
1392
1393 mos7720_port->shadowLCR = mos7720_port->shadowLCR | UART_LCR_DLAB;
1394 write_mos_reg(serial, port_number, MOS7720_LCR,
1395 mos7720_port->shadowLCR);
1396 write_mos_reg(serial, port_number, MOS7720_DLL, 0x01);
1397 write_mos_reg(serial, port_number, MOS7720_DLM, 0x00);
1398 mos7720_port->shadowLCR = mos7720_port->shadowLCR & ~UART_LCR_DLAB;
1399 write_mos_reg(serial, port_number, MOS7720_LCR,
1400 mos7720_port->shadowLCR);
1401
1402 return 0;
1403}
1404
1405
1406struct divisor_table_entry {
1407 __u32 baudrate;
1408 __u16 divisor;
1409};
1410
1411
1412
1413
1414static struct divisor_table_entry divisor_table[] = {
1415 { 50, 2304},
1416 { 110, 1047},
1417 { 134, 857},
1418 { 150, 768},
1419 { 300, 384},
1420 { 600, 192},
1421 { 1200, 96},
1422 { 1800, 64},
1423 { 2400, 48},
1424 { 4800, 24},
1425 { 7200, 16},
1426 { 9600, 12},
1427 { 19200, 6},
1428 { 38400, 3},
1429 { 57600, 2},
1430 { 115200, 1},
1431};
1432
1433
1434
1435
1436
1437
1438static int calc_baud_rate_divisor(struct usb_serial_port *port, int baudrate, int *divisor)
1439{
1440 int i;
1441 __u16 custom;
1442 __u16 round1;
1443 __u16 round;
1444
1445
1446 dev_dbg(&port->dev, "%s - %d\n", __func__, baudrate);
1447
1448 for (i = 0; i < ARRAY_SIZE(divisor_table); i++) {
1449 if (divisor_table[i].baudrate == baudrate) {
1450 *divisor = divisor_table[i].divisor;
1451 return 0;
1452 }
1453 }
1454
1455
1456
1457 if (baudrate > 75 && baudrate < 230400) {
1458
1459 custom = (__u16)(230400L / baudrate);
1460
1461
1462 round1 = (__u16)(2304000L / baudrate);
1463 round = (__u16)(round1 - (custom * 10));
1464 if (round > 4)
1465 custom++;
1466 *divisor = custom;
1467
1468 dev_dbg(&port->dev, "Baud %d = %d\n", baudrate, custom);
1469 return 0;
1470 }
1471
1472 dev_dbg(&port->dev, "Baud calculation Failed...\n");
1473 return -EINVAL;
1474}
1475
1476
1477
1478
1479
1480
1481static int send_cmd_write_baud_rate(struct moschip_port *mos7720_port,
1482 int baudrate)
1483{
1484 struct usb_serial_port *port;
1485 struct usb_serial *serial;
1486 int divisor;
1487 int status;
1488 unsigned char number;
1489
1490 if (mos7720_port == NULL)
1491 return -1;
1492
1493 port = mos7720_port->port;
1494 serial = port->serial;
1495
1496 number = port->port_number;
1497 dev_dbg(&port->dev, "%s - baud = %d\n", __func__, baudrate);
1498
1499
1500 status = calc_baud_rate_divisor(port, baudrate, &divisor);
1501 if (status) {
1502 dev_err(&port->dev, "%s - bad baud rate\n", __func__);
1503 return status;
1504 }
1505
1506
1507 mos7720_port->shadowLCR = mos7720_port->shadowLCR | UART_LCR_DLAB;
1508 write_mos_reg(serial, number, MOS7720_LCR, mos7720_port->shadowLCR);
1509
1510
1511 write_mos_reg(serial, number, MOS7720_DLL, (__u8)(divisor & 0xff));
1512 write_mos_reg(serial, number, MOS7720_DLM,
1513 (__u8)((divisor & 0xff00) >> 8));
1514
1515
1516 mos7720_port->shadowLCR = mos7720_port->shadowLCR & ~UART_LCR_DLAB;
1517 write_mos_reg(serial, number, MOS7720_LCR, mos7720_port->shadowLCR);
1518
1519 return status;
1520}
1521
1522
1523
1524
1525
1526
1527static void change_port_settings(struct tty_struct *tty,
1528 struct moschip_port *mos7720_port,
1529 struct ktermios *old_termios)
1530{
1531 struct usb_serial_port *port;
1532 struct usb_serial *serial;
1533 int baud;
1534 unsigned cflag;
1535 unsigned iflag;
1536 __u8 mask = 0xff;
1537 __u8 lData;
1538 __u8 lParity;
1539 __u8 lStop;
1540 int status;
1541 int port_number;
1542
1543 if (mos7720_port == NULL)
1544 return ;
1545
1546 port = mos7720_port->port;
1547 serial = port->serial;
1548 port_number = port->port_number;
1549
1550 if (!mos7720_port->open) {
1551 dev_dbg(&port->dev, "%s - port not opened\n", __func__);
1552 return;
1553 }
1554
1555 lData = UART_LCR_WLEN8;
1556 lStop = 0x00;
1557 lParity = 0x00;
1558
1559 cflag = tty->termios.c_cflag;
1560 iflag = tty->termios.c_iflag;
1561
1562
1563 switch (cflag & CSIZE) {
1564 case CS5:
1565 lData = UART_LCR_WLEN5;
1566 mask = 0x1f;
1567 break;
1568
1569 case CS6:
1570 lData = UART_LCR_WLEN6;
1571 mask = 0x3f;
1572 break;
1573
1574 case CS7:
1575 lData = UART_LCR_WLEN7;
1576 mask = 0x7f;
1577 break;
1578 default:
1579 case CS8:
1580 lData = UART_LCR_WLEN8;
1581 break;
1582 }
1583
1584
1585 if (cflag & PARENB) {
1586 if (cflag & PARODD) {
1587 lParity = UART_LCR_PARITY;
1588 dev_dbg(&port->dev, "%s - parity = odd\n", __func__);
1589 } else {
1590 lParity = (UART_LCR_EPAR | UART_LCR_PARITY);
1591 dev_dbg(&port->dev, "%s - parity = even\n", __func__);
1592 }
1593
1594 } else {
1595 dev_dbg(&port->dev, "%s - parity = none\n", __func__);
1596 }
1597
1598 if (cflag & CMSPAR)
1599 lParity = lParity | 0x20;
1600
1601
1602 if (cflag & CSTOPB) {
1603 lStop = UART_LCR_STOP;
1604 dev_dbg(&port->dev, "%s - stop bits = 2\n", __func__);
1605 } else {
1606 lStop = 0x00;
1607 dev_dbg(&port->dev, "%s - stop bits = 1\n", __func__);
1608 }
1609
1610#define LCR_BITS_MASK 0x03
1611#define LCR_STOP_MASK 0x04
1612#define LCR_PAR_MASK 0x38
1613
1614
1615 mos7720_port->shadowLCR &=
1616 ~(LCR_BITS_MASK | LCR_STOP_MASK | LCR_PAR_MASK);
1617 mos7720_port->shadowLCR |= (lData | lParity | lStop);
1618
1619
1620
1621 write_mos_reg(serial, port_number, MOS7720_IER, 0x00);
1622 write_mos_reg(serial, port_number, MOS7720_FCR, 0x00);
1623 write_mos_reg(serial, port_number, MOS7720_FCR, 0xcf);
1624
1625
1626 write_mos_reg(serial, port_number, MOS7720_LCR,
1627 mos7720_port->shadowLCR);
1628 mos7720_port->shadowMCR = 0x0b;
1629 write_mos_reg(serial, port_number, MOS7720_MCR,
1630 mos7720_port->shadowMCR);
1631
1632
1633 mos7720_port->shadowMCR = UART_MCR_OUT2;
1634 if (cflag & CBAUD)
1635 mos7720_port->shadowMCR |= (UART_MCR_DTR | UART_MCR_RTS);
1636
1637 if (cflag & CRTSCTS) {
1638 mos7720_port->shadowMCR |= (UART_MCR_XONANY);
1639
1640
1641 if (port_number)
1642 write_mos_reg(serial, dummy, MOS7720_SP_CONTROL_REG,
1643 0x01);
1644 else
1645 write_mos_reg(serial, dummy, MOS7720_SP_CONTROL_REG,
1646 0x02);
1647
1648 } else
1649 mos7720_port->shadowMCR &= ~(UART_MCR_XONANY);
1650
1651 write_mos_reg(serial, port_number, MOS7720_MCR,
1652 mos7720_port->shadowMCR);
1653
1654
1655 baud = tty_get_baud_rate(tty);
1656 if (!baud) {
1657
1658 dev_dbg(&port->dev, "Picked default baud...\n");
1659 baud = 9600;
1660 }
1661
1662 if (baud >= 230400) {
1663 set_higher_rates(mos7720_port, baud);
1664
1665 write_mos_reg(serial, port_number, MOS7720_IER, 0x0c);
1666 return;
1667 }
1668
1669 dev_dbg(&port->dev, "%s - baud rate = %d\n", __func__, baud);
1670 status = send_cmd_write_baud_rate(mos7720_port, baud);
1671
1672
1673 if (cflag & CBAUD)
1674 tty_encode_baud_rate(tty, baud, baud);
1675
1676 write_mos_reg(serial, port_number, MOS7720_IER, 0x0c);
1677
1678 if (port->read_urb->status != -EINPROGRESS) {
1679 status = usb_submit_urb(port->read_urb, GFP_KERNEL);
1680 if (status)
1681 dev_dbg(&port->dev, "usb_submit_urb(read bulk) failed, status = %d\n", status);
1682 }
1683}
1684
1685
1686
1687
1688
1689
1690static void mos7720_set_termios(struct tty_struct *tty,
1691 struct usb_serial_port *port, struct ktermios *old_termios)
1692{
1693 int status;
1694 unsigned int cflag;
1695 struct usb_serial *serial;
1696 struct moschip_port *mos7720_port;
1697
1698 serial = port->serial;
1699
1700 mos7720_port = usb_get_serial_port_data(port);
1701
1702 if (mos7720_port == NULL)
1703 return;
1704
1705 if (!mos7720_port->open) {
1706 dev_dbg(&port->dev, "%s - port not opened\n", __func__);
1707 return;
1708 }
1709
1710 dev_dbg(&port->dev, "setting termios - ASPIRE\n");
1711
1712 cflag = tty->termios.c_cflag;
1713
1714 dev_dbg(&port->dev, "%s - cflag %08x iflag %08x\n", __func__,
1715 tty->termios.c_cflag, RELEVANT_IFLAG(tty->termios.c_iflag));
1716
1717 dev_dbg(&port->dev, "%s - old cflag %08x old iflag %08x\n", __func__,
1718 old_termios->c_cflag, RELEVANT_IFLAG(old_termios->c_iflag));
1719
1720
1721 change_port_settings(tty, mos7720_port, old_termios);
1722
1723 if (port->read_urb->status != -EINPROGRESS) {
1724 status = usb_submit_urb(port->read_urb, GFP_KERNEL);
1725 if (status)
1726 dev_dbg(&port->dev, "usb_submit_urb(read bulk) failed, status = %d\n", status);
1727 }
1728}
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740static int get_lsr_info(struct tty_struct *tty,
1741 struct moschip_port *mos7720_port, unsigned int __user *value)
1742{
1743 struct usb_serial_port *port = tty->driver_data;
1744 unsigned int result = 0;
1745 unsigned char data = 0;
1746 int port_number = port->port_number;
1747 int count;
1748
1749 count = mos7720_chars_in_buffer(tty);
1750 if (count == 0) {
1751 read_mos_reg(port->serial, port_number, MOS7720_LSR, &data);
1752 if ((data & (UART_LSR_TEMT | UART_LSR_THRE))
1753 == (UART_LSR_TEMT | UART_LSR_THRE)) {
1754 dev_dbg(&port->dev, "%s -- Empty\n", __func__);
1755 result = TIOCSER_TEMT;
1756 }
1757 }
1758 if (copy_to_user(value, &result, sizeof(int)))
1759 return -EFAULT;
1760 return 0;
1761}
1762
1763static int mos7720_tiocmget(struct tty_struct *tty)
1764{
1765 struct usb_serial_port *port = tty->driver_data;
1766 struct moschip_port *mos7720_port = usb_get_serial_port_data(port);
1767 unsigned int result = 0;
1768 unsigned int mcr ;
1769 unsigned int msr ;
1770
1771 mcr = mos7720_port->shadowMCR;
1772 msr = mos7720_port->shadowMSR;
1773
1774 result = ((mcr & UART_MCR_DTR) ? TIOCM_DTR : 0)
1775 | ((mcr & UART_MCR_RTS) ? TIOCM_RTS : 0)
1776 | ((msr & UART_MSR_CTS) ? TIOCM_CTS : 0)
1777 | ((msr & UART_MSR_DCD) ? TIOCM_CAR : 0)
1778 | ((msr & UART_MSR_RI) ? TIOCM_RI : 0)
1779 | ((msr & UART_MSR_DSR) ? TIOCM_DSR : 0);
1780
1781 return result;
1782}
1783
1784static int mos7720_tiocmset(struct tty_struct *tty,
1785 unsigned int set, unsigned int clear)
1786{
1787 struct usb_serial_port *port = tty->driver_data;
1788 struct moschip_port *mos7720_port = usb_get_serial_port_data(port);
1789 unsigned int mcr ;
1790
1791 mcr = mos7720_port->shadowMCR;
1792
1793 if (set & TIOCM_RTS)
1794 mcr |= UART_MCR_RTS;
1795 if (set & TIOCM_DTR)
1796 mcr |= UART_MCR_DTR;
1797 if (set & TIOCM_LOOP)
1798 mcr |= UART_MCR_LOOP;
1799
1800 if (clear & TIOCM_RTS)
1801 mcr &= ~UART_MCR_RTS;
1802 if (clear & TIOCM_DTR)
1803 mcr &= ~UART_MCR_DTR;
1804 if (clear & TIOCM_LOOP)
1805 mcr &= ~UART_MCR_LOOP;
1806
1807 mos7720_port->shadowMCR = mcr;
1808 write_mos_reg(port->serial, port->port_number, MOS7720_MCR,
1809 mos7720_port->shadowMCR);
1810
1811 return 0;
1812}
1813
1814static int set_modem_info(struct moschip_port *mos7720_port, unsigned int cmd,
1815 unsigned int __user *value)
1816{
1817 unsigned int mcr;
1818 unsigned int arg;
1819
1820 struct usb_serial_port *port;
1821
1822 if (mos7720_port == NULL)
1823 return -1;
1824
1825 port = (struct usb_serial_port *)mos7720_port->port;
1826 mcr = mos7720_port->shadowMCR;
1827
1828 if (copy_from_user(&arg, value, sizeof(int)))
1829 return -EFAULT;
1830
1831 switch (cmd) {
1832 case TIOCMBIS:
1833 if (arg & TIOCM_RTS)
1834 mcr |= UART_MCR_RTS;
1835 if (arg & TIOCM_DTR)
1836 mcr |= UART_MCR_RTS;
1837 if (arg & TIOCM_LOOP)
1838 mcr |= UART_MCR_LOOP;
1839 break;
1840
1841 case TIOCMBIC:
1842 if (arg & TIOCM_RTS)
1843 mcr &= ~UART_MCR_RTS;
1844 if (arg & TIOCM_DTR)
1845 mcr &= ~UART_MCR_RTS;
1846 if (arg & TIOCM_LOOP)
1847 mcr &= ~UART_MCR_LOOP;
1848 break;
1849
1850 }
1851
1852 mos7720_port->shadowMCR = mcr;
1853 write_mos_reg(port->serial, port->port_number, MOS7720_MCR,
1854 mos7720_port->shadowMCR);
1855
1856 return 0;
1857}
1858
1859static int get_serial_info(struct moschip_port *mos7720_port,
1860 struct serial_struct __user *retinfo)
1861{
1862 struct serial_struct tmp;
1863
1864 if (!retinfo)
1865 return -EFAULT;
1866
1867 memset(&tmp, 0, sizeof(tmp));
1868
1869 tmp.type = PORT_16550A;
1870 tmp.line = mos7720_port->port->minor;
1871 tmp.port = mos7720_port->port->port_number;
1872 tmp.irq = 0;
1873 tmp.flags = ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ;
1874 tmp.xmit_fifo_size = NUM_URBS * URB_TRANSFER_BUFFER_SIZE;
1875 tmp.baud_base = 9600;
1876 tmp.close_delay = 5*HZ;
1877 tmp.closing_wait = 30*HZ;
1878
1879 if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
1880 return -EFAULT;
1881 return 0;
1882}
1883
1884static int mos7720_ioctl(struct tty_struct *tty,
1885 unsigned int cmd, unsigned long arg)
1886{
1887 struct usb_serial_port *port = tty->driver_data;
1888 struct moschip_port *mos7720_port;
1889
1890 mos7720_port = usb_get_serial_port_data(port);
1891 if (mos7720_port == NULL)
1892 return -ENODEV;
1893
1894 switch (cmd) {
1895 case TIOCSERGETLSR:
1896 dev_dbg(&port->dev, "%s TIOCSERGETLSR\n", __func__);
1897 return get_lsr_info(tty, mos7720_port,
1898 (unsigned int __user *)arg);
1899
1900
1901 case TIOCMBIS:
1902 case TIOCMBIC:
1903 dev_dbg(&port->dev, "%s TIOCMSET/TIOCMBIC/TIOCMSET\n", __func__);
1904 return set_modem_info(mos7720_port, cmd,
1905 (unsigned int __user *)arg);
1906
1907 case TIOCGSERIAL:
1908 dev_dbg(&port->dev, "%s TIOCGSERIAL\n", __func__);
1909 return get_serial_info(mos7720_port,
1910 (struct serial_struct __user *)arg);
1911 }
1912
1913 return -ENOIOCTLCMD;
1914}
1915
1916static int mos7720_startup(struct usb_serial *serial)
1917{
1918 struct usb_device *dev;
1919 char data;
1920 u16 product;
1921 int ret_val;
1922
1923 product = le16_to_cpu(serial->dev->descriptor.idProduct);
1924 dev = serial->dev;
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937 if (product == MOSCHIP_DEVICE_ID_7715) {
1938 struct usb_serial_port *tmp = serial->port[0];
1939 serial->port[0] = serial->port[1];
1940 serial->port[1] = tmp;
1941 serial->port[0]->interrupt_in_urb = tmp->interrupt_in_urb;
1942 serial->port[0]->interrupt_in_buffer = tmp->interrupt_in_buffer;
1943 serial->port[0]->interrupt_in_endpointAddress =
1944 tmp->interrupt_in_endpointAddress;
1945 serial->port[1]->interrupt_in_urb = NULL;
1946 serial->port[1]->interrupt_in_buffer = NULL;
1947 }
1948
1949
1950 usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
1951 (__u8)0x03, 0x00, 0x01, 0x00, NULL, 0x00, 5000);
1952
1953
1954 ret_val = usb_submit_urb(serial->port[0]->interrupt_in_urb, GFP_KERNEL);
1955 if (ret_val)
1956 dev_err(&dev->dev,
1957 "%s - Error %d submitting control urb\n",
1958 __func__, ret_val);
1959
1960#ifdef CONFIG_USB_SERIAL_MOS7715_PARPORT
1961 if (product == MOSCHIP_DEVICE_ID_7715) {
1962 ret_val = mos7715_parport_init(serial);
1963 if (ret_val < 0)
1964 return ret_val;
1965 }
1966#endif
1967
1968 read_mos_reg(serial, 0, MOS7720_LSR, &data);
1969 dev_dbg(&dev->dev, "LSR:%x\n", data);
1970
1971 return 0;
1972}
1973
1974static void mos7720_release(struct usb_serial *serial)
1975{
1976#ifdef CONFIG_USB_SERIAL_MOS7715_PARPORT
1977
1978
1979 if (le16_to_cpu(serial->dev->descriptor.idProduct)
1980 == MOSCHIP_DEVICE_ID_7715) {
1981 struct urbtracker *urbtrack;
1982 unsigned long flags;
1983 struct mos7715_parport *mos_parport =
1984 usb_get_serial_data(serial);
1985
1986
1987 spin_lock(&release_lock);
1988 mos_parport->pp->private_data = NULL;
1989 spin_unlock(&release_lock);
1990
1991
1992 if (mos_parport->msg_pending)
1993 wait_for_completion_timeout(&mos_parport->syncmsg_compl,
1994 msecs_to_jiffies(MOS_WDR_TIMEOUT));
1995
1996 parport_remove_port(mos_parport->pp);
1997 usb_set_serial_data(serial, NULL);
1998 mos_parport->serial = NULL;
1999
2000
2001 tasklet_kill(&mos_parport->urb_tasklet);
2002
2003
2004 spin_lock_irqsave(&mos_parport->listlock, flags);
2005 list_for_each_entry(urbtrack,
2006 &mos_parport->active_urbs,
2007 urblist_entry)
2008 usb_unlink_urb(urbtrack->urb);
2009 spin_unlock_irqrestore(&mos_parport->listlock, flags);
2010 parport_del_port(mos_parport->pp);
2011
2012 kref_put(&mos_parport->ref_count, destroy_mos_parport);
2013 }
2014#endif
2015}
2016
2017static int mos7720_port_probe(struct usb_serial_port *port)
2018{
2019 struct moschip_port *mos7720_port;
2020
2021 mos7720_port = kzalloc(sizeof(*mos7720_port), GFP_KERNEL);
2022 if (!mos7720_port)
2023 return -ENOMEM;
2024
2025
2026
2027
2028 port->interrupt_in_endpointAddress =
2029 port->serial->port[0]->interrupt_in_endpointAddress;
2030 mos7720_port->port = port;
2031
2032 usb_set_serial_port_data(port, mos7720_port);
2033
2034 return 0;
2035}
2036
2037static int mos7720_port_remove(struct usb_serial_port *port)
2038{
2039 struct moschip_port *mos7720_port;
2040
2041 mos7720_port = usb_get_serial_port_data(port);
2042 kfree(mos7720_port);
2043
2044 return 0;
2045}
2046
2047static struct usb_serial_driver moschip7720_2port_driver = {
2048 .driver = {
2049 .owner = THIS_MODULE,
2050 .name = "moschip7720",
2051 },
2052 .description = "Moschip 2 port adapter",
2053 .id_table = id_table,
2054 .calc_num_ports = mos77xx_calc_num_ports,
2055 .open = mos7720_open,
2056 .close = mos7720_close,
2057 .throttle = mos7720_throttle,
2058 .unthrottle = mos7720_unthrottle,
2059 .probe = mos77xx_probe,
2060 .attach = mos7720_startup,
2061 .release = mos7720_release,
2062 .port_probe = mos7720_port_probe,
2063 .port_remove = mos7720_port_remove,
2064 .ioctl = mos7720_ioctl,
2065 .tiocmget = mos7720_tiocmget,
2066 .tiocmset = mos7720_tiocmset,
2067 .set_termios = mos7720_set_termios,
2068 .write = mos7720_write,
2069 .write_room = mos7720_write_room,
2070 .chars_in_buffer = mos7720_chars_in_buffer,
2071 .break_ctl = mos7720_break,
2072 .read_bulk_callback = mos7720_bulk_in_callback,
2073 .read_int_callback = NULL
2074};
2075
2076static struct usb_serial_driver * const serial_drivers[] = {
2077 &moschip7720_2port_driver, NULL
2078};
2079
2080module_usb_serial_driver(serial_drivers, id_table);
2081
2082MODULE_AUTHOR(DRIVER_AUTHOR);
2083MODULE_DESCRIPTION(DRIVER_DESC);
2084MODULE_LICENSE("GPL");
2085