mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
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: Matti Lehtimäki <matti.lehtimaki@gmail.com> [luca: minor changes] Signed-off-by: Luca 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: Bjorn Andersson <andersson@kernel.org>
This commit is contained in:
parent
14198a0ca5
commit
65991ea8a6
1 changed files with 26 additions and 7 deletions
|
@ -117,10 +117,10 @@ static const struct wcnss_data pronto_v1_data = {
|
||||||
.pmu_offset = 0x1004,
|
.pmu_offset = 0x1004,
|
||||||
.spare_offset = 0x1088,
|
.spare_offset = 0x1088,
|
||||||
|
|
||||||
.pd_names = { "mx", "cx" },
|
.pd_names = { "cx", "mx" },
|
||||||
.vregs = (struct wcnss_vreg_info[]) {
|
.vregs = (struct wcnss_vreg_info[]) {
|
||||||
{ "vddmx", 950000, 1150000, 0 },
|
|
||||||
{ "vddcx", .super_turbo = true},
|
{ "vddcx", .super_turbo = true},
|
||||||
|
{ "vddmx", 950000, 1150000, 0 },
|
||||||
{ "vddpx", 1800000, 1800000, 0 },
|
{ "vddpx", 1800000, 1800000, 0 },
|
||||||
},
|
},
|
||||||
.num_pd_vregs = 2,
|
.num_pd_vregs = 2,
|
||||||
|
@ -131,10 +131,10 @@ static const struct wcnss_data pronto_v2_data = {
|
||||||
.pmu_offset = 0x1004,
|
.pmu_offset = 0x1004,
|
||||||
.spare_offset = 0x1088,
|
.spare_offset = 0x1088,
|
||||||
|
|
||||||
.pd_names = { "mx", "cx" },
|
.pd_names = { "cx", "mx" },
|
||||||
.vregs = (struct wcnss_vreg_info[]) {
|
.vregs = (struct wcnss_vreg_info[]) {
|
||||||
{ "vddmx", 1287500, 1287500, 0 },
|
|
||||||
{ "vddcx", .super_turbo = true },
|
{ "vddcx", .super_turbo = true },
|
||||||
|
{ "vddmx", 1287500, 1287500, 0 },
|
||||||
{ "vddpx", 1800000, 1800000, 0 },
|
{ "vddpx", 1800000, 1800000, 0 },
|
||||||
},
|
},
|
||||||
.num_pd_vregs = 2,
|
.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,
|
static int wcnss_init_pds(struct qcom_wcnss *wcnss,
|
||||||
const char * const pd_names[WCNSS_MAX_PDS])
|
const char * const pd_names[WCNSS_MAX_PDS])
|
||||||
{
|
{
|
||||||
|
struct device *dev = wcnss->dev;
|
||||||
int i, ret;
|
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++) {
|
for (i = 0; i < WCNSS_MAX_PDS; i++) {
|
||||||
if (!pd_names[i])
|
if (!pd_names[i])
|
||||||
break;
|
break;
|
||||||
|
@ -418,8 +427,15 @@ static int wcnss_init_pds(struct qcom_wcnss *wcnss,
|
||||||
|
|
||||||
static void wcnss_release_pds(struct qcom_wcnss *wcnss)
|
static void wcnss_release_pds(struct qcom_wcnss *wcnss)
|
||||||
{
|
{
|
||||||
|
struct device *dev = wcnss->dev;
|
||||||
int i;
|
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++)
|
for (i = 0; i < wcnss->num_pds; i++)
|
||||||
dev_pm_domain_detach(wcnss->pds[i], false);
|
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
|
* the regulators for the power domains. For old device trees we need to
|
||||||
* reserve extra space to manage them through the regulator interface.
|
* reserve extra space to manage them through the regulator interface.
|
||||||
*/
|
*/
|
||||||
if (wcnss->num_pds)
|
if (wcnss->num_pds) {
|
||||||
info += num_pd_vregs;
|
info += wcnss->num_pds;
|
||||||
else
|
/* Handle single power domain case */
|
||||||
|
num_vregs += num_pd_vregs - wcnss->num_pds;
|
||||||
|
} else {
|
||||||
num_vregs += num_pd_vregs;
|
num_vregs += num_pd_vregs;
|
||||||
|
}
|
||||||
|
|
||||||
bulk = devm_kcalloc(wcnss->dev,
|
bulk = devm_kcalloc(wcnss->dev,
|
||||||
num_vregs, sizeof(struct regulator_bulk_data),
|
num_vregs, sizeof(struct regulator_bulk_data),
|
||||||
|
|
Loading…
Add table
Reference in a new issue