+ /* check for abs too */
+ if (support & (1 << EV_ABS)) {
+ struct input_absinfo ainfo;
+ int dist;
+ ret = ioctl(fd, EVIOCGBIT(EV_ABS, sizeof(absbits)), absbits);
+ if (ret == -1)
+ goto no_abs;
+ if (absbits[0] & (1 << ABS_X)) {
+ ret = ioctl(fd, EVIOCGABS(ABS_X), &ainfo);
+ if (ret == -1)
+ goto no_abs;
+ dist = ainfo.maximum - ainfo.minimum;
+ dev->abs_lzone = dist / 4;
+ dev->abs_min_x = ainfo.minimum;
+ dev->abs_max_x = ainfo.maximum;
+ }
+ if (absbits[0] & (1 << ABS_Y)) {
+ ret = ioctl(fd, EVIOCGABS(ABS_Y), &ainfo);
+ if (ret == -1)
+ goto no_abs;
+ dist = ainfo.maximum - ainfo.minimum;
+ dev->abs_min_y = ainfo.minimum;
+ dev->abs_max_y = ainfo.maximum;
+ }
+ for (u = 0; u < MAX_ABS_DEVS; u++) {
+ ret = ioctl(fd, EVIOCGABS(u), &ainfo);
+ if (ret == -1)
+ break;
+ dist = ainfo.maximum - ainfo.minimum;
+ if (dist != 0)
+ dev->abs_mult[u] = IN_ABS_RANGE * 2 * 65536 / dist;
+ dev->abs_adj[u] = -(ainfo.maximum + ainfo.minimum + 1) / 2;
+ have_abs = 1;
+ }
+ dev->abs_count = u;