mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 03:27:44 -04:00
Merge commit 'v2.6.35' into kbuild/kbuild
Conflicts: arch/powerpc/Makefile
This commit is contained in:
commit
772320e845
15241 changed files with 1249805 additions and 691683 deletions
|
|
@ -7,6 +7,7 @@ config M68K
|
|||
default y
|
||||
select HAVE_AOUT
|
||||
select HAVE_IDE
|
||||
select GENERIC_ATOMIC64
|
||||
|
||||
config MMU
|
||||
bool
|
||||
|
|
@ -536,10 +537,6 @@ config GVPIOEXT_PLIP
|
|||
Say Y to enable doing IP over the parallel port on your GVP
|
||||
IO-Extender card, N otherwise.
|
||||
|
||||
config MAC_SCC
|
||||
tristate "Macintosh serial support"
|
||||
depends on MAC
|
||||
|
||||
config MAC_HID
|
||||
bool
|
||||
depends on INPUT_ADBHID
|
||||
|
|
@ -595,7 +592,7 @@ config DN_SERIAL
|
|||
|
||||
config SERIAL_CONSOLE
|
||||
bool "Support for serial port console"
|
||||
depends on (AMIGA || ATARI || MAC || SUN3 || SUN3X || VME || APOLLO) && (ATARI_MFPSER=y || ATARI_MIDI=y || MAC_SCC=y || AMIGA_BUILTIN_SERIAL=y || GVPIOEXT=y || MULTIFACE_III_TTY=y || SERIAL=y || MVME147_SCC || SERIAL167 || MVME162_SCC || BVME6000_SCC || DN_SERIAL)
|
||||
depends on (AMIGA || ATARI || SUN3 || SUN3X || VME || APOLLO) && (ATARI_MFPSER=y || ATARI_MIDI=y || AMIGA_BUILTIN_SERIAL=y || GVPIOEXT=y || MULTIFACE_III_TTY=y || SERIAL=y || MVME147_SCC || SERIAL167 || MVME162_SCC || BVME6000_SCC || DN_SERIAL)
|
||||
---help---
|
||||
If you say Y here, it will be possible to use a serial port as the
|
||||
system console (the system console is the device which receives all
|
||||
|
|
|
|||
|
|
@ -2,6 +2,6 @@
|
|||
# Makefile for Linux arch/m68k/amiga source directory
|
||||
#
|
||||
|
||||
obj-y := config.o amiints.o cia.o chipram.o amisound.o
|
||||
obj-y := config.o amiints.o cia.o chipram.o amisound.o platform.o
|
||||
|
||||
obj-$(CONFIG_AMIGA_PCMCIA) += pcmcia.o
|
||||
|
|
|
|||
|
|
@ -97,10 +97,6 @@ static void amiga_get_model(char *model);
|
|||
static void amiga_get_hardware_list(struct seq_file *m);
|
||||
/* amiga specific timer functions */
|
||||
static unsigned long amiga_gettimeoffset(void);
|
||||
static int a3000_hwclk(int, struct rtc_time *);
|
||||
static int a2000_hwclk(int, struct rtc_time *);
|
||||
static int amiga_set_clock_mmss(unsigned long);
|
||||
static unsigned int amiga_get_ss(void);
|
||||
extern void amiga_mksound(unsigned int count, unsigned int ticks);
|
||||
static void amiga_reset(void);
|
||||
extern void amiga_init_sound(void);
|
||||
|
|
@ -138,10 +134,6 @@ static struct {
|
|||
}
|
||||
};
|
||||
|
||||
static struct resource rtc_resource = {
|
||||
.start = 0x00dc0000, .end = 0x00dcffff
|
||||
};
|
||||
|
||||
static struct resource ram_resource[NUM_MEMINFO];
|
||||
|
||||
|
||||
|
|
@ -387,15 +379,6 @@ void __init config_amiga(void)
|
|||
mach_get_model = amiga_get_model;
|
||||
mach_get_hardware_list = amiga_get_hardware_list;
|
||||
mach_gettimeoffset = amiga_gettimeoffset;
|
||||
if (AMIGAHW_PRESENT(A3000_CLK)) {
|
||||
mach_hwclk = a3000_hwclk;
|
||||
rtc_resource.name = "A3000 RTC";
|
||||
request_resource(&iomem_resource, &rtc_resource);
|
||||
} else /* if (AMIGAHW_PRESENT(A2000_CLK)) */ {
|
||||
mach_hwclk = a2000_hwclk;
|
||||
rtc_resource.name = "A2000 RTC";
|
||||
request_resource(&iomem_resource, &rtc_resource);
|
||||
}
|
||||
|
||||
/*
|
||||
* default MAX_DMA=0xffffffff on all machines. If we don't do so, the SCSI
|
||||
|
|
@ -404,8 +387,6 @@ void __init config_amiga(void)
|
|||
*/
|
||||
mach_max_dma_address = 0xffffffff;
|
||||
|
||||
mach_set_clock_mmss = amiga_set_clock_mmss;
|
||||
mach_get_ss = amiga_get_ss;
|
||||
mach_reset = amiga_reset;
|
||||
#if defined(CONFIG_INPUT_M68K_BEEP) || defined(CONFIG_INPUT_M68K_BEEP_MODULE)
|
||||
mach_beep = amiga_mksound;
|
||||
|
|
@ -480,7 +461,7 @@ static void __init amiga_sched_init(irq_handler_t timer_routine)
|
|||
static struct resource sched_res = {
|
||||
.name = "timer", .start = 0x00bfd400, .end = 0x00bfd5ff,
|
||||
};
|
||||
jiffy_ticks = (amiga_eclock+HZ/2)/HZ;
|
||||
jiffy_ticks = DIV_ROUND_CLOSEST(amiga_eclock, HZ);
|
||||
|
||||
if (request_resource(&mb_resources._ciab, &sched_res))
|
||||
printk("Cannot allocate ciab.ta{lo,hi}\n");
|
||||
|
|
@ -530,161 +511,6 @@ static unsigned long amiga_gettimeoffset(void)
|
|||
return ticks + offset;
|
||||
}
|
||||
|
||||
static int a3000_hwclk(int op, struct rtc_time *t)
|
||||
{
|
||||
tod_3000.cntrl1 = TOD3000_CNTRL1_HOLD;
|
||||
|
||||
if (!op) { /* read */
|
||||
t->tm_sec = tod_3000.second1 * 10 + tod_3000.second2;
|
||||
t->tm_min = tod_3000.minute1 * 10 + tod_3000.minute2;
|
||||
t->tm_hour = tod_3000.hour1 * 10 + tod_3000.hour2;
|
||||
t->tm_mday = tod_3000.day1 * 10 + tod_3000.day2;
|
||||
t->tm_wday = tod_3000.weekday;
|
||||
t->tm_mon = tod_3000.month1 * 10 + tod_3000.month2 - 1;
|
||||
t->tm_year = tod_3000.year1 * 10 + tod_3000.year2;
|
||||
if (t->tm_year <= 69)
|
||||
t->tm_year += 100;
|
||||
} else {
|
||||
tod_3000.second1 = t->tm_sec / 10;
|
||||
tod_3000.second2 = t->tm_sec % 10;
|
||||
tod_3000.minute1 = t->tm_min / 10;
|
||||
tod_3000.minute2 = t->tm_min % 10;
|
||||
tod_3000.hour1 = t->tm_hour / 10;
|
||||
tod_3000.hour2 = t->tm_hour % 10;
|
||||
tod_3000.day1 = t->tm_mday / 10;
|
||||
tod_3000.day2 = t->tm_mday % 10;
|
||||
if (t->tm_wday != -1)
|
||||
tod_3000.weekday = t->tm_wday;
|
||||
tod_3000.month1 = (t->tm_mon + 1) / 10;
|
||||
tod_3000.month2 = (t->tm_mon + 1) % 10;
|
||||
if (t->tm_year >= 100)
|
||||
t->tm_year -= 100;
|
||||
tod_3000.year1 = t->tm_year / 10;
|
||||
tod_3000.year2 = t->tm_year % 10;
|
||||
}
|
||||
|
||||
tod_3000.cntrl1 = TOD3000_CNTRL1_FREE;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int a2000_hwclk(int op, struct rtc_time *t)
|
||||
{
|
||||
int cnt = 5;
|
||||
|
||||
tod_2000.cntrl1 = TOD2000_CNTRL1_HOLD;
|
||||
|
||||
while ((tod_2000.cntrl1 & TOD2000_CNTRL1_BUSY) && cnt) {
|
||||
tod_2000.cntrl1 &= ~TOD2000_CNTRL1_HOLD;
|
||||
udelay(70);
|
||||
tod_2000.cntrl1 |= TOD2000_CNTRL1_HOLD;
|
||||
--cnt;
|
||||
}
|
||||
|
||||
if (!cnt)
|
||||
printk(KERN_INFO "hwclk: timed out waiting for RTC (0x%x)\n",
|
||||
tod_2000.cntrl1);
|
||||
|
||||
if (!op) { /* read */
|
||||
t->tm_sec = tod_2000.second1 * 10 + tod_2000.second2;
|
||||
t->tm_min = tod_2000.minute1 * 10 + tod_2000.minute2;
|
||||
t->tm_hour = (tod_2000.hour1 & 3) * 10 + tod_2000.hour2;
|
||||
t->tm_mday = tod_2000.day1 * 10 + tod_2000.day2;
|
||||
t->tm_wday = tod_2000.weekday;
|
||||
t->tm_mon = tod_2000.month1 * 10 + tod_2000.month2 - 1;
|
||||
t->tm_year = tod_2000.year1 * 10 + tod_2000.year2;
|
||||
if (t->tm_year <= 69)
|
||||
t->tm_year += 100;
|
||||
|
||||
if (!(tod_2000.cntrl3 & TOD2000_CNTRL3_24HMODE)) {
|
||||
if (!(tod_2000.hour1 & TOD2000_HOUR1_PM) && t->tm_hour == 12)
|
||||
t->tm_hour = 0;
|
||||
else if ((tod_2000.hour1 & TOD2000_HOUR1_PM) && t->tm_hour != 12)
|
||||
t->tm_hour += 12;
|
||||
}
|
||||
} else {
|
||||
tod_2000.second1 = t->tm_sec / 10;
|
||||
tod_2000.second2 = t->tm_sec % 10;
|
||||
tod_2000.minute1 = t->tm_min / 10;
|
||||
tod_2000.minute2 = t->tm_min % 10;
|
||||
if (tod_2000.cntrl3 & TOD2000_CNTRL3_24HMODE)
|
||||
tod_2000.hour1 = t->tm_hour / 10;
|
||||
else if (t->tm_hour >= 12)
|
||||
tod_2000.hour1 = TOD2000_HOUR1_PM +
|
||||
(t->tm_hour - 12) / 10;
|
||||
else
|
||||
tod_2000.hour1 = t->tm_hour / 10;
|
||||
tod_2000.hour2 = t->tm_hour % 10;
|
||||
tod_2000.day1 = t->tm_mday / 10;
|
||||
tod_2000.day2 = t->tm_mday % 10;
|
||||
if (t->tm_wday != -1)
|
||||
tod_2000.weekday = t->tm_wday;
|
||||
tod_2000.month1 = (t->tm_mon + 1) / 10;
|
||||
tod_2000.month2 = (t->tm_mon + 1) % 10;
|
||||
if (t->tm_year >= 100)
|
||||
t->tm_year -= 100;
|
||||
tod_2000.year1 = t->tm_year / 10;
|
||||
tod_2000.year2 = t->tm_year % 10;
|
||||
}
|
||||
|
||||
tod_2000.cntrl1 &= ~TOD2000_CNTRL1_HOLD;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int amiga_set_clock_mmss(unsigned long nowtime)
|
||||
{
|
||||
short real_seconds = nowtime % 60, real_minutes = (nowtime / 60) % 60;
|
||||
|
||||
if (AMIGAHW_PRESENT(A3000_CLK)) {
|
||||
tod_3000.cntrl1 = TOD3000_CNTRL1_HOLD;
|
||||
|
||||
tod_3000.second1 = real_seconds / 10;
|
||||
tod_3000.second2 = real_seconds % 10;
|
||||
tod_3000.minute1 = real_minutes / 10;
|
||||
tod_3000.minute2 = real_minutes % 10;
|
||||
|
||||
tod_3000.cntrl1 = TOD3000_CNTRL1_FREE;
|
||||
} else /* if (AMIGAHW_PRESENT(A2000_CLK)) */ {
|
||||
int cnt = 5;
|
||||
|
||||
tod_2000.cntrl1 |= TOD2000_CNTRL1_HOLD;
|
||||
|
||||
while ((tod_2000.cntrl1 & TOD2000_CNTRL1_BUSY) && cnt) {
|
||||
tod_2000.cntrl1 &= ~TOD2000_CNTRL1_HOLD;
|
||||
udelay(70);
|
||||
tod_2000.cntrl1 |= TOD2000_CNTRL1_HOLD;
|
||||
--cnt;
|
||||
}
|
||||
|
||||
if (!cnt)
|
||||
printk(KERN_INFO "set_clock_mmss: timed out waiting for RTC (0x%x)\n", tod_2000.cntrl1);
|
||||
|
||||
tod_2000.second1 = real_seconds / 10;
|
||||
tod_2000.second2 = real_seconds % 10;
|
||||
tod_2000.minute1 = real_minutes / 10;
|
||||
tod_2000.minute2 = real_minutes % 10;
|
||||
|
||||
tod_2000.cntrl1 &= ~TOD2000_CNTRL1_HOLD;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static unsigned int amiga_get_ss(void)
|
||||
{
|
||||
unsigned int s;
|
||||
|
||||
if (AMIGAHW_PRESENT(A3000_CLK)) {
|
||||
tod_3000.cntrl1 = TOD3000_CNTRL1_HOLD;
|
||||
s = tod_3000.second1 * 10 + tod_3000.second2;
|
||||
tod_3000.cntrl1 = TOD3000_CNTRL1_FREE;
|
||||
} else /* if (AMIGAHW_PRESENT(A2000_CLK)) */ {
|
||||
s = tod_2000.second1 * 10 + tod_2000.second2;
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
static NORET_TYPE void amiga_reset(void)
|
||||
ATTRIB_NORET;
|
||||
|
||||
|
|
|
|||
197
arch/m68k/amiga/platform.c
Normal file
197
arch/m68k/amiga/platform.c
Normal file
|
|
@ -0,0 +1,197 @@
|
|||
/*
|
||||
* Copyright (C) 2007-2009 Geert Uytterhoeven
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/zorro.h>
|
||||
|
||||
#include <asm/amigahw.h>
|
||||
#include <asm/amigayle.h>
|
||||
|
||||
|
||||
#ifdef CONFIG_ZORRO
|
||||
|
||||
static const struct resource zorro_resources[] __initconst = {
|
||||
/* Zorro II regions (on Zorro II/III) */
|
||||
{
|
||||
.name = "Zorro II exp",
|
||||
.start = 0x00e80000,
|
||||
.end = 0x00efffff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
}, {
|
||||
.name = "Zorro II mem",
|
||||
.start = 0x00200000,
|
||||
.end = 0x009fffff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
/* Zorro III regions (on Zorro III only) */
|
||||
{
|
||||
.name = "Zorro III exp",
|
||||
.start = 0xff000000,
|
||||
.end = 0xffffffff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
}, {
|
||||
.name = "Zorro III cfg",
|
||||
.start = 0x40000000,
|
||||
.end = 0x7fffffff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
static int __init amiga_init_bus(void)
|
||||
{
|
||||
if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(ZORRO))
|
||||
return -ENODEV;
|
||||
|
||||
platform_device_register_simple("amiga-zorro", -1, zorro_resources,
|
||||
AMIGAHW_PRESENT(ZORRO3) ? 4 : 2);
|
||||
return 0;
|
||||
}
|
||||
|
||||
subsys_initcall(amiga_init_bus);
|
||||
|
||||
|
||||
static int z_dev_present(zorro_id id)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < zorro_num_autocon; i++)
|
||||
if (zorro_autocon[i].rom.er_Manufacturer == ZORRO_MANUF(id) &&
|
||||
zorro_autocon[i].rom.er_Product == ZORRO_PROD(id))
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else /* !CONFIG_ZORRO */
|
||||
|
||||
static inline int z_dev_present(zorro_id id) { return 0; }
|
||||
|
||||
#endif /* !CONFIG_ZORRO */
|
||||
|
||||
|
||||
static const struct resource a3000_scsi_resource __initconst = {
|
||||
.start = 0xdd0000,
|
||||
.end = 0xdd00ff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
};
|
||||
|
||||
|
||||
static const struct resource a4000t_scsi_resource __initconst = {
|
||||
.start = 0xdd0000,
|
||||
.end = 0xdd0fff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
};
|
||||
|
||||
|
||||
static const struct resource a1200_ide_resource __initconst = {
|
||||
.start = 0xda0000,
|
||||
.end = 0xda1fff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
};
|
||||
|
||||
static const struct gayle_ide_platform_data a1200_ide_pdata __initconst = {
|
||||
.base = 0xda0000,
|
||||
.irqport = 0xda9000,
|
||||
.explicit_ack = 1,
|
||||
};
|
||||
|
||||
|
||||
static const struct resource a4000_ide_resource __initconst = {
|
||||
.start = 0xdd2000,
|
||||
.end = 0xdd3fff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
};
|
||||
|
||||
static const struct gayle_ide_platform_data a4000_ide_pdata __initconst = {
|
||||
.base = 0xdd2020,
|
||||
.irqport = 0xdd3020,
|
||||
.explicit_ack = 0,
|
||||
};
|
||||
|
||||
|
||||
static const struct resource amiga_rtc_resource __initconst = {
|
||||
.start = 0x00dc0000,
|
||||
.end = 0x00dcffff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
};
|
||||
|
||||
|
||||
static int __init amiga_init_devices(void)
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
|
||||
if (!MACH_IS_AMIGA)
|
||||
return -ENODEV;
|
||||
|
||||
/* video hardware */
|
||||
if (AMIGAHW_PRESENT(AMI_VIDEO))
|
||||
platform_device_register_simple("amiga-video", -1, NULL, 0);
|
||||
|
||||
|
||||
/* sound hardware */
|
||||
if (AMIGAHW_PRESENT(AMI_AUDIO))
|
||||
platform_device_register_simple("amiga-audio", -1, NULL, 0);
|
||||
|
||||
|
||||
/* storage interfaces */
|
||||
if (AMIGAHW_PRESENT(AMI_FLOPPY))
|
||||
platform_device_register_simple("amiga-floppy", -1, NULL, 0);
|
||||
|
||||
if (AMIGAHW_PRESENT(A3000_SCSI))
|
||||
platform_device_register_simple("amiga-a3000-scsi", -1,
|
||||
&a3000_scsi_resource, 1);
|
||||
|
||||
if (AMIGAHW_PRESENT(A4000_SCSI))
|
||||
platform_device_register_simple("amiga-a4000t-scsi", -1,
|
||||
&a4000t_scsi_resource, 1);
|
||||
|
||||
if (AMIGAHW_PRESENT(A1200_IDE) ||
|
||||
z_dev_present(ZORRO_PROD_MTEC_VIPER_MK_V_E_MATRIX_530_SCSI_IDE)) {
|
||||
pdev = platform_device_register_simple("amiga-gayle-ide", -1,
|
||||
&a1200_ide_resource, 1);
|
||||
platform_device_add_data(pdev, &a1200_ide_pdata,
|
||||
sizeof(a1200_ide_pdata));
|
||||
}
|
||||
|
||||
if (AMIGAHW_PRESENT(A4000_IDE)) {
|
||||
pdev = platform_device_register_simple("amiga-gayle-ide", -1,
|
||||
&a4000_ide_resource, 1);
|
||||
platform_device_add_data(pdev, &a4000_ide_pdata,
|
||||
sizeof(a4000_ide_pdata));
|
||||
}
|
||||
|
||||
|
||||
/* other I/O hardware */
|
||||
if (AMIGAHW_PRESENT(AMI_KEYBOARD))
|
||||
platform_device_register_simple("amiga-keyboard", -1, NULL, 0);
|
||||
|
||||
if (AMIGAHW_PRESENT(AMI_MOUSE))
|
||||
platform_device_register_simple("amiga-mouse", -1, NULL, 0);
|
||||
|
||||
if (AMIGAHW_PRESENT(AMI_SERIAL))
|
||||
platform_device_register_simple("amiga-serial", -1, NULL, 0);
|
||||
|
||||
if (AMIGAHW_PRESENT(AMI_PARALLEL))
|
||||
platform_device_register_simple("amiga-parallel", -1, NULL, 0);
|
||||
|
||||
|
||||
/* real time clocks */
|
||||
if (AMIGAHW_PRESENT(A2000_CLK))
|
||||
platform_device_register_simple("rtc-msm6242", -1,
|
||||
&amiga_rtc_resource, 1);
|
||||
|
||||
if (AMIGAHW_PRESENT(A3000_CLK))
|
||||
platform_device_register_simple("rtc-rp5c01", -1,
|
||||
&amiga_rtc_resource, 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
device_initcall(amiga_init_devices);
|
||||
|
|
@ -121,7 +121,7 @@ KEYBOARD_STATE kb_state;
|
|||
* bytes have been lost and in which state of the packet structure we are now.
|
||||
* This usually causes keyboards bytes to be interpreted as mouse movements
|
||||
* and vice versa, which is very annoying. It seems better to throw away some
|
||||
* bytes (that are usually mouse bytes) than to misinterpret them. Therefor I
|
||||
* bytes (that are usually mouse bytes) than to misinterpret them. Therefore I
|
||||
* introduced the RESYNC state for IKBD data. In this state, the bytes up to
|
||||
* one that really looks like a key event (0x04..0xf2) or the start of a mouse
|
||||
* packet (0xf8..0xfb) are thrown away, but at most 2 bytes. This at least
|
||||
|
|
|
|||
|
|
@ -9,8 +9,6 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/miscdevice.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/smp_lock.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/capability.h>
|
||||
#include <linux/fcntl.h>
|
||||
|
|
@ -36,10 +34,9 @@
|
|||
static unsigned char days_in_mo[] =
|
||||
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
|
||||
|
||||
static char rtc_status;
|
||||
static atomic_t rtc_status = ATOMIC_INIT(1);
|
||||
|
||||
static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
static long rtc_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
volatile RtcPtr_t rtc = (RtcPtr_t)BVME_RTC_BASE;
|
||||
unsigned char msr;
|
||||
|
|
@ -133,29 +130,20 @@ static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
|
|||
}
|
||||
|
||||
/*
|
||||
* We enforce only one user at a time here with the open/close.
|
||||
* Also clear the previous interrupt data on an open, and clean
|
||||
* up things on a close.
|
||||
* We enforce only one user at a time here with the open/close.
|
||||
*/
|
||||
|
||||
static int rtc_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
lock_kernel();
|
||||
if(rtc_status) {
|
||||
unlock_kernel();
|
||||
if (!atomic_dec_and_test(&rtc_status)) {
|
||||
atomic_inc(&rtc_status);
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
rtc_status = 1;
|
||||
unlock_kernel();
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rtc_release(struct inode *inode, struct file *file)
|
||||
{
|
||||
lock_kernel();
|
||||
rtc_status = 0;
|
||||
unlock_kernel();
|
||||
atomic_inc(&rtc_status);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -164,9 +152,9 @@ static int rtc_release(struct inode *inode, struct file *file)
|
|||
*/
|
||||
|
||||
static const struct file_operations rtc_fops = {
|
||||
.ioctl = rtc_ioctl,
|
||||
.open = rtc_open,
|
||||
.release = rtc_release,
|
||||
.unlocked_ioctl = rtc_ioctl,
|
||||
.open = rtc_open,
|
||||
.release = rtc_release,
|
||||
};
|
||||
|
||||
static struct miscdevice rtc_dev = {
|
||||
|
|
|
|||
|
|
@ -701,6 +701,11 @@ CONFIG_VT_HW_CONSOLE_BINDING=y
|
|||
#
|
||||
# Non-8250 serial port support
|
||||
#
|
||||
CONFIG_SERIAL_CORE=y
|
||||
CONFIG_SERIAL_CORE_CONSOLE=y
|
||||
CONFIG_SERIAL_PMACZILOG=y
|
||||
CONFIG_SERIAL_PMACZILOG_TTYS=y
|
||||
CONFIG_SERIAL_PMACZILOG_CONSOLE=y
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
|
||||
CONFIG_LEGACY_PTYS=y
|
||||
|
|
@ -834,9 +839,7 @@ CONFIG_HIDRAW=y
|
|||
#
|
||||
# Character devices
|
||||
#
|
||||
CONFIG_MAC_SCC=y
|
||||
CONFIG_MAC_HID=y
|
||||
CONFIG_SERIAL_CONSOLE=y
|
||||
|
||||
#
|
||||
# File systems
|
||||
|
|
|
|||
|
|
@ -822,6 +822,11 @@ CONFIG_A2232=y
|
|||
#
|
||||
# Non-8250 serial port support
|
||||
#
|
||||
CONFIG_SERIAL_CORE=y
|
||||
CONFIG_SERIAL_CORE_CONSOLE=y
|
||||
CONFIG_SERIAL_PMACZILOG=y
|
||||
CONFIG_SERIAL_PMACZILOG_TTYS=y
|
||||
CONFIG_SERIAL_PMACZILOG_CONSOLE=y
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
|
||||
CONFIG_LEGACY_PTYS=y
|
||||
|
|
@ -982,7 +987,6 @@ CONFIG_ATARI_MIDI=y
|
|||
CONFIG_ATARI_DSP56K=m
|
||||
CONFIG_AMIGA_BUILTIN_SERIAL=y
|
||||
CONFIG_MULTIFACE_III_TTY=m
|
||||
CONFIG_MAC_SCC=y
|
||||
CONFIG_MAC_HID=y
|
||||
CONFIG_MVME147_SCC=y
|
||||
CONFIG_SERIAL167=y
|
||||
|
|
|
|||
|
|
@ -1,4 +1,2 @@
|
|||
extern void hp300_sched_init(irq_handler_t vector);
|
||||
extern unsigned long hp300_gettimeoffset (void);
|
||||
|
||||
|
||||
extern unsigned long hp300_gettimeoffset(void);
|
||||
|
|
|
|||
|
|
@ -104,4 +104,10 @@ struct GAYLE {
|
|||
#define GAYLE_CFG_250NS 0x00
|
||||
#define GAYLE_CFG_720NS 0x0c
|
||||
|
||||
struct gayle_ide_platform_data {
|
||||
unsigned long base;
|
||||
unsigned long irqport;
|
||||
int explicit_ack; /* A1200 IDE needs explicit ack */
|
||||
};
|
||||
|
||||
#endif /* asm-m68k/amigayle.h */
|
||||
|
|
|
|||
|
|
@ -3,3 +3,5 @@
|
|||
#else
|
||||
#include "atomic_mm.h"
|
||||
#endif
|
||||
|
||||
#include <asm-generic/atomic64.h>
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
|
||||
#define ATOMIC_INIT(i) { (i) }
|
||||
|
||||
#define atomic_read(v) ((v)->counter)
|
||||
#define atomic_read(v) (*(volatile int *)&(v)->counter)
|
||||
#define atomic_set(v, i) (((v)->counter) = i)
|
||||
|
||||
static inline void atomic_add(int i, atomic_t *v)
|
||||
|
|
@ -148,14 +148,18 @@ static inline int atomic_xchg(atomic_t *v, int new)
|
|||
static inline int atomic_sub_and_test(int i, atomic_t *v)
|
||||
{
|
||||
char c;
|
||||
__asm__ __volatile__("subl %2,%1; seq %0" : "=d" (c), "+m" (*v): "g" (i));
|
||||
__asm__ __volatile__("subl %2,%1; seq %0"
|
||||
: "=d" (c), "+m" (*v)
|
||||
: "id" (i));
|
||||
return c != 0;
|
||||
}
|
||||
|
||||
static inline int atomic_add_negative(int i, atomic_t *v)
|
||||
{
|
||||
char c;
|
||||
__asm__ __volatile__("addl %2,%1; smi %0" : "=d" (c), "+m" (*v): "g" (i));
|
||||
__asm__ __volatile__("addl %2,%1; smi %0"
|
||||
: "=d" (c), "+m" (*v)
|
||||
: "id" (i));
|
||||
return c != 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
|
||||
#define ATOMIC_INIT(i) { (i) }
|
||||
|
||||
#define atomic_read(v) ((v)->counter)
|
||||
#define atomic_read(v) (*(volatile int *)&(v)->counter)
|
||||
#define atomic_set(v, i) (((v)->counter) = i)
|
||||
|
||||
static __inline__ void atomic_add(int i, atomic_t *v)
|
||||
|
|
|
|||
|
|
@ -365,6 +365,10 @@ static inline int minix_test_bit(int nr, const void *vaddr)
|
|||
#define ext2_set_bit_atomic(lock, nr, addr) test_and_set_bit((nr) ^ 24, (unsigned long *)(addr))
|
||||
#define ext2_clear_bit(nr, addr) __test_and_clear_bit((nr) ^ 24, (unsigned long *)(addr))
|
||||
#define ext2_clear_bit_atomic(lock, nr, addr) test_and_clear_bit((nr) ^ 24, (unsigned long *)(addr))
|
||||
#define ext2_find_next_zero_bit(addr, size, offset) \
|
||||
generic_find_next_zero_le_bit((unsigned long *)addr, size, offset)
|
||||
#define ext2_find_next_bit(addr, size, offset) \
|
||||
generic_find_next_le_bit((unsigned long *)addr, size, offset)
|
||||
|
||||
static inline int ext2_test_bit(int nr, const void *vaddr)
|
||||
{
|
||||
|
|
@ -394,10 +398,9 @@ static inline int ext2_find_first_zero_bit(const void *vaddr, unsigned size)
|
|||
return (p - addr) * 32 + res;
|
||||
}
|
||||
|
||||
static inline int ext2_find_next_zero_bit(const void *vaddr, unsigned size,
|
||||
unsigned offset)
|
||||
static inline unsigned long generic_find_next_zero_le_bit(const unsigned long *addr,
|
||||
unsigned long size, unsigned long offset)
|
||||
{
|
||||
const unsigned long *addr = vaddr;
|
||||
const unsigned long *p = addr + (offset >> 5);
|
||||
int bit = offset & 31UL, res;
|
||||
|
||||
|
|
@ -437,10 +440,9 @@ static inline int ext2_find_first_bit(const void *vaddr, unsigned size)
|
|||
return (p - addr) * 32 + res;
|
||||
}
|
||||
|
||||
static inline int ext2_find_next_bit(const void *vaddr, unsigned size,
|
||||
unsigned offset)
|
||||
static inline unsigned long generic_find_next_le_bit(const unsigned long *addr,
|
||||
unsigned long size, unsigned long offset)
|
||||
{
|
||||
const unsigned long *addr = vaddr;
|
||||
const unsigned long *p = addr + (offset >> 5);
|
||||
int bit = offset & 31UL, res;
|
||||
|
||||
|
|
|
|||
|
|
@ -8,4 +8,6 @@
|
|||
#define L1_CACHE_SHIFT 4
|
||||
#define L1_CACHE_BYTES (1<< L1_CACHE_SHIFT)
|
||||
|
||||
#define ARCH_KMALLOC_MINALIGN L1_CACHE_BYTES
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -173,7 +173,7 @@ struct mdi_cfginfo {
|
|||
int mdi_ncluts; /* Number of implemented CLUTs in this MDI */
|
||||
int mdi_type; /* FBTYPE name */
|
||||
int mdi_height; /* height */
|
||||
int mdi_width; /* widht */
|
||||
int mdi_width; /* width */
|
||||
int mdi_size; /* available ram */
|
||||
int mdi_mode; /* 8bpp, 16bpp or 32bpp */
|
||||
int mdi_pixfreq; /* pixel clock (from PROM) */
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@
|
|||
* memory location directly.
|
||||
*/
|
||||
/* ++roman: The assignments to temp. vars avoid that gcc sometimes generates
|
||||
* two accesses to memory, which may be undesireable for some devices.
|
||||
* two accesses to memory, which may be undesirable for some devices.
|
||||
*/
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -113,6 +113,7 @@
|
|||
|
||||
#define MCF_GPIO_PAR_UART (0xA4036)
|
||||
#define MCF_GPIO_PAR_FECI2C (0xA4033)
|
||||
#define MCF_GPIO_PAR_QSPI (0xA4034)
|
||||
#define MCF_GPIO_PAR_FEC (0xA4038)
|
||||
|
||||
#define MCF_GPIO_PAR_UART_PAR_URXD0 (0x0001)
|
||||
|
|
|
|||
|
|
@ -127,5 +127,10 @@
|
|||
#define MCFGPIO_IRQ_MAX 8
|
||||
#define MCFGPIO_IRQ_VECBASE MCFINT_VECBASE
|
||||
|
||||
/*
|
||||
* Pin Assignment
|
||||
*/
|
||||
#define MCFGPIO_PAR_QSPI (MCF_IPSBAR + 0x10004A)
|
||||
#define MCFGPIO_PAR_TIMER (MCF_IPSBAR + 0x10004C)
|
||||
/****************************************************************************/
|
||||
#endif /* m523xsim_h */
|
||||
|
|
|
|||
|
|
@ -69,10 +69,12 @@
|
|||
#define MCFSIM_DMA1ICR MCFSIM_ICR7 /* DMA 1 ICR */
|
||||
#define MCFSIM_DMA2ICR MCFSIM_ICR8 /* DMA 2 ICR */
|
||||
#define MCFSIM_DMA3ICR MCFSIM_ICR9 /* DMA 3 ICR */
|
||||
#define MCFSIM_QSPIICR MCFSIM_ICR10 /* QSPI ICR */
|
||||
|
||||
/*
|
||||
* Define system peripheral IRQ usage.
|
||||
*/
|
||||
#define MCF_IRQ_QSPI 28 /* QSPI, Level 4 */
|
||||
#define MCF_IRQ_TIMER 30 /* Timer0, Level 6 */
|
||||
#define MCF_IRQ_PROFILER 31 /* Timer1, Level 7 */
|
||||
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@
|
|||
#define MCFINT_UART0 13 /* Interrupt number for UART0 */
|
||||
#define MCFINT_UART1 14 /* Interrupt number for UART1 */
|
||||
#define MCFINT_UART2 15 /* Interrupt number for UART2 */
|
||||
#define MCFINT_QSPI 18 /* Interrupt number for QSPI */
|
||||
#define MCFINT_PIT1 36 /* Interrupt number for PIT1 */
|
||||
|
||||
/*
|
||||
|
|
@ -120,6 +121,9 @@
|
|||
#define MCFGPIO_PIN_MAX 100
|
||||
#define MCFGPIO_IRQ_MAX 8
|
||||
#define MCFGPIO_IRQ_VECBASE MCFINT_VECBASE
|
||||
|
||||
#define MCFGPIO_PAR_QSPI (MCF_IPSBAR + 0x10004A)
|
||||
#define MCFGPIO_PAR_TIMER (MCF_IPSBAR + 0x10004C)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_M5275
|
||||
|
|
@ -212,6 +216,8 @@
|
|||
#define MCFGPIO_PIN_MAX 148
|
||||
#define MCFGPIO_IRQ_MAX 8
|
||||
#define MCFGPIO_IRQ_VECBASE MCFINT_VECBASE
|
||||
|
||||
#define MCFGPIO_PAR_QSPI (MCF_IPSBAR + 0x10007E)
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
@ -223,6 +229,7 @@
|
|||
#define MCFEPORT_EPPDR (MCF_IPSBAR + 0x130005)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* GPIO pins setups to enable the UARTs.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@
|
|||
|
||||
#define MCFINT_VECBASE 64 /* Vector base number */
|
||||
#define MCFINT_UART0 13 /* Interrupt number for UART0 */
|
||||
#define MCFINT_QSPI 18 /* Interrupt number for QSPI */
|
||||
#define MCFINT_PIT1 55 /* Interrupt number for PIT1 */
|
||||
|
||||
/*
|
||||
|
|
@ -249,70 +250,4 @@
|
|||
#define MCF5282_I2C_I2SR_RXAK (0x01) // received acknowledge
|
||||
|
||||
|
||||
|
||||
/*********************************************************************
|
||||
*
|
||||
* Queued Serial Peripheral Interface (QSPI) Module
|
||||
*
|
||||
*********************************************************************/
|
||||
/* Derek - 21 Feb 2005 */
|
||||
/* change to the format used in I2C */
|
||||
/* Read/Write access macros for general use */
|
||||
#define MCF5282_QSPI_QMR MCF_IPSBAR + 0x0340
|
||||
#define MCF5282_QSPI_QDLYR MCF_IPSBAR + 0x0344
|
||||
#define MCF5282_QSPI_QWR MCF_IPSBAR + 0x0348
|
||||
#define MCF5282_QSPI_QIR MCF_IPSBAR + 0x034C
|
||||
#define MCF5282_QSPI_QAR MCF_IPSBAR + 0x0350
|
||||
#define MCF5282_QSPI_QDR MCF_IPSBAR + 0x0354
|
||||
#define MCF5282_QSPI_QCR MCF_IPSBAR + 0x0354
|
||||
|
||||
/* Bit level definitions and macros */
|
||||
#define MCF5282_QSPI_QMR_MSTR (0x8000)
|
||||
#define MCF5282_QSPI_QMR_DOHIE (0x4000)
|
||||
#define MCF5282_QSPI_QMR_BITS_16 (0x0000)
|
||||
#define MCF5282_QSPI_QMR_BITS_8 (0x2000)
|
||||
#define MCF5282_QSPI_QMR_BITS_9 (0x2400)
|
||||
#define MCF5282_QSPI_QMR_BITS_10 (0x2800)
|
||||
#define MCF5282_QSPI_QMR_BITS_11 (0x2C00)
|
||||
#define MCF5282_QSPI_QMR_BITS_12 (0x3000)
|
||||
#define MCF5282_QSPI_QMR_BITS_13 (0x3400)
|
||||
#define MCF5282_QSPI_QMR_BITS_14 (0x3800)
|
||||
#define MCF5282_QSPI_QMR_BITS_15 (0x3C00)
|
||||
#define MCF5282_QSPI_QMR_CPOL (0x0200)
|
||||
#define MCF5282_QSPI_QMR_CPHA (0x0100)
|
||||
#define MCF5282_QSPI_QMR_BAUD(x) (((x)&0x00FF))
|
||||
|
||||
#define MCF5282_QSPI_QDLYR_SPE (0x80)
|
||||
#define MCF5282_QSPI_QDLYR_QCD(x) (((x)&0x007F)<<8)
|
||||
#define MCF5282_QSPI_QDLYR_DTL(x) (((x)&0x00FF))
|
||||
|
||||
#define MCF5282_QSPI_QWR_HALT (0x8000)
|
||||
#define MCF5282_QSPI_QWR_WREN (0x4000)
|
||||
#define MCF5282_QSPI_QWR_WRTO (0x2000)
|
||||
#define MCF5282_QSPI_QWR_CSIV (0x1000)
|
||||
#define MCF5282_QSPI_QWR_ENDQP(x) (((x)&0x000F)<<8)
|
||||
#define MCF5282_QSPI_QWR_CPTQP(x) (((x)&0x000F)<<4)
|
||||
#define MCF5282_QSPI_QWR_NEWQP(x) (((x)&0x000F))
|
||||
|
||||
#define MCF5282_QSPI_QIR_WCEFB (0x8000)
|
||||
#define MCF5282_QSPI_QIR_ABRTB (0x4000)
|
||||
#define MCF5282_QSPI_QIR_ABRTL (0x1000)
|
||||
#define MCF5282_QSPI_QIR_WCEFE (0x0800)
|
||||
#define MCF5282_QSPI_QIR_ABRTE (0x0400)
|
||||
#define MCF5282_QSPI_QIR_SPIFE (0x0100)
|
||||
#define MCF5282_QSPI_QIR_WCEF (0x0008)
|
||||
#define MCF5282_QSPI_QIR_ABRT (0x0004)
|
||||
#define MCF5282_QSPI_QIR_SPIF (0x0001)
|
||||
|
||||
#define MCF5282_QSPI_QAR_ADDR(x) (((x)&0x003F))
|
||||
|
||||
#define MCF5282_QSPI_QDR_COMMAND(x) (((x)&0xFF00))
|
||||
#define MCF5282_QSPI_QCR_DATA(x) (((x)&0x00FF)<<8)
|
||||
#define MCF5282_QSPI_QCR_CONT (0x8000)
|
||||
#define MCF5282_QSPI_QCR_BITSE (0x4000)
|
||||
#define MCF5282_QSPI_QCR_DT (0x2000)
|
||||
#define MCF5282_QSPI_QCR_DSCK (0x1000)
|
||||
#define MCF5282_QSPI_QCR_CS (((x)&0x000F)<<8)
|
||||
|
||||
/****************************************************************************/
|
||||
#endif /* m528xsim_h */
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@
|
|||
#define MCFINT_UART0 26 /* Interrupt number for UART0 */
|
||||
#define MCFINT_UART1 27 /* Interrupt number for UART1 */
|
||||
#define MCFINT_UART2 28 /* Interrupt number for UART2 */
|
||||
#define MCFINT_QSPI 31 /* Interrupt number for QSPI */
|
||||
|
||||
#define MCF_WTM_WCR MCF_REG16(0xFC098000)
|
||||
|
||||
|
|
|
|||
|
|
@ -21,29 +21,4 @@
|
|||
#define VIDEOMEMSIZE (4096*1024)
|
||||
#define VIDEOMEMMASK (-4096*1024)
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#if 0
|
||||
/*
|
||||
** SCC Z8530
|
||||
*/
|
||||
|
||||
#define MAC_SCC_BAS (0x50F04000)
|
||||
struct MAC_SCC
|
||||
{
|
||||
u_char cha_a_ctrl;
|
||||
u_char char_dummy1;
|
||||
u_char cha_a_data;
|
||||
u_char char_dummy2;
|
||||
u_char cha_b_ctrl;
|
||||
u_char char_dummy3;
|
||||
u_char cha_b_data;
|
||||
};
|
||||
# define mac_scc ((*(volatile struct SCC*)MAC_SCC_BAS))
|
||||
#endif
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#endif /* linux/machw.h */
|
||||
|
|
|
|||
|
|
@ -37,7 +37,6 @@
|
|||
|
||||
#define VIA1_SOURCE_BASE 8
|
||||
#define VIA2_SOURCE_BASE 16
|
||||
#define MAC_SCC_SOURCE_BASE 24
|
||||
#define PSC3_SOURCE_BASE 24
|
||||
#define PSC4_SOURCE_BASE 32
|
||||
#define PSC5_SOURCE_BASE 40
|
||||
|
|
@ -96,26 +95,12 @@
|
|||
#define IRQ_PSC3_2 (26)
|
||||
#define IRQ_PSC3_3 (27)
|
||||
|
||||
/* Level 4 (SCC) interrupts */
|
||||
#define IRQ_SCC (32)
|
||||
#define IRQ_SCCA (33)
|
||||
#define IRQ_SCCB (34)
|
||||
#if 0 /* FIXME: are there multiple interrupt conditions on the SCC ?? */
|
||||
/* SCC interrupts */
|
||||
#define IRQ_SCCB_TX (32)
|
||||
#define IRQ_SCCB_STAT (33)
|
||||
#define IRQ_SCCB_RX (34)
|
||||
#define IRQ_SCCB_SPCOND (35)
|
||||
#define IRQ_SCCA_TX (36)
|
||||
#define IRQ_SCCA_STAT (37)
|
||||
#define IRQ_SCCA_RX (38)
|
||||
#define IRQ_SCCA_SPCOND (39)
|
||||
#endif
|
||||
|
||||
/* Level 4 (PSC, AV Macs only) interrupts */
|
||||
#define IRQ_PSC4_0 (32)
|
||||
#define IRQ_PSC4_1 (33)
|
||||
#define IRQ_MAC_SCC_A IRQ_PSC4_1
|
||||
#define IRQ_PSC4_2 (34)
|
||||
#define IRQ_MAC_SCC_B IRQ_PSC4_2
|
||||
#define IRQ_PSC4_3 (35)
|
||||
#define IRQ_MAC_MACE_DMA IRQ_PSC4_3
|
||||
|
||||
|
|
@ -146,6 +131,9 @@
|
|||
#define IRQ_BABOON_2 (66)
|
||||
#define IRQ_BABOON_3 (67)
|
||||
|
||||
/* On non-PSC machines, the serial ports share an IRQ */
|
||||
#define IRQ_MAC_SCC IRQ_AUTO_4
|
||||
|
||||
#define SLOT2IRQ(x) (x + 47)
|
||||
#define IRQ2SLOT(x) (x - 47)
|
||||
|
||||
|
|
|
|||
64
arch/m68k/include/asm/mcfqspi.h
Normal file
64
arch/m68k/include/asm/mcfqspi.h
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
/*
|
||||
* Definitions for Freescale Coldfire QSPI module
|
||||
*
|
||||
* Copyright 2010 Steven King <sfking@fdwdc.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef mcfqspi_h
|
||||
#define mcfqspi_h
|
||||
|
||||
#if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x)
|
||||
#define MCFQSPI_IOBASE (MCF_IPSBAR + 0x340)
|
||||
#elif defined(CONFIG_M5249)
|
||||
#define MCFQSPI_IOBASE (MCF_MBAR + 0x300)
|
||||
#elif defined(CONFIG_M520x) || defined(CONFIG_M532x)
|
||||
#define MCFQSPI_IOBASE 0xFC058000
|
||||
#endif
|
||||
#define MCFQSPI_IOSIZE 0x40
|
||||
|
||||
/**
|
||||
* struct mcfqspi_cs_control - chip select control for the coldfire qspi driver
|
||||
* @setup: setup the control; allocate gpio's, etc. May be NULL.
|
||||
* @teardown: finish with the control; free gpio's, etc. May be NULL.
|
||||
* @select: output the signals to select the device. Can not be NULL.
|
||||
* @deselect: output the signals to deselect the device. Can not be NULL.
|
||||
*
|
||||
* The QSPI module has 4 hardware chip selects. We don't use them. Instead
|
||||
* platforms are required to supply a mcfqspi_cs_control as a part of the
|
||||
* platform data for each QSPI master controller. Only the select and
|
||||
* deselect functions are required.
|
||||
*/
|
||||
struct mcfqspi_cs_control {
|
||||
int (*setup)(struct mcfqspi_cs_control *);
|
||||
void (*teardown)(struct mcfqspi_cs_control *);
|
||||
void (*select)(struct mcfqspi_cs_control *, u8, bool);
|
||||
void (*deselect)(struct mcfqspi_cs_control *, u8, bool);
|
||||
};
|
||||
|
||||
/**
|
||||
* struct mcfqspi_platform_data - platform data for the coldfire qspi driver
|
||||
* @bus_num: board specific identifier for this qspi driver.
|
||||
* @num_chipselects: number of chip selects supported by this qspi driver.
|
||||
* @cs_control: platform dependent chip select control.
|
||||
*/
|
||||
struct mcfqspi_platform_data {
|
||||
s16 bus_num;
|
||||
u16 num_chipselect;
|
||||
struct mcfqspi_cs_control *cs_control;
|
||||
};
|
||||
|
||||
#endif /* mcfqspi_h */
|
||||
|
|
@ -1,187 +0,0 @@
|
|||
/****************************************************************************/
|
||||
|
||||
/*
|
||||
* mcfsmc.h -- SMC ethernet support for ColdFire environments.
|
||||
*
|
||||
* (C) Copyright 1999-2002, Greg Ungerer (gerg@snapgear.com)
|
||||
* (C) Copyright 2000, Lineo Inc. (www.lineo.com)
|
||||
*/
|
||||
|
||||
/****************************************************************************/
|
||||
#ifndef mcfsmc_h
|
||||
#define mcfsmc_h
|
||||
/****************************************************************************/
|
||||
|
||||
/*
|
||||
* None of the current ColdFire targets that use the SMC91x111
|
||||
* allow 8 bit accesses. So this code is 16bit access only.
|
||||
*/
|
||||
|
||||
|
||||
#undef outb
|
||||
#undef inb
|
||||
#undef outw
|
||||
#undef outwd
|
||||
#undef inw
|
||||
#undef outl
|
||||
#undef inl
|
||||
|
||||
#undef outsb
|
||||
#undef outsw
|
||||
#undef outsl
|
||||
#undef insb
|
||||
#undef insw
|
||||
#undef insl
|
||||
|
||||
/*
|
||||
* Re-defines for ColdFire environment... The SMC part is
|
||||
* mapped into memory space, so remap the PC-style in/out
|
||||
* routines to handle that.
|
||||
*/
|
||||
#define outb smc_outb
|
||||
#define inb smc_inb
|
||||
#define outw smc_outw
|
||||
#define outwd smc_outwd
|
||||
#define inw smc_inw
|
||||
#define outl smc_outl
|
||||
#define inl smc_inl
|
||||
|
||||
#define outsb smc_outsb
|
||||
#define outsw smc_outsw
|
||||
#define outsl smc_outsl
|
||||
#define insb smc_insb
|
||||
#define insw smc_insw
|
||||
#define insl smc_insl
|
||||
|
||||
|
||||
static inline int smc_inb(unsigned int addr)
|
||||
{
|
||||
register unsigned short w;
|
||||
w = *((volatile unsigned short *) (addr & ~0x1));
|
||||
return(((addr & 0x1) ? w : (w >> 8)) & 0xff);
|
||||
}
|
||||
|
||||
static inline void smc_outw(unsigned int val, unsigned int addr)
|
||||
{
|
||||
*((volatile unsigned short *) addr) = (val << 8) | (val >> 8);
|
||||
}
|
||||
|
||||
static inline int smc_inw(unsigned int addr)
|
||||
{
|
||||
register unsigned short w;
|
||||
w = *((volatile unsigned short *) addr);
|
||||
return(((w << 8) | (w >> 8)) & 0xffff);
|
||||
}
|
||||
|
||||
static inline void smc_outl(unsigned long val, unsigned int addr)
|
||||
{
|
||||
*((volatile unsigned long *) addr) =
|
||||
((val << 8) & 0xff000000) | ((val >> 8) & 0x00ff0000) |
|
||||
((val << 8) & 0x0000ff00) | ((val >> 8) & 0x000000ff);
|
||||
}
|
||||
|
||||
static inline void smc_outwd(unsigned int val, unsigned int addr)
|
||||
{
|
||||
*((volatile unsigned short *) addr) = val;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* The rep* functions are used to feed the data port with
|
||||
* raw data. So we do not byte swap them when copying.
|
||||
*/
|
||||
|
||||
static inline void smc_insb(unsigned int addr, void *vbuf, int unsigned long len)
|
||||
{
|
||||
volatile unsigned short *rp;
|
||||
unsigned short *buf, *ebuf;
|
||||
|
||||
buf = (unsigned short *) vbuf;
|
||||
rp = (volatile unsigned short *) addr;
|
||||
|
||||
/* Copy as words for as long as possible */
|
||||
for (ebuf = buf + (len >> 1); (buf < ebuf); )
|
||||
*buf++ = *rp;
|
||||
|
||||
/* Lastly, handle left over byte */
|
||||
if (len & 0x1)
|
||||
*((unsigned char *) buf) = (*rp >> 8) & 0xff;
|
||||
}
|
||||
|
||||
static inline void smc_insw(unsigned int addr, void *vbuf, unsigned long len)
|
||||
{
|
||||
volatile unsigned short *rp;
|
||||
unsigned short *buf, *ebuf;
|
||||
|
||||
buf = (unsigned short *) vbuf;
|
||||
rp = (volatile unsigned short *) addr;
|
||||
for (ebuf = buf + len; (buf < ebuf); )
|
||||
*buf++ = *rp;
|
||||
}
|
||||
|
||||
static inline void smc_insl(unsigned int addr, void *vbuf, unsigned long len)
|
||||
{
|
||||
volatile unsigned long *rp;
|
||||
unsigned long *buf, *ebuf;
|
||||
|
||||
buf = (unsigned long *) vbuf;
|
||||
rp = (volatile unsigned long *) addr;
|
||||
for (ebuf = buf + len; (buf < ebuf); )
|
||||
*buf++ = *rp;
|
||||
}
|
||||
|
||||
static inline void smc_outsw(unsigned int addr, const void *vbuf, unsigned long len)
|
||||
{
|
||||
volatile unsigned short *rp;
|
||||
unsigned short *buf, *ebuf;
|
||||
|
||||
buf = (unsigned short *) vbuf;
|
||||
rp = (volatile unsigned short *) addr;
|
||||
for (ebuf = buf + len; (buf < ebuf); )
|
||||
*rp = *buf++;
|
||||
}
|
||||
|
||||
static inline void smc_outsl(unsigned int addr, void *vbuf, unsigned long len)
|
||||
{
|
||||
volatile unsigned long *rp;
|
||||
unsigned long *buf, *ebuf;
|
||||
|
||||
buf = (unsigned long *) vbuf;
|
||||
rp = (volatile unsigned long *) addr;
|
||||
for (ebuf = buf + len; (buf < ebuf); )
|
||||
*rp = *buf++;
|
||||
}
|
||||
|
||||
|
||||
#ifdef CONFIG_NETtel
|
||||
/*
|
||||
* Re-map the address space of at least one of the SMC ethernet
|
||||
* parts. Both parts power up decoding the same address, so we
|
||||
* need to move one of them first, before doing enything else.
|
||||
*
|
||||
* We also increase the number of wait states for this part by one.
|
||||
*/
|
||||
|
||||
void smc_remap(unsigned int ioaddr)
|
||||
{
|
||||
static int once = 0;
|
||||
extern unsigned short ppdata;
|
||||
if (once++ == 0) {
|
||||
*((volatile unsigned short *)MCFSIM_PADDR) = 0x00ec;
|
||||
ppdata |= 0x0080;
|
||||
*((volatile unsigned short *)MCFSIM_PADAT) = ppdata;
|
||||
outw(0x0001, ioaddr + BANK_SELECT);
|
||||
outw(0x0001, ioaddr + BANK_SELECT);
|
||||
outw(0x0067, ioaddr + BASE);
|
||||
|
||||
ppdata &= ~0x0080;
|
||||
*((volatile unsigned short *)MCFSIM_PADAT) = ppdata;
|
||||
}
|
||||
|
||||
*((volatile unsigned short *)(MCF_MBAR+MCFSIM_CSCR3)) = 0x1180;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/****************************************************************************/
|
||||
#endif /* mcfsmc_h */
|
||||
|
|
@ -212,5 +212,10 @@ struct mcf_platform_uart {
|
|||
#define MCFUART_URF_RXS 0xc0 /* Receiver status */
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_M5272)
|
||||
#define MCFUART_TXFIFOSIZE 25
|
||||
#else
|
||||
#define MCFUART_TXFIFOSIZE 1
|
||||
#endif
|
||||
/****************************************************************************/
|
||||
#endif /* mcfuart_h */
|
||||
|
|
|
|||
|
|
@ -1,26 +1,12 @@
|
|||
#ifndef _M68K_PARAM_H
|
||||
#define _M68K_PARAM_H
|
||||
|
||||
#ifdef __KERNEL__
|
||||
# define HZ CONFIG_HZ /* Internal kernel timer frequency */
|
||||
# define USER_HZ 100 /* .. some user interfaces are in "ticks" */
|
||||
# define CLOCKS_PER_SEC (USER_HZ) /* like times() */
|
||||
#endif
|
||||
|
||||
#ifndef HZ
|
||||
#define HZ 100
|
||||
#endif
|
||||
|
||||
#ifdef __uClinux__
|
||||
#define EXEC_PAGESIZE 4096
|
||||
#else
|
||||
#define EXEC_PAGESIZE 8192
|
||||
#endif
|
||||
|
||||
#ifndef NOGROUP
|
||||
#define NOGROUP (-1)
|
||||
#endif
|
||||
|
||||
#define MAXHOSTNAMELEN 64 /* max length of hostname */
|
||||
#include <asm-generic/param.h>
|
||||
|
||||
#endif /* _M68K_PARAM_H */
|
||||
|
|
|
|||
|
|
@ -115,7 +115,7 @@ extern void kernel_set_cachemode(void *addr, unsigned long size, int cmode);
|
|||
* they are updated on demand.
|
||||
*/
|
||||
static inline void update_mmu_cache(struct vm_area_struct *vma,
|
||||
unsigned long address, pte_t pte)
|
||||
unsigned long address, pte_t *ptep)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -44,11 +44,15 @@ static inline void wrusp(unsigned long usp)
|
|||
* User space process size: 3.75GB. This is hardcoded into a few places,
|
||||
* so don't change it unless you know what you are doing.
|
||||
*/
|
||||
#ifdef CONFIG_MMU
|
||||
#ifndef CONFIG_SUN3
|
||||
#define TASK_SIZE (0xF0000000UL)
|
||||
#else
|
||||
#define TASK_SIZE (0x0E000000UL)
|
||||
#endif
|
||||
#else
|
||||
#define TASK_SIZE (0xFFFFFFFFUL)
|
||||
#endif
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#define STACK_TOP TASK_SIZE
|
||||
|
|
|
|||
|
|
@ -71,6 +71,8 @@ struct switch_stack {
|
|||
#define PTRACE_GETFPREGS 14
|
||||
#define PTRACE_SETFPREGS 15
|
||||
|
||||
#define PTRACE_GET_THREAD_AREA 25
|
||||
|
||||
#define PTRACE_SINGLEBLOCK 33 /* resume execution until next branch */
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
|
@ -85,18 +87,10 @@ struct switch_stack {
|
|||
#define profile_pc(regs) instruction_pointer(regs)
|
||||
extern void show_regs(struct pt_regs *);
|
||||
|
||||
/*
|
||||
* These are defined as per linux/ptrace.h.
|
||||
*/
|
||||
struct task_struct;
|
||||
|
||||
#define arch_has_single_step() (1)
|
||||
extern void user_enable_single_step(struct task_struct *);
|
||||
extern void user_disable_single_step(struct task_struct *);
|
||||
|
||||
#ifdef CONFIG_MMU
|
||||
#define arch_has_block_step() (1)
|
||||
extern void user_enable_block_step(struct task_struct *);
|
||||
#endif
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
|
|
|||
|
|
@ -1,23 +1,9 @@
|
|||
#ifndef _M68K_SCATTERLIST_H
|
||||
#define _M68K_SCATTERLIST_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
struct scatterlist {
|
||||
#ifdef CONFIG_DEBUG_SG
|
||||
unsigned long sg_magic;
|
||||
#endif
|
||||
unsigned long page_link;
|
||||
unsigned int offset;
|
||||
unsigned int length;
|
||||
|
||||
dma_addr_t dma_address; /* A place to hang host-specific addresses at. */
|
||||
};
|
||||
#include <asm-generic/scatterlist.h>
|
||||
|
||||
/* This is bogus and should go away. */
|
||||
#define ISA_DMA_THRESHOLD (0x00ffffff)
|
||||
|
||||
#define sg_dma_address(sg) ((sg)->dma_address)
|
||||
#define sg_dma_len(sg) ((sg)->length)
|
||||
|
||||
#endif /* !(_M68K_SCATTERLIST_H) */
|
||||
|
|
|
|||
|
|
@ -15,7 +15,11 @@ struct sigcontext {
|
|||
unsigned long sc_pc;
|
||||
unsigned short sc_formatvec;
|
||||
#ifndef __uClinux__
|
||||
# ifdef __mcoldfire__
|
||||
unsigned long sc_fpregs[2][2]; /* room for two fp registers */
|
||||
# else
|
||||
unsigned long sc_fpregs[2*3]; /* room for two fp registers */
|
||||
# endif
|
||||
unsigned long sc_fpcntl[3];
|
||||
unsigned char sc_fpstate[216];
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1,97 +1,6 @@
|
|||
#ifndef _M68K_SIGINFO_H
|
||||
#define _M68K_SIGINFO_H
|
||||
|
||||
#ifndef __uClinux__
|
||||
#define HAVE_ARCH_SIGINFO_T
|
||||
#define HAVE_ARCH_COPY_SIGINFO
|
||||
#endif
|
||||
|
||||
#include <asm-generic/siginfo.h>
|
||||
|
||||
#ifndef __uClinux__
|
||||
|
||||
typedef struct siginfo {
|
||||
int si_signo;
|
||||
int si_errno;
|
||||
int si_code;
|
||||
|
||||
union {
|
||||
int _pad[SI_PAD_SIZE];
|
||||
|
||||
/* kill() */
|
||||
struct {
|
||||
__kernel_pid_t _pid; /* sender's pid */
|
||||
__kernel_uid_t _uid; /* backwards compatibility */
|
||||
__kernel_uid32_t _uid32; /* sender's uid */
|
||||
} _kill;
|
||||
|
||||
/* POSIX.1b timers */
|
||||
struct {
|
||||
timer_t _tid; /* timer id */
|
||||
int _overrun; /* overrun count */
|
||||
char _pad[sizeof( __ARCH_SI_UID_T) - sizeof(int)];
|
||||
sigval_t _sigval; /* same as below */
|
||||
int _sys_private; /* not to be passed to user */
|
||||
} _timer;
|
||||
|
||||
/* POSIX.1b signals */
|
||||
struct {
|
||||
__kernel_pid_t _pid; /* sender's pid */
|
||||
__kernel_uid_t _uid; /* backwards compatibility */
|
||||
sigval_t _sigval;
|
||||
__kernel_uid32_t _uid32; /* sender's uid */
|
||||
} _rt;
|
||||
|
||||
/* SIGCHLD */
|
||||
struct {
|
||||
__kernel_pid_t _pid; /* which child */
|
||||
__kernel_uid_t _uid; /* backwards compatibility */
|
||||
int _status; /* exit code */
|
||||
clock_t _utime;
|
||||
clock_t _stime;
|
||||
__kernel_uid32_t _uid32; /* sender's uid */
|
||||
} _sigchld;
|
||||
|
||||
/* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
|
||||
struct {
|
||||
void *_addr; /* faulting insn/memory ref. */
|
||||
} _sigfault;
|
||||
|
||||
/* SIGPOLL */
|
||||
struct {
|
||||
int _band; /* POLL_IN, POLL_OUT, POLL_MSG */
|
||||
int _fd;
|
||||
} _sigpoll;
|
||||
} _sifields;
|
||||
} siginfo_t;
|
||||
|
||||
#define UID16_SIGINFO_COMPAT_NEEDED
|
||||
|
||||
/*
|
||||
* How these fields are to be accessed.
|
||||
*/
|
||||
#undef si_uid
|
||||
#ifdef __KERNEL__
|
||||
#define si_uid _sifields._kill._uid32
|
||||
#define si_uid16 _sifields._kill._uid
|
||||
#else
|
||||
#define si_uid _sifields._kill._uid
|
||||
#endif
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#include <linux/string.h>
|
||||
|
||||
static inline void copy_siginfo(struct siginfo *to, struct siginfo *from)
|
||||
{
|
||||
if (from->si_code < 0)
|
||||
memcpy(to, from, sizeof(*to));
|
||||
else
|
||||
/* _sigchld is currently the largest know union member */
|
||||
memcpy(to, from, 3*sizeof(int) + sizeof(from->_sifields._sigchld));
|
||||
}
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* !__uClinux__ */
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ static inline __attribute_const__ __u32 __arch_swab32(__u32 val)
|
|||
}
|
||||
|
||||
#define __arch_swab32 __arch_swab32
|
||||
#elif !defined(__uClinux__)
|
||||
#elif !defined(__mcoldfire__)
|
||||
|
||||
static inline __attribute_const__ __u32 __arch_swab32(__u32 val)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@ struct thread_info {
|
|||
struct exec_domain *exec_domain; /* execution domain */
|
||||
int preempt_count; /* 0 => preemptable, <0 => BUG */
|
||||
__u32 cpu; /* should always be 0 on m68k */
|
||||
unsigned long tp_value; /* thread pointer */
|
||||
struct restart_block restart_block;
|
||||
};
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
|
@ -64,7 +65,7 @@ struct thread_info {
|
|||
#define TIF_NEED_RESCHED 7 /* rescheduling necessary */
|
||||
#define TIF_DELAYED_TRACE 14 /* single step a syscall */
|
||||
#define TIF_SYSCALL_TRACE 15 /* syscall trace active */
|
||||
#define TIF_MEMDIE 16
|
||||
#define TIF_MEMDIE 16 /* is terminating due to OOM killer */
|
||||
#define TIF_FREEZE 17 /* thread is freezing for suspend */
|
||||
|
||||
#endif /* _ASM_M68K_THREAD_INFO_H */
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@ struct thread_info {
|
|||
unsigned long flags; /* low level flags */
|
||||
int cpu; /* cpu we're on */
|
||||
int preempt_count; /* 0 => preemptable, <0 => BUG */
|
||||
unsigned long tp_value; /* thread pointer */
|
||||
struct restart_block restart_block;
|
||||
};
|
||||
|
||||
|
|
@ -84,7 +85,7 @@ static inline struct thread_info *current_thread_info(void)
|
|||
#define TIF_NEED_RESCHED 2 /* rescheduling necessary */
|
||||
#define TIF_POLLING_NRFLAG 3 /* true if poll_idle() is polling
|
||||
TIF_NEED_RESCHED */
|
||||
#define TIF_MEMDIE 4
|
||||
#define TIF_MEMDIE 4 /* is terminating due to OOM killer */
|
||||
#define TIF_FREEZE 16 /* is freezing for suspend */
|
||||
|
||||
/* as above, but as bit values */
|
||||
|
|
|
|||
|
|
@ -7,7 +7,11 @@ typedef greg_t gregset_t[NGREG];
|
|||
|
||||
typedef struct fpregset {
|
||||
int f_fpcntl[3];
|
||||
#ifdef __mcoldfire__
|
||||
int f_fpregs[8][2];
|
||||
#else
|
||||
int f_fpregs[8*3];
|
||||
#endif
|
||||
} fpregset_t;
|
||||
|
||||
struct mcontext {
|
||||
|
|
|
|||
|
|
@ -336,10 +336,14 @@
|
|||
#define __NR_pwritev 330
|
||||
#define __NR_rt_tgsigqueueinfo 331
|
||||
#define __NR_perf_event_open 332
|
||||
#define __NR_get_thread_area 333
|
||||
#define __NR_set_thread_area 334
|
||||
#define __NR_atomic_cmpxchg_32 335
|
||||
#define __NR_atomic_barrier 336
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#define NR_syscalls 333
|
||||
#define NR_syscalls 337
|
||||
|
||||
#define __ARCH_WANT_IPC_PARSE_VERSION
|
||||
#define __ARCH_WANT_OLD_READDIR
|
||||
|
|
@ -347,6 +351,7 @@
|
|||
#define __ARCH_WANT_STAT64
|
||||
#define __ARCH_WANT_SYS_ALARM
|
||||
#define __ARCH_WANT_SYS_GETHOSTNAME
|
||||
#define __ARCH_WANT_SYS_IPC
|
||||
#define __ARCH_WANT_SYS_PAUSE
|
||||
#define __ARCH_WANT_SYS_SGETMASK
|
||||
#define __ARCH_WANT_SYS_SIGNAL
|
||||
|
|
@ -359,6 +364,8 @@
|
|||
#define __ARCH_WANT_SYS_LLSEEK
|
||||
#define __ARCH_WANT_SYS_NICE
|
||||
#define __ARCH_WANT_SYS_OLD_GETRLIMIT
|
||||
#define __ARCH_WANT_SYS_OLD_MMAP
|
||||
#define __ARCH_WANT_SYS_OLD_SELECT
|
||||
#define __ARCH_WANT_SYS_OLDUMOUNT
|
||||
#define __ARCH_WANT_SYS_SIGPENDING
|
||||
#define __ARCH_WANT_SYS_SIGPROCMASK
|
||||
|
|
|
|||
|
|
@ -31,12 +31,7 @@ static inline void *phys_to_virt(unsigned long address)
|
|||
#define page_to_phys(page) \
|
||||
__pa(PAGE_OFFSET + (((page) - pg_data_map[0].node_mem_map) << PAGE_SHIFT))
|
||||
#else
|
||||
#define page_to_phys(_page) ({ \
|
||||
struct page *__page = _page; \
|
||||
struct pglist_data *pgdat; \
|
||||
pgdat = pg_data_table[page_to_nid(__page)]; \
|
||||
page_to_pfn(__page) << PAGE_SHIFT; \
|
||||
})
|
||||
#define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT)
|
||||
#endif
|
||||
#else
|
||||
#define page_to_phys(page) (((page) - mem_map) << PAGE_SHIFT)
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@
|
|||
#include <linux/device.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/scatterlist.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/vmalloc.h>
|
||||
|
||||
#include <asm/pgalloc.h>
|
||||
|
|
|
|||
|
|
@ -510,7 +510,7 @@ sys_call_table:
|
|||
.long sys_settimeofday
|
||||
.long sys_getgroups16 /* 80 */
|
||||
.long sys_setgroups16
|
||||
.long old_select
|
||||
.long sys_old_select
|
||||
.long sys_symlink
|
||||
.long sys_lstat
|
||||
.long sys_readlink /* 85 */
|
||||
|
|
@ -518,7 +518,7 @@ sys_call_table:
|
|||
.long sys_swapon
|
||||
.long sys_reboot
|
||||
.long sys_old_readdir
|
||||
.long old_mmap /* 90 */
|
||||
.long sys_old_mmap /* 90 */
|
||||
.long sys_munmap
|
||||
.long sys_truncate
|
||||
.long sys_ftruncate
|
||||
|
|
@ -761,4 +761,8 @@ sys_call_table:
|
|||
.long sys_pwritev /* 330 */
|
||||
.long sys_rt_tgsigqueueinfo
|
||||
.long sys_perf_event_open
|
||||
.long sys_get_thread_area
|
||||
.long sys_set_thread_area
|
||||
.long sys_atomic_cmpxchg_32 /* 335 */
|
||||
.long sys_atomic_barrier
|
||||
|
||||
|
|
|
|||
|
|
@ -15,13 +15,13 @@
|
|||
#include <linux/sched.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/smp_lock.h>
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/unistd.h>
|
||||
#include <linux/ptrace.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/user.h>
|
||||
#include <linux/reboot.h>
|
||||
#include <linux/init_task.h>
|
||||
|
|
@ -251,6 +251,10 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
|
|||
|
||||
p->thread.usp = usp;
|
||||
p->thread.ksp = (unsigned long)childstack;
|
||||
|
||||
if (clone_flags & CLONE_SETTLS)
|
||||
task_thread_info(p)->tp_value = regs->d5;
|
||||
|
||||
/*
|
||||
* Must save the current SFC/DFC value, NOT the value when
|
||||
* the parent was last descheduled - RGH 10-08-96
|
||||
|
|
|
|||
|
|
@ -245,6 +245,11 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
|||
ret = -EFAULT;
|
||||
break;
|
||||
|
||||
case PTRACE_GET_THREAD_AREA:
|
||||
ret = put_user(task_thread_info(child)->tp_value,
|
||||
(unsigned long __user *)data);
|
||||
break;
|
||||
|
||||
default:
|
||||
ret = ptrace_request(child, request, addr, data);
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -897,10 +897,17 @@ static void setup_rt_frame (int sig, struct k_sigaction *ka, siginfo_t *info,
|
|||
|
||||
/* Set up to return from userspace. */
|
||||
err |= __put_user(frame->retcode, &frame->pretcode);
|
||||
#ifdef __mcoldfire__
|
||||
/* movel #__NR_rt_sigreturn,d0; trap #0 */
|
||||
err |= __put_user(0x203c0000, (long __user *)(frame->retcode + 0));
|
||||
err |= __put_user(0x00004e40 + (__NR_rt_sigreturn << 16),
|
||||
(long __user *)(frame->retcode + 4));
|
||||
#else
|
||||
/* moveq #,d0; notb d0; trap #0 */
|
||||
err |= __put_user(0x70004600 + ((__NR_rt_sigreturn ^ 0xff) << 16),
|
||||
(long __user *)(frame->retcode + 0));
|
||||
err |= __put_user(0x4e40, (short __user *)(frame->retcode + 4));
|
||||
#endif
|
||||
|
||||
if (err)
|
||||
goto give_sigsegv;
|
||||
|
|
|
|||
|
|
@ -28,6 +28,11 @@
|
|||
#include <asm/traps.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/unistd.h>
|
||||
#include <linux/elf.h>
|
||||
#include <asm/tlb.h>
|
||||
|
||||
asmlinkage int do_page_fault(struct pt_regs *regs, unsigned long address,
|
||||
unsigned long error_code);
|
||||
|
||||
asmlinkage long sys_mmap2(unsigned long addr, unsigned long len,
|
||||
unsigned long prot, unsigned long flags,
|
||||
|
|
@ -41,137 +46,6 @@ asmlinkage long sys_mmap2(unsigned long addr, unsigned long len,
|
|||
return sys_mmap_pgoff(addr, len, prot, flags, fd, pgoff);
|
||||
}
|
||||
|
||||
/*
|
||||
* Perform the select(nd, in, out, ex, tv) and mmap() system
|
||||
* calls. Linux/m68k cloned Linux/i386, which didn't use to be able to
|
||||
* handle more than 4 system call parameters, so these system calls
|
||||
* used a memory block for parameter passing..
|
||||
*/
|
||||
|
||||
struct mmap_arg_struct {
|
||||
unsigned long addr;
|
||||
unsigned long len;
|
||||
unsigned long prot;
|
||||
unsigned long flags;
|
||||
unsigned long fd;
|
||||
unsigned long offset;
|
||||
};
|
||||
|
||||
asmlinkage int old_mmap(struct mmap_arg_struct __user *arg)
|
||||
{
|
||||
struct mmap_arg_struct a;
|
||||
int error = -EFAULT;
|
||||
|
||||
if (copy_from_user(&a, arg, sizeof(a)))
|
||||
goto out;
|
||||
|
||||
error = -EINVAL;
|
||||
if (a.offset & ~PAGE_MASK)
|
||||
goto out;
|
||||
|
||||
error = sys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd,
|
||||
a.offset >> PAGE_SHIFT);
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
|
||||
struct sel_arg_struct {
|
||||
unsigned long n;
|
||||
fd_set __user *inp, *outp, *exp;
|
||||
struct timeval __user *tvp;
|
||||
};
|
||||
|
||||
asmlinkage int old_select(struct sel_arg_struct __user *arg)
|
||||
{
|
||||
struct sel_arg_struct a;
|
||||
|
||||
if (copy_from_user(&a, arg, sizeof(a)))
|
||||
return -EFAULT;
|
||||
/* sys_select() does the appropriate kernel locking */
|
||||
return sys_select(a.n, a.inp, a.outp, a.exp, a.tvp);
|
||||
}
|
||||
|
||||
/*
|
||||
* sys_ipc() is the de-multiplexer for the SysV IPC calls..
|
||||
*
|
||||
* This is really horribly ugly.
|
||||
*/
|
||||
asmlinkage int sys_ipc (uint call, int first, int second,
|
||||
int third, void __user *ptr, long fifth)
|
||||
{
|
||||
int version, ret;
|
||||
|
||||
version = call >> 16; /* hack for backward compatibility */
|
||||
call &= 0xffff;
|
||||
|
||||
if (call <= SEMCTL)
|
||||
switch (call) {
|
||||
case SEMOP:
|
||||
return sys_semop (first, ptr, second);
|
||||
case SEMGET:
|
||||
return sys_semget (first, second, third);
|
||||
case SEMCTL: {
|
||||
union semun fourth;
|
||||
if (!ptr)
|
||||
return -EINVAL;
|
||||
if (get_user(fourth.__pad, (void __user *__user *) ptr))
|
||||
return -EFAULT;
|
||||
return sys_semctl (first, second, third, fourth);
|
||||
}
|
||||
default:
|
||||
return -ENOSYS;
|
||||
}
|
||||
if (call <= MSGCTL)
|
||||
switch (call) {
|
||||
case MSGSND:
|
||||
return sys_msgsnd (first, ptr, second, third);
|
||||
case MSGRCV:
|
||||
switch (version) {
|
||||
case 0: {
|
||||
struct ipc_kludge tmp;
|
||||
if (!ptr)
|
||||
return -EINVAL;
|
||||
if (copy_from_user (&tmp, ptr, sizeof (tmp)))
|
||||
return -EFAULT;
|
||||
return sys_msgrcv (first, tmp.msgp, second,
|
||||
tmp.msgtyp, third);
|
||||
}
|
||||
default:
|
||||
return sys_msgrcv (first, ptr,
|
||||
second, fifth, third);
|
||||
}
|
||||
case MSGGET:
|
||||
return sys_msgget ((key_t) first, second);
|
||||
case MSGCTL:
|
||||
return sys_msgctl (first, second, ptr);
|
||||
default:
|
||||
return -ENOSYS;
|
||||
}
|
||||
if (call <= SHMCTL)
|
||||
switch (call) {
|
||||
case SHMAT:
|
||||
switch (version) {
|
||||
default: {
|
||||
ulong raddr;
|
||||
ret = do_shmat (first, ptr, second, &raddr);
|
||||
if (ret)
|
||||
return ret;
|
||||
return put_user (raddr, (ulong __user *) third);
|
||||
}
|
||||
}
|
||||
case SHMDT:
|
||||
return sys_shmdt (ptr);
|
||||
case SHMGET:
|
||||
return sys_shmget (first, second, third);
|
||||
case SHMCTL:
|
||||
return sys_shmctl (first, second, ptr);
|
||||
default:
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Convert virtual (user) address VADDR to physical address PADDR */
|
||||
#define virt_to_phys_040(vaddr) \
|
||||
({ \
|
||||
|
|
@ -595,3 +469,79 @@ int kernel_execve(const char *filename, char *const argv[], char *const envp[])
|
|||
: "d" (__a), "d" (__b), "d" (__c));
|
||||
return __res;
|
||||
}
|
||||
|
||||
asmlinkage unsigned long sys_get_thread_area(void)
|
||||
{
|
||||
return current_thread_info()->tp_value;
|
||||
}
|
||||
|
||||
asmlinkage int sys_set_thread_area(unsigned long tp)
|
||||
{
|
||||
current_thread_info()->tp_value = tp;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* This syscall gets its arguments in A0 (mem), D2 (oldval) and
|
||||
D1 (newval). */
|
||||
asmlinkage int
|
||||
sys_atomic_cmpxchg_32(unsigned long newval, int oldval, int d3, int d4, int d5,
|
||||
unsigned long __user * mem)
|
||||
{
|
||||
/* This was borrowed from ARM's implementation. */
|
||||
for (;;) {
|
||||
struct mm_struct *mm = current->mm;
|
||||
pgd_t *pgd;
|
||||
pmd_t *pmd;
|
||||
pte_t *pte;
|
||||
spinlock_t *ptl;
|
||||
unsigned long mem_value;
|
||||
|
||||
down_read(&mm->mmap_sem);
|
||||
pgd = pgd_offset(mm, (unsigned long)mem);
|
||||
if (!pgd_present(*pgd))
|
||||
goto bad_access;
|
||||
pmd = pmd_offset(pgd, (unsigned long)mem);
|
||||
if (!pmd_present(*pmd))
|
||||
goto bad_access;
|
||||
pte = pte_offset_map_lock(mm, pmd, (unsigned long)mem, &ptl);
|
||||
if (!pte_present(*pte) || !pte_dirty(*pte)
|
||||
|| !pte_write(*pte)) {
|
||||
pte_unmap_unlock(pte, ptl);
|
||||
goto bad_access;
|
||||
}
|
||||
|
||||
mem_value = *mem;
|
||||
if (mem_value == oldval)
|
||||
*mem = newval;
|
||||
|
||||
pte_unmap_unlock(pte, ptl);
|
||||
up_read(&mm->mmap_sem);
|
||||
return mem_value;
|
||||
|
||||
bad_access:
|
||||
up_read(&mm->mmap_sem);
|
||||
/* This is not necessarily a bad access, we can get here if
|
||||
a memory we're trying to write to should be copied-on-write.
|
||||
Make the kernel do the necessary page stuff, then re-iterate.
|
||||
Simulate a write access fault to do that. */
|
||||
{
|
||||
/* The first argument of the function corresponds to
|
||||
D1, which is the first field of struct pt_regs. */
|
||||
struct pt_regs *fp = (struct pt_regs *)&newval;
|
||||
|
||||
/* '3' is an RMW flag. */
|
||||
if (do_page_fault(fp, (unsigned long)mem, 3))
|
||||
/* If the do_page_fault() failed, we don't
|
||||
have anything meaningful to return.
|
||||
There should be a SIGSEGV pending for
|
||||
the process. */
|
||||
return 0xdeadbeef;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
asmlinkage int sys_atomic_barrier(void)
|
||||
{
|
||||
/* no code needed for uniprocs */
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -73,21 +73,24 @@ static irqreturn_t timer_interrupt(int irq, void *dummy)
|
|||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
void __init time_init(void)
|
||||
void read_persistent_clock(struct timespec *ts)
|
||||
{
|
||||
struct rtc_time time;
|
||||
ts->tv_sec = 0;
|
||||
ts->tv_nsec = 0;
|
||||
|
||||
if (mach_hwclk) {
|
||||
mach_hwclk(0, &time);
|
||||
|
||||
if ((time.tm_year += 1900) < 1970)
|
||||
time.tm_year += 100;
|
||||
xtime.tv_sec = mktime(time.tm_year, time.tm_mon, time.tm_mday,
|
||||
ts->tv_sec = mktime(time.tm_year, time.tm_mon, time.tm_mday,
|
||||
time.tm_hour, time.tm_min, time.tm_sec);
|
||||
xtime.tv_nsec = 0;
|
||||
}
|
||||
wall_to_monotonic.tv_sec = -xtime.tv_sec;
|
||||
}
|
||||
|
||||
void __init time_init(void)
|
||||
{
|
||||
mach_sched_init(timer_interrupt);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -455,7 +455,7 @@ static inline void access_error040(struct frame *fp)
|
|||
|
||||
if (do_page_fault(&fp->ptregs, addr, errorcode)) {
|
||||
#ifdef DEBUG
|
||||
printk("do_page_fault() !=0 \n");
|
||||
printk("do_page_fault() !=0\n");
|
||||
#endif
|
||||
if (user_mode(&fp->ptregs)){
|
||||
/* delay writebacks after signal delivery */
|
||||
|
|
|
|||
|
|
@ -3,4 +3,4 @@
|
|||
#
|
||||
|
||||
obj-y := config.o macints.o iop.o via.o oss.o psc.o \
|
||||
baboon.o macboing.o debug.o misc.o
|
||||
baboon.o macboing.o misc.o
|
||||
|
|
|
|||
|
|
@ -23,6 +23,8 @@
|
|||
#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>
|
||||
|
|
@ -44,12 +46,7 @@
|
|||
#include <asm/mac_oss.h>
|
||||
#include <asm/mac_psc.h>
|
||||
|
||||
/* platform device info */
|
||||
|
||||
#define SWIM_IO_SIZE 0x2000 /* SWIM IO resource size */
|
||||
|
||||
/* Mac bootinfo struct */
|
||||
|
||||
struct mac_booter_data mac_bi_data;
|
||||
|
||||
/* The phys. video addr. - might be bogus on some machines */
|
||||
|
|
@ -70,8 +67,6 @@ extern void baboon_init(void);
|
|||
|
||||
extern void mac_mksound(unsigned int, unsigned int);
|
||||
|
||||
extern void nubus_sweep_video(void);
|
||||
|
||||
static void mac_get_model(char *str);
|
||||
static void mac_identify(void);
|
||||
static void mac_report_hardware(void);
|
||||
|
|
@ -153,7 +148,7 @@ static void mac_cache_card_flush(int writeback)
|
|||
void __init config_mac(void)
|
||||
{
|
||||
if (!MACH_IS_MAC)
|
||||
printk(KERN_ERR "ERROR: no Mac, but config_mac() called!! \n");
|
||||
printk(KERN_ERR "ERROR: no Mac, but config_mac() called!!\n");
|
||||
|
||||
mach_sched_init = mac_sched_init;
|
||||
mach_init_IRQ = mac_init_IRQ;
|
||||
|
|
@ -167,12 +162,6 @@ void __init config_mac(void)
|
|||
mach_max_dma_address = 0xffffffff;
|
||||
#if defined(CONFIG_INPUT_M68K_BEEP) || defined(CONFIG_INPUT_M68K_BEEP_MODULE)
|
||||
mach_beep = mac_mksound;
|
||||
#endif
|
||||
#ifdef CONFIG_HEARTBEAT
|
||||
#if 0
|
||||
mach_heartbeat = mac_heartbeat;
|
||||
mach_heartbeat_irq = IRQ_MAC_TIMER;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
@ -191,27 +180,19 @@ void __init config_mac(void)
|
|||
if (macintosh_config->ident == MAC_MODEL_IICI
|
||||
|| macintosh_config->ident == MAC_MODEL_IIFX)
|
||||
mach_l2_flush = mac_cache_card_flush;
|
||||
|
||||
/*
|
||||
* Check for machine specific fixups.
|
||||
*/
|
||||
|
||||
#ifdef OLD_NUBUS_CODE
|
||||
nubus_sweep_video();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Macintosh Table: hardcoded model configuration data.
|
||||
* Macintosh Table: hardcoded model configuration data.
|
||||
*
|
||||
* Much of this was defined by Alan, based on who knows what docs.
|
||||
* I've added a lot more, and some of that was pure guesswork based
|
||||
* on hardware pages present on the Mac web site. Possibly wildly
|
||||
* inaccurate, so look here if a new Mac model won't run. Example: if
|
||||
* a Mac crashes immediately after the VIA1 registers have been dumped
|
||||
* to the screen, it probably died attempting to read DirB on a RBV.
|
||||
* Meaning it should have MAC_VIA_IIci here :-)
|
||||
* Much of this was defined by Alan, based on who knows what docs.
|
||||
* I've added a lot more, and some of that was pure guesswork based
|
||||
* on hardware pages present on the Mac web site. Possibly wildly
|
||||
* inaccurate, so look here if a new Mac model won't run. Example: if
|
||||
* a Mac crashes immediately after the VIA1 registers have been dumped
|
||||
* to the screen, it probably died attempting to read DirB on a RBV.
|
||||
* Meaning it should have MAC_VIA_IIci here :-)
|
||||
*/
|
||||
|
||||
struct mac_model *macintosh_config;
|
||||
|
|
@ -219,7 +200,7 @@ EXPORT_SYMBOL(macintosh_config);
|
|||
|
||||
static struct mac_model mac_data_table[] = {
|
||||
/*
|
||||
* We'll pretend to be a Macintosh II, that's pretty safe.
|
||||
* We'll pretend to be a Macintosh II, that's pretty safe.
|
||||
*/
|
||||
|
||||
{
|
||||
|
|
@ -230,12 +211,11 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_IWM
|
||||
.floppy_type = MAC_FLOPPY_IWM,
|
||||
},
|
||||
|
||||
/*
|
||||
* Original MacII hardware
|
||||
*
|
||||
* Original Mac II hardware
|
||||
*/
|
||||
|
||||
{
|
||||
|
|
@ -246,7 +226,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_IWM
|
||||
.floppy_type = MAC_FLOPPY_IWM,
|
||||
}, {
|
||||
.ident = MAC_MODEL_IIX,
|
||||
.name = "IIx",
|
||||
|
|
@ -255,7 +235,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_IICX,
|
||||
.name = "IIcx",
|
||||
|
|
@ -264,7 +244,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_SE30,
|
||||
.name = "SE/30",
|
||||
|
|
@ -273,13 +253,13 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
},
|
||||
|
||||
/*
|
||||
* Weirdified MacII hardware - all subtly different. Gee thanks
|
||||
* Apple. All these boxes seem to have VIA2 in a different place to
|
||||
* the MacII (+1A000 rather than +4000)
|
||||
* Weirdified Mac II hardware - all subtly different. Gee thanks
|
||||
* Apple. All these boxes seem to have VIA2 in a different place to
|
||||
* the Mac II (+1A000 rather than +4000)
|
||||
* CSA: see http://developer.apple.com/technotes/hw/hw_09.html
|
||||
*/
|
||||
|
||||
|
|
@ -291,7 +271,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_IIFX,
|
||||
.name = "IIfx",
|
||||
|
|
@ -300,7 +280,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_IOP,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_IOP
|
||||
.floppy_type = MAC_FLOPPY_SWIM_IOP,
|
||||
}, {
|
||||
.ident = MAC_MODEL_IISI,
|
||||
.name = "IIsi",
|
||||
|
|
@ -309,7 +289,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_IIVI,
|
||||
.name = "IIvi",
|
||||
|
|
@ -318,7 +298,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_IIVX,
|
||||
.name = "IIvx",
|
||||
|
|
@ -327,11 +307,11 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
},
|
||||
|
||||
/*
|
||||
* Classic models (guessing: similar to SE/30 ?? Nope, similar to LC ...)
|
||||
* Classic models (guessing: similar to SE/30? Nope, similar to LC...)
|
||||
*/
|
||||
|
||||
{
|
||||
|
|
@ -342,7 +322,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_CCL,
|
||||
.name = "Color Classic",
|
||||
|
|
@ -351,11 +331,11 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
},
|
||||
|
||||
/*
|
||||
* Some Mac LC machines. Basically the same as the IIci, ADB like IIsi
|
||||
* Some Mac LC machines. Basically the same as the IIci, ADB like IIsi
|
||||
*/
|
||||
|
||||
{
|
||||
|
|
@ -366,7 +346,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_LCII,
|
||||
.name = "LC II",
|
||||
|
|
@ -375,7 +355,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_LCIII,
|
||||
.name = "LC III",
|
||||
|
|
@ -384,17 +364,17 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
},
|
||||
|
||||
/*
|
||||
* Quadra. Video is at 0xF9000000, via is like a MacII. We label it differently
|
||||
* as some of the stuff connected to VIA2 seems different. Better SCSI chip and
|
||||
* onboard ethernet using a NatSemi SONIC except the 660AV and 840AV which use an
|
||||
* AMD 79C940 (MACE).
|
||||
* The 700, 900 and 950 have some I/O chips in the wrong place to
|
||||
* confuse us. The 840AV has a SCSI location of its own (same as
|
||||
* the 660AV).
|
||||
* Quadra. Video is at 0xF9000000, via is like a MacII. We label it
|
||||
* differently as some of the stuff connected to VIA2 seems different.
|
||||
* Better SCSI chip and onboard ethernet using a NatSemi SONIC except
|
||||
* the 660AV and 840AV which use an AMD 79C940 (MACE).
|
||||
* The 700, 900 and 950 have some I/O chips in the wrong place to
|
||||
* confuse us. The 840AV has a SCSI location of its own (same as
|
||||
* the 660AV).
|
||||
*/
|
||||
|
||||
{
|
||||
|
|
@ -405,7 +385,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_QUADRA,
|
||||
.scc_type = MAC_SCC_QUADRA,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1,
|
||||
}, {
|
||||
.ident = MAC_MODEL_Q605_ACC,
|
||||
.name = "Quadra 605",
|
||||
|
|
@ -414,7 +394,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_QUADRA,
|
||||
.scc_type = MAC_SCC_QUADRA,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1,
|
||||
}, {
|
||||
.ident = MAC_MODEL_Q610,
|
||||
.name = "Quadra 610",
|
||||
|
|
@ -424,7 +404,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scc_type = MAC_SCC_QUADRA,
|
||||
.ether_type = MAC_ETHER_SONIC,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1,
|
||||
}, {
|
||||
.ident = MAC_MODEL_Q630,
|
||||
.name = "Quadra 630",
|
||||
|
|
@ -435,7 +415,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scc_type = MAC_SCC_QUADRA,
|
||||
.ether_type = MAC_ETHER_SONIC,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1,
|
||||
}, {
|
||||
.ident = MAC_MODEL_Q650,
|
||||
.name = "Quadra 650",
|
||||
|
|
@ -445,9 +425,9 @@ static struct mac_model mac_data_table[] = {
|
|||
.scc_type = MAC_SCC_QUADRA,
|
||||
.ether_type = MAC_ETHER_SONIC,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1,
|
||||
},
|
||||
/* The Q700 does have a NS Sonic */
|
||||
/* The Q700 does have a NS Sonic */
|
||||
{
|
||||
.ident = MAC_MODEL_Q700,
|
||||
.name = "Quadra 700",
|
||||
|
|
@ -457,7 +437,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scc_type = MAC_SCC_QUADRA,
|
||||
.ether_type = MAC_ETHER_SONIC,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1,
|
||||
}, {
|
||||
.ident = MAC_MODEL_Q800,
|
||||
.name = "Quadra 800",
|
||||
|
|
@ -467,7 +447,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scc_type = MAC_SCC_QUADRA,
|
||||
.ether_type = MAC_ETHER_SONIC,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1,
|
||||
}, {
|
||||
.ident = MAC_MODEL_Q840,
|
||||
.name = "Quadra 840AV",
|
||||
|
|
@ -477,7 +457,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scc_type = MAC_SCC_PSC,
|
||||
.ether_type = MAC_ETHER_MACE,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_AV
|
||||
.floppy_type = MAC_FLOPPY_AV,
|
||||
}, {
|
||||
.ident = MAC_MODEL_Q900,
|
||||
.name = "Quadra 900",
|
||||
|
|
@ -487,7 +467,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scc_type = MAC_SCC_IOP,
|
||||
.ether_type = MAC_ETHER_SONIC,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_IOP
|
||||
.floppy_type = MAC_FLOPPY_SWIM_IOP,
|
||||
}, {
|
||||
.ident = MAC_MODEL_Q950,
|
||||
.name = "Quadra 950",
|
||||
|
|
@ -497,60 +477,60 @@ static struct mac_model mac_data_table[] = {
|
|||
.scc_type = MAC_SCC_IOP,
|
||||
.ether_type = MAC_ETHER_SONIC,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_IOP
|
||||
.floppy_type = MAC_FLOPPY_SWIM_IOP,
|
||||
},
|
||||
|
||||
/*
|
||||
* Performa - more LC type machines
|
||||
* Performa - more LC type machines
|
||||
*/
|
||||
|
||||
{
|
||||
.ident = MAC_MODEL_P460,
|
||||
.name = "Performa 460",
|
||||
.name = "Performa 460",
|
||||
.adb_type = MAC_ADB_IISI,
|
||||
.via_type = MAC_VIA_IIci,
|
||||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_P475,
|
||||
.name = "Performa 475",
|
||||
.name = "Performa 475",
|
||||
.adb_type = MAC_ADB_CUDA,
|
||||
.via_type = MAC_VIA_QUADRA,
|
||||
.scsi_type = MAC_SCSI_QUADRA,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1,
|
||||
}, {
|
||||
.ident = MAC_MODEL_P475F,
|
||||
.name = "Performa 475",
|
||||
.name = "Performa 475",
|
||||
.adb_type = MAC_ADB_CUDA,
|
||||
.via_type = MAC_VIA_QUADRA,
|
||||
.scsi_type = MAC_SCSI_QUADRA,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1,
|
||||
}, {
|
||||
.ident = MAC_MODEL_P520,
|
||||
.name = "Performa 520",
|
||||
.name = "Performa 520",
|
||||
.adb_type = MAC_ADB_CUDA,
|
||||
.via_type = MAC_VIA_IIci,
|
||||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_P550,
|
||||
.name = "Performa 550",
|
||||
.name = "Performa 550",
|
||||
.adb_type = MAC_ADB_CUDA,
|
||||
.via_type = MAC_VIA_IIci,
|
||||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
},
|
||||
/* These have the comm slot, and therefore the possibility of SONIC ethernet */
|
||||
/* These have the comm slot, and therefore possibly SONIC ethernet */
|
||||
{
|
||||
.ident = MAC_MODEL_P575,
|
||||
.name = "Performa 575",
|
||||
|
|
@ -560,7 +540,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scc_type = MAC_SCC_II,
|
||||
.ether_type = MAC_ETHER_SONIC,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1,
|
||||
}, {
|
||||
.ident = MAC_MODEL_P588,
|
||||
.name = "Performa 588",
|
||||
|
|
@ -571,7 +551,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scc_type = MAC_SCC_II,
|
||||
.ether_type = MAC_ETHER_SONIC,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1,
|
||||
}, {
|
||||
.ident = MAC_MODEL_TV,
|
||||
.name = "TV",
|
||||
|
|
@ -580,7 +560,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_P600,
|
||||
.name = "Performa 600",
|
||||
|
|
@ -589,14 +569,14 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
},
|
||||
|
||||
/*
|
||||
* Centris - just guessing again; maybe like Quadra
|
||||
* Centris - just guessing again; maybe like Quadra.
|
||||
* The C610 may or may not have SONIC. We probe to make sure.
|
||||
*/
|
||||
|
||||
/* The C610 may or may not have SONIC. We probe to make sure */
|
||||
{
|
||||
.ident = MAC_MODEL_C610,
|
||||
.name = "Centris 610",
|
||||
|
|
@ -606,7 +586,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scc_type = MAC_SCC_QUADRA,
|
||||
.ether_type = MAC_ETHER_SONIC,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1,
|
||||
}, {
|
||||
.ident = MAC_MODEL_C650,
|
||||
.name = "Centris 650",
|
||||
|
|
@ -616,7 +596,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scc_type = MAC_SCC_QUADRA,
|
||||
.ether_type = MAC_ETHER_SONIC,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1,
|
||||
}, {
|
||||
.ident = MAC_MODEL_C660,
|
||||
.name = "Centris 660AV",
|
||||
|
|
@ -626,7 +606,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scc_type = MAC_SCC_PSC,
|
||||
.ether_type = MAC_ETHER_MACE,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_AV
|
||||
.floppy_type = MAC_FLOPPY_AV,
|
||||
},
|
||||
|
||||
/*
|
||||
|
|
@ -643,7 +623,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_QUADRA,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_PB145,
|
||||
.name = "PowerBook 145",
|
||||
|
|
@ -652,7 +632,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_QUADRA,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_PB150,
|
||||
.name = "PowerBook 150",
|
||||
|
|
@ -662,7 +642,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.ide_type = MAC_IDE_PB,
|
||||
.scc_type = MAC_SCC_QUADRA,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_PB160,
|
||||
.name = "PowerBook 160",
|
||||
|
|
@ -671,7 +651,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_QUADRA,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_PB165,
|
||||
.name = "PowerBook 165",
|
||||
|
|
@ -680,7 +660,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_QUADRA,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_PB165C,
|
||||
.name = "PowerBook 165c",
|
||||
|
|
@ -689,7 +669,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_QUADRA,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_PB170,
|
||||
.name = "PowerBook 170",
|
||||
|
|
@ -698,7 +678,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_QUADRA,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_PB180,
|
||||
.name = "PowerBook 180",
|
||||
|
|
@ -707,7 +687,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_QUADRA,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_PB180C,
|
||||
.name = "PowerBook 180c",
|
||||
|
|
@ -716,7 +696,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_QUADRA,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_PB190,
|
||||
.name = "PowerBook 190",
|
||||
|
|
@ -726,7 +706,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.ide_type = MAC_IDE_BABOON,
|
||||
.scc_type = MAC_SCC_QUADRA,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_PB520,
|
||||
.name = "PowerBook 520",
|
||||
|
|
@ -736,7 +716,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scc_type = MAC_SCC_QUADRA,
|
||||
.ether_type = MAC_ETHER_SONIC,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
},
|
||||
|
||||
/*
|
||||
|
|
@ -757,7 +737,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_QUADRA,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_PB230,
|
||||
.name = "PowerBook Duo 230",
|
||||
|
|
@ -766,7 +746,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_QUADRA,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_PB250,
|
||||
.name = "PowerBook Duo 250",
|
||||
|
|
@ -775,7 +755,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_QUADRA,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_PB270C,
|
||||
.name = "PowerBook Duo 270c",
|
||||
|
|
@ -784,7 +764,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_QUADRA,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_PB280,
|
||||
.name = "PowerBook Duo 280",
|
||||
|
|
@ -793,7 +773,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_QUADRA,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_PB280C,
|
||||
.name = "PowerBook Duo 280c",
|
||||
|
|
@ -802,17 +782,44 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_QUADRA,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
},
|
||||
|
||||
/*
|
||||
* Other stuff ??
|
||||
* Other stuff?
|
||||
*/
|
||||
|
||||
{
|
||||
.ident = -1
|
||||
}
|
||||
};
|
||||
|
||||
static struct resource scc_a_rsrcs[] = {
|
||||
{ .flags = IORESOURCE_MEM },
|
||||
{ .flags = IORESOURCE_IRQ },
|
||||
};
|
||||
|
||||
static struct resource scc_b_rsrcs[] = {
|
||||
{ .flags = IORESOURCE_MEM },
|
||||
{ .flags = IORESOURCE_IRQ },
|
||||
};
|
||||
|
||||
struct platform_device scc_a_pdev = {
|
||||
.name = "scc",
|
||||
.id = 0,
|
||||
.num_resources = ARRAY_SIZE(scc_a_rsrcs),
|
||||
.resource = scc_a_rsrcs,
|
||||
};
|
||||
EXPORT_SYMBOL(scc_a_pdev);
|
||||
|
||||
struct platform_device scc_b_pdev = {
|
||||
.name = "scc",
|
||||
.id = 1,
|
||||
.num_resources = ARRAY_SIZE(scc_b_rsrcs),
|
||||
.resource = scc_b_rsrcs,
|
||||
};
|
||||
EXPORT_SYMBOL(scc_b_pdev);
|
||||
|
||||
static void __init mac_identify(void)
|
||||
{
|
||||
struct mac_model *m;
|
||||
|
|
@ -823,7 +830,8 @@ static void __init mac_identify(void)
|
|||
/* no bootinfo model id -> NetBSD booter was used! */
|
||||
/* XXX FIXME: breaks for model > 31 */
|
||||
model = (mac_bi_data.cpuid >> 2) & 63;
|
||||
printk(KERN_WARNING "No bootinfo model ID, using cpuid instead (hey, use Penguin!)\n");
|
||||
printk(KERN_WARNING "No bootinfo model ID, using cpuid instead "
|
||||
"(obsolete bootloader?)\n");
|
||||
}
|
||||
|
||||
macintosh_config = mac_data_table;
|
||||
|
|
@ -834,28 +842,48 @@ static void __init mac_identify(void)
|
|||
}
|
||||
}
|
||||
|
||||
/* We need to pre-init the IOPs, if any. Otherwise */
|
||||
/* the serial console won't work if the user had */
|
||||
/* the serial ports set to "Faster" mode in MacOS. */
|
||||
/* Set up serial port resources for the console initcall. */
|
||||
|
||||
scc_a_rsrcs[0].start = (resource_size_t) mac_bi_data.sccbase + 2;
|
||||
scc_a_rsrcs[0].end = scc_a_rsrcs[0].start;
|
||||
scc_b_rsrcs[0].start = (resource_size_t) mac_bi_data.sccbase;
|
||||
scc_b_rsrcs[0].end = scc_b_rsrcs[0].start;
|
||||
|
||||
switch (macintosh_config->scc_type) {
|
||||
case MAC_SCC_PSC:
|
||||
scc_a_rsrcs[1].start = scc_a_rsrcs[1].end = IRQ_MAC_SCC_A;
|
||||
scc_b_rsrcs[1].start = scc_b_rsrcs[1].end = IRQ_MAC_SCC_B;
|
||||
break;
|
||||
default:
|
||||
scc_a_rsrcs[1].start = scc_a_rsrcs[1].end = IRQ_MAC_SCC;
|
||||
scc_b_rsrcs[1].start = scc_b_rsrcs[1].end = IRQ_MAC_SCC;
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* We need to pre-init the IOPs, if any. Otherwise
|
||||
* the serial console won't work if the user had
|
||||
* the serial ports set to "Faster" mode in MacOS.
|
||||
*/
|
||||
iop_preinit();
|
||||
|
||||
printk(KERN_INFO "Detected Macintosh model: %d \n", model);
|
||||
printk(KERN_INFO "Detected Macintosh model: %d\n", model);
|
||||
|
||||
/*
|
||||
* Report booter data:
|
||||
*/
|
||||
printk(KERN_DEBUG " Penguin bootinfo data:\n");
|
||||
printk(KERN_DEBUG " Video: addr 0x%lx row 0x%lx depth %lx dimensions %ld x %ld\n",
|
||||
printk(KERN_DEBUG " Video: addr 0x%lx "
|
||||
"row 0x%lx depth %lx dimensions %ld x %ld\n",
|
||||
mac_bi_data.videoaddr, mac_bi_data.videorow,
|
||||
mac_bi_data.videodepth, mac_bi_data.dimensions & 0xFFFF,
|
||||
mac_bi_data.dimensions >> 16);
|
||||
printk(KERN_DEBUG " Videological 0x%lx phys. 0x%lx, SCC at 0x%lx \n",
|
||||
printk(KERN_DEBUG " Videological 0x%lx phys. 0x%lx, SCC at 0x%lx\n",
|
||||
mac_bi_data.videological, mac_orig_videoaddr,
|
||||
mac_bi_data.sccbase);
|
||||
printk(KERN_DEBUG " Boottime: 0x%lx GMTBias: 0x%lx \n",
|
||||
printk(KERN_DEBUG " Boottime: 0x%lx GMTBias: 0x%lx\n",
|
||||
mac_bi_data.boottime, mac_bi_data.gmtbias);
|
||||
printk(KERN_DEBUG " Machine ID: %ld CPUid: 0x%lx memory size: 0x%lx \n",
|
||||
printk(KERN_DEBUG " Machine ID: %ld CPUid: 0x%lx memory size: 0x%lx\n",
|
||||
mac_bi_data.id, mac_bi_data.cpuid, mac_bi_data.memsize);
|
||||
|
||||
iop_init();
|
||||
|
|
@ -863,6 +891,10 @@ static void __init mac_identify(void)
|
|||
oss_init();
|
||||
psc_init();
|
||||
baboon_init();
|
||||
|
||||
#ifdef CONFIG_ADB_CUDA
|
||||
find_via_cuda();
|
||||
#endif
|
||||
}
|
||||
|
||||
static void __init mac_report_hardware(void)
|
||||
|
|
@ -876,23 +908,50 @@ static void mac_get_model(char *str)
|
|||
strcat(str, macintosh_config->name);
|
||||
}
|
||||
|
||||
static struct resource swim_resources[1];
|
||||
static struct resource swim_rsrc = { .flags = IORESOURCE_MEM };
|
||||
|
||||
static struct platform_device swim_device = {
|
||||
static struct platform_device swim_pdev = {
|
||||
.name = "swim",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(swim_resources),
|
||||
.resource = swim_resources,
|
||||
.num_resources = 1,
|
||||
.resource = &swim_rsrc,
|
||||
};
|
||||
|
||||
static struct platform_device *mac_platform_devices[] __initdata = {
|
||||
&swim_device
|
||||
static struct platform_device esp_0_pdev = {
|
||||
.name = "mac_esp",
|
||||
.id = 0,
|
||||
};
|
||||
|
||||
static struct platform_device esp_1_pdev = {
|
||||
.name = "mac_esp",
|
||||
.id = 1,
|
||||
};
|
||||
|
||||
static struct platform_device sonic_pdev = {
|
||||
.name = "macsonic",
|
||||
.id = -1,
|
||||
};
|
||||
|
||||
static struct platform_device mace_pdev = {
|
||||
.name = "macmace",
|
||||
.id = -1,
|
||||
};
|
||||
|
||||
int __init mac_platform_init(void)
|
||||
{
|
||||
u8 *swim_base;
|
||||
|
||||
/*
|
||||
* Serial devices
|
||||
*/
|
||||
|
||||
platform_device_register(&scc_a_pdev);
|
||||
platform_device_register(&scc_b_pdev);
|
||||
|
||||
/*
|
||||
* Floppy device
|
||||
*/
|
||||
|
||||
switch (macintosh_config->floppy_type) {
|
||||
case MAC_FLOPPY_SWIM_ADDR1:
|
||||
swim_base = (u8 *)(VIA1_BASE + 0x1E000);
|
||||
|
|
@ -901,16 +960,47 @@ int __init mac_platform_init(void)
|
|||
swim_base = (u8 *)(VIA1_BASE + 0x16000);
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
swim_base = NULL;
|
||||
break;
|
||||
}
|
||||
|
||||
swim_resources[0].name = "swim-regs";
|
||||
swim_resources[0].start = (resource_size_t)swim_base;
|
||||
swim_resources[0].end = (resource_size_t)(swim_base + SWIM_IO_SIZE);
|
||||
swim_resources[0].flags = IORESOURCE_MEM;
|
||||
if (swim_base) {
|
||||
swim_rsrc.start = (resource_size_t) swim_base,
|
||||
swim_rsrc.end = (resource_size_t) swim_base + 0x2000,
|
||||
platform_device_register(&swim_pdev);
|
||||
}
|
||||
|
||||
return platform_add_devices(mac_platform_devices,
|
||||
ARRAY_SIZE(mac_platform_devices));
|
||||
/*
|
||||
* SCSI device(s)
|
||||
*/
|
||||
|
||||
switch (macintosh_config->scsi_type) {
|
||||
case MAC_SCSI_QUADRA:
|
||||
case MAC_SCSI_QUADRA3:
|
||||
platform_device_register(&esp_0_pdev);
|
||||
break;
|
||||
case MAC_SCSI_QUADRA2:
|
||||
platform_device_register(&esp_0_pdev);
|
||||
if ((macintosh_config->ident == MAC_MODEL_Q900) ||
|
||||
(macintosh_config->ident == MAC_MODEL_Q950))
|
||||
platform_device_register(&esp_1_pdev);
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Ethernet device
|
||||
*/
|
||||
|
||||
switch (macintosh_config->ether_type) {
|
||||
case MAC_ETHER_SONIC:
|
||||
platform_device_register(&sonic_pdev);
|
||||
break;
|
||||
case MAC_ETHER_MACE:
|
||||
platform_device_register(&mace_pdev);
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
arch_initcall(mac_platform_init);
|
||||
|
|
|
|||
|
|
@ -1,365 +0,0 @@
|
|||
/*
|
||||
* linux/arch/m68k/mac/debug.c
|
||||
*
|
||||
* Shamelessly stolen (SCC code and general framework) from:
|
||||
*
|
||||
* linux/arch/m68k/atari/debug.c
|
||||
*
|
||||
* Atari debugging and serial console stuff
|
||||
*
|
||||
* Assembled of parts of former atari/config.c 97-12-18 by Roman Hodek
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#define BOOTINFO_COMPAT_1_0
|
||||
#include <asm/setup.h>
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/macints.h>
|
||||
|
||||
extern unsigned long mac_videobase;
|
||||
extern unsigned long mac_rowbytes;
|
||||
|
||||
extern void mac_serial_print(const char *);
|
||||
|
||||
#define DEBUG_HEADS
|
||||
#undef DEBUG_SCREEN
|
||||
#define DEBUG_SERIAL
|
||||
|
||||
/*
|
||||
* These two auxiliary debug functions should go away ASAP. Only usage:
|
||||
* before the console output is up (after head.S come some other crucial
|
||||
* setup routines :-) it permits writing 'data' to the screen as bit patterns
|
||||
* (good luck reading those). Helped to figure that the bootinfo contained
|
||||
* garbage data on the amount and size of memory chunks ...
|
||||
*
|
||||
* The 'pos' argument now simply means 'linefeed after print' ...
|
||||
*/
|
||||
|
||||
#ifdef DEBUG_SCREEN
|
||||
static int peng, line;
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
|
||||
void mac_debugging_short(int pos, short num)
|
||||
{
|
||||
#ifdef DEBUG_SCREEN
|
||||
unsigned char *pengoffset;
|
||||
unsigned char *pptr;
|
||||
int i;
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG_SERIAL
|
||||
printk("debug: %d !\n", num);
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG_SCREEN
|
||||
if (!MACH_IS_MAC) {
|
||||
/* printk("debug: %d !\n", num); */
|
||||
return;
|
||||
}
|
||||
|
||||
/* calculate current offset */
|
||||
pengoffset = (unsigned char *)mac_videobase +
|
||||
(150+line*2) * mac_rowbytes + 80 * peng;
|
||||
|
||||
pptr = pengoffset;
|
||||
|
||||
for (i = 0; i < 8 * sizeof(short); i++) { /* # of bits */
|
||||
/* value mask for bit i, reverse order */
|
||||
*pptr++ = (num & (1 << (8*sizeof(short)-i-1)) ? 0xFF : 0x00);
|
||||
}
|
||||
|
||||
peng++;
|
||||
|
||||
if (pos) {
|
||||
line++;
|
||||
peng = 0;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void mac_debugging_long(int pos, long addr)
|
||||
{
|
||||
#ifdef DEBUG_SCREEN
|
||||
unsigned char *pengoffset;
|
||||
unsigned char *pptr;
|
||||
int i;
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG_SERIAL
|
||||
printk("debug: #%ld !\n", addr);
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG_SCREEN
|
||||
if (!MACH_IS_MAC) {
|
||||
/* printk("debug: #%ld !\n", addr); */
|
||||
return;
|
||||
}
|
||||
|
||||
pengoffset=(unsigned char *)(mac_videobase+(150+line*2)*mac_rowbytes)
|
||||
+80*peng;
|
||||
|
||||
pptr = pengoffset;
|
||||
|
||||
for (i = 0; i < 8 * sizeof(long); i++) { /* # of bits */
|
||||
*pptr++ = (addr & (1 << (8*sizeof(long)-i-1)) ? 0xFF : 0x00);
|
||||
}
|
||||
|
||||
peng++;
|
||||
|
||||
if (pos) {
|
||||
line++;
|
||||
peng = 0;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* 0 */
|
||||
|
||||
#ifdef DEBUG_SERIAL
|
||||
/*
|
||||
* TODO: serial debug code
|
||||
*/
|
||||
|
||||
struct mac_SCC {
|
||||
u_char cha_b_ctrl;
|
||||
u_char char_dummy1;
|
||||
u_char cha_a_ctrl;
|
||||
u_char char_dummy2;
|
||||
u_char cha_b_data;
|
||||
u_char char_dummy3;
|
||||
u_char cha_a_data;
|
||||
};
|
||||
|
||||
# define scc (*((volatile struct mac_SCC*)mac_bi_data.sccbase))
|
||||
|
||||
static int scc_port = -1;
|
||||
|
||||
static struct console mac_console_driver = {
|
||||
.name = "debug",
|
||||
.flags = CON_PRINTBUFFER,
|
||||
.index = -1,
|
||||
};
|
||||
|
||||
/*
|
||||
* Crude hack to get console output to the screen before the framebuffer
|
||||
* is initialized (happens a lot later in 2.1!).
|
||||
* We just use the console routines declared in head.S, this will interfere
|
||||
* with regular framebuffer console output and should be used exclusively
|
||||
* to debug kernel problems manifesting before framebuffer init (aka WSOD)
|
||||
*
|
||||
* To keep this hack from interfering with the regular console driver, either
|
||||
* deregister this driver before/on framebuffer console init, or silence this
|
||||
* function after the fbcon driver is running (will lose console messages!?).
|
||||
* To debug real early bugs, need to write a 'mac_register_console_hack()'
|
||||
* that is called from start_kernel() before setup_arch() and just registers
|
||||
* this driver if Mac.
|
||||
*/
|
||||
|
||||
static void mac_debug_console_write(struct console *co, const char *str,
|
||||
unsigned int count)
|
||||
{
|
||||
mac_serial_print(str);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Mac: loops_per_jiffy min. 19000 ^= .5 us; MFPDELAY was 0.6 us*/
|
||||
|
||||
#define uSEC 1
|
||||
|
||||
static inline void mac_sccb_out(char c)
|
||||
{
|
||||
int i;
|
||||
|
||||
do {
|
||||
for (i = uSEC; i > 0; --i)
|
||||
barrier();
|
||||
} while (!(scc.cha_b_ctrl & 0x04)); /* wait for tx buf empty */
|
||||
for (i = uSEC; i > 0; --i)
|
||||
barrier();
|
||||
scc.cha_b_data = c;
|
||||
}
|
||||
|
||||
static inline void mac_scca_out(char c)
|
||||
{
|
||||
int i;
|
||||
|
||||
do {
|
||||
for (i = uSEC; i > 0; --i)
|
||||
barrier();
|
||||
} while (!(scc.cha_a_ctrl & 0x04)); /* wait for tx buf empty */
|
||||
for (i = uSEC; i > 0; --i)
|
||||
barrier();
|
||||
scc.cha_a_data = c;
|
||||
}
|
||||
|
||||
static void mac_sccb_console_write(struct console *co, const char *str,
|
||||
unsigned int count)
|
||||
{
|
||||
while (count--) {
|
||||
if (*str == '\n')
|
||||
mac_sccb_out('\r');
|
||||
mac_sccb_out(*str++);
|
||||
}
|
||||
}
|
||||
|
||||
static void mac_scca_console_write(struct console *co, const char *str,
|
||||
unsigned int count)
|
||||
{
|
||||
while (count--) {
|
||||
if (*str == '\n')
|
||||
mac_scca_out('\r');
|
||||
mac_scca_out(*str++);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* The following two functions do a quick'n'dirty initialization of the MFP or
|
||||
* SCC serial ports. They're used by the debugging interface, kgdb, and the
|
||||
* serial console code. */
|
||||
#define SCCB_WRITE(reg,val) \
|
||||
do { \
|
||||
int i; \
|
||||
scc.cha_b_ctrl = (reg); \
|
||||
for (i = uSEC; i > 0; --i) \
|
||||
barrier(); \
|
||||
scc.cha_b_ctrl = (val); \
|
||||
for (i = uSEC; i > 0; --i) \
|
||||
barrier(); \
|
||||
} while(0)
|
||||
|
||||
#define SCCA_WRITE(reg,val) \
|
||||
do { \
|
||||
int i; \
|
||||
scc.cha_a_ctrl = (reg); \
|
||||
for (i = uSEC; i > 0; --i) \
|
||||
barrier(); \
|
||||
scc.cha_a_ctrl = (val); \
|
||||
for (i = uSEC; i > 0; --i) \
|
||||
barrier(); \
|
||||
} while(0)
|
||||
|
||||
/* loops_per_jiffy isn't initialized yet, so we can't use udelay(). This does a
|
||||
* delay of ~ 60us. */
|
||||
/* Mac: loops_per_jiffy min. 19000 ^= .5 us; MFPDELAY was 0.6 us*/
|
||||
#define LONG_DELAY() \
|
||||
do { \
|
||||
int i; \
|
||||
for (i = 60*uSEC; i > 0; --i) \
|
||||
barrier(); \
|
||||
} while(0)
|
||||
|
||||
static void __init mac_init_scc_port(int cflag, int port)
|
||||
{
|
||||
/*
|
||||
* baud rates: 1200, 1800, 2400, 4800, 9600, 19.2k, 38.4k, 57.6k, 115.2k
|
||||
*/
|
||||
|
||||
static int clksrc_table[9] =
|
||||
/* reg 11: 0x50 = BRG, 0x00 = RTxC, 0x28 = TRxC */
|
||||
{ 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x00, 0x00 };
|
||||
static int clkmode_table[9] =
|
||||
/* reg 4: 0x40 = x16, 0x80 = x32, 0xc0 = x64 */
|
||||
{ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0xc0, 0x80 };
|
||||
static int div_table[9] =
|
||||
/* reg12 (BRG low) */
|
||||
{ 94, 62, 46, 22, 10, 4, 1, 0, 0 };
|
||||
|
||||
int baud = cflag & CBAUD;
|
||||
int clksrc, clkmode, div, reg3, reg5;
|
||||
|
||||
if (cflag & CBAUDEX)
|
||||
baud += B38400;
|
||||
if (baud < B1200 || baud > B38400+2)
|
||||
baud = B9600; /* use default 9600bps for non-implemented rates */
|
||||
baud -= B1200; /* tables starts at 1200bps */
|
||||
|
||||
clksrc = clksrc_table[baud];
|
||||
clkmode = clkmode_table[baud];
|
||||
div = div_table[baud];
|
||||
|
||||
reg3 = (((cflag & CSIZE) == CS8) ? 0xc0 : 0x40);
|
||||
reg5 = (((cflag & CSIZE) == CS8) ? 0x60 : 0x20) | 0x82 /* assert DTR/RTS */;
|
||||
|
||||
if (port == 1) {
|
||||
(void)scc.cha_b_ctrl; /* reset reg pointer */
|
||||
SCCB_WRITE(9, 0xc0); /* reset */
|
||||
LONG_DELAY(); /* extra delay after WR9 access */
|
||||
SCCB_WRITE(4, (cflag & PARENB) ? ((cflag & PARODD) ? 0x01 : 0x03) : 0 |
|
||||
0x04 /* 1 stopbit */ |
|
||||
clkmode);
|
||||
SCCB_WRITE(3, reg3);
|
||||
SCCB_WRITE(5, reg5);
|
||||
SCCB_WRITE(9, 0); /* no interrupts */
|
||||
LONG_DELAY(); /* extra delay after WR9 access */
|
||||
SCCB_WRITE(10, 0); /* NRZ mode */
|
||||
SCCB_WRITE(11, clksrc); /* main clock source */
|
||||
SCCB_WRITE(12, div); /* BRG value */
|
||||
SCCB_WRITE(13, 0); /* BRG high byte */
|
||||
SCCB_WRITE(14, 1);
|
||||
SCCB_WRITE(3, reg3 | 1);
|
||||
SCCB_WRITE(5, reg5 | 8);
|
||||
} else if (port == 0) {
|
||||
(void)scc.cha_a_ctrl; /* reset reg pointer */
|
||||
SCCA_WRITE(9, 0xc0); /* reset */
|
||||
LONG_DELAY(); /* extra delay after WR9 access */
|
||||
SCCA_WRITE(4, (cflag & PARENB) ? ((cflag & PARODD) ? 0x01 : 0x03) : 0 |
|
||||
0x04 /* 1 stopbit */ |
|
||||
clkmode);
|
||||
SCCA_WRITE(3, reg3);
|
||||
SCCA_WRITE(5, reg5);
|
||||
SCCA_WRITE(9, 0); /* no interrupts */
|
||||
LONG_DELAY(); /* extra delay after WR9 access */
|
||||
SCCA_WRITE(10, 0); /* NRZ mode */
|
||||
SCCA_WRITE(11, clksrc); /* main clock source */
|
||||
SCCA_WRITE(12, div); /* BRG value */
|
||||
SCCA_WRITE(13, 0); /* BRG high byte */
|
||||
SCCA_WRITE(14, 1);
|
||||
SCCA_WRITE(3, reg3 | 1);
|
||||
SCCA_WRITE(5, reg5 | 8);
|
||||
}
|
||||
}
|
||||
#endif /* DEBUG_SERIAL */
|
||||
|
||||
static int __init mac_debug_setup(char *arg)
|
||||
{
|
||||
if (!MACH_IS_MAC)
|
||||
return 0;
|
||||
|
||||
#ifdef DEBUG_SERIAL
|
||||
if (!strcmp(arg, "ser") || !strcmp(arg, "ser1")) {
|
||||
/* Mac modem port */
|
||||
mac_init_scc_port(B9600|CS8, 0);
|
||||
mac_console_driver.write = mac_scca_console_write;
|
||||
scc_port = 0;
|
||||
} else if (!strcmp(arg, "ser2")) {
|
||||
/* Mac printer port */
|
||||
mac_init_scc_port(B9600|CS8, 1);
|
||||
mac_console_driver.write = mac_sccb_console_write;
|
||||
scc_port = 1;
|
||||
}
|
||||
#endif
|
||||
#ifdef DEBUG_HEADS
|
||||
if (!strcmp(arg, "scn") || !strcmp(arg, "con")) {
|
||||
/* display, using head.S console routines */
|
||||
mac_console_driver.write = mac_debug_console_write;
|
||||
}
|
||||
#endif
|
||||
if (mac_console_driver.write)
|
||||
register_console(&mac_console_driver);
|
||||
return 0;
|
||||
}
|
||||
|
||||
early_param("debug", mac_debug_setup);
|
||||
|
|
@ -34,9 +34,7 @@
|
|||
*
|
||||
* 3 - unused (?)
|
||||
*
|
||||
* 4 - SCC (slot number determined by reading RR3 on the SSC itself)
|
||||
* - slot 1: SCC channel A
|
||||
* - slot 2: SCC channel B
|
||||
* 4 - SCC
|
||||
*
|
||||
* 5 - unused (?)
|
||||
* [serial errors or special conditions seem to raise level 6
|
||||
|
|
@ -55,8 +53,6 @@
|
|||
* - slot 5: Slot $E
|
||||
*
|
||||
* 4 - SCC IOP
|
||||
* - slot 1: SCC channel A
|
||||
* - slot 2: SCC channel B
|
||||
*
|
||||
* 5 - ISM IOP (ADB?)
|
||||
*
|
||||
|
|
@ -136,13 +132,8 @@
|
|||
#include <asm/irq_regs.h>
|
||||
#include <asm/mac_oss.h>
|
||||
|
||||
#define DEBUG_SPURIOUS
|
||||
#define SHUTUP_SONIC
|
||||
|
||||
/* SCC interrupt mask */
|
||||
|
||||
static int scc_mask;
|
||||
|
||||
/*
|
||||
* VIA/RBV hooks
|
||||
*/
|
||||
|
|
@ -190,13 +181,6 @@ extern void baboon_irq_enable(int);
|
|||
extern void baboon_irq_disable(int);
|
||||
extern void baboon_irq_clear(int);
|
||||
|
||||
/*
|
||||
* SCC interrupt routines
|
||||
*/
|
||||
|
||||
static void scc_irq_enable(unsigned int);
|
||||
static void scc_irq_disable(unsigned int);
|
||||
|
||||
/*
|
||||
* console_loglevel determines NMI handler function
|
||||
*/
|
||||
|
|
@ -221,8 +205,6 @@ void __init mac_init_IRQ(void)
|
|||
#ifdef DEBUG_MACINTS
|
||||
printk("mac_init_IRQ(): Setting things up...\n");
|
||||
#endif
|
||||
scc_mask = 0;
|
||||
|
||||
m68k_setup_irq_controller(&mac_irq_controller, IRQ_USER,
|
||||
NUM_MAC_SOURCES - IRQ_USER);
|
||||
/* Make sure the SONIC interrupt is cleared or things get ugly */
|
||||
|
|
@ -283,15 +265,16 @@ void mac_enable_irq(unsigned int irq)
|
|||
via_irq_enable(irq);
|
||||
break;
|
||||
case 3:
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
if (psc_present)
|
||||
psc_irq_enable(irq);
|
||||
else if (oss_present)
|
||||
oss_irq_enable(irq);
|
||||
else if (irq_src == 4)
|
||||
scc_irq_enable(irq);
|
||||
break;
|
||||
case 4:
|
||||
if (psc_present)
|
||||
psc_irq_enable(irq);
|
||||
break;
|
||||
case 8:
|
||||
if (baboon_present)
|
||||
|
|
@ -316,15 +299,16 @@ void mac_disable_irq(unsigned int irq)
|
|||
via_irq_disable(irq);
|
||||
break;
|
||||
case 3:
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
if (psc_present)
|
||||
psc_irq_disable(irq);
|
||||
else if (oss_present)
|
||||
oss_irq_disable(irq);
|
||||
else if (irq_src == 4)
|
||||
scc_irq_disable(irq);
|
||||
break;
|
||||
case 4:
|
||||
if (psc_present)
|
||||
psc_irq_disable(irq);
|
||||
break;
|
||||
case 8:
|
||||
if (baboon_present)
|
||||
|
|
@ -347,7 +331,6 @@ void mac_clear_irq(unsigned int irq)
|
|||
via_irq_clear(irq);
|
||||
break;
|
||||
case 3:
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
if (psc_present)
|
||||
|
|
@ -355,6 +338,10 @@ void mac_clear_irq(unsigned int irq)
|
|||
else if (oss_present)
|
||||
oss_irq_clear(irq);
|
||||
break;
|
||||
case 4:
|
||||
if (psc_present)
|
||||
psc_irq_clear(irq);
|
||||
break;
|
||||
case 8:
|
||||
if (baboon_present)
|
||||
baboon_irq_clear(irq);
|
||||
|
|
@ -374,13 +361,17 @@ int mac_irq_pending(unsigned int irq)
|
|||
else
|
||||
return via_irq_pending(irq);
|
||||
case 3:
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
if (psc_present)
|
||||
return psc_irq_pending(irq);
|
||||
else if (oss_present)
|
||||
return oss_irq_pending(irq);
|
||||
break;
|
||||
case 4:
|
||||
if (psc_present)
|
||||
psc_irq_pending(irq);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -448,59 +439,3 @@ irqreturn_t mac_nmi_handler(int irq, void *dev_id)
|
|||
in_nmi--;
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
/*
|
||||
* Simple routines for masking and unmasking
|
||||
* SCC interrupts in cases where this can't be
|
||||
* done in hardware (only the PSC can do that.)
|
||||
*/
|
||||
|
||||
static void scc_irq_enable(unsigned int irq)
|
||||
{
|
||||
int irq_idx = IRQ_IDX(irq);
|
||||
|
||||
scc_mask |= (1 << irq_idx);
|
||||
}
|
||||
|
||||
static void scc_irq_disable(unsigned int irq)
|
||||
{
|
||||
int irq_idx = IRQ_IDX(irq);
|
||||
|
||||
scc_mask &= ~(1 << irq_idx);
|
||||
}
|
||||
|
||||
/*
|
||||
* SCC master interrupt handler. We have to do a bit of magic here
|
||||
* to figure out what channel gave us the interrupt; putting this
|
||||
* here is cleaner than hacking it into drivers/char/macserial.c.
|
||||
*/
|
||||
|
||||
void mac_scc_dispatch(int irq, void *dev_id)
|
||||
{
|
||||
volatile unsigned char *scc = (unsigned char *) mac_bi_data.sccbase + 2;
|
||||
unsigned char reg;
|
||||
unsigned long flags;
|
||||
|
||||
/* Read RR3 from the chip. Always do this on channel A */
|
||||
/* This must be an atomic operation so disable irqs. */
|
||||
|
||||
local_irq_save(flags);
|
||||
*scc = 3;
|
||||
reg = *scc;
|
||||
local_irq_restore(flags);
|
||||
|
||||
/* Now dispatch. Bits 0-2 are for channel B and */
|
||||
/* bits 3-5 are for channel A. We can safely */
|
||||
/* ignore the remaining bits here. */
|
||||
/* */
|
||||
/* Note that we're ignoring scc_mask for now. */
|
||||
/* If we actually mask the ints then we tend to */
|
||||
/* get hammered by very persistent SCC irqs, */
|
||||
/* and since they're autovector interrupts they */
|
||||
/* pretty much kill the system. */
|
||||
|
||||
if (reg & 0x38)
|
||||
m68k_handle_int(IRQ_SCCA);
|
||||
if (reg & 0x07)
|
||||
m68k_handle_int(IRQ_SCCB);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,7 +8,6 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/time.h>
|
||||
#include <linux/rtc.h>
|
||||
#include <linux/mm.h>
|
||||
|
|
|
|||
|
|
@ -33,7 +33,6 @@ static irqreturn_t oss_irq(int, void *);
|
|||
static irqreturn_t oss_nubus_irq(int, void *);
|
||||
|
||||
extern irqreturn_t via1_irq(int, void *);
|
||||
extern irqreturn_t mac_scc_dispatch(int, void *);
|
||||
|
||||
/*
|
||||
* Initialize the OSS
|
||||
|
|
@ -69,9 +68,6 @@ void __init oss_register_interrupts(void)
|
|||
if (request_irq(OSS_IRQLEV_SCSI, oss_irq, IRQ_FLG_LOCK,
|
||||
"scsi", (void *) oss))
|
||||
pr_err("Couldn't register %s interrupt\n", "scsi");
|
||||
if (request_irq(OSS_IRQLEV_IOPSCC, mac_scc_dispatch, IRQ_FLG_LOCK,
|
||||
"scc", mac_scc_dispatch))
|
||||
pr_err("Couldn't register %s interrupt\n", "scc");
|
||||
if (request_irq(OSS_IRQLEV_NUBUS, oss_nubus_irq, IRQ_FLG_LOCK,
|
||||
"nubus", (void *) oss))
|
||||
pr_err("Couldn't register %s interrupt\n", "nubus");
|
||||
|
|
@ -172,9 +168,7 @@ void oss_irq_enable(int irq) {
|
|||
printk("oss_irq_enable(%d)\n", irq);
|
||||
#endif
|
||||
switch(irq) {
|
||||
case IRQ_SCC:
|
||||
case IRQ_SCCA:
|
||||
case IRQ_SCCB:
|
||||
case IRQ_MAC_SCC:
|
||||
oss->irq_level[OSS_IOPSCC] = OSS_IRQLEV_IOPSCC;
|
||||
break;
|
||||
case IRQ_MAC_ADB:
|
||||
|
|
@ -212,9 +206,7 @@ void oss_irq_disable(int irq) {
|
|||
printk("oss_irq_disable(%d)\n", irq);
|
||||
#endif
|
||||
switch(irq) {
|
||||
case IRQ_SCC:
|
||||
case IRQ_SCCA:
|
||||
case IRQ_SCCB:
|
||||
case IRQ_MAC_SCC:
|
||||
oss->irq_level[OSS_IOPSCC] = OSS_IRQLEV_DISABLED;
|
||||
break;
|
||||
case IRQ_MAC_ADB:
|
||||
|
|
@ -250,9 +242,7 @@ void oss_irq_disable(int irq) {
|
|||
void oss_irq_clear(int irq) {
|
||||
/* FIXME: how to do this on OSS? */
|
||||
switch(irq) {
|
||||
case IRQ_SCC:
|
||||
case IRQ_SCCA:
|
||||
case IRQ_SCCB:
|
||||
case IRQ_MAC_SCC:
|
||||
oss->irq_pending &= ~OSS_IP_IOPSCC;
|
||||
break;
|
||||
case IRQ_MAC_ADB:
|
||||
|
|
@ -280,9 +270,7 @@ void oss_irq_clear(int irq) {
|
|||
int oss_irq_pending(int irq)
|
||||
{
|
||||
switch(irq) {
|
||||
case IRQ_SCC:
|
||||
case IRQ_SCCA:
|
||||
case IRQ_SCCB:
|
||||
case IRQ_MAC_SCC:
|
||||
return oss->irq_pending & OSS_IP_IOPSCC;
|
||||
break;
|
||||
case IRQ_MAC_ADB:
|
||||
|
|
|
|||
|
|
@ -84,8 +84,6 @@ void via_irq_enable(int irq);
|
|||
void via_irq_disable(int irq);
|
||||
void via_irq_clear(int irq);
|
||||
|
||||
extern irqreturn_t mac_scc_dispatch(int, void *);
|
||||
|
||||
/*
|
||||
* Initialize the VIAs
|
||||
*
|
||||
|
|
@ -311,11 +309,6 @@ void __init via_register_interrupts(void)
|
|||
if (request_irq(IRQ_AUTO_2, via2_irq, IRQ_FLG_LOCK|IRQ_FLG_FAST,
|
||||
"via2", (void *) via2))
|
||||
pr_err("Couldn't register %s interrupt\n", "via2");
|
||||
if (!psc_present) {
|
||||
if (request_irq(IRQ_AUTO_4, mac_scc_dispatch, IRQ_FLG_LOCK,
|
||||
"scc", mac_scc_dispatch))
|
||||
pr_err("Couldn't register %s interrupt\n", "scc");
|
||||
}
|
||||
if (request_irq(IRQ_MAC_NUBUS, via_nubus_irq,
|
||||
IRQ_FLG_LOCK|IRQ_FLG_FAST, "nubus", (void *) via2))
|
||||
pr_err("Couldn't register %s interrupt\n", "nubus");
|
||||
|
|
|
|||
|
|
@ -154,7 +154,6 @@ good_area:
|
|||
* the fault.
|
||||
*/
|
||||
|
||||
survive:
|
||||
fault = handle_mm_fault(mm, vma, address, write ? FAULT_FLAG_WRITE : 0);
|
||||
#ifdef DEBUG
|
||||
printk("handle_mm_fault returns %d\n",fault);
|
||||
|
|
@ -180,15 +179,10 @@ good_area:
|
|||
*/
|
||||
out_of_memory:
|
||||
up_read(&mm->mmap_sem);
|
||||
if (is_global_init(current)) {
|
||||
yield();
|
||||
down_read(&mm->mmap_sem);
|
||||
goto survive;
|
||||
}
|
||||
|
||||
printk("VM: killing process %s\n", current->comm);
|
||||
if (user_mode(regs))
|
||||
do_group_exit(SIGKILL);
|
||||
if (!user_mode(regs))
|
||||
goto no_context;
|
||||
pagefault_out_of_memory();
|
||||
return 0;
|
||||
|
||||
no_context:
|
||||
current->thread.signo = SIGBUS;
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/gfp.h>
|
||||
|
||||
#include <asm/setup.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
|
|
|||
|
|
@ -99,8 +99,7 @@ static inline void free_io_area(void *addr)
|
|||
#endif
|
||||
|
||||
/*
|
||||
* Map some physical address range into the kernel address space. The
|
||||
* code is copied and adapted from map_chunk().
|
||||
* Map some physical address range into the kernel address space.
|
||||
*/
|
||||
/* Rewritten by Andreas Schwab to remove all races. */
|
||||
|
||||
|
|
@ -116,7 +115,7 @@ void __iomem *__ioremap(unsigned long physaddr, unsigned long size, int cachefla
|
|||
/*
|
||||
* Don't allow mappings that wrap..
|
||||
*/
|
||||
if (!size || size > physaddr + size)
|
||||
if (!size || physaddr > (unsigned long)(-size))
|
||||
return NULL;
|
||||
|
||||
#ifdef CONFIG_AMIGA
|
||||
|
|
|
|||
|
|
@ -9,9 +9,9 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/pagemap.h>
|
||||
#include <linux/gfp.h>
|
||||
|
||||
#include <asm/setup.h>
|
||||
#include <asm/segment.h>
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/gfp.h>
|
||||
|
||||
#include <asm/setup.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
|
|
|||
|
|
@ -9,8 +9,6 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/miscdevice.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/smp_lock.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/capability.h>
|
||||
#include <linux/fcntl.h>
|
||||
|
|
@ -37,8 +35,7 @@ static const unsigned char days_in_mo[] =
|
|||
|
||||
static atomic_t rtc_ready = ATOMIC_INIT(1);
|
||||
|
||||
static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
static long rtc_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
volatile MK48T08ptr_t rtc = (MK48T08ptr_t)MVME_RTC_BASE;
|
||||
unsigned long flags;
|
||||
|
|
@ -121,22 +118,15 @@ static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
|
|||
}
|
||||
|
||||
/*
|
||||
* We enforce only one user at a time here with the open/close.
|
||||
* Also clear the previous interrupt data on an open, and clean
|
||||
* up things on a close.
|
||||
* We enforce only one user at a time here with the open/close.
|
||||
*/
|
||||
|
||||
static int rtc_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
lock_kernel();
|
||||
if( !atomic_dec_and_test(&rtc_ready) )
|
||||
{
|
||||
atomic_inc( &rtc_ready );
|
||||
unlock_kernel();
|
||||
return -EBUSY;
|
||||
}
|
||||
unlock_kernel();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -151,9 +141,9 @@ static int rtc_release(struct inode *inode, struct file *file)
|
|||
*/
|
||||
|
||||
static const struct file_operations rtc_fops = {
|
||||
.ioctl = rtc_ioctl,
|
||||
.open = rtc_open,
|
||||
.release = rtc_release,
|
||||
.unlocked_ioctl = rtc_ioctl,
|
||||
.open = rtc_open,
|
||||
.release = rtc_release,
|
||||
};
|
||||
|
||||
static struct miscdevice rtc_dev=
|
||||
|
|
|
|||
|
|
@ -126,7 +126,7 @@ static void q40_reset(void)
|
|||
{
|
||||
halted = 1;
|
||||
printk("\n\n*******************************************\n"
|
||||
"Called q40_reset : press the RESET button!! \n"
|
||||
"Called q40_reset : press the RESET button!!\n"
|
||||
"*******************************************\n");
|
||||
Q40_LED_ON();
|
||||
while (1)
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@
|
|||
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/list.h>
|
||||
|
||||
|
|
|
|||
|
|
@ -15,7 +15,6 @@
|
|||
#include <linux/bitops.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/vmalloc.h>
|
||||
|
||||
#include <asm/sun3x.h>
|
||||
|
|
|
|||
Loading…
Reference in a new issue