2 * Copyright (c) 2013-2015, 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>
37 #define PRISM_THRESHOLD 50
40 atomic_t sd_brightness = ATOMIC_INIT(255);
41 EXPORT_SYMBOL(sd_brightness);
43 struct tegra_panel_ops *fixed_primary_panel_ops;
44 struct tegra_panel_ops *fixed_secondary_panel_ops;
45 const char *fixed_primary_panel_compatible;
46 const char *fixed_secondary_panel_compatible;
47 struct pwm_bl_data_dt_ops *fixed_pwm_bl_ops;
49 void tegra_dsi_resources_init(u8 dsi_instance,
50 struct resource *resources, int n_resources)
53 for (i = 0; i < n_resources; i++) {
54 struct resource *r = &resources[i];
55 if (resource_type(r) == IORESOURCE_MEM &&
56 !strcmp(r->name, "dsi_regs")) {
57 switch (dsi_instance) {
59 r->start = TEGRA_DSI_BASE;
60 r->end = TEGRA_DSI_BASE + TEGRA_DSI_SIZE - 1;
64 r->start = TEGRA_DSIB_BASE;
65 r->end = TEGRA_DSIB_BASE + TEGRA_DSIB_SIZE - 1;
69 if (resource_type(r) == IORESOURCE_MEM &&
70 !strcmp(r->name, "ganged_dsia_regs")) {
71 r->start = TEGRA_DSI_BASE;
72 r->end = TEGRA_DSI_BASE + TEGRA_DSI_SIZE - 1;
74 if (resource_type(r) == IORESOURCE_MEM &&
75 !strcmp(r->name, "ganged_dsib_regs")) {
76 r->start = TEGRA_DSIB_BASE;
77 r->end = TEGRA_DSIB_BASE + TEGRA_DSIB_SIZE - 1;
82 void tegra_dsi_update_init_cmd_gpio_rst(
83 struct tegra_dc_out *dsi_disp1_out)
86 for (i = 0; i < dsi_disp1_out->dsi->n_init_cmd; i++) {
87 if (dsi_disp1_out->dsi->dsi_init_cmd[i].cmd_type ==
89 dsi_disp1_out->dsi->dsi_init_cmd[i].sp_len_dly.gpio
90 = dsi_disp1_out->dsi->dsi_panel_rst_gpio;
94 int tegra_panel_reset(struct tegra_panel_of *panel, unsigned int delay_ms)
96 int gpio = panel->panel_gpio[TEGRA_GPIO_RESET];
98 if (!gpio_is_valid(gpio))
101 gpio_direction_output(gpio, 1);
102 usleep_range(1000, 5000);
103 gpio_set_value(gpio, 0);
104 usleep_range(1000, 5000);
105 gpio_set_value(gpio, 1);
112 static int tegra_bl_notify(struct device *dev, int brightness)
114 int cur_sd_brightness;
116 struct lp855x *lp = NULL;
117 struct platform_device *pdev = NULL;
118 struct device *dc_dev;
119 u8 *bl_measured = NULL;
122 pdev = to_platform_device(bus_find_device_by_name(
123 &platform_bus_type, NULL, "tegradc.0"));
127 if (brightness <= PRISM_THRESHOLD)
128 nvsd_enbl_dsbl_prism(dc_dev, false);
129 else if (brightness > PRISM_THRESHOLD + HYST_VAL)
130 nvsd_enbl_dsbl_prism(dc_dev, true);
133 /* Apply any backlight response curve */
134 if (brightness > 255)
135 pr_info("Error: Brightness > 255!\n");
136 else if (of_device_is_compatible(dev->of_node,
138 of_device_is_compatible(dev->of_node,
140 of_device_is_compatible(dev->of_node,
142 of_device_is_compatible(dev->of_node,
144 of_device_is_compatible(dev->of_node,
146 of_device_is_compatible(dev->of_node,
148 of_device_is_compatible(dev->of_node,
150 of_device_is_compatible(dev->of_node,
152 lp = (struct lp855x *)dev_get_drvdata(dev);
153 if (lp && lp->pdata) {
154 bl_measured = lp->pdata->bl_measured;
155 bl_curve = lp->pdata->bl_curve;
160 brightness = bl_curve[brightness];
162 cur_sd_brightness = atomic_read(&sd_brightness);
163 /* SD brightness is a percentage */
164 brightness = (brightness * cur_sd_brightness) / 255;
167 brightness = bl_measured[brightness];
172 static struct generic_bl_data_dt_ops generic_bl_ops = {
173 .notify = tegra_bl_notify,
176 int tegra_panel_gpio_get_dt(const char *comp_str,
177 struct tegra_panel_of *panel)
182 struct device_node *node =
183 of_find_compatible_node(NULL, NULL, comp_str);
186 * If gpios are already populated, just return.
188 if (panel->panel_gpio_populated)
192 pr_info("%s panel dt support not available\n", comp_str);
197 panel->panel_gpio[TEGRA_GPIO_RESET] =
198 of_get_named_gpio(node, "nvidia,panel-rst-gpio", 0);
200 panel->panel_gpio[TEGRA_GPIO_PANEL_EN] =
201 of_get_named_gpio(node, "nvidia,panel-en-gpio", 0);
203 panel->panel_gpio[TEGRA_GPIO_BL_ENABLE] =
204 of_get_named_gpio(node, "nvidia,panel-bl-en-gpio", 0);
206 panel->panel_gpio[TEGRA_GPIO_PWM] =
207 of_get_named_gpio(node, "nvidia,panel-bl-pwm-gpio", 0);
209 panel->panel_gpio[TEGRA_GPIO_BRIDGE_EN_0] =
210 of_get_named_gpio(node, "nvidia,panel-bridge-en-0-gpio", 0);
212 panel->panel_gpio[TEGRA_GPIO_BRIDGE_EN_1] =
213 of_get_named_gpio(node, "nvidia,panel-bridge-en-1-gpio", 0);
215 panel->panel_gpio[TEGRA_GPIO_BRIDGE_REFCLK_EN] =
216 of_get_named_gpio(node,
217 "nvidia,panel-bridge-refclk-en-gpio", 0);
219 for (cnt = 0; cnt < TEGRA_N_GPIO_PANEL; cnt++) {
220 if (gpio_is_valid(panel->panel_gpio[cnt])) {
222 case TEGRA_GPIO_RESET:
223 label = "tegra-panel-reset";
225 case TEGRA_GPIO_PANEL_EN:
226 label = "tegra-panel-en";
228 case TEGRA_GPIO_BL_ENABLE:
229 label = "tegra-panel-bl-enable";
232 label = "tegra-panel-pwm";
234 case TEGRA_GPIO_BRIDGE_EN_0:
235 label = "tegra-panel-bridge-en-0";
237 case TEGRA_GPIO_BRIDGE_EN_1:
238 label = "tegra-panel-bridge-en-1";
240 case TEGRA_GPIO_BRIDGE_REFCLK_EN:
241 label = "tegra-panel-bridge-refclk-en";
244 pr_err("tegra panel no gpio entry\n");
247 gpio_request(panel->panel_gpio[cnt],
253 if (gpio_is_valid(panel->panel_gpio[TEGRA_GPIO_PWM]))
254 gpio_free(panel->panel_gpio[TEGRA_GPIO_PWM]);
255 panel->panel_gpio_populated = true;
261 void tegra_set_fixed_panel_ops(bool is_primary,
262 struct tegra_panel_ops *p_ops, char *panel_compatible)
265 fixed_primary_panel_ops = p_ops;
266 fixed_primary_panel_compatible =
267 (const char *)panel_compatible;
269 fixed_secondary_panel_ops = p_ops;
270 fixed_secondary_panel_compatible =
271 (const char *)panel_compatible;
275 void tegra_set_fixed_pwm_bl_ops(struct pwm_bl_data_dt_ops *p_ops)
277 fixed_pwm_bl_ops = p_ops;
280 static bool tegra_available_pwm_bl_ops_register(struct device *dev)
282 struct device_node *np_bl = NULL;
283 struct device_node *np_parent = NULL;
284 const char *pn_compat = NULL;
287 np_parent = of_find_node_by_path("/backlight");
289 for_each_available_child_of_node(np_parent, np_bl) {
296 pr_info("no avaiable target backlight node\n");
300 pn_compat = of_get_property(np_bl, "compatible", NULL);
302 WARN(1, "No compatible prop in backlight node\n");
306 if (of_device_is_compatible(np_bl, "p,wuxga-10-1-bl")) {
307 dev_set_drvdata(dev, dsi_p_wuxga_10_1_ops.pwm_bl_ops);
308 } else if (of_device_is_compatible(np_bl, "lg,wxga-7-bl")) {
309 dev_set_drvdata(dev, dsi_lgd_wxga_7_0_ops.pwm_bl_ops);
310 } else if (of_device_is_compatible(np_bl, "s,wqxga-10-1-bl")) {
311 dev_set_drvdata(dev, dsi_s_wqxga_10_1_ops.pwm_bl_ops);
312 } else if (of_device_is_compatible(np_bl, "c,wxga-14-0-bl")) {
313 dev_set_drvdata(dev, lvds_c_1366_14_ops.pwm_bl_ops);
314 } else if (of_device_is_compatible(np_bl, "a,1080p-14-0-bl")) {
315 dev_set_drvdata(dev, dsi_a_1080p_14_0_ops.pwm_bl_ops);
316 } else if (of_device_is_compatible(np_bl, "j,1440-810-5-8-bl")) {
317 dev_set_drvdata(dev, dsi_j_1440_810_5_8_ops.pwm_bl_ops);
318 } else if (of_device_is_compatible(np_bl, "s,wuxga-7-0-bl")) {
319 dev_set_drvdata(dev, dsi_s_wuxga_7_0_ops.pwm_bl_ops);
320 } else if (of_device_is_compatible(np_bl, "s,wuxga-8-0-bl")) {
321 dev_set_drvdata(dev, dsi_s_wuxga_8_0_ops.pwm_bl_ops);
322 } else if (of_device_is_compatible(np_bl, "a,wuxga-8-0-bl")) {
323 dev_set_drvdata(dev, dsi_a_1200_1920_8_0_ops.pwm_bl_ops);
324 } else if (of_device_is_compatible(np_bl, "a,wxga-8-0-bl")) {
325 dev_set_drvdata(dev, dsi_a_1200_800_8_0_ops.pwm_bl_ops);
326 } else if (of_device_is_compatible(np_bl, "i-edp,1080p-11-6-bl")) {
327 dev_set_drvdata(dev, edp_i_1080p_11_6_ops.pwm_bl_ops);
328 } else if (of_device_is_compatible(np_bl, "a-edp,1080p-14-0-bl")) {
329 dev_set_drvdata(dev, edp_a_1080p_14_0_ops.pwm_bl_ops);
330 } else if (of_device_is_compatible(np_bl, "j,720p-5-0-bl")) {
331 dev_set_drvdata(dev, dsi_j_720p_5_ops.pwm_bl_ops);
332 } else if (of_device_is_compatible(np_bl, "l,720p-5-0-bl")) {
333 dev_set_drvdata(dev, dsi_l_720p_5_loki_ops.pwm_bl_ops);
334 } else if (of_device_is_compatible(np_bl, "s-edp,uhdtv-15-6-bl")) {
335 dev_set_drvdata(dev, edp_s_uhdtv_15_6_ops.pwm_bl_ops);
337 pr_info("invalid compatible for backlight node\n");
343 of_node_put(np_parent);
347 static void tegra_pwm_bl_ops_reg_based_on_disp_board_id(struct device *dev)
349 struct board_info display_board;
351 bool is_dsi_a_1200_1920_8_0 = false;
352 bool is_dsi_a_1200_800_8_0 = false;
353 bool is_edp_i_1080p_11_6 = false;
354 bool is_edp_a_1080p_14_0 = false;
355 bool is_edp_s_2160p_15_6 = false;
357 tegra_get_display_board_info(&display_board);
359 switch (display_board.board_id) {
362 dev_set_drvdata(dev, dsi_p_wuxga_10_1_ops.pwm_bl_ops);
365 dev_set_drvdata(dev, dsi_lgd_wxga_7_0_ops.pwm_bl_ops);
370 dev_set_drvdata(dev, dsi_s_wqxga_10_1_ops.pwm_bl_ops);
373 dev_set_drvdata(dev, lvds_c_1366_14_ops.pwm_bl_ops);
376 dev_set_drvdata(dev, dsi_a_1080p_14_0_ops.pwm_bl_ops);
379 dev_set_drvdata(dev, dsi_j_1440_810_5_8_ops.pwm_bl_ops);
382 if (display_board.fab == 0x2)
384 dsi_j_720p_5_ops.pwm_bl_ops);
385 else if (display_board.fab == 0x1)
387 dsi_j_1440_810_5_8_ops.pwm_bl_ops);
390 dsi_l_720p_5_loki_ops.pwm_bl_ops);
394 is_dsi_a_1200_1920_8_0 = true;
397 is_dsi_a_1200_800_8_0 = true;
400 if (tegra_get_board_panel_id())
401 is_dsi_a_1200_1920_8_0 = true;
403 is_dsi_a_1200_800_8_0 = true;
407 if (of_machine_is_compatible("nvidia,jetson-cv"))
408 is_edp_s_2160p_15_6 = true;
409 else if (display_board.sku == 1200)
410 is_edp_i_1080p_11_6 = true;
412 is_edp_a_1080p_14_0 = true;
416 * Finally, check if there's fixed_pwm_bl_ops
418 if (fixed_pwm_bl_ops)
419 dev_set_drvdata(dev, fixed_pwm_bl_ops);
421 pr_info("pwm_bl_ops are not required\n");
424 if (is_dsi_a_1200_1920_8_0)
425 dev_set_drvdata(dev, dsi_a_1200_1920_8_0_ops.pwm_bl_ops);
426 if (is_dsi_a_1200_800_8_0)
427 dev_set_drvdata(dev, dsi_a_1200_800_8_0_ops.pwm_bl_ops);
429 if (is_edp_i_1080p_11_6)
430 dev_set_drvdata(dev, edp_i_1080p_11_6_ops.pwm_bl_ops);
431 if (is_edp_a_1080p_14_0)
432 dev_set_drvdata(dev, edp_a_1080p_14_0_ops.pwm_bl_ops);
433 if (is_edp_s_2160p_15_6)
434 dev_set_drvdata(dev, edp_s_uhdtv_15_6_ops.pwm_bl_ops);
437 void tegra_pwm_bl_ops_register(struct device *dev)
440 ret = tegra_available_pwm_bl_ops_register(dev);
442 tegra_pwm_bl_ops_reg_based_on_disp_board_id(dev);
445 void ti_lp855x_bl_ops_register(struct device *dev)
447 dev_set_drvdata(dev, &generic_bl_ops);
450 static void tegra_panel_register_ops(struct tegra_dc_out *dc_out,
451 struct tegra_panel_ops *p_ops)
456 /* TODO: register default ops */
459 dc_out->enable = p_ops->enable;
460 dc_out->postpoweron = p_ops->postpoweron;
461 dc_out->prepoweroff = p_ops->prepoweroff;
462 dc_out->disable = p_ops->disable;
463 dc_out->hotplug_init = p_ops->hotplug_init;
464 dc_out->postsuspend = p_ops->postsuspend;
465 dc_out->hotplug_report = p_ops->hotplug_report;
467 static struct device_node *available_internal_panel_select(
468 struct tegra_dc_platform_data *pdata)
470 struct device_node *np_panel = NULL;
471 struct device_node *np_dsi = NULL, *np_sor = NULL;
472 struct tegra_dc_out *dc_out = NULL;
473 const char *pn_compat = NULL;
476 * for internal panel node, search
477 * child node from DSI_NODE at first.
478 * If child node is not found, search
479 * child node from SOR_NODE.
482 np_dsi = of_find_node_by_path(DSI_NODE);
484 for_each_available_child_of_node(np_dsi, np_panel) {
491 np_sor = of_find_node_by_path(SOR_NODE);
493 for_each_available_child_of_node(np_sor, np_panel) {
494 if (np_panel && of_get_child_by_name(
495 np_panel, "disp-default-out"))
502 pr_info("panel_select fail by _node_status\n");
509 dc_out = pdata->default_out;
511 WARN(1, "dc_out is not valid\n");
512 of_node_put(np_panel);
517 pn_compat = of_get_property(np_panel, "compatible", NULL);
519 WARN(1, "panel node do not have compatible prop\n");
520 of_node_put(np_panel);
525 if (of_device_is_compatible(np_panel, "p,wuxga-10-1")) {
526 tegra_panel_register_ops(dc_out,
527 &dsi_p_wuxga_10_1_ops);
528 } else if (of_device_is_compatible(np_panel, "lg,wxga-7")) {
529 tegra_panel_register_ops(dc_out,
530 &dsi_lgd_wxga_7_0_ops);
531 } else if (of_device_is_compatible(np_panel, "s,wqxga-10-1")) {
532 tegra_panel_register_ops(dc_out,
533 &dsi_s_wqxga_10_1_ops);
534 } else if (of_device_is_compatible(np_panel, "c,wxga-14-0")) {
535 tegra_panel_register_ops(dc_out,
536 &lvds_c_1366_14_ops);
537 } else if (of_device_is_compatible(np_panel, "a,1080p-14-0")) {
538 tegra_panel_register_ops(dc_out,
539 &dsi_a_1080p_14_0_ops);
540 } else if (of_device_is_compatible(np_panel, "j,1440-810-5-8")) {
541 tegra_panel_register_ops(dc_out,
542 &dsi_j_1440_810_5_8_ops);
543 } else if (of_device_is_compatible(np_panel, "s,wuxga-7-0")) {
544 tegra_panel_register_ops(dc_out,
545 &dsi_s_wuxga_7_0_ops);
546 } else if (of_device_is_compatible(np_panel, "s,wuxga-8-0")) {
547 tegra_panel_register_ops(dc_out,
548 &dsi_s_wuxga_8_0_ops);
549 } else if (of_device_is_compatible(np_panel, "a,wuxga-8-0")) {
550 tegra_panel_register_ops(dc_out,
551 &dsi_a_1200_1920_8_0_ops);
552 } else if (of_device_is_compatible(np_panel, "a,wxga-8-0")) {
553 tegra_panel_register_ops(dc_out,
554 &dsi_a_1200_800_8_0_ops);
555 } else if (of_device_is_compatible(np_panel, "i-edp,1080p-11-6")) {
556 tegra_panel_register_ops(dc_out,
557 &edp_i_1080p_11_6_ops);
558 } else if (of_device_is_compatible(np_panel, "a-edp,1080p-14-0")) {
559 tegra_panel_register_ops(dc_out,
560 &edp_a_1080p_14_0_ops);
561 } else if (of_device_is_compatible(np_panel, "j,720p-5-0")) {
562 tegra_panel_register_ops(dc_out,
564 } else if (of_device_is_compatible(np_panel, "l,720p-5-0")) {
565 tegra_panel_register_ops(dc_out,
566 &dsi_l_720p_5_loki_ops);
567 } else if (of_device_is_compatible(np_panel, "s-edp,uhdtv-15-6")) {
568 tegra_panel_register_ops(dc_out,
569 &edp_s_uhdtv_15_6_ops);
571 pr_info("invalid panel compatible\n");
572 of_node_put(np_panel);
582 static struct device_node
583 *internal_panel_select_by_disp_board_id(
584 struct tegra_dc_platform_data *pdata)
586 struct device_node *np_panel = NULL;
587 struct tegra_dc_out *dc_out = NULL;
588 struct board_info display_board;
590 bool is_dsi_a_1200_1920_8_0 = false;
591 bool is_dsi_a_1200_800_8_0 = false;
592 bool is_edp_i_1080p_11_6 = false;
593 bool is_edp_a_1080p_14_0 = false;
594 bool is_edp_s_2160p_15_6 = false;
596 tegra_get_display_board_info(&display_board);
597 pr_info("display board info: id 0x%x, fab 0x%x\n",
598 display_board.board_id, display_board.fab);
601 dc_out = pdata->default_out;
603 switch (display_board.board_id) {
606 np_panel = of_find_compatible_node(NULL, NULL, "p,wuxga-10-1");
607 if (np_panel && pdata && dc_out)
608 tegra_panel_register_ops(dc_out,
609 &dsi_p_wuxga_10_1_ops);
612 np_panel = of_find_compatible_node(NULL, NULL, "lg,wxga-7");
613 if (np_panel && pdata && dc_out)
614 tegra_panel_register_ops(dc_out,
615 &dsi_lgd_wxga_7_0_ops);
620 np_panel = of_find_compatible_node(NULL, NULL, "s,wqxga-10-1");
621 if (np_panel && pdata && dc_out)
622 tegra_panel_register_ops(dc_out,
623 &dsi_s_wqxga_10_1_ops);
626 np_panel = of_find_compatible_node(NULL, NULL, "c,wxga-14-0");
627 if (np_panel && pdata && dc_out)
628 tegra_panel_register_ops(dc_out,
629 &lvds_c_1366_14_ops);
632 np_panel = of_find_compatible_node(NULL, NULL, "a,1080p-14-0");
633 if (np_panel && pdata && dc_out)
634 tegra_panel_register_ops(dc_out,
635 &dsi_a_1080p_14_0_ops);
638 np_panel = of_find_compatible_node(NULL,
639 NULL, "j,1440-810-5-8");
640 if (np_panel && pdata && dc_out)
641 tegra_panel_register_ops(dc_out,
642 &dsi_j_1440_810_5_8_ops);
645 if (display_board.fab == 0x2) {
646 np_panel = of_find_compatible_node(NULL, NULL,
648 if (np_panel && pdata && dc_out)
649 tegra_panel_register_ops(dc_out,
651 } else if (display_board.fab == 0x1) {
652 np_panel = of_find_compatible_node(NULL, NULL,
654 if (np_panel && pdata && dc_out)
655 tegra_panel_register_ops(dc_out,
656 &dsi_j_1440_810_5_8_ops);
658 np_panel = of_find_compatible_node(NULL, NULL,
660 if (np_panel && pdata && dc_out)
661 tegra_panel_register_ops(dc_out,
662 &dsi_l_720p_5_loki_ops);
667 is_dsi_a_1200_1920_8_0 = true;
670 is_dsi_a_1200_800_8_0 = true;
673 if (tegra_get_board_panel_id())
674 is_dsi_a_1200_1920_8_0 = true;
676 is_dsi_a_1200_800_8_0 = true;
680 if (of_machine_is_compatible("nvidia,jetson-cv"))
681 is_edp_s_2160p_15_6 = true;
682 else if (display_board.sku == 1200)
683 is_edp_i_1080p_11_6 = true;
685 is_edp_a_1080p_14_0 = true;
688 /* If display panel is not searched by display board id,
689 * check if there's fixed primary panel.
691 if (fixed_primary_panel_ops &&
692 fixed_primary_panel_compatible) {
693 np_panel = of_find_compatible_node(NULL, NULL,
694 fixed_primary_panel_compatible);
695 if (np_panel && pdata && dc_out)
696 tegra_panel_register_ops(dc_out,
697 fixed_primary_panel_ops);
701 if (is_dsi_a_1200_1920_8_0) {
702 np_panel = of_find_compatible_node(NULL, NULL,
704 if (np_panel && pdata && dc_out)
705 tegra_panel_register_ops(dc_out,
706 &dsi_a_1200_1920_8_0_ops);
708 if (is_dsi_a_1200_800_8_0) {
709 np_panel = of_find_compatible_node(NULL, NULL,
711 if (np_panel && pdata && dc_out)
712 tegra_panel_register_ops(dc_out,
713 &dsi_a_1200_800_8_0_ops);
716 if (is_edp_i_1080p_11_6) {
717 np_panel = of_find_compatible_node(NULL, NULL,
719 if (np_panel && pdata && dc_out)
720 tegra_panel_register_ops(dc_out,
721 &edp_i_1080p_11_6_ops);
723 if (is_edp_a_1080p_14_0) {
724 np_panel = of_find_compatible_node(NULL, NULL,
726 if (np_panel && pdata && dc_out)
727 tegra_panel_register_ops(dc_out,
728 &edp_a_1080p_14_0_ops);
730 if (is_edp_s_2160p_15_6) {
731 np_panel = of_find_compatible_node(NULL, NULL,
733 if (np_panel && pdata && dc_out)
734 tegra_panel_register_ops(dc_out,
735 &edp_s_uhdtv_15_6_ops);
743 struct device_node *tegra_primary_panel_get_dt_node(
744 struct tegra_dc_platform_data *pdata)
746 struct device_node *np_panel = NULL;
747 struct tegra_dc_out *dc_out = NULL;
748 struct device_node *np_hdmi =
749 of_find_node_by_path(HDMI_NODE);
752 dc_out = pdata->default_out;
755 internal_panel_select_by_disp_board_id(pdata);
758 * legacy method to select internal panel
759 * based on disp board id.
761 of_node_put(np_hdmi);
766 available_internal_panel_select(pdata);
769 * search internal panel node by
772 of_node_put(np_hdmi);
777 * Check hdmi primary, if there's neither
778 * valid internal panel nor fixed panel.
781 of_get_child_by_name(np_hdmi, "hdmi-display");
783 of_node_put(np_hdmi);
784 return of_device_is_available(np_panel) ? np_panel : NULL;
787 struct device_node *tegra_secondary_panel_get_dt_node(
788 struct tegra_dc_platform_data *pdata)
790 struct device_node *np_panel = NULL, *np_display = NULL;
791 struct tegra_dc_out *dc_out = NULL;
792 const char *sor1_output_type;
795 dc_out = pdata->default_out;
797 if (fixed_secondary_panel_ops &&
798 fixed_secondary_panel_compatible) {
799 np_panel = of_find_compatible_node(NULL, NULL,
800 fixed_secondary_panel_compatible);
801 if (np_panel && pdata && dc_out)
802 tegra_panel_register_ops(dc_out,
803 fixed_secondary_panel_ops);
805 np_display = of_find_node_by_path(SOR1_NODE);
806 if (!of_property_read_string(np_display,
807 "nvidia,sor1-output-type", &sor1_output_type)) {
808 if (strcmp(sor1_output_type, "dp") == 0) {
809 np_panel = of_get_child_by_name(np_display,
816 of_node_put(np_display);
817 np_display = of_find_node_by_path(HDMI_NODE);
818 np_panel = of_get_child_by_name(np_display, "hdmi-display");
821 of_node_put(np_display);
822 return of_device_is_available(np_panel) ? np_panel : NULL;
825 void tegra_fb_copy_or_clear(void)
827 bool fb_existed = (tegra_fb_start && tegra_fb_size) ?
829 bool fb2_existed = (tegra_fb2_start && tegra_fb2_size) ?
832 /* Copy the bootloader fb to the fb. */
834 if (tegra_bootloader_fb_size)
835 __tegra_move_framebuffer(NULL,
836 tegra_fb_start, tegra_bootloader_fb_start,
837 min(tegra_fb_size, tegra_bootloader_fb_size));
839 __tegra_clear_framebuffer(NULL,
840 tegra_fb_start, tegra_fb_size);
843 /* Copy the bootloader fb2 to the fb2. */
845 if (tegra_bootloader_fb2_size)
846 __tegra_move_framebuffer(NULL,
847 tegra_fb2_start, tegra_bootloader_fb2_start,
848 min(tegra_fb2_size, tegra_bootloader_fb2_size));
850 __tegra_clear_framebuffer(NULL,
851 tegra_fb2_start, tegra_fb2_size);
855 int tegra_disp_defer_vcore_override(void)
857 #if defined(CONFIG_ARCH_TEGRA_12x_SOC) || defined(CONFIG_ARCH_TEGRA_13x_SOC)
858 struct clk *disp1_clk = clk_get_sys("tegradc.0", NULL);
859 struct clk *disp2_clk = clk_get_sys("tegradc.1", NULL);
862 struct device_node *np_target_disp1 = NULL;
863 struct device_node *np_target_disp2 = NULL;
864 struct device_node *np_disp1_timings = NULL;
865 struct device_node *np_disp1_def_out = NULL;
866 struct device_node *np_disp2_def_out = NULL;
867 struct device_node *entry = NULL;
869 bool is_hdmi_primary = false;
871 if (WARN_ON(IS_ERR(disp1_clk))) {
872 if (disp2_clk && !IS_ERR(disp2_clk))
874 return PTR_ERR(disp1_clk);
877 if (WARN_ON(IS_ERR(disp2_clk))) {
879 return PTR_ERR(disp1_clk);
882 np_target_disp1 = tegra_primary_panel_get_dt_node(NULL);
883 np_target_disp2 = tegra_secondary_panel_get_dt_node(NULL);
886 if (of_device_is_compatible(np_target_disp1, "hdmi,display"))
887 is_hdmi_primary = true;
889 if (!is_hdmi_primary) {
891 * internal panel is mapped to dc0,
892 * hdmi disp is mapped to dc1.
894 if (np_target_disp1) {
896 of_get_child_by_name(np_target_disp1,
899 if (np_disp1_timings) {
900 for_each_child_of_node(np_disp1_timings, entry) {
901 if (!of_property_read_u32(entry,
902 "clock-frequency", &temp)) {
903 disp1_rate = (long) temp;
908 if (np_target_disp2) {
910 of_get_child_by_name(np_target_disp2,
914 if (np_disp2_def_out) {
915 if (!of_property_read_u32(np_disp2_def_out,
916 "nvidia,out-max-pixclk", &temp)) {
917 disp2_rate = PICOS2KHZ(temp) * 1000;
920 disp2_rate = 297000000; /* HDMI 4K */
922 tegra_dvfs_resolve_override(disp1_clk, disp1_rate);
924 tegra_dvfs_resolve_override(disp2_clk, disp2_rate);
927 * this is hdmi primary
929 if (np_target_disp1) {
931 of_get_child_by_name(np_target_disp1,
934 if (np_disp1_def_out) {
935 if (!of_property_read_u32(np_disp1_def_out,
936 "nvidia,out-max-pixclk", &temp)) {
937 disp1_rate = PICOS2KHZ(temp) * 1000;
940 disp1_rate = 297000000; /* HDMI 4K */
943 tegra_dvfs_resolve_override(disp1_clk, disp1_rate);