aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeffrey Mouroux <jmouroux@xilinx.com>2016-12-15 17:51:57 -0800
committerChristian Kohn <christian.kohn@xilinx.com>2017-02-07 09:34:15 -0800
commitded23c1ce173514b599641964bb6c4aa1dccd755 (patch)
tree8a0de1d2ae98e266b223c6a799be453ba669af2f
parent68082bf83bcc893b32556c39fe10cc441744719d (diff)
downloadlinux-ded23c1ce173514b599641964bb6c4aa1dccd755.tar.gz
Update to mixer reset code to call xilinx_drm_plane.c:restore()
operation to reset state of all mixer drm properties and deactivate planes during a reset call (typically only invoked during a modeset via the crtc).
-rw-r--r--drivers/gpu/drm/xilinx/Kconfig2
-rw-r--r--drivers/gpu/drm/xilinx/crtc/mixer/drm/xilinx_drm_mixer.c25
-rw-r--r--drivers/gpu/drm/xilinx/crtc/mixer/drm/xilinx_drm_mixer.h4
-rw-r--r--drivers/gpu/drm/xilinx/crtc/mixer/hw/xilinx_video_mixer.h2
-rw-r--r--drivers/gpu/drm/xilinx/xilinx_drm_plane.c19
5 files changed, 35 insertions, 17 deletions
diff --git a/drivers/gpu/drm/xilinx/Kconfig b/drivers/gpu/drm/xilinx/Kconfig
index 3cd37e3be8920b..6abfce232466d6 100644
--- a/drivers/gpu/drm/xilinx/Kconfig
+++ b/drivers/gpu/drm/xilinx/Kconfig
@@ -24,6 +24,6 @@ config DRM_XILINX_DP_SUB
config DRM_XILINX_MIXER
tristate "Xilinx DRM mixer driver component"
- depends on DRM_XILINX
+ select DRM_XILINX
help
Include support for video mixer IP into the Xilinx DRM driver
diff --git a/drivers/gpu/drm/xilinx/crtc/mixer/drm/xilinx_drm_mixer.c b/drivers/gpu/drm/xilinx/crtc/mixer/drm/xilinx_drm_mixer.c
index 3b1797a353b0b8..1ba28c67a60239 100644
--- a/drivers/gpu/drm/xilinx/crtc/mixer/drm/xilinx_drm_mixer.c
+++ b/drivers/gpu/drm/xilinx/crtc/mixer/drm/xilinx_drm_mixer.c
@@ -83,7 +83,8 @@ xilinx_drm_mixer_parse_dt_bg_video_fmt (struct device_node *layer_node,
/************************* IMPLEMENTATIONS ***********************************/
struct xv_mixer * xilinx_drm_mixer_probe(struct device *dev,
- struct device_node *node)
+ struct device_node *node,
+ struct xilinx_drm_plane_manager *manager)
{
struct xv_mixer *mixer;
@@ -160,6 +161,7 @@ struct xv_mixer * xilinx_drm_mixer_probe(struct device *dev,
dev_err(dev, "Incomplete mixer video format in dt\n");
return ERR_PTR(-EINVAL);
}
+ mixer->private = (void *)manager;
/* Parse out logo data from device tree */
@@ -438,21 +440,22 @@ xilinx_drm_mixer_get_layer(struct xv_mixer *mixer, xv_mixer_layer_id layer_id)
}
void xilinx_drm_mixer_reset(struct xv_mixer *mixer) {
+
struct xv_mixer_layer_data layer;
+ struct xilinx_drm_plane_manager *manager =
+ (struct xilinx_drm_plane_manager *)mixer->private;
int i;
int ret;
gpiod_set_raw_value(mixer->reset_gpio, 0x0);
- /* reset must be held for > 16 ap_clk cycles @100 Mhz
- which is about ~160 ns */
- ndelay(300);
+
+ udelay(1);
+
gpiod_set_raw_value(mixer->reset_gpio, 0x1);
- /* JPM restore layer properties and bg color after reset */
-
- /* JPM must re-write/init register values here based on new mode*/
+ /* restore layer properties and bg color after reset */
xilinx_mixer_set_bkg_col(mixer, mixer->bg_color, mixer->bg_layer_bpc);
-
+#if 0
for(i = 0; i <= mixer->layer_cnt; i++) {
layer = mixer->layer_data[i];
@@ -465,14 +468,16 @@ void xilinx_drm_mixer_reset(struct xv_mixer *mixer) {
layer.layer_regs.scale_fact);
if(ret)
DRM_ERROR("Problem restoring scale property for mixer"
- "layer %u\n", layer.id);
+ " layer %u\n", layer.id);
ret = xilinx_mixer_set_layer_alpha(mixer, layer.id,
layer.layer_regs.alpha);
if(ret)
DRM_ERROR("Problem restoring alpha property for mixer"
- "layer %u\n", layer.id);
+ " layer %u\n", layer.id);
}
+#endif
+ xilinx_drm_plane_restore(manager);
/* JPM TODO remove this. Just a temporary measure to test logo layer
after resets. Need to update logo buffer in response to
diff --git a/drivers/gpu/drm/xilinx/crtc/mixer/drm/xilinx_drm_mixer.h b/drivers/gpu/drm/xilinx/crtc/mixer/drm/xilinx_drm_mixer.h
index a57771fa3b734b..614ec3046b77f0 100644
--- a/drivers/gpu/drm/xilinx/crtc/mixer/drm/xilinx_drm_mixer.h
+++ b/drivers/gpu/drm/xilinx/crtc/mixer/drm/xilinx_drm_mixer.h
@@ -47,13 +47,15 @@
*
* @param[in] dev Device member of drm device
* @param[in] node Open firmware(of) device tree node describing the mixer IP
+ * @param[in] manager Plane manager object to bind to mixer instance
*
* @returns reference to mixer instance struct; err pointer otherwise
*
*/
struct xv_mixer *
xilinx_drm_mixer_probe(struct device *dev,
- struct device_node *node);
+ struct device_node *node,
+ struct xilinx_drm_plane_manager *manager);
/**
* Hold the reset line for the IP core low for 300 nano seconds and then
diff --git a/drivers/gpu/drm/xilinx/crtc/mixer/hw/xilinx_video_mixer.h b/drivers/gpu/drm/xilinx/crtc/mixer/hw/xilinx_video_mixer.h
index d510fa0e9ae766..12e872a251f083 100644
--- a/drivers/gpu/drm/xilinx/crtc/mixer/hw/xilinx_video_mixer.h
+++ b/drivers/gpu/drm/xilinx/crtc/mixer/hw/xilinx_video_mixer.h
@@ -213,6 +213,8 @@ struct xv_mixer {
} logo_rgb_buffers;
struct gpio_desc *reset_gpio;
+
+ void * private;
};
diff --git a/drivers/gpu/drm/xilinx/xilinx_drm_plane.c b/drivers/gpu/drm/xilinx/xilinx_drm_plane.c
index d131cb3ca7a515..93513df4f19570 100644
--- a/drivers/gpu/drm/xilinx/xilinx_drm_plane.c
+++ b/drivers/gpu/drm/xilinx/xilinx_drm_plane.c
@@ -555,13 +555,11 @@ void xilinx_drm_plane_restore(struct xilinx_drm_plane_manager *manager)
{
struct xilinx_drm_plane *plane;
unsigned int i;
-
/*
* Reinitialize property default values as they get reset by DPMS OFF
* operation. User will read the correct default values later, and
* planes will be initialized with default values.
*/
-
for (i = 0; i < manager->num_planes; i++) {
plane = manager->planes[i];
@@ -571,29 +569,40 @@ void xilinx_drm_plane_restore(struct xilinx_drm_plane_manager *manager)
}
plane->prio = plane->zpos = plane->id;
+
if (manager->zpos_prop)
drm_object_property_set_value(&plane->base.base,
manager->zpos_prop,
plane->prio);
plane->alpha = manager->default_alpha;
+
if (manager->alpha_prop)
drm_object_property_set_value(&plane->base.base,
manager->alpha_prop,
plane->alpha);
plane->alpha_enable = true;
+
if (manager->alpha_enable_prop)
drm_object_property_set_value(&plane->base.base,
manager->alpha_enable_prop, true);
- if(manager->mixer_alpha_prop)
+ if(manager->mixer_alpha_prop){
+ drm_object_property_set_value(&plane->base.base,
+ manager->mixer_alpha_prop,
+ XVMIX_ALPHA_MAX);
xilinx_drm_mixer_set_layer_alpha(plane,
XVMIX_ALPHA_MAX);
+ }
- if(manager->mixer_scale_prop)
+ if(manager->mixer_scale_prop) {
+ drm_object_property_set_value(&plane->base.base,
+ manager->mixer_scale_prop,
+ XVMIX_SCALE_FACTOR_1X);
xilinx_drm_mixer_set_layer_scale(plane,
XVMIX_SCALE_FACTOR_1X);
+ }
}
}
@@ -1132,7 +1141,7 @@ xilinx_drm_plane_probe_manager(struct drm_device *drm)
/* Mixer addition */
sub_node = of_parse_phandle(dev->of_node, "xlnx,mixer", 0);
if (sub_node) {
- manager->mixer = xilinx_drm_mixer_probe(dev, sub_node);
+ manager->mixer = xilinx_drm_mixer_probe(dev, sub_node, manager);
of_node_put(sub_node);
if (IS_ERR(manager->mixer)) {
of_node_put(manager->node);