From 9b6810ba6e1bd2553e205eb6719844253d5ce051 Mon Sep 17 00:00:00 2001 From: Kimplul Date: Sat, 12 Mar 2022 20:53:39 +0200 Subject: fix crashes --- hid-tmff2.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) (limited to 'hid-tmff2.c') diff --git a/hid-tmff2.c b/hid-tmff2.c index f1d1f84..6a112fa 100644 --- a/hid-tmff2.c +++ b/hid-tmff2.c @@ -52,15 +52,15 @@ static struct tmff2_device_entry *tmff2_from_hdev(struct hid_device *hdev) static struct tmff2_device_entry *tmff2_from_input(struct input_dev *input_dev) { - struct tmff2_device_entry *tmff2; + struct hid_device *hdev; spin_lock_irqsave(&lock, lock_flags); - if (!(tmff2 = input_get_drvdata(input_dev))) { + if (!(hdev = input_get_drvdata(input_dev))) { dev_err(&input_dev->dev, "input_dev private data not found\n"); return NULL; } spin_unlock_irqrestore(&lock, lock_flags); - return tmff2; + return tmff2_from_hdev(hdev); } static ssize_t spring_level_store(struct device *dev, @@ -301,7 +301,7 @@ static void tmff2_work_handler(struct work_struct *w) } if (test_bit(FF_EFFECT_QUEUE_START, &state->flags)) { - if (tmff2->play_effect(tmff2, state)) { + if (tmff2->play_effect(tmff2->data, state)) { hid_warn(tmff2->hdev, "failed starting effect\n"); } else { __clear_bit(FF_EFFECT_QUEUE_START, &state->flags); @@ -311,7 +311,7 @@ static void tmff2_work_handler(struct work_struct *w) } if (test_bit(FF_EFFECT_QUEUE_STOP, &state->flags)) { - if (tmff2->stop_effect(tmff2, state)) { + if (tmff2->stop_effect(tmff2->data, state)) { hid_warn(tmff2->hdev, "failed stopping effect\n"); } else { __clear_bit(FF_EFFECT_PLAYING, &state->flags); @@ -420,9 +420,15 @@ static int tmff2_wheel_init(struct tmff2_device_entry *tmff2) { int ret, i; struct ff_device *ff; + spin_lock_init(&lock); spin_lock_init(&tmff2->lock); INIT_DELAYED_WORK(&tmff2->work, tmff2_work_handler); + /* get parameters etc from backend */ + if ((ret = tmff2->wheel_init(tmff2))) + goto err; + + tmff2->states = kzalloc(sizeof(struct tmff2_effect_state) * tmff2->max_effects, GFP_KERNEL); @@ -431,10 +437,6 @@ static int tmff2_wheel_init(struct tmff2_device_entry *tmff2) goto err; } - /* is this required or should it be done in t300rs_populate_api? */ - if ((ret = tmff2->wheel_init(tmff2->data))) - goto err; - /* set supported effects into input_dev->ffbit */ for (i = 0; tmff2->supported_effects[i] >= 0; ++i) __set_bit(tmff2->supported_effects[i], tmff2->input_dev->ffbit); @@ -482,8 +484,6 @@ static int tmff2_probe(struct hid_device *hdev, const struct hid_device_id *id) tmff2->hdev = hdev; hid_set_drvdata(tmff2->hdev, tmff2); - tmff2->input_dev = list_entry(hdev->inputs.next, struct hid_input, list)->input; - input_set_drvdata(tmff2->input_dev, tmff2); switch (tmff2->hdev->product) { /* t300rs */ @@ -508,6 +508,8 @@ static int tmff2_probe(struct hid_device *hdev, const struct hid_device_id *id) goto hid_err; } + tmff2->input_dev = list_entry(hdev->inputs.next, struct hid_input, list)->input; + if ((ret = tmff2_wheel_init(tmff2))) { hid_err(hdev, "init failed\n"); goto init_err; -- cgit v1.3