Commit 3c5dafe43d1e36b70606d3baef8d7f24c0883343

Authored by Andy Shevchenko
Committed by Greg Kroah-Hartman
1 parent 1401ebda89

serial: 8250_mid: use proper bar for DNV platform

commit 107e15fc1f8d6ef69eac5f175971252f76e82f0d upstream.

Unlike Intel Medfield and Tangier platforms DNV uses PCI BAR0 for IO compatible
resources and BAR1 for MMIO. We need latter in a way to support DMA. Introduce
an additional field in the internal structure and pass PCI BAR based on device
ID.

Reported-by: "Lai, Poey Seng" <poey.seng.lai@intel.com>
Fixes: 6ede6dcd87aa ("serial: 8250_mid: add support for DMA engine handling from UART MMIO")
Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

Showing 1 changed file with 11 additions and 3 deletions Side-by-side Diff

drivers/tty/serial/8250/8250_mid.c
... ... @@ -14,6 +14,7 @@
14 14 #include <linux/pci.h>
15 15  
16 16 #include <linux/dma/hsu.h>
  17 +#include <linux/8250_pci.h>
17 18  
18 19 #include "8250.h"
19 20  
... ... @@ -31,6 +32,7 @@
31 32 struct mid8250;
32 33  
33 34 struct mid8250_board {
  35 + unsigned int flags;
34 36 unsigned long freq;
35 37 unsigned int base_baud;
36 38 int (*setup)(struct mid8250 *, struct uart_port *p);
37 39  
... ... @@ -106,12 +108,13 @@
106 108 {
107 109 struct hsu_dma_chip *chip = &mid->dma_chip;
108 110 struct pci_dev *pdev = to_pci_dev(p->dev);
  111 + unsigned int bar = FL_GET_BASE(mid->board->flags);
109 112 int ret;
110 113  
111 114 chip->dev = &pdev->dev;
112 115 chip->irq = pdev->irq;
113 116 chip->regs = p->membase;
114   - chip->length = pci_resource_len(pdev, 0);
  117 + chip->length = pci_resource_len(pdev, bar);
115 118 chip->offset = DNV_DMA_CHAN_OFFSET;
116 119  
117 120 /* Falling back to PIO mode if DMA probing fails */
... ... @@ -217,6 +220,7 @@
217 220 {
218 221 struct uart_8250_port uart;
219 222 struct mid8250 *mid;
  223 + unsigned int bar;
220 224 int ret;
221 225  
222 226 ret = pcim_enable_device(pdev);
... ... @@ -230,6 +234,7 @@
230 234 return -ENOMEM;
231 235  
232 236 mid->board = (struct mid8250_board *)id->driver_data;
  237 + bar = FL_GET_BASE(mid->board->flags);
233 238  
234 239 memset(&uart, 0, sizeof(struct uart_8250_port));
235 240  
... ... @@ -242,8 +247,8 @@
242 247 uart.port.flags = UPF_SHARE_IRQ | UPF_FIXED_PORT | UPF_FIXED_TYPE;
243 248 uart.port.set_termios = mid8250_set_termios;
244 249  
245   - uart.port.mapbase = pci_resource_start(pdev, 0);
246   - uart.port.membase = pcim_iomap(pdev, 0, 0);
  250 + uart.port.mapbase = pci_resource_start(pdev, bar);
  251 + uart.port.membase = pcim_iomap(pdev, bar, 0);
247 252 if (!uart.port.membase)
248 253 return -ENOMEM;
249 254  
250 255  
251 256  
... ... @@ -282,18 +287,21 @@
282 287 }
283 288  
284 289 static const struct mid8250_board pnw_board = {
  290 + .flags = FL_BASE0,
285 291 .freq = 50000000,
286 292 .base_baud = 115200,
287 293 .setup = pnw_setup,
288 294 };
289 295  
290 296 static const struct mid8250_board tng_board = {
  297 + .flags = FL_BASE0,
291 298 .freq = 38400000,
292 299 .base_baud = 1843200,
293 300 .setup = tng_setup,
294 301 };
295 302  
296 303 static const struct mid8250_board dnv_board = {
  304 + .flags = FL_BASE1,
297 305 .freq = 133333333,
298 306 .base_baud = 115200,
299 307 .setup = dnv_setup,