soundwire: amd: refactor soundwire pads enable
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>
This commit is contained in:
parent
aff9d088a3
commit
cf0ddbc29d
@ -15,6 +15,47 @@
|
||||
|
||||
#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:
|
||||
|
@ -26,23 +26,6 @@
|
||||
|
||||
#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;
|
||||
|
Loading…
Reference in New Issue
Block a user