@@ -159,25 +159,26 @@ int sensor_hub_register_callback(struct hid_sensor_hub_device *hsdev,
159
159
{
160
160
struct hid_sensor_hub_callbacks_list * callback ;
161
161
struct sensor_hub_data * pdata = hid_get_drvdata (hsdev -> hdev );
162
+ unsigned long flags ;
162
163
163
- spin_lock (& pdata -> dyn_callback_lock );
164
+ spin_lock_irqsave (& pdata -> dyn_callback_lock , flags );
164
165
list_for_each_entry (callback , & pdata -> dyn_callback_list , list )
165
166
if (callback -> usage_id == usage_id &&
166
167
callback -> hsdev == hsdev ) {
167
- spin_unlock (& pdata -> dyn_callback_lock );
168
+ spin_unlock_irqrestore (& pdata -> dyn_callback_lock , flags );
168
169
return - EINVAL ;
169
170
}
170
171
callback = kzalloc (sizeof (* callback ), GFP_ATOMIC );
171
172
if (!callback ) {
172
- spin_unlock (& pdata -> dyn_callback_lock );
173
+ spin_unlock_irqrestore (& pdata -> dyn_callback_lock , flags );
173
174
return - ENOMEM ;
174
175
}
175
176
callback -> hsdev = hsdev ;
176
177
callback -> usage_callback = usage_callback ;
177
178
callback -> usage_id = usage_id ;
178
179
callback -> priv = NULL ;
179
180
list_add_tail (& callback -> list , & pdata -> dyn_callback_list );
180
- spin_unlock (& pdata -> dyn_callback_lock );
181
+ spin_unlock_irqrestore (& pdata -> dyn_callback_lock , flags );
181
182
182
183
return 0 ;
183
184
}
@@ -188,16 +189,17 @@ int sensor_hub_remove_callback(struct hid_sensor_hub_device *hsdev,
188
189
{
189
190
struct hid_sensor_hub_callbacks_list * callback ;
190
191
struct sensor_hub_data * pdata = hid_get_drvdata (hsdev -> hdev );
192
+ unsigned long flags ;
191
193
192
- spin_lock (& pdata -> dyn_callback_lock );
194
+ spin_lock_irqsave (& pdata -> dyn_callback_lock , flags );
193
195
list_for_each_entry (callback , & pdata -> dyn_callback_list , list )
194
196
if (callback -> usage_id == usage_id &&
195
197
callback -> hsdev == hsdev ) {
196
198
list_del (& callback -> list );
197
199
kfree (callback );
198
200
break ;
199
201
}
200
- spin_unlock (& pdata -> dyn_callback_lock );
202
+ spin_unlock_irqrestore (& pdata -> dyn_callback_lock , flags );
201
203
202
204
return 0 ;
203
205
}
@@ -378,15 +380,16 @@ static int sensor_hub_suspend(struct hid_device *hdev, pm_message_t message)
378
380
{
379
381
struct sensor_hub_data * pdata = hid_get_drvdata (hdev );
380
382
struct hid_sensor_hub_callbacks_list * callback ;
383
+ unsigned long flags ;
381
384
382
385
hid_dbg (hdev , " sensor_hub_suspend\n" );
383
- spin_lock (& pdata -> dyn_callback_lock );
386
+ spin_lock_irqsave (& pdata -> dyn_callback_lock , flags );
384
387
list_for_each_entry (callback , & pdata -> dyn_callback_list , list ) {
385
388
if (callback -> usage_callback -> suspend )
386
389
callback -> usage_callback -> suspend (
387
390
callback -> hsdev , callback -> priv );
388
391
}
389
- spin_unlock (& pdata -> dyn_callback_lock );
392
+ spin_unlock_irqrestore (& pdata -> dyn_callback_lock , flags );
390
393
391
394
return 0 ;
392
395
}
@@ -395,15 +398,16 @@ static int sensor_hub_resume(struct hid_device *hdev)
395
398
{
396
399
struct sensor_hub_data * pdata = hid_get_drvdata (hdev );
397
400
struct hid_sensor_hub_callbacks_list * callback ;
401
+ unsigned long flags ;
398
402
399
403
hid_dbg (hdev , " sensor_hub_resume\n" );
400
- spin_lock (& pdata -> dyn_callback_lock );
404
+ spin_lock_irqsave (& pdata -> dyn_callback_lock , flags );
401
405
list_for_each_entry (callback , & pdata -> dyn_callback_list , list ) {
402
406
if (callback -> usage_callback -> resume )
403
407
callback -> usage_callback -> resume (
404
408
callback -> hsdev , callback -> priv );
405
409
}
406
- spin_unlock (& pdata -> dyn_callback_lock );
410
+ spin_unlock_irqrestore (& pdata -> dyn_callback_lock , flags );
407
411
408
412
return 0 ;
409
413
}
0 commit comments