Lines Matching refs:sunkbd
75 struct sunkbd { struct
97 struct sunkbd *sunkbd = serio_get_drvdata(serio); in sunkbd_interrupt() argument
99 if (sunkbd->reset <= -1) { in sunkbd_interrupt()
104 sunkbd->reset = data; in sunkbd_interrupt()
105 wake_up_interruptible(&sunkbd->wait); in sunkbd_interrupt()
109 if (sunkbd->layout == -1) { in sunkbd_interrupt()
110 sunkbd->layout = data; in sunkbd_interrupt()
111 wake_up_interruptible(&sunkbd->wait); in sunkbd_interrupt()
118 schedule_work(&sunkbd->tq); in sunkbd_interrupt()
119 sunkbd->reset = -1; in sunkbd_interrupt()
123 sunkbd->layout = -1; in sunkbd_interrupt()
130 if (!sunkbd->enabled) in sunkbd_interrupt()
133 if (sunkbd->keycode[data & SUNKBD_KEY]) { in sunkbd_interrupt()
134 input_report_key(sunkbd->dev, in sunkbd_interrupt()
135 sunkbd->keycode[data & SUNKBD_KEY], in sunkbd_interrupt()
137 input_sync(sunkbd->dev); in sunkbd_interrupt()
156 struct sunkbd *sunkbd = input_get_drvdata(dev); in sunkbd_event() local
162 serio_write(sunkbd->serio, SUNKBD_CMD_SETLED); in sunkbd_event()
163 serio_write(sunkbd->serio, in sunkbd_event()
175 serio_write(sunkbd->serio, SUNKBD_CMD_NOCLICK - value); in sunkbd_event()
179 serio_write(sunkbd->serio, SUNKBD_CMD_BELLOFF - value); in sunkbd_event()
194 static int sunkbd_initialize(struct sunkbd *sunkbd) in sunkbd_initialize() argument
196 sunkbd->reset = -2; in sunkbd_initialize()
197 serio_write(sunkbd->serio, SUNKBD_CMD_RESET); in sunkbd_initialize()
198 wait_event_interruptible_timeout(sunkbd->wait, sunkbd->reset >= 0, HZ); in sunkbd_initialize()
199 if (sunkbd->reset < 0) in sunkbd_initialize()
202 sunkbd->type = sunkbd->reset; in sunkbd_initialize()
204 if (sunkbd->type == 4) { /* Type 4 keyboard */ in sunkbd_initialize()
205 sunkbd->layout = -2; in sunkbd_initialize()
206 serio_write(sunkbd->serio, SUNKBD_CMD_LAYOUT); in sunkbd_initialize()
207 wait_event_interruptible_timeout(sunkbd->wait, in sunkbd_initialize()
208 sunkbd->layout >= 0, HZ / 4); in sunkbd_initialize()
209 if (sunkbd->layout < 0) in sunkbd_initialize()
211 if (sunkbd->layout & SUNKBD_LAYOUT_5_MASK) in sunkbd_initialize()
212 sunkbd->type = 5; in sunkbd_initialize()
225 struct sunkbd *sunkbd = container_of(work, struct sunkbd, tq); in sunkbd_reinit() local
227 wait_event_interruptible_timeout(sunkbd->wait, sunkbd->reset >= 0, HZ); in sunkbd_reinit()
229 serio_write(sunkbd->serio, SUNKBD_CMD_SETLED); in sunkbd_reinit()
230 serio_write(sunkbd->serio, in sunkbd_reinit()
231 (!!test_bit(LED_CAPSL, sunkbd->dev->led) << 3) | in sunkbd_reinit()
232 (!!test_bit(LED_SCROLLL, sunkbd->dev->led) << 2) | in sunkbd_reinit()
233 (!!test_bit(LED_COMPOSE, sunkbd->dev->led) << 1) | in sunkbd_reinit()
234 !!test_bit(LED_NUML, sunkbd->dev->led)); in sunkbd_reinit()
235 serio_write(sunkbd->serio, in sunkbd_reinit()
236 SUNKBD_CMD_NOCLICK - !!test_bit(SND_CLICK, sunkbd->dev->snd)); in sunkbd_reinit()
237 serio_write(sunkbd->serio, in sunkbd_reinit()
238 SUNKBD_CMD_BELLOFF - !!test_bit(SND_BELL, sunkbd->dev->snd)); in sunkbd_reinit()
241 static void sunkbd_enable(struct sunkbd *sunkbd, bool enable) in sunkbd_enable() argument
243 serio_pause_rx(sunkbd->serio); in sunkbd_enable()
244 sunkbd->enabled = enable; in sunkbd_enable()
245 serio_continue_rx(sunkbd->serio); in sunkbd_enable()
255 struct sunkbd *sunkbd; in sunkbd_connect() local
260 sunkbd = kzalloc(sizeof(struct sunkbd), GFP_KERNEL); in sunkbd_connect()
262 if (!sunkbd || !input_dev) in sunkbd_connect()
265 sunkbd->serio = serio; in sunkbd_connect()
266 sunkbd->dev = input_dev; in sunkbd_connect()
267 init_waitqueue_head(&sunkbd->wait); in sunkbd_connect()
268 INIT_WORK(&sunkbd->tq, sunkbd_reinit); in sunkbd_connect()
269 snprintf(sunkbd->phys, sizeof(sunkbd->phys), "%s/input0", serio->phys); in sunkbd_connect()
271 serio_set_drvdata(serio, sunkbd); in sunkbd_connect()
277 if (sunkbd_initialize(sunkbd) < 0) { in sunkbd_connect()
282 snprintf(sunkbd->name, sizeof(sunkbd->name), in sunkbd_connect()
283 "Sun Type %d keyboard", sunkbd->type); in sunkbd_connect()
284 memcpy(sunkbd->keycode, sunkbd_keycode, sizeof(sunkbd->keycode)); in sunkbd_connect()
286 input_dev->name = sunkbd->name; in sunkbd_connect()
287 input_dev->phys = sunkbd->phys; in sunkbd_connect()
290 input_dev->id.product = sunkbd->type; in sunkbd_connect()
294 input_set_drvdata(input_dev, sunkbd); in sunkbd_connect()
304 input_dev->keycode = sunkbd->keycode; in sunkbd_connect()
308 __set_bit(sunkbd->keycode[i], input_dev->keybit); in sunkbd_connect()
311 sunkbd_enable(sunkbd, true); in sunkbd_connect()
313 err = input_register_device(sunkbd->dev); in sunkbd_connect()
319 fail4: sunkbd_enable(sunkbd, false); in sunkbd_connect()
323 kfree(sunkbd); in sunkbd_connect()
333 struct sunkbd *sunkbd = serio_get_drvdata(serio); in sunkbd_disconnect() local
335 sunkbd_enable(sunkbd, false); in sunkbd_disconnect()
336 input_unregister_device(sunkbd->dev); in sunkbd_disconnect()
339 kfree(sunkbd); in sunkbd_disconnect()