aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorSamuel Iglesias Gonsalvez <siglesias@igalia.com>2013-03-08 03:21:47 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-03-15 15:23:09 -0400
commite926301b39a07f587ff8c66354a2e2ee4c29162c (patch)
tree407121dd6ef41bfa48681e2ed4f7f48bf85b5f40 /drivers
parentfa882867ae5f8543eb304a1667563f1c99514475 (diff)
ipack: split ipack_device_register() in several functions
One function is ipack_device_init(). If it fails, the caller should execute ipack_put_device(). The second function is ipack_device_add that only adds the device. If it fails, the caller should execute ipack_put_device(). Then the device is removed with refcount = 0, as device_register() kernel documentation says. ipack_device_del() is added to remove the device. Signed-off-by: Samuel Iglesias Gonsalvez <siglesias@igalia.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/ipack/carriers/tpci200.c14
-rw-r--r--drivers/ipack/ipack.c24
2 files changed, 27 insertions, 11 deletions
diff --git a/drivers/ipack/carriers/tpci200.c b/drivers/ipack/carriers/tpci200.c
index 0246b1fddffe..c276fde318e5 100644
--- a/drivers/ipack/carriers/tpci200.c
+++ b/drivers/ipack/carriers/tpci200.c
@@ -480,6 +480,7 @@ static void tpci200_release_device(struct ipack_device *dev)
480 480
481static int tpci200_create_device(struct tpci200_board *tpci200, int i) 481static int tpci200_create_device(struct tpci200_board *tpci200, int i)
482{ 482{
483 int ret;
483 enum ipack_space space; 484 enum ipack_space space;
484 struct ipack_device *dev = 485 struct ipack_device *dev =
485 kzalloc(sizeof(struct ipack_device), GFP_KERNEL); 486 kzalloc(sizeof(struct ipack_device), GFP_KERNEL);
@@ -495,7 +496,18 @@ static int tpci200_create_device(struct tpci200_board *tpci200, int i)
495 + tpci200_space_interval[space] * i; 496 + tpci200_space_interval[space] * i;
496 dev->region[space].size = tpci200_space_size[space]; 497 dev->region[space].size = tpci200_space_size[space];
497 } 498 }
498 return ipack_device_register(dev); 499
500 ret = ipack_device_init(dev);
501 if (ret < 0) {
502 ipack_put_device(dev);
503 return ret;
504 }
505
506 ret = ipack_device_add(dev);
507 if (ret < 0)
508 ipack_put_device(dev);
509
510 return ret;
499} 511}
500 512
501static int tpci200_pci_probe(struct pci_dev *pdev, 513static int tpci200_pci_probe(struct pci_dev *pdev,
diff --git a/drivers/ipack/ipack.c b/drivers/ipack/ipack.c
index 4f913aa88971..6e066c53acce 100644
--- a/drivers/ipack/ipack.c
+++ b/drivers/ipack/ipack.c
@@ -227,7 +227,7 @@ static int ipack_unregister_bus_member(struct device *dev, void *data)
227 struct ipack_bus_device *bus = data; 227 struct ipack_bus_device *bus = data;
228 228
229 if (idev->bus == bus) 229 if (idev->bus == bus)
230 ipack_device_unregister(idev); 230 ipack_device_del(idev);
231 231
232 return 1; 232 return 1;
233} 233}
@@ -419,7 +419,7 @@ out:
419 return ret; 419 return ret;
420} 420}
421 421
422int ipack_device_register(struct ipack_device *dev) 422int ipack_device_init(struct ipack_device *dev)
423{ 423{
424 int ret; 424 int ret;
425 425
@@ -428,6 +428,7 @@ int ipack_device_register(struct ipack_device *dev)
428 dev->dev.parent = dev->bus->parent; 428 dev->dev.parent = dev->bus->parent;
429 dev_set_name(&dev->dev, 429 dev_set_name(&dev->dev,
430 "ipack-dev.%u.%u", dev->bus->bus_nr, dev->slot); 430 "ipack-dev.%u.%u", dev->bus->bus_nr, dev->slot);
431 device_initialize(&dev->dev);
431 432
432 if (dev->bus->ops->set_clockrate(dev, 8)) 433 if (dev->bus->ops->set_clockrate(dev, 8))
433 dev_warn(&dev->dev, "failed to switch to 8 MHz operation for reading of device ID.\n"); 434 dev_warn(&dev->dev, "failed to switch to 8 MHz operation for reading of device ID.\n");
@@ -447,19 +448,22 @@ int ipack_device_register(struct ipack_device *dev)
447 dev_err(&dev->dev, "failed to switch to 32 MHz operation.\n"); 448 dev_err(&dev->dev, "failed to switch to 32 MHz operation.\n");
448 } 449 }
449 450
450 ret = device_register(&dev->dev); 451 return 0;
451 if (ret < 0) 452}
452 kfree(dev->id); 453EXPORT_SYMBOL_GPL(ipack_device_init);
453 454
454 return ret; 455int ipack_device_add(struct ipack_device *dev)
456{
457 return device_add(&dev->dev);
455} 458}
456EXPORT_SYMBOL_GPL(ipack_device_register); 459EXPORT_SYMBOL_GPL(ipack_device_add);
457 460
458void ipack_device_unregister(struct ipack_device *dev) 461void ipack_device_del(struct ipack_device *dev)
459{ 462{
460 device_unregister(&dev->dev); 463 device_del(&dev->dev);
464 ipack_put_device(dev);
461} 465}
462EXPORT_SYMBOL_GPL(ipack_device_unregister); 466EXPORT_SYMBOL_GPL(ipack_device_del);
463 467
464void ipack_get_device(struct ipack_device *dev) 468void ipack_get_device(struct ipack_device *dev)
465{ 469{