diff mbox series

[BUG] dw-mipi-dsi-rockchip display corruption with dsi panel

Message ID 20210810223123.2174596-1-pgwipeout@gmail.com (mailing list archive)
State New, archived
Headers show
Series [BUG] dw-mipi-dsi-rockchip display corruption with dsi panel | expand

Commit Message

Peter Geis Aug. 10, 2021, 10:31 p.m. UTC
Good Evening,

I've been attempting to light off the feiyang fy07024di26a30d panel on
the rockpro64. This is the official panel from the Pine64 store.
I've confirmed it works with the downstream kernel on both the rk3399
and rk3566, but on the mainline driver the display is partially
corrupted (see attached photo: [1]).

As you can see, the left half of the display is fine, but the right half
of the display is corrupted with the pixels smearing horizontally.

I saw when the panel was added, some additional code was added to
handle burst mode in the sun6_mipi_dsi driver [2].
I've seen that the dw-mipi-dsi driver appears to already support burst
mode and I can't find anything out of place there.
I also haven't had much success finding anything obviously different in
the downstream driver vs the upstream driver that would explain this.

Attached below is the in-progress dts changes for an example of how the
panel is plugged in.

I admit, I have little understanding of the mipi-dsi internal workings,
so I'm reaching out to the experts on how to correct this.

Thank you for your time,
Peter Geis

[1] https://photos.app.goo.gl/LBA9M2WcweGaEb4cA
[2] https://patchwork.kernel.org/project/linux-arm-kernel/cover/20181116163916.29621-1-jagan@amarulasolutions.com/

Comments

Heiko Stuebner Aug. 10, 2021, 11:11 p.m. UTC | #1
Hi Peter,

Am Mittwoch, 11. August 2021, 00:31:24 CEST schrieb Peter Geis:
> Good Evening,
> 
> I've been attempting to light off the feiyang fy07024di26a30d panel on
> the rockpro64. This is the official panel from the Pine64 store.
> I've confirmed it works with the downstream kernel on both the rk3399
> and rk3566, but on the mainline driver the display is partially
> corrupted (see attached photo: [1]).
> 
> As you can see, the left half of the display is fine, but the right half
> of the display is corrupted with the pixels smearing horizontally.
> 
> I saw when the panel was added, some additional code was added to
> handle burst mode in the sun6_mipi_dsi driver [2].
> I've seen that the dw-mipi-dsi driver appears to already support burst
> mode and I can't find anything out of place there.
> I also haven't had much success finding anything obviously different in
> the downstream driver vs the upstream driver that would explain this.
> 
> Attached below is the in-progress dts changes for an example of how the
> panel is plugged in.

is that really a dual-dsi panel needing two dsi controllers to drive it?

With that tiny resultion of 1024x600 I definitly wouldn't expect this,
in contrast to say the 2048x1536 dual-dsi displays used in the
Gru-Scarlet ChromeOS tablets.

So maybe just drop the 2nd dsi controller connection in a first step?
Because I really don't think that is the case on the hardware.

The dual-dsi setup means that you have one vop supplying half of its
display data to each of the 2 involved dsi controllers. And you're missing
in fact half of your display data.


Heiko



