diff --git a/packages/linux/patches/linux-3.6.11-206.01-media-ene-ir-Fix-cleanup-on-probe-failure.patch b/packages/linux/patches/linux-3.6.11-206.01-media-ene-ir-Fix-cleanup-on-probe-failure.patch new file mode 100644 index 0000000000..8beef64fb6 --- /dev/null +++ b/packages/linux/patches/linux-3.6.11-206.01-media-ene-ir-Fix-cleanup-on-probe-failure.patch @@ -0,0 +1,74 @@ +diff -Naur linux-3.6.11/drivers/media/rc/ene_ir.c linux-3.6.11.patch/drivers/media/rc/ene_ir.c +--- linux-3.6.11/drivers/media/rc/ene_ir.c 2012-12-17 18:27:45.000000000 +0100 ++++ linux-3.6.11.patch/drivers/media/rc/ene_ir.c 2012-12-28 22:52:22.571974437 +0100 +@@ -1000,7 +1000,7 @@ + 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 @@ + + 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 @@ + /* 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 @@ + /* 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.6.11-206.02-media-rc-Make-probe-cleanup-goto-labels-more-verbose.patch b/packages/linux/patches/linux-3.6.11-206.02-media-rc-Make-probe-cleanup-goto-labels-more-verbose.patch new file mode 100644 index 0000000000..72500fb2df --- /dev/null +++ b/packages/linux/patches/linux-3.6.11-206.02-media-rc-Make-probe-cleanup-goto-labels-more-verbose.patch @@ -0,0 +1,416 @@ +diff -Naur linux-3.6.11/drivers/media/rc/ati_remote.c linux-3.6.11.patch/drivers/media/rc/ati_remote.c +--- linux-3.6.11/drivers/media/rc/ati_remote.c 2012-12-28 22:53:15.840572260 +0100 ++++ linux-3.6.11.patch/drivers/media/rc/ati_remote.c 2012-12-28 22:53:29.113472164 +0100 +@@ -877,11 +877,11 @@ + 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 @@ + /* 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 @@ + 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 -Naur linux-3.6.11/drivers/media/rc/ene_ir.c linux-3.6.11.patch/drivers/media/rc/ene_ir.c +--- linux-3.6.11/drivers/media/rc/ene_ir.c 2012-12-28 22:53:15.840572260 +0100 ++++ linux-3.6.11.patch/drivers/media/rc/ene_ir.c 2012-12-28 22:53:29.114472156 +0100 +@@ -1000,7 +1000,7 @@ + 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 @@ + + 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 @@ + /* 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 @@ + /* 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 -Naur linux-3.6.11/drivers/media/rc/fintek-cir.c linux-3.6.11.patch/drivers/media/rc/fintek-cir.c +--- linux-3.6.11/drivers/media/rc/fintek-cir.c 2012-12-28 22:53:15.839572268 +0100 ++++ linux-3.6.11.patch/drivers/media/rc/fintek-cir.c 2012-12-28 22:53:29.115472147 +0100 +@@ -495,18 +495,18 @@ + /* 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 @@ + + 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 @@ + /* 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 @@ + + 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 -Naur linux-3.6.11/drivers/media/rc/gpio-ir-recv.c linux-3.6.11.patch/drivers/media/rc/gpio-ir-recv.c +--- linux-3.6.11/drivers/media/rc/gpio-ir-recv.c 2012-12-28 22:53:15.839572268 +0100 ++++ linux-3.6.11.patch/drivers/media/rc/gpio-ir-recv.c 2012-12-28 22:53:29.115472147 +0100 +@@ -79,7 +79,7 @@ + rcdev = rc_allocate_device(); + if (!rcdev) { + rc = -ENOMEM; +- goto err_allocate_device; ++ goto exit_free_dev; + } + + rcdev->priv = gpio_dev; +@@ -104,15 +104,15 @@ + + rc = gpio_request(pdata->gpio_nr, "gpio-ir-recv"); + if (rc < 0) +- goto err_gpio_request; ++ goto exit_free_rdev; + rc = gpio_direction_input(pdata->gpio_nr); + if (rc < 0) +- goto err_gpio_direction_input; ++ goto exit_free_gpio; + + rc = rc_register_device(rcdev); + if (rc < 0) { + dev_err(&pdev->dev, "failed to register rc device\n"); +- goto err_register_rc_device; ++ goto exit_free_gpio; + } + + platform_set_drvdata(pdev, gpio_dev); +@@ -122,20 +122,19 @@ + IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, + "gpio-ir-recv-irq", gpio_dev); + if (rc < 0) +- goto err_request_irq; ++ goto exit_unregister_device; + + return 0; + +-err_request_irq: ++exit_unregister_device: + platform_set_drvdata(pdev, NULL); + rc_unregister_device(rcdev); +-err_register_rc_device: +-err_gpio_direction_input: ++exit_free_gpio: + gpio_free(pdata->gpio_nr); +-err_gpio_request: ++exit_free_rdev: + rc_free_device(rcdev); + rcdev = NULL; +-err_allocate_device: ++exit_free_dev: + kfree(gpio_dev); + return rc; + } +diff -Naur linux-3.6.11/drivers/media/rc/ite-cir.c linux-3.6.11.patch/drivers/media/rc/ite-cir.c +--- linux-3.6.11/drivers/media/rc/ite-cir.c 2012-12-28 22:53:15.840572260 +0100 ++++ linux-3.6.11.patch/drivers/media/rc/ite-cir.c 2012-12-28 22:58:06.139364653 +0100 +@@ -1472,7 +1472,7 @@ + /* input device for IR remote (and tx) */ + rdev = rc_allocate_device(); + if (!rdev) +- goto failure; ++ goto exit_free_dev_rdev; + itdev->rdev = rdev; + + ret = -ENODEV; +@@ -1498,12 +1498,12 @@ + 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 */ +@@ -1595,25 +1595,26 @@ + /* 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; + + 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 -Naur linux-3.6.11/drivers/media/rc/nuvoton-cir.c linux-3.6.11.patch/drivers/media/rc/nuvoton-cir.c +--- linux-3.6.11/drivers/media/rc/nuvoton-cir.c 2012-12-28 22:53:15.839572268 +0100 ++++ linux-3.6.11.patch/drivers/media/rc/nuvoton-cir.c 2012-12-28 22:53:29.118472125 +0100 +@@ -986,25 +986,25 @@ + /* 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 @@ + + 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 @@ + /* 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 @@ + + 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.6.11-206.03-media-rc-Set-rdev-before-irq-setup.patch b/packages/linux/patches/linux-3.6.11-206.03-media-rc-Set-rdev-before-irq-setup.patch new file mode 100644 index 0000000000..7d770163e6 --- /dev/null +++ b/packages/linux/patches/linux-3.6.11-206.03-media-rc-Set-rdev-before-irq-setup.patch @@ -0,0 +1,53 @@ +diff -Naur linux-3.6.11/drivers/media/rc/fintek-cir.c linux-3.6.11.patch/drivers/media/rc/fintek-cir.c +--- linux-3.6.11/drivers/media/rc/fintek-cir.c 2012-12-28 22:59:21.808868854 +0100 ++++ linux-3.6.11.patch/drivers/media/rc/fintek-cir.c 2012-12-28 22:59:37.532767678 +0100 +@@ -552,6 +552,8 @@ + /* 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 @@ + 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 -Naur linux-3.6.11/drivers/media/rc/ite-cir.c linux-3.6.11.patch/drivers/media/rc/ite-cir.c +--- linux-3.6.11/drivers/media/rc/ite-cir.c 2012-12-28 22:59:21.808868854 +0100 ++++ linux-3.6.11.patch/drivers/media/rc/ite-cir.c 2012-12-28 22:59:37.533767672 +0100 +@@ -1591,6 +1591,8 @@ + 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, +diff -Naur linux-3.6.11/drivers/media/rc/nuvoton-cir.c linux-3.6.11.patch/drivers/media/rc/nuvoton-cir.c +--- linux-3.6.11/drivers/media/rc/nuvoton-cir.c 2012-12-28 22:59:21.807868860 +0100 ++++ linux-3.6.11.patch/drivers/media/rc/nuvoton-cir.c 2012-12-28 22:59:37.533767672 +0100 +@@ -1065,6 +1065,7 @@ + /* tx bits */ + rdev->tx_resolution = XYZ; + #endif ++ nvt->rdev = rdev; + + ret = -EBUSY; + /* now claim resources */ +@@ -1089,7 +1090,7 @@ + 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.6.11-206.04-media-rc-Call-rc_register_device-before-irq-setup.patch b/packages/linux/patches/linux-3.6.11-206.04-media-rc-Call-rc_register_device-before-irq-setup.patch new file mode 100644 index 0000000000..ec3765b3f9 --- /dev/null +++ b/packages/linux/patches/linux-3.6.11-206.04-media-rc-Call-rc_register_device-before-irq-setup.patch @@ -0,0 +1,174 @@ +diff -Naur linux-3.6.11/drivers/media/rc/ene_ir.c linux-3.6.11.patch/drivers/media/rc/ene_ir.c +--- linux-3.6.11/drivers/media/rc/ene_ir.c 2012-12-28 23:03:21.859277264 +0100 ++++ linux-3.6.11.patch/drivers/media/rc/ene_ir.c 2012-12-28 23:03:33.651196525 +0100 +@@ -1072,10 +1072,14 @@ + 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 @@ + 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 -Naur linux-3.6.11/drivers/media/rc/ite-cir.c linux-3.6.11.patch/drivers/media/rc/ite-cir.c +--- linux-3.6.11/drivers/media/rc/ite-cir.c 2012-12-28 23:03:21.858277269 +0100 ++++ linux-3.6.11.patch/drivers/media/rc/ite-cir.c 2012-12-28 23:06:45.772856073 +0100 +@@ -1593,29 +1593,29 @@ + + 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 -Naur linux-3.6.11/drivers/media/rc/nuvoton-cir.c linux-3.6.11.patch/drivers/media/rc/nuvoton-cir.c +--- linux-3.6.11/drivers/media/rc/nuvoton-cir.c 2012-12-28 23:03:21.858277269 +0100 ++++ linux-3.6.11.patch/drivers/media/rc/nuvoton-cir.c 2012-12-28 23:03:33.653196511 +0100 +@@ -1067,11 +1067,15 @@ + #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 @@ + 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 @@ + + 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 -Naur linux-3.6.11/drivers/media/rc/winbond-cir.c linux-3.6.11.patch/drivers/media/rc/winbond-cir.c +--- linux-3.6.11/drivers/media/rc/winbond-cir.c 2012-12-28 23:03:21.858277269 +0100 ++++ linux-3.6.11.patch/drivers/media/rc/winbond-cir.c 2012-12-28 23:03:33.653196511 +0100 +@@ -1035,11 +1035,15 @@ + 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 @@ + 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: