1/* SPDX-License-Identifier: GPL-2.0 */ 2/* Copyright (c) 2012 GCT Semiconductor, Inc. All rights reserved. */ 3 4#ifndef _GDM_MUX_H_ 5#define _GDM_MUX_H_ 6 7#include <linux/types.h> 8#include <linux/usb.h> 9#include <linux/list.h> 10 11#include "gdm_tty.h" 12 13#define PM_NORMAL 0 14#define PM_SUSPEND 1 15 16#define USB_RT_ACM (USB_TYPE_CLASS | USB_RECIP_INTERFACE) 17 18#define START_FLAG 0xA512485A 19#define MUX_HEADER_SIZE 14 20#define MUX_TX_MAX_SIZE (1024 * 10) 21#define MUX_RX_MAX_SIZE (1024 * 30) 22#define AT_PKT_TYPE 0xF011 23#define DM_PKT_TYPE 0xF010 24 25#define RETRY_TIMER 30 /* msec */ 26 27struct mux_pkt_header { 28 __le32 start_flag; 29 __le32 seq_num; 30 __le32 payload_size; 31 __le16 packet_type; 32 unsigned char data[0]; 33}; 34 35struct mux_tx { 36 struct urb *urb; 37 u8 *buf; 38 int len; 39 void (*callback)(void *cb_data); 40 void *cb_data; 41}; 42 43struct mux_rx { 44 struct list_head free_list; 45 struct list_head rx_submit_list; 46 struct list_head to_host_list; 47 struct urb *urb; 48 u8 *buf; 49 void *mux_dev; 50 u32 offset; 51 u32 len; 52 int (*callback)(void *data, 53 int len, 54 int tty_index, 55 struct tty_dev *tty_dev, 56 int complete); 57}; 58 59struct rx_cxt { 60 struct list_head to_host_list; 61 struct list_head rx_submit_list; 62 struct list_head rx_free_list; 63 spinlock_t to_host_lock; 64 spinlock_t submit_list_lock; 65 spinlock_t free_list_lock; 66}; 67 68struct mux_dev { 69 struct usb_device *usbdev; 70 struct usb_interface *control_intf; 71 struct usb_interface *data_intf; 72 struct rx_cxt rx; 73 struct delayed_work work_rx; 74 struct usb_interface *intf; 75 int usb_state; 76 int (*rx_cb)(void *data, 77 int len, 78 int tty_index, 79 struct tty_dev *tty_dev, 80 int complete); 81 spinlock_t write_lock; 82 struct tty_dev *tty_dev; 83}; 84 85#endif /* _GDM_MUX_H_ */ 86