detect fan type by matching against 'compatible' Switches fan-type detection to key off well-known 'compatible' strings, as documented @ https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/devicetree/bindings/hwmon/ Change was created in response to the comment: "I'd much prefer we query compatible attribute through the of_node symlink" as discussed with Andrew J. and Ed T. in the gerrit review @ https://gerrit.openbmc.org/c/openbmc/dbus-sensors/+/58458 Tested: confirmed fans appear in WebUI only when valid 'compatible' strings are found Change-Id: Ifae4abc64288e84023c045fc8b2c7a4f0d1b8498 Signed-off-by: Chris Sides <christopher.sides@hpe.com>
diff --git a/src/FanMain.cpp b/src/FanMain.cpp index 5042fb6..6dccee5 100644 --- a/src/FanMain.cpp +++ b/src/FanMain.cpp
@@ -64,17 +64,35 @@ FanTypes getFanType(const fs::path& parentPath) { - fs::path linkPath = parentPath / "device"; - std::string canonical = fs::read_symlink(linkPath); - if (canonical.ends_with("pwm-tacho-controller") || - canonical.ends_with("pwm_tach:tach")) + fs::path linkPath = parentPath / "of_node"; + std::string canonical = fs::canonical(linkPath); + + std::string compatiblePath = canonical + "/compatible"; + std::ifstream compatibleStream(compatiblePath); + + if (!compatibleStream.is_open()) { - return FanTypes::aspeed; + std::cerr << "Error opening " << compatiblePath << "\n"; + return FanTypes::i2c; // Should this throw an exception instead? } - if (canonical.ends_with("pwm-fan-controller")) + + std::string compatibleString; + while (compatibleStream.peek() != EOF) { - return FanTypes::nuvoton; + std::getline(compatibleStream, compatibleString); + compatibleString.pop_back(); // trim EOL before comparisons + + if (compatibleString == "aspeed,ast2400-pwm-tacho" || + compatibleString == "aspeed,ast2500-pwm-tacho") + { + return FanTypes::aspeed; + } + if (compatibleString == "nuvoton,npcm750-pwm-fan") + { + return FanTypes::nuvoton; + } } + // todo: will we need to support other types? return FanTypes::i2c; }