diff options
Diffstat (limited to 'drivers/hid/hid-roccat.c')
-rw-r--r-- | drivers/hid/hid-roccat.c | 18 |
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 | ||
197 | exit_unlock: | 197 | exit_err_readers: |
198 | mutex_unlock(&device->readers_lock); | 198 | mutex_unlock(&device->readers_lock); |
199 | exit_err_devices: | ||
199 | mutex_unlock(&devices_lock); | 200 | mutex_unlock(&devices_lock); |
201 | if (error) | ||
202 | kfree(reader); | ||
200 | return error; | 203 | return error; |
201 | exit_err: | ||
202 | kfree(reader); | ||
203 | goto exit_unlock; | ||
204 | } | 204 | } |
205 | 205 | ||
206 | static int roccat_release(struct inode *inode, struct file *file) | 206 | static int roccat_release(struct inode *inode, struct file *file) |