mmc: sdhci-acpi: add more device ids
Add three more ACPI HIDs. Also, as some devices must be further distinguished by ACPI UID, slot information is now associated with HID and UID. Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> Signed-off-by: Chris Ball <cjb@laptop.org>
This commit is contained in:
parent
1d1ff45871
commit
07a588837b
1 changed files with 58 additions and 8 deletions
|
@ -87,6 +87,12 @@ static const struct sdhci_ops sdhci_acpi_ops_dflt = {
|
||||||
.enable_dma = sdhci_acpi_enable_dma,
|
.enable_dma = sdhci_acpi_enable_dma,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct sdhci_acpi_slot sdhci_acpi_slot_int_emmc = {
|
||||||
|
.caps = MMC_CAP_8_BIT_DATA | MMC_CAP_NONREMOVABLE,
|
||||||
|
.caps2 = MMC_CAP2_HC_ERASE_SZ,
|
||||||
|
.flags = SDHCI_ACPI_RUNTIME_PM,
|
||||||
|
};
|
||||||
|
|
||||||
static const struct sdhci_acpi_slot sdhci_acpi_slot_int_sdio = {
|
static const struct sdhci_acpi_slot sdhci_acpi_slot_int_sdio = {
|
||||||
.quirks2 = SDHCI_QUIRK2_HOST_OFF_CARD_ON,
|
.quirks2 = SDHCI_QUIRK2_HOST_OFF_CARD_ON,
|
||||||
.caps = MMC_CAP_NONREMOVABLE | MMC_CAP_POWER_OFF_CARD,
|
.caps = MMC_CAP_NONREMOVABLE | MMC_CAP_POWER_OFF_CARD,
|
||||||
|
@ -94,23 +100,67 @@ static const struct sdhci_acpi_slot sdhci_acpi_slot_int_sdio = {
|
||||||
.pm_caps = MMC_PM_KEEP_POWER,
|
.pm_caps = MMC_PM_KEEP_POWER,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct sdhci_acpi_slot sdhci_acpi_slot_int_sd = {
|
||||||
|
};
|
||||||
|
|
||||||
|
struct sdhci_acpi_uid_slot {
|
||||||
|
const char *hid;
|
||||||
|
const char *uid;
|
||||||
|
const struct sdhci_acpi_slot *slot;
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct sdhci_acpi_uid_slot sdhci_acpi_uids[] = {
|
||||||
|
{ "80860F14" , "1" , &sdhci_acpi_slot_int_emmc },
|
||||||
|
{ "80860F14" , "3" , &sdhci_acpi_slot_int_sd },
|
||||||
|
{ "INT33BB" , "2" , &sdhci_acpi_slot_int_sdio },
|
||||||
|
{ "INT33C6" , NULL, &sdhci_acpi_slot_int_sdio },
|
||||||
|
{ "PNP0D40" },
|
||||||
|
{ },
|
||||||
|
};
|
||||||
|
|
||||||
static const struct acpi_device_id sdhci_acpi_ids[] = {
|
static const struct acpi_device_id sdhci_acpi_ids[] = {
|
||||||
{ "INT33C6", (kernel_ulong_t)&sdhci_acpi_slot_int_sdio },
|
{ "80860F14" },
|
||||||
{ "PNP0D40" },
|
{ "INT33BB" },
|
||||||
|
{ "INT33C6" },
|
||||||
|
{ "PNP0D40" },
|
||||||
{ },
|
{ },
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(acpi, sdhci_acpi_ids);
|
MODULE_DEVICE_TABLE(acpi, sdhci_acpi_ids);
|
||||||
|
|
||||||
static const struct sdhci_acpi_slot *sdhci_acpi_get_slot(const char *hid)
|
static const struct sdhci_acpi_slot *sdhci_acpi_get_slot_by_ids(const char *hid,
|
||||||
|
const char *uid)
|
||||||
{
|
{
|
||||||
const struct acpi_device_id *id;
|
const struct sdhci_acpi_uid_slot *u;
|
||||||
|
|
||||||
for (id = sdhci_acpi_ids; id->id[0]; id++)
|
for (u = sdhci_acpi_uids; u->hid; u++) {
|
||||||
if (!strcmp(id->id, hid))
|
if (strcmp(u->hid, hid))
|
||||||
return (const struct sdhci_acpi_slot *)id->driver_data;
|
continue;
|
||||||
|
if (!u->uid)
|
||||||
|
return u->slot;
|
||||||
|
if (uid && !strcmp(u->uid, uid))
|
||||||
|
return u->slot;
|
||||||
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const struct sdhci_acpi_slot *sdhci_acpi_get_slot(acpi_handle handle,
|
||||||
|
const char *hid)
|
||||||
|
{
|
||||||
|
const struct sdhci_acpi_slot *slot;
|
||||||
|
struct acpi_device_info *info;
|
||||||
|
const char *uid = NULL;
|
||||||
|
acpi_status status;
|
||||||
|
|
||||||
|
status = acpi_get_object_info(handle, &info);
|
||||||
|
if (!ACPI_FAILURE(status) && (info->valid & ACPI_VALID_UID))
|
||||||
|
uid = info->unique_id.string;
|
||||||
|
|
||||||
|
slot = sdhci_acpi_get_slot_by_ids(hid, uid);
|
||||||
|
|
||||||
|
kfree(info);
|
||||||
|
return slot;
|
||||||
|
}
|
||||||
|
|
||||||
static int sdhci_acpi_probe(struct platform_device *pdev)
|
static int sdhci_acpi_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct device *dev = &pdev->dev;
|
struct device *dev = &pdev->dev;
|
||||||
|
@ -148,7 +198,7 @@ static int sdhci_acpi_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
c = sdhci_priv(host);
|
c = sdhci_priv(host);
|
||||||
c->host = host;
|
c->host = host;
|
||||||
c->slot = sdhci_acpi_get_slot(hid);
|
c->slot = sdhci_acpi_get_slot(handle, hid);
|
||||||
c->pdev = pdev;
|
c->pdev = pdev;
|
||||||
c->use_runtime_pm = sdhci_acpi_flag(c, SDHCI_ACPI_RUNTIME_PM);
|
c->use_runtime_pm = sdhci_acpi_flag(c, SDHCI_ACPI_RUNTIME_PM);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue