linux/drivers/mmc/core/card.h
<<
>>
Prefs
   1/*
   2 * Private header for the mmc subsystem
   3 *
   4 * Copyright (C) 2016 Linaro Ltd
   5 *
   6 * Author: Ulf Hansson <ulf.hansson@linaro.org>
   7 *
   8 * License terms: GNU General Public License (GPL) version 2
   9 */
  10
  11#ifndef _MMC_CORE_CARD_H
  12#define _MMC_CORE_CARD_H
  13
  14#include <linux/mmc/card.h>
  15
  16#define mmc_card_name(c)        ((c)->cid.prod_name)
  17#define mmc_card_id(c)          (dev_name(&(c)->dev))
  18#define mmc_dev_to_card(d)      container_of(d, struct mmc_card, dev)
  19
  20/* Card states */
  21#define MMC_STATE_PRESENT       (1<<0)          /* present in sysfs */
  22#define MMC_STATE_READONLY      (1<<1)          /* card is read-only */
  23#define MMC_STATE_BLOCKADDR     (1<<2)          /* card uses block-addressing */
  24#define MMC_CARD_SDXC           (1<<3)          /* card is SDXC */
  25#define MMC_CARD_REMOVED        (1<<4)          /* card has been removed */
  26#define MMC_STATE_DOING_BKOPS   (1<<5)          /* card is doing BKOPS */
  27#define MMC_STATE_SUSPENDED     (1<<6)          /* card is suspended */
  28
  29#define mmc_card_present(c)     ((c)->state & MMC_STATE_PRESENT)
  30#define mmc_card_readonly(c)    ((c)->state & MMC_STATE_READONLY)
  31#define mmc_card_blockaddr(c)   ((c)->state & MMC_STATE_BLOCKADDR)
  32#define mmc_card_ext_capacity(c) ((c)->state & MMC_CARD_SDXC)
  33#define mmc_card_removed(c)     ((c) && ((c)->state & MMC_CARD_REMOVED))
  34#define mmc_card_doing_bkops(c) ((c)->state & MMC_STATE_DOING_BKOPS)
  35#define mmc_card_suspended(c)   ((c)->state & MMC_STATE_SUSPENDED)
  36
  37#define mmc_card_set_present(c) ((c)->state |= MMC_STATE_PRESENT)
  38#define mmc_card_set_readonly(c) ((c)->state |= MMC_STATE_READONLY)
  39#define mmc_card_set_blockaddr(c) ((c)->state |= MMC_STATE_BLOCKADDR)
  40#define mmc_card_set_ext_capacity(c) ((c)->state |= MMC_CARD_SDXC)
  41#define mmc_card_set_removed(c) ((c)->state |= MMC_CARD_REMOVED)
  42#define mmc_card_set_doing_bkops(c)     ((c)->state |= MMC_STATE_DOING_BKOPS)
  43#define mmc_card_clr_doing_bkops(c)     ((c)->state &= ~MMC_STATE_DOING_BKOPS)
  44#define mmc_card_set_suspended(c) ((c)->state |= MMC_STATE_SUSPENDED)
  45#define mmc_card_clr_suspended(c) ((c)->state &= ~MMC_STATE_SUSPENDED)
  46
  47/*
  48 * The world is not perfect and supplies us with broken mmc/sdio devices.
  49 * For at least some of these bugs we need a work-around.
  50 */
  51struct mmc_fixup {
  52        /* CID-specific fields. */
  53        const char *name;
  54
  55        /* Valid revision range */
  56        u64 rev_start, rev_end;
  57
  58        unsigned int manfid;
  59        unsigned short oemid;
  60
  61        /* SDIO-specific fields. You can use SDIO_ANY_ID here of course */
  62        u16 cis_vendor, cis_device;
  63
  64        /* for MMC cards */
  65        unsigned int ext_csd_rev;
  66
  67        void (*vendor_fixup)(struct mmc_card *card, int data);
  68        int data;
  69};
  70
  71#define CID_MANFID_ANY (-1u)
  72#define CID_OEMID_ANY ((unsigned short) -1)
  73#define CID_NAME_ANY (NULL)
  74
  75#define EXT_CSD_REV_ANY (-1u)
  76
  77#define CID_MANFID_SANDISK      0x2
  78#define CID_MANFID_TOSHIBA      0x11
  79#define CID_MANFID_MICRON       0x13
  80#define CID_MANFID_SAMSUNG      0x15
  81#define CID_MANFID_KINGSTON     0x70
  82#define CID_MANFID_HYNIX        0x90
  83
  84#define END_FIXUP { NULL }
  85
  86#define _FIXUP_EXT(_name, _manfid, _oemid, _rev_start, _rev_end,        \
  87                   _cis_vendor, _cis_device,                            \
  88                   _fixup, _data, _ext_csd_rev)                         \
  89        {                                               \
  90                .name = (_name),                        \
  91                .manfid = (_manfid),                    \
  92                .oemid = (_oemid),                      \
  93                .rev_start = (_rev_start),              \
  94                .rev_end = (_rev_end),                  \
  95                .cis_vendor = (_cis_vendor),            \
  96                .cis_device = (_cis_device),            \
  97                .vendor_fixup = (_fixup),               \
  98                .data = (_data),                        \
  99                .ext_csd_rev = (_ext_csd_rev),          \
 100        }
 101
 102#define MMC_FIXUP_REV(_name, _manfid, _oemid, _rev_start, _rev_end,     \
 103                      _fixup, _data, _ext_csd_rev)                      \
 104        _FIXUP_EXT(_name, _manfid,                                      \
 105                   _oemid, _rev_start, _rev_end,                        \
 106                   SDIO_ANY_ID, SDIO_ANY_ID,                            \
 107                   _fixup, _data, _ext_csd_rev)                         \
 108
 109#define MMC_FIXUP(_name, _manfid, _oemid, _fixup, _data) \
 110        MMC_FIXUP_REV(_name, _manfid, _oemid, 0, -1ull, _fixup, _data,  \
 111                      EXT_CSD_REV_ANY)
 112
 113#define MMC_FIXUP_EXT_CSD_REV(_name, _manfid, _oemid, _fixup, _data,    \
 114                              _ext_csd_rev)                             \
 115        MMC_FIXUP_REV(_name, _manfid, _oemid, 0, -1ull, _fixup, _data,  \
 116                      _ext_csd_rev)
 117
 118#define SDIO_FIXUP(_vendor, _device, _fixup, _data)                     \
 119        _FIXUP_EXT(CID_NAME_ANY, CID_MANFID_ANY,                        \
 120                    CID_OEMID_ANY, 0, -1ull,                            \
 121                   _vendor, _device,                                    \
 122                   _fixup, _data, EXT_CSD_REV_ANY)                      \
 123
 124#define cid_rev(hwrev, fwrev, year, month)      \
 125        (((u64) hwrev) << 40 |                  \
 126         ((u64) fwrev) << 32 |                  \
 127         ((u64) year) << 16 |                   \
 128         ((u64) month))
 129
 130#define cid_rev_card(card)                      \
 131        cid_rev(card->cid.hwrev,                \
 132                    card->cid.fwrev,            \
 133                    card->cid.year,             \
 134                    card->cid.month)
 135
 136/*
 137 * Unconditionally quirk add/remove.
 138 */
 139static inline void __maybe_unused add_quirk(struct mmc_card *card, int data)
 140{
 141        card->quirks |= data;
 142}
 143
 144static inline void __maybe_unused remove_quirk(struct mmc_card *card, int data)
 145{
 146        card->quirks &= ~data;
 147}
 148
 149/*
 150 * Quirk add/remove for MMC products.
 151 */
 152static inline void __maybe_unused add_quirk_mmc(struct mmc_card *card, int data)
 153{
 154        if (mmc_card_mmc(card))
 155                card->quirks |= data;
 156}
 157
 158static inline void __maybe_unused remove_quirk_mmc(struct mmc_card *card,
 159                                                   int data)
 160{
 161        if (mmc_card_mmc(card))
 162                card->quirks &= ~data;
 163}
 164
 165/*
 166 * Quirk add/remove for SD products.
 167 */
 168static inline void __maybe_unused add_quirk_sd(struct mmc_card *card, int data)
 169{
 170        if (mmc_card_sd(card))
 171                card->quirks |= data;
 172}
 173
 174static inline void __maybe_unused remove_quirk_sd(struct mmc_card *card,
 175                                                   int data)
 176{
 177        if (mmc_card_sd(card))
 178                card->quirks &= ~data;
 179}
 180
 181static inline int mmc_card_lenient_fn0(const struct mmc_card *c)
 182{
 183        return c->quirks & MMC_QUIRK_LENIENT_FN0;
 184}
 185
 186static inline int mmc_blksz_for_byte_mode(const struct mmc_card *c)
 187{
 188        return c->quirks & MMC_QUIRK_BLKSZ_FOR_BYTE_MODE;
 189}
 190
 191static inline int mmc_card_disable_cd(const struct mmc_card *c)
 192{
 193        return c->quirks & MMC_QUIRK_DISABLE_CD;
 194}
 195
 196static inline int mmc_card_nonstd_func_interface(const struct mmc_card *c)
 197{
 198        return c->quirks & MMC_QUIRK_NONSTD_FUNC_IF;
 199}
 200
 201static inline int mmc_card_broken_byte_mode_512(const struct mmc_card *c)
 202{
 203        return c->quirks & MMC_QUIRK_BROKEN_BYTE_MODE_512;
 204}
 205
 206static inline int mmc_card_long_read_time(const struct mmc_card *c)
 207{
 208        return c->quirks & MMC_QUIRK_LONG_READ_TIME;
 209}
 210
 211static inline int mmc_card_broken_irq_polling(const struct mmc_card *c)
 212{
 213        return c->quirks & MMC_QUIRK_BROKEN_IRQ_POLLING;
 214}
 215
 216static inline int mmc_card_broken_hpi(const struct mmc_card *c)
 217{
 218        return c->quirks & MMC_QUIRK_BROKEN_HPI;
 219}
 220
 221#endif
 222