Skip to content

Commit

Permalink
Porting HTC's msm_serial changes (should hopefully get rid of the msm…
Browse files Browse the repository at this point in the history
…_serial_hs wakelock)
  • Loading branch information
ginkel committed Apr 6, 2012
1 parent 0e40795 commit 80a438c
Show file tree
Hide file tree
Showing 4 changed files with 2,517 additions and 12 deletions.
1 change: 1 addition & 0 deletions drivers/tty/serial/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ obj-$(CONFIG_SERIAL_ATMEL) += atmel_serial.o
obj-$(CONFIG_SERIAL_UARTLITE) += uartlite.o
obj-$(CONFIG_SERIAL_MSM) += msm_serial.o
obj-$(CONFIG_SERIAL_MSM_HS) += msm_serial_hs.o
obj-$(CONFIG_SERIAL_MSM_HS) += msm_serial_hs_brcm.o
obj-$(CONFIG_SERIAL_MSM_HS_IMC) += msm_serial_hs_imc.o
obj-$(CONFIG_SERIAL_MSM_HSL) += msm_serial_hs_lite.o
obj-$(CONFIG_MSM_SERIAL_DEBUGGER) += msm_serial_debugger.o
Expand Down
47 changes: 45 additions & 2 deletions drivers/tty/serial/msm_serial_hs.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
* MSM 7k High speed uart driver
*
* Copyright (c) 2008 Google Inc.
* Copyright (c) 2007-2012, Code Aurora Forum. All rights reserved.
* Copyright (c) 2007-2011, Code Aurora Forum. All rights reserved.
* Modified: Nick Pelly <npelly@google.com>
*
* All source code in this file is licensed under the following license
Expand Down Expand Up @@ -658,6 +658,7 @@ static void msm_hs_set_termios(struct uart_port *uport,
struct msm_hs_port *msm_uport = UARTDM_TO_MSM(uport);

spin_lock_irqsave(&uport->lock, flags);
clk_enable(msm_uport->clk);

/*
* Disable Rx channel of UARTDM
Expand Down Expand Up @@ -765,7 +766,9 @@ static void msm_hs_set_termios(struct uart_port *uport,
}

msm_hs_write(uport, UARTDM_IMR_ADDR, msm_uport->imr_reg);
/* calling other hardware component here clk_disable API. */
mb();
clk_disable(msm_uport->clk);
spin_unlock_irqrestore(&uport->lock, flags);
}

Expand All @@ -777,11 +780,16 @@ unsigned int msm_hs_tx_empty(struct uart_port *uport)
{
unsigned int data;
unsigned int ret = 0;
struct msm_hs_port *msm_uport = UARTDM_TO_MSM(uport);

clk_enable(msm_uport->clk);

data = msm_hs_read(uport, UARTDM_SR_ADDR);
if (data & UARTDM_SR_TXEMT_BMSK)
ret = TIOCSER_TEMT;

clk_disable(msm_uport->clk);

return ret;
}
EXPORT_SYMBOL(msm_hs_tx_empty);
Expand Down Expand Up @@ -811,6 +819,8 @@ static void msm_hs_stop_rx_locked(struct uart_port *uport)
struct msm_hs_port *msm_uport = UARTDM_TO_MSM(uport);
unsigned int data;

clk_enable(msm_uport->clk);

/* disable dlink */
data = msm_hs_read(uport, UARTDM_DMEN_ADDR);
data &= ~UARTDM_RX_DM_EN_BMSK;
Expand All @@ -827,6 +837,8 @@ static void msm_hs_stop_rx_locked(struct uart_port *uport)
}
if (msm_uport->rx.flush != FLUSH_SHUTDOWN)
msm_uport->rx.flush = FLUSH_STOP;

clk_disable(msm_uport->clk);
}

/* Transmit the next chunk of data */
Expand Down Expand Up @@ -1001,6 +1013,7 @@ static void msm_serial_hs_rx_tlet(unsigned long tlet_ptr)

spin_lock_irqsave(&uport->lock, flags);

clk_enable(msm_uport->clk);
msm_hs_write(uport, UARTDM_CR_ADDR, STALE_EVENT_DISABLE);

/* overflow is not connect to data in a FIFO */
Expand Down Expand Up @@ -1074,6 +1087,7 @@ static void msm_serial_hs_rx_tlet(unsigned long tlet_ptr)
schedule_delayed_work(&msm_uport->rx.flip_insert_work
, msecs_to_jiffies(RETRY_TIMEOUT));
}
clk_disable(msm_uport->clk);
/* release wakelock in 500ms, not immediately, because higher layers
* don't always take wakelocks when they should */
wake_lock_timeout(&msm_uport->rx.wake_lock, HZ / 2);
Expand All @@ -1088,11 +1102,15 @@ static void msm_hs_start_tx_locked(struct uart_port *uport )
{
struct msm_hs_port *msm_uport = UARTDM_TO_MSM(uport);

clk_enable(msm_uport->clk);

if (msm_uport->tx.tx_ready_int_en == 0) {
msm_uport->tx.tx_ready_int_en = 1;
if (msm_uport->tx.dma_in_flight == 0)
msm_hs_submit_tx_locked(uport);
}

clk_disable(msm_uport->clk);
}

