diff mbox series

[1/8] RFC: drivers/video/rockchip/rk_vop.c: Use endpoint compatible string to find VOP mode

Message ID 20200925183856.346332079@rtp-net.org
State RFC
Delegated to: Anatolij Gustschin
Headers show
Series RFC: Pinebook pro EDP support | expand

Commit Message

Arnaud Patard (Rtp) Sept. 25, 2020, 6:36 p.m. UTC
The current code is using an hard coded enum and the of node reg value of
endpoint to find out if the endpoint is mipi/hdmi/lvds/edp/dp. The order
is different between rk3288, rk3399 vop little, rk3399 vop big.

A possible solution would be to make sure that the rk3288.dtsi and 
rk3399.dtsi files have "expected" reg value or an other solution is
to find the kind of endpoint by comparing the endpoint compatible value.

This patch is implementing the more flexible second solution.

Signed-off-by: Arnaud Patard <arnaud.patard@rtp-net.org>

Comments

Kever Yang Sept. 28, 2020, 2:44 a.m. UTC | #1
Add Andy for this patch review.


Thanks,

- Kever

On 2020/9/26 上午2:36, Arnaud Patard (Rtp) wrote:
> The current code is using an hard coded enum and the of node reg value of
> endpoint to find out if the endpoint is mipi/hdmi/lvds/edp/dp. The order
> is different between rk3288, rk3399 vop little, rk3399 vop big.
>
> A possible solution would be to make sure that the rk3288.dtsi and
> rk3399.dtsi files have "expected" reg value or an other solution is
> to find the kind of endpoint by comparing the endpoint compatible value.
>
> This patch is implementing the more flexible second solution.
>
> Signed-off-by: Arnaud Patard <arnaud.patard@rtp-net.org>
>
> Index: u-boot/arch/arm/include/asm/arch-rockchip/vop_rk3288.h
> ===================================================================
> --- u-boot.orig/arch/arm/include/asm/arch-rockchip/vop_rk3288.h
> +++ u-boot/arch/arm/include/asm/arch-rockchip/vop_rk3288.h
> @@ -85,26 +85,13 @@ enum {
>   	LB_RGB_1280X8 = 0x5
>   };
>   
> -#if defined(CONFIG_ROCKCHIP_RK3399)
>   enum vop_modes {
>   	VOP_MODE_EDP = 0,
>   	VOP_MODE_MIPI,
>   	VOP_MODE_HDMI,
> -	VOP_MODE_MIPI1,
> -	VOP_MODE_DP,
> -	VOP_MODE_NONE,
> -};
> -#else
> -enum vop_modes {
> -	VOP_MODE_EDP = 0,
> -	VOP_MODE_HDMI,
>   	VOP_MODE_LVDS,
> -	VOP_MODE_MIPI,
> -	VOP_MODE_NONE,
> -	VOP_MODE_AUTO_DETECT,
> -	VOP_MODE_UNKNOWN,
> +	VOP_MODE_DP,
>   };
> -#endif
>   
>   /* VOP_VERSION_INFO */
>   #define M_FPGA_VERSION (0xffff << 16)
> Index: u-boot/drivers/video/rockchip/rk_vop.c
> ===================================================================
> --- u-boot.orig/drivers/video/rockchip/rk_vop.c
> +++ u-boot/drivers/video/rockchip/rk_vop.c
> @@ -235,12 +235,11 @@ static int rk_display_init(struct udevic
>   	struct clk clk;
>   	enum video_log2_bpp l2bpp;
>   	ofnode remote;
> +	const char *compat;
>   
>   	debug("%s(%s, %lu, %s)\n", __func__,
>   	      dev_read_name(dev), fbbase, ofnode_get_name(ep_node));
>   
> -	vop_id = ofnode_read_s32_default(ep_node, "reg", -1);
> -	debug("vop_id=%d\n", vop_id);
>   	ret = ofnode_read_u32(ep_node, "remote-endpoint", &remote_phandle);
>   	if (ret)
>   		return ret;
> @@ -282,6 +281,28 @@ static int rk_display_init(struct udevic
>   		if (disp)
>   			break;
>   	};
> +	compat = ofnode_get_property(remote, "compatible", NULL);
> +	if (!compat) {
> +		debug("%s(%s): Failed to find compatible property\n",
> +		      __func__, dev_read_name(dev));
> +		return -EINVAL;
> +	}
> +	if (strstr(compat, "edp")) {
> +		vop_id = VOP_MODE_EDP;
> +	} else if (strstr(compat, "mipi")) {
> +		vop_id = VOP_MODE_MIPI;
> +	} else if (strstr(compat, "hdmi")) {
> +		vop_id = VOP_MODE_HDMI;
> +	} else if (strstr(compat, "cdn-dp")) {
> +		vop_id = VOP_MODE_DP;
> +	} else if (strstr(compat, "lvds")) {
> +		vop_id = VOP_MODE_LVDS;
> +	} else {
> +		debug("%s(%s): Failed to find vop mode for %s\n",
> +		      __func__, dev_read_name(dev), compat);
> +		return -EINVAL;
> +	}
> +	debug("vop_id=%d\n", vop_id);
>   
>   	disp_uc_plat = dev_get_uclass_platdata(disp);
>   	debug("Found device '%s', disp_uc_priv=%p\n", disp->name, disp_uc_plat);
>
>
>
>
diff mbox series

Patch

Index: u-boot/arch/arm/include/asm/arch-rockchip/vop_rk3288.h
===================================================================
--- u-boot.orig/arch/arm/include/asm/arch-rockchip/vop_rk3288.h
+++ u-boot/arch/arm/include/asm/arch-rockchip/vop_rk3288.h
@@ -85,26 +85,13 @@  enum {
 	LB_RGB_1280X8 = 0x5
 };
 
-#if defined(CONFIG_ROCKCHIP_RK3399)
 enum vop_modes {
 	VOP_MODE_EDP = 0,
 	VOP_MODE_MIPI,
 	VOP_MODE_HDMI,
-	VOP_MODE_MIPI1,
-	VOP_MODE_DP,
-	VOP_MODE_NONE,
-};
-#else
-enum vop_modes {
-	VOP_MODE_EDP = 0,
-	VOP_MODE_HDMI,
 	VOP_MODE_LVDS,
-	VOP_MODE_MIPI,
-	VOP_MODE_NONE,
-	VOP_MODE_AUTO_DETECT,
-	VOP_MODE_UNKNOWN,
+	VOP_MODE_DP,
 };
-#endif
 
 /* VOP_VERSION_INFO */
 #define M_FPGA_VERSION (0xffff << 16)
Index: u-boot/drivers/video/rockchip/rk_vop.c
===================================================================
--- u-boot.orig/drivers/video/rockchip/rk_vop.c
+++ u-boot/drivers/video/rockchip/rk_vop.c
@@ -235,12 +235,11 @@  static int rk_display_init(struct udevic
 	struct clk clk;
 	enum video_log2_bpp l2bpp;
 	ofnode remote;
+	const char *compat;
 
 	debug("%s(%s, %lu, %s)\n", __func__,
 	      dev_read_name(dev), fbbase, ofnode_get_name(ep_node));
 
-	vop_id = ofnode_read_s32_default(ep_node, "reg", -1);
-	debug("vop_id=%d\n", vop_id);
 	ret = ofnode_read_u32(ep_node, "remote-endpoint", &remote_phandle);
 	if (ret)
 		return ret;
@@ -282,6 +281,28 @@  static int rk_display_init(struct udevic
 		if (disp)
 			break;
 	};
+	compat = ofnode_get_property(remote, "compatible", NULL);
+	if (!compat) {
+		debug("%s(%s): Failed to find compatible property\n",
+		      __func__, dev_read_name(dev));
+		return -EINVAL;
+	}
+	if (strstr(compat, "edp")) {
+		vop_id = VOP_MODE_EDP;
+	} else if (strstr(compat, "mipi")) {
+		vop_id = VOP_MODE_MIPI;
+	} else if (strstr(compat, "hdmi")) {
+		vop_id = VOP_MODE_HDMI;
+	} else if (strstr(compat, "cdn-dp")) {
+		vop_id = VOP_MODE_DP;
+	} else if (strstr(compat, "lvds")) {
+		vop_id = VOP_MODE_LVDS;
+	} else {
+		debug("%s(%s): Failed to find vop mode for %s\n",
+		      __func__, dev_read_name(dev), compat);
+		return -EINVAL;
+	}
+	debug("vop_id=%d\n", vop_id);
 
 	disp_uc_plat = dev_get_uclass_platdata(disp);
 	debug("Found device '%s', disp_uc_priv=%p\n", disp->name, disp_uc_plat);