git: c8b472aa4b9d - main - jh7110: enable MMC driver

From: Mitchell Horne <mhorne_at_FreeBSD.org>
Date: Tue, 07 May 2024 16:04:30 UTC
The branch main has been updated by mhorne:

URL: https://cgit.FreeBSD.org/src/commit/?id=c8b472aa4b9da064223cc134ad06a08defb23e6f

commit c8b472aa4b9da064223cc134ad06a08defb23e6f
Author:     Mitchell Horne <mhorne@FreeBSD.org>
AuthorDate: 2024-03-04 18:38:43 +0000
Commit:     Mitchell Horne <mhorne@FreeBSD.org>
CommitDate: 2024-05-07 16:02:57 +0000

    jh7110: enable MMC driver
    
    Add a variant of the existing dwmmc driver, and enable it in the GENERIC
    kernel.
    
    Sponsored by:   The FreeBSD Foundation
    Differential Revision:  https://reviews.freebsd.org/D44026
---
 sys/dev/mmc/host/dwmmc_starfive.c | 114 ++++++++++++++++++++++++++++++++++++++
 sys/riscv/conf/std.starfive       |   4 ++
 sys/riscv/starfive/files.starfive |   1 +
 3 files changed, 119 insertions(+)

diff --git a/sys/dev/mmc/host/dwmmc_starfive.c b/sys/dev/mmc/host/dwmmc_starfive.c
new file mode 100644
index 000000000000..ab90da3b2b57
--- /dev/null
+++ b/sys/dev/mmc/host/dwmmc_starfive.c
@@ -0,0 +1,114 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright 2017 Emmanuel Vadot <manu@freebsd.org>
+ * Copyright (c) 2024 The FreeBSD Foundation
+ *
+ * Portions of this software were developed by Mitchell Horne
+ * <mhorne@FreeBSD.org> under sponsorship from the FreeBSD Foundation.
+ */
+
+#include <sys/param.h>
+#include <sys/kernel.h>
+#include <sys/bus.h>
+#include <sys/module.h>
+#include <sys/queue.h>
+#include <sys/taskqueue.h>
+
+#include <machine/bus.h>
+
+#include <dev/mmc/bridge.h>
+#include <dev/mmc/mmc_fdt_helpers.h>
+
+#include <dev/mmc/host/dwmmc_var.h>
+
+#include <dev/ofw/ofw_bus_subr.h>
+
+#include "opt_mmccam.h"
+
+enum dwmmc_type {
+	DWMMC_GENERIC = 1,
+	DWMMC_JH7110
+};
+
+static struct ofw_compat_data compat_data[] = {
+	{"snps,dw-mshc",	DWMMC_GENERIC},
+	{"starfive,jh7110-mmc",	DWMMC_JH7110},
+	{NULL,			0}
+};
+
+static int dwmmc_starfive_update_ios(struct dwmmc_softc *sc,
+    struct mmc_ios *ios)
+{
+	int err;
+
+	if (ios->clock != 0 && ios->clock != sc->bus_hz) {
+		err = clk_set_freq(sc->ciu, ios->clock, CLK_SET_ROUND_DOWN);
+		if (err != 0) {
+			printf("%s, Failed to set freq for ciu clock\n",
+			    __func__);
+			return (err);
+		}
+		sc->bus_hz = ios->clock;
+	}
+
+	return (0);
+}
+
+static int
+starfive_dwmmc_probe(device_t dev)
+{
+	phandle_t node;
+	int type;
+
+	if (!ofw_bus_status_okay(dev))
+		return (ENXIO);
+
+	type = ofw_bus_search_compatible(dev, compat_data)->ocd_data;
+	if (type == 0)
+		return (ENXIO);
+
+	/*
+	 * If we matched the generic compat string, check the top-level board
+	 * compatible, to ensure we should actually use the starfive driver.
+	 */
+	if (type == DWMMC_GENERIC) {
+		node = OF_finddevice("/");
+		if (!ofw_bus_node_is_compatible(node, "starfive,jh7110"))
+			return (ENXIO);
+	}
+
+	device_set_desc(dev, "Synopsys DesignWare Mobile Storage "
+	    "Host Controller (StarFive)");
+
+	return (BUS_PROBE_VENDOR);
+}
+
+static int
+starfive_dwmmc_attach(device_t dev)
+{
+	struct dwmmc_softc *sc;
+
+	sc = device_get_softc(dev);
+	sc->update_ios = &dwmmc_starfive_update_ios;
+
+	return (dwmmc_attach(dev));
+}
+
+static device_method_t starfive_dwmmc_methods[] = {
+	/* bus interface */
+	DEVMETHOD(device_probe,		starfive_dwmmc_probe),
+	DEVMETHOD(device_attach,	starfive_dwmmc_attach),
+	DEVMETHOD(device_detach,	dwmmc_detach),
+
+	DEVMETHOD_END
+};
+
+DEFINE_CLASS_1(starfive_dwmmc, starfive_dwmmc_driver, starfive_dwmmc_methods,
+    sizeof(struct dwmmc_softc), dwmmc_driver);
+
+DRIVER_MODULE(starfive_dwmmc, simplebus, starfive_dwmmc_driver, 0, 0);
+
+#ifndef MMCCAM
+MMC_DECLARE_BRIDGE(starfive_dwmmc);
+#endif
diff --git a/sys/riscv/conf/std.starfive b/sys/riscv/conf/std.starfive
index 578110dfd5a9..e4e3e7c46f3e 100644
--- a/sys/riscv/conf/std.starfive
+++ b/sys/riscv/conf/std.starfive
@@ -4,4 +4,8 @@
 
 device		uart_snps	# DesignWare Synopsis UART driver
 
+# MMC/SD/SDIO Card slot support
+device		dwmmc
+device		dwmmc_starfive
+
 files		"../starfive/files.starfive"
diff --git a/sys/riscv/starfive/files.starfive b/sys/riscv/starfive/files.starfive
index e11acba9dab1..d867dee1099b 100644
--- a/sys/riscv/starfive/files.starfive
+++ b/sys/riscv/starfive/files.starfive
@@ -2,5 +2,6 @@ dev/clk/starfive/jh7110_clk.c		standard
 dev/clk/starfive/jh7110_clk_aon.c	standard
 dev/clk/starfive/jh7110_clk_pll.c	standard
 dev/clk/starfive/jh7110_clk_sys.c	standard
+dev/mmc/host/dwmmc_starfive.c		optional	dwmmc_starfive fdt
 
 riscv/starfive/starfive_syscon.c	standard