diff options
Diffstat (limited to 'drivers/char')
-rw-r--r-- | drivers/char/hvsi.c | 2 | ||||
-rw-r--r-- | drivers/char/ip2/ip2main.c | 7 | ||||
-rw-r--r-- | drivers/char/mem.c | 4 | ||||
-rw-r--r-- | drivers/char/pc8736x_gpio.c | 46 | ||||
-rw-r--r-- | drivers/char/rtc.c | 41 | ||||
-rw-r--r-- | drivers/char/snsc_event.c | 15 | ||||
-rw-r--r-- | drivers/char/specialix.c | 6 |
7 files changed, 82 insertions, 39 deletions
diff --git a/drivers/char/hvsi.c b/drivers/char/hvsi.c index 56612a2dca6b..41db8060e8f7 100644 --- a/drivers/char/hvsi.c +++ b/drivers/char/hvsi.c | |||
@@ -1299,7 +1299,7 @@ static int __init hvsi_console_init(void) | |||
1299 | hp->inbuf_end = hp->inbuf; | 1299 | hp->inbuf_end = hp->inbuf; |
1300 | hp->state = HVSI_CLOSED; | 1300 | hp->state = HVSI_CLOSED; |
1301 | hp->vtermno = *vtermno; | 1301 | hp->vtermno = *vtermno; |
1302 | hp->virq = irq_create_mapping(NULL, irq[0], 0); | 1302 | hp->virq = irq_create_mapping(NULL, irq[0]); |
1303 | if (hp->virq == NO_IRQ) { | 1303 | if (hp->virq == NO_IRQ) { |
1304 | printk(KERN_ERR "%s: couldn't create irq mapping for 0x%x\n", | 1304 | printk(KERN_ERR "%s: couldn't create irq mapping for 0x%x\n", |
1305 | __FUNCTION__, irq[0]); | 1305 | __FUNCTION__, irq[0]); |
diff --git a/drivers/char/ip2/ip2main.c b/drivers/char/ip2/ip2main.c index 518ece7ac656..7907ae88c2f4 100644 --- a/drivers/char/ip2/ip2main.c +++ b/drivers/char/ip2/ip2main.c | |||
@@ -3186,3 +3186,10 @@ ip2trace (unsigned short pn, unsigned char cat, unsigned char label, unsigned lo | |||
3186 | 3186 | ||
3187 | 3187 | ||
3188 | MODULE_LICENSE("GPL"); | 3188 | MODULE_LICENSE("GPL"); |
3189 | |||
3190 | static struct pci_device_id ip2main_pci_tbl[] __devinitdata = { | ||
3191 | { PCI_DEVICE(PCI_VENDOR_ID_COMPUTONE, PCI_DEVICE_ID_COMPUTONE_IP2EX) }, | ||
3192 | { } | ||
3193 | }; | ||
3194 | |||
3195 | MODULE_DEVICE_TABLE(pci, ip2main_pci_tbl); | ||
diff --git a/drivers/char/mem.c b/drivers/char/mem.c index e97c32ceb796..917b20402664 100644 --- a/drivers/char/mem.c +++ b/drivers/char/mem.c | |||
@@ -95,7 +95,7 @@ static inline int valid_phys_addr_range(unsigned long addr, size_t count) | |||
95 | return 1; | 95 | return 1; |
96 | } | 96 | } |
97 | 97 | ||
98 | static inline int valid_mmap_phys_addr_range(unsigned long addr, size_t size) | 98 | static inline int valid_mmap_phys_addr_range(unsigned long pfn, size_t size) |
99 | { | 99 | { |
100 | return 1; | 100 | return 1; |
101 | } | 101 | } |
@@ -242,7 +242,7 @@ static int mmap_mem(struct file * file, struct vm_area_struct * vma) | |||
242 | { | 242 | { |
243 | size_t size = vma->vm_end - vma->vm_start; | 243 | size_t size = vma->vm_end - vma->vm_start; |
244 | 244 | ||
245 | if (!valid_mmap_phys_addr_range(vma->vm_pgoff << PAGE_SHIFT, size)) | 245 | if (!valid_mmap_phys_addr_range(vma->vm_pgoff, size)) |
246 | return -EINVAL; | 246 | return -EINVAL; |
247 | 247 | ||
248 | vma->vm_page_prot = phys_mem_access_prot(file, vma->vm_pgoff, | 248 | vma->vm_page_prot = phys_mem_access_prot(file, vma->vm_pgoff, |
diff --git a/drivers/char/pc8736x_gpio.c b/drivers/char/pc8736x_gpio.c index 4005ee0aa11e..11bd78c80628 100644 --- a/drivers/char/pc8736x_gpio.c +++ b/drivers/char/pc8736x_gpio.c | |||
@@ -3,18 +3,18 @@ | |||
3 | National Semiconductor PC8736x GPIO driver. Allows a user space | 3 | National Semiconductor PC8736x GPIO driver. Allows a user space |
4 | process to play with the GPIO pins. | 4 | process to play with the GPIO pins. |
5 | 5 | ||
6 | Copyright (c) 2005 Jim Cromie <jim.cromie@gmail.com> | 6 | Copyright (c) 2005,2006 Jim Cromie <jim.cromie@gmail.com> |
7 | 7 | ||
8 | adapted from linux/drivers/char/scx200_gpio.c | 8 | adapted from linux/drivers/char/scx200_gpio.c |
9 | Copyright (c) 2001,2002 Christer Weinigel <wingel@nano-system.com>, | 9 | Copyright (c) 2001,2002 Christer Weinigel <wingel@nano-system.com>, |
10 | */ | 10 | */ |
11 | 11 | ||
12 | #include <linux/config.h> | ||
13 | #include <linux/fs.h> | 12 | #include <linux/fs.h> |
14 | #include <linux/module.h> | 13 | #include <linux/module.h> |
15 | #include <linux/errno.h> | 14 | #include <linux/errno.h> |
16 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
17 | #include <linux/init.h> | 16 | #include <linux/init.h> |
17 | #include <linux/cdev.h> | ||
18 | #include <linux/io.h> | 18 | #include <linux/io.h> |
19 | #include <linux/ioport.h> | 19 | #include <linux/ioport.h> |
20 | #include <linux/mutex.h> | 20 | #include <linux/mutex.h> |
@@ -25,7 +25,7 @@ | |||
25 | #define DEVNAME "pc8736x_gpio" | 25 | #define DEVNAME "pc8736x_gpio" |
26 | 26 | ||
27 | MODULE_AUTHOR("Jim Cromie <jim.cromie@gmail.com>"); | 27 | MODULE_AUTHOR("Jim Cromie <jim.cromie@gmail.com>"); |
28 | MODULE_DESCRIPTION("NatSemi PC-8736x GPIO Pin Driver"); | 28 | MODULE_DESCRIPTION("NatSemi/Winbond PC-8736x GPIO Pin Driver"); |
29 | MODULE_LICENSE("GPL"); | 29 | MODULE_LICENSE("GPL"); |
30 | 30 | ||
31 | static int major; /* default to dynamic major */ | 31 | static int major; /* default to dynamic major */ |
@@ -38,14 +38,14 @@ static u8 pc8736x_gpio_shadow[4]; | |||
38 | 38 | ||
39 | #define SIO_BASE1 0x2E /* 1st command-reg to check */ | 39 | #define SIO_BASE1 0x2E /* 1st command-reg to check */ |
40 | #define SIO_BASE2 0x4E /* alt command-reg to check */ | 40 | #define SIO_BASE2 0x4E /* alt command-reg to check */ |
41 | #define SIO_BASE_OFFSET 0x20 | ||
42 | 41 | ||
43 | #define SIO_SID 0x20 /* SuperI/O ID Register */ | 42 | #define SIO_SID 0x20 /* SuperI/O ID Register */ |
44 | #define SIO_SID_VALUE 0xe9 /* Expected value in SuperI/O ID Register */ | 43 | #define SIO_SID_VALUE 0xe9 /* Expected value in SuperI/O ID Register */ |
45 | 44 | ||
46 | #define SIO_CF1 0x21 /* chip config, bit0 is chip enable */ | 45 | #define SIO_CF1 0x21 /* chip config, bit0 is chip enable */ |
47 | 46 | ||
48 | #define PC8736X_GPIO_SIZE 16 | 47 | #define PC8736X_GPIO_RANGE 16 /* ioaddr range */ |
48 | #define PC8736X_GPIO_CT 32 /* minors matching 4 8 bit ports */ | ||
49 | 49 | ||
50 | #define SIO_UNIT_SEL 0x7 /* unit select reg */ | 50 | #define SIO_UNIT_SEL 0x7 /* unit select reg */ |
51 | #define SIO_UNIT_ACT 0x30 /* unit enable */ | 51 | #define SIO_UNIT_ACT 0x30 /* unit enable */ |
@@ -231,7 +231,7 @@ static int pc8736x_gpio_open(struct inode *inode, struct file *file) | |||
231 | 231 | ||
232 | dev_dbg(&pdev->dev, "open %d\n", m); | 232 | dev_dbg(&pdev->dev, "open %d\n", m); |
233 | 233 | ||
234 | if (m > 63) | 234 | if (m >= PC8736X_GPIO_CT) |
235 | return -EINVAL; | 235 | return -EINVAL; |
236 | return nonseekable_open(inode, file); | 236 | return nonseekable_open(inode, file); |
237 | } | 237 | } |
@@ -255,9 +255,12 @@ static void __init pc8736x_init_shadow(void) | |||
255 | 255 | ||
256 | } | 256 | } |
257 | 257 | ||
258 | static struct cdev pc8736x_gpio_cdev; | ||
259 | |||
258 | static int __init pc8736x_gpio_init(void) | 260 | static int __init pc8736x_gpio_init(void) |
259 | { | 261 | { |
260 | int rc = 0; | 262 | int rc; |
263 | dev_t devid; | ||
261 | 264 | ||
262 | pdev = platform_device_alloc(DEVNAME, 0); | 265 | pdev = platform_device_alloc(DEVNAME, 0); |
263 | if (!pdev) | 266 | if (!pdev) |
@@ -297,7 +300,7 @@ static int __init pc8736x_gpio_init(void) | |||
297 | pc8736x_gpio_base = (superio_inb(SIO_BASE_HADDR) << 8 | 300 | pc8736x_gpio_base = (superio_inb(SIO_BASE_HADDR) << 8 |
298 | | superio_inb(SIO_BASE_LADDR)); | 301 | | superio_inb(SIO_BASE_LADDR)); |
299 | 302 | ||
300 | if (!request_region(pc8736x_gpio_base, 16, DEVNAME)) { | 303 | if (!request_region(pc8736x_gpio_base, PC8736X_GPIO_RANGE, DEVNAME)) { |
301 | rc = -ENODEV; | 304 | rc = -ENODEV; |
302 | dev_err(&pdev->dev, "GPIO ioport %x busy\n", | 305 | dev_err(&pdev->dev, "GPIO ioport %x busy\n", |
303 | pc8736x_gpio_base); | 306 | pc8736x_gpio_base); |
@@ -305,10 +308,17 @@ static int __init pc8736x_gpio_init(void) | |||
305 | } | 308 | } |
306 | dev_info(&pdev->dev, "GPIO ioport %x reserved\n", pc8736x_gpio_base); | 309 | dev_info(&pdev->dev, "GPIO ioport %x reserved\n", pc8736x_gpio_base); |
307 | 310 | ||
308 | rc = register_chrdev(major, DEVNAME, &pc8736x_gpio_fops); | 311 | if (major) { |
312 | devid = MKDEV(major, 0); | ||
313 | rc = register_chrdev_region(devid, PC8736X_GPIO_CT, DEVNAME); | ||
314 | } else { | ||
315 | rc = alloc_chrdev_region(&devid, 0, PC8736X_GPIO_CT, DEVNAME); | ||
316 | major = MAJOR(devid); | ||
317 | } | ||
318 | |||
309 | if (rc < 0) { | 319 | if (rc < 0) { |
310 | dev_err(&pdev->dev, "register-chrdev failed: %d\n", rc); | 320 | dev_err(&pdev->dev, "register-chrdev failed: %d\n", rc); |
311 | goto undo_platform_dev_add; | 321 | goto undo_request_region; |
312 | } | 322 | } |
313 | if (!major) { | 323 | if (!major) { |
314 | major = rc; | 324 | major = rc; |
@@ -316,8 +326,15 @@ static int __init pc8736x_gpio_init(void) | |||
316 | } | 326 | } |
317 | 327 | ||
318 | pc8736x_init_shadow(); | 328 | pc8736x_init_shadow(); |
329 | |||
330 | /* ignore minor errs, and succeed */ | ||
331 | cdev_init(&pc8736x_gpio_cdev, &pc8736x_gpio_fops); | ||
332 | cdev_add(&pc8736x_gpio_cdev, devid, PC8736X_GPIO_CT); | ||
333 | |||
319 | return 0; | 334 | return 0; |
320 | 335 | ||
336 | undo_request_region: | ||
337 | release_region(pc8736x_gpio_base, PC8736X_GPIO_RANGE); | ||
321 | undo_platform_dev_add: | 338 | undo_platform_dev_add: |
322 | platform_device_del(pdev); | 339 | platform_device_del(pdev); |
323 | undo_platform_dev_alloc: | 340 | undo_platform_dev_alloc: |
@@ -328,11 +345,14 @@ undo_platform_dev_alloc: | |||
328 | 345 | ||
329 | static void __exit pc8736x_gpio_cleanup(void) | 346 | static void __exit pc8736x_gpio_cleanup(void) |
330 | { | 347 | { |
331 | dev_dbg(&pdev->dev, " cleanup\n"); | 348 | dev_dbg(&pdev->dev, "cleanup\n"); |
332 | 349 | ||
333 | release_region(pc8736x_gpio_base, 16); | 350 | cdev_del(&pc8736x_gpio_cdev); |
351 | unregister_chrdev_region(MKDEV(major,0), PC8736X_GPIO_CT); | ||
352 | release_region(pc8736x_gpio_base, PC8736X_GPIO_RANGE); | ||
334 | 353 | ||
335 | unregister_chrdev(major, DEVNAME); | 354 | platform_device_del(pdev); |
355 | platform_device_put(pdev); | ||
336 | } | 356 | } |
337 | 357 | ||
338 | EXPORT_SYMBOL(pc8736x_access); | 358 | EXPORT_SYMBOL(pc8736x_access); |
diff --git a/drivers/char/rtc.c b/drivers/char/rtc.c index cc7bd1a3095b..6ccc364c08df 100644 --- a/drivers/char/rtc.c +++ b/drivers/char/rtc.c | |||
@@ -46,13 +46,12 @@ | |||
46 | * 1.11a Daniele Bellucci: Audit create_proc_read_entry in rtc_init | 46 | * 1.11a Daniele Bellucci: Audit create_proc_read_entry in rtc_init |
47 | * 1.12 Venkatesh Pallipadi: Hooks for emulating rtc on HPET base-timer | 47 | * 1.12 Venkatesh Pallipadi: Hooks for emulating rtc on HPET base-timer |
48 | * CONFIG_HPET_EMULATE_RTC | 48 | * CONFIG_HPET_EMULATE_RTC |
49 | * 1.12a Maciej W. Rozycki: Handle memory-mapped chips properly. | ||
49 | * 1.12ac Alan Cox: Allow read access to the day of week register | 50 | * 1.12ac Alan Cox: Allow read access to the day of week register |
50 | */ | 51 | */ |
51 | 52 | ||
52 | #define RTC_VERSION "1.12ac" | 53 | #define RTC_VERSION "1.12ac" |
53 | 54 | ||
54 | #define RTC_IO_EXTENT 0x8 | ||
55 | |||
56 | /* | 55 | /* |
57 | * Note that *all* calls to CMOS_READ and CMOS_WRITE are done with | 56 | * Note that *all* calls to CMOS_READ and CMOS_WRITE are done with |
58 | * interrupts disabled. Due to the index-port/data-port (0x70/0x71) | 57 | * interrupts disabled. Due to the index-port/data-port (0x70/0x71) |
@@ -337,7 +336,15 @@ static ssize_t rtc_read(struct file *file, char __user *buf, | |||
337 | if (rtc_has_irq == 0) | 336 | if (rtc_has_irq == 0) |
338 | return -EIO; | 337 | return -EIO; |
339 | 338 | ||
340 | if (count < sizeof(unsigned)) | 339 | /* |
340 | * Historically this function used to assume that sizeof(unsigned long) | ||
341 | * is the same in userspace and kernelspace. This lead to problems | ||
342 | * for configurations with multiple ABIs such a the MIPS o32 and 64 | ||
343 | * ABIs supported on the same kernel. So now we support read of both | ||
344 | * 4 and 8 bytes and assume that's the sizeof(unsigned long) in the | ||
345 | * userspace ABI. | ||
346 | */ | ||
347 | if (count != sizeof(unsigned int) && count != sizeof(unsigned long)) | ||
341 | return -EINVAL; | 348 | return -EINVAL; |
342 | 349 | ||
343 | add_wait_queue(&rtc_wait, &wait); | 350 | add_wait_queue(&rtc_wait, &wait); |
@@ -368,10 +375,12 @@ static ssize_t rtc_read(struct file *file, char __user *buf, | |||
368 | schedule(); | 375 | schedule(); |
369 | } while (1); | 376 | } while (1); |
370 | 377 | ||
371 | if (count < sizeof(unsigned long)) | 378 | if (count == sizeof(unsigned int)) |
372 | retval = put_user(data, (unsigned int __user *)buf) ?: sizeof(int); | 379 | retval = put_user(data, (unsigned int __user *)buf) ?: sizeof(int); |
373 | else | 380 | else |
374 | retval = put_user(data, (unsigned long __user *)buf) ?: sizeof(long); | 381 | retval = put_user(data, (unsigned long __user *)buf) ?: sizeof(long); |
382 | if (!retval) | ||
383 | retval = count; | ||
375 | out: | 384 | out: |
376 | current->state = TASK_RUNNING; | 385 | current->state = TASK_RUNNING; |
377 | remove_wait_queue(&rtc_wait, &wait); | 386 | remove_wait_queue(&rtc_wait, &wait); |
@@ -923,6 +932,9 @@ static int __init rtc_init(void) | |||
923 | struct sparc_isa_device *isa_dev; | 932 | struct sparc_isa_device *isa_dev; |
924 | #endif | 933 | #endif |
925 | #endif | 934 | #endif |
935 | #ifndef __sparc__ | ||
936 | void *r; | ||
937 | #endif | ||
926 | 938 | ||
927 | #ifdef __sparc__ | 939 | #ifdef __sparc__ |
928 | for_each_ebus(ebus) { | 940 | for_each_ebus(ebus) { |
@@ -964,8 +976,13 @@ found: | |||
964 | } | 976 | } |
965 | no_irq: | 977 | no_irq: |
966 | #else | 978 | #else |
967 | if (!request_region(RTC_PORT(0), RTC_IO_EXTENT, "rtc")) { | 979 | if (RTC_IOMAPPED) |
968 | printk(KERN_ERR "rtc: I/O port %d is not free.\n", RTC_PORT (0)); | 980 | r = request_region(RTC_PORT(0), RTC_IO_EXTENT, "rtc"); |
981 | else | ||
982 | r = request_mem_region(RTC_PORT(0), RTC_IO_EXTENT, "rtc"); | ||
983 | if (!r) { | ||
984 | printk(KERN_ERR "rtc: I/O resource %lx is not free.\n", | ||
985 | (long)(RTC_PORT(0))); | ||
969 | return -EIO; | 986 | return -EIO; |
970 | } | 987 | } |
971 | 988 | ||
@@ -979,7 +996,10 @@ no_irq: | |||
979 | if(request_irq(RTC_IRQ, rtc_int_handler_ptr, IRQF_DISABLED, "rtc", NULL)) { | 996 | if(request_irq(RTC_IRQ, rtc_int_handler_ptr, IRQF_DISABLED, "rtc", NULL)) { |
980 | /* Yeah right, seeing as irq 8 doesn't even hit the bus. */ | 997 | /* Yeah right, seeing as irq 8 doesn't even hit the bus. */ |
981 | printk(KERN_ERR "rtc: IRQ %d is not free.\n", RTC_IRQ); | 998 | printk(KERN_ERR "rtc: IRQ %d is not free.\n", RTC_IRQ); |
982 | release_region(RTC_PORT(0), RTC_IO_EXTENT); | 999 | if (RTC_IOMAPPED) |
1000 | release_region(RTC_PORT(0), RTC_IO_EXTENT); | ||
1001 | else | ||
1002 | release_mem_region(RTC_PORT(0), RTC_IO_EXTENT); | ||
983 | return -EIO; | 1003 | return -EIO; |
984 | } | 1004 | } |
985 | hpet_rtc_timer_init(); | 1005 | hpet_rtc_timer_init(); |
@@ -1079,7 +1099,10 @@ static void __exit rtc_exit (void) | |||
1079 | if (rtc_has_irq) | 1099 | if (rtc_has_irq) |
1080 | free_irq (rtc_irq, &rtc_port); | 1100 | free_irq (rtc_irq, &rtc_port); |
1081 | #else | 1101 | #else |
1082 | release_region (RTC_PORT (0), RTC_IO_EXTENT); | 1102 | if (RTC_IOMAPPED) |
1103 | release_region(RTC_PORT(0), RTC_IO_EXTENT); | ||
1104 | else | ||
1105 | release_mem_region(RTC_PORT(0), RTC_IO_EXTENT); | ||
1083 | #ifdef RTC_IRQ | 1106 | #ifdef RTC_IRQ |
1084 | if (rtc_has_irq) | 1107 | if (rtc_has_irq) |
1085 | free_irq (RTC_IRQ, NULL); | 1108 | free_irq (RTC_IRQ, NULL); |
diff --git a/drivers/char/snsc_event.c b/drivers/char/snsc_event.c index 8b2210b633df..d12d4f629cec 100644 --- a/drivers/char/snsc_event.c +++ b/drivers/char/snsc_event.c | |||
@@ -220,20 +220,7 @@ scdrv_dispatch_event(char *event, int len) | |||
220 | " Sending SIGPWR to init...\n"); | 220 | " Sending SIGPWR to init...\n"); |
221 | 221 | ||
222 | /* give a SIGPWR signal to init proc */ | 222 | /* give a SIGPWR signal to init proc */ |
223 | 223 | kill_proc(1, SIGPWR, 0); | |
224 | /* first find init's task */ | ||
225 | read_lock(&tasklist_lock); | ||
226 | for_each_process(p) { | ||
227 | if (p->pid == 1) | ||
228 | break; | ||
229 | } | ||
230 | if (p) { | ||
231 | force_sig(SIGPWR, p); | ||
232 | } else { | ||
233 | printk(KERN_ERR "Failed to signal init!\n"); | ||
234 | snsc_shutting_down = 0; /* so can try again (?) */ | ||
235 | } | ||
236 | read_unlock(&tasklist_lock); | ||
237 | } else { | 224 | } else { |
238 | /* print to system log */ | 225 | /* print to system log */ |
239 | printk("%s|$(0x%x)%s\n", severity, esp_code, desc); | 226 | printk("%s|$(0x%x)%s\n", severity, esp_code, desc); |
diff --git a/drivers/char/specialix.c b/drivers/char/specialix.c index cb2859249d49..a1d303f9a33d 100644 --- a/drivers/char/specialix.c +++ b/drivers/char/specialix.c | |||
@@ -2584,6 +2584,12 @@ static void __exit specialix_exit_module(void) | |||
2584 | func_exit(); | 2584 | func_exit(); |
2585 | } | 2585 | } |
2586 | 2586 | ||
2587 | static struct pci_device_id specialx_pci_tbl[] __devinitdata = { | ||
2588 | { PCI_DEVICE(PCI_VENDOR_ID_SPECIALIX, PCI_DEVICE_ID_SPECIALIX_IO8) }, | ||
2589 | { } | ||
2590 | }; | ||
2591 | MODULE_DEVICE_TABLE(pci, specialx_pci_tbl); | ||
2592 | |||
2587 | module_init(specialix_init_module); | 2593 | module_init(specialix_init_module); |
2588 | module_exit(specialix_exit_module); | 2594 | module_exit(specialix_exit_module); |
2589 | 2595 | ||