[lm-sensors] [PATCH] adm1021 clean ups
Jean Delvare
khali at linux-fr.org
Sun Jul 15 12:02:55 CEST 2007
Hi Krzysztof,
On Mon, 9 Jul 2007 23:55:44 +0200, Krzysztof Helt wrote:
> This patch provides some coding standard cleanups and general code improvements (more debug info, signed values for
> temperatures, changed names of ADM1023 regs, removed read/write_value functions).
... and broke the read_only module parameter. It can be discussed how
useful this module parameter is (personally I think it's useless) but
please don't break it silently. If you want to remove it, then really
remove it, and update Documentation/hwmon/adm1021 according ). But this would be a
separate patch, as this isn't a simple cleanup.
> --- linux-2.6.21.old/drivers/hwmon/adm1021.c 2007-04-26 05:08:32.000000000 +0200
> +++ linux-2.6.22/drivers/hwmon/adm1021.c 2007-07-09 23:42:37.058371876 +0200
> @@ -1,6 +1,6 @@
> /*
> adm1021.c - Part of lm_sensors, Linux kernel modules for hardware
> - monitoring
> + monitoring
Maybe you can align "monitoring" with "Part" while you're here.
> Copyright (c) 1998, 1999 Frodo Looijaard <frodol at dds.nl> and
> Philip Edelbrock <phil at netroedge.com>
>
> @@ -32,11 +32,12 @@
> /* Addresses to scan */
> static unsigned short normal_i2c[] = { 0x18, 0x19, 0x1a,
> 0x29, 0x2a, 0x2b,
> - 0x4c, 0x4d, 0x4e,
> + 0x4c, 0x4d, 0x4e,
> I2C_CLIENT_END };
>
> /* Insmod parameters */
> -I2C_CLIENT_INSMOD_8(adm1021, adm1023, max1617, max1617a, thmc10, lm84, gl523sm, mc1066);
> +I2C_CLIENT_INSMOD_8(adm1021, adm1023, max1617, max1617a, thmc10, lm84, gl523sm,
> + mc1066);
>
> /* adm1021 constants specified below */
>
> @@ -45,8 +46,10 @@ I2C_CLIENT_INSMOD_8(adm1021, adm1023, ma
> #define ADM1021_REG_TEMP 0x00
> #define ADM1021_REG_REMOTE_TEMP 0x01
> #define ADM1021_REG_STATUS 0x02
> -#define ADM1021_REG_MAN_ID 0x0FE /* 0x41 = AMD, 0x49 = TI, 0x4D = Maxim, 0x23 = Genesys , 0x54 = Onsemi*/
> -#define ADM1021_REG_DEV_ID 0x0FF /* ADM1021 = 0x0X, ADM1023 = 0x3X */
> +/* 0x41 = AD, 0x49 = TI, 0x4D = Maxim, 0x23 = Genesys , 0x54 = Onsemi */
> +#define ADM1021_REG_MAN_ID 0x0FE
> +/* ADM1021 = 0x0X, ADM1023 = 0x3X */
> +#define ADM1021_REG_DEV_ID 0x0FF
> #define ADM1021_REG_DIE_CODE 0x0FF /* MAX1617A */
> /* These use different addresses for reading/writing */
> #define ADM1021_REG_CONFIG_R 0x03
> @@ -54,11 +57,11 @@ I2C_CLIENT_INSMOD_8(adm1021, adm1023, ma
> #define ADM1021_REG_CONV_RATE_R 0x04
> #define ADM1021_REG_CONV_RATE_W 0x0A
> /* These are for the ADM1023's additional precision on the remote temp sensor */
> -#define ADM1021_REG_REM_TEMP_PREC 0x010
> -#define ADM1021_REG_REM_OFFSET 0x011
> -#define ADM1021_REG_REM_OFFSET_PREC 0x012
> -#define ADM1021_REG_REM_TOS_PREC 0x013
> -#define ADM1021_REG_REM_THYST_PREC 0x014
> +#define ADM1023_REG_REM_TEMP_PREC 0x010
> +#define ADM1023_REG_REM_OFFSET 0x011
> +#define ADM1023_REG_REM_OFFSET_PREC 0x012
> +#define ADM1023_REG_REM_TOS_PREC 0x013
> +#define ADM1023_REG_REM_THYST_PREC 0x014
Maybe you can also simplify the numbers from 3 digits to 2. Using 3
digits for 8-bit addresses was a rather strange idea.
> /* limits */
> #define ADM1021_REG_TOS_R 0x05
> #define ADM1021_REG_TOS_W 0x0B
> @@ -77,14 +80,13 @@ I2C_CLIENT_INSMOD_8(adm1021, adm1023, ma
> these macros are called: arguments may be evaluated more than once.
> Fixing this is just not worth it. */
> /* Conversions note: 1021 uses normal integer signed-byte format*/
> -#define TEMP_FROM_REG(val) (val > 127 ? (val-256)*1000 : val*1000)
> -#define TEMP_TO_REG(val) (SENSORS_LIMIT((val < 0 ? (val/1000)+256 : val/1000),0,255))
> +#define TEMP_TO_REG(val) (SENSORS_LIMIT((val) / 1000, -128, 127))
Outermost parentheses are not needed.
>
> /* Initial values */
>
> -/* Note: Even though I left the low and high limits named os and hyst,
> -they don't quite work like a thermostat the way the LM75 does. I.e.,
> -a lower temp than THYST actually triggers an alarm instead of
> +/* Note: Even though I left the low and high limits named os and hyst,
> +they don't quite work like a thermostat the way the LM75 does. I.e.,
> +a lower temp than THYST actually triggers an alarm instead of
> clearing it. Weird, ey? --Phil */
>
> /* Each client has this additional data */
> @@ -97,12 +99,12 @@ struct adm1021_data {
> char valid; /* !=0 if following fields are valid */
> unsigned long last_updated; /* In jiffies */
>
> - u8 temp_max; /* Register values */
> - u8 temp_hyst;
> - u8 temp_input;
> - u8 remote_temp_max;
> - u8 remote_temp_hyst;
> - u8 remote_temp_input;
> + s8 temp_max; /* Register values */
> + s8 temp_hyst;
> + s8 temp_input;
> + s8 remote_temp_max;
> + s8 remote_temp_hyst;
> + s8 remote_temp_input;
> u8 alarms;
> /* Special values for ADM1023 only */
> u8 remote_temp_prec;
> @@ -116,9 +118,6 @@ static int adm1021_attach_adapter(struct
> static int adm1021_detect(struct i2c_adapter *adapter, int address, int kind);
> static void adm1021_init_client(struct i2c_client *client);
> static int adm1021_detach_client(struct i2c_client *client);
> -static int adm1021_read_value(struct i2c_client *client, u8 reg);
> -static int adm1021_write_value(struct i2c_client *client, u8 reg,
> - u16 value);
> static struct adm1021_data *adm1021_update_device(struct device *dev);
>
> /* (amalysh) read only mode, otherwise any limit's writing confuse BIOS */
> @@ -139,7 +138,7 @@ static struct i2c_driver adm1021_driver
> static ssize_t show_##value(struct device *dev, struct device_attribute *attr, char *buf) \
You've left some long lines. Given that this is a cleanup patch and it
already folds some of the long lines, maybe you could fold all of them?
> { \
> struct adm1021_data *data = adm1021_update_device(dev); \
> - return sprintf(buf, "%d\n", TEMP_FROM_REG(data->value)); \
> + return sprintf(buf, "%d\n", data->value); \
You're missing a multiplication by 1000 here! And please preserve the
alignment of the trailing backslash.
> }
> show(temp_max);
> show(temp_hyst);
> @@ -148,13 +147,13 @@ show(remote_temp_max);
> show(remote_temp_hyst);
> show(remote_temp_input);
>
> -#define show2(value) \
> -static ssize_t show_##value(struct device *dev, struct device_attribute *attr, char *buf) \
> -{ \
> - struct adm1021_data *data = adm1021_update_device(dev); \
> - return sprintf(buf, "%d\n", data->value); \
> +static ssize_t show_alarms(struct device *dev,
> + struct device_attribute *attr,
> + char *buf)
> +{
> + struct adm1021_data *data = adm1021_update_device(dev);
> + return sprintf(buf, "%u\n", data->alarms);
> }
> -show2(alarms);
>
> #define set(value, reg) \
> static ssize_t set_##value(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) \
> @@ -165,7 +164,7 @@ static ssize_t set_##value(struct device
> \
> mutex_lock(&data->update_lock); \
> data->value = TEMP_TO_REG(temp); \
> - adm1021_write_value(client, reg, data->value); \
> + i2c_smbus_write_byte_data(client, reg, data->value); \
Please preserve the alignment of the trailing backslash.
> mutex_unlock(&data->update_lock); \
> return count; \
> }
> @@ -212,15 +211,20 @@ static int adm1021_detect(struct i2c_ada
> struct adm1021_data *data;
> int err = 0;
> const char *type_name = "";
> + int conv_rate, status, config;
>
> - if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
> + if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {
> + pr_debug("adm1021: detect failed, "
> + "smbus byte data not supported!\n");
> goto error0;
> + }
>
> /* OK. For now, we presume we have a valid client. We now create the
> client structure, even though we cannot fill it completely yet.
> But it allows us to access adm1021_{read,write}_value. */
This comment is now wrong, as you killed adm1021_{read,write}_value.
>
> if (!(data = kzalloc(sizeof(struct adm1021_data), GFP_KERNEL))) {
> + pr_debug("adm1021: detect failed, kzalloc failed!\n");
> err = -ENOMEM;
> goto error0;
> }
> @@ -230,13 +234,17 @@ static int adm1021_detect(struct i2c_ada
> new_client->addr = address;
One cleanup you can add: rename "new_client" to just "client".
> new_client->adapter = adapter;
> new_client->driver = &adm1021_driver;
> - new_client->flags = 0;
> + status = i2c_smbus_read_byte_data(new_client, ADM1021_REG_STATUS);
> + conv_rate = i2c_smbus_read_byte_data(new_client,
> + ADM1021_REG_CONV_RATE_R);
> + config = i2c_smbus_read_byte_data(new_client, ADM1021_REG_CONFIG_R);
>
> /* Now, we do the remaining detection. */
> if (kind < 0) {
> - if ((adm1021_read_value(new_client, ADM1021_REG_STATUS) & 0x03) != 0x00
> - || (adm1021_read_value(new_client, ADM1021_REG_CONFIG_R) & 0x3F) != 0x00
> - || (adm1021_read_value(new_client, ADM1021_REG_CONV_RATE_R) & 0xF8) != 0x00) {
> + if ((status & 0x03) != 0x00 || (config & 0x3F) != 0x00
> + || (conv_rate & 0xF8) != 0x00) {
> + pr_debug("adm1021: detect failed, "
> + "chip not detected!\n");
> err = -ENODEV;
> goto error1;
> }
> @@ -244,9 +252,10 @@ static int adm1021_detect(struct i2c_ada
>
> /* Determine the chip type. */
> if (kind <= 0) {
> - i = adm1021_read_value(new_client, ADM1021_REG_MAN_ID);
> + i = i2c_smbus_read_byte_data(new_client, ADM1021_REG_MAN_ID);
> if (i == 0x41)
> - if ((adm1021_read_value(new_client, ADM1021_REG_DEV_ID) & 0x0F0) == 0x030)
> + if ((i2c_smbus_read_byte_data(new_client,
> + ADM1021_REG_DEV_ID) & 0x0F0) == 0x030)
You can use 0xF0 and 0x30 instead.
> kind = adm1023;
> else
> kind = adm1021;
> @@ -255,15 +264,16 @@ static int adm1021_detect(struct i2c_ada
> else if (i == 0x23)
> kind = gl523sm;
> else if ((i == 0x4d) &&
> - (adm1021_read_value(new_client, ADM1021_REG_DEV_ID) == 0x01))
> + (i2c_smbus_read_byte_data(new_client,
> + ADM1021_REG_DEV_ID) == 0x01))
> kind = max1617a;
> else if (i == 0x54)
> kind = mc1066;
> /* LM84 Mfr ID in a different place, and it has more unused bits */
> - else if (adm1021_read_value(new_client, ADM1021_REG_CONV_RATE_R) == 0x00
> - && (kind == 0 /* skip extra detection */
> - || ((adm1021_read_value(new_client, ADM1021_REG_CONFIG_R) & 0x7F) == 0x00
> - && (adm1021_read_value(new_client, ADM1021_REG_STATUS) & 0xAB) == 0x00)))
> + else if (conv_rate == 0x00
> + && (kind == 0 /* skip extra detection */
> + || ((config & 0x7F) == 0x00
> + && (status & 0xAB) == 0x00)))
> kind = lm84;
> else
> kind = max1617;
> @@ -286,11 +296,12 @@ static int adm1021_detect(struct i2c_ada
> } else if (kind == mc1066) {
> type_name = "mc1066";
> }
> + pr_debug("adm1021: Detected chip %s at adapter %d, address 0x%02x.\n",
> + type_name, i2c_adapter_id(adapter), address);
>
> - /* Fill in the remaining client fields and put it into the global list */
> + /* Fill in the remaining client fields */
> strlcpy(new_client->name, type_name, I2C_NAME_SIZE);
> data->type = kind;
> - data->valid = 0;
> mutex_init(&data->update_lock);
>
> /* Tell the I2C layer a new client has arrived */
> @@ -326,10 +337,10 @@ error0:
> static void adm1021_init_client(struct i2c_client *client)
> {
> /* Enable ADC and disable suspend mode */
> - adm1021_write_value(client, ADM1021_REG_CONFIG_W,
> - adm1021_read_value(client, ADM1021_REG_CONFIG_R) & 0xBF);
> + i2c_smbus_write_byte_data(client, ADM1021_REG_CONFIG_W,
> + i2c_smbus_read_byte_data(client, ADM1021_REG_CONFIG_R) & 0xBF);
> /* Set Conversion rate to 1/sec (this can be tinkered with) */
> - adm1021_write_value(client, ADM1021_REG_CONV_RATE_W, 0x04);
> + i2c_smbus_write_byte_data(client, ADM1021_REG_CONV_RATE_W, 0x04);
> }
>
> static int adm1021_detach_client(struct i2c_client *client)
> @@ -347,19 +358,6 @@ static int adm1021_detach_client(struct
> return 0;
> }
>
> -/* All registers are byte-sized */
> -static int adm1021_read_value(struct i2c_client *client, u8 reg)
> -{
> - return i2c_smbus_read_byte_data(client, reg);
> -}
> -
> -static int adm1021_write_value(struct i2c_client *client, u8 reg, u16 value)
> -{
> - if (!read_only)
> - return i2c_smbus_write_byte_data(client, reg, value);
> - return 0;
> -}
> -
> static struct adm1021_data *adm1021_update_device(struct device *dev)
> {
> struct i2c_client *client = to_i2c_client(dev);
> @@ -371,19 +369,36 @@ static struct adm1021_data *adm1021_upda
> || !data->valid) {
> dev_dbg(&client->dev, "Starting adm1021 update\n");
>
> - data->temp_input = adm1021_read_value(client, ADM1021_REG_TEMP);
> - data->temp_max = adm1021_read_value(client, ADM1021_REG_TOS_R);
> - data->temp_hyst = adm1021_read_value(client, ADM1021_REG_THYST_R);
> - data->remote_temp_input = adm1021_read_value(client, ADM1021_REG_REMOTE_TEMP);
> - data->remote_temp_max = adm1021_read_value(client, ADM1021_REG_REMOTE_TOS_R);
> - data->remote_temp_hyst = adm1021_read_value(client, ADM1021_REG_REMOTE_THYST_R);
> - data->alarms = adm1021_read_value(client, ADM1021_REG_STATUS) & 0x7c;
> + data->temp_input = i2c_smbus_read_byte_data(client,
> + ADM1021_REG_TEMP);
> + data->temp_max = i2c_smbus_read_byte_data(client,
> + ADM1021_REG_TOS_R);
> + data->temp_hyst = i2c_smbus_read_byte_data(client,
> + ADM1021_REG_THYST_R);
> + data->remote_temp_input = i2c_smbus_read_byte_data(client,
> + ADM1021_REG_REMOTE_TEMP);
> + data->remote_temp_max = i2c_smbus_read_byte_data(client,
> + ADM1021_REG_REMOTE_TOS_R);
> + data->remote_temp_hyst = i2c_smbus_read_byte_data(client,
> + ADM1021_REG_REMOTE_THYST_R);
> + data->alarms = i2c_smbus_read_byte_data(client,
> + ADM1021_REG_STATUS) & 0x7c;
> if (data->type == adm1023) {
> - data->remote_temp_prec = adm1021_read_value(client, ADM1021_REG_REM_TEMP_PREC);
> - data->remote_temp_os_prec = adm1021_read_value(client, ADM1021_REG_REM_TOS_PREC);
> - data->remote_temp_hyst_prec = adm1021_read_value(client, ADM1021_REG_REM_THYST_PREC);
> - data->remote_temp_offset = adm1021_read_value(client, ADM1021_REG_REM_OFFSET);
> - data->remote_temp_offset_prec = adm1021_read_value(client, ADM1021_REG_REM_OFFSET_PREC);
> + data->remote_temp_prec =
> + i2c_smbus_read_byte_data(client,
> + ADM1023_REG_REM_TEMP_PREC);
> + data->remote_temp_os_prec =
> + i2c_smbus_read_byte_data(client,
> + ADM1023_REG_REM_TOS_PREC);
> + data->remote_temp_hyst_prec =
> + i2c_smbus_read_byte_data(client,
> + ADM1023_REG_REM_THYST_PREC);
> + data->remote_temp_offset =
> + i2c_smbus_read_byte_data(client,
> + ADM1023_REG_REM_OFFSET);
> + data->remote_temp_offset_prec =
> + i2c_smbus_read_byte_data(client,
> + ADM1023_REG_REM_OFFSET_PREC);
> }
> data->last_updated = jiffies;
> data->valid = 1;
Thanks,
--
Jean Delvare
More information about the lm-sensors
mailing list