| // SPDX-License-Identifier: Apache-2.0 | 
 | // SPDX-FileCopyrightText: Copyright 2018 Intel Corporation | 
 |  | 
 | #pragma once | 
 | #include <boost/container/flat_map.hpp> | 
 |  | 
 | namespace devices | 
 | { | 
 |  | 
 | struct CmpStr | 
 | { | 
 |     bool operator()(const char* a, const char* b) const | 
 |     { | 
 |         return std::strcmp(a, b) < 0; | 
 |     } | 
 | }; | 
 |  | 
 | // I2C device drivers may create a /hwmon subdirectory. For example the tmp75 | 
 | // driver creates a /sys/bus/i2c/devices/<busnum>-<i2caddr>/hwmon | 
 | // directory. The sensor code relies on the presence of the /hwmon | 
 | // subdirectory to collect sensor readings. Initialization of this subdir is | 
 | // not reliable. I2C devices flagged with hasHWMonDir are tested for correct | 
 | // initialization, and when a failure is detected the device is deleted, and | 
 | // then recreated. The default is to retry 5 times before moving to the next | 
 | // device. | 
 |  | 
 | // Devices such as I2C EEPROMs do not generate this file structure. These | 
 | // kinds of devices are flagged using the noHWMonDir enumeration. The | 
 | // expectation is they are created correctly on the first attempt. | 
 |  | 
 | // This enumeration class exists to reduce copy/paste errors. It is easy to | 
 | // overlook the trailing parameter in the ExportTemplate structure when it is | 
 | // a simple boolean. | 
 | enum class createsHWMon : bool | 
 | { | 
 |     noHWMonDir, | 
 |     hasHWMonDir | 
 | }; | 
 |  | 
 | struct ExportTemplate | 
 | { | 
 |     ExportTemplate(const char* params, const char* bus, const char* constructor, | 
 |                    const char* destructor, createsHWMon hasHWMonDir) : | 
 |         parameters(params), busPath(bus), add(constructor), remove(destructor), | 
 |         hasHWMonDir(hasHWMonDir) {}; | 
 |     const char* parameters; | 
 |     const char* busPath; | 
 |     const char* add; | 
 |     const char* remove; | 
 |     createsHWMon hasHWMonDir; | 
 | }; | 
 |  | 
 | const boost::container::flat_map<const char*, ExportTemplate, CmpStr> | 
 |     exportTemplates{ | 
 |         {{"EEPROM_24C01", | 
 |           ExportTemplate("24c01 $Address", "/sys/bus/i2c/devices/i2c-$Bus", | 
 |                          "new_device", "delete_device", | 
 |                          createsHWMon::noHWMonDir)}, | 
 |          {"EEPROM_24C02", | 
 |           ExportTemplate("24c02 $Address", "/sys/bus/i2c/devices/i2c-$Bus", | 
 |                          "new_device", "delete_device", | 
 |                          createsHWMon::noHWMonDir)}, | 
 |          {"EEPROM_24C04", | 
 |           ExportTemplate("24c04 $Address", "/sys/bus/i2c/devices/i2c-$Bus", | 
 |                          "new_device", "delete_device", | 
 |                          createsHWMon::noHWMonDir)}, | 
 |          {"EEPROM_24C08", | 
 |           ExportTemplate("24c08 $Address", "/sys/bus/i2c/devices/i2c-$Bus", | 
 |                          "new_device", "delete_device", | 
 |                          createsHWMon::noHWMonDir)}, | 
 |          {"EEPROM_24C16", | 
 |           ExportTemplate("24c16 $Address", "/sys/bus/i2c/devices/i2c-$Bus", | 
 |                          "new_device", "delete_device", | 
 |                          createsHWMon::noHWMonDir)}, | 
 |          {"EEPROM_24C32", | 
 |           ExportTemplate("24c32 $Address", "/sys/bus/i2c/devices/i2c-$Bus", | 
 |                          "new_device", "delete_device", | 
 |                          createsHWMon::noHWMonDir)}, | 
 |          {"EEPROM_24C64", | 
 |           ExportTemplate("24c64 $Address", "/sys/bus/i2c/devices/i2c-$Bus", | 
 |                          "new_device", "delete_device", | 
 |                          createsHWMon::noHWMonDir)}, | 
 |          {"EEPROM_24C128", | 
 |           ExportTemplate("24c128 $Address", "/sys/bus/i2c/devices/i2c-$Bus", | 
 |                          "new_device", "delete_device", | 
 |                          createsHWMon::noHWMonDir)}, | 
 |          {"EEPROM_24C256", | 
 |           ExportTemplate("24c256 $Address", "/sys/bus/i2c/devices/i2c-$Bus", | 
 |                          "new_device", "delete_device", | 
 |                          createsHWMon::noHWMonDir)}, | 
 |          {"ADS1015", | 
 |           ExportTemplate("ads1015 $Address", "/sys/bus/i2c/devices/i2c-$Bus", | 
 |                          "new_device", "delete_device", | 
 |                          createsHWMon::noHWMonDir)}, | 
 |          {"ADS7828", | 
 |           ExportTemplate("ads7828 $Address", "/sys/bus/i2c/devices/i2c-$Bus", | 
 |                          "new_device", "delete_device", | 
 |                          createsHWMon::noHWMonDir)}, | 
 |          {"EEPROM", | 
 |           ExportTemplate("eeprom $Address", "/sys/bus/i2c/devices/i2c-$Bus", | 
 |                          "new_device", "delete_device", | 
 |                          createsHWMon::noHWMonDir)}, | 
 |          {"Gpio", ExportTemplate("$Index", "/sys/class/gpio", "export", | 
 |                                  "unexport", createsHWMon::noHWMonDir)}, | 
 |          {"IPSPS1", | 
 |           ExportTemplate("ipsps1 $Address", "/sys/bus/i2c/devices/i2c-$Bus", | 
 |                          "new_device", "delete_device", | 
 |                          createsHWMon::hasHWMonDir)}, | 
 |          {"MAX34440", | 
 |           ExportTemplate("max34440 $Address", "/sys/bus/i2c/devices/i2c-$Bus", | 
 |                          "new_device", "delete_device", | 
 |                          createsHWMon::hasHWMonDir)}, | 
 |          {"PCA9537", | 
 |           ExportTemplate("pca9537 $Address", "/sys/bus/i2c/devices/i2c-$Bus", | 
 |                          "new_device", "delete_device", | 
 |                          createsHWMon::noHWMonDir)}, | 
 |          {"PCA9542Mux", | 
 |           ExportTemplate("pca9542 $Address", "/sys/bus/i2c/devices/i2c-$Bus", | 
 |                          "new_device", "delete_device", | 
 |                          createsHWMon::noHWMonDir)}, | 
 |          {"PCA9543Mux", | 
 |           ExportTemplate("pca9543 $Address", "/sys/bus/i2c/devices/i2c-$Bus", | 
 |                          "new_device", "delete_device", | 
 |                          createsHWMon::noHWMonDir)}, | 
 |          {"PCA9544Mux", | 
 |           ExportTemplate("pca9544 $Address", "/sys/bus/i2c/devices/i2c-$Bus", | 
 |                          "new_device", "delete_device", | 
 |                          createsHWMon::noHWMonDir)}, | 
 |          {"PCA9545Mux", | 
 |           ExportTemplate("pca9545 $Address", "/sys/bus/i2c/devices/i2c-$Bus", | 
 |                          "new_device", "delete_device", | 
 |                          createsHWMon::noHWMonDir)}, | 
 |          {"PCA9546Mux", | 
 |           ExportTemplate("pca9546 $Address", "/sys/bus/i2c/devices/i2c-$Bus", | 
 |                          "new_device", "delete_device", | 
 |                          createsHWMon::noHWMonDir)}, | 
 |          {"PCA9547Mux", | 
 |           ExportTemplate("pca9547 $Address", "/sys/bus/i2c/devices/i2c-$Bus", | 
 |                          "new_device", "delete_device", | 
 |                          createsHWMon::noHWMonDir)}, | 
 |          {"PCA9548Mux", | 
 |           ExportTemplate("pca9548 $Address", "/sys/bus/i2c/devices/i2c-$Bus", | 
 |                          "new_device", "delete_device", | 
 |                          createsHWMon::noHWMonDir)}, | 
 |          {"PCA9846Mux", | 
 |           ExportTemplate("pca9846 $Address", "/sys/bus/i2c/devices/i2c-$Bus", | 
 |                          "new_device", "delete_device", | 
 |                          createsHWMon::noHWMonDir)}, | 
 |          {"PCA9847Mux", | 
 |           ExportTemplate("pca9847 $Address", "/sys/bus/i2c/devices/i2c-$Bus", | 
 |                          "new_device", "delete_device", | 
 |                          createsHWMon::noHWMonDir)}, | 
 |          {"PCA9848Mux", | 
 |           ExportTemplate("pca9848 $Address", "/sys/bus/i2c/devices/i2c-$Bus", | 
 |                          "new_device", "delete_device", | 
 |                          createsHWMon::noHWMonDir)}, | 
 |          {"PCA9849Mux", | 
 |           ExportTemplate("pca9849 $Address", "/sys/bus/i2c/devices/i2c-$Bus", | 
 |                          "new_device", "delete_device", | 
 |                          createsHWMon::noHWMonDir)}, | 
 |          {"SIC450", | 
 |           ExportTemplate("sic450 $Address", "/sys/bus/i2c/devices/i2c-$Bus", | 
 |                          "new_device", "delete_device", | 
 |                          createsHWMon::hasHWMonDir)}, | 
 |          {"Q50SN12072", | 
 |           ExportTemplate("q50sn12072 $Address", "/sys/bus/i2c/devices/i2c-$Bus", | 
 |                          "new_device", "delete_device", | 
 |                          createsHWMon::hasHWMonDir)}, | 
 |          {"MAX31790", | 
 |           ExportTemplate("max31790 $Address", "/sys/bus/i2c/devices/i2c-$Bus", | 
 |                          "new_device", "delete_device", | 
 |                          createsHWMon::hasHWMonDir)}, | 
 |          {"PIC32", ExportTemplate("pic32 $Address", | 
 |                                   "/sys/bus/i2c/devices/i2c-$Bus", "new_device", | 
 |                                   "delete_device", createsHWMon::hasHWMonDir)}, | 
 |          {"INA226", | 
 |           ExportTemplate("ina226 $Address", "/sys/bus/i2c/devices/i2c-$Bus", | 
 |                          "new_device", "delete_device", | 
 |                          createsHWMon::hasHWMonDir)}, | 
 |          {"RAA229620", | 
 |           ExportTemplate("raa229620 $Address", "/sys/bus/i2c/devices/i2c-$Bus", | 
 |                          "new_device", "delete_device", | 
 |                          createsHWMon::hasHWMonDir)}, | 
 |          {"RAA229621", | 
 |           ExportTemplate("raa229621 $Address", "/sys/bus/i2c/devices/i2c-$Bus", | 
 |                          "new_device", "delete_device", | 
 |                          createsHWMon::hasHWMonDir)}, | 
 |          {"PIC32", ExportTemplate("pic32 $Address", | 
 |                                   "/sys/bus/i2c/devices/i2c-$Bus", "new_device", | 
 |                                   "delete_device", createsHWMon::hasHWMonDir)}, | 
 |          {"INA233", | 
 |           ExportTemplate("ina233 $Address", "/sys/bus/i2c/devices/i2c-$Bus", | 
 |                          "new_device", "delete_device", | 
 |                          createsHWMon::hasHWMonDir)}, | 
 |          {"RTQ6056", | 
 |           ExportTemplate("rtq6056 $Address", "/sys/bus/i2c/devices/i2c-$Bus", | 
 |                          "new_device", "delete_device", | 
 |                          createsHWMon::noHWMonDir)}, | 
 |          {"SY24655", | 
 |           ExportTemplate("sy24655 $Address", "/sys/bus/i2c/devices/i2c-$Bus", | 
 |                          "new_device", "delete_device", | 
 |                          createsHWMon::hasHWMonDir)}}}; | 
 | } // namespace devices |