lkml.org 
[lkml]   [2004]   [Mar]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    SubjectRe: [PATCH] i2c driver fixes for 2.6.4
    Date
    From
    ChangeSet 1.1597.1.10, 2004/03/01 11:27:29-08:00, komoriya@paken.org

    [PATCH] I2C: it87 reset option

    I wrote a patch which adds reset option to the it87 driver talking
    with Jean Delvare.

    * Do not reset the registers unless users want to do because
    resetting registers makes all fans go to full power and we can
    usually rely on values set by BIOS
    * Remove all limit initializations as they should be done from
    user-space
    * Better register mask for start of monitoring


    drivers/i2c/chips/it87.c | 162 +++++++++++------------------------------------
    1 files changed, 38 insertions(+), 124 deletions(-)


    diff -Nru a/drivers/i2c/chips/it87.c b/drivers/i2c/chips/it87.c
    --- a/drivers/i2c/chips/it87.c Mon Mar 15 14:35:47 2004
    +++ b/drivers/i2c/chips/it87.c Mon Mar 15 14:35:47 2004
    @@ -55,7 +55,10 @@


    /* Update battery voltage after every reading if true */
    -static int update_vbat = 0;
    +static int update_vbat;
    +
    +/* Reset the registers on init if true */
    +static int reset;

    /* Many IT87 constants specified below */

    @@ -129,61 +132,6 @@
    }
    #define DIV_FROM_REG(val) (1 << (val))

    -/* Initial limits. Use the config file to set better limits. */
    -#define IT87_INIT_IN_0 170
    -#define IT87_INIT_IN_1 250
    -#define IT87_INIT_IN_2 (330 / 2)
    -#define IT87_INIT_IN_3 (((500) * 100)/168)
    -#define IT87_INIT_IN_4 (((1200) * 10)/38)
    -#define IT87_INIT_IN_5 (((1200) * 10)/72)
    -#define IT87_INIT_IN_6 (((500) * 10)/56)
    -#define IT87_INIT_IN_7 (((500) * 100)/168)
    -
    -#define IT87_INIT_IN_PERCENTAGE 10
    -
    -#define IT87_INIT_IN_MIN_0 \
    - (IT87_INIT_IN_0 - IT87_INIT_IN_0 * IT87_INIT_IN_PERCENTAGE / 100)
    -#define IT87_INIT_IN_MAX_0 \
    - (IT87_INIT_IN_0 + IT87_INIT_IN_0 * IT87_INIT_IN_PERCENTAGE / 100)
    -#define IT87_INIT_IN_MIN_1 \
    - (IT87_INIT_IN_1 - IT87_INIT_IN_1 * IT87_INIT_IN_PERCENTAGE / 100)
    -#define IT87_INIT_IN_MAX_1 \
    - (IT87_INIT_IN_1 + IT87_INIT_IN_1 * IT87_INIT_IN_PERCENTAGE / 100)
    -#define IT87_INIT_IN_MIN_2 \
    - (IT87_INIT_IN_2 - IT87_INIT_IN_2 * IT87_INIT_IN_PERCENTAGE / 100)
    -#define IT87_INIT_IN_MAX_2 \
    - (IT87_INIT_IN_2 + IT87_INIT_IN_2 * IT87_INIT_IN_PERCENTAGE / 100)
    -#define IT87_INIT_IN_MIN_3 \
    - (IT87_INIT_IN_3 - IT87_INIT_IN_3 * IT87_INIT_IN_PERCENTAGE / 100)
    -#define IT87_INIT_IN_MAX_3 \
    - (IT87_INIT_IN_3 + IT87_INIT_IN_3 * IT87_INIT_IN_PERCENTAGE / 100)
    -#define IT87_INIT_IN_MIN_4 \
    - (IT87_INIT_IN_4 - IT87_INIT_IN_4 * IT87_INIT_IN_PERCENTAGE / 100)
    -#define IT87_INIT_IN_MAX_4 \
    - (IT87_INIT_IN_4 + IT87_INIT_IN_4 * IT87_INIT_IN_PERCENTAGE / 100)
    -#define IT87_INIT_IN_MIN_5 \
    - (IT87_INIT_IN_5 - IT87_INIT_IN_5 * IT87_INIT_IN_PERCENTAGE / 100)
    -#define IT87_INIT_IN_MAX_5 \
    - (IT87_INIT_IN_5 + IT87_INIT_IN_5 * IT87_INIT_IN_PERCENTAGE / 100)
    -#define IT87_INIT_IN_MIN_6 \
    - (IT87_INIT_IN_6 - IT87_INIT_IN_6 * IT87_INIT_IN_PERCENTAGE / 100)
    -#define IT87_INIT_IN_MAX_6 \
    - (IT87_INIT_IN_6 + IT87_INIT_IN_6 * IT87_INIT_IN_PERCENTAGE / 100)
    -#define IT87_INIT_IN_MIN_7 \
    - (IT87_INIT_IN_7 - IT87_INIT_IN_7 * IT87_INIT_IN_PERCENTAGE / 100)
    -#define IT87_INIT_IN_MAX_7 \
    - (IT87_INIT_IN_7 + IT87_INIT_IN_7 * IT87_INIT_IN_PERCENTAGE / 100)
    -
    -#define IT87_INIT_FAN_MIN_1 3000
    -#define IT87_INIT_FAN_MIN_2 3000
    -#define IT87_INIT_FAN_MIN_3 3000
    -
    -#define IT87_INIT_TEMP_HIGH_1 600
    -#define IT87_INIT_TEMP_LOW_1 200
    -#define IT87_INIT_TEMP_HIGH_2 600
    -#define IT87_INIT_TEMP_LOW_2 200
    -#define IT87_INIT_TEMP_HIGH_3 600
    -#define IT87_INIT_TEMP_LOW_3 200

    /* For each registered IT87, we need to keep some data in memory. That
    data is pointed to by it87_list[NR]->data. The structure itself is
    @@ -822,80 +770,44 @@
    return i2c_smbus_write_byte_data(client, reg, value);
    }

    -/* Called when we have found a new IT87. It should set limits, etc. */
    +/* Called when we have found a new IT87. */
    static void it87_init_client(struct i2c_client *client, struct it87_data *data)
    {
    - /* Reset all except Watchdog values and last conversion values
    - This sets fan-divs to 2, among others */
    - it87_write_value(client, IT87_REG_CONFIG, 0x80);
    - it87_write_value(client, IT87_REG_VIN_MIN(0),
    - IN_TO_REG(IT87_INIT_IN_MIN_0));
    - it87_write_value(client, IT87_REG_VIN_MAX(0),
    - IN_TO_REG(IT87_INIT_IN_MAX_0));
    - it87_write_value(client, IT87_REG_VIN_MIN(1),
    - IN_TO_REG(IT87_INIT_IN_MIN_1));
    - it87_write_value(client, IT87_REG_VIN_MAX(1),
    - IN_TO_REG(IT87_INIT_IN_MAX_1));
    - it87_write_value(client, IT87_REG_VIN_MIN(2),
    - IN_TO_REG(IT87_INIT_IN_MIN_2));
    - it87_write_value(client, IT87_REG_VIN_MAX(2),
    - IN_TO_REG(IT87_INIT_IN_MAX_2));
    - it87_write_value(client, IT87_REG_VIN_MIN(3),
    - IN_TO_REG(IT87_INIT_IN_MIN_3));
    - it87_write_value(client, IT87_REG_VIN_MAX(3),
    - IN_TO_REG(IT87_INIT_IN_MAX_3));
    - it87_write_value(client, IT87_REG_VIN_MIN(4),
    - IN_TO_REG(IT87_INIT_IN_MIN_4));
    - it87_write_value(client, IT87_REG_VIN_MAX(4),
    - IN_TO_REG(IT87_INIT_IN_MAX_4));
    - it87_write_value(client, IT87_REG_VIN_MIN(5),
    - IN_TO_REG(IT87_INIT_IN_MIN_5));
    - it87_write_value(client, IT87_REG_VIN_MAX(5),
    - IN_TO_REG(IT87_INIT_IN_MAX_5));
    - it87_write_value(client, IT87_REG_VIN_MIN(6),
    - IN_TO_REG(IT87_INIT_IN_MIN_6));
    - it87_write_value(client, IT87_REG_VIN_MAX(6),
    - IN_TO_REG(IT87_INIT_IN_MAX_6));
    - it87_write_value(client, IT87_REG_VIN_MIN(7),
    - IN_TO_REG(IT87_INIT_IN_MIN_7));
    - it87_write_value(client, IT87_REG_VIN_MAX(7),
    - IN_TO_REG(IT87_INIT_IN_MAX_7));
    - /* Note: Battery voltage does not have limit registers */
    - it87_write_value(client, IT87_REG_FAN_MIN(0),
    - FAN_TO_REG(IT87_INIT_FAN_MIN_1, 2));
    - it87_write_value(client, IT87_REG_FAN_MIN(1),
    - FAN_TO_REG(IT87_INIT_FAN_MIN_2, 2));
    - it87_write_value(client, IT87_REG_FAN_MIN(2),
    - FAN_TO_REG(IT87_INIT_FAN_MIN_3, 2));
    - it87_write_value(client, IT87_REG_TEMP_HIGH(0),
    - TEMP_TO_REG(IT87_INIT_TEMP_HIGH_1));
    - it87_write_value(client, IT87_REG_TEMP_LOW(0),
    - TEMP_TO_REG(IT87_INIT_TEMP_LOW_1));
    - it87_write_value(client, IT87_REG_TEMP_HIGH(1),
    - TEMP_TO_REG(IT87_INIT_TEMP_HIGH_2));
    - it87_write_value(client, IT87_REG_TEMP_LOW(1),
    - TEMP_TO_REG(IT87_INIT_TEMP_LOW_2));
    - it87_write_value(client, IT87_REG_TEMP_HIGH(2),
    - TEMP_TO_REG(IT87_INIT_TEMP_HIGH_3));
    - it87_write_value(client, IT87_REG_TEMP_LOW(2),
    - TEMP_TO_REG(IT87_INIT_TEMP_LOW_3));
    -
    - /* Enable voltage monitors */
    - it87_write_value(client, IT87_REG_VIN_ENABLE, 0xff);
    -
    - /* Enable Temp1-Temp3 */
    - data->sensor = (it87_read_value(client, IT87_REG_TEMP_ENABLE) & 0xc0);
    - data->sensor |= 0x2a; /* Temp1,Temp3=thermistor; Temp2=thermal diode */
    - it87_write_value(client, IT87_REG_TEMP_ENABLE, data->sensor);
    + int tmp;

    - /* Enable fans */
    - it87_write_value(client, IT87_REG_FAN_CTRL,
    - (it87_read_value(client, IT87_REG_FAN_CTRL) & 0x8f)
    - | 0x70);
    + if (reset) {
    + /* Reset all except Watchdog values and last conversion values
    + This sets fan-divs to 2, among others */
    + it87_write_value(client, IT87_REG_CONFIG, 0x80);
    + }
    +
    + /* Check if temperature channnels are reset manually or by some reason */
    + tmp = it87_read_value(client, IT87_REG_TEMP_ENABLE);
    + if ((tmp & 0x3f) == 0) {
    + /* Temp1,Temp3=thermistor; Temp2=thermal diode */
    + tmp = (tmp & 0xc0) | 0x2a;
    + it87_write_value(client, IT87_REG_TEMP_ENABLE, tmp);
    + }
    + data->sensor = tmp;
    +
    + /* Check if voltage monitors are reset manually or by some reason */
    + tmp = it87_read_value(client, IT87_REG_VIN_ENABLE);
    + if ((tmp & 0xff) == 0) {
    + /* Enable all voltage monitors */
    + it87_write_value(client, IT87_REG_VIN_ENABLE, 0xff);
    + }
    +
    + /* Check if tachometers are reset manually or by some reason */
    + tmp = it87_read_value(client, IT87_REG_FAN_CTRL);
    + if ((tmp & 0x70) == 0) {
    + /* Enable all fan tachometers */
    + tmp = (tmp & 0x8f) | 0x70;
    + it87_write_value(client, IT87_REG_FAN_CTRL, tmp);
    + }

    /* Start monitoring */
    it87_write_value(client, IT87_REG_CONFIG,
    - (it87_read_value(client, IT87_REG_CONFIG) & 0xb7)
    + (it87_read_value(client, IT87_REG_CONFIG) & 0x36)
    | (update_vbat ? 0x41 : 0x01));
    }

    @@ -988,6 +900,8 @@
    MODULE_DESCRIPTION("IT8705F, IT8712F, Sis950 driver");
    MODULE_PARM(update_vbat, "i");
    MODULE_PARM_DESC(update_vbat, "Update vbat if set else return powerup value");
    +MODULE_PARM(reset, "i");
    +MODULE_PARM_DESC(reset, "Reset the chip's registers, default no");
    MODULE_LICENSE("GPL");

    module_init(sm_it87_init);
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2005-03-22 14:01    [W:0.033 / U:0.792 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site