]> Pileus Git - ~andy/linux/blob - drivers/staging/gdm724x/gdm_mux.c
Merge branch 'i2c/for-current' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa...
[~andy/linux] / drivers / staging / gdm724x / gdm_mux.c
1 /*
2  * Copyright (c) 2012 GCT Semiconductor, Inc. All rights reserved.
3  *
4  * This software is licensed under the terms of the GNU General Public
5  * License version 2, as published by the Free Software Foundation, and
6  * may be copied, distributed, and modified under those terms.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  */
13
14 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
15
16 #include <linux/module.h>
17 #include <linux/kernel.h>
18 #include <linux/usb.h>
19 #include <linux/errno.h>
20 #include <linux/init.h>
21 #include <linux/tty.h>
22 #include <linux/tty_driver.h>
23 #include <linux/tty_flip.h>
24 #include <linux/slab.h>
25 #include <linux/usb/cdc.h>
26
27 #include "gdm_mux.h"
28
29 static struct workqueue_struct *mux_rx_wq;
30
31 static u16 packet_type[TTY_MAX_COUNT] = {0xF011, 0xF010};
32
33 #define USB_DEVICE_CDC_DATA(vid, pid) \
34         .match_flags = \
35                 USB_DEVICE_ID_MATCH_DEVICE |\
36                 USB_DEVICE_ID_MATCH_INT_CLASS |\
37                 USB_DEVICE_ID_MATCH_INT_SUBCLASS,\
38         .idVendor = vid,\
39         .idProduct = pid,\
40         .bInterfaceClass = USB_CLASS_COMM,\
41         .bInterfaceSubClass = USB_CDC_SUBCLASS_ACM
42
43 static const struct usb_device_id id_table[] = {
44         { USB_DEVICE_CDC_DATA(0x1076, 0x8000) }, /* GCT GDM7240 */
45         { USB_DEVICE_CDC_DATA(0x1076, 0x8f00) }, /* GCT GDM7243 */
46         { USB_DEVICE_CDC_DATA(0x1076, 0x9000) }, /* GCT GDM7243 */
47         { USB_DEVICE_CDC_DATA(0x1d74, 0x2300) }, /* LGIT Phoenix */
48         {}
49 };
50
51
52 MODULE_DEVICE_TABLE(usb, id_table);
53
54 static int packet_type_to_index(u16 packetType)
55 {
56         int i;
57
58         for (i = 0; i < TTY_MAX_COUNT; i++) {
59                 if (packet_type[i] == packetType)
60                         return i;
61         }
62
63         return -1;
64 }
65
66 static struct mux_tx *alloc_mux_tx(int len)
67 {
68         struct mux_tx *t = NULL;
69
70         t = kzalloc(sizeof(struct mux_tx), GFP_ATOMIC);
71         if (!t)
72                 return NULL;
73
74         t->urb = usb_alloc_urb(0, GFP_ATOMIC);
75         t->buf = kmalloc(MUX_TX_MAX_SIZE, GFP_ATOMIC);
76         if (!t->urb || !t->buf) {
77                 usb_free_urb(t->urb);
78                 kfree(t->buf);
79                 kfree(t);
80                 return NULL;
81         }
82
83         return t;
84 }
85
86 static void free_mux_tx(struct mux_tx *t)
87 {
88         if (t) {
89                 usb_free_urb(t->urb);
90                 kfree(t->buf);
91                 kfree(t);
92         }
93 }
94
95 static struct mux_rx *alloc_mux_rx(void)
96 {
97         struct mux_rx *r = NULL;
98
99         r = kzalloc(sizeof(struct mux_rx), GFP_KERNEL);
100         if (!r)
101                 return NULL;
102
103         r->urb = usb_alloc_urb(0, GFP_KERNEL);
104         r->buf = kmalloc(MUX_RX_MAX_SIZE, GFP_KERNEL);
105         if (!r->urb || !r->buf) {
106                 usb_free_urb(r->urb);
107                 kfree(r->buf);
108                 kfree(r);
109                 return NULL;
110         }
111
112         return r;
113 }
114
115 static void free_mux_rx(struct mux_rx *r)
116 {
117         if (r) {
118                 usb_free_urb(r->urb);
119                 kfree(r->buf);
120                 kfree(r);
121         }
122 }
123
124 static struct mux_rx *get_rx_struct(struct rx_cxt *rx)
125 {
126         struct mux_rx *r;
127         unsigned long flags;
128
129         spin_lock_irqsave(&rx->free_list_lock, flags);
130
131         if (list_empty(&rx->rx_free_list)) {
132                 spin_unlock_irqrestore(&rx->free_list_lock, flags);
133                 return NULL;
134         }
135
136         r = list_entry(rx->rx_free_list.prev, struct mux_rx, free_list);
137         list_del(&r->free_list);
138
139         spin_unlock_irqrestore(&rx->free_list_lock, flags);
140
141         return r;
142 }
143
144 static void put_rx_struct(struct rx_cxt *rx, struct mux_rx *r)
145 {
146         unsigned long flags;
147
148         spin_lock_irqsave(&rx->free_list_lock, flags);
149         list_add_tail(&r->free_list, &rx->rx_free_list);
150         spin_unlock_irqrestore(&rx->free_list_lock, flags);
151 }
152
153
154 static int up_to_host(struct mux_rx *r)
155 {
156         struct mux_dev *mux_dev = (struct mux_dev *)r->mux_dev;
157         struct mux_pkt_header *mux_header;
158         unsigned int start_flag;
159         unsigned int payload_size;
160         unsigned short packet_type;
161         int dummy_cnt;
162         u32 packet_size_sum = r->offset;
163         int index;
164         int ret = TO_HOST_INVALID_PACKET;
165         int len = r->len;
166
167         while (1) {
168                 mux_header = (struct mux_pkt_header *)(r->buf + packet_size_sum);
169                 start_flag = __le32_to_cpu(mux_header->start_flag);
170                 payload_size = __le32_to_cpu(mux_header->payload_size);
171                 packet_type = __le16_to_cpu(mux_header->packet_type);
172
173                 if (start_flag != START_FLAG) {
174                         pr_err("invalid START_FLAG %x\n", start_flag);
175                         break;
176                 }
177
178                 dummy_cnt = ALIGN(MUX_HEADER_SIZE + payload_size, 4);
179
180                 if (len - packet_size_sum <
181                         MUX_HEADER_SIZE + payload_size + dummy_cnt) {
182                         pr_err("invalid payload : %d %d %04x\n",
183                                payload_size, len, packet_type);
184                         break;
185                 }
186
187                 index = packet_type_to_index(packet_type);
188                 if (index < 0) {
189                         pr_err("invalid index %d\n", index);
190                         break;
191                 }
192
193                 ret = r->callback(mux_header->data,
194                                 payload_size,
195                                 index,
196                                 mux_dev->tty_dev,
197                                 RECV_PACKET_PROCESS_CONTINUE
198                                 );
199                 if (ret == TO_HOST_BUFFER_REQUEST_FAIL) {
200                         r->offset += packet_size_sum;
201                         break;
202                 }
203
204                 packet_size_sum += MUX_HEADER_SIZE + payload_size + dummy_cnt;
205                 if (len - packet_size_sum <= MUX_HEADER_SIZE + 2) {
206                         ret = r->callback(NULL,
207                                         0,
208                                         index,
209                                         mux_dev->tty_dev,
210                                         RECV_PACKET_PROCESS_COMPLETE
211                                         );
212                         break;
213                 }
214         }
215
216         return ret;
217 }
218
219 static void do_rx(struct work_struct *work)
220 {
221         struct mux_dev *mux_dev =
222                 container_of(work, struct mux_dev , work_rx.work);
223         struct mux_rx *r;
224         struct rx_cxt *rx = (struct rx_cxt *)&mux_dev->rx;
225         unsigned long flags;
226         int ret = 0;
227
228         while (1) {
229                 spin_lock_irqsave(&rx->to_host_lock, flags);
230                 if (list_empty(&rx->to_host_list)) {
231                         spin_unlock_irqrestore(&rx->to_host_lock, flags);
232                         break;
233                 }
234                 r = list_entry(rx->to_host_list.next, struct mux_rx, to_host_list);
235                 list_del(&r->to_host_list);
236                 spin_unlock_irqrestore(&rx->to_host_lock, flags);
237
238                 ret = up_to_host(r);
239                 if (ret == TO_HOST_BUFFER_REQUEST_FAIL)
240                         pr_err("failed to send mux data to host\n");
241                 else
242                         put_rx_struct(rx, r);
243         }
244 }
245
246 static void remove_rx_submit_list(struct mux_rx *r, struct rx_cxt *rx)
247 {
248         unsigned long flags;
249         struct mux_rx   *r_remove, *r_remove_next;
250
251         spin_lock_irqsave(&rx->submit_list_lock, flags);
252         list_for_each_entry_safe(r_remove, r_remove_next, &rx->rx_submit_list, rx_submit_list) {
253                 if (r == r_remove)
254                         list_del(&r->rx_submit_list);
255         }
256         spin_unlock_irqrestore(&rx->submit_list_lock, flags);
257 }
258
259 static void gdm_mux_rcv_complete(struct urb *urb)
260 {
261         struct mux_rx *r = urb->context;
262         struct mux_dev *mux_dev = (struct mux_dev *)r->mux_dev;
263         struct rx_cxt *rx = &mux_dev->rx;
264         unsigned long flags;
265
266         remove_rx_submit_list(r, rx);
267
268         if (urb->status) {
269                 if (mux_dev->usb_state == PM_NORMAL)
270                         pr_err("%s: urb status error %d\n",
271                                __func__, urb->status);
272                 put_rx_struct(rx, r);
273         } else {
274                 r->len = r->urb->actual_length;
275                 spin_lock_irqsave(&rx->to_host_lock, flags);
276                 list_add_tail(&r->to_host_list, &rx->to_host_list);
277                 queue_work(mux_rx_wq, &mux_dev->work_rx.work);
278                 spin_unlock_irqrestore(&rx->to_host_lock, flags);
279         }
280 }
281
282 static int gdm_mux_recv(void *priv_dev,
283                         int (*cb)(void *data, int len, int tty_index, struct tty_dev *tty_dev, int complete)
284                         )
285 {
286         struct mux_dev *mux_dev = priv_dev;
287         struct usb_device *usbdev = mux_dev->usbdev;
288         struct mux_rx *r;
289         struct rx_cxt *rx = &mux_dev->rx;
290         unsigned long flags;
291         int ret;
292
293         if (!usbdev) {
294                 pr_err("device is disconnected\n");
295                 return -ENODEV;
296         }
297
298         r = get_rx_struct(rx);
299         if (!r) {
300                 pr_err("get_rx_struct fail\n");
301                 return -ENOMEM;
302         }
303
304         r->offset = 0;
305         r->mux_dev = (void *)mux_dev;
306         r->callback = cb;
307         mux_dev->rx_cb = cb;
308
309         usb_fill_bulk_urb(r->urb,
310                           usbdev,
311                           usb_rcvbulkpipe(usbdev, 0x86),
312                           r->buf,
313                           MUX_RX_MAX_SIZE,
314                           gdm_mux_rcv_complete,
315                           r);
316
317         spin_lock_irqsave(&rx->submit_list_lock, flags);
318         list_add_tail(&r->rx_submit_list, &rx->rx_submit_list);
319         spin_unlock_irqrestore(&rx->submit_list_lock, flags);
320
321         ret = usb_submit_urb(r->urb, GFP_KERNEL);
322
323         if (ret) {
324                 spin_lock_irqsave(&rx->submit_list_lock, flags);
325                 list_del(&r->rx_submit_list);
326                 spin_unlock_irqrestore(&rx->submit_list_lock, flags);
327
328                 put_rx_struct(rx, r);
329
330                 pr_err("usb_submit_urb ret=%d\n", ret);
331         }
332
333         usb_mark_last_busy(usbdev);
334
335         return ret;
336 }
337
338 static void gdm_mux_send_complete(struct urb *urb)
339 {
340         struct mux_tx *t = urb->context;
341
342         if (urb->status == -ECONNRESET) {
343                 pr_info("CONNRESET\n");
344                 free_mux_tx(t);
345                 return;
346         }
347
348         if (t->callback)
349                 t->callback(t->cb_data);
350
351         free_mux_tx(t);
352 }
353
354 static int gdm_mux_send(void *priv_dev, void *data, int len, int tty_index,
355                         void (*cb)(void *data), void *cb_data)
356 {
357         struct mux_dev *mux_dev = priv_dev;
358         struct usb_device *usbdev = mux_dev->usbdev;
359         struct mux_pkt_header *mux_header;
360         struct mux_tx *t = NULL;
361         static u32 seq_num = 1;
362         int dummy_cnt;
363         int total_len;
364         int ret;
365         unsigned long flags;
366
367         if (mux_dev->usb_state == PM_SUSPEND) {
368                 ret = usb_autopm_get_interface(mux_dev->intf);
369                 if (!ret)
370                         usb_autopm_put_interface(mux_dev->intf);
371         }
372
373         spin_lock_irqsave(&mux_dev->write_lock, flags);
374
375         dummy_cnt = ALIGN(MUX_HEADER_SIZE + len, 4);
376
377         total_len = len + MUX_HEADER_SIZE + dummy_cnt;
378
379         t = alloc_mux_tx(total_len);
380         if (!t) {
381                 pr_err("alloc_mux_tx fail\n");
382                 spin_unlock_irqrestore(&mux_dev->write_lock, flags);
383                 return -ENOMEM;
384         }
385
386         mux_header = (struct mux_pkt_header *)t->buf;
387         mux_header->start_flag = __cpu_to_le32(START_FLAG);
388         mux_header->seq_num = __cpu_to_le32(seq_num++);
389         mux_header->payload_size = __cpu_to_le32((u32)len);
390         mux_header->packet_type = __cpu_to_le16(packet_type[tty_index]);
391
392         memcpy(t->buf+MUX_HEADER_SIZE, data, len);
393         memset(t->buf+MUX_HEADER_SIZE+len, 0, dummy_cnt);
394
395         t->len = total_len;
396         t->callback = cb;
397         t->cb_data = cb_data;
398
399         usb_fill_bulk_urb(t->urb,
400                           usbdev,
401                           usb_sndbulkpipe(usbdev, 5),
402                           t->buf,
403                           total_len,
404                           gdm_mux_send_complete,
405                           t);
406
407         ret = usb_submit_urb(t->urb, GFP_ATOMIC);
408
409         spin_unlock_irqrestore(&mux_dev->write_lock, flags);
410
411         if (ret)
412                 pr_err("usb_submit_urb Error: %d\n", ret);
413
414         usb_mark_last_busy(usbdev);
415
416         return ret;
417 }
418
419 static int gdm_mux_send_control(void *priv_dev, int request, int value, void *buf, int len)
420 {
421         struct mux_dev *mux_dev = priv_dev;
422         struct usb_device *usbdev = mux_dev->usbdev;
423         int ret;
424
425         ret = usb_control_msg(usbdev,
426                               usb_sndctrlpipe(usbdev, 0),
427                               request,
428                               USB_RT_ACM,
429                               value,
430                               2,
431                               buf,
432                               len,
433                               5000
434                              );
435
436         if (ret < 0)
437                 pr_err("usb_control_msg error: %d\n", ret);
438
439         return ret < 0 ? ret : 0;
440 }
441
442 static void release_usb(struct mux_dev *mux_dev)
443 {
444         struct rx_cxt           *rx = &mux_dev->rx;
445         struct mux_rx           *r, *r_next;
446         unsigned long           flags;
447
448         cancel_delayed_work(&mux_dev->work_rx);
449
450         spin_lock_irqsave(&rx->submit_list_lock, flags);
451         list_for_each_entry_safe(r, r_next, &rx->rx_submit_list, rx_submit_list) {
452                 spin_unlock_irqrestore(&rx->submit_list_lock, flags);
453                 usb_kill_urb(r->urb);
454                 spin_lock_irqsave(&rx->submit_list_lock, flags);
455         }
456         spin_unlock_irqrestore(&rx->submit_list_lock, flags);
457
458         spin_lock_irqsave(&rx->free_list_lock, flags);
459         list_for_each_entry_safe(r, r_next, &rx->rx_free_list, free_list) {
460                 list_del(&r->free_list);
461                 free_mux_rx(r);
462         }
463         spin_unlock_irqrestore(&rx->free_list_lock, flags);
464
465         spin_lock_irqsave(&rx->to_host_lock, flags);
466         list_for_each_entry_safe(r, r_next, &rx->to_host_list, to_host_list) {
467                 if (r->mux_dev == (void *)mux_dev) {
468                         list_del(&r->to_host_list);
469                         free_mux_rx(r);
470                 }
471         }
472         spin_unlock_irqrestore(&rx->to_host_lock, flags);
473 }
474
475
476 static int init_usb(struct mux_dev *mux_dev)
477 {
478         struct mux_rx *r;
479         struct rx_cxt *rx = &mux_dev->rx;
480         int ret = 0;
481         int i;
482
483         spin_lock_init(&mux_dev->write_lock);
484         INIT_LIST_HEAD(&rx->to_host_list);
485         INIT_LIST_HEAD(&rx->rx_submit_list);
486         INIT_LIST_HEAD(&rx->rx_free_list);
487         spin_lock_init(&rx->to_host_lock);
488         spin_lock_init(&rx->submit_list_lock);
489         spin_lock_init(&rx->free_list_lock);
490
491         for (i = 0; i < MAX_ISSUE_NUM * 2; i++) {
492                 r = alloc_mux_rx();
493                 if (r == NULL) {
494                         ret = -ENOMEM;
495                         break;
496                 }
497
498                 list_add(&r->free_list, &rx->rx_free_list);
499         }
500
501         INIT_DELAYED_WORK(&mux_dev->work_rx, do_rx);
502
503         return ret;
504 }
505
506 static int gdm_mux_probe(struct usb_interface *intf, const struct usb_device_id *id)
507 {
508         struct mux_dev *mux_dev;
509         struct tty_dev *tty_dev;
510         u16 idVendor, idProduct;
511         int bInterfaceNumber;
512         int ret;
513         int i;
514         struct usb_device *usbdev = interface_to_usbdev(intf);
515         bInterfaceNumber = intf->cur_altsetting->desc.bInterfaceNumber;
516
517         idVendor = __le16_to_cpu(usbdev->descriptor.idVendor);
518         idProduct = __le16_to_cpu(usbdev->descriptor.idProduct);
519
520         pr_info("mux vid = 0x%04x pid = 0x%04x\n", idVendor, idProduct);
521
522         if (bInterfaceNumber != 2)
523                 return -ENODEV;
524
525         mux_dev = kzalloc(sizeof(struct mux_dev), GFP_KERNEL);
526         if (!mux_dev)
527                 return -ENOMEM;
528
529         tty_dev = kzalloc(sizeof(struct tty_dev), GFP_KERNEL);
530         if (!tty_dev) {
531                 ret = -ENOMEM;
532                 goto err_free_mux;
533         }
534
535         mux_dev->usbdev = usbdev;
536         mux_dev->control_intf = intf;
537
538         ret = init_usb(mux_dev);
539         if (ret)
540                 goto err_free_usb;
541
542         tty_dev->priv_dev = (void *)mux_dev;
543         tty_dev->send_func = gdm_mux_send;
544         tty_dev->recv_func = gdm_mux_recv;
545         tty_dev->send_control = gdm_mux_send_control;
546
547         ret = register_lte_tty_device(tty_dev, &intf->dev);
548         if (ret)
549                 goto err_unregister_tty;
550
551         for (i = 0; i < TTY_MAX_COUNT; i++)
552                 mux_dev->tty_dev = tty_dev;
553
554         mux_dev->intf = intf;
555         mux_dev->usb_state = PM_NORMAL;
556
557         usb_get_dev(usbdev);
558         usb_set_intfdata(intf, tty_dev);
559
560         return 0;
561
562 err_unregister_tty:
563         unregister_lte_tty_device(tty_dev);
564 err_free_usb:
565         release_usb(mux_dev);
566         kfree(tty_dev);
567 err_free_mux:
568         kfree(mux_dev);
569
570         return ret;
571 }
572
573 static void gdm_mux_disconnect(struct usb_interface *intf)
574 {
575         struct tty_dev *tty_dev;
576         struct mux_dev *mux_dev;
577         struct usb_device *usbdev = interface_to_usbdev(intf);
578
579         tty_dev = usb_get_intfdata(intf);
580
581         mux_dev = tty_dev->priv_dev;
582
583         release_usb(mux_dev);
584         unregister_lte_tty_device(tty_dev);
585
586         kfree(mux_dev);
587         kfree(tty_dev);
588
589         usb_put_dev(usbdev);
590 }
591
592 static int gdm_mux_suspend(struct usb_interface *intf, pm_message_t pm_msg)
593 {
594         struct tty_dev *tty_dev;
595         struct mux_dev *mux_dev;
596         struct rx_cxt *rx;
597         struct mux_rx *r, *r_next;
598         unsigned long flags;
599
600         tty_dev = usb_get_intfdata(intf);
601         mux_dev = tty_dev->priv_dev;
602         rx = &mux_dev->rx;
603
604         if (mux_dev->usb_state != PM_NORMAL) {
605                 pr_err("usb suspend - invalid state\n");
606                 return -1;
607         }
608
609         mux_dev->usb_state = PM_SUSPEND;
610
611
612         spin_lock_irqsave(&rx->submit_list_lock, flags);
613         list_for_each_entry_safe(r, r_next, &rx->rx_submit_list, rx_submit_list) {
614                 spin_unlock_irqrestore(&rx->submit_list_lock, flags);
615                 usb_kill_urb(r->urb);
616                 spin_lock_irqsave(&rx->submit_list_lock, flags);
617         }
618         spin_unlock_irqrestore(&rx->submit_list_lock, flags);
619
620         return 0;
621 }
622
623 static int gdm_mux_resume(struct usb_interface *intf)
624 {
625         struct tty_dev *tty_dev;
626         struct mux_dev *mux_dev;
627         u8 i;
628
629         tty_dev = usb_get_intfdata(intf);
630         mux_dev = tty_dev->priv_dev;
631
632         if (mux_dev->usb_state != PM_SUSPEND) {
633                 pr_err("usb resume - invalid state\n");
634                 return -1;
635         }
636
637         mux_dev->usb_state = PM_NORMAL;
638
639         for (i = 0; i < MAX_ISSUE_NUM; i++)
640                 gdm_mux_recv(mux_dev, mux_dev->rx_cb);
641
642         return 0;
643 }
644
645 static struct usb_driver gdm_mux_driver = {
646         .name = "gdm_mux",
647         .probe = gdm_mux_probe,
648         .disconnect = gdm_mux_disconnect,
649         .id_table = id_table,
650         .supports_autosuspend = 1,
651         .suspend = gdm_mux_suspend,
652         .resume = gdm_mux_resume,
653         .reset_resume = gdm_mux_resume,
654 };
655
656 static int __init gdm_usb_mux_init(void)
657 {
658
659         mux_rx_wq = create_workqueue("mux_rx_wq");
660         if (mux_rx_wq == NULL) {
661                 pr_err("work queue create fail\n");
662                 return -1;
663         }
664
665         register_lte_tty_driver();
666
667         return usb_register(&gdm_mux_driver);
668 }
669
670 static void __exit gdm_usb_mux_exit(void)
671 {
672         unregister_lte_tty_driver();
673
674         if (mux_rx_wq) {
675                 flush_workqueue(mux_rx_wq);
676                 destroy_workqueue(mux_rx_wq);
677         }
678
679         usb_deregister(&gdm_mux_driver);
680 }
681
682 module_init(gdm_usb_mux_init);
683 module_exit(gdm_usb_mux_exit);
684
685 MODULE_DESCRIPTION("GCT LTE TTY Device Driver");
686 MODULE_LICENSE("GPL");