void maxi_vid(struct i2c_client *client, int operation, int ctl_name, int *nrels_mag, long *results) { struct maxi_data *data = client->data; int nr; if (data->type == nba) { maxi99_vid(client, operation, ctl_name, nrels_mag, results); return; } nr = ctl_name - MAXI_SYSCTL_VID1 + 1; if (operation == SENSORS_PROC_REAL_INFO) *nrels_mag = 4; else if (operation == SENSORS_PROC_REAL_READ) { maxi_update_client(client); results[0] = VID_FROM_REG(data->vid_min[nr - 1]); results[1] = VID_FROM_REG(data->vid_max[nr - 1]); results[2] = VID_FROM_REG(data->vid[nr - 1]); *nrels_mag = 3; } else if (operation == SENSORS_PROC_REAL_WRITE) { #ifndef NOWRITE if (*nrels_mag >= 1) { data->vid_min[nr - 1] = VID_TO_REG(results[0]); maxi_write_value(client, MAXI_REG_VID_MIN(nr), data->vid_min[nr - 1]); } if (*nrels_mag >= 2) { data->vid_max[nr - 1] = VID_TO_REG(results[1]); maxi_write_value(client, MAXI_REG_VID_MAX(nr), data->vid_max[nr - 1]); } #endif } }
/* Called when we have found a new MTP008. It should set limits, etc. */ void mtp008_init_client(struct i2c_client *client) { int vid; u8 save1, save2; struct mtp008_data *data; data = client->data; /* * Initialize the Myson MTP008 hardware monitoring chip. * Save the pin settings that the BIOS hopefully set. */ save1 = mtp008_read_value(client, MTP008_REG_PIN_CTRL1); save2 = mtp008_read_value(client, MTP008_REG_PIN_CTRL2); mtp008_write_value(client, MTP008_REG_CONFIG, (mtp008_read_value(client, MTP008_REG_CONFIG) & 0x7f) | 0x80); mtp008_write_value(client, MTP008_REG_PIN_CTRL1, save1); mtp008_write_value(client, MTP008_REG_PIN_CTRL2, save2); mtp008_getsensortype(data, save2); /* * Retrieve the VID setting (needed for the default limits). */ vid = mtp008_read_value(client, MTP008_REG_VID_FANDIV) & 0x0f; vid |= (mtp008_read_value(client, MTP008_REG_RESET_VID4) & 0x01) << 4; vid = VID_FROM_REG(vid); /* * Set the default limits. * * Setting temp sensors is done as follows: * * Register 0x57: 0 0 0 0 x x x x * | \ / +-- AIN5/VT3 * | +----- AIN4/VT2/PII * +-------- VT1/PII */ mtp008_write_value(client, MTP008_REG_IN_MAX(0), IN_TO_REG(MTP008_INIT_IN_MAX_0)); mtp008_write_value(client, MTP008_REG_IN_MIN(0), IN_TO_REG(MTP008_INIT_IN_MIN_0)); mtp008_write_value(client, MTP008_REG_IN_MAX(1), IN_TO_REG(MTP008_INIT_IN_MAX_1)); mtp008_write_value(client, MTP008_REG_IN_MIN(1), IN_TO_REG(MTP008_INIT_IN_MIN_1)); mtp008_write_value(client, MTP008_REG_IN_MAX(2), IN_TO_REG(MTP008_INIT_IN_MAX_2)); mtp008_write_value(client, MTP008_REG_IN_MIN(2), IN_TO_REG(MTP008_INIT_IN_MIN_2)); mtp008_write_value(client, MTP008_REG_IN_MAX(3), IN_TO_REG(MTP008_INIT_IN_MAX_3)); mtp008_write_value(client, MTP008_REG_IN_MIN(3), IN_TO_REG(MTP008_INIT_IN_MIN_3)); mtp008_write_value(client, MTP008_REG_IN_MAX(5), IN_TO_REG(MTP008_INIT_IN_MAX_5)); mtp008_write_value(client, MTP008_REG_IN_MIN(5), IN_TO_REG(MTP008_INIT_IN_MIN_5)); mtp008_write_value(client, MTP008_REG_IN_MAX(6), IN_TO_REG(MTP008_INIT_IN_MAX_6)); mtp008_write_value(client, MTP008_REG_IN_MIN(6), IN_TO_REG(MTP008_INIT_IN_MIN_6)); mtp008_write_value(client, MTP008_REG_TEMP_MAX, TEMP_TO_REG(MTP008_INIT_TEMP_OVER)); mtp008_write_value(client, MTP008_REG_TEMP_MIN, TEMP_TO_REG(MTP008_INIT_TEMP_HYST)); mtp008_write_value(client, MTP008_REG_IN_MAX(4), TEMP_TO_REG(MTP008_INIT_TEMP2_OVER)); mtp008_write_value(client, MTP008_REG_IN_MIN(4), TEMP_TO_REG(MTP008_INIT_TEMP2_HYST)); mtp008_write_value(client, MTP008_REG_FAN_MIN(1), FAN_TO_REG(MTP008_INIT_FAN_MIN_1, 2)); mtp008_write_value(client, MTP008_REG_FAN_MIN(2), FAN_TO_REG(MTP008_INIT_FAN_MIN_2, 2)); mtp008_write_value(client, MTP008_REG_FAN_MIN(3), FAN_TO_REG(MTP008_INIT_FAN_MIN_3, 2)); /* * Start monitoring. */ mtp008_write_value( client, MTP008_REG_CONFIG, (mtp008_read_value(client, MTP008_REG_CONFIG) & 0xf7) | 0x01 ); }