diff options
author | Dmitry Torokhov <dtor_core@ameritech.net> | 2005-09-04 02:40:20 -0400 |
---|---|---|
committer | Dmitry Torokhov <dtor_core@ameritech.net> | 2005-09-04 02:40:20 -0400 |
commit | cfe9e88866fe892f4f71bf132c64ec8bd5256e5e (patch) | |
tree | c1da19c8a2b1f9f1a32597554660747fe0aa5132 | |
parent | 15c42e5a1f0bccb69508059b8ae0720840068b8e (diff) |
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>
-rw-r--r-- | drivers/input/mouse/logips2pp.c | 12 | ||||
-rw-r--r-- | drivers/input/mouse/psmouse-base.c | 117 | ||||
-rw-r--r-- | drivers/input/mouse/psmouse.h | 51 | ||||
-rw-r--r-- | drivers/input/mouse/trackpoint.c | 183 |
4 files changed, 200 insertions, 163 deletions
diff --git a/drivers/input/mouse/logips2pp.c b/drivers/input/mouse/logips2pp.c index 48d2b20d2642..e65c2798a491 100644 --- a/drivers/input/mouse/logips2pp.c +++ b/drivers/input/mouse/logips2pp.c | |||
@@ -150,12 +150,12 @@ static void ps2pp_set_smartscroll(struct psmouse *psmouse, unsigned int smartscr | |||
150 | ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES); | 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 | return sprintf(buf, "%d\n", psmouse->smartscroll ? 1 : 0); | 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 | unsigned long value; | 160 | unsigned long value; |
161 | char *rest; | 161 | char *rest; |
@@ -169,7 +169,8 @@ static ssize_t psmouse_attr_set_smartscroll(struct psmouse *psmouse, const char | |||
169 | return count; | 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 | * Support 800 dpi resolution _only_ if the user wants it (there are good | 176 | * Support 800 dpi resolution _only_ if the user wants it (there are good |
@@ -194,7 +195,7 @@ static void ps2pp_set_resolution(struct psmouse *psmouse, unsigned int resolutio | |||
194 | 195 | ||
195 | static void ps2pp_disconnect(struct psmouse *psmouse) | 196 | static void ps2pp_disconnect(struct psmouse *psmouse) |
196 | { | 197 | { |
197 | device_remove_file(&psmouse->ps2dev.serio->dev, &psmouse_attr_smartscroll); | 198 | device_remove_file(&psmouse->ps2dev.serio->dev, &psmouse_attr_smartscroll.dattr); |
198 | } | 199 | } |
199 | 200 | ||
200 | static struct ps2pp_info *get_model_info(unsigned char model) | 201 | static struct ps2pp_info *get_model_info(unsigned char model) |
@@ -379,7 +380,8 @@ int ps2pp_init(struct psmouse *psmouse, int set_properties) | |||
379 | psmouse->set_resolution = ps2pp_set_resolution; | 380 | psmouse->set_resolution = ps2pp_set_resolution; |
380 | psmouse->disconnect = ps2pp_disconnect; | 381 | psmouse->disconnect = ps2pp_disconnect; |
381 | 382 | ||
382 | device_create_file(&psmouse->ps2dev.serio->dev, &psmouse_attr_smartscroll); | 383 | device_create_file(&psmouse->ps2dev.serio->dev, |
384 | &psmouse_attr_smartscroll.dattr); | ||
383 | } | 385 | } |
384 | } | 386 | } |
385 | 387 | ||
diff --git a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c index b3508276785f..0830c6e13ef6 100644 --- a/drivers/input/mouse/psmouse-base.c +++ b/drivers/input/mouse/psmouse-base.c | |||
@@ -58,10 +58,30 @@ static unsigned int psmouse_resetafter; | |||
58 | module_param_named(resetafter, psmouse_resetafter, uint, 0644); | 58 | module_param_named(resetafter, psmouse_resetafter, uint, 0644); |
59 | MODULE_PARM_DESC(resetafter, "Reset device after so many bad packets (0 = never)."); | 59 | MODULE_PARM_DESC(resetafter, "Reset device after so many bad packets (0 = never)."); |
60 | 60 | ||
61 | PSMOUSE_DEFINE_ATTR(protocol); | 61 | PSMOUSE_DEFINE_ATTR(protocol, S_IWUSR | S_IRUGO, |
62 | PSMOUSE_DEFINE_ATTR(rate); | 62 | NULL, |
63 | PSMOUSE_DEFINE_ATTR(resolution); | 63 | psmouse_attr_show_protocol, psmouse_attr_set_protocol); |
64 | PSMOUSE_DEFINE_ATTR(resetafter); | 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 | __obsolete_setup("psmouse_noext"); | 86 | __obsolete_setup("psmouse_noext"); |
67 | __obsolete_setup("psmouse_resolution="); | 87 | __obsolete_setup("psmouse_resolution="); |
@@ -800,10 +820,7 @@ static void psmouse_disconnect(struct serio *serio) | |||
800 | 820 | ||
801 | psmouse = serio_get_drvdata(serio); | 821 | psmouse = serio_get_drvdata(serio); |
802 | 822 | ||
803 | device_remove_file(&serio->dev, &psmouse_attr_protocol); | 823 | sysfs_remove_group(&serio->dev.kobj, &psmouse_attribute_group); |
804 | device_remove_file(&serio->dev, &psmouse_attr_rate); | ||
805 | device_remove_file(&serio->dev, &psmouse_attr_resolution); | ||
806 | device_remove_file(&serio->dev, &psmouse_attr_resetafter); | ||
807 | 824 | ||
808 | down(&psmouse_sem); | 825 | down(&psmouse_sem); |
809 | 826 | ||
@@ -940,10 +957,7 @@ static int psmouse_connect(struct serio *serio, struct serio_driver *drv) | |||
940 | if (parent && parent->pt_activate) | 957 | if (parent && parent->pt_activate) |
941 | parent->pt_activate(parent); | 958 | parent->pt_activate(parent); |
942 | 959 | ||
943 | device_create_file(&serio->dev, &psmouse_attr_protocol); | 960 | sysfs_create_group(&serio->dev.kobj, &psmouse_attribute_group); |
944 | device_create_file(&serio->dev, &psmouse_attr_rate); | ||
945 | device_create_file(&serio->dev, &psmouse_attr_resolution); | ||
946 | device_create_file(&serio->dev, &psmouse_attr_resetafter); | ||
947 | 961 | ||
948 | psmouse_activate(psmouse); | 962 | psmouse_activate(psmouse); |
949 | 963 | ||
@@ -1040,10 +1054,12 @@ static struct serio_driver psmouse_drv = { | |||
1040 | .cleanup = psmouse_cleanup, | 1054 | .cleanup = psmouse_cleanup, |
1041 | }; | 1055 | }; |
1042 | 1056 | ||
1043 | ssize_t psmouse_attr_show_helper(struct device *dev, char *buf, | 1057 | ssize_t psmouse_attr_show_helper(struct device *dev, struct device_attribute *devattr, |
1044 | ssize_t (*handler)(struct psmouse *, char *)) | 1058 | char *buf) |
1045 | { | 1059 | { |
1046 | struct serio *serio = to_serio_port(dev); | 1060 | struct serio *serio = to_serio_port(dev); |
1061 | struct psmouse_attribute *attr = to_psmouse_attr(devattr); | ||
1062 | struct psmouse *psmouse; | ||
1047 | int retval; | 1063 | int retval; |
1048 | 1064 | ||
1049 | retval = serio_pin_driver(serio); | 1065 | retval = serio_pin_driver(serio); |
@@ -1055,19 +1071,21 @@ ssize_t psmouse_attr_show_helper(struct device *dev, char *buf, | |||
1055 | goto out; | 1071 | goto out; |
1056 | } | 1072 | } |
1057 | 1073 | ||
1058 | retval = handler(serio_get_drvdata(serio), buf); | 1074 | psmouse = serio_get_drvdata(serio); |
1075 | |||
1076 | retval = attr->show(psmouse, attr->data, buf); | ||
1059 | 1077 | ||
1060 | out: | 1078 | out: |
1061 | serio_unpin_driver(serio); | 1079 | serio_unpin_driver(serio); |
1062 | return retval; | 1080 | return retval; |
1063 | } | 1081 | } |
1064 | 1082 | ||
1065 | ssize_t psmouse_attr_set_helper(struct device *dev, const char *buf, size_t count, | 1083 | ssize_t psmouse_attr_set_helper(struct device *dev, struct device_attribute *devattr, |
1066 | ssize_t (*handler)(struct psmouse *, const char *, size_t)) | 1084 | const char *buf, size_t count) |
1067 | { | 1085 | { |
1068 | struct serio *serio = to_serio_port(dev); | 1086 | struct serio *serio = to_serio_port(dev); |
1069 | struct psmouse *psmouse = serio_get_drvdata(serio); | 1087 | struct psmouse_attribute *attr = to_psmouse_attr(devattr); |
1070 | struct psmouse *parent = NULL; | 1088 | struct psmouse *psmouse, *parent = NULL; |
1071 | int retval; | 1089 | int retval; |
1072 | 1090 | ||
1073 | retval = serio_pin_driver(serio); | 1091 | retval = serio_pin_driver(serio); |
@@ -1083,6 +1101,8 @@ ssize_t psmouse_attr_set_helper(struct device *dev, const char *buf, size_t coun | |||
1083 | if (retval) | 1101 | if (retval) |
1084 | goto out_unpin; | 1102 | goto out_unpin; |
1085 | 1103 | ||
1104 | psmouse = serio_get_drvdata(serio); | ||
1105 | |||
1086 | if (psmouse->state == PSMOUSE_IGNORE) { | 1106 | if (psmouse->state == PSMOUSE_IGNORE) { |
1087 | retval = -ENODEV; | 1107 | retval = -ENODEV; |
1088 | goto out_up; | 1108 | goto out_up; |
@@ -1095,7 +1115,7 @@ ssize_t psmouse_attr_set_helper(struct device *dev, const char *buf, size_t coun | |||
1095 | 1115 | ||
1096 | psmouse_deactivate(psmouse); | 1116 | psmouse_deactivate(psmouse); |
1097 | 1117 | ||
1098 | retval = handler(psmouse, buf, count); | 1118 | retval = attr->set(psmouse, attr->data, buf, count); |
1099 | 1119 | ||
1100 | if (retval != -ENODEV) | 1120 | if (retval != -ENODEV) |
1101 | psmouse_activate(psmouse); | 1121 | psmouse_activate(psmouse); |
@@ -1110,12 +1130,34 @@ ssize_t psmouse_attr_set_helper(struct device *dev, const char *buf, size_t coun | |||
1110 | return retval; | 1130 | return retval; |
1111 | } | 1131 | } |
1112 | 1132 | ||
1113 | static ssize_t psmouse_attr_show_protocol(struct psmouse *psmouse, char *buf) | 1133 | static ssize_t psmouse_show_int_attr(struct psmouse *psmouse, void *offset, char *buf) |
1134 | { | ||
1135 | unsigned long *field = (unsigned long *)((char *)psmouse + (size_t)offset); | ||
1136 | |||
1137 | return sprintf(buf, "%lu\n", *field); | ||
1138 | } | ||
1139 | |||
1140 | static ssize_t psmouse_set_int_attr(struct psmouse *psmouse, void *offset, const char *buf, size_t count) | ||
1141 | { | ||
1142 | unsigned long *field = (unsigned long *)((char *)psmouse + (size_t)offset); | ||
1143 | unsigned long value; | ||
1144 | char *rest; | ||
1145 | |||
1146 | value = simple_strtoul(buf, &rest, 10); | ||
1147 | if (*rest) | ||
1148 | return -EINVAL; | ||
1149 | |||
1150 | *field = value; | ||
1151 | |||
1152 | return count; | ||
1153 | } | ||
1154 | |||
1155 | static ssize_t psmouse_attr_show_protocol(struct psmouse *psmouse, void *data, char *buf) | ||
1114 | { | 1156 | { |
1115 | return sprintf(buf, "%s\n", psmouse_protocol_by_type(psmouse->type)->name); | 1157 | return sprintf(buf, "%s\n", psmouse_protocol_by_type(psmouse->type)->name); |
1116 | } | 1158 | } |
1117 | 1159 | ||
1118 | static ssize_t psmouse_attr_set_protocol(struct psmouse *psmouse, const char *buf, size_t count) | 1160 | static ssize_t psmouse_attr_set_protocol(struct psmouse *psmouse, void *data, const char *buf, size_t count) |
1119 | { | 1161 | { |
1120 | struct serio *serio = psmouse->ps2dev.serio; | 1162 | struct serio *serio = psmouse->ps2dev.serio; |
1121 | struct psmouse *parent = NULL; | 1163 | struct psmouse *parent = NULL; |
@@ -1179,12 +1221,7 @@ static ssize_t psmouse_attr_set_protocol(struct psmouse *psmouse, const char *bu | |||
1179 | return count; | 1221 | return count; |
1180 | } | 1222 | } |
1181 | 1223 | ||
1182 | static ssize_t psmouse_attr_show_rate(struct psmouse *psmouse, char *buf) | 1224 | static ssize_t psmouse_attr_set_rate(struct psmouse *psmouse, void *data, const char *buf, size_t count) |
1183 | { | ||
1184 | return sprintf(buf, "%d\n", psmouse->rate); | ||
1185 | } | ||
1186 | |||
1187 | static ssize_t psmouse_attr_set_rate(struct psmouse *psmouse, const char *buf, size_t count) | ||
1188 | { | 1225 | { |
1189 | unsigned long value; | 1226 | unsigned long value; |
1190 | char *rest; | 1227 | char *rest; |
@@ -1197,12 +1234,7 @@ static ssize_t psmouse_attr_set_rate(struct psmouse *psmouse, const char *buf, s | |||
1197 | return count; | 1234 | return count; |
1198 | } | 1235 | } |
1199 | 1236 | ||
1200 | static ssize_t psmouse_attr_show_resolution(struct psmouse *psmouse, char *buf) | 1237 | static ssize_t psmouse_attr_set_resolution(struct psmouse *psmouse, void *data, const char *buf, size_t count) |
1201 | { | ||
1202 | return sprintf(buf, "%d\n", psmouse->resolution); | ||
1203 | } | ||
1204 | |||
1205 | static ssize_t psmouse_attr_set_resolution(struct psmouse *psmouse, const char *buf, size_t count) | ||
1206 | { | 1238 | { |
1207 | unsigned long value; | 1239 | unsigned long value; |
1208 | char *rest; | 1240 | char *rest; |
@@ -1215,23 +1247,6 @@ static ssize_t psmouse_attr_set_resolution(struct psmouse *psmouse, const char * | |||
1215 | return count; | 1247 | return count; |
1216 | } | 1248 | } |
1217 | 1249 | ||
1218 | static ssize_t psmouse_attr_show_resetafter(struct psmouse *psmouse, char *buf) | ||
1219 | { | ||
1220 | return sprintf(buf, "%d\n", psmouse->resetafter); | ||
1221 | } | ||
1222 | |||
1223 | static ssize_t psmouse_attr_set_resetafter(struct psmouse *psmouse, const char *buf, size_t count) | ||
1224 | { | ||
1225 | unsigned long value; | ||
1226 | char *rest; | ||
1227 | |||
1228 | value = simple_strtoul(buf, &rest, 10); | ||
1229 | if (*rest) | ||
1230 | return -EINVAL; | ||
1231 | |||
1232 | psmouse->resetafter = value; | ||
1233 | return count; | ||
1234 | } | ||
1235 | 1250 | ||
1236 | static int psmouse_set_maxproto(const char *val, struct kernel_param *kp) | 1251 | static int psmouse_set_maxproto(const char *val, struct kernel_param *kp) |
1237 | { | 1252 | { |
diff --git a/drivers/input/mouse/psmouse.h b/drivers/input/mouse/psmouse.h index e312a6b41681..45d2bd774f00 100644 --- a/drivers/input/mouse/psmouse.h +++ b/drivers/input/mouse/psmouse.h | |||
@@ -86,24 +86,37 @@ int psmouse_sliced_command(struct psmouse *psmouse, unsigned char command); | |||
86 | int psmouse_reset(struct psmouse *psmouse); | 86 | int psmouse_reset(struct psmouse *psmouse); |
87 | void psmouse_set_resolution(struct psmouse *psmouse, unsigned int resolution); | 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, | 89 | |
90 | ssize_t (*handler)(struct psmouse *, char *)); | 90 | struct psmouse_attribute { |
91 | ssize_t psmouse_attr_set_helper(struct device *dev, const char *buf, size_t count, | 91 | struct device_attribute dattr; |
92 | ssize_t (*handler)(struct psmouse *, const char *, size_t)); | 92 | void *data; |
93 | 93 | ssize_t (*show)(struct psmouse *psmouse, void *data, char *buf); | |
94 | #define PSMOUSE_DEFINE_ATTR(_name) \ | 94 | ssize_t (*set)(struct psmouse *psmouse, void *data, |
95 | static ssize_t psmouse_attr_show_##_name(struct psmouse *, char *); \ | 95 | const char *buf, size_t count); |
96 | static ssize_t psmouse_attr_set_##_name(struct psmouse *, const char *, size_t);\ | 96 | }; |
97 | static ssize_t psmouse_do_show_##_name(struct device *d, struct device_attribute *attr, char *b) \ | 97 | #define to_psmouse_attr(a) container_of((a), struct psmouse_attribute, dattr) |
98 | { \ | 98 | |
99 | return psmouse_attr_show_helper(d, b, psmouse_attr_show_##_name); \ | 99 | ssize_t psmouse_attr_show_helper(struct device *dev, struct device_attribute *attr, |
100 | } \ | 100 | char *buf); |
101 | static ssize_t psmouse_do_set_##_name(struct device *d, struct device_attribute *attr, const char *b, size_t s)\ | 101 | ssize_t psmouse_attr_set_helper(struct device *dev, struct device_attribute *attr, |
102 | { \ | 102 | const char *buf, size_t count); |
103 | return psmouse_attr_set_helper(d, b, s, psmouse_attr_set_##_name); \ | 103 | |
104 | } \ | 104 | #define PSMOUSE_DEFINE_ATTR(_name, _mode, _data, _show, _set) \ |
105 | static struct device_attribute psmouse_attr_##_name = \ | 105 | static ssize_t _show(struct psmouse *, void *data, char *); \ |
106 | __ATTR(_name, S_IWUSR | S_IRUGO, \ | 106 | static ssize_t _set(struct psmouse *, void *data, const char *, size_t); \ |
107 | psmouse_do_show_##_name, psmouse_do_set_##_name); | 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 | #endif /* _PSMOUSE_H */ | 122 | #endif /* _PSMOUSE_H */ |
diff --git a/drivers/input/mouse/trackpoint.c b/drivers/input/mouse/trackpoint.c index aee3b24a9102..b4898d8a68e2 100644 --- a/drivers/input/mouse/trackpoint.c +++ b/drivers/input/mouse/trackpoint.c | |||
@@ -19,54 +19,6 @@ | |||
19 | #include "psmouse.h" | 19 | #include "psmouse.h" |
20 | #include "trackpoint.h" | 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 | * Device IO: read, write and toggle bit | 23 | * Device IO: read, write and toggle bit |
72 | */ | 24 | */ |
@@ -108,59 +60,114 @@ static int trackpoint_toggle_bit(struct ps2dev *ps2dev, unsigned char loc, unsig | |||
108 | return 0; | 60 | return 0; |
109 | } | 61 | } |
110 | 62 | ||
111 | MAKE_ATTR_WRITE(sensitivity, TP_SENS); | ||
112 | MAKE_ATTR_READ(sensitivity); | ||
113 | |||
114 | MAKE_ATTR_WRITE(speed, TP_SPEED); | ||
115 | MAKE_ATTR_READ(speed); | ||
116 | 63 | ||
117 | MAKE_ATTR_WRITE(inertia, TP_INERTIA); | 64 | /* |
118 | MAKE_ATTR_READ(inertia); | 65 | * Trackpoint-specific attributes |
66 | */ | ||
67 | struct trackpoint_attr_data { | ||
68 | size_t field_offset; | ||
69 | unsigned char command; | ||
70 | unsigned char mask; | ||
71 | }; | ||
119 | 72 | ||
120 | MAKE_ATTR_WRITE(reach, TP_REACH); | 73 | static ssize_t trackpoint_show_int_attr(struct psmouse *psmouse, void *data, char *buf) |
121 | MAKE_ATTR_READ(reach); | 74 | { |
75 | struct trackpoint_data *tp = psmouse->private; | ||
76 | struct trackpoint_attr_data *attr = data; | ||
77 | unsigned char *field = (unsigned char *)((char *)tp + attr->field_offset); | ||
122 | 78 | ||
123 | MAKE_ATTR_WRITE(draghys, TP_DRAGHYS); | 79 | return sprintf(buf, "%u\n", *field); |
124 | MAKE_ATTR_READ(draghys); | 80 | } |
125 | 81 | ||
126 | MAKE_ATTR_WRITE(mindrag, TP_MINDRAG); | 82 | static ssize_t trackpoint_set_int_attr(struct psmouse *psmouse, void *data, |
127 | MAKE_ATTR_READ(mindrag); | 83 | const char *buf, size_t count) |
84 | { | ||
85 | struct trackpoint_data *tp = psmouse->private; | ||
86 | struct trackpoint_attr_data *attr = data; | ||
87 | unsigned char *field = (unsigned char *)((char *)tp + attr->field_offset); | ||
88 | unsigned long value; | ||
89 | char *rest; | ||
128 | 90 | ||
129 | MAKE_ATTR_WRITE(thresh, TP_THRESH); | 91 | value = simple_strtoul(buf, &rest, 10); |
130 | MAKE_ATTR_READ(thresh); | 92 | if (*rest || value > 255) |
93 | return -EINVAL; | ||
131 | 94 | ||
132 | MAKE_ATTR_WRITE(upthresh, TP_UP_THRESH); | 95 | *field = value; |
133 | MAKE_ATTR_READ(upthresh); | 96 | trackpoint_write(&psmouse->ps2dev, attr->command, value); |
134 | 97 | ||
135 | MAKE_ATTR_WRITE(ztime, TP_Z_TIME); | 98 | return count; |
136 | MAKE_ATTR_READ(ztime); | 99 | } |
137 | 100 | ||
138 | MAKE_ATTR_WRITE(jenks, TP_JENKS_CURV); | 101 | #define TRACKPOINT_INT_ATTR(_name, _command) \ |
139 | MAKE_ATTR_READ(jenks); | 102 | static struct trackpoint_attr_data trackpoint_attr_##_name = { \ |
103 | .field_offset = offsetof(struct trackpoint_data, _name), \ | ||
104 | .command = _command, \ | ||
105 | }; \ | ||
106 | PSMOUSE_DEFINE_ATTR(_name, S_IWUSR | S_IRUGO, \ | ||
107 | &trackpoint_attr_##_name, \ | ||
108 | trackpoint_show_int_attr, trackpoint_set_int_attr) | ||
109 | |||
110 | static ssize_t trackpoint_set_bit_attr(struct psmouse *psmouse, void *data, | ||
111 | const char *buf, size_t count) | ||
112 | { | ||
113 | struct trackpoint_data *tp = psmouse->private; | ||
114 | struct trackpoint_attr_data *attr = data; | ||
115 | unsigned char *field = (unsigned char *)((char *)tp + attr->field_offset); | ||
116 | unsigned long value; | ||
117 | char *rest; | ||
118 | |||
119 | value = simple_strtoul(buf, &rest, 10); | ||
120 | if (*rest || value > 1) | ||
121 | return -EINVAL; | ||
122 | |||
123 | if (*field != value) { | ||
124 | *field = value; | ||
125 | trackpoint_toggle_bit(&psmouse->ps2dev, attr->command, attr->mask); | ||
126 | } | ||
140 | 127 | ||
141 | MAKE_ATTR_TOGGLE(press_to_select, TP_TOGGLE_PTSON, TP_MASK_PTSON); | 128 | return count; |
142 | MAKE_ATTR_READ(press_to_select); | 129 | } |
143 | 130 | ||
144 | MAKE_ATTR_TOGGLE(skipback, TP_TOGGLE_SKIPBACK, TP_MASK_SKIPBACK); | ||
145 | MAKE_ATTR_READ(skipback); | ||
146 | 131 | ||
147 | MAKE_ATTR_TOGGLE(ext_dev, TP_TOGGLE_EXT_DEV, TP_MASK_EXT_DEV); | 132 | #define TRACKPOINT_BIT_ATTR(_name, _command, _mask) \ |
148 | MAKE_ATTR_READ(ext_dev); | 133 | static struct trackpoint_attr_data trackpoint_attr_##_name = { \ |
134 | .field_offset = offsetof(struct trackpoint_data, _name), \ | ||
135 | .command = _command, \ | ||
136 | .mask = _mask, \ | ||
137 | }; \ | ||
138 | PSMOUSE_DEFINE_ATTR(_name, S_IWUSR | S_IRUGO, \ | ||
139 | &trackpoint_attr_##_name, \ | ||
140 | trackpoint_show_int_attr, trackpoint_set_bit_attr) | ||
141 | |||
142 | TRACKPOINT_INT_ATTR(sensitivity, TP_SENS); | ||
143 | TRACKPOINT_INT_ATTR(speed, TP_SPEED); | ||
144 | TRACKPOINT_INT_ATTR(inertia, TP_INERTIA); | ||
145 | TRACKPOINT_INT_ATTR(reach, TP_REACH); | ||
146 | TRACKPOINT_INT_ATTR(draghys, TP_DRAGHYS); | ||
147 | TRACKPOINT_INT_ATTR(mindrag, TP_MINDRAG); | ||
148 | TRACKPOINT_INT_ATTR(thresh, TP_THRESH); | ||
149 | TRACKPOINT_INT_ATTR(upthresh, TP_UP_THRESH); | ||
150 | TRACKPOINT_INT_ATTR(ztime, TP_Z_TIME); | ||
151 | TRACKPOINT_INT_ATTR(jenks, TP_JENKS_CURV); | ||
152 | |||
153 | TRACKPOINT_BIT_ATTR(press_to_select, TP_TOGGLE_PTSON, TP_MASK_PTSON); | ||
154 | TRACKPOINT_BIT_ATTR(skipback, TP_TOGGLE_SKIPBACK, TP_MASK_SKIPBACK); | ||
155 | TRACKPOINT_BIT_ATTR(ext_dev, TP_TOGGLE_EXT_DEV, TP_MASK_EXT_DEV); | ||
149 | 156 | ||
150 | static struct attribute *trackpoint_attrs[] = { | 157 | static struct attribute *trackpoint_attrs[] = { |
151 | &psmouse_attr_sensitivity.attr, | 158 | &psmouse_attr_sensitivity.dattr.attr, |
152 | &psmouse_attr_speed.attr, | 159 | &psmouse_attr_speed.dattr.attr, |
153 | &psmouse_attr_inertia.attr, | 160 | &psmouse_attr_inertia.dattr.attr, |
154 | &psmouse_attr_reach.attr, | 161 | &psmouse_attr_reach.dattr.attr, |
155 | &psmouse_attr_draghys.attr, | 162 | &psmouse_attr_draghys.dattr.attr, |
156 | &psmouse_attr_mindrag.attr, | 163 | &psmouse_attr_mindrag.dattr.attr, |
157 | &psmouse_attr_thresh.attr, | 164 | &psmouse_attr_thresh.dattr.attr, |
158 | &psmouse_attr_upthresh.attr, | 165 | &psmouse_attr_upthresh.dattr.attr, |
159 | &psmouse_attr_ztime.attr, | 166 | &psmouse_attr_ztime.dattr.attr, |
160 | &psmouse_attr_jenks.attr, | 167 | &psmouse_attr_jenks.dattr.attr, |
161 | &psmouse_attr_press_to_select.attr, | 168 | &psmouse_attr_press_to_select.dattr.attr, |
162 | &psmouse_attr_skipback.attr, | 169 | &psmouse_attr_skipback.dattr.attr, |
163 | &psmouse_attr_ext_dev.attr, | 170 | &psmouse_attr_ext_dev.dattr.attr, |
164 | NULL | 171 | NULL |
165 | }; | 172 | }; |
166 | 173 | ||