Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 95d9b560 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm_serial_hs: Complete resource disable sequence before enable"

parents 6db24fdc dde1d96a
Loading
Loading
Loading
Loading
+18 −7
Original line number Diff line number Diff line
@@ -349,6 +349,7 @@ static int msm_hs_clock_vote(struct msm_hs_port *msm_uport)
					"%s: Could not turn on pclk [%d]\n",
					__func__, rc);
				mutex_unlock(&msm_uport->clk_mutex);
				atomic_dec_return(&msm_uport->clk_count);
				return rc;
			}
		}
@@ -360,6 +361,7 @@ static int msm_hs_clock_vote(struct msm_hs_port *msm_uport)
				__func__, rc);
			clk_disable_unprepare(msm_uport->pclk);
			mutex_unlock(&msm_uport->clk_mutex);
			atomic_dec_return(&msm_uport->clk_count);
			return rc;
		}
		msm_uport->clk_state = MSM_HS_CLK_ON;
@@ -2257,13 +2259,25 @@ void msm_hs_request_clock_on(struct uart_port *uport)
	unsigned long flags;
	unsigned int data;
	int ret = 0;
	int cur_clk_state;

	/*
	 * cancel the hrtimer first so that
	 * clk_state can not change in flight
	 */
	hrtimer_cancel(&msm_uport->clk_off_timer);
	flush_work(&msm_uport->clock_off_w);
	cur_clk_state = msm_uport->clk_state;
	msm_hs_clock_vote(msm_uport);
	mutex_lock(&msm_uport->clk_mutex);
	spin_lock_irqsave(&uport->lock, flags);

	if (msm_uport->clk_state == MSM_HS_CLK_REQUEST_OFF)
	if (cur_clk_state == MSM_HS_CLK_REQUEST_OFF) {
		msm_uport->clk_state = MSM_HS_CLK_ON;
		msm_hs_enable_flow_control(uport);
	switch (msm_uport->clk_state) {
	}

	switch (cur_clk_state) {
	case MSM_HS_CLK_OFF:
		wake_lock(&msm_uport->dma_wake_lock);
		if (use_low_power_wakeup(msm_uport)) {
@@ -2272,20 +2286,18 @@ void msm_hs_request_clock_on(struct uart_port *uport)
			enable_irq(uport->irq);
		}
		spin_unlock_irqrestore(&uport->lock, flags);

		mutex_unlock(&msm_uport->clk_mutex);
		ret = msm_hs_clock_vote(msm_uport);
		mutex_lock(&msm_uport->clk_mutex);
		spin_lock_irqsave(&uport->lock, flags);
		if (ret) {
			MSM_HS_INFO("Clock ON Failure"
			"For UART CLK Stalling HSUART\n");
			break;
		}

		spin_lock_irqsave(&uport->lock, flags);
		/* else fall-through */
	case MSM_HS_CLK_REQUEST_OFF:
		hrtimer_cancel(&msm_uport->clk_off_timer);
		if (msm_uport->rx.flush == FLUSH_STOP) {
			spin_unlock_irqrestore(&uport->lock, flags);
			MSM_HS_DBG("%s:Calling wait forxcompletion\n",
@@ -2301,8 +2313,6 @@ void msm_hs_request_clock_on(struct uart_port *uport)
		}
		MSM_HS_DBG("%s:clock state %d\n\n", __func__,
				msm_uport->clk_state);
		if (msm_uport->clk_state == MSM_HS_CLK_REQUEST_OFF)
				msm_uport->clk_state = MSM_HS_CLK_ON;
		if (msm_uport->rx.flush == FLUSH_STOP ||
		    msm_uport->rx.flush == FLUSH_SHUTDOWN) {
			msm_hs_write(uport, UART_DM_CR, RESET_RX);
@@ -2335,6 +2345,7 @@ void msm_hs_request_clock_on(struct uart_port *uport)
	dump_uart_hs_registers(msm_uport);
	spin_unlock_irqrestore(&uport->lock, flags);
	mutex_unlock(&msm_uport->clk_mutex);
	msm_hs_clock_unvote(msm_uport);
}
EXPORT_SYMBOL(msm_hs_request_clock_on);