X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=drivers%2Fserial%2Fserial_uniphier.c;h=b06fc00f5f12348edc45f54be9a418029a24cc3f;hb=157736a9eee056ff5accf6d5665132efebf99332;hp=f21098607862062782bc61fc1fb9f234747ef582;hpb=43b1ff5f33456e85b2fccccaf2f9fe09821a45ac;p=u-boot diff --git a/drivers/serial/serial_uniphier.c b/drivers/serial/serial_uniphier.c index f210986078..b06fc00f5f 100644 --- a/drivers/serial/serial_uniphier.c +++ b/drivers/serial/serial_uniphier.c @@ -1,15 +1,16 @@ +// SPDX-License-Identifier: GPL-2.0+ /* - * Copyright (C) 2012-2015 Masahiro Yamada - * - * SPDX-License-Identifier: GPL-2.0+ + * Copyright (C) 2012-2015 Panasonic Corporation + * Copyright (C) 2015-2016 Socionext Inc. + * Author: Masahiro Yamada */ +#include +#include #include #include -#include -#include -#include -#include +#include +#include #include #include @@ -32,21 +33,22 @@ struct uniphier_serial { u32 dlr; /* Divisor Latch Register */ }; -struct uniphier_serial_private_data { +struct uniphier_serial_priv { struct uniphier_serial __iomem *membase; + unsigned int uartclk; }; #define uniphier_serial_port(dev) \ - ((struct uniphier_serial_private_data *)dev_get_priv(dev))->membase + ((struct uniphier_serial_priv *)dev_get_priv(dev))->membase static int uniphier_serial_setbrg(struct udevice *dev, int baudrate) { - struct uniphier_serial_platform_data *plat = dev_get_platdata(dev); + struct uniphier_serial_priv *priv = dev_get_priv(dev); struct uniphier_serial __iomem *port = uniphier_serial_port(dev); const unsigned int mode_x_div = 16; unsigned int divisor; - divisor = DIV_ROUND_CLOSEST(plat->uartclk, mode_x_div * baudrate); + divisor = DIV_ROUND_CLOSEST(priv->uartclk, mode_x_div * baudrate); writel(divisor, &port->dlr); @@ -87,17 +89,25 @@ static int uniphier_serial_pending(struct udevice *dev, bool input) static int uniphier_serial_probe(struct udevice *dev) { - u32 tmp; - struct uniphier_serial_private_data *priv = dev_get_priv(dev); - struct uniphier_serial_platform_data *plat = dev_get_platdata(dev); + DECLARE_GLOBAL_DATA_PTR; + struct uniphier_serial_priv *priv = dev_get_priv(dev); struct uniphier_serial __iomem *port; + fdt_addr_t base; + u32 tmp; - port = map_sysmem(plat->base, sizeof(struct uniphier_serial)); + base = devfdt_get_addr(dev); + if (base == FDT_ADDR_T_NONE) + return -EINVAL; + + port = devm_ioremap(dev, base, SZ_64); if (!port) return -ENOMEM; priv->membase = port; + priv->uartclk = fdtdec_get_int(gd->fdt_blob, dev_of_offset(dev), + "clock-frequency", 0); + tmp = readl(&port->lcr_mcr); tmp &= ~LCR_MASK; tmp |= UART_LCR_WLEN8 << LCR_SHIFT; @@ -106,32 +116,11 @@ static int uniphier_serial_probe(struct udevice *dev) return 0; } -static int uniphier_serial_remove(struct udevice *dev) -{ - unmap_sysmem(uniphier_serial_port(dev)); - - return 0; -} - -#ifdef CONFIG_OF_CONTROL static const struct udevice_id uniphier_uart_of_match[] = { { .compatible = "socionext,uniphier-uart" }, { /* sentinel */ } }; -static int uniphier_serial_ofdata_to_platdata(struct udevice *dev) -{ - struct uniphier_serial_platform_data *plat = dev_get_platdata(dev); - DECLARE_GLOBAL_DATA_PTR; - - plat->base = fdtdec_get_addr(gd->fdt_blob, dev->of_offset, "reg"); - plat->uartclk = fdtdec_get_int(gd->fdt_blob, dev->of_offset, - "clock-frequency", 0); - - return 0; -} -#endif - static const struct dm_serial_ops uniphier_serial_ops = { .setbrg = uniphier_serial_setbrg, .getc = uniphier_serial_getc, @@ -140,15 +129,10 @@ static const struct dm_serial_ops uniphier_serial_ops = { }; U_BOOT_DRIVER(uniphier_serial) = { - .name = DRIVER_NAME, + .name = "uniphier-uart", .id = UCLASS_SERIAL, - .of_match = of_match_ptr(uniphier_uart_of_match), - .ofdata_to_platdata = of_match_ptr(uniphier_serial_ofdata_to_platdata), + .of_match = uniphier_uart_of_match, .probe = uniphier_serial_probe, - .remove = uniphier_serial_remove, - .priv_auto_alloc_size = sizeof(struct uniphier_serial_private_data), - .platdata_auto_alloc_size = - sizeof(struct uniphier_serial_platform_data), + .priv_auto_alloc_size = sizeof(struct uniphier_serial_priv), .ops = &uniphier_serial_ops, - .flags = DM_FLAG_PRE_RELOC, };