ihda: Use default connection for finding dac

This commit is contained in:
Jeremy Soller
2022-11-16 14:56:11 -07:00
parent 2564997cac
commit 304dcad78b
2 changed files with 30 additions and 22 deletions
+7 -19
View File
@@ -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<Vec<WidgetAddr>>{
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)
}
}
+23 -3
View File
@@ -32,6 +32,8 @@ pub struct HDANode {
pub connections: Vec<WidgetAddr>,
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::<WidgetAddr>::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
)
}
}
}