return -EINVAL;
}
-static void sun8i_layer_enable(struct sun8i_layer *layer, bool enable)
-{
- u32 ch_base = sun8i_channel_base(layer->mixer, layer->channel);
- u32 val, reg, mask;
-
- if (layer->type == SUN8I_LAYER_TYPE_UI) {
- val = enable ? SUN8I_MIXER_CHAN_UI_LAYER_ATTR_EN : 0;
- mask = SUN8I_MIXER_CHAN_UI_LAYER_ATTR_EN;
- reg = SUN8I_MIXER_CHAN_UI_LAYER_ATTR(ch_base, layer->overlay);
- } else {
- val = enable ? SUN8I_MIXER_CHAN_VI_LAYER_ATTR_EN : 0;
- mask = SUN8I_MIXER_CHAN_VI_LAYER_ATTR_EN;
- reg = SUN8I_MIXER_CHAN_VI_LAYER_ATTR(ch_base, layer->overlay);
- }
-
- regmap_update_bits(layer->mixer->engine.regs, reg, mask, val);
-}
-
static void sun8i_mixer_commit(struct sunxi_engine *engine,
struct drm_crtc *crtc,
struct drm_atomic_state *state)
plane->base.id, layer->channel, layer->overlay,
enable, zpos, x, y, w, h);
- /*
- * We always update the layer enable bit, because it can clear
- * spontaneously for unknown reasons.
- */
- sun8i_layer_enable(layer, enable);
-
if (!enable)
continue;
#include "sun8i_ui_scaler.h"
#include "sun8i_vi_scaler.h"
+static void sun8i_ui_layer_disable(struct sun8i_mixer *mixer,
+ int channel, int overlay)
+{
+ u32 ch_base = sun8i_channel_base(mixer, channel);
+
+ regmap_write(mixer->engine.regs,
+ SUN8I_MIXER_CHAN_UI_LAYER_ATTR(ch_base, overlay), 0);
+}
+
static void sun8i_ui_layer_update_attributes(struct sun8i_mixer *mixer,
int channel, int overlay,
struct drm_plane *plane)
struct sun8i_layer *layer = plane_to_sun8i_layer(plane);
struct sun8i_mixer *mixer = layer->mixer;
- if (!new_state->crtc || !new_state->visible)
+ if (!new_state->crtc || !new_state->visible) {
+ sun8i_ui_layer_disable(mixer, layer->channel, layer->overlay);
return;
+ }
sun8i_ui_layer_update_attributes(mixer, layer->channel,
layer->overlay, plane);
#include "sun8i_vi_layer.h"
#include "sun8i_vi_scaler.h"
+static void sun8i_vi_layer_disable(struct sun8i_mixer *mixer,
+ int channel, int overlay)
+{
+ u32 ch_base = sun8i_channel_base(mixer, channel);
+
+ regmap_write(mixer->engine.regs,
+ SUN8I_MIXER_CHAN_VI_LAYER_ATTR(ch_base, overlay), 0);
+}
+
static void sun8i_vi_layer_update_attributes(struct sun8i_mixer *mixer,
int channel, int overlay,
struct drm_plane *plane)
struct sun8i_layer *layer = plane_to_sun8i_layer(plane);
struct sun8i_mixer *mixer = layer->mixer;
- if (!new_state->crtc || !new_state->visible)
+ if (!new_state->crtc || !new_state->visible) {
+ sun8i_vi_layer_disable(mixer, layer->channel, layer->overlay);
return;
+ }
sun8i_vi_layer_update_attributes(mixer, layer->channel,
layer->overlay, plane);