root/drivers/staging/gdm724x/gdm_mux.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. packet_type_to_index
  2. alloc_mux_tx
  3. free_mux_tx
  4. alloc_mux_rx
  5. free_mux_rx
  6. get_rx_struct
  7. put_rx_struct
  8. up_to_host
  9. do_rx
  10. remove_rx_submit_list
  11. gdm_mux_rcv_complete
  12. gdm_mux_recv
  13. gdm_mux_send_complete
  14. gdm_mux_send
  15. gdm_mux_send_control
  16. release_usb
  17. init_usb
  18. gdm_mux_probe
  19. gdm_mux_disconnect
  20. gdm_mux_suspend
  21. gdm_mux_resume
  22. gdm_usb_mux_init
  23. gdm_usb_mux_exit

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

/* [<][>][^][v][top][bottom][index][help] */