disp: msm: add capability to dynamically update the transfer time

This change adds a connector OP, that will be used to update frame
transfer time dynamically at the request from user space.

It also adds parsing for new device tree entries that set the minimum
and maximum trasnfer times on a mode basis. These min and max transfer
times are also published to userspace through the connector mode info
capabilities blob.

Change-Id: I12aedf96a51ff7feb2c5b3b1353d3c4ec8dcb068
Signed-off-by: Satya Rama Aditya Pinapala <psraditya30@codeaurora.org>
Signed-off-by: Nilaan Gunabalachandran <quic_ngunabal@quicinc.com>
This commit is contained in:
Nilaan Gunabalachandran
2021-08-26 10:15:46 -07:00
parent de4b82ec48
commit e5fcf7f263
9 changed files with 123 additions and 7 deletions

View File

@@ -7311,6 +7311,46 @@ int dsi_display_get_avr_step_req_fps(void *display_dsi, u32 mode_fps)
return step;
}
int dsi_display_update_transfer_time(void *display, u32 transfer_time)
{
struct dsi_display *disp = (struct dsi_display *)display;
int rc = 0, i = 0;
u32 transfer_time_min, transfer_time_max;
struct dsi_display_ctrl *ctrl;
if (!disp->panel || !disp->panel->cur_mode || !disp->panel->cur_mode->priv_info)
return -EINVAL;
transfer_time_min = disp->panel->cur_mode->priv_info->mdp_transfer_time_us_min;
transfer_time_max = disp->panel->cur_mode->priv_info->mdp_transfer_time_us_max;
if (!transfer_time_min || !transfer_time_max)
return 0;
if (transfer_time < transfer_time_min || transfer_time > transfer_time_max) {
DSI_ERR("invalid transfer time %u, min: %u, max: %u\n",
transfer_time, transfer_time_min, transfer_time_max);
return -EINVAL;
}
disp->panel->cur_mode->priv_info->mdp_transfer_time_us = transfer_time;
disp->panel->cur_mode->priv_info->dsi_transfer_time_us = transfer_time;
display_for_each_ctrl(i, disp) {
ctrl = &disp->ctrl[i];
rc = dsi_ctrl_update_host_config(ctrl->ctrl, &disp->config,
disp->panel->cur_mode, 0x0,
disp->dsi_clk_handle);
if (rc) {
DSI_ERR("[%s] failed to update ctrl config, rc=%d\n", disp->name, rc);
return rc;
}
}
atomic_set(&disp->clkrate_change_pending, 1);
return 0;
}
static bool dsi_display_match_timings(const struct dsi_display_mode *mode1,
struct dsi_display_mode *mode2, unsigned int match_flags)
{