Lines Matching refs:sunkbd
71 struct sunkbd { struct
93 struct sunkbd *sunkbd = serio_get_drvdata(serio); in sunkbd_interrupt() argument
95 if (sunkbd->reset <= -1) { in sunkbd_interrupt()
100 sunkbd->reset = data; in sunkbd_interrupt()
101 wake_up_interruptible(&sunkbd->wait); in sunkbd_interrupt()
105 if (sunkbd->layout == -1) { in sunkbd_interrupt()
106 sunkbd->layout = data; in sunkbd_interrupt()
107 wake_up_interruptible(&sunkbd->wait); in sunkbd_interrupt()
114 schedule_work(&sunkbd->tq); in sunkbd_interrupt()
115 sunkbd->reset = -1; in sunkbd_interrupt()
119 sunkbd->layout = -1; in sunkbd_interrupt()
126 if (!sunkbd->enabled) in sunkbd_interrupt()
129 if (sunkbd->keycode[data & SUNKBD_KEY]) { in sunkbd_interrupt()
130 input_report_key(sunkbd->dev, in sunkbd_interrupt()
131 sunkbd->keycode[data & SUNKBD_KEY], in sunkbd_interrupt()
133 input_sync(sunkbd->dev); in sunkbd_interrupt()
152 struct sunkbd *sunkbd = input_get_drvdata(dev); in sunkbd_event() local
158 serio_write(sunkbd->serio, SUNKBD_CMD_SETLED); in sunkbd_event()
159 serio_write(sunkbd->serio, in sunkbd_event()
171 serio_write(sunkbd->serio, SUNKBD_CMD_NOCLICK - value); in sunkbd_event()
175 serio_write(sunkbd->serio, SUNKBD_CMD_BELLOFF - value); in sunkbd_event()
190 static int sunkbd_initialize(struct sunkbd *sunkbd) in sunkbd_initialize() argument
192 sunkbd->reset = -2; in sunkbd_initialize()
193 serio_write(sunkbd->serio, SUNKBD_CMD_RESET); in sunkbd_initialize()
194 wait_event_interruptible_timeout(sunkbd->wait, sunkbd->reset >= 0, HZ); in sunkbd_initialize()
195 if (sunkbd->reset < 0) in sunkbd_initialize()
198 sunkbd->type = sunkbd->reset; in sunkbd_initialize()
200 if (sunkbd->type == 4) { /* Type 4 keyboard */ in sunkbd_initialize()
201 sunkbd->layout = -2; in sunkbd_initialize()
202 serio_write(sunkbd->serio, SUNKBD_CMD_LAYOUT); in sunkbd_initialize()
203 wait_event_interruptible_timeout(sunkbd->wait, in sunkbd_initialize()
204 sunkbd->layout >= 0, HZ / 4); in sunkbd_initialize()
205 if (sunkbd->layout < 0) in sunkbd_initialize()
207 if (sunkbd->layout & SUNKBD_LAYOUT_5_MASK) in sunkbd_initialize()
208 sunkbd->type = 5; in sunkbd_initialize()
221 struct sunkbd *sunkbd = container_of(work, struct sunkbd, tq); in sunkbd_reinit() local
223 wait_event_interruptible_timeout(sunkbd->wait, sunkbd->reset >= 0, HZ); in sunkbd_reinit()
225 serio_write(sunkbd->serio, SUNKBD_CMD_SETLED); in sunkbd_reinit()
226 serio_write(sunkbd->serio, in sunkbd_reinit()
227 (!!test_bit(LED_CAPSL, sunkbd->dev->led) << 3) | in sunkbd_reinit()
228 (!!test_bit(LED_SCROLLL, sunkbd->dev->led) << 2) | in sunkbd_reinit()
229 (!!test_bit(LED_COMPOSE, sunkbd->dev->led) << 1) | in sunkbd_reinit()
230 !!test_bit(LED_NUML, sunkbd->dev->led)); in sunkbd_reinit()
231 serio_write(sunkbd->serio, in sunkbd_reinit()
232 SUNKBD_CMD_NOCLICK - !!test_bit(SND_CLICK, sunkbd->dev->snd)); in sunkbd_reinit()
233 serio_write(sunkbd->serio, in sunkbd_reinit()
234 SUNKBD_CMD_BELLOFF - !!test_bit(SND_BELL, sunkbd->dev->snd)); in sunkbd_reinit()
237 static void sunkbd_enable(struct sunkbd *sunkbd, bool enable) in sunkbd_enable() argument
239 serio_pause_rx(sunkbd->serio); in sunkbd_enable()
240 sunkbd->enabled = enable; in sunkbd_enable()
241 serio_continue_rx(sunkbd->serio); in sunkbd_enable()
251 struct sunkbd *sunkbd; in sunkbd_connect() local
256 sunkbd = kzalloc(sizeof(struct sunkbd), GFP_KERNEL); in sunkbd_connect()
258 if (!sunkbd || !input_dev) in sunkbd_connect()
261 sunkbd->serio = serio; in sunkbd_connect()
262 sunkbd->dev = input_dev; in sunkbd_connect()
263 init_waitqueue_head(&sunkbd->wait); in sunkbd_connect()
264 INIT_WORK(&sunkbd->tq, sunkbd_reinit); in sunkbd_connect()
265 snprintf(sunkbd->phys, sizeof(sunkbd->phys), "%s/input0", serio->phys); in sunkbd_connect()
267 serio_set_drvdata(serio, sunkbd); in sunkbd_connect()
273 if (sunkbd_initialize(sunkbd) < 0) { in sunkbd_connect()
278 snprintf(sunkbd->name, sizeof(sunkbd->name), in sunkbd_connect()
279 "Sun Type %d keyboard", sunkbd->type); in sunkbd_connect()
280 memcpy(sunkbd->keycode, sunkbd_keycode, sizeof(sunkbd->keycode)); in sunkbd_connect()
282 input_dev->name = sunkbd->name; in sunkbd_connect()
283 input_dev->phys = sunkbd->phys; in sunkbd_connect()
286 input_dev->id.product = sunkbd->type; in sunkbd_connect()
290 input_set_drvdata(input_dev, sunkbd); in sunkbd_connect()
300 input_dev->keycode = sunkbd->keycode; in sunkbd_connect()
304 __set_bit(sunkbd->keycode[i], input_dev->keybit); in sunkbd_connect()
307 sunkbd_enable(sunkbd, true); in sunkbd_connect()
309 err = input_register_device(sunkbd->dev); in sunkbd_connect()
315 fail4: sunkbd_enable(sunkbd, false); in sunkbd_connect()
319 kfree(sunkbd); in sunkbd_connect()
329 struct sunkbd *sunkbd = serio_get_drvdata(serio); in sunkbd_disconnect() local
331 sunkbd_enable(sunkbd, false); in sunkbd_disconnect()
332 input_unregister_device(sunkbd->dev); in sunkbd_disconnect()
335 kfree(sunkbd); in sunkbd_disconnect()