Skip to content

Commit fab8a02

Browse files
Lukas Redlingergregkh
authored andcommitted
serial: 8250_fintek: Enable high speed mode on Fintek F81866
Fintek F81866 supports baud rates higher than 115200 but needs to raise it's clock speed from 1.84 to 14.76 MHz. This is eight times faster, so gives 921600 as resulting baud_base. F81866 clock register 0xf2: Bit 7-2 reserved Bit 1-0 00: 1.8432MHz 01: 18.432MHz 10: 24MHz 11: 14.769MHz Signed-off-by: Lukas Redlinger <rel+kernel@agilox.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 71472fa commit fab8a02

File tree

1 file changed

+38
-5
lines changed

1 file changed

+38
-5
lines changed

drivers/tty/serial/8250/8250_fintek.c

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,12 @@
6161
* The IRQ setting mode of F81866 is not the same with F81216 series.
6262
* Level/Low: IRQ_MODE0:0, IRQ_MODE1:0
6363
* Edge/High: IRQ_MODE0:1, IRQ_MODE1:0
64+
*
65+
* Clock speeds for UART (register F2h)
66+
* 00: 1.8432MHz.
67+
* 01: 18.432MHz.
68+
* 10: 24MHz.
69+
* 11: 14.769MHz.
6470
*/
6571
#define F81866_IRQ_MODE 0xf0
6672
#define F81866_IRQ_SHARE BIT(0)
@@ -72,6 +78,13 @@
7278
#define F81866_LDN_LOW 0x10
7379
#define F81866_LDN_HIGH 0x16
7480

81+
#define F81866_UART_CLK 0xF2
82+
#define F81866_UART_CLK_MASK (BIT(1) | BIT(0))
83+
#define F81866_UART_CLK_1_8432MHZ 0
84+
#define F81866_UART_CLK_14_769MHZ (BIT(1) | BIT(0))
85+
#define F81866_UART_CLK_18_432MHZ BIT(0)
86+
#define F81866_UART_CLK_24MHZ BIT(1)
87+
7588
struct fintek_8250 {
7689
u16 pid;
7790
u16 base_port;
@@ -256,8 +269,26 @@ static void fintek_8250_set_max_fifo(struct fintek_8250 *pdata)
256269
}
257270
}
258271

259-
static int probe_setup_port(struct fintek_8250 *pdata, u16 io_address,
260-
unsigned int irq)
272+
static void fintek_8250_goto_highspeed(struct uart_8250_port *uart,
273+
struct fintek_8250 *pdata)
274+
{
275+
sio_write_reg(pdata, LDN, pdata->index);
276+
277+
switch (pdata->pid) {
278+
case CHIP_ID_F81866: /* set uart clock for high speed serial mode */
279+
sio_write_mask_reg(pdata, F81866_UART_CLK,
280+
F81866_UART_CLK_MASK,
281+
F81866_UART_CLK_14_769MHZ);
282+
283+
uart->port.uartclk = 921600 * 16;
284+
break;
285+
default: /* leave clock speed untouched */
286+
break;
287+
}
288+
}
289+
290+
static int probe_setup_port(struct fintek_8250 *pdata,
291+
struct uart_8250_port *uart)
261292
{
262293
static const u16 addr[] = {0x4e, 0x2e};
263294
static const u8 keys[] = {0x77, 0xa0, 0x87, 0x67};
@@ -284,18 +315,20 @@ static int probe_setup_port(struct fintek_8250 *pdata, u16 io_address,
284315
sio_write_reg(pdata, LDN, k);
285316
aux = sio_read_reg(pdata, IO_ADDR1);
286317
aux |= sio_read_reg(pdata, IO_ADDR2) << 8;
287-
if (aux != io_address)
318+
if (aux != uart->port.iobase)
288319
continue;
289320

290321
pdata->index = k;
291322

292-
irq_data = irq_get_irq_data(irq);
323+
irq_data = irq_get_irq_data(uart->port.irq);
293324
if (irq_data)
294325
level_mode =
295326
irqd_is_level_type(irq_data);
296327

297328
fintek_8250_set_irq_mode(pdata, level_mode);
298329
fintek_8250_set_max_fifo(pdata);
330+
fintek_8250_goto_highspeed(uart, pdata);
331+
299332
fintek_8250_exit_key(addr[i]);
300333

301334
return 0;
@@ -330,7 +363,7 @@ int fintek_8250_probe(struct uart_8250_port *uart)
330363
struct fintek_8250 *pdata;
331364
struct fintek_8250 probe_data;
332365

333-
if (probe_setup_port(&probe_data, uart->port.iobase, uart->port.irq))
366+
if (probe_setup_port(&probe_data, uart))
334367
return -ENODEV;
335368

336369
pdata = devm_kzalloc(uart->port.dev, sizeof(*pdata), GFP_KERNEL);

0 commit comments

Comments
 (0)