build/patch/kernel/archive/sunxi-6.5/patches.megous/cw1200-support-loading-cw1x60-FW.patch

99 lines
3.1 KiB
Diff

From 3464063a61ff62dd1a42e661844bf9a020277597 Mon Sep 17 00:00:00 2001
From: Jernej Skrabec <jernej.skrabec@gmail.com>
Date: Wed, 23 Jun 2021 19:54:56 +0200
Subject: [PATCH 416/464] cw1200: support loading cw1x60 FW
Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com>
---
drivers/net/wireless/st/cw1200/fwio.c | 47 +++++++++++++++++++++++----
drivers/net/wireless/st/cw1200/hwio.h | 1 +
2 files changed, 42 insertions(+), 6 deletions(-)
diff --git a/drivers/net/wireless/st/cw1200/fwio.c b/drivers/net/wireless/st/cw1200/fwio.c
index 2a03dc533b6a..a71e90fff616 100644
--- a/drivers/net/wireless/st/cw1200/fwio.c
+++ b/drivers/net/wireless/st/cw1200/fwio.c
@@ -48,6 +48,39 @@ static int cw1200_get_hw_type(u32 config_reg_val, int *major_revision)
return hw_type;
}
+static int cw1200_load_bootloader(struct cw1200_common *priv)
+{
+ const struct firmware *bootloader = NULL;
+ const char *bl_path = BOOTLOADER_CW1X60;
+ u32 *data, i, addr = AHB_MEMORY_ADDRESS;
+ int ret;
+
+ ret = request_firmware(&bootloader, bl_path, priv->pdev);
+ if (ret) {
+ pr_err("Can't load bootloader file %s.\n", bl_path);
+ goto error;
+ }
+
+ data = (u32 *)bootloader->data;
+ for (i = 0; i < bootloader->size / 4; i++, addr += 4) {
+ ret = cw1200_reg_write_32(priv,
+ ST90TDS_SRAM_BASE_ADDR_REG_ID, addr);
+ if (ret < 0)
+ goto error;
+ ret = cw1200_reg_write_32(priv,
+ ST90TDS_AHB_DPORT_REG_ID, data[i]);
+ if (ret < 0)
+ goto error;
+ }
+
+ pr_info("Bootloader download complete\n");
+
+error:
+ release_firmware(bootloader);
+
+ return ret;
+}
+
static int cw1200_load_firmware_cw1200(struct cw1200_common *priv)
{
int ret, block, num_blocks;
@@ -128,9 +161,11 @@ static int cw1200_load_firmware_cw1200(struct cw1200_common *priv)
APB_WRITE(DOWNLOAD_STATUS_REG, DOWNLOAD_PENDING);
APB_WRITE(DOWNLOAD_FLAGS_REG, 0);
- /* Write the NOP Instruction */
- REG_WRITE(ST90TDS_SRAM_BASE_ADDR_REG_ID, 0xFFF20000);
- REG_WRITE(ST90TDS_AHB_DPORT_REG_ID, 0xEAFFFFFE);
+ if (priv->hw_revision != CW1X60_HW_REV) {
+ /* Write the NOP Instruction */
+ REG_WRITE(ST90TDS_SRAM_BASE_ADDR_REG_ID, 0xFFF20000);
+ REG_WRITE(ST90TDS_AHB_DPORT_REG_ID, 0xEAFFFFFE);
+ }
/* Release CPU from RESET */
REG_READ(ST90TDS_CONFIG_REG_ID, val32);
@@ -469,9 +504,9 @@ int cw1200_load_firmware(struct cw1200_common *priv)
switch (priv->hw_type) {
case HIF_8601_SILICON:
if (priv->hw_revision == CW1X60_HW_REV) {
- pr_err("Can't handle CW1160/1260 firmware load yet.\n");
- ret = -ENOTSUPP;
- goto out;
+ ret = cw1200_load_bootloader(priv);
+ if (ret)
+ goto out;
}
ret = cw1200_load_firmware_cw1200(priv);
break;
diff --git a/drivers/net/wireless/st/cw1200/hwio.h b/drivers/net/wireless/st/cw1200/hwio.h
index d1e629a566c2..e2d0fb2d02ef 100644
--- a/drivers/net/wireless/st/cw1200/hwio.h
+++ b/drivers/net/wireless/st/cw1200/hwio.h
@@ -89,6 +89,7 @@ struct download_cntl_t {
#define SYS_BASE_ADDR_SILICON (0)
+#define AHB_MEMORY_ADDRESS (SYS_BASE_ADDR_SILICON + 0x08000000)
#define PAC_BASE_ADDRESS_SILICON (SYS_BASE_ADDR_SILICON + 0x09000000)
#define PAC_SHARED_MEMORY_SILICON (PAC_BASE_ADDRESS_SILICON)
--
2.34.1