Lines Matching +full:sdhci +full:- +full:caps +full:- +full:mask

1 // SPDX-License-Identifier: GPL-2.0-only
16 #include <linux/dma-mapping.h>
31 #include <linux/mmc/slot-gpio.h>
38 #include "sdhci.h"
50 unsigned long caps; member
59 unsigned long caps; member
87 return (void *)c->private; in sdhci_acpi_priv()
92 return c->slot && (c->slot->flags & flag); in sdhci_acpi_flag()
124 return -EOPNOTSUPP; in __intel_dsm()
126 if (obj->type == ACPI_TYPE_INTEGER) { in __intel_dsm()
127 *result = obj->integer.value; in __intel_dsm()
128 } else if (obj->type == ACPI_TYPE_BUFFER && obj->buffer.length > 0) { in __intel_dsm()
129 size_t len = min_t(size_t, obj->buffer.length, 4); in __intel_dsm()
132 memcpy(result, obj->buffer.pointer, len); in __intel_dsm()
134 dev_err(dev, "%s DSM fn %u obj->type %d obj->buffer.length %d\n", in __intel_dsm()
135 __func__, fn, obj->type, obj->buffer.length); in __intel_dsm()
136 err = -EINVAL; in __intel_dsm()
147 if (fn > 31 || !(intel_host->dsm_fns & (1 << fn))) in intel_dsm()
148 return -EOPNOTSUPP; in intel_dsm()
158 intel_host->hs_caps = ~0; in intel_dsm_init()
160 err = __intel_dsm(intel_host, dev, INTEL_DSM_FNS, &intel_host->dsm_fns); in intel_dsm_init()
167 pr_debug("%s: DSM function mask %#x\n", in intel_dsm_init()
168 mmc_hostname(mmc), intel_host->dsm_fns); in intel_dsm_init()
170 intel_dsm(intel_host, dev, INTEL_DSM_HS_CAPS, &intel_host->hs_caps); in intel_dsm_init()
187 switch (ios->signal_voltage) { in intel_start_signal_voltage_switch()
312 struct sdhci_host *host = c->host; in intel_probe_slot()
317 host->timeout_clk = 1000; /* 1000 kHz i.e. 1 MHz */ in intel_probe_slot()
320 host->mmc_host_ops.get_cd = bxt_get_cd; in intel_probe_slot()
322 intel_dsm_init(intel_host, &pdev->dev, host->mmc); in intel_probe_slot()
324 host->mmc_host_ops.start_signal_voltage_switch = in intel_probe_slot()
327 c->is_intel = true; in intel_probe_slot()
337 if (!(intel_host->hs_caps & INTEL_DSM_HS_CAPS_SDR25)) in intel_setup_host()
338 c->host->mmc->caps &= ~MMC_CAP_UHS_SDR25; in intel_setup_host()
340 if (!(intel_host->hs_caps & INTEL_DSM_HS_CAPS_SDR50)) in intel_setup_host()
341 c->host->mmc->caps &= ~MMC_CAP_UHS_SDR50; in intel_setup_host()
343 if (!(intel_host->hs_caps & INTEL_DSM_HS_CAPS_DDR50)) in intel_setup_host()
344 c->host->mmc->caps &= ~MMC_CAP_UHS_DDR50; in intel_setup_host()
346 if (!(intel_host->hs_caps & INTEL_DSM_HS_CAPS_SDR104)) in intel_setup_host()
347 c->host->mmc->caps &= ~MMC_CAP_UHS_SDR104; in intel_setup_host()
354 .caps = MMC_CAP_8_BIT_DATA | MMC_CAP_NONREMOVABLE |
373 .caps = MMC_CAP_NONREMOVABLE | MMC_CAP_POWER_OFF_CARD |
389 .caps = MMC_CAP_WAIT_WHILE_BUSY | MMC_CAP_AGGRESSIVE_PM,
410 struct sdhci_host *host = c->host; in qcom_probe_slot()
413 *irq = -EINVAL; in qcom_probe_slot()
429 struct device *dev = &pdev->dev; in qcom_free_slot()
431 struct sdhci_host *host = c->host; in qcom_free_slot()
437 return -ENODEV; in qcom_free_slot()
452 .caps = MMC_CAP_NONREMOVABLE,
460 .caps = MMC_CAP_NONREMOVABLE,
468 /* AMD sdhci reset dll register. */
475 struct sdhci_host *host = mmc_priv(card->host); in amd_select_drive_strength()
496 * switching from HS400->DDR52->HS->HS200->HS400. So the driver mismatch in amd_select_drive_strength()
521 amd_host->dll_enabled = enable; in sdhci_acpi_amd_hs400_dll()
526 * HS->HS200->Perform Tuning->HS->HS400
528 * The re-tuning sequence is:
529 * HS400->DDR52->HS->HS200->Perform Tuning->HS->HS400
534 * HS400, we can re-enable the tuned clock.
542 unsigned int old_timing = host->timing; in amd_set_ios()
547 if (old_timing != host->timing && amd_host->tuned_clock) { in amd_set_ios()
548 if (host->timing == MMC_TIMING_MMC_HS400 || in amd_set_ios()
549 host->timing == MMC_TIMING_MMC_HS200) { in amd_set_ios()
560 if (host->timing == MMC_TIMING_MMC_HS400 && in amd_set_ios()
561 !amd_host->dll_enabled) in amd_set_ios()
573 amd_host->tuned_clock = false; in amd_sdhci_execute_tuning()
577 if (!err && !host->tuning_err) in amd_sdhci_execute_tuning()
578 amd_host->tuned_clock = true; in amd_sdhci_execute_tuning()
583 static void amd_sdhci_reset(struct sdhci_host *host, u8 mask) in amd_sdhci_reset() argument
588 if (mask & SDHCI_RESET_ALL) { in amd_sdhci_reset()
589 amd_host->tuned_clock = false; in amd_sdhci_reset()
593 sdhci_reset(host, mask); in amd_sdhci_reset()
611 struct sdhci_host *host = c->host; in sdhci_acpi_emmc_amd_probe_slot()
614 if (host->caps1 & SDHCI_SUPPORT_DDR50) in sdhci_acpi_emmc_amd_probe_slot()
615 host->mmc->caps = MMC_CAP_1_8V_DDR; in sdhci_acpi_emmc_amd_probe_slot()
617 if ((host->caps1 & SDHCI_SUPPORT_SDR104) && in sdhci_acpi_emmc_amd_probe_slot()
618 (host->mmc->caps & MMC_CAP_1_8V_DDR)) in sdhci_acpi_emmc_amd_probe_slot()
619 host->mmc->caps2 = MMC_CAP2_HS400_1_8V; in sdhci_acpi_emmc_amd_probe_slot()
644 * 2) sdhci_get_preset_value is using a non-standard register to in sdhci_acpi_emmc_amd_probe_slot()
646 * non-standard register. In fact, it doesn't expose the HS400 in sdhci_acpi_emmc_amd_probe_slot()
647 * preset register anywhere in the SDHCI memory map. This results in sdhci_acpi_emmc_amd_probe_slot()
656 host->quirks2 |= SDHCI_QUIRK2_PRESET_VALUE_BROKEN; in sdhci_acpi_emmc_amd_probe_slot()
658 host->mmc_host_ops.select_drive_strength = amd_select_drive_strength; in sdhci_acpi_emmc_amd_probe_slot()
659 host->mmc_host_ops.set_ios = amd_set_ios; in sdhci_acpi_emmc_amd_probe_slot()
660 host->mmc_host_ops.execute_tuning = amd_sdhci_execute_tuning; in sdhci_acpi_emmc_amd_probe_slot()
666 .caps = MMC_CAP_8_BIT_DATA | MMC_CAP_NONREMOVABLE,
725 * The Lenovo Miix 320-10ICR has a bug in the _PS0 method of
733 DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo MIIX 320-10ICR"),
739 * The Acer Aspire Switch 10 (SW5-012) microSD slot always
740 * reports the card being write-protected even though microSD
741 * cards do not have a write-protect switch at all.
745 DMI_MATCH(DMI_PRODUCT_NAME, "Aspire SW5-012"),
751 * The Toshiba WT8-B's microSD slot always reports the card being
752 * write-protected.
756 DMI_MATCH(DMI_PRODUCT_NAME, "TOSHIBA ENCORE 2 WT8-B"),
767 for (u = sdhci_acpi_uids; u->hid; u++) { in sdhci_acpi_get_slot()
768 if (acpi_dev_hid_uid_match(adev, u->hid, u->uid)) in sdhci_acpi_get_slot()
769 return u->slot; in sdhci_acpi_get_slot()
776 struct device *dev = &pdev->dev; in sdhci_acpi_probe()
790 return -ENODEV; in sdhci_acpi_probe()
794 quirks = (long)id->driver_data; in sdhci_acpi_probe()
798 /* Power on the SDHCI controller and its children */ in sdhci_acpi_probe()
802 return -EPROBE_DEFER; in sdhci_acpi_probe()
806 return -ENOMEM; in sdhci_acpi_probe()
812 if (!devm_request_mem_region(dev, iomem->start, len, dev_name(dev))) in sdhci_acpi_probe()
813 return -ENOMEM; in sdhci_acpi_probe()
815 priv_size = slot ? slot->priv_size : 0; in sdhci_acpi_probe()
821 c->host = host; in sdhci_acpi_probe()
822 c->slot = slot; in sdhci_acpi_probe()
823 c->pdev = pdev; in sdhci_acpi_probe()
824 c->use_runtime_pm = sdhci_acpi_flag(c, SDHCI_ACPI_RUNTIME_PM); in sdhci_acpi_probe()
828 host->hw_name = "ACPI"; in sdhci_acpi_probe()
829 host->ops = &sdhci_acpi_ops_dflt; in sdhci_acpi_probe()
830 host->irq = platform_get_irq(pdev, 0); in sdhci_acpi_probe()
831 if (host->irq < 0) { in sdhci_acpi_probe()
832 err = host->irq; in sdhci_acpi_probe()
836 host->ioaddr = devm_ioremap(dev, iomem->start, in sdhci_acpi_probe()
838 if (host->ioaddr == NULL) { in sdhci_acpi_probe()
839 err = -ENOMEM; in sdhci_acpi_probe()
843 if (c->slot) { in sdhci_acpi_probe()
844 if (c->slot->probe_slot) { in sdhci_acpi_probe()
845 err = c->slot->probe_slot(pdev, device); in sdhci_acpi_probe()
849 if (c->slot->chip) { in sdhci_acpi_probe()
850 host->ops = c->slot->chip->ops; in sdhci_acpi_probe()
851 host->quirks |= c->slot->chip->quirks; in sdhci_acpi_probe()
852 host->quirks2 |= c->slot->chip->quirks2; in sdhci_acpi_probe()
853 host->mmc->caps |= c->slot->chip->caps; in sdhci_acpi_probe()
854 host->mmc->caps2 |= c->slot->chip->caps2; in sdhci_acpi_probe()
855 host->mmc->pm_caps |= c->slot->chip->pm_caps; in sdhci_acpi_probe()
857 host->quirks |= c->slot->quirks; in sdhci_acpi_probe()
858 host->quirks2 |= c->slot->quirks2; in sdhci_acpi_probe()
859 host->mmc->caps |= c->slot->caps; in sdhci_acpi_probe()
860 host->mmc->caps2 |= c->slot->caps2; in sdhci_acpi_probe()
861 host->mmc->pm_caps |= c->slot->pm_caps; in sdhci_acpi_probe()
864 host->mmc->caps2 |= MMC_CAP2_NO_PRESCAN_POWERUP; in sdhci_acpi_probe()
869 err = mmc_gpiod_request_cd(host->mmc, NULL, 0, v, 0); in sdhci_acpi_probe()
871 if (err == -EPROBE_DEFER) in sdhci_acpi_probe()
874 c->use_runtime_pm = false; in sdhci_acpi_probe()
878 c->reset_signal_volt_on_suspend = true; in sdhci_acpi_probe()
881 host->mmc->caps2 |= MMC_CAP2_NO_WRITE_PROTECT; in sdhci_acpi_probe()
888 if (c->slot && c->slot->setup_host) { in sdhci_acpi_probe()
889 err = c->slot->setup_host(pdev); in sdhci_acpi_probe()
898 if (c->use_runtime_pm) { in sdhci_acpi_probe()
911 sdhci_cleanup_host(c->host); in sdhci_acpi_probe()
913 if (c->slot && c->slot->free_slot) in sdhci_acpi_probe()
914 c->slot->free_slot(pdev); in sdhci_acpi_probe()
916 sdhci_free_host(c->host); in sdhci_acpi_probe()
923 struct device *dev = &pdev->dev; in sdhci_acpi_remove()
926 if (c->use_runtime_pm) { in sdhci_acpi_remove()
932 if (c->slot && c->slot->remove_slot) in sdhci_acpi_remove()
933 c->slot->remove_slot(pdev); in sdhci_acpi_remove()
935 dead = (sdhci_readl(c->host, SDHCI_INT_STATUS) == ~0); in sdhci_acpi_remove()
936 sdhci_remove_host(c->host, dead); in sdhci_acpi_remove()
938 if (c->slot && c->slot->free_slot) in sdhci_acpi_remove()
939 c->slot->free_slot(pdev); in sdhci_acpi_remove()
941 sdhci_free_host(c->host); in sdhci_acpi_remove()
948 struct sdhci_host *host = c->host; in sdhci_acpi_reset_signal_voltage_if_needed()
950 if (c->is_intel && c->reset_signal_volt_on_suspend && in sdhci_acpi_reset_signal_voltage_if_needed()
951 host->mmc->ios.signal_voltage != MMC_SIGNAL_VOLTAGE_330) { in sdhci_acpi_reset_signal_voltage_if_needed()
965 struct sdhci_host *host = c->host; in sdhci_acpi_suspend()
968 if (host->tuning_mode != SDHCI_TUNING_MODE_3) in sdhci_acpi_suspend()
969 mmc_retune_needed(host->mmc); in sdhci_acpi_suspend()
983 sdhci_acpi_byt_setting(&c->pdev->dev); in sdhci_acpi_resume()
985 return sdhci_resume_host(c->host); in sdhci_acpi_resume()
995 struct sdhci_host *host = c->host; in sdhci_acpi_runtime_suspend()
998 if (host->tuning_mode != SDHCI_TUNING_MODE_3) in sdhci_acpi_runtime_suspend()
999 mmc_retune_needed(host->mmc); in sdhci_acpi_runtime_suspend()
1013 sdhci_acpi_byt_setting(&c->pdev->dev); in sdhci_acpi_runtime_resume()
1015 return sdhci_runtime_resume_host(c->host, 0); in sdhci_acpi_runtime_resume()
1028 .name = "sdhci-acpi",