On 10/13/24 4:32 PM, Lothar Rubusch wrote:
[...]
diff --git a/board/enclustra/mercury_aa1/aa1_set_storage_cmd.c
b/board/enclustra/mercury_aa1/aa1_set_storage_cmd.c
new file mode 100644
index 0000000000..95438c5487
--- /dev/null
+++ b/board/enclustra/mercury_aa1/aa1_set_storage_cmd.c
@@ -0,0 +1,190 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2024 Enclustra GmbH
+ * <[email protected]>
+ */
+
+#include <command.h>
+#include <env.h>
+#include <init.h>
+#include <dm.h>
+#include <dm/uclass.h>
+#include <asm-generic/gpio.h>
+#include <asm/io.h>
+
+/* Pin muxing */
+#define ALTERA_NONE 0
+#define ALTERA_MMC 1
+#define ALTERA_QSPI 2
+#define ALTERA_EMMC 3
+#define MMC_CLK_DIV 0x9
+#define QSPI_CLK_DIV 0x384
+#define ALTERA_PINMUX_OFFS 0xffd07200
+#define ALTERA_CLKMGR_MAINPLL_CNTR6CLK_BASE 0xFFD04078
+
+static int altera_current_storage = ALTERA_NONE;
+
+static const struct udevice_id altera_set_storage_match[] = {
+ { .compatible = "encl,altera_set_storage" },
DT bindings indicate the prefix is incorrect:
Documentation/devicetree/bindings/vendor-prefixes.yaml: "^enclustra,.*":
Documentation/devicetree/bindings/vendor-prefixes.yaml: description:
Enclustra GmbH
+ { }
+};
+
+U_BOOT_DRIVER(altera_set_storage) = {
+ .name = "altera_set_storage",
+ .id = UCLASS_MISC,
+ .of_match = altera_set_storage_match,
+};
+
+static void enclustra_mercury_aa1_write(const u32 *pinmux_arr, int len)
+{
+ u32 i, offset, value;
+
+ for (i = 0; i < len; i += 2) {
+ offset = pinmux_arr[i];
+ value = pinmux_arr[i + 1];
+ writel(value, ALTERA_PINMUX_OFFS + offset);
+ }
+}
+
+static void enclustra_mercury_aa1_set_mux_mmc(void)
+{
+ static const u32 pinmux_arr[] = {0x0c, 0x8, // IO4 connected to
SDMMC
+ 0x10, 0x8, // IO5
+ 0x14, 0x8, // IO6
+ 0x18, 0x8, // IO7
+ 0x1c, 0x8, // IO8
+ 0x20, 0x8, // IO9
+ 0x24, 0xf, // IO10 connected to
GPIO
+ 0x28, 0xf, // IO11
+ 0x2c, 0xf, // IO12
+ 0x30, 0xf, // IO13
+ 0x34, 0xf, // IO14
+ 0x38, 0xf}; // IO15
+ enclustra_mercury_aa1_write(pinmux_arr, sizeof(pinmux_arr) /
sizeof(u32));
Try ARRAY_SIZE()
[...]
+static int altera_set_storage_cmd(struct cmd_tbl *cmdtp, int flag,
+ int argc, char * const argv[])
+{
+ struct udevice *dev;
+ int ret;
+
+ ret = uclass_get_device_by_driver(UCLASS_MISC,
+ DM_DRIVER_GET(altera_set_storage),
&dev);
+ if (ret)
+ return ret;
+
+ if (argc != 2)
+ return CMD_RET_USAGE;
+
+ if (!strcmp(argv[1], "MMC") || !strcmp(argv[1], "mmc"))
+ return altera_set_storage(dev, ALTERA_MMC);
+ else if (!strcmp(argv[1], "QSPI") || !strcmp(argv[1], "qspi"))
+ return altera_set_storage(dev, ALTERA_QSPI);
+ else if (!strcmp(argv[1], "EMMC") || !strcmp(argv[1], "emmc"))
Try strcasecmp()