aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Gerecke <killertofu@gmail.com>2017-03-31 13:02:05 -0400
committerJiri Kosina <jkosina@suse.cz>2017-04-06 08:55:54 -0400
commit149f6f6b8ff3288a88dc34755de7719637cc8cc4 (patch)
treefff7721839d9b3182ee2792a8db52d2c86f2d1d2
parented1fa736839eb97b1d066e36150df28251095eef (diff)
HID: wacom: Move wacom_remote_irq and wacom_remote_status_irq
These two functions awkwardly break up the otherwise-contiguous chunk of related Intuos IRQ functions with a 500 line tangent about the operation of the EKR. Their presence makes it difficult to read/navigate through the the Intuos code. Since there is no dependency between these functions, it is possible to simply move them down somewhat. This commit moves them to be after the final Intuos IRQ function. Signed-off-by: Jason Gerecke <jason.gerecke@wacom.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
-rw-r--r--drivers/hid/wacom_wac.c250
1 files changed, 125 insertions, 125 deletions
diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c
index 037a9962d053..6b8f6b816195 100644
--- a/drivers/hid/wacom_wac.c
+++ b/drivers/hid/wacom_wac.c
@@ -773,131 +773,6 @@ static int wacom_intuos_inout(struct wacom_wac *wacom)
773 return 0; 773 return 0;
774} 774}
775 775
776static int wacom_remote_irq(struct wacom_wac *wacom_wac, size_t len)
777{
778 unsigned char *data = wacom_wac->data;
779 struct input_dev *input;
780 struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac);
781 struct wacom_remote *remote = wacom->remote;
782 int bat_charging, bat_percent, touch_ring_mode;
783 __u32 serial;
784 int i, index = -1;
785 unsigned long flags;
786
787 if (data[0] != WACOM_REPORT_REMOTE) {
788 hid_dbg(wacom->hdev, "%s: received unknown report #%d",
789 __func__, data[0]);
790 return 0;
791 }
792
793 serial = data[3] + (data[4] << 8) + (data[5] << 16);
794 wacom_wac->id[0] = PAD_DEVICE_ID;
795
796 spin_lock_irqsave(&remote->remote_lock, flags);
797
798 for (i = 0; i < WACOM_MAX_REMOTES; i++) {
799 if (remote->remotes[i].serial == serial) {
800 index = i;
801 break;
802 }
803 }
804
805 if (index < 0 || !remote->remotes[index].registered)
806 goto out;
807
808 input = remote->remotes[index].input;
809
810 input_report_key(input, BTN_0, (data[9] & 0x01));
811 input_report_key(input, BTN_1, (data[9] & 0x02));
812 input_report_key(input, BTN_2, (data[9] & 0x04));
813 input_report_key(input, BTN_3, (data[9] & 0x08));
814 input_report_key(input, BTN_4, (data[9] & 0x10));
815 input_report_key(input, BTN_5, (data[9] & 0x20));
816 input_report_key(input, BTN_6, (data[9] & 0x40));
817 input_report_key(input, BTN_7, (data[9] & 0x80));
818
819 input_report_key(input, BTN_8, (data[10] & 0x01));
820 input_report_key(input, BTN_9, (data[10] & 0x02));
821 input_report_key(input, BTN_A, (data[10] & 0x04));
822 input_report_key(input, BTN_B, (data[10] & 0x08));
823 input_report_key(input, BTN_C, (data[10] & 0x10));
824 input_report_key(input, BTN_X, (data[10] & 0x20));
825 input_report_key(input, BTN_Y, (data[10] & 0x40));
826 input_report_key(input, BTN_Z, (data[10] & 0x80));
827
828 input_report_key(input, BTN_BASE, (data[11] & 0x01));
829 input_report_key(input, BTN_BASE2, (data[11] & 0x02));
830
831 if (data[12] & 0x80)
832 input_report_abs(input, ABS_WHEEL, (data[12] & 0x7f));
833 else
834 input_report_abs(input, ABS_WHEEL, 0);
835
836 bat_percent = data[7] & 0x7f;
837 bat_charging = !!(data[7] & 0x80);
838
839 if (data[9] | data[10] | (data[11] & 0x03) | data[12])
840 input_report_abs(input, ABS_MISC, PAD_DEVICE_ID);
841 else
842 input_report_abs(input, ABS_MISC, 0);
843
844 input_event(input, EV_MSC, MSC_SERIAL, serial);
845
846 input_sync(input);
847
848 /*Which mode select (LED light) is currently on?*/
849 touch_ring_mode = (data[11] & 0xC0) >> 6;
850
851 for (i = 0; i < WACOM_MAX_REMOTES; i++) {
852 if (remote->remotes[i].serial == serial)
853 wacom->led.groups[i].select = touch_ring_mode;
854 }
855
856 __wacom_notify_battery(&remote->remotes[index].battery, bat_percent,
857 bat_charging, 1, bat_charging);
858
859out:
860 spin_unlock_irqrestore(&remote->remote_lock, flags);
861 return 0;
862}
863
864static void wacom_remote_status_irq(struct wacom_wac *wacom_wac, size_t len)
865{
866 struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac);
867 unsigned char *data = wacom_wac->data;
868 struct wacom_remote *remote = wacom->remote;
869 struct wacom_remote_data remote_data;
870 unsigned long flags;
871 int i, ret;
872
873 if (data[0] != WACOM_REPORT_DEVICE_LIST)
874 return;
875
876 memset(&remote_data, 0, sizeof(struct wacom_remote_data));
877
878 for (i = 0; i < WACOM_MAX_REMOTES; i++) {
879 int j = i * 6;
880 int serial = (data[j+6] << 16) + (data[j+5] << 8) + data[j+4];
881 bool connected = data[j+2];
882
883 remote_data.remote[i].serial = serial;
884 remote_data.remote[i].connected = connected;
885 }
886
887 spin_lock_irqsave(&remote->remote_lock, flags);
888
889 ret = kfifo_in(&remote->remote_fifo, &remote_data, sizeof(remote_data));
890 if (ret != sizeof(remote_data)) {
891 spin_unlock_irqrestore(&remote->remote_lock, flags);
892 hid_err(wacom->hdev, "Can't queue Remote status event.\n");
893 return;
894 }
895
896 spin_unlock_irqrestore(&remote->remote_lock, flags);
897
898 wacom_schedule_work(wacom_wac, WACOM_WORKER_REMOTE);
899}
900
901static inline bool report_touch_events(struct wacom_wac *wacom) 776static inline bool report_touch_events(struct wacom_wac *wacom)
902{ 777{
903 return (touch_arbitration ? !wacom->shared->stylus_in_proximity : 1); 778 return (touch_arbitration ? !wacom->shared->stylus_in_proximity : 1);
@@ -1116,6 +991,131 @@ static int wacom_intuos_irq(struct wacom_wac *wacom)
1116 return 0; 991 return 0;
1117} 992}
1118 993
994static int wacom_remote_irq(struct wacom_wac *wacom_wac, size_t len)
995{
996 unsigned char *data = wacom_wac->data;
997 struct input_dev *input;
998 struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac);
999 struct wacom_remote *remote = wacom->remote;
1000 int bat_charging, bat_percent, touch_ring_mode;
1001 __u32 serial;
1002 int i, index = -1;
1003 unsigned long flags;
1004
1005 if (data[0] != WACOM_REPORT_REMOTE) {
1006 hid_dbg(wacom->hdev, "%s: received unknown report #%d",
1007 __func__, data[0]);
1008 return 0;
1009 }
1010
1011 serial = data[3] + (data[4] << 8) + (data[5] << 16);
1012 wacom_wac->id[0] = PAD_DEVICE_ID;
1013
1014 spin_lock_irqsave(&remote->remote_lock, flags);
1015
1016 for (i = 0; i < WACOM_MAX_REMOTES; i++) {
1017 if (remote->remotes[i].serial == serial) {
1018 index = i;
1019 break;
1020 }
1021 }
1022
1023 if (index < 0 || !remote->remotes[index].registered)
1024 goto out;
1025
1026 input = remote->remotes[index].input;
1027
1028 input_report_key(input, BTN_0, (data[9] & 0x01));
1029 input_report_key(input, BTN_1, (data[9] & 0x02));
1030 input_report_key(input, BTN_2, (data[9] & 0x04));
1031 input_report_key(input, BTN_3, (data[9] & 0x08));
1032 input_report_key(input, BTN_4, (data[9] & 0x10));
1033 input_report_key(input, BTN_5, (data[9] & 0x20));
1034 input_report_key(input, BTN_6, (data[9] & 0x40));
1035 input_report_key(input, BTN_7, (data[9] & 0x80));
1036
1037 input_report_key(input, BTN_8, (data[10] & 0x01));
1038 input_report_key(input, BTN_9, (data[10] & 0x02));
1039 input_report_key(input, BTN_A, (data[10] & 0x04));
1040 input_report_key(input, BTN_B, (data[10] & 0x08));
1041 input_report_key(input, BTN_C, (data[10] & 0x10));
1042 input_report_key(input, BTN_X, (data[10] & 0x20));
1043 input_report_key(input, BTN_Y, (data[10] & 0x40));
1044 input_report_key(input, BTN_Z, (data[10] & 0x80));
1045
1046 input_report_key(input, BTN_BASE, (data[11] & 0x01));
1047 input_report_key(input, BTN_BASE2, (data[11] & 0x02));
1048
1049 if (data[12] & 0x80)
1050 input_report_abs(input, ABS_WHEEL, (data[12] & 0x7f));
1051 else
1052 input_report_abs(input, ABS_WHEEL, 0);
1053
1054 bat_percent = data[7] & 0x7f;
1055 bat_charging = !!(data[7] & 0x80);
1056
1057 if (data[9] | data[10] | (data[11] & 0x03) | data[12])
1058 input_report_abs(input, ABS_MISC, PAD_DEVICE_ID);
1059 else
1060 input_report_abs(input, ABS_MISC, 0);
1061
1062 input_event(input, EV_MSC, MSC_SERIAL, serial);
1063
1064 input_sync(input);
1065
1066 /*Which mode select (LED light) is currently on?*/
1067 touch_ring_mode = (data[11] & 0xC0) >> 6;
1068
1069 for (i = 0; i < WACOM_MAX_REMOTES; i++) {
1070 if (remote->remotes[i].serial == serial)
1071 wacom->led.groups[i].select = touch_ring_mode;
1072 }
1073
1074 __wacom_notify_battery(&remote->remotes[index].battery, bat_percent,
1075 bat_charging, 1, bat_charging);
1076
1077out:
1078 spin_unlock_irqrestore(&remote->remote_lock, flags);
1079 return 0;
1080}
1081
1082static void wacom_remote_status_irq(struct wacom_wac *wacom_wac, size_t len)
1083{
1084 struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac);
1085 unsigned char *data = wacom_wac->data;
1086 struct wacom_remote *remote = wacom->remote;
1087 struct wacom_remote_data remote_data;
1088 unsigned long flags;
1089 int i, ret;
1090
1091 if (data[0] != WACOM_REPORT_DEVICE_LIST)
1092 return;
1093
1094 memset(&remote_data, 0, sizeof(struct wacom_remote_data));
1095
1096 for (i = 0; i < WACOM_MAX_REMOTES; i++) {
1097 int j = i * 6;
1098 int serial = (data[j+6] << 16) + (data[j+5] << 8) + data[j+4];
1099 bool connected = data[j+2];
1100
1101 remote_data.remote[i].serial = serial;
1102 remote_data.remote[i].connected = connected;
1103 }
1104
1105 spin_lock_irqsave(&remote->remote_lock, flags);
1106
1107 ret = kfifo_in(&remote->remote_fifo, &remote_data, sizeof(remote_data));
1108 if (ret != sizeof(remote_data)) {
1109 spin_unlock_irqrestore(&remote->remote_lock, flags);
1110 hid_err(wacom->hdev, "Can't queue Remote status event.\n");
1111 return;
1112 }
1113
1114 spin_unlock_irqrestore(&remote->remote_lock, flags);
1115
1116 wacom_schedule_work(wacom_wac, WACOM_WORKER_REMOTE);
1117}
1118
1119static int int_dist(int x1, int y1, int x2, int y2) 1119static int int_dist(int x1, int y1, int x2, int y2)
1120{ 1120{
1121 int x = x2 - x1; 1121 int x = x2 - x1;