|  | /* | 
|  | * 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_ */ |