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@xxxxxxx> --- 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