soundwire: amd: refactor soundwire pads enable
authorVijendar Mukunda <Vijendar.Mukunda@amd.com>
Mon, 29 Jan 2024 05:51:39 +0000 (11:21 +0530)
committerMark Brown <broonie@kernel.org>
Tue, 30 Jan 2024 16:06:35 +0000 (16:06 +0000)
As sdw pads enable sequence is executed only once, invoke it from probe
sequence.

Program required pads for both manager instances based on link_mask during
probe sequence. This will avoid acquiring mutex lock.
Remove unnecessary delay after programming ACP_SW_PAD_KEEPER_EN register.

Signed-off-by: Vijendar Mukunda <Vijendar.Mukunda@amd.com>
Acked-by: Vinod Koul <vkoul@kernel.org>
Link: https://msgid.link/r/20240129055147.1493853-6-Vijendar.Mukunda@amd.com
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/soundwire/amd_init.c
drivers/soundwire/amd_manager.c

index 46a0538d7fc7f226c443cacb2e4cb1309d678a7a..e45dc8261ab13fdad174d379589cc7d7af31ee47 100644 (file)
 
 #include "amd_init.h"
 
+#define ACP_PAD_PULLDOWN_CTRL                          0x0001448
+#define ACP_SW_PAD_KEEPER_EN                           0x0001454
+#define AMD_SDW_PAD_PULLDOWN_CTRL_ENABLE_MASK          0x7f9a
+#define AMD_SDW0_PAD_PULLDOWN_CTRL_ENABLE_MASK         0x7f9f
+#define AMD_SDW1_PAD_PULLDOWN_CTRL_ENABLE_MASK         0x7ffa
+#define AMD_SDW0_PAD_EN_MASK                           1
+#define AMD_SDW1_PAD_EN_MASK                           0x10
+#define AMD_SDW_PAD_EN_MASK    (AMD_SDW0_PAD_EN_MASK | AMD_SDW1_PAD_EN_MASK)
+
+static int amd_enable_sdw_pads(void __iomem *mmio, u32 link_mask, struct device *dev)
+{
+       u32 val;
+       u32 pad_keeper_en_mask, pad_pulldown_ctrl_mask;
+
+       switch (link_mask) {
+       case 1:
+               pad_keeper_en_mask = AMD_SDW0_PAD_EN_MASK;
+               pad_pulldown_ctrl_mask = AMD_SDW0_PAD_PULLDOWN_CTRL_ENABLE_MASK;
+               break;
+       case 2:
+               pad_keeper_en_mask = AMD_SDW1_PAD_EN_MASK;
+               pad_pulldown_ctrl_mask = AMD_SDW1_PAD_PULLDOWN_CTRL_ENABLE_MASK;
+               break;
+       case 3:
+               pad_keeper_en_mask = AMD_SDW_PAD_EN_MASK;
+               pad_pulldown_ctrl_mask = AMD_SDW_PAD_PULLDOWN_CTRL_ENABLE_MASK;
+               break;
+       default:
+               dev_err(dev, "No SDW Links are enabled\n");
+               return -ENODEV;
+       }
+
+       val = readl(mmio + ACP_SW_PAD_KEEPER_EN);
+       val |= pad_keeper_en_mask;
+       writel(val, mmio + ACP_SW_PAD_KEEPER_EN);
+       val = readl(mmio + ACP_PAD_PULLDOWN_CTRL);
+       val &= pad_pulldown_ctrl_mask;
+       writel(val, mmio + ACP_PAD_PULLDOWN_CTRL);
+       return 0;
+}
+
 static int sdw_amd_cleanup(struct sdw_amd_ctx *ctx)
 {
        int i;
@@ -37,6 +78,7 @@ static struct sdw_amd_ctx *sdw_amd_probe_controller(struct sdw_amd_res *res)
        struct platform_device_info pdevinfo[2];
        u32 link_mask;
        int count, index;
+       int ret;
 
        if (!res)
                return NULL;
@@ -50,6 +92,9 @@ static struct sdw_amd_ctx *sdw_amd_probe_controller(struct sdw_amd_res *res)
 
        count = res->count;
        dev_dbg(&adev->dev, "Creating %d SDW Link devices\n", count);
+       ret = amd_enable_sdw_pads(res->mmio_base, res->link_mask, res->parent);
+       if (ret)
+               return NULL;
 
        /*
         * we need to alloc/free memory manually and can't use devm:
index efc000334aa066894789626e11e2f93c0c176872..44d682a83e237ae5f83d878dcdad635cf34d70c4 100644 (file)
 
 #define to_amd_sdw(b)  container_of(b, struct amd_sdw_manager, bus)
 
-static void amd_enable_sdw_pads(struct amd_sdw_manager *amd_manager)
-{
-       u32 sw_pad_pulldown_val;
-       u32 val;
-
-       mutex_lock(amd_manager->acp_sdw_lock);
-       val = readl(amd_manager->acp_mmio + ACP_SW_PAD_KEEPER_EN);
-       val |= amd_manager->reg_mask->sw_pad_enable_mask;
-       writel(val, amd_manager->acp_mmio + ACP_SW_PAD_KEEPER_EN);
-       usleep_range(1000, 1500);
-
-       sw_pad_pulldown_val = readl(amd_manager->acp_mmio + ACP_PAD_PULLDOWN_CTRL);
-       sw_pad_pulldown_val &= amd_manager->reg_mask->sw_pad_pulldown_mask;
-       writel(sw_pad_pulldown_val, amd_manager->acp_mmio + ACP_PAD_PULLDOWN_CTRL);
-       mutex_unlock(amd_manager->acp_sdw_lock);
-}
-
 static int amd_init_sdw_manager(struct amd_sdw_manager *amd_manager)
 {
        u32 val;
@@ -872,7 +855,6 @@ int amd_sdw_manager_start(struct amd_sdw_manager *amd_manager)
 
        prop = &amd_manager->bus.prop;
        if (!prop->hw_disabled) {
-               amd_enable_sdw_pads(amd_manager);
                ret = amd_init_sdw_manager(amd_manager);
                if (ret)
                        return ret;