1e29a7d73SPierre Ossman /* 2e29a7d73SPierre Ossman * include/linux/mmc/sdio_func.h 3e29a7d73SPierre Ossman * 4ad3868b2SPierre Ossman * Copyright 2007-2008 Pierre Ossman 5e29a7d73SPierre Ossman * 6e29a7d73SPierre Ossman * This program is free software; you can redistribute it and/or modify 7e29a7d73SPierre Ossman * it under the terms of the GNU General Public License as published by 8e29a7d73SPierre Ossman * the Free Software Foundation; either version 2 of the License, or (at 9e29a7d73SPierre Ossman * your option) any later version. 10e29a7d73SPierre Ossman */ 11e29a7d73SPierre Ossman 12*100e9186SRobert P. J. Day #ifndef LINUX_MMC_SDIO_FUNC_H 13*100e9186SRobert P. J. Day #define LINUX_MMC_SDIO_FUNC_H 14e29a7d73SPierre Ossman 153b38bea0SPierre Ossman #include <linux/device.h> 163b38bea0SPierre Ossman #include <linux/mod_devicetable.h> 173b38bea0SPierre Ossman 18da68c4ebSNicolas Pitre #include <linux/mmc/pm.h> 19da68c4ebSNicolas Pitre 20e29a7d73SPierre Ossman struct mmc_card; 21d1496c39SNicolas Pitre struct sdio_func; 22d1496c39SNicolas Pitre 23d1496c39SNicolas Pitre typedef void (sdio_irq_handler_t)(struct sdio_func *); 24e29a7d73SPierre Ossman 25e29a7d73SPierre Ossman /* 26b1538bcfSNicolas Pitre * SDIO function CIS tuple (unknown to the core) 27b1538bcfSNicolas Pitre */ 28b1538bcfSNicolas Pitre struct sdio_func_tuple { 29b1538bcfSNicolas Pitre struct sdio_func_tuple *next; 30b1538bcfSNicolas Pitre unsigned char code; 31b1538bcfSNicolas Pitre unsigned char size; 32b1538bcfSNicolas Pitre unsigned char data[0]; 33b1538bcfSNicolas Pitre }; 34b1538bcfSNicolas Pitre 35b1538bcfSNicolas Pitre /* 36e29a7d73SPierre Ossman * SDIO function devices 37e29a7d73SPierre Ossman */ 38e29a7d73SPierre Ossman struct sdio_func { 39e29a7d73SPierre Ossman struct mmc_card *card; /* the card this device belongs to */ 40e29a7d73SPierre Ossman struct device dev; /* the device */ 41d1496c39SNicolas Pitre sdio_irq_handler_t *irq_handler; /* IRQ callback */ 42e29a7d73SPierre Ossman unsigned int num; /* function number */ 430597007fSPierre Ossman 440597007fSPierre Ossman unsigned char class; /* standard interface class */ 450597007fSPierre Ossman unsigned short vendor; /* vendor id */ 460597007fSPierre Ossman unsigned short device; /* device id */ 470597007fSPierre Ossman 489a08f82bSDavid Vrabel unsigned max_blksize; /* maximum block size */ 499a08f82bSDavid Vrabel unsigned cur_blksize; /* current block size */ 501a632f8cSPierre Ossman 5162a7573eSBenzi Zbit unsigned enable_timeout; /* max enable timeout in msec */ 5262a7573eSBenzi Zbit 53e29a7d73SPierre Ossman unsigned int state; /* function state */ 54e29a7d73SPierre Ossman #define SDIO_STATE_PRESENT (1<<0) /* present in sysfs */ 55b1538bcfSNicolas Pitre 56112c9db9SPierre Ossman u8 tmpbuf[4]; /* DMA:able scratch buffer */ 57112c9db9SPierre Ossman 58759bdc7aSPierre Ossman unsigned num_info; /* number of info strings */ 59759bdc7aSPierre Ossman const char **info; /* info strings */ 60759bdc7aSPierre Ossman 61b1538bcfSNicolas Pitre struct sdio_func_tuple *tuples; 62e29a7d73SPierre Ossman }; 63e29a7d73SPierre Ossman 64e29a7d73SPierre Ossman #define sdio_func_present(f) ((f)->state & SDIO_STATE_PRESENT) 65e29a7d73SPierre Ossman 66e29a7d73SPierre Ossman #define sdio_func_set_present(f) ((f)->state |= SDIO_STATE_PRESENT) 67e29a7d73SPierre Ossman 68d1b26863SKay Sievers #define sdio_func_id(f) (dev_name(&(f)->dev)) 69e29a7d73SPierre Ossman 70f76c8515SPierre Ossman #define sdio_get_drvdata(f) dev_get_drvdata(&(f)->dev) 71f76c8515SPierre Ossman #define sdio_set_drvdata(f,d) dev_set_drvdata(&(f)->dev, d) 72996ad568SNicolas Pitre #define dev_to_sdio_func(d) container_of(d, struct sdio_func, dev) 73f76c8515SPierre Ossman 74f76c8515SPierre Ossman /* 75f76c8515SPierre Ossman * SDIO function device driver 76f76c8515SPierre Ossman */ 77f76c8515SPierre Ossman struct sdio_driver { 78f76c8515SPierre Ossman char *name; 793b38bea0SPierre Ossman const struct sdio_device_id *id_table; 80f76c8515SPierre Ossman 813b38bea0SPierre Ossman int (*probe)(struct sdio_func *, const struct sdio_device_id *); 82f76c8515SPierre Ossman void (*remove)(struct sdio_func *); 83f76c8515SPierre Ossman 84f76c8515SPierre Ossman struct device_driver drv; 85f76c8515SPierre Ossman }; 86f76c8515SPierre Ossman 87996ad568SNicolas Pitre #define to_sdio_driver(d) container_of(d, struct sdio_driver, drv) 88996ad568SNicolas Pitre 893b38bea0SPierre Ossman /** 903b38bea0SPierre Ossman * SDIO_DEVICE - macro used to describe a specific SDIO device 913b38bea0SPierre Ossman * @vend: the 16 bit manufacturer code 923b38bea0SPierre Ossman * @dev: the 16 bit function id 933b38bea0SPierre Ossman * 943b38bea0SPierre Ossman * This macro is used to create a struct sdio_device_id that matches a 953b38bea0SPierre Ossman * specific device. The class field will be set to SDIO_ANY_ID. 963b38bea0SPierre Ossman */ 973b38bea0SPierre Ossman #define SDIO_DEVICE(vend,dev) \ 983b38bea0SPierre Ossman .class = SDIO_ANY_ID, \ 993b38bea0SPierre Ossman .vendor = (vend), .device = (dev) 1003b38bea0SPierre Ossman 1013b38bea0SPierre Ossman /** 1023b38bea0SPierre Ossman * SDIO_DEVICE_CLASS - macro used to describe a specific SDIO device class 1033b38bea0SPierre Ossman * @dev_class: the 8 bit standard interface code 1043b38bea0SPierre Ossman * 1053b38bea0SPierre Ossman * This macro is used to create a struct sdio_device_id that matches a 1063b38bea0SPierre Ossman * specific standard SDIO function type. The vendor and device fields will 1073b38bea0SPierre Ossman * be set to SDIO_ANY_ID. 1083b38bea0SPierre Ossman */ 1093b38bea0SPierre Ossman #define SDIO_DEVICE_CLASS(dev_class) \ 1103b38bea0SPierre Ossman .class = (dev_class), \ 1113b38bea0SPierre Ossman .vendor = SDIO_ANY_ID, .device = SDIO_ANY_ID 1123b38bea0SPierre Ossman 113f76c8515SPierre Ossman extern int sdio_register_driver(struct sdio_driver *); 114f76c8515SPierre Ossman extern void sdio_unregister_driver(struct sdio_driver *); 115f76c8515SPierre Ossman 11646f555f2SPierre Ossman /* 11746f555f2SPierre Ossman * SDIO I/O operations 11846f555f2SPierre Ossman */ 11946f555f2SPierre Ossman extern void sdio_claim_host(struct sdio_func *func); 12046f555f2SPierre Ossman extern void sdio_release_host(struct sdio_func *func); 12146f555f2SPierre Ossman 122fa64efa1SPierre Ossman extern int sdio_enable_func(struct sdio_func *func); 123fa64efa1SPierre Ossman extern int sdio_disable_func(struct sdio_func *func); 124fa64efa1SPierre Ossman 1259a08f82bSDavid Vrabel extern int sdio_set_block_size(struct sdio_func *func, unsigned blksz); 1269a08f82bSDavid Vrabel 127d1496c39SNicolas Pitre extern int sdio_claim_irq(struct sdio_func *func, sdio_irq_handler_t *handler); 128d1496c39SNicolas Pitre extern int sdio_release_irq(struct sdio_func *func); 129d1496c39SNicolas Pitre 130ad3868b2SPierre Ossman extern unsigned int sdio_align_size(struct sdio_func *func, unsigned int sz); 131ad3868b2SPierre Ossman 1326d373331STomas Winkler extern u8 sdio_readb(struct sdio_func *func, unsigned int addr, int *err_ret); 1336d373331STomas Winkler extern u16 sdio_readw(struct sdio_func *func, unsigned int addr, int *err_ret); 1346d373331STomas Winkler extern u32 sdio_readl(struct sdio_func *func, unsigned int addr, int *err_ret); 135112c9db9SPierre Ossman 136112c9db9SPierre Ossman extern int sdio_memcpy_fromio(struct sdio_func *func, void *dst, 137112c9db9SPierre Ossman unsigned int addr, int count); 138112c9db9SPierre Ossman extern int sdio_readsb(struct sdio_func *func, void *dst, 139112c9db9SPierre Ossman unsigned int addr, int count); 14046f555f2SPierre Ossman 1416d373331STomas Winkler extern void sdio_writeb(struct sdio_func *func, u8 b, 14246f555f2SPierre Ossman unsigned int addr, int *err_ret); 1436d373331STomas Winkler extern void sdio_writew(struct sdio_func *func, u16 b, 144112c9db9SPierre Ossman unsigned int addr, int *err_ret); 1456d373331STomas Winkler extern void sdio_writel(struct sdio_func *func, u32 b, 146112c9db9SPierre Ossman unsigned int addr, int *err_ret); 147112c9db9SPierre Ossman 1486c1f716eSGrazvydas Ignotas extern u8 sdio_writeb_readb(struct sdio_func *func, u8 write_byte, 1496c1f716eSGrazvydas Ignotas unsigned int addr, int *err_ret); 1506c1f716eSGrazvydas Ignotas 151112c9db9SPierre Ossman extern int sdio_memcpy_toio(struct sdio_func *func, unsigned int addr, 152112c9db9SPierre Ossman void *src, int count); 153112c9db9SPierre Ossman extern int sdio_writesb(struct sdio_func *func, unsigned int addr, 154112c9db9SPierre Ossman void *src, int count); 15546f555f2SPierre Ossman 1567806cdb4SDavid Vrabel extern unsigned char sdio_f0_readb(struct sdio_func *func, 1577806cdb4SDavid Vrabel unsigned int addr, int *err_ret); 1587806cdb4SDavid Vrabel extern void sdio_f0_writeb(struct sdio_func *func, unsigned char b, 1597806cdb4SDavid Vrabel unsigned int addr, int *err_ret); 1607806cdb4SDavid Vrabel 161da68c4ebSNicolas Pitre extern mmc_pm_flag_t sdio_get_host_pm_caps(struct sdio_func *func); 162da68c4ebSNicolas Pitre extern int sdio_set_host_pm_flags(struct sdio_func *func, mmc_pm_flag_t flags); 163da68c4ebSNicolas Pitre 164*100e9186SRobert P. J. Day #endif /* LINUX_MMC_SDIO_FUNC_H */ 165