Message ID | 20240102154654.191055-2-macroalpha82@gmail.com |
---|---|
State | Accepted |
Commit | 4913ce37c4400e44598a8dfe2162f4351c4c025e |
Delegated to: | Kever Yang |
Headers | show |
Series | Add Additional Boards and Features to RGxx3 | expand |
On 2024/1/2 23:46, Chris Morgan wrote: > From: Chris Morgan <macromorgan@hotmail.com> > > Make the inability to detect a panel using the auto detection code not > fail the entire boot process. This means that if the panel ID cannot > be read we don't set an environment variable for the panel, and if an > environment variable for the panel is not set we don't attempt to > update the compatible string. Changes to the code also ensure that > when there are multiple compatible strings required for the panel > we use them both, which solves some issues that will pop up soon > for the Linux driver. > > Signed-off-by: Chris Morgan <macromorgan@hotmail.com> Reviewed-by: Kever Yang <kever.yang@rock-chips.com> Thanks, - Kever > --- > board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c | 115 +++++++++++++-------- > 1 file changed, 74 insertions(+), 41 deletions(-) > > diff --git a/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c b/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c > index 3f1a42d184..3d0c614623 100644 > --- a/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c > +++ b/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c > @@ -40,6 +40,7 @@ struct rg3xx_model { > const char *board; > const char *board_name; > const char *fdtfile; > + const bool detect_panel; > }; > > enum rgxx3_device_id { > @@ -54,52 +55,67 @@ enum rgxx3_device_id { > > static const struct rg3xx_model rg3xx_model_details[] = { > [RG353M] = { > - 517, /* Observed average from device */ > - "rk3566-anbernic-rg353m", > - "RG353M", > - DTB_DIR "rk3566-anbernic-rg353p.dtb", /* Identical devices */ > + .adc_value = 517, /* Observed average from device */ > + .board = "rk3566-anbernic-rg353m", > + .board_name = "RG353M", > + /* Device is identical to RG353P. */ > + .fdtfile = DTB_DIR "rk3566-anbernic-rg353p.dtb", > + .detect_panel = 1, > }, > [RG353P] = { > - 860, /* Documented value of 860 */ > - "rk3566-anbernic-rg353p", > - "RG353P", > - DTB_DIR "rk3566-anbernic-rg353p.dtb", > + .adc_value = 860, /* Documented value of 860 */ > + .board = "rk3566-anbernic-rg353p", > + .board_name = "RG353P", > + .fdtfile = DTB_DIR "rk3566-anbernic-rg353p.dtb", > + .detect_panel = 1, > }, > [RG353V] = { > - 695, /* Observed average from device */ > - "rk3566-anbernic-rg353v", > - "RG353V", > - DTB_DIR "rk3566-anbernic-rg353v.dtb", > + .adc_value = 695, /* Observed average from device */ > + .board = "rk3566-anbernic-rg353v", > + .board_name = "RG353V", > + .fdtfile = DTB_DIR "rk3566-anbernic-rg353v.dtb", > + .detect_panel = 1, > }, > [RG503] = { > - 1023, /* Observed average from device */ > - "rk3566-anbernic-rg503", > - "RG503", > - DTB_DIR "rk3566-anbernic-rg503.dtb", > + .adc_value = 1023, /* Observed average from device */ > + .board = "rk3566-anbernic-rg503", > + .board_name = "RG503", > + .fdtfile = DTB_DIR "rk3566-anbernic-rg503.dtb", > + .detect_panel = 0, > }, > /* Devices with duplicate ADC value */ > [RG353PS] = { > - 860, /* Observed average from device */ > - "rk3566-anbernic-rg353ps", > - "RG353PS", > - DTB_DIR "rk3566-anbernic-rg353ps.dtb", > + .adc_value = 860, /* Observed average from device */ > + .board = "rk3566-anbernic-rg353ps", > + .board_name = "RG353PS", > + .fdtfile = DTB_DIR "rk3566-anbernic-rg353ps.dtb", > + .detect_panel = 1, > }, > [RG353VS] = { > - 695, /* Gathered from second hand information */ > - "rk3566-anbernic-rg353vs", > - "RG353VS", > - DTB_DIR "rk3566-anbernic-rg353vs.dtb", > + .adc_value = 695, /* Gathered from second hand information */ > + .board = "rk3566-anbernic-rg353vs", > + .board_name = "RG353VS", > + .fdtfile = DTB_DIR "rk3566-anbernic-rg353vs.dtb", > + .detect_panel = 1, > }, > }; > > struct rg353_panel { > const u16 id; > - const char *panel_compat; > + const char *panel_compat[2]; > }; > > static const struct rg353_panel rg353_panel_details[] = { > - { .id = 0x3052, .panel_compat = "newvision,nv3051d"}, > - { .id = 0x3821, .panel_compat = "anbernic,rg353v-panel-v2"}, > + { > + .id = 0x3052, > + .panel_compat[0] = "anbernic,rg353p-panel", > + .panel_compat[1] = "newvision,nv3051d", > + }, > + { > + .id = 0x3821, > + .panel_compat[0] = "anbernic,rg353v-panel-v2", > + .panel_compat[1] = NULL, > + }, > }; > > /* > @@ -298,11 +314,10 @@ int rgxx3_detect_display(void) > if (!panel) { > printf("Unable to identify panel_id %x\n", > (panel_id[0] << 8) | panel_id[1]); > - env_set("panel", "unknown"); > return -EINVAL; > } > > - env_set("panel", panel->panel_compat); > + env_set("panel", panel->panel_compat[0]); > > return 0; > } > @@ -367,13 +382,14 @@ int rgxx3_detect_device(void) > rg3xx_model_details[board_id].board_name); > env_set("fdtfile", rg3xx_model_details[board_id].fdtfile); > > - /* Detect the panel type for any device that isn't a 503. */ > - if (board_id == RG503) > + /* Skip panel detection for when it is not needed. */ > + if (!rg3xx_model_details[board_id].detect_panel) > return 0; > > + /* Warn but don't fail for errors in auto-detection of the panel. */ > ret = rgxx3_detect_display(); > if (ret) > - return ret; > + printf("Failed to detect panel type\n"); > > return 0; > } > @@ -400,7 +416,8 @@ int rk_board_late_init(void) > > int ft_board_setup(void *blob, struct bd_info *bd) > { > - int node, ret; > + const struct rg353_panel *panel = NULL; > + int node, ret, i; > char *env; > > /* No fixups necessary for the RG503 */ > @@ -414,6 +431,12 @@ int ft_board_setup(void *blob, struct bd_info *bd) > rg3xx_model_details[RG353M].board_name, > sizeof(rg3xx_model_details[RG353M].board_name)); > > + env = env_get("panel"); > + if (!env) { > + printf("Can't get panel env\n"); > + return 0; > + } > + > /* > * Check if the environment variable doesn't equal the panel. > * If it doesn't, update the devicetree to the correct panel. > @@ -424,12 +447,6 @@ int ft_board_setup(void *blob, struct bd_info *bd) > return -ENODEV; > } > > - env = env_get("panel"); > - if (!env) { > - printf("Can't get panel env\n"); > - return -ENODEV; > - } > - > ret = fdt_node_check_compatible(blob, node, env); > if (ret < 0) > return -ENODEV; > @@ -438,8 +455,24 @@ int ft_board_setup(void *blob, struct bd_info *bd) > if (!ret) > return 0; > > - do_fixup_by_path_string(blob, "/dsi@fe060000/panel@0", > - "compatible", env); > + /* Panels don't match, search by first compatible value. */ > + for (i = 0; i < ARRAY_SIZE(rg353_panel_details); i++) { > + if (!strcmp(env, rg353_panel_details[i].panel_compat[0])) { > + panel = &rg353_panel_details[i]; > + break; > + } > + } > + > + if (!panel) { > + printf("Unable to identify panel by compat string\n"); > + return -ENODEV; > + } > + > + /* Set the compatible with the auto-detected values */ > + fdt_setprop_string(blob, node, "compatible", panel->panel_compat[0]); > + if (panel->panel_compat[1]) > + fdt_appendprop_string(blob, node, "compatible", > + panel->panel_compat[1]); > > return 0; > }
diff --git a/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c b/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c index 3f1a42d184..3d0c614623 100644 --- a/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c +++ b/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c @@ -40,6 +40,7 @@ struct rg3xx_model { const char *board; const char *board_name; const char *fdtfile; + const bool detect_panel; }; enum rgxx3_device_id { @@ -54,52 +55,67 @@ enum rgxx3_device_id { static const struct rg3xx_model rg3xx_model_details[] = { [RG353M] = { - 517, /* Observed average from device */ - "rk3566-anbernic-rg353m", - "RG353M", - DTB_DIR "rk3566-anbernic-rg353p.dtb", /* Identical devices */ + .adc_value = 517, /* Observed average from device */ + .board = "rk3566-anbernic-rg353m", + .board_name = "RG353M", + /* Device is identical to RG353P. */ + .fdtfile = DTB_DIR "rk3566-anbernic-rg353p.dtb", + .detect_panel = 1, }, [RG353P] = { - 860, /* Documented value of 860 */ - "rk3566-anbernic-rg353p", - "RG353P", - DTB_DIR "rk3566-anbernic-rg353p.dtb", + .adc_value = 860, /* Documented value of 860 */ + .board = "rk3566-anbernic-rg353p", + .board_name = "RG353P", + .fdtfile = DTB_DIR "rk3566-anbernic-rg353p.dtb", + .detect_panel = 1, }, [RG353V] = { - 695, /* Observed average from device */ - "rk3566-anbernic-rg353v", - "RG353V", - DTB_DIR "rk3566-anbernic-rg353v.dtb", + .adc_value = 695, /* Observed average from device */ + .board = "rk3566-anbernic-rg353v", + .board_name = "RG353V", + .fdtfile = DTB_DIR "rk3566-anbernic-rg353v.dtb", + .detect_panel = 1, }, [RG503] = { - 1023, /* Observed average from device */ - "rk3566-anbernic-rg503", - "RG503", - DTB_DIR "rk3566-anbernic-rg503.dtb", + .adc_value = 1023, /* Observed average from device */ + .board = "rk3566-anbernic-rg503", + .board_name = "RG503", + .fdtfile = DTB_DIR "rk3566-anbernic-rg503.dtb", + .detect_panel = 0, }, /* Devices with duplicate ADC value */ [RG353PS] = { - 860, /* Observed average from device */ - "rk3566-anbernic-rg353ps", - "RG353PS", - DTB_DIR "rk3566-anbernic-rg353ps.dtb", + .adc_value = 860, /* Observed average from device */ + .board = "rk3566-anbernic-rg353ps", + .board_name = "RG353PS", + .fdtfile = DTB_DIR "rk3566-anbernic-rg353ps.dtb", + .detect_panel = 1, }, [RG353VS] = { - 695, /* Gathered from second hand information */ - "rk3566-anbernic-rg353vs", - "RG353VS", - DTB_DIR "rk3566-anbernic-rg353vs.dtb", + .adc_value = 695, /* Gathered from second hand information */ + .board = "rk3566-anbernic-rg353vs", + .board_name = "RG353VS", + .fdtfile = DTB_DIR "rk3566-anbernic-rg353vs.dtb", + .detect_panel = 1, }, }; struct rg353_panel { const u16 id; - const char *panel_compat; + const char *panel_compat[2]; }; static const struct rg353_panel rg353_panel_details[] = { - { .id = 0x3052, .panel_compat = "newvision,nv3051d"}, - { .id = 0x3821, .panel_compat = "anbernic,rg353v-panel-v2"}, + { + .id = 0x3052, + .panel_compat[0] = "anbernic,rg353p-panel", + .panel_compat[1] = "newvision,nv3051d", + }, + { + .id = 0x3821, + .panel_compat[0] = "anbernic,rg353v-panel-v2", + .panel_compat[1] = NULL, + }, }; /* @@ -298,11 +314,10 @@ int rgxx3_detect_display(void) if (!panel) { printf("Unable to identify panel_id %x\n", (panel_id[0] << 8) | panel_id[1]); - env_set("panel", "unknown"); return -EINVAL; } - env_set("panel", panel->panel_compat); + env_set("panel", panel->panel_compat[0]); return 0; } @@ -367,13 +382,14 @@ int rgxx3_detect_device(void) rg3xx_model_details[board_id].board_name); env_set("fdtfile", rg3xx_model_details[board_id].fdtfile); - /* Detect the panel type for any device that isn't a 503. */ - if (board_id == RG503) + /* Skip panel detection for when it is not needed. */ + if (!rg3xx_model_details[board_id].detect_panel) return 0; + /* Warn but don't fail for errors in auto-detection of the panel. */ ret = rgxx3_detect_display(); if (ret) - return ret; + printf("Failed to detect panel type\n"); return 0; } @@ -400,7 +416,8 @@ int rk_board_late_init(void) int ft_board_setup(void *blob, struct bd_info *bd) { - int node, ret; + const struct rg353_panel *panel = NULL; + int node, ret, i; char *env; /* No fixups necessary for the RG503 */ @@ -414,6 +431,12 @@ int ft_board_setup(void *blob, struct bd_info *bd) rg3xx_model_details[RG353M].board_name, sizeof(rg3xx_model_details[RG353M].board_name)); + env = env_get("panel"); + if (!env) { + printf("Can't get panel env\n"); + return 0; + } + /* * Check if the environment variable doesn't equal the panel. * If it doesn't, update the devicetree to the correct panel. @@ -424,12 +447,6 @@ int ft_board_setup(void *blob, struct bd_info *bd) return -ENODEV; } - env = env_get("panel"); - if (!env) { - printf("Can't get panel env\n"); - return -ENODEV; - } - ret = fdt_node_check_compatible(blob, node, env); if (ret < 0) return -ENODEV; @@ -438,8 +455,24 @@ int ft_board_setup(void *blob, struct bd_info *bd) if (!ret) return 0; - do_fixup_by_path_string(blob, "/dsi@fe060000/panel@0", - "compatible", env); + /* Panels don't match, search by first compatible value. */ + for (i = 0; i < ARRAY_SIZE(rg353_panel_details); i++) { + if (!strcmp(env, rg353_panel_details[i].panel_compat[0])) { + panel = &rg353_panel_details[i]; + break; + } + } + + if (!panel) { + printf("Unable to identify panel by compat string\n"); + return -ENODEV; + } + + /* Set the compatible with the auto-detected values */ + fdt_setprop_string(blob, node, "compatible", panel->panel_compat[0]); + if (panel->panel_compat[1]) + fdt_appendprop_string(blob, node, "compatible", + panel->panel_compat[1]); return 0; }