ccs-reg-access.c 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * drivers/media/i2c/ccs/ccs-reg-access.c
  4. *
  5. * Generic driver for MIPI CCS/SMIA/SMIA++ compliant camera sensors
  6. *
  7. * Copyright (C) 2020 Intel Corporation
  8. * Copyright (C) 2011--2012 Nokia Corporation
  9. * Contact: Sakari Ailus <sakari.ailus@linux.intel.com>
  10. */
  11. #include <linux/unaligned.h>
  12. #include <linux/delay.h>
  13. #include <linux/hex.h>
  14. #include <linux/i2c.h>
  15. #include "ccs.h"
  16. #include "ccs-limits.h"
  17. static u32 float_to_u32_mul_1000000(struct i2c_client *client, u32 phloat)
  18. {
  19. s32 exp;
  20. u64 man;
  21. if (phloat >= 0x80000000) {
  22. dev_err(&client->dev, "this is a negative number\n");
  23. return 0;
  24. }
  25. if (phloat == 0x7f800000)
  26. return ~0; /* Inf. */
  27. if ((phloat & 0x7f800000) == 0x7f800000) {
  28. dev_err(&client->dev, "NaN or other special number\n");
  29. return 0;
  30. }
  31. /* Valid cases begin here */
  32. if (phloat == 0)
  33. return 0; /* Valid zero */
  34. if (phloat > 0x4f800000)
  35. return ~0; /* larger than 4294967295 */
  36. /*
  37. * Unbias exponent (note how phloat is now guaranteed to
  38. * have 0 in the high bit)
  39. */
  40. exp = ((int32_t)phloat >> 23) - 127;
  41. /* Extract mantissa, add missing '1' bit and it's in MHz */
  42. man = ((phloat & 0x7fffff) | 0x800000) * 1000000ULL;
  43. if (exp < 0)
  44. man >>= -exp;
  45. else
  46. man <<= exp;
  47. man >>= 23; /* Remove mantissa bias */
  48. return man & 0xffffffff;
  49. }
  50. static u32 ireal32_to_u32_mul_1000000(struct i2c_client *client, u32 val)
  51. {
  52. if (val >> 10 > U32_MAX / 15625) {
  53. dev_warn(&client->dev, "value %u overflows!\n", val);
  54. return U32_MAX;
  55. }
  56. return ((val >> 10) * 15625) +
  57. (val & GENMASK(9, 0)) * 15625 / 1024;
  58. }
  59. u32 ccs_reg_conv(struct ccs_sensor *sensor, u32 reg, u32 val)
  60. {
  61. struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
  62. if (reg & CCS_FL_FLOAT_IREAL) {
  63. if (CCS_LIM(sensor, CLOCK_CAPA_TYPE_CAPABILITY) &
  64. CCS_CLOCK_CAPA_TYPE_CAPABILITY_IREAL)
  65. val = ireal32_to_u32_mul_1000000(client, val);
  66. else
  67. val = float_to_u32_mul_1000000(client, val);
  68. } else if (reg & CCS_FL_IREAL) {
  69. val = ireal32_to_u32_mul_1000000(client, val);
  70. }
  71. return val;
  72. }
  73. /*
  74. * Read a 8/16/32-bit i2c register. The value is returned in 'val'.
  75. * Returns zero if successful, or non-zero otherwise.
  76. */
  77. static int __ccs_read_addr(struct ccs_sensor *sensor, u32 reg, u32 *val,
  78. bool only8, bool conv)
  79. {
  80. u64 __val;
  81. int rval;
  82. rval = cci_read(sensor->regmap, reg, &__val, NULL);
  83. if (rval < 0)
  84. return rval;
  85. *val = conv ? ccs_reg_conv(sensor, reg, __val) : __val;
  86. return 0;
  87. }
  88. static int __ccs_static_data_read_ro_reg(struct ccs_reg *regs, size_t num_regs,
  89. u32 reg, u32 *val)
  90. {
  91. unsigned int width = CCI_REG_WIDTH_BYTES(reg);
  92. size_t i;
  93. for (i = 0; i < num_regs; i++, regs++) {
  94. u8 *data;
  95. if (regs->addr + regs->len < CCS_REG_ADDR(reg) + width)
  96. continue;
  97. if (regs->addr > CCS_REG_ADDR(reg))
  98. break;
  99. data = &regs->value[CCS_REG_ADDR(reg) - regs->addr];
  100. switch (width) {
  101. case sizeof(u8):
  102. *val = *data;
  103. break;
  104. case sizeof(u16):
  105. *val = get_unaligned_be16(data);
  106. break;
  107. case sizeof(u32):
  108. *val = get_unaligned_be32(data);
  109. break;
  110. default:
  111. WARN_ON(1);
  112. return -EINVAL;
  113. }
  114. return 0;
  115. }
  116. return -ENOENT;
  117. }
  118. static int
  119. ccs_static_data_read_ro_reg(struct ccs_sensor *sensor, u32 reg, u32 *val)
  120. {
  121. if (!__ccs_static_data_read_ro_reg(sensor->sdata.sensor_read_only_regs,
  122. sensor->sdata.num_sensor_read_only_regs,
  123. reg, val))
  124. return 0;
  125. return __ccs_static_data_read_ro_reg(sensor->mdata.module_read_only_regs,
  126. sensor->mdata.num_module_read_only_regs,
  127. reg, val);
  128. }
  129. static int ccs_read_addr_raw(struct ccs_sensor *sensor, u32 reg, u32 *val,
  130. bool force8, bool quirk, bool conv, bool data)
  131. {
  132. int rval;
  133. if (data) {
  134. rval = ccs_static_data_read_ro_reg(sensor, reg, val);
  135. if (!rval)
  136. return 0;
  137. }
  138. if (quirk) {
  139. *val = 0;
  140. rval = ccs_call_quirk(sensor, reg_access, false, &reg, val);
  141. if (rval == -ENOIOCTLCMD)
  142. return 0;
  143. if (rval < 0)
  144. return rval;
  145. if (force8)
  146. return __ccs_read_addr(sensor, reg, val, true, conv);
  147. }
  148. return __ccs_read_addr(sensor, reg, val,
  149. ccs_needs_quirk(sensor,
  150. CCS_QUIRK_FLAG_8BIT_READ_ONLY),
  151. conv);
  152. }
  153. int ccs_read_addr(struct ccs_sensor *sensor, u32 reg, u32 *val)
  154. {
  155. return ccs_read_addr_raw(sensor, reg, val, false, true, true, true);
  156. }
  157. int ccs_read_addr_8only(struct ccs_sensor *sensor, u32 reg, u32 *val)
  158. {
  159. return ccs_read_addr_raw(sensor, reg, val, true, true, true, true);
  160. }
  161. int ccs_read_addr_noconv(struct ccs_sensor *sensor, u32 reg, u32 *val)
  162. {
  163. return ccs_read_addr_raw(sensor, reg, val, false, true, false, true);
  164. }
  165. /*
  166. * Write to a 8/16-bit register.
  167. * Returns zero if successful, or non-zero otherwise.
  168. */
  169. int ccs_write_addr(struct ccs_sensor *sensor, u32 reg, u32 val)
  170. {
  171. int rval;
  172. rval = ccs_call_quirk(sensor, reg_access, true, &reg, &val);
  173. if (rval == -ENOIOCTLCMD)
  174. return 0;
  175. if (rval < 0)
  176. return rval;
  177. return cci_write(sensor->regmap, reg, val, NULL);
  178. }
  179. #define MAX_WRITE_LEN 32U
  180. int ccs_write_data_regs(struct ccs_sensor *sensor, struct ccs_reg *regs,
  181. size_t num_regs)
  182. {
  183. struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
  184. size_t i;
  185. for (i = 0; i < num_regs; i++, regs++) {
  186. unsigned char *regdata = regs->value;
  187. unsigned int j;
  188. int len;
  189. for (j = 0; j < regs->len; j += len, regdata += len) {
  190. char printbuf[(MAX_WRITE_LEN << 1) +
  191. 1 /* \0 */] = { 0 };
  192. unsigned int retries = 10;
  193. int rval;
  194. len = min(regs->len - j, MAX_WRITE_LEN);
  195. bin2hex(printbuf, regdata, len);
  196. dev_dbg(&client->dev,
  197. "writing msr reg 0x%4.4x value 0x%s\n",
  198. regs->addr + j, printbuf);
  199. do {
  200. rval = regmap_bulk_write(sensor->regmap,
  201. regs->addr + j,
  202. regdata, len);
  203. if (rval)
  204. fsleep(1000);
  205. } while (rval && --retries);
  206. if (rval) {
  207. dev_err(&client->dev,
  208. "error writing %u octets to address 0x%4.4x\n",
  209. len, regs->addr + j);
  210. return rval;
  211. }
  212. }
  213. }
  214. return 0;
  215. }