diff options
author | Srinivas Kandagatla <srinivas.kandagatla@linaro.org> | 2021-10-19 14:01:27 +0100 |
---|---|---|
committer | Srinivas Kandagatla <srinivas.kandagatla@linaro.org> | 2021-12-10 14:07:06 +0000 |
commit | 58302dbe4f51b29de0310dea6fe4d97e1d64d0de (patch) | |
tree | a922f3a2322b3e9613e8ade7d8784f1b52849c9b | |
parent | 7d34d1ae6c5ee0d4df839c9bc50608d0f4078162 (diff) |
ASoC: codecs: wcd938x: add simple clk stop support
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
-rw-r--r-- | sound/soc/codecs/wcd938x-sdw.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/sound/soc/codecs/wcd938x-sdw.c b/sound/soc/codecs/wcd938x-sdw.c index 1fa05ec7459a..e463b45e4f7a 100644 --- a/sound/soc/codecs/wcd938x-sdw.c +++ b/sound/soc/codecs/wcd938x-sdw.c @@ -191,10 +191,29 @@ static int wcd9380_interrupt_callback(struct sdw_slave *slave, return IRQ_HANDLED; } +static int wcd9380_clk_stop(struct sdw_slave *slave, enum sdw_clk_stop_mode mode, + enum sdw_clk_stop_type type) +{ + struct regmap *regmap = dev_get_regmap(&slave->dev, NULL); + struct device *dev = &slave->dev; + + if (regmap && type == SDW_CLK_POST_DEPREPARE) { + /* only check for pending interrupts if powered up */ + if (pm_runtime_get_if_in_use(dev)) { + wcd9380_interrupt_callback(slave, 0); + pm_runtime_mark_last_busy(dev); + pm_runtime_put_autosuspend(dev); + } + } + + return 0; +} + static struct sdw_slave_ops wcd9380_slave_ops = { .update_status = wcd9380_update_status, .interrupt_callback = wcd9380_interrupt_callback, .bus_config = wcd9380_bus_config, + .clk_stop = wcd9380_clk_stop, }; static int wcd938x_sdw_component_bind(struct device *dev, @@ -249,6 +268,7 @@ static int wcd9380_probe(struct sdw_slave *pdev, SDW_SCP_INT1_BUS_CLASH | SDW_SCP_INT1_PARITY; pdev->prop.lane_control_support = true; + pdev->prop.simple_clk_stop_capable = true; if (wcd->is_tx) { pdev->prop.source_ports = GENMASK(WCD938X_MAX_SWR_PORTS, 0); pdev->prop.src_dpn_prop = wcd938x_dpn_prop; |