Unverified Commit cf0ddbc2 authored by Vijendar Mukunda's avatar Vijendar Mukunda Committed by Mark Brown
Browse files

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: default avatarVijendar Mukunda <Vijendar.Mukunda@amd.com>
Acked-by: default avatarVinod Koul <vkoul@kernel.org>
Link: https://msgid.link/r/20240129055147.1493853-6-Vijendar.Mukunda@amd.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent aff9d088
Loading
Loading
Loading
Loading
+45 −0
Original line number Diff line number Diff line
@@ -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:
+0 −18
Original line number Diff line number Diff line
@@ -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;