aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPraneeth Bajjuri2017-08-17 16:08:41 -0500
committerPraneeth Bajjuri2017-08-17 16:08:41 -0500
commitf05c186d5e615d8a16c946946d1c9102777f9e96 (patch)
treeb14a8eb6f71469d397fbafd5b23106893d34446d
parent194e6054dc8591d9bcfca120e7afb52665b36f94 (diff)
parentb479cc78e8c20e2f65c519fb84b4ba5bf506ca75 (diff)
downloadkernel-omap-f05c186d5e615d8a16c946946d1c9102777f9e96.tar.gz
kernel-omap-f05c186d5e615d8a16c946946d1c9102777f9e96.tar.xz
kernel-omap-f05c186d5e615d8a16c946946d1c9102777f9e96.zip
Merge branch 'p-ti-lsk-linux-4.4.y-next' into p-ti-lsk-android-linux-4.4.y
* p-ti-lsk-linux-4.4.y-next: arm: dts: dra76: enable auo fpdlink display drivers: video: serdes: support ub921 serializer arm: dts: dra7: enable auo fpdlink display arm: dts: add auo fpdlink display dts fragment drivers: video: serdes: support ub924 deserializer Input: goodix - add polling support for touch events drivers: video: serdes: avoid splitting i2c transfer drivers: video: serdes: improve error message arm: dts: dra7: fpdlink: restructure dts for reuse Change-Id: Ia3842f0797a348f826494d47ee9c48fe2d8a9662 Signed-off-by: Praneeth Bajjuri <praneeth@ti.com>
-rw-r--r--Documentation/devicetree/bindings/video/fpd3-serdes.txt2
-rw-r--r--arch/arm/boot/dts/Makefile3
-rw-r--r--arch/arm/boot/dts/dra7-evm-fpd-auo-g101evn01.0.dts37
-rw-r--r--arch/arm/boot/dts/dra7-evm-fpd-lg.dts38
-rw-r--r--arch/arm/boot/dts/dra7-evm.dts61
-rw-r--r--arch/arm/boot/dts/dra72-evm-common.dtsi60
-rw-r--r--arch/arm/boot/dts/dra72-evm-fpd-lg.dts39
-rw-r--r--arch/arm/boot/dts/dra72-evm.dts1
-rw-r--r--arch/arm/boot/dts/dra76-evm-fpd-auo-g101evn01.0.dts67
-rw-r--r--arch/arm/boot/dts/dra76-evm.dts30
-rw-r--r--arch/arm/boot/dts/dra7x-evm-fpd-auo-g101evn01.0.dtsi107
-rw-r--r--arch/arm/boot/dts/dra7x-evm-fpd-lg.dtsi59
-rw-r--r--arch/arm/boot/dts/dra7x-evm-lcd-lg.dtsi1
-rw-r--r--arch/arm/boot/dts/dra7x-evm-lcd-osd.dtsi1
-rw-r--r--drivers/input/touchscreen/Kconfig1
-rw-r--r--drivers/input/touchscreen/goodix.c99
-rw-r--r--drivers/video/serdes/fpd3_i2c_adap.c32
-rw-r--r--drivers/video/serdes/fpd3_serdes.c40
18 files changed, 527 insertions, 151 deletions
diff --git a/Documentation/devicetree/bindings/video/fpd3-serdes.txt b/Documentation/devicetree/bindings/video/fpd3-serdes.txt
index e2afceeafacb..afa56806f7a5 100644
--- a/Documentation/devicetree/bindings/video/fpd3-serdes.txt
+++ b/Documentation/devicetree/bindings/video/fpd3-serdes.txt
@@ -32,6 +32,8 @@ Required Properties:
32 - "ti,ds90ub914aq": For TI FPDlink3 12bit video de serializer 32 - "ti,ds90ub914aq": For TI FPDlink3 12bit video de serializer
33 - "ti,ds90uh925q": For TI FPDlink3 24bit video serializer 33 - "ti,ds90uh925q": For TI FPDlink3 24bit video serializer
34 - "ti,ds90uh928q": For TI FPDlink3 24bit video de serializer 34 - "ti,ds90uh928q": For TI FPDlink3 24bit video de serializer
35 - "ti,ds90ub924q": For TI FPDlink3 24bit video de serializer
36 - "ti,ds90ub921q": For TI FPDlink3 24bit video serializer
35 37
36 - reg: I2C slave address 38 - reg: I2C slave address
37 This would be the alias adress for remote device. The CPU side 39 This would be the alias adress for remote device. The CPU side
diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile
index ddb6c3b1d8de..8b28d3badaea 100644
--- a/arch/arm/boot/dts/Makefile
+++ b/arch/arm/boot/dts/Makefile
@@ -494,11 +494,13 @@ dtb-$(CONFIG_SOC_OMAP5) += \
494dtb-$(CONFIG_SOC_DRA7XX) += \ 494dtb-$(CONFIG_SOC_DRA7XX) += \
495 dra7-evm.dtb \ 495 dra7-evm.dtb \
496 dra7-evm-lcd-lg.dtb \ 496 dra7-evm-lcd-lg.dtb \
497 dra7-evm-fpd-lg.dtb \
497 dra7-evm-lcd-lg-late-attach.dtb \ 498 dra7-evm-lcd-lg-late-attach.dtb \
498 dra7-evm-lcd-lg-late-attach-no-map.dtb \ 499 dra7-evm-lcd-lg-late-attach-no-map.dtb \
499 dra7-evm-lcd-osd.dtb \ 500 dra7-evm-lcd-osd.dtb \
500 dra7-evm-lcd-osd101t2587.dtb \ 501 dra7-evm-lcd-osd101t2587.dtb \
501 dra7-evm-lcd-osd-late-attach.dtb \ 502 dra7-evm-lcd-osd-late-attach.dtb \
503 dra7-evm-fpd-auo-g101evn01.0.dtb \
502 dra7-evm-vision.dtb \ 504 dra7-evm-vision.dtb \
503 am57xx-beagle-x15.dtb \ 505 am57xx-beagle-x15.dtb \
504 am57xx-beagle-x15-revb1.dtb \ 506 am57xx-beagle-x15-revb1.dtb \
@@ -514,6 +516,7 @@ dtb-$(CONFIG_SOC_DRA7XX) += \
514 dra72-evm-lcd-lg.dtb \ 516 dra72-evm-lcd-lg.dtb \
515 dra72-evm-lcd-osd.dtb \ 517 dra72-evm-lcd-osd.dtb \
516 dra72-evm-lcd-osd101t2587.dtb \ 518 dra72-evm-lcd-osd101t2587.dtb \
519 dra72-evm-fpd-lg.dtb \
517 dra72-evm-revc.dtb \ 520 dra72-evm-revc.dtb \
518 dra72-evm-revc-lcd-osd101t2045.dtb \ 521 dra72-evm-revc-lcd-osd101t2045.dtb \
519 dra72-evm-revc-lcd-osd101t2587.dtb \ 522 dra72-evm-revc-lcd-osd101t2587.dtb \
diff --git a/arch/arm/boot/dts/dra7-evm-fpd-auo-g101evn01.0.dts b/arch/arm/boot/dts/dra7-evm-fpd-auo-g101evn01.0.dts
new file mode 100644
index 000000000000..64e79754bb22
--- /dev/null
+++ b/arch/arm/boot/dts/dra7-evm-fpd-auo-g101evn01.0.dts
@@ -0,0 +1,37 @@
1#include "dra7-evm.dts"
2#include "dra7x-evm-fpd-auo-g101evn01.0.dtsi"
3
4/ {
5 aliases {
6 display0 = &fpd_disp;
7 display1 = &hdmi0;
8 };
9};
10
11&dss {
12 ports {
13 status = "ok";
14 };
15};
16
17&disp_ser {
18 status = "ok";
19 ranges = <0x0 0x2d>;
20};
21
22/* Tie the end points of DSS and FPDLink together */
23
24&fpd_in {
25 remote-endpoint = <&dpi_out3>;
26};
27
28&dpi_out3 {
29 remote-endpoint = <&fpd_in>;
30};
31
32&lcd_fpd {
33 enable-gpios = <&pcf_gpio_21 0 GPIO_ACTIVE_LOW>;
34 /* P0, SEL_GPMC_AD_VID_S0 */
35
36 status = "ok";
37};
diff --git a/arch/arm/boot/dts/dra7-evm-fpd-lg.dts b/arch/arm/boot/dts/dra7-evm-fpd-lg.dts
new file mode 100644
index 000000000000..b8df0766ecff
--- /dev/null
+++ b/arch/arm/boot/dts/dra7-evm-fpd-lg.dts
@@ -0,0 +1,38 @@
1#include "dra7-evm.dts"
2#include "dra7x-evm-fpd-lg.dtsi"
3
4/ {
5 aliases {
6 display0 = &fpd_disp;
7 display1 = &hdmi0;
8 };
9};
10
11&dss {
12 ports {
13 status = "ok";
14 };
15};
16
17&disp_ser {
18 status = "ok";
19 ranges = <0x2c 0x2c>,
20 <0x1c 0x1c>;
21};
22
23/* Tie the end points of DSS and FPDLink together */
24
25&fpd_in {
26 remote-endpoint = <&dpi_out3>;
27};
28
29&dpi_out3 {
30 remote-endpoint = <&fpd_in>;
31};
32
33&lcd_fpd {
34 enable-gpios = <&pcf_gpio_21 0 GPIO_ACTIVE_LOW>;
35 /* P0, SEL_GPMC_AD_VID_S0 */
36
37 status = "ok";
38};
diff --git a/arch/arm/boot/dts/dra7-evm.dts b/arch/arm/boot/dts/dra7-evm.dts
index e1d794f6a2f2..9171c04dd954 100644
--- a/arch/arm/boot/dts/dra7-evm.dts
+++ b/arch/arm/boot/dts/dra7-evm.dts
@@ -54,7 +54,6 @@
54 }; 54 };
55 55
56 aliases { 56 aliases {
57 display1 = &fpd_disp;
58 i2c7 = &disp_ser; 57 i2c7 = &disp_ser;
59 }; 58 };
60 59
@@ -850,66 +849,7 @@ i2c_p3_exp: &i2c2 {
850 849
851 #address-cells = <1>; 850 #address-cells = <1>;
852 #size-cells = <0>; 851 #size-cells = <0>;
853 ranges = <0x2c 0x2c>,
854 <0x1c 0x1c>;
855
856 disp_des: deserializer@2c {
857 compatible = "ti,ds90uh928q";
858 reg = <0x2c>;
859 slave-mode;
860 };
861
862 };
863};
864
865
866&disp_ser {
867 fpd_disp: tlc59108@1c {
868 #address-cells = <1>;
869 #size-cells = <0>;
870 compatible = "ti,tlc59108";
871 reg = <0x1c>;
872
873 };
874};
875
876/ {
877 lcd_fpd: display_fpd {
878 /*
879 * This is not really a dpi panel, but panel-dpi driver
880 * works as dummy panel driver.
881 */
882 compatible = "lg,lp101wx2", "panel-dpi";
883
884 label = "lcd_fpd";
885 enable-gpios = <&pcf_gpio_21 0 GPIO_ACTIVE_LOW>;
886 /* P0, SEL_GPMC_AD_VID_S0 */
887 status = "disabled"; 852 status = "disabled";
888
889 panel-timing {
890 clock-frequency = <69300404>;
891 hactive = <1280>;
892 vactive = <800>;
893
894 hfront-porch = <48>;
895 hback-porch = <44>;
896 hsync-len = <32>;
897
898 vfront-porch = <4>;
899 vback-porch = <7>;
900 vsync-len = <12>;
901
902 hsync-active = <0>;
903 vsync-active = <0>;
904 de-active = <1>;
905 pixelclk-active = <0>;
906 };
907
908 port@lcd3 {
909 fpd_in: endpoint {
910 remote-endpoint = <&dpi_out3>;
911 };
912 };
913 }; 853 };
914}; 854};
915 855
@@ -1136,7 +1076,6 @@ i2c_p3_exp: &i2c2 {
1136 reg = <2>; 1076 reg = <2>;
1137 1077
1138 dpi_out3: endpoint { 1078 dpi_out3: endpoint {
1139 remote-endpoint = <&fpd_in>;
1140 data-lines = <24>; 1079 data-lines = <24>;
1141 }; 1080 };
1142 }; 1081 };
diff --git a/arch/arm/boot/dts/dra72-evm-common.dtsi b/arch/arm/boot/dts/dra72-evm-common.dtsi
index a7a073fac380..1896ef30f673 100644
--- a/arch/arm/boot/dts/dra72-evm-common.dtsi
+++ b/arch/arm/boot/dts/dra72-evm-common.dtsi
@@ -16,7 +16,6 @@
16 16
17 aliases { 17 aliases {
18 display0 = &hdmi0; 18 display0 = &hdmi0;
19 display1 = &fpd_disp;
20 sound0 = &snd0; 19 sound0 = &snd0;
21 sound1 = &hdmi; 20 sound1 = &hdmi;
22 i2c7 = &disp_ser; 21 i2c7 = &disp_ser;
@@ -587,69 +586,13 @@ i2c_p3_exp: &i2c5 {
587 disp_ser: serializer@1b { 586 disp_ser: serializer@1b {
588 compatible = "ti,ds90uh925q"; 587 compatible = "ti,ds90uh925q";
589 reg = <0x1b>; 588 reg = <0x1b>;
589 status = "disabled";
590 590
591 #address-cells = <1>; 591 #address-cells = <1>;
592 #size-cells = <0>; 592 #size-cells = <0>;
593 ranges = <0x2c 0x2c>,
594 <0x1c 0x1c>;
595
596 disp_des: deserializer@2c {
597 compatible = "ti,ds90uh928q";
598 reg = <0x2c>;
599 slave-mode;
600 };
601 };
602};
603
604&disp_ser {
605 fpd_disp: tlc59108@1c {
606 #address-cells = <1>;
607 #size-cells = <0>;
608 compatible = "ti,tlc59108";
609 reg = <0x1c>;
610
611 }; 593 };
612}; 594};
613 595
614/ {
615 lcd_fpd: display_fpd {
616 /*
617 * This is not really a dpi panel, but panel-dpi driver
618 * works as dummy panel driver.
619 */
620 compatible = "lg,lp101wx2", "panel-dpi";
621
622 label = "lcd_fpd";
623 enable-gpios = <&pcf_gpio_21 0 GPIO_ACTIVE_LOW>;
624 /* P0, SEL_GPMC_AD_VID_S0 */
625 status = "disabled";
626
627 panel-timing {
628 clock-frequency = <69300404>;
629 hactive = <1280>;
630 vactive = <800>;
631
632 hfront-porch = <48>;
633 hback-porch = <44>;
634 hsync-len = <32>;
635
636 vfront-porch = <4>;
637 vback-porch = <7>;
638 vsync-len = <12>;
639
640 hsync-active = <0>;
641 vsync-active = <0>;
642 de-active = <1>;
643 pixelclk-active = <0>;
644 };
645
646 port@lcd3 {
647 fpd_in: endpoint {
648 remote-endpoint = <&dpi_out3>;
649 };
650 };
651 };
652};
653 596
654&dss { 597&dss {
655 status = "ok"; 598 status = "ok";
@@ -663,7 +606,6 @@ i2c_p3_exp: &i2c5 {
663 reg = <2>; 606 reg = <2>;
664 607
665 dpi_out3: endpoint { 608 dpi_out3: endpoint {
666 remote-endpoint = <&fpd_in>;
667 data-lines = <24>; 609 data-lines = <24>;
668 }; 610 };
669 }; 611 };
diff --git a/arch/arm/boot/dts/dra72-evm-fpd-lg.dts b/arch/arm/boot/dts/dra72-evm-fpd-lg.dts
new file mode 100644
index 000000000000..9ed0f66fdb76
--- /dev/null
+++ b/arch/arm/boot/dts/dra72-evm-fpd-lg.dts
@@ -0,0 +1,39 @@
1#include "dra72-evm.dts"
2#include "dra7x-evm-fpd-lg.dtsi"
3
4/* Set display aliases for use by Android */
5/ {
6 aliases {
7 display0 = &fpd_disp;
8 display1 = &hdmi0;
9 };
10};
11
12&dss {
13 ports {
14 status = "ok";
15 };
16};
17
18&disp_ser {
19 status = "ok";
20 ranges = <0x2c 0x2c>,
21 <0x1c 0x1c>;
22};
23
24/* Tie the end points of DSS and FPDLink together */
25
26&fpd_in {
27 remote-endpoint = <&dpi_out3>;
28};
29
30&dpi_out3 {
31 remote-endpoint = <&fpd_in>;
32};
33
34&lcd_fpd {
35 enable-gpios = <&pcf_gpio_21 0 GPIO_ACTIVE_LOW>;
36 /* P0, SEL_GPMC_AD_VID_S0 */
37
38 status = "ok";
39};
diff --git a/arch/arm/boot/dts/dra72-evm.dts b/arch/arm/boot/dts/dra72-evm.dts
index 73ac6c98771f..cc108d2f9b09 100644
--- a/arch/arm/boot/dts/dra72-evm.dts
+++ b/arch/arm/boot/dts/dra72-evm.dts
@@ -11,7 +11,6 @@
11 11
12 aliases { 12 aliases {
13 display0 = &hdmi0; 13 display0 = &hdmi0;
14 display1 = &fpd_disp;
15 sound1 = &hdmi; 14 sound1 = &hdmi;
16 i2c7 = &disp_ser; 15 i2c7 = &disp_ser;
17 }; 16 };
diff --git a/arch/arm/boot/dts/dra76-evm-fpd-auo-g101evn01.0.dts b/arch/arm/boot/dts/dra76-evm-fpd-auo-g101evn01.0.dts
new file mode 100644
index 000000000000..69983d70d1f4
--- /dev/null
+++ b/arch/arm/boot/dts/dra76-evm-fpd-auo-g101evn01.0.dts
@@ -0,0 +1,67 @@
1#include "dra76-evm.dts"
2#include "dra7x-evm-fpd-auo-g101evn01.0.dtsi"
3
4/ {
5 aliases {
6 display0 = &fpd_disp;
7 display1 = &hdmi0;
8 };
9};
10
11&dss {
12 ports {
13 status = "ok";
14 };
15};
16
17&disp_ser {
18 status = "ok";
19 ranges = <0x0 0x2d>;
20};
21
22/* Tie the end points of DSS and FPDLink together */
23&fpd_in {
24 remote-endpoint = <&dpi_out3>;
25};
26
27&dpi_out3 {
28 remote-endpoint = <&fpd_in>;
29};
30
31&lcd_fpd {
32 status = "ok";
33};
34
35/* U21 on the EVM */
36/* gpmc_ad_vid_s0: high: GPMC , low: VOUT3 */
37&pcf_gpio_21 {
38 p0 {
39 gpio-hog;
40 gpios = <0 GPIO_ACTIVE_HIGH>;
41 output-low;
42 line-name = "gpmc_ad_vid_s0";
43 };
44};
45
46
47/* U110 on the EVM. For Rev A boards */
48/*
49&pcf_hdmi {
50 p11 {
51 gpio-hog;
52 gpios = <11 GPIO_ACTIVE_HIGH>;
53 output-low;
54 line-name = "disp1_vpoc_onn";
55 };
56};
57*/
58
59/* For supplying power to the display via FPDLink */
60&gpio2 {
61 p2 {
62 gpio-hog;
63 gpios = <2 GPIO_ACTIVE_HIGH>;
64 output-low;
65 line-name = "disp1_vpoc_onn";
66 };
67};
diff --git a/arch/arm/boot/dts/dra76-evm.dts b/arch/arm/boot/dts/dra76-evm.dts
index f0c7666649c1..946a9a69038b 100644
--- a/arch/arm/boot/dts/dra76-evm.dts
+++ b/arch/arm/boot/dts/dra76-evm.dts
@@ -54,6 +54,10 @@
54 }; 54 };
55 }; 55 };
56 56
57 aliases {
58 i2c7 = &disp_ser;
59 };
60
57 vsys_12v0: fixedregulator-vsys12v0 { 61 vsys_12v0: fixedregulator-vsys12v0 {
58 /* main supply */ 62 /* main supply */
59 compatible = "regulator-fixed"; 63 compatible = "regulator-fixed";
@@ -474,9 +478,35 @@
474 phy-supply = <&ldo3_reg>; 478 phy-supply = <&ldo3_reg>;
475}; 479};
476 480
481&i2c3 {
482 disp_ser: serializer@0c {
483 compatible = "ti,ds90ub921q";
484 reg = <0x0c>;
485
486 #address-cells = <1>;
487 #size-cells = <0>;
488 status = "disabled";
489 };
490};
491
477&dss { 492&dss {
478 status = "ok"; 493 status = "ok";
479 vdda_video-supply = <&ldo5_reg>; 494 vdda_video-supply = <&ldo5_reg>;
495
496 ports {
497 #address-cells = <1>;
498 #size-cells = <0>;
499
500 status = "disabled";
501
502 port@lcd3 {
503 reg = <2>;
504
505 dpi_out3: endpoint {
506 data-lines = <24>;
507 };
508 };
509 };
480}; 510};
481 511
482&hdmi { 512&hdmi {
diff --git a/arch/arm/boot/dts/dra7x-evm-fpd-auo-g101evn01.0.dtsi b/arch/arm/boot/dts/dra7x-evm-fpd-auo-g101evn01.0.dtsi
new file mode 100644
index 000000000000..c928be92c1ac
--- /dev/null
+++ b/arch/arm/boot/dts/dra7x-evm-fpd-auo-g101evn01.0.dtsi
@@ -0,0 +1,107 @@
1/*
2 * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 */
8
9/ {
10 backlight {
11 compatible = "led-backlight";
12 leds = <&backlight_led>;
13 brightness-levels = <0 2 38 74 110 146 182 218 255>;
14 default-brightness-level = <8>;
15
16 enable-gpios = <&pcf_display_board 0 GPIO_ACTIVE_LOW>;
17 };
18
19 lcd_fpd: display {
20 compatible = "auo,g101evn01.0", "panel-dpi";
21
22 label = "lcd_fpd";
23 status = "disabled";
24
25 panel-timing {
26 clock-frequency = <68930000>;
27 hactive = <1280>;
28 vactive = <800>;
29
30 hfront-porch = <48>;
31 hsync-len = <32>;
32 hback-porch = <48>;
33
34 vfront-porch = <4>;
35 vsync-len = <4>;
36 vback-porch = <8>;
37
38 hsync-active = <0>;
39 vsync-active = <0>;
40 de-active = <1>;
41 pixelclk-active = <1>;
42 };
43
44 port {
45 fpd_in: endpoint {
46 };
47 };
48 };
49};
50
51&disp_ser {
52
53 /*
54 * 0x2c - deserializer
55 * 0x40 - TLC59108
56 * 0x27 - PCF8575
57 * 0x57 - EEPROM
58 * 0x14 - Goodix Touch Controller
59 * 0x28 - RF430CL330H
60 */
61
62 disp_des: deserializer@2c {
63 #address-cells = <1>;
64 #size-cells = <0>;
65 compatible = "ti,ds90ub924q";
66 reg = <0x2c>;
67 slave-mode;
68 };
69
70 /* TLC chip for LCD panel power and backlight */
71 fpd_disp: tlc59108@40 {
72 #address-cells = <1>;
73 #size-cells = <0>;
74 compatible = "ti,tlc59108";
75 reg = <0x40>;
76
77 backlight_led: bl@2 {
78 label = "backlight";
79 reg = <0x2>;
80 };
81 };
82
83 pcf_display_board: gpio@27 {
84 compatible = "nxp,pcf8575";
85 reg = <0x27>;
86 gpio-controller;
87 #gpio-cells = <2>;
88 };
89
90 touchscreen: goodix-gt9271@14 {
91 status = "okay";
92 compatible = "goodix,gt9271";
93 reg = <0x14>;
94
95 touchscreen-size-x = <1280>;
96 touchscreen-size-y = <800>;
97 touchscreen-inverted-y;
98
99 /* Reset gpio line is inverted before going to touch panel */
100 reset-gpios = <&pcf_display_board 5 GPIO_ACTIVE_LOW>;
101 irq-gpios = <&pcf_display_board 6 GPIO_ACTIVE_HIGH>;
102 };
103
104 /* Below two slaves on the I2C bus are not yet defined */
105 /* ID EEPROM 0x57 */
106 /* RF430CL330H 0x28 */
107};
diff --git a/arch/arm/boot/dts/dra7x-evm-fpd-lg.dtsi b/arch/arm/boot/dts/dra7x-evm-fpd-lg.dtsi
new file mode 100644
index 000000000000..b4760b4efdad
--- /dev/null
+++ b/arch/arm/boot/dts/dra7x-evm-fpd-lg.dtsi
@@ -0,0 +1,59 @@
1/*
2 * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 */
8
9#include <dt-bindings/gpio/gpio.h>
10
11
12/ {
13 lcd_fpd: display_fpd {
14 /*
15 * This is not really a dpi panel, but panel-dpi driver
16 * works as dummy panel driver.
17 */
18 compatible = "lg,lp101wx2", "panel-dpi";
19
20 label = "lcd_fpd";
21 status = "disabled";
22
23 panel-timing {
24 clock-frequency = <69300404>;
25 hactive = <1280>;
26 vactive = <800>;
27
28 hfront-porch = <48>;
29 hback-porch = <44>;
30 hsync-len = <32>;
31
32 vfront-porch = <4>;
33 vback-porch = <7>;
34 vsync-len = <12>;
35
36 hsync-active = <0>;
37 vsync-active = <0>;
38 de-active = <1>;
39 pixelclk-active = <0>;
40 };
41
42 port {
43 fpd_in: endpoint {
44 };
45 };
46 };
47};
48
49&disp_ser {
50 disp_des: deserializer@2c {
51 compatible = "ti,ds90uh928q";
52 reg = <0x2c>;
53 slave-mode;
54 };
55 fpd_disp: tlc59108@1c {
56 compatible = "ti,tlc59108";
57 reg = <0x1c>;
58 };
59};
diff --git a/arch/arm/boot/dts/dra7x-evm-lcd-lg.dtsi b/arch/arm/boot/dts/dra7x-evm-lcd-lg.dtsi
index 52a957d08cf2..23268b7a474f 100644
--- a/arch/arm/boot/dts/dra7x-evm-lcd-lg.dtsi
+++ b/arch/arm/boot/dts/dra7x-evm-lcd-lg.dtsi
@@ -12,7 +12,6 @@
12 aliases { 12 aliases {
13 display0 = &tlc59108; 13 display0 = &tlc59108;
14 display1 = &hdmi0; 14 display1 = &hdmi0;
15 display2 = &fpd_disp;
16 }; 15 };
17 16
18 backlight { 17 backlight {
diff --git a/arch/arm/boot/dts/dra7x-evm-lcd-osd.dtsi b/arch/arm/boot/dts/dra7x-evm-lcd-osd.dtsi
index 219e4f953797..7dc9c986a73a 100644
--- a/arch/arm/boot/dts/dra7x-evm-lcd-osd.dtsi
+++ b/arch/arm/boot/dts/dra7x-evm-lcd-osd.dtsi
@@ -10,7 +10,6 @@
10 aliases { 10 aliases {
11 display0 = &lcd; 11 display0 = &lcd;
12 display1 = &hdmi0; 12 display1 = &hdmi0;
13 display2 = &fpd_disp;
14 }; 13 };
15 14
16 lcd_bl: backlight { 15 lcd_bl: backlight {
diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig
index 8364d84fd696..97f1eacdda0e 100644
--- a/drivers/input/touchscreen/Kconfig
+++ b/drivers/input/touchscreen/Kconfig
@@ -325,6 +325,7 @@ config TOUCHSCREEN_GOODIX
325 tristate "Goodix I2C touchscreen" 325 tristate "Goodix I2C touchscreen"
326 depends on I2C 326 depends on I2C
327 depends on GPIOLIB 327 depends on GPIOLIB
328 select INPUT_POLLDEV
328 help 329 help
329 Say Y here if you have the Goodix touchscreen (such as one 330 Say Y here if you have the Goodix touchscreen (such as one
330 installed in Onda v975w tablets) connected to your 331 installed in Onda v975w tablets) connected to your
diff --git a/drivers/input/touchscreen/goodix.c b/drivers/input/touchscreen/goodix.c
index a27f0d7107af..916c9877261f 100644
--- a/drivers/input/touchscreen/goodix.c
+++ b/drivers/input/touchscreen/goodix.c
@@ -22,6 +22,7 @@
22#include <linux/i2c.h> 22#include <linux/i2c.h>
23#include <linux/input.h> 23#include <linux/input.h>
24#include <linux/input/mt.h> 24#include <linux/input/mt.h>
25#include <linux/input-polldev.h>
25#include <linux/module.h> 26#include <linux/module.h>
26#include <linux/delay.h> 27#include <linux/delay.h>
27#include <linux/irq.h> 28#include <linux/irq.h>
@@ -34,6 +35,7 @@
34struct goodix_ts_data { 35struct goodix_ts_data {
35 struct i2c_client *client; 36 struct i2c_client *client;
36 struct input_dev *input_dev; 37 struct input_dev *input_dev;
38 struct input_polled_dev *poll_dev;
37 int abs_x_max; 39 int abs_x_max;
38 int abs_y_max; 40 int abs_y_max;
39 bool swapped_x_y; 41 bool swapped_x_y;
@@ -77,6 +79,8 @@ struct goodix_ts_data {
77#define MAX_CONTACTS_LOC 5 79#define MAX_CONTACTS_LOC 5
78#define TRIGGER_LOC 6 80#define TRIGGER_LOC 6
79 81
82#define TSC_DEFAULT_POLL_PERIOD 30 /* ms */
83
80static const unsigned long goodix_irq_flags[] = { 84static const unsigned long goodix_irq_flags[] = {
81 IRQ_TYPE_EDGE_RISING, 85 IRQ_TYPE_EDGE_RISING,
82 IRQ_TYPE_EDGE_FALLING, 86 IRQ_TYPE_EDGE_FALLING,
@@ -281,6 +285,20 @@ static void goodix_process_events(struct goodix_ts_data *ts)
281 input_sync(ts->input_dev); 285 input_sync(ts->input_dev);
282} 286}
283 287
288static void _goodix_process_events(struct goodix_ts_data *ts)
289{
290 goodix_process_events(ts);
291
292 if (goodix_i2c_write_u8(ts->client, GOODIX_READ_COOR_ADDR, 0) < 0)
293 dev_err(&ts->client->dev, "I2C write end_cmd error\n");
294
295}
296static void goodix_poll(struct input_polled_dev *poll_dev)
297{
298 struct goodix_ts_data *ts = poll_dev->private;
299
300 _goodix_process_events(ts);
301}
284/** 302/**
285 * goodix_ts_irq_handler - The IRQ handler 303 * goodix_ts_irq_handler - The IRQ handler
286 * 304 *
@@ -291,10 +309,7 @@ static irqreturn_t goodix_ts_irq_handler(int irq, void *dev_id)
291{ 309{
292 struct goodix_ts_data *ts = dev_id; 310 struct goodix_ts_data *ts = dev_id;
293 311
294 goodix_process_events(ts); 312 _goodix_process_events(ts);
295
296 if (goodix_i2c_write_u8(ts->client, GOODIX_READ_COOR_ADDR, 0) < 0)
297 dev_err(&ts->client->dev, "I2C write end_cmd error\n");
298 313
299 return IRQ_HANDLED; 314 return IRQ_HANDLED;
300} 315}
@@ -614,6 +629,58 @@ static int goodix_request_input_dev(struct goodix_ts_data *ts)
614 return 0; 629 return 0;
615} 630}
616 631
632static int goodix_request_input_polled_dev(struct goodix_ts_data *ts)
633{
634 int error;
635 struct input_polled_dev *poll_dev;
636
637 dev_err(&ts->client->dev, "Setting up polling.\n");
638 poll_dev = input_allocate_polled_device();
639 if (!poll_dev) {
640 dev_err(&ts->client->dev, "Failed to allocate polled input device.\n");
641 error = -ENOMEM;
642 return error;
643 }
644
645 ts->poll_dev = poll_dev;
646
647 poll_dev->private = ts;
648 poll_dev->poll = goodix_poll;
649 poll_dev->poll_interval = TSC_DEFAULT_POLL_PERIOD;
650
651 ts->input_dev = poll_dev->input;
652 if (!ts->input_dev) {
653 dev_err(&ts->client->dev, "Failed to allocate input device.");
654 return -ENOMEM;
655 }
656
657 input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X,
658 0, ts->abs_x_max, 0, 0);
659 input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y,
660 0, ts->abs_y_max, 0, 0);
661 input_set_abs_params(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0, 255, 0, 0);
662 input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0);
663
664 input_mt_init_slots(ts->input_dev, ts->max_touch_num,
665 INPUT_MT_DIRECT | INPUT_MT_DROP_UNUSED);
666
667 ts->input_dev->name = "Goodix Capacitive TouchScreen";
668 ts->input_dev->phys = "input/ts";
669 ts->input_dev->id.bustype = BUS_I2C;
670 ts->input_dev->id.vendor = 0x0416;
671 ts->input_dev->id.product = ts->id;
672 ts->input_dev->id.version = ts->version;
673
674 error = input_register_polled_device(poll_dev);
675 if (error) {
676 dev_err(&ts->client->dev,
677 "Failed to register input device: %d", error);
678 return error;
679 }
680
681 return 0;
682}
683
617/** 684/**
618 * goodix_configure_dev - Finish device initialization 685 * goodix_configure_dev - Finish device initialization
619 * 686 *
@@ -637,15 +704,23 @@ static int goodix_configure_dev(struct goodix_ts_data *ts)
637 704
638 goodix_read_config(ts); 705 goodix_read_config(ts);
639 706
640 error = goodix_request_input_dev(ts); 707 if (ts->client->irq) {
641 if (error) 708 error = goodix_request_input_dev(ts);
642 return error; 709 if (error)
710 return error;
711 ts->irq_flags = goodix_irq_flags[ts->int_trigger_type] |
712 IRQF_ONESHOT;
713 error = goodix_request_irq(ts);
714 if (error) {
715 dev_err(&ts->client->dev, "request IRQ failed: %d\n",
716 error);
717 return error;
718 }
719 } else {
720 /* setup polling if IRQ is not defined */
721
722 error = goodix_request_input_polled_dev(ts);
643 723
644 ts->irq_flags = goodix_irq_flags[ts->int_trigger_type] | IRQF_ONESHOT;
645 error = goodix_request_irq(ts);
646 if (error) {
647 dev_err(&ts->client->dev, "request IRQ failed: %d\n", error);
648 return error;
649 } 724 }
650 725
651 return 0; 726 return 0;
diff --git a/drivers/video/serdes/fpd3_i2c_adap.c b/drivers/video/serdes/fpd3_i2c_adap.c
index 136c29c10956..8cc866fc1221 100644
--- a/drivers/video/serdes/fpd3_i2c_adap.c
+++ b/drivers/video/serdes/fpd3_i2c_adap.c
@@ -100,8 +100,10 @@ static int fpd3_serdes_setup_aliases(struct i2c_client *client)
100 count++; 100 count++;
101 } 101 }
102 102
103 if (count >= FPD3_MAX_POLL_COUNT) 103 if (count >= FPD3_MAX_POLL_COUNT) {
104 dev_err(&client->dev, "Unable to sync with remote slave");
104 return -EIO; 105 return -EIO;
106 }
105 107
106 dev_dbg(&client->dev, "Remote signal detected"); 108 dev_dbg(&client->dev, "Remote signal detected");
107 return 0; 109 return 0;
@@ -197,38 +199,36 @@ static int fpd3_master_xfer(struct i2c_adapter *adap,
197 struct i2c_msg msgs[], int num) 199 struct i2c_msg msgs[], int num)
198{ 200{
199 struct i2c_adapter *alias_adap; 201 struct i2c_adapter *alias_adap;
200 struct i2c_msg new_msg; 202 struct i2c_msg *new_msg;
201 u8 alias_addr; 203 u8 alias_addr;
202 int i, ret = 0; 204 int i, ret = 0;
203 int num_tred = 0;
204 205
205 if (setup_link(adap)) 206 if (setup_link(adap))
206 return -EIO; 207 return -EIO;
207 208
208 alias_adap = __get_alias_adapter(adap); 209 alias_adap = __get_alias_adapter(adap);
209 210
211 new_msg = kcalloc(num, sizeof(*new_msg), GFP_KERNEL);
212
210 for (i = 0; i < num; i++) { 213 for (i = 0; i < num; i++) {
211 alias_addr = __get_alias_addr(adap, msgs[i].addr); 214 alias_addr = __get_alias_addr(adap, msgs[i].addr);
212 if (alias_addr == 0) { 215 if (alias_addr == 0) {
213 ret = -EINVAL; 216 ret = -EINVAL;
214 break; 217 goto cleanup;
215 } 218 }
216 219
217 /* Copy the i2c_msgs into temporary buffer; xlate address */ 220 /* Copy the i2c_msgs into temporary buffer; xlate address */
218 new_msg = msgs[i]; 221 new_msg[i] = msgs[i];
219 new_msg.addr = alias_addr; 222 new_msg[i].addr = alias_addr;
220 /* Issue the messages on the alias adapter */
221 ret = i2c_transfer(alias_adap, &new_msg, 1);
222 if (ret < 0)
223 break;
224 else
225 num_tred++;
226 } 223 }
227 224
228 if (ret < 0) 225 /* Issue the messages on the alias adapter */
229 return ret; 226 ret = i2c_transfer(alias_adap, new_msg, num);
230 else 227
231 return num_tred; 228 cleanup:
229 kfree(new_msg);
230
231 return ret;
232} 232}
233 233
234static int fpd3_smbus_xfer(struct i2c_adapter *adap, u16 addr, 234static int fpd3_smbus_xfer(struct i2c_adapter *adap, u16 addr,
diff --git a/drivers/video/serdes/fpd3_serdes.c b/drivers/video/serdes/fpd3_serdes.c
index 90de8d559f2f..3598683a3d31 100644
--- a/drivers/video/serdes/fpd3_serdes.c
+++ b/drivers/video/serdes/fpd3_serdes.c
@@ -23,6 +23,8 @@
23 * DS90UB913aq/DS90UB914aq http://www.ti.com/lit/ds/snls443a/snls443a.pdf 23 * DS90UB913aq/DS90UB914aq http://www.ti.com/lit/ds/snls443a/snls443a.pdf
24 * DS90UH925Q http://www.ti.com/lit/ds/symlink/ds90uh925q-q1.pdf 24 * DS90UH925Q http://www.ti.com/lit/ds/symlink/ds90uh925q-q1.pdf
25 * DS90UH928Q http://www.ti.com/lit/ds/snls440a/snls440a.pdf 25 * DS90UH928Q http://www.ti.com/lit/ds/snls440a/snls440a.pdf
26 * DS90UB924Q http://www.ti.com/lit/ds/snls512/snls512.pdf
27 * DS90UB921Q http://www.ti.com/lit/ds/symlink/ds90ub921-q1.pdf
26 * 28 *
27 * Documentation:- 29 * Documentation:-
28 * -> Documentation/video-serdes.txt 30 * -> Documentation/video-serdes.txt
@@ -78,6 +80,20 @@ static const unsigned int fpd3_24bit_des_init[] = {
78 FPD3_DES_CONFIG1, 0x4c, 80 FPD3_DES_CONFIG1, 0x4c,
79}; 81};
80 82
83static const unsigned int fpd3_921_ser_init[] = {
84 /* Reset entire digital block except registers */
85 FPD3_SER_RESET, 0x01,
86 /* back chan en, auto ack WR, i2c passthrough, rising edge pclk */
87 FPD3_SER_CONFIG1, 0x8b,
88};
89
90static const unsigned int fpd3_924_des_init[] = {
91 /* digital reset1 */
92 FPD3_DES_RESET, 0x02,
93 /* back channel en */
94 FPD3_DES_RESET, 0x04,
95};
96
81static struct fpd3_serdes_platform_data fpd3_serdes_pdata[] = { 97static struct fpd3_serdes_platform_data fpd3_serdes_pdata[] = {
82 { 98 {
83 .name = "fpd3_12b_ser", 99 .name = "fpd3_12b_ser",
@@ -119,6 +135,26 @@ static struct fpd3_serdes_platform_data fpd3_serdes_pdata[] = {
119 .init_seq = fpd3_24bit_des_init, 135 .init_seq = fpd3_24bit_des_init,
120 .init_len = ARRAY_SIZE(fpd3_24bit_des_init), 136 .init_len = ARRAY_SIZE(fpd3_24bit_des_init),
121 }, 137 },
138 {
139 .name = "fpd3_924_des",
140 .dev_type = FPD3_DES_DEV,
141 .ngpio = 4,
142 .nslaves = 8,
143 .device_id = 0x58,
144 .gpio_2reg = 2 * FPD3_DES_GPIO_01 + 1,
145 .init_seq = fpd3_924_des_init,
146 .init_len = ARRAY_SIZE(fpd3_924_des_init),
147 },
148 {
149 .name = "fpd3_921_ser",
150 .dev_type = FPD3_SER_DEV,
151 .ngpio = 4,
152 .nslaves = 1,
153 .device_id = 0x18,
154 .gpio_2reg = 2 * FPD3_SER_GPIO_01 + 1,
155 .init_seq = fpd3_921_ser_init,
156 .init_len = ARRAY_SIZE(fpd3_921_ser_init),
157 },
122}; 158};
123 159
124/* GPIO operations */ 160/* GPIO operations */
@@ -309,6 +345,8 @@ static const struct i2c_device_id fpd3_serdes_i2c_ids[] = {
309 { "ds90ub914aq", 8 }, 345 { "ds90ub914aq", 8 },
310 { "ds90uh925q", 8 }, 346 { "ds90uh925q", 8 },
311 { "ds90uh928q", 8 }, 347 { "ds90uh928q", 8 },
348 { "ds90ub924q", 8 },
349 { "ds90ub921q", 8 },
312 { } 350 { }
313}; 351};
314MODULE_DEVICE_TABLE(i2c, fpd3_serdes_i2c_ids); 352MODULE_DEVICE_TABLE(i2c, fpd3_serdes_i2c_ids);
@@ -318,6 +356,8 @@ static const struct of_device_id fpd3_serdes_dt_ids[] = {
318 {.compatible = "ti,ds90ub914aq", &fpd3_serdes_pdata[1], }, 356 {.compatible = "ti,ds90ub914aq", &fpd3_serdes_pdata[1], },
319 {.compatible = "ti,ds90uh925q", &fpd3_serdes_pdata[2], }, 357 {.compatible = "ti,ds90uh925q", &fpd3_serdes_pdata[2], },
320 {.compatible = "ti,ds90uh928q", &fpd3_serdes_pdata[3], }, 358 {.compatible = "ti,ds90uh928q", &fpd3_serdes_pdata[3], },
359 {.compatible = "ti,ds90ub924q", &fpd3_serdes_pdata[4], },
360 {.compatible = "ti,ds90ub921q", &fpd3_serdes_pdata[5], },
321 { } 361 { }
322}; 362};
323 363