ov9734.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994
  1. // SPDX-License-Identifier: GPL-2.0
  2. // Copyright (c) 2020 Intel Corporation.
  3. #include <linux/acpi.h>
  4. #include <linux/clk.h>
  5. #include <linux/delay.h>
  6. #include <linux/i2c.h>
  7. #include <linux/module.h>
  8. #include <linux/pm_runtime.h>
  9. #include <linux/unaligned.h>
  10. #include <media/v4l2-ctrls.h>
  11. #include <media/v4l2-device.h>
  12. #include <media/v4l2-fwnode.h>
  13. #define OV9734_LINK_FREQ_180MHZ 180000000ULL
  14. #define OV9734_SCLK 36000000LL
  15. #define OV9734_MCLK 19200000
  16. /* ov9734 only support 1-lane mipi output */
  17. #define OV9734_DATA_LANES 1
  18. #define OV9734_RGB_DEPTH 10
  19. #define OV9734_REG_CHIP_ID 0x300a
  20. #define OV9734_CHIP_ID 0x9734
  21. #define OV9734_REG_MODE_SELECT 0x0100
  22. #define OV9734_MODE_STANDBY 0x00
  23. #define OV9734_MODE_STREAMING 0x01
  24. /* vertical-timings from sensor */
  25. #define OV9734_REG_VTS 0x380e
  26. #define OV9734_VTS_30FPS 0x0322
  27. #define OV9734_VTS_30FPS_MIN 0x0322
  28. #define OV9734_VTS_MAX 0x7fff
  29. /* horizontal-timings from sensor */
  30. #define OV9734_REG_HTS 0x380c
  31. /* Exposure controls from sensor */
  32. #define OV9734_REG_EXPOSURE 0x3500
  33. #define OV9734_EXPOSURE_MIN 4
  34. #define OV9734_EXPOSURE_MAX_MARGIN 4
  35. #define OV9734_EXPOSURE_STEP 1
  36. /* Analog gain controls from sensor */
  37. #define OV9734_REG_ANALOG_GAIN 0x350a
  38. #define OV9734_ANAL_GAIN_MIN 16
  39. #define OV9734_ANAL_GAIN_MAX 248
  40. #define OV9734_ANAL_GAIN_STEP 1
  41. /* Digital gain controls from sensor */
  42. #define OV9734_REG_MWB_R_GAIN 0x5180
  43. #define OV9734_REG_MWB_G_GAIN 0x5182
  44. #define OV9734_REG_MWB_B_GAIN 0x5184
  45. #define OV9734_DGTL_GAIN_MIN 256
  46. #define OV9734_DGTL_GAIN_MAX 1023
  47. #define OV9734_DGTL_GAIN_STEP 1
  48. #define OV9734_DGTL_GAIN_DEFAULT 256
  49. /* Test Pattern Control */
  50. #define OV9734_REG_TEST_PATTERN 0x5080
  51. #define OV9734_TEST_PATTERN_ENABLE BIT(7)
  52. #define OV9734_TEST_PATTERN_BAR_SHIFT 2
  53. /* Group Access */
  54. #define OV9734_REG_GROUP_ACCESS 0x3208
  55. #define OV9734_GROUP_HOLD_START 0x0
  56. #define OV9734_GROUP_HOLD_END 0x10
  57. #define OV9734_GROUP_HOLD_LAUNCH 0xa0
  58. enum {
  59. OV9734_LINK_FREQ_180MHZ_INDEX,
  60. };
  61. struct ov9734_reg {
  62. u16 address;
  63. u8 val;
  64. };
  65. struct ov9734_reg_list {
  66. u32 num_of_regs;
  67. const struct ov9734_reg *regs;
  68. };
  69. struct ov9734_link_freq_config {
  70. const struct ov9734_reg_list reg_list;
  71. };
  72. struct ov9734_mode {
  73. /* Frame width in pixels */
  74. u32 width;
  75. /* Frame height in pixels */
  76. u32 height;
  77. /* Horizontal timining size */
  78. u32 hts;
  79. /* Default vertical timining size */
  80. u32 vts_def;
  81. /* Min vertical timining size */
  82. u32 vts_min;
  83. /* Link frequency needed for this resolution */
  84. u32 link_freq_index;
  85. /* Sensor register settings for this resolution */
  86. const struct ov9734_reg_list reg_list;
  87. };
  88. static const struct ov9734_reg mipi_data_rate_360mbps[] = {
  89. {0x3030, 0x19},
  90. {0x3080, 0x02},
  91. {0x3081, 0x4b},
  92. {0x3082, 0x04},
  93. {0x3083, 0x00},
  94. {0x3084, 0x02},
  95. {0x3085, 0x01},
  96. {0x3086, 0x01},
  97. {0x3089, 0x01},
  98. {0x308a, 0x00},
  99. {0x301e, 0x15},
  100. {0x3103, 0x01},
  101. };
  102. static const struct ov9734_reg mode_1296x734_regs[] = {
  103. {0x3001, 0x00},
  104. {0x3002, 0x00},
  105. {0x3007, 0x00},
  106. {0x3010, 0x00},
  107. {0x3011, 0x08},
  108. {0x3014, 0x22},
  109. {0x3600, 0x55},
  110. {0x3601, 0x02},
  111. {0x3605, 0x22},
  112. {0x3611, 0xe7},
  113. {0x3654, 0x10},
  114. {0x3655, 0x77},
  115. {0x3656, 0x77},
  116. {0x3657, 0x07},
  117. {0x3658, 0x22},
  118. {0x3659, 0x22},
  119. {0x365a, 0x02},
  120. {0x3784, 0x05},
  121. {0x3785, 0x55},
  122. {0x37c0, 0x07},
  123. {0x3800, 0x00},
  124. {0x3801, 0x04},
  125. {0x3802, 0x00},
  126. {0x3803, 0x04},
  127. {0x3804, 0x05},
  128. {0x3805, 0x0b},
  129. {0x3806, 0x02},
  130. {0x3807, 0xdb},
  131. {0x3808, 0x05},
  132. {0x3809, 0x00},
  133. {0x380a, 0x02},
  134. {0x380b, 0xd0},
  135. {0x380c, 0x05},
  136. {0x380d, 0xc6},
  137. {0x380e, 0x03},
  138. {0x380f, 0x22},
  139. {0x3810, 0x00},
  140. {0x3811, 0x04},
  141. {0x3812, 0x00},
  142. {0x3813, 0x04},
  143. {0x3816, 0x00},
  144. {0x3817, 0x00},
  145. {0x3818, 0x00},
  146. {0x3819, 0x04},
  147. {0x3820, 0x18},
  148. {0x3821, 0x00},
  149. {0x382c, 0x06},
  150. {0x3500, 0x00},
  151. {0x3501, 0x31},
  152. {0x3502, 0x00},
  153. {0x3503, 0x03},
  154. {0x3504, 0x00},
  155. {0x3505, 0x00},
  156. {0x3509, 0x10},
  157. {0x350a, 0x00},
  158. {0x350b, 0x40},
  159. {0x3d00, 0x00},
  160. {0x3d01, 0x00},
  161. {0x3d02, 0x00},
  162. {0x3d03, 0x00},
  163. {0x3d04, 0x00},
  164. {0x3d05, 0x00},
  165. {0x3d06, 0x00},
  166. {0x3d07, 0x00},
  167. {0x3d08, 0x00},
  168. {0x3d09, 0x00},
  169. {0x3d0a, 0x00},
  170. {0x3d0b, 0x00},
  171. {0x3d0c, 0x00},
  172. {0x3d0d, 0x00},
  173. {0x3d0e, 0x00},
  174. {0x3d0f, 0x00},
  175. {0x3d80, 0x00},
  176. {0x3d81, 0x00},
  177. {0x3d82, 0x38},
  178. {0x3d83, 0xa4},
  179. {0x3d84, 0x00},
  180. {0x3d85, 0x00},
  181. {0x3d86, 0x1f},
  182. {0x3d87, 0x03},
  183. {0x3d8b, 0x00},
  184. {0x3d8f, 0x00},
  185. {0x4001, 0xe0},
  186. {0x4009, 0x0b},
  187. {0x4300, 0x03},
  188. {0x4301, 0xff},
  189. {0x4304, 0x00},
  190. {0x4305, 0x00},
  191. {0x4309, 0x00},
  192. {0x4600, 0x00},
  193. {0x4601, 0x80},
  194. {0x4800, 0x00},
  195. {0x4805, 0x00},
  196. {0x4821, 0x50},
  197. {0x4823, 0x50},
  198. {0x4837, 0x2d},
  199. {0x4a00, 0x00},
  200. {0x4f00, 0x80},
  201. {0x4f01, 0x10},
  202. {0x4f02, 0x00},
  203. {0x4f03, 0x00},
  204. {0x4f04, 0x00},
  205. {0x4f05, 0x00},
  206. {0x4f06, 0x00},
  207. {0x4f07, 0x00},
  208. {0x4f08, 0x00},
  209. {0x4f09, 0x00},
  210. {0x5000, 0x2f},
  211. {0x500c, 0x00},
  212. {0x500d, 0x00},
  213. {0x500e, 0x00},
  214. {0x500f, 0x00},
  215. {0x5010, 0x00},
  216. {0x5011, 0x00},
  217. {0x5012, 0x00},
  218. {0x5013, 0x00},
  219. {0x5014, 0x00},
  220. {0x5015, 0x00},
  221. {0x5016, 0x00},
  222. {0x5017, 0x00},
  223. {0x5080, 0x00},
  224. {0x5180, 0x01},
  225. {0x5181, 0x00},
  226. {0x5182, 0x01},
  227. {0x5183, 0x00},
  228. {0x5184, 0x01},
  229. {0x5185, 0x00},
  230. {0x5708, 0x06},
  231. {0x380f, 0x2a},
  232. {0x5780, 0x3e},
  233. {0x5781, 0x0f},
  234. {0x5782, 0x44},
  235. {0x5783, 0x02},
  236. {0x5784, 0x01},
  237. {0x5785, 0x01},
  238. {0x5786, 0x00},
  239. {0x5787, 0x04},
  240. {0x5788, 0x02},
  241. {0x5789, 0x0f},
  242. {0x578a, 0xfd},
  243. {0x578b, 0xf5},
  244. {0x578c, 0xf5},
  245. {0x578d, 0x03},
  246. {0x578e, 0x08},
  247. {0x578f, 0x0c},
  248. {0x5790, 0x08},
  249. {0x5791, 0x04},
  250. {0x5792, 0x00},
  251. {0x5793, 0x52},
  252. {0x5794, 0xa3},
  253. {0x5000, 0x3f},
  254. {0x3801, 0x00},
  255. {0x3803, 0x00},
  256. {0x3805, 0x0f},
  257. {0x3807, 0xdf},
  258. {0x3809, 0x10},
  259. {0x380b, 0xde},
  260. {0x3811, 0x00},
  261. {0x3813, 0x01},
  262. };
  263. static const char * const ov9734_test_pattern_menu[] = {
  264. "Disabled",
  265. "Standard Color Bar",
  266. "Top-Bottom Darker Color Bar",
  267. "Right-Left Darker Color Bar",
  268. "Bottom-Top Darker Color Bar",
  269. };
  270. static const s64 link_freq_menu_items[] = {
  271. OV9734_LINK_FREQ_180MHZ,
  272. };
  273. static const struct ov9734_link_freq_config link_freq_configs[] = {
  274. [OV9734_LINK_FREQ_180MHZ_INDEX] = {
  275. .reg_list = {
  276. .num_of_regs = ARRAY_SIZE(mipi_data_rate_360mbps),
  277. .regs = mipi_data_rate_360mbps,
  278. }
  279. },
  280. };
  281. static const struct ov9734_mode supported_modes[] = {
  282. {
  283. .width = 1296,
  284. .height = 734,
  285. .hts = 0x5c6,
  286. .vts_def = OV9734_VTS_30FPS,
  287. .vts_min = OV9734_VTS_30FPS_MIN,
  288. .reg_list = {
  289. .num_of_regs = ARRAY_SIZE(mode_1296x734_regs),
  290. .regs = mode_1296x734_regs,
  291. },
  292. .link_freq_index = OV9734_LINK_FREQ_180MHZ_INDEX,
  293. },
  294. };
  295. struct ov9734 {
  296. struct device *dev;
  297. struct clk *clk;
  298. struct v4l2_subdev sd;
  299. struct media_pad pad;
  300. struct v4l2_ctrl_handler ctrl_handler;
  301. /* V4L2 Controls */
  302. struct v4l2_ctrl *link_freq;
  303. struct v4l2_ctrl *pixel_rate;
  304. struct v4l2_ctrl *vblank;
  305. struct v4l2_ctrl *hblank;
  306. struct v4l2_ctrl *exposure;
  307. /* Current mode */
  308. const struct ov9734_mode *cur_mode;
  309. /* To serialize asynchronous callbacks */
  310. struct mutex mutex;
  311. };
  312. static inline struct ov9734 *to_ov9734(struct v4l2_subdev *subdev)
  313. {
  314. return container_of(subdev, struct ov9734, sd);
  315. }
  316. static u64 to_pixel_rate(u32 f_index)
  317. {
  318. u64 pixel_rate = link_freq_menu_items[f_index] * 2 * OV9734_DATA_LANES;
  319. do_div(pixel_rate, OV9734_RGB_DEPTH);
  320. return pixel_rate;
  321. }
  322. static u64 to_pixels_per_line(u32 hts, u32 f_index)
  323. {
  324. u64 ppl = hts * to_pixel_rate(f_index);
  325. do_div(ppl, OV9734_SCLK);
  326. return ppl;
  327. }
  328. static int ov9734_read_reg(struct ov9734 *ov9734, u16 reg, u16 len, u32 *val)
  329. {
  330. struct i2c_client *client = v4l2_get_subdevdata(&ov9734->sd);
  331. struct i2c_msg msgs[2];
  332. u8 addr_buf[2];
  333. u8 data_buf[4] = {0};
  334. int ret;
  335. if (len > sizeof(data_buf))
  336. return -EINVAL;
  337. put_unaligned_be16(reg, addr_buf);
  338. msgs[0].addr = client->addr;
  339. msgs[0].flags = 0;
  340. msgs[0].len = sizeof(addr_buf);
  341. msgs[0].buf = addr_buf;
  342. msgs[1].addr = client->addr;
  343. msgs[1].flags = I2C_M_RD;
  344. msgs[1].len = len;
  345. msgs[1].buf = &data_buf[sizeof(data_buf) - len];
  346. ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
  347. if (ret != ARRAY_SIZE(msgs))
  348. return ret < 0 ? ret : -EIO;
  349. *val = get_unaligned_be32(data_buf);
  350. return 0;
  351. }
  352. static int ov9734_write_reg(struct ov9734 *ov9734, u16 reg, u16 len, u32 val)
  353. {
  354. struct i2c_client *client = v4l2_get_subdevdata(&ov9734->sd);
  355. u8 buf[6];
  356. int ret = 0;
  357. if (len > 4)
  358. return -EINVAL;
  359. put_unaligned_be16(reg, buf);
  360. put_unaligned_be32(val << 8 * (4 - len), buf + 2);
  361. ret = i2c_master_send(client, buf, len + 2);
  362. if (ret != len + 2)
  363. return ret < 0 ? ret : -EIO;
  364. return 0;
  365. }
  366. static int ov9734_write_reg_list(struct ov9734 *ov9734,
  367. const struct ov9734_reg_list *r_list)
  368. {
  369. unsigned int i;
  370. int ret;
  371. for (i = 0; i < r_list->num_of_regs; i++) {
  372. ret = ov9734_write_reg(ov9734, r_list->regs[i].address, 1,
  373. r_list->regs[i].val);
  374. if (ret) {
  375. dev_err_ratelimited(ov9734->dev,
  376. "write reg 0x%4.4x return err = %d",
  377. r_list->regs[i].address, ret);
  378. return ret;
  379. }
  380. }
  381. return 0;
  382. }
  383. static int ov9734_update_digital_gain(struct ov9734 *ov9734, u32 d_gain)
  384. {
  385. int ret;
  386. ret = ov9734_write_reg(ov9734, OV9734_REG_GROUP_ACCESS, 1,
  387. OV9734_GROUP_HOLD_START);
  388. if (ret)
  389. return ret;
  390. ret = ov9734_write_reg(ov9734, OV9734_REG_MWB_R_GAIN, 2, d_gain);
  391. if (ret)
  392. return ret;
  393. ret = ov9734_write_reg(ov9734, OV9734_REG_MWB_G_GAIN, 2, d_gain);
  394. if (ret)
  395. return ret;
  396. ret = ov9734_write_reg(ov9734, OV9734_REG_MWB_B_GAIN, 2, d_gain);
  397. if (ret)
  398. return ret;
  399. ret = ov9734_write_reg(ov9734, OV9734_REG_GROUP_ACCESS, 1,
  400. OV9734_GROUP_HOLD_END);
  401. if (ret)
  402. return ret;
  403. ret = ov9734_write_reg(ov9734, OV9734_REG_GROUP_ACCESS, 1,
  404. OV9734_GROUP_HOLD_LAUNCH);
  405. return ret;
  406. }
  407. static int ov9734_test_pattern(struct ov9734 *ov9734, u32 pattern)
  408. {
  409. if (pattern)
  410. pattern = (pattern - 1) << OV9734_TEST_PATTERN_BAR_SHIFT |
  411. OV9734_TEST_PATTERN_ENABLE;
  412. return ov9734_write_reg(ov9734, OV9734_REG_TEST_PATTERN, 1, pattern);
  413. }
  414. static int ov9734_set_ctrl(struct v4l2_ctrl *ctrl)
  415. {
  416. struct ov9734 *ov9734 = container_of(ctrl->handler,
  417. struct ov9734, ctrl_handler);
  418. s64 exposure_max;
  419. int ret = 0;
  420. /* Propagate change of current control to all related controls */
  421. if (ctrl->id == V4L2_CID_VBLANK) {
  422. /* Update max exposure while meeting expected vblanking */
  423. exposure_max = ov9734->cur_mode->height + ctrl->val -
  424. OV9734_EXPOSURE_MAX_MARGIN;
  425. __v4l2_ctrl_modify_range(ov9734->exposure,
  426. ov9734->exposure->minimum,
  427. exposure_max, ov9734->exposure->step,
  428. exposure_max);
  429. }
  430. /* V4L2 controls values will be applied only when power is already up */
  431. if (!pm_runtime_get_if_in_use(ov9734->dev))
  432. return 0;
  433. switch (ctrl->id) {
  434. case V4L2_CID_ANALOGUE_GAIN:
  435. ret = ov9734_write_reg(ov9734, OV9734_REG_ANALOG_GAIN,
  436. 2, ctrl->val);
  437. break;
  438. case V4L2_CID_DIGITAL_GAIN:
  439. ret = ov9734_update_digital_gain(ov9734, ctrl->val);
  440. break;
  441. case V4L2_CID_EXPOSURE:
  442. /* 4 least significant bits of expsoure are fractional part */
  443. ret = ov9734_write_reg(ov9734, OV9734_REG_EXPOSURE,
  444. 3, ctrl->val << 4);
  445. break;
  446. case V4L2_CID_VBLANK:
  447. ret = ov9734_write_reg(ov9734, OV9734_REG_VTS, 2,
  448. ov9734->cur_mode->height + ctrl->val);
  449. break;
  450. case V4L2_CID_TEST_PATTERN:
  451. ret = ov9734_test_pattern(ov9734, ctrl->val);
  452. break;
  453. default:
  454. ret = -EINVAL;
  455. break;
  456. }
  457. pm_runtime_put(ov9734->dev);
  458. return ret;
  459. }
  460. static const struct v4l2_ctrl_ops ov9734_ctrl_ops = {
  461. .s_ctrl = ov9734_set_ctrl,
  462. };
  463. static int ov9734_init_controls(struct ov9734 *ov9734)
  464. {
  465. struct v4l2_ctrl_handler *ctrl_hdlr;
  466. const struct ov9734_mode *cur_mode;
  467. s64 exposure_max, h_blank, pixel_rate;
  468. u32 vblank_min, vblank_max, vblank_default;
  469. int ret, size;
  470. ctrl_hdlr = &ov9734->ctrl_handler;
  471. ret = v4l2_ctrl_handler_init(ctrl_hdlr, 8);
  472. if (ret)
  473. return ret;
  474. ctrl_hdlr->lock = &ov9734->mutex;
  475. cur_mode = ov9734->cur_mode;
  476. size = ARRAY_SIZE(link_freq_menu_items);
  477. ov9734->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr, &ov9734_ctrl_ops,
  478. V4L2_CID_LINK_FREQ,
  479. size - 1, 0,
  480. link_freq_menu_items);
  481. if (ov9734->link_freq)
  482. ov9734->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
  483. pixel_rate = to_pixel_rate(OV9734_LINK_FREQ_180MHZ_INDEX);
  484. ov9734->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &ov9734_ctrl_ops,
  485. V4L2_CID_PIXEL_RATE, 0,
  486. pixel_rate, 1, pixel_rate);
  487. vblank_min = cur_mode->vts_min - cur_mode->height;
  488. vblank_max = OV9734_VTS_MAX - cur_mode->height;
  489. vblank_default = cur_mode->vts_def - cur_mode->height;
  490. ov9734->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &ov9734_ctrl_ops,
  491. V4L2_CID_VBLANK, vblank_min,
  492. vblank_max, 1, vblank_default);
  493. h_blank = to_pixels_per_line(cur_mode->hts, cur_mode->link_freq_index);
  494. h_blank -= cur_mode->width;
  495. ov9734->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &ov9734_ctrl_ops,
  496. V4L2_CID_HBLANK, h_blank, h_blank, 1,
  497. h_blank);
  498. if (ov9734->hblank)
  499. ov9734->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
  500. v4l2_ctrl_new_std(ctrl_hdlr, &ov9734_ctrl_ops, V4L2_CID_ANALOGUE_GAIN,
  501. OV9734_ANAL_GAIN_MIN, OV9734_ANAL_GAIN_MAX,
  502. OV9734_ANAL_GAIN_STEP, OV9734_ANAL_GAIN_MIN);
  503. v4l2_ctrl_new_std(ctrl_hdlr, &ov9734_ctrl_ops, V4L2_CID_DIGITAL_GAIN,
  504. OV9734_DGTL_GAIN_MIN, OV9734_DGTL_GAIN_MAX,
  505. OV9734_DGTL_GAIN_STEP, OV9734_DGTL_GAIN_DEFAULT);
  506. exposure_max = ov9734->cur_mode->vts_def - OV9734_EXPOSURE_MAX_MARGIN;
  507. ov9734->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &ov9734_ctrl_ops,
  508. V4L2_CID_EXPOSURE,
  509. OV9734_EXPOSURE_MIN, exposure_max,
  510. OV9734_EXPOSURE_STEP,
  511. exposure_max);
  512. v4l2_ctrl_new_std_menu_items(ctrl_hdlr, &ov9734_ctrl_ops,
  513. V4L2_CID_TEST_PATTERN,
  514. ARRAY_SIZE(ov9734_test_pattern_menu) - 1,
  515. 0, 0, ov9734_test_pattern_menu);
  516. if (ctrl_hdlr->error)
  517. return ctrl_hdlr->error;
  518. ov9734->sd.ctrl_handler = ctrl_hdlr;
  519. return 0;
  520. }
  521. static void ov9734_update_pad_format(const struct ov9734_mode *mode,
  522. struct v4l2_mbus_framefmt *fmt)
  523. {
  524. fmt->width = mode->width;
  525. fmt->height = mode->height;
  526. fmt->code = MEDIA_BUS_FMT_SGRBG10_1X10;
  527. fmt->field = V4L2_FIELD_NONE;
  528. }
  529. static int ov9734_start_streaming(struct ov9734 *ov9734)
  530. {
  531. const struct ov9734_reg_list *reg_list;
  532. int link_freq_index, ret;
  533. link_freq_index = ov9734->cur_mode->link_freq_index;
  534. reg_list = &link_freq_configs[link_freq_index].reg_list;
  535. ret = ov9734_write_reg_list(ov9734, reg_list);
  536. if (ret) {
  537. dev_err(ov9734->dev, "failed to set plls");
  538. return ret;
  539. }
  540. reg_list = &ov9734->cur_mode->reg_list;
  541. ret = ov9734_write_reg_list(ov9734, reg_list);
  542. if (ret) {
  543. dev_err(ov9734->dev, "failed to set mode");
  544. return ret;
  545. }
  546. ret = __v4l2_ctrl_handler_setup(ov9734->sd.ctrl_handler);
  547. if (ret)
  548. return ret;
  549. ret = ov9734_write_reg(ov9734, OV9734_REG_MODE_SELECT,
  550. 1, OV9734_MODE_STREAMING);
  551. if (ret)
  552. dev_err(ov9734->dev, "failed to start stream");
  553. return ret;
  554. }
  555. static void ov9734_stop_streaming(struct ov9734 *ov9734)
  556. {
  557. if (ov9734_write_reg(ov9734, OV9734_REG_MODE_SELECT,
  558. 1, OV9734_MODE_STANDBY))
  559. dev_err(ov9734->dev, "failed to stop stream");
  560. }
  561. static int ov9734_set_stream(struct v4l2_subdev *sd, int enable)
  562. {
  563. struct ov9734 *ov9734 = to_ov9734(sd);
  564. int ret = 0;
  565. mutex_lock(&ov9734->mutex);
  566. if (enable) {
  567. ret = pm_runtime_resume_and_get(ov9734->dev);
  568. if (ret < 0) {
  569. mutex_unlock(&ov9734->mutex);
  570. return ret;
  571. }
  572. ret = ov9734_start_streaming(ov9734);
  573. if (ret) {
  574. enable = 0;
  575. ov9734_stop_streaming(ov9734);
  576. pm_runtime_put(ov9734->dev);
  577. }
  578. } else {
  579. ov9734_stop_streaming(ov9734);
  580. pm_runtime_put(ov9734->dev);
  581. }
  582. mutex_unlock(&ov9734->mutex);
  583. return ret;
  584. }
  585. static int ov9734_set_format(struct v4l2_subdev *sd,
  586. struct v4l2_subdev_state *sd_state,
  587. struct v4l2_subdev_format *fmt)
  588. {
  589. struct ov9734 *ov9734 = to_ov9734(sd);
  590. const struct ov9734_mode *mode;
  591. s32 vblank_def, h_blank;
  592. mode = v4l2_find_nearest_size(supported_modes,
  593. ARRAY_SIZE(supported_modes), width,
  594. height, fmt->format.width,
  595. fmt->format.height);
  596. mutex_lock(&ov9734->mutex);
  597. ov9734_update_pad_format(mode, &fmt->format);
  598. if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) {
  599. *v4l2_subdev_state_get_format(sd_state, fmt->pad) = fmt->format;
  600. } else {
  601. ov9734->cur_mode = mode;
  602. __v4l2_ctrl_s_ctrl(ov9734->link_freq, mode->link_freq_index);
  603. __v4l2_ctrl_s_ctrl_int64(ov9734->pixel_rate,
  604. to_pixel_rate(mode->link_freq_index));
  605. /* Update limits and set FPS to default */
  606. vblank_def = mode->vts_def - mode->height;
  607. __v4l2_ctrl_modify_range(ov9734->vblank,
  608. mode->vts_min - mode->height,
  609. OV9734_VTS_MAX - mode->height, 1,
  610. vblank_def);
  611. __v4l2_ctrl_s_ctrl(ov9734->vblank, vblank_def);
  612. h_blank = to_pixels_per_line(mode->hts, mode->link_freq_index) -
  613. mode->width;
  614. __v4l2_ctrl_modify_range(ov9734->hblank, h_blank, h_blank, 1,
  615. h_blank);
  616. }
  617. mutex_unlock(&ov9734->mutex);
  618. return 0;
  619. }
  620. static int ov9734_get_format(struct v4l2_subdev *sd,
  621. struct v4l2_subdev_state *sd_state,
  622. struct v4l2_subdev_format *fmt)
  623. {
  624. struct ov9734 *ov9734 = to_ov9734(sd);
  625. mutex_lock(&ov9734->mutex);
  626. if (fmt->which == V4L2_SUBDEV_FORMAT_TRY)
  627. fmt->format = *v4l2_subdev_state_get_format(sd_state,
  628. fmt->pad);
  629. else
  630. ov9734_update_pad_format(ov9734->cur_mode, &fmt->format);
  631. mutex_unlock(&ov9734->mutex);
  632. return 0;
  633. }
  634. static int ov9734_enum_mbus_code(struct v4l2_subdev *sd,
  635. struct v4l2_subdev_state *sd_state,
  636. struct v4l2_subdev_mbus_code_enum *code)
  637. {
  638. if (code->index > 0)
  639. return -EINVAL;
  640. code->code = MEDIA_BUS_FMT_SGRBG10_1X10;
  641. return 0;
  642. }
  643. static int ov9734_enum_frame_size(struct v4l2_subdev *sd,
  644. struct v4l2_subdev_state *sd_state,
  645. struct v4l2_subdev_frame_size_enum *fse)
  646. {
  647. if (fse->index >= ARRAY_SIZE(supported_modes))
  648. return -EINVAL;
  649. if (fse->code != MEDIA_BUS_FMT_SGRBG10_1X10)
  650. return -EINVAL;
  651. fse->min_width = supported_modes[fse->index].width;
  652. fse->max_width = fse->min_width;
  653. fse->min_height = supported_modes[fse->index].height;
  654. fse->max_height = fse->min_height;
  655. return 0;
  656. }
  657. static int ov9734_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
  658. {
  659. struct ov9734 *ov9734 = to_ov9734(sd);
  660. mutex_lock(&ov9734->mutex);
  661. ov9734_update_pad_format(&supported_modes[0],
  662. v4l2_subdev_state_get_format(fh->state, 0));
  663. mutex_unlock(&ov9734->mutex);
  664. return 0;
  665. }
  666. static const struct v4l2_subdev_video_ops ov9734_video_ops = {
  667. .s_stream = ov9734_set_stream,
  668. };
  669. static const struct v4l2_subdev_pad_ops ov9734_pad_ops = {
  670. .set_fmt = ov9734_set_format,
  671. .get_fmt = ov9734_get_format,
  672. .enum_mbus_code = ov9734_enum_mbus_code,
  673. .enum_frame_size = ov9734_enum_frame_size,
  674. };
  675. static const struct v4l2_subdev_ops ov9734_subdev_ops = {
  676. .video = &ov9734_video_ops,
  677. .pad = &ov9734_pad_ops,
  678. };
  679. static const struct media_entity_operations ov9734_subdev_entity_ops = {
  680. .link_validate = v4l2_subdev_link_validate,
  681. };
  682. static const struct v4l2_subdev_internal_ops ov9734_internal_ops = {
  683. .open = ov9734_open,
  684. };
  685. static int ov9734_identify_module(struct ov9734 *ov9734)
  686. {
  687. int ret;
  688. u32 val;
  689. ret = ov9734_read_reg(ov9734, OV9734_REG_CHIP_ID, 2, &val);
  690. if (ret)
  691. return ret;
  692. if (val != OV9734_CHIP_ID) {
  693. dev_err(ov9734->dev, "chip id mismatch: %x!=%x",
  694. OV9734_CHIP_ID, val);
  695. return -ENXIO;
  696. }
  697. return 0;
  698. }
  699. static int ov9734_check_hwcfg(struct device *dev)
  700. {
  701. struct fwnode_handle *ep;
  702. struct fwnode_handle *fwnode = dev_fwnode(dev);
  703. struct v4l2_fwnode_endpoint bus_cfg = {
  704. .bus_type = V4L2_MBUS_CSI2_DPHY
  705. };
  706. int ret;
  707. unsigned int i, j;
  708. if (!fwnode)
  709. return -ENXIO;
  710. ep = fwnode_graph_get_next_endpoint(fwnode, NULL);
  711. if (!ep)
  712. return -ENXIO;
  713. ret = v4l2_fwnode_endpoint_alloc_parse(ep, &bus_cfg);
  714. fwnode_handle_put(ep);
  715. if (ret)
  716. return ret;
  717. if (!bus_cfg.nr_of_link_frequencies) {
  718. dev_err(dev, "no link frequencies defined");
  719. ret = -EINVAL;
  720. goto check_hwcfg_error;
  721. }
  722. for (i = 0; i < ARRAY_SIZE(link_freq_menu_items); i++) {
  723. for (j = 0; j < bus_cfg.nr_of_link_frequencies; j++) {
  724. if (link_freq_menu_items[i] ==
  725. bus_cfg.link_frequencies[j])
  726. break;
  727. }
  728. if (j == bus_cfg.nr_of_link_frequencies) {
  729. dev_err(dev, "no link frequency %lld supported",
  730. link_freq_menu_items[i]);
  731. ret = -EINVAL;
  732. goto check_hwcfg_error;
  733. }
  734. }
  735. check_hwcfg_error:
  736. v4l2_fwnode_endpoint_free(&bus_cfg);
  737. return ret;
  738. }
  739. static void ov9734_remove(struct i2c_client *client)
  740. {
  741. struct v4l2_subdev *sd = i2c_get_clientdata(client);
  742. struct ov9734 *ov9734 = to_ov9734(sd);
  743. v4l2_async_unregister_subdev(sd);
  744. media_entity_cleanup(&sd->entity);
  745. v4l2_ctrl_handler_free(sd->ctrl_handler);
  746. pm_runtime_disable(ov9734->dev);
  747. pm_runtime_set_suspended(ov9734->dev);
  748. mutex_destroy(&ov9734->mutex);
  749. }
  750. static int ov9734_probe(struct i2c_client *client)
  751. {
  752. struct ov9734 *ov9734;
  753. unsigned long freq;
  754. int ret;
  755. ret = ov9734_check_hwcfg(&client->dev);
  756. if (ret) {
  757. dev_err(&client->dev, "failed to check HW configuration: %d",
  758. ret);
  759. return ret;
  760. }
  761. ov9734 = devm_kzalloc(&client->dev, sizeof(*ov9734), GFP_KERNEL);
  762. if (!ov9734)
  763. return -ENOMEM;
  764. ov9734->dev = &client->dev;
  765. ov9734->clk = devm_v4l2_sensor_clk_get(ov9734->dev, NULL);
  766. if (IS_ERR(ov9734->clk))
  767. return dev_err_probe(ov9734->dev, PTR_ERR(ov9734->clk),
  768. "failed to get clock\n");
  769. freq = clk_get_rate(ov9734->clk);
  770. if (freq != OV9734_MCLK)
  771. return dev_err_probe(ov9734->dev, -EINVAL,
  772. "external clock %lu is not supported",
  773. freq);
  774. v4l2_i2c_subdev_init(&ov9734->sd, client, &ov9734_subdev_ops);
  775. ret = ov9734_identify_module(ov9734);
  776. if (ret) {
  777. dev_err(ov9734->dev, "failed to find sensor: %d", ret);
  778. return ret;
  779. }
  780. mutex_init(&ov9734->mutex);
  781. ov9734->cur_mode = &supported_modes[0];
  782. ret = ov9734_init_controls(ov9734);
  783. if (ret) {
  784. dev_err(ov9734->dev, "failed to init controls: %d", ret);
  785. goto probe_error_v4l2_ctrl_handler_free;
  786. }
  787. ov9734->sd.internal_ops = &ov9734_internal_ops;
  788. ov9734->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
  789. ov9734->sd.entity.ops = &ov9734_subdev_entity_ops;
  790. ov9734->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
  791. ov9734->pad.flags = MEDIA_PAD_FL_SOURCE;
  792. ret = media_entity_pads_init(&ov9734->sd.entity, 1, &ov9734->pad);
  793. if (ret) {
  794. dev_err(ov9734->dev, "failed to init entity pads: %d", ret);
  795. goto probe_error_v4l2_ctrl_handler_free;
  796. }
  797. /*
  798. * Device is already turned on by i2c-core with ACPI domain PM.
  799. * Enable runtime PM and turn off the device.
  800. */
  801. pm_runtime_set_active(ov9734->dev);
  802. pm_runtime_enable(ov9734->dev);
  803. pm_runtime_idle(ov9734->dev);
  804. ret = v4l2_async_register_subdev_sensor(&ov9734->sd);
  805. if (ret < 0) {
  806. dev_err(ov9734->dev, "failed to register V4L2 subdev: %d",
  807. ret);
  808. goto probe_error_media_entity_cleanup_pm;
  809. }
  810. return 0;
  811. probe_error_media_entity_cleanup_pm:
  812. pm_runtime_disable(ov9734->dev);
  813. pm_runtime_set_suspended(ov9734->dev);
  814. media_entity_cleanup(&ov9734->sd.entity);
  815. probe_error_v4l2_ctrl_handler_free:
  816. v4l2_ctrl_handler_free(ov9734->sd.ctrl_handler);
  817. mutex_destroy(&ov9734->mutex);
  818. return ret;
  819. }
  820. static const struct acpi_device_id ov9734_acpi_ids[] = {
  821. { "OVTI9734", },
  822. {}
  823. };
  824. MODULE_DEVICE_TABLE(acpi, ov9734_acpi_ids);
  825. static struct i2c_driver ov9734_i2c_driver = {
  826. .driver = {
  827. .name = "ov9734",
  828. .acpi_match_table = ov9734_acpi_ids,
  829. },
  830. .probe = ov9734_probe,
  831. .remove = ov9734_remove,
  832. };
  833. module_i2c_driver(ov9734_i2c_driver);
  834. MODULE_AUTHOR("Qiu, Tianshu <tian.shu.qiu@intel.com>");
  835. MODULE_AUTHOR("Bingbu Cao <bingbu.cao@intel.com>");
  836. MODULE_DESCRIPTION("OmniVision OV9734 sensor driver");
  837. MODULE_LICENSE("GPL v2");