blob: 3441839b680063bebae68ee1716ffd438dbe013d [file] [log] [blame]
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001/*
2 * u_sdio.c - utilities for USB gadget serial over sdio
3 *
4 * This code also borrows from drivers/usb/gadget/u_serial.c, which is
5 * Copyright (C) 2003 Al Borchers (alborchers@steinerpoint.com)
6 * Copyright (C) 2008 David Brownell
7 * Copyright (C) 2008 by Nokia Corporation
8 * Copyright (c) 2011, Code Aurora Forum. All rights reserved.
9 *
10 * This program from the Code Aurora Forum is free software; you can
11 * redistribute it and/or modify it under the GNU General Public License
12 * version 2 and only version 2 as published by the Free Software Foundation.
13 * The original work available from [kernel.org] is subject to the notice below.
14 *
15 * This software is distributed under the terms of the GNU General
16 * Public License ("GPL") as published by the Free Software Foundation,
17 * either version 2 of that License or (at your option) any later version.
18 *
19 */
20
21#include <linux/kernel.h>
22#include <linux/interrupt.h>
23#include <linux/device.h>
24#include <linux/delay.h>
25#include <linux/slab.h>
26#include <linux/termios.h>
27#include <linux/debugfs.h>
28
29#include <mach/sdio_al.h>
30#include <mach/sdio_cmux.h>
31#include "u_serial.h"
32
33#define SDIO_RX_QUEUE_SIZE 8
34#define SDIO_RX_BUF_SIZE 2048
35
36#define SDIO_TX_QUEUE_SIZE 8
37#define SDIO_TX_BUF_SIZE 2048
38
39/* 1 - DUN, 2-NMEA/GPS */
40#define SDIO_N_PORTS 2
41static struct sdio_portmaster {
42 struct mutex lock;
43 struct gsdio_port *port;
44 struct platform_driver gsdio_ch;
45} sdio_ports[SDIO_N_PORTS];
46static unsigned n_sdio_ports;
47
48struct sdio_port_info {
49 /* data channel info */
50 char *data_ch_name;
51 struct sdio_channel *ch;
52
53 /* control channel info */
54 int ctrl_ch_id;
55};
56
57struct sdio_port_info sport_info[SDIO_N_PORTS] = {
58 {
59 .data_ch_name = "SDIO_DUN",
60 .ctrl_ch_id = 9,
61 },
62 {
63 .data_ch_name = "SDIO_NMEA",
64 .ctrl_ch_id = 10,
65 },
66};
67
68static struct workqueue_struct *gsdio_wq;
69
70struct gsdio_port {
71 unsigned port_num;
72 spinlock_t port_lock;
73
74 unsigned n_read;
75 struct list_head read_pool;
76 struct list_head read_queue;
77 struct work_struct push;
78 unsigned long rp_len;
79 unsigned long rq_len;
80
81 struct list_head write_pool;
82 struct work_struct pull;
83 unsigned long wp_len;
84
85 struct work_struct notify_modem;
86
87 struct gserial *port_usb;
88 struct usb_cdc_line_coding line_coding;
89
90 int sdio_open;
91 int ctrl_ch_err;
92 struct sdio_port_info *sport_info;
93 struct delayed_work sdio_open_work;
94
95#define SDIO_ACM_CTRL_RI (1 << 3)
96#define SDIO_ACM_CTRL_DSR (1 << 1)
97#define SDIO_ACM_CTRL_DCD (1 << 0)
98 int cbits_to_laptop;
99
100#define SDIO_ACM_CTRL_RTS (1 << 1) /* unused with full duplex */
101#define SDIO_ACM_CTRL_DTR (1 << 0) /* host is ready for data r/w */
102 int cbits_to_modem;
103
104 /* pkt logging */
105 unsigned long nbytes_tolaptop;
106 unsigned long nbytes_tomodem;
107};
108
109void gsdio_free_req(struct usb_ep *ep, struct usb_request *req)
110{
111 kfree(req->buf);
112 usb_ep_free_request(ep, req);
113}
114
115struct usb_request *
116gsdio_alloc_req(struct usb_ep *ep, unsigned len, gfp_t flags)
117{
118 struct usb_request *req;
119
120 req = usb_ep_alloc_request(ep, flags);
121 if (!req) {
122 pr_err("%s: usb alloc request failed\n", __func__);
123 return NULL;
124 }
125
126 req->length = len;
127 req->buf = kmalloc(len, flags);
128 if (!req->buf) {
129 pr_err("%s: request buf allocation failed\n", __func__);
130 usb_ep_free_request(ep, req);
131 return NULL;
132 }
133
134 return req;
135}
136
137void gsdio_free_requests(struct usb_ep *ep, struct list_head *head)
138{
139 struct usb_request *req;
140
141 while (!list_empty(head)) {
142 req = list_entry(head->next, struct usb_request, list);
143 list_del(&req->list);
144 gsdio_free_req(ep, req);
145 }
146}
147
148int gsdio_alloc_requests(struct usb_ep *ep, struct list_head *head,
149 int num, int size,
150 void (*cb)(struct usb_ep *ep, struct usb_request *))
151{
152 int i;
153 struct usb_request *req;
154
155 pr_debug("%s: ep:%p head:%p num:%d size:%d cb:%p", __func__,
156 ep, head, num, size, cb);
157
158 for (i = 0; i < num; i++) {
159 req = gsdio_alloc_req(ep, size, GFP_ATOMIC);
160 if (!req) {
161 pr_debug("%s: req allocated:%d\n", __func__, i);
162 return list_empty(head) ? -ENOMEM : 0;
163 }
164 req->complete = cb;
165 list_add(&req->list, head);
166 }
167
168 return 0;
169}
170
171void gsdio_start_rx(struct gsdio_port *port)
172{
173 struct list_head *pool;
174 struct usb_ep *out;
175 int ret;
176
177 if (!port) {
178 pr_err("%s: port is null\n", __func__);
179 return;
180 }
181
182 pr_debug("%s: port:%p port#%d\n", __func__, port, port->port_num);
183
184 spin_lock_irq(&port->port_lock);
185
186 if (!port->port_usb) {
187 pr_debug("%s: usb is disconnected\n", __func__);
188 goto start_rx_end;
189 }
190
191 pool = &port->read_pool;
192 out = port->port_usb->out;
193
194 while (!list_empty(pool)) {
195 struct usb_request *req;
196
197 req = list_entry(pool->next, struct usb_request, list);
198 list_del(&req->list);
199 req->length = SDIO_RX_BUF_SIZE;
200 port->rp_len--;
201
202 spin_unlock_irq(&port->port_lock);
203 ret = usb_ep_queue(out, req, GFP_ATOMIC);
204 spin_lock_irq(&port->port_lock);
205 if (ret) {
206 pr_err("%s: usb ep out queue failed"
207 "port:%p, port#%d\n",
208 __func__, port, port->port_num);
209 list_add_tail(&req->list, pool);
210 port->rp_len++;
211 break;
212 }
213
214 /* usb could have disconnected while we released spin lock */
215 if (!port->port_usb) {
216 pr_debug("%s: usb is disconnected\n", __func__);
217 goto start_rx_end;
218 }
219 }
220
221start_rx_end:
222 spin_unlock_irq(&port->port_lock);
223}
224
225int gsdio_write(struct gsdio_port *port, struct usb_request *req)
226{
227 unsigned avail;
228 char *packet = req->buf;
229 unsigned size = req->actual;
230 unsigned n;
231 int ret = 0;
232
233
234 if (!port) {
235 pr_err("%s: port is null\n", __func__);
236 return -ENODEV;
237 }
238
239 if (!req) {
240 pr_err("%s: usb request is null port#%d\n",
241 __func__, port->port_num);
242 return -ENODEV;
243 }
244
245 pr_debug("%s: port:%p port#%d req:%p actual:%d n_read:%d\n",
246 __func__, port, port->port_num, req,
247 req->actual, port->n_read);
248
249 if (!port->sdio_open) {
250 pr_debug("%s: SDIO IO is not supported\n", __func__);
251 return -ENODEV;
252 }
253
254 avail = sdio_write_avail(port->sport_info->ch);
255
256 pr_debug("%s: sdio_write_avail:%d", __func__, avail);
257
258 if (!avail)
259 return -EBUSY;
260
261 if (!req->actual) {
262 pr_debug("%s: req->actual is already zero,update bytes read\n",
263 __func__);
264 port->n_read = 0;
265 return -ENODEV;
266 }
267
268 packet = req->buf;
269 n = port->n_read;
270 if (n) {
271 packet += n;
272 size -= n;
273 }
274
275 if (size > avail)
276 size = avail;
277
278 spin_unlock_irq(&port->port_lock);
279 ret = sdio_write(port->sport_info->ch, packet, size);
280 spin_lock_irq(&port->port_lock);
281 if (ret) {
282 pr_err("%s: port#%d sdio write failed err:%d",
283 __func__, port->port_num, ret);
284 /* try again later */
285 return ret;
286 }
287
288 port->nbytes_tomodem += size;
289
290 if (size + n == req->actual)
291 port->n_read = 0;
292 else
293 port->n_read += size;
294
295 return ret;
296}
297
298void gsdio_rx_push(struct work_struct *w)
299{
300 struct gsdio_port *port = container_of(w, struct gsdio_port, push);
301 struct list_head *q = &port->read_queue;
302 struct usb_ep *out;
303 int ret;
304
305 pr_debug("%s: port:%p port#%d read_queue:%p", __func__,
306 port, port->port_num, q);
307
308 spin_lock_irq(&port->port_lock);
309
310 if (!port->port_usb) {
311 pr_debug("%s: usb cable is disconencted\n", __func__);
312 spin_unlock_irq(&port->port_lock);
313 return;
314 }
315
316 out = port->port_usb->out;
317
318 while (!list_empty(q)) {
319 struct usb_request *req;
320
321 req = list_first_entry(q, struct usb_request, list);
322
323 switch (req->status) {
324 case -ESHUTDOWN:
325 pr_debug("%s: req status shutdown portno#%d port:%p",
326 __func__, port->port_num, port);
327 goto rx_push_end;
328 default:
329 pr_warning("%s: port:%p port#%d"
330 " Unexpected Rx Status:%d\n", __func__,
331 port, port->port_num, req->status);
332 /* FALL THROUGH */
333 case 0:
334 /* normal completion */
335 break;
336 }
337
338 if (!port->sdio_open) {
339 pr_err("%s: sio channel is not open\n", __func__);
340 list_move(&req->list, &port->read_pool);
341 port->rp_len++;
342 port->rq_len--;
343 goto rx_push_end;
344 }
345
346
347 list_del(&req->list);
348 port->rq_len--;
349
350 ret = gsdio_write(port, req);
351 /* as gsdio_write drops spin_lock while writing data
352 * to sdio usb cable may have been disconnected
353 */
354 if (!port->port_usb) {
355 port->n_read = 0;
356 gsdio_free_req(out, req);
357 spin_unlock_irq(&port->port_lock);
358 return;
359 }
360
361 if (ret || port->n_read) {
362 list_add(&req->list, &port->read_queue);
363 port->rq_len++;
364 goto rx_push_end;
365 }
366
367 list_add(&req->list, &port->read_pool);
368 port->rp_len++;
369 }
370
371 if (port->sdio_open && !list_empty(q)) {
372 if (sdio_write_avail(port->sport_info->ch))
373 queue_work(gsdio_wq, &port->push);
374 }
375rx_push_end:
376 spin_unlock_irq(&port->port_lock);
377
378 /* start queuing out requests again to host */
379 gsdio_start_rx(port);
380}
381
382void gsdio_read_complete(struct usb_ep *ep, struct usb_request *req)
383{
384 struct gsdio_port *port = ep->driver_data;
385 unsigned long flags;
386
387 pr_debug("%s: ep:%p port:%p\n", __func__, ep, port);
388
389 if (!port) {
390 pr_err("%s: port is null\n", __func__);
391 return;
392 }
393
394 spin_lock_irqsave(&port->port_lock, flags);
395 list_add_tail(&req->list, &port->read_queue);
396 port->rq_len++;
397 queue_work(gsdio_wq, &port->push);
398 spin_unlock_irqrestore(&port->port_lock, flags);
399
400 return;
401}
402
403void gsdio_write_complete(struct usb_ep *ep, struct usb_request *req)
404{
405 struct gsdio_port *port = ep->driver_data;
406 unsigned long flags;
407
408 pr_debug("%s: ep:%p port:%p\n", __func__, ep, port);
409
410 if (!port) {
411 pr_err("%s: port is null\n", __func__);
412 return;
413 }
414
415 spin_lock_irqsave(&port->port_lock, flags);
416 list_add(&req->list, &port->write_pool);
417 port->wp_len++;
418
419 switch (req->status) {
420 default:
421 pr_warning("%s: port:%p port#%d unexpected %s status %d\n",
422 __func__, port, port->port_num,
423 ep->name, req->status);
424 /* FALL THROUGH */
425 case 0:
426 queue_work(gsdio_wq, &port->pull);
427 break;
428
429 case -ESHUTDOWN:
430 /* disconnect */
431 pr_debug("%s: %s shutdown\n", __func__, ep->name);
432 break;
433 }
434
435 spin_unlock_irqrestore(&port->port_lock, flags);
436
437 return;
438}
439
440void gsdio_read_pending(struct gsdio_port *port)
441{
442 struct sdio_channel *ch;
443 char buf[1024];
444 int avail;
445
446 if (!port) {
447 pr_err("%s: port is null\n", __func__);
448 return;
449 }
450
451 ch = port->sport_info->ch;
452
453 if (!ch)
454 return;
455
456 while ((avail = sdio_read_avail(ch))) {
457 if (avail > 1024)
458 avail = 1024;
459 sdio_read(ch, buf, avail);
460
461 pr_debug("%s: flushed out %d bytes\n", __func__, avail);
462 }
463}
464
465void gsdio_tx_pull(struct work_struct *w)
466{
467 struct gsdio_port *port = container_of(w, struct gsdio_port, pull);
468 struct list_head *pool = &port->write_pool;
469
470 pr_debug("%s: port:%p port#%d pool:%p\n", __func__,
471 port, port->port_num, pool);
472
473 if (!port->port_usb) {
474 pr_err("%s: usb disconnected\n", __func__);
475
476 /* take out all the pending data from sdio */
477 gsdio_read_pending(port);
478
479 return;
480 }
481
482 spin_lock_irq(&port->port_lock);
483
484 while (!list_empty(pool)) {
485 int avail;
486 struct usb_ep *in = port->port_usb->in;
487 struct sdio_channel *ch = port->sport_info->ch;
488 struct usb_request *req;
489 unsigned len = SDIO_TX_BUF_SIZE;
490 int ret;
491
492
493 req = list_entry(pool->next, struct usb_request, list);
494
495 if (!port->sdio_open) {
496 pr_debug("%s: SDIO channel is not open\n", __func__);
497 goto tx_pull_end;
498 }
499
500 avail = sdio_read_avail(ch);
501 if (!avail) {
502 /* REVISIT: for ZLP */
503 pr_debug("%s: read_avail:%d port:%p port#%d\n",
504 __func__, avail, port, port->port_num);
505 goto tx_pull_end;
506 }
507
508 if (avail > len)
509 avail = len;
510
511 list_del(&req->list);
512 port->wp_len--;
513
514 spin_unlock_irq(&port->port_lock);
515 ret = sdio_read(ch, req->buf, avail);
516 spin_lock_irq(&port->port_lock);
517 if (ret) {
518 pr_err("%s: port:%p port#%d sdio read failed err:%d",
519 __func__, port, port->port_num, ret);
520
521 /* check if usb is still active */
522 if (!port->port_usb) {
523 gsdio_free_req(in, req);
524 } else {
525 list_add(&req->list, pool);
526 port->wp_len++;
527 }
528 goto tx_pull_end;
529 }
530
531 req->length = avail;
532
533 spin_unlock_irq(&port->port_lock);
534 ret = usb_ep_queue(in, req, GFP_KERNEL);
535 spin_lock_irq(&port->port_lock);
536 if (ret) {
537 pr_err("%s: usb ep out queue failed"
538 "port:%p, port#%d err:%d\n",
539 __func__, port, port->port_num, ret);
540
541 /* could be usb disconnected */
542 if (!port->port_usb) {
543 gsdio_free_req(in, req);
544 } else {
545 list_add(&req->list, pool);
546 port->wp_len++;
547 }
548 goto tx_pull_end;
549 }
550
551 port->nbytes_tolaptop += avail;
552 }
553tx_pull_end:
554 spin_unlock_irq(&port->port_lock);
555}
556
557int gsdio_start_io(struct gsdio_port *port)
558{
559 int ret;
560 unsigned long flags;
561
562 pr_debug("%s:\n", __func__);
563
564 spin_lock_irqsave(&port->port_lock, flags);
565
566 if (!port->port_usb) {
567 spin_unlock_irqrestore(&port->port_lock, flags);
568 return -ENODEV;
569 }
570
571 /* start usb out queue */
572 ret = gsdio_alloc_requests(port->port_usb->out,
573 &port->read_pool,
574 SDIO_RX_QUEUE_SIZE, SDIO_RX_BUF_SIZE,
575 gsdio_read_complete);
576 if (ret) {
577 spin_unlock_irqrestore(&port->port_lock, flags);
578 pr_err("%s: unable to allocate out reqs\n", __func__);
579 return ret;
580 }
581 port->rp_len = SDIO_RX_QUEUE_SIZE;
582
583 ret = gsdio_alloc_requests(port->port_usb->in,
584 &port->write_pool,
585 SDIO_TX_QUEUE_SIZE, SDIO_TX_BUF_SIZE,
586 gsdio_write_complete);
587 if (ret) {
588 gsdio_free_requests(port->port_usb->out, &port->read_pool);
589 port->rp_len = 0;
590 spin_unlock_irqrestore(&port->port_lock, flags);
591 pr_err("%s: unable to allocate in reqs\n", __func__);
592 return ret;
593 }
594 port->wp_len = SDIO_TX_QUEUE_SIZE;
595 spin_unlock_irqrestore(&port->port_lock, flags);
596
597 gsdio_start_rx(port);
598 queue_work(gsdio_wq, &port->pull);
599
600 return 0;
601}
602
603void gsdio_port_free(unsigned portno)
604{
605 struct gsdio_port *port = sdio_ports[portno].port;
606 struct platform_driver *pdriver = &sdio_ports[portno].gsdio_ch;
607
608 if (!port) {
609 pr_err("%s: invalid portno#%d\n", __func__, portno);
610 return;
611 }
612
613 platform_driver_unregister(pdriver);
614
615 kfree(port);
616}
617
618void gsdio_ctrl_wq(struct work_struct *w)
619{
620 struct gsdio_port *port;
621
622 port = container_of(w, struct gsdio_port, notify_modem);
623
624 if (!port) {
625 pr_err("%s: port is null\n", __func__);
626 return;
627 }
628
629 if (!port->sdio_open || port->ctrl_ch_err)
630 return;
631
632 sdio_cmux_tiocmset(port->sport_info->ctrl_ch_id,
633 port->cbits_to_modem, ~(port->cbits_to_modem));
634}
635
636void gsdio_ctrl_notify_modem(struct gserial *gser, u8 portno, int ctrl_bits)
637{
638 struct gsdio_port *port;
639 int temp;
640
641 if (portno >= n_sdio_ports) {
642 pr_err("%s: invalid portno#%d\n", __func__, portno);
643 return;
644 }
645
646 if (!gser) {
647 pr_err("%s: gser is null\n", __func__);
648 return;
649 }
650
651 port = sdio_ports[portno].port;
652
653 temp = ctrl_bits & SDIO_ACM_CTRL_DTR ? TIOCM_DTR : 0;
654
655 if (port->cbits_to_modem == temp)
656 return;
657
658 port->cbits_to_modem = temp;
659
660 /* TIOCM_DTR - 0x002 - bit(1) */
661 pr_debug("%s: port:%p port#%d ctrl_bits:%08x\n", __func__,
662 port, port->port_num, ctrl_bits);
663
664 if (!port->sdio_open) {
665 pr_err("%s: port:%p port#%d sdio not connected\n",
666 __func__, port, port->port_num);
667 return;
668 }
669
670 /* whenever DTR is high let laptop know that modem status */
671 if (port->cbits_to_modem && gser->send_modem_ctrl_bits)
672 gser->send_modem_ctrl_bits(gser, port->cbits_to_laptop);
673
674 queue_work(gsdio_wq, &port->notify_modem);
675}
676
677void gsdio_ctrl_modem_status(int ctrl_bits, void *_dev)
678{
679 struct gsdio_port *port = _dev;
680
681 /* TIOCM_CD - 0x040 - bit(6)
682 * TIOCM_RI - 0x080 - bit(7)
683 * TIOCM_DSR- 0x100 - bit(8)
684 */
685 pr_debug("%s: port:%p port#%d event:%08x\n", __func__,
686 port, port->port_num, ctrl_bits);
687
688 port->cbits_to_laptop = 0;
689 ctrl_bits &= TIOCM_RI | TIOCM_CD | TIOCM_DSR;
690 if (ctrl_bits & TIOCM_RI)
691 port->cbits_to_laptop |= SDIO_ACM_CTRL_RI;
692 if (ctrl_bits & TIOCM_CD)
693 port->cbits_to_laptop |= SDIO_ACM_CTRL_DCD;
694 if (ctrl_bits & TIOCM_DSR)
695 port->cbits_to_laptop |= SDIO_ACM_CTRL_DSR;
696
697 if (port->port_usb && port->port_usb->send_modem_ctrl_bits)
698 port->port_usb->send_modem_ctrl_bits(port->port_usb,
699 port->cbits_to_laptop);
700}
701
702void gsdio_ch_notify(void *_dev, unsigned event)
703{
704 struct gsdio_port *port = _dev;
705
706 pr_debug("%s: port:%p port#%d event:%s\n", __func__,
707 port, port->port_num,
708 event == 1 ? "READ AVAIL" : "WRITE_AVAIL");
709
710 if (event == SDIO_EVENT_DATA_WRITE_AVAIL)
711 queue_work(gsdio_wq, &port->push);
712 if (event == SDIO_EVENT_DATA_READ_AVAIL)
713 queue_work(gsdio_wq, &port->pull);
714}
715
716static void gsdio_open_work(struct work_struct *w)
717{
718 struct gsdio_port *port =
719 container_of(w, struct gsdio_port, sdio_open_work.work);
720 struct sdio_port_info *pi = port->sport_info;
721 struct gserial *gser;
722 int ret;
723 int ctrl_bits;
724 int startio;
725
726 ret = sdio_open(pi->data_ch_name, &pi->ch, port, gsdio_ch_notify);
727 if (ret) {
728 pr_err("%s: port:%p port#%d unable to open sdio ch:%s\n",
729 __func__, port, port->port_num,
730 pi->data_ch_name);
731 return;
732 }
733
734 ret = sdio_cmux_open(pi->ctrl_ch_id, 0, 0,
735 gsdio_ctrl_modem_status, port);
736 if (ret) {
737 pr_err("%s: port:%p port#%d unable to open ctrl ch:%d\n",
738 __func__, port, port->port_num, pi->ctrl_ch_id);
739 port->ctrl_ch_err = 1;
740 }
741
742 /* check for latest status update from modem */
743 if (!port->ctrl_ch_err) {
744 ctrl_bits = sdio_cmux_tiocmget(pi->ctrl_ch_id);
745 gsdio_ctrl_modem_status(ctrl_bits, port);
746 }
747
748 pr_debug("%s: SDIO data:%s ctrl:%d are open\n", __func__,
749 pi->data_ch_name,
750 pi->ctrl_ch_id);
751
752 port->sdio_open = 1;
753
754 /* start tx if usb is open already */
755 spin_lock_irq(&port->port_lock);
756 startio = port->port_usb ? 1 : 0;
757 gser = port->port_usb;
758 spin_unlock_irq(&port->port_lock);
759
760 if (startio) {
761 pr_debug("%s: USB is already open, start io\n", __func__);
762 gsdio_start_io(port);
763 if (gser->send_modem_ctrl_bits)
764 gser->send_modem_ctrl_bits(gser, port->cbits_to_laptop);
765 }
766}
767
768#define SDIO_CH_NAME_MAX_LEN 9
769#define SDIO_OPEN_DELAY msecs_to_jiffies(10000)
770static int gsdio_ch_probe(struct platform_device *dev)
771{
772 struct gsdio_port *port;
773 struct sdio_port_info *pi;
774 int i;
775
776 pr_debug("%s: name:%s\n", __func__, dev->name);
777
778 for (i = 0; i < n_sdio_ports; i++) {
779 port = sdio_ports[i].port;
780 pi = port->sport_info;
781
782 pr_debug("%s: sdio_ch_name:%s dev_name:%s\n", __func__,
783 pi->data_ch_name, dev->name);
784
785 /* unfortunately cmux channle might not be ready even if
786 * sdio channel is ready. as we dont have good notification
787 * mechanism schedule a delayed work
788 */
789 if (!strncmp(pi->data_ch_name, dev->name,
790 SDIO_CH_NAME_MAX_LEN)) {
791 queue_delayed_work(gsdio_wq,
792 &port->sdio_open_work, SDIO_OPEN_DELAY);
793 return 0;
794 }
795 }
796
797 pr_info("%s: name:%s is not found\n", __func__, dev->name);
798
799 return -ENODEV;
800}
801
802int gsdio_port_alloc(unsigned portno,
803 struct usb_cdc_line_coding *coding,
804 struct sdio_port_info *pi)
805{
806 struct gsdio_port *port;
807 struct platform_driver *pdriver;
808
809 port = kzalloc(sizeof(struct gsdio_port), GFP_KERNEL);
810 if (!port) {
811 pr_err("%s: port allocation failed\n", __func__);
812 return -ENOMEM;
813 }
814
815 port->port_num = portno;
816 spin_lock_init(&port->port_lock);
817 port->line_coding = *coding;
818
819 /* READ: read from usb and write into sdio */
820 INIT_LIST_HEAD(&port->read_pool);
821 INIT_LIST_HEAD(&port->read_queue);
822 INIT_WORK(&port->push, gsdio_rx_push);
823
824 INIT_LIST_HEAD(&port->write_pool);
825 INIT_WORK(&port->pull, gsdio_tx_pull);
826
827 INIT_WORK(&port->notify_modem, gsdio_ctrl_wq);
828
829 INIT_DELAYED_WORK(&port->sdio_open_work, gsdio_open_work);
830
831 sdio_ports[portno].port = port;
832
833 port->sport_info = pi;
834 pdriver = &sdio_ports[portno].gsdio_ch;
835
836 pdriver->probe = gsdio_ch_probe;
837 pdriver->driver.name = pi->data_ch_name;
838 pdriver->driver.owner = THIS_MODULE;
839
840 pr_debug("%s: port:%p port#%d sdio_name: %s\n", __func__,
841 port, port->port_num, pi->data_ch_name);
842
843 platform_driver_register(pdriver);
844
845 pr_debug("%s: port:%p port#%d\n", __func__, port, port->port_num);
846
847 return 0;
848}
849
850int gsdio_connect(struct gserial *gser, u8 portno)
851{
852 struct gsdio_port *port;
853 int ret = 0;
854 unsigned long flags;
855
856 if (portno >= n_sdio_ports) {
857 pr_err("%s: invalid portno#%d\n", __func__, portno);
858 return -EINVAL;
859 }
860
861 if (!gser) {
862 pr_err("%s: gser is null\n", __func__);
863 return -EINVAL;
864 }
865
866 port = sdio_ports[portno].port;
867
868 spin_lock_irqsave(&port->port_lock, flags);
869 port->port_usb = gser;
870 gser->notify_modem = gsdio_ctrl_notify_modem;
871 spin_unlock_irqrestore(&port->port_lock, flags);
872
873 ret = usb_ep_enable(gser->in, gser->in_desc);
874 if (ret) {
875 pr_err("%s: failed to enable in ep w/ err:%d\n",
876 __func__, ret);
877 port->port_usb = 0;
878 return ret;
879 }
880 gser->in->driver_data = port;
881
882 ret = usb_ep_enable(gser->out, gser->out_desc);
883 if (ret) {
884 pr_err("%s: failed to enable in ep w/ err:%d\n",
885 __func__, ret);
886 usb_ep_disable(gser->in);
887 port->port_usb = 0;
888 gser->in->driver_data = 0;
889 return ret;
890 }
891 gser->out->driver_data = port;
892
893 if (port->sdio_open) {
894 pr_debug("%s: sdio is already open, start io\n", __func__);
895 gsdio_start_io(port);
896 if (gser->send_modem_ctrl_bits)
897 gser->send_modem_ctrl_bits(gser, port->cbits_to_laptop);
898 }
899
900 return 0;
901}
902
903void gsdio_disconnect(struct gserial *gser, u8 portno)
904{
905 unsigned long flags;
906 struct gsdio_port *port;
907
908 if (portno >= n_sdio_ports) {
909 pr_err("%s: invalid portno#%d\n", __func__, portno);
910 return;
911 }
912
913 if (!gser) {
914 pr_err("%s: gser is null\n", __func__);
915 return;
916 }
917
918 port = sdio_ports[portno].port;
919
920 /* send dtr zero to modem to notify disconnect */
921 port->cbits_to_modem = 0;
922 queue_work(gsdio_wq, &port->notify_modem);
923
924 spin_lock_irqsave(&port->port_lock, flags);
925 port->port_usb = 0;
926 port->nbytes_tomodem = 0;
927 port->nbytes_tolaptop = 0;
928 spin_unlock_irqrestore(&port->port_lock, flags);
929
930 /* disable endpoints, aborting down any active I/O */
931 usb_ep_disable(gser->out);
932
933 usb_ep_disable(gser->in);
934
935 spin_lock_irqsave(&port->port_lock, flags);
936 gsdio_free_requests(gser->out, &port->read_pool);
937 gsdio_free_requests(gser->out, &port->read_queue);
938 gsdio_free_requests(gser->in, &port->write_pool);
939
940 port->rp_len = 0;
941 port->rq_len = 0;
942 port->wp_len = 0;
943 port->n_read = 0;
944 spin_unlock_irqrestore(&port->port_lock, flags);
945}
946
947#if defined(CONFIG_DEBUG_FS)
948static char debug_buffer[PAGE_SIZE];
949
950static ssize_t debug_sdio_read_stats(struct file *file, char __user *ubuf,
951 size_t count, loff_t *ppos)
952{
953 struct gsdio_port *port;
954 char *buf = debug_buffer;
955 unsigned long flags;
956 int i = 0;
957 int temp = 0;
958
959 while (i < n_sdio_ports) {
960 port = sdio_ports[i].port;
961 spin_lock_irqsave(&port->port_lock, flags);
962 temp += scnprintf(buf + temp, PAGE_SIZE - temp,
963 "###PORT:%d port:%p###\n"
964 "nbytes_tolaptop: %lu\n"
965 "nbytes_tomodem: %lu\n"
966 "cbits_to_modem: %u\n"
967 "cbits_to_laptop: %u\n"
968 "read_pool_len: %lu\n"
969 "read_queue_len: %lu\n"
970 "write_pool_len: %lu\n"
971 "n_read: %u\n",
972 i, port,
973 port->nbytes_tolaptop, port->nbytes_tomodem,
974 port->cbits_to_modem, port->cbits_to_laptop,
975 port->rp_len, port->rq_len, port->wp_len,
976 port->n_read);
977 spin_unlock_irqrestore(&port->port_lock, flags);
978 i++;
979 }
980
981 return simple_read_from_buffer(ubuf, count, ppos, buf, temp);
982}
983
984static ssize_t debug_sdio_reset_stats(struct file *file, const char __user *buf,
985 size_t count, loff_t *ppos)
986{
987 struct gsdio_port *port;
988 unsigned long flags;
989 int i = 0;
990
991 while (i < n_sdio_ports) {
992 port = sdio_ports[i].port;
993
994 spin_lock_irqsave(&port->port_lock, flags);
995 port->nbytes_tolaptop = 0;
996 port->nbytes_tomodem = 0;
997 spin_unlock_irqrestore(&port->port_lock, flags);
998 i++;
999 }
1000
1001 return count;
1002}
1003
1004static int debug_sdio_open(struct inode *inode, struct file *file)
1005{
1006 return 0;
1007}
1008
1009static const struct file_operations debug_gsdio_ops = {
1010 .open = debug_sdio_open,
1011 .read = debug_sdio_read_stats,
1012 .write = debug_sdio_reset_stats,
1013};
1014
1015static void gsdio_debugfs_init(void)
1016{
1017 struct dentry *dent;
1018
1019 dent = debugfs_create_dir("usb_gsdio", 0);
1020 if (IS_ERR(dent))
1021 return;
1022
1023 debugfs_create_file("status", 0444, dent, 0, &debug_gsdio_ops);
1024}
1025#else
1026static void gsdio_debugfs_init(void)
1027{
1028 return;
1029}
1030#endif
1031
1032/* connect, disconnect, alloc_requests, free_requests */
1033int gsdio_setup(struct usb_gadget *g, unsigned count)
1034{
1035 struct usb_cdc_line_coding coding;
1036 int i;
1037 int ret = 0;
1038 struct sdio_port_info *port_info;
1039
1040 pr_debug("%s: gadget:(%p) count:%d\n", __func__, g, count);
1041
1042 if (count == 0 || count > SDIO_N_PORTS) {
1043 pr_err("%s: invalid number of ports count:%d max_ports:%d\n",
1044 __func__, count, SDIO_N_PORTS);
1045 return -EINVAL;
1046 }
1047
1048 coding.dwDTERate = cpu_to_le32(9600);
1049 coding.bCharFormat = 8;
1050 coding.bParityType = USB_CDC_NO_PARITY;
1051 coding.bDataBits = USB_CDC_1_STOP_BITS;
1052
1053 gsdio_wq = create_singlethread_workqueue("k_gserial");
1054 if (!gsdio_wq) {
1055 pr_err("%s: unable to create workqueue gsdio_wq\n",
1056 __func__);
1057 return -ENOMEM;
1058 }
1059
1060 for (i = 0; i < count; i++) {
1061 mutex_init(&sdio_ports[i].lock);
1062 ret = gsdio_port_alloc(i, &coding, sport_info + i);
Manu Gautamc40be022011-09-26 13:58:31 +05301063 n_sdio_ports++;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001064 if (ret) {
Manu Gautamc40be022011-09-26 13:58:31 +05301065 n_sdio_ports--;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001066 pr_err("%s: sdio logical port allocation failed\n",
1067 __func__);
1068 goto free_sdio_ports;
1069 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001070 port_info++;
1071
1072#ifdef DEBUG
1073 /* REVISIT: create one file per port
1074 * or do not create any file
1075 */
1076 if (i == 0) {
1077 ret = device_create_file(&g->dev, &dev_attr_input);
1078 if (ret)
1079 pr_err("%s: unable to create device file\n",
1080 __func__);
1081 }
1082#endif
1083
1084 }
1085
1086 gsdio_debugfs_init();
1087
1088 return 0;
1089
1090free_sdio_ports:
1091 for (i = 0; i < n_sdio_ports; i++)
1092 gsdio_port_free(i);
1093 destroy_workqueue(gsdio_wq);
1094
1095 return ret;
1096}
1097
1098/* TODO: Add gserial_cleanup */