![Ulf Hansson](/assets/img/avatar_default.png)
MMC_CLKGATE was once invented to save power by gating the bus clock at request inactivity. At that time it served its purpose. The modern way to deal with power saving for these scenarios, is by using runtime PM. Nowadays, several host drivers have deployed runtime PM, but for those that haven't and which still cares power saving at request inactivity, it's certainly time to deploy runtime PM as it has been around for several years now. To simplify code to mmc core and thus decrease maintenance efforts, this patch removes all code related to MMC_CLKGATE. Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
82 lines
2.2 KiB
C
82 lines
2.2 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) &&
|
|
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);
|