imx208.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110
  1. // SPDX-License-Identifier: GPL-2.0
  2. // Copyright (C) 2021 Intel Corporation
  3. #include <linux/acpi.h>
  4. #include <linux/delay.h>
  5. #include <linux/i2c.h>
  6. #include <linux/module.h>
  7. #include <linux/pm_runtime.h>
  8. #include <media/v4l2-ctrls.h>
  9. #include <media/v4l2-device.h>
  10. #include <asm/unaligned.h>
  11. #define IMX208_REG_MODE_SELECT 0x0100
  12. #define IMX208_MODE_STANDBY 0x00
  13. #define IMX208_MODE_STREAMING 0x01
  14. /* Chip ID */
  15. #define IMX208_REG_CHIP_ID 0x0000
  16. #define IMX208_CHIP_ID 0x0208
  17. /* V_TIMING internal */
  18. #define IMX208_REG_VTS 0x0340
  19. #define IMX208_VTS_60FPS 0x0472
  20. #define IMX208_VTS_BINNING 0x0239
  21. #define IMX208_VTS_60FPS_MIN 0x0458
  22. #define IMX208_VTS_BINNING_MIN 0x0230
  23. #define IMX208_VTS_MAX 0xffff
  24. /* HBLANK control - read only */
  25. #define IMX208_PPL_384MHZ 2248
  26. #define IMX208_PPL_96MHZ 2248
  27. /* Exposure control */
  28. #define IMX208_REG_EXPOSURE 0x0202
  29. #define IMX208_EXPOSURE_MIN 4
  30. #define IMX208_EXPOSURE_STEP 1
  31. #define IMX208_EXPOSURE_DEFAULT 0x190
  32. #define IMX208_EXPOSURE_MAX 65535
  33. /* Analog gain control */
  34. #define IMX208_REG_ANALOG_GAIN 0x0204
  35. #define IMX208_ANA_GAIN_MIN 0
  36. #define IMX208_ANA_GAIN_MAX 0x00e0
  37. #define IMX208_ANA_GAIN_STEP 1
  38. #define IMX208_ANA_GAIN_DEFAULT 0x0
  39. /* Digital gain control */
  40. #define IMX208_REG_GR_DIGITAL_GAIN 0x020e
  41. #define IMX208_REG_R_DIGITAL_GAIN 0x0210
  42. #define IMX208_REG_B_DIGITAL_GAIN 0x0212
  43. #define IMX208_REG_GB_DIGITAL_GAIN 0x0214
  44. #define IMX208_DIGITAL_GAIN_SHIFT 8
  45. /* Orientation */
  46. #define IMX208_REG_ORIENTATION_CONTROL 0x0101
  47. /* Test Pattern Control */
  48. #define IMX208_REG_TEST_PATTERN_MODE 0x0600
  49. #define IMX208_TEST_PATTERN_DISABLE 0x0
  50. #define IMX208_TEST_PATTERN_SOLID_COLOR 0x1
  51. #define IMX208_TEST_PATTERN_COLOR_BARS 0x2
  52. #define IMX208_TEST_PATTERN_GREY_COLOR 0x3
  53. #define IMX208_TEST_PATTERN_PN9 0x4
  54. #define IMX208_TEST_PATTERN_FIX_1 0x100
  55. #define IMX208_TEST_PATTERN_FIX_2 0x101
  56. #define IMX208_TEST_PATTERN_FIX_3 0x102
  57. #define IMX208_TEST_PATTERN_FIX_4 0x103
  58. #define IMX208_TEST_PATTERN_FIX_5 0x104
  59. #define IMX208_TEST_PATTERN_FIX_6 0x105
  60. /* OTP Access */
  61. #define IMX208_OTP_BASE 0x3500
  62. #define IMX208_OTP_SIZE 40
  63. struct imx208_reg {
  64. u16 address;
  65. u8 val;
  66. };
  67. struct imx208_reg_list {
  68. u32 num_of_regs;
  69. const struct imx208_reg *regs;
  70. };
  71. /* Link frequency config */
  72. struct imx208_link_freq_config {
  73. u32 pixels_per_line;
  74. /* PLL registers for this link frequency */
  75. struct imx208_reg_list reg_list;
  76. };
  77. /* Mode : resolution and related config&values */
  78. struct imx208_mode {
  79. /* Frame width */
  80. u32 width;
  81. /* Frame height */
  82. u32 height;
  83. /* V-timing */
  84. u32 vts_def;
  85. u32 vts_min;
  86. /* Index of Link frequency config to be used */
  87. u32 link_freq_index;
  88. /* Default register values */
  89. struct imx208_reg_list reg_list;
  90. };
  91. static const struct imx208_reg pll_ctrl_reg[] = {
  92. {0x0305, 0x02},
  93. {0x0307, 0x50},
  94. {0x303C, 0x3C},
  95. };
  96. static const struct imx208_reg mode_1936x1096_60fps_regs[] = {
  97. {0x0340, 0x04},
  98. {0x0341, 0x72},
  99. {0x0342, 0x04},
  100. {0x0343, 0x64},
  101. {0x034C, 0x07},
  102. {0x034D, 0x90},
  103. {0x034E, 0x04},
  104. {0x034F, 0x48},
  105. {0x0381, 0x01},
  106. {0x0383, 0x01},
  107. {0x0385, 0x01},
  108. {0x0387, 0x01},
  109. {0x3048, 0x00},
  110. {0x3050, 0x01},
  111. {0x30D5, 0x00},
  112. {0x3301, 0x00},
  113. {0x3318, 0x62},
  114. {0x0202, 0x01},
  115. {0x0203, 0x90},
  116. {0x0205, 0x00},
  117. };
  118. static const struct imx208_reg mode_968_548_60fps_regs[] = {
  119. {0x0340, 0x02},
  120. {0x0341, 0x39},
  121. {0x0342, 0x08},
  122. {0x0343, 0xC8},
  123. {0x034C, 0x03},
  124. {0x034D, 0xC8},
  125. {0x034E, 0x02},
  126. {0x034F, 0x24},
  127. {0x0381, 0x01},
  128. {0x0383, 0x03},
  129. {0x0385, 0x01},
  130. {0x0387, 0x03},
  131. {0x3048, 0x01},
  132. {0x3050, 0x02},
  133. {0x30D5, 0x03},
  134. {0x3301, 0x10},
  135. {0x3318, 0x75},
  136. {0x0202, 0x01},
  137. {0x0203, 0x90},
  138. {0x0205, 0x00},
  139. };
  140. static const s64 imx208_discrete_digital_gain[] = {
  141. 1, 2, 4, 8, 16,
  142. };
  143. static const char * const imx208_test_pattern_menu[] = {
  144. "Disabled",
  145. "Solid Color",
  146. "100% Color Bar",
  147. "Fade to Grey Color Bar",
  148. "PN9",
  149. "Fixed Pattern1",
  150. "Fixed Pattern2",
  151. "Fixed Pattern3",
  152. "Fixed Pattern4",
  153. "Fixed Pattern5",
  154. "Fixed Pattern6"
  155. };
  156. static const int imx208_test_pattern_val[] = {
  157. IMX208_TEST_PATTERN_DISABLE,
  158. IMX208_TEST_PATTERN_SOLID_COLOR,
  159. IMX208_TEST_PATTERN_COLOR_BARS,
  160. IMX208_TEST_PATTERN_GREY_COLOR,
  161. IMX208_TEST_PATTERN_PN9,
  162. IMX208_TEST_PATTERN_FIX_1,
  163. IMX208_TEST_PATTERN_FIX_2,
  164. IMX208_TEST_PATTERN_FIX_3,
  165. IMX208_TEST_PATTERN_FIX_4,
  166. IMX208_TEST_PATTERN_FIX_5,
  167. IMX208_TEST_PATTERN_FIX_6,
  168. };
  169. /* Configurations for supported link frequencies */
  170. #define IMX208_MHZ (1000 * 1000ULL)
  171. #define IMX208_LINK_FREQ_384MHZ (384ULL * IMX208_MHZ)
  172. #define IMX208_LINK_FREQ_96MHZ (96ULL * IMX208_MHZ)
  173. #define IMX208_DATA_RATE_DOUBLE 2
  174. #define IMX208_NUM_OF_LANES 2
  175. #define IMX208_PIXEL_BITS 10
  176. enum {
  177. IMX208_LINK_FREQ_384MHZ_INDEX,
  178. IMX208_LINK_FREQ_96MHZ_INDEX,
  179. };
  180. /*
  181. * pixel_rate = link_freq * data-rate * nr_of_lanes / bits_per_sample
  182. * data rate => double data rate; number of lanes => 2; bits per pixel => 10
  183. */
  184. static u64 link_freq_to_pixel_rate(u64 f)
  185. {
  186. f *= IMX208_DATA_RATE_DOUBLE * IMX208_NUM_OF_LANES;
  187. do_div(f, IMX208_PIXEL_BITS);
  188. return f;
  189. }
  190. /* Menu items for LINK_FREQ V4L2 control */
  191. static const s64 link_freq_menu_items[] = {
  192. [IMX208_LINK_FREQ_384MHZ_INDEX] = IMX208_LINK_FREQ_384MHZ,
  193. [IMX208_LINK_FREQ_96MHZ_INDEX] = IMX208_LINK_FREQ_96MHZ,
  194. };
  195. /* Link frequency configs */
  196. static const struct imx208_link_freq_config link_freq_configs[] = {
  197. [IMX208_LINK_FREQ_384MHZ_INDEX] = {
  198. .pixels_per_line = IMX208_PPL_384MHZ,
  199. .reg_list = {
  200. .num_of_regs = ARRAY_SIZE(pll_ctrl_reg),
  201. .regs = pll_ctrl_reg,
  202. }
  203. },
  204. [IMX208_LINK_FREQ_96MHZ_INDEX] = {
  205. .pixels_per_line = IMX208_PPL_96MHZ,
  206. .reg_list = {
  207. .num_of_regs = ARRAY_SIZE(pll_ctrl_reg),
  208. .regs = pll_ctrl_reg,
  209. }
  210. },
  211. };
  212. /* Mode configs */
  213. static const struct imx208_mode supported_modes[] = {
  214. {
  215. .width = 1936,
  216. .height = 1096,
  217. .vts_def = IMX208_VTS_60FPS,
  218. .vts_min = IMX208_VTS_60FPS_MIN,
  219. .reg_list = {
  220. .num_of_regs = ARRAY_SIZE(mode_1936x1096_60fps_regs),
  221. .regs = mode_1936x1096_60fps_regs,
  222. },
  223. .link_freq_index = IMX208_LINK_FREQ_384MHZ_INDEX,
  224. },
  225. {
  226. .width = 968,
  227. .height = 548,
  228. .vts_def = IMX208_VTS_BINNING,
  229. .vts_min = IMX208_VTS_BINNING_MIN,
  230. .reg_list = {
  231. .num_of_regs = ARRAY_SIZE(mode_968_548_60fps_regs),
  232. .regs = mode_968_548_60fps_regs,
  233. },
  234. .link_freq_index = IMX208_LINK_FREQ_96MHZ_INDEX,
  235. },
  236. };
  237. struct imx208 {
  238. struct v4l2_subdev sd;
  239. struct media_pad pad;
  240. struct v4l2_ctrl_handler ctrl_handler;
  241. /* V4L2 Controls */
  242. struct v4l2_ctrl *link_freq;
  243. struct v4l2_ctrl *pixel_rate;
  244. struct v4l2_ctrl *vblank;
  245. struct v4l2_ctrl *hblank;
  246. struct v4l2_ctrl *vflip;
  247. struct v4l2_ctrl *hflip;
  248. /* Current mode */
  249. const struct imx208_mode *cur_mode;
  250. /*
  251. * Mutex for serialized access:
  252. * Protect sensor set pad format and start/stop streaming safely.
  253. * Protect access to sensor v4l2 controls.
  254. */
  255. struct mutex imx208_mx;
  256. /* Streaming on/off */
  257. bool streaming;
  258. /* OTP data */
  259. bool otp_read;
  260. char otp_data[IMX208_OTP_SIZE];
  261. /* True if the device has been identified */
  262. bool identified;
  263. };
  264. static inline struct imx208 *to_imx208(struct v4l2_subdev *_sd)
  265. {
  266. return container_of(_sd, struct imx208, sd);
  267. }
  268. /* Get bayer order based on flip setting. */
  269. static u32 imx208_get_format_code(struct imx208 *imx208)
  270. {
  271. /*
  272. * Only one bayer order is supported.
  273. * It depends on the flip settings.
  274. */
  275. static const u32 codes[2][2] = {
  276. { MEDIA_BUS_FMT_SRGGB10_1X10, MEDIA_BUS_FMT_SGRBG10_1X10, },
  277. { MEDIA_BUS_FMT_SGBRG10_1X10, MEDIA_BUS_FMT_SBGGR10_1X10, },
  278. };
  279. return codes[imx208->vflip->val][imx208->hflip->val];
  280. }
  281. /* Read registers up to 4 at a time */
  282. static int imx208_read_reg(struct imx208 *imx208, u16 reg, u32 len, u32 *val)
  283. {
  284. struct i2c_client *client = v4l2_get_subdevdata(&imx208->sd);
  285. struct i2c_msg msgs[2];
  286. u8 addr_buf[2] = { reg >> 8, reg & 0xff };
  287. u8 data_buf[4] = { 0, };
  288. int ret;
  289. if (len > 4)
  290. return -EINVAL;
  291. /* Write register address */
  292. msgs[0].addr = client->addr;
  293. msgs[0].flags = 0;
  294. msgs[0].len = ARRAY_SIZE(addr_buf);
  295. msgs[0].buf = addr_buf;
  296. /* Read data from register */
  297. msgs[1].addr = client->addr;
  298. msgs[1].flags = I2C_M_RD;
  299. msgs[1].len = len;
  300. msgs[1].buf = &data_buf[4 - len];
  301. ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
  302. if (ret != ARRAY_SIZE(msgs))
  303. return -EIO;
  304. *val = get_unaligned_be32(data_buf);
  305. return 0;
  306. }
  307. /* Write registers up to 4 at a time */
  308. static int imx208_write_reg(struct imx208 *imx208, u16 reg, u32 len, u32 val)
  309. {
  310. struct i2c_client *client = v4l2_get_subdevdata(&imx208->sd);
  311. u8 buf[6];
  312. if (len > 4)
  313. return -EINVAL;
  314. put_unaligned_be16(reg, buf);
  315. put_unaligned_be32(val << (8 * (4 - len)), buf + 2);
  316. if (i2c_master_send(client, buf, len + 2) != len + 2)
  317. return -EIO;
  318. return 0;
  319. }
  320. /* Write a list of registers */
  321. static int imx208_write_regs(struct imx208 *imx208,
  322. const struct imx208_reg *regs, u32 len)
  323. {
  324. struct i2c_client *client = v4l2_get_subdevdata(&imx208->sd);
  325. unsigned int i;
  326. int ret;
  327. for (i = 0; i < len; i++) {
  328. ret = imx208_write_reg(imx208, regs[i].address, 1,
  329. regs[i].val);
  330. if (ret) {
  331. dev_err_ratelimited(&client->dev,
  332. "Failed to write reg 0x%4.4x. error = %d\n",
  333. regs[i].address, ret);
  334. return ret;
  335. }
  336. }
  337. return 0;
  338. }
  339. /* Open sub-device */
  340. static int imx208_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
  341. {
  342. struct v4l2_mbus_framefmt *try_fmt =
  343. v4l2_subdev_get_try_format(sd, fh->state, 0);
  344. /* Initialize try_fmt */
  345. try_fmt->width = supported_modes[0].width;
  346. try_fmt->height = supported_modes[0].height;
  347. try_fmt->code = MEDIA_BUS_FMT_SRGGB10_1X10;
  348. try_fmt->field = V4L2_FIELD_NONE;
  349. return 0;
  350. }
  351. static int imx208_update_digital_gain(struct imx208 *imx208, u32 len, u32 val)
  352. {
  353. int ret;
  354. val = imx208_discrete_digital_gain[val] << IMX208_DIGITAL_GAIN_SHIFT;
  355. ret = imx208_write_reg(imx208, IMX208_REG_GR_DIGITAL_GAIN, 2, val);
  356. if (ret)
  357. return ret;
  358. ret = imx208_write_reg(imx208, IMX208_REG_GB_DIGITAL_GAIN, 2, val);
  359. if (ret)
  360. return ret;
  361. ret = imx208_write_reg(imx208, IMX208_REG_R_DIGITAL_GAIN, 2, val);
  362. if (ret)
  363. return ret;
  364. return imx208_write_reg(imx208, IMX208_REG_B_DIGITAL_GAIN, 2, val);
  365. }
  366. static int imx208_set_ctrl(struct v4l2_ctrl *ctrl)
  367. {
  368. struct imx208 *imx208 =
  369. container_of(ctrl->handler, struct imx208, ctrl_handler);
  370. struct i2c_client *client = v4l2_get_subdevdata(&imx208->sd);
  371. int ret;
  372. /*
  373. * Applying V4L2 control value only happens
  374. * when power is up for streaming
  375. */
  376. if (!pm_runtime_get_if_in_use(&client->dev))
  377. return 0;
  378. switch (ctrl->id) {
  379. case V4L2_CID_ANALOGUE_GAIN:
  380. ret = imx208_write_reg(imx208, IMX208_REG_ANALOG_GAIN,
  381. 2, ctrl->val);
  382. break;
  383. case V4L2_CID_EXPOSURE:
  384. ret = imx208_write_reg(imx208, IMX208_REG_EXPOSURE,
  385. 2, ctrl->val);
  386. break;
  387. case V4L2_CID_DIGITAL_GAIN:
  388. ret = imx208_update_digital_gain(imx208, 2, ctrl->val);
  389. break;
  390. case V4L2_CID_VBLANK:
  391. /* Update VTS that meets expected vertical blanking */
  392. ret = imx208_write_reg(imx208, IMX208_REG_VTS, 2,
  393. imx208->cur_mode->height + ctrl->val);
  394. break;
  395. case V4L2_CID_TEST_PATTERN:
  396. ret = imx208_write_reg(imx208, IMX208_REG_TEST_PATTERN_MODE,
  397. 2, imx208_test_pattern_val[ctrl->val]);
  398. break;
  399. case V4L2_CID_HFLIP:
  400. case V4L2_CID_VFLIP:
  401. ret = imx208_write_reg(imx208, IMX208_REG_ORIENTATION_CONTROL,
  402. 1,
  403. imx208->hflip->val |
  404. imx208->vflip->val << 1);
  405. break;
  406. default:
  407. ret = -EINVAL;
  408. dev_err(&client->dev,
  409. "ctrl(id:0x%x,val:0x%x) is not handled\n",
  410. ctrl->id, ctrl->val);
  411. break;
  412. }
  413. pm_runtime_put(&client->dev);
  414. return ret;
  415. }
  416. static const struct v4l2_ctrl_ops imx208_ctrl_ops = {
  417. .s_ctrl = imx208_set_ctrl,
  418. };
  419. static const struct v4l2_ctrl_config imx208_digital_gain_control = {
  420. .ops = &imx208_ctrl_ops,
  421. .id = V4L2_CID_DIGITAL_GAIN,
  422. .name = "Digital Gain",
  423. .type = V4L2_CTRL_TYPE_INTEGER_MENU,
  424. .min = 0,
  425. .max = ARRAY_SIZE(imx208_discrete_digital_gain) - 1,
  426. .step = 0,
  427. .def = 0,
  428. .menu_skip_mask = 0,
  429. .qmenu_int = imx208_discrete_digital_gain,
  430. };
  431. static int imx208_enum_mbus_code(struct v4l2_subdev *sd,
  432. struct v4l2_subdev_state *sd_state,
  433. struct v4l2_subdev_mbus_code_enum *code)
  434. {
  435. struct imx208 *imx208 = to_imx208(sd);
  436. if (code->index > 0)
  437. return -EINVAL;
  438. code->code = imx208_get_format_code(imx208);
  439. return 0;
  440. }
  441. static int imx208_enum_frame_size(struct v4l2_subdev *sd,
  442. struct v4l2_subdev_state *sd_state,
  443. struct v4l2_subdev_frame_size_enum *fse)
  444. {
  445. struct imx208 *imx208 = to_imx208(sd);
  446. if (fse->index >= ARRAY_SIZE(supported_modes))
  447. return -EINVAL;
  448. if (fse->code != imx208_get_format_code(imx208))
  449. return -EINVAL;
  450. fse->min_width = supported_modes[fse->index].width;
  451. fse->max_width = fse->min_width;
  452. fse->min_height = supported_modes[fse->index].height;
  453. fse->max_height = fse->min_height;
  454. return 0;
  455. }
  456. static void imx208_mode_to_pad_format(struct imx208 *imx208,
  457. const struct imx208_mode *mode,
  458. struct v4l2_subdev_format *fmt)
  459. {
  460. fmt->format.width = mode->width;
  461. fmt->format.height = mode->height;
  462. fmt->format.code = imx208_get_format_code(imx208);
  463. fmt->format.field = V4L2_FIELD_NONE;
  464. }
  465. static int __imx208_get_pad_format(struct imx208 *imx208,
  466. struct v4l2_subdev_state *sd_state,
  467. struct v4l2_subdev_format *fmt)
  468. {
  469. if (fmt->which == V4L2_SUBDEV_FORMAT_TRY)
  470. fmt->format = *v4l2_subdev_get_try_format(&imx208->sd,
  471. sd_state,
  472. fmt->pad);
  473. else
  474. imx208_mode_to_pad_format(imx208, imx208->cur_mode, fmt);
  475. return 0;
  476. }
  477. static int imx208_get_pad_format(struct v4l2_subdev *sd,
  478. struct v4l2_subdev_state *sd_state,
  479. struct v4l2_subdev_format *fmt)
  480. {
  481. struct imx208 *imx208 = to_imx208(sd);
  482. int ret;
  483. mutex_lock(&imx208->imx208_mx);
  484. ret = __imx208_get_pad_format(imx208, sd_state, fmt);
  485. mutex_unlock(&imx208->imx208_mx);
  486. return ret;
  487. }
  488. static int imx208_set_pad_format(struct v4l2_subdev *sd,
  489. struct v4l2_subdev_state *sd_state,
  490. struct v4l2_subdev_format *fmt)
  491. {
  492. struct imx208 *imx208 = to_imx208(sd);
  493. const struct imx208_mode *mode;
  494. s32 vblank_def;
  495. s32 vblank_min;
  496. s64 h_blank;
  497. s64 pixel_rate;
  498. s64 link_freq;
  499. mutex_lock(&imx208->imx208_mx);
  500. fmt->format.code = imx208_get_format_code(imx208);
  501. mode = v4l2_find_nearest_size(supported_modes,
  502. ARRAY_SIZE(supported_modes), width, height,
  503. fmt->format.width, fmt->format.height);
  504. imx208_mode_to_pad_format(imx208, mode, fmt);
  505. if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) {
  506. *v4l2_subdev_get_try_format(sd, sd_state, fmt->pad) = fmt->format;
  507. } else {
  508. imx208->cur_mode = mode;
  509. __v4l2_ctrl_s_ctrl(imx208->link_freq, mode->link_freq_index);
  510. link_freq = link_freq_menu_items[mode->link_freq_index];
  511. pixel_rate = link_freq_to_pixel_rate(link_freq);
  512. __v4l2_ctrl_s_ctrl_int64(imx208->pixel_rate, pixel_rate);
  513. /* Update limits and set FPS to default */
  514. vblank_def = imx208->cur_mode->vts_def -
  515. imx208->cur_mode->height;
  516. vblank_min = imx208->cur_mode->vts_min -
  517. imx208->cur_mode->height;
  518. __v4l2_ctrl_modify_range(imx208->vblank, vblank_min,
  519. IMX208_VTS_MAX - imx208->cur_mode->height,
  520. 1, vblank_def);
  521. __v4l2_ctrl_s_ctrl(imx208->vblank, vblank_def);
  522. h_blank =
  523. link_freq_configs[mode->link_freq_index].pixels_per_line
  524. - imx208->cur_mode->width;
  525. __v4l2_ctrl_modify_range(imx208->hblank, h_blank,
  526. h_blank, 1, h_blank);
  527. }
  528. mutex_unlock(&imx208->imx208_mx);
  529. return 0;
  530. }
  531. static int imx208_identify_module(struct imx208 *imx208)
  532. {
  533. struct i2c_client *client = v4l2_get_subdevdata(&imx208->sd);
  534. int ret;
  535. u32 val;
  536. if (imx208->identified)
  537. return 0;
  538. ret = imx208_read_reg(imx208, IMX208_REG_CHIP_ID,
  539. 2, &val);
  540. if (ret) {
  541. dev_err(&client->dev, "failed to read chip id %x\n",
  542. IMX208_CHIP_ID);
  543. return ret;
  544. }
  545. if (val != IMX208_CHIP_ID) {
  546. dev_err(&client->dev, "chip id mismatch: %x!=%x\n",
  547. IMX208_CHIP_ID, val);
  548. return -EIO;
  549. }
  550. imx208->identified = true;
  551. return 0;
  552. }
  553. /* Start streaming */
  554. static int imx208_start_streaming(struct imx208 *imx208)
  555. {
  556. struct i2c_client *client = v4l2_get_subdevdata(&imx208->sd);
  557. const struct imx208_reg_list *reg_list;
  558. int ret, link_freq_index;
  559. ret = imx208_identify_module(imx208);
  560. if (ret)
  561. return ret;
  562. /* Setup PLL */
  563. link_freq_index = imx208->cur_mode->link_freq_index;
  564. reg_list = &link_freq_configs[link_freq_index].reg_list;
  565. ret = imx208_write_regs(imx208, reg_list->regs, reg_list->num_of_regs);
  566. if (ret) {
  567. dev_err(&client->dev, "%s failed to set plls\n", __func__);
  568. return ret;
  569. }
  570. /* Apply default values of current mode */
  571. reg_list = &imx208->cur_mode->reg_list;
  572. ret = imx208_write_regs(imx208, reg_list->regs, reg_list->num_of_regs);
  573. if (ret) {
  574. dev_err(&client->dev, "%s failed to set mode\n", __func__);
  575. return ret;
  576. }
  577. /* Apply customized values from user */
  578. ret = __v4l2_ctrl_handler_setup(imx208->sd.ctrl_handler);
  579. if (ret)
  580. return ret;
  581. /* set stream on register */
  582. return imx208_write_reg(imx208, IMX208_REG_MODE_SELECT,
  583. 1, IMX208_MODE_STREAMING);
  584. }
  585. /* Stop streaming */
  586. static int imx208_stop_streaming(struct imx208 *imx208)
  587. {
  588. struct i2c_client *client = v4l2_get_subdevdata(&imx208->sd);
  589. int ret;
  590. /* set stream off register */
  591. ret = imx208_write_reg(imx208, IMX208_REG_MODE_SELECT,
  592. 1, IMX208_MODE_STANDBY);
  593. if (ret)
  594. dev_err(&client->dev, "%s failed to set stream\n", __func__);
  595. /*
  596. * Return success even if it was an error, as there is nothing the
  597. * caller can do about it.
  598. */
  599. return 0;
  600. }
  601. static int imx208_set_stream(struct v4l2_subdev *sd, int enable)
  602. {
  603. struct imx208 *imx208 = to_imx208(sd);
  604. struct i2c_client *client = v4l2_get_subdevdata(sd);
  605. int ret = 0;
  606. mutex_lock(&imx208->imx208_mx);
  607. if (imx208->streaming == enable) {
  608. mutex_unlock(&imx208->imx208_mx);
  609. return 0;
  610. }
  611. if (enable) {
  612. ret = pm_runtime_get_sync(&client->dev);
  613. if (ret < 0)
  614. goto err_rpm_put;
  615. /*
  616. * Apply default & customized values
  617. * and then start streaming.
  618. */
  619. ret = imx208_start_streaming(imx208);
  620. if (ret)
  621. goto err_rpm_put;
  622. } else {
  623. imx208_stop_streaming(imx208);
  624. pm_runtime_put(&client->dev);
  625. }
  626. imx208->streaming = enable;
  627. mutex_unlock(&imx208->imx208_mx);
  628. /* vflip and hflip cannot change during streaming */
  629. v4l2_ctrl_grab(imx208->vflip, enable);
  630. v4l2_ctrl_grab(imx208->hflip, enable);
  631. return ret;
  632. err_rpm_put:
  633. pm_runtime_put(&client->dev);
  634. mutex_unlock(&imx208->imx208_mx);
  635. return ret;
  636. }
  637. static int __maybe_unused imx208_suspend(struct device *dev)
  638. {
  639. struct i2c_client *client = to_i2c_client(dev);
  640. struct v4l2_subdev *sd = i2c_get_clientdata(client);
  641. struct imx208 *imx208 = to_imx208(sd);
  642. if (imx208->streaming)
  643. imx208_stop_streaming(imx208);
  644. return 0;
  645. }
  646. static int __maybe_unused imx208_resume(struct device *dev)
  647. {
  648. struct i2c_client *client = to_i2c_client(dev);
  649. struct v4l2_subdev *sd = i2c_get_clientdata(client);
  650. struct imx208 *imx208 = to_imx208(sd);
  651. int ret;
  652. if (imx208->streaming) {
  653. ret = imx208_start_streaming(imx208);
  654. if (ret)
  655. goto error;
  656. }
  657. return 0;
  658. error:
  659. imx208_stop_streaming(imx208);
  660. imx208->streaming = 0;
  661. return ret;
  662. }
  663. /* Verify chip ID */
  664. static const struct v4l2_subdev_video_ops imx208_video_ops = {
  665. .s_stream = imx208_set_stream,
  666. };
  667. static const struct v4l2_subdev_pad_ops imx208_pad_ops = {
  668. .enum_mbus_code = imx208_enum_mbus_code,
  669. .get_fmt = imx208_get_pad_format,
  670. .set_fmt = imx208_set_pad_format,
  671. .enum_frame_size = imx208_enum_frame_size,
  672. };
  673. static const struct v4l2_subdev_ops imx208_subdev_ops = {
  674. .video = &imx208_video_ops,
  675. .pad = &imx208_pad_ops,
  676. };
  677. static const struct v4l2_subdev_internal_ops imx208_internal_ops = {
  678. .open = imx208_open,
  679. };
  680. static int imx208_read_otp(struct imx208 *imx208)
  681. {
  682. struct i2c_client *client = v4l2_get_subdevdata(&imx208->sd);
  683. struct i2c_msg msgs[2];
  684. u8 addr_buf[2] = { IMX208_OTP_BASE >> 8, IMX208_OTP_BASE & 0xff };
  685. int ret = 0;
  686. mutex_lock(&imx208->imx208_mx);
  687. if (imx208->otp_read)
  688. goto out_unlock;
  689. ret = pm_runtime_get_sync(&client->dev);
  690. if (ret < 0) {
  691. pm_runtime_put_noidle(&client->dev);
  692. goto out_unlock;
  693. }
  694. ret = imx208_identify_module(imx208);
  695. if (ret)
  696. goto out_pm_put;
  697. /* Write register address */
  698. msgs[0].addr = client->addr;
  699. msgs[0].flags = 0;
  700. msgs[0].len = ARRAY_SIZE(addr_buf);
  701. msgs[0].buf = addr_buf;
  702. /* Read data from registers */
  703. msgs[1].addr = client->addr;
  704. msgs[1].flags = I2C_M_RD;
  705. msgs[1].len = sizeof(imx208->otp_data);
  706. msgs[1].buf = imx208->otp_data;
  707. ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
  708. if (ret == ARRAY_SIZE(msgs)) {
  709. imx208->otp_read = true;
  710. ret = 0;
  711. }
  712. out_pm_put:
  713. pm_runtime_put(&client->dev);
  714. out_unlock:
  715. mutex_unlock(&imx208->imx208_mx);
  716. return ret;
  717. }
  718. static ssize_t otp_read(struct file *filp, struct kobject *kobj,
  719. struct bin_attribute *bin_attr,
  720. char *buf, loff_t off, size_t count)
  721. {
  722. struct i2c_client *client = to_i2c_client(kobj_to_dev(kobj));
  723. struct v4l2_subdev *sd = i2c_get_clientdata(client);
  724. struct imx208 *imx208 = to_imx208(sd);
  725. int ret;
  726. ret = imx208_read_otp(imx208);
  727. if (ret)
  728. return ret;
  729. memcpy(buf, &imx208->otp_data[off], count);
  730. return count;
  731. }
  732. static const BIN_ATTR_RO(otp, IMX208_OTP_SIZE);
  733. /* Initialize control handlers */
  734. static int imx208_init_controls(struct imx208 *imx208)
  735. {
  736. struct i2c_client *client = v4l2_get_subdevdata(&imx208->sd);
  737. struct v4l2_ctrl_handler *ctrl_hdlr = &imx208->ctrl_handler;
  738. s64 exposure_max;
  739. s64 vblank_def;
  740. s64 vblank_min;
  741. s64 pixel_rate_min;
  742. s64 pixel_rate_max;
  743. int ret;
  744. ret = v4l2_ctrl_handler_init(ctrl_hdlr, 8);
  745. if (ret)
  746. return ret;
  747. mutex_init(&imx208->imx208_mx);
  748. ctrl_hdlr->lock = &imx208->imx208_mx;
  749. imx208->link_freq =
  750. v4l2_ctrl_new_int_menu(ctrl_hdlr,
  751. &imx208_ctrl_ops,
  752. V4L2_CID_LINK_FREQ,
  753. ARRAY_SIZE(link_freq_menu_items) - 1,
  754. 0, link_freq_menu_items);
  755. if (imx208->link_freq)
  756. imx208->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
  757. pixel_rate_max = link_freq_to_pixel_rate(link_freq_menu_items[0]);
  758. pixel_rate_min =
  759. link_freq_to_pixel_rate(link_freq_menu_items[ARRAY_SIZE(link_freq_menu_items) - 1]);
  760. /* By default, PIXEL_RATE is read only */
  761. imx208->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &imx208_ctrl_ops,
  762. V4L2_CID_PIXEL_RATE,
  763. pixel_rate_min, pixel_rate_max,
  764. 1, pixel_rate_max);
  765. vblank_def = imx208->cur_mode->vts_def - imx208->cur_mode->height;
  766. vblank_min = imx208->cur_mode->vts_min - imx208->cur_mode->height;
  767. imx208->vblank =
  768. v4l2_ctrl_new_std(ctrl_hdlr, &imx208_ctrl_ops, V4L2_CID_VBLANK,
  769. vblank_min,
  770. IMX208_VTS_MAX - imx208->cur_mode->height, 1,
  771. vblank_def);
  772. imx208->hblank =
  773. v4l2_ctrl_new_std(ctrl_hdlr, &imx208_ctrl_ops, V4L2_CID_HBLANK,
  774. IMX208_PPL_384MHZ - imx208->cur_mode->width,
  775. IMX208_PPL_384MHZ - imx208->cur_mode->width,
  776. 1,
  777. IMX208_PPL_384MHZ - imx208->cur_mode->width);
  778. if (imx208->hblank)
  779. imx208->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
  780. exposure_max = imx208->cur_mode->vts_def - 8;
  781. v4l2_ctrl_new_std(ctrl_hdlr, &imx208_ctrl_ops, V4L2_CID_EXPOSURE,
  782. IMX208_EXPOSURE_MIN, exposure_max,
  783. IMX208_EXPOSURE_STEP, IMX208_EXPOSURE_DEFAULT);
  784. imx208->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx208_ctrl_ops,
  785. V4L2_CID_HFLIP, 0, 1, 1, 0);
  786. imx208->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx208_ctrl_ops,
  787. V4L2_CID_VFLIP, 0, 1, 1, 0);
  788. v4l2_ctrl_new_std(ctrl_hdlr, &imx208_ctrl_ops, V4L2_CID_ANALOGUE_GAIN,
  789. IMX208_ANA_GAIN_MIN, IMX208_ANA_GAIN_MAX,
  790. IMX208_ANA_GAIN_STEP, IMX208_ANA_GAIN_DEFAULT);
  791. v4l2_ctrl_new_custom(ctrl_hdlr, &imx208_digital_gain_control, NULL);
  792. v4l2_ctrl_new_std_menu_items(ctrl_hdlr, &imx208_ctrl_ops,
  793. V4L2_CID_TEST_PATTERN,
  794. ARRAY_SIZE(imx208_test_pattern_menu) - 1,
  795. 0, 0, imx208_test_pattern_menu);
  796. if (ctrl_hdlr->error) {
  797. ret = ctrl_hdlr->error;
  798. dev_err(&client->dev, "%s control init failed (%d)\n",
  799. __func__, ret);
  800. goto error;
  801. }
  802. imx208->sd.ctrl_handler = ctrl_hdlr;
  803. return 0;
  804. error:
  805. v4l2_ctrl_handler_free(ctrl_hdlr);
  806. mutex_destroy(&imx208->imx208_mx);
  807. return ret;
  808. }
  809. static void imx208_free_controls(struct imx208 *imx208)
  810. {
  811. v4l2_ctrl_handler_free(imx208->sd.ctrl_handler);
  812. }
  813. static int imx208_probe(struct i2c_client *client)
  814. {
  815. struct imx208 *imx208;
  816. int ret;
  817. bool full_power;
  818. u32 val = 0;
  819. device_property_read_u32(&client->dev, "clock-frequency", &val);
  820. if (val != 19200000) {
  821. dev_err(&client->dev,
  822. "Unsupported clock-frequency %u. Expected 19200000.\n",
  823. val);
  824. return -EINVAL;
  825. }
  826. imx208 = devm_kzalloc(&client->dev, sizeof(*imx208), GFP_KERNEL);
  827. if (!imx208)
  828. return -ENOMEM;
  829. /* Initialize subdev */
  830. v4l2_i2c_subdev_init(&imx208->sd, client, &imx208_subdev_ops);
  831. full_power = acpi_dev_state_d0(&client->dev);
  832. if (full_power) {
  833. /* Check module identity */
  834. ret = imx208_identify_module(imx208);
  835. if (ret) {
  836. dev_err(&client->dev, "failed to find sensor: %d", ret);
  837. goto error_probe;
  838. }
  839. }
  840. /* Set default mode to max resolution */
  841. imx208->cur_mode = &supported_modes[0];
  842. ret = imx208_init_controls(imx208);
  843. if (ret) {
  844. dev_err(&client->dev, "failed to init controls: %d", ret);
  845. goto error_probe;
  846. }
  847. /* Initialize subdev */
  848. imx208->sd.internal_ops = &imx208_internal_ops;
  849. imx208->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
  850. imx208->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
  851. /* Initialize source pad */
  852. imx208->pad.flags = MEDIA_PAD_FL_SOURCE;
  853. ret = media_entity_pads_init(&imx208->sd.entity, 1, &imx208->pad);
  854. if (ret) {
  855. dev_err(&client->dev, "%s failed:%d\n", __func__, ret);
  856. goto error_handler_free;
  857. }
  858. ret = v4l2_async_register_subdev_sensor(&imx208->sd);
  859. if (ret < 0)
  860. goto error_media_entity;
  861. ret = device_create_bin_file(&client->dev, &bin_attr_otp);
  862. if (ret) {
  863. dev_err(&client->dev, "sysfs otp creation failed\n");
  864. goto error_async_subdev;
  865. }
  866. /* Set the device's state to active if it's in D0 state. */
  867. if (full_power)
  868. pm_runtime_set_active(&client->dev);
  869. pm_runtime_enable(&client->dev);
  870. pm_runtime_idle(&client->dev);
  871. return 0;
  872. error_async_subdev:
  873. v4l2_async_unregister_subdev(&imx208->sd);
  874. error_media_entity:
  875. media_entity_cleanup(&imx208->sd.entity);
  876. error_handler_free:
  877. imx208_free_controls(imx208);
  878. error_probe:
  879. mutex_destroy(&imx208->imx208_mx);
  880. return ret;
  881. }
  882. static void imx208_remove(struct i2c_client *client)
  883. {
  884. struct v4l2_subdev *sd = i2c_get_clientdata(client);
  885. struct imx208 *imx208 = to_imx208(sd);
  886. device_remove_bin_file(&client->dev, &bin_attr_otp);
  887. v4l2_async_unregister_subdev(sd);
  888. media_entity_cleanup(&sd->entity);
  889. imx208_free_controls(imx208);
  890. pm_runtime_disable(&client->dev);
  891. pm_runtime_set_suspended(&client->dev);
  892. mutex_destroy(&imx208->imx208_mx);
  893. }
  894. static const struct dev_pm_ops imx208_pm_ops = {
  895. SET_SYSTEM_SLEEP_PM_OPS(imx208_suspend, imx208_resume)
  896. };
  897. #ifdef CONFIG_ACPI
  898. static const struct acpi_device_id imx208_acpi_ids[] = {
  899. { "INT3478" },
  900. { /* sentinel */ }
  901. };
  902. MODULE_DEVICE_TABLE(acpi, imx208_acpi_ids);
  903. #endif
  904. static struct i2c_driver imx208_i2c_driver = {
  905. .driver = {
  906. .name = "imx208",
  907. .pm = &imx208_pm_ops,
  908. .acpi_match_table = ACPI_PTR(imx208_acpi_ids),
  909. },
  910. .probe_new = imx208_probe,
  911. .remove = imx208_remove,
  912. .flags = I2C_DRV_ACPI_WAIVE_D0_PROBE,
  913. };
  914. module_i2c_driver(imx208_i2c_driver);
  915. MODULE_AUTHOR("Yeh, Andy <[email protected]>");
  916. MODULE_AUTHOR("Chen, Ping-chung <[email protected]>");
  917. MODULE_AUTHOR("Shawn Tu <[email protected]>");
  918. MODULE_DESCRIPTION("Sony IMX208 sensor driver");
  919. MODULE_LICENSE("GPL v2");