patch-2.4.6 linux/drivers/macintosh/macserial.c
Next file: linux/drivers/macintosh/macserial.h
Previous file: linux/drivers/macintosh/mac_keyb.c
Back to the patch index
Back to the overall index
- Lines: 143
- Date:
Wed Jun 27 13:37:35 2001
- Orig file:
v2.4.5/linux/drivers/macintosh/macserial.c
- Orig date:
Sun Feb 4 10:21:25 2001
diff -u --recursive --new-file v2.4.5/linux/drivers/macintosh/macserial.c linux/drivers/macintosh/macserial.c
@@ -448,7 +448,7 @@
goto out;
info->tx_active = 0;
- if (info->x_char) {
+ if (info->x_char && !info->power_wait) {
/* Send next char */
write_zsdata(info->zs_channel, info->x_char);
info->x_char = 0;
@@ -456,7 +456,8 @@
goto out;
}
- if ((info->xmit_cnt <= 0) || info->tty->stopped || info->tx_stopped) {
+ if ((info->xmit_cnt <= 0) || info->tty->stopped || info->tx_stopped
+ || info->power_wait) {
write_zsreg(info->zs_channel, 0, RES_Tx_P);
goto out;
}
@@ -474,6 +475,14 @@
restore_flags(flags);
}
+static void powerup_done(unsigned long data)
+{
+ struct mac_serial *info = (struct mac_serial *) data;
+
+ info->power_wait = 0;
+ transmit_chars(info);
+}
+
static _INLINE_ void status_handle(struct mac_serial *info)
{
unsigned char status;
@@ -730,7 +739,7 @@
}
}
-static int startup(struct mac_serial * info, int can_sleep)
+static int startup(struct mac_serial * info)
{
int delay;
@@ -753,6 +762,18 @@
setup_scc(info);
+ if (delay) {
+ unsigned long flags;
+
+ /* delay is in ms */
+ save_flags(flags);
+ cli();
+ info->power_wait = 1;
+ mod_timer(&info->powerup_timer,
+ jiffies + (delay * HZ + 999) / 1000);
+ restore_flags(flags);
+ }
+
OPNDBG("enabling IRQ on ttyS%d (irq %d)...\n", info->line, info->irq);
info->flags |= ZILOG_INITIALIZED;
@@ -761,15 +782,6 @@
enable_irq(info->rx_dma_irq);
}
- if (delay) {
- if (can_sleep) {
- /* we need to wait a bit before using the port */
- current->state = TASK_INTERRUPTIBLE;
- schedule_timeout(delay * HZ / 1000);
- } else
- mdelay(delay);
- }
-
return 0;
}
@@ -863,7 +875,7 @@
queue_task(&tty->flip.tqueue, &tq_timer);
}
-static void poll_rxdma(void *private_)
+static void poll_rxdma(unsigned long private_)
{
struct mac_serial *info = (struct mac_serial *) private_;
unsigned long flags;
@@ -2325,7 +2337,7 @@
* Start up serial port
*/
- retval = startup(info, 1);
+ retval = startup(info);
if (retval)
return retval;
@@ -2426,6 +2438,10 @@
zss->rx_dma_irq = ch->intrs[2].line;
spin_lock_init(&zss->rx_dma_lock);
}
+
+ init_timer(&zss->powerup_timer);
+ zss->powerup_timer.function = powerup_done;
+ zss->powerup_timer.data = (unsigned long) zss;
}
/* Ask the PROM how many Z8530s we have and initialize their zs_channels */
@@ -2680,14 +2696,7 @@
return 0;
}
-#ifdef MODULE
-int init_module(void)
-{
- macserial_init();
- return 0;
-}
-
-void cleanup_module(void)
+void macserial_cleanup(void)
{
int i;
unsigned long flags;
@@ -2717,7 +2726,9 @@
pmu_unregister_sleep_notifier(&serial_sleep_notifier);
#endif /* CONFIG_PMAC_PBOOK */
}
-#endif /* MODULE */
+
+module_init(macserial_init);
+module_exit(macserial_cleanup);
#if 0
/*
@@ -3119,7 +3130,7 @@
struct mac_serial *info = &zs_soft[i];
if (info->flags & ZILOG_SLEEPING) {
info->flags &= ~ZILOG_SLEEPING;
- startup(info, 0);
+ startup(info);
}
}
break;
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)