Merge "msm: mdss: handle ULPS clamp programming for sdm660"

This commit is contained in:
Linux Build Service Account 2017-03-21 05:01:05 -07:00 committed by Gerrit - the friendly Code Review server
commit 2fd839d4e1
9 changed files with 150 additions and 11 deletions

View file

@ -210,6 +210,15 @@ enum mdss_mdp_pipe_type {
MDSS_MDP_PIPE_TYPE_MAX,
};
enum mdss_mdp_intf_index {
MDSS_MDP_NO_INTF,
MDSS_MDP_INTF0,
MDSS_MDP_INTF1,
MDSS_MDP_INTF2,
MDSS_MDP_INTF3,
MDSS_MDP_MAX_INTF
};
struct reg_bus_client {
char name[MAX_CLIENT_NAME_LEN];
short usecase_ndx;

View file

@ -2516,6 +2516,15 @@ static int mdss_dsi_register_mdp_callback(struct mdss_dsi_ctrl_pdata *ctrl,
return 0;
}
static int mdss_dsi_register_clamp_handler(struct mdss_dsi_ctrl_pdata *ctrl,
struct mdss_intf_ulp_clamp *clamp_handler)
{
mutex_lock(&ctrl->mutex);
ctrl->clamp_handler = clamp_handler;
mutex_unlock(&ctrl->mutex);
return 0;
}
static struct device_node *mdss_dsi_get_fb_node_cb(struct platform_device *pdev)
{
struct device_node *fb_node;
@ -2700,6 +2709,10 @@ static int mdss_dsi_event_handler(struct mdss_panel_data *pdata,
rc = mdss_dsi_register_mdp_callback(ctrl_pdata,
(struct mdss_intf_recovery *)arg);
break;
case MDSS_EVENT_REGISTER_CLAMP_HANDLER:
rc = mdss_dsi_register_clamp_handler(ctrl_pdata,
(struct mdss_intf_ulp_clamp *)arg);
break;
case MDSS_EVENT_DSI_DYNAMIC_SWITCH:
mode = (u32)(unsigned long) arg;
mdss_dsi_switch_mode(pdata, mode);

View file

@ -485,6 +485,7 @@ struct mdss_dsi_ctrl_pdata {
struct mdss_hw *dsi_hw;
struct mdss_intf_recovery *recovery;
struct mdss_intf_recovery *mdp_callback;
struct mdss_intf_ulp_clamp *clamp_handler;
struct dsi_panel_cmds on_cmds;
struct dsi_panel_cmds post_dms_on_cmds;

View file

@ -1992,6 +1992,7 @@ void mdss_mdp_disable_hw_irq(struct mdss_data_type *mdata);
void mdss_mdp_set_supported_formats(struct mdss_data_type *mdata);
int mdss_mdp_dest_scaler_setup_locked(struct mdss_mdp_mixer *mixer);
void *mdss_mdp_intf_get_ctx_base(struct mdss_mdp_ctl *ctl, int intf_num);
#ifdef CONFIG_FB_MSM_MDP_NONE
struct mdss_data_type *mdss_mdp_get_mdata(void)

View file

@ -1,4 +1,4 @@
/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
/* Copyright (c) 2012-2017, 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
@ -634,15 +634,6 @@ enum mdss_mdp_dspp_index {
#define MDSS_MDP_DSPP_OP_PA_SIX_ZONE_SAT_MASK BIT(30)
#define MDSS_MDP_DSPP_OP_PA_SIX_ZONE_VAL_MASK BIT(31)
enum mdss_mpd_intf_index {
MDSS_MDP_NO_INTF,
MDSS_MDP_INTF0,
MDSS_MDP_INTF1,
MDSS_MDP_INTF2,
MDSS_MDP_INTF3,
MDSS_MDP_MAX_INTF
};
#define MDSS_MDP_REG_INTF_TIMING_ENGINE_EN 0x000
#define MDSS_MDP_REG_INTF_CONFIG 0x004
#define MDSS_MDP_REG_INTF_HSYNC_CTL 0x008
@ -703,6 +694,8 @@ enum mdss_mpd_intf_index {
#define MDSS_MDP_PANEL_FORMAT_RGB888 0x213F
#define MDSS_MDP_PANEL_FORMAT_RGB666 0x212A
#define MDSS_MDP_REG_DSI_ULP_CLAMP_VALUE 0x064
#define MDSS_MDP_PANEL_FORMAT_PACK_ALIGN_MSB BIT(7)
enum mdss_mdp_pingpong_index {

View file

@ -103,6 +103,7 @@ struct mdss_mdp_cmd_ctx {
struct mdss_intf_recovery intf_recovery;
struct mdss_intf_recovery intf_mdp_callback;
struct mdss_intf_ulp_clamp intf_clamp_handler;
struct mdss_mdp_cmd_ctx *sync_ctx; /* for partial update */
u32 pp_timeout_report_cnt;
bool pingpong_split_slave;
@ -1281,6 +1282,32 @@ static void mdss_mdp_cmd_lineptr_done(void *arg)
spin_unlock(&ctx->clk_lock);
}
static int mdss_mdp_cmd_intf_clamp_ctrl(void *data, int intf_num, bool enable)
{
struct mdss_mdp_ctl *ctl = data;
char __iomem *ctx_base = NULL;
if (!data) {
pr_err("%s: invalid ctl\n", __func__);
return -EINVAL;
}
ctx_base =
(char __iomem *)mdss_mdp_intf_get_ctx_base(ctl, intf_num);
if (!ctx_base) {
pr_err("%s: invalid ctx\n", __func__);
return -EINVAL;
}
pr_debug("%s: intf num = %d, enable = %d\n",
__func__, intf_num, enable);
writel_relaxed(enable, (ctx_base + MDSS_MDP_REG_DSI_ULP_CLAMP_VALUE));
wmb(); /* ensure clamp is enabled */
return 0;
}
static int mdss_mdp_cmd_intf_recovery(void *data, int event)
{
struct mdss_mdp_cmd_ctx *ctx = data;
@ -3209,6 +3236,12 @@ int mdss_mdp_cmd_ctx_stop(struct mdss_mdp_ctl *ctl,
memset(ctx, 0, sizeof(*ctx));
/* intf stopped, no more kickoff */
ctx->intf_stopped = 1;
/*
* Restore clamp handler as it might get called later
* when DSI panel events are handled.
*/
ctx->intf_clamp_handler.fxn = mdss_mdp_cmd_intf_clamp_ctrl;
ctx->intf_clamp_handler.data = ctl;
return 0;
}
@ -3349,6 +3382,11 @@ int mdss_mdp_cmd_stop(struct mdss_mdp_ctl *ctl, int panel_power_state)
(void *)&ctx->intf_mdp_callback,
CTL_INTF_EVENT_FLAG_DEFAULT);
mdss_mdp_ctl_intf_event(ctl,
MDSS_EVENT_REGISTER_CLAMP_HANDLER,
(void *)&ctx->intf_clamp_handler,
CTL_INTF_EVENT_FLAG_DEFAULT);
mdss_mdp_tearcheck_enable(ctl, true);
ctx->intf_stopped = 0;
@ -3407,6 +3445,10 @@ panel_events:
goto end;
}
mdss_mdp_ctl_intf_event(ctl,
MDSS_EVENT_REGISTER_CLAMP_HANDLER,
NULL, CTL_INTF_EVENT_FLAG_DEFAULT);
pr_debug("%s: turn off panel\n", __func__);
ctl->intf_ctx[MASTER_CTX] = NULL;
ctl->intf_ctx[SLAVE_CTX] = NULL;
@ -3540,6 +3582,14 @@ static int mdss_mdp_cmd_ctx_setup(struct mdss_mdp_ctl *ctl,
ctx->intf_mdp_callback.fxn = mdss_mdp_cmd_intf_callback;
ctx->intf_mdp_callback.data = ctx;
ctx->intf_clamp_handler.fxn = mdss_mdp_cmd_intf_clamp_ctrl;
ctx->intf_clamp_handler.data = ctl;
mdss_mdp_ctl_intf_event(ctl,
MDSS_EVENT_REGISTER_CLAMP_HANDLER,
(void *)&ctx->intf_clamp_handler,
CTL_INTF_EVENT_FLAG_DEFAULT);
ctx->intf_stopped = 0;
pr_debug("%s: ctx=%pK num=%d aux=%d\n", __func__, ctx,

View file

@ -84,6 +84,7 @@ struct mdss_mdp_video_ctx {
struct list_head vsync_handlers;
struct mdss_intf_recovery intf_recovery;
struct mdss_intf_recovery intf_mdp_callback;
struct mdss_intf_ulp_clamp intf_clamp_handler;
struct work_struct early_wakeup_dfps_work;
atomic_t lineptr_ref;
@ -150,6 +151,23 @@ static int mdss_mdp_intf_intr2index(u32 intr_type)
return index;
}
void *mdss_mdp_intf_get_ctx_base(struct mdss_mdp_ctl *ctl, int intf_num)
{
struct mdss_mdp_video_ctx *head;
int i = 0;
if (!ctl)
return NULL;
head = ctl->mdata->video_intf;
for (i = 0; i < ctl->mdata->nintf; i++) {
if (head[i].intf_num == intf_num)
return (void *)head[i].base;
}
return NULL;
}
int mdss_mdp_set_intf_intr_callback(struct mdss_mdp_video_ctx *ctx,
u32 intr_type, void (*fnc_ptr)(void *), void *arg)
{
@ -316,6 +334,29 @@ int mdss_mdp_video_addr_setup(struct mdss_data_type *mdata,
return 0;
}
static int mdss_mdp_video_intf_clamp_ctrl(void *data, int intf_num, bool enable)
{
struct mdss_mdp_video_ctx *ctx = data;
if (!data) {
pr_err("%s: invalid ctl\n", __func__);
return -EINVAL;
}
if (intf_num != ctx->intf_num) {
pr_err("%s: invalid intf num\n", __func__);
return -EINVAL;
}
pr_debug("%s: ctx intf num = %d, enable = %d\n",
__func__, ctx->intf_num, enable);
mdp_video_write(ctx, MDSS_MDP_REG_DSI_ULP_CLAMP_VALUE, enable);
wmb(); /* ensure clamp is enabled */
return 0;
}
static int mdss_mdp_video_intf_recovery(void *data, int event)
{
struct mdss_mdp_video_ctx *ctx;
@ -1998,6 +2039,13 @@ static int mdss_mdp_video_ctx_setup(struct mdss_mdp_ctl *ctl,
MDSS_EVENT_REGISTER_MDP_CALLBACK,
(void *)&ctx->intf_mdp_callback,
CTL_INTF_EVENT_FLAG_DEFAULT);
ctx->intf_clamp_handler.fxn = mdss_mdp_video_intf_clamp_ctrl;
ctx->intf_clamp_handler.data = ctx;
mdss_mdp_ctl_intf_event(ctl,
MDSS_EVENT_REGISTER_CLAMP_HANDLER,
(void *)&ctx->intf_clamp_handler,
CTL_INTF_EVENT_FLAG_DEFAULT);
} else {
ctx->intf_recovery.fxn = NULL;
ctx->intf_recovery.data = NULL;

View file

@ -197,6 +197,11 @@ struct mdss_intf_recovery {
void *data;
};
struct mdss_intf_ulp_clamp {
int (*fxn)(void *ctx, int intf_num, bool enable);
void *data;
};
/**
* enum mdss_intf_events - Different events generated by MDP core
*
@ -302,6 +307,7 @@ enum mdss_intf_events {
MDSS_EVENT_UPDATE_PANEL_PPM,
MDSS_EVENT_DSI_TIMING_DB_CTRL,
MDSS_EVENT_AVR_MODE,
MDSS_EVENT_REGISTER_CLAMP_HANDLER,
MDSS_EVENT_MAX,
};
@ -358,6 +364,8 @@ static inline char *mdss_panel_intf_event_to_string(int event)
return INTF_EVENT_STR(MDSS_EVENT_REGISTER_RECOVERY_HANDLER);
case MDSS_EVENT_REGISTER_MDP_CALLBACK:
return INTF_EVENT_STR(MDSS_EVENT_REGISTER_MDP_CALLBACK);
case MDSS_EVENT_REGISTER_CLAMP_HANDLER:
return INTF_EVENT_STR(MDSS_EVENT_REGISTER_CLAMP_HANDLER);
case MDSS_EVENT_DSI_PANEL_STATUS:
return INTF_EVENT_STR(MDSS_EVENT_DSI_PANEL_STATUS);
case MDSS_EVENT_DSI_DYNAMIC_SWITCH:

View file

@ -1,4 +1,4 @@
/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
/* Copyright (c) 2012-2017, 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
@ -1983,6 +1983,7 @@ static int mdss_dsi_clamp_ctrl_default(struct mdss_dsi_ctrl_pdata *ctrl,
struct mipi_panel_info *mipi = NULL;
u32 clamp_reg, regval = 0;
u32 clamp_reg_off;
u32 intf_num = 0;
if (!ctrl) {
pr_err("%s: invalid input\n", __func__);
@ -1994,6 +1995,21 @@ static int mdss_dsi_clamp_ctrl_default(struct mdss_dsi_ctrl_pdata *ctrl,
return -EINVAL;
}
/*
* For DSI HW version 2.1.0 ULPS_CLAMP register
* is moved to interface level.
*/
if (ctrl->shared_data->hw_rev == MDSS_DSI_HW_REV_201) {
intf_num = ctrl->ndx ? MDSS_MDP_INTF2 : MDSS_MDP_INTF1;
if (ctrl->clamp_handler) {
ctrl->clamp_handler->fxn(ctrl->clamp_handler->data,
intf_num, enable);
pr_debug("%s: ndx: %d enable: %d\n",
__func__, ctrl->ndx, enable);
}
return 0;
}
clamp_reg_off = ctrl->shared_data->ulps_clamp_ctrl_off;
mipi = &ctrl->panel_data.panel_info.mipi;