From: Tom Rini Date: Tue, 28 Jul 2020 01:40:26 +0000 (-0400) Subject: Merge tag 'u-boot-amlogic-20200727' of https://gitlab.denx.de/u-boot/custodians/u... X-Git-Tag: v2020.10~95 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6b7937821dfdd53a7a733b3f723de1d84500247d;hp=8d1fc6fb89826efb6bbbedb57862496e18737877;p=platform%2Fkernel%2Fu-boot.git Merge tag 'u-boot-amlogic-20200727' of https://gitlab.denx.de/u-boot/custodians/u-boot-amlogic - Handle errors in Meson serial driver - Enable HDMI, keyboard and ADC for Odroid-C2 --- diff --git a/configs/odroid-c2_defconfig b/configs/odroid-c2_defconfig index f62e83a..c80719a 100644 --- a/configs/odroid-c2_defconfig +++ b/configs/odroid-c2_defconfig @@ -15,6 +15,7 @@ CONFIG_MISC_INIT_R=y # CONFIG_DISPLAY_CPUINFO is not set # CONFIG_CMD_BDI is not set # CONFIG_CMD_IMI is not set +CONFIG_CMD_ADC=y CONFIG_CMD_GPIO=y CONFIG_CMD_I2C=y # CONFIG_CMD_LOADS is not set @@ -26,6 +27,7 @@ CONFIG_OF_CONTROL=y CONFIG_DEFAULT_DEVICE_TREE="meson-gxbb-odroidc2" CONFIG_SYS_RELOC_GD_ENV_ADDR=y CONFIG_NET_RANDOM_ETHADDR=y +CONFIG_SARADC_MESON=y CONFIG_DM_I2C=y CONFIG_SYS_I2C_MESON=y CONFIG_DM_MMC=y @@ -38,6 +40,8 @@ CONFIG_MESON_GXBB_USB_PHY=y CONFIG_PINCTRL=y CONFIG_PINCTRL_MESON_GXBB=y CONFIG_DM_REGULATOR=y +CONFIG_POWER_DOMAIN=y +CONFIG_MESON_GX_VPU_POWER_DOMAIN=y CONFIG_DM_REGULATOR_FIXED=y CONFIG_DM_REGULATOR_GPIO=y CONFIG_DM_RESET=y @@ -47,5 +51,12 @@ CONFIG_MESON_SERIAL=y CONFIG_USB=y CONFIG_DM_USB=y CONFIG_USB_DWC2=y +CONFIG_USB_KEYBOARD=y +CONFIG_DM_VIDEO=y +# CONFIG_VIDEO_BPP8 is not set +# CONFIG_VIDEO_BPP16 is not set +CONFIG_SYS_WHITE_ON_BLACK=y +CONFIG_VIDEO_MESON=y +CONFIG_VIDEO_DT_SIMPLEFB=y CONFIG_OF_LIBFDT_OVERLAY=y CONFIG_SMBIOS_MANUFACTURER="Hardkernel Co., Ltd." diff --git a/drivers/serial/serial_meson.c b/drivers/serial/serial_meson.c index 8cf849f..496a2ca 100644 --- a/drivers/serial/serial_meson.c +++ b/drivers/serial/serial_meson.c @@ -65,14 +65,36 @@ static int meson_serial_probe(struct udevice *dev) return 0; } +static void meson_serial_rx_error(struct udevice *dev) +{ + struct meson_serial_platdata *plat = dev->platdata; + struct meson_uart *const uart = plat->reg; + u32 val = readl(&uart->control); + + /* Clear error */ + val |= AML_UART_CLR_ERR; + writel(val, &uart->control); + val &= ~AML_UART_CLR_ERR; + writel(val, &uart->control); + + /* Remove spurious byte from fifo */ + readl(&uart->rfifo); +} + static int meson_serial_getc(struct udevice *dev) { struct meson_serial_platdata *plat = dev->platdata; struct meson_uart *const uart = plat->reg; + uint32_t status = readl(&uart->status); - if (readl(&uart->status) & AML_UART_RX_EMPTY) + if (status & AML_UART_RX_EMPTY) return -EAGAIN; + if (status & AML_UART_ERR) { + meson_serial_rx_error(dev); + return -EIO; + } + return readl(&uart->rfifo) & 0xff; } @@ -95,10 +117,23 @@ static int meson_serial_pending(struct udevice *dev, bool input) struct meson_uart *const uart = plat->reg; uint32_t status = readl(&uart->status); - if (input) - return !(status & AML_UART_RX_EMPTY); - else + if (input) { + if (status & AML_UART_RX_EMPTY) + return false; + + /* + * Handle and drop any RX error here to avoid + * returning true here when an error byte is in the FIFO + */ + if (status & AML_UART_ERR) { + meson_serial_rx_error(dev); + return false; + } + + return true; + } else { return !(status & AML_UART_TX_FULL); + } } static int meson_serial_ofdata_to_platdata(struct udevice *dev)