mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-23 18:07:03 +00:00
5320226a05
Certain Hynix eMMC 4.41 cards might get broken when HPI feature is used and hence this patch disables the HPI feature for such buggy cards. As some of the other features like BKOPs/Cache/Sanitize are dependent on HPI feature, those features would also get disabled if HPI is disabled. Signed-off-by: Pratibhasagar V <pratibha@codeaurora.org> Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org> [gdavis: Forward port and cleanup] Signed-off-by: George G. Davis <george_davis@mentor.com> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
84 lines
2.3 KiB
C
84 lines
2.3 KiB
C
/*
|
|
* This file contains work-arounds for many known SD/MMC
|
|
* and SDIO hardware bugs.
|
|
*
|
|
* Copyright (c) 2011 Andrei Warkentin <andreiw@motorola.com>
|
|
* Copyright (c) 2011 Pierre Tardy <tardyp@gmail.com>
|
|
* Inspired from pci fixup code:
|
|
* Copyright (c) 1999 Martin Mares <mj@ucw.cz>
|
|
*
|
|
*/
|
|
|
|
#include <linux/types.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/export.h>
|
|
#include <linux/mmc/card.h>
|
|
#include <linux/mmc/sdio_ids.h>
|
|
|
|
#ifndef SDIO_VENDOR_ID_TI
|
|
#define SDIO_VENDOR_ID_TI 0x0097
|
|
#endif
|
|
|
|
#ifndef SDIO_DEVICE_ID_TI_WL1271
|
|
#define SDIO_DEVICE_ID_TI_WL1271 0x4076
|
|
#endif
|
|
|
|
#ifndef SDIO_VENDOR_ID_STE
|
|
#define SDIO_VENDOR_ID_STE 0x0020
|
|
#endif
|
|
|
|
#ifndef SDIO_DEVICE_ID_STE_CW1200
|
|
#define SDIO_DEVICE_ID_STE_CW1200 0x2280
|
|
#endif
|
|
|
|
#ifndef SDIO_DEVICE_ID_MARVELL_8797_F0
|
|
#define SDIO_DEVICE_ID_MARVELL_8797_F0 0x9128
|
|
#endif
|
|
|
|
static const struct mmc_fixup mmc_fixup_methods[] = {
|
|
SDIO_FIXUP(SDIO_VENDOR_ID_TI, SDIO_DEVICE_ID_TI_WL1271,
|
|
add_quirk, MMC_QUIRK_NONSTD_FUNC_IF),
|
|
|
|
SDIO_FIXUP(SDIO_VENDOR_ID_TI, SDIO_DEVICE_ID_TI_WL1271,
|
|
add_quirk, MMC_QUIRK_DISABLE_CD),
|
|
|
|
SDIO_FIXUP(SDIO_VENDOR_ID_STE, SDIO_DEVICE_ID_STE_CW1200,
|
|
add_quirk, MMC_QUIRK_BROKEN_BYTE_MODE_512),
|
|
|
|
SDIO_FIXUP(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8797_F0,
|
|
add_quirk, MMC_QUIRK_BROKEN_IRQ_POLLING),
|
|
|
|
END_FIXUP
|
|
};
|
|
|
|
void mmc_fixup_device(struct mmc_card *card, const struct mmc_fixup *table)
|
|
{
|
|
const struct mmc_fixup *f;
|
|
u64 rev = cid_rev_card(card);
|
|
|
|
/* Non-core specific workarounds. */
|
|
if (!table)
|
|
table = mmc_fixup_methods;
|
|
|
|
for (f = table; f->vendor_fixup; f++) {
|
|
if ((f->manfid == CID_MANFID_ANY ||
|
|
f->manfid == card->cid.manfid) &&
|
|
(f->oemid == CID_OEMID_ANY ||
|
|
f->oemid == card->cid.oemid) &&
|
|
(f->name == CID_NAME_ANY ||
|
|
!strncmp(f->name, card->cid.prod_name,
|
|
sizeof(card->cid.prod_name))) &&
|
|
(f->cis_vendor == card->cis.vendor ||
|
|
f->cis_vendor == (u16) SDIO_ANY_ID) &&
|
|
(f->cis_device == card->cis.device ||
|
|
f->cis_device == (u16) SDIO_ANY_ID) &&
|
|
(f->ext_csd_rev == EXT_CSD_REV_ANY ||
|
|
f->ext_csd_rev == card->ext_csd.rev) &&
|
|
rev >= f->rev_start && rev <= f->rev_end) {
|
|
dev_dbg(&card->dev, "calling %pf\n", f->vendor_fixup);
|
|
f->vendor_fixup(card, f->data);
|
|
}
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(mmc_fixup_device);
|