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 */