@@ -24,6 +24,8 @@ struct omap_crtc_state {
unsigned int rotation;
unsigned int zpos;
bool manually_updated;
+
+ u32 default_color;
};
#define to_omap_crtc(x) container_of(x, struct omap_crtc, base)
@@ -395,13 +397,14 @@ static void omap_crtc_cpr_coefs_from_ctm(const struct drm_color_ctm *ctm,
static void omap_crtc_write_crtc_properties(struct drm_crtc *crtc)
{
+ const struct omap_crtc_state *omap_state = to_omap_crtc_state(crtc->state);
struct omap_drm_private *priv = crtc->dev->dev_private;
struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
struct omap_overlay_manager_info info;
memset(&info, 0, sizeof(info));
- info.default_color = 0x000000;
+ info.default_color = omap_state->default_color;
info.trans_enabled = false;
info.partial_alpha_enabled = false;
@@ -668,6 +671,7 @@ static int omap_crtc_atomic_set_property(struct drm_crtc *crtc,
{
struct omap_drm_private *priv = crtc->dev->dev_private;
struct drm_plane_state *plane_state;
+ struct omap_crtc_state *omap_state = to_omap_crtc_state(state);
/*
* Delegate property set to the primary plane. Get the plane state and
@@ -683,6 +687,8 @@ static int omap_crtc_atomic_set_property(struct drm_crtc *crtc,
plane_state->rotation = val;
else if (property == priv->zorder_prop)
plane_state->zpos = val;
+ else if (property == priv->background_color_prop)
+ omap_state->default_color = val;
else
return -EINVAL;
@@ -701,6 +707,8 @@ static int omap_crtc_atomic_get_property(struct drm_crtc *crtc,
*val = omap_state->rotation;
else if (property == priv->zorder_prop)
*val = omap_state->zpos;
+ else if (property == priv->background_color_prop)
+ *val = omap_state->default_color;
else
return -EINVAL;
@@ -741,6 +749,8 @@ omap_crtc_duplicate_state(struct drm_crtc *crtc)
state->rotation = current_state->rotation;
state->manually_updated = current_state->manually_updated;
+ state->default_color = current_state->default_color;
+
return &state->base;
}
@@ -778,6 +788,15 @@ static const char *channel_names[] = {
[OMAP_DSS_CHANNEL_LCD3] = "lcd3",
};
+static void omap_crtc_install_properties(struct drm_crtc *crtc)
+{
+ struct drm_device *dev = crtc->dev;
+ struct drm_mode_object *obj = &crtc->base;
+ struct omap_drm_private *priv = dev->dev_private;
+
+ drm_object_attach_property(obj, priv->background_color_prop, 0);
+}
+
/* initialize crtc */
struct drm_crtc *omap_crtc_init(struct drm_device *dev,
struct omap_drm_pipeline *pipe,
@@ -843,6 +862,7 @@ struct drm_crtc *omap_crtc_init(struct drm_device *dev,
drm_mode_crtc_set_gamma_size(crtc, gamma_lut_size);
}
+ omap_crtc_install_properties(crtc);
omap_plane_install_properties(crtc->primary, &crtc->base);
return crtc;
@@ -200,6 +200,13 @@ static int omap_modeset_init_properties(struct drm_device *dev)
if (!priv->zorder_prop)
return -ENOMEM;
+ /* crtc properties */
+
+ priv->background_color_prop =
+ drm_property_create_range(dev, 0, "background", 0, 0xffffff);
+ if (!priv->background_color_prop)
+ return -ENOMEM;
+
return 0;
}
@@ -73,6 +73,9 @@ struct omap_drm_private {
/* properties: */
struct drm_property *zorder_prop;
+ /* crtc properties */
+ struct drm_property *background_color_prop;
+
/* irq handling: */
spinlock_t wait_lock; /* protects the wait_list */
struct list_head wait_list; /* list of omap_irq_wait */