hwmon: (lm90) Introduce function to update configuration register
The code to update the configuration register is repeated several times. Move it into a separate function. At the same time, un-inline lm90_select_remote_channel() and leave it up to the compiler to decide what to do with it. Also remove the 'client' argument from lm90_select_remote_channel() and from lm90_write_convrate() and take it from struct lm90_data instead where needed. This patch reduces code size by more than 800 bytes on x86_64. Cc: Boyang Yu <byu@arista.com> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
This commit is contained in:
parent
b849e5d18c
commit
7a1d220ccb
|
@ -543,6 +543,21 @@ static int lm90_read16(struct i2c_client *client, u8 regh, u8 regl)
|
|||
return (newh << 8) | l;
|
||||
}
|
||||
|
||||
static int lm90_update_confreg(struct lm90_data *data, u8 config)
|
||||
{
|
||||
if (data->config != config) {
|
||||
int err;
|
||||
|
||||
err = i2c_smbus_write_byte_data(data->client,
|
||||
LM90_REG_W_CONFIG1,
|
||||
config);
|
||||
if (err)
|
||||
return err;
|
||||
data->config = config;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* client->update_lock must be held when calling this function (unless we are
|
||||
* in detection or initialization steps), and while a remote channel other
|
||||
|
@ -551,53 +566,37 @@ static int lm90_read16(struct i2c_client *client, u8 regh, u8 regl)
|
|||
* various registers have different meanings as a result of selecting a
|
||||
* non-default remote channel.
|
||||
*/
|
||||
static inline int lm90_select_remote_channel(struct i2c_client *client,
|
||||
struct lm90_data *data,
|
||||
int channel)
|
||||
static int lm90_select_remote_channel(struct lm90_data *data, int channel)
|
||||
{
|
||||
int err = 0;
|
||||
|
||||
if (data->kind == max6696) {
|
||||
u8 config = data->config & ~0x08;
|
||||
int err;
|
||||
|
||||
if (channel)
|
||||
config |= 0x08;
|
||||
if (data->config != config) {
|
||||
err = i2c_smbus_write_byte_data(client,
|
||||
LM90_REG_W_CONFIG1,
|
||||
config);
|
||||
if (err)
|
||||
return err;
|
||||
data->config = config;
|
||||
}
|
||||
err = lm90_update_confreg(data, config);
|
||||
}
|
||||
return 0;
|
||||
return err;
|
||||
}
|
||||
|
||||
static int lm90_write_convrate(struct i2c_client *client,
|
||||
struct lm90_data *data, int val)
|
||||
static int lm90_write_convrate(struct lm90_data *data, int val)
|
||||
{
|
||||
u8 config = data->config;
|
||||
int err;
|
||||
|
||||
/* Save config and pause conversion */
|
||||
if (data->flags & LM90_PAUSE_FOR_CONFIG) {
|
||||
config |= 0x40;
|
||||
if (data->config != config) {
|
||||
err = i2c_smbus_write_byte_data(client,
|
||||
LM90_REG_W_CONFIG1,
|
||||
config);
|
||||
if (err < 0)
|
||||
return err;
|
||||
}
|
||||
err = lm90_update_confreg(data, config | 0x40);
|
||||
if (err < 0)
|
||||
return err;
|
||||
}
|
||||
|
||||
/* Set conv rate */
|
||||
err = i2c_smbus_write_byte_data(client, LM90_REG_W_CONVRATE, val);
|
||||
err = i2c_smbus_write_byte_data(data->client, LM90_REG_W_CONVRATE, val);
|
||||
|
||||
/* Revert change to config */
|
||||
if (data->config != config)
|
||||
i2c_smbus_write_byte_data(client, LM90_REG_W_CONFIG1,
|
||||
data->config);
|
||||
lm90_update_confreg(data, config);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
@ -622,7 +621,7 @@ static int lm90_set_convrate(struct i2c_client *client, struct lm90_data *data,
|
|||
if (interval >= update_interval * 3 / 4)
|
||||
break;
|
||||
|
||||
err = lm90_write_convrate(client, data, i);
|
||||
err = lm90_write_convrate(data, i);
|
||||
data->update_interval = DIV_ROUND_CLOSEST(update_interval, 64);
|
||||
return err;
|
||||
}
|
||||
|
@ -693,7 +692,7 @@ static int lm90_update_limits(struct device *dev)
|
|||
}
|
||||
|
||||
if (data->kind == max6696) {
|
||||
val = lm90_select_remote_channel(client, data, 1);
|
||||
val = lm90_select_remote_channel(data, 1);
|
||||
if (val < 0)
|
||||
return val;
|
||||
|
||||
|
@ -717,7 +716,7 @@ static int lm90_update_limits(struct device *dev)
|
|||
return val;
|
||||
data->temp11[REMOTE2_HIGH] = val << 8;
|
||||
|
||||
lm90_select_remote_channel(client, data, 0);
|
||||
lm90_select_remote_channel(data, 0);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -777,19 +776,19 @@ static int lm90_update_device(struct device *dev)
|
|||
data->alarms = val; /* lower 8 bit of alarms */
|
||||
|
||||
if (data->kind == max6696) {
|
||||
val = lm90_select_remote_channel(client, data, 1);
|
||||
val = lm90_select_remote_channel(data, 1);
|
||||
if (val < 0)
|
||||
return val;
|
||||
|
||||
val = lm90_read16(client, LM90_REG_R_REMOTE_TEMPH,
|
||||
LM90_REG_R_REMOTE_TEMPL);
|
||||
if (val < 0) {
|
||||
lm90_select_remote_channel(client, data, 0);
|
||||
lm90_select_remote_channel(data, 0);
|
||||
return val;
|
||||
}
|
||||
data->temp11[REMOTE2_TEMP] = val;
|
||||
|
||||
lm90_select_remote_channel(client, data, 0);
|
||||
lm90_select_remote_channel(data, 0);
|
||||
|
||||
val = lm90_read_reg(client, MAX6696_REG_R_STATUS2);
|
||||
if (val < 0)
|
||||
|
@ -805,10 +804,7 @@ static int lm90_update_device(struct device *dev)
|
|||
!(data->alarms & data->alert_alarms)) {
|
||||
if (data->config & 0x80) {
|
||||
dev_dbg(&client->dev, "Re-enabling ALERT#\n");
|
||||
data->config &= ~0x80;
|
||||
i2c_smbus_write_byte_data(client,
|
||||
LM90_REG_W_CONFIG1,
|
||||
data->config);
|
||||
lm90_update_confreg(data, data->config & ~0x80);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1026,7 +1022,7 @@ static int lm90_set_temp11(struct lm90_data *data, int index, long val)
|
|||
else
|
||||
data->temp11[index] = temp_to_s8(val) << 8;
|
||||
|
||||
lm90_select_remote_channel(client, data, index >= 3);
|
||||
lm90_select_remote_channel(data, index >= 3);
|
||||
err = i2c_smbus_write_byte_data(client, regp->high,
|
||||
data->temp11[index] >> 8);
|
||||
if (err < 0)
|
||||
|
@ -1035,7 +1031,7 @@ static int lm90_set_temp11(struct lm90_data *data, int index, long val)
|
|||
err = i2c_smbus_write_byte_data(client, regp->low,
|
||||
data->temp11[index] & 0xff);
|
||||
|
||||
lm90_select_remote_channel(client, data, 0);
|
||||
lm90_select_remote_channel(data, 0);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -1084,9 +1080,9 @@ static int lm90_set_temp8(struct lm90_data *data, int index, long val)
|
|||
else
|
||||
data->temp8[index] = temp_to_s8(val);
|
||||
|
||||
lm90_select_remote_channel(client, data, index >= 6);
|
||||
lm90_select_remote_channel(data, index >= 6);
|
||||
err = i2c_smbus_write_byte_data(client, reg[index], data->temp8[index]);
|
||||
lm90_select_remote_channel(client, data, 0);
|
||||
lm90_select_remote_channel(data, 0);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
@ -1625,7 +1621,7 @@ static void lm90_restore_conf(void *_data)
|
|||
struct i2c_client *client = data->client;
|
||||
|
||||
/* Restore initial configuration */
|
||||
lm90_write_convrate(client, data, data->convrate_orig);
|
||||
lm90_write_convrate(data, data->convrate_orig);
|
||||
i2c_smbus_write_byte_data(client, LM90_REG_W_CONFIG1,
|
||||
data->config_orig);
|
||||
}
|
||||
|
@ -1671,10 +1667,7 @@ static int lm90_init_client(struct i2c_client *client, struct lm90_data *data)
|
|||
config &= ~0x08;
|
||||
|
||||
config &= 0xBF; /* run */
|
||||
if (config != data->config) { /* Only write if changed */
|
||||
i2c_smbus_write_byte_data(client, LM90_REG_W_CONFIG1, config);
|
||||
data->config = config;
|
||||
}
|
||||
lm90_update_confreg(data, config);
|
||||
|
||||
return devm_add_action_or_reset(&client->dev, lm90_restore_conf, data);
|
||||
}
|
||||
|
@ -1909,9 +1902,7 @@ static void lm90_alert(struct i2c_client *client, enum i2c_alert_protocol type,
|
|||
if ((data->flags & LM90_HAVE_BROKEN_ALERT) &&
|
||||
(alarms & data->alert_alarms)) {
|
||||
dev_dbg(&client->dev, "Disabling ALERT#\n");
|
||||
data->config |= 0x80;
|
||||
i2c_smbus_write_byte_data(client, LM90_REG_W_CONFIG1,
|
||||
data->config);
|
||||
lm90_update_confreg(data, data->config | 0x80);
|
||||
}
|
||||
} else {
|
||||
dev_info(&client->dev, "Everything OK\n");
|
||||
|
|
Loading…
Reference in New Issue