2 * Copyright (C) 2013 NVIDIA Corporation
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.
10 #include <linux/debugfs.h>
11 #include <linux/gpio.h>
13 #include <linux/platform_device.h>
14 #include <linux/reset.h>
16 #include <soc/tegra/pmc.h>
18 #include <drm/drm_dp_helper.h>
19 #include <drm/drm_panel.h>
26 struct host1x_client client;
27 struct tegra_output output;
32 struct reset_control *rst;
33 struct clk *clk_parent;
38 struct tegra_dpaux *dpaux;
43 struct dentry *debugfs;
46 struct tegra_sor_config {
59 static inline struct tegra_sor *
60 host1x_client_to_sor(struct host1x_client *client)
62 return container_of(client, struct tegra_sor, client);
65 static inline struct tegra_sor *to_sor(struct tegra_output *output)
67 return container_of(output, struct tegra_sor, output);
70 static inline unsigned long tegra_sor_readl(struct tegra_sor *sor,
73 return readl(sor->regs + (offset << 2));
76 static inline void tegra_sor_writel(struct tegra_sor *sor, unsigned long value,
79 writel(value, sor->regs + (offset << 2));
82 static int tegra_sor_dp_train_fast(struct tegra_sor *sor,
83 struct drm_dp_link *link)
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);
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);
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);
109 /* disable LVDS mode */
110 tegra_sor_writel(sor, 0, SOR_LVDS);
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);
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);
123 usleep_range(10, 100);
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);
130 err = tegra_dpaux_prepare(sor->dpaux, DP_SET_ANSI_8B10B);
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;
141 tegra_sor_writel(sor, value, SOR_DP_TPG);
143 pattern = DP_TRAINING_PATTERN_1;
145 err = tegra_dpaux_train(sor->dpaux, link, pattern);
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);
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;
162 tegra_sor_writel(sor, value, SOR_DP_TPG);
164 pattern = DP_LINK_SCRAMBLING_DISABLE | DP_TRAINING_PATTERN_2;
166 err = tegra_dpaux_train(sor->dpaux, link, pattern);
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;
177 tegra_sor_writel(sor, value, SOR_DP_TPG);
179 pattern = DP_TRAINING_PATTERN_DISABLE;
181 err = tegra_dpaux_train(sor->dpaux, link, pattern);
188 static void tegra_sor_super_update(struct tegra_sor *sor)
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);
195 static void tegra_sor_update(struct tegra_sor *sor)
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);
202 static int tegra_sor_setup_pwm(struct tegra_sor *sor, unsigned long timeout)
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);
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);
218 timeout = jiffies + msecs_to_jiffies(timeout);
220 while (time_before(jiffies, timeout)) {
221 value = tegra_sor_readl(sor, SOR_PWM_CTL);
222 if ((value & SOR_PWM_CTL_TRIGGER) == 0)
225 usleep_range(25, 100);
231 static int tegra_sor_attach(struct tegra_sor *sor)
233 unsigned long value, timeout;
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);
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);
248 timeout = jiffies + msecs_to_jiffies(250);
250 while (time_before(jiffies, timeout)) {
251 value = tegra_sor_readl(sor, SOR_TEST);
252 if ((value & SOR_TEST_ATTACHED) != 0)
255 usleep_range(25, 100);
261 static int tegra_sor_wakeup(struct tegra_sor *sor)
263 struct tegra_dc *dc = to_tegra_dc(sor->output.encoder.crtc);
264 unsigned long value, timeout;
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);
274 timeout = jiffies + msecs_to_jiffies(250);
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;
281 if (value == SOR_TEST_HEAD_MODE_AWAKE)
284 usleep_range(25, 100);
290 static int tegra_sor_power_up(struct tegra_sor *sor, unsigned long timeout)
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);
298 timeout = jiffies + msecs_to_jiffies(timeout);
300 while (time_before(jiffies, timeout)) {
301 value = tegra_sor_readl(sor, SOR_PWR);
302 if ((value & SOR_PWR_TRIGGER) == 0)
305 usleep_range(25, 100);
311 struct tegra_sor_params {
312 /* number of link clocks per line */
313 unsigned int num_clocks;
314 /* ratio between input and output */
316 /* precision factor */
319 unsigned int active_polarity;
320 unsigned int active_count;
321 unsigned int active_frac;
322 unsigned int tu_size;
326 static int tegra_sor_compute_params(struct tegra_sor *sor,
327 struct tegra_sor_params *params,
328 unsigned int tu_size)
330 u64 active_sym, active_count, frac, approx;
331 u32 active_polarity, active_frac = 0;
332 const u64 f = params->precision;
335 active_sym = params->ratio * tu_size;
336 active_count = div_u64(active_sym, f) * f;
337 frac = active_sym - active_count;
340 if (frac >= (f / 2)) {
348 frac = div_u64(f * f, frac); /* 1/fraction */
349 if (frac <= (15 * f)) {
350 active_frac = div_u64(frac, f);
356 active_frac = active_polarity ? 1 : 15;
360 if (active_frac == 1)
363 if (active_polarity == 1) {
365 approx = active_count + (active_frac * (f - 1)) * f;
366 approx = div_u64(approx, active_frac * f);
368 approx = active_count + f;
372 approx = active_count + div_u64(f, active_frac);
374 approx = active_count;
377 error = div_s64(active_sym - approx, tu_size);
378 error *= params->num_clocks;
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;
394 static 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)
399 const u64 f = 100000, link_rate = link->rate * 1000;
400 const u64 pclk = mode->clock * 1000;
401 u64 input, output, watermark, num;
402 struct tegra_sor_params params;
403 u32 num_syms_per_line;
406 if (!link_rate || !link->num_lanes || !pclk || !config->bits_per_pixel)
409 output = link_rate * 8 * link->num_lanes;
410 input = pclk * config->bits_per_pixel;
415 memset(¶ms, 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;
422 for (i = params.tu_size; i >= 32; i--)
423 if (tegra_sor_compute_params(sor, ¶ms, i))
426 if (params.active_frac == 0) {
427 config->active_polarity = 0;
428 config->active_count = params.active_count;
430 if (!params.active_polarity)
431 config->active_count--;
433 config->tu_size = params.tu_size;
434 config->active_frac = 1;
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;
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);
447 watermark = params.ratio * config->tu_size * (f - params.ratio);
448 watermark = div_u64(watermark, f);
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);
455 if (config->watermark > 30) {
456 config->watermark = 30;
458 "unable to compute TU size, forcing watermark to %u\n",
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",
466 /* 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);
470 if (link->capabilities & DP_LINK_CAP_ENHANCED_FRAMING)
471 config->hblank_symbols -= 3;
473 config->hblank_symbols -= 12 / link->num_lanes;
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;
480 dev_dbg(sor->dev, "blank symbols: H:%u V:%u\n", config->hblank_symbols,
481 config->vblank_symbols);
486 static int tegra_sor_detach(struct tegra_sor *sor)
488 unsigned long value, timeout;
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);
496 timeout = jiffies + msecs_to_jiffies(250);
498 while (time_before(jiffies, timeout)) {
499 value = tegra_sor_readl(sor, SOR_PWR);
500 if (value & SOR_PWR_MODE_SAFE)
504 if ((value & SOR_PWR_MODE_SAFE) == 0)
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);
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);
519 timeout = jiffies + msecs_to_jiffies(250);
521 while (time_before(jiffies, timeout)) {
522 value = tegra_sor_readl(sor, SOR_TEST);
523 if ((value & SOR_TEST_ATTACHED) == 0)
526 usleep_range(25, 100);
529 if ((value & SOR_TEST_ATTACHED) != 0)
535 static int tegra_sor_power_down(struct tegra_sor *sor)
537 unsigned long value, timeout;
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);
545 timeout = jiffies + msecs_to_jiffies(250);
547 while (time_before(jiffies, timeout)) {
548 value = tegra_sor_readl(sor, SOR_PWR);
549 if ((value & SOR_PWR_TRIGGER) == 0)
552 usleep_range(25, 100);
555 if ((value & SOR_PWR_TRIGGER) != 0)
558 err = clk_set_parent(sor->clk, sor->clk_safe);
560 dev_err(sor->dev, "failed to set safe parent clock: %d\n", err);
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);
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);
572 timeout = jiffies + msecs_to_jiffies(250);
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)
579 usleep_range(25, 100);
582 if ((value & SOR_LANE_SEQ_CTL_TRIGGER) != 0)
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);
589 usleep_range(20, 100);
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);
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);
601 usleep_range(20, 100);
606 static int tegra_sor_crc_open(struct inode *inode, struct file *file)
608 file->private_data = inode->i_private;
613 static int tegra_sor_crc_release(struct inode *inode, struct file *file)
618 static int tegra_sor_crc_wait(struct tegra_sor *sor, unsigned long timeout)
622 timeout = jiffies + msecs_to_jiffies(timeout);
624 while (time_before(jiffies, timeout)) {
625 value = tegra_sor_readl(sor, SOR_CRC_A);
626 if (value & SOR_CRC_A_VALID)
629 usleep_range(100, 200);
635 static ssize_t tegra_sor_crc_read(struct file *file, char __user *buffer,
636 size_t size, loff_t *ppos)
638 struct tegra_sor *sor = file->private_data;
643 mutex_lock(&sor->lock);
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);
654 value = tegra_sor_readl(sor, SOR_CRC_CNTRL);
655 value |= SOR_CRC_CNTRL_ENABLE;
656 tegra_sor_writel(sor, value, SOR_CRC_CNTRL);
658 value = tegra_sor_readl(sor, SOR_TEST);
659 value &= ~SOR_TEST_CRC_POST_SERIALIZE;
660 tegra_sor_writel(sor, value, SOR_TEST);
662 err = tegra_sor_crc_wait(sor, 100);
666 tegra_sor_writel(sor, SOR_CRC_A_RESET, SOR_CRC_A);
667 value = tegra_sor_readl(sor, SOR_CRC_B);
669 num = scnprintf(buf, sizeof(buf), "%08x\n", value);
671 err = simple_read_from_buffer(buffer, size, ppos, buf, num);
674 mutex_unlock(&sor->lock);
678 static 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,
685 static int tegra_sor_debugfs_init(struct tegra_sor *sor,
686 struct drm_minor *minor)
688 struct dentry *entry;
691 sor->debugfs = debugfs_create_dir("sor", minor->debugfs_root);
695 entry = debugfs_create_file("crc", 0644, sor->debugfs, sor,
696 &tegra_sor_crc_fops);
699 "cannot create /sys/kernel/debug/dri/%s/sor/crc\n",
700 minor->debugfs_root->d_name.name);
708 debugfs_remove(sor->debugfs);
713 static void tegra_sor_debugfs_exit(struct tegra_sor *sor)
715 debugfs_remove_recursive(sor->debugfs);
719 static void tegra_sor_connector_dpms(struct drm_connector *connector, int mode)
723 static enum drm_connector_status
724 tegra_sor_connector_detect(struct drm_connector *connector, bool force)
726 struct tegra_output *output = connector_to_output(connector);
727 struct tegra_sor *sor = to_sor(output);
730 return tegra_dpaux_detect(sor->dpaux);
732 return connector_status_unknown;
735 static const struct drm_connector_funcs tegra_sor_connector_funcs = {
736 .dpms = tegra_sor_connector_dpms,
737 .detect = tegra_sor_connector_detect,
738 .fill_modes = drm_helper_probe_single_connector_modes,
739 .destroy = tegra_output_connector_destroy,
742 static int tegra_sor_connector_get_modes(struct drm_connector *connector)
744 struct tegra_output *output = connector_to_output(connector);
745 struct tegra_sor *sor = to_sor(output);
749 tegra_dpaux_enable(sor->dpaux);
751 err = tegra_output_connector_get_modes(connector);
754 tegra_dpaux_disable(sor->dpaux);
759 static enum drm_mode_status
760 tegra_sor_connector_mode_valid(struct drm_connector *connector,
761 struct drm_display_mode *mode)
766 static const struct drm_connector_helper_funcs tegra_sor_connector_helper_funcs = {
767 .get_modes = tegra_sor_connector_get_modes,
768 .mode_valid = tegra_sor_connector_mode_valid,
769 .best_encoder = tegra_output_connector_best_encoder,
772 static const struct drm_encoder_funcs tegra_sor_encoder_funcs = {
773 .destroy = tegra_output_encoder_destroy,
776 static void tegra_sor_encoder_dpms(struct drm_encoder *encoder, int mode)
780 static bool tegra_sor_encoder_mode_fixup(struct drm_encoder *encoder,
781 const struct drm_display_mode *mode,
782 struct drm_display_mode *adjusted)
784 struct tegra_output *output = encoder_to_output(encoder);
785 struct tegra_dc *dc = to_tegra_dc(encoder->crtc);
786 unsigned long pclk = mode->clock * 1000;
787 struct tegra_sor *sor = to_sor(output);
790 err = tegra_dc_setup_clock(dc, sor->clk_parent, pclk, 0);
792 dev_err(output->dev, "failed to setup DC clock: %d\n", err);
796 err = clk_set_rate(sor->clk_parent, pclk);
798 dev_err(output->dev, "failed to set clock rate to %lu Hz\n",
806 static void tegra_sor_encoder_prepare(struct drm_encoder *encoder)
810 static void tegra_sor_encoder_commit(struct drm_encoder *encoder)
814 static void tegra_sor_encoder_mode_set(struct drm_encoder *encoder,
815 struct drm_display_mode *mode,
816 struct drm_display_mode *adjusted)
818 struct tegra_output *output = encoder_to_output(encoder);
819 struct tegra_dc *dc = to_tegra_dc(encoder->crtc);
820 unsigned int vbe, vse, hbe, hse, vbs, hbs, i;
821 struct tegra_sor *sor = to_sor(output);
822 struct tegra_sor_config config;
823 struct drm_dp_link link;
824 struct drm_dp_aux *aux;
828 mutex_lock(&sor->lock);
833 err = clk_prepare_enable(sor->clk);
837 reset_control_deassert(sor->rst);
840 drm_panel_prepare(output->panel);
842 /* FIXME: properly convert to struct drm_dp_aux */
843 aux = (struct drm_dp_aux *)sor->dpaux;
846 err = tegra_dpaux_enable(sor->dpaux);
848 dev_err(sor->dev, "failed to enable DP: %d\n", err);
850 err = drm_dp_link_probe(aux, &link);
852 dev_err(sor->dev, "failed to probe eDP link: %d\n",
858 err = clk_set_parent(sor->clk, sor->clk_safe);
860 dev_err(sor->dev, "failed to set safe parent clock: %d\n", err);
862 memset(&config, 0, sizeof(config));
863 config.bits_per_pixel = output->connector.display_info.bpc * 3;
865 err = tegra_sor_calc_config(sor, mode, &config, &link);
867 dev_err(sor->dev, "failed to compute link configuration: %d\n",
870 value = tegra_sor_readl(sor, SOR_CLK_CNTRL);
871 value &= ~SOR_CLK_CNTRL_DP_CLK_SEL_MASK;
872 value |= SOR_CLK_CNTRL_DP_CLK_SEL_SINGLE_DPCLK;
873 tegra_sor_writel(sor, value, SOR_CLK_CNTRL);
875 value = tegra_sor_readl(sor, SOR_PLL_2);
876 value &= ~SOR_PLL_2_BANDGAP_POWERDOWN;
877 tegra_sor_writel(sor, value, SOR_PLL_2);
878 usleep_range(20, 100);
880 value = tegra_sor_readl(sor, SOR_PLL_3);
881 value |= SOR_PLL_3_PLL_VDD_MODE_V3_3;
882 tegra_sor_writel(sor, value, SOR_PLL_3);
884 value = SOR_PLL_0_ICHPMP(0xf) | SOR_PLL_0_VCOCAP_RST |
885 SOR_PLL_0_PLLREG_LEVEL_V45 | SOR_PLL_0_RESISTOR_EXT;
886 tegra_sor_writel(sor, value, SOR_PLL_0);
888 value = tegra_sor_readl(sor, SOR_PLL_2);
889 value |= SOR_PLL_2_SEQ_PLLCAPPD;
890 value &= ~SOR_PLL_2_SEQ_PLLCAPPD_ENFORCE;
891 value |= SOR_PLL_2_LVDS_ENABLE;
892 tegra_sor_writel(sor, value, SOR_PLL_2);
894 value = SOR_PLL_1_TERM_COMPOUT | SOR_PLL_1_TMDS_TERM;
895 tegra_sor_writel(sor, value, SOR_PLL_1);
898 value = tegra_sor_readl(sor, SOR_PLL_2);
899 if ((value & SOR_PLL_2_SEQ_PLLCAPPD_ENFORCE) == 0)
902 usleep_range(250, 1000);
905 value = tegra_sor_readl(sor, SOR_PLL_2);
906 value &= ~SOR_PLL_2_POWERDOWN_OVERRIDE;
907 value &= ~SOR_PLL_2_PORT_POWERDOWN;
908 tegra_sor_writel(sor, value, SOR_PLL_2);
914 /* set safe link bandwidth (1.62 Gbps) */
915 value = tegra_sor_readl(sor, SOR_CLK_CNTRL);
916 value &= ~SOR_CLK_CNTRL_DP_LINK_SPEED_MASK;
917 value |= SOR_CLK_CNTRL_DP_LINK_SPEED_G1_62;
918 tegra_sor_writel(sor, value, SOR_CLK_CNTRL);
921 value = tegra_sor_readl(sor, SOR_PLL_2);
922 value |= SOR_PLL_2_SEQ_PLLCAPPD_ENFORCE | SOR_PLL_2_PORT_POWERDOWN |
923 SOR_PLL_2_BANDGAP_POWERDOWN;
924 tegra_sor_writel(sor, value, SOR_PLL_2);
926 value = tegra_sor_readl(sor, SOR_PLL_0);
927 value |= SOR_PLL_0_VCOPD | SOR_PLL_0_POWER_OFF;
928 tegra_sor_writel(sor, value, SOR_PLL_0);
930 value = tegra_sor_readl(sor, SOR_DP_PADCTL_0);
931 value &= ~SOR_DP_PADCTL_PAD_CAL_PD;
932 tegra_sor_writel(sor, value, SOR_DP_PADCTL_0);
935 err = tegra_io_rail_power_on(TEGRA_IO_RAIL_LVDS);
937 dev_err(sor->dev, "failed to power on I/O rail: %d\n", err);
941 usleep_range(5, 100);
944 value = tegra_sor_readl(sor, SOR_PLL_2);
945 value &= ~SOR_PLL_2_BANDGAP_POWERDOWN;
946 tegra_sor_writel(sor, value, SOR_PLL_2);
948 usleep_range(20, 100);
951 value = tegra_sor_readl(sor, SOR_PLL_0);
952 value &= ~SOR_PLL_0_POWER_OFF;
953 value &= ~SOR_PLL_0_VCOPD;
954 tegra_sor_writel(sor, value, SOR_PLL_0);
956 value = tegra_sor_readl(sor, SOR_PLL_2);
957 value &= ~SOR_PLL_2_SEQ_PLLCAPPD_ENFORCE;
958 tegra_sor_writel(sor, value, SOR_PLL_2);
960 usleep_range(200, 1000);
963 value = tegra_sor_readl(sor, SOR_PLL_2);
964 value &= ~SOR_PLL_2_PORT_POWERDOWN;
965 tegra_sor_writel(sor, value, SOR_PLL_2);
967 /* switch to DP clock */
968 err = clk_set_parent(sor->clk, sor->clk_dp);
970 dev_err(sor->dev, "failed to set DP parent clock: %d\n", err);
973 value = tegra_sor_readl(sor, SOR_DP_PADCTL_0);
975 if (link.num_lanes <= 2)
976 value &= ~(SOR_DP_PADCTL_PD_TXD_3 | SOR_DP_PADCTL_PD_TXD_2);
978 value |= SOR_DP_PADCTL_PD_TXD_3 | SOR_DP_PADCTL_PD_TXD_2;
980 if (link.num_lanes <= 1)
981 value &= ~SOR_DP_PADCTL_PD_TXD_1;
983 value |= SOR_DP_PADCTL_PD_TXD_1;
985 if (link.num_lanes == 0)
986 value &= ~SOR_DP_PADCTL_PD_TXD_0;
988 value |= SOR_DP_PADCTL_PD_TXD_0;
990 tegra_sor_writel(sor, value, SOR_DP_PADCTL_0);
992 value = tegra_sor_readl(sor, SOR_DP_LINKCTL_0);
993 value &= ~SOR_DP_LINKCTL_LANE_COUNT_MASK;
994 value |= SOR_DP_LINKCTL_LANE_COUNT(link.num_lanes);
995 tegra_sor_writel(sor, value, SOR_DP_LINKCTL_0);
997 /* start lane sequencer */
998 value = SOR_LANE_SEQ_CTL_TRIGGER | SOR_LANE_SEQ_CTL_SEQUENCE_DOWN |
999 SOR_LANE_SEQ_CTL_POWER_STATE_UP;
1000 tegra_sor_writel(sor, value, SOR_LANE_SEQ_CTL);
1003 value = tegra_sor_readl(sor, SOR_LANE_SEQ_CTL);
1004 if ((value & SOR_LANE_SEQ_CTL_TRIGGER) == 0)
1007 usleep_range(250, 1000);
1010 /* set link bandwidth */
1011 value = tegra_sor_readl(sor, SOR_CLK_CNTRL);
1012 value &= ~SOR_CLK_CNTRL_DP_LINK_SPEED_MASK;
1013 value |= drm_dp_link_rate_to_bw_code(link.rate) << 2;
1014 tegra_sor_writel(sor, value, SOR_CLK_CNTRL);
1017 value = tegra_sor_readl(sor, SOR_DP_LINKCTL_0);
1018 value |= SOR_DP_LINKCTL_ENABLE;
1020 value &= ~SOR_DP_LINKCTL_TU_SIZE_MASK;
1021 value |= SOR_DP_LINKCTL_TU_SIZE(config.tu_size);
1023 value |= SOR_DP_LINKCTL_ENHANCED_FRAME;
1024 tegra_sor_writel(sor, value, SOR_DP_LINKCTL_0);
1026 for (i = 0, value = 0; i < 4; i++) {
1027 unsigned long lane = SOR_DP_TPG_CHANNEL_CODING |
1028 SOR_DP_TPG_SCRAMBLER_GALIOS |
1029 SOR_DP_TPG_PATTERN_NONE;
1030 value = (value << 8) | lane;
1033 tegra_sor_writel(sor, value, SOR_DP_TPG);
1035 value = tegra_sor_readl(sor, SOR_DP_CONFIG_0);
1036 value &= ~SOR_DP_CONFIG_WATERMARK_MASK;
1037 value |= SOR_DP_CONFIG_WATERMARK(config.watermark);
1039 value &= ~SOR_DP_CONFIG_ACTIVE_SYM_COUNT_MASK;
1040 value |= SOR_DP_CONFIG_ACTIVE_SYM_COUNT(config.active_count);
1042 value &= ~SOR_DP_CONFIG_ACTIVE_SYM_FRAC_MASK;
1043 value |= SOR_DP_CONFIG_ACTIVE_SYM_FRAC(config.active_frac);
1045 if (config.active_polarity)
1046 value |= SOR_DP_CONFIG_ACTIVE_SYM_POLARITY;
1048 value &= ~SOR_DP_CONFIG_ACTIVE_SYM_POLARITY;
1050 value |= SOR_DP_CONFIG_ACTIVE_SYM_ENABLE;
1051 value |= SOR_DP_CONFIG_DISPARITY_NEGATIVE;
1052 tegra_sor_writel(sor, value, SOR_DP_CONFIG_0);
1054 value = tegra_sor_readl(sor, SOR_DP_AUDIO_HBLANK_SYMBOLS);
1055 value &= ~SOR_DP_AUDIO_HBLANK_SYMBOLS_MASK;
1056 value |= config.hblank_symbols & 0xffff;
1057 tegra_sor_writel(sor, value, SOR_DP_AUDIO_HBLANK_SYMBOLS);
1059 value = tegra_sor_readl(sor, SOR_DP_AUDIO_VBLANK_SYMBOLS);
1060 value &= ~SOR_DP_AUDIO_VBLANK_SYMBOLS_MASK;
1061 value |= config.vblank_symbols & 0xffff;
1062 tegra_sor_writel(sor, value, SOR_DP_AUDIO_VBLANK_SYMBOLS);
1064 /* enable pad calibration logic */
1065 value = tegra_sor_readl(sor, SOR_DP_PADCTL_0);
1066 value |= SOR_DP_PADCTL_PAD_CAL_PD;
1067 tegra_sor_writel(sor, value, SOR_DP_PADCTL_0);
1072 err = drm_dp_link_probe(aux, &link);
1074 dev_err(sor->dev, "failed to probe eDP link: %d\n",
1079 err = drm_dp_link_power_up(aux, &link);
1081 dev_err(sor->dev, "failed to power up eDP link: %d\n",
1086 err = drm_dp_link_configure(aux, &link);
1088 dev_err(sor->dev, "failed to configure eDP link: %d\n",
1093 rate = drm_dp_link_rate_to_bw_code(link.rate);
1094 lanes = link.num_lanes;
1096 value = tegra_sor_readl(sor, SOR_CLK_CNTRL);
1097 value &= ~SOR_CLK_CNTRL_DP_LINK_SPEED_MASK;
1098 value |= SOR_CLK_CNTRL_DP_LINK_SPEED(rate);
1099 tegra_sor_writel(sor, value, SOR_CLK_CNTRL);
1101 value = tegra_sor_readl(sor, SOR_DP_LINKCTL_0);
1102 value &= ~SOR_DP_LINKCTL_LANE_COUNT_MASK;
1103 value |= SOR_DP_LINKCTL_LANE_COUNT(lanes);
1105 if (link.capabilities & DP_LINK_CAP_ENHANCED_FRAMING)
1106 value |= SOR_DP_LINKCTL_ENHANCED_FRAME;
1108 tegra_sor_writel(sor, value, SOR_DP_LINKCTL_0);
1110 /* disable training pattern generator */
1112 for (i = 0; i < link.num_lanes; i++) {
1113 unsigned long lane = SOR_DP_TPG_CHANNEL_CODING |
1114 SOR_DP_TPG_SCRAMBLER_GALIOS |
1115 SOR_DP_TPG_PATTERN_NONE;
1116 value = (value << 8) | lane;
1119 tegra_sor_writel(sor, value, SOR_DP_TPG);
1121 err = tegra_sor_dp_train_fast(sor, &link);
1123 dev_err(sor->dev, "DP fast link training failed: %d\n",
1128 dev_dbg(sor->dev, "fast link training succeeded\n");
1131 err = tegra_sor_power_up(sor, 250);
1133 dev_err(sor->dev, "failed to power up SOR: %d\n", err);
1137 /* start display controller in continuous mode */
1138 value = tegra_dc_readl(dc, DC_CMD_STATE_ACCESS);
1140 tegra_dc_writel(dc, value, DC_CMD_STATE_ACCESS);
1142 tegra_dc_writel(dc, VSYNC_H_POSITION(1), DC_DISP_DISP_TIMING_OPTIONS);
1143 tegra_dc_writel(dc, DISP_CTRL_MODE_C_DISPLAY, DC_CMD_DISPLAY_COMMAND);
1145 value = tegra_dc_readl(dc, DC_CMD_STATE_ACCESS);
1146 value &= ~WRITE_MUX;
1147 tegra_dc_writel(dc, value, DC_CMD_STATE_ACCESS);
1150 * configure panel (24bpp, vsync-, hsync-, DP-A protocol, complete
1151 * raster, associate with display controller)
1153 value = SOR_STATE_ASY_PROTOCOL_DP_A |
1154 SOR_STATE_ASY_CRC_MODE_COMPLETE |
1155 SOR_STATE_ASY_OWNER(dc->pipe + 1);
1157 if (mode->flags & DRM_MODE_FLAG_PHSYNC)
1158 value &= ~SOR_STATE_ASY_HSYNCPOL;
1160 if (mode->flags & DRM_MODE_FLAG_NHSYNC)
1161 value |= SOR_STATE_ASY_HSYNCPOL;
1163 if (mode->flags & DRM_MODE_FLAG_PVSYNC)
1164 value &= ~SOR_STATE_ASY_VSYNCPOL;
1166 if (mode->flags & DRM_MODE_FLAG_NVSYNC)
1167 value |= SOR_STATE_ASY_VSYNCPOL;
1169 switch (config.bits_per_pixel) {
1171 value |= SOR_STATE_ASY_PIXELDEPTH_BPP_24_444;
1175 value |= SOR_STATE_ASY_PIXELDEPTH_BPP_18_444;
1183 tegra_sor_writel(sor, value, SOR_STATE_1);
1186 * TODO: The video timing programming below doesn't seem to match the
1187 * register definitions.
1190 value = ((mode->vtotal & 0x7fff) << 16) | (mode->htotal & 0x7fff);
1191 tegra_sor_writel(sor, value, SOR_HEAD_STATE_1(0));
1193 vse = mode->vsync_end - mode->vsync_start - 1;
1194 hse = mode->hsync_end - mode->hsync_start - 1;
1196 value = ((vse & 0x7fff) << 16) | (hse & 0x7fff);
1197 tegra_sor_writel(sor, value, SOR_HEAD_STATE_2(0));
1199 vbe = vse + (mode->vsync_start - mode->vdisplay);
1200 hbe = hse + (mode->hsync_start - mode->hdisplay);
1202 value = ((vbe & 0x7fff) << 16) | (hbe & 0x7fff);
1203 tegra_sor_writel(sor, value, SOR_HEAD_STATE_3(0));
1205 vbs = vbe + mode->vdisplay;
1206 hbs = hbe + mode->hdisplay;
1208 value = ((vbs & 0x7fff) << 16) | (hbs & 0x7fff);
1209 tegra_sor_writel(sor, value, SOR_HEAD_STATE_4(0));
1211 /* CSTM (LVDS, link A/B, upper) */
1212 value = SOR_CSTM_LVDS | SOR_CSTM_LINK_ACT_A | SOR_CSTM_LINK_ACT_B |
1214 tegra_sor_writel(sor, value, SOR_CSTM);
1217 err = tegra_sor_setup_pwm(sor, 250);
1219 dev_err(sor->dev, "failed to setup PWM: %d\n", err);
1223 value = tegra_dc_readl(dc, DC_DISP_DISP_WIN_OPTIONS);
1224 value |= SOR_ENABLE;
1225 tegra_dc_writel(dc, value, DC_DISP_DISP_WIN_OPTIONS);
1227 tegra_sor_update(sor);
1229 err = tegra_sor_attach(sor);
1231 dev_err(sor->dev, "failed to attach SOR: %d\n", err);
1235 err = tegra_sor_wakeup(sor);
1237 dev_err(sor->dev, "failed to enable DC: %d\n", err);
1242 drm_panel_enable(output->panel);
1244 sor->enabled = true;
1247 mutex_unlock(&sor->lock);
1250 static void tegra_sor_encoder_disable(struct drm_encoder *encoder)
1252 struct tegra_output *output = encoder_to_output(encoder);
1253 struct tegra_dc *dc = to_tegra_dc(encoder->crtc);
1254 struct tegra_sor *sor = to_sor(output);
1258 mutex_lock(&sor->lock);
1264 drm_panel_disable(output->panel);
1266 err = tegra_sor_detach(sor);
1268 dev_err(sor->dev, "failed to detach SOR: %d\n", err);
1272 tegra_sor_writel(sor, 0, SOR_STATE_1);
1273 tegra_sor_update(sor);
1276 * The following accesses registers of the display controller, so make
1277 * sure it's only executed when the output is attached to one.
1280 value = tegra_dc_readl(dc, DC_DISP_DISP_WIN_OPTIONS);
1281 value &= ~SOR_ENABLE;
1282 tegra_dc_writel(dc, value, DC_DISP_DISP_WIN_OPTIONS);
1284 tegra_dc_commit(dc);
1287 err = tegra_sor_power_down(sor);
1289 dev_err(sor->dev, "failed to power down SOR: %d\n", err);
1294 err = tegra_dpaux_disable(sor->dpaux);
1296 dev_err(sor->dev, "failed to disable DP: %d\n", err);
1301 err = tegra_io_rail_power_off(TEGRA_IO_RAIL_LVDS);
1303 dev_err(sor->dev, "failed to power off I/O rail: %d\n", err);
1308 drm_panel_unprepare(output->panel);
1310 clk_disable_unprepare(sor->clk);
1311 reset_control_assert(sor->rst);
1313 sor->enabled = false;
1316 mutex_unlock(&sor->lock);
1319 static const struct drm_encoder_helper_funcs tegra_sor_encoder_helper_funcs = {
1320 .dpms = tegra_sor_encoder_dpms,
1321 .mode_fixup = tegra_sor_encoder_mode_fixup,
1322 .prepare = tegra_sor_encoder_prepare,
1323 .commit = tegra_sor_encoder_commit,
1324 .mode_set = tegra_sor_encoder_mode_set,
1325 .disable = tegra_sor_encoder_disable,
1328 static int tegra_sor_init(struct host1x_client *client)
1330 struct drm_device *drm = dev_get_drvdata(client->parent);
1331 struct tegra_sor *sor = host1x_client_to_sor(client);
1337 sor->output.dev = sor->dev;
1339 drm_connector_init(drm, &sor->output.connector,
1340 &tegra_sor_connector_funcs,
1341 DRM_MODE_CONNECTOR_eDP);
1342 drm_connector_helper_add(&sor->output.connector,
1343 &tegra_sor_connector_helper_funcs);
1344 sor->output.connector.dpms = DRM_MODE_DPMS_OFF;
1346 drm_encoder_init(drm, &sor->output.encoder, &tegra_sor_encoder_funcs,
1347 DRM_MODE_ENCODER_TMDS);
1348 drm_encoder_helper_add(&sor->output.encoder,
1349 &tegra_sor_encoder_helper_funcs);
1351 drm_mode_connector_attach_encoder(&sor->output.connector,
1352 &sor->output.encoder);
1353 drm_connector_register(&sor->output.connector);
1355 err = tegra_output_init(drm, &sor->output);
1357 dev_err(client->dev, "failed to initialize output: %d\n", err);
1361 sor->output.encoder.possible_crtcs = 0x3;
1363 if (IS_ENABLED(CONFIG_DEBUG_FS)) {
1364 err = tegra_sor_debugfs_init(sor, drm->primary);
1366 dev_err(sor->dev, "debugfs setup failed: %d\n", err);
1370 err = tegra_dpaux_attach(sor->dpaux, &sor->output);
1372 dev_err(sor->dev, "failed to attach DP: %d\n", err);
1377 err = clk_prepare_enable(sor->clk);
1379 dev_err(sor->dev, "failed to enable clock: %d\n", err);
1383 err = clk_prepare_enable(sor->clk_safe);
1387 err = clk_prepare_enable(sor->clk_dp);
1394 static int tegra_sor_exit(struct host1x_client *client)
1396 struct tegra_sor *sor = host1x_client_to_sor(client);
1400 err = tegra_dpaux_detach(sor->dpaux);
1402 dev_err(sor->dev, "failed to detach DP: %d\n", err);
1407 clk_disable_unprepare(sor->clk_safe);
1408 clk_disable_unprepare(sor->clk_dp);
1409 clk_disable_unprepare(sor->clk);
1411 if (IS_ENABLED(CONFIG_DEBUG_FS))
1412 tegra_sor_debugfs_exit(sor);
1417 static const struct host1x_client_ops sor_client_ops = {
1418 .init = tegra_sor_init,
1419 .exit = tegra_sor_exit,
1422 static int tegra_sor_probe(struct platform_device *pdev)
1424 struct device_node *np;
1425 struct tegra_sor *sor;
1426 struct resource *regs;
1429 sor = devm_kzalloc(&pdev->dev, sizeof(*sor), GFP_KERNEL);
1433 sor->output.dev = sor->dev = &pdev->dev;
1435 np = of_parse_phandle(pdev->dev.of_node, "nvidia,dpaux", 0);
1437 sor->dpaux = tegra_dpaux_find_by_of_node(np);
1441 return -EPROBE_DEFER;
1444 err = tegra_output_probe(&sor->output);
1448 regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1449 sor->regs = devm_ioremap_resource(&pdev->dev, regs);
1450 if (IS_ERR(sor->regs))
1451 return PTR_ERR(sor->regs);
1453 sor->rst = devm_reset_control_get(&pdev->dev, "sor");
1454 if (IS_ERR(sor->rst))
1455 return PTR_ERR(sor->rst);
1457 sor->clk = devm_clk_get(&pdev->dev, NULL);
1458 if (IS_ERR(sor->clk))
1459 return PTR_ERR(sor->clk);
1461 sor->clk_parent = devm_clk_get(&pdev->dev, "parent");
1462 if (IS_ERR(sor->clk_parent))
1463 return PTR_ERR(sor->clk_parent);
1465 sor->clk_safe = devm_clk_get(&pdev->dev, "safe");
1466 if (IS_ERR(sor->clk_safe))
1467 return PTR_ERR(sor->clk_safe);
1469 sor->clk_dp = devm_clk_get(&pdev->dev, "dp");
1470 if (IS_ERR(sor->clk_dp))
1471 return PTR_ERR(sor->clk_dp);
1473 INIT_LIST_HEAD(&sor->client.list);
1474 sor->client.ops = &sor_client_ops;
1475 sor->client.dev = &pdev->dev;
1477 mutex_init(&sor->lock);
1479 err = host1x_client_register(&sor->client);
1481 dev_err(&pdev->dev, "failed to register host1x client: %d\n",
1486 platform_set_drvdata(pdev, sor);
1491 static int tegra_sor_remove(struct platform_device *pdev)
1493 struct tegra_sor *sor = platform_get_drvdata(pdev);
1496 err = host1x_client_unregister(&sor->client);
1498 dev_err(&pdev->dev, "failed to unregister host1x client: %d\n",
1503 err = tegra_output_remove(&sor->output);
1505 dev_err(&pdev->dev, "failed to remove output: %d\n", err);
1512 static const struct of_device_id tegra_sor_of_match[] = {
1513 { .compatible = "nvidia,tegra124-sor", },
1516 MODULE_DEVICE_TABLE(of, tegra_sor_of_match);
1518 struct platform_driver tegra_sor_driver = {
1520 .name = "tegra-sor",
1521 .of_match_table = tegra_sor_of_match,
1523 .probe = tegra_sor_probe,
1524 .remove = tegra_sor_remove,