mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
[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:
parent
4079c39aaa
commit
0c86edc0d4
8 changed files with 633 additions and 5 deletions
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue