aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/tilcdc/tilcdc_panel.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/tilcdc/tilcdc_panel.c')
-rw-r--r--drivers/gpu/drm/tilcdc/tilcdc_panel.c41
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 {
151static void panel_connector_destroy(struct drm_connector *connector) 151static 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
284static 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
298static const struct tilcdc_module_ops panel_module_ops = { 285static 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
404fail: 390fail_timings:
405 panel_destroy(mod); 391 display_timings_release(panel_mod->timings);
392
393fail_free:
394 kfree(panel_mod);
395 tilcdc_module_cleanup(mod);
406 return ret; 396 return ret;
407} 397}
408 398
409static int panel_remove(struct platform_device *pdev) 399static 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