diff options
author | Hans de Goede <hdegoede@redhat.com> | 2014-12-19 13:27:46 (GMT) |
---|---|---|
committer | Hans de Goede <hdegoede@redhat.com> | 2015-01-14 13:56:38 (GMT) |
commit | eb3c0cf8069a004512aac23d85c87c2ee348f8cd (patch) | |
tree | b73c86b484deb7302d3c37badc51b511dc4bf4f3 | |
parent | e976b868f2f77eddf7f61d52dfe2a23075ae272d (diff) | |
download | u-boot-eb3c0cf8069a004512aac23d85c87c2ee348f8cd.tar.xz |
videomodes: Add helper functions to parse video-mode env-var extra options
Add 2 helper functions to get strings, respectively integers from the options
value returned by video_get_video_mode() / video_get_ctfb_res_modes().
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Acked-by: Anatolij Gustschin <agust@denx.de>
-rw-r--r-- | drivers/video/videomodes.c | 60 | ||||
-rw-r--r-- | drivers/video/videomodes.h | 5 |
2 files changed, 64 insertions, 1 deletions
diff --git a/drivers/video/videomodes.c b/drivers/video/videomodes.c index 45ccb36..40c3315 100644 --- a/drivers/video/videomodes.c +++ b/drivers/video/videomodes.c @@ -113,7 +113,7 @@ const struct ctfb_res_modes res_mode_init[RES_MODES_COUNT] = { * returns the length to the next seperator */ static int -video_get_param_len (char *start, char sep) +video_get_param_len(const char *start, char sep) { int i = 0; while ((*start != 0) && (*start != sep)) { @@ -315,3 +315,61 @@ void video_get_ctfb_res_modes(int default_mode, unsigned int default_depth, xres, yres, depth, refresh, (*mode_ret)->xres, (*mode_ret)->yres, *depth_ret, (*mode_ret)->refresh); } + +/* + * Find the named string option within the ',' separated options string, and + * store its value in dest. + * + * @options: ',' separated options string + * @name: name of the option to look for + * @dest: destination buffer to store the value of the option in + * @dest_len: length of dest + * @def: value to store in dest if the option is not present in options + */ +void video_get_option_string(const char *options, const char *name, + char *dest, int dest_len, const char *def) +{ + const char *p = options; + const int name_len = strlen(name); + int i, len; + + while (p && (i = video_get_param_len(p, ',')) != 0) { + if (strncmp(p, name, name_len) == 0 && p[name_len] == '=') { + len = i - (name_len + 1); + if (len >= dest_len) + len = dest_len - 1; + memcpy(dest, &p[name_len + 1], len); + dest[len] = 0; + return; + } + p += i; + if (*p != 0) + p++; /* skip ',' */ + } + strcpy(dest, def); +} + +/* + * Find the named integer option within the ',' separated options string, and + * return its value. + * + * @options: ',' separated options string + * @name: name of the option to look for + * @def: value to return if the option is not present in options + */ +int video_get_option_int(const char *options, const char *name, int def) +{ + const char *p = options; + const int name_len = strlen(name); + int i; + + while (p && (i = video_get_param_len(p, ',')) != 0) { + if (strncmp(p, name, name_len) == 0 && p[name_len] == '=') + return simple_strtoul(&p[name_len + 1], NULL, 10); + + p += i; + if (*p != 0) + p++; /* skip ',' */ + } + return def; +} diff --git a/drivers/video/videomodes.h b/drivers/video/videomodes.h index 02419cd..047b8a9 100644 --- a/drivers/video/videomodes.h +++ b/drivers/video/videomodes.h @@ -84,3 +84,8 @@ void video_get_ctfb_res_modes(int default_mode, unsigned int default_depth, const struct ctfb_res_modes **mode_ret, unsigned int *depth_ret, const char **options); + +void video_get_option_string(const char *options, const char *name, + char *dest, int dest_len, const char *def); + +int video_get_option_int(const char *options, const char *name, int def); |