Procházet zdrojové kódy

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 <[email protected]>
Orion Brody před 5 roky
rodič
revize
ee9c09b8b3
2 změnil soubory, kde provedl 13 přidání a 7 odebrání
  1. 2 0
      msm/dsi/dsi_ctrl.c
  2. 11 7
      msm/dsi/dsi_display.c

+ 2 - 0
msm/dsi/dsi_ctrl.c

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

+ 11 - 7
msm/dsi/dsi_display.c

@@ -5324,24 +5324,19 @@ static void dsi_display_unbind(struct device *dev,
 	struct platform_device *pdev = to_platform_device(dev);
 	int i, rc = 0;
 
-	if (!dev || !pdev) {
+	if (!dev || !pdev || !master) {
 		DSI_ERR("invalid param(s)\n");
 		return;
 	}
 
 	display = platform_get_drvdata(pdev);
-	if (!display) {
+	if (!display || !display->panel_node) {
 		DSI_ERR("invalid display\n");
 		return;
 	}
 
 	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);
 	if (rc)
 		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_display_mode *src, *dst;
 	struct dsi_host_common_cfg *cfg;
+	struct dsi_display_mode_priv_info *priv_info;
 	int i, j, total_modes, bpp, lanes = 0;
+	size_t size = 0;
 
 	if (!display || !mode_idx)
 		return;
@@ -6338,6 +6335,13 @@ static void _dsi_display_populate_bit_clks(struct dsi_display *display,
 				return;
 			}
 			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];
 
 			dsi_display_adjust_mode_timing(dyn_clk_caps, dst, lanes,