disp: msm: dsi: fixes in GKI cleanup path

Creates a deep copy of a struct which previously was shallow.
Also adds null checks which prevent segmentation faults.

Change-Id: I9155f632736fdb30e31f28f55ebe92954956a82d
Signed-off-by: Orion Brody <obrody@codeaurora.org>
This commit is contained in:
Orion Brody
2020-06-03 11:57:44 -07:00
parent a995ee8ca1
commit ee9c09b8b3
2 changed files with 13 additions and 7 deletions

View File

@@ -1967,6 +1967,8 @@ static int dsi_ctrl_dev_remove(struct platform_device *pdev)
mutex_lock(&dsi_ctrl->ctrl_lock); mutex_lock(&dsi_ctrl->ctrl_lock);
dsi_ctrl_isr_configure(dsi_ctrl, false);
rc = dsi_ctrl_supplies_deinit(dsi_ctrl); rc = dsi_ctrl_supplies_deinit(dsi_ctrl);
if (rc) if (rc)
DSI_CTRL_ERR(dsi_ctrl, DSI_CTRL_ERR(dsi_ctrl,

View File

@@ -5324,24 +5324,19 @@ static void dsi_display_unbind(struct device *dev,
struct platform_device *pdev = to_platform_device(dev); struct platform_device *pdev = to_platform_device(dev);
int i, rc = 0; int i, rc = 0;
if (!dev || !pdev) { if (!dev || !pdev || !master) {
DSI_ERR("invalid param(s)\n"); DSI_ERR("invalid param(s)\n");
return; return;
} }
display = platform_get_drvdata(pdev); display = platform_get_drvdata(pdev);
if (!display) { if (!display || !display->panel_node) {
DSI_ERR("invalid display\n"); DSI_ERR("invalid display\n");
return; return;
} }
mutex_lock(&display->display_lock); mutex_lock(&display->display_lock);
rc = dsi_panel_drv_deinit(display->panel);
if (rc)
DSI_ERR("[%s] failed to deinit panel driver, rc=%d\n",
display->name, rc);
rc = dsi_display_mipi_host_deinit(display); rc = dsi_display_mipi_host_deinit(display);
if (rc) if (rc)
DSI_ERR("[%s] failed to deinit mipi hosts, rc=%d\n", DSI_ERR("[%s] failed to deinit mipi hosts, rc=%d\n",
@@ -6284,7 +6279,9 @@ static void _dsi_display_populate_bit_clks(struct dsi_display *display,
struct dsi_dyn_clk_caps *dyn_clk_caps; struct dsi_dyn_clk_caps *dyn_clk_caps;
struct dsi_display_mode *src, *dst; struct dsi_display_mode *src, *dst;
struct dsi_host_common_cfg *cfg; struct dsi_host_common_cfg *cfg;
struct dsi_display_mode_priv_info *priv_info;
int i, j, total_modes, bpp, lanes = 0; int i, j, total_modes, bpp, lanes = 0;
size_t size = 0;
if (!display || !mode_idx) if (!display || !mode_idx)
return; return;
@@ -6338,6 +6335,13 @@ static void _dsi_display_populate_bit_clks(struct dsi_display *display,
return; return;
} }
memcpy(dst, src, sizeof(struct dsi_display_mode)); memcpy(dst, src, sizeof(struct dsi_display_mode));
size = sizeof(struct dsi_display_mode_priv_info);
priv_info = kzalloc(size, GFP_KERNEL);
dst->priv_info = priv_info;
if (dst->priv_info)
memcpy(dst->priv_info, src->priv_info, size);
dst->timing.clk_rate_hz = dyn_clk_caps->bit_clk_list[i]; dst->timing.clk_rate_hz = dyn_clk_caps->bit_clk_list[i];
dsi_display_adjust_mode_timing(dyn_clk_caps, dst, lanes, dsi_display_adjust_mode_timing(dyn_clk_caps, dst, lanes,