Skip to content

Commit

Permalink
hwmon: (w83627ehf) Convert register arrays to 16 bit, and convert acc…
Browse files Browse the repository at this point in the history
…ess to pointers

For newer chips, several registers are banked and thus need to be 16 bit.
Also, register addresses change.

To prepare for those chips, convert affected register arrays to 16 bit,
and change access to those registers to array pointers in struct w83627ehf_data.

Signed-off-by: Guenter Roeck <guenter.roeck@ericsson.com>
Acked-by: Ian Dobson <i.dobson@planet-ian.com>
  • Loading branch information
Guenter Roeck committed Mar 15, 2011
1 parent 96d1eac commit 279af1a
Showing 1 changed file with 36 additions and 24 deletions.
60 changes: 36 additions & 24 deletions drivers/hwmon/w83627ehf.c
Original file line number Diff line number Diff line change
Expand Up @@ -196,22 +196,23 @@ static const u8 W83627EHF_PWM_MODE_SHIFT[] = { 0, 1, 0, 6 };
static const u8 W83627EHF_PWM_ENABLE_SHIFT[] = { 2, 4, 1, 4 };

/* FAN Duty Cycle, be used to control */
static const u8 W83627EHF_REG_PWM[] = { 0x01, 0x03, 0x11, 0x61 };
static const u8 W83627EHF_REG_TARGET[] = { 0x05, 0x06, 0x13, 0x63 };
static const u16 W83627EHF_REG_PWM[] = { 0x01, 0x03, 0x11, 0x61 };
static const u16 W83627EHF_REG_TARGET[] = { 0x05, 0x06, 0x13, 0x63 };
static const u8 W83627EHF_REG_TOLERANCE[] = { 0x07, 0x07, 0x14, 0x62 };

/* Advanced Fan control, some values are common for all fans */
static const u8 W83627EHF_REG_FAN_START_OUTPUT[] = { 0x0a, 0x0b, 0x16, 0x65 };
static const u8 W83627EHF_REG_FAN_STOP_OUTPUT[] = { 0x08, 0x09, 0x15, 0x64 };
static const u8 W83627EHF_REG_FAN_STOP_TIME[] = { 0x0c, 0x0d, 0x17, 0x66 };
static const u16 W83627EHF_REG_FAN_START_OUTPUT[] = { 0x0a, 0x0b, 0x16, 0x65 };
static const u16 W83627EHF_REG_FAN_STOP_OUTPUT[] = { 0x08, 0x09, 0x15, 0x64 };
static const u16 W83627EHF_REG_FAN_STOP_TIME[] = { 0x0c, 0x0d, 0x17, 0x66 };

static const u8 W83627EHF_REG_FAN_MAX_OUTPUT_COMMON[]
static const u16 W83627EHF_REG_FAN_MAX_OUTPUT_COMMON[]
= { 0xff, 0x67, 0xff, 0x69 };
static const u8 W83627EHF_REG_FAN_STEP_OUTPUT_COMMON[]
static const u16 W83627EHF_REG_FAN_STEP_OUTPUT_COMMON[]
= { 0xff, 0x68, 0xff, 0x6a };

static const u8 W83627EHF_REG_FAN_MAX_OUTPUT_W83667_B[] = { 0x67, 0x69, 0x6b };
static const u8 W83627EHF_REG_FAN_STEP_OUTPUT_W83667_B[] = { 0x68, 0x6a, 0x6c };
static const u16 W83627EHF_REG_FAN_MAX_OUTPUT_W83667_B[] = { 0x67, 0x69, 0x6b };
static const u16 W83627EHF_REG_FAN_STEP_OUTPUT_W83667_B[]
= { 0x68, 0x6a, 0x6c };

static const char *const w83667hg_b_temp_label[] = {
"SYSTIN",
Expand Down Expand Up @@ -310,10 +311,15 @@ struct w83627ehf_data {
u8 temp_src[NUM_REG_TEMP];
const char * const *temp_label;

const u8 *REG_FAN_START_OUTPUT;
const u8 *REG_FAN_STOP_OUTPUT;
const u8 *REG_FAN_MAX_OUTPUT;
const u8 *REG_FAN_STEP_OUTPUT;
const u16 *REG_PWM;
const u16 *REG_TARGET;
const u16 *REG_FAN;
const u16 *REG_FAN_MIN;
const u16 *REG_FAN_START_OUTPUT;
const u16 *REG_FAN_STOP_OUTPUT;
const u16 *REG_FAN_STOP_TIME;
const u16 *REG_FAN_MAX_OUTPUT;
const u16 *REG_FAN_STEP_OUTPUT;

struct mutex update_lock;
char valid; /* !=0 if following fields are valid */
Expand Down Expand Up @@ -524,9 +530,9 @@ static struct w83627ehf_data *w83627ehf_update_device(struct device *dev)
continue;

data->fan[i] = w83627ehf_read_value(data,
W83627EHF_REG_FAN[i]);
data->REG_FAN[i]);
data->fan_min[i] = w83627ehf_read_value(data,
W83627EHF_REG_FAN_MIN[i]);
data->REG_FAN_MIN[i]);

