diff options
-rw-r--r-- | drivers/hwmon/adm1031.c | 126 |
1 files changed, 62 insertions, 64 deletions
diff --git a/drivers/hwmon/adm1031.c b/drivers/hwmon/adm1031.c index 558d83b25b68..b3e358c65d02 100644 --- a/drivers/hwmon/adm1031.c +++ b/drivers/hwmon/adm1031.c | |||
@@ -5,7 +5,7 @@ | |||
5 | Supports adm1030 / adm1031 | 5 | Supports adm1030 / adm1031 |
6 | Copyright (C) 2004 Alexandre d'Alton <alex@alexdalton.org> | 6 | Copyright (C) 2004 Alexandre d'Alton <alex@alexdalton.org> |
7 | Reworked by Jean Delvare <khali@linux-fr.org> | 7 | Reworked by Jean Delvare <khali@linux-fr.org> |
8 | 8 | ||
9 | This program is free software; you can redistribute it and/or modify | 9 | This program is free software; you can redistribute it and/or modify |
10 | it under the terms of the GNU General Public License as published by | 10 | it under the terms of the GNU General Public License as published by |
11 | the Free Software Foundation; either version 2 of the License, or | 11 | the Free Software Foundation; either version 2 of the License, or |
@@ -32,22 +32,22 @@ | |||
32 | 32 | ||
33 | /* Following macros takes channel parameter starting from 0 to 2 */ | 33 | /* Following macros takes channel parameter starting from 0 to 2 */ |
34 | #define ADM1031_REG_FAN_SPEED(nr) (0x08 + (nr)) | 34 | #define ADM1031_REG_FAN_SPEED(nr) (0x08 + (nr)) |
35 | #define ADM1031_REG_FAN_DIV(nr) (0x20 + (nr)) | 35 | #define ADM1031_REG_FAN_DIV(nr) (0x20 + (nr)) |
36 | #define ADM1031_REG_PWM (0x22) | 36 | #define ADM1031_REG_PWM (0x22) |
37 | #define ADM1031_REG_FAN_MIN(nr) (0x10 + (nr)) | 37 | #define ADM1031_REG_FAN_MIN(nr) (0x10 + (nr)) |
38 | 38 | ||
39 | #define ADM1031_REG_TEMP_MAX(nr) (0x14 + 4*(nr)) | 39 | #define ADM1031_REG_TEMP_MAX(nr) (0x14 + 4 * (nr)) |
40 | #define ADM1031_REG_TEMP_MIN(nr) (0x15 + 4*(nr)) | 40 | #define ADM1031_REG_TEMP_MIN(nr) (0x15 + 4 * (nr)) |
41 | #define ADM1031_REG_TEMP_CRIT(nr) (0x16 + 4*(nr)) | 41 | #define ADM1031_REG_TEMP_CRIT(nr) (0x16 + 4 * (nr)) |
42 | 42 | ||
43 | #define ADM1031_REG_TEMP(nr) (0xa + (nr)) | 43 | #define ADM1031_REG_TEMP(nr) (0x0a + (nr)) |
44 | #define ADM1031_REG_AUTO_TEMP(nr) (0x24 + (nr)) | 44 | #define ADM1031_REG_AUTO_TEMP(nr) (0x24 + (nr)) |
45 | 45 | ||
46 | #define ADM1031_REG_STATUS(nr) (0x2 + (nr)) | 46 | #define ADM1031_REG_STATUS(nr) (0x2 + (nr)) |
47 | 47 | ||
48 | #define ADM1031_REG_CONF1 0x0 | 48 | #define ADM1031_REG_CONF1 0x00 |
49 | #define ADM1031_REG_CONF2 0x1 | 49 | #define ADM1031_REG_CONF2 0x01 |
50 | #define ADM1031_REG_EXT_TEMP 0x6 | 50 | #define ADM1031_REG_EXT_TEMP 0x06 |
51 | 51 | ||
52 | #define ADM1031_CONF1_MONITOR_ENABLE 0x01 /* Monitoring enable */ | 52 | #define ADM1031_CONF1_MONITOR_ENABLE 0x01 /* Monitoring enable */ |
53 | #define ADM1031_CONF1_PWM_INVERT 0x08 /* PWM Invert */ | 53 | #define ADM1031_CONF1_PWM_INVERT 0x08 /* PWM Invert */ |
@@ -78,7 +78,7 @@ struct adm1031_data { | |||
78 | /* The chan_select_table contains the possible configurations for | 78 | /* The chan_select_table contains the possible configurations for |
79 | * auto fan control. | 79 | * auto fan control. |
80 | */ | 80 | */ |
81 | auto_chan_table_t *chan_select_table; | 81 | const auto_chan_table_t *chan_select_table; |
82 | u16 alarm; | 82 | u16 alarm; |
83 | u8 conf1; | 83 | u8 conf1; |
84 | u8 conf2; | 84 | u8 conf2; |
@@ -181,25 +181,25 @@ static int AUTO_TEMP_MAX_TO_REG(int val, int reg, int pwm) | |||
181 | #define GET_FAN_AUTO_BITFIELD(data, idx) \ | 181 | #define GET_FAN_AUTO_BITFIELD(data, idx) \ |
182 | (*(data)->chan_select_table)[FAN_CHAN_FROM_REG((data)->conf1)][idx%2] | 182 | (*(data)->chan_select_table)[FAN_CHAN_FROM_REG((data)->conf1)][idx%2] |
183 | 183 | ||
184 | /* The tables below contains the possible values for the auto fan | 184 | /* The tables below contains the possible values for the auto fan |
185 | * control bitfields. the index in the table is the register value. | 185 | * control bitfields. the index in the table is the register value. |
186 | * MSb is the auto fan control enable bit, so the four first entries | 186 | * MSb is the auto fan control enable bit, so the four first entries |
187 | * in the table disables auto fan control when both bitfields are zero. | 187 | * in the table disables auto fan control when both bitfields are zero. |
188 | */ | 188 | */ |
189 | static auto_chan_table_t auto_channel_select_table_adm1031 = { | 189 | static const auto_chan_table_t auto_channel_select_table_adm1031 = { |
190 | {0, 0}, {0, 0}, {0, 0}, {0, 0}, | 190 | { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, |
191 | {2 /*0b010 */ , 4 /*0b100 */ }, | 191 | { 2 /* 0b010 */ , 4 /* 0b100 */ }, |
192 | {2 /*0b010 */ , 2 /*0b010 */ }, | 192 | { 2 /* 0b010 */ , 2 /* 0b010 */ }, |
193 | {4 /*0b100 */ , 4 /*0b100 */ }, | 193 | { 4 /* 0b100 */ , 4 /* 0b100 */ }, |
194 | {7 /*0b111 */ , 7 /*0b111 */ }, | 194 | { 7 /* 0b111 */ , 7 /* 0b111 */ }, |
195 | }; | 195 | }; |
196 | 196 | ||
197 | static auto_chan_table_t auto_channel_select_table_adm1030 = { | 197 | static const auto_chan_table_t auto_channel_select_table_adm1030 = { |
198 | {0, 0}, {0, 0}, {0, 0}, {0, 0}, | 198 | { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, |
199 | {2 /*0b10 */ , 0}, | 199 | { 2 /* 0b10 */ , 0 }, |
200 | {0xff /*invalid */ , 0}, | 200 | { 0xff /* invalid */ , 0 }, |
201 | {0xff /*invalid */ , 0}, | 201 | { 0xff /* invalid */ , 0 }, |
202 | {3 /*0b11 */ , 0}, | 202 | { 3 /* 0b11 */ , 0 }, |
203 | }; | 203 | }; |
204 | 204 | ||
205 | /* That function checks if a bitfield is valid and returns the other bitfield | 205 | /* That function checks if a bitfield is valid and returns the other bitfield |
@@ -228,8 +228,8 @@ get_fan_auto_nearest(struct adm1031_data *data, | |||
228 | break; | 228 | break; |
229 | } else if (val == (*data->chan_select_table)[i][chan] && | 229 | } else if (val == (*data->chan_select_table)[i][chan] && |
230 | first_match == -1) { | 230 | first_match == -1) { |
231 | /* Save the first match in case of an exact match has not been | 231 | /* Save the first match in case of an exact match has |
232 | * found | 232 | * not been found |
233 | */ | 233 | */ |
234 | first_match = i; | 234 | first_match = i; |
235 | } | 235 | } |
@@ -264,16 +264,17 @@ set_fan_auto_channel(struct device *dev, const char *buf, size_t count, int nr) | |||
264 | old_fan_mode = data->conf1; | 264 | old_fan_mode = data->conf1; |
265 | 265 | ||
266 | mutex_lock(&data->update_lock); | 266 | mutex_lock(&data->update_lock); |
267 | 267 | ||
268 | if ((ret = get_fan_auto_nearest(data, nr, val, data->conf1, ®))) { | 268 | if ((ret = get_fan_auto_nearest(data, nr, val, data->conf1, ®))) { |
269 | mutex_unlock(&data->update_lock); | 269 | mutex_unlock(&data->update_lock); |
270 | return ret; | 270 | return ret; |
271 | } | 271 | } |
272 | if (((data->conf1 = FAN_CHAN_TO_REG(reg, data->conf1)) & ADM1031_CONF1_AUTO_MODE) ^ | 272 | data->conf1 = FAN_CHAN_TO_REG(reg, data->conf1); |
273 | if ((data->conf1 & ADM1031_CONF1_AUTO_MODE) ^ | ||
273 | (old_fan_mode & ADM1031_CONF1_AUTO_MODE)) { | 274 | (old_fan_mode & ADM1031_CONF1_AUTO_MODE)) { |
274 | if (data->conf1 & ADM1031_CONF1_AUTO_MODE){ | 275 | if (data->conf1 & ADM1031_CONF1_AUTO_MODE){ |
275 | /* Switch to Auto Fan Mode | 276 | /* Switch to Auto Fan Mode |
276 | * Save PWM registers | 277 | * Save PWM registers |
277 | * Set PWM registers to 33% Both */ | 278 | * Set PWM registers to 33% Both */ |
278 | data->old_pwm[0] = data->pwm[0]; | 279 | data->old_pwm[0] = data->pwm[0]; |
279 | data->old_pwm[1] = data->pwm[1]; | 280 | data->old_pwm[1] = data->pwm[1]; |
@@ -283,7 +284,7 @@ set_fan_auto_channel(struct device *dev, const char *buf, size_t count, int nr) | |||
283 | data->pwm[0] = data->old_pwm[0]; | 284 | data->pwm[0] = data->old_pwm[0]; |
284 | data->pwm[1] = data->old_pwm[1]; | 285 | data->pwm[1] = data->old_pwm[1]; |
285 | /* Restore PWM registers */ | 286 | /* Restore PWM registers */ |
286 | adm1031_write_value(client, ADM1031_REG_PWM, | 287 | adm1031_write_value(client, ADM1031_REG_PWM, |
287 | data->pwm[0] | (data->pwm[1] << 4)); | 288 | data->pwm[0] | (data->pwm[1] << 4)); |
288 | } | 289 | } |
289 | } | 290 | } |
@@ -314,7 +315,7 @@ fan_auto_channel_offset(2); | |||
314 | static ssize_t show_auto_temp_off(struct device *dev, char *buf, int nr) | 315 | static ssize_t show_auto_temp_off(struct device *dev, char *buf, int nr) |
315 | { | 316 | { |
316 | struct adm1031_data *data = adm1031_update_device(dev); | 317 | struct adm1031_data *data = adm1031_update_device(dev); |
317 | return sprintf(buf, "%d\n", | 318 | return sprintf(buf, "%d\n", |
318 | AUTO_TEMP_OFF_FROM_REG(data->auto_temp[nr])); | 319 | AUTO_TEMP_OFF_FROM_REG(data->auto_temp[nr])); |
319 | } | 320 | } |
320 | static ssize_t show_auto_temp_min(struct device *dev, char *buf, int nr) | 321 | static ssize_t show_auto_temp_min(struct device *dev, char *buf, int nr) |
@@ -407,7 +408,7 @@ set_pwm(struct device *dev, const char *buf, size_t count, int nr) | |||
407 | int reg; | 408 | int reg; |
408 | 409 | ||
409 | mutex_lock(&data->update_lock); | 410 | mutex_lock(&data->update_lock); |
410 | if ((data->conf1 & ADM1031_CONF1_AUTO_MODE) && | 411 | if ((data->conf1 & ADM1031_CONF1_AUTO_MODE) && |
411 | (((val>>4) & 0xf) != 5)) { | 412 | (((val>>4) & 0xf) != 5)) { |
412 | /* In automatic mode, the only PWM accepted is 33% */ | 413 | /* In automatic mode, the only PWM accepted is 33% */ |
413 | mutex_unlock(&data->update_lock); | 414 | mutex_unlock(&data->update_lock); |
@@ -471,7 +472,7 @@ static int trust_fan_readings(struct adm1031_data *data, int chan) | |||
471 | AUTO_TEMP_MIN_FROM_REG_DEG(data->auto_temp[0]) | 472 | AUTO_TEMP_MIN_FROM_REG_DEG(data->auto_temp[0]) |
472 | || data->temp[1] >= | 473 | || data->temp[1] >= |
473 | AUTO_TEMP_MIN_FROM_REG_DEG(data->auto_temp[1]) | 474 | AUTO_TEMP_MIN_FROM_REG_DEG(data->auto_temp[1]) |
474 | || (data->chip_type == adm1031 | 475 | || (data->chip_type == adm1031 |
475 | && data->temp[2] >= | 476 | && data->temp[2] >= |
476 | AUTO_TEMP_MIN_FROM_REG_DEG(data->auto_temp[2])); | 477 | AUTO_TEMP_MIN_FROM_REG_DEG(data->auto_temp[2])); |
477 | break; | 478 | break; |
@@ -514,7 +515,7 @@ set_fan_min(struct device *dev, const char *buf, size_t count, int nr) | |||
514 | 515 | ||
515 | mutex_lock(&data->update_lock); | 516 | mutex_lock(&data->update_lock); |
516 | if (val) { | 517 | if (val) { |
517 | data->fan_min[nr] = | 518 | data->fan_min[nr] = |
518 | FAN_TO_REG(val, FAN_DIV_FROM_REG(data->fan_div[nr])); | 519 | FAN_TO_REG(val, FAN_DIV_FROM_REG(data->fan_div[nr])); |
519 | } else { | 520 | } else { |
520 | data->fan_min[nr] = 0xff; | 521 | data->fan_min[nr] = 0xff; |
@@ -535,12 +536,12 @@ set_fan_div(struct device *dev, const char *buf, size_t count, int nr) | |||
535 | 536 | ||
536 | tmp = val == 8 ? 0xc0 : | 537 | tmp = val == 8 ? 0xc0 : |
537 | val == 4 ? 0x80 : | 538 | val == 4 ? 0x80 : |
538 | val == 2 ? 0x40 : | 539 | val == 2 ? 0x40 : |
539 | val == 1 ? 0x00 : | 540 | val == 1 ? 0x00 : |
540 | 0xff; | 541 | 0xff; |
541 | if (tmp == 0xff) | 542 | if (tmp == 0xff) |
542 | return -EINVAL; | 543 | return -EINVAL; |
543 | 544 | ||
544 | mutex_lock(&data->update_lock); | 545 | mutex_lock(&data->update_lock); |
545 | /* Get fresh readings */ | 546 | /* Get fresh readings */ |
546 | data->fan_div[nr] = adm1031_read_value(client, | 547 | data->fan_div[nr] = adm1031_read_value(client, |
@@ -550,14 +551,13 @@ set_fan_div(struct device *dev, const char *buf, size_t count, int nr) | |||
550 | 551 | ||
551 | /* Write the new clock divider and fan min */ | 552 | /* Write the new clock divider and fan min */ |
552 | old_div = FAN_DIV_FROM_REG(data->fan_div[nr]); | 553 | old_div = FAN_DIV_FROM_REG(data->fan_div[nr]); |
553 | data->fan_div[nr] = (tmp & 0xC0) | (0x3f & data->fan_div[nr]); | 554 | data->fan_div[nr] = tmp | (0x3f & data->fan_div[nr]); |
554 | new_min = data->fan_min[nr] * old_div / | 555 | new_min = data->fan_min[nr] * old_div / val; |
555 | FAN_DIV_FROM_REG(data->fan_div[nr]); | ||
556 | data->fan_min[nr] = new_min > 0xff ? 0xff : new_min; | 556 | data->fan_min[nr] = new_min > 0xff ? 0xff : new_min; |
557 | 557 | ||
558 | adm1031_write_value(client, ADM1031_REG_FAN_DIV(nr), | 558 | adm1031_write_value(client, ADM1031_REG_FAN_DIV(nr), |
559 | data->fan_div[nr]); | 559 | data->fan_div[nr]); |
560 | adm1031_write_value(client, ADM1031_REG_FAN_MIN(nr), | 560 | adm1031_write_value(client, ADM1031_REG_FAN_MIN(nr), |
561 | data->fan_min[nr]); | 561 | data->fan_min[nr]); |
562 | 562 | ||
563 | /* Invalidate the cache: fan speed is no longer valid */ | 563 | /* Invalidate the cache: fan speed is no longer valid */ |
@@ -796,7 +796,7 @@ static const struct attribute_group adm1031_group_opt = { | |||
796 | /* This function is called by i2c_probe */ | 796 | /* This function is called by i2c_probe */ |
797 | static int adm1031_detect(struct i2c_adapter *adapter, int address, int kind) | 797 | static int adm1031_detect(struct i2c_adapter *adapter, int address, int kind) |
798 | { | 798 | { |
799 | struct i2c_client *new_client; | 799 | struct i2c_client *client; |
800 | struct adm1031_data *data; | 800 | struct adm1031_data *data; |
801 | int err = 0; | 801 | int err = 0; |
802 | const char *name = ""; | 802 | const char *name = ""; |
@@ -809,17 +809,16 @@ static int adm1031_detect(struct i2c_adapter *adapter, int address, int kind) | |||
809 | goto exit; | 809 | goto exit; |
810 | } | 810 | } |
811 | 811 | ||
812 | new_client = &data->client; | 812 | client = &data->client; |
813 | i2c_set_clientdata(new_client, data); | 813 | i2c_set_clientdata(client, data); |
814 | new_client->addr = address; | 814 | client->addr = address; |
815 | new_client->adapter = adapter; | 815 | client->adapter = adapter; |
816 | new_client->driver = &adm1031_driver; | 816 | client->driver = &adm1031_driver; |
817 | new_client->flags = 0; | ||
818 | 817 | ||
819 | if (kind < 0) { | 818 | if (kind < 0) { |
820 | int id, co; | 819 | int id, co; |
821 | id = i2c_smbus_read_byte_data(new_client, 0x3d); | 820 | id = i2c_smbus_read_byte_data(client, 0x3d); |
822 | co = i2c_smbus_read_byte_data(new_client, 0x3e); | 821 | co = i2c_smbus_read_byte_data(client, 0x3e); |
823 | 822 | ||
824 | if (!((id == 0x31 || id == 0x30) && co == 0x41)) | 823 | if (!((id == 0x31 || id == 0x30) && co == 0x41)) |
825 | goto exit_free; | 824 | goto exit_free; |
@@ -840,28 +839,27 @@ static int adm1031_detect(struct i2c_adapter *adapter, int address, int kind) | |||
840 | } | 839 | } |
841 | data->chip_type = kind; | 840 | data->chip_type = kind; |
842 | 841 | ||
843 | strlcpy(new_client->name, name, I2C_NAME_SIZE); | 842 | strlcpy(client->name, name, I2C_NAME_SIZE); |
844 | data->valid = 0; | ||
845 | mutex_init(&data->update_lock); | 843 | mutex_init(&data->update_lock); |
846 | 844 | ||
847 | /* Tell the I2C layer a new client has arrived */ | 845 | /* Tell the I2C layer a new client has arrived */ |
848 | if ((err = i2c_attach_client(new_client))) | 846 | if ((err = i2c_attach_client(client))) |
849 | goto exit_free; | 847 | goto exit_free; |
850 | 848 | ||
851 | /* Initialize the ADM1031 chip */ | 849 | /* Initialize the ADM1031 chip */ |
852 | adm1031_init_client(new_client); | 850 | adm1031_init_client(client); |
853 | 851 | ||
854 | /* Register sysfs hooks */ | 852 | /* Register sysfs hooks */ |
855 | if ((err = sysfs_create_group(&new_client->dev.kobj, &adm1031_group))) | 853 | if ((err = sysfs_create_group(&client->dev.kobj, &adm1031_group))) |
856 | goto exit_detach; | 854 | goto exit_detach; |
857 | 855 | ||
858 | if (kind == adm1031) { | 856 | if (kind == adm1031) { |
859 | if ((err = sysfs_create_group(&new_client->dev.kobj, | 857 | if ((err = sysfs_create_group(&client->dev.kobj, |
860 | &adm1031_group_opt))) | 858 | &adm1031_group_opt))) |
861 | goto exit_remove; | 859 | goto exit_remove; |
862 | } | 860 | } |
863 | 861 | ||
864 | data->hwmon_dev = hwmon_device_register(&new_client->dev); | 862 | data->hwmon_dev = hwmon_device_register(&client->dev); |
865 | if (IS_ERR(data->hwmon_dev)) { | 863 | if (IS_ERR(data->hwmon_dev)) { |
866 | err = PTR_ERR(data->hwmon_dev); | 864 | err = PTR_ERR(data->hwmon_dev); |
867 | goto exit_remove; | 865 | goto exit_remove; |
@@ -870,10 +868,10 @@ static int adm1031_detect(struct i2c_adapter *adapter, int address, int kind) | |||
870 | return 0; | 868 | return 0; |
871 | 869 | ||
872 | exit_remove: | 870 | exit_remove: |
873 | sysfs_remove_group(&new_client->dev.kobj, &adm1031_group); | 871 | sysfs_remove_group(&client->dev.kobj, &adm1031_group); |
874 | sysfs_remove_group(&new_client->dev.kobj, &adm1031_group_opt); | 872 | sysfs_remove_group(&client->dev.kobj, &adm1031_group_opt); |
875 | exit_detach: | 873 | exit_detach: |
876 | i2c_detach_client(new_client); | 874 | i2c_detach_client(client); |
877 | exit_free: | 875 | exit_free: |
878 | kfree(data); | 876 | kfree(data); |
879 | exit: | 877 | exit: |
@@ -905,7 +903,7 @@ static void adm1031_init_client(struct i2c_client *client) | |||
905 | if (data->chip_type == adm1031) { | 903 | if (data->chip_type == adm1031) { |
906 | mask |= (ADM1031_CONF2_PWM2_ENABLE | | 904 | mask |= (ADM1031_CONF2_PWM2_ENABLE | |
907 | ADM1031_CONF2_TACH2_ENABLE); | 905 | ADM1031_CONF2_TACH2_ENABLE); |
908 | } | 906 | } |
909 | /* Initialize the ADM1031 chip (enables fan speed reading ) */ | 907 | /* Initialize the ADM1031 chip (enables fan speed reading ) */ |
910 | read_val = adm1031_read_value(client, ADM1031_REG_CONF2); | 908 | read_val = adm1031_read_value(client, ADM1031_REG_CONF2); |
911 | if ((read_val | mask) != read_val) { | 909 | if ((read_val | mask) != read_val) { |
@@ -984,7 +982,7 @@ static struct adm1031_data *adm1031_update_device(struct device *dev) | |||
984 | if (data->chip_type == adm1030) { | 982 | if (data->chip_type == adm1030) { |
985 | data->alarm &= 0xc0ff; | 983 | data->alarm &= 0xc0ff; |
986 | } | 984 | } |
987 | 985 | ||
988 | for (chan=0; chan<(data->chip_type == adm1030 ? 1 : 2); chan++) { | 986 | for (chan=0; chan<(data->chip_type == adm1030 ? 1 : 2); chan++) { |
989 | data->fan_div[chan] = | 987 | data->fan_div[chan] = |
990 | adm1031_read_value(client, ADM1031_REG_FAN_DIV(chan)); | 988 | adm1031_read_value(client, ADM1031_REG_FAN_DIV(chan)); |
@@ -993,7 +991,7 @@ static struct adm1031_data *adm1031_update_device(struct device *dev) | |||
993 | data->fan[chan] = | 991 | data->fan[chan] = |
994 | adm1031_read_value(client, ADM1031_REG_FAN_SPEED(chan)); | 992 | adm1031_read_value(client, ADM1031_REG_FAN_SPEED(chan)); |
995 | data->pwm[chan] = | 993 | data->pwm[chan] = |
996 | 0xf & (adm1031_read_value(client, ADM1031_REG_PWM) >> | 994 | 0xf & (adm1031_read_value(client, ADM1031_REG_PWM) >> |
997 | (4*chan)); | 995 | (4*chan)); |
998 | } | 996 | } |
999 | data->last_updated = jiffies; | 997 | data->last_updated = jiffies; |