diff --git a/kernel/driver/serial/uart8250/src/fdt.rs b/kernel/driver/serial/uart8250/src/fdt.rs index a8a85d21..4e63b70b 100644 --- a/kernel/driver/serial/uart8250/src/fdt.rs +++ b/kernel/driver/serial/uart8250/src/fdt.rs @@ -135,12 +135,14 @@ impl Config for Fdt8250Config { impl Fdt8250Config { fn from_device_tree(node: &Arc, context: &mut ProbeContext) -> Option<(Self, Vendor)> { - let vendor = if node.is_compatible("snps,dw-apb-uart") { - Vendor::DwApbUart + let (vendor, reg_io_width, reg_shift) = if node.is_compatible("snps,dw-apb-uart") { + (Vendor::DwApbUart, 1, 0) } else if node.is_compatible("ns16550a") { - Vendor::Generic16550 + (Vendor::Generic16550, 1, 0) + } else if node.is_compatible("brcm,bcm2835-aux-uart") { + (Vendor::Generic8250, 4, 2) } else { - Vendor::Generic8250 + (Vendor::Generic8250, 1, 0) }; let base = node.map_base(context, 0)?; @@ -155,9 +157,9 @@ impl Fdt8250Config { clk_baud = node.clock(0); } - let reg_io_width = node.prop_usize("reg-io-width").unwrap_or(4); + let reg_io_width = node.prop_usize("reg-io-width").unwrap_or(reg_io_width); + let reg_shift = node.prop_usize("reg-shift").unwrap_or(reg_shift); let reg_offset = node.prop_usize("reg-offset").unwrap_or(0); - let reg_shift = node.prop_usize("reg-shift").unwrap_or(2); Some(( Self {