[PATCH v2 012/101] fbdev/aty: Parse option string with struct option_iter
From: Thomas Zimmermann <tzimmermann@suse.de>
Date: 2023-03-09 16:04:16
Also in:
dri-devel, lkml
Subsystem:
framebuffer layer, radeon framebuffer display driver, rage128 framebuffer display driver, the rest · Maintainers:
Helge Deller, Benjamin Herrenschmidt, Linus Torvalds
Use struct option_iter to walk over the individual options in the driver's option string. Replaces the hand-written strsep() loop with a clean interface. The helpers for struct option_iter handle empty option strings and empty options transparently. The struct's _init and _release functions duplicate and release the option string's memory buffer as needed. Done in preparation of constifying the option string. Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> --- drivers/video/fbdev/aty/aty128fb.c | 12 ++++++++---- drivers/video/fbdev/aty/atyfb_base.c | 12 ++++++++---- drivers/video/fbdev/aty/radeon_base.c | 15 ++++++++------- 3 files changed, 24 insertions(+), 15 deletions(-)
diff --git a/drivers/video/fbdev/aty/aty128fb.c b/drivers/video/fbdev/aty/aty128fb.c
index 0e725a6eb40b..ee2be122de2d 100644
--- a/drivers/video/fbdev/aty/aty128fb.c
+++ b/drivers/video/fbdev/aty/aty128fb.c@@ -48,6 +48,7 @@ #include <linux/aperture.h> +#include <linux/cmdline.h> #include <linux/module.h> #include <linux/moduleparam.h> #include <linux/kernel.h>
@@ -1674,14 +1675,14 @@ static int aty128fb_sync(struct fb_info *info) } #ifndef MODULE -static int aty128fb_setup(char *options) +static int aty128fb_setup(const char *options) { + struct option_iter iter; char *this_opt; - if (!options || !*options) - return 0; + option_iter_init(&iter, options); - while ((this_opt = strsep(&options, ",")) != NULL) { + while (option_iter_next(&iter, &this_opt)) { if (!strncmp(this_opt, "lcd:", 4)) { default_lcd_on = simple_strtoul(this_opt+4, NULL, 0); continue;
@@ -1730,6 +1731,9 @@ static int aty128fb_setup(char *options) mode_option = mode_option_buf; } } + + option_iter_release(&iter); + return 0; } #endif /* MODULE */
diff --git a/drivers/video/fbdev/aty/atyfb_base.c b/drivers/video/fbdev/aty/atyfb_base.c
index d83b3dae795b..f4b22d2f0d3d 100644
--- a/drivers/video/fbdev/aty/atyfb_base.c
+++ b/drivers/video/fbdev/aty/atyfb_base.c@@ -49,6 +49,7 @@ ******************************************************************************/ #include <linux/aperture.h> +#include <linux/cmdline.h> #include <linux/compat.h> #include <linux/module.h> #include <linux/moduleparam.h>
@@ -3832,14 +3833,14 @@ static struct pci_driver atyfb_driver = { #endif /* CONFIG_PCI */ #ifndef MODULE -static int __init atyfb_setup(char *options) +static int __init atyfb_setup(const char *options) { + struct option_iter iter; char *this_opt; - if (!options || !*options) - return 0; + option_iter_init(&iter, options); - while ((this_opt = strsep(&options, ",")) != NULL) { + while (option_iter_next(&iter, &this_opt)) { if (!strncmp(this_opt, "noaccel", 7)) { noaccel = true; } else if (!strncmp(this_opt, "nomtrr", 6)) {
@@ -3903,6 +3904,9 @@ static int __init atyfb_setup(char *options) mode = mode_buf; } } + + option_iter_release(&iter); + return 0; } #endif /* MODULE */
diff --git a/drivers/video/fbdev/aty/radeon_base.c b/drivers/video/fbdev/aty/radeon_base.c
index dc2657ae96f2..975323e82f52 100644
--- a/drivers/video/fbdev/aty/radeon_base.c
+++ b/drivers/video/fbdev/aty/radeon_base.c@@ -55,6 +55,7 @@ #include "radeonfb.h" #include <linux/aperture.h> +#include <linux/cmdline.h> #include <linux/module.h> #include <linux/moduleparam.h> #include <linux/kernel.h>
@@ -2562,17 +2563,14 @@ static struct pci_driver radeonfb_driver = { }; #ifndef MODULE -static int __init radeonfb_setup (char *options) +static int __init radeonfb_setup (const char *options) { + struct option_iter iter; char *this_opt; - if (!options || !*options) - return 0; - - while ((this_opt = strsep (&options, ",")) != NULL) { - if (!*this_opt) - continue; + option_iter_init(&iter, options); + while (option_iter_next(&iter, &this_opt)) { if (!strncmp(this_opt, "noaccel", 7)) { noaccel = 1; } else if (!strncmp(this_opt, "mirror", 6)) {
@@ -2603,6 +2601,9 @@ static int __init radeonfb_setup (char *options) mode_option = mode_option_buf; } } + + option_iter_release(&iter); + return 0; } #endif /* MODULE */
--
2.39.2