diff options
Diffstat (limited to 'drivers/hid/hid-sensor-hub.c')
| -rw-r--r-- | drivers/hid/hid-sensor-hub.c | 13 | 
1 files changed, 10 insertions, 3 deletions
diff --git a/drivers/hid/hid-sensor-hub.c b/drivers/hid/hid-sensor-hub.c index c3f6f1e311ea..090a1ba0abb6 100644 --- a/drivers/hid/hid-sensor-hub.c +++ b/drivers/hid/hid-sensor-hub.c @@ -294,7 +294,7 @@ int sensor_hub_input_attr_get_raw_value(struct hid_sensor_hub_device *hsdev,  	if (!report)  		return -EINVAL; -	mutex_lock(&hsdev->mutex); +	mutex_lock(hsdev->mutex_ptr);  	if (flag == SENSOR_HUB_SYNC) {  		memset(&hsdev->pending, 0, sizeof(hsdev->pending));  		init_completion(&hsdev->pending.ready); @@ -328,7 +328,7 @@ int sensor_hub_input_attr_get_raw_value(struct hid_sensor_hub_device *hsdev,  		kfree(hsdev->pending.raw_data);  		hsdev->pending.status = false;  	} -	mutex_unlock(&hsdev->mutex); +	mutex_unlock(hsdev->mutex_ptr);  	return ret_val;  } @@ -667,7 +667,14 @@ static int sensor_hub_probe(struct hid_device *hdev,  			hsdev->vendor_id = hdev->vendor;  			hsdev->product_id = hdev->product;  			hsdev->usage = collection->usage; -			mutex_init(&hsdev->mutex); +			hsdev->mutex_ptr = devm_kzalloc(&hdev->dev, +							sizeof(struct mutex), +							GFP_KERNEL); +			if (!hsdev->mutex_ptr) { +				ret = -ENOMEM; +				goto err_stop_hw; +			} +			mutex_init(hsdev->mutex_ptr);  			hsdev->start_collection_index = i;  			if (last_hsdev)  				last_hsdev->end_collection_index = i;  |