aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSrinivas Kandagatla <srinivas.kandagatla@linaro.org>2021-10-19 14:01:27 +0100
committerSrinivas Kandagatla <srinivas.kandagatla@linaro.org>2021-12-10 14:07:06 +0000
commit58302dbe4f51b29de0310dea6fe4d97e1d64d0de (patch)
treea922f3a2322b3e9613e8ade7d8784f1b52849c9b
parent7d34d1ae6c5ee0d4df839c9bc50608d0f4078162 (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.c20
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;