Commit 0d2c5a9e authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull serial driver fix from Greg KH:
 "Here is a single serial driver fix for 5.12-rc6. Is is a revert of a
  change that showed up in 5.9 that has been reported to cause problems.

  It has been in linux-next for a while with no reported issues"

* tag 'tty-5.12-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty:
  soc: qcom-geni-se: Cleanup the code to remove proxy votes
parents de879a8d 29d96eb2
Loading
Loading
Loading
Loading
+0 −74
Original line number Diff line number Diff line
@@ -3,7 +3,6 @@

#include <linux/acpi.h>
#include <linux/clk.h>
#include <linux/console.h>
#include <linux/slab.h>
#include <linux/dma-mapping.h>
#include <linux/io.h>
@@ -92,14 +91,11 @@ struct geni_wrapper {
	struct device *dev;
	void __iomem *base;
	struct clk_bulk_data ahb_clks[NUM_AHB_CLKS];
	struct geni_icc_path to_core;
};

static const char * const icc_path_names[] = {"qup-core", "qup-config",
						"qup-memory"};

static struct geni_wrapper *earlycon_wrapper;

#define QUP_HW_VER_REG			0x4

/* Common SE registers */
@@ -843,44 +839,11 @@ int geni_icc_disable(struct geni_se *se)
}
EXPORT_SYMBOL(geni_icc_disable);

void geni_remove_earlycon_icc_vote(void)
{
	struct platform_device *pdev;
	struct geni_wrapper *wrapper;
	struct device_node *parent;
	struct device_node *child;

	if (!earlycon_wrapper)
		return;

	wrapper = earlycon_wrapper;
	parent = of_get_next_parent(wrapper->dev->of_node);
	for_each_child_of_node(parent, child) {
		if (!of_device_is_compatible(child, "qcom,geni-se-qup"))
			continue;

		pdev = of_find_device_by_node(child);
		if (!pdev)
			continue;

		wrapper = platform_get_drvdata(pdev);
		icc_put(wrapper->to_core.path);
		wrapper->to_core.path = NULL;

	}
	of_node_put(parent);

	earlycon_wrapper = NULL;
}
EXPORT_SYMBOL(geni_remove_earlycon_icc_vote);

static int geni_se_probe(struct platform_device *pdev)
{
	struct device *dev = &pdev->dev;
	struct resource *res;
	struct geni_wrapper *wrapper;
	struct console __maybe_unused *bcon;
	bool __maybe_unused has_earlycon = false;
	int ret;

	wrapper = devm_kzalloc(dev, sizeof(*wrapper), GFP_KERNEL);
@@ -903,43 +866,6 @@ static int geni_se_probe(struct platform_device *pdev)
		}
	}

#ifdef CONFIG_SERIAL_EARLYCON
	for_each_console(bcon) {
		if (!strcmp(bcon->name, "qcom_geni")) {
			has_earlycon = true;
			break;
		}
	}
	if (!has_earlycon)
		goto exit;

	wrapper->to_core.path = devm_of_icc_get(dev, "qup-core");
	if (IS_ERR(wrapper->to_core.path))
		return PTR_ERR(wrapper->to_core.path);
	/*
	 * Put minmal BW request on core clocks on behalf of early console.
	 * The vote will be removed earlycon exit function.
	 *
	 * Note: We are putting vote on each QUP wrapper instead only to which
	 * earlycon is connected because QUP core clock of different wrapper
	 * share same voltage domain. If core1 is put to 0, then core2 will
	 * also run at 0, if not voted. Default ICC vote will be removed ASA
	 * we touch any of the core clock.
	 * core1 = core2 = max(core1, core2)
	 */
	ret = icc_set_bw(wrapper->to_core.path, GENI_DEFAULT_BW,
				GENI_DEFAULT_BW);
	if (ret) {
		dev_err(&pdev->dev, "%s: ICC BW voting failed for core: %d\n",
			__func__, ret);
		return ret;
	}

	if (of_get_compatible_child(pdev->dev.of_node, "qcom,geni-debug-uart"))
		earlycon_wrapper = wrapper;
	of_node_put(pdev->dev.of_node);
exit:
#endif
	dev_set_drvdata(dev, wrapper);
	dev_dbg(dev, "GENI SE Driver probed\n");
	return devm_of_platform_populate(dev);
+0 −7
Original line number Diff line number Diff line
@@ -1177,12 +1177,6 @@ static inline void qcom_geni_serial_enable_early_read(struct geni_se *se,
						      struct console *con) { }
#endif

static int qcom_geni_serial_earlycon_exit(struct console *con)
{
	geni_remove_earlycon_icc_vote();
	return 0;
}

static struct qcom_geni_private_data earlycon_private_data;

static int __init qcom_geni_serial_earlycon_setup(struct earlycon_device *dev,
@@ -1233,7 +1227,6 @@ static int __init qcom_geni_serial_earlycon_setup(struct earlycon_device *dev,
	writel(stop_bit_len, uport->membase + SE_UART_TX_STOP_BIT_LEN);

	dev->con->write = qcom_geni_serial_earlycon_write;
	dev->con->exit = qcom_geni_serial_earlycon_exit;
	dev->con->setup = NULL;
	qcom_geni_serial_enable_early_read(&se, dev->con);

+0 −2
Original line number Diff line number Diff line
@@ -460,7 +460,5 @@ void geni_icc_set_tag(struct geni_se *se, u32 tag);
int geni_icc_enable(struct geni_se *se);

int geni_icc_disable(struct geni_se *se);

void geni_remove_earlycon_icc_vote(void);
#endif
#endif