aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hid/hid-roccat.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/hid/hid-roccat.c')
-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 2596321bab07..b685b04dbf9d 100644
--- a/drivers/hid/hid-roccat.c
+++ b/drivers/hid/hid-roccat.c
@@ -163,27 +163,27 @@ static int roccat_open(struct inode *inode, struct file *file)
163 163
164 device = devices[minor]; 164 device = devices[minor];
165 165
166 mutex_lock(&device->readers_lock);
167
168 if (!device) { 166 if (!device) {
169 pr_emerg("roccat device with minor %d doesn't exist\n", minor); 167 pr_emerg("roccat device with minor %d doesn't exist\n", minor);
170 error = -ENODEV; 168 error = -ENODEV;
171 goto exit_err; 169 goto exit_err_devices;
172 } 170 }
173 171
172 mutex_lock(&device->readers_lock);
173
174 if (!device->open++) { 174 if (!device->open++) {
175 /* power on device on adding first reader */ 175 /* power on device on adding first reader */
176 error = hid_hw_power(device->hid, PM_HINT_FULLON); 176 error = hid_hw_power(device->hid, PM_HINT_FULLON);
177 if (error < 0) { 177 if (error < 0) {
178 --device->open; 178 --device->open;
179 goto exit_err; 179 goto exit_err_readers;
180 } 180 }
181 181
182 error = hid_hw_open(device->hid); 182 error = hid_hw_open(device->hid);
183 if (error < 0) { 183 if (error < 0) {
184 hid_hw_power(device->hid, PM_HINT_NORMAL); 184 hid_hw_power(device->hid, PM_HINT_NORMAL);
185 --device->open; 185 --device->open;
186 goto exit_err; 186 goto exit_err_readers;
187 } 187 }
188 } 188 }
189 189
@@ -194,13 +194,13 @@ static int roccat_open(struct inode *inode, struct file *file)
194 list_add_tail(&reader->node, &device->readers); 194 list_add_tail(&reader->node, &device->readers);
195 file->private_data = reader; 195 file->private_data = reader;
196 196
197exit_unlock: 197exit_err_readers:
198 mutex_unlock(&device->readers_lock); 198 mutex_unlock(&device->readers_lock);
199exit_err_devices:
199 mutex_unlock(&devices_lock); 200 mutex_unlock(&devices_lock);
201 if (error)
202 kfree(reader);
200 return error; 203 return error;
201exit_err:
202 kfree(reader);
203 goto exit_unlock;
204} 204}
205 205
206static int roccat_release(struct inode *inode, struct file *file) 206static int roccat_release(struct inode *inode, struct file *file)