diff options
Diffstat (limited to 'drivers/char')
-rw-r--r-- | drivers/char/Kconfig | 46 | ||||
-rw-r--r-- | drivers/char/Makefile | 2 | ||||
-rw-r--r-- | drivers/char/ds1286.c | 585 | ||||
-rw-r--r-- | drivers/char/hpet.c | 3 | ||||
-rw-r--r-- | drivers/char/hw_random/amd-rng.c | 2 | ||||
-rw-r--r-- | drivers/char/hw_random/geode-rng.c | 2 | ||||
-rw-r--r-- | drivers/char/hw_random/intel-rng.c | 2 | ||||
-rw-r--r-- | drivers/char/hw_random/via-rng.c | 2 | ||||
-rw-r--r-- | drivers/char/ip27-rtc.c | 329 | ||||
-rw-r--r-- | drivers/char/ipmi/ipmi_devintf.c | 3 | ||||
-rw-r--r-- | drivers/char/ipmi/ipmi_msghandler.c | 20 | ||||
-rw-r--r-- | drivers/char/ipmi/ipmi_si_intf.c | 16 | ||||
-rw-r--r-- | drivers/char/ipmi/ipmi_watchdog.c | 1 | ||||
-rw-r--r-- | drivers/char/isicom.c | 6 | ||||
-rw-r--r-- | drivers/char/mxser.c | 3 | ||||
-rw-r--r-- | drivers/char/pcmcia/synclink_cs.c | 2 | ||||
-rw-r--r-- | drivers/char/random.c | 7 | ||||
-rw-r--r-- | drivers/char/rtc.c | 2 | ||||
-rw-r--r-- | drivers/char/sonypi.c | 5 | ||||
-rw-r--r-- | drivers/char/specialix.c | 2 | ||||
-rw-r--r-- | drivers/char/vt.c | 10 |
21 files changed, 55 insertions, 995 deletions
diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig index 122254155ae1..43d6ba83a191 100644 --- a/drivers/char/Kconfig +++ b/drivers/char/Kconfig | |||
@@ -124,7 +124,7 @@ config COMPUTONE | |||
124 | which give you many serial ports. You would need something like this | 124 | which give you many serial ports. You would need something like this |
125 | to connect more than two modems to your Linux box, for instance in | 125 | to connect more than two modems to your Linux box, for instance in |
126 | order to become a dial-in server. If you have a card like that, say | 126 | order to become a dial-in server. If you have a card like that, say |
127 | Y here and read <file:Documentation/computone.txt>. | 127 | Y here and read <file:Documentation/serial/computone.txt>. |
128 | 128 | ||
129 | To compile this driver as module, choose M here: the | 129 | To compile this driver as module, choose M here: the |
130 | module will be called ip2. | 130 | module will be called ip2. |
@@ -136,7 +136,7 @@ config ROCKETPORT | |||
136 | This driver supports Comtrol RocketPort and RocketModem PCI boards. | 136 | This driver supports Comtrol RocketPort and RocketModem PCI boards. |
137 | These boards provide 2, 4, 8, 16, or 32 high-speed serial ports or | 137 | These boards provide 2, 4, 8, 16, or 32 high-speed serial ports or |
138 | modems. For information about the RocketPort/RocketModem boards | 138 | modems. For information about the RocketPort/RocketModem boards |
139 | and this driver read <file:Documentation/rocket.txt>. | 139 | and this driver read <file:Documentation/serial/rocket.txt>. |
140 | 140 | ||
141 | To compile this driver as a module, choose M here: the | 141 | To compile this driver as a module, choose M here: the |
142 | module will be called rocket. | 142 | module will be called rocket. |
@@ -154,7 +154,7 @@ config CYCLADES | |||
154 | your Linux box, for instance in order to become a dial-in server. | 154 | your Linux box, for instance in order to become a dial-in server. |
155 | 155 | ||
156 | For information about the Cyclades-Z card, read | 156 | For information about the Cyclades-Z card, read |
157 | <file:Documentation/README.cycladesZ>. | 157 | <file:Documentation/serial/README.cycladesZ>. |
158 | 158 | ||
159 | To compile this driver as a module, choose M here: the | 159 | To compile this driver as a module, choose M here: the |
160 | module will be called cyclades. | 160 | module will be called cyclades. |
@@ -183,7 +183,7 @@ config DIGIEPCA | |||
183 | box, for instance in order to become a dial-in server. This driver | 183 | box, for instance in order to become a dial-in server. This driver |
184 | supports the original PC (ISA) boards as well as PCI, and EISA. If | 184 | supports the original PC (ISA) boards as well as PCI, and EISA. If |
185 | you have a card like this, say Y here and read the file | 185 | you have a card like this, say Y here and read the file |
186 | <file:Documentation/digiepca.txt>. | 186 | <file:Documentation/serial/digiepca.txt>. |
187 | 187 | ||
188 | To compile this driver as a module, choose M here: the | 188 | To compile this driver as a module, choose M here: the |
189 | module will be called epca. | 189 | module will be called epca. |
@@ -289,7 +289,7 @@ config RISCOM8 | |||
289 | which gives you many serial ports. You would need something like | 289 | which gives you many serial ports. You would need something like |
290 | this to connect more than two modems to your Linux box, for instance | 290 | this to connect more than two modems to your Linux box, for instance |
291 | in order to become a dial-in server. If you have a card like that, | 291 | in order to become a dial-in server. If you have a card like that, |
292 | say Y here and read the file <file:Documentation/riscom8.txt>. | 292 | say Y here and read the file <file:Documentation/serial/riscom8.txt>. |
293 | 293 | ||
294 | Also it's possible to say M here and compile this driver as kernel | 294 | Also it's possible to say M here and compile this driver as kernel |
295 | loadable module; the module will be called riscom8. | 295 | loadable module; the module will be called riscom8. |
@@ -304,8 +304,8 @@ config SPECIALIX | |||
304 | your Linux box, for instance in order to become a dial-in server. | 304 | your Linux box, for instance in order to become a dial-in server. |
305 | 305 | ||
306 | If you have a card like that, say Y here and read the file | 306 | If you have a card like that, say Y here and read the file |
307 | <file:Documentation/specialix.txt>. Also it's possible to say M here | 307 | <file:Documentation/serial/specialix.txt>. Also it's possible to say |
308 | and compile this driver as kernel loadable module which will be | 308 | M here and compile this driver as kernel loadable module which will be |
309 | called specialix. | 309 | called specialix. |
310 | 310 | ||
311 | config SX | 311 | config SX |
@@ -313,7 +313,7 @@ config SX | |||
313 | depends on SERIAL_NONSTANDARD && (PCI || EISA || ISA) | 313 | depends on SERIAL_NONSTANDARD && (PCI || EISA || ISA) |
314 | help | 314 | help |
315 | This is a driver for the SX and SI multiport serial cards. | 315 | This is a driver for the SX and SI multiport serial cards. |
316 | Please read the file <file:Documentation/sx.txt> for details. | 316 | Please read the file <file:Documentation/serial/sx.txt> for details. |
317 | 317 | ||
318 | This driver can only be built as a module ( = code which can be | 318 | This driver can only be built as a module ( = code which can be |
319 | inserted in and removed from the running kernel whenever you want). | 319 | inserted in and removed from the running kernel whenever you want). |
@@ -344,8 +344,8 @@ config STALDRV | |||
344 | like this to connect more than two modems to your Linux box, for | 344 | like this to connect more than two modems to your Linux box, for |
345 | instance in order to become a dial-in server. If you say Y here, | 345 | instance in order to become a dial-in server. If you say Y here, |
346 | you will be asked for your specific card model in the next | 346 | you will be asked for your specific card model in the next |
347 | questions. Make sure to read <file:Documentation/stallion.txt> in | 347 | questions. Make sure to read <file:Documentation/serial/stallion.txt> |
348 | this case. If you have never heard about all this, it's safe to | 348 | in this case. If you have never heard about all this, it's safe to |
349 | say N. | 349 | say N. |
350 | 350 | ||
351 | config STALLION | 351 | config STALLION |
@@ -354,7 +354,7 @@ config STALLION | |||
354 | help | 354 | help |
355 | If you have an EasyIO or EasyConnection 8/32 multiport Stallion | 355 | If you have an EasyIO or EasyConnection 8/32 multiport Stallion |
356 | card, then this is for you; say Y. Make sure to read | 356 | card, then this is for you; say Y. Make sure to read |
357 | <file:Documentation/stallion.txt>. | 357 | <file:Documentation/serial/stallion.txt>. |
358 | 358 | ||
359 | To compile this driver as a module, choose M here: the | 359 | To compile this driver as a module, choose M here: the |
360 | module will be called stallion. | 360 | module will be called stallion. |
@@ -365,7 +365,7 @@ config ISTALLION | |||
365 | help | 365 | help |
366 | If you have an EasyConnection 8/64, ONboard, Brumby or Stallion | 366 | If you have an EasyConnection 8/64, ONboard, Brumby or Stallion |
367 | serial multiport card, say Y here. Make sure to read | 367 | serial multiport card, say Y here. Make sure to read |
368 | <file:Documentation/stallion.txt>. | 368 | <file:Documentation/serial/stallion.txt>. |
369 | 369 | ||
370 | To compile this driver as a module, choose M here: the | 370 | To compile this driver as a module, choose M here: the |
371 | module will be called istallion. | 371 | module will be called istallion. |
@@ -812,28 +812,6 @@ config JS_RTC | |||
812 | To compile this driver as a module, choose M here: the | 812 | To compile this driver as a module, choose M here: the |
813 | module will be called js-rtc. | 813 | module will be called js-rtc. |
814 | 814 | ||
815 | config SGI_DS1286 | ||
816 | tristate "SGI DS1286 RTC support" | ||
817 | depends on SGI_HAS_DS1286 | ||
818 | help | ||
819 | If you say Y here and create a character special file /dev/rtc with | ||
820 | major number 10 and minor number 135 using mknod ("man mknod"), you | ||
821 | will get access to the real time clock built into your computer. | ||
822 | Every SGI has such a clock built in. It reports status information | ||
823 | via the file /proc/rtc and its behaviour is set by various ioctls on | ||
824 | /dev/rtc. | ||
825 | |||
826 | config SGI_IP27_RTC | ||
827 | bool "SGI M48T35 RTC support" | ||
828 | depends on SGI_IP27 | ||
829 | help | ||
830 | If you say Y here and create a character special file /dev/rtc with | ||
831 | major number 10 and minor number 135 using mknod ("man mknod"), you | ||
832 | will get access to the real time clock built into your computer. | ||
833 | Every SGI has such a clock built in. It reports status information | ||
834 | via the file /proc/rtc and its behaviour is set by various ioctls on | ||
835 | /dev/rtc. | ||
836 | |||
837 | config GEN_RTC | 815 | config GEN_RTC |
838 | tristate "Generic /dev/rtc emulation" | 816 | tristate "Generic /dev/rtc emulation" |
839 | depends on RTC!=y && !IA64 && !ARM && !M32R && !MIPS && !SPARC && !FRV && !S390 && !SUPERH && !AVR32 | 817 | depends on RTC!=y && !IA64 && !ARM && !M32R && !MIPS && !SPARC && !FRV && !S390 && !SUPERH && !AVR32 |
diff --git a/drivers/char/Makefile b/drivers/char/Makefile index 1a4247dccac4..438f71317c5c 100644 --- a/drivers/char/Makefile +++ b/drivers/char/Makefile | |||
@@ -74,8 +74,6 @@ obj-$(CONFIG_RTC) += rtc.o | |||
74 | obj-$(CONFIG_HPET) += hpet.o | 74 | obj-$(CONFIG_HPET) += hpet.o |
75 | obj-$(CONFIG_GEN_RTC) += genrtc.o | 75 | obj-$(CONFIG_GEN_RTC) += genrtc.o |
76 | obj-$(CONFIG_EFI_RTC) += efirtc.o | 76 | obj-$(CONFIG_EFI_RTC) += efirtc.o |
77 | obj-$(CONFIG_SGI_DS1286) += ds1286.o | ||
78 | obj-$(CONFIG_SGI_IP27_RTC) += ip27-rtc.o | ||
79 | obj-$(CONFIG_DS1302) += ds1302.o | 77 | obj-$(CONFIG_DS1302) += ds1302.o |
80 | obj-$(CONFIG_XILINX_HWICAP) += xilinx_hwicap/ | 78 | obj-$(CONFIG_XILINX_HWICAP) += xilinx_hwicap/ |
81 | ifeq ($(CONFIG_GENERIC_NVRAM),y) | 79 | ifeq ($(CONFIG_GENERIC_NVRAM),y) |
diff --git a/drivers/char/ds1286.c b/drivers/char/ds1286.c deleted file mode 100644 index 0a826d7be10e..000000000000 --- a/drivers/char/ds1286.c +++ /dev/null | |||
@@ -1,585 +0,0 @@ | |||
1 | /* | ||
2 | * DS1286 Real Time Clock interface for Linux | ||
3 | * | ||
4 | * Copyright (C) 1998, 1999, 2000 Ralf Baechle | ||
5 | * | ||
6 | * Based on code written by Paul Gortmaker. | ||
7 | * | ||
8 | * This driver allows use of the real time clock (built into nearly all | ||
9 | * computers) from user space. It exports the /dev/rtc interface supporting | ||
10 | * various ioctl() and also the /proc/rtc pseudo-file for status | ||
11 | * information. | ||
12 | * | ||
13 | * The ioctls can be used to set the interrupt behaviour and generation rate | ||
14 | * from the RTC via IRQ 8. Then the /dev/rtc interface can be used to make | ||
15 | * use of these timer interrupts, be they interval or alarm based. | ||
16 | * | ||
17 | * The /dev/rtc interface will block on reads until an interrupt has been | ||
18 | * received. If a RTC interrupt has already happened, it will output an | ||
19 | * unsigned long and then block. The output value contains the interrupt | ||
20 | * status in the low byte and the number of interrupts since the last read | ||
21 | * in the remaining high bytes. The /dev/rtc interface can also be used with | ||
22 | * the select(2) call. | ||
23 | * | ||
24 | * This program is free software; you can redistribute it and/or modify it | ||
25 | * under the terms of the GNU General Public License as published by the | ||
26 | * Free Software Foundation; either version 2 of the License, or (at your | ||
27 | * option) any later version. | ||
28 | */ | ||
29 | #include <linux/ds1286.h> | ||
30 | #include <linux/smp_lock.h> | ||
31 | #include <linux/types.h> | ||
32 | #include <linux/errno.h> | ||
33 | #include <linux/miscdevice.h> | ||
34 | #include <linux/slab.h> | ||
35 | #include <linux/ioport.h> | ||
36 | #include <linux/fcntl.h> | ||
37 | #include <linux/init.h> | ||
38 | #include <linux/poll.h> | ||
39 | #include <linux/rtc.h> | ||
40 | #include <linux/spinlock.h> | ||
41 | #include <linux/bcd.h> | ||
42 | #include <linux/proc_fs.h> | ||
43 | #include <linux/jiffies.h> | ||
44 | |||
45 | #include <asm/uaccess.h> | ||
46 | #include <asm/system.h> | ||
47 | |||
48 | #define DS1286_VERSION "1.0" | ||
49 | |||
50 | /* | ||
51 | * We sponge a minor off of the misc major. No need slurping | ||
52 | * up another valuable major dev number for this. If you add | ||
53 | * an ioctl, make sure you don't conflict with SPARC's RTC | ||
54 | * ioctls. | ||
55 | */ | ||
56 | |||
57 | static DECLARE_WAIT_QUEUE_HEAD(ds1286_wait); | ||
58 | |||
59 | static ssize_t ds1286_read(struct file *file, char *buf, | ||
60 | size_t count, loff_t *ppos); | ||
61 | |||
62 | static int ds1286_ioctl(struct inode *inode, struct file *file, | ||
63 | unsigned int cmd, unsigned long arg); | ||
64 | |||
65 | static unsigned int ds1286_poll(struct file *file, poll_table *wait); | ||
66 | |||
67 | static void ds1286_get_alm_time (struct rtc_time *alm_tm); | ||
68 | static void ds1286_get_time(struct rtc_time *rtc_tm); | ||
69 | static int ds1286_set_time(struct rtc_time *rtc_tm); | ||
70 | |||
71 | static inline unsigned char ds1286_is_updating(void); | ||
72 | |||
73 | static DEFINE_SPINLOCK(ds1286_lock); | ||
74 | |||
75 | static int ds1286_read_proc(char *page, char **start, off_t off, | ||
76 | int count, int *eof, void *data); | ||
77 | |||
78 | /* | ||
79 | * Bits in rtc_status. (7 bits of room for future expansion) | ||
80 | */ | ||
81 | |||
82 | #define RTC_IS_OPEN 0x01 /* means /dev/rtc is in use */ | ||
83 | #define RTC_TIMER_ON 0x02 /* missed irq timer active */ | ||
84 | |||
85 | static unsigned char ds1286_status; /* bitmapped status byte. */ | ||
86 | |||
87 | static unsigned char days_in_mo[] = { | ||
88 | 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 | ||
89 | }; | ||
90 | |||
91 | /* | ||
92 | * Now all the various file operations that we export. | ||
93 | */ | ||
94 | |||
95 | static ssize_t ds1286_read(struct file *file, char *buf, | ||
96 | size_t count, loff_t *ppos) | ||
97 | { | ||
98 | return -EIO; | ||
99 | } | ||
100 | |||
101 | static int ds1286_ioctl(struct inode *inode, struct file *file, | ||
102 | unsigned int cmd, unsigned long arg) | ||
103 | { | ||
104 | struct rtc_time wtime; | ||
105 | |||
106 | switch (cmd) { | ||
107 | case RTC_AIE_OFF: /* Mask alarm int. enab. bit */ | ||
108 | { | ||
109 | unsigned long flags; | ||
110 | unsigned char val; | ||
111 | |||
112 | if (!capable(CAP_SYS_TIME)) | ||
113 | return -EACCES; | ||
114 | |||
115 | spin_lock_irqsave(&ds1286_lock, flags); | ||
116 | val = rtc_read(RTC_CMD); | ||
117 | val |= RTC_TDM; | ||
118 | rtc_write(val, RTC_CMD); | ||
119 | spin_unlock_irqrestore(&ds1286_lock, flags); | ||
120 | |||
121 | return 0; | ||
122 | } | ||
123 | case RTC_AIE_ON: /* Allow alarm interrupts. */ | ||
124 | { | ||
125 | unsigned long flags; | ||
126 | unsigned char val; | ||
127 | |||
128 | if (!capable(CAP_SYS_TIME)) | ||
129 | return -EACCES; | ||
130 | |||
131 | spin_lock_irqsave(&ds1286_lock, flags); | ||
132 | val = rtc_read(RTC_CMD); | ||
133 | val &= ~RTC_TDM; | ||
134 | rtc_write(val, RTC_CMD); | ||
135 | spin_unlock_irqrestore(&ds1286_lock, flags); | ||
136 | |||
137 | return 0; | ||
138 | } | ||
139 | case RTC_WIE_OFF: /* Mask watchdog int. enab. bit */ | ||
140 | { | ||
141 | unsigned long flags; | ||
142 | unsigned char val; | ||
143 | |||
144 | if (!capable(CAP_SYS_TIME)) | ||
145 | return -EACCES; | ||
146 | |||
147 | spin_lock_irqsave(&ds1286_lock, flags); | ||
148 | val = rtc_read(RTC_CMD); | ||
149 | val |= RTC_WAM; | ||
150 | rtc_write(val, RTC_CMD); | ||
151 | spin_unlock_irqrestore(&ds1286_lock, flags); | ||
152 | |||
153 | return 0; | ||
154 | } | ||
155 | case RTC_WIE_ON: /* Allow watchdog interrupts. */ | ||
156 | { | ||
157 | unsigned long flags; | ||
158 | unsigned char val; | ||
159 | |||
160 | if (!capable(CAP_SYS_TIME)) | ||
161 | return -EACCES; | ||
162 | |||
163 | spin_lock_irqsave(&ds1286_lock, flags); | ||
164 | val = rtc_read(RTC_CMD); | ||
165 | val &= ~RTC_WAM; | ||
166 | rtc_write(val, RTC_CMD); | ||
167 | spin_unlock_irqrestore(&ds1286_lock, flags); | ||
168 | |||
169 | return 0; | ||
170 | } | ||
171 | case RTC_ALM_READ: /* Read the present alarm time */ | ||
172 | { | ||
173 | /* | ||
174 | * This returns a struct rtc_time. Reading >= 0xc0 | ||
175 | * means "don't care" or "match all". Only the tm_hour, | ||
176 | * tm_min, and tm_sec values are filled in. | ||
177 | */ | ||
178 | |||
179 | memset(&wtime, 0, sizeof(wtime)); | ||
180 | ds1286_get_alm_time(&wtime); | ||
181 | break; | ||
182 | } | ||
183 | case RTC_ALM_SET: /* Store a time into the alarm */ | ||
184 | { | ||
185 | /* | ||
186 | * This expects a struct rtc_time. Writing 0xff means | ||
187 | * "don't care" or "match all". Only the tm_hour, | ||
188 | * tm_min and tm_sec are used. | ||
189 | */ | ||
190 | unsigned char hrs, min, sec; | ||
191 | struct rtc_time alm_tm; | ||
192 | |||
193 | if (!capable(CAP_SYS_TIME)) | ||
194 | return -EACCES; | ||
195 | |||
196 | if (copy_from_user(&alm_tm, (struct rtc_time*)arg, | ||
197 | sizeof(struct rtc_time))) | ||
198 | return -EFAULT; | ||
199 | |||
200 | hrs = alm_tm.tm_hour; | ||
201 | min = alm_tm.tm_min; | ||
202 | sec = alm_tm.tm_sec; | ||
203 | |||
204 | if (hrs >= 24) | ||
205 | hrs = 0xff; | ||
206 | |||
207 | if (min >= 60) | ||
208 | min = 0xff; | ||
209 | |||
210 | if (sec != 0) | ||
211 | return -EINVAL; | ||
212 | |||
213 | min = bin2bcd(min); | ||
214 | min = bin2bcd(hrs); | ||
215 | |||
216 | spin_lock(&ds1286_lock); | ||
217 | rtc_write(hrs, RTC_HOURS_ALARM); | ||
218 | rtc_write(min, RTC_MINUTES_ALARM); | ||
219 | spin_unlock(&ds1286_lock); | ||
220 | |||
221 | return 0; | ||
222 | } | ||
223 | case RTC_RD_TIME: /* Read the time/date from RTC */ | ||
224 | { | ||
225 | memset(&wtime, 0, sizeof(wtime)); | ||
226 | ds1286_get_time(&wtime); | ||
227 | break; | ||
228 | } | ||
229 | case RTC_SET_TIME: /* Set the RTC */ | ||
230 | { | ||
231 | struct rtc_time rtc_tm; | ||
232 | |||
233 | if (!capable(CAP_SYS_TIME)) | ||
234 | return -EACCES; | ||
235 | |||
236 | if (copy_from_user(&rtc_tm, (struct rtc_time*)arg, | ||
237 | sizeof(struct rtc_time))) | ||
238 | return -EFAULT; | ||
239 | |||
240 | return ds1286_set_time(&rtc_tm); | ||
241 | } | ||
242 | default: | ||
243 | return -EINVAL; | ||
244 | } | ||
245 | return copy_to_user((void *)arg, &wtime, sizeof wtime) ? -EFAULT : 0; | ||
246 | } | ||
247 | |||
248 | /* | ||
249 | * We enforce only one user at a time here with the open/close. | ||
250 | * Also clear the previous interrupt data on an open, and clean | ||
251 | * up things on a close. | ||
252 | */ | ||
253 | |||
254 | static int ds1286_open(struct inode *inode, struct file *file) | ||
255 | { | ||
256 | lock_kernel(); | ||
257 | spin_lock_irq(&ds1286_lock); | ||
258 | |||
259 | if (ds1286_status & RTC_IS_OPEN) | ||
260 | goto out_busy; | ||
261 | |||
262 | ds1286_status |= RTC_IS_OPEN; | ||
263 | |||
264 | spin_unlock_irq(&ds1286_lock); | ||
265 | unlock_kernel(); | ||
266 | return 0; | ||
267 | |||
268 | out_busy: | ||
269 | spin_lock_irq(&ds1286_lock); | ||
270 | unlock_kernel(); | ||
271 | return -EBUSY; | ||
272 | } | ||
273 | |||
274 | static int ds1286_release(struct inode *inode, struct file *file) | ||
275 | { | ||
276 | ds1286_status &= ~RTC_IS_OPEN; | ||
277 | |||
278 | return 0; | ||
279 | } | ||
280 | |||
281 | static unsigned int ds1286_poll(struct file *file, poll_table *wait) | ||
282 | { | ||
283 | poll_wait(file, &ds1286_wait, wait); | ||
284 | |||
285 | return 0; | ||
286 | } | ||
287 | |||
288 | /* | ||
289 | * The various file operations we support. | ||
290 | */ | ||
291 | |||
292 | static const struct file_operations ds1286_fops = { | ||
293 | .llseek = no_llseek, | ||
294 | .read = ds1286_read, | ||
295 | .poll = ds1286_poll, | ||
296 | .ioctl = ds1286_ioctl, | ||
297 | .open = ds1286_open, | ||
298 | .release = ds1286_release, | ||
299 | }; | ||
300 | |||
301 | static struct miscdevice ds1286_dev= | ||
302 | { | ||
303 | .minor = RTC_MINOR, | ||
304 | .name = "rtc", | ||
305 | .fops = &ds1286_fops, | ||
306 | }; | ||
307 | |||
308 | static int __init ds1286_init(void) | ||
309 | { | ||
310 | int err; | ||
311 | |||
312 | printk(KERN_INFO "DS1286 Real Time Clock Driver v%s\n", DS1286_VERSION); | ||
313 | |||
314 | err = misc_register(&ds1286_dev); | ||
315 | if (err) | ||
316 | goto out; | ||
317 | |||
318 | if (!create_proc_read_entry("driver/rtc", 0, 0, ds1286_read_proc, NULL)) { | ||
319 | err = -ENOMEM; | ||
320 | |||
321 | goto out_deregister; | ||
322 | } | ||
323 | |||
324 | return 0; | ||
325 | |||
326 | out_deregister: | ||
327 | misc_deregister(&ds1286_dev); | ||
328 | |||
329 | out: | ||
330 | return err; | ||
331 | } | ||
332 | |||
333 | static void __exit ds1286_exit(void) | ||
334 | { | ||
335 | remove_proc_entry("driver/rtc", NULL); | ||
336 | misc_deregister(&ds1286_dev); | ||
337 | } | ||
338 | |||
339 | static char *days[] = { | ||
340 | "***", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" | ||
341 | }; | ||
342 | |||
343 | /* | ||
344 | * Info exported via "/proc/rtc". | ||
345 | */ | ||
346 | static int ds1286_proc_output(char *buf) | ||
347 | { | ||
348 | char *p, *s; | ||
349 | struct rtc_time tm; | ||
350 | unsigned char hundredth, month, cmd, amode; | ||
351 | |||
352 | p = buf; | ||
353 | |||
354 | ds1286_get_time(&tm); | ||
355 | hundredth = rtc_read(RTC_HUNDREDTH_SECOND); | ||
356 | hundredth = bcd2bin(hundredth); | ||
357 | |||
358 | p += sprintf(p, | ||
359 | "rtc_time\t: %02d:%02d:%02d.%02d\n" | ||
360 | "rtc_date\t: %04d-%02d-%02d\n", | ||
361 | tm.tm_hour, tm.tm_min, tm.tm_sec, hundredth, | ||
362 | tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday); | ||
363 | |||
364 | /* | ||
365 | * We implicitly assume 24hr mode here. Alarm values >= 0xc0 will | ||
366 | * match any value for that particular field. Values that are | ||
367 | * greater than a valid time, but less than 0xc0 shouldn't appear. | ||
368 | */ | ||
369 | ds1286_get_alm_time(&tm); | ||
370 | p += sprintf(p, "alarm\t\t: %s ", days[tm.tm_wday]); | ||
371 | if (tm.tm_hour <= 24) | ||
372 | p += sprintf(p, "%02d:", tm.tm_hour); | ||
373 | else | ||
374 | p += sprintf(p, "**:"); | ||
375 | |||
376 | if (tm.tm_min <= 59) | ||
377 | p += sprintf(p, "%02d\n", tm.tm_min); | ||
378 | else | ||
379 | p += sprintf(p, "**\n"); | ||
380 | |||
381 | month = rtc_read(RTC_MONTH); | ||
382 | p += sprintf(p, | ||
383 | "oscillator\t: %s\n" | ||
384 | "square_wave\t: %s\n", | ||
385 | (month & RTC_EOSC) ? "disabled" : "enabled", | ||
386 | (month & RTC_ESQW) ? "disabled" : "enabled"); | ||
387 | |||
388 | amode = ((rtc_read(RTC_MINUTES_ALARM) & 0x80) >> 5) | | ||
389 | ((rtc_read(RTC_HOURS_ALARM) & 0x80) >> 6) | | ||
390 | ((rtc_read(RTC_DAY_ALARM) & 0x80) >> 7); | ||
391 | if (amode == 7) s = "each minute"; | ||
392 | else if (amode == 3) s = "minutes match"; | ||
393 | else if (amode == 1) s = "hours and minutes match"; | ||
394 | else if (amode == 0) s = "days, hours and minutes match"; | ||
395 | else s = "invalid"; | ||
396 | p += sprintf(p, "alarm_mode\t: %s\n", s); | ||
397 | |||
398 | cmd = rtc_read(RTC_CMD); | ||
399 | p += sprintf(p, | ||
400 | "alarm_enable\t: %s\n" | ||
401 | "wdog_alarm\t: %s\n" | ||
402 | "alarm_mask\t: %s\n" | ||
403 | "wdog_alarm_mask\t: %s\n" | ||
404 | "interrupt_mode\t: %s\n" | ||
405 | "INTB_mode\t: %s_active\n" | ||
406 | "interrupt_pins\t: %s\n", | ||
407 | (cmd & RTC_TDF) ? "yes" : "no", | ||
408 | (cmd & RTC_WAF) ? "yes" : "no", | ||
409 | (cmd & RTC_TDM) ? "disabled" : "enabled", | ||
410 | (cmd & RTC_WAM) ? "disabled" : "enabled", | ||
411 | (cmd & RTC_PU_LVL) ? "pulse" : "level", | ||
412 | (cmd & RTC_IBH_LO) ? "low" : "high", | ||
413 | (cmd & RTC_IPSW) ? "unswapped" : "swapped"); | ||
414 | |||
415 | return p - buf; | ||
416 | } | ||
417 | |||
418 | static int ds1286_read_proc(char *page, char **start, off_t off, | ||
419 | int count, int *eof, void *data) | ||
420 | { | ||
421 | int len = ds1286_proc_output (page); | ||
422 | if (len <= off+count) *eof = 1; | ||
423 | *start = page + off; | ||
424 | len -= off; | ||
425 | if (len>count) | ||
426 | len = count; | ||
427 | if (len<0) | ||
428 | len = 0; | ||
429 | |||
430 | return len; | ||
431 | } | ||
432 | |||
433 | /* | ||
434 | * Returns true if a clock update is in progress | ||
435 | */ | ||
436 | static inline unsigned char ds1286_is_updating(void) | ||
437 | { | ||
438 | return rtc_read(RTC_CMD) & RTC_TE; | ||
439 | } | ||
440 | |||
441 | |||
442 | static void ds1286_get_time(struct rtc_time *rtc_tm) | ||
443 | { | ||
444 | unsigned char save_control; | ||
445 | unsigned long flags; | ||
446 | |||
447 | /* | ||
448 | * read RTC once any update in progress is done. The update | ||
449 | * can take just over 2ms. We wait 10 to 20ms. There is no need to | ||
450 | * to poll-wait (up to 1s - eeccch) for the falling edge of RTC_UIP. | ||
451 | * If you need to know *exactly* when a second has started, enable | ||
452 | * periodic update complete interrupts, (via ioctl) and then | ||
453 | * immediately read /dev/rtc which will block until you get the IRQ. | ||
454 | * Once the read clears, read the RTC time (again via ioctl). Easy. | ||
455 | */ | ||
456 | |||
457 | if (ds1286_is_updating() != 0) | ||
458 | msleep(20); | ||
459 | |||
460 | /* | ||
461 | * Only the values that we read from the RTC are set. We leave | ||
462 | * tm_wday, tm_yday and tm_isdst untouched. Even though the | ||
463 | * RTC has RTC_DAY_OF_WEEK, we ignore it, as it is only updated | ||
464 | * by the RTC when initially set to a non-zero value. | ||
465 | */ | ||
466 | spin_lock_irqsave(&ds1286_lock, flags); | ||
467 | save_control = rtc_read(RTC_CMD); | ||
468 | rtc_write((save_control|RTC_TE), RTC_CMD); | ||
469 | |||
470 | rtc_tm->tm_sec = rtc_read(RTC_SECONDS); | ||
471 | rtc_tm->tm_min = rtc_read(RTC_MINUTES); | ||
472 | rtc_tm->tm_hour = rtc_read(RTC_HOURS) & 0x3f; | ||
473 | rtc_tm->tm_mday = rtc_read(RTC_DATE); | ||
474 | rtc_tm->tm_mon = rtc_read(RTC_MONTH) & 0x1f; | ||
475 | rtc_tm->tm_year = rtc_read(RTC_YEAR); | ||
476 | |||
477 | rtc_write(save_control, RTC_CMD); | ||
478 | spin_unlock_irqrestore(&ds1286_lock, flags); | ||
479 | |||
480 | rtc_tm->tm_sec = bcd2bin(rtc_tm->tm_sec); | ||
481 | rtc_tm->tm_min = bcd2bin(rtc_tm->tm_min); | ||
482 | rtc_tm->tm_hour = bcd2bin(rtc_tm->tm_hour); | ||
483 | rtc_tm->tm_mday = bcd2bin(rtc_tm->tm_mday); | ||
484 | rtc_tm->tm_mon = bcd2bin(rtc_tm->tm_mon); | ||
485 | rtc_tm->tm_year = bcd2bin(rtc_tm->tm_year); | ||
486 | |||
487 | /* | ||
488 | * Account for differences between how the RTC uses the values | ||
489 | * and how they are defined in a struct rtc_time; | ||
490 | */ | ||
491 | if (rtc_tm->tm_year < 45) | ||
492 | rtc_tm->tm_year += 30; | ||
493 | if ((rtc_tm->tm_year += 40) < 70) | ||
494 | rtc_tm->tm_year += 100; | ||
495 | |||
496 | rtc_tm->tm_mon--; | ||
497 | } | ||
498 | |||
499 | static int ds1286_set_time(struct rtc_time *rtc_tm) | ||
500 | { | ||
501 | unsigned char mon, day, hrs, min, sec, leap_yr; | ||
502 | unsigned char save_control; | ||
503 | unsigned int yrs; | ||
504 | unsigned long flags; | ||
505 | |||
506 | |||
507 | yrs = rtc_tm->tm_year + 1900; | ||
508 | mon = rtc_tm->tm_mon + 1; /* tm_mon starts at zero */ | ||
509 | day = rtc_tm->tm_mday; | ||
510 | hrs = rtc_tm->tm_hour; | ||
511 | min = rtc_tm->tm_min; | ||
512 | sec = rtc_tm->tm_sec; | ||
513 | |||
514 | if (yrs < 1970) | ||
515 | return -EINVAL; | ||
516 | |||
517 | leap_yr = ((!(yrs % 4) && (yrs % 100)) || !(yrs % 400)); | ||
518 | |||
519 | if ((mon > 12) || (day == 0)) | ||
520 | return -EINVAL; | ||
521 | |||
522 | if (day > (days_in_mo[mon] + ((mon == 2) && leap_yr))) | ||
523 | return -EINVAL; | ||
524 | |||
525 | if ((hrs >= 24) || (min >= 60) || (sec >= 60)) | ||
526 | return -EINVAL; | ||
527 | |||
528 | if ((yrs -= 1940) > 255) /* They are unsigned */ | ||
529 | return -EINVAL; | ||
530 | |||
531 | if (yrs >= 100) | ||
532 | yrs -= 100; | ||
533 | |||
534 | sec = bin2bcd(sec); | ||
535 | min = bin2bcd(min); | ||
536 | hrs = bin2bcd(hrs); | ||
537 | day = bin2bcd(day); | ||
538 | mon = bin2bcd(mon); | ||
539 | yrs = bin2bcd(yrs); | ||
540 | |||
541 | spin_lock_irqsave(&ds1286_lock, flags); | ||
542 | save_control = rtc_read(RTC_CMD); | ||
543 | rtc_write((save_control|RTC_TE), RTC_CMD); | ||
544 | |||
545 | rtc_write(yrs, RTC_YEAR); | ||
546 | rtc_write(mon, RTC_MONTH); | ||
547 | rtc_write(day, RTC_DATE); | ||
548 | rtc_write(hrs, RTC_HOURS); | ||
549 | rtc_write(min, RTC_MINUTES); | ||
550 | rtc_write(sec, RTC_SECONDS); | ||
551 | rtc_write(0, RTC_HUNDREDTH_SECOND); | ||
552 | |||
553 | rtc_write(save_control, RTC_CMD); | ||
554 | spin_unlock_irqrestore(&ds1286_lock, flags); | ||
555 | |||
556 | return 0; | ||
557 | } | ||
558 | |||
559 | static void ds1286_get_alm_time(struct rtc_time *alm_tm) | ||
560 | { | ||
561 | unsigned char cmd; | ||
562 | unsigned long flags; | ||
563 | |||
564 | /* | ||
565 | * Only the values that we read from the RTC are set. That | ||
566 | * means only tm_wday, tm_hour, tm_min. | ||
567 | */ | ||
568 | spin_lock_irqsave(&ds1286_lock, flags); | ||
569 | alm_tm->tm_min = rtc_read(RTC_MINUTES_ALARM) & 0x7f; | ||
570 | alm_tm->tm_hour = rtc_read(RTC_HOURS_ALARM) & 0x1f; | ||
571 | alm_tm->tm_wday = rtc_read(RTC_DAY_ALARM) & 0x07; | ||
572 | cmd = rtc_read(RTC_CMD); | ||
573 | spin_unlock_irqrestore(&ds1286_lock, flags); | ||
574 | |||
575 | alm_tm->tm_min = bcd2bin(alm_tm->tm_min); | ||
576 | alm_tm->tm_hour = bcd2bin(alm_tm->tm_hour); | ||
577 | alm_tm->tm_sec = 0; | ||
578 | } | ||
579 | |||
580 | module_init(ds1286_init); | ||
581 | module_exit(ds1286_exit); | ||
582 | |||
583 | MODULE_AUTHOR("Ralf Baechle"); | ||
584 | MODULE_LICENSE("GPL"); | ||
585 | MODULE_ALIAS_MISCDEV(RTC_MINOR); | ||
diff --git a/drivers/char/hpet.c b/drivers/char/hpet.c index 408f5f92cb4e..53fdc7ff3870 100644 --- a/drivers/char/hpet.c +++ b/drivers/char/hpet.c | |||
@@ -427,9 +427,6 @@ static int hpet_release(struct inode *inode, struct file *file) | |||
427 | if (irq) | 427 | if (irq) |
428 | free_irq(irq, devp); | 428 | free_irq(irq, devp); |
429 | 429 | ||
430 | if (file->f_flags & FASYNC) | ||
431 | hpet_fasync(-1, file, 0); | ||
432 | |||
433 | file->private_data = NULL; | 430 | file->private_data = NULL; |
434 | return 0; | 431 | return 0; |
435 | } | 432 | } |
diff --git a/drivers/char/hw_random/amd-rng.c b/drivers/char/hw_random/amd-rng.c index c422e870dc52..cd0ba51f7c80 100644 --- a/drivers/char/hw_random/amd-rng.c +++ b/drivers/char/hw_random/amd-rng.c | |||
@@ -11,7 +11,7 @@ | |||
11 | * derived from | 11 | * derived from |
12 | * | 12 | * |
13 | * Hardware driver for the AMD 768 Random Number Generator (RNG) | 13 | * Hardware driver for the AMD 768 Random Number Generator (RNG) |
14 | * (c) Copyright 2001 Red Hat Inc <alan@redhat.com> | 14 | * (c) Copyright 2001 Red Hat Inc |
15 | * | 15 | * |
16 | * derived from | 16 | * derived from |
17 | * | 17 | * |
diff --git a/drivers/char/hw_random/geode-rng.c b/drivers/char/hw_random/geode-rng.c index fed4ef5569f5..64d513f68368 100644 --- a/drivers/char/hw_random/geode-rng.c +++ b/drivers/char/hw_random/geode-rng.c | |||
@@ -11,7 +11,7 @@ | |||
11 | * derived from | 11 | * derived from |
12 | * | 12 | * |
13 | * Hardware driver for the AMD 768 Random Number Generator (RNG) | 13 | * Hardware driver for the AMD 768 Random Number Generator (RNG) |
14 | * (c) Copyright 2001 Red Hat Inc <alan@redhat.com> | 14 | * (c) Copyright 2001 Red Hat Inc |
15 | * | 15 | * |
16 | * derived from | 16 | * derived from |
17 | * | 17 | * |
diff --git a/drivers/char/hw_random/intel-rng.c b/drivers/char/hw_random/intel-rng.c index 8a2fce0756ec..5dcbe603eca2 100644 --- a/drivers/char/hw_random/intel-rng.c +++ b/drivers/char/hw_random/intel-rng.c | |||
@@ -11,7 +11,7 @@ | |||
11 | * derived from | 11 | * derived from |
12 | * | 12 | * |
13 | * Hardware driver for the AMD 768 Random Number Generator (RNG) | 13 | * Hardware driver for the AMD 768 Random Number Generator (RNG) |
14 | * (c) Copyright 2001 Red Hat Inc <alan@redhat.com> | 14 | * (c) Copyright 2001 Red Hat Inc |
15 | * | 15 | * |
16 | * derived from | 16 | * derived from |
17 | * | 17 | * |
diff --git a/drivers/char/hw_random/via-rng.c b/drivers/char/hw_random/via-rng.c index 128202e18fc9..4e9573c1d39e 100644 --- a/drivers/char/hw_random/via-rng.c +++ b/drivers/char/hw_random/via-rng.c | |||
@@ -11,7 +11,7 @@ | |||
11 | * derived from | 11 | * derived from |
12 | * | 12 | * |
13 | * Hardware driver for the AMD 768 Random Number Generator (RNG) | 13 | * Hardware driver for the AMD 768 Random Number Generator (RNG) |
14 | * (c) Copyright 2001 Red Hat Inc <alan@redhat.com> | 14 | * (c) Copyright 2001 Red Hat Inc |
15 | * | 15 | * |
16 | * derived from | 16 | * derived from |
17 | * | 17 | * |
diff --git a/drivers/char/ip27-rtc.c b/drivers/char/ip27-rtc.c deleted file mode 100644 index 2abd881b4cbc..000000000000 --- a/drivers/char/ip27-rtc.c +++ /dev/null | |||
@@ -1,329 +0,0 @@ | |||
1 | /* | ||
2 | * Driver for the SGS-Thomson M48T35 Timekeeper RAM chip | ||
3 | * | ||
4 | * Real Time Clock interface for Linux | ||
5 | * | ||
6 | * TODO: Implement periodic interrupts. | ||
7 | * | ||
8 | * Copyright (C) 2000 Silicon Graphics, Inc. | ||
9 | * Written by Ulf Carlsson (ulfc@engr.sgi.com) | ||
10 | * | ||
11 | * Based on code written by Paul Gortmaker. | ||
12 | * | ||
13 | * This driver allows use of the real time clock (built into | ||
14 | * nearly all computers) from user space. It exports the /dev/rtc | ||
15 | * interface supporting various ioctl() and also the /proc/rtc | ||
16 | * pseudo-file for status information. | ||
17 | * | ||
18 | * This program is free software; you can redistribute it and/or | ||
19 | * modify it under the terms of the GNU General Public License | ||
20 | * as published by the Free Software Foundation; either version | ||
21 | * 2 of the License, or (at your option) any later version. | ||
22 | * | ||
23 | */ | ||
24 | |||
25 | #define RTC_VERSION "1.09b" | ||
26 | |||
27 | #include <linux/bcd.h> | ||
28 | #include <linux/module.h> | ||
29 | #include <linux/kernel.h> | ||
30 | #include <linux/smp_lock.h> | ||
31 | #include <linux/types.h> | ||
32 | #include <linux/miscdevice.h> | ||
33 | #include <linux/ioport.h> | ||
34 | #include <linux/fcntl.h> | ||
35 | #include <linux/rtc.h> | ||
36 | #include <linux/init.h> | ||
37 | #include <linux/poll.h> | ||
38 | #include <linux/proc_fs.h> | ||
39 | |||
40 | #include <asm/m48t35.h> | ||
41 | #include <asm/sn/ioc3.h> | ||
42 | #include <asm/io.h> | ||
43 | #include <asm/uaccess.h> | ||
44 | #include <asm/system.h> | ||
45 | #include <asm/sn/klconfig.h> | ||
46 | #include <asm/sn/sn0/ip27.h> | ||
47 | #include <asm/sn/sn0/hub.h> | ||
48 | #include <asm/sn/sn_private.h> | ||
49 | |||
50 | static long rtc_ioctl(struct file *filp, unsigned int cmd, | ||
51 | unsigned long arg); | ||
52 | |||
53 | static int rtc_read_proc(char *page, char **start, off_t off, | ||
54 | int count, int *eof, void *data); | ||
55 | |||
56 | static void get_rtc_time(struct rtc_time *rtc_tm); | ||
57 | |||
58 | /* | ||
59 | * Bits in rtc_status. (6 bits of room for future expansion) | ||
60 | */ | ||
61 | |||
62 | #define RTC_IS_OPEN 0x01 /* means /dev/rtc is in use */ | ||
63 | #define RTC_TIMER_ON 0x02 /* missed irq timer active */ | ||
64 | |||
65 | static unsigned char rtc_status; /* bitmapped status byte. */ | ||
66 | static unsigned long rtc_freq; /* Current periodic IRQ rate */ | ||
67 | static struct m48t35_rtc *rtc; | ||
68 | |||
69 | /* | ||
70 | * If this driver ever becomes modularised, it will be really nice | ||
71 | * to make the epoch retain its value across module reload... | ||
72 | */ | ||
73 | |||
74 | static unsigned long epoch = 1970; /* year corresponding to 0x00 */ | ||
75 | |||
76 | static const unsigned char days_in_mo[] = | ||
77 | {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; | ||
78 | |||
79 | static long rtc_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | ||
80 | { | ||
81 | |||
82 | struct rtc_time wtime; | ||
83 | |||
84 | switch (cmd) { | ||
85 | case RTC_RD_TIME: /* Read the time/date from RTC */ | ||
86 | { | ||
87 | get_rtc_time(&wtime); | ||
88 | break; | ||
89 | } | ||
90 | case RTC_SET_TIME: /* Set the RTC */ | ||
91 | { | ||
92 | struct rtc_time rtc_tm; | ||
93 | unsigned char mon, day, hrs, min, sec, leap_yr; | ||
94 | unsigned int yrs; | ||
95 | |||
96 | if (!capable(CAP_SYS_TIME)) | ||
97 | return -EACCES; | ||
98 | |||
99 | if (copy_from_user(&rtc_tm, (struct rtc_time*)arg, | ||
100 | sizeof(struct rtc_time))) | ||
101 | return -EFAULT; | ||
102 | |||
103 | yrs = rtc_tm.tm_year + 1900; | ||
104 | mon = rtc_tm.tm_mon + 1; /* tm_mon starts at zero */ | ||
105 | day = rtc_tm.tm_mday; | ||
106 | hrs = rtc_tm.tm_hour; | ||
107 | min = rtc_tm.tm_min; | ||
108 | sec = rtc_tm.tm_sec; | ||
109 | |||
110 | if (yrs < 1970) | ||
111 | return -EINVAL; | ||
112 | |||
113 | leap_yr = ((!(yrs % 4) && (yrs % 100)) || !(yrs % 400)); | ||
114 | |||
115 | if ((mon > 12) || (day == 0)) | ||
116 | return -EINVAL; | ||
117 | |||
118 | if (day > (days_in_mo[mon] + ((mon == 2) && leap_yr))) | ||
119 | return -EINVAL; | ||
120 | |||
121 | if ((hrs >= 24) || (min >= 60) || (sec >= 60)) | ||
122 | return -EINVAL; | ||
123 | |||
124 | if ((yrs -= epoch) > 255) /* They are unsigned */ | ||
125 | return -EINVAL; | ||
126 | |||
127 | if (yrs > 169) | ||
128 | return -EINVAL; | ||
129 | |||
130 | if (yrs >= 100) | ||
131 | yrs -= 100; | ||
132 | |||
133 | sec = bin2bcd(sec); | ||
134 | min = bin2bcd(min); | ||
135 | hrs = bin2bcd(hrs); | ||
136 | day = bin2bcd(day); | ||
137 | mon = bin2bcd(mon); | ||
138 | yrs = bin2bcd(yrs); | ||
139 | |||
140 | spin_lock_irq(&rtc_lock); | ||
141 | rtc->control |= M48T35_RTC_SET; | ||
142 | rtc->year = yrs; | ||
143 | rtc->month = mon; | ||
144 | rtc->date = day; | ||
145 | rtc->hour = hrs; | ||
146 | rtc->min = min; | ||
147 | rtc->sec = sec; | ||
148 | rtc->control &= ~M48T35_RTC_SET; | ||
149 | spin_unlock_irq(&rtc_lock); | ||
150 | |||
151 | return 0; | ||
152 | } | ||
153 | default: | ||
154 | return -EINVAL; | ||
155 | } | ||
156 | return copy_to_user((void *)arg, &wtime, sizeof wtime) ? -EFAULT : 0; | ||
157 | } | ||
158 | |||
159 | /* | ||
160 | * We enforce only one user at a time here with the open/close. | ||
161 | * Also clear the previous interrupt data on an open, and clean | ||
162 | * up things on a close. | ||
163 | */ | ||
164 | |||
165 | static int rtc_open(struct inode *inode, struct file *file) | ||
166 | { | ||
167 | lock_kernel(); | ||
168 | spin_lock_irq(&rtc_lock); | ||
169 | |||
170 | if (rtc_status & RTC_IS_OPEN) { | ||
171 | spin_unlock_irq(&rtc_lock); | ||
172 | unlock_kernel(); | ||
173 | return -EBUSY; | ||
174 | } | ||
175 | |||
176 | rtc_status |= RTC_IS_OPEN; | ||
177 | spin_unlock_irq(&rtc_lock); | ||
178 | unlock_kernel(); | ||
179 | |||
180 | return 0; | ||
181 | } | ||
182 | |||
183 | static int rtc_release(struct inode *inode, struct file *file) | ||
184 | { | ||
185 | /* | ||
186 | * Turn off all interrupts once the device is no longer | ||
187 | * in use, and clear the data. | ||
188 | */ | ||
189 | |||
190 | spin_lock_irq(&rtc_lock); | ||
191 | rtc_status &= ~RTC_IS_OPEN; | ||
192 | spin_unlock_irq(&rtc_lock); | ||
193 | |||
194 | return 0; | ||
195 | } | ||
196 | |||
197 | /* | ||
198 | * The various file operations we support. | ||
199 | */ | ||
200 | |||
201 | static const struct file_operations rtc_fops = { | ||
202 | .owner = THIS_MODULE, | ||
203 | .unlocked_ioctl = rtc_ioctl, | ||
204 | .open = rtc_open, | ||
205 | .release = rtc_release, | ||
206 | }; | ||
207 | |||
208 | static struct miscdevice rtc_dev= | ||
209 | { | ||
210 | RTC_MINOR, | ||
211 | "rtc", | ||
212 | &rtc_fops | ||
213 | }; | ||
214 | |||
215 | static int __init rtc_init(void) | ||
216 | { | ||
217 | rtc = (struct m48t35_rtc *) | ||
218 | (KL_CONFIG_CH_CONS_INFO(master_nasid)->memory_base + IOC3_BYTEBUS_DEV0); | ||
219 | |||
220 | printk(KERN_INFO "Real Time Clock Driver v%s\n", RTC_VERSION); | ||
221 | if (misc_register(&rtc_dev)) { | ||
222 | printk(KERN_ERR "rtc: cannot register misc device.\n"); | ||
223 | return -ENODEV; | ||
224 | } | ||
225 | if (!create_proc_read_entry("driver/rtc", 0, NULL, rtc_read_proc, NULL)) { | ||
226 | printk(KERN_ERR "rtc: cannot create /proc/rtc.\n"); | ||
227 | misc_deregister(&rtc_dev); | ||
228 | return -ENOENT; | ||
229 | } | ||
230 | |||
231 | rtc_freq = 1024; | ||
232 | |||
233 | return 0; | ||
234 | } | ||
235 | |||
236 | static void __exit rtc_exit (void) | ||
237 | { | ||
238 | /* interrupts and timer disabled at this point by rtc_release */ | ||
239 | |||
240 | remove_proc_entry ("rtc", NULL); | ||
241 | misc_deregister(&rtc_dev); | ||
242 | } | ||
243 | |||
244 | module_init(rtc_init); | ||
245 | module_exit(rtc_exit); | ||
246 | |||
247 | /* | ||
248 | * Info exported via "/proc/rtc". | ||
249 | */ | ||
250 | |||
251 | static int rtc_get_status(char *buf) | ||
252 | { | ||
253 | char *p; | ||
254 | struct rtc_time tm; | ||
255 | |||
256 | /* | ||
257 | * Just emulate the standard /proc/rtc | ||
258 | */ | ||
259 | |||
260 | p = buf; | ||
261 | |||
262 | get_rtc_time(&tm); | ||
263 | |||
264 | /* | ||
265 | * There is no way to tell if the luser has the RTC set for local | ||
266 | * time or for Universal Standard Time (GMT). Probably local though. | ||
267 | */ | ||
268 | p += sprintf(p, | ||
269 | "rtc_time\t: %02d:%02d:%02d\n" | ||
270 | "rtc_date\t: %04d-%02d-%02d\n" | ||
271 | "rtc_epoch\t: %04lu\n" | ||
272 | "24hr\t\t: yes\n", | ||
273 | tm.tm_hour, tm.tm_min, tm.tm_sec, | ||
274 | tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, epoch); | ||
275 | |||
276 | return p - buf; | ||
277 | } | ||
278 | |||
279 | static int rtc_read_proc(char *page, char **start, off_t off, | ||
280 | int count, int *eof, void *data) | ||
281 | { | ||
282 | int len = rtc_get_status(page); | ||
283 | if (len <= off+count) *eof = 1; | ||
284 | *start = page + off; | ||
285 | len -= off; | ||
286 | if (len>count) len = count; | ||
287 | if (len<0) len = 0; | ||
288 | return len; | ||
289 | } | ||
290 | |||
291 | static void get_rtc_time(struct rtc_time *rtc_tm) | ||
292 | { | ||
293 | /* | ||
294 | * Do we need to wait for the last update to finish? | ||
295 | */ | ||
296 | |||
297 | /* | ||
298 | * Only the values that we read from the RTC are set. We leave | ||
299 | * tm_wday, tm_yday and tm_isdst untouched. Even though the | ||
300 | * RTC has RTC_DAY_OF_WEEK, we ignore it, as it is only updated | ||
301 | * by the RTC when initially set to a non-zero value. | ||
302 | */ | ||
303 | spin_lock_irq(&rtc_lock); | ||
304 | rtc->control |= M48T35_RTC_READ; | ||
305 | rtc_tm->tm_sec = rtc->sec; | ||
306 | rtc_tm->tm_min = rtc->min; | ||
307 | rtc_tm->tm_hour = rtc->hour; | ||
308 | rtc_tm->tm_mday = rtc->date; | ||
309 | rtc_tm->tm_mon = rtc->month; | ||
310 | rtc_tm->tm_year = rtc->year; | ||
311 | rtc->control &= ~M48T35_RTC_READ; | ||
312 | spin_unlock_irq(&rtc_lock); | ||
313 | |||
314 | rtc_tm->tm_sec = bcd2bin(rtc_tm->tm_sec); | ||
315 | rtc_tm->tm_min = bcd2bin(rtc_tm->tm_min); | ||
316 | rtc_tm->tm_hour = bcd2bin(rtc_tm->tm_hour); | ||
317 | rtc_tm->tm_mday = bcd2bin(rtc_tm->tm_mday); | ||
318 | rtc_tm->tm_mon = bcd2bin(rtc_tm->tm_mon); | ||
319 | rtc_tm->tm_year = bcd2bin(rtc_tm->tm_year); | ||
320 | |||
321 | /* | ||
322 | * Account for differences between how the RTC uses the values | ||
323 | * and how they are defined in a struct rtc_time; | ||
324 | */ | ||
325 | if ((rtc_tm->tm_year += (epoch - 1900)) <= 69) | ||
326 | rtc_tm->tm_year += 100; | ||
327 | |||
328 | rtc_tm->tm_mon--; | ||
329 | } | ||
diff --git a/drivers/char/ipmi/ipmi_devintf.c b/drivers/char/ipmi/ipmi_devintf.c index 835a33c8d5f5..41fc11dc921c 100644 --- a/drivers/char/ipmi/ipmi_devintf.c +++ b/drivers/char/ipmi/ipmi_devintf.c | |||
@@ -162,8 +162,6 @@ static int ipmi_release(struct inode *inode, struct file *file) | |||
162 | if (rv) | 162 | if (rv) |
163 | return rv; | 163 | return rv; |
164 | 164 | ||
165 | ipmi_fasync (-1, file, 0); | ||
166 | |||
167 | /* FIXME - free the messages in the list. */ | 165 | /* FIXME - free the messages in the list. */ |
168 | kfree(priv); | 166 | kfree(priv); |
169 | 167 | ||
@@ -957,3 +955,4 @@ module_exit(cleanup_ipmi); | |||
957 | MODULE_LICENSE("GPL"); | 955 | MODULE_LICENSE("GPL"); |
958 | MODULE_AUTHOR("Corey Minyard <minyard@mvista.com>"); | 956 | MODULE_AUTHOR("Corey Minyard <minyard@mvista.com>"); |
959 | MODULE_DESCRIPTION("Linux device interface for the IPMI message handler."); | 957 | MODULE_DESCRIPTION("Linux device interface for the IPMI message handler."); |
958 | MODULE_ALIAS("platform:ipmi_si"); | ||
diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c index 8a59aaa21be5..7a88dfd4427b 100644 --- a/drivers/char/ipmi/ipmi_msghandler.c +++ b/drivers/char/ipmi/ipmi_msghandler.c | |||
@@ -422,9 +422,11 @@ struct ipmi_smi { | |||
422 | /** | 422 | /** |
423 | * The driver model view of the IPMI messaging driver. | 423 | * The driver model view of the IPMI messaging driver. |
424 | */ | 424 | */ |
425 | static struct device_driver ipmidriver = { | 425 | static struct platform_driver ipmidriver = { |
426 | .name = "ipmi", | 426 | .driver = { |
427 | .bus = &platform_bus_type | 427 | .name = "ipmi", |
428 | .bus = &platform_bus_type | ||
429 | } | ||
428 | }; | 430 | }; |
429 | static DEFINE_MUTEX(ipmidriver_mutex); | 431 | static DEFINE_MUTEX(ipmidriver_mutex); |
430 | 432 | ||
@@ -2384,9 +2386,9 @@ static int ipmi_bmc_register(ipmi_smi_t intf, int ifnum, | |||
2384 | * representing the interfaced BMC already | 2386 | * representing the interfaced BMC already |
2385 | */ | 2387 | */ |
2386 | if (bmc->guid_set) | 2388 | if (bmc->guid_set) |
2387 | old_bmc = ipmi_find_bmc_guid(&ipmidriver, bmc->guid); | 2389 | old_bmc = ipmi_find_bmc_guid(&ipmidriver.driver, bmc->guid); |
2388 | else | 2390 | else |
2389 | old_bmc = ipmi_find_bmc_prod_dev_id(&ipmidriver, | 2391 | old_bmc = ipmi_find_bmc_prod_dev_id(&ipmidriver.driver, |
2390 | bmc->id.product_id, | 2392 | bmc->id.product_id, |
2391 | bmc->id.device_id); | 2393 | bmc->id.device_id); |
2392 | 2394 | ||
@@ -2416,7 +2418,7 @@ static int ipmi_bmc_register(ipmi_smi_t intf, int ifnum, | |||
2416 | snprintf(name, sizeof(name), | 2418 | snprintf(name, sizeof(name), |
2417 | "ipmi_bmc.%4.4x", bmc->id.product_id); | 2419 | "ipmi_bmc.%4.4x", bmc->id.product_id); |
2418 | 2420 | ||
2419 | while (ipmi_find_bmc_prod_dev_id(&ipmidriver, | 2421 | while (ipmi_find_bmc_prod_dev_id(&ipmidriver.driver, |
2420 | bmc->id.product_id, | 2422 | bmc->id.product_id, |
2421 | bmc->id.device_id)) { | 2423 | bmc->id.device_id)) { |
2422 | if (!warn_printed) { | 2424 | if (!warn_printed) { |
@@ -2446,7 +2448,7 @@ static int ipmi_bmc_register(ipmi_smi_t intf, int ifnum, | |||
2446 | " Unable to allocate platform device\n"); | 2448 | " Unable to allocate platform device\n"); |
2447 | return -ENOMEM; | 2449 | return -ENOMEM; |
2448 | } | 2450 | } |
2449 | bmc->dev->dev.driver = &ipmidriver; | 2451 | bmc->dev->dev.driver = &ipmidriver.driver; |
2450 | dev_set_drvdata(&bmc->dev->dev, bmc); | 2452 | dev_set_drvdata(&bmc->dev->dev, bmc); |
2451 | kref_init(&bmc->refcount); | 2453 | kref_init(&bmc->refcount); |
2452 | 2454 | ||
@@ -4247,7 +4249,7 @@ static int ipmi_init_msghandler(void) | |||
4247 | if (initialized) | 4249 | if (initialized) |
4248 | return 0; | 4250 | return 0; |
4249 | 4251 | ||
4250 | rv = driver_register(&ipmidriver); | 4252 | rv = driver_register(&ipmidriver.driver); |
4251 | if (rv) { | 4253 | if (rv) { |
4252 | printk(KERN_ERR PFX "Could not register IPMI driver\n"); | 4254 | printk(KERN_ERR PFX "Could not register IPMI driver\n"); |
4253 | return rv; | 4255 | return rv; |
@@ -4308,7 +4310,7 @@ static __exit void cleanup_ipmi(void) | |||
4308 | remove_proc_entry(proc_ipmi_root->name, NULL); | 4310 | remove_proc_entry(proc_ipmi_root->name, NULL); |
4309 | #endif /* CONFIG_PROC_FS */ | 4311 | #endif /* CONFIG_PROC_FS */ |
4310 | 4312 | ||
4311 | driver_unregister(&ipmidriver); | 4313 | driver_unregister(&ipmidriver.driver); |
4312 | 4314 | ||
4313 | initialized = 0; | 4315 | initialized = 0; |
4314 | 4316 | ||
diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c index 3123bf57ad91..3000135f2ead 100644 --- a/drivers/char/ipmi/ipmi_si_intf.c +++ b/drivers/char/ipmi/ipmi_si_intf.c | |||
@@ -114,9 +114,11 @@ static char *si_to_str[] = { "kcs", "smic", "bt" }; | |||
114 | 114 | ||
115 | #define DEVICE_NAME "ipmi_si" | 115 | #define DEVICE_NAME "ipmi_si" |
116 | 116 | ||
117 | static struct device_driver ipmi_driver = { | 117 | static struct platform_driver ipmi_driver = { |
118 | .name = DEVICE_NAME, | 118 | .driver = { |
119 | .bus = &platform_bus_type | 119 | .name = DEVICE_NAME, |
120 | .bus = &platform_bus_type | ||
121 | } | ||
120 | }; | 122 | }; |
121 | 123 | ||
122 | 124 | ||
@@ -2868,7 +2870,7 @@ static int try_smi_init(struct smi_info *new_smi) | |||
2868 | goto out_err; | 2870 | goto out_err; |
2869 | } | 2871 | } |
2870 | new_smi->dev = &new_smi->pdev->dev; | 2872 | new_smi->dev = &new_smi->pdev->dev; |
2871 | new_smi->dev->driver = &ipmi_driver; | 2873 | new_smi->dev->driver = &ipmi_driver.driver; |
2872 | 2874 | ||
2873 | rv = platform_device_add(new_smi->pdev); | 2875 | rv = platform_device_add(new_smi->pdev); |
2874 | if (rv) { | 2876 | if (rv) { |
@@ -2983,7 +2985,7 @@ static __devinit int init_ipmi_si(void) | |||
2983 | initialized = 1; | 2985 | initialized = 1; |
2984 | 2986 | ||
2985 | /* Register the device drivers. */ | 2987 | /* Register the device drivers. */ |
2986 | rv = driver_register(&ipmi_driver); | 2988 | rv = driver_register(&ipmi_driver.driver); |
2987 | if (rv) { | 2989 | if (rv) { |
2988 | printk(KERN_ERR | 2990 | printk(KERN_ERR |
2989 | "init_ipmi_si: Unable to register driver: %d\n", | 2991 | "init_ipmi_si: Unable to register driver: %d\n", |
@@ -3052,7 +3054,7 @@ static __devinit int init_ipmi_si(void) | |||
3052 | #ifdef CONFIG_PPC_OF | 3054 | #ifdef CONFIG_PPC_OF |
3053 | of_unregister_platform_driver(&ipmi_of_platform_driver); | 3055 | of_unregister_platform_driver(&ipmi_of_platform_driver); |
3054 | #endif | 3056 | #endif |
3055 | driver_unregister(&ipmi_driver); | 3057 | driver_unregister(&ipmi_driver.driver); |
3056 | printk(KERN_WARNING | 3058 | printk(KERN_WARNING |
3057 | "ipmi_si: Unable to find any System Interface(s)\n"); | 3059 | "ipmi_si: Unable to find any System Interface(s)\n"); |
3058 | return -ENODEV; | 3060 | return -ENODEV; |
@@ -3151,7 +3153,7 @@ static __exit void cleanup_ipmi_si(void) | |||
3151 | cleanup_one_si(e); | 3153 | cleanup_one_si(e); |
3152 | mutex_unlock(&smi_infos_lock); | 3154 | mutex_unlock(&smi_infos_lock); |
3153 | 3155 | ||
3154 | driver_unregister(&ipmi_driver); | 3156 | driver_unregister(&ipmi_driver.driver); |
3155 | } | 3157 | } |
3156 | module_exit(cleanup_ipmi_si); | 3158 | module_exit(cleanup_ipmi_si); |
3157 | 3159 | ||
diff --git a/drivers/char/ipmi/ipmi_watchdog.c b/drivers/char/ipmi/ipmi_watchdog.c index 235fab0bdf79..a4d57e31f713 100644 --- a/drivers/char/ipmi/ipmi_watchdog.c +++ b/drivers/char/ipmi/ipmi_watchdog.c | |||
@@ -870,7 +870,6 @@ static int ipmi_close(struct inode *ino, struct file *filep) | |||
870 | clear_bit(0, &ipmi_wdog_open); | 870 | clear_bit(0, &ipmi_wdog_open); |
871 | } | 871 | } |
872 | 872 | ||
873 | ipmi_fasync(-1, filep, 0); | ||
874 | expect_close = 0; | 873 | expect_close = 0; |
875 | 874 | ||
876 | return 0; | 875 | return 0; |
diff --git a/drivers/char/isicom.c b/drivers/char/isicom.c index 7d30ee1d3fca..04e4549299ba 100644 --- a/drivers/char/isicom.c +++ b/drivers/char/isicom.c | |||
@@ -7,12 +7,14 @@ | |||
7 | * Original driver code supplied by Multi-Tech | 7 | * Original driver code supplied by Multi-Tech |
8 | * | 8 | * |
9 | * Changes | 9 | * Changes |
10 | * 1/9/98 alan@redhat.com Merge to 2.0.x kernel tree | 10 | * 1/9/98 alan@lxorguk.ukuu.org.uk |
11 | * Merge to 2.0.x kernel tree | ||
11 | * Obtain and use official major/minors | 12 | * Obtain and use official major/minors |
12 | * Loader switched to a misc device | 13 | * Loader switched to a misc device |
13 | * (fixed range check bug as a side effect) | 14 | * (fixed range check bug as a side effect) |
14 | * Printk clean up | 15 | * Printk clean up |
15 | * 9/12/98 alan@redhat.com Rough port to 2.1.x | 16 | * 9/12/98 alan@lxorguk.ukuu.org.uk |
17 | * Rough port to 2.1.x | ||
16 | * | 18 | * |
17 | * 10/6/99 sameer Merged the ISA and PCI drivers to | 19 | * 10/6/99 sameer Merged the ISA and PCI drivers to |
18 | * a new unified driver. | 20 | * a new unified driver. |
diff --git a/drivers/char/mxser.c b/drivers/char/mxser.c index 8beef50f95a0..047766915411 100644 --- a/drivers/char/mxser.c +++ b/drivers/char/mxser.c | |||
@@ -14,7 +14,8 @@ | |||
14 | * (at your option) any later version. | 14 | * (at your option) any later version. |
15 | * | 15 | * |
16 | * Fed through a cleanup, indent and remove of non 2.6 code by Alan Cox | 16 | * Fed through a cleanup, indent and remove of non 2.6 code by Alan Cox |
17 | * <alan@redhat.com>. The original 1.8 code is available on www.moxa.com. | 17 | * <alan@lxorguk.ukuu.org.uk>. The original 1.8 code is available on |
18 | * www.moxa.com. | ||
18 | * - Fixed x86_64 cleanness | 19 | * - Fixed x86_64 cleanness |
19 | */ | 20 | */ |
20 | 21 | ||
diff --git a/drivers/char/pcmcia/synclink_cs.c b/drivers/char/pcmcia/synclink_cs.c index 9a626e50b793..4d64a02612a4 100644 --- a/drivers/char/pcmcia/synclink_cs.c +++ b/drivers/char/pcmcia/synclink_cs.c | |||
@@ -554,7 +554,7 @@ static int mgslpc_probe(struct pcmcia_device *link) | |||
554 | /* Initialize the struct pcmcia_device structure */ | 554 | /* Initialize the struct pcmcia_device structure */ |
555 | 555 | ||
556 | /* Interrupt setup */ | 556 | /* Interrupt setup */ |
557 | link->irq.Attributes = IRQ_TYPE_EXCLUSIVE; | 557 | link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING; |
558 | link->irq.IRQInfo1 = IRQ_LEVEL_ID; | 558 | link->irq.IRQInfo1 = IRQ_LEVEL_ID; |
559 | link->irq.Handler = NULL; | 559 | link->irq.Handler = NULL; |
560 | 560 | ||
diff --git a/drivers/char/random.c b/drivers/char/random.c index 705a839f1796..675076f5fca8 100644 --- a/drivers/char/random.c +++ b/drivers/char/random.c | |||
@@ -1139,18 +1139,12 @@ static int random_fasync(int fd, struct file *filp, int on) | |||
1139 | return fasync_helper(fd, filp, on, &fasync); | 1139 | return fasync_helper(fd, filp, on, &fasync); |
1140 | } | 1140 | } |
1141 | 1141 | ||
1142 | static int random_release(struct inode *inode, struct file *filp) | ||
1143 | { | ||
1144 | return fasync_helper(-1, filp, 0, &fasync); | ||
1145 | } | ||
1146 | |||
1147 | const struct file_operations random_fops = { | 1142 | const struct file_operations random_fops = { |
1148 | .read = random_read, | 1143 | .read = random_read, |
1149 | .write = random_write, | 1144 | .write = random_write, |
1150 | .poll = random_poll, | 1145 | .poll = random_poll, |
1151 | .unlocked_ioctl = random_ioctl, | 1146 | .unlocked_ioctl = random_ioctl, |
1152 | .fasync = random_fasync, | 1147 | .fasync = random_fasync, |
1153 | .release = random_release, | ||
1154 | }; | 1148 | }; |
1155 | 1149 | ||
1156 | const struct file_operations urandom_fops = { | 1150 | const struct file_operations urandom_fops = { |
@@ -1158,7 +1152,6 @@ const struct file_operations urandom_fops = { | |||
1158 | .write = random_write, | 1152 | .write = random_write, |
1159 | .unlocked_ioctl = random_ioctl, | 1153 | .unlocked_ioctl = random_ioctl, |
1160 | .fasync = random_fasync, | 1154 | .fasync = random_fasync, |
1161 | .release = random_release, | ||
1162 | }; | 1155 | }; |
1163 | 1156 | ||
1164 | /*************************************************************** | 1157 | /*************************************************************** |
diff --git a/drivers/char/rtc.c b/drivers/char/rtc.c index 32dc89720d58..20d6efb6324e 100644 --- a/drivers/char/rtc.c +++ b/drivers/char/rtc.c | |||
@@ -788,8 +788,6 @@ static int rtc_release(struct inode *inode, struct file *file) | |||
788 | } | 788 | } |
789 | spin_unlock_irq(&rtc_lock); | 789 | spin_unlock_irq(&rtc_lock); |
790 | 790 | ||
791 | if (file->f_flags & FASYNC) | ||
792 | rtc_fasync(-1, file, 0); | ||
793 | no_irq: | 791 | no_irq: |
794 | #endif | 792 | #endif |
795 | 793 | ||
diff --git a/drivers/char/sonypi.c b/drivers/char/sonypi.c index 85e0eb76eeab..f4374437a033 100644 --- a/drivers/char/sonypi.c +++ b/drivers/char/sonypi.c | |||
@@ -523,7 +523,7 @@ static int acpi_driver_registered; | |||
523 | 523 | ||
524 | static int sonypi_ec_write(u8 addr, u8 value) | 524 | static int sonypi_ec_write(u8 addr, u8 value) |
525 | { | 525 | { |
526 | #ifdef CONFIG_ACPI_EC | 526 | #ifdef CONFIG_ACPI |
527 | if (SONYPI_ACPI_ACTIVE) | 527 | if (SONYPI_ACPI_ACTIVE) |
528 | return ec_write(addr, value); | 528 | return ec_write(addr, value); |
529 | #endif | 529 | #endif |
@@ -539,7 +539,7 @@ static int sonypi_ec_write(u8 addr, u8 value) | |||
539 | 539 | ||
540 | static int sonypi_ec_read(u8 addr, u8 *value) | 540 | static int sonypi_ec_read(u8 addr, u8 *value) |
541 | { | 541 | { |
542 | #ifdef CONFIG_ACPI_EC | 542 | #ifdef CONFIG_ACPI |
543 | if (SONYPI_ACPI_ACTIVE) | 543 | if (SONYPI_ACPI_ACTIVE) |
544 | return ec_read(addr, value); | 544 | return ec_read(addr, value); |
545 | #endif | 545 | #endif |
@@ -898,7 +898,6 @@ static int sonypi_misc_fasync(int fd, struct file *filp, int on) | |||
898 | 898 | ||
899 | static int sonypi_misc_release(struct inode *inode, struct file *file) | 899 | static int sonypi_misc_release(struct inode *inode, struct file *file) |
900 | { | 900 | { |
901 | sonypi_misc_fasync(-1, file, 0); | ||
902 | mutex_lock(&sonypi_device.lock); | 901 | mutex_lock(&sonypi_device.lock); |
903 | sonypi_device.open_count--; | 902 | sonypi_device.open_count--; |
904 | mutex_unlock(&sonypi_device.lock); | 903 | mutex_unlock(&sonypi_device.lock); |
diff --git a/drivers/char/specialix.c b/drivers/char/specialix.c index 242fd46fda22..a16b94f12eb2 100644 --- a/drivers/char/specialix.c +++ b/drivers/char/specialix.c | |||
@@ -72,7 +72,7 @@ | |||
72 | /* | 72 | /* |
73 | * There is a bunch of documentation about the card, jumpers, config | 73 | * There is a bunch of documentation about the card, jumpers, config |
74 | * settings, restrictions, cables, device names and numbers in | 74 | * settings, restrictions, cables, device names and numbers in |
75 | * Documentation/specialix.txt | 75 | * Documentation/serial/specialix.txt |
76 | */ | 76 | */ |
77 | 77 | ||
78 | #include <linux/module.h> | 78 | #include <linux/module.h> |
diff --git a/drivers/char/vt.c b/drivers/char/vt.c index d8f83e26e4a4..a5af6072e2b3 100644 --- a/drivers/char/vt.c +++ b/drivers/char/vt.c | |||
@@ -1644,7 +1644,10 @@ static void reset_terminal(struct vc_data *vc, int do_clear) | |||
1644 | vc->vc_tab_stop[1] = | 1644 | vc->vc_tab_stop[1] = |
1645 | vc->vc_tab_stop[2] = | 1645 | vc->vc_tab_stop[2] = |
1646 | vc->vc_tab_stop[3] = | 1646 | vc->vc_tab_stop[3] = |
1647 | vc->vc_tab_stop[4] = 0x01010101; | 1647 | vc->vc_tab_stop[4] = |
1648 | vc->vc_tab_stop[5] = | ||
1649 | vc->vc_tab_stop[6] = | ||
1650 | vc->vc_tab_stop[7] = 0x01010101; | ||
1648 | 1651 | ||
1649 | vc->vc_bell_pitch = DEFAULT_BELL_PITCH; | 1652 | vc->vc_bell_pitch = DEFAULT_BELL_PITCH; |
1650 | vc->vc_bell_duration = DEFAULT_BELL_DURATION; | 1653 | vc->vc_bell_duration = DEFAULT_BELL_DURATION; |
@@ -1935,7 +1938,10 @@ static void do_con_trol(struct tty_struct *tty, struct vc_data *vc, int c) | |||
1935 | vc->vc_tab_stop[1] = | 1938 | vc->vc_tab_stop[1] = |
1936 | vc->vc_tab_stop[2] = | 1939 | vc->vc_tab_stop[2] = |
1937 | vc->vc_tab_stop[3] = | 1940 | vc->vc_tab_stop[3] = |
1938 | vc->vc_tab_stop[4] = 0; | 1941 | vc->vc_tab_stop[4] = |
1942 | vc->vc_tab_stop[5] = | ||
1943 | vc->vc_tab_stop[6] = | ||
1944 | vc->vc_tab_stop[7] = 0; | ||
1939 | } | 1945 | } |
1940 | return; | 1946 | return; |
1941 | case 'm': | 1947 | case 'm': |