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