Commit e9c9d3bb authored by Andy Shevchenko's avatar Andy Shevchenko Committed by Greg Kroah-Hartman

serial: pic32_uart: Convert to use GPIO descriptors

Plain global GPIO numbering schema is deprecated and is being removed
from the kernel. Convert this driver to use a new GPIO descriptor based
schema.
Signed-off-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Link: https://lore.kernel.org/r/20220806225643.40897-2-andriy.shevchenko@linux.intel.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent e68d5450
...@@ -50,7 +50,7 @@ ...@@ -50,7 +50,7 @@
* @irq_rx_name: irq rx name * @irq_rx_name: irq rx name
* @irq_tx: virtual tx interrupt number * @irq_tx: virtual tx interrupt number
* @irq_tx_name: irq tx name * @irq_tx_name: irq tx name
* @cts_gpio: clear to send gpio * @cts_gpiod: clear to send GPIO
* @dev: device descriptor * @dev: device descriptor
**/ **/
struct pic32_sport { struct pic32_sport {
...@@ -65,8 +65,7 @@ struct pic32_sport { ...@@ -65,8 +65,7 @@ struct pic32_sport {
const char *irq_tx_name; const char *irq_tx_name;
bool enable_tx_irq; bool enable_tx_irq;
bool hw_flow_ctrl; struct gpio_desc *cts_gpiod;
int cts_gpio;
struct clk *clk; struct clk *clk;
...@@ -158,25 +157,16 @@ static void pic32_uart_set_mctrl(struct uart_port *port, unsigned int mctrl) ...@@ -158,25 +157,16 @@ static void pic32_uart_set_mctrl(struct uart_port *port, unsigned int mctrl)
PIC32_UART_MODE_LPBK); PIC32_UART_MODE_LPBK);
} }
/* get the state of CTS input pin for this port */
static unsigned int get_cts_state(struct pic32_sport *sport)
{
/* read and invert UxCTS */
if (gpio_is_valid(sport->cts_gpio))
return !gpio_get_value(sport->cts_gpio);
return 1;
}
/* serial core request to return the state of misc UART input pins */ /* serial core request to return the state of misc UART input pins */
static unsigned int pic32_uart_get_mctrl(struct uart_port *port) static unsigned int pic32_uart_get_mctrl(struct uart_port *port)
{ {
struct pic32_sport *sport = to_pic32_sport(port); struct pic32_sport *sport = to_pic32_sport(port);
unsigned int mctrl = 0; unsigned int mctrl = 0;
if (!sport->hw_flow_ctrl) /* get the state of CTS input pin for this port */
if (!sport->cts_gpiod)
mctrl |= TIOCM_CTS; mctrl |= TIOCM_CTS;
else if (get_cts_state(sport)) else if (gpiod_get_value(sport->cts_gpiod))
mctrl |= TIOCM_CTS; mctrl |= TIOCM_CTS;
/* DSR and CD are not supported in PIC32, so return 1 /* DSR and CD are not supported in PIC32, so return 1
...@@ -648,7 +638,7 @@ static void pic32_uart_set_termios(struct uart_port *port, ...@@ -648,7 +638,7 @@ static void pic32_uart_set_termios(struct uart_port *port,
PIC32_UART_MODE_PDSEL0); PIC32_UART_MODE_PDSEL0);
} }
/* if hw flow ctrl, then the pins must be specified in device tree */ /* if hw flow ctrl, then the pins must be specified in device tree */
if ((new->c_cflag & CRTSCTS) && sport->hw_flow_ctrl) { if ((new->c_cflag & CRTSCTS) && sport->cts_gpiod) {
/* enable hardware flow control */ /* enable hardware flow control */
pic32_uart_writel(sport, PIC32_SET(PIC32_UART_MODE), pic32_uart_writel(sport, PIC32_SET(PIC32_UART_MODE),
PIC32_UART_MODE_UEN1); PIC32_UART_MODE_UEN1);
...@@ -875,7 +865,8 @@ static struct uart_driver pic32_uart_driver = { ...@@ -875,7 +865,8 @@ static struct uart_driver pic32_uart_driver = {
static int pic32_uart_probe(struct platform_device *pdev) static int pic32_uart_probe(struct platform_device *pdev)
{ {
struct device_node *np = pdev->dev.of_node; struct device *dev = &pdev->dev;
struct device_node *np = dev->of_node;
struct pic32_sport *sport; struct pic32_sport *sport;
int uart_idx = 0; int uart_idx = 0;
struct resource *res_mem; struct resource *res_mem;
...@@ -904,25 +895,10 @@ static int pic32_uart_probe(struct platform_device *pdev) ...@@ -904,25 +895,10 @@ static int pic32_uart_probe(struct platform_device *pdev)
/* Hardware flow control: gpios /* Hardware flow control: gpios
* !Note: Basically, CTS is needed for reading the status. * !Note: Basically, CTS is needed for reading the status.
*/ */
sport->hw_flow_ctrl = false; sport->cts_gpiod = devm_gpiod_get_optional(dev, "cts", GPIOD_IN);
sport->cts_gpio = of_get_named_gpio(np, "cts-gpios", 0); if (IS_ERR(sport->cts_gpiod))
if (gpio_is_valid(sport->cts_gpio)) { return dev_err_probe(dev, PTR_ERR(sport->cts_gpiod), "error requesting CTS GPIO\n");
sport->hw_flow_ctrl = true; gpiod_set_consumer_name(sport->cts_gpiod, "CTS");
ret = devm_gpio_request(sport->dev,
sport->cts_gpio, "CTS");
if (ret) {
dev_err(&pdev->dev,
"error requesting CTS GPIO\n");
goto err;
}
ret = gpio_direction_input(sport->cts_gpio);
if (ret) {
dev_err(&pdev->dev, "error setting CTS GPIO\n");
goto err;
}
}
pic32_sports[uart_idx] = sport; pic32_sports[uart_idx] = sport;
port = &sport->port; port = &sport->port;
......
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