1 /*
2  * Copyright (C) 2017 Icenowy Zheng <icenowy@aosc.io>
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License as
6  * published by the Free Software Foundation; either version 2 of
7  * the License, or (at your option) any later version.
8  */
9 
10 #ifndef _SUNXI_ENGINE_H_
11 #define _SUNXI_ENGINE_H_
12 
13 struct drm_plane;
14 struct drm_device;
15 
16 struct sunxi_engine;
17 
18 struct sunxi_engine_ops {
19 	void (*commit)(struct sunxi_engine *engine);
20 	struct drm_plane **(*layers_init)(struct drm_device *drm,
21 					  struct sunxi_engine *engine);
22 
23 	void (*apply_color_correction)(struct sunxi_engine *engine);
24 	void (*disable_color_correction)(struct sunxi_engine *engine);
25 };
26 
27 /**
28  * struct sunxi_engine - the common parts of an engine for sun4i-drm driver
29  * @ops:	the operations of the engine
30  * @node:	the of device node of the engine
31  * @regs:	the regmap of the engine
32  * @id:		the id of the engine (-1 if not used)
33  */
34 struct sunxi_engine {
35 	const struct sunxi_engine_ops	*ops;
36 
37 	struct device_node		*node;
38 	struct regmap			*regs;
39 
40 	int id;
41 
42 	/* Engine list management */
43 	struct list_head		list;
44 };
45 
46 /**
47  * sunxi_engine_commit() - commit all changes of the engine
48  * @engine:	pointer to the engine
49  */
50 static inline void
51 sunxi_engine_commit(struct sunxi_engine *engine)
52 {
53 	if (engine->ops && engine->ops->commit)
54 		engine->ops->commit(engine);
55 }
56 
57 /**
58  * sunxi_engine_layers_init() - Create planes (layers) for the engine
59  * @drm:	pointer to the drm_device for which planes will be created
60  * @engine:	pointer to the engine
61  */
62 static inline struct drm_plane **
63 sunxi_engine_layers_init(struct drm_device *drm, struct sunxi_engine *engine)
64 {
65 	if (engine->ops && engine->ops->layers_init)
66 		return engine->ops->layers_init(drm, engine);
67 	return ERR_PTR(-ENOSYS);
68 }
69 
70 /**
71  * sunxi_engine_apply_color_correction - Apply the RGB2YUV color correction
72  * @engine:	pointer to the engine
73  *
74  * This functionality is optional for an engine, however, if the engine is
75  * intended to be used with TV Encoder, the output will be incorrect
76  * without the color correction, due to TV Encoder expects the engine to
77  * output directly YUV signal.
78  */
79 static inline void
80 sunxi_engine_apply_color_correction(struct sunxi_engine *engine)
81 {
82 	if (engine->ops && engine->ops->apply_color_correction)
83 		engine->ops->apply_color_correction(engine);
84 }
85 
86 /**
87  * sunxi_engine_disable_color_correction - Disable the color space correction
88  * @engine:	pointer to the engine
89  *
90  * This function is paired with apply_color_correction().
91  */
92 static inline void
93 sunxi_engine_disable_color_correction(struct sunxi_engine *engine)
94 {
95 	if (engine->ops && engine->ops->disable_color_correction)
96 		engine->ops->disable_color_correction(engine);
97 }
98 #endif /* _SUNXI_ENGINE_H_ */
99