Commit 564964bd8527667bf88a47890d73cac5eec16c55
Committed by
Wolfgang Denk
1 parent
be547c6db3
Exists in
master
and in
54 other branches
GCC4.6: Squash warnings in ipu_disp.c
ipu_disp.c: In function ‘ipu_disp_set_global_alpha’: ipu_disp.c:1237:11: warning: variable ‘flow’ set but not used [-Wunused-but-set-variable] ipu_disp.c: In function ‘ipu_disp_set_color_key’: ipu_disp.c:1302:16: warning: variable ‘flow’ set but not used [-Wunused-but-set-variable] Signed-off-by: Marek Vasut <marek.vasut@gmail.com> Cc: Stefano Babic <sbabic@denx.de>
Showing 2 changed files with 48 additions and 57 deletions Inline Diff
drivers/video/ipu_disp.c
1 | /* | 1 | /* |
2 | * Porting to u-boot: | 2 | * Porting to u-boot: |
3 | * | 3 | * |
4 | * (C) Copyright 2010 | 4 | * (C) Copyright 2010 |
5 | * Stefano Babic, DENX Software Engineering, sbabic@denx.de | 5 | * Stefano Babic, DENX Software Engineering, sbabic@denx.de |
6 | * | 6 | * |
7 | * Linux IPU driver for MX51: | 7 | * Linux IPU driver for MX51: |
8 | * | 8 | * |
9 | * (C) Copyright 2005-2010 Freescale Semiconductor, Inc. | 9 | * (C) Copyright 2005-2010 Freescale Semiconductor, Inc. |
10 | * | 10 | * |
11 | * See file CREDITS for list of people who contributed to this | 11 | * See file CREDITS for list of people who contributed to this |
12 | * project. | 12 | * project. |
13 | * | 13 | * |
14 | * This program is free software; you can redistribute it and/or | 14 | * This program is free software; you can redistribute it and/or |
15 | * modify it under the terms of the GNU General Public License as | 15 | * modify it under the terms of the GNU General Public License as |
16 | * published by the Free Software Foundation; either version 2 of | 16 | * published by the Free Software Foundation; either version 2 of |
17 | * the License, or (at your option) any later version. | 17 | * the License, or (at your option) any later version. |
18 | * | 18 | * |
19 | * This program is distributed in the hope that it will be useful, | 19 | * This program is distributed in the hope that it will be useful, |
20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
22 | * GNU General Public License for more details. | 22 | * GNU General Public License for more details. |
23 | * | 23 | * |
24 | * You should have received a copy of the GNU General Public License | 24 | * You should have received a copy of the GNU General Public License |
25 | * along with this program; if not, write to the Free Software | 25 | * along with this program; if not, write to the Free Software |
26 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, | 26 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
27 | * MA 02111-1307 USA | 27 | * MA 02111-1307 USA |
28 | */ | 28 | */ |
29 | 29 | ||
30 | /* #define DEBUG */ | 30 | /* #define DEBUG */ |
31 | 31 | ||
32 | #include <common.h> | 32 | #include <common.h> |
33 | #include <linux/types.h> | 33 | #include <linux/types.h> |
34 | #include <asm/errno.h> | 34 | #include <asm/errno.h> |
35 | #include <asm/io.h> | 35 | #include <asm/io.h> |
36 | #include <asm/arch/imx-regs.h> | 36 | #include <asm/arch/imx-regs.h> |
37 | #include <asm/arch/sys_proto.h> | 37 | #include <asm/arch/sys_proto.h> |
38 | #include "ipu.h" | 38 | #include "ipu.h" |
39 | #include "ipu_regs.h" | 39 | #include "ipu_regs.h" |
40 | 40 | ||
41 | enum csc_type_t { | 41 | enum csc_type_t { |
42 | RGB2YUV = 0, | 42 | RGB2YUV = 0, |
43 | YUV2RGB, | 43 | YUV2RGB, |
44 | RGB2RGB, | 44 | RGB2RGB, |
45 | YUV2YUV, | 45 | YUV2YUV, |
46 | CSC_NONE, | 46 | CSC_NONE, |
47 | CSC_NUM | 47 | CSC_NUM |
48 | }; | 48 | }; |
49 | 49 | ||
50 | struct dp_csc_param_t { | 50 | struct dp_csc_param_t { |
51 | int mode; | 51 | int mode; |
52 | void *coeff; | 52 | void *coeff; |
53 | }; | 53 | }; |
54 | 54 | ||
55 | #define SYNC_WAVE 0 | 55 | #define SYNC_WAVE 0 |
56 | 56 | ||
57 | /* DC display ID assignments */ | 57 | /* DC display ID assignments */ |
58 | #define DC_DISP_ID_SYNC(di) (di) | 58 | #define DC_DISP_ID_SYNC(di) (di) |
59 | #define DC_DISP_ID_SERIAL 2 | 59 | #define DC_DISP_ID_SERIAL 2 |
60 | #define DC_DISP_ID_ASYNC 3 | 60 | #define DC_DISP_ID_ASYNC 3 |
61 | 61 | ||
62 | int dmfc_type_setup; | 62 | int dmfc_type_setup; |
63 | static int dmfc_size_28, dmfc_size_29, dmfc_size_24, dmfc_size_27, dmfc_size_23; | 63 | static int dmfc_size_28, dmfc_size_29, dmfc_size_24, dmfc_size_27, dmfc_size_23; |
64 | int g_di1_tvout; | 64 | int g_di1_tvout; |
65 | 65 | ||
66 | extern struct clk *g_ipu_clk; | 66 | extern struct clk *g_ipu_clk; |
67 | extern struct clk *g_di_clk[2]; | 67 | extern struct clk *g_di_clk[2]; |
68 | extern struct clk *g_pixel_clk[2]; | 68 | extern struct clk *g_pixel_clk[2]; |
69 | 69 | ||
70 | extern unsigned char g_ipu_clk_enabled; | 70 | extern unsigned char g_ipu_clk_enabled; |
71 | extern unsigned char g_dc_di_assignment[]; | 71 | extern unsigned char g_dc_di_assignment[]; |
72 | 72 | ||
73 | void ipu_dmfc_init(int dmfc_type, int first) | 73 | void ipu_dmfc_init(int dmfc_type, int first) |
74 | { | 74 | { |
75 | u32 dmfc_wr_chan, dmfc_dp_chan; | 75 | u32 dmfc_wr_chan, dmfc_dp_chan; |
76 | 76 | ||
77 | if (first) { | 77 | if (first) { |
78 | if (dmfc_type_setup > dmfc_type) | 78 | if (dmfc_type_setup > dmfc_type) |
79 | dmfc_type = dmfc_type_setup; | 79 | dmfc_type = dmfc_type_setup; |
80 | else | 80 | else |
81 | dmfc_type_setup = dmfc_type; | 81 | dmfc_type_setup = dmfc_type; |
82 | 82 | ||
83 | /* disable DMFC-IC channel*/ | 83 | /* disable DMFC-IC channel*/ |
84 | __raw_writel(0x2, DMFC_IC_CTRL); | 84 | __raw_writel(0x2, DMFC_IC_CTRL); |
85 | } else if (dmfc_type_setup >= DMFC_HIGH_RESOLUTION_DC) { | 85 | } else if (dmfc_type_setup >= DMFC_HIGH_RESOLUTION_DC) { |
86 | printf("DMFC high resolution has set, will not change\n"); | 86 | printf("DMFC high resolution has set, will not change\n"); |
87 | return; | 87 | return; |
88 | } else | 88 | } else |
89 | dmfc_type_setup = dmfc_type; | 89 | dmfc_type_setup = dmfc_type; |
90 | 90 | ||
91 | if (dmfc_type == DMFC_HIGH_RESOLUTION_DC) { | 91 | if (dmfc_type == DMFC_HIGH_RESOLUTION_DC) { |
92 | /* 1 - segment 0~3; | 92 | /* 1 - segment 0~3; |
93 | * 5B - segement 4, 5; | 93 | * 5B - segement 4, 5; |
94 | * 5F - segement 6, 7; | 94 | * 5F - segement 6, 7; |
95 | * 1C, 2C and 6B, 6F unused; | 95 | * 1C, 2C and 6B, 6F unused; |
96 | */ | 96 | */ |
97 | debug("IPU DMFC DC HIGH RES: 1(0~3), 5B(4,5), 5F(6,7)\n"); | 97 | debug("IPU DMFC DC HIGH RES: 1(0~3), 5B(4,5), 5F(6,7)\n"); |
98 | dmfc_wr_chan = 0x00000088; | 98 | dmfc_wr_chan = 0x00000088; |
99 | dmfc_dp_chan = 0x00009694; | 99 | dmfc_dp_chan = 0x00009694; |
100 | dmfc_size_28 = 256 * 4; | 100 | dmfc_size_28 = 256 * 4; |
101 | dmfc_size_29 = 0; | 101 | dmfc_size_29 = 0; |
102 | dmfc_size_24 = 0; | 102 | dmfc_size_24 = 0; |
103 | dmfc_size_27 = 128 * 4; | 103 | dmfc_size_27 = 128 * 4; |
104 | dmfc_size_23 = 128 * 4; | 104 | dmfc_size_23 = 128 * 4; |
105 | } else if (dmfc_type == DMFC_HIGH_RESOLUTION_DP) { | 105 | } else if (dmfc_type == DMFC_HIGH_RESOLUTION_DP) { |
106 | /* 1 - segment 0, 1; | 106 | /* 1 - segment 0, 1; |
107 | * 5B - segement 2~5; | 107 | * 5B - segement 2~5; |
108 | * 5F - segement 6,7; | 108 | * 5F - segement 6,7; |
109 | * 1C, 2C and 6B, 6F unused; | 109 | * 1C, 2C and 6B, 6F unused; |
110 | */ | 110 | */ |
111 | debug("IPU DMFC DP HIGH RES: 1(0,1), 5B(2~5), 5F(6,7)\n"); | 111 | debug("IPU DMFC DP HIGH RES: 1(0,1), 5B(2~5), 5F(6,7)\n"); |
112 | dmfc_wr_chan = 0x00000090; | 112 | dmfc_wr_chan = 0x00000090; |
113 | dmfc_dp_chan = 0x0000968a; | 113 | dmfc_dp_chan = 0x0000968a; |
114 | dmfc_size_28 = 128 * 4; | 114 | dmfc_size_28 = 128 * 4; |
115 | dmfc_size_29 = 0; | 115 | dmfc_size_29 = 0; |
116 | dmfc_size_24 = 0; | 116 | dmfc_size_24 = 0; |
117 | dmfc_size_27 = 128 * 4; | 117 | dmfc_size_27 = 128 * 4; |
118 | dmfc_size_23 = 256 * 4; | 118 | dmfc_size_23 = 256 * 4; |
119 | } else if (dmfc_type == DMFC_HIGH_RESOLUTION_ONLY_DP) { | 119 | } else if (dmfc_type == DMFC_HIGH_RESOLUTION_ONLY_DP) { |
120 | /* 5B - segement 0~3; | 120 | /* 5B - segement 0~3; |
121 | * 5F - segement 4~7; | 121 | * 5F - segement 4~7; |
122 | * 1, 1C, 2C and 6B, 6F unused; | 122 | * 1, 1C, 2C and 6B, 6F unused; |
123 | */ | 123 | */ |
124 | debug("IPU DMFC ONLY-DP HIGH RES: 5B(0~3), 5F(4~7)\n"); | 124 | debug("IPU DMFC ONLY-DP HIGH RES: 5B(0~3), 5F(4~7)\n"); |
125 | dmfc_wr_chan = 0x00000000; | 125 | dmfc_wr_chan = 0x00000000; |
126 | dmfc_dp_chan = 0x00008c88; | 126 | dmfc_dp_chan = 0x00008c88; |
127 | dmfc_size_28 = 0; | 127 | dmfc_size_28 = 0; |
128 | dmfc_size_29 = 0; | 128 | dmfc_size_29 = 0; |
129 | dmfc_size_24 = 0; | 129 | dmfc_size_24 = 0; |
130 | dmfc_size_27 = 256 * 4; | 130 | dmfc_size_27 = 256 * 4; |
131 | dmfc_size_23 = 256 * 4; | 131 | dmfc_size_23 = 256 * 4; |
132 | } else { | 132 | } else { |
133 | /* 1 - segment 0, 1; | 133 | /* 1 - segment 0, 1; |
134 | * 5B - segement 4, 5; | 134 | * 5B - segement 4, 5; |
135 | * 5F - segement 6, 7; | 135 | * 5F - segement 6, 7; |
136 | * 1C, 2C and 6B, 6F unused; | 136 | * 1C, 2C and 6B, 6F unused; |
137 | */ | 137 | */ |
138 | debug("IPU DMFC NORMAL mode: 1(0~1), 5B(4,5), 5F(6,7)\n"); | 138 | debug("IPU DMFC NORMAL mode: 1(0~1), 5B(4,5), 5F(6,7)\n"); |
139 | dmfc_wr_chan = 0x00000090; | 139 | dmfc_wr_chan = 0x00000090; |
140 | dmfc_dp_chan = 0x00009694; | 140 | dmfc_dp_chan = 0x00009694; |
141 | dmfc_size_28 = 128 * 4; | 141 | dmfc_size_28 = 128 * 4; |
142 | dmfc_size_29 = 0; | 142 | dmfc_size_29 = 0; |
143 | dmfc_size_24 = 0; | 143 | dmfc_size_24 = 0; |
144 | dmfc_size_27 = 128 * 4; | 144 | dmfc_size_27 = 128 * 4; |
145 | dmfc_size_23 = 128 * 4; | 145 | dmfc_size_23 = 128 * 4; |
146 | } | 146 | } |
147 | __raw_writel(dmfc_wr_chan, DMFC_WR_CHAN); | 147 | __raw_writel(dmfc_wr_chan, DMFC_WR_CHAN); |
148 | __raw_writel(0x202020F6, DMFC_WR_CHAN_DEF); | 148 | __raw_writel(0x202020F6, DMFC_WR_CHAN_DEF); |
149 | __raw_writel(dmfc_dp_chan, DMFC_DP_CHAN); | 149 | __raw_writel(dmfc_dp_chan, DMFC_DP_CHAN); |
150 | /* Enable chan 5 watermark set at 5 bursts and clear at 7 bursts */ | 150 | /* Enable chan 5 watermark set at 5 bursts and clear at 7 bursts */ |
151 | __raw_writel(0x2020F6F6, DMFC_DP_CHAN_DEF); | 151 | __raw_writel(0x2020F6F6, DMFC_DP_CHAN_DEF); |
152 | } | 152 | } |
153 | 153 | ||
154 | void ipu_dmfc_set_wait4eot(int dma_chan, int width) | 154 | void ipu_dmfc_set_wait4eot(int dma_chan, int width) |
155 | { | 155 | { |
156 | u32 dmfc_gen1 = __raw_readl(DMFC_GENERAL1); | 156 | u32 dmfc_gen1 = __raw_readl(DMFC_GENERAL1); |
157 | 157 | ||
158 | if (width >= HIGH_RESOLUTION_WIDTH) { | 158 | if (width >= HIGH_RESOLUTION_WIDTH) { |
159 | if (dma_chan == 23) | 159 | if (dma_chan == 23) |
160 | ipu_dmfc_init(DMFC_HIGH_RESOLUTION_DP, 0); | 160 | ipu_dmfc_init(DMFC_HIGH_RESOLUTION_DP, 0); |
161 | else if (dma_chan == 28) | 161 | else if (dma_chan == 28) |
162 | ipu_dmfc_init(DMFC_HIGH_RESOLUTION_DC, 0); | 162 | ipu_dmfc_init(DMFC_HIGH_RESOLUTION_DC, 0); |
163 | } | 163 | } |
164 | 164 | ||
165 | if (dma_chan == 23) { /*5B*/ | 165 | if (dma_chan == 23) { /*5B*/ |
166 | if (dmfc_size_23 / width > 3) | 166 | if (dmfc_size_23 / width > 3) |
167 | dmfc_gen1 |= 1UL << 20; | 167 | dmfc_gen1 |= 1UL << 20; |
168 | else | 168 | else |
169 | dmfc_gen1 &= ~(1UL << 20); | 169 | dmfc_gen1 &= ~(1UL << 20); |
170 | } else if (dma_chan == 24) { /*6B*/ | 170 | } else if (dma_chan == 24) { /*6B*/ |
171 | if (dmfc_size_24 / width > 1) | 171 | if (dmfc_size_24 / width > 1) |
172 | dmfc_gen1 |= 1UL << 22; | 172 | dmfc_gen1 |= 1UL << 22; |
173 | else | 173 | else |
174 | dmfc_gen1 &= ~(1UL << 22); | 174 | dmfc_gen1 &= ~(1UL << 22); |
175 | } else if (dma_chan == 27) { /*5F*/ | 175 | } else if (dma_chan == 27) { /*5F*/ |
176 | if (dmfc_size_27 / width > 2) | 176 | if (dmfc_size_27 / width > 2) |
177 | dmfc_gen1 |= 1UL << 21; | 177 | dmfc_gen1 |= 1UL << 21; |
178 | else | 178 | else |
179 | dmfc_gen1 &= ~(1UL << 21); | 179 | dmfc_gen1 &= ~(1UL << 21); |
180 | } else if (dma_chan == 28) { /*1*/ | 180 | } else if (dma_chan == 28) { /*1*/ |
181 | if (dmfc_size_28 / width > 2) | 181 | if (dmfc_size_28 / width > 2) |
182 | dmfc_gen1 |= 1UL << 16; | 182 | dmfc_gen1 |= 1UL << 16; |
183 | else | 183 | else |
184 | dmfc_gen1 &= ~(1UL << 16); | 184 | dmfc_gen1 &= ~(1UL << 16); |
185 | } else if (dma_chan == 29) { /*6F*/ | 185 | } else if (dma_chan == 29) { /*6F*/ |
186 | if (dmfc_size_29 / width > 1) | 186 | if (dmfc_size_29 / width > 1) |
187 | dmfc_gen1 |= 1UL << 23; | 187 | dmfc_gen1 |= 1UL << 23; |
188 | else | 188 | else |
189 | dmfc_gen1 &= ~(1UL << 23); | 189 | dmfc_gen1 &= ~(1UL << 23); |
190 | } | 190 | } |
191 | 191 | ||
192 | __raw_writel(dmfc_gen1, DMFC_GENERAL1); | 192 | __raw_writel(dmfc_gen1, DMFC_GENERAL1); |
193 | } | 193 | } |
194 | 194 | ||
195 | static void ipu_di_data_wave_config(int di, | 195 | static void ipu_di_data_wave_config(int di, |
196 | int wave_gen, | 196 | int wave_gen, |
197 | int access_size, int component_size) | 197 | int access_size, int component_size) |
198 | { | 198 | { |
199 | u32 reg; | 199 | u32 reg; |
200 | reg = (access_size << DI_DW_GEN_ACCESS_SIZE_OFFSET) | | 200 | reg = (access_size << DI_DW_GEN_ACCESS_SIZE_OFFSET) | |
201 | (component_size << DI_DW_GEN_COMPONENT_SIZE_OFFSET); | 201 | (component_size << DI_DW_GEN_COMPONENT_SIZE_OFFSET); |
202 | __raw_writel(reg, DI_DW_GEN(di, wave_gen)); | 202 | __raw_writel(reg, DI_DW_GEN(di, wave_gen)); |
203 | } | 203 | } |
204 | 204 | ||
205 | static void ipu_di_data_pin_config(int di, int wave_gen, int di_pin, int set, | 205 | static void ipu_di_data_pin_config(int di, int wave_gen, int di_pin, int set, |
206 | int up, int down) | 206 | int up, int down) |
207 | { | 207 | { |
208 | u32 reg; | 208 | u32 reg; |
209 | 209 | ||
210 | reg = __raw_readl(DI_DW_GEN(di, wave_gen)); | 210 | reg = __raw_readl(DI_DW_GEN(di, wave_gen)); |
211 | reg &= ~(0x3 << (di_pin * 2)); | 211 | reg &= ~(0x3 << (di_pin * 2)); |
212 | reg |= set << (di_pin * 2); | 212 | reg |= set << (di_pin * 2); |
213 | __raw_writel(reg, DI_DW_GEN(di, wave_gen)); | 213 | __raw_writel(reg, DI_DW_GEN(di, wave_gen)); |
214 | 214 | ||
215 | __raw_writel((down << 16) | up, DI_DW_SET(di, wave_gen, set)); | 215 | __raw_writel((down << 16) | up, DI_DW_SET(di, wave_gen, set)); |
216 | } | 216 | } |
217 | 217 | ||
218 | static void ipu_di_sync_config(int di, int wave_gen, | 218 | static void ipu_di_sync_config(int di, int wave_gen, |
219 | int run_count, int run_src, | 219 | int run_count, int run_src, |
220 | int offset_count, int offset_src, | 220 | int offset_count, int offset_src, |
221 | int repeat_count, int cnt_clr_src, | 221 | int repeat_count, int cnt_clr_src, |
222 | int cnt_polarity_gen_en, | 222 | int cnt_polarity_gen_en, |
223 | int cnt_polarity_clr_src, | 223 | int cnt_polarity_clr_src, |
224 | int cnt_polarity_trigger_src, | 224 | int cnt_polarity_trigger_src, |
225 | int cnt_up, int cnt_down) | 225 | int cnt_up, int cnt_down) |
226 | { | 226 | { |
227 | u32 reg; | 227 | u32 reg; |
228 | 228 | ||
229 | if ((run_count >= 0x1000) || (offset_count >= 0x1000) || | 229 | if ((run_count >= 0x1000) || (offset_count >= 0x1000) || |
230 | (repeat_count >= 0x1000) || | 230 | (repeat_count >= 0x1000) || |
231 | (cnt_up >= 0x400) || (cnt_down >= 0x400)) { | 231 | (cnt_up >= 0x400) || (cnt_down >= 0x400)) { |
232 | printf("DI%d counters out of range.\n", di); | 232 | printf("DI%d counters out of range.\n", di); |
233 | return; | 233 | return; |
234 | } | 234 | } |
235 | 235 | ||
236 | reg = (run_count << 19) | (++run_src << 16) | | 236 | reg = (run_count << 19) | (++run_src << 16) | |
237 | (offset_count << 3) | ++offset_src; | 237 | (offset_count << 3) | ++offset_src; |
238 | __raw_writel(reg, DI_SW_GEN0(di, wave_gen)); | 238 | __raw_writel(reg, DI_SW_GEN0(di, wave_gen)); |
239 | reg = (cnt_polarity_gen_en << 29) | (++cnt_clr_src << 25) | | 239 | reg = (cnt_polarity_gen_en << 29) | (++cnt_clr_src << 25) | |
240 | (++cnt_polarity_trigger_src << 12) | (++cnt_polarity_clr_src << 9); | 240 | (++cnt_polarity_trigger_src << 12) | (++cnt_polarity_clr_src << 9); |
241 | reg |= (cnt_down << 16) | cnt_up; | 241 | reg |= (cnt_down << 16) | cnt_up; |
242 | if (repeat_count == 0) { | 242 | if (repeat_count == 0) { |
243 | /* Enable auto reload */ | 243 | /* Enable auto reload */ |
244 | reg |= 0x10000000; | 244 | reg |= 0x10000000; |
245 | } | 245 | } |
246 | __raw_writel(reg, DI_SW_GEN1(di, wave_gen)); | 246 | __raw_writel(reg, DI_SW_GEN1(di, wave_gen)); |
247 | reg = __raw_readl(DI_STP_REP(di, wave_gen)); | 247 | reg = __raw_readl(DI_STP_REP(di, wave_gen)); |
248 | reg &= ~(0xFFFF << (16 * ((wave_gen - 1) & 0x1))); | 248 | reg &= ~(0xFFFF << (16 * ((wave_gen - 1) & 0x1))); |
249 | reg |= repeat_count << (16 * ((wave_gen - 1) & 0x1)); | 249 | reg |= repeat_count << (16 * ((wave_gen - 1) & 0x1)); |
250 | __raw_writel(reg, DI_STP_REP(di, wave_gen)); | 250 | __raw_writel(reg, DI_STP_REP(di, wave_gen)); |
251 | } | 251 | } |
252 | 252 | ||
253 | static void ipu_dc_map_config(int map, int byte_num, int offset, int mask) | 253 | static void ipu_dc_map_config(int map, int byte_num, int offset, int mask) |
254 | { | 254 | { |
255 | int ptr = map * 3 + byte_num; | 255 | int ptr = map * 3 + byte_num; |
256 | u32 reg; | 256 | u32 reg; |
257 | 257 | ||
258 | reg = __raw_readl(DC_MAP_CONF_VAL(ptr)); | 258 | reg = __raw_readl(DC_MAP_CONF_VAL(ptr)); |
259 | reg &= ~(0xFFFF << (16 * (ptr & 0x1))); | 259 | reg &= ~(0xFFFF << (16 * (ptr & 0x1))); |
260 | reg |= ((offset << 8) | mask) << (16 * (ptr & 0x1)); | 260 | reg |= ((offset << 8) | mask) << (16 * (ptr & 0x1)); |
261 | __raw_writel(reg, DC_MAP_CONF_VAL(ptr)); | 261 | __raw_writel(reg, DC_MAP_CONF_VAL(ptr)); |
262 | 262 | ||
263 | reg = __raw_readl(DC_MAP_CONF_PTR(map)); | 263 | reg = __raw_readl(DC_MAP_CONF_PTR(map)); |
264 | reg &= ~(0x1F << ((16 * (map & 0x1)) + (5 * byte_num))); | 264 | reg &= ~(0x1F << ((16 * (map & 0x1)) + (5 * byte_num))); |
265 | reg |= ptr << ((16 * (map & 0x1)) + (5 * byte_num)); | 265 | reg |= ptr << ((16 * (map & 0x1)) + (5 * byte_num)); |
266 | __raw_writel(reg, DC_MAP_CONF_PTR(map)); | 266 | __raw_writel(reg, DC_MAP_CONF_PTR(map)); |
267 | } | 267 | } |
268 | 268 | ||
269 | static void ipu_dc_map_clear(int map) | 269 | static void ipu_dc_map_clear(int map) |
270 | { | 270 | { |
271 | u32 reg = __raw_readl(DC_MAP_CONF_PTR(map)); | 271 | u32 reg = __raw_readl(DC_MAP_CONF_PTR(map)); |
272 | __raw_writel(reg & ~(0xFFFF << (16 * (map & 0x1))), | 272 | __raw_writel(reg & ~(0xFFFF << (16 * (map & 0x1))), |
273 | DC_MAP_CONF_PTR(map)); | 273 | DC_MAP_CONF_PTR(map)); |
274 | } | 274 | } |
275 | 275 | ||
276 | static void ipu_dc_write_tmpl(int word, u32 opcode, u32 operand, int map, | 276 | static void ipu_dc_write_tmpl(int word, u32 opcode, u32 operand, int map, |
277 | int wave, int glue, int sync) | 277 | int wave, int glue, int sync) |
278 | { | 278 | { |
279 | u32 reg; | 279 | u32 reg; |
280 | int stop = 1; | 280 | int stop = 1; |
281 | 281 | ||
282 | reg = sync; | 282 | reg = sync; |
283 | reg |= (glue << 4); | 283 | reg |= (glue << 4); |
284 | reg |= (++wave << 11); | 284 | reg |= (++wave << 11); |
285 | reg |= (++map << 15); | 285 | reg |= (++map << 15); |
286 | reg |= (operand << 20) & 0xFFF00000; | 286 | reg |= (operand << 20) & 0xFFF00000; |
287 | __raw_writel(reg, ipu_dc_tmpl_reg + word * 2); | 287 | __raw_writel(reg, ipu_dc_tmpl_reg + word * 2); |
288 | 288 | ||
289 | reg = (operand >> 12); | 289 | reg = (operand >> 12); |
290 | reg |= opcode << 4; | 290 | reg |= opcode << 4; |
291 | reg |= (stop << 9); | 291 | reg |= (stop << 9); |
292 | __raw_writel(reg, ipu_dc_tmpl_reg + word * 2 + 1); | 292 | __raw_writel(reg, ipu_dc_tmpl_reg + word * 2 + 1); |
293 | } | 293 | } |
294 | 294 | ||
295 | static void ipu_dc_link_event(int chan, int event, int addr, int priority) | 295 | static void ipu_dc_link_event(int chan, int event, int addr, int priority) |
296 | { | 296 | { |
297 | u32 reg; | 297 | u32 reg; |
298 | 298 | ||
299 | reg = __raw_readl(DC_RL_CH(chan, event)); | 299 | reg = __raw_readl(DC_RL_CH(chan, event)); |
300 | reg &= ~(0xFFFF << (16 * (event & 0x1))); | 300 | reg &= ~(0xFFFF << (16 * (event & 0x1))); |
301 | reg |= ((addr << 8) | priority) << (16 * (event & 0x1)); | 301 | reg |= ((addr << 8) | priority) << (16 * (event & 0x1)); |
302 | __raw_writel(reg, DC_RL_CH(chan, event)); | 302 | __raw_writel(reg, DC_RL_CH(chan, event)); |
303 | } | 303 | } |
304 | 304 | ||
305 | /* Y = R * 1.200 + G * 2.343 + B * .453 + 0.250; | 305 | /* Y = R * 1.200 + G * 2.343 + B * .453 + 0.250; |
306 | * U = R * -.672 + G * -1.328 + B * 2.000 + 512.250.; | 306 | * U = R * -.672 + G * -1.328 + B * 2.000 + 512.250.; |
307 | * V = R * 2.000 + G * -1.672 + B * -.328 + 512.250.; | 307 | * V = R * 2.000 + G * -1.672 + B * -.328 + 512.250.; |
308 | */ | 308 | */ |
309 | static const int rgb2ycbcr_coeff[5][3] = { | 309 | static const int rgb2ycbcr_coeff[5][3] = { |
310 | {0x4D, 0x96, 0x1D}, | 310 | {0x4D, 0x96, 0x1D}, |
311 | {0x3D5, 0x3AB, 0x80}, | 311 | {0x3D5, 0x3AB, 0x80}, |
312 | {0x80, 0x395, 0x3EB}, | 312 | {0x80, 0x395, 0x3EB}, |
313 | {0x0000, 0x0200, 0x0200}, /* B0, B1, B2 */ | 313 | {0x0000, 0x0200, 0x0200}, /* B0, B1, B2 */ |
314 | {0x2, 0x2, 0x2}, /* S0, S1, S2 */ | 314 | {0x2, 0x2, 0x2}, /* S0, S1, S2 */ |
315 | }; | 315 | }; |
316 | 316 | ||
317 | /* R = (1.164 * (Y - 16)) + (1.596 * (Cr - 128)); | 317 | /* R = (1.164 * (Y - 16)) + (1.596 * (Cr - 128)); |
318 | * G = (1.164 * (Y - 16)) - (0.392 * (Cb - 128)) - (0.813 * (Cr - 128)); | 318 | * G = (1.164 * (Y - 16)) - (0.392 * (Cb - 128)) - (0.813 * (Cr - 128)); |
319 | * B = (1.164 * (Y - 16)) + (2.017 * (Cb - 128); | 319 | * B = (1.164 * (Y - 16)) + (2.017 * (Cb - 128); |
320 | */ | 320 | */ |
321 | static const int ycbcr2rgb_coeff[5][3] = { | 321 | static const int ycbcr2rgb_coeff[5][3] = { |
322 | {0x095, 0x000, 0x0CC}, | 322 | {0x095, 0x000, 0x0CC}, |
323 | {0x095, 0x3CE, 0x398}, | 323 | {0x095, 0x3CE, 0x398}, |
324 | {0x095, 0x0FF, 0x000}, | 324 | {0x095, 0x0FF, 0x000}, |
325 | {0x3E42, 0x010A, 0x3DD6}, /*B0,B1,B2 */ | 325 | {0x3E42, 0x010A, 0x3DD6}, /*B0,B1,B2 */ |
326 | {0x1, 0x1, 0x1}, /*S0,S1,S2 */ | 326 | {0x1, 0x1, 0x1}, /*S0,S1,S2 */ |
327 | }; | 327 | }; |
328 | 328 | ||
329 | #define mask_a(a) ((u32)(a) & 0x3FF) | 329 | #define mask_a(a) ((u32)(a) & 0x3FF) |
330 | #define mask_b(b) ((u32)(b) & 0x3FFF) | 330 | #define mask_b(b) ((u32)(b) & 0x3FFF) |
331 | 331 | ||
332 | /* Pls keep S0, S1 and S2 as 0x2 by using this convertion */ | 332 | /* Pls keep S0, S1 and S2 as 0x2 by using this convertion */ |
333 | static int rgb_to_yuv(int n, int red, int green, int blue) | 333 | static int rgb_to_yuv(int n, int red, int green, int blue) |
334 | { | 334 | { |
335 | int c; | 335 | int c; |
336 | c = red * rgb2ycbcr_coeff[n][0]; | 336 | c = red * rgb2ycbcr_coeff[n][0]; |
337 | c += green * rgb2ycbcr_coeff[n][1]; | 337 | c += green * rgb2ycbcr_coeff[n][1]; |
338 | c += blue * rgb2ycbcr_coeff[n][2]; | 338 | c += blue * rgb2ycbcr_coeff[n][2]; |
339 | c /= 16; | 339 | c /= 16; |
340 | c += rgb2ycbcr_coeff[3][n] * 4; | 340 | c += rgb2ycbcr_coeff[3][n] * 4; |
341 | c += 8; | 341 | c += 8; |
342 | c /= 16; | 342 | c /= 16; |
343 | if (c < 0) | 343 | if (c < 0) |
344 | c = 0; | 344 | c = 0; |
345 | if (c > 255) | 345 | if (c > 255) |
346 | c = 255; | 346 | c = 255; |
347 | return c; | 347 | return c; |
348 | } | 348 | } |
349 | 349 | ||
350 | /* | 350 | /* |
351 | * Row is for BG: RGB2YUV YUV2RGB RGB2RGB YUV2YUV CSC_NONE | 351 | * Row is for BG: RGB2YUV YUV2RGB RGB2RGB YUV2YUV CSC_NONE |
352 | * Column is for FG: RGB2YUV YUV2RGB RGB2RGB YUV2YUV CSC_NONE | 352 | * Column is for FG: RGB2YUV YUV2RGB RGB2RGB YUV2YUV CSC_NONE |
353 | */ | 353 | */ |
354 | static struct dp_csc_param_t dp_csc_array[CSC_NUM][CSC_NUM] = { | 354 | static struct dp_csc_param_t dp_csc_array[CSC_NUM][CSC_NUM] = { |
355 | { | 355 | { |
356 | {DP_COM_CONF_CSC_DEF_BOTH, &rgb2ycbcr_coeff}, | 356 | {DP_COM_CONF_CSC_DEF_BOTH, &rgb2ycbcr_coeff}, |
357 | {0, 0}, | 357 | {0, 0}, |
358 | {0, 0}, | 358 | {0, 0}, |
359 | {DP_COM_CONF_CSC_DEF_BG, &rgb2ycbcr_coeff}, | 359 | {DP_COM_CONF_CSC_DEF_BG, &rgb2ycbcr_coeff}, |
360 | {DP_COM_CONF_CSC_DEF_BG, &rgb2ycbcr_coeff} | 360 | {DP_COM_CONF_CSC_DEF_BG, &rgb2ycbcr_coeff} |
361 | }, | 361 | }, |
362 | { | 362 | { |
363 | {0, 0}, | 363 | {0, 0}, |
364 | {DP_COM_CONF_CSC_DEF_BOTH, &ycbcr2rgb_coeff}, | 364 | {DP_COM_CONF_CSC_DEF_BOTH, &ycbcr2rgb_coeff}, |
365 | {DP_COM_CONF_CSC_DEF_BG, &ycbcr2rgb_coeff}, | 365 | {DP_COM_CONF_CSC_DEF_BG, &ycbcr2rgb_coeff}, |
366 | {0, 0}, | 366 | {0, 0}, |
367 | {DP_COM_CONF_CSC_DEF_BG, &ycbcr2rgb_coeff} | 367 | {DP_COM_CONF_CSC_DEF_BG, &ycbcr2rgb_coeff} |
368 | }, | 368 | }, |
369 | { | 369 | { |
370 | {0, 0}, | 370 | {0, 0}, |
371 | {DP_COM_CONF_CSC_DEF_FG, &ycbcr2rgb_coeff}, | 371 | {DP_COM_CONF_CSC_DEF_FG, &ycbcr2rgb_coeff}, |
372 | {0, 0}, | 372 | {0, 0}, |
373 | {0, 0}, | 373 | {0, 0}, |
374 | {0, 0} | 374 | {0, 0} |
375 | }, | 375 | }, |
376 | { | 376 | { |
377 | {DP_COM_CONF_CSC_DEF_FG, &rgb2ycbcr_coeff}, | 377 | {DP_COM_CONF_CSC_DEF_FG, &rgb2ycbcr_coeff}, |
378 | {0, 0}, | 378 | {0, 0}, |
379 | {0, 0}, | 379 | {0, 0}, |
380 | {0, 0}, | 380 | {0, 0}, |
381 | {0, 0} | 381 | {0, 0} |
382 | }, | 382 | }, |
383 | { | 383 | { |
384 | {DP_COM_CONF_CSC_DEF_FG, &rgb2ycbcr_coeff}, | 384 | {DP_COM_CONF_CSC_DEF_FG, &rgb2ycbcr_coeff}, |
385 | {DP_COM_CONF_CSC_DEF_FG, &ycbcr2rgb_coeff}, | 385 | {DP_COM_CONF_CSC_DEF_FG, &ycbcr2rgb_coeff}, |
386 | {0, 0}, | 386 | {0, 0}, |
387 | {0, 0}, | 387 | {0, 0}, |
388 | {0, 0} | 388 | {0, 0} |
389 | } | 389 | } |
390 | }; | 390 | }; |
391 | 391 | ||
392 | static enum csc_type_t fg_csc_type = CSC_NONE, bg_csc_type = CSC_NONE; | 392 | static enum csc_type_t fg_csc_type = CSC_NONE, bg_csc_type = CSC_NONE; |
393 | static int color_key_4rgb = 1; | 393 | static int color_key_4rgb = 1; |
394 | 394 | ||
395 | void ipu_dp_csc_setup(int dp, struct dp_csc_param_t dp_csc_param, | 395 | void ipu_dp_csc_setup(int dp, struct dp_csc_param_t dp_csc_param, |
396 | unsigned char srm_mode_update) | 396 | unsigned char srm_mode_update) |
397 | { | 397 | { |
398 | u32 reg; | 398 | u32 reg; |
399 | const int (*coeff)[5][3]; | 399 | const int (*coeff)[5][3]; |
400 | 400 | ||
401 | if (dp_csc_param.mode >= 0) { | 401 | if (dp_csc_param.mode >= 0) { |
402 | reg = __raw_readl(DP_COM_CONF(dp)); | 402 | reg = __raw_readl(DP_COM_CONF()); |
403 | reg &= ~DP_COM_CONF_CSC_DEF_MASK; | 403 | reg &= ~DP_COM_CONF_CSC_DEF_MASK; |
404 | reg |= dp_csc_param.mode; | 404 | reg |= dp_csc_param.mode; |
405 | __raw_writel(reg, DP_COM_CONF(dp)); | 405 | __raw_writel(reg, DP_COM_CONF()); |
406 | } | 406 | } |
407 | 407 | ||
408 | coeff = dp_csc_param.coeff; | 408 | coeff = dp_csc_param.coeff; |
409 | 409 | ||
410 | if (coeff) { | 410 | if (coeff) { |
411 | __raw_writel(mask_a((*coeff)[0][0]) | | 411 | __raw_writel(mask_a((*coeff)[0][0]) | |
412 | (mask_a((*coeff)[0][1]) << 16), DP_CSC_A_0(dp)); | 412 | (mask_a((*coeff)[0][1]) << 16), DP_CSC_A_0()); |
413 | __raw_writel(mask_a((*coeff)[0][2]) | | 413 | __raw_writel(mask_a((*coeff)[0][2]) | |
414 | (mask_a((*coeff)[1][0]) << 16), DP_CSC_A_1(dp)); | 414 | (mask_a((*coeff)[1][0]) << 16), DP_CSC_A_1()); |
415 | __raw_writel(mask_a((*coeff)[1][1]) | | 415 | __raw_writel(mask_a((*coeff)[1][1]) | |
416 | (mask_a((*coeff)[1][2]) << 16), DP_CSC_A_2(dp)); | 416 | (mask_a((*coeff)[1][2]) << 16), DP_CSC_A_2()); |
417 | __raw_writel(mask_a((*coeff)[2][0]) | | 417 | __raw_writel(mask_a((*coeff)[2][0]) | |
418 | (mask_a((*coeff)[2][1]) << 16), DP_CSC_A_3(dp)); | 418 | (mask_a((*coeff)[2][1]) << 16), DP_CSC_A_3()); |
419 | __raw_writel(mask_a((*coeff)[2][2]) | | 419 | __raw_writel(mask_a((*coeff)[2][2]) | |
420 | (mask_b((*coeff)[3][0]) << 16) | | 420 | (mask_b((*coeff)[3][0]) << 16) | |
421 | ((*coeff)[4][0] << 30), DP_CSC_0(dp)); | 421 | ((*coeff)[4][0] << 30), DP_CSC_0()); |
422 | __raw_writel(mask_b((*coeff)[3][1]) | ((*coeff)[4][1] << 14) | | 422 | __raw_writel(mask_b((*coeff)[3][1]) | ((*coeff)[4][1] << 14) | |
423 | (mask_b((*coeff)[3][2]) << 16) | | 423 | (mask_b((*coeff)[3][2]) << 16) | |
424 | ((*coeff)[4][2] << 30), DP_CSC_1(dp)); | 424 | ((*coeff)[4][2] << 30), DP_CSC_1()); |
425 | } | 425 | } |
426 | 426 | ||
427 | if (srm_mode_update) { | 427 | if (srm_mode_update) { |
428 | reg = __raw_readl(IPU_SRM_PRI2) | 0x8; | 428 | reg = __raw_readl(IPU_SRM_PRI2) | 0x8; |
429 | __raw_writel(reg, IPU_SRM_PRI2); | 429 | __raw_writel(reg, IPU_SRM_PRI2); |
430 | } | 430 | } |
431 | } | 431 | } |
432 | 432 | ||
433 | int ipu_dp_init(ipu_channel_t channel, uint32_t in_pixel_fmt, | 433 | int ipu_dp_init(ipu_channel_t channel, uint32_t in_pixel_fmt, |
434 | uint32_t out_pixel_fmt) | 434 | uint32_t out_pixel_fmt) |
435 | { | 435 | { |
436 | int in_fmt, out_fmt; | 436 | int in_fmt, out_fmt; |
437 | int dp; | 437 | int dp; |
438 | int partial = 0; | 438 | int partial = 0; |
439 | uint32_t reg; | 439 | uint32_t reg; |
440 | 440 | ||
441 | if (channel == MEM_FG_SYNC) { | 441 | if (channel == MEM_FG_SYNC) { |
442 | dp = DP_SYNC; | 442 | dp = DP_SYNC; |
443 | partial = 1; | 443 | partial = 1; |
444 | } else if (channel == MEM_BG_SYNC) { | 444 | } else if (channel == MEM_BG_SYNC) { |
445 | dp = DP_SYNC; | 445 | dp = DP_SYNC; |
446 | partial = 0; | 446 | partial = 0; |
447 | } else if (channel == MEM_BG_ASYNC0) { | 447 | } else if (channel == MEM_BG_ASYNC0) { |
448 | dp = DP_ASYNC0; | 448 | dp = DP_ASYNC0; |
449 | partial = 0; | 449 | partial = 0; |
450 | } else { | 450 | } else { |
451 | return -EINVAL; | 451 | return -EINVAL; |
452 | } | 452 | } |
453 | 453 | ||
454 | in_fmt = format_to_colorspace(in_pixel_fmt); | 454 | in_fmt = format_to_colorspace(in_pixel_fmt); |
455 | out_fmt = format_to_colorspace(out_pixel_fmt); | 455 | out_fmt = format_to_colorspace(out_pixel_fmt); |
456 | 456 | ||
457 | if (partial) { | 457 | if (partial) { |
458 | if (in_fmt == RGB) { | 458 | if (in_fmt == RGB) { |
459 | if (out_fmt == RGB) | 459 | if (out_fmt == RGB) |
460 | fg_csc_type = RGB2RGB; | 460 | fg_csc_type = RGB2RGB; |
461 | else | 461 | else |
462 | fg_csc_type = RGB2YUV; | 462 | fg_csc_type = RGB2YUV; |
463 | } else { | 463 | } else { |
464 | if (out_fmt == RGB) | 464 | if (out_fmt == RGB) |
465 | fg_csc_type = YUV2RGB; | 465 | fg_csc_type = YUV2RGB; |
466 | else | 466 | else |
467 | fg_csc_type = YUV2YUV; | 467 | fg_csc_type = YUV2YUV; |
468 | } | 468 | } |
469 | } else { | 469 | } else { |
470 | if (in_fmt == RGB) { | 470 | if (in_fmt == RGB) { |
471 | if (out_fmt == RGB) | 471 | if (out_fmt == RGB) |
472 | bg_csc_type = RGB2RGB; | 472 | bg_csc_type = RGB2RGB; |
473 | else | 473 | else |
474 | bg_csc_type = RGB2YUV; | 474 | bg_csc_type = RGB2YUV; |
475 | } else { | 475 | } else { |
476 | if (out_fmt == RGB) | 476 | if (out_fmt == RGB) |
477 | bg_csc_type = YUV2RGB; | 477 | bg_csc_type = YUV2RGB; |
478 | else | 478 | else |
479 | bg_csc_type = YUV2YUV; | 479 | bg_csc_type = YUV2YUV; |
480 | } | 480 | } |
481 | } | 481 | } |
482 | 482 | ||
483 | /* Transform color key from rgb to yuv if CSC is enabled */ | 483 | /* Transform color key from rgb to yuv if CSC is enabled */ |
484 | reg = __raw_readl(DP_COM_CONF(dp)); | 484 | reg = __raw_readl(DP_COM_CONF()); |
485 | if (color_key_4rgb && (reg & DP_COM_CONF_GWCKE) && | 485 | if (color_key_4rgb && (reg & DP_COM_CONF_GWCKE) && |
486 | (((fg_csc_type == RGB2YUV) && (bg_csc_type == YUV2YUV)) || | 486 | (((fg_csc_type == RGB2YUV) && (bg_csc_type == YUV2YUV)) || |
487 | ((fg_csc_type == YUV2YUV) && (bg_csc_type == RGB2YUV)) || | 487 | ((fg_csc_type == YUV2YUV) && (bg_csc_type == RGB2YUV)) || |
488 | ((fg_csc_type == YUV2YUV) && (bg_csc_type == YUV2YUV)) || | 488 | ((fg_csc_type == YUV2YUV) && (bg_csc_type == YUV2YUV)) || |
489 | ((fg_csc_type == YUV2RGB) && (bg_csc_type == YUV2RGB)))) { | 489 | ((fg_csc_type == YUV2RGB) && (bg_csc_type == YUV2RGB)))) { |
490 | int red, green, blue; | 490 | int red, green, blue; |
491 | int y, u, v; | 491 | int y, u, v; |
492 | uint32_t color_key = __raw_readl(DP_GRAPH_WIND_CTRL(dp)) & | 492 | uint32_t color_key = __raw_readl(DP_GRAPH_WIND_CTRL()) & |
493 | 0xFFFFFFL; | 493 | 0xFFFFFFL; |
494 | 494 | ||
495 | debug("_ipu_dp_init color key 0x%x need change to yuv fmt!\n", | 495 | debug("_ipu_dp_init color key 0x%x need change to yuv fmt!\n", |
496 | color_key); | 496 | color_key); |
497 | 497 | ||
498 | red = (color_key >> 16) & 0xFF; | 498 | red = (color_key >> 16) & 0xFF; |
499 | green = (color_key >> 8) & 0xFF; | 499 | green = (color_key >> 8) & 0xFF; |
500 | blue = color_key & 0xFF; | 500 | blue = color_key & 0xFF; |
501 | 501 | ||
502 | y = rgb_to_yuv(0, red, green, blue); | 502 | y = rgb_to_yuv(0, red, green, blue); |
503 | u = rgb_to_yuv(1, red, green, blue); | 503 | u = rgb_to_yuv(1, red, green, blue); |
504 | v = rgb_to_yuv(2, red, green, blue); | 504 | v = rgb_to_yuv(2, red, green, blue); |
505 | color_key = (y << 16) | (u << 8) | v; | 505 | color_key = (y << 16) | (u << 8) | v; |
506 | 506 | ||
507 | reg = __raw_readl(DP_GRAPH_WIND_CTRL(dp)) & 0xFF000000L; | 507 | reg = __raw_readl(DP_GRAPH_WIND_CTRL()) & 0xFF000000L; |
508 | __raw_writel(reg | color_key, DP_GRAPH_WIND_CTRL(dp)); | 508 | __raw_writel(reg | color_key, DP_GRAPH_WIND_CTRL()); |
509 | color_key_4rgb = 0; | 509 | color_key_4rgb = 0; |
510 | 510 | ||
511 | debug("_ipu_dp_init color key change to yuv fmt 0x%x!\n", | 511 | debug("_ipu_dp_init color key change to yuv fmt 0x%x!\n", |
512 | color_key); | 512 | color_key); |
513 | } | 513 | } |
514 | 514 | ||
515 | ipu_dp_csc_setup(dp, dp_csc_array[bg_csc_type][fg_csc_type], 1); | 515 | ipu_dp_csc_setup(dp, dp_csc_array[bg_csc_type][fg_csc_type], 1); |
516 | 516 | ||
517 | return 0; | 517 | return 0; |
518 | } | 518 | } |
519 | 519 | ||
520 | void ipu_dp_uninit(ipu_channel_t channel) | 520 | void ipu_dp_uninit(ipu_channel_t channel) |
521 | { | 521 | { |
522 | int dp; | 522 | int dp; |
523 | int partial = 0; | 523 | int partial = 0; |
524 | 524 | ||
525 | if (channel == MEM_FG_SYNC) { | 525 | if (channel == MEM_FG_SYNC) { |
526 | dp = DP_SYNC; | 526 | dp = DP_SYNC; |
527 | partial = 1; | 527 | partial = 1; |
528 | } else if (channel == MEM_BG_SYNC) { | 528 | } else if (channel == MEM_BG_SYNC) { |
529 | dp = DP_SYNC; | 529 | dp = DP_SYNC; |
530 | partial = 0; | 530 | partial = 0; |
531 | } else if (channel == MEM_BG_ASYNC0) { | 531 | } else if (channel == MEM_BG_ASYNC0) { |
532 | dp = DP_ASYNC0; | 532 | dp = DP_ASYNC0; |
533 | partial = 0; | 533 | partial = 0; |
534 | } else { | 534 | } else { |
535 | return; | 535 | return; |
536 | } | 536 | } |
537 | 537 | ||
538 | if (partial) | 538 | if (partial) |
539 | fg_csc_type = CSC_NONE; | 539 | fg_csc_type = CSC_NONE; |
540 | else | 540 | else |
541 | bg_csc_type = CSC_NONE; | 541 | bg_csc_type = CSC_NONE; |
542 | 542 | ||
543 | ipu_dp_csc_setup(dp, dp_csc_array[bg_csc_type][fg_csc_type], 0); | 543 | ipu_dp_csc_setup(dp, dp_csc_array[bg_csc_type][fg_csc_type], 0); |
544 | } | 544 | } |
545 | 545 | ||
546 | void ipu_dc_init(int dc_chan, int di, unsigned char interlaced) | 546 | void ipu_dc_init(int dc_chan, int di, unsigned char interlaced) |
547 | { | 547 | { |
548 | u32 reg = 0; | 548 | u32 reg = 0; |
549 | 549 | ||
550 | if ((dc_chan == 1) || (dc_chan == 5)) { | 550 | if ((dc_chan == 1) || (dc_chan == 5)) { |
551 | if (interlaced) { | 551 | if (interlaced) { |
552 | ipu_dc_link_event(dc_chan, DC_EVT_NL, 0, 3); | 552 | ipu_dc_link_event(dc_chan, DC_EVT_NL, 0, 3); |
553 | ipu_dc_link_event(dc_chan, DC_EVT_EOL, 0, 2); | 553 | ipu_dc_link_event(dc_chan, DC_EVT_EOL, 0, 2); |
554 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_DATA, 0, 1); | 554 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_DATA, 0, 1); |
555 | } else { | 555 | } else { |
556 | if (di) { | 556 | if (di) { |
557 | ipu_dc_link_event(dc_chan, DC_EVT_NL, 2, 3); | 557 | ipu_dc_link_event(dc_chan, DC_EVT_NL, 2, 3); |
558 | ipu_dc_link_event(dc_chan, DC_EVT_EOL, 3, 2); | 558 | ipu_dc_link_event(dc_chan, DC_EVT_EOL, 3, 2); |
559 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_DATA, | 559 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_DATA, |
560 | 4, 1); | 560 | 4, 1); |
561 | } else { | 561 | } else { |
562 | ipu_dc_link_event(dc_chan, DC_EVT_NL, 5, 3); | 562 | ipu_dc_link_event(dc_chan, DC_EVT_NL, 5, 3); |
563 | ipu_dc_link_event(dc_chan, DC_EVT_EOL, 6, 2); | 563 | ipu_dc_link_event(dc_chan, DC_EVT_EOL, 6, 2); |
564 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_DATA, | 564 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_DATA, |
565 | 7, 1); | 565 | 7, 1); |
566 | } | 566 | } |
567 | } | 567 | } |
568 | ipu_dc_link_event(dc_chan, DC_EVT_NF, 0, 0); | 568 | ipu_dc_link_event(dc_chan, DC_EVT_NF, 0, 0); |
569 | ipu_dc_link_event(dc_chan, DC_EVT_NFIELD, 0, 0); | 569 | ipu_dc_link_event(dc_chan, DC_EVT_NFIELD, 0, 0); |
570 | ipu_dc_link_event(dc_chan, DC_EVT_EOF, 0, 0); | 570 | ipu_dc_link_event(dc_chan, DC_EVT_EOF, 0, 0); |
571 | ipu_dc_link_event(dc_chan, DC_EVT_EOFIELD, 0, 0); | 571 | ipu_dc_link_event(dc_chan, DC_EVT_EOFIELD, 0, 0); |
572 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_CHAN, 0, 0); | 572 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_CHAN, 0, 0); |
573 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_ADDR, 0, 0); | 573 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_ADDR, 0, 0); |
574 | 574 | ||
575 | reg = 0x2; | 575 | reg = 0x2; |
576 | reg |= DC_DISP_ID_SYNC(di) << DC_WR_CH_CONF_PROG_DISP_ID_OFFSET; | 576 | reg |= DC_DISP_ID_SYNC(di) << DC_WR_CH_CONF_PROG_DISP_ID_OFFSET; |
577 | reg |= di << 2; | 577 | reg |= di << 2; |
578 | if (interlaced) | 578 | if (interlaced) |
579 | reg |= DC_WR_CH_CONF_FIELD_MODE; | 579 | reg |= DC_WR_CH_CONF_FIELD_MODE; |
580 | } else if ((dc_chan == 8) || (dc_chan == 9)) { | 580 | } else if ((dc_chan == 8) || (dc_chan == 9)) { |
581 | /* async channels */ | 581 | /* async channels */ |
582 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_DATA_W_0, 0x64, 1); | 582 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_DATA_W_0, 0x64, 1); |
583 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_DATA_W_1, 0x64, 1); | 583 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_DATA_W_1, 0x64, 1); |
584 | 584 | ||
585 | reg = 0x3; | 585 | reg = 0x3; |
586 | reg |= DC_DISP_ID_SERIAL << DC_WR_CH_CONF_PROG_DISP_ID_OFFSET; | 586 | reg |= DC_DISP_ID_SERIAL << DC_WR_CH_CONF_PROG_DISP_ID_OFFSET; |
587 | } | 587 | } |
588 | __raw_writel(reg, DC_WR_CH_CONF(dc_chan)); | 588 | __raw_writel(reg, DC_WR_CH_CONF(dc_chan)); |
589 | 589 | ||
590 | __raw_writel(0x00000000, DC_WR_CH_ADDR(dc_chan)); | 590 | __raw_writel(0x00000000, DC_WR_CH_ADDR(dc_chan)); |
591 | 591 | ||
592 | __raw_writel(0x00000084, DC_GEN); | 592 | __raw_writel(0x00000084, DC_GEN); |
593 | } | 593 | } |
594 | 594 | ||
595 | void ipu_dc_uninit(int dc_chan) | 595 | void ipu_dc_uninit(int dc_chan) |
596 | { | 596 | { |
597 | if ((dc_chan == 1) || (dc_chan == 5)) { | 597 | if ((dc_chan == 1) || (dc_chan == 5)) { |
598 | ipu_dc_link_event(dc_chan, DC_EVT_NL, 0, 0); | 598 | ipu_dc_link_event(dc_chan, DC_EVT_NL, 0, 0); |
599 | ipu_dc_link_event(dc_chan, DC_EVT_EOL, 0, 0); | 599 | ipu_dc_link_event(dc_chan, DC_EVT_EOL, 0, 0); |
600 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_DATA, 0, 0); | 600 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_DATA, 0, 0); |
601 | ipu_dc_link_event(dc_chan, DC_EVT_NF, 0, 0); | 601 | ipu_dc_link_event(dc_chan, DC_EVT_NF, 0, 0); |
602 | ipu_dc_link_event(dc_chan, DC_EVT_NFIELD, 0, 0); | 602 | ipu_dc_link_event(dc_chan, DC_EVT_NFIELD, 0, 0); |
603 | ipu_dc_link_event(dc_chan, DC_EVT_EOF, 0, 0); | 603 | ipu_dc_link_event(dc_chan, DC_EVT_EOF, 0, 0); |
604 | ipu_dc_link_event(dc_chan, DC_EVT_EOFIELD, 0, 0); | 604 | ipu_dc_link_event(dc_chan, DC_EVT_EOFIELD, 0, 0); |
605 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_CHAN, 0, 0); | 605 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_CHAN, 0, 0); |
606 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_ADDR, 0, 0); | 606 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_ADDR, 0, 0); |
607 | } else if ((dc_chan == 8) || (dc_chan == 9)) { | 607 | } else if ((dc_chan == 8) || (dc_chan == 9)) { |
608 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_ADDR_W_0, 0, 0); | 608 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_ADDR_W_0, 0, 0); |
609 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_ADDR_W_1, 0, 0); | 609 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_ADDR_W_1, 0, 0); |
610 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_CHAN_W_0, 0, 0); | 610 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_CHAN_W_0, 0, 0); |
611 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_CHAN_W_1, 0, 0); | 611 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_CHAN_W_1, 0, 0); |
612 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_DATA_W_0, 0, 0); | 612 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_DATA_W_0, 0, 0); |
613 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_DATA_W_1, 0, 0); | 613 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_DATA_W_1, 0, 0); |
614 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_ADDR_R_0, 0, 0); | 614 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_ADDR_R_0, 0, 0); |
615 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_ADDR_R_1, 0, 0); | 615 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_ADDR_R_1, 0, 0); |
616 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_CHAN_R_0, 0, 0); | 616 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_CHAN_R_0, 0, 0); |
617 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_CHAN_R_1, 0, 0); | 617 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_CHAN_R_1, 0, 0); |
618 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_DATA_R_0, 0, 0); | 618 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_DATA_R_0, 0, 0); |
619 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_DATA_R_1, 0, 0); | 619 | ipu_dc_link_event(dc_chan, DC_EVT_NEW_DATA_R_1, 0, 0); |
620 | } | 620 | } |
621 | } | 621 | } |
622 | 622 | ||
623 | int ipu_chan_is_interlaced(ipu_channel_t channel) | 623 | int ipu_chan_is_interlaced(ipu_channel_t channel) |
624 | { | 624 | { |
625 | if (channel == MEM_DC_SYNC) | 625 | if (channel == MEM_DC_SYNC) |
626 | return !!(__raw_readl(DC_WR_CH_CONF_1) & | 626 | return !!(__raw_readl(DC_WR_CH_CONF_1) & |
627 | DC_WR_CH_CONF_FIELD_MODE); | 627 | DC_WR_CH_CONF_FIELD_MODE); |
628 | else if ((channel == MEM_BG_SYNC) || (channel == MEM_FG_SYNC)) | 628 | else if ((channel == MEM_BG_SYNC) || (channel == MEM_FG_SYNC)) |
629 | return !!(__raw_readl(DC_WR_CH_CONF_5) & | 629 | return !!(__raw_readl(DC_WR_CH_CONF_5) & |
630 | DC_WR_CH_CONF_FIELD_MODE); | 630 | DC_WR_CH_CONF_FIELD_MODE); |
631 | return 0; | 631 | return 0; |
632 | } | 632 | } |
633 | 633 | ||
634 | void ipu_dp_dc_enable(ipu_channel_t channel) | 634 | void ipu_dp_dc_enable(ipu_channel_t channel) |
635 | { | 635 | { |
636 | int di; | 636 | int di; |
637 | uint32_t reg; | 637 | uint32_t reg; |
638 | uint32_t dc_chan; | 638 | uint32_t dc_chan; |
639 | 639 | ||
640 | if (channel == MEM_FG_SYNC) | 640 | if (channel == MEM_FG_SYNC) |
641 | dc_chan = 5; | 641 | dc_chan = 5; |
642 | if (channel == MEM_DC_SYNC) | 642 | if (channel == MEM_DC_SYNC) |
643 | dc_chan = 1; | 643 | dc_chan = 1; |
644 | else if (channel == MEM_BG_SYNC) | 644 | else if (channel == MEM_BG_SYNC) |
645 | dc_chan = 5; | 645 | dc_chan = 5; |
646 | else | 646 | else |
647 | return; | 647 | return; |
648 | 648 | ||
649 | if (channel == MEM_FG_SYNC) { | 649 | if (channel == MEM_FG_SYNC) { |
650 | /* Enable FG channel */ | 650 | /* Enable FG channel */ |
651 | reg = __raw_readl(DP_COM_CONF(DP_SYNC)); | 651 | reg = __raw_readl(DP_COM_CONF()); |
652 | __raw_writel(reg | DP_COM_CONF_FG_EN, DP_COM_CONF(DP_SYNC)); | 652 | __raw_writel(reg | DP_COM_CONF_FG_EN, DP_COM_CONF()); |
653 | 653 | ||
654 | reg = __raw_readl(IPU_SRM_PRI2) | 0x8; | 654 | reg = __raw_readl(IPU_SRM_PRI2) | 0x8; |
655 | __raw_writel(reg, IPU_SRM_PRI2); | 655 | __raw_writel(reg, IPU_SRM_PRI2); |
656 | return; | 656 | return; |
657 | } | 657 | } |
658 | 658 | ||
659 | di = g_dc_di_assignment[dc_chan]; | 659 | di = g_dc_di_assignment[dc_chan]; |
660 | 660 | ||
661 | /* Make sure other DC sync channel is not assigned same DI */ | 661 | /* Make sure other DC sync channel is not assigned same DI */ |
662 | reg = __raw_readl(DC_WR_CH_CONF(6 - dc_chan)); | 662 | reg = __raw_readl(DC_WR_CH_CONF(6 - dc_chan)); |
663 | if ((di << 2) == (reg & DC_WR_CH_CONF_PROG_DI_ID)) { | 663 | if ((di << 2) == (reg & DC_WR_CH_CONF_PROG_DI_ID)) { |
664 | reg &= ~DC_WR_CH_CONF_PROG_DI_ID; | 664 | reg &= ~DC_WR_CH_CONF_PROG_DI_ID; |
665 | reg |= di ? 0 : DC_WR_CH_CONF_PROG_DI_ID; | 665 | reg |= di ? 0 : DC_WR_CH_CONF_PROG_DI_ID; |
666 | __raw_writel(reg, DC_WR_CH_CONF(6 - dc_chan)); | 666 | __raw_writel(reg, DC_WR_CH_CONF(6 - dc_chan)); |
667 | } | 667 | } |
668 | 668 | ||
669 | reg = __raw_readl(DC_WR_CH_CONF(dc_chan)); | 669 | reg = __raw_readl(DC_WR_CH_CONF(dc_chan)); |
670 | reg |= 4 << DC_WR_CH_CONF_PROG_TYPE_OFFSET; | 670 | reg |= 4 << DC_WR_CH_CONF_PROG_TYPE_OFFSET; |
671 | __raw_writel(reg, DC_WR_CH_CONF(dc_chan)); | 671 | __raw_writel(reg, DC_WR_CH_CONF(dc_chan)); |
672 | 672 | ||
673 | clk_enable(g_pixel_clk[di]); | 673 | clk_enable(g_pixel_clk[di]); |
674 | } | 674 | } |
675 | 675 | ||
676 | static unsigned char dc_swap; | 676 | static unsigned char dc_swap; |
677 | 677 | ||
678 | void ipu_dp_dc_disable(ipu_channel_t channel, unsigned char swap) | 678 | void ipu_dp_dc_disable(ipu_channel_t channel, unsigned char swap) |
679 | { | 679 | { |
680 | uint32_t reg; | 680 | uint32_t reg; |
681 | uint32_t csc; | 681 | uint32_t csc; |
682 | uint32_t dc_chan = 0; | 682 | uint32_t dc_chan = 0; |
683 | int timeout = 50; | 683 | int timeout = 50; |
684 | 684 | ||
685 | dc_swap = swap; | 685 | dc_swap = swap; |
686 | 686 | ||
687 | if (channel == MEM_DC_SYNC) { | 687 | if (channel == MEM_DC_SYNC) { |
688 | dc_chan = 1; | 688 | dc_chan = 1; |
689 | } else if (channel == MEM_BG_SYNC) { | 689 | } else if (channel == MEM_BG_SYNC) { |
690 | dc_chan = 5; | 690 | dc_chan = 5; |
691 | } else if (channel == MEM_FG_SYNC) { | 691 | } else if (channel == MEM_FG_SYNC) { |
692 | /* Disable FG channel */ | 692 | /* Disable FG channel */ |
693 | dc_chan = 5; | 693 | dc_chan = 5; |
694 | 694 | ||
695 | reg = __raw_readl(DP_COM_CONF(DP_SYNC)); | 695 | reg = __raw_readl(DP_COM_CONF()); |
696 | csc = reg & DP_COM_CONF_CSC_DEF_MASK; | 696 | csc = reg & DP_COM_CONF_CSC_DEF_MASK; |
697 | if (csc == DP_COM_CONF_CSC_DEF_FG) | 697 | if (csc == DP_COM_CONF_CSC_DEF_FG) |
698 | reg &= ~DP_COM_CONF_CSC_DEF_MASK; | 698 | reg &= ~DP_COM_CONF_CSC_DEF_MASK; |
699 | 699 | ||
700 | reg &= ~DP_COM_CONF_FG_EN; | 700 | reg &= ~DP_COM_CONF_FG_EN; |
701 | __raw_writel(reg, DP_COM_CONF(DP_SYNC)); | 701 | __raw_writel(reg, DP_COM_CONF()); |
702 | 702 | ||
703 | reg = __raw_readl(IPU_SRM_PRI2) | 0x8; | 703 | reg = __raw_readl(IPU_SRM_PRI2) | 0x8; |
704 | __raw_writel(reg, IPU_SRM_PRI2); | 704 | __raw_writel(reg, IPU_SRM_PRI2); |
705 | 705 | ||
706 | timeout = 50; | 706 | timeout = 50; |
707 | 707 | ||
708 | /* | 708 | /* |
709 | * Wait for DC triple buffer to empty, | 709 | * Wait for DC triple buffer to empty, |
710 | * this check is useful for tv overlay. | 710 | * this check is useful for tv overlay. |
711 | */ | 711 | */ |
712 | if (g_dc_di_assignment[dc_chan] == 0) | 712 | if (g_dc_di_assignment[dc_chan] == 0) |
713 | while ((__raw_readl(DC_STAT) & 0x00000002) | 713 | while ((__raw_readl(DC_STAT) & 0x00000002) |
714 | != 0x00000002) { | 714 | != 0x00000002) { |
715 | udelay(2000); | 715 | udelay(2000); |
716 | timeout -= 2; | 716 | timeout -= 2; |
717 | if (timeout <= 0) | 717 | if (timeout <= 0) |
718 | break; | 718 | break; |
719 | } | 719 | } |
720 | else if (g_dc_di_assignment[dc_chan] == 1) | 720 | else if (g_dc_di_assignment[dc_chan] == 1) |
721 | while ((__raw_readl(DC_STAT) & 0x00000020) | 721 | while ((__raw_readl(DC_STAT) & 0x00000020) |
722 | != 0x00000020) { | 722 | != 0x00000020) { |
723 | udelay(2000); | 723 | udelay(2000); |
724 | timeout -= 2; | 724 | timeout -= 2; |
725 | if (timeout <= 0) | 725 | if (timeout <= 0) |
726 | break; | 726 | break; |
727 | } | 727 | } |
728 | return; | 728 | return; |
729 | } else { | 729 | } else { |
730 | return; | 730 | return; |
731 | } | 731 | } |
732 | 732 | ||
733 | if (dc_swap) { | 733 | if (dc_swap) { |
734 | /* Swap DC channel 1 and 5 settings, and disable old dc chan */ | 734 | /* Swap DC channel 1 and 5 settings, and disable old dc chan */ |
735 | reg = __raw_readl(DC_WR_CH_CONF(dc_chan)); | 735 | reg = __raw_readl(DC_WR_CH_CONF(dc_chan)); |
736 | __raw_writel(reg, DC_WR_CH_CONF(6 - dc_chan)); | 736 | __raw_writel(reg, DC_WR_CH_CONF(6 - dc_chan)); |
737 | reg &= ~DC_WR_CH_CONF_PROG_TYPE_MASK; | 737 | reg &= ~DC_WR_CH_CONF_PROG_TYPE_MASK; |
738 | reg ^= DC_WR_CH_CONF_PROG_DI_ID; | 738 | reg ^= DC_WR_CH_CONF_PROG_DI_ID; |
739 | __raw_writel(reg, DC_WR_CH_CONF(dc_chan)); | 739 | __raw_writel(reg, DC_WR_CH_CONF(dc_chan)); |
740 | } else { | 740 | } else { |
741 | timeout = 50; | 741 | timeout = 50; |
742 | 742 | ||
743 | /* Wait for DC triple buffer to empty */ | 743 | /* Wait for DC triple buffer to empty */ |
744 | if (g_dc_di_assignment[dc_chan] == 0) | 744 | if (g_dc_di_assignment[dc_chan] == 0) |
745 | while ((__raw_readl(DC_STAT) & 0x00000002) | 745 | while ((__raw_readl(DC_STAT) & 0x00000002) |
746 | != 0x00000002) { | 746 | != 0x00000002) { |
747 | udelay(2000); | 747 | udelay(2000); |
748 | timeout -= 2; | 748 | timeout -= 2; |
749 | if (timeout <= 0) | 749 | if (timeout <= 0) |
750 | break; | 750 | break; |
751 | } | 751 | } |
752 | else if (g_dc_di_assignment[dc_chan] == 1) | 752 | else if (g_dc_di_assignment[dc_chan] == 1) |
753 | while ((__raw_readl(DC_STAT) & 0x00000020) | 753 | while ((__raw_readl(DC_STAT) & 0x00000020) |
754 | != 0x00000020) { | 754 | != 0x00000020) { |
755 | udelay(2000); | 755 | udelay(2000); |
756 | timeout -= 2; | 756 | timeout -= 2; |
757 | if (timeout <= 0) | 757 | if (timeout <= 0) |
758 | break; | 758 | break; |
759 | } | 759 | } |
760 | 760 | ||
761 | reg = __raw_readl(DC_WR_CH_CONF(dc_chan)); | 761 | reg = __raw_readl(DC_WR_CH_CONF(dc_chan)); |
762 | reg &= ~DC_WR_CH_CONF_PROG_TYPE_MASK; | 762 | reg &= ~DC_WR_CH_CONF_PROG_TYPE_MASK; |
763 | __raw_writel(reg, DC_WR_CH_CONF(dc_chan)); | 763 | __raw_writel(reg, DC_WR_CH_CONF(dc_chan)); |
764 | 764 | ||
765 | reg = __raw_readl(IPU_DISP_GEN); | 765 | reg = __raw_readl(IPU_DISP_GEN); |
766 | if (g_dc_di_assignment[dc_chan]) | 766 | if (g_dc_di_assignment[dc_chan]) |
767 | reg &= ~DI1_COUNTER_RELEASE; | 767 | reg &= ~DI1_COUNTER_RELEASE; |
768 | else | 768 | else |
769 | reg &= ~DI0_COUNTER_RELEASE; | 769 | reg &= ~DI0_COUNTER_RELEASE; |
770 | __raw_writel(reg, IPU_DISP_GEN); | 770 | __raw_writel(reg, IPU_DISP_GEN); |
771 | 771 | ||
772 | /* Clock is already off because it must be done quickly, but | 772 | /* Clock is already off because it must be done quickly, but |
773 | we need to fix the ref count */ | 773 | we need to fix the ref count */ |
774 | clk_disable(g_pixel_clk[g_dc_di_assignment[dc_chan]]); | 774 | clk_disable(g_pixel_clk[g_dc_di_assignment[dc_chan]]); |
775 | } | 775 | } |
776 | } | 776 | } |
777 | 777 | ||
778 | void ipu_init_dc_mappings(void) | 778 | void ipu_init_dc_mappings(void) |
779 | { | 779 | { |
780 | /* IPU_PIX_FMT_RGB24 */ | 780 | /* IPU_PIX_FMT_RGB24 */ |
781 | ipu_dc_map_clear(0); | 781 | ipu_dc_map_clear(0); |
782 | ipu_dc_map_config(0, 0, 7, 0xFF); | 782 | ipu_dc_map_config(0, 0, 7, 0xFF); |
783 | ipu_dc_map_config(0, 1, 15, 0xFF); | 783 | ipu_dc_map_config(0, 1, 15, 0xFF); |
784 | ipu_dc_map_config(0, 2, 23, 0xFF); | 784 | ipu_dc_map_config(0, 2, 23, 0xFF); |
785 | 785 | ||
786 | /* IPU_PIX_FMT_RGB666 */ | 786 | /* IPU_PIX_FMT_RGB666 */ |
787 | ipu_dc_map_clear(1); | 787 | ipu_dc_map_clear(1); |
788 | ipu_dc_map_config(1, 0, 5, 0xFC); | 788 | ipu_dc_map_config(1, 0, 5, 0xFC); |
789 | ipu_dc_map_config(1, 1, 11, 0xFC); | 789 | ipu_dc_map_config(1, 1, 11, 0xFC); |
790 | ipu_dc_map_config(1, 2, 17, 0xFC); | 790 | ipu_dc_map_config(1, 2, 17, 0xFC); |
791 | 791 | ||
792 | /* IPU_PIX_FMT_YUV444 */ | 792 | /* IPU_PIX_FMT_YUV444 */ |
793 | ipu_dc_map_clear(2); | 793 | ipu_dc_map_clear(2); |
794 | ipu_dc_map_config(2, 0, 15, 0xFF); | 794 | ipu_dc_map_config(2, 0, 15, 0xFF); |
795 | ipu_dc_map_config(2, 1, 23, 0xFF); | 795 | ipu_dc_map_config(2, 1, 23, 0xFF); |
796 | ipu_dc_map_config(2, 2, 7, 0xFF); | 796 | ipu_dc_map_config(2, 2, 7, 0xFF); |
797 | 797 | ||
798 | /* IPU_PIX_FMT_RGB565 */ | 798 | /* IPU_PIX_FMT_RGB565 */ |
799 | ipu_dc_map_clear(3); | 799 | ipu_dc_map_clear(3); |
800 | ipu_dc_map_config(3, 0, 4, 0xF8); | 800 | ipu_dc_map_config(3, 0, 4, 0xF8); |
801 | ipu_dc_map_config(3, 1, 10, 0xFC); | 801 | ipu_dc_map_config(3, 1, 10, 0xFC); |
802 | ipu_dc_map_config(3, 2, 15, 0xF8); | 802 | ipu_dc_map_config(3, 2, 15, 0xF8); |
803 | 803 | ||
804 | /* IPU_PIX_FMT_LVDS666 */ | 804 | /* IPU_PIX_FMT_LVDS666 */ |
805 | ipu_dc_map_clear(4); | 805 | ipu_dc_map_clear(4); |
806 | ipu_dc_map_config(4, 0, 5, 0xFC); | 806 | ipu_dc_map_config(4, 0, 5, 0xFC); |
807 | ipu_dc_map_config(4, 1, 13, 0xFC); | 807 | ipu_dc_map_config(4, 1, 13, 0xFC); |
808 | ipu_dc_map_config(4, 2, 21, 0xFC); | 808 | ipu_dc_map_config(4, 2, 21, 0xFC); |
809 | } | 809 | } |
810 | 810 | ||
811 | int ipu_pixfmt_to_map(uint32_t fmt) | 811 | int ipu_pixfmt_to_map(uint32_t fmt) |
812 | { | 812 | { |
813 | switch (fmt) { | 813 | switch (fmt) { |
814 | case IPU_PIX_FMT_GENERIC: | 814 | case IPU_PIX_FMT_GENERIC: |
815 | case IPU_PIX_FMT_RGB24: | 815 | case IPU_PIX_FMT_RGB24: |
816 | return 0; | 816 | return 0; |
817 | case IPU_PIX_FMT_RGB666: | 817 | case IPU_PIX_FMT_RGB666: |
818 | return 1; | 818 | return 1; |
819 | case IPU_PIX_FMT_YUV444: | 819 | case IPU_PIX_FMT_YUV444: |
820 | return 2; | 820 | return 2; |
821 | case IPU_PIX_FMT_RGB565: | 821 | case IPU_PIX_FMT_RGB565: |
822 | return 3; | 822 | return 3; |
823 | case IPU_PIX_FMT_LVDS666: | 823 | case IPU_PIX_FMT_LVDS666: |
824 | return 4; | 824 | return 4; |
825 | } | 825 | } |
826 | 826 | ||
827 | return -1; | 827 | return -1; |
828 | } | 828 | } |
829 | 829 | ||
830 | /* | 830 | /* |
831 | * This function is called to adapt synchronous LCD panel to IPU restriction. | 831 | * This function is called to adapt synchronous LCD panel to IPU restriction. |
832 | */ | 832 | */ |
833 | void adapt_panel_to_ipu_restricitions(uint32_t *pixel_clk, | 833 | void adapt_panel_to_ipu_restricitions(uint32_t *pixel_clk, |
834 | uint16_t width, uint16_t height, | 834 | uint16_t width, uint16_t height, |
835 | uint16_t h_start_width, | 835 | uint16_t h_start_width, |
836 | uint16_t h_end_width, | 836 | uint16_t h_end_width, |
837 | uint16_t v_start_width, | 837 | uint16_t v_start_width, |
838 | uint16_t *v_end_width) | 838 | uint16_t *v_end_width) |
839 | { | 839 | { |
840 | if (*v_end_width < 2) { | 840 | if (*v_end_width < 2) { |
841 | uint16_t total_width = width + h_start_width + h_end_width; | 841 | uint16_t total_width = width + h_start_width + h_end_width; |
842 | uint16_t total_height_old = height + v_start_width + | 842 | uint16_t total_height_old = height + v_start_width + |
843 | (*v_end_width); | 843 | (*v_end_width); |
844 | uint16_t total_height_new = height + v_start_width + 2; | 844 | uint16_t total_height_new = height + v_start_width + 2; |
845 | *v_end_width = 2; | 845 | *v_end_width = 2; |
846 | *pixel_clk = (*pixel_clk) * total_width * total_height_new / | 846 | *pixel_clk = (*pixel_clk) * total_width * total_height_new / |
847 | (total_width * total_height_old); | 847 | (total_width * total_height_old); |
848 | printf("WARNING: adapt panel end blank lines\n"); | 848 | printf("WARNING: adapt panel end blank lines\n"); |
849 | } | 849 | } |
850 | } | 850 | } |
851 | 851 | ||
852 | /* | 852 | /* |
853 | * This function is called to initialize a synchronous LCD panel. | 853 | * This function is called to initialize a synchronous LCD panel. |
854 | * | 854 | * |
855 | * @param disp The DI the panel is attached to. | 855 | * @param disp The DI the panel is attached to. |
856 | * | 856 | * |
857 | * @param pixel_clk Desired pixel clock frequency in Hz. | 857 | * @param pixel_clk Desired pixel clock frequency in Hz. |
858 | * | 858 | * |
859 | * @param pixel_fmt Input parameter for pixel format of buffer. | 859 | * @param pixel_fmt Input parameter for pixel format of buffer. |
860 | * Pixel format is a FOURCC ASCII code. | 860 | * Pixel format is a FOURCC ASCII code. |
861 | * | 861 | * |
862 | * @param width The width of panel in pixels. | 862 | * @param width The width of panel in pixels. |
863 | * | 863 | * |
864 | * @param height The height of panel in pixels. | 864 | * @param height The height of panel in pixels. |
865 | * | 865 | * |
866 | * @param hStartWidth The number of pixel clocks between the HSYNC | 866 | * @param hStartWidth The number of pixel clocks between the HSYNC |
867 | * signal pulse and the start of valid data. | 867 | * signal pulse and the start of valid data. |
868 | * | 868 | * |
869 | * @param hSyncWidth The width of the HSYNC signal in units of pixel | 869 | * @param hSyncWidth The width of the HSYNC signal in units of pixel |
870 | * clocks. | 870 | * clocks. |
871 | * | 871 | * |
872 | * @param hEndWidth The number of pixel clocks between the end of | 872 | * @param hEndWidth The number of pixel clocks between the end of |
873 | * valid data and the HSYNC signal for next line. | 873 | * valid data and the HSYNC signal for next line. |
874 | * | 874 | * |
875 | * @param vStartWidth The number of lines between the VSYNC | 875 | * @param vStartWidth The number of lines between the VSYNC |
876 | * signal pulse and the start of valid data. | 876 | * signal pulse and the start of valid data. |
877 | * | 877 | * |
878 | * @param vSyncWidth The width of the VSYNC signal in units of lines | 878 | * @param vSyncWidth The width of the VSYNC signal in units of lines |
879 | * | 879 | * |
880 | * @param vEndWidth The number of lines between the end of valid | 880 | * @param vEndWidth The number of lines between the end of valid |
881 | * data and the VSYNC signal for next frame. | 881 | * data and the VSYNC signal for next frame. |
882 | * | 882 | * |
883 | * @param sig Bitfield of signal polarities for LCD interface. | 883 | * @param sig Bitfield of signal polarities for LCD interface. |
884 | * | 884 | * |
885 | * @return This function returns 0 on success or negative error code on | 885 | * @return This function returns 0 on success or negative error code on |
886 | * fail. | 886 | * fail. |
887 | */ | 887 | */ |
888 | 888 | ||
889 | int32_t ipu_init_sync_panel(int disp, uint32_t pixel_clk, | 889 | int32_t ipu_init_sync_panel(int disp, uint32_t pixel_clk, |
890 | uint16_t width, uint16_t height, | 890 | uint16_t width, uint16_t height, |
891 | uint32_t pixel_fmt, | 891 | uint32_t pixel_fmt, |
892 | uint16_t h_start_width, uint16_t h_sync_width, | 892 | uint16_t h_start_width, uint16_t h_sync_width, |
893 | uint16_t h_end_width, uint16_t v_start_width, | 893 | uint16_t h_end_width, uint16_t v_start_width, |
894 | uint16_t v_sync_width, uint16_t v_end_width, | 894 | uint16_t v_sync_width, uint16_t v_end_width, |
895 | uint32_t v_to_h_sync, ipu_di_signal_cfg_t sig) | 895 | uint32_t v_to_h_sync, ipu_di_signal_cfg_t sig) |
896 | { | 896 | { |
897 | uint32_t reg; | 897 | uint32_t reg; |
898 | uint32_t di_gen, vsync_cnt; | 898 | uint32_t di_gen, vsync_cnt; |
899 | uint32_t div, rounded_pixel_clk; | 899 | uint32_t div, rounded_pixel_clk; |
900 | uint32_t h_total, v_total; | 900 | uint32_t h_total, v_total; |
901 | int map; | 901 | int map; |
902 | struct clk *di_parent; | 902 | struct clk *di_parent; |
903 | 903 | ||
904 | debug("panel size = %d x %d\n", width, height); | 904 | debug("panel size = %d x %d\n", width, height); |
905 | 905 | ||
906 | if ((v_sync_width == 0) || (h_sync_width == 0)) | 906 | if ((v_sync_width == 0) || (h_sync_width == 0)) |
907 | return EINVAL; | 907 | return EINVAL; |
908 | 908 | ||
909 | adapt_panel_to_ipu_restricitions(&pixel_clk, width, height, | 909 | adapt_panel_to_ipu_restricitions(&pixel_clk, width, height, |
910 | h_start_width, h_end_width, | 910 | h_start_width, h_end_width, |
911 | v_start_width, &v_end_width); | 911 | v_start_width, &v_end_width); |
912 | h_total = width + h_sync_width + h_start_width + h_end_width; | 912 | h_total = width + h_sync_width + h_start_width + h_end_width; |
913 | v_total = height + v_sync_width + v_start_width + v_end_width; | 913 | v_total = height + v_sync_width + v_start_width + v_end_width; |
914 | 914 | ||
915 | /* Init clocking */ | 915 | /* Init clocking */ |
916 | debug("pixel clk = %d\n", pixel_clk); | 916 | debug("pixel clk = %d\n", pixel_clk); |
917 | 917 | ||
918 | if (sig.ext_clk) { | 918 | if (sig.ext_clk) { |
919 | if (!(g_di1_tvout && (disp == 1))) { /*not round div for tvout*/ | 919 | if (!(g_di1_tvout && (disp == 1))) { /*not round div for tvout*/ |
920 | /* | 920 | /* |
921 | * Set the PLL to be an even multiple | 921 | * Set the PLL to be an even multiple |
922 | * of the pixel clock. | 922 | * of the pixel clock. |
923 | */ | 923 | */ |
924 | if ((clk_get_usecount(g_pixel_clk[0]) == 0) && | 924 | if ((clk_get_usecount(g_pixel_clk[0]) == 0) && |
925 | (clk_get_usecount(g_pixel_clk[1]) == 0)) { | 925 | (clk_get_usecount(g_pixel_clk[1]) == 0)) { |
926 | di_parent = clk_get_parent(g_di_clk[disp]); | 926 | di_parent = clk_get_parent(g_di_clk[disp]); |
927 | rounded_pixel_clk = | 927 | rounded_pixel_clk = |
928 | clk_round_rate(g_pixel_clk[disp], | 928 | clk_round_rate(g_pixel_clk[disp], |
929 | pixel_clk); | 929 | pixel_clk); |
930 | div = clk_get_rate(di_parent) / | 930 | div = clk_get_rate(di_parent) / |
931 | rounded_pixel_clk; | 931 | rounded_pixel_clk; |
932 | if (div % 2) | 932 | if (div % 2) |
933 | div++; | 933 | div++; |
934 | if (clk_get_rate(di_parent) != div * | 934 | if (clk_get_rate(di_parent) != div * |
935 | rounded_pixel_clk) | 935 | rounded_pixel_clk) |
936 | clk_set_rate(di_parent, | 936 | clk_set_rate(di_parent, |
937 | div * rounded_pixel_clk); | 937 | div * rounded_pixel_clk); |
938 | udelay(10000); | 938 | udelay(10000); |
939 | clk_set_rate(g_di_clk[disp], | 939 | clk_set_rate(g_di_clk[disp], |
940 | 2 * rounded_pixel_clk); | 940 | 2 * rounded_pixel_clk); |
941 | udelay(10000); | 941 | udelay(10000); |
942 | } | 942 | } |
943 | } | 943 | } |
944 | clk_set_parent(g_pixel_clk[disp], g_di_clk[disp]); | 944 | clk_set_parent(g_pixel_clk[disp], g_di_clk[disp]); |
945 | } else { | 945 | } else { |
946 | if (clk_get_usecount(g_pixel_clk[disp]) != 0) | 946 | if (clk_get_usecount(g_pixel_clk[disp]) != 0) |
947 | clk_set_parent(g_pixel_clk[disp], g_ipu_clk); | 947 | clk_set_parent(g_pixel_clk[disp], g_ipu_clk); |
948 | } | 948 | } |
949 | rounded_pixel_clk = clk_round_rate(g_pixel_clk[disp], pixel_clk); | 949 | rounded_pixel_clk = clk_round_rate(g_pixel_clk[disp], pixel_clk); |
950 | clk_set_rate(g_pixel_clk[disp], rounded_pixel_clk); | 950 | clk_set_rate(g_pixel_clk[disp], rounded_pixel_clk); |
951 | udelay(5000); | 951 | udelay(5000); |
952 | /* Get integer portion of divider */ | 952 | /* Get integer portion of divider */ |
953 | div = clk_get_rate(clk_get_parent(g_pixel_clk[disp])) / | 953 | div = clk_get_rate(clk_get_parent(g_pixel_clk[disp])) / |
954 | rounded_pixel_clk; | 954 | rounded_pixel_clk; |
955 | 955 | ||
956 | ipu_di_data_wave_config(disp, SYNC_WAVE, div - 1, div - 1); | 956 | ipu_di_data_wave_config(disp, SYNC_WAVE, div - 1, div - 1); |
957 | ipu_di_data_pin_config(disp, SYNC_WAVE, DI_PIN15, 3, 0, div * 2); | 957 | ipu_di_data_pin_config(disp, SYNC_WAVE, DI_PIN15, 3, 0, div * 2); |
958 | 958 | ||
959 | map = ipu_pixfmt_to_map(pixel_fmt); | 959 | map = ipu_pixfmt_to_map(pixel_fmt); |
960 | if (map < 0) { | 960 | if (map < 0) { |
961 | debug("IPU_DISP: No MAP\n"); | 961 | debug("IPU_DISP: No MAP\n"); |
962 | return -EINVAL; | 962 | return -EINVAL; |
963 | } | 963 | } |
964 | 964 | ||
965 | di_gen = __raw_readl(DI_GENERAL(disp)); | 965 | di_gen = __raw_readl(DI_GENERAL(disp)); |
966 | 966 | ||
967 | if (sig.interlaced) { | 967 | if (sig.interlaced) { |
968 | /* Setup internal HSYNC waveform */ | 968 | /* Setup internal HSYNC waveform */ |
969 | ipu_di_sync_config( | 969 | ipu_di_sync_config( |
970 | disp, /* display */ | 970 | disp, /* display */ |
971 | 1, /* counter */ | 971 | 1, /* counter */ |
972 | h_total / 2 - 1,/* run count */ | 972 | h_total / 2 - 1,/* run count */ |
973 | DI_SYNC_CLK, /* run_resolution */ | 973 | DI_SYNC_CLK, /* run_resolution */ |
974 | 0, /* offset */ | 974 | 0, /* offset */ |
975 | DI_SYNC_NONE, /* offset resolution */ | 975 | DI_SYNC_NONE, /* offset resolution */ |
976 | 0, /* repeat count */ | 976 | 0, /* repeat count */ |
977 | DI_SYNC_NONE, /* CNT_CLR_SEL */ | 977 | DI_SYNC_NONE, /* CNT_CLR_SEL */ |
978 | 0, /* CNT_POLARITY_GEN_EN */ | 978 | 0, /* CNT_POLARITY_GEN_EN */ |
979 | DI_SYNC_NONE, /* CNT_POLARITY_CLR_SEL */ | 979 | DI_SYNC_NONE, /* CNT_POLARITY_CLR_SEL */ |
980 | DI_SYNC_NONE, /* CNT_POLARITY_TRIGGER_SEL */ | 980 | DI_SYNC_NONE, /* CNT_POLARITY_TRIGGER_SEL */ |
981 | 0, /* COUNT UP */ | 981 | 0, /* COUNT UP */ |
982 | 0 /* COUNT DOWN */ | 982 | 0 /* COUNT DOWN */ |
983 | ); | 983 | ); |
984 | 984 | ||
985 | /* Field 1 VSYNC waveform */ | 985 | /* Field 1 VSYNC waveform */ |
986 | ipu_di_sync_config( | 986 | ipu_di_sync_config( |
987 | disp, /* display */ | 987 | disp, /* display */ |
988 | 2, /* counter */ | 988 | 2, /* counter */ |
989 | h_total - 1, /* run count */ | 989 | h_total - 1, /* run count */ |
990 | DI_SYNC_CLK, /* run_resolution */ | 990 | DI_SYNC_CLK, /* run_resolution */ |
991 | 0, /* offset */ | 991 | 0, /* offset */ |
992 | DI_SYNC_NONE, /* offset resolution */ | 992 | DI_SYNC_NONE, /* offset resolution */ |
993 | 0, /* repeat count */ | 993 | 0, /* repeat count */ |
994 | DI_SYNC_NONE, /* CNT_CLR_SEL */ | 994 | DI_SYNC_NONE, /* CNT_CLR_SEL */ |
995 | 0, /* CNT_POLARITY_GEN_EN */ | 995 | 0, /* CNT_POLARITY_GEN_EN */ |
996 | DI_SYNC_NONE, /* CNT_POLARITY_CLR_SEL */ | 996 | DI_SYNC_NONE, /* CNT_POLARITY_CLR_SEL */ |
997 | DI_SYNC_NONE, /* CNT_POLARITY_TRIGGER_SEL */ | 997 | DI_SYNC_NONE, /* CNT_POLARITY_TRIGGER_SEL */ |
998 | 0, /* COUNT UP */ | 998 | 0, /* COUNT UP */ |
999 | 4 /* COUNT DOWN */ | 999 | 4 /* COUNT DOWN */ |
1000 | ); | 1000 | ); |
1001 | 1001 | ||
1002 | /* Setup internal HSYNC waveform */ | 1002 | /* Setup internal HSYNC waveform */ |
1003 | ipu_di_sync_config( | 1003 | ipu_di_sync_config( |
1004 | disp, /* display */ | 1004 | disp, /* display */ |
1005 | 3, /* counter */ | 1005 | 3, /* counter */ |
1006 | v_total * 2 - 1,/* run count */ | 1006 | v_total * 2 - 1,/* run count */ |
1007 | DI_SYNC_INT_HSYNC, /* run_resolution */ | 1007 | DI_SYNC_INT_HSYNC, /* run_resolution */ |
1008 | 1, /* offset */ | 1008 | 1, /* offset */ |
1009 | DI_SYNC_INT_HSYNC, /* offset resolution */ | 1009 | DI_SYNC_INT_HSYNC, /* offset resolution */ |
1010 | 0, /* repeat count */ | 1010 | 0, /* repeat count */ |
1011 | DI_SYNC_NONE, /* CNT_CLR_SEL */ | 1011 | DI_SYNC_NONE, /* CNT_CLR_SEL */ |
1012 | 0, /* CNT_POLARITY_GEN_EN */ | 1012 | 0, /* CNT_POLARITY_GEN_EN */ |
1013 | DI_SYNC_NONE, /* CNT_POLARITY_CLR_SEL */ | 1013 | DI_SYNC_NONE, /* CNT_POLARITY_CLR_SEL */ |
1014 | DI_SYNC_NONE, /* CNT_POLARITY_TRIGGER_SEL */ | 1014 | DI_SYNC_NONE, /* CNT_POLARITY_TRIGGER_SEL */ |
1015 | 0, /* COUNT UP */ | 1015 | 0, /* COUNT UP */ |
1016 | 4 /* COUNT DOWN */ | 1016 | 4 /* COUNT DOWN */ |
1017 | ); | 1017 | ); |
1018 | 1018 | ||
1019 | /* Active Field ? */ | 1019 | /* Active Field ? */ |
1020 | ipu_di_sync_config( | 1020 | ipu_di_sync_config( |
1021 | disp, /* display */ | 1021 | disp, /* display */ |
1022 | 4, /* counter */ | 1022 | 4, /* counter */ |
1023 | v_total / 2 - 1,/* run count */ | 1023 | v_total / 2 - 1,/* run count */ |
1024 | DI_SYNC_HSYNC, /* run_resolution */ | 1024 | DI_SYNC_HSYNC, /* run_resolution */ |
1025 | v_start_width, /* offset */ | 1025 | v_start_width, /* offset */ |
1026 | DI_SYNC_HSYNC, /* offset resolution */ | 1026 | DI_SYNC_HSYNC, /* offset resolution */ |
1027 | 2, /* repeat count */ | 1027 | 2, /* repeat count */ |
1028 | DI_SYNC_VSYNC, /* CNT_CLR_SEL */ | 1028 | DI_SYNC_VSYNC, /* CNT_CLR_SEL */ |
1029 | 0, /* CNT_POLARITY_GEN_EN */ | 1029 | 0, /* CNT_POLARITY_GEN_EN */ |
1030 | DI_SYNC_NONE, /* CNT_POLARITY_CLR_SEL */ | 1030 | DI_SYNC_NONE, /* CNT_POLARITY_CLR_SEL */ |
1031 | DI_SYNC_NONE, /* CNT_POLARITY_TRIGGER_SEL */ | 1031 | DI_SYNC_NONE, /* CNT_POLARITY_TRIGGER_SEL */ |
1032 | 0, /* COUNT UP */ | 1032 | 0, /* COUNT UP */ |
1033 | 0 /* COUNT DOWN */ | 1033 | 0 /* COUNT DOWN */ |
1034 | ); | 1034 | ); |
1035 | 1035 | ||
1036 | /* Active Line */ | 1036 | /* Active Line */ |
1037 | ipu_di_sync_config( | 1037 | ipu_di_sync_config( |
1038 | disp, /* display */ | 1038 | disp, /* display */ |
1039 | 5, /* counter */ | 1039 | 5, /* counter */ |
1040 | 0, /* run count */ | 1040 | 0, /* run count */ |
1041 | DI_SYNC_HSYNC, /* run_resolution */ | 1041 | DI_SYNC_HSYNC, /* run_resolution */ |
1042 | 0, /* offset */ | 1042 | 0, /* offset */ |
1043 | DI_SYNC_NONE, /* offset resolution */ | 1043 | DI_SYNC_NONE, /* offset resolution */ |
1044 | height / 2, /* repeat count */ | 1044 | height / 2, /* repeat count */ |
1045 | 4, /* CNT_CLR_SEL */ | 1045 | 4, /* CNT_CLR_SEL */ |
1046 | 0, /* CNT_POLARITY_GEN_EN */ | 1046 | 0, /* CNT_POLARITY_GEN_EN */ |
1047 | DI_SYNC_NONE, /* CNT_POLARITY_CLR_SEL */ | 1047 | DI_SYNC_NONE, /* CNT_POLARITY_CLR_SEL */ |
1048 | DI_SYNC_NONE, /* CNT_POLARITY_TRIGGER_SEL */ | 1048 | DI_SYNC_NONE, /* CNT_POLARITY_TRIGGER_SEL */ |
1049 | 0, /* COUNT UP */ | 1049 | 0, /* COUNT UP */ |
1050 | 0 /* COUNT DOWN */ | 1050 | 0 /* COUNT DOWN */ |
1051 | ); | 1051 | ); |
1052 | 1052 | ||
1053 | /* Field 0 VSYNC waveform */ | 1053 | /* Field 0 VSYNC waveform */ |
1054 | ipu_di_sync_config( | 1054 | ipu_di_sync_config( |
1055 | disp, /* display */ | 1055 | disp, /* display */ |
1056 | 6, /* counter */ | 1056 | 6, /* counter */ |
1057 | v_total - 1, /* run count */ | 1057 | v_total - 1, /* run count */ |
1058 | DI_SYNC_HSYNC, /* run_resolution */ | 1058 | DI_SYNC_HSYNC, /* run_resolution */ |
1059 | 0, /* offset */ | 1059 | 0, /* offset */ |
1060 | DI_SYNC_NONE, /* offset resolution */ | 1060 | DI_SYNC_NONE, /* offset resolution */ |
1061 | 0, /* repeat count */ | 1061 | 0, /* repeat count */ |
1062 | DI_SYNC_NONE, /* CNT_CLR_SEL */ | 1062 | DI_SYNC_NONE, /* CNT_CLR_SEL */ |
1063 | 0, /* CNT_POLARITY_GEN_EN */ | 1063 | 0, /* CNT_POLARITY_GEN_EN */ |
1064 | DI_SYNC_NONE, /* CNT_POLARITY_CLR_SEL */ | 1064 | DI_SYNC_NONE, /* CNT_POLARITY_CLR_SEL */ |
1065 | DI_SYNC_NONE, /* CNT_POLARITY_TRIGGER_SEL */ | 1065 | DI_SYNC_NONE, /* CNT_POLARITY_TRIGGER_SEL */ |
1066 | 0, /* COUNT UP */ | 1066 | 0, /* COUNT UP */ |
1067 | 0 /* COUNT DOWN */ | 1067 | 0 /* COUNT DOWN */ |
1068 | ); | 1068 | ); |
1069 | 1069 | ||
1070 | /* DC VSYNC waveform */ | 1070 | /* DC VSYNC waveform */ |
1071 | vsync_cnt = 7; | 1071 | vsync_cnt = 7; |
1072 | ipu_di_sync_config( | 1072 | ipu_di_sync_config( |
1073 | disp, /* display */ | 1073 | disp, /* display */ |
1074 | 7, /* counter */ | 1074 | 7, /* counter */ |
1075 | v_total / 2 - 1,/* run count */ | 1075 | v_total / 2 - 1,/* run count */ |
1076 | DI_SYNC_HSYNC, /* run_resolution */ | 1076 | DI_SYNC_HSYNC, /* run_resolution */ |
1077 | 9, /* offset */ | 1077 | 9, /* offset */ |
1078 | DI_SYNC_HSYNC, /* offset resolution */ | 1078 | DI_SYNC_HSYNC, /* offset resolution */ |
1079 | 2, /* repeat count */ | 1079 | 2, /* repeat count */ |
1080 | DI_SYNC_VSYNC, /* CNT_CLR_SEL */ | 1080 | DI_SYNC_VSYNC, /* CNT_CLR_SEL */ |
1081 | 0, /* CNT_POLARITY_GEN_EN */ | 1081 | 0, /* CNT_POLARITY_GEN_EN */ |
1082 | DI_SYNC_NONE, /* CNT_POLARITY_CLR_SEL */ | 1082 | DI_SYNC_NONE, /* CNT_POLARITY_CLR_SEL */ |
1083 | DI_SYNC_NONE, /* CNT_POLARITY_TRIGGER_SEL */ | 1083 | DI_SYNC_NONE, /* CNT_POLARITY_TRIGGER_SEL */ |
1084 | 0, /* COUNT UP */ | 1084 | 0, /* COUNT UP */ |
1085 | 0 /* COUNT DOWN */ | 1085 | 0 /* COUNT DOWN */ |
1086 | ); | 1086 | ); |
1087 | 1087 | ||
1088 | /* active pixel waveform */ | 1088 | /* active pixel waveform */ |
1089 | ipu_di_sync_config( | 1089 | ipu_di_sync_config( |
1090 | disp, /* display */ | 1090 | disp, /* display */ |
1091 | 8, /* counter */ | 1091 | 8, /* counter */ |
1092 | 0, /* run count */ | 1092 | 0, /* run count */ |
1093 | DI_SYNC_CLK, /* run_resolution */ | 1093 | DI_SYNC_CLK, /* run_resolution */ |
1094 | h_start_width, /* offset */ | 1094 | h_start_width, /* offset */ |
1095 | DI_SYNC_CLK, /* offset resolution */ | 1095 | DI_SYNC_CLK, /* offset resolution */ |
1096 | width, /* repeat count */ | 1096 | width, /* repeat count */ |
1097 | 5, /* CNT_CLR_SEL */ | 1097 | 5, /* CNT_CLR_SEL */ |
1098 | 0, /* CNT_POLARITY_GEN_EN */ | 1098 | 0, /* CNT_POLARITY_GEN_EN */ |
1099 | DI_SYNC_NONE, /* CNT_POLARITY_CLR_SEL */ | 1099 | DI_SYNC_NONE, /* CNT_POLARITY_CLR_SEL */ |
1100 | DI_SYNC_NONE, /* CNT_POLARITY_TRIGGER_SEL */ | 1100 | DI_SYNC_NONE, /* CNT_POLARITY_TRIGGER_SEL */ |
1101 | 0, /* COUNT UP */ | 1101 | 0, /* COUNT UP */ |
1102 | 0 /* COUNT DOWN */ | 1102 | 0 /* COUNT DOWN */ |
1103 | ); | 1103 | ); |
1104 | 1104 | ||
1105 | ipu_di_sync_config( | 1105 | ipu_di_sync_config( |
1106 | disp, /* display */ | 1106 | disp, /* display */ |
1107 | 9, /* counter */ | 1107 | 9, /* counter */ |
1108 | v_total - 1, /* run count */ | 1108 | v_total - 1, /* run count */ |
1109 | DI_SYNC_INT_HSYNC,/* run_resolution */ | 1109 | DI_SYNC_INT_HSYNC,/* run_resolution */ |
1110 | v_total / 2, /* offset */ | 1110 | v_total / 2, /* offset */ |
1111 | DI_SYNC_INT_HSYNC,/* offset resolution */ | 1111 | DI_SYNC_INT_HSYNC,/* offset resolution */ |
1112 | 0, /* repeat count */ | 1112 | 0, /* repeat count */ |
1113 | DI_SYNC_HSYNC, /* CNT_CLR_SEL */ | 1113 | DI_SYNC_HSYNC, /* CNT_CLR_SEL */ |
1114 | 0, /* CNT_POLARITY_GEN_EN */ | 1114 | 0, /* CNT_POLARITY_GEN_EN */ |
1115 | DI_SYNC_NONE, /* CNT_POLARITY_CLR_SEL */ | 1115 | DI_SYNC_NONE, /* CNT_POLARITY_CLR_SEL */ |
1116 | DI_SYNC_NONE, /* CNT_POLARITY_TRIGGER_SEL */ | 1116 | DI_SYNC_NONE, /* CNT_POLARITY_TRIGGER_SEL */ |
1117 | 0, /* COUNT UP */ | 1117 | 0, /* COUNT UP */ |
1118 | 4 /* COUNT DOWN */ | 1118 | 4 /* COUNT DOWN */ |
1119 | ); | 1119 | ); |
1120 | 1120 | ||
1121 | /* set gentime select and tag sel */ | 1121 | /* set gentime select and tag sel */ |
1122 | reg = __raw_readl(DI_SW_GEN1(disp, 9)); | 1122 | reg = __raw_readl(DI_SW_GEN1(disp, 9)); |
1123 | reg &= 0x1FFFFFFF; | 1123 | reg &= 0x1FFFFFFF; |
1124 | reg |= (3 - 1)<<29 | 0x00008000; | 1124 | reg |= (3 - 1)<<29 | 0x00008000; |
1125 | __raw_writel(reg, DI_SW_GEN1(disp, 9)); | 1125 | __raw_writel(reg, DI_SW_GEN1(disp, 9)); |
1126 | 1126 | ||
1127 | __raw_writel(v_total / 2 - 1, DI_SCR_CONF(disp)); | 1127 | __raw_writel(v_total / 2 - 1, DI_SCR_CONF(disp)); |
1128 | 1128 | ||
1129 | /* set y_sel = 1 */ | 1129 | /* set y_sel = 1 */ |
1130 | di_gen |= 0x10000000; | 1130 | di_gen |= 0x10000000; |
1131 | di_gen |= DI_GEN_POLARITY_5; | 1131 | di_gen |= DI_GEN_POLARITY_5; |
1132 | di_gen |= DI_GEN_POLARITY_8; | 1132 | di_gen |= DI_GEN_POLARITY_8; |
1133 | } else { | 1133 | } else { |
1134 | /* Setup internal HSYNC waveform */ | 1134 | /* Setup internal HSYNC waveform */ |
1135 | ipu_di_sync_config(disp, 1, h_total - 1, DI_SYNC_CLK, | 1135 | ipu_di_sync_config(disp, 1, h_total - 1, DI_SYNC_CLK, |
1136 | 0, DI_SYNC_NONE, 0, DI_SYNC_NONE, | 1136 | 0, DI_SYNC_NONE, 0, DI_SYNC_NONE, |
1137 | 0, DI_SYNC_NONE, | 1137 | 0, DI_SYNC_NONE, |
1138 | DI_SYNC_NONE, 0, 0); | 1138 | DI_SYNC_NONE, 0, 0); |
1139 | 1139 | ||
1140 | /* Setup external (delayed) HSYNC waveform */ | 1140 | /* Setup external (delayed) HSYNC waveform */ |
1141 | ipu_di_sync_config(disp, DI_SYNC_HSYNC, h_total - 1, | 1141 | ipu_di_sync_config(disp, DI_SYNC_HSYNC, h_total - 1, |
1142 | DI_SYNC_CLK, div * v_to_h_sync, DI_SYNC_CLK, | 1142 | DI_SYNC_CLK, div * v_to_h_sync, DI_SYNC_CLK, |
1143 | 0, DI_SYNC_NONE, 1, DI_SYNC_NONE, | 1143 | 0, DI_SYNC_NONE, 1, DI_SYNC_NONE, |
1144 | DI_SYNC_CLK, 0, h_sync_width * 2); | 1144 | DI_SYNC_CLK, 0, h_sync_width * 2); |
1145 | /* Setup VSYNC waveform */ | 1145 | /* Setup VSYNC waveform */ |
1146 | vsync_cnt = DI_SYNC_VSYNC; | 1146 | vsync_cnt = DI_SYNC_VSYNC; |
1147 | ipu_di_sync_config(disp, DI_SYNC_VSYNC, v_total - 1, | 1147 | ipu_di_sync_config(disp, DI_SYNC_VSYNC, v_total - 1, |
1148 | DI_SYNC_INT_HSYNC, 0, DI_SYNC_NONE, 0, | 1148 | DI_SYNC_INT_HSYNC, 0, DI_SYNC_NONE, 0, |
1149 | DI_SYNC_NONE, 1, DI_SYNC_NONE, | 1149 | DI_SYNC_NONE, 1, DI_SYNC_NONE, |
1150 | DI_SYNC_INT_HSYNC, 0, v_sync_width * 2); | 1150 | DI_SYNC_INT_HSYNC, 0, v_sync_width * 2); |
1151 | __raw_writel(v_total - 1, DI_SCR_CONF(disp)); | 1151 | __raw_writel(v_total - 1, DI_SCR_CONF(disp)); |
1152 | 1152 | ||
1153 | /* Setup active data waveform to sync with DC */ | 1153 | /* Setup active data waveform to sync with DC */ |
1154 | ipu_di_sync_config(disp, 4, 0, DI_SYNC_HSYNC, | 1154 | ipu_di_sync_config(disp, 4, 0, DI_SYNC_HSYNC, |
1155 | v_sync_width + v_start_width, DI_SYNC_HSYNC, | 1155 | v_sync_width + v_start_width, DI_SYNC_HSYNC, |
1156 | height, | 1156 | height, |
1157 | DI_SYNC_VSYNC, 0, DI_SYNC_NONE, | 1157 | DI_SYNC_VSYNC, 0, DI_SYNC_NONE, |
1158 | DI_SYNC_NONE, 0, 0); | 1158 | DI_SYNC_NONE, 0, 0); |
1159 | ipu_di_sync_config(disp, 5, 0, DI_SYNC_CLK, | 1159 | ipu_di_sync_config(disp, 5, 0, DI_SYNC_CLK, |
1160 | h_sync_width + h_start_width, DI_SYNC_CLK, | 1160 | h_sync_width + h_start_width, DI_SYNC_CLK, |
1161 | width, 4, 0, DI_SYNC_NONE, DI_SYNC_NONE, 0, | 1161 | width, 4, 0, DI_SYNC_NONE, DI_SYNC_NONE, 0, |
1162 | 0); | 1162 | 0); |
1163 | 1163 | ||
1164 | /* reset all unused counters */ | 1164 | /* reset all unused counters */ |
1165 | __raw_writel(0, DI_SW_GEN0(disp, 6)); | 1165 | __raw_writel(0, DI_SW_GEN0(disp, 6)); |
1166 | __raw_writel(0, DI_SW_GEN1(disp, 6)); | 1166 | __raw_writel(0, DI_SW_GEN1(disp, 6)); |
1167 | __raw_writel(0, DI_SW_GEN0(disp, 7)); | 1167 | __raw_writel(0, DI_SW_GEN0(disp, 7)); |
1168 | __raw_writel(0, DI_SW_GEN1(disp, 7)); | 1168 | __raw_writel(0, DI_SW_GEN1(disp, 7)); |
1169 | __raw_writel(0, DI_SW_GEN0(disp, 8)); | 1169 | __raw_writel(0, DI_SW_GEN0(disp, 8)); |
1170 | __raw_writel(0, DI_SW_GEN1(disp, 8)); | 1170 | __raw_writel(0, DI_SW_GEN1(disp, 8)); |
1171 | __raw_writel(0, DI_SW_GEN0(disp, 9)); | 1171 | __raw_writel(0, DI_SW_GEN0(disp, 9)); |
1172 | __raw_writel(0, DI_SW_GEN1(disp, 9)); | 1172 | __raw_writel(0, DI_SW_GEN1(disp, 9)); |
1173 | 1173 | ||
1174 | reg = __raw_readl(DI_STP_REP(disp, 6)); | 1174 | reg = __raw_readl(DI_STP_REP(disp, 6)); |
1175 | reg &= 0x0000FFFF; | 1175 | reg &= 0x0000FFFF; |
1176 | __raw_writel(reg, DI_STP_REP(disp, 6)); | 1176 | __raw_writel(reg, DI_STP_REP(disp, 6)); |
1177 | __raw_writel(0, DI_STP_REP(disp, 7)); | 1177 | __raw_writel(0, DI_STP_REP(disp, 7)); |
1178 | __raw_writel(0, DI_STP_REP(disp, 9)); | 1178 | __raw_writel(0, DI_STP_REP(disp, 9)); |
1179 | 1179 | ||
1180 | /* Init template microcode */ | 1180 | /* Init template microcode */ |
1181 | if (disp) { | 1181 | if (disp) { |
1182 | ipu_dc_write_tmpl(2, WROD(0), 0, map, SYNC_WAVE, 8, 5); | 1182 | ipu_dc_write_tmpl(2, WROD(0), 0, map, SYNC_WAVE, 8, 5); |
1183 | ipu_dc_write_tmpl(3, WROD(0), 0, map, SYNC_WAVE, 4, 5); | 1183 | ipu_dc_write_tmpl(3, WROD(0), 0, map, SYNC_WAVE, 4, 5); |
1184 | ipu_dc_write_tmpl(4, WROD(0), 0, map, SYNC_WAVE, 0, 5); | 1184 | ipu_dc_write_tmpl(4, WROD(0), 0, map, SYNC_WAVE, 0, 5); |
1185 | } else { | 1185 | } else { |
1186 | ipu_dc_write_tmpl(5, WROD(0), 0, map, SYNC_WAVE, 8, 5); | 1186 | ipu_dc_write_tmpl(5, WROD(0), 0, map, SYNC_WAVE, 8, 5); |
1187 | ipu_dc_write_tmpl(6, WROD(0), 0, map, SYNC_WAVE, 4, 5); | 1187 | ipu_dc_write_tmpl(6, WROD(0), 0, map, SYNC_WAVE, 4, 5); |
1188 | ipu_dc_write_tmpl(7, WROD(0), 0, map, SYNC_WAVE, 0, 5); | 1188 | ipu_dc_write_tmpl(7, WROD(0), 0, map, SYNC_WAVE, 0, 5); |
1189 | } | 1189 | } |
1190 | 1190 | ||
1191 | if (sig.Hsync_pol) | 1191 | if (sig.Hsync_pol) |
1192 | di_gen |= DI_GEN_POLARITY_2; | 1192 | di_gen |= DI_GEN_POLARITY_2; |
1193 | if (sig.Vsync_pol) | 1193 | if (sig.Vsync_pol) |
1194 | di_gen |= DI_GEN_POLARITY_3; | 1194 | di_gen |= DI_GEN_POLARITY_3; |
1195 | 1195 | ||
1196 | if (sig.clk_pol) | 1196 | if (sig.clk_pol) |
1197 | di_gen |= DI_GEN_POL_CLK; | 1197 | di_gen |= DI_GEN_POL_CLK; |
1198 | 1198 | ||
1199 | } | 1199 | } |
1200 | 1200 | ||
1201 | __raw_writel(di_gen, DI_GENERAL(disp)); | 1201 | __raw_writel(di_gen, DI_GENERAL(disp)); |
1202 | 1202 | ||
1203 | __raw_writel((--vsync_cnt << DI_VSYNC_SEL_OFFSET) | | 1203 | __raw_writel((--vsync_cnt << DI_VSYNC_SEL_OFFSET) | |
1204 | 0x00000002, DI_SYNC_AS_GEN(disp)); | 1204 | 0x00000002, DI_SYNC_AS_GEN(disp)); |
1205 | 1205 | ||
1206 | reg = __raw_readl(DI_POL(disp)); | 1206 | reg = __raw_readl(DI_POL(disp)); |
1207 | reg &= ~(DI_POL_DRDY_DATA_POLARITY | DI_POL_DRDY_POLARITY_15); | 1207 | reg &= ~(DI_POL_DRDY_DATA_POLARITY | DI_POL_DRDY_POLARITY_15); |
1208 | if (sig.enable_pol) | 1208 | if (sig.enable_pol) |
1209 | reg |= DI_POL_DRDY_POLARITY_15; | 1209 | reg |= DI_POL_DRDY_POLARITY_15; |
1210 | if (sig.data_pol) | 1210 | if (sig.data_pol) |
1211 | reg |= DI_POL_DRDY_DATA_POLARITY; | 1211 | reg |= DI_POL_DRDY_DATA_POLARITY; |
1212 | __raw_writel(reg, DI_POL(disp)); | 1212 | __raw_writel(reg, DI_POL(disp)); |
1213 | 1213 | ||
1214 | __raw_writel(width, DC_DISP_CONF2(DC_DISP_ID_SYNC(disp))); | 1214 | __raw_writel(width, DC_DISP_CONF2(DC_DISP_ID_SYNC(disp))); |
1215 | 1215 | ||
1216 | return 0; | 1216 | return 0; |
1217 | } | 1217 | } |
1218 | 1218 | ||
1219 | /* | 1219 | /* |
1220 | * This function sets the foreground and background plane global alpha blending | 1220 | * This function sets the foreground and background plane global alpha blending |
1221 | * modes. This function also sets the DP graphic plane according to the | 1221 | * modes. This function also sets the DP graphic plane according to the |
1222 | * parameter of IPUv3 DP channel. | 1222 | * parameter of IPUv3 DP channel. |
1223 | * | 1223 | * |
1224 | * @param channel IPUv3 DP channel | 1224 | * @param channel IPUv3 DP channel |
1225 | * | 1225 | * |
1226 | * @param enable Boolean to enable or disable global alpha | 1226 | * @param enable Boolean to enable or disable global alpha |
1227 | * blending. If disabled, local blending is used. | 1227 | * blending. If disabled, local blending is used. |
1228 | * | 1228 | * |
1229 | * @param alpha Global alpha value. | 1229 | * @param alpha Global alpha value. |
1230 | * | 1230 | * |
1231 | * @return Returns 0 on success or negative error code on fail | 1231 | * @return Returns 0 on success or negative error code on fail |
1232 | */ | 1232 | */ |
1233 | int32_t ipu_disp_set_global_alpha(ipu_channel_t channel, unsigned char enable, | 1233 | int32_t ipu_disp_set_global_alpha(ipu_channel_t channel, unsigned char enable, |
1234 | uint8_t alpha) | 1234 | uint8_t alpha) |
1235 | { | 1235 | { |
1236 | uint32_t reg; | 1236 | uint32_t reg; |
1237 | uint32_t flow; | ||
1238 | 1237 | ||
1239 | unsigned char bg_chan; | 1238 | unsigned char bg_chan; |
1240 | 1239 | ||
1241 | if (channel == MEM_BG_SYNC || channel == MEM_FG_SYNC) | 1240 | if (!((channel == MEM_BG_SYNC || channel == MEM_FG_SYNC) || |
1242 | flow = DP_SYNC; | 1241 | (channel == MEM_BG_ASYNC0 || channel == MEM_FG_ASYNC0) || |
1243 | else if (channel == MEM_BG_ASYNC0 || channel == MEM_FG_ASYNC0) | 1242 | (channel == MEM_BG_ASYNC1 || channel == MEM_FG_ASYNC1))) |
1244 | flow = DP_ASYNC0; | ||
1245 | else if (channel == MEM_BG_ASYNC1 || channel == MEM_FG_ASYNC1) | ||
1246 | flow = DP_ASYNC1; | ||
1247 | else | ||
1248 | return -EINVAL; | 1243 | return -EINVAL; |
1249 | 1244 | ||
1250 | if (channel == MEM_BG_SYNC || channel == MEM_BG_ASYNC0 || | 1245 | if (channel == MEM_BG_SYNC || channel == MEM_BG_ASYNC0 || |
1251 | channel == MEM_BG_ASYNC1) | 1246 | channel == MEM_BG_ASYNC1) |
1252 | bg_chan = 1; | 1247 | bg_chan = 1; |
1253 | else | 1248 | else |
1254 | bg_chan = 0; | 1249 | bg_chan = 0; |
1255 | 1250 | ||
1256 | if (!g_ipu_clk_enabled) | 1251 | if (!g_ipu_clk_enabled) |
1257 | clk_enable(g_ipu_clk); | 1252 | clk_enable(g_ipu_clk); |
1258 | 1253 | ||
1259 | if (bg_chan) { | 1254 | if (bg_chan) { |
1260 | reg = __raw_readl(DP_COM_CONF(flow)); | 1255 | reg = __raw_readl(DP_COM_CONF()); |
1261 | __raw_writel(reg & ~DP_COM_CONF_GWSEL, DP_COM_CONF(flow)); | 1256 | __raw_writel(reg & ~DP_COM_CONF_GWSEL, DP_COM_CONF()); |
1262 | } else { | 1257 | } else { |
1263 | reg = __raw_readl(DP_COM_CONF(flow)); | 1258 | reg = __raw_readl(DP_COM_CONF()); |
1264 | __raw_writel(reg | DP_COM_CONF_GWSEL, DP_COM_CONF(flow)); | 1259 | __raw_writel(reg | DP_COM_CONF_GWSEL, DP_COM_CONF()); |
1265 | } | 1260 | } |
1266 | 1261 | ||
1267 | if (enable) { | 1262 | if (enable) { |
1268 | reg = __raw_readl(DP_GRAPH_WIND_CTRL(flow)) & 0x00FFFFFFL; | 1263 | reg = __raw_readl(DP_GRAPH_WIND_CTRL()) & 0x00FFFFFFL; |
1269 | __raw_writel(reg | ((uint32_t) alpha << 24), | 1264 | __raw_writel(reg | ((uint32_t) alpha << 24), |
1270 | DP_GRAPH_WIND_CTRL(flow)); | 1265 | DP_GRAPH_WIND_CTRL()); |
1271 | 1266 | ||
1272 | reg = __raw_readl(DP_COM_CONF(flow)); | 1267 | reg = __raw_readl(DP_COM_CONF()); |
1273 | __raw_writel(reg | DP_COM_CONF_GWAM, DP_COM_CONF(flow)); | 1268 | __raw_writel(reg | DP_COM_CONF_GWAM, DP_COM_CONF()); |
1274 | } else { | 1269 | } else { |
1275 | reg = __raw_readl(DP_COM_CONF(flow)); | 1270 | reg = __raw_readl(DP_COM_CONF()); |
1276 | __raw_writel(reg & ~DP_COM_CONF_GWAM, DP_COM_CONF(flow)); | 1271 | __raw_writel(reg & ~DP_COM_CONF_GWAM, DP_COM_CONF()); |
1277 | } | 1272 | } |
1278 | 1273 | ||
1279 | reg = __raw_readl(IPU_SRM_PRI2) | 0x8; | 1274 | reg = __raw_readl(IPU_SRM_PRI2) | 0x8; |
1280 | __raw_writel(reg, IPU_SRM_PRI2); | 1275 | __raw_writel(reg, IPU_SRM_PRI2); |
1281 | 1276 | ||
1282 | if (!g_ipu_clk_enabled) | 1277 | if (!g_ipu_clk_enabled) |
1283 | clk_disable(g_ipu_clk); | 1278 | clk_disable(g_ipu_clk); |
1284 | 1279 | ||
1285 | return 0; | 1280 | return 0; |
1286 | } | 1281 | } |
1287 | 1282 | ||
1288 | /* | 1283 | /* |
1289 | * This function sets the transparent color key for SDC graphic plane. | 1284 | * This function sets the transparent color key for SDC graphic plane. |
1290 | * | 1285 | * |
1291 | * @param channel Input parameter for the logical channel ID. | 1286 | * @param channel Input parameter for the logical channel ID. |
1292 | * | 1287 | * |
1293 | * @param enable Boolean to enable or disable color key | 1288 | * @param enable Boolean to enable or disable color key |
1294 | * | 1289 | * |
1295 | * @param colorKey 24-bit RGB color for transparent color key. | 1290 | * @param colorKey 24-bit RGB color for transparent color key. |
1296 | * | 1291 | * |
1297 | * @return Returns 0 on success or negative error code on fail | 1292 | * @return Returns 0 on success or negative error code on fail |
1298 | */ | 1293 | */ |
1299 | int32_t ipu_disp_set_color_key(ipu_channel_t channel, unsigned char enable, | 1294 | int32_t ipu_disp_set_color_key(ipu_channel_t channel, unsigned char enable, |
1300 | uint32_t color_key) | 1295 | uint32_t color_key) |
1301 | { | 1296 | { |
1302 | uint32_t reg, flow; | 1297 | uint32_t reg; |
1303 | int y, u, v; | 1298 | int y, u, v; |
1304 | int red, green, blue; | 1299 | int red, green, blue; |
1305 | 1300 | ||
1306 | if (channel == MEM_BG_SYNC || channel == MEM_FG_SYNC) | 1301 | if (!((channel == MEM_BG_SYNC || channel == MEM_FG_SYNC) || |
1307 | flow = DP_SYNC; | 1302 | (channel == MEM_BG_ASYNC0 || channel == MEM_FG_ASYNC0) || |
1308 | else if (channel == MEM_BG_ASYNC0 || channel == MEM_FG_ASYNC0) | 1303 | (channel == MEM_BG_ASYNC1 || channel == MEM_FG_ASYNC1))) |
1309 | flow = DP_ASYNC0; | ||
1310 | else if (channel == MEM_BG_ASYNC1 || channel == MEM_FG_ASYNC1) | ||
1311 | flow = DP_ASYNC1; | ||
1312 | else | ||
1313 | return -EINVAL; | 1304 | return -EINVAL; |
1314 | 1305 | ||
1315 | if (!g_ipu_clk_enabled) | 1306 | if (!g_ipu_clk_enabled) |
1316 | clk_enable(g_ipu_clk); | 1307 | clk_enable(g_ipu_clk); |
1317 | 1308 | ||
1318 | color_key_4rgb = 1; | 1309 | color_key_4rgb = 1; |
1319 | /* Transform color key from rgb to yuv if CSC is enabled */ | 1310 | /* Transform color key from rgb to yuv if CSC is enabled */ |
1320 | if (((fg_csc_type == RGB2YUV) && (bg_csc_type == YUV2YUV)) || | 1311 | if (((fg_csc_type == RGB2YUV) && (bg_csc_type == YUV2YUV)) || |
1321 | ((fg_csc_type == YUV2YUV) && (bg_csc_type == RGB2YUV)) || | 1312 | ((fg_csc_type == YUV2YUV) && (bg_csc_type == RGB2YUV)) || |
1322 | ((fg_csc_type == YUV2YUV) && (bg_csc_type == YUV2YUV)) || | 1313 | ((fg_csc_type == YUV2YUV) && (bg_csc_type == YUV2YUV)) || |
1323 | ((fg_csc_type == YUV2RGB) && (bg_csc_type == YUV2RGB))) { | 1314 | ((fg_csc_type == YUV2RGB) && (bg_csc_type == YUV2RGB))) { |
1324 | 1315 | ||
1325 | debug("color key 0x%x need change to yuv fmt\n", color_key); | 1316 | debug("color key 0x%x need change to yuv fmt\n", color_key); |
1326 | 1317 | ||
1327 | red = (color_key >> 16) & 0xFF; | 1318 | red = (color_key >> 16) & 0xFF; |
1328 | green = (color_key >> 8) & 0xFF; | 1319 | green = (color_key >> 8) & 0xFF; |
1329 | blue = color_key & 0xFF; | 1320 | blue = color_key & 0xFF; |
1330 | 1321 | ||
1331 | y = rgb_to_yuv(0, red, green, blue); | 1322 | y = rgb_to_yuv(0, red, green, blue); |
1332 | u = rgb_to_yuv(1, red, green, blue); | 1323 | u = rgb_to_yuv(1, red, green, blue); |
1333 | v = rgb_to_yuv(2, red, green, blue); | 1324 | v = rgb_to_yuv(2, red, green, blue); |
1334 | color_key = (y << 16) | (u << 8) | v; | 1325 | color_key = (y << 16) | (u << 8) | v; |
1335 | 1326 | ||
1336 | color_key_4rgb = 0; | 1327 | color_key_4rgb = 0; |
1337 | 1328 | ||
1338 | debug("color key change to yuv fmt 0x%x\n", color_key); | 1329 | debug("color key change to yuv fmt 0x%x\n", color_key); |
1339 | } | 1330 | } |
1340 | 1331 | ||
1341 | if (enable) { | 1332 | if (enable) { |
1342 | reg = __raw_readl(DP_GRAPH_WIND_CTRL(flow)) & 0xFF000000L; | 1333 | reg = __raw_readl(DP_GRAPH_WIND_CTRL()) & 0xFF000000L; |
1343 | __raw_writel(reg | color_key, DP_GRAPH_WIND_CTRL(flow)); | 1334 | __raw_writel(reg | color_key, DP_GRAPH_WIND_CTRL()); |
1344 | 1335 | ||
1345 | reg = __raw_readl(DP_COM_CONF(flow)); | 1336 | reg = __raw_readl(DP_COM_CONF()); |
1346 | __raw_writel(reg | DP_COM_CONF_GWCKE, DP_COM_CONF(flow)); | 1337 | __raw_writel(reg | DP_COM_CONF_GWCKE, DP_COM_CONF()); |
1347 | } else { | 1338 | } else { |
1348 | reg = __raw_readl(DP_COM_CONF(flow)); | 1339 | reg = __raw_readl(DP_COM_CONF()); |
1349 | __raw_writel(reg & ~DP_COM_CONF_GWCKE, DP_COM_CONF(flow)); | 1340 | __raw_writel(reg & ~DP_COM_CONF_GWCKE, DP_COM_CONF()); |
1350 | } | 1341 | } |
1351 | 1342 | ||
1352 | reg = __raw_readl(IPU_SRM_PRI2) | 0x8; | 1343 | reg = __raw_readl(IPU_SRM_PRI2) | 0x8; |
1353 | __raw_writel(reg, IPU_SRM_PRI2); | 1344 | __raw_writel(reg, IPU_SRM_PRI2); |
1354 | 1345 | ||
1355 | if (!g_ipu_clk_enabled) | 1346 | if (!g_ipu_clk_enabled) |
1356 | clk_disable(g_ipu_clk); | 1347 | clk_disable(g_ipu_clk); |
1357 | 1348 | ||
1358 | return 0; | 1349 | return 0; |
1359 | } | 1350 | } |
1360 | 1351 |
drivers/video/ipu_regs.h
1 | /* | 1 | /* |
2 | * Porting to u-boot: | 2 | * Porting to u-boot: |
3 | * | 3 | * |
4 | * (C) Copyright 2010 | 4 | * (C) Copyright 2010 |
5 | * Stefano Babic, DENX Software Engineering, sbabic@denx.de | 5 | * Stefano Babic, DENX Software Engineering, sbabic@denx.de |
6 | * | 6 | * |
7 | * Linux IPU driver for MX51: | 7 | * Linux IPU driver for MX51: |
8 | * | 8 | * |
9 | * (C) Copyright 2005-2009 Freescale Semiconductor, Inc. | 9 | * (C) Copyright 2005-2009 Freescale Semiconductor, Inc. |
10 | * | 10 | * |
11 | * See file CREDITS for list of people who contributed to this | 11 | * See file CREDITS for list of people who contributed to this |
12 | * project. | 12 | * project. |
13 | * | 13 | * |
14 | * This program is free software; you can redistribute it and/or | 14 | * This program is free software; you can redistribute it and/or |
15 | * modify it under the terms of the GNU General Public License as | 15 | * modify it under the terms of the GNU General Public License as |
16 | * published by the Free Software Foundation; either version 2 of | 16 | * published by the Free Software Foundation; either version 2 of |
17 | * the License, or (at your option) any later version. | 17 | * the License, or (at your option) any later version. |
18 | * | 18 | * |
19 | * This program is distributed in the hope that it will be useful, | 19 | * This program is distributed in the hope that it will be useful, |
20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
22 | * GNU General Public License for more details. | 22 | * GNU General Public License for more details. |
23 | * | 23 | * |
24 | * You should have received a copy of the GNU General Public License | 24 | * You should have received a copy of the GNU General Public License |
25 | * along with this program; if not, write to the Free Software | 25 | * along with this program; if not, write to the Free Software |
26 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, | 26 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
27 | * MA 02111-1307 USA | 27 | * MA 02111-1307 USA |
28 | */ | 28 | */ |
29 | 29 | ||
30 | #ifndef __IPU_REGS_INCLUDED__ | 30 | #ifndef __IPU_REGS_INCLUDED__ |
31 | #define __IPU_REGS_INCLUDED__ | 31 | #define __IPU_REGS_INCLUDED__ |
32 | 32 | ||
33 | #define IPU_DISP0_BASE 0x00000000 | 33 | #define IPU_DISP0_BASE 0x00000000 |
34 | #define IPU_MCU_T_DEFAULT 8 | 34 | #define IPU_MCU_T_DEFAULT 8 |
35 | #define IPU_DISP1_BASE (IPU_MCU_T_DEFAULT << 25) | 35 | #define IPU_DISP1_BASE (IPU_MCU_T_DEFAULT << 25) |
36 | #define IPU_CM_REG_BASE 0x1E000000 | 36 | #define IPU_CM_REG_BASE 0x1E000000 |
37 | #define IPU_STAT_REG_BASE 0x1E000200 | 37 | #define IPU_STAT_REG_BASE 0x1E000200 |
38 | #define IPU_IDMAC_REG_BASE 0x1E008000 | 38 | #define IPU_IDMAC_REG_BASE 0x1E008000 |
39 | #define IPU_ISP_REG_BASE 0x1E010000 | 39 | #define IPU_ISP_REG_BASE 0x1E010000 |
40 | #define IPU_DP_REG_BASE 0x1E018000 | 40 | #define IPU_DP_REG_BASE 0x1E018000 |
41 | #define IPU_IC_REG_BASE 0x1E020000 | 41 | #define IPU_IC_REG_BASE 0x1E020000 |
42 | #define IPU_IRT_REG_BASE 0x1E028000 | 42 | #define IPU_IRT_REG_BASE 0x1E028000 |
43 | #define IPU_CSI0_REG_BASE 0x1E030000 | 43 | #define IPU_CSI0_REG_BASE 0x1E030000 |
44 | #define IPU_CSI1_REG_BASE 0x1E038000 | 44 | #define IPU_CSI1_REG_BASE 0x1E038000 |
45 | #define IPU_DI0_REG_BASE 0x1E040000 | 45 | #define IPU_DI0_REG_BASE 0x1E040000 |
46 | #define IPU_DI1_REG_BASE 0x1E048000 | 46 | #define IPU_DI1_REG_BASE 0x1E048000 |
47 | #define IPU_SMFC_REG_BASE 0x1E050000 | 47 | #define IPU_SMFC_REG_BASE 0x1E050000 |
48 | #define IPU_DC_REG_BASE 0x1E058000 | 48 | #define IPU_DC_REG_BASE 0x1E058000 |
49 | #define IPU_DMFC_REG_BASE 0x1E060000 | 49 | #define IPU_DMFC_REG_BASE 0x1E060000 |
50 | #define IPU_CPMEM_REG_BASE 0x1F000000 | 50 | #define IPU_CPMEM_REG_BASE 0x1F000000 |
51 | #define IPU_LUT_REG_BASE 0x1F020000 | 51 | #define IPU_LUT_REG_BASE 0x1F020000 |
52 | #define IPU_SRM_REG_BASE 0x1F040000 | 52 | #define IPU_SRM_REG_BASE 0x1F040000 |
53 | #define IPU_TPM_REG_BASE 0x1F060000 | 53 | #define IPU_TPM_REG_BASE 0x1F060000 |
54 | #define IPU_DC_TMPL_REG_BASE 0x1F080000 | 54 | #define IPU_DC_TMPL_REG_BASE 0x1F080000 |
55 | #define IPU_ISP_TBPR_REG_BASE 0x1F0C0000 | 55 | #define IPU_ISP_TBPR_REG_BASE 0x1F0C0000 |
56 | #define IPU_VDI_REG_BASE 0x1E068000 | 56 | #define IPU_VDI_REG_BASE 0x1E068000 |
57 | 57 | ||
58 | 58 | ||
59 | extern u32 *ipu_dc_tmpl_reg; | 59 | extern u32 *ipu_dc_tmpl_reg; |
60 | 60 | ||
61 | #define DC_EVT_NF 0 | 61 | #define DC_EVT_NF 0 |
62 | #define DC_EVT_NL 1 | 62 | #define DC_EVT_NL 1 |
63 | #define DC_EVT_EOF 2 | 63 | #define DC_EVT_EOF 2 |
64 | #define DC_EVT_NFIELD 3 | 64 | #define DC_EVT_NFIELD 3 |
65 | #define DC_EVT_EOL 4 | 65 | #define DC_EVT_EOL 4 |
66 | #define DC_EVT_EOFIELD 5 | 66 | #define DC_EVT_EOFIELD 5 |
67 | #define DC_EVT_NEW_ADDR 6 | 67 | #define DC_EVT_NEW_ADDR 6 |
68 | #define DC_EVT_NEW_CHAN 7 | 68 | #define DC_EVT_NEW_CHAN 7 |
69 | #define DC_EVT_NEW_DATA 8 | 69 | #define DC_EVT_NEW_DATA 8 |
70 | 70 | ||
71 | #define DC_EVT_NEW_ADDR_W_0 0 | 71 | #define DC_EVT_NEW_ADDR_W_0 0 |
72 | #define DC_EVT_NEW_ADDR_W_1 1 | 72 | #define DC_EVT_NEW_ADDR_W_1 1 |
73 | #define DC_EVT_NEW_CHAN_W_0 2 | 73 | #define DC_EVT_NEW_CHAN_W_0 2 |
74 | #define DC_EVT_NEW_CHAN_W_1 3 | 74 | #define DC_EVT_NEW_CHAN_W_1 3 |
75 | #define DC_EVT_NEW_DATA_W_0 4 | 75 | #define DC_EVT_NEW_DATA_W_0 4 |
76 | #define DC_EVT_NEW_DATA_W_1 5 | 76 | #define DC_EVT_NEW_DATA_W_1 5 |
77 | #define DC_EVT_NEW_ADDR_R_0 6 | 77 | #define DC_EVT_NEW_ADDR_R_0 6 |
78 | #define DC_EVT_NEW_ADDR_R_1 7 | 78 | #define DC_EVT_NEW_ADDR_R_1 7 |
79 | #define DC_EVT_NEW_CHAN_R_0 8 | 79 | #define DC_EVT_NEW_CHAN_R_0 8 |
80 | #define DC_EVT_NEW_CHAN_R_1 9 | 80 | #define DC_EVT_NEW_CHAN_R_1 9 |
81 | #define DC_EVT_NEW_DATA_R_0 10 | 81 | #define DC_EVT_NEW_DATA_R_0 10 |
82 | #define DC_EVT_NEW_DATA_R_1 11 | 82 | #define DC_EVT_NEW_DATA_R_1 11 |
83 | 83 | ||
84 | /* Software reset for ipu */ | 84 | /* Software reset for ipu */ |
85 | #define SW_IPU_RST 8 | 85 | #define SW_IPU_RST 8 |
86 | 86 | ||
87 | enum { | 87 | enum { |
88 | IPU_CONF_DP_EN = 0x00000020, | 88 | IPU_CONF_DP_EN = 0x00000020, |
89 | IPU_CONF_DI0_EN = 0x00000040, | 89 | IPU_CONF_DI0_EN = 0x00000040, |
90 | IPU_CONF_DI1_EN = 0x00000080, | 90 | IPU_CONF_DI1_EN = 0x00000080, |
91 | IPU_CONF_DMFC_EN = 0x00000400, | 91 | IPU_CONF_DMFC_EN = 0x00000400, |
92 | IPU_CONF_DC_EN = 0x00000200, | 92 | IPU_CONF_DC_EN = 0x00000200, |
93 | 93 | ||
94 | DI0_COUNTER_RELEASE = 0x01000000, | 94 | DI0_COUNTER_RELEASE = 0x01000000, |
95 | DI1_COUNTER_RELEASE = 0x02000000, | 95 | DI1_COUNTER_RELEASE = 0x02000000, |
96 | 96 | ||
97 | DI_DW_GEN_ACCESS_SIZE_OFFSET = 24, | 97 | DI_DW_GEN_ACCESS_SIZE_OFFSET = 24, |
98 | DI_DW_GEN_COMPONENT_SIZE_OFFSET = 16, | 98 | DI_DW_GEN_COMPONENT_SIZE_OFFSET = 16, |
99 | 99 | ||
100 | DI_GEN_DI_CLK_EXT = 0x100000, | 100 | DI_GEN_DI_CLK_EXT = 0x100000, |
101 | DI_GEN_POLARITY_1 = 0x00000001, | 101 | DI_GEN_POLARITY_1 = 0x00000001, |
102 | DI_GEN_POLARITY_2 = 0x00000002, | 102 | DI_GEN_POLARITY_2 = 0x00000002, |
103 | DI_GEN_POLARITY_3 = 0x00000004, | 103 | DI_GEN_POLARITY_3 = 0x00000004, |
104 | DI_GEN_POLARITY_4 = 0x00000008, | 104 | DI_GEN_POLARITY_4 = 0x00000008, |
105 | DI_GEN_POLARITY_5 = 0x00000010, | 105 | DI_GEN_POLARITY_5 = 0x00000010, |
106 | DI_GEN_POLARITY_6 = 0x00000020, | 106 | DI_GEN_POLARITY_6 = 0x00000020, |
107 | DI_GEN_POLARITY_7 = 0x00000040, | 107 | DI_GEN_POLARITY_7 = 0x00000040, |
108 | DI_GEN_POLARITY_8 = 0x00000080, | 108 | DI_GEN_POLARITY_8 = 0x00000080, |
109 | DI_GEN_POL_CLK = 0x20000, | 109 | DI_GEN_POL_CLK = 0x20000, |
110 | 110 | ||
111 | DI_POL_DRDY_DATA_POLARITY = 0x00000080, | 111 | DI_POL_DRDY_DATA_POLARITY = 0x00000080, |
112 | DI_POL_DRDY_POLARITY_15 = 0x00000010, | 112 | DI_POL_DRDY_POLARITY_15 = 0x00000010, |
113 | DI_VSYNC_SEL_OFFSET = 13, | 113 | DI_VSYNC_SEL_OFFSET = 13, |
114 | 114 | ||
115 | DC_WR_CH_CONF_FIELD_MODE = 0x00000200, | 115 | DC_WR_CH_CONF_FIELD_MODE = 0x00000200, |
116 | DC_WR_CH_CONF_PROG_TYPE_OFFSET = 5, | 116 | DC_WR_CH_CONF_PROG_TYPE_OFFSET = 5, |
117 | DC_WR_CH_CONF_PROG_TYPE_MASK = 0x000000E0, | 117 | DC_WR_CH_CONF_PROG_TYPE_MASK = 0x000000E0, |
118 | DC_WR_CH_CONF_PROG_DI_ID = 0x00000004, | 118 | DC_WR_CH_CONF_PROG_DI_ID = 0x00000004, |
119 | DC_WR_CH_CONF_PROG_DISP_ID_OFFSET = 3, | 119 | DC_WR_CH_CONF_PROG_DISP_ID_OFFSET = 3, |
120 | DC_WR_CH_CONF_PROG_DISP_ID_MASK = 0x00000018, | 120 | DC_WR_CH_CONF_PROG_DISP_ID_MASK = 0x00000018, |
121 | 121 | ||
122 | DP_COM_CONF_FG_EN = 0x00000001, | 122 | DP_COM_CONF_FG_EN = 0x00000001, |
123 | DP_COM_CONF_GWSEL = 0x00000002, | 123 | DP_COM_CONF_GWSEL = 0x00000002, |
124 | DP_COM_CONF_GWAM = 0x00000004, | 124 | DP_COM_CONF_GWAM = 0x00000004, |
125 | DP_COM_CONF_GWCKE = 0x00000008, | 125 | DP_COM_CONF_GWCKE = 0x00000008, |
126 | DP_COM_CONF_CSC_DEF_MASK = 0x00000300, | 126 | DP_COM_CONF_CSC_DEF_MASK = 0x00000300, |
127 | DP_COM_CONF_CSC_DEF_OFFSET = 8, | 127 | DP_COM_CONF_CSC_DEF_OFFSET = 8, |
128 | DP_COM_CONF_CSC_DEF_FG = 0x00000300, | 128 | DP_COM_CONF_CSC_DEF_FG = 0x00000300, |
129 | DP_COM_CONF_CSC_DEF_BG = 0x00000200, | 129 | DP_COM_CONF_CSC_DEF_BG = 0x00000200, |
130 | DP_COM_CONF_CSC_DEF_BOTH = 0x00000100, | 130 | DP_COM_CONF_CSC_DEF_BOTH = 0x00000100, |
131 | DP_COM_CONF_GAMMA_EN = 0x00001000, | 131 | DP_COM_CONF_GAMMA_EN = 0x00001000, |
132 | DP_COM_CONF_GAMMA_YUV_EN = 0x00002000, | 132 | DP_COM_CONF_GAMMA_YUV_EN = 0x00002000, |
133 | }; | 133 | }; |
134 | 134 | ||
135 | enum di_pins { | 135 | enum di_pins { |
136 | DI_PIN11 = 0, | 136 | DI_PIN11 = 0, |
137 | DI_PIN12 = 1, | 137 | DI_PIN12 = 1, |
138 | DI_PIN13 = 2, | 138 | DI_PIN13 = 2, |
139 | DI_PIN14 = 3, | 139 | DI_PIN14 = 3, |
140 | DI_PIN15 = 4, | 140 | DI_PIN15 = 4, |
141 | DI_PIN16 = 5, | 141 | DI_PIN16 = 5, |
142 | DI_PIN17 = 6, | 142 | DI_PIN17 = 6, |
143 | DI_PIN_CS = 7, | 143 | DI_PIN_CS = 7, |
144 | 144 | ||
145 | DI_PIN_SER_CLK = 0, | 145 | DI_PIN_SER_CLK = 0, |
146 | DI_PIN_SER_RS = 1, | 146 | DI_PIN_SER_RS = 1, |
147 | }; | 147 | }; |
148 | 148 | ||
149 | enum di_sync_wave { | 149 | enum di_sync_wave { |
150 | DI_SYNC_NONE = -1, | 150 | DI_SYNC_NONE = -1, |
151 | DI_SYNC_CLK = 0, | 151 | DI_SYNC_CLK = 0, |
152 | DI_SYNC_INT_HSYNC = 1, | 152 | DI_SYNC_INT_HSYNC = 1, |
153 | DI_SYNC_HSYNC = 2, | 153 | DI_SYNC_HSYNC = 2, |
154 | DI_SYNC_VSYNC = 3, | 154 | DI_SYNC_VSYNC = 3, |
155 | DI_SYNC_DE = 5, | 155 | DI_SYNC_DE = 5, |
156 | }; | 156 | }; |
157 | 157 | ||
158 | struct ipu_cm { | 158 | struct ipu_cm { |
159 | u32 conf; | 159 | u32 conf; |
160 | u32 sisg_ctrl0; | 160 | u32 sisg_ctrl0; |
161 | u32 sisg_ctrl1; | 161 | u32 sisg_ctrl1; |
162 | u32 sisg_set[6]; | 162 | u32 sisg_set[6]; |
163 | u32 sisg_clear[6]; | 163 | u32 sisg_clear[6]; |
164 | u32 int_ctrl[15]; | 164 | u32 int_ctrl[15]; |
165 | u32 sdma_event[10]; | 165 | u32 sdma_event[10]; |
166 | u32 srm_pri1; | 166 | u32 srm_pri1; |
167 | u32 srm_pri2; | 167 | u32 srm_pri2; |
168 | u32 fs_proc_flow[3]; | 168 | u32 fs_proc_flow[3]; |
169 | u32 fs_disp_flow[2]; | 169 | u32 fs_disp_flow[2]; |
170 | u32 skip; | 170 | u32 skip; |
171 | u32 disp_alt_conf; | 171 | u32 disp_alt_conf; |
172 | u32 disp_gen; | 172 | u32 disp_gen; |
173 | u32 disp_alt[4]; | 173 | u32 disp_alt[4]; |
174 | u32 snoop; | 174 | u32 snoop; |
175 | u32 mem_rst; | 175 | u32 mem_rst; |
176 | u32 pm; | 176 | u32 pm; |
177 | u32 gpr; | 177 | u32 gpr; |
178 | u32 reserved0[26]; | 178 | u32 reserved0[26]; |
179 | u32 ch_db_mode_sel[2]; | 179 | u32 ch_db_mode_sel[2]; |
180 | u32 reserved1[16]; | 180 | u32 reserved1[16]; |
181 | u32 alt_ch_db_mode_sel[2]; | 181 | u32 alt_ch_db_mode_sel[2]; |
182 | u32 reserved2[2]; | 182 | u32 reserved2[2]; |
183 | u32 ch_trb_mode_sel[2]; | 183 | u32 ch_trb_mode_sel[2]; |
184 | }; | 184 | }; |
185 | 185 | ||
186 | struct ipu_idmac { | 186 | struct ipu_idmac { |
187 | u32 conf; | 187 | u32 conf; |
188 | u32 ch_en[2]; | 188 | u32 ch_en[2]; |
189 | u32 sep_alpha; | 189 | u32 sep_alpha; |
190 | u32 alt_sep_alpha; | 190 | u32 alt_sep_alpha; |
191 | u32 ch_pri[2]; | 191 | u32 ch_pri[2]; |
192 | u32 wm_en[2]; | 192 | u32 wm_en[2]; |
193 | u32 lock_en[2]; | 193 | u32 lock_en[2]; |
194 | u32 sub_addr[5]; | 194 | u32 sub_addr[5]; |
195 | u32 bndm_en[2]; | 195 | u32 bndm_en[2]; |
196 | u32 sc_cord[2]; | 196 | u32 sc_cord[2]; |
197 | u32 reserved[45]; | 197 | u32 reserved[45]; |
198 | u32 ch_busy[2]; | 198 | u32 ch_busy[2]; |
199 | }; | 199 | }; |
200 | 200 | ||
201 | struct ipu_com_async { | 201 | struct ipu_com_async { |
202 | u32 com_conf_async; | 202 | u32 com_conf_async; |
203 | u32 graph_wind_ctrl_async; | 203 | u32 graph_wind_ctrl_async; |
204 | u32 fg_pos_async; | 204 | u32 fg_pos_async; |
205 | u32 cur_pos_async; | 205 | u32 cur_pos_async; |
206 | u32 cur_map_async; | 206 | u32 cur_map_async; |
207 | u32 gamma_c_async[8]; | 207 | u32 gamma_c_async[8]; |
208 | u32 gamma_s_async[4]; | 208 | u32 gamma_s_async[4]; |
209 | u32 dp_csca_async[4]; | 209 | u32 dp_csca_async[4]; |
210 | u32 dp_csc_async[2]; | 210 | u32 dp_csc_async[2]; |
211 | }; | 211 | }; |
212 | 212 | ||
213 | struct ipu_dp { | 213 | struct ipu_dp { |
214 | u32 com_conf_sync; | 214 | u32 com_conf_sync; |
215 | u32 graph_wind_ctrl_sync; | 215 | u32 graph_wind_ctrl_sync; |
216 | u32 fg_pos_sync; | 216 | u32 fg_pos_sync; |
217 | u32 cur_pos_sync; | 217 | u32 cur_pos_sync; |
218 | u32 cur_map_sync; | 218 | u32 cur_map_sync; |
219 | u32 gamma_c_sync[8]; | 219 | u32 gamma_c_sync[8]; |
220 | u32 gamma_s_sync[4]; | 220 | u32 gamma_s_sync[4]; |
221 | u32 csca_sync[4]; | 221 | u32 csca_sync[4]; |
222 | u32 csc_sync[2]; | 222 | u32 csc_sync[2]; |
223 | u32 cur_pos_alt; | 223 | u32 cur_pos_alt; |
224 | struct ipu_com_async async[2]; | 224 | struct ipu_com_async async[2]; |
225 | }; | 225 | }; |
226 | 226 | ||
227 | struct ipu_di { | 227 | struct ipu_di { |
228 | u32 general; | 228 | u32 general; |
229 | u32 bs_clkgen0; | 229 | u32 bs_clkgen0; |
230 | u32 bs_clkgen1; | 230 | u32 bs_clkgen1; |
231 | u32 sw_gen0[9]; | 231 | u32 sw_gen0[9]; |
232 | u32 sw_gen1[9]; | 232 | u32 sw_gen1[9]; |
233 | u32 sync_as; | 233 | u32 sync_as; |
234 | u32 dw_gen[12]; | 234 | u32 dw_gen[12]; |
235 | u32 dw_set[48]; | 235 | u32 dw_set[48]; |
236 | u32 stp_rep[4]; | 236 | u32 stp_rep[4]; |
237 | u32 stp_rep9; | 237 | u32 stp_rep9; |
238 | u32 ser_conf; | 238 | u32 ser_conf; |
239 | u32 ssc; | 239 | u32 ssc; |
240 | u32 pol; | 240 | u32 pol; |
241 | u32 aw0; | 241 | u32 aw0; |
242 | u32 aw1; | 242 | u32 aw1; |
243 | u32 scr_conf; | 243 | u32 scr_conf; |
244 | u32 stat; | 244 | u32 stat; |
245 | }; | 245 | }; |
246 | 246 | ||
247 | struct ipu_stat { | 247 | struct ipu_stat { |
248 | u32 int_stat[15]; | 248 | u32 int_stat[15]; |
249 | u32 cur_buf[2]; | 249 | u32 cur_buf[2]; |
250 | u32 alt_cur_buf_0; | 250 | u32 alt_cur_buf_0; |
251 | u32 alt_cur_buf_1; | 251 | u32 alt_cur_buf_1; |
252 | u32 srm_stat; | 252 | u32 srm_stat; |
253 | u32 proc_task_stat; | 253 | u32 proc_task_stat; |
254 | u32 disp_task_stat; | 254 | u32 disp_task_stat; |
255 | u32 triple_cur_buf[4]; | 255 | u32 triple_cur_buf[4]; |
256 | u32 ch_buf0_rdy[2]; | 256 | u32 ch_buf0_rdy[2]; |
257 | u32 ch_buf1_rdy[2]; | 257 | u32 ch_buf1_rdy[2]; |
258 | u32 alt_ch_buf0_rdy[2]; | 258 | u32 alt_ch_buf0_rdy[2]; |
259 | u32 alt_ch_buf1_rdy[2]; | 259 | u32 alt_ch_buf1_rdy[2]; |
260 | u32 ch_buf2_rdy[2]; | 260 | u32 ch_buf2_rdy[2]; |
261 | }; | 261 | }; |
262 | 262 | ||
263 | struct ipu_dc_ch { | 263 | struct ipu_dc_ch { |
264 | u32 wr_ch_conf; | 264 | u32 wr_ch_conf; |
265 | u32 wr_ch_addr; | 265 | u32 wr_ch_addr; |
266 | u32 rl[5]; | 266 | u32 rl[5]; |
267 | }; | 267 | }; |
268 | 268 | ||
269 | struct ipu_dc { | 269 | struct ipu_dc { |
270 | struct ipu_dc_ch dc_ch0_1_2[3]; | 270 | struct ipu_dc_ch dc_ch0_1_2[3]; |
271 | u32 cmd_ch_conf_3; | 271 | u32 cmd_ch_conf_3; |
272 | u32 cmd_ch_conf_4; | 272 | u32 cmd_ch_conf_4; |
273 | struct ipu_dc_ch dc_ch5_6[2]; | 273 | struct ipu_dc_ch dc_ch5_6[2]; |
274 | struct ipu_dc_ch dc_ch8; | 274 | struct ipu_dc_ch dc_ch8; |
275 | u32 rl6_ch_8; | 275 | u32 rl6_ch_8; |
276 | struct ipu_dc_ch dc_ch9; | 276 | struct ipu_dc_ch dc_ch9; |
277 | u32 rl6_ch_9; | 277 | u32 rl6_ch_9; |
278 | u32 gen; | 278 | u32 gen; |
279 | u32 disp_conf1[4]; | 279 | u32 disp_conf1[4]; |
280 | u32 disp_conf2[4]; | 280 | u32 disp_conf2[4]; |
281 | u32 di0_conf[2]; | 281 | u32 di0_conf[2]; |
282 | u32 di1_conf[2]; | 282 | u32 di1_conf[2]; |
283 | u32 dc_map_ptr[15]; | 283 | u32 dc_map_ptr[15]; |
284 | u32 dc_map_val[12]; | 284 | u32 dc_map_val[12]; |
285 | u32 udge[16]; | 285 | u32 udge[16]; |
286 | u32 lla[2]; | 286 | u32 lla[2]; |
287 | u32 r_lla[2]; | 287 | u32 r_lla[2]; |
288 | u32 wr_ch_addr_5_alt; | 288 | u32 wr_ch_addr_5_alt; |
289 | u32 stat; | 289 | u32 stat; |
290 | }; | 290 | }; |
291 | 291 | ||
292 | struct ipu_dmfc { | 292 | struct ipu_dmfc { |
293 | u32 rd_chan; | 293 | u32 rd_chan; |
294 | u32 wr_chan; | 294 | u32 wr_chan; |
295 | u32 wr_chan_def; | 295 | u32 wr_chan_def; |
296 | u32 dp_chan; | 296 | u32 dp_chan; |
297 | u32 dp_chan_def; | 297 | u32 dp_chan_def; |
298 | u32 general[2]; | 298 | u32 general[2]; |
299 | u32 ic_ctrl; | 299 | u32 ic_ctrl; |
300 | u32 wr_chan_alt; | 300 | u32 wr_chan_alt; |
301 | u32 wr_chan_def_alt; | 301 | u32 wr_chan_def_alt; |
302 | u32 general1_alt; | 302 | u32 general1_alt; |
303 | u32 stat; | 303 | u32 stat; |
304 | }; | 304 | }; |
305 | 305 | ||
306 | #define IPU_CM_REG ((struct ipu_cm *)(IPU_CTRL_BASE_ADDR + \ | 306 | #define IPU_CM_REG ((struct ipu_cm *)(IPU_CTRL_BASE_ADDR + \ |
307 | IPU_CM_REG_BASE)) | 307 | IPU_CM_REG_BASE)) |
308 | #define IPU_CONF (&IPU_CM_REG->conf) | 308 | #define IPU_CONF (&IPU_CM_REG->conf) |
309 | #define IPU_SRM_PRI1 (&IPU_CM_REG->srm_pri1) | 309 | #define IPU_SRM_PRI1 (&IPU_CM_REG->srm_pri1) |
310 | #define IPU_SRM_PRI2 (&IPU_CM_REG->srm_pri2) | 310 | #define IPU_SRM_PRI2 (&IPU_CM_REG->srm_pri2) |
311 | #define IPU_FS_PROC_FLOW1 (&IPU_CM_REG->fs_proc_flow[0]) | 311 | #define IPU_FS_PROC_FLOW1 (&IPU_CM_REG->fs_proc_flow[0]) |
312 | #define IPU_FS_PROC_FLOW2 (&IPU_CM_REG->fs_proc_flow[1]) | 312 | #define IPU_FS_PROC_FLOW2 (&IPU_CM_REG->fs_proc_flow[1]) |
313 | #define IPU_FS_PROC_FLOW3 (&IPU_CM_REG->fs_proc_flow[2]) | 313 | #define IPU_FS_PROC_FLOW3 (&IPU_CM_REG->fs_proc_flow[2]) |
314 | #define IPU_FS_DISP_FLOW1 (&IPU_CM_REG->fs_disp_flow[0]) | 314 | #define IPU_FS_DISP_FLOW1 (&IPU_CM_REG->fs_disp_flow[0]) |
315 | #define IPU_DISP_GEN (&IPU_CM_REG->disp_gen) | 315 | #define IPU_DISP_GEN (&IPU_CM_REG->disp_gen) |
316 | #define IPU_MEM_RST (&IPU_CM_REG->mem_rst) | 316 | #define IPU_MEM_RST (&IPU_CM_REG->mem_rst) |
317 | #define IPU_GPR (&IPU_CM_REG->gpr) | 317 | #define IPU_GPR (&IPU_CM_REG->gpr) |
318 | #define IPU_CHA_DB_MODE_SEL(ch) (&IPU_CM_REG->ch_db_mode_sel[ch / 32]) | 318 | #define IPU_CHA_DB_MODE_SEL(ch) (&IPU_CM_REG->ch_db_mode_sel[ch / 32]) |
319 | 319 | ||
320 | #define IPU_STAT ((struct ipu_stat *)(IPU_CTRL_BASE_ADDR + \ | 320 | #define IPU_STAT ((struct ipu_stat *)(IPU_CTRL_BASE_ADDR + \ |
321 | IPU_STAT_REG_BASE)) | 321 | IPU_STAT_REG_BASE)) |
322 | #define IPU_CHA_CUR_BUF(ch) (&IPU_STAT->cur_buf[ch / 32]) | 322 | #define IPU_CHA_CUR_BUF(ch) (&IPU_STAT->cur_buf[ch / 32]) |
323 | #define IPU_CHA_BUF0_RDY(ch) (&IPU_STAT->ch_buf0_rdy[ch / 32]) | 323 | #define IPU_CHA_BUF0_RDY(ch) (&IPU_STAT->ch_buf0_rdy[ch / 32]) |
324 | #define IPU_CHA_BUF1_RDY(ch) (&IPU_STAT->ch_buf1_rdy[ch / 32]) | 324 | #define IPU_CHA_BUF1_RDY(ch) (&IPU_STAT->ch_buf1_rdy[ch / 32]) |
325 | 325 | ||
326 | #define IPU_INT_CTRL(n) (&IPU_CM_REG->int_ctrl[(n) - 1]) | 326 | #define IPU_INT_CTRL(n) (&IPU_CM_REG->int_ctrl[(n) - 1]) |
327 | 327 | ||
328 | #define IDMAC_REG ((struct ipu_idmac *)(IPU_CTRL_BASE_ADDR + \ | 328 | #define IDMAC_REG ((struct ipu_idmac *)(IPU_CTRL_BASE_ADDR + \ |
329 | IPU_IDMAC_REG_BASE)) | 329 | IPU_IDMAC_REG_BASE)) |
330 | #define IDMAC_CONF (&IDMAC_REG->conf) | 330 | #define IDMAC_CONF (&IDMAC_REG->conf) |
331 | #define IDMAC_CHA_EN(ch) (&IDMAC_REG->ch_en[ch / 32]) | 331 | #define IDMAC_CHA_EN(ch) (&IDMAC_REG->ch_en[ch / 32]) |
332 | #define IDMAC_CHA_PRI(ch) (&IDMAC_REG->ch_pri[ch / 32]) | 332 | #define IDMAC_CHA_PRI(ch) (&IDMAC_REG->ch_pri[ch / 32]) |
333 | 333 | ||
334 | #define DI_REG(di) ((struct ipu_di *)(IPU_CTRL_BASE_ADDR + \ | 334 | #define DI_REG(di) ((struct ipu_di *)(IPU_CTRL_BASE_ADDR + \ |
335 | ((di == 1) ? IPU_DI1_REG_BASE : \ | 335 | ((di == 1) ? IPU_DI1_REG_BASE : \ |
336 | IPU_DI0_REG_BASE))) | 336 | IPU_DI0_REG_BASE))) |
337 | #define DI_GENERAL(di) (&DI_REG(di)->general) | 337 | #define DI_GENERAL(di) (&DI_REG(di)->general) |
338 | #define DI_BS_CLKGEN0(di) (&DI_REG(di)->bs_clkgen0) | 338 | #define DI_BS_CLKGEN0(di) (&DI_REG(di)->bs_clkgen0) |
339 | #define DI_BS_CLKGEN1(di) (&DI_REG(di)->bs_clkgen1) | 339 | #define DI_BS_CLKGEN1(di) (&DI_REG(di)->bs_clkgen1) |
340 | 340 | ||
341 | #define DI_SW_GEN0(di, gen) (&DI_REG(di)->sw_gen0[gen - 1]) | 341 | #define DI_SW_GEN0(di, gen) (&DI_REG(di)->sw_gen0[gen - 1]) |
342 | #define DI_SW_GEN1(di, gen) (&DI_REG(di)->sw_gen1[gen - 1]) | 342 | #define DI_SW_GEN1(di, gen) (&DI_REG(di)->sw_gen1[gen - 1]) |
343 | #define DI_STP_REP(di, gen) (&DI_REG(di)->stp_rep[(gen - 1) / 2]) | 343 | #define DI_STP_REP(di, gen) (&DI_REG(di)->stp_rep[(gen - 1) / 2]) |
344 | #define DI_SYNC_AS_GEN(di) (&DI_REG(di)->sync_as) | 344 | #define DI_SYNC_AS_GEN(di) (&DI_REG(di)->sync_as) |
345 | #define DI_DW_GEN(di, gen) (&DI_REG(di)->dw_gen[gen]) | 345 | #define DI_DW_GEN(di, gen) (&DI_REG(di)->dw_gen[gen]) |
346 | #define DI_DW_SET(di, gen, set) (&DI_REG(di)->dw_set[gen + 12 * set]) | 346 | #define DI_DW_SET(di, gen, set) (&DI_REG(di)->dw_set[gen + 12 * set]) |
347 | #define DI_POL(di) (&DI_REG(di)->pol) | 347 | #define DI_POL(di) (&DI_REG(di)->pol) |
348 | #define DI_SCR_CONF(di) (&DI_REG(di)->scr_conf) | 348 | #define DI_SCR_CONF(di) (&DI_REG(di)->scr_conf) |
349 | 349 | ||
350 | #define DMFC_REG ((struct ipu_dmfc *)(IPU_CTRL_BASE_ADDR + \ | 350 | #define DMFC_REG ((struct ipu_dmfc *)(IPU_CTRL_BASE_ADDR + \ |
351 | IPU_DMFC_REG_BASE)) | 351 | IPU_DMFC_REG_BASE)) |
352 | #define DMFC_WR_CHAN (&DMFC_REG->wr_chan) | 352 | #define DMFC_WR_CHAN (&DMFC_REG->wr_chan) |
353 | #define DMFC_WR_CHAN_DEF (&DMFC_REG->wr_chan_def) | 353 | #define DMFC_WR_CHAN_DEF (&DMFC_REG->wr_chan_def) |
354 | #define DMFC_DP_CHAN (&DMFC_REG->dp_chan) | 354 | #define DMFC_DP_CHAN (&DMFC_REG->dp_chan) |
355 | #define DMFC_DP_CHAN_DEF (&DMFC_REG->dp_chan_def) | 355 | #define DMFC_DP_CHAN_DEF (&DMFC_REG->dp_chan_def) |
356 | #define DMFC_GENERAL1 (&DMFC_REG->general[0]) | 356 | #define DMFC_GENERAL1 (&DMFC_REG->general[0]) |
357 | #define DMFC_IC_CTRL (&DMFC_REG->ic_ctrl) | 357 | #define DMFC_IC_CTRL (&DMFC_REG->ic_ctrl) |
358 | 358 | ||
359 | 359 | ||
360 | #define DC_REG ((struct ipu_dc *)(IPU_CTRL_BASE_ADDR + \ | 360 | #define DC_REG ((struct ipu_dc *)(IPU_CTRL_BASE_ADDR + \ |
361 | IPU_DC_REG_BASE)) | 361 | IPU_DC_REG_BASE)) |
362 | #define DC_MAP_CONF_PTR(n) (&DC_REG->dc_map_ptr[n / 2]) | 362 | #define DC_MAP_CONF_PTR(n) (&DC_REG->dc_map_ptr[n / 2]) |
363 | #define DC_MAP_CONF_VAL(n) (&DC_REG->dc_map_val[n / 2]) | 363 | #define DC_MAP_CONF_VAL(n) (&DC_REG->dc_map_val[n / 2]) |
364 | 364 | ||
365 | 365 | ||
366 | static inline struct ipu_dc_ch *dc_ch_offset(int ch) | 366 | static inline struct ipu_dc_ch *dc_ch_offset(int ch) |
367 | { | 367 | { |
368 | switch (ch) { | 368 | switch (ch) { |
369 | case 0: | 369 | case 0: |
370 | case 1: | 370 | case 1: |
371 | case 2: | 371 | case 2: |
372 | return &DC_REG->dc_ch0_1_2[ch]; | 372 | return &DC_REG->dc_ch0_1_2[ch]; |
373 | case 5: | 373 | case 5: |
374 | case 6: | 374 | case 6: |
375 | return &DC_REG->dc_ch5_6[ch - 5]; | 375 | return &DC_REG->dc_ch5_6[ch - 5]; |
376 | case 8: | 376 | case 8: |
377 | return &DC_REG->dc_ch8; | 377 | return &DC_REG->dc_ch8; |
378 | case 9: | 378 | case 9: |
379 | return &DC_REG->dc_ch9; | 379 | return &DC_REG->dc_ch9; |
380 | default: | 380 | default: |
381 | printf("%s: invalid channel %d\n", __func__, ch); | 381 | printf("%s: invalid channel %d\n", __func__, ch); |
382 | return NULL; | 382 | return NULL; |
383 | } | 383 | } |
384 | 384 | ||
385 | } | 385 | } |
386 | 386 | ||
387 | #define DC_RL_CH(ch, evt) (&dc_ch_offset(ch)->rl[evt / 2]) | 387 | #define DC_RL_CH(ch, evt) (&dc_ch_offset(ch)->rl[evt / 2]) |
388 | 388 | ||
389 | #define DC_WR_CH_CONF(ch) (&dc_ch_offset(ch)->wr_ch_conf) | 389 | #define DC_WR_CH_CONF(ch) (&dc_ch_offset(ch)->wr_ch_conf) |
390 | #define DC_WR_CH_ADDR(ch) (&dc_ch_offset(ch)->wr_ch_addr) | 390 | #define DC_WR_CH_ADDR(ch) (&dc_ch_offset(ch)->wr_ch_addr) |
391 | 391 | ||
392 | #define DC_WR_CH_CONF_1 DC_WR_CH_CONF(1) | 392 | #define DC_WR_CH_CONF_1 DC_WR_CH_CONF(1) |
393 | #define DC_WR_CH_CONF_5 DC_WR_CH_CONF(5) | 393 | #define DC_WR_CH_CONF_5 DC_WR_CH_CONF(5) |
394 | 394 | ||
395 | #define DC_GEN (&DC_REG->gen) | 395 | #define DC_GEN (&DC_REG->gen) |
396 | #define DC_DISP_CONF2(disp) (&DC_REG->disp_conf2[disp]) | 396 | #define DC_DISP_CONF2(disp) (&DC_REG->disp_conf2[disp]) |
397 | #define DC_STAT (&DC_REG->stat) | 397 | #define DC_STAT (&DC_REG->stat) |
398 | 398 | ||
399 | #define DP_SYNC 0 | 399 | #define DP_SYNC 0 |
400 | #define DP_ASYNC0 0x60 | 400 | #define DP_ASYNC0 0x60 |
401 | #define DP_ASYNC1 0xBC | 401 | #define DP_ASYNC1 0xBC |
402 | 402 | ||
403 | #define DP_REG ((struct ipu_dp *)(IPU_CTRL_BASE_ADDR + \ | 403 | #define DP_REG ((struct ipu_dp *)(IPU_CTRL_BASE_ADDR + \ |
404 | IPU_DP_REG_BASE)) | 404 | IPU_DP_REG_BASE)) |
405 | #define DP_COM_CONF(flow) (&DP_REG->com_conf_sync) | 405 | #define DP_COM_CONF() (&DP_REG->com_conf_sync) |
406 | #define DP_GRAPH_WIND_CTRL(flow) (&DP_REG->graph_wind_ctrl_sync) | 406 | #define DP_GRAPH_WIND_CTRL() (&DP_REG->graph_wind_ctrl_sync) |
407 | #define DP_CSC_A_0(flow) (&DP_REG->csca_sync[0]) | 407 | #define DP_CSC_A_0() (&DP_REG->csca_sync[0]) |
408 | #define DP_CSC_A_1(flow) (&DP_REG->csca_sync[1]) | 408 | #define DP_CSC_A_1() (&DP_REG->csca_sync[1]) |
409 | #define DP_CSC_A_2(flow) (&DP_REG->csca_sync[2]) | 409 | #define DP_CSC_A_2() (&DP_REG->csca_sync[2]) |
410 | #define DP_CSC_A_3(flow) (&DP_REG->csca_sync[3]) | 410 | #define DP_CSC_A_3() (&DP_REG->csca_sync[3]) |
411 | 411 | ||
412 | #define DP_CSC_0(flow) (&DP_REG->csc_sync[0]) | 412 | #define DP_CSC_0() (&DP_REG->csc_sync[0]) |
413 | #define DP_CSC_1(flow) (&DP_REG->csc_sync[1]) | 413 | #define DP_CSC_1() (&DP_REG->csc_sync[1]) |
414 | 414 | ||
415 | /* DC template opcodes */ | 415 | /* DC template opcodes */ |
416 | #define WROD(lf) (0x18 | (lf << 1)) | 416 | #define WROD(lf) (0x18 | (lf << 1)) |
417 | 417 | ||
418 | #endif | 418 | #endif |
419 | 419 |