diff options
author | Andreas Schallenberg <Andreas.Schallenberg@3alitytechnica.com> | 2012-05-21 03:52:43 -0400 |
---|---|---|
committer | Grant Likely <grant.likely@secretlab.ca> | 2012-05-25 20:50:41 -0400 |
commit | 96b70641b937e99c1579cb6ebbcdb7b0af98cdd0 (patch) | |
tree | c2a31be5f5160f345b5f3f1c450d01b158dc8b96 /drivers/gpio/gpio-pca953x.c | |
parent | 0df2c999f748c9528f6629f45baaa86118d60cd1 (diff) |
gpio/tca6424: merge I2C transactions, remove cast
This is a follow-up to ae79c1904 "[PATCH v2] Add support for TCA6424"
merged in the v3.5 merge window. It fixes comments made when the
patch was merged.
- Use 3 byte transfers instead of two separate transfers (2+1 byte)
- An unnecessary cast removed
Signed-off-by: Andreas Schallenberg <Andreas.Schallenberg@3alitytechnica.com>
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
Diffstat (limited to 'drivers/gpio/gpio-pca953x.c')
-rw-r--r-- | drivers/gpio/gpio-pca953x.c | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c index 1c313c710be3..de24af202447 100644 --- a/drivers/gpio/gpio-pca953x.c +++ b/drivers/gpio/gpio-pca953x.c | |||
@@ -98,12 +98,11 @@ static int pca953x_write_reg(struct pca953x_chip *chip, int reg, u32 val) | |||
98 | if (chip->gpio_chip.ngpio <= 8) | 98 | if (chip->gpio_chip.ngpio <= 8) |
99 | ret = i2c_smbus_write_byte_data(chip->client, reg, val); | 99 | ret = i2c_smbus_write_byte_data(chip->client, reg, val); |
100 | else if (chip->gpio_chip.ngpio == 24) { | 100 | else if (chip->gpio_chip.ngpio == 24) { |
101 | ret = i2c_smbus_write_word_data(chip->client, | 101 | cpu_to_le32s(&val); |
102 | ret = i2c_smbus_write_i2c_block_data(chip->client, | ||
102 | (reg << 2) | REG_ADDR_AI, | 103 | (reg << 2) | REG_ADDR_AI, |
103 | val & 0xffff); | 104 | 3, |
104 | ret = i2c_smbus_write_byte_data(chip->client, | 105 | (u8 *) &val); |
105 | (reg << 2) + 2, | ||
106 | (val & 0xff0000) >> 16); | ||
107 | } | 106 | } |
108 | else { | 107 | else { |
109 | switch (chip->chip_type) { | 108 | switch (chip->chip_type) { |
@@ -135,22 +134,27 @@ static int pca953x_read_reg(struct pca953x_chip *chip, int reg, u32 *val) | |||
135 | { | 134 | { |
136 | int ret; | 135 | int ret; |
137 | 136 | ||
138 | if (chip->gpio_chip.ngpio <= 8) | 137 | if (chip->gpio_chip.ngpio <= 8) { |
139 | ret = i2c_smbus_read_byte_data(chip->client, reg); | 138 | ret = i2c_smbus_read_byte_data(chip->client, reg); |
140 | else if (chip->gpio_chip.ngpio == 24) { | 139 | *val = ret; |
141 | ret = i2c_smbus_read_word_data(chip->client, reg << 2); | ||
142 | ret |= (i2c_smbus_read_byte_data(chip->client, | ||
143 | (reg << 2) + 2)<<16); | ||
144 | } | 140 | } |
145 | else | 141 | else if (chip->gpio_chip.ngpio == 24) { |
142 | *val = 0; | ||
143 | ret = i2c_smbus_read_i2c_block_data(chip->client, | ||
144 | (reg << 2) | REG_ADDR_AI, | ||
145 | 3, | ||
146 | (u8 *) val); | ||
147 | le32_to_cpus(val); | ||
148 | } else { | ||
146 | ret = i2c_smbus_read_word_data(chip->client, reg << 1); | 149 | ret = i2c_smbus_read_word_data(chip->client, reg << 1); |
150 | *val = ret; | ||
151 | } | ||
147 | 152 | ||
148 | if (ret < 0) { | 153 | if (ret < 0) { |
149 | dev_err(&chip->client->dev, "failed reading register\n"); | 154 | dev_err(&chip->client->dev, "failed reading register\n"); |
150 | return ret; | 155 | return ret; |
151 | } | 156 | } |
152 | 157 | ||
153 | *val = (u32)ret; | ||
154 | return 0; | 158 | return 0; |
155 | } | 159 | } |
156 | 160 | ||