From ae97b71b7a2387d1eadd6398e63769dc1b8a4374 Mon Sep 17 00:00:00 2001 From: Zhibin Huang Date: Sun, 4 Feb 2024 07:20:21 +0000 Subject: [PATCH] misc: rk628: optimize input and output mode information 1. Fixed the issue where the log displays input and output mode information abnormally in some scenarios. 2. The input and output mode information of log and summary are obtained from the same function to facilitate later maintenance. Type: Fix Redmine ID: N/A Associated modifications: N/A Test: dmesg | grep "rk628.*input_mode.*output_mode" cat /sys/kernel/debug/rk628/2-0050/summary Signed-off-by: Zhibin Huang Change-Id: I9c4549d1673417701dc929432b96fa802632e63c --- drivers/misc/rk628/rk628.c | 137 +++++++++++++------------------------ 1 file changed, 49 insertions(+), 88 deletions(-) diff --git a/drivers/misc/rk628/rk628.c b/drivers/misc/rk628/rk628.c index ac3387c5437c..a2781653a3c7 100644 --- a/drivers/misc/rk628/rk628.c +++ b/drivers/misc/rk628/rk628.c @@ -672,49 +672,56 @@ static bool rk628_display_route_check(struct rk628 *rk628) return true; } -static void rk628_final_display_route(struct rk628 *rk628) +static void rk628_current_display_route(struct rk628 *rk628, char *input_s, + int input_s_len, char *output_s, + int output_s_len) { - char *input = NULL; - char *output = NULL; - char buf[20]; + *input_s = '\0'; + *output_s = '\0'; - if (rk628_input_is_hdmi(rk628)) - input = "hdmi"; + if (rk628_input_is_rgb(rk628)) + strlcat(input_s, "RGB", input_s_len); else if (rk628_input_is_bt1120(rk628)) - input = "bt1120"; + strlcat(input_s, "BT1120", input_s_len); + else if (rk628_input_is_hdmi(rk628)) + strlcat(input_s, "HDMI", input_s_len); else - input = "rgb"; + strlcat(input_s, "unknown", input_s_len); + + if (rk628_output_is_rgb(rk628)) + strlcat(output_s, "RGB ", output_s_len); + + if (rk628_output_is_bt1120(rk628)) + strlcat(output_s, "BT1120 ", output_s_len); if (rk628_output_is_gvi(rk628)) - output = "gvi"; - else if (rk628_output_is_lvds(rk628)) - output = "lvds"; - else if (rk628_output_is_dsi(rk628)) - output = "dsi"; - else if (rk628_output_is_csi(rk628)) - output = "csi"; + strlcat(output_s, "GVI ", output_s_len); - if (rk628_output_is_bt1120(rk628)) { - if (output) - sprintf(buf, "%s & %s", output, "bt1120"); - else - output = "bt1120"; - } else if (rk628_output_is_rgb(rk628)) { - if (output) - sprintf(buf, "%s & %s", output, "rgb"); - else - output = "rgb"; - } + if (rk628_output_is_lvds(rk628)) + strncat(output_s, "LVDS ", output_s_len); - if (rk628_output_is_hdmi(rk628)) { - if (output) - sprintf(buf, "%s & %s", output, "hdmi"); - else - output = "hdmi"; - } + if (rk628_output_is_dsi(rk628)) + strlcat(output_s, "DSI ", output_s_len); - dev_info(rk628->dev, "input_mode:%s output_mode:%s\n", input, - hweight32(rk628->output_mode) > 1 ? buf : output); + if (rk628_output_is_csi(rk628)) + strlcat(output_s, "CSI ", output_s_len); + + if (rk628_output_is_hdmi(rk628)) + strlcat(output_s, "HDMI ", output_s_len); + + if (!strlen(output_s)) + strlcat(output_s, "unknown", output_s_len); +} + +static void rk628_show_current_display_route(struct rk628 *rk628) +{ + char input_s[10], output_s[30]; + + rk628_current_display_route(rk628, input_s, sizeof(input_s), + output_s, sizeof(output_s)); + + dev_info(rk628->dev, "input_mode: %s, output_mode: %s\n", input_s, + output_s); } static int rk628_display_route_info_parse(struct rk628 *rk628) @@ -889,25 +896,6 @@ static int rk628_display_timings_get(struct rk628 *rk628) pr_info(args); \ } while (0) -static void rk628_show_input_mode(struct seq_file *s) -{ - struct rk628 *rk628 = s->private; - char input_s[10] = {0}; - - /* show input mode */ - if (rk628_input_is_hdmi(rk628)) - strcpy(input_s, "HDMI"); - else if (rk628_input_is_bt1120(rk628)) - strcpy(input_s, "BT1120"); - else if (rk628_input_is_rgb(rk628)) - strcpy(input_s, "RGB"); - - if (!strlen(input_s)) - strcpy(input_s, "unknown "); - - DEBUG_PRINT("input: %s\n", input_s); -} - static void rk628_show_resolution(struct seq_file *s) { struct rk628 *rk628 = s->private; @@ -1005,38 +993,6 @@ static void rk628_show_input_resolution(struct seq_file *s) rk628_show_resolution(s); } -static void rk628_show_output_mode(struct seq_file *s) -{ - struct rk628 *rk628 = s->private; - char output_s[30] = {0}; - char *p = output_s; - - if (rk628_output_is_gvi(rk628)) - strcpy(p, "GVI "); - else if (rk628_output_is_lvds(rk628)) - strcpy(p, "LVDS "); - else if (rk628_output_is_dsi(rk628)) - strcpy(p, "DSI "); - else if (rk628_output_is_csi(rk628)) - strcpy(p, "CSI "); - p += strlen(p); - - if (rk628_output_is_hdmi(rk628)) { - strcpy(p, "HDMI "); - p += strlen(p); - } - - if (rk628_output_is_rgb(rk628)) - strcpy(p, "RGB "); - else if (rk628_output_is_bt1120(rk628)) - strcpy(p, "BT1120 "); - - if (!strlen(output_s)) - strcpy(p, "unknown "); - - DEBUG_PRINT("output: %s\n", output_s); -} - static void rk628_show_output_resolution(struct seq_file *s) { struct rk628 *rk628 = s->private; @@ -1147,16 +1103,20 @@ static void rk628_show_csc_info(struct seq_file *s) static int rk628_debugfs_dump(struct seq_file *s, void *data) { struct rk628 *rk628 = s->private; + char input_s[10], output_s[30]; u32 val; int sw_hsync_pol, sw_vsync_pol; u32 dsp_frame_v_start, dsp_frame_h_start; + rk628_current_display_route(rk628, input_s, sizeof(input_s), + output_s, sizeof(output_s)); + /* show input info */ - rk628_show_input_mode(s); + DEBUG_PRINT("input: %s\n", input_s); rk628_show_input_resolution(s); /* show output info */ - rk628_show_output_mode(s); + DEBUG_PRINT("output: %s\n", output_s); rk628_show_output_resolution(s); /* show csc info */ @@ -1453,13 +1413,14 @@ rk628_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) if (ret) goto err_clk; + rk628_show_current_display_route(rk628); + if (!rk628_display_route_check(rk628)) { dev_err(dev, "display route check err\n"); ret = -EINVAL; goto err_clk; } - rk628_final_display_route(rk628); rk628_pwr_consumption_init(rk628); #ifdef CONFIG_FB