diff options
Diffstat (limited to 'drivers/rtc/rtc-dev.c')
| -rw-r--r-- | drivers/rtc/rtc-dev.c | 33 | 
1 files changed, 11 insertions, 22 deletions
diff --git a/drivers/rtc/rtc-dev.c b/drivers/rtc/rtc-dev.c index 005fff3a350..362400db2e8 100644 --- a/drivers/rtc/rtc-dev.c +++ b/drivers/rtc/rtc-dev.c @@ -238,17 +238,6 @@ static int rtc_dev_ioctl(struct inode *inode, struct file *file,  		break;  	} -	/* avoid conflicting IRQ users */ -	if (cmd == RTC_PIE_ON || cmd == RTC_PIE_OFF || cmd == RTC_IRQP_SET) { -		spin_lock_irq(&rtc->irq_task_lock); -		if (rtc->irq_task) -			err = -EBUSY; -		spin_unlock_irq(&rtc->irq_task_lock); - -		if (err < 0) -			return err; -	} -  	/* try the driver's ioctl interface */  	if (ops->ioctl) {  		err = ops->ioctl(rtc->dev.parent, cmd, arg); @@ -338,18 +327,20 @@ static int rtc_dev_ioctl(struct inode *inode, struct file *file,  		err = rtc_set_time(rtc, &tm);  		break; -	case RTC_IRQP_READ: -		if (ops->irq_set_freq) -			err = put_user(rtc->irq_freq, (unsigned long __user *)uarg); -		else -			err = -ENOTTY; +	case RTC_PIE_ON: +		err = rtc_irq_set_state(rtc, NULL, 1); +		break; + +	case RTC_PIE_OFF: +		err = rtc_irq_set_state(rtc, NULL, 0);  		break;  	case RTC_IRQP_SET: -		if (ops->irq_set_freq) -			err = rtc_irq_set_freq(rtc, rtc->irq_task, arg); -		else -			err = -ENOTTY; +		err = rtc_irq_set_freq(rtc, NULL, arg); +		break; + +	case RTC_IRQP_READ: +		err = put_user(rtc->irq_freq, (unsigned long __user *)uarg);  		break;  #if 0 @@ -449,8 +440,6 @@ void rtc_dev_prepare(struct rtc_device *rtc)  	rtc->dev.devt = MKDEV(MAJOR(rtc_devt), rtc->id);  	mutex_init(&rtc->char_lock); -	spin_lock_init(&rtc->irq_lock); -	init_waitqueue_head(&rtc->irq_queue);  #ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL  	INIT_WORK(&rtc->uie_task, rtc_uie_task);  	setup_timer(&rtc->uie_timer, rtc_uie_timer, (unsigned long)rtc);  |