Unverified Commit 32882881 authored by Srinivasa Rao Mandadapu's avatar Srinivasa Rao Mandadapu Committed by Mark Brown
Browse files

ASoC: qcom: soundwire: Add support for controlling audio CGCR from HLOS



Add support for controlling soundwire audio CGCR interface using clock
framework to make hclk ungating with software. As per new hardware
changes, software has to always ungate hclk if soundwire is operational
and keep it running. This requirement is for latest LPASS chipsets for
RX, TX and WSA path to work.

Signed-off-by: default avatarSrinivasa Rao Mandadapu <quic_srivasam@quicinc.com>
Link: https://lore.kernel.org/r/1652877755-25120-1-git-send-email-quic_srivasam@quicinc.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent fef94875
Loading
Loading
Loading
Loading
+10 −0
Original line number Original line Diff line number Diff line
@@ -13,6 +13,7 @@
#include <linux/of_device.h>
#include <linux/of_device.h>
#include <linux/pm_runtime.h>
#include <linux/pm_runtime.h>
#include <linux/regmap.h>
#include <linux/regmap.h>
#include <linux/reset.h>
#include <linux/slab.h>
#include <linux/slab.h>
#include <linux/pm_wakeirq.h>
#include <linux/pm_wakeirq.h>
#include <linux/slimbus.h>
#include <linux/slimbus.h>
@@ -142,6 +143,7 @@ struct qcom_swrm_ctrl {
	struct device *dev;
	struct device *dev;
	struct regmap *regmap;
	struct regmap *regmap;
	void __iomem *mmio;
	void __iomem *mmio;
	struct reset_control *audio_cgcr;
#ifdef CONFIG_DEBUG_FS
#ifdef CONFIG_DEBUG_FS
	struct dentry *debugfs;
	struct dentry *debugfs;
#endif
#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_ROW_CTRL_BMSK, ctrl->rows_index);
	val |= FIELD_PREP(SWRM_MCP_FRAME_CTRL_BANK_COL_CTRL_BMSK, ctrl->cols_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);
	ctrl->reg_write(ctrl, SWRM_MCP_FRAME_CTRL_BANK_ADDR(0), val);


	/* Enable Auto enumeration */
	/* 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.compute_params = &qcom_swrm_compute_params;
	ctrl->bus.clk_stop_timeout = 300;
	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);
	ret = qcom_swrm_get_port_config(ctrl);
	if (ret)
	if (ret)
		goto err_clk;
		goto err_clk;
@@ -1485,6 +1493,8 @@ static int __maybe_unused swrm_runtime_resume(struct device *dev)
		qcom_swrm_get_device_status(ctrl);
		qcom_swrm_get_device_status(ctrl);
		sdw_handle_slave_status(&ctrl->bus, ctrl->status);
		sdw_handle_slave_status(&ctrl->bus, ctrl->status);
	} else {
	} 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_MCP_BUS_CTRL, SWRM_MCP_BUS_CLK_START);
		ctrl->reg_write(ctrl, SWRM_INTERRUPT_CLEAR,
		ctrl->reg_write(ctrl, SWRM_INTERRUPT_CLEAR,
			SWRM_INTERRUPT_STATUS_MASTER_CLASH_DET);
			SWRM_INTERRUPT_STATUS_MASTER_CLASH_DET);