diff options
Diffstat (limited to 'drivers/rtc/rtc-cmos.c')
| -rw-r--r-- | drivers/rtc/rtc-cmos.c | 90 | 
1 files changed, 42 insertions, 48 deletions
| diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c index f7a4701bf86..e9aa814ddd2 100644 --- a/drivers/rtc/rtc-cmos.c +++ b/drivers/rtc/rtc-cmos.c @@ -420,49 +420,43 @@ static int cmos_irq_set_state(struct device *dev, int enabled)  	return 0;  } -#if defined(CONFIG_RTC_INTF_DEV) || defined(CONFIG_RTC_INTF_DEV_MODULE) - -static int -cmos_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long arg) +static int cmos_alarm_irq_enable(struct device *dev, unsigned int enabled)  {  	struct cmos_rtc	*cmos = dev_get_drvdata(dev);  	unsigned long	flags; -	switch (cmd) { -	case RTC_AIE_OFF: -	case RTC_AIE_ON: -	case RTC_UIE_OFF: -	case RTC_UIE_ON: -		if (!is_valid_irq(cmos->irq)) -			return -EINVAL; -		break; -	/* PIE ON/OFF is handled by cmos_irq_set_state() */ -	default: -		return -ENOIOCTLCMD; -	} +	if (!is_valid_irq(cmos->irq)) +		return -EINVAL;  	spin_lock_irqsave(&rtc_lock, flags); -	switch (cmd) { -	case RTC_AIE_OFF:	/* alarm off */ -		cmos_irq_disable(cmos, RTC_AIE); -		break; -	case RTC_AIE_ON:	/* alarm on */ + +	if (enabled)  		cmos_irq_enable(cmos, RTC_AIE); -		break; -	case RTC_UIE_OFF:	/* update off */ -		cmos_irq_disable(cmos, RTC_UIE); -		break; -	case RTC_UIE_ON:	/* update on */ -		cmos_irq_enable(cmos, RTC_UIE); -		break; -	} +	else +		cmos_irq_disable(cmos, RTC_AIE); +  	spin_unlock_irqrestore(&rtc_lock, flags);  	return 0;  } -#else -#define	cmos_rtc_ioctl	NULL -#endif +static int cmos_update_irq_enable(struct device *dev, unsigned int enabled) +{ +	struct cmos_rtc	*cmos = dev_get_drvdata(dev); +	unsigned long	flags; + +	if (!is_valid_irq(cmos->irq)) +		return -EINVAL; + +	spin_lock_irqsave(&rtc_lock, flags); + +	if (enabled) +		cmos_irq_enable(cmos, RTC_UIE); +	else +		cmos_irq_disable(cmos, RTC_UIE); + +	spin_unlock_irqrestore(&rtc_lock, flags); +	return 0; +}  #if defined(CONFIG_RTC_INTF_PROC) || defined(CONFIG_RTC_INTF_PROC_MODULE) @@ -503,14 +497,15 @@ static int cmos_procfs(struct device *dev, struct seq_file *seq)  #endif  static const struct rtc_class_ops cmos_rtc_ops = { -	.ioctl		= cmos_rtc_ioctl, -	.read_time	= cmos_read_time, -	.set_time	= cmos_set_time, -	.read_alarm	= cmos_read_alarm, -	.set_alarm	= cmos_set_alarm, -	.proc		= cmos_procfs, -	.irq_set_freq	= cmos_irq_set_freq, -	.irq_set_state	= cmos_irq_set_state, +	.read_time		= cmos_read_time, +	.set_time		= cmos_set_time, +	.read_alarm		= cmos_read_alarm, +	.set_alarm		= cmos_set_alarm, +	.proc			= cmos_procfs, +	.irq_set_freq		= cmos_irq_set_freq, +	.irq_set_state		= cmos_irq_set_state, +	.alarm_irq_enable	= cmos_alarm_irq_enable, +	.update_irq_enable	= cmos_update_irq_enable,  };  /*----------------------------------------------------------------*/ @@ -691,7 +686,8 @@ cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq)  	 */  #if	defined(CONFIG_ATARI)  	address_space = 64; -#elif defined(__i386__) || defined(__x86_64__) || defined(__arm__) || defined(__sparc__) +#elif defined(__i386__) || defined(__x86_64__) || defined(__arm__) \ +			|| defined(__sparc__) || defined(__mips__)  	address_space = 128;  #else  #warning Assuming 128 bytes of RTC+NVRAM address space, not 64 bytes. @@ -871,8 +867,9 @@ static int cmos_suspend(struct device *dev, pm_message_t mesg)  			mask = RTC_IRQMASK;  		tmp &= ~mask;  		CMOS_WRITE(tmp, RTC_CONTROL); -		hpet_mask_rtc_irq_bit(mask); +		/* shut down hpet emulation - we don't need it for alarm */ +		hpet_mask_rtc_irq_bit(RTC_PIE|RTC_AIE|RTC_UIE);  		cmos_checkintr(cmos, tmp);  	}  	spin_unlock_irq(&rtc_lock); @@ -1099,9 +1096,9 @@ static int cmos_pnp_resume(struct pnp_dev *pnp)  #define	cmos_pnp_resume		NULL  #endif -static void cmos_pnp_shutdown(struct device *pdev) +static void cmos_pnp_shutdown(struct pnp_dev *pnp)  { -	if (system_state == SYSTEM_POWER_OFF && !cmos_poweroff(pdev)) +	if (system_state == SYSTEM_POWER_OFF && !cmos_poweroff(&pnp->dev))  		return;  	cmos_do_shutdown(); @@ -1120,15 +1117,12 @@ static struct pnp_driver cmos_pnp_driver = {  	.id_table	= rtc_ids,  	.probe		= cmos_pnp_probe,  	.remove		= __exit_p(cmos_pnp_remove), +	.shutdown	= cmos_pnp_shutdown,  	/* flag ensures resume() gets called, and stops syslog spam */  	.flags		= PNP_DRIVER_RES_DO_NOT_CHANGE,  	.suspend	= cmos_pnp_suspend,  	.resume		= cmos_pnp_resume, -	.driver		= { -		.name	  = (char *)driver_name, -		.shutdown = cmos_pnp_shutdown, -	}  };  #endif	/* CONFIG_PNP */ | 
