Lines Matching refs:adi

104 struct adi {  struct
125 struct adi adi[2]; argument
136 struct adi *adi = port->adi; in adi_read_packet() local
143 adi[i].ret = -1; in adi_read_packet()
159 if ((w & 0x30) < 0x30 && adi[i].ret < ADI_MAX_LENGTH && t[i] > 0) { in adi_read_packet()
160 adi[i].data[++adi[i].ret] = w; in adi_read_packet()
180 struct adi *adi = port->adi; in adi_move_bits() local
182 adi[0].idx = adi[1].idx = 0; in adi_move_bits()
184 if (adi[0].ret <= 0 || adi[1].ret <= 0) return; in adi_move_bits()
185 if (adi[0].data[0] & 0x20 || ~adi[1].data[0] & 0x20) return; in adi_move_bits()
187 for (i = 1; i <= adi[1].ret; i++) in adi_move_bits()
188 adi[0].data[((length - 1) >> 1) + i + 1] = adi[1].data[i]; in adi_move_bits()
190 adi[0].ret += adi[1].ret; in adi_move_bits()
191 adi[1].ret = -1; in adi_move_bits()
198 static inline int adi_get_bits(struct adi *adi, int count) in adi_get_bits() argument
202 if ((adi->idx += count) > adi->ret) return 0; in adi_get_bits()
204 bits |= ((adi->data[adi->idx - i] >> 5) & 1) << i; in adi_get_bits()
212 static int adi_decode(struct adi *adi) in adi_decode() argument
214 struct input_dev *dev = adi->dev; in adi_decode()
215 char *abs = adi->abs; in adi_decode()
216 short *key = adi->key; in adi_decode()
219 if (adi->ret < adi->length || adi->id != (adi_get_bits(adi, 4) | (adi_get_bits(adi, 4) << 4))) in adi_decode()
222 for (i = 0; i < adi->axes10; i++) in adi_decode()
223 input_report_abs(dev, *abs++, adi_get_bits(adi, 10)); in adi_decode()
225 for (i = 0; i < adi->axes8; i++) in adi_decode()
226 input_report_abs(dev, *abs++, adi_get_bits(adi, 8)); in adi_decode()
228 for (i = 0; i < adi->buttons && i < 63; i++) { in adi_decode()
229 if (i == adi->pad) { in adi_decode()
230 t = adi_get_bits(adi, 4); in adi_decode()
234 input_report_key(dev, *key++, adi_get_bits(adi, 1)); in adi_decode()
237 for (i = 0; i < adi->hats; i++) { in adi_decode()
238 if ((t = adi_get_bits(adi, 4)) > 8) t = 0; in adi_decode()
243 for (i = 63; i < adi->buttons; i++) in adi_decode()
244 input_report_key(dev, *key++, adi_get_bits(adi, 1)); in adi_decode()
261 adi_move_bits(port, port->adi[0].length); in adi_read()
264 if (port->adi[i].length) in adi_read()
265 result |= adi_decode(port->adi + i); in adi_read()
326 static void adi_id_decode(struct adi *adi, struct adi_port *port) in adi_id_decode() argument
330 if (adi->ret < ADI_MIN_ID_LENGTH) /* Minimum ID packet length */ in adi_id_decode()
333 if (adi->ret < (t = adi_get_bits(adi, 10))) { in adi_id_decode()
334 printk(KERN_WARNING "adi: Short ID packet: reported: %d != read: %d\n", t, adi->ret); in adi_id_decode()
338 adi->id = adi_get_bits(adi, 4) | (adi_get_bits(adi, 4) << 4); in adi_id_decode()
340 if ((t = adi_get_bits(adi, 4)) & ADI_FLAG_HAT) adi->hats++; in adi_id_decode()
342 adi->length = adi_get_bits(adi, 10); in adi_id_decode()
344 if (adi->length >= ADI_MAX_LENGTH || adi->length < ADI_MIN_LENGTH) { in adi_id_decode()
345 printk(KERN_WARNING "adi: Bad data packet length (%d).\n", adi->length); in adi_id_decode()
346 adi->length = 0; in adi_id_decode()
350 adi->axes8 = adi_get_bits(adi, 4); in adi_id_decode()
351 adi->buttons = adi_get_bits(adi, 6); in adi_id_decode()
353 if (adi_get_bits(adi, 6) != 8 && adi->hats) { in adi_id_decode()
355 adi->length = 0; in adi_id_decode()
359 adi->buttons += adi_get_bits(adi, 6); in adi_id_decode()
360 adi->hats += adi_get_bits(adi, 4); in adi_id_decode()
362 i = adi_get_bits(adi, 4); in adi_id_decode()
365 adi->axes10 = adi->axes8 - i; in adi_id_decode()
366 adi->axes8 = i; in adi_id_decode()
369 t = adi_get_bits(adi, 4); in adi_id_decode()
372 adi->cname[i] = adi_get_bits(adi, 8); in adi_id_decode()
373 adi->cname[i] = 0; in adi_id_decode()
375 t = 8 + adi->buttons + adi->axes10 * 10 + adi->axes8 * 8 + adi->hats * 4; in adi_id_decode()
376 if (adi->length != t && adi->length != t + (t & 1)) { in adi_id_decode()
377 printk(KERN_WARNING "adi: Expected length %d != data length %d\n", t, adi->length); in adi_id_decode()
378 adi->length = 0; in adi_id_decode()
382 switch (adi->id) { in adi_id_decode()
384 adi->pad = 4; in adi_id_decode()
385 adi->buttons -= 4; in adi_id_decode()
388 adi->pad = 0; in adi_id_decode()
389 adi->buttons -= 4; in adi_id_decode()
392 adi->pad = -1; in adi_id_decode()
397 static int adi_init_input(struct adi *adi, struct adi_port *port, int half) in adi_init_input() argument
403 adi->dev = input_dev = input_allocate_device(); in adi_init_input()
407 t = adi->id < ADI_ID_MAX ? adi->id : ADI_ID_MAX; in adi_init_input()
409 snprintf(buf, ADI_MAX_PHYS_LENGTH, adi_names[t], adi->id); in adi_init_input()
410 snprintf(adi->name, ADI_MAX_NAME_LENGTH, "Logitech %s [%s]", buf, adi->cname); in adi_init_input()
411 snprintf(adi->phys, ADI_MAX_PHYS_LENGTH, "%s/input%d", port->gameport->phys, half); in adi_init_input()
413 adi->abs = adi_abs[t]; in adi_init_input()
414 adi->key = adi_key[t]; in adi_init_input()
416 input_dev->name = adi->name; in adi_init_input()
417 input_dev->phys = adi->phys; in adi_init_input()
420 input_dev->id.product = adi->id; in adi_init_input()
431 for (i = 0; i < adi->axes10 + adi->axes8 + (adi->hats + (adi->pad != -1)) * 2; i++) in adi_init_input()
432 set_bit(adi->abs[i], input_dev->absbit); in adi_init_input()
434 for (i = 0; i < adi->buttons; i++) in adi_init_input()
435 set_bit(adi->key[i], input_dev->keybit); in adi_init_input()
440 static void adi_init_center(struct adi *adi) in adi_init_center() argument
444 if (!adi->length) in adi_init_center()
447 for (i = 0; i < adi->axes10 + adi->axes8 + (adi->hats + (adi->pad != -1)) * 2; i++) { in adi_init_center()
449 t = adi->abs[i]; in adi_init_center()
450 x = input_abs_get_val(adi->dev, t); in adi_init_center()
452 if (t == ABS_THROTTLE || t == ABS_RUDDER || adi->id == ADI_ID_WGPE) in adi_init_center()
453 x = i < adi->axes10 ? 512 : 128; in adi_init_center()
455 if (i < adi->axes10) in adi_init_center()
456 input_set_abs_params(adi->dev, t, 64, x * 2 - 64, 2, 16); in adi_init_center()
457 else if (i < adi->axes10 + adi->axes8) in adi_init_center()
458 input_set_abs_params(adi->dev, t, 48, x * 2 - 48, 1, 16); in adi_init_center()
460 input_set_abs_params(adi->dev, t, -1, 1, 0, 0); in adi_init_center()
489 if (port->adi[0].ret >= ADI_MIN_LEN_LENGTH) in adi_connect()
490 adi_move_bits(port, adi_get_bits(port->adi, 10)); in adi_connect()
493 adi_id_decode(port->adi + i, port); in adi_connect()
495 if (!port->adi[i].length) in adi_connect()
498 err = adi_init_input(port->adi + i, port, i); in adi_connect()
503 if (!port->adi[0].length && !port->adi[1].length) { in adi_connect()
518 if (port->adi[i].length > 0) { in adi_connect()
519 adi_init_center(port->adi + i); in adi_connect()
520 err = input_register_device(port->adi[i].dev); in adi_connect()
528 if (port->adi[i].length > 0) { in adi_connect()
529 input_unregister_device(port->adi[i].dev); in adi_connect()
530 port->adi[i].dev = NULL; in adi_connect()
534 input_free_device(port->adi[i].dev); in adi_connect()
547 if (port->adi[i].length > 0) in adi_disconnect()
548 input_unregister_device(port->adi[i].dev); in adi_disconnect()