> I admit, I have little understanding of the mipi-dsi internal workings,
> so I'm reaching out to the experts on how to correct this.
> 
> Thank you for your time,
> Peter Geis
> 
> [1] https://photos.app.goo.gl/LBA9M2WcweGaEb4cA
> [2] https://patchwork.kernel.org/project/linux-arm-kernel/cover/20181116163916.29621-1-jagan@amarulasolutions.com/
> 
> diff --git a/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dtsi
> index 687a5afa5d2c..af55a30297ae 100644
> --- a/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dtsi
> +++ b/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dtsi
> @@ -20,6 +20,13 @@ chosen {
>  		stdout-path = "serial2:1500000n8";
>  	};
>  
> +	backlight: backlight {
> +		compatible = "pwm-backlight";
> +		pwms = <&pwm0 0 1000000 0>;
> +		brightness-levels = <0 4 8 16 32 64 128 255>;
> +		default-brightness-level = <128>;
> +	};
> +
>  	clkin_gmac: external-gmac-clock {
>  		compatible = "fixed-clock";
>  		clock-frequency = <125000000>;
> @@ -69,7 +76,7 @@ diy_led: led-1 {
>  
>  	fan: pwm-fan {
>  		compatible = "pwm-fan";
> -		cooling-levels = <0 150 200 255>;
> +		cooling-levels = <0 100 150 255>;
>  		#cooling-cells = <2>;
>  		fan-supply = <&vcc12v_dcin>;
>  		pwms = <&pwm1 0 50000 0>;
> @@ -220,6 +227,16 @@ vdd_log: vdd-log {
>  		regulator-max-microvolt = <1700000>;
>  		vin-supply = <&vcc5v0_sys>;
>  	};
> +
> +	avdd: avdd {
> +		compatible = "regulator-fixed";
> +		regulator-name = "avdd";
> +		regulator-always-on;
> +		regulator-boot-on;
> +		regulator-min-microvolt = <11000000>;
> +		regulator-max-microvolt = <11000000>;
> +		vin-supply = <&vcc3v3_s0>;
> +	};
>  };
>  
>  &cpu_l0 {
> @@ -428,8 +445,8 @@ regulator-state-mem {
>  
>  			vcc3v0_touch: LDO_REG2 {
>  				regulator-name = "vcc3v0_touch";
> -				regulator-always-on;
> -				regulator-boot-on;
> +//				regulator-always-on;
> +//				regulator-boot-on;
>  				regulator-min-microvolt = <3000000>;
>  				regulator-max-microvolt = <3000000>;
>  				regulator-state-mem {
> @@ -518,8 +535,8 @@ regulator-state-mem {
>  
>  			vcc3v3_s0: SWITCH_REG2 {
>  				regulator-name = "vcc3v3_s0";
> -				regulator-always-on;
> -				regulator-boot-on;
> +//				regulator-always-on;
> +//				regulator-boot-on;
>  				regulator-state-mem {
>  					regulator-off-in-suspend;
>  				};
> @@ -593,6 +610,19 @@ fusb0: typec-portc@22 {
>  		vbus-supply = <&vcc5v0_typec>;
>  		status = "okay";
>  	};
> +
> +	touch: touchscreen@5d {
> +		compatible = "goodix,gt911";
> +		reg = <0x5d>;
> +		AVDD28-supply = <&vcc3v0_touch>;
> +		VDDIO-supply = <&vcc3v0_touch>;
> +		interrupt-parent = <&gpio4>;
> +		interrupts = <RK_PD5 IRQ_TYPE_EDGE_FALLING>;
> +		irq-gpios = <&gpio4 RK_PD5 GPIO_ACTIVE_HIGH>;
> +		reset-gpios = <&gpio4 RK_PD6 GPIO_ACTIVE_HIGH>;
> +//		touchscreen-inverted-x;
> +//		touchscreen-inverted-y;
> +	};
>  };
>  
>  &i2s0 {
> @@ -628,6 +658,88 @@ &io_domains {
>  	gpio1830-supply = <&vcc_3v0>;
>  };
>  
> +&mipi_dsi {
> +	status = "okay";
> +	clock-master;
> +
> +	ports {
> +		mipi_out: port@1 {
> +			reg = <1>;
> +
> +			mipi_out_panel: endpoint {
> +				remote-endpoint = <&mipi_in_panel>;
> +			};
> +		};
> +	};
> +
> +	mipi_panel: panel@0 {
> +		compatible = "feiyang,fy07024di26a30d";
> +		reg = <0>;
> +		backlight = <&backlight>;
> +		reset-gpios = <&gpio4 25 GPIO_ACTIVE_HIGH>;
> +//		enable-gpios = <&gpio4 25 GPIO_ACTIVE_HIGH>;
> +		width-mm = <154>;
> +		height-mm = <86>;
> +		rotation = <0>;
> +		avdd-supply = <&avdd>;
> +		dvdd-supply = <&vcc3v3_s0>;
> +
> +		display-timings {
> +			native-mode = <&timing0>;
> +			timing0: timing0 {
> +				clock-frequency = <50000000>;
> +				hactive = <1024>;
> +				vactive = <600>;
> +				hfront-porch = <160>;
> +				hback-porch = <160>;
> +				hsync-len = <10>;
> +				vback-porch = <23>;
> +				vfront-porch = <12>;
> +				vsync-len = <1>;
> +				hsync-active = <0>;
> +				vsync-active = <0>;
> +				pixelclk-active = <0>;
> +				de-active = <0>;
> +			};
> +		};
> +
> +		ports {
> +			#address-cells = <1>;
> +			#size-cells = <0>;
> +
> +			port@0 {
> +				reg = <0>;
> +
> +				mipi_in_panel: endpoint {
> +					remote-endpoint = <&mipi_out_panel>;
> +				};
> +			};
> +
> +			port@1 {
> +				reg = <1>;
> +
> +				mipi1_in_panel: endpoint@1 {
> +					remote-endpoint = <&mipi1_out_panel>;
> +				};
> +			};
> +		};
> +	};
> +};
> +
> +&mipi_dsi1 {
> +	status = "okay";
> +
> +	ports {
> +		mipi1_out: port@1 {
> +			reg = <1>;
> +
> +			mipi1_out_panel: endpoint {
> +				remote-endpoint = <&mipi1_in_panel>;
> +			};
> +		};
> +	};
> +};
> +
>  &pcie0 {
>  	ep-gpios = <&gpio2 RK_PD4 GPIO_ACTIVE_HIGH>;
>  	num-lanes = <4>;
>
Peter Geis Aug. 10, 2021, 11:46 p.m. UTC | #2
On Tue, Aug 10, 2021 at 7:11 PM Heiko Stübner <heiko@sntech.de> wrote:
>
> Hi Peter,
>
> Am Mittwoch, 11. August 2021, 00:31:24 CEST schrieb Peter Geis:
> > Good Evening,
> >
> > I've been attempting to light off the feiyang fy07024di26a30d panel on
> > the rockpro64. This is the official panel from the Pine64 store.
> > I've confirmed it works with the downstream kernel on both the rk3399
> > and rk3566, but on the mainline driver the display is partially
> > corrupted (see attached photo: [1]).
> >
> > As you can see, the left half of the display is fine, but the right half
> > of the display is corrupted with the pixels smearing horizontally.
> >
> > I saw when the panel was added, some additional code was added to
> > handle burst mode in the sun6_mipi_dsi driver [2].
> > I've seen that the dw-mipi-dsi driver appears to already support burst
> > mode and I can't find anything out of place there.
> > I also haven't had much success finding anything obviously different in
> > the downstream driver vs the upstream driver that would explain this.
> >
> > Attached below is the in-progress dts changes for an example of how the
> > panel is plugged in.
>
> is that really a dual-dsi panel needing two dsi controllers to drive it?
>
> With that tiny resultion of 1024x600 I definitly wouldn't expect this,
> in contrast to say the 2048x1536 dual-dsi displays used in the
> Gru-Scarlet ChromeOS tablets.
>
> So maybe just drop the 2nd dsi controller connection in a first step?
> Because I really don't think that is the case on the hardware.
>
> The dual-dsi setup means that you have one vop supplying half of its
> display data to each of the 2 involved dsi controllers. And you're missing
> in fact half of your display data.

Thanks, that was it.
I had tried removing the link previously, but I had to also disable
that controller altogether or the vop fails to probe silently.

That is a common issue I ran into when getting this all set up,
anything failed to probe for the dsi panel the vop just silently dies
in the background and graphics fail everywhere.

>
>
> Heiko
>
>
>
> > I admit, I have little understanding of the mipi-dsi internal workings,
> > so I'm reaching out to the experts on how to correct this.
> >
> > Thank you for your time,
> > Peter Geis
> >
> > [1] https://photos.app.goo.gl/LBA9M2WcweGaEb4cA
> > [2] https://patchwork.kernel.org/project/linux-arm-kernel/cover/20181116163916.29621-1-jagan@amarulasolutions.com/
> >
> > diff --git a/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dtsi
> > index 687a5afa5d2c..af55a30297ae 100644
> > --- a/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dtsi
> > +++ b/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dtsi
> > @@ -20,6 +20,13 @@ chosen {
> >               stdout-path = "serial2:1500000n8";
> >       };
> >
> > +     backlight: backlight {
> > +             compatible = "pwm-backlight";
> > +             pwms = <&pwm0 0 1000000 0>;
> > +             brightness-levels = <0 4 8 16 32 64 128 255>;
> > +             default-brightness-level = <128>;
> > +     };
> > +
> >       clkin_gmac: external-gmac-clock {
> >               compatible = "fixed-clock";
> >               clock-frequency = <125000000>;
> > @@ -69,7 +76,7 @@ diy_led: led-1 {
> >
> >       fan: pwm-fan {
> >               compatible = "pwm-fan";
> > -             cooling-levels = <0 150 200 255>;
> > +             cooling-levels = <0 100 150 255>;
> >               #cooling-cells = <2>;
> >               fan-supply = <&vcc12v_dcin>;
> >               pwms = <&pwm1 0 50000 0>;
> > @@ -220,6 +227,16 @@ vdd_log: vdd-log {
> >               regulator-max-microvolt = <1700000>;
> >               vin-supply = <&vcc5v0_sys>;
> >       };
> > +
> > +     avdd: avdd {
> > +             compatible = "regulator-fixed";
> > +             regulator-name = "avdd";
> > +             regulator-always-on;
> > +             regulator-boot-on;
> > +             regulator-min-microvolt = <11000000>;
> > +             regulator-max-microvolt = <11000000>;
> > +             vin-supply = <&vcc3v3_s0>;
> > +     };
> >  };
> >
> >  &cpu_l0 {
> > @@ -428,8 +445,8 @@ regulator-state-mem {
> >
> >                       vcc3v0_touch: LDO_REG2 {
> >                               regulator-name = "vcc3v0_touch";
> > -                             regulator-always-on;
> > -                             regulator-boot-on;
> > +//                           regulator-always-on;
> > +//                           regulator-boot-on;
> >                               regulator-min-microvolt = <3000000>;
> >                               regulator-max-microvolt = <3000000>;
> >                               regulator-state-mem {
> > @@ -518,8 +535,8 @@ regulator-state-mem {
> >
> >                       vcc3v3_s0: SWITCH_REG2 {
> >                               regulator-name = "vcc3v3_s0";
> > -                             regulator-always-on;
> > -                             regulator-boot-on;
> > +//                           regulator-always-on;
> > +//                           regulator-boot-on;
> >                               regulator-state-mem {
> >                                       regulator-off-in-suspend;
> >                               };
> > @@ -593,6 +610,19 @@ fusb0: typec-portc@22 {
> >               vbus-supply = <&vcc5v0_typec>;
> >               status = "okay";
> >       };
> > +
> > +     touch: touchscreen@5d {
> > +             compatible = "goodix,gt911";
> > +             reg = <0x5d>;
> > +             AVDD28-supply = <&vcc3v0_touch>;
> > +             VDDIO-supply = <&vcc3v0_touch>;
> > +             interrupt-parent = <&gpio4>;
> > +             interrupts = <RK_PD5 IRQ_TYPE_EDGE_FALLING>;
> > +             irq-gpios = <&gpio4 RK_PD5 GPIO_ACTIVE_HIGH>;
> > +             reset-gpios = <&gpio4 RK_PD6 GPIO_ACTIVE_HIGH>;
> > +//           touchscreen-inverted-x;
> > +//           touchscreen-inverted-y;
> > +     };
> >  };
> >
> >  &i2s0 {
> > @@ -628,6 +658,88 @@ &io_domains {
> >       gpio1830-supply = <&vcc_3v0>;
> >  };
> >
> > +&mipi_dsi {
> > +     status = "okay";
> > +     clock-master;
> > +
> > +     ports {
> > +             mipi_out: port@1 {
> > +                     reg = <1>;
> > +
> > +                     mipi_out_panel: endpoint {
> > +                             remote-endpoint = <&mipi_in_panel>;
> > +                     };
> > +             };
> > +     };
> > +
> > +     mipi_panel: panel@0 {
> > +             compatible = "feiyang,fy07024di26a30d";
> > +             reg = <0>;
> > +             backlight = <&backlight>;
> > +             reset-gpios = <&gpio4 25 GPIO_ACTIVE_HIGH>;
> > +//           enable-gpios = <&gpio4 25 GPIO_ACTIVE_HIGH>;
> > +             width-mm = <154>;
> > +             height-mm = <86>;
> > +             rotation = <0>;
> > +             avdd-supply = <&avdd>;
> > +             dvdd-supply = <&vcc3v3_s0>;
> > +
> > +             display-timings {
> > +                     native-mode = <&timing0>;
> > +                     timing0: timing0 {
> > +                             clock-frequency = <50000000>;
> > +                             hactive = <1024>;
> > +                             vactive = <600>;
> > +                             hfront-porch = <160>;
> > +                             hback-porch = <160>;
> > +                             hsync-len = <10>;
> > +                             vback-porch = <23>;
> > +                             vfront-porch = <12>;
> > +                             vsync-len = <1>;
> > +                             hsync-active = <0>;
> > +                             vsync-active = <0>;
> > +                             pixelclk-active = <0>;
> > +                             de-active = <0>;
> > +                     };
> > +             };
> > +
> > +             ports {
> > +                     #address-cells = <1>;
> > +                     #size-cells = <0>;
> > +
> > +                     port@0 {
> > +                             reg = <0>;
> > +
> > +                             mipi_in_panel: endpoint {
> > +                                     remote-endpoint = <&mipi_out_panel>;
> > +                             };
> > +                     };
> > +
> > +                     port@1 {
> > +                             reg = <1>;
> > +
> > +                             mipi1_in_panel: endpoint@1 {
> > +                                     remote-endpoint = <&mipi1_out_panel>;
> > +                             };
> > +                     };
> > +             };
> > +     };
> > +};
> > +
> > +&mipi_dsi1 {
> > +     status = "okay";
> > +
> > +     ports {
> > +             mipi1_out: port@1 {
> > +                     reg = <1>;
> > +
> > +                     mipi1_out_panel: endpoint {
> > +                             remote-endpoint = <&mipi1_in_panel>;
> > +                     };
> > +             };
> > +     };
> > +};
> > +
> >  &pcie0 {
> >       ep-gpios = <&gpio2 RK_PD4 GPIO_ACTIVE_HIGH>;
> >       num-lanes = <4>;
> >
>
>
>
>
diff mbox series

Patch

diff --git a/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dtsi
index 687a5afa5d2c..af55a30297ae 100644
--- a/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dtsi
@@ -20,6 +20,13 @@  chosen {
 		stdout-path = "serial2:1500000n8";
 	};
 
+	backlight: backlight {
+		compatible = "pwm-backlight";
+		pwms = <&pwm0 0 1000000 0>;
+		brightness-levels = <0 4 8 16 32 64 128 255>;
+		default-brightness-level = <128>;
+	};
+
 	clkin_gmac: external-gmac-clock {
 		compatible = "fixed-clock";
 		clock-frequency = <125000000>;
@@ -69,7 +76,7 @@  diy_led: led-1 {
 
 	fan: pwm-fan {
 		compatible = "pwm-fan";
-		cooling-levels = <0 150 200 255>;
+		cooling-levels = <0 100 150 255>;
 		#cooling-cells = <2>;
 		fan-supply = <&vcc12v_dcin>;
 		pwms = <&pwm1 0 50000 0>;
@@ -220,6 +227,16 @@  vdd_log: vdd-log {
 		regulator-max-microvolt = <1700000>;
 		vin-supply = <&vcc5v0_sys>;
 	};
+
+	avdd: avdd {
+		compatible = "regulator-fixed";
+		regulator-name = "avdd";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <11000000>;
+		regulator-max-microvolt = <11000000>;
+		vin-supply = <&vcc3v3_s0>;
+	};
 };
 
 &cpu_l0 {
@@ -428,8 +445,8 @@  regulator-state-mem {
 
 			vcc3v0_touch: LDO_REG2 {
 				regulator-name = "vcc3v0_touch";
-				regulator-always-on;
-				regulator-boot-on;
+//				regulator-always-on;
+//				regulator-boot-on;
 				regulator-min-microvolt = <3000000>;
 				regulator-max-microvolt = <3000000>;
 				regulator-state-mem {
@@ -518,8 +535,8 @@  regulator-state-mem {
 
 			vcc3v3_s0: SWITCH_REG2 {
 				regulator-name = "vcc3v3_s0";
-				regulator-always-on;
-				regulator-boot-on;
+//				regulator-always-on;
+//				regulator-boot-on;
 				regulator-state-mem {
 					regulator-off-in-suspend;
 				};
@@ -593,6 +610,19 @@  fusb0: typec-portc@22 {
 		vbus-supply = <&vcc5v0_typec>;
 		status = "okay";
 	};
+
+	touch: touchscreen@5d {
+		compatible = "goodix,gt911";
+		reg = <0x5d>;
+		AVDD28-supply = <&vcc3v0_touch>;
+		VDDIO-supply = <&vcc3v0_touch>;
+		interrupt-parent = <&gpio4>;
+		interrupts = <RK_PD5 IRQ_TYPE_EDGE_FALLING>;
+		irq-gpios = <&gpio4 RK_PD5 GPIO_ACTIVE_HIGH>;
+		reset-gpios = <&gpio4 RK_PD6 GPIO_ACTIVE_HIGH>;
+//		touchscreen-inverted-x;
+//		touchscreen-inverted-y;
+	};
 };
 
 &i2s0 {
@@ -628,6 +658,88 @@  &io_domains {
 	gpio1830-supply = <&vcc_3v0>;
 };
 
+&mipi_dsi {
+	status = "okay";
+	clock-master;
+
+	ports {
+		mipi_out: port@1 {
+			reg = <1>;
+
+			mipi_out_panel: endpoint {
+				remote-endpoint = <&mipi_in_panel>;
+			};
+		};
+	};
+
+	mipi_panel: panel@0 {
+		compatible = "feiyang,fy07024di26a30d";
+		reg = <0>;
+		backlight = <&backlight>;
+		reset-gpios = <&gpio4 25 GPIO_ACTIVE_HIGH>;
+//		enable-gpios = <&gpio4 25 GPIO_ACTIVE_HIGH>;
+		width-mm = <154>;
+		height-mm = <86>;
+		rotation = <0>;
+		avdd-supply = <&avdd>;
+		dvdd-supply = <&vcc3v3_s0>;
+
+		display-timings {
+			native-mode = <&timing0>;
+			timing0: timing0 {
+				clock-frequency = <50000000>;
+				hactive = <1024>;
+				vactive = <600>;
+				hfront-porch = <160>;
+				hback-porch = <160>;
+				hsync-len = <10>;
+				vback-porch = <23>;
+				vfront-porch = <12>;
+				vsync-len = <1>;
+				hsync-active = <0>;
+				vsync-active = <0>;
+				pixelclk-active = <0>;
+				de-active = <0>;
+			};
+		};
+
+		ports {
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			port@0 {
+				reg = <0>;
+
+				mipi_in_panel: endpoint {
+					remote-endpoint = <&mipi_out_panel>;
+				};
+			};
+
+			port@1 {
+				reg = <1>;
+
+				mipi1_in_panel: endpoint@1 {
+					remote-endpoint = <&mipi1_out_panel>;
+				};
+			};
+		};
+	};
+};
+
+&mipi_dsi1 {
+	status = "okay";
+
+	ports {
+		mipi1_out: port@1 {
+			reg = <1>;
+
+			mipi1_out_panel: endpoint {
+				remote-endpoint = <&mipi1_in_panel>;
+			};
+		};
+	};
+};
+
 &pcie0 {
 	ep-gpios = <&gpio2 RK_PD4 GPIO_ACTIVE_HIGH>;
 	num-lanes = <4>;