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