• Home
  • Raw
  • Download

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

1 // SPDX-License-Identifier: GPL-2.0-only
15 #include <linux/dma-mapping.h>
30 #include <linux/mmc/slot-gpio.h>
34 #include <asm/intel-family.h>
39 #include "sdhci.h"
51 unsigned long caps; member
60 unsigned long caps; member
88 return (void *)c->private; in sdhci_acpi_priv()
93 return c->slot && (c->slot->flags & flag); in sdhci_acpi_flag()
125 return -EOPNOTSUPP; in __intel_dsm()
127 if (obj->type == ACPI_TYPE_INTEGER) { in __intel_dsm()
128 *result = obj->integer.value; in __intel_dsm()
129 } else if (obj->type == ACPI_TYPE_BUFFER && obj->buffer.length > 0) { in __intel_dsm()
130 size_t len = min_t(size_t, obj->buffer.length, 4); in __intel_dsm()
133 memcpy(result, obj->buffer.pointer, len); in __intel_dsm()
135 dev_err(dev, "%s DSM fn %u obj->type %d obj->buffer.length %d\n", in __intel_dsm()
136 __func__, fn, obj->type, obj->buffer.length); in __intel_dsm()
137 err = -EINVAL; in __intel_dsm()
148 if (fn > 31 || !(intel_host->dsm_fns & (1 << fn))) in intel_dsm()
149 return -EOPNOTSUPP; in intel_dsm()
159 intel_host->hs_caps = ~0; in intel_dsm_init()
161 err = __intel_dsm(intel_host, dev, INTEL_DSM_FNS, &intel_host->dsm_fns); in intel_dsm_init()
168 pr_debug("%s: DSM function mask %#x\n", in intel_dsm_init()
169 mmc_hostname(mmc), intel_host->dsm_fns); in intel_dsm_init()
171 intel_dsm(intel_host, dev, INTEL_DSM_HS_CAPS, &intel_host->hs_caps); in intel_dsm_init()
188 switch (ios->signal_voltage) { in intel_start_signal_voltage_switch()
317 if (ACPI_COMPANION(&dev->dev) && PCI_SLOT(dev->devfn) == slot && in sdhci_acpi_cht_pci_wifi()
318 parent && PCI_SLOT(parent->devfn) == parent_slot && in sdhci_acpi_cht_pci_wifi()
371 spin_lock_irqsave(&host->lock, flags); in bxt_get_cd()
373 if (host->flags & SDHCI_DEVICE_DEAD) in bxt_get_cd()
378 spin_unlock_irqrestore(&host->lock, flags); in bxt_get_cd()
387 struct sdhci_host *host = c->host; in intel_probe_slot()
392 host->timeout_clk = 1000; /* 1000 kHz i.e. 1 MHz */ in intel_probe_slot()
395 host->mmc_host_ops.get_cd = bxt_get_cd; in intel_probe_slot()
397 intel_dsm_init(intel_host, &pdev->dev, host->mmc); in intel_probe_slot()
399 host->mmc_host_ops.start_signal_voltage_switch = in intel_probe_slot()
402 c->is_intel = true; in intel_probe_slot()
412 if (!(intel_host->hs_caps & INTEL_DSM_HS_CAPS_SDR25)) in intel_setup_host()
413 c->host->mmc->caps &= ~MMC_CAP_UHS_SDR25; in intel_setup_host()
415 if (!(intel_host->hs_caps & INTEL_DSM_HS_CAPS_SDR50)) in intel_setup_host()
416 c->host->mmc->caps &= ~MMC_CAP_UHS_SDR50; in intel_setup_host()
418 if (!(intel_host->hs_caps & INTEL_DSM_HS_CAPS_DDR50)) in intel_setup_host()
419 c->host->mmc->caps &= ~MMC_CAP_UHS_DDR50; in intel_setup_host()
421 if (!(intel_host->hs_caps & INTEL_DSM_HS_CAPS_SDR104)) in intel_setup_host()
422 c->host->mmc->caps &= ~MMC_CAP_UHS_SDR104; in intel_setup_host()
429 .caps = MMC_CAP_8_BIT_DATA | MMC_CAP_NONREMOVABLE |
448 .caps = MMC_CAP_NONREMOVABLE | MMC_CAP_POWER_OFF_CARD |
464 .caps = MMC_CAP_WAIT_WHILE_BUSY | MMC_CAP_AGGRESSIVE_PM,
485 struct sdhci_host *host = c->host; in qcom_probe_slot()
488 *irq = -EINVAL; in qcom_probe_slot()
504 struct device *dev = &pdev->dev; in qcom_free_slot()
506 struct sdhci_host *host = c->host; in qcom_free_slot()
512 return -ENODEV; in qcom_free_slot()
527 .caps = MMC_CAP_NONREMOVABLE,
535 .caps = MMC_CAP_NONREMOVABLE,
543 /* AMD sdhci reset dll register. */
565 amd_host->dll_enabled = enable; in sdhci_acpi_amd_hs400_dll()
570 * HS->HS200->Perform Tuning->HS->HS400
572 * The re-tuning sequence is:
573 * HS400->DDR52->HS->HS200->Perform Tuning->HS->HS400
578 * HS400, we can re-enable the tuned clock.
586 unsigned int old_timing = host->timing; in amd_set_ios()
591 if (old_timing != host->timing && amd_host->tuned_clock) { in amd_set_ios()
592 if (host->timing == MMC_TIMING_MMC_HS400 || in amd_set_ios()
593 host->timing == MMC_TIMING_MMC_HS200) { in amd_set_ios()
604 if (host->timing == MMC_TIMING_MMC_HS400 && in amd_set_ios()
605 !amd_host->dll_enabled) in amd_set_ios()
617 amd_host->tuned_clock = false; in amd_sdhci_execute_tuning()
621 if (!err && !host->tuning_err) in amd_sdhci_execute_tuning()
622 amd_host->tuned_clock = true; in amd_sdhci_execute_tuning()
627 static void amd_sdhci_reset(struct sdhci_host *host, u8 mask) in amd_sdhci_reset() argument
632 if (mask & SDHCI_RESET_ALL) { in amd_sdhci_reset()
633 amd_host->tuned_clock = false; in amd_sdhci_reset()
637 sdhci_reset(host, mask); in amd_sdhci_reset()
655 struct sdhci_host *host = c->host; in sdhci_acpi_emmc_amd_probe_slot()
658 if (host->caps1 & SDHCI_SUPPORT_DDR50) in sdhci_acpi_emmc_amd_probe_slot()
659 host->mmc->caps = MMC_CAP_1_8V_DDR; in sdhci_acpi_emmc_amd_probe_slot()
661 if ((host->caps1 & SDHCI_SUPPORT_SDR104) && in sdhci_acpi_emmc_amd_probe_slot()
662 (host->mmc->caps & MMC_CAP_1_8V_DDR)) in sdhci_acpi_emmc_amd_probe_slot()
663 host->mmc->caps2 = MMC_CAP2_HS400_1_8V; in sdhci_acpi_emmc_amd_probe_slot()
688 * 2) sdhci_get_preset_value is using a non-standard register to in sdhci_acpi_emmc_amd_probe_slot()
690 * non-standard register. In fact, it doesn't expose the HS400 in sdhci_acpi_emmc_amd_probe_slot()
691 * preset register anywhere in the SDHCI memory map. This results in sdhci_acpi_emmc_amd_probe_slot()
700 host->quirks2 |= SDHCI_QUIRK2_PRESET_VALUE_BROKEN; in sdhci_acpi_emmc_amd_probe_slot()
702 host->mmc_host_ops.select_drive_strength = amd_select_drive_strength; in sdhci_acpi_emmc_amd_probe_slot()
703 host->mmc_host_ops.set_ios = amd_set_ios; in sdhci_acpi_emmc_amd_probe_slot()
704 host->mmc_host_ops.execute_tuning = amd_sdhci_execute_tuning; in sdhci_acpi_emmc_amd_probe_slot()
710 .caps = MMC_CAP_8_BIT_DATA | MMC_CAP_NONREMOVABLE,
767 * The Lenovo Miix 320-10ICR has a bug in the _PS0 method of
775 DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo MIIX 320-10ICR"),
781 * The Acer Aspire Switch 10 (SW5-012) microSD slot always
782 * reports the card being write-protected even though microSD
783 * cards do not have a write-protect switch at all.
787 DMI_MATCH(DMI_PRODUCT_NAME, "Aspire SW5-012"),
793 * The Toshiba WT8-B's microSD slot always reports the card being
794 * write-protected.
798 DMI_MATCH(DMI_PRODUCT_NAME, "TOSHIBA ENCORE 2 WT8-B"),
809 for (u = sdhci_acpi_uids; u->hid; u++) { in sdhci_acpi_get_slot()
810 if (acpi_dev_hid_uid_match(adev, u->hid, u->uid)) in sdhci_acpi_get_slot()
811 return u->slot; in sdhci_acpi_get_slot()
818 struct device *dev = &pdev->dev; in sdhci_acpi_probe()
832 return -ENODEV; in sdhci_acpi_probe()
836 quirks = (long)id->driver_data; in sdhci_acpi_probe()
840 /* Power on the SDHCI controller and its children */ in sdhci_acpi_probe()
843 list_for_each_entry(child, &device->children, node) in sdhci_acpi_probe()
844 if (child->status.present && child->status.enabled) in sdhci_acpi_probe()
849 return -EPROBE_DEFER; in sdhci_acpi_probe()
853 return -ENOMEM; in sdhci_acpi_probe()
859 if (!devm_request_mem_region(dev, iomem->start, len, dev_name(dev))) in sdhci_acpi_probe()
860 return -ENOMEM; in sdhci_acpi_probe()
862 priv_size = slot ? slot->priv_size : 0; in sdhci_acpi_probe()
868 c->host = host; in sdhci_acpi_probe()
869 c->slot = slot; in sdhci_acpi_probe()
870 c->pdev = pdev; in sdhci_acpi_probe()
871 c->use_runtime_pm = sdhci_acpi_flag(c, SDHCI_ACPI_RUNTIME_PM); in sdhci_acpi_probe()
875 host->hw_name = "ACPI"; in sdhci_acpi_probe()
876 host->ops = &sdhci_acpi_ops_dflt; in sdhci_acpi_probe()
877 host->irq = platform_get_irq(pdev, 0); in sdhci_acpi_probe()
878 if (host->irq < 0) { in sdhci_acpi_probe()
879 err = -EINVAL; in sdhci_acpi_probe()
883 host->ioaddr = devm_ioremap(dev, iomem->start, in sdhci_acpi_probe()
885 if (host->ioaddr == NULL) { in sdhci_acpi_probe()
886 err = -ENOMEM; in sdhci_acpi_probe()
890 if (c->slot) { in sdhci_acpi_probe()
891 if (c->slot->probe_slot) { in sdhci_acpi_probe()
892 err = c->slot->probe_slot(pdev, device); in sdhci_acpi_probe()
896 if (c->slot->chip) { in sdhci_acpi_probe()
897 host->ops = c->slot->chip->ops; in sdhci_acpi_probe()
898 host->quirks |= c->slot->chip->quirks; in sdhci_acpi_probe()
899 host->quirks2 |= c->slot->chip->quirks2; in sdhci_acpi_probe()
900 host->mmc->caps |= c->slot->chip->caps; in sdhci_acpi_probe()
901 host->mmc->caps2 |= c->slot->chip->caps2; in sdhci_acpi_probe()
902 host->mmc->pm_caps |= c->slot->chip->pm_caps; in sdhci_acpi_probe()
904 host->quirks |= c->slot->quirks; in sdhci_acpi_probe()
905 host->quirks2 |= c->slot->quirks2; in sdhci_acpi_probe()
906 host->mmc->caps |= c->slot->caps; in sdhci_acpi_probe()
907 host->mmc->caps2 |= c->slot->caps2; in sdhci_acpi_probe()
908 host->mmc->pm_caps |= c->slot->pm_caps; in sdhci_acpi_probe()
911 host->mmc->caps2 |= MMC_CAP2_NO_PRESCAN_POWERUP; in sdhci_acpi_probe()
916 err = mmc_gpiod_request_cd(host->mmc, NULL, 0, v, 0); in sdhci_acpi_probe()
918 if (err == -EPROBE_DEFER) in sdhci_acpi_probe()
921 c->use_runtime_pm = false; in sdhci_acpi_probe()
925 c->reset_signal_volt_on_suspend = true; in sdhci_acpi_probe()
928 host->mmc->caps2 |= MMC_CAP2_NO_WRITE_PROTECT; in sdhci_acpi_probe()
935 if (c->slot && c->slot->setup_host) { in sdhci_acpi_probe()
936 err = c->slot->setup_host(pdev); in sdhci_acpi_probe()
945 if (c->use_runtime_pm) { in sdhci_acpi_probe()
958 sdhci_cleanup_host(c->host); in sdhci_acpi_probe()
960 if (c->slot && c->slot->free_slot) in sdhci_acpi_probe()
961 c->slot->free_slot(pdev); in sdhci_acpi_probe()
963 sdhci_free_host(c->host); in sdhci_acpi_probe()
970 struct device *dev = &pdev->dev; in sdhci_acpi_remove()
973 if (c->use_runtime_pm) { in sdhci_acpi_remove()
979 if (c->slot && c->slot->remove_slot) in sdhci_acpi_remove()
980 c->slot->remove_slot(pdev); in sdhci_acpi_remove()
982 dead = (sdhci_readl(c->host, SDHCI_INT_STATUS) == ~0); in sdhci_acpi_remove()
983 sdhci_remove_host(c->host, dead); in sdhci_acpi_remove()
985 if (c->slot && c->slot->free_slot) in sdhci_acpi_remove()
986 c->slot->free_slot(pdev); in sdhci_acpi_remove()
988 sdhci_free_host(c->host); in sdhci_acpi_remove()
997 struct sdhci_host *host = c->host; in sdhci_acpi_reset_signal_voltage_if_needed()
999 if (c->is_intel && c->reset_signal_volt_on_suspend && in sdhci_acpi_reset_signal_voltage_if_needed()
1000 host->mmc->ios.signal_voltage != MMC_SIGNAL_VOLTAGE_330) { in sdhci_acpi_reset_signal_voltage_if_needed()
1014 struct sdhci_host *host = c->host; in sdhci_acpi_suspend()
1017 if (host->tuning_mode != SDHCI_TUNING_MODE_3) in sdhci_acpi_suspend()
1018 mmc_retune_needed(host->mmc); in sdhci_acpi_suspend()
1032 sdhci_acpi_byt_setting(&c->pdev->dev); in sdhci_acpi_resume()
1034 return sdhci_resume_host(c->host); in sdhci_acpi_resume()
1044 struct sdhci_host *host = c->host; in sdhci_acpi_runtime_suspend()
1047 if (host->tuning_mode != SDHCI_TUNING_MODE_3) in sdhci_acpi_runtime_suspend()
1048 mmc_retune_needed(host->mmc); in sdhci_acpi_runtime_suspend()
1062 sdhci_acpi_byt_setting(&c->pdev->dev); in sdhci_acpi_runtime_resume()
1064 return sdhci_runtime_resume_host(c->host, 0); in sdhci_acpi_runtime_resume()
1077 .name = "sdhci-acpi",