* [PATCH V2 1/7] soundwire: amd: change the soundwire wake enable/disable sequence
2025-01-20 10:13 [PATCH V2 0/7] soundwire: amd: code improvements and new platform support Vijendar Mukunda
@ 2025-01-20 10:13 ` Vijendar Mukunda
2025-01-20 10:13 ` [PATCH V2 2/7] soundwire: amd: add debug log for soundwire wake event Vijendar Mukunda
` (5 subsequent siblings)
6 siblings, 0 replies; 10+ messages in thread
From: Vijendar Mukunda @ 2025-01-20 10:13 UTC (permalink / raw)
To: vkoul
Cc: alsa-devel, yung-chuan.liao, pierre-louis.bossart, sanyog.r.kale,
Basavaraj.Hiregoudar, Sunil-kumar.Dommati, venkataprasad.potturu,
Mario.Limonciello, linux-sound, linux-kernel, Vijendar Mukunda
During runtime suspend scenario, SoundWire wake should be enabled and
during system level suspend scenario SoundWire wake should be disabled.
Implement the SoundWire wake enable/disable sequence as per design flow
for SoundWire poweroff mode.
Signed-off-by: Vijendar Mukunda <Vijendar.Mukunda@amd.com>
---
drivers/soundwire/amd_manager.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/soundwire/amd_manager.c b/drivers/soundwire/amd_manager.c
index 71b3cf2df89d..187006e68ad6 100644
--- a/drivers/soundwire/amd_manager.c
+++ b/drivers/soundwire/amd_manager.c
@@ -1139,6 +1139,7 @@ static int __maybe_unused amd_suspend(struct device *dev)
amd_sdw_wake_enable(amd_manager, false);
return amd_sdw_clock_stop(amd_manager);
} else if (amd_manager->power_mode_mask & AMD_SDW_POWER_OFF_MODE) {
+ amd_sdw_wake_enable(amd_manager, false);
/*
* As per hardware programming sequence on AMD platforms,
* clock stop should be invoked first before powering-off
@@ -1166,6 +1167,7 @@ static int __maybe_unused amd_suspend_runtime(struct device *dev)
amd_sdw_wake_enable(amd_manager, true);
return amd_sdw_clock_stop(amd_manager);
} else if (amd_manager->power_mode_mask & AMD_SDW_POWER_OFF_MODE) {
+ amd_sdw_wake_enable(amd_manager, true);
ret = amd_sdw_clock_stop(amd_manager);
if (ret)
return ret;
--
2.34.1
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH V2 2/7] soundwire: amd: add debug log for soundwire wake event
2025-01-20 10:13 [PATCH V2 0/7] soundwire: amd: code improvements and new platform support Vijendar Mukunda
2025-01-20 10:13 ` [PATCH V2 1/7] soundwire: amd: change the soundwire wake enable/disable sequence Vijendar Mukunda
@ 2025-01-20 10:13 ` Vijendar Mukunda
2025-01-20 10:13 ` [PATCH V2 3/7] soundwire: amd: add conditional for check for device resume Vijendar Mukunda
` (4 subsequent siblings)
6 siblings, 0 replies; 10+ messages in thread
From: Vijendar Mukunda @ 2025-01-20 10:13 UTC (permalink / raw)
To: vkoul
Cc: alsa-devel, yung-chuan.liao, pierre-louis.bossart, sanyog.r.kale,
Basavaraj.Hiregoudar, Sunil-kumar.Dommati, venkataprasad.potturu,
Mario.Limonciello, linux-sound, linux-kernel, Vijendar Mukunda
Add debug log in amd_sdw_process_wake_event() function.
Signed-off-by: Vijendar Mukunda <Vijendar.Mukunda@amd.com>
---
drivers/soundwire/amd_manager.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/soundwire/amd_manager.c b/drivers/soundwire/amd_manager.c
index 187006e68ad6..60be5805715e 100644
--- a/drivers/soundwire/amd_manager.c
+++ b/drivers/soundwire/amd_manager.c
@@ -849,6 +849,7 @@ static void amd_sdw_update_slave_status(u32 status_change_0to7, u32 status_chang
static void amd_sdw_process_wake_event(struct amd_sdw_manager *amd_manager)
{
+ dev_dbg(amd_manager->dev, "SoundWire Wake event reported\n");
pm_request_resume(amd_manager->dev);
writel(0x00, amd_manager->acp_mmio + ACP_SW_WAKE_EN(amd_manager->instance));
writel(0x00, amd_manager->mmio + ACP_SW_STATE_CHANGE_STATUS_8TO11);
--
2.34.1
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH V2 3/7] soundwire: amd: add conditional for check for device resume
2025-01-20 10:13 [PATCH V2 0/7] soundwire: amd: code improvements and new platform support Vijendar Mukunda
2025-01-20 10:13 ` [PATCH V2 1/7] soundwire: amd: change the soundwire wake enable/disable sequence Vijendar Mukunda
2025-01-20 10:13 ` [PATCH V2 2/7] soundwire: amd: add debug log for soundwire wake event Vijendar Mukunda
@ 2025-01-20 10:13 ` Vijendar Mukunda
2025-01-20 15:30 ` Pierre-Louis Bossart
2025-01-20 10:13 ` [PATCH V2 4/7] soundwire: amd: add support for ACP7.0 & ACP7.1 platforms Vijendar Mukunda
` (3 subsequent siblings)
6 siblings, 1 reply; 10+ messages in thread
From: Vijendar Mukunda @ 2025-01-20 10:13 UTC (permalink / raw)
To: vkoul
Cc: alsa-devel, yung-chuan.liao, pierre-louis.bossart, sanyog.r.kale,
Basavaraj.Hiregoudar, Sunil-kumar.Dommati, venkataprasad.potturu,
Mario.Limonciello, linux-sound, linux-kernel, Vijendar Mukunda
Add a conditional check to resume SoundWire manager device, when the
SoundWire manager instance is in the suspended state.
Signed-off-by: Vijendar Mukunda <Vijendar.Mukunda@amd.com>
---
drivers/soundwire/amd_manager.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/drivers/soundwire/amd_manager.c b/drivers/soundwire/amd_manager.c
index 60be5805715e..6831b3729db5 100644
--- a/drivers/soundwire/amd_manager.c
+++ b/drivers/soundwire/amd_manager.c
@@ -850,7 +850,10 @@ static void amd_sdw_update_slave_status(u32 status_change_0to7, u32 status_chang
static void amd_sdw_process_wake_event(struct amd_sdw_manager *amd_manager)
{
dev_dbg(amd_manager->dev, "SoundWire Wake event reported\n");
- pm_request_resume(amd_manager->dev);
+ if (pm_runtime_suspended(amd_manager->dev)) {
+ dev_dbg(amd_manager->dev, "Device is in suspend state\n");
+ pm_request_resume(amd_manager->dev);
+ }
writel(0x00, amd_manager->acp_mmio + ACP_SW_WAKE_EN(amd_manager->instance));
writel(0x00, amd_manager->mmio + ACP_SW_STATE_CHANGE_STATUS_8TO11);
}
--
2.34.1
^ permalink raw reply related [flat|nested] 10+ messages in thread* Re: [PATCH V2 3/7] soundwire: amd: add conditional for check for device resume
2025-01-20 10:13 ` [PATCH V2 3/7] soundwire: amd: add conditional for check for device resume Vijendar Mukunda
@ 2025-01-20 15:30 ` Pierre-Louis Bossart
2025-01-21 5:26 ` Mukunda,Vijendar
0 siblings, 1 reply; 10+ messages in thread
From: Pierre-Louis Bossart @ 2025-01-20 15:30 UTC (permalink / raw)
To: Vijendar Mukunda, vkoul
Cc: alsa-devel, yung-chuan.liao, sanyog.r.kale, Basavaraj.Hiregoudar,
Sunil-kumar.Dommati, venkataprasad.potturu, Mario.Limonciello,
linux-sound, linux-kernel
On 1/20/25 4:13 AM, Vijendar Mukunda wrote:
> Add a conditional check to resume SoundWire manager device, when the
> SoundWire manager instance is in the suspended state.
>
> Signed-off-by: Vijendar Mukunda <Vijendar.Mukunda@amd.com>
> ---
> drivers/soundwire/amd_manager.c | 5 ++++-
> 1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/soundwire/amd_manager.c b/drivers/soundwire/amd_manager.c
> index 60be5805715e..6831b3729db5 100644
> --- a/drivers/soundwire/amd_manager.c
> +++ b/drivers/soundwire/amd_manager.c
> @@ -850,7 +850,10 @@ static void amd_sdw_update_slave_status(u32 status_change_0to7, u32 status_chang
> static void amd_sdw_process_wake_event(struct amd_sdw_manager *amd_manager)
> {
> dev_dbg(amd_manager->dev, "SoundWire Wake event reported\n");
> - pm_request_resume(amd_manager->dev);
> + if (pm_runtime_suspended(amd_manager->dev)) {
> + dev_dbg(amd_manager->dev, "Device is in suspend state\n");
> + pm_request_resume(amd_manager->dev);
> + }
Is this test actually doing something useful?
If the device is already active, presumably doing a pm_request_resume() is a no-op. If it's already suspended it does something.
Testing the device state is risky with all the asynchronous behavior in SoundWire, best to leave the state checks to be handled inside the pm_runtime core, no?
IIRC the only time when such a test in needed is in the system suspend callbacks where specific action needs to be taken if the device is in pm_runtime suspended mode with the clock_stop mode engaged.
^ permalink raw reply [flat|nested] 10+ messages in thread* Re: [PATCH V2 3/7] soundwire: amd: add conditional for check for device resume
2025-01-20 15:30 ` Pierre-Louis Bossart
@ 2025-01-21 5:26 ` Mukunda,Vijendar
0 siblings, 0 replies; 10+ messages in thread
From: Mukunda,Vijendar @ 2025-01-21 5:26 UTC (permalink / raw)
To: Pierre-Louis Bossart, vkoul
Cc: alsa-devel, yung-chuan.liao, sanyog.r.kale, Basavaraj.Hiregoudar,
Sunil-kumar.Dommati, venkataprasad.potturu, Mario.Limonciello,
linux-sound, linux-kernel
On 20/01/25 21:00, Pierre-Louis Bossart wrote:
> On 1/20/25 4:13 AM, Vijendar Mukunda wrote:
>> Add a conditional check to resume SoundWire manager device, when the
>> SoundWire manager instance is in the suspended state.
>>
>> Signed-off-by: Vijendar Mukunda <Vijendar.Mukunda@amd.com>
>> ---
>> drivers/soundwire/amd_manager.c | 5 ++++-
>> 1 file changed, 4 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/soundwire/amd_manager.c b/drivers/soundwire/amd_manager.c
>> index 60be5805715e..6831b3729db5 100644
>> --- a/drivers/soundwire/amd_manager.c
>> +++ b/drivers/soundwire/amd_manager.c
>> @@ -850,7 +850,10 @@ static void amd_sdw_update_slave_status(u32 status_change_0to7, u32 status_chang
>> static void amd_sdw_process_wake_event(struct amd_sdw_manager *amd_manager)
>> {
>> dev_dbg(amd_manager->dev, "SoundWire Wake event reported\n");
>> - pm_request_resume(amd_manager->dev);
>> + if (pm_runtime_suspended(amd_manager->dev)) {
>> + dev_dbg(amd_manager->dev, "Device is in suspend state\n");
>> + pm_request_resume(amd_manager->dev);
>> + }
> Is this test actually doing something useful?
>
> If the device is already active, presumably doing a pm_request_resume() is a no-op. If it's already suspended it does something.
> Testing the device state is risky with all the asynchronous behavior in SoundWire, best to leave the state checks to be handled inside the pm_runtime core, no?
>
> IIRC the only time when such a test in needed is in the system suspend callbacks where specific action needs to be taken if the device is in pm_runtime suspended mode with the clock_stop mode engaged.
Soundwire device resume sequence can be invoked from multiple places
same time due to different interrupt sources. We have added this extra condition
check to safeguard the resume invoking sequence.
Will drop this code and retest our test scenarios.
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH V2 4/7] soundwire: amd: add support for ACP7.0 & ACP7.1 platforms
2025-01-20 10:13 [PATCH V2 0/7] soundwire: amd: code improvements and new platform support Vijendar Mukunda
` (2 preceding siblings ...)
2025-01-20 10:13 ` [PATCH V2 3/7] soundwire: amd: add conditional for check for device resume Vijendar Mukunda
@ 2025-01-20 10:13 ` Vijendar Mukunda
2025-01-20 10:13 ` [PATCH V2 5/7] soundwire: amd: set device power state during suspend/resume sequence Vijendar Mukunda
` (2 subsequent siblings)
6 siblings, 0 replies; 10+ messages in thread
From: Vijendar Mukunda @ 2025-01-20 10:13 UTC (permalink / raw)
To: vkoul
Cc: alsa-devel, yung-chuan.liao, pierre-louis.bossart, sanyog.r.kale,
Basavaraj.Hiregoudar, Sunil-kumar.Dommati, venkataprasad.potturu,
Mario.Limonciello, linux-sound, linux-kernel, Vijendar Mukunda
Add SoundWire support for ACP7.0 and ACP7.1 platforms.
Signed-off-by: Vijendar Mukunda <Vijendar.Mukunda@amd.com>
---
drivers/soundwire/amd_manager.c | 22 ++++++++++++++++++++++
drivers/soundwire/amd_manager.h | 18 ++++++++++++++++++
include/linux/soundwire/sdw_amd.h | 2 ++
3 files changed, 42 insertions(+)
diff --git a/drivers/soundwire/amd_manager.c b/drivers/soundwire/amd_manager.c
index 6831b3729db5..d611498d5488 100644
--- a/drivers/soundwire/amd_manager.c
+++ b/drivers/soundwire/amd_manager.c
@@ -446,6 +446,10 @@ static int amd_sdw_port_params(struct sdw_bus *bus, struct sdw_port_params *p_pa
return -EINVAL;
}
break;
+ case ACP70_PCI_REV_ID:
+ case ACP71_PCI_REV_ID:
+ frame_fmt_reg = acp70_sdw_dp_reg[p_params->num].frame_fmt_reg;
+ break;
default:
return -EINVAL;
}
@@ -494,6 +498,14 @@ static int amd_sdw_transport_params(struct sdw_bus *bus,
return -EINVAL;
}
break;
+ case ACP70_PCI_REV_ID:
+ case ACP71_PCI_REV_ID:
+ frame_fmt_reg = acp70_sdw_dp_reg[params->port_num].frame_fmt_reg;
+ sample_int_reg = acp70_sdw_dp_reg[params->port_num].sample_int_reg;
+ hctrl_dp0_reg = acp70_sdw_dp_reg[params->port_num].hctrl_dp0_reg;
+ offset_reg = acp70_sdw_dp_reg[params->port_num].offset_reg;
+ lane_ctrl_ch_en_reg = acp70_sdw_dp_reg[params->port_num].lane_ctrl_ch_en_reg;
+ break;
default:
return -EINVAL;
}
@@ -549,6 +561,10 @@ static int amd_sdw_port_enable(struct sdw_bus *bus,
return -EINVAL;
}
break;
+ case ACP70_PCI_REV_ID:
+ case ACP71_PCI_REV_ID:
+ lane_ctrl_ch_en_reg = acp70_sdw_dp_reg[enable_ch->port_num].lane_ctrl_ch_en_reg;
+ break;
default:
return -EINVAL;
}
@@ -898,6 +914,7 @@ int amd_sdw_manager_start(struct amd_sdw_manager *amd_manager)
ret = amd_enable_sdw_manager(amd_manager);
if (ret)
return ret;
+
amd_sdw_set_frameshape(amd_manager);
}
/* Enable runtime PM */
@@ -969,6 +986,11 @@ static int amd_sdw_manager_probe(struct platform_device *pdev)
return -EINVAL;
}
break;
+ case ACP70_PCI_REV_ID:
+ case ACP71_PCI_REV_ID:
+ amd_manager->num_dout_ports = AMD_ACP70_SDW_MAX_TX_PORTS;
+ amd_manager->num_din_ports = AMD_ACP70_SDW_MAX_RX_PORTS;
+ break;
default:
return -EINVAL;
}
diff --git a/drivers/soundwire/amd_manager.h b/drivers/soundwire/amd_manager.h
index cc2170e4521e..30244a31c21c 100644
--- a/drivers/soundwire/amd_manager.h
+++ b/drivers/soundwire/amd_manager.h
@@ -159,8 +159,11 @@
#define AMD_ACP63_SDW0_MAX_RX_PORTS 3
#define AMD_ACP63_SDW1_MAX_TX_PORTS 1
#define AMD_ACP63_SDW1_MAX_RX_PORTS 1
+#define AMD_ACP70_SDW_MAX_TX_PORTS 3
+#define AMD_ACP70_SDW_MAX_RX_PORTS 3
#define AMD_ACP63_SDW0_MAX_DAI 6
#define AMD_ACP63_SDW1_MAX_DAI 2
+#define AMD_ACP70_SDW_MAX_DAI 6
#define AMD_SDW_SLAVE_0_ATTACHED 5
#define AMD_SDW_SSP_COUNTER_VAL 3
@@ -244,6 +247,21 @@ static struct sdw_manager_dp_reg acp63_sdw1_dp_reg[AMD_ACP63_SDW1_MAX_DAI] = {
ACP_SW_AUDIO1_RX_OFFSET, ACP_SW_AUDIO1_RX_CHANNEL_ENABLE_DP0}
};
+static struct sdw_manager_dp_reg acp70_sdw_dp_reg[AMD_ACP70_SDW_MAX_DAI] = {
+ {ACP_SW_AUDIO0_TX_FRAME_FORMAT, ACP_SW_AUDIO0_TX_SAMPLEINTERVAL, ACP_SW_AUDIO0_TX_HCTRL_DP0,
+ ACP_SW_AUDIO0_TX_OFFSET_DP0, ACP_SW_AUDIO0_TX_CHANNEL_ENABLE_DP0},
+ {ACP_SW_AUDIO1_TX_FRAME_FORMAT, ACP_SW_AUDIO1_TX_SAMPLEINTERVAL, ACP_SW_AUDIO1_TX_HCTRL,
+ ACP_SW_AUDIO1_TX_OFFSET, ACP_SW_AUDIO1_TX_CHANNEL_ENABLE_DP0},
+ {ACP_SW_AUDIO2_TX_FRAME_FORMAT, ACP_SW_AUDIO2_TX_SAMPLEINTERVAL, ACP_SW_AUDIO2_TX_HCTRL,
+ ACP_SW_AUDIO2_TX_OFFSET, ACP_SW_AUDIO2_TX_CHANNEL_ENABLE_DP0},
+ {ACP_SW_AUDIO0_RX_FRAME_FORMAT, ACP_SW_AUDIO0_RX_SAMPLEINTERVAL, ACP_SW_AUDIO0_RX_HCTRL_DP0,
+ ACP_SW_AUDIO0_RX_OFFSET_DP0, ACP_SW_AUDIO0_RX_CHANNEL_ENABLE_DP0},
+ {ACP_SW_AUDIO1_RX_FRAME_FORMAT, ACP_SW_AUDIO1_RX_SAMPLEINTERVAL, ACP_SW_AUDIO1_RX_HCTRL,
+ ACP_SW_AUDIO1_RX_OFFSET, ACP_SW_AUDIO1_RX_CHANNEL_ENABLE_DP0},
+ {ACP_SW_AUDIO2_RX_FRAME_FORMAT, ACP_SW_AUDIO2_RX_SAMPLEINTERVAL, ACP_SW_AUDIO2_RX_HCTRL,
+ ACP_SW_AUDIO2_RX_OFFSET, ACP_SW_AUDIO2_RX_CHANNEL_ENABLE_DP0},
+};
+
static u32 sdw_manager_reg_mask_array[AMD_SDW_MAX_MANAGER_COUNT] = {
AMD_SDW0_EXT_INTR_MASK,
AMD_SDW1_EXT_INTR_MASK
diff --git a/include/linux/soundwire/sdw_amd.h b/include/linux/soundwire/sdw_amd.h
index 799f8578137b..6b839987f14c 100644
--- a/include/linux/soundwire/sdw_amd.h
+++ b/include/linux/soundwire/sdw_amd.h
@@ -28,6 +28,8 @@
#define ACP_SDW1 1
#define AMD_SDW_MAX_MANAGER_COUNT 2
#define ACP63_PCI_REV_ID 0x63
+#define ACP70_PCI_REV_ID 0x70
+#define ACP71_PCI_REV_ID 0x71
struct acp_sdw_pdata {
u16 instance;
--
2.34.1
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH V2 5/7] soundwire: amd: set device power state during suspend/resume sequence
2025-01-20 10:13 [PATCH V2 0/7] soundwire: amd: code improvements and new platform support Vijendar Mukunda
` (3 preceding siblings ...)
2025-01-20 10:13 ` [PATCH V2 4/7] soundwire: amd: add support for ACP7.0 & ACP7.1 platforms Vijendar Mukunda
@ 2025-01-20 10:13 ` Vijendar Mukunda
2025-01-20 10:13 ` [PATCH V2 6/7] soundwire: amd: set ACP_PME_EN during runtime suspend sequence Vijendar Mukunda
2025-01-20 10:13 ` [PATCH V2 7/7] soundwire: amd: add soundwire host wake interrupt enable/disable sequence Vijendar Mukunda
6 siblings, 0 replies; 10+ messages in thread
From: Vijendar Mukunda @ 2025-01-20 10:13 UTC (permalink / raw)
To: vkoul
Cc: alsa-devel, yung-chuan.liao, pierre-louis.bossart, sanyog.r.kale,
Basavaraj.Hiregoudar, Sunil-kumar.Dommati, venkataprasad.potturu,
Mario.Limonciello, linux-sound, linux-kernel, Vijendar Mukunda
Set SoundWire manager device power state during suspend and resume
sequence for ACP7.0 & ACP7.1 platforms.
Signed-off-by: Vijendar Mukunda <Vijendar.Mukunda@amd.com>
---
drivers/soundwire/amd_manager.c | 58 ++++++++++++++++++++++++++++++---
drivers/soundwire/amd_manager.h | 5 +++
2 files changed, 58 insertions(+), 5 deletions(-)
diff --git a/drivers/soundwire/amd_manager.c b/drivers/soundwire/amd_manager.c
index d611498d5488..42d553878e91 100644
--- a/drivers/soundwire/amd_manager.c
+++ b/drivers/soundwire/amd_manager.c
@@ -143,6 +143,29 @@ static void amd_sdw_wake_enable(struct amd_sdw_manager *amd_manager, bool enable
writel(wake_ctrl, amd_manager->mmio + ACP_SW_STATE_CHANGE_STATUS_MASK_8TO11);
}
+static int amd_sdw_set_device_state(struct amd_sdw_manager *amd_manager, u32 target_device_state)
+{
+ u32 sdw_dev_state;
+
+ sdw_dev_state = readl(amd_manager->acp_mmio + AMD_SDW_DEVICE_STATE);
+ switch (amd_manager->instance) {
+ case ACP_SDW0:
+ u32p_replace_bits(&sdw_dev_state, target_device_state,
+ AMD_SDW0_DEVICE_STATE_MASK);
+ break;
+ case ACP_SDW1:
+ u32p_replace_bits(&sdw_dev_state, target_device_state,
+ AMD_SDW1_DEVICE_STATE_MASK);
+ break;
+ default:
+ return -EINVAL;
+ }
+ writel(sdw_dev_state, amd_manager->acp_mmio + AMD_SDW_DEVICE_STATE);
+ sdw_dev_state = readl(amd_manager->acp_mmio + AMD_SDW_DEVICE_STATE);
+ dev_dbg(amd_manager->dev, "AMD_SDW_DEVICE_STATE:0x%x\n", sdw_dev_state);
+ return 0;
+}
+
static void amd_sdw_ctl_word_prep(u32 *lower_word, u32 *upper_word, struct sdw_msg *msg,
int cmd_offset)
{
@@ -1163,7 +1186,9 @@ static int __maybe_unused amd_suspend(struct device *dev)
if (amd_manager->power_mode_mask & AMD_SDW_CLK_STOP_MODE) {
amd_sdw_wake_enable(amd_manager, false);
- return amd_sdw_clock_stop(amd_manager);
+ ret = amd_sdw_clock_stop(amd_manager);
+ if (ret)
+ return ret;
} else if (amd_manager->power_mode_mask & AMD_SDW_POWER_OFF_MODE) {
amd_sdw_wake_enable(amd_manager, false);
/*
@@ -1173,7 +1198,14 @@ static int __maybe_unused amd_suspend(struct device *dev)
ret = amd_sdw_clock_stop(amd_manager);
if (ret)
return ret;
- return amd_deinit_sdw_manager(amd_manager);
+ ret = amd_deinit_sdw_manager(amd_manager);
+ if (ret)
+ return ret;
+ }
+ if (amd_manager->acp_rev >= ACP70_PCI_REV_ID) {
+ ret = amd_sdw_set_device_state(amd_manager, AMD_SDW_DEVICE_STATE_D3);
+ if (ret)
+ return ret;
}
return 0;
}
@@ -1191,13 +1223,22 @@ static int __maybe_unused amd_suspend_runtime(struct device *dev)
}
if (amd_manager->power_mode_mask & AMD_SDW_CLK_STOP_MODE) {
amd_sdw_wake_enable(amd_manager, true);
- return amd_sdw_clock_stop(amd_manager);
+ ret = amd_sdw_clock_stop(amd_manager);
+ if (ret)
+ return ret;
} else if (amd_manager->power_mode_mask & AMD_SDW_POWER_OFF_MODE) {
amd_sdw_wake_enable(amd_manager, true);
ret = amd_sdw_clock_stop(amd_manager);
if (ret)
return ret;
- return amd_deinit_sdw_manager(amd_manager);
+ ret = amd_deinit_sdw_manager(amd_manager);
+ if (ret)
+ return ret;
+ }
+ if (amd_manager->acp_rev >= ACP70_PCI_REV_ID) {
+ ret = amd_sdw_set_device_state(amd_manager, AMD_SDW_DEVICE_STATE_D3);
+ if (ret)
+ return ret;
}
return 0;
}
@@ -1216,7 +1257,9 @@ static int __maybe_unused amd_resume_runtime(struct device *dev)
}
if (amd_manager->power_mode_mask & AMD_SDW_CLK_STOP_MODE) {
- return amd_sdw_clock_stop_exit(amd_manager);
+ ret = amd_sdw_clock_stop_exit(amd_manager);
+ if (ret)
+ return ret;
} else if (amd_manager->power_mode_mask & AMD_SDW_POWER_OFF_MODE) {
writel(0x00, amd_manager->acp_mmio + ACP_SW_WAKE_EN(amd_manager->instance));
val = readl(amd_manager->mmio + ACP_SW_CLK_RESUME_CTRL);
@@ -1239,6 +1282,11 @@ static int __maybe_unused amd_resume_runtime(struct device *dev)
return ret;
amd_sdw_set_frameshape(amd_manager);
}
+ if (amd_manager->acp_rev >= ACP70_PCI_REV_ID) {
+ ret = amd_sdw_set_device_state(amd_manager, AMD_SDW_DEVICE_STATE_D0);
+ if (ret)
+ return ret;
+ }
return 0;
}
diff --git a/drivers/soundwire/amd_manager.h b/drivers/soundwire/amd_manager.h
index 30244a31c21c..8430f279d88e 100644
--- a/drivers/soundwire/amd_manager.h
+++ b/drivers/soundwire/amd_manager.h
@@ -194,6 +194,11 @@
#define AMD_SDW_CLK_RESUME_DONE 3
#define AMD_SDW_WAKE_STAT_MASK BIT(16)
#define AMD_SDW_WAKE_INTR_MASK BIT(16)
+#define AMD_SDW_DEVICE_STATE 0x1430
+#define AMD_SDW0_DEVICE_STATE_MASK GENMASK(1, 0)
+#define AMD_SDW1_DEVICE_STATE_MASK GENMASK(3, 2)
+#define AMD_SDW_DEVICE_STATE_D0 0
+#define AMD_SDW_DEVICE_STATE_D3 3
static u32 amd_sdw_freq_tbl[AMD_SDW_MAX_FREQ_NUM] = {
AMD_SDW_DEFAULT_CLK_FREQ,
--
2.34.1
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH V2 6/7] soundwire: amd: set ACP_PME_EN during runtime suspend sequence
2025-01-20 10:13 [PATCH V2 0/7] soundwire: amd: code improvements and new platform support Vijendar Mukunda
` (4 preceding siblings ...)
2025-01-20 10:13 ` [PATCH V2 5/7] soundwire: amd: set device power state during suspend/resume sequence Vijendar Mukunda
@ 2025-01-20 10:13 ` Vijendar Mukunda
2025-01-20 10:13 ` [PATCH V2 7/7] soundwire: amd: add soundwire host wake interrupt enable/disable sequence Vijendar Mukunda
6 siblings, 0 replies; 10+ messages in thread
From: Vijendar Mukunda @ 2025-01-20 10:13 UTC (permalink / raw)
To: vkoul
Cc: alsa-devel, yung-chuan.liao, pierre-louis.bossart, sanyog.r.kale,
Basavaraj.Hiregoudar, Sunil-kumar.Dommati, venkataprasad.potturu,
Mario.Limonciello, linux-sound, linux-kernel, Vijendar Mukunda
Set ACP_PME_EN to 1 during runtime suspend sequence as per design flow
for ACP7.0 & ACP7.1 platforms.
Signed-off-by: Vijendar Mukunda <Vijendar.Mukunda@amd.com>
---
drivers/soundwire/amd_manager.c | 9 +++++++++
drivers/soundwire/amd_manager.h | 1 +
2 files changed, 10 insertions(+)
diff --git a/drivers/soundwire/amd_manager.c b/drivers/soundwire/amd_manager.c
index 42d553878e91..03c9e15dce5b 100644
--- a/drivers/soundwire/amd_manager.c
+++ b/drivers/soundwire/amd_manager.c
@@ -1215,6 +1215,7 @@ static int __maybe_unused amd_suspend_runtime(struct device *dev)
struct amd_sdw_manager *amd_manager = dev_get_drvdata(dev);
struct sdw_bus *bus = &amd_manager->bus;
int ret;
+ u32 val;
if (bus->prop.hw_disabled) {
dev_dbg(bus->dev, "SoundWire manager %d is disabled,\n",
@@ -1239,6 +1240,14 @@ static int __maybe_unused amd_suspend_runtime(struct device *dev)
ret = amd_sdw_set_device_state(amd_manager, AMD_SDW_DEVICE_STATE_D3);
if (ret)
return ret;
+ if (amd_manager->wake_en_mask) {
+ val = readl(amd_manager->acp_mmio + ACP_PME_EN);
+ if (!val) {
+ writel(1, amd_manager->acp_mmio + ACP_PME_EN);
+ val = readl(amd_manager->acp_mmio + ACP_PME_EN);
+ dev_dbg(amd_manager->dev, "ACP_PME_EN:0x%x\n", val);
+ }
+ }
}
return 0;
}
diff --git a/drivers/soundwire/amd_manager.h b/drivers/soundwire/amd_manager.h
index 8430f279d88e..1d5e94371f81 100644
--- a/drivers/soundwire/amd_manager.h
+++ b/drivers/soundwire/amd_manager.h
@@ -199,6 +199,7 @@
#define AMD_SDW1_DEVICE_STATE_MASK GENMASK(3, 2)
#define AMD_SDW_DEVICE_STATE_D0 0
#define AMD_SDW_DEVICE_STATE_D3 3
+#define ACP_PME_EN 0x0001400
static u32 amd_sdw_freq_tbl[AMD_SDW_MAX_FREQ_NUM] = {
AMD_SDW_DEFAULT_CLK_FREQ,
--
2.34.1
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH V2 7/7] soundwire: amd: add soundwire host wake interrupt enable/disable sequence
2025-01-20 10:13 [PATCH V2 0/7] soundwire: amd: code improvements and new platform support Vijendar Mukunda
` (5 preceding siblings ...)
2025-01-20 10:13 ` [PATCH V2 6/7] soundwire: amd: set ACP_PME_EN during runtime suspend sequence Vijendar Mukunda
@ 2025-01-20 10:13 ` Vijendar Mukunda
6 siblings, 0 replies; 10+ messages in thread
From: Vijendar Mukunda @ 2025-01-20 10:13 UTC (permalink / raw)
To: vkoul
Cc: alsa-devel, yung-chuan.liao, pierre-louis.bossart, sanyog.r.kale,
Basavaraj.Hiregoudar, Sunil-kumar.Dommati, venkataprasad.potturu,
Mario.Limonciello, linux-sound, linux-kernel, Vijendar Mukunda
For wake event, SoundWire host wake interrupt will be asserted based on
below pre-conditions for ACP7.0 & ACP7.1 platforms.
- ACP device should be in D0 state.
- SoundWire manager instance should be in D3 state.
- SoundWire manager device state should be set to D3.
- ACP_PME_EN should be set to 1.
Implement code changes to enable/disable SoundWire host wake interrupt mask
during suspend and resume as per design flow for ACP7.0 & ACP7.1 platforms.
Signed-off-by: Vijendar Mukunda <Vijendar.Mukunda@amd.com>
---
drivers/soundwire/amd_manager.c | 58 +++++++++++++++++++++++++++++++++
drivers/soundwire/amd_manager.h | 2 ++
2 files changed, 60 insertions(+)
diff --git a/drivers/soundwire/amd_manager.c b/drivers/soundwire/amd_manager.c
index 03c9e15dce5b..161d963c80e6 100644
--- a/drivers/soundwire/amd_manager.c
+++ b/drivers/soundwire/amd_manager.c
@@ -166,6 +166,34 @@ static int amd_sdw_set_device_state(struct amd_sdw_manager *amd_manager, u32 tar
return 0;
}
+static int amd_sdw_host_wake_enable(struct amd_sdw_manager *amd_manager, bool enable)
+{
+ u32 intr_cntl1;
+ u32 sdw_host_wake_irq_mask;
+
+ if (!amd_manager->wake_en_mask)
+ return 0;
+
+ switch (amd_manager->instance) {
+ case ACP_SDW0:
+ sdw_host_wake_irq_mask = AMD_SDW0_HOST_WAKE_INTR_MASK;
+ break;
+ case ACP_SDW1:
+ sdw_host_wake_irq_mask = AMD_SDW1_HOST_WAKE_INTR_MASK;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ intr_cntl1 = readl(amd_manager->acp_mmio + ACP_EXTERNAL_INTR_CNTL(ACP_SDW1));
+ if (enable)
+ intr_cntl1 |= sdw_host_wake_irq_mask;
+ else
+ intr_cntl1 &= ~sdw_host_wake_irq_mask;
+ writel(intr_cntl1, amd_manager->acp_mmio + ACP_EXTERNAL_INTR_CNTL(ACP_SDW1));
+ return 0;
+}
+
static void amd_sdw_ctl_word_prep(u32 *lower_word, u32 *upper_word, struct sdw_msg *msg,
int cmd_offset)
{
@@ -1186,11 +1214,21 @@ static int __maybe_unused amd_suspend(struct device *dev)
if (amd_manager->power_mode_mask & AMD_SDW_CLK_STOP_MODE) {
amd_sdw_wake_enable(amd_manager, false);
+ if (amd_manager->acp_rev >= ACP70_PCI_REV_ID) {
+ ret = amd_sdw_host_wake_enable(amd_manager, false);
+ if (ret)
+ return ret;
+ }
ret = amd_sdw_clock_stop(amd_manager);
if (ret)
return ret;
} else if (amd_manager->power_mode_mask & AMD_SDW_POWER_OFF_MODE) {
amd_sdw_wake_enable(amd_manager, false);
+ if (amd_manager->acp_rev >= ACP70_PCI_REV_ID) {
+ ret = amd_sdw_host_wake_enable(amd_manager, false);
+ if (ret)
+ return ret;
+ }
/*
* As per hardware programming sequence on AMD platforms,
* clock stop should be invoked first before powering-off
@@ -1224,11 +1262,21 @@ static int __maybe_unused amd_suspend_runtime(struct device *dev)
}
if (amd_manager->power_mode_mask & AMD_SDW_CLK_STOP_MODE) {
amd_sdw_wake_enable(amd_manager, true);
+ if (amd_manager->acp_rev >= ACP70_PCI_REV_ID) {
+ ret = amd_sdw_host_wake_enable(amd_manager, true);
+ if (ret)
+ return ret;
+ }
ret = amd_sdw_clock_stop(amd_manager);
if (ret)
return ret;
} else if (amd_manager->power_mode_mask & AMD_SDW_POWER_OFF_MODE) {
amd_sdw_wake_enable(amd_manager, true);
+ if (amd_manager->acp_rev >= ACP70_PCI_REV_ID) {
+ ret = amd_sdw_host_wake_enable(amd_manager, true);
+ if (ret)
+ return ret;
+ }
ret = amd_sdw_clock_stop(amd_manager);
if (ret)
return ret;
@@ -1269,8 +1317,18 @@ static int __maybe_unused amd_resume_runtime(struct device *dev)
ret = amd_sdw_clock_stop_exit(amd_manager);
if (ret)
return ret;
+ if (amd_manager->acp_rev >= ACP70_PCI_REV_ID) {
+ ret = amd_sdw_host_wake_enable(amd_manager, false);
+ if (ret)
+ return ret;
+ }
} else if (amd_manager->power_mode_mask & AMD_SDW_POWER_OFF_MODE) {
writel(0x00, amd_manager->acp_mmio + ACP_SW_WAKE_EN(amd_manager->instance));
+ if (amd_manager->acp_rev >= ACP70_PCI_REV_ID) {
+ ret = amd_sdw_host_wake_enable(amd_manager, false);
+ if (ret)
+ return ret;
+ }
val = readl(amd_manager->mmio + ACP_SW_CLK_RESUME_CTRL);
if (val) {
val |= AMD_SDW_CLK_RESUME_REQ;
diff --git a/drivers/soundwire/amd_manager.h b/drivers/soundwire/amd_manager.h
index 1d5e94371f81..6cc916b0c820 100644
--- a/drivers/soundwire/amd_manager.h
+++ b/drivers/soundwire/amd_manager.h
@@ -194,6 +194,8 @@
#define AMD_SDW_CLK_RESUME_DONE 3
#define AMD_SDW_WAKE_STAT_MASK BIT(16)
#define AMD_SDW_WAKE_INTR_MASK BIT(16)
+#define AMD_SDW0_HOST_WAKE_INTR_MASK BIT(22)
+#define AMD_SDW1_HOST_WAKE_INTR_MASK BIT(23)
#define AMD_SDW_DEVICE_STATE 0x1430
#define AMD_SDW0_DEVICE_STATE_MASK GENMASK(1, 0)
#define AMD_SDW1_DEVICE_STATE_MASK GENMASK(3, 2)
--
2.34.1
^ permalink raw reply related [flat|nested] 10+ messages in thread