Lines Matching +full:always +full:- +full:wait +full:- +full:for +full:- +full:ack

1 // SPDX-License-Identifier: GPL-2.0+
3 // em28xx-i2c.c - driver for Empia EM2800/EM2820/2840 USB video capture devices
18 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 // GNU General Public License for more details.
29 #include "tuner-xc2028.h"
30 #include <media/v4l2-common.h>
33 /* ----------------------------------------------------------- */
45 dev_printk(KERN_DEBUG, &dev->intf->dev, \
50 * Time in msecs to wait for i2c xfers to finish.
51 * 35ms is the maximum time a SMBUS device could wait when
64 switch (dev->i2c_speed & 0x03) { in em28xx_i2c_timeout()
66 time += 4; /* Assume 4 ms for transfers */ in em28xx_i2c_timeout()
70 time += 1; /* Assume 1 ms for transfers */ in em28xx_i2c_timeout()
90 return -EOPNOTSUPP; in em2800_i2c_send_bytes()
92 b2[5] = 0x80 + len - 1; in em2800_i2c_send_bytes()
103 ret = dev->em28xx_write_regs(dev, 4 - len, &b2[4 - len], 2 + len); in em2800_i2c_send_bytes()
105 dev_warn(&dev->intf->dev, in em2800_i2c_send_bytes()
108 return (ret < 0) ? ret : -EIO; in em2800_i2c_send_bytes()
110 /* wait for completion */ in em2800_i2c_send_bytes()
112 ret = dev->em28xx_read_reg(dev, 0x05); in em2800_i2c_send_bytes()
113 if (ret == 0x80 + len - 1) in em2800_i2c_send_bytes()
115 if (ret == 0x94 + len - 1) { in em2800_i2c_send_bytes()
116 dprintk(1, "R05 returned 0x%02x: I2C ACK error\n", ret); in em2800_i2c_send_bytes()
117 return -ENXIO; in em2800_i2c_send_bytes()
120 dev_warn(&dev->intf->dev, in em2800_i2c_send_bytes()
128 return -ETIMEDOUT; in em2800_i2c_send_bytes()
143 return -EOPNOTSUPP; in em2800_i2c_recv_bytes()
146 buf2[1] = 0x84 + len - 1; in em2800_i2c_recv_bytes()
148 ret = dev->em28xx_write_regs(dev, 0x04, buf2, 2); in em2800_i2c_recv_bytes()
150 dev_warn(&dev->intf->dev, in em2800_i2c_recv_bytes()
153 return (ret < 0) ? ret : -EIO; in em2800_i2c_recv_bytes()
156 /* wait for completion */ in em2800_i2c_recv_bytes()
158 ret = dev->em28xx_read_reg(dev, 0x05); in em2800_i2c_recv_bytes()
159 if (ret == 0x84 + len - 1) in em2800_i2c_recv_bytes()
161 if (ret == 0x94 + len - 1) { in em2800_i2c_recv_bytes()
162 dprintk(1, "R05 returned 0x%02x: I2C ACK error\n", in em2800_i2c_recv_bytes()
164 return -ENXIO; in em2800_i2c_recv_bytes()
167 dev_warn(&dev->intf->dev, in em2800_i2c_recv_bytes()
174 if (ret != 0x84 + len - 1) in em2800_i2c_recv_bytes()
178 ret = dev->em28xx_read_reg_req_len(dev, 0x00, 4 - len, buf2, len); in em2800_i2c_recv_bytes()
180 dev_warn(&dev->intf->dev, in em2800_i2c_recv_bytes()
183 return (ret < 0) ? ret : -EIO; in em2800_i2c_recv_bytes()
185 for (i = 0; i < len; i++) in em2800_i2c_recv_bytes()
186 buf[i] = buf2[len - 1 - i]; in em2800_i2c_recv_bytes()
203 return (ret < 0) ? ret : -EIO; in em2800_i2c_check_for_device()
216 return -EOPNOTSUPP; in em28xx_i2c_send_bytes()
219 * Zero length reads always succeed, even if no device is connected in em28xx_i2c_send_bytes()
223 ret = dev->em28xx_write_regs_req(dev, stop ? 2 : 3, addr, buf, len); in em28xx_i2c_send_bytes()
226 dev_warn(&dev->intf->dev, in em28xx_i2c_send_bytes()
231 dev_warn(&dev->intf->dev, in em28xx_i2c_send_bytes()
234 return -EIO; in em28xx_i2c_send_bytes()
237 /* wait for completion */ in em28xx_i2c_send_bytes()
239 ret = dev->em28xx_read_reg(dev, 0x05); in em28xx_i2c_send_bytes()
243 dprintk(1, "I2C ACK error on writing to addr 0x%02x\n", in em28xx_i2c_send_bytes()
245 return -ENXIO; in em28xx_i2c_send_bytes()
248 dev_warn(&dev->intf->dev, in em28xx_i2c_send_bytes()
255 * NOTE: do we really have to wait for success ? in em28xx_i2c_send_bytes()
266 return -ETIMEDOUT; in em28xx_i2c_send_bytes()
269 dev_warn(&dev->intf->dev, in em28xx_i2c_send_bytes()
272 return -EIO; in em28xx_i2c_send_bytes()
284 return -EOPNOTSUPP; in em28xx_i2c_recv_bytes()
287 * Zero length reads always succeed, even if no device is connected in em28xx_i2c_recv_bytes()
291 ret = dev->em28xx_read_reg_req_len(dev, 2, addr, buf, len); in em28xx_i2c_recv_bytes()
293 dev_warn(&dev->intf->dev, in em28xx_i2c_recv_bytes()
298 dev_dbg(&dev->intf->dev, in em28xx_i2c_recv_bytes()
307 * Anyway, the next check will fail with -ENXIO in this case, so avoid in em28xx_i2c_recv_bytes()
312 ret = dev->em28xx_read_reg(dev, 0x05); in em28xx_i2c_recv_bytes()
316 dev_warn(&dev->intf->dev, in em28xx_i2c_recv_bytes()
322 dprintk(1, "I2C ACK error on writing to addr 0x%02x\n", in em28xx_i2c_recv_bytes()
324 return -ENXIO; in em28xx_i2c_recv_bytes()
332 return -ETIMEDOUT; in em28xx_i2c_recv_bytes()
335 dev_warn(&dev->intf->dev, in em28xx_i2c_recv_bytes()
338 return -EIO; in em28xx_i2c_recv_bytes()
353 return (ret < 0) ? ret : -EIO; in em28xx_i2c_check_for_device()
366 return -EOPNOTSUPP; in em25xx_bus_B_send_bytes()
369 * Zero length reads always succeed, even if no device is connected in em25xx_bus_B_send_bytes()
373 ret = dev->em28xx_write_regs_req(dev, 0x06, addr, buf, len); in em25xx_bus_B_send_bytes()
376 dev_warn(&dev->intf->dev, in em25xx_bus_B_send_bytes()
382 dev_warn(&dev->intf->dev, in em25xx_bus_B_send_bytes()
385 return -EIO; in em25xx_bus_B_send_bytes()
388 ret = dev->em28xx_read_reg_req(dev, 0x08, 0x0000); in em25xx_bus_B_send_bytes()
397 dprintk(1, "Bus B R08 returned 0x%02x: I2C ACK error\n", ret); in em25xx_bus_B_send_bytes()
398 return -ENXIO; in em25xx_bus_B_send_bytes()
404 * this operation, it seems to succeed ALWAYS ! (even if there is no in em25xx_bus_B_send_bytes()
419 return -EOPNOTSUPP; in em25xx_bus_B_recv_bytes()
422 * Zero length reads always succeed, even if no device is connected in em25xx_bus_B_recv_bytes()
426 ret = dev->em28xx_read_reg_req_len(dev, 0x06, addr, buf, len); in em25xx_bus_B_recv_bytes()
428 dev_warn(&dev->intf->dev, in em25xx_bus_B_recv_bytes()
438 * Anyway, the next check will fail with -ENXIO in this case, so avoid in em25xx_bus_B_recv_bytes()
443 ret = dev->em28xx_read_reg_req(dev, 0x08, 0x0000); in em25xx_bus_B_recv_bytes()
452 dprintk(1, "Bus B R08 returned 0x%02x: I2C ACK error\n", ret); in em25xx_bus_B_recv_bytes()
453 return -ENXIO; in em25xx_bus_B_recv_bytes()
459 * this operation, it seems to succeed ALWAYS ! (even if there is no in em25xx_bus_B_recv_bytes()
480 * it seems to succeed ALWAYS ! (even if no device connected) in em25xx_bus_B_check_for_device()
486 struct em28xx *dev = i2c_bus->dev; in i2c_check_for_device()
487 int rc = -EOPNOTSUPP; in i2c_check_for_device()
489 if (i2c_bus->algo_type == EM28XX_I2C_ALGO_EM28XX) in i2c_check_for_device()
491 else if (i2c_bus->algo_type == EM28XX_I2C_ALGO_EM2800) in i2c_check_for_device()
493 else if (i2c_bus->algo_type == EM28XX_I2C_ALGO_EM25XX_BUS_B) in i2c_check_for_device()
501 struct em28xx *dev = i2c_bus->dev; in i2c_recv_bytes()
503 int rc = -EOPNOTSUPP; in i2c_recv_bytes()
505 if (i2c_bus->algo_type == EM28XX_I2C_ALGO_EM28XX) in i2c_recv_bytes()
507 else if (i2c_bus->algo_type == EM28XX_I2C_ALGO_EM2800) in i2c_recv_bytes()
509 else if (i2c_bus->algo_type == EM28XX_I2C_ALGO_EM25XX_BUS_B) in i2c_recv_bytes()
517 struct em28xx *dev = i2c_bus->dev; in i2c_send_bytes()
519 int rc = -EOPNOTSUPP; in i2c_send_bytes()
521 if (i2c_bus->algo_type == EM28XX_I2C_ALGO_EM28XX) in i2c_send_bytes()
523 else if (i2c_bus->algo_type == EM28XX_I2C_ALGO_EM2800) in i2c_send_bytes()
525 else if (i2c_bus->algo_type == EM28XX_I2C_ALGO_EM25XX_BUS_B) in i2c_send_bytes()
537 struct em28xx_i2c_bus *i2c_bus = i2c_adap->algo_data; in em28xx_i2c_xfer()
538 struct em28xx *dev = i2c_bus->dev; in em28xx_i2c_xfer()
539 unsigned int bus = i2c_bus->bus; in em28xx_i2c_xfer()
548 if (dev->disconnected) in em28xx_i2c_xfer()
549 return -ENODEV; in em28xx_i2c_xfer()
551 if (!rt_mutex_trylock(&dev->i2c_bus_lock)) in em28xx_i2c_xfer()
552 return -EAGAIN; in em28xx_i2c_xfer()
555 if (bus != dev->cur_i2c_bus && in em28xx_i2c_xfer()
556 i2c_bus->algo_type == EM28XX_I2C_ALGO_EM28XX) { in em28xx_i2c_xfer()
563 dev->cur_i2c_bus = bus; in em28xx_i2c_xfer()
566 for (i = 0; i < num; i++) { in em28xx_i2c_xfer()
570 * no len: check only for device presence in em28xx_i2c_xfer()
575 if (rc == -ENXIO) in em28xx_i2c_xfer()
576 rc = -ENODEV; in em28xx_i2c_xfer()
582 rc = i2c_send_bytes(i2c_bus, msgs[i], i == num - 1); in em28xx_i2c_xfer()
590 i == num - 1 ? "stop" : "nonstop", in em28xx_i2c_xfer()
595 rt_mutex_unlock(&dev->i2c_bus_lock); in em28xx_i2c_xfer()
601 i == num - 1 ? "stop" : "nonstop", in em28xx_i2c_xfer()
603 (rc == -ENODEV) ? "no device " : "", in em28xx_i2c_xfer()
606 rt_mutex_unlock(&dev->i2c_bus_lock); in em28xx_i2c_xfer()
625 len = -1; in em28xx_hash_mem()
631 if ((len & (32 / 8 - 1)) == 0) in em28xx_hash_mem()
635 return (hash >> (32 - bits)) & 0xffffffffUL; in em28xx_hash_mem()
650 return -EINVAL; in em28xx_i2c_read_block()
654 ret = i2c_master_send(&dev->i2c_client[bus], in em28xx_i2c_read_block()
659 if (dev->board.is_em2800) in em28xx_i2c_read_block()
669 ret = i2c_master_recv(&dev->i2c_client[bus], data, rsize); in em28xx_i2c_read_block()
673 remain -= rsize; in em28xx_i2c_read_block()
685 * FIXME common length/size for bytes to read, to display, hash in em28xx_i2c_eeprom()
696 /* EEPROM is always on i2c bus 0 on all known devices. */ in em28xx_i2c_eeprom()
698 dev->i2c_client[bus].addr = 0xa0 >> 1; in em28xx_i2c_eeprom()
701 err = i2c_master_recv(&dev->i2c_client[bus], &buf, 0); in em28xx_i2c_eeprom()
703 dev_info(&dev->intf->dev, "board has no eeprom\n"); in em28xx_i2c_eeprom()
704 return -ENODEV; in em28xx_i2c_eeprom()
709 return -ENOMEM; in em28xx_i2c_eeprom()
713 dev->eeprom_addrwidth_16bit, in em28xx_i2c_eeprom()
716 dev_err(&dev->intf->dev, in em28xx_i2c_eeprom()
726 if (dev->eeprom_addrwidth_16bit) in em28xx_i2c_eeprom()
727 dev_info(&dev->intf->dev, in em28xx_i2c_eeprom()
731 if (dev->eeprom_addrwidth_16bit && in em28xx_i2c_eeprom()
733 /* new eeprom format; size 4-64kb */ in em28xx_i2c_eeprom()
737 dev->hash = em28xx_hash_mem(data, len, 32); in em28xx_i2c_eeprom()
740 dev_info(&dev->intf->dev, in em28xx_i2c_eeprom()
742 data, dev->hash); in em28xx_i2c_eeprom()
743 dev_info(&dev->intf->dev, in em28xx_i2c_eeprom()
745 dev_info(&dev->intf->dev, in em28xx_i2c_eeprom()
751 * [1] always selects 12 kb RAM in em28xx_i2c_eeprom()
753 * [4] 1 = force fast mode and no suspend for device testing in em28xx_i2c_eeprom()
765 dev_err(&dev->intf->dev, in em28xx_i2c_eeprom()
784 dev_err(&dev->intf->dev, in em28xx_i2c_eeprom()
794 dev_info(&dev->intf->dev, in em28xx_i2c_eeprom()
801 * TODO: decrypt eeprom data for camera bridges in em28xx_i2c_eeprom()
805 } else if (!dev->eeprom_addrwidth_16bit && in em28xx_i2c_eeprom()
808 dev->hash = em28xx_hash_mem(data, len, 32); in em28xx_i2c_eeprom()
809 dev_info(&dev->intf->dev, in em28xx_i2c_eeprom()
811 data, dev->hash); in em28xx_i2c_eeprom()
812 dev_info(&dev->intf->dev, in em28xx_i2c_eeprom()
815 dev_info(&dev->intf->dev, in em28xx_i2c_eeprom()
817 err = -ENODEV; in em28xx_i2c_eeprom()
825 switch (le16_to_cpu(dev_config->chip_conf) >> 4 & 0x3) { in em28xx_i2c_eeprom()
827 dev_info(&dev->intf->dev, "\tNo audio on board.\n"); in em28xx_i2c_eeprom()
830 dev_info(&dev->intf->dev, "\tAC97 audio (5 sample rates)\n"); in em28xx_i2c_eeprom()
833 if (dev->chip_id < CHIP_ID_EM2860) in em28xx_i2c_eeprom()
834 dev_info(&dev->intf->dev, in em28xx_i2c_eeprom()
837 dev_info(&dev->intf->dev, in em28xx_i2c_eeprom()
841 if (dev->chip_id < CHIP_ID_EM2860) in em28xx_i2c_eeprom()
842 dev_info(&dev->intf->dev, in em28xx_i2c_eeprom()
845 dev_info(&dev->intf->dev, in em28xx_i2c_eeprom()
850 if (le16_to_cpu(dev_config->chip_conf) & 1 << 3) in em28xx_i2c_eeprom()
851 dev_info(&dev->intf->dev, "\tUSB Remote wakeup capable\n"); in em28xx_i2c_eeprom()
853 if (le16_to_cpu(dev_config->chip_conf) & 1 << 2) in em28xx_i2c_eeprom()
854 dev_info(&dev->intf->dev, "\tUSB Self power capable\n"); in em28xx_i2c_eeprom()
856 switch (le16_to_cpu(dev_config->chip_conf) & 0x3) { in em28xx_i2c_eeprom()
858 dev_info(&dev->intf->dev, "\t500mA max power\n"); in em28xx_i2c_eeprom()
861 dev_info(&dev->intf->dev, "\t400mA max power\n"); in em28xx_i2c_eeprom()
864 dev_info(&dev->intf->dev, "\t300mA max power\n"); in em28xx_i2c_eeprom()
867 dev_info(&dev->intf->dev, "\t200mA max power\n"); in em28xx_i2c_eeprom()
870 dev_info(&dev->intf->dev, in em28xx_i2c_eeprom()
872 dev_config->string_idx_table, in em28xx_i2c_eeprom()
873 le16_to_cpu(dev_config->string1), in em28xx_i2c_eeprom()
874 le16_to_cpu(dev_config->string2), in em28xx_i2c_eeprom()
875 le16_to_cpu(dev_config->string3)); in em28xx_i2c_eeprom()
884 /* ----------------------------------------------------------- */
891 struct em28xx_i2c_bus *i2c_bus = i2c_adap->algo_data; in functionality()
893 if (i2c_bus->algo_type == EM28XX_I2C_ALGO_EM28XX || in functionality()
894 i2c_bus->algo_type == EM28XX_I2C_ALGO_EM25XX_BUS_B) { in functionality()
896 } else if (i2c_bus->algo_type == EM28XX_I2C_ALGO_EM2800) { in functionality()
920 /* ----------------------------------------------------------- */
948 * check i2c address range for devices
958 for (i = 0; i < ARRAY_SIZE(i2c_devs); i++) { in em28xx_do_i2c_scan()
959 dev->i2c_client[bus].addr = i; in em28xx_do_i2c_scan()
960 rc = i2c_master_recv(&dev->i2c_client[bus], &buf, 0); in em28xx_do_i2c_scan()
964 dev_info(&dev->intf->dev, in em28xx_do_i2c_scan()
969 if (bus == dev->def_i2c_bus) in em28xx_do_i2c_scan()
970 dev->i2c_hash = em28xx_hash_mem(i2c_devicelist, in em28xx_do_i2c_scan()
983 if (WARN_ON(!dev->em28xx_write_regs || !dev->em28xx_read_reg || in em28xx_i2c_register()
984 !dev->em28xx_write_regs_req || !dev->em28xx_read_reg_req)) in em28xx_i2c_register()
985 return -ENODEV; in em28xx_i2c_register()
988 return -ENODEV; in em28xx_i2c_register()
990 dev->i2c_adap[bus] = em28xx_adap_template; in em28xx_i2c_register()
991 dev->i2c_adap[bus].dev.parent = &dev->intf->dev; in em28xx_i2c_register()
992 strscpy(dev->i2c_adap[bus].name, dev_name(&dev->intf->dev), in em28xx_i2c_register()
993 sizeof(dev->i2c_adap[bus].name)); in em28xx_i2c_register()
995 dev->i2c_bus[bus].bus = bus; in em28xx_i2c_register()
996 dev->i2c_bus[bus].algo_type = algo_type; in em28xx_i2c_register()
997 dev->i2c_bus[bus].dev = dev; in em28xx_i2c_register()
998 dev->i2c_adap[bus].algo_data = &dev->i2c_bus[bus]; in em28xx_i2c_register()
1000 retval = i2c_add_adapter(&dev->i2c_adap[bus]); in em28xx_i2c_register()
1002 dev_err(&dev->intf->dev, in em28xx_i2c_register()
1008 dev->i2c_client[bus] = em28xx_client_template; in em28xx_i2c_register()
1009 dev->i2c_client[bus].adapter = &dev->i2c_adap[bus]; in em28xx_i2c_register()
1014 &dev->eedata, &dev->eedata_len); in em28xx_i2c_register()
1015 if (retval < 0 && retval != -ENODEV) { in em28xx_i2c_register()
1016 dev_err(&dev->intf->dev, in em28xx_i2c_register()
1035 return -ENODEV; in em28xx_i2c_unregister()
1037 i2c_del_adapter(&dev->i2c_adap[bus]); in em28xx_i2c_unregister()