mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 10:31:46 +09:00
serial: omap: do not override settings for RS485 support
commit 51f93776b84dee23e44a7be880736669a01cec2b upstream.
The drivers RS485 support is deactivated if there is no RTS GPIO available.
This is done by nullifying the ports rs485_supported struct. After that
however the settings in serial_omap_rs485_supported are assigned to the
same structure unconditionally, which results in an unintended reactivation
of RS485 support.
Fix this by moving the assignment to the beginning of
serial_omap_probe_rs485() and thus before uart_get_rs485_mode() gets
called.
Also replace the assignment of rs485_config() to have the complete RS485
setup in one function.
Fixes: e2752ae3cf ("serial: omap: Disallow RS-485 if rts-gpio is not specified")
Cc: <stable@vger.kernel.org>
Signed-off-by: Lino Sanfilippo <l.sanfilippo@kunbus.com>
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Link: https://lore.kernel.org/r/20240103061818.564-7-l.sanfilippo@kunbus.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
b5a2232ba8
commit
a71776bbd8
@@ -1512,6 +1512,13 @@ static struct omap_uart_port_info *of_get_uart_port_info(struct device *dev)
|
|||||||
return omap_up_info;
|
return omap_up_info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const struct serial_rs485 serial_omap_rs485_supported = {
|
||||||
|
.flags = SER_RS485_ENABLED | SER_RS485_RTS_ON_SEND | SER_RS485_RTS_AFTER_SEND |
|
||||||
|
SER_RS485_RX_DURING_TX,
|
||||||
|
.delay_rts_before_send = 1,
|
||||||
|
.delay_rts_after_send = 1,
|
||||||
|
};
|
||||||
|
|
||||||
static int serial_omap_probe_rs485(struct uart_omap_port *up,
|
static int serial_omap_probe_rs485(struct uart_omap_port *up,
|
||||||
struct device *dev)
|
struct device *dev)
|
||||||
{
|
{
|
||||||
@@ -1526,6 +1533,9 @@ static int serial_omap_probe_rs485(struct uart_omap_port *up,
|
|||||||
if (!np)
|
if (!np)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
up->port.rs485_config = serial_omap_config_rs485;
|
||||||
|
up->port.rs485_supported = serial_omap_rs485_supported;
|
||||||
|
|
||||||
ret = uart_get_rs485_mode(&up->port);
|
ret = uart_get_rs485_mode(&up->port);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
@@ -1560,13 +1570,6 @@ static int serial_omap_probe_rs485(struct uart_omap_port *up,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct serial_rs485 serial_omap_rs485_supported = {
|
|
||||||
.flags = SER_RS485_ENABLED | SER_RS485_RTS_ON_SEND | SER_RS485_RTS_AFTER_SEND |
|
|
||||||
SER_RS485_RX_DURING_TX,
|
|
||||||
.delay_rts_before_send = 1,
|
|
||||||
.delay_rts_after_send = 1,
|
|
||||||
};
|
|
||||||
|
|
||||||
static int serial_omap_probe(struct platform_device *pdev)
|
static int serial_omap_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct omap_uart_port_info *omap_up_info = dev_get_platdata(&pdev->dev);
|
struct omap_uart_port_info *omap_up_info = dev_get_platdata(&pdev->dev);
|
||||||
@@ -1634,17 +1637,11 @@ static int serial_omap_probe(struct platform_device *pdev)
|
|||||||
dev_info(up->port.dev, "no wakeirq for uart%d\n",
|
dev_info(up->port.dev, "no wakeirq for uart%d\n",
|
||||||
up->port.line);
|
up->port.line);
|
||||||
|
|
||||||
ret = serial_omap_probe_rs485(up, &pdev->dev);
|
|
||||||
if (ret < 0)
|
|
||||||
goto err_rs485;
|
|
||||||
|
|
||||||
sprintf(up->name, "OMAP UART%d", up->port.line);
|
sprintf(up->name, "OMAP UART%d", up->port.line);
|
||||||
up->port.mapbase = mem->start;
|
up->port.mapbase = mem->start;
|
||||||
up->port.membase = base;
|
up->port.membase = base;
|
||||||
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_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,
|
||||||
@@ -1652,6 +1649,10 @@ static int serial_omap_probe(struct platform_device *pdev)
|
|||||||
DEFAULT_CLK_SPEED);
|
DEFAULT_CLK_SPEED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret = serial_omap_probe_rs485(up, &pdev->dev);
|
||||||
|
if (ret < 0)
|
||||||
|
goto err_rs485;
|
||||||
|
|
||||||
up->latency = PM_QOS_CPU_LATENCY_DEFAULT_VALUE;
|
up->latency = PM_QOS_CPU_LATENCY_DEFAULT_VALUE;
|
||||||
up->calc_latency = PM_QOS_CPU_LATENCY_DEFAULT_VALUE;
|
up->calc_latency = PM_QOS_CPU_LATENCY_DEFAULT_VALUE;
|
||||||
cpu_latency_qos_add_request(&up->pm_qos_request, up->latency);
|
cpu_latency_qos_add_request(&up->pm_qos_request, up->latency);
|
||||||
|
|||||||
Reference in New Issue
Block a user