rk: add module parse kernel cmdline support
author黄涛 <huangtao@rock-chips.com>
Mon, 24 Sep 2012 03:22:25 +0000 (11:22 +0800)
committer黄涛 <huangtao@rock-chips.com>
Mon, 24 Sep 2012 03:30:48 +0000 (11:30 +0800)
kernel/module.c
kernel/params.c

index a0dbb8cc07056d297d15165f7e3537c12c034886..298f613757911307ad851a048021792fe2785d0e 100644 (file)
@@ -2827,6 +2827,13 @@ static struct module *load_module(void __user *umod,
        list_add_rcu(&mod->list, &modules);
        mutex_unlock(&module_mutex);
 
+#ifdef CONFIG_RK_CONFIG
+{
+       extern int module_parse_kernel_cmdline(const char *name, const struct kernel_param *params, unsigned num);
+       module_parse_kernel_cmdline(mod->name, mod->kp, mod->num_kp);
+}
+#endif
+
        /* Module is ready to execute: parsing args may do that. */
        err = parse_args(mod->name, mod->args, mod->kp, mod->num_kp, NULL);
        if (err < 0)
index ed72e1330862d265e4276669830ec3f6b26c7d0d..ce0b0a80bc69b1956fb162551df8620a11a329d1 100644 (file)
@@ -217,6 +217,43 @@ int parse_args(const char *name,
        return 0;
 }
 
+#ifdef CONFIG_RK_CONFIG
+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, NULL);
+
+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) \