aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/hid/hid-sony.c32
1 files changed, 19 insertions, 13 deletions
diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c
index 774cd2210566..4ba904b02bc2 100644
--- a/drivers/hid/hid-sony.c
+++ b/drivers/hid/hid-sony.c
@@ -1028,6 +1028,7 @@ struct sony_sc {
1028 struct led_classdev *leds[MAX_LEDS]; 1028 struct led_classdev *leds[MAX_LEDS];
1029 unsigned long quirks; 1029 unsigned long quirks;
1030 struct work_struct state_worker; 1030 struct work_struct state_worker;
1031 void(*send_output_report)(struct sony_sc*);
1031 struct power_supply *battery; 1032 struct power_supply *battery;
1032 struct power_supply_desc battery_desc; 1033 struct power_supply_desc battery_desc;
1033 int device_id; 1034 int device_id;
@@ -1789,7 +1790,7 @@ error_leds:
1789 return ret; 1790 return ret;
1790} 1791}
1791 1792
1792static void sixaxis_state_worker(struct work_struct *work) 1793static void sixaxis_send_output_report(struct sony_sc *sc)
1793{ 1794{
1794 static const union sixaxis_output_report_01 default_report = { 1795 static const union sixaxis_output_report_01 default_report = {
1795 .buf = { 1796 .buf = {
@@ -1803,7 +1804,6 @@ static void sixaxis_state_worker(struct work_struct *work)
1803 0x00, 0x00, 0x00, 0x00, 0x00 1804 0x00, 0x00, 0x00, 0x00, 0x00
1804 } 1805 }
1805 }; 1806 };
1806 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
1807 struct sixaxis_output_report *report = 1807 struct sixaxis_output_report *report =
1808 (struct sixaxis_output_report *)sc->output_report_dmabuf; 1808 (struct sixaxis_output_report *)sc->output_report_dmabuf;
1809 int n; 1809 int n;
@@ -1846,9 +1846,8 @@ static void sixaxis_state_worker(struct work_struct *work)
1846 HID_OUTPUT_REPORT, HID_REQ_SET_REPORT); 1846 HID_OUTPUT_REPORT, HID_REQ_SET_REPORT);
1847} 1847}
1848 1848
1849static void dualshock4_state_worker(struct work_struct *work) 1849static void dualshock4_send_output_report(struct sony_sc *sc)
1850{ 1850{
1851 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
1852 struct hid_device *hdev = sc->hdev; 1851 struct hid_device *hdev = sc->hdev;
1853 __u8 *buf = sc->output_report_dmabuf; 1852 __u8 *buf = sc->output_report_dmabuf;
1854 int offset; 1853 int offset;
@@ -1893,9 +1892,8 @@ static void dualshock4_state_worker(struct work_struct *work)
1893 HID_OUTPUT_REPORT, HID_REQ_SET_REPORT); 1892 HID_OUTPUT_REPORT, HID_REQ_SET_REPORT);
1894} 1893}
1895 1894
1896static void motion_state_worker(struct work_struct *work) 1895static void motion_send_output_report(struct sony_sc *sc)
1897{ 1896{
1898 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
1899 struct hid_device *hdev = sc->hdev; 1897 struct hid_device *hdev = sc->hdev;
1900 struct motion_output_report_02 *report = 1898 struct motion_output_report_02 *report =
1901 (struct motion_output_report_02 *)sc->output_report_dmabuf; 1899 (struct motion_output_report_02 *)sc->output_report_dmabuf;
@@ -1914,6 +1912,12 @@ static void motion_state_worker(struct work_struct *work)
1914 hid_hw_output_report(hdev, (__u8 *)report, MOTION_REPORT_0x02_SIZE); 1912 hid_hw_output_report(hdev, (__u8 *)report, MOTION_REPORT_0x02_SIZE);
1915} 1913}
1916 1914
1915static void sony_state_worker(struct work_struct *work)
1916{
1917 struct sony_sc *sc = container_of(work, struct sony_sc, state_worker);
1918 sc->send_output_report(sc);
1919}
1920
1917static int sony_allocate_output_report(struct sony_sc *sc) 1921static int sony_allocate_output_report(struct sony_sc *sc)
1918{ 1922{
1919 if ((sc->quirks & SIXAXIS_CONTROLLER) || 1923 if ((sc->quirks & SIXAXIS_CONTROLLER) ||
@@ -2241,11 +2245,13 @@ static void sony_release_device_id(struct sony_sc *sc)
2241 } 2245 }
2242} 2246}
2243 2247
2244static inline void sony_init_work(struct sony_sc *sc, 2248static inline void sony_init_output_report(struct sony_sc *sc,
2245 void (*worker)(struct work_struct *)) 2249 void(*send_output_report)(struct sony_sc*))
2246{ 2250{
2251 sc->send_output_report = send_output_report;
2252
2247 if (!sc->worker_initialized) 2253 if (!sc->worker_initialized)
2248 INIT_WORK(&sc->state_worker, worker); 2254 INIT_WORK(&sc->state_worker, sony_state_worker);
2249 2255
2250 sc->worker_initialized = 1; 2256 sc->worker_initialized = 1;
2251} 2257}
@@ -2319,7 +2325,7 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
2319 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP; 2325 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
2320 hdev->quirks |= HID_QUIRK_SKIP_OUTPUT_REPORT_ID; 2326 hdev->quirks |= HID_QUIRK_SKIP_OUTPUT_REPORT_ID;
2321 ret = sixaxis_set_operational_usb(hdev); 2327 ret = sixaxis_set_operational_usb(hdev);
2322 sony_init_work(sc, sixaxis_state_worker); 2328 sony_init_output_report(sc, sixaxis_send_output_report);
2323 } else if ((sc->quirks & SIXAXIS_CONTROLLER_BT) || 2329 } else if ((sc->quirks & SIXAXIS_CONTROLLER_BT) ||
2324 (sc->quirks & NAVIGATION_CONTROLLER_BT)) { 2330 (sc->quirks & NAVIGATION_CONTROLLER_BT)) {
2325 /* 2331 /*
@@ -2328,7 +2334,7 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
2328 */ 2334 */
2329 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP; 2335 hdev->quirks |= HID_QUIRK_NO_OUTPUT_REPORTS_ON_INTR_EP;
2330 ret = sixaxis_set_operational_bt(hdev); 2336 ret = sixaxis_set_operational_bt(hdev);
2331 sony_init_work(sc, sixaxis_state_worker); 2337 sony_init_output_report(sc, sixaxis_send_output_report);
2332 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) { 2338 } else if (sc->quirks & DUALSHOCK4_CONTROLLER) {
2333 if (sc->quirks & DUALSHOCK4_CONTROLLER_BT) { 2339 if (sc->quirks & DUALSHOCK4_CONTROLLER_BT) {
2334 /* 2340 /*
@@ -2343,9 +2349,9 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
2343 } 2349 }
2344 } 2350 }
2345 2351
2346 sony_init_work(sc, dualshock4_state_worker); 2352 sony_init_output_report(sc, dualshock4_send_output_report);
2347 } else if (sc->quirks & MOTION_CONTROLLER) { 2353 } else if (sc->quirks & MOTION_CONTROLLER) {
2348 sony_init_work(sc, motion_state_worker); 2354 sony_init_output_report(sc, motion_send_output_report);
2349 } else { 2355 } else {
2350 ret = 0; 2356 ret = 0;
2351 } 2357 }