aboutsummaryrefslogtreecommitdiffstats
path: root/arch/m68k/amiga/config.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/m68k/amiga/config.c')
-rw-r--r--arch/m68k/amiga/config.c63
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
143int amiga_parse_bootinfo(const struct bi_record *record) 145int __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
364static 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
609static int __init amiga_savekmsg_setup(char *arg) 621static 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
708static int __init amiga_debug_setup(char *arg) 724static 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