drm/exynos: propagate plane initialization errors
[cascardo/linux.git] / drivers / gpu / drm / exynos / exynos_drm_drv.c
1 /*
2  * Copyright (c) 2011 Samsung Electronics Co., Ltd.
3  * Authors:
4  *      Inki Dae <inki.dae@samsung.com>
5  *      Joonyoung Shim <jy0922.shim@samsung.com>
6  *      Seung-Woo Kim <sw0312.kim@samsung.com>
7  *
8  * This program is free software; you can redistribute  it and/or modify it
9  * under  the terms of  the GNU General  Public License as published by the
10  * Free Software Foundation;  either version 2 of the  License, or (at your
11  * option) any later version.
12  */
13
14 #include <linux/pm_runtime.h>
15 #include <drm/drmP.h>
16 #include <drm/drm_crtc_helper.h>
17
18 #include <linux/component.h>
19
20 #include <drm/exynos_drm.h>
21
22 #include "exynos_drm_drv.h"
23 #include "exynos_drm_crtc.h"
24 #include "exynos_drm_encoder.h"
25 #include "exynos_drm_fbdev.h"
26 #include "exynos_drm_fb.h"
27 #include "exynos_drm_gem.h"
28 #include "exynos_drm_plane.h"
29 #include "exynos_drm_vidi.h"
30 #include "exynos_drm_dmabuf.h"
31 #include "exynos_drm_g2d.h"
32 #include "exynos_drm_ipp.h"
33 #include "exynos_drm_iommu.h"
34
35 #define DRIVER_NAME     "exynos"
36 #define DRIVER_DESC     "Samsung SoC DRM"
37 #define DRIVER_DATE     "20110530"
38 #define DRIVER_MAJOR    1
39 #define DRIVER_MINOR    0
40
41 static struct platform_device *exynos_drm_pdev;
42
43 static DEFINE_MUTEX(drm_component_lock);
44 static LIST_HEAD(drm_component_list);
45
46 struct component_dev {
47         struct list_head list;
48         struct device *crtc_dev;
49         struct device *conn_dev;
50         enum exynos_drm_output_type out_type;
51         unsigned int dev_type_flag;
52 };
53
54 static int exynos_drm_load(struct drm_device *dev, unsigned long flags)
55 {
56         struct exynos_drm_private *private;
57         int ret;
58         int nr;
59
60         private = kzalloc(sizeof(struct exynos_drm_private), GFP_KERNEL);
61         if (!private)
62                 return -ENOMEM;
63
64         INIT_LIST_HEAD(&private->pageflip_event_list);
65         dev_set_drvdata(dev->dev, dev);
66         dev->dev_private = (void *)private;
67
68         /*
69          * create mapping to manage iommu table and set a pointer to iommu
70          * mapping structure to iommu_mapping of private data.
71          * also this iommu_mapping can be used to check if iommu is supported
72          * or not.
73          */
74         ret = drm_create_iommu_mapping(dev);
75         if (ret < 0) {
76                 DRM_ERROR("failed to create iommu mapping.\n");
77                 goto err_free_private;
78         }
79
80         drm_mode_config_init(dev);
81
82         exynos_drm_mode_config_init(dev);
83
84         for (nr = 0; nr < MAX_PLANE; nr++) {
85                 struct drm_plane *plane;
86                 unsigned long possible_crtcs = (1 << MAX_CRTC) - 1;
87
88                 plane = exynos_plane_init(dev, possible_crtcs,
89                                           DRM_PLANE_TYPE_OVERLAY);
90                 if (!IS_ERR(plane))
91                         continue;
92
93                 ret = PTR_ERR(plane);
94                 goto err_mode_config_cleanup;
95         }
96
97         /* init kms poll for handling hpd */
98         drm_kms_helper_poll_init(dev);
99
100         /* setup possible_clones. */
101         exynos_drm_encoder_setup(dev);
102
103         platform_set_drvdata(dev->platformdev, dev);
104
105         /* Try to bind all sub drivers. */
106         ret = component_bind_all(dev->dev, dev);
107         if (ret)
108                 goto err_mode_config_cleanup;
109
110         ret = drm_vblank_init(dev, dev->mode_config.num_crtc);
111         if (ret)
112                 goto err_unbind_all;
113
114         /* Probe non kms sub drivers and virtual display driver. */
115         ret = exynos_drm_device_subdrv_probe(dev);
116         if (ret)
117                 goto err_cleanup_vblank;
118
119         /* force connectors detection */
120         drm_helper_hpd_irq_event(dev);
121
122         /*
123          * enable drm irq mode.
124          * - with irq_enabled = true, we can use the vblank feature.
125          *
126          * P.S. note that we wouldn't use drm irq handler but
127          *      just specific driver own one instead because
128          *      drm framework supports only one irq handler.
129          */
130         dev->irq_enabled = true;
131
132         /*
133          * with vblank_disable_allowed = true, vblank interrupt will be disabled
134          * by drm timer once a current process gives up ownership of
135          * vblank event.(after drm_vblank_put function is called)
136          */
137         dev->vblank_disable_allowed = true;
138
139         return 0;
140
141 err_cleanup_vblank:
142         drm_vblank_cleanup(dev);
143 err_unbind_all:
144         component_unbind_all(dev->dev, dev);
145 err_mode_config_cleanup:
146         drm_mode_config_cleanup(dev);
147         drm_release_iommu_mapping(dev);
148 err_free_private:
149         kfree(private);
150
151         return ret;
152 }
153
154 static int exynos_drm_unload(struct drm_device *dev)
155 {
156         exynos_drm_device_subdrv_remove(dev);
157
158         exynos_drm_fbdev_fini(dev);
159         drm_kms_helper_poll_fini(dev);
160
161         drm_vblank_cleanup(dev);
162         component_unbind_all(dev->dev, dev);
163         drm_mode_config_cleanup(dev);
164         drm_release_iommu_mapping(dev);
165
166         kfree(dev->dev_private);
167         dev->dev_private = NULL;
168
169         return 0;
170 }
171
172 static int exynos_drm_suspend(struct drm_device *dev, pm_message_t state)
173 {
174         struct drm_connector *connector;
175
176         drm_modeset_lock_all(dev);
177         list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
178                 int old_dpms = connector->dpms;
179
180                 if (connector->funcs->dpms)
181                         connector->funcs->dpms(connector, DRM_MODE_DPMS_OFF);
182
183                 /* Set the old mode back to the connector for resume */
184                 connector->dpms = old_dpms;
185         }
186         drm_modeset_unlock_all(dev);
187
188         return 0;
189 }
190
191 static int exynos_drm_resume(struct drm_device *dev)
192 {
193         struct drm_connector *connector;
194
195         drm_modeset_lock_all(dev);
196         list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
197                 if (connector->funcs->dpms)
198                         connector->funcs->dpms(connector, connector->dpms);
199         }
200         drm_modeset_unlock_all(dev);
201
202         drm_helper_resume_force_mode(dev);
203
204         return 0;
205 }
206
207 static int exynos_drm_open(struct drm_device *dev, struct drm_file *file)
208 {
209         struct drm_exynos_file_private *file_priv;
210         int ret;
211
212         file_priv = kzalloc(sizeof(*file_priv), GFP_KERNEL);
213         if (!file_priv)
214                 return -ENOMEM;
215
216         file->driver_priv = file_priv;
217
218         ret = exynos_drm_subdrv_open(dev, file);
219         if (ret)
220                 goto err_file_priv_free;
221
222         return ret;
223
224 err_file_priv_free:
225         kfree(file_priv);
226         file->driver_priv = NULL;
227         return ret;
228 }
229
230 static void exynos_drm_preclose(struct drm_device *dev,
231                                         struct drm_file *file)
232 {
233         exynos_drm_subdrv_close(dev, file);
234 }
235
236 static void exynos_drm_postclose(struct drm_device *dev, struct drm_file *file)
237 {
238         struct exynos_drm_private *private = dev->dev_private;
239         struct drm_pending_vblank_event *v, *vt;
240         struct drm_pending_event *e, *et;
241         unsigned long flags;
242
243         if (!file->driver_priv)
244                 return;
245
246         /* Release all events not unhandled by page flip handler. */
247         spin_lock_irqsave(&dev->event_lock, flags);
248         list_for_each_entry_safe(v, vt, &private->pageflip_event_list,
249                         base.link) {
250                 if (v->base.file_priv == file) {
251                         list_del(&v->base.link);
252                         drm_vblank_put(dev, v->pipe);
253                         v->base.destroy(&v->base);
254                 }
255         }
256
257         /* Release all events handled by page flip handler but not freed. */
258         list_for_each_entry_safe(e, et, &file->event_list, link) {
259                 list_del(&e->link);
260                 e->destroy(e);
261         }
262         spin_unlock_irqrestore(&dev->event_lock, flags);
263
264         kfree(file->driver_priv);
265         file->driver_priv = NULL;
266 }
267
268 static void exynos_drm_lastclose(struct drm_device *dev)
269 {
270         exynos_drm_fbdev_restore_mode(dev);
271 }
272
273 static const struct vm_operations_struct exynos_drm_gem_vm_ops = {
274         .fault = exynos_drm_gem_fault,
275         .open = drm_gem_vm_open,
276         .close = drm_gem_vm_close,
277 };
278
279 static const struct drm_ioctl_desc exynos_ioctls[] = {
280         DRM_IOCTL_DEF_DRV(EXYNOS_GEM_CREATE, exynos_drm_gem_create_ioctl,
281                         DRM_UNLOCKED | DRM_AUTH),
282         DRM_IOCTL_DEF_DRV(EXYNOS_GEM_GET,
283                         exynos_drm_gem_get_ioctl, DRM_UNLOCKED),
284         DRM_IOCTL_DEF_DRV(EXYNOS_VIDI_CONNECTION,
285                         vidi_connection_ioctl, DRM_UNLOCKED | DRM_AUTH),
286         DRM_IOCTL_DEF_DRV(EXYNOS_G2D_GET_VER,
287                         exynos_g2d_get_ver_ioctl, DRM_UNLOCKED | DRM_AUTH),
288         DRM_IOCTL_DEF_DRV(EXYNOS_G2D_SET_CMDLIST,
289                         exynos_g2d_set_cmdlist_ioctl, DRM_UNLOCKED | DRM_AUTH),
290         DRM_IOCTL_DEF_DRV(EXYNOS_G2D_EXEC,
291                         exynos_g2d_exec_ioctl, DRM_UNLOCKED | DRM_AUTH),
292         DRM_IOCTL_DEF_DRV(EXYNOS_IPP_GET_PROPERTY,
293                         exynos_drm_ipp_get_property, DRM_UNLOCKED | DRM_AUTH),
294         DRM_IOCTL_DEF_DRV(EXYNOS_IPP_SET_PROPERTY,
295                         exynos_drm_ipp_set_property, DRM_UNLOCKED | DRM_AUTH),
296         DRM_IOCTL_DEF_DRV(EXYNOS_IPP_QUEUE_BUF,
297                         exynos_drm_ipp_queue_buf, DRM_UNLOCKED | DRM_AUTH),
298         DRM_IOCTL_DEF_DRV(EXYNOS_IPP_CMD_CTRL,
299                         exynos_drm_ipp_cmd_ctrl, DRM_UNLOCKED | DRM_AUTH),
300 };
301
302 static const struct file_operations exynos_drm_driver_fops = {
303         .owner          = THIS_MODULE,
304         .open           = drm_open,
305         .mmap           = exynos_drm_gem_mmap,
306         .poll           = drm_poll,
307         .read           = drm_read,
308         .unlocked_ioctl = drm_ioctl,
309 #ifdef CONFIG_COMPAT
310         .compat_ioctl = drm_compat_ioctl,
311 #endif
312         .release        = drm_release,
313 };
314
315 static struct drm_driver exynos_drm_driver = {
316         .driver_features        = DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME,
317         .load                   = exynos_drm_load,
318         .unload                 = exynos_drm_unload,
319         .suspend                = exynos_drm_suspend,
320         .resume                 = exynos_drm_resume,
321         .open                   = exynos_drm_open,
322         .preclose               = exynos_drm_preclose,
323         .lastclose              = exynos_drm_lastclose,
324         .postclose              = exynos_drm_postclose,
325         .set_busid              = drm_platform_set_busid,
326         .get_vblank_counter     = drm_vblank_count,
327         .enable_vblank          = exynos_drm_crtc_enable_vblank,
328         .disable_vblank         = exynos_drm_crtc_disable_vblank,
329         .gem_free_object        = exynos_drm_gem_free_object,
330         .gem_vm_ops             = &exynos_drm_gem_vm_ops,
331         .dumb_create            = exynos_drm_gem_dumb_create,
332         .dumb_map_offset        = exynos_drm_gem_dumb_map_offset,
333         .dumb_destroy           = drm_gem_dumb_destroy,
334         .prime_handle_to_fd     = drm_gem_prime_handle_to_fd,
335         .prime_fd_to_handle     = drm_gem_prime_fd_to_handle,
336         .gem_prime_export       = exynos_dmabuf_prime_export,
337         .gem_prime_import       = exynos_dmabuf_prime_import,
338         .ioctls                 = exynos_ioctls,
339         .num_ioctls             = ARRAY_SIZE(exynos_ioctls),
340         .fops                   = &exynos_drm_driver_fops,
341         .name   = DRIVER_NAME,
342         .desc   = DRIVER_DESC,
343         .date   = DRIVER_DATE,
344         .major  = DRIVER_MAJOR,
345         .minor  = DRIVER_MINOR,
346 };
347
348 #ifdef CONFIG_PM_SLEEP
349 static int exynos_drm_sys_suspend(struct device *dev)
350 {
351         struct drm_device *drm_dev = dev_get_drvdata(dev);
352         pm_message_t message;
353
354         if (pm_runtime_suspended(dev) || !drm_dev)
355                 return 0;
356
357         message.event = PM_EVENT_SUSPEND;
358         return exynos_drm_suspend(drm_dev, message);
359 }
360
361 static int exynos_drm_sys_resume(struct device *dev)
362 {
363         struct drm_device *drm_dev = dev_get_drvdata(dev);
364
365         if (pm_runtime_suspended(dev) || !drm_dev)
366                 return 0;
367
368         return exynos_drm_resume(drm_dev);
369 }
370 #endif
371
372 static const struct dev_pm_ops exynos_drm_pm_ops = {
373         SET_SYSTEM_SLEEP_PM_OPS(exynos_drm_sys_suspend, exynos_drm_sys_resume)
374 };
375
376 int exynos_drm_component_add(struct device *dev,
377                                 enum exynos_drm_device_type dev_type,
378                                 enum exynos_drm_output_type out_type)
379 {
380         struct component_dev *cdev;
381
382         if (dev_type != EXYNOS_DEVICE_TYPE_CRTC &&
383                         dev_type != EXYNOS_DEVICE_TYPE_CONNECTOR) {
384                 DRM_ERROR("invalid device type.\n");
385                 return -EINVAL;
386         }
387
388         mutex_lock(&drm_component_lock);
389
390         /*
391          * Make sure to check if there is a component which has two device
392          * objects, for connector and for encoder/connector.
393          * It should make sure that crtc and encoder/connector drivers are
394          * ready before exynos drm core binds them.
395          */
396         list_for_each_entry(cdev, &drm_component_list, list) {
397                 if (cdev->out_type == out_type) {
398                         /*
399                          * If crtc and encoder/connector device objects are
400                          * added already just return.
401                          */
402                         if (cdev->dev_type_flag == (EXYNOS_DEVICE_TYPE_CRTC |
403                                                 EXYNOS_DEVICE_TYPE_CONNECTOR)) {
404                                 mutex_unlock(&drm_component_lock);
405                                 return 0;
406                         }
407
408                         if (dev_type == EXYNOS_DEVICE_TYPE_CRTC) {
409                                 cdev->crtc_dev = dev;
410                                 cdev->dev_type_flag |= dev_type;
411                         }
412
413                         if (dev_type == EXYNOS_DEVICE_TYPE_CONNECTOR) {
414                                 cdev->conn_dev = dev;
415                                 cdev->dev_type_flag |= dev_type;
416                         }
417
418                         mutex_unlock(&drm_component_lock);
419                         return 0;
420                 }
421         }
422
423         mutex_unlock(&drm_component_lock);
424
425         cdev = kzalloc(sizeof(*cdev), GFP_KERNEL);
426         if (!cdev)
427                 return -ENOMEM;
428
429         if (dev_type == EXYNOS_DEVICE_TYPE_CRTC)
430                 cdev->crtc_dev = dev;
431         if (dev_type == EXYNOS_DEVICE_TYPE_CONNECTOR)
432                 cdev->conn_dev = dev;
433
434         cdev->out_type = out_type;
435         cdev->dev_type_flag = dev_type;
436
437         mutex_lock(&drm_component_lock);
438         list_add_tail(&cdev->list, &drm_component_list);
439         mutex_unlock(&drm_component_lock);
440
441         return 0;
442 }
443
444 void exynos_drm_component_del(struct device *dev,
445                                 enum exynos_drm_device_type dev_type)
446 {
447         struct component_dev *cdev, *next;
448
449         mutex_lock(&drm_component_lock);
450
451         list_for_each_entry_safe(cdev, next, &drm_component_list, list) {
452                 if (dev_type == EXYNOS_DEVICE_TYPE_CRTC) {
453                         if (cdev->crtc_dev == dev) {
454                                 cdev->crtc_dev = NULL;
455                                 cdev->dev_type_flag &= ~dev_type;
456                         }
457                 }
458
459                 if (dev_type == EXYNOS_DEVICE_TYPE_CONNECTOR) {
460                         if (cdev->conn_dev == dev) {
461                                 cdev->conn_dev = NULL;
462                                 cdev->dev_type_flag &= ~dev_type;
463                         }
464                 }
465
466                 /*
467                  * Release cdev object only in case that both of crtc and
468                  * encoder/connector device objects are NULL.
469                  */
470                 if (!cdev->crtc_dev && !cdev->conn_dev) {
471                         list_del(&cdev->list);
472                         kfree(cdev);
473                 }
474
475                 break;
476         }
477
478         mutex_unlock(&drm_component_lock);
479 }
480
481 static int compare_dev(struct device *dev, void *data)
482 {
483         return dev == (struct device *)data;
484 }
485
486 static struct component_match *exynos_drm_match_add(struct device *dev)
487 {
488         struct component_match *match = NULL;
489         struct component_dev *cdev;
490         unsigned int attach_cnt = 0;
491
492         mutex_lock(&drm_component_lock);
493
494         list_for_each_entry(cdev, &drm_component_list, list) {
495                 /*
496                  * Add components to master only in case that crtc and
497                  * encoder/connector device objects exist.
498                  */
499                 if (!cdev->crtc_dev || !cdev->conn_dev)
500                         continue;
501
502                 attach_cnt++;
503
504                 mutex_unlock(&drm_component_lock);
505
506                 /*
507                  * fimd and dpi modules have same device object so add
508                  * only crtc device object in this case.
509                  */
510                 if (cdev->crtc_dev == cdev->conn_dev) {
511                         component_match_add(dev, &match, compare_dev,
512                                                 cdev->crtc_dev);
513                         goto out_lock;
514                 }
515
516                 /*
517                  * Do not chage below call order.
518                  * crtc device first should be added to master because
519                  * connector/encoder need pipe number of crtc when they
520                  * are created.
521                  */
522                 component_match_add(dev, &match, compare_dev, cdev->crtc_dev);
523                 component_match_add(dev, &match, compare_dev, cdev->conn_dev);
524
525 out_lock:
526                 mutex_lock(&drm_component_lock);
527         }
528
529         mutex_unlock(&drm_component_lock);
530
531         return attach_cnt ? match : ERR_PTR(-EPROBE_DEFER);
532 }
533
534 static int exynos_drm_bind(struct device *dev)
535 {
536         return drm_platform_init(&exynos_drm_driver, to_platform_device(dev));
537 }
538
539 static void exynos_drm_unbind(struct device *dev)
540 {
541         drm_put_dev(dev_get_drvdata(dev));
542 }
543
544 static const struct component_master_ops exynos_drm_ops = {
545         .bind           = exynos_drm_bind,
546         .unbind         = exynos_drm_unbind,
547 };
548
549 static int exynos_drm_platform_probe(struct platform_device *pdev)
550 {
551         struct component_match *match;
552         int ret;
553
554         pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
555         exynos_drm_driver.num_ioctls = ARRAY_SIZE(exynos_ioctls);
556
557 #ifdef CONFIG_DRM_EXYNOS_FIMD
558         ret = platform_driver_register(&fimd_driver);
559         if (ret < 0)
560                 return ret;
561 #endif
562
563 #ifdef CONFIG_DRM_EXYNOS_DP
564         ret = platform_driver_register(&dp_driver);
565         if (ret < 0)
566                 goto err_unregister_fimd_drv;
567 #endif
568
569 #ifdef CONFIG_DRM_EXYNOS_DSI
570         ret = platform_driver_register(&dsi_driver);
571         if (ret < 0)
572                 goto err_unregister_dp_drv;
573 #endif
574
575 #ifdef CONFIG_DRM_EXYNOS_HDMI
576         ret = platform_driver_register(&mixer_driver);
577         if (ret < 0)
578                 goto err_unregister_dsi_drv;
579         ret = platform_driver_register(&hdmi_driver);
580         if (ret < 0)
581                 goto err_unregister_mixer_drv;
582 #endif
583
584 #ifdef CONFIG_DRM_EXYNOS_G2D
585         ret = platform_driver_register(&g2d_driver);
586         if (ret < 0)
587                 goto err_unregister_hdmi_drv;
588 #endif
589
590 #ifdef CONFIG_DRM_EXYNOS_FIMC
591         ret = platform_driver_register(&fimc_driver);
592         if (ret < 0)
593                 goto err_unregister_g2d_drv;
594 #endif
595
596 #ifdef CONFIG_DRM_EXYNOS_ROTATOR
597         ret = platform_driver_register(&rotator_driver);
598         if (ret < 0)
599                 goto err_unregister_fimc_drv;
600 #endif
601
602 #ifdef CONFIG_DRM_EXYNOS_GSC
603         ret = platform_driver_register(&gsc_driver);
604         if (ret < 0)
605                 goto err_unregister_rotator_drv;
606 #endif
607
608 #ifdef CONFIG_DRM_EXYNOS_IPP
609         ret = platform_driver_register(&ipp_driver);
610         if (ret < 0)
611                 goto err_unregister_gsc_drv;
612
613         ret = exynos_platform_device_ipp_register();
614         if (ret < 0)
615                 goto err_unregister_ipp_drv;
616 #endif
617
618         match = exynos_drm_match_add(&pdev->dev);
619         if (IS_ERR(match)) {
620                 ret = PTR_ERR(match);
621                 goto err_unregister_resources;
622         }
623
624         ret = component_master_add_with_match(&pdev->dev, &exynos_drm_ops,
625                                                 match);
626         if (ret < 0)
627                 goto err_unregister_resources;
628
629         return ret;
630
631 err_unregister_resources:
632
633 #ifdef CONFIG_DRM_EXYNOS_IPP
634         exynos_platform_device_ipp_unregister();
635 err_unregister_ipp_drv:
636         platform_driver_unregister(&ipp_driver);
637 err_unregister_gsc_drv:
638 #endif
639
640 #ifdef CONFIG_DRM_EXYNOS_GSC
641         platform_driver_unregister(&gsc_driver);
642 err_unregister_rotator_drv:
643 #endif
644
645 #ifdef CONFIG_DRM_EXYNOS_ROTATOR
646         platform_driver_unregister(&rotator_driver);
647 err_unregister_fimc_drv:
648 #endif
649
650 #ifdef CONFIG_DRM_EXYNOS_FIMC
651         platform_driver_unregister(&fimc_driver);
652 err_unregister_g2d_drv:
653 #endif
654
655 #ifdef CONFIG_DRM_EXYNOS_G2D
656         platform_driver_unregister(&g2d_driver);
657 err_unregister_hdmi_drv:
658 #endif
659
660 #ifdef CONFIG_DRM_EXYNOS_HDMI
661         platform_driver_unregister(&hdmi_driver);
662 err_unregister_mixer_drv:
663         platform_driver_unregister(&mixer_driver);
664 err_unregister_dsi_drv:
665 #endif
666
667 #ifdef CONFIG_DRM_EXYNOS_DSI
668         platform_driver_unregister(&dsi_driver);
669 err_unregister_dp_drv:
670 #endif
671
672 #ifdef CONFIG_DRM_EXYNOS_DP
673         platform_driver_unregister(&dp_driver);
674 err_unregister_fimd_drv:
675 #endif
676
677 #ifdef CONFIG_DRM_EXYNOS_FIMD
678         platform_driver_unregister(&fimd_driver);
679 #endif
680         return ret;
681 }
682
683 static int exynos_drm_platform_remove(struct platform_device *pdev)
684 {
685 #ifdef CONFIG_DRM_EXYNOS_IPP
686         exynos_platform_device_ipp_unregister();
687         platform_driver_unregister(&ipp_driver);
688 #endif
689
690 #ifdef CONFIG_DRM_EXYNOS_GSC
691         platform_driver_unregister(&gsc_driver);
692 #endif
693
694 #ifdef CONFIG_DRM_EXYNOS_ROTATOR
695         platform_driver_unregister(&rotator_driver);
696 #endif
697
698 #ifdef CONFIG_DRM_EXYNOS_FIMC
699         platform_driver_unregister(&fimc_driver);
700 #endif
701
702 #ifdef CONFIG_DRM_EXYNOS_G2D
703         platform_driver_unregister(&g2d_driver);
704 #endif
705
706 #ifdef CONFIG_DRM_EXYNOS_HDMI
707         platform_driver_unregister(&mixer_driver);
708         platform_driver_unregister(&hdmi_driver);
709 #endif
710
711 #ifdef CONFIG_DRM_EXYNOS_FIMD
712         platform_driver_unregister(&fimd_driver);
713 #endif
714
715 #ifdef CONFIG_DRM_EXYNOS_DSI
716         platform_driver_unregister(&dsi_driver);
717 #endif
718
719 #ifdef CONFIG_DRM_EXYNOS_DP
720         platform_driver_unregister(&dp_driver);
721 #endif
722         component_master_del(&pdev->dev, &exynos_drm_ops);
723         return 0;
724 }
725
726 static struct platform_driver exynos_drm_platform_driver = {
727         .probe  = exynos_drm_platform_probe,
728         .remove = exynos_drm_platform_remove,
729         .driver = {
730                 .owner  = THIS_MODULE,
731                 .name   = "exynos-drm",
732                 .pm     = &exynos_drm_pm_ops,
733         },
734 };
735
736 static int exynos_drm_init(void)
737 {
738         int ret;
739
740         exynos_drm_pdev = platform_device_register_simple("exynos-drm", -1,
741                                                                 NULL, 0);
742         if (IS_ERR(exynos_drm_pdev))
743                 return PTR_ERR(exynos_drm_pdev);
744
745 #ifdef CONFIG_DRM_EXYNOS_VIDI
746         ret = exynos_drm_probe_vidi();
747         if (ret < 0)
748                 goto err_unregister_pd;
749 #endif
750
751         ret = platform_driver_register(&exynos_drm_platform_driver);
752         if (ret)
753                 goto err_remove_vidi;
754
755         return 0;
756
757 err_remove_vidi:
758 #ifdef CONFIG_DRM_EXYNOS_VIDI
759         exynos_drm_remove_vidi();
760
761 err_unregister_pd:
762 #endif
763         platform_device_unregister(exynos_drm_pdev);
764
765         return ret;
766 }
767
768 static void exynos_drm_exit(void)
769 {
770         platform_driver_unregister(&exynos_drm_platform_driver);
771 #ifdef CONFIG_DRM_EXYNOS_VIDI
772         exynos_drm_remove_vidi();
773 #endif
774         platform_device_unregister(exynos_drm_pdev);
775 }
776
777 module_init(exynos_drm_init);
778 module_exit(exynos_drm_exit);
779
780 MODULE_AUTHOR("Inki Dae <inki.dae@samsung.com>");
781 MODULE_AUTHOR("Joonyoung Shim <jy0922.shim@samsung.com>");
782 MODULE_AUTHOR("Seung-Woo Kim <sw0312.kim@samsung.com>");
783 MODULE_DESCRIPTION("Samsung SoC DRM Driver");
784 MODULE_LICENSE("GPL");