/* If we failed to measure the fan speed and clock
divider can be increased, let's try that for next
Expand All @@ -543,7 +549,7 @@ static struct w83627ehf_data *w83627ehf_update_device(struct device *dev)
if (data->fan_min[i] >= 2
&& data->fan_min[i] != 255)
w83627ehf_write_value(data,
W83627EHF_REG_FAN_MIN[i],
data->REG_FAN_MIN[i],
(data->fan_min[i] /= 2));
}
}
Expand All @@ -566,13 +572,13 @@ static struct w83627ehf_data *w83627ehf_update_device(struct device *dev)
((pwmcfg >> W83627EHF_PWM_ENABLE_SHIFT[i])
& 3) + 1;
data->pwm[i] = w83627ehf_read_value(data,
W83627EHF_REG_PWM[i]);
data->REG_PWM[i]);
data->fan_start_output[i] = w83627ehf_read_value(data,
W83627EHF_REG_FAN_START_OUTPUT[i]);
data->REG_FAN_START_OUTPUT[i]);
data->fan_stop_output[i] = w83627ehf_read_value(data,
W83627EHF_REG_FAN_STOP_OUTPUT[i]);
data->REG_FAN_STOP_OUTPUT[i]);
data->fan_stop_time[i] = w83627ehf_read_value(data,
W83627EHF_REG_FAN_STOP_TIME[i]);
data->REG_FAN_STOP_TIME[i]);

if (data->REG_FAN_MAX_OUTPUT[i] != 0xff)
data->fan_max_output[i] =
Expand All @@ -586,7 +592,7 @@ static struct w83627ehf_data *w83627ehf_update_device(struct device *dev)

data->target_temp[i] =
w83627ehf_read_value(data,
W83627EHF_REG_TARGET[i]) &
data->REG_TARGET[i]) &
(data->pwm_mode[i] == 1 ? 0x7f : 0xff);
data->tolerance[i] = (tolerance >> (i == 1 ? 4 : 0))
& 0x0f;
Expand Down Expand Up @@ -822,7 +828,7 @@ store_fan_min(struct device *dev, struct device_attribute *attr,
/* Give the chip time to sample a new speed value */
data->last_updated = jiffies;
}
w83627ehf_write_value(data, W83627EHF_REG_FAN_MIN[nr],
w83627ehf_write_value(data, data->REG_FAN_MIN[nr],
data->fan_min[nr]);
mutex_unlock(&data->update_lock);

Expand Down Expand Up @@ -1029,7 +1035,7 @@ store_pwm(struct device *dev, struct device_attribute *attr,

mutex_lock(&data->update_lock);
data->pwm[nr] = val;
w83627ehf_write_value(data, W83627EHF_REG_PWM[nr], val);
w83627ehf_write_value(data, data->REG_PWM[nr], val);
mutex_unlock(&data->update_lock);
return count;
}
Expand Down Expand Up @@ -1094,7 +1100,7 @@ store_target_temp(struct device *dev, struct device_attribute *attr,

mutex_lock(&data->update_lock);
data->target_temp[nr] = val;
w83627ehf_write_value(data, W83627EHF_REG_TARGET[nr], val);
w83627ehf_write_value(data, data->REG_TARGET[nr], val);
mutex_unlock(&data->update_lock);
return count;
}
Expand Down Expand Up @@ -1509,8 +1515,14 @@ static int __devinit w83627ehf_probe(struct platform_device *pdev)
data->temp_label = w83667hg_b_temp_label;
}

data->REG_PWM = W83627EHF_REG_PWM;
data->REG_TARGET = W83627EHF_REG_TARGET;
data->REG_FAN = W83627EHF_REG_FAN;
data->REG_FAN_MIN = W83627EHF_REG_FAN_MIN;
data->REG_FAN_START_OUTPUT = W83627EHF_REG_FAN_START_OUTPUT;
data->REG_FAN_STOP_OUTPUT = W83627EHF_REG_FAN_STOP_OUTPUT;
data->REG_FAN_STOP_TIME = W83627EHF_REG_FAN_STOP_TIME;
data->REG_FAN_START_OUTPUT = W83627EHF_REG_FAN_START_OUTPUT;
if (sio_data->kind == w83667hg_b) {
data->REG_FAN_MAX_OUTPUT =
W83627EHF_REG_FAN_MAX_OUTPUT_W83667_B;
Expand Down

0 comments on commit 279af1a

Please sign in to comment.