Lines Matching refs:dev

101 static int diolan_usb_transfer(struct i2c_diolan_u2c *dev)  in diolan_usb_transfer()  argument
107 if (!dev->olen || !dev->ocount) in diolan_usb_transfer()
110 ret = usb_bulk_msg(dev->usb_dev, in diolan_usb_transfer()
111 usb_sndbulkpipe(dev->usb_dev, dev->ep_out), in diolan_usb_transfer()
112 dev->obuffer, dev->olen, &actual, in diolan_usb_transfer()
115 for (i = 0; i < dev->ocount; i++) { in diolan_usb_transfer()
118 tmpret = usb_bulk_msg(dev->usb_dev, in diolan_usb_transfer()
119 usb_rcvbulkpipe(dev->usb_dev, in diolan_usb_transfer()
120 dev->ep_in), in diolan_usb_transfer()
121 dev->ibuffer, in diolan_usb_transfer()
122 sizeof(dev->ibuffer), &actual, in diolan_usb_transfer()
133 switch (dev->ibuffer[actual - 1]) { in diolan_usb_transfer()
156 dev->olen = 0; in diolan_usb_transfer()
157 dev->ocount = 0; in diolan_usb_transfer()
161 static int diolan_write_cmd(struct i2c_diolan_u2c *dev, bool flush) in diolan_write_cmd() argument
163 if (flush || dev->olen >= DIOLAN_FLUSH_LEN) in diolan_write_cmd()
164 return diolan_usb_transfer(dev); in diolan_write_cmd()
169 static int diolan_usb_cmd(struct i2c_diolan_u2c *dev, u8 command, bool flush) in diolan_usb_cmd() argument
171 dev->obuffer[dev->olen++] = command; in diolan_usb_cmd()
172 dev->ocount++; in diolan_usb_cmd()
173 return diolan_write_cmd(dev, flush); in diolan_usb_cmd()
177 static int diolan_usb_cmd_data(struct i2c_diolan_u2c *dev, u8 command, u8 data, in diolan_usb_cmd_data() argument
180 dev->obuffer[dev->olen++] = command; in diolan_usb_cmd_data()
181 dev->obuffer[dev->olen++] = data; in diolan_usb_cmd_data()
182 dev->ocount++; in diolan_usb_cmd_data()
183 return diolan_write_cmd(dev, flush); in diolan_usb_cmd_data()
187 static int diolan_usb_cmd_data2(struct i2c_diolan_u2c *dev, u8 command, u8 d1, in diolan_usb_cmd_data2() argument
190 dev->obuffer[dev->olen++] = command; in diolan_usb_cmd_data2()
191 dev->obuffer[dev->olen++] = d1; in diolan_usb_cmd_data2()
192 dev->obuffer[dev->olen++] = d2; in diolan_usb_cmd_data2()
193 dev->ocount++; in diolan_usb_cmd_data2()
194 return diolan_write_cmd(dev, flush); in diolan_usb_cmd_data2()
203 static void diolan_flush_input(struct i2c_diolan_u2c *dev) in diolan_flush_input() argument
211 ret = usb_bulk_msg(dev->usb_dev, in diolan_flush_input()
212 usb_rcvbulkpipe(dev->usb_dev, dev->ep_in), in diolan_flush_input()
213 dev->ibuffer, sizeof(dev->ibuffer), &actual, in diolan_flush_input()
219 dev_err(&dev->interface->dev, "Failed to flush input buffer\n"); in diolan_flush_input()
222 static int diolan_i2c_start(struct i2c_diolan_u2c *dev) in diolan_i2c_start() argument
224 return diolan_usb_cmd(dev, CMD_I2C_START, false); in diolan_i2c_start()
227 static int diolan_i2c_repeated_start(struct i2c_diolan_u2c *dev) in diolan_i2c_repeated_start() argument
229 return diolan_usb_cmd(dev, CMD_I2C_REPEATED_START, false); in diolan_i2c_repeated_start()
232 static int diolan_i2c_stop(struct i2c_diolan_u2c *dev) in diolan_i2c_stop() argument
234 return diolan_usb_cmd(dev, CMD_I2C_STOP, true); in diolan_i2c_stop()
237 static int diolan_i2c_get_byte_ack(struct i2c_diolan_u2c *dev, bool ack, in diolan_i2c_get_byte_ack() argument
242 ret = diolan_usb_cmd_data(dev, CMD_I2C_GET_BYTE_ACK, ack, true); in diolan_i2c_get_byte_ack()
244 *byte = dev->ibuffer[0]; in diolan_i2c_get_byte_ack()
251 static int diolan_i2c_put_byte_ack(struct i2c_diolan_u2c *dev, u8 byte) in diolan_i2c_put_byte_ack() argument
253 return diolan_usb_cmd_data(dev, CMD_I2C_PUT_BYTE_ACK, byte, false); in diolan_i2c_put_byte_ack()
256 static int diolan_set_speed(struct i2c_diolan_u2c *dev, u8 speed) in diolan_set_speed() argument
258 return diolan_usb_cmd_data(dev, CMD_I2C_SET_SPEED, speed, true); in diolan_set_speed()
262 static int diolan_set_clock_synch(struct i2c_diolan_u2c *dev, bool enable) in diolan_set_clock_synch() argument
264 return diolan_usb_cmd_data(dev, CMD_I2C_SET_CLK_SYNC, enable, true); in diolan_set_clock_synch()
268 static int diolan_set_clock_synch_timeout(struct i2c_diolan_u2c *dev, int ms) in diolan_set_clock_synch_timeout() argument
272 return diolan_usb_cmd_data2(dev, CMD_I2C_SET_CLK_SYNC_TO, in diolan_set_clock_synch_timeout()
276 static void diolan_fw_version(struct i2c_diolan_u2c *dev) in diolan_fw_version() argument
280 ret = diolan_usb_cmd(dev, CMD_GET_FW_VERSION, true); in diolan_fw_version()
282 dev_info(&dev->interface->dev, in diolan_fw_version()
284 (unsigned int)dev->ibuffer[0], in diolan_fw_version()
285 (unsigned int)dev->ibuffer[1]); in diolan_fw_version()
288 static void diolan_get_serial(struct i2c_diolan_u2c *dev) in diolan_get_serial() argument
293 ret = diolan_usb_cmd(dev, CMD_GET_SERIAL, true); in diolan_get_serial()
295 serial = le32_to_cpu(*(u32 *)dev->ibuffer); in diolan_get_serial()
296 dev_info(&dev->interface->dev, in diolan_get_serial()
301 static int diolan_init(struct i2c_diolan_u2c *dev) in diolan_init() argument
318 dev_info(&dev->interface->dev, in diolan_init()
320 dev->usb_dev->bus->busnum, dev->usb_dev->devnum, frequency); in diolan_init()
322 diolan_flush_input(dev); in diolan_init()
323 diolan_fw_version(dev); in diolan_init()
324 diolan_get_serial(dev); in diolan_init()
327 ret = diolan_set_speed(dev, speed); in diolan_init()
332 ret = diolan_set_clock_synch(dev, speed != U2C_I2C_SPEED_FAST); in diolan_init()
337 ret = diolan_set_clock_synch_timeout(dev, DIOLAN_SYNC_TIMEOUT); in diolan_init()
347 struct i2c_diolan_u2c *dev = i2c_get_adapdata(adapter); in diolan_usb_xfer() local
352 ret = diolan_i2c_start(dev); in diolan_usb_xfer()
359 ret = diolan_i2c_repeated_start(dev); in diolan_usb_xfer()
365 diolan_i2c_put_byte_ack(dev, (pmsg->addr << 1) | 1); in diolan_usb_xfer()
379 ret = diolan_i2c_get_byte_ack(dev, ack, &byte); in diolan_usb_xfer()
396 ret = diolan_i2c_put_byte_ack(dev, pmsg->addr << 1); in diolan_usb_xfer()
400 ret = diolan_i2c_put_byte_ack(dev, in diolan_usb_xfer()
409 sret = diolan_i2c_stop(dev); in diolan_usb_xfer()
438 static void diolan_u2c_free(struct i2c_diolan_u2c *dev) in diolan_u2c_free() argument
440 usb_put_dev(dev->usb_dev); in diolan_u2c_free()
441 kfree(dev); in diolan_u2c_free()
448 struct i2c_diolan_u2c *dev; in diolan_u2c_probe() local
456 dev = kzalloc(sizeof(*dev), GFP_KERNEL); in diolan_u2c_probe()
457 if (dev == NULL) { in diolan_u2c_probe()
461 dev->ep_out = hostif->endpoint[0].desc.bEndpointAddress; in diolan_u2c_probe()
462 dev->ep_in = hostif->endpoint[1].desc.bEndpointAddress; in diolan_u2c_probe()
464 dev->usb_dev = usb_get_dev(interface_to_usbdev(interface)); in diolan_u2c_probe()
465 dev->interface = interface; in diolan_u2c_probe()
468 usb_set_intfdata(interface, dev); in diolan_u2c_probe()
471 dev->adapter.owner = THIS_MODULE; in diolan_u2c_probe()
472 dev->adapter.class = I2C_CLASS_HWMON; in diolan_u2c_probe()
473 dev->adapter.algo = &diolan_usb_algorithm; in diolan_u2c_probe()
474 i2c_set_adapdata(&dev->adapter, dev); in diolan_u2c_probe()
475 snprintf(dev->adapter.name, sizeof(dev->adapter.name), in diolan_u2c_probe()
477 dev->usb_dev->bus->busnum, dev->usb_dev->devnum); in diolan_u2c_probe()
479 dev->adapter.dev.parent = &dev->interface->dev; in diolan_u2c_probe()
482 ret = diolan_init(dev); in diolan_u2c_probe()
484 dev_err(&interface->dev, "failed to initialize adapter\n"); in diolan_u2c_probe()
489 ret = i2c_add_adapter(&dev->adapter); in diolan_u2c_probe()
491 dev_err(&interface->dev, "failed to add I2C adapter\n"); in diolan_u2c_probe()
495 dev_dbg(&interface->dev, "connected " DRIVER_NAME "\n"); in diolan_u2c_probe()
501 diolan_u2c_free(dev); in diolan_u2c_probe()
508 struct i2c_diolan_u2c *dev = usb_get_intfdata(interface); in diolan_u2c_disconnect() local
510 i2c_del_adapter(&dev->adapter); in diolan_u2c_disconnect()
512 diolan_u2c_free(dev); in diolan_u2c_disconnect()
514 dev_dbg(&interface->dev, "disconnected\n"); in diolan_u2c_disconnect()