1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * include/linux/mmc/sdio_func.h 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright 2007-2008 Pierre Ossman 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #ifndef LINUX_MMC_SDIO_FUNC_H 9*4882a593Smuzhiyun #define LINUX_MMC_SDIO_FUNC_H 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #include <linux/device.h> 12*4882a593Smuzhiyun #include <linux/mod_devicetable.h> 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #include <linux/mmc/pm.h> 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun struct mmc_card; 17*4882a593Smuzhiyun struct sdio_func; 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun typedef void (sdio_irq_handler_t)(struct sdio_func *); 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun /* 22*4882a593Smuzhiyun * SDIO function CIS tuple (unknown to the core) 23*4882a593Smuzhiyun */ 24*4882a593Smuzhiyun struct sdio_func_tuple { 25*4882a593Smuzhiyun struct sdio_func_tuple *next; 26*4882a593Smuzhiyun unsigned char code; 27*4882a593Smuzhiyun unsigned char size; 28*4882a593Smuzhiyun unsigned char data[]; 29*4882a593Smuzhiyun }; 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun /* 32*4882a593Smuzhiyun * SDIO function devices 33*4882a593Smuzhiyun */ 34*4882a593Smuzhiyun struct sdio_func { 35*4882a593Smuzhiyun struct mmc_card *card; /* the card this device belongs to */ 36*4882a593Smuzhiyun struct device dev; /* the device */ 37*4882a593Smuzhiyun sdio_irq_handler_t *irq_handler; /* IRQ callback */ 38*4882a593Smuzhiyun unsigned int num; /* function number */ 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun unsigned char class; /* standard interface class */ 41*4882a593Smuzhiyun unsigned short vendor; /* vendor id */ 42*4882a593Smuzhiyun unsigned short device; /* device id */ 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun unsigned max_blksize; /* maximum block size */ 45*4882a593Smuzhiyun unsigned cur_blksize; /* current block size */ 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun unsigned enable_timeout; /* max enable timeout in msec */ 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun unsigned int state; /* function state */ 50*4882a593Smuzhiyun #define SDIO_STATE_PRESENT (1<<0) /* present in sysfs */ 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun u8 *tmpbuf; /* DMA:able scratch buffer */ 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun u8 major_rev; /* major revision number */ 55*4882a593Smuzhiyun u8 minor_rev; /* minor revision number */ 56*4882a593Smuzhiyun unsigned num_info; /* number of info strings */ 57*4882a593Smuzhiyun const char **info; /* info strings */ 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun struct sdio_func_tuple *tuples; 60*4882a593Smuzhiyun }; 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun #define sdio_func_present(f) ((f)->state & SDIO_STATE_PRESENT) 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun #define sdio_func_set_present(f) ((f)->state |= SDIO_STATE_PRESENT) 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun #define sdio_func_id(f) (dev_name(&(f)->dev)) 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun #define sdio_get_drvdata(f) dev_get_drvdata(&(f)->dev) 69*4882a593Smuzhiyun #define sdio_set_drvdata(f,d) dev_set_drvdata(&(f)->dev, d) 70*4882a593Smuzhiyun #define dev_to_sdio_func(d) container_of(d, struct sdio_func, dev) 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun /* 73*4882a593Smuzhiyun * SDIO function device driver 74*4882a593Smuzhiyun */ 75*4882a593Smuzhiyun struct sdio_driver { 76*4882a593Smuzhiyun char *name; 77*4882a593Smuzhiyun const struct sdio_device_id *id_table; 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun int (*probe)(struct sdio_func *, const struct sdio_device_id *); 80*4882a593Smuzhiyun void (*remove)(struct sdio_func *); 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun struct device_driver drv; 83*4882a593Smuzhiyun }; 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun /** 86*4882a593Smuzhiyun * SDIO_DEVICE - macro used to describe a specific SDIO device 87*4882a593Smuzhiyun * @vend: the 16 bit manufacturer code 88*4882a593Smuzhiyun * @dev: the 16 bit function id 89*4882a593Smuzhiyun * 90*4882a593Smuzhiyun * This macro is used to create a struct sdio_device_id that matches a 91*4882a593Smuzhiyun * specific device. The class field will be set to SDIO_ANY_ID. 92*4882a593Smuzhiyun */ 93*4882a593Smuzhiyun #define SDIO_DEVICE(vend,dev) \ 94*4882a593Smuzhiyun .class = SDIO_ANY_ID, \ 95*4882a593Smuzhiyun .vendor = (vend), .device = (dev) 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun /** 98*4882a593Smuzhiyun * SDIO_DEVICE_CLASS - macro used to describe a specific SDIO device class 99*4882a593Smuzhiyun * @dev_class: the 8 bit standard interface code 100*4882a593Smuzhiyun * 101*4882a593Smuzhiyun * This macro is used to create a struct sdio_device_id that matches a 102*4882a593Smuzhiyun * specific standard SDIO function type. The vendor and device fields will 103*4882a593Smuzhiyun * be set to SDIO_ANY_ID. 104*4882a593Smuzhiyun */ 105*4882a593Smuzhiyun #define SDIO_DEVICE_CLASS(dev_class) \ 106*4882a593Smuzhiyun .class = (dev_class), \ 107*4882a593Smuzhiyun .vendor = SDIO_ANY_ID, .device = SDIO_ANY_ID 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun extern int sdio_register_driver(struct sdio_driver *); 110*4882a593Smuzhiyun extern void sdio_unregister_driver(struct sdio_driver *); 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun /** 113*4882a593Smuzhiyun * module_sdio_driver() - Helper macro for registering a SDIO driver 114*4882a593Smuzhiyun * @__sdio_driver: sdio_driver struct 115*4882a593Smuzhiyun * 116*4882a593Smuzhiyun * Helper macro for SDIO drivers which do not do anything special in module 117*4882a593Smuzhiyun * init/exit. This eliminates a lot of boilerplate. Each module may only 118*4882a593Smuzhiyun * use this macro once, and calling it replaces module_init() and module_exit() 119*4882a593Smuzhiyun */ 120*4882a593Smuzhiyun #define module_sdio_driver(__sdio_driver) \ 121*4882a593Smuzhiyun module_driver(__sdio_driver, sdio_register_driver, \ 122*4882a593Smuzhiyun sdio_unregister_driver) 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun /* 125*4882a593Smuzhiyun * SDIO I/O operations 126*4882a593Smuzhiyun */ 127*4882a593Smuzhiyun extern void sdio_claim_host(struct sdio_func *func); 128*4882a593Smuzhiyun extern void sdio_release_host(struct sdio_func *func); 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun extern int sdio_enable_func(struct sdio_func *func); 131*4882a593Smuzhiyun extern int sdio_disable_func(struct sdio_func *func); 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun extern int sdio_set_block_size(struct sdio_func *func, unsigned blksz); 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun extern int sdio_claim_irq(struct sdio_func *func, sdio_irq_handler_t *handler); 136*4882a593Smuzhiyun extern int sdio_release_irq(struct sdio_func *func); 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun extern unsigned int sdio_align_size(struct sdio_func *func, unsigned int sz); 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun extern u8 sdio_readb(struct sdio_func *func, unsigned int addr, int *err_ret); 141*4882a593Smuzhiyun extern u16 sdio_readw(struct sdio_func *func, unsigned int addr, int *err_ret); 142*4882a593Smuzhiyun extern u32 sdio_readl(struct sdio_func *func, unsigned int addr, int *err_ret); 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun extern int sdio_memcpy_fromio(struct sdio_func *func, void *dst, 145*4882a593Smuzhiyun unsigned int addr, int count); 146*4882a593Smuzhiyun extern int sdio_readsb(struct sdio_func *func, void *dst, 147*4882a593Smuzhiyun unsigned int addr, int count); 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun extern void sdio_writeb(struct sdio_func *func, u8 b, 150*4882a593Smuzhiyun unsigned int addr, int *err_ret); 151*4882a593Smuzhiyun extern void sdio_writew(struct sdio_func *func, u16 b, 152*4882a593Smuzhiyun unsigned int addr, int *err_ret); 153*4882a593Smuzhiyun extern void sdio_writel(struct sdio_func *func, u32 b, 154*4882a593Smuzhiyun unsigned int addr, int *err_ret); 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun extern u8 sdio_writeb_readb(struct sdio_func *func, u8 write_byte, 157*4882a593Smuzhiyun unsigned int addr, int *err_ret); 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun extern int sdio_memcpy_toio(struct sdio_func *func, unsigned int addr, 160*4882a593Smuzhiyun void *src, int count); 161*4882a593Smuzhiyun extern int sdio_writesb(struct sdio_func *func, unsigned int addr, 162*4882a593Smuzhiyun void *src, int count); 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun extern unsigned char sdio_f0_readb(struct sdio_func *func, 165*4882a593Smuzhiyun unsigned int addr, int *err_ret); 166*4882a593Smuzhiyun extern void sdio_f0_writeb(struct sdio_func *func, unsigned char b, 167*4882a593Smuzhiyun unsigned int addr, int *err_ret); 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun extern mmc_pm_flag_t sdio_get_host_pm_caps(struct sdio_func *func); 170*4882a593Smuzhiyun extern int sdio_set_host_pm_flags(struct sdio_func *func, mmc_pm_flag_t flags); 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun extern void sdio_retune_crc_disable(struct sdio_func *func); 173*4882a593Smuzhiyun extern void sdio_retune_crc_enable(struct sdio_func *func); 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun extern void sdio_retune_hold_now(struct sdio_func *func); 176*4882a593Smuzhiyun extern void sdio_retune_release(struct sdio_func *func); 177*4882a593Smuzhiyun 178*4882a593Smuzhiyun #endif /* LINUX_MMC_SDIO_FUNC_H */ 179