Linux Audio

Check our new training course

Loading...
Note: File does not exist in v4.6.
  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
 19struct device;
 20struct device_node;
 21struct drm_crtc;
 22struct drm_device;
 23struct mtk_plane_state;
 24struct drm_crtc_state;
 25
 26enum mtk_ddp_comp_type {
 27	MTK_DISP_OVL,
 28	MTK_DISP_RDMA,
 29	MTK_DISP_WDMA,
 30	MTK_DISP_COLOR,
 31	MTK_DISP_AAL,
 32	MTK_DISP_GAMMA,
 33	MTK_DISP_UFOE,
 34	MTK_DSI,
 35	MTK_DPI,
 36	MTK_DISP_PWM,
 37	MTK_DISP_MUTEX,
 38	MTK_DISP_OD,
 39	MTK_DISP_BLS,
 40	MTK_DDP_COMP_TYPE_MAX,
 41};
 42
 43enum mtk_ddp_comp_id {
 44	DDP_COMPONENT_AAL,
 45	DDP_COMPONENT_BLS,
 46	DDP_COMPONENT_COLOR0,
 47	DDP_COMPONENT_COLOR1,
 48	DDP_COMPONENT_DPI0,
 49	DDP_COMPONENT_DSI0,
 50	DDP_COMPONENT_DSI1,
 51	DDP_COMPONENT_GAMMA,
 52	DDP_COMPONENT_OD,
 53	DDP_COMPONENT_OVL0,
 54	DDP_COMPONENT_OVL1,
 55	DDP_COMPONENT_PWM0,
 56	DDP_COMPONENT_PWM1,
 57	DDP_COMPONENT_RDMA0,
 58	DDP_COMPONENT_RDMA1,
 59	DDP_COMPONENT_RDMA2,
 60	DDP_COMPONENT_UFOE,
 61	DDP_COMPONENT_WDMA0,
 62	DDP_COMPONENT_WDMA1,
 63	DDP_COMPONENT_ID_MAX,
 64};
 65
 66struct mtk_ddp_comp;
 67
 68struct mtk_ddp_comp_funcs {
 69	void (*config)(struct mtk_ddp_comp *comp, unsigned int w,
 70		       unsigned int h, unsigned int vrefresh, unsigned int bpc);
 71	void (*start)(struct mtk_ddp_comp *comp);
 72	void (*stop)(struct mtk_ddp_comp *comp);
 73	void (*enable_vblank)(struct mtk_ddp_comp *comp, struct drm_crtc *crtc);
 74	void (*disable_vblank)(struct mtk_ddp_comp *comp);
 75	void (*layer_on)(struct mtk_ddp_comp *comp, unsigned int idx);
 76	void (*layer_off)(struct mtk_ddp_comp *comp, unsigned int idx);
 77	void (*layer_config)(struct mtk_ddp_comp *comp, unsigned int idx,
 78			     struct mtk_plane_state *state);
 79	void (*gamma_set)(struct mtk_ddp_comp *comp,
 80			  struct drm_crtc_state *state);
 81};
 82
 83struct mtk_ddp_comp {
 84	struct clk *clk;
 85	void __iomem *regs;
 86	int irq;
 87	struct device *larb_dev;
 88	enum mtk_ddp_comp_id id;
 89	const struct mtk_ddp_comp_funcs *funcs;
 90};
 91
 92static inline void mtk_ddp_comp_config(struct mtk_ddp_comp *comp,
 93				       unsigned int w, unsigned int h,
 94				       unsigned int vrefresh, unsigned int bpc)
 95{
 96	if (comp->funcs && comp->funcs->config)
 97		comp->funcs->config(comp, w, h, vrefresh, bpc);
 98}
 99
100static inline void mtk_ddp_comp_start(struct mtk_ddp_comp *comp)
101{
102	if (comp->funcs && comp->funcs->start)
103		comp->funcs->start(comp);
104}
105
106static inline void mtk_ddp_comp_stop(struct mtk_ddp_comp *comp)
107{
108	if (comp->funcs && comp->funcs->stop)
109		comp->funcs->stop(comp);
110}
111
112static inline void mtk_ddp_comp_enable_vblank(struct mtk_ddp_comp *comp,
113					      struct drm_crtc *crtc)
114{
115	if (comp->funcs && comp->funcs->enable_vblank)
116		comp->funcs->enable_vblank(comp, crtc);
117}
118
119static inline void mtk_ddp_comp_disable_vblank(struct mtk_ddp_comp *comp)
120{
121	if (comp->funcs && comp->funcs->disable_vblank)
122		comp->funcs->disable_vblank(comp);
123}
124
125static inline void mtk_ddp_comp_layer_on(struct mtk_ddp_comp *comp,
126					 unsigned int idx)
127{
128	if (comp->funcs && comp->funcs->layer_on)
129		comp->funcs->layer_on(comp, idx);
130}
131
132static inline void mtk_ddp_comp_layer_off(struct mtk_ddp_comp *comp,
133					  unsigned int idx)
134{
135	if (comp->funcs && comp->funcs->layer_off)
136		comp->funcs->layer_off(comp, idx);
137}
138
139static inline void mtk_ddp_comp_layer_config(struct mtk_ddp_comp *comp,
140					     unsigned int idx,
141					     struct mtk_plane_state *state)
142{
143	if (comp->funcs && comp->funcs->layer_config)
144		comp->funcs->layer_config(comp, idx, state);
145}
146
147static inline void mtk_ddp_gamma_set(struct mtk_ddp_comp *comp,
148				     struct drm_crtc_state *state)
149{
150	if (comp->funcs && comp->funcs->gamma_set)
151		comp->funcs->gamma_set(comp, state);
152}
153
154int mtk_ddp_comp_get_id(struct device_node *node,
155			enum mtk_ddp_comp_type comp_type);
156int mtk_ddp_comp_init(struct device *dev, struct device_node *comp_node,
157		      struct mtk_ddp_comp *comp, enum mtk_ddp_comp_id comp_id,
158		      const struct mtk_ddp_comp_funcs *funcs);
159int mtk_ddp_comp_register(struct drm_device *drm, struct mtk_ddp_comp *comp);
160void mtk_ddp_comp_unregister(struct drm_device *drm, struct mtk_ddp_comp *comp);
161void mtk_dither_set(struct mtk_ddp_comp *comp, unsigned int bpc,
162		    unsigned int CFG);
163
164#endif /* MTK_DRM_DDP_COMP_H */