Blackfin RTC Driver: move irq request/free out of open/release and into probe/remove so that the non-dev interfaces (like sysfs) work as expected

Signed-off-by: Mike Frysinger <vapier.adi@gmail.com>
Signed-off-by: Bryan Wu <cooloney@kernel.org>
Cc: Alessandro Zummo <a.zummo@towertech.it>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by Mike Frysinger and committed by Linus Torvalds fe2e1cf8 1804dc6e

+23 -34
+23 -34
drivers/rtc/rtc-bfin.c
··· 218 return IRQ_NONE; 219 } 220 221 - static int bfin_rtc_open(struct device *dev) 222 - { 223 - int ret; 224 - 225 - dev_dbg_stamp(dev); 226 - 227 - ret = request_irq(IRQ_RTC, bfin_rtc_interrupt, IRQF_SHARED, to_platform_device(dev)->name, dev); 228 - if (!ret) 229 - bfin_rtc_reset(dev, RTC_ISTAT_WRITE_COMPLETE); 230 - 231 - return ret; 232 - } 233 - 234 - static void bfin_rtc_release(struct device *dev) 235 - { 236 - dev_dbg_stamp(dev); 237 - bfin_rtc_reset(dev, 0); 238 - free_irq(IRQ_RTC, dev); 239 - } 240 - 241 static void bfin_rtc_int_set(u16 rtc_int) 242 { 243 bfin_write_RTC_ISTAT(rtc_int); ··· 350 } 351 352 static struct rtc_class_ops bfin_rtc_ops = { 353 - .open = bfin_rtc_open, 354 - .release = bfin_rtc_release, 355 .ioctl = bfin_rtc_ioctl, 356 .read_time = bfin_rtc_read_time, 357 .set_time = bfin_rtc_set_time, ··· 361 static int __devinit bfin_rtc_probe(struct platform_device *pdev) 362 { 363 struct bfin_rtc *rtc; 364 int ret = 0; 365 366 - dev_dbg_stamp(&pdev->dev); 367 368 rtc = kzalloc(sizeof(*rtc), GFP_KERNEL); 369 if (unlikely(!rtc)) 370 return -ENOMEM; 371 - 372 - rtc->rtc_dev = rtc_device_register(pdev->name, &pdev->dev, &bfin_rtc_ops, THIS_MODULE); 373 - if (IS_ERR(rtc)) { 374 - ret = PTR_ERR(rtc->rtc_dev); 375 - goto err; 376 - } 377 - 378 - /* see comment at top of file about stopwatch/PIE */ 379 - bfin_write_RTC_SWCNT(0); 380 - 381 platform_set_drvdata(pdev, rtc); 382 383 - device_init_wakeup(&pdev->dev, 1); 384 385 return 0; 386 387 err: 388 kfree(rtc); 389 return ret; ··· 400 static int __devexit bfin_rtc_remove(struct platform_device *pdev) 401 { 402 struct bfin_rtc *rtc = platform_get_drvdata(pdev); 403 404 rtc_device_unregister(rtc->rtc_dev); 405 platform_set_drvdata(pdev, NULL); 406 kfree(rtc);
··· 218 return IRQ_NONE; 219 } 220 221 static void bfin_rtc_int_set(u16 rtc_int) 222 { 223 bfin_write_RTC_ISTAT(rtc_int); ··· 370 } 371 372 static struct rtc_class_ops bfin_rtc_ops = { 373 .ioctl = bfin_rtc_ioctl, 374 .read_time = bfin_rtc_read_time, 375 .set_time = bfin_rtc_set_time, ··· 383 static int __devinit bfin_rtc_probe(struct platform_device *pdev) 384 { 385 struct bfin_rtc *rtc; 386 + struct device *dev = &pdev->dev; 387 int ret = 0; 388 389 + dev_dbg_stamp(dev); 390 391 + /* Allocate memory for our RTC struct */ 392 rtc = kzalloc(sizeof(*rtc), GFP_KERNEL); 393 if (unlikely(!rtc)) 394 return -ENOMEM; 395 platform_set_drvdata(pdev, rtc); 396 397 + /* Grab the IRQ and init the hardware */ 398 + ret = request_irq(IRQ_RTC, bfin_rtc_interrupt, IRQF_SHARED, pdev->name, dev); 399 + if (unlikely(ret)) 400 + goto err; 401 + bfin_rtc_reset(dev, RTC_ISTAT_WRITE_COMPLETE); 402 + bfin_write_RTC_SWCNT(0); 403 + 404 + /* Register our RTC with the RTC framework */ 405 + rtc->rtc_dev = rtc_device_register(pdev->name, dev, &bfin_rtc_ops, THIS_MODULE); 406 + if (unlikely(IS_ERR(rtc))) { 407 + ret = PTR_ERR(rtc->rtc_dev); 408 + goto err_irq; 409 + } 410 + 411 + device_init_wakeup(dev, 1); 412 413 return 0; 414 415 + err_irq: 416 + free_irq(IRQ_RTC, dev); 417 err: 418 kfree(rtc); 419 return ret; ··· 414 static int __devexit bfin_rtc_remove(struct platform_device *pdev) 415 { 416 struct bfin_rtc *rtc = platform_get_drvdata(pdev); 417 + struct device *dev = &pdev->dev; 418 419 + bfin_rtc_reset(dev, 0); 420 + free_irq(IRQ_RTC, dev); 421 rtc_device_unregister(rtc->rtc_dev); 422 platform_set_drvdata(pdev, NULL); 423 kfree(rtc);