Lines Matching refs:psmouse

38 #include "psmouse.h"
124 static int hgpk_discard_decay_hack(struct psmouse *psmouse, int x, int y)
126 struct hgpk_data *priv = psmouse->private;
136 psmouse_warn(psmouse, "detected %dpx jump in x\n", x);
139 psmouse_warn(psmouse, "detected secondary %dpx jump in x\n", x);
151 psmouse_warn(psmouse, "detected %dpx jump in y\n", y);
154 psmouse_warn(psmouse, "detected secondary %dpx jump in y\n", y);
168 psmouse_warn(psmouse, "scheduling recalibration\n");
169 psmouse_queue_work(psmouse, &priv->recalib_wq,
185 static void hgpk_reset_hack_state(struct psmouse *psmouse)
187 struct hgpk_data *priv = psmouse->private;
211 static void hgpk_spewing_hack(struct psmouse *psmouse,
214 struct hgpk_data *priv = psmouse->private;
260 psmouse_warn(psmouse, "packet spew detected (%d,%d)\n",
263 psmouse_queue_work(psmouse, &priv->recalib_wq,
306 static bool hgpk_is_byte_valid(struct psmouse *psmouse, unsigned char *packet)
308 struct hgpk_data *priv = psmouse->private;
309 int pktcnt = psmouse->pktcnt;
333 psmouse_dbg(psmouse,
335 priv->mode, pktcnt, 6, psmouse->packet);
340 static void hgpk_process_advanced_packet(struct psmouse *psmouse)
342 struct hgpk_data *priv = psmouse->private;
343 struct input_dev *idev = psmouse->dev;
344 unsigned char *packet = psmouse->packet;
358 psmouse_dbg(psmouse, "pd=%d fd=%d z=%d",
366 psmouse_dbg(psmouse, "pd=%d ", down);
370 psmouse_dbg(psmouse, "l=%d r=%d x=%d y=%d\n",
382 hgpk_reset_hack_state(psmouse);
393 psmouse_dbg(psmouse, "hard spew detected\n");
395 psmouse_queue_work(psmouse, &priv->recalib_wq,
408 if (hgpk_discard_decay_hack(psmouse, x_diff, y_diff)) {
410 psmouse_dbg(psmouse, "discarding\n");
413 hgpk_spewing_hack(psmouse, left, right, x_diff, y_diff);
425 static void hgpk_process_simple_packet(struct psmouse *psmouse)
427 struct input_dev *dev = psmouse->dev;
428 unsigned char *packet = psmouse->packet;
435 psmouse_dbg(psmouse,
439 if (hgpk_discard_decay_hack(psmouse, x, y)) {
441 psmouse_dbg(psmouse, "discarding\n");
445 hgpk_spewing_hack(psmouse, left, right, x, y);
448 psmouse_dbg(psmouse, "l=%d r=%d x=%d y=%d\n",
460 static psmouse_ret_t hgpk_process_byte(struct psmouse *psmouse)
462 struct hgpk_data *priv = psmouse->private;
464 if (!hgpk_is_byte_valid(psmouse, psmouse->packet))
467 if (psmouse->pktcnt >= psmouse->pktsize) {
469 hgpk_process_simple_packet(psmouse);
471 hgpk_process_advanced_packet(psmouse);
481 psmouse_dbg(psmouse,
483 psmouse_queue_work(psmouse, &priv->recalib_wq,
492 static int hgpk_select_mode(struct psmouse *psmouse)
494 struct ps2dev *ps2dev = &psmouse->ps2dev;
495 struct hgpk_data *priv = psmouse->private;
511 psmouse->pktsize = 3;
516 psmouse->pktsize = 6;
603 static int hgpk_reset_device(struct psmouse *psmouse, bool recalibrate)
607 psmouse_reset(psmouse);
610 struct ps2dev *ps2dev = &psmouse->ps2dev;
624 err = hgpk_select_mode(psmouse);
626 psmouse_err(psmouse, "failed to select mode\n");
630 hgpk_reset_hack_state(psmouse);
635 static int hgpk_force_recalibrate(struct psmouse *psmouse)
637 struct hgpk_data *priv = psmouse->private;
641 if (psmouse->model < HGPK_MODEL_C)
645 psmouse_dbg(psmouse, "recalibration disabled, ignoring\n");
649 psmouse_dbg(psmouse, "recalibrating touchpad..\n");
652 psmouse_set_state(psmouse, PSMOUSE_INITIALIZING);
655 err = hgpk_reset_device(psmouse, true);
665 if (psmouse_activate(psmouse))
669 psmouse_dbg(psmouse, "touchpad reactivated\n");
692 static int hgpk_toggle_powersave(struct psmouse *psmouse, int enable)
694 struct ps2dev *ps2dev = &psmouse->ps2dev;
699 if (psmouse->model < HGPK_MODEL_D)
703 psmouse_set_state(psmouse, PSMOUSE_INITIALIZING);
718 err = hgpk_reset_device(psmouse, false);
720 psmouse_err(psmouse, "Failed to reset device!\n");
725 psmouse_activate(psmouse);
726 psmouse_dbg(psmouse, "Touchpad powered up.\n");
728 psmouse_dbg(psmouse, "Powering off touchpad.\n");
736 psmouse_set_state(psmouse, PSMOUSE_IGNORE);
745 static int hgpk_poll(struct psmouse *psmouse)
751 static int hgpk_reconnect(struct psmouse *psmouse)
753 struct hgpk_data *priv = psmouse->private;
761 if (psmouse->ps2dev.serio->dev.power.power_state.event !=
766 return hgpk_reset_device(psmouse, false);
769 static ssize_t hgpk_show_powered(struct psmouse *psmouse, void *data, char *buf)
771 struct hgpk_data *priv = psmouse->private;
776 static ssize_t hgpk_set_powered(struct psmouse *psmouse, void *data,
779 struct hgpk_data *priv = psmouse->private;
795 err = hgpk_toggle_powersave(psmouse, value);
806 static ssize_t attr_show_mode(struct psmouse *psmouse, void *data, char *buf)
808 struct hgpk_data *priv = psmouse->private;
813 static ssize_t attr_set_mode(struct psmouse *psmouse, void *data,
816 struct hgpk_data *priv = psmouse->private;
819 struct input_dev *old_dev = psmouse->dev;
833 psmouse_set_state(psmouse, PSMOUSE_INITIALIZING);
837 err = hgpk_reset_device(psmouse, false);
843 psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);
849 psmouse->dev = new_dev;
857 hgpk_reset_device(psmouse, false);
865 static ssize_t hgpk_trigger_recal_show(struct psmouse *psmouse,
871 static ssize_t hgpk_trigger_recal(struct psmouse *psmouse, void *data,
874 struct hgpk_data *priv = psmouse->private;
890 psmouse_queue_work(psmouse, &priv->recalib_wq, 0);
897 static void hgpk_disconnect(struct psmouse *psmouse)
899 struct hgpk_data *priv = psmouse->private;
901 device_remove_file(&psmouse->ps2dev.serio->dev,
903 device_remove_file(&psmouse->ps2dev.serio->dev,
906 if (psmouse->model >= HGPK_MODEL_C)
907 device_remove_file(&psmouse->ps2dev.serio->dev,
910 psmouse_reset(psmouse);
918 struct psmouse *psmouse = priv->psmouse;
920 if (hgpk_force_recalibrate(psmouse))
921 psmouse_err(psmouse, "recalibration failed!\n");
924 static int hgpk_register(struct psmouse *psmouse)
926 struct hgpk_data *priv = psmouse->private;
930 psmouse->protocol_handler = hgpk_process_byte;
931 psmouse->poll = hgpk_poll;
932 psmouse->disconnect = hgpk_disconnect;
933 psmouse->reconnect = hgpk_reconnect;
936 psmouse->resync_time = 0;
938 psmouse->resetafter = 1024;
940 hgpk_setup_input_device(psmouse->dev, NULL, priv->mode);
942 err = device_create_file(&psmouse->ps2dev.serio->dev,
945 psmouse_err(psmouse, "Failed creating 'powered' sysfs node\n");
949 err = device_create_file(&psmouse->ps2dev.serio->dev,
952 psmouse_err(psmouse,
958 if (psmouse->model >= HGPK_MODEL_C) {
959 err = device_create_file(&psmouse->ps2dev.serio->dev,
962 psmouse_err(psmouse,
971 device_remove_file(&psmouse->ps2dev.serio->dev,
974 device_remove_file(&psmouse->ps2dev.serio->dev,
979 int hgpk_init(struct psmouse *psmouse)
990 psmouse->private = priv;
992 priv->psmouse = psmouse;
997 err = hgpk_reset_device(psmouse, false);
1001 err = hgpk_register(psmouse);
1013 static enum hgpk_model_t hgpk_get_model(struct psmouse *psmouse)
1015 struct ps2dev *ps2dev = &psmouse->ps2dev;
1026 psmouse_dbg(psmouse, "ID: %*ph\n", 3, param);
1032 psmouse_info(psmouse, "OLPC touchpad revision 0x%x\n", param[2]);
1037 int hgpk_detect(struct psmouse *psmouse, bool set_properties)
1041 version = hgpk_get_model(psmouse);
1046 psmouse->vendor = "ALPS";
1047 psmouse->name = "HGPK";
1048 psmouse->model = version;