diff options
Diffstat (limited to 'drivers/input/keyboard/hil_kbd.c')
| -rw-r--r-- | drivers/input/keyboard/hil_kbd.c | 89 | 
1 files changed, 48 insertions, 41 deletions
diff --git a/drivers/input/keyboard/hil_kbd.c b/drivers/input/keyboard/hil_kbd.c index 7cc9728b04d..cdd254f2e6c 100644 --- a/drivers/input/keyboard/hil_kbd.c +++ b/drivers/input/keyboard/hil_kbd.c @@ -51,7 +51,7 @@ MODULE_LICENSE("Dual BSD/GPL");  #define HIL_KBD_SET1_UPBIT 0x01  #define HIL_KBD_SET1_SHIFT 1 -static unsigned int hil_kbd_set1[HIL_KEYCODES_SET1_TBLSIZE] =  +static unsigned int hil_kbd_set1[HIL_KEYCODES_SET1_TBLSIZE] __read_mostly =  	{ HIL_KEYCODES_SET1 };  #define HIL_KBD_SET2_UPBIT 0x01 @@ -60,10 +60,10 @@ static unsigned int hil_kbd_set1[HIL_KEYCODES_SET1_TBLSIZE] =  #define HIL_KBD_SET3_UPBIT 0x80  #define HIL_KBD_SET3_SHIFT 0 -static unsigned int hil_kbd_set3[HIL_KEYCODES_SET3_TBLSIZE] = +static unsigned int hil_kbd_set3[HIL_KEYCODES_SET3_TBLSIZE] __read_mostly =  	{ HIL_KEYCODES_SET3 }; -static char hil_language[][16] = { HIL_LOCALE_MAP }; +static const char hil_language[][16] = { HIL_LOCALE_MAP };  struct hil_kbd {  	struct input_dev *dev; @@ -94,10 +94,12 @@ static void hil_kbd_process_record(struct hil_kbd *kbd)  	idx = kbd->idx4/4;  	p = data[idx - 1]; -	if ((p & ~HIL_CMDCT_POL) ==  -	    (HIL_ERR_INT | HIL_PKT_CMD | HIL_CMD_POL)) goto report; -	if ((p & ~HIL_CMDCT_RPL) ==  -	    (HIL_ERR_INT | HIL_PKT_CMD | HIL_CMD_RPL)) goto report; +	if ((p & ~HIL_CMDCT_POL) == +	    (HIL_ERR_INT | HIL_PKT_CMD | HIL_CMD_POL)) +		goto report; +	if ((p & ~HIL_CMDCT_RPL) == +	    (HIL_ERR_INT | HIL_PKT_CMD | HIL_CMD_RPL)) +		goto report;  	/* Not a poll response.  See if we are loading config records. */  	switch (p & HIL_PKT_DATA_MASK) { @@ -107,27 +109,32 @@ static void hil_kbd_process_record(struct hil_kbd *kbd)  		for (; i < HIL_KBD_MAX_LENGTH; i++)  			kbd->idd[i] = 0;  		break; +  	case HIL_CMD_RSC:  		for (i = 0; i < idx; i++)  			kbd->rsc[i] = kbd->data[i] & HIL_PKT_DATA_MASK;  		for (; i < HIL_KBD_MAX_LENGTH; i++)  			kbd->rsc[i] = 0;  		break; +  	case HIL_CMD_EXD:  		for (i = 0; i < idx; i++)  			kbd->exd[i] = kbd->data[i] & HIL_PKT_DATA_MASK;  		for (; i < HIL_KBD_MAX_LENGTH; i++)  			kbd->exd[i] = 0;  		break; +  	case HIL_CMD_RNM:  		for (i = 0; i < idx; i++)  			kbd->rnm[i] = kbd->data[i] & HIL_PKT_DATA_MASK;  		for (; i < HIL_KBD_MAX_LENGTH + 1; i++)  			kbd->rnm[i] = '\0';  		break; +  	default:  		/* These occur when device isn't present */ -		if (p == (HIL_ERR_INT | HIL_PKT_CMD)) break;  +		if (p == (HIL_ERR_INT | HIL_PKT_CMD)) +			break;  		/* Anything else we'd like to know about. */  		printk(KERN_WARNING PREFIX "Device sent unknown record %x\n", p);  		break; @@ -139,16 +146,19 @@ static void hil_kbd_process_record(struct hil_kbd *kbd)  	switch (kbd->data[0] & HIL_POL_CHARTYPE_MASK) {  	case HIL_POL_CHARTYPE_NONE:  		break; +  	case HIL_POL_CHARTYPE_ASCII:  		while (cnt < idx - 1)  			input_report_key(dev, kbd->data[cnt++] & 0x7f, 1);  		break; +  	case HIL_POL_CHARTYPE_RSVD1:  	case HIL_POL_CHARTYPE_RSVD2:  	case HIL_POL_CHARTYPE_BINARY:  		while (cnt < idx - 1)  			input_report_key(dev, kbd->data[cnt++], 1);  		break; +  	case HIL_POL_CHARTYPE_SET1:  		while (cnt < idx - 1) {  			unsigned int key; @@ -161,6 +171,7 @@ static void hil_kbd_process_record(struct hil_kbd *kbd)  				input_report_key(dev, key, !up);  		}  		break; +  	case HIL_POL_CHARTYPE_SET2:  		while (cnt < idx - 1) {  			unsigned int key; @@ -173,6 +184,7 @@ static void hil_kbd_process_record(struct hil_kbd *kbd)  				input_report_key(dev, key, !up);  		}  		break; +  	case HIL_POL_CHARTYPE_SET3:  		while (cnt < idx - 1) {  			unsigned int key; @@ -191,42 +203,43 @@ static void hil_kbd_process_record(struct hil_kbd *kbd)  	up(&kbd->sem);  } -static void hil_kbd_process_err(struct hil_kbd *kbd) { +static void hil_kbd_process_err(struct hil_kbd *kbd) +{  	printk(KERN_WARNING PREFIX "errored HIL packet\n");  	kbd->idx4 = 0;  	up(&kbd->sem);  } -static irqreturn_t hil_kbd_interrupt(struct serio *serio,  -	      unsigned char data, unsigned int flags) +static irqreturn_t hil_kbd_interrupt(struct serio *serio, +				unsigned char data, unsigned int flags)  {  	struct hil_kbd *kbd;  	hil_packet packet;  	int idx;  	kbd = serio_get_drvdata(serio); -	if (kbd == NULL) { -		BUG(); -		return IRQ_HANDLED; -	} +	BUG_ON(kbd == NULL);  	if (kbd->idx4 >= (HIL_KBD_MAX_LENGTH * sizeof(hil_packet))) {  		hil_kbd_process_err(kbd);  		return IRQ_HANDLED;  	}  	idx = kbd->idx4/4; -	if (!(kbd->idx4 % 4)) kbd->data[idx] = 0; +	if (!(kbd->idx4 % 4)) +		kbd->data[idx] = 0;  	packet = kbd->data[idx];  	packet |= ((hil_packet)data) << ((3 - (kbd->idx4 % 4)) * 8);  	kbd->data[idx] = packet;  	/* Records of N 4-byte hil_packets must terminate with a command. */ -	if ((++(kbd->idx4)) % 4) return IRQ_HANDLED; +	if ((++(kbd->idx4)) % 4) +		return IRQ_HANDLED;  	if ((packet & 0xffff0000) != HIL_ERR_INT) {  		hil_kbd_process_err(kbd);  		return IRQ_HANDLED;  	} -	if (packet & HIL_PKT_CMD) hil_kbd_process_record(kbd); +	if (packet & HIL_PKT_CMD) +		hil_kbd_process_record(kbd);  	return IRQ_HANDLED;  } @@ -235,10 +248,7 @@ static void hil_kbd_disconnect(struct serio *serio)  	struct hil_kbd *kbd;  	kbd = serio_get_drvdata(serio); -	if (kbd == NULL) { -		BUG(); -		return; -	} +	BUG_ON(kbd == NULL);  	serio_close(serio);  	input_unregister_device(kbd->dev); @@ -259,42 +269,40 @@ static int hil_kbd_connect(struct serio *serio, struct serio_driver *drv)  	if (!kbd->dev)  		goto bail0; -	kbd->dev->private = kbd; -  	if (serio_open(serio, drv))  		goto bail1;  	serio_set_drvdata(serio, kbd);  	kbd->serio = serio; -	init_MUTEX_LOCKED(&(kbd->sem)); +	init_MUTEX_LOCKED(&kbd->sem);  	/* Get device info.  MLC driver supplies devid/status/etc. */  	serio->write(serio, 0);  	serio->write(serio, 0);  	serio->write(serio, HIL_PKT_CMD >> 8);  	serio->write(serio, HIL_CMD_IDD); -	down(&(kbd->sem)); +	down(&kbd->sem);  	serio->write(serio, 0);  	serio->write(serio, 0);  	serio->write(serio, HIL_PKT_CMD >> 8);  	serio->write(serio, HIL_CMD_RSC); -	down(&(kbd->sem)); +	down(&kbd->sem);  	serio->write(serio, 0);  	serio->write(serio, 0);  	serio->write(serio, HIL_PKT_CMD >> 8);  	serio->write(serio, HIL_CMD_RNM); -	down(&(kbd->sem)); +	down(&kbd->sem);  	serio->write(serio, 0);  	serio->write(serio, 0);  	serio->write(serio, HIL_PKT_CMD >> 8);  	serio->write(serio, HIL_CMD_EXD); -	down(&(kbd->sem)); +	down(&kbd->sem); -	up(&(kbd->sem)); +	up(&kbd->sem);  	did = kbd->idd[0];  	idd = kbd->idd + 1; @@ -310,12 +318,11 @@ static int hil_kbd_connect(struct serio *serio, struct serio_driver *drv)  		goto bail2;  	} -	if(HIL_IDD_NUM_BUTTONS(idd) || HIL_IDD_NUM_AXES_PER_SET(*idd)) { +	if (HIL_IDD_NUM_BUTTONS(idd) || HIL_IDD_NUM_AXES_PER_SET(*idd)) {  		printk(KERN_INFO PREFIX "keyboards only, no combo devices supported.\n");  		goto bail2;  	} -  	kbd->dev->evbit[0]	= BIT(EV_KEY) | BIT(EV_REP);  	kbd->dev->ledbit[0]	= BIT(LED_NUML) | BIT(LED_CAPSL) | BIT(LED_SCROLLL);  	kbd->dev->keycodemax	= HIL_KEYCODES_SET1_TBLSIZE; @@ -328,7 +335,7 @@ static int hil_kbd_connect(struct serio *serio, struct serio_driver *drv)  	kbd->dev->id.vendor	= PCI_VENDOR_ID_HP;  	kbd->dev->id.product	= 0x0001; /* TODO: get from kbd->rsc */  	kbd->dev->id.version	= 0x0100; /* TODO: get from kbd->rsc */ -	kbd->dev->cdev.dev	= &serio->dev; +	kbd->dev->dev.parent	= &serio->dev;  	for (i = 0; i < 128; i++) {  		set_bit(hil_kbd_set1[i], kbd->dev->keybit); @@ -344,8 +351,8 @@ static int hil_kbd_connect(struct serio *serio, struct serio_driver *drv)  	serio->write(serio, 0);  	serio->write(serio, HIL_PKT_CMD >> 8);  	serio->write(serio, HIL_CMD_EK1); /* Enable Keyswitch Autorepeat 1 */ -	down(&(kbd->sem)); -	up(&(kbd->sem)); +	down(&kbd->sem); +	up(&kbd->sem);  	return 0;   bail2: @@ -368,26 +375,26 @@ static struct serio_device_id hil_kbd_ids[] = {  	{ 0 }  }; -struct serio_driver hil_kbd_serio_drv = { +static struct serio_driver hil_kbd_serio_drv = {  	.driver		= {  		.name	= "hil_kbd",  	},  	.description	= "HP HIL keyboard driver",  	.id_table	= hil_kbd_ids, -	.connect 	= hil_kbd_connect, -	.disconnect 	= hil_kbd_disconnect, -	.interrupt 	= hil_kbd_interrupt +	.connect	= hil_kbd_connect, +	.disconnect	= hil_kbd_disconnect, +	.interrupt	= hil_kbd_interrupt  };  static int __init hil_kbd_init(void)  {  	return serio_register_driver(&hil_kbd_serio_drv);  } -                 +  static void __exit hil_kbd_exit(void)  {  	serio_unregister_driver(&hil_kbd_serio_drv);  } -                         +  module_init(hil_kbd_init);  module_exit(hil_kbd_exit);  |