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