diff options
Diffstat (limited to 'drivers/fpga/fpga-mgr.c')
-rw-r--r-- | drivers/fpga/fpga-mgr.c | 32 |
1 files changed, 17 insertions, 15 deletions
diff --git a/drivers/fpga/fpga-mgr.c b/drivers/fpga/fpga-mgr.c index 25261636687c..68d7b41159cb 100644 --- a/drivers/fpga/fpga-mgr.c +++ b/drivers/fpga/fpga-mgr.c | |||
@@ -204,9 +204,7 @@ struct fpga_manager *of_fpga_mgr_get(struct device_node *node) | |||
204 | { | 204 | { |
205 | struct fpga_manager *mgr; | 205 | struct fpga_manager *mgr; |
206 | struct device *dev; | 206 | struct device *dev; |
207 | 207 | int ret = -ENODEV; | |
208 | if (!node) | ||
209 | return ERR_PTR(-EINVAL); | ||
210 | 208 | ||
211 | dev = class_find_device(fpga_mgr_class, NULL, node, | 209 | dev = class_find_device(fpga_mgr_class, NULL, node, |
212 | fpga_mgr_of_node_match); | 210 | fpga_mgr_of_node_match); |
@@ -214,20 +212,25 @@ struct fpga_manager *of_fpga_mgr_get(struct device_node *node) | |||
214 | return ERR_PTR(-ENODEV); | 212 | return ERR_PTR(-ENODEV); |
215 | 213 | ||
216 | mgr = to_fpga_manager(dev); | 214 | mgr = to_fpga_manager(dev); |
217 | put_device(dev); | ||
218 | if (!mgr) | 215 | if (!mgr) |
219 | return ERR_PTR(-ENODEV); | 216 | goto err_dev; |
220 | 217 | ||
221 | /* Get exclusive use of fpga manager */ | 218 | /* Get exclusive use of fpga manager */ |
222 | if (!mutex_trylock(&mgr->ref_mutex)) | 219 | if (!mutex_trylock(&mgr->ref_mutex)) { |
223 | return ERR_PTR(-EBUSY); | 220 | ret = -EBUSY; |
224 | 221 | goto err_dev; | |
225 | if (!try_module_get(THIS_MODULE)) { | ||
226 | mutex_unlock(&mgr->ref_mutex); | ||
227 | return ERR_PTR(-ENODEV); | ||
228 | } | 222 | } |
229 | 223 | ||
224 | if (!try_module_get(dev->parent->driver->owner)) | ||
225 | goto err_ll_mod; | ||
226 | |||
230 | return mgr; | 227 | return mgr; |
228 | |||
229 | err_ll_mod: | ||
230 | mutex_unlock(&mgr->ref_mutex); | ||
231 | err_dev: | ||
232 | put_device(dev); | ||
233 | return ERR_PTR(ret); | ||
231 | } | 234 | } |
232 | EXPORT_SYMBOL_GPL(of_fpga_mgr_get); | 235 | EXPORT_SYMBOL_GPL(of_fpga_mgr_get); |
233 | 236 | ||
@@ -237,10 +240,9 @@ EXPORT_SYMBOL_GPL(of_fpga_mgr_get); | |||
237 | */ | 240 | */ |
238 | void fpga_mgr_put(struct fpga_manager *mgr) | 241 | void fpga_mgr_put(struct fpga_manager *mgr) |
239 | { | 242 | { |
240 | if (mgr) { | 243 | module_put(mgr->dev.parent->driver->owner); |
241 | module_put(THIS_MODULE); | 244 | mutex_unlock(&mgr->ref_mutex); |
242 | mutex_unlock(&mgr->ref_mutex); | 245 | put_device(&mgr->dev); |
243 | } | ||
244 | } | 246 | } |
245 | EXPORT_SYMBOL_GPL(fpga_mgr_put); | 247 | EXPORT_SYMBOL_GPL(fpga_mgr_put); |
246 | 248 | ||