root/drivers/gpu/drm/sun4i/sunxi_engine.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. sunxi_engine_commit
  2. sunxi_engine_layers_init
  3. sunxi_engine_apply_color_correction
  4. sunxi_engine_disable_color_correction

   1 /* SPDX-License-Identifier: GPL-2.0-or-later */
   2 /*
   3  * Copyright (C) 2017 Icenowy Zheng <icenowy@aosc.io>
   4  */
   5 
   6 #ifndef _SUNXI_ENGINE_H_
   7 #define _SUNXI_ENGINE_H_
   8 
   9 struct drm_plane;
  10 struct drm_device;
  11 struct drm_crtc_state;
  12 
  13 struct sunxi_engine;
  14 
  15 /**
  16  * struct sunxi_engine_ops - helper operations for sunXi engines
  17  *
  18  * These hooks are used by the common part of the DRM driver to
  19  * implement the proper behaviour.
  20  */
  21 struct sunxi_engine_ops {
  22         /**
  23          * @atomic_begin:
  24          *
  25          * This callback allows to prepare our engine for an atomic
  26          * update. This is mirroring the
  27          * &drm_crtc_helper_funcs.atomic_begin callback, so any
  28          * documentation there applies.
  29          *
  30          * This function is optional.
  31          */
  32         void (*atomic_begin)(struct sunxi_engine *engine,
  33                              struct drm_crtc_state *old_state);
  34 
  35         /**
  36          * @atomic_check:
  37          *
  38          * This callback allows to validate plane-update related CRTC
  39          * constraints specific to engines. This is mirroring the
  40          * &drm_crtc_helper_funcs.atomic_check callback, so any
  41          * documentation there applies.
  42          *
  43          * This function is optional.
  44          *
  45          * RETURNS:
  46          *
  47          * 0 on success or a negative error code.
  48          */
  49         int (*atomic_check)(struct sunxi_engine *engine,
  50                             struct drm_crtc_state *state);
  51 
  52         /**
  53          * @commit:
  54          *
  55          * This callback will trigger the hardware switch to commit
  56          * the new configuration that has been setup during the next
  57          * vblank period.
  58          *
  59          * This function is optional.
  60          */
  61         void (*commit)(struct sunxi_engine *engine);
  62 
  63         /**
  64          * @layers_init:
  65          *
  66          * This callback is used to allocate, initialize and register
  67          * the layers supported by that engine.
  68          *
  69          * This function is mandatory.
  70          *
  71          * RETURNS:
  72          *
  73          * The array of struct drm_plane backing the layers, or an
  74          * error pointer on failure.
  75          */
  76         struct drm_plane **(*layers_init)(struct drm_device *drm,
  77                                           struct sunxi_engine *engine);
  78 
  79         /**
  80          * @apply_color_correction:
  81          *
  82          * This callback will enable the color correction in the
  83          * engine. This is useful only for the composite output.
  84          *
  85          * This function is optional.
  86          */
  87         void (*apply_color_correction)(struct sunxi_engine *engine);
  88 
  89         /**
  90          * @disable_color_correction:
  91          *
  92          * This callback will stop the color correction in the
  93          * engine. This is useful only for the composite output.
  94          *
  95          * This function is optional.
  96          */
  97         void (*disable_color_correction)(struct sunxi_engine *engine);
  98 
  99         /**
 100          * @vblank_quirk:
 101          *
 102          * This callback is used to implement engine-specific
 103          * behaviour part of the VBLANK event. It is run with all the
 104          * constraints of an interrupt (can't sleep, all local
 105          * interrupts disabled) and therefore should be as fast as
 106          * possible.
 107          *
 108          * This function is optional.
 109          */
 110         void (*vblank_quirk)(struct sunxi_engine *engine);
 111 };
 112 
 113 /**
 114  * struct sunxi_engine - the common parts of an engine for sun4i-drm driver
 115  * @ops:        the operations of the engine
 116  * @node:       the of device node of the engine
 117  * @regs:       the regmap of the engine
 118  * @id:         the id of the engine (-1 if not used)
 119  */
 120 struct sunxi_engine {
 121         const struct sunxi_engine_ops   *ops;
 122 
 123         struct device_node              *node;
 124         struct regmap                   *regs;
 125 
 126         int id;
 127 
 128         /* Engine list management */
 129         struct list_head                list;
 130 };
 131 
 132 /**
 133  * sunxi_engine_commit() - commit all changes of the engine
 134  * @engine:     pointer to the engine
 135  */
 136 static inline void
 137 sunxi_engine_commit(struct sunxi_engine *engine)
 138 {
 139         if (engine->ops && engine->ops->commit)
 140                 engine->ops->commit(engine);
 141 }
 142 
 143 /**
 144  * sunxi_engine_layers_init() - Create planes (layers) for the engine
 145  * @drm:        pointer to the drm_device for which planes will be created
 146  * @engine:     pointer to the engine
 147  */
 148 static inline struct drm_plane **
 149 sunxi_engine_layers_init(struct drm_device *drm, struct sunxi_engine *engine)
 150 {
 151         if (engine->ops && engine->ops->layers_init)
 152                 return engine->ops->layers_init(drm, engine);
 153         return ERR_PTR(-ENOSYS);
 154 }
 155 
 156 /**
 157  * sunxi_engine_apply_color_correction - Apply the RGB2YUV color correction
 158  * @engine:     pointer to the engine
 159  *
 160  * This functionality is optional for an engine, however, if the engine is
 161  * intended to be used with TV Encoder, the output will be incorrect
 162  * without the color correction, due to TV Encoder expects the engine to
 163  * output directly YUV signal.
 164  */
 165 static inline void
 166 sunxi_engine_apply_color_correction(struct sunxi_engine *engine)
 167 {
 168         if (engine->ops && engine->ops->apply_color_correction)
 169                 engine->ops->apply_color_correction(engine);
 170 }
 171 
 172 /**
 173  * sunxi_engine_disable_color_correction - Disable the color space correction
 174  * @engine:     pointer to the engine
 175  *
 176  * This function is paired with apply_color_correction().
 177  */
 178 static inline void
 179 sunxi_engine_disable_color_correction(struct sunxi_engine *engine)
 180 {
 181         if (engine->ops && engine->ops->disable_color_correction)
 182                 engine->ops->disable_color_correction(engine);
 183 }
 184 #endif /* _SUNXI_ENGINE_H_ */

/* [<][>][^][v][top][bottom][index][help] */