1 // SPDX-License-Identifier: Apache-2.0 2 // SPDX-FileCopyrightText: Copyright 2018 Intel Corporation 3 4 #pragma once 5 #include <boost/container/flat_map.hpp> 6 7 namespace devices 8 { 9 10 struct CmpStr 11 { operator ()devices::CmpStr12 bool operator()(const char* a, const char* b) const 13 { 14 return std::strcmp(a, b) < 0; 15 } 16 }; 17 18 // I2C device drivers may create a /hwmon subdirectory. For example the tmp75 19 // driver creates a /sys/bus/i2c/devices/<busnum>-<i2caddr>/hwmon 20 // directory. The sensor code relies on the presence of the /hwmon 21 // subdirectory to collect sensor readings. Initialization of this subdir is 22 // not reliable. I2C devices flagged with hasHWMonDir are tested for correct 23 // initialization, and when a failure is detected the device is deleted, and 24 // then recreated. The default is to retry 5 times before moving to the next 25 // device. 26 27 // Devices such as I2C EEPROMs do not generate this file structure. These 28 // kinds of devices are flagged using the noHWMonDir enumeration. The 29 // expectation is they are created correctly on the first attempt. 30 31 // This enumeration class exists to reduce copy/paste errors. It is easy to 32 // overlook the trailing parameter in the ExportTemplate structure when it is 33 // a simple boolean. 34 enum class createsHWMon : bool 35 { 36 noHWMonDir, 37 hasHWMonDir 38 }; 39 40 struct ExportTemplate 41 { ExportTemplatedevices::ExportTemplate42 ExportTemplate(const char* params, const char* bus, const char* constructor, 43 const char* destructor, createsHWMon hasHWMonDir) : 44 parameters(params), busPath(bus), add(constructor), remove(destructor), 45 hasHWMonDir(hasHWMonDir) {}; 46 const char* parameters; 47 const char* busPath; 48 const char* add; 49 const char* remove; 50 createsHWMon hasHWMonDir; 51 }; 52 53 const boost::container::flat_map<const char*, ExportTemplate, CmpStr> 54 exportTemplates{ 55 {{"EEPROM_24C01", 56 ExportTemplate("24c01 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 57 "new_device", "delete_device", 58 createsHWMon::noHWMonDir)}, 59 {"EEPROM_24C02", 60 ExportTemplate("24c02 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 61 "new_device", "delete_device", 62 createsHWMon::noHWMonDir)}, 63 {"EEPROM_24C04", 64 ExportTemplate("24c04 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 65 "new_device", "delete_device", 66 createsHWMon::noHWMonDir)}, 67 {"EEPROM_24C08", 68 ExportTemplate("24c08 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 69 "new_device", "delete_device", 70 createsHWMon::noHWMonDir)}, 71 {"EEPROM_24C16", 72 ExportTemplate("24c16 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 73 "new_device", "delete_device", 74 createsHWMon::noHWMonDir)}, 75 {"EEPROM_24C32", 76 ExportTemplate("24c32 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 77 "new_device", "delete_device", 78 createsHWMon::noHWMonDir)}, 79 {"EEPROM_24C64", 80 ExportTemplate("24c64 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 81 "new_device", "delete_device", 82 createsHWMon::noHWMonDir)}, 83 {"EEPROM_24C128", 84 ExportTemplate("24c128 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 85 "new_device", "delete_device", 86 createsHWMon::noHWMonDir)}, 87 {"EEPROM_24C256", 88 ExportTemplate("24c256 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 89 "new_device", "delete_device", 90 createsHWMon::noHWMonDir)}, 91 {"ADS1015", 92 ExportTemplate("ads1015 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 93 "new_device", "delete_device", 94 createsHWMon::noHWMonDir)}, 95 {"ADS7828", 96 ExportTemplate("ads7828 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 97 "new_device", "delete_device", 98 createsHWMon::noHWMonDir)}, 99 {"EEPROM", 100 ExportTemplate("eeprom $Address", "/sys/bus/i2c/devices/i2c-$Bus", 101 "new_device", "delete_device", 102 createsHWMon::noHWMonDir)}, 103 {"Gpio", ExportTemplate("$Index", "/sys/class/gpio", "export", 104 "unexport", createsHWMon::noHWMonDir)}, 105 {"IPSPS1", 106 ExportTemplate("ipsps1 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 107 "new_device", "delete_device", 108 createsHWMon::hasHWMonDir)}, 109 {"MAX34440", 110 ExportTemplate("max34440 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 111 "new_device", "delete_device", 112 createsHWMon::hasHWMonDir)}, 113 {"PCA9537", 114 ExportTemplate("pca9537 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 115 "new_device", "delete_device", 116 createsHWMon::noHWMonDir)}, 117 {"PCA9542Mux", 118 ExportTemplate("pca9542 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 119 "new_device", "delete_device", 120 createsHWMon::noHWMonDir)}, 121 {"PCA9543Mux", 122 ExportTemplate("pca9543 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 123 "new_device", "delete_device", 124 createsHWMon::noHWMonDir)}, 125 {"PCA9544Mux", 126 ExportTemplate("pca9544 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 127 "new_device", "delete_device", 128 createsHWMon::noHWMonDir)}, 129 {"PCA9545Mux", 130 ExportTemplate("pca9545 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 131 "new_device", "delete_device", 132 createsHWMon::noHWMonDir)}, 133 {"PCA9546Mux", 134 ExportTemplate("pca9546 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 135 "new_device", "delete_device", 136 createsHWMon::noHWMonDir)}, 137 {"PCA9547Mux", 138 ExportTemplate("pca9547 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 139 "new_device", "delete_device", 140 createsHWMon::noHWMonDir)}, 141 {"PCA9548Mux", 142 ExportTemplate("pca9548 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 143 "new_device", "delete_device", 144 createsHWMon::noHWMonDir)}, 145 {"PCA9846Mux", 146 ExportTemplate("pca9846 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 147 "new_device", "delete_device", 148 createsHWMon::noHWMonDir)}, 149 {"PCA9847Mux", 150 ExportTemplate("pca9847 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 151 "new_device", "delete_device", 152 createsHWMon::noHWMonDir)}, 153 {"PCA9848Mux", 154 ExportTemplate("pca9848 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 155 "new_device", "delete_device", 156 createsHWMon::noHWMonDir)}, 157 {"PCA9849Mux", 158 ExportTemplate("pca9849 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 159 "new_device", "delete_device", 160 createsHWMon::noHWMonDir)}, 161 {"SIC450", 162 ExportTemplate("sic450 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 163 "new_device", "delete_device", 164 createsHWMon::hasHWMonDir)}, 165 {"Q50SN12072", 166 ExportTemplate("q50sn12072 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 167 "new_device", "delete_device", 168 createsHWMon::hasHWMonDir)}, 169 {"MAX31790", 170 ExportTemplate("max31790 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 171 "new_device", "delete_device", 172 createsHWMon::hasHWMonDir)}, 173 {"PIC32", ExportTemplate("pic32 $Address", 174 "/sys/bus/i2c/devices/i2c-$Bus", "new_device", 175 "delete_device", createsHWMon::hasHWMonDir)}, 176 {"INA226", 177 ExportTemplate("ina226 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 178 "new_device", "delete_device", 179 createsHWMon::hasHWMonDir)}, 180 {"RAA229620", 181 ExportTemplate("raa229620 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 182 "new_device", "delete_device", 183 createsHWMon::hasHWMonDir)}, 184 {"RAA229621", 185 ExportTemplate("raa229621 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 186 "new_device", "delete_device", 187 createsHWMon::hasHWMonDir)}, 188 {"PIC32", ExportTemplate("pic32 $Address", 189 "/sys/bus/i2c/devices/i2c-$Bus", "new_device", 190 "delete_device", createsHWMon::hasHWMonDir)}, 191 {"INA233", 192 ExportTemplate("ina233 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 193 "new_device", "delete_device", 194 createsHWMon::hasHWMonDir)}, 195 {"RTQ6056", 196 ExportTemplate("rtq6056 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 197 "new_device", "delete_device", 198 createsHWMon::noHWMonDir)}, 199 {"SY24655", 200 ExportTemplate("sy24655 $Address", "/sys/bus/i2c/devices/i2c-$Bus", 201 "new_device", "delete_device", 202 createsHWMon::hasHWMonDir)}}}; 203 } // namespace devices 204