Commit 0d2c5a9e authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'tty-5.12-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty

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
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
#include <linux/acpi.h> #include <linux/acpi.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/console.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/io.h> #include <linux/io.h>
...@@ -92,14 +91,11 @@ struct geni_wrapper { ...@@ -92,14 +91,11 @@ struct geni_wrapper {
struct device *dev; struct device *dev;
void __iomem *base; void __iomem *base;
struct clk_bulk_data ahb_clks[NUM_AHB_CLKS]; 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", static const char * const icc_path_names[] = {"qup-core", "qup-config",
"qup-memory"}; "qup-memory"};
static struct geni_wrapper *earlycon_wrapper;
#define QUP_HW_VER_REG 0x4 #define QUP_HW_VER_REG 0x4
/* Common SE registers */ /* Common SE registers */
...@@ -843,44 +839,11 @@ int geni_icc_disable(struct geni_se *se) ...@@ -843,44 +839,11 @@ int geni_icc_disable(struct geni_se *se)
} }
EXPORT_SYMBOL(geni_icc_disable); 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) static int geni_se_probe(struct platform_device *pdev)
{ {
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct resource *res; struct resource *res;
struct geni_wrapper *wrapper; struct geni_wrapper *wrapper;
struct console __maybe_unused *bcon;
bool __maybe_unused has_earlycon = false;
int ret; int ret;
wrapper = devm_kzalloc(dev, sizeof(*wrapper), GFP_KERNEL); wrapper = devm_kzalloc(dev, sizeof(*wrapper), GFP_KERNEL);
...@@ -903,43 +866,6 @@ static int geni_se_probe(struct platform_device *pdev) ...@@ -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_set_drvdata(dev, wrapper);
dev_dbg(dev, "GENI SE Driver probed\n"); dev_dbg(dev, "GENI SE Driver probed\n");
return devm_of_platform_populate(dev); return devm_of_platform_populate(dev);
......
...@@ -1177,12 +1177,6 @@ static inline void qcom_geni_serial_enable_early_read(struct geni_se *se, ...@@ -1177,12 +1177,6 @@ static inline void qcom_geni_serial_enable_early_read(struct geni_se *se,
struct console *con) { } struct console *con) { }
#endif #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 struct qcom_geni_private_data earlycon_private_data;
static int __init qcom_geni_serial_earlycon_setup(struct earlycon_device *dev, 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, ...@@ -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); writel(stop_bit_len, uport->membase + SE_UART_TX_STOP_BIT_LEN);
dev->con->write = qcom_geni_serial_earlycon_write; dev->con->write = qcom_geni_serial_earlycon_write;
dev->con->exit = qcom_geni_serial_earlycon_exit;
dev->con->setup = NULL; dev->con->setup = NULL;
qcom_geni_serial_enable_early_read(&se, dev->con); qcom_geni_serial_enable_early_read(&se, dev->con);
......
...@@ -460,7 +460,5 @@ void geni_icc_set_tag(struct geni_se *se, u32 tag); ...@@ -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_enable(struct geni_se *se);
int geni_icc_disable(struct geni_se *se); int geni_icc_disable(struct geni_se *se);
void geni_remove_earlycon_icc_vote(void);
#endif #endif
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment