Commit 5d0d1d27 authored by David S. Miller's avatar David S. Miller

Merge davem@nuts.ninka.net:/home/davem/src/BK/sparc-2.5

into kernel.bkbits.net:/home/davem/sparc-2.5
parents 27d23d3f 996ec8c3
...@@ -583,10 +583,22 @@ static void sunsab_shutdown(struct uart_port *port) ...@@ -583,10 +583,22 @@ static void sunsab_shutdown(struct uart_port *port)
tmp &= ~SAB82532_MODE_RAC; tmp &= ~SAB82532_MODE_RAC;
writeb(tmp, &up->regs->rw.mode); writeb(tmp, &up->regs->rw.mode);
/*
* XXX FIXME
*
* If the chip is powered down here the system hangs/crashes during
* reboot or shutdown. This needs to be investigated further,
* similar behaviour occurs in 2.4 when the driver is configured
* as a module only. One hint may be that data is sometimes
* transmitted at 9600 baud during shutdown (regardless of the
* speed the chip was configured for when the port was open).
*/
#if 0
/* Power Down */ /* Power Down */
tmp = readb(&up->regs->rw.ccr0); tmp = readb(&up->regs->rw.ccr0);
tmp &= ~SAB82532_CCR0_PU; tmp &= ~SAB82532_CCR0_PU;
writeb(tmp, &up->regs->rw.ccr0); writeb(tmp, &up->regs->rw.ccr0);
#endif
spin_unlock_irqrestore(&up->port.lock, flags); spin_unlock_irqrestore(&up->port.lock, flags);
} }
......
...@@ -1036,91 +1036,69 @@ static void __init sunzilog_alloc_tables(void) ...@@ -1036,91 +1036,69 @@ static void __init sunzilog_alloc_tables(void)
/* We used to attempt to use the address property of the Zilog device node /* We used to attempt to use the address property of the Zilog device node
* but that totally is not necessary on sparc64. * but that totally is not necessary on sparc64.
*/ */
static struct zilog_layout * __init get_zs_sun4u(int chip, int node) static struct zilog_layout * __init get_zs_sun4u(int chip, int zsnode)
{ {
unsigned long mapped_addr = 0xdeadbeefUL; unsigned long mapped_addr;
unsigned int sun4u_ino; unsigned int sun4u_ino;
int zsnode, seen; struct sbus_bus *sbus = NULL;
struct sbus_dev *sdev = NULL;
zsnode = node; int err;
seen = 0;
while (zsnode) { if (central_bus == NULL) {
int slave; for_each_sbus(sbus) {
for_each_sbusdev(sdev, sbus) {
zsnode = prom_searchsiblings(zsnode, "zs"); if (sdev->prom_node == zsnode)
if (zsnode == 0 || zsnode == -1) goto found;
break;
slave = prom_getintdefault(zsnode, "slave", -1);
if ((slave == chip) || (seen == chip)) {
struct sbus_bus *sbus = NULL;
struct sbus_dev *sdev = NULL;
int err;
if (central_bus == NULL) {
for_each_sbus(sbus) {
for_each_sbusdev(sdev, sbus) {
if (sdev->prom_node == zsnode)
goto found;
}
}
}
found:
if (sdev == NULL && central_bus == NULL) {
prom_printf("SunZilog: sdev&&central == NULL for "
"Zilog %d in get_zs_sun4u.\n", chip);
prom_halt();
} }
if (central_bus == NULL) {
mapped_addr =
sbus_ioremap(&sdev->resource[0], 0,
PAGE_SIZE,
"Zilog Registers");
} else {
struct linux_prom_registers zsregs[1];
err = prom_getproperty(zsnode, "reg",
(char *) &zsregs[0],
sizeof(zsregs));
if (err == -1) {
prom_printf("SunZilog: Cannot map "
"Zilog %d regs on "
"central bus.\n", chip);
prom_halt();
}
apply_fhc_ranges(central_bus->child,
&zsregs[0], 1);
apply_central_ranges(central_bus, &zsregs[0], 1);
mapped_addr =
(((u64)zsregs[0].which_io)<<32UL) |
((u64)zsregs[0].phys_addr);
}
if (zilog_irq == -1) {
if (central_bus) {
unsigned long iclr, imap;
iclr = central_bus->child->fhc_regs.uregs
+ FHC_UREGS_ICLR;
imap = central_bus->child->fhc_regs.uregs
+ FHC_UREGS_IMAP;
zilog_irq = build_irq(12, 0, iclr, imap);
} else {
err = prom_getproperty(zsnode, "interrupts",
(char *) &sun4u_ino,
sizeof(sun4u_ino));
zilog_irq = sbus_build_irq(sbus_root, sun4u_ino);
}
}
break;
} }
zsnode = prom_getsibling(zsnode);
seen++;
} }
found:
if (zsnode == 0 || zsnode == -1) { if (sdev == NULL && central_bus == NULL) {
prom_printf("SunZilog: Cannot find Zilog %d in get_zs_sun4u.\n", chip); prom_printf("SunZilog: sdev&&central == NULL for "
"Zilog %d in get_zs_sun4u.\n", chip);
prom_halt(); prom_halt();
} }
if (central_bus == NULL) {
mapped_addr =
sbus_ioremap(&sdev->resource[0], 0,
PAGE_SIZE,
"Zilog Registers");
} else {
struct linux_prom_registers zsregs[1];
err = prom_getproperty(zsnode, "reg",
(char *) &zsregs[0],
sizeof(zsregs));
if (err == -1) {
prom_printf("SunZilog: Cannot map "
"Zilog %d regs on "
"central bus.\n", chip);
prom_halt();
}
apply_fhc_ranges(central_bus->child,
&zsregs[0], 1);
apply_central_ranges(central_bus, &zsregs[0], 1);
mapped_addr =
(((u64)zsregs[0].which_io)<<32UL) |
((u64)zsregs[0].phys_addr);
}
if (zilog_irq == -1) {
if (central_bus) {
unsigned long iclr, imap;
iclr = central_bus->child->fhc_regs.uregs
+ FHC_UREGS_ICLR;
imap = central_bus->child->fhc_regs.uregs
+ FHC_UREGS_IMAP;
zilog_irq = build_irq(12, 0, iclr, imap);
} else {
err = prom_getproperty(zsnode, "interrupts",
(char *) &sun4u_ino,
sizeof(sun4u_ino));
zilog_irq = sbus_build_irq(sbus_root, sun4u_ino);
}
}
return (struct zilog_layout *) mapped_addr; return (struct zilog_layout *) mapped_addr;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment