[PATCH] RTC subsystem: class

Add the basic RTC subsystem infrastructure to the kernel.

rtc/class.c - registration facilities for RTC drivers
rtc/interface.c - kernel/rtc interface functions
rtc/hctosys.c - snippet of code that copies hw clock to sw clock
		at bootup, if configured to do so.

Signed-off-by: Alessandro Zummo <a.zummo@towertech.it>
Acked-by: Greg Kroah-Hartman <gregkh@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
Alessandro Zummo 2006-03-27 01:16:37 -08:00 committed by Linus Torvalds
parent 4079c39aaa
commit 0c86edc0d4
8 changed files with 633 additions and 5 deletions

View file

@ -91,6 +91,12 @@ struct rtc_pll_info {
#define RTC_PLL_GET _IOR('p', 0x11, struct rtc_pll_info) /* Get PLL correction */
#define RTC_PLL_SET _IOW('p', 0x12, struct rtc_pll_info) /* Set PLL correction */
/* interrupt flags */
#define RTC_IRQF 0x80 /* any of the following is active */
#define RTC_PF 0x40
#define RTC_AF 0x20
#define RTC_UF 0x10
#ifdef __KERNEL__
#include <linux/interrupt.h>
@ -100,6 +106,87 @@ extern int rtc_valid_tm(struct rtc_time *tm);
extern int rtc_tm_to_time(struct rtc_time *tm, unsigned long *time);
extern void rtc_time_to_tm(unsigned long time, struct rtc_time *tm);
#include <linux/device.h>
#include <linux/seq_file.h>
#include <linux/cdev.h>
#include <linux/poll.h>
#include <linux/mutex.h>
extern struct class *rtc_class;
struct rtc_class_ops {
int (*open)(struct device *);
void (*release)(struct device *);
int (*ioctl)(struct device *, unsigned int, unsigned long);
int (*read_time)(struct device *, struct rtc_time *);
int (*set_time)(struct device *, struct rtc_time *);
int (*read_alarm)(struct device *, struct rtc_wkalrm *);
int (*set_alarm)(struct device *, struct rtc_wkalrm *);
int (*proc)(struct device *, struct seq_file *);
int (*set_mmss)(struct device *, unsigned long secs);
int (*irq_set_state)(struct device *, int enabled);
int (*irq_set_freq)(struct device *, int freq);
int (*read_callback)(struct device *, int data);
};
#define RTC_DEVICE_NAME_SIZE 20
struct rtc_task;
struct rtc_device
{
struct class_device class_dev;
struct module *owner;
int id;
char name[RTC_DEVICE_NAME_SIZE];
struct rtc_class_ops *ops;
struct mutex ops_lock;
struct class_device *rtc_dev;
struct cdev char_dev;
struct mutex char_lock;
unsigned long irq_data;
spinlock_t irq_lock;
wait_queue_head_t irq_queue;
struct fasync_struct *async_queue;
struct rtc_task *irq_task;
spinlock_t irq_task_lock;
int irq_freq;
};
#define to_rtc_device(d) container_of(d, struct rtc_device, class_dev)
extern struct rtc_device *rtc_device_register(const char *name,
struct device *dev,
struct rtc_class_ops *ops,
struct module *owner);
extern void rtc_device_unregister(struct rtc_device *rdev);
extern int rtc_interface_register(struct class_interface *intf);
extern int rtc_read_time(struct class_device *class_dev, struct rtc_time *tm);
extern int rtc_set_time(struct class_device *class_dev, struct rtc_time *tm);
extern int rtc_set_mmss(struct class_device *class_dev, unsigned long secs);
extern int rtc_read_alarm(struct class_device *class_dev,
struct rtc_wkalrm *alrm);
extern int rtc_set_alarm(struct class_device *class_dev,
struct rtc_wkalrm *alrm);
extern void rtc_update_irq(struct class_device *class_dev,
unsigned long num, unsigned long events);
extern struct class_device *rtc_class_open(char *name);
extern void rtc_class_close(struct class_device *class_dev);
extern int rtc_irq_register(struct class_device *class_dev,
struct rtc_task *task);
extern void rtc_irq_unregister(struct class_device *class_dev,
struct rtc_task *task);
extern int rtc_irq_set_state(struct class_device *class_dev,
struct rtc_task *task, int enabled);
extern int rtc_irq_set_freq(struct class_device *class_dev,
struct rtc_task *task, int freq);
typedef struct rtc_task {
void (*func)(void *private_data);
void *private_data;