2 * drivers/video/tegra/dc/dc.c
4 * Copyright (C) 2010 Google, Inc.
5 * Author: Erik Gilling <konkers@android.com>
7 * Copyright (c) 2010-2014, NVIDIA CORPORATION, All rights reserved.
9 * This software is licensed under the terms of the GNU General Public
10 * License version 2, as published by the Free Software Foundation, and
11 * may be copied, distributed, and modified under those terms.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
20 #include <linux/module.h>
21 #include <linux/kernel.h>
22 #include <linux/err.h>
23 #include <linux/errno.h>
24 #include <linux/interrupt.h>
25 #include <linux/slab.h>
28 #include <linux/pm_runtime.h>
29 #include <linux/clk.h>
30 #include <linux/mutex.h>
31 #include <linux/delay.h>
32 #include <linux/dma-mapping.h>
33 #include <linux/workqueue.h>
34 #include <linux/ktime.h>
35 #include <linux/debugfs.h>
36 #include <linux/seq_file.h>
37 #include <linux/backlight.h>
38 #include <linux/gpio.h>
39 #include <linux/nvhost.h>
40 #include <linux/clk/tegra.h>
41 #include <video/tegrafb.h>
42 #include <drm/drm_fixed.h>
44 #include <linux/switch.h>
46 #include <linux/of_irq.h>
47 #include <linux/of_address.h>
49 #define CREATE_TRACE_POINTS
50 #include <trace/events/display.h>
55 #include <linux/nvhost.h>
56 #include <mach/latency_allowance.h>
57 #include <mach/pm_domains.h>
60 #include "dc_config.h"
67 /* HACK! This needs to come from DT */
68 #include "../../../../arch/arm/mach-tegra/iomap.h"
70 #define TEGRA_CRC_LATCHED_DELAY 34
72 #define DC_COM_PIN_OUTPUT_POLARITY1_INIT_VAL 0x01000000
73 #define DC_COM_PIN_OUTPUT_POLARITY3_INIT_VAL 0x0
75 static struct fb_videomode tegra_dc_vga_mode = {
79 .pixclock = KHZ2PICOS(25200),
80 .hsync_len = 96, /* h_sync_width */
81 .vsync_len = 2, /* v_sync_width */
82 .left_margin = 48, /* h_back_porch */
83 .upper_margin = 33, /* v_back_porch */
84 .right_margin = 16, /* h_front_porch */
85 .lower_margin = 10, /* v_front_porch */
90 static struct tegra_dc_mode override_disp_mode[3];
92 static void _tegra_dc_controller_disable(struct tegra_dc *dc);
94 struct tegra_dc *tegra_dcs[TEGRA_MAX_DC];
96 DEFINE_MUTEX(tegra_dc_lock);
97 DEFINE_MUTEX(shared_lock);
99 static struct device_dma_parameters tegra_dc_dma_parameters = {
100 .max_segment_size = UINT_MAX,
103 static const struct {
107 /* Window A has no filtering */
109 /* Window B has both H and V filtering */
111 /* Window C has only H filtering */
115 #ifdef CONFIG_TEGRA_DC_CMU
116 static struct tegra_dc_cmu default_cmu = {
117 /* lut1 maps sRGB to linear space. */
119 0, 1, 2, 4, 5, 6, 7, 9,
120 10, 11, 12, 14, 15, 16, 18, 20,
121 21, 23, 25, 27, 29, 31, 33, 35,
122 37, 40, 42, 45, 48, 50, 53, 56,
123 59, 62, 66, 69, 72, 76, 79, 83,
124 87, 91, 95, 99, 103, 107, 112, 116,
125 121, 126, 131, 136, 141, 146, 151, 156,
126 162, 168, 173, 179, 185, 191, 197, 204,
127 210, 216, 223, 230, 237, 244, 251, 258,
128 265, 273, 280, 288, 296, 304, 312, 320,
129 329, 337, 346, 354, 363, 372, 381, 390,
130 400, 409, 419, 428, 438, 448, 458, 469,
131 479, 490, 500, 511, 522, 533, 544, 555,
132 567, 578, 590, 602, 614, 626, 639, 651,
133 664, 676, 689, 702, 715, 728, 742, 755,
134 769, 783, 797, 811, 825, 840, 854, 869,
135 884, 899, 914, 929, 945, 960, 976, 992,
136 1008, 1024, 1041, 1057, 1074, 1091, 1108, 1125,
137 1142, 1159, 1177, 1195, 1213, 1231, 1249, 1267,
138 1286, 1304, 1323, 1342, 1361, 1381, 1400, 1420,
139 1440, 1459, 1480, 1500, 1520, 1541, 1562, 1582,
140 1603, 1625, 1646, 1668, 1689, 1711, 1733, 1755,
141 1778, 1800, 1823, 1846, 1869, 1892, 1916, 1939,
142 1963, 1987, 2011, 2035, 2059, 2084, 2109, 2133,
143 2159, 2184, 2209, 2235, 2260, 2286, 2312, 2339,
144 2365, 2392, 2419, 2446, 2473, 2500, 2527, 2555,
145 2583, 2611, 2639, 2668, 2696, 2725, 2754, 2783,
146 2812, 2841, 2871, 2901, 2931, 2961, 2991, 3022,
147 3052, 3083, 3114, 3146, 3177, 3209, 3240, 3272,
148 3304, 3337, 3369, 3402, 3435, 3468, 3501, 3535,
149 3568, 3602, 3636, 3670, 3705, 3739, 3774, 3809,
150 3844, 3879, 3915, 3950, 3986, 4022, 4059, 4095,
158 /* lut2 maps linear space to sRGB*/
160 0, 1, 2, 2, 3, 4, 5, 6,
161 6, 7, 8, 9, 10, 10, 11, 12,
162 13, 13, 14, 15, 15, 16, 16, 17,
163 18, 18, 19, 19, 20, 20, 21, 21,
164 22, 22, 23, 23, 23, 24, 24, 25,
165 25, 25, 26, 26, 27, 27, 27, 28,
166 28, 29, 29, 29, 30, 30, 30, 31,
167 31, 31, 32, 32, 32, 33, 33, 33,
168 34, 34, 34, 34, 35, 35, 35, 36,
169 36, 36, 37, 37, 37, 37, 38, 38,
170 38, 38, 39, 39, 39, 40, 40, 40,
171 40, 41, 41, 41, 41, 42, 42, 42,
172 42, 43, 43, 43, 43, 43, 44, 44,
173 44, 44, 45, 45, 45, 45, 46, 46,
174 46, 46, 46, 47, 47, 47, 47, 48,
175 48, 48, 48, 48, 49, 49, 49, 49,
176 49, 50, 50, 50, 50, 50, 51, 51,
177 51, 51, 51, 52, 52, 52, 52, 52,
178 53, 53, 53, 53, 53, 54, 54, 54,
179 54, 54, 55, 55, 55, 55, 55, 55,
180 56, 56, 56, 56, 56, 57, 57, 57,
181 57, 57, 57, 58, 58, 58, 58, 58,
182 58, 59, 59, 59, 59, 59, 59, 60,
183 60, 60, 60, 60, 60, 61, 61, 61,
184 61, 61, 61, 62, 62, 62, 62, 62,
185 62, 63, 63, 63, 63, 63, 63, 64,
186 64, 64, 64, 64, 64, 64, 65, 65,
187 65, 65, 65, 65, 66, 66, 66, 66,
188 66, 66, 66, 67, 67, 67, 67, 67,
189 67, 67, 68, 68, 68, 68, 68, 68,
190 68, 69, 69, 69, 69, 69, 69, 69,
191 70, 70, 70, 70, 70, 70, 70, 71,
192 71, 71, 71, 71, 71, 71, 72, 72,
193 72, 72, 72, 72, 72, 72, 73, 73,
194 73, 73, 73, 73, 73, 74, 74, 74,
195 74, 74, 74, 74, 74, 75, 75, 75,
196 75, 75, 75, 75, 75, 76, 76, 76,
197 76, 76, 76, 76, 77, 77, 77, 77,
198 77, 77, 77, 77, 78, 78, 78, 78,
199 78, 78, 78, 78, 78, 79, 79, 79,
200 79, 79, 79, 79, 79, 80, 80, 80,
201 80, 80, 80, 80, 80, 81, 81, 81,
202 81, 81, 81, 81, 81, 81, 82, 82,
203 82, 82, 82, 82, 82, 82, 83, 83,
204 83, 83, 83, 83, 83, 83, 83, 84,
205 84, 84, 84, 84, 84, 84, 84, 84,
206 85, 85, 85, 85, 85, 85, 85, 85,
207 85, 86, 86, 86, 86, 86, 86, 86,
208 86, 86, 87, 87, 87, 87, 87, 87,
209 87, 87, 87, 88, 88, 88, 88, 88,
210 88, 88, 88, 88, 88, 89, 89, 89,
211 89, 89, 89, 89, 89, 89, 90, 90,
212 90, 90, 90, 90, 90, 90, 90, 90,
213 91, 91, 91, 91, 91, 91, 91, 91,
214 91, 91, 92, 92, 92, 92, 92, 92,
215 92, 92, 92, 92, 93, 93, 93, 93,
216 93, 93, 93, 93, 93, 93, 94, 94,
217 94, 94, 94, 94, 94, 94, 94, 94,
218 95, 95, 95, 95, 95, 95, 95, 95,
219 95, 95, 96, 96, 96, 96, 96, 96,
220 96, 96, 96, 96, 96, 97, 97, 97,
221 97, 97, 97, 97, 97, 97, 97, 98,
222 98, 98, 98, 98, 98, 98, 98, 98,
223 98, 98, 99, 99, 99, 99, 99, 99,
224 99, 100, 101, 101, 102, 103, 103, 104,
225 105, 105, 106, 107, 107, 108, 109, 109,
226 110, 111, 111, 112, 113, 113, 114, 115,
227 115, 116, 116, 117, 118, 118, 119, 119,
228 120, 120, 121, 122, 122, 123, 123, 124,
229 124, 125, 126, 126, 127, 127, 128, 128,
230 129, 129, 130, 130, 131, 131, 132, 132,
231 133, 133, 134, 134, 135, 135, 136, 136,
232 137, 137, 138, 138, 139, 139, 140, 140,
233 141, 141, 142, 142, 143, 143, 144, 144,
234 145, 145, 145, 146, 146, 147, 147, 148,
235 148, 149, 149, 150, 150, 150, 151, 151,
236 152, 152, 153, 153, 153, 154, 154, 155,
237 155, 156, 156, 156, 157, 157, 158, 158,
238 158, 159, 159, 160, 160, 160, 161, 161,
239 162, 162, 162, 163, 163, 164, 164, 164,
240 165, 165, 166, 166, 166, 167, 167, 167,
241 168, 168, 169, 169, 169, 170, 170, 170,
242 171, 171, 172, 172, 172, 173, 173, 173,
243 174, 174, 174, 175, 175, 176, 176, 176,
244 177, 177, 177, 178, 178, 178, 179, 179,
245 179, 180, 180, 180, 181, 181, 182, 182,
246 182, 183, 183, 183, 184, 184, 184, 185,
247 185, 185, 186, 186, 186, 187, 187, 187,
248 188, 188, 188, 189, 189, 189, 189, 190,
249 190, 190, 191, 191, 191, 192, 192, 192,
250 193, 193, 193, 194, 194, 194, 195, 195,
251 195, 196, 196, 196, 196, 197, 197, 197,
252 198, 198, 198, 199, 199, 199, 200, 200,
253 200, 200, 201, 201, 201, 202, 202, 202,
254 202, 203, 203, 203, 204, 204, 204, 205,
255 205, 205, 205, 206, 206, 206, 207, 207,
256 207, 207, 208, 208, 208, 209, 209, 209,
257 209, 210, 210, 210, 211, 211, 211, 211,
258 212, 212, 212, 213, 213, 213, 213, 214,
259 214, 214, 214, 215, 215, 215, 216, 216,
260 216, 216, 217, 217, 217, 217, 218, 218,
261 218, 219, 219, 219, 219, 220, 220, 220,
262 220, 221, 221, 221, 221, 222, 222, 222,
263 223, 223, 223, 223, 224, 224, 224, 224,
264 225, 225, 225, 225, 226, 226, 226, 226,
265 227, 227, 227, 227, 228, 228, 228, 228,
266 229, 229, 229, 229, 230, 230, 230, 230,
267 231, 231, 231, 231, 232, 232, 232, 232,
268 233, 233, 233, 233, 234, 234, 234, 234,
269 235, 235, 235, 235, 236, 236, 236, 236,
270 237, 237, 237, 237, 238, 238, 238, 238,
271 239, 239, 239, 239, 240, 240, 240, 240,
272 240, 241, 241, 241, 241, 242, 242, 242,
273 242, 243, 243, 243, 243, 244, 244, 244,
274 244, 244, 245, 245, 245, 245, 246, 246,
275 246, 246, 247, 247, 247, 247, 247, 248,
276 248, 248, 248, 249, 249, 249, 249, 249,
277 250, 250, 250, 250, 251, 251, 251, 251,
278 251, 252, 252, 252, 252, 253, 253, 253,
279 253, 253, 254, 254, 254, 254, 255, 255,
283 static struct tegra_dc_cmu default_limited_cmu = {
284 /* lut1 maps sRGB to linear space. */
286 0, 1, 2, 4, 5, 6, 7, 9,
287 10, 11, 12, 14, 15, 16, 18, 20,
288 21, 23, 25, 27, 29, 31, 33, 35,
289 37, 40, 42, 45, 48, 50, 53, 56,
290 59, 62, 66, 69, 72, 76, 79, 83,
291 87, 91, 95, 99, 103, 107, 112, 116,
292 121, 126, 131, 136, 141, 146, 151, 156,
293 162, 168, 173, 179, 185, 191, 197, 204,
294 210, 216, 223, 230, 237, 244, 251, 258,
295 265, 273, 280, 288, 296, 304, 312, 320,
296 329, 337, 346, 354, 363, 372, 381, 390,
297 400, 409, 419, 428, 438, 448, 458, 469,
298 479, 490, 500, 511, 522, 533, 544, 555,
299 567, 578, 590, 602, 614, 626, 639, 651,
300 664, 676, 689, 702, 715, 728, 742, 755,
301 769, 783, 797, 811, 825, 840, 854, 869,
302 884, 899, 914, 929, 945, 960, 976, 992,
303 1008, 1024, 1041, 1057, 1074, 1091, 1108, 1125,
304 1142, 1159, 1177, 1195, 1213, 1231, 1249, 1267,
305 1286, 1304, 1323, 1342, 1361, 1381, 1400, 1420,
306 1440, 1459, 1480, 1500, 1520, 1541, 1562, 1582,
307 1603, 1625, 1646, 1668, 1689, 1711, 1733, 1755,
308 1778, 1800, 1823, 1846, 1869, 1892, 1916, 1939,
309 1963, 1987, 2011, 2035, 2059, 2084, 2109, 2133,
310 2159, 2184, 2209, 2235, 2260, 2286, 2312, 2339,
311 2365, 2392, 2419, 2446, 2473, 2500, 2527, 2555,
312 2583, 2611, 2639, 2668, 2696, 2725, 2754, 2783,
313 2812, 2841, 2871, 2901, 2931, 2961, 2991, 3022,
314 3052, 3083, 3114, 3146, 3177, 3209, 3240, 3272,
315 3304, 3337, 3369, 3402, 3435, 3468, 3501, 3535,
316 3568, 3602, 3636, 3670, 3705, 3739, 3774, 3809,
317 3844, 3879, 3915, 3950, 3986, 4022, 4059, 4095,
326 * lut2 maps linear space back to sRGB, where
327 * the output range is [16...235] (limited).
330 16, 17, 17, 18, 19, 19, 20, 21,
331 22, 22, 23, 24, 24, 25, 26, 26,
332 27, 27, 28, 29, 29, 30, 30, 31,
333 31, 32, 32, 32, 33, 33, 34, 34,
334 35, 35, 35, 36, 36, 36, 37, 37,
335 38, 38, 38, 39, 39, 39, 40, 40,
336 40, 41, 41, 41, 41, 42, 42, 42,
337 43, 43, 43, 43, 44, 44, 44, 45,
338 45, 45, 45, 46, 46, 46, 46, 47,
339 47, 47, 47, 48, 48, 48, 48, 49,
340 49, 49, 49, 49, 50, 50, 50, 50,
341 51, 51, 51, 51, 51, 52, 52, 52,
342 52, 53, 53, 53, 53, 53, 54, 54,
343 54, 54, 54, 55, 55, 55, 55, 55,
344 56, 56, 56, 56, 56, 56, 57, 57,
345 57, 57, 57, 58, 58, 58, 58, 58,
346 58, 59, 59, 59, 59, 59, 60, 60,
347 60, 60, 60, 60, 61, 61, 61, 61,
348 61, 61, 62, 62, 62, 62, 62, 62,
349 63, 63, 63, 63, 63, 63, 63, 64,
350 64, 64, 64, 64, 64, 65, 65, 65,
351 65, 65, 65, 65, 66, 66, 66, 66,
352 66, 66, 67, 67, 67, 67, 67, 67,
353 67, 68, 68, 68, 68, 68, 68, 68,
354 69, 69, 69, 69, 69, 69, 69, 69,
355 70, 70, 70, 70, 70, 70, 70, 71,
356 71, 71, 71, 71, 71, 71, 72, 72,
357 72, 72, 72, 72, 72, 72, 73, 73,
358 73, 73, 73, 73, 73, 73, 74, 74,
359 74, 74, 74, 74, 74, 74, 75, 75,
360 75, 75, 75, 75, 75, 75, 76, 76,
361 76, 76, 76, 76, 76, 76, 76, 77,
362 77, 77, 77, 77, 77, 77, 77, 78,
363 78, 78, 78, 78, 78, 78, 78, 78,
364 79, 79, 79, 79, 79, 79, 79, 79,
365 80, 80, 80, 80, 80, 80, 80, 80,
366 80, 81, 81, 81, 81, 81, 81, 81,
367 81, 81, 81, 82, 82, 82, 82, 82,
368 82, 82, 82, 82, 83, 83, 83, 83,
369 83, 83, 83, 83, 83, 84, 84, 84,
370 84, 84, 84, 84, 84, 84, 84, 85,
371 85, 85, 85, 85, 85, 85, 85, 85,
372 85, 86, 86, 86, 86, 86, 86, 86,
373 86, 86, 86, 87, 87, 87, 87, 87,
374 87, 87, 87, 87, 87, 88, 88, 88,
375 88, 88, 88, 88, 88, 88, 88, 89,
376 89, 89, 89, 89, 89, 89, 89, 89,
377 89, 89, 90, 90, 90, 90, 90, 90,
378 90, 90, 90, 90, 91, 91, 91, 91,
379 91, 91, 91, 91, 91, 91, 91, 92,
380 92, 92, 92, 92, 92, 92, 92, 92,
381 92, 92, 93, 93, 93, 93, 93, 93,
382 93, 93, 93, 93, 93, 94, 94, 94,
383 94, 94, 94, 94, 94, 94, 94, 94,
384 94, 95, 95, 95, 95, 95, 95, 95,
385 95, 95, 95, 95, 96, 96, 96, 96,
386 96, 96, 96, 96, 96, 96, 96, 96,
387 97, 97, 97, 97, 97, 97, 97, 97,
388 97, 97, 97, 97, 98, 98, 98, 98,
389 98, 98, 98, 98, 98, 98, 98, 98,
390 99, 99, 99, 99, 99, 99, 99, 99,
391 99, 99, 99, 99, 100, 100, 100, 100,
392 100, 100, 100, 100, 100, 100, 100, 100,
393 100, 101, 101, 101, 101, 101, 101, 101,
394 102, 102, 103, 104, 104, 105, 105, 106,
395 107, 107, 108, 108, 109, 109, 110, 111,
396 111, 112, 112, 113, 113, 114, 114, 115,
397 115, 116, 116, 117, 117, 118, 118, 119,
398 119, 120, 120, 121, 121, 122, 122, 123,
399 123, 124, 124, 125, 125, 126, 126, 127,
400 127, 127, 128, 128, 129, 129, 130, 130,
401 131, 131, 131, 132, 132, 133, 133, 134,
402 134, 134, 135, 135, 136, 136, 136, 137,
403 137, 138, 138, 139, 139, 139, 140, 140,
404 141, 141, 141, 142, 142, 142, 143, 143,
405 144, 144, 144, 145, 145, 145, 146, 146,
406 147, 147, 147, 148, 148, 148, 149, 149,
407 150, 150, 150, 151, 151, 151, 152, 152,
408 152, 153, 153, 153, 154, 154, 154, 155,
409 155, 155, 156, 156, 156, 157, 157, 157,
410 158, 158, 158, 159, 159, 159, 160, 160,
411 160, 161, 161, 161, 162, 162, 162, 163,
412 163, 163, 164, 164, 164, 165, 165, 165,
413 166, 166, 166, 166, 167, 167, 167, 168,
414 168, 168, 169, 169, 169, 169, 170, 170,
415 170, 171, 171, 171, 172, 172, 172, 172,
416 173, 173, 173, 174, 174, 174, 174, 175,
417 175, 175, 176, 176, 176, 176, 177, 177,
418 177, 178, 178, 178, 178, 179, 179, 179,
419 180, 180, 180, 180, 181, 181, 181, 181,
420 182, 182, 182, 183, 183, 183, 183, 184,
421 184, 184, 184, 185, 185, 185, 185, 186,
422 186, 186, 187, 187, 187, 187, 188, 188,
423 188, 188, 189, 189, 189, 189, 190, 190,
424 190, 190, 191, 191, 191, 191, 192, 192,
425 192, 192, 193, 193, 193, 193, 194, 194,
426 194, 194, 195, 195, 195, 195, 196, 196,
427 196, 196, 197, 197, 197, 197, 198, 198,
428 198, 198, 199, 199, 199, 199, 199, 200,
429 200, 200, 200, 201, 201, 201, 201, 202,
430 202, 202, 202, 203, 203, 203, 203, 203,
431 204, 204, 204, 204, 205, 205, 205, 205,
432 206, 206, 206, 206, 206, 207, 207, 207,
433 207, 208, 208, 208, 208, 208, 209, 209,
434 209, 209, 210, 210, 210, 210, 210, 211,
435 211, 211, 211, 212, 212, 212, 212, 212,
436 213, 213, 213, 213, 213, 214, 214, 214,
437 214, 215, 215, 215, 215, 215, 216, 216,
438 216, 216, 216, 217, 217, 217, 217, 218,
439 218, 218, 218, 218, 219, 219, 219, 219,
440 219, 220, 220, 220, 220, 220, 221, 221,
441 221, 221, 221, 222, 222, 222, 222, 222,
442 223, 223, 223, 223, 224, 224, 224, 224,
443 224, 225, 225, 225, 225, 225, 226, 226,
444 226, 226, 226, 227, 227, 227, 227, 227,
445 227, 228, 228, 228, 228, 228, 229, 229,
446 229, 229, 229, 230, 230, 230, 230, 230,
447 231, 231, 231, 231, 231, 232, 232, 232,
448 232, 232, 233, 233, 233, 233, 233, 233,
449 234, 234, 234, 234, 234, 235, 235, 235,
454 void tegra_dc_clk_enable(struct tegra_dc *dc)
456 clk_prepare_enable(dc->clk);
457 tegra_dvfs_set_rate(dc->clk, dc->mode.pclk);
460 void tegra_dc_clk_disable(struct tegra_dc *dc)
462 clk_disable_unprepare(dc->clk);
463 tegra_dvfs_set_rate(dc->clk, 0);
466 void tegra_dc_get(struct tegra_dc *dc)
468 tegra_dc_io_start(dc);
470 /* extra reference to dc clk */
471 clk_prepare_enable(dc->clk);
474 void tegra_dc_put(struct tegra_dc *dc)
476 /* balance extra dc clk reference */
477 clk_disable_unprepare(dc->clk);
482 void tegra_dc_hold_dc_out(struct tegra_dc *dc)
484 if (1 == atomic_inc_return(&dc->holding)) {
486 if (dc->out_ops && dc->out_ops->hold)
487 dc->out_ops->hold(dc);
488 atomic_inc(&dc->holding);
492 void tegra_dc_release_dc_out(struct tegra_dc *dc)
494 if (0 == atomic_dec_return(&dc->holding)) {
495 if (dc->out_ops && dc->out_ops->release)
496 dc->out_ops->release(dc);
501 #define DUMP_REG(a) do { \
502 snprintf(buff, sizeof(buff), "%-32s\t%03x\t%08lx\n", \
503 #a, a, tegra_dc_readl(dc, a)); \
507 static void _dump_regs(struct tegra_dc *dc, void *data,
508 void (* print)(void *data, const char *str))
512 const char winname[] = "ABCDHT";
513 /* for above, see also: DC_CMD_DISPLAY_WINDOW_HEADER and DC_N_WINDOWS */
515 /* If gated, quietly return. */
516 if (!tegra_powergate_is_powered(dc->powergate_id))
519 mutex_lock(&dc->lock);
521 tegra_dc_writel(dc, WRITE_MUX_ACTIVE | READ_MUX_ACTIVE,
522 DC_CMD_STATE_ACCESS);
524 DUMP_REG(DC_CMD_DISPLAY_COMMAND_OPTION0);
525 DUMP_REG(DC_CMD_DISPLAY_COMMAND);
526 DUMP_REG(DC_CMD_SIGNAL_RAISE);
527 DUMP_REG(DC_CMD_INT_STATUS);
528 DUMP_REG(DC_CMD_INT_MASK);
529 DUMP_REG(DC_CMD_INT_ENABLE);
530 DUMP_REG(DC_CMD_INT_TYPE);
531 DUMP_REG(DC_CMD_INT_POLARITY);
532 DUMP_REG(DC_CMD_SIGNAL_RAISE1);
533 DUMP_REG(DC_CMD_SIGNAL_RAISE2);
534 DUMP_REG(DC_CMD_SIGNAL_RAISE3);
535 DUMP_REG(DC_CMD_STATE_ACCESS);
536 DUMP_REG(DC_CMD_STATE_CONTROL);
537 DUMP_REG(DC_CMD_DISPLAY_WINDOW_HEADER);
538 DUMP_REG(DC_CMD_REG_ACT_CONTROL);
540 DUMP_REG(DC_DISP_DISP_SIGNAL_OPTIONS0);
541 DUMP_REG(DC_DISP_DISP_SIGNAL_OPTIONS1);
542 DUMP_REG(DC_DISP_DISP_WIN_OPTIONS);
543 DUMP_REG(DC_DISP_MEM_HIGH_PRIORITY);
544 DUMP_REG(DC_DISP_MEM_HIGH_PRIORITY_TIMER);
545 DUMP_REG(DC_DISP_DISP_TIMING_OPTIONS);
546 DUMP_REG(DC_DISP_REF_TO_SYNC);
547 DUMP_REG(DC_DISP_SYNC_WIDTH);
548 DUMP_REG(DC_DISP_BACK_PORCH);
549 DUMP_REG(DC_DISP_DISP_ACTIVE);
550 DUMP_REG(DC_DISP_FRONT_PORCH);
551 DUMP_REG(DC_DISP_H_PULSE0_CONTROL);
552 DUMP_REG(DC_DISP_H_PULSE0_POSITION_A);
553 DUMP_REG(DC_DISP_H_PULSE0_POSITION_B);
554 DUMP_REG(DC_DISP_H_PULSE0_POSITION_C);
555 DUMP_REG(DC_DISP_H_PULSE0_POSITION_D);
556 DUMP_REG(DC_DISP_H_PULSE1_CONTROL);
557 DUMP_REG(DC_DISP_H_PULSE1_POSITION_A);
558 DUMP_REG(DC_DISP_H_PULSE1_POSITION_B);
559 DUMP_REG(DC_DISP_H_PULSE1_POSITION_C);
560 DUMP_REG(DC_DISP_H_PULSE1_POSITION_D);
561 DUMP_REG(DC_DISP_H_PULSE2_CONTROL);
562 DUMP_REG(DC_DISP_H_PULSE2_POSITION_A);
563 DUMP_REG(DC_DISP_H_PULSE2_POSITION_B);
564 DUMP_REG(DC_DISP_H_PULSE2_POSITION_C);
565 DUMP_REG(DC_DISP_H_PULSE2_POSITION_D);
566 DUMP_REG(DC_DISP_V_PULSE0_CONTROL);
567 DUMP_REG(DC_DISP_V_PULSE0_POSITION_A);
568 DUMP_REG(DC_DISP_V_PULSE0_POSITION_B);
569 DUMP_REG(DC_DISP_V_PULSE0_POSITION_C);
570 DUMP_REG(DC_DISP_V_PULSE1_CONTROL);
571 DUMP_REG(DC_DISP_V_PULSE1_POSITION_A);
572 DUMP_REG(DC_DISP_V_PULSE1_POSITION_B);
573 DUMP_REG(DC_DISP_V_PULSE1_POSITION_C);
574 DUMP_REG(DC_DISP_V_PULSE2_CONTROL);
575 DUMP_REG(DC_DISP_V_PULSE2_POSITION_A);
576 DUMP_REG(DC_DISP_V_PULSE3_CONTROL);
577 DUMP_REG(DC_DISP_V_PULSE3_POSITION_A);
578 DUMP_REG(DC_DISP_M0_CONTROL);
579 DUMP_REG(DC_DISP_M1_CONTROL);
580 DUMP_REG(DC_DISP_DI_CONTROL);
581 DUMP_REG(DC_DISP_PP_CONTROL);
582 DUMP_REG(DC_DISP_PP_SELECT_A);
583 DUMP_REG(DC_DISP_PP_SELECT_B);
584 DUMP_REG(DC_DISP_PP_SELECT_C);
585 DUMP_REG(DC_DISP_PP_SELECT_D);
586 DUMP_REG(DC_DISP_DISP_CLOCK_CONTROL);
587 DUMP_REG(DC_DISP_DISP_INTERFACE_CONTROL);
588 DUMP_REG(DC_DISP_DISP_COLOR_CONTROL);
589 DUMP_REG(DC_DISP_SHIFT_CLOCK_OPTIONS);
590 DUMP_REG(DC_DISP_DATA_ENABLE_OPTIONS);
591 DUMP_REG(DC_DISP_SERIAL_INTERFACE_OPTIONS);
592 DUMP_REG(DC_DISP_LCD_SPI_OPTIONS);
593 #if !defined(CONFIG_TEGRA_DC_BLENDER_GEN2)
594 DUMP_REG(DC_DISP_BORDER_COLOR);
596 DUMP_REG(DC_DISP_COLOR_KEY0_LOWER);
597 DUMP_REG(DC_DISP_COLOR_KEY0_UPPER);
598 DUMP_REG(DC_DISP_COLOR_KEY1_LOWER);
599 DUMP_REG(DC_DISP_COLOR_KEY1_UPPER);
600 DUMP_REG(DC_DISP_CURSOR_FOREGROUND);
601 DUMP_REG(DC_DISP_CURSOR_BACKGROUND);
602 DUMP_REG(DC_DISP_CURSOR_START_ADDR);
603 DUMP_REG(DC_DISP_CURSOR_START_ADDR_NS);
604 #if defined(CONFIG_ARCH_TEGRA_12x_SOC)
605 DUMP_REG(DC_DISP_CURSOR_START_ADDR_HI);
606 DUMP_REG(DC_DISP_CURSOR_START_ADDR_HI_NS);
608 DUMP_REG(DC_DISP_CURSOR_POSITION);
609 DUMP_REG(DC_DISP_CURSOR_POSITION_NS);
610 DUMP_REG(DC_DISP_INIT_SEQ_CONTROL);
611 DUMP_REG(DC_DISP_SPI_INIT_SEQ_DATA_A);
612 DUMP_REG(DC_DISP_SPI_INIT_SEQ_DATA_B);
613 DUMP_REG(DC_DISP_SPI_INIT_SEQ_DATA_C);
614 DUMP_REG(DC_DISP_SPI_INIT_SEQ_DATA_D);
615 DUMP_REG(DC_DISP_DC_MCCIF_FIFOCTRL);
616 DUMP_REG(DC_DISP_MCCIF_DISPLAY0A_HYST);
617 DUMP_REG(DC_DISP_MCCIF_DISPLAY0B_HYST);
618 DUMP_REG(DC_DISP_MCCIF_DISPLAY0C_HYST);
619 #if defined(CONFIG_ARCH_TEGRA_2x_SOC) || defined(CONFIG_ARCH_TEGRA_3x_SOC)
620 DUMP_REG(DC_DISP_MCCIF_DISPLAY1B_HYST);
622 DUMP_REG(DC_DISP_DAC_CRT_CTRL);
623 DUMP_REG(DC_DISP_DISP_MISC_CONTROL);
624 #if defined(CONFIG_ARCH_TEGRA_12x_SOC) && defined(CONFIG_TEGRA_DC_INTERLACE)
625 DUMP_REG(DC_DISP_INTERLACE_CONTROL);
626 DUMP_REG(DC_DISP_INTERLACE_FIELD2_REF_TO_SYNC);
627 DUMP_REG(DC_DISP_INTERLACE_FIELD2_SYNC_WIDTH);
628 DUMP_REG(DC_DISP_INTERLACE_FIELD2_BACK_PORCH);
629 DUMP_REG(DC_DISP_INTERLACE_FIELD2_FRONT_PORCH);
630 DUMP_REG(DC_DISP_INTERLACE_FIELD2_DISP_ACTIVE);
632 for_each_set_bit(i, &dc->valid_windows, DC_N_WINDOWS) {
634 snprintf(buff, sizeof(buff), "WINDOW %c:\n", winname[i]);
637 tegra_dc_writel(dc, WINDOW_A_SELECT << i,
638 DC_CMD_DISPLAY_WINDOW_HEADER);
639 DUMP_REG(DC_CMD_DISPLAY_WINDOW_HEADER);
640 DUMP_REG(DC_WIN_WIN_OPTIONS);
641 DUMP_REG(DC_WIN_BYTE_SWAP);
642 DUMP_REG(DC_WIN_BUFFER_CONTROL);
643 DUMP_REG(DC_WIN_COLOR_DEPTH);
644 DUMP_REG(DC_WIN_POSITION);
645 DUMP_REG(DC_WIN_SIZE);
646 DUMP_REG(DC_WIN_PRESCALED_SIZE);
647 DUMP_REG(DC_WIN_H_INITIAL_DDA);
648 DUMP_REG(DC_WIN_V_INITIAL_DDA);
649 DUMP_REG(DC_WIN_DDA_INCREMENT);
650 DUMP_REG(DC_WIN_LINE_STRIDE);
651 #if defined(CONFIG_ARCH_TEGRA_2x_SOC) || defined(CONFIG_ARCH_TEGRA_3x_SOC)
652 DUMP_REG(DC_WIN_BUF_STRIDE);
653 DUMP_REG(DC_WIN_UV_BUF_STRIDE);
655 DUMP_REG(DC_WIN_BLEND_NOKEY);
656 DUMP_REG(DC_WIN_BLEND_1WIN);
657 DUMP_REG(DC_WIN_BLEND_2WIN_X);
658 DUMP_REG(DC_WIN_BLEND_2WIN_Y);
659 DUMP_REG(DC_WIN_BLEND_3WIN_XY);
660 DUMP_REG(DC_WINBUF_START_ADDR);
661 DUMP_REG(DC_WINBUF_START_ADDR_U);
662 DUMP_REG(DC_WINBUF_START_ADDR_V);
663 DUMP_REG(DC_WINBUF_ADDR_H_OFFSET);
664 DUMP_REG(DC_WINBUF_ADDR_V_OFFSET);
665 #if defined(CONFIG_ARCH_TEGRA_12x_SOC)
666 DUMP_REG(DC_WINBUF_START_ADDR_HI);
667 DUMP_REG(DC_WINBUF_START_ADDR_HI_U);
668 DUMP_REG(DC_WINBUF_START_ADDR_HI_V);
669 DUMP_REG(DC_WINBUF_START_ADDR_FIELD2);
670 DUMP_REG(DC_WINBUF_START_ADDR_FIELD2_U);
671 DUMP_REG(DC_WINBUF_START_ADDR_FIELD2_V);
672 DUMP_REG(DC_WINBUF_START_ADDR_FIELD2_HI);
673 DUMP_REG(DC_WINBUF_START_ADDR_FIELD2_HI_U);
674 DUMP_REG(DC_WINBUF_START_ADDR_FIELD2_HI_V);
675 DUMP_REG(DC_WINBUF_ADDR_H_OFFSET_FIELD2);
676 DUMP_REG(DC_WINBUF_ADDR_V_OFFSET_FIELD2);
678 DUMP_REG(DC_WINBUF_UFLOW_STATUS);
679 DUMP_REG(DC_WIN_CSC_YOF);
680 DUMP_REG(DC_WIN_CSC_KYRGB);
681 DUMP_REG(DC_WIN_CSC_KUR);
682 DUMP_REG(DC_WIN_CSC_KVR);
683 DUMP_REG(DC_WIN_CSC_KUG);
684 DUMP_REG(DC_WIN_CSC_KVG);
685 DUMP_REG(DC_WIN_CSC_KUB);
686 DUMP_REG(DC_WIN_CSC_KVB);
689 DUMP_REG(DC_CMD_DISPLAY_POWER_CONTROL);
690 DUMP_REG(DC_COM_PIN_OUTPUT_ENABLE2);
691 DUMP_REG(DC_COM_PIN_OUTPUT_POLARITY2);
692 DUMP_REG(DC_COM_PIN_OUTPUT_DATA2);
693 DUMP_REG(DC_COM_PIN_INPUT_ENABLE2);
694 DUMP_REG(DC_COM_PIN_OUTPUT_SELECT5);
695 DUMP_REG(DC_DISP_DISP_SIGNAL_OPTIONS0);
696 DUMP_REG(DC_DISP_M1_CONTROL);
697 DUMP_REG(DC_COM_PM1_CONTROL);
698 DUMP_REG(DC_COM_PM1_DUTY_CYCLE);
699 DUMP_REG(DC_DISP_SD_CONTROL);
700 #ifdef CONFIG_TEGRA_DC_CMU
701 DUMP_REG(DC_COM_CMU_CSC_KRR);
702 DUMP_REG(DC_COM_CMU_CSC_KGR);
703 DUMP_REG(DC_COM_CMU_CSC_KBR);
704 DUMP_REG(DC_COM_CMU_CSC_KRG);
705 DUMP_REG(DC_COM_CMU_CSC_KGG);
706 DUMP_REG(DC_COM_CMU_CSC_KBR);
707 DUMP_REG(DC_COM_CMU_CSC_KRB);
708 DUMP_REG(DC_COM_CMU_CSC_KGB);
709 DUMP_REG(DC_COM_CMU_CSC_KBB);
713 mutex_unlock(&dc->lock);
719 static void dump_regs_print(void *data, const char *str)
721 struct tegra_dc *dc = data;
722 dev_dbg(&dc->ndev->dev, "%s", str);
725 static void dump_regs(struct tegra_dc *dc)
727 _dump_regs(dc, dc, dump_regs_print);
731 static void dump_regs(struct tegra_dc *dc) {}
735 #ifdef CONFIG_DEBUG_FS
737 static void dbg_regs_print(void *data, const char *str)
739 struct seq_file *s = data;
741 seq_printf(s, "%s", str);
746 static int dbg_dc_show(struct seq_file *s, void *unused)
748 struct tegra_dc *dc = s->private;
750 _dump_regs(dc, s, dbg_regs_print);
756 static int dbg_dc_open(struct inode *inode, struct file *file)
758 return single_open(file, dbg_dc_show, inode->i_private);
761 static const struct file_operations regs_fops = {
765 .release = single_release,
768 static int dbg_dc_mode_show(struct seq_file *s, void *unused)
770 struct tegra_dc *dc = s->private;
771 struct tegra_dc_mode *m;
773 mutex_lock(&dc->lock);
777 "h_ref_to_sync: %d\n"
778 "v_ref_to_sync: %d\n"
785 "h_front_porch: %d\n"
786 "v_front_porch: %d\n"
788 m->pclk, m->h_ref_to_sync, m->v_ref_to_sync,
789 m->h_sync_width, m->v_sync_width,
790 m->h_back_porch, m->v_back_porch,
791 m->h_active, m->v_active,
792 m->h_front_porch, m->v_front_porch,
794 mutex_unlock(&dc->lock);
798 static int dbg_dc_mode_open(struct inode *inode, struct file *file)
800 return single_open(file, dbg_dc_mode_show, inode->i_private);
803 static const struct file_operations mode_fops = {
804 .open = dbg_dc_mode_open,
807 .release = single_release,
810 static int dbg_dc_stats_show(struct seq_file *s, void *unused)
812 struct tegra_dc *dc = s->private;
814 mutex_lock(&dc->lock);
817 "underflows_a: %llu\n"
818 "underflows_b: %llu\n"
819 "underflows_c: %llu\n",
820 dc->stats.underflows,
821 dc->stats.underflows_a,
822 dc->stats.underflows_b,
823 dc->stats.underflows_c);
824 #if defined(CONFIG_ARCH_TEGRA_14x_SOC) || defined(CONFIG_ARCH_TEGRA_12x_SOC)
826 "underflows_d: %llu\n"
827 "underflows_h: %llu\n"
828 "underflows_t: %llu\n",
829 dc->stats.underflows_d,
830 dc->stats.underflows_h,
831 dc->stats.underflows_t);
833 mutex_unlock(&dc->lock);
838 static int dbg_dc_stats_open(struct inode *inode, struct file *file)
840 return single_open(file, dbg_dc_stats_show, inode->i_private);
843 static int dbg_dc_event_inject_show(struct seq_file *s, void *unused)
848 static ssize_t dbg_dc_event_inject_write(struct file *file,
849 const char __user *addr, size_t len, loff_t *pos)
851 struct seq_file *m = file->private_data; /* single_open() initialized */
852 struct tegra_dc *dc = m ? m->private : NULL;
859 ret = kstrtol_from_user(addr, len, 10, &event);
863 if (event == 0x1) /* TEGRA_DC_EXT_EVENT_HOTPLUG */
864 tegra_dc_ext_process_hotplug(dc->ndev->id);
865 else if (event == 0x2) /* TEGRA_DC_EXT_EVENT_BANDWIDTH_DEC */
866 tegra_dc_ext_process_bandwidth_renegotiate(
869 dev_err(&dc->ndev->dev, "Unknown event 0x%lx\n", event);
870 return -EINVAL; /* unknown event number */
875 static const struct file_operations stats_fops = {
876 .open = dbg_dc_stats_open,
879 .release = single_release,
882 static int dbg_dc_event_inject_open(struct inode *inode, struct file *file)
884 return single_open(file, dbg_dc_event_inject_show, inode->i_private);
887 static const struct file_operations event_inject_fops = {
888 .open = dbg_dc_event_inject_open,
890 .write = dbg_dc_event_inject_write,
892 .release = single_release,
895 static void tegra_dc_remove_debugfs(struct tegra_dc *dc)
898 debugfs_remove_recursive(dc->debugdir);
902 static void tegra_dc_create_debugfs(struct tegra_dc *dc)
904 struct dentry *retval;
906 dc->debugdir = debugfs_create_dir(dev_name(&dc->ndev->dev), NULL);
910 retval = debugfs_create_file("regs", S_IRUGO, dc->debugdir, dc,
915 retval = debugfs_create_file("mode", S_IRUGO, dc->debugdir, dc,
920 retval = debugfs_create_file("stats", S_IRUGO, dc->debugdir, dc,
925 retval = debugfs_create_file("event_inject", S_IRUGO, dc->debugdir, dc,
932 dev_err(&dc->ndev->dev, "could not create debugfs\n");
933 tegra_dc_remove_debugfs(dc);
936 #else /* !CONFIG_DEBUGFS */
937 static inline void tegra_dc_create_debugfs(struct tegra_dc *dc) { };
938 static inline void tegra_dc_remove_debugfs(struct tegra_dc *dc) { };
939 #endif /* CONFIG_DEBUGFS */
941 static int tegra_dc_set(struct tegra_dc *dc, int index)
945 mutex_lock(&tegra_dc_lock);
946 if (index >= TEGRA_MAX_DC) {
951 if (dc != NULL && tegra_dcs[index] != NULL) {
956 tegra_dcs[index] = dc;
959 mutex_unlock(&tegra_dc_lock);
964 unsigned int tegra_dc_has_multiple_dc(void)
967 unsigned int cnt = 0;
970 mutex_lock(&tegra_dc_lock);
971 for (idx = 0; idx < TEGRA_MAX_DC; idx++)
972 cnt += ((dc = tegra_dcs[idx]) != NULL && dc->enabled) ? 1 : 0;
973 mutex_unlock(&tegra_dc_lock);
978 /* get the stride size of a window.
979 * return: stride size in bytes for window win. or 0 if unavailble. */
980 int tegra_dc_get_stride(struct tegra_dc *dc, unsigned win)
986 BUG_ON(win > DC_N_WINDOWS);
987 mutex_lock(&dc->lock);
989 tegra_dc_writel(dc, WINDOW_A_SELECT << win,
990 DC_CMD_DISPLAY_WINDOW_HEADER);
991 stride = tegra_dc_readl(dc, DC_WIN_LINE_STRIDE);
993 mutex_unlock(&dc->lock);
994 return GET_LINE_STRIDE(stride);
996 EXPORT_SYMBOL(tegra_dc_get_stride);
998 struct tegra_dc *tegra_dc_get_dc(unsigned idx)
1000 if (idx < TEGRA_MAX_DC)
1001 return tegra_dcs[idx];
1005 EXPORT_SYMBOL(tegra_dc_get_dc);
1007 struct tegra_dc_win *tegra_dc_get_window(struct tegra_dc *dc, unsigned win)
1009 if (win >= DC_N_WINDOWS || !test_bit(win, &dc->valid_windows))
1012 return &dc->windows[win];
1014 EXPORT_SYMBOL(tegra_dc_get_window);
1016 bool tegra_dc_get_connected(struct tegra_dc *dc)
1018 return dc->connected;
1020 EXPORT_SYMBOL(tegra_dc_get_connected);
1022 bool tegra_dc_hpd(struct tegra_dc *dc)
1028 if (WARN_ON(!dc || !dc->out))
1031 if (dc->out->hotplug_state != 0) {
1032 if (dc->out->hotplug_state == 1) /* force on */
1034 if (dc->out->hotplug_state == -1) /* force off */
1037 level = gpio_get_value_cansleep(dc->out->hotplug_gpio);
1039 sense = dc->out->flags & TEGRA_DC_OUT_HOTPLUG_MASK;
1041 hpd = (sense == TEGRA_DC_OUT_HOTPLUG_HIGH && level) ||
1042 (sense == TEGRA_DC_OUT_HOTPLUG_LOW && !level);
1044 if (dc->out->hotplug_report)
1045 dc->out->hotplug_report(hpd);
1049 EXPORT_SYMBOL(tegra_dc_hpd);
1051 static void tegra_dc_set_scaling_filter(struct tegra_dc *dc)
1057 /* linear horizontal and vertical filters */
1058 for (i = 0; i < 16; i++) {
1059 tegra_dc_writel(dc, (v1 << 16) | (v0 << 8),
1060 DC_WIN_H_FILTER_P(i));
1062 tegra_dc_writel(dc, v0,
1063 DC_WIN_V_FILTER_P(i));
1069 #ifdef CONFIG_TEGRA_DC_CMU
1070 static void tegra_dc_cache_cmu(struct tegra_dc *dc,
1071 struct tegra_dc_cmu *src_cmu)
1073 if (&dc->cmu != src_cmu) /* ignore if it would require memmove() */
1074 memcpy(&dc->cmu, src_cmu, sizeof(*src_cmu));
1075 dc->cmu_dirty = true;
1078 static void tegra_dc_set_cmu(struct tegra_dc *dc, struct tegra_dc_cmu *cmu)
1083 for (i = 0; i < 256; i++) {
1084 val = LUT1_ADDR(i) | LUT1_DATA(cmu->lut1[i]);
1085 tegra_dc_writel(dc, val, DC_COM_CMU_LUT1);
1088 tegra_dc_writel(dc, cmu->csc.krr, DC_COM_CMU_CSC_KRR);
1089 tegra_dc_writel(dc, cmu->csc.kgr, DC_COM_CMU_CSC_KGR);
1090 tegra_dc_writel(dc, cmu->csc.kbr, DC_COM_CMU_CSC_KBR);
1091 tegra_dc_writel(dc, cmu->csc.krg, DC_COM_CMU_CSC_KRG);
1092 tegra_dc_writel(dc, cmu->csc.kgg, DC_COM_CMU_CSC_KGG);
1093 tegra_dc_writel(dc, cmu->csc.kbg, DC_COM_CMU_CSC_KBG);
1094 tegra_dc_writel(dc, cmu->csc.krb, DC_COM_CMU_CSC_KRB);
1095 tegra_dc_writel(dc, cmu->csc.kgb, DC_COM_CMU_CSC_KGB);
1096 tegra_dc_writel(dc, cmu->csc.kbb, DC_COM_CMU_CSC_KBB);
1098 for (i = 0; i < 960; i++) {
1099 val = LUT2_ADDR(i) | LUT1_DATA(cmu->lut2[i]);
1100 tegra_dc_writel(dc, val, DC_COM_CMU_LUT2);
1103 dc->cmu_dirty = false;
1106 static void _tegra_dc_update_cmu(struct tegra_dc *dc, struct tegra_dc_cmu *cmu)
1110 if (!dc->cmu_enabled)
1113 tegra_dc_cache_cmu(dc, cmu);
1116 if (dc->cmu_dirty) {
1117 /* Disable CMU to avoid programming it while it is in use */
1118 val = tegra_dc_readl(dc, DC_DISP_DISP_COLOR_CONTROL);
1119 if (val & CMU_ENABLE) {
1121 tegra_dc_writel(dc, val,
1122 DC_DISP_DISP_COLOR_CONTROL);
1123 val = GENERAL_ACT_REQ;
1124 tegra_dc_writel(dc, val, DC_CMD_STATE_CONTROL);
1125 /*TODO: Sync up with vsync */
1128 dev_dbg(&dc->ndev->dev, "updating CMU cmu_dirty=%d\n",
1131 tegra_dc_set_cmu(dc, &dc->cmu);
1135 int tegra_dc_update_cmu(struct tegra_dc *dc, struct tegra_dc_cmu *cmu)
1137 mutex_lock(&dc->lock);
1139 mutex_unlock(&dc->lock);
1145 _tegra_dc_update_cmu(dc, cmu);
1146 tegra_dc_set_color_control(dc);
1149 mutex_unlock(&dc->lock);
1153 EXPORT_SYMBOL(tegra_dc_update_cmu);
1155 static struct tegra_dc_cmu *tegra_dc_get_cmu(struct tegra_dc *dc)
1158 return dc->pdata->cmu;
1159 else if (dc->out->type == TEGRA_DC_OUT_HDMI)
1160 return &default_limited_cmu;
1162 return &default_cmu;
1165 void tegra_dc_cmu_enable(struct tegra_dc *dc, bool cmu_enable)
1167 dc->cmu_enabled = cmu_enable;
1168 tegra_dc_update_cmu(dc, tegra_dc_get_cmu(dc));
1171 #define tegra_dc_cache_cmu(dc, src_cmu)
1172 #define tegra_dc_set_cmu(dc, cmu)
1173 #define tegra_dc_update_cmu(dc, cmu)
1176 /* disable_irq() blocks until handler completes, calling this function while
1177 * holding dc->lock can deadlock. */
1178 static inline void disable_dc_irq(const struct tegra_dc *dc)
1180 disable_irq(dc->irq);
1183 u32 tegra_dc_get_syncpt_id(const struct tegra_dc *dc, int i)
1185 return dc->syncpt[i].id;
1187 EXPORT_SYMBOL(tegra_dc_get_syncpt_id);
1189 u32 tegra_dc_incr_syncpt_max(struct tegra_dc *dc, int i)
1193 mutex_lock(&dc->lock);
1195 max = nvhost_syncpt_incr_max_ext(dc->ndev,
1196 dc->syncpt[i].id, ((dc->enabled) ? 1 : 0));
1197 dc->syncpt[i].max = max;
1199 mutex_unlock(&dc->lock);
1204 void tegra_dc_incr_syncpt_min(struct tegra_dc *dc, int i, u32 val)
1206 mutex_lock(&dc->lock);
1209 while (dc->syncpt[i].min < val) {
1210 dc->syncpt[i].min++;
1211 nvhost_syncpt_cpu_incr_ext(dc->ndev, dc->syncpt[i].id);
1214 mutex_unlock(&dc->lock);
1218 tegra_dc_config_pwm(struct tegra_dc *dc, struct tegra_dc_pwm_params *cfg)
1221 unsigned long out_sel;
1222 unsigned long cmd_state;
1224 mutex_lock(&dc->lock);
1226 mutex_unlock(&dc->lock);
1232 ctrl = ((cfg->period << PM_PERIOD_SHIFT) |
1233 (cfg->clk_div << PM_CLK_DIVIDER_SHIFT) |
1236 /* The new value should be effected immediately */
1237 cmd_state = tegra_dc_readl(dc, DC_CMD_STATE_ACCESS);
1238 tegra_dc_writel(dc, (cmd_state | (1 << 2)), DC_CMD_STATE_ACCESS);
1240 switch (cfg->which_pwm) {
1242 /* Select the LM0 on PM0 */
1243 out_sel = tegra_dc_readl(dc, DC_COM_PIN_OUTPUT_SELECT5);
1244 out_sel &= ~(7 << 0);
1245 out_sel |= (3 << 0);
1246 tegra_dc_writel(dc, out_sel, DC_COM_PIN_OUTPUT_SELECT5);
1247 tegra_dc_writel(dc, ctrl, DC_COM_PM0_CONTROL);
1248 tegra_dc_writel(dc, cfg->duty_cycle, DC_COM_PM0_DUTY_CYCLE);
1251 /* Select the LM1 on PM1 */
1252 out_sel = tegra_dc_readl(dc, DC_COM_PIN_OUTPUT_SELECT5);
1253 out_sel &= ~(7 << 4);
1254 out_sel |= (3 << 4);
1255 tegra_dc_writel(dc, out_sel, DC_COM_PIN_OUTPUT_SELECT5);
1256 tegra_dc_writel(dc, ctrl, DC_COM_PM1_CONTROL);
1257 tegra_dc_writel(dc, cfg->duty_cycle, DC_COM_PM1_DUTY_CYCLE);
1260 dev_err(&dc->ndev->dev, "Error: Need which_pwm\n");
1263 tegra_dc_writel(dc, cmd_state, DC_CMD_STATE_ACCESS);
1265 mutex_unlock(&dc->lock);
1267 EXPORT_SYMBOL(tegra_dc_config_pwm);
1269 void tegra_dc_set_out_pin_polars(struct tegra_dc *dc,
1270 const struct tegra_dc_out_pin *pins,
1271 const unsigned int n_pins)
1283 set1 = set3 = unset1 = unset3 = 0;
1285 for (i = 0; i < n_pins; i++) {
1286 name = (pins + i)->name;
1287 pol = (pins + i)->pol;
1289 /* set polarity by name */
1291 case TEGRA_DC_OUT_PIN_DATA_ENABLE:
1292 if (pol == TEGRA_DC_OUT_PIN_POL_LOW)
1293 set3 |= LSPI_OUTPUT_POLARITY_LOW;
1295 unset3 |= LSPI_OUTPUT_POLARITY_LOW;
1297 case TEGRA_DC_OUT_PIN_H_SYNC:
1298 if (pol == TEGRA_DC_OUT_PIN_POL_LOW)
1299 set1 |= LHS_OUTPUT_POLARITY_LOW;
1301 unset1 |= LHS_OUTPUT_POLARITY_LOW;
1303 case TEGRA_DC_OUT_PIN_V_SYNC:
1304 if (pol == TEGRA_DC_OUT_PIN_POL_LOW)
1305 set1 |= LVS_OUTPUT_POLARITY_LOW;
1307 unset1 |= LVS_OUTPUT_POLARITY_LOW;
1309 case TEGRA_DC_OUT_PIN_PIXEL_CLOCK:
1310 if (pol == TEGRA_DC_OUT_PIN_POL_LOW)
1311 set1 |= LSC0_OUTPUT_POLARITY_LOW;
1313 unset1 |= LSC0_OUTPUT_POLARITY_LOW;
1316 printk("Invalid argument in function %s\n",
1322 pol1 = DC_COM_PIN_OUTPUT_POLARITY1_INIT_VAL;
1323 pol3 = DC_COM_PIN_OUTPUT_POLARITY3_INIT_VAL;
1331 tegra_dc_writel(dc, pol1, DC_COM_PIN_OUTPUT_POLARITY1);
1332 tegra_dc_writel(dc, pol3, DC_COM_PIN_OUTPUT_POLARITY3);
1335 static struct tegra_dc_mode *tegra_dc_get_override_mode(struct tegra_dc *dc)
1337 if (dc->out->type == TEGRA_DC_OUT_RGB ||
1338 dc->out->type == TEGRA_DC_OUT_HDMI ||
1339 dc->out->type == TEGRA_DC_OUT_DSI)
1340 return override_disp_mode[dc->out->type].pclk ?
1341 &override_disp_mode[dc->out->type] : NULL;
1346 static int tegra_dc_set_out(struct tegra_dc *dc, struct tegra_dc_out *out)
1348 struct tegra_dc_mode *mode;
1352 mode = tegra_dc_get_override_mode(dc);
1355 tegra_dc_set_mode(dc, mode);
1358 * Bootloader should and should only pass disp_params if
1359 * it has initialized display controller. Whenever we see
1360 * override modes, we should skip things cause display resets.
1362 dev_info(&dc->ndev->dev, "Bootloader disp_param detected. "
1363 "Detected mode: %dx%d (on %dx%dmm) pclk=%d\n",
1364 dc->mode.h_active, dc->mode.v_active,
1365 dc->out->h_size, dc->out->v_size,
1367 dc->initialized = true;
1369 #ifdef CONFIG_TEGRA_DC_CMU
1371 * If the bootloader already set the mode, assume the CMU
1372 * parameters are also correctly set. It would be better to
1373 * read them, but unfortunately there is no reliable and
1374 * flicker-free way to do this!
1376 tegra_dc_cache_cmu(dc, tegra_dc_get_cmu(dc));
1378 } else if (out->n_modes > 0)
1379 tegra_dc_set_mode(dc, &dc->out->modes[0]);
1381 switch (out->type) {
1382 case TEGRA_DC_OUT_RGB:
1383 dc->out_ops = &tegra_dc_rgb_ops;
1386 case TEGRA_DC_OUT_HDMI:
1387 dc->out_ops = &tegra_dc_hdmi_ops;
1390 case TEGRA_DC_OUT_DSI:
1391 dc->out_ops = &tegra_dc_dsi_ops;
1394 #ifdef CONFIG_TEGRA_DP
1395 case TEGRA_DC_OUT_DP:
1396 dc->out_ops = &tegra_dc_dp_ops;
1398 #ifdef CONFIG_TEGRA_NVSR
1399 case TEGRA_DC_OUT_NVSR_DP:
1400 dc->out_ops = &tegra_dc_nvsr_ops;
1404 #ifdef CONFIG_TEGRA_LVDS
1405 case TEGRA_DC_OUT_LVDS:
1406 dc->out_ops = &tegra_dc_lvds_ops;
1414 if (dc->out_ops && dc->out_ops->init) {
1415 err = dc->out_ops->init(dc);
1426 /* returns on error: -EINVAL
1427 * on success: TEGRA_DC_OUT_RGB, TEGRA_DC_OUT_HDMI, or TEGRA_DC_OUT_DSI. */
1428 int tegra_dc_get_out(const struct tegra_dc *dc)
1431 return dc->out->type;
1435 unsigned tegra_dc_get_out_height(const struct tegra_dc *dc)
1438 return dc->out->height;
1442 EXPORT_SYMBOL(tegra_dc_get_out_height);
1444 unsigned tegra_dc_get_out_width(const struct tegra_dc *dc)
1447 return dc->out->width;
1451 EXPORT_SYMBOL(tegra_dc_get_out_width);
1453 unsigned tegra_dc_get_out_max_pixclock(const struct tegra_dc *dc)
1455 if (dc->out && dc->out->max_pixclock)
1456 return dc->out->max_pixclock;
1460 EXPORT_SYMBOL(tegra_dc_get_out_max_pixclock);
1462 void tegra_dc_enable_crc(struct tegra_dc *dc)
1466 mutex_lock(&dc->lock);
1469 val = CRC_ALWAYS_ENABLE | CRC_INPUT_DATA_ACTIVE_DATA |
1471 tegra_dc_writel(dc, val, DC_COM_CRC_CONTROL);
1472 tegra_dc_writel(dc, GENERAL_UPDATE, DC_CMD_STATE_CONTROL);
1473 tegra_dc_writel(dc, GENERAL_ACT_REQ, DC_CMD_STATE_CONTROL);
1475 mutex_unlock(&dc->lock);
1477 /* Register a client of frame_end interrupt */
1478 tegra_dc_config_frame_end_intr(dc, true);
1481 void tegra_dc_disable_crc(struct tegra_dc *dc)
1483 /* Unregister a client of frame_end interrupt */
1484 tegra_dc_config_frame_end_intr(dc, false);
1486 mutex_lock(&dc->lock);
1488 tegra_dc_writel(dc, 0x0, DC_COM_CRC_CONTROL);
1489 tegra_dc_writel(dc, GENERAL_UPDATE, DC_CMD_STATE_CONTROL);
1490 tegra_dc_writel(dc, GENERAL_ACT_REQ, DC_CMD_STATE_CONTROL);
1493 mutex_unlock(&dc->lock);
1496 u32 tegra_dc_read_checksum_latched(struct tegra_dc *dc)
1501 pr_err("Failed to get dc: NULL parameter.\n");
1505 /* If gated quitely return */
1506 if (!tegra_dc_is_powered(dc))
1509 INIT_COMPLETION(dc->crc_complete);
1510 if (dc->crc_pending &&
1511 wait_for_completion_interruptible(&dc->crc_complete)) {
1512 pr_err("CRC read interrupted.\n");
1516 mutex_lock(&dc->lock);
1518 crc = tegra_dc_readl(dc, DC_COM_CRC_CHECKSUM_LATCHED);
1520 mutex_unlock(&dc->lock);
1525 static bool tegra_dc_windows_are_dirty(struct tegra_dc *dc)
1529 if (tegra_platform_is_linsim())
1532 val = tegra_dc_readl(dc, DC_CMD_STATE_CONTROL);
1533 if (val & WIN_ALL_ACT_REQ)
1539 static inline void enable_dc_irq(const struct tegra_dc *dc)
1541 if (tegra_platform_is_fpga())
1542 /* Always disable DC interrupts on FPGA. */
1543 disable_irq(dc->irq);
1545 enable_irq(dc->irq);
1548 void tegra_dc_get_fbvblank(struct tegra_dc *dc, struct fb_vblank *vblank)
1550 if (dc->out->flags & TEGRA_DC_OUT_ONE_SHOT_MODE)
1551 vblank->flags = FB_VBLANK_HAVE_VSYNC;
1554 /* assumes dc->lock is already taken. */
1555 static void _tegra_dc_vsync_enable(struct tegra_dc *dc)
1559 if (dc->out->type == TEGRA_DC_OUT_DSI)
1560 vsync_irq = MSF_INT;
1562 vsync_irq = V_BLANK_INT;
1563 tegra_dc_hold_dc_out(dc);
1564 set_bit(V_BLANK_USER, &dc->vblank_ref_count);
1565 tegra_dc_unmask_interrupt(dc, vsync_irq);
1568 int tegra_dc_vsync_enable(struct tegra_dc *dc)
1570 mutex_lock(&dc->lock);
1572 _tegra_dc_vsync_enable(dc);
1573 mutex_unlock(&dc->lock);
1576 mutex_unlock(&dc->lock);
1580 /* assumes dc->lock is already taken. */
1581 static void _tegra_dc_vsync_disable(struct tegra_dc *dc)
1585 if (dc->out->type == TEGRA_DC_OUT_DSI)
1586 vsync_irq = MSF_INT;
1588 vsync_irq = V_BLANK_INT;
1589 clear_bit(V_BLANK_USER, &dc->vblank_ref_count);
1590 if (!dc->vblank_ref_count)
1591 tegra_dc_mask_interrupt(dc, vsync_irq);
1592 tegra_dc_release_dc_out(dc);
1595 void tegra_dc_vsync_disable(struct tegra_dc *dc)
1597 mutex_lock(&dc->lock);
1598 _tegra_dc_vsync_disable(dc);
1599 mutex_unlock(&dc->lock);
1602 /* assumes dc->lock is already taken. */
1603 static void _tegra_dc_user_vsync_enable(struct tegra_dc *dc, bool enable)
1606 dc->out->user_needs_vblank++;
1607 init_completion(&dc->out->user_vblank_comp);
1608 _tegra_dc_vsync_enable(dc);
1610 _tegra_dc_vsync_disable(dc);
1611 dc->out->user_needs_vblank--;
1615 int tegra_dc_wait_for_vsync(struct tegra_dc *dc)
1617 unsigned long timeout_ms;
1618 unsigned long refresh; /* in 1000th Hz */
1621 mutex_lock(&dc->lp_lock);
1622 mutex_lock(&dc->lock);
1627 refresh = tegra_dc_calc_refresh(&dc->mode);
1628 /* time out if waiting took more than 2 frames */
1629 timeout_ms = DIV_ROUND_UP(2 * 1000000, refresh);
1630 _tegra_dc_user_vsync_enable(dc, true);
1631 mutex_unlock(&dc->lock);
1633 ret = wait_for_completion_interruptible_timeout(
1634 &dc->out->user_vblank_comp, msecs_to_jiffies(timeout_ms));
1636 mutex_lock(&dc->lock);
1637 _tegra_dc_user_vsync_enable(dc, false);
1639 mutex_unlock(&dc->lock);
1640 mutex_unlock(&dc->lp_lock);
1644 int tegra_dc_wait_for_frame_end(struct tegra_dc *dc,
1649 INIT_COMPLETION(dc->frame_end_complete);
1653 tegra_dc_flush_interrupt(dc, FRAME_END_INT);
1654 /* unmask frame end interrupt */
1655 tegra_dc_config_frame_end_intr(dc, true);
1657 ret = wait_for_completion_interruptible_timeout(
1658 &dc->frame_end_complete,
1659 msecs_to_jiffies(timeout_ms));
1661 tegra_dc_config_frame_end_intr(dc, false);
1668 static void tegra_dc_prism_update_backlight(struct tegra_dc *dc)
1670 /* Do the actual brightness update outside of the mutex dc->lock */
1671 if (dc->out->sd_settings && !dc->out->sd_settings->bl_device &&
1672 dc->out->sd_settings->bl_device_name) {
1673 char *bl_device_name =
1674 dc->out->sd_settings->bl_device_name;
1675 dc->out->sd_settings->bl_device =
1676 get_backlight_device_by_name(bl_device_name);
1679 if (dc->out->sd_settings && dc->out->sd_settings->bl_device) {
1680 struct backlight_device *bl = dc->out->sd_settings->bl_device;
1681 backlight_update_status(bl);
1685 static void tegra_dc_vblank(struct work_struct *work)
1687 struct tegra_dc *dc = container_of(work, struct tegra_dc, vblank_work);
1688 bool nvsd_updated = false;
1690 mutex_lock(&dc->lock);
1693 mutex_unlock(&dc->lock);
1699 /* Clear the V_BLANK_FLIP bit of vblank ref-count if update is clean. */
1700 if (!tegra_dc_windows_are_dirty(dc))
1701 clear_bit(V_BLANK_FLIP, &dc->vblank_ref_count);
1703 /* Update the SD brightness */
1704 if (dc->out->sd_settings && !dc->out->sd_settings->use_vpulse2) {
1705 nvsd_updated = nvsd_update_brightness(dc);
1706 /* Ref-count vblank if nvsd is on-going. Otherwise, clean the
1707 * V_BLANK_NVSD bit of vblank ref-count. */
1709 set_bit(V_BLANK_NVSD, &dc->vblank_ref_count);
1710 tegra_dc_unmask_interrupt(dc, V_BLANK_INT);
1712 clear_bit(V_BLANK_NVSD, &dc->vblank_ref_count);
1716 /* Mask vblank interrupt if ref-count is zero. */
1717 if (!dc->vblank_ref_count)
1718 tegra_dc_mask_interrupt(dc, V_BLANK_INT);
1721 mutex_unlock(&dc->lock);
1723 /* Do the actual brightness update outside of the mutex dc->lock */
1725 tegra_dc_prism_update_backlight(dc);
1728 static void tegra_dc_one_shot_worker(struct work_struct *work)
1730 struct tegra_dc *dc = container_of(
1731 to_delayed_work(work), struct tegra_dc, one_shot_work);
1732 mutex_lock(&dc->lock);
1734 /* memory client has gone idle */
1735 tegra_dc_clear_bandwidth(dc);
1737 if (dc->out_ops && dc->out_ops->idle) {
1738 tegra_dc_io_start(dc);
1739 dc->out_ops->idle(dc);
1740 tegra_dc_io_end(dc);
1743 mutex_unlock(&dc->lock);
1746 /* return an arbitrarily large number if count overflow occurs.
1747 * make it a nice base-10 number to show up in stats output */
1748 static u64 tegra_dc_underflow_count(struct tegra_dc *dc, unsigned reg)
1750 unsigned count = tegra_dc_readl(dc, reg);
1752 tegra_dc_writel(dc, 0, reg);
1753 return ((count & 0x80000000) == 0) ? count : 10000000000ll;
1756 static void tegra_dc_underflow_handler(struct tegra_dc *dc)
1758 const u32 masks[] = {
1762 #if defined(CONFIG_ARCH_TEGRA_14x_SOC) || defined(CONFIG_ARCH_TEGRA_12x_SOC)
1770 dc->stats.underflows++;
1771 if (dc->underflow_mask & WIN_A_UF_INT)
1772 dc->stats.underflows_a += tegra_dc_underflow_count(dc,
1773 DC_WINBUF_AD_UFLOW_STATUS);
1774 if (dc->underflow_mask & WIN_B_UF_INT)
1775 dc->stats.underflows_b += tegra_dc_underflow_count(dc,
1776 DC_WINBUF_BD_UFLOW_STATUS);
1777 if (dc->underflow_mask & WIN_C_UF_INT)
1778 dc->stats.underflows_c += tegra_dc_underflow_count(dc,
1779 DC_WINBUF_CD_UFLOW_STATUS);
1780 #if defined(CONFIG_ARCH_TEGRA_14x_SOC) || defined(CONFIG_ARCH_TEGRA_12x_SOC)
1781 if (dc->underflow_mask & HC_UF_INT)
1782 dc->stats.underflows_h += tegra_dc_underflow_count(dc,
1783 DC_WINBUF_HD_UFLOW_STATUS);
1784 if (dc->underflow_mask & WIN_D_UF_INT)
1785 dc->stats.underflows_d += tegra_dc_underflow_count(dc,
1786 DC_WINBUF_DD_UFLOW_STATUS);
1787 if (dc->underflow_mask & WIN_T_UF_INT)
1788 dc->stats.underflows_t += tegra_dc_underflow_count(dc,
1789 DC_WINBUF_TD_UFLOW_STATUS);
1792 /* Check for any underflow reset conditions */
1793 for_each_set_bit(i, &dc->valid_windows, DC_N_WINDOWS) {
1794 if (WARN_ONCE(i >= ARRAY_SIZE(masks),
1795 "underflow stats unsupported"))
1796 break; /* bail if the table above is missing entries */
1798 continue; /* skip empty entries */
1800 if (dc->underflow_mask & masks[i]) {
1801 dc->windows[i].underflows++;
1803 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
1804 if (i < 3 && dc->windows[i].underflows > 4) {
1805 schedule_work(&dc->reset_work);
1807 dc->windows[i].underflows = 0;
1808 trace_display_reset(dc);
1811 #ifdef CONFIG_ARCH_TEGRA_3x_SOC
1812 if (i < 3 && dc->windows[i].underflows > 4) {
1813 trace_display_reset(dc);
1814 tegra_dc_writel(dc, UF_LINE_FLUSH,
1815 DC_DISP_DISP_MISC_CONTROL);
1816 tegra_dc_writel(dc, GENERAL_UPDATE,
1817 DC_CMD_STATE_CONTROL);
1818 tegra_dc_writel(dc, GENERAL_ACT_REQ,
1819 DC_CMD_STATE_CONTROL);
1821 tegra_dc_writel(dc, 0,
1822 DC_DISP_DISP_MISC_CONTROL);
1823 tegra_dc_writel(dc, GENERAL_UPDATE,
1824 DC_CMD_STATE_CONTROL);
1825 tegra_dc_writel(dc, GENERAL_ACT_REQ,
1826 DC_CMD_STATE_CONTROL);
1830 dc->windows[i].underflows = 0;
1834 /* Clear the underflow mask now that we've checked it. */
1835 tegra_dc_writel(dc, dc->underflow_mask, DC_CMD_INT_STATUS);
1836 dc->underflow_mask = 0;
1837 tegra_dc_unmask_interrupt(dc, ALL_UF_INT());
1838 trace_underflow(dc);
1841 #if !defined(CONFIG_ARCH_TEGRA_2x_SOC) && !defined(CONFIG_ARCH_TEGRA_3x_SOC)
1842 static void tegra_dc_vpulse2(struct work_struct *work)
1844 struct tegra_dc *dc = container_of(work, struct tegra_dc, vpulse2_work);
1845 bool nvsd_updated = false;
1847 mutex_lock(&dc->lock);
1850 mutex_unlock(&dc->lock);
1856 /* Clear the V_PULSE2_FLIP if no update */
1857 if (!tegra_dc_windows_are_dirty(dc))
1858 clear_bit(V_PULSE2_FLIP, &dc->vpulse2_ref_count);
1860 /* Update the SD brightness */
1861 if (dc->out->sd_settings && dc->out->sd_settings->use_vpulse2) {
1862 nvsd_updated = nvsd_update_brightness(dc);
1864 set_bit(V_PULSE2_NVSD, &dc->vpulse2_ref_count);
1865 tegra_dc_unmask_interrupt(dc, V_PULSE2_INT);
1867 clear_bit(V_PULSE2_NVSD, &dc->vpulse2_ref_count);
1871 /* Mask vpulse2 interrupt if ref-count is zero. */
1872 if (!dc->vpulse2_ref_count)
1873 tegra_dc_mask_interrupt(dc, V_PULSE2_INT);
1876 mutex_unlock(&dc->lock);
1878 /* Do the actual brightness update outside of the mutex dc->lock */
1880 tegra_dc_prism_update_backlight(dc);
1884 static void tegra_dc_process_vblank(struct tegra_dc *dc, ktime_t timestamp)
1886 if (test_bit(V_BLANK_USER, &dc->vblank_ref_count))
1887 tegra_dc_ext_process_vblank(dc->ndev->id, timestamp);
1890 int tegra_dc_config_frame_end_intr(struct tegra_dc *dc, bool enable)
1892 bool locked_by_caller;
1894 /* This function is called in situations where dc->lock
1895 * is either free or already acquired - avoid a deadlock. */
1896 locked_by_caller = mutex_is_locked(&dc->lock);
1897 if (!locked_by_caller)
1898 mutex_lock(&dc->lock);
1900 tegra_dc_io_start(dc);
1902 atomic_inc(&dc->frame_end_ref);
1903 tegra_dc_unmask_interrupt(dc, FRAME_END_INT);
1904 } else if (!atomic_dec_return(&dc->frame_end_ref))
1905 tegra_dc_mask_interrupt(dc, FRAME_END_INT);
1906 tegra_dc_io_end(dc);
1908 if (!locked_by_caller)
1909 mutex_unlock(&dc->lock);
1914 static void tegra_dc_one_shot_irq(struct tegra_dc *dc, unsigned long status,
1917 /* pending user vblank, so wakeup */
1918 if (status & (V_BLANK_INT | MSF_INT)) {
1919 if (dc->out->user_needs_vblank > 0)
1920 complete(&dc->out->user_vblank_comp);
1921 tegra_dc_process_vblank(dc, timestamp);
1924 if (status & V_BLANK_INT) {
1925 /* Sync up windows. */
1926 tegra_dc_trigger_windows(dc);
1928 /* Schedule any additional bottom-half vblank actvities. */
1929 queue_work(system_freezable_wq, &dc->vblank_work);
1932 if (status & FRAME_END_INT) {
1933 /* Mark the frame_end as complete. */
1934 dc->crc_pending = false;
1935 if (!completion_done(&dc->frame_end_complete))
1936 complete(&dc->frame_end_complete);
1937 if (!completion_done(&dc->crc_complete))
1938 complete(&dc->crc_complete);
1940 if (dc->out->flags & TEGRA_DC_OUT_ONE_SHOT_MODE && !dc->nvsr)
1944 #if !defined(CONFIG_ARCH_TEGRA_2x_SOC) && !defined(CONFIG_ARCH_TEGRA_3x_SOC)
1945 if (status & V_PULSE2_INT)
1946 queue_work(system_freezable_wq, &dc->vpulse2_work);
1950 static void tegra_dc_continuous_irq(struct tegra_dc *dc, unsigned long status,
1953 /* Schedule any additional bottom-half vblank actvities. */
1954 if (status & V_BLANK_INT)
1955 queue_work(system_freezable_wq, &dc->vblank_work);
1957 if (status & (V_BLANK_INT | MSF_INT))
1958 tegra_dc_process_vblank(dc, timestamp);
1960 if (status & FRAME_END_INT) {
1961 struct timespec tm = CURRENT_TIME;
1962 dc->frame_end_timestamp = timespec_to_ns(&tm);
1963 wake_up(&dc->timestamp_wq);
1965 /* Mark the frame_end as complete. */
1966 if (!completion_done(&dc->frame_end_complete))
1967 complete(&dc->frame_end_complete);
1968 if (!completion_done(&dc->crc_complete))
1969 complete(&dc->crc_complete);
1971 tegra_dc_trigger_windows(dc);
1974 #if !defined(CONFIG_ARCH_TEGRA_2x_SOC) && !defined(CONFIG_ARCH_TEGRA_3x_SOC)
1975 if (status & V_PULSE2_INT)
1976 queue_work(system_freezable_wq, &dc->vpulse2_work);
1980 /* XXX: Not sure if we limit look ahead to 1 frame */
1981 bool tegra_dc_is_within_n_vsync(struct tegra_dc *dc, s64 ts)
1983 BUG_ON(!dc->frametime_ns);
1984 return ((ts - dc->frame_end_timestamp) < dc->frametime_ns);
1987 bool tegra_dc_does_vsync_separate(struct tegra_dc *dc, s64 new_ts, s64 old_ts)
1989 BUG_ON(!dc->frametime_ns);
1990 return (((new_ts - old_ts) > dc->frametime_ns)
1991 || (div_s64((new_ts - dc->frame_end_timestamp), dc->frametime_ns)
1992 != div_s64((old_ts - dc->frame_end_timestamp),
1993 dc->frametime_ns)));
1996 static irqreturn_t tegra_dc_irq(int irq, void *ptr)
1998 ktime_t timestamp = ktime_get();
1999 struct tegra_dc *dc = ptr;
2000 unsigned long status;
2001 unsigned long underflow_mask;
2003 int need_disable = 0;
2005 if (tegra_platform_is_fpga())
2008 mutex_lock(&dc->lock);
2009 if (!tegra_dc_is_powered(dc)) {
2010 mutex_unlock(&dc->lock);
2016 if (!dc->enabled || !nvhost_module_powered_ext(dc->ndev)) {
2017 dev_dbg(&dc->ndev->dev, "IRQ when DC not powered!\n");
2018 status = tegra_dc_readl(dc, DC_CMD_INT_STATUS);
2019 tegra_dc_writel(dc, status, DC_CMD_INT_STATUS);
2021 mutex_unlock(&dc->lock);
2025 /* clear all status flags except underflow, save those for the worker */
2026 status = tegra_dc_readl(dc, DC_CMD_INT_STATUS);
2027 tegra_dc_writel(dc, status & ~ALL_UF_INT(), DC_CMD_INT_STATUS);
2028 val = tegra_dc_readl(dc, DC_CMD_INT_MASK);
2029 tegra_dc_writel(dc, val & ~ALL_UF_INT(), DC_CMD_INT_MASK);
2032 * Overlays can get thier internal state corrupted during and underflow
2033 * condition. The only way to fix this state is to reset the DC.
2034 * if we get 4 consecutive frames with underflows, assume we're
2037 underflow_mask = status & ALL_UF_INT();
2039 /* Check underflow */
2040 if (underflow_mask) {
2041 dc->underflow_mask |= underflow_mask;
2042 schedule_delayed_work(&dc->underflow_work,
2043 msecs_to_jiffies(1));
2046 if (dc->out->flags & TEGRA_DC_OUT_ONE_SHOT_MODE)
2047 tegra_dc_one_shot_irq(dc, status, timestamp);
2049 tegra_dc_continuous_irq(dc, status, timestamp);
2052 tegra_dc_nvsr_irq(dc->nvsr, status);
2054 /* update video mode if it has changed since the last frame */
2055 if (status & (FRAME_END_INT | V_BLANK_INT))
2056 if (tegra_dc_update_mode(dc))
2057 need_disable = 1; /* force display off on error */
2060 mutex_unlock(&dc->lock);
2063 tegra_dc_disable(dc);
2067 void tegra_dc_set_color_control(struct tegra_dc *dc)
2071 switch (dc->out->depth) {
2073 color_control = BASE_COLOR_SIZE111;
2077 color_control = BASE_COLOR_SIZE222;
2081 color_control = BASE_COLOR_SIZE332;
2085 color_control = BASE_COLOR_SIZE333;
2089 color_control = BASE_COLOR_SIZE444;
2093 color_control = BASE_COLOR_SIZE555;
2097 color_control = BASE_COLOR_SIZE565;
2101 color_control = BASE_COLOR_SIZE666;
2105 color_control = BASE_COLOR_SIZE888;
2109 switch (dc->out->dither) {
2110 case TEGRA_DC_UNDEFINED_DITHER:
2111 case TEGRA_DC_DISABLE_DITHER:
2112 color_control |= DITHER_CONTROL_DISABLE;
2114 case TEGRA_DC_ORDERED_DITHER:
2115 color_control |= DITHER_CONTROL_ORDERED;
2117 #ifdef CONFIG_TEGRA_DC_TEMPORAL_DITHER
2118 case TEGRA_DC_TEMPORAL_DITHER:
2119 color_control |= DITHER_CONTROL_TEMPORAL;
2122 case TEGRA_DC_ERRDIFF_DITHER:
2123 /* The line buffer for error-diffusion dither is limited
2124 * to 1280 pixels per line. This limits the maximum
2125 * horizontal active area size to 1280 pixels when error
2126 * diffusion is enabled.
2128 BUG_ON(dc->mode.h_active > 1280);
2129 color_control |= DITHER_CONTROL_ERRDIFF;
2133 dev_err(&dc->ndev->dev, "Error: Unsupported dithering mode\n");
2136 #ifdef CONFIG_TEGRA_DC_CMU
2137 if (dc->cmu_enabled)
2138 color_control |= CMU_ENABLE;
2141 tegra_dc_writel(dc, color_control, DC_DISP_DISP_COLOR_CONTROL);
2144 static u32 get_syncpt(struct tegra_dc *dc, int idx)
2146 if (idx >= 0 && idx < ARRAY_SIZE(dc->win_syncpt))
2147 return dc->win_syncpt[idx];
2151 static void tegra_dc_init_vpulse2_int(struct tegra_dc *dc)
2153 #if !defined(CONFIG_ARCH_TEGRA_2x_SOC) && !defined(CONFIG_ARCH_TEGRA_3x_SOC)
2157 val = V_PULSE2_H_POSITION(0) | V_PULSE2_LAST(0x1);
2158 tegra_dc_writel(dc, val, DC_DISP_V_PULSE2_CONTROL);
2160 start = dc->mode.v_ref_to_sync + dc->mode.v_sync_width +
2161 dc->mode.v_back_porch + dc->mode.v_active;
2163 val = V_PULSE2_START_A(start) + V_PULSE2_END_A(end);
2164 tegra_dc_writel(dc, val, DC_DISP_V_PULSE2_POSITION_A);
2166 val = tegra_dc_readl(dc, DC_CMD_INT_ENABLE);
2167 val |= V_PULSE2_INT;
2168 tegra_dc_writel(dc, val , DC_CMD_INT_ENABLE);
2170 tegra_dc_mask_interrupt(dc, V_PULSE2_INT);
2171 tegra_dc_writel(dc, V_PULSE_2_ENABLE, DC_DISP_DISP_SIGNAL_OPTIONS0);
2175 static int tegra_dc_init(struct tegra_dc *dc)
2181 tegra_dc_io_start(dc);
2182 tegra_dc_writel(dc, 0x00000100, DC_CMD_GENERAL_INCR_SYNCPT_CNTRL);
2183 if (dc->ndev->id == 0) {
2184 tegra_mc_set_priority(TEGRA_MC_CLIENT_DISPLAY0A,
2186 tegra_mc_set_priority(TEGRA_MC_CLIENT_DISPLAY0B,
2188 tegra_mc_set_priority(TEGRA_MC_CLIENT_DISPLAY0C,
2190 #if defined(CONFIG_ARCH_TEGRA_2x_SOC) || defined(CONFIG_ARCH_TEGRA_3x_SOC)
2191 /* only present on Tegra2 and 3 */
2192 tegra_mc_set_priority(TEGRA_MC_CLIENT_DISPLAY1B,
2195 tegra_mc_set_priority(TEGRA_MC_CLIENT_DISPLAYHC,
2196 TEGRA_MC_PRIO_HIGH);
2197 } else if (dc->ndev->id == 1) {
2198 tegra_mc_set_priority(TEGRA_MC_CLIENT_DISPLAY0AB,
2200 tegra_mc_set_priority(TEGRA_MC_CLIENT_DISPLAY0BB,
2202 tegra_mc_set_priority(TEGRA_MC_CLIENT_DISPLAY0CB,
2204 #if defined(CONFIG_ARCH_TEGRA_2x_SOC) || defined(CONFIG_ARCH_TEGRA_3x_SOC)
2205 /* only present on Tegra2 and 3 */
2206 tegra_mc_set_priority(TEGRA_MC_CLIENT_DISPLAY1BB,
2209 tegra_mc_set_priority(TEGRA_MC_CLIENT_DISPLAYHCB,
2210 TEGRA_MC_PRIO_HIGH);
2212 tegra_dc_writel(dc, 0x00000100 | dc->vblank_syncpt,
2213 DC_CMD_CONT_SYNCPT_VSYNC);
2215 tegra_dc_writel(dc, 0x00004700, DC_CMD_INT_TYPE);
2216 #if defined(CONFIG_ARCH_TEGRA_14x_SOC) || defined(CONFIG_ARCH_TEGRA_12x_SOC)
2217 tegra_dc_writel(dc, WIN_A_OF_INT | WIN_B_OF_INT | WIN_C_OF_INT |
2218 WIN_T_UF_INT | WIN_D_UF_INT | HC_UF_INT |
2219 WIN_A_UF_INT | WIN_B_UF_INT | WIN_C_UF_INT,
2220 DC_CMD_INT_POLARITY);
2222 tegra_dc_writel(dc, WIN_A_OF_INT | WIN_B_OF_INT | WIN_C_OF_INT |
2223 WIN_A_UF_INT | WIN_B_UF_INT | WIN_C_UF_INT,
2224 DC_CMD_INT_POLARITY);
2226 tegra_dc_writel(dc, 0x00202020, DC_DISP_MEM_HIGH_PRIORITY);
2227 tegra_dc_writel(dc, 0x00010101, DC_DISP_MEM_HIGH_PRIORITY_TIMER);
2228 #ifdef CONFIG_ARCH_TEGRA_3x_SOC
2229 tegra_dc_writel(dc, 0x00000000, DC_DISP_DISP_MISC_CONTROL);
2231 /* enable interrupts for vblank, frame_end and underflows */
2232 int_enable = (FRAME_END_INT | V_BLANK_INT | ALL_UF_INT());
2233 /* for panels with one-shot mode enable tearing effect interrupt */
2234 if (dc->out->flags & TEGRA_DC_OUT_ONE_SHOT_MODE)
2235 int_enable |= MSF_INT;
2237 tegra_dc_writel(dc, int_enable, DC_CMD_INT_ENABLE);
2238 tegra_dc_writel(dc, ALL_UF_INT(), DC_CMD_INT_MASK);
2239 tegra_dc_init_vpulse2_int(dc);
2241 #if !defined(CONFIG_TEGRA_DC_BLENDER_GEN2)
2242 tegra_dc_writel(dc, 0x00000000, DC_DISP_BORDER_COLOR);
2244 tegra_dc_writel(dc, 0x00000000, DC_DISP_BLEND_BACKGROUND_COLOR);
2247 #ifdef CONFIG_TEGRA_DC_CMU
2248 _tegra_dc_update_cmu(dc, tegra_dc_get_cmu(dc));
2250 tegra_dc_set_color_control(dc);
2251 for_each_set_bit(i, &dc->valid_windows, DC_N_WINDOWS) {
2252 struct tegra_dc_win *win = &dc->windows[i];
2253 tegra_dc_writel(dc, WINDOW_A_SELECT << i,
2254 DC_CMD_DISPLAY_WINDOW_HEADER);
2255 tegra_dc_set_csc(dc, &win->csc);
2256 tegra_dc_set_lut(dc, win);
2257 tegra_dc_set_scaling_filter(dc);
2260 #ifdef CONFIG_TEGRA_DC_WIN_H
2261 /* Window H is set to window mode by default for t14x. */
2262 tegra_dc_writel(dc, WINH_CURS_SELECT(1),
2263 DC_DISP_BLEND_CURSOR_CONTROL);
2266 for_each_set_bit(i, &dc->valid_windows, DC_N_WINDOWS) {
2267 u32 syncpt = get_syncpt(dc, i);
2269 /* refuse to operate on invalid syncpts */
2270 if (WARN_ON(syncpt == NVSYNCPT_INVALID))
2273 dc->syncpt[i].id = syncpt;
2275 if (!nvhost_syncpt_read_ext_check(dc->ndev, syncpt, &val))
2276 dc->syncpt[i].min = dc->syncpt[i].max = val;
2279 dc->crc_pending = false;
2281 trace_display_mode(dc, &dc->mode);
2283 if (dc->mode.pclk) {
2284 if (!dc->initialized) {
2285 if (tegra_dc_program_mode(dc, &dc->mode)) {
2286 tegra_dc_io_end(dc);
2290 dev_info(&dc->ndev->dev, "DC initialized, "
2291 "skipping tegra_dc_program_mode.\n");
2295 /* Initialize SD AFTER the modeset.
2296 nvsd_init handles the sd_settings = NULL case. */
2297 nvsd_init(dc, dc->out->sd_settings);
2299 tegra_dc_io_end(dc);
2304 static bool _tegra_dc_controller_enable(struct tegra_dc *dc)
2306 int failed_init = 0;
2309 if (WARN_ON(!dc || !dc->out || !dc->out_ops))
2312 tegra_dc_unpowergate_locked(dc);
2314 if (dc->out->enable)
2315 dc->out->enable(&dc->ndev->dev);
2317 tegra_dc_setup_clk(dc, dc->clk);
2319 /* dc clk always on for continuous mode */
2320 if (!(dc->out->flags & TEGRA_DC_OUT_ONE_SHOT_MODE))
2321 tegra_dc_clk_enable(dc);
2323 tegra_dvfs_set_rate(dc->clk, dc->mode.pclk);
2327 tegra_dc_power_on(dc);
2329 /* do not accept interrupts during initialization */
2330 tegra_dc_writel(dc, 0, DC_CMD_INT_MASK);
2334 failed_init = tegra_dc_init(dc);
2336 tegra_dc_writel(dc, 0, DC_CMD_INT_MASK);
2337 disable_irq_nosync(dc->irq);
2338 tegra_dc_clear_bandwidth(dc);
2339 if (dc->out && dc->out->disable)
2342 if (!(dc->out->flags & TEGRA_DC_OUT_ONE_SHOT_MODE))
2343 tegra_dc_clk_disable(dc);
2345 tegra_dvfs_set_rate(dc->clk, 0);
2349 tegra_dpaux_pad_power(dc, false);
2351 if (dc->out_ops && dc->out_ops->enable)
2352 dc->out_ops->enable(dc);
2354 /* force a full blending update */
2355 for (i = 0; i < DC_N_WINDOWS; i++)
2356 dc->blend.z[i] = -1;
2358 tegra_dc_ext_enable(dc->ext);
2360 /* initialize cursor to defaults, as driver depends on HW state */
2361 tegra_dc_writel(dc, 0, DC_DISP_CURSOR_START_ADDR);
2362 tegra_dc_writel(dc, 0, DC_DISP_CURSOR_START_ADDR_NS);
2363 #if defined(CONFIG_ARCH_TEGRA_12x_SOC)
2364 tegra_dc_writel(dc, 0, DC_DISP_CURSOR_START_ADDR_HI);
2365 tegra_dc_writel(dc, 0, DC_DISP_CURSOR_START_ADDR_HI_NS);
2367 tegra_dc_writel(dc, 0, DC_DISP_CURSOR_POSITION);
2368 tegra_dc_writel(dc, 0, DC_DISP_CURSOR_POSITION_NS);
2369 tegra_dc_writel(dc, 0xffffff, DC_DISP_CURSOR_FOREGROUND); /* white */
2370 tegra_dc_writel(dc, 0x000000, DC_DISP_CURSOR_BACKGROUND); /* black */
2371 tegra_dc_writel(dc, 0, DC_DISP_BLEND_CURSOR_CONTROL);
2373 trace_display_enable(dc);
2375 tegra_dc_writel(dc, GENERAL_UPDATE, DC_CMD_STATE_CONTROL);
2376 tegra_dc_writel(dc, GENERAL_ACT_REQ, DC_CMD_STATE_CONTROL);
2378 if (dc->out->postpoweron)
2379 dc->out->postpoweron(&dc->ndev->dev);
2381 if (dc->out_ops && dc->out_ops->postpoweron)
2382 dc->out_ops->postpoweron(dc);
2384 tegra_log_resume_time();
2386 * We will need to reinitialize the display the next time panel
2389 dc->out->flags &= ~TEGRA_DC_OUT_INITIALIZED_MODE;
2396 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
2397 static bool _tegra_dc_controller_reset_enable(struct tegra_dc *dc)
2401 if (WARN_ON(!dc || !dc->out || !dc->out_ops))
2404 if (dc->out->enable)
2405 dc->out->enable(&dc->ndev->dev);
2407 tegra_dc_setup_clk(dc, dc->clk);
2408 tegra_dc_clk_enable(dc);
2410 if (dc->ndev->id == 0 && tegra_dcs[1] != NULL) {
2411 mutex_lock(&tegra_dcs[1]->lock);
2412 disable_irq_nosync(tegra_dcs[1]->irq);
2413 } else if (dc->ndev->id == 1 && tegra_dcs[0] != NULL) {
2414 mutex_lock(&tegra_dcs[0]->lock);
2415 disable_irq_nosync(tegra_dcs[0]->irq);
2419 tegra_periph_reset_assert(dc->clk);
2421 if (tegra_platform_is_silicon()) {
2422 tegra_periph_reset_deassert(dc->clk);
2426 if (dc->ndev->id == 0 && tegra_dcs[1] != NULL) {
2427 enable_dc_irq(tegra_dcs[1]);
2428 mutex_unlock(&tegra_dcs[1]->lock);
2429 } else if (dc->ndev->id == 1 && tegra_dcs[0] != NULL) {
2430 enable_dc_irq(tegra_dcs[0]);
2431 mutex_unlock(&tegra_dcs[0]->lock);
2436 if (tegra_dc_init(dc)) {
2437 dev_err(&dc->ndev->dev, "cannot initialize\n");
2441 if (dc->out_ops && dc->out_ops->enable)
2442 dc->out_ops->enable(dc);
2444 if (dc->out->postpoweron)
2445 dc->out->postpoweron(&dc->ndev->dev);
2447 /* force a full blending update */
2448 dc->blend.z[0] = -1;
2450 tegra_dc_ext_enable(dc->ext);
2453 dev_err(&dc->ndev->dev, "initialization failed,disabling");
2454 _tegra_dc_controller_disable(dc);
2457 trace_display_reset(dc);
2462 static int _tegra_dc_set_default_videomode(struct tegra_dc *dc)
2464 if (dc->mode.pclk == 0) {
2465 switch (dc->out->type) {
2466 case TEGRA_DC_OUT_HDMI:
2467 /* If DC is enable called, and HDMI is connected,
2468 * but DC is not initialized by bootloader and no
2469 * mode is set up, then set a fallback mode.
2471 if (tegra_dc_hpd(dc) && (!dc->initialized)) {
2472 return tegra_dc_set_fb_mode(dc, &tegra_dc_vga_mode, 0);
2478 case TEGRA_DC_OUT_DP:
2479 return tegra_dc_set_fb_mode(dc, &tegra_dc_vga_mode, 0);
2481 /* Do nothing for other outputs for now */
2482 case TEGRA_DC_OUT_RGB:
2484 case TEGRA_DC_OUT_DSI:
2494 int tegra_dc_set_default_videomode(struct tegra_dc *dc)
2496 return _tegra_dc_set_default_videomode(dc);
2499 static bool _tegra_dc_enable(struct tegra_dc *dc)
2501 if (dc->mode.pclk == 0)
2510 pm_runtime_get_sync(&dc->ndev->dev);
2512 if (dc->out->type == TEGRA_DC_OUT_HDMI && !tegra_dc_hpd(dc))
2515 if (!_tegra_dc_controller_enable(dc)) {
2516 pm_runtime_put_sync(&dc->ndev->dev);
2523 void tegra_dc_enable(struct tegra_dc *dc)
2525 if (WARN_ON(!dc || !dc->out || !dc->out_ops))
2528 mutex_lock(&dc->lock);
2531 dc->enabled = _tegra_dc_enable(dc);
2533 mutex_unlock(&dc->lock);
2534 trace_display_mode(dc, &dc->mode);
2537 void tegra_dc_disable_window(struct tegra_dc *dc, unsigned win)
2539 struct tegra_dc_win *w = &dc->windows[win];
2541 /* reset window bandwidth */
2543 w->new_bandwidth = 0;
2545 /* disable windows */
2546 w->flags &= ~TEGRA_WIN_FLAG_ENABLED;
2548 /* refuse to operate on invalid syncpts */
2549 if (WARN_ON(dc->syncpt[win].id == NVSYNCPT_INVALID))
2552 /* flush any pending syncpt waits */
2553 dc->syncpt[win].max += 1;
2554 while (dc->syncpt[win].min < dc->syncpt[win].max) {
2555 trace_display_syncpt_flush(dc, dc->syncpt[win].id,
2556 dc->syncpt[win].min, dc->syncpt[win].max);
2557 dc->syncpt[win].min++;
2558 nvhost_syncpt_cpu_incr_ext(dc->ndev, dc->syncpt[win].id);
2562 static void _tegra_dc_controller_disable(struct tegra_dc *dc)
2568 if (atomic_read(&dc->holding)) {
2569 /* Force release all refs but the last one */
2570 atomic_set(&dc->holding, 1);
2571 tegra_dc_release_dc_out(dc);
2574 if (dc->out && dc->out->prepoweroff)
2575 dc->out->prepoweroff();
2577 if (dc->out_ops && dc->out_ops->disable)
2578 dc->out_ops->disable(dc);
2580 if (tegra_powergate_is_powered(dc->powergate_id))
2581 tegra_dc_writel(dc, 0, DC_CMD_INT_MASK);
2583 disable_irq_nosync(dc->irq);
2585 tegra_dc_clear_bandwidth(dc);
2587 if (dc->out && dc->out->disable)
2590 for_each_set_bit(i, &dc->valid_windows, DC_N_WINDOWS) {
2591 tegra_dc_disable_window(dc, i);
2593 trace_display_disable(dc);
2595 if (dc->out_ops && dc->out_ops->postpoweroff)
2596 dc->out_ops->postpoweroff(dc);
2600 /* disable always on dc clk in continuous mode */
2601 if (!(dc->out->flags & TEGRA_DC_OUT_ONE_SHOT_MODE))
2602 tegra_dc_clk_disable(dc);
2604 tegra_dvfs_set_rate(dc->clk, 0);
2607 void tegra_dc_stats_enable(struct tegra_dc *dc, bool enable)
2609 #if 0 /* underflow interrupt is already enabled by dc reset worker */
2612 val = tegra_dc_readl(dc, DC_CMD_INT_ENABLE);
2614 val |= (WIN_A_UF_INT | WIN_B_UF_INT | WIN_C_UF_INT);
2616 val &= ~(WIN_A_UF_INT | WIN_B_UF_INT | WIN_C_UF_INT);
2617 tegra_dc_writel(dc, val, DC_CMD_INT_ENABLE);
2622 bool tegra_dc_stats_get(struct tegra_dc *dc)
2624 #if 0 /* right now it is always enabled */
2629 val = tegra_dc_readl(dc, DC_CMD_INT_ENABLE);
2630 res = !!(val & (WIN_A_UF_INT | WIN_B_UF_INT | WIN_C_UF_INT));
2640 /* blank selected windows by disabling them */
2641 void tegra_dc_blank(struct tegra_dc *dc, unsigned windows)
2643 struct tegra_dc_win *dcwins[DC_N_WINDOWS];
2645 unsigned long int blank_windows;
2648 blank_windows = windows & dc->valid_windows;
2653 for_each_set_bit(i, &blank_windows, DC_N_WINDOWS) {
2654 dcwins[nr_win] = tegra_dc_get_window(dc, i);
2655 if (!dcwins[nr_win])
2657 dcwins[nr_win++]->flags &= ~TEGRA_WIN_FLAG_ENABLED;
2660 tegra_dc_update_windows(dcwins, nr_win);
2661 tegra_dc_sync_windows(dcwins, nr_win);
2662 tegra_dc_program_bandwidth(dc, true);
2665 int tegra_dc_restore(struct tegra_dc *dc)
2667 return tegra_dc_ext_restore(dc->ext);
2670 static void _tegra_dc_disable(struct tegra_dc *dc)
2672 #ifdef CONFIG_TEGRA_DC_CMU
2673 /* power down resets the registers, setting to true
2674 * causes CMU to be restored in tegra_dc_init(). */
2675 dc->cmu_dirty = true;
2678 if (dc->out->flags & TEGRA_DC_OUT_ONE_SHOT_MODE) {
2679 mutex_lock(&dc->one_shot_lock);
2680 cancel_delayed_work_sync(&dc->one_shot_work);
2683 tegra_dc_io_start(dc);
2684 _tegra_dc_controller_disable(dc);
2685 tegra_dc_io_end(dc);
2687 tegra_dc_powergate_locked(dc);
2689 if (dc->out->flags & TEGRA_DC_OUT_ONE_SHOT_MODE)
2690 mutex_unlock(&dc->one_shot_lock);
2691 pm_runtime_put(&dc->ndev->dev);
2693 tegra_log_suspend_time();
2696 void tegra_dc_disable(struct tegra_dc *dc)
2698 if (WARN_ON(!dc || !dc->out || !dc->out_ops))
2701 if (!tegra_dc_ext_disable(dc->ext))
2702 tegra_dc_blank(dc, BLANK_ALL);
2704 /* it's important that new underflow work isn't scheduled before the
2705 * lock is acquired. */
2706 cancel_delayed_work_sync(&dc->underflow_work);
2708 mutex_lock(&dc->lp_lock);
2709 mutex_lock(&dc->lock);
2712 dc->enabled = false;
2713 dc->blanked = false;
2716 _tegra_dc_disable(dc);
2719 #ifdef CONFIG_SWITCH
2720 switch_set_state(&dc->modeset_switch, 0);
2722 mutex_unlock(&dc->lock);
2723 mutex_unlock(&dc->lp_lock);
2724 synchronize_irq(dc->irq);
2725 trace_display_mode(dc, &dc->mode);
2727 /* disable pending clks due to uncompleted frames */
2728 while (tegra_is_clk_enabled(dc->clk))
2732 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
2733 static void tegra_dc_reset_worker(struct work_struct *work)
2735 struct tegra_dc *dc =
2736 container_of(work, struct tegra_dc, reset_work);
2738 unsigned long val = 0;
2740 mutex_lock(&shared_lock);
2742 dev_warn(&dc->ndev->dev,
2743 "overlay stuck in underflow state. resetting.\n");
2745 tegra_dc_ext_disable(dc->ext);
2747 mutex_lock(&dc->lock);
2749 if (dc->enabled == false)
2752 dc->enabled = false;
2757 val = tegra_dc_readl(dc, DC_CMD_CONT_SYNCPT_VSYNC);
2758 val &= ~(0x00000100);
2759 tegra_dc_writel(dc, val, DC_CMD_CONT_SYNCPT_VSYNC);
2762 * set DC to STOP mode
2764 tegra_dc_writel(dc, DISP_CTRL_MODE_STOP, DC_CMD_DISPLAY_COMMAND);
2768 _tegra_dc_controller_disable(dc);
2770 /* _tegra_dc_controller_reset_enable deasserts reset */
2771 _tegra_dc_controller_reset_enable(dc);
2775 /* reopen host read bus */
2776 val = tegra_dc_readl(dc, DC_CMD_CONT_SYNCPT_VSYNC);
2777 val &= ~(0x00000100);
2779 tegra_dc_writel(dc, val, DC_CMD_CONT_SYNCPT_VSYNC);
2782 mutex_unlock(&dc->lock);
2783 mutex_unlock(&shared_lock);
2784 trace_display_reset(dc);
2788 static void tegra_dc_underflow_worker(struct work_struct *work)
2790 struct tegra_dc *dc = container_of(
2791 to_delayed_work(work), struct tegra_dc, underflow_work);
2793 mutex_lock(&dc->lock);
2797 tegra_dc_underflow_handler(dc);
2800 mutex_unlock(&dc->lock);
2803 #ifdef CONFIG_SWITCH
2804 static ssize_t switch_modeset_print_mode(struct switch_dev *sdev, char *buf)
2806 struct tegra_dc *dc =
2807 container_of(sdev, struct tegra_dc, modeset_switch);
2810 return sprintf(buf, "offline\n");
2812 return sprintf(buf, "%dx%d\n", dc->mode.h_active, dc->mode.v_active);
2816 static int tegra_dc_probe(struct platform_device *ndev)
2818 struct tegra_dc *dc;
2819 struct tegra_dc_mode *mode;
2820 struct tegra_dc_platform_data *dt_pdata = NULL;
2822 #ifndef CONFIG_TEGRA_ISOMGR
2823 struct clk *emc_clk;
2825 int isomgr_client_id = -1;
2827 struct device_node *np = ndev->dev.of_node;
2828 struct resource *res;
2829 struct resource dt_res;
2830 struct resource *base_res;
2831 struct resource *fb_mem = NULL;
2837 if (!np && !ndev->dev.platform_data) {
2838 dev_err(&ndev->dev, "no platform data\n");
2842 /* Specify parameters for the maximum physical segment size. */
2843 ndev->dev.dma_parms = &tegra_dc_dma_parameters;
2845 dc = kzalloc(sizeof(struct tegra_dc), GFP_KERNEL);
2847 dev_err(&ndev->dev, "can't allocate memory for tegra_dc\n");
2852 dt_pdata = of_dc_parse_platform_data(ndev);
2853 if (dt_pdata == NULL)
2857 irq = of_irq_to_resource(np, 0, NULL);
2862 ret = of_address_to_resource(np, 0, &dt_res);
2866 if (dt_res.start == TEGRA_DISPLAY_BASE)
2868 else if (dt_res.start == TEGRA_DISPLAY2_BASE)
2875 irq = platform_get_irq_byname(ndev, "irq");
2877 dev_err(&ndev->dev, "no irq\n");
2882 res = platform_get_resource_byname(ndev,
2883 IORESOURCE_MEM, "regs");
2885 dev_err(&ndev->dev, "no mem resource\n");
2891 base_res = request_mem_region(res->start, resource_size(res),
2894 dev_err(&ndev->dev, "request_mem_region failed\n");
2899 base = ioremap(res->start, resource_size(res));
2901 dev_err(&ndev->dev, "registers can't be mapped\n");
2903 goto err_release_resource_reg;
2906 for (i = 0; i < DC_N_WINDOWS; i++)
2907 dc->win_syncpt[i] = NVSYNCPT_INVALID;
2909 if (TEGRA_DISPLAY_BASE == res->start) {
2910 dc->vblank_syncpt = NVSYNCPT_VBLANK0;
2911 dc->win_syncpt[0] = NVSYNCPT_DISP0_A;
2912 dc->win_syncpt[1] = NVSYNCPT_DISP0_B;
2913 dc->win_syncpt[2] = NVSYNCPT_DISP0_C;
2914 dc->valid_windows = 0x07;
2915 #ifdef CONFIG_ARCH_TEGRA_14x_SOC
2916 dc->win_syncpt[3] = NVSYNCPT_DISP0_D;
2917 dc->win_syncpt[4] = NVSYNCPT_DISP0_H;
2918 dc->valid_windows |= 0x18;
2919 #elif defined(CONFIG_ARCH_TEGRA_12x_SOC)
2920 dc->win_syncpt[3] = NVSYNCPT_DISP0_D;
2921 dc->valid_windows |= 0x08;
2923 dc->powergate_id = TEGRA_POWERGATE_DISA;
2924 #ifdef CONFIG_TEGRA_ISOMGR
2925 isomgr_client_id = TEGRA_ISO_CLIENT_DISP_0;
2927 } else if (TEGRA_DISPLAY2_BASE == res->start) {
2928 dc->vblank_syncpt = NVSYNCPT_VBLANK1;
2929 dc->win_syncpt[0] = NVSYNCPT_DISP1_A;
2930 dc->win_syncpt[1] = NVSYNCPT_DISP1_B;
2931 dc->win_syncpt[2] = NVSYNCPT_DISP1_C;
2932 dc->valid_windows = 0x07;
2933 #ifdef CONFIG_ARCH_TEGRA_14x_SOC
2934 dc->win_syncpt[4] = NVSYNCPT_DISP1_H;
2935 dc->valid_windows |= 0x10;
2937 dc->powergate_id = TEGRA_POWERGATE_DISB;
2938 #ifdef CONFIG_TEGRA_ISOMGR
2939 isomgr_client_id = TEGRA_ISO_CLIENT_DISP_1;
2943 "Unknown base address %llx: unable to assign syncpt\n",
2948 struct resource of_fb_res;
2950 tegra_get_fb_resource(&of_fb_res);
2951 else /*ndev->id == 1*/
2952 tegra_get_fb2_resource(&of_fb_res);
2954 fb_mem = kzalloc(sizeof(struct resource), GFP_KERNEL);
2955 if (fb_mem == NULL) {
2957 goto err_iounmap_reg;
2959 fb_mem->name = "fbmem";
2960 fb_mem->flags = IORESOURCE_MEM;
2961 fb_mem->start = (resource_size_t)of_fb_res.start;
2962 fb_mem->end = (resource_size_t)of_fb_res.end;
2964 fb_mem = platform_get_resource_byname(ndev,
2965 IORESOURCE_MEM, "fbmem");
2968 clk = clk_get(&ndev->dev, NULL);
2969 if (IS_ERR_OR_NULL(clk)) {
2970 dev_err(&ndev->dev, "can't get clock\n");
2972 goto err_iounmap_reg;
2976 dc->shift_clk_div.mul = dc->shift_clk_div.div = 1;
2977 /* Initialize one shot work delay, it will be assigned by dsi
2978 * according to refresh rate later. */
2979 dc->one_shot_delay_ms = 40;
2981 dc->base_res = base_res;
2987 dc->pdata = ndev->dev.platform_data;
2989 dc->pdata = dt_pdata;
2993 mutex_init(&dc->lock);
2994 mutex_init(&dc->one_shot_lock);
2995 mutex_init(&dc->lp_lock);
2996 init_completion(&dc->frame_end_complete);
2997 init_completion(&dc->crc_complete);
2998 init_waitqueue_head(&dc->wq);
2999 init_waitqueue_head(&dc->timestamp_wq);
3000 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
3001 INIT_WORK(&dc->reset_work, tegra_dc_reset_worker);
3003 INIT_WORK(&dc->vblank_work, tegra_dc_vblank);
3004 dc->vblank_ref_count = 0;
3005 #if !defined(CONFIG_ARCH_TEGRA_2x_SOC) && !defined(CONFIG_ARCH_TEGRA_3x_SOC)
3006 INIT_WORK(&dc->vpulse2_work, tegra_dc_vpulse2);
3008 dc->vpulse2_ref_count = 0;
3009 INIT_DELAYED_WORK(&dc->underflow_work, tegra_dc_underflow_worker);
3010 INIT_DELAYED_WORK(&dc->one_shot_work, tegra_dc_one_shot_worker);
3012 tegra_dc_init_lut_defaults(&dc->fb_lut);
3014 dc->n_windows = DC_N_WINDOWS;
3015 for (i = 0; i < DC_N_WINDOWS; i++) {
3016 struct tegra_dc_win *win = &dc->windows[i];
3017 struct tegra_dc_win *tmp_win = &dc->tmp_wins[i];
3018 if (!test_bit(i, &dc->valid_windows))
3019 win->flags |= TEGRA_WIN_FLAG_INVALID;
3024 tegra_dc_init_csc_defaults(&win->csc);
3025 tegra_dc_init_lut_defaults(&win->lut);
3028 ret = tegra_dc_set(dc, ndev->id);
3030 dev_err(&ndev->dev, "can't add dc\n");
3034 platform_set_drvdata(ndev, dc);
3036 #ifdef CONFIG_SWITCH
3037 dc->modeset_switch.name = dev_name(&ndev->dev);
3038 dc->modeset_switch.state = 0;
3039 dc->modeset_switch.print_state = switch_modeset_print_mode;
3040 ret = switch_dev_register(&dc->modeset_switch);
3042 dev_err(&ndev->dev, "failed to register switch driver\n");
3045 tegra_dc_feature_register(dc);
3047 if (dc->pdata->default_out) {
3048 ret = tegra_dc_set_out(dc, dc->pdata->default_out);
3050 dev_err(&dc->ndev->dev, "failed to initialize DC out ops\n");
3055 "No default output specified. Leaving output disabled.\n");
3057 dc->mode_dirty = false; /* ignore changes tegra_dc_set_out has done */
3059 #ifndef CONFIG_TEGRA_ISOMGR
3061 * The emc is a shared clock, it will be set based on
3062 * the requirements for each user on the bus.
3064 emc_clk = clk_get(&ndev->dev, "emc");
3065 if (IS_ERR_OR_NULL(emc_clk)) {
3066 dev_err(&ndev->dev, "can't get emc clock\n");
3070 dc->emc_clk = emc_clk;
3073 dc->ext = tegra_dc_ext_register(ndev, dc);
3074 if (IS_ERR_OR_NULL(dc->ext)) {
3075 dev_warn(&ndev->dev, "Failed to enable Tegra DC extensions.\n");
3079 /* interrupt handler must be registered before tegra_fb_register() */
3080 if (request_threaded_irq(irq, NULL, tegra_dc_irq, IRQF_ONESHOT,
3081 dev_name(&ndev->dev), dc)) {
3082 dev_err(&ndev->dev, "request_irq %d failed\n", irq);
3084 goto err_disable_dc;
3088 tegra_pd_add_device(&ndev->dev);
3089 pm_runtime_use_autosuspend(&ndev->dev);
3090 pm_runtime_set_autosuspend_delay(&ndev->dev, 100);
3091 pm_runtime_enable(&ndev->dev);
3093 #ifdef CONFIG_TEGRA_DC_CMU
3094 /* if bootloader leaves this head enabled, then skip CMU programming. */
3095 dc->cmu_dirty = (dc->pdata->flags & TEGRA_DC_FLAG_ENABLED) == 0;
3096 dc->cmu_enabled = dc->pdata->cmu_enable;
3099 if (dc->pdata->flags & TEGRA_DC_FLAG_ENABLED) {
3100 _tegra_dc_set_default_videomode(dc);
3101 dc->enabled = _tegra_dc_enable(dc);
3103 #if !defined(CONFIG_ARCH_TEGRA_11x_SOC) && !defined(CONFIG_ARCH_TEGRA_14x_SOC)
3104 /* BL or PG init will keep DISA unpowergated after booting.
3105 * Adding an extra powergate to balance the refcount
3106 * since _tegra_dc_enable() increases the refcount.
3108 if (dc->powergate_id == TEGRA_POWERGATE_DISA)
3109 tegra_dc_powergate_locked(dc);
3113 #ifdef CONFIG_TEGRA_ISOMGR
3114 if (isomgr_client_id == -1) {
3115 dc->isomgr_handle = NULL;
3117 dc->isomgr_handle = tegra_isomgr_register(isomgr_client_id,
3118 tegra_dc_calc_min_bandwidth(dc),
3119 tegra_dc_bandwidth_renegotiate, dc);
3120 if (IS_ERR(dc->isomgr_handle)) {
3121 dev_err(&dc->ndev->dev,
3122 "could not register isomgr. err=%ld\n",
3123 PTR_ERR(dc->isomgr_handle));
3127 dc->reserved_bw = tegra_dc_calc_min_bandwidth(dc);
3129 * Use maximum value so we can try to reserve as much as
3130 * needed until we are told by isomgr to backoff.
3132 dc->available_bw = UINT_MAX;
3136 tegra_dc_create_debugfs(dc);
3138 dev_info(&ndev->dev, "probed\n");
3140 if (dc->pdata->fb) {
3141 if (dc->enabled && dc->pdata->fb->bits_per_pixel == -1) {
3144 WINDOW_A_SELECT << dc->pdata->fb->win,
3145 DC_CMD_DISPLAY_WINDOW_HEADER);
3147 fmt = tegra_dc_readl(dc, DC_WIN_COLOR_DEPTH);
3148 dc->pdata->fb->bits_per_pixel =
3149 tegra_dc_fmt_bpp(fmt);
3152 mode = tegra_dc_get_override_mode(dc);
3154 dc->pdata->fb->xres = mode->h_active;
3155 dc->pdata->fb->yres = mode->v_active;
3158 tegra_dc_io_start(dc);
3159 dc->fb = tegra_fb_register(ndev, dc, dc->pdata->fb, fb_mem);
3160 tegra_dc_io_end(dc);
3161 if (IS_ERR_OR_NULL(dc->fb)) {
3163 dev_err(&ndev->dev, "failed to register fb\n");
3164 goto err_remove_debugfs;
3168 if (dc->out && dc->out->hotplug_init)
3169 dc->out->hotplug_init(&ndev->dev);
3172 if (dc->out_ops->detect)
3173 dc->connected = dc->out_ops->detect(dc);
3175 dc->connected = true;
3178 dc->connected = false;
3180 /* Powergate display module when it's unconnected. */
3181 /* detect() function, if presetns, responsible for the powergate */
3182 if (!tegra_dc_get_connected(dc) &&
3183 !(dc->out_ops && dc->out_ops->detect))
3184 tegra_dc_powergate_locked(dc);
3186 tegra_dc_create_sysfs(&dc->ndev->dev);
3189 * Overriding the display mode only applies for modes set up during
3190 * boot. It should not apply for e.g. HDMI hotplug.
3192 dc->initialized = false;
3197 tegra_dc_remove_debugfs(dc);
3201 tegra_dc_ext_disable(dc->ext);
3202 tegra_dc_ext_unregister(dc->ext);
3204 mutex_lock(&dc->lock);
3206 _tegra_dc_disable(dc);
3207 dc->enabled = false;
3208 mutex_unlock(&dc->lock);
3209 #ifdef CONFIG_SWITCH
3210 switch_dev_unregister(&dc->modeset_switch);
3212 #ifdef CONFIG_TEGRA_ISOMGR
3213 tegra_isomgr_unregister(dc->isomgr_handle);
3223 release_resource(fb_mem);
3227 err_release_resource_reg:
3228 release_resource(base_res);
3235 static int tegra_dc_remove(struct platform_device *ndev)
3237 struct tegra_dc *dc = platform_get_drvdata(ndev);
3238 struct device_node *np = ndev->dev.of_node;
3240 tegra_dc_remove_sysfs(&dc->ndev->dev);
3241 tegra_dc_remove_debugfs(dc);
3244 tegra_fb_unregister(dc->fb);
3247 release_resource(dc->fb_mem);
3253 tegra_dc_ext_disable(dc->ext);
3256 tegra_dc_ext_unregister(dc->ext);
3258 mutex_lock(&dc->lock);
3260 _tegra_dc_disable(dc);
3261 dc->enabled = false;
3262 mutex_unlock(&dc->lock);
3263 synchronize_irq(dc->irq); /* wait for IRQ handlers to finish */
3265 #ifdef CONFIG_SWITCH
3266 switch_dev_unregister(&dc->modeset_switch);
3268 free_irq(dc->irq, dc);
3269 #ifdef CONFIG_TEGRA_ISOMGR
3270 if (dc->isomgr_handle) {
3271 tegra_isomgr_unregister(dc->isomgr_handle);
3272 dc->isomgr_handle = NULL;
3275 clk_put(dc->emc_clk);
3280 release_resource(dc->base_res);
3282 tegra_dc_set(NULL, ndev->id);
3288 static int tegra_dc_suspend(struct platform_device *ndev, pm_message_t state)
3290 struct tegra_dc *dc = platform_get_drvdata(ndev);
3293 trace_display_suspend(dc);
3294 dev_info(&ndev->dev, "suspend\n");
3296 tegra_dc_ext_disable(dc->ext);
3298 mutex_lock(&dc->lock);
3299 ret = tegra_dc_io_start(dc);
3301 if (dc->out_ops && dc->out_ops->suspend)
3302 dc->out_ops->suspend(dc);
3305 _tegra_dc_disable(dc);
3307 dc->suspended = true;
3310 if (dc->out && dc->out->postsuspend) {
3311 dc->out->postsuspend();
3312 /* avoid resume event due to voltage falling on interfaces that
3313 * support hotplug wake. And only do this if a panel is
3314 * connected, if we are already disconnected, then no phantom
3315 * hotplug can occur by disabling the voltage.
3317 if ((dc->out->flags & TEGRA_DC_OUT_HOTPLUG_WAKE_LP0)
3318 && tegra_dc_get_connected(dc))
3323 tegra_dc_io_end(dc);
3325 #ifdef CONFIG_TEGRA_DC_CMU
3327 * CMU settings are lost when the DC goes to sleep. User-space will
3328 * perform a blank ioctl upon resume which will call tegra_dc_init()
3329 * and apply CMU settings again, but only if the cached values are
3330 * different from those specified. Clearing the cache here ensures
3331 * that this will happen.
3333 * It would be better to reapply the CMU settings in tegra_dc_resume(),
3334 * but color corruption sometimes happens if we do so and
3335 * tegra_dc_init() seems to be the only safe place for this.
3337 memset(&dc->cmu, 0, sizeof(dc->cmu));
3340 mutex_unlock(&dc->lock);
3341 synchronize_irq(dc->irq); /* wait for IRQ handlers to finish */
3346 static int tegra_dc_resume(struct platform_device *ndev)
3348 struct tegra_dc *dc = platform_get_drvdata(ndev);
3350 trace_display_resume(dc);
3351 dev_info(&ndev->dev, "resume\n");
3353 mutex_lock(&dc->lock);
3354 dc->suspended = false;
3356 /* To pan the fb on resume */
3357 tegra_fb_pan_display_reset(dc->fb);
3360 dc->enabled = false;
3361 _tegra_dc_set_default_videomode(dc);
3362 dc->enabled = _tegra_dc_enable(dc);
3365 if (dc->out && dc->out->hotplug_init)
3366 dc->out->hotplug_init(&ndev->dev);
3368 if (dc->out_ops && dc->out_ops->resume)
3369 dc->out_ops->resume(dc);
3371 mutex_unlock(&dc->lock);
3376 #endif /* CONFIG_PM */
3378 static void tegra_dc_shutdown(struct platform_device *ndev)
3380 struct tegra_dc *dc = platform_get_drvdata(ndev);
3382 if (WARN_ON(!dc || !dc->out || !dc->out_ops))
3388 tegra_dc_disable(dc);
3391 extern int suspend_set(const char *val, struct kernel_param *kp)
3393 if (!strcmp(val, "dump"))
3394 dump_regs(tegra_dcs[0]);
3396 else if (!strcmp(val, "suspend"))
3397 tegra_dc_suspend(tegra_dcs[0]->ndev, PMSG_SUSPEND);
3398 else if (!strcmp(val, "resume"))
3399 tegra_dc_resume(tegra_dcs[0]->ndev);
3405 extern int suspend_get(char *buffer, struct kernel_param *kp)
3412 module_param_call(suspend, suspend_set, suspend_get, &suspend, 0644);
3416 static struct of_device_id tegra_display_of_match[] = {
3417 {.compatible = "nvidia,tegra114-dc", },
3418 {.compatible = "nvidia,tegra124-dc", },
3423 struct platform_driver tegra_dc_driver = {
3426 .owner = THIS_MODULE,
3429 of_match_ptr(tegra_display_of_match),
3432 .probe = tegra_dc_probe,
3433 .remove = tegra_dc_remove,
3435 .suspend = tegra_dc_suspend,
3436 .resume = tegra_dc_resume,
3438 .shutdown = tegra_dc_shutdown,
3442 static int __init parse_disp_params(char *options, struct tegra_dc_mode *mode)
3447 for (i = 0; i < ARRAY_SIZE(params); i++) {
3448 if ((p = strsep(&options, ",")) != NULL) {
3450 params[i] = simple_strtoul(p, &p, 10);
3455 if ((mode->pclk = params[0]) == 0)
3458 mode->h_active = params[1];
3459 mode->v_active = params[2];
3460 mode->h_ref_to_sync = params[3];
3461 mode->v_ref_to_sync = params[4];
3462 mode->h_sync_width = params[5];
3463 mode->v_sync_width = params[6];
3464 mode->h_back_porch = params[7];
3465 mode->v_back_porch = params[8];
3466 mode->h_front_porch = params[9];
3467 mode->v_front_porch = params[10];
3472 static int __init tegra_dc_mode_override(char *str)
3474 char *p = str, *options;
3479 p = strstr(str, "hdmi:");
3482 options = strsep(&p, ";");
3483 if (parse_disp_params(options, &override_disp_mode[TEGRA_DC_OUT_HDMI]))
3487 p = strstr(str, "rgb:");
3490 options = strsep(&p, ";");
3491 if (parse_disp_params(options, &override_disp_mode[TEGRA_DC_OUT_RGB]))
3495 p = strstr(str, "dsi:");
3498 options = strsep(&p, ";");
3499 if (parse_disp_params(options, &override_disp_mode[TEGRA_DC_OUT_DSI]))
3506 __setup("disp_params=", tegra_dc_mode_override);
3509 static int __init tegra_dc_module_init(void)
3511 int ret = tegra_dc_ext_module_init();
3514 return platform_driver_register(&tegra_dc_driver);
3517 static void __exit tegra_dc_module_exit(void)
3519 platform_driver_unregister(&tegra_dc_driver);
3520 tegra_dc_ext_module_exit();
3523 module_exit(tegra_dc_module_exit);
3524 module_init(tegra_dc_module_init);