lt6911uxe.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707
  1. // SPDX-License-Identifier: GPL-2.0
  2. // Copyright (c) 2023 - 2025 Intel Corporation.
  3. #include <linux/acpi.h>
  4. #include <linux/delay.h>
  5. #include <linux/gpio/consumer.h>
  6. #include <linux/i2c.h>
  7. #include <linux/interrupt.h>
  8. #include <linux/module.h>
  9. #include <linux/pm_runtime.h>
  10. #include <linux/regmap.h>
  11. #include <linux/v4l2-dv-timings.h>
  12. #include <media/v4l2-cci.h>
  13. #include <media/v4l2-ctrls.h>
  14. #include <media/v4l2-device.h>
  15. #include <media/v4l2-dv-timings.h>
  16. #include <media/v4l2-event.h>
  17. #include <media/v4l2-fwnode.h>
  18. #define LT6911UXE_CHIP_ID 0x2102
  19. #define REG_CHIP_ID CCI_REG16(0xe100)
  20. #define REG_ENABLE_I2C CCI_REG8(0xe0ee)
  21. #define REG_HALF_PIX_CLK CCI_REG24(0xe085)
  22. #define REG_BYTE_CLK CCI_REG24(0xe092)
  23. #define REG_HALF_H_TOTAL CCI_REG16(0xe088)
  24. #define REG_V_TOTAL CCI_REG16(0xe08a)
  25. #define REG_HALF_H_ACTIVE CCI_REG16(0xe08c)
  26. #define REG_V_ACTIVE CCI_REG16(0xe08e)
  27. #define REG_MIPI_FORMAT CCI_REG8(0xe096)
  28. #define REG_MIPI_TX_CTRL CCI_REG8(0xe0b0)
  29. /* Interrupts */
  30. #define REG_INT_HDMI CCI_REG8(0xe084)
  31. #define INT_VIDEO_DISAPPEAR 0x0
  32. #define INT_VIDEO_READY 0x1
  33. #define LT6911UXE_DEFAULT_LANES 4
  34. #define LT6911_PAGE_CONTROL 0xff
  35. #define YUV422_8_BIT 0x7
  36. static const struct v4l2_dv_timings_cap lt6911uxe_timings_cap_4kp30 = {
  37. .type = V4L2_DV_BT_656_1120,
  38. /* keep this initialization for compatibility with CLANG */
  39. .reserved = { 0 },
  40. /* Pixel clock from REF_01 p. 20. Min/max height/width are unknown */
  41. V4L2_INIT_BT_TIMINGS(160, 3840, /* min/max width */
  42. 120, 2160, /* min/max height */
  43. 50000000, 594000000, /* min/max pixelclock */
  44. V4L2_DV_BT_STD_CEA861 | V4L2_DV_BT_STD_DMT |
  45. V4L2_DV_BT_STD_CVT,
  46. V4L2_DV_BT_CAP_PROGRESSIVE |
  47. V4L2_DV_BT_CAP_CUSTOM |
  48. V4L2_DV_BT_CAP_REDUCED_BLANKING)
  49. };
  50. static const struct regmap_range_cfg lt6911uxe_ranges[] = {
  51. {
  52. .name = "register_range",
  53. .range_min = 0,
  54. .range_max = 0xffff,
  55. .selector_reg = LT6911_PAGE_CONTROL,
  56. .selector_mask = 0xff,
  57. .selector_shift = 0,
  58. .window_start = 0,
  59. .window_len = 0x100,
  60. },
  61. };
  62. static const struct regmap_config lt6911uxe_regmap_config = {
  63. .reg_bits = 8,
  64. .val_bits = 8,
  65. .max_register = 0xffff,
  66. .ranges = lt6911uxe_ranges,
  67. .num_ranges = ARRAY_SIZE(lt6911uxe_ranges),
  68. };
  69. struct lt6911uxe_mode {
  70. u32 width;
  71. u32 height;
  72. u32 htotal;
  73. u32 vtotal;
  74. u32 code;
  75. u32 fps;
  76. u32 lanes;
  77. s64 link_freq;
  78. u64 pixel_clk;
  79. };
  80. struct lt6911uxe {
  81. struct v4l2_subdev sd;
  82. struct media_pad pad;
  83. struct v4l2_ctrl_handler ctrl_handler;
  84. struct v4l2_ctrl *pixel_rate;
  85. struct v4l2_dv_timings timings;
  86. struct lt6911uxe_mode cur_mode;
  87. struct regmap *regmap;
  88. struct gpio_desc *reset_gpio;
  89. struct gpio_desc *irq_gpio;
  90. };
  91. static const struct v4l2_event lt6911uxe_ev_source_change = {
  92. .type = V4L2_EVENT_SOURCE_CHANGE,
  93. .u.src_change.changes = V4L2_EVENT_SRC_CH_RESOLUTION,
  94. };
  95. static inline struct lt6911uxe *to_lt6911uxe(struct v4l2_subdev *sd)
  96. {
  97. return container_of(sd, struct lt6911uxe, sd);
  98. }
  99. static s64 get_pixel_rate(struct lt6911uxe *lt6911uxe)
  100. {
  101. s64 pixel_rate;
  102. pixel_rate = (s64)lt6911uxe->cur_mode.width *
  103. lt6911uxe->cur_mode.height *
  104. lt6911uxe->cur_mode.fps * 16;
  105. do_div(pixel_rate, lt6911uxe->cur_mode.lanes);
  106. return pixel_rate;
  107. }
  108. static int lt6911uxe_get_detected_timings(struct v4l2_subdev *sd,
  109. struct v4l2_dv_timings *timings)
  110. {
  111. struct lt6911uxe *lt6911uxe = to_lt6911uxe(sd);
  112. struct v4l2_bt_timings *bt = &timings->bt;
  113. memset(timings, 0, sizeof(struct v4l2_dv_timings));
  114. timings->type = V4L2_DV_BT_656_1120;
  115. bt->width = lt6911uxe->cur_mode.width;
  116. bt->height = lt6911uxe->cur_mode.height;
  117. bt->vsync = lt6911uxe->cur_mode.vtotal - lt6911uxe->cur_mode.height;
  118. bt->hsync = lt6911uxe->cur_mode.htotal - lt6911uxe->cur_mode.width;
  119. bt->pixelclock = lt6911uxe->cur_mode.pixel_clk;
  120. return 0;
  121. }
  122. static int lt6911uxe_s_dv_timings(struct v4l2_subdev *sd, unsigned int pad,
  123. struct v4l2_dv_timings *timings)
  124. {
  125. struct lt6911uxe *lt6911uxe = to_lt6911uxe(sd);
  126. struct v4l2_subdev_state *state;
  127. state = v4l2_subdev_lock_and_get_active_state(sd);
  128. if (v4l2_match_dv_timings(&lt6911uxe->timings, timings, 0, false)) {
  129. v4l2_subdev_unlock_state(state);
  130. return 0;
  131. }
  132. if (!v4l2_valid_dv_timings(timings, &lt6911uxe_timings_cap_4kp30,
  133. NULL, NULL)) {
  134. v4l2_subdev_unlock_state(state);
  135. return -ERANGE;
  136. }
  137. lt6911uxe->timings = *timings;
  138. v4l2_subdev_unlock_state(state);
  139. return 0;
  140. }
  141. static int lt6911uxe_g_dv_timings(struct v4l2_subdev *sd, unsigned int pad,
  142. struct v4l2_dv_timings *timings)
  143. {
  144. struct lt6911uxe *lt6911uxe = to_lt6911uxe(sd);
  145. struct v4l2_subdev_state *state;
  146. state = v4l2_subdev_lock_and_get_active_state(sd);
  147. *timings = lt6911uxe->timings;
  148. v4l2_subdev_unlock_state(state);
  149. return 0;
  150. }
  151. static int lt6911uxe_query_dv_timings(struct v4l2_subdev *sd, unsigned int pad,
  152. struct v4l2_dv_timings *timings)
  153. {
  154. struct v4l2_subdev_state *state;
  155. int ret;
  156. state = v4l2_subdev_lock_and_get_active_state(sd);
  157. ret = lt6911uxe_get_detected_timings(sd, timings);
  158. if (ret) {
  159. v4l2_subdev_unlock_state(state);
  160. return ret;
  161. }
  162. if (!v4l2_valid_dv_timings(timings, &lt6911uxe_timings_cap_4kp30,
  163. NULL, NULL)) {
  164. v4l2_subdev_unlock_state(state);
  165. return -ERANGE;
  166. }
  167. v4l2_subdev_unlock_state(state);
  168. return 0;
  169. }
  170. static int lt6911uxe_enum_dv_timings(struct v4l2_subdev *sd,
  171. struct v4l2_enum_dv_timings *timings)
  172. {
  173. return v4l2_enum_dv_timings_cap(timings,
  174. &lt6911uxe_timings_cap_4kp30, NULL, NULL);
  175. }
  176. static int lt6911uxe_dv_timings_cap(struct v4l2_subdev *sd,
  177. struct v4l2_dv_timings_cap *cap)
  178. {
  179. *cap = lt6911uxe_timings_cap_4kp30;
  180. return 0;
  181. }
  182. static int lt6911uxe_status_update(struct lt6911uxe *lt6911uxe)
  183. {
  184. struct i2c_client *client = v4l2_get_subdevdata(&lt6911uxe->sd);
  185. u64 int_event;
  186. u64 byte_clk, half_pix_clk, fps, format;
  187. u64 half_htotal, vtotal, half_width, height;
  188. int ret = 0;
  189. /* Read interrupt event */
  190. cci_read(lt6911uxe->regmap, REG_INT_HDMI, &int_event, &ret);
  191. if (ret) {
  192. dev_err(&client->dev, "failed to read interrupt event: %d\n",
  193. ret);
  194. return ret;
  195. }
  196. switch (int_event) {
  197. case INT_VIDEO_READY:
  198. cci_read(lt6911uxe->regmap, REG_BYTE_CLK, &byte_clk, &ret);
  199. byte_clk *= 1000;
  200. cci_read(lt6911uxe->regmap, REG_HALF_PIX_CLK,
  201. &half_pix_clk, &ret);
  202. half_pix_clk *= 1000;
  203. if (ret || byte_clk == 0 || half_pix_clk == 0) {
  204. dev_dbg(&client->dev,
  205. "invalid ByteClock or PixelClock\n");
  206. return -EINVAL;
  207. }
  208. cci_read(lt6911uxe->regmap, REG_HALF_H_TOTAL,
  209. &half_htotal, &ret);
  210. cci_read(lt6911uxe->regmap, REG_V_TOTAL, &vtotal, &ret);
  211. if (ret || half_htotal == 0 || vtotal == 0) {
  212. dev_dbg(&client->dev, "invalid htotal or vtotal\n");
  213. return -EINVAL;
  214. }
  215. fps = div_u64(half_pix_clk, half_htotal * vtotal);
  216. if (fps > 60) {
  217. dev_dbg(&client->dev,
  218. "max fps is 60, current fps: %llu\n", fps);
  219. return -EINVAL;
  220. }
  221. cci_read(lt6911uxe->regmap, REG_HALF_H_ACTIVE,
  222. &half_width, &ret);
  223. cci_read(lt6911uxe->regmap, REG_V_ACTIVE, &height, &ret);
  224. if (ret || half_width == 0 || half_width * 2 > 3840 ||
  225. height == 0 || height > 2160) {
  226. dev_dbg(&client->dev, "invalid width or height\n");
  227. return -EINVAL;
  228. }
  229. /*
  230. * Get MIPI format, YUV422_8_BIT is expected in lt6911uxe
  231. */
  232. cci_read(lt6911uxe->regmap, REG_MIPI_FORMAT, &format, &ret);
  233. if (format != YUV422_8_BIT) {
  234. dev_dbg(&client->dev, "invalid MIPI format\n");
  235. return -EINVAL;
  236. }
  237. lt6911uxe->cur_mode.height = height;
  238. lt6911uxe->cur_mode.width = half_width * 2;
  239. lt6911uxe->cur_mode.fps = fps;
  240. /* MIPI Clock Rate = ByteClock × 4, defined in lt6911uxe spec */
  241. lt6911uxe->cur_mode.link_freq = byte_clk * 4;
  242. lt6911uxe->cur_mode.pixel_clk = half_pix_clk * 2;
  243. lt6911uxe->cur_mode.vtotal = vtotal;
  244. lt6911uxe->cur_mode.htotal = half_htotal * 2;
  245. break;
  246. case INT_VIDEO_DISAPPEAR:
  247. cci_write(lt6911uxe->regmap, REG_MIPI_TX_CTRL, 0x0, &ret);
  248. lt6911uxe->cur_mode.height = 0;
  249. lt6911uxe->cur_mode.width = 0;
  250. lt6911uxe->cur_mode.fps = 0;
  251. lt6911uxe->cur_mode.link_freq = 0;
  252. break;
  253. default:
  254. ret = -ENOLINK;
  255. }
  256. v4l2_subdev_notify_event(&lt6911uxe->sd, &lt6911uxe_ev_source_change);
  257. return ret;
  258. }
  259. static int lt6911uxe_init_controls(struct lt6911uxe *lt6911uxe)
  260. {
  261. struct v4l2_ctrl_handler *ctrl_hdlr;
  262. s64 pixel_rate;
  263. int ret;
  264. ctrl_hdlr = &lt6911uxe->ctrl_handler;
  265. ret = v4l2_ctrl_handler_init(ctrl_hdlr, 8);
  266. if (ret)
  267. return ret;
  268. pixel_rate = get_pixel_rate(lt6911uxe);
  269. lt6911uxe->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, NULL,
  270. V4L2_CID_PIXEL_RATE,
  271. pixel_rate, pixel_rate, 1,
  272. pixel_rate);
  273. if (ctrl_hdlr->error) {
  274. ret = ctrl_hdlr->error;
  275. goto hdlr_free;
  276. }
  277. lt6911uxe->sd.ctrl_handler = ctrl_hdlr;
  278. return 0;
  279. hdlr_free:
  280. v4l2_ctrl_handler_free(ctrl_hdlr);
  281. return ret;
  282. }
  283. static void lt6911uxe_update_pad_format(const struct lt6911uxe_mode *mode,
  284. struct v4l2_mbus_framefmt *fmt)
  285. {
  286. fmt->width = mode->width;
  287. fmt->height = mode->height;
  288. fmt->code = mode->code;
  289. fmt->field = V4L2_FIELD_NONE;
  290. }
  291. static int lt6911uxe_enable_streams(struct v4l2_subdev *sd,
  292. struct v4l2_subdev_state *state,
  293. u32 pad, u64 streams_mask)
  294. {
  295. struct i2c_client *client = v4l2_get_subdevdata(sd);
  296. struct lt6911uxe *lt6911uxe = to_lt6911uxe(sd);
  297. int ret;
  298. ret = pm_runtime_resume_and_get(&client->dev);
  299. if (ret < 0)
  300. return ret;
  301. cci_write(lt6911uxe->regmap, REG_MIPI_TX_CTRL, 0x1, &ret);
  302. if (ret) {
  303. dev_err(&client->dev, "failed to start stream: %d\n", ret);
  304. goto err_rpm_put;
  305. }
  306. return 0;
  307. err_rpm_put:
  308. pm_runtime_put(&client->dev);
  309. return ret;
  310. }
  311. static int lt6911uxe_disable_streams(struct v4l2_subdev *sd,
  312. struct v4l2_subdev_state *state,
  313. u32 pad, u64 streams_mask)
  314. {
  315. struct lt6911uxe *lt6911uxe = to_lt6911uxe(sd);
  316. struct i2c_client *client = v4l2_get_subdevdata(&lt6911uxe->sd);
  317. int ret;
  318. ret = cci_write(lt6911uxe->regmap, REG_MIPI_TX_CTRL, 0x0, NULL);
  319. if (ret)
  320. dev_err(&client->dev, "failed to stop stream: %d\n", ret);
  321. pm_runtime_put(&client->dev);
  322. return 0;
  323. }
  324. static int lt6911uxe_set_format(struct v4l2_subdev *sd,
  325. struct v4l2_subdev_state *sd_state,
  326. struct v4l2_subdev_format *fmt)
  327. {
  328. struct lt6911uxe *lt6911uxe = to_lt6911uxe(sd);
  329. u64 pixel_rate;
  330. lt6911uxe_update_pad_format(&lt6911uxe->cur_mode, &fmt->format);
  331. *v4l2_subdev_state_get_format(sd_state, fmt->pad) = fmt->format;
  332. if (fmt->which == V4L2_SUBDEV_FORMAT_TRY)
  333. return 0;
  334. pixel_rate = get_pixel_rate(lt6911uxe);
  335. __v4l2_ctrl_modify_range(lt6911uxe->pixel_rate, pixel_rate,
  336. pixel_rate, 1, pixel_rate);
  337. return 0;
  338. }
  339. static int lt6911uxe_enum_mbus_code(struct v4l2_subdev *sd,
  340. struct v4l2_subdev_state *sd_state,
  341. struct v4l2_subdev_mbus_code_enum *code)
  342. {
  343. struct lt6911uxe *lt6911uxe = to_lt6911uxe(sd);
  344. if (code->index)
  345. return -EINVAL;
  346. code->code = lt6911uxe->cur_mode.code;
  347. return 0;
  348. }
  349. static int lt6911uxe_get_mbus_config(struct v4l2_subdev *sd,
  350. unsigned int pad,
  351. struct v4l2_mbus_config *cfg)
  352. {
  353. struct lt6911uxe *lt6911uxe = to_lt6911uxe(sd);
  354. struct v4l2_subdev_state *state;
  355. state = v4l2_subdev_lock_and_get_active_state(sd);
  356. cfg->type = V4L2_MBUS_CSI2_DPHY;
  357. cfg->link_freq = lt6911uxe->cur_mode.link_freq;
  358. v4l2_subdev_unlock_state(state);
  359. return 0;
  360. }
  361. static int lt6911uxe_init_state(struct v4l2_subdev *sd,
  362. struct v4l2_subdev_state *sd_state)
  363. {
  364. struct v4l2_subdev_format fmt = {
  365. .which = sd_state ? V4L2_SUBDEV_FORMAT_TRY
  366. : V4L2_SUBDEV_FORMAT_ACTIVE,
  367. };
  368. return lt6911uxe_set_format(sd, sd_state, &fmt);
  369. }
  370. static const struct v4l2_subdev_video_ops lt6911uxe_video_ops = {
  371. .s_stream = v4l2_subdev_s_stream_helper,
  372. };
  373. /*
  374. * lt6911uxe provides editable EDID for customers, but only can be edited like
  375. * updating flash. Due to this limitation, it is not possible to implement
  376. * EDID support.
  377. */
  378. static const struct v4l2_subdev_pad_ops lt6911uxe_pad_ops = {
  379. .set_fmt = lt6911uxe_set_format,
  380. .get_fmt = v4l2_subdev_get_fmt,
  381. .enable_streams = lt6911uxe_enable_streams,
  382. .disable_streams = lt6911uxe_disable_streams,
  383. .enum_mbus_code = lt6911uxe_enum_mbus_code,
  384. .get_frame_interval = v4l2_subdev_get_frame_interval,
  385. .s_dv_timings = lt6911uxe_s_dv_timings,
  386. .g_dv_timings = lt6911uxe_g_dv_timings,
  387. .query_dv_timings = lt6911uxe_query_dv_timings,
  388. .enum_dv_timings = lt6911uxe_enum_dv_timings,
  389. .dv_timings_cap = lt6911uxe_dv_timings_cap,
  390. .get_mbus_config = lt6911uxe_get_mbus_config,
  391. };
  392. static const struct v4l2_subdev_core_ops lt6911uxe_subdev_core_ops = {
  393. .subscribe_event = v4l2_ctrl_subdev_subscribe_event,
  394. .unsubscribe_event = v4l2_event_subdev_unsubscribe,
  395. };
  396. static const struct v4l2_subdev_ops lt6911uxe_subdev_ops = {
  397. .core = &lt6911uxe_subdev_core_ops,
  398. .video = &lt6911uxe_video_ops,
  399. .pad = &lt6911uxe_pad_ops,
  400. };
  401. static const struct media_entity_operations lt6911uxe_subdev_entity_ops = {
  402. .link_validate = v4l2_subdev_link_validate,
  403. };
  404. static const struct v4l2_subdev_internal_ops lt6911uxe_internal_ops = {
  405. .init_state = lt6911uxe_init_state,
  406. };
  407. static int lt6911uxe_fwnode_parse(struct lt6911uxe *lt6911uxe,
  408. struct device *dev)
  409. {
  410. struct fwnode_handle *endpoint;
  411. struct v4l2_fwnode_endpoint bus_cfg = {
  412. .bus_type = V4L2_MBUS_CSI2_DPHY,
  413. };
  414. int ret;
  415. endpoint = fwnode_graph_get_endpoint_by_id(dev_fwnode(dev), 0, 0,
  416. FWNODE_GRAPH_ENDPOINT_NEXT);
  417. if (!endpoint)
  418. return dev_err_probe(dev, -EPROBE_DEFER,
  419. "endpoint node not found\n");
  420. ret = v4l2_fwnode_endpoint_parse(endpoint, &bus_cfg);
  421. fwnode_handle_put(endpoint);
  422. if (ret) {
  423. dev_err(dev, "failed to parse endpoint node: %d\n", ret);
  424. goto out_err;
  425. }
  426. /*
  427. * Check the number of MIPI CSI2 data lanes,
  428. * lt6911uxe only support 4 lanes.
  429. */
  430. if (bus_cfg.bus.mipi_csi2.num_data_lanes != LT6911UXE_DEFAULT_LANES) {
  431. dev_err(dev, "only 4 data lanes are currently supported\n");
  432. ret = -EINVAL;
  433. goto out_err;
  434. }
  435. lt6911uxe->cur_mode.lanes = bus_cfg.bus.mipi_csi2.num_data_lanes;
  436. lt6911uxe->cur_mode.code = MEDIA_BUS_FMT_UYVY8_1X16;
  437. return 0;
  438. out_err:
  439. v4l2_fwnode_endpoint_free(&bus_cfg);
  440. return ret;
  441. }
  442. static int lt6911uxe_identify_module(struct lt6911uxe *lt6911uxe,
  443. struct device *dev)
  444. {
  445. u64 val;
  446. int ret = 0;
  447. /* Chip ID should be confirmed when the I2C slave is active */
  448. cci_write(lt6911uxe->regmap, REG_ENABLE_I2C, 0x1, &ret);
  449. cci_read(lt6911uxe->regmap, REG_CHIP_ID, &val, &ret);
  450. cci_write(lt6911uxe->regmap, REG_ENABLE_I2C, 0x0, &ret);
  451. if (ret)
  452. return dev_err_probe(dev, ret, "fail to read chip id\n");
  453. if (val != LT6911UXE_CHIP_ID) {
  454. return dev_err_probe(dev, -ENXIO, "chip id mismatch: %x!=%x\n",
  455. LT6911UXE_CHIP_ID, (u16)val);
  456. }
  457. return 0;
  458. }
  459. static irqreturn_t lt6911uxe_threaded_irq_fn(int irq, void *dev_id)
  460. {
  461. struct v4l2_subdev *sd = dev_id;
  462. struct lt6911uxe *lt6911uxe = to_lt6911uxe(sd);
  463. struct v4l2_subdev_state *state;
  464. struct v4l2_subdev_format fmt = {
  465. .which = V4L2_SUBDEV_FORMAT_ACTIVE
  466. };
  467. lt6911uxe_status_update(lt6911uxe);
  468. state = v4l2_subdev_lock_and_get_active_state(sd);
  469. /*
  470. * As a HDMI to CSI2 bridge, it needs to update the format in time
  471. * when the HDMI source changes.
  472. */
  473. lt6911uxe_set_format(sd, state, &fmt);
  474. v4l2_subdev_unlock_state(state);
  475. return IRQ_HANDLED;
  476. }
  477. static void lt6911uxe_remove(struct i2c_client *client)
  478. {
  479. struct v4l2_subdev *sd = i2c_get_clientdata(client);
  480. struct lt6911uxe *lt6911uxe = to_lt6911uxe(sd);
  481. free_irq(gpiod_to_irq(lt6911uxe->irq_gpio), lt6911uxe);
  482. v4l2_async_unregister_subdev(sd);
  483. v4l2_subdev_cleanup(sd);
  484. media_entity_cleanup(&sd->entity);
  485. v4l2_ctrl_handler_free(&lt6911uxe->ctrl_handler);
  486. pm_runtime_disable(&client->dev);
  487. pm_runtime_set_suspended(&client->dev);
  488. }
  489. static int lt6911uxe_probe(struct i2c_client *client)
  490. {
  491. struct lt6911uxe *lt6911uxe;
  492. struct device *dev = &client->dev;
  493. int ret;
  494. lt6911uxe = devm_kzalloc(dev, sizeof(*lt6911uxe), GFP_KERNEL);
  495. if (!lt6911uxe)
  496. return -ENOMEM;
  497. lt6911uxe->regmap = devm_regmap_init_i2c(client,
  498. &lt6911uxe_regmap_config);
  499. if (IS_ERR(lt6911uxe->regmap))
  500. return dev_err_probe(dev, PTR_ERR(lt6911uxe->regmap),
  501. "failed to init CCI\n");
  502. v4l2_i2c_subdev_init(&lt6911uxe->sd, client, &lt6911uxe_subdev_ops);
  503. lt6911uxe->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
  504. if (IS_ERR(lt6911uxe->reset_gpio))
  505. return dev_err_probe(dev, PTR_ERR(lt6911uxe->reset_gpio),
  506. "failed to get reset gpio\n");
  507. lt6911uxe->irq_gpio = devm_gpiod_get(dev, "hpd", GPIOD_IN);
  508. if (IS_ERR(lt6911uxe->irq_gpio))
  509. return dev_err_probe(dev, PTR_ERR(lt6911uxe->irq_gpio),
  510. "failed to get hpd gpio\n");
  511. ret = lt6911uxe_fwnode_parse(lt6911uxe, dev);
  512. if (ret)
  513. return ret;
  514. usleep_range(10000, 10500);
  515. ret = lt6911uxe_identify_module(lt6911uxe, dev);
  516. if (ret)
  517. return dev_err_probe(dev, ret, "failed to find chip\n");
  518. ret = lt6911uxe_init_controls(lt6911uxe);
  519. if (ret)
  520. return dev_err_probe(dev, ret, "failed to init control\n");
  521. lt6911uxe->sd.dev = dev;
  522. lt6911uxe->sd.internal_ops = &lt6911uxe_internal_ops;
  523. lt6911uxe->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
  524. lt6911uxe->sd.entity.ops = &lt6911uxe_subdev_entity_ops;
  525. lt6911uxe->sd.entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;
  526. lt6911uxe->pad.flags = MEDIA_PAD_FL_SOURCE;
  527. ret = media_entity_pads_init(&lt6911uxe->sd.entity, 1, &lt6911uxe->pad);
  528. if (ret) {
  529. dev_err(dev, "failed to init entity pads: %d\n", ret);
  530. goto v4l2_ctrl_handler_free;
  531. }
  532. /*
  533. * Device is already turned on by i2c-core with ACPI domain PM.
  534. * Enable runtime PM and turn off the device.
  535. */
  536. pm_runtime_set_active(dev);
  537. pm_runtime_enable(dev);
  538. pm_runtime_idle(dev);
  539. ret = v4l2_subdev_init_finalize(&lt6911uxe->sd);
  540. if (ret) {
  541. dev_err(dev, "failed to init v4l2 subdev: %d\n", ret);
  542. goto media_entity_cleanup;
  543. }
  544. /* Setting irq */
  545. ret = request_threaded_irq(gpiod_to_irq(lt6911uxe->irq_gpio), NULL,
  546. lt6911uxe_threaded_irq_fn,
  547. IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING |
  548. IRQF_ONESHOT, NULL, lt6911uxe);
  549. if (ret) {
  550. dev_err(dev, "failed to request IRQ: %d\n", ret);
  551. goto subdev_cleanup;
  552. }
  553. ret = v4l2_async_register_subdev_sensor(&lt6911uxe->sd);
  554. if (ret) {
  555. dev_err(dev, "failed to register V4L2 subdev: %d\n", ret);
  556. goto free_irq;
  557. }
  558. return 0;
  559. free_irq:
  560. free_irq(gpiod_to_irq(lt6911uxe->irq_gpio), lt6911uxe);
  561. subdev_cleanup:
  562. v4l2_subdev_cleanup(&lt6911uxe->sd);
  563. media_entity_cleanup:
  564. pm_runtime_disable(dev);
  565. pm_runtime_set_suspended(dev);
  566. media_entity_cleanup(&lt6911uxe->sd.entity);
  567. v4l2_ctrl_handler_free:
  568. v4l2_ctrl_handler_free(lt6911uxe->sd.ctrl_handler);
  569. return ret;
  570. }
  571. static const struct acpi_device_id lt6911uxe_acpi_ids[] = {
  572. { "INTC10C5" },
  573. {}
  574. };
  575. MODULE_DEVICE_TABLE(acpi, lt6911uxe_acpi_ids);
  576. static struct i2c_driver lt6911uxe_i2c_driver = {
  577. .driver = {
  578. .name = "lt6911uxe",
  579. .acpi_match_table = ACPI_PTR(lt6911uxe_acpi_ids),
  580. },
  581. .probe = lt6911uxe_probe,
  582. .remove = lt6911uxe_remove,
  583. };
  584. module_i2c_driver(lt6911uxe_i2c_driver);
  585. MODULE_AUTHOR("Yan Dongcheng <dongcheng.yan@intel.com>");
  586. MODULE_DESCRIPTION("Lontium lt6911uxe HDMI to MIPI Bridge Driver");
  587. MODULE_LICENSE("GPL");