/* * lkkbd_reinit() sets leds and beeps to a state the computer remembers they * were in. */ static void lkkbd_reinit (struct work_struct *work) { struct lkkbd *lk = container_of(work, struct lkkbd, tq); int division; unsigned char leds_on = 0; unsigned char leds_off = 0; /* Ask for ID */ lk->serio->write (lk->serio, LK_CMD_REQUEST_ID); /* Reset parameters */ lk->serio->write (lk->serio, LK_CMD_SET_DEFAULTS); /* Set LEDs */ CHECK_LED (lk, leds_on, leds_off, LED_CAPSL, LK_LED_SHIFTLOCK); CHECK_LED (lk, leds_on, leds_off, LED_COMPOSE, LK_LED_COMPOSE); CHECK_LED (lk, leds_on, leds_off, LED_SCROLLL, LK_LED_SCROLLLOCK); CHECK_LED (lk, leds_on, leds_off, LED_SLEEP, LK_LED_WAIT); if (leds_on != 0) { lk->serio->write (lk->serio, LK_CMD_LED_ON); lk->serio->write (lk->serio, leds_on); } if (leds_off != 0) { lk->serio->write (lk->serio, LK_CMD_LED_OFF); lk->serio->write (lk->serio, leds_off); } /* * Try to activate extended LK401 mode. This command will * only work with a LK401 keyboard and grants access to * LAlt, RAlt, RCompose and RShift. */ lk->serio->write (lk->serio, LK_CMD_ENABLE_LK401); /* Set all keys to UPDOWN mode */ for (division = 1; division <= 14; division++) lk->serio->write (lk->serio, LK_CMD_SET_MODE (LK_MODE_UPDOWN, division)); /* Enable bell and set volume */ lk->serio->write (lk->serio, LK_CMD_ENABLE_BELL); lk->serio->write (lk->serio, volume_to_hw (lk->bell_volume)); /* Enable/disable keyclick (and possibly set volume) */ if (test_bit (SND_CLICK, lk->dev->snd)) { lk->serio->write (lk->serio, LK_CMD_ENABLE_KEYCLICK); lk->serio->write (lk->serio, volume_to_hw (lk->keyclick_volume)); lk->serio->write (lk->serio, LK_CMD_ENABLE_CTRCLICK); lk->serio->write (lk->serio, volume_to_hw (lk->ctrlclick_volume)); } else { lk->serio->write (lk->serio, LK_CMD_DISABLE_KEYCLICK); lk->serio->write (lk->serio, LK_CMD_DISABLE_CTRCLICK); } /* Sound the bell if needed */ if (test_bit (SND_BELL, lk->dev->snd)) lk->serio->write (lk->serio, LK_CMD_SOUND_BELL); }
/* * lkkbd_event() handles events from the input module. */ static int lkkbd_event (struct input_dev *dev, unsigned int type, unsigned int code, int value) { struct lkkbd *lk = input_get_drvdata (dev); unsigned char leds_on = 0; unsigned char leds_off = 0; switch (type) { case EV_LED: CHECK_LED (lk, leds_on, leds_off, LED_CAPSL, LK_LED_SHIFTLOCK); CHECK_LED (lk, leds_on, leds_off, LED_COMPOSE, LK_LED_COMPOSE); CHECK_LED (lk, leds_on, leds_off, LED_SCROLLL, LK_LED_SCROLLLOCK); CHECK_LED (lk, leds_on, leds_off, LED_SLEEP, LK_LED_WAIT); if (leds_on != 0) { lk->serio->write (lk->serio, LK_CMD_LED_ON); lk->serio->write (lk->serio, leds_on); } if (leds_off != 0) { lk->serio->write (lk->serio, LK_CMD_LED_OFF); lk->serio->write (lk->serio, leds_off); } return 0; case EV_SND: switch (code) { case SND_CLICK: if (value == 0) { DBG ("%s: Deactivating key clicks\n", __FUNCTION__); lk->serio->write (lk->serio, LK_CMD_DISABLE_KEYCLICK); lk->serio->write (lk->serio, LK_CMD_DISABLE_CTRCLICK); } else { DBG ("%s: Activating key clicks\n", __FUNCTION__); lk->serio->write (lk->serio, LK_CMD_ENABLE_KEYCLICK); lk->serio->write (lk->serio, volume_to_hw (lk->keyclick_volume)); lk->serio->write (lk->serio, LK_CMD_ENABLE_CTRCLICK); lk->serio->write (lk->serio, volume_to_hw (lk->ctrlclick_volume)); } return 0; case SND_BELL: if (value != 0) lk->serio->write (lk->serio, LK_CMD_SOUND_BELL); return 0; } break; default: printk (KERN_ERR "%s (): Got unknown type %d, code %d, value %d\n", __FUNCTION__, type, code, value); } return -1; }
static void lkkbd_toggle_leds(struct lkkbd *lk) { struct serio *serio = lk->serio; unsigned char leds_on = 0; unsigned char leds_off = 0; CHECK_LED(lk, leds_on, leds_off, LED_CAPSL, LK_LED_SHIFTLOCK); CHECK_LED(lk, leds_on, leds_off, LED_COMPOSE, LK_LED_COMPOSE); CHECK_LED(lk, leds_on, leds_off, LED_SCROLLL, LK_LED_SCROLLLOCK); CHECK_LED(lk, leds_on, leds_off, LED_SLEEP, LK_LED_WAIT); if (leds_on != 0) { serio_write(serio, LK_CMD_LED_ON); serio_write(serio, leds_on); } if (leds_off != 0) { serio_write(serio, LK_CMD_LED_OFF); serio_write(serio, leds_off); } }
static void inka_digio_set_output(unsigned int state, int which) { volatile struct mpc5xxx_gpio *gpio = (struct mpc5xxx_gpio *)MPC5XXX_GPIO; if (which == 0) { /* other */ CHECK_LED(0); CHECK_LED(1); CHECK_LED(2); CHECK_LED(3); CHECK_LED(4); CHECK_LED(5); } else { if (which == 1) { /* drawer1 */ if (state) { clrbits_be32(&gpio->simple_dvo, 0x1000); udelay(1); setbits_be32(&gpio->simple_dvo, 0x1000); } else { setbits_be32(&gpio->simple_dvo, 0x1000); udelay(1); clrbits_be32(&gpio->simple_dvo, 0x1000); } } if (which == 2) { /* drawer 2 */ if (state) { clrbits_be32(&gpio->simple_dvo, 0x2000); udelay(1); setbits_be32(&gpio->simple_dvo, 0x2000); } else { setbits_be32(&gpio->simple_dvo, 0x2000); udelay(1); clrbits_be32(&gpio->simple_dvo, 0x2000); } } } udelay(1); }