Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b774cded authored by Venkat Devarasetty's avatar Venkat Devarasetty
Browse files

msm: add default enable mode option for lpm levels



With cluster architecture changes all lpm modes are
enabled at boot. There are crashes at boot when all
lpms are enabled at boot. Add an option to enable
only selected modes at boot up.

Change-Id: Iebeab667aad8d12926b7a3a92deb8ca47c68bfb3
Signed-off-by: default avatarVenkat Devarasetty <vdevaras@codeaurora.org>
parent e5111bfd
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -97,6 +97,11 @@ qcom,pm-cpu-levels.
	power collapse and the cpu relies on Broadcast timer for scheduled
	wakeups. Required only for states where the CPUs internal timer state
	is lost.
	- qcom,default-idle: The presence of this property in LPM level
	indicates that the mode is enabled by default at boot up for idle path.
	- qcom,default-suspend: The presence of this property in LPM level
	indicates that the mode is enabled by default at boot up for suspend
	path.

[Example dts]

@@ -175,6 +180,7 @@ qcom,lpm-levels {
					qcom,ss-power = <715>;
					qcom,energy-overhead = <17700>;
					qcom,time-overhead = <2>;
					qcom,default-idle;
				};

				qcom,pm-cpu-level@1 {
@@ -202,6 +208,7 @@ qcom,lpm-levels {
					qcom,ss-power = <163>;
					qcom,energy-overhead = <577736>;
					qcom,time-overhead = <1000>;
					qcom,default-suspend;
				};
			};
		};
+16 −2
Original line number Diff line number Diff line
@@ -133,8 +133,6 @@ static int create_lvl_avail_nodes(const char *name,
		goto failed;
	}

	avail->idle_enabled = true;
	avail->suspend_enabled = true;
	avail->kobj = kobj;

	return ret;
@@ -181,6 +179,10 @@ static int create_cpu_lvl_nodes(struct lpm_cluster *p, struct kobject *parent)
				continue;
			}

			level_list[i].idle_enabled =
				p->cpu->levels[j].default_idle_enable;
			level_list[i].suspend_enabled =
				p->cpu->levels[j].default_suspend_enable;
			ret = create_lvl_avail_nodes(p->cpu->levels[j].name,
						cpu_kobj[cpu], &level_list[i]);
			if (ret)
@@ -209,6 +211,10 @@ int create_cluster_lvl_nodes(struct lpm_cluster *p, struct kobject *kobj)
		return -ENOMEM;

	for (i = 0; i < p->nlevels; i++) {
		p->levels[i].available.idle_enabled
				= p->levels[i].default_idle_enable;
		p->levels[i].available.suspend_enabled
				= p->levels[i].default_suspend_enable;
		ret = create_lvl_avail_nodes(p->levels[i].level_name,
				cluster_kobj, &p->levels[i].available);
		if (ret)
@@ -431,6 +437,10 @@ static int parse_cluster_level(struct device_node *node,
	level->last_core_only = of_property_read_bool(node,
					"qcom,last-core-only");

	level->default_idle_enable = of_property_read_bool(node,
						"qcom,default-idle");
	level->default_suspend_enable = of_property_read_bool(node,
						"qcom,default-suspend");
	ret = parse_power_params(node, &level->pwr);
	if (ret)
		goto failed;
@@ -540,6 +550,10 @@ static int parse_cpu_levels(struct device_node *node, struct lpm_cluster *c)
		key = "qcom,use-broadcast-timer";
		l->use_bc_timer = of_property_read_bool(n, key);

		l->default_idle_enable =
			of_property_read_bool(n, "qcom,default-idle");
		l->default_suspend_enable =
			of_property_read_bool(n, "qcom,default-suspend");
	}
	return 0;
failed:
+4 −0
Original line number Diff line number Diff line
@@ -32,6 +32,8 @@ struct lpm_cpu_level {
	enum msm_pm_sleep_mode mode;
	bool use_bc_timer;
	struct power_params pwr;
	bool default_idle_enable;
	bool default_suspend_enable;
};

struct lpm_cpu {
@@ -58,6 +60,8 @@ struct lpm_cluster_level {
	bool sync_level;
	bool last_core_only;
	struct lpm_level_avail available;
	bool default_idle_enable;
	bool default_suspend_enable;
};

struct low_power_ops {