[U-Boot] [PATCH 4/5] x86: Support PCI UART in the x86_serial driver
Simon Glass
sjg at chromium.org
Fri Dec 19 22:52:27 CET 2014
Hi BIn,
On 19 December 2014 at 00:19, Bin Meng <bmeng.cn at gmail.com> wrote:
> Newer x86 Platform Controller Hub chipset starts to integrate NS16550
> compatible PCI UART devices. The board configuration file needs to
> supply the PCI UART vendor ID and device ID via CONFIG_PCI_UART_DEV
> if we want to use the PCI UART as the U-Boot serial console.
>
> Signed-off-by: Bin Meng <bmeng.cn at gmail.com>
> ---
>
> drivers/serial/serial_x86.c | 30 ++++++++++++++++++++++++++++++
> 1 file changed, 30 insertions(+)
>
> diff --git a/drivers/serial/serial_x86.c b/drivers/serial/serial_x86.c
> index e81e035..7ddd596 100644
> --- a/drivers/serial/serial_x86.c
> +++ b/drivers/serial/serial_x86.c
> @@ -8,6 +8,17 @@
> #include <dm.h>
> #include <ns16550.h>
> #include <serial.h>
> +#include <asm/pci.h>
> +#include <errno.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +#ifdef CONFIG_PCI_UART
> +static struct pci_device_id uart_supported[] = {
> + CONFIG_PCI_UART_DEV,
> + { }
> +};
> +#endif
>
> static const struct udevice_id x86_serial_ids[] = {
> { .compatible = "x86-uart" },
> @@ -17,6 +28,9 @@ static const struct udevice_id x86_serial_ids[] = {
> static int x86_serial_ofdata_to_platdata(struct udevice *dev)
> {
> struct ns16550_platdata *plat = dev_get_platdata(dev);
> +#ifdef CONFIG_PCI_UART
> + pci_dev_t devbusfn;
> +#endif
> int ret;
>
> ret = ns16550_serial_ofdata_to_platdata(dev);
> @@ -24,6 +38,22 @@ static int x86_serial_ofdata_to_platdata(struct udevice *dev)
> return ret;
> plat->clock = 1843200;
>
> +#ifdef CONFIG_PCI_UART
> + /*
> + * Newer x86 Platform Controller Hub chipset starts to integrate
> + * NS16550 compatible PCI UART devices. The board configuration
> + * file needs to supply the PCI UART vendor ID and device ID via
> + * CONFIG_PCI_UART_DEV if we want to use the PCI UART as the U-Boot
> + * serial console.
> + */
> + devbusfn = pci_early_find_devices(uart_supported, 0);
> + if (devbusfn == -1)
> + return -ENODEV;
I'm not sure why we need this. Is it because we don't know the device
address of the UART?
> +
> + /* override the register base here for PCI UART */
> + plat->base = pci_read_bar32(gd->arch.hose, devbusfn, 0);
> +#endif
> +
> return 0;
> }
> U_BOOT_DRIVER(serial_ns16550) = {
> --
> 1.8.2.1
>
Regards,
Simon
More information about the U-Boot
mailing list