pmac_zilog: sleep fix
PATCH 1/1 pmac_zilog: sleep fix
Hi !
This patch fix a problem with semaphore usage on wakeup from sleep in pmac_zilog (crashing some laptops on wakeup). Please apply,
Ben.
===== drivers/serial/pmac_zilog.c 1.6 vs edited =====
drivers/serial/pmac_zilog.c +18 -4
@@ -1563,15 +1563,21 @@static int pmz_suspend (struct macio_dev *mdev,u32 pm_state) {struct uart_pmac_port *uap =dev_get_drvdata (&mdev->ofdev.dev); -struct uart_state *state = pmz_uart_reg.state + uap->port.line; +struct uart_state *state;unsigned long flags; -if (uap ==NULL ) +if (uap ==NULL ) { +printk ("HRM... pmz_suspend with NULL uap\n" );return 0 ; + }if (pm_state == mdev->ofdev.dev.power_state || pm_state <2 )return 0 ; +pmz_debug ("suspend, switching to state %d\n" , pm_state); + + state = pmz_uart_reg.state + uap->port.line; +down (&pmz_irq_sem);down (&state->sem);
@@ -1607,6 +1613,8 @@up (&state->sem);up (&pmz_irq_sem); +pmz_debug ("suspend, switching complete\n" ); + mdev->ofdev.dev.power_state = pm_state;return 0 ;
@@ -1616,7 +1624,7 @@static int pmz_resume (struct macio_dev *mdev) {struct uart_pmac_port *uap =dev_get_drvdata (&mdev->ofdev.dev); -struct uart_state *state = pmz_uart_reg.state + uap->port.line; +struct uart_state *state;unsigned long flags;int pwr_delay;
@@ -1626,6 +1634,10 @@if (mdev->ofdev.dev.power_state ==0 )return 0 ; +pmz_debug ("resume, switching to state 0\n" ); + + state = pmz_uart_reg.state + uap->port.line; +down (&pmz_irq_sem);down (&state->sem);
@@ -1658,6 +1670,7 @@enable_irq (uap->port.irq); } + bail:up (&state->sem);up (&pmz_irq_sem);
@@ -1670,7 +1683,8 @@schedule_timeout ((pwr_delay *HZ )/1000 ); } - bail: +pmz_debug ("resume, switching complete\n" ); + mdev->ofdev.dev.power_state =0 ;return 0 ;