Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wirel...
[firefly-linux-kernel-4.4.55.git] / drivers / gpu / drm / tegra / drm.c
1 /*
2  * Copyright (C) 2012 Avionic Design GmbH
3  * Copyright (C) 2012 NVIDIA CORPORATION.  All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation.
8  */
9
10 #include <linux/module.h>
11 #include <linux/of_address.h>
12 #include <linux/of_platform.h>
13
14 #include <mach/clk.h>
15 #include <linux/dma-mapping.h>
16 #include <asm/dma-iommu.h>
17
18 #include "drm.h"
19
20 #define DRIVER_NAME "tegra"
21 #define DRIVER_DESC "NVIDIA Tegra graphics"
22 #define DRIVER_DATE "20120330"
23 #define DRIVER_MAJOR 0
24 #define DRIVER_MINOR 0
25 #define DRIVER_PATCHLEVEL 0
26
27 static int tegra_drm_load(struct drm_device *drm, unsigned long flags)
28 {
29         struct device *dev = drm->dev;
30         struct host1x *host1x;
31         int err;
32
33         host1x = dev_get_drvdata(dev);
34         drm->dev_private = host1x;
35         host1x->drm = drm;
36
37         drm_mode_config_init(drm);
38
39         err = host1x_drm_init(host1x, drm);
40         if (err < 0)
41                 return err;
42
43         err = tegra_drm_fb_init(drm);
44         if (err < 0)
45                 return err;
46
47         drm_kms_helper_poll_init(drm);
48
49         return 0;
50 }
51
52 static int tegra_drm_unload(struct drm_device *drm)
53 {
54         drm_kms_helper_poll_fini(drm);
55         tegra_drm_fb_exit(drm);
56
57         drm_mode_config_cleanup(drm);
58
59         return 0;
60 }
61
62 static int tegra_drm_open(struct drm_device *drm, struct drm_file *filp)
63 {
64         return 0;
65 }
66
67 static void tegra_drm_lastclose(struct drm_device *drm)
68 {
69         struct host1x *host1x = drm->dev_private;
70
71         drm_fbdev_cma_restore_mode(host1x->fbdev);
72 }
73
74 static struct drm_ioctl_desc tegra_drm_ioctls[] = {
75 };
76
77 static const struct file_operations tegra_drm_fops = {
78         .owner = THIS_MODULE,
79         .open = drm_open,
80         .release = drm_release,
81         .unlocked_ioctl = drm_ioctl,
82         .mmap = drm_gem_cma_mmap,
83         .poll = drm_poll,
84         .fasync = drm_fasync,
85         .read = drm_read,
86 #ifdef CONFIG_COMPAT
87         .compat_ioctl = drm_compat_ioctl,
88 #endif
89         .llseek = noop_llseek,
90 };
91
92 struct drm_driver tegra_drm_driver = {
93         .driver_features = DRIVER_BUS_PLATFORM | DRIVER_MODESET | DRIVER_GEM,
94         .load = tegra_drm_load,
95         .unload = tegra_drm_unload,
96         .open = tegra_drm_open,
97         .lastclose = tegra_drm_lastclose,
98
99         .gem_free_object = drm_gem_cma_free_object,
100         .gem_vm_ops = &drm_gem_cma_vm_ops,
101         .dumb_create = drm_gem_cma_dumb_create,
102         .dumb_map_offset = drm_gem_cma_dumb_map_offset,
103         .dumb_destroy = drm_gem_cma_dumb_destroy,
104
105         .ioctls = tegra_drm_ioctls,
106         .num_ioctls = ARRAY_SIZE(tegra_drm_ioctls),
107         .fops = &tegra_drm_fops,
108
109         .name = DRIVER_NAME,
110         .desc = DRIVER_DESC,
111         .date = DRIVER_DATE,
112         .major = DRIVER_MAJOR,
113         .minor = DRIVER_MINOR,
114         .patchlevel = DRIVER_PATCHLEVEL,
115 };