Merge tag 'pinctrl' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux...
[pandora-kernel.git] / kernel / params.c
index 65aae11..4bc965d 100644 (file)
 #include <linux/slab.h>
 #include <linux/ctype.h>
 
-#if 0
-#define DEBUGP printk
-#else
-#define DEBUGP(fmt, a...)
-#endif
-
 /* Protects all parameters, and incidentally kmalloced_param list. */
 static DEFINE_MUTEX(param_lock);
 
@@ -103,9 +97,10 @@ static int parse_one(char *param,
        for (i = 0; i < num_params; i++) {
                if (parameq(param, params[i].name)) {
                        /* No one handled NULL, so do it here. */
-                       if (!val && params[i].ops->set != param_set_bool)
+                       if (!val && params[i].ops->set != param_set_bool
+                           && params[i].ops->set != param_set_bint)
                                return -EINVAL;
-                       DEBUGP("They are equal!  Calling %p\n",
+                       pr_debug("They are equal!  Calling %p\n",
                               params[i].ops->set);
                        mutex_lock(&param_lock);
                        err = params[i].ops->set(val, &params[i]);
@@ -115,11 +110,11 @@ static int parse_one(char *param,
        }
 
        if (handle_unknown) {
-               DEBUGP("Unknown argument: calling %p\n", handle_unknown);
+               pr_debug("Unknown argument: calling %p\n", handle_unknown);
                return handle_unknown(param, val);
        }
 
-       DEBUGP("Unknown argument `%s'\n", param);
+       pr_debug("Unknown argument `%s'\n", param);
        return -ENOENT;
 }
 
@@ -184,7 +179,7 @@ int parse_args(const char *name,
 {
        char *param, *val;
 
-       DEBUGP("Parsing ARGS: %s\n", args);
+       pr_debug("Parsing ARGS: %s\n", args);
 
        /* Chew leading spaces */
        args = skip_spaces(args);
@@ -369,6 +364,30 @@ struct kernel_param_ops param_ops_invbool = {
 };
 EXPORT_SYMBOL(param_ops_invbool);
 
+int param_set_bint(const char *val, const struct kernel_param *kp)
+{
+       struct kernel_param boolkp;
+       bool v;
+       int ret;
+
+       /* Match bool exactly, by re-using it. */
+       boolkp = *kp;
+       boolkp.arg = &v;
+       boolkp.flags |= KPARAM_ISBOOL;
+
+       ret = param_set_bool(val, &boolkp);
+       if (ret == 0)
+               *(int *)kp->arg = v;
+       return ret;
+}
+EXPORT_SYMBOL(param_set_bint);
+
+struct kernel_param_ops param_ops_bint = {
+       .set = param_set_bint,
+       .get = param_get_int,
+};
+EXPORT_SYMBOL(param_ops_bint);
+
 /* We break the rule and mangle the string. */
 static int param_array(const char *name,
                       const char *val,