From 0df046ba493044f3a2aeeaed0d8e3bd8ee762825 Mon Sep 17 00:00:00 2001 From: Paras Sharma Date: Tue, 12 Jan 2021 16:06:09 +0530 Subject: [PATCH] serial: msm_geni_serial: Vote for shutdown pinctrl during BT off Currently driver is voting for active/sleep state configuration during BT disconnect. Since this state contains UART functionality, GPIO pins remains high which consumes power. This change is added to vote for the shutdown pinctrl state during BT disconnect and configure GPIO's in gpio functionality. This is a requirement from BT SOC team. Change-Id: I09f7a4a1dbc197c2bfd443a0b546a1ff283134ed Signed-off-by: Paras Sharma --- drivers/tty/serial/msm_geni_serial.c | 22 +++++++++++++++++++++- include/linux/msm-geni-se.h | 4 +++- 2 files changed, 24 insertions(+), 2 deletions(-) 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))