Blame view

kernel/linux-imx6_3.14.28/drivers/tty/serial/sc16is7xx.h 2.26 KB
6b13f685e   김민수   BSP 최초 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
  
  struct i2c_work;
  
  enum sc_mode {
  	SCM_READ,
  	SCM_WRITE,
  };
  
  struct i2c_work
  {
  	struct i2c_work *next;
  	unsigned char mode;
  	unsigned char reg;
  #define F_PENDING 0
  #define F_SUCCESS 1
  #define F_FAILURE 2
  	unsigned char state;
  	unsigned char cnt;
  	unsigned char channel_no;
  	unsigned char val;
  };
  
  struct uart_sc16is7xx_chan {
  	struct uart_port        port;
  	struct uart_sc16is7xx_sc *sc;
  	unsigned char		channel_no;
  	unsigned char		actual_lcr;
  	unsigned char		actual_mcr;
  	unsigned char		actual_efr;
  	unsigned char		actual_ier;
  	unsigned char		new_ier;
  	unsigned char		tx_empty;
  	unsigned char		check_tx_empty;
  	char			*name;
  	spinlock_t		work_pending_lock;
  	struct i2c_work		*pending_head;
  	struct i2c_work		*pending_tail;
  	unsigned char		reg_cache[SC_CHAN_REG_CNT];
  #ifdef CONFIG_SERIAL_SC16IS7XX_CONSOLE
  	unsigned short		console_insert;
  	unsigned short		console_remove;
  	unsigned char		console_buffer[1024];
  #endif
  };
  
  struct uart_sc16is7xx_sc {
  	struct sc16is7xx_access	sc_access;
  
  	void (*gpio_callback)(struct sc16is7xx_gpio *sg, unsigned state);
  	struct sc16is7xx_gpio	*gpio_sg;
  	struct uart_sc16is7xx_chan chan[2];
  	struct i2c_client 	*client;
  	/* thread waits on this, irq wakes up */
  	int			work_ready;
  	wait_queue_head_t	work_waitq;
  	struct completion	init_exit;	/* thread init done notification */
  	int			irq;
  	unsigned		gp;
  	int			startup_code;
  	int			shutdown;
  	struct task_struct	*sc_thread;
  	unsigned char		dev_cache[SC_REG_CNT - SC_CHAN_REG_CNT];
  	spinlock_t		work_free_lock;
  	spinlock_t		pending_lock;
  	unsigned		write_pending;
  	struct i2c_work		*work_free;
  #define MAX_WORK 32
  	struct i2c_work		work_entries[MAX_WORK];
  };
  
  /*
   * 7 6543  21 0
   * |   |   |  |
   * |   |   |  unused
   * |   |   00 channel A
   * |   |   01 channel B
   * |   |   1x reserved
   * | internal register select
   * unused
   */
  
  #define MAKE_SUBADDRESS(port, reg) (unsigned char)(((reg & 0x0f) << 3) | (port << 1))
  
  #define SP_0xBF		0
  #define SP_DLAB		1
  #define SP_MCR2		2
  
  #define A_TYPEV(bit) (1 << ((bit) + 4))
  #define A_TYPE(bit, val) ((0x10 | (val)) << ((bit) + 4))
  #define _RO		0x1000		/* Read-only */
  #define _WO		0x2000		/* Write-only */
  #define _V		0x4000		/* Volatile */
  
  
  #define IER_SLEEP		(1 << 4)	/* EFR[4] needs to be set */
  #define IER_XOFF_INT		(1 << 5)
  #define IER_RTS_INT		(1 << 6)
  #define IER_CTS_INT		(1 << 7)