Lines Matching +full:max +full:- +full:msg

1 // SPDX-License-Identifier: GPL-2.0
30 { "INTC10D2" }, /* MTL-CVF */
42 static void usbio_i2c_uninit(struct i2c_adapter *adap, struct i2c_msg *msg) in usbio_i2c_uninit() argument
47 ubuf.busid = i2c->adev->id; in usbio_i2c_uninit()
48 ubuf.config = cpu_to_le16(msg->addr); in usbio_i2c_uninit()
50 usbio_bulk_msg(i2c->adev, USBIO_PKTTYPE_I2C, USBIO_I2CCMD_UNINIT, true, in usbio_i2c_uninit()
54 static int usbio_i2c_init(struct i2c_adapter *adap, struct i2c_msg *msg) in usbio_i2c_init() argument
62 ibuf.busid = i2c->adev->id; in usbio_i2c_init()
63 ibuf.config = cpu_to_le16(msg->addr); in usbio_i2c_init()
64 ibuf.speed = cpu_to_le32(i2c->speed); in usbio_i2c_init()
66 if (i2c->quirks & USBIO_QUIRK_I2C_NO_INIT_ACK) { in usbio_i2c_init()
74 ret = usbio_bulk_msg(i2c->adev, USBIO_PKTTYPE_I2C, USBIO_I2CCMD_INIT, true, in usbio_i2c_init()
77 return (ret < 0) ? ret : -EIO; in usbio_i2c_init()
82 static int usbio_i2c_read(struct i2c_adapter *adap, struct i2c_msg *msg) in usbio_i2c_read() argument
85 u16 rxchunk = i2c->rxbuf_len - I2C_RW_OVERHEAD; in usbio_i2c_read()
86 struct usbio_i2c_rw *rbuf = i2c->rwbuf; in usbio_i2c_read()
89 rbuf->busid = i2c->adev->id; in usbio_i2c_read()
90 rbuf->config = cpu_to_le16(msg->addr); in usbio_i2c_read()
91 rbuf->size = cpu_to_le16(msg->len); in usbio_i2c_read()
93 if (msg->len > rxchunk) { in usbio_i2c_read()
98 if (msg->len - len < rxchunk) in usbio_i2c_read()
99 rxchunk = msg->len - len; in usbio_i2c_read()
101 ret = usbio_bulk_msg(i2c->adev, USBIO_PKTTYPE_I2C, in usbio_i2c_read()
108 memcpy(&msg->buf[len], rbuf->data, rxchunk); in usbio_i2c_read()
110 } while (msg->len > len); in usbio_i2c_read()
115 ret = usbio_bulk_msg(i2c->adev, USBIO_PKTTYPE_I2C, USBIO_I2CCMD_READ, true, in usbio_i2c_read()
116 rbuf, sizeof(*rbuf), rbuf, sizeof(*rbuf) + msg->len); in usbio_i2c_read()
117 if (ret != sizeof(*rbuf) + msg->len) in usbio_i2c_read()
118 return (ret < 0) ? ret : -EIO; in usbio_i2c_read()
120 memcpy(msg->buf, rbuf->data, msg->len); in usbio_i2c_read()
125 static int usbio_i2c_write(struct i2c_adapter *adap, struct i2c_msg *msg) in usbio_i2c_write() argument
128 u16 txchunk = i2c->txbuf_len - I2C_RW_OVERHEAD; in usbio_i2c_write()
129 struct usbio_i2c_rw *wbuf = i2c->rwbuf; in usbio_i2c_write()
132 if (msg->len > txchunk) { in usbio_i2c_write()
137 wbuf->busid = i2c->adev->id; in usbio_i2c_write()
138 wbuf->config = cpu_to_le16(msg->addr); in usbio_i2c_write()
140 if (i2c->quirks & USBIO_QUIRK_I2C_USE_CHUNK_LEN) in usbio_i2c_write()
141 wbuf->size = cpu_to_le16(txchunk); in usbio_i2c_write()
143 wbuf->size = cpu_to_le16(msg->len); in usbio_i2c_write()
145 memcpy(wbuf->data, &msg->buf[len], txchunk); in usbio_i2c_write()
148 ret = usbio_bulk_msg(i2c->adev, USBIO_PKTTYPE_I2C, in usbio_i2c_write()
149 USBIO_I2CCMD_WRITE, msg->len == len, in usbio_i2c_write()
155 if (msg->len - len < txchunk) in usbio_i2c_write()
156 txchunk = msg->len - len; in usbio_i2c_write()
157 } while (msg->len > len); in usbio_i2c_write()
162 wbuf->busid = i2c->adev->id; in usbio_i2c_write()
163 wbuf->config = cpu_to_le16(msg->addr); in usbio_i2c_write()
164 wbuf->size = cpu_to_le16(msg->len); in usbio_i2c_write()
165 memcpy(wbuf->data, msg->buf, msg->len); in usbio_i2c_write()
167 ret = usbio_bulk_msg(i2c->adev, USBIO_PKTTYPE_I2C, USBIO_I2CCMD_WRITE, true, in usbio_i2c_write()
168 wbuf, sizeof(*wbuf) + msg->len, wbuf, sizeof(*wbuf)); in usbio_i2c_write()
169 if (ret != sizeof(*wbuf) || le16_to_cpu(wbuf->size) != msg->len) in usbio_i2c_write()
170 return (ret < 0) ? ret : -EIO; in usbio_i2c_write()
180 usbio_acquire(i2c->adev); in usbio_i2c_xfer()
199 usbio_release(i2c->adev); in usbio_i2c_xfer()
230 struct device *dev = &adev->dev; in usbio_i2c_probe()
237 return -EINVAL; in usbio_i2c_probe()
241 return -ENOMEM; in usbio_i2c_probe()
243 i2c->adev = adev; in usbio_i2c_probe()
245 usbio_acpi_bind(i2c->adev, usbio_i2c_acpi_hids); in usbio_i2c_probe()
246 usbio_get_txrxbuf_len(i2c->adev, &i2c->txbuf_len, &i2c->rxbuf_len); in usbio_i2c_probe()
248 i2c->rwbuf = devm_kzalloc(dev, max(i2c->txbuf_len, i2c->rxbuf_len), GFP_KERNEL); in usbio_i2c_probe()
249 if (!i2c->rwbuf) in usbio_i2c_probe()
250 return -ENOMEM; in usbio_i2c_probe()
252 i2c->quirks = usbio_get_quirks(i2c->adev); in usbio_i2c_probe()
254 max_speed = usbio_i2c_speeds[i2c_desc->caps & USBIO_I2C_BUS_MODE_CAP_MASK]; in usbio_i2c_probe()
256 (i2c->quirks & USBIO_QUIRK_I2C_ALLOW_400KHZ)) in usbio_i2c_probe()
259 i2c->speed = i2c_acpi_find_bus_speed(dev); in usbio_i2c_probe()
260 if (!i2c->speed) in usbio_i2c_probe()
261 i2c->speed = I2C_MAX_STANDARD_MODE_FREQ; in usbio_i2c_probe()
262 else if (i2c->speed > max_speed) { in usbio_i2c_probe()
263 dev_warn(dev, "Invalid speed %u adjusting to bus max %u\n", in usbio_i2c_probe()
264 i2c->speed, max_speed); in usbio_i2c_probe()
265 i2c->speed = max_speed; in usbio_i2c_probe()
268 i2c->adap.owner = THIS_MODULE; in usbio_i2c_probe()
269 i2c->adap.class = I2C_CLASS_HWMON; in usbio_i2c_probe()
270 i2c->adap.dev.parent = dev; in usbio_i2c_probe()
271 i2c->adap.algo = &usbio_i2c_algo; in usbio_i2c_probe()
273 if (i2c->quirks & USBIO_QUIRK_I2C_MAX_RW_LEN_52) in usbio_i2c_probe()
274 i2c->adap.quirks = &usbio_i2c_quirks_max_rw_len52; in usbio_i2c_probe()
276 i2c->adap.quirks = &usbio_i2c_quirks; in usbio_i2c_probe()
278 snprintf(i2c->adap.name, sizeof(i2c->adap.name), "%s.%d", in usbio_i2c_probe()
279 USBIO_I2C_CLIENT, i2c->adev->id); in usbio_i2c_probe()
281 device_set_node(&i2c->adap.dev, dev_fwnode(&adev->dev)); in usbio_i2c_probe()
284 i2c_set_adapdata(&i2c->adap, i2c); in usbio_i2c_probe()
286 ret = i2c_add_adapter(&i2c->adap); in usbio_i2c_probe()
290 if (has_acpi_companion(&i2c->adap.dev)) in usbio_i2c_probe()
291 acpi_dev_clear_dependencies(ACPI_COMPANION(&i2c->adap.dev)); in usbio_i2c_probe()
300 i2c_del_adapter(&i2c->adap); in usbio_i2c_remove()
304 { "usbio.usbio-i2c" },