ARM64: DTS: Add rk3399-firefly uart4 device, node as /dev/ttyS1
[firefly-linux-kernel-4.4.55.git] / drivers / video / rockchip / screen / rk_screen.c
1 #include <linux/module.h>
2 #include <linux/rk_fb.h>
3 #include <linux/device.h>
4 #include "lcd.h"
5 #include "../hdmi/rockchip-hdmi.h"
6
7 static struct rk_screen *rk_screen;
8
9 int rk_fb_get_extern_screen(struct rk_screen *screen)
10 {
11         if (unlikely(!rk_screen) || unlikely(!screen))
12                 return -1;
13
14         memcpy(screen, rk_screen, sizeof(struct rk_screen));
15         screen->dsp_lut = NULL;
16         screen->cabc_lut = NULL;
17         screen->type = SCREEN_NULL;
18
19         return 0;
20 }
21
22 int  rk_fb_get_prmry_screen(struct rk_screen *screen)
23 {
24         if (unlikely(!rk_screen) || unlikely(!screen))
25                 return -1;
26
27         memcpy(screen, rk_screen, sizeof(struct rk_screen));
28         return 0;
29 }
30
31 int rk_fb_set_prmry_screen(struct rk_screen *screen)
32 {
33         if (unlikely(!rk_screen) || unlikely(!screen))
34                 return -1;
35
36         rk_screen->lcdc_id = screen->lcdc_id;
37         rk_screen->screen_id = screen->screen_id;
38         rk_screen->x_mirror = screen->x_mirror;
39         rk_screen->y_mirror = screen->y_mirror;
40         rk_screen->overscan.left = screen->overscan.left;
41         rk_screen->overscan.top = screen->overscan.left;
42         rk_screen->overscan.right = screen->overscan.left;
43         rk_screen->overscan.bottom = screen->overscan.left;
44         return 0;
45 }
46
47 size_t get_fb_size(u8 reserved_fb)
48 {
49         size_t size = 0;
50         u32 xres = 0;
51         u32 yres = 0;
52
53         if (unlikely(!rk_screen))
54                 return 0;
55
56         xres = rk_screen->mode.xres;
57         yres = rk_screen->mode.yres;
58
59         /* align as 64 bytes(16*4) in an odd number of times */
60         xres = ALIGN_64BYTE_ODD_TIMES(xres, ALIGN_PIXEL_64BYTE_RGB8888);
61         if (reserved_fb == 1) {
62                 size = (xres * yres << 2) << 1;/*two buffer*/
63         } else {
64 #if defined(CONFIG_THREE_FB_BUFFER)
65                 size = (xres * yres << 2) * 3;  /* three buffer */
66 #else
67                 size = (xres * yres << 2) << 1; /* two buffer */
68 #endif
69         }
70         return ALIGN(size, SZ_1M);
71 }
72
73 static int rk_screen_probe(struct platform_device *pdev)
74 {
75         struct device_node *np = pdev->dev.of_node;
76         int ret;
77
78         if (!np) {
79                 dev_err(&pdev->dev, "Missing device tree node.\n");
80                 return -EINVAL;
81         }
82         rk_screen = devm_kzalloc(&pdev->dev,
83                         sizeof(struct rk_screen), GFP_KERNEL);
84         if (!rk_screen) {
85                 dev_err(&pdev->dev, "kmalloc for rk screen fail!");
86                 return  -ENOMEM;
87         }
88         ret = rk_fb_prase_timing_dt(np, rk_screen);
89         dev_info(&pdev->dev, "rockchip screen probe %s\n",
90                                 ret ? "failed" : "success");
91         return ret;
92 }
93
94 static const struct of_device_id rk_screen_dt_ids[] = {
95         { .compatible = "rockchip,screen", },
96         {}
97 };
98
99 static struct platform_driver rk_screen_driver = {
100         .probe          = rk_screen_probe,
101         .driver         = {
102                 .name   = "rk-screen",
103                 .owner  = THIS_MODULE,
104                 .of_match_table = of_match_ptr(rk_screen_dt_ids),
105         },
106 };
107
108 static int __init rk_screen_init(void)
109 {
110         return platform_driver_register(&rk_screen_driver);
111 }
112
113 static void __exit rk_screen_exit(void)
114 {
115         platform_driver_unregister(&rk_screen_driver);
116 }
117
118 fs_initcall(rk_screen_init);
119 module_exit(rk_screen_exit);
120