diff options
| -rw-r--r-- | drivers/soundwire/qcom.c | 10 | 
1 files changed, 10 insertions, 0 deletions
| diff --git a/drivers/soundwire/qcom.c b/drivers/soundwire/qcom.c index 22b706350ead..a3fccf051e07 100644 --- a/drivers/soundwire/qcom.c +++ b/drivers/soundwire/qcom.c @@ -13,6 +13,7 @@  #include <linux/of_device.h>  #include <linux/pm_runtime.h>  #include <linux/regmap.h> +#include <linux/reset.h>  #include <linux/slab.h>  #include <linux/pm_wakeirq.h>  #include <linux/slimbus.h> @@ -142,6 +143,7 @@ struct qcom_swrm_ctrl {  	struct device *dev;  	struct regmap *regmap;  	void __iomem *mmio; +	struct reset_control *audio_cgcr;  #ifdef CONFIG_DEBUG_FS  	struct dentry *debugfs;  #endif @@ -656,6 +658,8 @@ static int qcom_swrm_init(struct qcom_swrm_ctrl *ctrl)  	val = FIELD_PREP(SWRM_MCP_FRAME_CTRL_BANK_ROW_CTRL_BMSK, ctrl->rows_index);  	val |= FIELD_PREP(SWRM_MCP_FRAME_CTRL_BANK_COL_CTRL_BMSK, ctrl->cols_index); +	reset_control_reset(ctrl->audio_cgcr); +  	ctrl->reg_write(ctrl, SWRM_MCP_FRAME_CTRL_BANK_ADDR(0), val);  	/* Enable Auto enumeration */ @@ -1332,6 +1336,10 @@ static int qcom_swrm_probe(struct platform_device *pdev)  	ctrl->bus.compute_params = &qcom_swrm_compute_params;  	ctrl->bus.clk_stop_timeout = 300; +	ctrl->audio_cgcr = devm_reset_control_get_exclusive(dev, "swr_audio_cgcr"); +	if (IS_ERR(ctrl->audio_cgcr)) +		dev_err(dev, "Failed to get audio_cgcr reset required for soundwire-v1.6.0\n"); +  	ret = qcom_swrm_get_port_config(ctrl);  	if (ret)  		goto err_clk; @@ -1485,6 +1493,8 @@ static int __maybe_unused swrm_runtime_resume(struct device *dev)  		qcom_swrm_get_device_status(ctrl);  		sdw_handle_slave_status(&ctrl->bus, ctrl->status);  	} else { +		reset_control_reset(ctrl->audio_cgcr); +  		ctrl->reg_write(ctrl, SWRM_MCP_BUS_CTRL, SWRM_MCP_BUS_CLK_START);  		ctrl->reg_write(ctrl, SWRM_INTERRUPT_CLEAR,  			SWRM_INTERRUPT_STATUS_MASTER_CLASH_DET); | 
