static void s3c_rtc_release(struct device *dev) { struct platform_device *pdev = to_platform_device(dev); struct rtc_device *rtc_dev = platform_get_drvdata(pdev); /* do not clear AIE here, it may be needed for wake */ s3c_rtc_setpie(dev, 0); free_irq(s3c_rtc_alarmno, rtc_dev); free_irq(s3c_rtc_tickno, rtc_dev); }
static int __devexit s3c_rtc_remove(struct platform_device *dev) { struct rtc_device *rtc = platform_get_drvdata(dev); platform_set_drvdata(dev, NULL); rtc_device_unregister(rtc); s3c_rtc_setpie(&dev->dev, 0); s3c_rtc_setaie(0); iounmap(s3c_rtc_base); release_resource(s3c_rtc_mem); kfree(s3c_rtc_mem); return 0; }
static int s3c_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long arg) { unsigned int ret = -ENOIOCTLCMD; switch (cmd) { case RTC_AIE_OFF: case RTC_AIE_ON: s3c_rtc_setaie((cmd == RTC_AIE_ON) ? 1 : 0); ret = 0; break; case RTC_PIE_OFF: case RTC_PIE_ON: tick_count = 0; s3c_rtc_setpie((cmd == RTC_PIE_ON) ? 1 : 0); ret = 0; break; case RTC_IRQP_READ: ret = put_user(s3c_rtc_freq, (unsigned long __user *)arg); break; case RTC_IRQP_SET: /* check for power of 2 */ if ((arg & (arg-1)) != 0 || arg < 1) { ret = -EINVAL; goto exit; } pr_debug("s3c2410_rtc: setting frequency %ld\n", arg); s3c_rtc_setfreq(arg); ret = 0; break; case RTC_UIE_ON: case RTC_UIE_OFF: ret = -EINVAL; } exit: return ret; }
static int __devexit s3c_rtc_remove(struct platform_device *dev) { struct rtc_device *rtc = platform_get_drvdata(dev); platform_set_drvdata(dev, NULL); rtc_device_unregister(rtc); s3c_rtc_setpie(&dev->dev, 0); s3c_rtc_setaie(0); iounmap(s3c_rtc_base); release_resource(s3c_rtc_mem); kfree(s3c_rtc_mem); #ifdef CONFIG_RTC_S3C_SYNC_SYSTEM_TIME cancel_delayed_work(&rtc_sync_work); #endif /* CONFIG_RTC_S3C_SYNC_SYSTEM_TIME */ return 0; }