diff --git a/packages/linux/patches/linux-3.2.31-059.01-media-ene-ir-Fix-cleanup-on-probe-failure.patch b/packages/linux/patches/linux-3.2.31-059.01-media-ene-ir-Fix-cleanup-on-probe-failure.patch new file mode 100644 index 0000000000..8d95f41efa --- /dev/null +++ b/packages/linux/patches/linux-3.2.31-059.01-media-ene-ir-Fix-cleanup-on-probe-failure.patch @@ -0,0 +1,75 @@ +diff --git a/drivers/media/rc/ene_ir.c b/drivers/media/rc/ene_ir.c +index 647dd95..62f9076 100644 +--- a/drivers/media/rc/ene_ir.c ++++ b/drivers/media/rc/ene_ir.c +@@ -1000,7 +1000,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; +@@ -1011,10 +1011,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); + +@@ -1030,7 +1030,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; +@@ -1075,30 +1075,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; diff --git a/packages/linux/patches/linux-3.2.31-059.02-media-rc-Make-probe-cleanup-goto-labels-more-verbose.patch b/packages/linux/patches/linux-3.2.31-059.02-media-rc-Make-probe-cleanup-goto-labels-more-verbose.patch new file mode 100644 index 0000000000..27739f5433 --- /dev/null +++ b/packages/linux/patches/linux-3.2.31-059.02-media-rc-Make-probe-cleanup-goto-labels-more-verbose.patch @@ -0,0 +1,366 @@ +diff --git a/drivers/media/rc/ati_remote.c b/drivers/media/rc/ati_remote.c +index 8fa72e2..58fce6a 100644 +--- a/drivers/media/rc/ati_remote.c ++++ b/drivers/media/rc/ati_remote.c +@@ -877,11 +877,11 @@ static int ati_remote_probe(struct usb_interface *interface, + ati_remote = kzalloc(sizeof (struct ati_remote), GFP_KERNEL); + rc_dev = rc_allocate_device(); + if (!ati_remote || !rc_dev) +- goto fail1; ++ goto exit_free_dev_rdev; + + /* Allocate URB buffers, URBs */ + if (ati_remote_alloc_buffers(udev, ati_remote)) +- goto fail2; ++ goto exit_free_buffers; + + ati_remote->endpoint_in = endpoint_in; + ati_remote->endpoint_out = endpoint_out; +@@ -929,12 +929,12 @@ static int ati_remote_probe(struct usb_interface *interface, + /* Device Hardware Initialization - fills in ati_remote->idev from udev. */ + err = ati_remote_initialize(ati_remote); + if (err) +- goto fail3; ++ goto exit_kill_urbs; + + /* Set up and register rc device */ + err = rc_register_device(ati_remote->rdev); + if (err) +- goto fail3; ++ goto exit_kill_urbs; + + /* use our delay for rc_dev */ + ati_remote->rdev->input_dev->rep[REP_DELAY] = repeat_delay; +@@ -943,26 +943,31 @@ static int ati_remote_probe(struct usb_interface *interface, + if (mouse) { + input_dev = input_allocate_device(); + if (!input_dev) +- goto fail4; ++ goto exit_unregister_device; + + ati_remote->idev = input_dev; + ati_remote_input_init(ati_remote); + err = input_register_device(input_dev); + + if (err) +- goto fail5; ++ goto exit_free_input_device; + } + + usb_set_intfdata(interface, ati_remote); + return 0; + +- fail5: input_free_device(input_dev); +- fail4: rc_unregister_device(rc_dev); ++ exit_free_input_device: ++ input_free_device(input_dev); ++ exit_unregister_device: ++ rc_unregister_device(rc_dev); + rc_dev = NULL; +- fail3: usb_kill_urb(ati_remote->irq_urb); ++ exit_kill_urbs: ++ usb_kill_urb(ati_remote->irq_urb); + usb_kill_urb(ati_remote->out_urb); +- fail2: ati_remote_free_buffers(ati_remote); +- fail1: rc_free_device(rc_dev); ++ exit_free_buffers: ++ ati_remote_free_buffers(ati_remote); ++ exit_free_dev_rdev: ++ rc_free_device(rc_dev); + kfree(ati_remote); + return err; + } +diff --git a/drivers/media/rc/ene_ir.c b/drivers/media/rc/ene_ir.c +index 62f9076..7337816 100644 +--- a/drivers/media/rc/ene_ir.c ++++ b/drivers/media/rc/ene_ir.c +@@ -1000,7 +1000,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 failure; ++ goto exit_free_dev_rdev; + + /* validate resources */ + error = -ENODEV; +@@ -1011,10 +1011,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 failure; ++ goto exit_free_dev_rdev; + + if (!pnp_irq_valid(pnp_dev, 0)) +- goto failure; ++ goto exit_free_dev_rdev; + + spin_lock_init(&dev->hw_lock); + +@@ -1030,7 +1030,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 failure; ++ goto exit_free_dev_rdev; + + if (!dev->hw_learning_and_tx_capable && txsim) { + dev->hw_learning_and_tx_capable = true; +@@ -1075,27 +1075,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)) { +- goto failure; ++ goto exit_free_dev_rdev; + } + + dev->irq = pnp_irq(pnp_dev, 0); + if (request_irq(dev->irq, ene_isr, + IRQF_SHARED, ENE_DRIVER_NAME, (void *)dev)) { +- goto failure2; ++ goto exit_release_hw_io; + } + + error = rc_register_device(rdev); + if (error < 0) +- goto failure3; ++ goto exit_free_irq; + + pr_notice("driver has been successfully loaded\n"); + return 0; + +-failure3: ++exit_free_irq: + free_irq(dev->irq, dev); +-failure2: ++exit_release_hw_io: + release_region(dev->hw_io, ENE_IO_SIZE); +-failure: ++exit_free_dev_rdev: + rc_free_device(rdev); + kfree(dev); + return error; +diff --git a/drivers/media/rc/fintek-cir.c b/drivers/media/rc/fintek-cir.c +index ab30c64..8284d28 100644 +--- a/drivers/media/rc/fintek-cir.c ++++ b/drivers/media/rc/fintek-cir.c +@@ -495,18 +495,18 @@ static int fintek_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id + /* input device for IR remote (and tx) */ + rdev = rc_allocate_device(); + if (!rdev) +- goto failure; ++ goto exit_free_dev_rdev; + + ret = -ENODEV; + /* validate pnp resources */ + if (!pnp_port_valid(pdev, 0)) { + dev_err(&pdev->dev, "IR PNP Port not valid!\n"); +- goto failure; ++ goto exit_free_dev_rdev; + } + + if (!pnp_irq_valid(pdev, 0)) { + dev_err(&pdev->dev, "IR PNP IRQ not valid!\n"); +- goto failure; ++ goto exit_free_dev_rdev; + } + + fintek->cir_addr = pnp_port_start(pdev, 0); +@@ -523,7 +523,7 @@ static int fintek_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id + + ret = fintek_hw_detect(fintek); + if (ret) +- goto failure; ++ goto exit_free_dev_rdev; + + /* Initialize CIR & CIR Wake Logical Devices */ + fintek_config_mode_enable(fintek); +@@ -556,15 +556,15 @@ static int fintek_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id + /* now claim resources */ + if (!request_region(fintek->cir_addr, + fintek->cir_port_len, FINTEK_DRIVER_NAME)) +- goto failure; ++ goto exit_free_dev_rdev; + + if (request_irq(fintek->cir_irq, fintek_cir_isr, IRQF_SHARED, + FINTEK_DRIVER_NAME, (void *)fintek)) +- goto failure2; ++ goto exit_free_cir_addr; + + ret = rc_register_device(rdev); + if (ret) +- goto failure3; ++ goto exit_free_irq; + + device_init_wakeup(&pdev->dev, true); + fintek->rdev = rdev; +@@ -574,11 +574,11 @@ static int fintek_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id + + return 0; + +-failure3: ++exit_free_irq: + free_irq(fintek->cir_irq, fintek); +-failure2: ++exit_free_cir_addr: + release_region(fintek->cir_addr, fintek->cir_port_len); +-failure: ++exit_free_dev_rdev: + rc_free_device(rdev); + kfree(fintek); + +diff --git a/drivers/media/rc/gpio-ir-recv.c b/drivers/media/rc/gpio-ir-recv.c +index 04cb272..0c03b7d 100644 +diff --git a/drivers/media/rc/ite-cir.c b/drivers/media/rc/ite-cir.c +index 36fe5a3..77cb21f 100644 +--- a/drivers/media/rc/ite-cir.c ++++ b/drivers/media/rc/ite-cir.c +@@ -1472,7 +1472,7 @@ static int ite_probe(struct pnp_dev *pdev, const struct pnp_device_id + /* input device for IR remote (and tx) */ + rdev = rc_allocate_device(); + if (!rdev) +- goto failure; ++ goto exit_free_dev_rdev; + + ret = -ENODEV; + +@@ -1497,12 +1497,12 @@ static int ite_probe(struct pnp_dev *pdev, const struct pnp_device_id + if (!pnp_port_valid(pdev, io_rsrc_no) || + pnp_port_len(pdev, io_rsrc_no) != dev_desc->io_region_size) { + dev_err(&pdev->dev, "IR PNP Port not valid!\n"); +- goto failure; ++ goto exit_free_dev_rdev; + } + + if (!pnp_irq_valid(pdev, 0)) { + dev_err(&pdev->dev, "PNP IRQ not valid!\n"); +- goto failure; ++ goto exit_free_dev_rdev; + } + + /* store resource values */ +@@ -1594,26 +1594,26 @@ static int ite_probe(struct pnp_dev *pdev, const struct pnp_device_id + /* now claim resources */ + if (!request_region(itdev->cir_addr, + dev_desc->io_region_size, ITE_DRIVER_NAME)) +- goto failure; ++ goto exit_free_dev_rdev; + + if (request_irq(itdev->cir_irq, ite_cir_isr, IRQF_SHARED, + ITE_DRIVER_NAME, (void *)itdev)) +- goto failure2; ++ goto exit_release_cir_addr; + + ret = rc_register_device(rdev); + if (ret) +- goto failure3; ++ goto exit_free_irq; + + itdev->rdev = rdev; + ite_pr(KERN_NOTICE, "driver has been successfully loaded\n"); + + return 0; + +-failure3: ++exit_free_irq: + free_irq(itdev->cir_irq, itdev); +-failure2: ++exit_release_cir_addr: + release_region(itdev->cir_addr, itdev->params.io_region_size); +-failure: ++exit_free_dev_rdev: + rc_free_device(rdev); + kfree(itdev); + +diff --git a/drivers/media/rc/nuvoton-cir.c b/drivers/media/rc/nuvoton-cir.c +index 699eef3..8ab6843 100644 +--- a/drivers/media/rc/nuvoton-cir.c ++++ b/drivers/media/rc/nuvoton-cir.c +@@ -986,25 +986,25 @@ static int nvt_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id) + /* input device for IR remote (and tx) */ + rdev = rc_allocate_device(); + if (!rdev) +- goto failure; ++ goto exit_free_dev_rdev; + + ret = -ENODEV; + /* validate pnp resources */ + if (!pnp_port_valid(pdev, 0) || + pnp_port_len(pdev, 0) < CIR_IOREG_LENGTH) { + dev_err(&pdev->dev, "IR PNP Port not valid!\n"); +- goto failure; ++ goto exit_free_dev_rdev; + } + + if (!pnp_irq_valid(pdev, 0)) { + dev_err(&pdev->dev, "PNP IRQ not valid!\n"); +- goto failure; ++ goto exit_free_dev_rdev; + } + + if (!pnp_port_valid(pdev, 1) || + pnp_port_len(pdev, 1) < CIR_IOREG_LENGTH) { + dev_err(&pdev->dev, "Wake PNP Port not valid!\n"); +- goto failure; ++ goto exit_free_dev_rdev; + } + + nvt->cir_addr = pnp_port_start(pdev, 0); +@@ -1027,7 +1027,7 @@ static int nvt_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id) + + ret = nvt_hw_detect(nvt); + if (ret) +- goto failure; ++ goto exit_free_dev_rdev; + + /* Initialize CIR & CIR Wake Logical Devices */ + nvt_efm_enable(nvt); +@@ -1070,23 +1070,23 @@ static int nvt_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id) + /* now claim resources */ + if (!request_region(nvt->cir_addr, + CIR_IOREG_LENGTH, NVT_DRIVER_NAME)) +- goto failure; ++ goto exit_free_dev_rdev; + + if (request_irq(nvt->cir_irq, nvt_cir_isr, IRQF_SHARED, + NVT_DRIVER_NAME, (void *)nvt)) +- goto failure2; ++ goto exit_release_cir_addr; + + if (!request_region(nvt->cir_wake_addr, + CIR_IOREG_LENGTH, NVT_DRIVER_NAME)) +- goto failure3; ++ goto exit_free_irq; + + if (request_irq(nvt->cir_wake_irq, nvt_cir_wake_isr, IRQF_SHARED, + NVT_DRIVER_NAME, (void *)nvt)) +- goto failure4; ++ goto exit_release_cir_wake_addr; + + ret = rc_register_device(rdev); + if (ret) +- goto failure5; ++ goto exit_free_wake_irq; + + device_init_wakeup(&pdev->dev, true); + nvt->rdev = rdev; +@@ -1098,15 +1098,15 @@ static int nvt_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id) + + return 0; + +-failure5: ++exit_free_wake_irq: + free_irq(nvt->cir_wake_irq, nvt); +-failure4: ++exit_release_cir_wake_addr: + release_region(nvt->cir_wake_addr, CIR_IOREG_LENGTH); +-failure3: ++exit_free_irq: + free_irq(nvt->cir_irq, nvt); +-failure2: ++exit_release_cir_addr: + release_region(nvt->cir_addr, CIR_IOREG_LENGTH); +-failure: ++exit_free_dev_rdev: + rc_free_device(rdev); + kfree(nvt); + diff --git a/packages/linux/patches/linux-3.2.31-059.03-media-rc-Set-rdev-before-irq-setup.patch b/packages/linux/patches/linux-3.2.31-059.03-media-rc-Set-rdev-before-irq-setup.patch new file mode 100644 index 0000000000..656b7c7072 --- /dev/null +++ b/packages/linux/patches/linux-3.2.31-059.03-media-rc-Set-rdev-before-irq-setup.patch @@ -0,0 +1,64 @@ +diff --git a/drivers/media/rc/fintek-cir.c b/drivers/media/rc/fintek-cir.c +index 8284d28..54809b8 100644 +--- a/drivers/media/rc/fintek-cir.c ++++ b/drivers/media/rc/fintek-cir.c +@@ -552,6 +552,8 @@ static int fintek_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id + /* rx resolution is hardwired to 50us atm, 1, 25, 100 also possible */ + rdev->rx_resolution = US_TO_NS(CIR_SAMPLE_PERIOD); + ++ fintek->rdev = rdev; ++ + ret = -EBUSY; + /* now claim resources */ + if (!request_region(fintek->cir_addr, +@@ -567,7 +569,7 @@ static int fintek_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id + goto exit_free_irq; + + device_init_wakeup(&pdev->dev, true); +- fintek->rdev = rdev; ++ + fit_pr(KERN_NOTICE, "driver has been successfully loaded\n"); + if (debug) + cir_dump_regs(fintek); +diff --git a/drivers/media/rc/ite-cir.c b/drivers/media/rc/ite-cir.c +index 77cb21f..158bd0a 100644 +--- a/drivers/media/rc/ite-cir.c ++++ b/drivers/media/rc/ite-cir.c +@@ -1590,6 +1590,8 @@ static int ite_probe(struct pnp_dev *pdev, const struct pnp_device_id + rdev->driver_name = ITE_DRIVER_NAME; + rdev->map_name = RC_MAP_RC6_MCE; + ++ itdev->rdev = rdev; ++ + ret = -EBUSY; + /* now claim resources */ + if (!request_region(itdev->cir_addr, +@@ -1604,7 +1606,6 @@ static int ite_probe(struct pnp_dev *pdev, const struct pnp_device_id + if (ret) + goto exit_free_irq; + +- itdev->rdev = rdev; + ite_pr(KERN_NOTICE, "driver has been successfully loaded\n"); + + return 0; +diff --git a/drivers/media/rc/nuvoton-cir.c b/drivers/media/rc/nuvoton-cir.c +index 8ab6843..a1b6be6 100644 +--- a/drivers/media/rc/nuvoton-cir.c ++++ b/drivers/media/rc/nuvoton-cir.c +@@ -1065,6 +1065,7 @@ static int nvt_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id) + /* tx bits */ + rdev->tx_resolution = XYZ; + #endif ++ nvt->rdev = rdev; + + ret = -EBUSY; + /* now claim resources */ +@@ -1089,7 +1090,7 @@ static int nvt_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id) + goto exit_free_wake_irq; + + device_init_wakeup(&pdev->dev, true); +- nvt->rdev = rdev; ++ + nvt_pr(KERN_NOTICE, "driver has been successfully loaded\n"); + if (debug) { + cir_dump_regs(nvt); diff --git a/packages/linux/patches/linux-3.2.31-059.04-media-rc-Call-rc_register_device-before-irq-setup.patch b/packages/linux/patches/linux-3.2.31-059.04-media-rc-Call-rc_register_device-before-irq-setup.patch new file mode 100644 index 0000000000..dac24358a8 --- /dev/null +++ b/packages/linux/patches/linux-3.2.31-059.04-media-rc-Call-rc_register_device-before-irq-setup.patch @@ -0,0 +1,177 @@ +diff --git a/drivers/media/rc/ene_ir.c b/drivers/media/rc/ene_ir.c +index 7337816..17b38a9 100644 +--- a/drivers/media/rc/ene_ir.c ++++ b/drivers/media/rc/ene_ir.c +@@ -1072,10 +1072,14 @@ static int ene_probe(struct pnp_dev *pnp_dev, const struct pnp_device_id *id) + device_set_wakeup_capable(&pnp_dev->dev, true); + device_set_wakeup_enable(&pnp_dev->dev, true); + ++ error = rc_register_device(rdev); ++ if (error < 0) ++ goto exit_free_dev_rdev; ++ + /* claim the resources */ + error = -EBUSY; + if (!request_region(dev->hw_io, ENE_IO_SIZE, ENE_DRIVER_NAME)) { +- goto exit_free_dev_rdev; ++ goto exit_unregister_device; + } + + dev->irq = pnp_irq(pnp_dev, 0); +@@ -1084,17 +1088,13 @@ static int ene_probe(struct pnp_dev *pnp_dev, const struct pnp_device_id *id) + goto exit_release_hw_io; + } + +- error = rc_register_device(rdev); +- if (error < 0) +- goto exit_free_irq; +- + pr_notice("driver has been successfully loaded\n"); + return 0; + +-exit_free_irq: +- free_irq(dev->irq, dev); + exit_release_hw_io: + release_region(dev->hw_io, ENE_IO_SIZE); ++exit_unregister_device: ++ rc_unregister_device(rdev); + exit_free_dev_rdev: + rc_free_device(rdev); + kfree(dev); +diff --git a/drivers/media/rc/ite-cir.c b/drivers/media/rc/ite-cir.c +index 158bd0a..974836a 100644 +--- a/drivers/media/rc/ite-cir.c ++++ b/drivers/media/rc/ite-cir.c +@@ -1592,28 +1592,28 @@ static int ite_probe(struct pnp_dev *pdev, const struct pnp_device_id + + itdev->rdev = rdev; + ++ ret = rc_register_device(rdev); ++ if (ret) ++ goto exit_free_dev_rdev; ++ + ret = -EBUSY; + /* now claim resources */ + if (!request_region(itdev->cir_addr, + dev_desc->io_region_size, ITE_DRIVER_NAME)) +- goto exit_free_dev_rdev; ++ goto exit_unregister_device; + + if (request_irq(itdev->cir_irq, ite_cir_isr, IRQF_SHARED, + ITE_DRIVER_NAME, (void *)itdev)) + goto exit_release_cir_addr; + +- ret = rc_register_device(rdev); +- if (ret) +- goto exit_free_irq; +- + ite_pr(KERN_NOTICE, "driver has been successfully loaded\n"); + + return 0; + +-exit_free_irq: +- free_irq(itdev->cir_irq, itdev); + exit_release_cir_addr: + release_region(itdev->cir_addr, itdev->params.io_region_size); ++exit_unregister_device: ++ rc_unregister_device(rdev); + exit_free_dev_rdev: + rc_free_device(rdev); + kfree(itdev); +diff --git a/drivers/media/rc/nuvoton-cir.c b/drivers/media/rc/nuvoton-cir.c +index a1b6be6..18a50b9 100644 +--- a/drivers/media/rc/nuvoton-cir.c ++++ b/drivers/media/rc/nuvoton-cir.c +@@ -1067,11 +1067,15 @@ static int nvt_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id) + #endif + nvt->rdev = rdev; + ++ ret = rc_register_device(rdev); ++ if (ret) ++ goto exit_free_dev_rdev; ++ + ret = -EBUSY; + /* now claim resources */ + if (!request_region(nvt->cir_addr, + CIR_IOREG_LENGTH, NVT_DRIVER_NAME)) +- goto exit_free_dev_rdev; ++ goto exit_unregister_device; + + if (request_irq(nvt->cir_irq, nvt_cir_isr, IRQF_SHARED, + NVT_DRIVER_NAME, (void *)nvt)) +@@ -1085,10 +1089,6 @@ static int nvt_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id) + NVT_DRIVER_NAME, (void *)nvt)) + goto exit_release_cir_wake_addr; + +- ret = rc_register_device(rdev); +- if (ret) +- goto exit_free_wake_irq; +- + device_init_wakeup(&pdev->dev, true); + + nvt_pr(KERN_NOTICE, "driver has been successfully loaded\n"); +@@ -1099,14 +1099,14 @@ static int nvt_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id) + + return 0; + +-exit_free_wake_irq: +- free_irq(nvt->cir_wake_irq, nvt); + exit_release_cir_wake_addr: + release_region(nvt->cir_wake_addr, CIR_IOREG_LENGTH); + exit_free_irq: + free_irq(nvt->cir_irq, nvt); + exit_release_cir_addr: + release_region(nvt->cir_addr, CIR_IOREG_LENGTH); ++exit_unregister_device: ++ rc_unregister_device(rdev); + exit_free_dev_rdev: + rc_free_device(rdev); + kfree(nvt); +diff --git a/drivers/media/rc/winbond-cir.c b/drivers/media/rc/winbond-cir.c +index 54ee348..1f90e8c 100644 +--- a/drivers/media/rc/winbond-cir.c ++++ b/drivers/media/rc/winbond-cir.c +@@ -1035,11 +1035,15 @@ wbcir_probe(struct pnp_dev *device, const struct pnp_device_id *dev_id) + data->dev->timeout = MS_TO_NS(100); + data->dev->allowed_protos = RC_TYPE_ALL; + ++ err = rc_register_device(data->dev); ++ if (err) ++ goto exit_free_rc; ++ + if (!request_region(data->wbase, WAKEUP_IOMEM_LEN, DRVNAME)) { + dev_err(dev, "Region 0x%lx-0x%lx already in use!\n", + data->wbase, data->wbase + WAKEUP_IOMEM_LEN - 1); + err = -EBUSY; +- goto exit_free_rc; ++ goto exit_unregister_device; + } + + if (!request_region(data->ebase, EHFUNC_IOMEM_LEN, DRVNAME)) { +@@ -1064,24 +1068,20 @@ wbcir_probe(struct pnp_dev *device, const struct pnp_device_id *dev_id) + goto exit_release_sbase; + } + +- err = rc_register_device(data->dev); +- if (err) +- goto exit_free_irq; +- + device_init_wakeup(&device->dev, 1); + + wbcir_init_hw(data); + + return 0; + +-exit_free_irq: +- free_irq(data->irq, device); + exit_release_sbase: + release_region(data->sbase, SP_IOMEM_LEN); + exit_release_ebase: + release_region(data->ebase, EHFUNC_IOMEM_LEN); + exit_release_wbase: + release_region(data->wbase, WAKEUP_IOMEM_LEN); ++exit_unregister_device: ++ rc_unregister_device(data->dev); + exit_free_rc: + rc_free_device(data->dev); + exit_unregister_led: