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

Commit ae91e054 authored by Dilip Kota's avatar Dilip Kota
Browse files

msm_serial_hs: Handle Tx request while Clock OFF



If client initiates a Tx operation when UART clocks are
Off, the driver should not attempt to send data, as this
would result in interacting with unclocked hardware. Add
support to detect this condition and avoid writing to an
unclocked device.
Add a null check after memory allocation.

CRs-Fixed: 629870
Change-Id: I001516e731e73881a29d768d9fb1bf759f3419b9
Signed-off-by: default avatarDilip Kota <c_dkota@codeaurora.org>
Signed-off-by: default avatarDilip Kota <c_dkota@codeaurora.org>
parent 9caf98a4
Loading
Loading
Loading
Loading
+13 −3
Original line number Diff line number Diff line
@@ -1532,7 +1532,8 @@ static void msm_hs_start_tx_locked(struct uart_port *uport )
	struct msm_hs_port *msm_uport = UARTDM_TO_MSM(uport);

	if (msm_uport->clk_state != MSM_HS_CLK_ON) {
		MSM_HS_INFO("%s: Failed.Clocks are OFF\n", __func__);
		MSM_HS_WARN("%s: Failed.Clocks are OFF\n", __func__);
		return;
	}
	if ((msm_uport->tx.tx_ready_int_en == 0) &&
		(msm_uport->tx.dma_in_flight == 0))
@@ -2128,6 +2129,8 @@ void msm_hs_request_clock_on(struct uart_port *uport)
	case MSM_HS_CLK_ON:
		break;
	case MSM_HS_CLK_PORT_OFF:
		MSM_HS_ERR("%s:Clock ON failed;UART Port is Closed\n",
								__func__);
		break;
	}

@@ -2903,6 +2906,11 @@ static int msm_hs_probe(struct platform_device *pdev)

	msm_uport = devm_kzalloc(&pdev->dev, sizeof(struct msm_hs_port),
			GFP_KERNEL);
	if (!msm_uport) {
		MSM_HS_ERR("Memory allocation failed\n");
		return -ENOMEM;
	}

	msm_uport->uport.type = PORT_UNKNOWN;
	uport = &msm_uport->uport;
	uport->dev = &pdev->dev;
@@ -3070,15 +3078,16 @@ static int msm_hs_probe(struct platform_device *pdev)
	msm_hs_write(uport, UART_DM_MR2, data);
	mb();

	msm_uport->clk_state = MSM_HS_CLK_PORT_OFF;
	hrtimer_init(&msm_uport->clk_off_timer, CLOCK_MONOTONIC,
		     HRTIMER_MODE_REL);
	msm_uport->clk_off_timer.function = msm_hs_clk_off_retry;
	msm_uport->clk_off_delay = ktime_set(0, 1000000);  /* 1ms */

	ret = sysfs_create_file(&pdev->dev.kobj, &dev_attr_clock.attr);
	if (unlikely(ret))
	if (unlikely(ret)) {
		MSM_HS_ERR("Probe Failed as sysfs failed\n");
		goto err_clock;
	}

	msm_serial_debugfs_init(msm_uport, pdev->id);

@@ -3088,6 +3097,7 @@ static int msm_hs_probe(struct platform_device *pdev)
	ret = uart_add_one_port(&msm_hs_driver, uport);
	if (!ret) {
		msm_hs_clock_unvote(msm_uport);
		msm_uport->clk_state = MSM_HS_CLK_PORT_OFF;
		return ret;
	}