From 304dcad78bd65c922d0656a24d5e3857c6a6affc Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Wed, 16 Nov 2022 14:56:11 -0700 Subject: [PATCH] ihda: Use default connection for finding dac --- ihdad/src/hda/device.rs | 26 +++++++------------------- ihdad/src/hda/node.rs | 26 +++++++++++++++++++++++--- 2 files changed, 30 insertions(+), 22 deletions(-) diff --git a/ihdad/src/hda/device.rs b/ihdad/src/hda/device.rs index 07e6d92cc5..a137623bf5 100755 --- a/ihdad/src/hda/device.rs +++ b/ihdad/src/hda/device.rs @@ -268,13 +268,13 @@ impl IntelHDA { temp = self.cmd.cmd12(addr, 0xF00, 0x09); node.capabilities = temp as u32; - temp = self.cmd.cmd12(addr, 0xF00, 0x0E); node.conn_list_len = (temp & 0xFF) as u8; node.connections = self.node_get_connection_list(&node); + node.connection_default = self.cmd.cmd12(addr, 0xF01, 0x00) as u8; node.config_default = self.cmd.cmd12(addr, 0xF1C, 0x00) as u32; @@ -408,24 +408,12 @@ impl IntelHDA { pub fn find_path_to_dac(&self, addr: WidgetAddr) -> Option>{ let widget = self.widget_map.get(&addr).unwrap(); if widget.widget_type() == HDAWidgetType::AudioOutput { - return Some(vec![addr]); - }else{ - if widget.connections.len() == 0 { - return None; - }else{ - // TODO: do more than just first widget - - let res = self.find_path_to_dac(widget.connections[0]); - match res { - Some(p) => { - let mut ret = p.clone(); - ret.insert(0, addr); - Some(ret) - }, - None => {None}, - } - } - + Some(vec![addr]) + } else { + let connection = widget.connections.get(widget.connection_default as usize)?; + let mut path = self.find_path_to_dac(*connection)?; + path.insert(0, addr); + Some(path) } } diff --git a/ihdad/src/hda/node.rs b/ihdad/src/hda/node.rs index b659c3b4ce..4c1238c50a 100644 --- a/ihdad/src/hda/node.rs +++ b/ihdad/src/hda/node.rs @@ -32,6 +32,8 @@ pub struct HDANode { pub connections: Vec, + pub connection_default: u8, + pub is_widget: bool, pub config_default: u32, @@ -54,6 +56,7 @@ impl HDANode { config_default: 0, is_widget: false, connections: Vec::::new(), + connection_default: 0, } } @@ -87,18 +90,35 @@ impl fmt::Display for HDANode { match self.widget_type() { HDAWidgetType::PinComplex => write!( f, - "Addr: {:02X}:{:02X}, Type: {:?}: {:?}, Inputs: {:X}: {:X?}.", + "Addr: {:02X}:{:02X}, Type: {:?}: {:?}, Inputs: {}/{}: {:X?}.", self.addr.0, self.addr.1, self.widget_type(), self.device_default().unwrap(), + self.connection_default, + self.conn_list_len, + self.connections + ), + _ => write!( + f, + "Addr: {:02X}:{:02X}, Type: {:?}, Inputs: {}/{}: {:X?}.", + self.addr.0, + self.addr.1, + self.widget_type(), + self.connection_default, self.conn_list_len, self.connections ), - _ => write!(f, "Addr: {:02X}:{:02X}, Type: {:?}, Inputs: {:X}: {:X?}.", self.addr.0, self.addr.1, self.widget_type(), self.conn_list_len, self.connections), } } else { - write!(f, "Addr: {:02X}:{:02X}, AFG: {}, Widget count {}.", self.addr.0, self.addr.1, self.function_group_type, self.subnode_count) + write!( + f, + "Addr: {:02X}:{:02X}, AFG: {}, Widget count {}.", + self.addr.0, + self.addr.1, + self.function_group_type, + self.subnode_count + ) } } }