diff --git a/drivers/tty/serial/msm_geni_serial.c b/drivers/tty/serial/msm_geni_serial.c index 80118cba0a56..be2c3e72bbf1 100644 --- a/drivers/tty/serial/msm_geni_serial.c +++ b/drivers/tty/serial/msm_geni_serial.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2016-2020, The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2021, The Linux Foundation. All rights reserved. */ #include @@ -2187,6 +2187,14 @@ static void msm_geni_serial_shutdown(struct uart_port *uport) disable_irq(msm_port->wakeup_irq); free_irq(msm_port->wakeup_irq, uport); } + + if (!IS_ERR_OR_NULL(msm_port->serial_rsc.geni_gpio_shutdown)) { + ret = pinctrl_select_state(msm_port->serial_rsc.geni_pinctrl, + msm_port->serial_rsc.geni_gpio_shutdown); + if (ret) + IPC_LOG_MSG(msm_port->ipc_log_misc, + "%s: Error %d pinctrl_select_state\n", __func__, ret); + } } IPC_LOG_MSG(msm_port->ipc_log_misc, "%s: End\n", __func__); } @@ -2905,6 +2913,18 @@ static int msm_geni_serial_get_irq_pinctrl(struct platform_device *pdev, dev_err(&pdev->dev, "No pinctrl config specified!\n"); return PTR_ERR(dev_port->serial_rsc.geni_pinctrl); } + + if (!dev_port->is_console) { + if (IS_ERR_OR_NULL(pinctrl_lookup_state(dev_port->serial_rsc.geni_pinctrl, + PINCTRL_SHUTDOWN))) { + dev_info(&pdev->dev, "No Shutdown config specified\n"); + } else { + dev_port->serial_rsc.geni_gpio_shutdown = + pinctrl_lookup_state(dev_port->serial_rsc.geni_pinctrl, + PINCTRL_SHUTDOWN); + } + } + dev_port->serial_rsc.geni_gpio_active = pinctrl_lookup_state(dev_port->serial_rsc.geni_pinctrl, PINCTRL_ACTIVE); diff --git a/include/linux/msm-geni-se.h b/include/linux/msm-geni-se.h index 5b5de47d6d34..b56fbad5e8a2 100644 --- a/include/linux/msm-geni-se.h +++ b/include/linux/msm-geni-se.h @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* - * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2021, The Linux Foundation. All rights reserved. */ #ifndef _LINUX_MSM_GENI_SE @@ -66,6 +66,7 @@ struct se_geni_rsc { unsigned long ib; unsigned long ib_noc; struct pinctrl *geni_pinctrl; + struct pinctrl_state *geni_gpio_shutdown; struct pinctrl_state *geni_gpio_active; struct pinctrl_state *geni_gpio_sleep; int clk_freq_out; @@ -76,6 +77,7 @@ struct se_geni_rsc { #define PINCTRL_DEFAULT "default" #define PINCTRL_ACTIVE "active" #define PINCTRL_SLEEP "sleep" +#define PINCTRL_SHUTDOWN "shutdown" #define KHz(freq) (1000 * (freq))