| .. | .. |
|---|
| 19 | 19 | /* Lock for adding/removing bridges to linked lists*/ |
|---|
| 20 | 20 | static spinlock_t bridge_list_lock; |
|---|
| 21 | 21 | |
|---|
| 22 | | -static int fpga_bridge_of_node_match(struct device *dev, const void *data) |
|---|
| 23 | | -{ |
|---|
| 24 | | - return dev->of_node == data; |
|---|
| 25 | | -} |
|---|
| 26 | | - |
|---|
| 27 | 22 | /** |
|---|
| 28 | 23 | * fpga_bridge_enable - Enable transactions on the bridge |
|---|
| 29 | 24 | * |
|---|
| .. | .. |
|---|
| 104 | 99 | { |
|---|
| 105 | 100 | struct device *dev; |
|---|
| 106 | 101 | |
|---|
| 107 | | - dev = class_find_device(fpga_bridge_class, NULL, np, |
|---|
| 108 | | - fpga_bridge_of_node_match); |
|---|
| 102 | + dev = class_find_device_by_of_node(fpga_bridge_class, np); |
|---|
| 109 | 103 | if (!dev) |
|---|
| 110 | 104 | return ERR_PTR(-ENODEV); |
|---|
| 111 | 105 | |
|---|
| .. | .. |
|---|
| 324 | 318 | * @br_ops: pointer to structure of fpga bridge ops |
|---|
| 325 | 319 | * @priv: FPGA bridge private data |
|---|
| 326 | 320 | * |
|---|
| 321 | + * The caller of this function is responsible for freeing the bridge with |
|---|
| 322 | + * fpga_bridge_free(). Using devm_fpga_bridge_create() instead is recommended. |
|---|
| 323 | + * |
|---|
| 327 | 324 | * Return: struct fpga_bridge or NULL |
|---|
| 328 | 325 | */ |
|---|
| 329 | 326 | struct fpga_bridge *fpga_bridge_create(struct device *dev, const char *name, |
|---|
| .. | .. |
|---|
| 331 | 328 | void *priv) |
|---|
| 332 | 329 | { |
|---|
| 333 | 330 | struct fpga_bridge *bridge; |
|---|
| 334 | | - int id, ret = 0; |
|---|
| 331 | + int id, ret; |
|---|
| 335 | 332 | |
|---|
| 336 | 333 | if (!name || !strlen(name)) { |
|---|
| 337 | 334 | dev_err(dev, "Attempt to register with no name!\n"); |
|---|
| .. | .. |
|---|
| 343 | 340 | return NULL; |
|---|
| 344 | 341 | |
|---|
| 345 | 342 | id = ida_simple_get(&fpga_bridge_ida, 0, 0, GFP_KERNEL); |
|---|
| 346 | | - if (id < 0) { |
|---|
| 347 | | - ret = id; |
|---|
| 343 | + if (id < 0) |
|---|
| 348 | 344 | goto error_kfree; |
|---|
| 349 | | - } |
|---|
| 350 | 345 | |
|---|
| 351 | 346 | mutex_init(&bridge->mutex); |
|---|
| 352 | 347 | INIT_LIST_HEAD(&bridge->node); |
|---|
| .. | .. |
|---|
| 378 | 373 | EXPORT_SYMBOL_GPL(fpga_bridge_create); |
|---|
| 379 | 374 | |
|---|
| 380 | 375 | /** |
|---|
| 381 | | - * fpga_bridge_free - free a fpga bridge and its id |
|---|
| 382 | | - * @bridge: FPGA bridge struct created by fpga_bridge_create |
|---|
| 376 | + * fpga_bridge_free - free a fpga bridge created by fpga_bridge_create() |
|---|
| 377 | + * @bridge: FPGA bridge struct |
|---|
| 383 | 378 | */ |
|---|
| 384 | 379 | void fpga_bridge_free(struct fpga_bridge *bridge) |
|---|
| 385 | 380 | { |
|---|
| .. | .. |
|---|
| 388 | 383 | } |
|---|
| 389 | 384 | EXPORT_SYMBOL_GPL(fpga_bridge_free); |
|---|
| 390 | 385 | |
|---|
| 386 | +static void devm_fpga_bridge_release(struct device *dev, void *res) |
|---|
| 387 | +{ |
|---|
| 388 | + struct fpga_bridge *bridge = *(struct fpga_bridge **)res; |
|---|
| 389 | + |
|---|
| 390 | + fpga_bridge_free(bridge); |
|---|
| 391 | +} |
|---|
| 392 | + |
|---|
| 391 | 393 | /** |
|---|
| 392 | | - * fpga_bridge_register - register a fpga bridge |
|---|
| 393 | | - * @bridge: FPGA bridge struct created by fpga_bridge_create |
|---|
| 394 | + * devm_fpga_bridge_create - create and init a managed struct fpga_bridge |
|---|
| 395 | + * @dev: FPGA bridge device from pdev |
|---|
| 396 | + * @name: FPGA bridge name |
|---|
| 397 | + * @br_ops: pointer to structure of fpga bridge ops |
|---|
| 398 | + * @priv: FPGA bridge private data |
|---|
| 399 | + * |
|---|
| 400 | + * This function is intended for use in a FPGA bridge driver's probe function. |
|---|
| 401 | + * After the bridge driver creates the struct with devm_fpga_bridge_create(), it |
|---|
| 402 | + * should register the bridge with fpga_bridge_register(). The bridge driver's |
|---|
| 403 | + * remove function should call fpga_bridge_unregister(). The bridge struct |
|---|
| 404 | + * allocated with this function will be freed automatically on driver detach. |
|---|
| 405 | + * This includes the case of a probe function returning error before calling |
|---|
| 406 | + * fpga_bridge_register(), the struct will still get cleaned up. |
|---|
| 407 | + * |
|---|
| 408 | + * Return: struct fpga_bridge or NULL |
|---|
| 409 | + */ |
|---|
| 410 | +struct fpga_bridge |
|---|
| 411 | +*devm_fpga_bridge_create(struct device *dev, const char *name, |
|---|
| 412 | + const struct fpga_bridge_ops *br_ops, void *priv) |
|---|
| 413 | +{ |
|---|
| 414 | + struct fpga_bridge **ptr, *bridge; |
|---|
| 415 | + |
|---|
| 416 | + ptr = devres_alloc(devm_fpga_bridge_release, sizeof(*ptr), GFP_KERNEL); |
|---|
| 417 | + if (!ptr) |
|---|
| 418 | + return NULL; |
|---|
| 419 | + |
|---|
| 420 | + bridge = fpga_bridge_create(dev, name, br_ops, priv); |
|---|
| 421 | + if (!bridge) { |
|---|
| 422 | + devres_free(ptr); |
|---|
| 423 | + } else { |
|---|
| 424 | + *ptr = bridge; |
|---|
| 425 | + devres_add(dev, ptr); |
|---|
| 426 | + } |
|---|
| 427 | + |
|---|
| 428 | + return bridge; |
|---|
| 429 | +} |
|---|
| 430 | +EXPORT_SYMBOL_GPL(devm_fpga_bridge_create); |
|---|
| 431 | + |
|---|
| 432 | +/** |
|---|
| 433 | + * fpga_bridge_register - register a FPGA bridge |
|---|
| 434 | + * |
|---|
| 435 | + * @bridge: FPGA bridge struct |
|---|
| 394 | 436 | * |
|---|
| 395 | 437 | * Return: 0 for success, error code otherwise. |
|---|
| 396 | 438 | */ |
|---|
| .. | .. |
|---|
| 412 | 454 | EXPORT_SYMBOL_GPL(fpga_bridge_register); |
|---|
| 413 | 455 | |
|---|
| 414 | 456 | /** |
|---|
| 415 | | - * fpga_bridge_unregister - unregister and free a fpga bridge |
|---|
| 416 | | - * @bridge: FPGA bridge struct created by fpga_bridge_create |
|---|
| 457 | + * fpga_bridge_unregister - unregister a FPGA bridge |
|---|
| 458 | + * |
|---|
| 459 | + * @bridge: FPGA bridge struct |
|---|
| 460 | + * |
|---|
| 461 | + * This function is intended for use in a FPGA bridge driver's remove function. |
|---|
| 417 | 462 | */ |
|---|
| 418 | 463 | void fpga_bridge_unregister(struct fpga_bridge *bridge) |
|---|
| 419 | 464 | { |
|---|
| .. | .. |
|---|
| 430 | 475 | |
|---|
| 431 | 476 | static void fpga_bridge_dev_release(struct device *dev) |
|---|
| 432 | 477 | { |
|---|
| 433 | | - struct fpga_bridge *bridge = to_fpga_bridge(dev); |
|---|
| 434 | | - |
|---|
| 435 | | - fpga_bridge_free(bridge); |
|---|
| 436 | 478 | } |
|---|
| 437 | 479 | |
|---|
| 438 | 480 | static int __init fpga_bridge_dev_init(void) |
|---|