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 void tegra_dc_vsync_enable(struct tegra_dc *dc)
1570 mutex_lock(&dc->lock);
1571 _tegra_dc_vsync_enable(dc);
1572 mutex_unlock(&dc->lock);
1575 /* assumes dc->lock is already taken. */
1576 static void _tegra_dc_vsync_disable(struct tegra_dc *dc)
1580 if (dc->out->type == TEGRA_DC_OUT_DSI)
1581 vsync_irq = MSF_INT;
1583 vsync_irq = V_BLANK_INT;
1584 clear_bit(V_BLANK_USER, &dc->vblank_ref_count);
1585 if (!dc->vblank_ref_count)
1586 tegra_dc_mask_interrupt(dc, vsync_irq);
1587 tegra_dc_release_dc_out(dc);
1590 void tegra_dc_vsync_disable(struct tegra_dc *dc)
1592 mutex_lock(&dc->lock);
1593 _tegra_dc_vsync_disable(dc);
1594 mutex_unlock(&dc->lock);
1597 /* assumes dc->lock is already taken. */
1598 static void _tegra_dc_user_vsync_enable(struct tegra_dc *dc, bool enable)
1601 dc->out->user_needs_vblank++;
1602 init_completion(&dc->out->user_vblank_comp);
1603 _tegra_dc_vsync_enable(dc);
1605 _tegra_dc_vsync_disable(dc);
1606 dc->out->user_needs_vblank--;
1610 int tegra_dc_wait_for_vsync(struct tegra_dc *dc)
1612 unsigned long timeout_ms;
1613 unsigned long refresh; /* in 1000th Hz */
1616 mutex_lock(&dc->lp_lock);
1617 mutex_lock(&dc->lock);
1622 refresh = tegra_dc_calc_refresh(&dc->mode);
1623 /* time out if waiting took more than 2 frames */
1624 timeout_ms = DIV_ROUND_UP(2 * 1000000, refresh);
1625 _tegra_dc_user_vsync_enable(dc, true);
1626 mutex_unlock(&dc->lock);
1628 ret = wait_for_completion_interruptible_timeout(
1629 &dc->out->user_vblank_comp, msecs_to_jiffies(timeout_ms));
1631 mutex_lock(&dc->lock);
1632 _tegra_dc_user_vsync_enable(dc, false);
1634 mutex_unlock(&dc->lock);
1635 mutex_unlock(&dc->lp_lock);
1639 static void tegra_dc_prism_update_backlight(struct tegra_dc *dc)
1641 /* Do the actual brightness update outside of the mutex dc->lock */
1642 if (dc->out->sd_settings && !dc->out->sd_settings->bl_device &&
1643 dc->out->sd_settings->bl_device_name) {
1644 char *bl_device_name =
1645 dc->out->sd_settings->bl_device_name;
1646 dc->out->sd_settings->bl_device =
1647 get_backlight_device_by_name(bl_device_name);
1650 if (dc->out->sd_settings && dc->out->sd_settings->bl_device) {
1651 struct backlight_device *bl = dc->out->sd_settings->bl_device;
1652 backlight_update_status(bl);
1656 static void tegra_dc_vblank(struct work_struct *work)
1658 struct tegra_dc *dc = container_of(work, struct tegra_dc, vblank_work);
1659 bool nvsd_updated = false;
1661 mutex_lock(&dc->lock);
1664 mutex_unlock(&dc->lock);
1670 /* Clear the V_BLANK_FLIP bit of vblank ref-count if update is clean. */
1671 if (!tegra_dc_windows_are_dirty(dc))
1672 clear_bit(V_BLANK_FLIP, &dc->vblank_ref_count);
1674 /* Update the SD brightness */
1675 if (dc->out->sd_settings && !dc->out->sd_settings->use_vpulse2) {
1676 nvsd_updated = nvsd_update_brightness(dc);
1677 /* Ref-count vblank if nvsd is on-going. Otherwise, clean the
1678 * V_BLANK_NVSD bit of vblank ref-count. */
1680 set_bit(V_BLANK_NVSD, &dc->vblank_ref_count);
1681 tegra_dc_unmask_interrupt(dc, V_BLANK_INT);
1683 clear_bit(V_BLANK_NVSD, &dc->vblank_ref_count);
1687 /* Mask vblank interrupt if ref-count is zero. */
1688 if (!dc->vblank_ref_count)
1689 tegra_dc_mask_interrupt(dc, V_BLANK_INT);
1692 mutex_unlock(&dc->lock);
1694 /* Do the actual brightness update outside of the mutex dc->lock */
1696 tegra_dc_prism_update_backlight(dc);
1699 static void tegra_dc_one_shot_worker(struct work_struct *work)
1701 struct tegra_dc *dc = container_of(
1702 to_delayed_work(work), struct tegra_dc, one_shot_work);
1703 mutex_lock(&dc->lock);
1705 /* memory client has gone idle */
1706 tegra_dc_clear_bandwidth(dc);
1708 if (dc->out_ops && dc->out_ops->idle) {
1709 tegra_dc_io_start(dc);
1710 dc->out_ops->idle(dc);
1711 tegra_dc_io_end(dc);
1714 mutex_unlock(&dc->lock);
1717 /* return an arbitrarily large number if count overflow occurs.
1718 * make it a nice base-10 number to show up in stats output */
1719 static u64 tegra_dc_underflow_count(struct tegra_dc *dc, unsigned reg)
1721 unsigned count = tegra_dc_readl(dc, reg);
1723 tegra_dc_writel(dc, 0, reg);
1724 return ((count & 0x80000000) == 0) ? count : 10000000000ll;
1727 static void tegra_dc_underflow_handler(struct tegra_dc *dc)
1729 const u32 masks[] = {
1733 #if defined(CONFIG_ARCH_TEGRA_14x_SOC) || defined(CONFIG_ARCH_TEGRA_12x_SOC)
1741 dc->stats.underflows++;
1742 if (dc->underflow_mask & WIN_A_UF_INT)
1743 dc->stats.underflows_a += tegra_dc_underflow_count(dc,
1744 DC_WINBUF_AD_UFLOW_STATUS);
1745 if (dc->underflow_mask & WIN_B_UF_INT)
1746 dc->stats.underflows_b += tegra_dc_underflow_count(dc,
1747 DC_WINBUF_BD_UFLOW_STATUS);
1748 if (dc->underflow_mask & WIN_C_UF_INT)
1749 dc->stats.underflows_c += tegra_dc_underflow_count(dc,
1750 DC_WINBUF_CD_UFLOW_STATUS);
1751 #if defined(CONFIG_ARCH_TEGRA_14x_SOC) || defined(CONFIG_ARCH_TEGRA_12x_SOC)
1752 if (dc->underflow_mask & HC_UF_INT)
1753 dc->stats.underflows_h += tegra_dc_underflow_count(dc,
1754 DC_WINBUF_HD_UFLOW_STATUS);
1755 if (dc->underflow_mask & WIN_D_UF_INT)
1756 dc->stats.underflows_d += tegra_dc_underflow_count(dc,
1757 DC_WINBUF_DD_UFLOW_STATUS);
1758 if (dc->underflow_mask & WIN_T_UF_INT)
1759 dc->stats.underflows_t += tegra_dc_underflow_count(dc,
1760 DC_WINBUF_TD_UFLOW_STATUS);
1763 /* Check for any underflow reset conditions */
1764 for_each_set_bit(i, &dc->valid_windows, DC_N_WINDOWS) {
1765 if (WARN_ONCE(i >= ARRAY_SIZE(masks),
1766 "underflow stats unsupported"))
1767 break; /* bail if the table above is missing entries */
1769 continue; /* skip empty entries */
1771 if (dc->underflow_mask & masks[i]) {
1772 dc->windows[i].underflows++;
1774 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
1775 if (i < 3 && dc->windows[i].underflows > 4) {
1776 schedule_work(&dc->reset_work);
1778 dc->windows[i].underflows = 0;
1779 trace_display_reset(dc);
1782 #ifdef CONFIG_ARCH_TEGRA_3x_SOC
1783 if (i < 3 && dc->windows[i].underflows > 4) {
1784 trace_display_reset(dc);
1785 tegra_dc_writel(dc, UF_LINE_FLUSH,
1786 DC_DISP_DISP_MISC_CONTROL);
1787 tegra_dc_writel(dc, GENERAL_UPDATE,
1788 DC_CMD_STATE_CONTROL);
1789 tegra_dc_writel(dc, GENERAL_ACT_REQ,
1790 DC_CMD_STATE_CONTROL);
1792 tegra_dc_writel(dc, 0,
1793 DC_DISP_DISP_MISC_CONTROL);
1794 tegra_dc_writel(dc, GENERAL_UPDATE,
1795 DC_CMD_STATE_CONTROL);
1796 tegra_dc_writel(dc, GENERAL_ACT_REQ,
1797 DC_CMD_STATE_CONTROL);
1801 dc->windows[i].underflows = 0;
1805 /* Clear the underflow mask now that we've checked it. */
1806 tegra_dc_writel(dc, dc->underflow_mask, DC_CMD_INT_STATUS);
1807 dc->underflow_mask = 0;
1808 tegra_dc_unmask_interrupt(dc, ALL_UF_INT());
1809 trace_underflow(dc);
1812 #if !defined(CONFIG_ARCH_TEGRA_2x_SOC) && !defined(CONFIG_ARCH_TEGRA_3x_SOC)
1813 static void tegra_dc_vpulse2(struct work_struct *work)
1815 struct tegra_dc *dc = container_of(work, struct tegra_dc, vpulse2_work);
1816 bool nvsd_updated = false;
1818 mutex_lock(&dc->lock);
1821 mutex_unlock(&dc->lock);
1827 /* Clear the V_PULSE2_FLIP if no update */
1828 if (!tegra_dc_windows_are_dirty(dc))
1829 clear_bit(V_PULSE2_FLIP, &dc->vpulse2_ref_count);
1831 /* Update the SD brightness */
1832 if (dc->out->sd_settings && dc->out->sd_settings->use_vpulse2) {
1833 nvsd_updated = nvsd_update_brightness(dc);
1835 set_bit(V_PULSE2_NVSD, &dc->vpulse2_ref_count);
1836 tegra_dc_unmask_interrupt(dc, V_PULSE2_INT);
1838 clear_bit(V_PULSE2_NVSD, &dc->vpulse2_ref_count);
1842 /* Mask vpulse2 interrupt if ref-count is zero. */
1843 if (!dc->vpulse2_ref_count)
1844 tegra_dc_mask_interrupt(dc, V_PULSE2_INT);
1847 mutex_unlock(&dc->lock);
1849 /* Do the actual brightness update outside of the mutex dc->lock */
1851 tegra_dc_prism_update_backlight(dc);
1855 static void tegra_dc_process_vblank(struct tegra_dc *dc, ktime_t timestamp)
1857 if (test_bit(V_BLANK_USER, &dc->vblank_ref_count))
1858 tegra_dc_ext_process_vblank(dc->ndev->id, timestamp);
1861 static void tegra_dc_one_shot_irq(struct tegra_dc *dc, unsigned long status,
1864 /* pending user vblank, so wakeup */
1865 if (status & (V_BLANK_INT | MSF_INT)) {
1866 if (dc->out->user_needs_vblank > 0)
1867 complete(&dc->out->user_vblank_comp);
1868 tegra_dc_process_vblank(dc, timestamp);
1871 if (status & V_BLANK_INT) {
1872 /* Sync up windows. */
1873 tegra_dc_trigger_windows(dc);
1875 /* Schedule any additional bottom-half vblank actvities. */
1876 queue_work(system_freezable_wq, &dc->vblank_work);
1879 if (status & FRAME_END_INT) {
1880 /* Mark the frame_end as complete. */
1881 dc->crc_pending = false;
1882 if (!completion_done(&dc->frame_end_complete))
1883 complete(&dc->frame_end_complete);
1884 if (!completion_done(&dc->crc_complete))
1885 complete(&dc->crc_complete);
1887 if (dc->out->flags & TEGRA_DC_OUT_ONE_SHOT_MODE && !dc->nvsr)
1891 #if !defined(CONFIG_ARCH_TEGRA_2x_SOC) && !defined(CONFIG_ARCH_TEGRA_3x_SOC)
1892 if (status & V_PULSE2_INT)
1893 queue_work(system_freezable_wq, &dc->vpulse2_work);
1897 static void tegra_dc_continuous_irq(struct tegra_dc *dc, unsigned long status,
1900 /* Schedule any additional bottom-half vblank actvities. */
1901 if (status & V_BLANK_INT)
1902 queue_work(system_freezable_wq, &dc->vblank_work);
1904 if (status & (V_BLANK_INT | MSF_INT))
1905 tegra_dc_process_vblank(dc, timestamp);
1907 if (status & FRAME_END_INT) {
1908 struct timespec tm = CURRENT_TIME;
1909 dc->frame_end_timestamp = timespec_to_ns(&tm);
1910 wake_up(&dc->timestamp_wq);
1912 /* Mark the frame_end as complete. */
1913 if (!completion_done(&dc->frame_end_complete))
1914 complete(&dc->frame_end_complete);
1915 if (!completion_done(&dc->crc_complete))
1916 complete(&dc->crc_complete);
1918 tegra_dc_trigger_windows(dc);
1921 #if !defined(CONFIG_ARCH_TEGRA_2x_SOC) && !defined(CONFIG_ARCH_TEGRA_3x_SOC)
1922 if (status & V_PULSE2_INT)
1923 queue_work(system_freezable_wq, &dc->vpulse2_work);
1927 /* XXX: Not sure if we limit look ahead to 1 frame */
1928 bool tegra_dc_is_within_n_vsync(struct tegra_dc *dc, s64 ts)
1930 BUG_ON(!dc->frametime_ns);
1931 return ((ts - dc->frame_end_timestamp) < dc->frametime_ns);
1934 bool tegra_dc_does_vsync_separate(struct tegra_dc *dc, s64 new_ts, s64 old_ts)
1936 BUG_ON(!dc->frametime_ns);
1937 return (((new_ts - old_ts) > dc->frametime_ns)
1938 || (div_s64((new_ts - dc->frame_end_timestamp), dc->frametime_ns)
1939 != div_s64((old_ts - dc->frame_end_timestamp),
1940 dc->frametime_ns)));
1943 static irqreturn_t tegra_dc_irq(int irq, void *ptr)
1945 ktime_t timestamp = ktime_get();
1946 struct tegra_dc *dc = ptr;
1947 unsigned long status;
1948 unsigned long underflow_mask;
1950 int need_disable = 0;
1952 if (tegra_platform_is_fpga())
1955 mutex_lock(&dc->lock);
1956 if (!tegra_dc_is_powered(dc)) {
1957 mutex_unlock(&dc->lock);
1963 if (!dc->enabled || !nvhost_module_powered_ext(dc->ndev)) {
1964 dev_dbg(&dc->ndev->dev, "IRQ when DC not powered!\n");
1965 status = tegra_dc_readl(dc, DC_CMD_INT_STATUS);
1966 tegra_dc_writel(dc, status, DC_CMD_INT_STATUS);
1968 mutex_unlock(&dc->lock);
1972 /* clear all status flags except underflow, save those for the worker */
1973 status = tegra_dc_readl(dc, DC_CMD_INT_STATUS);
1974 tegra_dc_writel(dc, status & ~ALL_UF_INT(), DC_CMD_INT_STATUS);
1975 val = tegra_dc_readl(dc, DC_CMD_INT_MASK);
1976 tegra_dc_writel(dc, val & ~ALL_UF_INT(), DC_CMD_INT_MASK);
1979 * Overlays can get thier internal state corrupted during and underflow
1980 * condition. The only way to fix this state is to reset the DC.
1981 * if we get 4 consecutive frames with underflows, assume we're
1984 underflow_mask = status & ALL_UF_INT();
1986 /* Check underflow */
1987 if (underflow_mask) {
1988 dc->underflow_mask |= underflow_mask;
1989 schedule_delayed_work(&dc->underflow_work,
1990 msecs_to_jiffies(1));
1993 if (dc->out->flags & TEGRA_DC_OUT_ONE_SHOT_MODE)
1994 tegra_dc_one_shot_irq(dc, status, timestamp);
1996 tegra_dc_continuous_irq(dc, status, timestamp);
1999 tegra_dc_nvsr_irq(dc->nvsr, status);
2001 /* update video mode if it has changed since the last frame */
2002 if (status & (FRAME_END_INT | V_BLANK_INT))
2003 if (tegra_dc_update_mode(dc))
2004 need_disable = 1; /* force display off on error */
2007 mutex_unlock(&dc->lock);
2010 tegra_dc_disable(dc);
2014 void tegra_dc_set_color_control(struct tegra_dc *dc)
2018 switch (dc->out->depth) {
2020 color_control = BASE_COLOR_SIZE111;
2024 color_control = BASE_COLOR_SIZE222;
2028 color_control = BASE_COLOR_SIZE332;
2032 color_control = BASE_COLOR_SIZE333;
2036 color_control = BASE_COLOR_SIZE444;
2040 color_control = BASE_COLOR_SIZE555;
2044 color_control = BASE_COLOR_SIZE565;
2048 color_control = BASE_COLOR_SIZE666;
2052 color_control = BASE_COLOR_SIZE888;
2056 switch (dc->out->dither) {
2057 case TEGRA_DC_UNDEFINED_DITHER:
2058 case TEGRA_DC_DISABLE_DITHER:
2059 color_control |= DITHER_CONTROL_DISABLE;
2061 case TEGRA_DC_ORDERED_DITHER:
2062 color_control |= DITHER_CONTROL_ORDERED;
2064 #ifdef CONFIG_TEGRA_DC_TEMPORAL_DITHER
2065 case TEGRA_DC_TEMPORAL_DITHER:
2066 color_control |= DITHER_CONTROL_TEMPORAL;
2069 case TEGRA_DC_ERRDIFF_DITHER:
2070 /* The line buffer for error-diffusion dither is limited
2071 * to 1280 pixels per line. This limits the maximum
2072 * horizontal active area size to 1280 pixels when error
2073 * diffusion is enabled.
2075 BUG_ON(dc->mode.h_active > 1280);
2076 color_control |= DITHER_CONTROL_ERRDIFF;
2080 dev_err(&dc->ndev->dev, "Error: Unsupported dithering mode\n");
2083 #ifdef CONFIG_TEGRA_DC_CMU
2084 if (dc->cmu_enabled)
2085 color_control |= CMU_ENABLE;
2088 tegra_dc_writel(dc, color_control, DC_DISP_DISP_COLOR_CONTROL);
2091 static u32 get_syncpt(struct tegra_dc *dc, int idx)
2093 if (idx >= 0 && idx < ARRAY_SIZE(dc->win_syncpt))
2094 return dc->win_syncpt[idx];
2098 static void tegra_dc_init_vpulse2_int(struct tegra_dc *dc)
2100 #if !defined(CONFIG_ARCH_TEGRA_2x_SOC) && !defined(CONFIG_ARCH_TEGRA_3x_SOC)
2104 val = V_PULSE2_H_POSITION(0) | V_PULSE2_LAST(0x1);
2105 tegra_dc_writel(dc, val, DC_DISP_V_PULSE2_CONTROL);
2107 start = dc->mode.v_ref_to_sync + dc->mode.v_sync_width +
2108 dc->mode.v_back_porch + dc->mode.v_active;
2110 val = V_PULSE2_START_A(start) + V_PULSE2_END_A(end);
2111 tegra_dc_writel(dc, val, DC_DISP_V_PULSE2_POSITION_A);
2113 val = tegra_dc_readl(dc, DC_CMD_INT_ENABLE);
2114 val |= V_PULSE2_INT;
2115 tegra_dc_writel(dc, val , DC_CMD_INT_ENABLE);
2117 tegra_dc_mask_interrupt(dc, V_PULSE2_INT);
2118 tegra_dc_writel(dc, V_PULSE_2_ENABLE, DC_DISP_DISP_SIGNAL_OPTIONS0);
2122 static int tegra_dc_init(struct tegra_dc *dc)
2128 tegra_dc_io_start(dc);
2129 tegra_dc_writel(dc, 0x00000100, DC_CMD_GENERAL_INCR_SYNCPT_CNTRL);
2130 if (dc->ndev->id == 0) {
2131 tegra_mc_set_priority(TEGRA_MC_CLIENT_DISPLAY0A,
2133 tegra_mc_set_priority(TEGRA_MC_CLIENT_DISPLAY0B,
2135 tegra_mc_set_priority(TEGRA_MC_CLIENT_DISPLAY0C,
2137 #if defined(CONFIG_ARCH_TEGRA_2x_SOC) || defined(CONFIG_ARCH_TEGRA_3x_SOC)
2138 /* only present on Tegra2 and 3 */
2139 tegra_mc_set_priority(TEGRA_MC_CLIENT_DISPLAY1B,
2142 tegra_mc_set_priority(TEGRA_MC_CLIENT_DISPLAYHC,
2143 TEGRA_MC_PRIO_HIGH);
2144 } else if (dc->ndev->id == 1) {
2145 tegra_mc_set_priority(TEGRA_MC_CLIENT_DISPLAY0AB,
2147 tegra_mc_set_priority(TEGRA_MC_CLIENT_DISPLAY0BB,
2149 tegra_mc_set_priority(TEGRA_MC_CLIENT_DISPLAY0CB,
2151 #if defined(CONFIG_ARCH_TEGRA_2x_SOC) || defined(CONFIG_ARCH_TEGRA_3x_SOC)
2152 /* only present on Tegra2 and 3 */
2153 tegra_mc_set_priority(TEGRA_MC_CLIENT_DISPLAY1BB,
2156 tegra_mc_set_priority(TEGRA_MC_CLIENT_DISPLAYHCB,
2157 TEGRA_MC_PRIO_HIGH);
2159 tegra_dc_writel(dc, 0x00000100 | dc->vblank_syncpt,
2160 DC_CMD_CONT_SYNCPT_VSYNC);
2162 tegra_dc_writel(dc, 0x00004700, DC_CMD_INT_TYPE);
2163 #if defined(CONFIG_ARCH_TEGRA_14x_SOC) || defined(CONFIG_ARCH_TEGRA_12x_SOC)
2164 tegra_dc_writel(dc, WIN_A_OF_INT | WIN_B_OF_INT | WIN_C_OF_INT |
2165 WIN_T_UF_INT | WIN_D_UF_INT | HC_UF_INT |
2166 WIN_A_UF_INT | WIN_B_UF_INT | WIN_C_UF_INT,
2167 DC_CMD_INT_POLARITY);
2169 tegra_dc_writel(dc, WIN_A_OF_INT | WIN_B_OF_INT | WIN_C_OF_INT |
2170 WIN_A_UF_INT | WIN_B_UF_INT | WIN_C_UF_INT,
2171 DC_CMD_INT_POLARITY);
2173 tegra_dc_writel(dc, 0x00202020, DC_DISP_MEM_HIGH_PRIORITY);
2174 tegra_dc_writel(dc, 0x00010101, DC_DISP_MEM_HIGH_PRIORITY_TIMER);
2175 #ifdef CONFIG_ARCH_TEGRA_3x_SOC
2176 tegra_dc_writel(dc, 0x00000000, DC_DISP_DISP_MISC_CONTROL);
2178 /* enable interrupts for vblank, frame_end and underflows */
2179 int_enable = (FRAME_END_INT | V_BLANK_INT | ALL_UF_INT());
2180 /* for panels with one-shot mode enable tearing effect interrupt */
2181 if (dc->out->flags & TEGRA_DC_OUT_ONE_SHOT_MODE)
2182 int_enable |= MSF_INT;
2184 tegra_dc_writel(dc, int_enable, DC_CMD_INT_ENABLE);
2185 tegra_dc_writel(dc, ALL_UF_INT(), DC_CMD_INT_MASK);
2186 tegra_dc_init_vpulse2_int(dc);
2188 #if !defined(CONFIG_TEGRA_DC_BLENDER_GEN2)
2189 tegra_dc_writel(dc, 0x00000000, DC_DISP_BORDER_COLOR);
2191 tegra_dc_writel(dc, 0x00000000, DC_DISP_BLEND_BACKGROUND_COLOR);
2194 #ifdef CONFIG_TEGRA_DC_CMU
2195 _tegra_dc_update_cmu(dc, tegra_dc_get_cmu(dc));
2197 tegra_dc_set_color_control(dc);
2198 for_each_set_bit(i, &dc->valid_windows, DC_N_WINDOWS) {
2199 struct tegra_dc_win *win = &dc->windows[i];
2200 tegra_dc_writel(dc, WINDOW_A_SELECT << i,
2201 DC_CMD_DISPLAY_WINDOW_HEADER);
2202 tegra_dc_set_csc(dc, &win->csc);
2203 tegra_dc_set_lut(dc, win);
2204 tegra_dc_set_scaling_filter(dc);
2207 #ifdef CONFIG_TEGRA_DC_WIN_H
2208 /* Window H is set to window mode by default for t14x. */
2209 tegra_dc_writel(dc, WINH_CURS_SELECT(1),
2210 DC_DISP_BLEND_CURSOR_CONTROL);
2213 for_each_set_bit(i, &dc->valid_windows, DC_N_WINDOWS) {
2214 u32 syncpt = get_syncpt(dc, i);
2216 /* refuse to operate on invalid syncpts */
2217 if (WARN_ON(syncpt == NVSYNCPT_INVALID))
2220 dc->syncpt[i].id = syncpt;
2222 if (!nvhost_syncpt_read_ext_check(dc->ndev, syncpt, &val))
2223 dc->syncpt[i].min = dc->syncpt[i].max = val;
2226 dc->crc_pending = false;
2228 trace_display_mode(dc, &dc->mode);
2230 if (dc->mode.pclk) {
2231 if (!dc->initialized) {
2232 if (tegra_dc_program_mode(dc, &dc->mode)) {
2233 tegra_dc_io_end(dc);
2237 dev_info(&dc->ndev->dev, "DC initialized, "
2238 "skipping tegra_dc_program_mode.\n");
2242 /* Initialize SD AFTER the modeset.
2243 nvsd_init handles the sd_settings = NULL case. */
2244 nvsd_init(dc, dc->out->sd_settings);
2246 tegra_dc_io_end(dc);
2251 static bool _tegra_dc_controller_enable(struct tegra_dc *dc)
2253 int failed_init = 0;
2256 if (WARN_ON(!dc || !dc->out || !dc->out_ops))
2259 tegra_dc_unpowergate_locked(dc);
2261 if (dc->out->enable)
2262 dc->out->enable(&dc->ndev->dev);
2264 tegra_dc_setup_clk(dc, dc->clk);
2266 /* dc clk always on for continuous mode */
2267 if (!(dc->out->flags & TEGRA_DC_OUT_ONE_SHOT_MODE))
2268 tegra_dc_clk_enable(dc);
2270 tegra_dvfs_set_rate(dc->clk, dc->mode.pclk);
2274 tegra_dc_power_on(dc);
2276 /* do not accept interrupts during initialization */
2277 tegra_dc_writel(dc, 0, DC_CMD_INT_MASK);
2281 failed_init = tegra_dc_init(dc);
2283 tegra_dc_writel(dc, 0, DC_CMD_INT_MASK);
2284 disable_irq_nosync(dc->irq);
2285 tegra_dc_clear_bandwidth(dc);
2286 if (dc->out && dc->out->disable)
2289 if (!(dc->out->flags & TEGRA_DC_OUT_ONE_SHOT_MODE))
2290 tegra_dc_clk_disable(dc);
2292 tegra_dvfs_set_rate(dc->clk, 0);
2296 tegra_dpaux_pad_power(dc, false);
2298 if (dc->out_ops && dc->out_ops->enable)
2299 dc->out_ops->enable(dc);
2301 /* force a full blending update */
2302 for (i = 0; i < DC_N_WINDOWS; i++)
2303 dc->blend.z[i] = -1;
2305 tegra_dc_ext_enable(dc->ext);
2307 /* initialize cursor to defaults, as driver depends on HW state */
2308 tegra_dc_writel(dc, 0, DC_DISP_CURSOR_START_ADDR);
2309 tegra_dc_writel(dc, 0, DC_DISP_CURSOR_START_ADDR_NS);
2310 #if defined(CONFIG_ARCH_TEGRA_12x_SOC)
2311 tegra_dc_writel(dc, 0, DC_DISP_CURSOR_START_ADDR_HI);
2312 tegra_dc_writel(dc, 0, DC_DISP_CURSOR_START_ADDR_HI_NS);
2314 tegra_dc_writel(dc, 0, DC_DISP_CURSOR_POSITION);
2315 tegra_dc_writel(dc, 0, DC_DISP_CURSOR_POSITION_NS);
2316 tegra_dc_writel(dc, 0xffffff, DC_DISP_CURSOR_FOREGROUND); /* white */
2317 tegra_dc_writel(dc, 0x000000, DC_DISP_CURSOR_BACKGROUND); /* black */
2318 tegra_dc_writel(dc, 0, DC_DISP_BLEND_CURSOR_CONTROL);
2320 trace_display_enable(dc);
2322 tegra_dc_writel(dc, GENERAL_UPDATE, DC_CMD_STATE_CONTROL);
2323 tegra_dc_writel(dc, GENERAL_ACT_REQ, DC_CMD_STATE_CONTROL);
2325 if (dc->out->postpoweron)
2326 dc->out->postpoweron(&dc->ndev->dev);
2328 if (dc->out_ops && dc->out_ops->postpoweron)
2329 dc->out_ops->postpoweron(dc);
2331 tegra_log_resume_time();
2333 * We will need to reinitialize the display the next time panel
2336 dc->out->flags &= ~TEGRA_DC_OUT_INITIALIZED_MODE;
2343 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
2344 static bool _tegra_dc_controller_reset_enable(struct tegra_dc *dc)
2348 if (WARN_ON(!dc || !dc->out || !dc->out_ops))
2351 if (dc->out->enable)
2352 dc->out->enable(&dc->ndev->dev);
2354 tegra_dc_setup_clk(dc, dc->clk);
2355 tegra_dc_clk_enable(dc);
2357 if (dc->ndev->id == 0 && tegra_dcs[1] != NULL) {
2358 mutex_lock(&tegra_dcs[1]->lock);
2359 disable_irq_nosync(tegra_dcs[1]->irq);
2360 } else if (dc->ndev->id == 1 && tegra_dcs[0] != NULL) {
2361 mutex_lock(&tegra_dcs[0]->lock);
2362 disable_irq_nosync(tegra_dcs[0]->irq);
2366 tegra_periph_reset_assert(dc->clk);
2368 if (tegra_platform_is_silicon()) {
2369 tegra_periph_reset_deassert(dc->clk);
2373 if (dc->ndev->id == 0 && tegra_dcs[1] != NULL) {
2374 enable_dc_irq(tegra_dcs[1]);
2375 mutex_unlock(&tegra_dcs[1]->lock);
2376 } else if (dc->ndev->id == 1 && tegra_dcs[0] != NULL) {
2377 enable_dc_irq(tegra_dcs[0]);
2378 mutex_unlock(&tegra_dcs[0]->lock);
2383 if (tegra_dc_init(dc)) {
2384 dev_err(&dc->ndev->dev, "cannot initialize\n");
2388 if (dc->out_ops && dc->out_ops->enable)
2389 dc->out_ops->enable(dc);
2391 if (dc->out->postpoweron)
2392 dc->out->postpoweron(&dc->ndev->dev);
2394 /* force a full blending update */
2395 dc->blend.z[0] = -1;
2397 tegra_dc_ext_enable(dc->ext);
2400 dev_err(&dc->ndev->dev, "initialization failed,disabling");
2401 _tegra_dc_controller_disable(dc);
2404 trace_display_reset(dc);
2409 static int _tegra_dc_set_default_videomode(struct tegra_dc *dc)
2411 if (dc->mode.pclk == 0) {
2412 switch (dc->out->type) {
2413 case TEGRA_DC_OUT_HDMI:
2414 /* If DC is enable called, and HDMI is connected,
2415 * but DC is not initialized by bootloader and no
2416 * mode is set up, then set a fallback mode.
2418 if (tegra_dc_hpd(dc) && (!dc->initialized)) {
2419 return tegra_dc_set_fb_mode(dc, &tegra_dc_vga_mode, 0);
2425 case TEGRA_DC_OUT_DP:
2426 return tegra_dc_set_fb_mode(dc, &tegra_dc_vga_mode, 0);
2428 /* Do nothing for other outputs for now */
2429 case TEGRA_DC_OUT_RGB:
2431 case TEGRA_DC_OUT_DSI:
2441 int tegra_dc_set_default_videomode(struct tegra_dc *dc)
2443 return _tegra_dc_set_default_videomode(dc);
2446 static bool _tegra_dc_enable(struct tegra_dc *dc)
2448 if (dc->mode.pclk == 0)
2457 pm_runtime_get_sync(&dc->ndev->dev);
2459 if (dc->out->type == TEGRA_DC_OUT_HDMI && !tegra_dc_hpd(dc))
2462 if (!_tegra_dc_controller_enable(dc)) {
2463 pm_runtime_put_sync(&dc->ndev->dev);
2470 void tegra_dc_enable(struct tegra_dc *dc)
2472 if (WARN_ON(!dc || !dc->out || !dc->out_ops))
2475 mutex_lock(&dc->lock);
2478 dc->enabled = _tegra_dc_enable(dc);
2480 mutex_unlock(&dc->lock);
2481 trace_display_mode(dc, &dc->mode);
2484 void tegra_dc_disable_window(struct tegra_dc *dc, unsigned win)
2486 struct tegra_dc_win *w = &dc->windows[win];
2488 /* reset window bandwidth */
2490 w->new_bandwidth = 0;
2492 /* disable windows */
2493 w->flags &= ~TEGRA_WIN_FLAG_ENABLED;
2495 /* refuse to operate on invalid syncpts */
2496 if (WARN_ON(dc->syncpt[win].id == NVSYNCPT_INVALID))
2499 /* flush any pending syncpt waits */
2500 dc->syncpt[win].max += 1;
2501 while (dc->syncpt[win].min < dc->syncpt[win].max) {
2502 trace_display_syncpt_flush(dc, dc->syncpt[win].id,
2503 dc->syncpt[win].min, dc->syncpt[win].max);
2504 dc->syncpt[win].min++;
2505 nvhost_syncpt_cpu_incr_ext(dc->ndev, dc->syncpt[win].id);
2509 static void _tegra_dc_controller_disable(struct tegra_dc *dc)
2515 if (atomic_read(&dc->holding)) {
2516 /* Force release all refs but the last one */
2517 atomic_set(&dc->holding, 1);
2518 tegra_dc_release_dc_out(dc);
2521 if (dc->out && dc->out->prepoweroff)
2522 dc->out->prepoweroff();
2524 if (dc->out_ops && dc->out_ops->disable)
2525 dc->out_ops->disable(dc);
2527 if (tegra_powergate_is_powered(dc->powergate_id))
2528 tegra_dc_writel(dc, 0, DC_CMD_INT_MASK);
2530 disable_irq_nosync(dc->irq);
2532 tegra_dc_clear_bandwidth(dc);
2534 if (dc->out && dc->out->disable)
2537 for_each_set_bit(i, &dc->valid_windows, DC_N_WINDOWS) {
2538 tegra_dc_disable_window(dc, i);
2540 trace_display_disable(dc);
2542 if (dc->out_ops && dc->out_ops->postpoweroff)
2543 dc->out_ops->postpoweroff(dc);
2547 /* disable always on dc clk in continuous mode */
2548 if (!(dc->out->flags & TEGRA_DC_OUT_ONE_SHOT_MODE))
2549 tegra_dc_clk_disable(dc);
2551 tegra_dvfs_set_rate(dc->clk, 0);
2554 void tegra_dc_stats_enable(struct tegra_dc *dc, bool enable)
2556 #if 0 /* underflow interrupt is already enabled by dc reset worker */
2559 val = tegra_dc_readl(dc, DC_CMD_INT_ENABLE);
2561 val |= (WIN_A_UF_INT | WIN_B_UF_INT | WIN_C_UF_INT);
2563 val &= ~(WIN_A_UF_INT | WIN_B_UF_INT | WIN_C_UF_INT);
2564 tegra_dc_writel(dc, val, DC_CMD_INT_ENABLE);
2569 bool tegra_dc_stats_get(struct tegra_dc *dc)
2571 #if 0 /* right now it is always enabled */
2576 val = tegra_dc_readl(dc, DC_CMD_INT_ENABLE);
2577 res = !!(val & (WIN_A_UF_INT | WIN_B_UF_INT | WIN_C_UF_INT));
2587 /* blank selected windows by disabling them */
2588 void tegra_dc_blank(struct tegra_dc *dc, unsigned windows)
2590 struct tegra_dc_win *dcwins[DC_N_WINDOWS];
2592 unsigned long int blank_windows;
2595 blank_windows = windows & dc->valid_windows;
2600 for_each_set_bit(i, &blank_windows, DC_N_WINDOWS) {
2601 dcwins[nr_win] = tegra_dc_get_window(dc, i);
2602 if (!dcwins[nr_win])
2604 dcwins[nr_win++]->flags &= ~TEGRA_WIN_FLAG_ENABLED;
2607 tegra_dc_update_windows(dcwins, nr_win);
2608 tegra_dc_sync_windows(dcwins, nr_win);
2609 tegra_dc_program_bandwidth(dc, true);
2612 int tegra_dc_restore(struct tegra_dc *dc)
2614 return tegra_dc_ext_restore(dc->ext);
2617 static void _tegra_dc_disable(struct tegra_dc *dc)
2619 #ifdef CONFIG_TEGRA_DC_CMU
2620 /* power down resets the registers, setting to true
2621 * causes CMU to be restored in tegra_dc_init(). */
2622 dc->cmu_dirty = true;
2625 if (dc->out->flags & TEGRA_DC_OUT_ONE_SHOT_MODE) {
2626 mutex_lock(&dc->one_shot_lock);
2627 cancel_delayed_work_sync(&dc->one_shot_work);
2630 tegra_dc_io_start(dc);
2631 _tegra_dc_controller_disable(dc);
2632 tegra_dc_io_end(dc);
2634 tegra_dc_powergate_locked(dc);
2636 if (dc->out->flags & TEGRA_DC_OUT_ONE_SHOT_MODE)
2637 mutex_unlock(&dc->one_shot_lock);
2638 pm_runtime_put(&dc->ndev->dev);
2640 tegra_log_suspend_time();
2643 void tegra_dc_disable(struct tegra_dc *dc)
2645 if (WARN_ON(!dc || !dc->out || !dc->out_ops))
2648 if (!tegra_dc_ext_disable(dc->ext))
2649 tegra_dc_blank(dc, BLANK_ALL);
2651 /* it's important that new underflow work isn't scheduled before the
2652 * lock is acquired. */
2653 cancel_delayed_work_sync(&dc->underflow_work);
2655 mutex_lock(&dc->lp_lock);
2656 mutex_lock(&dc->lock);
2659 dc->enabled = false;
2660 dc->blanked = false;
2663 _tegra_dc_disable(dc);
2666 #ifdef CONFIG_SWITCH
2667 switch_set_state(&dc->modeset_switch, 0);
2669 mutex_unlock(&dc->lock);
2670 mutex_unlock(&dc->lp_lock);
2671 synchronize_irq(dc->irq);
2672 trace_display_mode(dc, &dc->mode);
2674 /* disable pending clks due to uncompleted frames */
2675 while (tegra_is_clk_enabled(dc->clk))
2679 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
2680 static void tegra_dc_reset_worker(struct work_struct *work)
2682 struct tegra_dc *dc =
2683 container_of(work, struct tegra_dc, reset_work);
2685 unsigned long val = 0;
2687 mutex_lock(&shared_lock);
2689 dev_warn(&dc->ndev->dev,
2690 "overlay stuck in underflow state. resetting.\n");
2692 tegra_dc_ext_disable(dc->ext);
2694 mutex_lock(&dc->lock);
2696 if (dc->enabled == false)
2699 dc->enabled = false;
2704 val = tegra_dc_readl(dc, DC_CMD_CONT_SYNCPT_VSYNC);
2705 val &= ~(0x00000100);
2706 tegra_dc_writel(dc, val, DC_CMD_CONT_SYNCPT_VSYNC);
2709 * set DC to STOP mode
2711 tegra_dc_writel(dc, DISP_CTRL_MODE_STOP, DC_CMD_DISPLAY_COMMAND);
2715 _tegra_dc_controller_disable(dc);
2717 /* _tegra_dc_controller_reset_enable deasserts reset */
2718 _tegra_dc_controller_reset_enable(dc);
2722 /* reopen host read bus */
2723 val = tegra_dc_readl(dc, DC_CMD_CONT_SYNCPT_VSYNC);
2724 val &= ~(0x00000100);
2726 tegra_dc_writel(dc, val, DC_CMD_CONT_SYNCPT_VSYNC);
2729 mutex_unlock(&dc->lock);
2730 mutex_unlock(&shared_lock);
2731 trace_display_reset(dc);
2735 static void tegra_dc_underflow_worker(struct work_struct *work)
2737 struct tegra_dc *dc = container_of(
2738 to_delayed_work(work), struct tegra_dc, underflow_work);
2740 mutex_lock(&dc->lock);
2744 tegra_dc_underflow_handler(dc);
2747 mutex_unlock(&dc->lock);
2750 #ifdef CONFIG_SWITCH
2751 static ssize_t switch_modeset_print_mode(struct switch_dev *sdev, char *buf)
2753 struct tegra_dc *dc =
2754 container_of(sdev, struct tegra_dc, modeset_switch);
2757 return sprintf(buf, "offline\n");
2759 return sprintf(buf, "%dx%d\n", dc->mode.h_active, dc->mode.v_active);
2763 static int tegra_dc_probe(struct platform_device *ndev)
2765 struct tegra_dc *dc;
2766 struct tegra_dc_mode *mode;
2767 struct tegra_dc_platform_data *dt_pdata = NULL;
2769 #ifndef CONFIG_TEGRA_ISOMGR
2770 struct clk *emc_clk;
2772 int isomgr_client_id = -1;
2774 struct device_node *np = ndev->dev.of_node;
2775 struct resource *res;
2776 struct resource dt_res;
2777 struct resource *base_res;
2778 struct resource *fb_mem = NULL;
2784 if (!np && !ndev->dev.platform_data) {
2785 dev_err(&ndev->dev, "no platform data\n");
2789 /* Specify parameters for the maximum physical segment size. */
2790 ndev->dev.dma_parms = &tegra_dc_dma_parameters;
2792 dc = kzalloc(sizeof(struct tegra_dc), GFP_KERNEL);
2794 dev_err(&ndev->dev, "can't allocate memory for tegra_dc\n");
2799 dt_pdata = of_dc_parse_platform_data(ndev);
2800 if (dt_pdata == NULL)
2804 irq = of_irq_to_resource(np, 0, NULL);
2809 ret = of_address_to_resource(np, 0, &dt_res);
2813 if (dt_res.start == TEGRA_DISPLAY_BASE)
2815 else if (dt_res.start == TEGRA_DISPLAY2_BASE)
2822 irq = platform_get_irq_byname(ndev, "irq");
2824 dev_err(&ndev->dev, "no irq\n");
2829 res = platform_get_resource_byname(ndev,
2830 IORESOURCE_MEM, "regs");
2832 dev_err(&ndev->dev, "no mem resource\n");
2838 base_res = request_mem_region(res->start, resource_size(res),
2841 dev_err(&ndev->dev, "request_mem_region failed\n");
2846 base = ioremap(res->start, resource_size(res));
2848 dev_err(&ndev->dev, "registers can't be mapped\n");
2850 goto err_release_resource_reg;
2853 for (i = 0; i < DC_N_WINDOWS; i++)
2854 dc->win_syncpt[i] = NVSYNCPT_INVALID;
2856 if (TEGRA_DISPLAY_BASE == res->start) {
2857 dc->vblank_syncpt = NVSYNCPT_VBLANK0;
2858 dc->win_syncpt[0] = NVSYNCPT_DISP0_A;
2859 dc->win_syncpt[1] = NVSYNCPT_DISP0_B;
2860 dc->win_syncpt[2] = NVSYNCPT_DISP0_C;
2861 dc->valid_windows = 0x07;
2862 #ifdef CONFIG_ARCH_TEGRA_14x_SOC
2863 dc->win_syncpt[3] = NVSYNCPT_DISP0_D;
2864 dc->win_syncpt[4] = NVSYNCPT_DISP0_H;
2865 dc->valid_windows |= 0x18;
2866 #elif defined(CONFIG_ARCH_TEGRA_12x_SOC)
2867 dc->win_syncpt[3] = NVSYNCPT_DISP0_D;
2868 dc->valid_windows |= 0x08;
2870 dc->powergate_id = TEGRA_POWERGATE_DISA;
2871 #ifdef CONFIG_TEGRA_ISOMGR
2872 isomgr_client_id = TEGRA_ISO_CLIENT_DISP_0;
2874 } else if (TEGRA_DISPLAY2_BASE == res->start) {
2875 dc->vblank_syncpt = NVSYNCPT_VBLANK1;
2876 dc->win_syncpt[0] = NVSYNCPT_DISP1_A;
2877 dc->win_syncpt[1] = NVSYNCPT_DISP1_B;
2878 dc->win_syncpt[2] = NVSYNCPT_DISP1_C;
2879 dc->valid_windows = 0x07;
2880 #ifdef CONFIG_ARCH_TEGRA_14x_SOC
2881 dc->win_syncpt[4] = NVSYNCPT_DISP1_H;
2882 dc->valid_windows |= 0x10;
2884 dc->powergate_id = TEGRA_POWERGATE_DISB;
2885 #ifdef CONFIG_TEGRA_ISOMGR
2886 isomgr_client_id = TEGRA_ISO_CLIENT_DISP_1;
2890 "Unknown base address %llx: unable to assign syncpt\n",
2895 struct resource of_fb_res;
2897 tegra_get_fb_resource(&of_fb_res);
2898 else /*ndev->id == 1*/
2899 tegra_get_fb2_resource(&of_fb_res);
2901 fb_mem = kzalloc(sizeof(struct resource), GFP_KERNEL);
2902 if (fb_mem == NULL) {
2904 goto err_iounmap_reg;
2906 fb_mem->name = "fbmem";
2907 fb_mem->flags = IORESOURCE_MEM;
2908 fb_mem->start = (resource_size_t)of_fb_res.start;
2909 fb_mem->end = (resource_size_t)of_fb_res.end;
2911 fb_mem = platform_get_resource_byname(ndev,
2912 IORESOURCE_MEM, "fbmem");
2915 clk = clk_get(&ndev->dev, NULL);
2916 if (IS_ERR_OR_NULL(clk)) {
2917 dev_err(&ndev->dev, "can't get clock\n");
2919 goto err_iounmap_reg;
2923 dc->shift_clk_div.mul = dc->shift_clk_div.div = 1;
2924 /* Initialize one shot work delay, it will be assigned by dsi
2925 * according to refresh rate later. */
2926 dc->one_shot_delay_ms = 40;
2928 dc->base_res = base_res;
2934 dc->pdata = ndev->dev.platform_data;
2936 dc->pdata = dt_pdata;
2940 mutex_init(&dc->lock);
2941 mutex_init(&dc->one_shot_lock);
2942 mutex_init(&dc->lp_lock);
2943 init_completion(&dc->frame_end_complete);
2944 init_completion(&dc->crc_complete);
2945 init_waitqueue_head(&dc->wq);
2946 init_waitqueue_head(&dc->timestamp_wq);
2947 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
2948 INIT_WORK(&dc->reset_work, tegra_dc_reset_worker);
2950 INIT_WORK(&dc->vblank_work, tegra_dc_vblank);
2951 dc->vblank_ref_count = 0;
2952 #if !defined(CONFIG_ARCH_TEGRA_2x_SOC) && !defined(CONFIG_ARCH_TEGRA_3x_SOC)
2953 INIT_WORK(&dc->vpulse2_work, tegra_dc_vpulse2);
2955 dc->vpulse2_ref_count = 0;
2956 INIT_DELAYED_WORK(&dc->underflow_work, tegra_dc_underflow_worker);
2957 INIT_DELAYED_WORK(&dc->one_shot_work, tegra_dc_one_shot_worker);
2959 tegra_dc_init_lut_defaults(&dc->fb_lut);
2961 dc->n_windows = DC_N_WINDOWS;
2962 for (i = 0; i < DC_N_WINDOWS; i++) {
2963 struct tegra_dc_win *win = &dc->windows[i];
2964 struct tegra_dc_win *tmp_win = &dc->tmp_wins[i];
2965 if (!test_bit(i, &dc->valid_windows))
2966 win->flags |= TEGRA_WIN_FLAG_INVALID;
2971 tegra_dc_init_csc_defaults(&win->csc);
2972 tegra_dc_init_lut_defaults(&win->lut);
2975 ret = tegra_dc_set(dc, ndev->id);
2977 dev_err(&ndev->dev, "can't add dc\n");
2981 platform_set_drvdata(ndev, dc);
2983 #ifdef CONFIG_SWITCH
2984 dc->modeset_switch.name = dev_name(&ndev->dev);
2985 dc->modeset_switch.state = 0;
2986 dc->modeset_switch.print_state = switch_modeset_print_mode;
2987 ret = switch_dev_register(&dc->modeset_switch);
2989 dev_err(&ndev->dev, "failed to register switch driver\n");
2992 tegra_dc_feature_register(dc);
2994 if (dc->pdata->default_out) {
2995 ret = tegra_dc_set_out(dc, dc->pdata->default_out);
2997 dev_err(&dc->ndev->dev, "failed to initialize DC out ops\n");
3002 "No default output specified. Leaving output disabled.\n");
3004 dc->mode_dirty = false; /* ignore changes tegra_dc_set_out has done */
3006 #ifndef CONFIG_TEGRA_ISOMGR
3008 * The emc is a shared clock, it will be set based on
3009 * the requirements for each user on the bus.
3011 emc_clk = clk_get(&ndev->dev, "emc");
3012 if (IS_ERR_OR_NULL(emc_clk)) {
3013 dev_err(&ndev->dev, "can't get emc clock\n");
3017 dc->emc_clk = emc_clk;
3020 dc->ext = tegra_dc_ext_register(ndev, dc);
3021 if (IS_ERR_OR_NULL(dc->ext)) {
3022 dev_warn(&ndev->dev, "Failed to enable Tegra DC extensions.\n");
3026 /* interrupt handler must be registered before tegra_fb_register() */
3027 if (request_threaded_irq(irq, NULL, tegra_dc_irq, IRQF_ONESHOT,
3028 dev_name(&ndev->dev), dc)) {
3029 dev_err(&ndev->dev, "request_irq %d failed\n", irq);
3031 goto err_disable_dc;
3035 tegra_pd_add_device(&ndev->dev);
3036 pm_runtime_use_autosuspend(&ndev->dev);
3037 pm_runtime_set_autosuspend_delay(&ndev->dev, 100);
3038 pm_runtime_enable(&ndev->dev);
3040 #ifdef CONFIG_TEGRA_DC_CMU
3041 /* if bootloader leaves this head enabled, then skip CMU programming. */
3042 dc->cmu_dirty = (dc->pdata->flags & TEGRA_DC_FLAG_ENABLED) == 0;
3043 dc->cmu_enabled = dc->pdata->cmu_enable;
3046 if (dc->pdata->flags & TEGRA_DC_FLAG_ENABLED) {
3047 _tegra_dc_set_default_videomode(dc);
3048 dc->enabled = _tegra_dc_enable(dc);
3050 #if !defined(CONFIG_ARCH_TEGRA_11x_SOC) && !defined(CONFIG_ARCH_TEGRA_14x_SOC)
3051 /* BL or PG init will keep DISA unpowergated after booting.
3052 * Adding an extra powergate to balance the refcount
3053 * since _tegra_dc_enable() increases the refcount.
3055 if (dc->powergate_id == TEGRA_POWERGATE_DISA)
3056 tegra_dc_powergate_locked(dc);
3060 #ifdef CONFIG_TEGRA_ISOMGR
3061 if (isomgr_client_id == -1) {
3062 dc->isomgr_handle = NULL;
3064 dc->isomgr_handle = tegra_isomgr_register(isomgr_client_id,
3065 tegra_dc_calc_min_bandwidth(dc),
3066 tegra_dc_bandwidth_renegotiate, dc);
3067 if (IS_ERR(dc->isomgr_handle)) {
3068 dev_err(&dc->ndev->dev,
3069 "could not register isomgr. err=%ld\n",
3070 PTR_ERR(dc->isomgr_handle));
3074 dc->reserved_bw = tegra_dc_calc_min_bandwidth(dc);
3076 * Use maximum value so we can try to reserve as much as
3077 * needed until we are told by isomgr to backoff.
3079 dc->available_bw = UINT_MAX;
3083 tegra_dc_create_debugfs(dc);
3085 dev_info(&ndev->dev, "probed\n");
3087 if (dc->pdata->fb) {
3088 if (dc->enabled && dc->pdata->fb->bits_per_pixel == -1) {
3091 WINDOW_A_SELECT << dc->pdata->fb->win,
3092 DC_CMD_DISPLAY_WINDOW_HEADER);
3094 fmt = tegra_dc_readl(dc, DC_WIN_COLOR_DEPTH);
3095 dc->pdata->fb->bits_per_pixel =
3096 tegra_dc_fmt_bpp(fmt);
3099 mode = tegra_dc_get_override_mode(dc);
3101 dc->pdata->fb->xres = mode->h_active;
3102 dc->pdata->fb->yres = mode->v_active;
3105 tegra_dc_io_start(dc);
3106 dc->fb = tegra_fb_register(ndev, dc, dc->pdata->fb, fb_mem);
3107 tegra_dc_io_end(dc);
3108 if (IS_ERR_OR_NULL(dc->fb)) {
3110 dev_err(&ndev->dev, "failed to register fb\n");
3111 goto err_remove_debugfs;
3115 if (dc->out && dc->out->hotplug_init)
3116 dc->out->hotplug_init(&ndev->dev);
3119 if (dc->out_ops->detect)
3120 dc->connected = dc->out_ops->detect(dc);
3122 dc->connected = true;
3125 dc->connected = false;
3127 /* Powergate display module when it's unconnected. */
3128 /* detect() function, if presetns, responsible for the powergate */
3129 if (!tegra_dc_get_connected(dc) &&
3130 !(dc->out_ops && dc->out_ops->detect))
3131 tegra_dc_powergate_locked(dc);
3133 tegra_dc_create_sysfs(&dc->ndev->dev);
3136 * Overriding the display mode only applies for modes set up during
3137 * boot. It should not apply for e.g. HDMI hotplug.
3139 dc->initialized = false;
3144 tegra_dc_remove_debugfs(dc);
3148 tegra_dc_ext_disable(dc->ext);
3149 tegra_dc_ext_unregister(dc->ext);
3151 mutex_lock(&dc->lock);
3153 _tegra_dc_disable(dc);
3154 dc->enabled = false;
3155 mutex_unlock(&dc->lock);
3156 #ifdef CONFIG_SWITCH
3157 switch_dev_unregister(&dc->modeset_switch);
3159 #ifdef CONFIG_TEGRA_ISOMGR
3160 tegra_isomgr_unregister(dc->isomgr_handle);
3170 release_resource(fb_mem);
3174 err_release_resource_reg:
3175 release_resource(base_res);
3182 static int tegra_dc_remove(struct platform_device *ndev)
3184 struct tegra_dc *dc = platform_get_drvdata(ndev);
3185 struct device_node *np = ndev->dev.of_node;
3187 tegra_dc_remove_sysfs(&dc->ndev->dev);
3188 tegra_dc_remove_debugfs(dc);
3191 tegra_fb_unregister(dc->fb);
3194 release_resource(dc->fb_mem);
3200 tegra_dc_ext_disable(dc->ext);
3203 tegra_dc_ext_unregister(dc->ext);
3205 mutex_lock(&dc->lock);
3207 _tegra_dc_disable(dc);
3208 dc->enabled = false;
3209 mutex_unlock(&dc->lock);
3210 synchronize_irq(dc->irq); /* wait for IRQ handlers to finish */
3212 #ifdef CONFIG_SWITCH
3213 switch_dev_unregister(&dc->modeset_switch);
3215 free_irq(dc->irq, dc);
3216 #ifdef CONFIG_TEGRA_ISOMGR
3217 if (dc->isomgr_handle) {
3218 tegra_isomgr_unregister(dc->isomgr_handle);
3219 dc->isomgr_handle = NULL;
3222 clk_put(dc->emc_clk);
3227 release_resource(dc->base_res);
3229 tegra_dc_set(NULL, ndev->id);
3235 static int tegra_dc_suspend(struct platform_device *ndev, pm_message_t state)
3237 struct tegra_dc *dc = platform_get_drvdata(ndev);
3240 trace_display_suspend(dc);
3241 dev_info(&ndev->dev, "suspend\n");
3243 tegra_dc_ext_disable(dc->ext);
3245 mutex_lock(&dc->lock);
3246 ret = tegra_dc_io_start(dc);
3248 if (dc->out_ops && dc->out_ops->suspend)
3249 dc->out_ops->suspend(dc);
3252 _tegra_dc_disable(dc);
3254 dc->suspended = true;
3257 if (dc->out && dc->out->postsuspend) {
3258 dc->out->postsuspend();
3259 /* avoid resume event due to voltage falling on interfaces that
3260 * support hotplug wake. And only do this if a panel is
3261 * connected, if we are already disconnected, then no phantom
3262 * hotplug can occur by disabling the voltage.
3264 if ((dc->out->flags & TEGRA_DC_OUT_HOTPLUG_WAKE_LP0)
3265 && tegra_dc_get_connected(dc))
3270 tegra_dc_io_end(dc);
3272 #ifdef CONFIG_TEGRA_DC_CMU
3274 * CMU settings are lost when the DC goes to sleep. User-space will
3275 * perform a blank ioctl upon resume which will call tegra_dc_init()
3276 * and apply CMU settings again, but only if the cached values are
3277 * different from those specified. Clearing the cache here ensures
3278 * that this will happen.
3280 * It would be better to reapply the CMU settings in tegra_dc_resume(),
3281 * but color corruption sometimes happens if we do so and
3282 * tegra_dc_init() seems to be the only safe place for this.
3284 memset(&dc->cmu, 0, sizeof(dc->cmu));
3287 mutex_unlock(&dc->lock);
3288 synchronize_irq(dc->irq); /* wait for IRQ handlers to finish */
3293 static int tegra_dc_resume(struct platform_device *ndev)
3295 struct tegra_dc *dc = platform_get_drvdata(ndev);
3297 trace_display_resume(dc);
3298 dev_info(&ndev->dev, "resume\n");
3300 mutex_lock(&dc->lock);
3301 dc->suspended = false;
3303 /* To pan the fb on resume */
3304 tegra_fb_pan_display_reset(dc->fb);
3307 dc->enabled = false;
3308 _tegra_dc_set_default_videomode(dc);
3309 dc->enabled = _tegra_dc_enable(dc);
3312 if (dc->out && dc->out->hotplug_init)
3313 dc->out->hotplug_init(&ndev->dev);
3315 if (dc->out_ops && dc->out_ops->resume)
3316 dc->out_ops->resume(dc);
3318 mutex_unlock(&dc->lock);
3323 #endif /* CONFIG_PM */
3325 static void tegra_dc_shutdown(struct platform_device *ndev)
3327 struct tegra_dc *dc = platform_get_drvdata(ndev);
3329 if (WARN_ON(!dc || !dc->out || !dc->out_ops))
3335 tegra_dc_disable(dc);
3338 extern int suspend_set(const char *val, struct kernel_param *kp)
3340 if (!strcmp(val, "dump"))
3341 dump_regs(tegra_dcs[0]);
3343 else if (!strcmp(val, "suspend"))
3344 tegra_dc_suspend(tegra_dcs[0]->ndev, PMSG_SUSPEND);
3345 else if (!strcmp(val, "resume"))
3346 tegra_dc_resume(tegra_dcs[0]->ndev);
3352 extern int suspend_get(char *buffer, struct kernel_param *kp)
3359 module_param_call(suspend, suspend_set, suspend_get, &suspend, 0644);
3363 static struct of_device_id tegra_display_of_match[] = {
3364 {.compatible = "nvidia,tegra114-dc", },
3365 {.compatible = "nvidia,tegra124-dc", },
3370 struct platform_driver tegra_dc_driver = {
3373 .owner = THIS_MODULE,
3376 of_match_ptr(tegra_display_of_match),
3379 .probe = tegra_dc_probe,
3380 .remove = tegra_dc_remove,
3382 .suspend = tegra_dc_suspend,
3383 .resume = tegra_dc_resume,
3385 .shutdown = tegra_dc_shutdown,
3389 static int __init parse_disp_params(char *options, struct tegra_dc_mode *mode)
3394 for (i = 0; i < ARRAY_SIZE(params); i++) {
3395 if ((p = strsep(&options, ",")) != NULL) {
3397 params[i] = simple_strtoul(p, &p, 10);
3402 if ((mode->pclk = params[0]) == 0)
3405 mode->h_active = params[1];
3406 mode->v_active = params[2];
3407 mode->h_ref_to_sync = params[3];
3408 mode->v_ref_to_sync = params[4];
3409 mode->h_sync_width = params[5];
3410 mode->v_sync_width = params[6];
3411 mode->h_back_porch = params[7];
3412 mode->v_back_porch = params[8];
3413 mode->h_front_porch = params[9];
3414 mode->v_front_porch = params[10];
3419 static int __init tegra_dc_mode_override(char *str)
3421 char *p = str, *options;
3426 p = strstr(str, "hdmi:");
3429 options = strsep(&p, ";");
3430 if (parse_disp_params(options, &override_disp_mode[TEGRA_DC_OUT_HDMI]))
3434 p = strstr(str, "rgb:");
3437 options = strsep(&p, ";");
3438 if (parse_disp_params(options, &override_disp_mode[TEGRA_DC_OUT_RGB]))
3442 p = strstr(str, "dsi:");
3445 options = strsep(&p, ";");
3446 if (parse_disp_params(options, &override_disp_mode[TEGRA_DC_OUT_DSI]))
3453 __setup("disp_params=", tegra_dc_mode_override);
3456 static int __init tegra_dc_module_init(void)
3458 int ret = tegra_dc_ext_module_init();
3461 return platform_driver_register(&tegra_dc_driver);
3464 static void __exit tegra_dc_module_exit(void)
3466 platform_driver_unregister(&tegra_dc_driver);
3467 tegra_dc_ext_module_exit();
3470 module_exit(tegra_dc_module_exit);
3471 module_init(tegra_dc_module_init);