|
@@ -73,7 +73,7 @@ static unsigned char sunkbd_keycode[128] = {
|
|
|
*/
|
|
|
|
|
|
struct sunkbd {
|
|
|
- unsigned char keycode[128];
|
|
|
+ unsigned char keycode[ARRAY_SIZE(sunkbd_keycode)];
|
|
|
struct input_dev *dev;
|
|
|
struct serio *serio;
|
|
|
struct work_struct tq;
|
|
@@ -81,7 +81,7 @@ struct sunkbd {
|
|
|
char name[64];
|
|
|
char phys[32];
|
|
|
char type;
|
|
|
- unsigned char enabled;
|
|
|
+ bool enabled;
|
|
|
volatile s8 reset;
|
|
|
volatile s8 layout;
|
|
|
};
|
|
@@ -94,10 +94,14 @@ struct sunkbd {
|
|
|
static irqreturn_t sunkbd_interrupt(struct serio *serio,
|
|
|
unsigned char data, unsigned int flags)
|
|
|
{
|
|
|
- struct sunkbd* sunkbd = serio_get_drvdata(serio);
|
|
|
+ struct sunkbd *sunkbd = serio_get_drvdata(serio);
|
|
|
|
|
|
- if (sunkbd->reset <= -1) { /* If cp[i] is 0xff, sunkbd->reset will stay -1. */
|
|
|
- sunkbd->reset = data; /* The keyboard sends 0xff 0xff 0xID on powerup */
|
|
|
+ if (sunkbd->reset <= -1) {
|
|
|
+ /*
|
|
|
+ * If cp[i] is 0xff, sunkbd->reset will stay -1.
|
|
|
+ * The keyboard sends 0xff 0xff 0xID on powerup.
|
|
|
+ */
|
|
|
+ sunkbd->reset = data;
|
|
|
wake_up_interruptible(&sunkbd->wait);
|
|
|
goto out;
|
|
|
}
|
|
@@ -110,29 +114,33 @@ static irqreturn_t sunkbd_interrupt(struct serio *serio,
|
|
|
|
|
|
switch (data) {
|
|
|
|
|
|
- case SUNKBD_RET_RESET:
|
|
|
- schedule_work(&sunkbd->tq);
|
|
|
- sunkbd->reset = -1;
|
|
|
- break;
|
|
|
+ case SUNKBD_RET_RESET:
|
|
|
+ schedule_work(&sunkbd->tq);
|
|
|
+ sunkbd->reset = -1;
|
|
|
+ break;
|
|
|
|
|
|
- case SUNKBD_RET_LAYOUT:
|
|
|
- sunkbd->layout = -1;
|
|
|
- break;
|
|
|
+ case SUNKBD_RET_LAYOUT:
|
|
|
+ sunkbd->layout = -1;
|
|
|
+ break;
|
|
|
|
|
|
- case SUNKBD_RET_ALLUP: /* All keys released */
|
|
|
+ case SUNKBD_RET_ALLUP: /* All keys released */
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ if (!sunkbd->enabled)
|
|
|
break;
|
|
|
|
|
|
- default:
|
|
|
- if (!sunkbd->enabled)
|
|
|
- break;
|
|
|
-
|
|
|
- if (sunkbd->keycode[data & SUNKBD_KEY]) {
|
|
|
- input_report_key(sunkbd->dev, sunkbd->keycode[data & SUNKBD_KEY], !(data & SUNKBD_RELEASE));
|
|
|
- input_sync(sunkbd->dev);
|
|
|
- } else {
|
|
|
- printk(KERN_WARNING "sunkbd.c: Unknown key (scancode %#x) %s.\n",
|
|
|
- data & SUNKBD_KEY, data & SUNKBD_RELEASE ? "released" : "pressed");
|
|
|
- }
|
|
|
+ if (sunkbd->keycode[data & SUNKBD_KEY]) {
|
|
|
+ input_report_key(sunkbd->dev,
|
|
|
+ sunkbd->keycode[data & SUNKBD_KEY],
|
|
|
+ !(data & SUNKBD_RELEASE));
|
|
|
+ input_sync(sunkbd->dev);
|
|
|
+ } else {
|
|
|
+ printk(KERN_WARNING
|
|
|
+ "sunkbd.c: Unknown key (scancode %#x) %s.\n",
|
|
|
+ data & SUNKBD_KEY,
|
|
|
+ data & SUNKBD_RELEASE ? "released" : "pressed");
|
|
|
+ }
|
|
|
}
|
|
|
out:
|
|
|
return IRQ_HANDLED;
|
|
@@ -142,34 +150,37 @@ out:
|
|
|
* sunkbd_event() handles events from the input module.
|
|
|
*/
|
|
|
|
|
|
-static int sunkbd_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
|
|
|
+static int sunkbd_event(struct input_dev *dev,
|
|
|
+ unsigned int type, unsigned int code, int value)
|
|
|
{
|
|
|
struct sunkbd *sunkbd = input_get_drvdata(dev);
|
|
|
|
|
|
switch (type) {
|
|
|
|
|
|
- case EV_LED:
|
|
|
+ case EV_LED:
|
|
|
|
|
|
- serio_write(sunkbd->serio, SUNKBD_CMD_SETLED);
|
|
|
- serio_write(sunkbd->serio,
|
|
|
- (!!test_bit(LED_CAPSL, dev->led) << 3) | (!!test_bit(LED_SCROLLL, dev->led) << 2) |
|
|
|
- (!!test_bit(LED_COMPOSE, dev->led) << 1) | !!test_bit(LED_NUML, dev->led));
|
|
|
- return 0;
|
|
|
+ serio_write(sunkbd->serio, SUNKBD_CMD_SETLED);
|
|
|
+ serio_write(sunkbd->serio,
|
|
|
+ (!!test_bit(LED_CAPSL, dev->led) << 3) |
|
|
|
+ (!!test_bit(LED_SCROLLL, dev->led) << 2) |
|
|
|
+ (!!test_bit(LED_COMPOSE, dev->led) << 1) |
|
|
|
+ !!test_bit(LED_NUML, dev->led));
|
|
|
+ return 0;
|
|
|
|
|
|
- case EV_SND:
|
|
|
+ case EV_SND:
|
|
|
|
|
|
- switch (code) {
|
|
|
+ switch (code) {
|
|
|
|
|
|
- case SND_CLICK:
|
|
|
- serio_write(sunkbd->serio, SUNKBD_CMD_NOCLICK - value);
|
|
|
- return 0;
|
|
|
+ case SND_CLICK:
|
|
|
+ serio_write(sunkbd->serio, SUNKBD_CMD_NOCLICK - value);
|
|
|
+ return 0;
|
|
|
|
|
|
- case SND_BELL:
|
|
|
- serio_write(sunkbd->serio, SUNKBD_CMD_BELLOFF - value);
|
|
|
- return 0;
|
|
|
- }
|
|
|
+ case SND_BELL:
|
|
|
+ serio_write(sunkbd->serio, SUNKBD_CMD_BELLOFF - value);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
|
|
|
- break;
|
|
|
+ break;
|
|
|
}
|
|
|
|
|
|
return -1;
|
|
@@ -193,9 +204,12 @@ static int sunkbd_initialize(struct sunkbd *sunkbd)
|
|
|
if (sunkbd->type == 4) { /* Type 4 keyboard */
|
|
|
sunkbd->layout = -2;
|
|
|
serio_write(sunkbd->serio, SUNKBD_CMD_LAYOUT);
|
|
|
- wait_event_interruptible_timeout(sunkbd->wait, sunkbd->layout >= 0, HZ/4);
|
|
|
- if (sunkbd->layout < 0) return -1;
|
|
|
- if (sunkbd->layout & SUNKBD_LAYOUT_5_MASK) sunkbd->type = 5;
|
|
|
+ wait_event_interruptible_timeout(sunkbd->wait,
|
|
|
+ sunkbd->layout >= 0, HZ / 4);
|
|
|
+ if (sunkbd->layout < 0)
|
|
|
+ return -1;
|
|
|
+ if (sunkbd->layout & SUNKBD_LAYOUT_5_MASK)
|
|
|
+ sunkbd->type = 5;
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
@@ -218,11 +232,13 @@ static void sunkbd_reinit(struct work_struct *work)
|
|
|
(!!test_bit(LED_SCROLLL, sunkbd->dev->led) << 2) |
|
|
|
(!!test_bit(LED_COMPOSE, sunkbd->dev->led) << 1) |
|
|
|
!!test_bit(LED_NUML, sunkbd->dev->led));
|
|
|
- serio_write(sunkbd->serio, SUNKBD_CMD_NOCLICK - !!test_bit(SND_CLICK, sunkbd->dev->snd));
|
|
|
- serio_write(sunkbd->serio, SUNKBD_CMD_BELLOFF - !!test_bit(SND_BELL, sunkbd->dev->snd));
|
|
|
+ serio_write(sunkbd->serio,
|
|
|
+ SUNKBD_CMD_NOCLICK - !!test_bit(SND_CLICK, sunkbd->dev->snd));
|
|
|
+ serio_write(sunkbd->serio,
|
|
|
+ SUNKBD_CMD_BELLOFF - !!test_bit(SND_BELL, sunkbd->dev->snd));
|
|
|
}
|
|
|
|
|
|
-static void sunkbd_enable(struct sunkbd *sunkbd, int enable)
|
|
|
+static void sunkbd_enable(struct sunkbd *sunkbd, bool enable)
|
|
|
{
|
|
|
serio_pause_rx(sunkbd->serio);
|
|
|
sunkbd->enabled = enable;
|
|
@@ -230,7 +246,8 @@ static void sunkbd_enable(struct sunkbd *sunkbd, int enable)
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- * sunkbd_connect() probes for a Sun keyboard and fills the necessary structures.
|
|
|
+ * sunkbd_connect() probes for a Sun keyboard and fills the necessary
|
|
|
+ * structures.
|
|
|
*/
|
|
|
|
|
|
static int sunkbd_connect(struct serio *serio, struct serio_driver *drv)
|
|
@@ -262,7 +279,8 @@ static int sunkbd_connect(struct serio *serio, struct serio_driver *drv)
|
|
|
goto fail3;
|
|
|
}
|
|
|
|
|
|
- snprintf(sunkbd->name, sizeof(sunkbd->name), "Sun Type %d keyboard", sunkbd->type);
|
|
|
+ snprintf(sunkbd->name, sizeof(sunkbd->name),
|
|
|
+ "Sun Type %d keyboard", sunkbd->type);
|
|
|
memcpy(sunkbd->keycode, sunkbd_keycode, sizeof(sunkbd->keycode));
|
|
|
|
|
|
input_dev->name = sunkbd->name;
|
|
@@ -286,11 +304,11 @@ static int sunkbd_connect(struct serio *serio, struct serio_driver *drv)
|
|
|
input_dev->keycode = sunkbd->keycode;
|
|
|
input_dev->keycodesize = sizeof(unsigned char);
|
|
|
input_dev->keycodemax = ARRAY_SIZE(sunkbd_keycode);
|
|
|
- for (i = 0; i < 128; i++)
|
|
|
- set_bit(sunkbd->keycode[i], input_dev->keybit);
|
|
|
- clear_bit(0, input_dev->keybit);
|
|
|
+ for (i = 0; i < ARRAY_SIZE(sunkbd_keycode); i++)
|
|
|
+ __set_bit(sunkbd->keycode[i], input_dev->keybit);
|
|
|
+ __clear_bit(KEY_RESERVED, input_dev->keybit);
|
|
|
|
|
|
- sunkbd_enable(sunkbd, 1);
|
|
|
+ sunkbd_enable(sunkbd, true);
|
|
|
|
|
|
err = input_register_device(sunkbd->dev);
|
|
|
if (err)
|
|
@@ -298,7 +316,7 @@ static int sunkbd_connect(struct serio *serio, struct serio_driver *drv)
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
- fail4: sunkbd_enable(sunkbd, 0);
|
|
|
+ fail4: sunkbd_enable(sunkbd, false);
|
|
|
fail3: serio_close(serio);
|
|
|
fail2: serio_set_drvdata(serio, NULL);
|
|
|
fail1: input_free_device(input_dev);
|
|
@@ -314,7 +332,7 @@ static void sunkbd_disconnect(struct serio *serio)
|
|
|
{
|
|
|
struct sunkbd *sunkbd = serio_get_drvdata(serio);
|
|
|
|
|
|
- sunkbd_enable(sunkbd, 0);
|
|
|
+ sunkbd_enable(sunkbd, false);
|
|
|
input_unregister_device(sunkbd->dev);
|
|
|
serio_close(serio);
|
|
|
serio_set_drvdata(serio, NULL);
|