Lines Matching +full:cmd +full:- +full:max +full:- +full:name
1 // SPDX-License-Identifier: GPL-2.0-or-later
33 * Reference code defines 1kHz as min freq and 6.1MHz as max freq.
118 struct i2c_algo_cgbc_data *algo_data = adap->algo_data; in cgbc_i2c_get_status()
120 struct cgbc_device_data *cgbc = i2c->cgbc; in cgbc_i2c_get_status()
121 u8 cmd = CGBC_I2C_CMD_STAT | algo_data->bus_id; in cgbc_i2c_get_status() local
125 ret = cgbc_command(cgbc, &cmd, sizeof(cmd), NULL, 0, &status); in cgbc_i2c_get_status()
135 struct i2c_algo_cgbc_data *algo_data = adap->algo_data; in cgbc_i2c_set_frequency()
137 struct cgbc_device_data *cgbc = i2c->cgbc; in cgbc_i2c_set_frequency()
138 u8 cmd[2], data; in cgbc_i2c_set_frequency() local
143 dev_info(i2c->dev, "invalid frequency %u, using default\n", bus_frequency); in cgbc_i2c_set_frequency()
147 cmd[0] = CGBC_I2C_CMD_SPEED | algo_data->bus_id; in cgbc_i2c_set_frequency()
148 cmd[1] = cgbc_i2c_freq_to_reg(bus_frequency); in cgbc_i2c_set_frequency()
150 ret = cgbc_command(cgbc, &cmd, sizeof(cmd), &data, 1, NULL); in cgbc_i2c_set_frequency()
152 return dev_err_probe(i2c->dev, ret, in cgbc_i2c_set_frequency()
154 adap->name); in cgbc_i2c_set_frequency()
156 cmd[1] = 0x00; in cgbc_i2c_set_frequency()
158 ret = cgbc_command(cgbc, &cmd, sizeof(cmd), &data, 1, NULL); in cgbc_i2c_set_frequency()
160 return dev_err_probe(i2c->dev, ret, in cgbc_i2c_set_frequency()
165 dev_dbg(i2c->dev, "%s is running at %d Hz\n", adap->name, bus_frequency); in cgbc_i2c_set_frequency()
171 * Therefore, calculate the max time to properly size the timeout. in cgbc_i2c_set_frequency()
173 algo_data->read_maxtime_us = (BITS_PER_BYTE + 1) * CGBC_I2C_READ_MAX_LEN in cgbc_i2c_set_frequency()
179 static unsigned int cgbc_i2c_xfer_to_cmd(struct cgbc_i2c_transfer xfer, u8 *cmd) in cgbc_i2c_xfer_to_cmd() argument
183 cmd[i++] = CGBC_I2C_CMD_START | xfer.bus_id; in cgbc_i2c_xfer_to_cmd()
185 cmd[i] = (xfer.start) ? CGBC_I2C_START : 0x00; in cgbc_i2c_xfer_to_cmd()
187 cmd[i] |= CGBC_I2C_STOP; in cgbc_i2c_xfer_to_cmd()
188 cmd[i++] |= (xfer.start) ? xfer.write + 1 : xfer.write; in cgbc_i2c_xfer_to_cmd()
190 cmd[i++] = (xfer.last_ack) ? (xfer.read | CGBC_I2C_LAST_ACK) : xfer.read; in cgbc_i2c_xfer_to_cmd()
193 cmd[i++] = xfer.addr; in cgbc_i2c_xfer_to_cmd()
196 memcpy(&cmd[i], &xfer.data, xfer.write); in cgbc_i2c_xfer_to_cmd()
203 struct i2c_algo_cgbc_data *algo_data = adap->algo_data; in cgbc_i2c_xfer_msg()
205 struct cgbc_device_data *cgbc = i2c->cgbc; in cgbc_i2c_xfer_msg()
206 struct i2c_msg *msg = i2c->msg; in cgbc_i2c_xfer_msg()
207 u8 cmd[CGBC_I2C_CMD_SIZE]; in cgbc_i2c_xfer_msg() local
213 .bus_id = algo_data->bus_id, in cgbc_i2c_xfer_msg()
217 if (i2c->state == CGBC_I2C_STATE_DONE) in cgbc_i2c_xfer_msg()
223 return -EBUSY; in cgbc_i2c_xfer_msg()
227 if (i2c->state == CGBC_I2C_STATE_INIT || in cgbc_i2c_xfer_msg()
228 (i2c->state == CGBC_I2C_STATE_WRITE && msg->flags & I2C_M_RD)) in cgbc_i2c_xfer_msg()
231 i2c->state = (msg->flags & I2C_M_RD) ? CGBC_I2C_STATE_READ : CGBC_I2C_STATE_WRITE; in cgbc_i2c_xfer_msg()
233 max_len = (i2c->state == CGBC_I2C_STATE_READ) ? in cgbc_i2c_xfer_msg()
236 if (msg->len - i2c->pos > max_len) { in cgbc_i2c_xfer_msg()
239 len = msg->len - i2c->pos; in cgbc_i2c_xfer_msg()
241 if (i2c->nmsgs == 1) in cgbc_i2c_xfer_msg()
245 if (i2c->state == CGBC_I2C_STATE_WRITE) { in cgbc_i2c_xfer_msg()
250 xfer.data[i] = msg->buf[i2c->pos + i]; in cgbc_i2c_xfer_msg()
252 cmd_len = cgbc_i2c_xfer_to_cmd(xfer, &cmd[0]); in cgbc_i2c_xfer_msg()
254 ret = cgbc_command(cgbc, &cmd, cmd_len, NULL, 0, NULL); in cgbc_i2c_xfer_msg()
257 } else if (i2c->state == CGBC_I2C_STATE_READ) { in cgbc_i2c_xfer_msg()
261 if (i2c->nmsgs > 1 || msg->len - i2c->pos > max_len) in cgbc_i2c_xfer_msg()
264 cmd_len = cgbc_i2c_xfer_to_cmd(xfer, &cmd[0]); in cgbc_i2c_xfer_msg()
265 ret = cgbc_command(cgbc, &cmd, cmd_len, NULL, 0, NULL); in cgbc_i2c_xfer_msg()
271 2 * algo_data->read_maxtime_us, false, adap); in cgbc_i2c_xfer_msg()
275 cmd_data = CGBC_I2C_CMD_DATA | algo_data->bus_id; in cgbc_i2c_xfer_msg()
277 msg->buf + i2c->pos, len, NULL); in cgbc_i2c_xfer_msg()
282 if (len == (msg->len - i2c->pos)) { in cgbc_i2c_xfer_msg()
283 i2c->msg++; in cgbc_i2c_xfer_msg()
284 i2c->nmsgs--; in cgbc_i2c_xfer_msg()
285 i2c->pos = 0; in cgbc_i2c_xfer_msg()
287 i2c->pos += len; in cgbc_i2c_xfer_msg()
290 if (i2c->nmsgs == 0) in cgbc_i2c_xfer_msg()
291 i2c->state = CGBC_I2C_STATE_DONE; in cgbc_i2c_xfer_msg()
296 i2c->state = CGBC_I2C_STATE_ERROR; in cgbc_i2c_xfer_msg()
307 i2c->state = CGBC_I2C_STATE_INIT; in cgbc_i2c_xfer()
308 i2c->msg = msgs; in cgbc_i2c_xfer()
309 i2c->nmsgs = num; in cgbc_i2c_xfer()
310 i2c->pos = 0; in cgbc_i2c_xfer()
314 if (i2c->state == CGBC_I2C_STATE_DONE) in cgbc_i2c_xfer()
317 if (i2c->state == CGBC_I2C_STATE_ERROR) in cgbc_i2c_xfer()
324 i2c->state = CGBC_I2C_STATE_ERROR; in cgbc_i2c_xfer()
325 return -ETIMEDOUT; in cgbc_i2c_xfer()
346 .name = "Congatec General Purpose I2C adapter",
350 .nr = -1,
354 .name = "Congatec Power Management I2C adapter",
358 .nr = -1,
364 struct cgbc_device_data *cgbc = dev_get_drvdata(pdev->dev.parent); in cgbc_i2c_probe()
368 i2c = devm_kzalloc(&pdev->dev, sizeof(*i2c), GFP_KERNEL); in cgbc_i2c_probe()
370 return -ENOMEM; in cgbc_i2c_probe()
372 i2c->cgbc = cgbc; in cgbc_i2c_probe()
373 i2c->dev = &pdev->dev; in cgbc_i2c_probe()
374 i2c->adap = cgbc_i2c_adapter[pdev->id]; in cgbc_i2c_probe()
375 i2c->adap.dev.parent = i2c->dev; in cgbc_i2c_probe()
376 i2c_set_adapdata(&i2c->adap, i2c); in cgbc_i2c_probe()
379 ret = cgbc_i2c_set_frequency(&i2c->adap, I2C_MAX_STANDARD_MODE_FREQ); in cgbc_i2c_probe()
383 return i2c_add_numbered_adapter(&i2c->adap); in cgbc_i2c_probe()
390 i2c_del_adapter(&i2c->adap); in cgbc_i2c_remove()
395 .name = "cgbc-i2c",