Skip to content

Commit 786295d

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 5db7b47 commit 786295d

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
@@ -114,6 +114,13 @@ MODULE_PARM_DESC(report_undeciphered, "Report undeciphered multi-touch state fie
114114
#define TRACKPAD2_RES_Y \
115115
((TRACKPAD2_MAX_Y - TRACKPAD2_MIN_Y) / (TRACKPAD2_DIMENSION_Y / 100))
116116

117+
118+
struct magicmouse_input_ops {
119+
int (*raw_event)(struct hid_device *hdev,
120+
struct hid_report *report, u8 *data, int size);
121+
int (*setup_input)(struct input_dev *input, struct hid_device *hdev);
122+
};
123+
117124
/**
118125
* struct magicmouse_sc - Tracks Magic Mouse-specific data.
119126
* @input: Input device through which we report events.
@@ -127,6 +134,7 @@ MODULE_PARM_DESC(report_undeciphered, "Report undeciphered multi-touch state fie
127134
* @hdev: Pointer to the underlying HID device.
128135
* @work: Workqueue to handle initialization retry for quirky devices.
129136
* @battery_timer: Timer for obtaining battery level information.
137+
* @input_ops: Input ops based on device type.
130138
*/
131139
struct magicmouse_sc {
132140
struct input_dev *input;
@@ -151,6 +159,7 @@ struct magicmouse_sc {
151159
struct hid_device *hdev;
152160
struct delayed_work work;
153161
struct timer_list battery_timer;
162+
struct magicmouse_input_ops input_ops;
154163
};
155164

156165
static int magicmouse_firm_touch(struct magicmouse_sc *msc)
@@ -389,6 +398,14 @@ static int magicmouse_raw_event(struct hid_device *hdev,
389398
struct hid_report *report, u8 *data, int size)
390399
{
391400
struct magicmouse_sc *msc = hid_get_drvdata(hdev);
401+
402+
return msc->input_ops.raw_event(hdev, report, data, size);
403+
}
404+
405+
static int magicmouse_raw_event_usb(struct hid_device *hdev,
406+
struct hid_report *report, u8 *data, int size)
407+
{
408+
struct magicmouse_sc *msc = hid_get_drvdata(hdev);
392409
struct input_dev *input = msc->input;
393410
int x = 0, y = 0, ii, clicks = 0, npoints;
394411

@@ -538,7 +555,17 @@ static int magicmouse_event(struct hid_device *hdev, struct hid_field *field,
538555
return 0;
539556
}
540557

541-
static int magicmouse_setup_input(struct input_dev *input, struct hid_device *hdev)
558+
559+
static int magicmouse_setup_input(struct input_dev *input,
560+
struct hid_device *hdev)
561+
{
562+
struct magicmouse_sc *msc = hid_get_drvdata(hdev);
563+
564+
return msc->input_ops.setup_input(input, hdev);
565+
}
566+
567+
static int magicmouse_setup_input_usb(struct input_dev *input,
568+
struct hid_device *hdev)
542569
{
543570
int error;
544571
int mt_flags = 0;
@@ -860,6 +887,9 @@ static int magicmouse_probe(struct hid_device *hdev,
860887
return -ENOMEM;
861888
}
862889

890+
msc->input_ops.raw_event = magicmouse_raw_event_usb;
891+
msc->input_ops.setup_input = magicmouse_setup_input_usb;
892+
863893
msc->scroll_accel = SCROLL_ACCEL_DEFAULT;
864894
msc->hdev = hdev;
865895
INIT_DEFERRABLE_WORK(&msc->work, magicmouse_enable_mt_work);

0 commit comments

Comments
 (0)