2 * 8250_mid.c - Driver for UART on Intel Penwell and various other Intel SOCs
4 * Copyright (C) 2015 Intel Corporation
5 * Author: Heikki Krogerus <heikki.krogerus@linux.intel.com>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
12 #include <linux/rational.h>
13 #include <linux/module.h>
14 #include <linux/pci.h>
16 #include <linux/dma/hsu.h>
17 #include <linux/8250_pci.h>
21 #define PCI_DEVICE_ID_INTEL_PNW_UART1 0x081b
22 #define PCI_DEVICE_ID_INTEL_PNW_UART2 0x081c
23 #define PCI_DEVICE_ID_INTEL_PNW_UART3 0x081d
24 #define PCI_DEVICE_ID_INTEL_TNG_UART 0x1191
25 #define PCI_DEVICE_ID_INTEL_DNV_UART 0x19d8
27 /* Intel MID Specific registers */
28 #define INTEL_MID_UART_DNV_FISR 0x08
29 #define INTEL_MID_UART_PS 0x30
30 #define INTEL_MID_UART_MUL 0x34
31 #define INTEL_MID_UART_DIV 0x38
35 struct mid8250_board
{
38 unsigned int base_baud
;
39 int (*setup
)(struct mid8250
*, struct uart_port
*p
);
40 void (*exit
)(struct mid8250
*);
46 struct pci_dev
*dma_dev
;
47 struct uart_8250_dma dma
;
48 struct mid8250_board
*board
;
49 struct hsu_dma_chip dma_chip
;
52 /*****************************************************************************/
54 static int pnw_setup(struct mid8250
*mid
, struct uart_port
*p
)
56 struct pci_dev
*pdev
= to_pci_dev(p
->dev
);
58 switch (pdev
->device
) {
59 case PCI_DEVICE_ID_INTEL_PNW_UART1
:
62 case PCI_DEVICE_ID_INTEL_PNW_UART2
:
65 case PCI_DEVICE_ID_INTEL_PNW_UART3
:
72 mid
->dma_dev
= pci_get_slot(pdev
->bus
,
73 PCI_DEVFN(PCI_SLOT(pdev
->devfn
), 3));
77 static int tng_setup(struct mid8250
*mid
, struct uart_port
*p
)
79 struct pci_dev
*pdev
= to_pci_dev(p
->dev
);
80 int index
= PCI_FUNC(pdev
->devfn
);
82 /* Currently no support for HSU port0 */
86 mid
->dma_index
= index
;
87 mid
->dma_dev
= pci_get_slot(pdev
->bus
, PCI_DEVFN(5, 0));
91 static int dnv_handle_irq(struct uart_port
*p
)
93 struct mid8250
*mid
= p
->private_data
;
94 unsigned int fisr
= serial_port_in(p
, INTEL_MID_UART_DNV_FISR
);
98 ret
|= hsu_dma_irq(&mid
->dma_chip
, 1);
100 ret
|= hsu_dma_irq(&mid
->dma_chip
, 0);
102 ret
|= serial8250_handle_irq(p
, serial_port_in(p
, UART_IIR
));
106 #define DNV_DMA_CHAN_OFFSET 0x80
108 static int dnv_setup(struct mid8250
*mid
, struct uart_port
*p
)
110 struct hsu_dma_chip
*chip
= &mid
->dma_chip
;
111 struct pci_dev
*pdev
= to_pci_dev(p
->dev
);
112 unsigned int bar
= FL_GET_BASE(mid
->board
->flags
);
115 chip
->dev
= &pdev
->dev
;
116 chip
->irq
= pdev
->irq
;
117 chip
->regs
= p
->membase
;
118 chip
->length
= pci_resource_len(pdev
, bar
);
119 chip
->offset
= DNV_DMA_CHAN_OFFSET
;
121 /* Falling back to PIO mode if DMA probing fails */
122 ret
= hsu_dma_probe(chip
);
128 p
->handle_irq
= dnv_handle_irq
;
132 static void dnv_exit(struct mid8250
*mid
)
136 hsu_dma_remove(&mid
->dma_chip
);
139 /*****************************************************************************/
141 static void mid8250_set_termios(struct uart_port
*p
,
142 struct ktermios
*termios
,
143 struct ktermios
*old
)
145 unsigned int baud
= tty_termios_baud_rate(termios
);
146 struct mid8250
*mid
= p
->private_data
;
147 unsigned short ps
= 16;
148 unsigned long fuart
= baud
* ps
;
149 unsigned long w
= BIT(24) - 1;
150 unsigned long mul
, div
;
152 if (mid
->board
->freq
< fuart
) {
153 /* Find prescaler value that satisfies Fuart < Fref */
154 if (mid
->board
->freq
> baud
)
155 ps
= mid
->board
->freq
/ baud
; /* baud rate too high */
157 ps
= 1; /* PLL case */
160 /* Get Fuart closer to Fref */
161 fuart
*= rounddown_pow_of_two(mid
->board
->freq
/ fuart
);
164 rational_best_approximation(fuart
, mid
->board
->freq
, w
, w
, &mul
, &div
);
165 p
->uartclk
= fuart
* 16 / ps
; /* core uses ps = 16 always */
167 writel(ps
, p
->membase
+ INTEL_MID_UART_PS
); /* set PS */
168 writel(mul
, p
->membase
+ INTEL_MID_UART_MUL
); /* set MUL */
169 writel(div
, p
->membase
+ INTEL_MID_UART_DIV
);
171 serial8250_do_set_termios(p
, termios
, old
);
174 static bool mid8250_dma_filter(struct dma_chan
*chan
, void *param
)
176 struct hsu_dma_slave
*s
= param
;
178 if (s
->dma_dev
!= chan
->device
->dev
|| s
->chan_id
!= chan
->chan_id
)
185 static int mid8250_dma_setup(struct mid8250
*mid
, struct uart_8250_port
*port
)
187 struct uart_8250_dma
*dma
= &mid
->dma
;
188 struct device
*dev
= port
->port
.dev
;
189 struct hsu_dma_slave
*rx_param
;
190 struct hsu_dma_slave
*tx_param
;
195 rx_param
= devm_kzalloc(dev
, sizeof(*rx_param
), GFP_KERNEL
);
199 tx_param
= devm_kzalloc(dev
, sizeof(*tx_param
), GFP_KERNEL
);
203 rx_param
->chan_id
= mid
->dma_index
* 2 + 1;
204 tx_param
->chan_id
= mid
->dma_index
* 2;
206 dma
->rxconf
.src_maxburst
= 64;
207 dma
->txconf
.dst_maxburst
= 64;
209 rx_param
->dma_dev
= &mid
->dma_dev
->dev
;
210 tx_param
->dma_dev
= &mid
->dma_dev
->dev
;
212 dma
->fn
= mid8250_dma_filter
;
213 dma
->rx_param
= rx_param
;
214 dma
->tx_param
= tx_param
;
220 static int mid8250_probe(struct pci_dev
*pdev
, const struct pci_device_id
*id
)
222 struct uart_8250_port uart
;
227 ret
= pcim_enable_device(pdev
);
231 pci_set_master(pdev
);
233 mid
= devm_kzalloc(&pdev
->dev
, sizeof(*mid
), GFP_KERNEL
);
237 mid
->board
= (struct mid8250_board
*)id
->driver_data
;
238 bar
= FL_GET_BASE(mid
->board
->flags
);
240 memset(&uart
, 0, sizeof(struct uart_8250_port
));
242 uart
.port
.dev
= &pdev
->dev
;
243 uart
.port
.irq
= pdev
->irq
;
244 uart
.port
.private_data
= mid
;
245 uart
.port
.type
= PORT_16750
;
246 uart
.port
.iotype
= UPIO_MEM
;
247 uart
.port
.uartclk
= mid
->board
->base_baud
* 16;
248 uart
.port
.flags
= UPF_SHARE_IRQ
| UPF_FIXED_PORT
| UPF_FIXED_TYPE
;
249 uart
.port
.set_termios
= mid8250_set_termios
;
251 uart
.port
.mapbase
= pci_resource_start(pdev
, bar
);
252 uart
.port
.membase
= pcim_iomap(pdev
, bar
, 0);
253 if (!uart
.port
.membase
)
256 if (mid
->board
->setup
) {
257 ret
= mid
->board
->setup(mid
, &uart
.port
);
262 ret
= mid8250_dma_setup(mid
, &uart
);
266 ret
= serial8250_register_8250_port(&uart
);
272 pci_set_drvdata(pdev
, mid
);
275 if (mid
->board
->exit
)
276 mid
->board
->exit(mid
);
280 static void mid8250_remove(struct pci_dev
*pdev
)
282 struct mid8250
*mid
= pci_get_drvdata(pdev
);
284 if (mid
->board
->exit
)
285 mid
->board
->exit(mid
);
287 serial8250_unregister_port(mid
->line
);
290 static const struct mid8250_board pnw_board
= {
297 static const struct mid8250_board tng_board
= {
300 .base_baud
= 1843200,
304 static const struct mid8250_board dnv_board
= {
312 #define MID_DEVICE(id, board) { PCI_VDEVICE(INTEL, id), (kernel_ulong_t)&board }
314 static const struct pci_device_id pci_ids
[] = {
315 MID_DEVICE(PCI_DEVICE_ID_INTEL_PNW_UART1
, pnw_board
),
316 MID_DEVICE(PCI_DEVICE_ID_INTEL_PNW_UART2
, pnw_board
),
317 MID_DEVICE(PCI_DEVICE_ID_INTEL_PNW_UART3
, pnw_board
),
318 MID_DEVICE(PCI_DEVICE_ID_INTEL_TNG_UART
, tng_board
),
319 MID_DEVICE(PCI_DEVICE_ID_INTEL_DNV_UART
, dnv_board
),
322 MODULE_DEVICE_TABLE(pci
, pci_ids
);
324 static struct pci_driver mid8250_pci_driver
= {
327 .probe
= mid8250_probe
,
328 .remove
= mid8250_remove
,
331 module_pci_driver(mid8250_pci_driver
);
333 MODULE_AUTHOR("Intel Corporation");
334 MODULE_LICENSE("GPL v2");
335 MODULE_DESCRIPTION("Intel MID UART driver");