Replace the firmware selection switch with a table keyed by the silicon revision, so per-chip properties can be added in one place. The SDD path becomes const to take the table's names. No functional change. Signed-off-by: Pablo Mazzini --- drivers/net/wireless/st/cw1200/cw1200.h | 3 +- drivers/net/wireless/st/cw1200/fwio.c | 67 +++++++++++++++---------- drivers/net/wireless/st/cw1200/fwio.h | 6 +++ drivers/net/wireless/st/cw1200/main.c | 2 +- 4 files changed, 49 insertions(+), 29 deletions(-) diff --git a/drivers/net/wireless/st/cw1200/cw1200.h b/drivers/net/wireless/st/cw1200/cw1200.h index 48f808cdc1cb..8867b2c94c8d 100644 --- a/drivers/net/wireless/st/cw1200/cw1200.h +++ b/drivers/net/wireless/st/cw1200/cw1200.h @@ -117,10 +117,11 @@ struct cw1200_common { CW1200_HW_REV_CUT22 = 22, CW1X60_HW_REV = 40, } hw_revision; + const struct cw1200_chip *chip; int hw_refclk; bool hw_have_5ghz; const struct firmware *sdd; - char *sdd_path; + const char *sdd_path; struct cw1200_debug_priv *debug; diff --git a/drivers/net/wireless/st/cw1200/fwio.c b/drivers/net/wireless/st/cw1200/fwio.c index 2a03dc533b6a..6601aec1f231 100644 --- a/drivers/net/wireless/st/cw1200/fwio.c +++ b/drivers/net/wireless/st/cw1200/fwio.c @@ -48,6 +48,41 @@ static int cw1200_get_hw_type(u32 config_reg_val, int *major_revision) return hw_type; } +static const struct cw1200_chip cw1200_chips[] = { + { + .revision = CW1200_HW_REV_CUT10, + .firmware = FIRMWARE_CUT10, + .sdd = SDD_FILE_10, + }, { + .revision = CW1200_HW_REV_CUT11, + .firmware = FIRMWARE_CUT11, + .sdd = SDD_FILE_11, + }, { + .revision = CW1200_HW_REV_CUT20, + .firmware = FIRMWARE_CUT20, + .sdd = SDD_FILE_20, + }, { + .revision = CW1200_HW_REV_CUT22, + .firmware = FIRMWARE_CUT22, + .sdd = SDD_FILE_22, + }, { + .revision = CW1X60_HW_REV, + .firmware = FIRMWARE_CW1X60, + .sdd = SDD_FILE_CW1X60, + }, +}; + +static const struct cw1200_chip *cw1200_find_chip(int revision) +{ + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(cw1200_chips); i++) + if (cw1200_chips[i].revision == revision) + return &cw1200_chips[i]; + + return NULL; +} + static int cw1200_load_firmware_cw1200(struct cw1200_common *priv) { int ret, block, num_blocks; @@ -90,36 +125,14 @@ static int cw1200_load_firmware_cw1200(struct cw1200_common *priv) goto exit; \ } while (0) - switch (priv->hw_revision) { - case CW1200_HW_REV_CUT10: - fw_path = FIRMWARE_CUT10; - if (!priv->sdd_path) - priv->sdd_path = SDD_FILE_10; - break; - case CW1200_HW_REV_CUT11: - fw_path = FIRMWARE_CUT11; - if (!priv->sdd_path) - priv->sdd_path = SDD_FILE_11; - break; - case CW1200_HW_REV_CUT20: - fw_path = FIRMWARE_CUT20; - if (!priv->sdd_path) - priv->sdd_path = SDD_FILE_20; - break; - case CW1200_HW_REV_CUT22: - fw_path = FIRMWARE_CUT22; - if (!priv->sdd_path) - priv->sdd_path = SDD_FILE_22; - break; - case CW1X60_HW_REV: - fw_path = FIRMWARE_CW1X60; - if (!priv->sdd_path) - priv->sdd_path = SDD_FILE_CW1X60; - break; - default: + priv->chip = cw1200_find_chip(priv->hw_revision); + if (!priv->chip) { pr_err("Invalid silicon revision %d.\n", priv->hw_revision); return -EINVAL; } + fw_path = priv->chip->firmware; + if (!priv->sdd_path) + priv->sdd_path = priv->chip->sdd; /* Initialize common registers */ APB_WRITE(DOWNLOAD_IMAGE_SIZE_REG, DOWNLOAD_ARE_YOU_HERE); diff --git a/drivers/net/wireless/st/cw1200/fwio.h b/drivers/net/wireless/st/cw1200/fwio.h index c287160a492e..e97cbcd54e57 100644 --- a/drivers/net/wireless/st/cw1200/fwio.h +++ b/drivers/net/wireless/st/cw1200/fwio.h @@ -26,6 +26,12 @@ #define SDD_FILE_11 "sdd_11.bin" #define SDD_FILE_10 "sdd_10.bin" +struct cw1200_chip { + int revision; + const char *firmware; + const char *sdd; +}; + int cw1200_load_firmware(struct cw1200_common *priv); /* SDD definitions */ diff --git a/drivers/net/wireless/st/cw1200/main.c b/drivers/net/wireless/st/cw1200/main.c index 5d569eeb353f..793471acbfb6 100644 --- a/drivers/net/wireless/st/cw1200/main.c +++ b/drivers/net/wireless/st/cw1200/main.c @@ -541,7 +541,7 @@ int cw1200_core_probe(const struct hwbus_ops *hwbus_ops, if (cw1200_refclk) priv->hw_refclk = cw1200_refclk; - priv->sdd_path = (char *)sdd_path; + priv->sdd_path = sdd_path; if (cw1200_sdd_path) priv->sdd_path = cw1200_sdd_path; -- 2.52.0