diff options
author | Andy Shevchenko <andriy.shevchenko@linux.intel.com> | 2016-04-04 10:35:09 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2016-04-30 12:26:55 -0400 |
commit | 107e15fc1f8d6ef69eac5f175971252f76e82f0d (patch) | |
tree | 7b99ffdc1e6cd95024ceb6de77764b370849424b /drivers/tty/serial/8250 | |
parent | c2684ed7d0e908e7c8dad7f199922d342ea55c66 (diff) |
serial: 8250_mid: use proper bar for DNV platform
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")
Cc: stable@vger.kernel.org
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>
Diffstat (limited to 'drivers/tty/serial/8250')
-rw-r--r-- | drivers/tty/serial/8250/8250_mid.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/drivers/tty/serial/8250/8250_mid.c b/drivers/tty/serial/8250/8250_mid.c index 88531a36b69c..7aa6ef81ca93 100644 --- a/drivers/tty/serial/8250/8250_mid.c +++ b/drivers/tty/serial/8250/8250_mid.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/pci.h> | 14 | #include <linux/pci.h> |
15 | 15 | ||
16 | #include <linux/dma/hsu.h> | 16 | #include <linux/dma/hsu.h> |
17 | #include <linux/8250_pci.h> | ||
17 | 18 | ||
18 | #include "8250.h" | 19 | #include "8250.h" |
19 | 20 | ||
@@ -31,6 +32,7 @@ | |||
31 | struct mid8250; | 32 | struct mid8250; |
32 | 33 | ||
33 | struct mid8250_board { | 34 | struct mid8250_board { |
35 | unsigned int flags; | ||
34 | unsigned long freq; | 36 | unsigned long freq; |
35 | unsigned int base_baud; | 37 | unsigned int base_baud; |
36 | int (*setup)(struct mid8250 *, struct uart_port *p); | 38 | int (*setup)(struct mid8250 *, struct uart_port *p); |
@@ -106,12 +108,13 @@ static int dnv_setup(struct mid8250 *mid, struct uart_port *p) | |||
106 | { | 108 | { |
107 | struct hsu_dma_chip *chip = &mid->dma_chip; | 109 | struct hsu_dma_chip *chip = &mid->dma_chip; |
108 | struct pci_dev *pdev = to_pci_dev(p->dev); | 110 | struct pci_dev *pdev = to_pci_dev(p->dev); |
111 | unsigned int bar = FL_GET_BASE(mid->board->flags); | ||
109 | int ret; | 112 | int ret; |
110 | 113 | ||
111 | chip->dev = &pdev->dev; | 114 | chip->dev = &pdev->dev; |
112 | chip->irq = pdev->irq; | 115 | chip->irq = pdev->irq; |
113 | chip->regs = p->membase; | 116 | chip->regs = p->membase; |
114 | chip->length = pci_resource_len(pdev, 0); | 117 | chip->length = pci_resource_len(pdev, bar); |
115 | chip->offset = DNV_DMA_CHAN_OFFSET; | 118 | chip->offset = DNV_DMA_CHAN_OFFSET; |
116 | 119 | ||
117 | /* Falling back to PIO mode if DMA probing fails */ | 120 | /* Falling back to PIO mode if DMA probing fails */ |
@@ -217,6 +220,7 @@ static int mid8250_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
217 | { | 220 | { |
218 | struct uart_8250_port uart; | 221 | struct uart_8250_port uart; |
219 | struct mid8250 *mid; | 222 | struct mid8250 *mid; |
223 | unsigned int bar; | ||
220 | int ret; | 224 | int ret; |
221 | 225 | ||
222 | ret = pcim_enable_device(pdev); | 226 | ret = pcim_enable_device(pdev); |
@@ -230,6 +234,7 @@ static int mid8250_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
230 | return -ENOMEM; | 234 | return -ENOMEM; |
231 | 235 | ||
232 | mid->board = (struct mid8250_board *)id->driver_data; | 236 | mid->board = (struct mid8250_board *)id->driver_data; |
237 | bar = FL_GET_BASE(mid->board->flags); | ||
233 | 238 | ||
234 | memset(&uart, 0, sizeof(struct uart_8250_port)); | 239 | memset(&uart, 0, sizeof(struct uart_8250_port)); |
235 | 240 | ||
@@ -242,8 +247,8 @@ static int mid8250_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
242 | uart.port.flags = UPF_SHARE_IRQ | UPF_FIXED_PORT | UPF_FIXED_TYPE; | 247 | uart.port.flags = UPF_SHARE_IRQ | UPF_FIXED_PORT | UPF_FIXED_TYPE; |
243 | uart.port.set_termios = mid8250_set_termios; | 248 | uart.port.set_termios = mid8250_set_termios; |
244 | 249 | ||
245 | uart.port.mapbase = pci_resource_start(pdev, 0); | 250 | uart.port.mapbase = pci_resource_start(pdev, bar); |
246 | uart.port.membase = pcim_iomap(pdev, 0, 0); | 251 | uart.port.membase = pcim_iomap(pdev, bar, 0); |
247 | if (!uart.port.membase) | 252 | if (!uart.port.membase) |
248 | return -ENOMEM; | 253 | return -ENOMEM; |
249 | 254 | ||
@@ -282,18 +287,21 @@ static void mid8250_remove(struct pci_dev *pdev) | |||
282 | } | 287 | } |
283 | 288 | ||
284 | static const struct mid8250_board pnw_board = { | 289 | static const struct mid8250_board pnw_board = { |
290 | .flags = FL_BASE0, | ||
285 | .freq = 50000000, | 291 | .freq = 50000000, |
286 | .base_baud = 115200, | 292 | .base_baud = 115200, |
287 | .setup = pnw_setup, | 293 | .setup = pnw_setup, |
288 | }; | 294 | }; |
289 | 295 | ||
290 | static const struct mid8250_board tng_board = { | 296 | static const struct mid8250_board tng_board = { |
297 | .flags = FL_BASE0, | ||
291 | .freq = 38400000, | 298 | .freq = 38400000, |
292 | .base_baud = 1843200, | 299 | .base_baud = 1843200, |
293 | .setup = tng_setup, | 300 | .setup = tng_setup, |
294 | }; | 301 | }; |
295 | 302 | ||
296 | static const struct mid8250_board dnv_board = { | 303 | static const struct mid8250_board dnv_board = { |
304 | .flags = FL_BASE1, | ||
297 | .freq = 133333333, | 305 | .freq = 133333333, |
298 | .base_baud = 115200, | 306 | .base_baud = 115200, |
299 | .setup = dnv_setup, | 307 | .setup = dnv_setup, |