diff options
Diffstat (limited to 'drivers/char/efirtc.c')
| -rw-r--r-- | drivers/char/efirtc.c | 84 | 
1 files changed, 40 insertions, 44 deletions
diff --git a/drivers/char/efirtc.c b/drivers/char/efirtc.c index 53c524e7b82..e39e7402e62 100644 --- a/drivers/char/efirtc.c +++ b/drivers/char/efirtc.c @@ -34,10 +34,10 @@  #include <linux/init.h>  #include <linux/rtc.h>  #include <linux/proc_fs.h> +#include <linux/seq_file.h>  #include <linux/efi.h>  #include <linux/uaccess.h> -#include <asm/system.h>  #define EFI_RTC_VERSION		"0.4" @@ -297,12 +297,10 @@ static struct miscdevice efi_rtc_dev= {  /*   *	We export RAW EFI information to /proc/driver/efirtc   */ -static int -efi_rtc_get_status(char *buf) +static int efi_rtc_proc_show(struct seq_file *m, void *v)  {  	efi_time_t 	eft, alm;  	efi_time_cap_t	cap; -	char		*p = buf;  	efi_bool_t	enabled, pending;	  	unsigned long	flags; @@ -317,64 +315,63 @@ efi_rtc_get_status(char *buf)  	spin_unlock_irqrestore(&efi_rtc_lock,flags); -	p += sprintf(p, -		     "Time           : %u:%u:%u.%09u\n" -		     "Date           : %u-%u-%u\n" -		     "Daylight       : %u\n", -		     eft.hour, eft.minute, eft.second, eft.nanosecond,  -		     eft.year, eft.month, eft.day, -		     eft.daylight); +	seq_printf(m, +		   "Time           : %u:%u:%u.%09u\n" +		   "Date           : %u-%u-%u\n" +		   "Daylight       : %u\n", +		   eft.hour, eft.minute, eft.second, eft.nanosecond,  +		   eft.year, eft.month, eft.day, +		   eft.daylight);  	if (eft.timezone == EFI_UNSPECIFIED_TIMEZONE) -		p += sprintf(p, "Timezone       : unspecified\n"); +		seq_puts(m, "Timezone       : unspecified\n");  	else  		/* XXX fixme: convert to string? */ -		p += sprintf(p, "Timezone       : %u\n", eft.timezone); +		seq_printf(m, "Timezone       : %u\n", eft.timezone); -	p += sprintf(p, -		     "Alarm Time     : %u:%u:%u.%09u\n" -		     "Alarm Date     : %u-%u-%u\n" -		     "Alarm Daylight : %u\n" -		     "Enabled        : %s\n" -		     "Pending        : %s\n", -		     alm.hour, alm.minute, alm.second, alm.nanosecond,  -		     alm.year, alm.month, alm.day,  -		     alm.daylight, -		     enabled == 1 ? "yes" : "no", -		     pending == 1 ? "yes" : "no"); +	seq_printf(m, +		   "Alarm Time     : %u:%u:%u.%09u\n" +		   "Alarm Date     : %u-%u-%u\n" +		   "Alarm Daylight : %u\n" +		   "Enabled        : %s\n" +		   "Pending        : %s\n", +		   alm.hour, alm.minute, alm.second, alm.nanosecond,  +		   alm.year, alm.month, alm.day,  +		   alm.daylight, +		   enabled == 1 ? "yes" : "no", +		   pending == 1 ? "yes" : "no");  	if (eft.timezone == EFI_UNSPECIFIED_TIMEZONE) -		p += sprintf(p, "Timezone       : unspecified\n"); +		seq_puts(m, "Timezone       : unspecified\n");  	else  		/* XXX fixme: convert to string? */ -		p += sprintf(p, "Timezone       : %u\n", alm.timezone); +		seq_printf(m, "Timezone       : %u\n", alm.timezone);  	/*  	 * now prints the capabilities  	 */ -	p += sprintf(p, -		     "Resolution     : %u\n" -		     "Accuracy       : %u\n" -		     "SetstoZero     : %u\n", -		      cap.resolution, cap.accuracy, cap.sets_to_zero); +	seq_printf(m, +		   "Resolution     : %u\n" +		   "Accuracy       : %u\n" +		   "SetstoZero     : %u\n", +		   cap.resolution, cap.accuracy, cap.sets_to_zero); -	return  p - buf; +	return 0;  } -static int -efi_rtc_read_proc(char *page, char **start, off_t off, -                                 int count, int *eof, void *data) +static int efi_rtc_proc_open(struct inode *inode, struct file *file)  { -        int len = efi_rtc_get_status(page); -        if (len <= off+count) *eof = 1; -        *start = page + off; -        len -= off; -        if (len>count) len = count; -        if (len<0) len = 0; -        return len; +	return single_open(file, efi_rtc_proc_show, NULL);  } +static const struct file_operations efi_rtc_proc_fops = { +	.open		= efi_rtc_proc_open, +	.read		= seq_read, +	.llseek		= seq_lseek, +	.release	= single_release, +}; +  static int __init   efi_rtc_init(void)  { @@ -390,8 +387,7 @@ efi_rtc_init(void)  		return ret;  	} -	dir = create_proc_read_entry ("driver/efirtc", 0, NULL, -			              efi_rtc_read_proc, NULL); +	dir = proc_create("driver/efirtc", 0, NULL, &efi_rtc_proc_fops);  	if (dir == NULL) {  		printk(KERN_ERR "efirtc: can't create /proc/driver/efirtc.\n");  		misc_deregister(&efi_rtc_dev);  | 
