blob: be1ad42c69be728d5c883dafb99341d875a3eafa [file] [log] [blame]
Thierry Reding6b6b6042013-11-15 16:06:05 +01001/*
2 * Copyright (C) 2013 NVIDIA Corporation
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 */
8
9#include <linux/clk.h>
Thierry Redinga82752e2014-01-31 10:02:15 +010010#include <linux/debugfs.h>
Thierry Reding6fad8f62014-11-28 15:41:34 +010011#include <linux/gpio.h>
Thierry Reding6b6b6042013-11-15 16:06:05 +010012#include <linux/io.h>
13#include <linux/platform_device.h>
14#include <linux/reset.h>
Thierry Reding306a7f92014-07-17 13:17:24 +020015
Thierry Reding72323982014-07-11 13:19:06 +020016#include <soc/tegra/pmc.h>
Thierry Reding6b6b6042013-11-15 16:06:05 +010017
18#include <drm/drm_dp_helper.h>
Thierry Reding6fad8f62014-11-28 15:41:34 +010019#include <drm/drm_panel.h>
Thierry Reding6b6b6042013-11-15 16:06:05 +010020
21#include "dc.h"
22#include "drm.h"
23#include "sor.h"
24
25struct tegra_sor {
26 struct host1x_client client;
27 struct tegra_output output;
28 struct device *dev;
29
30 void __iomem *regs;
31
32 struct reset_control *rst;
33 struct clk *clk_parent;
34 struct clk *clk_safe;
35 struct clk *clk_dp;
36 struct clk *clk;
37
38 struct tegra_dpaux *dpaux;
39
Thierry Reding86f5c522014-03-26 11:13:16 +010040 struct mutex lock;
Thierry Reding6b6b6042013-11-15 16:06:05 +010041 bool enabled;
Thierry Redinga82752e2014-01-31 10:02:15 +010042
43 struct dentry *debugfs;
Thierry Reding6b6b6042013-11-15 16:06:05 +010044};
45
Thierry Reding34fa1832014-06-05 16:31:10 +020046struct tegra_sor_config {
47 u32 bits_per_pixel;
48
49 u32 active_polarity;
50 u32 active_count;
51 u32 tu_size;
52 u32 active_frac;
53 u32 watermark;
Thierry Reding7890b572014-06-05 16:12:46 +020054
55 u32 hblank_symbols;
56 u32 vblank_symbols;
Thierry Reding34fa1832014-06-05 16:31:10 +020057};
58
Thierry Reding6b6b6042013-11-15 16:06:05 +010059static inline struct tegra_sor *
60host1x_client_to_sor(struct host1x_client *client)
61{
62 return container_of(client, struct tegra_sor, client);
63}
64
65static inline struct tegra_sor *to_sor(struct tegra_output *output)
66{
67 return container_of(output, struct tegra_sor, output);
68}
69
70static inline unsigned long tegra_sor_readl(struct tegra_sor *sor,
71 unsigned long offset)
72{
73 return readl(sor->regs + (offset << 2));
74}
75
76static inline void tegra_sor_writel(struct tegra_sor *sor, unsigned long value,
77 unsigned long offset)
78{
79 writel(value, sor->regs + (offset << 2));
80}
81
82static int tegra_sor_dp_train_fast(struct tegra_sor *sor,
83 struct drm_dp_link *link)
84{
85 unsigned long value;
86 unsigned int i;
87 u8 pattern;
88 int err;
89
90 /* setup lane parameters */
91 value = SOR_LANE_DRIVE_CURRENT_LANE3(0x40) |
92 SOR_LANE_DRIVE_CURRENT_LANE2(0x40) |
93 SOR_LANE_DRIVE_CURRENT_LANE1(0x40) |
94 SOR_LANE_DRIVE_CURRENT_LANE0(0x40);
95 tegra_sor_writel(sor, value, SOR_LANE_DRIVE_CURRENT_0);
96
97 value = SOR_LANE_PREEMPHASIS_LANE3(0x0f) |
98 SOR_LANE_PREEMPHASIS_LANE2(0x0f) |
99 SOR_LANE_PREEMPHASIS_LANE1(0x0f) |
100 SOR_LANE_PREEMPHASIS_LANE0(0x0f);
101 tegra_sor_writel(sor, value, SOR_LANE_PREEMPHASIS_0);
102
103 value = SOR_LANE_POST_CURSOR_LANE3(0x00) |
104 SOR_LANE_POST_CURSOR_LANE2(0x00) |
105 SOR_LANE_POST_CURSOR_LANE1(0x00) |
106 SOR_LANE_POST_CURSOR_LANE0(0x00);
107 tegra_sor_writel(sor, value, SOR_LANE_POST_CURSOR_0);
108
109 /* disable LVDS mode */
110 tegra_sor_writel(sor, 0, SOR_LVDS);
111
112 value = tegra_sor_readl(sor, SOR_DP_PADCTL_0);
113 value |= SOR_DP_PADCTL_TX_PU_ENABLE;
114 value &= ~SOR_DP_PADCTL_TX_PU_MASK;
115 value |= SOR_DP_PADCTL_TX_PU(2); /* XXX: don't hardcode? */
116 tegra_sor_writel(sor, value, SOR_DP_PADCTL_0);
117
118 value = tegra_sor_readl(sor, SOR_DP_PADCTL_0);
119 value |= SOR_DP_PADCTL_CM_TXD_3 | SOR_DP_PADCTL_CM_TXD_2 |
120 SOR_DP_PADCTL_CM_TXD_1 | SOR_DP_PADCTL_CM_TXD_0;
121 tegra_sor_writel(sor, value, SOR_DP_PADCTL_0);
122
123 usleep_range(10, 100);
124
125 value = tegra_sor_readl(sor, SOR_DP_PADCTL_0);
126 value &= ~(SOR_DP_PADCTL_CM_TXD_3 | SOR_DP_PADCTL_CM_TXD_2 |
127 SOR_DP_PADCTL_CM_TXD_1 | SOR_DP_PADCTL_CM_TXD_0);
128 tegra_sor_writel(sor, value, SOR_DP_PADCTL_0);
129
130 err = tegra_dpaux_prepare(sor->dpaux, DP_SET_ANSI_8B10B);
131 if (err < 0)
132 return err;
133
134 for (i = 0, value = 0; i < link->num_lanes; i++) {
135 unsigned long lane = SOR_DP_TPG_CHANNEL_CODING |
136 SOR_DP_TPG_SCRAMBLER_NONE |
137 SOR_DP_TPG_PATTERN_TRAIN1;
138 value = (value << 8) | lane;
139 }
140
141 tegra_sor_writel(sor, value, SOR_DP_TPG);
142
143 pattern = DP_TRAINING_PATTERN_1;
144
145 err = tegra_dpaux_train(sor->dpaux, link, pattern);
146 if (err < 0)
147 return err;
148
149 value = tegra_sor_readl(sor, SOR_DP_SPARE_0);
150 value |= SOR_DP_SPARE_SEQ_ENABLE;
151 value &= ~SOR_DP_SPARE_PANEL_INTERNAL;
152 value |= SOR_DP_SPARE_MACRO_SOR_CLK;
153 tegra_sor_writel(sor, value, SOR_DP_SPARE_0);
154
155 for (i = 0, value = 0; i < link->num_lanes; i++) {
156 unsigned long lane = SOR_DP_TPG_CHANNEL_CODING |
157 SOR_DP_TPG_SCRAMBLER_NONE |
158 SOR_DP_TPG_PATTERN_TRAIN2;
159 value = (value << 8) | lane;
160 }
161
162 tegra_sor_writel(sor, value, SOR_DP_TPG);
163
164 pattern = DP_LINK_SCRAMBLING_DISABLE | DP_TRAINING_PATTERN_2;
165
166 err = tegra_dpaux_train(sor->dpaux, link, pattern);
167 if (err < 0)
168 return err;
169
170 for (i = 0, value = 0; i < link->num_lanes; i++) {
171 unsigned long lane = SOR_DP_TPG_CHANNEL_CODING |
172 SOR_DP_TPG_SCRAMBLER_GALIOS |
173 SOR_DP_TPG_PATTERN_NONE;
174 value = (value << 8) | lane;
175 }
176
177 tegra_sor_writel(sor, value, SOR_DP_TPG);
178
179 pattern = DP_TRAINING_PATTERN_DISABLE;
180
181 err = tegra_dpaux_train(sor->dpaux, link, pattern);
182 if (err < 0)
183 return err;
184
185 return 0;
186}
187
188static void tegra_sor_super_update(struct tegra_sor *sor)
189{
190 tegra_sor_writel(sor, 0, SOR_SUPER_STATE_0);
191 tegra_sor_writel(sor, 1, SOR_SUPER_STATE_0);
192 tegra_sor_writel(sor, 0, SOR_SUPER_STATE_0);
193}
194
195static void tegra_sor_update(struct tegra_sor *sor)
196{
197 tegra_sor_writel(sor, 0, SOR_STATE_0);
198 tegra_sor_writel(sor, 1, SOR_STATE_0);
199 tegra_sor_writel(sor, 0, SOR_STATE_0);
200}
201
202static int tegra_sor_setup_pwm(struct tegra_sor *sor, unsigned long timeout)
203{
204 unsigned long value;
205
206 value = tegra_sor_readl(sor, SOR_PWM_DIV);
207 value &= ~SOR_PWM_DIV_MASK;
208 value |= 0x400; /* period */
209 tegra_sor_writel(sor, value, SOR_PWM_DIV);
210
211 value = tegra_sor_readl(sor, SOR_PWM_CTL);
212 value &= ~SOR_PWM_CTL_DUTY_CYCLE_MASK;
213 value |= 0x400; /* duty cycle */
214 value &= ~SOR_PWM_CTL_CLK_SEL; /* clock source: PCLK */
215 value |= SOR_PWM_CTL_TRIGGER;
216 tegra_sor_writel(sor, value, SOR_PWM_CTL);
217
218 timeout = jiffies + msecs_to_jiffies(timeout);
219
220 while (time_before(jiffies, timeout)) {
221 value = tegra_sor_readl(sor, SOR_PWM_CTL);
222 if ((value & SOR_PWM_CTL_TRIGGER) == 0)
223 return 0;
224
225 usleep_range(25, 100);
226 }
227
228 return -ETIMEDOUT;
229}
230
231static int tegra_sor_attach(struct tegra_sor *sor)
232{
233 unsigned long value, timeout;
234
235 /* wake up in normal mode */
236 value = tegra_sor_readl(sor, SOR_SUPER_STATE_1);
237 value |= SOR_SUPER_STATE_HEAD_MODE_AWAKE;
238 value |= SOR_SUPER_STATE_MODE_NORMAL;
239 tegra_sor_writel(sor, value, SOR_SUPER_STATE_1);
240 tegra_sor_super_update(sor);
241
242 /* attach */
243 value = tegra_sor_readl(sor, SOR_SUPER_STATE_1);
244 value |= SOR_SUPER_STATE_ATTACHED;
245 tegra_sor_writel(sor, value, SOR_SUPER_STATE_1);
246 tegra_sor_super_update(sor);
247
248 timeout = jiffies + msecs_to_jiffies(250);
249
250 while (time_before(jiffies, timeout)) {
251 value = tegra_sor_readl(sor, SOR_TEST);
252 if ((value & SOR_TEST_ATTACHED) != 0)
253 return 0;
254
255 usleep_range(25, 100);
256 }
257
258 return -ETIMEDOUT;
259}
260
261static int tegra_sor_wakeup(struct tegra_sor *sor)
262{
263 struct tegra_dc *dc = to_tegra_dc(sor->output.encoder.crtc);
264 unsigned long value, timeout;
265
266 /* enable display controller outputs */
267 value = tegra_dc_readl(dc, DC_CMD_DISPLAY_POWER_CONTROL);
268 value |= PW0_ENABLE | PW1_ENABLE | PW2_ENABLE | PW3_ENABLE |
269 PW4_ENABLE | PM0_ENABLE | PM1_ENABLE;
270 tegra_dc_writel(dc, value, DC_CMD_DISPLAY_POWER_CONTROL);
271
Thierry Reding62b9e062014-11-21 17:33:33 +0100272 tegra_dc_commit(dc);
Thierry Reding6b6b6042013-11-15 16:06:05 +0100273
274 timeout = jiffies + msecs_to_jiffies(250);
275
276 /* wait for head to wake up */
277 while (time_before(jiffies, timeout)) {
278 value = tegra_sor_readl(sor, SOR_TEST);
279 value &= SOR_TEST_HEAD_MODE_MASK;
280
281 if (value == SOR_TEST_HEAD_MODE_AWAKE)
282 return 0;
283
284 usleep_range(25, 100);
285 }
286
287 return -ETIMEDOUT;
288}
289
290static int tegra_sor_power_up(struct tegra_sor *sor, unsigned long timeout)
291{
292 unsigned long value;
293
294 value = tegra_sor_readl(sor, SOR_PWR);
295 value |= SOR_PWR_TRIGGER | SOR_PWR_NORMAL_STATE_PU;
296 tegra_sor_writel(sor, value, SOR_PWR);
297
298 timeout = jiffies + msecs_to_jiffies(timeout);
299
300 while (time_before(jiffies, timeout)) {
301 value = tegra_sor_readl(sor, SOR_PWR);
302 if ((value & SOR_PWR_TRIGGER) == 0)
303 return 0;
304
305 usleep_range(25, 100);
306 }
307
308 return -ETIMEDOUT;
309}
310
Thierry Reding34fa1832014-06-05 16:31:10 +0200311struct tegra_sor_params {
312 /* number of link clocks per line */
313 unsigned int num_clocks;
314 /* ratio between input and output */
315 u64 ratio;
316 /* precision factor */
317 u64 precision;
318
319 unsigned int active_polarity;
320 unsigned int active_count;
321 unsigned int active_frac;
322 unsigned int tu_size;
323 unsigned int error;
324};
325
326static int tegra_sor_compute_params(struct tegra_sor *sor,
327 struct tegra_sor_params *params,
328 unsigned int tu_size)
329{
330 u64 active_sym, active_count, frac, approx;
331 u32 active_polarity, active_frac = 0;
332 const u64 f = params->precision;
333 s64 error;
334
335 active_sym = params->ratio * tu_size;
336 active_count = div_u64(active_sym, f) * f;
337 frac = active_sym - active_count;
338
339 /* fraction < 0.5 */
340 if (frac >= (f / 2)) {
341 active_polarity = 1;
342 frac = f - frac;
343 } else {
344 active_polarity = 0;
345 }
346
347 if (frac != 0) {
348 frac = div_u64(f * f, frac); /* 1/fraction */
349 if (frac <= (15 * f)) {
350 active_frac = div_u64(frac, f);
351
352 /* round up */
353 if (active_polarity)
354 active_frac++;
355 } else {
356 active_frac = active_polarity ? 1 : 15;
357 }
358 }
359
360 if (active_frac == 1)
361 active_polarity = 0;
362
363 if (active_polarity == 1) {
364 if (active_frac) {
365 approx = active_count + (active_frac * (f - 1)) * f;
366 approx = div_u64(approx, active_frac * f);
367 } else {
368 approx = active_count + f;
369 }
370 } else {
371 if (active_frac)
372 approx = active_count + div_u64(f, active_frac);
373 else
374 approx = active_count;
375 }
376
377 error = div_s64(active_sym - approx, tu_size);
378 error *= params->num_clocks;
379
380 if (error <= 0 && abs64(error) < params->error) {
381 params->active_count = div_u64(active_count, f);
382 params->active_polarity = active_polarity;
383 params->active_frac = active_frac;
384 params->error = abs64(error);
385 params->tu_size = tu_size;
386
387 if (error == 0)
388 return true;
389 }
390
391 return false;
392}
393
394static int tegra_sor_calc_config(struct tegra_sor *sor,
395 struct drm_display_mode *mode,
396 struct tegra_sor_config *config,
397 struct drm_dp_link *link)
398{
399 const u64 f = 100000, link_rate = link->rate * 1000;
400 const u64 pclk = mode->clock * 1000;
Thierry Reding7890b572014-06-05 16:12:46 +0200401 u64 input, output, watermark, num;
Thierry Reding34fa1832014-06-05 16:31:10 +0200402 struct tegra_sor_params params;
Thierry Reding34fa1832014-06-05 16:31:10 +0200403 u32 num_syms_per_line;
404 unsigned int i;
405
406 if (!link_rate || !link->num_lanes || !pclk || !config->bits_per_pixel)
407 return -EINVAL;
408
409 output = link_rate * 8 * link->num_lanes;
410 input = pclk * config->bits_per_pixel;
411
412 if (input >= output)
413 return -ERANGE;
414
415 memset(&params, 0, sizeof(params));
416 params.ratio = div64_u64(input * f, output);
417 params.num_clocks = div_u64(link_rate * mode->hdisplay, pclk);
418 params.precision = f;
419 params.error = 64 * f;
420 params.tu_size = 64;
421
422 for (i = params.tu_size; i >= 32; i--)
423 if (tegra_sor_compute_params(sor, &params, i))
424 break;
425
426 if (params.active_frac == 0) {
427 config->active_polarity = 0;
428 config->active_count = params.active_count;
429
430 if (!params.active_polarity)
431 config->active_count--;
432
433 config->tu_size = params.tu_size;
434 config->active_frac = 1;
435 } else {
436 config->active_polarity = params.active_polarity;
437 config->active_count = params.active_count;
438 config->active_frac = params.active_frac;
439 config->tu_size = params.tu_size;
440 }
441
442 dev_dbg(sor->dev,
443 "polarity: %d active count: %d tu size: %d active frac: %d\n",
444 config->active_polarity, config->active_count,
445 config->tu_size, config->active_frac);
446
447 watermark = params.ratio * config->tu_size * (f - params.ratio);
448 watermark = div_u64(watermark, f);
449
450 watermark = div_u64(watermark + params.error, f);
451 config->watermark = watermark + (config->bits_per_pixel / 8) + 2;
452 num_syms_per_line = (mode->hdisplay * config->bits_per_pixel) *
453 (link->num_lanes * 8);
454
455 if (config->watermark > 30) {
456 config->watermark = 30;
457 dev_err(sor->dev,
458 "unable to compute TU size, forcing watermark to %u\n",
459 config->watermark);
460 } else if (config->watermark > num_syms_per_line) {
461 config->watermark = num_syms_per_line;
462 dev_err(sor->dev, "watermark too high, forcing to %u\n",
463 config->watermark);
464 }
465
Thierry Reding7890b572014-06-05 16:12:46 +0200466 /* compute the number of symbols per horizontal blanking interval */
467 num = ((mode->htotal - mode->hdisplay) - 7) * link_rate;
468 config->hblank_symbols = div_u64(num, pclk);
469
470 if (link->capabilities & DP_LINK_CAP_ENHANCED_FRAMING)
471 config->hblank_symbols -= 3;
472
473 config->hblank_symbols -= 12 / link->num_lanes;
474
475 /* compute the number of symbols per vertical blanking interval */
476 num = (mode->hdisplay - 25) * link_rate;
477 config->vblank_symbols = div_u64(num, pclk);
478 config->vblank_symbols -= 36 / link->num_lanes + 4;
479
480 dev_dbg(sor->dev, "blank symbols: H:%u V:%u\n", config->hblank_symbols,
481 config->vblank_symbols);
482
Thierry Reding34fa1832014-06-05 16:31:10 +0200483 return 0;
484}
485
Thierry Reding6fad8f62014-11-28 15:41:34 +0100486static int tegra_sor_detach(struct tegra_sor *sor)
Thierry Reding6b6b6042013-11-15 16:06:05 +0100487{
Thierry Reding6fad8f62014-11-28 15:41:34 +0100488 unsigned long value, timeout;
489
490 /* switch to safe mode */
491 value = tegra_sor_readl(sor, SOR_SUPER_STATE_1);
492 value &= ~SOR_SUPER_STATE_MODE_NORMAL;
493 tegra_sor_writel(sor, value, SOR_SUPER_STATE_1);
494 tegra_sor_super_update(sor);
495
496 timeout = jiffies + msecs_to_jiffies(250);
497
498 while (time_before(jiffies, timeout)) {
499 value = tegra_sor_readl(sor, SOR_PWR);
500 if (value & SOR_PWR_MODE_SAFE)
501 break;
502 }
503
504 if ((value & SOR_PWR_MODE_SAFE) == 0)
505 return -ETIMEDOUT;
506
507 /* go to sleep */
508 value = tegra_sor_readl(sor, SOR_SUPER_STATE_1);
509 value &= ~SOR_SUPER_STATE_HEAD_MODE_MASK;
510 tegra_sor_writel(sor, value, SOR_SUPER_STATE_1);
511 tegra_sor_super_update(sor);
512
513 /* detach */
514 value = tegra_sor_readl(sor, SOR_SUPER_STATE_1);
515 value &= ~SOR_SUPER_STATE_ATTACHED;
516 tegra_sor_writel(sor, value, SOR_SUPER_STATE_1);
517 tegra_sor_super_update(sor);
518
519 timeout = jiffies + msecs_to_jiffies(250);
520
521 while (time_before(jiffies, timeout)) {
522 value = tegra_sor_readl(sor, SOR_TEST);
523 if ((value & SOR_TEST_ATTACHED) == 0)
524 break;
525
526 usleep_range(25, 100);
527 }
528
529 if ((value & SOR_TEST_ATTACHED) != 0)
530 return -ETIMEDOUT;
531
532 return 0;
533}
534
535static int tegra_sor_power_down(struct tegra_sor *sor)
536{
537 unsigned long value, timeout;
538 int err;
539
540 value = tegra_sor_readl(sor, SOR_PWR);
541 value &= ~SOR_PWR_NORMAL_STATE_PU;
542 value |= SOR_PWR_TRIGGER;
543 tegra_sor_writel(sor, value, SOR_PWR);
544
545 timeout = jiffies + msecs_to_jiffies(250);
546
547 while (time_before(jiffies, timeout)) {
548 value = tegra_sor_readl(sor, SOR_PWR);
549 if ((value & SOR_PWR_TRIGGER) == 0)
550 return 0;
551
552 usleep_range(25, 100);
553 }
554
555 if ((value & SOR_PWR_TRIGGER) != 0)
556 return -ETIMEDOUT;
557
558 err = clk_set_parent(sor->clk, sor->clk_safe);
559 if (err < 0)
560 dev_err(sor->dev, "failed to set safe parent clock: %d\n", err);
561
562 value = tegra_sor_readl(sor, SOR_DP_PADCTL_0);
563 value &= ~(SOR_DP_PADCTL_PD_TXD_3 | SOR_DP_PADCTL_PD_TXD_0 |
564 SOR_DP_PADCTL_PD_TXD_1 | SOR_DP_PADCTL_PD_TXD_2);
565 tegra_sor_writel(sor, value, SOR_DP_PADCTL_0);
566
567 /* stop lane sequencer */
568 value = SOR_LANE_SEQ_CTL_TRIGGER | SOR_LANE_SEQ_CTL_SEQUENCE_UP |
569 SOR_LANE_SEQ_CTL_POWER_STATE_DOWN;
570 tegra_sor_writel(sor, value, SOR_LANE_SEQ_CTL);
571
572 timeout = jiffies + msecs_to_jiffies(250);
573
574 while (time_before(jiffies, timeout)) {
575 value = tegra_sor_readl(sor, SOR_LANE_SEQ_CTL);
576 if ((value & SOR_LANE_SEQ_CTL_TRIGGER) == 0)
577 break;
578
579 usleep_range(25, 100);
580 }
581
582 if ((value & SOR_LANE_SEQ_CTL_TRIGGER) != 0)
583 return -ETIMEDOUT;
584
585 value = tegra_sor_readl(sor, SOR_PLL_2);
586 value |= SOR_PLL_2_PORT_POWERDOWN;
587 tegra_sor_writel(sor, value, SOR_PLL_2);
588
589 usleep_range(20, 100);
590
591 value = tegra_sor_readl(sor, SOR_PLL_0);
592 value |= SOR_PLL_0_POWER_OFF;
593 value |= SOR_PLL_0_VCOPD;
594 tegra_sor_writel(sor, value, SOR_PLL_0);
595
596 value = tegra_sor_readl(sor, SOR_PLL_2);
597 value |= SOR_PLL_2_SEQ_PLLCAPPD;
598 value |= SOR_PLL_2_SEQ_PLLCAPPD_ENFORCE;
599 tegra_sor_writel(sor, value, SOR_PLL_2);
600
601 usleep_range(20, 100);
602
603 return 0;
604}
605
606static int tegra_sor_crc_open(struct inode *inode, struct file *file)
607{
608 file->private_data = inode->i_private;
609
610 return 0;
611}
612
613static int tegra_sor_crc_release(struct inode *inode, struct file *file)
614{
615 return 0;
616}
617
618static int tegra_sor_crc_wait(struct tegra_sor *sor, unsigned long timeout)
619{
620 u32 value;
621
622 timeout = jiffies + msecs_to_jiffies(timeout);
623
624 while (time_before(jiffies, timeout)) {
625 value = tegra_sor_readl(sor, SOR_CRC_A);
626 if (value & SOR_CRC_A_VALID)
627 return 0;
628
629 usleep_range(100, 200);
630 }
631
632 return -ETIMEDOUT;
633}
634
635static ssize_t tegra_sor_crc_read(struct file *file, char __user *buffer,
636 size_t size, loff_t *ppos)
637{
638 struct tegra_sor *sor = file->private_data;
639 ssize_t num, err;
640 char buf[10];
641 u32 value;
642
643 mutex_lock(&sor->lock);
644
645 if (!sor->enabled) {
646 err = -EAGAIN;
647 goto unlock;
648 }
649
650 value = tegra_sor_readl(sor, SOR_STATE_1);
651 value &= ~SOR_STATE_ASY_CRC_MODE_MASK;
652 tegra_sor_writel(sor, value, SOR_STATE_1);
653
654 value = tegra_sor_readl(sor, SOR_CRC_CNTRL);
655 value |= SOR_CRC_CNTRL_ENABLE;
656 tegra_sor_writel(sor, value, SOR_CRC_CNTRL);
657
658 value = tegra_sor_readl(sor, SOR_TEST);
659 value &= ~SOR_TEST_CRC_POST_SERIALIZE;
660 tegra_sor_writel(sor, value, SOR_TEST);
661
662 err = tegra_sor_crc_wait(sor, 100);
663 if (err < 0)
664 goto unlock;
665
666 tegra_sor_writel(sor, SOR_CRC_A_RESET, SOR_CRC_A);
667 value = tegra_sor_readl(sor, SOR_CRC_B);
668
669 num = scnprintf(buf, sizeof(buf), "%08x\n", value);
670
671 err = simple_read_from_buffer(buffer, size, ppos, buf, num);
672
673unlock:
674 mutex_unlock(&sor->lock);
675 return err;
676}
677
678static const struct file_operations tegra_sor_crc_fops = {
679 .owner = THIS_MODULE,
680 .open = tegra_sor_crc_open,
681 .read = tegra_sor_crc_read,
682 .release = tegra_sor_crc_release,
683};
684
685static int tegra_sor_debugfs_init(struct tegra_sor *sor,
686 struct drm_minor *minor)
687{
688 struct dentry *entry;
689 int err = 0;
690
691 sor->debugfs = debugfs_create_dir("sor", minor->debugfs_root);
692 if (!sor->debugfs)
693 return -ENOMEM;
694
695 entry = debugfs_create_file("crc", 0644, sor->debugfs, sor,
696 &tegra_sor_crc_fops);
697 if (!entry) {
698 dev_err(sor->dev,
699 "cannot create /sys/kernel/debug/dri/%s/sor/crc\n",
700 minor->debugfs_root->d_name.name);
701 err = -ENOMEM;
702 goto remove;
703 }
704
705 return err;
706
707remove:
708 debugfs_remove(sor->debugfs);
709 sor->debugfs = NULL;
710 return err;
711}
712
713static int tegra_sor_debugfs_exit(struct tegra_sor *sor)
714{
715 debugfs_remove_recursive(sor->debugfs);
716 sor->debugfs = NULL;
717
718 return 0;
719}
720
721static void tegra_sor_connector_dpms(struct drm_connector *connector, int mode)
722{
723}
724
725static enum drm_connector_status
726tegra_sor_connector_detect(struct drm_connector *connector, bool force)
727{
728 struct tegra_output *output = connector_to_output(connector);
729 struct tegra_sor *sor = to_sor(output);
730
731 if (sor->dpaux)
732 return tegra_dpaux_detect(sor->dpaux);
733
734 return connector_status_unknown;
735}
736
737static const struct drm_connector_funcs tegra_sor_connector_funcs = {
738 .dpms = tegra_sor_connector_dpms,
739 .detect = tegra_sor_connector_detect,
740 .fill_modes = drm_helper_probe_single_connector_modes,
741 .destroy = tegra_output_connector_destroy,
742};
743
744static int tegra_sor_connector_get_modes(struct drm_connector *connector)
745{
746 struct tegra_output *output = connector_to_output(connector);
747 struct tegra_sor *sor = to_sor(output);
748 int err;
749
750 if (sor->dpaux)
751 tegra_dpaux_enable(sor->dpaux);
752
753 err = tegra_output_connector_get_modes(connector);
754
755 if (sor->dpaux)
756 tegra_dpaux_disable(sor->dpaux);
757
758 return err;
759}
760
761static enum drm_mode_status
762tegra_sor_connector_mode_valid(struct drm_connector *connector,
763 struct drm_display_mode *mode)
764{
765 return MODE_OK;
766}
767
768static const struct drm_connector_helper_funcs tegra_sor_connector_helper_funcs = {
769 .get_modes = tegra_sor_connector_get_modes,
770 .mode_valid = tegra_sor_connector_mode_valid,
771 .best_encoder = tegra_output_connector_best_encoder,
772};
773
774static const struct drm_encoder_funcs tegra_sor_encoder_funcs = {
775 .destroy = tegra_output_encoder_destroy,
776};
777
778static void tegra_sor_encoder_dpms(struct drm_encoder *encoder, int mode)
779{
780}
781
782static bool tegra_sor_encoder_mode_fixup(struct drm_encoder *encoder,
783 const struct drm_display_mode *mode,
784 struct drm_display_mode *adjusted)
785{
786 struct tegra_output *output = encoder_to_output(encoder);
787 struct tegra_dc *dc = to_tegra_dc(encoder->crtc);
788 unsigned long pclk = mode->clock * 1000;
789 struct tegra_sor *sor = to_sor(output);
790 int err;
791
792 err = tegra_dc_setup_clock(dc, sor->clk_parent, pclk, 0);
793 if (err < 0) {
794 dev_err(output->dev, "failed to setup DC clock: %d\n", err);
795 return false;
796 }
797
798 err = clk_set_rate(sor->clk_parent, pclk);
799 if (err < 0) {
800 dev_err(output->dev, "failed to set clock rate to %lu Hz\n",
801 pclk);
802 return false;
803 }
804
805 return true;
806}
807
808static void tegra_sor_encoder_prepare(struct drm_encoder *encoder)
809{
810}
811
812static void tegra_sor_encoder_commit(struct drm_encoder *encoder)
813{
814}
815
816static void tegra_sor_encoder_mode_set(struct drm_encoder *encoder,
817 struct drm_display_mode *mode,
818 struct drm_display_mode *adjusted)
819{
820 struct tegra_output *output = encoder_to_output(encoder);
821 struct tegra_dc *dc = to_tegra_dc(encoder->crtc);
Thierry Reding6b6b6042013-11-15 16:06:05 +0100822 unsigned int vbe, vse, hbe, hse, vbs, hbs, i;
823 struct tegra_sor *sor = to_sor(output);
Thierry Reding34fa1832014-06-05 16:31:10 +0200824 struct tegra_sor_config config;
825 struct drm_dp_link link;
826 struct drm_dp_aux *aux;
Thierry Reding6b6b6042013-11-15 16:06:05 +0100827 unsigned long value;
Thierry Reding86f5c522014-03-26 11:13:16 +0100828 int err = 0;
829
830 mutex_lock(&sor->lock);
Thierry Reding6b6b6042013-11-15 16:06:05 +0100831
832 if (sor->enabled)
Thierry Reding86f5c522014-03-26 11:13:16 +0100833 goto unlock;
Thierry Reding6b6b6042013-11-15 16:06:05 +0100834
835 err = clk_prepare_enable(sor->clk);
836 if (err < 0)
Thierry Reding86f5c522014-03-26 11:13:16 +0100837 goto unlock;
Thierry Reding6b6b6042013-11-15 16:06:05 +0100838
839 reset_control_deassert(sor->rst);
840
Thierry Reding6fad8f62014-11-28 15:41:34 +0100841 if (output->panel)
842 drm_panel_prepare(output->panel);
843
Thierry Reding34fa1832014-06-05 16:31:10 +0200844 /* FIXME: properly convert to struct drm_dp_aux */
845 aux = (struct drm_dp_aux *)sor->dpaux;
846
Thierry Reding6b6b6042013-11-15 16:06:05 +0100847 if (sor->dpaux) {
848 err = tegra_dpaux_enable(sor->dpaux);
849 if (err < 0)
850 dev_err(sor->dev, "failed to enable DP: %d\n", err);
Thierry Reding34fa1832014-06-05 16:31:10 +0200851
852 err = drm_dp_link_probe(aux, &link);
853 if (err < 0) {
854 dev_err(sor->dev, "failed to probe eDP link: %d\n",
855 err);
Dan Carpenter2263c462014-06-11 10:06:09 +0300856 goto unlock;
Thierry Reding34fa1832014-06-05 16:31:10 +0200857 }
Thierry Reding6b6b6042013-11-15 16:06:05 +0100858 }
859
860 err = clk_set_parent(sor->clk, sor->clk_safe);
861 if (err < 0)
862 dev_err(sor->dev, "failed to set safe parent clock: %d\n", err);
863
Thierry Reding34fa1832014-06-05 16:31:10 +0200864 memset(&config, 0, sizeof(config));
Stéphane Marchesin054b1bd2014-06-19 18:18:29 -0700865 config.bits_per_pixel = output->connector.display_info.bpc * 3;
Thierry Reding34fa1832014-06-05 16:31:10 +0200866
867 err = tegra_sor_calc_config(sor, mode, &config, &link);
868 if (err < 0)
869 dev_err(sor->dev, "failed to compute link configuration: %d\n",
870 err);
871
Thierry Reding6b6b6042013-11-15 16:06:05 +0100872 value = tegra_sor_readl(sor, SOR_CLK_CNTRL);
873 value &= ~SOR_CLK_CNTRL_DP_CLK_SEL_MASK;
874 value |= SOR_CLK_CNTRL_DP_CLK_SEL_SINGLE_DPCLK;
875 tegra_sor_writel(sor, value, SOR_CLK_CNTRL);
876
877 value = tegra_sor_readl(sor, SOR_PLL_2);
878 value &= ~SOR_PLL_2_BANDGAP_POWERDOWN;
879 tegra_sor_writel(sor, value, SOR_PLL_2);
880 usleep_range(20, 100);
881
882 value = tegra_sor_readl(sor, SOR_PLL_3);
883 value |= SOR_PLL_3_PLL_VDD_MODE_V3_3;
884 tegra_sor_writel(sor, value, SOR_PLL_3);
885
886 value = SOR_PLL_0_ICHPMP(0xf) | SOR_PLL_0_VCOCAP_RST |
887 SOR_PLL_0_PLLREG_LEVEL_V45 | SOR_PLL_0_RESISTOR_EXT;
888 tegra_sor_writel(sor, value, SOR_PLL_0);
889
890 value = tegra_sor_readl(sor, SOR_PLL_2);
891 value |= SOR_PLL_2_SEQ_PLLCAPPD;
892 value &= ~SOR_PLL_2_SEQ_PLLCAPPD_ENFORCE;
893 value |= SOR_PLL_2_LVDS_ENABLE;
894 tegra_sor_writel(sor, value, SOR_PLL_2);
895
896 value = SOR_PLL_1_TERM_COMPOUT | SOR_PLL_1_TMDS_TERM;
897 tegra_sor_writel(sor, value, SOR_PLL_1);
898
899 while (true) {
900 value = tegra_sor_readl(sor, SOR_PLL_2);
901 if ((value & SOR_PLL_2_SEQ_PLLCAPPD_ENFORCE) == 0)
902 break;
903
904 usleep_range(250, 1000);
905 }
906
907 value = tegra_sor_readl(sor, SOR_PLL_2);
908 value &= ~SOR_PLL_2_POWERDOWN_OVERRIDE;
909 value &= ~SOR_PLL_2_PORT_POWERDOWN;
910 tegra_sor_writel(sor, value, SOR_PLL_2);
911
912 /*
913 * power up
914 */
915
916 /* set safe link bandwidth (1.62 Gbps) */
917 value = tegra_sor_readl(sor, SOR_CLK_CNTRL);
918 value &= ~SOR_CLK_CNTRL_DP_LINK_SPEED_MASK;
919 value |= SOR_CLK_CNTRL_DP_LINK_SPEED_G1_62;
920 tegra_sor_writel(sor, value, SOR_CLK_CNTRL);
921
922 /* step 1 */
923 value = tegra_sor_readl(sor, SOR_PLL_2);
924 value |= SOR_PLL_2_SEQ_PLLCAPPD_ENFORCE | SOR_PLL_2_PORT_POWERDOWN |
925 SOR_PLL_2_BANDGAP_POWERDOWN;
926 tegra_sor_writel(sor, value, SOR_PLL_2);
927
928 value = tegra_sor_readl(sor, SOR_PLL_0);
929 value |= SOR_PLL_0_VCOPD | SOR_PLL_0_POWER_OFF;
930 tegra_sor_writel(sor, value, SOR_PLL_0);
931
932 value = tegra_sor_readl(sor, SOR_DP_PADCTL_0);
933 value &= ~SOR_DP_PADCTL_PAD_CAL_PD;
934 tegra_sor_writel(sor, value, SOR_DP_PADCTL_0);
935
936 /* step 2 */
937 err = tegra_io_rail_power_on(TEGRA_IO_RAIL_LVDS);
938 if (err < 0) {
939 dev_err(sor->dev, "failed to power on I/O rail: %d\n", err);
Thierry Reding86f5c522014-03-26 11:13:16 +0100940 goto unlock;
Thierry Reding6b6b6042013-11-15 16:06:05 +0100941 }
942
943 usleep_range(5, 100);
944
945 /* step 3 */
946 value = tegra_sor_readl(sor, SOR_PLL_2);
947 value &= ~SOR_PLL_2_BANDGAP_POWERDOWN;
948 tegra_sor_writel(sor, value, SOR_PLL_2);
949
950 usleep_range(20, 100);
951
952 /* step 4 */
953 value = tegra_sor_readl(sor, SOR_PLL_0);
954 value &= ~SOR_PLL_0_POWER_OFF;
955 value &= ~SOR_PLL_0_VCOPD;
956 tegra_sor_writel(sor, value, SOR_PLL_0);
957
958 value = tegra_sor_readl(sor, SOR_PLL_2);
959 value &= ~SOR_PLL_2_SEQ_PLLCAPPD_ENFORCE;
960 tegra_sor_writel(sor, value, SOR_PLL_2);
961
962 usleep_range(200, 1000);
963
964 /* step 5 */
965 value = tegra_sor_readl(sor, SOR_PLL_2);
966 value &= ~SOR_PLL_2_PORT_POWERDOWN;
967 tegra_sor_writel(sor, value, SOR_PLL_2);
968
969 /* switch to DP clock */
970 err = clk_set_parent(sor->clk, sor->clk_dp);
971 if (err < 0)
972 dev_err(sor->dev, "failed to set DP parent clock: %d\n", err);
973
Thierry Reding899451b2014-06-05 16:19:48 +0200974 /* power DP lanes */
Thierry Reding6b6b6042013-11-15 16:06:05 +0100975 value = tegra_sor_readl(sor, SOR_DP_PADCTL_0);
Thierry Reding899451b2014-06-05 16:19:48 +0200976
977 if (link.num_lanes <= 2)
978 value &= ~(SOR_DP_PADCTL_PD_TXD_3 | SOR_DP_PADCTL_PD_TXD_2);
979 else
980 value |= SOR_DP_PADCTL_PD_TXD_3 | SOR_DP_PADCTL_PD_TXD_2;
981
982 if (link.num_lanes <= 1)
983 value &= ~SOR_DP_PADCTL_PD_TXD_1;
984 else
985 value |= SOR_DP_PADCTL_PD_TXD_1;
986
987 if (link.num_lanes == 0)
988 value &= ~SOR_DP_PADCTL_PD_TXD_0;
989 else
990 value |= SOR_DP_PADCTL_PD_TXD_0;
991
Thierry Reding6b6b6042013-11-15 16:06:05 +0100992 tegra_sor_writel(sor, value, SOR_DP_PADCTL_0);
993
994 value = tegra_sor_readl(sor, SOR_DP_LINKCTL_0);
995 value &= ~SOR_DP_LINKCTL_LANE_COUNT_MASK;
Thierry Reding0c90a182014-06-05 16:29:46 +0200996 value |= SOR_DP_LINKCTL_LANE_COUNT(link.num_lanes);
Thierry Reding6b6b6042013-11-15 16:06:05 +0100997 tegra_sor_writel(sor, value, SOR_DP_LINKCTL_0);
998
999 /* start lane sequencer */
1000 value = SOR_LANE_SEQ_CTL_TRIGGER | SOR_LANE_SEQ_CTL_SEQUENCE_DOWN |
1001 SOR_LANE_SEQ_CTL_POWER_STATE_UP;
1002 tegra_sor_writel(sor, value, SOR_LANE_SEQ_CTL);
1003
1004 while (true) {
1005 value = tegra_sor_readl(sor, SOR_LANE_SEQ_CTL);
1006 if ((value & SOR_LANE_SEQ_CTL_TRIGGER) == 0)
1007 break;
1008
1009 usleep_range(250, 1000);
1010 }
1011
Thierry Redinga4263fe2014-06-05 16:16:23 +02001012 /* set link bandwidth */
Thierry Reding6b6b6042013-11-15 16:06:05 +01001013 value = tegra_sor_readl(sor, SOR_CLK_CNTRL);
1014 value &= ~SOR_CLK_CNTRL_DP_LINK_SPEED_MASK;
Thierry Redinga4263fe2014-06-05 16:16:23 +02001015 value |= drm_dp_link_rate_to_bw_code(link.rate) << 2;
Thierry Reding6b6b6042013-11-15 16:06:05 +01001016 tegra_sor_writel(sor, value, SOR_CLK_CNTRL);
1017
1018 /* set linkctl */
1019 value = tegra_sor_readl(sor, SOR_DP_LINKCTL_0);
1020 value |= SOR_DP_LINKCTL_ENABLE;
1021
1022 value &= ~SOR_DP_LINKCTL_TU_SIZE_MASK;
Thierry Reding34fa1832014-06-05 16:31:10 +02001023 value |= SOR_DP_LINKCTL_TU_SIZE(config.tu_size);
Thierry Reding6b6b6042013-11-15 16:06:05 +01001024
1025 value |= SOR_DP_LINKCTL_ENHANCED_FRAME;
1026 tegra_sor_writel(sor, value, SOR_DP_LINKCTL_0);
1027
1028 for (i = 0, value = 0; i < 4; i++) {
1029 unsigned long lane = SOR_DP_TPG_CHANNEL_CODING |
1030 SOR_DP_TPG_SCRAMBLER_GALIOS |
1031 SOR_DP_TPG_PATTERN_NONE;
1032 value = (value << 8) | lane;
1033 }
1034
1035 tegra_sor_writel(sor, value, SOR_DP_TPG);
1036
1037 value = tegra_sor_readl(sor, SOR_DP_CONFIG_0);
1038 value &= ~SOR_DP_CONFIG_WATERMARK_MASK;
Thierry Reding34fa1832014-06-05 16:31:10 +02001039 value |= SOR_DP_CONFIG_WATERMARK(config.watermark);
Thierry Reding6b6b6042013-11-15 16:06:05 +01001040
1041 value &= ~SOR_DP_CONFIG_ACTIVE_SYM_COUNT_MASK;
Thierry Reding34fa1832014-06-05 16:31:10 +02001042 value |= SOR_DP_CONFIG_ACTIVE_SYM_COUNT(config.active_count);
Thierry Reding6b6b6042013-11-15 16:06:05 +01001043
1044 value &= ~SOR_DP_CONFIG_ACTIVE_SYM_FRAC_MASK;
Thierry Reding34fa1832014-06-05 16:31:10 +02001045 value |= SOR_DP_CONFIG_ACTIVE_SYM_FRAC(config.active_frac);
Thierry Reding6b6b6042013-11-15 16:06:05 +01001046
Thierry Reding34fa1832014-06-05 16:31:10 +02001047 if (config.active_polarity)
1048 value |= SOR_DP_CONFIG_ACTIVE_SYM_POLARITY;
1049 else
1050 value &= ~SOR_DP_CONFIG_ACTIVE_SYM_POLARITY;
Thierry Reding6b6b6042013-11-15 16:06:05 +01001051
1052 value |= SOR_DP_CONFIG_ACTIVE_SYM_ENABLE;
Thierry Reding1f64ae72014-06-05 16:20:27 +02001053 value |= SOR_DP_CONFIG_DISPARITY_NEGATIVE;
Thierry Reding6b6b6042013-11-15 16:06:05 +01001054 tegra_sor_writel(sor, value, SOR_DP_CONFIG_0);
1055
1056 value = tegra_sor_readl(sor, SOR_DP_AUDIO_HBLANK_SYMBOLS);
1057 value &= ~SOR_DP_AUDIO_HBLANK_SYMBOLS_MASK;
Thierry Reding7890b572014-06-05 16:12:46 +02001058 value |= config.hblank_symbols & 0xffff;
Thierry Reding6b6b6042013-11-15 16:06:05 +01001059 tegra_sor_writel(sor, value, SOR_DP_AUDIO_HBLANK_SYMBOLS);
1060
1061 value = tegra_sor_readl(sor, SOR_DP_AUDIO_VBLANK_SYMBOLS);
1062 value &= ~SOR_DP_AUDIO_VBLANK_SYMBOLS_MASK;
Thierry Reding7890b572014-06-05 16:12:46 +02001063 value |= config.vblank_symbols & 0xffff;
Thierry Reding6b6b6042013-11-15 16:06:05 +01001064 tegra_sor_writel(sor, value, SOR_DP_AUDIO_VBLANK_SYMBOLS);
1065
1066 /* enable pad calibration logic */
1067 value = tegra_sor_readl(sor, SOR_DP_PADCTL_0);
1068 value |= SOR_DP_PADCTL_PAD_CAL_PD;
1069 tegra_sor_writel(sor, value, SOR_DP_PADCTL_0);
1070
1071 if (sor->dpaux) {
Thierry Reding6b6b6042013-11-15 16:06:05 +01001072 u8 rate, lanes;
1073
1074 err = drm_dp_link_probe(aux, &link);
1075 if (err < 0) {
1076 dev_err(sor->dev, "failed to probe eDP link: %d\n",
1077 err);
Thierry Reding86f5c522014-03-26 11:13:16 +01001078 goto unlock;
Thierry Reding6b6b6042013-11-15 16:06:05 +01001079 }
1080
1081 err = drm_dp_link_power_up(aux, &link);
1082 if (err < 0) {
1083 dev_err(sor->dev, "failed to power up eDP link: %d\n",
1084 err);
Thierry Reding86f5c522014-03-26 11:13:16 +01001085 goto unlock;
Thierry Reding6b6b6042013-11-15 16:06:05 +01001086 }
1087
1088 err = drm_dp_link_configure(aux, &link);
1089 if (err < 0) {
1090 dev_err(sor->dev, "failed to configure eDP link: %d\n",
1091 err);
Thierry Reding86f5c522014-03-26 11:13:16 +01001092 goto unlock;
Thierry Reding6b6b6042013-11-15 16:06:05 +01001093 }
1094
1095 rate = drm_dp_link_rate_to_bw_code(link.rate);
1096 lanes = link.num_lanes;
1097
1098 value = tegra_sor_readl(sor, SOR_CLK_CNTRL);
1099 value &= ~SOR_CLK_CNTRL_DP_LINK_SPEED_MASK;
1100 value |= SOR_CLK_CNTRL_DP_LINK_SPEED(rate);
1101 tegra_sor_writel(sor, value, SOR_CLK_CNTRL);
1102
1103 value = tegra_sor_readl(sor, SOR_DP_LINKCTL_0);
1104 value &= ~SOR_DP_LINKCTL_LANE_COUNT_MASK;
1105 value |= SOR_DP_LINKCTL_LANE_COUNT(lanes);
1106
1107 if (link.capabilities & DP_LINK_CAP_ENHANCED_FRAMING)
1108 value |= SOR_DP_LINKCTL_ENHANCED_FRAME;
1109
1110 tegra_sor_writel(sor, value, SOR_DP_LINKCTL_0);
1111
1112 /* disable training pattern generator */
1113
1114 for (i = 0; i < link.num_lanes; i++) {
1115 unsigned long lane = SOR_DP_TPG_CHANNEL_CODING |
1116 SOR_DP_TPG_SCRAMBLER_GALIOS |
1117 SOR_DP_TPG_PATTERN_NONE;
1118 value = (value << 8) | lane;
1119 }
1120
1121 tegra_sor_writel(sor, value, SOR_DP_TPG);
1122
1123 err = tegra_sor_dp_train_fast(sor, &link);
1124 if (err < 0) {
1125 dev_err(sor->dev, "DP fast link training failed: %d\n",
1126 err);
Thierry Reding86f5c522014-03-26 11:13:16 +01001127 goto unlock;
Thierry Reding6b6b6042013-11-15 16:06:05 +01001128 }
1129
1130 dev_dbg(sor->dev, "fast link training succeeded\n");
1131 }
1132
1133 err = tegra_sor_power_up(sor, 250);
1134 if (err < 0) {
1135 dev_err(sor->dev, "failed to power up SOR: %d\n", err);
Thierry Reding86f5c522014-03-26 11:13:16 +01001136 goto unlock;
Thierry Reding6b6b6042013-11-15 16:06:05 +01001137 }
1138
1139 /* start display controller in continuous mode */
1140 value = tegra_dc_readl(dc, DC_CMD_STATE_ACCESS);
1141 value |= WRITE_MUX;
1142 tegra_dc_writel(dc, value, DC_CMD_STATE_ACCESS);
1143
1144 tegra_dc_writel(dc, VSYNC_H_POSITION(1), DC_DISP_DISP_TIMING_OPTIONS);
1145 tegra_dc_writel(dc, DISP_CTRL_MODE_C_DISPLAY, DC_CMD_DISPLAY_COMMAND);
1146
1147 value = tegra_dc_readl(dc, DC_CMD_STATE_ACCESS);
1148 value &= ~WRITE_MUX;
1149 tegra_dc_writel(dc, value, DC_CMD_STATE_ACCESS);
1150
1151 /*
1152 * configure panel (24bpp, vsync-, hsync-, DP-A protocol, complete
1153 * raster, associate with display controller)
1154 */
Thierry Reding3f4f3b52014-07-07 15:35:06 +02001155 value = SOR_STATE_ASY_PROTOCOL_DP_A |
Thierry Reding6b6b6042013-11-15 16:06:05 +01001156 SOR_STATE_ASY_CRC_MODE_COMPLETE |
1157 SOR_STATE_ASY_OWNER(dc->pipe + 1);
Thierry Reding34fa1832014-06-05 16:31:10 +02001158
Thierry Reding3f4f3b52014-07-07 15:35:06 +02001159 if (mode->flags & DRM_MODE_FLAG_PHSYNC)
1160 value &= ~SOR_STATE_ASY_HSYNCPOL;
1161
1162 if (mode->flags & DRM_MODE_FLAG_NHSYNC)
1163 value |= SOR_STATE_ASY_HSYNCPOL;
1164
1165 if (mode->flags & DRM_MODE_FLAG_PVSYNC)
1166 value &= ~SOR_STATE_ASY_VSYNCPOL;
1167
1168 if (mode->flags & DRM_MODE_FLAG_NVSYNC)
1169 value |= SOR_STATE_ASY_VSYNCPOL;
1170
Thierry Reding34fa1832014-06-05 16:31:10 +02001171 switch (config.bits_per_pixel) {
1172 case 24:
1173 value |= SOR_STATE_ASY_PIXELDEPTH_BPP_24_444;
1174 break;
1175
1176 case 18:
1177 value |= SOR_STATE_ASY_PIXELDEPTH_BPP_18_444;
1178 break;
1179
1180 default:
1181 BUG();
1182 break;
1183 }
1184
Thierry Reding6b6b6042013-11-15 16:06:05 +01001185 tegra_sor_writel(sor, value, SOR_STATE_1);
1186
1187 /*
1188 * TODO: The video timing programming below doesn't seem to match the
1189 * register definitions.
1190 */
1191
1192 value = ((mode->vtotal & 0x7fff) << 16) | (mode->htotal & 0x7fff);
1193 tegra_sor_writel(sor, value, SOR_HEAD_STATE_1(0));
1194
1195 vse = mode->vsync_end - mode->vsync_start - 1;
1196 hse = mode->hsync_end - mode->hsync_start - 1;
1197
1198 value = ((vse & 0x7fff) << 16) | (hse & 0x7fff);
1199 tegra_sor_writel(sor, value, SOR_HEAD_STATE_2(0));
1200
1201 vbe = vse + (mode->vsync_start - mode->vdisplay);
1202 hbe = hse + (mode->hsync_start - mode->hdisplay);
1203
1204 value = ((vbe & 0x7fff) << 16) | (hbe & 0x7fff);
1205 tegra_sor_writel(sor, value, SOR_HEAD_STATE_3(0));
1206
1207 vbs = vbe + mode->vdisplay;
1208 hbs = hbe + mode->hdisplay;
1209
1210 value = ((vbs & 0x7fff) << 16) | (hbs & 0x7fff);
1211 tegra_sor_writel(sor, value, SOR_HEAD_STATE_4(0));
1212
Thierry Reding6b6b6042013-11-15 16:06:05 +01001213 /* CSTM (LVDS, link A/B, upper) */
Stéphane Marchesin143b1df2014-05-22 20:32:47 -07001214 value = SOR_CSTM_LVDS | SOR_CSTM_LINK_ACT_A | SOR_CSTM_LINK_ACT_B |
Thierry Reding6b6b6042013-11-15 16:06:05 +01001215 SOR_CSTM_UPPER;
1216 tegra_sor_writel(sor, value, SOR_CSTM);
1217
1218 /* PWM setup */
1219 err = tegra_sor_setup_pwm(sor, 250);
1220 if (err < 0) {
1221 dev_err(sor->dev, "failed to setup PWM: %d\n", err);
Thierry Reding86f5c522014-03-26 11:13:16 +01001222 goto unlock;
Thierry Reding6b6b6042013-11-15 16:06:05 +01001223 }
1224
1225 value = tegra_dc_readl(dc, DC_DISP_DISP_WIN_OPTIONS);
1226 value |= SOR_ENABLE;
1227 tegra_dc_writel(dc, value, DC_DISP_DISP_WIN_OPTIONS);
1228
1229 tegra_sor_update(sor);
1230
1231 err = tegra_sor_attach(sor);
1232 if (err < 0) {
1233 dev_err(sor->dev, "failed to attach SOR: %d\n", err);
Thierry Reding86f5c522014-03-26 11:13:16 +01001234 goto unlock;
Thierry Reding6b6b6042013-11-15 16:06:05 +01001235 }
1236
1237 err = tegra_sor_wakeup(sor);
1238 if (err < 0) {
1239 dev_err(sor->dev, "failed to enable DC: %d\n", err);
Thierry Reding86f5c522014-03-26 11:13:16 +01001240 goto unlock;
Thierry Reding6b6b6042013-11-15 16:06:05 +01001241 }
1242
Thierry Reding6fad8f62014-11-28 15:41:34 +01001243 if (output->panel)
1244 drm_panel_enable(output->panel);
1245
Thierry Reding6b6b6042013-11-15 16:06:05 +01001246 sor->enabled = true;
1247
Thierry Reding86f5c522014-03-26 11:13:16 +01001248unlock:
1249 mutex_unlock(&sor->lock);
Thierry Reding6b6b6042013-11-15 16:06:05 +01001250}
1251
Thierry Reding6fad8f62014-11-28 15:41:34 +01001252static void tegra_sor_encoder_disable(struct drm_encoder *encoder)
Thierry Reding6b6b6042013-11-15 16:06:05 +01001253{
Thierry Reding6fad8f62014-11-28 15:41:34 +01001254 struct tegra_output *output = encoder_to_output(encoder);
1255 struct tegra_dc *dc = to_tegra_dc(encoder->crtc);
Thierry Reding6b6b6042013-11-15 16:06:05 +01001256 struct tegra_sor *sor = to_sor(output);
Thierry Reding6fad8f62014-11-28 15:41:34 +01001257 u32 value;
1258 int err;
Thierry Reding86f5c522014-03-26 11:13:16 +01001259
1260 mutex_lock(&sor->lock);
Thierry Reding6b6b6042013-11-15 16:06:05 +01001261
1262 if (!sor->enabled)
Thierry Reding86f5c522014-03-26 11:13:16 +01001263 goto unlock;
Thierry Reding6b6b6042013-11-15 16:06:05 +01001264
Thierry Reding6fad8f62014-11-28 15:41:34 +01001265 if (output->panel)
1266 drm_panel_disable(output->panel);
1267
Thierry Reding6b6b6042013-11-15 16:06:05 +01001268 err = tegra_sor_detach(sor);
1269 if (err < 0) {
1270 dev_err(sor->dev, "failed to detach SOR: %d\n", err);
Thierry Reding86f5c522014-03-26 11:13:16 +01001271 goto unlock;
Thierry Reding6b6b6042013-11-15 16:06:05 +01001272 }
1273
1274 tegra_sor_writel(sor, 0, SOR_STATE_1);
1275 tegra_sor_update(sor);
1276
1277 /*
1278 * The following accesses registers of the display controller, so make
1279 * sure it's only executed when the output is attached to one.
1280 */
1281 if (dc) {
Thierry Reding6b6b6042013-11-15 16:06:05 +01001282 value = tegra_dc_readl(dc, DC_DISP_DISP_WIN_OPTIONS);
1283 value &= ~SOR_ENABLE;
1284 tegra_dc_writel(dc, value, DC_DISP_DISP_WIN_OPTIONS);
1285
Thierry Reding62b9e062014-11-21 17:33:33 +01001286 tegra_dc_commit(dc);
Thierry Reding6b6b6042013-11-15 16:06:05 +01001287 }
1288
1289 err = tegra_sor_power_down(sor);
1290 if (err < 0) {
1291 dev_err(sor->dev, "failed to power down SOR: %d\n", err);
Thierry Reding86f5c522014-03-26 11:13:16 +01001292 goto unlock;
Thierry Reding6b6b6042013-11-15 16:06:05 +01001293 }
1294
1295 if (sor->dpaux) {
1296 err = tegra_dpaux_disable(sor->dpaux);
1297 if (err < 0) {
1298 dev_err(sor->dev, "failed to disable DP: %d\n", err);
Thierry Reding86f5c522014-03-26 11:13:16 +01001299 goto unlock;
Thierry Reding6b6b6042013-11-15 16:06:05 +01001300 }
1301 }
1302
1303 err = tegra_io_rail_power_off(TEGRA_IO_RAIL_LVDS);
1304 if (err < 0) {
1305 dev_err(sor->dev, "failed to power off I/O rail: %d\n", err);
Thierry Reding86f5c522014-03-26 11:13:16 +01001306 goto unlock;
Thierry Reding6b6b6042013-11-15 16:06:05 +01001307 }
1308
Thierry Reding6fad8f62014-11-28 15:41:34 +01001309 if (output->panel)
1310 drm_panel_unprepare(output->panel);
1311
Thierry Reding6b6b6042013-11-15 16:06:05 +01001312 clk_disable_unprepare(sor->clk);
Thierry Reding6fad8f62014-11-28 15:41:34 +01001313 reset_control_assert(sor->rst);
Thierry Reding6b6b6042013-11-15 16:06:05 +01001314
1315 sor->enabled = false;
1316
Thierry Reding86f5c522014-03-26 11:13:16 +01001317unlock:
1318 mutex_unlock(&sor->lock);
Thierry Reding6b6b6042013-11-15 16:06:05 +01001319}
1320
Thierry Reding6fad8f62014-11-28 15:41:34 +01001321static const struct drm_encoder_helper_funcs tegra_sor_encoder_helper_funcs = {
1322 .dpms = tegra_sor_encoder_dpms,
1323 .mode_fixup = tegra_sor_encoder_mode_fixup,
1324 .prepare = tegra_sor_encoder_prepare,
1325 .commit = tegra_sor_encoder_commit,
1326 .mode_set = tegra_sor_encoder_mode_set,
1327 .disable = tegra_sor_encoder_disable,
Thierry Reding6b6b6042013-11-15 16:06:05 +01001328};
1329
1330static int tegra_sor_init(struct host1x_client *client)
1331{
Thierry Reding9910f5c2014-05-22 09:57:15 +02001332 struct drm_device *drm = dev_get_drvdata(client->parent);
Thierry Reding6b6b6042013-11-15 16:06:05 +01001333 struct tegra_sor *sor = host1x_client_to_sor(client);
1334 int err;
1335
1336 if (!sor->dpaux)
1337 return -ENODEV;
1338
Thierry Reding6b6b6042013-11-15 16:06:05 +01001339 sor->output.dev = sor->dev;
Thierry Reding6b6b6042013-11-15 16:06:05 +01001340
Thierry Reding6fad8f62014-11-28 15:41:34 +01001341 drm_connector_init(drm, &sor->output.connector,
1342 &tegra_sor_connector_funcs,
1343 DRM_MODE_CONNECTOR_eDP);
1344 drm_connector_helper_add(&sor->output.connector,
1345 &tegra_sor_connector_helper_funcs);
1346 sor->output.connector.dpms = DRM_MODE_DPMS_OFF;
1347
1348 if (sor->output.panel)
1349 drm_panel_attach(sor->output.panel, &sor->output.connector);
1350
1351 drm_encoder_init(drm, &sor->output.encoder, &tegra_sor_encoder_funcs,
1352 DRM_MODE_ENCODER_TMDS);
1353 drm_encoder_helper_add(&sor->output.encoder,
1354 &tegra_sor_encoder_helper_funcs);
1355
1356 drm_mode_connector_attach_encoder(&sor->output.connector,
1357 &sor->output.encoder);
1358 drm_connector_register(&sor->output.connector);
1359
1360 sor->output.encoder.possible_crtcs = 0x3;
1361
1362 if (gpio_is_valid(sor->output.hpd_gpio))
1363 enable_irq(sor->output.hpd_irq);
Thierry Reding6b6b6042013-11-15 16:06:05 +01001364
Thierry Redinga82752e2014-01-31 10:02:15 +01001365 if (IS_ENABLED(CONFIG_DEBUG_FS)) {
Thierry Reding1b0c7b42014-05-28 13:46:12 +02001366 err = tegra_sor_debugfs_init(sor, drm->primary);
Thierry Redinga82752e2014-01-31 10:02:15 +01001367 if (err < 0)
1368 dev_err(sor->dev, "debugfs setup failed: %d\n", err);
1369 }
1370
Thierry Reding6b6b6042013-11-15 16:06:05 +01001371 if (sor->dpaux) {
1372 err = tegra_dpaux_attach(sor->dpaux, &sor->output);
1373 if (err < 0) {
1374 dev_err(sor->dev, "failed to attach DP: %d\n", err);
1375 return err;
1376 }
1377 }
1378
Thierry Reding6fad8f62014-11-28 15:41:34 +01001379 err = clk_prepare_enable(sor->clk);
1380 if (err < 0) {
1381 dev_err(sor->dev, "failed to enable clock: %d\n", err);
1382 return err;
1383 }
1384
1385 err = clk_prepare_enable(sor->clk_safe);
1386 if (err < 0)
1387 return err;
1388
1389 err = clk_prepare_enable(sor->clk_dp);
1390 if (err < 0)
1391 return err;
1392
Thierry Reding6b6b6042013-11-15 16:06:05 +01001393 return 0;
1394}
1395
1396static int tegra_sor_exit(struct host1x_client *client)
1397{
1398 struct tegra_sor *sor = host1x_client_to_sor(client);
1399 int err;
1400
Thierry Reding6b6b6042013-11-15 16:06:05 +01001401 if (sor->dpaux) {
1402 err = tegra_dpaux_detach(sor->dpaux);
1403 if (err < 0) {
1404 dev_err(sor->dev, "failed to detach DP: %d\n", err);
1405 return err;
1406 }
1407 }
1408
Thierry Reding6fad8f62014-11-28 15:41:34 +01001409 clk_disable_unprepare(sor->clk_safe);
1410 clk_disable_unprepare(sor->clk_dp);
1411 clk_disable_unprepare(sor->clk);
1412
Thierry Redinga82752e2014-01-31 10:02:15 +01001413 if (IS_ENABLED(CONFIG_DEBUG_FS)) {
1414 err = tegra_sor_debugfs_exit(sor);
1415 if (err < 0)
1416 dev_err(sor->dev, "debugfs cleanup failed: %d\n", err);
1417 }
1418
Thierry Reding6b6b6042013-11-15 16:06:05 +01001419 return 0;
1420}
1421
1422static const struct host1x_client_ops sor_client_ops = {
1423 .init = tegra_sor_init,
1424 .exit = tegra_sor_exit,
1425};
1426
1427static int tegra_sor_probe(struct platform_device *pdev)
1428{
1429 struct device_node *np;
1430 struct tegra_sor *sor;
1431 struct resource *regs;
1432 int err;
1433
1434 sor = devm_kzalloc(&pdev->dev, sizeof(*sor), GFP_KERNEL);
1435 if (!sor)
1436 return -ENOMEM;
1437
1438 sor->output.dev = sor->dev = &pdev->dev;
1439
1440 np = of_parse_phandle(pdev->dev.of_node, "nvidia,dpaux", 0);
1441 if (np) {
1442 sor->dpaux = tegra_dpaux_find_by_of_node(np);
1443 of_node_put(np);
1444
1445 if (!sor->dpaux)
1446 return -EPROBE_DEFER;
1447 }
1448
1449 err = tegra_output_probe(&sor->output);
1450 if (err < 0)
1451 return err;
1452
1453 regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1454 sor->regs = devm_ioremap_resource(&pdev->dev, regs);
1455 if (IS_ERR(sor->regs))
1456 return PTR_ERR(sor->regs);
1457
1458 sor->rst = devm_reset_control_get(&pdev->dev, "sor");
1459 if (IS_ERR(sor->rst))
1460 return PTR_ERR(sor->rst);
1461
1462 sor->clk = devm_clk_get(&pdev->dev, NULL);
1463 if (IS_ERR(sor->clk))
1464 return PTR_ERR(sor->clk);
1465
1466 sor->clk_parent = devm_clk_get(&pdev->dev, "parent");
1467 if (IS_ERR(sor->clk_parent))
1468 return PTR_ERR(sor->clk_parent);
1469
Thierry Reding6b6b6042013-11-15 16:06:05 +01001470 sor->clk_safe = devm_clk_get(&pdev->dev, "safe");
1471 if (IS_ERR(sor->clk_safe))
1472 return PTR_ERR(sor->clk_safe);
1473
Thierry Reding6b6b6042013-11-15 16:06:05 +01001474 sor->clk_dp = devm_clk_get(&pdev->dev, "dp");
1475 if (IS_ERR(sor->clk_dp))
1476 return PTR_ERR(sor->clk_dp);
1477
Thierry Reding6b6b6042013-11-15 16:06:05 +01001478 INIT_LIST_HEAD(&sor->client.list);
1479 sor->client.ops = &sor_client_ops;
1480 sor->client.dev = &pdev->dev;
1481
Thierry Reding86f5c522014-03-26 11:13:16 +01001482 mutex_init(&sor->lock);
1483
Thierry Reding6b6b6042013-11-15 16:06:05 +01001484 err = host1x_client_register(&sor->client);
1485 if (err < 0) {
1486 dev_err(&pdev->dev, "failed to register host1x client: %d\n",
1487 err);
1488 return err;
1489 }
1490
1491 platform_set_drvdata(pdev, sor);
1492
1493 return 0;
1494}
1495
1496static int tegra_sor_remove(struct platform_device *pdev)
1497{
1498 struct tegra_sor *sor = platform_get_drvdata(pdev);
1499 int err;
1500
1501 err = host1x_client_unregister(&sor->client);
1502 if (err < 0) {
1503 dev_err(&pdev->dev, "failed to unregister host1x client: %d\n",
1504 err);
1505 return err;
1506 }
1507
Thierry Reding6fad8f62014-11-28 15:41:34 +01001508 err = tegra_output_remove(&sor->output);
1509 if (err < 0) {
1510 dev_err(&pdev->dev, "failed to remove output: %d\n", err);
1511 return err;
1512 }
Thierry Reding6b6b6042013-11-15 16:06:05 +01001513
1514 return 0;
1515}
1516
1517static const struct of_device_id tegra_sor_of_match[] = {
1518 { .compatible = "nvidia,tegra124-sor", },
1519 { },
1520};
Stephen Warrenef707282014-06-18 16:21:55 -06001521MODULE_DEVICE_TABLE(of, tegra_sor_of_match);
Thierry Reding6b6b6042013-11-15 16:06:05 +01001522
1523struct platform_driver tegra_sor_driver = {
1524 .driver = {
1525 .name = "tegra-sor",
1526 .of_match_table = tegra_sor_of_match,
1527 },
1528 .probe = tegra_sor_probe,
1529 .remove = tegra_sor_remove,
1530};