omap-serial.c (0fdc50dfab47d525b71a9f0d8310746cdc0c09c5) | omap-serial.c (c150c0f362c1e51c0e3216c9912b85b71d00e70d) |
---|---|
1// SPDX-License-Identifier: GPL-2.0+ 2/* 3 * Driver for OMAP-UART controller. 4 * Based on drivers/serial/8250.c 5 * 6 * Copyright (C) 2010 Texas Instruments. 7 * 8 * Authors: --- 19 unchanged lines hidden (view full) --- 28#include <linux/io.h> 29#include <linux/clk.h> 30#include <linux/serial_core.h> 31#include <linux/irq.h> 32#include <linux/pm_runtime.h> 33#include <linux/pm_wakeirq.h> 34#include <linux/of.h> 35#include <linux/of_irq.h> | 1// SPDX-License-Identifier: GPL-2.0+ 2/* 3 * Driver for OMAP-UART controller. 4 * Based on drivers/serial/8250.c 5 * 6 * Copyright (C) 2010 Texas Instruments. 7 * 8 * Authors: --- 19 unchanged lines hidden (view full) --- 28#include <linux/io.h> 29#include <linux/clk.h> 30#include <linux/serial_core.h> 31#include <linux/irq.h> 32#include <linux/pm_runtime.h> 33#include <linux/pm_wakeirq.h> 34#include <linux/of.h> 35#include <linux/of_irq.h> |
36#include <linux/gpio.h> 37#include <linux/of_gpio.h> | 36#include <linux/gpio/consumer.h> |
38#include <linux/platform_data/serial-omap.h> 39 | 37#include <linux/platform_data/serial-omap.h> 38 |
40#include <dt-bindings/gpio/gpio.h> 41 | |
42#define OMAP_MAX_HSUART_PORTS 10 43 44#define UART_BUILD_REVISION(x, y) (((x) << 8) | (y)) 45 46#define OMAP_UART_REV_42 0x0402 47#define OMAP_UART_REV_46 0x0406 48#define OMAP_UART_REV_52 0x0502 49#define OMAP_UART_REV_63 0x0603 --- 100 unchanged lines hidden (view full) --- 150 unsigned int lsr_break_flag; 151 unsigned char msr_saved_flags; 152 char name[20]; 153 unsigned long port_activity; 154 int context_loss_cnt; 155 u32 errata; 156 u32 features; 157 | 39#define OMAP_MAX_HSUART_PORTS 10 40 41#define UART_BUILD_REVISION(x, y) (((x) << 8) | (y)) 42 43#define OMAP_UART_REV_42 0x0402 44#define OMAP_UART_REV_46 0x0406 45#define OMAP_UART_REV_52 0x0502 46#define OMAP_UART_REV_63 0x0603 --- 100 unchanged lines hidden (view full) --- 147 unsigned int lsr_break_flag; 148 unsigned char msr_saved_flags; 149 char name[20]; 150 unsigned long port_activity; 151 int context_loss_cnt; 152 u32 errata; 153 u32 features; 154 |
158 int rts_gpio; | 155 struct gpio_desc *rts_gpiod; |
159 160 struct pm_qos_request pm_qos_request; 161 u32 latency; 162 u32 calc_latency; 163 struct work_struct qos_work; 164 bool is_suspending; 165}; 166 --- 133 unchanged lines hidden (view full) --- 300 * is fired when TX FIFO is below the trigger level, 301 * disable THR interrupts and toggle the RS-485 GPIO 302 * data direction pin if needed. 303 */ 304 up->scr &= ~OMAP_UART_SCR_TX_EMPTY; 305 serial_out(up, UART_OMAP_SCR, up->scr); 306 res = (port->rs485.flags & SER_RS485_RTS_AFTER_SEND) ? 307 1 : 0; | 156 157 struct pm_qos_request pm_qos_request; 158 u32 latency; 159 u32 calc_latency; 160 struct work_struct qos_work; 161 bool is_suspending; 162}; 163 --- 133 unchanged lines hidden (view full) --- 297 * is fired when TX FIFO is below the trigger level, 298 * disable THR interrupts and toggle the RS-485 GPIO 299 * data direction pin if needed. 300 */ 301 up->scr &= ~OMAP_UART_SCR_TX_EMPTY; 302 serial_out(up, UART_OMAP_SCR, up->scr); 303 res = (port->rs485.flags & SER_RS485_RTS_AFTER_SEND) ? 304 1 : 0; |
308 if (gpio_get_value(up->rts_gpio) != res) { | 305 if (gpiod_get_value(up->rts_gpiod) != res) { |
309 if (port->rs485.delay_rts_after_send > 0) 310 mdelay( 311 port->rs485.delay_rts_after_send); | 306 if (port->rs485.delay_rts_after_send > 0) 307 mdelay( 308 port->rs485.delay_rts_after_send); |
312 gpio_set_value(up->rts_gpio, res); | 309 gpiod_set_value(up->rts_gpiod, res); |
313 } 314 } else { 315 /* We're asked to stop, but there's still stuff in the 316 * UART FIFO, so make sure the THR interrupt is fired 317 * when both TX FIFO and TX shift register are empty. 318 * The next THR interrupt (if no transmission is started 319 * in the meantime) will indicate the end of a 320 * transmission. Therefore we _don't_ disable THR --- 88 unchanged lines hidden (view full) --- 409 /* Handle RS-485 */ 410 if (port->rs485.flags & SER_RS485_ENABLED) { 411 /* Fire THR interrupts when FIFO is below trigger level */ 412 up->scr &= ~OMAP_UART_SCR_TX_EMPTY; 413 serial_out(up, UART_OMAP_SCR, up->scr); 414 415 /* if rts not already enabled */ 416 res = (port->rs485.flags & SER_RS485_RTS_ON_SEND) ? 1 : 0; | 310 } 311 } else { 312 /* We're asked to stop, but there's still stuff in the 313 * UART FIFO, so make sure the THR interrupt is fired 314 * when both TX FIFO and TX shift register are empty. 315 * The next THR interrupt (if no transmission is started 316 * in the meantime) will indicate the end of a 317 * transmission. Therefore we _don't_ disable THR --- 88 unchanged lines hidden (view full) --- 406 /* Handle RS-485 */ 407 if (port->rs485.flags & SER_RS485_ENABLED) { 408 /* Fire THR interrupts when FIFO is below trigger level */ 409 up->scr &= ~OMAP_UART_SCR_TX_EMPTY; 410 serial_out(up, UART_OMAP_SCR, up->scr); 411 412 /* if rts not already enabled */ 413 res = (port->rs485.flags & SER_RS485_RTS_ON_SEND) ? 1 : 0; |
417 if (gpio_get_value(up->rts_gpio) != res) { 418 gpio_set_value(up->rts_gpio, res); | 414 if (gpiod_get_value(up->rts_gpiod) != res) { 415 gpiod_set_value(up->rts_gpiod, res); |
419 if (port->rs485.delay_rts_before_send > 0) 420 mdelay(port->rs485.delay_rts_before_send); 421 } 422 } 423 424 if ((port->rs485.flags & SER_RS485_ENABLED) && 425 !(port->rs485.flags & SER_RS485_RX_DURING_TX)) 426 serial_omap_stop_rx(port); --- 399 unchanged lines hidden (view full) --- 826 dev_pm_clear_wake_irq(up->dev); 827} 828 829static void serial_omap_uart_qos_work(struct work_struct *work) 830{ 831 struct uart_omap_port *up = container_of(work, struct uart_omap_port, 832 qos_work); 833 | 416 if (port->rs485.delay_rts_before_send > 0) 417 mdelay(port->rs485.delay_rts_before_send); 418 } 419 } 420 421 if ((port->rs485.flags & SER_RS485_ENABLED) && 422 !(port->rs485.flags & SER_RS485_RX_DURING_TX)) 423 serial_omap_stop_rx(port); --- 399 unchanged lines hidden (view full) --- 823 dev_pm_clear_wake_irq(up->dev); 824} 825 826static void serial_omap_uart_qos_work(struct work_struct *work) 827{ 828 struct uart_omap_port *up = container_of(work, struct uart_omap_port, 829 qos_work); 830 |
834 pm_qos_update_request(&up->pm_qos_request, up->latency); | 831 cpu_latency_qos_update_request(&up->pm_qos_request, up->latency); |
835} 836 837static void 838serial_omap_set_termios(struct uart_port *port, struct ktermios *termios, 839 struct ktermios *old) 840{ 841 struct uart_omap_port *up = to_uart_omap_port(port); 842 unsigned char cval = 0; --- 568 unchanged lines hidden (view full) --- 1411 1412 /* store new config */ 1413 port->rs485 = *rs485; 1414 1415 /* 1416 * Just as a precaution, only allow rs485 1417 * to be enabled if the gpio pin is valid 1418 */ | 832} 833 834static void 835serial_omap_set_termios(struct uart_port *port, struct ktermios *termios, 836 struct ktermios *old) 837{ 838 struct uart_omap_port *up = to_uart_omap_port(port); 839 unsigned char cval = 0; --- 568 unchanged lines hidden (view full) --- 1408 1409 /* store new config */ 1410 port->rs485 = *rs485; 1411 1412 /* 1413 * Just as a precaution, only allow rs485 1414 * to be enabled if the gpio pin is valid 1415 */ |
1419 if (gpio_is_valid(up->rts_gpio)) { | 1416 if (up->rts_gpiod) { |
1420 /* enable / disable rts */ 1421 val = (port->rs485.flags & SER_RS485_ENABLED) ? 1422 SER_RS485_RTS_AFTER_SEND : SER_RS485_RTS_ON_SEND; 1423 val = (port->rs485.flags & val) ? 1 : 0; | 1417 /* enable / disable rts */ 1418 val = (port->rs485.flags & SER_RS485_ENABLED) ? 1419 SER_RS485_RTS_AFTER_SEND : SER_RS485_RTS_ON_SEND; 1420 val = (port->rs485.flags & val) ? 1 : 0; |
1424 gpio_set_value(up->rts_gpio, val); | 1421 gpiod_set_value(up->rts_gpiod, val); |
1425 } else 1426 port->rs485.flags &= ~SER_RS485_ENABLED; 1427 1428 /* Enable interrupts */ 1429 up->ier = mode; 1430 serial_out(up, UART_IER, up->ier); 1431 1432 /* If RS-485 is disabled, make sure the THR interrupt is fired when --- 160 unchanged lines hidden (view full) --- 1593 &omap_up_info->uartclk); 1594 1595 omap_up_info->flags = UPF_BOOT_AUTOCONF; 1596 1597 return omap_up_info; 1598} 1599 1600static int serial_omap_probe_rs485(struct uart_omap_port *up, | 1422 } else 1423 port->rs485.flags &= ~SER_RS485_ENABLED; 1424 1425 /* Enable interrupts */ 1426 up->ier = mode; 1427 serial_out(up, UART_IER, up->ier); 1428 1429 /* If RS-485 is disabled, make sure the THR interrupt is fired when --- 160 unchanged lines hidden (view full) --- 1590 &omap_up_info->uartclk); 1591 1592 omap_up_info->flags = UPF_BOOT_AUTOCONF; 1593 1594 return omap_up_info; 1595} 1596 1597static int serial_omap_probe_rs485(struct uart_omap_port *up, |
1601 struct device_node *np) | 1598 struct device *dev) |
1602{ 1603 struct serial_rs485 *rs485conf = &up->port.rs485; | 1599{ 1600 struct serial_rs485 *rs485conf = &up->port.rs485; |
1601 struct device_node *np = dev->of_node; 1602 enum gpiod_flags gflags; |
|
1604 int ret; 1605 1606 rs485conf->flags = 0; | 1603 int ret; 1604 1605 rs485conf->flags = 0; |
1607 up->rts_gpio = -EINVAL; | 1606 up->rts_gpiod = NULL; |
1608 1609 if (!np) 1610 return 0; 1611 | 1607 1608 if (!np) 1609 return 0; 1610 |
1612 uart_get_rs485_mode(up->dev, rs485conf); | 1611 ret = uart_get_rs485_mode(&up->port); 1612 if (ret) 1613 return ret; |
1613 1614 if (of_property_read_bool(np, "rs485-rts-active-high")) { 1615 rs485conf->flags |= SER_RS485_RTS_ON_SEND; 1616 rs485conf->flags &= ~SER_RS485_RTS_AFTER_SEND; 1617 } else { 1618 rs485conf->flags &= ~SER_RS485_RTS_ON_SEND; 1619 rs485conf->flags |= SER_RS485_RTS_AFTER_SEND; 1620 } 1621 1622 /* check for tx enable gpio */ | 1614 1615 if (of_property_read_bool(np, "rs485-rts-active-high")) { 1616 rs485conf->flags |= SER_RS485_RTS_ON_SEND; 1617 rs485conf->flags &= ~SER_RS485_RTS_AFTER_SEND; 1618 } else { 1619 rs485conf->flags &= ~SER_RS485_RTS_ON_SEND; 1620 rs485conf->flags |= SER_RS485_RTS_AFTER_SEND; 1621 } 1622 1623 /* check for tx enable gpio */ |
1623 up->rts_gpio = of_get_named_gpio(np, "rts-gpio", 0); 1624 if (gpio_is_valid(up->rts_gpio)) { 1625 ret = devm_gpio_request(up->dev, up->rts_gpio, "omap-serial"); 1626 if (ret < 0) | 1624 gflags = rs485conf->flags & SER_RS485_RTS_AFTER_SEND ? 1625 GPIOD_OUT_HIGH : GPIOD_OUT_LOW; 1626 up->rts_gpiod = devm_gpiod_get_optional(dev, "rts", gflags); 1627 if (IS_ERR(up->rts_gpiod)) { 1628 ret = PTR_ERR(up->rts_gpiod); 1629 if (ret == -EPROBE_DEFER) |
1627 return ret; | 1630 return ret; |
1628 ret = rs485conf->flags & SER_RS485_RTS_AFTER_SEND ? 1 : 0; 1629 ret = gpio_direction_output(up->rts_gpio, ret); 1630 if (ret < 0) 1631 return ret; 1632 } else if (up->rts_gpio == -EPROBE_DEFER) { 1633 return -EPROBE_DEFER; | 1631 /* 1632 * FIXME: the code historically ignored any other error than 1633 * -EPROBE_DEFER and just went on without GPIO. 1634 */ 1635 up->rts_gpiod = NULL; |
1634 } else { | 1636 } else { |
1635 up->rts_gpio = -EINVAL; | 1637 gpiod_set_consumer_name(up->rts_gpiod, "omap-serial"); |
1636 } 1637 1638 return 0; 1639} 1640 1641static int serial_omap_probe(struct platform_device *pdev) 1642{ 1643 struct omap_uart_port_info *omap_up_info = dev_get_platdata(&pdev->dev); --- 56 unchanged lines hidden (view full) --- 1700 goto err_port_line; 1701 } 1702 1703 up->wakeirq = wakeirq; 1704 if (!up->wakeirq) 1705 dev_info(up->port.dev, "no wakeirq for uart%d\n", 1706 up->port.line); 1707 | 1638 } 1639 1640 return 0; 1641} 1642 1643static int serial_omap_probe(struct platform_device *pdev) 1644{ 1645 struct omap_uart_port_info *omap_up_info = dev_get_platdata(&pdev->dev); --- 56 unchanged lines hidden (view full) --- 1702 goto err_port_line; 1703 } 1704 1705 up->wakeirq = wakeirq; 1706 if (!up->wakeirq) 1707 dev_info(up->port.dev, "no wakeirq for uart%d\n", 1708 up->port.line); 1709 |
1708 ret = serial_omap_probe_rs485(up, pdev->dev.of_node); | 1710 ret = serial_omap_probe_rs485(up, &pdev->dev); |
1709 if (ret < 0) 1710 goto err_rs485; 1711 1712 sprintf(up->name, "OMAP UART%d", up->port.line); 1713 up->port.mapbase = mem->start; 1714 up->port.membase = base; 1715 up->port.flags = omap_up_info->flags; 1716 up->port.uartclk = omap_up_info->uartclk; 1717 up->port.rs485_config = serial_omap_config_rs485; 1718 if (!up->port.uartclk) { 1719 up->port.uartclk = DEFAULT_CLK_SPEED; 1720 dev_warn(&pdev->dev, 1721 "No clock speed specified: using default: %d\n", 1722 DEFAULT_CLK_SPEED); 1723 } 1724 | 1711 if (ret < 0) 1712 goto err_rs485; 1713 1714 sprintf(up->name, "OMAP UART%d", up->port.line); 1715 up->port.mapbase = mem->start; 1716 up->port.membase = base; 1717 up->port.flags = omap_up_info->flags; 1718 up->port.uartclk = omap_up_info->uartclk; 1719 up->port.rs485_config = serial_omap_config_rs485; 1720 if (!up->port.uartclk) { 1721 up->port.uartclk = DEFAULT_CLK_SPEED; 1722 dev_warn(&pdev->dev, 1723 "No clock speed specified: using default: %d\n", 1724 DEFAULT_CLK_SPEED); 1725 } 1726 |
1725 up->latency = PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE; 1726 up->calc_latency = PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE; 1727 pm_qos_add_request(&up->pm_qos_request, 1728 PM_QOS_CPU_DMA_LATENCY, up->latency); | 1727 up->latency = PM_QOS_CPU_LATENCY_DEFAULT_VALUE; 1728 up->calc_latency = PM_QOS_CPU_LATENCY_DEFAULT_VALUE; 1729 cpu_latency_qos_add_request(&up->pm_qos_request, up->latency); |
1729 INIT_WORK(&up->qos_work, serial_omap_uart_qos_work); 1730 1731 platform_set_drvdata(pdev, up); 1732 if (omap_up_info->autosuspend_timeout == 0) 1733 omap_up_info->autosuspend_timeout = -1; 1734 1735 device_init_wakeup(up->dev, true); 1736 pm_runtime_use_autosuspend(&pdev->dev); --- 17 unchanged lines hidden (view full) --- 1754 pm_runtime_mark_last_busy(up->dev); 1755 pm_runtime_put_autosuspend(up->dev); 1756 return 0; 1757 1758err_add_port: 1759 pm_runtime_dont_use_autosuspend(&pdev->dev); 1760 pm_runtime_put_sync(&pdev->dev); 1761 pm_runtime_disable(&pdev->dev); | 1730 INIT_WORK(&up->qos_work, serial_omap_uart_qos_work); 1731 1732 platform_set_drvdata(pdev, up); 1733 if (omap_up_info->autosuspend_timeout == 0) 1734 omap_up_info->autosuspend_timeout = -1; 1735 1736 device_init_wakeup(up->dev, true); 1737 pm_runtime_use_autosuspend(&pdev->dev); --- 17 unchanged lines hidden (view full) --- 1755 pm_runtime_mark_last_busy(up->dev); 1756 pm_runtime_put_autosuspend(up->dev); 1757 return 0; 1758 1759err_add_port: 1760 pm_runtime_dont_use_autosuspend(&pdev->dev); 1761 pm_runtime_put_sync(&pdev->dev); 1762 pm_runtime_disable(&pdev->dev); |
1762 pm_qos_remove_request(&up->pm_qos_request); | 1763 cpu_latency_qos_remove_request(&up->pm_qos_request); |
1763 device_init_wakeup(up->dev, false); 1764err_rs485: 1765err_port_line: 1766 return ret; 1767} 1768 1769static int serial_omap_remove(struct platform_device *dev) 1770{ 1771 struct uart_omap_port *up = platform_get_drvdata(dev); 1772 1773 pm_runtime_get_sync(up->dev); 1774 1775 uart_remove_one_port(&serial_omap_reg, &up->port); 1776 1777 pm_runtime_dont_use_autosuspend(up->dev); 1778 pm_runtime_put_sync(up->dev); 1779 pm_runtime_disable(up->dev); | 1764 device_init_wakeup(up->dev, false); 1765err_rs485: 1766err_port_line: 1767 return ret; 1768} 1769 1770static int serial_omap_remove(struct platform_device *dev) 1771{ 1772 struct uart_omap_port *up = platform_get_drvdata(dev); 1773 1774 pm_runtime_get_sync(up->dev); 1775 1776 uart_remove_one_port(&serial_omap_reg, &up->port); 1777 1778 pm_runtime_dont_use_autosuspend(up->dev); 1779 pm_runtime_put_sync(up->dev); 1780 pm_runtime_disable(up->dev); |
1780 pm_qos_remove_request(&up->pm_qos_request); | 1781 cpu_latency_qos_remove_request(&up->pm_qos_request); |
1781 device_init_wakeup(&dev->dev, false); 1782 1783 return 0; 1784} 1785 1786/* 1787 * Work Around for Errata i202 (2430, 3430, 3630, 4430 and 4460) 1788 * The access to uart register after MDR1 Access --- 75 unchanged lines hidden (view full) --- 1864 if (up->is_suspending && !console_suspend_enabled && 1865 uart_console(&up->port)) 1866 return -EBUSY; 1867 1868 up->context_loss_cnt = serial_omap_get_context_loss_count(up); 1869 1870 serial_omap_enable_wakeup(up, true); 1871 | 1782 device_init_wakeup(&dev->dev, false); 1783 1784 return 0; 1785} 1786 1787/* 1788 * Work Around for Errata i202 (2430, 3430, 3630, 4430 and 4460) 1789 * The access to uart register after MDR1 Access --- 75 unchanged lines hidden (view full) --- 1865 if (up->is_suspending && !console_suspend_enabled && 1866 uart_console(&up->port)) 1867 return -EBUSY; 1868 1869 up->context_loss_cnt = serial_omap_get_context_loss_count(up); 1870 1871 serial_omap_enable_wakeup(up, true); 1872 |
1872 up->latency = PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE; | 1873 up->latency = PM_QOS_CPU_LATENCY_DEFAULT_VALUE; |
1873 schedule_work(&up->qos_work); 1874 1875 return 0; 1876} 1877 1878static int serial_omap_runtime_resume(struct device *dev) 1879{ 1880 struct uart_omap_port *up = dev_get_drvdata(dev); --- 72 unchanged lines hidden --- | 1874 schedule_work(&up->qos_work); 1875 1876 return 0; 1877} 1878 1879static int serial_omap_runtime_resume(struct device *dev) 1880{ 1881 struct uart_omap_port *up = dev_get_drvdata(dev); --- 72 unchanged lines hidden --- |