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

Commit 84fc4063 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: mdss: rotator: switch context between active-only and active+sleep"

parents 556d3f91 1191b3d5
Loading
Loading
Loading
Loading
+15 −1
Original line number Diff line number Diff line
/*
 * Copyright (c) 2014, The Linux Foundation. All rights reserved.
 * Copyright (c) 2014-2015, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -341,6 +341,20 @@ TRACE_EVENT(mdp_trace_counter,
			__get_str(counter_name), __entry->value)
);

TRACE_EVENT(rotator_bw_ao_as_context,
	TP_PROTO(u32 state),
	TP_ARGS(state),
	TP_STRUCT__entry(
			__field(u32, state)
	),
	TP_fast_assign(
			__entry->state = state;
	),
	TP_printk("Rotator bw context %s",
			__entry->state ? "Active Only" : "Active+Sleep")

);

#endif /* if !defined(TRACE_MDSS_MDP_H) || defined(TRACE_HEADER_MULTI_READ) */

/* This part must be outside protection */
+44 −38
Original line number Diff line number Diff line
@@ -64,6 +64,7 @@ static struct msm_bus_scale_pdata rot_reg_bus_scale_table = {
	.usecase = rot_reg_bus_usecases,
	.num_usecases = ARRAY_SIZE(rot_reg_bus_usecases),
	.name = "mdss_rot_reg",
	.active_only = 1,
};

static struct mdss_rot_mgr *rot_mgr;
@@ -264,52 +265,60 @@ static int mdss_rotator_clk_ctrl(struct mdss_rot_mgr *mgr, int enable)
{
	struct clk *clk;
	int ret = 0;
	int i;
	int i, changed = 0;

	/* Ref counting done by clock driver */
	for (i = 0; i < MDSS_CLK_ROTATOR_END_IDX; i++) {
		clk = mgr->rot_clk[i];
	mutex_lock(&mgr->clk_lock);
	if (enable) {
			ret = clk_enable(clk);
			if (ret) {
				pr_err("enable failed clk_idx %d\n", i);
				goto error;
			}
		if (mgr->rot_enable_clk_cnt == 0)
			changed++;
		mgr->rot_enable_clk_cnt++;
	} else {
			clk_disable(clk);
		}
		if (mgr->rot_enable_clk_cnt) {
			mgr->rot_enable_clk_cnt--;
			if (mgr->rot_enable_clk_cnt == 0)
				changed++;
		} else {
			pr_err("Can not be turned off\n");
		}

	return ret;
error:
	for (i--; i >= 0; i--)
		clk_disable(mgr->rot_clk[i]);
	return ret;
	}

static int __mdss_rotator_clk_prepare(struct mdss_rot_mgr *mgr, int prepare)
{
	struct clk *clk;
	int ret = 0;
	int i;

	if (changed) {
		pr_debug("Rotator clk %s\n", enable ? "enable" : "disable");
		for (i = 0; i < MDSS_CLK_ROTATOR_END_IDX; i++) {
			clk = mgr->rot_clk[i];
		if (prepare) {
			ret = clk_prepare(clk);
			if (enable) {
				ret = clk_prepare_enable(clk);
				if (ret) {
				pr_err("prepare_enable failed clk_idx %d\n", i);
					pr_err("enable failed clk_idx %d\n", i);
					goto error;
				}
			} else {
			clk_unprepare(clk);
				clk_disable_unprepare(clk);
			}
		}
		mutex_lock(&mgr->bus_lock);
		if (enable) {
			/* Active+Sleep */
			msm_bus_scale_client_update_context(
				mgr->data_bus.bus_hdl, false,
				mgr->data_bus.curr_bw_uc_idx);
			trace_rotator_bw_ao_as_context(0);
		} else {
			/* Active Only */
			msm_bus_scale_client_update_context(
				mgr->data_bus.bus_hdl, true,
				mgr->data_bus.curr_bw_uc_idx);
			trace_rotator_bw_ao_as_context(1);
		}
		mutex_unlock(&mgr->bus_lock);
	}
	mutex_unlock(&mgr->clk_lock);

	return ret;
error:
	for (i--; i >= 0; i--)
		clk_unprepare(mgr->rot_clk[i]);
		clk_disable_unprepare(mgr->rot_clk[i]);
	mutex_unlock(&mgr->clk_lock);
	return ret;
}

@@ -338,14 +347,11 @@ int mdss_rotator_resource_ctrl(struct mdss_rot_mgr *mgr, int enable)
	MDSS_XLOG(mgr->res_ref_cnt, changed, enable);

	if (changed) {
		if (enable) {
		if (enable)
			mdss_rotator_footswitch_ctrl(mgr, true);
			ret = __mdss_rotator_clk_prepare(mgr, enable);
		} else {
			__mdss_rotator_clk_prepare(mgr, enable);
		else
			mdss_rotator_footswitch_ctrl(mgr, false);
	}
	}
	mutex_unlock(&mgr->clk_lock);
	return ret;
}
+1 −0
Original line number Diff line number Diff line
@@ -174,6 +174,7 @@ struct mdss_rot_mgr {
	struct mutex clk_lock;
	int res_ref_cnt;
	struct clk *rot_clk[MDSS_CLK_ROTATOR_END_IDX];
	int rot_enable_clk_cnt;

	bool has_downscale;
	bool has_ubwc;