Eliminate string comparison from the video mode search.

Signed-off-by: Aaro Koskinen <[email protected]>
---
 drivers/staging/xgifb/XGI_main_26.c |   27 +++++++++++++++++----------
 1 files changed, 17 insertions(+), 10 deletions(-)

diff --git a/drivers/staging/xgifb/XGI_main_26.c 
b/drivers/staging/xgifb/XGI_main_26.c
index a10d60e..e40a29e 100644
--- a/drivers/staging/xgifb/XGI_main_26.c
+++ b/drivers/staging/xgifb/XGI_main_26.c
@@ -391,19 +391,26 @@ static int XGIfb_GetXG21DefaultLVDSModeIdx(struct 
xgifb_video_info *xgifb_info)
 static void XGIfb_search_mode(struct xgifb_video_info *xgifb_info,
                              const char *name)
 {
-       int i = 0, j = 0, l;
+       unsigned int xres;
+       unsigned int yres;
+       unsigned int bpp;
+       int i;
 
-       while (XGIbios_mode[i].mode_no != 0) {
-               l = min(strlen(name), strlen(XGIbios_mode[i].name));
-               if (!strncmp(name, XGIbios_mode[i].name, l)) {
+       if (sscanf(name, "%ux%ux%u", &xres, &yres, &bpp) != 3)
+               goto invalid_mode;
+
+       if (bpp == 24)
+               bpp = 32; /* That's for people who mix up color and fb depth. */
+
+       for (i = 0; XGIbios_mode[i].mode_no != 0; i++)
+               if (XGIbios_mode[i].xres == xres &&
+                   XGIbios_mode[i].yres == yres &&
+                   XGIbios_mode[i].bpp == bpp) {
                        xgifb_info->mode_idx = i;
-                       j = 1;
-                       break;
+                       return;
                }
-               i++;
-       }
-       if (!j)
-               pr_info("Invalid mode '%s'\n", name);
+invalid_mode:
+       pr_info("Invalid mode '%s'\n", name);
 }
 
 static void XGIfb_search_vesamode(struct xgifb_video_info *xgifb_info,
-- 
1.7.2.5

_______________________________________________
devel mailing list
[email protected]
http://driverdev.linuxdriverproject.org/mailman/listinfo/devel

Reply via email to