diff options
author | Benjamin Gaignard <benjamin.gaignard@linaro.org> | 2014-07-28 04:30:02 -0400 |
---|---|---|
committer | Benjamin Gaignard <benjamin.gaignard@linaro.org> | 2014-07-30 13:26:51 -0400 |
commit | cfd8d744fe0dc08faae4a35d333193dcca3ea891 (patch) | |
tree | c1f5a4ff12fdd2e1a8760af108a30eaa15a6d41c | |
parent | ba2d53fb6f16f1f854923a8c6fa452e235d608b0 (diff) |
drm: sti: add VID layer
VIDeo plug are one of the compositor input sub-devices.
VID are dedicated to video inputs like YUV plans.
Like GDP, VID are part of Compositor hardware block
and use sti_layer structure to provide an abstraction for
Compositor calls.
Signed-off-by: Benjamin Gaignard <benjamin.gaignard@linaro.org>
Reviewed-by: Rob Clark <robdclark@gmail.com>
-rw-r--r-- | drivers/gpu/drm/sti/Makefile | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/sti/sti_vid.c | 138 | ||||
-rw-r--r-- | drivers/gpu/drm/sti/sti_vid.h | 12 |
3 files changed, 152 insertions, 1 deletions
diff --git a/drivers/gpu/drm/sti/Makefile b/drivers/gpu/drm/sti/Makefile index 7de757f7eb38..9b613d24877f 100644 --- a/drivers/gpu/drm/sti/Makefile +++ b/drivers/gpu/drm/sti/Makefile | |||
@@ -1,5 +1,6 @@ | |||
1 | sticompositor-y := \ | 1 | sticompositor-y := \ |
2 | sti_gdp.o | 2 | sti_gdp.o \ |
3 | sti_vid.o | ||
3 | 4 | ||
4 | stihdmi-y := sti_hdmi.o \ | 5 | stihdmi-y := sti_hdmi.o \ |
5 | sti_hdmi_tx3g0c55phy.o \ | 6 | sti_hdmi_tx3g0c55phy.o \ |
diff --git a/drivers/gpu/drm/sti/sti_vid.c b/drivers/gpu/drm/sti/sti_vid.c new file mode 100644 index 000000000000..10ced6a479f4 --- /dev/null +++ b/drivers/gpu/drm/sti/sti_vid.c | |||
@@ -0,0 +1,138 @@ | |||
1 | /* | ||
2 | * Copyright (C) STMicroelectronics SA 2014 | ||
3 | * Author: Fabien Dessenne <fabien.dessenne@st.com> for STMicroelectronics. | ||
4 | * License terms: GNU General Public License (GPL), version 2 | ||
5 | */ | ||
6 | |||
7 | #include <drm/drmP.h> | ||
8 | |||
9 | #include "sti_layer.h" | ||
10 | #include "sti_vid.h" | ||
11 | #include "sti_vtg.h" | ||
12 | |||
13 | /* Registers */ | ||
14 | #define VID_CTL 0x00 | ||
15 | #define VID_ALP 0x04 | ||
16 | #define VID_CLF 0x08 | ||
17 | #define VID_VPO 0x0C | ||
18 | #define VID_VPS 0x10 | ||
19 | #define VID_KEY1 0x28 | ||
20 | #define VID_KEY2 0x2C | ||
21 | #define VID_MPR0 0x30 | ||
22 | #define VID_MPR1 0x34 | ||
23 | #define VID_MPR2 0x38 | ||
24 | #define VID_MPR3 0x3C | ||
25 | #define VID_MST 0x68 | ||
26 | #define VID_BC 0x70 | ||
27 | #define VID_TINT 0x74 | ||
28 | #define VID_CSAT 0x78 | ||
29 | |||
30 | /* Registers values */ | ||
31 | #define VID_CTL_IGNORE (BIT(31) | BIT(30)) | ||
32 | #define VID_CTL_PSI_ENABLE (BIT(2) | BIT(1) | BIT(0)) | ||
33 | #define VID_ALP_OPAQUE 0x00000080 | ||
34 | #define VID_BC_DFLT 0x00008000 | ||
35 | #define VID_TINT_DFLT 0x00000000 | ||
36 | #define VID_CSAT_DFLT 0x00000080 | ||
37 | /* YCbCr to RGB BT709: | ||
38 | * R = Y+1.5391Cr | ||
39 | * G = Y-0.4590Cr-0.1826Cb | ||
40 | * B = Y+1.8125Cb */ | ||
41 | #define VID_MPR0_BT709 0x0A800000 | ||
42 | #define VID_MPR1_BT709 0x0AC50000 | ||
43 | #define VID_MPR2_BT709 0x07150545 | ||
44 | #define VID_MPR3_BT709 0x00000AE8 | ||
45 | |||
46 | static int sti_vid_prepare_layer(struct sti_layer *vid, bool first_prepare) | ||
47 | { | ||
48 | u32 val; | ||
49 | |||
50 | /* Unmask */ | ||
51 | val = readl(vid->regs + VID_CTL); | ||
52 | val &= ~VID_CTL_IGNORE; | ||
53 | writel(val, vid->regs + VID_CTL); | ||
54 | |||
55 | return 0; | ||
56 | } | ||
57 | |||
58 | static int sti_vid_commit_layer(struct sti_layer *vid) | ||
59 | { | ||
60 | struct drm_display_mode *mode = vid->mode; | ||
61 | u32 ydo, xdo, yds, xds; | ||
62 | |||
63 | ydo = sti_vtg_get_line_number(*mode, vid->dst_y); | ||
64 | yds = sti_vtg_get_line_number(*mode, vid->dst_y + vid->dst_h - 1); | ||
65 | xdo = sti_vtg_get_pixel_number(*mode, vid->dst_x); | ||
66 | xds = sti_vtg_get_pixel_number(*mode, vid->dst_x + vid->dst_w - 1); | ||
67 | |||
68 | writel((ydo << 16) | xdo, vid->regs + VID_VPO); | ||
69 | writel((yds << 16) | xds, vid->regs + VID_VPS); | ||
70 | |||
71 | return 0; | ||
72 | } | ||
73 | |||
74 | static int sti_vid_disable_layer(struct sti_layer *vid) | ||
75 | { | ||
76 | u32 val; | ||
77 | |||
78 | /* Mask */ | ||
79 | val = readl(vid->regs + VID_CTL); | ||
80 | val |= VID_CTL_IGNORE; | ||
81 | writel(val, vid->regs + VID_CTL); | ||
82 | |||
83 | return 0; | ||
84 | } | ||
85 | |||
86 | static const uint32_t *sti_vid_get_formats(struct sti_layer *layer) | ||
87 | { | ||
88 | return NULL; | ||
89 | } | ||
90 | |||
91 | static unsigned int sti_vid_get_nb_formats(struct sti_layer *layer) | ||
92 | { | ||
93 | return 0; | ||
94 | } | ||
95 | |||
96 | static void sti_vid_init(struct sti_layer *vid) | ||
97 | { | ||
98 | /* Enable PSI, Mask layer */ | ||
99 | writel(VID_CTL_PSI_ENABLE | VID_CTL_IGNORE, vid->regs + VID_CTL); | ||
100 | |||
101 | /* Opaque */ | ||
102 | writel(VID_ALP_OPAQUE, vid->regs + VID_ALP); | ||
103 | |||
104 | /* Color conversion parameters */ | ||
105 | writel(VID_MPR0_BT709, vid->regs + VID_MPR0); | ||
106 | writel(VID_MPR1_BT709, vid->regs + VID_MPR1); | ||
107 | writel(VID_MPR2_BT709, vid->regs + VID_MPR2); | ||
108 | writel(VID_MPR3_BT709, vid->regs + VID_MPR3); | ||
109 | |||
110 | /* Brightness, contrast, tint, saturation */ | ||
111 | writel(VID_BC_DFLT, vid->regs + VID_BC); | ||
112 | writel(VID_TINT_DFLT, vid->regs + VID_TINT); | ||
113 | writel(VID_CSAT_DFLT, vid->regs + VID_CSAT); | ||
114 | } | ||
115 | |||
116 | static const struct sti_layer_funcs vid_ops = { | ||
117 | .get_formats = sti_vid_get_formats, | ||
118 | .get_nb_formats = sti_vid_get_nb_formats, | ||
119 | .init = sti_vid_init, | ||
120 | .prepare = sti_vid_prepare_layer, | ||
121 | .commit = sti_vid_commit_layer, | ||
122 | .disable = sti_vid_disable_layer, | ||
123 | }; | ||
124 | |||
125 | struct sti_layer *sti_vid_create(struct device *dev) | ||
126 | { | ||
127 | struct sti_layer *vid; | ||
128 | |||
129 | vid = devm_kzalloc(dev, sizeof(*vid), GFP_KERNEL); | ||
130 | if (!vid) { | ||
131 | DRM_ERROR("Failed to allocate memory for VID\n"); | ||
132 | return NULL; | ||
133 | } | ||
134 | |||
135 | vid->ops = &vid_ops; | ||
136 | |||
137 | return vid; | ||
138 | } | ||
diff --git a/drivers/gpu/drm/sti/sti_vid.h b/drivers/gpu/drm/sti/sti_vid.h new file mode 100644 index 000000000000..2c0aecd63294 --- /dev/null +++ b/drivers/gpu/drm/sti/sti_vid.h | |||
@@ -0,0 +1,12 @@ | |||
1 | /* | ||
2 | * Copyright (C) STMicroelectronics SA 2014 | ||
3 | * Author: Fabien Dessenne <fabien.dessenne@st.com> for STMicroelectronics. | ||
4 | * License terms: GNU General Public License (GPL), version 2 | ||
5 | */ | ||
6 | |||
7 | #ifndef _STI_VID_H_ | ||
8 | #define _STI_VID_H_ | ||
9 | |||
10 | struct sti_layer *sti_vid_create(struct device *dev); | ||
11 | |||
12 | #endif | ||