diff options
author | Jeffrey Mouroux <jmouroux@xilinx.com> | 2016-12-15 17:51:57 -0800 |
---|---|---|
committer | Christian Kohn <christian.kohn@xilinx.com> | 2017-02-07 09:34:15 -0800 |
commit | ded23c1ce173514b599641964bb6c4aa1dccd755 (patch) | |
tree | 8a0de1d2ae98e266b223c6a799be453ba669af2f | |
parent | 68082bf83bcc893b32556c39fe10cc441744719d (diff) | |
download | linux-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/Kconfig | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/xilinx/crtc/mixer/drm/xilinx_drm_mixer.c | 25 | ||||
-rw-r--r-- | drivers/gpu/drm/xilinx/crtc/mixer/drm/xilinx_drm_mixer.h | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/xilinx/crtc/mixer/hw/xilinx_video_mixer.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/xilinx/xilinx_drm_plane.c | 19 |
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); |