aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/tty/serial/8250
diff options
context:
space:
mode:
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>2016-04-04 10:35:09 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2016-04-30 12:26:55 -0400
commit107e15fc1f8d6ef69eac5f175971252f76e82f0d (patch)
tree7b99ffdc1e6cd95024ceb6de77764b370849424b /drivers/tty/serial/8250
parentc2684ed7d0e908e7c8dad7f199922d342ea55c66 (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.c14
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 @@
31struct mid8250; 32struct mid8250;
32 33
33struct mid8250_board { 34struct 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
284static const struct mid8250_board pnw_board = { 289static 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
290static const struct mid8250_board tng_board = { 296static 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
296static const struct mid8250_board dnv_board = { 303static 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,