Commit 97cbaf2c authored by Linus Walleij's avatar Linus Walleij Committed by Greg Kroah-Hartman

tty: serial: cpm_uart: Convert to use GPIO descriptors

The CPM UART (PowerPC) has an open coded GPIO modem control
handling. Since I can't test this I can't just migrate it to
the serial mctrl GPIO helper library though I wish I could.
I do second best and convert it to GPIO descriptors at least.

Cc: Rasmus Villemoes <linux@rasmusvillemoes.dk>
Cc: Christophe Leroy <christophe.leroy@c-s.fr>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Link: https://lore.kernel.org/r/20200229231842.247563-1-linus.walleij@linaro.orgSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 8145e85f
...@@ -13,6 +13,8 @@ ...@@ -13,6 +13,8 @@
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/fs_uart_pd.h> #include <linux/fs_uart_pd.h>
struct gpio_desc;
#if defined(CONFIG_CPM2) #if defined(CONFIG_CPM2)
#include "cpm_uart_cpm2.h" #include "cpm_uart_cpm2.h"
#elif defined(CONFIG_CPM1) #elif defined(CONFIG_CPM1)
...@@ -80,7 +82,7 @@ struct uart_cpm_port { ...@@ -80,7 +82,7 @@ struct uart_cpm_port {
int wait_closing; int wait_closing;
/* value to combine with opcode to form cpm command */ /* value to combine with opcode to form cpm command */
u32 command; u32 command;
int gpios[NUM_GPIOS]; struct gpio_desc *gpios[NUM_GPIOS];
}; };
extern int cpm_uart_nr; extern int cpm_uart_nr;
......
...@@ -30,8 +30,7 @@ ...@@ -30,8 +30,7 @@
#include <linux/of_address.h> #include <linux/of_address.h>
#include <linux/of_irq.h> #include <linux/of_irq.h>
#include <linux/of_platform.h> #include <linux/of_platform.h>
#include <linux/gpio.h> #include <linux/gpio/consumer.h>
#include <linux/of_gpio.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <asm/io.h> #include <asm/io.h>
...@@ -88,11 +87,11 @@ static void cpm_uart_set_mctrl(struct uart_port *port, unsigned int mctrl) ...@@ -88,11 +87,11 @@ static void cpm_uart_set_mctrl(struct uart_port *port, unsigned int mctrl)
struct uart_cpm_port *pinfo = struct uart_cpm_port *pinfo =
container_of(port, struct uart_cpm_port, port); container_of(port, struct uart_cpm_port, port);
if (pinfo->gpios[GPIO_RTS] >= 0) if (pinfo->gpios[GPIO_RTS])
gpio_set_value(pinfo->gpios[GPIO_RTS], !(mctrl & TIOCM_RTS)); gpiod_set_value(pinfo->gpios[GPIO_RTS], !(mctrl & TIOCM_RTS));
if (pinfo->gpios[GPIO_DTR] >= 0) if (pinfo->gpios[GPIO_DTR])
gpio_set_value(pinfo->gpios[GPIO_DTR], !(mctrl & TIOCM_DTR)); gpiod_set_value(pinfo->gpios[GPIO_DTR], !(mctrl & TIOCM_DTR));
} }
static unsigned int cpm_uart_get_mctrl(struct uart_port *port) static unsigned int cpm_uart_get_mctrl(struct uart_port *port)
...@@ -101,23 +100,23 @@ static unsigned int cpm_uart_get_mctrl(struct uart_port *port) ...@@ -101,23 +100,23 @@ static unsigned int cpm_uart_get_mctrl(struct uart_port *port)
container_of(port, struct uart_cpm_port, port); container_of(port, struct uart_cpm_port, port);
unsigned int mctrl = TIOCM_CTS | TIOCM_DSR | TIOCM_CAR; unsigned int mctrl = TIOCM_CTS | TIOCM_DSR | TIOCM_CAR;
if (pinfo->gpios[GPIO_CTS] >= 0) { if (pinfo->gpios[GPIO_CTS]) {
if (gpio_get_value(pinfo->gpios[GPIO_CTS])) if (gpiod_get_value(pinfo->gpios[GPIO_CTS]))
mctrl &= ~TIOCM_CTS; mctrl &= ~TIOCM_CTS;
} }
if (pinfo->gpios[GPIO_DSR] >= 0) { if (pinfo->gpios[GPIO_DSR]) {
if (gpio_get_value(pinfo->gpios[GPIO_DSR])) if (gpiod_get_value(pinfo->gpios[GPIO_DSR]))
mctrl &= ~TIOCM_DSR; mctrl &= ~TIOCM_DSR;
} }
if (pinfo->gpios[GPIO_DCD] >= 0) { if (pinfo->gpios[GPIO_DCD]) {
if (gpio_get_value(pinfo->gpios[GPIO_DCD])) if (gpiod_get_value(pinfo->gpios[GPIO_DCD]))
mctrl &= ~TIOCM_CAR; mctrl &= ~TIOCM_CAR;
} }
if (pinfo->gpios[GPIO_RI] >= 0) { if (pinfo->gpios[GPIO_RI]) {
if (!gpio_get_value(pinfo->gpios[GPIO_RI])) if (!gpiod_get_value(pinfo->gpios[GPIO_RI]))
mctrl |= TIOCM_RNG; mctrl |= TIOCM_RNG;
} }
...@@ -1139,6 +1138,7 @@ static int cpm_uart_init_port(struct device_node *np, ...@@ -1139,6 +1138,7 @@ static int cpm_uart_init_port(struct device_node *np,
{ {
const u32 *data; const u32 *data;
void __iomem *mem, *pram; void __iomem *mem, *pram;
struct device *dev = pinfo->port.dev;
int len; int len;
int ret; int ret;
int i; int i;
...@@ -1211,29 +1211,23 @@ static int cpm_uart_init_port(struct device_node *np, ...@@ -1211,29 +1211,23 @@ static int cpm_uart_init_port(struct device_node *np,
} }
for (i = 0; i < NUM_GPIOS; i++) { for (i = 0; i < NUM_GPIOS; i++) {
int gpio; struct gpio_desc *gpiod;
pinfo->gpios[i] = -1; pinfo->gpios[i] = NULL;
gpio = of_get_gpio(np, i); gpiod = devm_gpiod_get_index(dev, NULL, i, GPIOD_ASIS);
if (gpio_is_valid(gpio)) { if (gpiod) {
ret = gpio_request(gpio, "cpm_uart");
if (ret) {
pr_err("can't request gpio #%d: %d\n", i, ret);
continue;
}
if (i == GPIO_RTS || i == GPIO_DTR) if (i == GPIO_RTS || i == GPIO_DTR)
ret = gpio_direction_output(gpio, 0); ret = gpiod_direction_output(gpiod, 0);
else else
ret = gpio_direction_input(gpio); ret = gpiod_direction_input(gpiod);
if (ret) { if (ret) {
pr_err("can't set direction for gpio #%d: %d\n", pr_err("can't set direction for gpio #%d: %d\n",
i, ret); i, ret);
gpio_free(gpio);
continue; continue;
} }
pinfo->gpios[i] = gpio; pinfo->gpios[i] = gpiod;
} }
} }
......
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