Commit 65991ea8 authored by Matti Lehtimäki's avatar Matti Lehtimäki Committed by Bjorn Andersson
Browse files

remoteproc: qcom_wcnss: Handle platforms with only single power domain



Both MSM8974 and MSM8226 have only CX as power domain with MX & PX being
handled as regulators. Handle this case by reodering pd_names to have CX
first, and handling that the driver core will already attach a single
power domain internally.

Signed-off-by: default avatarMatti Lehtimäki <matti.lehtimaki@gmail.com>
[luca: minor changes]
Signed-off-by: default avatarLuca Weiss <luca@lucaweiss.eu>
Link: https://lore.kernel.org/r/20250206-wcnss-singlepd-v2-2-9a53ee953dee@lucaweiss.eu


[bjorn: Added missing braces to else after multi-statement if]
Signed-off-by: default avatarBjorn Andersson <andersson@kernel.org>
parent 14198a0c
Loading
Loading
Loading
Loading
+26 −7
Original line number Diff line number Diff line
@@ -117,10 +117,10 @@ static const struct wcnss_data pronto_v1_data = {
	.pmu_offset = 0x1004,
	.spare_offset = 0x1088,

	.pd_names = { "mx", "cx" },
	.pd_names = { "cx", "mx" },
	.vregs = (struct wcnss_vreg_info[]) {
		{ "vddmx", 950000, 1150000, 0 },
		{ "vddcx", .super_turbo = true},
		{ "vddmx", 950000, 1150000, 0 },
		{ "vddpx", 1800000, 1800000, 0 },
	},
	.num_pd_vregs = 2,
@@ -131,10 +131,10 @@ static const struct wcnss_data pronto_v2_data = {
	.pmu_offset = 0x1004,
	.spare_offset = 0x1088,

	.pd_names = { "mx", "cx" },
	.pd_names = { "cx", "mx" },
	.vregs = (struct wcnss_vreg_info[]) {
		{ "vddmx", 1287500, 1287500, 0 },
		{ "vddcx", .super_turbo = true },
		{ "vddmx", 1287500, 1287500, 0 },
		{ "vddpx", 1800000, 1800000, 0 },
	},
	.num_pd_vregs = 2,
@@ -397,8 +397,17 @@ static irqreturn_t wcnss_stop_ack_interrupt(int irq, void *dev)
static int wcnss_init_pds(struct qcom_wcnss *wcnss,
			  const char * const pd_names[WCNSS_MAX_PDS])
{
	struct device *dev = wcnss->dev;
	int i, ret;

	/* Handle single power domain */
	if (dev->pm_domain) {
		wcnss->pds[0] = dev;
		wcnss->num_pds = 1;
		pm_runtime_enable(dev);
		return 0;
	}

	for (i = 0; i < WCNSS_MAX_PDS; i++) {
		if (!pd_names[i])
			break;
@@ -418,8 +427,15 @@ static int wcnss_init_pds(struct qcom_wcnss *wcnss,

static void wcnss_release_pds(struct qcom_wcnss *wcnss)
{
	struct device *dev = wcnss->dev;
	int i;

	/* Handle single power domain */
	if (wcnss->num_pds == 1 && dev->pm_domain) {
		pm_runtime_disable(dev);
		return;
	}

	for (i = 0; i < wcnss->num_pds; i++)
		dev_pm_domain_detach(wcnss->pds[i], false);
}
@@ -437,10 +453,13 @@ static int wcnss_init_regulators(struct qcom_wcnss *wcnss,
	 * the regulators for the power domains. For old device trees we need to
	 * reserve extra space to manage them through the regulator interface.
	 */
	if (wcnss->num_pds)
		info += num_pd_vregs;
	else
	if (wcnss->num_pds) {
		info += wcnss->num_pds;
		/* Handle single power domain case */
		num_vregs += num_pd_vregs - wcnss->num_pds;
	} else {
		num_vregs += num_pd_vregs;
	}

	bulk = devm_kcalloc(wcnss->dev,
			    num_vregs, sizeof(struct regulator_bulk_data),