/*
* linux/arch/m68k/mac/config.c
*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file COPYING in the main directory of this archive
* for more details.
*/
/*
* Miscellaneous linux stuff
*/
#include <linux/module.h>
#include <linux/types.h>
#include <linux/mm.h>
#include <linux/tty.h>
#include <linux/console.h>
#include <linux/interrupt.h>
/* keyb */
#include <linux/random.h>
#include <linux/delay.h>
/* keyb */
#include <linux/init.h>
#include <linux/vt_kern.h>
#include <linux/platform_device.h>
#include <linux/adb.h>
#include <linux/cuda.h>
#define BOOTINFO_COMPAT_1_0
#include <asm/setup.h>
#include <asm/bootinfo.h>
#include <asm/io.h>
#include <asm/irq.h>
#include <asm/pgtable.h>
#include <asm/rtc.h>
#include <asm/machdep.h>
#include <asm/macintosh.h>
#include <asm/macints.h>
#include <asm/machw.h>
#include <asm/mac_iop.h>
#include <asm/mac_via.h>
#include <asm/mac_oss.h>
#include <asm/mac_psc.h>
/* Mac bootinfo struct */
struct mac_booter_data mac_bi_data;
/* The phys. video addr. - might be bogus on some machines */
static unsigned long mac_orig_videoaddr;
/* Mac specific timer functions */
extern unsigned long mac_gettimeoffset(void);
extern int mac_hwclk(int, struct rtc_time *);
extern int mac_set_clock_mmss(unsigned long);
extern void iop_preinit(void);
extern void iop_init(void);
extern void via_init(void);
extern void via_init_clock(irq_handler_t func);
extern void via_flush_cache(void);
extern void oss_init(void);
extern void psc_init(void);
extern void baboon_init(void);
extern void mac_mksound(unsigned int, unsigned int);
static void mac_get_model(char *str);
static void mac_identify(void);
static void mac_report_hardware(void);
#ifdef CONFIG_EARLY_PRINTK
asmlinkage void __init mac_early_print(const char *s, unsigned n);
static void __init mac_early_cons_write(struct console *con,
const char *s, unsigned n)
{
mac_early_print(s, n);
}
static struct console __initdata mac_early_cons = {
.name = "early",
.write = mac_early_cons_write,
.flags = CON_PRINTBUFFER | CON_BOOT,
.index = -1
};
int __init mac_unregister_early_cons(void)
{
/* mac_early_print can't be used after init sections are discarded */
return unregister_console(&mac_early_cons);
}
late_initcall(mac_unregister_early_cons);
#endif
static void __init mac_sched_init(irq_handler_t vector)
{
via_init_clock(vector);
}
/*
* Parse a Macintosh-specific record in the bootinfo
*/
int __init mac_parse_bootinfo(const struct bi_record *record)
{
int unknown = 0;
const u_long *data = record->data;
switch (record->tag) {
case BI_MAC_MODEL:
mac_bi_data.id = *data;
break;
case BI_MAC_VADDR:
mac_bi_data.videoaddr = *data;
break;
case BI_MAC_VDEPTH:
mac_bi_data.videodepth = *data;
break;
case BI_MAC_VROW:
mac_bi_data.videorow = *data;
break;
case BI_MAC_VDIM:
mac_bi_data.dimensions = *data;
break;
case BI_MAC_VLOGICAL:
mac_bi_data.videological = VIDEOMEMBASE + (*data & ~VIDEOMEMMASK);
mac_orig_videoaddr = *data;
break;
case BI_MAC_SCCBASE:
mac_bi_data.sccbase = *data;
break;
case BI_MAC_BTIME:
mac_bi_data.boottime = *data;
break;
case BI_MAC_GMTBIAS:
mac_bi_data.gmtbias = *data;
break;
case BI_MAC_MEMSIZE:
mac_bi_data.memsize = *data;
break;
case BI_MAC_CPUID:
mac_bi_data.cpuid = *data;
break;
case BI_MAC_ROMBASE:
mac_bi_data.rombase = *data;
break;
default:
unknown = 1;
break;
}
return unknown;
}
/*
* Flip into 24bit mode for an instant - flushes the L2 cache card. We
* have to disable interrupts for this. Our IRQ handlers will crap
* themselves if they take an IRQ in 24bit mode!
*/
static void mac_cache_card_flush(int writeback)
{
unsigned long flags;
local_irq_save(flags);
via_flush_cache();
local_irq_restore(flags);
}
void __init config_mac(void)
{
if (!MACH_IS_MAC)
printk(KERN_ERR "ERROR: no Mac, but