2 * Copyright (c) 2013-2016, NVIDIA CORPORATION. All rights reserved.
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms and conditions of the GNU General Public License,
6 * version 2, as published by the Free Software Foundation.
8 * This program is distributed in the hope it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 #include <linux/ioport.h>
18 #include <linux/kernel.h>
20 #include <linux/delay.h>
21 #include <linux/gpio.h>
22 #include <linux/clk.h>
23 #include <linux/of_gpio.h>
24 #include <linux/export.h>
25 #include <linux/platform_device.h>
27 #include <linux/of_address.h>
31 #include "board-panel.h"
34 #include <linux/platform/tegra/dvfs.h>
35 #include <linux/platform_data/lp855x.h>
40 #define PRISM_THRESHOLD 50
43 atomic_t sd_brightness = ATOMIC_INIT(255);
44 EXPORT_SYMBOL(sd_brightness);
46 struct tegra_panel_ops *fixed_primary_panel_ops;
47 struct tegra_panel_ops *fixed_secondary_panel_ops;
48 const char *fixed_primary_panel_compatible;
49 const char *fixed_secondary_panel_compatible;
50 struct pwm_bl_data_dt_ops *fixed_pwm_bl_ops;
52 void tegra_dsi_resources_init(u8 dsi_instance,
53 struct resource *resources, int n_resources)
56 for (i = 0; i < n_resources; i++) {
57 struct resource *r = &resources[i];
58 if (resource_type(r) == IORESOURCE_MEM &&
59 !strcmp(r->name, "dsi_regs")) {
60 switch (dsi_instance) {
62 r->start = TEGRA_DSI_BASE;
63 r->end = TEGRA_DSI_BASE + TEGRA_DSI_SIZE - 1;
67 r->start = TEGRA_DSIB_BASE;
68 r->end = TEGRA_DSIB_BASE + TEGRA_DSIB_SIZE - 1;
72 if (resource_type(r) == IORESOURCE_MEM &&
73 !strcmp(r->name, "ganged_dsia_regs")) {
74 r->start = TEGRA_DSI_BASE;
75 r->end = TEGRA_DSI_BASE + TEGRA_DSI_SIZE - 1;
77 if (resource_type(r) == IORESOURCE_MEM &&
78 !strcmp(r->name, "ganged_dsib_regs")) {
79 r->start = TEGRA_DSIB_BASE;
80 r->end = TEGRA_DSIB_BASE + TEGRA_DSIB_SIZE - 1;
85 void tegra_dsi_update_init_cmd_gpio_rst(
86 struct tegra_dc_out *dsi_disp1_out)
89 for (i = 0; i < dsi_disp1_out->dsi->n_init_cmd; i++) {
90 if (dsi_disp1_out->dsi->dsi_init_cmd[i].cmd_type ==
92 dsi_disp1_out->dsi->dsi_init_cmd[i].sp_len_dly.gpio
93 = dsi_disp1_out->dsi->dsi_panel_rst_gpio;
97 int tegra_panel_reset(struct tegra_panel_of *panel, unsigned int delay_ms)
99 int gpio = panel->panel_gpio[TEGRA_GPIO_RESET];
101 if (!gpio_is_valid(gpio))
104 gpio_direction_output(gpio, 1);
105 usleep_range(1000, 5000);
106 gpio_set_value(gpio, 0);
107 usleep_range(1000, 5000);
108 gpio_set_value(gpio, 1);
115 static int tegra_bl_notify(struct device *dev, int brightness)
117 int cur_sd_brightness;
119 struct lp855x *lp = NULL;
120 struct platform_device *pdev = NULL;
121 struct device *dc_dev;
122 u8 *bl_measured = NULL;
125 pdev = to_platform_device(bus_find_device_by_name(
126 &platform_bus_type, NULL, "tegradc.0"));
130 if (brightness <= PRISM_THRESHOLD)
131 nvsd_enbl_dsbl_prism(dc_dev, false);
132 else if (brightness > PRISM_THRESHOLD + HYST_VAL)
133 nvsd_enbl_dsbl_prism(dc_dev, true);
136 /* Apply any backlight response curve */
137 if (brightness > 255)
138 pr_info("Error: Brightness > 255!\n");
139 else if (of_device_is_compatible(dev->of_node,
141 of_device_is_compatible(dev->of_node,
143 of_device_is_compatible(dev->of_node,
145 of_device_is_compatible(dev->of_node,
147 of_device_is_compatible(dev->of_node,
149 of_device_is_compatible(dev->of_node,
151 of_device_is_compatible(dev->of_node,
153 of_device_is_compatible(dev->of_node,
155 lp = (struct lp855x *)dev_get_drvdata(dev);
156 if (lp && lp->pdata) {
157 bl_measured = lp->pdata->bl_measured;
158 bl_curve = lp->pdata->bl_curve;
163 brightness = bl_curve[brightness];
165 cur_sd_brightness = atomic_read(&sd_brightness);
166 /* SD brightness is a percentage */
167 brightness = (brightness * cur_sd_brightness) / 255;
170 brightness = bl_measured[brightness];
175 static struct generic_bl_data_dt_ops generic_bl_ops = {
176 .notify = tegra_bl_notify,
179 int tegra_panel_gpio_get_dt(const char *comp_str,
180 struct tegra_panel_of *panel)
185 struct device_node *node =
186 of_find_compatible_node(NULL, NULL, comp_str);
189 * If gpios are already populated, just return.
191 if (panel->panel_gpio_populated)
195 pr_info("%s panel dt support not available\n", comp_str);
200 panel->panel_gpio[TEGRA_GPIO_RESET] =
201 of_get_named_gpio(node, "nvidia,panel-rst-gpio", 0);
203 panel->panel_gpio[TEGRA_GPIO_PANEL_EN] =
204 of_get_named_gpio(node, "nvidia,panel-en-gpio", 0);
206 panel->panel_gpio[TEGRA_GPIO_PANEL_EN_1] =
207 of_get_named_gpio(node, "nvidia,panel-en-1-gpio", 0);
209 panel->panel_gpio[TEGRA_GPIO_BL_ENABLE] =
210 of_get_named_gpio(node, "nvidia,panel-bl-en-gpio", 0);
212 panel->panel_gpio[TEGRA_GPIO_PWM] =
213 of_get_named_gpio(node, "nvidia,panel-bl-pwm-gpio", 0);
215 panel->panel_gpio[TEGRA_GPIO_BRIDGE_EN_0] =
216 of_get_named_gpio(node, "nvidia,panel-bridge-en-0-gpio", 0);
218 panel->panel_gpio[TEGRA_GPIO_BRIDGE_EN_1] =
219 of_get_named_gpio(node, "nvidia,panel-bridge-en-1-gpio", 0);
221 panel->panel_gpio[TEGRA_GPIO_BRIDGE_REFCLK_EN] =
222 of_get_named_gpio(node,
223 "nvidia,panel-bridge-refclk-en-gpio", 0);
225 for (cnt = 0; cnt < TEGRA_N_GPIO_PANEL; cnt++) {
226 if (gpio_is_valid(panel->panel_gpio[cnt])) {
228 case TEGRA_GPIO_RESET:
229 label = "tegra-panel-reset";
231 case TEGRA_GPIO_PANEL_EN:
232 label = "tegra-panel-en";
234 case TEGRA_GPIO_PANEL_EN_1:
235 label = "tegra-panel-en-1";
237 case TEGRA_GPIO_BL_ENABLE:
238 label = "tegra-panel-bl-enable";
241 label = "tegra-panel-pwm";
243 case TEGRA_GPIO_BRIDGE_EN_0:
244 label = "tegra-panel-bridge-en-0";
246 case TEGRA_GPIO_BRIDGE_EN_1:
247 label = "tegra-panel-bridge-en-1";
249 case TEGRA_GPIO_BRIDGE_REFCLK_EN:
250 label = "tegra-panel-bridge-refclk-en";
253 pr_err("tegra panel no gpio entry\n");
256 gpio_request(panel->panel_gpio[cnt],
262 if (gpio_is_valid(panel->panel_gpio[TEGRA_GPIO_PWM]))
263 gpio_free(panel->panel_gpio[TEGRA_GPIO_PWM]);
264 panel->panel_gpio_populated = true;
270 void tegra_set_fixed_panel_ops(bool is_primary,
271 struct tegra_panel_ops *p_ops, char *panel_compatible)
274 fixed_primary_panel_ops = p_ops;
275 fixed_primary_panel_compatible =
276 (const char *)panel_compatible;
278 fixed_secondary_panel_ops = p_ops;
279 fixed_secondary_panel_compatible =
280 (const char *)panel_compatible;
284 void tegra_set_fixed_pwm_bl_ops(struct pwm_bl_data_dt_ops *p_ops)
286 fixed_pwm_bl_ops = p_ops;
289 static bool tegra_available_pwm_bl_ops_register(struct device *dev)
291 struct device_node *np_bl = NULL;
292 struct device_node *np_parent = NULL;
293 const char *pn_compat = NULL;
296 np_parent = of_find_node_by_path("/backlight");
298 for_each_available_child_of_node(np_parent, np_bl) {
305 pr_info("no avaiable target backlight node\n");
309 pn_compat = of_get_property(np_bl, "compatible", NULL);
311 WARN(1, "No compatible prop in backlight node\n");
315 if (of_device_is_compatible(np_bl, "p,wuxga-10-1-bl")) {
316 dev_set_drvdata(dev, dsi_p_wuxga_10_1_ops.pwm_bl_ops);
317 } else if (of_device_is_compatible(np_bl, "lg,wxga-7-bl")) {
318 dev_set_drvdata(dev, dsi_lgd_wxga_7_0_ops.pwm_bl_ops);
319 } else if (of_device_is_compatible(np_bl, "s,wqxga-10-1-bl")) {
320 dev_set_drvdata(dev, dsi_s_wqxga_10_1_ops.pwm_bl_ops);
321 } else if (of_device_is_compatible(np_bl, "c,wxga-14-0-bl")) {
322 dev_set_drvdata(dev, lvds_c_1366_14_ops.pwm_bl_ops);
323 } else if (of_device_is_compatible(np_bl, "a,1080p-14-0-bl")) {
324 dev_set_drvdata(dev, dsi_a_1080p_14_0_ops.pwm_bl_ops);
325 } else if (of_device_is_compatible(np_bl, "j,1440-810-5-8-bl")) {
326 dev_set_drvdata(dev, dsi_j_1440_810_5_8_ops.pwm_bl_ops);
327 } else if (of_device_is_compatible(np_bl, "s,wuxga-7-0-bl")) {
328 dev_set_drvdata(dev, dsi_s_wuxga_7_0_ops.pwm_bl_ops);
329 } else if (of_device_is_compatible(np_bl, "s,wuxga-8-0-bl")) {
330 dev_set_drvdata(dev, dsi_s_wuxga_8_0_ops.pwm_bl_ops);
331 } else if (of_device_is_compatible(np_bl, "a,wuxga-8-0-bl")) {
332 dev_set_drvdata(dev, dsi_a_1200_1920_8_0_ops.pwm_bl_ops);
333 } else if (of_device_is_compatible(np_bl, "a,wxga-8-0-bl")) {
334 dev_set_drvdata(dev, dsi_a_1200_800_8_0_ops.pwm_bl_ops);
335 } else if (of_device_is_compatible(np_bl, "i-edp,1080p-11-6-bl")) {
336 dev_set_drvdata(dev, edp_i_1080p_11_6_ops.pwm_bl_ops);
337 } else if (of_device_is_compatible(np_bl, "a-edp,1080p-14-0-bl")) {
338 dev_set_drvdata(dev, edp_a_1080p_14_0_ops.pwm_bl_ops);
339 } else if (of_device_is_compatible(np_bl, "j,720p-5-0-bl")) {
340 dev_set_drvdata(dev, dsi_j_720p_5_ops.pwm_bl_ops);
341 } else if (of_device_is_compatible(np_bl, "l,720p-5-0-bl")) {
342 dev_set_drvdata(dev, dsi_l_720p_5_loki_ops.pwm_bl_ops);
343 } else if (of_device_is_compatible(np_bl, "s-edp,uhdtv-15-6-bl")) {
344 dev_set_drvdata(dev, edp_s_uhdtv_15_6_ops.pwm_bl_ops);
345 } else if (of_device_is_compatible(np_bl, "o,720-1280-6-0-bl")) {
346 dev_set_drvdata(dev, dsi_o_720p_6_0_ops.pwm_bl_ops);
347 } else if (of_device_is_compatible(np_bl, "o,720-1280-6-0-01-bl")) {
348 dev_set_drvdata(dev, dsi_o_720p_6_0_01_ops.pwm_bl_ops);
350 pr_info("invalid compatible for backlight node\n");
356 of_node_put(np_parent);
360 static void tegra_pwm_bl_ops_reg_based_on_disp_board_id(struct device *dev)
362 struct board_info display_board;
364 bool is_dsi_a_1200_1920_8_0 = false;
365 bool is_dsi_a_1200_800_8_0 = false;
366 bool is_edp_i_1080p_11_6 = false;
367 bool is_edp_a_1080p_14_0 = false;
368 bool is_edp_s_2160p_15_6 = false;
370 tegra_get_display_board_info(&display_board);
372 switch (display_board.board_id) {
375 dev_set_drvdata(dev, dsi_p_wuxga_10_1_ops.pwm_bl_ops);
378 dev_set_drvdata(dev, dsi_lgd_wxga_7_0_ops.pwm_bl_ops);
383 dev_set_drvdata(dev, dsi_s_wqxga_10_1_ops.pwm_bl_ops);
386 dev_set_drvdata(dev, lvds_c_1366_14_ops.pwm_bl_ops);
389 dev_set_drvdata(dev, dsi_a_1080p_14_0_ops.pwm_bl_ops);
392 dev_set_drvdata(dev, dsi_j_1440_810_5_8_ops.pwm_bl_ops);
395 if (display_board.fab == 0x2)
397 dsi_j_720p_5_ops.pwm_bl_ops);
398 else if (display_board.fab == 0x1)
400 dsi_j_1440_810_5_8_ops.pwm_bl_ops);
403 dsi_l_720p_5_loki_ops.pwm_bl_ops);
407 is_dsi_a_1200_1920_8_0 = true;
410 is_dsi_a_1200_800_8_0 = true;
413 if (tegra_get_board_panel_id())
414 is_dsi_a_1200_1920_8_0 = true;
416 is_dsi_a_1200_800_8_0 = true;
420 if (of_machine_is_compatible("nvidia,jetson-cv")) {
421 if (display_board.sku == 0x123)
422 is_edp_a_1080p_14_0 = true;
424 is_edp_s_2160p_15_6 = true;
426 else if (display_board.sku == 1200)
427 is_edp_i_1080p_11_6 = true;
429 is_edp_a_1080p_14_0 = true;
433 * Finally, check if there's fixed_pwm_bl_ops
435 if (fixed_pwm_bl_ops)
436 dev_set_drvdata(dev, fixed_pwm_bl_ops);
438 pr_info("pwm_bl_ops are not required\n");
441 if (is_dsi_a_1200_1920_8_0)
442 dev_set_drvdata(dev, dsi_a_1200_1920_8_0_ops.pwm_bl_ops);
443 if (is_dsi_a_1200_800_8_0)
444 dev_set_drvdata(dev, dsi_a_1200_800_8_0_ops.pwm_bl_ops);
446 if (is_edp_i_1080p_11_6)
447 dev_set_drvdata(dev, edp_i_1080p_11_6_ops.pwm_bl_ops);
448 if (is_edp_a_1080p_14_0)
449 dev_set_drvdata(dev, edp_a_1080p_14_0_ops.pwm_bl_ops);
450 if (is_edp_s_2160p_15_6)
451 dev_set_drvdata(dev, edp_s_uhdtv_15_6_ops.pwm_bl_ops);
454 void tegra_pwm_bl_ops_register(struct device *dev)
457 ret = tegra_available_pwm_bl_ops_register(dev);
459 tegra_pwm_bl_ops_reg_based_on_disp_board_id(dev);
462 void ti_lp855x_bl_ops_register(struct device *dev)
464 dev_set_drvdata(dev, &generic_bl_ops);
467 static void tegra_panel_register_ops(struct tegra_dc_out *dc_out,
468 struct tegra_panel_ops *p_ops)
473 /* TODO: register default ops */
476 dc_out->enable = p_ops->enable;
477 dc_out->postpoweron = p_ops->postpoweron;
478 dc_out->prepoweroff = p_ops->prepoweroff;
479 dc_out->disable = p_ops->disable;
480 dc_out->hotplug_init = p_ops->hotplug_init;
481 dc_out->postsuspend = p_ops->postsuspend;
482 dc_out->hotplug_report = p_ops->hotplug_report;
484 static struct device_node *available_internal_panel_select(
485 struct tegra_dc_platform_data *pdata)
487 struct device_node *np_panel = NULL;
488 struct device_node *np_dsi = NULL, *np_sor = NULL;
489 struct tegra_dc_out *dc_out = NULL;
490 const char *pn_compat = NULL;
493 * for internal panel node, search
494 * child node from DSI_NODE at first.
495 * If child node is not found, search
496 * child node from SOR_NODE.
499 np_dsi = of_find_node_by_path(DSI_NODE);
501 for_each_available_child_of_node(np_dsi, np_panel) {
508 np_sor = of_find_node_by_path(dc_or_node_names[DC0_ID]);
510 for_each_available_child_of_node(np_sor, np_panel) {
511 if (np_panel && of_get_child_by_name(
512 np_panel, "disp-default-out"))
519 pr_info("panel_select fail by _node_status\n");
526 dc_out = pdata->default_out;
528 WARN(1, "dc_out is not valid\n");
529 of_node_put(np_panel);
534 pn_compat = of_get_property(np_panel, "compatible", NULL);
536 WARN(1, "panel node do not have compatible prop\n");
537 of_node_put(np_panel);
542 if (of_device_is_compatible(np_panel, "p,wuxga-10-1")) {
543 tegra_panel_register_ops(dc_out,
544 &dsi_p_wuxga_10_1_ops);
545 } else if (of_device_is_compatible(np_panel, "lg,wxga-7")) {
546 tegra_panel_register_ops(dc_out,
547 &dsi_lgd_wxga_7_0_ops);
548 } else if (of_device_is_compatible(np_panel, "s,wqxga-10-1")) {
549 tegra_panel_register_ops(dc_out,
550 &dsi_s_wqxga_10_1_ops);
551 } else if (of_device_is_compatible(np_panel, "c,wxga-14-0")) {
552 tegra_panel_register_ops(dc_out,
553 &lvds_c_1366_14_ops);
554 } else if (of_device_is_compatible(np_panel, "a,1080p-14-0")) {
555 tegra_panel_register_ops(dc_out,
556 &dsi_a_1080p_14_0_ops);
557 } else if (of_device_is_compatible(np_panel, "j,1440-810-5-8")) {
558 tegra_panel_register_ops(dc_out,
559 &dsi_j_1440_810_5_8_ops);
560 } else if (of_device_is_compatible(np_panel, "s,wuxga-7-0")) {
561 tegra_panel_register_ops(dc_out,
562 &dsi_s_wuxga_7_0_ops);
563 } else if (of_device_is_compatible(np_panel, "s,wuxga-8-0")) {
564 tegra_panel_register_ops(dc_out,
565 &dsi_s_wuxga_8_0_ops);
566 } else if (of_device_is_compatible(np_panel, "a,wuxga-8-0")) {
567 tegra_panel_register_ops(dc_out,
568 &dsi_a_1200_1920_8_0_ops);
569 } else if (of_device_is_compatible(np_panel, "a,wxga-8-0")) {
570 tegra_panel_register_ops(dc_out,
571 &dsi_a_1200_800_8_0_ops);
572 } else if (of_device_is_compatible(np_panel, "i-edp,1080p-11-6")) {
573 tegra_panel_register_ops(dc_out,
574 &edp_i_1080p_11_6_ops);
575 } else if (of_device_is_compatible(np_panel, "a-edp,1080p-14-0")) {
576 tegra_panel_register_ops(dc_out,
577 &edp_a_1080p_14_0_ops);
578 } else if (of_device_is_compatible(np_panel, "j,720p-5-0")) {
579 tegra_panel_register_ops(dc_out,
581 } else if (of_device_is_compatible(np_panel, "l,720p-5-0")) {
582 tegra_panel_register_ops(dc_out,
583 &dsi_l_720p_5_loki_ops);
584 } else if (of_device_is_compatible(np_panel, "s-edp,uhdtv-15-6")) {
585 tegra_panel_register_ops(dc_out,
586 &edp_s_uhdtv_15_6_ops);
587 } else if (of_device_is_compatible(np_panel, "o,720-1280-6-0")) {
588 tegra_panel_register_ops(dc_out,
589 &dsi_o_720p_6_0_ops);
590 } else if (of_device_is_compatible(np_panel, "o,720-1280-6-0-01")) {
591 tegra_panel_register_ops(dc_out,
592 &dsi_o_720p_6_0_01_ops);
594 pr_info("invalid panel compatible\n");
595 of_node_put(np_panel);
605 static struct device_node
606 *internal_panel_select_by_disp_board_id(
607 struct tegra_dc_platform_data *pdata)
609 struct device_node *np_panel = NULL;
610 struct tegra_dc_out *dc_out = NULL;
611 struct board_info display_board;
613 bool is_dsi_a_1200_1920_8_0 = false;
614 bool is_dsi_a_1200_800_8_0 = false;
615 bool is_edp_i_1080p_11_6 = false;
616 bool is_edp_a_1080p_14_0 = false;
617 bool is_edp_s_2160p_15_6 = false;
619 tegra_get_display_board_info(&display_board);
620 pr_info("display board info: id 0x%x, fab 0x%x\n",
621 display_board.board_id, display_board.fab);
624 dc_out = pdata->default_out;
626 switch (display_board.board_id) {
629 np_panel = of_find_compatible_node(NULL, NULL, "p,wuxga-10-1");
630 if (np_panel && pdata && dc_out)
631 tegra_panel_register_ops(dc_out,
632 &dsi_p_wuxga_10_1_ops);
635 np_panel = of_find_compatible_node(NULL, NULL, "lg,wxga-7");
636 if (np_panel && pdata && dc_out)
637 tegra_panel_register_ops(dc_out,
638 &dsi_lgd_wxga_7_0_ops);
643 np_panel = of_find_compatible_node(NULL, NULL, "s,wqxga-10-1");
644 if (np_panel && pdata && dc_out)
645 tegra_panel_register_ops(dc_out,
646 &dsi_s_wqxga_10_1_ops);
649 np_panel = of_find_compatible_node(NULL, NULL, "c,wxga-14-0");
650 if (np_panel && pdata && dc_out)
651 tegra_panel_register_ops(dc_out,
652 &lvds_c_1366_14_ops);
655 np_panel = of_find_compatible_node(NULL, NULL, "a,1080p-14-0");
656 if (np_panel && pdata && dc_out)
657 tegra_panel_register_ops(dc_out,
658 &dsi_a_1080p_14_0_ops);
661 np_panel = of_find_compatible_node(NULL,
662 NULL, "j,1440-810-5-8");
663 if (np_panel && pdata && dc_out)
664 tegra_panel_register_ops(dc_out,
665 &dsi_j_1440_810_5_8_ops);
668 if (display_board.fab == 0x2) {
669 np_panel = of_find_compatible_node(NULL, NULL,
671 if (np_panel && pdata && dc_out)
672 tegra_panel_register_ops(dc_out,
674 } else if (display_board.fab == 0x1) {
675 np_panel = of_find_compatible_node(NULL, NULL,
677 if (np_panel && pdata && dc_out)
678 tegra_panel_register_ops(dc_out,
679 &dsi_j_1440_810_5_8_ops);
681 np_panel = of_find_compatible_node(NULL, NULL,
683 if (np_panel && pdata && dc_out)
684 tegra_panel_register_ops(dc_out,
685 &dsi_l_720p_5_loki_ops);
690 is_dsi_a_1200_1920_8_0 = true;
693 is_dsi_a_1200_800_8_0 = true;
696 if (tegra_get_board_panel_id())
697 is_dsi_a_1200_1920_8_0 = true;
699 is_dsi_a_1200_800_8_0 = true;
703 if (of_machine_is_compatible("nvidia,jetson-cv")) {
704 if (display_board.sku == 0x123)
705 is_edp_a_1080p_14_0 = true;
707 is_edp_s_2160p_15_6 = true;
709 else if (display_board.sku == 1200)
710 is_edp_i_1080p_11_6 = true;
712 is_edp_a_1080p_14_0 = true;
715 /* If display panel is not searched by display board id,
716 * check if there's fixed primary panel.
718 if (fixed_primary_panel_ops &&
719 fixed_primary_panel_compatible) {
720 np_panel = of_find_compatible_node(NULL, NULL,
721 fixed_primary_panel_compatible);
722 if (np_panel && pdata && dc_out)
723 tegra_panel_register_ops(dc_out,
724 fixed_primary_panel_ops);
728 if (is_dsi_a_1200_1920_8_0) {
729 np_panel = of_find_compatible_node(NULL, NULL,
731 if (np_panel && pdata && dc_out)
732 tegra_panel_register_ops(dc_out,
733 &dsi_a_1200_1920_8_0_ops);
735 if (is_dsi_a_1200_800_8_0) {
736 np_panel = of_find_compatible_node(NULL, NULL,
738 if (np_panel && pdata && dc_out)
739 tegra_panel_register_ops(dc_out,
740 &dsi_a_1200_800_8_0_ops);
743 if (is_edp_i_1080p_11_6) {
744 np_panel = of_find_compatible_node(NULL, NULL,
746 if (np_panel && pdata && dc_out)
747 tegra_panel_register_ops(dc_out,
748 &edp_i_1080p_11_6_ops);
750 if (is_edp_a_1080p_14_0) {
751 np_panel = of_find_compatible_node(NULL, NULL,
753 if (np_panel && pdata && dc_out)
754 tegra_panel_register_ops(dc_out,
755 &edp_a_1080p_14_0_ops);
757 if (is_edp_s_2160p_15_6) {
758 np_panel = of_find_compatible_node(NULL, NULL,
760 if (np_panel && pdata && dc_out)
761 tegra_panel_register_ops(dc_out,
762 &edp_s_uhdtv_15_6_ops);
770 struct device_node *tegra_primary_panel_get_dt_node(
771 struct tegra_dc_platform_data *pdata)
773 struct device_node *np_panel = NULL;
774 struct tegra_dc_out *dc_out = NULL;
775 struct device_node *np_hdmi = tegra_dc_get_hdmi_node(DC0_ID);
778 dc_out = pdata->default_out;
781 internal_panel_select_by_disp_board_id(pdata);
784 * legacy method to select internal panel
785 * based on disp board id.
787 of_node_put(np_hdmi);
792 available_internal_panel_select(pdata);
796 * search internal panel node by
799 of_node_put(np_hdmi);
804 * Check hdmi primary, if there's neither
805 * valid internal panel nor fixed panel.
808 of_get_child_by_name(np_hdmi, "hdmi-display");
810 of_node_put(np_hdmi);
811 return of_device_is_available(np_panel) ? np_panel : NULL;
814 struct device_node *tegra_secondary_panel_get_dt_node(
815 struct tegra_dc_platform_data *pdata)
817 struct device_node *np_panel = NULL, *np_display = NULL;
818 struct tegra_dc_out *dc_out = NULL;
819 const char *sor1_output_type;
822 dc_out = pdata->default_out;
824 if (fixed_secondary_panel_ops &&
825 fixed_secondary_panel_compatible) {
826 np_panel = of_find_compatible_node(NULL, NULL,
827 fixed_secondary_panel_compatible);
828 if (np_panel && pdata && dc_out)
829 tegra_panel_register_ops(dc_out,
830 fixed_secondary_panel_ops);
832 np_display = of_find_node_by_path(dc_or_node_names[DC1_ID]);
833 if (!of_property_read_string(np_display,
834 "nvidia,sor1-output-type", &sor1_output_type)) {
835 if (strcmp(sor1_output_type, "dp") == 0) {
836 np_panel = of_get_child_by_name(np_display,
843 of_node_put(np_display);
844 np_display = tegra_dc_get_hdmi_node(DC1_ID);
845 np_panel = of_get_child_by_name(np_display, "hdmi-display");
848 of_node_put(np_display);
849 return of_device_is_available(np_panel) ? np_panel : NULL;
852 void tegra_fb_copy_or_clear(void)
854 bool fb_existed = (tegra_fb_start && tegra_fb_size) ?
856 bool fb2_existed = (tegra_fb2_start && tegra_fb2_size) ?
859 /* Copy the bootloader fb to the fb. */
861 if (tegra_bootloader_fb_size)
862 __tegra_move_framebuffer(NULL,
863 tegra_fb_start, tegra_bootloader_fb_start,
864 min(tegra_fb_size, tegra_bootloader_fb_size));
866 __tegra_clear_framebuffer(NULL,
867 tegra_fb_start, tegra_fb_size);
870 /* Copy the bootloader fb2 to the fb2. */
872 if (tegra_bootloader_fb2_size)
873 __tegra_move_framebuffer(NULL,
874 tegra_fb2_start, tegra_bootloader_fb2_start,
875 min(tegra_fb2_size, tegra_bootloader_fb2_size));
877 __tegra_clear_framebuffer(NULL,
878 tegra_fb2_start, tegra_fb2_size);
882 int tegra_disp_defer_vcore_override(void)
884 #if defined(CONFIG_ARCH_TEGRA_12x_SOC) || defined(CONFIG_ARCH_TEGRA_13x_SOC)
885 struct clk *disp1_clk = clk_get_sys("tegradc.0", NULL);
886 struct clk *disp2_clk = clk_get_sys("tegradc.1", NULL);
889 struct device_node *np_target_disp1 = NULL;
890 struct device_node *np_target_disp2 = NULL;
891 struct device_node *np_disp1_timings = NULL;
892 struct device_node *np_disp1_def_out = NULL;
893 struct device_node *np_disp2_def_out = NULL;
894 struct device_node *entry = NULL;
896 bool is_hdmi_primary = false;
898 if (WARN_ON(IS_ERR(disp1_clk))) {
899 if (disp2_clk && !IS_ERR(disp2_clk))
901 return PTR_ERR(disp1_clk);
904 if (WARN_ON(IS_ERR(disp2_clk))) {
906 return PTR_ERR(disp1_clk);
909 np_target_disp1 = tegra_primary_panel_get_dt_node(NULL);
910 np_target_disp2 = tegra_secondary_panel_get_dt_node(NULL);
913 if (of_device_is_compatible(np_target_disp1, "hdmi,display"))
914 is_hdmi_primary = true;
916 if (!is_hdmi_primary) {
918 * internal panel is mapped to dc0,
919 * hdmi disp is mapped to dc1.
921 if (np_target_disp1) {
923 of_get_child_by_name(np_target_disp1,
926 if (np_disp1_timings) {
927 for_each_child_of_node(np_disp1_timings, entry) {
928 if (!of_property_read_u32(entry,
929 "clock-frequency", &temp)) {
930 disp1_rate = (long) temp;
935 if (np_target_disp2) {
937 of_get_child_by_name(np_target_disp2,
941 if (np_disp2_def_out) {
942 if (!of_property_read_u32(np_disp2_def_out,
943 "nvidia,out-max-pixclk", &temp)) {
944 disp2_rate = PICOS2KHZ(temp) * 1000;
947 disp2_rate = 297000000; /* HDMI 4K */
949 tegra_dvfs_resolve_override(disp1_clk, disp1_rate);
951 tegra_dvfs_resolve_override(disp2_clk, disp2_rate);
954 * this is hdmi primary
956 if (np_target_disp1) {
958 of_get_child_by_name(np_target_disp1,
961 if (np_disp1_def_out) {
962 if (!of_property_read_u32(np_disp1_def_out,
963 "nvidia,out-max-pixclk", &temp)) {
964 disp1_rate = PICOS2KHZ(temp) * 1000;
967 disp1_rate = 297000000; /* HDMI 4K */
970 tegra_dvfs_resolve_override(disp1_clk, disp1_rate);