linux/include/linux/mmc/card.h
<<
>>
Prefs
   1/*
   2 *  linux/include/linux/mmc/card.h
   3 *
   4 * This program is free software; you can redistribute it and/or modify
   5 * it under the terms of the GNU General Public License version 2 as
   6 * published by the Free Software Foundation.
   7 *
   8 *  Card driver specific definitions.
   9 */
  10#ifndef LINUX_MMC_CARD_H
  11#define LINUX_MMC_CARD_H
  12
  13#include <linux/mmc/core.h>
  14
  15struct mmc_cid {
  16        unsigned int            manfid;
  17        char                    prod_name[8];
  18        unsigned int            serial;
  19        unsigned short          oemid;
  20        unsigned short          year;
  21        unsigned char           hwrev;
  22        unsigned char           fwrev;
  23        unsigned char           month;
  24};
  25
  26struct mmc_csd {
  27        unsigned char           mmca_vsn;
  28        unsigned short          cmdclass;
  29        unsigned short          tacc_clks;
  30        unsigned int            tacc_ns;
  31        unsigned int            r2w_factor;
  32        unsigned int            max_dtr;
  33        unsigned int            read_blkbits;
  34        unsigned int            write_blkbits;
  35        unsigned int            capacity;
  36        unsigned int            read_partial:1,
  37                                read_misalign:1,
  38                                write_partial:1,
  39                                write_misalign:1;
  40};
  41
  42struct mmc_ext_csd {
  43        unsigned int            hs_max_dtr;
  44        unsigned int            sectors;
  45};
  46
  47struct sd_scr {
  48        unsigned char           sda_vsn;
  49        unsigned char           bus_widths;
  50#define SD_SCR_BUS_WIDTH_1      (1<<0)
  51#define SD_SCR_BUS_WIDTH_4      (1<<2)
  52};
  53
  54struct sd_switch_caps {
  55        unsigned int            hs_max_dtr;
  56};
  57
  58struct sdio_cccr {
  59        unsigned int            sdio_vsn;
  60        unsigned int            sd_vsn;
  61        unsigned int            multi_block:1,
  62                                low_speed:1,
  63                                wide_bus:1,
  64                                high_power:1,
  65                                high_speed:1;
  66};
  67
  68struct sdio_cis {
  69        unsigned short          vendor;
  70        unsigned short          device;
  71        unsigned short          blksize;
  72        unsigned int            max_dtr;
  73};
  74
  75struct mmc_host;
  76struct sdio_func;
  77struct sdio_func_tuple;
  78
  79#define SDIO_MAX_FUNCS          7
  80
  81/*
  82 * MMC device
  83 */
  84struct mmc_card {
  85        struct mmc_host         *host;          /* the host this device belongs to */
  86        struct device           dev;            /* the device */
  87        unsigned int            rca;            /* relative card address of device */
  88        unsigned int            type;           /* card type */
  89#define MMC_TYPE_MMC            0               /* MMC card */
  90#define MMC_TYPE_SD             1               /* SD card */
  91#define MMC_TYPE_SDIO           2               /* SDIO card */
  92        unsigned int            state;          /* (our) card state */
  93#define MMC_STATE_PRESENT       (1<<0)          /* present in sysfs */
  94#define MMC_STATE_READONLY      (1<<1)          /* card is read-only */
  95#define MMC_STATE_HIGHSPEED     (1<<2)          /* card is in high speed mode */
  96#define MMC_STATE_BLOCKADDR     (1<<3)          /* card uses block-addressing */
  97
  98        u32                     raw_cid[4];     /* raw card CID */
  99        u32                     raw_csd[4];     /* raw card CSD */
 100        u32                     raw_scr[2];     /* raw card SCR */
 101        struct mmc_cid          cid;            /* card identification */
 102        struct mmc_csd          csd;            /* card specific */
 103        struct mmc_ext_csd      ext_csd;        /* mmc v4 extended card specific */
 104        struct sd_scr           scr;            /* extra SD information */
 105        struct sd_switch_caps   sw_caps;        /* switch (CMD6) caps */
 106
 107        unsigned int            sdio_funcs;     /* number of SDIO functions */
 108        struct sdio_cccr        cccr;           /* common card info */
 109        struct sdio_cis         cis;            /* common tuple info */
 110        struct sdio_func        *sdio_func[SDIO_MAX_FUNCS]; /* SDIO functions (devices) */
 111        unsigned                num_info;       /* number of info strings */
 112        const char              **info;         /* info strings */
 113        struct sdio_func_tuple  *tuples;        /* unknown common tuples */
 114};
 115
 116#define mmc_card_mmc(c)         ((c)->type == MMC_TYPE_MMC)
 117#define mmc_card_sd(c)          ((c)->type == MMC_TYPE_SD)
 118#define mmc_card_sdio(c)        ((c)->type == MMC_TYPE_SDIO)
 119
 120#define mmc_card_present(c)     ((c)->state & MMC_STATE_PRESENT)
 121#define mmc_card_readonly(c)    ((c)->state & MMC_STATE_READONLY)
 122#define mmc_card_highspeed(c)   ((c)->state & MMC_STATE_HIGHSPEED)
 123#define mmc_card_blockaddr(c)   ((c)->state & MMC_STATE_BLOCKADDR)
 124
 125#define mmc_card_set_present(c) ((c)->state |= MMC_STATE_PRESENT)
 126#define mmc_card_set_readonly(c) ((c)->state |= MMC_STATE_READONLY)
 127#define mmc_card_set_highspeed(c) ((c)->state |= MMC_STATE_HIGHSPEED)
 128#define mmc_card_set_blockaddr(c) ((c)->state |= MMC_STATE_BLOCKADDR)
 129
 130#define mmc_card_name(c)        ((c)->cid.prod_name)
 131#define mmc_card_id(c)          ((c)->dev.bus_id)
 132
 133#define mmc_list_to_card(l)     container_of(l, struct mmc_card, node)
 134#define mmc_get_drvdata(c)      dev_get_drvdata(&(c)->dev)
 135#define mmc_set_drvdata(c,d)    dev_set_drvdata(&(c)->dev, d)
 136
 137/*
 138 * MMC device driver (e.g., Flash card, I/O card...)
 139 */
 140struct mmc_driver {
 141        struct device_driver drv;
 142        int (*probe)(struct mmc_card *);
 143        void (*remove)(struct mmc_card *);
 144        int (*suspend)(struct mmc_card *, pm_message_t);
 145        int (*resume)(struct mmc_card *);
 146};
 147
 148extern int mmc_register_driver(struct mmc_driver *);
 149extern void mmc_unregister_driver(struct mmc_driver *);
 150
 151#endif
 152