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: Linus Walleij <linus.walleij@linaro.org> Link: https://lore.kernel.org/r/20200229231842.247563-1-linus.walleij@linaro.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
8145e85f82
commit
97cbaf2c82
@ -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 {
|
|||||||
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 @@
|
|||||||
#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)
|
|||||||
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)
|
|||||||
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,
|
|||||||
{
|
{
|
||||||
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,
|
|||||||
}
|
}
|
||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user