Extract the code to check for a named mode parameter into its own
function, to streamline the main parsing flow.

Signed-off-by: Geert Uytterhoeven <ge...@linux-m68k.org>
Reviewed-by: Hans de Goede <hdego...@redhat.com>
Acked-by: Thomas Zimmermann <tzimmerm...@suse.de>
---
v2:
  - Add Reviewed-by, Acked-by,
  - Fix length check.
---
 drivers/gpu/drm/drm_modes.c | 40 +++++++++++++++++++++++++++----------
 1 file changed, 29 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c
index 67773740c74c9ba0..a3df18fccb31fa77 100644
--- a/drivers/gpu/drm/drm_modes.c
+++ b/drivers/gpu/drm/drm_modes.c
@@ -1749,6 +1749,29 @@ static const char * const drm_named_modes_whitelist[] = {
        "PAL",
 };
 
+static int drm_mode_parse_cmdline_named_mode(const char *name,
+                                            unsigned int length, bool refresh,
+                                            struct drm_cmdline_mode *mode)
+{
+       unsigned int i;
+       int ret;
+
+       for (i = 0; i < ARRAY_SIZE(drm_named_modes_whitelist); i++) {
+               ret = str_has_prefix(name, drm_named_modes_whitelist[i]);
+               if (ret != length)
+                       continue;
+
+               if (refresh)
+                       return -EINVAL; /* named + refresh is invalid */
+
+               strcpy(mode->name, drm_named_modes_whitelist[i]);
+               mode->specified = true;
+               return 0;
+       }
+
+       return 0;
+}
+
 /**
  * drm_mode_parse_command_line_for_connector - parse command line modeline for 
connector
  * @mode_option: optional per connector mode option
@@ -1785,7 +1808,7 @@ bool drm_mode_parse_command_line_for_connector(const char 
*mode_option,
        const char *bpp_ptr = NULL, *refresh_ptr = NULL, *extra_ptr = NULL;
        const char *options_ptr = NULL;
        char *bpp_end_ptr = NULL, *refresh_end_ptr = NULL;
-       int i, len, ret;
+       int len, ret;
 
        memset(mode, 0, sizeof(*mode));
        mode->panel_orientation = DRM_MODE_PANEL_ORIENTATION_UNKNOWN;
@@ -1823,16 +1846,11 @@ bool drm_mode_parse_command_line_for_connector(const 
char *mode_option,
        }
 
        /* First check for a named mode */
-       for (i = 0; mode_end && i < ARRAY_SIZE(drm_named_modes_whitelist); i++) 
{
-               ret = str_has_prefix(name, drm_named_modes_whitelist[i]);
-               if (ret == mode_end) {
-                       if (refresh_ptr)
-                               return false; /* named + refresh is invalid */
-
-                       strcpy(mode->name, drm_named_modes_whitelist[i]);
-                       mode->specified = true;
-                       break;
-               }
+       if (mode_end) {
+               ret = drm_mode_parse_cmdline_named_mode(name, mode_end,
+                                                       refresh_ptr, mode);
+               if (ret)
+                       return false;
        }
 
        /* No named mode? Check for a normal mode argument, e.g. 1024x768 */
-- 
2.25.1

Reply via email to