Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4c06be10 authored by Bjorn Helgaas's avatar Bjorn Helgaas Committed by Linus Torvalds
Browse files

rtc: release correct region in error path



The misc_register() error path always released an I/O port region,
even if the region was memory-mapped (only mips uses memory-mapped RTC,
as far as I can see).

Signed-off-by: default avatarBjorn Helgaas <bjorn.helgaas@hp.com>
Cc: Alessandro Zummo <a.zummo@towertech.it>
Cc: David Brownell <david-b@pacbell.net>
Acked-by: default avatarRalf Baechle <ralf@linux-mips.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent c06a018f
Loading
Loading
Loading
Loading
+11 −9
Original line number Diff line number Diff line
@@ -918,6 +918,14 @@ static const struct file_operations rtc_proc_fops = {
};
#endif

static void rtc_release_region(void)
{
	if (RTC_IOMAPPED)
		release_region(RTC_PORT(0), RTC_IO_EXTENT);
	else
		release_mem_region(RTC_PORT(0), RTC_IO_EXTENT);
}

static int __init rtc_init(void)
{
#ifdef CONFIG_PROC_FS
@@ -992,10 +1000,7 @@ static int __init rtc_init(void)
		/* Yeah right, seeing as irq 8 doesn't even hit the bus. */
		rtc_has_irq = 0;
		printk(KERN_ERR "rtc: IRQ %d is not free.\n", RTC_IRQ);
		if (RTC_IOMAPPED)
			release_region(RTC_PORT(0), RTC_IO_EXTENT);
		else
			release_mem_region(RTC_PORT(0), RTC_IO_EXTENT);
		rtc_release_region();
		return -EIO;
	}
	hpet_rtc_timer_init();
@@ -1009,7 +1014,7 @@ static int __init rtc_init(void)
		free_irq(RTC_IRQ, NULL);
		rtc_has_irq = 0;
#endif
		release_region(RTC_PORT(0), RTC_IO_EXTENT);
		rtc_release_region();
		return -ENODEV;
	}

@@ -1091,10 +1096,7 @@ static void __exit rtc_exit (void)
	if (rtc_has_irq)
		free_irq (rtc_irq, &rtc_port);
#else
	if (RTC_IOMAPPED)
		release_region(RTC_PORT(0), RTC_IO_EXTENT);
	else
		release_mem_region(RTC_PORT(0), RTC_IO_EXTENT);
	rtc_release_region();
#ifdef RTC_IRQ
	if (rtc_has_irq)
		free_irq (RTC_IRQ, NULL);