Merge tag 'omap-for-v4.7-dts-fixes1' of git://git.kernel.org/pub/scm/linux/kernel...
[cascardo/linux.git] / drivers / gpu / drm / mediatek / mtk_drm_ddp_comp.h
1 /*
2  * Copyright (c) 2015 MediaTek Inc.
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  * GNU General Public License for more details.
12  */
13
14 #ifndef MTK_DRM_DDP_COMP_H
15 #define MTK_DRM_DDP_COMP_H
16
17 #include <linux/io.h>
18
19 struct device;
20 struct device_node;
21 struct drm_crtc;
22 struct drm_device;
23 struct mtk_plane_state;
24
25 enum mtk_ddp_comp_type {
26         MTK_DISP_OVL,
27         MTK_DISP_RDMA,
28         MTK_DISP_WDMA,
29         MTK_DISP_COLOR,
30         MTK_DISP_AAL,
31         MTK_DISP_GAMMA,
32         MTK_DISP_UFOE,
33         MTK_DSI,
34         MTK_DPI,
35         MTK_DISP_PWM,
36         MTK_DISP_MUTEX,
37         MTK_DISP_OD,
38         MTK_DDP_COMP_TYPE_MAX,
39 };
40
41 enum mtk_ddp_comp_id {
42         DDP_COMPONENT_AAL,
43         DDP_COMPONENT_COLOR0,
44         DDP_COMPONENT_COLOR1,
45         DDP_COMPONENT_DPI0,
46         DDP_COMPONENT_DSI0,
47         DDP_COMPONENT_DSI1,
48         DDP_COMPONENT_GAMMA,
49         DDP_COMPONENT_OD,
50         DDP_COMPONENT_OVL0,
51         DDP_COMPONENT_OVL1,
52         DDP_COMPONENT_PWM0,
53         DDP_COMPONENT_PWM1,
54         DDP_COMPONENT_RDMA0,
55         DDP_COMPONENT_RDMA1,
56         DDP_COMPONENT_RDMA2,
57         DDP_COMPONENT_UFOE,
58         DDP_COMPONENT_WDMA0,
59         DDP_COMPONENT_WDMA1,
60         DDP_COMPONENT_ID_MAX,
61 };
62
63 struct mtk_ddp_comp;
64
65 struct mtk_ddp_comp_funcs {
66         void (*config)(struct mtk_ddp_comp *comp, unsigned int w,
67                        unsigned int h, unsigned int vrefresh);
68         void (*start)(struct mtk_ddp_comp *comp);
69         void (*stop)(struct mtk_ddp_comp *comp);
70         void (*enable_vblank)(struct mtk_ddp_comp *comp, struct drm_crtc *crtc);
71         void (*disable_vblank)(struct mtk_ddp_comp *comp);
72         void (*layer_on)(struct mtk_ddp_comp *comp, unsigned int idx);
73         void (*layer_off)(struct mtk_ddp_comp *comp, unsigned int idx);
74         void (*layer_config)(struct mtk_ddp_comp *comp, unsigned int idx,
75                              struct mtk_plane_state *state);
76 };
77
78 struct mtk_ddp_comp {
79         struct clk *clk;
80         void __iomem *regs;
81         int irq;
82         struct device *larb_dev;
83         enum mtk_ddp_comp_id id;
84         const struct mtk_ddp_comp_funcs *funcs;
85 };
86
87 static inline void mtk_ddp_comp_config(struct mtk_ddp_comp *comp,
88                                        unsigned int w, unsigned int h,
89                                        unsigned int vrefresh)
90 {
91         if (comp->funcs && comp->funcs->config)
92                 comp->funcs->config(comp, w, h, vrefresh);
93 }
94
95 static inline void mtk_ddp_comp_start(struct mtk_ddp_comp *comp)
96 {
97         if (comp->funcs && comp->funcs->start)
98                 comp->funcs->start(comp);
99 }
100
101 static inline void mtk_ddp_comp_stop(struct mtk_ddp_comp *comp)
102 {
103         if (comp->funcs && comp->funcs->stop)
104                 comp->funcs->stop(comp);
105 }
106
107 static inline void mtk_ddp_comp_enable_vblank(struct mtk_ddp_comp *comp,
108                                               struct drm_crtc *crtc)
109 {
110         if (comp->funcs && comp->funcs->enable_vblank)
111                 comp->funcs->enable_vblank(comp, crtc);
112 }
113
114 static inline void mtk_ddp_comp_disable_vblank(struct mtk_ddp_comp *comp)
115 {
116         if (comp->funcs && comp->funcs->disable_vblank)
117                 comp->funcs->disable_vblank(comp);
118 }
119
120 static inline void mtk_ddp_comp_layer_on(struct mtk_ddp_comp *comp,
121                                          unsigned int idx)
122 {
123         if (comp->funcs && comp->funcs->layer_on)
124                 comp->funcs->layer_on(comp, idx);
125 }
126
127 static inline void mtk_ddp_comp_layer_off(struct mtk_ddp_comp *comp,
128                                           unsigned int idx)
129 {
130         if (comp->funcs && comp->funcs->layer_off)
131                 comp->funcs->layer_off(comp, idx);
132 }
133
134 static inline void mtk_ddp_comp_layer_config(struct mtk_ddp_comp *comp,
135                                              unsigned int idx,
136                                              struct mtk_plane_state *state)
137 {
138         if (comp->funcs && comp->funcs->layer_config)
139                 comp->funcs->layer_config(comp, idx, state);
140 }
141
142 int mtk_ddp_comp_get_id(struct device_node *node,
143                         enum mtk_ddp_comp_type comp_type);
144 int mtk_ddp_comp_init(struct device *dev, struct device_node *comp_node,
145                       struct mtk_ddp_comp *comp, enum mtk_ddp_comp_id comp_id,
146                       const struct mtk_ddp_comp_funcs *funcs);
147 int mtk_ddp_comp_register(struct drm_device *drm, struct mtk_ddp_comp *comp);
148 void mtk_ddp_comp_unregister(struct drm_device *drm, struct mtk_ddp_comp *comp);
149
150 #endif /* MTK_DRM_DDP_COMP_H */