On Sunday 06 March 2005 11:30, Alan Stern wrote: > On Sun, 6 Mar 2005, Dmitry Torokhov wrote: > > > Hi, > > > > On Saturday 05 March 2005 10:37, Alan Stern wrote: > > > A common problem facing all drivers that do auto suspend is how to set > > > the inactivity timeout. Â Two possible answers are: add an attribute > > > file in the /sys/.../power directory (so different devices can have > > > different timeouts), or add a driver module parameter (so all devices > > > using the same driver will have the same timeout). Â The module > > > parameter approach is more efficient, but it suffers from the drawback > > > that a driver is not notified when a parameter is changed! > > > > This is entirely up to driver implementation to override param_get_xxxx > > and param_set_xxx functions to perform any required additional actions > > and not rely on default param_{get|set}_xxx implementations. > > I wasn't aware that drivers can override param_get_xxxx. Is there > documentation somewhere explaining how to do it? > See the patch below for an example - look for handling of psmouse.proto parameter - seems to be working fine. > Also, does sysfs now export module parameters for drivers that are > compiled into the kernel? If so, where do they appear? > Yes it does, and they appear in the same place as "true" modules: /sys/module/<module-name>/parameters/ -- Dmitry =================================================================== Input: export psmouse module parameters via sysfs: /sys/module/psmouse/parameters/proto /sys/module/psmouse/parameters/rate /sys/module/psmouse/parameters/resetafter /sys/module/psmouse/parameters/resolution /sys/module/psmouse/parameters/smartscroll Signed-off-by: Dmitry Torokhov <dtor@xxxxxxx> psmouse-base.c | 58 +++++++++++++++++++++++++++++++++++++++------------------ 1 files changed, 40 insertions(+), 18 deletions(-) Index: dtor/drivers/input/mouse/psmouse-base.c =================================================================== --- dtor.orig/drivers/input/mouse/psmouse-base.c +++ dtor/drivers/input/mouse/psmouse-base.c @@ -31,25 +31,30 @@ MODULE_AUTHOR("Vojtech Pavlik <vojtech@s MODULE_DESCRIPTION(DRIVER_DESC); MODULE_LICENSE("GPL"); -static char *psmouse_proto; static unsigned int psmouse_max_proto = -1U; -module_param_named(proto, psmouse_proto, charp, 0); -MODULE_PARM_DESC(proto, "Highest protocol extension to probe (bare, imps, exps). Useful for KVM switches."); +static int psmouse_set_maxproto(const char *val, struct kernel_param *kp); +static int psmouse_get_maxproto(char *buffer, struct kernel_param *kp); +static char *psmouse_proto_abbrev[] = { NULL, "bare", NULL, NULL, NULL, "imps", "exps", NULL, NULL, NULL }; +#define param_check_proto_abbrev(name, p) __param_check(name, p, unsigned int) +#define param_set_proto_abbrev psmouse_set_maxproto +#define param_get_proto_abbrev psmouse_get_maxproto +module_param_named(proto, psmouse_max_proto, proto_abbrev, 0644); +MODULE_PARM_DESC(proto, "Highest protocol extension to probe (bare, imps, exps, any). Useful for KVM switches."); static unsigned int psmouse_resolution = 200; -module_param_named(resolution, psmouse_resolution, uint, 0); +module_param_named(resolution, psmouse_resolution, uint, 0644); MODULE_PARM_DESC(resolution, "Resolution, in dpi."); static unsigned int psmouse_rate = 100; -module_param_named(rate, psmouse_rate, uint, 0); +module_param_named(rate, psmouse_rate, uint, 0644); MODULE_PARM_DESC(rate, "Report rate, in reports per second."); static unsigned int psmouse_smartscroll = 1; -module_param_named(smartscroll, psmouse_smartscroll, bool, 0); +module_param_named(smartscroll, psmouse_smartscroll, bool, 0644); MODULE_PARM_DESC(smartscroll, "Logitech Smartscroll autorepeat, 1 = enabled (default), 0 = disabled."); static unsigned int psmouse_resetafter; -module_param_named(resetafter, psmouse_resetafter, uint, 0); +module_param_named(resetafter, psmouse_resetafter, uint, 0644); MODULE_PARM_DESC(resetafter, "Reset device after so many bad packets (0 = never)."); PSMOUSE_DEFINE_ATTR(rate); @@ -959,23 +964,40 @@ static ssize_t psmouse_attr_set_resetaft return count; } -static inline void psmouse_parse_proto(void) +static int psmouse_set_maxproto(const char *val, struct kernel_param *kp) { - if (psmouse_proto) { - if (!strcmp(psmouse_proto, "bare")) - psmouse_max_proto = PSMOUSE_PS2; - else if (!strcmp(psmouse_proto, "imps")) - psmouse_max_proto = PSMOUSE_IMPS; - else if (!strcmp(psmouse_proto, "exps")) - psmouse_max_proto = PSMOUSE_IMEX; - else - printk(KERN_ERR "psmouse: unknown protocol type '%s'\n", psmouse_proto); + int i; + + if (!val) + return -EINVAL; + + if (!strncmp(val, "any", 3)) { + *((unsigned int *)kp->arg) = -1UL; + return 0; } + + for (i = 0; i < ARRAY_SIZE(psmouse_proto_abbrev); i++) { + if (!psmouse_proto_abbrev[i]) + continue; + + if (!strncmp(val, psmouse_proto_abbrev[i], strlen(psmouse_proto_abbrev[i]))) { + *((unsigned int *)kp->arg) = i; + return 0; + } + } + + return -EINVAL; \ +} + +static int psmouse_get_maxproto(char *buffer, struct kernel_param *kp) +{ + return sprintf(buffer, "%s\n", + psmouse_max_proto < ARRAY_SIZE(psmouse_proto_abbrev) ? + psmouse_proto_abbrev[psmouse_max_proto] : "any"); } static int __init psmouse_init(void) { - psmouse_parse_proto(); serio_register_driver(&psmouse_drv); return 0; }