aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorJani Nikula <jani.nikula@intel.com>2012-08-15 05:32:39 -0400
committerDave Airlie <airlied@redhat.com>2012-08-23 19:37:36 -0400
commit451023dc32d4542c21b52ad1692e6e01cb75b099 (patch)
tree9380bd992f953d0a7403b3894bd1d946b6fbca91 /drivers
parent993dcb05e47e357ade19c41f60b39085eeba8787 (diff)
drm: remove the raw_edid field from struct drm_display_info
Neither the drm core nor any of the drivers really need the raw_edid field of struct drm_display_info for anything. Instead of being useful, it creates confusion about who is responsible for freeing the memory it points to and setting the field to NULL afterwards, leading to memory leaks and dangling pointers. Remove the raw_edid field, and fix drivers as necessary. Reported-by: Russell King <linux@arm.linux.org.uk> Signed-off-by: Jani Nikula <jani.nikula@intel.com> Acked-by: Inki Dae <inki.dae@samsung.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/drm_edid.c3
-rw-r--r--drivers/gpu/drm/drm_edid_load.c23
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_connector.c4
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_vidi.c13
-rw-r--r--drivers/gpu/drm/gma500/cdv_intel_hdmi.c2
-rw-r--r--drivers/gpu/drm/gma500/oaktrail_hdmi.c1
-rw-r--r--drivers/gpu/drm/gma500/psb_intel_sdvo.c3
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c4
-rw-r--r--drivers/gpu/drm/i915/intel_hdmi.c3
-rw-r--r--drivers/gpu/drm/i915/intel_modes.c1
-rw-r--r--drivers/gpu/drm/i915/intel_sdvo.c3
-rw-r--r--drivers/gpu/drm/mgag200/mgag200_mode.c1
-rw-r--r--drivers/gpu/drm/udl/udl_connector.c3
-rw-r--r--drivers/staging/omapdrm/omap_connector.c5
14 files changed, 15 insertions, 54 deletions
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index a8743c399e83..bcc472572cd0 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -399,10 +399,7 @@ struct edid *drm_get_edid(struct drm_connector *connector,
399 if (drm_probe_ddc(adapter)) 399 if (drm_probe_ddc(adapter))
400 edid = (struct edid *)drm_do_get_edid(connector, adapter); 400 edid = (struct edid *)drm_do_get_edid(connector, adapter);
401 401
402 connector->display_info.raw_edid = (char *)edid;
403
404 return edid; 402 return edid;
405
406} 403}
407EXPORT_SYMBOL(drm_get_edid); 404EXPORT_SYMBOL(drm_get_edid);
408 405
diff --git a/drivers/gpu/drm/drm_edid_load.c b/drivers/gpu/drm/drm_edid_load.c
index 0303935d10e2..186832e1874e 100644
--- a/drivers/gpu/drm/drm_edid_load.c
+++ b/drivers/gpu/drm/drm_edid_load.c
@@ -114,8 +114,8 @@ static u8 generic_edid[GENERIC_EDIDS][128] = {
114 }, 114 },
115}; 115};
116 116
117static int edid_load(struct drm_connector *connector, char *name, 117static u8 *edid_load(struct drm_connector *connector, char *name,
118 char *connector_name) 118 char *connector_name)
119{ 119{
120 const struct firmware *fw; 120 const struct firmware *fw;
121 struct platform_device *pdev; 121 struct platform_device *pdev;
@@ -205,7 +205,6 @@ static int edid_load(struct drm_connector *connector, char *name,
205 edid = new_edid; 205 edid = new_edid;
206 } 206 }
207 207
208 connector->display_info.raw_edid = edid;
209 DRM_INFO("Got %s EDID base block and %d extension%s from " 208 DRM_INFO("Got %s EDID base block and %d extension%s from "
210 "\"%s\" for connector \"%s\"\n", builtin ? "built-in" : 209 "\"%s\" for connector \"%s\"\n", builtin ? "built-in" :
211 "external", valid_extensions, valid_extensions == 1 ? "" : "s", 210 "external", valid_extensions, valid_extensions == 1 ? "" : "s",
@@ -215,7 +214,10 @@ relfw_out:
215 release_firmware(fw); 214 release_firmware(fw);
216 215
217out: 216out:
218 return err; 217 if (err)
218 return ERR_PTR(err);
219
220 return edid;
219} 221}
220 222
221int drm_load_edid_firmware(struct drm_connector *connector) 223int drm_load_edid_firmware(struct drm_connector *connector)
@@ -223,6 +225,7 @@ int drm_load_edid_firmware(struct drm_connector *connector)
223 char *connector_name = drm_get_connector_name(connector); 225 char *connector_name = drm_get_connector_name(connector);
224 char *edidname = edid_firmware, *last, *colon; 226 char *edidname = edid_firmware, *last, *colon;
225 int ret; 227 int ret;
228 struct edid *edid;
226 229
227 if (*edidname == '\0') 230 if (*edidname == '\0')
228 return 0; 231 return 0;
@@ -240,13 +243,13 @@ int drm_load_edid_firmware(struct drm_connector *connector)
240 if (*last == '\n') 243 if (*last == '\n')
241 *last = '\0'; 244 *last = '\0';
242 245
243 ret = edid_load(connector, edidname, connector_name); 246 edid = (struct edid *) edid_load(connector, edidname, connector_name);
244 if (ret) 247 if (IS_ERR_OR_NULL(edid))
245 return 0; 248 return 0;
246 249
247 drm_mode_connector_update_edid_property(connector, 250 drm_mode_connector_update_edid_property(connector, edid);
248 (struct edid *) connector->display_info.raw_edid); 251 ret = drm_add_edid_modes(connector, edid);
252 kfree(edid);
249 253
250 return drm_add_edid_modes(connector, (struct edid *) 254 return ret;
251 connector->display_info.raw_edid);
252} 255}
diff --git a/drivers/gpu/drm/exynos/exynos_drm_connector.c b/drivers/gpu/drm/exynos/exynos_drm_connector.c
index d9568198c300..9dce3b9c3896 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_connector.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_connector.c
@@ -147,9 +147,7 @@ static int exynos_drm_connector_get_modes(struct drm_connector *connector)
147 147
148 drm_mode_connector_update_edid_property(connector, edid); 148 drm_mode_connector_update_edid_property(connector, edid);
149 count = drm_add_edid_modes(connector, edid); 149 count = drm_add_edid_modes(connector, edid);
150 150 kfree(edid);
151 kfree(connector->display_info.raw_edid);
152 connector->display_info.raw_edid = edid;
153 } else { 151 } else {
154 struct drm_display_mode *mode = drm_mode_create(connector->dev); 152 struct drm_display_mode *mode = drm_mode_create(connector->dev);
155 struct exynos_drm_panel_info *panel; 153 struct exynos_drm_panel_info *panel;
diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
index bb1550c4dd57..92395258d641 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
@@ -102,7 +102,6 @@ static int vidi_get_edid(struct device *dev, struct drm_connector *connector,
102 u8 *edid, int len) 102 u8 *edid, int len)
103{ 103{
104 struct vidi_context *ctx = get_vidi_context(dev); 104 struct vidi_context *ctx = get_vidi_context(dev);
105 struct edid *raw_edid;
106 105
107 DRM_DEBUG_KMS("%s\n", __FILE__); 106 DRM_DEBUG_KMS("%s\n", __FILE__);
108 107
@@ -115,18 +114,6 @@ static int vidi_get_edid(struct device *dev, struct drm_connector *connector,
115 return -EFAULT; 114 return -EFAULT;
116 } 115 }
117 116
118 raw_edid = kzalloc(len, GFP_KERNEL);
119 if (!raw_edid) {
120 DRM_DEBUG_KMS("failed to allocate raw_edid.\n");
121 return -ENOMEM;
122 }
123
124 memcpy(raw_edid, ctx->raw_edid, min((1 + ctx->raw_edid->extensions)
125 * EDID_LENGTH, len));
126
127 /* attach the edid data to connector. */
128 connector->display_info.raw_edid = (char *)raw_edid;
129
130 memcpy(edid, ctx->raw_edid, min((1 + ctx->raw_edid->extensions) 117 memcpy(edid, ctx->raw_edid, min((1 + ctx->raw_edid->extensions)
131 * EDID_LENGTH, len)); 118 * EDID_LENGTH, len));
132 119
diff --git a/drivers/gpu/drm/gma500/cdv_intel_hdmi.c b/drivers/gpu/drm/gma500/cdv_intel_hdmi.c
index 0c90f0316db1..b1b77bb92a85 100644
--- a/drivers/gpu/drm/gma500/cdv_intel_hdmi.c
+++ b/drivers/gpu/drm/gma500/cdv_intel_hdmi.c
@@ -157,8 +157,6 @@ static enum drm_connector_status cdv_hdmi_detect(
157 hdmi_priv->has_hdmi_audio = 157 hdmi_priv->has_hdmi_audio =
158 drm_detect_monitor_audio(edid); 158 drm_detect_monitor_audio(edid);
159 } 159 }
160
161 psb_intel_connector->base.display_info.raw_edid = NULL;
162 kfree(edid); 160 kfree(edid);
163 } 161 }
164 return status; 162 return status;
diff --git a/drivers/gpu/drm/gma500/oaktrail_hdmi.c b/drivers/gpu/drm/gma500/oaktrail_hdmi.c
index 2eb3dc4e9c9b..69e51e903f35 100644
--- a/drivers/gpu/drm/gma500/oaktrail_hdmi.c
+++ b/drivers/gpu/drm/gma500/oaktrail_hdmi.c
@@ -252,7 +252,6 @@ static int oaktrail_hdmi_get_modes(struct drm_connector *connector)
252 if (edid) { 252 if (edid) {
253 drm_mode_connector_update_edid_property(connector, edid); 253 drm_mode_connector_update_edid_property(connector, edid);
254 ret = drm_add_edid_modes(connector, edid); 254 ret = drm_add_edid_modes(connector, edid);
255 connector->display_info.raw_edid = NULL;
256 } 255 }
257 256
258 /* 257 /*
diff --git a/drivers/gpu/drm/gma500/psb_intel_sdvo.c b/drivers/gpu/drm/gma500/psb_intel_sdvo.c
index 0466c7b985f8..a453d94f115c 100644
--- a/drivers/gpu/drm/gma500/psb_intel_sdvo.c
+++ b/drivers/gpu/drm/gma500/psb_intel_sdvo.c
@@ -1343,7 +1343,6 @@ psb_intel_sdvo_hdmi_sink_detect(struct drm_connector *connector)
1343 } 1343 }
1344 } else 1344 } else
1345 status = connector_status_disconnected; 1345 status = connector_status_disconnected;
1346 connector->display_info.raw_edid = NULL;
1347 kfree(edid); 1346 kfree(edid);
1348 } 1347 }
1349 1348
@@ -1404,7 +1403,6 @@ psb_intel_sdvo_detect(struct drm_connector *connector, bool force)
1404 ret = connector_status_disconnected; 1403 ret = connector_status_disconnected;
1405 else 1404 else
1406 ret = connector_status_connected; 1405 ret = connector_status_connected;
1407 connector->display_info.raw_edid = NULL;
1408 kfree(edid); 1406 kfree(edid);
1409 } else 1407 } else
1410 ret = connector_status_connected; 1408 ret = connector_status_connected;
@@ -1453,7 +1451,6 @@ static void psb_intel_sdvo_get_ddc_modes(struct drm_connector *connector)
1453 drm_add_edid_modes(connector, edid); 1451 drm_add_edid_modes(connector, edid);
1454 } 1452 }
1455 1453
1456 connector->display_info.raw_edid = NULL;
1457 kfree(edid); 1454 kfree(edid);
1458 } 1455 }
1459} 1456}
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 977d9d216c73..d14b1e39244c 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -2145,7 +2145,6 @@ intel_dp_get_edid_modes(struct drm_connector *connector, struct i2c_adapter *ada
2145 ret = drm_add_edid_modes(connector, intel_dp->edid); 2145 ret = drm_add_edid_modes(connector, intel_dp->edid);
2146 drm_edid_to_eld(connector, 2146 drm_edid_to_eld(connector,
2147 intel_dp->edid); 2147 intel_dp->edid);
2148 connector->display_info.raw_edid = NULL;
2149 return intel_dp->edid_mode_count; 2148 return intel_dp->edid_mode_count;
2150 } 2149 }
2151 2150
@@ -2191,7 +2190,6 @@ intel_dp_detect(struct drm_connector *connector, bool force)
2191 edid = intel_dp_get_edid(connector, &intel_dp->adapter); 2190 edid = intel_dp_get_edid(connector, &intel_dp->adapter);
2192 if (edid) { 2191 if (edid) {
2193 intel_dp->has_audio = drm_detect_monitor_audio(edid); 2192 intel_dp->has_audio = drm_detect_monitor_audio(edid);
2194 connector->display_info.raw_edid = NULL;
2195 kfree(edid); 2193 kfree(edid);
2196 } 2194 }
2197 } 2195 }
@@ -2256,8 +2254,6 @@ intel_dp_detect_audio(struct drm_connector *connector)
2256 edid = intel_dp_get_edid(connector, &intel_dp->adapter); 2254 edid = intel_dp_get_edid(connector, &intel_dp->adapter);
2257 if (edid) { 2255 if (edid) {
2258 has_audio = drm_detect_monitor_audio(edid); 2256 has_audio = drm_detect_monitor_audio(edid);
2259
2260 connector->display_info.raw_edid = NULL;
2261 kfree(edid); 2257 kfree(edid);
2262 } 2258 }
2263 2259
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
index e4c37bb572e8..35a6ee7a8cca 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -737,7 +737,6 @@ intel_hdmi_detect(struct drm_connector *connector, bool force)
737 drm_detect_hdmi_monitor(edid); 737 drm_detect_hdmi_monitor(edid);
738 intel_hdmi->has_audio = drm_detect_monitor_audio(edid); 738 intel_hdmi->has_audio = drm_detect_monitor_audio(edid);
739 } 739 }
740 connector->display_info.raw_edid = NULL;
741 kfree(edid); 740 kfree(edid);
742 } 741 }
743 742
@@ -778,8 +777,6 @@ intel_hdmi_detect_audio(struct drm_connector *connector)
778 if (edid) { 777 if (edid) {
779 if (edid->input & DRM_EDID_INPUT_DIGITAL) 778 if (edid->input & DRM_EDID_INPUT_DIGITAL)
780 has_audio = drm_detect_monitor_audio(edid); 779 has_audio = drm_detect_monitor_audio(edid);
781
782 connector->display_info.raw_edid = NULL;
783 kfree(edid); 780 kfree(edid);
784 } 781 }
785 782
diff --git a/drivers/gpu/drm/i915/intel_modes.c b/drivers/gpu/drm/i915/intel_modes.c
index 45848b9b670b..7a5238fc1a02 100644
--- a/drivers/gpu/drm/i915/intel_modes.c
+++ b/drivers/gpu/drm/i915/intel_modes.c
@@ -50,7 +50,6 @@ int intel_ddc_get_modes(struct drm_connector *connector,
50 drm_mode_connector_update_edid_property(connector, edid); 50 drm_mode_connector_update_edid_property(connector, edid);
51 ret = drm_add_edid_modes(connector, edid); 51 ret = drm_add_edid_modes(connector, edid);
52 drm_edid_to_eld(connector, edid); 52 drm_edid_to_eld(connector, edid);
53 connector->display_info.raw_edid = NULL;
54 kfree(edid); 53 kfree(edid);
55 } 54 }
56 55
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c
index 5fb425bf4d03..434b1d1d3c84 100644
--- a/drivers/gpu/drm/i915/intel_sdvo.c
+++ b/drivers/gpu/drm/i915/intel_sdvo.c
@@ -1345,7 +1345,6 @@ intel_sdvo_tmds_sink_detect(struct drm_connector *connector)
1345 } 1345 }
1346 } else 1346 } else
1347 status = connector_status_disconnected; 1347 status = connector_status_disconnected;
1348 connector->display_info.raw_edid = NULL;
1349 kfree(edid); 1348 kfree(edid);
1350 } 1349 }
1351 1350
@@ -1419,7 +1418,6 @@ intel_sdvo_detect(struct drm_connector *connector, bool force)
1419 else 1418 else
1420 ret = connector_status_disconnected; 1419 ret = connector_status_disconnected;
1421 1420
1422 connector->display_info.raw_edid = NULL;
1423 kfree(edid); 1421 kfree(edid);
1424 } else 1422 } else
1425 ret = connector_status_connected; 1423 ret = connector_status_connected;
@@ -1465,7 +1463,6 @@ static void intel_sdvo_get_ddc_modes(struct drm_connector *connector)
1465 drm_add_edid_modes(connector, edid); 1463 drm_add_edid_modes(connector, edid);
1466 } 1464 }
1467 1465
1468 connector->display_info.raw_edid = NULL;
1469 kfree(edid); 1466 kfree(edid);
1470 } 1467 }
1471} 1468}
diff --git a/drivers/gpu/drm/mgag200/mgag200_mode.c b/drivers/gpu/drm/mgag200/mgag200_mode.c
index b69642d5d850..c7420e83c0b9 100644
--- a/drivers/gpu/drm/mgag200/mgag200_mode.c
+++ b/drivers/gpu/drm/mgag200/mgag200_mode.c
@@ -1399,7 +1399,6 @@ static int mga_vga_get_modes(struct drm_connector *connector)
1399 if (edid) { 1399 if (edid) {
1400 drm_mode_connector_update_edid_property(connector, edid); 1400 drm_mode_connector_update_edid_property(connector, edid);
1401 ret = drm_add_edid_modes(connector, edid); 1401 ret = drm_add_edid_modes(connector, edid);
1402 connector->display_info.raw_edid = NULL;
1403 kfree(edid); 1402 kfree(edid);
1404 } 1403 }
1405 return ret; 1404 return ret;
diff --git a/drivers/gpu/drm/udl/udl_connector.c b/drivers/gpu/drm/udl/udl_connector.c
index ba055e9ca007..2d98ff92f3ba 100644
--- a/drivers/gpu/drm/udl/udl_connector.c
+++ b/drivers/gpu/drm/udl/udl_connector.c
@@ -57,11 +57,8 @@ static int udl_get_modes(struct drm_connector *connector)
57 57
58 edid = (struct edid *)udl_get_edid(udl); 58 edid = (struct edid *)udl_get_edid(udl);
59 59
60 connector->display_info.raw_edid = (char *)edid;
61
62 drm_mode_connector_update_edid_property(connector, edid); 60 drm_mode_connector_update_edid_property(connector, edid);
63 ret = drm_add_edid_modes(connector, edid); 61 ret = drm_add_edid_modes(connector, edid);
64 connector->display_info.raw_edid = NULL;
65 kfree(edid); 62 kfree(edid);
66 return ret; 63 return ret;
67} 64}
diff --git a/drivers/staging/omapdrm/omap_connector.c b/drivers/staging/omapdrm/omap_connector.c
index 5e2856c0e0bb..9c2287b71d29 100644
--- a/drivers/staging/omapdrm/omap_connector.c
+++ b/drivers/staging/omapdrm/omap_connector.c
@@ -177,14 +177,11 @@ static int omap_connector_get_modes(struct drm_connector *connector)
177 drm_mode_connector_update_edid_property( 177 drm_mode_connector_update_edid_property(
178 connector, edid); 178 connector, edid);
179 n = drm_add_edid_modes(connector, edid); 179 n = drm_add_edid_modes(connector, edid);
180 kfree(connector->display_info.raw_edid);
181 connector->display_info.raw_edid = edid;
182 } else { 180 } else {
183 drm_mode_connector_update_edid_property( 181 drm_mode_connector_update_edid_property(
184 connector, NULL); 182 connector, NULL);
185 connector->display_info.raw_edid = NULL;
186 kfree(edid);
187 } 183 }
184 kfree(edid);
188 } else { 185 } else {
189 struct drm_display_mode *mode = drm_mode_create(dev); 186 struct drm_display_mode *mode = drm_mode_create(dev);
190 struct omap_video_timings timings; 187 struct omap_video_timings timings;