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        u8                      rev;
  44        unsigned int            sa_timeout;             /* Units: 100ns */
  45        unsigned int            hs_max_dtr;
  46        unsigned int            sectors;
  47};
  48
  49struct sd_scr {
  50        unsigned char           sda_vsn;
  51        unsigned char           bus_widths;
  52#define SD_SCR_BUS_WIDTH_1      (1<<0)
  53#define SD_SCR_BUS_WIDTH_4      (1<<2)
  54};
  55
  56struct sd_switch_caps {
  57        unsigned int            hs_max_dtr;
  58};
  59
  60struct sdio_cccr {
  61        unsigned int            sdio_vsn;
  62        unsigned int            sd_vsn;
  63        unsigned int            multi_block:1,
  64                                low_speed:1,
  65                                wide_bus:1,
  66                                high_power:1,
  67                                high_speed:1,
  68                                disable_cd:1;
  69};
  70
  71struct sdio_cis {
  72        unsigned short          vendor;
  73        unsigned short          device;
  74        unsigned short          blksize;
  75        unsigned int            max_dtr;
  76};
  77
  78struct mmc_host;
  79struct sdio_func;
  80struct sdio_func_tuple;
  81
  82#define SDIO_MAX_FUNCS          7
  83
  84/*
  85 * MMC device
  86 */
  87struct mmc_card {
  88        struct mmc_host         *host;          /* the host this device belongs to */
  89        struct device           dev;            /* the device */
  90        unsigned int            rca;            /* relative card address of device */
  91        unsigned int            type;           /* card type */
  92#define MMC_TYPE_MMC            0               /* MMC card */
  93#define MMC_TYPE_SD             1               /* SD card */
  94#define MMC_TYPE_SDIO           2               /* SDIO card */
  95        unsigned int            state;          /* (our) card state */
  96#define MMC_STATE_PRESENT       (1<<0)          /* present in sysfs */
  97#define MMC_STATE_READONLY      (1<<1)          /* card is read-only */
  98#define MMC_STATE_HIGHSPEED     (1<<2)          /* card is in high speed mode */
  99#define MMC_STATE_BLOCKADDR     (1<<3)          /* card uses block-addressing */
 100        unsigned int            quirks;         /* card quirks */
 101#define MMC_QUIRK_LENIENT_FN0   (1<<0)          /* allow SDIO FN0 writes outside of the VS CCCR range */
 102
 103        u32                     raw_cid[4];     /* raw card CID */
 104        u32                     raw_csd[4];     /* raw card CSD */
 105        u32                     raw_scr[2];     /* raw card SCR */
 106        struct mmc_cid          cid;            /* card identification */
 107        struct mmc_csd          csd;            /* card specific */
 108        struct mmc_ext_csd      ext_csd;        /* mmc v4 extended card specific */
 109        struct sd_scr           scr;            /* extra SD information */
 110        struct sd_switch_caps   sw_caps;        /* switch (CMD6) caps */
 111
 112        unsigned int            sdio_funcs;     /* number of SDIO functions */
 113        struct sdio_cccr        cccr;           /* common card info */
 114        struct sdio_cis         cis;            /* common tuple info */
 115        struct sdio_func        *sdio_func[SDIO_MAX_FUNCS]; /* SDIO functions (devices) */
 116        unsigned                num_info;       /* number of info strings */
 117        const char              **info;         /* info strings */
 118        struct sdio_func_tuple  *tuples;        /* unknown common tuples */
 119
 120        struct dentry           *debugfs_root;
 121};
 122
 123#define mmc_card_mmc(c)         ((c)->type == MMC_TYPE_MMC)
 124#define mmc_card_sd(c)          ((c)->type == MMC_TYPE_SD)
 125#define mmc_card_sdio(c)        ((c)->type == MMC_TYPE_SDIO)
 126
 127#define mmc_card_present(c)     ((c)->state & MMC_STATE_PRESENT)
 128#define mmc_card_readonly(c)    ((c)->state & MMC_STATE_READONLY)
 129#define mmc_card_highspeed(c)   ((c)->state & MMC_STATE_HIGHSPEED)
 130#define mmc_card_blockaddr(c)   ((c)->state & MMC_STATE_BLOCKADDR)
 131
 132#define mmc_card_set_present(c) ((c)->state |= MMC_STATE_PRESENT)
 133#define mmc_card_set_readonly(c) ((c)->state |= MMC_STATE_READONLY)
 134#define mmc_card_set_highspeed(c) ((c)->state |= MMC_STATE_HIGHSPEED)
 135#define mmc_card_set_blockaddr(c) ((c)->state |= MMC_STATE_BLOCKADDR)
 136
 137static inline int mmc_card_lenient_fn0(const struct mmc_card *c)
 138{
 139        return c->quirks & MMC_QUIRK_LENIENT_FN0;
 140}
 141
 142#define mmc_card_name(c)        ((c)->cid.prod_name)
 143#define mmc_card_id(c)          (dev_name(&(c)->dev))
 144
 145#define mmc_list_to_card(l)     container_of(l, struct mmc_card, node)
 146#define mmc_get_drvdata(c)      dev_get_drvdata(&(c)->dev)
 147#define mmc_set_drvdata(c,d)    dev_set_drvdata(&(c)->dev, d)
 148
 149/*
 150 * MMC device driver (e.g., Flash card, I/O card...)
 151 */
 152struct mmc_driver {
 153        struct device_driver drv;
 154        int (*probe)(struct mmc_card *);
 155        void (*remove)(struct mmc_card *);
 156        int (*suspend)(struct mmc_card *, pm_message_t);
 157        int (*resume)(struct mmc_card *);
 158};
 159
 160extern int mmc_register_driver(struct mmc_driver *);
 161extern void mmc_unregister_driver(struct mmc_driver *);
 162
 163#endif
 164