From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
To: Vijendar Mukunda <Vijendar.Mukunda@amd.com>,
broonie@kernel.org, vkoul@kernel.org,
alsa-devel@alsa-project.org
Cc: Mastan.Katragadda@amd.com, Sunil-kumar.Dommati@amd.com,
Basavaraj.Hiregoudar@amd.com,
open list <linux-kernel@vger.kernel.org>,
Mario.Limonciello@amd.com, arungopal.kondaveeti@amd.com,
Sanyog Kale <sanyog.r.kale@intel.com>,
Bard Liao <yung-chuan.liao@linux.intel.com>
Subject: Re: [PATCH 14/19] soundwire: amd: add runtime pm ops for AMD master driver
Date: Wed, 11 Jan 2023 09:47:55 -0600 [thread overview]
Message-ID: <1af8aa6a-9896-4d35-48de-f084fd16ebc7@linux.intel.com> (raw)
In-Reply-To: <20230111090222.2016499-15-Vijendar.Mukunda@amd.com>
On 1/11/23 03:02, Vijendar Mukunda wrote:
> Add support for runtime pm ops for AMD master driver.
>
> Signed-off-by: Vijendar Mukunda <Vijendar.Mukunda@amd.com>
> Signed-off-by: Mastan Katragadda <Mastan.Katragadda@amd.com>
> ---
> drivers/soundwire/amd_master.c | 205 ++++++++++++++++++++++++++++++
> drivers/soundwire/amd_master.h | 3 +
> include/linux/soundwire/sdw_amd.h | 1 +
> 3 files changed, 209 insertions(+)
>
> diff --git a/drivers/soundwire/amd_master.c b/drivers/soundwire/amd_master.c
> index c7063b8bdd7b..d2d7f07de202 100644
> --- a/drivers/soundwire/amd_master.c
> +++ b/drivers/soundwire/amd_master.c
> @@ -15,6 +15,7 @@
> #include <linux/soundwire/sdw.h>
> #include <linux/soundwire/sdw_registers.h>
> #include <linux/soundwire/sdw_amd.h>
> +#include <linux/pm_runtime.h>
> #include <linux/wait.h>
> #include <sound/pcm_params.h>
> #include <sound/soc.h>
> @@ -290,6 +291,17 @@ static int amd_disable_sdw_interrupts(struct amd_sdwc_ctrl *ctrl)
> return 0;
> }
>
> +static int amd_deinit_sdw_controller(struct amd_sdwc_ctrl *ctrl)
> +{
> + int ret;
> +
> + ret = amd_disable_sdw_interrupts(ctrl);
> + if (ret)
> + return ret;
> + ret = amd_disable_sdw_controller(ctrl);
> + return ret;
> +}
> +
> static int amd_sdwc_set_frameshape(struct amd_sdwc_ctrl *ctrl, u32 rows, u32 cols)
> {
> u32 sdw_rows, sdw_cols, frame_size;
> @@ -1387,6 +1399,12 @@ static int amd_sdwc_probe(struct platform_device *pdev)
> INIT_WORK(&ctrl->amd_sdw_work, amd_sdwc_update_slave_status_work);
> INIT_WORK(&ctrl->probe_work, amd_sdwc_probe_work);
> schedule_work(&ctrl->probe_work);
> + /* Enable runtime PM */
> + pm_runtime_set_autosuspend_delay(dev, AMD_SDW_MASTER_SUSPEND_DELAY_MS);
> + pm_runtime_use_autosuspend(dev);
> + pm_runtime_mark_last_busy(dev);
> + pm_runtime_set_active(dev);
> + pm_runtime_enable(dev);
> return 0;
> }
>
> @@ -1398,14 +1416,201 @@ static int amd_sdwc_remove(struct platform_device *pdev)
> amd_disable_sdw_interrupts(ctrl);
> sdw_bus_master_delete(&ctrl->bus);
> ret = amd_disable_sdw_controller(ctrl);
> + pm_runtime_disable(&pdev->dev);
> return ret;
> }
>
> +static int amd_sdwc_clock_stop(struct amd_sdwc_ctrl *ctrl)
> +{
> + u32 clk_resume_ctrl_reg;
> + u32 wake_en_reg;
> + u32 val;
> + u32 retry_count = 0;
> + int ret;
> +
> + ret = sdw_bus_prep_clk_stop(&ctrl->bus);
> + if (ret < 0 && ret != -ENODATA) {
> + dev_err(ctrl->dev, "prepare clock stop failed %d", ret);
> + return ret;
> + }
> + ret = sdw_bus_clk_stop(&ctrl->bus);
> + if (ret < 0 && ret != -ENODATA) {
> + dev_err(ctrl->dev, "bus clock stop failed %d", ret);
> + return ret;
You need to be very careful here, because returning an error may prevent
the device from suspending.
If it's safe and possible to recover during the resume step, you
probably want to log the error but let the suspend continue.
> + }
> + switch (ctrl->instance) {
> + case ACP_SDW0:
> + clk_resume_ctrl_reg = ACP_SW_CLK_RESUME_CTRL;
> + wake_en_reg = ACP_SW_WAKE_EN;
> + break;
> + case ACP_SDW1:
> + clk_resume_ctrl_reg = ACP_P1_SW_CLK_RESUME_CTRL;
> + wake_en_reg = ACP_SW1_WAKE_EN;
> + break;
> + default:
> + return -EINVAL;
> + }
why not store these offsets during the probe and use them directly here?
You know at probe time which master you're using.
> +
> + do {
> + val = acp_reg_readl(ctrl->mmio + clk_resume_ctrl_reg);
> + if (val & AMD_SDW_CLK_STOP_DONE) {
> + ctrl->clk_stopped = true;
> + break;
> + }
> + } while (retry_count++ < AMD_SDW_CLK_STOP_MAX_RETRY_COUNT);
> +
> + if (!ctrl->clk_stopped) {
> + dev_err(ctrl->dev, "SDW%x clock stop failed\n", ctrl->instance);
> + return -ETIMEDOUT;
> + }
> +
> + if (ctrl->wake_en_mask)
> + acp_reg_writel(0x01, ctrl->mmio + wake_en_reg);
> +
> + dev_dbg(ctrl->dev, "SDW%x clock stop successful\n", ctrl->instance);
> + return 0;
> +}
> +
> +static int amd_sdwc_clock_stop_exit(struct amd_sdwc_ctrl *ctrl)
> +{
> + int ret;
> + u32 clk_resume_ctrl_reg;
> + u32 val = 0;
> + u32 retry_count = 0;
> +
> + switch (ctrl->instance) {
> + case ACP_SDW0:
> + clk_resume_ctrl_reg = ACP_SW_CLK_RESUME_CTRL;
> + break;
> + case ACP_SDW1:
> + clk_resume_ctrl_reg = ACP_P1_SW_CLK_RESUME_CTRL;
> + break;
> + default:
> + return -EINVAL;
> + }
> + if (ctrl->clk_stopped) {
> + val = acp_reg_readl(ctrl->mmio + clk_resume_ctrl_reg);
> + val |= AMD_SDW_CLK_RESUME_REQ;
> + acp_reg_writel(val, ctrl->mmio + clk_resume_ctrl_reg);
> + do {
> + val = acp_reg_readl(ctrl->mmio + clk_resume_ctrl_reg);
> + if (val & AMD_SDW_CLK_RESUME_DONE)
> + break;
> + usleep_range(10, 100);
> + } while (retry_count++ < AMD_SDW_CLK_STOP_MAX_RETRY_COUNT);
> + if (val & AMD_SDW_CLK_RESUME_DONE) {
> + acp_reg_writel(0, ctrl->mmio + clk_resume_ctrl_reg);
> + ret = sdw_bus_exit_clk_stop(&ctrl->bus);
> + if (ret < 0)
> + dev_err(ctrl->dev, "bus failed to exit clock stop %d\n", ret);
> + ctrl->clk_stopped = false;
> + }
> + }
> + if (ctrl->clk_stopped) {
> + dev_err(ctrl->dev, "SDW%x clock stop exit failed\n", ctrl->instance);
> + return -ETIMEDOUT;
> + }
> +
> + dev_dbg(ctrl->dev, "SDW%x clock stop exit successful\n", ctrl->instance);
> +
> + return 0;
> +}
> +
> +static int __maybe_unused amd_suspend_runtime(struct device *dev)
> +{
> + struct amd_sdwc_ctrl *ctrl = dev_get_drvdata(dev);
> + struct sdw_bus *bus = &ctrl->bus;
> + int ret;
> +
> + if (bus->prop.hw_disabled || !ctrl->startup_done) {
do you have a case where the startup is not done? This was an
Intel-specific thing.
> + dev_dbg(bus->dev, "SoundWire master %d is disabled or not-started, ignoring\n",
> + bus->link_id);
> + return 0;
> + }
> + if (ctrl->power_mode_mask & AMD_SDW_CLK_STOP_MODE) {
> + ret = amd_sdwc_clock_stop(ctrl);
> + if (ret)
> + return ret;
> + } else if (ctrl->power_mode_mask & AMD_SDW_POWER_OFF_MODE) {
> + ret = amd_sdwc_clock_stop(ctrl);
> + if (ret)
> + return ret;
> + ret = amd_deinit_sdw_controller(ctrl);
> + if (ret)
> + return ret;
> + }
> + return 0;
> +}
> +
> +static int __maybe_unused amd_resume_runtime(struct device *dev)
> +{
> + struct amd_sdwc_ctrl *ctrl = dev_get_drvdata(dev);
> + struct sdw_bus *bus = &ctrl->bus;
> + int ret;
> + u32 clk_resume_ctrl_reg;
> + u32 val = 0;
> + u32 retry_count = 0;
> +
> + if (bus->prop.hw_disabled || !ctrl->startup_done) {
same here
> + dev_dbg(bus->dev, "SoundWire master %d is disabled or not-started, ignoring\n",
> + bus->link_id);
> + return 0;
> + }
> +
> + switch (ctrl->instance) {
> + case ACP_SDW0:
> + clk_resume_ctrl_reg = ACP_SW_CLK_RESUME_CTRL;
> + break;
> + case ACP_SDW1:
> + clk_resume_ctrl_reg = ACP_P1_SW_CLK_RESUME_CTRL;
> + break;
> + default:
> + return -EINVAL;
> + }
select registers in the probe.
> +
> + if (ctrl->power_mode_mask & AMD_SDW_CLK_STOP_MODE) {
> + ret = amd_sdwc_clock_stop_exit(ctrl);
> + if (ret)
> + return ret;
> + } else if (ctrl->power_mode_mask & AMD_SDW_POWER_OFF_MODE) {
> + val = acp_reg_readl(ctrl->mmio + clk_resume_ctrl_reg);
> + if (val) {
> + val |= AMD_SDW_CLK_RESUME_REQ;
> + acp_reg_writel(val, ctrl->mmio + clk_resume_ctrl_reg);
> + do {
> + val = acp_reg_readl(ctrl->mmio + clk_resume_ctrl_reg);
> + if (val & AMD_SDW_CLK_RESUME_DONE)
> + break;
> + usleep_range(10, 100);
> + } while (retry_count++ < AMD_SDW_CLK_STOP_MAX_RETRY_COUNT);
> + if (val & AMD_SDW_CLK_RESUME_DONE) {
> + acp_reg_writel(0, ctrl->mmio + clk_resume_ctrl_reg);
> + ctrl->clk_stopped = false;
> + }
> + }
> + sdw_clear_slave_status(bus, SDW_UNATTACH_REQUEST_MASTER_RESET);
> + amd_init_sdw_controller(ctrl);
> + amd_enable_sdw_interrupts(ctrl);
> + ret = amd_enable_sdw_controller(ctrl);
> + if (ret)
> + return ret;
> + ret = amd_sdwc_set_frameshape(ctrl, 50, 10);
this should be defined at probe time, using magic numbers like this will
not work in all cases and totally depends on the frame rate and
bandwidth needs.
> + if (ret)
> + return ret;
> + }
> + return 0;
> +}
next prev parent reply other threads:[~2023-01-11 16:38 UTC|newest]
Thread overview: 91+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-01-11 9:02 [PATCH 00/19] Add soundwire support for Pink Sardine platform Vijendar Mukunda
2023-01-11 9:02 ` [PATCH 01/19] ASoC: amd: ps: create platform devices based on acp config Vijendar Mukunda
2023-01-11 13:27 ` Amadeusz Sławiński
2023-01-11 14:13 ` Mukunda,Vijendar
2023-01-11 13:32 ` Pierre-Louis Bossart
2023-01-13 12:36 ` Mukunda,Vijendar
2023-01-13 17:11 ` Pierre-Louis Bossart
2023-01-16 8:02 ` Mukunda,Vijendar
2023-01-31 13:09 ` Mukunda,Vijendar
2023-01-31 13:24 ` Mario Limonciello
2023-01-31 16:00 ` Pierre-Louis Bossart
2023-01-31 22:57 ` Limonciello, Mario
2023-02-01 0:51 ` Pierre-Louis Bossart
2023-02-01 1:45 ` Mukunda,Vijendar
2023-02-01 2:03 ` Pierre-Louis Bossart
2023-02-01 2:10 ` Mukunda,Vijendar
2023-02-01 3:52 ` Pierre-Louis Bossart
2023-02-01 6:01 ` Mukunda,Vijendar
2023-02-01 23:08 ` Pierre-Louis Bossart
2023-02-06 6:30 ` Mukunda,Vijendar
2023-02-06 14:50 ` Pierre-Louis Bossart
2023-02-06 16:38 ` Mukunda,Vijendar
2023-01-11 9:02 ` [PATCH 02/19] soundwire: amd: Add support for AMD Master driver Vijendar Mukunda
2023-01-11 13:59 ` Amadeusz Sławiński
2023-01-11 14:16 ` Mukunda,Vijendar
2023-01-11 14:37 ` Pierre-Louis Bossart
2023-01-13 18:21 ` Mukunda,Vijendar
2023-01-13 18:41 ` Pierre-Louis Bossart
2023-01-16 7:53 ` Mukunda,Vijendar
2023-01-16 14:57 ` Pierre-Louis Bossart
2023-01-17 11:37 ` Mukunda,Vijendar
2023-01-11 9:02 ` [PATCH 03/19] soundwire: amd: register sdw controller dai ops Vijendar Mukunda
2023-01-11 14:58 ` Pierre-Louis Bossart
2023-01-13 11:31 ` Mukunda,Vijendar
2023-01-13 17:13 ` Pierre-Louis Bossart
2023-01-11 14:59 ` Amadeusz Sławiński
2023-01-11 9:02 ` [PATCH 04/19] soundwire: amd: enable build for AMD soundwire master driver Vijendar Mukunda
2023-01-19 18:35 ` kernel test robot
2023-01-11 9:02 ` [PATCH 05/19] soundwire: amd: add soundwire interrupt handling Vijendar Mukunda
2023-01-11 15:19 ` Pierre-Louis Bossart
2023-01-19 22:00 ` kernel test robot
2023-01-11 9:02 ` [PATCH 06/19] ASoC: amd: ps: add support for soundwire interrupts in acp pci driver Vijendar Mukunda
2023-01-11 9:02 ` [PATCH 07/19] ASoC: amd: ps: add soundwire dma driver for pink sardine platform Vijendar Mukunda
2023-01-11 15:22 ` Pierre-Louis Bossart
2023-01-12 9:10 ` Mukunda,Vijendar
2023-01-11 9:02 ` [PATCH 08/19] ASoC: amd: ps: add soundwire dma driver dma ops Vijendar Mukunda
2023-01-11 13:04 ` Mark Brown
2023-01-11 14:08 ` Mukunda,Vijendar
2023-01-11 15:34 ` Pierre-Louis Bossart
2023-01-13 11:16 ` Mukunda,Vijendar
2023-01-13 17:05 ` Pierre-Louis Bossart
2023-01-16 6:59 ` Mukunda,Vijendar
2023-01-11 9:02 ` [PATCH 09/19] ASoC: amd: ps: add support for Soundwire DMA interrupts Vijendar Mukunda
2023-01-11 15:38 ` Pierre-Louis Bossart
2023-01-12 10:55 ` Mukunda,Vijendar
2023-01-11 9:02 ` [PATCH 10/19] ASoC: amd: ps: enable Soundwire DMA driver build Vijendar Mukunda
2023-01-11 9:02 ` [PATCH 11/19] ASoC: amd: update comments in Kconfig file Vijendar Mukunda
2023-01-11 9:02 ` [PATCH 12/19] ASoC: amd: ps: Add soundwire specific checks in pci driver in pm ops Vijendar Mukunda
2023-01-11 9:02 ` [PATCH 13/19] ASoC: amd: ps: add support for runtime pm ops for soundwire dma driver Vijendar Mukunda
2023-01-11 9:02 ` [PATCH 14/19] soundwire: amd: add runtime pm ops for AMD master driver Vijendar Mukunda
2023-01-11 15:47 ` Pierre-Louis Bossart [this message]
2023-01-12 10:35 ` Mukunda,Vijendar
2023-01-12 14:47 ` Pierre-Louis Bossart
2023-01-11 9:02 ` [PATCH 15/19] soundwire: amd: add startup and shutdown dai ops Vijendar Mukunda
2023-01-11 15:49 ` Pierre-Louis Bossart
2023-01-12 10:22 ` Mukunda,Vijendar
2023-01-11 9:02 ` [PATCH 16/19] soundwire: amd: handle wake enable interrupt Vijendar Mukunda
2023-01-11 15:54 ` Pierre-Louis Bossart
2023-01-12 10:21 ` Mukunda,Vijendar
2023-01-11 9:02 ` [PATCH 17/19] soundwire: amd: add pm_prepare callback and pm ops support Vijendar Mukunda
2023-01-11 15:58 ` Pierre-Louis Bossart
2023-01-12 10:14 ` Mukunda,Vijendar
2023-01-12 14:50 ` Pierre-Louis Bossart
2023-01-11 9:02 ` [PATCH 18/19] ASoC: amd: ps: implement system level pm ops for soundwire dma driver Vijendar Mukunda
2023-01-11 9:02 ` [PATCH 19/19] ASoC: amd: ps: increase runtime suspend delay Vijendar Mukunda
2023-01-11 16:02 ` Pierre-Louis Bossart
2023-01-12 11:02 ` Mukunda,Vijendar
2023-01-12 14:54 ` Pierre-Louis Bossart
2023-01-12 15:29 ` Limonciello, Mario
2023-01-12 16:05 ` Pierre-Louis Bossart
2023-01-13 10:58 ` Mukunda,Vijendar
2023-01-13 17:33 ` Pierre-Louis Bossart
2023-01-13 19:57 ` Mark Brown
2023-01-16 8:35 ` Mukunda,Vijendar
2023-01-16 15:02 ` Pierre-Louis Bossart
2023-01-17 11:33 ` Mukunda,Vijendar
2023-01-17 11:51 ` Pierre-Louis Bossart
2023-01-17 12:16 ` Mark Brown
2023-01-17 12:36 ` Pierre-Louis Bossart
2023-01-11 13:36 ` [PATCH 00/19] Add soundwire support for Pink Sardine platform Pierre-Louis Bossart
2023-01-12 9:08 ` Mukunda,Vijendar
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1af8aa6a-9896-4d35-48de-f084fd16ebc7@linux.intel.com \
--to=pierre-louis.bossart@linux.intel.com \
--cc=Basavaraj.Hiregoudar@amd.com \
--cc=Mario.Limonciello@amd.com \
--cc=Mastan.Katragadda@amd.com \
--cc=Sunil-kumar.Dommati@amd.com \
--cc=Vijendar.Mukunda@amd.com \
--cc=alsa-devel@alsa-project.org \
--cc=arungopal.kondaveeti@amd.com \
--cc=broonie@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=sanyog.r.kale@intel.com \
--cc=vkoul@kernel.org \
--cc=yung-chuan.liao@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox