Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 220474
b: refs/heads/master
c: b2469f4
h: refs/heads/master
v: v3
  • Loading branch information
Jean Delvare authored and Jean Delvare committed Oct 28, 2010
1 parent 29bcf24 commit 65c6947
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 44 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 093d1a4794cc23dd221019eb1cdf42b16b48abcc
refs/heads/master: b2469f422f9ee2054359c4ec609c3bdb1f2d52f5
93 changes: 50 additions & 43 deletions trunk/drivers/hwmon/w83795.c
Original file line number Diff line number Diff line change
Expand Up @@ -360,60 +360,67 @@ struct w83795_data {

/*
* Hardware access
* We assume that nobdody can change the bank outside the driver.
*/

/* Ignore the possibility that somebody change bank outside the driver
* Must be called with data->update_lock held, except during initialization */
static u8 w83795_read(struct i2c_client *client, u16 reg)
/* Must be called with data->update_lock held, except during initialization */
static int w83795_set_bank(struct i2c_client *client, u8 bank)
{
struct w83795_data *data = i2c_get_clientdata(client);
u8 res = 0xff;
u8 new_bank = reg >> 8;

new_bank |= data->bank & 0xfc;
if (data->bank != new_bank) {
if (i2c_smbus_write_byte_data
(client, W83795_REG_BANKSEL, new_bank) >= 0)
data->bank = new_bank;
else {
dev_err(&client->dev,
"set bank to %d failed, fall back "
"to bank %d, read reg 0x%x error\n",
new_bank, data->bank, reg);
res = 0x0; /* read 0x0 from the chip */
goto END;
}
int err;

/* If the same bank is already set, nothing to do */
if ((data->bank & 0x07) == bank)
return 0;

/* Change to new bank, preserve all other bits */
bank |= data->bank & ~0x07;
err = i2c_smbus_write_byte_data(client, W83795_REG_BANKSEL, bank);
if (err < 0) {
dev_err(&client->dev,
"Failed to set bank to %d, err %d\n",
(int)bank, err);
return err;
}
res = i2c_smbus_read_byte_data(client, reg & 0xff);
END:
return res;
data->bank = bank;

return 0;
}

/* Must be called with data->update_lock held, except during initialization */
static int w83795_write(struct i2c_client *client, u16 reg, u8 value)
static u8 w83795_read(struct i2c_client *client, u16 reg)
{
struct w83795_data *data = i2c_get_clientdata(client);
int res;
u8 new_bank = reg >> 8;

new_bank |= data->bank & 0xfc;
if (data->bank != new_bank) {
res = i2c_smbus_write_byte_data(client, W83795_REG_BANKSEL,
new_bank);
if (res >= 0)
data->bank = new_bank;
else {
dev_err(&client->dev,
"set bank to %d failed, fall back "
"to bank %d, write reg 0x%x error\n",
new_bank, data->bank, reg);
goto END;
}
int err;

err = w83795_set_bank(client, reg >> 8);
if (err < 0)
return 0x00; /* Arbitrary */

err = i2c_smbus_read_byte_data(client, reg & 0xff);
if (err < 0) {
dev_err(&client->dev,
"Failed to read from register 0x%03x, err %d\n",
(int)reg, err);
return 0x00; /* Arbitrary */
}
return err;
}

res = i2c_smbus_write_byte_data(client, reg & 0xff, value);
END:
return res;
/* Must be called with data->update_lock held, except during initialization */
static int w83795_write(struct i2c_client *client, u16 reg, u8 value)
{
int err;

err = w83795_set_bank(client, reg >> 8);
if (err < 0)
return err;

err = i2c_smbus_write_byte_data(client, reg & 0xff, value);
if (err < 0)
dev_err(&client->dev,
"Failed to write to register 0x%03x, err %d\n",
(int)reg, err);
return err;
}

static struct w83795_data *w83795_update_device(struct device *dev)
Expand Down

0 comments on commit 65c6947

Please sign in to comment.