Skip to content

Commit

Permalink
[media] ene-ir: Fix cleanup on probe failure
Browse files Browse the repository at this point in the history
This makes the cleanup on probe failure more consistent with other
drivers. This is similar to what commit
f27b853 ("[media] rc: Fix invalid
free_region and/or free_irq on probe failure") did for some other
drivers.
In addition to making the cleanup more consistent, this also fixes a
case where (on a ene_hw_detect failure) free_region would be called on a
region that was not requested yet.
This last problem was probably introduced by the moving of code in
commit b31b021 ("[media] ene_ir: Fix
driver initialisation") and commit
9ef449c ("[media] rc: Postpone ISR
registration").

Signed-off-by: Matthijs Kooijman <matthijs@stdin.nl>
Cc: Maxim Levitsky <maximlevitsky@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
  • Loading branch information
Matthijs Kooijman authored and Mauro Carvalho Chehab committed Oct 28, 2012
1 parent 895507c commit 56411c0
Showing 1 changed file with 13 additions and 16 deletions.
29 changes: 13 additions & 16 deletions drivers/media/rc/ene_ir.c
Original file line number Diff line number Diff line change
Expand Up @@ -1003,7 +1003,7 @@ static int ene_probe(struct pnp_dev *pnp_dev, const struct pnp_device_id *id)
dev = kzalloc(sizeof(struct ene_device), GFP_KERNEL);
rdev = rc_allocate_device();
if (!dev || !rdev)
goto error1;
goto failure;

/* validate resources */
error = -ENODEV;
Expand All @@ -1014,10 +1014,10 @@ static int ene_probe(struct pnp_dev *pnp_dev, const struct pnp_device_id *id)

if (!pnp_port_valid(pnp_dev, 0) ||
pnp_port_len(pnp_dev, 0) < ENE_IO_SIZE)
goto error;
goto failure;

if (!pnp_irq_valid(pnp_dev, 0))
goto error;
goto failure;

spin_lock_init(&dev->hw_lock);

Expand All @@ -1033,7 +1033,7 @@ static int ene_probe(struct pnp_dev *pnp_dev, const struct pnp_device_id *id)
/* detect hardware version and features */
error = ene_hw_detect(dev);
if (error)
goto error;
goto failure;

if (!dev->hw_learning_and_tx_capable && txsim) {
dev->hw_learning_and_tx_capable = true;
Expand Down Expand Up @@ -1078,30 +1078,27 @@ static int ene_probe(struct pnp_dev *pnp_dev, const struct pnp_device_id *id)
/* claim the resources */
error = -EBUSY;
if (!request_region(dev->hw_io, ENE_IO_SIZE, ENE_DRIVER_NAME)) {
dev->hw_io = -1;
dev->irq = -1;
goto error;
goto failure;
}

dev->irq = pnp_irq(pnp_dev, 0);
if (request_irq(dev->irq, ene_isr,
IRQF_SHARED, ENE_DRIVER_NAME, (void *)dev)) {
dev->irq = -1;
goto error;
goto failure2;
}

error = rc_register_device(rdev);
if (error < 0)
goto error;
goto failure3;

pr_notice("driver has been successfully loaded\n");
return 0;
error:
if (dev && dev->irq >= 0)
free_irq(dev->irq, dev);
if (dev && dev->hw_io >= 0)
release_region(dev->hw_io, ENE_IO_SIZE);
error1:

failure3:
free_irq(dev->irq, dev);
failure2:
release_region(dev->hw_io, ENE_IO_SIZE);
failure:
rc_free_device(rdev);
kfree(dev);
return error;
Expand Down

0 comments on commit 56411c0

Please sign in to comment.