Serial driver fix for 5.12-rc6
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. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- iG0EABECAC0WIQT0tgzFv3jCIUoxPcsxR9QN2y37KQUCYGhHew8cZ3JlZ0Brcm9h aC5jb20ACgkQMUfUDdst+ykyOQCgwM7aKSHU9MuRiyU8jVk1qEEwfHgAn3YcQ6bY 2IWKKJ4MUo2Iks/+2HS7 =oGYE -----END PGP SIGNATURE----- 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
This commit is contained in:
Коммит
0d2c5a9e15
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче