Commit 6124a406 authored by Pierre-Louis Bossart's avatar Pierre-Louis Bossart Committed by Vinod Koul
Browse files

soundwire: cadence: add soft-reset on startup

parent cbcb7edd
Loading
Loading
Loading
Loading
+25 −0
Original line number Diff line number Diff line
@@ -1377,6 +1377,31 @@ static void cdns_init_clock_ctrl(struct sdw_cdns *cdns)
	cdns_writel(cdns, CDNS_MCP_SSP_CTRL1, ssp_interval);
}

/**
 * sdw_cdns_soft_reset() - Cadence soft-reset
 * @cdns: Cadence instance
 */
int sdw_cdns_soft_reset(struct sdw_cdns *cdns)
{
	int ret;

	cdns_updatel(cdns, CDNS_MCP_CONTROL, CDNS_MCP_CONTROL_SOFT_RST,
		     CDNS_MCP_CONTROL_SOFT_RST);

	ret = cdns_config_update(cdns);
	if (ret < 0) {
		dev_err(cdns->dev, "%s: config update failed\n", __func__);
		return ret;
	}

	ret = cdns_set_wait(cdns, CDNS_MCP_CONTROL, CDNS_MCP_CONTROL_SOFT_RST, 0);
	if (ret < 0)
		dev_err(cdns->dev, "%s: Soft Reset timed out\n", __func__);

	return ret;
}
EXPORT_SYMBOL(sdw_cdns_soft_reset);

/**
 * sdw_cdns_init() - Cadence initialization
 * @cdns: Cadence instance
+1 −0
Original line number Diff line number Diff line
@@ -168,6 +168,7 @@ int sdw_cdns_probe(struct sdw_cdns *cdns);
irqreturn_t sdw_cdns_irq(int irq, void *dev_id);
irqreturn_t sdw_cdns_thread(int irq, void *dev_id);

int sdw_cdns_soft_reset(struct sdw_cdns *cdns);
int sdw_cdns_init(struct sdw_cdns *cdns);
int sdw_cdns_pdi_init(struct sdw_cdns *cdns,
		      struct sdw_cdns_stream_config config);
+6 −0
Original line number Diff line number Diff line
@@ -16,6 +16,12 @@ int intel_start_bus(struct sdw_intel *sdw)
	struct sdw_bus *bus = &cdns->bus;
	int ret;

	ret = sdw_cdns_soft_reset(cdns);
	if (ret < 0) {
		dev_err(dev, "%s: unable to soft-reset Cadence IP: %d\n", __func__, ret);
		return ret;
	}

	/*
	 * follow recommended programming flows to avoid timeouts when
	 * gsync is enabled