diff --git a/sys/dev/acpi/sdhc_acpi.c b/sys/dev/acpi/sdhc_acpi.c index bb58a497b724..db206f7eccb6 100644 --- a/sys/dev/acpi/sdhc_acpi.c +++ b/sys/dev/acpi/sdhc_acpi.c @@ -111,6 +111,13 @@ static const struct sdhc_acpi_slot { SDHC_FLAG_NO_PWR0 | SDHC_FLAG_SINGLE_POWER_WRITE }, + /* Broadcom BRCM5D12 (eMMC/SD on Raspberry Pi 5) */ + { .hid = "BRCM5D12", .uid = "0", .type = SLOT_TYPE_SD, + .flags = SDHC_FLAG_NO_PWR0 }, + { .hid = "BRCM5D12", .uid = "1", .type = SLOT_TYPE_EMMC, + .flags = SDHC_FLAG_NO_PWR0 }, + { .hid = "BRCM5D12", .type = SLOT_TYPE_EMMC }, + /* Generic IDs last */ { .hid = "PNP0D40", .type = SLOT_TYPE_SD }, { .hid = "PNP0FFF", .uid = "3", .type = SLOT_TYPE_SD }, @@ -133,6 +140,7 @@ sdhc_acpi_find_slot(ACPI_DEVICE_INFO *ad) slot = &sdhc_acpi_slot_map[i]; const char * const slot_id[] = { slot->hid, NULL }; if (acpi_match_hid(ad, slot_id)) { +printf("%s: hid >%s< uid >%s< flags %x\n", __func__, slot->hid, slot->uid, slot->flags); if (slot->uid == NULL || ((ad->Valid & ACPI_VALID_UID) != 0 && uid != NULL && @@ -179,6 +187,20 @@ sdhc_acpi_attach(device_t parent, device_t self, void *opaque) if (slot->type == SLOT_TYPE_EMMC) sc->sc.sc_vendor_hw_reset = sdhc_acpi_intel_emmc_hw_reset; +#if 1 + /* Workaround: some boards (e.g. BRCM5D12) don't expose 1.8V control + * via ACPI. Disable 1.8V support so the host won't attempt voltage + * switching which causes SDIO CMD5 to time out. */ + if ((aa->aa_node->ad_devinfo->Valid & ACPI_VALID_HID) && + aa->aa_node->ad_devinfo->HardwareId.String != NULL && + strcmp(aa->aa_node->ad_devinfo->HardwareId.String, "BRCM5D12") == 0) { + sc->sc.sc_flags |= SDHC_FLAG_NO_1_8_V; + aprint_verbose_dev(self, "sdhc: applying BRCM5D12 quirk, disabling 1.8V\n"); + sc->sc.sc_flags |= SDHC_FLAG_NO_PWR0; + aprint_verbose_dev(self, "sdhc: applying BRCM5D12 quirk, applying NO_PWR0\n"); + } +#endif + rv = acpi_dsm_query(sc->sc_handle, sdhc_acpi_rockchip_dsm_uuid, ROCKCHIP_DSM_REV, &funcs); if (ACPI_SUCCESS(rv) && diff --git a/sys/dev/sdmmc/if_bwfm_sdio.c b/sys/dev/sdmmc/if_bwfm_sdio.c index a9326fde603b..449692b5f7dd 100644 --- a/sys/dev/sdmmc/if_bwfm_sdio.c +++ b/sys/dev/sdmmc/if_bwfm_sdio.c @@ -297,6 +297,11 @@ static const struct bwfm_sdio_product { SDMMC_PRODUCT_BROADCOM_BCM4334, SDMMC_CIS_BROADCOM_BCM4334 }, + { + SDMMC_VENDOR_BROADCOM, + SDMMC_PRODUCT_BROADCOM_BCM4345, + SDMMC_CIS_BROADCOM_BCM4345 + }, { SDMMC_VENDOR_BROADCOM, SDMMC_PRODUCT_BROADCOM_BCM43143,