diff options
Diffstat (limited to 'drivers/gpu/drm/tilcdc/tilcdc_panel.c')
-rw-r--r-- | drivers/gpu/drm/tilcdc/tilcdc_panel.c | 41 |
1 files changed, 20 insertions, 21 deletions
diff --git a/drivers/gpu/drm/tilcdc/tilcdc_panel.c b/drivers/gpu/drm/tilcdc/tilcdc_panel.c index 86c67329b605..4c7aa1d8134f 100644 --- a/drivers/gpu/drm/tilcdc/tilcdc_panel.c +++ b/drivers/gpu/drm/tilcdc/tilcdc_panel.c | |||
@@ -151,6 +151,7 @@ struct panel_connector { | |||
151 | static void panel_connector_destroy(struct drm_connector *connector) | 151 | static void panel_connector_destroy(struct drm_connector *connector) |
152 | { | 152 | { |
153 | struct panel_connector *panel_connector = to_panel_connector(connector); | 153 | struct panel_connector *panel_connector = to_panel_connector(connector); |
154 | drm_connector_unregister(connector); | ||
154 | drm_connector_cleanup(connector); | 155 | drm_connector_cleanup(connector); |
155 | kfree(panel_connector); | 156 | kfree(panel_connector); |
156 | } | 157 | } |
@@ -247,7 +248,7 @@ static struct drm_connector *panel_connector_create(struct drm_device *dev, | |||
247 | if (ret) | 248 | if (ret) |
248 | goto fail; | 249 | goto fail; |
249 | 250 | ||
250 | drm_sysfs_connector_add(connector); | 251 | drm_connector_register(connector); |
251 | 252 | ||
252 | return connector; | 253 | return connector; |
253 | 254 | ||
@@ -281,23 +282,8 @@ static int panel_modeset_init(struct tilcdc_module *mod, struct drm_device *dev) | |||
281 | return 0; | 282 | return 0; |
282 | } | 283 | } |
283 | 284 | ||
284 | static void panel_destroy(struct tilcdc_module *mod) | ||
285 | { | ||
286 | struct panel_module *panel_mod = to_panel_module(mod); | ||
287 | |||
288 | if (panel_mod->timings) { | ||
289 | display_timings_release(panel_mod->timings); | ||
290 | kfree(panel_mod->timings); | ||
291 | } | ||
292 | |||
293 | tilcdc_module_cleanup(mod); | ||
294 | kfree(panel_mod->info); | ||
295 | kfree(panel_mod); | ||
296 | } | ||
297 | |||
298 | static const struct tilcdc_module_ops panel_module_ops = { | 285 | static const struct tilcdc_module_ops panel_module_ops = { |
299 | .modeset_init = panel_modeset_init, | 286 | .modeset_init = panel_modeset_init, |
300 | .destroy = panel_destroy, | ||
301 | }; | 287 | }; |
302 | 288 | ||
303 | /* | 289 | /* |
@@ -373,6 +359,7 @@ static int panel_probe(struct platform_device *pdev) | |||
373 | return -ENOMEM; | 359 | return -ENOMEM; |
374 | 360 | ||
375 | mod = &panel_mod->base; | 361 | mod = &panel_mod->base; |
362 | pdev->dev.platform_data = mod; | ||
376 | 363 | ||
377 | tilcdc_module_init(mod, "panel", &panel_module_ops); | 364 | tilcdc_module_init(mod, "panel", &panel_module_ops); |
378 | 365 | ||
@@ -380,17 +367,16 @@ static int panel_probe(struct platform_device *pdev) | |||
380 | if (IS_ERR(pinctrl)) | 367 | if (IS_ERR(pinctrl)) |
381 | dev_warn(&pdev->dev, "pins are not configured\n"); | 368 | dev_warn(&pdev->dev, "pins are not configured\n"); |
382 | 369 | ||
383 | |||
384 | panel_mod->timings = of_get_display_timings(node); | 370 | panel_mod->timings = of_get_display_timings(node); |
385 | if (!panel_mod->timings) { | 371 | if (!panel_mod->timings) { |
386 | dev_err(&pdev->dev, "could not get panel timings\n"); | 372 | dev_err(&pdev->dev, "could not get panel timings\n"); |
387 | goto fail; | 373 | goto fail_free; |
388 | } | 374 | } |
389 | 375 | ||
390 | panel_mod->info = of_get_panel_info(node); | 376 | panel_mod->info = of_get_panel_info(node); |
391 | if (!panel_mod->info) { | 377 | if (!panel_mod->info) { |
392 | dev_err(&pdev->dev, "could not get panel info\n"); | 378 | dev_err(&pdev->dev, "could not get panel info\n"); |
393 | goto fail; | 379 | goto fail_timings; |
394 | } | 380 | } |
395 | 381 | ||
396 | mod->preferred_bpp = panel_mod->info->bpp; | 382 | mod->preferred_bpp = panel_mod->info->bpp; |
@@ -401,13 +387,26 @@ static int panel_probe(struct platform_device *pdev) | |||
401 | 387 | ||
402 | return 0; | 388 | return 0; |
403 | 389 | ||
404 | fail: | 390 | fail_timings: |
405 | panel_destroy(mod); | 391 | display_timings_release(panel_mod->timings); |
392 | |||
393 | fail_free: | ||
394 | kfree(panel_mod); | ||
395 | tilcdc_module_cleanup(mod); | ||
406 | return ret; | 396 | return ret; |
407 | } | 397 | } |
408 | 398 | ||
409 | static int panel_remove(struct platform_device *pdev) | 399 | static int panel_remove(struct platform_device *pdev) |
410 | { | 400 | { |
401 | struct tilcdc_module *mod = dev_get_platdata(&pdev->dev); | ||
402 | struct panel_module *panel_mod = to_panel_module(mod); | ||
403 | |||
404 | display_timings_release(panel_mod->timings); | ||
405 | |||
406 | tilcdc_module_cleanup(mod); | ||
407 | kfree(panel_mod->info); | ||
408 | kfree(panel_mod); | ||
409 | |||
411 | return 0; | 410 | return 0; |
412 | } | 411 | } |
413 | 412 | ||