soc: mediatek: mtk-svs: Build bank name string dynamically
authorAngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Tue, 21 Nov 2023 12:50:28 +0000 (13:50 +0100)
committerAngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Mon, 11 Dec 2023 10:36:13 +0000 (11:36 +0100)
In svs_bank_resource_setup() there is a "big" switch assigning different
names depending on sw_id and type and this will surely grow: for example
MT8186 has got a two-line type (high/low) SVS bank for CPU_BIG, and this
would require more switch nesting.

Simplify all of this by changing that to a devm_kasprintf() call that
will concatenate the SW_ID string (e.g. SVSB_CPU_LITTLE) with the Type
string (e.g. _LOW), resulting in the expected full bank name (e.g.
SVSB_CPU_LITTLE_LOW).

This being a dynamic allocation can be slower, but this happens only
once in the life of this driver and it's not a performance path, so it's
totally acceptable.

Link: https://lore.kernel.org/r/20231121125044.78642-5-angelogioacchino.delregno@collabora.com
Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
drivers/soc/mediatek/mtk-svs.c

index ddbb9ba3e47d05bd1fe140bfdd264e78406837ca..1c7592fd6ae750f768fe38813306e1e3e68bc70f 100644 (file)
@@ -332,6 +332,14 @@ static const u32 svs_regs_v2[] = {
        [THSLPEVEB]             = 0x330,
 };
 
+static const char * const svs_swid_names[SVSB_SWID_MAX] = {
+       "SVSB_CPU_LITTLE", "SVSB_CPU_BIG", "SVSB_CCI", "SVSB_GPU"
+};
+
+static const char * const svs_type_names[SVSB_TYPE_MAX] = {
+       "", "_LOW", "_HIGH"
+};
+
 /**
  * struct svs_platform - svs platform control
  * @base: svs platform register base
@@ -1696,34 +1704,21 @@ static int svs_bank_resource_setup(struct svs_platform *svsp)
        for (idx = 0; idx < svsp->bank_max; idx++) {
                svsb = &svsp->banks[idx];
 
-               switch (svsb->sw_id) {
-               case SVSB_SWID_CPU_LITTLE:
-                       svsb->name = "SVSB_CPU_LITTLE";
-                       break;
-               case SVSB_SWID_CPU_BIG:
-                       svsb->name = "SVSB_CPU_BIG";
-                       break;
-               case SVSB_SWID_CCI:
-                       svsb->name = "SVSB_CCI";
-                       break;
-               case SVSB_SWID_GPU:
-                       if (svsb->type == SVSB_TYPE_HIGH)
-                               svsb->name = "SVSB_GPU_HIGH";
-                       else if (svsb->type == SVSB_TYPE_LOW)
-                               svsb->name = "SVSB_GPU_LOW";
-                       else
-                               svsb->name = "SVSB_GPU";
-                       break;
-               default:
-                       dev_err(svsb->dev, "unknown sw_id: %u\n", svsb->sw_id);
+               if (svsb->sw_id >= SVSB_SWID_MAX || svsb->type >= SVSB_TYPE_MAX) {
+                       dev_err(svsb->dev, "unknown bank sw_id or type\n");
                        return -EINVAL;
                }
 
-               svsb->dev = devm_kzalloc(svsp->dev, sizeof(*svsb->dev),
-                                        GFP_KERNEL);
+               svsb->dev = devm_kzalloc(svsp->dev, sizeof(*svsb->dev), GFP_KERNEL);
                if (!svsb->dev)
                        return -ENOMEM;
 
+               svsb->name = devm_kasprintf(svsp->dev, GFP_KERNEL, "%s%s",
+                                           svs_swid_names[svsb->sw_id],
+                                           svs_type_names[svsb->type]);
+               if (!svsb->name)
+                       return -ENOMEM;
+
                ret = dev_set_name(svsb->dev, "%s", svsb->name);
                if (ret)
                        return ret;