diff options
author | Boris Brezillon <boris.brezillon@free-electrons.com> | 2016-12-02 08:48:07 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-03-22 07:43:39 -0400 |
commit | 8ca7ef0d9af9644a65e3e22ccc1937f00caa777b (patch) | |
tree | 8056af46ff1a5138bf1940c1dfee27ff416ffaa5 /drivers/gpu/drm | |
parent | 6b3306706733cc98bf14e30ff54fa9084b76cd55 (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.c | 38 | ||||
-rw-r--r-- | drivers/gpu/drm/vc4/vc4_drv.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/vc4/vc4_regs.h | 3 |
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 | ||
868 | static const struct vc4_crtc_data pv0_data = { | 867 | static 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 | ||
874 | static const struct vc4_crtc_data pv1_data = { | 875 | static 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 | ||
880 | static const struct vc4_crtc_data pv2_data = { | 883 | static 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 | ||
886 | static const struct of_device_id vc4_crtc_dt_match[] = { | 891 | static 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 | ||
196 | enum vc4_encoder_type { | 196 | enum 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) |