aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input/input.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/input/input.c')
-rw-r--r--drivers/input/input.c87
1 files changed, 72 insertions, 15 deletions
diff --git a/drivers/input/input.c b/drivers/input/input.c
index ab060710688f..86cb2d2196ff 100644
--- a/drivers/input/input.c
+++ b/drivers/input/input.c
@@ -24,6 +24,7 @@
24#include <linux/mutex.h> 24#include <linux/mutex.h>
25#include <linux/rcupdate.h> 25#include <linux/rcupdate.h>
26#include <linux/smp_lock.h> 26#include <linux/smp_lock.h>
27#include "input-compat.h"
27 28
28MODULE_AUTHOR("Vojtech Pavlik <vojtech@suse.cz>"); 29MODULE_AUTHOR("Vojtech Pavlik <vojtech@suse.cz>");
29MODULE_DESCRIPTION("Input core"); 30MODULE_DESCRIPTION("Input core");
@@ -45,6 +46,7 @@ static unsigned int input_abs_bypass_init_data[] __initdata = {
45 ABS_MT_TOOL_TYPE, 46 ABS_MT_TOOL_TYPE,
46 ABS_MT_BLOB_ID, 47 ABS_MT_BLOB_ID,
47 ABS_MT_TRACKING_ID, 48 ABS_MT_TRACKING_ID,
49 ABS_MT_PRESSURE,
48 0 50 0
49}; 51};
50static unsigned long input_abs_bypass[BITS_TO_LONGS(ABS_CNT)]; 52static unsigned long input_abs_bypass[BITS_TO_LONGS(ABS_CNT)];
@@ -764,6 +766,40 @@ static int input_attach_handler(struct input_dev *dev, struct input_handler *han
764 return error; 766 return error;
765} 767}
766 768
769#ifdef CONFIG_COMPAT
770
771static int input_bits_to_string(char *buf, int buf_size,
772 unsigned long bits, bool skip_empty)
773{
774 int len = 0;
775
776 if (INPUT_COMPAT_TEST) {
777 u32 dword = bits >> 32;
778 if (dword || !skip_empty)
779 len += snprintf(buf, buf_size, "%x ", dword);
780
781 dword = bits & 0xffffffffUL;
782 if (dword || !skip_empty || len)
783 len += snprintf(buf + len, max(buf_size - len, 0),
784 "%x", dword);
785 } else {
786 if (bits || !skip_empty)
787 len += snprintf(buf, buf_size, "%lx", bits);
788 }
789
790 return len;
791}
792
793#else /* !CONFIG_COMPAT */
794
795static int input_bits_to_string(char *buf, int buf_size,
796 unsigned long bits, bool skip_empty)
797{
798 return bits || !skip_empty ?
799 snprintf(buf, buf_size, "%lx", bits) : 0;
800}
801
802#endif
767 803
768#ifdef CONFIG_PROC_FS 804#ifdef CONFIG_PROC_FS
769 805
@@ -832,14 +868,25 @@ static void input_seq_print_bitmap(struct seq_file *seq, const char *name,
832 unsigned long *bitmap, int max) 868 unsigned long *bitmap, int max)
833{ 869{
834 int i; 870 int i;
835 871 bool skip_empty = true;
836 for (i = BITS_TO_LONGS(max) - 1; i > 0; i--) 872 char buf[18];
837 if (bitmap[i])
838 break;
839 873
840 seq_printf(seq, "B: %s=", name); 874 seq_printf(seq, "B: %s=", name);
841 for (; i >= 0; i--) 875
842 seq_printf(seq, "%lx%s", bitmap[i], i > 0 ? " " : ""); 876 for (i = BITS_TO_LONGS(max) - 1; i >= 0; i--) {
877 if (input_bits_to_string(buf, sizeof(buf),
878 bitmap[i], skip_empty)) {
879 skip_empty = false;
880 seq_printf(seq, "%s%s", buf, i > 0 ? " " : "");
881 }
882 }
883
884 /*
885 * If no output was produced print a single 0.
886 */
887 if (skip_empty)
888 seq_puts(seq, "0");
889
843 seq_putc(seq, '\n'); 890 seq_putc(seq, '\n');
844} 891}
845 892
@@ -1128,14 +1175,23 @@ static int input_print_bitmap(char *buf, int buf_size, unsigned long *bitmap,
1128{ 1175{
1129 int i; 1176 int i;
1130 int len = 0; 1177 int len = 0;
1178 bool skip_empty = true;
1179
1180 for (i = BITS_TO_LONGS(max) - 1; i >= 0; i--) {
1181 len += input_bits_to_string(buf + len, max(buf_size - len, 0),
1182 bitmap[i], skip_empty);
1183 if (len) {
1184 skip_empty = false;
1185 if (i > 0)
1186 len += snprintf(buf + len, max(buf_size - len, 0), " ");
1187 }
1188 }
1131 1189
1132 for (i = BITS_TO_LONGS(max) - 1; i > 0; i--) 1190 /*
1133 if (bitmap[i]) 1191 * If no output was produced print a single 0.
1134 break; 1192 */
1135 1193 if (len == 0)
1136 for (; i >= 0; i--) 1194 len = snprintf(buf, buf_size, "%d", 0);
1137 len += snprintf(buf + len, max(buf_size - len, 0),
1138 "%lx%s", bitmap[i], i > 0 ? " " : "");
1139 1195
1140 if (add_cr) 1196 if (add_cr)
1141 len += snprintf(buf + len, max(buf_size - len, 0), "\n"); 1197 len += snprintf(buf + len, max(buf_size - len, 0), "\n");
@@ -1150,7 +1206,8 @@ static ssize_t input_dev_show_cap_##bm(struct device *dev, \
1150{ \ 1206{ \
1151 struct input_dev *input_dev = to_input_dev(dev); \ 1207 struct input_dev *input_dev = to_input_dev(dev); \
1152 int len = input_print_bitmap(buf, PAGE_SIZE, \ 1208 int len = input_print_bitmap(buf, PAGE_SIZE, \
1153 input_dev->bm##bit, ev##_MAX, 1); \ 1209 input_dev->bm##bit, ev##_MAX, \
1210 true); \
1154 return min_t(int, len, PAGE_SIZE); \ 1211 return min_t(int, len, PAGE_SIZE); \
1155} \ 1212} \
1156static DEVICE_ATTR(bm, S_IRUGO, input_dev_show_cap_##bm, NULL) 1213static DEVICE_ATTR(bm, S_IRUGO, input_dev_show_cap_##bm, NULL)
@@ -1214,7 +1271,7 @@ static int input_add_uevent_bm_var(struct kobj_uevent_env *env,
1214 1271
1215 len = input_print_bitmap(&env->buf[env->buflen - 1], 1272 len = input_print_bitmap(&env->buf[env->buflen - 1],
1216 sizeof(env->buf) - env->buflen, 1273 sizeof(env->buf) - env->buflen,
1217 bitmap, max, 0); 1274 bitmap, max, false);
1218 if (len >= (sizeof(env->buf) - env->buflen)) 1275 if (len >= (sizeof(env->buf) - env->buflen))
1219 return -ENOMEM; 1276 return -ENOMEM;
1220 1277