stk1160-i2c.c 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * STK1160 driver
  4. *
  5. * Copyright (C) 2012 Ezequiel Garcia
  6. * <elezegarcia--a.t--gmail.com>
  7. *
  8. * Based on Easycap driver by R.M. Thomas
  9. * Copyright (C) 2010 R.M. Thomas
  10. * <rmthomas--a.t--sciolus.org>
  11. */
  12. #include <linux/module.h>
  13. #include <linux/usb.h>
  14. #include <linux/i2c.h>
  15. #include "stk1160.h"
  16. #include "stk1160-reg.h"
  17. static unsigned int i2c_debug;
  18. module_param(i2c_debug, int, 0644);
  19. MODULE_PARM_DESC(i2c_debug, "enable debug messages [i2c]");
  20. #define dprintk_i2c(fmt, args...) \
  21. do { \
  22. if (i2c_debug) \
  23. printk(KERN_DEBUG fmt, ##args); \
  24. } while (0)
  25. static int stk1160_i2c_busy_wait(struct stk1160 *dev, u8 wait_bit_mask)
  26. {
  27. unsigned long end;
  28. u8 flag;
  29. /* Wait until read/write finish bit is set */
  30. end = jiffies + msecs_to_jiffies(STK1160_I2C_TIMEOUT);
  31. while (time_is_after_jiffies(end)) {
  32. stk1160_read_reg(dev, STK1160_SICTL+1, &flag);
  33. /* read/write done? */
  34. if (flag & wait_bit_mask)
  35. goto done;
  36. usleep_range(10 * USEC_PER_MSEC, 20 * USEC_PER_MSEC);
  37. }
  38. return -ETIMEDOUT;
  39. done:
  40. return 0;
  41. }
  42. static int stk1160_i2c_write_reg(struct stk1160 *dev, u8 addr,
  43. u8 reg, u8 value)
  44. {
  45. int rc;
  46. /* Set serial device address */
  47. rc = stk1160_write_reg(dev, STK1160_SICTL_SDA, addr);
  48. if (rc < 0)
  49. return rc;
  50. /* Set i2c device register sub-address */
  51. rc = stk1160_write_reg(dev, STK1160_SBUSW_WA, reg);
  52. if (rc < 0)
  53. return rc;
  54. /* Set i2c device register value */
  55. rc = stk1160_write_reg(dev, STK1160_SBUSW_WD, value);
  56. if (rc < 0)
  57. return rc;
  58. /* Start write now */
  59. rc = stk1160_write_reg(dev, STK1160_SICTL, 0x01);
  60. if (rc < 0)
  61. return rc;
  62. rc = stk1160_i2c_busy_wait(dev, 0x04);
  63. if (rc < 0)
  64. return rc;
  65. return 0;
  66. }
  67. static int stk1160_i2c_read_reg(struct stk1160 *dev, u8 addr,
  68. u8 reg, u8 *value)
  69. {
  70. int rc;
  71. /* Set serial device address */
  72. rc = stk1160_write_reg(dev, STK1160_SICTL_SDA, addr);
  73. if (rc < 0)
  74. return rc;
  75. /* Set i2c device register sub-address */
  76. rc = stk1160_write_reg(dev, STK1160_SBUSR_RA, reg);
  77. if (rc < 0)
  78. return rc;
  79. /* Start read now */
  80. rc = stk1160_write_reg(dev, STK1160_SICTL, 0x20);
  81. if (rc < 0)
  82. return rc;
  83. rc = stk1160_i2c_busy_wait(dev, 0x01);
  84. if (rc < 0)
  85. return rc;
  86. rc = stk1160_read_reg(dev, STK1160_SBUSR_RD, value);
  87. if (rc < 0)
  88. return rc;
  89. return 0;
  90. }
  91. /*
  92. * stk1160_i2c_check_for_device()
  93. * check if there is a i2c_device at the supplied address
  94. */
  95. static int stk1160_i2c_check_for_device(struct stk1160 *dev,
  96. unsigned char addr)
  97. {
  98. int rc;
  99. /* Set serial device address */
  100. rc = stk1160_write_reg(dev, STK1160_SICTL_SDA, addr);
  101. if (rc < 0)
  102. return rc;
  103. /* Set device sub-address, we'll chip version reg */
  104. rc = stk1160_write_reg(dev, STK1160_SBUSR_RA, 0x00);
  105. if (rc < 0)
  106. return rc;
  107. /* Start read now */
  108. rc = stk1160_write_reg(dev, STK1160_SICTL, 0x20);
  109. if (rc < 0)
  110. return rc;
  111. rc = stk1160_i2c_busy_wait(dev, 0x01);
  112. if (rc < 0)
  113. return -ENODEV;
  114. return 0;
  115. }
  116. /*
  117. * stk1160_i2c_xfer()
  118. * the main i2c transfer function
  119. */
  120. static int stk1160_i2c_xfer(struct i2c_adapter *i2c_adap,
  121. struct i2c_msg msgs[], int num)
  122. {
  123. struct stk1160 *dev = i2c_adap->algo_data;
  124. int addr, rc, i;
  125. for (i = 0; i < num; i++) {
  126. addr = msgs[i].addr << 1;
  127. dprintk_i2c("%s: addr=%x", __func__, addr);
  128. if (!msgs[i].len) {
  129. /* no len: check only for device presence */
  130. rc = stk1160_i2c_check_for_device(dev, addr);
  131. if (rc < 0) {
  132. dprintk_i2c(" no device\n");
  133. return rc;
  134. }
  135. } else if (msgs[i].flags & I2C_M_RD) {
  136. /* read request without preceding register selection */
  137. dprintk_i2c(" subaddr not selected");
  138. rc = -EOPNOTSUPP;
  139. goto err;
  140. } else if (i + 1 < num && msgs[i].len <= 2 &&
  141. (msgs[i + 1].flags & I2C_M_RD) &&
  142. msgs[i].addr == msgs[i + 1].addr) {
  143. if (msgs[i].len != 1 || msgs[i + 1].len != 1) {
  144. dprintk_i2c(" len not supported");
  145. rc = -EOPNOTSUPP;
  146. goto err;
  147. }
  148. dprintk_i2c(" subaddr=%x", msgs[i].buf[0]);
  149. rc = stk1160_i2c_read_reg(dev, addr, msgs[i].buf[0],
  150. msgs[i + 1].buf);
  151. dprintk_i2c(" read=%x", *msgs[i + 1].buf);
  152. /* consumed two msgs, so we skip one of them */
  153. i++;
  154. } else {
  155. if (msgs[i].len != 2) {
  156. dprintk_i2c(" len not supported");
  157. rc = -EOPNOTSUPP;
  158. goto err;
  159. }
  160. dprintk_i2c(" subaddr=%x write=%x",
  161. msgs[i].buf[0], msgs[i].buf[1]);
  162. rc = stk1160_i2c_write_reg(dev, addr, msgs[i].buf[0],
  163. msgs[i].buf[1]);
  164. }
  165. if (rc < 0)
  166. goto err;
  167. dprintk_i2c(" OK\n");
  168. }
  169. return num;
  170. err:
  171. dprintk_i2c(" ERROR: %d\n", rc);
  172. return num;
  173. }
  174. /*
  175. * functionality(), what da heck is this?
  176. */
  177. static u32 functionality(struct i2c_adapter *adap)
  178. {
  179. return I2C_FUNC_SMBUS_EMUL;
  180. }
  181. static const struct i2c_algorithm algo = {
  182. .master_xfer = stk1160_i2c_xfer,
  183. .functionality = functionality,
  184. };
  185. static const struct i2c_adapter adap_template = {
  186. .owner = THIS_MODULE,
  187. .name = "stk1160",
  188. .algo = &algo,
  189. };
  190. static const struct i2c_client client_template = {
  191. .name = "stk1160 internal",
  192. };
  193. /*
  194. * stk1160_i2c_register()
  195. * register i2c bus
  196. */
  197. int stk1160_i2c_register(struct stk1160 *dev)
  198. {
  199. int rc;
  200. dev->i2c_adap = adap_template;
  201. dev->i2c_adap.dev.parent = dev->dev;
  202. strscpy(dev->i2c_adap.name, "stk1160", sizeof(dev->i2c_adap.name));
  203. dev->i2c_adap.algo_data = dev;
  204. i2c_set_adapdata(&dev->i2c_adap, &dev->v4l2_dev);
  205. rc = i2c_add_adapter(&dev->i2c_adap);
  206. if (rc < 0) {
  207. stk1160_err("cannot add i2c adapter (%d)\n", rc);
  208. return rc;
  209. }
  210. dev->i2c_client = client_template;
  211. dev->i2c_client.adapter = &dev->i2c_adap;
  212. /* Set i2c clock divider device address */
  213. stk1160_write_reg(dev, STK1160_SICTL_CD, 0x0f);
  214. /* ??? */
  215. stk1160_write_reg(dev, STK1160_ASIC + 3, 0x00);
  216. return 0;
  217. }
  218. /*
  219. * stk1160_i2c_unregister()
  220. * unregister i2c_bus
  221. */
  222. int stk1160_i2c_unregister(struct stk1160 *dev)
  223. {
  224. i2c_del_adapter(&dev->i2c_adap);
  225. return 0;
  226. }