diff options
Diffstat (limited to 'arch/m68k/amiga/config.c')
| -rw-r--r-- | arch/m68k/amiga/config.c | 83 | 
1 files changed, 52 insertions, 31 deletions
diff --git a/arch/m68k/amiga/config.c b/arch/m68k/amiga/config.c index b819390e29c..01693df7f2f 100644 --- a/arch/m68k/amiga/config.c +++ b/arch/m68k/amiga/config.c @@ -28,6 +28,8 @@  #include <linux/keyboard.h>  #include <asm/bootinfo.h> +#include <asm/bootinfo-amiga.h> +#include <asm/byteorder.h>  #include <asm/setup.h>  #include <asm/pgtable.h>  #include <asm/amigahw.h> @@ -140,48 +142,48 @@ static struct resource ram_resource[NUM_MEMINFO];       *  Parse an Amiga-specific record in the bootinfo       */ -int amiga_parse_bootinfo(const struct bi_record *record) +int __init amiga_parse_bootinfo(const struct bi_record *record)  {  	int unknown = 0; -	const unsigned long *data = record->data; +	const void *data = record->data; -	switch (record->tag) { +	switch (be16_to_cpu(record->tag)) {  	case BI_AMIGA_MODEL: -		amiga_model = *data; +		amiga_model = be32_to_cpup(data);  		break;  	case BI_AMIGA_ECLOCK: -		amiga_eclock = *data; +		amiga_eclock = be32_to_cpup(data);  		break;  	case BI_AMIGA_CHIPSET: -		amiga_chipset = *data; +		amiga_chipset = be32_to_cpup(data);  		break;  	case BI_AMIGA_CHIP_SIZE: -		amiga_chip_size = *(const int *)data; +		amiga_chip_size = be32_to_cpup(data);  		break;  	case BI_AMIGA_VBLANK: -		amiga_vblank = *(const unsigned char *)data; +		amiga_vblank = *(const __u8 *)data;  		break;  	case BI_AMIGA_PSFREQ: -		amiga_psfreq = *(const unsigned char *)data; +		amiga_psfreq = *(const __u8 *)data;  		break;  	case BI_AMIGA_AUTOCON:  #ifdef CONFIG_ZORRO  		if (zorro_num_autocon < ZORRO_NUM_AUTO) { -			const struct ConfigDev *cd = (struct ConfigDev *)data; -			struct zorro_dev *dev = &zorro_autocon[zorro_num_autocon++]; +			const struct ConfigDev *cd = data; +			struct zorro_dev_init *dev = &zorro_autocon_init[zorro_num_autocon++];  			dev->rom = cd->cd_Rom; -			dev->slotaddr = cd->cd_SlotAddr; -			dev->slotsize = cd->cd_SlotSize; -			dev->resource.start = (unsigned long)cd->cd_BoardAddr; -			dev->resource.end = dev->resource.start + cd->cd_BoardSize - 1; +			dev->slotaddr = be16_to_cpu(cd->cd_SlotAddr); +			dev->slotsize = be16_to_cpu(cd->cd_SlotSize); +			dev->boardaddr = be32_to_cpu(cd->cd_BoardAddr); +			dev->boardsize = be32_to_cpu(cd->cd_BoardSize);  		} else -			printk("amiga_parse_bootinfo: too many AutoConfig devices\n"); +			pr_warn("amiga_parse_bootinfo: too many AutoConfig devices\n");  #endif /* CONFIG_ZORRO */  		break; @@ -207,9 +209,9 @@ static void __init amiga_identify(void)  	memset(&amiga_hw_present, 0, sizeof(amiga_hw_present)); -	printk("Amiga hardware found: "); +	pr_info("Amiga hardware found: ");  	if (amiga_model >= AMI_500 && amiga_model <= AMI_DRACO) { -		printk("[%s] ", amiga_models[amiga_model-AMI_500]); +		pr_cont("[%s] ", amiga_models[amiga_model-AMI_500]);  		strcat(amiga_model_name, amiga_models[amiga_model-AMI_500]);  	} @@ -320,7 +322,7 @@ static void __init amiga_identify(void)  #define AMIGAHW_ANNOUNCE(name, str)		\  	if (AMIGAHW_PRESENT(name))		\ -		printk(str) +		pr_cont(str)  	AMIGAHW_ANNOUNCE(AMI_VIDEO, "VIDEO ");  	AMIGAHW_ANNOUNCE(AMI_BLITTER, "BLITTER "); @@ -352,12 +354,20 @@ static void __init amiga_identify(void)  	AMIGAHW_ANNOUNCE(MAGIC_REKICK, "MAGIC_REKICK ");  	AMIGAHW_ANNOUNCE(PCMCIA, "PCMCIA ");  	if (AMIGAHW_PRESENT(ZORRO)) -		printk("ZORRO%s ", AMIGAHW_PRESENT(ZORRO3) ? "3" : ""); -	printk("\n"); +		pr_cont("ZORRO%s ", AMIGAHW_PRESENT(ZORRO3) ? "3" : ""); +	pr_cont("\n");  #undef AMIGAHW_ANNOUNCE  } + +static unsigned long amiga_random_get_entropy(void) +{ +	/* VPOSR/VHPOSR provide at least 17 bits of data changing at 1.79 MHz */ +	return *(unsigned long *)&amiga_custom.vposr; +} + +      /*       *  Setup the Amiga configuration info       */ @@ -395,6 +405,8 @@ void __init config_amiga(void)  	mach_heartbeat = amiga_heartbeat;  #endif +	mach_random_get_entropy = amiga_random_get_entropy; +  	/* Fill in the clock value (based on the 700 kHz E-Clock) */  	amiga_colorclock = 5*amiga_eclock;	/* 3.5 MHz */ @@ -412,7 +424,7 @@ void __init config_amiga(void)  			if (m68k_memory[i].addr < 16*1024*1024) {  				if (i == 0) {  					/* don't cut off the branch we're sitting on */ -					printk("Warning: kernel runs in Zorro II memory\n"); +					pr_warn("Warning: kernel runs in Zorro II memory\n");  					continue;  				}  				disabled_z2mem += m68k_memory[i].size; @@ -423,8 +435,8 @@ void __init config_amiga(void)  			}  		}  		if (disabled_z2mem) -		printk("%dK of Zorro II memory will not be used as system memory\n", -		disabled_z2mem>>10); +			pr_info("%dK of Zorro II memory will not be used as system memory\n", +				disabled_z2mem>>10);  	}  	/* request all RAM */ @@ -463,7 +475,7 @@ static void __init amiga_sched_init(irq_handler_t timer_routine)  	jiffy_ticks = DIV_ROUND_CLOSEST(amiga_eclock, HZ);  	if (request_resource(&mb_resources._ciab, &sched_res)) -		printk("Cannot allocate ciab.ta{lo,hi}\n"); +		pr_warn("Cannot allocate ciab.ta{lo,hi}\n");  	ciab.cra &= 0xC0;   /* turn off timer A, continuous mode, from Eclk */  	ciab.talo = jiffy_ticks % 256;  	ciab.tahi = jiffy_ticks / 256; @@ -608,6 +620,8 @@ static void amiga_mem_console_write(struct console *co, const char *s,  static int __init amiga_savekmsg_setup(char *arg)  { +	bool registered; +  	if (!MACH_IS_AMIGA || strcmp(arg, "mem"))  		return 0; @@ -618,14 +632,16 @@ static int __init amiga_savekmsg_setup(char *arg)  	/* Just steal the block, the chipram allocator isn't functional yet */  	amiga_chip_size -= SAVEKMSG_MAXMEM; -	savekmsg = (void *)ZTWO_VADDR(CHIP_PHYSADDR + amiga_chip_size); +	savekmsg = ZTWO_VADDR(CHIP_PHYSADDR + amiga_chip_size);  	savekmsg->magic1 = SAVEKMSG_MAGIC1;  	savekmsg->magic2 = SAVEKMSG_MAGIC2;  	savekmsg->magicptr = ZTWO_PADDR(savekmsg);  	savekmsg->size = 0; +	registered = !!amiga_console_driver.write;  	amiga_console_driver.write = amiga_mem_console_write; -	register_console(&amiga_console_driver); +	if (!registered) +		register_console(&amiga_console_driver);  	return 0;  } @@ -707,11 +723,16 @@ void amiga_serial_gets(struct console *co, char *s, int len)  static int __init amiga_debug_setup(char *arg)  { -	if (MACH_IS_AMIGA && !strcmp(arg, "ser")) { -		/* no initialization required (?) */ -		amiga_console_driver.write = amiga_serial_console_write; +	bool registered; + +	if (!MACH_IS_AMIGA || strcmp(arg, "ser")) +		return 0; + +	/* no initialization required (?) */ +	registered = !!amiga_console_driver.write; +	amiga_console_driver.write = amiga_serial_console_write; +	if (!registered)  		register_console(&amiga_console_driver); -	}  	return 0;  }  | 
