#include #include #include #include #include #include #include #include "chip.h" #define ADM1026_DEVICE 0x2d /* Either 0x2c or 0x2d or 0x2e */ #define ADM1026_REG_CONFIG1 0x00 #define CFG1_MONITOR 0x01 #define CFG1_INT_ENABLE 0x02 #define CFG1_INT_CLEAR 0x04 #define CFG1_AIN8_9 0x08 #define CFG1_THERM_HOT 0x10 #define CFT1_DAC_AFC 0x20 #define CFG1_PWM_AFC 0x40 #define CFG1_RESET 0x80 #define ADM1026_REG_CONFIG2 0x01 #define ADM1026_REG_CONFIG3 0x07 static void adm1026_enable_monitoring(device_t dev); static void adm1026_init(device_t dev) { if (dev->enabled && dev->path.type == DEVICE_PATH_I2C) { if(ops_smbus_bus(get_pbus_smbus(dev))) { if( dev->bus->dev->path.type == DEVICE_PATH_I2C) smbus_set_link(dev); // it is under mux adm1026_enable_monitoring(dev); } } } static void adm1026_enable_monitoring(device_t dev) { int result; result = smbus_read_byte(dev, ADM1026_REG_CONFIG1); result = (result | CFG1_MONITOR) & ~(CFG1_INT_CLEAR | CFG1_RESET); result = smbus_write_byte(dev, ADM1026_REG_CONFIG1, result); result = smbus_read_byte(dev, ADM1026_REG_CONFIG1); if (!(result & CFG1_MONITOR)) { printk_debug("ADM1026: monitoring would not enable"); } } static void adm1026_noop(device_t dummy) { } static struct device_operations adm1026_operations = { .read_resources = adm1026_noop, .set_resources = adm1026_noop, .enable_resources = adm1026_noop, .init = adm1026_init, }; static void enable_dev(struct device *dev) { dev->ops = &adm1026_operations; } struct chip_operations drivers_i2c_adm1026_ops = { CHIP_NAME("adm1026") .enable_dev = enable_dev, };