mirror of
https://github.com/torvalds/linux.git
synced 2026-06-11 08:03:05 +02:00
misc: kxtf9: use own wq to schedule work
Change-Id: I7fda277459d5f6520827edc01c50535c303cbeea Signed-off-by: makarand.karvekar <makarand.karvekar@motorola.com>
This commit is contained in:
parent
82e5756a82
commit
a6741d3e16
|
|
@ -141,6 +141,7 @@ struct kxtf9_data {
|
|||
struct kxtf9_platform_data *pdata;
|
||||
struct mutex lock;
|
||||
struct delayed_work input_work;
|
||||
struct workqueue_struct *input_work_queue;
|
||||
struct input_dev *input_dev;
|
||||
struct work_struct irq_work;
|
||||
struct workqueue_struct *irq_work_queue;
|
||||
|
|
@ -693,8 +694,8 @@ static int kxtf9_enable(struct kxtf9_data *tf9)
|
|||
if (err < 0)
|
||||
dev_err(&tf9->client->dev,
|
||||
"odr write error: %d\n", err);
|
||||
schedule_delayed_work(&tf9->input_work,
|
||||
msecs_to_jiffies(tf9->pdata->poll_interval));
|
||||
queue_delayed_work(tf9->input_work_queue, &tf9->input_work,
|
||||
msecs_to_jiffies(tf9->pdata->poll_interval));
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
@ -944,12 +945,11 @@ static void kxtf9_input_work_func(struct work_struct *work)
|
|||
struct kxtf9_data *tf9 = container_of((struct delayed_work *)work,
|
||||
struct kxtf9_data, input_work);
|
||||
int xyz[3] = { 0 };
|
||||
|
||||
mutex_lock(&tf9->lock);
|
||||
if (kxtf9_get_acceleration_data(tf9, xyz) == 0)
|
||||
kxtf9_report_values(tf9, xyz);
|
||||
schedule_delayed_work(&tf9->input_work,
|
||||
msecs_to_jiffies(tf9->pdata->poll_interval));
|
||||
queue_delayed_work(tf9->input_work_queue, &tf9->input_work,
|
||||
msecs_to_jiffies(tf9->pdata->poll_interval));
|
||||
mutex_unlock(&tf9->lock);
|
||||
}
|
||||
|
||||
|
|
@ -1002,13 +1002,19 @@ static int kxtf9_input_init(struct kxtf9_data *tf9)
|
|||
int int_status = 0;
|
||||
u8 buf;
|
||||
|
||||
tf9->input_work_queue = create_singlethread_workqueue("kxtf9_input_wq");
|
||||
if (!tf9->input_work_queue) {
|
||||
err = -ENOMEM;
|
||||
pr_err("%s: could not create workqueue\n", __func__);
|
||||
goto err0;
|
||||
}
|
||||
INIT_DELAYED_WORK(&tf9->input_work, kxtf9_input_work_func);
|
||||
tf9->input_dev = input_allocate_device();
|
||||
if (!tf9->input_dev) {
|
||||
err = -ENOMEM;
|
||||
dev_err(&tf9->client->dev,
|
||||
"input device allocate failed: %d\n", err);
|
||||
goto err0;
|
||||
goto err1;
|
||||
}
|
||||
#ifdef kxtf9_OPEN_ENABLE
|
||||
tf9->input_dev->open = kxtf9_input_open;
|
||||
|
|
@ -1035,7 +1041,7 @@ static int kxtf9_input_init(struct kxtf9_data *tf9)
|
|||
dev_err(&tf9->client->dev,
|
||||
"unable to register input polled device %s: %d\n",
|
||||
tf9->input_dev->name, err);
|
||||
goto err1;
|
||||
goto err2;
|
||||
}
|
||||
if ((tf9->resume_state[RES_CTRL_REG1] & TPE) > 0) {
|
||||
buf = TILT_POS_CUR;
|
||||
|
|
@ -1052,8 +1058,10 @@ static int kxtf9_input_init(struct kxtf9_data *tf9)
|
|||
}
|
||||
|
||||
return 0;
|
||||
err1:
|
||||
err2:
|
||||
input_free_device(tf9->input_dev);
|
||||
err1:
|
||||
destroy_workqueue(tf9->input_work_queue);
|
||||
err0:
|
||||
|
||||
return err;
|
||||
|
|
@ -1215,6 +1223,7 @@ static int kxtf9_probe(struct i2c_client *client,
|
|||
destroy_workqueue(tf9->irq_work_queue);
|
||||
err1:
|
||||
mutex_unlock(&tf9->lock);
|
||||
mutex_destroy(&tf9->lock);
|
||||
kfree(tf9);
|
||||
err0:
|
||||
return err;
|
||||
|
|
@ -1230,8 +1239,11 @@ static int __devexit kxtf9_remove(struct i2c_client *client)
|
|||
kxtf9_device_power_off(tf9);
|
||||
if (tf9->regulator)
|
||||
regulator_put(tf9->regulator);
|
||||
cancel_work_sync(&tf9->input_work);
|
||||
destroy_workqueue(tf9->input_work_queue);
|
||||
kfree(tf9->pdata);
|
||||
destroy_workqueue(tf9->irq_work_queue);
|
||||
mutex_destroy(&tf9->lock);
|
||||
kfree(tf9);
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user