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