git: 993cd606c238 - stable/13 - sdhci_xenon: add ACPI support
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 29 Mar 2022 22:59:58 UTC
The branch stable/13 has been updated by mw: URL: https://cgit.FreeBSD.org/src/commit/?id=993cd606c238a847a1b1710267483c27df9812cd commit 993cd606c238a847a1b1710267483c27df9812cd Author: Bartlomiej Grzesik <bag@semihalf.com> AuthorDate: 2021-07-21 14:36:11 +0000 Commit: Marcin Wojtas <mw@FreeBSD.org> CommitDate: 2022-03-29 22:24:27 +0000 sdhci_xenon: add ACPI support Add support for ACPI device probing for SDHCI controller found on Marvell chips. Reviewed by: mw Sponsored by: Semihalf Differential revision: https://reviews.freebsd.org/D31600 (cherry picked from commit adbce5ff747b6372b6cda915d06fe52b4a67b4d8) --- sys/conf/files.arm64 | 1 + sys/dev/sdhci/sdhci_xenon_acpi.c | 140 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 141 insertions(+) diff --git a/sys/conf/files.arm64 b/sys/conf/files.arm64 index f1a2efe16448..89dae243011f 100644 --- a/sys/conf/files.arm64 +++ b/sys/conf/files.arm64 @@ -264,6 +264,7 @@ dev/psci/smccc.c standard dev/safexcel/safexcel.c optional safexcel fdt dev/sdhci/sdhci_xenon.c optional sdhci_xenon sdhci +dev/sdhci/sdhci_xenon_acpi.c optional sdhci_xenon sdhci acpi dev/sdhci/sdhci_xenon_fdt.c optional sdhci_xenon sdhci fdt dev/uart/uart_cpu_arm64.c optional uart diff --git a/sys/dev/sdhci/sdhci_xenon_acpi.c b/sys/dev/sdhci/sdhci_xenon_acpi.c new file mode 100644 index 000000000000..1bd4c03c67e4 --- /dev/null +++ b/sys/dev/sdhci/sdhci_xenon_acpi.c @@ -0,0 +1,140 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD + * + * Copyright (c) 2021 Semihalf + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +#include <sys/param.h> +#include <sys/bus.h> +#include <sys/kernel.h> +#include <sys/module.h> +#include <sys/taskqueue.h> + +#include <dev/mmc/bridge.h> +#include <dev/mmc/mmcbrvar.h> +#include <dev/mmc/mmcreg.h> + +#include <dev/mmc/mmc_helpers.h> + +#include <contrib/dev/acpica/include/acpi.h> +#include <contrib/dev/acpica/include/accommon.h> +#include <dev/acpica/acpivar.h> + +#ifdef EXT_RESOURCES +#include <dev/extres/regulator/regulator.h> +#endif + +#include <dev/sdhci/sdhci.h> +#include <dev/sdhci/sdhci_xenon.h> + +#include "mmcbr_if.h" +#include "sdhci_if.h" + +#include "opt_mmccam.h" +#include "opt_soc.h" + +static char *sdhci_xenon_hids[] = { + "MRVL0002", + "MRVL0003", + "MRVL0004", + NULL +}; + +static int +sdhci_xenon_acpi_probe(device_t dev) +{ + device_t bus; + int err; + + bus = device_get_parent(dev); + + err = ACPI_ID_PROBE(bus, dev, sdhci_xenon_hids, NULL); + if (err <= 0) { + device_set_desc(dev, "Armada Xenon SDHCI controller"); + return (err); + } + + return (ENXIO); +} + +static int +sdhci_xenon_acpi_attach(device_t dev) +{ + struct sdhci_xenon_softc *sc; + struct sdhci_slot *slot; + struct mmc_helper mmc_helper; + + sc = device_get_softc(dev); + memset(&mmc_helper, 0, sizeof(mmc_helper)); + + slot = malloc(sizeof(*slot), M_DEVBUF, M_ZERO | M_WAITOK); + if (!slot) + return (ENOMEM); + + /* + * Don't use regularators. + * In ACPI mode the firmware takes care of them for us + */ + sc->skip_regulators = true; + sc->slot = slot; + + if (mmc_parse(dev, &mmc_helper, &slot->host) != 0) + return (ENXIO); + + if (mmc_helper.props & MMC_PROP_NON_REMOVABLE) { + slot->opt |= SDHCI_NON_REMOVABLE; + if (bootverbose) + device_printf(dev, "Non-removable media\n"); + } + + sc->wp_inverted = mmc_helper.props & MMC_PROP_WP_INVERTED; + + return (sdhci_xenon_attach(dev)); +} + +static device_method_t sdhci_xenon_acpi_methods[] = { + /* device_if */ + DEVMETHOD(device_probe, sdhci_xenon_acpi_probe), + DEVMETHOD(device_attach, sdhci_xenon_acpi_attach), + DEVMETHOD(device_detach, sdhci_xenon_detach), + + DEVMETHOD(sdhci_get_card_present, sdhci_generic_get_card_present), + + DEVMETHOD_END +}; + +DEFINE_CLASS_1(sdhci_xenon, sdhci_xenon_acpi_driver, sdhci_xenon_acpi_methods, + sizeof(struct sdhci_xenon_softc), sdhci_xenon_driver); + +static devclass_t sdhci_xenon_acpi_devclass; + +DRIVER_MODULE(sdhci_xenon, acpi, sdhci_xenon_acpi_driver, + sdhci_xenon_acpi_devclass, NULL, NULL); + +#ifndef MMCCAM +MMC_DECLARE_BRIDGE(sdhci_xenon_acpi); +#endif