diff options
56 files changed, 912 insertions, 553 deletions
diff --git a/arch/m68k/amiga/amiints.c b/arch/m68k/amiga/amiints.c index 907a5533c845..c5b5212cc3f9 100644 --- a/arch/m68k/amiga/amiints.c +++ b/arch/m68k/amiga/amiints.c | |||
@@ -72,10 +72,14 @@ static struct irq_controller amiga_irq_controller = { | |||
72 | 72 | ||
73 | void __init amiga_init_IRQ(void) | 73 | void __init amiga_init_IRQ(void) |
74 | { | 74 | { |
75 | request_irq(IRQ_AUTO_1, ami_int1, 0, "int1", NULL); | 75 | if (request_irq(IRQ_AUTO_1, ami_int1, 0, "int1", NULL)) |
76 | request_irq(IRQ_AUTO_3, ami_int3, 0, "int3", NULL); | 76 | pr_err("Couldn't register int%d\n", 1); |
77 | request_irq(IRQ_AUTO_4, ami_int4, 0, "int4", NULL); | 77 | if (request_irq(IRQ_AUTO_3, ami_int3, 0, "int3", NULL)) |
78 | request_irq(IRQ_AUTO_5, ami_int5, 0, "int5", NULL); | 78 | pr_err("Couldn't register int%d\n", 3); |
79 | if (request_irq(IRQ_AUTO_4, ami_int4, 0, "int4", NULL)) | ||
80 | pr_err("Couldn't register int%d\n", 4); | ||
81 | if (request_irq(IRQ_AUTO_5, ami_int5, 0, "int5", NULL)) | ||
82 | pr_err("Couldn't register int%d\n", 5); | ||
79 | 83 | ||
80 | m68k_setup_irq_controller(&amiga_irq_controller, IRQ_USER, AMI_STD_IRQS); | 84 | m68k_setup_irq_controller(&amiga_irq_controller, IRQ_USER, AMI_STD_IRQS); |
81 | 85 | ||
diff --git a/arch/m68k/amiga/cia.c b/arch/m68k/amiga/cia.c index 343fab49bd9a..ecd0f7ca6f0e 100644 --- a/arch/m68k/amiga/cia.c +++ b/arch/m68k/amiga/cia.c | |||
@@ -176,5 +176,7 @@ void __init cia_init_IRQ(struct ciabase *base) | |||
176 | /* override auto int and install CIA handler */ | 176 | /* override auto int and install CIA handler */ |
177 | m68k_setup_irq_controller(&auto_irq_controller, base->handler_irq, 1); | 177 | m68k_setup_irq_controller(&auto_irq_controller, base->handler_irq, 1); |
178 | m68k_irq_startup(base->handler_irq); | 178 | m68k_irq_startup(base->handler_irq); |
179 | request_irq(base->handler_irq, cia_handler, IRQF_SHARED, base->name, base); | 179 | if (request_irq(base->handler_irq, cia_handler, IRQF_SHARED, |
180 | base->name, base)) | ||
181 | pr_err("Couldn't register %s interrupt\n", base->name); | ||
180 | } | 182 | } |
diff --git a/arch/m68k/amiga/config.c b/arch/m68k/amiga/config.c index ab9862c3a136..6e562751ad51 100644 --- a/arch/m68k/amiga/config.c +++ b/arch/m68k/amiga/config.c | |||
@@ -493,7 +493,8 @@ static void __init amiga_sched_init(irq_handler_t timer_routine) | |||
493 | * Please don't change this to use ciaa, as it interferes with the | 493 | * Please don't change this to use ciaa, as it interferes with the |
494 | * SCSI code. We'll have to take a look at this later | 494 | * SCSI code. We'll have to take a look at this later |
495 | */ | 495 | */ |
496 | request_irq(IRQ_AMIGA_CIAB_TA, timer_routine, 0, "timer", NULL); | 496 | if (request_irq(IRQ_AMIGA_CIAB_TA, timer_routine, 0, "timer", NULL)) |
497 | pr_err("Couldn't register timer interrupt\n"); | ||
497 | /* start timer */ | 498 | /* start timer */ |
498 | ciab.cra |= 0x11; | 499 | ciab.cra |= 0x11; |
499 | } | 500 | } |
diff --git a/arch/m68k/apollo/config.c b/arch/m68k/apollo/config.c index 78df98f2029a..8d3eafab1ffe 100644 --- a/arch/m68k/apollo/config.c +++ b/arch/m68k/apollo/config.c | |||
@@ -31,10 +31,6 @@ extern unsigned long dn_gettimeoffset(void); | |||
31 | extern int dn_dummy_hwclk(int, struct rtc_time *); | 31 | extern int dn_dummy_hwclk(int, struct rtc_time *); |
32 | extern int dn_dummy_set_clock_mmss(unsigned long); | 32 | extern int dn_dummy_set_clock_mmss(unsigned long); |
33 | extern void dn_dummy_reset(void); | 33 | extern void dn_dummy_reset(void); |
34 | extern void dn_dummy_waitbut(void); | ||
35 | extern struct fb_info *dn_fb_init(long *); | ||
36 | extern void dn_dummy_debug_init(void); | ||
37 | extern irqreturn_t dn_process_int(int irq, struct pt_regs *fp); | ||
38 | #ifdef CONFIG_HEARTBEAT | 34 | #ifdef CONFIG_HEARTBEAT |
39 | static void dn_heartbeat(int on); | 35 | static void dn_heartbeat(int on); |
40 | #endif | 36 | #endif |
@@ -204,7 +200,8 @@ void dn_sched_init(irq_handler_t timer_routine) | |||
204 | printk("*(0x10803) %02x\n",*(volatile unsigned char *)(timer+0x3)); | 200 | printk("*(0x10803) %02x\n",*(volatile unsigned char *)(timer+0x3)); |
205 | #endif | 201 | #endif |
206 | 202 | ||
207 | request_irq(IRQ_APOLLO, dn_timer_int, 0, "time", timer_routine); | 203 | if (request_irq(IRQ_APOLLO, dn_timer_int, 0, "time", timer_routine)) |
204 | pr_err("Couldn't register timer interrupt\n"); | ||
208 | } | 205 | } |
209 | 206 | ||
210 | unsigned long dn_gettimeoffset(void) { | 207 | unsigned long dn_gettimeoffset(void) { |
diff --git a/arch/m68k/atari/atakeyb.c b/arch/m68k/atari/atakeyb.c index c038b7c7eff0..a5f33c059979 100644 --- a/arch/m68k/atari/atakeyb.c +++ b/arch/m68k/atari/atakeyb.c | |||
@@ -33,7 +33,6 @@ | |||
33 | #include <asm/atari_joystick.h> | 33 | #include <asm/atari_joystick.h> |
34 | #include <asm/irq.h> | 34 | #include <asm/irq.h> |
35 | 35 | ||
36 | extern unsigned int keymap_count; | ||
37 | 36 | ||
38 | /* Hook for MIDI serial driver */ | 37 | /* Hook for MIDI serial driver */ |
39 | void (*atari_MIDI_interrupt_hook) (void); | 38 | void (*atari_MIDI_interrupt_hook) (void); |
@@ -567,14 +566,19 @@ static int atari_keyb_done = 0; | |||
567 | 566 | ||
568 | int atari_keyb_init(void) | 567 | int atari_keyb_init(void) |
569 | { | 568 | { |
569 | int error; | ||
570 | |||
570 | if (atari_keyb_done) | 571 | if (atari_keyb_done) |
571 | return 0; | 572 | return 0; |
572 | 573 | ||
573 | kb_state.state = KEYBOARD; | 574 | kb_state.state = KEYBOARD; |
574 | kb_state.len = 0; | 575 | kb_state.len = 0; |
575 | 576 | ||
576 | request_irq(IRQ_MFP_ACIA, atari_keyboard_interrupt, IRQ_TYPE_SLOW, | 577 | error = request_irq(IRQ_MFP_ACIA, atari_keyboard_interrupt, |
577 | "keyboard/mouse/MIDI", atari_keyboard_interrupt); | 578 | IRQ_TYPE_SLOW, "keyboard/mouse/MIDI", |
579 | atari_keyboard_interrupt); | ||
580 | if (error) | ||
581 | return error; | ||
578 | 582 | ||
579 | atari_turnoff_irq(IRQ_MFP_ACIA); | 583 | atari_turnoff_irq(IRQ_MFP_ACIA); |
580 | do { | 584 | do { |
diff --git a/arch/m68k/atari/stdma.c b/arch/m68k/atari/stdma.c index d1bd029a34ac..604329fafbb8 100644 --- a/arch/m68k/atari/stdma.c +++ b/arch/m68k/atari/stdma.c | |||
@@ -179,8 +179,9 @@ EXPORT_SYMBOL(stdma_islocked); | |||
179 | void __init stdma_init(void) | 179 | void __init stdma_init(void) |
180 | { | 180 | { |
181 | stdma_isr = NULL; | 181 | stdma_isr = NULL; |
182 | request_irq(IRQ_MFP_FDC, stdma_int, IRQ_TYPE_SLOW | IRQF_SHARED, | 182 | if (request_irq(IRQ_MFP_FDC, stdma_int, IRQ_TYPE_SLOW | IRQF_SHARED, |
183 | "ST-DMA: floppy/ACSI/IDE/Falcon-SCSI", stdma_int); | 183 | "ST-DMA: floppy/ACSI/IDE/Falcon-SCSI", stdma_int)) |
184 | pr_err("Couldn't register ST-DMA interrupt\n"); | ||
184 | } | 185 | } |
185 | 186 | ||
186 | 187 | ||
diff --git a/arch/m68k/atari/time.c b/arch/m68k/atari/time.c index 1edde27fa32d..d076ff8d1b39 100644 --- a/arch/m68k/atari/time.c +++ b/arch/m68k/atari/time.c | |||
@@ -31,8 +31,9 @@ atari_sched_init(irq_handler_t timer_routine) | |||
31 | /* start timer C, div = 1:100 */ | 31 | /* start timer C, div = 1:100 */ |
32 | mfp.tim_ct_cd = (mfp.tim_ct_cd & 15) | 0x60; | 32 | mfp.tim_ct_cd = (mfp.tim_ct_cd & 15) | 0x60; |
33 | /* install interrupt service routine for MFP Timer C */ | 33 | /* install interrupt service routine for MFP Timer C */ |
34 | request_irq(IRQ_MFP_TIMC, timer_routine, IRQ_TYPE_SLOW, | 34 | if (request_irq(IRQ_MFP_TIMC, timer_routine, IRQ_TYPE_SLOW, |
35 | "timer", timer_routine); | 35 | "timer", timer_routine)) |
36 | pr_err("Couldn't register timer interrupt\n"); | ||
36 | } | 37 | } |
37 | 38 | ||
38 | /* ++andreas: gettimeoffset fixed to check for pending interrupt */ | 39 | /* ++andreas: gettimeoffset fixed to check for pending interrupt */ |
diff --git a/arch/m68k/bvme6000/config.c b/arch/m68k/bvme6000/config.c index c072595928c0..9fe6fefb5e14 100644 --- a/arch/m68k/bvme6000/config.c +++ b/arch/m68k/bvme6000/config.c | |||
@@ -43,7 +43,6 @@ extern unsigned long bvme6000_gettimeoffset (void); | |||
43 | extern int bvme6000_hwclk (int, struct rtc_time *); | 43 | extern int bvme6000_hwclk (int, struct rtc_time *); |
44 | extern int bvme6000_set_clock_mmss (unsigned long); | 44 | extern int bvme6000_set_clock_mmss (unsigned long); |
45 | extern void bvme6000_reset (void); | 45 | extern void bvme6000_reset (void); |
46 | extern void bvme6000_waitbut(void); | ||
47 | void bvme6000_set_vectors (void); | 46 | void bvme6000_set_vectors (void); |
48 | 47 | ||
49 | /* Save tick handler routine pointer, will point to do_timer() in | 48 | /* Save tick handler routine pointer, will point to do_timer() in |
diff --git a/arch/m68k/hp300/time.c b/arch/m68k/hp300/time.c index dd7c8a2583d3..f6312c7d8727 100644 --- a/arch/m68k/hp300/time.c +++ b/arch/m68k/hp300/time.c | |||
@@ -70,7 +70,8 @@ void __init hp300_sched_init(irq_handler_t vector) | |||
70 | 70 | ||
71 | asm volatile(" movpw %0,%1@(5)" : : "d" (INTVAL), "a" (CLOCKBASE)); | 71 | asm volatile(" movpw %0,%1@(5)" : : "d" (INTVAL), "a" (CLOCKBASE)); |
72 | 72 | ||
73 | request_irq(IRQ_AUTO_6, hp300_tick, IRQ_FLG_STD, "timer tick", vector); | 73 | if (request_irq(IRQ_AUTO_6, hp300_tick, IRQ_FLG_STD, "timer tick", vector)) |
74 | pr_err("Couldn't register timer interrupt\n"); | ||
74 | 75 | ||
75 | out_8(CLOCKBASE + CLKCR2, 0x1); /* select CR1 */ | 76 | out_8(CLOCKBASE + CLKCR2, 0x1); /* select CR1 */ |
76 | out_8(CLOCKBASE + CLKCR1, 0x40); /* enable irq */ | 77 | out_8(CLOCKBASE + CLKCR1, 0x40); /* enable irq */ |
diff --git a/arch/m68k/kernel/.gitignore b/arch/m68k/kernel/.gitignore new file mode 100644 index 000000000000..c5f676c3c224 --- /dev/null +++ b/arch/m68k/kernel/.gitignore | |||
@@ -0,0 +1 @@ | |||
vmlinux.lds | |||
diff --git a/arch/m68k/kernel/entry.S b/arch/m68k/kernel/entry.S index f28404d9a2bc..5b780826647c 100644 --- a/arch/m68k/kernel/entry.S +++ b/arch/m68k/kernel/entry.S | |||
@@ -424,7 +424,7 @@ resume: | |||
424 | .data | 424 | .data |
425 | ALIGN | 425 | ALIGN |
426 | sys_call_table: | 426 | sys_call_table: |
427 | .long sys_ni_syscall /* 0 - old "setup()" system call*/ | 427 | .long sys_restart_syscall /* 0 - old "setup()" system call, used for restarting */ |
428 | .long sys_exit | 428 | .long sys_exit |
429 | .long sys_fork | 429 | .long sys_fork |
430 | .long sys_read | 430 | .long sys_read |
diff --git a/arch/m68k/kernel/setup.c b/arch/m68k/kernel/setup.c index 4d97bd2bd573..303730afb1c9 100644 --- a/arch/m68k/kernel/setup.c +++ b/arch/m68k/kernel/setup.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/initrd.h> | 26 | #include <linux/initrd.h> |
27 | 27 | ||
28 | #include <asm/bootinfo.h> | 28 | #include <asm/bootinfo.h> |
29 | #include <asm/sections.h> | ||
29 | #include <asm/setup.h> | 30 | #include <asm/setup.h> |
30 | #include <asm/fpu.h> | 31 | #include <asm/fpu.h> |
31 | #include <asm/irq.h> | 32 | #include <asm/irq.h> |
@@ -62,7 +63,6 @@ EXPORT_SYMBOL(vme_brdtype); | |||
62 | int m68k_is040or060; | 63 | int m68k_is040or060; |
63 | EXPORT_SYMBOL(m68k_is040or060); | 64 | EXPORT_SYMBOL(m68k_is040or060); |
64 | 65 | ||
65 | extern int end; | ||
66 | extern unsigned long availmem; | 66 | extern unsigned long availmem; |
67 | 67 | ||
68 | int m68k_num_memory; | 68 | int m68k_num_memory; |
@@ -215,11 +215,10 @@ static void __init m68k_parse_bootinfo(const struct bi_record *record) | |||
215 | 215 | ||
216 | void __init setup_arch(char **cmdline_p) | 216 | void __init setup_arch(char **cmdline_p) |
217 | { | 217 | { |
218 | extern int _etext, _edata, _end; | ||
219 | int i; | 218 | int i; |
220 | 219 | ||
221 | /* The bootinfo is located right after the kernel bss */ | 220 | /* The bootinfo is located right after the kernel bss */ |
222 | m68k_parse_bootinfo((const struct bi_record *)&_end); | 221 | m68k_parse_bootinfo((const struct bi_record *)_end); |
223 | 222 | ||
224 | if (CPU_IS_040) | 223 | if (CPU_IS_040) |
225 | m68k_is040or060 = 4; | 224 | m68k_is040or060 = 4; |
@@ -252,9 +251,9 @@ void __init setup_arch(char **cmdline_p) | |||
252 | } | 251 | } |
253 | 252 | ||
254 | init_mm.start_code = PAGE_OFFSET; | 253 | init_mm.start_code = PAGE_OFFSET; |
255 | init_mm.end_code = (unsigned long) &_etext; | 254 | init_mm.end_code = (unsigned long)_etext; |
256 | init_mm.end_data = (unsigned long) &_edata; | 255 | init_mm.end_data = (unsigned long)_edata; |
257 | init_mm.brk = (unsigned long) &_end; | 256 | init_mm.brk = (unsigned long)_end; |
258 | 257 | ||
259 | *cmdline_p = m68k_command_line; | 258 | *cmdline_p = m68k_command_line; |
260 | memcpy(boot_command_line, *cmdline_p, CL_SIZE); | 259 | memcpy(boot_command_line, *cmdline_p, CL_SIZE); |
diff --git a/arch/m68k/kernel/signal.c b/arch/m68k/kernel/signal.c index f9af893cd289..de2d05ddd86d 100644 --- a/arch/m68k/kernel/signal.c +++ b/arch/m68k/kernel/signal.c | |||
@@ -326,6 +326,9 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *usc, void __u | |||
326 | struct sigcontext context; | 326 | struct sigcontext context; |
327 | int err; | 327 | int err; |
328 | 328 | ||
329 | /* Always make any pending restarted system calls return -EINTR */ | ||
330 | current_thread_info()->restart_block.fn = do_no_restart_syscall; | ||
331 | |||
329 | /* get previous context */ | 332 | /* get previous context */ |
330 | if (copy_from_user(&context, usc, sizeof(context))) | 333 | if (copy_from_user(&context, usc, sizeof(context))) |
331 | goto badframe; | 334 | goto badframe; |
@@ -411,6 +414,9 @@ rt_restore_ucontext(struct pt_regs *regs, struct switch_stack *sw, | |||
411 | unsigned long usp; | 414 | unsigned long usp; |
412 | int err; | 415 | int err; |
413 | 416 | ||
417 | /* Always make any pending restarted system calls return -EINTR */ | ||
418 | current_thread_info()->restart_block.fn = do_no_restart_syscall; | ||
419 | |||
414 | err = __get_user(temp, &uc->uc_mcontext.version); | 420 | err = __get_user(temp, &uc->uc_mcontext.version); |
415 | if (temp != MCONTEXT_VERSION) | 421 | if (temp != MCONTEXT_VERSION) |
416 | goto badframe; | 422 | goto badframe; |
@@ -937,6 +943,15 @@ handle_restart(struct pt_regs *regs, struct k_sigaction *ka, int has_handler) | |||
937 | regs->d0 = -EINTR; | 943 | regs->d0 = -EINTR; |
938 | break; | 944 | break; |
939 | 945 | ||
946 | case -ERESTART_RESTARTBLOCK: | ||
947 | if (!has_handler) { | ||
948 | regs->d0 = __NR_restart_syscall; | ||
949 | regs->pc -= 2; | ||
950 | break; | ||
951 | } | ||
952 | regs->d0 = -EINTR; | ||
953 | break; | ||
954 | |||
940 | case -ERESTARTSYS: | 955 | case -ERESTARTSYS: |
941 | if (has_handler && !(ka->sa.sa_flags & SA_RESTART)) { | 956 | if (has_handler && !(ka->sa.sa_flags & SA_RESTART)) { |
942 | regs->d0 = -EINTR; | 957 | regs->d0 = -EINTR; |
diff --git a/arch/m68k/kernel/vmlinux-sun3.lds b/arch/m68k/kernel/vmlinux-sun3.lds index 8a4919e4d36a..d9368c0709ba 100644 --- a/arch/m68k/kernel/vmlinux-sun3.lds +++ b/arch/m68k/kernel/vmlinux-sun3.lds | |||
@@ -33,6 +33,7 @@ SECTIONS | |||
33 | } :data | 33 | } :data |
34 | /* End of data goes *here* so that freeing init code works properly. */ | 34 | /* End of data goes *here* so that freeing init code works properly. */ |
35 | _edata = .; | 35 | _edata = .; |
36 | NOTES | ||
36 | 37 | ||
37 | /* will be freed after init */ | 38 | /* will be freed after init */ |
38 | . = ALIGN(PAGE_SIZE); /* Init code and data */ | 39 | . = ALIGN(PAGE_SIZE); /* Init code and data */ |
diff --git a/arch/m68k/mac/baboon.c b/arch/m68k/mac/baboon.c index 245d16d078ad..2a96bebd8969 100644 --- a/arch/m68k/mac/baboon.c +++ b/arch/m68k/mac/baboon.c | |||
@@ -92,7 +92,8 @@ static irqreturn_t baboon_irq(int irq, void *dev_id) | |||
92 | void __init baboon_register_interrupts(void) | 92 | void __init baboon_register_interrupts(void) |
93 | { | 93 | { |
94 | baboon_disabled = 0; | 94 | baboon_disabled = 0; |
95 | request_irq(IRQ_NUBUS_C, baboon_irq, 0, "baboon", (void *)baboon); | 95 | if (request_irq(IRQ_NUBUS_C, baboon_irq, 0, "baboon", (void *)baboon)) |
96 | pr_err("Couldn't register baboon interrupt\n"); | ||
96 | } | 97 | } |
97 | 98 | ||
98 | /* | 99 | /* |
diff --git a/arch/m68k/mac/config.c b/arch/m68k/mac/config.c index 8819b97be324..98b6bcfb37bf 100644 --- a/arch/m68k/mac/config.c +++ b/arch/m68k/mac/config.c | |||
@@ -47,13 +47,6 @@ | |||
47 | 47 | ||
48 | struct mac_booter_data mac_bi_data; | 48 | struct mac_booter_data mac_bi_data; |
49 | 49 | ||
50 | /* New m68k bootinfo stuff and videobase */ | ||
51 | |||
52 | extern int m68k_num_memory; | ||
53 | extern struct mem_info m68k_memory[NUM_MEMINFO]; | ||
54 | |||
55 | extern struct mem_info m68k_ramdisk; | ||
56 | |||
57 | /* The phys. video addr. - might be bogus on some machines */ | 50 | /* The phys. video addr. - might be bogus on some machines */ |
58 | static unsigned long mac_orig_videoaddr; | 51 | static unsigned long mac_orig_videoaddr; |
59 | 52 | ||
@@ -61,7 +54,6 @@ static unsigned long mac_orig_videoaddr; | |||
61 | extern unsigned long mac_gettimeoffset(void); | 54 | extern unsigned long mac_gettimeoffset(void); |
62 | extern int mac_hwclk(int, struct rtc_time *); | 55 | extern int mac_hwclk(int, struct rtc_time *); |
63 | extern int mac_set_clock_mmss(unsigned long); | 56 | extern int mac_set_clock_mmss(unsigned long); |
64 | extern int show_mac_interrupts(struct seq_file *, void *); | ||
65 | extern void iop_preinit(void); | 57 | extern void iop_preinit(void); |
66 | extern void iop_init(void); | 58 | extern void iop_init(void); |
67 | extern void via_init(void); | 59 | extern void via_init(void); |
@@ -805,10 +797,6 @@ static void __init mac_identify(void) | |||
805 | mac_bi_data.boottime, mac_bi_data.gmtbias); | 797 | mac_bi_data.boottime, mac_bi_data.gmtbias); |
806 | printk(KERN_DEBUG " Machine ID: %ld CPUid: 0x%lx memory size: 0x%lx \n", | 798 | printk(KERN_DEBUG " Machine ID: %ld CPUid: 0x%lx memory size: 0x%lx \n", |
807 | mac_bi_data.id, mac_bi_data.cpuid, mac_bi_data.memsize); | 799 | mac_bi_data.id, mac_bi_data.cpuid, mac_bi_data.memsize); |
808 | #if 0 | ||
809 | printk("Ramdisk: addr 0x%lx size 0x%lx\n", | ||
810 | m68k_ramdisk.addr, m68k_ramdisk.size); | ||
811 | #endif | ||
812 | 800 | ||
813 | iop_init(); | 801 | iop_init(); |
814 | via_init(); | 802 | via_init(); |
diff --git a/arch/m68k/mac/debug.c b/arch/m68k/mac/debug.c index 65dd77a742a3..bce074ceb768 100644 --- a/arch/m68k/mac/debug.c +++ b/arch/m68k/mac/debug.c | |||
@@ -27,7 +27,6 @@ | |||
27 | #include <asm/macints.h> | 27 | #include <asm/macints.h> |
28 | 28 | ||
29 | extern unsigned long mac_videobase; | 29 | extern unsigned long mac_videobase; |
30 | extern unsigned long mac_videodepth; | ||
31 | extern unsigned long mac_rowbytes; | 30 | extern unsigned long mac_rowbytes; |
32 | 31 | ||
33 | extern void mac_serial_print(const char *); | 32 | extern void mac_serial_print(const char *); |
diff --git a/arch/m68k/mac/iop.c b/arch/m68k/mac/iop.c index 326fb9978094..1ad4e9d80eba 100644 --- a/arch/m68k/mac/iop.c +++ b/arch/m68k/mac/iop.c | |||
@@ -305,14 +305,16 @@ void __init iop_register_interrupts(void) | |||
305 | { | 305 | { |
306 | if (iop_ism_present) { | 306 | if (iop_ism_present) { |
307 | if (oss_present) { | 307 | if (oss_present) { |
308 | request_irq(OSS_IRQLEV_IOPISM, iop_ism_irq, | 308 | if (request_irq(OSS_IRQLEV_IOPISM, iop_ism_irq, |
309 | IRQ_FLG_LOCK, "ISM IOP", | 309 | IRQ_FLG_LOCK, "ISM IOP", |
310 | (void *) IOP_NUM_ISM); | 310 | (void *) IOP_NUM_ISM)) |
311 | pr_err("Couldn't register ISM IOP interrupt\n"); | ||
311 | oss_irq_enable(IRQ_MAC_ADB); | 312 | oss_irq_enable(IRQ_MAC_ADB); |
312 | } else { | 313 | } else { |
313 | request_irq(IRQ_VIA2_0, iop_ism_irq, | 314 | if (request_irq(IRQ_VIA2_0, iop_ism_irq, |
314 | IRQ_FLG_LOCK|IRQ_FLG_FAST, "ISM IOP", | 315 | IRQ_FLG_LOCK|IRQ_FLG_FAST, "ISM IOP", |
315 | (void *) IOP_NUM_ISM); | 316 | (void *) IOP_NUM_ISM)) |
317 | pr_err("Couldn't register ISM IOP interrupt\n"); | ||
316 | } | 318 | } |
317 | if (!iop_alive(iop_base[IOP_NUM_ISM])) { | 319 | if (!iop_alive(iop_base[IOP_NUM_ISM])) { |
318 | printk("IOP: oh my god, they killed the ISM IOP!\n"); | 320 | printk("IOP: oh my god, they killed the ISM IOP!\n"); |
diff --git a/arch/m68k/mac/macints.c b/arch/m68k/mac/macints.c index 82e560c076ce..23711074e0e2 100644 --- a/arch/m68k/mac/macints.c +++ b/arch/m68k/mac/macints.c | |||
@@ -134,6 +134,7 @@ | |||
134 | #include <asm/errno.h> | 134 | #include <asm/errno.h> |
135 | #include <asm/macints.h> | 135 | #include <asm/macints.h> |
136 | #include <asm/irq_regs.h> | 136 | #include <asm/irq_regs.h> |
137 | #include <asm/mac_oss.h> | ||
137 | 138 | ||
138 | #define DEBUG_SPURIOUS | 139 | #define DEBUG_SPURIOUS |
139 | #define SHUTUP_SONIC | 140 | #define SHUTUP_SONIC |
@@ -146,7 +147,6 @@ static int scc_mask; | |||
146 | * VIA/RBV hooks | 147 | * VIA/RBV hooks |
147 | */ | 148 | */ |
148 | 149 | ||
149 | extern void via_init(void); | ||
150 | extern void via_register_interrupts(void); | 150 | extern void via_register_interrupts(void); |
151 | extern void via_irq_enable(int); | 151 | extern void via_irq_enable(int); |
152 | extern void via_irq_disable(int); | 152 | extern void via_irq_disable(int); |
@@ -157,9 +157,6 @@ extern int via_irq_pending(int); | |||
157 | * OSS hooks | 157 | * OSS hooks |
158 | */ | 158 | */ |
159 | 159 | ||
160 | extern int oss_present; | ||
161 | |||
162 | extern void oss_init(void); | ||
163 | extern void oss_register_interrupts(void); | 160 | extern void oss_register_interrupts(void); |
164 | extern void oss_irq_enable(int); | 161 | extern void oss_irq_enable(int); |
165 | extern void oss_irq_disable(int); | 162 | extern void oss_irq_disable(int); |
@@ -170,9 +167,6 @@ extern int oss_irq_pending(int); | |||
170 | * PSC hooks | 167 | * PSC hooks |
171 | */ | 168 | */ |
172 | 169 | ||
173 | extern int psc_present; | ||
174 | |||
175 | extern void psc_init(void); | ||
176 | extern void psc_register_interrupts(void); | 170 | extern void psc_register_interrupts(void); |
177 | extern void psc_irq_enable(int); | 171 | extern void psc_irq_enable(int); |
178 | extern void psc_irq_disable(int); | 172 | extern void psc_irq_disable(int); |
@@ -191,12 +185,10 @@ extern void iop_register_interrupts(void); | |||
191 | 185 | ||
192 | extern int baboon_present; | 186 | extern int baboon_present; |
193 | 187 | ||
194 | extern void baboon_init(void); | ||
195 | extern void baboon_register_interrupts(void); | 188 | extern void baboon_register_interrupts(void); |
196 | extern void baboon_irq_enable(int); | 189 | extern void baboon_irq_enable(int); |
197 | extern void baboon_irq_disable(int); | 190 | extern void baboon_irq_disable(int); |
198 | extern void baboon_irq_clear(int); | 191 | extern void baboon_irq_clear(int); |
199 | extern int baboon_irq_pending(int); | ||
200 | 192 | ||
201 | /* | 193 | /* |
202 | * SCC interrupt routines | 194 | * SCC interrupt routines |
@@ -258,8 +250,9 @@ void __init mac_init_IRQ(void) | |||
258 | if (baboon_present) | 250 | if (baboon_present) |
259 | baboon_register_interrupts(); | 251 | baboon_register_interrupts(); |
260 | iop_register_interrupts(); | 252 | iop_register_interrupts(); |
261 | request_irq(IRQ_AUTO_7, mac_nmi_handler, 0, "NMI", | 253 | if (request_irq(IRQ_AUTO_7, mac_nmi_handler, 0, "NMI", |
262 | mac_nmi_handler); | 254 | mac_nmi_handler)) |
255 | pr_err("Couldn't register NMI\n"); | ||
263 | #ifdef DEBUG_MACINTS | 256 | #ifdef DEBUG_MACINTS |
264 | printk("mac_init_IRQ(): Done!\n"); | 257 | printk("mac_init_IRQ(): Done!\n"); |
265 | #endif | 258 | #endif |
diff --git a/arch/m68k/mac/misc.c b/arch/m68k/mac/misc.c index a44c7086ab39..5d818568b343 100644 --- a/arch/m68k/mac/misc.c +++ b/arch/m68k/mac/misc.c | |||
@@ -35,7 +35,6 @@ | |||
35 | 35 | ||
36 | #define RTC_OFFSET 2082844800 | 36 | #define RTC_OFFSET 2082844800 |
37 | 37 | ||
38 | extern struct mac_booter_data mac_bi_data; | ||
39 | static void (*rom_reset)(void); | 38 | static void (*rom_reset)(void); |
40 | 39 | ||
41 | #ifdef CONFIG_ADB_CUDA | 40 | #ifdef CONFIG_ADB_CUDA |
diff --git a/arch/m68k/mac/oss.c b/arch/m68k/mac/oss.c index 8426501119ca..f3d23d6ebcf8 100644 --- a/arch/m68k/mac/oss.c +++ b/arch/m68k/mac/oss.c | |||
@@ -66,16 +66,21 @@ void __init oss_init(void) | |||
66 | 66 | ||
67 | void __init oss_register_interrupts(void) | 67 | void __init oss_register_interrupts(void) |
68 | { | 68 | { |
69 | request_irq(OSS_IRQLEV_SCSI, oss_irq, IRQ_FLG_LOCK, | 69 | if (request_irq(OSS_IRQLEV_SCSI, oss_irq, IRQ_FLG_LOCK, |
70 | "scsi", (void *) oss); | 70 | "scsi", (void *) oss)) |
71 | request_irq(OSS_IRQLEV_IOPSCC, mac_scc_dispatch, IRQ_FLG_LOCK, | 71 | pr_err("Couldn't register %s interrupt\n", "scsi"); |
72 | "scc", mac_scc_dispatch); | 72 | if (request_irq(OSS_IRQLEV_IOPSCC, mac_scc_dispatch, IRQ_FLG_LOCK, |
73 | request_irq(OSS_IRQLEV_NUBUS, oss_nubus_irq, IRQ_FLG_LOCK, | 73 | "scc", mac_scc_dispatch)) |
74 | "nubus", (void *) oss); | 74 | pr_err("Couldn't register %s interrupt\n", "scc"); |
75 | request_irq(OSS_IRQLEV_SOUND, oss_irq, IRQ_FLG_LOCK, | 75 | if (request_irq(OSS_IRQLEV_NUBUS, oss_nubus_irq, IRQ_FLG_LOCK, |
76 | "sound", (void *) oss); | 76 | "nubus", (void *) oss)) |
77 | request_irq(OSS_IRQLEV_VIA1, via1_irq, IRQ_FLG_LOCK, | 77 | pr_err("Couldn't register %s interrupt\n", "nubus"); |
78 | "via1", (void *) via1); | 78 | if (request_irq(OSS_IRQLEV_SOUND, oss_irq, IRQ_FLG_LOCK, |
79 | "sound", (void *) oss)) | ||
80 | pr_err("Couldn't register %s interrupt\n", "sound"); | ||
81 | if (request_irq(OSS_IRQLEV_VIA1, via1_irq, IRQ_FLG_LOCK, | ||
82 | "via1", (void *) via1)) | ||
83 | pr_err("Couldn't register %s interrupt\n", "via1"); | ||
79 | } | 84 | } |
80 | 85 | ||
81 | /* | 86 | /* |
diff --git a/arch/m68k/mac/psc.c b/arch/m68k/mac/psc.c index f84a4dd64f94..ba6ccab64018 100644 --- a/arch/m68k/mac/psc.c +++ b/arch/m68k/mac/psc.c | |||
@@ -117,10 +117,14 @@ void __init psc_init(void) | |||
117 | 117 | ||
118 | void __init psc_register_interrupts(void) | 118 | void __init psc_register_interrupts(void) |
119 | { | 119 | { |
120 | request_irq(IRQ_AUTO_3, psc_irq, 0, "psc3", (void *) 0x30); | 120 | if (request_irq(IRQ_AUTO_3, psc_irq, 0, "psc3", (void *) 0x30)) |
121 | request_irq(IRQ_AUTO_4, psc_irq, 0, "psc4", (void *) 0x40); | 121 | pr_err("Couldn't register psc%d interrupt\n", 3); |
122 | request_irq(IRQ_AUTO_5, psc_irq, 0, "psc5", (void *) 0x50); | 122 | if (request_irq(IRQ_AUTO_4, psc_irq, 0, "psc4", (void *) 0x40)) |
123 | request_irq(IRQ_AUTO_6, psc_irq, 0, "psc6", (void *) 0x60); | 123 | pr_err("Couldn't register psc%d interrupt\n", 4); |
124 | if (request_irq(IRQ_AUTO_5, psc_irq, 0, "psc5", (void *) 0x50)) | ||
125 | pr_err("Couldn't register psc%d interrupt\n", 5); | ||
126 | if (request_irq(IRQ_AUTO_6, psc_irq, 0, "psc6", (void *) 0x60)) | ||
127 | pr_err("Couldn't register psc%d interrupt\n", 6); | ||
124 | } | 128 | } |
125 | 129 | ||
126 | /* | 130 | /* |
diff --git a/arch/m68k/mac/via.c b/arch/m68k/mac/via.c index f01d418e64fe..7d97ba54536e 100644 --- a/arch/m68k/mac/via.c +++ b/arch/m68k/mac/via.c | |||
@@ -34,6 +34,7 @@ | |||
34 | #include <asm/macints.h> | 34 | #include <asm/macints.h> |
35 | #include <asm/mac_via.h> | 35 | #include <asm/mac_via.h> |
36 | #include <asm/mac_psc.h> | 36 | #include <asm/mac_psc.h> |
37 | #include <asm/mac_oss.h> | ||
37 | 38 | ||
38 | volatile __u8 *via1, *via2; | 39 | volatile __u8 *via1, *via2; |
39 | int rbv_present; | 40 | int rbv_present; |
@@ -84,7 +85,6 @@ void via_irq_disable(int irq); | |||
84 | void via_irq_clear(int irq); | 85 | void via_irq_clear(int irq); |
85 | 86 | ||
86 | extern irqreturn_t mac_scc_dispatch(int, void *); | 87 | extern irqreturn_t mac_scc_dispatch(int, void *); |
87 | extern int oss_present; | ||
88 | 88 | ||
89 | /* | 89 | /* |
90 | * Initialize the VIAs | 90 | * Initialize the VIAs |
@@ -283,7 +283,8 @@ void __init via_init_clock(irq_handler_t func) | |||
283 | via1[vT1CL] = MAC_CLOCK_LOW; | 283 | via1[vT1CL] = MAC_CLOCK_LOW; |
284 | via1[vT1CH] = MAC_CLOCK_HIGH; | 284 | via1[vT1CH] = MAC_CLOCK_HIGH; |
285 | 285 | ||
286 | request_irq(IRQ_MAC_TIMER_1, func, IRQ_FLG_LOCK, "timer", func); | 286 | if (request_irq(IRQ_MAC_TIMER_1, func, IRQ_FLG_LOCK, "timer", func)) |
287 | pr_err("Couldn't register %s interrupt\n", "timer"); | ||
287 | } | 288 | } |
288 | 289 | ||
289 | /* | 290 | /* |
@@ -293,25 +294,31 @@ void __init via_init_clock(irq_handler_t func) | |||
293 | void __init via_register_interrupts(void) | 294 | void __init via_register_interrupts(void) |
294 | { | 295 | { |
295 | if (via_alt_mapping) { | 296 | if (via_alt_mapping) { |
296 | request_irq(IRQ_AUTO_1, via1_irq, | 297 | if (request_irq(IRQ_AUTO_1, via1_irq, |
297 | IRQ_FLG_LOCK|IRQ_FLG_FAST, "software", | 298 | IRQ_FLG_LOCK|IRQ_FLG_FAST, "software", |
298 | (void *) via1); | 299 | (void *) via1)) |
299 | request_irq(IRQ_AUTO_6, via1_irq, | 300 | pr_err("Couldn't register %s interrupt\n", "software"); |
301 | if (request_irq(IRQ_AUTO_6, via1_irq, | ||
300 | IRQ_FLG_LOCK|IRQ_FLG_FAST, "via1", | 302 | IRQ_FLG_LOCK|IRQ_FLG_FAST, "via1", |
301 | (void *) via1); | 303 | (void *) via1)) |
304 | pr_err("Couldn't register %s interrupt\n", "via1"); | ||
302 | } else { | 305 | } else { |
303 | request_irq(IRQ_AUTO_1, via1_irq, | 306 | if (request_irq(IRQ_AUTO_1, via1_irq, |
304 | IRQ_FLG_LOCK|IRQ_FLG_FAST, "via1", | 307 | IRQ_FLG_LOCK|IRQ_FLG_FAST, "via1", |
305 | (void *) via1); | 308 | (void *) via1)) |
309 | pr_err("Couldn't register %s interrupt\n", "via1"); | ||
306 | } | 310 | } |
307 | request_irq(IRQ_AUTO_2, via2_irq, IRQ_FLG_LOCK|IRQ_FLG_FAST, | 311 | if (request_irq(IRQ_AUTO_2, via2_irq, IRQ_FLG_LOCK|IRQ_FLG_FAST, |
308 | "via2", (void *) via2); | 312 | "via2", (void *) via2)) |
313 | pr_err("Couldn't register %s interrupt\n", "via2"); | ||
309 | if (!psc_present) { | 314 | if (!psc_present) { |
310 | request_irq(IRQ_AUTO_4, mac_scc_dispatch, IRQ_FLG_LOCK, | 315 | if (request_irq(IRQ_AUTO_4, mac_scc_dispatch, IRQ_FLG_LOCK, |
311 | "scc", mac_scc_dispatch); | 316 | "scc", mac_scc_dispatch)) |
317 | pr_err("Couldn't register %s interrupt\n", "scc"); | ||
312 | } | 318 | } |
313 | request_irq(IRQ_MAC_NUBUS, via_nubus_irq, IRQ_FLG_LOCK|IRQ_FLG_FAST, | 319 | if (request_irq(IRQ_MAC_NUBUS, via_nubus_irq, |
314 | "nubus", (void *) via2); | 320 | IRQ_FLG_LOCK|IRQ_FLG_FAST, "nubus", (void *) via2)) |
321 | pr_err("Couldn't register %s interrupt\n", "nubus"); | ||
315 | } | 322 | } |
316 | 323 | ||
317 | /* | 324 | /* |
diff --git a/arch/m68k/math-emu/fp_log.c b/arch/m68k/math-emu/fp_log.c index b1033ae0d6f0..367ecee2f981 100644 --- a/arch/m68k/math-emu/fp_log.c +++ b/arch/m68k/math-emu/fp_log.c | |||
@@ -24,7 +24,6 @@ static const struct fp_ext fp_one = | |||
24 | 24 | ||
25 | extern struct fp_ext *fp_fadd(struct fp_ext *dest, const struct fp_ext *src); | 25 | extern struct fp_ext *fp_fadd(struct fp_ext *dest, const struct fp_ext *src); |
26 | extern struct fp_ext *fp_fdiv(struct fp_ext *dest, const struct fp_ext *src); | 26 | extern struct fp_ext *fp_fdiv(struct fp_ext *dest, const struct fp_ext *src); |
27 | extern struct fp_ext *fp_fmul(struct fp_ext *dest, const struct fp_ext *src); | ||
28 | 27 | ||
29 | struct fp_ext * | 28 | struct fp_ext * |
30 | fp_fsqrt(struct fp_ext *dest, struct fp_ext *src) | 29 | fp_fsqrt(struct fp_ext *dest, struct fp_ext *src) |
diff --git a/arch/m68k/mm/init.c b/arch/m68k/mm/init.c index 81bb08ceec18..0007b2adf3a3 100644 --- a/arch/m68k/mm/init.c +++ b/arch/m68k/mm/init.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #ifdef CONFIG_ATARI | 28 | #ifdef CONFIG_ATARI |
29 | #include <asm/atari_stram.h> | 29 | #include <asm/atari_stram.h> |
30 | #endif | 30 | #endif |
31 | #include <asm/sections.h> | ||
31 | #include <asm/tlb.h> | 32 | #include <asm/tlb.h> |
32 | 33 | ||
33 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); | 34 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); |
@@ -73,9 +74,6 @@ extern void init_pointer_table(unsigned long ptable); | |||
73 | 74 | ||
74 | /* References to section boundaries */ | 75 | /* References to section boundaries */ |
75 | 76 | ||
76 | extern char _text[], _etext[]; | ||
77 | extern char __init_begin[], __init_end[]; | ||
78 | |||
79 | extern pmd_t *zero_pgtable; | 77 | extern pmd_t *zero_pgtable; |
80 | 78 | ||
81 | void __init mem_init(void) | 79 | void __init mem_init(void) |
diff --git a/arch/m68k/mm/motorola.c b/arch/m68k/mm/motorola.c index c5dbb9bdb322..4665fc84b7dc 100644 --- a/arch/m68k/mm/motorola.c +++ b/arch/m68k/mm/motorola.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #ifdef CONFIG_ATARI | 30 | #ifdef CONFIG_ATARI |
31 | #include <asm/atari_stram.h> | 31 | #include <asm/atari_stram.h> |
32 | #endif | 32 | #endif |
33 | #include <asm/sections.h> | ||
33 | 34 | ||
34 | #undef DEBUG | 35 | #undef DEBUG |
35 | 36 | ||
@@ -301,14 +302,12 @@ void __init paging_init(void) | |||
301 | } | 302 | } |
302 | } | 303 | } |
303 | 304 | ||
304 | extern char __init_begin, __init_end; | ||
305 | |||
306 | void free_initmem(void) | 305 | void free_initmem(void) |
307 | { | 306 | { |
308 | unsigned long addr; | 307 | unsigned long addr; |
309 | 308 | ||
310 | addr = (unsigned long)&__init_begin; | 309 | addr = (unsigned long)__init_begin; |
311 | for (; addr < (unsigned long)&__init_end; addr += PAGE_SIZE) { | 310 | for (; addr < (unsigned long)__init_end; addr += PAGE_SIZE) { |
312 | virt_to_page(addr)->flags &= ~(1 << PG_reserved); | 311 | virt_to_page(addr)->flags &= ~(1 << PG_reserved); |
313 | init_page_count(virt_to_page(addr)); | 312 | init_page_count(virt_to_page(addr)); |
314 | free_page(addr); | 313 | free_page(addr); |
diff --git a/arch/m68k/mvme147/config.c b/arch/m68k/mvme147/config.c index 43cdf476ffab..100baaa692a1 100644 --- a/arch/m68k/mvme147/config.c +++ b/arch/m68k/mvme147/config.c | |||
@@ -42,7 +42,6 @@ extern unsigned long mvme147_gettimeoffset (void); | |||
42 | extern int mvme147_hwclk (int, struct rtc_time *); | 42 | extern int mvme147_hwclk (int, struct rtc_time *); |
43 | extern int mvme147_set_clock_mmss (unsigned long); | 43 | extern int mvme147_set_clock_mmss (unsigned long); |
44 | extern void mvme147_reset (void); | 44 | extern void mvme147_reset (void); |
45 | extern void mvme147_waitbut(void); | ||
46 | 45 | ||
47 | 46 | ||
48 | static int bcd2int (unsigned char b); | 47 | static int bcd2int (unsigned char b); |
@@ -115,8 +114,9 @@ static irqreturn_t mvme147_timer_int (int irq, void *dev_id) | |||
115 | void mvme147_sched_init (irq_handler_t timer_routine) | 114 | void mvme147_sched_init (irq_handler_t timer_routine) |
116 | { | 115 | { |
117 | tick_handler = timer_routine; | 116 | tick_handler = timer_routine; |
118 | request_irq (PCC_IRQ_TIMER1, mvme147_timer_int, | 117 | if (request_irq(PCC_IRQ_TIMER1, mvme147_timer_int, IRQ_FLG_REPLACE, |
119 | IRQ_FLG_REPLACE, "timer 1", NULL); | 118 | "timer 1", NULL)) |
119 | pr_err("Couldn't register timer interrupt\n"); | ||
120 | 120 | ||
121 | /* Init the clock with a value */ | 121 | /* Init the clock with a value */ |
122 | /* our clock goes off every 6.25us */ | 122 | /* our clock goes off every 6.25us */ |
diff --git a/arch/m68k/mvme16x/config.c b/arch/m68k/mvme16x/config.c index 1521826fc3c7..11edf61cc2c4 100644 --- a/arch/m68k/mvme16x/config.c +++ b/arch/m68k/mvme16x/config.c | |||
@@ -48,7 +48,6 @@ extern unsigned long mvme16x_gettimeoffset (void); | |||
48 | extern int mvme16x_hwclk (int, struct rtc_time *); | 48 | extern int mvme16x_hwclk (int, struct rtc_time *); |
49 | extern int mvme16x_set_clock_mmss (unsigned long); | 49 | extern int mvme16x_set_clock_mmss (unsigned long); |
50 | extern void mvme16x_reset (void); | 50 | extern void mvme16x_reset (void); |
51 | extern void mvme16x_waitbut(void); | ||
52 | 51 | ||
53 | int bcd2int (unsigned char b); | 52 | int bcd2int (unsigned char b); |
54 | 53 | ||
diff --git a/arch/m68k/q40/config.c b/arch/m68k/q40/config.c index 7110546e3c00..31ab3f08bbda 100644 --- a/arch/m68k/q40/config.c +++ b/arch/m68k/q40/config.c | |||
@@ -36,7 +36,6 @@ | |||
36 | #include <asm/machdep.h> | 36 | #include <asm/machdep.h> |
37 | #include <asm/q40_master.h> | 37 | #include <asm/q40_master.h> |
38 | 38 | ||
39 | extern irqreturn_t q40_process_int(int level, struct pt_regs *regs); | ||
40 | extern void q40_init_IRQ(void); | 39 | extern void q40_init_IRQ(void); |
41 | static void q40_get_model(char *model); | 40 | static void q40_get_model(char *model); |
42 | extern void q40_sched_init(irq_handler_t handler); | 41 | extern void q40_sched_init(irq_handler_t handler); |
@@ -47,8 +46,6 @@ static unsigned int q40_get_ss(void); | |||
47 | static int q40_set_clock_mmss(unsigned long); | 46 | static int q40_set_clock_mmss(unsigned long); |
48 | static int q40_get_rtc_pll(struct rtc_pll_info *pll); | 47 | static int q40_get_rtc_pll(struct rtc_pll_info *pll); |
49 | static int q40_set_rtc_pll(struct rtc_pll_info *pll); | 48 | static int q40_set_rtc_pll(struct rtc_pll_info *pll); |
50 | extern void q40_waitbut(void); | ||
51 | void q40_set_vectors(void); | ||
52 | 49 | ||
53 | extern void q40_mksound(unsigned int /*freq*/, unsigned int /*ticks*/); | 50 | extern void q40_mksound(unsigned int /*freq*/, unsigned int /*ticks*/); |
54 | 51 | ||
diff --git a/arch/m68k/sun3/config.c b/arch/m68k/sun3/config.c index 8dfaa201342e..2ca25bd01a96 100644 --- a/arch/m68k/sun3/config.c +++ b/arch/m68k/sun3/config.c | |||
@@ -27,23 +27,21 @@ | |||
27 | #include <asm/sun3mmu.h> | 27 | #include <asm/sun3mmu.h> |
28 | #include <asm/rtc.h> | 28 | #include <asm/rtc.h> |
29 | #include <asm/machdep.h> | 29 | #include <asm/machdep.h> |
30 | #include <asm/idprom.h> | ||
30 | #include <asm/intersil.h> | 31 | #include <asm/intersil.h> |
31 | #include <asm/irq.h> | 32 | #include <asm/irq.h> |
33 | #include <asm/sections.h> | ||
32 | #include <asm/segment.h> | 34 | #include <asm/segment.h> |
33 | #include <asm/sun3ints.h> | 35 | #include <asm/sun3ints.h> |
34 | 36 | ||
35 | extern char _text, _end; | ||
36 | |||
37 | char sun3_reserved_pmeg[SUN3_PMEGS_NUM]; | 37 | char sun3_reserved_pmeg[SUN3_PMEGS_NUM]; |
38 | 38 | ||
39 | extern unsigned long sun3_gettimeoffset(void); | 39 | extern unsigned long sun3_gettimeoffset(void); |
40 | static void sun3_sched_init(irq_handler_t handler); | 40 | static void sun3_sched_init(irq_handler_t handler); |
41 | extern void sun3_get_model (char* model); | 41 | extern void sun3_get_model (char* model); |
42 | extern void idprom_init (void); | ||
43 | extern int sun3_hwclk(int set, struct rtc_time *t); | 42 | extern int sun3_hwclk(int set, struct rtc_time *t); |
44 | 43 | ||
45 | volatile char* clock_va; | 44 | volatile char* clock_va; |
46 | extern volatile unsigned char* sun3_intreg; | ||
47 | extern unsigned long availmem; | 45 | extern unsigned long availmem; |
48 | unsigned long num_pages; | 46 | unsigned long num_pages; |
49 | 47 | ||
@@ -149,7 +147,7 @@ void __init config_sun3(void) | |||
149 | mach_halt = sun3_halt; | 147 | mach_halt = sun3_halt; |
150 | mach_get_hardware_list = sun3_get_hardware_list; | 148 | mach_get_hardware_list = sun3_get_hardware_list; |
151 | 149 | ||
152 | memory_start = ((((int)&_end) + 0x2000) & ~0x1fff); | 150 | memory_start = ((((unsigned long)_end) + 0x2000) & ~0x1fff); |
153 | // PROM seems to want the last couple of physical pages. --m | 151 | // PROM seems to want the last couple of physical pages. --m |
154 | memory_end = *(romvec->pv_sun3mem) + PAGE_OFFSET - 2*PAGE_SIZE; | 152 | memory_end = *(romvec->pv_sun3mem) + PAGE_OFFSET - 2*PAGE_SIZE; |
155 | 153 | ||
diff --git a/arch/m68k/sun3/mmu_emu.c b/arch/m68k/sun3/mmu_emu.c index 60f9d4500d72..3cd19390aae5 100644 --- a/arch/m68k/sun3/mmu_emu.c +++ b/arch/m68k/sun3/mmu_emu.c | |||
@@ -27,7 +27,6 @@ | |||
27 | #include <asm/mmu_context.h> | 27 | #include <asm/mmu_context.h> |
28 | #include <asm/dvma.h> | 28 | #include <asm/dvma.h> |
29 | 29 | ||
30 | extern void prom_reboot (char *) __attribute__ ((__noreturn__)); | ||
31 | 30 | ||
32 | #undef DEBUG_MMU_EMU | 31 | #undef DEBUG_MMU_EMU |
33 | #define DEBUG_PROM_MAPS | 32 | #define DEBUG_PROM_MAPS |
diff --git a/arch/m68k/sun3/sun3ints.c b/arch/m68k/sun3/sun3ints.c index 7364cd67455e..ad90393a3361 100644 --- a/arch/m68k/sun3/sun3ints.c +++ b/arch/m68k/sun3/sun3ints.c | |||
@@ -105,7 +105,10 @@ void __init sun3_init_IRQ(void) | |||
105 | m68k_setup_irq_controller(&sun3_irq_controller, IRQ_AUTO_1, 7); | 105 | m68k_setup_irq_controller(&sun3_irq_controller, IRQ_AUTO_1, 7); |
106 | m68k_setup_user_interrupt(VEC_USER, 128, NULL); | 106 | m68k_setup_user_interrupt(VEC_USER, 128, NULL); |
107 | 107 | ||
108 | request_irq(IRQ_AUTO_5, sun3_int5, 0, "int5", NULL); | 108 | if (request_irq(IRQ_AUTO_5, sun3_int5, 0, "int5", NULL)) |
109 | request_irq(IRQ_AUTO_7, sun3_int7, 0, "int7", NULL); | 109 | pr_err("Couldn't register %s interrupt\n", "int5"); |
110 | request_irq(IRQ_USER+127, sun3_vec255, 0, "vec255", NULL); | 110 | if (request_irq(IRQ_AUTO_7, sun3_int7, 0, "int7", NULL)) |
111 | pr_err("Couldn't register %s interrupt\n", "int7"); | ||
112 | if (request_irq(IRQ_USER+127, sun3_vec255, 0, "vec255", NULL)) | ||
113 | pr_err("Couldn't register %s interrupt\n", "vec255"); | ||
111 | } | 114 | } |
diff --git a/arch/m68k/sun3x/config.c b/arch/m68k/sun3x/config.c index 2b1ca2db070f..fc599fad4a54 100644 --- a/arch/m68k/sun3x/config.c +++ b/arch/m68k/sun3x/config.c | |||
@@ -23,7 +23,6 @@ | |||
23 | #include "time.h" | 23 | #include "time.h" |
24 | 24 | ||
25 | volatile char *clock_va; | 25 | volatile char *clock_va; |
26 | extern volatile unsigned char *sun3_intreg; | ||
27 | 26 | ||
28 | extern void sun3_get_model(char *model); | 27 | extern void sun3_get_model(char *model); |
29 | 28 | ||
diff --git a/drivers/block/amiflop.c b/drivers/block/amiflop.c index 4b1d4ac960f1..8df436ff7068 100644 --- a/drivers/block/amiflop.c +++ b/drivers/block/amiflop.c | |||
@@ -156,7 +156,7 @@ static volatile int fdc_busy = -1; | |||
156 | static volatile int fdc_nested; | 156 | static volatile int fdc_nested; |
157 | static DECLARE_WAIT_QUEUE_HEAD(fdc_wait); | 157 | static DECLARE_WAIT_QUEUE_HEAD(fdc_wait); |
158 | 158 | ||
159 | static DECLARE_WAIT_QUEUE_HEAD(motor_wait); | 159 | static DECLARE_COMPLETION(motor_on_completion); |
160 | 160 | ||
161 | static volatile int selected = -1; /* currently selected drive */ | 161 | static volatile int selected = -1; /* currently selected drive */ |
162 | 162 | ||
@@ -184,8 +184,7 @@ static unsigned char mfmencode[16]={ | |||
184 | static unsigned char mfmdecode[128]; | 184 | static unsigned char mfmdecode[128]; |
185 | 185 | ||
186 | /* floppy internal millisecond timer stuff */ | 186 | /* floppy internal millisecond timer stuff */ |
187 | static volatile int ms_busy = -1; | 187 | static DECLARE_COMPLETION(ms_wait_completion); |
188 | static DECLARE_WAIT_QUEUE_HEAD(ms_wait); | ||
189 | #define MS_TICKS ((amiga_eclock+50)/1000) | 188 | #define MS_TICKS ((amiga_eclock+50)/1000) |
190 | 189 | ||
191 | /* | 190 | /* |
@@ -211,8 +210,7 @@ static int fd_device[4] = { 0, 0, 0, 0 }; | |||
211 | 210 | ||
212 | static irqreturn_t ms_isr(int irq, void *dummy) | 211 | static irqreturn_t ms_isr(int irq, void *dummy) |
213 | { | 212 | { |
214 | ms_busy = -1; | 213 | complete(&ms_wait_completion); |
215 | wake_up(&ms_wait); | ||
216 | return IRQ_HANDLED; | 214 | return IRQ_HANDLED; |
217 | } | 215 | } |
218 | 216 | ||
@@ -220,19 +218,17 @@ static irqreturn_t ms_isr(int irq, void *dummy) | |||
220 | A more generic routine would do a schedule a la timer.device */ | 218 | A more generic routine would do a schedule a la timer.device */ |
221 | static void ms_delay(int ms) | 219 | static void ms_delay(int ms) |
222 | { | 220 | { |
223 | unsigned long flags; | ||
224 | int ticks; | 221 | int ticks; |
222 | static DEFINE_MUTEX(mutex); | ||
223 | |||
225 | if (ms > 0) { | 224 | if (ms > 0) { |
226 | local_irq_save(flags); | 225 | mutex_lock(&mutex); |
227 | while (ms_busy == 0) | ||
228 | sleep_on(&ms_wait); | ||
229 | ms_busy = 0; | ||
230 | local_irq_restore(flags); | ||
231 | ticks = MS_TICKS*ms-1; | 226 | ticks = MS_TICKS*ms-1; |
232 | ciaa.tblo=ticks%256; | 227 | ciaa.tblo=ticks%256; |
233 | ciaa.tbhi=ticks/256; | 228 | ciaa.tbhi=ticks/256; |
234 | ciaa.crb=0x19; /*count eclock, force load, one-shoot, start */ | 229 | ciaa.crb=0x19; /*count eclock, force load, one-shoot, start */ |
235 | sleep_on(&ms_wait); | 230 | wait_for_completion(&ms_wait_completion); |
231 | mutex_unlock(&mutex); | ||
236 | } | 232 | } |
237 | } | 233 | } |
238 | 234 | ||
@@ -254,8 +250,7 @@ static void get_fdc(int drive) | |||
254 | printk("get_fdc: drive %d fdc_busy %d fdc_nested %d\n",drive,fdc_busy,fdc_nested); | 250 | printk("get_fdc: drive %d fdc_busy %d fdc_nested %d\n",drive,fdc_busy,fdc_nested); |
255 | #endif | 251 | #endif |
256 | local_irq_save(flags); | 252 | local_irq_save(flags); |
257 | while (!try_fdc(drive)) | 253 | wait_event(fdc_wait, try_fdc(drive)); |
258 | sleep_on(&fdc_wait); | ||
259 | fdc_busy = drive; | 254 | fdc_busy = drive; |
260 | fdc_nested++; | 255 | fdc_nested++; |
261 | local_irq_restore(flags); | 256 | local_irq_restore(flags); |
@@ -330,7 +325,7 @@ static void fd_deselect (int drive) | |||
330 | static void motor_on_callback(unsigned long nr) | 325 | static void motor_on_callback(unsigned long nr) |
331 | { | 326 | { |
332 | if (!(ciaa.pra & DSKRDY) || --on_attempts == 0) { | 327 | if (!(ciaa.pra & DSKRDY) || --on_attempts == 0) { |
333 | wake_up (&motor_wait); | 328 | complete_all(&motor_on_completion); |
334 | } else { | 329 | } else { |
335 | motor_on_timer.expires = jiffies + HZ/10; | 330 | motor_on_timer.expires = jiffies + HZ/10; |
336 | add_timer(&motor_on_timer); | 331 | add_timer(&motor_on_timer); |
@@ -347,11 +342,12 @@ static int fd_motor_on(int nr) | |||
347 | unit[nr].motor = 1; | 342 | unit[nr].motor = 1; |
348 | fd_select(nr); | 343 | fd_select(nr); |
349 | 344 | ||
345 | INIT_COMPLETION(motor_on_completion); | ||
350 | motor_on_timer.data = nr; | 346 | motor_on_timer.data = nr; |
351 | mod_timer(&motor_on_timer, jiffies + HZ/2); | 347 | mod_timer(&motor_on_timer, jiffies + HZ/2); |
352 | 348 | ||
353 | on_attempts = 10; | 349 | on_attempts = 10; |
354 | sleep_on (&motor_wait); | 350 | wait_for_completion(&motor_on_completion); |
355 | fd_deselect(nr); | 351 | fd_deselect(nr); |
356 | } | 352 | } |
357 | 353 | ||
@@ -582,8 +578,7 @@ static void raw_read(int drive) | |||
582 | { | 578 | { |
583 | drive&=3; | 579 | drive&=3; |
584 | get_fdc(drive); | 580 | get_fdc(drive); |
585 | while (block_flag) | 581 | wait_event(wait_fd_block, !block_flag); |
586 | sleep_on(&wait_fd_block); | ||
587 | fd_select(drive); | 582 | fd_select(drive); |
588 | /* setup adkcon bits correctly */ | 583 | /* setup adkcon bits correctly */ |
589 | custom.adkcon = ADK_MSBSYNC; | 584 | custom.adkcon = ADK_MSBSYNC; |
@@ -598,8 +593,7 @@ static void raw_read(int drive) | |||
598 | 593 | ||
599 | block_flag = 1; | 594 | block_flag = 1; |
600 | 595 | ||
601 | while (block_flag) | 596 | wait_event(wait_fd_block, !block_flag); |
602 | sleep_on (&wait_fd_block); | ||
603 | 597 | ||
604 | custom.dsklen = 0; | 598 | custom.dsklen = 0; |
605 | fd_deselect(drive); | 599 | fd_deselect(drive); |
@@ -616,8 +610,7 @@ static int raw_write(int drive) | |||
616 | rel_fdc(); | 610 | rel_fdc(); |
617 | return 0; | 611 | return 0; |
618 | } | 612 | } |
619 | while (block_flag) | 613 | wait_event(wait_fd_block, !block_flag); |
620 | sleep_on(&wait_fd_block); | ||
621 | fd_select(drive); | 614 | fd_select(drive); |
622 | /* clear adkcon bits */ | 615 | /* clear adkcon bits */ |
623 | custom.adkcon = ADK_PRECOMP1|ADK_PRECOMP0|ADK_WORDSYNC|ADK_MSBSYNC; | 616 | custom.adkcon = ADK_PRECOMP1|ADK_PRECOMP0|ADK_WORDSYNC|ADK_MSBSYNC; |
@@ -1294,8 +1287,7 @@ static int non_int_flush_track (unsigned long nr) | |||
1294 | writepending = 0; | 1287 | writepending = 0; |
1295 | return 0; | 1288 | return 0; |
1296 | } | 1289 | } |
1297 | while (block_flag == 2) | 1290 | wait_event(wait_fd_block, block_flag != 2); |
1298 | sleep_on (&wait_fd_block); | ||
1299 | } | 1291 | } |
1300 | else { | 1292 | else { |
1301 | local_irq_restore(flags); | 1293 | local_irq_restore(flags); |
diff --git a/drivers/char/amiserial.c b/drivers/char/amiserial.c index 4e0cfdeab146..a58869ea8513 100644 --- a/drivers/char/amiserial.c +++ b/drivers/char/amiserial.c | |||
@@ -1963,6 +1963,7 @@ static int __init rs_init(void) | |||
1963 | { | 1963 | { |
1964 | unsigned long flags; | 1964 | unsigned long flags; |
1965 | struct serial_state * state; | 1965 | struct serial_state * state; |
1966 | int error; | ||
1966 | 1967 | ||
1967 | if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(AMI_SERIAL)) | 1968 | if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(AMI_SERIAL)) |
1968 | return -ENODEV; | 1969 | return -ENODEV; |
@@ -1975,8 +1976,11 @@ static int __init rs_init(void) | |||
1975 | * We request SERDAT and SERPER only, because the serial registers are | 1976 | * We request SERDAT and SERPER only, because the serial registers are |
1976 | * too spreaded over the custom register space | 1977 | * too spreaded over the custom register space |
1977 | */ | 1978 | */ |
1978 | if (!request_mem_region(CUSTOM_PHYSADDR+0x30, 4, "amiserial [Paula]")) | 1979 | if (!request_mem_region(CUSTOM_PHYSADDR+0x30, 4, |
1979 | return -EBUSY; | 1980 | "amiserial [Paula]")) { |
1981 | error = -EBUSY; | ||
1982 | goto fail_put_tty_driver; | ||
1983 | } | ||
1980 | 1984 | ||
1981 | IRQ_ports = NULL; | 1985 | IRQ_ports = NULL; |
1982 | 1986 | ||
@@ -1997,8 +2001,9 @@ static int __init rs_init(void) | |||
1997 | serial_driver->flags = TTY_DRIVER_REAL_RAW; | 2001 | serial_driver->flags = TTY_DRIVER_REAL_RAW; |
1998 | tty_set_operations(serial_driver, &serial_ops); | 2002 | tty_set_operations(serial_driver, &serial_ops); |
1999 | 2003 | ||
2000 | if (tty_register_driver(serial_driver)) | 2004 | error = tty_register_driver(serial_driver); |
2001 | panic("Couldn't register serial driver\n"); | 2005 | if (error) |
2006 | goto fail_release_mem_region; | ||
2002 | 2007 | ||
2003 | state = rs_table; | 2008 | state = rs_table; |
2004 | state->magic = SSTATE_MAGIC; | 2009 | state->magic = SSTATE_MAGIC; |
@@ -2024,8 +2029,14 @@ static int __init rs_init(void) | |||
2024 | local_irq_save(flags); | 2029 | local_irq_save(flags); |
2025 | 2030 | ||
2026 | /* set ISRs, and then disable the rx interrupts */ | 2031 | /* set ISRs, and then disable the rx interrupts */ |
2027 | request_irq(IRQ_AMIGA_TBE, ser_tx_int, 0, "serial TX", state); | 2032 | error = request_irq(IRQ_AMIGA_TBE, ser_tx_int, 0, "serial TX", state); |
2028 | request_irq(IRQ_AMIGA_RBF, ser_rx_int, IRQF_DISABLED, "serial RX", state); | 2033 | if (error) |
2034 | goto fail_unregister; | ||
2035 | |||
2036 | error = request_irq(IRQ_AMIGA_RBF, ser_rx_int, IRQF_DISABLED, | ||
2037 | "serial RX", state); | ||
2038 | if (error) | ||
2039 | goto fail_free_irq; | ||
2029 | 2040 | ||
2030 | /* turn off Rx and Tx interrupts */ | 2041 | /* turn off Rx and Tx interrupts */ |
2031 | custom.intena = IF_RBF | IF_TBE; | 2042 | custom.intena = IF_RBF | IF_TBE; |
@@ -2045,6 +2056,16 @@ static int __init rs_init(void) | |||
2045 | ciab.ddra &= ~(SER_DCD | SER_CTS | SER_DSR); /* inputs */ | 2056 | ciab.ddra &= ~(SER_DCD | SER_CTS | SER_DSR); /* inputs */ |
2046 | 2057 | ||
2047 | return 0; | 2058 | return 0; |
2059 | |||
2060 | fail_free_irq: | ||
2061 | free_irq(IRQ_AMIGA_TBE, state); | ||
2062 | fail_unregister: | ||
2063 | tty_unregister_driver(serial_driver); | ||
2064 | fail_release_mem_region: | ||
2065 | release_mem_region(CUSTOM_PHYSADDR+0x30, 4); | ||
2066 | fail_put_tty_driver: | ||
2067 | put_tty_driver(serial_driver); | ||
2068 | return error; | ||
2048 | } | 2069 | } |
2049 | 2070 | ||
2050 | static __exit void rs_exit(void) | 2071 | static __exit void rs_exit(void) |
@@ -2064,6 +2085,9 @@ static __exit void rs_exit(void) | |||
2064 | kfree(info); | 2085 | kfree(info); |
2065 | } | 2086 | } |
2066 | 2087 | ||
2088 | free_irq(IRQ_AMIGA_TBE, rs_table); | ||
2089 | free_irq(IRQ_AMIGA_RBF, rs_table); | ||
2090 | |||
2067 | release_mem_region(CUSTOM_PHYSADDR+0x30, 4); | 2091 | release_mem_region(CUSTOM_PHYSADDR+0x30, 4); |
2068 | } | 2092 | } |
2069 | 2093 | ||
diff --git a/drivers/char/ser_a2232.c b/drivers/char/ser_a2232.c index 33872a219df6..33a2b531802e 100644 --- a/drivers/char/ser_a2232.c +++ b/drivers/char/ser_a2232.c | |||
@@ -718,6 +718,7 @@ static int __init a2232board_init(void) | |||
718 | u_char *from; | 718 | u_char *from; |
719 | volatile u_char *to; | 719 | volatile u_char *to; |
720 | volatile struct a2232memory *mem; | 720 | volatile struct a2232memory *mem; |
721 | int error, i; | ||
721 | 722 | ||
722 | #ifdef CONFIG_SMP | 723 | #ifdef CONFIG_SMP |
723 | return -ENODEV; /* This driver is not SMP aware. Is there an SMP ZorroII-bus-machine? */ | 724 | return -ENODEV; /* This driver is not SMP aware. Is there an SMP ZorroII-bus-machine? */ |
@@ -797,8 +798,15 @@ static int __init a2232board_init(void) | |||
797 | */ | 798 | */ |
798 | if (a2232_init_drivers()) return -ENODEV; // maybe we should use a different -Exxx? | 799 | if (a2232_init_drivers()) return -ENODEV; // maybe we should use a different -Exxx? |
799 | 800 | ||
800 | request_irq(IRQ_AMIGA_VERTB, a2232_vbl_inter, 0, "A2232 serial VBL", a2232_driver_ID); | 801 | error = request_irq(IRQ_AMIGA_VERTB, a2232_vbl_inter, 0, |
801 | return 0; | 802 | "A2232 serial VBL", a2232_driver_ID); |
803 | if (error) { | ||
804 | for (i = 0; i < nr_a2232; i++) | ||
805 | zorro_release_device(zd_a2232[i]); | ||
806 | tty_unregister_driver(a2232_driver); | ||
807 | put_tty_driver(a2232_driver); | ||
808 | } | ||
809 | return error; | ||
802 | } | 810 | } |
803 | 811 | ||
804 | static void __exit a2232board_exit(void) | 812 | static void __exit a2232board_exit(void) |
diff --git a/drivers/char/vme_scc.c b/drivers/char/vme_scc.c index 0e8234bd0e19..994e1a58b987 100644 --- a/drivers/char/vme_scc.c +++ b/drivers/char/vme_scc.c | |||
@@ -198,6 +198,7 @@ static void scc_init_portstructs(void) | |||
198 | static int mvme147_scc_init(void) | 198 | static int mvme147_scc_init(void) |
199 | { | 199 | { |
200 | struct scc_port *port; | 200 | struct scc_port *port; |
201 | int error; | ||
201 | 202 | ||
202 | printk(KERN_INFO "SCC: MVME147 Serial Driver\n"); | 203 | printk(KERN_INFO "SCC: MVME147 Serial Driver\n"); |
203 | /* Init channel A */ | 204 | /* Init channel A */ |
@@ -207,14 +208,23 @@ static int mvme147_scc_init(void) | |||
207 | port->datap = port->ctrlp + 1; | 208 | port->datap = port->ctrlp + 1; |
208 | port->port_a = &scc_ports[0]; | 209 | port->port_a = &scc_ports[0]; |
209 | port->port_b = &scc_ports[1]; | 210 | port->port_b = &scc_ports[1]; |
210 | request_irq(MVME147_IRQ_SCCA_TX, scc_tx_int, IRQF_DISABLED, | 211 | error = request_irq(MVME147_IRQ_SCCA_TX, scc_tx_int, IRQF_DISABLED, |
211 | "SCC-A TX", port); | 212 | "SCC-A TX", port); |
212 | request_irq(MVME147_IRQ_SCCA_STAT, scc_stat_int, IRQF_DISABLED, | 213 | if (error) |
214 | goto fail; | ||
215 | error = request_irq(MVME147_IRQ_SCCA_STAT, scc_stat_int, IRQF_DISABLED, | ||
213 | "SCC-A status", port); | 216 | "SCC-A status", port); |
214 | request_irq(MVME147_IRQ_SCCA_RX, scc_rx_int, IRQF_DISABLED, | 217 | if (error) |
218 | goto fail_free_a_tx; | ||
219 | error = request_irq(MVME147_IRQ_SCCA_RX, scc_rx_int, IRQF_DISABLED, | ||
215 | "SCC-A RX", port); | 220 | "SCC-A RX", port); |
216 | request_irq(MVME147_IRQ_SCCA_SPCOND, scc_spcond_int, IRQF_DISABLED, | 221 | if (error) |
217 | "SCC-A special cond", port); | 222 | goto fail_free_a_stat; |
223 | error = request_irq(MVME147_IRQ_SCCA_SPCOND, scc_spcond_int, | ||
224 | IRQF_DISABLED, "SCC-A special cond", port); | ||
225 | if (error) | ||
226 | goto fail_free_a_rx; | ||
227 | |||
218 | { | 228 | { |
219 | SCC_ACCESS_INIT(port); | 229 | SCC_ACCESS_INIT(port); |
220 | 230 | ||
@@ -234,14 +244,23 @@ static int mvme147_scc_init(void) | |||
234 | port->datap = port->ctrlp + 1; | 244 | port->datap = port->ctrlp + 1; |
235 | port->port_a = &scc_ports[0]; | 245 | port->port_a = &scc_ports[0]; |
236 | port->port_b = &scc_ports[1]; | 246 | port->port_b = &scc_ports[1]; |
237 | request_irq(MVME147_IRQ_SCCB_TX, scc_tx_int, IRQF_DISABLED, | 247 | error = request_irq(MVME147_IRQ_SCCB_TX, scc_tx_int, IRQF_DISABLED, |
238 | "SCC-B TX", port); | 248 | "SCC-B TX", port); |
239 | request_irq(MVME147_IRQ_SCCB_STAT, scc_stat_int, IRQF_DISABLED, | 249 | if (error) |
250 | goto fail_free_a_spcond; | ||
251 | error = request_irq(MVME147_IRQ_SCCB_STAT, scc_stat_int, IRQF_DISABLED, | ||
240 | "SCC-B status", port); | 252 | "SCC-B status", port); |
241 | request_irq(MVME147_IRQ_SCCB_RX, scc_rx_int, IRQF_DISABLED, | 253 | if (error) |
254 | goto fail_free_b_tx; | ||
255 | error = request_irq(MVME147_IRQ_SCCB_RX, scc_rx_int, IRQF_DISABLED, | ||
242 | "SCC-B RX", port); | 256 | "SCC-B RX", port); |
243 | request_irq(MVME147_IRQ_SCCB_SPCOND, scc_spcond_int, IRQF_DISABLED, | 257 | if (error) |
244 | "SCC-B special cond", port); | 258 | goto fail_free_b_stat; |
259 | error = request_irq(MVME147_IRQ_SCCB_SPCOND, scc_spcond_int, | ||
260 | IRQF_DISABLED, "SCC-B special cond", port); | ||
261 | if (error) | ||
262 | goto fail_free_b_rx; | ||
263 | |||
245 | { | 264 | { |
246 | SCC_ACCESS_INIT(port); | 265 | SCC_ACCESS_INIT(port); |
247 | 266 | ||
@@ -257,6 +276,23 @@ static int mvme147_scc_init(void) | |||
257 | scc_init_drivers(); | 276 | scc_init_drivers(); |
258 | 277 | ||
259 | return 0; | 278 | return 0; |
279 | |||
280 | fail_free_b_rx: | ||
281 | free_irq(MVME147_IRQ_SCCB_RX, port); | ||
282 | fail_free_b_stat: | ||
283 | free_irq(MVME147_IRQ_SCCB_STAT, port); | ||
284 | fail_free_b_tx: | ||
285 | free_irq(MVME147_IRQ_SCCB_TX, port); | ||
286 | fail_free_a_spcond: | ||
287 | free_irq(MVME147_IRQ_SCCA_SPCOND, port); | ||
288 | fail_free_a_rx: | ||
289 | free_irq(MVME147_IRQ_SCCA_RX, port); | ||
290 | fail_free_a_stat: | ||
291 | free_irq(MVME147_IRQ_SCCA_STAT, port); | ||
292 | fail_free_a_tx: | ||
293 | free_irq(MVME147_IRQ_SCCA_TX, port); | ||
294 | fail: | ||
295 | return error; | ||
260 | } | 296 | } |
261 | #endif | 297 | #endif |
262 | 298 | ||
@@ -265,6 +301,7 @@ static int mvme147_scc_init(void) | |||
265 | static int mvme162_scc_init(void) | 301 | static int mvme162_scc_init(void) |
266 | { | 302 | { |
267 | struct scc_port *port; | 303 | struct scc_port *port; |
304 | int error; | ||
268 | 305 | ||
269 | if (!(mvme16x_config & MVME16x_CONFIG_GOT_SCCA)) | 306 | if (!(mvme16x_config & MVME16x_CONFIG_GOT_SCCA)) |
270 | return (-ENODEV); | 307 | return (-ENODEV); |
@@ -277,14 +314,23 @@ static int mvme162_scc_init(void) | |||
277 | port->datap = port->ctrlp + 2; | 314 | port->datap = port->ctrlp + 2; |
278 | port->port_a = &scc_ports[0]; | 315 | port->port_a = &scc_ports[0]; |
279 | port->port_b = &scc_ports[1]; | 316 | port->port_b = &scc_ports[1]; |
280 | request_irq(MVME162_IRQ_SCCA_TX, scc_tx_int, IRQF_DISABLED, | 317 | error = request_irq(MVME162_IRQ_SCCA_TX, scc_tx_int, IRQF_DISABLED, |
281 | "SCC-A TX", port); | 318 | "SCC-A TX", port); |
282 | request_irq(MVME162_IRQ_SCCA_STAT, scc_stat_int, IRQF_DISABLED, | 319 | if (error) |
320 | goto fail; | ||
321 | error = request_irq(MVME162_IRQ_SCCA_STAT, scc_stat_int, IRQF_DISABLED, | ||
283 | "SCC-A status", port); | 322 | "SCC-A status", port); |
284 | request_irq(MVME162_IRQ_SCCA_RX, scc_rx_int, IRQF_DISABLED, | 323 | if (error) |
324 | goto fail_free_a_tx; | ||
325 | error = request_irq(MVME162_IRQ_SCCA_RX, scc_rx_int, IRQF_DISABLED, | ||
285 | "SCC-A RX", port); | 326 | "SCC-A RX", port); |
286 | request_irq(MVME162_IRQ_SCCA_SPCOND, scc_spcond_int, IRQF_DISABLED, | 327 | if (error) |
287 | "SCC-A special cond", port); | 328 | goto fail_free_a_stat; |
329 | error = request_irq(MVME162_IRQ_SCCA_SPCOND, scc_spcond_int, | ||
330 | IRQF_DISABLED, "SCC-A special cond", port); | ||
331 | if (error) | ||
332 | goto fail_free_a_rx; | ||
333 | |||
288 | { | 334 | { |
289 | SCC_ACCESS_INIT(port); | 335 | SCC_ACCESS_INIT(port); |
290 | 336 | ||
@@ -304,14 +350,22 @@ static int mvme162_scc_init(void) | |||
304 | port->datap = port->ctrlp + 2; | 350 | port->datap = port->ctrlp + 2; |
305 | port->port_a = &scc_ports[0]; | 351 | port->port_a = &scc_ports[0]; |
306 | port->port_b = &scc_ports[1]; | 352 | port->port_b = &scc_ports[1]; |
307 | request_irq(MVME162_IRQ_SCCB_TX, scc_tx_int, IRQF_DISABLED, | 353 | error = request_irq(MVME162_IRQ_SCCB_TX, scc_tx_int, IRQF_DISABLED, |
308 | "SCC-B TX", port); | 354 | "SCC-B TX", port); |
309 | request_irq(MVME162_IRQ_SCCB_STAT, scc_stat_int, IRQF_DISABLED, | 355 | if (error) |
356 | goto fail_free_a_spcond; | ||
357 | error = request_irq(MVME162_IRQ_SCCB_STAT, scc_stat_int, IRQF_DISABLED, | ||
310 | "SCC-B status", port); | 358 | "SCC-B status", port); |
311 | request_irq(MVME162_IRQ_SCCB_RX, scc_rx_int, IRQF_DISABLED, | 359 | if (error) |
360 | goto fail_free_b_tx; | ||
361 | error = request_irq(MVME162_IRQ_SCCB_RX, scc_rx_int, IRQF_DISABLED, | ||
312 | "SCC-B RX", port); | 362 | "SCC-B RX", port); |
313 | request_irq(MVME162_IRQ_SCCB_SPCOND, scc_spcond_int, IRQF_DISABLED, | 363 | if (error) |
314 | "SCC-B special cond", port); | 364 | goto fail_free_b_stat; |
365 | error = request_irq(MVME162_IRQ_SCCB_SPCOND, scc_spcond_int, | ||
366 | IRQF_DISABLED, "SCC-B special cond", port); | ||
367 | if (error) | ||
368 | goto fail_free_b_rx; | ||
315 | 369 | ||
316 | { | 370 | { |
317 | SCC_ACCESS_INIT(port); /* Either channel will do */ | 371 | SCC_ACCESS_INIT(port); /* Either channel will do */ |
@@ -328,6 +382,23 @@ static int mvme162_scc_init(void) | |||
328 | scc_init_drivers(); | 382 | scc_init_drivers(); |
329 | 383 | ||
330 | return 0; | 384 | return 0; |
385 | |||
386 | fail_free_b_rx: | ||
387 | free_irq(MVME162_IRQ_SCCB_RX, port); | ||
388 | fail_free_b_stat: | ||
389 | free_irq(MVME162_IRQ_SCCB_STAT, port); | ||
390 | fail_free_b_tx: | ||
391 | free_irq(MVME162_IRQ_SCCB_TX, port); | ||
392 | fail_free_a_spcond: | ||
393 | free_irq(MVME162_IRQ_SCCA_SPCOND, port); | ||
394 | fail_free_a_rx: | ||
395 | free_irq(MVME162_IRQ_SCCA_RX, port); | ||
396 | fail_free_a_stat: | ||
397 | free_irq(MVME162_IRQ_SCCA_STAT, port); | ||
398 | fail_free_a_tx: | ||
399 | free_irq(MVME162_IRQ_SCCA_TX, port); | ||
400 | fail: | ||
401 | return error; | ||
331 | } | 402 | } |
332 | #endif | 403 | #endif |
333 | 404 | ||
@@ -336,6 +407,7 @@ static int mvme162_scc_init(void) | |||
336 | static int bvme6000_scc_init(void) | 407 | static int bvme6000_scc_init(void) |
337 | { | 408 | { |
338 | struct scc_port *port; | 409 | struct scc_port *port; |
410 | int error; | ||
339 | 411 | ||
340 | printk(KERN_INFO "SCC: BVME6000 Serial Driver\n"); | 412 | printk(KERN_INFO "SCC: BVME6000 Serial Driver\n"); |
341 | /* Init channel A */ | 413 | /* Init channel A */ |
@@ -345,14 +417,23 @@ static int bvme6000_scc_init(void) | |||
345 | port->datap = port->ctrlp + 4; | 417 | port->datap = port->ctrlp + 4; |
346 | port->port_a = &scc_ports[0]; | 418 | port->port_a = &scc_ports[0]; |
347 | port->port_b = &scc_ports[1]; | 419 | port->port_b = &scc_ports[1]; |
348 | request_irq(BVME_IRQ_SCCA_TX, scc_tx_int, IRQF_DISABLED, | 420 | error = request_irq(BVME_IRQ_SCCA_TX, scc_tx_int, IRQF_DISABLED, |
349 | "SCC-A TX", port); | 421 | "SCC-A TX", port); |
350 | request_irq(BVME_IRQ_SCCA_STAT, scc_stat_int, IRQF_DISABLED, | 422 | if (error) |
423 | goto fail; | ||
424 | error = request_irq(BVME_IRQ_SCCA_STAT, scc_stat_int, IRQF_DISABLED, | ||
351 | "SCC-A status", port); | 425 | "SCC-A status", port); |
352 | request_irq(BVME_IRQ_SCCA_RX, scc_rx_int, IRQF_DISABLED, | 426 | if (error) |
427 | goto fail_free_a_tx; | ||
428 | error = request_irq(BVME_IRQ_SCCA_RX, scc_rx_int, IRQF_DISABLED, | ||
353 | "SCC-A RX", port); | 429 | "SCC-A RX", port); |
354 | request_irq(BVME_IRQ_SCCA_SPCOND, scc_spcond_int, IRQF_DISABLED, | 430 | if (error) |
355 | "SCC-A special cond", port); | 431 | goto fail_free_a_stat; |
432 | error = request_irq(BVME_IRQ_SCCA_SPCOND, scc_spcond_int, | ||
433 | IRQF_DISABLED, "SCC-A special cond", port); | ||
434 | if (error) | ||
435 | goto fail_free_a_rx; | ||
436 | |||
356 | { | 437 | { |
357 | SCC_ACCESS_INIT(port); | 438 | SCC_ACCESS_INIT(port); |
358 | 439 | ||
@@ -372,14 +453,22 @@ static int bvme6000_scc_init(void) | |||
372 | port->datap = port->ctrlp + 4; | 453 | port->datap = port->ctrlp + 4; |
373 | port->port_a = &scc_ports[0]; | 454 | port->port_a = &scc_ports[0]; |
374 | port->port_b = &scc_ports[1]; | 455 | port->port_b = &scc_ports[1]; |
375 | request_irq(BVME_IRQ_SCCB_TX, scc_tx_int, IRQF_DISABLED, | 456 | error = request_irq(BVME_IRQ_SCCB_TX, scc_tx_int, IRQF_DISABLED, |
376 | "SCC-B TX", port); | 457 | "SCC-B TX", port); |
377 | request_irq(BVME_IRQ_SCCB_STAT, scc_stat_int, IRQF_DISABLED, | 458 | if (error) |
459 | goto fail_free_a_spcond; | ||
460 | error = request_irq(BVME_IRQ_SCCB_STAT, scc_stat_int, IRQF_DISABLED, | ||
378 | "SCC-B status", port); | 461 | "SCC-B status", port); |
379 | request_irq(BVME_IRQ_SCCB_RX, scc_rx_int, IRQF_DISABLED, | 462 | if (error) |
463 | goto fail_free_b_tx; | ||
464 | error = request_irq(BVME_IRQ_SCCB_RX, scc_rx_int, IRQF_DISABLED, | ||
380 | "SCC-B RX", port); | 465 | "SCC-B RX", port); |
381 | request_irq(BVME_IRQ_SCCB_SPCOND, scc_spcond_int, IRQF_DISABLED, | 466 | if (error) |
382 | "SCC-B special cond", port); | 467 | goto fail_free_b_stat; |
468 | error = request_irq(BVME_IRQ_SCCB_SPCOND, scc_spcond_int, | ||
469 | IRQF_DISABLED, "SCC-B special cond", port); | ||
470 | if (error) | ||
471 | goto fail_free_b_rx; | ||
383 | 472 | ||
384 | { | 473 | { |
385 | SCC_ACCESS_INIT(port); /* Either channel will do */ | 474 | SCC_ACCESS_INIT(port); /* Either channel will do */ |
@@ -393,6 +482,23 @@ static int bvme6000_scc_init(void) | |||
393 | scc_init_drivers(); | 482 | scc_init_drivers(); |
394 | 483 | ||
395 | return 0; | 484 | return 0; |
485 | |||
486 | fail: | ||
487 | free_irq(BVME_IRQ_SCCA_STAT, port); | ||
488 | fail_free_a_tx: | ||
489 | free_irq(BVME_IRQ_SCCA_RX, port); | ||
490 | fail_free_a_stat: | ||
491 | free_irq(BVME_IRQ_SCCA_SPCOND, port); | ||
492 | fail_free_a_rx: | ||
493 | free_irq(BVME_IRQ_SCCB_TX, port); | ||
494 | fail_free_a_spcond: | ||
495 | free_irq(BVME_IRQ_SCCB_STAT, port); | ||
496 | fail_free_b_tx: | ||
497 | free_irq(BVME_IRQ_SCCB_RX, port); | ||
498 | fail_free_b_stat: | ||
499 | free_irq(BVME_IRQ_SCCB_SPCOND, port); | ||
500 | fail_free_b_rx: | ||
501 | return error; | ||
396 | } | 502 | } |
397 | #endif | 503 | #endif |
398 | 504 | ||
diff --git a/drivers/dio/dio-sysfs.c b/drivers/dio/dio-sysfs.c index f46463038847..ee1a3b59bd4e 100644 --- a/drivers/dio/dio-sysfs.c +++ b/drivers/dio/dio-sysfs.c | |||
@@ -58,20 +58,25 @@ static ssize_t dio_show_resource(struct device *dev, struct device_attribute *at | |||
58 | struct dio_dev *d = to_dio_dev(dev); | 58 | struct dio_dev *d = to_dio_dev(dev); |
59 | 59 | ||
60 | return sprintf(buf, "0x%08lx 0x%08lx 0x%08lx\n", | 60 | return sprintf(buf, "0x%08lx 0x%08lx 0x%08lx\n", |
61 | dio_resource_start(d), dio_resource_end(d), | 61 | (unsigned long)dio_resource_start(d), |
62 | (unsigned long)dio_resource_end(d), | ||
62 | dio_resource_flags(d)); | 63 | dio_resource_flags(d)); |
63 | } | 64 | } |
64 | static DEVICE_ATTR(resource, S_IRUGO, dio_show_resource, NULL); | 65 | static DEVICE_ATTR(resource, S_IRUGO, dio_show_resource, NULL); |
65 | 66 | ||
66 | void dio_create_sysfs_dev_files(struct dio_dev *d) | 67 | int dio_create_sysfs_dev_files(struct dio_dev *d) |
67 | { | 68 | { |
68 | struct device *dev = &d->dev; | 69 | struct device *dev = &d->dev; |
70 | int error; | ||
69 | 71 | ||
70 | /* current configuration's attributes */ | 72 | /* current configuration's attributes */ |
71 | device_create_file(dev, &dev_attr_id); | 73 | if ((error = device_create_file(dev, &dev_attr_id)) || |
72 | device_create_file(dev, &dev_attr_ipl); | 74 | (error = device_create_file(dev, &dev_attr_ipl)) || |
73 | device_create_file(dev, &dev_attr_secid); | 75 | (error = device_create_file(dev, &dev_attr_secid)) || |
74 | device_create_file(dev, &dev_attr_name); | 76 | (error = device_create_file(dev, &dev_attr_name)) || |
75 | device_create_file(dev, &dev_attr_resource); | 77 | (error = device_create_file(dev, &dev_attr_resource))) |
78 | return error; | ||
79 | |||
80 | return 0; | ||
76 | } | 81 | } |
77 | 82 | ||
diff --git a/drivers/dio/dio.c b/drivers/dio/dio.c index 07f274f853d9..10c3c498358c 100644 --- a/drivers/dio/dio.c +++ b/drivers/dio/dio.c | |||
@@ -173,6 +173,7 @@ static int __init dio_init(void) | |||
173 | mm_segment_t fs; | 173 | mm_segment_t fs; |
174 | int i; | 174 | int i; |
175 | struct dio_dev *dev; | 175 | struct dio_dev *dev; |
176 | int error; | ||
176 | 177 | ||
177 | if (!MACH_IS_HP300) | 178 | if (!MACH_IS_HP300) |
178 | return 0; | 179 | return 0; |
@@ -182,7 +183,11 @@ static int __init dio_init(void) | |||
182 | /* Initialize the DIO bus */ | 183 | /* Initialize the DIO bus */ |
183 | INIT_LIST_HEAD(&dio_bus.devices); | 184 | INIT_LIST_HEAD(&dio_bus.devices); |
184 | strcpy(dio_bus.dev.bus_id, "dio"); | 185 | strcpy(dio_bus.dev.bus_id, "dio"); |
185 | device_register(&dio_bus.dev); | 186 | error = device_register(&dio_bus.dev); |
187 | if (error) { | ||
188 | pr_err("DIO: Error registering dio_bus\n"); | ||
189 | return error; | ||
190 | } | ||
186 | 191 | ||
187 | /* Request all resources */ | 192 | /* Request all resources */ |
188 | dio_bus.num_resources = (hp300_model == HP_320 ? 1 : 2); | 193 | dio_bus.num_resources = (hp300_model == HP_320 ? 1 : 2); |
@@ -252,8 +257,15 @@ static int __init dio_init(void) | |||
252 | 257 | ||
253 | if (scode >= DIOII_SCBASE) | 258 | if (scode >= DIOII_SCBASE) |
254 | iounmap(va); | 259 | iounmap(va); |
255 | device_register(&dev->dev); | 260 | error = device_register(&dev->dev); |
256 | dio_create_sysfs_dev_files(dev); | 261 | if (error) { |
262 | pr_err("DIO: Error registering device %s\n", | ||
263 | dev->name); | ||
264 | continue; | ||
265 | } | ||
266 | error = dio_create_sysfs_dev_files(dev); | ||
267 | if (error) | ||
268 | dev_err(&dev->dev, "Error creating sysfs files\n"); | ||
257 | } | 269 | } |
258 | return 0; | 270 | return 0; |
259 | } | 271 | } |
diff --git a/drivers/video/Makefile b/drivers/video/Makefile index e39e33e797da..be2b657546ef 100644 --- a/drivers/video/Makefile +++ b/drivers/video/Makefile | |||
@@ -28,7 +28,7 @@ obj-$(CONFIG_FB_DDC) += fb_ddc.o | |||
28 | obj-$(CONFIG_FB_DEFERRED_IO) += fb_defio.o | 28 | obj-$(CONFIG_FB_DEFERRED_IO) += fb_defio.o |
29 | 29 | ||
30 | # Hardware specific drivers go first | 30 | # Hardware specific drivers go first |
31 | obj-$(CONFIG_FB_AMIGA) += amifb.o c2p.o | 31 | obj-$(CONFIG_FB_AMIGA) += amifb.o c2p_planar.o |
32 | obj-$(CONFIG_FB_ARC) += arcfb.o | 32 | obj-$(CONFIG_FB_ARC) += arcfb.o |
33 | obj-$(CONFIG_FB_CLPS711X) += clps711xfb.o | 33 | obj-$(CONFIG_FB_CLPS711X) += clps711xfb.o |
34 | obj-$(CONFIG_FB_CYBER2000) += cyber2000fb.o | 34 | obj-$(CONFIG_FB_CYBER2000) += cyber2000fb.o |
@@ -72,7 +72,7 @@ obj-$(CONFIG_FB_TCX) += tcx.o sbuslib.o | |||
72 | obj-$(CONFIG_FB_LEO) += leo.o sbuslib.o | 72 | obj-$(CONFIG_FB_LEO) += leo.o sbuslib.o |
73 | obj-$(CONFIG_FB_SGIVW) += sgivwfb.o | 73 | obj-$(CONFIG_FB_SGIVW) += sgivwfb.o |
74 | obj-$(CONFIG_FB_ACORN) += acornfb.o | 74 | obj-$(CONFIG_FB_ACORN) += acornfb.o |
75 | obj-$(CONFIG_FB_ATARI) += atafb.o c2p.o atafb_mfb.o \ | 75 | obj-$(CONFIG_FB_ATARI) += atafb.o c2p_iplan2.o atafb_mfb.o \ |
76 | atafb_iplan2p2.o atafb_iplan2p4.o atafb_iplan2p8.o | 76 | atafb_iplan2p2.o atafb_iplan2p4.o atafb_iplan2p8.o |
77 | obj-$(CONFIG_FB_MAC) += macfb.o | 77 | obj-$(CONFIG_FB_MAC) += macfb.o |
78 | obj-$(CONFIG_FB_HECUBA) += hecubafb.o | 78 | obj-$(CONFIG_FB_HECUBA) += hecubafb.o |
diff --git a/drivers/video/amifb.c b/drivers/video/amifb.c index b8e9a8682f2d..100f23661465 100644 --- a/drivers/video/amifb.c +++ b/drivers/video/amifb.c | |||
@@ -2159,9 +2159,9 @@ static void amifb_imageblit(struct fb_info *info, const struct fb_image *image) | |||
2159 | src += pitch; | 2159 | src += pitch; |
2160 | } | 2160 | } |
2161 | } else { | 2161 | } else { |
2162 | c2p(info->screen_base, image->data, dx, dy, width, height, | 2162 | c2p_planar(info->screen_base, image->data, dx, dy, width, |
2163 | par->next_line, par->next_plane, image->width, | 2163 | height, par->next_line, par->next_plane, |
2164 | info->var.bits_per_pixel); | 2164 | image->width, info->var.bits_per_pixel); |
2165 | } | 2165 | } |
2166 | } | 2166 | } |
2167 | 2167 | ||
diff --git a/drivers/video/atafb.c b/drivers/video/atafb.c index 77eb8b34fbfa..8058572a7428 100644 --- a/drivers/video/atafb.c +++ b/drivers/video/atafb.c | |||
@@ -122,7 +122,6 @@ static struct atafb_par { | |||
122 | void *screen_base; | 122 | void *screen_base; |
123 | int yres_virtual; | 123 | int yres_virtual; |
124 | u_long next_line; | 124 | u_long next_line; |
125 | u_long next_plane; | ||
126 | #if defined ATAFB_TT || defined ATAFB_STE | 125 | #if defined ATAFB_TT || defined ATAFB_STE |
127 | union { | 126 | union { |
128 | struct { | 127 | struct { |
@@ -149,6 +148,7 @@ static struct atafb_par { | |||
149 | short mono; | 148 | short mono; |
150 | short ste_mode; | 149 | short ste_mode; |
151 | short bpp; | 150 | short bpp; |
151 | u32 pseudo_palette[16]; | ||
152 | } falcon; | 152 | } falcon; |
153 | #endif | 153 | #endif |
154 | /* Nothing needed for external mode */ | 154 | /* Nothing needed for external mode */ |
@@ -614,7 +614,7 @@ static int tt_encode_fix(struct fb_fix_screeninfo *fix, struct atafb_par *par) | |||
614 | fix->xpanstep = 0; | 614 | fix->xpanstep = 0; |
615 | fix->ypanstep = 1; | 615 | fix->ypanstep = 1; |
616 | fix->ywrapstep = 0; | 616 | fix->ywrapstep = 0; |
617 | fix->line_length = 0; | 617 | fix->line_length = par->next_line; |
618 | fix->accel = FB_ACCEL_ATARIBLITT; | 618 | fix->accel = FB_ACCEL_ATARIBLITT; |
619 | return 0; | 619 | return 0; |
620 | } | 620 | } |
@@ -691,6 +691,7 @@ static int tt_decode_var(struct fb_var_screeninfo *var, struct atafb_par *par) | |||
691 | return -EINVAL; | 691 | return -EINVAL; |
692 | par->yres_virtual = yres_virtual; | 692 | par->yres_virtual = yres_virtual; |
693 | par->screen_base = screen_base + var->yoffset * linelen; | 693 | par->screen_base = screen_base + var->yoffset * linelen; |
694 | par->next_line = linelen; | ||
694 | return 0; | 695 | return 0; |
695 | } | 696 | } |
696 | 697 | ||
@@ -884,10 +885,6 @@ static int vdl_prescale[4][3] = { | |||
884 | /* Default hsync timing [mon_type] in picoseconds */ | 885 | /* Default hsync timing [mon_type] in picoseconds */ |
885 | static long h_syncs[4] = { 3000000, 4875000, 4000000, 4875000 }; | 886 | static long h_syncs[4] = { 3000000, 4875000, 4000000, 4875000 }; |
886 | 887 | ||
887 | #ifdef FBCON_HAS_CFB16 | ||
888 | static u16 fbcon_cfb16_cmap[16]; | ||
889 | #endif | ||
890 | |||
891 | static inline int hxx_prescale(struct falcon_hw *hw) | 888 | static inline int hxx_prescale(struct falcon_hw *hw) |
892 | { | 889 | { |
893 | return hw->ste_mode ? 16 | 890 | return hw->ste_mode ? 16 |
@@ -918,7 +915,7 @@ static int falcon_encode_fix(struct fb_fix_screeninfo *fix, | |||
918 | fix->visual = FB_VISUAL_TRUECOLOR; | 915 | fix->visual = FB_VISUAL_TRUECOLOR; |
919 | fix->xpanstep = 2; | 916 | fix->xpanstep = 2; |
920 | } | 917 | } |
921 | fix->line_length = 0; | 918 | fix->line_length = par->next_line; |
922 | fix->accel = FB_ACCEL_ATARIBLITT; | 919 | fix->accel = FB_ACCEL_ATARIBLITT; |
923 | return 0; | 920 | return 0; |
924 | } | 921 | } |
@@ -1394,14 +1391,7 @@ set_screen_base: | |||
1394 | par->screen_base = screen_base + var->yoffset * linelen; | 1391 | par->screen_base = screen_base + var->yoffset * linelen; |
1395 | par->hw.falcon.xoffset = 0; | 1392 | par->hw.falcon.xoffset = 0; |
1396 | 1393 | ||
1397 | // FIXME!!! sort of works, no crash | ||
1398 | //par->next_line = linelen; | ||
1399 | //par->next_plane = yres_virtual * linelen; | ||
1400 | par->next_line = linelen; | 1394 | par->next_line = linelen; |
1401 | par->next_plane = 2; | ||
1402 | // crashes | ||
1403 | //par->next_plane = linelen; | ||
1404 | //par->next_line = yres_virtual * linelen; | ||
1405 | 1395 | ||
1406 | return 0; | 1396 | return 0; |
1407 | } | 1397 | } |
@@ -1735,10 +1725,10 @@ static int falcon_setcolreg(unsigned int regno, unsigned int red, | |||
1735 | (((red & 0xe000) >> 13) | ((red & 0x1000) >> 12) << 8) | | 1725 | (((red & 0xe000) >> 13) | ((red & 0x1000) >> 12) << 8) | |
1736 | (((green & 0xe000) >> 13) | ((green & 0x1000) >> 12) << 4) | | 1726 | (((green & 0xe000) >> 13) | ((green & 0x1000) >> 12) << 4) | |
1737 | ((blue & 0xe000) >> 13) | ((blue & 0x1000) >> 12); | 1727 | ((blue & 0xe000) >> 13) | ((blue & 0x1000) >> 12); |
1738 | #ifdef FBCON_HAS_CFB16 | 1728 | #ifdef ATAFB_FALCON |
1739 | fbcon_cfb16_cmap[regno] = ((red & 0xf800) | | 1729 | ((u32 *)info->pseudo_palette)[regno] = ((red & 0xf800) | |
1740 | ((green & 0xfc00) >> 5) | | 1730 | ((green & 0xfc00) >> 5) | |
1741 | ((blue & 0xf800) >> 11)); | 1731 | ((blue & 0xf800) >> 11)); |
1742 | #endif | 1732 | #endif |
1743 | } | 1733 | } |
1744 | return 0; | 1734 | return 0; |
@@ -1852,7 +1842,7 @@ static int stste_encode_fix(struct fb_fix_screeninfo *fix, | |||
1852 | fix->ypanstep = 0; | 1842 | fix->ypanstep = 0; |
1853 | } | 1843 | } |
1854 | fix->ywrapstep = 0; | 1844 | fix->ywrapstep = 0; |
1855 | fix->line_length = 0; | 1845 | fix->line_length = par->next_line; |
1856 | fix->accel = FB_ACCEL_ATARIBLITT; | 1846 | fix->accel = FB_ACCEL_ATARIBLITT; |
1857 | return 0; | 1847 | return 0; |
1858 | } | 1848 | } |
@@ -1910,6 +1900,7 @@ static int stste_decode_var(struct fb_var_screeninfo *var, | |||
1910 | return -EINVAL; | 1900 | return -EINVAL; |
1911 | par->yres_virtual = yres_virtual; | 1901 | par->yres_virtual = yres_virtual; |
1912 | par->screen_base = screen_base + var->yoffset * linelen; | 1902 | par->screen_base = screen_base + var->yoffset * linelen; |
1903 | par->next_line = linelen; | ||
1913 | return 0; | 1904 | return 0; |
1914 | } | 1905 | } |
1915 | 1906 | ||
@@ -2169,7 +2160,7 @@ static int ext_encode_fix(struct fb_fix_screeninfo *fix, struct atafb_par *par) | |||
2169 | fix->xpanstep = 0; | 2160 | fix->xpanstep = 0; |
2170 | fix->ypanstep = 0; | 2161 | fix->ypanstep = 0; |
2171 | fix->ywrapstep = 0; | 2162 | fix->ywrapstep = 0; |
2172 | fix->line_length = 0; | 2163 | fix->line_length = par->next_line; |
2173 | return 0; | 2164 | return 0; |
2174 | } | 2165 | } |
2175 | 2166 | ||
@@ -2184,6 +2175,8 @@ static int ext_decode_var(struct fb_var_screeninfo *var, struct atafb_par *par) | |||
2184 | var->xoffset > 0 || | 2175 | var->xoffset > 0 || |
2185 | var->yoffset > 0) | 2176 | var->yoffset > 0) |
2186 | return -EINVAL; | 2177 | return -EINVAL; |
2178 | |||
2179 | par->next_line = external_xres_virtual * external_depth / 8; | ||
2187 | return 0; | 2180 | return 0; |
2188 | } | 2181 | } |
2189 | 2182 | ||
@@ -2443,42 +2436,6 @@ static void atafb_set_disp(struct fb_info *info) | |||
2443 | atafb_get_fix(&info->fix, info); | 2436 | atafb_get_fix(&info->fix, info); |
2444 | 2437 | ||
2445 | info->screen_base = (void *)info->fix.smem_start; | 2438 | info->screen_base = (void *)info->fix.smem_start; |
2446 | |||
2447 | switch (info->fix.type) { | ||
2448 | case FB_TYPE_INTERLEAVED_PLANES: | ||
2449 | switch (info->var.bits_per_pixel) { | ||
2450 | case 2: | ||
2451 | // display->dispsw = &fbcon_iplan2p2; | ||
2452 | break; | ||
2453 | case 4: | ||
2454 | // display->dispsw = &fbcon_iplan2p4; | ||
2455 | break; | ||
2456 | case 8: | ||
2457 | // display->dispsw = &fbcon_iplan2p8; | ||
2458 | break; | ||
2459 | } | ||
2460 | break; | ||
2461 | case FB_TYPE_PACKED_PIXELS: | ||
2462 | switch (info->var.bits_per_pixel) { | ||
2463 | #ifdef FBCON_HAS_MFB | ||
2464 | case 1: | ||
2465 | // display->dispsw = &fbcon_mfb; | ||
2466 | break; | ||
2467 | #endif | ||
2468 | #ifdef FBCON_HAS_CFB8 | ||
2469 | case 8: | ||
2470 | // display->dispsw = &fbcon_cfb8; | ||
2471 | break; | ||
2472 | #endif | ||
2473 | #ifdef FBCON_HAS_CFB16 | ||
2474 | case 16: | ||
2475 | // display->dispsw = &fbcon_cfb16; | ||
2476 | // display->dispsw_data = fbcon_cfb16_cmap; | ||
2477 | break; | ||
2478 | #endif | ||
2479 | } | ||
2480 | break; | ||
2481 | } | ||
2482 | } | 2439 | } |
2483 | 2440 | ||
2484 | static int atafb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, | 2441 | static int atafb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, |
@@ -2549,6 +2506,13 @@ static void atafb_fillrect(struct fb_info *info, const struct fb_fillrect *rect) | |||
2549 | if (!rect->width || !rect->height) | 2506 | if (!rect->width || !rect->height) |
2550 | return; | 2507 | return; |
2551 | 2508 | ||
2509 | #ifdef ATAFB_FALCON | ||
2510 | if (info->var.bits_per_pixel == 16) { | ||
2511 | cfb_fillrect(info, rect); | ||
2512 | return; | ||
2513 | } | ||
2514 | #endif | ||
2515 | |||
2552 | /* | 2516 | /* |
2553 | * We could use hardware clipping but on many cards you get around | 2517 | * We could use hardware clipping but on many cards you get around |
2554 | * hardware clipping by writing to framebuffer directly. | 2518 | * hardware clipping by writing to framebuffer directly. |
@@ -2583,6 +2547,13 @@ static void atafb_copyarea(struct fb_info *info, const struct fb_copyarea *area) | |||
2583 | u32 dx, dy, sx, sy, width, height; | 2547 | u32 dx, dy, sx, sy, width, height; |
2584 | int rev_copy = 0; | 2548 | int rev_copy = 0; |
2585 | 2549 | ||
2550 | #ifdef ATAFB_FALCON | ||
2551 | if (info->var.bits_per_pixel == 16) { | ||
2552 | cfb_copyarea(info, area); | ||
2553 | return; | ||
2554 | } | ||
2555 | #endif | ||
2556 | |||
2586 | /* clip the destination */ | 2557 | /* clip the destination */ |
2587 | x2 = area->dx + area->width; | 2558 | x2 = area->dx + area->width; |
2588 | y2 = area->dy + area->height; | 2559 | y2 = area->dy + area->height; |
@@ -2632,6 +2603,13 @@ static void atafb_imageblit(struct fb_info *info, const struct fb_image *image) | |||
2632 | const char *src; | 2603 | const char *src; |
2633 | u32 dx, dy, width, height, pitch; | 2604 | u32 dx, dy, width, height, pitch; |
2634 | 2605 | ||
2606 | #ifdef ATAFB_FALCON | ||
2607 | if (info->var.bits_per_pixel == 16) { | ||
2608 | cfb_imageblit(info, image); | ||
2609 | return; | ||
2610 | } | ||
2611 | #endif | ||
2612 | |||
2635 | /* | 2613 | /* |
2636 | * We could use hardware clipping but on many cards you get around | 2614 | * We could use hardware clipping but on many cards you get around |
2637 | * hardware clipping by writing to framebuffer directly like we are | 2615 | * hardware clipping by writing to framebuffer directly like we are |
@@ -2676,10 +2654,9 @@ static void atafb_imageblit(struct fb_info *info, const struct fb_image *image) | |||
2676 | src += pitch; | 2654 | src += pitch; |
2677 | } | 2655 | } |
2678 | } else { | 2656 | } else { |
2679 | // only used for logo; broken | 2657 | c2p_iplan2(info->screen_base, image->data, dx, dy, width, |
2680 | c2p(info->screen_base, image->data, dx, dy, width, height, | 2658 | height, par->next_line, image->width, |
2681 | par->next_line, par->next_plane, image->width, | 2659 | info->var.bits_per_pixel); |
2682 | info->var.bits_per_pixel); | ||
2683 | } | 2660 | } |
2684 | } | 2661 | } |
2685 | 2662 | ||
@@ -3098,8 +3075,7 @@ int __init atafb_setup(char *options) | |||
3098 | 3075 | ||
3099 | int __init atafb_init(void) | 3076 | int __init atafb_init(void) |
3100 | { | 3077 | { |
3101 | int pad; | 3078 | int pad, detected_mode, error; |
3102 | int detected_mode; | ||
3103 | unsigned int defmode = 0; | 3079 | unsigned int defmode = 0; |
3104 | unsigned long mem_req; | 3080 | unsigned long mem_req; |
3105 | 3081 | ||
@@ -3139,8 +3115,12 @@ int __init atafb_init(void) | |||
3139 | printk("atafb_init: initializing Falcon hw\n"); | 3115 | printk("atafb_init: initializing Falcon hw\n"); |
3140 | fbhw = &falcon_switch; | 3116 | fbhw = &falcon_switch; |
3141 | atafb_ops.fb_setcolreg = &falcon_setcolreg; | 3117 | atafb_ops.fb_setcolreg = &falcon_setcolreg; |
3142 | request_irq(IRQ_AUTO_4, falcon_vbl_switcher, IRQ_TYPE_PRIO, | 3118 | error = request_irq(IRQ_AUTO_4, falcon_vbl_switcher, |
3143 | "framebuffer/modeswitch", falcon_vbl_switcher); | 3119 | IRQ_TYPE_PRIO, |
3120 | "framebuffer/modeswitch", | ||
3121 | falcon_vbl_switcher); | ||
3122 | if (error) | ||
3123 | return error; | ||
3144 | defmode = DEFMODE_F30; | 3124 | defmode = DEFMODE_F30; |
3145 | break; | 3125 | break; |
3146 | } | 3126 | } |
@@ -3225,6 +3205,10 @@ int __init atafb_init(void) | |||
3225 | // tries to read from HW which may not be initialized yet | 3205 | // tries to read from HW which may not be initialized yet |
3226 | // so set sane var first, then call atafb_set_par | 3206 | // so set sane var first, then call atafb_set_par |
3227 | atafb_get_var(&fb_info.var, &fb_info); | 3207 | atafb_get_var(&fb_info.var, &fb_info); |
3208 | |||
3209 | #ifdef ATAFB_FALCON | ||
3210 | fb_info.pseudo_palette = current_par.hw.falcon.pseudo_palette; | ||
3211 | #endif | ||
3228 | fb_info.flags = FBINFO_FLAG_DEFAULT; | 3212 | fb_info.flags = FBINFO_FLAG_DEFAULT; |
3229 | 3213 | ||
3230 | if (!fb_find_mode(&fb_info.var, &fb_info, mode_option, atafb_modedb, | 3214 | if (!fb_find_mode(&fb_info.var, &fb_info, mode_option, atafb_modedb, |
diff --git a/drivers/video/c2p.c b/drivers/video/c2p.c deleted file mode 100644 index 376bc07ff952..000000000000 --- a/drivers/video/c2p.c +++ /dev/null | |||
@@ -1,232 +0,0 @@ | |||
1 | /* | ||
2 | * Fast C2P (Chunky-to-Planar) Conversion | ||
3 | * | ||
4 | * Copyright (C) 2003 Geert Uytterhoeven | ||
5 | * | ||
6 | * NOTES: | ||
7 | * - This code was inspired by Scout's C2P tutorial | ||
8 | * - It assumes to run on a big endian system | ||
9 | * | ||
10 | * This file is subject to the terms and conditions of the GNU General Public | ||
11 | * License. See the file COPYING in the main directory of this archive | ||
12 | * for more details. | ||
13 | */ | ||
14 | |||
15 | #include <linux/module.h> | ||
16 | #include <linux/string.h> | ||
17 | #include "c2p.h" | ||
18 | |||
19 | |||
20 | /* | ||
21 | * Basic transpose step | ||
22 | */ | ||
23 | |||
24 | #define _transp(d, i1, i2, shift, mask) \ | ||
25 | do { \ | ||
26 | u32 t = (d[i1] ^ (d[i2] >> shift)) & mask; \ | ||
27 | d[i1] ^= t; \ | ||
28 | d[i2] ^= t << shift; \ | ||
29 | } while (0) | ||
30 | |||
31 | static inline u32 get_mask(int n) | ||
32 | { | ||
33 | switch (n) { | ||
34 | case 1: | ||
35 | return 0x55555555; | ||
36 | break; | ||
37 | |||
38 | case 2: | ||
39 | return 0x33333333; | ||
40 | break; | ||
41 | |||
42 | case 4: | ||
43 | return 0x0f0f0f0f; | ||
44 | break; | ||
45 | |||
46 | case 8: | ||
47 | return 0x00ff00ff; | ||
48 | break; | ||
49 | |||
50 | case 16: | ||
51 | return 0x0000ffff; | ||
52 | break; | ||
53 | } | ||
54 | return 0; | ||
55 | } | ||
56 | |||
57 | #define transp_nx1(d, n) \ | ||
58 | do { \ | ||
59 | u32 mask = get_mask(n); \ | ||
60 | /* First block */ \ | ||
61 | _transp(d, 0, 1, n, mask); \ | ||
62 | /* Second block */ \ | ||
63 | _transp(d, 2, 3, n, mask); \ | ||
64 | /* Third block */ \ | ||
65 | _transp(d, 4, 5, n, mask); \ | ||
66 | /* Fourth block */ \ | ||
67 | _transp(d, 6, 7, n, mask); \ | ||
68 | } while (0) | ||
69 | |||
70 | #define transp_nx2(d, n) \ | ||
71 | do { \ | ||
72 | u32 mask = get_mask(n); \ | ||
73 | /* First block */ \ | ||
74 | _transp(d, 0, 2, n, mask); \ | ||
75 | _transp(d, 1, 3, n, mask); \ | ||
76 | /* Second block */ \ | ||
77 | _transp(d, 4, 6, n, mask); \ | ||
78 | _transp(d, 5, 7, n, mask); \ | ||
79 | } while (0) | ||
80 | |||
81 | #define transp_nx4(d, n) \ | ||
82 | do { \ | ||
83 | u32 mask = get_mask(n); \ | ||
84 | _transp(d, 0, 4, n, mask); \ | ||
85 | _transp(d, 1, 5, n, mask); \ | ||
86 | _transp(d, 2, 6, n, mask); \ | ||
87 | _transp(d, 3, 7, n, mask); \ | ||
88 | } while (0) | ||
89 | |||
90 | #define transp(d, n, m) transp_nx ## m(d, n) | ||
91 | |||
92 | |||
93 | /* | ||
94 | * Perform a full C2P step on 32 8-bit pixels, stored in 8 32-bit words | ||
95 | * containing | ||
96 | * - 32 8-bit chunky pixels on input | ||
97 | * - permuted planar data on output | ||
98 | */ | ||
99 | |||
100 | static void c2p_8bpp(u32 d[8]) | ||
101 | { | ||
102 | transp(d, 16, 4); | ||
103 | transp(d, 8, 2); | ||
104 | transp(d, 4, 1); | ||
105 | transp(d, 2, 4); | ||
106 | transp(d, 1, 2); | ||
107 | } | ||
108 | |||
109 | |||
110 | /* | ||
111 | * Array containing the permution indices of the planar data after c2p | ||
112 | */ | ||
113 | |||
114 | static const int perm_c2p_8bpp[8] = { 7, 5, 3, 1, 6, 4, 2, 0 }; | ||
115 | |||
116 | |||
117 | /* | ||
118 | * Compose two values, using a bitmask as decision value | ||
119 | * This is equivalent to (a & mask) | (b & ~mask) | ||
120 | */ | ||
121 | |||
122 | static inline unsigned long comp(unsigned long a, unsigned long b, | ||
123 | unsigned long mask) | ||
124 | { | ||
125 | return ((a ^ b) & mask) ^ b; | ||
126 | } | ||
127 | |||
128 | |||
129 | /* | ||
130 | * Store a full block of planar data after c2p conversion | ||
131 | */ | ||
132 | |||
133 | static inline void store_planar(char *dst, u32 dst_inc, u32 bpp, u32 d[8]) | ||
134 | { | ||
135 | int i; | ||
136 | |||
137 | for (i = 0; i < bpp; i++, dst += dst_inc) | ||
138 | *(u32 *)dst = d[perm_c2p_8bpp[i]]; | ||
139 | } | ||
140 | |||
141 | |||
142 | /* | ||
143 | * Store a partial block of planar data after c2p conversion | ||
144 | */ | ||
145 | |||
146 | static inline void store_planar_masked(char *dst, u32 dst_inc, u32 bpp, | ||
147 | u32 d[8], u32 mask) | ||
148 | { | ||
149 | int i; | ||
150 | |||
151 | for (i = 0; i < bpp; i++, dst += dst_inc) | ||
152 | *(u32 *)dst = comp(d[perm_c2p_8bpp[i]], *(u32 *)dst, mask); | ||
153 | } | ||
154 | |||
155 | |||
156 | /* | ||
157 | * c2p - Copy 8-bit chunky image data to a planar frame buffer | ||
158 | * @dst: Starting address of the planar frame buffer | ||
159 | * @dx: Horizontal destination offset (in pixels) | ||
160 | * @dy: Vertical destination offset (in pixels) | ||
161 | * @width: Image width (in pixels) | ||
162 | * @height: Image height (in pixels) | ||
163 | * @dst_nextline: Frame buffer offset to the next line (in bytes) | ||
164 | * @dst_nextplane: Frame buffer offset to the next plane (in bytes) | ||
165 | * @src_nextline: Image offset to the next line (in bytes) | ||
166 | * @bpp: Bits per pixel of the planar frame buffer (1-8) | ||
167 | */ | ||
168 | |||
169 | void c2p(u8 *dst, const u8 *src, u32 dx, u32 dy, u32 width, u32 height, | ||
170 | u32 dst_nextline, u32 dst_nextplane, u32 src_nextline, u32 bpp) | ||
171 | { | ||
172 | int dst_idx; | ||
173 | u32 d[8], first, last, w; | ||
174 | const u8 *c; | ||
175 | u8 *p; | ||
176 | |||
177 | dst += dy*dst_nextline+(dx & ~31); | ||
178 | dst_idx = dx % 32; | ||
179 | first = ~0UL >> dst_idx; | ||
180 | last = ~(~0UL >> ((dst_idx+width) % 32)); | ||
181 | while (height--) { | ||
182 | c = src; | ||
183 | p = dst; | ||
184 | w = width; | ||
185 | if (dst_idx+width <= 32) { | ||
186 | /* Single destination word */ | ||
187 | first &= last; | ||
188 | memset(d, 0, sizeof(d)); | ||
189 | memcpy((u8 *)d+dst_idx, c, width); | ||
190 | c += width; | ||
191 | c2p_8bpp(d); | ||
192 | store_planar_masked(p, dst_nextplane, bpp, d, first); | ||
193 | p += 4; | ||
194 | } else { | ||
195 | /* Multiple destination words */ | ||
196 | w = width; | ||
197 | /* Leading bits */ | ||
198 | if (dst_idx) { | ||
199 | w = 32 - dst_idx; | ||
200 | memset(d, 0, dst_idx); | ||
201 | memcpy((u8 *)d+dst_idx, c, w); | ||
202 | c += w; | ||
203 | c2p_8bpp(d); | ||
204 | store_planar_masked(p, dst_nextplane, bpp, d, first); | ||
205 | p += 4; | ||
206 | w = width-w; | ||
207 | } | ||
208 | /* Main chunk */ | ||
209 | while (w >= 32) { | ||
210 | memcpy(d, c, 32); | ||
211 | c += 32; | ||
212 | c2p_8bpp(d); | ||
213 | store_planar(p, dst_nextplane, bpp, d); | ||
214 | p += 4; | ||
215 | w -= 32; | ||
216 | } | ||
217 | /* Trailing bits */ | ||
218 | w %= 32; | ||
219 | if (w > 0) { | ||
220 | memcpy(d, c, w); | ||
221 | memset((u8 *)d+w, 0, 32-w); | ||
222 | c2p_8bpp(d); | ||
223 | store_planar_masked(p, dst_nextplane, bpp, d, last); | ||
224 | } | ||
225 | } | ||
226 | src += src_nextline; | ||
227 | dst += dst_nextline; | ||
228 | } | ||
229 | } | ||
230 | EXPORT_SYMBOL_GPL(c2p); | ||
231 | |||
232 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/video/c2p.h b/drivers/video/c2p.h index c77cbf17e043..6c38d40427d8 100644 --- a/drivers/video/c2p.h +++ b/drivers/video/c2p.h | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * Fast C2P (Chunky-to-Planar) Conversion | 2 | * Fast C2P (Chunky-to-Planar) Conversion |
3 | * | 3 | * |
4 | * Copyright (C) 2003 Geert Uytterhoeven | 4 | * Copyright (C) 2003-2008 Geert Uytterhoeven |
5 | * | 5 | * |
6 | * This file is subject to the terms and conditions of the GNU General Public | 6 | * This file is subject to the terms and conditions of the GNU General Public |
7 | * License. See the file COPYING in the main directory of this archive | 7 | * License. See the file COPYING in the main directory of this archive |
@@ -10,7 +10,10 @@ | |||
10 | 10 | ||
11 | #include <linux/types.h> | 11 | #include <linux/types.h> |
12 | 12 | ||
13 | extern void c2p(u8 *dst, const u8 *src, u32 dx, u32 dy, u32 width, u32 height, | 13 | extern void c2p_planar(void *dst, const void *src, u32 dx, u32 dy, u32 width, |
14 | u32 dst_nextline, u32 dst_nextplane, u32 src_nextline, | 14 | u32 height, u32 dst_nextline, u32 dst_nextplane, |
15 | u32 bpp); | 15 | u32 src_nextline, u32 bpp); |
16 | 16 | ||
17 | extern void c2p_iplan2(void *dst, const void *src, u32 dx, u32 dy, u32 width, | ||
18 | u32 height, u32 dst_nextline, u32 src_nextline, | ||
19 | u32 bpp); | ||
diff --git a/drivers/video/c2p_core.h b/drivers/video/c2p_core.h new file mode 100644 index 000000000000..e1035a865fb9 --- /dev/null +++ b/drivers/video/c2p_core.h | |||
@@ -0,0 +1,153 @@ | |||
1 | /* | ||
2 | * Fast C2P (Chunky-to-Planar) Conversion | ||
3 | * | ||
4 | * Copyright (C) 2003-2008 Geert Uytterhoeven | ||
5 | * | ||
6 | * NOTES: | ||
7 | * - This code was inspired by Scout's C2P tutorial | ||
8 | * - It assumes to run on a big endian system | ||
9 | * | ||
10 | * This file is subject to the terms and conditions of the GNU General Public | ||
11 | * License. See the file COPYING in the main directory of this archive | ||
12 | * for more details. | ||
13 | */ | ||
14 | |||
15 | |||
16 | /* | ||
17 | * Basic transpose step | ||
18 | */ | ||
19 | |||
20 | static inline void _transp(u32 d[], unsigned int i1, unsigned int i2, | ||
21 | unsigned int shift, u32 mask) | ||
22 | { | ||
23 | u32 t = (d[i1] ^ (d[i2] >> shift)) & mask; | ||
24 | |||
25 | d[i1] ^= t; | ||
26 | d[i2] ^= t << shift; | ||
27 | } | ||
28 | |||
29 | |||
30 | extern void c2p_unsupported(void); | ||
31 | |||
32 | static inline u32 get_mask(unsigned int n) | ||
33 | { | ||
34 | switch (n) { | ||
35 | case 1: | ||
36 | return 0x55555555; | ||
37 | |||
38 | case 2: | ||
39 | return 0x33333333; | ||
40 | |||
41 | case 4: | ||
42 | return 0x0f0f0f0f; | ||
43 | |||
44 | case 8: | ||
45 | return 0x00ff00ff; | ||
46 | |||
47 | case 16: | ||
48 | return 0x0000ffff; | ||
49 | } | ||
50 | |||
51 | c2p_unsupported(); | ||
52 | return 0; | ||
53 | } | ||
54 | |||
55 | |||
56 | /* | ||
57 | * Transpose operations on 8 32-bit words | ||
58 | */ | ||
59 | |||
60 | static inline void transp8(u32 d[], unsigned int n, unsigned int m) | ||
61 | { | ||
62 | u32 mask = get_mask(n); | ||
63 | |||
64 | switch (m) { | ||
65 | case 1: | ||
66 | /* First n x 1 block */ | ||
67 | _transp(d, 0, 1, n, mask); | ||
68 | /* Second n x 1 block */ | ||
69 | _transp(d, 2, 3, n, mask); | ||
70 | /* Third n x 1 block */ | ||
71 | _transp(d, 4, 5, n, mask); | ||
72 | /* Fourth n x 1 block */ | ||
73 | _transp(d, 6, 7, n, mask); | ||
74 | return; | ||
75 | |||
76 | case 2: | ||
77 | /* First n x 2 block */ | ||
78 | _transp(d, 0, 2, n, mask); | ||
79 | _transp(d, 1, 3, n, mask); | ||
80 | /* Second n x 2 block */ | ||
81 | _transp(d, 4, 6, n, mask); | ||
82 | _transp(d, 5, 7, n, mask); | ||
83 | return; | ||
84 | |||
85 | case 4: | ||
86 | /* Single n x 4 block */ | ||
87 | _transp(d, 0, 4, n, mask); | ||
88 | _transp(d, 1, 5, n, mask); | ||
89 | _transp(d, 2, 6, n, mask); | ||
90 | _transp(d, 3, 7, n, mask); | ||
91 | return; | ||
92 | } | ||
93 | |||
94 | c2p_unsupported(); | ||
95 | } | ||
96 | |||
97 | |||
98 | /* | ||
99 | * Transpose operations on 4 32-bit words | ||
100 | */ | ||
101 | |||
102 | static inline void transp4(u32 d[], unsigned int n, unsigned int m) | ||
103 | { | ||
104 | u32 mask = get_mask(n); | ||
105 | |||
106 | switch (m) { | ||
107 | case 1: | ||
108 | /* First n x 1 block */ | ||
109 | _transp(d, 0, 1, n, mask); | ||
110 | /* Second n x 1 block */ | ||
111 | _transp(d, 2, 3, n, mask); | ||
112 | return; | ||
113 | |||
114 | case 2: | ||
115 | /* Single n x 2 block */ | ||
116 | _transp(d, 0, 2, n, mask); | ||
117 | _transp(d, 1, 3, n, mask); | ||
118 | return; | ||
119 | } | ||
120 | |||
121 | c2p_unsupported(); | ||
122 | } | ||
123 | |||
124 | |||
125 | /* | ||
126 | * Transpose operations on 4 32-bit words (reverse order) | ||
127 | */ | ||
128 | |||
129 | static inline void transp4x(u32 d[], unsigned int n, unsigned int m) | ||
130 | { | ||
131 | u32 mask = get_mask(n); | ||
132 | |||
133 | switch (m) { | ||
134 | case 2: | ||
135 | /* Single n x 2 block */ | ||
136 | _transp(d, 2, 0, n, mask); | ||
137 | _transp(d, 3, 1, n, mask); | ||
138 | return; | ||
139 | } | ||
140 | |||
141 | c2p_unsupported(); | ||
142 | } | ||
143 | |||
144 | |||
145 | /* | ||
146 | * Compose two values, using a bitmask as decision value | ||
147 | * This is equivalent to (a & mask) | (b & ~mask) | ||
148 | */ | ||
149 | |||
150 | static inline u32 comp(u32 a, u32 b, u32 mask) | ||
151 | { | ||
152 | return ((a ^ b) & mask) ^ b; | ||
153 | } | ||
diff --git a/drivers/video/c2p_iplan2.c b/drivers/video/c2p_iplan2.c new file mode 100644 index 000000000000..19156dc6158c --- /dev/null +++ b/drivers/video/c2p_iplan2.c | |||
@@ -0,0 +1,153 @@ | |||
1 | /* | ||
2 | * Fast C2P (Chunky-to-Planar) Conversion | ||
3 | * | ||
4 | * Copyright (C) 2003-2008 Geert Uytterhoeven | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License. See the file COPYING in the main directory of this archive | ||
8 | * for more details. | ||
9 | */ | ||
10 | |||
11 | #include <linux/module.h> | ||
12 | #include <linux/string.h> | ||
13 | |||
14 | #include <asm/unaligned.h> | ||
15 | |||
16 | #include "c2p.h" | ||
17 | #include "c2p_core.h" | ||
18 | |||
19 | |||
20 | /* | ||
21 | * Perform a full C2P step on 16 8-bit pixels, stored in 4 32-bit words | ||
22 | * containing | ||
23 | * - 16 8-bit chunky pixels on input | ||
24 | * - permutated planar data (2 planes per 32-bit word) on output | ||
25 | */ | ||
26 | |||
27 | static void c2p_16x8(u32 d[4]) | ||
28 | { | ||
29 | transp4(d, 8, 2); | ||
30 | transp4(d, 1, 2); | ||
31 | transp4x(d, 16, 2); | ||
32 | transp4x(d, 2, 2); | ||
33 | transp4(d, 4, 1); | ||
34 | } | ||
35 | |||
36 | |||
37 | /* | ||
38 | * Array containing the permutation indices of the planar data after c2p | ||
39 | */ | ||
40 | |||
41 | static const int perm_c2p_16x8[4] = { 1, 3, 0, 2 }; | ||
42 | |||
43 | |||
44 | /* | ||
45 | * Store a full block of iplan2 data after c2p conversion | ||
46 | */ | ||
47 | |||
48 | static inline void store_iplan2(void *dst, u32 bpp, u32 d[4]) | ||
49 | { | ||
50 | int i; | ||
51 | |||
52 | for (i = 0; i < bpp/2; i++, dst += 4) | ||
53 | put_unaligned_be32(d[perm_c2p_16x8[i]], dst); | ||
54 | } | ||
55 | |||
56 | |||
57 | /* | ||
58 | * Store a partial block of iplan2 data after c2p conversion | ||
59 | */ | ||
60 | |||
61 | static inline void store_iplan2_masked(void *dst, u32 bpp, u32 d[4], u32 mask) | ||
62 | { | ||
63 | int i; | ||
64 | |||
65 | for (i = 0; i < bpp/2; i++, dst += 4) | ||
66 | put_unaligned_be32(comp(d[perm_c2p_16x8[i]], | ||
67 | get_unaligned_be32(dst), mask), | ||
68 | dst); | ||
69 | } | ||
70 | |||
71 | |||
72 | /* | ||
73 | * c2p_iplan2 - Copy 8-bit chunky image data to an interleaved planar | ||
74 | * frame buffer with 2 bytes of interleave | ||
75 | * @dst: Starting address of the planar frame buffer | ||
76 | * @dx: Horizontal destination offset (in pixels) | ||
77 | * @dy: Vertical destination offset (in pixels) | ||
78 | * @width: Image width (in pixels) | ||
79 | * @height: Image height (in pixels) | ||
80 | * @dst_nextline: Frame buffer offset to the next line (in bytes) | ||
81 | * @src_nextline: Image offset to the next line (in bytes) | ||
82 | * @bpp: Bits per pixel of the planar frame buffer (2, 4, or 8) | ||
83 | */ | ||
84 | |||
85 | void c2p_iplan2(void *dst, const void *src, u32 dx, u32 dy, u32 width, | ||
86 | u32 height, u32 dst_nextline, u32 src_nextline, u32 bpp) | ||
87 | { | ||
88 | union { | ||
89 | u8 pixels[16]; | ||
90 | u32 words[4]; | ||
91 | } d; | ||
92 | u32 dst_idx, first, last, w; | ||
93 | const u8 *c; | ||
94 | void *p; | ||
95 | |||
96 | dst += dy*dst_nextline+(dx & ~15)*bpp; | ||
97 | dst_idx = dx % 16; | ||
98 | first = 0xffffU >> dst_idx; | ||
99 | first |= first << 16; | ||
100 | last = 0xffffU ^ (0xffffU >> ((dst_idx+width) % 16)); | ||
101 | last |= last << 16; | ||
102 | while (height--) { | ||
103 | c = src; | ||
104 | p = dst; | ||
105 | w = width; | ||
106 | if (dst_idx+width <= 16) { | ||
107 | /* Single destination word */ | ||
108 | first &= last; | ||
109 | memset(d.pixels, 0, sizeof(d)); | ||
110 | memcpy(d.pixels+dst_idx, c, width); | ||
111 | c += width; | ||
112 | c2p_16x8(d.words); | ||
113 | store_iplan2_masked(p, bpp, d.words, first); | ||
114 | p += bpp*2; | ||
115 | } else { | ||
116 | /* Multiple destination words */ | ||
117 | w = width; | ||
118 | /* Leading bits */ | ||
119 | if (dst_idx) { | ||
120 | w = 16 - dst_idx; | ||
121 | memset(d.pixels, 0, dst_idx); | ||
122 | memcpy(d.pixels+dst_idx, c, w); | ||
123 | c += w; | ||
124 | c2p_16x8(d.words); | ||
125 | store_iplan2_masked(p, bpp, d.words, first); | ||
126 | p += bpp*2; | ||
127 | w = width-w; | ||
128 | } | ||
129 | /* Main chunk */ | ||
130 | while (w >= 16) { | ||
131 | memcpy(d.pixels, c, 16); | ||
132 | c += 16; | ||
133 | c2p_16x8(d.words); | ||
134 | store_iplan2(p, bpp, d.words); | ||
135 | p += bpp*2; | ||
136 | w -= 16; | ||
137 | } | ||
138 | /* Trailing bits */ | ||
139 | w %= 16; | ||
140 | if (w > 0) { | ||
141 | memcpy(d.pixels, c, w); | ||
142 | memset(d.pixels+w, 0, 16-w); | ||
143 | c2p_16x8(d.words); | ||
144 | store_iplan2_masked(p, bpp, d.words, last); | ||
145 | } | ||
146 | } | ||
147 | src += src_nextline; | ||
148 | dst += dst_nextline; | ||
149 | } | ||
150 | } | ||
151 | EXPORT_SYMBOL_GPL(c2p_iplan2); | ||
152 | |||
153 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/video/c2p_planar.c b/drivers/video/c2p_planar.c new file mode 100644 index 000000000000..ec7ac8526f06 --- /dev/null +++ b/drivers/video/c2p_planar.c | |||
@@ -0,0 +1,156 @@ | |||
1 | /* | ||
2 | * Fast C2P (Chunky-to-Planar) Conversion | ||
3 | * | ||
4 | * Copyright (C) 2003-2008 Geert Uytterhoeven | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License. See the file COPYING in the main directory of this archive | ||
8 | * for more details. | ||
9 | */ | ||
10 | |||
11 | #include <linux/module.h> | ||
12 | #include <linux/string.h> | ||
13 | |||
14 | #include <asm/unaligned.h> | ||
15 | |||
16 | #include "c2p.h" | ||
17 | #include "c2p_core.h" | ||
18 | |||
19 | |||
20 | /* | ||
21 | * Perform a full C2P step on 32 8-bit pixels, stored in 8 32-bit words | ||
22 | * containing | ||
23 | * - 32 8-bit chunky pixels on input | ||
24 | * - permutated planar data (1 plane per 32-bit word) on output | ||
25 | */ | ||
26 | |||
27 | static void c2p_32x8(u32 d[8]) | ||
28 | { | ||
29 | transp8(d, 16, 4); | ||
30 | transp8(d, 8, 2); | ||
31 | transp8(d, 4, 1); | ||
32 | transp8(d, 2, 4); | ||
33 | transp8(d, 1, 2); | ||
34 | } | ||
35 | |||
36 | |||
37 | /* | ||
38 | * Array containing the permutation indices of the planar data after c2p | ||
39 | */ | ||
40 | |||
41 | static const int perm_c2p_32x8[8] = { 7, 5, 3, 1, 6, 4, 2, 0 }; | ||
42 | |||
43 | |||
44 | /* | ||
45 | * Store a full block of planar data after c2p conversion | ||
46 | */ | ||
47 | |||
48 | static inline void store_planar(void *dst, u32 dst_inc, u32 bpp, u32 d[8]) | ||
49 | { | ||
50 | int i; | ||
51 | |||
52 | for (i = 0; i < bpp; i++, dst += dst_inc) | ||
53 | put_unaligned_be32(d[perm_c2p_32x8[i]], dst); | ||
54 | } | ||
55 | |||
56 | |||
57 | /* | ||
58 | * Store a partial block of planar data after c2p conversion | ||
59 | */ | ||
60 | |||
61 | static inline void store_planar_masked(void *dst, u32 dst_inc, u32 bpp, | ||
62 | u32 d[8], u32 mask) | ||
63 | { | ||
64 | int i; | ||
65 | |||
66 | for (i = 0; i < bpp; i++, dst += dst_inc) | ||
67 | put_unaligned_be32(comp(d[perm_c2p_32x8[i]], | ||
68 | get_unaligned_be32(dst), mask), | ||
69 | dst); | ||
70 | } | ||
71 | |||
72 | |||
73 | /* | ||
74 | * c2p_planar - Copy 8-bit chunky image data to a planar frame buffer | ||
75 | * @dst: Starting address of the planar frame buffer | ||
76 | * @dx: Horizontal destination offset (in pixels) | ||
77 | * @dy: Vertical destination offset (in pixels) | ||
78 | * @width: Image width (in pixels) | ||
79 | * @height: Image height (in pixels) | ||
80 | * @dst_nextline: Frame buffer offset to the next line (in bytes) | ||
81 | * @dst_nextplane: Frame buffer offset to the next plane (in bytes) | ||
82 | * @src_nextline: Image offset to the next line (in bytes) | ||
83 | * @bpp: Bits per pixel of the planar frame buffer (1-8) | ||
84 | */ | ||
85 | |||
86 | void c2p_planar(void *dst, const void *src, u32 dx, u32 dy, u32 width, | ||
87 | u32 height, u32 dst_nextline, u32 dst_nextplane, | ||
88 | u32 src_nextline, u32 bpp) | ||
89 | { | ||
90 | union { | ||
91 | u8 pixels[32]; | ||
92 | u32 words[8]; | ||
93 | } d; | ||
94 | u32 dst_idx, first, last, w; | ||
95 | const u8 *c; | ||
96 | void *p; | ||
97 | |||
98 | dst += dy*dst_nextline+(dx & ~31); | ||
99 | dst_idx = dx % 32; | ||
100 | first = 0xffffffffU >> dst_idx; | ||
101 | last = ~(0xffffffffU >> ((dst_idx+width) % 32)); | ||
102 | while (height--) { | ||
103 | c = src; | ||
104 | p = dst; | ||
105 | w = width; | ||
106 | if (dst_idx+width <= 32) { | ||
107 | /* Single destination word */ | ||
108 | first &= last; | ||
109 | memset(d.pixels, 0, sizeof(d)); | ||
110 | memcpy(d.pixels+dst_idx, c, width); | ||
111 | c += width; | ||
112 | c2p_32x8(d.words); | ||
113 | store_planar_masked(p, dst_nextplane, bpp, d.words, | ||
114 | first); | ||
115 | p += 4; | ||
116 | } else { | ||
117 | /* Multiple destination words */ | ||
118 | w = width; | ||
119 | /* Leading bits */ | ||
120 | if (dst_idx) { | ||
121 | w = 32 - dst_idx; | ||
122 | memset(d.pixels, 0, dst_idx); | ||
123 | memcpy(d.pixels+dst_idx, c, w); | ||
124 | c += w; | ||
125 | c2p_32x8(d.words); | ||
126 | store_planar_masked(p, dst_nextplane, bpp, | ||
127 | d.words, first); | ||
128 | p += 4; | ||
129 | w = width-w; | ||
130 | } | ||
131 | /* Main chunk */ | ||
132 | while (w >= 32) { | ||
133 | memcpy(d.pixels, c, 32); | ||
134 | c += 32; | ||
135 | c2p_32x8(d.words); | ||
136 | store_planar(p, dst_nextplane, bpp, d.words); | ||
137 | p += 4; | ||
138 | w -= 32; | ||
139 | } | ||
140 | /* Trailing bits */ | ||
141 | w %= 32; | ||
142 | if (w > 0) { | ||
143 | memcpy(d.pixels, c, w); | ||
144 | memset(d.pixels+w, 0, 32-w); | ||
145 | c2p_32x8(d.words); | ||
146 | store_planar_masked(p, dst_nextplane, bpp, | ||
147 | d.words, last); | ||
148 | } | ||
149 | } | ||
150 | src += src_nextline; | ||
151 | dst += dst_nextline; | ||
152 | } | ||
153 | } | ||
154 | EXPORT_SYMBOL_GPL(c2p_planar); | ||
155 | |||
156 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c index 4bcff81b50e0..1657b9608b04 100644 --- a/drivers/video/console/fbcon.c +++ b/drivers/video/console/fbcon.c | |||
@@ -78,13 +78,6 @@ | |||
78 | #include <asm/fb.h> | 78 | #include <asm/fb.h> |
79 | #include <asm/irq.h> | 79 | #include <asm/irq.h> |
80 | #include <asm/system.h> | 80 | #include <asm/system.h> |
81 | #ifdef CONFIG_ATARI | ||
82 | #include <asm/atariints.h> | ||
83 | #endif | ||
84 | #if defined(__mc68000__) | ||
85 | #include <asm/machdep.h> | ||
86 | #include <asm/setup.h> | ||
87 | #endif | ||
88 | 81 | ||
89 | #include "fbcon.h" | 82 | #include "fbcon.h" |
90 | 83 | ||
@@ -155,9 +148,6 @@ static int fbcon_set_origin(struct vc_data *); | |||
155 | 148 | ||
156 | #define CURSOR_DRAW_DELAY (1) | 149 | #define CURSOR_DRAW_DELAY (1) |
157 | 150 | ||
158 | /* # VBL ints between cursor state changes */ | ||
159 | #define ATARI_CURSOR_BLINK_RATE (42) | ||
160 | |||
161 | static int vbl_cursor_cnt; | 151 | static int vbl_cursor_cnt; |
162 | static int fbcon_cursor_noblink; | 152 | static int fbcon_cursor_noblink; |
163 | 153 | ||
@@ -403,20 +393,6 @@ static void fb_flashcursor(struct work_struct *work) | |||
403 | release_console_sem(); | 393 | release_console_sem(); |
404 | } | 394 | } |
405 | 395 | ||
406 | #ifdef CONFIG_ATARI | ||
407 | static int cursor_blink_rate; | ||
408 | static irqreturn_t fb_vbl_handler(int irq, void *dev_id) | ||
409 | { | ||
410 | struct fb_info *info = dev_id; | ||
411 | |||
412 | if (vbl_cursor_cnt && --vbl_cursor_cnt == 0) { | ||
413 | schedule_work(&info->queue); | ||
414 | vbl_cursor_cnt = cursor_blink_rate; | ||
415 | } | ||
416 | return IRQ_HANDLED; | ||
417 | } | ||
418 | #endif | ||
419 | |||
420 | static void cursor_timer_handler(unsigned long dev_addr) | 396 | static void cursor_timer_handler(unsigned long dev_addr) |
421 | { | 397 | { |
422 | struct fb_info *info = (struct fb_info *) dev_addr; | 398 | struct fb_info *info = (struct fb_info *) dev_addr; |
@@ -1017,15 +993,6 @@ static const char *fbcon_startup(void) | |||
1017 | info->var.yres, | 993 | info->var.yres, |
1018 | info->var.bits_per_pixel); | 994 | info->var.bits_per_pixel); |
1019 | 995 | ||
1020 | #ifdef CONFIG_ATARI | ||
1021 | if (MACH_IS_ATARI) { | ||
1022 | cursor_blink_rate = ATARI_CURSOR_BLINK_RATE; | ||
1023 | (void)request_irq(IRQ_AUTO_4, fb_vbl_handler, | ||
1024 | IRQ_TYPE_PRIO, "framebuffer vbl", | ||
1025 | info); | ||
1026 | } | ||
1027 | #endif /* CONFIG_ATARI */ | ||
1028 | |||
1029 | fbcon_add_cursor_timer(info); | 996 | fbcon_add_cursor_timer(info); |
1030 | fbcon_has_exited = 0; | 997 | fbcon_has_exited = 0; |
1031 | return display_desc; | 998 | return display_desc; |
@@ -3454,11 +3421,6 @@ static void fbcon_exit(void) | |||
3454 | if (fbcon_has_exited) | 3421 | if (fbcon_has_exited) |
3455 | return; | 3422 | return; |
3456 | 3423 | ||
3457 | #ifdef CONFIG_ATARI | ||
3458 | if (MACH_IS_ATARI) | ||
3459 | free_irq(IRQ_AUTO_4, fb_vbl_handler); | ||
3460 | #endif | ||
3461 | |||
3462 | kfree((void *)softback_buf); | 3424 | kfree((void *)softback_buf); |
3463 | softback_buf = 0UL; | 3425 | softback_buf = 0UL; |
3464 | 3426 | ||
diff --git a/drivers/zorro/.gitignore b/drivers/zorro/.gitignore new file mode 100644 index 000000000000..34f980bd8ff6 --- /dev/null +++ b/drivers/zorro/.gitignore | |||
@@ -0,0 +1,2 @@ | |||
1 | devlist.h | ||
2 | gen-devlist | ||
diff --git a/drivers/zorro/zorro-sysfs.c b/drivers/zorro/zorro-sysfs.c index 5290552d2ef7..1d2a772ea14c 100644 --- a/drivers/zorro/zorro-sysfs.c +++ b/drivers/zorro/zorro-sysfs.c | |||
@@ -77,17 +77,21 @@ static struct bin_attribute zorro_config_attr = { | |||
77 | .read = zorro_read_config, | 77 | .read = zorro_read_config, |
78 | }; | 78 | }; |
79 | 79 | ||
80 | void zorro_create_sysfs_dev_files(struct zorro_dev *z) | 80 | int zorro_create_sysfs_dev_files(struct zorro_dev *z) |
81 | { | 81 | { |
82 | struct device *dev = &z->dev; | 82 | struct device *dev = &z->dev; |
83 | int error; | ||
83 | 84 | ||
84 | /* current configuration's attributes */ | 85 | /* current configuration's attributes */ |
85 | device_create_file(dev, &dev_attr_id); | 86 | if ((error = device_create_file(dev, &dev_attr_id)) || |
86 | device_create_file(dev, &dev_attr_type); | 87 | (error = device_create_file(dev, &dev_attr_type)) || |
87 | device_create_file(dev, &dev_attr_serial); | 88 | (error = device_create_file(dev, &dev_attr_serial)) || |
88 | device_create_file(dev, &dev_attr_slotaddr); | 89 | (error = device_create_file(dev, &dev_attr_slotaddr)) || |
89 | device_create_file(dev, &dev_attr_slotsize); | 90 | (error = device_create_file(dev, &dev_attr_slotsize)) || |
90 | device_create_file(dev, &dev_attr_resource); | 91 | (error = device_create_file(dev, &dev_attr_resource)) || |
91 | sysfs_create_bin_file(&dev->kobj, &zorro_config_attr); | 92 | (error = sysfs_create_bin_file(&dev->kobj, &zorro_config_attr))) |
93 | return error; | ||
94 | |||
95 | return 0; | ||
92 | } | 96 | } |
93 | 97 | ||
diff --git a/drivers/zorro/zorro.c b/drivers/zorro/zorro.c index dff16d9767d8..a1585d6f6486 100644 --- a/drivers/zorro/zorro.c +++ b/drivers/zorro/zorro.c | |||
@@ -130,6 +130,7 @@ static int __init zorro_init(void) | |||
130 | { | 130 | { |
131 | struct zorro_dev *z; | 131 | struct zorro_dev *z; |
132 | unsigned int i; | 132 | unsigned int i; |
133 | int error; | ||
133 | 134 | ||
134 | if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(ZORRO)) | 135 | if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(ZORRO)) |
135 | return 0; | 136 | return 0; |
@@ -140,7 +141,11 @@ static int __init zorro_init(void) | |||
140 | /* Initialize the Zorro bus */ | 141 | /* Initialize the Zorro bus */ |
141 | INIT_LIST_HEAD(&zorro_bus.devices); | 142 | INIT_LIST_HEAD(&zorro_bus.devices); |
142 | strcpy(zorro_bus.dev.bus_id, "zorro"); | 143 | strcpy(zorro_bus.dev.bus_id, "zorro"); |
143 | device_register(&zorro_bus.dev); | 144 | error = device_register(&zorro_bus.dev); |
145 | if (error) { | ||
146 | pr_err("Zorro: Error registering zorro_bus\n"); | ||
147 | return error; | ||
148 | } | ||
144 | 149 | ||
145 | /* Request the resources */ | 150 | /* Request the resources */ |
146 | zorro_bus.num_resources = AMIGAHW_PRESENT(ZORRO3) ? 4 : 2; | 151 | zorro_bus.num_resources = AMIGAHW_PRESENT(ZORRO3) ? 4 : 2; |
@@ -160,15 +165,19 @@ static int __init zorro_init(void) | |||
160 | zorro_name_device(z); | 165 | zorro_name_device(z); |
161 | z->resource.name = z->name; | 166 | z->resource.name = z->name; |
162 | if (request_resource(zorro_find_parent_resource(z), &z->resource)) | 167 | if (request_resource(zorro_find_parent_resource(z), &z->resource)) |
163 | printk(KERN_ERR "Zorro: Address space collision on device %s " | 168 | pr_err("Zorro: Address space collision on device %s %pR\n", |
164 | "[%lx:%lx]\n", | 169 | z->name, &z->resource); |
165 | z->name, (unsigned long)zorro_resource_start(z), | ||
166 | (unsigned long)zorro_resource_end(z)); | ||
167 | sprintf(z->dev.bus_id, "%02x", i); | 170 | sprintf(z->dev.bus_id, "%02x", i); |
168 | z->dev.parent = &zorro_bus.dev; | 171 | z->dev.parent = &zorro_bus.dev; |
169 | z->dev.bus = &zorro_bus_type; | 172 | z->dev.bus = &zorro_bus_type; |
170 | device_register(&z->dev); | 173 | error = device_register(&z->dev); |
171 | zorro_create_sysfs_dev_files(z); | 174 | if (error) { |
175 | pr_err("Zorro: Error registering device %s\n", z->name); | ||
176 | continue; | ||
177 | } | ||
178 | error = zorro_create_sysfs_dev_files(z); | ||
179 | if (error) | ||
180 | dev_err(&z->dev, "Error creating sysfs files\n"); | ||
172 | } | 181 | } |
173 | 182 | ||
174 | /* Mark all available Zorro II memory */ | 183 | /* Mark all available Zorro II memory */ |
diff --git a/drivers/zorro/zorro.h b/drivers/zorro/zorro.h index 5c91adac4df1..b682d5ccd63f 100644 --- a/drivers/zorro/zorro.h +++ b/drivers/zorro/zorro.h | |||
@@ -1,4 +1,4 @@ | |||
1 | 1 | ||
2 | extern void zorro_name_device(struct zorro_dev *z); | 2 | extern void zorro_name_device(struct zorro_dev *z); |
3 | extern void zorro_create_sysfs_dev_files(struct zorro_dev *z); | 3 | extern int zorro_create_sysfs_dev_files(struct zorro_dev *z); |
4 | 4 | ||
diff --git a/include/asm-m68k/unistd.h b/include/asm-m68k/unistd.h index 965abb8bc7ff..3c19027331fa 100644 --- a/include/asm-m68k/unistd.h +++ b/include/asm-m68k/unistd.h | |||
@@ -5,6 +5,7 @@ | |||
5 | * This file contains the system call numbers. | 5 | * This file contains the system call numbers. |
6 | */ | 6 | */ |
7 | 7 | ||
8 | #define __NR_restart_syscall 0 | ||
8 | #define __NR_exit 1 | 9 | #define __NR_exit 1 |
9 | #define __NR_fork 2 | 10 | #define __NR_fork 2 |
10 | #define __NR_read 3 | 11 | #define __NR_read 3 |
@@ -359,9 +360,6 @@ | |||
359 | #define __ARCH_WANT_SYS_SIGPROCMASK | 360 | #define __ARCH_WANT_SYS_SIGPROCMASK |
360 | #define __ARCH_WANT_SYS_RT_SIGACTION | 361 | #define __ARCH_WANT_SYS_RT_SIGACTION |
361 | 362 | ||
362 | /* whitelist for checksyscalls */ | ||
363 | #define __IGNORE_restart_syscall | ||
364 | |||
365 | /* | 363 | /* |
366 | * "Conditional" syscalls | 364 | * "Conditional" syscalls |
367 | * | 365 | * |
diff --git a/include/linux/dio.h b/include/linux/dio.h index 1e65ebc2a3db..b2dd31ca1710 100644 --- a/include/linux/dio.h +++ b/include/linux/dio.h | |||
@@ -241,7 +241,7 @@ struct dio_driver { | |||
241 | 241 | ||
242 | extern int dio_find(int deviceid); | 242 | extern int dio_find(int deviceid); |
243 | extern unsigned long dio_scodetophysaddr(int scode); | 243 | extern unsigned long dio_scodetophysaddr(int scode); |
244 | extern void dio_create_sysfs_dev_files(struct dio_dev *); | 244 | extern int dio_create_sysfs_dev_files(struct dio_dev *); |
245 | 245 | ||
246 | /* New-style probing */ | 246 | /* New-style probing */ |
247 | extern int dio_register_driver(struct dio_driver *); | 247 | extern int dio_register_driver(struct dio_driver *); |
diff --git a/sound/oss/dmasound/dmasound_atari.c b/sound/oss/dmasound/dmasound_atari.c index 4d45bd63718b..57d9f154c88b 100644 --- a/sound/oss/dmasound/dmasound_atari.c +++ b/sound/oss/dmasound/dmasound_atari.c | |||
@@ -851,8 +851,9 @@ static int __init AtaIrqInit(void) | |||
851 | mfp.tim_dt_a = 1; /* Cause interrupt after first event. */ | 851 | mfp.tim_dt_a = 1; /* Cause interrupt after first event. */ |
852 | mfp.tim_ct_a = 8; /* Turn on event counting. */ | 852 | mfp.tim_ct_a = 8; /* Turn on event counting. */ |
853 | /* Register interrupt handler. */ | 853 | /* Register interrupt handler. */ |
854 | request_irq(IRQ_MFP_TIMA, AtaInterrupt, IRQ_TYPE_SLOW, "DMA sound", | 854 | if (request_irq(IRQ_MFP_TIMA, AtaInterrupt, IRQ_TYPE_SLOW, "DMA sound", |
855 | AtaInterrupt); | 855 | AtaInterrupt)) |
856 | return 0; | ||
856 | mfp.int_en_a |= 0x20; /* Turn interrupt on. */ | 857 | mfp.int_en_a |= 0x20; /* Turn interrupt on. */ |
857 | mfp.int_mk_a |= 0x20; | 858 | mfp.int_mk_a |= 0x20; |
858 | return 1; | 859 | return 1; |
diff --git a/sound/oss/dmasound/dmasound_q40.c b/sound/oss/dmasound/dmasound_q40.c index 1855b14d90c3..99bcb21c2281 100644 --- a/sound/oss/dmasound/dmasound_q40.c +++ b/sound/oss/dmasound/dmasound_q40.c | |||
@@ -371,8 +371,9 @@ static void Q40Free(void *ptr, unsigned int size) | |||
371 | static int __init Q40IrqInit(void) | 371 | static int __init Q40IrqInit(void) |
372 | { | 372 | { |
373 | /* Register interrupt handler. */ | 373 | /* Register interrupt handler. */ |
374 | request_irq(Q40_IRQ_SAMPLE, Q40StereoInterrupt, 0, | 374 | if (request_irq(Q40_IRQ_SAMPLE, Q40StereoInterrupt, 0, |
375 | "DMA sound", Q40Interrupt); | 375 | "DMA sound", Q40Interrupt)) |
376 | return 0; | ||
376 | 377 | ||
377 | return(1); | 378 | return(1); |
378 | } | 379 | } |
@@ -401,6 +402,7 @@ static void Q40PlayNextFrame(int index) | |||
401 | u_char *start; | 402 | u_char *start; |
402 | u_long size; | 403 | u_long size; |
403 | u_char speed; | 404 | u_char speed; |
405 | int error; | ||
404 | 406 | ||
405 | /* used by Q40Play() if all doubts whether there really is something | 407 | /* used by Q40Play() if all doubts whether there really is something |
406 | * to be played are already wiped out. | 408 | * to be played are already wiped out. |
@@ -419,11 +421,13 @@ static void Q40PlayNextFrame(int index) | |||
419 | master_outb( 0,SAMPLE_ENABLE_REG); | 421 | master_outb( 0,SAMPLE_ENABLE_REG); |
420 | free_irq(Q40_IRQ_SAMPLE, Q40Interrupt); | 422 | free_irq(Q40_IRQ_SAMPLE, Q40Interrupt); |
421 | if (dmasound.soft.stereo) | 423 | if (dmasound.soft.stereo) |
422 | request_irq(Q40_IRQ_SAMPLE, Q40StereoInterrupt, 0, | 424 | error = request_irq(Q40_IRQ_SAMPLE, Q40StereoInterrupt, 0, |
423 | "Q40 sound", Q40Interrupt); | 425 | "Q40 sound", Q40Interrupt); |
424 | else | 426 | else |
425 | request_irq(Q40_IRQ_SAMPLE, Q40MonoInterrupt, 0, | 427 | error = request_irq(Q40_IRQ_SAMPLE, Q40MonoInterrupt, 0, |
426 | "Q40 sound", Q40Interrupt); | 428 | "Q40 sound", Q40Interrupt); |
429 | if (error && printk_ratelimit()) | ||
430 | pr_err("Couldn't register sound interrupt\n"); | ||
427 | 431 | ||
428 | master_outb( speed, SAMPLE_RATE_REG); | 432 | master_outb( speed, SAMPLE_RATE_REG); |
429 | master_outb( 1,SAMPLE_CLEAR_REG); | 433 | master_outb( 1,SAMPLE_CLEAR_REG); |