Skip to content

Commit 615efbe

Browse files
committed
HID: magicmouse: use ops function pointers for input functionality
Will be used for supporting MacBook trackpads connected via SPI. Signed-off-by: Janne Grunau <j@jannau.net>
1 parent b3941a2 commit 615efbe

1 file changed

Lines changed: 31 additions & 1 deletion

File tree

drivers/hid/hid-magicmouse.c

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,13 @@ MODULE_PARM_DESC(report_undeciphered, "Report undeciphered multi-touch state fie
113113
#define TRACKPAD2_RES_Y \
114114
((TRACKPAD2_MAX_Y - TRACKPAD2_MIN_Y) / (TRACKPAD2_DIMENSION_Y / 100))
115115

116+
117+
struct magicmouse_input_ops {
118+
int (*raw_event)(struct hid_device *hdev,
119+
struct hid_report *report, u8 *data, int size);
120+
int (*setup_input)(struct input_dev *input, struct hid_device *hdev);
121+
};
122+
116123
/**
117124
* struct magicmouse_sc - Tracks Magic Mouse-specific data.
118125
* @input: Input device through which we report events.
@@ -126,6 +133,7 @@ MODULE_PARM_DESC(report_undeciphered, "Report undeciphered multi-touch state fie
126133
* @hdev: Pointer to the underlying HID device.
127134
* @work: Workqueue to handle initialization retry for quirky devices.
128135
* @battery_timer: Timer for obtaining battery level information.
136+
* @input_ops: Input ops based on device type.
129137
*/
130138
struct magicmouse_sc {
131139
struct input_dev *input;
@@ -150,6 +158,7 @@ struct magicmouse_sc {
150158
struct hid_device *hdev;
151159
struct delayed_work work;
152160
struct timer_list battery_timer;
161+
struct magicmouse_input_ops input_ops;
153162
};
154163

155164
static int magicmouse_firm_touch(struct magicmouse_sc *msc)
@@ -386,6 +395,14 @@ static int magicmouse_raw_event(struct hid_device *hdev,
386395
struct hid_report *report, u8 *data, int size)
387396
{
388397
struct magicmouse_sc *msc = hid_get_drvdata(hdev);
398+
399+
return msc->input_ops.raw_event(hdev, report, data, size);
400+
}
401+
402+
static int magicmouse_raw_event_usb(struct hid_device *hdev,
403+
struct hid_report *report, u8 *data, int size)
404+
{
405+
struct magicmouse_sc *msc = hid_get_drvdata(hdev);
389406
struct input_dev *input = msc->input;
390407
int x = 0, y = 0, ii, clicks = 0, npoints;
391408

@@ -533,7 +550,17 @@ static int magicmouse_event(struct hid_device *hdev, struct hid_field *field,
533550
return 0;
534551
}
535552

536-
static int magicmouse_setup_input(struct input_dev *input, struct hid_device *hdev)
553+
554+
static int magicmouse_setup_input(struct input_dev *input,
555+
struct hid_device *hdev)
556+
{
557+
struct magicmouse_sc *msc = hid_get_drvdata(hdev);
558+
559+
return msc->input_ops.setup_input(input, hdev);
560+
}
561+
562+
static int magicmouse_setup_input_usb(struct input_dev *input,
563+
struct hid_device *hdev)
537564
{
538565
int error;
539566
int mt_flags = 0;
@@ -829,6 +856,9 @@ static int magicmouse_probe(struct hid_device *hdev,
829856
return -ENOMEM;
830857
}
831858

859+
msc->input_ops.raw_event = magicmouse_raw_event_usb;
860+
msc->input_ops.setup_input = magicmouse_setup_input_usb;
861+
832862
msc->scroll_accel = SCROLL_ACCEL_DEFAULT;
833863
msc->hdev = hdev;
834864
INIT_DEFERRABLE_WORK(&msc->work, magicmouse_enable_mt_work);

0 commit comments

Comments
 (0)