diff options
Diffstat (limited to 'arch/m68k/amiga/config.c')
-rw-r--r-- | arch/m68k/amiga/config.c | 63 |
1 files changed, 42 insertions, 21 deletions
diff --git a/arch/m68k/amiga/config.c b/arch/m68k/amiga/config.c index b819390e29cd..9625b7132227 100644 --- a/arch/m68k/amiga/config.c +++ b/arch/m68k/amiga/config.c | |||
@@ -28,6 +28,8 @@ | |||
28 | #include <linux/keyboard.h> | 28 | #include <linux/keyboard.h> |
29 | 29 | ||
30 | #include <asm/bootinfo.h> | 30 | #include <asm/bootinfo.h> |
31 | #include <asm/bootinfo-amiga.h> | ||
32 | #include <asm/byteorder.h> | ||
31 | #include <asm/setup.h> | 33 | #include <asm/setup.h> |
32 | #include <asm/pgtable.h> | 34 | #include <asm/pgtable.h> |
33 | #include <asm/amigahw.h> | 35 | #include <asm/amigahw.h> |
@@ -140,46 +142,46 @@ static struct resource ram_resource[NUM_MEMINFO]; | |||
140 | * Parse an Amiga-specific record in the bootinfo | 142 | * Parse an Amiga-specific record in the bootinfo |
141 | */ | 143 | */ |
142 | 144 | ||
143 | int amiga_parse_bootinfo(const struct bi_record *record) | 145 | int __init amiga_parse_bootinfo(const struct bi_record *record) |
144 | { | 146 | { |
145 | int unknown = 0; | 147 | int unknown = 0; |
146 | const unsigned long *data = record->data; | 148 | const void *data = record->data; |
147 | 149 | ||
148 | switch (record->tag) { | 150 | switch (be16_to_cpu(record->tag)) { |
149 | case BI_AMIGA_MODEL: | 151 | case BI_AMIGA_MODEL: |
150 | amiga_model = *data; | 152 | amiga_model = be32_to_cpup(data); |
151 | break; | 153 | break; |
152 | 154 | ||
153 | case BI_AMIGA_ECLOCK: | 155 | case BI_AMIGA_ECLOCK: |
154 | amiga_eclock = *data; | 156 | amiga_eclock = be32_to_cpup(data); |
155 | break; | 157 | break; |
156 | 158 | ||
157 | case BI_AMIGA_CHIPSET: | 159 | case BI_AMIGA_CHIPSET: |
158 | amiga_chipset = *data; | 160 | amiga_chipset = be32_to_cpup(data); |
159 | break; | 161 | break; |
160 | 162 | ||
161 | case BI_AMIGA_CHIP_SIZE: | 163 | case BI_AMIGA_CHIP_SIZE: |
162 | amiga_chip_size = *(const int *)data; | 164 | amiga_chip_size = be32_to_cpup(data); |
163 | break; | 165 | break; |
164 | 166 | ||
165 | case BI_AMIGA_VBLANK: | 167 | case BI_AMIGA_VBLANK: |
166 | amiga_vblank = *(const unsigned char *)data; | 168 | amiga_vblank = *(const __u8 *)data; |
167 | break; | 169 | break; |
168 | 170 | ||
169 | case BI_AMIGA_PSFREQ: | 171 | case BI_AMIGA_PSFREQ: |
170 | amiga_psfreq = *(const unsigned char *)data; | 172 | amiga_psfreq = *(const __u8 *)data; |
171 | break; | 173 | break; |
172 | 174 | ||
173 | case BI_AMIGA_AUTOCON: | 175 | case BI_AMIGA_AUTOCON: |
174 | #ifdef CONFIG_ZORRO | 176 | #ifdef CONFIG_ZORRO |
175 | if (zorro_num_autocon < ZORRO_NUM_AUTO) { | 177 | if (zorro_num_autocon < ZORRO_NUM_AUTO) { |
176 | const struct ConfigDev *cd = (struct ConfigDev *)data; | 178 | const struct ConfigDev *cd = data; |
177 | struct zorro_dev *dev = &zorro_autocon[zorro_num_autocon++]; | 179 | struct zorro_dev_init *dev = &zorro_autocon_init[zorro_num_autocon++]; |
178 | dev->rom = cd->cd_Rom; | 180 | dev->rom = cd->cd_Rom; |
179 | dev->slotaddr = cd->cd_SlotAddr; | 181 | dev->slotaddr = be16_to_cpu(cd->cd_SlotAddr); |
180 | dev->slotsize = cd->cd_SlotSize; | 182 | dev->slotsize = be16_to_cpu(cd->cd_SlotSize); |
181 | dev->resource.start = (unsigned long)cd->cd_BoardAddr; | 183 | dev->boardaddr = be32_to_cpu(cd->cd_BoardAddr); |
182 | dev->resource.end = dev->resource.start + cd->cd_BoardSize - 1; | 184 | dev->boardsize = be32_to_cpu(cd->cd_BoardSize); |
183 | } else | 185 | } else |
184 | printk("amiga_parse_bootinfo: too many AutoConfig devices\n"); | 186 | printk("amiga_parse_bootinfo: too many AutoConfig devices\n"); |
185 | #endif /* CONFIG_ZORRO */ | 187 | #endif /* CONFIG_ZORRO */ |
@@ -358,6 +360,14 @@ static void __init amiga_identify(void) | |||
358 | #undef AMIGAHW_ANNOUNCE | 360 | #undef AMIGAHW_ANNOUNCE |
359 | } | 361 | } |
360 | 362 | ||
363 | |||
364 | static unsigned long amiga_random_get_entropy(void) | ||
365 | { | ||
366 | /* VPOSR/VHPOSR provide at least 17 bits of data changing at 1.79 MHz */ | ||
367 | return *(unsigned long *)&amiga_custom.vposr; | ||
368 | } | ||
369 | |||
370 | |||
361 | /* | 371 | /* |
362 | * Setup the Amiga configuration info | 372 | * Setup the Amiga configuration info |
363 | */ | 373 | */ |
@@ -395,6 +405,8 @@ void __init config_amiga(void) | |||
395 | mach_heartbeat = amiga_heartbeat; | 405 | mach_heartbeat = amiga_heartbeat; |
396 | #endif | 406 | #endif |
397 | 407 | ||
408 | mach_random_get_entropy = amiga_random_get_entropy; | ||
409 | |||
398 | /* Fill in the clock value (based on the 700 kHz E-Clock) */ | 410 | /* Fill in the clock value (based on the 700 kHz E-Clock) */ |
399 | amiga_colorclock = 5*amiga_eclock; /* 3.5 MHz */ | 411 | amiga_colorclock = 5*amiga_eclock; /* 3.5 MHz */ |
400 | 412 | ||
@@ -608,6 +620,8 @@ static void amiga_mem_console_write(struct console *co, const char *s, | |||
608 | 620 | ||
609 | static int __init amiga_savekmsg_setup(char *arg) | 621 | static int __init amiga_savekmsg_setup(char *arg) |
610 | { | 622 | { |
623 | bool registered; | ||
624 | |||
611 | if (!MACH_IS_AMIGA || strcmp(arg, "mem")) | 625 | if (!MACH_IS_AMIGA || strcmp(arg, "mem")) |
612 | return 0; | 626 | return 0; |
613 | 627 | ||
@@ -618,14 +632,16 @@ static int __init amiga_savekmsg_setup(char *arg) | |||
618 | 632 | ||
619 | /* Just steal the block, the chipram allocator isn't functional yet */ | 633 | /* Just steal the block, the chipram allocator isn't functional yet */ |
620 | amiga_chip_size -= SAVEKMSG_MAXMEM; | 634 | amiga_chip_size -= SAVEKMSG_MAXMEM; |
621 | savekmsg = (void *)ZTWO_VADDR(CHIP_PHYSADDR + amiga_chip_size); | 635 | savekmsg = ZTWO_VADDR(CHIP_PHYSADDR + amiga_chip_size); |
622 | savekmsg->magic1 = SAVEKMSG_MAGIC1; | 636 | savekmsg->magic1 = SAVEKMSG_MAGIC1; |
623 | savekmsg->magic2 = SAVEKMSG_MAGIC2; | 637 | savekmsg->magic2 = SAVEKMSG_MAGIC2; |
624 | savekmsg->magicptr = ZTWO_PADDR(savekmsg); | 638 | savekmsg->magicptr = ZTWO_PADDR(savekmsg); |
625 | savekmsg->size = 0; | 639 | savekmsg->size = 0; |
626 | 640 | ||
641 | registered = !!amiga_console_driver.write; | ||
627 | amiga_console_driver.write = amiga_mem_console_write; | 642 | amiga_console_driver.write = amiga_mem_console_write; |
628 | register_console(&amiga_console_driver); | 643 | if (!registered) |
644 | register_console(&amiga_console_driver); | ||
629 | return 0; | 645 | return 0; |
630 | } | 646 | } |
631 | 647 | ||
@@ -707,11 +723,16 @@ void amiga_serial_gets(struct console *co, char *s, int len) | |||
707 | 723 | ||
708 | static int __init amiga_debug_setup(char *arg) | 724 | static int __init amiga_debug_setup(char *arg) |
709 | { | 725 | { |
710 | if (MACH_IS_AMIGA && !strcmp(arg, "ser")) { | 726 | bool registered; |
711 | /* no initialization required (?) */ | 727 | |
712 | amiga_console_driver.write = amiga_serial_console_write; | 728 | if (!MACH_IS_AMIGA || strcmp(arg, "ser")) |
729 | return 0; | ||
730 | |||
731 | /* no initialization required (?) */ | ||
732 | registered = !!amiga_console_driver.write; | ||
733 | amiga_console_driver.write = amiga_serial_console_write; | ||
734 | if (!registered) | ||
713 | register_console(&amiga_console_driver); | 735 | register_console(&amiga_console_driver); |
714 | } | ||
715 | return 0; | 736 | return 0; |
716 | } | 737 | } |
717 | 738 | ||