/*
Expand Down Expand Up @@ -1122,12 +1140,14 @@ static void msm_serial_hs_tx_tlet(unsigned long tlet_ptr)
tlet_ptr, struct msm_hs_port, tx.tlet);

spin_lock_irqsave(&(msm_uport->uport.lock), flags);
clk_enable(msm_uport->clk);

msm_uport->imr_reg |= UARTDM_ISR_TX_READY_BMSK;
msm_hs_write(&(msm_uport->uport), UARTDM_IMR_ADDR, msm_uport->imr_reg);
/* Calling clk API. Hence mb() requires. */
mb();

clk_disable(msm_uport->clk);
spin_unlock_irqrestore(&(msm_uport->uport.lock), flags);
}

Expand Down Expand Up @@ -1180,6 +1200,9 @@ void msm_hs_set_mctrl_locked(struct uart_port *uport,
{
unsigned int set_rts;
unsigned int data;
struct msm_hs_port *msm_uport = UARTDM_TO_MSM(uport);

clk_enable(msm_uport->clk);

/* RTS is active low */
set_rts = TIOCM_RTS & mctrl ? 0 : 1;
Expand All @@ -1196,7 +1219,9 @@ void msm_hs_set_mctrl_locked(struct uart_port *uport,
data |= UARTDM_MR1_RX_RDY_CTL_BMSK;
msm_hs_write(uport, UARTDM_MR1_ADDR, data);
}
/* Calling CLOCK API. Hence mb() requires. */
mb();
clk_disable(msm_uport->clk);
}

void msm_hs_set_mctrl(struct uart_port *uport,
Expand All @@ -1215,11 +1240,16 @@ static void msm_hs_enable_ms_locked(struct uart_port *uport)
{
struct msm_hs_port *msm_uport = UARTDM_TO_MSM(uport);

clk_enable(msm_uport->clk);

/* Enable DELTA_CTS Interrupt */
msm_uport->imr_reg |= UARTDM_ISR_DELTA_CTS_BMSK;
msm_hs_write(uport, UARTDM_IMR_ADDR, msm_uport->imr_reg);
/* Calling CLOCK API. Hence mb() requires here. */
mb();

clk_disable(msm_uport->clk);

}

/*
Expand All @@ -1231,10 +1261,14 @@ static void msm_hs_enable_ms_locked(struct uart_port *uport)
static void msm_hs_break_ctl(struct uart_port *uport, int ctl)
{
unsigned long flags;
struct msm_hs_port *msm_uport = UARTDM_TO_MSM(uport);

spin_lock_irqsave(&uport->lock, flags);
clk_enable(msm_uport->clk);
msm_hs_write(uport, UARTDM_CR_ADDR, ctl ? START_BREAK : STOP_BREAK);
/* Calling CLOCK API. Hence mb() requires here. */
mb();
clk_disable(msm_uport->clk);
spin_unlock_irqrestore(&uport->lock, flags);
}

Expand Down Expand Up @@ -1263,12 +1297,18 @@ static void msm_hs_config_port(struct uart_port *uport, int cfg_flags)
/* Handle CTS changes (Called from interrupt handler) */
static void msm_hs_handle_delta_cts_locked(struct uart_port *uport)
{
struct msm_hs_port *msm_uport = UARTDM_TO_MSM(uport);

clk_enable(msm_uport->clk);

/* clear interrupt */
msm_hs_write(uport, UARTDM_CR_ADDR, RESET_CTS);
/* Calling CLOCK API. Hence mb() requires here. */
mb();
uport->icount.cts++;

clk_disable(msm_uport->clk);

/* clear the IOCTL TIOCMIWAIT if called */
wake_up_interruptible(&uport->state->port.delta_msr_wait);
}
Expand Down Expand Up @@ -1832,7 +1872,7 @@ static int __init msm_hs_probe(struct platform_device *pdev)
if (pdata == NULL)
msm_uport->wakeup.irq = -1;
else {
msm_uport->wakeup.irq = pdata->wakeup_irq;
msm_uport->wakeup.irq = pdata->rx_wakeup_irq;
msm_uport->wakeup.ignore = 1;
msm_uport->wakeup.inject_rx = pdata->inject_rx_on_wakeup;
msm_uport->wakeup.rx_to_inject = pdata->rx_to_inject;
Expand Down Expand Up @@ -1961,6 +2001,8 @@ static void msm_hs_shutdown(struct uart_port *uport)
tasklet_kill(&msm_uport->rx.tlet);
cancel_delayed_work_sync(&msm_uport->rx.flip_insert_work);

clk_enable(msm_uport->clk);

pm_runtime_disable(uport->dev);
pm_runtime_set_suspended(uport->dev);

Expand All @@ -1978,6 +2020,7 @@ static void msm_hs_shutdown(struct uart_port *uport)
*/
mb();

clk_disable(msm_uport->clk); /* to balance local clk_enable() */
if (msm_uport->clk_state != MSM_HS_CLK_OFF) {
clk_disable(msm_uport->clk); /* to balance clk_state */
if (msm_uport->pclk)
Expand Down
Loading

0 comments on commit 80a438c

Please sign in to comment.