aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/hid/hid-roccat.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/drivers/hid/hid-roccat.c b/drivers/hid/hid-roccat.c
index 5666e7587b18..56ce12c23b02 100644
--- a/drivers/hid/hid-roccat.c
+++ b/drivers/hid/hid-roccat.c
@@ -162,27 +162,27 @@ static int roccat_open(struct inode *inode, struct file *file)
162 162
163 device = devices[minor]; 163 device = devices[minor];
164 164
165 mutex_lock(&device->readers_lock);
166
167 if (!device) { 165 if (!device) {
168 pr_emerg("roccat device with minor %d doesn't exist\n", minor); 166 pr_emerg("roccat device with minor %d doesn't exist\n", minor);
169 error = -ENODEV; 167 error = -ENODEV;
170 goto exit_err; 168 goto exit_err_devices;
171 } 169 }
172 170
171 mutex_lock(&device->readers_lock);
172
173 if (!device->open++) { 173 if (!device->open++) {
174 /* power on device on adding first reader */ 174 /* power on device on adding first reader */
175 error = hid_hw_power(device->hid, PM_HINT_FULLON); 175 error = hid_hw_power(device->hid, PM_HINT_FULLON);
176 if (error < 0) { 176 if (error < 0) {
177 --device->open; 177 --device->open;
178 goto exit_err; 178 goto exit_err_readers;
179 } 179 }
180 180
181 error = hid_hw_open(device->hid); 181 error = hid_hw_open(device->hid);
182 if (error < 0) { 182 if (error < 0) {
183 hid_hw_power(device->hid, PM_HINT_NORMAL); 183 hid_hw_power(device->hid, PM_HINT_NORMAL);
184 --device->open; 184 --device->open;
185 goto exit_err; 185 goto exit_err_readers;
186 } 186 }
187 } 187 }
188 188
@@ -193,13 +193,13 @@ static int roccat_open(struct inode *inode, struct file *file)
193 list_add_tail(&reader->node, &device->readers); 193 list_add_tail(&reader->node, &device->readers);
194 file->private_data = reader; 194 file->private_data = reader;
195 195
196exit_unlock: 196exit_err_readers:
197 mutex_unlock(&device->readers_lock); 197 mutex_unlock(&device->readers_lock);
198exit_err_devices:
198 mutex_unlock(&devices_lock); 199 mutex_unlock(&devices_lock);
200 if (error)
201 kfree(reader);
199 return error; 202 return error;
200exit_err:
201 kfree(reader);
202 goto exit_unlock;
203} 203}
204 204
205static int roccat_release(struct inode *inode, struct file *file) 205static int roccat_release(struct inode *inode, struct file *file)