Lines Matching +full:abs +full:- +full:fuzz

38  * CYAPA - Cypress APA trackpad with I2C Interface driver
49 * +--------------------+------------+
53 * | Button +------------+
56 * +--------------------+............|
58 * +---------------------------------+
63 * IMPS/2 emulation - Emulates the IntelliMouse protocol.
65 * Jitter supression - Implements 2-pixel hysteresis with memory.
67 * Jump detecion - Detect jumps caused by touchpad.
69 * Two finger scrolling - Use two fingers for Z axis scrolling.
71 * Button down/2nd finger - While one finger clicks and holds down the
76 * Thumb/Button Area - The lower 15%* of the trackpad will not affect
83 * Track-pad button - Push physical button. Left 2/3rds of the pad
96 * please try to place at least one finger off-axis (a little above or
139 #define CYAPA_BUFMASK (CYAPA_BUFSIZE - 1)
182 int delta_x; /* accumulation -> report */
196 struct cyapa_fifo rfifo; /* device->host */
197 struct cyapa_fifo wfifo; /* host->device */
207 int zenabled; /* z-axis enabled (mode 1 or 2) */
237 static int cyapa_fuzz(int delta, int *fuzz);
312 mtx_lock(&sc->mutex);
319 mtx_unlock(&sc->mutex);
322 #define CYAPA_LOCK_ASSERT(sc) mtx_assert(&(sc)->mutex, MA_OWNED);
326 * with sc->mutex held (cyapa_lock(sc)).
334 if (sc->data_signal || !fifo_empty(sc, &sc->rfifo)) {
335 KNOTE_LOCKED(&sc->selinfo.si_note, 0);
336 if (sc->blocked || sc->isselect) {
337 if (sc->blocked) {
338 sc->blocked = 0;
339 wakeup(&sc->blocked);
341 if (sc->isselect) {
342 sc->isselect = 0;
343 selwakeup(&sc->selinfo);
393 --retries;
411 if (strncmp(cap->prod_ida, "CYTRA", 5) != 0) {
413 cap->prod_ida);
442 config_intrhook_disestablish(&sc->intr_hook);
449 0, 0, "cyapa-poll");
499 * 0x67 - cypress trackpad on the acer c720
523 sc->reporting_mode = 1;
531 mtx_init(&sc->mutex, "cyapa", NULL, MTX_DEF);
533 sc->dev = dev;
535 knlist_init_mtx(&sc->selinfo.si_note, &sc->mutex);
537 sc->cap_resx = ((cap.max_abs_xy_high << 4) & 0x0F00) |
539 sc->cap_resy = ((cap.max_abs_xy_high << 8) & 0x0F00) |
541 sc->cap_phyx = ((cap.phy_siz_xy_high << 4) & 0x0F00) |
543 sc->cap_phyy = ((cap.phy_siz_xy_high << 8) & 0x0F00) |
545 sc->cap_buttons = cap.buttons >> 3 &
548 device_printf(dev, "%5.5s-%6.6s-%2.2s buttons=%c%c%c res=%dx%d\n",
550 ((sc->cap_buttons & CYAPA_FNGR_LEFT) ? 'L' : '-'),
551 ((sc->cap_buttons & CYAPA_FNGR_MIDDLE) ? 'M' : '-'),
552 ((sc->cap_buttons & CYAPA_FNGR_RIGHT) ? 'R' : '-'),
553 sc->cap_resx, sc->cap_resy);
555 sc->hw.buttons = 5;
556 sc->hw.iftype = MOUSE_IF_PS2;
557 sc->hw.type = MOUSE_MOUSE;
558 sc->hw.model = MOUSE_MODEL_INTELLI;
559 sc->hw.hwid = addr;
561 sc->mode.protocol = MOUSE_PROTO_PS2;
562 sc->mode.rate = 100;
563 sc->mode.resolution = 4;
564 sc->mode.accelfactor = 1;
565 sc->mode.level = 0;
566 sc->mode.packetsize = MOUSE_PS2_PACKETSIZE;
568 sc->intr_hook.ich_func = cyapa_start;
569 sc->intr_hook.ich_arg = sc->dev;
572 sc->evdev = evdev_alloc();
573 evdev_set_name(sc->evdev, device_get_desc(sc->dev));
574 evdev_set_phys(sc->evdev, device_get_nameunit(sc->dev));
575 evdev_set_id(sc->evdev, BUS_I2C, 0, 0, 1);
576 evdev_set_flag(sc->evdev, EVDEV_FLAG_MT_STCOMPAT);
577 evdev_set_flag(sc->evdev, EVDEV_FLAG_MT_AUTOREL);
579 evdev_support_event(sc->evdev, EV_SYN);
580 evdev_support_event(sc->evdev, EV_ABS);
581 evdev_support_event(sc->evdev, EV_KEY);
582 evdev_support_prop(sc->evdev, INPUT_PROP_POINTER);
583 if (sc->cap_buttons & CYAPA_FNGR_LEFT)
584 evdev_support_key(sc->evdev, BTN_LEFT);
585 if (sc->cap_buttons & CYAPA_FNGR_RIGHT)
586 evdev_support_key(sc->evdev, BTN_RIGHT);
587 if (sc->cap_buttons & CYAPA_FNGR_MIDDLE)
588 evdev_support_key(sc->evdev, BTN_MIDDLE);
589 if (sc->cap_buttons == CYAPA_FNGR_LEFT)
590 evdev_support_prop(sc->evdev, INPUT_PROP_BUTTONPAD);
592 evdev_support_abs(sc->evdev, ABS_MT_SLOT,
593 0, CYAPA_MAX_MT - 1, 0, 0, 0);
594 evdev_support_abs(sc->evdev, ABS_MT_TRACKING_ID, -1, 15, 0, 0, 0);
595 evdev_support_abs(sc->evdev, ABS_MT_POSITION_X, 0, sc->cap_resx, 0, 0,
596 sc->cap_phyx != 0 ? sc->cap_resx / sc->cap_phyx : 0);
597 evdev_support_abs(sc->evdev, ABS_MT_POSITION_Y, 0, sc->cap_resy, 0, 0,
598 sc->cap_phyy != 0 ? sc->cap_resy / sc->cap_phyy : 0);
599 evdev_support_abs(sc->evdev, ABS_MT_PRESSURE, 0, 255, 0, 0, 0);
601 if (evdev_register(sc->evdev) != 0) {
602 mtx_destroy(&sc->mutex);
608 if (config_intrhook_establish(&sc->intr_hook) != 0) {
610 evdev_free(sc->evdev);
612 mtx_destroy(&sc->mutex);
616 sc->devnode = make_dev(&cyapa_cdevsw, unit,
619 sc->devnode->si_drv1 = sc;
633 while (sc->poll_thread_running) {
634 sc->detaching = 1;
635 mtx_sleep(&sc->detaching, &sc->mutex, PCATCH, "cyapadet", hz);
639 destroy_dev(sc->devnode);
641 knlist_clear(&sc->selinfo.si_note, 0);
642 seldrain(&sc->selinfo);
643 knlist_destroy(&sc->selinfo.si_note);
645 evdev_free(sc->evdev);
648 mtx_destroy(&sc->mutex);
663 priv->sc = dev->si_drv1;
667 cyapa_lock(priv->sc);
668 priv->sc->count++;
669 cyapa_unlock(priv->sc);
685 cyapa_lock(priv->sc);
686 priv->sc->count--;
687 cyapa_unlock(priv->sc);
701 sc = dev->si_drv1;
705 if (fifo_empty(sc, &sc->rfifo) &&
706 (sc->data_signal || sc->delta_x || sc->delta_y ||
707 sc->track_but != sc->reported_but)) {
715 sc->data_signal = 0;
716 delta_x = sc->delta_x;
717 delta_y = sc->delta_y;
718 delta_z = sc->delta_z;
721 sc->data_signal = 1;
723 if (delta_x < -256) {
724 delta_x = -256;
725 sc->data_signal = 1;
729 sc->data_signal = 1;
731 if (delta_y < -256) {
732 delta_y = -256;
733 sc->data_signal = 1;
737 sc->data_signal = 1;
739 if (delta_z < -256) {
740 delta_z = -256;
741 sc->data_signal = 1;
743 but = sc->track_but;
746 sc->delta_x -= delta_x;
747 sc->delta_y -= delta_y;
748 sc->delta_z -= delta_z;
749 sc->reported_but = but;
752 * Fuzz reduces movement jitter by introducing some
757 delta_x = cyapa_fuzz(delta_x, &sc->fuzz_x);
758 delta_y = cyapa_fuzz(delta_y, &sc->fuzz_y);
759 delta_z = cyapa_fuzz(delta_z, &sc->fuzz_z);
777 fifo_write_char(sc, &sc->rfifo, c0);
778 fifo_write_char(sc, &sc->rfifo, (uint8_t)delta_x);
779 fifo_write_char(sc, &sc->rfifo, (uint8_t)delta_y);
780 switch(sc->zenabled) {
783 fifo_write_char(sc, &sc->rfifo, (uint8_t)delta_z);
788 * (high 2 bits must be left 0). Auto-scale
789 * delta_z to fit to avoid a wrong-direction
792 while (delta_z > 7 || delta_z < -8)
795 fifo_write_char(sc, &sc->rfifo, c0);
804 /* Blocking / Non-blocking */
806 didread = (uio->uio_resid == 0);
808 while ((ioflag & IO_NDELAY) == 0 && fifo_empty(sc, &sc->rfifo)) {
809 if (sc->data_signal)
811 sc->blocked = 1;
812 error = mtx_sleep(&sc->blocked, &sc->mutex, PCATCH, "cyablk", 0);
818 while (error == 0 && uio->uio_resid &&
819 (n = fifo_ready(sc, &sc->rfifo)) > 0) {
820 if (n > uio->uio_resid)
821 n = uio->uio_resid;
822 ptr = fifo_read(sc, &sc->rfifo, 0);
828 fifo_read(sc, &sc->rfifo, n);
849 sc = dev->si_drv1;
852 * Copy data from userland. This will also cross-over the end
856 while ((n = fifo_space(sc, &sc->wfifo)) > 0 && uio->uio_resid) {
857 if (n > uio->uio_resid)
858 n = uio->uio_resid;
859 ptr = fifo_write(sc, &sc->wfifo, 0);
865 fifo_write(sc, &sc->wfifo, n);
869 cmd_completed = (fifo_ready(sc, &sc->wfifo) != 0);
870 while (fifo_ready(sc, &sc->wfifo) && cmd_completed && error == 0) {
871 if (sc->ps2_cmd == 0)
872 sc->ps2_cmd = fifo_read_char(sc, &sc->wfifo);
873 switch(sc->ps2_cmd) {
876 sc->scaling_mode = 0;
877 fifo_write_char(sc, &sc->rfifo, 0xFA);
881 sc->scaling_mode = 1;
882 fifo_write_char(sc, &sc->rfifo, 0xFA);
886 if (sc->ps2_acked == 0) {
887 sc->ps2_acked = 1;
888 fifo_write_char(sc, &sc->rfifo, 0xFA);
890 if (fifo_ready(sc, &sc->wfifo) == 0) {
894 sc->mode.resolution = fifo_read_char(sc, &sc->wfifo);
895 fifo_write_char(sc, &sc->rfifo, 0xFA);
915 if (sc->remote_mode)
917 if (sc->reporting_mode)
919 if (sc->scaling_mode)
921 if (sc->track_but & CYAPA_FNGR_LEFT)
923 if (sc->track_but & CYAPA_FNGR_MIDDLE)
925 if (sc->track_but & CYAPA_FNGR_RIGHT)
927 fifo_write_char(sc, &sc->rfifo, 0xFA);
928 fifo_write_char(sc, &sc->rfifo, c0);
929 fifo_write_char(sc, &sc->rfifo, 0x00);
930 fifo_write_char(sc, &sc->rfifo, 100);
934 sc->remote_mode = 0;
935 fifo_write_char(sc, &sc->rfifo, 0xFA);
936 sc->delta_x = 0;
937 sc->delta_y = 0;
938 sc->delta_z = 0;
945 fifo_write_char(sc, &sc->rfifo, 0xFA);
946 sc->data_signal = 1;
950 fifo_write_char(sc, &sc->rfifo, 0xFA);
954 fifo_write_char(sc, &sc->rfifo, 0xFA);
958 sc->remote_mode = 1;
959 fifo_write_char(sc, &sc->rfifo, 0xFA);
960 sc->delta_x = 0;
961 sc->delta_y = 0;
962 sc->delta_z = 0;
968 * If we send 0x00 - normal PS/2 mouse, no Z-axis
970 * If we send 0x03 - Intellimouse, data packet has
974 * If we send 0x04 - Now includes z-axis and the
977 fifo_write_char(sc, &sc->rfifo, 0xFA);
978 switch(sc->zenabled) {
980 fifo_write_char(sc, &sc->rfifo, 0x03);
983 fifo_write_char(sc, &sc->rfifo, 0x04);
986 fifo_write_char(sc, &sc->rfifo, 0x00);
989 sc->delta_x = 0;
990 sc->delta_y = 0;
991 sc->delta_z = 0;
999 if (sc->ps2_acked == 0) {
1000 sc->ps2_acked = 1;
1001 fifo_write_char(sc, &sc->rfifo, 0xFA);
1003 if (fifo_ready(sc, &sc->wfifo) == 0) {
1007 sc->mode.rate = fifo_read_char(sc, &sc->wfifo);
1008 fifo_write_char(sc, &sc->rfifo, 0xFA);
1017 if (sc->zenabled == 0 && sc->mode.rate == 200)
1018 sc->zenabled = -1;
1019 else if (sc->zenabled == -1 && sc->mode.rate == 100)
1020 sc->zenabled = -2;
1021 else if (sc->zenabled == -1 && sc->mode.rate == 200)
1022 sc->zenabled = -3;
1023 else if (sc->zenabled == -2 && sc->mode.rate == 80)
1024 sc->zenabled = 1; /* z-axis mode */
1025 else if (sc->zenabled == -3 && sc->mode.rate == 80)
1026 sc->zenabled = 2; /* z-axis+but4/5 */
1027 if (sc->mode.level)
1028 sc->zenabled = 1;
1032 fifo_write_char(sc, &sc->rfifo, 0xFA);
1033 sc->reporting_mode = 1;
1040 fifo_write_char(sc, &sc->rfifo, 0xFA);
1041 sc->reporting_mode = 1;
1050 fifo_write_char(sc, &sc->rfifo, 0xFA);
1051 sc->mode.rate = 100;
1052 sc->mode.resolution = 4;
1053 sc->scaling_mode = 0;
1054 sc->reporting_mode = 1;
1055 sc->remote_mode = 0;
1056 sc->delta_x = 0;
1057 sc->delta_y = 0;
1058 sc->delta_z = 0;
1068 fifo_write_char(sc, &sc->rfifo, 0xFA);
1069 sc->data_signal = 1;
1075 fifo_reset(sc, &sc->rfifo); /* should we do this? */
1076 fifo_reset(sc, &sc->wfifo); /* should we do this? */
1077 fifo_write_char(sc, &sc->rfifo, 0xFA);
1078 sc->delta_x = 0;
1079 sc->delta_y = 0;
1080 sc->delta_z = 0;
1081 sc->zenabled = 0;
1082 sc->mode.level = 0;
1085 printf("unknown command %02x\n", sc->ps2_cmd);
1089 sc->ps2_cmd = 0;
1090 sc->ps2_acked = 0;
1095 if (error == 0 && (cmd_completed || uio->uio_resid))
1115 sc = dev->si_drv1;
1117 switch(kn->kn_filter) {
1119 kn->kn_fop = &cyapa_filtops;
1120 kn->kn_hook = (void *)sc;
1125 knlist = &sc->selinfo.si_note;
1137 sc = dev->si_drv1;
1142 if (sc->data_signal || !fifo_empty(sc, &sc->rfifo))
1145 sc->isselect = 1;
1146 selrecord(td, &sc->selinfo);
1160 sc = (struct cyapa_softc *)kn->kn_hook;
1162 knlist = &sc->selinfo.si_note;
1172 sc = (struct cyapa_softc *)kn->kn_hook;
1175 ready = fifo_ready(sc, &sc->rfifo) || sc->data_signal;
1187 sc = dev->si_drv1;
1193 *(mousehw_t *)data = sc->hw;
1194 if (sc->mode.level == 0)
1195 ((mousehw_t *)data)->model = MOUSE_MODEL_GENERIC;
1199 *(mousemode_t *)data = sc->mode;
1200 ((mousemode_t *)data)->resolution =
1201 MOUSE_RES_LOW - sc->mode.resolution;
1202 switch (sc->mode.level) {
1204 ((mousemode_t *)data)->protocol = MOUSE_PROTO_PS2;
1205 ((mousemode_t *)data)->packetsize =
1209 ((mousemode_t *)data)->protocol = MOUSE_PROTO_PS2;
1210 ((mousemode_t *)data)->packetsize =
1217 *(int *)data = sc->mode.level;
1226 sc->mode.level = *(int *)data ? 2 : 0;
1227 sc->zenabled = sc->mode.level ? 1 : 0;
1261 bus = device_get_parent(sc->dev);
1264 sc->poll_thread_running = 1;
1266 while (!sc->detaching) {
1268 error = iicbus_request_bus(bus, sc->dev, IIC_WAIT);
1270 error = cyapa_read_bytes(sc->dev, CMD_DEV_STATUS,
1277 * For some reason the device can crap-out. If it
1283 (unsigned)(ticks - last_reset) > TIME_TO_RESET)) {
1286 init_device(sc->dev, NULL, 2);
1288 iicbus_release_bus(bus, sc->dev);
1291 ++sc->poll_ticks;
1293 if (sc->count == 0) {
1323 sc->poll_thread_running = 0;
1347 thumbarea_begin = sc->cap_resy -
1348 ((sc->cap_resy * cyapa_thumbarea_percent) / 100);
1355 if ((regs->stat & CYAPA_STAT_RUNNING) == 0) {
1356 regs->fngr = 0;
1360 nfingers = CYAPA_FNGR_NUMFINGERS(regs->fngr);
1365 regs->stat,
1366 ((regs->fngr & CYAPA_FNGR_LEFT) ? 'L' : '-'),
1367 ((regs->fngr & CYAPA_FNGR_MIDDLE) ? 'M' : '-'),
1368 ((regs->fngr & CYAPA_FNGR_RIGHT) ? 'R' : '-'),
1376 sc->evdev, regs->touch[i].id);
1377 if (slot == -1) {
1380 regs->touch[i].id);
1383 evdev_push_abs(sc->evdev, ABS_MT_SLOT, slot);
1384 evdev_push_abs(sc->evdev, ABS_MT_TRACKING_ID,
1385 regs->touch[i].id);
1386 evdev_push_abs(sc->evdev, ABS_MT_POSITION_X,
1388 evdev_push_abs(sc->evdev, ABS_MT_POSITION_Y,
1390 evdev_push_abs(sc->evdev, ABS_MT_PRESSURE,
1393 if (sc->cap_buttons & CYAPA_FNGR_LEFT)
1394 evdev_push_key(sc->evdev, BTN_LEFT,
1395 regs->fngr & CYAPA_FNGR_LEFT);
1396 if (sc->cap_buttons & CYAPA_FNGR_RIGHT)
1397 evdev_push_key(sc->evdev, BTN_RIGHT,
1398 regs->fngr & CYAPA_FNGR_RIGHT);
1399 if (sc->cap_buttons & CYAPA_FNGR_MIDDLE)
1400 evdev_push_key(sc->evdev, BTN_MIDDLE,
1401 regs->fngr & CYAPA_FNGR_MIDDLE);
1402 evdev_sync(sc->evdev);
1413 regs->touch[i].id);
1417 --afingers;
1419 regs->touch[i] = regs->touch[i+1];
1434 * Track timing for finger-downs. Used to detect false-3-finger
1435 * button-down.
1441 if (sc->track_nfingers == 0)
1442 sc->finger1_ticks = sc->poll_ticks;
1445 if (sc->track_nfingers <= 0)
1446 sc->finger1_ticks = sc->poll_ticks;
1447 if (sc->track_nfingers <= 1)
1448 sc->finger2_ticks = sc->poll_ticks;
1452 if (sc->track_nfingers <= 0)
1453 sc->finger1_ticks = sc->poll_ticks;
1454 if (sc->track_nfingers <= 1)
1455 sc->finger2_ticks = sc->poll_ticks;
1456 if (sc->track_nfingers <= 2)
1457 sc->finger3_ticks = sc->poll_ticks;
1460 newfinger = sc->track_nfingers < afingers;
1461 lessfingers = sc->track_nfingers > afingers;
1462 sc->track_nfingers = afingers;
1468 click_x = sc->track_x;
1469 click_y = sc->track_y;
1470 sc->track_x = -1;
1471 sc->track_y = -1;
1472 sc->track_z = -1;
1473 sc->fuzz_x = 0;
1474 sc->fuzz_y = 0;
1475 sc->fuzz_z = 0;
1476 sc->touch_x = -1;
1477 sc->touch_y = -1;
1478 sc->touch_z = -1;
1479 sc->track_id = -1;
1480 sc->track_but = 0;
1494 if (sc->track_id == regs->touch[i].id)
1499 sc->track_x = -1;
1500 sc->track_y = -1;
1501 sc->track_z = -1;
1507 sc->track_id = regs->touch[i].id;
1509 else if ((sc->track_but ||
1512 j = regs->touch[0].id == sc->track_id ? 1 : 0;
1515 sc->track_x = -1;
1516 sc->track_y = -1;
1517 sc->track_z = -1;
1518 sc->track_id = regs->touch[i].id;
1523 /* Two finger scrolling - reset after timeout */
1524 if (sc->track_z != -1 && afingers != 2 &&
1525 (sc->poll_ticks - sc->track_z_ticks) > cyapa_scroll_stick_ticks) {
1526 sc->track_z = -1;
1527 sc->track_z_ticks = 0;
1531 if (!(regs->fngr & CYAPA_FNGR_LEFT) &&
1532 ((afingers && sc->track_z != -1) ||
1535 if (afingers == 2 && (sc->poll_ticks - sc->finger2_ticks)
1539 sc->delta_z += z / ZSCALE - sc->track_z;
1540 if (sc->track_z == -1) {
1541 sc->delta_z = 0;
1543 if (sc->touch_z == -1)
1544 sc->touch_z = z; /* not used atm */
1545 sc->track_z = z / ZSCALE;
1546 sc->track_z_ticks = sc->poll_ticks;
1554 if (sc->track_x != -1 && sc->track_y < thumbarea_begin &&
1555 (afingers > 1 || (sc->poll_ticks - sc->finger1_ticks)
1557 sc->delta_x += x - sc->track_x;
1558 sc->delta_y -= y - sc->track_y;
1559 if (sc->delta_x > sc->cap_resx)
1560 sc->delta_x = sc->cap_resx;
1561 if (sc->delta_x < -sc->cap_resx)
1562 sc->delta_x = -sc->cap_resx;
1563 if (sc->delta_y > sc->cap_resy)
1564 sc->delta_y = sc->cap_resy;
1565 if (sc->delta_y < -sc->cap_resy)
1566 sc->delta_y = -sc->cap_resy;
1568 if (abs(sc->delta_y) > sc->cap_resy / 2 ||
1569 abs(sc->delta_x) > sc->cap_resx / 2) {
1572 sc->delta_x, sc->delta_y);
1573 sc->delta_x = sc->delta_y = 0;
1576 if (sc->touch_x == -1) {
1577 sc->touch_x = x;
1578 sc->touch_y = y;
1580 sc->track_x = x;
1581 sc->track_y = y;
1586 afingers == 0 && sc->poll_ticks - sc->finger1_ticks
1588 sc->poll_ticks - sc->finger1_ticks < cyapa_tapclick_max_ticks);
1590 if (regs->fngr & CYAPA_FNGR_LEFT || is_tapclick) {
1591 if (sc->track_but) {
1592 but = sc->track_but;
1594 if (click_x < sc->cap_resx * 2 / 3)
1596 else if (click_y < sc->cap_resy / 2)
1601 if (click_x < sc->cap_resx * 2 / 3 ||
1604 else if (click_y < sc->cap_resy / 2 &&
1620 sc->track_but = but;
1621 if (sc->delta_x || sc->delta_y || sc->delta_z ||
1622 sc->track_but != sc->reported_but) {
1623 sc->active_tick = ticks;
1624 if (sc->remote_mode == 0 && sc->reporting_mode)
1625 sc->data_signal = 1;
1627 } else if ((unsigned)(ticks - sc->active_tick) >= TIME_TO_IDLE) {
1628 sc->active_tick = ticks - TIME_TO_IDLE; /* prevent overflow */
1637 printf("%i >> %i << %i\n", isidle, sc->track_id, sc->delta_y);
1648 bus = device_get_parent(sc->dev);
1649 error = iicbus_request_bus(bus, sc->dev, IIC_WAIT);
1651 error = cyapa_read_bytes(sc->dev, CMD_POWER_MODE,
1655 error = cyapa_write_bytes(sc->dev, CMD_POWER_MODE,
1658 iicbus_release_bus(bus, sc->dev);
1667 * Returns non-zero if the fifo is empty
1675 return (fifo->rindex == fifo->windex);
1689 n = CYAPA_BUFSIZE - (fifo->rindex & CYAPA_BUFMASK);
1690 if (n > (size_t)(fifo->windex - fifo->rindex))
1691 n = (size_t)(fifo->windex - fifo->rindex);
1708 if (n > (CYAPA_BUFSIZE - (fifo->rindex & CYAPA_BUFMASK))) {
1710 return (fifo->buf);
1712 ptr = fifo->buf + (fifo->rindex & CYAPA_BUFMASK);
1713 fifo->rindex += n;
1725 if (fifo->rindex == fifo->windex) {
1729 c = fifo->buf[fifo->rindex & CYAPA_BUFMASK];
1730 ++fifo->rindex;
1746 if (fifo->windex - fifo->rindex < CYAPA_BUFSIZE) {
1747 fifo->buf[fifo->windex & CYAPA_BUFMASK] = c;
1748 ++fifo->windex;
1763 n = CYAPA_BUFSIZE - (fifo->windex & CYAPA_BUFMASK);
1764 if (n > (size_t)(CYAPA_BUFSIZE - (fifo->windex - fifo->rindex)))
1765 n = (size_t)(CYAPA_BUFSIZE - (fifo->windex - fifo->rindex));
1776 ptr = fifo->buf + (fifo->windex & CYAPA_BUFMASK);
1777 fifo->windex += n;
1788 fifo->rindex = 0;
1789 fifo->windex = 0;
1793 * Fuzz handling
1798 int fuzz;
1800 fuzz = *fuzzp;
1801 if (fuzz >= 0 && delta < 0) {
1803 --fuzz;
1804 } else if (fuzz <= 0 && delta > 0) {
1805 --delta;
1806 ++fuzz;
1808 *fuzzp = fuzz;