Loading Documentation/devicetree/bindings/fb/mdss-dsi-panel.txt +41 −0 Original line number Diff line number Diff line Loading @@ -378,6 +378,8 @@ Optional properties: go blank during transition. "dynamic-switch-immediate"= Switch on next frame update. Panel will not go blank for this transition. "dynamic-resolution-switch-immediate"= Switch the panel resolution. Panel will not go blank for this transition. - qcom,mdss-dsi-post-mode-switch-on-command: Multiple dcs packets used for turning on DSI panel after panel has switch modes. Refer to "qcom,mdss-dsi-on-command" section for adding commands. Loading @@ -395,6 +397,20 @@ Optional properties: for any commands that we send. - qcom,mdss-dsi-force-clock-lane-hs: Boolean to force dsi clock lanes to HS mode always. - qcom,mdss-dsi-display-timings: Parent node that lists the different resolutions that the panel supports. Each child represents timings settings for a specific resolution. Additional properties added to the second level nodes that represent timings properties: - qcom,mdss-dsi-timing-default: Property that specifies the current child as the default timing configuration that will be used. - qcom,mdss-dsi-timing-switch-command: List of commands that need to be sent to panel when the resolution/timing switch happens dynamically. Refer to "qcom,mdss-dsi-on-command" section for adding commands. - qcom,mdss-dsi-timing-switch-command-state: String that specifies the ctrl state for sending resolution switch commands. "dsi_lp_mode" = DSI low power mode (default) "dsi_hs_mode" = DSI high speed mode Note, if a given optional qcom,* binding is not present, then the driver will configure the default values specified. Loading Loading @@ -530,5 +546,30 @@ Example: <128 240 64>; qcom,mdss-dsi-panel-orientation = "180" qcom,mdss-dsi-force-clock-lane-hs; qcom,mdss-dsi-display-timings { wqhd { qcom,mdss-dsi-timing-default; qcom,mdss-dsi-panel-width = <720>; qcom,mdss-dsi-panel-height = <2560>; qcom,mdss-dsi-h-front-porch = <20>; qcom,mdss-dsi-h-back-porch = <8>; qcom,mdss-dsi-h-pulse-width = <8>; qcom,mdss-dsi-h-sync-skew = <0>; qcom,mdss-dsi-v-back-porch = <4>; qcom,mdss-dsi-v-front-porch = <728>; qcom,mdss-dsi-v-pulse-width = <4>; qcom,mdss-dsi-panel-framerate = <60>; qcom,mdss-dsi-panel-timings = [E6 38 26 00 68 6E 2A 3C 2C 03 04 00]; qcom,mdss-dsi-t-clk-post = <0x02>; qcom,mdss-dsi-t-clk-pre = <0x2a>; qcom,mdss-dsi-on-command = [05 01 00 00 a0 00 02 11 00 05 01 00 00 02 00 02 29 00]; qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; qcom,mdss-dsi-timing-switch-command = [ 29 00 00 00 00 00 02 B0 04 29 00 00 00 00 00 02 F1 00]; qcom,mdss-dsi-timing-switch-command-state = "dsi_lp_mode"; }; }; }; }; arch/arm/boot/dts/qcom/dsi-panel-nt35950-4k-dualmipi0-cmd.dtsi 0 → 100644 +171 −0 Original line number Diff line number Diff line /* Copyright (c) 2015, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and * only version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ &mdss_mdp { dsi_dual_nt35950_4k_cmd_0: qcom,mdss_dsi_nt35950_4k_cmd_0 { qcom,mdss-dsi-panel-name = "NT35950 4K dual 0 cmd mode dsi panel"; qcom,mdss-dsi-panel-controller = <&mdss_dsi0>; qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; qcom,mdss-dsi-panel-destination = "display_1"; qcom,mdss-dsi-virtual-channel-id = <0>; qcom,mdss-dsi-stream = <0>; qcom,mdss-dsi-bpp = <24>; qcom,mdss-dsi-underflow-color = <0xff>; qcom,mdss-dsi-border-color = <0>; qcom,mdss-dsi-off-command = [05 01 00 00 0A 00 01 28 05 01 00 00 96 00 01 10]; qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; qcom,mdss-dsi-h-sync-pulse = <1>; qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; qcom,mdss-dsi-bllp-eof-power-mode; qcom,mdss-dsi-bllp-power-mode; qcom,mdss-dsi-dma-trigger = "trigger_sw"; qcom,mdss-dsi-mdp-trigger = "none"; qcom,mdss-dsi-lane-0-state; qcom,mdss-dsi-lane-1-state; qcom,mdss-dsi-lane-2-state; qcom,mdss-dsi-lane-3-state; qcom,mdss-dsi-te-pin-select = <1>; qcom,mdss-dsi-wr-mem-start = <0x2c>; qcom,mdss-dsi-wr-mem-continue = <0x3c>; qcom,mdss-dsi-te-dcs-command = <1>; qcom,mdss-dsi-te-check-enable; qcom,mdss-dsi-te-using-te-pin; qcom,mdss-dsi-tx-eot-append; qcom,mdss-dsi-lp11-init; qcom,mdss-dsi-bl-min-level = <1>; qcom,mdss-dsi-bl-max-level = <4095>; qcom,mdss-brightness-max-level = <4095>; qcom,mdss-dsi-reset-sequence = <0 10>, <1 10>, <0 20>, <1 20>; qcom,mdss-pan-physical-width-dimension = <68>; qcom,mdss-pan-physical-height-dimension = <121>; qcom,dynamic-mode-switch-enabled; qcom,dynamic-mode-switch-type = "dynamic-resolution-switch-immediate"; qcom,mdss-dsi-h-sync-skew = <0>; qcom,mdss-dsi-h-left-border = <0>; qcom,mdss-dsi-h-right-border = <0>; qcom,mdss-dsi-v-top-border = <0>; qcom,mdss-dsi-v-bottom-border = <0>; qcom,mdss-dsi-display-timings { 1080p { qcom,mdss-dsi-panel-clockrate = <897040000>; qcom,mdss-dsi-timing-default; qcom,mdss-dsi-panel-width = <540>; qcom,mdss-dsi-panel-height = <1920>; qcom,mdss-dsi-h-back-porch = <8>; qcom,mdss-dsi-h-pulse-width = <8>; qcom,mdss-dsi-h-front-porch = <20>; qcom,mdss-dsi-v-back-porch = <8>; qcom,mdss-dsi-v-pulse-width = <8>; qcom,mdss-dsi-v-front-porch = <2390>; qcom,mdss-dsi-panel-framerate = <60>; qcom,mdss-dsi-panel-timings = [E6 38 26 00 68 66 32 3C 2C 03 04 00 ]; qcom,mdss-dsi-t-clk-post = <0x02>; qcom,mdss-dsi-t-clk-pre = <0x2B>; qcom,mdss-dsi-on-command = [15 01 00 00 00 00 02 90 00 39 01 00 00 00 00 06 F0 55 AA 52 08 07 15 01 00 00 00 00 02 EF 01 39 01 00 00 00 00 06 F0 55 AA 52 08 00 15 01 00 00 00 00 02 B4 01 39 01 00 00 00 00 10 BD 00 B4 0C 0C 00 01 68 09 09 01 0E 0C 0C 00 D5 39 01 00 00 00 00 05 FF AA 55 A5 80 15 01 00 00 00 00 02 6F 18 15 01 00 00 00 00 02 F7 06 15 01 00 00 00 00 02 58 01 15 01 00 00 00 00 02 35 00 39 01 00 00 00 00 03 44 00 00 39 01 00 00 00 00 06 f0 55 aa 52 08 00 15 01 00 00 00 00 02 C9 01 05 01 00 00 96 00 01 11 05 01 00 00 96 00 01 29]; qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; qcom,mdss-dsi-timing-switch-command = [ 15 00 00 00 00 00 02 90 00 15 01 00 00 00 00 02 58 01 ]; qcom,mdss-dsi-timing-switch-command-state = "dsi_lp_mode"; qcom,mdss-tear-check-sync-init-val = <3840>; qcom,mdss-tear-check-start-pos = <3840>; qcom,mdss-tear-check-rd-ptr-trigger-intr = <3841>; }; 4k { qcom,mdss-dsi-panel-width = <1080>; qcom,mdss-dsi-panel-height = <3840>; qcom,mdss-dsi-h-back-porch = <8>; qcom,mdss-dsi-h-pulse-width = <8>; qcom,mdss-dsi-h-front-porch = <8>; qcom,mdss-dsi-v-back-porch = <8>; qcom,mdss-dsi-v-pulse-width = <8>; qcom,mdss-dsi-v-front-porch = <8>; qcom,mdss-dsi-panel-framerate = <60>; qcom,mdss-dsi-panel-timings = [E6 38 26 00 68 66 32 3C 2C 03 04 00 ]; qcom,mdss-dsi-t-clk-post = <0x02>; qcom,mdss-dsi-t-clk-pre = <0x2B>; qcom,mdss-dsi-on-command = [15 01 00 00 00 00 02 90 02 39 01 00 00 00 00 06 F0 55 AA 52 08 07 15 01 00 00 00 00 02 EF 01 39 01 00 00 00 00 06 F0 55 AA 52 08 00 15 01 00 00 00 00 02 B4 01 39 01 00 00 00 00 10 BD 00 B4 0C 0C 00 01 68 09 09 01 0E 0C 0C 00 D5 39 01 00 00 00 00 05 FF AA 55 A5 80 15 01 00 00 00 00 02 6F 18 15 01 00 00 00 00 02 F7 06 15 01 00 00 00 00 02 35 00 39 01 00 00 00 00 03 44 00 00 39 01 00 00 00 00 06 f0 55 aa 52 08 00 15 01 00 00 00 00 02 c9 01 05 01 00 00 96 00 01 11 05 01 00 00 96 00 01 29]; qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; qcom,mdss-dsi-timing-switch-command = [ 15 00 00 00 00 00 02 90 02 15 01 00 00 00 00 02 58 00 ]; qcom,mdss-dsi-timing-switch-command-state = "dsi_lp_mode"; qcom,mdss-dsi-fbc-enable; qcom,mdss-dsi-fbc-ver2-mode; qcom,mdss-dsi-fbc-bpp = <8>; qcom,mdss-dsi-fbc-packing = <1>; qcom,mdss-dsi-fbc-2d-pred-mode; qcom,mdss-dsi-fbc-slice-height = <4>; qcom,mdss-dsi-fbc-quant-error; qcom,mdss-dsi-fbc-bias = <2>; qcom,mdss-dsi-fbc-vlc-mode; qcom,mdss-dsi-fbc-bflc-mode; qcom,mdss-dsi-fbc-lossy-mode-idx = <3>; qcom,mdss-dsi-fbc-pat-mode; qcom,mdss-dsi-fbc-budget-ctrl = <5>; qcom,mdss-dsi-fbc-block-budget = <59>; qcom,mdss-dsi-fbc-h-line-budget = <675>; qcom,mdss-dsi-fbc-lossless-threshold = <0x200>; qcom,mdss-dsi-fbc-lossy-threshold = <192>; qcom,mdss-dsi-fbc-rgb-threshold = <4>; qcom,mdss-dsi-fbc-max-pred-err = <3>; qcom,mdss-dsi-panel-clockrate = <897040000>; qcom,mdss-tear-check-sync-init-val = <3840>; qcom,mdss-tear-check-start-pos = <3840>; qcom,mdss-tear-check-rd-ptr-trigger-intr = <3841>; }; }; }; }; arch/arm/boot/dts/qcom/dsi-panel-nt35950-4k-dualmipi1-cmd.dtsi 0 → 100644 +173 −0 Original line number Diff line number Diff line /* Copyright (c) 2015, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and * only version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ &mdss_mdp { dsi_dual_nt35950_4k_cmd_1: qcom,mdss_dsi_nt35950_4k_cmd_1 { qcom,mdss-dsi-panel-name = "NT35950 4K dual 1 cmd mode dsi panel"; qcom,mdss-dsi-panel-controller = <&mdss_dsi1>; qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; qcom,mdss-dsi-panel-destination = "display_2"; qcom,mdss-dsi-virtual-channel-id = <0>; qcom,mdss-dsi-stream = <0>; qcom,mdss-dsi-bpp = <24>; qcom,mdss-dsi-underflow-color = <0xff>; qcom,mdss-dsi-border-color = <0>; qcom,mdss-dsi-off-command = [05 01 00 00 0A 00 01 28 05 01 00 00 96 00 01 10]; qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; qcom,mdss-dsi-h-sync-pulse = <1>; qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; qcom,mdss-dsi-bllp-eof-power-mode; qcom,mdss-dsi-bllp-power-mode; qcom,mdss-dsi-dma-trigger = "trigger_sw"; qcom,mdss-dsi-mdp-trigger = "none"; qcom,mdss-dsi-lane-0-state; qcom,mdss-dsi-lane-1-state; qcom,mdss-dsi-lane-2-state; qcom,mdss-dsi-lane-3-state; qcom,mdss-dsi-te-pin-select = <1>; qcom,mdss-dsi-wr-mem-start = <0x2c>; qcom,mdss-dsi-wr-mem-continue = <0x3c>; qcom,mdss-dsi-te-dcs-command = <1>; qcom,mdss-dsi-te-check-enable; qcom,mdss-dsi-te-using-te-pin; qcom,mdss-dsi-tx-eot-append; qcom,mdss-dsi-lp11-init; qcom,mdss-dsi-bl-min-level = <1>; qcom,mdss-dsi-bl-max-level = <4095>; qcom,mdss-brightness-max-level = <4095>; qcom,mdss-dsi-reset-sequence = <0 10>, <1 10>, <0 20>, <1 20>; qcom,mdss-pan-physical-width-dimension = <68>; qcom,mdss-pan-physical-height-dimension = <121>; qcom,dynamic-mode-switch-enabled; qcom,dynamic-mode-switch-type = "dynamic-resolution-switch-immediate"; qcom,mdss-dsi-h-sync-skew = <0>; qcom,mdss-dsi-h-left-border = <0>; qcom,mdss-dsi-h-right-border = <0>; qcom,mdss-dsi-v-top-border = <0>; qcom,mdss-dsi-v-bottom-border = <0>; qcom,mdss-dsi-display-timings { 1080p { qcom,mdss-dsi-panel-clockrate = <897040000>; qcom,mdss-dsi-timing-default; qcom,mdss-dsi-panel-width = <540>; qcom,mdss-dsi-panel-height = <1920>; qcom,mdss-dsi-h-back-porch = <8>; qcom,mdss-dsi-h-pulse-width = <8>; qcom,mdss-dsi-h-front-porch = <20>; qcom,mdss-dsi-v-back-porch = <8>; qcom,mdss-dsi-v-pulse-width = <8>; qcom,mdss-dsi-v-front-porch = <2390>; qcom,mdss-dsi-panel-framerate = <60>; qcom,mdss-dsi-panel-timings = [E6 38 26 00 68 66 32 3C 2C 03 04 00 ]; qcom,mdss-dsi-t-clk-post = <0x02>; qcom,mdss-dsi-t-clk-pre = <0x2B>; qcom,mdss-dsi-on-command = [15 01 00 00 00 00 02 90 00 39 01 00 00 00 00 06 F0 55 AA 52 08 07 15 01 00 00 00 00 02 EF 01 39 01 00 00 00 00 06 F0 55 AA 52 08 00 15 01 00 00 00 00 02 B4 01 39 01 00 00 00 00 10 BD 00 B4 0C 0C 00 01 68 09 09 01 0E 0C 0C 00 D5 39 01 00 00 00 00 05 FF AA 55 A5 80 15 01 00 00 00 00 02 6F 18 15 01 00 00 00 00 02 F7 06 15 01 00 00 00 00 02 58 01 15 01 00 00 00 00 02 35 00 39 01 00 00 00 00 03 44 00 00 39 01 00 00 00 00 06 f0 55 aa 52 08 00 15 01 00 00 00 00 02 C9 01 05 01 00 00 96 00 01 11 05 01 00 00 96 00 01 29]; qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; qcom,mdss-dsi-timing-switch-command = [ 15 00 00 00 00 00 02 90 00 15 01 00 00 00 00 02 58 01 ]; qcom,mdss-dsi-timing-switch-command-state = "dsi_lp_mode"; qcom,mdss-tear-check-sync-init-val = <3840>; qcom,mdss-tear-check-start-pos = <3840>; qcom,mdss-tear-check-rd-ptr-trigger-intr = <3841>; }; 4k { qcom,mdss-dsi-panel-width = <1080>; qcom,mdss-dsi-panel-height = <3840>; qcom,mdss-dsi-h-back-porch = <8>; qcom,mdss-dsi-h-pulse-width = <8>; qcom,mdss-dsi-h-front-porch = <8>; qcom,mdss-dsi-v-back-porch = <8>; qcom,mdss-dsi-v-pulse-width = <8>; qcom,mdss-dsi-v-front-porch = <8>; qcom,mdss-dsi-panel-framerate = <60>; qcom,mdss-dsi-panel-timings = [E6 38 26 00 68 66 32 3C 2C 03 04 00 ]; qcom,mdss-dsi-t-clk-post = <0x02>; qcom,mdss-dsi-t-clk-pre = <0x2B>; qcom,mdss-dsi-on-command = [15 01 00 00 00 00 02 90 02 39 01 00 00 00 00 06 F0 55 AA 52 08 07 15 01 00 00 00 00 02 EF 01 39 01 00 00 00 00 06 F0 55 AA 52 08 00 15 01 00 00 00 00 02 B4 01 39 01 00 00 00 00 10 BD 00 B4 0C 0C 00 01 68 09 09 01 0E 0C 0C 00 D5 39 01 00 00 00 00 05 FF AA 55 A5 80 15 01 00 00 00 00 02 6F 18 15 01 00 00 00 00 02 F7 06 15 01 00 00 00 00 02 35 00 39 01 00 00 00 00 03 44 00 00 39 01 00 00 00 00 06 f0 55 aa 52 08 00 15 01 00 00 00 00 02 c9 01 05 01 00 00 96 00 01 11 05 01 00 00 96 00 01 29]; qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; qcom,mdss-dsi-timing-switch-command = [ 15 00 00 00 00 00 02 90 02 15 01 00 00 00 00 02 58 00 ]; qcom,mdss-dsi-timing-switch-command-state = "dsi_lp_mode"; qcom,mdss-dsi-fbc-enable; qcom,mdss-dsi-fbc-ver2-mode; qcom,mdss-dsi-fbc-bpp = <8>; qcom,mdss-dsi-fbc-packing = <1>; qcom,mdss-dsi-fbc-2d-pred-mode; qcom,mdss-dsi-fbc-slice-height = <4>; qcom,mdss-dsi-fbc-quant-error; qcom,mdss-dsi-fbc-bias = <2>; qcom,mdss-dsi-fbc-vlc-mode; qcom,mdss-dsi-fbc-bflc-mode; qcom,mdss-dsi-fbc-lossy-mode-idx = <3>; qcom,mdss-dsi-fbc-pat-mode; qcom,mdss-dsi-fbc-budget-ctrl = <5>; qcom,mdss-dsi-fbc-block-budget = <59>; qcom,mdss-dsi-fbc-h-line-budget = <675>; qcom,mdss-dsi-fbc-lossless-threshold = <0x200>; qcom,mdss-dsi-fbc-lossy-threshold = <192>; qcom,mdss-dsi-fbc-rgb-threshold = <4>; qcom,mdss-dsi-fbc-max-pred-err = <3>; qcom,mdss-dsi-panel-clockrate = <897040000>; qcom,mdss-tear-check-sync-init-val = <3840>; qcom,mdss-tear-check-start-pos = <3840>; qcom,mdss-tear-check-rd-ptr-trigger-intr = <3841>; }; }; }; }; arch/arm/boot/dts/qcom/msm8994-cdp.dtsi +13 −0 Original line number Diff line number Diff line Loading @@ -291,6 +291,8 @@ #include "dsi-panel-jdi-dualmipi1-video.dtsi" #include "dsi-panel-jdi-dualmipi0-cmd.dtsi" #include "dsi-panel-jdi-dualmipi1-cmd.dtsi" #include "dsi-panel-nt35950-4k-dualmipi0-cmd.dtsi" #include "dsi-panel-nt35950-4k-dualmipi1-cmd.dtsi" #include "dsi-panel-nt35597-wqxga-video.dtsi" #include "dsi-panel-nt35597-wqxga-cmd.dtsi" #include "dsi-panel-jdi-1080p-video.dtsi" Loading Loading @@ -362,6 +364,17 @@ qcom,mdss-dsi-min-refresh-rate = <30>; }; &dsi_dual_nt35950_4k_cmd_0 { qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_wled"; qcom,mdss-dsi-bl-min-level = <1>; qcom,mdss-dsi-bl-max-level = <4095>; qcom,dcs-cmd-by-left; }; &dsi_dual_nt35950_4k_cmd_1 { qcom,dcs-cmd-by-left; }; &dsi_dual_jdi_video_0 { pwms = <&pmi8994_pwm_4 0 0>; pwm-names = "backlight"; Loading drivers/video/msm/mdss/mdss_dsi.c +17 −30 Original line number Diff line number Diff line Loading @@ -612,21 +612,25 @@ int mdss_dsi_switch_mode(struct mdss_panel_data *pdata, int mode) ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata, panel_data); if (pinfo->dms_mode != DYNAMIC_MODE_SWITCH_IMMEDIATE) { pr_debug("%s: Dynamic mode switch not enabled.\n", __func__); if ((pinfo->dms_mode != DYNAMIC_MODE_RESOLUTION_SWITCH_IMMEDIATE) && (pinfo->dms_mode != DYNAMIC_MODE_SWITCH_IMMEDIATE)) { pr_err("%s: Dynamic mode switch not enabled.\n", __func__); return -EPERM; } if (mode == MIPI_VIDEO_PANEL) { mode = DSI_VIDEO_MODE; mode = SWITCH_TO_VIDEO_MODE; } else if (mode == MIPI_CMD_PANEL) { mode = DSI_CMD_MODE; mode = SWITCH_TO_CMD_MODE; } else if (mode == SWITCH_RESOLUTION) { pr_debug("Resolution switch mode selected\n"); } else { pr_err("Invalid mode selected, mode=%d\n", mode); return -EINVAL; } mdss_dsi_clk_ctrl(ctrl_pdata, DSI_ALL_CLKS, 1); mdss_dsi_ctrl_setup(ctrl_pdata); ctrl_pdata->switch_mode(pdata, mode); mdss_dsi_clk_ctrl(ctrl_pdata, DSI_ALL_CLKS, 0); Loading Loading @@ -753,6 +757,7 @@ int mdss_dsi_on(struct mdss_panel_data *pdata) mdss_dsi_phy_sw_reset(ctrl_pdata); mdss_dsi_phy_init(ctrl_pdata); mdss_dsi_ctrl_setup(ctrl_pdata); pr_debug("%s: reset Phy and call ctrl_setup\n", __func__); } /* DSI link clocks need to be on prior to ctrl sw reset */ Loading Loading @@ -857,8 +862,9 @@ static int mdss_dsi_unblank(struct mdss_panel_data *pdata) panel_data); mipi = &pdata->panel_info.mipi; pr_debug("%s+: ctrl=%p ndx=%d cur_blank_state=%d\n", __func__, ctrl_pdata, ctrl_pdata->ndx, pdata->panel_info.blank_state); pr_debug("%s+: ctrl=%p ndx=%d cur_blank_state=%d ctrl_state=%x\n", __func__, ctrl_pdata, ctrl_pdata->ndx, pdata->panel_info.blank_state, ctrl_pdata->ctrl_state); mdss_dsi_clk_ctrl(ctrl_pdata, DSI_ALL_CLKS, 1); Loading Loading @@ -934,9 +940,9 @@ static int mdss_dsi_blank(struct mdss_panel_data *pdata, int power_state) pr_info("%s: switching to %s mode\n", __func__, (pdata->panel_info.mipi.mode ? "video" : "command")); if (pdata->panel_info.type == MIPI_CMD_PANEL) { ctrl_pdata->switch_mode(pdata, DSI_VIDEO_MODE); ctrl_pdata->switch_mode(pdata, SWITCH_TO_VIDEO_MODE); } else if (pdata->panel_info.type == MIPI_VIDEO_PANEL) { ctrl_pdata->switch_mode(pdata, DSI_CMD_MODE); ctrl_pdata->switch_mode(pdata, SWITCH_TO_CMD_MODE); mdss_dsi_set_tear_off(ctrl_pdata); } } Loading Loading @@ -1423,28 +1429,6 @@ int mdss_dsi_register_recovery_handler(struct mdss_dsi_ctrl_pdata *ctrl, return 0; } static int mdss_dsi_clk_refresh(struct mdss_panel_data *pdata) { struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL; int rc = 0; ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata, panel_data); rc = mdss_dsi_clk_div_config(&pdata->panel_info, pdata->panel_info.mipi.frame_rate); if (rc) { pr_err("%s: unable to initialize the clk dividers\n", __func__); return rc; } ctrl_pdata->refresh_clk_rate = false; ctrl_pdata->pclk_rate = pdata->panel_info.mipi.dsi_pclk_rate; ctrl_pdata->byte_clk_rate = pdata->panel_info.clk_rate / 8; pr_debug("%s ctrl_pdata->byte_clk_rate=%d ctrl_pdata->pclk_rate=%d\n", __func__, ctrl_pdata->byte_clk_rate, ctrl_pdata->pclk_rate); return rc; } static int mdss_dsi_event_handler(struct mdss_panel_data *pdata, int event, void *arg) { Loading Loading @@ -1555,6 +1539,9 @@ static int mdss_dsi_event_handler(struct mdss_panel_data *pdata, if (ctrl_pdata->check_status) rc = ctrl_pdata->check_status(ctrl_pdata); break; case MDSS_EVENT_PANEL_TIMING_SWITCH: rc = mdss_dsi_panel_timing_switch(ctrl_pdata, arg); break; default: pr_debug("%s: unhandled event=%d\n", __func__, event); break; Loading Loading
Documentation/devicetree/bindings/fb/mdss-dsi-panel.txt +41 −0 Original line number Diff line number Diff line Loading @@ -378,6 +378,8 @@ Optional properties: go blank during transition. "dynamic-switch-immediate"= Switch on next frame update. Panel will not go blank for this transition. "dynamic-resolution-switch-immediate"= Switch the panel resolution. Panel will not go blank for this transition. - qcom,mdss-dsi-post-mode-switch-on-command: Multiple dcs packets used for turning on DSI panel after panel has switch modes. Refer to "qcom,mdss-dsi-on-command" section for adding commands. Loading @@ -395,6 +397,20 @@ Optional properties: for any commands that we send. - qcom,mdss-dsi-force-clock-lane-hs: Boolean to force dsi clock lanes to HS mode always. - qcom,mdss-dsi-display-timings: Parent node that lists the different resolutions that the panel supports. Each child represents timings settings for a specific resolution. Additional properties added to the second level nodes that represent timings properties: - qcom,mdss-dsi-timing-default: Property that specifies the current child as the default timing configuration that will be used. - qcom,mdss-dsi-timing-switch-command: List of commands that need to be sent to panel when the resolution/timing switch happens dynamically. Refer to "qcom,mdss-dsi-on-command" section for adding commands. - qcom,mdss-dsi-timing-switch-command-state: String that specifies the ctrl state for sending resolution switch commands. "dsi_lp_mode" = DSI low power mode (default) "dsi_hs_mode" = DSI high speed mode Note, if a given optional qcom,* binding is not present, then the driver will configure the default values specified. Loading Loading @@ -530,5 +546,30 @@ Example: <128 240 64>; qcom,mdss-dsi-panel-orientation = "180" qcom,mdss-dsi-force-clock-lane-hs; qcom,mdss-dsi-display-timings { wqhd { qcom,mdss-dsi-timing-default; qcom,mdss-dsi-panel-width = <720>; qcom,mdss-dsi-panel-height = <2560>; qcom,mdss-dsi-h-front-porch = <20>; qcom,mdss-dsi-h-back-porch = <8>; qcom,mdss-dsi-h-pulse-width = <8>; qcom,mdss-dsi-h-sync-skew = <0>; qcom,mdss-dsi-v-back-porch = <4>; qcom,mdss-dsi-v-front-porch = <728>; qcom,mdss-dsi-v-pulse-width = <4>; qcom,mdss-dsi-panel-framerate = <60>; qcom,mdss-dsi-panel-timings = [E6 38 26 00 68 6E 2A 3C 2C 03 04 00]; qcom,mdss-dsi-t-clk-post = <0x02>; qcom,mdss-dsi-t-clk-pre = <0x2a>; qcom,mdss-dsi-on-command = [05 01 00 00 a0 00 02 11 00 05 01 00 00 02 00 02 29 00]; qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; qcom,mdss-dsi-timing-switch-command = [ 29 00 00 00 00 00 02 B0 04 29 00 00 00 00 00 02 F1 00]; qcom,mdss-dsi-timing-switch-command-state = "dsi_lp_mode"; }; }; }; };
arch/arm/boot/dts/qcom/dsi-panel-nt35950-4k-dualmipi0-cmd.dtsi 0 → 100644 +171 −0 Original line number Diff line number Diff line /* Copyright (c) 2015, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and * only version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ &mdss_mdp { dsi_dual_nt35950_4k_cmd_0: qcom,mdss_dsi_nt35950_4k_cmd_0 { qcom,mdss-dsi-panel-name = "NT35950 4K dual 0 cmd mode dsi panel"; qcom,mdss-dsi-panel-controller = <&mdss_dsi0>; qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; qcom,mdss-dsi-panel-destination = "display_1"; qcom,mdss-dsi-virtual-channel-id = <0>; qcom,mdss-dsi-stream = <0>; qcom,mdss-dsi-bpp = <24>; qcom,mdss-dsi-underflow-color = <0xff>; qcom,mdss-dsi-border-color = <0>; qcom,mdss-dsi-off-command = [05 01 00 00 0A 00 01 28 05 01 00 00 96 00 01 10]; qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; qcom,mdss-dsi-h-sync-pulse = <1>; qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; qcom,mdss-dsi-bllp-eof-power-mode; qcom,mdss-dsi-bllp-power-mode; qcom,mdss-dsi-dma-trigger = "trigger_sw"; qcom,mdss-dsi-mdp-trigger = "none"; qcom,mdss-dsi-lane-0-state; qcom,mdss-dsi-lane-1-state; qcom,mdss-dsi-lane-2-state; qcom,mdss-dsi-lane-3-state; qcom,mdss-dsi-te-pin-select = <1>; qcom,mdss-dsi-wr-mem-start = <0x2c>; qcom,mdss-dsi-wr-mem-continue = <0x3c>; qcom,mdss-dsi-te-dcs-command = <1>; qcom,mdss-dsi-te-check-enable; qcom,mdss-dsi-te-using-te-pin; qcom,mdss-dsi-tx-eot-append; qcom,mdss-dsi-lp11-init; qcom,mdss-dsi-bl-min-level = <1>; qcom,mdss-dsi-bl-max-level = <4095>; qcom,mdss-brightness-max-level = <4095>; qcom,mdss-dsi-reset-sequence = <0 10>, <1 10>, <0 20>, <1 20>; qcom,mdss-pan-physical-width-dimension = <68>; qcom,mdss-pan-physical-height-dimension = <121>; qcom,dynamic-mode-switch-enabled; qcom,dynamic-mode-switch-type = "dynamic-resolution-switch-immediate"; qcom,mdss-dsi-h-sync-skew = <0>; qcom,mdss-dsi-h-left-border = <0>; qcom,mdss-dsi-h-right-border = <0>; qcom,mdss-dsi-v-top-border = <0>; qcom,mdss-dsi-v-bottom-border = <0>; qcom,mdss-dsi-display-timings { 1080p { qcom,mdss-dsi-panel-clockrate = <897040000>; qcom,mdss-dsi-timing-default; qcom,mdss-dsi-panel-width = <540>; qcom,mdss-dsi-panel-height = <1920>; qcom,mdss-dsi-h-back-porch = <8>; qcom,mdss-dsi-h-pulse-width = <8>; qcom,mdss-dsi-h-front-porch = <20>; qcom,mdss-dsi-v-back-porch = <8>; qcom,mdss-dsi-v-pulse-width = <8>; qcom,mdss-dsi-v-front-porch = <2390>; qcom,mdss-dsi-panel-framerate = <60>; qcom,mdss-dsi-panel-timings = [E6 38 26 00 68 66 32 3C 2C 03 04 00 ]; qcom,mdss-dsi-t-clk-post = <0x02>; qcom,mdss-dsi-t-clk-pre = <0x2B>; qcom,mdss-dsi-on-command = [15 01 00 00 00 00 02 90 00 39 01 00 00 00 00 06 F0 55 AA 52 08 07 15 01 00 00 00 00 02 EF 01 39 01 00 00 00 00 06 F0 55 AA 52 08 00 15 01 00 00 00 00 02 B4 01 39 01 00 00 00 00 10 BD 00 B4 0C 0C 00 01 68 09 09 01 0E 0C 0C 00 D5 39 01 00 00 00 00 05 FF AA 55 A5 80 15 01 00 00 00 00 02 6F 18 15 01 00 00 00 00 02 F7 06 15 01 00 00 00 00 02 58 01 15 01 00 00 00 00 02 35 00 39 01 00 00 00 00 03 44 00 00 39 01 00 00 00 00 06 f0 55 aa 52 08 00 15 01 00 00 00 00 02 C9 01 05 01 00 00 96 00 01 11 05 01 00 00 96 00 01 29]; qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; qcom,mdss-dsi-timing-switch-command = [ 15 00 00 00 00 00 02 90 00 15 01 00 00 00 00 02 58 01 ]; qcom,mdss-dsi-timing-switch-command-state = "dsi_lp_mode"; qcom,mdss-tear-check-sync-init-val = <3840>; qcom,mdss-tear-check-start-pos = <3840>; qcom,mdss-tear-check-rd-ptr-trigger-intr = <3841>; }; 4k { qcom,mdss-dsi-panel-width = <1080>; qcom,mdss-dsi-panel-height = <3840>; qcom,mdss-dsi-h-back-porch = <8>; qcom,mdss-dsi-h-pulse-width = <8>; qcom,mdss-dsi-h-front-porch = <8>; qcom,mdss-dsi-v-back-porch = <8>; qcom,mdss-dsi-v-pulse-width = <8>; qcom,mdss-dsi-v-front-porch = <8>; qcom,mdss-dsi-panel-framerate = <60>; qcom,mdss-dsi-panel-timings = [E6 38 26 00 68 66 32 3C 2C 03 04 00 ]; qcom,mdss-dsi-t-clk-post = <0x02>; qcom,mdss-dsi-t-clk-pre = <0x2B>; qcom,mdss-dsi-on-command = [15 01 00 00 00 00 02 90 02 39 01 00 00 00 00 06 F0 55 AA 52 08 07 15 01 00 00 00 00 02 EF 01 39 01 00 00 00 00 06 F0 55 AA 52 08 00 15 01 00 00 00 00 02 B4 01 39 01 00 00 00 00 10 BD 00 B4 0C 0C 00 01 68 09 09 01 0E 0C 0C 00 D5 39 01 00 00 00 00 05 FF AA 55 A5 80 15 01 00 00 00 00 02 6F 18 15 01 00 00 00 00 02 F7 06 15 01 00 00 00 00 02 35 00 39 01 00 00 00 00 03 44 00 00 39 01 00 00 00 00 06 f0 55 aa 52 08 00 15 01 00 00 00 00 02 c9 01 05 01 00 00 96 00 01 11 05 01 00 00 96 00 01 29]; qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; qcom,mdss-dsi-timing-switch-command = [ 15 00 00 00 00 00 02 90 02 15 01 00 00 00 00 02 58 00 ]; qcom,mdss-dsi-timing-switch-command-state = "dsi_lp_mode"; qcom,mdss-dsi-fbc-enable; qcom,mdss-dsi-fbc-ver2-mode; qcom,mdss-dsi-fbc-bpp = <8>; qcom,mdss-dsi-fbc-packing = <1>; qcom,mdss-dsi-fbc-2d-pred-mode; qcom,mdss-dsi-fbc-slice-height = <4>; qcom,mdss-dsi-fbc-quant-error; qcom,mdss-dsi-fbc-bias = <2>; qcom,mdss-dsi-fbc-vlc-mode; qcom,mdss-dsi-fbc-bflc-mode; qcom,mdss-dsi-fbc-lossy-mode-idx = <3>; qcom,mdss-dsi-fbc-pat-mode; qcom,mdss-dsi-fbc-budget-ctrl = <5>; qcom,mdss-dsi-fbc-block-budget = <59>; qcom,mdss-dsi-fbc-h-line-budget = <675>; qcom,mdss-dsi-fbc-lossless-threshold = <0x200>; qcom,mdss-dsi-fbc-lossy-threshold = <192>; qcom,mdss-dsi-fbc-rgb-threshold = <4>; qcom,mdss-dsi-fbc-max-pred-err = <3>; qcom,mdss-dsi-panel-clockrate = <897040000>; qcom,mdss-tear-check-sync-init-val = <3840>; qcom,mdss-tear-check-start-pos = <3840>; qcom,mdss-tear-check-rd-ptr-trigger-intr = <3841>; }; }; }; };
arch/arm/boot/dts/qcom/dsi-panel-nt35950-4k-dualmipi1-cmd.dtsi 0 → 100644 +173 −0 Original line number Diff line number Diff line /* Copyright (c) 2015, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and * only version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ &mdss_mdp { dsi_dual_nt35950_4k_cmd_1: qcom,mdss_dsi_nt35950_4k_cmd_1 { qcom,mdss-dsi-panel-name = "NT35950 4K dual 1 cmd mode dsi panel"; qcom,mdss-dsi-panel-controller = <&mdss_dsi1>; qcom,mdss-dsi-panel-type = "dsi_cmd_mode"; qcom,mdss-dsi-panel-destination = "display_2"; qcom,mdss-dsi-virtual-channel-id = <0>; qcom,mdss-dsi-stream = <0>; qcom,mdss-dsi-bpp = <24>; qcom,mdss-dsi-underflow-color = <0xff>; qcom,mdss-dsi-border-color = <0>; qcom,mdss-dsi-off-command = [05 01 00 00 0A 00 01 28 05 01 00 00 96 00 01 10]; qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; qcom,mdss-dsi-h-sync-pulse = <1>; qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; qcom,mdss-dsi-bllp-eof-power-mode; qcom,mdss-dsi-bllp-power-mode; qcom,mdss-dsi-dma-trigger = "trigger_sw"; qcom,mdss-dsi-mdp-trigger = "none"; qcom,mdss-dsi-lane-0-state; qcom,mdss-dsi-lane-1-state; qcom,mdss-dsi-lane-2-state; qcom,mdss-dsi-lane-3-state; qcom,mdss-dsi-te-pin-select = <1>; qcom,mdss-dsi-wr-mem-start = <0x2c>; qcom,mdss-dsi-wr-mem-continue = <0x3c>; qcom,mdss-dsi-te-dcs-command = <1>; qcom,mdss-dsi-te-check-enable; qcom,mdss-dsi-te-using-te-pin; qcom,mdss-dsi-tx-eot-append; qcom,mdss-dsi-lp11-init; qcom,mdss-dsi-bl-min-level = <1>; qcom,mdss-dsi-bl-max-level = <4095>; qcom,mdss-brightness-max-level = <4095>; qcom,mdss-dsi-reset-sequence = <0 10>, <1 10>, <0 20>, <1 20>; qcom,mdss-pan-physical-width-dimension = <68>; qcom,mdss-pan-physical-height-dimension = <121>; qcom,dynamic-mode-switch-enabled; qcom,dynamic-mode-switch-type = "dynamic-resolution-switch-immediate"; qcom,mdss-dsi-h-sync-skew = <0>; qcom,mdss-dsi-h-left-border = <0>; qcom,mdss-dsi-h-right-border = <0>; qcom,mdss-dsi-v-top-border = <0>; qcom,mdss-dsi-v-bottom-border = <0>; qcom,mdss-dsi-display-timings { 1080p { qcom,mdss-dsi-panel-clockrate = <897040000>; qcom,mdss-dsi-timing-default; qcom,mdss-dsi-panel-width = <540>; qcom,mdss-dsi-panel-height = <1920>; qcom,mdss-dsi-h-back-porch = <8>; qcom,mdss-dsi-h-pulse-width = <8>; qcom,mdss-dsi-h-front-porch = <20>; qcom,mdss-dsi-v-back-porch = <8>; qcom,mdss-dsi-v-pulse-width = <8>; qcom,mdss-dsi-v-front-porch = <2390>; qcom,mdss-dsi-panel-framerate = <60>; qcom,mdss-dsi-panel-timings = [E6 38 26 00 68 66 32 3C 2C 03 04 00 ]; qcom,mdss-dsi-t-clk-post = <0x02>; qcom,mdss-dsi-t-clk-pre = <0x2B>; qcom,mdss-dsi-on-command = [15 01 00 00 00 00 02 90 00 39 01 00 00 00 00 06 F0 55 AA 52 08 07 15 01 00 00 00 00 02 EF 01 39 01 00 00 00 00 06 F0 55 AA 52 08 00 15 01 00 00 00 00 02 B4 01 39 01 00 00 00 00 10 BD 00 B4 0C 0C 00 01 68 09 09 01 0E 0C 0C 00 D5 39 01 00 00 00 00 05 FF AA 55 A5 80 15 01 00 00 00 00 02 6F 18 15 01 00 00 00 00 02 F7 06 15 01 00 00 00 00 02 58 01 15 01 00 00 00 00 02 35 00 39 01 00 00 00 00 03 44 00 00 39 01 00 00 00 00 06 f0 55 aa 52 08 00 15 01 00 00 00 00 02 C9 01 05 01 00 00 96 00 01 11 05 01 00 00 96 00 01 29]; qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; qcom,mdss-dsi-timing-switch-command = [ 15 00 00 00 00 00 02 90 00 15 01 00 00 00 00 02 58 01 ]; qcom,mdss-dsi-timing-switch-command-state = "dsi_lp_mode"; qcom,mdss-tear-check-sync-init-val = <3840>; qcom,mdss-tear-check-start-pos = <3840>; qcom,mdss-tear-check-rd-ptr-trigger-intr = <3841>; }; 4k { qcom,mdss-dsi-panel-width = <1080>; qcom,mdss-dsi-panel-height = <3840>; qcom,mdss-dsi-h-back-porch = <8>; qcom,mdss-dsi-h-pulse-width = <8>; qcom,mdss-dsi-h-front-porch = <8>; qcom,mdss-dsi-v-back-porch = <8>; qcom,mdss-dsi-v-pulse-width = <8>; qcom,mdss-dsi-v-front-porch = <8>; qcom,mdss-dsi-panel-framerate = <60>; qcom,mdss-dsi-panel-timings = [E6 38 26 00 68 66 32 3C 2C 03 04 00 ]; qcom,mdss-dsi-t-clk-post = <0x02>; qcom,mdss-dsi-t-clk-pre = <0x2B>; qcom,mdss-dsi-on-command = [15 01 00 00 00 00 02 90 02 39 01 00 00 00 00 06 F0 55 AA 52 08 07 15 01 00 00 00 00 02 EF 01 39 01 00 00 00 00 06 F0 55 AA 52 08 00 15 01 00 00 00 00 02 B4 01 39 01 00 00 00 00 10 BD 00 B4 0C 0C 00 01 68 09 09 01 0E 0C 0C 00 D5 39 01 00 00 00 00 05 FF AA 55 A5 80 15 01 00 00 00 00 02 6F 18 15 01 00 00 00 00 02 F7 06 15 01 00 00 00 00 02 35 00 39 01 00 00 00 00 03 44 00 00 39 01 00 00 00 00 06 f0 55 aa 52 08 00 15 01 00 00 00 00 02 c9 01 05 01 00 00 96 00 01 11 05 01 00 00 96 00 01 29]; qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; qcom,mdss-dsi-timing-switch-command = [ 15 00 00 00 00 00 02 90 02 15 01 00 00 00 00 02 58 00 ]; qcom,mdss-dsi-timing-switch-command-state = "dsi_lp_mode"; qcom,mdss-dsi-fbc-enable; qcom,mdss-dsi-fbc-ver2-mode; qcom,mdss-dsi-fbc-bpp = <8>; qcom,mdss-dsi-fbc-packing = <1>; qcom,mdss-dsi-fbc-2d-pred-mode; qcom,mdss-dsi-fbc-slice-height = <4>; qcom,mdss-dsi-fbc-quant-error; qcom,mdss-dsi-fbc-bias = <2>; qcom,mdss-dsi-fbc-vlc-mode; qcom,mdss-dsi-fbc-bflc-mode; qcom,mdss-dsi-fbc-lossy-mode-idx = <3>; qcom,mdss-dsi-fbc-pat-mode; qcom,mdss-dsi-fbc-budget-ctrl = <5>; qcom,mdss-dsi-fbc-block-budget = <59>; qcom,mdss-dsi-fbc-h-line-budget = <675>; qcom,mdss-dsi-fbc-lossless-threshold = <0x200>; qcom,mdss-dsi-fbc-lossy-threshold = <192>; qcom,mdss-dsi-fbc-rgb-threshold = <4>; qcom,mdss-dsi-fbc-max-pred-err = <3>; qcom,mdss-dsi-panel-clockrate = <897040000>; qcom,mdss-tear-check-sync-init-val = <3840>; qcom,mdss-tear-check-start-pos = <3840>; qcom,mdss-tear-check-rd-ptr-trigger-intr = <3841>; }; }; }; };
arch/arm/boot/dts/qcom/msm8994-cdp.dtsi +13 −0 Original line number Diff line number Diff line Loading @@ -291,6 +291,8 @@ #include "dsi-panel-jdi-dualmipi1-video.dtsi" #include "dsi-panel-jdi-dualmipi0-cmd.dtsi" #include "dsi-panel-jdi-dualmipi1-cmd.dtsi" #include "dsi-panel-nt35950-4k-dualmipi0-cmd.dtsi" #include "dsi-panel-nt35950-4k-dualmipi1-cmd.dtsi" #include "dsi-panel-nt35597-wqxga-video.dtsi" #include "dsi-panel-nt35597-wqxga-cmd.dtsi" #include "dsi-panel-jdi-1080p-video.dtsi" Loading Loading @@ -362,6 +364,17 @@ qcom,mdss-dsi-min-refresh-rate = <30>; }; &dsi_dual_nt35950_4k_cmd_0 { qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_wled"; qcom,mdss-dsi-bl-min-level = <1>; qcom,mdss-dsi-bl-max-level = <4095>; qcom,dcs-cmd-by-left; }; &dsi_dual_nt35950_4k_cmd_1 { qcom,dcs-cmd-by-left; }; &dsi_dual_jdi_video_0 { pwms = <&pmi8994_pwm_4 0 0>; pwm-names = "backlight"; Loading
drivers/video/msm/mdss/mdss_dsi.c +17 −30 Original line number Diff line number Diff line Loading @@ -612,21 +612,25 @@ int mdss_dsi_switch_mode(struct mdss_panel_data *pdata, int mode) ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata, panel_data); if (pinfo->dms_mode != DYNAMIC_MODE_SWITCH_IMMEDIATE) { pr_debug("%s: Dynamic mode switch not enabled.\n", __func__); if ((pinfo->dms_mode != DYNAMIC_MODE_RESOLUTION_SWITCH_IMMEDIATE) && (pinfo->dms_mode != DYNAMIC_MODE_SWITCH_IMMEDIATE)) { pr_err("%s: Dynamic mode switch not enabled.\n", __func__); return -EPERM; } if (mode == MIPI_VIDEO_PANEL) { mode = DSI_VIDEO_MODE; mode = SWITCH_TO_VIDEO_MODE; } else if (mode == MIPI_CMD_PANEL) { mode = DSI_CMD_MODE; mode = SWITCH_TO_CMD_MODE; } else if (mode == SWITCH_RESOLUTION) { pr_debug("Resolution switch mode selected\n"); } else { pr_err("Invalid mode selected, mode=%d\n", mode); return -EINVAL; } mdss_dsi_clk_ctrl(ctrl_pdata, DSI_ALL_CLKS, 1); mdss_dsi_ctrl_setup(ctrl_pdata); ctrl_pdata->switch_mode(pdata, mode); mdss_dsi_clk_ctrl(ctrl_pdata, DSI_ALL_CLKS, 0); Loading Loading @@ -753,6 +757,7 @@ int mdss_dsi_on(struct mdss_panel_data *pdata) mdss_dsi_phy_sw_reset(ctrl_pdata); mdss_dsi_phy_init(ctrl_pdata); mdss_dsi_ctrl_setup(ctrl_pdata); pr_debug("%s: reset Phy and call ctrl_setup\n", __func__); } /* DSI link clocks need to be on prior to ctrl sw reset */ Loading Loading @@ -857,8 +862,9 @@ static int mdss_dsi_unblank(struct mdss_panel_data *pdata) panel_data); mipi = &pdata->panel_info.mipi; pr_debug("%s+: ctrl=%p ndx=%d cur_blank_state=%d\n", __func__, ctrl_pdata, ctrl_pdata->ndx, pdata->panel_info.blank_state); pr_debug("%s+: ctrl=%p ndx=%d cur_blank_state=%d ctrl_state=%x\n", __func__, ctrl_pdata, ctrl_pdata->ndx, pdata->panel_info.blank_state, ctrl_pdata->ctrl_state); mdss_dsi_clk_ctrl(ctrl_pdata, DSI_ALL_CLKS, 1); Loading Loading @@ -934,9 +940,9 @@ static int mdss_dsi_blank(struct mdss_panel_data *pdata, int power_state) pr_info("%s: switching to %s mode\n", __func__, (pdata->panel_info.mipi.mode ? "video" : "command")); if (pdata->panel_info.type == MIPI_CMD_PANEL) { ctrl_pdata->switch_mode(pdata, DSI_VIDEO_MODE); ctrl_pdata->switch_mode(pdata, SWITCH_TO_VIDEO_MODE); } else if (pdata->panel_info.type == MIPI_VIDEO_PANEL) { ctrl_pdata->switch_mode(pdata, DSI_CMD_MODE); ctrl_pdata->switch_mode(pdata, SWITCH_TO_CMD_MODE); mdss_dsi_set_tear_off(ctrl_pdata); } } Loading Loading @@ -1423,28 +1429,6 @@ int mdss_dsi_register_recovery_handler(struct mdss_dsi_ctrl_pdata *ctrl, return 0; } static int mdss_dsi_clk_refresh(struct mdss_panel_data *pdata) { struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL; int rc = 0; ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata, panel_data); rc = mdss_dsi_clk_div_config(&pdata->panel_info, pdata->panel_info.mipi.frame_rate); if (rc) { pr_err("%s: unable to initialize the clk dividers\n", __func__); return rc; } ctrl_pdata->refresh_clk_rate = false; ctrl_pdata->pclk_rate = pdata->panel_info.mipi.dsi_pclk_rate; ctrl_pdata->byte_clk_rate = pdata->panel_info.clk_rate / 8; pr_debug("%s ctrl_pdata->byte_clk_rate=%d ctrl_pdata->pclk_rate=%d\n", __func__, ctrl_pdata->byte_clk_rate, ctrl_pdata->pclk_rate); return rc; } static int mdss_dsi_event_handler(struct mdss_panel_data *pdata, int event, void *arg) { Loading Loading @@ -1555,6 +1539,9 @@ static int mdss_dsi_event_handler(struct mdss_panel_data *pdata, if (ctrl_pdata->check_status) rc = ctrl_pdata->check_status(ctrl_pdata); break; case MDSS_EVENT_PANEL_TIMING_SWITCH: rc = mdss_dsi_panel_timing_switch(ctrl_pdata, arg); break; default: pr_debug("%s: unhandled event=%d\n", __func__, event); break; Loading