diff options
author | Peter Rosin <peda@axentia.se> | 2018-06-20 04:51:55 -0400 |
---|---|---|
committer | Wolfram Sang <wsa@the-dreams.de> | 2018-07-03 16:57:39 -0400 |
commit | a5306b803419f1fb0bf7627fcb9afd1a7d9b158c (patch) | |
tree | a940d867539ef7807cc23b500bb57551c690da89 | |
parent | d7a0aef2960dfcfbbaef136f21fd88513ad679fb (diff) |
i2c: mux: pca9541: make use of __i2c_smbus_xfer
This simplifies the code, and you get retries for free if the adapter
does not support ->master_xfer.
Signed-off-by: Peter Rosin <peda@axentia.se>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
-rw-r--r-- | drivers/i2c/muxes/i2c-mux-pca9541.c | 69 |
1 files changed, 11 insertions, 58 deletions
diff --git a/drivers/i2c/muxes/i2c-mux-pca9541.c b/drivers/i2c/muxes/i2c-mux-pca9541.c index 6a39adaf433f..3d8c938e99e7 100644 --- a/drivers/i2c/muxes/i2c-mux-pca9541.c +++ b/drivers/i2c/muxes/i2c-mux-pca9541.c | |||
@@ -99,31 +99,11 @@ MODULE_DEVICE_TABLE(of, pca9541_of_match); | |||
99 | static int pca9541_reg_write(struct i2c_client *client, u8 command, u8 val) | 99 | static int pca9541_reg_write(struct i2c_client *client, u8 command, u8 val) |
100 | { | 100 | { |
101 | struct i2c_adapter *adap = client->adapter; | 101 | struct i2c_adapter *adap = client->adapter; |
102 | int ret; | 102 | union i2c_smbus_data data = { .byte = val }; |
103 | |||
104 | if (adap->algo->master_xfer) { | ||
105 | struct i2c_msg msg; | ||
106 | char buf[2]; | ||
107 | |||
108 | msg.addr = client->addr; | ||
109 | msg.flags = 0; | ||
110 | msg.len = 2; | ||
111 | buf[0] = command; | ||
112 | buf[1] = val; | ||
113 | msg.buf = buf; | ||
114 | ret = __i2c_transfer(adap, &msg, 1); | ||
115 | } else { | ||
116 | union i2c_smbus_data data; | ||
117 | |||
118 | data.byte = val; | ||
119 | ret = adap->algo->smbus_xfer(adap, client->addr, | ||
120 | client->flags, | ||
121 | I2C_SMBUS_WRITE, | ||
122 | command, | ||
123 | I2C_SMBUS_BYTE_DATA, &data); | ||
124 | } | ||
125 | 103 | ||
126 | return ret; | 104 | return __i2c_smbus_xfer(adap, client->addr, client->flags, |
105 | I2C_SMBUS_WRITE, command, | ||
106 | I2C_SMBUS_BYTE_DATA, &data); | ||
127 | } | 107 | } |
128 | 108 | ||
129 | /* | 109 | /* |
@@ -133,41 +113,14 @@ static int pca9541_reg_write(struct i2c_client *client, u8 command, u8 val) | |||
133 | static int pca9541_reg_read(struct i2c_client *client, u8 command) | 113 | static int pca9541_reg_read(struct i2c_client *client, u8 command) |
134 | { | 114 | { |
135 | struct i2c_adapter *adap = client->adapter; | 115 | struct i2c_adapter *adap = client->adapter; |
116 | union i2c_smbus_data data; | ||
136 | int ret; | 117 | int ret; |
137 | u8 val; | 118 | |
138 | 119 | ret = __i2c_smbus_xfer(adap, client->addr, client->flags, | |
139 | if (adap->algo->master_xfer) { | 120 | I2C_SMBUS_READ, command, |
140 | struct i2c_msg msg[2] = { | 121 | I2C_SMBUS_BYTE_DATA, &data); |
141 | { | 122 | |
142 | .addr = client->addr, | 123 | return ret ?: data.byte; |
143 | .flags = 0, | ||
144 | .len = 1, | ||
145 | .buf = &command | ||
146 | }, | ||
147 | { | ||
148 | .addr = client->addr, | ||
149 | .flags = I2C_M_RD, | ||
150 | .len = 1, | ||
151 | .buf = &val | ||
152 | } | ||
153 | }; | ||
154 | ret = __i2c_transfer(adap, msg, 2); | ||
155 | if (ret == 2) | ||
156 | ret = val; | ||
157 | else if (ret >= 0) | ||
158 | ret = -EIO; | ||
159 | } else { | ||
160 | union i2c_smbus_data data; | ||
161 | |||
162 | ret = adap->algo->smbus_xfer(adap, client->addr, | ||
163 | client->flags, | ||
164 | I2C_SMBUS_READ, | ||
165 | command, | ||
166 | I2C_SMBUS_BYTE_DATA, &data); | ||
167 | if (!ret) | ||
168 | ret = data.byte; | ||
169 | } | ||
170 | return ret; | ||
171 | } | 124 | } |
172 | 125 | ||
173 | /* | 126 | /* |