[PATCH] adbhid: make KEY_SYSRQ configurable on ADB based machines

Aristeu Sergio Rozanski Filho aris at cathedrallabs.org
Wed Sep 20 23:44:59 EST 2006


> This patch adds a sysfs entry on /sys/class/adb/keyboard0/sysrq_key to
> configure which key will be mapped to KEY_SYSRQ. This is needed to make
> sysrq usable on machines which doesn't have current sysrq key. This
> patch and the previous two ones has been tested for some days in my
> machine without problems.
any comments on this one?

> Signed-off-by: Aristeu S. Rozanski F. <aris at cathedrallabs.org>
> Acked-by: Michael Hanselmann <linux-kernel at hansmi.ch>
> 
> Index: ppc-2.6/drivers/macintosh/adbhid.c
> ===================================================================
> --- ppc-2.6.orig/drivers/macintosh/adbhid.c	2006-08-04 09:45:43.000000000 -0300
> +++ ppc-2.6/drivers/macintosh/adbhid.c	2006-08-04 09:52:06.000000000 -0300
> @@ -61,6 +61,47 @@
>  	.notifier_call	= adb_message_handler,
>  };
>  
> +/* SYSRQ support */
> +#ifdef CONFIG_MAGIC_SYSRQ
> +static int adbhid_sysrq_key = 0x69;
> +
> +static ssize_t adbhid_show_sysrq_key(struct class_device *dev, char *buf)
> +{
> +	return sprintf(buf, "%#x\n", adbhid_sysrq_key);
> +}
> +static ssize_t adbhid_store_sysrq_key(struct class_device *dev,
> +				      const char *buf, size_t n)
> +{
> +	int val;
> +
> +	val = simple_strtol(buf, NULL, 10);
> +	if (val > 255)
> +		return -EINVAL;
> +	adbhid_sysrq_key = val;
> +
> +	return n;
> +}
> +
> +static CLASS_DEVICE_ATTR(sysrq_key, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH,
> +			 adbhid_show_sysrq_key, adbhid_store_sysrq_key);
> +static inline int adbhid_key_is_sysrq(int keycode)
> +{
> +	if (unlikely(keycode == adbhid_sysrq_key))
> +		return KEY_SYSRQ;
> +	return 0;
> +}
> +
> +static inline void adbhid_register_sysrq_attr(struct class_device *dev)
> +{
> +	class_device_create_file(dev, &class_device_attr_sysrq_key);
> +}
> +#define adbhid_set_sysrq(x) set_bit(KEY_SYSRQ, (x))
> +#else	/* !CONFIG_MAGIC_SYSRQ */
> +#define adbhid_key_is_sysrq(x) (0)
> +#define adbhid_register_sysrq_attr(x) do { } while(0)
> +#define adbhid_set_sysrq(x) do { } while(0)
> +#endif	/* CONFIG_MAGIC_SYSRQ */
> +
>  /* Some special keys */
>  #define ADB_KEY_DEL		0x33
>  #define ADB_KEY_CMD		0x37
> @@ -176,7 +217,7 @@
>  	/* 0x66 */ KEY_HANJA,		/* 123 */
>  	/* 0x67 */ KEY_F11,		/*  87 */
>  	/* 0x68 */ KEY_HANGEUL,		/* 122 */
> -	/* 0x69 */ KEY_SYSRQ,		/*  99 */
> +	/* 0x69 */ 0,
>  	/* 0x6a */ 0,
>  	/* 0x6b */ KEY_SCROLLLOCK,	/*  70 */
>  	/* 0x6c */ 0,
> @@ -275,7 +316,7 @@
>  adbhid_input_keycode(int id, int keycode, int repeat, struct pt_regs *regs)
>  {
>  	struct adbhid *ahid = adbhid[id];
> -	int up_flag, key;
> +	int up_flag, key = 0;
>  
>  	up_flag = (keycode & 0x80);
>  	keycode &= 0x7f;
> @@ -336,7 +377,9 @@
>  #endif /* CONFIG_PPC_PMAC */
>  	}
>  
> -	key = adbhid[id]->keycode[keycode];
> +	key = adbhid_key_is_sysrq(keycode);
> +	if (!key)
> +		key = adbhid[id]->keycode[keycode];
>  	if (key) {
>  		input_regs(adbhid[id]->input, regs);
>  		input_report_key(adbhid[id]->input, key, !up_flag);
> @@ -759,6 +802,7 @@
>  		for (i = 0; i < 128; i++)
>  			if (hid->keycode[i])
>  				set_bit(hid->keycode[i], input_dev->keybit);
> +		adbhid_set_sysrq(input_dev->keybit);
>  
>  		input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_LED) | BIT(EV_REP);
>  		input_dev->ledbit[0] = BIT(LED_SCROLLL) | BIT(LED_CAPSL) | BIT(LED_NUML);
> @@ -901,6 +945,8 @@
>  		adb_get_infos(id, &default_id, &cur_handler_id);
>  		reg |= adbhid_input_reregister(id, default_id, org_handler_id,
>  					       cur_handler_id, 0);
> +
> +		adbhid_register_sysrq_attr(keyboard_ids.device[i]);
>  	}
>  
>  	for (i = 0; i < buttons_ids.nids; i++) {
> _______________________________________________
> Linuxppc-dev mailing list
> Linuxppc-dev at ozlabs.org
> https://ozlabs.org/mailman/listinfo/linuxppc-dev

-- 
Aristeu




More information about the Linuxppc-dev mailing list