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) |
