Commit 0238d2b4 authored by Jisheng Zhang's avatar Jisheng Zhang Committed by Greg Kroah-Hartman

serial: 8250: introduce get_divisor() and set_divisor() hook

Add these two hooks so that they can be overridden with driver specific
implementations.
Signed-off-by: default avatarJisheng Zhang <Jisheng.Zhang@synaptics.com>
Reviewed-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 16777ecd
...@@ -1023,6 +1023,10 @@ int serial8250_register_8250_port(struct uart_8250_port *up) ...@@ -1023,6 +1023,10 @@ int serial8250_register_8250_port(struct uart_8250_port *up)
uart->port.get_mctrl = up->port.get_mctrl; uart->port.get_mctrl = up->port.get_mctrl;
if (up->port.set_mctrl) if (up->port.set_mctrl)
uart->port.set_mctrl = up->port.set_mctrl; uart->port.set_mctrl = up->port.set_mctrl;
if (up->port.get_divisor)
uart->port.get_divisor = up->port.get_divisor;
if (up->port.set_divisor)
uart->port.set_divisor = up->port.set_divisor;
if (up->port.startup) if (up->port.startup)
uart->port.startup = up->port.startup; uart->port.startup = up->port.startup;
if (up->port.shutdown) if (up->port.shutdown)
......
...@@ -2498,9 +2498,9 @@ static unsigned int npcm_get_divisor(struct uart_8250_port *up, ...@@ -2498,9 +2498,9 @@ static unsigned int npcm_get_divisor(struct uart_8250_port *up,
return DIV_ROUND_CLOSEST(port->uartclk, 16 * baud + 2) - 2; return DIV_ROUND_CLOSEST(port->uartclk, 16 * baud + 2) - 2;
} }
static unsigned int serial8250_get_divisor(struct uart_port *port, static unsigned int serial8250_do_get_divisor(struct uart_port *port,
unsigned int baud, unsigned int baud,
unsigned int *frac) unsigned int *frac)
{ {
struct uart_8250_port *up = up_to_u8250p(port); struct uart_8250_port *up = up_to_u8250p(port);
unsigned int quot; unsigned int quot;
...@@ -2532,6 +2532,16 @@ static unsigned int serial8250_get_divisor(struct uart_port *port, ...@@ -2532,6 +2532,16 @@ static unsigned int serial8250_get_divisor(struct uart_port *port,
return quot; return quot;
} }
static unsigned int serial8250_get_divisor(struct uart_port *port,
unsigned int baud,
unsigned int *frac)
{
if (port->get_divisor)
return port->get_divisor(port, baud, frac);
return serial8250_do_get_divisor(port, baud, frac);
}
static unsigned char serial8250_compute_lcr(struct uart_8250_port *up, static unsigned char serial8250_compute_lcr(struct uart_8250_port *up,
tcflag_t c_cflag) tcflag_t c_cflag)
{ {
...@@ -2570,7 +2580,7 @@ static unsigned char serial8250_compute_lcr(struct uart_8250_port *up, ...@@ -2570,7 +2580,7 @@ static unsigned char serial8250_compute_lcr(struct uart_8250_port *up,
return cval; return cval;
} }
static void serial8250_set_divisor(struct uart_port *port, unsigned int baud, static void serial8250_do_set_divisor(struct uart_port *port, unsigned int baud,
unsigned int quot, unsigned int quot_frac) unsigned int quot, unsigned int quot_frac)
{ {
struct uart_8250_port *up = up_to_u8250p(port); struct uart_8250_port *up = up_to_u8250p(port);
...@@ -2603,6 +2613,15 @@ static void serial8250_set_divisor(struct uart_port *port, unsigned int baud, ...@@ -2603,6 +2613,15 @@ static void serial8250_set_divisor(struct uart_port *port, unsigned int baud,
} }
} }
static void serial8250_set_divisor(struct uart_port *port, unsigned int baud,
unsigned int quot, unsigned int quot_frac)
{
if (port->set_divisor)
port->set_divisor(port, baud, quot, quot_frac);
else
serial8250_do_set_divisor(port, baud, quot, quot_frac);
}
static unsigned int serial8250_get_baud_rate(struct uart_port *port, static unsigned int serial8250_get_baud_rate(struct uart_port *port,
struct ktermios *termios, struct ktermios *termios,
struct ktermios *old) struct ktermios *old)
......
...@@ -127,6 +127,13 @@ struct uart_port { ...@@ -127,6 +127,13 @@ struct uart_port {
struct ktermios *); struct ktermios *);
unsigned int (*get_mctrl)(struct uart_port *); unsigned int (*get_mctrl)(struct uart_port *);
void (*set_mctrl)(struct uart_port *, unsigned int); void (*set_mctrl)(struct uart_port *, unsigned int);
unsigned int (*get_divisor)(struct uart_port *,
unsigned int baud,
unsigned int *frac);
void (*set_divisor)(struct uart_port *,
unsigned int baud,
unsigned int quot,
unsigned int quot_frac);
int (*startup)(struct uart_port *port); int (*startup)(struct uart_port *port);
void (*shutdown)(struct uart_port *port); void (*shutdown)(struct uart_port *port);
void (*throttle)(struct uart_port *port); void (*throttle)(struct uart_port *port);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment