Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Input: rework psmouse attributes to reduce module size

Rearrange attribute code to use generic show and set handlers
instead of replicating them for every attribute; switch to
using attribute_group instead of creating all attributes
manually. All this saves about 4K.

Signed-off-by: Dmitry Torokhov <dtor@mail.ru>

+198 -161
+7 -5
drivers/input/mouse/logips2pp.c
··· 150 150 ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES); 151 151 } 152 152 153 - static ssize_t psmouse_attr_show_smartscroll(struct psmouse *psmouse, char *buf) 153 + static ssize_t ps2pp_attr_show_smartscroll(struct psmouse *psmouse, void *data, char *buf) 154 154 { 155 155 return sprintf(buf, "%d\n", psmouse->smartscroll ? 1 : 0); 156 156 } 157 157 158 - static ssize_t psmouse_attr_set_smartscroll(struct psmouse *psmouse, const char *buf, size_t count) 158 + static ssize_t ps2pp_attr_set_smartscroll(struct psmouse *psmouse, void *data, const char *buf, size_t count) 159 159 { 160 160 unsigned long value; 161 161 char *rest; ··· 169 169 return count; 170 170 } 171 171 172 - PSMOUSE_DEFINE_ATTR(smartscroll); 172 + PSMOUSE_DEFINE_ATTR(smartscroll, S_IWUSR | S_IRUGO, NULL, 173 + ps2pp_attr_show_smartscroll, ps2pp_attr_set_smartscroll); 173 174 174 175 /* 175 176 * Support 800 dpi resolution _only_ if the user wants it (there are good ··· 195 194 196 195 static void ps2pp_disconnect(struct psmouse *psmouse) 197 196 { 198 - device_remove_file(&psmouse->ps2dev.serio->dev, &psmouse_attr_smartscroll); 197 + device_remove_file(&psmouse->ps2dev.serio->dev, &psmouse_attr_smartscroll.dattr); 199 198 } 200 199 201 200 static struct ps2pp_info *get_model_info(unsigned char model) ··· 380 379 psmouse->set_resolution = ps2pp_set_resolution; 381 380 psmouse->disconnect = ps2pp_disconnect; 382 381 383 - device_create_file(&psmouse->ps2dev.serio->dev, &psmouse_attr_smartscroll); 382 + device_create_file(&psmouse->ps2dev.serio->dev, 383 + &psmouse_attr_smartscroll.dattr); 384 384 } 385 385 } 386 386
+66 -51
drivers/input/mouse/psmouse-base.c
··· 58 58 module_param_named(resetafter, psmouse_resetafter, uint, 0644); 59 59 MODULE_PARM_DESC(resetafter, "Reset device after so many bad packets (0 = never)."); 60 60 61 - PSMOUSE_DEFINE_ATTR(protocol); 62 - PSMOUSE_DEFINE_ATTR(rate); 63 - PSMOUSE_DEFINE_ATTR(resolution); 64 - PSMOUSE_DEFINE_ATTR(resetafter); 61 + PSMOUSE_DEFINE_ATTR(protocol, S_IWUSR | S_IRUGO, 62 + NULL, 63 + psmouse_attr_show_protocol, psmouse_attr_set_protocol); 64 + PSMOUSE_DEFINE_ATTR(rate, S_IWUSR | S_IRUGO, 65 + (void *) offsetof(struct psmouse, rate), 66 + psmouse_show_int_attr, psmouse_attr_set_rate); 67 + PSMOUSE_DEFINE_ATTR(resolution, S_IWUSR | S_IRUGO, 68 + (void *) offsetof(struct psmouse, resolution), 69 + psmouse_show_int_attr, psmouse_attr_set_resolution); 70 + PSMOUSE_DEFINE_ATTR(resetafter, S_IWUSR | S_IRUGO, 71 + (void *) offsetof(struct psmouse, resetafter), 72 + psmouse_show_int_attr, psmouse_set_int_attr); 73 + 74 + static struct attribute *psmouse_attributes[] = { 75 + &psmouse_attr_protocol.dattr.attr, 76 + &psmouse_attr_rate.dattr.attr, 77 + &psmouse_attr_resolution.dattr.attr, 78 + &psmouse_attr_resetafter.dattr.attr, 79 + NULL 80 + }; 81 + 82 + static struct attribute_group psmouse_attribute_group = { 83 + .attrs = psmouse_attributes, 84 + }; 65 85 66 86 __obsolete_setup("psmouse_noext"); 67 87 __obsolete_setup("psmouse_resolution="); ··· 820 800 821 801 psmouse = serio_get_drvdata(serio); 822 802 823 - device_remove_file(&serio->dev, &psmouse_attr_protocol); 824 - device_remove_file(&serio->dev, &psmouse_attr_rate); 825 - device_remove_file(&serio->dev, &psmouse_attr_resolution); 826 - device_remove_file(&serio->dev, &psmouse_attr_resetafter); 803 + sysfs_remove_group(&serio->dev.kobj, &psmouse_attribute_group); 827 804 828 805 down(&psmouse_sem); 829 806 ··· 957 940 if (parent && parent->pt_activate) 958 941 parent->pt_activate(parent); 959 942 960 - device_create_file(&serio->dev, &psmouse_attr_protocol); 961 - device_create_file(&serio->dev, &psmouse_attr_rate); 962 - device_create_file(&serio->dev, &psmouse_attr_resolution); 963 - device_create_file(&serio->dev, &psmouse_attr_resetafter); 943 + sysfs_create_group(&serio->dev.kobj, &psmouse_attribute_group); 964 944 965 945 psmouse_activate(psmouse); 966 946 ··· 1054 1040 .cleanup = psmouse_cleanup, 1055 1041 }; 1056 1042 1057 - ssize_t psmouse_attr_show_helper(struct device *dev, char *buf, 1058 - ssize_t (*handler)(struct psmouse *, char *)) 1043 + ssize_t psmouse_attr_show_helper(struct device *dev, struct device_attribute *devattr, 1044 + char *buf) 1059 1045 { 1060 1046 struct serio *serio = to_serio_port(dev); 1047 + struct psmouse_attribute *attr = to_psmouse_attr(devattr); 1048 + struct psmouse *psmouse; 1061 1049 int retval; 1062 1050 1063 1051 retval = serio_pin_driver(serio); ··· 1071 1055 goto out; 1072 1056 } 1073 1057 1074 - retval = handler(serio_get_drvdata(serio), buf); 1058 + psmouse = serio_get_drvdata(serio); 1059 + 1060 + retval = attr->show(psmouse, attr->data, buf); 1075 1061 1076 1062 out: 1077 1063 serio_unpin_driver(serio); 1078 1064 return retval; 1079 1065 } 1080 1066 1081 - ssize_t psmouse_attr_set_helper(struct device *dev, const char *buf, size_t count, 1082 - ssize_t (*handler)(struct psmouse *, const char *, size_t)) 1067 + ssize_t psmouse_attr_set_helper(struct device *dev, struct device_attribute *devattr, 1068 + const char *buf, size_t count) 1083 1069 { 1084 1070 struct serio *serio = to_serio_port(dev); 1085 - struct psmouse *psmouse = serio_get_drvdata(serio); 1086 - struct psmouse *parent = NULL; 1071 + struct psmouse_attribute *attr = to_psmouse_attr(devattr); 1072 + struct psmouse *psmouse, *parent = NULL; 1087 1073 int retval; 1088 1074 1089 1075 retval = serio_pin_driver(serio); ··· 1101 1083 if (retval) 1102 1084 goto out_unpin; 1103 1085 1086 + psmouse = serio_get_drvdata(serio); 1087 + 1104 1088 if (psmouse->state == PSMOUSE_IGNORE) { 1105 1089 retval = -ENODEV; 1106 1090 goto out_up; ··· 1115 1095 1116 1096 psmouse_deactivate(psmouse); 1117 1097 1118 - retval = handler(psmouse, buf, count); 1098 + retval = attr->set(psmouse, attr->data, buf, count); 1119 1099 1120 1100 if (retval != -ENODEV) 1121 1101 psmouse_activate(psmouse); ··· 1130 1110 return retval; 1131 1111 } 1132 1112 1133 - static ssize_t psmouse_attr_show_protocol(struct psmouse *psmouse, char *buf) 1113 + static ssize_t psmouse_show_int_attr(struct psmouse *psmouse, void *offset, char *buf) 1114 + { 1115 + unsigned long *field = (unsigned long *)((char *)psmouse + (size_t)offset); 1116 + 1117 + return sprintf(buf, "%lu\n", *field); 1118 + } 1119 + 1120 + static ssize_t psmouse_set_int_attr(struct psmouse *psmouse, void *offset, const char *buf, size_t count) 1121 + { 1122 + unsigned long *field = (unsigned long *)((char *)psmouse + (size_t)offset); 1123 + unsigned long value; 1124 + char *rest; 1125 + 1126 + value = simple_strtoul(buf, &rest, 10); 1127 + if (*rest) 1128 + return -EINVAL; 1129 + 1130 + *field = value; 1131 + 1132 + return count; 1133 + } 1134 + 1135 + static ssize_t psmouse_attr_show_protocol(struct psmouse *psmouse, void *data, char *buf) 1134 1136 { 1135 1137 return sprintf(buf, "%s\n", psmouse_protocol_by_type(psmouse->type)->name); 1136 1138 } 1137 1139 1138 - static ssize_t psmouse_attr_set_protocol(struct psmouse *psmouse, const char *buf, size_t count) 1140 + static ssize_t psmouse_attr_set_protocol(struct psmouse *psmouse, void *data, const char *buf, size_t count) 1139 1141 { 1140 1142 struct serio *serio = psmouse->ps2dev.serio; 1141 1143 struct psmouse *parent = NULL; ··· 1221 1179 return count; 1222 1180 } 1223 1181 1224 - static ssize_t psmouse_attr_show_rate(struct psmouse *psmouse, char *buf) 1225 - { 1226 - return sprintf(buf, "%d\n", psmouse->rate); 1227 - } 1228 - 1229 - static ssize_t psmouse_attr_set_rate(struct psmouse *psmouse, const char *buf, size_t count) 1182 + static ssize_t psmouse_attr_set_rate(struct psmouse *psmouse, void *data, const char *buf, size_t count) 1230 1183 { 1231 1184 unsigned long value; 1232 1185 char *rest; ··· 1234 1197 return count; 1235 1198 } 1236 1199 1237 - static ssize_t psmouse_attr_show_resolution(struct psmouse *psmouse, char *buf) 1238 - { 1239 - return sprintf(buf, "%d\n", psmouse->resolution); 1240 - } 1241 - 1242 - static ssize_t psmouse_attr_set_resolution(struct psmouse *psmouse, const char *buf, size_t count) 1200 + static ssize_t psmouse_attr_set_resolution(struct psmouse *psmouse, void *data, const char *buf, size_t count) 1243 1201 { 1244 1202 unsigned long value; 1245 1203 char *rest; ··· 1247 1215 return count; 1248 1216 } 1249 1217 1250 - static ssize_t psmouse_attr_show_resetafter(struct psmouse *psmouse, char *buf) 1251 - { 1252 - return sprintf(buf, "%d\n", psmouse->resetafter); 1253 - } 1254 - 1255 - static ssize_t psmouse_attr_set_resetafter(struct psmouse *psmouse, const char *buf, size_t count) 1256 - { 1257 - unsigned long value; 1258 - char *rest; 1259 - 1260 - value = simple_strtoul(buf, &rest, 10); 1261 - if (*rest) 1262 - return -EINVAL; 1263 - 1264 - psmouse->resetafter = value; 1265 - return count; 1266 - } 1267 1218 1268 1219 static int psmouse_set_maxproto(const char *val, struct kernel_param *kp) 1269 1220 {
+31 -18
drivers/input/mouse/psmouse.h
··· 86 86 int psmouse_reset(struct psmouse *psmouse); 87 87 void psmouse_set_resolution(struct psmouse *psmouse, unsigned int resolution); 88 88 89 - ssize_t psmouse_attr_show_helper(struct device *dev, char *buf, 90 - ssize_t (*handler)(struct psmouse *, char *)); 91 - ssize_t psmouse_attr_set_helper(struct device *dev, const char *buf, size_t count, 92 - ssize_t (*handler)(struct psmouse *, const char *, size_t)); 93 89 94 - #define PSMOUSE_DEFINE_ATTR(_name) \ 95 - static ssize_t psmouse_attr_show_##_name(struct psmouse *, char *); \ 96 - static ssize_t psmouse_attr_set_##_name(struct psmouse *, const char *, size_t);\ 97 - static ssize_t psmouse_do_show_##_name(struct device *d, struct device_attribute *attr, char *b) \ 98 - { \ 99 - return psmouse_attr_show_helper(d, b, psmouse_attr_show_##_name); \ 100 - } \ 101 - static ssize_t psmouse_do_set_##_name(struct device *d, struct device_attribute *attr, const char *b, size_t s)\ 102 - { \ 103 - return psmouse_attr_set_helper(d, b, s, psmouse_attr_set_##_name); \ 104 - } \ 105 - static struct device_attribute psmouse_attr_##_name = \ 106 - __ATTR(_name, S_IWUSR | S_IRUGO, \ 107 - psmouse_do_show_##_name, psmouse_do_set_##_name); 90 + struct psmouse_attribute { 91 + struct device_attribute dattr; 92 + void *data; 93 + ssize_t (*show)(struct psmouse *psmouse, void *data, char *buf); 94 + ssize_t (*set)(struct psmouse *psmouse, void *data, 95 + const char *buf, size_t count); 96 + }; 97 + #define to_psmouse_attr(a) container_of((a), struct psmouse_attribute, dattr) 98 + 99 + ssize_t psmouse_attr_show_helper(struct device *dev, struct device_attribute *attr, 100 + char *buf); 101 + ssize_t psmouse_attr_set_helper(struct device *dev, struct device_attribute *attr, 102 + const char *buf, size_t count); 103 + 104 + #define PSMOUSE_DEFINE_ATTR(_name, _mode, _data, _show, _set) \ 105 + static ssize_t _show(struct psmouse *, void *data, char *); \ 106 + static ssize_t _set(struct psmouse *, void *data, const char *, size_t); \ 107 + static struct psmouse_attribute psmouse_attr_##_name = { \ 108 + .dattr = { \ 109 + .attr = { \ 110 + .name = __stringify(_name), \ 111 + .mode = _mode, \ 112 + .owner = THIS_MODULE, \ 113 + }, \ 114 + .show = psmouse_attr_show_helper, \ 115 + .store = psmouse_attr_set_helper, \ 116 + }, \ 117 + .data = _data, \ 118 + .show = _show, \ 119 + .set = _set, \ 120 + } 108 121 109 122 #endif /* _PSMOUSE_H */
+94 -87
drivers/input/mouse/trackpoint.c
··· 19 19 #include "psmouse.h" 20 20 #include "trackpoint.h" 21 21 22 - PSMOUSE_DEFINE_ATTR(sensitivity); 23 - PSMOUSE_DEFINE_ATTR(speed); 24 - PSMOUSE_DEFINE_ATTR(inertia); 25 - PSMOUSE_DEFINE_ATTR(reach); 26 - PSMOUSE_DEFINE_ATTR(draghys); 27 - PSMOUSE_DEFINE_ATTR(mindrag); 28 - PSMOUSE_DEFINE_ATTR(thresh); 29 - PSMOUSE_DEFINE_ATTR(upthresh); 30 - PSMOUSE_DEFINE_ATTR(ztime); 31 - PSMOUSE_DEFINE_ATTR(jenks); 32 - PSMOUSE_DEFINE_ATTR(press_to_select); 33 - PSMOUSE_DEFINE_ATTR(skipback); 34 - PSMOUSE_DEFINE_ATTR(ext_dev); 35 - 36 - #define MAKE_ATTR_READ(_item) \ 37 - static ssize_t psmouse_attr_show_##_item(struct psmouse *psmouse, char *buf) \ 38 - { \ 39 - struct trackpoint_data *tp = psmouse->private; \ 40 - return sprintf(buf, "%lu\n", (unsigned long)tp->_item); \ 41 - } 42 - 43 - #define MAKE_ATTR_WRITE(_item, command) \ 44 - static ssize_t psmouse_attr_set_##_item(struct psmouse *psmouse, const char *buf, size_t count) \ 45 - { \ 46 - char *rest; \ 47 - unsigned long value; \ 48 - struct trackpoint_data *tp = psmouse->private; \ 49 - value = simple_strtoul(buf, &rest, 10); \ 50 - if (*rest) \ 51 - return -EINVAL; \ 52 - tp->_item = value; \ 53 - trackpoint_write(&psmouse->ps2dev, command, tp->_item); \ 54 - return count; \ 55 - } 56 - 57 - #define MAKE_ATTR_TOGGLE(_item, command, mask) \ 58 - static ssize_t psmouse_attr_set_##_item(struct psmouse *psmouse, const char *buf, size_t count) \ 59 - { \ 60 - unsigned char toggle; \ 61 - struct trackpoint_data *tp = psmouse->private; \ 62 - toggle = (buf[0] == '1') ? 1 : 0; \ 63 - if (toggle != tp->_item) { \ 64 - tp->_item = toggle; \ 65 - trackpoint_toggle_bit(&psmouse->ps2dev, command, mask); \ 66 - } \ 67 - return count; \ 68 - } 69 - 70 22 /* 71 23 * Device IO: read, write and toggle bit 72 24 */ ··· 60 108 return 0; 61 109 } 62 110 63 - MAKE_ATTR_WRITE(sensitivity, TP_SENS); 64 - MAKE_ATTR_READ(sensitivity); 65 111 66 - MAKE_ATTR_WRITE(speed, TP_SPEED); 67 - MAKE_ATTR_READ(speed); 112 + /* 113 + * Trackpoint-specific attributes 114 + */ 115 + struct trackpoint_attr_data { 116 + size_t field_offset; 117 + unsigned char command; 118 + unsigned char mask; 119 + }; 68 120 69 - MAKE_ATTR_WRITE(inertia, TP_INERTIA); 70 - MAKE_ATTR_READ(inertia); 121 + static ssize_t trackpoint_show_int_attr(struct psmouse *psmouse, void *data, char *buf) 122 + { 123 + struct trackpoint_data *tp = psmouse->private; 124 + struct trackpoint_attr_data *attr = data; 125 + unsigned char *field = (unsigned char *)((char *)tp + attr->field_offset); 71 126 72 - MAKE_ATTR_WRITE(reach, TP_REACH); 73 - MAKE_ATTR_READ(reach); 127 + return sprintf(buf, "%u\n", *field); 128 + } 74 129 75 - MAKE_ATTR_WRITE(draghys, TP_DRAGHYS); 76 - MAKE_ATTR_READ(draghys); 130 + static ssize_t trackpoint_set_int_attr(struct psmouse *psmouse, void *data, 131 + const char *buf, size_t count) 132 + { 133 + struct trackpoint_data *tp = psmouse->private; 134 + struct trackpoint_attr_data *attr = data; 135 + unsigned char *field = (unsigned char *)((char *)tp + attr->field_offset); 136 + unsigned long value; 137 + char *rest; 77 138 78 - MAKE_ATTR_WRITE(mindrag, TP_MINDRAG); 79 - MAKE_ATTR_READ(mindrag); 139 + value = simple_strtoul(buf, &rest, 10); 140 + if (*rest || value > 255) 141 + return -EINVAL; 80 142 81 - MAKE_ATTR_WRITE(thresh, TP_THRESH); 82 - MAKE_ATTR_READ(thresh); 143 + *field = value; 144 + trackpoint_write(&psmouse->ps2dev, attr->command, value); 83 145 84 - MAKE_ATTR_WRITE(upthresh, TP_UP_THRESH); 85 - MAKE_ATTR_READ(upthresh); 146 + return count; 147 + } 86 148 87 - MAKE_ATTR_WRITE(ztime, TP_Z_TIME); 88 - MAKE_ATTR_READ(ztime); 149 + #define TRACKPOINT_INT_ATTR(_name, _command) \ 150 + static struct trackpoint_attr_data trackpoint_attr_##_name = { \ 151 + .field_offset = offsetof(struct trackpoint_data, _name), \ 152 + .command = _command, \ 153 + }; \ 154 + PSMOUSE_DEFINE_ATTR(_name, S_IWUSR | S_IRUGO, \ 155 + &trackpoint_attr_##_name, \ 156 + trackpoint_show_int_attr, trackpoint_set_int_attr) 89 157 90 - MAKE_ATTR_WRITE(jenks, TP_JENKS_CURV); 91 - MAKE_ATTR_READ(jenks); 158 + static ssize_t trackpoint_set_bit_attr(struct psmouse *psmouse, void *data, 159 + const char *buf, size_t count) 160 + { 161 + struct trackpoint_data *tp = psmouse->private; 162 + struct trackpoint_attr_data *attr = data; 163 + unsigned char *field = (unsigned char *)((char *)tp + attr->field_offset); 164 + unsigned long value; 165 + char *rest; 92 166 93 - MAKE_ATTR_TOGGLE(press_to_select, TP_TOGGLE_PTSON, TP_MASK_PTSON); 94 - MAKE_ATTR_READ(press_to_select); 167 + value = simple_strtoul(buf, &rest, 10); 168 + if (*rest || value > 1) 169 + return -EINVAL; 95 170 96 - MAKE_ATTR_TOGGLE(skipback, TP_TOGGLE_SKIPBACK, TP_MASK_SKIPBACK); 97 - MAKE_ATTR_READ(skipback); 171 + if (*field != value) { 172 + *field = value; 173 + trackpoint_toggle_bit(&psmouse->ps2dev, attr->command, attr->mask); 174 + } 98 175 99 - MAKE_ATTR_TOGGLE(ext_dev, TP_TOGGLE_EXT_DEV, TP_MASK_EXT_DEV); 100 - MAKE_ATTR_READ(ext_dev); 176 + return count; 177 + } 178 + 179 + 180 + #define TRACKPOINT_BIT_ATTR(_name, _command, _mask) \ 181 + static struct trackpoint_attr_data trackpoint_attr_##_name = { \ 182 + .field_offset = offsetof(struct trackpoint_data, _name), \ 183 + .command = _command, \ 184 + .mask = _mask, \ 185 + }; \ 186 + PSMOUSE_DEFINE_ATTR(_name, S_IWUSR | S_IRUGO, \ 187 + &trackpoint_attr_##_name, \ 188 + trackpoint_show_int_attr, trackpoint_set_bit_attr) 189 + 190 + TRACKPOINT_INT_ATTR(sensitivity, TP_SENS); 191 + TRACKPOINT_INT_ATTR(speed, TP_SPEED); 192 + TRACKPOINT_INT_ATTR(inertia, TP_INERTIA); 193 + TRACKPOINT_INT_ATTR(reach, TP_REACH); 194 + TRACKPOINT_INT_ATTR(draghys, TP_DRAGHYS); 195 + TRACKPOINT_INT_ATTR(mindrag, TP_MINDRAG); 196 + TRACKPOINT_INT_ATTR(thresh, TP_THRESH); 197 + TRACKPOINT_INT_ATTR(upthresh, TP_UP_THRESH); 198 + TRACKPOINT_INT_ATTR(ztime, TP_Z_TIME); 199 + TRACKPOINT_INT_ATTR(jenks, TP_JENKS_CURV); 200 + 201 + TRACKPOINT_BIT_ATTR(press_to_select, TP_TOGGLE_PTSON, TP_MASK_PTSON); 202 + TRACKPOINT_BIT_ATTR(skipback, TP_TOGGLE_SKIPBACK, TP_MASK_SKIPBACK); 203 + TRACKPOINT_BIT_ATTR(ext_dev, TP_TOGGLE_EXT_DEV, TP_MASK_EXT_DEV); 101 204 102 205 static struct attribute *trackpoint_attrs[] = { 103 - &psmouse_attr_sensitivity.attr, 104 - &psmouse_attr_speed.attr, 105 - &psmouse_attr_inertia.attr, 106 - &psmouse_attr_reach.attr, 107 - &psmouse_attr_draghys.attr, 108 - &psmouse_attr_mindrag.attr, 109 - &psmouse_attr_thresh.attr, 110 - &psmouse_attr_upthresh.attr, 111 - &psmouse_attr_ztime.attr, 112 - &psmouse_attr_jenks.attr, 113 - &psmouse_attr_press_to_select.attr, 114 - &psmouse_attr_skipback.attr, 115 - &psmouse_attr_ext_dev.attr, 206 + &psmouse_attr_sensitivity.dattr.attr, 207 + &psmouse_attr_speed.dattr.attr, 208 + &psmouse_attr_inertia.dattr.attr, 209 + &psmouse_attr_reach.dattr.attr, 210 + &psmouse_attr_draghys.dattr.attr, 211 + &psmouse_attr_mindrag.dattr.attr, 212 + &psmouse_attr_thresh.dattr.attr, 213 + &psmouse_attr_upthresh.dattr.attr, 214 + &psmouse_attr_ztime.dattr.attr, 215 + &psmouse_attr_jenks.dattr.attr, 216 + &psmouse_attr_press_to_select.dattr.attr, 217 + &psmouse_attr_skipback.dattr.attr, 218 + &psmouse_attr_ext_dev.dattr.attr, 116 219 NULL 117 220 }; 118 221