1
0
mirror of https://xff.cz/git/u-boot/ synced 2025-09-01 08:42:12 +02:00
- Handle errors in Meson serial driver
- Enable HDMI, keyboard and ADC for Odroid-C2
This commit is contained in:
Tom Rini
2020-07-27 21:40:26 -04:00
2 changed files with 50 additions and 4 deletions

View File

@@ -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."

View File

@@ -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)