ccs.h 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * drivers/media/i2c/smiapp/ccs.h
  4. *
  5. * Generic driver for MIPI CCS/SMIA/SMIA++ compliant camera sensors
  6. *
  7. * Copyright (C) 2020 Intel Corporation
  8. * Copyright (C) 2010--2012 Nokia Corporation
  9. * Contact: Sakari Ailus <[email protected]>
  10. */
  11. #ifndef __CCS_H__
  12. #define __CCS_H__
  13. #include <linux/mutex.h>
  14. #include <media/v4l2-ctrls.h>
  15. #include <media/v4l2-subdev.h>
  16. #include "ccs-data.h"
  17. #include "ccs-limits.h"
  18. #include "ccs-quirk.h"
  19. #include "ccs-regs.h"
  20. #include "ccs-reg-access.h"
  21. #include "../ccs-pll.h"
  22. #include "smiapp-reg-defs.h"
  23. /*
  24. * Standard SMIA++ constants
  25. */
  26. #define SMIA_VERSION_1 10
  27. #define SMIAPP_VERSION_0_8 8 /* Draft 0.8 */
  28. #define SMIAPP_VERSION_0_9 9 /* Draft 0.9 */
  29. #define SMIAPP_VERSION_1 10
  30. #define SMIAPP_PROFILE_0 0
  31. #define SMIAPP_PROFILE_1 1
  32. #define SMIAPP_PROFILE_2 2
  33. #define SMIAPP_NVM_PAGE_SIZE 64 /* bytes */
  34. #define SMIAPP_RESET_DELAY_CLOCKS 2400
  35. #define SMIAPP_RESET_DELAY(clk) \
  36. (1000 + (SMIAPP_RESET_DELAY_CLOCKS * 1000 \
  37. + (clk) / 1000 - 1) / ((clk) / 1000))
  38. #define CCS_COLOUR_COMPONENTS 4
  39. #define SMIAPP_NAME "smiapp"
  40. #define CCS_NAME "ccs"
  41. #define CCS_DFL_I2C_ADDR (0x20 >> 1) /* Default I2C Address */
  42. #define CCS_ALT_I2C_ADDR (0x6e >> 1) /* Alternate I2C Address */
  43. #define CCS_LIM(sensor, limit) \
  44. ccs_get_limit(sensor, CCS_L_##limit, 0)
  45. #define CCS_LIM_AT(sensor, limit, offset) \
  46. ccs_get_limit(sensor, CCS_L_##limit, CCS_L_##limit##_OFFSET(offset))
  47. /*
  48. * Sometimes due to board layout considerations the camera module can be
  49. * mounted rotated. The typical rotation used is 180 degrees which can be
  50. * corrected by giving a default H-FLIP and V-FLIP in the sensor readout.
  51. * FIXME: rotation also changes the bayer pattern.
  52. */
  53. enum ccs_module_board_orient {
  54. CCS_MODULE_BOARD_ORIENT_0 = 0,
  55. CCS_MODULE_BOARD_ORIENT_180,
  56. };
  57. struct ccs_flash_strobe_parms {
  58. u8 mode;
  59. u32 strobe_width_high_us;
  60. u16 strobe_delay;
  61. u16 stobe_start_point;
  62. u8 trigger;
  63. };
  64. struct ccs_hwconfig {
  65. /*
  66. * Change the cci address if i2c_addr_alt is set.
  67. * Both default and alternate cci addr need to be present
  68. */
  69. unsigned short i2c_addr_dfl; /* Default i2c addr */
  70. unsigned short i2c_addr_alt; /* Alternate i2c addr */
  71. u32 ext_clk; /* sensor external clk */
  72. unsigned int lanes; /* Number of CSI-2 lanes */
  73. u32 csi_signalling_mode; /* CCS_CSI_SIGNALLING_MODE_* */
  74. u64 *op_sys_clock;
  75. enum ccs_module_board_orient module_board_orient;
  76. struct ccs_flash_strobe_parms *strobe_setup;
  77. };
  78. struct ccs_quirk;
  79. #define CCS_MODULE_IDENT_FLAG_REV_LE (1 << 0)
  80. struct ccs_module_ident {
  81. u16 mipi_manufacturer_id;
  82. u16 model_id;
  83. u8 smia_manufacturer_id;
  84. u8 revision_number_major;
  85. u8 flags;
  86. char *name;
  87. const struct ccs_quirk *quirk;
  88. };
  89. struct ccs_module_info {
  90. u32 smia_manufacturer_id;
  91. u32 mipi_manufacturer_id;
  92. u32 model_id;
  93. u32 revision_number;
  94. u32 module_year;
  95. u32 module_month;
  96. u32 module_day;
  97. u32 sensor_smia_manufacturer_id;
  98. u32 sensor_mipi_manufacturer_id;
  99. u32 sensor_model_id;
  100. u32 sensor_revision_number;
  101. u32 sensor_firmware_version;
  102. u32 smia_version;
  103. u32 smiapp_version;
  104. u32 ccs_version;
  105. char *name;
  106. const struct ccs_quirk *quirk;
  107. };
  108. #define CCS_IDENT_FQ(manufacturer, model, rev, fl, _name, _quirk) \
  109. { .smia_manufacturer_id = manufacturer, \
  110. .model_id = model, \
  111. .revision_number_major = rev, \
  112. .flags = fl, \
  113. .name = _name, \
  114. .quirk = _quirk, }
  115. #define CCS_IDENT_LQ(manufacturer, model, rev, _name, _quirk) \
  116. { .smia_manufacturer_id = manufacturer, \
  117. .model_id = model, \
  118. .revision_number_major = rev, \
  119. .flags = CCS_MODULE_IDENT_FLAG_REV_LE, \
  120. .name = _name, \
  121. .quirk = _quirk, }
  122. #define CCS_IDENT_L(manufacturer, model, rev, _name) \
  123. { .smia_manufacturer_id = manufacturer, \
  124. .model_id = model, \
  125. .revision_number_major = rev, \
  126. .flags = CCS_MODULE_IDENT_FLAG_REV_LE, \
  127. .name = _name, }
  128. #define CCS_IDENT_Q(manufacturer, model, rev, _name, _quirk) \
  129. { .smia_manufacturer_id = manufacturer, \
  130. .model_id = model, \
  131. .revision_number_major = rev, \
  132. .flags = 0, \
  133. .name = _name, \
  134. .quirk = _quirk, }
  135. #define CCS_IDENT(manufacturer, model, rev, _name) \
  136. { .smia_manufacturer_id = manufacturer, \
  137. .model_id = model, \
  138. .revision_number_major = rev, \
  139. .flags = 0, \
  140. .name = _name, }
  141. struct ccs_csi_data_format {
  142. u32 code;
  143. u8 width;
  144. u8 compressed;
  145. u8 pixel_order;
  146. };
  147. #define CCS_SUBDEVS 3
  148. #define CCS_PA_PAD_SRC 0
  149. #define CCS_PAD_SINK 0
  150. #define CCS_PAD_SRC 1
  151. #define CCS_PADS 2
  152. struct ccs_binning_subtype {
  153. u8 horizontal:4;
  154. u8 vertical:4;
  155. } __packed;
  156. struct ccs_subdev {
  157. struct v4l2_subdev sd;
  158. struct media_pad pads[CCS_PADS];
  159. struct v4l2_rect sink_fmt;
  160. struct v4l2_rect crop[CCS_PADS];
  161. struct v4l2_rect compose; /* compose on sink */
  162. unsigned short sink_pad;
  163. unsigned short source_pad;
  164. int npads;
  165. struct ccs_sensor *sensor;
  166. struct v4l2_ctrl_handler ctrl_handler;
  167. };
  168. /*
  169. * struct ccs_sensor - Main device structure
  170. */
  171. struct ccs_sensor {
  172. /*
  173. * "mutex" is used to serialise access to all fields here
  174. * except v4l2_ctrls at the end of the struct. "mutex" is also
  175. * used to serialise access to file handle specific
  176. * information.
  177. */
  178. struct mutex mutex;
  179. struct ccs_subdev ssds[CCS_SUBDEVS];
  180. u32 ssds_used;
  181. struct ccs_subdev *src;
  182. struct ccs_subdev *binner;
  183. struct ccs_subdev *scaler;
  184. struct ccs_subdev *pixel_array;
  185. struct ccs_hwconfig hwcfg;
  186. struct regulator_bulk_data *regulators;
  187. struct clk *ext_clk;
  188. struct gpio_desc *xshutdown;
  189. struct gpio_desc *reset;
  190. void *ccs_limits;
  191. u8 nbinning_subtypes;
  192. struct ccs_binning_subtype binning_subtypes[CCS_LIM_BINNING_SUB_TYPE_MAX_N + 1];
  193. u32 mbus_frame_fmts;
  194. const struct ccs_csi_data_format *csi_format;
  195. const struct ccs_csi_data_format *internal_csi_format;
  196. u32 default_mbus_frame_fmts;
  197. int default_pixel_order;
  198. struct ccs_data_container sdata, mdata;
  199. u8 binning_horizontal;
  200. u8 binning_vertical;
  201. u8 scale_m;
  202. u8 scaling_mode;
  203. u8 hvflip_inv_mask; /* H/VFLIP inversion due to sensor orientation */
  204. u8 frame_skip;
  205. u16 embedded_start; /* embedded data start line */
  206. u16 embedded_end;
  207. u16 image_start; /* image data start line */
  208. u16 visible_pixel_start; /* start pixel of the visible image */
  209. bool streaming;
  210. bool dev_init_done;
  211. u8 compressed_min_bpp;
  212. struct ccs_module_info minfo;
  213. struct ccs_pll pll;
  214. /* Is a default format supported for a given BPP? */
  215. unsigned long *valid_link_freqs;
  216. /* Pixel array controls */
  217. struct v4l2_ctrl *exposure;
  218. struct v4l2_ctrl *hflip;
  219. struct v4l2_ctrl *vflip;
  220. struct v4l2_ctrl *vblank;
  221. struct v4l2_ctrl *hblank;
  222. struct v4l2_ctrl *pixel_rate_parray;
  223. struct v4l2_ctrl *luminance_level;
  224. /* src controls */
  225. struct v4l2_ctrl *link_freq;
  226. struct v4l2_ctrl *pixel_rate_csi;
  227. /* test pattern colour components */
  228. struct v4l2_ctrl *test_data[CCS_COLOUR_COMPONENTS];
  229. };
  230. #define to_ccs_subdev(_sd) \
  231. container_of(_sd, struct ccs_subdev, sd)
  232. #define to_ccs_sensor(_sd) \
  233. (to_ccs_subdev(_sd)->sensor)
  234. void ccs_replace_limit(struct ccs_sensor *sensor,
  235. unsigned int limit, unsigned int offset, u32 val);
  236. u32 ccs_get_limit(struct ccs_sensor *sensor, unsigned int limit,
  237. unsigned int offset);
  238. #endif /* __CCS_H__ */