Skip to content

Commit cca476e

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 e16f393 commit cca476e

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)
@@ -379,6 +388,14 @@ static int magicmouse_raw_event(struct hid_device *hdev,
379388
struct hid_report *report, u8 *data, int size)
380389
{
381390
struct magicmouse_sc *msc = hid_get_drvdata(hdev);
391+
392+
return msc->input_ops.raw_event(hdev, report, data, size);
393+
}
394+
395+
static int magicmouse_raw_event_usb(struct hid_device *hdev,
396+
struct hid_report *report, u8 *data, int size)
397+
{
398+
struct magicmouse_sc *msc = hid_get_drvdata(hdev);
382399
struct input_dev *input = msc->input;
383400
int x = 0, y = 0, ii, clicks = 0, npoints;
384401

@@ -524,7 +541,17 @@ static int magicmouse_event(struct hid_device *hdev, struct hid_field *field,
524541
return 0;
525542
}
526543

527-
static int magicmouse_setup_input(struct input_dev *input, struct hid_device *hdev)
544+
545+
static int magicmouse_setup_input(struct input_dev *input,
546+
struct hid_device *hdev)
547+
{
548+
struct magicmouse_sc *msc = hid_get_drvdata(hdev);
549+
550+
return msc->input_ops.setup_input(input, hdev);
551+
}
552+
553+
static int magicmouse_setup_input_usb(struct input_dev *input,
554+
struct hid_device *hdev)
528555
{
529556
int error;
530557
int mt_flags = 0;
@@ -811,6 +838,9 @@ static int magicmouse_probe(struct hid_device *hdev,
811838
return -ENOMEM;
812839
}
813840

841+
msc->input_ops.raw_event = magicmouse_raw_event_usb;
842+
msc->input_ops.setup_input = magicmouse_setup_input_usb;
843+
814844
msc->scroll_accel = SCROLL_ACCEL_DEFAULT;
815845
msc->hdev = hdev;
816846
INIT_DEFERRABLE_WORK(&msc->work, magicmouse_enable_mt_work);

0 commit comments

Comments
 (0)