aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
authorBoris Brezillon <boris.brezillon@free-electrons.com>2016-12-02 08:48:07 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-03-22 07:43:39 -0400
commit8ca7ef0d9af9644a65e3e22ccc1937f00caa777b (patch)
tree8056af46ff1a5138bf1940c1dfee27ff416ffaa5 /drivers/gpu/drm
parent6b3306706733cc98bf14e30ff54fa9084b76cd55 (diff)
drm/vc4: Fix ->clock_select setting for the VEC encoder
commit ab8df60e3a3b68420d0d4477c5f07c00fbfb078b upstream. PV_CONTROL_CLK_SELECT_VEC is actually 2 and not 0. Fix the definition and rework the vc4_set_crtc_possible_masks() to cover the full range of the PV_CONTROL_CLK_SELECT field. Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com> Signed-off-by: Eric Anholt <eric@anholt.net> Cc: Amit Pundir <amit.pundir@linaro.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r--drivers/gpu/drm/vc4/vc4_crtc.c38
-rw-r--r--drivers/gpu/drm/vc4/vc4_drv.h1
-rw-r--r--drivers/gpu/drm/vc4/vc4_regs.h3
3 files changed, 26 insertions, 16 deletions
diff --git a/drivers/gpu/drm/vc4/vc4_crtc.c b/drivers/gpu/drm/vc4/vc4_crtc.c
index a062228b6831..7aadce1f7e7a 100644
--- a/drivers/gpu/drm/vc4/vc4_crtc.c
+++ b/drivers/gpu/drm/vc4/vc4_crtc.c
@@ -83,8 +83,7 @@ struct vc4_crtc_data {
83 /* Which channel of the HVS this pixelvalve sources from. */ 83 /* Which channel of the HVS this pixelvalve sources from. */
84 int hvs_channel; 84 int hvs_channel;
85 85
86 enum vc4_encoder_type encoder0_type; 86 enum vc4_encoder_type encoder_types[4];
87 enum vc4_encoder_type encoder1_type;
88}; 87};
89 88
90#define CRTC_WRITE(offset, val) writel(val, vc4_crtc->regs + (offset)) 89#define CRTC_WRITE(offset, val) writel(val, vc4_crtc->regs + (offset))
@@ -867,20 +866,26 @@ static const struct drm_crtc_helper_funcs vc4_crtc_helper_funcs = {
867 866
868static const struct vc4_crtc_data pv0_data = { 867static const struct vc4_crtc_data pv0_data = {
869 .hvs_channel = 0, 868 .hvs_channel = 0,
870 .encoder0_type = VC4_ENCODER_TYPE_DSI0, 869 .encoder_types = {
871 .encoder1_type = VC4_ENCODER_TYPE_DPI, 870 [PV_CONTROL_CLK_SELECT_DSI] = VC4_ENCODER_TYPE_DSI0,
871 [PV_CONTROL_CLK_SELECT_DPI_SMI_HDMI] = VC4_ENCODER_TYPE_DPI,
872 },
872}; 873};
873 874
874static const struct vc4_crtc_data pv1_data = { 875static const struct vc4_crtc_data pv1_data = {
875 .hvs_channel = 2, 876 .hvs_channel = 2,
876 .encoder0_type = VC4_ENCODER_TYPE_DSI1, 877 .encoder_types = {
877 .encoder1_type = VC4_ENCODER_TYPE_SMI, 878 [PV_CONTROL_CLK_SELECT_DSI] = VC4_ENCODER_TYPE_DSI1,
879 [PV_CONTROL_CLK_SELECT_DPI_SMI_HDMI] = VC4_ENCODER_TYPE_SMI,
880 },
878}; 881};
879 882
880static const struct vc4_crtc_data pv2_data = { 883static const struct vc4_crtc_data pv2_data = {
881 .hvs_channel = 1, 884 .hvs_channel = 1,
882 .encoder0_type = VC4_ENCODER_TYPE_VEC, 885 .encoder_types = {
883 .encoder1_type = VC4_ENCODER_TYPE_HDMI, 886 [PV_CONTROL_CLK_SELECT_DPI_SMI_HDMI] = VC4_ENCODER_TYPE_HDMI,
887 [PV_CONTROL_CLK_SELECT_VEC] = VC4_ENCODER_TYPE_VEC,
888 },
884}; 889};
885 890
886static const struct of_device_id vc4_crtc_dt_match[] = { 891static const struct of_device_id vc4_crtc_dt_match[] = {
@@ -894,17 +899,20 @@ static void vc4_set_crtc_possible_masks(struct drm_device *drm,
894 struct drm_crtc *crtc) 899 struct drm_crtc *crtc)
895{ 900{
896 struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc); 901 struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc);
902 const struct vc4_crtc_data *crtc_data = vc4_crtc->data;
903 const enum vc4_encoder_type *encoder_types = crtc_data->encoder_types;
897 struct drm_encoder *encoder; 904 struct drm_encoder *encoder;
898 905
899 drm_for_each_encoder(encoder, drm) { 906 drm_for_each_encoder(encoder, drm) {
900 struct vc4_encoder *vc4_encoder = to_vc4_encoder(encoder); 907 struct vc4_encoder *vc4_encoder = to_vc4_encoder(encoder);
901 908 int i;
902 if (vc4_encoder->type == vc4_crtc->data->encoder0_type) { 909
903 vc4_encoder->clock_select = 0; 910 for (i = 0; i < ARRAY_SIZE(crtc_data->encoder_types); i++) {
904 encoder->possible_crtcs |= drm_crtc_mask(crtc); 911 if (vc4_encoder->type == encoder_types[i]) {
905 } else if (vc4_encoder->type == vc4_crtc->data->encoder1_type) { 912 vc4_encoder->clock_select = i;
906 vc4_encoder->clock_select = 1; 913 encoder->possible_crtcs |= drm_crtc_mask(crtc);
907 encoder->possible_crtcs |= drm_crtc_mask(crtc); 914 break;
915 }
908 } 916 }
909 } 917 }
910} 918}
diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h
index cc77b8b5ce03..50a55ef999d6 100644
--- a/drivers/gpu/drm/vc4/vc4_drv.h
+++ b/drivers/gpu/drm/vc4/vc4_drv.h
@@ -194,6 +194,7 @@ to_vc4_plane(struct drm_plane *plane)
194} 194}
195 195
196enum vc4_encoder_type { 196enum vc4_encoder_type {
197 VC4_ENCODER_TYPE_NONE,
197 VC4_ENCODER_TYPE_HDMI, 198 VC4_ENCODER_TYPE_HDMI,
198 VC4_ENCODER_TYPE_VEC, 199 VC4_ENCODER_TYPE_VEC,
199 VC4_ENCODER_TYPE_DSI0, 200 VC4_ENCODER_TYPE_DSI0,
diff --git a/drivers/gpu/drm/vc4/vc4_regs.h b/drivers/gpu/drm/vc4/vc4_regs.h
index 1aa44c2db556..39f6886b2410 100644
--- a/drivers/gpu/drm/vc4/vc4_regs.h
+++ b/drivers/gpu/drm/vc4/vc4_regs.h
@@ -177,8 +177,9 @@
177# define PV_CONTROL_WAIT_HSTART BIT(12) 177# define PV_CONTROL_WAIT_HSTART BIT(12)
178# define PV_CONTROL_PIXEL_REP_MASK VC4_MASK(5, 4) 178# define PV_CONTROL_PIXEL_REP_MASK VC4_MASK(5, 4)
179# define PV_CONTROL_PIXEL_REP_SHIFT 4 179# define PV_CONTROL_PIXEL_REP_SHIFT 4
180# define PV_CONTROL_CLK_SELECT_DSI_VEC 0 180# define PV_CONTROL_CLK_SELECT_DSI 0
181# define PV_CONTROL_CLK_SELECT_DPI_SMI_HDMI 1 181# define PV_CONTROL_CLK_SELECT_DPI_SMI_HDMI 1
182# define PV_CONTROL_CLK_SELECT_VEC 2
182# define PV_CONTROL_CLK_SELECT_MASK VC4_MASK(3, 2) 183# define PV_CONTROL_CLK_SELECT_MASK VC4_MASK(3, 2)
183# define PV_CONTROL_CLK_SELECT_SHIFT 2 184# define PV_CONTROL_CLK_SELECT_SHIFT 2
184# define PV_CONTROL_FIFO_CLR BIT(1) 185# define PV_CONTROL_FIFO_CLR BIT(1)