Merge "msm_serial_hs: Update usage of PNOC bus scaling voting"
diff --git a/drivers/tty/serial/msm_serial_hs.c b/drivers/tty/serial/msm_serial_hs.c
index 7645df4..6684fc4 100644
--- a/drivers/tty/serial/msm_serial_hs.c
+++ b/drivers/tty/serial/msm_serial_hs.c
@@ -225,6 +225,8 @@
 #define UARTDM_NR 256
 #define BAM_PIPE_MIN 0
 #define BAM_PIPE_MAX 11
+#define BUS_SCALING 1
+#define BUS_RESET 0
 
 static struct dentry *debug_base;
 static struct msm_hs_port q_uart_port[UARTDM_NR];
@@ -300,6 +302,21 @@
 {
 	return (msm_uport->uart_type == BLSP_HSUART);
 }
+
+static void msm_hs_bus_voting(struct msm_hs_port *msm_uport, unsigned int vote)
+{
+	int ret;
+
+	if (is_blsp_uart(msm_uport) && msm_uport->bus_perf_client) {
+		pr_debug("Bus voting:%d\n", vote);
+		ret = msm_bus_scale_client_update_request(
+				msm_uport->bus_perf_client, vote);
+		if (ret)
+			pr_err("%s(): Failed for Bus voting: %d\n",
+							__func__, vote);
+	}
+}
+
 static inline unsigned int msm_hs_read(struct uart_port *uport,
 				       unsigned int offset)
 {
@@ -368,6 +385,8 @@
 	unsigned long flags;
 	int ret = 0;
 
+	msm_hs_bus_voting(msm_uport, BUS_SCALING);
+
 	clk_prepare_enable(msm_uport->clk);
 	if (msm_uport->pclk)
 		clk_prepare_enable(msm_uport->pclk);
@@ -399,6 +418,7 @@
 	if (msm_uport->pclk)
 		clk_disable_unprepare(msm_uport->pclk);
 
+	msm_hs_bus_voting(msm_uport, BUS_RESET);
 	return 0;
 }
 
@@ -409,6 +429,8 @@
 	unsigned long flags;
 	int ret = 0;
 
+	msm_hs_bus_voting(msm_uport, BUS_SCALING);
+
 	clk_prepare_enable(msm_uport->clk);
 	if (msm_uport->pclk)
 		clk_prepare_enable(msm_uport->pclk);
@@ -422,6 +444,8 @@
 		clk_disable_unprepare(msm_uport->pclk);
 
 	*val = (ret & UARTDM_MR2_LOOP_MODE_BMSK) ? 1 : 0;
+
+	msm_hs_bus_voting(msm_uport, BUS_RESET);
 	return 0;
 }
 DEFINE_SIMPLE_ATTRIBUTE(loopback_enable_fops, msm_serial_loopback_enable_get,
@@ -1627,7 +1651,6 @@
 {
 	unsigned long sr_status;
 	unsigned long flags;
-	int ret;
 	struct msm_hs_port *msm_uport = UARTDM_TO_MSM(uport);
 	struct circ_buf *tx_buf = &uport->state->xmit;
 
@@ -1710,14 +1733,9 @@
 	spin_unlock_irqrestore(&uport->lock, flags);
 
 	/* Reset PNOC Bus Scaling */
-	if (is_blsp_uart(msm_uport)) {
-		ret = msm_bus_scale_client_update_request(
-				msm_uport->bus_perf_client, 0);
-		if (ret)
-			pr_err("%s(): Failed to reset bus bw vote\n", __func__);
-	}
-
+	msm_hs_bus_voting(msm_uport, BUS_RESET);
 	mutex_unlock(&msm_uport->clk_mutex);
+
 	return 1;
 }
 
@@ -1889,13 +1907,7 @@
 		spin_unlock_irqrestore(&uport->lock, flags);
 
 		/* Vote for PNOC BUS Scaling */
-		if (is_blsp_uart(msm_uport)) {
-			ret = msm_bus_scale_client_update_request(
-					msm_uport->bus_perf_client, 1);
-			if (ret)
-				pr_err("%s():Failed to vote for bus scaling.\n",
-								__func__);
-		}
+		msm_hs_bus_voting(msm_uport, BUS_SCALING);
 
 		ret = clk_prepare_enable(msm_uport->clk);
 		if (ret) {
@@ -2142,13 +2154,7 @@
 	}
 
 	/* Vote for PNOC BUS Scaling */
-	if (is_blsp_uart(msm_uport)) {
-		ret = msm_bus_scale_client_update_request(
-				msm_uport->bus_perf_client, 1);
-		if (ret)
-			pr_err("%s(): Failed to vote for bus scaling\n",
-								__func__);
-	}
+	msm_hs_bus_voting(msm_uport, BUS_SCALING);
 
 	spin_lock_irqsave(&uport->lock, flags);
 
@@ -2673,8 +2679,7 @@
 
 		msm_uport->bus_scale_table = msm_bus_cl_get_pdata(pdev);
 		if (!msm_uport->bus_scale_table) {
-			pr_err("BLSP UART: Bus scaling is disabled\n");
-			goto unmap_memory;
+			pr_err("BLSP UART: Bus scaling is disabled.\n");
 		} else {
 			msm_uport->bus_perf_client =
 				msm_bus_scale_register_client
@@ -2682,6 +2687,7 @@
 			if (IS_ERR(&msm_uport->bus_perf_client)) {
 				pr_err("%s(): Bus client register failed.\n",
 								__func__);
+				ret = -EINVAL;
 				goto unmap_memory;
 			}
 		}
@@ -2803,6 +2809,8 @@
 		}
 	}
 
+	msm_hs_bus_voting(msm_uport, BUS_SCALING);
+
 	clk_prepare_enable(msm_uport->clk);
 	if (msm_uport->pclk)
 		clk_prepare_enable(msm_uport->pclk);
@@ -2840,6 +2848,8 @@
 		uport->line = pdata->userid;
 	ret = uart_add_one_port(&msm_hs_driver, uport);
 	if (!ret) {
+
+		msm_hs_bus_voting(msm_uport, BUS_RESET);
 		clk_disable_unprepare(msm_uport->clk);
 		if (msm_uport->pclk)
 			clk_disable_unprepare(msm_uport->pclk);
@@ -2847,6 +2857,8 @@
 	}
 
 err_clock:
+
+	msm_hs_bus_voting(msm_uport, BUS_RESET);
 	clk_disable_unprepare(msm_uport->clk);
 	if (msm_uport->pclk)
 		clk_disable_unprepare(msm_uport->pclk);
@@ -2957,12 +2969,7 @@
 	mb();
 
 	/* Reset PNOC Bus Scaling */
-	if (is_blsp_uart(msm_uport)) {
-		ret = msm_bus_scale_client_update_request(
-				msm_uport->bus_perf_client, 0);
-		if (ret)
-			pr_err("%s(): Failed to reset bus bw vote\n", __func__);
-	}
+	msm_hs_bus_voting(msm_uport, BUS_RESET);
 
 	if (msm_uport->clk_state != MSM_HS_CLK_OFF) {
 		/* to balance clk_state */