提交 0139da50 编写于 作者: I Ilpo Järvinen 提交者: Greg Kroah-Hartman

serial: Embed rs485_supported to uart_port

Embed rs485_supported to uart_port to allow serial core to tweak it as
needed.
Reviewed-by: NLino Sanfilippo <l.sanfilippo@kunbus.com>
Signed-off-by: NIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Link: https://lore.kernel.org/r/20220704094515.6831-2-ilpo.jarvinen@linux.intel.comSigned-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
上级 60b21490
...@@ -108,7 +108,7 @@ static int bcm2835aux_serial_probe(struct platform_device *pdev) ...@@ -108,7 +108,7 @@ static int bcm2835aux_serial_probe(struct platform_device *pdev)
up.port.flags = UPF_SHARE_IRQ | UPF_FIXED_PORT | UPF_FIXED_TYPE | up.port.flags = UPF_SHARE_IRQ | UPF_FIXED_PORT | UPF_FIXED_TYPE |
UPF_SKIP_TEST | UPF_IOREMAP; UPF_SKIP_TEST | UPF_IOREMAP;
up.port.rs485_config = serial8250_em485_config; up.port.rs485_config = serial8250_em485_config;
up.port.rs485_supported = &serial8250_em485_supported; up.port.rs485_supported = serial8250_em485_supported;
up.rs485_start_tx = bcm2835aux_rs485_start_tx; up.rs485_start_tx = bcm2835aux_rs485_start_tx;
up.rs485_stop_tx = bcm2835aux_rs485_stop_tx; up.rs485_stop_tx = bcm2835aux_rs485_stop_tx;
......
...@@ -255,10 +255,10 @@ void dw8250_setup_port(struct uart_port *p) ...@@ -255,10 +255,10 @@ void dw8250_setup_port(struct uart_port *p)
if (pd->hw_rs485_support) { if (pd->hw_rs485_support) {
p->rs485_config = dw8250_rs485_config; p->rs485_config = dw8250_rs485_config;
up->lsr_save_mask = LSR_SAVE_FLAGS | DW_UART_LSR_ADDR_RCVD; up->lsr_save_mask = LSR_SAVE_FLAGS | DW_UART_LSR_ADDR_RCVD;
p->rs485_supported = &dw8250_rs485_supported; p->rs485_supported = dw8250_rs485_supported;
} else { } else {
p->rs485_config = serial8250_em485_config; p->rs485_config = serial8250_em485_config;
p->rs485_supported = &serial8250_em485_supported; p->rs485_supported = serial8250_em485_supported;
up->rs485_start_tx = serial8250_em485_start_tx; up->rs485_start_tx = serial8250_em485_start_tx;
up->rs485_stop_tx = serial8250_em485_stop_tx; up->rs485_stop_tx = serial8250_em485_stop_tx;
} }
......
...@@ -550,7 +550,7 @@ pci_xr17v35x_setup(struct exar8250 *priv, struct pci_dev *pcidev, ...@@ -550,7 +550,7 @@ pci_xr17v35x_setup(struct exar8250 *priv, struct pci_dev *pcidev,
port->port.uartclk = baud * 16; port->port.uartclk = baud * 16;
port->port.rs485_config = platform->rs485_config; port->port.rs485_config = platform->rs485_config;
port->port.rs485_supported = platform->rs485_supported; port->port.rs485_supported = *(platform->rs485_supported);
/* /*
* Setup the UART clock for the devices on expansion slot to * Setup the UART clock for the devices on expansion slot to
......
...@@ -433,9 +433,9 @@ static void fintek_8250_set_rs485_handler(struct uart_8250_port *uart) ...@@ -433,9 +433,9 @@ static void fintek_8250_set_rs485_handler(struct uart_8250_port *uart)
case CHIP_ID_F81865: case CHIP_ID_F81865:
uart->port.rs485_config = fintek_8250_rs485_config; uart->port.rs485_config = fintek_8250_rs485_config;
if (!pdata->index) if (!pdata->index)
uart->port.rs485_supported = &fintek_8250_rs485_supported_port0; uart->port.rs485_supported = fintek_8250_rs485_supported_port0;
else else
uart->port.rs485_supported = &fintek_8250_rs485_supported; uart->port.rs485_supported = fintek_8250_rs485_supported;
break; break;
default: /* No RS485 Auto direction functional */ default: /* No RS485 Auto direction functional */
......
...@@ -161,7 +161,7 @@ static int lpc18xx_serial_probe(struct platform_device *pdev) ...@@ -161,7 +161,7 @@ static int lpc18xx_serial_probe(struct platform_device *pdev)
uart.port.uartclk = clk_get_rate(data->clk_uart); uart.port.uartclk = clk_get_rate(data->clk_uart);
uart.port.private_data = data; uart.port.private_data = data;
uart.port.rs485_config = lpc18xx_rs485_config; uart.port.rs485_config = lpc18xx_rs485_config;
uart.port.rs485_supported = &lpc18xx_rs485_supported; uart.port.rs485_supported = lpc18xx_rs485_supported;
uart.port.serial_out = lpc18xx_uart_serial_out; uart.port.serial_out = lpc18xx_uart_serial_out;
uart.dma = &data->dma; uart.dma = &data->dma;
......
...@@ -165,7 +165,7 @@ static int of_platform_serial_setup(struct platform_device *ofdev, ...@@ -165,7 +165,7 @@ static int of_platform_serial_setup(struct platform_device *ofdev,
port->dev = &ofdev->dev; port->dev = &ofdev->dev;
port->rs485_config = serial8250_em485_config; port->rs485_config = serial8250_em485_config;
port->rs485_supported = &serial8250_em485_supported; port->rs485_supported = serial8250_em485_supported;
up->rs485_start_tx = serial8250_em485_start_tx; up->rs485_start_tx = serial8250_em485_start_tx;
up->rs485_stop_tx = serial8250_em485_stop_tx; up->rs485_stop_tx = serial8250_em485_stop_tx;
......
...@@ -1607,7 +1607,7 @@ static int pci_fintek_setup(struct serial_private *priv, ...@@ -1607,7 +1607,7 @@ static int pci_fintek_setup(struct serial_private *priv,
port->port.iotype = UPIO_PORT; port->port.iotype = UPIO_PORT;
port->port.iobase = iobase; port->port.iobase = iobase;
port->port.rs485_config = pci_fintek_rs485_config; port->port.rs485_config = pci_fintek_rs485_config;
port->port.rs485_supported = &pci_fintek_rs485_supported; port->port.rs485_supported = pci_fintek_rs485_supported;
data = devm_kzalloc(&pdev->dev, sizeof(u8), GFP_KERNEL); data = devm_kzalloc(&pdev->dev, sizeof(u8), GFP_KERNEL);
if (!data) if (!data)
......
...@@ -2779,7 +2779,7 @@ static int pl011_probe(struct amba_device *dev, const struct amba_id *id) ...@@ -2779,7 +2779,7 @@ static int pl011_probe(struct amba_device *dev, const struct amba_id *id)
uap->port.irq = dev->irq[0]; uap->port.irq = dev->irq[0];
uap->port.ops = &amba_pl011_pops; uap->port.ops = &amba_pl011_pops;
uap->port.rs485_config = pl011_rs485_config; uap->port.rs485_config = pl011_rs485_config;
uap->port.rs485_supported = &pl011_rs485_supported; uap->port.rs485_supported = pl011_rs485_supported;
snprintf(uap->type, sizeof(uap->type), "PL011 rev%u", amba_rev(dev)); snprintf(uap->type, sizeof(uap->type), "PL011 rev%u", amba_rev(dev));
ret = pl011_setup_port(&dev->dev, uap, &dev->res, portnr); ret = pl011_setup_port(&dev->dev, uap, &dev->res, portnr);
......
...@@ -778,7 +778,7 @@ static int ar933x_uart_probe(struct platform_device *pdev) ...@@ -778,7 +778,7 @@ static int ar933x_uart_probe(struct platform_device *pdev)
port->fifosize = AR933X_UART_FIFO_SIZE; port->fifosize = AR933X_UART_FIFO_SIZE;
port->ops = &ar933x_uart_ops; port->ops = &ar933x_uart_ops;
port->rs485_config = ar933x_config_rs485; port->rs485_config = ar933x_config_rs485;
port->rs485_supported = &ar933x_rs485_supported; port->rs485_supported = ar933x_rs485_supported;
baud = ar933x_uart_get_baud(port->uartclk, AR933X_UART_MAX_SCALE, 1); baud = ar933x_uart_get_baud(port->uartclk, AR933X_UART_MAX_SCALE, 1);
up->min_baud = max_t(unsigned int, baud, AR933X_UART_MIN_BAUD); up->min_baud = max_t(unsigned int, baud, AR933X_UART_MIN_BAUD);
...@@ -802,7 +802,7 @@ static int ar933x_uart_probe(struct platform_device *pdev) ...@@ -802,7 +802,7 @@ static int ar933x_uart_probe(struct platform_device *pdev)
!up->rts_gpiod) { !up->rts_gpiod) {
dev_err(&pdev->dev, "lacking rts-gpio, disabling RS485\n"); dev_err(&pdev->dev, "lacking rts-gpio, disabling RS485\n");
port->rs485.flags &= ~SER_RS485_ENABLED; port->rs485.flags &= ~SER_RS485_ENABLED;
port->rs485_supported = &ar933x_no_rs485; port->rs485_supported = ar933x_no_rs485;
} }
#ifdef CONFIG_SERIAL_AR933X_CONSOLE #ifdef CONFIG_SERIAL_AR933X_CONSOLE
......
...@@ -2498,7 +2498,7 @@ static int atmel_init_port(struct atmel_uart_port *atmel_port, ...@@ -2498,7 +2498,7 @@ static int atmel_init_port(struct atmel_uart_port *atmel_port,
port->mapbase = mpdev->resource[0].start; port->mapbase = mpdev->resource[0].start;
port->irq = platform_get_irq(mpdev, 0); port->irq = platform_get_irq(mpdev, 0);
port->rs485_config = atmel_config_rs485; port->rs485_config = atmel_config_rs485;
port->rs485_supported = &atmel_rs485_supported; port->rs485_supported = atmel_rs485_supported;
port->iso7816_config = atmel_config_iso7816; port->iso7816_config = atmel_config_iso7816;
port->membase = NULL; port->membase = NULL;
......
...@@ -2655,7 +2655,7 @@ static int lpuart_probe(struct platform_device *pdev) ...@@ -2655,7 +2655,7 @@ static int lpuart_probe(struct platform_device *pdev)
sport->port.rs485_config = lpuart32_config_rs485; sport->port.rs485_config = lpuart32_config_rs485;
else else
sport->port.rs485_config = lpuart_config_rs485; sport->port.rs485_config = lpuart_config_rs485;
sport->port.rs485_supported = &lpuart_rs485_supported; sport->port.rs485_supported = lpuart_rs485_supported;
sport->ipg_clk = devm_clk_get(&pdev->dev, "ipg"); sport->ipg_clk = devm_clk_get(&pdev->dev, "ipg");
if (IS_ERR(sport->ipg_clk)) { if (IS_ERR(sport->ipg_clk)) {
......
...@@ -2285,9 +2285,9 @@ static int imx_uart_probe(struct platform_device *pdev) ...@@ -2285,9 +2285,9 @@ static int imx_uart_probe(struct platform_device *pdev)
sport->port.rs485_config = imx_uart_rs485_config; sport->port.rs485_config = imx_uart_rs485_config;
/* RTS is required to control the RS485 transmitter */ /* RTS is required to control the RS485 transmitter */
if (sport->have_rtscts || sport->have_rtsgpio) if (sport->have_rtscts || sport->have_rtsgpio)
sport->port.rs485_supported = &imx_rs485_supported; sport->port.rs485_supported = imx_rs485_supported;
else else
sport->port.rs485_supported = &imx_no_rs485; sport->port.rs485_supported = imx_no_rs485;
sport->port.flags = UPF_BOOT_AUTOCONF; sport->port.flags = UPF_BOOT_AUTOCONF;
timer_setup(&sport->timer, imx_uart_timeout, 0); timer_setup(&sport->timer, imx_uart_timeout, 0);
......
...@@ -1370,7 +1370,7 @@ static int max310x_probe(struct device *dev, const struct max310x_devtype *devty ...@@ -1370,7 +1370,7 @@ static int max310x_probe(struct device *dev, const struct max310x_devtype *devty
s->p[i].port.membase = (void __iomem *)~0; s->p[i].port.membase = (void __iomem *)~0;
s->p[i].port.uartclk = uartclk; s->p[i].port.uartclk = uartclk;
s->p[i].port.rs485_config = max310x_rs485_config; s->p[i].port.rs485_config = max310x_rs485_config;
s->p[i].port.rs485_supported = &max310x_rs485_supported; s->p[i].port.rs485_supported = max310x_rs485_supported;
s->p[i].port.ops = &max310x_ops; s->p[i].port.ops = &max310x_ops;
s->p[i].regmap = regmaps[i]; s->p[i].regmap = regmaps[i];
......
...@@ -506,7 +506,7 @@ int __init early_mcf_setup(struct mcf_platform_uart *platp) ...@@ -506,7 +506,7 @@ int __init early_mcf_setup(struct mcf_platform_uart *platp)
port->uartclk = MCF_BUSCLK; port->uartclk = MCF_BUSCLK;
port->flags = UPF_BOOT_AUTOCONF; port->flags = UPF_BOOT_AUTOCONF;
port->rs485_config = mcf_config_rs485; port->rs485_config = mcf_config_rs485;
port->rs485_supported = &mcf_rs485_supported; port->rs485_supported = mcf_rs485_supported;
port->ops = &mcf_uart_ops; port->ops = &mcf_uart_ops;
} }
...@@ -634,7 +634,7 @@ static int mcf_probe(struct platform_device *pdev) ...@@ -634,7 +634,7 @@ static int mcf_probe(struct platform_device *pdev)
port->ops = &mcf_uart_ops; port->ops = &mcf_uart_ops;
port->flags = UPF_BOOT_AUTOCONF; port->flags = UPF_BOOT_AUTOCONF;
port->rs485_config = mcf_config_rs485; port->rs485_config = mcf_config_rs485;
port->rs485_supported = &mcf_rs485_supported; port->rs485_supported = mcf_rs485_supported;
port->has_sysrq = IS_ENABLED(CONFIG_SERIAL_MCF_CONSOLE); port->has_sysrq = IS_ENABLED(CONFIG_SERIAL_MCF_CONSOLE);
uart_add_one_port(&mcf_driver, port); uart_add_one_port(&mcf_driver, port);
......
...@@ -1643,7 +1643,7 @@ static int serial_omap_probe(struct platform_device *pdev) ...@@ -1643,7 +1643,7 @@ static int serial_omap_probe(struct platform_device *pdev)
up->port.flags = omap_up_info->flags; up->port.flags = omap_up_info->flags;
up->port.uartclk = omap_up_info->uartclk; up->port.uartclk = omap_up_info->uartclk;
up->port.rs485_config = serial_omap_config_rs485; up->port.rs485_config = serial_omap_config_rs485;
up->port.rs485_supported = &serial_omap_rs485_supported; up->port.rs485_supported = serial_omap_rs485_supported;
if (!up->port.uartclk) { if (!up->port.uartclk) {
up->port.uartclk = DEFAULT_CLK_SPEED; up->port.uartclk = DEFAULT_CLK_SPEED;
dev_warn(&pdev->dev, dev_warn(&pdev->dev,
......
...@@ -1461,7 +1461,7 @@ static int sc16is7xx_probe(struct device *dev, ...@@ -1461,7 +1461,7 @@ static int sc16is7xx_probe(struct device *dev,
s->p[i].port.iotype = UPIO_PORT; s->p[i].port.iotype = UPIO_PORT;
s->p[i].port.uartclk = freq; s->p[i].port.uartclk = freq;
s->p[i].port.rs485_config = sc16is7xx_config_rs485; s->p[i].port.rs485_config = sc16is7xx_config_rs485;
s->p[i].port.rs485_supported = &sc16is7xx_rs485_supported; s->p[i].port.rs485_supported = sc16is7xx_rs485_supported;
s->p[i].port.ops = &sc16is7xx_ops; s->p[i].port.ops = &sc16is7xx_ops;
s->p[i].old_mctrl = 0; s->p[i].old_mctrl = 0;
s->p[i].port.line = sc16is7xx_alloc_line(); s->p[i].port.line = sc16is7xx_alloc_line();
......
...@@ -1285,7 +1285,7 @@ static int uart_check_rs485_flags(struct uart_port *port, struct serial_rs485 *r ...@@ -1285,7 +1285,7 @@ static int uart_check_rs485_flags(struct uart_port *port, struct serial_rs485 *r
* For any bit outside of the legacy ones that is not supported by * For any bit outside of the legacy ones that is not supported by
* the driver, return -EINVAL. * the driver, return -EINVAL.
*/ */
if (flags & ~port->rs485_supported->flags) if (flags & ~port->rs485_supported.flags)
return -EINVAL; return -EINVAL;
/* Asking for address w/o addressing mode? */ /* Asking for address w/o addressing mode? */
...@@ -1304,7 +1304,7 @@ static int uart_check_rs485_flags(struct uart_port *port, struct serial_rs485 *r ...@@ -1304,7 +1304,7 @@ static int uart_check_rs485_flags(struct uart_port *port, struct serial_rs485 *r
static void uart_sanitize_serial_rs485(struct uart_port *port, struct serial_rs485 *rs485) static void uart_sanitize_serial_rs485(struct uart_port *port, struct serial_rs485 *rs485)
{ {
u32 supported_flags = port->rs485_supported->flags; u32 supported_flags = port->rs485_supported.flags;
if (!(rs485->flags & SER_RS485_ENABLED)) { if (!(rs485->flags & SER_RS485_ENABLED)) {
memset(rs485, 0, sizeof(*rs485)); memset(rs485, 0, sizeof(*rs485));
...@@ -1323,7 +1323,7 @@ static void uart_sanitize_serial_rs485(struct uart_port *port, struct serial_rs4 ...@@ -1323,7 +1323,7 @@ static void uart_sanitize_serial_rs485(struct uart_port *port, struct serial_rs4
supported_flags |= SER_RS485_RTS_ON_SEND|SER_RS485_RTS_AFTER_SEND; supported_flags |= SER_RS485_RTS_ON_SEND|SER_RS485_RTS_AFTER_SEND;
} }
if (!port->rs485_supported->delay_rts_before_send) { if (!port->rs485_supported.delay_rts_before_send) {
if (rs485->delay_rts_before_send) { if (rs485->delay_rts_before_send) {
dev_warn_ratelimited(port->dev, dev_warn_ratelimited(port->dev,
"%s (%d): RTS delay before sending not supported\n", "%s (%d): RTS delay before sending not supported\n",
...@@ -1337,7 +1337,7 @@ static void uart_sanitize_serial_rs485(struct uart_port *port, struct serial_rs4 ...@@ -1337,7 +1337,7 @@ static void uart_sanitize_serial_rs485(struct uart_port *port, struct serial_rs4
port->name, port->line, rs485->delay_rts_before_send); port->name, port->line, rs485->delay_rts_before_send);
} }
if (!port->rs485_supported->delay_rts_after_send) { if (!port->rs485_supported.delay_rts_after_send) {
if (rs485->delay_rts_after_send) { if (rs485->delay_rts_after_send) {
dev_warn_ratelimited(port->dev, dev_warn_ratelimited(port->dev,
"%s (%d): RTS delay after sending not supported\n", "%s (%d): RTS delay after sending not supported\n",
......
...@@ -1401,7 +1401,7 @@ static int stm32_usart_init_port(struct stm32_port *stm32port, ...@@ -1401,7 +1401,7 @@ static int stm32_usart_init_port(struct stm32_port *stm32port,
port->has_sysrq = IS_ENABLED(CONFIG_SERIAL_STM32_CONSOLE); port->has_sysrq = IS_ENABLED(CONFIG_SERIAL_STM32_CONSOLE);
port->irq = irq; port->irq = irq;
port->rs485_config = stm32_usart_config_rs485; port->rs485_config = stm32_usart_config_rs485;
port->rs485_supported = &stm32_rs485_supported; port->rs485_supported = stm32_rs485_supported;
ret = stm32_usart_init_rs485(port, pdev); ret = stm32_usart_init_rs485(port, pdev);
if (ret) if (ret)
......
...@@ -255,7 +255,7 @@ struct uart_port { ...@@ -255,7 +255,7 @@ struct uart_port {
struct attribute_group *attr_group; /* port specific attributes */ struct attribute_group *attr_group; /* port specific attributes */
const struct attribute_group **tty_groups; /* all attributes (serial core use only) */ const struct attribute_group **tty_groups; /* all attributes (serial core use only) */
struct serial_rs485 rs485; struct serial_rs485 rs485;
const struct serial_rs485 *rs485_supported; /* Supported mask for serial_rs485 */ struct serial_rs485 rs485_supported; /* Supported mask for serial_rs485 */
struct gpio_desc *rs485_term_gpio; /* enable RS485 bus termination */ struct gpio_desc *rs485_term_gpio; /* enable RS485 bus termination */
struct serial_iso7816 iso7816; struct serial_iso7816 iso7816;
void *private_data; /* generic platform data pointer */ void *private_data; /* generic platform data pointer */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册