Guest User

Untitled

a guest
Feb 17th, 2013
163
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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. #include <linux/mod_devicetable.h>
  15.  
  16. struct mmc_cid {
  17.     unsigned int        manfid;
  18.     char                prod_name[8];
  19.     unsigned int        serial;
  20.     unsigned short      oemid;
  21.     unsigned short      year;
  22.     unsigned char       hwrev;
  23.     unsigned char       fwrev;
  24.     unsigned char       month;
  25. };
  26.  
  27. struct mmc_csd {
  28.     unsigned char       structure;
  29.     unsigned char       mmca_vsn;
  30.     unsigned short      cmdclass;
  31.     unsigned short      tacc_clks;
  32.     unsigned int        tacc_ns;
  33.     unsigned int        c_size;
  34.     unsigned int        r2w_factor;
  35.     unsigned int        max_dtr;
  36.     unsigned int        erase_size;     /* In sectors */
  37.     unsigned int        read_blkbits;
  38.     unsigned int        write_blkbits;
  39.     unsigned int        capacity;
  40.     unsigned int        read_partial:1,
  41.                 read_misalign:1,
  42.                 write_partial:1,
  43.                 write_misalign:1;
  44. };
  45.  
  46. struct mmc_ext_csd {
  47.     u8          rev;
  48.     u8          erase_group_def;
  49.     u8          sec_feature_support;
  50.     u8          rel_sectors;
  51.     u8          rel_param;
  52.     u8          part_config;
  53.     u8          boot_part_prot;
  54.     u8          rst_n_function;
  55.     u8          cache_ctrl;
  56.     u8          max_packed_writes;
  57.     u8          max_packed_reads;
  58.     u8          packed_event_en;
  59.     unsigned int        part_time;      /* Units: ms */
  60.     unsigned int        sa_timeout;     /* Units: 100ns */
  61.     unsigned int        generic_cmd6_time;  /* Units: 10ms */
  62.     unsigned int            power_off_longtime;     /* Units: ms */
  63.     unsigned int        hs_max_dtr;
  64.     unsigned int        sectors;
  65.     unsigned int        card_type;
  66.     unsigned int        hc_erase_size;      /* In sectors */
  67.     unsigned int        hc_erase_timeout;   /* In milliseconds */
  68.     unsigned int        sec_trim_mult;  /* Secure trim multiplier  */
  69.     unsigned int        sec_erase_mult; /* Secure erase multiplier */
  70.     unsigned int        trim_timeout;       /* In milliseconds */
  71.     bool            enhanced_area_en;   /* enable bit */
  72.     unsigned long long  enhanced_area_offset;   /* Units: Byte */
  73.     unsigned int        enhanced_area_size; /* Units: KB */
  74.     unsigned int        boot_size;      /* in bytes */
  75.     unsigned int        cache_size;     /* Units: KB */
  76.     bool            hpi_en;         /* HPI enablebit */
  77.     bool            hpi;            /* HPI support bit */
  78.     unsigned int        hpi_cmd;        /* cmd used as HPI */
  79.     u8          raw_partition_support;  /* 160 */
  80.     u8          raw_erased_mem_count;   /* 181 */
  81.     u8          raw_ext_csd_structure;  /* 194 */
  82.     u8          raw_card_type;      /* 196 */
  83.     u8          out_of_int_time;    /* 198 */
  84.     u8          raw_s_a_timeout;        /* 217 */
  85.     u8          raw_hc_erase_gap_size;  /* 221 */
  86.     u8          raw_erase_timeout_mult; /* 223 */
  87.     u8          raw_hc_erase_grp_size;  /* 224 */
  88.     u8          raw_sec_trim_mult;  /* 229 */
  89.     u8          raw_sec_erase_mult; /* 230 */
  90.     u8          raw_sec_feature_support;/* 231 */
  91.     u8          raw_trim_mult;      /* 232 */
  92.     u8          raw_sectors[4];     /* 212 - 4 bytes */
  93.  
  94.     unsigned int            feature_support;
  95. #define MMC_DISCARD_FEATURE BIT(0)                  /* CMD38 feature */
  96. };
  97.  
  98. struct sd_scr {
  99.     unsigned char       sda_vsn;
  100.     unsigned char       sda_spec3;
  101.     unsigned char       bus_widths;
  102. #define SD_SCR_BUS_WIDTH_1  (1<<0)
  103. #define SD_SCR_BUS_WIDTH_4  (1<<2)
  104.     unsigned char       cmds;
  105. #define SD_SCR_CMD20_SUPPORT   (1<<0)
  106. #define SD_SCR_CMD23_SUPPORT   (1<<1)
  107. };
  108.  
  109. struct sd_ssr {
  110.     unsigned int        au;         /* In sectors */
  111.     unsigned int        erase_timeout;      /* In milliseconds */
  112.     unsigned int        erase_offset;       /* In milliseconds */
  113. };
  114.  
  115. struct sd_switch_caps {
  116.     unsigned int        hs_max_dtr;
  117.     unsigned int        uhs_max_dtr;
  118. #define UHS_SDR104_MAX_DTR  208000000
  119. #define UHS_SDR50_MAX_DTR   100000000
  120. #define UHS_DDR50_MAX_DTR   50000000
  121. #define UHS_SDR25_MAX_DTR   UHS_DDR50_MAX_DTR
  122. #define UHS_SDR12_MAX_DTR   25000000
  123.     unsigned int        sd3_bus_mode;
  124. #define UHS_SDR12_BUS_SPEED 0
  125. #define UHS_SDR25_BUS_SPEED 1
  126. #define UHS_SDR50_BUS_SPEED 2
  127. #define UHS_SDR104_BUS_SPEED    3
  128. #define UHS_DDR50_BUS_SPEED 4
  129.  
  130. #define SD_MODE_UHS_SDR12   (1 << UHS_SDR12_BUS_SPEED)
  131. #define SD_MODE_UHS_SDR25   (1 << UHS_SDR25_BUS_SPEED)
  132. #define SD_MODE_UHS_SDR50   (1 << UHS_SDR50_BUS_SPEED)
  133. #define SD_MODE_UHS_SDR104  (1 << UHS_SDR104_BUS_SPEED)
  134. #define SD_MODE_UHS_DDR50   (1 << UHS_DDR50_BUS_SPEED)
  135.     unsigned int        sd3_drv_type;
  136. #define SD_DRIVER_TYPE_B    0x01
  137. #define SD_DRIVER_TYPE_A    0x02
  138. #define SD_DRIVER_TYPE_C    0x04
  139. #define SD_DRIVER_TYPE_D    0x08
  140.     unsigned int        sd3_curr_limit;
  141. #define SD_SET_CURRENT_LIMIT_200    0
  142. #define SD_SET_CURRENT_LIMIT_400    1
  143. #define SD_SET_CURRENT_LIMIT_600    2
  144. #define SD_SET_CURRENT_LIMIT_800    3
  145.  
  146. #define SD_MAX_CURRENT_200  (1 << SD_SET_CURRENT_LIMIT_200)
  147. #define SD_MAX_CURRENT_400  (1 << SD_SET_CURRENT_LIMIT_400)
  148. #define SD_MAX_CURRENT_600  (1 << SD_SET_CURRENT_LIMIT_600)
  149. #define SD_MAX_CURRENT_800  (1 << SD_SET_CURRENT_LIMIT_800)
  150. };
  151.  
  152. struct sdio_cccr {
  153.     unsigned int        sdio_vsn;
  154.     unsigned int        sd_vsn;
  155.     unsigned int        multi_block:1,
  156.                 low_speed:1,
  157.                 wide_bus:1,
  158.                 high_power:1,
  159.                 high_speed:1,
  160.                 disable_cd:1;
  161. };
  162.  
  163. struct sdio_cis {
  164.     unsigned short      vendor;
  165.     unsigned short      device;
  166.     unsigned short      blksize;
  167.     unsigned int        max_dtr;
  168. };
  169.  
  170. struct mmc_host;
  171. struct sdio_func;
  172. struct sdio_func_tuple;
  173.  
  174. #define SDIO_MAX_FUNCS      7
  175.  
  176. /*
  177.  * MMC device
  178.  */
  179. struct mmc_card {
  180.     struct mmc_host     *host;      /* the host this device belongs to */
  181.     struct device       dev;        /* the device */
  182.     unsigned int        rca;        /* relative card address of device */
  183.     unsigned int        type;       /* card type */
  184. #define MMC_TYPE_MMC                        0       /* MMC card */
  185. #define MMC_TYPE_SD                         1       /* SD card */
  186. #define MMC_TYPE_SDIO                       2       /* SDIO card */
  187. #define MMC_TYPE_SD_COMBO                   3       /* SD combo (IO+mem) card */
  188.     unsigned int        state;      /* (our) card state */
  189. #define MMC_STATE_PRESENT               (1<<0)      /* present in sysfs */
  190. #define MMC_STATE_READONLY              (1<<1)      /* card is read-only */
  191. #define MMC_STATE_HIGHSPEED             (1<<2)      /* card is in high speed mode */
  192. #define MMC_STATE_BLOCKADDR             (1<<3)      /* card uses block-addressing */
  193. #define MMC_STATE_HIGHSPEED_DDR         (1<<4)      /* card is in high speed mode */
  194. #define MMC_STATE_ULTRAHIGHSPEED        (1<<5)      /* card is in ultra high speed mode */
  195. #define MMC_CARD_SDXC                   (1<<6)      /* card is SDXC */
  196. #define MMC_CARD_REMOVED                (1<<7)      /* card has been removed */
  197. #define MMC_STATE_HIGHSPEED_200         (1<<8)      /* card is in HS200 mode */
  198.     unsigned int        quirks;                     /* card quirks */
  199. #define MMC_QUIRK_LENIENT_FN0           (1<<0)      /* allow SDIO FN0 writes outside of the VS CCCR range */
  200. #define MMC_QUIRK_BLKSZ_FOR_BYTE_MODE   (1<<1)      /* use func->cur_blksize */
  201.                 /* for byte mode */
  202. #define MMC_QUIRK_NONSTD_SDIO           (1<<2)      /* non-standard SDIO card attached */
  203.                 /* (missing CIA registers) */
  204. #define MMC_QUIRK_BROKEN_CLK_GATING     (1<<3)      /* clock gating the sdio bus will make card fail */
  205. #define MMC_QUIRK_NONSTD_FUNC_IF        (1<<4)      /* SDIO card has nonstd function interfaces */
  206. #define MMC_QUIRK_DISABLE_CD            (1<<5)      /* disconnect CD/DAT[3] resistor */
  207. #define MMC_QUIRK_INAND_CMD38           (1<<6)      /* iNAND devices have broken CMD38 */
  208. #define MMC_QUIRK_BLK_NO_CMD23          (1<<7)      /* Avoid CMD23 for regular multiblock */
  209. #define MMC_QUIRK_MOVINAND_SECURE       (1<<8)      /* MoviNAND secure issue */
  210.  
  211.  
  212.     unsigned int    poweroff_notify_state;  /* eMMC4.5 notify feature */
  213. #define MMC_NO_POWER_NOTIFICATION   0
  214. #define MMC_POWERED_ON              1
  215. #define MMC_POWEROFF_SHORT          2
  216. #define MMC_POWEROFF_LONG           3
  217.  
  218.     unsigned int        erase_size;     /* erase size in sectors */
  219.     unsigned int        erase_shift;    /* if erase unit is power 2 */
  220.     unsigned int        pref_erase;     /* in sectors */
  221.     u8                  erased_byte;    /* value of erased bytes */
  222.     u32                 raw_cid[4];     /* raw card CID */
  223.     u32                 raw_csd[4];     /* raw card CSD */
  224.     u32                 raw_scr[2];     /* raw card SCR */
  225.     struct mmc_cid      cid;            /* card identification */
  226.     struct mmc_csd      csd;            /* card specific */
  227.     struct mmc_ext_csd  ext_csd;        /* mmc v4 extended card specific */
  228.     struct sd_scr       scr;            /* extra SD information */
  229.     struct sd_ssr       ssr;            /* yet more SD information */
  230.     struct sd_switch_caps   sw_caps;    /* switch (CMD6) caps */
  231.  
  232.     unsigned int        sdio_funcs;     /* number of SDIO functions */
  233.     struct sdio_cccr    cccr;           /* common card info */
  234.     struct sdio_cis     cis;            /* common tuple info */
  235.     struct sdio_func    *sdio_func[SDIO_MAX_FUNCS]; /* SDIO functions (devices) */
  236.     struct sdio_func    *sdio_single_irq; /* SDIO function when only one IRQ active */
  237.     unsigned            num_info;       /* number of info strings */
  238.     const char          **info;         /* info strings */
  239.     struct sdio_func_tuple  *tuples;    /* unknown common tuples */
  240.     unsigned int        sd_bus_speed;   /* Bus Speed Mode set for the card */
  241.     struct dentry       *debugfs_root;
  242. };
  243.  
  244. /*
  245.  *  The world is not perfect and supplies us with broken mmc/sdio devices.
  246.  *  For at least some of these bugs we need a work-around.
  247.  */
  248.  
  249. struct mmc_fixup {
  250.     /* CID-specific fields. */
  251.     const char *name;
  252.  
  253.     /* Valid revision range */
  254.     u64 rev_start, rev_end;
  255.  
  256.     unsigned int manfid;
  257.     unsigned short oemid;
  258.  
  259.     /* SDIO-specfic fields. You can use SDIO_ANY_ID here of course */
  260.     u16 cis_vendor, cis_device;
  261.  
  262.     void (*vendor_fixup)(struct mmc_card *card, int data);
  263.     int data;
  264. };
  265.  
  266. #define CID_MANFID_ANY (-1u)
  267. #define CID_OEMID_ANY ((unsigned short) -1)
  268. #define CID_NAME_ANY (NULL)
  269.  
  270. #define END_FIXUP { 0 }
  271.  
  272. #define _FIXUP_EXT(_name, _manfid, _oemid, _rev_start, _rev_end,    \
  273.            _cis_vendor, _cis_device,                \
  274.            _fixup, _data)                   \
  275.     {                          \
  276.         .name = (_name),               \
  277.         .manfid = (_manfid),               \
  278.         .oemid = (_oemid),             \
  279.         .rev_start = (_rev_start),         \
  280.         .rev_end = (_rev_end),             \
  281.         .cis_vendor = (_cis_vendor),           \
  282.         .cis_device = (_cis_device),           \
  283.         .vendor_fixup = (_fixup),          \
  284.         .data = (_data),               \
  285.      }
  286.  
  287. #define MMC_FIXUP_REV(_name, _manfid, _oemid, _rev_start, _rev_end, \
  288.               _fixup, _data)                    \
  289.     _FIXUP_EXT(_name, _manfid,                  \
  290.            _oemid, _rev_start, _rev_end,            \
  291.            SDIO_ANY_ID, SDIO_ANY_ID,                \
  292.            _fixup, _data)                   \
  293.  
  294. #define MMC_FIXUP(_name, _manfid, _oemid, _fixup, _data) \
  295.     MMC_FIXUP_REV(_name, _manfid, _oemid, 0, -1ull, _fixup, _data)
  296.  
  297. #define SDIO_FIXUP(_vendor, _device, _fixup, _data)         \
  298.     _FIXUP_EXT(CID_NAME_ANY, CID_MANFID_ANY,            \
  299.             CID_OEMID_ANY, 0, -1ull,                \
  300.            _vendor, _device,                    \
  301.            _fixup, _data)                   \
  302.  
  303. #define cid_rev(hwrev, fwrev, year, month)  \
  304.     (((u64) hwrev) << 40 |                  \
  305.      ((u64) fwrev) << 32 |                  \
  306.      ((u64) year) << 16 |                   \
  307.      ((u64) month))
  308.  
  309. #define cid_rev_card(card)        \
  310.     cid_rev(card->cid.hwrev,      \
  311.             card->cid.fwrev,      \
  312.             card->cid.year,   \
  313.             card->cid.month)
  314.  
  315. /*
  316.  * Unconditionally quirk add/remove.
  317.  */
  318.  
  319. static inline void __maybe_unused add_quirk(struct mmc_card *card, int data)
  320. {
  321.     card->quirks |= data;
  322. }
  323.  
  324. static inline void __maybe_unused remove_quirk(struct mmc_card *card, int data)
  325. {
  326.     card->quirks &= ~data;
  327. }
  328.  
  329. #define mmc_card_mmc(c)             ((c)->type == MMC_TYPE_MMC)
  330. #define mmc_card_sd(c)              ((c)->type == MMC_TYPE_SD)
  331. #define mmc_card_sdio(c)            ((c)->type == MMC_TYPE_SDIO)
  332.  
  333. #define mmc_card_present(c)         ((c)->state & MMC_STATE_PRESENT)
  334. #define mmc_card_readonly(c)        ((c)->state & MMC_STATE_READONLY)
  335. #define mmc_card_highspeed(c)       ((c)->state & MMC_STATE_HIGHSPEED)
  336. #define mmc_card_hs200(c)           ((c)->state & MMC_STATE_HIGHSPEED_200)
  337. #define mmc_card_blockaddr(c)       ((c)->state & MMC_STATE_BLOCKADDR)
  338. #define mmc_card_ddr_mode(c)        ((c)->state & MMC_STATE_HIGHSPEED_DDR)
  339. #define mmc_card_uhs(c)             ((c)->state & MMC_STATE_ULTRAHIGHSPEED)
  340. #define mmc_sd_card_uhs(c)          ((c)->state & MMC_STATE_ULTRAHIGHSPEED)
  341. #define mmc_card_ext_capacity(c)    ((c)->state & MMC_CARD_SDXC)
  342. #define mmc_card_removed(c)         ((c) && ((c)->state & MMC_CARD_REMOVED))
  343.  
  344. #define mmc_card_set_present(c)     ((c)->state |= MMC_STATE_PRESENT)
  345. #define mmc_card_set_readonly(c)    ((c)->state |= MMC_STATE_READONLY)
  346. #define mmc_card_set_highspeed(c)   ((c)->state |= MMC_STATE_HIGHSPEED)
  347. #define mmc_card_set_hs200(c)       ((c)->state |= MMC_STATE_HIGHSPEED_200)
  348. #define mmc_card_set_blockaddr(c)   ((c)->state |= MMC_STATE_BLOCKADDR)
  349. #define mmc_card_set_ddr_mode(c)    ((c)->state |= MMC_STATE_HIGHSPEED_DDR)
  350. #define mmc_card_set_uhs(c)         ((c)->state |= MMC_STATE_ULTRAHIGHSPEED)
  351. #define mmc_sd_card_set_uhs(c)      ((c)->state |= MMC_STATE_ULTRAHIGHSPEED)
  352. #define mmc_card_set_ext_capacity(c) ((c)->state |= MMC_CARD_SDXC)
  353. #define mmc_card_set_removed(c)     ((c)->state |= MMC_CARD_REMOVED)
  354.  
  355. /*
  356.  * Quirk add/remove for MMC products.
  357.  */
  358.  
  359. static inline void __maybe_unused add_quirk_mmc(struct mmc_card *card, int data)
  360. {
  361.     if (mmc_card_mmc(card))
  362.         card->quirks |= data;
  363. }
  364.  
  365. static inline void __maybe_unused remove_quirk_mmc(struct mmc_card *card,
  366.                            int data)
  367. {
  368.     if (mmc_card_mmc(card))
  369.         card->quirks &= ~data;
  370. }
  371.  
  372. /*
  373.  * Quirk add/remove for SD products.
  374.  */
  375.  
  376. static inline void __maybe_unused add_quirk_sd(struct mmc_card *card, int data)
  377. {
  378.     if (mmc_card_sd(card))
  379.         card->quirks |= data;
  380. }
  381.  
  382. static inline void __maybe_unused remove_quirk_sd(struct mmc_card *card,
  383.                            int data)
  384. {
  385.     if (mmc_card_sd(card))
  386.         card->quirks &= ~data;
  387. }
  388.  
  389. static inline int mmc_card_lenient_fn0(const struct mmc_card *c)
  390. {
  391.     return c->quirks & MMC_QUIRK_LENIENT_FN0;
  392. }
  393.  
  394. static inline int mmc_blksz_for_byte_mode(const struct mmc_card *c)
  395. {
  396.     return c->quirks & MMC_QUIRK_BLKSZ_FOR_BYTE_MODE;
  397. }
  398.  
  399. static inline int mmc_card_disable_cd(const struct mmc_card *c)
  400. {
  401.     return c->quirks & MMC_QUIRK_DISABLE_CD;
  402. }
  403.  
  404. static inline int mmc_card_nonstd_func_interface(const struct mmc_card *c)
  405. {
  406.     return c->quirks & MMC_QUIRK_NONSTD_FUNC_IF;
  407. }
  408.  
  409. #define mmc_card_name(c)    ((c)->cid.prod_name)
  410. #define mmc_card_id(c)      (dev_name(&(c)->dev))
  411. #define mmc_dev_to_card(d)  container_of(d, struct mmc_card, dev)
  412. #define mmc_list_to_card(l) container_of(l, struct mmc_card, node)
  413. #define mmc_get_drvdata(c)  dev_get_drvdata(&(c)->dev)
  414. #define mmc_set_drvdata(c,d)    dev_set_drvdata(&(c)->dev, d)
  415.  
  416. /*
  417.  * MMC device driver (e.g., Flash card, I/O card...)
  418.  */
  419. struct mmc_driver {
  420.     struct device_driver drv;
  421.     int (*probe)(struct mmc_card *);
  422.     void (*remove)(struct mmc_card *);
  423.     int (*suspend)(struct mmc_card *, pm_message_t);
  424.     int (*resume)(struct mmc_card *);
  425. };
  426.  
  427. extern int mmc_register_driver(struct mmc_driver *);
  428. extern void mmc_unregister_driver(struct mmc_driver *);
  429. extern void mmc_fixup_device(struct mmc_card *card,
  430.                  const struct mmc_fixup *table);
  431.  
  432. #endif
RAW Paste Data

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×