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