1e29a7d73SPierre Ossman /* 2e29a7d73SPierre Ossman * include/linux/mmc/sdio_func.h 3e29a7d73SPierre Ossman * 4e29a7d73SPierre Ossman * Copyright 2007 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 12e29a7d73SPierre Ossman #ifndef MMC_SDIO_FUNC_H 13e29a7d73SPierre Ossman #define MMC_SDIO_FUNC_H 14e29a7d73SPierre Ossman 15*3b38bea0SPierre Ossman #include <linux/device.h> 16*3b38bea0SPierre Ossman #include <linux/mod_devicetable.h> 17*3b38bea0SPierre Ossman 18e29a7d73SPierre Ossman struct mmc_card; 19e29a7d73SPierre Ossman 20e29a7d73SPierre Ossman /* 21b1538bcfSNicolas Pitre * SDIO function CIS tuple (unknown to the core) 22b1538bcfSNicolas Pitre */ 23b1538bcfSNicolas Pitre struct sdio_func_tuple { 24b1538bcfSNicolas Pitre struct sdio_func_tuple *next; 25b1538bcfSNicolas Pitre unsigned char code; 26b1538bcfSNicolas Pitre unsigned char size; 27b1538bcfSNicolas Pitre unsigned char data[0]; 28b1538bcfSNicolas Pitre }; 29b1538bcfSNicolas Pitre 30b1538bcfSNicolas Pitre /* 31e29a7d73SPierre Ossman * SDIO function devices 32e29a7d73SPierre Ossman */ 33e29a7d73SPierre Ossman struct sdio_func { 34e29a7d73SPierre Ossman struct mmc_card *card; /* the card this device belongs to */ 35e29a7d73SPierre Ossman struct device dev; /* the device */ 36e29a7d73SPierre Ossman unsigned int num; /* function number */ 370597007fSPierre Ossman 380597007fSPierre Ossman unsigned char class; /* standard interface class */ 390597007fSPierre Ossman unsigned short vendor; /* vendor id */ 400597007fSPierre Ossman unsigned short device; /* device id */ 410597007fSPierre Ossman 421a632f8cSPierre Ossman unsigned short blksize; /* maximum block size */ 431a632f8cSPierre Ossman 44e29a7d73SPierre Ossman unsigned int state; /* function state */ 45e29a7d73SPierre Ossman #define SDIO_STATE_PRESENT (1<<0) /* present in sysfs */ 46b1538bcfSNicolas Pitre 47b1538bcfSNicolas Pitre struct sdio_func_tuple *tuples; 48e29a7d73SPierre Ossman }; 49e29a7d73SPierre Ossman 50e29a7d73SPierre Ossman #define sdio_func_present(f) ((f)->state & SDIO_STATE_PRESENT) 51e29a7d73SPierre Ossman 52e29a7d73SPierre Ossman #define sdio_func_set_present(f) ((f)->state |= SDIO_STATE_PRESENT) 53e29a7d73SPierre Ossman 54e29a7d73SPierre Ossman #define sdio_func_id(f) ((f)->dev.bus_id) 55e29a7d73SPierre Ossman 56f76c8515SPierre Ossman #define sdio_get_drvdata(f) dev_get_drvdata(&(f)->dev) 57f76c8515SPierre Ossman #define sdio_set_drvdata(f,d) dev_set_drvdata(&(f)->dev, d) 58f76c8515SPierre Ossman 59f76c8515SPierre Ossman /* 60f76c8515SPierre Ossman * SDIO function device driver 61f76c8515SPierre Ossman */ 62f76c8515SPierre Ossman struct sdio_driver { 63f76c8515SPierre Ossman char *name; 64*3b38bea0SPierre Ossman const struct sdio_device_id *id_table; 65f76c8515SPierre Ossman 66*3b38bea0SPierre Ossman int (*probe)(struct sdio_func *, const struct sdio_device_id *); 67f76c8515SPierre Ossman void (*remove)(struct sdio_func *); 68f76c8515SPierre Ossman 69f76c8515SPierre Ossman struct device_driver drv; 70f76c8515SPierre Ossman }; 71f76c8515SPierre Ossman 72*3b38bea0SPierre Ossman /** 73*3b38bea0SPierre Ossman * SDIO_DEVICE - macro used to describe a specific SDIO device 74*3b38bea0SPierre Ossman * @vend: the 16 bit manufacturer code 75*3b38bea0SPierre Ossman * @dev: the 16 bit function id 76*3b38bea0SPierre Ossman * 77*3b38bea0SPierre Ossman * This macro is used to create a struct sdio_device_id that matches a 78*3b38bea0SPierre Ossman * specific device. The class field will be set to SDIO_ANY_ID. 79*3b38bea0SPierre Ossman */ 80*3b38bea0SPierre Ossman #define SDIO_DEVICE(vend,dev) \ 81*3b38bea0SPierre Ossman .class = SDIO_ANY_ID, \ 82*3b38bea0SPierre Ossman .vendor = (vend), .device = (dev) 83*3b38bea0SPierre Ossman 84*3b38bea0SPierre Ossman /** 85*3b38bea0SPierre Ossman * SDIO_DEVICE_CLASS - macro used to describe a specific SDIO device class 86*3b38bea0SPierre Ossman * @dev_class: the 8 bit standard interface code 87*3b38bea0SPierre Ossman * 88*3b38bea0SPierre Ossman * This macro is used to create a struct sdio_device_id that matches a 89*3b38bea0SPierre Ossman * specific standard SDIO function type. The vendor and device fields will 90*3b38bea0SPierre Ossman * be set to SDIO_ANY_ID. 91*3b38bea0SPierre Ossman */ 92*3b38bea0SPierre Ossman #define SDIO_DEVICE_CLASS(dev_class) \ 93*3b38bea0SPierre Ossman .class = (dev_class), \ 94*3b38bea0SPierre Ossman .vendor = SDIO_ANY_ID, .device = SDIO_ANY_ID 95*3b38bea0SPierre Ossman 96f76c8515SPierre Ossman extern int sdio_register_driver(struct sdio_driver *); 97f76c8515SPierre Ossman extern void sdio_unregister_driver(struct sdio_driver *); 98f76c8515SPierre Ossman 9946f555f2SPierre Ossman /* 10046f555f2SPierre Ossman * SDIO I/O operations 10146f555f2SPierre Ossman */ 10246f555f2SPierre Ossman extern void sdio_claim_host(struct sdio_func *func); 10346f555f2SPierre Ossman extern void sdio_release_host(struct sdio_func *func); 10446f555f2SPierre Ossman 105fa64efa1SPierre Ossman extern int sdio_enable_func(struct sdio_func *func); 106fa64efa1SPierre Ossman extern int sdio_disable_func(struct sdio_func *func); 107fa64efa1SPierre Ossman 10846f555f2SPierre Ossman extern unsigned char sdio_readb(struct sdio_func *func, 10946f555f2SPierre Ossman unsigned int addr, int *err_ret); 11046f555f2SPierre Ossman 11146f555f2SPierre Ossman extern void sdio_writeb(struct sdio_func *func, unsigned char b, 11246f555f2SPierre Ossman unsigned int addr, int *err_ret); 11346f555f2SPierre Ossman 114e29a7d73SPierre Ossman #endif 115e29a7d73SPierre Ossman 116