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

Commit fbd0ef20 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "serial: msm_geni_serial: Ensure to set clock freq correctly on RUMI"

parents f74e0cb0 c01b8f8d
Loading
Loading
Loading
Loading
+38 −3
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
/*
 * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
 * Copyright (c) 2016-2020, The Linux Foundation. All rights reserved.
 */

#include <linux/bitmap.h>
@@ -174,6 +174,8 @@ struct msm_geni_serial_port {
	struct msm_geni_serial_ver_info ver_info;
	u32 cur_tx_remaining;
	bool startup_in_progress;
	bool is_console;
	bool rumi_platform;
};

static const struct uart_ops msm_geni_serial_pops;
@@ -1998,6 +2000,13 @@ static void msm_geni_serial_set_termios(struct uart_port *uport,
	unsigned long clk_rate;
	unsigned long flags;

	/* QUP_2.5.0 and older RUMI has sampling rate as 32 */
	if (port->rumi_platform && port->is_console) {
		geni_write_reg_nolog(0x21, uport->membase, GENI_SER_M_CLK_CFG);
		geni_write_reg_nolog(0x21, uport->membase, GENI_SER_S_CLK_CFG);
		geni_read_reg_nolog(uport->membase, GENI_SER_M_CLK_CFG);
	}

	if (!uart_console(uport)) {
		int ret = msm_geni_serial_power_on(uport);

@@ -2337,6 +2346,13 @@ msm_geni_serial_earlycon_setup(struct earlycon_device *dev,
	 */
	msm_geni_serial_poll_cancel_tx(uport);

	/* Only for earlyconsole */
	if (IS_ENABLED(CONFIG_SERIAL_MSM_GENI_HALF_SAMPLING)) {
		geni_write_reg_nolog(0x21, uport->membase, GENI_SER_M_CLK_CFG);
		geni_write_reg_nolog(0x21, uport->membase, GENI_SER_S_CLK_CFG);
		geni_read_reg_nolog(uport->membase, GENI_SER_M_CLK_CFG);
	}

	se_get_packing_config(8, 1, false, &cfg0, &cfg1);
	geni_se_init(uport->membase, (DEF_FIFO_DEPTH_WORDS >> 1),
					(DEF_FIFO_DEPTH_WORDS - 2));
@@ -2529,6 +2545,12 @@ static int msm_geni_serial_get_ver_info(struct uart_port *uport)
	int hw_ver, ret = 0;
	struct msm_geni_serial_port *msm_port = GET_DEV_PORT(uport);

	/*
	 * At this time early console is still active and transfers are
	 * in-coming. Make sure UART doesn't turn on/off clocks for
	 * console usecase.
	 */
	if (!msm_port->is_console)
		se_geni_clks_on(&msm_port->serial_rsc);
	/* Basic HW and FW info */
	if (unlikely(get_se_proto(uport->membase) != UART)) {
@@ -2557,6 +2579,7 @@ static int msm_geni_serial_get_ver_info(struct uart_port *uport)
			msm_port->ver_info.hw_minor_ver,
			msm_port->ver_info.hw_step_ver);
exit_ver_info:
	if (!msm_port->is_console)
		se_geni_clks_off(&msm_port->serial_rsc);
	return ret;
}
@@ -2609,6 +2632,7 @@ static int msm_geni_serial_probe(struct platform_device *pdev)
					line, ret);
		goto exit_geni_serial_probe;
	}
	dev_port->is_console = is_console;

	uport = &dev_port->uport;

@@ -2649,6 +2673,10 @@ static int msm_geni_serial_probe(struct platform_device *pdev)

	dev_port->serial_rsc.ctrl_dev = &pdev->dev;

	/* RUMI specific */
	dev_port->rumi_platform = of_property_read_bool(pdev->dev.of_node,
					"qcom,rumi_platform");

	if (of_property_read_u32(pdev->dev.of_node, "qcom,wakeup-byte",
					&wake_char)) {
		dev_dbg(&pdev->dev, "No Wakeup byte specified\n");
@@ -2771,6 +2799,13 @@ static int msm_geni_serial_probe(struct platform_device *pdev)
		pm_runtime_enable(&pdev->dev);
	}

	if (IS_ENABLED(CONFIG_SERIAL_MSM_GENI_HALF_SAMPLING) &&
		dev_port->rumi_platform && dev_port->is_console) {
		geni_write_reg_nolog(0x21, uport->membase, GENI_SER_M_CLK_CFG);
		geni_write_reg_nolog(0x21, uport->membase, GENI_SER_S_CLK_CFG);
		geni_read_reg_nolog(uport->membase, GENI_SER_M_CLK_CFG);
	}

	dev_info(&pdev->dev, "Serial port%d added.FifoSize %d is_console%d\n",
				line, uport->fifosize, is_console);
	device_create_file(uport->dev, &dev_attr_loopback);