/* * Device IO: read, write and toggle bit */ static int trackpoint_read(struct ps2dev *ps2dev, u8 loc, u8 *results) { if (ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, TP_COMMAND)) || ps2_command(ps2dev, results, MAKE_PS2_CMD(0, 1, loc))) { return -1; } return 0; }
static int trackpoint_write(struct ps2dev *ps2dev, u8 loc, u8 val) { if (ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, TP_COMMAND)) || ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, TP_WRITE_MEM)) || ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, loc)) || ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, val))) { return -1; } return 0; }
static int trackpoint_toggle_bit(struct ps2dev *ps2dev, u8 loc, u8 mask) { /* Bad things will happen if the loc param isn't in this range */ if (loc < 0x20 || loc >= 0x2F) return -1; if (ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, TP_COMMAND)) || ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, TP_TOGGLE)) || ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, loc)) || ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, mask))) { return -1; } return 0; }
static int trackpoint_toggle_bit(struct ps2dev *ps2dev, unsigned char loc, unsigned char mask) { if (loc < 0x20 || loc >= 0x2F) return -1; if (ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, TP_COMMAND)) || ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, TP_TOGGLE)) || ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, loc)) || ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, mask))) { return -1; } return 0; }
/* * Power-on Reset: Resets all trackpoint parameters, including RAM values, * to defaults. * Returns zero on success, non-zero on failure. */ static int trackpoint_power_on_reset(struct ps2dev *ps2dev) { u8 results[2]; int tries = 0; /* Issue POR command, and repeat up to once if 0xFC00 received */ do { if (ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, TP_COMMAND)) || ps2_command(ps2dev, results, MAKE_PS2_CMD(0, 2, TP_POR))) return -1; } while (results[0] == 0xFC && results[1] == 0x00 && ++tries < 2); /* Check for success response -- 0xAA00 */ if (results[0] != 0xAA || results[1] != 0x00) return -ENODEV; return 0; }