xref: /OK3568_Linux_fs/kernel/drivers/misc/rk_scr.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /*
2  * Driver for Rockchip Smart Card Reader Controller
3  *
4  * Copyright (C) 2012-2016 ROCKCHIP, Inc.
5  *
6  * This software is licensed under the terms of the GNU General Public
7  * License version 2, as published by the Free Software Foundation, and
8  * may be copied, distributed, and modified under those terms.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  */
15 
16 #ifndef __RK_SCR_H__
17 #define __RK_SCR_H__
18 
19 /* CTRL1 bit fields */
20 #define INVLEV		BIT(0)
21 #define INVORD		BIT(1)
22 #define PECH2FIFO	BIT(2)
23 #define CLKSTOP		BIT(6)
24 #define CLKSTOPVAL	BIT(7)
25 #define TXEN		BIT(8)
26 #define RXEN		BIT(9)
27 #define TS2FIFO		BIT(10)
28 #define T0T1		BIT(11)
29 #define ATRSTFLUSH	BIT(12)
30 #define TCKEN		BIT(13)
31 #define GINTEN		BIT(15)
32 
33 /* CTRL2 bit fields */
34 #define WARMRST		BIT(2)
35 #define ACT		BIT(3)
36 #define DEACT		BIT(4)
37 #define VCC18		BIT(5)
38 #define VCC33		BIT(6)
39 #define VCC50		BIT(7)
40 
41 /* SCPADS bit fields */
42 #define DIRACCPADS		BIT(0)
43 #define DSCIO			BIT(1)
44 #define DSCCLK			BIT(2)
45 #define DSCRST			BIT(3)
46 #define DSCVCC			BIT(4)
47 #define AUTOADEAVPP		BIT(5)
48 #define DSCVPPEN		BIT(6)
49 #define DSCVPPP			BIT(7)
50 #define DSCFCB			BIT(8)
51 #define SCPRESENT		BIT(9)
52 
53 /* INTEN1 & INTSTAT1 bit fields */
54 #define TXFIDONE	BIT(0)
55 #define TXFIEMPTY	BIT(1)
56 #define RXFIFULL	BIT(2)
57 #define CLKSTOPRUN	BIT(3)
58 #define TXDONE		BIT(4)
59 #define RXDONE		BIT(5)
60 #define TXPERR		BIT(6)
61 #define RXPERR		BIT(7)
62 #define C2CFULL		BIT(8)
63 #define RXTHRESHOLD	BIT(9)
64 #define ATRFAIL		BIT(10)
65 #define ATRDONE		BIT(11)
66 #define SCREM		BIT(12)
67 #define SCINS		BIT(13)
68 #define SCACT		BIT(14)
69 #define SCDEACT		BIT(15)
70 
71 /* INTEN2 & INTSTAT2 bit fields */
72 #define TXTHRESHOLD	BIT(0)
73 #define TCLKERR		BIT(1)
74 
75 /* FIFOCTRL bit fields */
76 #define FC_TXFIEMPTY	BIT(0)
77 #define FC_TXFIFULL	BIT(1)
78 #define FC_TXFIFLUSH	BIT(2)
79 #define FC_RXFIEMPTY	BIT(8)
80 #define FC_RXFIFULL	BIT(9)
81 #define FC_RXFIFLUSH	BIT(10)
82 
83 /* FIFO_DEPTH must >= 2 */
84 #define FIFO_DEPTH	32
85 #define MAX_RXTHR	(3 * FIFO_DEPTH / 4)
86 #define MAX_TXTHR	(256) /* at least, one less than FIFO_DEPTH */
87 
88 #define RK_SCR_NUM		(2)
89 #define SMC_ATR_MAX_LENGTH	(512)
90 #define SMC_ATR_MIN_LENGTH	(2)
91 
92 #define SMC_SUCCESSFUL				(0)
93 #define SMC_ERROR_CARD_NOT_INSERT		BIT(0)
94 #define SMC_ERROR_NO_ANSWER			BIT(1)
95 #define SMC_ERROR_TX_ERR			BIT(2)
96 #define SMC_ERROR_RX_ERR			BIT(3)
97 #define SMC_ERROR_CONFLICT_ERR			BIT(4)
98 #define SMC_ERROR_WRITE_FULL_RECV_FIFO_ERR	BIT(5)
99 #define SMC_ERROR_BWT_ERR			BIT(6)
100 #define SMC_ERROR_CWT_ERR			BIT(7)
101 #define SMC_ERROR_BAD_PARAMETER			BIT(8)
102 #define SMC_ERROR_ATR_ERR			BIT(9)
103 #define SMC_ERROR_NO_MEMERY			BIT(10)
104 #define SMC_ERROR_TIMEOUT			BIT(11)
105 
106 enum {
107 	SC_DRV_INT_CARDOUT = 0,
108 	SC_DRV_INT_CARDIN
109 };
110 
111 /* card convention */
112 enum {
113 	SC_CONV_DIRECT = 0,
114 	SC_CONV_INVERSE = 1
115 };
116 
117 enum {
118 	SC_CARD_INDEX_0 = 0,
119 	SC_CARD_INDEX_1 = 1
120 };
121 
122 /* card protocol */
123 enum {
124 	SC_PROTOCOL_INVALID = -1,
125 	SC_PROTOCOL_T0 = 0,
126 	SC_PROTOCOL_T1 = 1,
127 	SC_PROTOCOL_T14 = 14
128 };
129 
130 /* enumerated constants */
131 enum status_code_e {
132 	SUCCESSFUL		= 0, /* successful completion		*/
133 	TASK_EXITTED		= 1, /* returned from a thread		*/
134 	MP_NOT_CONFIGURED	= 2, /* multiprocessing not configured	*/
135 	INVALID_NAME		= 3, /* invalid object name		*/
136 	INVALID_ID		= 4, /* invalid object id		*/
137 	TOO_MANY		= 5, /* too many			*/
138 	TIMEOUT			= 6, /* timed out waiting		*/
139 	OBJECT_WAS_DELETED	= 7, /* object deleted while waiting	*/
140 	INVALID_SIZE		= 8, /* specified size was invalid	*/
141 	INVALID_ADDRESS		= 9, /* address specified is invalid	*/
142 	INVALID_NUMBER		= 10, /* number was invalid		*/
143 	NOT_DEFINED		= 11, /* item has not been initialized	*/
144 	RESOURCE_IN_USE		= 12, /* resources still outstanding	*/
145 	UNSATISFIED		= 13, /* request not satisfied		*/
146 	INCORRECT_STATE		= 14, /* thread is in wrong state	*/
147 	ALREADY_SUSPENDED	= 15, /* thread already in state	*/
148 	ILLEGAL_ON_SELF		= 16, /* illegal on calling thread	*/
149 	ILLEGAL_ON_REMOTE_OBJECT = 17, /* illegal for remote object	*/
150 	CALLED_FROM_ISR		= 18, /* called from wrong environment	*/
151 	INVALID_PRIORITY	= 19, /* invalid thread priority	*/
152 	INVALID_CLOCK		= 20, /* invalid date/time		*/
153 	INVALID_NODE		= 21, /* invalid node id		*/
154 	NOT_CONFIGURED		= 22, /* directive not configured	*/
155 	NOT_OWNER_OF_RESOURCE	= 23, /* not owner of resource		*/
156 	NOT_IMPLEMENTED		= 24, /* directive not implemented	*/
157 	INTERNAL_ERROR		= 25, /* inconsistency detected		*/
158 	NO_MEMORY		= 26, /* could not get enough memory	*/
159 	IO_ERROR		= 27, /* driver IO error		*/
160 	PROXY_BLOCKING		= 28 /* internal error only		*/
161 };
162 
163 struct scr_reg_t {
164 	unsigned int CTRL1;		/* Control Reg 1		*/
165 	unsigned int CTRL2;		/* Control Reg 2		*/
166 	unsigned int SCPADS;		/* Direct access to Smart Card pads*/
167 	unsigned int INTEN1;		/* Interrupt Enable Reg 1	*/
168 	unsigned int INTSTAT1;		/* Interrupt Status Reg 1	*/
169 	unsigned int FIFOCTRL;		/* FIFO control register	*/
170 	unsigned int LGCYCNT;		/* Legacy TX & RX FIFO Counter	*/
171 	unsigned int RXFIFOTH;		/* RXFIFO threshold		*/
172 	unsigned int REPEAT;		/*
173 					 * number of repeating after
174 					 * unsuccessful transaction
175 					 */
176 	unsigned int CGSCDIV;		/* SmartCard clock divisor	*/
177 	unsigned int CGBITDIV;		/* Bit clock divisor		*/
178 	unsigned int SCGT;		/* SmartCard GuardTime		*/
179 	unsigned int ADEATIME;		/* Activation/deactivation time (cc)*/
180 	unsigned int LOWRSTTIME;	/*
181 					 * Duration of low state during
182 					 * Smart Card reset sequence
183 					 */
184 	unsigned int ATRSTARTLIMIT;	/* ATR start limit		*/
185 	unsigned int C2CLIM;		/*
186 					 * leading edge to leading edge of two
187 					 * consecutive characters delay limit
188 					 */
189 	unsigned int INTEN2;		/* Interrupt Enable Reg 2	*/
190 	unsigned int INTSTAT2;		/* Interrupt Status R		*/
191 	unsigned int TXFIFOTH;		/* TXFIFO threshold		*/
192 	unsigned int TXFIFOCNT;		/* TXFIFO counter		*/
193 	unsigned int RXFIFOCNT;		/* RXFIFO counter		*/
194 	unsigned int CGBITTUNE;		/* Bit tune register		*/
195 	unsigned int reserved[0x200 / 4];
196 	unsigned int FIFODATA;		/*
197 					 * FIFODATA space start
198 					 * - RX FIFO and TX FIFO
199 					 */
200 };
201 
202 enum hal_scr_id_e {
203 	HAL_SCR_ID0 = 0,
204 	HAL_SCR_ID1,
205 	HAL_SCR_ID_MAX
206 };
207 
208 enum hal_scr_clock_stop_mode_e {
209 	/* Continuous clock mode, the autostop is disabled */
210 	HAL_SCR_CLOCK_NO_STOP,
211 	/* Automatic clock stop mode, stopped at low-level */
212 	HAL_SCR_CLOCK_STOP_L,
213 	/* Automatic clock stop mode, stopped at high-level */
214 	HAL_SCR_CLOCK_STOP_H
215 };
216 
217 enum hal_scr_etu_duration_e {
218 	/* F and D to default value F=372, D=1 */
219 	HAL_SCR_ETU_F_372_AND_D_1,
220 	/* F=512 and D=8 */
221 	HAL_SCR_ETU_F_512_AND_D_8,
222 	/* F=512 and D=4 */
223 	HAL_SCR_ETU_F_512_AND_D_4
224 };
225 
226 struct hal_scr_irq_status_t {
227 	/* When the reset time-outs.		*/
228 	unsigned char reset_timeout;
229 	/* When a parity error occurs.		*/
230 	unsigned char parity_error;
231 	/* When a bad ts character is received.	*/
232 	unsigned char bad_ts;
233 	/* When the auto-reset is successful.	*/
234 	unsigned char atr_success;
235 	/* When a rx transfer has been finished	*/
236 	unsigned char rx_success;
237 	/* When an auto-reset has been started.	*/
238 	unsigned char atr_start;
239 	/* When a work waiting time factor time-outs. */
240 	unsigned char wwt_timeout;
241 	/*
242 	 * When the number of received character exceeds the
243 	 * number of awaited bytes:1; (set in the SCI Rx counter register)
244 	 */
245 	unsigned char extra_rx;
246 };
247 
248 /*check card is in or out*/
249 enum hal_scr_detect_status_e {
250 	SMC_DRV_INT_CARDOUT = 0,
251 	SMC_DRV_INT_CARDIN
252 };
253 
254 enum hal_scr_irq_cause_e {
255 	HAL_SCR_RESET_TIMEOUT,
256 	HAL_SCR_PARITY_ERROR,
257 	HAL_SCR_BAD_TS,
258 	HAL_SCR_ATR_SUCCESS,
259 	HAL_SCR_RX_SUCCESS,
260 	HAL_SCR_WWT_TIMEOUT,
261 	HAL_SCR_EXTRA_RX,
262 	HAL_SCR_IRQ_INVALID = 0x0fffffff
263 };
264 
265 enum hal_scr_voltage_e {
266 	/* 5V */
267 	HAL_SCR_VOLTAGE_CLASS_A,
268 	/* 3V */
269 	HAL_SCR_VOLTAGE_CLASS_B,
270 	/* 1.8V */
271 	HAL_SCR_VOLTAGE_CLASS_C,
272 	/* 0V */
273 	HAL_SCR_VOLTAGE_NULL
274 };
275 
276 /* card protocol */
277 enum {
278 	SMC_PROTOCOL_INVALID = -1,
279 	SMC_PROTOCOL_T0 = 0,
280 	SMC_PROTOCOL_T1 = 1,
281 	SMC_PROTOCOL_T14 = 14
282 };
283 
284 /* card convention */
285 enum {
286 	SMC_CONV_DIRECT = 0,
287 	SMC_CONV_INVERSE = 1
288 };
289 
290 /*card index*/
291 enum {
292 	SMC_CARD_INDEX_0 = 0,
293 	SMC_CARD_INDEX_1 = 1
294 };
295 
296 typedef void (*hal_scr_irq_handler_t) (enum hal_scr_irq_cause_e);
297 
298 struct scr_chip_info {
299 	struct scr_reg_t *reg_base;
300 	int irq;
301 	const char *clk_name;
302 };
303 
304 struct rk_scr {
305 	const struct scr_chip_info *hw;
306 	struct clk *clk;
307 	hal_scr_irq_handler_t user_handler;
308 	struct hal_scr_irq_status_t user_mask;
309 	bool is_open;
310 	bool is_active;
311 	bool in_process;
312 
313 	unsigned char *rx_buf;
314 	unsigned int rx_expected;
315 	unsigned int rx_cnt;
316 	const unsigned char *tx_buf;
317 	unsigned int tx_expected;
318 	unsigned int tx_cnt;
319 	unsigned int F;
320 	unsigned int D;
321 	struct notifier_block freq_changed_notifier;
322 };
323 
324 #endif	/* __RK_SCR_H__ */
325