mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-27 22:24:11 +08:00
TTY/Serial driver update for 6.1-rc1
Here is the big set of TTY and Serial driver updates for 6.1-rc1. Lots of cleanups in here, no real new functionality this time around, with the diffstat being that we removed more lines than we added! Included in here are: - termios unification cleanups from Al Viro, it's nice to finally get this work done - tty serial transmit cleanups in various drivers in preparation for more cleanup and unification in future releases (that work was not ready for this release.) - n_gsm fixes and updates - ktermios cleanups and code reductions - dt bindings json conversions and updates for new devices - some serial driver updates for new devices - lots of other tiny cleanups and janitorial stuff. Full details in the shortlog. All of these have been in linux-next for a while with no reported issues. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- iG0EABECAC0WIQT0tgzFv3jCIUoxPcsxR9QN2y37KQUCY0BSdA8cZ3JlZ0Brcm9h aC5jb20ACgkQMUfUDdst+ylucQCfaXIrYuh2AHcb6+G+Nqp1xD2BYaEAoIdLyOCA a2yziLrDF6us2oav6j4x =Wv+X -----END PGP SIGNATURE----- Merge tag 'tty-6.1-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty Pull tty/serial driver updates from Greg KH: "Here is the big set of TTY and Serial driver updates for 6.1-rc1. Lots of cleanups in here, no real new functionality this time around, with the diffstat being that we removed more lines than we added! Included in here are: - termios unification cleanups from Al Viro, it's nice to finally get this work done - tty serial transmit cleanups in various drivers in preparation for more cleanup and unification in future releases (that work was not ready for this release) - n_gsm fixes and updates - ktermios cleanups and code reductions - dt bindings json conversions and updates for new devices - some serial driver updates for new devices - lots of other tiny cleanups and janitorial stuff. Full details in the shortlog. All of these have been in linux-next for a while with no reported issues" * tag 'tty-6.1-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty: (102 commits) serial: cpm_uart: Don't request IRQ too early for console port tty: serial: do unlock on a common path in altera_jtaguart_console_putc() tty: serial: unify TX space reads under altera_jtaguart_tx_space() tty: serial: use FIELD_GET() in lqasc_tx_ready() tty: serial: extend lqasc_tx_ready() to lqasc_console_putchar() tty: serial: allow pxa.c to be COMPILE_TESTed serial: stm32: Fix unused-variable warning tty: serial: atmel: Add COMMON_CLK dependency to SERIAL_ATMEL serial: 8250: Fix restoring termios speed after suspend serial: Deassert Transmit Enable on probe in driver-specific way serial: 8250_dma: Convert to use uart_xmit_advance() serial: 8250_omap: Convert to use uart_xmit_advance() MAINTAINERS: Solve warning regarding inexistent atmel-usart binding serial: stm32: Deassert Transmit Enable on ->rs485_config() serial: ar933x: Deassert Transmit Enable on ->rs485_config() tty: serial: atmel: Use FIELD_PREP/FIELD_GET tty: serial: atmel: Make the driver aware of the existence of GCLK tty: serial: atmel: Only divide Clock Divisor if the IP is USART tty: serial: atmel: Separate mode clearing between UART and USART dt-bindings: serial: atmel,at91-usart: Add gclk as a possible USART clock ...
This commit is contained in:
commit
6181073dd6
@ -1,98 +0,0 @@
|
||||
* Atmel Universal Synchronous Asynchronous Receiver/Transmitter (USART)
|
||||
|
||||
Required properties for USART:
|
||||
- compatible: Should be one of the following:
|
||||
- "atmel,at91rm9200-usart"
|
||||
- "atmel,at91sam9260-usart"
|
||||
- "microchip,sam9x60-usart"
|
||||
- "atmel,at91rm9200-dbgu", "atmel,at91rm9200-usart"
|
||||
- "atmel,at91sam9260-dbgu", "atmel,at91sam9260-usart"
|
||||
- "microchip,sam9x60-dbgu", "microchip,sam9x60-usart"
|
||||
- reg: Should contain registers location and length
|
||||
- interrupts: Should contain interrupt
|
||||
- clock-names: tuple listing input clock names.
|
||||
Required elements: "usart"
|
||||
- clocks: phandles to input clocks.
|
||||
|
||||
Required properties for USART in SPI mode:
|
||||
- #size-cells : Must be <0>
|
||||
- #address-cells : Must be <1>
|
||||
- cs-gpios: chipselects (internal cs not supported)
|
||||
- atmel,usart-mode : Must be <AT91_USART_MODE_SPI> (found in dt-bindings/mfd/at91-usart.h)
|
||||
|
||||
Optional properties in serial and SPI mode:
|
||||
- dma bindings for dma transfer:
|
||||
- dmas: DMA specifier, consisting of a phandle to DMA controller node,
|
||||
memory peripheral interface and USART DMA channel ID, FIFO configuration.
|
||||
The order of DMA channels is fixed. The first DMA channel must be TX
|
||||
associated channel and the second one must be RX associated channel.
|
||||
Refer to dma.txt and atmel-dma.txt for details.
|
||||
- dma-names: "tx" for TX channel.
|
||||
"rx" for RX channel.
|
||||
The order of dma-names is also fixed. The first name must be "tx"
|
||||
and the second one must be "rx" as in the examples below.
|
||||
|
||||
Optional properties in serial mode:
|
||||
- atmel,use-dma-rx: use of PDC or DMA for receiving data
|
||||
- atmel,use-dma-tx: use of PDC or DMA for transmitting data
|
||||
- {rts,cts,dtr,dsr,rng,dcd}-gpios: specify a GPIO for RTS/CTS/DTR/DSR/RI/DCD line respectively.
|
||||
It will use specified PIO instead of the peripheral function pin for the USART feature.
|
||||
If unsure, don't specify this property.
|
||||
- atmel,fifo-size: maximum number of data the RX and TX FIFOs can store for FIFO
|
||||
capable USARTs.
|
||||
- rs485-rts-delay, rs485-rx-during-tx, linux,rs485-enabled-at-boot-time: see rs485.txt
|
||||
|
||||
<chip> compatible description:
|
||||
- at91rm9200: legacy USART support
|
||||
- at91sam9260: generic USART implementation for SAM9 SoCs
|
||||
|
||||
Example:
|
||||
- use PDC:
|
||||
usart0: serial@fff8c000 {
|
||||
compatible = "atmel,at91sam9260-usart";
|
||||
reg = <0xfff8c000 0x4000>;
|
||||
interrupts = <7>;
|
||||
clocks = <&usart0_clk>;
|
||||
clock-names = "usart";
|
||||
atmel,use-dma-rx;
|
||||
atmel,use-dma-tx;
|
||||
rts-gpios = <&pioD 15 GPIO_ACTIVE_LOW>;
|
||||
cts-gpios = <&pioD 16 GPIO_ACTIVE_LOW>;
|
||||
dtr-gpios = <&pioD 17 GPIO_ACTIVE_LOW>;
|
||||
dsr-gpios = <&pioD 18 GPIO_ACTIVE_LOW>;
|
||||
dcd-gpios = <&pioD 20 GPIO_ACTIVE_LOW>;
|
||||
rng-gpios = <&pioD 19 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
- use DMA:
|
||||
usart0: serial@f001c000 {
|
||||
compatible = "atmel,at91sam9260-usart";
|
||||
reg = <0xf001c000 0x100>;
|
||||
interrupts = <12 4 5>;
|
||||
clocks = <&usart0_clk>;
|
||||
clock-names = "usart";
|
||||
atmel,use-dma-rx;
|
||||
atmel,use-dma-tx;
|
||||
dmas = <&dma0 2 0x3>,
|
||||
<&dma0 2 0x204>;
|
||||
dma-names = "tx", "rx";
|
||||
atmel,fifo-size = <32>;
|
||||
};
|
||||
|
||||
- SPI mode:
|
||||
#include <dt-bindings/mfd/at91-usart.h>
|
||||
|
||||
spi0: spi@f001c000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "atmel,at91rm9200-usart", "atmel,at91sam9260-usart";
|
||||
atmel,usart-mode = <AT91_USART_MODE_SPI>;
|
||||
reg = <0xf001c000 0x100>;
|
||||
interrupts = <12 IRQ_TYPE_LEVEL_HIGH 5>;
|
||||
clocks = <&usart0_clk>;
|
||||
clock-names = "usart";
|
||||
dmas = <&dma0 2 AT91_DMA_CFG_PER_ID(3)>,
|
||||
<&dma0 2 (AT91_DMA_CFG_PER_ID(4) | AT91_DMA_CFG_FIFOCFG_ASAP)>;
|
||||
dma-names = "tx", "rx";
|
||||
cs-gpios = <&pioB 3 0>;
|
||||
};
|
190
Documentation/devicetree/bindings/serial/atmel,at91-usart.yaml
Normal file
190
Documentation/devicetree/bindings/serial/atmel,at91-usart.yaml
Normal file
@ -0,0 +1,190 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
# Copyright (C) 2022 Microchip Technology, Inc. and its subsidiaries
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/serial/atmel,at91-usart.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Atmel Universal Synchronous Asynchronous Receiver/Transmitter (USART)
|
||||
|
||||
maintainers:
|
||||
- Richard Genoud <richard.genoud@gmail.com>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
oneOf:
|
||||
- enum:
|
||||
- atmel,at91rm9200-usart
|
||||
- atmel,at91sam9260-usart
|
||||
- microchip,sam9x60-usart
|
||||
- items:
|
||||
- const: atmel,at91rm9200-dbgu
|
||||
- const: atmel,at91rm9200-usart
|
||||
- items:
|
||||
- const: atmel,at91sam9260-dbgu
|
||||
- const: atmel,at91sam9260-usart
|
||||
- items:
|
||||
- const: microchip,sam9x60-dbgu
|
||||
- const: microchip,sam9x60-usart
|
||||
- const: atmel,at91sam9260-dbgu
|
||||
- const: atmel,at91sam9260-usart
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
clock-names:
|
||||
minItems: 1
|
||||
items:
|
||||
- const: usart
|
||||
- const: gclk
|
||||
|
||||
clocks:
|
||||
minItems: 1
|
||||
items:
|
||||
- description: USART Peripheral Clock
|
||||
- description: USART Generic Clock
|
||||
|
||||
dmas:
|
||||
items:
|
||||
- description: TX DMA Channel
|
||||
- description: RX DMA Channel
|
||||
|
||||
dma-names:
|
||||
items:
|
||||
- const: tx
|
||||
- const: rx
|
||||
|
||||
atmel,usart-mode:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
description:
|
||||
Must be either <AT91_USART_MODE_SPI> for SPI or
|
||||
<AT91_USART_MODE_SERIAL> for USART (found in dt-bindings/mfd/at91-usart.h).
|
||||
enum: [ 0, 1 ]
|
||||
|
||||
atmel,use-dma-rx:
|
||||
type: boolean
|
||||
description: use of PDC or DMA for receiving data
|
||||
|
||||
atmel,use-dma-tx:
|
||||
type: boolean
|
||||
description: use of PDC or DMA for transmitting data
|
||||
|
||||
atmel,fifo-size:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
description:
|
||||
Maximum number of data the RX and TX FIFOs can store for FIFO
|
||||
capable USARTS.
|
||||
enum: [ 16, 32 ]
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
- clock-names
|
||||
- clocks
|
||||
- atmel,usart-mode
|
||||
|
||||
allOf:
|
||||
- if:
|
||||
properties:
|
||||
atmel,usart-mode:
|
||||
const: 1
|
||||
then:
|
||||
allOf:
|
||||
- $ref: /schemas/spi/spi-controller.yaml#
|
||||
|
||||
properties:
|
||||
atmel,use-dma-rx: false
|
||||
|
||||
atmel,use-dma-tx: false
|
||||
|
||||
atmel,fifo-size: false
|
||||
|
||||
"#size-cells":
|
||||
const: 0
|
||||
|
||||
"#address-cells":
|
||||
const: 1
|
||||
|
||||
required:
|
||||
- "#size-cells"
|
||||
- "#address-cells"
|
||||
|
||||
else:
|
||||
allOf:
|
||||
- $ref: /schemas/serial/serial.yaml#
|
||||
- $ref: /schemas/serial/rs485.yaml#
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
#include <dt-bindings/interrupt-controller/irq.h>
|
||||
#include <dt-bindings/mfd/at91-usart.h>
|
||||
#include <dt-bindings/dma/at91.h>
|
||||
|
||||
/* use PDC */
|
||||
usart0: serial@fff8c000 {
|
||||
compatible = "atmel,at91sam9260-usart";
|
||||
reg = <0xfff8c000 0x4000>;
|
||||
atmel,usart-mode = <AT91_USART_MODE_SERIAL>;
|
||||
interrupts = <7>;
|
||||
clocks = <&usart0_clk>;
|
||||
clock-names = "usart";
|
||||
atmel,use-dma-rx;
|
||||
atmel,use-dma-tx;
|
||||
rts-gpios = <&pioD 15 GPIO_ACTIVE_LOW>;
|
||||
cts-gpios = <&pioD 16 GPIO_ACTIVE_LOW>;
|
||||
dtr-gpios = <&pioD 17 GPIO_ACTIVE_LOW>;
|
||||
dsr-gpios = <&pioD 18 GPIO_ACTIVE_LOW>;
|
||||
dcd-gpios = <&pioD 20 GPIO_ACTIVE_LOW>;
|
||||
rng-gpios = <&pioD 19 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
- |
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
#include <dt-bindings/interrupt-controller/irq.h>
|
||||
#include <dt-bindings/mfd/at91-usart.h>
|
||||
#include <dt-bindings/dma/at91.h>
|
||||
|
||||
/* use DMA */
|
||||
usart1: serial@f001c000 {
|
||||
compatible = "atmel,at91sam9260-usart";
|
||||
reg = <0xf001c000 0x100>;
|
||||
atmel,usart-mode = <AT91_USART_MODE_SERIAL>;
|
||||
interrupts = <12 IRQ_TYPE_LEVEL_HIGH 5>;
|
||||
clocks = <&usart0_clk>;
|
||||
clock-names = "usart";
|
||||
atmel,use-dma-rx;
|
||||
atmel,use-dma-tx;
|
||||
dmas = <&dma0 2 AT91_DMA_CFG_PER_ID(3)>,
|
||||
<&dma0 2 (AT91_DMA_CFG_PER_ID(4) | AT91_DMA_CFG_FIFOCFG_ASAP)>;
|
||||
dma-names = "tx", "rx";
|
||||
atmel,fifo-size = <32>;
|
||||
};
|
||||
|
||||
- |
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
#include <dt-bindings/interrupt-controller/irq.h>
|
||||
#include <dt-bindings/mfd/at91-usart.h>
|
||||
#include <dt-bindings/dma/at91.h>
|
||||
|
||||
/* SPI mode */
|
||||
spi0: spi@f001c000 {
|
||||
compatible = "atmel,at91sam9260-usart";
|
||||
reg = <0xf001c000 0x100>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
atmel,usart-mode = <AT91_USART_MODE_SPI>;
|
||||
interrupts = <12 IRQ_TYPE_LEVEL_HIGH 5>;
|
||||
clocks = <&usart0_clk>;
|
||||
clock-names = "usart";
|
||||
dmas = <&dma0 2 AT91_DMA_CFG_PER_ID(3)>,
|
||||
<&dma0 2 (AT91_DMA_CFG_PER_ID(4) | AT91_DMA_CFG_FIFOCFG_ASAP)>;
|
||||
dma-names = "tx", "rx";
|
||||
cs-gpios = <&pioB 3 GPIO_ACTIVE_HIGH>;
|
||||
};
|
@ -42,6 +42,7 @@ properties:
|
||||
- mediatek,mt8173-uart
|
||||
- mediatek,mt8183-uart
|
||||
- mediatek,mt8186-uart
|
||||
- mediatek,mt8188-uart
|
||||
- mediatek,mt8192-uart
|
||||
- mediatek,mt8195-uart
|
||||
- mediatek,mt8516-uart
|
||||
|
@ -94,6 +94,12 @@ properties:
|
||||
resets:
|
||||
maxItems: 1
|
||||
|
||||
reg-io-width:
|
||||
description:
|
||||
The size (in bytes) of the IO accesses that should be performed
|
||||
on the device.
|
||||
enum: [1, 4]
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
|
@ -76,7 +76,7 @@ properties:
|
||||
|
||||
- items:
|
||||
- enum:
|
||||
- renesas,scif-r9a07g043 # RZ/G2UL
|
||||
- renesas,scif-r9a07g043 # RZ/G2UL and RZ/Five
|
||||
- renesas,scif-r9a07g054 # RZ/V2L
|
||||
- const: renesas,scif-r9a07g044 # RZ/G2{L,LC} fallback
|
||||
|
||||
|
@ -40,7 +40,6 @@ properties:
|
||||
description: |
|
||||
The size (in bytes) of the IO accesses that should be performed
|
||||
on the device.
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
enum: [ 1, 4 ]
|
||||
|
||||
clocks:
|
||||
@ -72,6 +71,9 @@ properties:
|
||||
minItems: 1
|
||||
maxItems: 2
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
samsung,uart-fifosize:
|
||||
description: The fifo size supported by the UART channel.
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
|
@ -26,6 +26,7 @@ properties:
|
||||
- rockchip,rk1808-uart
|
||||
- rockchip,rk3036-uart
|
||||
- rockchip,rk3066-uart
|
||||
- rockchip,rk3128-uart
|
||||
- rockchip,rk3188-uart
|
||||
- rockchip,rk3288-uart
|
||||
- rockchip,rk3308-uart
|
||||
|
@ -71,7 +71,6 @@ Magic Name Number Structure File
|
||||
PG_MAGIC 'P' pg_{read,write}_hdr ``include/linux/pg.h``
|
||||
CMAGIC 0x0111 user ``include/linux/a.out.h``
|
||||
MKISS_DRIVER_MAGIC 0x04bf mkiss_channel ``drivers/net/mkiss.h``
|
||||
HDLC_MAGIC 0x239e n_hdlc ``drivers/char/n_hdlc.c``
|
||||
APM_BIOS_MAGIC 0x4101 apm_user ``arch/x86/kernel/apm_32.c``
|
||||
DB_MAGIC 0x4442 fc_info ``drivers/net/iph5526_novram.c``
|
||||
DL_MAGIC 0x444d fc_info ``drivers/net/iph5526_novram.c``
|
||||
@ -84,9 +83,6 @@ SLIP_MAGIC 0x5302 slip ``drivers/net/sl
|
||||
STRIP_MAGIC 0x5303 strip ``drivers/net/strip.c``
|
||||
SIXPACK_MAGIC 0x5304 sixpack ``drivers/net/hamradio/6pack.h``
|
||||
AX25_MAGIC 0x5316 ax_disp ``drivers/net/mkiss.h``
|
||||
TTY_MAGIC 0x5401 tty_struct ``include/linux/tty.h``
|
||||
MGSL_MAGIC 0x5401 mgsl_info ``drivers/char/synclink.c``
|
||||
TTY_DRIVER_MAGIC 0x5402 tty_driver ``include/linux/tty_driver.h``
|
||||
MGSLPC_MAGIC 0x5402 mgslpc_info ``drivers/char/pcmcia/synclink_cs.c``
|
||||
USB_SERIAL_MAGIC 0x6702 usb_serial ``drivers/usb/serial/usb-serial.h``
|
||||
FULL_DUPLEX_MAGIC 0x6969 ``drivers/net/ethernet/dec/tulip/de2104x.c``
|
||||
|
@ -77,7 +77,6 @@ Nome magico Numero Struttura File
|
||||
PG_MAGIC 'P' pg_{read,write}_hdr ``include/linux/pg.h``
|
||||
CMAGIC 0x0111 user ``include/linux/a.out.h``
|
||||
MKISS_DRIVER_MAGIC 0x04bf mkiss_channel ``drivers/net/mkiss.h``
|
||||
HDLC_MAGIC 0x239e n_hdlc ``drivers/char/n_hdlc.c``
|
||||
APM_BIOS_MAGIC 0x4101 apm_user ``arch/x86/kernel/apm_32.c``
|
||||
DB_MAGIC 0x4442 fc_info ``drivers/net/iph5526_novram.c``
|
||||
DL_MAGIC 0x444d fc_info ``drivers/net/iph5526_novram.c``
|
||||
@ -90,9 +89,6 @@ SLIP_MAGIC 0x5302 slip ``drivers/net/sl
|
||||
STRIP_MAGIC 0x5303 strip ``drivers/net/strip.c``
|
||||
SIXPACK_MAGIC 0x5304 sixpack ``drivers/net/hamradio/6pack.h``
|
||||
AX25_MAGIC 0x5316 ax_disp ``drivers/net/mkiss.h``
|
||||
TTY_MAGIC 0x5401 tty_struct ``include/linux/tty.h``
|
||||
MGSL_MAGIC 0x5401 mgsl_info ``drivers/char/synclink.c``
|
||||
TTY_DRIVER_MAGIC 0x5402 tty_driver ``include/linux/tty_driver.h``
|
||||
MGSLPC_MAGIC 0x5402 mgslpc_info ``drivers/char/pcmcia/synclink_cs.c``
|
||||
USB_SERIAL_MAGIC 0x6702 usb_serial ``drivers/usb/serial/usb-serial.h``
|
||||
FULL_DUPLEX_MAGIC 0x6969 ``drivers/net/ethernet/dec/tulip/de2104x.c``
|
||||
|
@ -60,7 +60,6 @@ Linux 魔术数
|
||||
PG_MAGIC 'P' pg_{read,write}_hdr ``include/linux/pg.h``
|
||||
CMAGIC 0x0111 user ``include/linux/a.out.h``
|
||||
MKISS_DRIVER_MAGIC 0x04bf mkiss_channel ``drivers/net/mkiss.h``
|
||||
HDLC_MAGIC 0x239e n_hdlc ``drivers/char/n_hdlc.c``
|
||||
APM_BIOS_MAGIC 0x4101 apm_user ``arch/x86/kernel/apm_32.c``
|
||||
DB_MAGIC 0x4442 fc_info ``drivers/net/iph5526_novram.c``
|
||||
DL_MAGIC 0x444d fc_info ``drivers/net/iph5526_novram.c``
|
||||
@ -73,9 +72,6 @@ SLIP_MAGIC 0x5302 slip ``drivers/net/sl
|
||||
STRIP_MAGIC 0x5303 strip ``drivers/net/strip.c``
|
||||
SIXPACK_MAGIC 0x5304 sixpack ``drivers/net/hamradio/6pack.h``
|
||||
AX25_MAGIC 0x5316 ax_disp ``drivers/net/mkiss.h``
|
||||
TTY_MAGIC 0x5401 tty_struct ``include/linux/tty.h``
|
||||
MGSL_MAGIC 0x5401 mgsl_info ``drivers/char/synclink.c``
|
||||
TTY_DRIVER_MAGIC 0x5402 tty_driver ``include/linux/tty_driver.h``
|
||||
MGSLPC_MAGIC 0x5402 mgslpc_info ``drivers/char/pcmcia/synclink_cs.c``
|
||||
USB_SERIAL_MAGIC 0x6702 usb_serial ``drivers/usb/serial/usb-serial.h``
|
||||
FULL_DUPLEX_MAGIC 0x6969 ``drivers/net/ethernet/dec/tulip/de2104x.c``
|
||||
|
@ -63,7 +63,6 @@ Linux 魔術數
|
||||
PG_MAGIC 'P' pg_{read,write}_hdr ``include/linux/pg.h``
|
||||
CMAGIC 0x0111 user ``include/linux/a.out.h``
|
||||
MKISS_DRIVER_MAGIC 0x04bf mkiss_channel ``drivers/net/mkiss.h``
|
||||
HDLC_MAGIC 0x239e n_hdlc ``drivers/char/n_hdlc.c``
|
||||
APM_BIOS_MAGIC 0x4101 apm_user ``arch/x86/kernel/apm_32.c``
|
||||
DB_MAGIC 0x4442 fc_info ``drivers/net/iph5526_novram.c``
|
||||
DL_MAGIC 0x444d fc_info ``drivers/net/iph5526_novram.c``
|
||||
@ -76,9 +75,6 @@ SLIP_MAGIC 0x5302 slip ``drivers/net/sl
|
||||
STRIP_MAGIC 0x5303 strip ``drivers/net/strip.c``
|
||||
SIXPACK_MAGIC 0x5304 sixpack ``drivers/net/hamradio/6pack.h``
|
||||
AX25_MAGIC 0x5316 ax_disp ``drivers/net/mkiss.h``
|
||||
TTY_MAGIC 0x5401 tty_struct ``include/linux/tty.h``
|
||||
MGSL_MAGIC 0x5401 mgsl_info ``drivers/char/synclink.c``
|
||||
TTY_DRIVER_MAGIC 0x5402 tty_driver ``include/linux/tty_driver.h``
|
||||
MGSLPC_MAGIC 0x5402 mgslpc_info ``drivers/char/pcmcia/synclink_cs.c``
|
||||
USB_SERIAL_MAGIC 0x6702 usb_serial ``drivers/usb/serial/usb-serial.h``
|
||||
FULL_DUPLEX_MAGIC 0x6969 ``drivers/net/ethernet/dec/tulip/de2104x.c``
|
||||
|
@ -13339,7 +13339,7 @@ F: include/dt-bindings/dma/at91.h
|
||||
MICROCHIP AT91 SERIAL DRIVER
|
||||
M: Richard Genoud <richard.genoud@gmail.com>
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/mfd/atmel-usart.txt
|
||||
F: Documentation/devicetree/bindings/serial/atmel,at91-usart.yaml
|
||||
F: drivers/tty/serial/atmel_serial.c
|
||||
F: drivers/tty/serial/atmel_serial.h
|
||||
|
||||
@ -13347,7 +13347,7 @@ MICROCHIP AT91 USART MFD DRIVER
|
||||
M: Radu Pirea <radu_nicolae.pirea@upb.ro>
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Supported
|
||||
F: Documentation/devicetree/bindings/mfd/atmel-usart.txt
|
||||
F: Documentation/devicetree/bindings/serial/atmel,at91-usart.yaml
|
||||
F: drivers/mfd/at91-usart.c
|
||||
F: include/dt-bindings/mfd/at91-usart.h
|
||||
|
||||
@ -13355,7 +13355,7 @@ MICROCHIP AT91 USART SPI DRIVER
|
||||
M: Radu Pirea <radu_nicolae.pirea@upb.ro>
|
||||
L: linux-spi@vger.kernel.org
|
||||
S: Supported
|
||||
F: Documentation/devicetree/bindings/mfd/atmel-usart.txt
|
||||
F: Documentation/devicetree/bindings/serial/atmel,at91-usart.yaml
|
||||
F: drivers/spi/spi-at91-usart.c
|
||||
|
||||
MICROCHIP AUDIO ASOC DRIVERS
|
||||
|
@ -1,87 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef _ALPHA_TERMIOS_H
|
||||
#define _ALPHA_TERMIOS_H
|
||||
|
||||
#include <uapi/asm/termios.h>
|
||||
|
||||
/* eof=^D eol=\0 eol2=\0 erase=del
|
||||
werase=^W kill=^U reprint=^R sxtc=\0
|
||||
intr=^C quit=^\ susp=^Z <OSF/1 VDSUSP>
|
||||
start=^Q stop=^S lnext=^V discard=^U
|
||||
vmin=\1 vtime=\0
|
||||
*/
|
||||
#define INIT_C_CC "\004\000\000\177\027\025\022\000\003\034\032\000\021\023\026\025\001\000"
|
||||
|
||||
/*
|
||||
* Translate a "termio" structure into a "termios". Ugh.
|
||||
*/
|
||||
|
||||
#define user_termio_to_kernel_termios(a_termios, u_termio) \
|
||||
({ \
|
||||
struct ktermios *k_termios = (a_termios); \
|
||||
struct termio k_termio; \
|
||||
int canon, ret; \
|
||||
\
|
||||
ret = copy_from_user(&k_termio, u_termio, sizeof(k_termio)); \
|
||||
if (!ret) { \
|
||||
/* Overwrite only the low bits. */ \
|
||||
*(unsigned short *)&k_termios->c_iflag = k_termio.c_iflag; \
|
||||
*(unsigned short *)&k_termios->c_oflag = k_termio.c_oflag; \
|
||||
*(unsigned short *)&k_termios->c_cflag = k_termio.c_cflag; \
|
||||
*(unsigned short *)&k_termios->c_lflag = k_termio.c_lflag; \
|
||||
canon = k_termio.c_lflag & ICANON; \
|
||||
\
|
||||
k_termios->c_cc[VINTR] = k_termio.c_cc[_VINTR]; \
|
||||
k_termios->c_cc[VQUIT] = k_termio.c_cc[_VQUIT]; \
|
||||
k_termios->c_cc[VERASE] = k_termio.c_cc[_VERASE]; \
|
||||
k_termios->c_cc[VKILL] = k_termio.c_cc[_VKILL]; \
|
||||
k_termios->c_cc[VEOL2] = k_termio.c_cc[_VEOL2]; \
|
||||
k_termios->c_cc[VSWTC] = k_termio.c_cc[_VSWTC]; \
|
||||
k_termios->c_cc[canon ? VEOF : VMIN] = k_termio.c_cc[_VEOF]; \
|
||||
k_termios->c_cc[canon ? VEOL : VTIME] = k_termio.c_cc[_VEOL]; \
|
||||
} \
|
||||
ret; \
|
||||
})
|
||||
|
||||
/*
|
||||
* Translate a "termios" structure into a "termio". Ugh.
|
||||
*
|
||||
* Note the "fun" _VMIN overloading.
|
||||
*/
|
||||
#define kernel_termios_to_user_termio(u_termio, a_termios) \
|
||||
({ \
|
||||
struct ktermios *k_termios = (a_termios); \
|
||||
struct termio k_termio; \
|
||||
int canon; \
|
||||
\
|
||||
k_termio.c_iflag = k_termios->c_iflag; \
|
||||
k_termio.c_oflag = k_termios->c_oflag; \
|
||||
k_termio.c_cflag = k_termios->c_cflag; \
|
||||
canon = (k_termio.c_lflag = k_termios->c_lflag) & ICANON; \
|
||||
\
|
||||
k_termio.c_line = k_termios->c_line; \
|
||||
k_termio.c_cc[_VINTR] = k_termios->c_cc[VINTR]; \
|
||||
k_termio.c_cc[_VQUIT] = k_termios->c_cc[VQUIT]; \
|
||||
k_termio.c_cc[_VERASE] = k_termios->c_cc[VERASE]; \
|
||||
k_termio.c_cc[_VKILL] = k_termios->c_cc[VKILL]; \
|
||||
k_termio.c_cc[_VEOF] = k_termios->c_cc[canon ? VEOF : VMIN]; \
|
||||
k_termio.c_cc[_VEOL] = k_termios->c_cc[canon ? VEOL : VTIME]; \
|
||||
k_termio.c_cc[_VEOL2] = k_termios->c_cc[VEOL2]; \
|
||||
k_termio.c_cc[_VSWTC] = k_termios->c_cc[VSWTC]; \
|
||||
\
|
||||
copy_to_user(u_termio, &k_termio, sizeof(k_termio)); \
|
||||
})
|
||||
|
||||
#define user_termios_to_kernel_termios(k, u) \
|
||||
copy_from_user(k, u, sizeof(struct termios2))
|
||||
|
||||
#define kernel_termios_to_user_termios(u, k) \
|
||||
copy_to_user(u, k, sizeof(struct termios2))
|
||||
|
||||
#define user_termios_to_kernel_termios_1(k, u) \
|
||||
copy_from_user(k, u, sizeof(struct termios))
|
||||
|
||||
#define kernel_termios_to_user_termios_1(u, k) \
|
||||
copy_to_user(u, k, sizeof(struct termios))
|
||||
|
||||
#endif /* _ALPHA_TERMIOS_H */
|
@ -9,7 +9,7 @@ ccflags-y := -Wno-sign-compare
|
||||
|
||||
obj-y := entry.o traps.o process.o osf_sys.o irq.o \
|
||||
irq_alpha.o signal.o setup.o ptrace.o time.o \
|
||||
systbls.o err_common.o io.o bugs.o
|
||||
systbls.o err_common.o io.o bugs.o termios.o
|
||||
|
||||
obj-$(CONFIG_VGA_HOSE) += console.o
|
||||
obj-$(CONFIG_SMP) += smp.o
|
||||
|
56
arch/alpha/kernel/termios.c
Normal file
56
arch/alpha/kernel/termios.c
Normal file
@ -0,0 +1,56 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include <linux/termios_internal.h>
|
||||
|
||||
int user_termio_to_kernel_termios(struct ktermios *termios,
|
||||
struct termio __user *termio)
|
||||
{
|
||||
struct termio v;
|
||||
bool canon;
|
||||
|
||||
if (copy_from_user(&v, termio, sizeof(struct termio)))
|
||||
return -EFAULT;
|
||||
|
||||
termios->c_iflag = (0xffff0000 & termios->c_iflag) | v.c_iflag;
|
||||
termios->c_oflag = (0xffff0000 & termios->c_oflag) | v.c_oflag;
|
||||
termios->c_cflag = (0xffff0000 & termios->c_cflag) | v.c_cflag;
|
||||
termios->c_lflag = (0xffff0000 & termios->c_lflag) | v.c_lflag;
|
||||
termios->c_line = (0xffff0000 & termios->c_lflag) | v.c_line;
|
||||
|
||||
canon = v.c_lflag & ICANON;
|
||||
termios->c_cc[VINTR] = v.c_cc[_VINTR];
|
||||
termios->c_cc[VQUIT] = v.c_cc[_VQUIT];
|
||||
termios->c_cc[VERASE] = v.c_cc[_VERASE];
|
||||
termios->c_cc[VKILL] = v.c_cc[_VKILL];
|
||||
termios->c_cc[VEOL2] = v.c_cc[_VEOL2];
|
||||
termios->c_cc[VSWTC] = v.c_cc[_VSWTC];
|
||||
termios->c_cc[canon ? VEOF : VMIN] = v.c_cc[_VEOF];
|
||||
termios->c_cc[canon ? VEOL : VTIME] = v.c_cc[_VEOL];
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int kernel_termios_to_user_termio(struct termio __user *termio,
|
||||
struct ktermios *termios)
|
||||
{
|
||||
struct termio v;
|
||||
bool canon;
|
||||
|
||||
memset(&v, 0, sizeof(struct termio));
|
||||
v.c_iflag = termios->c_iflag;
|
||||
v.c_oflag = termios->c_oflag;
|
||||
v.c_cflag = termios->c_cflag;
|
||||
v.c_lflag = termios->c_lflag;
|
||||
v.c_line = termios->c_line;
|
||||
|
||||
canon = v.c_lflag & ICANON;
|
||||
v.c_cc[_VINTR] = termios->c_cc[VINTR];
|
||||
v.c_cc[_VQUIT] = termios->c_cc[VQUIT];
|
||||
v.c_cc[_VERASE] = termios->c_cc[VERASE];
|
||||
v.c_cc[_VKILL] = termios->c_cc[VKILL];
|
||||
v.c_cc[_VEOF] = termios->c_cc[canon ? VEOF : VMIN];
|
||||
v.c_cc[_VEOL] = termios->c_cc[canon ? VEOL : VTIME];
|
||||
v.c_cc[_VEOL2] = termios->c_cc[VEOL2];
|
||||
v.c_cc[_VSWTC] = termios->c_cc[VSWTC];
|
||||
|
||||
return copy_to_user(termio, &v, sizeof(struct termio));
|
||||
}
|
@ -22,6 +22,7 @@
|
||||
#include <linux/io.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/termios.h>
|
||||
#include <linux/amba/bus.h>
|
||||
#include <linux/amba/serial.h>
|
||||
|
@ -11,6 +11,7 @@
|
||||
#include <linux/of_irq.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/termios.h>
|
||||
#include <linux/mfd/syscon.h>
|
||||
#include <linux/regmap.h>
|
||||
|
@ -1,58 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Modified 1999
|
||||
* David Mosberger-Tang <davidm@hpl.hp.com>, Hewlett-Packard Co
|
||||
*
|
||||
* 99/01/28 Added N_IRDA and N_SMSBLOCK
|
||||
*/
|
||||
#ifndef _ASM_IA64_TERMIOS_H
|
||||
#define _ASM_IA64_TERMIOS_H
|
||||
|
||||
#include <uapi/asm/termios.h>
|
||||
|
||||
|
||||
/* intr=^C quit=^\ erase=del kill=^U
|
||||
eof=^D vtime=\0 vmin=\1 sxtc=\0
|
||||
start=^Q stop=^S susp=^Z eol=\0
|
||||
reprint=^R discard=^U werase=^W lnext=^V
|
||||
eol2=\0
|
||||
*/
|
||||
#define INIT_C_CC "\003\034\177\025\004\0\1\0\021\023\032\0\022\017\027\026\0"
|
||||
|
||||
/*
|
||||
* Translate a "termio" structure into a "termios". Ugh.
|
||||
*/
|
||||
#define SET_LOW_TERMIOS_BITS(termios, termio, x) { \
|
||||
unsigned short __tmp; \
|
||||
get_user(__tmp,&(termio)->x); \
|
||||
*(unsigned short *) &(termios)->x = __tmp; \
|
||||
}
|
||||
|
||||
#define user_termio_to_kernel_termios(termios, termio) \
|
||||
({ \
|
||||
SET_LOW_TERMIOS_BITS(termios, termio, c_iflag); \
|
||||
SET_LOW_TERMIOS_BITS(termios, termio, c_oflag); \
|
||||
SET_LOW_TERMIOS_BITS(termios, termio, c_cflag); \
|
||||
SET_LOW_TERMIOS_BITS(termios, termio, c_lflag); \
|
||||
copy_from_user((termios)->c_cc, (termio)->c_cc, NCC); \
|
||||
})
|
||||
|
||||
/*
|
||||
* Translate a "termios" structure into a "termio". Ugh.
|
||||
*/
|
||||
#define kernel_termios_to_user_termio(termio, termios) \
|
||||
({ \
|
||||
put_user((termios)->c_iflag, &(termio)->c_iflag); \
|
||||
put_user((termios)->c_oflag, &(termio)->c_oflag); \
|
||||
put_user((termios)->c_cflag, &(termio)->c_cflag); \
|
||||
put_user((termios)->c_lflag, &(termio)->c_lflag); \
|
||||
put_user((termios)->c_line, &(termio)->c_line); \
|
||||
copy_to_user((termio)->c_cc, (termios)->c_cc, NCC); \
|
||||
})
|
||||
|
||||
#define user_termios_to_kernel_termios(k, u) copy_from_user(k, u, sizeof(struct termios2))
|
||||
#define kernel_termios_to_user_termios(u, k) copy_to_user(u, k, sizeof(struct termios2))
|
||||
#define user_termios_to_kernel_termios_1(k, u) copy_from_user(k, u, sizeof(struct termios))
|
||||
#define kernel_termios_to_user_termios_1(u, k) copy_to_user(u, k, sizeof(struct termios))
|
||||
|
||||
#endif /* _ASM_IA64_TERMIOS_H */
|
@ -1,51 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
/*
|
||||
* Modified 1999
|
||||
* David Mosberger-Tang <davidm@hpl.hp.com>, Hewlett-Packard Co
|
||||
*
|
||||
* 99/01/28 Added N_IRDA and N_SMSBLOCK
|
||||
*/
|
||||
#ifndef _UAPI_ASM_IA64_TERMIOS_H
|
||||
#define _UAPI_ASM_IA64_TERMIOS_H
|
||||
|
||||
|
||||
#include <asm/termbits.h>
|
||||
#include <asm/ioctls.h>
|
||||
|
||||
struct winsize {
|
||||
unsigned short ws_row;
|
||||
unsigned short ws_col;
|
||||
unsigned short ws_xpixel;
|
||||
unsigned short ws_ypixel;
|
||||
};
|
||||
|
||||
#define NCC 8
|
||||
struct termio {
|
||||
unsigned short c_iflag; /* input mode flags */
|
||||
unsigned short c_oflag; /* output mode flags */
|
||||
unsigned short c_cflag; /* control mode flags */
|
||||
unsigned short c_lflag; /* local mode flags */
|
||||
unsigned char c_line; /* line discipline */
|
||||
unsigned char c_cc[NCC]; /* control characters */
|
||||
};
|
||||
|
||||
/* modem lines */
|
||||
#define TIOCM_LE 0x001
|
||||
#define TIOCM_DTR 0x002
|
||||
#define TIOCM_RTS 0x004
|
||||
#define TIOCM_ST 0x008
|
||||
#define TIOCM_SR 0x010
|
||||
#define TIOCM_CTS 0x020
|
||||
#define TIOCM_CAR 0x040
|
||||
#define TIOCM_RNG 0x080
|
||||
#define TIOCM_DSR 0x100
|
||||
#define TIOCM_CD TIOCM_CAR
|
||||
#define TIOCM_RI TIOCM_RNG
|
||||
#define TIOCM_OUT1 0x2000
|
||||
#define TIOCM_OUT2 0x4000
|
||||
#define TIOCM_LOOP 0x8000
|
||||
|
||||
/* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */
|
||||
|
||||
|
||||
#endif /* _UAPI_ASM_IA64_TERMIOS_H */
|
@ -21,7 +21,6 @@ generic-y += shmbuf.h
|
||||
generic-y += statfs.h
|
||||
generic-y += socket.h
|
||||
generic-y += sockios.h
|
||||
generic-y += termios.h
|
||||
generic-y += termbits.h
|
||||
generic-y += poll.h
|
||||
generic-y += param.h
|
||||
|
@ -1,105 +0,0 @@
|
||||
/*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*
|
||||
* Copyright (C) 1995, 1996, 2000, 2001 by Ralf Baechle
|
||||
* Copyright (C) 2000, 2001 Silicon Graphics, Inc.
|
||||
*/
|
||||
#ifndef _ASM_TERMIOS_H
|
||||
#define _ASM_TERMIOS_H
|
||||
|
||||
#include <linux/uaccess.h>
|
||||
#include <uapi/asm/termios.h>
|
||||
|
||||
/*
|
||||
* intr=^C quit=^\ erase=del kill=^U
|
||||
* vmin=\1 vtime=\0 eol2=\0 swtc=\0
|
||||
* start=^Q stop=^S susp=^Z vdsusp=
|
||||
* reprint=^R discard=^U werase=^W lnext=^V
|
||||
* eof=^D eol=\0
|
||||
*/
|
||||
#define INIT_C_CC "\003\034\177\025\1\0\0\0\021\023\032\0\022\017\027\026\004\0"
|
||||
|
||||
#include <linux/string.h>
|
||||
|
||||
/*
|
||||
* Translate a "termio" structure into a "termios". Ugh.
|
||||
*/
|
||||
static inline int user_termio_to_kernel_termios(struct ktermios *termios,
|
||||
struct termio __user *termio)
|
||||
{
|
||||
unsigned short iflag, oflag, cflag, lflag;
|
||||
unsigned int err;
|
||||
|
||||
if (!access_ok(termio, sizeof(struct termio)))
|
||||
return -EFAULT;
|
||||
|
||||
err = __get_user(iflag, &termio->c_iflag);
|
||||
termios->c_iflag = (termios->c_iflag & 0xffff0000) | iflag;
|
||||
err |=__get_user(oflag, &termio->c_oflag);
|
||||
termios->c_oflag = (termios->c_oflag & 0xffff0000) | oflag;
|
||||
err |=__get_user(cflag, &termio->c_cflag);
|
||||
termios->c_cflag = (termios->c_cflag & 0xffff0000) | cflag;
|
||||
err |=__get_user(lflag, &termio->c_lflag);
|
||||
termios->c_lflag = (termios->c_lflag & 0xffff0000) | lflag;
|
||||
err |=__get_user(termios->c_line, &termio->c_line);
|
||||
if (err)
|
||||
return -EFAULT;
|
||||
|
||||
if (__copy_from_user(termios->c_cc, termio->c_cc, NCC))
|
||||
return -EFAULT;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Translate a "termios" structure into a "termio". Ugh.
|
||||
*/
|
||||
static inline int kernel_termios_to_user_termio(struct termio __user *termio,
|
||||
struct ktermios *termios)
|
||||
{
|
||||
int err;
|
||||
|
||||
if (!access_ok(termio, sizeof(struct termio)))
|
||||
return -EFAULT;
|
||||
|
||||
err = __put_user(termios->c_iflag, &termio->c_iflag);
|
||||
err |= __put_user(termios->c_oflag, &termio->c_oflag);
|
||||
err |= __put_user(termios->c_cflag, &termio->c_cflag);
|
||||
err |= __put_user(termios->c_lflag, &termio->c_lflag);
|
||||
err |= __put_user(termios->c_line, &termio->c_line);
|
||||
if (err)
|
||||
return -EFAULT;
|
||||
|
||||
if (__copy_to_user(termio->c_cc, termios->c_cc, NCC))
|
||||
return -EFAULT;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int user_termios_to_kernel_termios(struct ktermios __user *k,
|
||||
struct termios2 *u)
|
||||
{
|
||||
return copy_from_user(k, u, sizeof(struct termios2)) ? -EFAULT : 0;
|
||||
}
|
||||
|
||||
static inline int kernel_termios_to_user_termios(struct termios2 __user *u,
|
||||
struct ktermios *k)
|
||||
{
|
||||
return copy_to_user(u, k, sizeof(struct termios2)) ? -EFAULT : 0;
|
||||
}
|
||||
|
||||
static inline int user_termios_to_kernel_termios_1(struct ktermios *k,
|
||||
struct termios __user *u)
|
||||
{
|
||||
return copy_from_user(k, u, sizeof(struct termios)) ? -EFAULT : 0;
|
||||
}
|
||||
|
||||
static inline int kernel_termios_to_user_termios_1(struct termios __user *u,
|
||||
struct ktermios *k)
|
||||
{
|
||||
return copy_to_user(u, k, sizeof(struct termios)) ? -EFAULT : 0;
|
||||
}
|
||||
|
||||
#endif /* _ASM_TERMIOS_H */
|
@ -1,52 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef _PARISC_TERMIOS_H
|
||||
#define _PARISC_TERMIOS_H
|
||||
|
||||
#include <uapi/asm/termios.h>
|
||||
|
||||
|
||||
/* intr=^C quit=^\ erase=del kill=^U
|
||||
eof=^D vtime=\0 vmin=\1 sxtc=\0
|
||||
start=^Q stop=^S susp=^Z eol=\0
|
||||
reprint=^R discard=^U werase=^W lnext=^V
|
||||
eol2=\0
|
||||
*/
|
||||
#define INIT_C_CC "\003\034\177\025\004\0\1\0\021\023\032\0\022\017\027\026\0"
|
||||
|
||||
/*
|
||||
* Translate a "termio" structure into a "termios". Ugh.
|
||||
*/
|
||||
#define SET_LOW_TERMIOS_BITS(termios, termio, x) { \
|
||||
unsigned short __tmp; \
|
||||
get_user(__tmp,&(termio)->x); \
|
||||
*(unsigned short *) &(termios)->x = __tmp; \
|
||||
}
|
||||
|
||||
#define user_termio_to_kernel_termios(termios, termio) \
|
||||
({ \
|
||||
SET_LOW_TERMIOS_BITS(termios, termio, c_iflag); \
|
||||
SET_LOW_TERMIOS_BITS(termios, termio, c_oflag); \
|
||||
SET_LOW_TERMIOS_BITS(termios, termio, c_cflag); \
|
||||
SET_LOW_TERMIOS_BITS(termios, termio, c_lflag); \
|
||||
copy_from_user((termios)->c_cc, (termio)->c_cc, NCC); \
|
||||
})
|
||||
|
||||
/*
|
||||
* Translate a "termios" structure into a "termio". Ugh.
|
||||
*/
|
||||
#define kernel_termios_to_user_termio(termio, termios) \
|
||||
({ \
|
||||
put_user((termios)->c_iflag, &(termio)->c_iflag); \
|
||||
put_user((termios)->c_oflag, &(termio)->c_oflag); \
|
||||
put_user((termios)->c_cflag, &(termio)->c_cflag); \
|
||||
put_user((termios)->c_lflag, &(termio)->c_lflag); \
|
||||
put_user((termios)->c_line, &(termio)->c_line); \
|
||||
copy_to_user((termio)->c_cc, (termios)->c_cc, NCC); \
|
||||
})
|
||||
|
||||
#define user_termios_to_kernel_termios(k, u) copy_from_user(k, u, sizeof(struct termios2))
|
||||
#define kernel_termios_to_user_termios(u, k) copy_to_user(u, k, sizeof(struct termios2))
|
||||
#define user_termios_to_kernel_termios_1(k, u) copy_from_user(k, u, sizeof(struct termios))
|
||||
#define kernel_termios_to_user_termios_1(u, k) copy_to_user(u, k, sizeof(struct termios))
|
||||
|
||||
#endif /* _PARISC_TERMIOS_H */
|
@ -1,44 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
#ifndef _UAPI_PARISC_TERMIOS_H
|
||||
#define _UAPI_PARISC_TERMIOS_H
|
||||
|
||||
#include <asm/termbits.h>
|
||||
#include <asm/ioctls.h>
|
||||
|
||||
struct winsize {
|
||||
unsigned short ws_row;
|
||||
unsigned short ws_col;
|
||||
unsigned short ws_xpixel;
|
||||
unsigned short ws_ypixel;
|
||||
};
|
||||
|
||||
#define NCC 8
|
||||
struct termio {
|
||||
unsigned short c_iflag; /* input mode flags */
|
||||
unsigned short c_oflag; /* output mode flags */
|
||||
unsigned short c_cflag; /* control mode flags */
|
||||
unsigned short c_lflag; /* local mode flags */
|
||||
unsigned char c_line; /* line discipline */
|
||||
unsigned char c_cc[NCC]; /* control characters */
|
||||
};
|
||||
|
||||
/* modem lines */
|
||||
#define TIOCM_LE 0x001
|
||||
#define TIOCM_DTR 0x002
|
||||
#define TIOCM_RTS 0x004
|
||||
#define TIOCM_ST 0x008
|
||||
#define TIOCM_SR 0x010
|
||||
#define TIOCM_CTS 0x020
|
||||
#define TIOCM_CAR 0x040
|
||||
#define TIOCM_RNG 0x080
|
||||
#define TIOCM_DSR 0x100
|
||||
#define TIOCM_CD TIOCM_CAR
|
||||
#define TIOCM_RI TIOCM_RNG
|
||||
#define TIOCM_OUT1 0x2000
|
||||
#define TIOCM_OUT2 0x4000
|
||||
#define TIOCM_LOOP 0x8000
|
||||
|
||||
/* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */
|
||||
|
||||
|
||||
#endif /* _UAPI_PARISC_TERMIOS_H */
|
@ -1,18 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
/*
|
||||
* Liberally adapted from alpha/termios.h. In particular, the c_cc[]
|
||||
* fields have been reordered so that termio & termios share the
|
||||
* common subset in the same order (for brain dead programs that don't
|
||||
* know or care about the differences).
|
||||
*/
|
||||
#ifndef _ASM_POWERPC_TERMIOS_H
|
||||
#define _ASM_POWERPC_TERMIOS_H
|
||||
|
||||
#include <uapi/asm/termios.h>
|
||||
|
||||
/* ^C ^\ del ^U ^D 1 0 0 0 0 ^W ^R ^Z ^Q ^S ^V ^U */
|
||||
#define INIT_C_CC "\003\034\177\025\004\001\000\000\000\000\027\022\032\021\023\026\025"
|
||||
|
||||
#include <asm-generic/termios-base.h>
|
||||
|
||||
#endif /* _ASM_POWERPC_TERMIOS_H */
|
@ -1,26 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* S390 version
|
||||
*
|
||||
* Derived from "include/asm-i386/termios.h"
|
||||
*/
|
||||
#ifndef _S390_TERMIOS_H
|
||||
#define _S390_TERMIOS_H
|
||||
|
||||
#include <uapi/asm/termios.h>
|
||||
|
||||
|
||||
/* intr=^C quit=^\ erase=del kill=^U
|
||||
eof=^D vtime=\0 vmin=\1 sxtc=\0
|
||||
start=^Q stop=^S susp=^Z eol=\0
|
||||
reprint=^R discard=^U werase=^W lnext=^V
|
||||
eol2=\0
|
||||
*/
|
||||
#define INIT_C_CC "\003\034\177\025\004\0\1\0\021\023\032\0\022\017\027\026\0"
|
||||
|
||||
#define user_termios_to_kernel_termios(k, u) copy_from_user(k, u, sizeof(struct termios2))
|
||||
#define kernel_termios_to_user_termios(u, k) copy_to_user(u, k, sizeof(struct termios2))
|
||||
|
||||
#include <asm-generic/termios-base.h>
|
||||
|
||||
#endif /* _S390_TERMIOS_H */
|
@ -1,50 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
/*
|
||||
* S390 version
|
||||
*
|
||||
* Derived from "include/asm-i386/termios.h"
|
||||
*/
|
||||
|
||||
#ifndef _UAPI_S390_TERMIOS_H
|
||||
#define _UAPI_S390_TERMIOS_H
|
||||
|
||||
#include <asm/termbits.h>
|
||||
#include <asm/ioctls.h>
|
||||
|
||||
struct winsize {
|
||||
unsigned short ws_row;
|
||||
unsigned short ws_col;
|
||||
unsigned short ws_xpixel;
|
||||
unsigned short ws_ypixel;
|
||||
};
|
||||
|
||||
#define NCC 8
|
||||
struct termio {
|
||||
unsigned short c_iflag; /* input mode flags */
|
||||
unsigned short c_oflag; /* output mode flags */
|
||||
unsigned short c_cflag; /* control mode flags */
|
||||
unsigned short c_lflag; /* local mode flags */
|
||||
unsigned char c_line; /* line discipline */
|
||||
unsigned char c_cc[NCC]; /* control characters */
|
||||
};
|
||||
|
||||
/* modem lines */
|
||||
#define TIOCM_LE 0x001
|
||||
#define TIOCM_DTR 0x002
|
||||
#define TIOCM_RTS 0x004
|
||||
#define TIOCM_ST 0x008
|
||||
#define TIOCM_SR 0x010
|
||||
#define TIOCM_CTS 0x020
|
||||
#define TIOCM_CAR 0x040
|
||||
#define TIOCM_RNG 0x080
|
||||
#define TIOCM_DSR 0x100
|
||||
#define TIOCM_CD TIOCM_CAR
|
||||
#define TIOCM_RI TIOCM_RNG
|
||||
#define TIOCM_OUT1 0x2000
|
||||
#define TIOCM_OUT2 0x4000
|
||||
#define TIOCM_LOOP 0x8000
|
||||
|
||||
/* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */
|
||||
|
||||
|
||||
#endif /* _UAPI_S390_TERMIOS_H */
|
@ -1,147 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef _SPARC_TERMIOS_H
|
||||
#define _SPARC_TERMIOS_H
|
||||
|
||||
#include <uapi/asm/termios.h>
|
||||
|
||||
|
||||
/*
|
||||
* c_cc characters in the termio structure. Oh, how I love being
|
||||
* backwardly compatible. Notice that character 4 and 5 are
|
||||
* interpreted differently depending on whether ICANON is set in
|
||||
* c_lflag. If it's set, they are used as _VEOF and _VEOL, otherwise
|
||||
* as _VMIN and V_TIME. This is for compatibility with OSF/1 (which
|
||||
* is compatible with sysV)...
|
||||
*/
|
||||
#define _VMIN 4
|
||||
#define _VTIME 5
|
||||
|
||||
/* intr=^C quit=^\ erase=del kill=^U
|
||||
eof=^D eol=\0 eol2=\0 sxtc=\0
|
||||
start=^Q stop=^S susp=^Z dsusp=^Y
|
||||
reprint=^R discard=^U werase=^W lnext=^V
|
||||
vmin=\1 vtime=\0
|
||||
*/
|
||||
#define INIT_C_CC "\003\034\177\025\004\000\000\000\021\023\032\031\022\025\027\026\001"
|
||||
|
||||
/*
|
||||
* Translate a "termio" structure into a "termios". Ugh.
|
||||
*/
|
||||
#define user_termio_to_kernel_termios(termios, termio) \
|
||||
({ \
|
||||
unsigned short tmp; \
|
||||
int err; \
|
||||
err = get_user(tmp, &(termio)->c_iflag); \
|
||||
(termios)->c_iflag = (0xffff0000 & ((termios)->c_iflag)) | tmp; \
|
||||
err |= get_user(tmp, &(termio)->c_oflag); \
|
||||
(termios)->c_oflag = (0xffff0000 & ((termios)->c_oflag)) | tmp; \
|
||||
err |= get_user(tmp, &(termio)->c_cflag); \
|
||||
(termios)->c_cflag = (0xffff0000 & ((termios)->c_cflag)) | tmp; \
|
||||
err |= get_user(tmp, &(termio)->c_lflag); \
|
||||
(termios)->c_lflag = (0xffff0000 & ((termios)->c_lflag)) | tmp; \
|
||||
err |= copy_from_user((termios)->c_cc, (termio)->c_cc, NCC); \
|
||||
err; \
|
||||
})
|
||||
|
||||
/*
|
||||
* Translate a "termios" structure into a "termio". Ugh.
|
||||
*
|
||||
* Note the "fun" _VMIN overloading.
|
||||
*/
|
||||
#define kernel_termios_to_user_termio(termio, termios) \
|
||||
({ \
|
||||
int err; \
|
||||
err = put_user((termios)->c_iflag, &(termio)->c_iflag); \
|
||||
err |= put_user((termios)->c_oflag, &(termio)->c_oflag); \
|
||||
err |= put_user((termios)->c_cflag, &(termio)->c_cflag); \
|
||||
err |= put_user((termios)->c_lflag, &(termio)->c_lflag); \
|
||||
err |= put_user((termios)->c_line, &(termio)->c_line); \
|
||||
err |= copy_to_user((termio)->c_cc, (termios)->c_cc, NCC); \
|
||||
if (!((termios)->c_lflag & ICANON)) { \
|
||||
err |= put_user((termios)->c_cc[VMIN], &(termio)->c_cc[_VMIN]); \
|
||||
err |= put_user((termios)->c_cc[VTIME], &(termio)->c_cc[_VTIME]); \
|
||||
} \
|
||||
err; \
|
||||
})
|
||||
|
||||
#define user_termios_to_kernel_termios(k, u) \
|
||||
({ \
|
||||
int err; \
|
||||
err = get_user((k)->c_iflag, &(u)->c_iflag); \
|
||||
err |= get_user((k)->c_oflag, &(u)->c_oflag); \
|
||||
err |= get_user((k)->c_cflag, &(u)->c_cflag); \
|
||||
err |= get_user((k)->c_lflag, &(u)->c_lflag); \
|
||||
err |= get_user((k)->c_line, &(u)->c_line); \
|
||||
err |= copy_from_user((k)->c_cc, (u)->c_cc, NCCS); \
|
||||
if ((k)->c_lflag & ICANON) { \
|
||||
err |= get_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \
|
||||
err |= get_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \
|
||||
} else { \
|
||||
err |= get_user((k)->c_cc[VMIN], &(u)->c_cc[_VMIN]); \
|
||||
err |= get_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \
|
||||
} \
|
||||
err |= get_user((k)->c_ispeed, &(u)->c_ispeed); \
|
||||
err |= get_user((k)->c_ospeed, &(u)->c_ospeed); \
|
||||
err; \
|
||||
})
|
||||
|
||||
#define kernel_termios_to_user_termios(u, k) \
|
||||
({ \
|
||||
int err; \
|
||||
err = put_user((k)->c_iflag, &(u)->c_iflag); \
|
||||
err |= put_user((k)->c_oflag, &(u)->c_oflag); \
|
||||
err |= put_user((k)->c_cflag, &(u)->c_cflag); \
|
||||
err |= put_user((k)->c_lflag, &(u)->c_lflag); \
|
||||
err |= put_user((k)->c_line, &(u)->c_line); \
|
||||
err |= copy_to_user((u)->c_cc, (k)->c_cc, NCCS); \
|
||||
if (!((k)->c_lflag & ICANON)) { \
|
||||
err |= put_user((k)->c_cc[VMIN], &(u)->c_cc[_VMIN]); \
|
||||
err |= put_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \
|
||||
} else { \
|
||||
err |= put_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \
|
||||
err |= put_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \
|
||||
} \
|
||||
err |= put_user((k)->c_ispeed, &(u)->c_ispeed); \
|
||||
err |= put_user((k)->c_ospeed, &(u)->c_ospeed); \
|
||||
err; \
|
||||
})
|
||||
|
||||
#define user_termios_to_kernel_termios_1(k, u) \
|
||||
({ \
|
||||
int err; \
|
||||
err = get_user((k)->c_iflag, &(u)->c_iflag); \
|
||||
err |= get_user((k)->c_oflag, &(u)->c_oflag); \
|
||||
err |= get_user((k)->c_cflag, &(u)->c_cflag); \
|
||||
err |= get_user((k)->c_lflag, &(u)->c_lflag); \
|
||||
err |= get_user((k)->c_line, &(u)->c_line); \
|
||||
err |= copy_from_user((k)->c_cc, (u)->c_cc, NCCS); \
|
||||
if ((k)->c_lflag & ICANON) { \
|
||||
err |= get_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \
|
||||
err |= get_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \
|
||||
} else { \
|
||||
err |= get_user((k)->c_cc[VMIN], &(u)->c_cc[_VMIN]); \
|
||||
err |= get_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \
|
||||
} \
|
||||
err; \
|
||||
})
|
||||
|
||||
#define kernel_termios_to_user_termios_1(u, k) \
|
||||
({ \
|
||||
int err; \
|
||||
err = put_user((k)->c_iflag, &(u)->c_iflag); \
|
||||
err |= put_user((k)->c_oflag, &(u)->c_oflag); \
|
||||
err |= put_user((k)->c_cflag, &(u)->c_cflag); \
|
||||
err |= put_user((k)->c_lflag, &(u)->c_lflag); \
|
||||
err |= put_user((k)->c_line, &(u)->c_line); \
|
||||
err |= copy_to_user((u)->c_cc, (k)->c_cc, NCCS); \
|
||||
if (!((k)->c_lflag & ICANON)) { \
|
||||
err |= put_user((k)->c_cc[VMIN], &(u)->c_cc[_VMIN]); \
|
||||
err |= put_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \
|
||||
} else { \
|
||||
err |= put_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \
|
||||
err |= put_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \
|
||||
} \
|
||||
err; \
|
||||
})
|
||||
|
||||
#endif /* _SPARC_TERMIOS_H */
|
@ -87,12 +87,13 @@ obj-$(CONFIG_SPARC64_SMP) += hvtramp.o
|
||||
obj-y += auxio_$(BITS).o
|
||||
obj-$(CONFIG_SUN_PM) += apc.o pmc.o
|
||||
|
||||
obj-y += termios.o
|
||||
|
||||
obj-$(CONFIG_MODULES) += module.o
|
||||
obj-$(CONFIG_MODULES) += sparc_ksyms.o
|
||||
obj-$(CONFIG_SPARC_LED) += led.o
|
||||
obj-$(CONFIG_KGDB) += kgdb_$(BITS).o
|
||||
|
||||
|
||||
obj-$(CONFIG_DYNAMIC_FTRACE) += ftrace.o
|
||||
obj-$(CONFIG_FUNCTION_GRAPH_TRACER) += ftrace.o
|
||||
|
||||
@ -104,6 +105,7 @@ obj-$(CONFIG_SPARC64_PCI) += pci_psycho.o pci_sabre.o pci_schizo.o
|
||||
obj-$(CONFIG_SPARC64_PCI) += pci_sun4v.o pci_sun4v_asm.o pci_fire.o
|
||||
obj-$(CONFIG_SPARC64_PCI_MSI) += pci_msi.o
|
||||
|
||||
|
||||
obj-$(CONFIG_COMPAT) += sys32.o sys_sparc32.o signal32.o
|
||||
|
||||
obj-$(CONFIG_US3_MC) += chmc.o
|
||||
|
115
arch/sparc/kernel/termios.c
Normal file
115
arch/sparc/kernel/termios.c
Normal file
@ -0,0 +1,115 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include <linux/termios_internal.h>
|
||||
|
||||
/*
|
||||
* c_cc characters in the termio structure. Oh, how I love being
|
||||
* backwardly compatible. Notice that character 4 and 5 are
|
||||
* interpreted differently depending on whether ICANON is set in
|
||||
* c_lflag. If it's set, they are used as _VEOF and _VEOL, otherwise
|
||||
* as _VMIN and V_TIME. This is for compatibility with OSF/1 (which
|
||||
* is compatible with sysV)...
|
||||
*/
|
||||
#define _VMIN 4
|
||||
#define _VTIME 5
|
||||
|
||||
int kernel_termios_to_user_termio(struct termio __user *termio,
|
||||
struct ktermios *termios)
|
||||
{
|
||||
struct termio v;
|
||||
memset(&v, 0, sizeof(struct termio));
|
||||
v.c_iflag = termios->c_iflag;
|
||||
v.c_oflag = termios->c_oflag;
|
||||
v.c_cflag = termios->c_cflag;
|
||||
v.c_lflag = termios->c_lflag;
|
||||
v.c_line = termios->c_line;
|
||||
memcpy(v.c_cc, termios->c_cc, NCC);
|
||||
if (!(v.c_lflag & ICANON)) {
|
||||
v.c_cc[_VMIN] = termios->c_cc[VMIN];
|
||||
v.c_cc[_VTIME] = termios->c_cc[VTIME];
|
||||
}
|
||||
return copy_to_user(termio, &v, sizeof(struct termio));
|
||||
}
|
||||
|
||||
int user_termios_to_kernel_termios(struct ktermios *k,
|
||||
struct termios2 __user *u)
|
||||
{
|
||||
int err;
|
||||
err = get_user(k->c_iflag, &u->c_iflag);
|
||||
err |= get_user(k->c_oflag, &u->c_oflag);
|
||||
err |= get_user(k->c_cflag, &u->c_cflag);
|
||||
err |= get_user(k->c_lflag, &u->c_lflag);
|
||||
err |= get_user(k->c_line, &u->c_line);
|
||||
err |= copy_from_user(k->c_cc, u->c_cc, NCCS);
|
||||
if (k->c_lflag & ICANON) {
|
||||
err |= get_user(k->c_cc[VEOF], &u->c_cc[VEOF]);
|
||||
err |= get_user(k->c_cc[VEOL], &u->c_cc[VEOL]);
|
||||
} else {
|
||||
err |= get_user(k->c_cc[VMIN], &u->c_cc[_VMIN]);
|
||||
err |= get_user(k->c_cc[VTIME], &u->c_cc[_VTIME]);
|
||||
}
|
||||
err |= get_user(k->c_ispeed, &u->c_ispeed);
|
||||
err |= get_user(k->c_ospeed, &u->c_ospeed);
|
||||
return err;
|
||||
}
|
||||
|
||||
int kernel_termios_to_user_termios(struct termios2 __user *u,
|
||||
struct ktermios *k)
|
||||
{
|
||||
int err;
|
||||
err = put_user(k->c_iflag, &u->c_iflag);
|
||||
err |= put_user(k->c_oflag, &u->c_oflag);
|
||||
err |= put_user(k->c_cflag, &u->c_cflag);
|
||||
err |= put_user(k->c_lflag, &u->c_lflag);
|
||||
err |= put_user(k->c_line, &u->c_line);
|
||||
err |= copy_to_user(u->c_cc, k->c_cc, NCCS);
|
||||
if (!(k->c_lflag & ICANON)) {
|
||||
err |= put_user(k->c_cc[VMIN], &u->c_cc[_VMIN]);
|
||||
err |= put_user(k->c_cc[VTIME], &u->c_cc[_VTIME]);
|
||||
} else {
|
||||
err |= put_user(k->c_cc[VEOF], &u->c_cc[VEOF]);
|
||||
err |= put_user(k->c_cc[VEOL], &u->c_cc[VEOL]);
|
||||
}
|
||||
err |= put_user(k->c_ispeed, &u->c_ispeed);
|
||||
err |= put_user(k->c_ospeed, &u->c_ospeed);
|
||||
return err;
|
||||
}
|
||||
|
||||
int user_termios_to_kernel_termios_1(struct ktermios *k,
|
||||
struct termios __user *u)
|
||||
{
|
||||
int err;
|
||||
err = get_user(k->c_iflag, &u->c_iflag);
|
||||
err |= get_user(k->c_oflag, &u->c_oflag);
|
||||
err |= get_user(k->c_cflag, &u->c_cflag);
|
||||
err |= get_user(k->c_lflag, &u->c_lflag);
|
||||
err |= get_user(k->c_line, &u->c_line);
|
||||
err |= copy_from_user(k->c_cc, u->c_cc, NCCS);
|
||||
if (k->c_lflag & ICANON) {
|
||||
err |= get_user(k->c_cc[VEOF], &u->c_cc[VEOF]);
|
||||
err |= get_user(k->c_cc[VEOL], &u->c_cc[VEOL]);
|
||||
} else {
|
||||
err |= get_user(k->c_cc[VMIN], &u->c_cc[_VMIN]);
|
||||
err |= get_user(k->c_cc[VTIME], &u->c_cc[_VTIME]);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
int kernel_termios_to_user_termios_1(struct termios __user *u,
|
||||
struct ktermios *k)
|
||||
{
|
||||
int err;
|
||||
err = put_user(k->c_iflag, &u->c_iflag);
|
||||
err |= put_user(k->c_oflag, &u->c_oflag);
|
||||
err |= put_user(k->c_cflag, &u->c_cflag);
|
||||
err |= put_user(k->c_lflag, &u->c_lflag);
|
||||
err |= put_user(k->c_line, &u->c_line);
|
||||
err |= copy_to_user(u->c_cc, k->c_cc, NCCS);
|
||||
if (!(k->c_lflag & ICANON)) {
|
||||
err |= put_user(k->c_cc[VMIN], &u->c_cc[_VMIN]);
|
||||
err |= put_user(k->c_cc[VTIME], &u->c_cc[_VTIME]);
|
||||
} else {
|
||||
err |= put_user(k->c_cc[VEOF], &u->c_cc[VEOF]);
|
||||
err |= put_user(k->c_cc[VEOL], &u->c_cc[VEOL]);
|
||||
}
|
||||
return err;
|
||||
}
|
@ -2274,7 +2274,8 @@ static int mgslpc_ioctl(struct tty_struct *tty,
|
||||
* tty pointer to tty structure
|
||||
* termios pointer to buffer to hold returned old termios
|
||||
*/
|
||||
static void mgslpc_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
|
||||
static void mgslpc_set_termios(struct tty_struct *tty,
|
||||
const struct ktermios *old_termios)
|
||||
{
|
||||
MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data;
|
||||
unsigned long flags;
|
||||
|
@ -497,7 +497,7 @@ static unsigned int ipoctal_chars_in_buffer(struct tty_struct *tty)
|
||||
}
|
||||
|
||||
static void ipoctal_set_termios(struct tty_struct *tty,
|
||||
struct ktermios *old_termios)
|
||||
const struct ktermios *old_termios)
|
||||
{
|
||||
unsigned int cflag;
|
||||
unsigned char mr1 = 0;
|
||||
|
@ -246,7 +246,7 @@ static inline void sdio_uart_update_mctrl(struct sdio_uart_port *port,
|
||||
|
||||
static void sdio_uart_change_speed(struct sdio_uart_port *port,
|
||||
struct ktermios *termios,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
unsigned char cval, fcr = 0;
|
||||
unsigned int baud, quot;
|
||||
@ -859,7 +859,7 @@ static void sdio_uart_unthrottle(struct tty_struct *tty)
|
||||
}
|
||||
|
||||
static void sdio_uart_set_termios(struct tty_struct *tty,
|
||||
struct ktermios *old_termios)
|
||||
const struct ktermios *old_termios)
|
||||
{
|
||||
struct sdio_uart_port *port = tty->driver_data;
|
||||
unsigned int cflag = tty->termios.c_cflag;
|
||||
|
@ -1380,7 +1380,8 @@ static void hso_serial_cleanup(struct tty_struct *tty)
|
||||
}
|
||||
|
||||
/* setup the term */
|
||||
static void hso_serial_set_termios(struct tty_struct *tty, struct ktermios *old)
|
||||
static void hso_serial_set_termios(struct tty_struct *tty,
|
||||
const struct ktermios *old)
|
||||
{
|
||||
struct hso_serial *serial = tty->driver_data;
|
||||
unsigned long flags;
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/termios.h>
|
||||
#include <linux/wwan.h>
|
||||
#include <net/rtnetlink.h>
|
||||
|
@ -1760,7 +1760,7 @@ tty3270_flush_chars(struct tty_struct *tty)
|
||||
* Check for visible/invisible input switches
|
||||
*/
|
||||
static void
|
||||
tty3270_set_termios(struct tty_struct *tty, struct ktermios *old)
|
||||
tty3270_set_termios(struct tty_struct *tty, const struct ktermios *old)
|
||||
{
|
||||
struct tty3270 *tp;
|
||||
int new;
|
||||
|
@ -1267,7 +1267,8 @@ static int fwtty_ioctl(struct tty_struct *tty, unsigned int cmd,
|
||||
return err;
|
||||
}
|
||||
|
||||
static void fwtty_set_termios(struct tty_struct *tty, struct ktermios *old)
|
||||
static void fwtty_set_termios(struct tty_struct *tty,
|
||||
const struct ktermios *old)
|
||||
{
|
||||
struct fwtty_port *port = tty->driver_data;
|
||||
unsigned int baud;
|
||||
|
@ -480,7 +480,7 @@ static int gb_tty_break_ctl(struct tty_struct *tty, int state)
|
||||
}
|
||||
|
||||
static void gb_tty_set_termios(struct tty_struct *tty,
|
||||
struct ktermios *termios_old)
|
||||
const struct ktermios *termios_old)
|
||||
{
|
||||
struct gb_uart_set_line_coding_request newline;
|
||||
struct gb_tty *gb_tty = tty->driver_data;
|
||||
|
@ -94,7 +94,7 @@ static struct tty_driver *serial_driver;
|
||||
static unsigned char current_ctl_bits;
|
||||
|
||||
static void change_speed(struct tty_struct *tty, struct serial_state *info,
|
||||
struct ktermios *old);
|
||||
const struct ktermios *old);
|
||||
static void rs_wait_until_sent(struct tty_struct *tty, int timeout);
|
||||
|
||||
|
||||
@ -566,7 +566,7 @@ static void shutdown(struct tty_struct *tty, struct serial_state *info)
|
||||
* the specified baud rate for a serial port.
|
||||
*/
|
||||
static void change_speed(struct tty_struct *tty, struct serial_state *info,
|
||||
struct ktermios *old_termios)
|
||||
const struct ktermios *old_termios)
|
||||
{
|
||||
struct tty_port *port = &info->tport;
|
||||
int quot = 0, baud_base, baud;
|
||||
@ -1169,7 +1169,7 @@ static int rs_ioctl(struct tty_struct *tty,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void rs_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
|
||||
static void rs_set_termios(struct tty_struct *tty, const struct ktermios *old_termios)
|
||||
{
|
||||
struct serial_state *info = tty->driver_data;
|
||||
unsigned long flags;
|
||||
|
@ -29,7 +29,6 @@
|
||||
|
||||
|
||||
/* General device driver settings */
|
||||
#define HVC_IUCV_MAGIC 0xc9e4c3e5
|
||||
#define MAX_HVC_IUCV_LINES HVC_ALLOC_TTY_ADAPTERS
|
||||
#define MEMPOOL_MIN_NR (PAGE_SIZE / sizeof(struct iucv_tty_buffer)/4)
|
||||
|
||||
@ -131,9 +130,9 @@ static struct iucv_handler hvc_iucv_handler = {
|
||||
*/
|
||||
static struct hvc_iucv_private *hvc_iucv_get_private(uint32_t num)
|
||||
{
|
||||
if ((num < HVC_IUCV_MAGIC) || (num - HVC_IUCV_MAGIC > hvc_iucv_devices))
|
||||
if (num > hvc_iucv_devices)
|
||||
return NULL;
|
||||
return hvc_iucv_table[num - HVC_IUCV_MAGIC];
|
||||
return hvc_iucv_table[num];
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1072,8 +1071,8 @@ static int __init hvc_iucv_alloc(int id, unsigned int is_console)
|
||||
priv->is_console = is_console;
|
||||
|
||||
/* allocate hvc device */
|
||||
priv->hvc = hvc_alloc(HVC_IUCV_MAGIC + id, /* PAGE_SIZE */
|
||||
HVC_IUCV_MAGIC + id, &hvc_iucv_ops, 256);
|
||||
priv->hvc = hvc_alloc(id, /* PAGE_SIZE */
|
||||
id, &hvc_iucv_ops, 256);
|
||||
if (IS_ERR(priv->hvc)) {
|
||||
rc = PTR_ERR(priv->hvc);
|
||||
goto out_error_hvc;
|
||||
@ -1371,7 +1370,7 @@ static int __init hvc_iucv_init(void)
|
||||
|
||||
/* register the first terminal device as console
|
||||
* (must be done before allocating hvc terminal devices) */
|
||||
rc = hvc_instantiate(HVC_IUCV_MAGIC, IUCV_HVC_CON_IDX, &hvc_iucv_ops);
|
||||
rc = hvc_instantiate(0, IUCV_HVC_CON_IDX, &hvc_iucv_ops);
|
||||
if (rc) {
|
||||
pr_err("Registering HVC terminal device as "
|
||||
"Linux console failed\n");
|
||||
|
@ -69,6 +69,7 @@
|
||||
#include <asm/hvconsole.h>
|
||||
#include <asm/hvcserver.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/termios_internal.h>
|
||||
#include <asm/vio.h>
|
||||
|
||||
/*
|
||||
@ -839,7 +840,7 @@ static void hvcs_set_pi(struct hvcs_partner_info *pi, struct hvcs_struct *hvcsd)
|
||||
hvcsd->p_partition_ID = pi->partition_ID;
|
||||
|
||||
/* copy the null-term char too */
|
||||
strlcpy(hvcsd->p_location_code, pi->location_code,
|
||||
strscpy(hvcsd->p_location_code, pi->location_code,
|
||||
sizeof(hvcsd->p_location_code));
|
||||
}
|
||||
|
||||
|
@ -491,7 +491,7 @@ static int moxa_write(struct tty_struct *, const unsigned char *, int);
|
||||
static unsigned int moxa_write_room(struct tty_struct *);
|
||||
static void moxa_flush_buffer(struct tty_struct *);
|
||||
static unsigned int moxa_chars_in_buffer(struct tty_struct *);
|
||||
static void moxa_set_termios(struct tty_struct *, struct ktermios *);
|
||||
static void moxa_set_termios(struct tty_struct *, const struct ktermios *);
|
||||
static void moxa_stop(struct tty_struct *);
|
||||
static void moxa_start(struct tty_struct *);
|
||||
static void moxa_hangup(struct tty_struct *);
|
||||
@ -499,7 +499,7 @@ static int moxa_tiocmget(struct tty_struct *tty);
|
||||
static int moxa_tiocmset(struct tty_struct *tty,
|
||||
unsigned int set, unsigned int clear);
|
||||
static void moxa_poll(struct timer_list *);
|
||||
static void moxa_set_tty_param(struct tty_struct *, struct ktermios *);
|
||||
static void moxa_set_tty_param(struct tty_struct *, const struct ktermios *);
|
||||
static void moxa_shutdown(struct tty_port *);
|
||||
static int moxa_carrier_raised(struct tty_port *);
|
||||
static void moxa_dtr_rts(struct tty_port *, int);
|
||||
@ -1602,7 +1602,7 @@ static int moxa_tiocmset(struct tty_struct *tty,
|
||||
}
|
||||
|
||||
static void moxa_set_termios(struct tty_struct *tty,
|
||||
struct ktermios *old_termios)
|
||||
const struct ktermios *old_termios)
|
||||
{
|
||||
struct moxa_port *ch = tty->driver_data;
|
||||
|
||||
@ -1761,7 +1761,8 @@ static void moxa_poll(struct timer_list *unused)
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
static void moxa_set_tty_param(struct tty_struct *tty, struct ktermios *old_termios)
|
||||
static void moxa_set_tty_param(struct tty_struct *tty,
|
||||
const struct ktermios *old_termios)
|
||||
{
|
||||
register struct ktermios *ts = &tty->termios;
|
||||
struct moxa_port *ch = tty->driver_data;
|
||||
|
@ -398,7 +398,7 @@ static enum mxser_must_hwid mxser_must_get_hwid(unsigned long io)
|
||||
oldmcr = inb(io + UART_MCR);
|
||||
outb(0, io + UART_MCR);
|
||||
mxser_set_must_xon1_value(io, 0x11);
|
||||
if ((hwid = inb(io + UART_MCR)) != 0) {
|
||||
if (inb(io + UART_MCR) != 0) {
|
||||
outb(oldmcr, io + UART_MCR);
|
||||
return MOXA_OTHER_UART;
|
||||
}
|
||||
@ -571,7 +571,8 @@ static void mxser_handle_cts(struct tty_struct *tty, struct mxser_port *info,
|
||||
* This routine is called to set the UART divisor registers to match
|
||||
* the specified baud rate for a serial port.
|
||||
*/
|
||||
static void mxser_change_speed(struct tty_struct *tty, struct ktermios *old_termios)
|
||||
static void mxser_change_speed(struct tty_struct *tty,
|
||||
const struct ktermios *old_termios)
|
||||
{
|
||||
struct mxser_port *info = tty->driver_data;
|
||||
unsigned cflag, cval;
|
||||
@ -1348,7 +1349,8 @@ static void mxser_start(struct tty_struct *tty)
|
||||
spin_unlock_irqrestore(&info->slock, flags);
|
||||
}
|
||||
|
||||
static void mxser_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
|
||||
static void mxser_set_termios(struct tty_struct *tty,
|
||||
const struct ktermios *old_termios)
|
||||
{
|
||||
struct mxser_port *info = tty->driver_data;
|
||||
unsigned long flags;
|
||||
|
@ -63,6 +63,14 @@
|
||||
static int debug;
|
||||
module_param(debug, int, 0600);
|
||||
|
||||
/* Module debug bits */
|
||||
#define DBG_DUMP BIT(0) /* Data transmission dump. */
|
||||
#define DBG_CD_ON BIT(1) /* Always assume CD line on. */
|
||||
#define DBG_DATA BIT(2) /* Data transmission details. */
|
||||
#define DBG_ERRORS BIT(3) /* Details for fail conditions. */
|
||||
#define DBG_TTY BIT(4) /* Transmission statistics for DLCI TTYs. */
|
||||
#define DBG_PAYLOAD BIT(5) /* Limits DBG_DUMP to payload frames. */
|
||||
|
||||
/* Defaults: these are from the specification */
|
||||
|
||||
#define T1 10 /* 100mS */
|
||||
@ -164,6 +172,9 @@ struct gsm_dlci {
|
||||
struct net_device *net; /* network interface, if created */
|
||||
};
|
||||
|
||||
/* Total number of supported devices */
|
||||
#define GSM_TTY_MINORS 256
|
||||
|
||||
/* DLCI 0, 62/63 are special or reserved see gsmtty_open */
|
||||
|
||||
#define NUM_DLCI 64
|
||||
@ -184,6 +195,11 @@ struct gsm_control {
|
||||
int error; /* Error if any */
|
||||
};
|
||||
|
||||
enum gsm_encoding {
|
||||
GSM_BASIC_OPT,
|
||||
GSM_ADV_OPT,
|
||||
};
|
||||
|
||||
enum gsm_mux_state {
|
||||
GSM_SEARCH,
|
||||
GSM_START,
|
||||
@ -230,7 +246,7 @@ struct gsm_mux {
|
||||
unsigned int address;
|
||||
unsigned int count;
|
||||
bool escape;
|
||||
int encoding;
|
||||
enum gsm_encoding encoding;
|
||||
u8 control;
|
||||
u8 fcs;
|
||||
u8 *txframe; /* TX framing buffer */
|
||||
@ -527,7 +543,7 @@ static int gsm_register_devices(struct tty_driver *driver, unsigned int index)
|
||||
*/
|
||||
dev = tty_register_device(gsm_tty_driver, base + i, NULL);
|
||||
if (IS_ERR(dev)) {
|
||||
if (debug & 8)
|
||||
if (debug & DBG_ERRORS)
|
||||
pr_info("%s failed to register device minor %u",
|
||||
__func__, base + i);
|
||||
for (i--; i >= 1; i--)
|
||||
@ -581,8 +597,12 @@ static void gsm_unregister_devices(struct tty_driver *driver,
|
||||
static void gsm_print_packet(const char *hdr, int addr, int cr,
|
||||
u8 control, const u8 *data, int dlen)
|
||||
{
|
||||
if (!(debug & 1))
|
||||
if (!(debug & DBG_DUMP))
|
||||
return;
|
||||
/* Only show user payload frames if debug & DBG_PAYLOAD */
|
||||
if (!(debug & DBG_PAYLOAD) && addr != 0)
|
||||
if ((control & ~PF) == UI || (control & ~PF) == UIH)
|
||||
return;
|
||||
|
||||
pr_info("%s %d) %c: ", hdr, addr, "RC"[cr]);
|
||||
|
||||
@ -693,7 +713,7 @@ static int gsm_send(struct gsm_mux *gsm, int addr, int cr, int control)
|
||||
*dp++ = (addr << 2) | (ocr << 1) | EA;
|
||||
*dp++ = control;
|
||||
|
||||
if (gsm->encoding == 0)
|
||||
if (gsm->encoding == GSM_BASIC_OPT)
|
||||
*dp++ = EA; /* Length of data = 0 */
|
||||
|
||||
*dp = 0xFF - gsm_fcs_add_block(INIT_FCS, msg->data, dp - msg->data);
|
||||
@ -812,7 +832,7 @@ static int gsm_send_packet(struct gsm_mux *gsm, struct gsm_msg *msg)
|
||||
int len, ret;
|
||||
|
||||
|
||||
if (gsm->encoding == 0) {
|
||||
if (gsm->encoding == GSM_BASIC_OPT) {
|
||||
gsm->txframe[0] = GSM0_SOF;
|
||||
memcpy(gsm->txframe + 1, msg->data, msg->len);
|
||||
gsm->txframe[msg->len + 1] = GSM0_SOF;
|
||||
@ -824,7 +844,7 @@ static int gsm_send_packet(struct gsm_mux *gsm, struct gsm_msg *msg)
|
||||
len += 2;
|
||||
}
|
||||
|
||||
if (debug & 4)
|
||||
if (debug & DBG_DATA)
|
||||
gsm_hex_dump_bytes(__func__, gsm->txframe, len);
|
||||
gsm_print_packet("-->", msg->addr, gsm->initiator, msg->ctrl, msg->data,
|
||||
msg->len);
|
||||
@ -964,7 +984,7 @@ static void __gsm_data_queue(struct gsm_dlci *dlci, struct gsm_msg *msg)
|
||||
u8 *fcs = dp + msg->len;
|
||||
|
||||
/* Fill in the header */
|
||||
if (gsm->encoding == 0) {
|
||||
if (gsm->encoding == GSM_BASIC_OPT) {
|
||||
if (msg->len < 128)
|
||||
*--dp = (msg->len << 1) | EA;
|
||||
else {
|
||||
@ -1305,6 +1325,31 @@ static void gsm_dlci_data_kick(struct gsm_dlci *dlci)
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* gsm_control_command - send a command frame to a control
|
||||
* @gsm: gsm channel
|
||||
* @cmd: the command to use
|
||||
* @data: data to follow encoded info
|
||||
* @dlen: length of data
|
||||
*
|
||||
* Encode up and queue a UI/UIH frame containing our command.
|
||||
*/
|
||||
static int gsm_control_command(struct gsm_mux *gsm, int cmd, const u8 *data,
|
||||
int dlen)
|
||||
{
|
||||
struct gsm_msg *msg = gsm_data_alloc(gsm, 0, dlen + 2, gsm->ftype);
|
||||
|
||||
if (msg == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
msg->data[0] = (cmd << 1) | CR | EA; /* Set C/R */
|
||||
msg->data[1] = (dlen << 1) | EA;
|
||||
memcpy(msg->data + 2, data, dlen);
|
||||
gsm_data_queue(gsm->dlci[0], msg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* gsm_control_reply - send a response frame to a control
|
||||
* @gsm: gsm channel
|
||||
@ -1407,18 +1452,12 @@ static void gsm_control_modem(struct gsm_mux *gsm, const u8 *data, int clen)
|
||||
unsigned int modem = 0;
|
||||
struct gsm_dlci *dlci;
|
||||
int len = clen;
|
||||
int slen;
|
||||
int cl = clen;
|
||||
const u8 *dp = data;
|
||||
struct tty_struct *tty;
|
||||
|
||||
while (gsm_read_ea(&addr, *dp++) == 0) {
|
||||
len--;
|
||||
if (len == 0)
|
||||
return;
|
||||
}
|
||||
/* Must be at least one byte following the EA */
|
||||
len--;
|
||||
if (len <= 0)
|
||||
len = gsm_read_ea_val(&addr, data, cl);
|
||||
if (len < 1)
|
||||
return;
|
||||
|
||||
addr >>= 1;
|
||||
@ -1427,15 +1466,20 @@ static void gsm_control_modem(struct gsm_mux *gsm, const u8 *data, int clen)
|
||||
return;
|
||||
dlci = gsm->dlci[addr];
|
||||
|
||||
slen = len;
|
||||
while (gsm_read_ea(&modem, *dp++) == 0) {
|
||||
len--;
|
||||
if (len == 0)
|
||||
return;
|
||||
}
|
||||
len--;
|
||||
/* Must be at least one byte following the EA */
|
||||
if ((cl - len) < 1)
|
||||
return;
|
||||
|
||||
dp += len;
|
||||
cl -= len;
|
||||
|
||||
/* get the modem status */
|
||||
len = gsm_read_ea_val(&modem, dp, cl);
|
||||
if (len < 1)
|
||||
return;
|
||||
|
||||
tty = tty_port_tty_get(&dlci->port);
|
||||
gsm_process_modem(tty, dlci, modem, slen - len);
|
||||
gsm_process_modem(tty, dlci, modem, cl);
|
||||
if (tty) {
|
||||
tty_wakeup(tty);
|
||||
tty_kref_put(tty);
|
||||
@ -1611,13 +1655,7 @@ static void gsm_control_response(struct gsm_mux *gsm, unsigned int command,
|
||||
|
||||
static void gsm_control_transmit(struct gsm_mux *gsm, struct gsm_control *ctrl)
|
||||
{
|
||||
struct gsm_msg *msg = gsm_data_alloc(gsm, 0, ctrl->len + 2, gsm->ftype);
|
||||
if (msg == NULL)
|
||||
return;
|
||||
msg->data[0] = (ctrl->cmd << 1) | CR | EA; /* command */
|
||||
msg->data[1] = (ctrl->len << 1) | EA;
|
||||
memcpy(msg->data + 2, ctrl->data, ctrl->len);
|
||||
gsm_data_queue(gsm->dlci[0], msg);
|
||||
gsm_control_command(gsm, ctrl->cmd, ctrl->data, ctrl->len);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1737,7 +1775,7 @@ static int gsm_control_wait(struct gsm_mux *gsm, struct gsm_control *control)
|
||||
static void gsm_dlci_close(struct gsm_dlci *dlci)
|
||||
{
|
||||
del_timer(&dlci->t1);
|
||||
if (debug & 8)
|
||||
if (debug & DBG_ERRORS)
|
||||
pr_debug("DLCI %d goes closed.\n", dlci->addr);
|
||||
dlci->state = DLCI_CLOSED;
|
||||
/* Prevent us from sending data before the link is up again */
|
||||
@ -1771,7 +1809,7 @@ static void gsm_dlci_open(struct gsm_dlci *dlci)
|
||||
/* This will let a tty open continue */
|
||||
dlci->state = DLCI_OPEN;
|
||||
dlci->constipated = false;
|
||||
if (debug & 8)
|
||||
if (debug & DBG_ERRORS)
|
||||
pr_debug("DLCI %d goes open.\n", dlci->addr);
|
||||
/* Send current modem state */
|
||||
if (dlci->addr)
|
||||
@ -1807,7 +1845,7 @@ static void gsm_dlci_t1(struct timer_list *t)
|
||||
gsm_command(dlci->gsm, dlci->addr, SABM|PF);
|
||||
mod_timer(&dlci->t1, jiffies + gsm->t1 * HZ / 100);
|
||||
} else if (!dlci->addr && gsm->control == (DM | PF)) {
|
||||
if (debug & 8)
|
||||
if (debug & DBG_ERRORS)
|
||||
pr_info("DLCI %d opening in ADM mode.\n",
|
||||
dlci->addr);
|
||||
dlci->mode = DLCI_MODE_ADM;
|
||||
@ -1910,11 +1948,10 @@ static void gsm_dlci_data(struct gsm_dlci *dlci, const u8 *data, int clen)
|
||||
struct tty_port *port = &dlci->port;
|
||||
struct tty_struct *tty;
|
||||
unsigned int modem = 0;
|
||||
int len = clen;
|
||||
int slen = 0;
|
||||
int len;
|
||||
|
||||
if (debug & 16)
|
||||
pr_debug("%d bytes for tty\n", len);
|
||||
if (debug & DBG_TTY)
|
||||
pr_debug("%d bytes for tty\n", clen);
|
||||
switch (dlci->adaption) {
|
||||
/* Unsupported types */
|
||||
case 4: /* Packetised interruptible data */
|
||||
@ -1922,24 +1959,22 @@ static void gsm_dlci_data(struct gsm_dlci *dlci, const u8 *data, int clen)
|
||||
case 3: /* Packetised uininterruptible voice/data */
|
||||
break;
|
||||
case 2: /* Asynchronous serial with line state in each frame */
|
||||
while (gsm_read_ea(&modem, *data++) == 0) {
|
||||
len--;
|
||||
slen++;
|
||||
if (len == 0)
|
||||
return;
|
||||
}
|
||||
len--;
|
||||
slen++;
|
||||
len = gsm_read_ea_val(&modem, data, clen);
|
||||
if (len < 1)
|
||||
return;
|
||||
tty = tty_port_tty_get(port);
|
||||
if (tty) {
|
||||
gsm_process_modem(tty, dlci, modem, slen);
|
||||
gsm_process_modem(tty, dlci, modem, len);
|
||||
tty_wakeup(tty);
|
||||
tty_kref_put(tty);
|
||||
}
|
||||
/* Skip processed modem data */
|
||||
data += len;
|
||||
clen -= len;
|
||||
fallthrough;
|
||||
case 1: /* Line state will go via DLCI 0 controls only */
|
||||
default:
|
||||
tty_insert_flip_string(port, data, len);
|
||||
tty_insert_flip_string(port, data, clen);
|
||||
tty_flip_buffer_push(port);
|
||||
}
|
||||
}
|
||||
@ -1960,24 +1995,27 @@ static void gsm_dlci_command(struct gsm_dlci *dlci, const u8 *data, int len)
|
||||
{
|
||||
/* See what command is involved */
|
||||
unsigned int command = 0;
|
||||
while (len-- > 0) {
|
||||
if (gsm_read_ea(&command, *data++) == 1) {
|
||||
int clen = *data++;
|
||||
len--;
|
||||
/* FIXME: this is properly an EA */
|
||||
clen >>= 1;
|
||||
/* Malformed command ? */
|
||||
if (clen > len)
|
||||
return;
|
||||
if (command & 1)
|
||||
gsm_control_message(dlci->gsm, command,
|
||||
data, clen);
|
||||
else
|
||||
gsm_control_response(dlci->gsm, command,
|
||||
data, clen);
|
||||
return;
|
||||
}
|
||||
}
|
||||
unsigned int clen = 0;
|
||||
unsigned int dlen;
|
||||
|
||||
/* read the command */
|
||||
dlen = gsm_read_ea_val(&command, data, len);
|
||||
len -= dlen;
|
||||
data += dlen;
|
||||
|
||||
/* read any control data */
|
||||
dlen = gsm_read_ea_val(&clen, data, len);
|
||||
len -= dlen;
|
||||
data += dlen;
|
||||
|
||||
/* Malformed command? */
|
||||
if (clen > len)
|
||||
return;
|
||||
|
||||
if (command & 1)
|
||||
gsm_control_message(dlci->gsm, command, data, clen);
|
||||
else
|
||||
gsm_control_response(dlci->gsm, command, data, clen);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1999,7 +2037,7 @@ static void gsm_kick_timeout(struct work_struct *work)
|
||||
sent = gsm_dlci_data_sweep(gsm);
|
||||
mutex_unlock(&gsm->tx_mutex);
|
||||
|
||||
if (sent && debug & 4)
|
||||
if (sent && debug & DBG_DATA)
|
||||
pr_info("%s TX queue stalled\n", __func__);
|
||||
}
|
||||
|
||||
@ -2133,7 +2171,7 @@ static void gsm_queue(struct gsm_mux *gsm)
|
||||
|
||||
if (gsm->fcs != GOOD_FCS) {
|
||||
gsm->bad_fcs++;
|
||||
if (debug & 4)
|
||||
if (debug & DBG_DATA)
|
||||
pr_debug("BAD FCS %02x\n", gsm->fcs);
|
||||
return;
|
||||
}
|
||||
@ -2497,7 +2535,7 @@ static int gsm_activate_mux(struct gsm_mux *gsm)
|
||||
if (dlci == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
if (gsm->encoding == 0)
|
||||
if (gsm->encoding == GSM_BASIC_OPT)
|
||||
gsm->receive = gsm0_receive;
|
||||
else
|
||||
gsm->receive = gsm1_receive;
|
||||
@ -2614,7 +2652,7 @@ static struct gsm_mux *gsm_alloc_mux(void)
|
||||
gsm->n2 = N2;
|
||||
gsm->ftype = UIH;
|
||||
gsm->adaption = 1;
|
||||
gsm->encoding = 1;
|
||||
gsm->encoding = GSM_ADV_OPT;
|
||||
gsm->mru = 64; /* Default to encoding 1 so these should be 64 */
|
||||
gsm->mtu = 64;
|
||||
gsm->dead = true; /* Avoid early tty opens */
|
||||
@ -2716,7 +2754,7 @@ static int gsm_config(struct gsm_mux *gsm, struct gsm_config *c)
|
||||
gsm->initiator = c->initiator;
|
||||
gsm->mru = c->mru;
|
||||
gsm->mtu = c->mtu;
|
||||
gsm->encoding = c->encapsulation;
|
||||
gsm->encoding = c->encapsulation ? GSM_ADV_OPT : GSM_BASIC_OPT;
|
||||
gsm->adaption = c->adaption;
|
||||
gsm->n2 = c->n2;
|
||||
|
||||
@ -2760,7 +2798,7 @@ static int gsmld_output(struct gsm_mux *gsm, u8 *data, int len)
|
||||
set_bit(TTY_DO_WRITE_WAKEUP, &gsm->tty->flags);
|
||||
return -ENOSPC;
|
||||
}
|
||||
if (debug & 4)
|
||||
if (debug & DBG_DATA)
|
||||
gsm_hex_dump_bytes(__func__, data, len);
|
||||
return gsm->tty->ops->write(gsm->tty, data, len);
|
||||
}
|
||||
@ -2846,7 +2884,7 @@ static void gsmld_receive_buf(struct tty_struct *tty, const unsigned char *cp,
|
||||
struct gsm_mux *gsm = tty->disc_data;
|
||||
char flags = TTY_NORMAL;
|
||||
|
||||
if (debug & 4)
|
||||
if (debug & DBG_DATA)
|
||||
gsm_hex_dump_bytes(__func__, cp, count);
|
||||
|
||||
for (; count; count--, cp++) {
|
||||
@ -2939,8 +2977,7 @@ static int gsmld_open(struct tty_struct *tty)
|
||||
tty->receive_room = 65536;
|
||||
|
||||
/* Attach the initial passive connection */
|
||||
gsm->encoding = 1;
|
||||
|
||||
gsm->encoding = GSM_ADV_OPT;
|
||||
gsmld_attach_gsm(tty, gsm);
|
||||
|
||||
return 0;
|
||||
@ -3336,7 +3373,7 @@ static int gsm_modem_upd_via_msc(struct gsm_dlci *dlci, u8 brk)
|
||||
struct gsm_control *ctrl;
|
||||
int len = 2;
|
||||
|
||||
if (dlci->gsm->encoding != 0)
|
||||
if (dlci->gsm->encoding != GSM_BASIC_OPT)
|
||||
return 0;
|
||||
|
||||
modembits[0] = (dlci->addr << 2) | 2 | EA; /* DLCI, Valid, EA */
|
||||
@ -3365,7 +3402,7 @@ static int gsm_modem_update(struct gsm_dlci *dlci, u8 brk)
|
||||
/* Send convergence layer type 2 empty data frame. */
|
||||
gsm_modem_upd_via_data(dlci, brk);
|
||||
return 0;
|
||||
} else if (dlci->gsm->encoding == 0) {
|
||||
} else if (dlci->gsm->encoding == GSM_BASIC_OPT) {
|
||||
/* Send as MSC control message. */
|
||||
return gsm_modem_upd_via_msc(dlci, brk);
|
||||
}
|
||||
@ -3382,15 +3419,15 @@ static int gsm_carrier_raised(struct tty_port *port)
|
||||
/* Not yet open so no carrier info */
|
||||
if (dlci->state != DLCI_OPEN)
|
||||
return 0;
|
||||
if (debug & 2)
|
||||
if (debug & DBG_CD_ON)
|
||||
return 1;
|
||||
|
||||
/*
|
||||
* Basic mode with control channel in ADM mode may not respond
|
||||
* to CMD_MSC at all and modem_rx is empty.
|
||||
*/
|
||||
if (gsm->encoding == 0 && gsm->dlci[0]->mode == DLCI_MODE_ADM &&
|
||||
!dlci->modem_rx)
|
||||
if (gsm->encoding == GSM_BASIC_OPT &&
|
||||
gsm->dlci[0]->mode == DLCI_MODE_ADM && !dlci->modem_rx)
|
||||
return 1;
|
||||
|
||||
return dlci->modem_rx & TIOCM_CD;
|
||||
@ -3638,7 +3675,8 @@ static int gsmtty_ioctl(struct tty_struct *tty,
|
||||
}
|
||||
}
|
||||
|
||||
static void gsmtty_set_termios(struct tty_struct *tty, struct ktermios *old)
|
||||
static void gsmtty_set_termios(struct tty_struct *tty,
|
||||
const struct ktermios *old)
|
||||
{
|
||||
struct gsm_dlci *dlci = tty->driver_data;
|
||||
if (dlci->state == DLCI_CLOSED)
|
||||
@ -3736,7 +3774,7 @@ static int __init gsm_init(void)
|
||||
return status;
|
||||
}
|
||||
|
||||
gsm_tty_driver = tty_alloc_driver(256, TTY_DRIVER_REAL_RAW |
|
||||
gsm_tty_driver = tty_alloc_driver(GSM_TTY_MINORS, TTY_DRIVER_REAL_RAW |
|
||||
TTY_DRIVER_DYNAMIC_DEV | TTY_DRIVER_HARDWARE_BREAK);
|
||||
if (IS_ERR(gsm_tty_driver)) {
|
||||
pr_err("gsm_init: tty allocation failed.\n");
|
||||
|
@ -76,8 +76,6 @@
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#define HDLC_MAGIC 0x239e
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
@ -98,7 +96,6 @@
|
||||
#include <linux/if.h>
|
||||
#include <linux/bitops.h>
|
||||
|
||||
#include <asm/termios.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include "tty.h"
|
||||
|
||||
@ -124,7 +121,6 @@ struct n_hdlc_buf_list {
|
||||
|
||||
/**
|
||||
* struct n_hdlc - per device instance data structure
|
||||
* @magic: magic value for structure
|
||||
* @tbusy: reentrancy flag for tx wakeup code
|
||||
* @woke_up: tx wakeup needs to be run again as it was called while @tbusy
|
||||
* @tx_buf_list: list of pending transmit frame buffers
|
||||
@ -133,7 +129,6 @@ struct n_hdlc_buf_list {
|
||||
* @rx_free_buf_list: list unused received frame buffers
|
||||
*/
|
||||
struct n_hdlc {
|
||||
int magic;
|
||||
bool tbusy;
|
||||
bool woke_up;
|
||||
struct n_hdlc_buf_list tx_buf_list;
|
||||
@ -200,10 +195,6 @@ static void n_hdlc_tty_close(struct tty_struct *tty)
|
||||
{
|
||||
struct n_hdlc *n_hdlc = tty->disc_data;
|
||||
|
||||
if (n_hdlc->magic != HDLC_MAGIC) {
|
||||
pr_warn("n_hdlc: trying to close unopened tty!\n");
|
||||
return;
|
||||
}
|
||||
#if defined(TTY_NO_WRITE_SPLIT)
|
||||
clear_bit(TTY_NO_WRITE_SPLIT, &tty->flags);
|
||||
#endif
|
||||
@ -386,12 +377,6 @@ static void n_hdlc_tty_receive(struct tty_struct *tty, const __u8 *data,
|
||||
|
||||
pr_debug("%s() called count=%d\n", __func__, count);
|
||||
|
||||
/* verify line is using HDLC discipline */
|
||||
if (n_hdlc->magic != HDLC_MAGIC) {
|
||||
pr_err("line not using HDLC discipline\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (count > maxframe) {
|
||||
pr_debug("rx count>maxframesize, data discarded\n");
|
||||
return;
|
||||
@ -542,9 +527,6 @@ static ssize_t n_hdlc_tty_write(struct tty_struct *tty, struct file *file,
|
||||
|
||||
pr_debug("%s() called count=%zd\n", __func__, count);
|
||||
|
||||
if (n_hdlc->magic != HDLC_MAGIC)
|
||||
return -EIO;
|
||||
|
||||
/* verify frame size */
|
||||
if (count > maxframe) {
|
||||
pr_debug("%s: truncating user packet from %zu to %d\n",
|
||||
@ -609,10 +591,6 @@ static int n_hdlc_tty_ioctl(struct tty_struct *tty, unsigned int cmd,
|
||||
|
||||
pr_debug("%s() called %d\n", __func__, cmd);
|
||||
|
||||
/* Verify the status of the device */
|
||||
if (n_hdlc->magic != HDLC_MAGIC)
|
||||
return -EBADF;
|
||||
|
||||
switch (cmd) {
|
||||
case FIONREAD:
|
||||
/* report count of read data available */
|
||||
@ -673,9 +651,6 @@ static __poll_t n_hdlc_tty_poll(struct tty_struct *tty, struct file *filp,
|
||||
struct n_hdlc *n_hdlc = tty->disc_data;
|
||||
__poll_t mask = 0;
|
||||
|
||||
if (n_hdlc->magic != HDLC_MAGIC)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* queue the current process into any wait queue that may awaken in the
|
||||
* future (read and write)
|
||||
@ -739,9 +714,6 @@ static struct n_hdlc *n_hdlc_alloc(void)
|
||||
n_hdlc_alloc_buf(&n_hdlc->rx_free_buf_list, DEFAULT_RX_BUF_COUNT, "rx");
|
||||
n_hdlc_alloc_buf(&n_hdlc->tx_free_buf_list, DEFAULT_TX_BUF_COUNT, "tx");
|
||||
|
||||
/* Initialize the control block */
|
||||
n_hdlc->magic = HDLC_MAGIC;
|
||||
|
||||
return n_hdlc;
|
||||
|
||||
} /* end of n_hdlc_alloc() */
|
||||
|
@ -1758,7 +1758,7 @@ static int n_tty_receive_buf2(struct tty_struct *tty, const unsigned char *cp,
|
||||
*
|
||||
* Locking: Caller holds @tty->termios_rwsem
|
||||
*/
|
||||
static void n_tty_set_termios(struct tty_struct *tty, struct ktermios *old)
|
||||
static void n_tty_set_termios(struct tty_struct *tty, const struct ktermios *old)
|
||||
{
|
||||
struct n_tty_data *ldata = tty->disc_data;
|
||||
|
||||
|
@ -240,7 +240,7 @@ out:
|
||||
}
|
||||
|
||||
static void pty_set_termios(struct tty_struct *tty,
|
||||
struct ktermios *old_termios)
|
||||
const struct ktermios *old_termios)
|
||||
{
|
||||
/* See if packet mode change of state. */
|
||||
if (tty->link && tty->link->ctrl.packet) {
|
||||
|
@ -243,7 +243,7 @@ static void serial21285_shutdown(struct uart_port *port)
|
||||
|
||||
static void
|
||||
serial21285_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned int baud, quot, h_lcr, b;
|
||||
|
@ -755,7 +755,7 @@ static void set_clock_mux(struct uart_port *up, struct brcmuart_priv *priv,
|
||||
|
||||
static void brcmstb_set_termios(struct uart_port *up,
|
||||
struct ktermios *termios,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
struct uart_8250_port *p8250 = up_to_u8250p(up);
|
||||
struct brcmuart_priv *priv = up->private_data;
|
||||
|
@ -298,10 +298,9 @@ static void serial8250_backup_timeout(struct timer_list *t)
|
||||
jiffies + uart_poll_timeout(&up->port) + HZ / 5);
|
||||
}
|
||||
|
||||
static int univ8250_setup_irq(struct uart_8250_port *up)
|
||||
static void univ8250_setup_timer(struct uart_8250_port *up)
|
||||
{
|
||||
struct uart_port *port = &up->port;
|
||||
int retval = 0;
|
||||
|
||||
/*
|
||||
* The above check will only give an accurate result the first time
|
||||
@ -322,10 +321,16 @@ static int univ8250_setup_irq(struct uart_8250_port *up)
|
||||
*/
|
||||
if (!port->irq)
|
||||
mod_timer(&up->timer, jiffies + uart_poll_timeout(port));
|
||||
else
|
||||
retval = serial_link_irq_chain(up);
|
||||
}
|
||||
|
||||
return retval;
|
||||
static int univ8250_setup_irq(struct uart_8250_port *up)
|
||||
{
|
||||
struct uart_port *port = &up->port;
|
||||
|
||||
if (port->irq)
|
||||
return serial_link_irq_chain(up);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void univ8250_release_irq(struct uart_8250_port *up)
|
||||
@ -381,6 +386,7 @@ static struct uart_ops univ8250_port_ops;
|
||||
static const struct uart_8250_ops univ8250_driver_ops = {
|
||||
.setup_irq = univ8250_setup_irq,
|
||||
.release_irq = univ8250_release_irq,
|
||||
.setup_timer = univ8250_setup_timer,
|
||||
};
|
||||
|
||||
static struct uart_8250_port serial8250_ports[UART_NR];
|
||||
|
@ -26,9 +26,7 @@ static void __dma_tx_complete(void *param)
|
||||
|
||||
dma->tx_running = 0;
|
||||
|
||||
xmit->tail += dma->tx_size;
|
||||
xmit->tail &= UART_XMIT_SIZE - 1;
|
||||
p->port.icount.tx += dma->tx_size;
|
||||
uart_xmit_advance(&p->port, dma->tx_size);
|
||||
|
||||
if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
|
||||
uart_write_wakeup(&p->port);
|
||||
@ -107,8 +105,7 @@ int serial8250_tx_dma(struct uart_8250_port *p)
|
||||
|
||||
dma_async_issue_pending(dma->txchan);
|
||||
serial8250_clear_THRI(p);
|
||||
if (dma->tx_err)
|
||||
dma->tx_err = 0;
|
||||
dma->tx_err = 0;
|
||||
|
||||
return 0;
|
||||
err:
|
||||
|
@ -350,7 +350,7 @@ dw8250_do_pm(struct uart_port *port, unsigned int state, unsigned int old)
|
||||
}
|
||||
|
||||
static void dw8250_set_termios(struct uart_port *p, struct ktermios *termios,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
unsigned long newrate = tty_termios_baud_rate(termios) * 16;
|
||||
struct dw8250_data *d = to_dw8250_data(p->private_data);
|
||||
|
@ -92,7 +92,8 @@ static void dw8250_set_divisor(struct uart_port *p, unsigned int baud,
|
||||
serial8250_do_set_divisor(p, baud, quot, quot_frac);
|
||||
}
|
||||
|
||||
void dw8250_do_set_termios(struct uart_port *p, struct ktermios *termios, struct ktermios *old)
|
||||
void dw8250_do_set_termios(struct uart_port *p, struct ktermios *termios,
|
||||
const struct ktermios *old)
|
||||
{
|
||||
p->status &= ~UPSTAT_AUTOCTS;
|
||||
if (termios->c_cflag & CRTSCTS)
|
||||
|
@ -47,7 +47,7 @@ struct dw8250_data {
|
||||
unsigned int uart_16550_compatible:1;
|
||||
};
|
||||
|
||||
void dw8250_do_set_termios(struct uart_port *p, struct ktermios *termios, struct ktermios *old);
|
||||
void dw8250_do_set_termios(struct uart_port *p, struct ktermios *termios, const struct ktermios *old);
|
||||
void dw8250_setup_port(struct uart_port *p);
|
||||
|
||||
static inline struct dw8250_data *to_dw8250_data(struct dw8250_port_data *data)
|
||||
|
@ -278,7 +278,7 @@ static void fintek_8250_set_max_fifo(struct fintek_8250 *pdata)
|
||||
|
||||
static void fintek_8250_set_termios(struct uart_port *port,
|
||||
struct ktermios *termios,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
struct fintek_8250 *pdata = port->private_data;
|
||||
unsigned int baud = tty_termios_baud_rate(termios);
|
||||
|
@ -70,7 +70,7 @@ static inline struct lpss8250 *to_lpss8250(struct dw8250_port_data *data)
|
||||
}
|
||||
|
||||
static void byt_set_termios(struct uart_port *p, struct ktermios *termios,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
unsigned int baud = tty_termios_baud_rate(termios);
|
||||
struct lpss8250 *lpss = to_lpss8250(p->private_data);
|
||||
|
@ -7,7 +7,6 @@
|
||||
#include <linux/serial.h>
|
||||
#include <linux/serial_core.h>
|
||||
#include <linux/serial_8250.h>
|
||||
#include <uapi/linux/serial_core.h>
|
||||
|
||||
#define MEN_UART_ID_Z025 0x19
|
||||
#define MEN_UART_ID_Z057 0x39
|
||||
|
@ -206,9 +206,8 @@ static void dnv_exit(struct mid8250 *mid)
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
static void mid8250_set_termios(struct uart_port *p,
|
||||
struct ktermios *termios,
|
||||
struct ktermios *old)
|
||||
static void mid8250_set_termios(struct uart_port *p, struct ktermios *termios,
|
||||
const struct ktermios *old)
|
||||
{
|
||||
unsigned int baud = tty_termios_baud_rate(termios);
|
||||
struct mid8250 *mid = p->private_data;
|
||||
|
@ -291,7 +291,7 @@ static void mtk8250_set_flow_ctrl(struct uart_8250_port *up, int mode)
|
||||
|
||||
static void
|
||||
mtk8250_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
static const unsigned short fraction_L_mapping[] = {
|
||||
0, 1, 0x5, 0x15, 0x55, 0x57, 0x57, 0x77, 0x7F, 0xFF, 0xFF
|
||||
|
@ -342,6 +342,9 @@ static void omap8250_restore_regs(struct uart_8250_port *up)
|
||||
omap8250_update_mdr1(up, priv);
|
||||
|
||||
up->port.ops->set_mctrl(&up->port, up->port.mctrl);
|
||||
|
||||
if (up->port.rs485.flags & SER_RS485_ENABLED)
|
||||
serial8250_em485_stop_tx(up);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -350,7 +353,7 @@ static void omap8250_restore_regs(struct uart_8250_port *up)
|
||||
*/
|
||||
static void omap_8250_set_termios(struct uart_port *port,
|
||||
struct ktermios *termios,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
struct uart_8250_port *up = up_to_u8250p(port);
|
||||
struct omap8250_priv *priv = up->port.private_data;
|
||||
@ -984,9 +987,7 @@ static void omap_8250_dma_tx_complete(void *param)
|
||||
|
||||
dma->tx_running = 0;
|
||||
|
||||
xmit->tail += dma->tx_size;
|
||||
xmit->tail &= UART_XMIT_SIZE - 1;
|
||||
p->port.icount.tx += dma->tx_size;
|
||||
uart_xmit_advance(&p->port, dma->tx_size);
|
||||
|
||||
if (priv->delayed_restore) {
|
||||
priv->delayed_restore = 0;
|
||||
|
@ -1232,6 +1232,10 @@ static void pci_oxsemi_tornado_set_mctrl(struct uart_port *port,
|
||||
serial8250_do_set_mctrl(port, mctrl);
|
||||
}
|
||||
|
||||
/*
|
||||
* We require EFR features for clock programming, so set UPF_FULL_PROBE
|
||||
* for full probing regardless of CONFIG_SERIAL_8250_16550A_VARIANTS setting.
|
||||
*/
|
||||
static int pci_oxsemi_tornado_setup(struct serial_private *priv,
|
||||
const struct pciserial_board *board,
|
||||
struct uart_8250_port *up, int idx)
|
||||
@ -1239,6 +1243,7 @@ static int pci_oxsemi_tornado_setup(struct serial_private *priv,
|
||||
struct pci_dev *dev = priv->dev;
|
||||
|
||||
if (pci_oxsemi_tornado_p(dev)) {
|
||||
up->port.flags |= UPF_FULL_PROBE;
|
||||
up->port.get_divisor = pci_oxsemi_tornado_get_divisor;
|
||||
up->port.set_divisor = pci_oxsemi_tornado_set_divisor;
|
||||
up->port.set_mctrl = pci_oxsemi_tornado_set_mctrl;
|
||||
@ -1627,7 +1632,6 @@ static int pci_fintek_init(struct pci_dev *dev)
|
||||
resource_size_t bar_data[3];
|
||||
u8 config_base;
|
||||
struct serial_private *priv = pci_get_drvdata(dev);
|
||||
struct uart_8250_port *port;
|
||||
|
||||
if (!(pci_resource_flags(dev, 5) & IORESOURCE_IO) ||
|
||||
!(pci_resource_flags(dev, 4) & IORESOURCE_IO) ||
|
||||
@ -1674,13 +1678,7 @@ static int pci_fintek_init(struct pci_dev *dev)
|
||||
|
||||
pci_write_config_byte(dev, config_base + 0x06, dev->irq);
|
||||
|
||||
if (priv) {
|
||||
/* re-apply RS232/485 mode when
|
||||
* pciserial_resume_ports()
|
||||
*/
|
||||
port = serial8250_get_port(priv->line[i]);
|
||||
uart_rs485_config(&port->port);
|
||||
} else {
|
||||
if (!priv) {
|
||||
/* First init without port data
|
||||
* force init to RS232 Mode
|
||||
*/
|
||||
|
@ -600,7 +600,7 @@ EXPORT_SYMBOL_GPL(serial8250_rpm_put);
|
||||
static int serial8250_em485_init(struct uart_8250_port *p)
|
||||
{
|
||||
if (p->em485)
|
||||
return 0;
|
||||
goto deassert_rts;
|
||||
|
||||
p->em485 = kmalloc(sizeof(struct uart_8250_em485), GFP_ATOMIC);
|
||||
if (!p->em485)
|
||||
@ -616,7 +616,9 @@ static int serial8250_em485_init(struct uart_8250_port *p)
|
||||
p->em485->active_timer = NULL;
|
||||
p->em485->tx_stopped = true;
|
||||
|
||||
p->rs485_stop_tx(p);
|
||||
deassert_rts:
|
||||
if (p->em485->tx_stopped)
|
||||
p->rs485_stop_tx(p);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -752,6 +754,14 @@ static void serial8250_set_sleep(struct uart_8250_port *p, int sleep)
|
||||
serial8250_rpm_put(p);
|
||||
}
|
||||
|
||||
static void serial8250_clear_IER(struct uart_8250_port *up)
|
||||
{
|
||||
if (up->capabilities & UART_CAP_UUE)
|
||||
serial_out(up, UART_IER, UART_IER_UUE);
|
||||
else
|
||||
serial_out(up, UART_IER, 0);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SERIAL_8250_RSA
|
||||
/*
|
||||
* Attempts to turn on the RSA FIFO. Returns zero on failure.
|
||||
@ -1021,7 +1031,8 @@ static void autoconfig_16550a(struct uart_8250_port *up)
|
||||
up->port.type = PORT_16550A;
|
||||
up->capabilities |= UART_CAP_FIFO;
|
||||
|
||||
if (!IS_ENABLED(CONFIG_SERIAL_8250_16550A_VARIANTS))
|
||||
if (!IS_ENABLED(CONFIG_SERIAL_8250_16550A_VARIANTS) &&
|
||||
!(up->port.flags & UPF_FULL_PROBE))
|
||||
return;
|
||||
|
||||
/*
|
||||
@ -1133,7 +1144,7 @@ static void autoconfig_16550a(struct uart_8250_port *up)
|
||||
* internal UARTs.
|
||||
* We're going to explicitly set the UUE bit to 0 before
|
||||
* trying to write and read a 1 just to make sure it's not
|
||||
* already a 1 and maybe locked there before we even start start.
|
||||
* already a 1 and maybe locked there before we even start.
|
||||
*/
|
||||
iersave = serial_in(up, UART_IER);
|
||||
serial_out(up, UART_IER, iersave & ~UART_IER_UUE);
|
||||
@ -1329,10 +1340,7 @@ static void autoconfig(struct uart_8250_port *up)
|
||||
serial8250_out_MCR(up, save_mcr);
|
||||
serial8250_clear_fifos(up);
|
||||
serial_in(up, UART_RX);
|
||||
if (up->capabilities & UART_CAP_UUE)
|
||||
serial_out(up, UART_IER, UART_IER_UUE);
|
||||
else
|
||||
serial_out(up, UART_IER, 0);
|
||||
serial8250_clear_IER(up);
|
||||
|
||||
out_unlock:
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
@ -2042,6 +2050,9 @@ EXPORT_SYMBOL_GPL(serial8250_do_set_mctrl);
|
||||
|
||||
static void serial8250_set_mctrl(struct uart_port *port, unsigned int mctrl)
|
||||
{
|
||||
if (port->rs485.flags & SER_RS485_ENABLED)
|
||||
return;
|
||||
|
||||
if (port->set_mctrl)
|
||||
port->set_mctrl(port, mctrl);
|
||||
else
|
||||
@ -2142,10 +2153,7 @@ static void serial8250_put_poll_char(struct uart_port *port,
|
||||
* First save the IER then disable the interrupts
|
||||
*/
|
||||
ier = serial_port_in(port, UART_IER);
|
||||
if (up->capabilities & UART_CAP_UUE)
|
||||
serial_port_out(port, UART_IER, UART_IER_UUE);
|
||||
else
|
||||
serial_port_out(port, UART_IER, 0);
|
||||
serial8250_clear_IER(up);
|
||||
|
||||
wait_for_xmitr(up, UART_LSR_BOTH_EMPTY);
|
||||
/*
|
||||
@ -2294,6 +2302,10 @@ int serial8250_do_startup(struct uart_port *port)
|
||||
if (port->irq && (up->port.flags & UPF_SHARE_IRQ))
|
||||
up->port.irqflags |= IRQF_SHARED;
|
||||
|
||||
retval = up->ops->setup_irq(up);
|
||||
if (retval)
|
||||
goto out;
|
||||
|
||||
if (port->irq && !(up->port.flags & UPF_NO_THRE_TEST)) {
|
||||
unsigned char iir1;
|
||||
|
||||
@ -2336,9 +2348,7 @@ int serial8250_do_startup(struct uart_port *port)
|
||||
}
|
||||
}
|
||||
|
||||
retval = up->ops->setup_irq(up);
|
||||
if (retval)
|
||||
goto out;
|
||||
up->ops->setup_timer(up);
|
||||
|
||||
/*
|
||||
* Now, initialize the UART
|
||||
@ -2651,7 +2661,7 @@ static void serial8250_set_divisor(struct uart_port *port, unsigned int baud,
|
||||
|
||||
static unsigned int serial8250_get_baud_rate(struct uart_port *port,
|
||||
struct ktermios *termios,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
unsigned int tolerance = port->uartclk / 100;
|
||||
unsigned int min;
|
||||
@ -2737,7 +2747,7 @@ EXPORT_SYMBOL_GPL(serial8250_update_uartclk);
|
||||
|
||||
void
|
||||
serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
struct uart_8250_port *up = up_to_u8250p(port);
|
||||
unsigned char cval;
|
||||
@ -2875,7 +2885,7 @@ EXPORT_SYMBOL(serial8250_do_set_termios);
|
||||
|
||||
static void
|
||||
serial8250_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
if (port->set_termios)
|
||||
port->set_termios(port, termios, old);
|
||||
@ -3187,9 +3197,6 @@ static void serial8250_config_port(struct uart_port *port, int flags)
|
||||
if (flags & UART_CONFIG_TYPE)
|
||||
autoconfig(up);
|
||||
|
||||
if (port->rs485.flags & SER_RS485_ENABLED)
|
||||
uart_rs485_config(port);
|
||||
|
||||
/* if access method is AU, it is a 16550 with a quirk */
|
||||
if (port->type == PORT_16550A && port->iotype == UPIO_AU)
|
||||
up->bugs |= UART_BUG_NOMSR;
|
||||
@ -3314,8 +3321,13 @@ static void serial8250_console_restore(struct uart_8250_port *up)
|
||||
unsigned int baud, quot, frac = 0;
|
||||
|
||||
termios.c_cflag = port->cons->cflag;
|
||||
if (port->state->port.tty && termios.c_cflag == 0)
|
||||
termios.c_ispeed = port->cons->ispeed;
|
||||
termios.c_ospeed = port->cons->ospeed;
|
||||
if (port->state->port.tty && termios.c_cflag == 0) {
|
||||
termios.c_cflag = port->state->port.tty->termios.c_cflag;
|
||||
termios.c_ispeed = port->state->port.tty->termios.c_ispeed;
|
||||
termios.c_ospeed = port->state->port.tty->termios.c_ospeed;
|
||||
}
|
||||
|
||||
baud = serial8250_get_baud_rate(port, &termios, NULL);
|
||||
quot = serial8250_get_divisor(port, baud, &frac);
|
||||
@ -3383,11 +3395,7 @@ void serial8250_console_write(struct uart_8250_port *up, const char *s,
|
||||
* First save the IER then disable the interrupts
|
||||
*/
|
||||
ier = serial_port_in(port, UART_IER);
|
||||
|
||||
if (up->capabilities & UART_CAP_UUE)
|
||||
serial_port_out(port, UART_IER, UART_IER_UUE);
|
||||
else
|
||||
serial_port_out(port, UART_IER, 0);
|
||||
serial8250_clear_IER(up);
|
||||
|
||||
/* check scratch reg to see if port powered off during system sleep */
|
||||
if (up->canary && (up->canary != serial_port_in(port, UART_SCR))) {
|
||||
|
@ -127,6 +127,7 @@ config SERIAL_SB1250_DUART_CONSOLE
|
||||
|
||||
config SERIAL_ATMEL
|
||||
bool "AT91 on-chip serial port support"
|
||||
depends on COMMON_CLK
|
||||
depends on ARCH_AT91 || COMPILE_TEST
|
||||
select SERIAL_CORE
|
||||
select SERIAL_MCTRL_GPIO if GPIOLIB
|
||||
@ -427,7 +428,7 @@ config SERIAL_PXA
|
||||
|
||||
config SERIAL_PXA_NON8250
|
||||
bool
|
||||
depends on !SERIAL_8250
|
||||
depends on !SERIAL_8250 || COMPILE_TEST
|
||||
|
||||
config SERIAL_PXA_CONSOLE
|
||||
bool "Console on PXA serial port (DEPRECATED)"
|
||||
@ -1325,7 +1326,7 @@ config SERIAL_FSL_LPUART
|
||||
|
||||
config SERIAL_FSL_LPUART_CONSOLE
|
||||
bool "Console on Freescale lpuart serial port"
|
||||
depends on SERIAL_FSL_LPUART=y
|
||||
depends on SERIAL_FSL_LPUART
|
||||
select SERIAL_CORE_CONSOLE
|
||||
select SERIAL_EARLYCON
|
||||
help
|
||||
|
@ -9,6 +9,7 @@
|
||||
* (C) Copyright 2010, Tobias Klauser <tklauser@distanz.ch>
|
||||
*/
|
||||
|
||||
#include <linux/bitfield.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
@ -48,7 +49,6 @@
|
||||
#define ALTERA_JTAGUART_CONTROL_WI_MSK 0x00000200
|
||||
#define ALTERA_JTAGUART_CONTROL_AC_MSK 0x00000400
|
||||
#define ALTERA_JTAGUART_CONTROL_WSPACE_MSK 0xFFFF0000
|
||||
#define ALTERA_JTAGUART_CONTROL_WSPACE_OFF 16
|
||||
|
||||
/*
|
||||
* Local per-uart structure.
|
||||
@ -59,10 +59,19 @@ struct altera_jtaguart {
|
||||
unsigned long imr; /* Local IMR mirror */
|
||||
};
|
||||
|
||||
static unsigned int altera_jtaguart_tx_space(struct uart_port *port, u32 *ctlp)
|
||||
{
|
||||
u32 ctl = readl(port->membase + ALTERA_JTAGUART_CONTROL_REG);
|
||||
|
||||
if (ctlp)
|
||||
*ctlp = ctl;
|
||||
|
||||
return FIELD_GET(ALTERA_JTAGUART_CONTROL_WSPACE_MSK, ctl);
|
||||
}
|
||||
|
||||
static unsigned int altera_jtaguart_tx_empty(struct uart_port *port)
|
||||
{
|
||||
return (readl(port->membase + ALTERA_JTAGUART_CONTROL_REG) &
|
||||
ALTERA_JTAGUART_CONTROL_WSPACE_MSK) ? TIOCSER_TEMT : 0;
|
||||
return altera_jtaguart_tx_space(port, NULL) ? TIOCSER_TEMT : 0;
|
||||
}
|
||||
|
||||
static unsigned int altera_jtaguart_get_mctrl(struct uart_port *port)
|
||||
@ -106,8 +115,8 @@ static void altera_jtaguart_break_ctl(struct uart_port *port, int break_state)
|
||||
}
|
||||
|
||||
static void altera_jtaguart_set_termios(struct uart_port *port,
|
||||
struct ktermios *termios,
|
||||
struct ktermios *old)
|
||||
struct ktermios *termios,
|
||||
const struct ktermios *old)
|
||||
{
|
||||
/* Just copy the old termios settings back */
|
||||
if (old)
|
||||
@ -150,9 +159,7 @@ static void altera_jtaguart_tx_chars(struct altera_jtaguart *pp)
|
||||
|
||||
pending = uart_circ_chars_pending(xmit);
|
||||
if (pending > 0) {
|
||||
count = (readl(port->membase + ALTERA_JTAGUART_CONTROL_REG) &
|
||||
ALTERA_JTAGUART_CONTROL_WSPACE_MSK) >>
|
||||
ALTERA_JTAGUART_CONTROL_WSPACE_OFF;
|
||||
count = altera_jtaguart_tx_space(port, NULL);
|
||||
if (count > pending)
|
||||
count = pending;
|
||||
if (count > 0) {
|
||||
@ -298,17 +305,17 @@ static struct altera_jtaguart altera_jtaguart_ports[ALTERA_JTAGUART_MAXPORTS];
|
||||
#if defined(CONFIG_SERIAL_ALTERA_JTAGUART_CONSOLE_BYPASS)
|
||||
static void altera_jtaguart_console_putc(struct uart_port *port, unsigned char c)
|
||||
{
|
||||
unsigned long status;
|
||||
unsigned long flags;
|
||||
u32 status;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
while (((status = readl(port->membase + ALTERA_JTAGUART_CONTROL_REG)) &
|
||||
ALTERA_JTAGUART_CONTROL_WSPACE_MSK) == 0) {
|
||||
while (!altera_jtaguart_tx_space(port, &status)) {
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
|
||||
if ((status & ALTERA_JTAGUART_CONTROL_AC_MSK) == 0) {
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
return; /* no connection activity */
|
||||
}
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
|
||||
cpu_relax();
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
}
|
||||
@ -321,8 +328,7 @@ static void altera_jtaguart_console_putc(struct uart_port *port, unsigned char c
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
while ((readl(port->membase + ALTERA_JTAGUART_CONTROL_REG) &
|
||||
ALTERA_JTAGUART_CONTROL_WSPACE_MSK) == 0) {
|
||||
while (!altera_jtaguart_tx_space(port, NULL)) {
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
cpu_relax();
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
|
@ -175,7 +175,7 @@ static void altera_uart_break_ctl(struct uart_port *port, int break_state)
|
||||
|
||||
static void altera_uart_set_termios(struct uart_port *port,
|
||||
struct ktermios *termios,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned int baud, baudclk;
|
||||
@ -199,9 +199,8 @@ static void altera_uart_set_termios(struct uart_port *port,
|
||||
*/
|
||||
}
|
||||
|
||||
static void altera_uart_rx_chars(struct altera_uart *pp)
|
||||
static void altera_uart_rx_chars(struct uart_port *port)
|
||||
{
|
||||
struct uart_port *port = &pp->port;
|
||||
unsigned char ch, flag;
|
||||
unsigned short status;
|
||||
|
||||
@ -246,9 +245,8 @@ static void altera_uart_rx_chars(struct altera_uart *pp)
|
||||
tty_flip_buffer_push(&port->state->port);
|
||||
}
|
||||
|
||||
static void altera_uart_tx_chars(struct altera_uart *pp)
|
||||
static void altera_uart_tx_chars(struct uart_port *port)
|
||||
{
|
||||
struct uart_port *port = &pp->port;
|
||||
struct circ_buf *xmit = &port->state->xmit;
|
||||
|
||||
if (port->x_char) {
|
||||
@ -272,10 +270,8 @@ static void altera_uart_tx_chars(struct altera_uart *pp)
|
||||
if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
|
||||
uart_write_wakeup(port);
|
||||
|
||||
if (xmit->head == xmit->tail) {
|
||||
pp->imr &= ~ALTERA_UART_CONTROL_TRDY_MSK;
|
||||
altera_uart_update_ctrl_reg(pp);
|
||||
}
|
||||
if (uart_circ_empty(xmit))
|
||||
altera_uart_stop_tx(port);
|
||||
}
|
||||
|
||||
static irqreturn_t altera_uart_interrupt(int irq, void *data)
|
||||
@ -288,9 +284,9 @@ static irqreturn_t altera_uart_interrupt(int irq, void *data)
|
||||
|
||||
spin_lock(&port->lock);
|
||||
if (isr & ALTERA_UART_STATUS_RRDY_MSK)
|
||||
altera_uart_rx_chars(pp);
|
||||
altera_uart_rx_chars(port);
|
||||
if (isr & ALTERA_UART_STATUS_TRDY_MSK)
|
||||
altera_uart_tx_chars(pp);
|
||||
altera_uart_tx_chars(port);
|
||||
spin_unlock(&port->lock);
|
||||
|
||||
return IRQ_RETVAL(isr);
|
||||
|
@ -370,7 +370,7 @@ static void pl010_shutdown(struct uart_port *port)
|
||||
|
||||
static void
|
||||
pl010_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
unsigned int lcr_h, old_cr;
|
||||
unsigned long flags;
|
||||
|
@ -2030,7 +2030,7 @@ pl011_setup_status_masks(struct uart_port *port, struct ktermios *termios)
|
||||
|
||||
static void
|
||||
pl011_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
struct uart_amba_port *uap =
|
||||
container_of(port, struct uart_amba_port, port);
|
||||
@ -2162,7 +2162,7 @@ pl011_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
|
||||
static void
|
||||
sbsa_uart_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
struct uart_amba_port *uap =
|
||||
container_of(port, struct uart_amba_port, port);
|
||||
@ -2777,6 +2777,7 @@ static int pl011_probe(struct amba_device *dev, const struct amba_id *id)
|
||||
struct uart_amba_port *uap;
|
||||
struct vendor_data *vendor = id->data;
|
||||
int portnr, ret;
|
||||
u32 val;
|
||||
|
||||
portnr = pl011_find_free_port();
|
||||
if (portnr < 0)
|
||||
@ -2801,6 +2802,21 @@ static int pl011_probe(struct amba_device *dev, const struct amba_id *id)
|
||||
uap->port.rs485_supported = pl011_rs485_supported;
|
||||
snprintf(uap->type, sizeof(uap->type), "PL011 rev%u", amba_rev(dev));
|
||||
|
||||
if (device_property_read_u32(&dev->dev, "reg-io-width", &val) == 0) {
|
||||
switch (val) {
|
||||
case 1:
|
||||
uap->port.iotype = UPIO_MEM;
|
||||
break;
|
||||
case 4:
|
||||
uap->port.iotype = UPIO_MEM32;
|
||||
break;
|
||||
default:
|
||||
dev_warn(&dev->dev, "unsupported reg-io-width (%d)\n",
|
||||
val);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
ret = pl011_setup_port(&dev->dev, uap, &dev->res, portnr);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
@ -228,7 +228,7 @@ static void apbuart_shutdown(struct uart_port *port)
|
||||
}
|
||||
|
||||
static void apbuart_set_termios(struct uart_port *port,
|
||||
struct ktermios *termios, struct ktermios *old)
|
||||
struct ktermios *termios, const struct ktermios *old)
|
||||
{
|
||||
unsigned int cr;
|
||||
unsigned long flags;
|
||||
|
@ -283,7 +283,7 @@ static void ar933x_uart_get_scale_step(unsigned int clk,
|
||||
|
||||
static void ar933x_uart_set_termios(struct uart_port *port,
|
||||
struct ktermios *new,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
struct ar933x_uart_port *up =
|
||||
container_of(port, struct ar933x_uart_port, port);
|
||||
@ -583,6 +583,13 @@ static const struct uart_ops ar933x_uart_ops = {
|
||||
static int ar933x_config_rs485(struct uart_port *port, struct ktermios *termios,
|
||||
struct serial_rs485 *rs485conf)
|
||||
{
|
||||
struct ar933x_uart_port *up =
|
||||
container_of(port, struct ar933x_uart_port, port);
|
||||
|
||||
if (port->rs485.flags & SER_RS485_ENABLED)
|
||||
gpiod_set_value(up->rts_gpiod,
|
||||
!!(rs485conf->flags & SER_RS485_RTS_AFTER_SEND));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -351,7 +351,7 @@ static void arc_serial_shutdown(struct uart_port *port)
|
||||
|
||||
static void
|
||||
arc_serial_set_termios(struct uart_port *port, struct ktermios *new,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
struct arc_uart_port *uart = to_arc_port(port);
|
||||
unsigned int baud, uartl, uarth, hw_val;
|
||||
|
@ -15,6 +15,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/serial.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/sysrq.h>
|
||||
#include <linux/tty_flip.h>
|
||||
@ -110,6 +111,7 @@ struct atmel_uart_char {
|
||||
struct atmel_uart_port {
|
||||
struct uart_port uart; /* uart */
|
||||
struct clk *clk; /* uart clock */
|
||||
struct clk *gclk; /* uart generic clock */
|
||||
int may_wakeup; /* cached value of device_may_wakeup for times we need to disable it */
|
||||
u32 backup_imr; /* IMR saved during suspend */
|
||||
int break_active; /* break being received */
|
||||
@ -150,6 +152,7 @@ struct atmel_uart_port {
|
||||
u32 rts_low;
|
||||
bool ms_irq_enabled;
|
||||
u32 rtor; /* address of receiver timeout register if it exists */
|
||||
bool is_usart;
|
||||
bool has_frac_baudrate;
|
||||
bool has_hw_timer;
|
||||
struct timer_list uart_timer;
|
||||
@ -228,6 +231,11 @@ static inline int atmel_uart_is_half_duplex(struct uart_port *port)
|
||||
(port->iso7816.flags & SER_ISO7816_ENABLED);
|
||||
}
|
||||
|
||||
static inline int atmel_error_rate(int desired_value, int actual_value)
|
||||
{
|
||||
return 100 - (desired_value * 100) / actual_value;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SERIAL_ATMEL_PDC
|
||||
static bool atmel_use_pdc_rx(struct uart_port *port)
|
||||
{
|
||||
@ -1825,6 +1833,7 @@ static void atmel_get_ip_name(struct uart_port *port)
|
||||
*/
|
||||
atmel_port->has_frac_baudrate = false;
|
||||
atmel_port->has_hw_timer = false;
|
||||
atmel_port->is_usart = false;
|
||||
|
||||
if (name == new_uart) {
|
||||
dev_dbg(port->dev, "Uart with hw timer");
|
||||
@ -1834,6 +1843,7 @@ static void atmel_get_ip_name(struct uart_port *port)
|
||||
dev_dbg(port->dev, "Usart\n");
|
||||
atmel_port->has_frac_baudrate = true;
|
||||
atmel_port->has_hw_timer = true;
|
||||
atmel_port->is_usart = true;
|
||||
atmel_port->rtor = ATMEL_US_RTOR;
|
||||
version = atmel_uart_readl(port, ATMEL_US_VERSION);
|
||||
switch (version) {
|
||||
@ -1863,6 +1873,7 @@ static void atmel_get_ip_name(struct uart_port *port)
|
||||
dev_dbg(port->dev, "This version is usart\n");
|
||||
atmel_port->has_frac_baudrate = true;
|
||||
atmel_port->has_hw_timer = true;
|
||||
atmel_port->is_usart = true;
|
||||
atmel_port->rtor = ATMEL_US_RTOR;
|
||||
break;
|
||||
case 0x203:
|
||||
@ -2113,6 +2124,8 @@ static void atmel_serial_pm(struct uart_port *port, unsigned int state,
|
||||
* This is called on uart_close() or a suspend event.
|
||||
*/
|
||||
clk_disable_unprepare(atmel_port->clk);
|
||||
if (__clk_is_enabled(atmel_port->gclk))
|
||||
clk_disable_unprepare(atmel_port->gclk);
|
||||
break;
|
||||
default:
|
||||
dev_err(port->dev, "atmel_serial: unknown pm %d\n", state);
|
||||
@ -2122,19 +2135,25 @@ static void atmel_serial_pm(struct uart_port *port, unsigned int state,
|
||||
/*
|
||||
* Change the port parameters
|
||||
*/
|
||||
static void atmel_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
struct ktermios *old)
|
||||
static void atmel_set_termios(struct uart_port *port,
|
||||
struct ktermios *termios,
|
||||
const struct ktermios *old)
|
||||
{
|
||||
struct atmel_uart_port *atmel_port = to_atmel_uart_port(port);
|
||||
unsigned long flags;
|
||||
unsigned int old_mode, mode, imr, quot, baud, div, cd, fp = 0;
|
||||
unsigned int old_mode, mode, imr, quot, div, cd, fp = 0;
|
||||
unsigned int baud, actual_baud, gclk_rate;
|
||||
int ret;
|
||||
|
||||
/* save the current mode register */
|
||||
mode = old_mode = atmel_uart_readl(port, ATMEL_US_MR);
|
||||
|
||||
/* reset the mode, clock divisor, parity, stop bits and data size */
|
||||
mode &= ~(ATMEL_US_USCLKS | ATMEL_US_CHRL | ATMEL_US_NBSTOP |
|
||||
ATMEL_US_PAR | ATMEL_US_USMODE);
|
||||
if (atmel_port->is_usart)
|
||||
mode &= ~(ATMEL_US_NBSTOP | ATMEL_US_PAR | ATMEL_US_CHRL |
|
||||
ATMEL_US_USCLKS | ATMEL_US_USMODE);
|
||||
else
|
||||
mode &= ~(ATMEL_UA_BRSRCCK | ATMEL_US_PAR | ATMEL_UA_FILTER);
|
||||
|
||||
baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk / 16);
|
||||
|
||||
@ -2282,10 +2301,60 @@ static void atmel_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
cd = uart_get_divisor(port, baud);
|
||||
}
|
||||
|
||||
if (cd > 65535) { /* BRGR is 16-bit, so switch to slower clock */
|
||||
/*
|
||||
* If the current value of the Clock Divisor surpasses the 16 bit
|
||||
* ATMEL_US_CD mask and the IP is USART, switch to the Peripheral
|
||||
* Clock implicitly divided by 8.
|
||||
* If the IP is UART however, keep the highest possible value for
|
||||
* the CD and avoid needless division of CD, since UART IP's do not
|
||||
* support implicit division of the Peripheral Clock.
|
||||
*/
|
||||
if (atmel_port->is_usart && cd > ATMEL_US_CD) {
|
||||
cd /= 8;
|
||||
mode |= ATMEL_US_USCLKS_MCK_DIV8;
|
||||
} else {
|
||||
cd = min_t(unsigned int, cd, ATMEL_US_CD);
|
||||
}
|
||||
|
||||
/*
|
||||
* If there is no Fractional Part, there is a high chance that
|
||||
* we may be able to generate a baudrate closer to the desired one
|
||||
* if we use the GCLK as the clock source driving the baudrate
|
||||
* generator.
|
||||
*/
|
||||
if (!atmel_port->has_frac_baudrate) {
|
||||
if (__clk_is_enabled(atmel_port->gclk))
|
||||
clk_disable_unprepare(atmel_port->gclk);
|
||||
gclk_rate = clk_round_rate(atmel_port->gclk, 16 * baud);
|
||||
actual_baud = clk_get_rate(atmel_port->clk) / (16 * cd);
|
||||
if (gclk_rate && abs(atmel_error_rate(baud, actual_baud)) >
|
||||
abs(atmel_error_rate(baud, gclk_rate / 16))) {
|
||||
clk_set_rate(atmel_port->gclk, 16 * baud);
|
||||
ret = clk_prepare_enable(atmel_port->gclk);
|
||||
if (ret)
|
||||
goto gclk_fail;
|
||||
|
||||
if (atmel_port->is_usart) {
|
||||
mode &= ~ATMEL_US_USCLKS;
|
||||
mode |= ATMEL_US_USCLKS_GCLK;
|
||||
} else {
|
||||
mode |= ATMEL_UA_BRSRCCK;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set the Clock Divisor for GCLK to 1.
|
||||
* Since we were able to generate the smallest
|
||||
* multiple of the desired baudrate times 16,
|
||||
* then we surely can generate a bigger multiple
|
||||
* with the exact error rate for an equally increased
|
||||
* CD. Thus no need to take into account
|
||||
* a higher value for CD.
|
||||
*/
|
||||
cd = 1;
|
||||
}
|
||||
}
|
||||
|
||||
gclk_fail:
|
||||
quot = cd | fp << ATMEL_US_FP_OFFSET;
|
||||
|
||||
if (!(port->iso7816.flags & SER_ISO7816_ENABLED))
|
||||
@ -2881,6 +2950,12 @@ static int atmel_serial_probe(struct platform_device *pdev)
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
atmel_port->gclk = devm_clk_get_optional(&pdev->dev, "gclk");
|
||||
if (IS_ERR(atmel_port->gclk)) {
|
||||
ret = PTR_ERR(atmel_port->gclk);
|
||||
goto err_clk_disable_unprepare;
|
||||
}
|
||||
|
||||
ret = atmel_init_port(atmel_port, pdev);
|
||||
if (ret)
|
||||
goto err_clk_disable_unprepare;
|
||||
|
@ -9,6 +9,8 @@
|
||||
* Based on AT91RM9200 datasheet revision E.
|
||||
*/
|
||||
|
||||
#include <linux/bitfield.h>
|
||||
|
||||
#ifndef ATMEL_SERIAL_H
|
||||
#define ATMEL_SERIAL_H
|
||||
|
||||
@ -39,39 +41,42 @@
|
||||
|
||||
#define ATMEL_US_MR 0x04 /* Mode Register */
|
||||
#define ATMEL_US_USMODE GENMASK(3, 0) /* Mode of the USART */
|
||||
#define ATMEL_US_USMODE_NORMAL 0
|
||||
#define ATMEL_US_USMODE_RS485 1
|
||||
#define ATMEL_US_USMODE_HWHS 2
|
||||
#define ATMEL_US_USMODE_MODEM 3
|
||||
#define ATMEL_US_USMODE_ISO7816_T0 4
|
||||
#define ATMEL_US_USMODE_ISO7816_T1 6
|
||||
#define ATMEL_US_USMODE_IRDA 8
|
||||
#define ATMEL_US_USMODE_NORMAL FIELD_PREP(ATMEL_US_USMODE, 0)
|
||||
#define ATMEL_US_USMODE_RS485 FIELD_PREP(ATMEL_US_USMODE, 1)
|
||||
#define ATMEL_US_USMODE_HWHS FIELD_PREP(ATMEL_US_USMODE, 2)
|
||||
#define ATMEL_US_USMODE_MODEM FIELD_PREP(ATMEL_US_USMODE, 3)
|
||||
#define ATMEL_US_USMODE_ISO7816_T0 FIELD_PREP(ATMEL_US_USMODE, 4)
|
||||
#define ATMEL_US_USMODE_ISO7816_T1 FIELD_PREP(ATMEL_US_USMODE, 6)
|
||||
#define ATMEL_US_USMODE_IRDA FIELD_PREP(ATMEL_US_USMODE, 8)
|
||||
#define ATMEL_US_USCLKS GENMASK(5, 4) /* Clock Selection */
|
||||
#define ATMEL_US_USCLKS_MCK (0 << 4)
|
||||
#define ATMEL_US_USCLKS_MCK_DIV8 (1 << 4)
|
||||
#define ATMEL_US_USCLKS_SCK (3 << 4)
|
||||
#define ATMEL_US_USCLKS_MCK FIELD_PREP(ATMEL_US_USCLKS, 0)
|
||||
#define ATMEL_US_USCLKS_MCK_DIV8 FIELD_PREP(ATMEL_US_USCLKS, 1)
|
||||
#define ATMEL_US_USCLKS_GCLK FIELD_PREP(ATMEL_US_USCLKS, 2)
|
||||
#define ATMEL_US_USCLKS_SCK FIELD_PREP(ATMEL_US_USCLKS, 3)
|
||||
#define ATMEL_UA_FILTER BIT(4)
|
||||
#define ATMEL_US_CHRL GENMASK(7, 6) /* Character Length */
|
||||
#define ATMEL_US_CHRL_5 (0 << 6)
|
||||
#define ATMEL_US_CHRL_6 (1 << 6)
|
||||
#define ATMEL_US_CHRL_7 (2 << 6)
|
||||
#define ATMEL_US_CHRL_8 (3 << 6)
|
||||
#define ATMEL_US_CHRL_5 FIELD_PREP(ATMEL_US_CHRL, 0)
|
||||
#define ATMEL_US_CHRL_6 FIELD_PREP(ATMEL_US_CHRL, 1)
|
||||
#define ATMEL_US_CHRL_7 FIELD_PREP(ATMEL_US_CHRL, 2)
|
||||
#define ATMEL_US_CHRL_8 FIELD_PREP(ATMEL_US_CHRL, 3)
|
||||
#define ATMEL_US_SYNC BIT(8) /* Synchronous Mode Select */
|
||||
#define ATMEL_US_PAR GENMASK(11, 9) /* Parity Type */
|
||||
#define ATMEL_US_PAR_EVEN (0 << 9)
|
||||
#define ATMEL_US_PAR_ODD (1 << 9)
|
||||
#define ATMEL_US_PAR_SPACE (2 << 9)
|
||||
#define ATMEL_US_PAR_MARK (3 << 9)
|
||||
#define ATMEL_US_PAR_NONE (4 << 9)
|
||||
#define ATMEL_US_PAR_MULTI_DROP (6 << 9)
|
||||
#define ATMEL_US_PAR_EVEN FIELD_PREP(ATMEL_US_PAR, 0)
|
||||
#define ATMEL_US_PAR_ODD FIELD_PREP(ATMEL_US_PAR, 1)
|
||||
#define ATMEL_US_PAR_SPACE FIELD_PREP(ATMEL_US_PAR, 2)
|
||||
#define ATMEL_US_PAR_MARK FIELD_PREP(ATMEL_US_PAR, 3)
|
||||
#define ATMEL_US_PAR_NONE FIELD_PREP(ATMEL_US_PAR, 4)
|
||||
#define ATMEL_US_PAR_MULTI_DROP FIELD_PREP(ATMEL_US_PAR, 6)
|
||||
#define ATMEL_US_NBSTOP GENMASK(13, 12) /* Number of Stop Bits */
|
||||
#define ATMEL_US_NBSTOP_1 (0 << 12)
|
||||
#define ATMEL_US_NBSTOP_1_5 (1 << 12)
|
||||
#define ATMEL_US_NBSTOP_2 (2 << 12)
|
||||
#define ATMEL_US_NBSTOP_1 FIELD_PREP(ATMEL_US_NBSTOP, 0)
|
||||
#define ATMEL_US_NBSTOP_1_5 FIELD_PREP(ATMEL_US_NBSTOP, 1)
|
||||
#define ATMEL_US_NBSTOP_2 FIELD_PREP(ATMEL_US_NBSTOP, 2)
|
||||
#define ATMEL_UA_BRSRCCK BIT(12) /* Clock Selection for UART */
|
||||
#define ATMEL_US_CHMODE GENMASK(15, 14) /* Channel Mode */
|
||||
#define ATMEL_US_CHMODE_NORMAL (0 << 14)
|
||||
#define ATMEL_US_CHMODE_ECHO (1 << 14)
|
||||
#define ATMEL_US_CHMODE_LOC_LOOP (2 << 14)
|
||||
#define ATMEL_US_CHMODE_REM_LOOP (3 << 14)
|
||||
#define ATMEL_US_CHMODE_NORMAL FIELD_PREP(ATMEL_US_CHMODE, 0)
|
||||
#define ATMEL_US_CHMODE_ECHO FIELD_PREP(ATMEL_US_CHMODE, 1)
|
||||
#define ATMEL_US_CHMODE_LOC_LOOP FIELD_PREP(ATMEL_US_CHMODE, 2)
|
||||
#define ATMEL_US_CHMODE_REM_LOOP FIELD_PREP(ATMEL_US_CHMODE, 3)
|
||||
#define ATMEL_US_MSBF BIT(16) /* Bit Order */
|
||||
#define ATMEL_US_MODE9 BIT(17) /* 9-bit Character Length */
|
||||
#define ATMEL_US_CLKO BIT(18) /* Clock Output Select */
|
||||
@ -79,7 +84,7 @@
|
||||
#define ATMEL_US_INACK BIT(20) /* Inhibit Non Acknowledge */
|
||||
#define ATMEL_US_DSNACK BIT(21) /* Disable Successive NACK */
|
||||
#define ATMEL_US_MAX_ITER_MASK GENMASK(26, 24) /* Max Iterations */
|
||||
#define ATMEL_US_MAX_ITER(n) (((n) << 24) & ATMEL_US_MAX_ITER_MASK)
|
||||
#define ATMEL_US_MAX_ITER(n) FIELD_PREP(ATMEL_US_MAX_ITER_MASK, (n))
|
||||
#define ATMEL_US_FILTER BIT(28) /* Infrared Receive Line Filter */
|
||||
|
||||
#define ATMEL_US_IER 0x08 /* Interrupt Enable Register */
|
||||
@ -131,19 +136,19 @@
|
||||
|
||||
#define ATMEL_US_CMPR 0x90 /* Comparaison Register */
|
||||
#define ATMEL_US_FMR 0xa0 /* FIFO Mode Register */
|
||||
#define ATMEL_US_TXRDYM(data) (((data) & 0x3) << 0) /* TX Ready Mode */
|
||||
#define ATMEL_US_RXRDYM(data) (((data) & 0x3) << 4) /* RX Ready Mode */
|
||||
#define ATMEL_US_TXRDYM(data) FIELD_PREP(GENMASK(1, 0), (data)) /* TX Ready Mode */
|
||||
#define ATMEL_US_RXRDYM(data) FIELD_PREP(GENMASK(5, 4), (data)) /* RX Ready Mode */
|
||||
#define ATMEL_US_ONE_DATA 0x0
|
||||
#define ATMEL_US_TWO_DATA 0x1
|
||||
#define ATMEL_US_FOUR_DATA 0x2
|
||||
#define ATMEL_US_FRTSC BIT(7) /* FIFO RTS pin Control */
|
||||
#define ATMEL_US_TXFTHRES(thr) (((thr) & 0x3f) << 8) /* TX FIFO Threshold */
|
||||
#define ATMEL_US_RXFTHRES(thr) (((thr) & 0x3f) << 16) /* RX FIFO Threshold */
|
||||
#define ATMEL_US_RXFTHRES2(thr) (((thr) & 0x3f) << 24) /* RX FIFO Threshold2 */
|
||||
#define ATMEL_US_TXFTHRES(thr) FIELD_PREP(GENMASK(13, 8), (thr)) /* TX FIFO Threshold */
|
||||
#define ATMEL_US_RXFTHRES(thr) FIELD_PREP(GENMASK(21, 16), (thr)) /* RX FIFO Threshold */
|
||||
#define ATMEL_US_RXFTHRES2(thr) FIELD_PREP(GENMASK(29, 24), (thr)) /* RX FIFO Threshold2 */
|
||||
|
||||
#define ATMEL_US_FLR 0xa4 /* FIFO Level Register */
|
||||
#define ATMEL_US_TXFL(reg) (((reg) >> 0) & 0x3f) /* TX FIFO Level */
|
||||
#define ATMEL_US_RXFL(reg) (((reg) >> 16) & 0x3f) /* RX FIFO Level */
|
||||
#define ATMEL_US_TXFL(reg) FIELD_GET(GENMASK(5, 0), (reg)) /* TX FIFO Level */
|
||||
#define ATMEL_US_RXFL(reg) FIELD_GET(GENMASK(21, 16), (reg)) /* RX FIFO Level */
|
||||
|
||||
#define ATMEL_US_FIER 0xa8 /* FIFO Interrupt Enable Register */
|
||||
#define ATMEL_US_FIDR 0xac /* FIFO Interrupt Disable Register */
|
||||
|
@ -492,9 +492,8 @@ static void bcm_uart_shutdown(struct uart_port *port)
|
||||
/*
|
||||
* serial core request to change current uart setting
|
||||
*/
|
||||
static void bcm_uart_set_termios(struct uart_port *port,
|
||||
struct ktermios *new,
|
||||
struct ktermios *old)
|
||||
static void bcm_uart_set_termios(struct uart_port *port, struct ktermios *new,
|
||||
const struct ktermios *old)
|
||||
{
|
||||
unsigned int ctl, baud, quot, ier;
|
||||
unsigned long flags;
|
||||
|
@ -251,7 +251,7 @@ static void uart_clps711x_shutdown(struct uart_port *port)
|
||||
|
||||
static void uart_clps711x_set_termios(struct uart_port *port,
|
||||
struct ktermios *termios,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
u32 ubrlcr;
|
||||
unsigned int baud, quot;
|
||||
|
@ -87,7 +87,6 @@ struct uart_cpm_port {
|
||||
struct gpio_desc *gpios[NUM_GPIOS];
|
||||
};
|
||||
|
||||
extern int cpm_uart_nr;
|
||||
extern struct uart_cpm_port cpm_uart_ports[UART_NR];
|
||||
|
||||
/* these are located in their respective files */
|
||||
|
@ -484,12 +484,11 @@ static void cpm_uart_shutdown(struct uart_port *port)
|
||||
|
||||
static void cpm_uart_set_termios(struct uart_port *port,
|
||||
struct ktermios *termios,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
int baud;
|
||||
unsigned long flags;
|
||||
u16 cval, scval, prev_mode;
|
||||
int bits, sbits;
|
||||
struct uart_cpm_port *pinfo =
|
||||
container_of(port, struct uart_cpm_port, port);
|
||||
smc_t __iomem *smcp = pinfo->smcp;
|
||||
@ -515,28 +514,17 @@ static void cpm_uart_set_termios(struct uart_port *port,
|
||||
if (maxidl > 0x10)
|
||||
maxidl = 0x10;
|
||||
|
||||
/* Character length programmed into the mode register is the
|
||||
* sum of: 1 start bit, number of data bits, 0 or 1 parity bit,
|
||||
* 1 or 2 stop bits, minus 1.
|
||||
* The value 'bits' counts this for us.
|
||||
*/
|
||||
cval = 0;
|
||||
scval = 0;
|
||||
|
||||
/* byte size */
|
||||
bits = tty_get_char_size(termios->c_cflag);
|
||||
sbits = bits - 5;
|
||||
|
||||
if (termios->c_cflag & CSTOPB) {
|
||||
cval |= SMCMR_SL; /* Two stops */
|
||||
scval |= SCU_PSMR_SL;
|
||||
bits++;
|
||||
}
|
||||
|
||||
if (termios->c_cflag & PARENB) {
|
||||
cval |= SMCMR_PEN;
|
||||
scval |= SCU_PSMR_PEN;
|
||||
bits++;
|
||||
if (!(termios->c_cflag & PARODD)) {
|
||||
cval |= SMCMR_PM_EVEN;
|
||||
scval |= (SCU_PSMR_REVP | SCU_PSMR_TEVP);
|
||||
@ -580,12 +568,9 @@ static void cpm_uart_set_termios(struct uart_port *port,
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
|
||||
/* Start bit has not been added (so don't, because we would just
|
||||
* subtract it later), and we need to add one for the number of
|
||||
* stops bits (there is always at least one).
|
||||
*/
|
||||
bits++;
|
||||
if (IS_SMC(pinfo)) {
|
||||
unsigned int bits = tty_get_frame_size(termios->c_cflag);
|
||||
|
||||
/*
|
||||
* MRBLR can be changed while an SMC/SCC is operating only
|
||||
* if it is done in a single bus cycle with one 16-bit move
|
||||
@ -604,13 +589,17 @@ static void cpm_uart_set_termios(struct uart_port *port,
|
||||
*/
|
||||
prev_mode = in_be16(&smcp->smc_smcmr) & (SMCMR_REN | SMCMR_TEN);
|
||||
/* Output in *one* operation, so we don't interrupt RX/TX if they
|
||||
* were already enabled. */
|
||||
out_be16(&smcp->smc_smcmr, smcr_mk_clen(bits) | cval |
|
||||
SMCMR_SM_UART | prev_mode);
|
||||
* were already enabled.
|
||||
* Character length programmed into the register is frame bits minus 1.
|
||||
*/
|
||||
out_be16(&smcp->smc_smcmr, smcr_mk_clen(bits - 1) | cval |
|
||||
SMCMR_SM_UART | prev_mode);
|
||||
} else {
|
||||
unsigned int bits = tty_get_char_size(termios->c_cflag);
|
||||
|
||||
out_be16(&pinfo->sccup->scc_genscc.scc_mrblr, pinfo->rx_fifosize);
|
||||
out_be16(&pinfo->sccup->scc_maxidl, maxidl);
|
||||
out_be16(&sccp->scc_psmr, (sbits << 12) | scval);
|
||||
out_be16(&sccp->scc_psmr, (UART_LCR_WLEN(bits) << 12) | scval);
|
||||
}
|
||||
|
||||
if (pinfo->clk)
|
||||
@ -1214,12 +1203,6 @@ static int cpm_uart_init_port(struct device_node *np,
|
||||
pinfo->port.fifosize = pinfo->tx_nrfifos * pinfo->tx_fifosize;
|
||||
spin_lock_init(&pinfo->port.lock);
|
||||
|
||||
pinfo->port.irq = irq_of_parse_and_map(np, 0);
|
||||
if (pinfo->port.irq == NO_IRQ) {
|
||||
ret = -EINVAL;
|
||||
goto out_pram;
|
||||
}
|
||||
|
||||
for (i = 0; i < NUM_GPIOS; i++) {
|
||||
struct gpio_desc *gpiod;
|
||||
|
||||
@ -1229,7 +1212,7 @@ static int cpm_uart_init_port(struct device_node *np,
|
||||
|
||||
if (IS_ERR(gpiod)) {
|
||||
ret = PTR_ERR(gpiod);
|
||||
goto out_irq;
|
||||
goto out_pram;
|
||||
}
|
||||
|
||||
if (gpiod) {
|
||||
@ -1255,8 +1238,6 @@ static int cpm_uart_init_port(struct device_node *np,
|
||||
|
||||
return cpm_uart_request_port(&pinfo->port);
|
||||
|
||||
out_irq:
|
||||
irq_dispose_mapping(pinfo->port.irq);
|
||||
out_pram:
|
||||
cpm_uart_unmap_pram(pinfo, pram);
|
||||
out_mem:
|
||||
@ -1436,11 +1417,17 @@ static int cpm_uart_probe(struct platform_device *ofdev)
|
||||
/* initialize the device pointer for the port */
|
||||
pinfo->port.dev = &ofdev->dev;
|
||||
|
||||
ret = cpm_uart_init_port(ofdev->dev.of_node, pinfo);
|
||||
if (ret)
|
||||
return ret;
|
||||
pinfo->port.irq = irq_of_parse_and_map(ofdev->dev.of_node, 0);
|
||||
if (!pinfo->port.irq)
|
||||
return -EINVAL;
|
||||
|
||||
return uart_add_one_port(&cpm_reg, &pinfo->port);
|
||||
ret = cpm_uart_init_port(ofdev->dev.of_node, pinfo);
|
||||
if (!ret)
|
||||
return uart_add_one_port(&cpm_reg, &pinfo->port);
|
||||
|
||||
irq_dispose_mapping(pinfo->port.irq);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int cpm_uart_remove(struct platform_device *ofdev)
|
||||
|
@ -287,7 +287,7 @@ static void digicolor_uart_shutdown(struct uart_port *port)
|
||||
|
||||
static void digicolor_uart_set_termios(struct uart_port *port,
|
||||
struct ktermios *termios,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
unsigned int baud, divisor;
|
||||
u8 config = 0;
|
||||
|
@ -559,7 +559,7 @@ static void dz_reset(struct dz_port *dport)
|
||||
}
|
||||
|
||||
static void dz_set_termios(struct uart_port *uport, struct ktermios *termios,
|
||||
struct ktermios *old_termios)
|
||||
const struct ktermios *old_termios)
|
||||
{
|
||||
struct dz_port *dport = to_dport(uport);
|
||||
unsigned long flags;
|
||||
@ -592,9 +592,12 @@ static void dz_set_termios(struct uart_port *uport, struct ktermios *termios,
|
||||
|
||||
baud = uart_get_baud_rate(uport, termios, old_termios, 50, 9600);
|
||||
bflag = dz_encode_baud_rate(baud);
|
||||
if (bflag < 0) { /* Try to keep unchanged. */
|
||||
baud = uart_get_baud_rate(uport, old_termios, NULL, 50, 9600);
|
||||
bflag = dz_encode_baud_rate(baud);
|
||||
if (bflag < 0) {
|
||||
if (old_termios) {
|
||||
/* Keep unchanged. */
|
||||
baud = tty_termios_baud_rate(old_termios);
|
||||
bflag = dz_encode_baud_rate(baud);
|
||||
}
|
||||
if (bflag < 0) { /* Resort to 9600. */
|
||||
baud = 9600;
|
||||
bflag = DZ_B9600;
|
||||
|
@ -67,7 +67,7 @@ static void __init earlycon_init(struct earlycon_device *device,
|
||||
if (*s)
|
||||
earlycon->index = simple_strtoul(s, NULL, 10);
|
||||
len = s - name;
|
||||
strlcpy(earlycon->name, name, min(len + 1, sizeof(earlycon->name)));
|
||||
strscpy(earlycon->name, name, min(len + 1, sizeof(earlycon->name)));
|
||||
earlycon->data = &early_console_dev;
|
||||
}
|
||||
|
||||
@ -123,7 +123,7 @@ static int __init parse_options(struct earlycon_device *device, char *options)
|
||||
device->baud = simple_strtoul(options, NULL, 0);
|
||||
length = min(strcspn(options, " ") + 1,
|
||||
(size_t)(sizeof(device->options)));
|
||||
strlcpy(device->options, options, length);
|
||||
strscpy(device->options, options, length);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -304,7 +304,7 @@ int __init of_setup_earlycon(const struct earlycon_id *match,
|
||||
|
||||
if (options) {
|
||||
early_console_dev.baud = simple_strtoul(options, NULL, 0);
|
||||
strlcpy(early_console_dev.options, options,
|
||||
strscpy(early_console_dev.options, options,
|
||||
sizeof(early_console_dev.options));
|
||||
}
|
||||
earlycon_init(&early_console_dev, match->name);
|
||||
|
@ -401,7 +401,7 @@ static void linflex_shutdown(struct uart_port *port)
|
||||
|
||||
static void
|
||||
linflex_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned long cr, old_cr, cr1;
|
||||
|
@ -1284,17 +1284,12 @@ static inline int lpuart_start_rx_dma(struct lpuart_port *sport)
|
||||
struct dma_slave_config dma_rx_sconfig = {};
|
||||
struct circ_buf *ring = &sport->rx_ring;
|
||||
int ret, nent;
|
||||
int bits, baud;
|
||||
struct tty_port *port = &sport->port.state->port;
|
||||
struct tty_struct *tty = port->tty;
|
||||
struct ktermios *termios = &tty->termios;
|
||||
struct dma_chan *chan = sport->dma_rx_chan;
|
||||
|
||||
baud = tty_get_baud_rate(tty);
|
||||
|
||||
bits = (termios->c_cflag & CSIZE) == CS7 ? 9 : 10;
|
||||
if (termios->c_cflag & PARENB)
|
||||
bits++;
|
||||
unsigned int bits = tty_get_frame_size(termios->c_cflag);
|
||||
unsigned int baud = tty_get_baud_rate(tty);
|
||||
|
||||
/*
|
||||
* Calculate length of one DMA buffer size to keep latency below
|
||||
@ -1776,6 +1771,7 @@ static void lpuart_dma_shutdown(struct lpuart_port *sport)
|
||||
if (sport->lpuart_dma_rx_use) {
|
||||
del_timer_sync(&sport->lpuart_timer);
|
||||
lpuart_dma_rx_free(&sport->port);
|
||||
sport->lpuart_dma_rx_use = false;
|
||||
}
|
||||
|
||||
if (sport->lpuart_dma_tx_use) {
|
||||
@ -1784,6 +1780,7 @@ static void lpuart_dma_shutdown(struct lpuart_port *sport)
|
||||
sport->dma_tx_in_progress = false;
|
||||
dmaengine_terminate_all(sport->dma_tx_chan);
|
||||
}
|
||||
sport->lpuart_dma_tx_use = false;
|
||||
}
|
||||
|
||||
if (sport->dma_tx_chan)
|
||||
@ -1833,7 +1830,7 @@ static void lpuart32_shutdown(struct uart_port *port)
|
||||
|
||||
static void
|
||||
lpuart_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
struct lpuart_port *sport = container_of(port, struct lpuart_port, port);
|
||||
unsigned long flags;
|
||||
@ -2073,7 +2070,7 @@ static void lpuart32_serial_setbrg(struct lpuart_port *sport,
|
||||
|
||||
static void
|
||||
lpuart32_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
struct lpuart_port *sport = container_of(port, struct lpuart_port, port);
|
||||
unsigned long flags;
|
||||
@ -2729,15 +2726,13 @@ static int lpuart_probe(struct platform_device *pdev)
|
||||
if (ret)
|
||||
goto failed_reset;
|
||||
|
||||
ret = uart_add_one_port(&lpuart_reg, &sport->port);
|
||||
if (ret)
|
||||
goto failed_attach_port;
|
||||
|
||||
ret = uart_get_rs485_mode(&sport->port);
|
||||
if (ret)
|
||||
goto failed_get_rs485;
|
||||
|
||||
uart_rs485_config(&sport->port);
|
||||
ret = uart_add_one_port(&lpuart_reg, &sport->port);
|
||||
if (ret)
|
||||
goto failed_attach_port;
|
||||
|
||||
ret = devm_request_irq(&pdev->dev, sport->port.irq, handler, 0,
|
||||
DRIVER_NAME, sport);
|
||||
@ -2747,9 +2742,9 @@ static int lpuart_probe(struct platform_device *pdev)
|
||||
return 0;
|
||||
|
||||
failed_irq_request:
|
||||
failed_get_rs485:
|
||||
uart_remove_one_port(&lpuart_reg, &sport->port);
|
||||
failed_attach_port:
|
||||
failed_get_rs485:
|
||||
failed_reset:
|
||||
lpuart_disable_clks(sport);
|
||||
return ret;
|
||||
@ -2800,7 +2795,7 @@ static int __maybe_unused lpuart_suspend(struct device *dev)
|
||||
* EDMA driver during suspend will forcefully release any
|
||||
* non-idle DMA channels. If port wakeup is enabled or if port
|
||||
* is console port or 'no_console_suspend' is set the Rx DMA
|
||||
* cannot resume as as expected, hence gracefully release the
|
||||
* cannot resume as expected, hence gracefully release the
|
||||
* Rx DMA path before suspend and start Rx DMA path on resume.
|
||||
*/
|
||||
if (irq_wake) {
|
||||
|
@ -1351,9 +1351,8 @@ static void icom_close(struct uart_port *port)
|
||||
kref_put(&icom_port->adapter->kref, icom_kref_release);
|
||||
}
|
||||
|
||||
static void icom_set_termios(struct uart_port *port,
|
||||
struct ktermios *termios,
|
||||
struct ktermios *old_termios)
|
||||
static void icom_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
const struct ktermios *old_termios)
|
||||
{
|
||||
struct icom_port *icom_port = to_icom_port(port);
|
||||
int baud;
|
||||
|
@ -380,8 +380,7 @@ static void imx_uart_rts_active(struct imx_port *sport, u32 *ucr2)
|
||||
{
|
||||
*ucr2 &= ~(UCR2_CTSC | UCR2_CTS);
|
||||
|
||||
sport->port.mctrl |= TIOCM_RTS;
|
||||
mctrl_gpio_set(sport->gpios, sport->port.mctrl);
|
||||
mctrl_gpio_set(sport->gpios, sport->port.mctrl | TIOCM_RTS);
|
||||
}
|
||||
|
||||
/* called with port.lock taken and irqs caller dependent */
|
||||
@ -390,8 +389,7 @@ static void imx_uart_rts_inactive(struct imx_port *sport, u32 *ucr2)
|
||||
*ucr2 &= ~UCR2_CTSC;
|
||||
*ucr2 |= UCR2_CTS;
|
||||
|
||||
sport->port.mctrl &= ~TIOCM_RTS;
|
||||
mctrl_gpio_set(sport->gpios, sport->port.mctrl);
|
||||
mctrl_gpio_set(sport->gpios, sport->port.mctrl & ~TIOCM_RTS);
|
||||
}
|
||||
|
||||
static void start_hrtimer_ms(struct hrtimer *hrt, unsigned long msec)
|
||||
@ -1620,7 +1618,7 @@ static void imx_uart_flush_buffer(struct uart_port *port)
|
||||
|
||||
static void
|
||||
imx_uart_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
struct imx_port *sport = (struct imx_port *)port;
|
||||
unsigned long flags;
|
||||
@ -2347,8 +2345,6 @@ static int imx_uart_probe(struct platform_device *pdev)
|
||||
dev_err(&pdev->dev,
|
||||
"low-active RTS not possible when receiver is off, enabling receiver\n");
|
||||
|
||||
uart_rs485_config(&sport->port);
|
||||
|
||||
/* Disable interrupts before requesting them */
|
||||
ucr1 = imx_uart_readl(sport, UCR1);
|
||||
ucr1 &= ~(UCR1_ADEN | UCR1_TRDYEN | UCR1_IDEN | UCR1_RRDYEN | UCR1_RTSDEN);
|
||||
|
@ -873,7 +873,7 @@ ip22zilog_convert_to_zs(struct uart_ip22zilog_port *up, unsigned int cflag,
|
||||
/* The port lock is not held. */
|
||||
static void
|
||||
ip22zilog_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
struct uart_ip22zilog_port *up =
|
||||
container_of(port, struct uart_ip22zilog_port, port);
|
||||
|
@ -211,7 +211,8 @@ static int jsm_probe_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
|
||||
break;
|
||||
default:
|
||||
return -ENXIO;
|
||||
rc = -ENXIO;
|
||||
goto out_kfree_brd;
|
||||
}
|
||||
|
||||
rc = request_irq(brd->irq, brd->bd_ops->intr, IRQF_SHARED, "JSM", brd);
|
||||
|
@ -300,8 +300,8 @@ static void jsm_tty_close(struct uart_port *port)
|
||||
}
|
||||
|
||||
static void jsm_tty_set_termios(struct uart_port *port,
|
||||
struct ktermios *termios,
|
||||
struct ktermios *old_termios)
|
||||
struct ktermios *termios,
|
||||
const struct ktermios *old_termios)
|
||||
{
|
||||
unsigned long lock_flags;
|
||||
struct jsm_channel *channel =
|
||||
|
@ -8,6 +8,7 @@
|
||||
* Copyright (C) 2010 Thomas Langer, <thomas.langer@lantiq.com>
|
||||
*/
|
||||
|
||||
#include <linux/bitfield.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/device.h>
|
||||
@ -93,7 +94,6 @@
|
||||
#define ASCFSTAT_RXFFLMASK 0x003F
|
||||
#define ASCFSTAT_TXFFLMASK 0x3F00
|
||||
#define ASCFSTAT_TXFREEMASK 0x3F000000
|
||||
#define ASCFSTAT_TXFREEOFF 24
|
||||
|
||||
static void lqasc_tx_chars(struct uart_port *port);
|
||||
static struct ltq_uart_port *lqasc_port[MAXPORTS];
|
||||
@ -139,6 +139,13 @@ lqasc_stop_tx(struct uart_port *port)
|
||||
return;
|
||||
}
|
||||
|
||||
static bool lqasc_tx_ready(struct uart_port *port)
|
||||
{
|
||||
u32 fstat = __raw_readl(port->membase + LTQ_ASC_FSTAT);
|
||||
|
||||
return FIELD_GET(ASCFSTAT_TXFREEMASK, fstat);
|
||||
}
|
||||
|
||||
static void
|
||||
lqasc_start_tx(struct uart_port *port)
|
||||
{
|
||||
@ -228,8 +235,7 @@ lqasc_tx_chars(struct uart_port *port)
|
||||
return;
|
||||
}
|
||||
|
||||
while (((__raw_readl(port->membase + LTQ_ASC_FSTAT) &
|
||||
ASCFSTAT_TXFREEMASK) >> ASCFSTAT_TXFREEOFF) != 0) {
|
||||
while (lqasc_tx_ready(port)) {
|
||||
if (port->x_char) {
|
||||
writeb(port->x_char, port->membase + LTQ_ASC_TBUF);
|
||||
port->icount.tx++;
|
||||
@ -405,8 +411,8 @@ lqasc_shutdown(struct uart_port *port)
|
||||
}
|
||||
|
||||
static void
|
||||
lqasc_set_termios(struct uart_port *port,
|
||||
struct ktermios *new, struct ktermios *old)
|
||||
lqasc_set_termios(struct uart_port *port, struct ktermios *new,
|
||||
const struct ktermios *old)
|
||||
{
|
||||
unsigned int cflag;
|
||||
unsigned int iflag;
|
||||
@ -600,15 +606,12 @@ static const struct uart_ops lqasc_pops = {
|
||||
static void
|
||||
lqasc_console_putchar(struct uart_port *port, unsigned char ch)
|
||||
{
|
||||
int fifofree;
|
||||
|
||||
if (!port->membase)
|
||||
return;
|
||||
|
||||
do {
|
||||
fifofree = (__raw_readl(port->membase + LTQ_ASC_FSTAT)
|
||||
& ASCFSTAT_TXFREEMASK) >> ASCFSTAT_TXFREEOFF;
|
||||
} while (fifofree == 0);
|
||||
while (!lqasc_tx_ready(port))
|
||||
;
|
||||
|
||||
writeb(ch, port->membase + LTQ_ASC_TBUF);
|
||||
}
|
||||
|
||||
|
@ -178,7 +178,7 @@ static void liteuart_shutdown(struct uart_port *port)
|
||||
}
|
||||
|
||||
static void liteuart_set_termios(struct uart_port *port, struct ktermios *new,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
unsigned int baud;
|
||||
unsigned long flags;
|
||||
|
@ -278,6 +278,13 @@ static void __serial_lpc32xx_rx(struct uart_port *port)
|
||||
|
||||
static void serial_lpc32xx_stop_tx(struct uart_port *port);
|
||||
|
||||
static bool serial_lpc32xx_tx_ready(struct uart_port *port)
|
||||
{
|
||||
u32 level = readl(LPC32XX_HSUART_LEVEL(port->membase));
|
||||
|
||||
return LPC32XX_HSU_TX_LEV(level) < 64;
|
||||
}
|
||||
|
||||
static void __serial_lpc32xx_tx(struct uart_port *port)
|
||||
{
|
||||
struct circ_buf *xmit = &port->state->xmit;
|
||||
@ -293,8 +300,7 @@ static void __serial_lpc32xx_tx(struct uart_port *port)
|
||||
goto exit_tx;
|
||||
|
||||
/* Transfer data */
|
||||
while (LPC32XX_HSU_TX_LEV(readl(
|
||||
LPC32XX_HSUART_LEVEL(port->membase))) < 64) {
|
||||
while (serial_lpc32xx_tx_ready(port)) {
|
||||
writel((u32) xmit->buf[xmit->tail],
|
||||
LPC32XX_HSUART_FIFO(port->membase));
|
||||
xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
|
||||
@ -493,7 +499,7 @@ static void serial_lpc32xx_shutdown(struct uart_port *port)
|
||||
/* port->lock is not held. */
|
||||
static void serial_lpc32xx_set_termios(struct uart_port *port,
|
||||
struct ktermios *termios,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned int baud, quot;
|
||||
|
@ -418,7 +418,7 @@ static void max3100_set_mctrl(struct uart_port *port, unsigned int mctrl)
|
||||
|
||||
static void
|
||||
max3100_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
struct max3100_port *s = container_of(port,
|
||||
struct max3100_port,
|
||||
|
@ -906,7 +906,7 @@ static void max310x_break_ctl(struct uart_port *port, int break_state)
|
||||
|
||||
static void max310x_set_termios(struct uart_port *port,
|
||||
struct ktermios *termios,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
unsigned int lcr = 0, flow = 0;
|
||||
int baud;
|
||||
|
@ -192,7 +192,7 @@ static void mcf_shutdown(struct uart_port *port)
|
||||
/****************************************************************************/
|
||||
|
||||
static void mcf_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned int baud, baudclk;
|
||||
|
@ -646,8 +646,8 @@ static void men_z135_shutdown(struct uart_port *port)
|
||||
}
|
||||
|
||||
static void men_z135_set_termios(struct uart_port *port,
|
||||
struct ktermios *termios,
|
||||
struct ktermios *old)
|
||||
struct ktermios *termios,
|
||||
const struct ktermios *old)
|
||||
{
|
||||
struct men_z135_port *uart = to_men_z135(port);
|
||||
unsigned int baud;
|
||||
|
@ -335,7 +335,7 @@ static void meson_uart_change_speed(struct uart_port *port, unsigned long baud)
|
||||
|
||||
static void meson_uart_set_termios(struct uart_port *port,
|
||||
struct ktermios *termios,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
unsigned int cflags, iflags, baud;
|
||||
unsigned long flags;
|
||||
@ -667,29 +667,6 @@ static struct uart_driver meson_uart_driver = {
|
||||
.cons = MESON_SERIAL_CONSOLE,
|
||||
};
|
||||
|
||||
static inline struct clk *meson_uart_probe_clock(struct device *dev,
|
||||
const char *id)
|
||||
{
|
||||
struct clk *clk = NULL;
|
||||
int ret;
|
||||
|
||||
clk = devm_clk_get(dev, id);
|
||||
if (IS_ERR(clk))
|
||||
return clk;
|
||||
|
||||
ret = clk_prepare_enable(clk);
|
||||
if (ret) {
|
||||
dev_err(dev, "couldn't enable clk\n");
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
devm_add_action_or_reset(dev,
|
||||
(void(*)(void *))clk_disable_unprepare,
|
||||
clk);
|
||||
|
||||
return clk;
|
||||
}
|
||||
|
||||
static int meson_uart_probe_clocks(struct platform_device *pdev,
|
||||
struct uart_port *port)
|
||||
{
|
||||
@ -697,15 +674,15 @@ static int meson_uart_probe_clocks(struct platform_device *pdev,
|
||||
struct clk *clk_pclk = NULL;
|
||||
struct clk *clk_baud = NULL;
|
||||
|
||||
clk_pclk = meson_uart_probe_clock(&pdev->dev, "pclk");
|
||||
clk_pclk = devm_clk_get_enabled(&pdev->dev, "pclk");
|
||||
if (IS_ERR(clk_pclk))
|
||||
return PTR_ERR(clk_pclk);
|
||||
|
||||
clk_xtal = meson_uart_probe_clock(&pdev->dev, "xtal");
|
||||
clk_xtal = devm_clk_get_enabled(&pdev->dev, "xtal");
|
||||
if (IS_ERR(clk_xtal))
|
||||
return PTR_ERR(clk_xtal);
|
||||
|
||||
clk_baud = meson_uart_probe_clock(&pdev->dev, "baud");
|
||||
clk_baud = devm_clk_get_enabled(&pdev->dev, "baud");
|
||||
if (IS_ERR(clk_baud))
|
||||
return PTR_ERR(clk_baud);
|
||||
|
||||
|
@ -298,7 +298,8 @@ static void mlb_usio_shutdown(struct uart_port *port)
|
||||
}
|
||||
|
||||
static void mlb_usio_set_termios(struct uart_port *port,
|
||||
struct ktermios *termios, struct ktermios *old)
|
||||
struct ktermios *termios,
|
||||
const struct ktermios *old)
|
||||
{
|
||||
unsigned int escr, smr = MLB_USIO_SMR_SOE;
|
||||
unsigned long flags, baud, quot;
|
||||
|
@ -101,7 +101,7 @@ struct psc_ops {
|
||||
void (*cw_restore_ints)(struct uart_port *port);
|
||||
unsigned int (*set_baudrate)(struct uart_port *port,
|
||||
struct ktermios *new,
|
||||
struct ktermios *old);
|
||||
const struct ktermios *old);
|
||||
int (*clock_alloc)(struct uart_port *port);
|
||||
void (*clock_relse)(struct uart_port *port);
|
||||
int (*clock)(struct uart_port *port, int enable);
|
||||
@ -287,7 +287,7 @@ static void mpc52xx_psc_cw_restore_ints(struct uart_port *port)
|
||||
|
||||
static unsigned int mpc5200_psc_set_baudrate(struct uart_port *port,
|
||||
struct ktermios *new,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
unsigned int baud;
|
||||
unsigned int divisor;
|
||||
@ -305,7 +305,7 @@ static unsigned int mpc5200_psc_set_baudrate(struct uart_port *port,
|
||||
|
||||
static unsigned int mpc5200b_psc_set_baudrate(struct uart_port *port,
|
||||
struct ktermios *new,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
unsigned int baud;
|
||||
unsigned int divisor;
|
||||
@ -533,7 +533,7 @@ static void mpc512x_psc_cw_restore_ints(struct uart_port *port)
|
||||
|
||||
static unsigned int mpc512x_psc_set_baudrate(struct uart_port *port,
|
||||
struct ktermios *new,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
unsigned int baud;
|
||||
unsigned int divisor;
|
||||
@ -880,7 +880,7 @@ static inline void mpc5125_set_divisor(struct mpc5125_psc __iomem *psc,
|
||||
|
||||
static unsigned int mpc5125_psc_set_baudrate(struct uart_port *port,
|
||||
struct ktermios *new,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
unsigned int baud;
|
||||
unsigned int divisor;
|
||||
@ -1167,7 +1167,7 @@ mpc52xx_uart_shutdown(struct uart_port *port)
|
||||
|
||||
static void
|
||||
mpc52xx_uart_set_termios(struct uart_port *port, struct ktermios *new,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned char mr1, mr2;
|
||||
@ -1364,7 +1364,7 @@ static const struct uart_ops mpc52xx_uart_ops = {
|
||||
/* Interrupt handling */
|
||||
/* ======================================================================== */
|
||||
|
||||
static inline unsigned int
|
||||
static inline bool
|
||||
mpc52xx_uart_int_rx_chars(struct uart_port *port)
|
||||
{
|
||||
struct tty_port *tport = &port->state->port;
|
||||
@ -1425,7 +1425,7 @@ mpc52xx_uart_int_rx_chars(struct uart_port *port)
|
||||
return psc_ops->raw_rx_rdy(port);
|
||||
}
|
||||
|
||||
static inline int
|
||||
static inline bool
|
||||
mpc52xx_uart_int_tx_chars(struct uart_port *port)
|
||||
{
|
||||
struct circ_buf *xmit = &port->state->xmit;
|
||||
@ -1435,13 +1435,13 @@ mpc52xx_uart_int_tx_chars(struct uart_port *port)
|
||||
psc_ops->write_char(port, port->x_char);
|
||||
port->icount.tx++;
|
||||
port->x_char = 0;
|
||||
return 1;
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Nothing to do ? */
|
||||
if (uart_circ_empty(xmit) || uart_tx_stopped(port)) {
|
||||
mpc52xx_uart_stop_tx(port);
|
||||
return 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Send chars */
|
||||
@ -1460,23 +1460,23 @@ mpc52xx_uart_int_tx_chars(struct uart_port *port)
|
||||
/* Maybe we're done after all */
|
||||
if (uart_circ_empty(xmit)) {
|
||||
mpc52xx_uart_stop_tx(port);
|
||||
return 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
return 1;
|
||||
return true;
|
||||
}
|
||||
|
||||
static irqreturn_t
|
||||
mpc5xxx_uart_process_int(struct uart_port *port)
|
||||
{
|
||||
unsigned long pass = ISR_PASS_LIMIT;
|
||||
unsigned int keepgoing;
|
||||
bool keepgoing;
|
||||
u8 status;
|
||||
|
||||
/* While we have stuff to do, we continue */
|
||||
do {
|
||||
/* If we don't find anything to do, we stop */
|
||||
keepgoing = 0;
|
||||
keepgoing = false;
|
||||
|
||||
psc_ops->rx_clr_irq(port);
|
||||
if (psc_ops->rx_rdy(port))
|
||||
@ -1495,7 +1495,7 @@ mpc5xxx_uart_process_int(struct uart_port *port)
|
||||
|
||||
/* Limit number of iteration */
|
||||
if (!(--pass))
|
||||
keepgoing = 0;
|
||||
keepgoing = false;
|
||||
|
||||
} while (keepgoing);
|
||||
|
||||
|
@ -358,7 +358,7 @@ static void mps2_uart_shutdown(struct uart_port *port)
|
||||
|
||||
static void
|
||||
mps2_uart_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned int baud, bauddiv;
|
||||
|
@ -1263,7 +1263,7 @@ static void msm_shutdown(struct uart_port *port)
|
||||
}
|
||||
|
||||
static void msm_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
struct msm_port *msm_port = to_msm_port(port);
|
||||
struct msm_dma *dma = &msm_port->rx_dma;
|
||||
|
@ -289,7 +289,7 @@ static void mux_shutdown(struct uart_port *port)
|
||||
*/
|
||||
static void
|
||||
mux_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -564,7 +564,7 @@ static unsigned int mvebu_uart_baud_rate_set(struct uart_port *port, unsigned in
|
||||
|
||||
static void mvebu_uart_set_termios(struct uart_port *port,
|
||||
struct ktermios *termios,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned int baud, min_baud, max_baud;
|
||||
|
@ -959,7 +959,7 @@ err_out:
|
||||
#define CTS_AT_AUART() !mctrl_gpio_to_gpiod(s->gpios, UART_GPIO_CTS)
|
||||
static void mxs_auart_settermios(struct uart_port *u,
|
||||
struct ktermios *termios,
|
||||
struct ktermios *old)
|
||||
const struct ktermios *old)
|
||||
{
|
||||
struct mxs_auart_port *s = to_auart_port(u);
|
||||
u32 ctrl, ctrl2, div;
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user