1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 2*4882a593Smuzhiyun #ifndef _UAPI_CM4000_H_ 3*4882a593Smuzhiyun #define _UAPI_CM4000_H_ 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #include <linux/types.h> 6*4882a593Smuzhiyun #include <linux/ioctl.h> 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #define MAX_ATR 33 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #define CM4000_MAX_DEV 4 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun /* those two structures are passed via ioctl() from/to userspace. They are 13*4882a593Smuzhiyun * used by existing userspace programs, so I kepth the awkward "bIFSD" naming 14*4882a593Smuzhiyun * not to break compilation of userspace apps. -HW */ 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun typedef struct atreq { 17*4882a593Smuzhiyun __s32 atr_len; 18*4882a593Smuzhiyun unsigned char atr[64]; 19*4882a593Smuzhiyun __s32 power_act; 20*4882a593Smuzhiyun unsigned char bIFSD; 21*4882a593Smuzhiyun unsigned char bIFSC; 22*4882a593Smuzhiyun } atreq_t; 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun /* what is particularly stupid in the original driver is the arch-dependent 26*4882a593Smuzhiyun * member sizes. This leads to CONFIG_COMPAT breakage, since 32bit userspace 27*4882a593Smuzhiyun * will lay out the structure members differently than the 64bit kernel. 28*4882a593Smuzhiyun * 29*4882a593Smuzhiyun * I've changed "ptsreq.protocol" from "unsigned long" to "__u32". 30*4882a593Smuzhiyun * On 32bit this will make no difference. With 64bit kernels, it will make 31*4882a593Smuzhiyun * 32bit apps work, too. 32*4882a593Smuzhiyun */ 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun typedef struct ptsreq { 35*4882a593Smuzhiyun __u32 protocol; /*T=0: 2^0, T=1: 2^1*/ 36*4882a593Smuzhiyun unsigned char flags; 37*4882a593Smuzhiyun unsigned char pts1; 38*4882a593Smuzhiyun unsigned char pts2; 39*4882a593Smuzhiyun unsigned char pts3; 40*4882a593Smuzhiyun } ptsreq_t; 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun #define CM_IOC_MAGIC 'c' 43*4882a593Smuzhiyun #define CM_IOC_MAXNR 255 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun #define CM_IOCGSTATUS _IOR (CM_IOC_MAGIC, 0, unsigned char *) 46*4882a593Smuzhiyun #define CM_IOCGATR _IOWR(CM_IOC_MAGIC, 1, atreq_t *) 47*4882a593Smuzhiyun #define CM_IOCSPTS _IOW (CM_IOC_MAGIC, 2, ptsreq_t *) 48*4882a593Smuzhiyun #define CM_IOCSRDR _IO (CM_IOC_MAGIC, 3) 49*4882a593Smuzhiyun #define CM_IOCARDOFF _IO (CM_IOC_MAGIC, 4) 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun #define CM_IOSDBGLVL _IOW(CM_IOC_MAGIC, 250, int*) 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun /* card and device states */ 54*4882a593Smuzhiyun #define CM_CARD_INSERTED 0x01 55*4882a593Smuzhiyun #define CM_CARD_POWERED 0x02 56*4882a593Smuzhiyun #define CM_ATR_PRESENT 0x04 57*4882a593Smuzhiyun #define CM_ATR_VALID 0x08 58*4882a593Smuzhiyun #define CM_STATE_VALID 0x0f 59*4882a593Smuzhiyun /* extra info only from CM4000 */ 60*4882a593Smuzhiyun #define CM_NO_READER 0x10 61*4882a593Smuzhiyun #define CM_BAD_CARD 0x20 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun #endif /* _UAPI_CM4000_H_ */ 65