Ejemplo n.º 1
0
static int
sunkbd_attach(struct uart_softc *sc)
{

	/*
	 * Don't attach if we didn't probe the keyboard. Note that
	 * the UART is still marked as a system device in that case.
	 */
	if (sunkbd_softc.sc_sysdev == NULL) {
		device_printf(sc->sc_dev, "keyboard not present\n");
		return (0);
	}

	if (sc->sc_sysdev != NULL) {
		sunkbd_softc.sc_uart = sc;

#ifdef KBD_INSTALL_CDEV
		kbd_attach(&sunkbd_softc.sc_kbd);
#endif
		sunkbd_enable(&sunkbd_softc.sc_kbd);

		swi_add(&tty_intr_event, uart_driver_name, sunkbd_uart_intr,
		    &sunkbd_softc, SWI_TTY, INTR_TYPE_TTY, &sc->sc_softih);

		sc->sc_opened = 1;
		KBD_INIT_DONE(&sunkbd_softc.sc_kbd);
	}

	return (0);
}
Ejemplo n.º 2
0
static void sunkbd_disconnect(struct serio *serio)
{
    struct sunkbd *sunkbd = serio_get_drvdata(serio);

    sunkbd_enable(sunkbd, 0);
    input_unregister_device(sunkbd->dev);
    serio_close(serio);
    serio_set_drvdata(serio, NULL);
    kfree(sunkbd);
}
Ejemplo n.º 3
0
static int
sunkbd_attach(struct uart_softc *sc)
{

	if (sc->sc_sysdev != NULL) {
		sunkbd_softc.sc_uart = sc;

		kbd_attach(&sunkbd_softc.sc_kbd);
		sunkbd_enable(&sunkbd_softc.sc_kbd);

		swi_add(&tty_ithd, uart_driver_name, sunkbd_uart_intr,
		    &sunkbd_softc, SWI_TTY, INTR_TYPE_TTY, &sc->sc_softih);

		sc->sc_opened = 1;
	}

	return (0);
}
Ejemplo n.º 4
0
static int sunkbd_connect(struct serio *serio, struct serio_driver *drv)
{
    struct sunkbd *sunkbd;
    struct input_dev *input_dev;
    int err = -ENOMEM;
    int i;

    sunkbd = kzalloc(sizeof(struct sunkbd), GFP_KERNEL);
    input_dev = input_allocate_device();
    if (!sunkbd || !input_dev)
        goto fail1;

    sunkbd->serio = serio;
    sunkbd->dev = input_dev;
    init_waitqueue_head(&sunkbd->wait);
    INIT_WORK(&sunkbd->tq, sunkbd_reinit);
    snprintf(sunkbd->phys, sizeof(sunkbd->phys), "%s/input0", serio->phys);

    serio_set_drvdata(serio, sunkbd);

    err = serio_open(serio, drv);
    if (err)
        goto fail2;

    if (sunkbd_initialize(sunkbd) < 0) {
        err = -ENODEV;
        goto fail3;
    }

    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;
    input_dev->phys = sunkbd->phys;
    input_dev->id.bustype = BUS_RS232;
    input_dev->id.vendor  = SERIO_SUNKBD;
    input_dev->id.product = sunkbd->type;
    input_dev->id.version = 0x0100;
    input_dev->dev.parent = &serio->dev;

    input_set_drvdata(input_dev, sunkbd);

    input_dev->event = sunkbd_event;

    input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_LED) |
                          BIT_MASK(EV_SND) | BIT_MASK(EV_REP);
    input_dev->ledbit[0] = BIT_MASK(LED_CAPSL) | BIT_MASK(LED_COMPOSE) |
                           BIT_MASK(LED_SCROLLL) | BIT_MASK(LED_NUML);
    input_dev->sndbit[0] = BIT_MASK(SND_CLICK) | BIT_MASK(SND_BELL);

    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);

    sunkbd_enable(sunkbd, 1);

    err = input_register_device(sunkbd->dev);
    if (err)
        goto fail4;

    return 0;

fail4:
    sunkbd_enable(sunkbd, 0);
fail3:
    serio_close(serio);
fail2:
    serio_set_drvdata(serio, NULL);
fail1:
    input_free_device(input_dev);
    kfree(sunkbd);
    return err;
}