lkml.org 
[lkml]   [2014]   [Aug]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [PATCH v3 1/2] tty: serial: 8250: Add Mediatek UART driver
On 2014-08-12 at 15:31:51 +0200, Matthias Brugger <matthias.bgg@gmail.com> wrote:
> 2014-08-08 14:28 GMT+02:00 Tobias Klauser <tklauser@distanz.ch>:
> > On 2014-08-08 at 13:32:03 +0200, Matthias Brugger <matthias.bgg@gmail.com> wrote:
> >> This patch adds support for the UART block found on Mediatek SoCs.
> >> The device has a highspeed register which influences the calcualtion of the
> >> divisor. The chip lacks support for some baudrates. When requested, we set the
> >> divisor to the next smaller baudrate and adjust the c_cflag accordingly.
> >>
> >> Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com>
> >> ---
> >> drivers/tty/serial/8250/8250_mtk.c | 296 ++++++++++++++++++++++++++++++++++++
> >> drivers/tty/serial/8250/Kconfig | 7 +
> >> drivers/tty/serial/8250/Makefile | 1 +
> >> 3 files changed, 304 insertions(+)
> >> create mode 100644 drivers/tty/serial/8250/8250_mtk.c
> >>
> >> diff --git a/drivers/tty/serial/8250/8250_mtk.c b/drivers/tty/serial/8250/8250_mtk.c
> >> new file mode 100644
> >> index 0000000..d63080b
> >> --- /dev/null
> >> +++ b/drivers/tty/serial/8250/8250_mtk.c
> >> @@ -0,0 +1,296 @@
> >
> > [...]
> >
> >> +static int mtk8250_probe(struct platform_device *pdev)
> >> +{
> >> + struct uart_8250_port uart = {};
> >> + struct resource *regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> >> + struct resource *irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
> >> + struct mtk8250_data *data;
> >> + int err;
> >> +
> >> + if (!regs || !irq) {
> >> + dev_err(&pdev->dev, "no registers/irq defined\n");
> >> + return -EINVAL;
> >> + }
> >> +
> >> + spin_lock_init(&uart.port.lock);
> >> + uart.port.mapbase = regs->start;
> >> + uart.port.irq = irq->start;
> >> + uart.port.pm = mtk8250_do_pm;
> >> + uart.port.type = PORT_16550;
> >> + uart.port.flags = UPF_BOOT_AUTOCONF | UPF_FIXED_PORT;
> >> + uart.port.dev = &pdev->dev;
> >> +
> >> + uart.port.membase = devm_ioremap(&pdev->dev, regs->start,
> >> + resource_size(regs));
> >> + if (!uart.port.membase)
> >> + return -ENOMEM;
> >
> > You can use devm_ioremap_resource here and get rid of the check for
> > !regs above, since devm_ioremap_resource already does that.
> >
> > regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> >
> > ...
> >
> > uart.port.membase = devm_ioremap_resource(&pdev->dev, regs);
> > if (IS_ERR(uart.port.membase))
> > return PTR_ERR(uart.port.membase);
> >
>
> devm_ioremap_resource creates a busy resource region in the
> iomem_resource. This leads the UART to silently fail.
> I suppose that's why 8250_dw.c uses devm_ioremap instead of
> devm_ioremap_resource. The 8250_dw has the same issue.

Ah yes, of course. Sorry about that.

Thanks
Tobias


\
 
 \ /
  Last update: 2014-08-12 16:01    [W:0.075 / U:0.024 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site