2 * This file contains work-arounds for many known sdio hardware
5 * Copyright (c) 2011 Pierre Tardy <tardyp@gmail.com>
6 * Inspired from pci fixup code:
7 * Copyright (c) 1999 Martin Mares <mj@ucw.cz>
11 #include <linux/types.h>
12 #include <linux/kernel.h>
13 #include <linux/mmc/card.h>
15 static const struct mmc_fixup mmc_fixup_methods[] = {
19 void mmc_fixup_device(struct mmc_card *card,
20 const struct mmc_fixup *table)
22 const struct mmc_fixup *f;
23 u64 rev = cid_rev_card(card);
25 /* Non-core specific workarounds. */
27 table = mmc_fixup_methods;
29 for (f = table; f->vendor_fixup; f++) {
30 if ((f->manfid == CID_MANFID_ANY
31 || f->manfid == card->cid.manfid) &&
32 (f->oemid == CID_OEMID_ANY
33 || f->oemid == card->cid.oemid) &&
34 (f->name == CID_NAME_ANY
35 || !strcmp(f->name, card->cid.prod_name)) &&
36 (f->cis_vendor == card->cis.vendor
37 || f->cis_vendor == (u16) SDIO_ANY_ID) &&
38 (f->cis_device == card->cis.device
39 || f->cis_device == (u16) SDIO_ANY_ID) &&
40 rev >= f->rev_start &&
42 dev_dbg(&card->dev, "calling %pF\n", f->vendor_fixup);
43 f->vendor_fixup(card, f->data);
47 EXPORT_SYMBOL(mmc_fixup_device);