Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
d6a03f19
Commit
d6a03f19
authored
Apr 11, 2004
by
Russell King
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[SERIAL] Add support for TI16C750 hardware flow control.
parent
99ca6b83
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
25 additions
and
3 deletions
+25
-3
drivers/serial/8250.c
drivers/serial/8250.c
+24
-3
include/linux/serial_reg.h
include/linux/serial_reg.h
+1
-0
No files found.
drivers/serial/8250.c
View file @
d6a03f19
...
@@ -133,6 +133,7 @@ struct uart_8250_port {
...
@@ -133,6 +133,7 @@ struct uart_8250_port {
unsigned
char
acr
;
unsigned
char
acr
;
unsigned
char
ier
;
unsigned
char
ier
;
unsigned
char
lcr
;
unsigned
char
lcr
;
unsigned
char
mcr
;
unsigned
char
mcr_mask
;
/* mask of user bits */
unsigned
char
mcr_mask
;
/* mask of user bits */
unsigned
char
mcr_force
;
/* mask of forced bits */
unsigned
char
mcr_force
;
/* mask of forced bits */
unsigned
char
lsr_break_flag
;
unsigned
char
lsr_break_flag
;
...
@@ -1176,7 +1177,7 @@ static void serial8250_set_mctrl(struct uart_port *port, unsigned int mctrl)
...
@@ -1176,7 +1177,7 @@ static void serial8250_set_mctrl(struct uart_port *port, unsigned int mctrl)
if
(
mctrl
&
TIOCM_LOOP
)
if
(
mctrl
&
TIOCM_LOOP
)
mcr
|=
UART_MCR_LOOP
;
mcr
|=
UART_MCR_LOOP
;
mcr
=
(
mcr
&
up
->
mcr_mask
)
|
up
->
mcr_force
;
mcr
=
(
mcr
&
up
->
mcr_mask
)
|
up
->
mcr_force
|
up
->
mcr
;
serial_out
(
up
,
UART_MCR
,
mcr
);
serial_out
(
up
,
UART_MCR
,
mcr
);
}
}
...
@@ -1202,6 +1203,7 @@ static int serial8250_startup(struct uart_port *port)
...
@@ -1202,6 +1203,7 @@ static int serial8250_startup(struct uart_port *port)
int
retval
;
int
retval
;
up
->
capabilities
=
uart_config
[
up
->
port
.
type
].
flags
;
up
->
capabilities
=
uart_config
[
up
->
port
.
type
].
flags
;
up
->
mcr
=
0
;
if
(
up
->
port
.
type
==
PORT_16C950
)
{
if
(
up
->
port
.
type
==
PORT_16C950
)
{
/* Wake up and initialize UART */
/* Wake up and initialize UART */
...
@@ -1451,8 +1453,19 @@ serial8250_set_termios(struct uart_port *port, struct termios *termios,
...
@@ -1451,8 +1453,19 @@ serial8250_set_termios(struct uart_port *port, struct termios *termios,
else
else
fcr
=
UART_FCR_ENABLE_FIFO
|
UART_FCR_TRIGGER_8
;
fcr
=
UART_FCR_ENABLE_FIFO
|
UART_FCR_TRIGGER_8
;
}
}
if
(
up
->
port
.
type
==
PORT_16750
)
/*
* TI16C750: hardware flow control and 64 byte FIFOs. When AFE is
* enabled, RTS will be deasserted when the receive FIFO contains
* more characters than the trigger, or the MCR RTS bit is cleared.
*/
if
(
up
->
port
.
type
==
PORT_16750
)
{
up
->
mcr
&=
~
UART_MCR_AFE
;
if
(
termios
->
c_cflag
&
CRTSCTS
)
up
->
mcr
|=
UART_MCR_AFE
;
fcr
|=
UART_FCR7_64BYTE
;
fcr
|=
UART_FCR7_64BYTE
;
}
/*
/*
* Ok, we're now changing the port state. Do it with
* Ok, we're now changing the port state. Do it with
...
@@ -1514,10 +1527,17 @@ serial8250_set_termios(struct uart_port *port, struct termios *termios,
...
@@ -1514,10 +1527,17 @@ serial8250_set_termios(struct uart_port *port, struct termios *termios,
}
else
{
}
else
{
serial_outp
(
up
,
UART_LCR
,
cval
|
UART_LCR_DLAB
);
/* set DLAB */
serial_outp
(
up
,
UART_LCR
,
cval
|
UART_LCR_DLAB
);
/* set DLAB */
}
}
serial_outp
(
up
,
UART_DLL
,
quot
&
0xff
);
/* LS of divisor */
serial_outp
(
up
,
UART_DLL
,
quot
&
0xff
);
/* LS of divisor */
serial_outp
(
up
,
UART_DLM
,
quot
>>
8
);
/* MS of divisor */
serial_outp
(
up
,
UART_DLM
,
quot
>>
8
);
/* MS of divisor */
/*
* LCR DLAB must be set to enable 64-byte FIFO mode. If the FCR
* is written without DLAB set, this mode will be disabled.
*/
if
(
up
->
port
.
type
==
PORT_16750
)
if
(
up
->
port
.
type
==
PORT_16750
)
serial_outp
(
up
,
UART_FCR
,
fcr
);
/* set fcr */
serial_outp
(
up
,
UART_FCR
,
fcr
);
serial_outp
(
up
,
UART_LCR
,
cval
);
/* reset DLAB */
serial_outp
(
up
,
UART_LCR
,
cval
);
/* reset DLAB */
up
->
lcr
=
cval
;
/* Save LCR */
up
->
lcr
=
cval
;
/* Save LCR */
if
(
up
->
port
.
type
!=
PORT_16750
)
{
if
(
up
->
port
.
type
!=
PORT_16750
)
{
...
@@ -1527,6 +1547,7 @@ serial8250_set_termios(struct uart_port *port, struct termios *termios,
...
@@ -1527,6 +1547,7 @@ serial8250_set_termios(struct uart_port *port, struct termios *termios,
}
}
serial_outp
(
up
,
UART_FCR
,
fcr
);
/* set fcr */
serial_outp
(
up
,
UART_FCR
,
fcr
);
/* set fcr */
}
}
serial8250_set_mctrl
(
&
up
->
port
,
up
->
port
.
mctrl
);
spin_unlock_irqrestore
(
&
up
->
port
.
lock
,
flags
);
spin_unlock_irqrestore
(
&
up
->
port
.
lock
,
flags
);
}
}
...
...
include/linux/serial_reg.h
View file @
d6a03f19
...
@@ -121,6 +121,7 @@
...
@@ -121,6 +121,7 @@
/*
/*
* These are the definitions for the Modem Control Register
* These are the definitions for the Modem Control Register
*/
*/
#define UART_MCR_AFE 0x20
/* Enable auto-RTS/CTS (TI16C750) */
#define UART_MCR_LOOP 0x10
/* Enable loopback test mode */
#define UART_MCR_LOOP 0x10
/* Enable loopback test mode */
#define UART_MCR_OUT2 0x08
/* Out2 complement */
#define UART_MCR_OUT2 0x08
/* Out2 complement */
#define UART_MCR_OUT1 0x04
/* Out1 complement */
#define UART_MCR_OUT1 0x04
/* Out1 complement */
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment