|
@@ -280,6 +280,7 @@ struct mmc_card {
|
|
|
#define MMC_QUIRK_SEC_ERASE_TRIM_BROKEN (1<<10) /* Skip secure for erase/trim */
|
|
|
#define MMC_QUIRK_BROKEN_IRQ_POLLING (1<<11) /* Polling SDIO_CCCR_INTx could create a fake interrupt */
|
|
|
#define MMC_QUIRK_TRIM_BROKEN (1<<12) /* Skip trim */
|
|
|
+#define MMC_QUIRK_BROKEN_HPI (1<<13) /* Disable broken HPI support */
|
|
|
|
|
|
|
|
|
unsigned int erase_size; /* erase size in sectors */
|
|
@@ -354,6 +355,9 @@ struct mmc_fixup {
|
|
|
/* SDIO-specfic fields. You can use SDIO_ANY_ID here of course */
|
|
|
u16 cis_vendor, cis_device;
|
|
|
|
|
|
+ /* for MMC cards */
|
|
|
+ unsigned int ext_csd_rev;
|
|
|
+
|
|
|
void (*vendor_fixup)(struct mmc_card *card, int data);
|
|
|
int data;
|
|
|
};
|
|
@@ -362,11 +366,20 @@ struct mmc_fixup {
|
|
|
#define CID_OEMID_ANY ((unsigned short) -1)
|
|
|
#define CID_NAME_ANY (NULL)
|
|
|
|
|
|
+#define EXT_CSD_REV_ANY (-1u)
|
|
|
+
|
|
|
+#define CID_MANFID_SANDISK 0x2
|
|
|
+#define CID_MANFID_TOSHIBA 0x11
|
|
|
+#define CID_MANFID_MICRON 0x13
|
|
|
+#define CID_MANFID_SAMSUNG 0x15
|
|
|
+#define CID_MANFID_KINGSTON 0x70
|
|
|
+#define CID_MANFID_HYNIX 0x90
|
|
|
+
|
|
|
#define END_FIXUP { NULL }
|
|
|
|
|
|
#define _FIXUP_EXT(_name, _manfid, _oemid, _rev_start, _rev_end, \
|
|
|
_cis_vendor, _cis_device, \
|
|
|
- _fixup, _data) \
|
|
|
+ _fixup, _data, _ext_csd_rev) \
|
|
|
{ \
|
|
|
.name = (_name), \
|
|
|
.manfid = (_manfid), \
|
|
@@ -377,23 +390,30 @@ struct mmc_fixup {
|
|
|
.cis_device = (_cis_device), \
|
|
|
.vendor_fixup = (_fixup), \
|
|
|
.data = (_data), \
|
|
|
+ .ext_csd_rev = (_ext_csd_rev), \
|
|
|
}
|
|
|
|
|
|
#define MMC_FIXUP_REV(_name, _manfid, _oemid, _rev_start, _rev_end, \
|
|
|
- _fixup, _data) \
|
|
|
+ _fixup, _data, _ext_csd_rev) \
|
|
|
_FIXUP_EXT(_name, _manfid, \
|
|
|
_oemid, _rev_start, _rev_end, \
|
|
|
SDIO_ANY_ID, SDIO_ANY_ID, \
|
|
|
- _fixup, _data) \
|
|
|
+ _fixup, _data, _ext_csd_rev) \
|
|
|
|
|
|
#define MMC_FIXUP(_name, _manfid, _oemid, _fixup, _data) \
|
|
|
- MMC_FIXUP_REV(_name, _manfid, _oemid, 0, -1ull, _fixup, _data)
|
|
|
+ MMC_FIXUP_REV(_name, _manfid, _oemid, 0, -1ull, _fixup, _data, \
|
|
|
+ EXT_CSD_REV_ANY)
|
|
|
+
|
|
|
+#define MMC_FIXUP_EXT_CSD_REV(_name, _manfid, _oemid, _fixup, _data, \
|
|
|
+ _ext_csd_rev) \
|
|
|
+ MMC_FIXUP_REV(_name, _manfid, _oemid, 0, -1ull, _fixup, _data, \
|
|
|
+ _ext_csd_rev)
|
|
|
|
|
|
#define SDIO_FIXUP(_vendor, _device, _fixup, _data) \
|
|
|
_FIXUP_EXT(CID_NAME_ANY, CID_MANFID_ANY, \
|
|
|
CID_OEMID_ANY, 0, -1ull, \
|
|
|
_vendor, _device, \
|
|
|
- _fixup, _data) \
|
|
|
+ _fixup, _data, EXT_CSD_REV_ANY) \
|
|
|
|
|
|
#define cid_rev(hwrev, fwrev, year, month) \
|
|
|
(((u64) hwrev) << 40 | \
|
|
@@ -512,6 +532,11 @@ static inline int mmc_card_broken_irq_polling(const struct mmc_card *c)
|
|
|
return c->quirks & MMC_QUIRK_BROKEN_IRQ_POLLING;
|
|
|
}
|
|
|
|
|
|
+static inline int mmc_card_broken_hpi(const struct mmc_card *c)
|
|
|
+{
|
|
|
+ return c->quirks & MMC_QUIRK_BROKEN_HPI;
|
|
|
+}
|
|
|
+
|
|
|
#define mmc_card_name(c) ((c)->cid.prod_name)
|
|
|
#define mmc_card_id(c) (dev_name(&(c)->dev))
|
|
|
|