Merge "msm: vidc: Fix a race condition with core instances list"
diff --git a/Documentation/devicetree/bindings/fb/mdss-dsi-ctrl.txt b/Documentation/devicetree/bindings/fb/mdss-dsi-ctrl.txt
index 4cec0cd..81dd825 100644
--- a/Documentation/devicetree/bindings/fb/mdss-dsi-ctrl.txt
+++ b/Documentation/devicetree/bindings/fb/mdss-dsi-ctrl.txt
@@ -12,6 +12,7 @@
- vdda-supply: Phandle for vreg regulator device node.
- qcom,mdss-fb-map: pHandle that specifies the framebuffer to which the
interface is mapped.
+- qcom,mdss-mdp: pHandle that specifies the mdss-mdp device.
- qcom,platform-regulator-settings: An array of length 7 that specifies the PHY
regulator settings.
- qcom,platform-strength-ctrl: An array of length 2 that specifies the PHY
@@ -20,6 +21,8 @@
BIST ctrl settings.
- qcom,platform-lane-config: An array of length 45 that specifies the PHY
lane configuration settings.
+- qcom,dsi-pref-prim-pan: phandle that specifies the primary panel to be used
+ with the controller.
Optional properties:
- label: A string used to describe the controller used.
@@ -57,6 +60,7 @@
vdd-supply = <&pm8226_l15>;
vddio-supply = <&pm8226_l8>;
vdda-supply = <&pm8226_l4>;
+ qcom,dsi-pref-prim-pan = <&dsi_tosh_720_vid>;
qcom,platform-strength-ctrl = [ff 06];
qcom,platform-bist-ctrl = [00 00 b1 ff 00 00];
qcom,platform-regulator-settings = [07 09 03 00 20 00 01];
@@ -66,6 +70,7 @@
00 00 00 00 0f 00 00 01 97
00 c0 00 00 00 00 00 01 bb];
qcom,mdss-fb-map = <&mdss_fb0>;
+ qcom,mdss-mdp = <&mdss_mdp>;
qcom,platform-reset-gpio = <&msmgpio 25 1>;
qcom,platform-te-gpio = <&msmgpio 24 0>;
qcom,platform-enable-gpio = <&msmgpio 58 1>;
diff --git a/Documentation/devicetree/bindings/fb/mdss-dsi-panel.txt b/Documentation/devicetree/bindings/fb/mdss-dsi-panel.txt
index 49cd567..fc162a4 100644
--- a/Documentation/devicetree/bindings/fb/mdss-dsi-panel.txt
+++ b/Documentation/devicetree/bindings/fb/mdss-dsi-panel.txt
@@ -4,14 +4,23 @@
are compatable with MIPI display serial interface specification.
Required properties:
-- compatible: Specifies the version for DSI HW. that
- this panel will be worked with
- "qcom,mdss-dsi-panel" = DSI v6.0
+- compatible: This property applies to DSI V2 panels only.
+ This property should not be added for panels
+ that work based on version "V6.0"
+ DSI panels that are of different versions
+ are initialized by the drivers for dsi controller.
+ This property specifies the version
+ for DSI HW that this panel will work with
"qcom,dsi-panel-v2" = DSI V2.0
-- status: A string that has to be set to "okay/ok" to enable
- the panel driver. By default this property will be
- set to "disable". Will be set to "ok/okay" status
- for specific platforms.
+- status: This property applies to DSI V2 panels only.
+ This property should not be added for panels
+ that work based on version "V6.0"
+ DSI panels that are of different versions
+ are initialized by the drivers for dsi controller.
+ A string that has to be set to "okay/ok"
+ to enable the panel driver. By default this property
+ will be set to "disable". Will be set to "ok/okay"
+ status for specific platforms.
- qcom,mdss-dsi-panel-controller: Specifies the phandle for the DSI controller that
this panel will be mapped to.
- qcom,mdss-dsi-panel-width: Specifies panel width in pixels.
@@ -225,11 +234,9 @@
the default values specified.
Example:
-&soc {
- qcom,mdss_dsi_sim_video {
- compatible = "qcom,mdss-dsi-panel";
+&mdss_mdp {
+ dsi_sim_vid: qcom,mdss_dsi_sim_video {
qcom,mdss-dsi-panel-name = "simulator video mode dsi panel";
- status = "disable";
qcom,mdss-dsi-panel-controller = <&mdss_dsi0>;
qcom,mdss-dsi-panel-height = <1280>;
qcom,mdss-dsi-panel-width = <720>;
diff --git a/Documentation/devicetree/bindings/fb/mdss-mdp.txt b/Documentation/devicetree/bindings/fb/mdss-mdp.txt
index 7ba9a88..829cce2 100644
--- a/Documentation/devicetree/bindings/fb/mdss-mdp.txt
+++ b/Documentation/devicetree/bindings/fb/mdss-mdp.txt
@@ -94,7 +94,16 @@
The offsets are calculated from "mdp_phys"
defined in reg property. The number of offsets
defiend should reflect the number of progammable
- interface blocks avaialble in hardware.
+ interface blocks available in hardware.
+- qcom,mdss-pref-prim-intf: A string which indicates the configured hardware
+ interface between MDP and the primary panel.
+ Individual panel controller drivers initialize
+ hardware based on this property.
+ Based on the interfaces supported at present,
+ possible values are:
+ - "dsi"
+ - "edp"
+ - "hdmi"
Optional properties:
- qcom,vbif-settings : Array with key-value pairs of constant VBIF register
@@ -156,7 +165,7 @@
size is greater than max mixer width.
Example:
- qcom,mdss_mdp@fd900000 {
+ mdss_mdp: qcom,mdss_mdp@fd900000 {
compatible = "qcom,mdss_mdp";
reg = <0xfd900000 0x22100>,
<0xfd924000 0x1000>;
@@ -179,6 +188,7 @@
qcom,mdss-smp-data = <22 4096>;
qcom,mdss-rot-block-size = <64>;
qcom,mdss-smp-mb-per-pipe = <2>;
+ qcom,mdss-pref-prim-intf = "dsi";
qcom,mdss-has-bwc;
qcom,mdss-has-decimation;
qcom,mdss-has-wfd-blk;
diff --git a/arch/arm/boot/dts/dsi-panel-hx8394a-720p-video.dtsi b/arch/arm/boot/dts/dsi-panel-hx8394a-720p-video.dtsi
index c8d150a..c9d887b 100644
--- a/arch/arm/boot/dts/dsi-panel-hx8394a-720p-video.dtsi
+++ b/arch/arm/boot/dts/dsi-panel-hx8394a-720p-video.dtsi
@@ -15,10 +15,8 @@
* Update input XML file to add a new entry or update variable in this file
* VERSION = "1.0"
*---------------------------------------------------------------------------*/
-&soc {
- qcom,mdss_dsi_hx8394a_720p_video {
- compatible = "qcom,mdss-dsi-panel";
- status = "disable";
+&mdss_mdp {
+ dsi_hx8394a_720_vid: qcom,mdss_dsi_hx8394a_720p_video {
qcom,mdss-dsi-panel-name = "hx8394a 720p video mode dsi panel";
qcom,mdss-dsi-panel-controller = <&mdss_dsi0>;
qcom,mdss-dsi-panel-type = "dsi_video_mode";
diff --git a/arch/arm/boot/dts/dsi-panel-nt35521-720p-video.dtsi b/arch/arm/boot/dts/dsi-panel-nt35521-720p-video.dtsi
index 0b3fec4..357b024 100644
--- a/arch/arm/boot/dts/dsi-panel-nt35521-720p-video.dtsi
+++ b/arch/arm/boot/dts/dsi-panel-nt35521-720p-video.dtsi
@@ -15,10 +15,8 @@
* Update input XML file to add a new entry or update variable in this file
* VERSION = "1.0"
*---------------------------------------------------------------------------*/
-&soc {
- qcom,mdss_dsi_nt35521_720p_video {
- compatible = "qcom,mdss-dsi-panel";
- status = "disable";
+&mdss_mdp {
+ dsi_nt35521_720_vid: qcom,mdss_dsi_nt35521_720p_video {
qcom,mdss-dsi-panel-name = "nt35521 720p video mode dsi panel";
qcom,mdss-dsi-panel-controller = <&mdss_dsi0>;
qcom,mdss-dsi-panel-type = "dsi_video_mode";
diff --git a/arch/arm/boot/dts/dsi-panel-nt35590-720p-cmd.dtsi b/arch/arm/boot/dts/dsi-panel-nt35590-720p-cmd.dtsi
index d0b4da8..0918cf4 100644
--- a/arch/arm/boot/dts/dsi-panel-nt35590-720p-cmd.dtsi
+++ b/arch/arm/boot/dts/dsi-panel-nt35590-720p-cmd.dtsi
@@ -15,10 +15,8 @@
* Update input XML file to add a new entry or update variable in this file
* VERSION = "1.0"
*---------------------------------------------------------------------------*/
-&soc {
- qcom,mdss_dsi_nt35590_720p_cmd {
- compatible = "qcom,mdss-dsi-panel";
- status = "disable";
+&mdss_mdp {
+ dsi_nt35590_720_cmd: qcom,mdss_dsi_nt35590_720p_cmd {
qcom,mdss-dsi-panel-name = "nt35590 720p command mode dsi panel";
qcom,mdss-dsi-panel-controller = <&mdss_dsi0>;
qcom,mdss-dsi-panel-type = "dsi_cmd_mode";
diff --git a/arch/arm/boot/dts/dsi-panel-nt35590-720p-video.dtsi b/arch/arm/boot/dts/dsi-panel-nt35590-720p-video.dtsi
index a171a5c..6d68a3e 100644
--- a/arch/arm/boot/dts/dsi-panel-nt35590-720p-video.dtsi
+++ b/arch/arm/boot/dts/dsi-panel-nt35590-720p-video.dtsi
@@ -15,10 +15,8 @@
* Update input XML file to add a new entry or update variable in this file
* VERSION = "1.0"
*---------------------------------------------------------------------------*/
-&soc {
- qcom,mdss_dsi_nt35590_720p_video {
- compatible = "qcom,mdss-dsi-panel";
- status = "disable";
+&mdss_mdp {
+ dsi_nt35590_720_vid: qcom,mdss_dsi_nt35590_720p_video {
qcom,mdss-dsi-panel-name = "nt35590 720p video mode dsi panel";
qcom,mdss-dsi-panel-controller = <&mdss_dsi0>;
qcom,mdss-dsi-panel-type = "dsi_video_mode";
diff --git a/arch/arm/boot/dts/dsi-panel-nt35596-1080p-video.dtsi b/arch/arm/boot/dts/dsi-panel-nt35596-1080p-video.dtsi
index 998799a..49aef24 100644
--- a/arch/arm/boot/dts/dsi-panel-nt35596-1080p-video.dtsi
+++ b/arch/arm/boot/dts/dsi-panel-nt35596-1080p-video.dtsi
@@ -15,10 +15,8 @@
* Update input XML file to add a new entry or update variable in this file
* VERSION = "1.0"
*---------------------------------------------------------------------------*/
-&soc {
- qcom,mdss_dsi_nt35596_1080p_video {
- compatible = "qcom,mdss-dsi-panel";
- status = "disable";
+&mdss_mdp {
+ dsi_nt35596_1080_vid: qcom,mdss_dsi_nt35596_1080p_video {
qcom,mdss-dsi-panel-name = "nt35596 1080p video mode dsi panel";
qcom,mdss-dsi-panel-controller = <&mdss_dsi0>;
qcom,mdss-dsi-panel-type = "dsi_video_mode";
diff --git a/arch/arm/boot/dts/dsi-panel-orise-720p-video.dtsi b/arch/arm/boot/dts/dsi-panel-orise-720p-video.dtsi
index 478541f..30eda91 100644
--- a/arch/arm/boot/dts/dsi-panel-orise-720p-video.dtsi
+++ b/arch/arm/boot/dts/dsi-panel-orise-720p-video.dtsi
@@ -10,11 +10,9 @@
* GNU General Public License for more details.
*/
-&soc {
- qcom,mdss_dsi_orise_720p_video {
- compatible = "qcom,mdss-dsi-panel";
+&mdss_mdp {
+ dsi_orise_720_vid: qcom,mdss_dsi_orise_720p_video {
label = "orise 720p video mode dsi panel";
- status = "disable";
qcom,dsi-ctrl-phandle = <&mdss_dsi1>;
qcom,mdss-pan-res = <720 1280>;
qcom,mdss-pan-bpp = <24>;
diff --git a/arch/arm/boot/dts/dsi-panel-sharp-qhd-video.dtsi b/arch/arm/boot/dts/dsi-panel-sharp-qhd-video.dtsi
index 7fe0f7f..c627e7a 100644
--- a/arch/arm/boot/dts/dsi-panel-sharp-qhd-video.dtsi
+++ b/arch/arm/boot/dts/dsi-panel-sharp-qhd-video.dtsi
@@ -15,10 +15,8 @@
* Update input XML file to add a new entry or update variable in this file
* VERSION = "1.0"
*---------------------------------------------------------------------------*/
-&soc {
- qcom,mdss_dsi_sharp_qhd_video {
- compatible = "qcom,mdss-dsi-panel";
- status = "disable";
+&mdss_mdp {
+ dsi_sharp_qhd_vid: qcom,mdss_dsi_sharp_qhd_video {
qcom,mdss-dsi-panel-name = "sharp QHD LS043T1LE01 video mode dsi panel";
qcom,mdss-dsi-panel-controller = <&mdss_dsi0>;
qcom,mdss-dsi-panel-type = "dsi_video_mode";
diff --git a/arch/arm/boot/dts/dsi-panel-sim-video.dtsi b/arch/arm/boot/dts/dsi-panel-sim-video.dtsi
index 271e373..ccbb659 100644
--- a/arch/arm/boot/dts/dsi-panel-sim-video.dtsi
+++ b/arch/arm/boot/dts/dsi-panel-sim-video.dtsi
@@ -10,12 +10,9 @@
* GNU General Public License for more details.
*/
-&soc {
-
- qcom,mdss_dsi_sim_video {
- compatible = "qcom,mdss-dsi-panel";
+&mdss_mdp {
+ dsi_sim_vid: qcom,mdss_dsi_sim_video {
label = "simulator video mode dsi panel";
- status = "disable";
qcom,dsi-ctrl-phandle = <&mdss_dsi0>;
qcom,mdss-pan-res = <640 480>;
qcom,mdss-pan-bpp = <24>;
diff --git a/arch/arm/boot/dts/dsi-panel-toshiba-720p-video.dtsi b/arch/arm/boot/dts/dsi-panel-toshiba-720p-video.dtsi
index a824d45..0b98db7 100644
--- a/arch/arm/boot/dts/dsi-panel-toshiba-720p-video.dtsi
+++ b/arch/arm/boot/dts/dsi-panel-toshiba-720p-video.dtsi
@@ -15,10 +15,8 @@
* Update input XML file to add a new entry or update variable in this file
* VERSION = "1.0"
*---------------------------------------------------------------------------*/
-&soc {
- qcom,mdss_dsi_toshiba_720p_video {
- compatible = "qcom,mdss-dsi-panel";
- status = "disable";
+&mdss_mdp {
+ dsi_tosh_720_vid: qcom,mdss_dsi_toshiba_720p_video {
qcom,mdss-dsi-panel-name = "toshiba 720p video mode dsi panel";
qcom,mdss-dsi-panel-controller = <&mdss_dsi0>;
qcom,mdss-dsi-panel-type = "dsi_video_mode";
diff --git a/arch/arm/boot/dts/msm8226-cdp.dtsi b/arch/arm/boot/dts/msm8226-cdp.dtsi
index 253ce3f..066d6c2 100644
--- a/arch/arm/boot/dts/msm8226-cdp.dtsi
+++ b/arch/arm/boot/dts/msm8226-cdp.dtsi
@@ -10,7 +10,6 @@
* GNU General Public License for more details.
*/
-/include/ "dsi-panel-nt35590-720p-video.dtsi"
/include/ "msm8226-camera-sensor-cdp.dtsi"
&soc {
@@ -18,11 +17,6 @@
status = "ok";
};
- qcom,mdss_dsi_nt35590_720p_video {
- status = "ok";
- qcom,cont-splash-enabled;
- };
-
i2c@f9927000 { /* BLSP1 QUP5 */
synaptics@20 {
compatible = "synaptics,rmi4";
@@ -462,3 +456,15 @@
qcom,fast-avg-setup = <0>;
};
};
+
+&mdss_mdp {
+ qcom,mdss-pref-prim-intf = "dsi";
+};
+
+&mdss_dsi0 {
+ qcom,dsi-pref-prim-pan = <&dsi_nt35590_720_vid>;
+};
+
+&dsi_nt35590_720_vid {
+ qcom,cont-splash-enabled;
+};
diff --git a/arch/arm/boot/dts/msm8226-mdss-panels.dtsi b/arch/arm/boot/dts/msm8226-mdss-panels.dtsi
new file mode 100644
index 0000000..8194bf6
--- /dev/null
+++ b/arch/arm/boot/dts/msm8226-mdss-panels.dtsi
@@ -0,0 +1,17 @@
+/* Copyright (c) 2013, 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.
+ */
+
+/include/ "dsi-panel-hx8394a-720p-video.dtsi"
+/include/ "dsi-panel-nt35590-720p-video.dtsi"
+/include/ "dsi-panel-nt35521-720p-video.dtsi"
+/include/ "dsi-panel-nt35596-1080p-video.dtsi"
+/include/ "dsi-panel-nt35590-720p-cmd.dtsi"
diff --git a/arch/arm/boot/dts/msm8226-mdss.dtsi b/arch/arm/boot/dts/msm8226-mdss.dtsi
index 8852a8d..947cc93 100644
--- a/arch/arm/boot/dts/msm8226-mdss.dtsi
+++ b/arch/arm/boot/dts/msm8226-mdss.dtsi
@@ -11,7 +11,7 @@
*/
&soc {
- qcom,mdss_mdp@fd900000 {
+ mdss_mdp: qcom,mdss_mdp@fd900000 {
compatible = "qcom,mdss_mdp";
reg = <0xfd900000 0x22100>,
<0xfd924000 0x1000>;
@@ -63,6 +63,7 @@
cell-index = <0>;
reg = <0xfd922800 0x600>;
qcom,mdss-fb-map = <&mdss_fb0>;
+ qcom,mdss-mdp = <&mdss_mdp>;
vdd-supply = <&pm8226_l15>;
vddio-supply = <&pm8226_l8>;
vdda-supply = <&pm8226_l4>;
@@ -119,3 +120,5 @@
qcom,mdss-fb-map = <&mdss_fb1>;
};
};
+
+/include/ "msm8226-mdss-panels.dtsi"
diff --git a/arch/arm/boot/dts/msm8226-mtp.dtsi b/arch/arm/boot/dts/msm8226-mtp.dtsi
index 68621fc..f4f7442 100644
--- a/arch/arm/boot/dts/msm8226-mtp.dtsi
+++ b/arch/arm/boot/dts/msm8226-mtp.dtsi
@@ -10,7 +10,6 @@
* GNU General Public License for more details.
*/
-/include/ "dsi-panel-nt35590-720p-video.dtsi"
/include/ "msm8226-camera-sensor-mtp.dtsi"
&soc {
@@ -18,11 +17,6 @@
status = "ok";
};
- qcom,mdss_dsi_nt35590_720p_video {
- status = "ok";
- qcom,cont-splash-enabled;
- };
-
i2c@f9927000 { /* BLSP1 QUP5 */
synaptics@20 {
compatible = "synaptics,rmi4";
@@ -484,3 +478,15 @@
qcom,cdc-micbias1-ext-cap;
};
};
+
+&mdss_mdp {
+ qcom,mdss-pref-prim-intf = "dsi";
+};
+
+&mdss_dsi0 {
+ qcom,dsi-pref-prim-pan = <&dsi_nt35590_720_vid>;
+};
+
+&dsi_nt35590_720_vid {
+ qcom,cont-splash-enabled;
+};
diff --git a/arch/arm/boot/dts/msm8226-qrd.dtsi b/arch/arm/boot/dts/msm8226-qrd.dtsi
index 88c44e6..c178dbf 100644
--- a/arch/arm/boot/dts/msm8226-qrd.dtsi
+++ b/arch/arm/boot/dts/msm8226-qrd.dtsi
@@ -10,7 +10,6 @@
* GNU General Public License for more details.
*/
-/include/ "dsi-panel-nt35596-1080p-video.dtsi"
/include/ "msm8226-camera-sensor-qrd.dtsi"
&soc {
@@ -474,3 +473,15 @@
&android_usb {
qcom,android-usb-cdrom;
};
+
+&mdss_mdp {
+ qcom,mdss-pref-prim-intf = "dsi";
+};
+
+&mdss_dsi0 {
+ qcom,dsi-pref-prim-pan = <&dsi_nt35596_1080_vid>;
+};
+
+&dsi_nt35596_1080_vid {
+ qcom,cont-splash-enabled;
+};
diff --git a/arch/arm/boot/dts/msm8226-v1-qrd-dvt.dts b/arch/arm/boot/dts/msm8226-v1-qrd-dvt.dts
index 4acfa0f..f8fd0c2 100644
--- a/arch/arm/boot/dts/msm8226-v1-qrd-dvt.dts
+++ b/arch/arm/boot/dts/msm8226-v1-qrd-dvt.dts
@@ -13,7 +13,6 @@
/dts-v1/;
/include/ "msm8226-v1.dtsi"
/include/ "msm8226-qrd.dtsi"
-/include/ "dsi-panel-hx8394a-720p-video.dtsi"
/ {
model = "Qualcomm MSM 8226 QRD";
@@ -29,9 +28,10 @@
<223 0x2000b 0>;
};
-&soc {
- qcom,mdss_dsi_hx8394a_720p_video {
- status = "ok";
- qcom,cont-splash-enabled;
- };
+&mdss_dsi0 {
+ qcom,dsi-pref-prim-pan = <&dsi_hx8394a_720_vid>;
+};
+
+&dsi_hx8394a_720_vid {
+ qcom,cont-splash-enabled;
};
diff --git a/arch/arm/boot/dts/msm8226-v1-qrd-evt.dts b/arch/arm/boot/dts/msm8226-v1-qrd-evt.dts
index 507a92a..bc5d8e7 100644
--- a/arch/arm/boot/dts/msm8226-v1-qrd-evt.dts
+++ b/arch/arm/boot/dts/msm8226-v1-qrd-evt.dts
@@ -13,7 +13,6 @@
/dts-v1/;
/include/ "msm8226-v1.dtsi"
/include/ "msm8226-qrd.dtsi"
-/include/ "dsi-panel-nt35590-720p-video.dtsi"
/ {
model = "Qualcomm MSM 8226 QRD";
@@ -29,9 +28,10 @@
<223 11 0>;
};
-&soc {
- qcom,mdss_dsi_nt35590_720p_video {
- status = "ok";
- qcom,cont-splash-enabled;
- };
+&mdss_dsi0 {
+ qcom,dsi-pref-prim-pan = <&dsi_nt35590_720_vid>;
+};
+
+&dsi_nt35590_720_vid {
+ qcom,cont-splash-enabled;
};
diff --git a/arch/arm/boot/dts/msm8226-v1-qrd-skuf.dts b/arch/arm/boot/dts/msm8226-v1-qrd-skuf.dts
index faad6f3..cbafe80 100644
--- a/arch/arm/boot/dts/msm8226-v1-qrd-skuf.dts
+++ b/arch/arm/boot/dts/msm8226-v1-qrd-skuf.dts
@@ -13,7 +13,6 @@
/dts-v1/;
/include/ "msm8226-v1.dtsi"
/include/ "msm8226-qrd.dtsi"
-/include/ "dsi-panel-nt35521-720p-video.dtsi"
/ {
model = "Qualcomm MSM 8226v1 QRD";
@@ -22,11 +21,6 @@
};
&soc {
- qcom,mdss_dsi_nt35521_720p_video {
- status = "ok";
- qcom,cont-splash-enabled;
- };
-
sound {
qcom,model = "msm8226-tapan-skuf-snd-card";
@@ -176,3 +170,11 @@
&pm8226_chg {
qcom,battery-data = <&qrd_batterydata>;
};
+
+&mdss_dsi0 {
+ qcom,dsi-pref-prim-pan = <&dsi_nt35521_720_vid>;
+};
+
+&dsi_nt35521_720_vid {
+ qcom,cont-splash-enabled;
+};
diff --git a/arch/arm/boot/dts/msm8226-v2-qrd-dvt.dts b/arch/arm/boot/dts/msm8226-v2-qrd-dvt.dts
index 9cf8224..e492720 100644
--- a/arch/arm/boot/dts/msm8226-v2-qrd-dvt.dts
+++ b/arch/arm/boot/dts/msm8226-v2-qrd-dvt.dts
@@ -13,7 +13,6 @@
/dts-v1/;
/include/ "msm8226-v2.dtsi"
/include/ "msm8226-qrd.dtsi"
-/include/ "dsi-panel-hx8394a-720p-video.dtsi"
/ {
model = "Qualcomm MSM 8226v2 QRD";
@@ -29,11 +28,12 @@
<223 0x2000b 0x20000>;
};
-&soc {
- qcom,mdss_dsi_hx8394a_720p_video {
- status = "ok";
- qcom,cont-splash-enabled;
- };
+&mdss_dsi0 {
+ qcom,dsi-pref-prim-pan = <&dsi_hx8394a_720_vid>;
+};
+
+&dsi_hx8394a_720_vid {
+ qcom,cont-splash-enabled;
};
&pm8226_bms {
diff --git a/arch/arm/boot/dts/msm8226-v2-qrd-evt.dts b/arch/arm/boot/dts/msm8226-v2-qrd-evt.dts
index 98de659..83c7034 100644
--- a/arch/arm/boot/dts/msm8226-v2-qrd-evt.dts
+++ b/arch/arm/boot/dts/msm8226-v2-qrd-evt.dts
@@ -13,7 +13,6 @@
/dts-v1/;
/include/ "msm8226-v2.dtsi"
/include/ "msm8226-qrd.dtsi"
-/include/ "dsi-panel-nt35590-720p-video.dtsi"
/ {
model = "Qualcomm MSM 8226v2 QRD";
@@ -29,9 +28,10 @@
<223 11 0x20000>;
};
-&soc {
- qcom,mdss_dsi_nt35590_720p_video {
- status = "ok";
- qcom,cont-splash-enabled;
- };
+&mdss_dsi0 {
+ qcom,dsi-pref-prim-pan = <&dsi_nt35590_720_vid>;
+};
+
+&dsi_nt35590_720_vid {
+ qcom,cont-splash-enabled;
};
diff --git a/arch/arm/boot/dts/msm8226-v2-qrd-skuf.dts b/arch/arm/boot/dts/msm8226-v2-qrd-skuf.dts
index 0d89e00..77037be 100644
--- a/arch/arm/boot/dts/msm8226-v2-qrd-skuf.dts
+++ b/arch/arm/boot/dts/msm8226-v2-qrd-skuf.dts
@@ -13,7 +13,6 @@
/dts-v1/;
/include/ "msm8226-v2.dtsi"
/include/ "msm8226-qrd.dtsi"
-/include/ "dsi-panel-nt35521-720p-video.dtsi"
/ {
model = "Qualcomm MSM 8226v2 QRD";
@@ -22,11 +21,6 @@
};
&soc {
- qcom,mdss_dsi_nt35521_720p_video {
- status = "ok";
- qcom,cont-splash-enabled;
- };
-
sound {
qcom,model = "msm8226-tapan-skuf-snd-card";
@@ -181,3 +175,11 @@
&pm8226_iadc {
qcom,rsense = <10000000>;
};
+
+&mdss_dsi0 {
+ qcom,dsi-pref-prim-pan = <&dsi_nt35521_720_vid>;
+};
+
+&dsi_nt35521_720_vid {
+ qcom,cont-splash-enabled;
+};
diff --git a/arch/arm/boot/dts/msm8974-cdp.dtsi b/arch/arm/boot/dts/msm8974-cdp.dtsi
index 9badf6d..d200100 100644
--- a/arch/arm/boot/dts/msm8974-cdp.dtsi
+++ b/arch/arm/boot/dts/msm8974-cdp.dtsi
@@ -10,8 +10,6 @@
* GNU General Public License for more details.
*/
-/include/ "dsi-panel-toshiba-720p-video.dtsi"
-/include/ "dsi-panel-orise-720p-video.dtsi"
/include/ "msm8974-leds.dtsi"
/include/ "msm8974-camera-sensor-cdp.dtsi"
@@ -26,9 +24,12 @@
status = "ok";
};
- qcom,mdss_dsi_toshiba_720p_video {
- status = "ok";
- qcom,cont-splash-enabled;
+ qcom,mdss_dsi@fd922800 {
+ qcom,dsi-pref-prim-pan = <&dsi_tosh_720_vid>;
+ };
+
+ qcom,mdss_mdp@fd900000 {
+ qcom,mdss-pref-prim-intf = "dsi";
};
qcom,mdss_dsi_orise_720p_video {
@@ -735,3 +736,7 @@
qcom,cdc-on-demand-supplies = "cdc-vdd-spkdrv";
};
};
+
+&dsi_tosh_720_vid {
+ qcom,cont-splash-enabled;
+};
diff --git a/arch/arm/boot/dts/msm8974-fluid.dtsi b/arch/arm/boot/dts/msm8974-fluid.dtsi
index 9c2509a..d02021c 100644
--- a/arch/arm/boot/dts/msm8974-fluid.dtsi
+++ b/arch/arm/boot/dts/msm8974-fluid.dtsi
@@ -10,7 +10,6 @@
* GNU General Public License for more details.
*/
-/include/ "dsi-panel-toshiba-720p-video.dtsi"
/include/ "msm8974-camera-sensor-fluid.dtsi"
/include/ "msm8974-leds.dtsi"
@@ -25,9 +24,12 @@
status = "ok";
};
- qcom,mdss_dsi_toshiba_720p_video {
- status = "ok";
- qcom,cont-splash-enabled;
+ qcom,mdss_dsi@fd922800{
+ qcom,dsi-pref-prim-pan = <&dsi_tosh_720_vid>;
+ };
+
+ qcom,mdss_mdp@fd900000 {
+ qcom,mdss-pref-prim-intf = "dsi";
};
qcom,hdmi_tx@fd922100 {
@@ -675,3 +677,7 @@
qcom,channel-type = <0xf0000000>;
};
};
+
+&dsi_tosh_720_vid {
+ qcom,cont-splash-enabled;
+};
diff --git a/arch/arm/boot/dts/msm8974-liquid.dtsi b/arch/arm/boot/dts/msm8974-liquid.dtsi
index 1803f91..73aba8f 100644
--- a/arch/arm/boot/dts/msm8974-liquid.dtsi
+++ b/arch/arm/boot/dts/msm8974-liquid.dtsi
@@ -24,9 +24,9 @@
status = "ok";
};
- qcom,mdss_edp@fd923400 {
- status = "ok";
- };
+ qcom,mdss_mdp@fd900000 {
+ qcom,mdss-pref-prim-intf = "edp";
+ };
i2c@f9967000 {
battery@b {
diff --git a/arch/arm/boot/dts/msm8974-mdss-panels.dtsi b/arch/arm/boot/dts/msm8974-mdss-panels.dtsi
new file mode 100644
index 0000000..ab43834
--- /dev/null
+++ b/arch/arm/boot/dts/msm8974-mdss-panels.dtsi
@@ -0,0 +1,15 @@
+/* Copyright (c) 2013, 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.
+ */
+
+/include/ "dsi-panel-orise-720p-video.dtsi"
+/include/ "dsi-panel-toshiba-720p-video.dtsi"
+/include/ "dsi-panel-sharp-qhd-video.dtsi"
diff --git a/arch/arm/boot/dts/msm8974-mdss.dtsi b/arch/arm/boot/dts/msm8974-mdss.dtsi
index b615ebe..99c15af 100644
--- a/arch/arm/boot/dts/msm8974-mdss.dtsi
+++ b/arch/arm/boot/dts/msm8974-mdss.dtsi
@@ -86,6 +86,7 @@
vddio-supply = <&pm8941_l12>;
vdda-supply = <&pm8941_l2>;
qcom,mdss-fb-map = <&mdss_fb0>;
+ qcom,mdss-mdp = <&mdss_mdp>;
qcom,platform-reset-gpio = <&pm8941_gpios 19 1>;
qcom,platform-enable-gpio = <&msmgpio 58 1>;
qcom,platform-reset-sequence = <1 20 0 200 1 20 2>;
@@ -141,6 +142,7 @@
vddio-supply = <&pm8941_l12>;
vdda-supply = <&pm8941_l2>;
qcom,mdss-fb-map = <&mdss_fb0>;
+ qcom,mdss-mdp = <&mdss_mdp>;
};
mdss_hdmi_tx: qcom,hdmi_tx@fd922100 {
@@ -187,8 +189,9 @@
gpio-panel-pwm = <&pm8941_gpios 36 0>;
qcom,panel-lpg-channel = <7>; /* LPG Channel 8 */
qcom,panel-pwm-period = <53>;
- status = "disable";
qcom,mdss-fb-map = <&mdss_fb0>;
gpio-panel-hpd = <&msmgpio 102 0>;
};
};
+
+/include/ "msm8974-mdss-panels.dtsi"
diff --git a/arch/arm/boot/dts/msm8974-mtp.dtsi b/arch/arm/boot/dts/msm8974-mtp.dtsi
index 6955597..22fff80 100644
--- a/arch/arm/boot/dts/msm8974-mtp.dtsi
+++ b/arch/arm/boot/dts/msm8974-mtp.dtsi
@@ -10,7 +10,6 @@
* GNU General Public License for more details.
*/
-/include/ "dsi-panel-toshiba-720p-video.dtsi"
/include/ "msm8974-camera-sensor-mtp.dtsi"
/include/ "msm8974-leds.dtsi"
@@ -25,9 +24,12 @@
status = "ok";
};
- qcom,mdss_dsi_toshiba_720p_video {
- status = "ok";
- qcom,cont-splash-enabled;
+ qcom,mdss_dsi@fd922800 {
+ qcom,dsi-pref-prim-pan = <&dsi_tosh_720_vid>;
+ };
+
+ qcom,mdss_mdp@fd900000 {
+ qcom,mdss-pref-prim-intf = "dsi";
};
qcom,hdmi_tx@fd922100 {
@@ -698,3 +700,7 @@
qcom,channel-type = <0x1540>;
};
};
+
+&dsi_tosh_720_vid {
+ qcom,cont-splash-enabled;
+};
diff --git a/drivers/video/msm/mdss/mdss.h b/drivers/video/msm/mdss/mdss.h
index 25a5c9f..24b53c7 100644
--- a/drivers/video/msm/mdss/mdss.h
+++ b/drivers/video/msm/mdss/mdss.h
@@ -23,6 +23,8 @@
#include <mach/iommu_domains.h>
+#include "mdss_panel.h"
+
#define MDSS_REG_WRITE(addr, val) writel_relaxed(val, mdss_res->mdp_base + addr)
#define MDSS_REG_READ(addr) readl_relaxed(mdss_res->mdp_base + addr)
@@ -130,6 +132,7 @@
struct mdss_debug_inf debug_inf;
int current_bus_idx;
bool mixer_switched;
+ struct mdss_panel_cfg pan_cfg;
};
extern struct mdss_data_type *mdss_res;
diff --git a/drivers/video/msm/mdss/mdss_dsi.c b/drivers/video/msm/mdss/mdss_dsi.c
index a575d6d..c6b0cfd 100644
--- a/drivers/video/msm/mdss/mdss_dsi.c
+++ b/drivers/video/msm/mdss/mdss_dsi.c
@@ -262,6 +262,29 @@
return rc;
}
+static int mdss_dsi_get_panel_cfg(char *panel_cfg)
+{
+ int rc;
+ struct mdss_panel_cfg *pan_cfg = NULL;
+
+ if (!panel_cfg)
+ return MDSS_PANEL_INTF_INVALID;
+
+ pan_cfg = mdss_panel_intf_type(MDSS_PANEL_INTF_DSI);
+ if (IS_ERR(pan_cfg)) {
+ return PTR_ERR(pan_cfg);
+ } else if (!pan_cfg) {
+ panel_cfg[0] = 0;
+ return 0;
+ }
+
+ pr_debug("%s:%d: cfg:[%s]\n", __func__, __LINE__,
+ pan_cfg->arg_cfg);
+ rc = strlcpy(panel_cfg, pan_cfg->arg_cfg,
+ sizeof(pan_cfg->arg_cfg));
+ return rc;
+}
+
static int mdss_dsi_off(struct mdss_panel_data *pdata)
{
int ret = 0;
@@ -636,98 +659,214 @@
return rc;
}
+/**
+ * mdss_dsi_find_panel_of_node(): find device node of dsi panel
+ * @pdev: platform_device of the dsi ctrl node
+ * @panel_cfg: string containing intf specific config data
+ *
+ * Function finds the panel device node using the interface
+ * specific configuration data. This configuration data is
+ * could be derived from the result of bootloader's GCDB
+ * panel detection mechanism. If such config data doesn't
+ * exist then this panel returns the default panel configured
+ * in the device tree.
+ *
+ * returns pointer to panel node on success, NULL on error.
+ */
+static struct device_node *mdss_dsi_find_panel_of_node(
+ struct platform_device *pdev, char *panel_cfg)
+{
+ int l;
+ int ctrl_id = -1;
+ char *panel_name;
+ struct device_node *dsi_pan_node = NULL, *mdss_node = NULL;
+
+ l = strlen(panel_cfg);
+ if (!l) {
+ /* no panel cfg chg, parse dt */
+ pr_debug("%s:%d: no cmd line cfg present\n",
+ __func__, __LINE__);
+ dsi_pan_node = of_parse_phandle(
+ pdev->dev.of_node,
+ "qcom,dsi-pref-prim-pan", 0);
+ if (!dsi_pan_node) {
+ pr_err("%s:can't find panel phandle\n",
+ __func__);
+ return NULL;
+ }
+ } else {
+ if (panel_cfg[0] == '0') {
+ pr_debug("%s:%d: DSI ctrl 1\n", __func__, __LINE__);
+ ctrl_id = 0;
+ } else if (panel_cfg[0] == '1') {
+ pr_debug("%s:%d: DSI ctrl 2\n", __func__, __LINE__);
+ ctrl_id = 1;
+ }
+ if ((pdev->id - 1) != ctrl_id) {
+ pr_err("%s:%d:pdev_ID=[%d]\n",
+ __func__, __LINE__, pdev->id);
+ return NULL;
+ }
+ /*
+ * skip first two chars '<dsi_ctrl_id>' and
+ * ':' to get to the panel name
+ */
+ panel_name = panel_cfg + 2;
+ pr_debug("%s:%d:%s:%s\n", __func__, __LINE__,
+ panel_cfg, panel_name);
+
+ mdss_node = of_parse_phandle(pdev->dev.of_node,
+ "qcom,mdss-mdp", 0);
+
+ if (!mdss_node) {
+ pr_err("%s: %d: mdss_node null\n",
+ __func__, __LINE__);
+ return NULL;
+ }
+ dsi_pan_node = of_find_node_by_name(mdss_node,
+ panel_name);
+ if (!dsi_pan_node) {
+ pr_err("%s: invalid pan node\n",
+ __func__);
+ return NULL;
+ }
+ }
+ return dsi_pan_node;
+}
+
static int __devinit mdss_dsi_ctrl_probe(struct platform_device *pdev)
{
int rc = 0;
u32 index;
struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL;
+ struct device_node *dsi_pan_node = NULL;
+ char panel_cfg[MDSS_MAX_PANEL_LEN];
+ struct resource *mdss_dsi_mres;
+ const char *ctrl_name;
+ static struct mdss_panel_common_pdata vendor_pdata;
+ bool cmd_cfg_cont_splash = true;
- if (pdev->dev.of_node) {
- struct resource *mdss_dsi_mres;
- const char *ctrl_name;
+ if (!mdss_is_ready()) {
+ pr_err("%s: MDP not probed yet!\n", __func__);
+ return -EPROBE_DEFER;
+ }
- ctrl_pdata = platform_get_drvdata(pdev);
+ if (!pdev->dev.of_node) {
+ pr_err("DSI driver only supports device tree probe\n");
+ return -ENOTSUPP;
+ }
+
+ ctrl_pdata = platform_get_drvdata(pdev);
+ if (!ctrl_pdata) {
+ ctrl_pdata = devm_kzalloc(&pdev->dev,
+ sizeof(struct mdss_dsi_ctrl_pdata),
+ GFP_KERNEL);
if (!ctrl_pdata) {
- ctrl_pdata = devm_kzalloc(&pdev->dev,
- sizeof(struct mdss_dsi_ctrl_pdata), GFP_KERNEL);
- if (!ctrl_pdata) {
- pr_err("%s: FAILED: cannot alloc dsi ctrl\n",
- __func__);
- rc = -ENOMEM;
- goto error_no_mem;
- }
- platform_set_drvdata(pdev, ctrl_pdata);
- }
-
- ctrl_name = of_get_property(pdev->dev.of_node, "label", NULL);
- if (!ctrl_name)
- pr_info("%s:%d, DSI Ctrl name not specified\n",
- __func__, __LINE__);
- else
- pr_info("%s: DSI Ctrl name = %s\n",
- __func__, ctrl_name);
-
- rc = of_property_read_u32(pdev->dev.of_node,
- "cell-index", &index);
- if (rc) {
- dev_err(&pdev->dev,
- "%s: Cell-index not specified, rc=%d\n",
- __func__, rc);
- goto error_no_mem;
- }
-
- if (index == 0)
- pdev->id = 1;
- else
- pdev->id = 2;
-
- mdss_dsi_mres = platform_get_resource(pdev, IORESOURCE_MEM, 0);
- if (!mdss_dsi_mres) {
- pr_err("%s:%d unable to get the MDSS resources",
- __func__, __LINE__);
+ pr_err("%s: FAILED: cannot alloc dsi ctrl\n",
+ __func__);
rc = -ENOMEM;
goto error_no_mem;
}
- if (mdss_dsi_mres) {
- mdss_dsi_base = ioremap(mdss_dsi_mres->start,
- resource_size(mdss_dsi_mres));
- if (!mdss_dsi_base) {
- pr_err("%s:%d unable to remap dsi resources",
- __func__, __LINE__);
- rc = -ENOMEM;
- goto error_no_mem;
- }
- }
-
- rc = of_platform_populate(pdev->dev.of_node,
- NULL, NULL, &pdev->dev);
- if (rc) {
- dev_err(&pdev->dev,
- "%s: failed to add child nodes, rc=%d\n",
- __func__, rc);
- goto error_ioremap;
- }
-
- /* Parse the regulator information */
- rc = mdss_dsi_get_dt_vreg_data(&pdev->dev,
- &ctrl_pdata->power_data);
- if (rc) {
- pr_err("%s: failed to get vreg data from dt. rc=%d\n",
- __func__, rc);
- goto error_vreg;
- }
-
- pr_debug("%s: Dsi Ctrl->%d initialized\n", __func__, index);
+ platform_set_drvdata(pdev, ctrl_pdata);
}
+ ctrl_name = of_get_property(pdev->dev.of_node, "label", NULL);
+ if (!ctrl_name)
+ pr_info("%s:%d, DSI Ctrl name not specified\n",
+ __func__, __LINE__);
+ else
+ pr_info("%s: DSI Ctrl name = %s\n",
+ __func__, ctrl_name);
+
+ rc = of_property_read_u32(pdev->dev.of_node,
+ "cell-index", &index);
+ if (rc) {
+ dev_err(&pdev->dev,
+ "%s: Cell-index not specified, rc=%d\n",
+ __func__, rc);
+ goto error_no_mem;
+ }
+
+ if (index == 0)
+ pdev->id = 1;
+ else
+ pdev->id = 2;
+
+ mdss_dsi_mres = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (!mdss_dsi_mres) {
+ pr_err("%s:%d unable to get the MDSS resources",
+ __func__, __LINE__);
+ rc = -ENOMEM;
+ goto error_no_mem;
+ }
+
+ mdss_dsi_base = ioremap(mdss_dsi_mres->start,
+ resource_size(mdss_dsi_mres));
+ if (!mdss_dsi_base) {
+ pr_err("%s:%d unable to remap dsi resources",
+ __func__, __LINE__);
+ rc = -ENOMEM;
+ goto error_no_mem;
+ }
+
+ rc = of_platform_populate(pdev->dev.of_node,
+ NULL, NULL, &pdev->dev);
+ if (rc) {
+ dev_err(&pdev->dev,
+ "%s: failed to add child nodes, rc=%d\n",
+ __func__, rc);
+ goto error_ioremap;
+ }
+
+ /* Parse the regulator information */
+ rc = mdss_dsi_get_dt_vreg_data(&pdev->dev,
+ &ctrl_pdata->power_data);
+ if (rc) {
+ pr_err("%s: failed to get vreg data from dt. rc=%d\n",
+ __func__, rc);
+ goto error_vreg;
+ }
+
+ /* DSI panels can be different between controllers */
+ rc = mdss_dsi_get_panel_cfg(panel_cfg);
+ if (!rc)
+ /* dsi panel cfg not present */
+ pr_warn("%s:%d:dsi specific cfg not present\n",
+ __func__, __LINE__);
+
+ /* find panel device node */
+ dsi_pan_node = mdss_dsi_find_panel_of_node(pdev, panel_cfg);
+ if (!dsi_pan_node) {
+ pr_err("%s: can't find panel node %s\n", __func__, panel_cfg);
+ goto error_pan_node;
+ }
+
+ cmd_cfg_cont_splash = mdss_panel_get_boot_cfg() ? true : false;
+
+ rc = mdss_dsi_panel_init(dsi_pan_node, &vendor_pdata);
+ if (rc) {
+ pr_err("%s: dsi panel init failed\n", __func__);
+ goto error_pan_node;
+ }
+
+ rc = dsi_panel_device_register(dsi_pan_node, &vendor_pdata,
+ cmd_cfg_cont_splash);
+ if (rc) {
+ pr_err("%s: dsi panel dev reg failed\n", __func__);
+ goto error_pan_node;
+ }
+
+ pr_debug("%s: Dsi Ctrl->%d initialized\n", __func__, index);
return 0;
+error_pan_node:
+ of_node_put(dsi_pan_node);
+error_vreg:
+ mdss_dsi_put_dt_vreg_data(&pdev->dev, &ctrl_pdata->power_data);
error_ioremap:
iounmap(mdss_dsi_base);
error_no_mem:
devm_kfree(&pdev->dev, ctrl_pdata);
-error_vreg:
- mdss_dsi_put_dt_vreg_data(&pdev->dev, &ctrl_pdata->power_data);
return rc;
}
@@ -810,9 +949,9 @@
return 0;
}
-
-int dsi_panel_device_register(struct platform_device *pdev,
- struct mdss_panel_common_pdata *panel_data)
+int dsi_panel_device_register(struct device_node *pan_node,
+ struct mdss_panel_common_pdata *panel_data,
+ bool cmd_cfg_cont_splash)
{
struct mipi_panel_info *mipi;
int rc, i, len;
@@ -887,7 +1026,7 @@
dsi_pclk_rate = 35000000;
mipi->dsi_pclk_rate = dsi_pclk_rate;
- dsi_ctrl_np = of_parse_phandle(pdev->dev.of_node,
+ dsi_ctrl_np = of_parse_phandle(pan_node,
"qcom,mdss-dsi-panel-controller", 0);
if (!dsi_ctrl_np) {
pr_err("%s: Dsi controller node not initialized\n", __func__);
@@ -903,8 +1042,7 @@
rc = mdss_dsi_regulator_init(ctrl_pdev);
if (rc) {
- dev_err(&pdev->dev,
- "%s: failed to init regulator, rc=%d\n",
+ pr_err("%s: failed to init regulator, rc=%d\n",
__func__, rc);
return rc;
}
@@ -956,10 +1094,11 @@
}
ctrl_pdata->shared_pdata.broadcast_enable = of_property_read_bool(
- pdev->dev.of_node, "qcom,mdss-dsi-panel-broadcast-mode");
+ pan_node, "qcom,mdss-dsi-panel-broadcast-mode");
ctrl_pdata->disp_en_gpio = of_get_named_gpio(ctrl_pdev->dev.of_node,
"qcom,platform-enable-gpio", 0);
+
if (!gpio_is_valid(ctrl_pdata->disp_en_gpio)) {
pr_err("%s:%d, Disp_en gpio not specified\n",
__func__, __LINE__);
@@ -1079,8 +1218,11 @@
ctrl_pdata->pclk_rate, ctrl_pdata->byte_clk_rate);
ctrl_pdata->ctrl_state = CTRL_STATE_UNKNOWN;
- cont_splash_enabled = of_property_read_bool(pdev->dev.of_node,
- "qcom,cont-splash-enabled");
+ if (cmd_cfg_cont_splash)
+ cont_splash_enabled = of_property_read_bool(pan_node,
+ "qcom,cont-splash-enabled");
+ else
+ cont_splash_enabled = false;
if (!cont_splash_enabled) {
pr_info("%s:%d Continuous splash flag not found.\n",
__func__, __LINE__);
@@ -1105,7 +1247,7 @@
rc = mdss_register_panel(ctrl_pdev, &(ctrl_pdata->panel_data));
if (rc) {
- dev_err(&pdev->dev, "unable to register MIPI DSI panel\n");
+ pr_err("%s: unable to register MIPI DSI panel\n", __func__);
if (ctrl_pdata->rst_gpio)
gpio_free(ctrl_pdata->rst_gpio);
if (gpio_is_valid(ctrl_pdata->disp_en_gpio))
@@ -1126,7 +1268,7 @@
ctrl_pdata->ndx = 1;
}
- pr_debug("%s: Panal data initialized\n", __func__);
+ pr_debug("%s: Panel data initialized\n", __func__);
return 0;
}
diff --git a/drivers/video/msm/mdss/mdss_dsi.h b/drivers/video/msm/mdss/mdss_dsi.h
index a8c34f3..fe60fec 100644
--- a/drivers/video/msm/mdss/mdss_dsi.h
+++ b/drivers/video/msm/mdss/mdss_dsi.h
@@ -369,8 +369,9 @@
struct dsi_buf rx_buf;
};
-int dsi_panel_device_register(struct platform_device *pdev,
- struct mdss_panel_common_pdata *panel_data);
+int dsi_panel_device_register(struct device_node *pan_node,
+ struct mdss_panel_common_pdata *panel_data,
+ bool cmd_cfg_cont_splash);
char *mdss_dsi_buf_reserve_hdr(struct dsi_buf *dp, int hlen);
char *mdss_dsi_buf_init(struct dsi_buf *dp);
@@ -428,4 +429,6 @@
struct dcs_cmd_req *mdss_dsi_cmdlist_get(struct mdss_dsi_ctrl_pdata *ctrl);
void mdss_dsi_cmdlist_kickoff(int intf);
+int mdss_dsi_panel_init(struct device_node *node,
+ struct mdss_panel_common_pdata *vendor_pdata);
#endif /* MDSS_DSI_H */
diff --git a/drivers/video/msm/mdss/mdss_dsi_panel.c b/drivers/video/msm/mdss/mdss_dsi_panel.c
index 9a9a227..29898db 100644
--- a/drivers/video/msm/mdss/mdss_dsi_panel.c
+++ b/drivers/video/msm/mdss/mdss_dsi_panel.c
@@ -485,10 +485,9 @@
}
-static int mdss_panel_parse_dt(struct platform_device *pdev,
- struct mdss_panel_common_pdata *panel_data)
+static int mdss_panel_parse_dt(struct device_node *np,
+ struct mdss_panel_common_pdata *panel_data)
{
- struct device_node *np = pdev->dev.of_node;
u32 tmp;
int rc, i, len;
const char *data;
@@ -547,8 +546,9 @@
panel_data->panel_info.mipi.dst_format =
DSI_VIDEO_DST_FORMAT_RGB888;
}
- pdest = of_get_property(pdev->dev.of_node,
+ pdest = of_get_property(np,
"qcom,mdss-dsi-panel-destination", NULL);
+
if (strlen(pdest) != 9) {
pr_err("%s: Unknown pdest specified\n", __func__);
return -EINVAL;
@@ -735,53 +735,34 @@
return -EINVAL;
}
-static int __devinit mdss_dsi_panel_probe(struct platform_device *pdev)
+int mdss_dsi_panel_init(struct device_node *node,
+ struct mdss_panel_common_pdata *vendor_pdata)
{
int rc = 0;
- static struct mdss_panel_common_pdata vendor_pdata;
static const char *panel_name;
- pr_debug("%s:%d, debug info id=%d", __func__, __LINE__, pdev->id);
- if (!pdev->dev.of_node)
- return -ENODEV;
- panel_name = of_get_property(pdev->dev.of_node,
- "qcom,mdss-dsi-panel-name", NULL);
+ if (!node) {
+ pr_err("%s: no panel node\n", __func__);
+ return -ENODEV;
+ }
+
+ pr_debug("%s:%d\n", __func__, __LINE__);
+ panel_name = of_get_property(node, "qcom,mdss-dsi-panel-name", NULL);
if (!panel_name)
- pr_info("%s:%d, panel name not specified\n",
+ pr_info("%s:%d, Panel name not specified\n",
__func__, __LINE__);
else
pr_info("%s: Panel Name = %s\n", __func__, panel_name);
- rc = mdss_panel_parse_dt(pdev, &vendor_pdata);
- if (rc)
+ rc = mdss_panel_parse_dt(node, vendor_pdata);
+ if (rc) {
+ pr_err("%s:%d panel dt parse failed\n", __func__, __LINE__);
return rc;
+ }
- vendor_pdata.on = mdss_dsi_panel_on;
- vendor_pdata.off = mdss_dsi_panel_off;
- vendor_pdata.bl_fnc = mdss_dsi_panel_bl_ctrl;
-
- rc = dsi_panel_device_register(pdev, &vendor_pdata);
- if (rc)
- return rc;
+ vendor_pdata->on = mdss_dsi_panel_on;
+ vendor_pdata->off = mdss_dsi_panel_off;
+ vendor_pdata->bl_fnc = mdss_dsi_panel_bl_ctrl;
return 0;
}
-
-static const struct of_device_id mdss_dsi_panel_match[] = {
- {.compatible = "qcom,mdss-dsi-panel"},
- {}
-};
-
-static struct platform_driver this_driver = {
- .probe = mdss_dsi_panel_probe,
- .driver = {
- .name = "dsi_panel",
- .of_match_table = mdss_dsi_panel_match,
- },
-};
-
-static int __init mdss_dsi_panel_init(void)
-{
- return platform_driver_register(&this_driver);
-}
-module_init(mdss_dsi_panel_init);
diff --git a/drivers/video/msm/mdss/mdss_edp.c b/drivers/video/msm/mdss/mdss_edp.c
index 3e0bc6d..64caaf5 100644
--- a/drivers/video/msm/mdss/mdss_edp.c
+++ b/drivers/video/msm/mdss/mdss_edp.c
@@ -753,6 +753,20 @@
{
int ret;
struct mdss_edp_drv_pdata *edp_drv;
+ struct mdss_panel_cfg *pan_cfg = NULL;
+
+ if (!mdss_is_ready()) {
+ pr_err("%s: MDP not probed yet!\n", __func__);
+ return -EPROBE_DEFER;
+ }
+
+ pan_cfg = mdss_panel_intf_type(MDSS_PANEL_INTF_EDP);
+ if (IS_ERR(pan_cfg)) {
+ return PTR_ERR(pan_cfg);
+ } else if (!pan_cfg) {
+ pr_debug("%s: not configured as prim\n", __func__);
+ return -ENODEV;
+ }
if (!pdev->dev.of_node) {
pr_err("%s: Failed\n", __func__);
diff --git a/drivers/video/msm/mdss/mdss_mdp.c b/drivers/video/msm/mdss/mdss_mdp.c
index b2e1cac..86a2e45 100644
--- a/drivers/video/msm/mdss/mdss_mdp.c
+++ b/drivers/video/msm/mdss/mdss_mdp.c
@@ -52,6 +52,7 @@
#include "mdss.h"
#include "mdss_fb.h"
#include "mdss_mdp.h"
+#include "mdss_panel.h"
#include "mdss_debug.h"
struct mdss_data_type *mdss_res;
@@ -92,6 +93,13 @@
MDP_BUS_VECTOR_ENTRY(SZ_256M, SZ_512M),
};
static struct msm_bus_paths mdp_bus_usecases[ARRAY_SIZE(mdp_bus_vectors)];
+
+static struct mdss_panel_intf pan_types[] = {
+ {"dsi", MDSS_PANEL_INTF_DSI},
+ {"edp", MDSS_PANEL_INTF_EDP},
+ {"hdmi", MDSS_PANEL_INTF_HDMI},
+};
+
static struct msm_bus_scale_pdata mdp_bus_scale_table = {
.usecase = mdp_bus_usecases,
.num_usecases = ARRAY_SIZE(mdp_bus_usecases),
@@ -1162,6 +1170,185 @@
return 0;
}
+static int mdss_mdp_get_pan_intf(const char *pan_intf)
+{
+ int i, rc = MDSS_PANEL_INTF_INVALID;
+
+ if (!pan_intf)
+ return rc;
+
+ for (i = 0; i < ARRAY_SIZE(pan_types); i++) {
+ if (!strncmp(pan_intf, pan_types[i].name, MDSS_MAX_PANEL_LEN)) {
+ rc = pan_types[i].type;
+ break;
+ }
+ }
+ return rc;
+}
+
+static int mdss_mdp_get_pan_cfg(struct mdss_panel_cfg *pan_cfg)
+{
+ char *t = NULL;
+ char pan_intf_str[MDSS_MAX_PANEL_LEN];
+ int rc, i;
+ char pan_name[MDSS_MAX_PANEL_LEN];
+
+ if (!pan_cfg)
+ return -EINVAL;
+
+ strlcpy(pan_name, &pan_cfg->arg_cfg[0], sizeof(pan_cfg->arg_cfg));
+ if (pan_name[0] == '0') {
+ pan_cfg->lk_cfg = false;
+ } else if (pan_name[0] == '1') {
+ pan_cfg->lk_cfg = true;
+ } else {
+ /* read from dt */
+ pan_cfg->lk_cfg = true;
+ pan_cfg->pan_intf = MDSS_PANEL_INTF_INVALID;
+ return -EINVAL;
+ }
+
+ /* skip lk cfg and delimiter; ex: "0:" */
+ strlcpy(pan_name, &pan_name[2], MDSS_MAX_PANEL_LEN);
+ t = strnstr(pan_name, ":", MDSS_MAX_PANEL_LEN);
+ if (!t) {
+ pr_err("%s: pan_name=[%s] invalid\n",
+ __func__, pan_name);
+ pan_cfg->pan_intf = MDSS_PANEL_INTF_INVALID;
+ return -EINVAL;
+ }
+
+ for (i = 0; ((pan_name + i) < t) && (i < 4); i++)
+ pan_intf_str[i] = *(pan_name + i);
+ pan_intf_str[i] = 0;
+ pr_debug("%s:%d panel intf %s\n", __func__, __LINE__, pan_intf_str);
+ /* point to the start of panel name */
+ t = t + 1;
+ strlcpy(&pan_cfg->arg_cfg[0], t, sizeof(pan_cfg->arg_cfg));
+ pr_debug("%s:%d: t=[%s] panel name=[%s]\n", __func__, __LINE__,
+ t, pan_cfg->arg_cfg);
+ rc = mdss_mdp_get_pan_intf(pan_intf_str);
+ pan_cfg->pan_intf = (rc < 0) ? MDSS_PANEL_INTF_INVALID : rc;
+ return 0;
+}
+
+static int mdss_mdp_parse_dt_pan_intf(struct platform_device *pdev)
+{
+ int rc;
+ struct mdss_data_type *mdata = platform_get_drvdata(pdev);
+ const char *prim_intf = NULL;
+
+ rc = of_property_read_string(pdev->dev.of_node,
+ "qcom,mdss-pref-prim-intf", &prim_intf);
+ if (rc)
+ return -ENODEV;
+
+ rc = mdss_mdp_get_pan_intf(prim_intf);
+ if (rc < 0) {
+ mdata->pan_cfg.pan_intf = MDSS_PANEL_INTF_INVALID;
+ } else {
+ mdata->pan_cfg.pan_intf = rc;
+ rc = 0;
+ }
+ return rc;
+}
+
+static int mdss_mdp_parse_bootarg(struct platform_device *pdev)
+{
+ struct device_node *chosen_node;
+ static const char *cmd_line;
+ char *disp_idx, *end_idx;
+ int rc, len = 0, name_len, cmd_len;
+ int *intf_type;
+ char *panel_name;
+ struct mdss_panel_cfg *pan_cfg;
+ struct mdss_data_type *mdata = platform_get_drvdata(pdev);
+
+ mdata->pan_cfg.arg_cfg[MDSS_MAX_PANEL_LEN] = 0;
+ pan_cfg = &mdata->pan_cfg;
+ panel_name = &pan_cfg->arg_cfg[0];
+ intf_type = &pan_cfg->pan_intf;
+
+ /* reads from dt by default */
+ pan_cfg->lk_cfg = true;
+
+ chosen_node = of_find_node_by_name(NULL, "chosen");
+ if (!chosen_node) {
+ pr_err("%s: get chosen node failed\n", __func__);
+ rc = -ENODEV;
+ goto get_dt_pan;
+ }
+
+ cmd_line = of_get_property(chosen_node, "bootargs", &len);
+ if (!cmd_line || len <= 0) {
+ pr_err("%s: get bootargs failed\n", __func__);
+ rc = -ENODEV;
+ goto get_dt_pan;
+ }
+
+ name_len = strlen("mdss_mdp.panel=");
+ cmd_len = strlen(cmd_line);
+ disp_idx = strnstr(cmd_line, "mdss_mdp.panel=", cmd_len);
+ if (!disp_idx) {
+ pr_err("%s:%d:cmdline panel not set disp_idx=[%p]\n",
+ __func__, __LINE__, disp_idx);
+ memset(panel_name, 0x00, MDSS_MAX_PANEL_LEN);
+ *intf_type = MDSS_PANEL_INTF_INVALID;
+ rc = MDSS_PANEL_INTF_INVALID;
+ goto get_dt_pan;
+ }
+
+ disp_idx += name_len;
+
+ end_idx = strnstr(disp_idx, " ", MDSS_MAX_PANEL_LEN);
+ pr_debug("%s:%d: pan_name=[%s] end=[%s]\n", __func__, __LINE__,
+ disp_idx, end_idx);
+ if (!end_idx) {
+ end_idx = disp_idx + strlen(disp_idx) + 1;
+ pr_warn("%s:%d: pan_name=[%s] end=[%s]\n", __func__,
+ __LINE__, disp_idx, end_idx);
+ }
+
+ if (end_idx <= disp_idx) {
+ pr_err("%s:%d:cmdline pan incorrect end=[%p] disp=[%p]\n",
+ __func__, __LINE__, end_idx, disp_idx);
+ memset(panel_name, 0x00, MDSS_MAX_PANEL_LEN);
+ *intf_type = MDSS_PANEL_INTF_INVALID;
+ rc = MDSS_PANEL_INTF_INVALID;
+ goto get_dt_pan;
+ }
+
+ *end_idx = 0;
+ len = end_idx - disp_idx + 1;
+ if (len <= 0) {
+ pr_warn("%s: panel name not rx", __func__);
+ rc = -EINVAL;
+ goto get_dt_pan;
+ }
+
+ strlcpy(panel_name, disp_idx, min(++len, MDSS_MAX_PANEL_LEN));
+ pr_debug("%s:%d panel:[%s]", __func__, __LINE__, panel_name);
+ of_node_put(chosen_node);
+
+ rc = mdss_mdp_get_pan_cfg(pan_cfg);
+ if (!rc)
+ pan_cfg->init_done = true;
+
+ return rc;
+
+get_dt_pan:
+ rc = mdss_mdp_parse_dt_pan_intf(pdev);
+ /* if pref pan intf is not present */
+ if (rc)
+ pr_err("%s:unable to parse device tree for pan intf\n",
+ __func__);
+ else
+ pan_cfg->init_done = true;
+
+ of_node_put(chosen_node);
+ return rc;
+}
+
static int mdss_mdp_parse_dt(struct platform_device *pdev)
{
int rc;
@@ -1214,6 +1401,13 @@
return rc;
}
+ rc = mdss_mdp_parse_bootarg(pdev);
+ if (rc) {
+ pr_err("%s: Error in panel override:rc=[%d]\n",
+ __func__, rc);
+ return rc;
+ }
+
return 0;
}
@@ -1679,11 +1873,61 @@
return len;
}
-struct mdss_data_type *mdss_mdp_get_mdata()
+struct mdss_data_type *mdss_mdp_get_mdata(void)
{
return mdss_res;
}
+/**
+ * mdss_is_ready() - checks if mdss is probed and ready
+ *
+ * Checks if mdss resources have been initialized
+ *
+ * returns true if mdss is ready, else returns false
+ */
+bool mdss_is_ready(void)
+{
+ return mdss_mdp_get_mdata() ? true : false;
+}
+EXPORT_SYMBOL(mdss_mdp_get_mdata);
+
+/**
+ * mdss_panel_intf_type() - checks if a given intf type is primary
+ * @intf_val: panel interface type of the individual controller
+ *
+ * Individual controller queries with MDP to check if it is
+ * configured as the primary interface.
+ *
+ * returns a pointer to the configured structure mdss_panel_cfg
+ * to the controller that's configured as the primary panel interface.
+ * returns NULL on error or if @intf_val is not the configured
+ * controller.
+ */
+struct mdss_panel_cfg *mdss_panel_intf_type(int intf_val)
+{
+ if (!mdss_res || !mdss_res->pan_cfg.init_done)
+ return ERR_PTR(-EPROBE_DEFER);
+
+ if (mdss_res->pan_cfg.pan_intf == intf_val)
+ return &mdss_res->pan_cfg;
+ else
+ return NULL;
+}
+EXPORT_SYMBOL(mdss_panel_intf_type);
+
+int mdss_panel_get_boot_cfg(void)
+{
+ int rc;
+
+ if (!mdss_res || !mdss_res->pan_cfg.init_done)
+ rc = -EPROBE_DEFER;
+ if (mdss_res->pan_cfg.lk_cfg)
+ rc = 1;
+ else
+ rc = 0;
+ return rc;
+}
+
static void mdss_mdp_footswitch_ctrl(struct mdss_data_type *mdata, int on)
{
if (!mdata->fs)
diff --git a/drivers/video/msm/mdss/mdss_panel.h b/drivers/video/msm/mdss/mdss_panel.h
index becf455..833bf14 100644
--- a/drivers/video/msm/mdss/mdss_panel.h
+++ b/drivers/video/msm/mdss/mdss_panel.h
@@ -57,6 +57,28 @@
MAX_PHYS_TARGET_NUM,
};
+enum {
+ MDSS_PANEL_INTF_INVALID = -1,
+ MDSS_PANEL_INTF_DSI,
+ MDSS_PANEL_INTF_EDP,
+ MDSS_PANEL_INTF_HDMI,
+};
+
+#define MDSS_MAX_PANEL_LEN 256
+#define MDSS_INTF_MAX_NAME_LEN 5
+struct mdss_panel_intf {
+ char name[MDSS_INTF_MAX_NAME_LEN];
+ u8 len;
+ int type;
+};
+
+struct mdss_panel_cfg {
+ char arg_cfg[MDSS_MAX_PANEL_LEN + 1];
+ int pan_intf;
+ bool lk_cfg;
+ bool init_done;
+};
+
/**
* enum mdss_intf_events - Different events generated by MDP core
*
@@ -328,4 +350,37 @@
int mdss_register_panel(struct platform_device *pdev,
struct mdss_panel_data *pdata);
+
+/**
+ * mdss_panel_intf_type: - checks if a given intf type is primary
+ * @intf_val: panel interface type of the individual controller
+ *
+ * Individual controller queries with MDP to check if it is
+ * configured as the primary interface.
+ *
+ * returns a pointer to the configured structure mdss_panel_cfg
+ * to the controller that's configured as the primary panel interface.
+ * returns NULL on error or if @intf_val is not the configured
+ * controller.
+ */
+struct mdss_panel_cfg *mdss_panel_intf_type(int intf_val);
+
+/**
+ * mdss_panel_get_boot_cfg() - checks if bootloader config present
+ *
+ * Function returns true if bootloader has configured the parameters
+ * for primary controller and panel config data.
+ *
+ * returns true if bootloader configured, else false
+ */
+int mdss_panel_get_boot_cfg(void);
+
+/**
+ * mdss_is_ready() - checks if mdss is probed and ready
+ *
+ * Checks if mdss resources have been initialized
+ *
+ * returns true if mdss is ready, else returns false.
+ */
+bool mdss_is_ready(void);
#endif /* MDSS_PANEL_H */