Update of /cvsroot/linux-vax/kernel-2.4/arch/m68k/sun3x
In directory usw-pr-cvs1:/tmp/cvs-serv13561/m68k/sun3x
Modified Files:
Makefile config.c dvma.c time.c time.h
Added Files:
prom.c sun3x_ksyms.c
Removed Files:
sbus.c
Log Message:
synch 2.4.15 commit 37
--- NEW FILE ---
/* Prom access routines for the sun3x */
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/tty.h>
#include <linux/console.h>
#include <linux/init.h>
#include <linux/mm.h>
#include <linux/string.h>
#include <asm/page.h>
#include <asm/pgtable.h>
#include <asm/bootinfo.h>
#include <asm/setup.h>
#include <asm/traps.h>
#include <asm/sun3xprom.h>
#include <asm/idprom.h>
#include <asm/segment.h>
#include <asm/sun3ints.h>
#include <asm/openprom.h>
#include <asm/machines.h>
void (*sun3x_putchar)(int);
int (*sun3x_getchar)(void);
int (*sun3x_mayget)(void);
int (*sun3x_mayput)(int);
void (*sun3x_prom_reboot)(void);
e_vector sun3x_prom_abort;
struct idprom *idprom;
static struct idprom idprom_buffer;
struct linux_romvec *romvec;
/* prom vector table */
e_vector *sun3x_prom_vbr;
extern e_vector vectors[256]; /* arch/m68k/kernel/traps.c */
/* Handle returning to the prom */
void sun3x_halt(void)
{
unsigned long flags;
/* Disable interrupts while we mess with things */
save_flags(flags); cli();
/* Restore prom vbr */
__asm__ volatile ("movec %0,%%vbr" : : "r" ((void*)sun3x_prom_vbr));
/* Restore prom NMI clock */
// sun3x_disable_intreg(5);
sun3_enable_irq(7);
/* Let 'er rip */
__asm__ volatile ("trap #14" : : );
/* Restore everything */
sun3_disable_irq(7);
sun3_enable_irq(5);
__asm__ volatile ("movec %0,%%vbr" : : "r" ((void*)vectors));
restore_flags(flags);
}
void sun3x_reboot(void)
{
/* This never returns, don't bother saving things */
cli();
/* Restore prom vbr */
__asm__ volatile ("movec %0,%%vbr" : : "r" ((void*)sun3x_prom_vbr));
/* Restore prom NMI clock */
sun3_disable_irq(5);
sun3_enable_irq(7);
/* Let 'er rip */
(*romvec->pv_reboot)("vmlinux");
}
extern char m68k_debug_device[];
static void sun3x_prom_write(struct console *co, const char *s,
unsigned int count)
{
while (count--) {
if (*s == '\n')
sun3x_putchar('\r');
sun3x_putchar(*s++);
}
}
/* debug console - write-only */
static struct console sun3x_debug = {
"debug",
sun3x_prom_write, /* write */
NULL, /* read */
NULL, /* device */
NULL, /* wait_key */
NULL, /* unblank */
NULL, /* setup */
CON_PRINTBUFFER,
-1,
0,
NULL
};
void sun3x_prom_init(void)
{
/* Read the vector table */
int i;
sun3x_putchar = *(void (**)(int)) (SUN3X_P_PUTCHAR);
sun3x_getchar = *(int (**)(void)) (SUN3X_P_GETCHAR);
sun3x_mayget = *(int (**)(void)) (SUN3X_P_MAYGET);
sun3x_mayput = *(int (**)(int)) (SUN3X_P_MAYPUT);
sun3x_prom_reboot = *(void (**)(void)) (SUN3X_P_REBOOT);
sun3x_prom_abort = *(e_vector *) (SUN3X_P_ABORT);
romvec = (struct linux_romvec *)SUN3X_PROM_BASE;
/* make a copy of the idprom structure */
for(i = 0; i < sizeof(struct idprom); i++)
((unsigned char *)(&idprom_buffer))[i] = ((unsigned char *)SUN3X_IDPROM)[i];
idprom = &idprom_buffer;
if((idprom->id_machtype & SM_ARCH_MASK) != SM_SUN3X) {
printk("Warning: machine reports strange type %02x\n");
printk("Pretending it's a 3/80, but very afraid...\n");
idprom->id_machtype = SM_SUN3X | SM_3_80;
}
/* point trap #14 at abort.
* XXX this is futile since we restore the vbr first - oops
*/
vectors[VEC_TRAP14] = sun3x_prom_abort;
/* If debug=prom was specified, start the debug console */
if (!strcmp(m68k_debug_device, "prom"))
register_console(&sun3x_debug);
}
/* some prom functions to export */
int prom_getintdefault(int node, char *property, int deflt)
{
return deflt;
}
int prom_getbool (int node, char *prop)
{
return 1;
}
void prom_printf(char *fmt, ...)
{
}
void prom_halt (void)
{
sun3x_halt();
}
--- NEW FILE ---
#include <linux/module.h>
#include <linux/types.h>
#include <asm/dvma.h>
#include <asm/idprom.h>
/*
* Add things here when you find the need for it.
*/
EXPORT_SYMBOL(dvma_map_align);
EXPORT_SYMBOL(dvma_unmap);
EXPORT_SYMBOL(dvma_malloc_align);
EXPORT_SYMBOL(dvma_free);
EXPORT_SYMBOL(idprom);
Index: Makefile
===================================================================
RCS file: /cvsroot/linux-vax/kernel-2.4/arch/m68k/sun3x/Makefile,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -u -r1.1.1.1 -r1.2
--- Makefile 14 Jan 2001 19:42:03 -0000 1.1.1.1
+++ Makefile 10 Apr 2002 14:34:37 -0000 1.2
@@ -9,6 +9,6 @@
O_TARGET := sun3x.o
-obj-y := config.o time.o dvma.o sbus.o
+obj-y := config.o time.o dvma.o prom.o
include $(TOPDIR)/Rules.make
Index: config.c
===================================================================
RCS file: /cvsroot/linux-vax/kernel-2.4/arch/m68k/sun3x/config.c,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -u -r1.1.1.1 -r1.2
--- config.c 14 Jan 2001 19:42:03 -0000 1.1.1.1
+++ config.c 10 Apr 2002 14:34:38 -0000 1.2
@@ -14,39 +14,24 @@
#include <asm/system.h>
#include <asm/machdep.h>
#include <asm/irq.h>
-#include <asm/sun3x.h>
+#include <asm/sun3xprom.h>
+#include <asm/sun3ints.h>
+#include <asm/setup.h>
#include "time.h"
-static volatile unsigned char *sun3x_intreg = (unsigned char *)SUN3X_INTREG;
-extern int serial_console;
+volatile char *clock_va;
+extern volatile unsigned char *sun3_intreg;
-void sun3x_halt(void)
-{
- /* Disable interrupts */
- cli();
-
- /* we can't drop back to PROM, so we loop here */
- for (;;);
-}
-
-void sun3x_reboot(void)
-{
- /* This never returns, don't bother saving things */
- cli();
-
- /* no idea, whether this works */
- asm ("reset");
-}
int __init sun3x_keyb_init(void)
{
- return 0;
+ return 0;
}
int sun3x_kbdrate(struct kbd_repeat *r)
{
- return 0;
+ return 0;
}
void sun3x_kbd_leds(unsigned int i)
@@ -54,36 +39,15 @@
}
-static void sun3x_badint (int irq, void *dev_id, struct pt_regs *fp)
+void sun3_leds(unsigned int i)
{
- printk ("received spurious interrupt %d\n",irq);
- num_spurious += 1;
-}
-void (*sun3x_default_handler[SYS_IRQS])(int, void *, struct pt_regs *) = {
- sun3x_badint, sun3x_badint, sun3x_badint, sun3x_badint,
- sun3x_badint, sun3x_badint, sun3x_badint, sun3x_badint
-};
-
-void sun3x_enable_irq(unsigned int irq)
-{
- *sun3x_intreg |= (1 << irq);
}
-void sun3x_disable_irq(unsigned int irq)
+/* should probably detect types of these eventually. */
+static void sun3x_get_model(char *model)
{
- *sun3x_intreg &= ~(1 << irq);
-}
-
-void __init sun3x_init_IRQ(void)
-{
- /* disable all interrupts initially */
- *sun3x_intreg = 1; /* master enable only */
-}
-
-int sun3x_get_irq_list(char *buf)
-{
- return 0;
+ sprintf(model, "Sun3x");
}
/*
@@ -91,38 +55,51 @@
*/
void __init config_sun3x(void)
{
- mach_get_irq_list = sun3x_get_irq_list;
- mach_max_dma_address = 0xffffffff; /* we can DMA anywhere, whee */
- mach_keyb_init = sun3x_keyb_init;
- mach_kbdrate = sun3x_kbdrate;
- mach_kbd_leds = sun3x_kbd_leds;
-
- mach_sched_init = sun3x_sched_init;
- mach_init_IRQ = sun3x_init_IRQ;
- enable_irq = sun3x_enable_irq;
- disable_irq = sun3x_disable_irq;
- mach_request_irq = sys_request_irq;
- mach_free_irq = sys_free_irq;
- mach_default_handler = &sun3x_default_handler;
- mach_gettimeoffset = sun3x_gettimeoffset;
- mach_reset = sun3x_reboot;
+ sun3x_prom_init();
+
+ mach_get_irq_list = sun3_get_irq_list;
+ mach_max_dma_address = 0xffffffff; /* we can DMA anywhere, whee */
- mach_gettod = sun3x_gettod;
+ mach_keyb_init = sun3x_keyb_init;
+ mach_kbdrate = sun3x_kbdrate;
+ mach_kbd_leds = sun3x_kbd_leds;
+
+ mach_default_handler = &sun3_default_handler;
+ mach_sched_init = sun3x_sched_init;
+ mach_init_IRQ = sun3_init_IRQ;
+ enable_irq = sun3_enable_irq;
+ disable_irq = sun3_disable_irq;
+ mach_request_irq = sun3_request_irq;
+ mach_free_irq = sun3_free_irq;
+ mach_process_int = sun3_process_int;
- switch (*(unsigned char *)SUN3X_EEPROM_CONS) {
+ mach_gettimeoffset = sun3x_gettimeoffset;
+ mach_reset = sun3x_reboot;
+
+ mach_gettod = sun3x_gettod;
+ mach_hwclk = sun3x_hwclk;
+ mach_get_model = sun3x_get_model;
+
+ sun3_intreg = (unsigned char *)SUN3X_INTREG;
+
+ /* only the serial console is known to work anyway... */
+#if 0
+ switch (*(unsigned char *)SUN3X_EEPROM_CONS) {
case 0x10:
- serial_console = 1;
- conswitchp = NULL;
- break;
+ serial_console = 1;
+ conswitchp = NULL;
+ break;
case 0x11:
- serial_console = 2;
- conswitchp = NULL;
- break;
+ serial_console = 2;
+ conswitchp = NULL;
+ break;
default:
- serial_console = 0;
- conswitchp = &dummy_con;
- break;
- }
+ serial_console = 0;
+ conswitchp = &dummy_con;
+ break;
+ }
+#endif
}
+
Index: dvma.c
===================================================================
RCS file: /cvsroot/linux-vax/kernel-2.4/arch/m68k/sun3x/dvma.c,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -u -r1.1.1.1 -r1.2
--- dvma.c 14 Jan 2001 19:42:04 -0000 1.1.1.1
+++ dvma.c 10 Apr 2002 14:34:38 -0000 1.2
@@ -2,21 +2,31 @@
* Virtual DMA allocation
*
* (C) 1999 Thomas Bogendoerfer (tsb...@al...)
+ *
+ * 11/26/2000 -- disabled the existing code because it didn't work for
+ * me in 2.4. Replaced with a significantly more primitive version
+ * similar to the sun3 code. the old functionality was probably more
+ * desirable, but.... -- Sam Creasey (sa...@oh...)
+ *
*/
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/bitops.h>
#include <linux/mm.h>
+#include <linux/bootmem.h>
+#include <linux/slab.h>
+#include <linux/vmalloc.h>
#include <asm/sun3x.h>
#include <asm/dvma.h>
#include <asm/io.h>
#include <asm/page.h>
+#include <asm/pgtable.h>
+#include <asm/pgalloc.h>
/* IOMMU support */
-#define IOMMU_ENTRIES 2048
#define IOMMU_ADDR_MASK 0x03ffe000
#define IOMMU_CACHE_INHIBIT 0x00000040
#define IOMMU_FULL_BLOCK 0x00000020
@@ -28,135 +38,170 @@
#define IOMMU_DT_VALID 0x00000001
#define IOMMU_DT_BAD 0x00000002
-#define DVMA_PAGE_SHIFT 13
-#define DVMA_PAGE_SIZE (1UL << DVMA_PAGE_SHIFT)
-#define DVMA_PAGE_MASK (~(DVMA_PAGE_SIZE-1))
-
static volatile unsigned long *iommu_pte = (unsigned long *)SUN3X_IOMMU;
-static unsigned long iommu_use[IOMMU_ENTRIES];
-static unsigned long iommu_bitmap[IOMMU_ENTRIES/32];
#define dvma_entry_paddr(index) (iommu_pte[index] & IOMMU_ADDR_MASK)
#define dvma_entry_vaddr(index,paddr) ((index << DVMA_PAGE_SHIFT) | \
(paddr & (DVMA_PAGE_SIZE-1)))
+#if 0
+#define dvma_entry_set(index,addr) (iommu_pte[index] = \
+ (addr & IOMMU_ADDR_MASK) | \
+ IOMMU_DT_VALID | IOMMU_CACHE_INHIBIT)
+#else
#define dvma_entry_set(index,addr) (iommu_pte[index] = \
(addr & IOMMU_ADDR_MASK) | \
IOMMU_DT_VALID)
+#endif
#define dvma_entry_clr(index) (iommu_pte[index] = IOMMU_DT_INVALID)
-#define dvma_entry_use(index) (iommu_use[index])
-#define dvma_entry_inc(index) (iommu_use[index]++)
-#define dvma_entry_dec(index) (iommu_use[index]--)
#define dvma_entry_hash(addr) ((addr >> DVMA_PAGE_SHIFT) ^ \
((addr & 0x03c00000) >> \
(DVMA_PAGE_SHIFT+4)))
-#define dvma_map iommu_bitmap
-#define dvma_map_size (IOMMU_ENTRIES/2)
-#define dvma_slow_offset (IOMMU_ENTRIES/2)
-#define dvma_is_slow(addr) ((addr) & \
- (dvma_slow_offset << DVMA_PAGE_SHIFT))
-static int fixed_dvma;
+#undef DEBUG
-void __init dvma_init(void)
+#ifdef DEBUG
+/* code to print out a dvma mapping for debugging purposes */
+void dvma_print (unsigned long dvma_addr)
{
- unsigned long tmp;
- if ((unsigned long)high_memory < (IOMMU_ENTRIES << DVMA_PAGE_SHIFT)) {
- printk ("Sun3x fixed DVMA mapping\n");
- fixed_dvma = 1;
- for (tmp = 0; tmp < (unsigned long)high_memory; tmp += DVMA_PAGE_SIZE)
- dvma_entry_set (tmp >> DVMA_PAGE_SHIFT, virt_to_phys((void *)tmp));
- fixed_dvma = 1;
- } else {
- printk ("Sun3x variable DVMA mapping\n");
- for (tmp = 0; tmp < IOMMU_ENTRIES; tmp++)
- dvma_entry_clr (tmp);
- fixed_dvma = 0;
- }
+ unsigned long index;
+
+ index = dvma_addr >> DVMA_PAGE_SHIFT;
+
+ printk("idx %lx dvma_addr %08lx paddr %08lx\n", index, dvma_addr,
+ dvma_entry_paddr(index));
+
+
}
+#endif
-unsigned long dvma_slow_alloc (unsigned long paddr, int npages)
+
+/* create a virtual mapping for a page assigned within the IOMMU
+ so that the cpu can reach it easily */
+inline int dvma_map_cpu(unsigned long kaddr,
+ unsigned long vaddr, int len)
{
- int scan, base;
-
- scan = 0;
- for (;;) {
- scan = find_next_zero_bit(dvma_map, dvma_map_size, scan);
- if ((base = scan) + npages > dvma_map_size) {
- printk ("dvma_slow_alloc failed for %d pages\n",npages);
- return 0;
- }
- for (;;) {
- if (scan >= base + npages) goto found;
- if (test_bit(scan, dvma_map)) break;
- scan++;
- }
- }
+ pgd_t *pgd;
+ unsigned long end;
+ int ret = 0;
+
+ kaddr &= PAGE_MASK;
+ vaddr &= PAGE_MASK;
+
+ end = PAGE_ALIGN(vaddr + len);
+
+#ifdef DEBUG
+ printk("dvma: mapping kern %08lx to virt %08lx\n",
+ kaddr, vaddr);
+#endif
+ pgd = pgd_offset_k(vaddr);
+
+ do {
+ pmd_t *pmd;
+ unsigned long end2;
+
+ if((pmd = pmd_alloc_kernel(pgd, vaddr)) == NULL) {
+ ret = -ENOMEM;
+ goto out;
+ }
+
+ if((end & PGDIR_MASK) > (vaddr & PGDIR_MASK))
+ end2 = (vaddr + (PGDIR_SIZE-1)) & PGDIR_MASK;
+ else
+ end2 = end;
+
+ do {
+ pte_t *pte;
+ unsigned long end3;
+
+ if((pte = pte_alloc_kernel(pmd, vaddr)) == NULL) {
+ ret = -ENOMEM;
+ goto out;
+ }
+
+ if((end2 & PMD_MASK) > (vaddr & PMD_MASK))
+ end3 = (vaddr + (PMD_SIZE-1)) & PMD_MASK;
+ else
+ end3 = end2;
+
+ do {
+#ifdef DEBUG
+ printk("mapping %08lx phys to %08lx\n",
+ __pa(kaddr), vaddr);
+#endif
+ set_pte(pte, __mk_pte(kaddr, PAGE_KERNEL));
+ pte++;
+ kaddr += PAGE_SIZE;
+ vaddr += PAGE_SIZE;
+ } while(vaddr < end3);
+
+ } while(vaddr < end2);
+
+ } while(vaddr < end);
+
+ flush_tlb_all();
-found:
- for (scan = base; scan < base+npages; scan++) {
- dvma_entry_set(scan+dvma_slow_offset, paddr);
- paddr += DVMA_PAGE_SIZE;
- set_bit(scan, dvma_map);
- }
- return (dvma_entry_vaddr((base+dvma_slow_offset),paddr));
+ out:
+ return ret;
}
-unsigned long dvma_alloc (unsigned long paddr, unsigned long size)
+
+inline int dvma_map_iommu(unsigned long kaddr, unsigned long baddr,
+ int len)
{
- int index;
- int pages = ((paddr & ~DVMA_PAGE_MASK) + size + (DVMA_PAGE_SIZE-1)) >>
- DVMA_PAGE_SHIFT;
-
- if (fixed_dvma)
- return ((unsigned long)phys_to_virt (paddr));
-
- if (pages > 1) /* multi page, allocate from slow pool */
- return dvma_slow_alloc (paddr, pages);
-
- index = dvma_entry_hash (paddr);
-
- if (dvma_entry_use(index)) {
- if (dvma_entry_paddr(index) == (paddr & DVMA_PAGE_MASK)) {
- dvma_entry_inc(index);
- return dvma_entry_vaddr(index,paddr);
+ unsigned long end, index;
+
+ index = baddr >> DVMA_PAGE_SHIFT;
+ end = ((baddr+len) >> DVMA_PAGE_SHIFT);
+
+ if(len & ~DVMA_PAGE_MASK)
+ end++;
+
+ for(; index < end ; index++) {
+// if(dvma_entry_use(index))
+// BUG();
+// printk("mapping pa %lx to ba %lx\n", __pa(kaddr), index << DVMA_PAGE_SHIFT);
+
+ dvma_entry_set(index, __pa(kaddr));
+
+ iommu_pte[index] |= IOMMU_FULL_BLOCK;
+// dvma_entry_inc(index);
+
+ kaddr += DVMA_PAGE_SIZE;
}
- /* collision, allocate from slow pool */
- return dvma_slow_alloc (paddr, pages);
- }
-
- dvma_entry_set(index,paddr);
- dvma_entry_inc(index);
- return dvma_entry_vaddr(index,paddr);
+
+#ifdef DEBUG
+ for(index = (baddr >> DVMA_PAGE_SHIFT); index < end; index++)
+ dvma_print(index << DVMA_PAGE_SHIFT);
+#endif
+ return 0;
+
}
-void dvma_free (unsigned long dvma_addr, unsigned long size)
+void dvma_unmap_iommu(unsigned long baddr, int len)
{
- int npages;
- int index;
-
- if (fixed_dvma)
- return;
-
- if (!dvma_is_slow(dvma_addr)) {
- index = (dvma_addr >> DVMA_PAGE_SHIFT);
- if (dvma_entry_use(index) == 0) {
- printk ("dvma_free: %lx entry already free\n",dvma_addr);
- return;
+
+ int index, end;
+
+
+ index = baddr >> DVMA_PAGE_SHIFT;
+ end = (DVMA_PAGE_ALIGN(baddr+len) >> DVMA_PAGE_SHIFT);
+
+ for(; index < end ; index++) {
+#ifdef DEBUG
+ printk("freeing bus mapping %08x\n", index << DVMA_PAGE_SHIFT);
+#endif
+#if 0
+ if(!dvma_entry_use(index))
+ printk("dvma_unmap freeing unused entry %04x\n",
+ index);
+ else
+ dvma_entry_dec(index);
+#endif
+ dvma_entry_clr(index);
}
- dvma_entry_dec(index);
- if (dvma_entry_use(index) == 0)
- dvma_entry_clr(index);
- return;
- }
-
- /* free in slow pool */
- npages = ((dvma_addr & ~DVMA_PAGE_MASK) + size + (DVMA_PAGE_SIZE-1)) >>
- DVMA_PAGE_SHIFT;
- for (index = (dvma_addr >> DVMA_PAGE_SHIFT); npages--; index++) {
- dvma_entry_clr(index);
- clear_bit (index,dvma_map);
- }
+
}
+
Index: time.c
===================================================================
RCS file: /cvsroot/linux-vax/kernel-2.4/arch/m68k/sun3x/time.c,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -u -r1.1.1.1 -r1.2
--- time.c 14 Jan 2001 19:42:04 -0000 1.1.1.1
+++ time.c 10 Apr 2002 14:34:38 -0000 1.2
@@ -5,6 +5,7 @@
*/
#include <linux/types.h>
+#include <linux/kd.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/kernel_stat.h>
@@ -15,6 +16,8 @@
#include <asm/system.h>
#include <asm/traps.h>
#include <asm/sun3x.h>
+#include <asm/sun3ints.h>
+#include <asm/rtc.h>
#include "time.h"
@@ -33,6 +36,7 @@
#define C_CALIB 0x1f
#define BCD_TO_BIN(val) (((val)&15) + ((val)>>4)*10)
+#define BIN_TO_BCD(val) (((val/10) << 4) | (val % 10))
/* Read the Mostek */
void sun3x_gettod (int *yearp, int *monp, int *dayp,
@@ -45,7 +49,7 @@
/* Read values */
*yearp = BCD_TO_BIN(*(eeprom + M_YEAR));
- *monp = BCD_TO_BIN(*(eeprom + M_MONTH));
+ *monp = BCD_TO_BIN(*(eeprom + M_MONTH)) +1;
*dayp = BCD_TO_BIN(*(eeprom + M_DATE));
*hourp = BCD_TO_BIN(*(eeprom + M_HOUR));
*minp = BCD_TO_BIN(*(eeprom + M_MIN));
@@ -55,6 +59,40 @@
*(eeprom + M_CONTROL) &= ~C_READ;
}
+int sun3x_hwclk(int set, struct hwclk_time *t)
+{
+ volatile struct mostek_dt *h =
+ (unsigned char *)(SUN3X_EEPROM+M_CONTROL);
+ unsigned long flags;
+
+ save_and_cli(flags);
+
+ if(set) {
+ h->csr |= C_WRITE;
+ h->sec = BIN_TO_BCD(t->sec);
+ h->min = BIN_TO_BCD(t->min);
+ h->hour = BIN_TO_BCD(t->hour);
+ h->wday = BIN_TO_BCD(t->wday);
+ h->mday = BIN_TO_BCD(t->day);
+ h->month = BIN_TO_BCD(t->mon);
+ h->year = BIN_TO_BCD(t->year);
+ h->csr &= ~C_WRITE;
+ } else {
+ h->csr |= C_READ;
+ t->sec = BCD_TO_BIN(h->sec);
+ t->min = BCD_TO_BIN(h->min);
+ t->hour = BCD_TO_BIN(h->hour);
+ t->wday = BCD_TO_BIN(h->wday);
+ t->day = BCD_TO_BIN(h->mday);
+ t->mon = BCD_TO_BIN(h->month);
+ t->year = BCD_TO_BIN(h->year);
+ h->csr &= ~C_READ;
+ }
+
+ restore_flags(flags);
+
+ return 0;
+}
/* Not much we can do here */
unsigned long sun3x_gettimeoffset (void)
{
@@ -74,9 +112,12 @@
void __init sun3x_sched_init(void (*vector)(int, void *, struct pt_regs *))
{
- sys_request_irq(5, sun3x_timer_tick, IRQ_FLG_STD, "timer tick", vector);
+
+ sun3_disable_interrupts();
+
/* Pulse enable low to get the clock started */
- disable_irq(5);
- enable_irq(5);
+ sun3_disable_irq(5);
+ sun3_enable_irq(5);
+ sun3_enable_interrupts();
}
Index: time.h
===================================================================
RCS file: /cvsroot/linux-vax/kernel-2.4/arch/m68k/sun3x/time.h,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -u -r1.1.1.1 -r1.2
--- time.h 14 Jan 2001 19:42:04 -0000 1.1.1.1
+++ time.h 10 Apr 2002 14:34:38 -0000 1.2
@@ -1,9 +1,21 @@
#ifndef SUN3X_TIME_H
#define SUN3X_TIME_H
-void sun3x_gettod (int *yearp, int *monp, int *dayp,
+extern void sun3x_gettod (int *yearp, int *monp, int *dayp,
int *hourp, int *minp, int *secp);
+extern int sun3x_hwclk(int set, struct hwclk_time *t);
unsigned long sun3x_gettimeoffset (void);
void sun3x_sched_init(void (*vector)(int, void *, struct pt_regs *));
+
+struct mostek_dt {
+ volatile unsigned char csr;
+ volatile unsigned char sec;
+ volatile unsigned char min;
+ volatile unsigned char hour;
+ volatile unsigned char wday;
+ volatile unsigned char mday;
+ volatile unsigned char month;
+ volatile unsigned char year;
+};
#endif
--- sbus.c DELETED ---
|