| /* | |
| * Copyright (C) 2017 Icenowy Zheng <icenowy@aosc.io> | |
| * | |
| * This program is free software; you can redistribute it and/or | |
| * modify it under the terms of the GNU General Public License as | |
| * published by the Free Software Foundation; either version 2 of | |
| * the License, or (at your option) any later version. | |
| */ | |
| #ifndef _SUNXI_ENGINE_H_ | |
| #define _SUNXI_ENGINE_H_ | |
| struct drm_plane; | |
| struct drm_device; | |
| struct sunxi_engine; | |
| struct sunxi_engine_ops { | |
| void (*commit)(struct sunxi_engine *engine); | |
| struct drm_plane **(*layers_init)(struct drm_device *drm, | |
| struct sunxi_engine *engine); | |
| void (*apply_color_correction)(struct sunxi_engine *engine); | |
| void (*disable_color_correction)(struct sunxi_engine *engine); | |
| }; | |
| /** | |
| * struct sunxi_engine - the common parts of an engine for sun4i-drm driver | |
| * @ops: the operations of the engine | |
| * @node: the of device node of the engine | |
| * @regs: the regmap of the engine | |
| * @id: the id of the engine (-1 if not used) | |
| */ | |
| struct sunxi_engine { | |
| const struct sunxi_engine_ops *ops; | |
| struct device_node *node; | |
| struct regmap *regs; | |
| int id; | |
| /* Engine list management */ | |
| struct list_head list; | |
| }; | |
| /** | |
| * sunxi_engine_commit() - commit all changes of the engine | |
| * @engine: pointer to the engine | |
| */ | |
| static inline void | |
| sunxi_engine_commit(struct sunxi_engine *engine) | |
| { | |
| if (engine->ops && engine->ops->commit) | |
| engine->ops->commit(engine); | |
| } | |
| /** | |
| * sunxi_engine_layers_init() - Create planes (layers) for the engine | |
| * @drm: pointer to the drm_device for which planes will be created | |
| * @engine: pointer to the engine | |
| */ | |
| static inline struct drm_plane ** | |
| sunxi_engine_layers_init(struct drm_device *drm, struct sunxi_engine *engine) | |
| { | |
| if (engine->ops && engine->ops->layers_init) | |
| return engine->ops->layers_init(drm, engine); | |
| return ERR_PTR(-ENOSYS); | |
| } | |
| /** | |
| * sunxi_engine_apply_color_correction - Apply the RGB2YUV color correction | |
| * @engine: pointer to the engine | |
| * | |
| * This functionality is optional for an engine, however, if the engine is | |
| * intended to be used with TV Encoder, the output will be incorrect | |
| * without the color correction, due to TV Encoder expects the engine to | |
| * output directly YUV signal. | |
| */ | |
| static inline void | |
| sunxi_engine_apply_color_correction(struct sunxi_engine *engine) | |
| { | |
| if (engine->ops && engine->ops->apply_color_correction) | |
| engine->ops->apply_color_correction(engine); | |
| } | |
| /** | |
| * sunxi_engine_disable_color_correction - Disable the color space correction | |
| * @engine: pointer to the engine | |
| * | |
| * This function is paired with apply_color_correction(). | |
| */ | |
| static inline void | |
| sunxi_engine_disable_color_correction(struct sunxi_engine *engine) | |
| { | |
| if (engine->ops && engine->ops->disable_color_correction) | |
| engine->ops->disable_color_correction(engine); | |
| } | |
| #endif /* _SUNXI_ENGINE_H_ */ |