3G dongle support
[firefly-linux-kernel-4.4.55.git] / kernel / params.c
index 7ab388a48a2eb2eb60551cc8a56dc748a429dae0..c29d12381213adbd7db10754e8bf08847071b284 100644 (file)
@@ -217,6 +217,48 @@ int parse_args(const char *name,
        return 0;
 }
 
+#ifdef CONFIG_RK_CONFIG
+static int ignore_unknown(char *param, char *val)
+{
+       return 0;
+}
+
+int module_parse_kernel_cmdline(const char *name, const struct kernel_param *params, unsigned num)
+{
+       int ret;
+       unsigned i;
+       size_t name_len = strlen(name);
+       struct kernel_param new_params[num];
+       char args[strlen(saved_command_line) + 1];
+
+       if (!num)
+               return 0;
+
+       strcpy(args, saved_command_line);
+       memcpy(new_params, params, sizeof(struct kernel_param) * num);
+
+       for (i = 0; i < num; i++)
+               new_params[i].name = NULL;
+       for (i = 0; i < num; i++) {
+               char *new_name = kmalloc(strlen(params[i].name) + name_len + 2, GFP_KERNEL);
+               if (!new_name) {
+                       ret = -ENOMEM;
+                       goto out;
+               }
+               sprintf(new_name, "%s.%s", name, params[i].name);
+               new_params[i].name = new_name;
+       }
+
+       ret = parse_args(name, args, new_params, num, ignore_unknown);
+
+out:
+       for (i = 0; i < num; i++)
+               if (new_params[i].name)
+                       kfree(new_params[i].name);
+       return ret;
+}
+#endif
+
 /* Lazy bastard, eh? */
 #define STANDARD_PARAM_DEF(name, type, format, tmptype, strtolfn)              \
        int param_set_##name(const char *val, const struct kernel_param *kp) \
@@ -297,21 +339,15 @@ EXPORT_SYMBOL(param_ops_charp);
 int param_set_bool(const char *val, const struct kernel_param *kp)
 {
        bool v;
+       int ret;
 
        /* No equals means "set"... */
        if (!val) val = "1";
 
        /* One of =[yYnN01] */
-       switch (val[0]) {
-       case 'y': case 'Y': case '1':
-               v = true;
-               break;
-       case 'n': case 'N': case '0':
-               v = false;
-               break;
-       default:
-               return -EINVAL;
-       }
+       ret = strtobool(val, &v);
+       if (ret)
+               return ret;
 
        if (kp->flags & KPARAM_ISBOOL)
                *(bool *)kp->arg = v;
@@ -821,15 +857,18 @@ ssize_t __modver_version_show(struct module_attribute *mattr,
        return sprintf(buf, "%s\n", vattr->version);
 }
 
-extern struct module_version_attribute __start___modver[], __stop___modver[];
+extern const struct module_version_attribute *__start___modver[];
+extern const struct module_version_attribute *__stop___modver[];
 
 static void __init version_sysfs_builtin(void)
 {
-       const struct module_version_attribute *vattr;
+       const struct module_version_attribute **p;
        struct module_kobject *mk;
        int err;
 
-       for (vattr = __start___modver; vattr < __stop___modver; vattr++) {
+       for (p = __start___modver; p < __stop___modver; p++) {
+               const struct module_version_attribute *vattr = *p;
+
                mk = locate_module_kobject(vattr->module_name);
                if (mk) {
                        err = sysfs_create_file(&mk->kobj, &vattr->mattr.attr);